From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E6CD0C49ED6 for ; Wed, 11 Sep 2019 19:02:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 507C921A4C for ; Wed, 11 Sep 2019 19:02:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=hammerspace.com header.i=@hammerspace.com header.b="OFPjeGww" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730160AbfIKTB1 (ORCPT ); Wed, 11 Sep 2019 15:01:27 -0400 Received: from mail-eopbgr770121.outbound.protection.outlook.com ([40.107.77.121]:11492 "EHLO NAM02-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1729016AbfIKTB0 (ORCPT ); Wed, 11 Sep 2019 15:01:26 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GTsj0fVKJpQW8cFh9yUcdxXJsuKTDih8j+LYFpY0WlOG0K/ZZ6QPjtj/F+lDfRy5aReQEddqzIYCFSP7nY27upZzjFbt36C23cXkYV3qLKD3HocTcjytasPB81T7y+UpilDDg2O5v2HkUiceRurqocVRiOEV73+7lR29Xi6L/GVsZGtDX/cDwfSJSNOr/SxfKXvazUJ2UHL5+CBlGqtrXcRcNZL9mqneYcSpNiPfU0ow/NPLYC5kU65JQMhBrZvB3U2NgQLbaReunRtcp4om0sGvZnO3sEftPfR1QR0jOJlQFnu9mJs8jSVNC4f6jo1CTbNSCWj/VfJI7pcuu4OSqg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=gRUiFzyox0HMHH+tqavE1xZ1M7LF73YpuXXv+pQxRr8=; b=ANafEzAViUiOnDJSIY3/3ZC9I5U9I+Vpziklrsu6B9l9b/kin6X8N80/1mMq0snJ4BfvqXm/TMHpldlLyDJmCGlYlhFuULID4B9Vqr/2/1y83WMlB/nNTHAq6f6EiHBUHT3kPQ8ISS2ZZI5Kh85c47dN4Kx8i2MVJz78TsEhPsTorWzWc5nRhs/DIZ+qJ9/NzZTlzgS9VPeRoTieyiPd9mE8jw6xRlEmvQyKWTmnPogay7hmDPBvQl7i+Q70GumMNX2KCkPtq6TxwUhUHhjuJuqHICOSrJ5QfNTM5JC3ZwdrLJ6T/jv7H8oG5/OUWfFB9NCZuToTsifO3Pl/NDdM6Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=hammerspace.com; dmarc=pass action=none header.from=hammerspace.com; dkim=pass header.d=hammerspace.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hammerspace.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=gRUiFzyox0HMHH+tqavE1xZ1M7LF73YpuXXv+pQxRr8=; b=OFPjeGwwoIv1ie7bD544HEMFsAcpwk3BgFUq7JCbsAX9jyZmpRtHdCTReWuoN1MAS5+ebe8qAn9HQwHMqnRnnNV465e0+eIQOwheIANNliG7ckTMpMVdhS4OJPglR7VxEKxUQnPX2GvKYdzLlzcJ1qGswtBBhaKvM0QkK3ZFWj4= Received: from DM5PR13MB1851.namprd13.prod.outlook.com (10.171.159.143) by DM5PR13MB1849.namprd13.prod.outlook.com (10.171.158.140) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2263.10; Wed, 11 Sep 2019 19:00:19 +0000 Received: from DM5PR13MB1851.namprd13.prod.outlook.com ([fe80::70fd:85c2:8ea9:a0b6]) by DM5PR13MB1851.namprd13.prod.outlook.com ([fe80::70fd:85c2:8ea9:a0b6%9]) with mapi id 15.20.2263.015; Wed, 11 Sep 2019 19:00:19 +0000 From: Trond Myklebust To: "chucklever@gmail.com" , "smayhew@redhat.com" CC: "linux-nfs@vger.kernel.org" , "linux-fsdevel@vger.kernel.org" , "anna.schumaker@netapp.com" , "viro@zeniv.linux.org.uk" , "dhowells@redhat.com" , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH v3 16/26] NFS: Move mount parameterisation bits into their own file Thread-Topic: [PATCH v3 16/26] NFS: Move mount parameterisation bits into their own file Thread-Index: AQHVaLxD0WQZmlB55EWdF273sREgE6cmytQAgAAJ+4A= Date: Wed, 11 Sep 2019 19:00:19 +0000 Message-ID: <014d1a8425545b633b982f63d78665b73bcf0075.camel@hammerspace.com> References: <20190911161621.19832-1-smayhew@redhat.com> <20190911161621.19832-17-smayhew@redhat.com> In-Reply-To: Accept-Language: en-US, en-GB Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=trondmy@hammerspace.com; x-originating-ip: [50.36.167.63] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 70ae502d-9a01-41be-c878-08d736ea4a5a x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600166)(711020)(4605104)(1401327)(2017052603328)(7193020);SRVR:DM5PR13MB1849; x-ms-traffictypediagnostic: DM5PR13MB1849: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:2150; x-forefront-prvs: 0157DEB61B x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(396003)(346002)(366004)(136003)(376002)(39830400003)(199004)(189003)(53546011)(5660300002)(6512007)(6436002)(6506007)(26005)(7736002)(53936002)(14444005)(256004)(102836004)(486006)(6486002)(53946003)(66066001)(305945005)(91956017)(36756003)(64756008)(6246003)(66556008)(478600001)(186003)(76116006)(229853002)(66476007)(66446008)(446003)(99286004)(11346002)(30864003)(86362001)(8936002)(76176011)(66946007)(2906002)(118296001)(14454004)(54906003)(2501003)(110136005)(4326008)(71190400001)(71200400001)(476003)(81166006)(81156014)(2616005)(8676002)(3846002)(316002)(6116002)(25786009)(2004002)(559001)(579004)(569006);DIR:OUT;SFP:1102;SCL:1;SRVR:DM5PR13MB1849;H:DM5PR13MB1851.namprd13.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;A:1;MX:1; received-spf: None (protection.outlook.com: hammerspace.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: 7dxhrlInXn5/lcCxWJku+sHpLpGkg2aUynUz/7A+0j8BR6oiuILSPfsvjAAcIhAOvDwN25wGmhjGc9PYhFli518TB368mcrOmBp6iCSsYlCa4YKlppPefsUMuW1BsumEij+nDuOwSsrxCrIrWZRmzx8ulZY/tQemDyCuZVRM0M0yOyAOtVDuVwirEXERU45ei8Z44mVnEuwLwTu8l3eGlN1Egg9Bm3xLG907Dd9trZFtmbZE1R7ZlEE0iTY0QqN/AVoC5uSUMWOatmc4UlFl/i3/cH5f+nRn4Bv43rNKiWBW6ROy0wfzNECcJbZEeLes1K4wGclKTc+3rY4OGHcvh4RPxHeep30Lc+XCxHS/PtpSYd2C22V/yBp3LuoSyQ4wvuq6wuP65Ou3N1k2TvHx018vYN1CDY3hP+rhZm6Vb8Q= x-ms-exchange-transport-forked: True Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: hammerspace.com X-MS-Exchange-CrossTenant-Network-Message-Id: 70ae502d-9a01-41be-c878-08d736ea4a5a X-MS-Exchange-CrossTenant-originalarrivaltime: 11 Sep 2019 19:00:19.0996 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 0d4fed5c-3a70-46fe-9430-ece41741f59e X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 7seoRkkZR6y0FvgnV2BNVdeWnF3Jo/On8FUPv7NV5K9zOGG51FzvnCErvhZkEtJM/3L7/Ug6kwRTQgjqiVBKxg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR13MB1849 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org T24gV2VkLCAyMDE5LTA5LTExIGF0IDE0OjI0IC0wNDAwLCBDaHVjayBMZXZlciB3cm90ZToNCj4g PiBPbiBTZXAgMTEsIDIwMTksIGF0IDEyOjE2IFBNLCBTY290dCBNYXloZXcgPHNtYXloZXdAcmVk aGF0LmNvbT4NCj4gPiB3cm90ZToNCj4gPiANCj4gPiBGcm9tOiBEYXZpZCBIb3dlbGxzIDxkaG93 ZWxsc0ByZWRoYXQuY29tPg0KPiA+IA0KPiA+IFNwbGl0IHZhcmlvdXMgYml0cyByZWxhdGluZyB0 byBtb3VudCBwYXJhbWV0ZXJpc2F0aW9uIG91dCBmcm9tDQo+ID4gZnMvbmZzL3N1cGVyLmMgaW50 byB0aGVpciBvd24gZmlsZSB0byBmb3JtIHRoZSBiYXNpcyBvZiBmaWxlc3lzdGVtDQo+ID4gY29u dGV4dA0KPiA+IGhhbmRsaW5nIGZvciBORlMuDQo+ID4gDQo+ID4gTm8gb3RoZXIgY2hhbmdlcyBh cmUgbWFkZSB0byB0aGUgY29kZSBiZXlvbmQgcmVtb3ZpbmcgJ3N0YXRpYycNCj4gPiBxdWFsaWZp ZXJzLg0KPiA+IA0KPiA+IFNpZ25lZC1vZmYtYnk6IERhdmlkIEhvd2VsbHMgPGRob3dlbGxzQHJl ZGhhdC5jb20+DQo+ID4gU2lnbmVkLW9mZi1ieTogQWwgVmlybyA8dmlyb0B6ZW5pdi5saW51eC5v cmcudWs+DQo+ID4gLS0tDQo+ID4gZnMvbmZzL01ha2VmaWxlICAgICB8ICAgIDIgKy0NCj4gPiBm cy9uZnMvZnNfY29udGV4dC5jIHwgMTQxOA0KPiA+ICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysNCj4gPiBmcy9uZnMvaW50ZXJuYWwuaCAgIHwgICAyOSArDQo+ID4g ZnMvbmZzL3N1cGVyLmMgICAgICB8IDE0MTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0KPiA+IC0tDQo+ID4gNCBmaWxlcyBjaGFuZ2VkLCAxNDQ4IGluc2VydGlvbnMo KyksIDE0MTIgZGVsZXRpb25zKC0pDQo+ID4gY3JlYXRlIG1vZGUgMTAwNjQ0IGZzL25mcy9mc19j b250ZXh0LmMNCj4gPiANCj4gPiBkaWZmIC0tZ2l0IGEvZnMvbmZzL01ha2VmaWxlIGIvZnMvbmZz L01ha2VmaWxlDQo+ID4gaW5kZXggMzRjZGVhZWNjY2Y2Li4yNDMzYzNlMDNjZmEgMTAwNjQ0DQo+ ID4gLS0tIGEvZnMvbmZzL01ha2VmaWxlDQo+ID4gKysrIGIvZnMvbmZzL01ha2VmaWxlDQo+ID4g QEAgLTksNyArOSw3IEBAIENGTEFHU19uZnN0cmFjZS5vICs9IC1JJChzcmMpDQo+ID4gbmZzLXkg CQkJOj0gY2xpZW50Lm8gZGlyLm8gZmlsZS5vIGdldHJvb3Qubw0KPiA+IGlub2RlLm8gc3VwZXIu byBcDQo+ID4gCQkJICAgaW8ubyBkaXJlY3QubyBwYWdlbGlzdC5vIHJlYWQubyBzeW1saW5rLm8N Cj4gPiB1bmxpbmsubyBcDQo+ID4gCQkJICAgd3JpdGUubyBuYW1lc3BhY2UubyBtb3VudF9jbG50 Lm8gbmZzdHJhY2Uubw0KPiA+IFwNCj4gPiAtCQkJICAgZXhwb3J0Lm8gc3lzZnMubw0KPiA+ICsJ CQkgICBleHBvcnQubyBzeXNmcy5vIGZzX2NvbnRleHQubw0KPiA+IG5mcy0kKENPTkZJR19ST09U X05GUykJKz0gbmZzcm9vdC5vDQo+ID4gbmZzLSQoQ09ORklHX1NZU0NUTCkJKz0gc3lzY3RsLm8N Cj4gPiBuZnMtJChDT05GSUdfTkZTX0ZTQ0FDSEUpICs9IGZzY2FjaGUubyBmc2NhY2hlLWluZGV4 Lm8NCj4gPiBkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZzX2NvbnRleHQuYyBiL2ZzL25mcy9mc19jb250 ZXh0LmMNCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4u ODJiMzEyYTVjZGRlDQo+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ICsrKyBiL2ZzL25mcy9mc19jb250 ZXh0LmMNCj4gPiBAQCAtMCwwICsxLDE0MTggQEANCj4gPiArLyogTkZTIG1vdW50IGhhbmRsaW5n Lg0KPiA+ICsgKg0KPiA+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTggUmVkIEhhdCwgSW5jLiBBbGwg UmlnaHRzIFJlc2VydmVkLg0KPiA+ICsgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dl bGxzQHJlZGhhdC5jb20pDQo+ID4gKyAqDQo+ID4gKyAqIFNwbGl0IGZyb20gZnMvbmZzL3N1cGVy LmM6DQo+ID4gKyAqDQo+ID4gKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIFJpY2sgU2xhZGtleQ0K PiA+ICsgKg0KPiA+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQo+ID4gKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlDQo+ID4gKyAqIGFzIHB1Ymxpc2hlZCBi eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbg0KPiA+ICsgKiAy IG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0K PiA+ICsgKi8NCj4gDQo+IE5ldyBzb3VyY2UgZmlsZXMgc2hvdWxkIGhhdmUgYW4gU1BEWCB0YWcg aW5zdGVhZCBvZiBib2lsZXJwbGF0ZS4NCj4gSSBzdWdnZXN0Og0KPiANCj4gLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQ0KPiANCg0KQWdyZWVkLiBJdCBpcyBhbHNvIHF1 aXRlIGEgbG9uZyBzdHJldGNoIHRvIGNsYWltIGF1dGhvcnNoaXAgb2YgdGhlDQplbnRpcmUgZmls ZSBhcyBpbXBsaWVkIGFib3ZlLiBHaXZlbiB0aGF0IHRoaXMgaXMgbW9zdGx5IGEgY29weS1wYXN0 ZQ0KZWZmb3J0LCB0aGVuIG1vc3Qgb2YgdGhlIGFjdHVhbCBjb3B5cmlnaHRzIGJlbG9uZyB0byB0 aGUgcGVvcGxlIHdobyd2ZQ0KY29udHJpYnV0ZWQgdG8gc3VwZXIuYyAoYW5kIHRvIGlub2RlLmMg YmVmb3JlIGl0KS4gRGF2aWQgaXMgb25lIG9mDQp0aG9zZSBhdXRob3JzLCBidXQgaGUgaXMgb25l IG9mIG1hbnkuDQoNCg0KPiA+ICsjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+DQo+ID4gKyNpbmNs dWRlIDxsaW51eC9uZnNfZnMuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPg0K PiA+ICsjaW5jbHVkZSA8bGludXgvbmZzNF9tb3VudC5oPg0KPiA+ICsjaW5jbHVkZSAibmZzLmgi DQo+ID4gKyNpbmNsdWRlICJpbnRlcm5hbC5oIg0KPiA+ICsNCj4gPiArI2RlZmluZSBORlNEQkdf RkFDSUxJVFkJCU5GU0RCR19NT1VOVA0KPiA+ICsNCj4gPiArI2lmIElTX0VOQUJMRUQoQ09ORklH X05GU19WMykNCj4gPiArI2RlZmluZSBORlNfREVGQVVMVF9WRVJTSU9OIDMNCj4gPiArI2Vsc2UN Cj4gPiArI2RlZmluZSBORlNfREVGQVVMVF9WRVJTSU9OIDINCj4gPiArI2VuZGlmDQo+ID4gKw0K PiA+ICsjZGVmaW5lIE5GU19NQVhfQ09OTkVDVElPTlMgMTYNCj4gPiArDQo+ID4gK2VudW0gew0K PiA+ICsJLyogTW91bnQgb3B0aW9ucyB0aGF0IHRha2Ugbm8gYXJndW1lbnRzICovDQo+ID4gKwlP cHRfc29mdCwgT3B0X3NvZnRlcnIsIE9wdF9oYXJkLA0KPiA+ICsJT3B0X3Bvc2l4LCBPcHRfbm9w b3NpeCwNCj4gPiArCU9wdF9jdG8sIE9wdF9ub2N0bywNCj4gPiArCU9wdF9hYywgT3B0X25vYWMs DQo+ID4gKwlPcHRfbG9jaywgT3B0X25vbG9jaywNCj4gPiArCU9wdF91ZHAsIE9wdF90Y3AsIE9w dF9yZG1hLA0KPiA+ICsJT3B0X2FjbCwgT3B0X25vYWNsLA0KPiA+ICsJT3B0X3JkaXJwbHVzLCBP cHRfbm9yZGlycGx1cywNCj4gPiArCU9wdF9zaGFyZWNhY2hlLCBPcHRfbm9zaGFyZWNhY2hlLA0K PiA+ICsJT3B0X3Jlc3Zwb3J0LCBPcHRfbm9yZXN2cG9ydCwNCj4gPiArCU9wdF9mc2NhY2hlLCBP cHRfbm9mc2NhY2hlLA0KPiA+ICsJT3B0X21pZ3JhdGlvbiwgT3B0X25vbWlncmF0aW9uLA0KPiA+ ICsNCj4gPiArCS8qIE1vdW50IG9wdGlvbnMgdGhhdCB0YWtlIGludGVnZXIgYXJndW1lbnRzICov DQo+ID4gKwlPcHRfcG9ydCwNCj4gPiArCU9wdF9yc2l6ZSwgT3B0X3dzaXplLCBPcHRfYnNpemUs DQo+ID4gKwlPcHRfdGltZW8sIE9wdF9yZXRyYW5zLA0KPiA+ICsJT3B0X2FjcmVnbWluLCBPcHRf YWNyZWdtYXgsDQo+ID4gKwlPcHRfYWNkaXJtaW4sIE9wdF9hY2Rpcm1heCwNCj4gPiArCU9wdF9h Y3RpbWVvLA0KPiA+ICsJT3B0X25hbWVsZW4sDQo+ID4gKwlPcHRfbW91bnRwb3J0LA0KPiA+ICsJ T3B0X21vdW50dmVycywNCj4gPiArCU9wdF9taW5vcnZlcnNpb24sDQo+ID4gKw0KPiA+ICsJLyog TW91bnQgb3B0aW9ucyB0aGF0IHRha2Ugc3RyaW5nIGFyZ3VtZW50cyAqLw0KPiA+ICsJT3B0X25m c3ZlcnMsDQo+ID4gKwlPcHRfc2VjLCBPcHRfcHJvdG8sIE9wdF9tb3VudHByb3RvLCBPcHRfbW91 bnRob3N0LA0KPiA+ICsJT3B0X2FkZHIsIE9wdF9tb3VudGFkZHIsIE9wdF9jbGllbnRhZGRyLA0K PiA+ICsJT3B0X25jb25uZWN0LA0KPiA+ICsJT3B0X2xvb2t1cGNhY2hlLA0KPiA+ICsJT3B0X2Zz Y2FjaGVfdW5pcSwNCj4gPiArCU9wdF9sb2NhbF9sb2NrLA0KPiA+ICsNCj4gPiArCS8qIFNwZWNp YWwgbW91bnQgb3B0aW9ucyAqLw0KPiA+ICsJT3B0X3VzZXJzcGFjZSwgT3B0X2RlcHJlY2F0ZWQs IE9wdF9zbG9wcHksDQo+ID4gKw0KPiA+ICsJT3B0X2Vycg0KPiA+ICt9Ow0KPiA+ICsNCj4gPiAr c3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgbmZzX21vdW50X29wdGlvbl90b2tlbnMgPSB7DQo+ ID4gKwl7IE9wdF91c2Vyc3BhY2UsICJiZyIgfSwNCj4gPiArCXsgT3B0X3VzZXJzcGFjZSwgImZn IiB9LA0KPiA+ICsJeyBPcHRfdXNlcnNwYWNlLCAicmV0cnk9JXMiIH0sDQo+ID4gKw0KPiA+ICsJ eyBPcHRfc2xvcHB5LCAic2xvcHB5IiB9LA0KPiA+ICsNCj4gPiArCXsgT3B0X3NvZnQsICJzb2Z0 IiB9LA0KPiA+ICsJeyBPcHRfc29mdGVyciwgInNvZnRlcnIiIH0sDQo+ID4gKwl7IE9wdF9oYXJk LCAiaGFyZCIgfSwNCj4gPiArCXsgT3B0X2RlcHJlY2F0ZWQsICJpbnRyIiB9LA0KPiA+ICsJeyBP cHRfZGVwcmVjYXRlZCwgIm5vaW50ciIgfSwNCj4gPiArCXsgT3B0X3Bvc2l4LCAicG9zaXgiIH0s DQo+ID4gKwl7IE9wdF9ub3Bvc2l4LCAibm9wb3NpeCIgfSwNCj4gPiArCXsgT3B0X2N0bywgImN0 byIgfSwNCj4gPiArCXsgT3B0X25vY3RvLCAibm9jdG8iIH0sDQo+ID4gKwl7IE9wdF9hYywgImFj IiB9LA0KPiA+ICsJeyBPcHRfbm9hYywgIm5vYWMiIH0sDQo+ID4gKwl7IE9wdF9sb2NrLCAibG9j ayIgfSwNCj4gPiArCXsgT3B0X25vbG9jaywgIm5vbG9jayIgfSwNCj4gPiArCXsgT3B0X3VkcCwg InVkcCIgfSwNCj4gPiArCXsgT3B0X3RjcCwgInRjcCIgfSwNCj4gPiArCXsgT3B0X3JkbWEsICJy ZG1hIiB9LA0KPiA+ICsJeyBPcHRfYWNsLCAiYWNsIiB9LA0KPiA+ICsJeyBPcHRfbm9hY2wsICJu b2FjbCIgfSwNCj4gPiArCXsgT3B0X3JkaXJwbHVzLCAicmRpcnBsdXMiIH0sDQo+ID4gKwl7IE9w dF9ub3JkaXJwbHVzLCAibm9yZGlycGx1cyIgfSwNCj4gPiArCXsgT3B0X3NoYXJlY2FjaGUsICJz aGFyZWNhY2hlIiB9LA0KPiA+ICsJeyBPcHRfbm9zaGFyZWNhY2hlLCAibm9zaGFyZWNhY2hlIiB9 LA0KPiA+ICsJeyBPcHRfcmVzdnBvcnQsICJyZXN2cG9ydCIgfSwNCj4gPiArCXsgT3B0X25vcmVz dnBvcnQsICJub3Jlc3Zwb3J0IiB9LA0KPiA+ICsJeyBPcHRfZnNjYWNoZSwgImZzYyIgfSwNCj4g PiArCXsgT3B0X25vZnNjYWNoZSwgIm5vZnNjIiB9LA0KPiA+ICsJeyBPcHRfbWlncmF0aW9uLCAi bWlncmF0aW9uIiB9LA0KPiA+ICsJeyBPcHRfbm9taWdyYXRpb24sICJub21pZ3JhdGlvbiIgfSwN Cj4gPiArDQo+ID4gKwl7IE9wdF9wb3J0LCAicG9ydD0lcyIgfSwNCj4gPiArCXsgT3B0X3JzaXpl LCAicnNpemU9JXMiIH0sDQo+ID4gKwl7IE9wdF93c2l6ZSwgIndzaXplPSVzIiB9LA0KPiA+ICsJ eyBPcHRfYnNpemUsICJic2l6ZT0lcyIgfSwNCj4gPiArCXsgT3B0X3RpbWVvLCAidGltZW89JXMi IH0sDQo+ID4gKwl7IE9wdF9yZXRyYW5zLCAicmV0cmFucz0lcyIgfSwNCj4gPiArCXsgT3B0X2Fj cmVnbWluLCAiYWNyZWdtaW49JXMiIH0sDQo+ID4gKwl7IE9wdF9hY3JlZ21heCwgImFjcmVnbWF4 PSVzIiB9LA0KPiA+ICsJeyBPcHRfYWNkaXJtaW4sICJhY2Rpcm1pbj0lcyIgfSwNCj4gPiArCXsg T3B0X2FjZGlybWF4LCAiYWNkaXJtYXg9JXMiIH0sDQo+ID4gKwl7IE9wdF9hY3RpbWVvLCAiYWN0 aW1lbz0lcyIgfSwNCj4gPiArCXsgT3B0X25hbWVsZW4sICJuYW1sZW49JXMiIH0sDQo+ID4gKwl7 IE9wdF9tb3VudHBvcnQsICJtb3VudHBvcnQ9JXMiIH0sDQo+ID4gKwl7IE9wdF9tb3VudHZlcnMs ICJtb3VudHZlcnM9JXMiIH0sDQo+ID4gKwl7IE9wdF9taW5vcnZlcnNpb24sICJtaW5vcnZlcnNp b249JXMiIH0sDQo+ID4gKw0KPiA+ICsJeyBPcHRfbmZzdmVycywgIm5mc3ZlcnM9JXMiIH0sDQo+ ID4gKwl7IE9wdF9uZnN2ZXJzLCAidmVycz0lcyIgfSwNCj4gPiArDQo+ID4gKwl7IE9wdF9zZWMs ICJzZWM9JXMiIH0sDQo+ID4gKwl7IE9wdF9wcm90bywgInByb3RvPSVzIiB9LA0KPiA+ICsJeyBP cHRfbW91bnRwcm90bywgIm1vdW50cHJvdG89JXMiIH0sDQo+ID4gKwl7IE9wdF9hZGRyLCAiYWRk cj0lcyIgfSwNCj4gPiArCXsgT3B0X2NsaWVudGFkZHIsICJjbGllbnRhZGRyPSVzIiB9LA0KPiA+ ICsJeyBPcHRfbW91bnRob3N0LCAibW91bnRob3N0PSVzIiB9LA0KPiA+ICsJeyBPcHRfbW91bnRh ZGRyLCAibW91bnRhZGRyPSVzIiB9LA0KPiA+ICsNCj4gPiArCXsgT3B0X25jb25uZWN0LCAibmNv bm5lY3Q9JXMiIH0sDQo+ID4gKw0KPiA+ICsJeyBPcHRfbG9va3VwY2FjaGUsICJsb29rdXBjYWNo ZT0lcyIgfSwNCj4gPiArCXsgT3B0X2ZzY2FjaGVfdW5pcSwgImZzYz0lcyIgfSwNCj4gPiArCXsg T3B0X2xvY2FsX2xvY2ssICJsb2NhbF9sb2NrPSVzIiB9LA0KPiA+ICsNCj4gPiArCS8qIFRoZSBm b2xsb3dpbmcgbmVlZHMgdG8gYmUgbGlzdGVkIGFmdGVyIGFsbCBvdGhlciBvcHRpb25zICovDQo+ ID4gKwl7IE9wdF9uZnN2ZXJzLCAidiVzIiB9LA0KPiA+ICsNCj4gPiArCXsgT3B0X2VyciwgTlVM TCB9DQo+ID4gK307DQo+ID4gKw0KPiA+ICtlbnVtIHsNCj4gPiArCU9wdF94cHJ0X3VkcCwgT3B0 X3hwcnRfdWRwNiwgT3B0X3hwcnRfdGNwLCBPcHRfeHBydF90Y3A2LA0KPiA+IE9wdF94cHJ0X3Jk bWEsDQo+ID4gKwlPcHRfeHBydF9yZG1hNiwNCj4gPiArDQo+ID4gKwlPcHRfeHBydF9lcnINCj4g PiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IG5mc194cHJ0X3By b3RvY29sX3Rva2VucyA9IHsNCj4gPiArCXsgT3B0X3hwcnRfdWRwLCAidWRwIiB9LA0KPiA+ICsJ eyBPcHRfeHBydF91ZHA2LCAidWRwNiIgfSwNCj4gPiArCXsgT3B0X3hwcnRfdGNwLCAidGNwIiB9 LA0KPiA+ICsJeyBPcHRfeHBydF90Y3A2LCAidGNwNiIgfSwNCj4gPiArCXsgT3B0X3hwcnRfcmRt YSwgInJkbWEiIH0sDQo+ID4gKwl7IE9wdF94cHJ0X3JkbWE2LCAicmRtYTYiIH0sDQo+ID4gKw0K PiA+ICsJeyBPcHRfeHBydF9lcnIsIE5VTEwgfQ0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArZW51bSB7 DQo+ID4gKwlPcHRfc2VjX25vbmUsIE9wdF9zZWNfc3lzLA0KPiA+ICsJT3B0X3NlY19rcmI1LCBP cHRfc2VjX2tyYjVpLCBPcHRfc2VjX2tyYjVwLA0KPiA+ICsJT3B0X3NlY19sa2V5LCBPcHRfc2Vj X2xrZXlpLCBPcHRfc2VjX2xrZXlwLA0KPiA+ICsJT3B0X3NlY19zcGttLCBPcHRfc2VjX3Nwa21p LCBPcHRfc2VjX3Nwa21wLA0KPiA+ICsNCj4gPiArCU9wdF9zZWNfZXJyDQo+ID4gK307DQo+ID4g Kw0KPiA+ICtzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCBuZnNfc2VjZmxhdm9yX3Rva2VucyA9 IHsNCj4gPiArCXsgT3B0X3NlY19ub25lLCAibm9uZSIgfSwNCj4gPiArCXsgT3B0X3NlY19ub25l LCAibnVsbCIgfSwNCj4gPiArCXsgT3B0X3NlY19zeXMsICJzeXMiIH0sDQo+ID4gKw0KPiA+ICsJ eyBPcHRfc2VjX2tyYjUsICJrcmI1IiB9LA0KPiA+ICsJeyBPcHRfc2VjX2tyYjVpLCAia3JiNWki IH0sDQo+ID4gKwl7IE9wdF9zZWNfa3JiNXAsICJrcmI1cCIgfSwNCj4gPiArDQo+ID4gKwl7IE9w dF9zZWNfbGtleSwgImxrZXkiIH0sDQo+ID4gKwl7IE9wdF9zZWNfbGtleWksICJsa2V5aSIgfSwN Cj4gPiArCXsgT3B0X3NlY19sa2V5cCwgImxrZXlwIiB9LA0KPiA+ICsNCj4gPiArCXsgT3B0X3Nl Y19zcGttLCAic3BrbTMiIH0sDQo+ID4gKwl7IE9wdF9zZWNfc3BrbWksICJzcGttM2kiIH0sDQo+ ID4gKwl7IE9wdF9zZWNfc3BrbXAsICJzcGttM3AiIH0sDQo+ID4gKw0KPiA+ICsJeyBPcHRfc2Vj X2VyciwgTlVMTCB9DQo+ID4gK307DQo+ID4gKw0KPiA+ICtlbnVtIHsNCj4gPiArCU9wdF9sb29r dXBjYWNoZV9hbGwsIE9wdF9sb29rdXBjYWNoZV9wb3NpdGl2ZSwNCj4gPiArCU9wdF9sb29rdXBj YWNoZV9ub25lLA0KPiA+ICsNCj4gPiArCU9wdF9sb29rdXBjYWNoZV9lcnINCj4gPiArfTsNCj4g PiArDQo+ID4gK3N0YXRpYyBtYXRjaF90YWJsZV90IG5mc19sb29rdXBjYWNoZV90b2tlbnMgPSB7 DQo+ID4gKwl7IE9wdF9sb29rdXBjYWNoZV9hbGwsICJhbGwiIH0sDQo+ID4gKwl7IE9wdF9sb29r dXBjYWNoZV9wb3NpdGl2ZSwgInBvcyIgfSwNCj4gPiArCXsgT3B0X2xvb2t1cGNhY2hlX3Bvc2l0 aXZlLCAicG9zaXRpdmUiIH0sDQo+ID4gKwl7IE9wdF9sb29rdXBjYWNoZV9ub25lLCAibm9uZSIg fSwNCj4gPiArDQo+ID4gKwl7IE9wdF9sb29rdXBjYWNoZV9lcnIsIE5VTEwgfQ0KPiA+ICt9Ow0K PiA+ICsNCj4gPiArZW51bSB7DQo+ID4gKwlPcHRfbG9jYWxfbG9ja19hbGwsIE9wdF9sb2NhbF9s b2NrX2Zsb2NrLCBPcHRfbG9jYWxfbG9ja19wb3NpeCwNCj4gPiArCU9wdF9sb2NhbF9sb2NrX25v bmUsDQo+ID4gKw0KPiA+ICsJT3B0X2xvY2FsX2xvY2tfZXJyDQo+ID4gK307DQo+ID4gKw0KPiA+ ICtzdGF0aWMgbWF0Y2hfdGFibGVfdCBuZnNfbG9jYWxfbG9ja190b2tlbnMgPSB7DQo+ID4gKwl7 IE9wdF9sb2NhbF9sb2NrX2FsbCwgImFsbCIgfSwNCj4gPiArCXsgT3B0X2xvY2FsX2xvY2tfZmxv Y2ssICJmbG9jayIgfSwNCj4gPiArCXsgT3B0X2xvY2FsX2xvY2tfcG9zaXgsICJwb3NpeCIgfSwN Cj4gPiArCXsgT3B0X2xvY2FsX2xvY2tfbm9uZSwgIm5vbmUiIH0sDQo+ID4gKw0KPiA+ICsJeyBP cHRfbG9jYWxfbG9ja19lcnIsIE5VTEwgfQ0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArZW51bSB7DQo+ ID4gKwlPcHRfdmVyc18yLCBPcHRfdmVyc18zLCBPcHRfdmVyc180LCBPcHRfdmVyc180XzAsDQo+ ID4gKwlPcHRfdmVyc180XzEsIE9wdF92ZXJzXzRfMiwNCj4gPiArDQo+ID4gKwlPcHRfdmVyc19l cnINCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyBtYXRjaF90YWJsZV90IG5mc192ZXJzX3Rv a2VucyA9IHsNCj4gPiArCXsgT3B0X3ZlcnNfMiwgIjIiIH0sDQo+ID4gKwl7IE9wdF92ZXJzXzMs ICIzIiB9LA0KPiA+ICsJeyBPcHRfdmVyc180LCAiNCIgfSwNCj4gPiArCXsgT3B0X3ZlcnNfNF8w LCAiNC4wIiB9LA0KPiA+ICsJeyBPcHRfdmVyc180XzEsICI0LjEiIH0sDQo+ID4gKwl7IE9wdF92 ZXJzXzRfMiwgIjQuMiIgfSwNCj4gPiArDQo+ID4gKwl7IE9wdF92ZXJzX2VyciwgTlVMTCB9DQo+ ID4gK307DQo+ID4gKw0KPiA+ICtzdHJ1Y3QgbmZzX3BhcnNlZF9tb3VudF9kYXRhICpuZnNfYWxs b2NfcGFyc2VkX21vdW50X2RhdGEodm9pZCkNCj4gPiArew0KPiA+ICsJc3RydWN0IG5mc19wYXJz ZWRfbW91bnRfZGF0YSAqZGF0YTsNCj4gPiArDQo+ID4gKwlkYXRhID0ga3phbGxvYyhzaXplb2Yo KmRhdGEpLCBHRlBfS0VSTkVMKTsNCj4gPiArCWlmIChkYXRhKSB7DQo+ID4gKwkJZGF0YS0+dGlt ZW8JCT0gTkZTX1VOU1BFQ19USU1FTzsNCj4gPiArCQlkYXRhLT5yZXRyYW5zCQk9IE5GU19VTlNQ RUNfUkVUUkFOUzsNCj4gPiArCQlkYXRhLT5hY3JlZ21pbgkJPSBORlNfREVGX0FDUkVHTUlOOw0K PiA+ICsJCWRhdGEtPmFjcmVnbWF4CQk9IE5GU19ERUZfQUNSRUdNQVg7DQo+ID4gKwkJZGF0YS0+ YWNkaXJtaW4JCT0gTkZTX0RFRl9BQ0RJUk1JTjsNCj4gPiArCQlkYXRhLT5hY2Rpcm1heAkJPSBO RlNfREVGX0FDRElSTUFYOw0KPiA+ICsJCWRhdGEtPm1vdW50X3NlcnZlci5wb3J0CT0gTkZTX1VO U1BFQ19QT1JUOw0KPiA+ICsJCWRhdGEtPm5mc19zZXJ2ZXIucG9ydAk9IE5GU19VTlNQRUNfUE9S VDsNCj4gPiArCQlkYXRhLT5uZnNfc2VydmVyLnByb3RvY29sID0gWFBSVF9UUkFOU1BPUlRfVENQ Ow0KPiA+ICsJCWRhdGEtPnNlbGVjdGVkX2ZsYXZvcgk9IFJQQ19BVVRIX01BWEZMQVZPUjsNCj4g PiArCQlkYXRhLT5taW5vcnZlcnNpb24JPSAwOw0KPiA+ICsJCWRhdGEtPm5lZWRfbW91bnQJPSB0 cnVlOw0KPiA+ICsJCWRhdGEtPm5ldAkJPSBjdXJyZW50LT5uc3Byb3h5LT5uZXRfbnM7DQo+ID4g KwkJZGF0YS0+bHNtX29wdHMJCT0gTlVMTDsNCj4gPiArCX0NCj4gPiArCXJldHVybiBkYXRhOw0K PiA+ICt9DQo+ID4gKw0KPiA+ICt2b2lkIG5mc19mcmVlX3BhcnNlZF9tb3VudF9kYXRhKHN0cnVj dCBuZnNfcGFyc2VkX21vdW50X2RhdGENCj4gPiAqZGF0YSkNCj4gPiArew0KPiA+ICsJaWYgKGRh dGEpIHsNCj4gPiArCQlrZnJlZShkYXRhLT5jbGllbnRfYWRkcmVzcyk7DQo+ID4gKwkJa2ZyZWUo ZGF0YS0+bW91bnRfc2VydmVyLmhvc3RuYW1lKTsNCj4gPiArCQlrZnJlZShkYXRhLT5uZnNfc2Vy dmVyLmV4cG9ydF9wYXRoKTsNCj4gPiArCQlrZnJlZShkYXRhLT5uZnNfc2VydmVyLmhvc3RuYW1l KTsNCj4gPiArCQlrZnJlZShkYXRhLT5mc2NhY2hlX3VuaXEpOw0KPiA+ICsJCXNlY3VyaXR5X2Zy ZWVfbW50X29wdHMoJmRhdGEtPmxzbV9vcHRzKTsNCj4gPiArCQlrZnJlZShkYXRhKTsNCj4gPiAr CX0NCj4gPiArfQ0KPiA+ICsNCj4gPiArLyoNCj4gPiArICogU2FuaXR5LWNoZWNrIGEgc2VydmVy IGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIG1vdW50IGNvbW1hbmQuDQo+ID4gKyAqDQo+ID4gKyAq IEFkZHJlc3MgZmFtaWx5IG11c3QgYmUgaW5pdGlhbGl6ZWQsIGFuZCBhZGRyZXNzIG11c3Qgbm90 IGJlDQo+ID4gKyAqIHRoZSBBTlkgYWRkcmVzcyBmb3IgdGhhdCBmYW1pbHkuDQo+ID4gKyAqLw0K PiA+ICtzdGF0aWMgaW50IG5mc192ZXJpZnlfc2VydmVyX2FkZHJlc3Moc3RydWN0IHNvY2thZGRy ICphZGRyKQ0KPiA+ICt7DQo+ID4gKwlzd2l0Y2ggKGFkZHItPnNhX2ZhbWlseSkgew0KPiA+ICsJ Y2FzZSBBRl9JTkVUOiB7DQo+ID4gKwkJc3RydWN0IHNvY2thZGRyX2luICpzYSA9IChzdHJ1Y3Qg c29ja2FkZHJfaW4gKilhZGRyOw0KPiA+ICsJCXJldHVybiBzYS0+c2luX2FkZHIuc19hZGRyICE9 IGh0b25sKElOQUREUl9BTlkpOw0KPiA+ICsJfQ0KPiA+ICsJY2FzZSBBRl9JTkVUNjogew0KPiA+ ICsJCXN0cnVjdCBpbjZfYWRkciAqc2EgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcikt DQo+ID4gPnNpbjZfYWRkcjsNCj4gPiArCQlyZXR1cm4gIWlwdjZfYWRkcl9hbnkoc2EpOw0KPiA+ ICsJfQ0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBJbnZhbGlk IElQIGFkZHJlc3Mgc3BlY2lmaWVkXG4iKTsNCj4gPiArCXJldHVybiAwOw0KPiA+ICt9DQo+ID4g Kw0KPiA+ICsvKg0KPiA+ICsgKiBTYW5pdHkgY2hlY2sgdGhlIE5GUyB0cmFuc3BvcnQgcHJvdG9j b2wuDQo+ID4gKyAqDQo+ID4gKyAqLw0KPiA+ICtzdGF0aWMgdm9pZCBuZnNfdmFsaWRhdGVfdHJh bnNwb3J0X3Byb3RvY29sKHN0cnVjdA0KPiA+IG5mc19wYXJzZWRfbW91bnRfZGF0YSAqbW50KQ0K PiA+ICt7DQo+ID4gKwlzd2l0Y2ggKG1udC0+bmZzX3NlcnZlci5wcm90b2NvbCkgew0KPiA+ICsJ Y2FzZSBYUFJUX1RSQU5TUE9SVF9VRFA6DQo+ID4gKwljYXNlIFhQUlRfVFJBTlNQT1JUX1RDUDoN Cj4gPiArCWNhc2UgWFBSVF9UUkFOU1BPUlRfUkRNQToNCj4gPiArCQlicmVhazsNCj4gPiArCWRl ZmF1bHQ6DQo+ID4gKwkJbW50LT5uZnNfc2VydmVyLnByb3RvY29sID0gWFBSVF9UUkFOU1BPUlRf VENQOw0KPiA+ICsJfQ0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKg0KPiA+ICsgKiBGb3IgdGV4dCBi YXNlZCBORlN2Mi92MyBtb3VudHMsIHRoZSBtb3VudCBwcm90b2NvbCB0cmFuc3BvcnQNCj4gPiBk ZWZhdWx0DQo+ID4gKyAqIHNldHRpbmdzIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUgc3BlY2lmaWVk IE5GUyB0cmFuc3BvcnQuDQo+ID4gKyAqLw0KPiA+ICtzdGF0aWMgdm9pZCBuZnNfc2V0X21vdW50 X3RyYW5zcG9ydF9wcm90b2NvbChzdHJ1Y3QNCj4gPiBuZnNfcGFyc2VkX21vdW50X2RhdGEgKm1u dCkNCj4gPiArew0KPiA+ICsJbmZzX3ZhbGlkYXRlX3RyYW5zcG9ydF9wcm90b2NvbChtbnQpOw0K PiA+ICsNCj4gPiArCWlmIChtbnQtPm1vdW50X3NlcnZlci5wcm90b2NvbCA9PSBYUFJUX1RSQU5T UE9SVF9VRFAgfHwNCj4gPiArCSAgICBtbnQtPm1vdW50X3NlcnZlci5wcm90b2NvbCA9PSBYUFJU X1RSQU5TUE9SVF9UQ1ApDQo+ID4gKwkJCXJldHVybjsNCj4gPiArCXN3aXRjaCAobW50LT5uZnNf c2VydmVyLnByb3RvY29sKSB7DQo+ID4gKwljYXNlIFhQUlRfVFJBTlNQT1JUX1VEUDoNCj4gPiAr CQltbnQtPm1vdW50X3NlcnZlci5wcm90b2NvbCA9IFhQUlRfVFJBTlNQT1JUX1VEUDsNCj4gPiAr CQlicmVhazsNCj4gPiArCWNhc2UgWFBSVF9UUkFOU1BPUlRfVENQOg0KPiA+ICsJY2FzZSBYUFJU X1RSQU5TUE9SVF9SRE1BOg0KPiA+ICsJCW1udC0+bW91bnRfc2VydmVyLnByb3RvY29sID0gWFBS VF9UUkFOU1BPUlRfVENQOw0KPiA+ICsJfQ0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKg0KPiA+ICsg KiBBZGQgJ2ZsYXZvcicgdG8gJ2F1dGhfaW5mbycgaWYgbm90IGFscmVhZHkgcHJlc2VudC4NCj4g PiArICogUmV0dXJucyB0cnVlIGlmICdmbGF2b3InIGVuZHMgdXAgaW4gdGhlIGxpc3QsIGZhbHNl IG90aGVyd2lzZQ0KPiA+ICsgKi8NCj4gPiArc3RhdGljIGJvb2wgbmZzX2F1dGhfaW5mb19hZGQo c3RydWN0IG5mc19hdXRoX2luZm8gKmF1dGhfaW5mbywNCj4gPiArCQkJICAgICAgcnBjX2F1dGhm bGF2b3JfdCBmbGF2b3IpDQo+ID4gK3sNCj4gPiArCXVuc2lnbmVkIGludCBpOw0KPiA+ICsJdW5z aWduZWQgaW50IG1heF9mbGF2b3JfbGVuID0gQVJSQVlfU0laRShhdXRoX2luZm8tPmZsYXZvcnMp Ow0KPiA+ICsNCj4gPiArCS8qIG1ha2Ugc3VyZSB0aGlzIGZsYXZvciBpc24ndCBhbHJlYWR5IGlu IHRoZSBsaXN0ICovDQo+ID4gKwlmb3IgKGkgPSAwOyBpIDwgYXV0aF9pbmZvLT5mbGF2b3JfbGVu OyBpKyspIHsNCj4gPiArCQlpZiAoZmxhdm9yID09IGF1dGhfaW5mby0+Zmxhdm9yc1tpXSkNCj4g PiArCQkJcmV0dXJuIHRydWU7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJaWYgKGF1dGhfaW5mby0+ Zmxhdm9yX2xlbiArIDEgPj0gbWF4X2ZsYXZvcl9sZW4pIHsNCj4gPiArCQlkZnByaW50ayhNT1VO VCwgIk5GUzogdG9vIG1hbnkgc2VjPSBmbGF2b3JzXG4iKTsNCj4gPiArCQlyZXR1cm4gZmFsc2U7 DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJYXV0aF9pbmZvLT5mbGF2b3JzW2F1dGhfaW5mby0+Zmxh dm9yX2xlbisrXSA9IGZsYXZvcjsNCj4gPiArCXJldHVybiB0cnVlOw0KPiA+ICt9DQo+ID4gKw0K PiA+ICsvKg0KPiA+ICsgKiBQYXJzZSB0aGUgdmFsdWUgb2YgdGhlICdzZWM9JyBvcHRpb24uDQo+ ID4gKyAqLw0KPiA+ICtzdGF0aWMgaW50IG5mc19wYXJzZV9zZWN1cml0eV9mbGF2b3JzKGNoYXIg KnZhbHVlLA0KPiA+ICsJCQkJICAgICAgc3RydWN0IG5mc19wYXJzZWRfbW91bnRfZGF0YQ0KPiA+ ICptbnQpDQo+ID4gK3sNCj4gPiArCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsNCj4g PiArCXJwY19hdXRoZmxhdm9yX3QgcHNldWRvZmxhdm9yOw0KPiA+ICsJY2hhciAqcDsNCj4gPiAr DQo+ID4gKwlkZnByaW50ayhNT1VOVCwgIk5GUzogcGFyc2luZyBzZWM9JXMgb3B0aW9uXG4iLCB2 YWx1ZSk7DQo+ID4gKw0KPiA+ICsJd2hpbGUgKChwID0gc3Ryc2VwKCZ2YWx1ZSwgIjoiKSkgIT0g TlVMTCkgew0KPiA+ICsJCXN3aXRjaCAobWF0Y2hfdG9rZW4ocCwgbmZzX3NlY2ZsYXZvcl90b2tl bnMsIGFyZ3MpKSB7DQo+ID4gKwkJY2FzZSBPcHRfc2VjX25vbmU6DQo+ID4gKwkJCXBzZXVkb2Zs YXZvciA9IFJQQ19BVVRIX05VTEw7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWNhc2UgT3B0X3Nl Y19zeXM6DQo+ID4gKwkJCXBzZXVkb2ZsYXZvciA9IFJQQ19BVVRIX1VOSVg7DQo+ID4gKwkJCWJy ZWFrOw0KPiA+ICsJCWNhc2UgT3B0X3NlY19rcmI1Og0KPiA+ICsJCQlwc2V1ZG9mbGF2b3IgPSBS UENfQVVUSF9HU1NfS1JCNTsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfc2VjX2ty YjVpOg0KPiA+ICsJCQlwc2V1ZG9mbGF2b3IgPSBSUENfQVVUSF9HU1NfS1JCNUk7DQo+ID4gKwkJ CWJyZWFrOw0KPiA+ICsJCWNhc2UgT3B0X3NlY19rcmI1cDoNCj4gPiArCQkJcHNldWRvZmxhdm9y ID0gUlBDX0FVVEhfR1NTX0tSQjVQOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIE9wdF9z ZWNfbGtleToNCj4gPiArCQkJcHNldWRvZmxhdm9yID0gUlBDX0FVVEhfR1NTX0xLRVk7DQo+ID4g KwkJCWJyZWFrOw0KPiA+ICsJCWNhc2UgT3B0X3NlY19sa2V5aToNCj4gPiArCQkJcHNldWRvZmxh dm9yID0gUlBDX0FVVEhfR1NTX0xLRVlJOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIE9w dF9zZWNfbGtleXA6DQo+ID4gKwkJCXBzZXVkb2ZsYXZvciA9IFJQQ19BVVRIX0dTU19MS0VZUDsN Cj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfc2VjX3Nwa206DQo+ID4gKwkJCXBzZXVk b2ZsYXZvciA9IFJQQ19BVVRIX0dTU19TUEtNOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNl IE9wdF9zZWNfc3BrbWk6DQo+ID4gKwkJCXBzZXVkb2ZsYXZvciA9IFJQQ19BVVRIX0dTU19TUEtN STsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfc2VjX3Nwa21wOg0KPiA+ICsJCQlw c2V1ZG9mbGF2b3IgPSBSUENfQVVUSF9HU1NfU1BLTVA7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJ CWRlZmF1bHQ6DQo+ID4gKwkJCWRmcHJpbnRrKE1PVU5ULA0KPiA+ICsJCQkJICJORlM6IHNlYz0g b3B0aW9uICclcycgbm90DQo+ID4gcmVjb2duaXplZFxuIiwgcCk7DQo+ID4gKwkJCXJldHVybiAw Ow0KPiA+ICsJCX0NCj4gPiArDQo+ID4gKwkJaWYgKCFuZnNfYXV0aF9pbmZvX2FkZCgmbW50LT5h dXRoX2luZm8sIHBzZXVkb2ZsYXZvcikpDQo+ID4gKwkJCXJldHVybiAwOw0KPiA+ICsJfQ0KPiA+ ICsNCj4gPiArCXJldHVybiAxOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IG5mc19w YXJzZV92ZXJzaW9uX3N0cmluZyhjaGFyICpzdHJpbmcsDQo+ID4gKwkJc3RydWN0IG5mc19wYXJz ZWRfbW91bnRfZGF0YSAqbW50LA0KPiA+ICsJCXN1YnN0cmluZ190ICphcmdzKQ0KPiA+ICt7DQo+ ID4gKwltbnQtPmZsYWdzICY9IH5ORlNfTU9VTlRfVkVSMzsNCj4gPiArCXN3aXRjaCAobWF0Y2hf dG9rZW4oc3RyaW5nLCBuZnNfdmVyc190b2tlbnMsIGFyZ3MpKSB7DQo+ID4gKwljYXNlIE9wdF92 ZXJzXzI6DQo+ID4gKwkJbW50LT52ZXJzaW9uID0gMjsNCj4gPiArCQlicmVhazsNCj4gPiArCWNh c2UgT3B0X3ZlcnNfMzoNCj4gPiArCQltbnQtPmZsYWdzIHw9IE5GU19NT1VOVF9WRVIzOw0KPiA+ ICsJCW1udC0+dmVyc2lvbiA9IDM7DQo+ID4gKwkJYnJlYWs7DQo+ID4gKwljYXNlIE9wdF92ZXJz XzQ6DQo+ID4gKwkJLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eSBvcHRpb24uIEluIGZ1dHVyZSwN Cj4gPiArCQkgKiB0aGUgbW91bnQgcHJvZ3JhbSBzaG91bGQgYWx3YXlzIHN1cHBseQ0KPiA+ICsJ CSAqIGEgTkZTdjQgbWlub3IgdmVyc2lvbiBudW1iZXIuDQo+ID4gKwkJICovDQo+ID4gKwkJbW50 LT52ZXJzaW9uID0gNDsNCj4gPiArCQlicmVhazsNCj4gPiArCWNhc2UgT3B0X3ZlcnNfNF8wOg0K PiA+ICsJCW1udC0+dmVyc2lvbiA9IDQ7DQo+ID4gKwkJbW50LT5taW5vcnZlcnNpb24gPSAwOw0K PiA+ICsJCWJyZWFrOw0KPiA+ICsJY2FzZSBPcHRfdmVyc180XzE6DQo+ID4gKwkJbW50LT52ZXJz aW9uID0gNDsNCj4gPiArCQltbnQtPm1pbm9ydmVyc2lvbiA9IDE7DQo+ID4gKwkJYnJlYWs7DQo+ ID4gKwljYXNlIE9wdF92ZXJzXzRfMjoNCj4gPiArCQltbnQtPnZlcnNpb24gPSA0Ow0KPiA+ICsJ CW1udC0+bWlub3J2ZXJzaW9uID0gMjsNCj4gPiArCQlicmVhazsNCj4gPiArCWRlZmF1bHQ6DQo+ ID4gKwkJcmV0dXJuIDA7DQo+ID4gKwl9DQo+ID4gKwlyZXR1cm4gMTsNCj4gPiArfQ0KPiA+ICsN Cj4gPiArc3RhdGljIGludCBuZnNfZ2V0X29wdGlvbl9zdHIoc3Vic3RyaW5nX3QgYXJnc1tdLCBj aGFyICoqb3B0aW9uKQ0KPiA+ICt7DQo+ID4gKwlrZnJlZSgqb3B0aW9uKTsNCj4gPiArCSpvcHRp b24gPSBtYXRjaF9zdHJkdXAoYXJncyk7DQo+ID4gKwlyZXR1cm4gISpvcHRpb247DQo+ID4gK30N Cj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgbmZzX2dldF9vcHRpb25fdWwoc3Vic3RyaW5nX3QgYXJn c1tdLCB1bnNpZ25lZCBsb25nDQo+ID4gKm9wdGlvbikNCj4gPiArew0KPiA+ICsJaW50IHJjOw0K PiA+ICsJY2hhciAqc3RyaW5nOw0KPiA+ICsNCj4gPiArCXN0cmluZyA9IG1hdGNoX3N0cmR1cChh cmdzKTsNCj4gPiArCWlmIChzdHJpbmcgPT0gTlVMTCkNCj4gPiArCQlyZXR1cm4gLUVOT01FTTsN Cj4gPiArCXJjID0ga3N0cnRvdWwoc3RyaW5nLCAxMCwgb3B0aW9uKTsNCj4gPiArCWtmcmVlKHN0 cmluZyk7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIHJjOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0 aWMgaW50IG5mc19nZXRfb3B0aW9uX3VsX2JvdW5kKHN1YnN0cmluZ190IGFyZ3NbXSwgdW5zaWdu ZWQNCj4gPiBsb25nICpvcHRpb24sDQo+ID4gKwkJdW5zaWduZWQgbG9uZyBsX2JvdW5kLCB1bnNp Z25lZCBsb25nIHVfYm91bmQpDQo+ID4gK3sNCj4gPiArCWludCByZXQ7DQo+ID4gKw0KPiA+ICsJ cmV0ID0gbmZzX2dldF9vcHRpb25fdWwoYXJncywgb3B0aW9uKTsNCj4gPiArCWlmIChyZXQgIT0g MCkNCj4gPiArCQlyZXR1cm4gcmV0Ow0KPiA+ICsJaWYgKCpvcHRpb24gPCBsX2JvdW5kIHx8ICpv cHRpb24gPiB1X2JvdW5kKQ0KPiA+ICsJCXJldHVybiAtRVJBTkdFOw0KPiA+ICsJcmV0dXJuIDA7 DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qDQo+ID4gKyAqIEVycm9yLWNoZWNrIGFuZCBjb252ZXJ0 IGEgc3RyaW5nIG9mIG1vdW50IG9wdGlvbnMgZnJvbSB1c2VyDQo+ID4gc3BhY2UgaW50bw0KPiA+ ICsgKiBhIGRhdGEgc3RydWN0dXJlLiAgVGhlIHdob2xlIG1vdW50IHN0cmluZyBpcyBwcm9jZXNz ZWQ7IGJhZA0KPiA+IG9wdGlvbnMgYXJlDQo+ID4gKyAqIHNraXBwZWQgYXMgdGhleSBhcmUgZW5j b3VudGVyZWQuICBJZiB0aGVyZSB3ZXJlIG5vIGVycm9ycywNCj4gPiByZXR1cm4gMTsNCj4gPiAr ICogb3RoZXJ3aXNlIHJldHVybiAwICh6ZXJvKS4NCj4gPiArICovDQo+ID4gK2ludCBuZnNfcGFy c2VfbW91bnRfb3B0aW9ucyhjaGFyICpyYXcsIHN0cnVjdA0KPiA+IG5mc19wYXJzZWRfbW91bnRf ZGF0YSAqbW50KQ0KPiA+ICt7DQo+ID4gKwljaGFyICpwLCAqc3RyaW5nOw0KPiA+ICsJaW50IHJj LCBzbG9wcHkgPSAwLCBpbnZhbGlkX29wdGlvbiA9IDA7DQo+ID4gKwl1bnNpZ25lZCBzaG9ydCBw cm90b2ZhbWlseSA9IEFGX1VOU1BFQzsNCj4gPiArCXVuc2lnbmVkIHNob3J0IG1vdW50ZmFtaWx5 ID0gQUZfVU5TUEVDOw0KPiA+ICsNCj4gPiArCWlmICghcmF3KSB7DQo+ID4gKwkJZGZwcmludGso TU9VTlQsICJORlM6IG1vdW50IG9wdGlvbnMgc3RyaW5nIHdhcw0KPiA+IE5VTEwuXG4iKTsNCj4g PiArCQlyZXR1cm4gMTsNCj4gPiArCX0NCj4gPiArCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBuZnMg bW91bnQgb3B0cz0nJXMnXG4iLCByYXcpOw0KPiA+ICsNCj4gPiArCXJjID0gc2VjdXJpdHlfc2Jf ZWF0X2xzbV9vcHRzKHJhdywgJm1udC0+bHNtX29wdHMpOw0KPiA+ICsJaWYgKHJjKQ0KPiA+ICsJ CWdvdG8gb3V0X3NlY3VyaXR5X2ZhaWx1cmU7DQo+ID4gKw0KPiA+ICsJd2hpbGUgKChwID0gc3Ry c2VwKCZyYXcsICIsIikpICE9IE5VTEwpIHsNCj4gPiArCQlzdWJzdHJpbmdfdCBhcmdzW01BWF9P UFRfQVJHU107DQo+ID4gKwkJdW5zaWduZWQgbG9uZyBvcHRpb247DQo+ID4gKwkJaW50IHRva2Vu Ow0KPiA+ICsNCj4gPiArCQlpZiAoISpwKQ0KPiA+ICsJCQljb250aW51ZTsNCj4gPiArDQo+ID4g KwkJZGZwcmludGsoTU9VTlQsICJORlM6ICAgcGFyc2luZyBuZnMgbW91bnQgb3B0aW9uDQo+ID4g JyVzJ1xuIiwgcCk7DQo+ID4gKw0KPiA+ICsJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgbmZzX21v dW50X29wdGlvbl90b2tlbnMsIGFyZ3MpOw0KPiA+ICsJCXN3aXRjaCAodG9rZW4pIHsNCj4gPiAr DQo+ID4gKwkJLyoNCj4gPiArCQkgKiBib29sZWFuIG9wdGlvbnM6ICBmb28vbm9mb28NCj4gPiAr CQkgKi8NCj4gPiArCQljYXNlIE9wdF9zb2Z0Og0KPiA+ICsJCQltbnQtPmZsYWdzIHw9IE5GU19N T1VOVF9TT0ZUOw0KPiA+ICsJCQltbnQtPmZsYWdzICY9IH5ORlNfTU9VTlRfU09GVEVSUjsNCj4g PiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfc29mdGVycjoNCj4gPiArCQkJbW50LT5mbGFn cyB8PSBORlNfTU9VTlRfU09GVEVSUjsNCj4gPiArCQkJbW50LT5mbGFncyAmPSB+TkZTX01PVU5U X1NPRlQ7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWNhc2UgT3B0X2hhcmQ6DQo+ID4gKwkJCW1u dC0+ZmxhZ3MgJj0NCj4gPiB+KE5GU19NT1VOVF9TT0ZUfE5GU19NT1VOVF9TT0ZURVJSKTsNCj4g PiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfcG9zaXg6DQo+ID4gKwkJCW1udC0+ZmxhZ3Mg fD0gTkZTX01PVU5UX1BPU0lYOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIE9wdF9ub3Bv c2l4Og0KPiA+ICsJCQltbnQtPmZsYWdzICY9IH5ORlNfTU9VTlRfUE9TSVg7DQo+ID4gKwkJCWJy ZWFrOw0KPiA+ICsJCWNhc2UgT3B0X2N0bzoNCj4gPiArCQkJbW50LT5mbGFncyAmPSB+TkZTX01P VU5UX05PQ1RPOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIE9wdF9ub2N0bzoNCj4gPiAr CQkJbW50LT5mbGFncyB8PSBORlNfTU9VTlRfTk9DVE87DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJ CWNhc2UgT3B0X2FjOg0KPiA+ICsJCQltbnQtPmZsYWdzICY9IH5ORlNfTU9VTlRfTk9BQzsNCj4g PiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfbm9hYzoNCj4gPiArCQkJbW50LT5mbGFncyB8 PSBORlNfTU9VTlRfTk9BQzsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfbG9jazoN Cj4gPiArCQkJbW50LT5mbGFncyAmPSB+TkZTX01PVU5UX05PTkxNOw0KPiA+ICsJCQltbnQtPmZs YWdzICY9IH4oTkZTX01PVU5UX0xPQ0FMX0ZMT0NLIHwNCj4gPiArCQkJCQlORlNfTU9VTlRfTE9D QUxfRkNOVEwpOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIE9wdF9ub2xvY2s6DQo+ID4g KwkJCW1udC0+ZmxhZ3MgfD0gTkZTX01PVU5UX05PTkxNOw0KPiA+ICsJCQltbnQtPmZsYWdzIHw9 IChORlNfTU9VTlRfTE9DQUxfRkxPQ0sgfA0KPiA+ICsJCQkJICAgICAgIE5GU19NT1VOVF9MT0NB TF9GQ05UTCk7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWNhc2UgT3B0X3VkcDoNCj4gPiArCQkJ bW50LT5mbGFncyAmPSB+TkZTX01PVU5UX1RDUDsNCj4gPiArCQkJbW50LT5uZnNfc2VydmVyLnBy b3RvY29sID0gWFBSVF9UUkFOU1BPUlRfVURQOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNl IE9wdF90Y3A6DQo+ID4gKwkJCW1udC0+ZmxhZ3MgfD0gTkZTX01PVU5UX1RDUDsNCj4gPiArCQkJ bW50LT5uZnNfc2VydmVyLnByb3RvY29sID0gWFBSVF9UUkFOU1BPUlRfVENQOw0KPiA+ICsJCQli cmVhazsNCj4gPiArCQljYXNlIE9wdF9yZG1hOg0KPiA+ICsJCQltbnQtPmZsYWdzIHw9IE5GU19N T1VOVF9UQ1A7IC8qIGZvciBzaWRlDQo+ID4gcHJvdG9jb2xzICovDQo+ID4gKwkJCW1udC0+bmZz X3NlcnZlci5wcm90b2NvbCA9IFhQUlRfVFJBTlNQT1JUX1JETUE7DQo+ID4gKwkJCXhwcnRfbG9h ZF90cmFuc3BvcnQocCk7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWNhc2UgT3B0X2FjbDoNCj4g PiArCQkJbW50LT5mbGFncyAmPSB+TkZTX01PVU5UX05PQUNMOw0KPiA+ICsJCQlicmVhazsNCj4g PiArCQljYXNlIE9wdF9ub2FjbDoNCj4gPiArCQkJbW50LT5mbGFncyB8PSBORlNfTU9VTlRfTk9B Q0w7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWNhc2UgT3B0X3JkaXJwbHVzOg0KPiA+ICsJCQlt bnQtPmZsYWdzICY9IH5ORlNfTU9VTlRfTk9SRElSUExVUzsNCj4gPiArCQkJYnJlYWs7DQo+ID4g KwkJY2FzZSBPcHRfbm9yZGlycGx1czoNCj4gPiArCQkJbW50LT5mbGFncyB8PSBORlNfTU9VTlRf Tk9SRElSUExVUzsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfc2hhcmVjYWNoZToN Cj4gPiArCQkJbW50LT5mbGFncyAmPSB+TkZTX01PVU5UX1VOU0hBUkVEOw0KPiA+ICsJCQlicmVh azsNCj4gPiArCQljYXNlIE9wdF9ub3NoYXJlY2FjaGU6DQo+ID4gKwkJCW1udC0+ZmxhZ3MgfD0g TkZTX01PVU5UX1VOU0hBUkVEOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIE9wdF9yZXN2 cG9ydDoNCj4gPiArCQkJbW50LT5mbGFncyAmPSB+TkZTX01PVU5UX05PUkVTVlBPUlQ7DQo+ID4g KwkJCWJyZWFrOw0KPiA+ICsJCWNhc2UgT3B0X25vcmVzdnBvcnQ6DQo+ID4gKwkJCW1udC0+Zmxh Z3MgfD0gTkZTX01PVU5UX05PUkVTVlBPUlQ7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWNhc2Ug T3B0X2ZzY2FjaGU6DQo+ID4gKwkJCW1udC0+b3B0aW9ucyB8PSBORlNfT1BUSU9OX0ZTQ0FDSEU7 DQo+ID4gKwkJCWtmcmVlKG1udC0+ZnNjYWNoZV91bmlxKTsNCj4gPiArCQkJbW50LT5mc2NhY2hl X3VuaXEgPSBOVUxMOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIE9wdF9ub2ZzY2FjaGU6 DQo+ID4gKwkJCW1udC0+b3B0aW9ucyAmPSB+TkZTX09QVElPTl9GU0NBQ0hFOw0KPiA+ICsJCQlr ZnJlZShtbnQtPmZzY2FjaGVfdW5pcSk7DQo+ID4gKwkJCW1udC0+ZnNjYWNoZV91bmlxID0gTlVM TDsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfbWlncmF0aW9uOg0KPiA+ICsJCQlt bnQtPm9wdGlvbnMgfD0gTkZTX09QVElPTl9NSUdSQVRJT047DQo+ID4gKwkJCWJyZWFrOw0KPiA+ ICsJCWNhc2UgT3B0X25vbWlncmF0aW9uOg0KPiA+ICsJCQltbnQtPm9wdGlvbnMgJj0gfk5GU19P UFRJT05fTUlHUkFUSU9OOw0KPiA+ICsJCQlicmVhazsNCj4gPiArDQo+ID4gKwkJLyoNCj4gPiAr CQkgKiBvcHRpb25zIHRoYXQgdGFrZSBudW1lcmljIHZhbHVlcw0KPiA+ICsJCSAqLw0KPiA+ICsJ CWNhc2UgT3B0X3BvcnQ6DQo+ID4gKwkJCWlmIChuZnNfZ2V0X29wdGlvbl91bChhcmdzLCAmb3B0 aW9uKSB8fA0KPiA+ICsJCQkgICAgb3B0aW9uID4gVVNIUlRfTUFYKQ0KPiA+ICsJCQkJZ290byBv dXRfaW52YWxpZF92YWx1ZTsNCj4gPiArCQkJbW50LT5uZnNfc2VydmVyLnBvcnQgPSBvcHRpb247 DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWNhc2UgT3B0X3JzaXplOg0KPiA+ICsJCQlpZiAobmZz X2dldF9vcHRpb25fdWwoYXJncywgJm9wdGlvbikpDQo+ID4gKwkJCQlnb3RvIG91dF9pbnZhbGlk X3ZhbHVlOw0KPiA+ICsJCQltbnQtPnJzaXplID0gb3B0aW9uOw0KPiA+ICsJCQlicmVhazsNCj4g PiArCQljYXNlIE9wdF93c2l6ZToNCj4gPiArCQkJaWYgKG5mc19nZXRfb3B0aW9uX3VsKGFyZ3Ms ICZvcHRpb24pKQ0KPiA+ICsJCQkJZ290byBvdXRfaW52YWxpZF92YWx1ZTsNCj4gPiArCQkJbW50 LT53c2l6ZSA9IG9wdGlvbjsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfYnNpemU6 DQo+ID4gKwkJCWlmIChuZnNfZ2V0X29wdGlvbl91bChhcmdzLCAmb3B0aW9uKSkNCj4gPiArCQkJ CWdvdG8gb3V0X2ludmFsaWRfdmFsdWU7DQo+ID4gKwkJCW1udC0+YnNpemUgPSBvcHRpb247DQo+ ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWNhc2UgT3B0X3RpbWVvOg0KPiA+ICsJCQlpZiAobmZzX2dl dF9vcHRpb25fdWxfYm91bmQoYXJncywgJm9wdGlvbiwgMSwNCj4gPiBJTlRfTUFYKSkNCj4gPiAr CQkJCWdvdG8gb3V0X2ludmFsaWRfdmFsdWU7DQo+ID4gKwkJCW1udC0+dGltZW8gPSBvcHRpb247 DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWNhc2UgT3B0X3JldHJhbnM6DQo+ID4gKwkJCWlmIChu ZnNfZ2V0X29wdGlvbl91bF9ib3VuZChhcmdzLCAmb3B0aW9uLCAwLA0KPiA+IElOVF9NQVgpKQ0K PiA+ICsJCQkJZ290byBvdXRfaW52YWxpZF92YWx1ZTsNCj4gPiArCQkJbW50LT5yZXRyYW5zID0g b3B0aW9uOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIE9wdF9hY3JlZ21pbjoNCj4gPiAr CQkJaWYgKG5mc19nZXRfb3B0aW9uX3VsKGFyZ3MsICZvcHRpb24pKQ0KPiA+ICsJCQkJZ290byBv dXRfaW52YWxpZF92YWx1ZTsNCj4gPiArCQkJbW50LT5hY3JlZ21pbiA9IG9wdGlvbjsNCj4gPiAr CQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfYWNyZWdtYXg6DQo+ID4gKwkJCWlmIChuZnNfZ2V0 X29wdGlvbl91bChhcmdzLCAmb3B0aW9uKSkNCj4gPiArCQkJCWdvdG8gb3V0X2ludmFsaWRfdmFs dWU7DQo+ID4gKwkJCW1udC0+YWNyZWdtYXggPSBvcHRpb247DQo+ID4gKwkJCWJyZWFrOw0KPiA+ ICsJCWNhc2UgT3B0X2FjZGlybWluOg0KPiA+ICsJCQlpZiAobmZzX2dldF9vcHRpb25fdWwoYXJn cywgJm9wdGlvbikpDQo+ID4gKwkJCQlnb3RvIG91dF9pbnZhbGlkX3ZhbHVlOw0KPiA+ICsJCQlt bnQtPmFjZGlybWluID0gb3B0aW9uOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIE9wdF9h Y2Rpcm1heDoNCj4gPiArCQkJaWYgKG5mc19nZXRfb3B0aW9uX3VsKGFyZ3MsICZvcHRpb24pKQ0K PiA+ICsJCQkJZ290byBvdXRfaW52YWxpZF92YWx1ZTsNCj4gPiArCQkJbW50LT5hY2Rpcm1heCA9 IG9wdGlvbjsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfYWN0aW1lbzoNCj4gPiAr CQkJaWYgKG5mc19nZXRfb3B0aW9uX3VsKGFyZ3MsICZvcHRpb24pKQ0KPiA+ICsJCQkJZ290byBv dXRfaW52YWxpZF92YWx1ZTsNCj4gPiArCQkJbW50LT5hY3JlZ21pbiA9IG1udC0+YWNyZWdtYXgg PQ0KPiA+ICsJCQltbnQtPmFjZGlybWluID0gbW50LT5hY2Rpcm1heCA9IG9wdGlvbjsNCj4gPiAr CQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfbmFtZWxlbjoNCj4gPiArCQkJaWYgKG5mc19nZXRf b3B0aW9uX3VsKGFyZ3MsICZvcHRpb24pKQ0KPiA+ICsJCQkJZ290byBvdXRfaW52YWxpZF92YWx1 ZTsNCj4gPiArCQkJbW50LT5uYW1sZW4gPSBvcHRpb247DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJ CWNhc2UgT3B0X21vdW50cG9ydDoNCj4gPiArCQkJaWYgKG5mc19nZXRfb3B0aW9uX3VsKGFyZ3Ms ICZvcHRpb24pIHx8DQo+ID4gKwkJCSAgICBvcHRpb24gPiBVU0hSVF9NQVgpDQo+ID4gKwkJCQln b3RvIG91dF9pbnZhbGlkX3ZhbHVlOw0KPiA+ICsJCQltbnQtPm1vdW50X3NlcnZlci5wb3J0ID0g b3B0aW9uOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIE9wdF9tb3VudHZlcnM6DQo+ID4g KwkJCWlmIChuZnNfZ2V0X29wdGlvbl91bChhcmdzLCAmb3B0aW9uKSB8fA0KPiA+ICsJCQkgICAg b3B0aW9uIDwgTkZTX01OVF9WRVJTSU9OIHx8DQo+ID4gKwkJCSAgICBvcHRpb24gPiBORlNfTU5U M19WRVJTSU9OKQ0KPiA+ICsJCQkJZ290byBvdXRfaW52YWxpZF92YWx1ZTsNCj4gPiArCQkJbW50 LT5tb3VudF9zZXJ2ZXIudmVyc2lvbiA9IG9wdGlvbjsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJ Y2FzZSBPcHRfbWlub3J2ZXJzaW9uOg0KPiA+ICsJCQlpZiAobmZzX2dldF9vcHRpb25fdWwoYXJn cywgJm9wdGlvbikpDQo+ID4gKwkJCQlnb3RvIG91dF9pbnZhbGlkX3ZhbHVlOw0KPiA+ICsJCQlp ZiAob3B0aW9uID4gTkZTNF9NQVhfTUlOT1JfVkVSU0lPTikNCj4gPiArCQkJCWdvdG8gb3V0X2lu dmFsaWRfdmFsdWU7DQo+ID4gKwkJCW1udC0+bWlub3J2ZXJzaW9uID0gb3B0aW9uOw0KPiA+ICsJ CQlicmVhazsNCj4gPiArDQo+ID4gKwkJLyoNCj4gPiArCQkgKiBvcHRpb25zIHRoYXQgdGFrZSB0 ZXh0IHZhbHVlcw0KPiA+ICsJCSAqLw0KPiA+ICsJCWNhc2UgT3B0X25mc3ZlcnM6DQo+ID4gKwkJ CXN0cmluZyA9IG1hdGNoX3N0cmR1cChhcmdzKTsNCj4gPiArCQkJaWYgKHN0cmluZyA9PSBOVUxM KQ0KPiA+ICsJCQkJZ290byBvdXRfbm9tZW07DQo+ID4gKwkJCXJjID0gbmZzX3BhcnNlX3ZlcnNp b25fc3RyaW5nKHN0cmluZywgbW50LA0KPiA+IGFyZ3MpOw0KPiA+ICsJCQlrZnJlZShzdHJpbmcp Ow0KPiA+ICsJCQlpZiAoIXJjKQ0KPiA+ICsJCQkJZ290byBvdXRfaW52YWxpZF92YWx1ZTsNCj4g PiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfc2VjOg0KPiA+ICsJCQlzdHJpbmcgPSBtYXRj aF9zdHJkdXAoYXJncyk7DQo+ID4gKwkJCWlmIChzdHJpbmcgPT0gTlVMTCkNCj4gPiArCQkJCWdv dG8gb3V0X25vbWVtOw0KPiA+ICsJCQlyYyA9IG5mc19wYXJzZV9zZWN1cml0eV9mbGF2b3JzKHN0 cmluZywgbW50KTsNCj4gPiArCQkJa2ZyZWUoc3RyaW5nKTsNCj4gPiArCQkJaWYgKCFyYykgew0K PiA+ICsJCQkJZGZwcmludGsoTU9VTlQsICJORlM6ICAgdW5yZWNvZ25pemVkICINCj4gPiArCQkJ CQkJInNlY3VyaXR5IGZsYXZvclxuIik7DQo+ID4gKwkJCQlyZXR1cm4gMDsNCj4gPiArCQkJfQ0K PiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIE9wdF9wcm90bzoNCj4gPiArCQkJc3RyaW5nID0g bWF0Y2hfc3RyZHVwKGFyZ3MpOw0KPiA+ICsJCQlpZiAoc3RyaW5nID09IE5VTEwpDQo+ID4gKwkJ CQlnb3RvIG91dF9ub21lbTsNCj4gPiArCQkJdG9rZW4gPSBtYXRjaF90b2tlbihzdHJpbmcsDQo+ ID4gKwkJCQkJICAgIG5mc194cHJ0X3Byb3RvY29sX3Rva2VucywNCj4gPiBhcmdzKTsNCj4gPiAr DQo+ID4gKwkJCXByb3RvZmFtaWx5ID0gQUZfSU5FVDsNCj4gPiArCQkJc3dpdGNoICh0b2tlbikg ew0KPiA+ICsJCQljYXNlIE9wdF94cHJ0X3VkcDY6DQo+ID4gKwkJCQlwcm90b2ZhbWlseSA9IEFG X0lORVQ2Ow0KPiA+ICsJCQkJLyogZmFsbCB0aHJvdWdoICovDQo+ID4gKwkJCWNhc2UgT3B0X3hw cnRfdWRwOg0KPiA+ICsJCQkJbW50LT5mbGFncyAmPSB+TkZTX01PVU5UX1RDUDsNCj4gPiArCQkJ CW1udC0+bmZzX3NlcnZlci5wcm90b2NvbCA9DQo+ID4gWFBSVF9UUkFOU1BPUlRfVURQOw0KPiA+ ICsJCQkJYnJlYWs7DQo+ID4gKwkJCWNhc2UgT3B0X3hwcnRfdGNwNjoNCj4gPiArCQkJCXByb3Rv ZmFtaWx5ID0gQUZfSU5FVDY7DQo+ID4gKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8NCj4gPiArCQkJ Y2FzZSBPcHRfeHBydF90Y3A6DQo+ID4gKwkJCQltbnQtPmZsYWdzIHw9IE5GU19NT1VOVF9UQ1A7 DQo+ID4gKwkJCQltbnQtPm5mc19zZXJ2ZXIucHJvdG9jb2wgPQ0KPiA+IFhQUlRfVFJBTlNQT1JU X1RDUDsNCj4gPiArCQkJCWJyZWFrOw0KPiA+ICsJCQljYXNlIE9wdF94cHJ0X3JkbWE2Og0KPiA+ ICsJCQkJcHJvdG9mYW1pbHkgPSBBRl9JTkVUNjsNCj4gPiArCQkJCS8qIGZhbGwgdGhyb3VnaCAq Lw0KPiA+ICsJCQljYXNlIE9wdF94cHJ0X3JkbWE6DQo+ID4gKwkJCQkvKiB2ZWN0b3Igc2lkZSBw cm90b2NvbHMgdG8gVENQICovDQo+ID4gKwkJCQltbnQtPmZsYWdzIHw9IE5GU19NT1VOVF9UQ1A7 DQo+ID4gKwkJCQltbnQtPm5mc19zZXJ2ZXIucHJvdG9jb2wgPQ0KPiA+IFhQUlRfVFJBTlNQT1JU X1JETUE7DQo+ID4gKwkJCQl4cHJ0X2xvYWRfdHJhbnNwb3J0KHN0cmluZyk7DQo+ID4gKwkJCQli cmVhazsNCj4gPiArCQkJZGVmYXVsdDoNCj4gPiArCQkJCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiAg IHVucmVjb2duaXplZCAiDQo+ID4gKwkJCQkJCSJ0cmFuc3BvcnQNCj4gPiBwcm90b2NvbFxuIik7 DQo+ID4gKwkJCQlrZnJlZShzdHJpbmcpOw0KPiA+ICsJCQkJcmV0dXJuIDA7DQo+ID4gKwkJCX0N Cj4gPiArCQkJa2ZyZWUoc3RyaW5nKTsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRf bW91bnRwcm90bzoNCj4gPiArCQkJc3RyaW5nID0gbWF0Y2hfc3RyZHVwKGFyZ3MpOw0KPiA+ICsJ CQlpZiAoc3RyaW5nID09IE5VTEwpDQo+ID4gKwkJCQlnb3RvIG91dF9ub21lbTsNCj4gPiArCQkJ dG9rZW4gPSBtYXRjaF90b2tlbihzdHJpbmcsDQo+ID4gKwkJCQkJICAgIG5mc194cHJ0X3Byb3Rv Y29sX3Rva2VucywNCj4gPiBhcmdzKTsNCj4gPiArCQkJa2ZyZWUoc3RyaW5nKTsNCj4gPiArDQo+ ID4gKwkJCW1vdW50ZmFtaWx5ID0gQUZfSU5FVDsNCj4gPiArCQkJc3dpdGNoICh0b2tlbikgew0K PiA+ICsJCQljYXNlIE9wdF94cHJ0X3VkcDY6DQo+ID4gKwkJCQltb3VudGZhbWlseSA9IEFGX0lO RVQ2Ow0KPiA+ICsJCQkJLyogZmFsbCB0aHJvdWdoICovDQo+ID4gKwkJCWNhc2UgT3B0X3hwcnRf dWRwOg0KPiA+ICsJCQkJbW50LT5tb3VudF9zZXJ2ZXIucHJvdG9jb2wgPQ0KPiA+IFhQUlRfVFJB TlNQT1JUX1VEUDsNCj4gPiArCQkJCWJyZWFrOw0KPiA+ICsJCQljYXNlIE9wdF94cHJ0X3RjcDY6 DQo+ID4gKwkJCQltb3VudGZhbWlseSA9IEFGX0lORVQ2Ow0KPiA+ICsJCQkJLyogZmFsbCB0aHJv dWdoICovDQo+ID4gKwkJCWNhc2UgT3B0X3hwcnRfdGNwOg0KPiA+ICsJCQkJbW50LT5tb3VudF9z ZXJ2ZXIucHJvdG9jb2wgPQ0KPiA+IFhQUlRfVFJBTlNQT1JUX1RDUDsNCj4gPiArCQkJCWJyZWFr Ow0KPiA+ICsJCQljYXNlIE9wdF94cHJ0X3JkbWE6IC8qIG5vdCB1c2VkIGZvciBzaWRlDQo+ID4g cHJvdG9jb2xzICovDQo+ID4gKwkJCWRlZmF1bHQ6DQo+ID4gKwkJCQlkZnByaW50ayhNT1VOVCwg Ik5GUzogICB1bnJlY29nbml6ZWQgIg0KPiA+ICsJCQkJCQkidHJhbnNwb3J0DQo+ID4gcHJvdG9j b2xcbiIpOw0KPiA+ICsJCQkJcmV0dXJuIDA7DQo+ID4gKwkJCX0NCj4gPiArCQkJYnJlYWs7DQo+ ID4gKwkJY2FzZSBPcHRfYWRkcjoNCj4gPiArCQkJc3RyaW5nID0gbWF0Y2hfc3RyZHVwKGFyZ3Mp Ow0KPiA+ICsJCQlpZiAoc3RyaW5nID09IE5VTEwpDQo+ID4gKwkJCQlnb3RvIG91dF9ub21lbTsN Cj4gPiArCQkJbW50LT5uZnNfc2VydmVyLmFkZHJsZW4gPQ0KPiA+ICsJCQkJcnBjX3B0b24obW50 LT5uZXQsIHN0cmluZywNCj4gPiBzdHJsZW4oc3RyaW5nKSwNCj4gPiArCQkJCQkoc3RydWN0IHNv Y2thZGRyICopDQo+ID4gKwkJCQkJJm1udC0+bmZzX3NlcnZlci5hZGRyZXNzLA0KPiA+ICsJCQkJ CXNpemVvZihtbnQtDQo+ID4gPm5mc19zZXJ2ZXIuYWRkcmVzcykpOw0KPiA+ICsJCQlrZnJlZShz dHJpbmcpOw0KPiA+ICsJCQlpZiAobW50LT5uZnNfc2VydmVyLmFkZHJsZW4gPT0gMCkNCj4gPiAr CQkJCWdvdG8gb3V0X2ludmFsaWRfYWRkcmVzczsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2Fz ZSBPcHRfY2xpZW50YWRkcjoNCj4gPiArCQkJaWYgKG5mc19nZXRfb3B0aW9uX3N0cihhcmdzLCAm bW50LQ0KPiA+ID5jbGllbnRfYWRkcmVzcykpDQo+ID4gKwkJCQlnb3RvIG91dF9ub21lbTsNCj4g PiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfbW91bnRob3N0Og0KPiA+ICsJCQlpZiAobmZz X2dldF9vcHRpb25fc3RyKGFyZ3MsDQo+ID4gKwkJCQkJICAgICAgICZtbnQtDQo+ID4gPm1vdW50 X3NlcnZlci5ob3N0bmFtZSkpDQo+ID4gKwkJCQlnb3RvIG91dF9ub21lbTsNCj4gPiArCQkJYnJl YWs7DQo+ID4gKwkJY2FzZSBPcHRfbW91bnRhZGRyOg0KPiA+ICsJCQlzdHJpbmcgPSBtYXRjaF9z dHJkdXAoYXJncyk7DQo+ID4gKwkJCWlmIChzdHJpbmcgPT0gTlVMTCkNCj4gPiArCQkJCWdvdG8g b3V0X25vbWVtOw0KPiA+ICsJCQltbnQtPm1vdW50X3NlcnZlci5hZGRybGVuID0NCj4gPiArCQkJ CXJwY19wdG9uKG1udC0+bmV0LCBzdHJpbmcsDQo+ID4gc3RybGVuKHN0cmluZyksDQo+ID4gKwkJ CQkJKHN0cnVjdCBzb2NrYWRkciAqKQ0KPiA+ICsJCQkJCSZtbnQtPm1vdW50X3NlcnZlci5hZGRy ZXNzLA0KPiA+ICsJCQkJCXNpemVvZihtbnQtDQo+ID4gPm1vdW50X3NlcnZlci5hZGRyZXNzKSk7 DQo+ID4gKwkJCWtmcmVlKHN0cmluZyk7DQo+ID4gKwkJCWlmIChtbnQtPm1vdW50X3NlcnZlci5h ZGRybGVuID09IDApDQo+ID4gKwkJCQlnb3RvIG91dF9pbnZhbGlkX2FkZHJlc3M7DQo+ID4gKwkJ CWJyZWFrOw0KPiA+ICsJCWNhc2UgT3B0X25jb25uZWN0Og0KPiA+ICsJCQlpZiAobmZzX2dldF9v cHRpb25fdWxfYm91bmQoYXJncywgJm9wdGlvbiwgMSwNCj4gPiBORlNfTUFYX0NPTk5FQ1RJT05T KSkNCj4gPiArCQkJCWdvdG8gb3V0X2ludmFsaWRfdmFsdWU7DQo+ID4gKwkJCW1udC0+bmZzX3Nl cnZlci5uY29ubmVjdCA9IG9wdGlvbjsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRf bG9va3VwY2FjaGU6DQo+ID4gKwkJCXN0cmluZyA9IG1hdGNoX3N0cmR1cChhcmdzKTsNCj4gPiAr CQkJaWYgKHN0cmluZyA9PSBOVUxMKQ0KPiA+ICsJCQkJZ290byBvdXRfbm9tZW07DQo+ID4gKwkJ CXRva2VuID0gbWF0Y2hfdG9rZW4oc3RyaW5nLA0KPiA+ICsJCQkJCW5mc19sb29rdXBjYWNoZV90 b2tlbnMsIGFyZ3MpOw0KPiA+ICsJCQlrZnJlZShzdHJpbmcpOw0KPiA+ICsJCQlzd2l0Y2ggKHRv a2VuKSB7DQo+ID4gKwkJCQljYXNlIE9wdF9sb29rdXBjYWNoZV9hbGw6DQo+ID4gKwkJCQkJbW50 LT5mbGFncyAmPQ0KPiA+IH4oTkZTX01PVU5UX0xPT0tVUF9DQUNIRV9OT05FR3xORlNfTU9VTlRf TE9PS1VQX0NBQ0hFX05PTkUpOw0KPiA+ICsJCQkJCWJyZWFrOw0KPiA+ICsJCQkJY2FzZSBPcHRf bG9va3VwY2FjaGVfcG9zaXRpdmU6DQo+ID4gKwkJCQkJbW50LT5mbGFncyAmPQ0KPiA+IH5ORlNf TU9VTlRfTE9PS1VQX0NBQ0hFX05PTkU7DQo+ID4gKwkJCQkJbW50LT5mbGFncyB8PQ0KPiA+IE5G U19NT1VOVF9MT09LVVBfQ0FDSEVfTk9ORUc7DQo+ID4gKwkJCQkJYnJlYWs7DQo+ID4gKwkJCQlj YXNlIE9wdF9sb29rdXBjYWNoZV9ub25lOg0KPiA+ICsJCQkJCW1udC0+ZmxhZ3MgfD0NCj4gPiBO RlNfTU9VTlRfTE9PS1VQX0NBQ0hFX05PTkVHfE5GU19NT1VOVF9MT09LVVBfQ0FDSEVfTk9ORTsN Cj4gPiArCQkJCQlicmVhazsNCj4gPiArCQkJCWRlZmF1bHQ6DQo+ID4gKwkJCQkJZGZwcmludGso TU9VTlQsICJORlM6ICAgaW52YWxpZA0KPiA+ICINCj4gPiArCQkJCQkJCSJsb29rdXBjYWNoZQ0K PiA+IGFyZ3VtZW50XG4iKTsNCj4gPiArCQkJCQlyZXR1cm4gMDsNCj4gPiArCQkJfTsNCj4gPiAr CQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfZnNjYWNoZV91bmlxOg0KPiA+ICsJCQlpZiAobmZz X2dldF9vcHRpb25fc3RyKGFyZ3MsICZtbnQtDQo+ID4gPmZzY2FjaGVfdW5pcSkpDQo+ID4gKwkJ CQlnb3RvIG91dF9ub21lbTsNCj4gPiArCQkJbW50LT5vcHRpb25zIHw9IE5GU19PUFRJT05fRlND QUNIRTsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfbG9jYWxfbG9jazoNCj4gPiAr CQkJc3RyaW5nID0gbWF0Y2hfc3RyZHVwKGFyZ3MpOw0KPiA+ICsJCQlpZiAoc3RyaW5nID09IE5V TEwpDQo+ID4gKwkJCQlnb3RvIG91dF9ub21lbTsNCj4gPiArCQkJdG9rZW4gPSBtYXRjaF90b2tl bihzdHJpbmcsDQo+ID4gbmZzX2xvY2FsX2xvY2tfdG9rZW5zLA0KPiA+ICsJCQkJCWFyZ3MpOw0K PiA+ICsJCQlrZnJlZShzdHJpbmcpOw0KPiA+ICsJCQlzd2l0Y2ggKHRva2VuKSB7DQo+ID4gKwkJ CWNhc2UgT3B0X2xvY2FsX2xvY2tfYWxsOg0KPiA+ICsJCQkJbW50LT5mbGFncyB8PSAoTkZTX01P VU5UX0xPQ0FMX0ZMT0NLIHwNCj4gPiArCQkJCQkgICAgICAgTkZTX01PVU5UX0xPQ0FMX0ZDTlRM KTsNCj4gPiArCQkJCWJyZWFrOw0KPiA+ICsJCQljYXNlIE9wdF9sb2NhbF9sb2NrX2Zsb2NrOg0K PiA+ICsJCQkJbW50LT5mbGFncyB8PSBORlNfTU9VTlRfTE9DQUxfRkxPQ0s7DQo+ID4gKwkJCQli cmVhazsNCj4gPiArCQkJY2FzZSBPcHRfbG9jYWxfbG9ja19wb3NpeDoNCj4gPiArCQkJCW1udC0+ ZmxhZ3MgfD0gTkZTX01PVU5UX0xPQ0FMX0ZDTlRMOw0KPiA+ICsJCQkJYnJlYWs7DQo+ID4gKwkJ CWNhc2UgT3B0X2xvY2FsX2xvY2tfbm9uZToNCj4gPiArCQkJCW1udC0+ZmxhZ3MgJj0gfihORlNf TU9VTlRfTE9DQUxfRkxPQ0sgfA0KPiA+ICsJCQkJCQlORlNfTU9VTlRfTE9DQUxfRkNOVEwpOw0K PiA+ICsJCQkJYnJlYWs7DQo+ID4gKwkJCWRlZmF1bHQ6DQo+ID4gKwkJCQlkZnByaW50ayhNT1VO VCwgIk5GUzoJaW52YWxpZAkiDQo+ID4gKwkJCQkJCSJsb2NhbF9sb2NrDQo+ID4gYXJndW1lbnRc biIpOw0KPiA+ICsJCQkJcmV0dXJuIDA7DQo+ID4gKwkJCX07DQo+ID4gKwkJCWJyZWFrOw0KPiA+ ICsNCj4gPiArCQkvKg0KPiA+ICsJCSAqIFNwZWNpYWwgb3B0aW9ucw0KPiA+ICsJCSAqLw0KPiA+ ICsJCWNhc2UgT3B0X3Nsb3BweToNCj4gPiArCQkJc2xvcHB5ID0gMTsNCj4gPiArCQkJZGZwcmlu dGsoTU9VTlQsICJORlM6ICAgcmVsYXhpbmcgcGFyc2luZw0KPiA+IHJ1bGVzXG4iKTsNCj4gPiAr CQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBPcHRfdXNlcnNwYWNlOg0KPiA+ICsJCWNhc2UgT3B0X2Rl cHJlY2F0ZWQ6DQo+ID4gKwkJCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiAgIGlnbm9yaW5nIG1vdW50 IG9wdGlvbiAiDQo+ID4gKwkJCQkJIiclcydcbiIsIHApOw0KPiA+ICsJCQlicmVhazsNCj4gPiAr DQo+ID4gKwkJZGVmYXVsdDoNCj4gPiArCQkJaW52YWxpZF9vcHRpb24gPSAxOw0KPiA+ICsJCQlk ZnByaW50ayhNT1VOVCwgIk5GUzogICB1bnJlY29nbml6ZWQgbW91bnQNCj4gPiBvcHRpb24gIg0K PiA+ICsJCQkJCSInJXMnXG4iLCBwKTsNCj4gPiArCQl9DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJ aWYgKCFzbG9wcHkgJiYgaW52YWxpZF9vcHRpb24pDQo+ID4gKwkJcmV0dXJuIDA7DQo+ID4gKw0K PiA+ICsJaWYgKG1udC0+bWlub3J2ZXJzaW9uICYmIG1udC0+dmVyc2lvbiAhPSA0KQ0KPiA+ICsJ CWdvdG8gb3V0X21pbm9ydmVyc2lvbl9taXNtYXRjaDsNCj4gPiArDQo+ID4gKwlpZiAobW50LT5v cHRpb25zICYgTkZTX09QVElPTl9NSUdSQVRJT04gJiYNCj4gPiArCSAgICAobW50LT52ZXJzaW9u ICE9IDQgfHwgbW50LT5taW5vcnZlcnNpb24gIT0gMCkpDQo+ID4gKwkJZ290byBvdXRfbWlncmF0 aW9uX21pc3VzZTsNCj4gPiArDQo+ID4gKwkvKg0KPiA+ICsJICogdmVyaWZ5IHRoYXQgYW55IHBy b3RvPS9tb3VudHByb3RvPSBvcHRpb25zIG1hdGNoIHRoZSBhZGRyZXNzDQo+ID4gKwkgKiBmYW1p bGllcyBpbiB0aGUgYWRkcj0vbW91bnRhZGRyPSBvcHRpb25zLg0KPiA+ICsJICovDQo+ID4gKwlp ZiAocHJvdG9mYW1pbHkgIT0gQUZfVU5TUEVDICYmDQo+ID4gKwkgICAgcHJvdG9mYW1pbHkgIT0g bW50LT5uZnNfc2VydmVyLmFkZHJlc3Muc3NfZmFtaWx5KQ0KPiA+ICsJCWdvdG8gb3V0X3Byb3Rv X21pc21hdGNoOw0KPiA+ICsNCj4gPiArCWlmIChtb3VudGZhbWlseSAhPSBBRl9VTlNQRUMpIHsN Cj4gPiArCQlpZiAobW50LT5tb3VudF9zZXJ2ZXIuYWRkcmxlbikgew0KPiA+ICsJCQlpZiAobW91 bnRmYW1pbHkgIT0gbW50LQ0KPiA+ID5tb3VudF9zZXJ2ZXIuYWRkcmVzcy5zc19mYW1pbHkpDQo+ ID4gKwkJCQlnb3RvIG91dF9tb3VudHByb3RvX21pc21hdGNoOw0KPiA+ICsJCX0gZWxzZSB7DQo+ ID4gKwkJCWlmIChtb3VudGZhbWlseSAhPSBtbnQtDQo+ID4gPm5mc19zZXJ2ZXIuYWRkcmVzcy5z c19mYW1pbHkpDQo+ID4gKwkJCQlnb3RvIG91dF9tb3VudHByb3RvX21pc21hdGNoOw0KPiA+ICsJ CX0NCj4gPiArCX0NCj4gPiArDQo+ID4gKwlyZXR1cm4gMTsNCj4gPiArDQo+ID4gK291dF9tb3Vu dHByb3RvX21pc21hdGNoOg0KPiA+ICsJcHJpbnRrKEtFUk5fSU5GTyAiTkZTOiBtb3VudCBzZXJ2 ZXIgYWRkcmVzcyBkb2VzIG5vdCBtYXRjaA0KPiA+IG1vdW50cHJvdG89ICINCj4gPiArCQkJICJv cHRpb25cbiIpOw0KPiA+ICsJcmV0dXJuIDA7DQo+ID4gK291dF9wcm90b19taXNtYXRjaDoNCj4g PiArCXByaW50ayhLRVJOX0lORk8gIk5GUzogc2VydmVyIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2gg cHJvdG89DQo+ID4gb3B0aW9uXG4iKTsNCj4gPiArCXJldHVybiAwOw0KPiA+ICtvdXRfaW52YWxp ZF9hZGRyZXNzOg0KPiA+ICsJcHJpbnRrKEtFUk5fSU5GTyAiTkZTOiBiYWQgSVAgYWRkcmVzcyBz cGVjaWZpZWQ6ICVzXG4iLCBwKTsNCj4gPiArCXJldHVybiAwOw0KPiA+ICtvdXRfaW52YWxpZF92 YWx1ZToNCj4gPiArCXByaW50ayhLRVJOX0lORk8gIk5GUzogYmFkIG1vdW50IG9wdGlvbiB2YWx1 ZSBzcGVjaWZpZWQ6ICVzXG4iLA0KPiA+IHApOw0KPiA+ICsJcmV0dXJuIDA7DQo+ID4gK291dF9t aW5vcnZlcnNpb25fbWlzbWF0Y2g6DQo+ID4gKwlwcmludGsoS0VSTl9JTkZPICJORlM6IG1vdW50 IG9wdGlvbiB2ZXJzPSV1IGRvZXMgbm90IHN1cHBvcnQgIg0KPiA+ICsJCQkgIm1pbm9ydmVyc2lv bj0ldVxuIiwgbW50LT52ZXJzaW9uLCBtbnQtDQo+ID4gPm1pbm9ydmVyc2lvbik7DQo+ID4gKwly ZXR1cm4gMDsNCj4gPiArb3V0X21pZ3JhdGlvbl9taXN1c2U6DQo+ID4gKwlwcmludGsoS0VSTl9J TkZPDQo+ID4gKwkJIk5GUzogJ21pZ3JhdGlvbicgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBORlMN Cj4gPiB2ZXJzaW9uXG4iKTsNCj4gPiArCXJldHVybiAwOw0KPiA+ICtvdXRfbm9tZW06DQo+ID4g KwlwcmludGsoS0VSTl9JTkZPICJORlM6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBhcnNlIG9wdGlv blxuIik7DQo+ID4gKwlyZXR1cm4gMDsNCj4gPiArb3V0X3NlY3VyaXR5X2ZhaWx1cmU6DQo+ID4g KwlwcmludGsoS0VSTl9JTkZPICJORlM6IHNlY3VyaXR5IG9wdGlvbnMgaW52YWxpZDogJWRcbiIs IHJjKTsNCj4gPiArCXJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKg0KPiA+ICsgKiBT cGxpdCAiZGV2X25hbWUiIGludG8gImhvc3RuYW1lOmV4cG9ydF9wYXRoIi4NCj4gPiArICoNCj4g PiArICogVGhlIGxlZnRtb3N0IGNvbG9uIGRlbWFya3MgdGhlIHNwbGl0IGJldHdlZW4gdGhlIHNl cnZlcidzDQo+ID4gaG9zdG5hbWUNCj4gPiArICogYW5kIHRoZSBleHBvcnQgcGF0aC4gIElmIHRo ZSBob3N0bmFtZSBzdGFydHMgd2l0aCBhIGxlZnQgc3F1YXJlDQo+ID4gKyAqIGJyYWNrZXQsIHRo ZW4gaXQgbWF5IGNvbnRhaW4gY29sb25zLg0KPiA+ICsgKg0KPiA+ICsgKiBOb3RlOiBjYWxsZXIg ZnJlZXMgaG9zdG5hbWUgYW5kIGV4cG9ydCBwYXRoLCBldmVuIG9uIGVycm9yLg0KPiA+ICsgKi8N Cj4gPiArc3RhdGljIGludCBuZnNfcGFyc2VfZGV2bmFtZShjb25zdCBjaGFyICpkZXZfbmFtZSwN Cj4gPiArCQkJICAgICBjaGFyICoqaG9zdG5hbWUsIHNpemVfdCBtYXhuYW1sZW4sDQo+ID4gKwkJ CSAgICAgY2hhciAqKmV4cG9ydF9wYXRoLCBzaXplX3QgbWF4cGF0aGxlbikNCj4gPiArew0KPiA+ ICsJc2l6ZV90IGxlbjsNCj4gPiArCWNoYXIgKmVuZDsNCj4gPiArDQo+ID4gKwlpZiAodW5saWtl bHkoIWRldl9uYW1lIHx8ICEqZGV2X25hbWUpKSB7DQo+ID4gKwkJZGZwcmludGsoTU9VTlQsICJO RlM6IGRldmljZSBuYW1lIG5vdCBzcGVjaWZpZWRcbiIpOw0KPiA+ICsJCXJldHVybiAtRUlOVkFM Ow0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCS8qIElzIHRoZSBob3N0IG5hbWUgcHJvdGVjdGVkIHdp dGggc3F1YXJlIGJyYWtjZXRzPyAqLw0KPiA+ICsJaWYgKCpkZXZfbmFtZSA9PSAnWycpIHsNCj4g PiArCQllbmQgPSBzdHJjaHIoKytkZXZfbmFtZSwgJ10nKTsNCj4gPiArCQlpZiAoZW5kID09IE5V TEwgfHwgZW5kWzFdICE9ICc6JykNCj4gPiArCQkJZ290byBvdXRfYmFkX2Rldm5hbWU7DQo+ID4g Kw0KPiA+ICsJCWxlbiA9IGVuZCAtIGRldl9uYW1lOw0KPiA+ICsJCWVuZCsrOw0KPiA+ICsJfSBl bHNlIHsNCj4gPiArCQljaGFyICpjb21tYTsNCj4gPiArDQo+ID4gKwkJZW5kID0gc3RyY2hyKGRl dl9uYW1lLCAnOicpOw0KPiA+ICsJCWlmIChlbmQgPT0gTlVMTCkNCj4gPiArCQkJZ290byBvdXRf YmFkX2Rldm5hbWU7DQo+ID4gKwkJbGVuID0gZW5kIC0gZGV2X25hbWU7DQo+ID4gKw0KPiA+ICsJ CS8qIGtpbGwgcG9zc2libGUgaG9zdG5hbWUgbGlzdDogbm90IHN1cHBvcnRlZCAqLw0KPiA+ICsJ CWNvbW1hID0gc3RyY2hyKGRldl9uYW1lLCAnLCcpOw0KPiA+ICsJCWlmIChjb21tYSAhPSBOVUxM ICYmIGNvbW1hIDwgZW5kKQ0KPiA+ICsJCQlsZW4gPSBjb21tYSAtIGRldl9uYW1lOw0KPiA+ICsJ fQ0KPiA+ICsNCj4gPiArCWlmIChsZW4gPiBtYXhuYW1sZW4pDQo+ID4gKwkJZ290byBvdXRfaG9z dG5hbWU7DQo+ID4gKw0KPiA+ICsJLyogTi5CLiBjYWxsZXIgd2lsbCBmcmVlIG5mc19zZXJ2ZXIu aG9zdG5hbWUgaW4gYWxsIGNhc2VzICovDQo+ID4gKwkqaG9zdG5hbWUgPSBrc3RybmR1cChkZXZf bmFtZSwgbGVuLCBHRlBfS0VSTkVMKTsNCj4gPiArCWlmICgqaG9zdG5hbWUgPT0gTlVMTCkNCj4g PiArCQlnb3RvIG91dF9ub21lbTsNCj4gPiArCWxlbiA9IHN0cmxlbigrK2VuZCk7DQo+ID4gKwlp ZiAobGVuID4gbWF4cGF0aGxlbikNCj4gPiArCQlnb3RvIG91dF9wYXRoOw0KPiA+ICsJKmV4cG9y dF9wYXRoID0ga3N0cm5kdXAoZW5kLCBsZW4sIEdGUF9LRVJORUwpOw0KPiA+ICsJaWYgKCEqZXhw b3J0X3BhdGgpDQo+ID4gKwkJZ290byBvdXRfbm9tZW07DQo+ID4gKw0KPiA+ICsJZGZwcmludGso TU9VTlQsICJORlM6IE1OVFBBVEg6ICclcydcbiIsICpleHBvcnRfcGF0aCk7DQo+ID4gKwlyZXR1 cm4gMDsNCj4gPiArDQo+ID4gK291dF9iYWRfZGV2bmFtZToNCj4gPiArCWRmcHJpbnRrKE1PVU5U LCAiTkZTOiBkZXZpY2UgbmFtZSBub3QgaW4gaG9zdDpwYXRoIGZvcm1hdFxuIik7DQo+ID4gKwly ZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+ID4gK291dF9ub21lbToNCj4gPiArCWRmcHJpbnRrKE1P VU5ULCAiTkZTOiBub3QgZW5vdWdoIG1lbW9yeSB0byBwYXJzZSBkZXZpY2UNCj4gPiBuYW1lXG4i KTsNCj4gPiArCXJldHVybiAtRU5PTUVNOw0KPiA+ICsNCj4gPiArb3V0X2hvc3RuYW1lOg0KPiA+ ICsJZGZwcmludGsoTU9VTlQsICJORlM6IHNlcnZlciBob3N0bmFtZSB0b28gbG9uZ1xuIik7DQo+ ID4gKwlyZXR1cm4gLUVOQU1FVE9PTE9ORzsNCj4gPiArDQo+ID4gK291dF9wYXRoOg0KPiA+ICsJ ZGZwcmludGsoTU9VTlQsICJORlM6IGV4cG9ydCBwYXRobmFtZSB0b28gbG9uZ1xuIik7DQo+ID4g KwlyZXR1cm4gLUVOQU1FVE9PTE9ORzsNCj4gPiArfQ0KPiA+ICsNCj4gPiArLyoNCj4gPiArICog VmFsaWRhdGUgdGhlIE5GUzIvTkZTMyBtb3VudCBkYXRhDQo+ID4gKyAqIC0gZmlsbHMgaW4gdGhl IG1vdW50IHJvb3QgZmlsZWhhbmRsZQ0KPiA+ICsgKg0KPiA+ICsgKiBGb3Igb3B0aW9uIHN0cmlu Z3MsIHVzZXIgc3BhY2UgaGFuZGxlcyB0aGUgZm9sbG93aW5nIGJlaGF2aW9yczoNCj4gPiArICoN Cj4gPiArICogKyBETlM6IG1hcHBpbmcgc2VydmVyIGhvc3QgbmFtZSB0byBJUCBhZGRyZXNzICgi YWRkcj0iIG9wdGlvbikNCj4gPiArICoNCj4gPiArICogKyBmYWlsdXJlIG1vZGU6IGhvdyB0byBi ZWhhdmUgaWYgYSBtb3VudCByZXF1ZXN0IGNhbid0IGJlDQo+ID4gaGFuZGxlZA0KPiA+ICsgKiAg IGltbWVkaWF0ZWx5ICgiZmcvYmciIG9wdGlvbikNCj4gPiArICoNCj4gPiArICogKyByZXRyeTog aG93IG9mdGVuIHRvIHJldHJ5IGEgbW91bnQgcmVxdWVzdCAoInJldHJ5PSIgb3B0aW9uKQ0KPiA+ ICsgKg0KPiA+ICsgKiArIGJyZWFraW5nIGJhY2s6IHRyeWluZyBwcm90bz11ZHAgYWZ0ZXIgcHJv dG89dGNwLCB2MiBhZnRlciB2MywNCj4gPiArICogICBtb3VudHByb3RvPXRjcCBhZnRlciBtb3Vu dHByb3RvPXVkcCwgYW5kIHNvIG9uDQo+ID4gKyAqLw0KPiA+ICtzdGF0aWMgaW50IG5mczIzX3Zh bGlkYXRlX21vdW50X2RhdGEodm9pZCAqb3B0aW9ucywNCj4gPiArCQkJCSAgICAgc3RydWN0IG5m c19wYXJzZWRfbW91bnRfZGF0YQ0KPiA+ICphcmdzLA0KPiA+ICsJCQkJICAgICBzdHJ1Y3QgbmZz X2ZoICptbnRmaCwNCj4gPiArCQkJCSAgICAgY29uc3QgY2hhciAqZGV2X25hbWUpDQo+ID4gK3sN Cj4gPiArCXN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgbmZzX21vdW50X2Rh dGEgKilvcHRpb25zOw0KPiA+ICsJc3RydWN0IHNvY2thZGRyICpzYXAgPSAoc3RydWN0IHNvY2th ZGRyICopJmFyZ3MtDQo+ID4gPm5mc19zZXJ2ZXIuYWRkcmVzczsNCj4gPiArCWludCBleHRyYV9m bGFncyA9IE5GU19NT1VOVF9MRUdBQ1lfSU5URVJGQUNFOw0KPiA+ICsNCj4gPiArCWlmIChkYXRh ID09IE5VTEwpDQo+ID4gKwkJZ290byBvdXRfbm9fZGF0YTsNCj4gPiArDQo+ID4gKwlhcmdzLT52 ZXJzaW9uID0gTkZTX0RFRkFVTFRfVkVSU0lPTjsNCj4gPiArCXN3aXRjaCAoZGF0YS0+dmVyc2lv bikgew0KPiA+ICsJY2FzZSAxOg0KPiA+ICsJCWRhdGEtPm5hbWxlbiA9IDA7IC8qIGZhbGwgdGhy b3VnaCAqLw0KPiA+ICsJY2FzZSAyOg0KPiA+ICsJCWRhdGEtPmJzaXplID0gMDsgLyogZmFsbCB0 aHJvdWdoICovDQo+ID4gKwljYXNlIDM6DQo+ID4gKwkJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01P VU5UX1ZFUjMpDQo+ID4gKwkJCWdvdG8gb3V0X25vX3YzOw0KPiA+ICsJCWRhdGEtPnJvb3Quc2l6 ZSA9IE5GUzJfRkhTSVpFOw0KPiA+ICsJCW1lbWNweShkYXRhLT5yb290LmRhdGEsIGRhdGEtPm9s ZF9yb290LmRhdGEsDQo+ID4gTkZTMl9GSFNJWkUpOw0KPiA+ICsJCS8qIFR1cm4gb2ZmIHNlY3Vy aXR5IG5lZ290aWF0aW9uICovDQo+ID4gKwkJZXh0cmFfZmxhZ3MgfD0gTkZTX01PVU5UX1NFQ0ZM QVZPVVI7DQo+ID4gKwkJLyogZmFsbCB0aHJvdWdoICovDQo+ID4gKwljYXNlIDQ6DQo+ID4gKwkJ aWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1NFQ0ZMQVZPVVIpDQo+ID4gKwkJCWdvdG8gb3V0 X25vX3NlYzsNCj4gPiArCQkvKiBmYWxsIHRocm91Z2ggKi8NCj4gPiArCWNhc2UgNToNCj4gPiAr CQltZW1zZXQoZGF0YS0+Y29udGV4dCwgMCwgc2l6ZW9mKGRhdGEtPmNvbnRleHQpKTsNCj4gPiAr CQkvKiBmYWxsIHRocm91Z2ggKi8NCj4gPiArCWNhc2UgNjoNCj4gPiArCQlpZiAoZGF0YS0+Zmxh Z3MgJiBORlNfTU9VTlRfVkVSMykgew0KPiA+ICsJCQlpZiAoZGF0YS0+cm9vdC5zaXplID4gTkZT M19GSFNJWkUgfHwgZGF0YS0NCj4gPiA+cm9vdC5zaXplID09IDApDQo+ID4gKwkJCQlnb3RvIG91 dF9pbnZhbGlkX2ZoOw0KPiA+ICsJCQltbnRmaC0+c2l6ZSA9IGRhdGEtPnJvb3Quc2l6ZTsNCj4g PiArCQkJYXJncy0+dmVyc2lvbiA9IDM7DQo+ID4gKwkJfSBlbHNlIHsNCj4gPiArCQkJbW50Zmgt PnNpemUgPSBORlMyX0ZIU0laRTsNCj4gPiArCQkJYXJncy0+dmVyc2lvbiA9IDI7DQo+ID4gKwkJ fQ0KPiA+ICsNCj4gPiArDQo+ID4gKwkJbWVtY3B5KG1udGZoLT5kYXRhLCBkYXRhLT5yb290LmRh dGEsIG1udGZoLT5zaXplKTsNCj4gPiArCQlpZiAobW50ZmgtPnNpemUgPCBzaXplb2YobW50Zmgt PmRhdGEpKQ0KPiA+ICsJCQltZW1zZXQobW50ZmgtPmRhdGEgKyBtbnRmaC0+c2l6ZSwgMCwNCj4g PiArCQkJICAgICAgIHNpemVvZihtbnRmaC0+ZGF0YSkgLSBtbnRmaC0+c2l6ZSk7DQo+ID4gKw0K PiA+ICsJCS8qDQo+ID4gKwkJICogVHJhbnNsYXRlIHRvIG5mc19wYXJzZWRfbW91bnRfZGF0YSwg d2hpY2gNCj4gPiBuZnNfZmlsbF9zdXBlcg0KPiA+ICsJCSAqIGNhbiBkZWFsIHdpdGguDQo+ID4g KwkJICovDQo+ID4gKwkJYXJncy0+ZmxhZ3MJCT0gZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfRkxB R01BU0s7DQo+ID4gKwkJYXJncy0+ZmxhZ3MJCXw9IGV4dHJhX2ZsYWdzOw0KPiA+ICsJCWFyZ3Mt PnJzaXplCQk9IGRhdGEtPnJzaXplOw0KPiA+ICsJCWFyZ3MtPndzaXplCQk9IGRhdGEtPndzaXpl Ow0KPiA+ICsJCWFyZ3MtPnRpbWVvCQk9IGRhdGEtPnRpbWVvOw0KPiA+ICsJCWFyZ3MtPnJldHJh bnMJCT0gZGF0YS0+cmV0cmFuczsNCj4gPiArCQlhcmdzLT5hY3JlZ21pbgkJPSBkYXRhLT5hY3Jl Z21pbjsNCj4gPiArCQlhcmdzLT5hY3JlZ21heAkJPSBkYXRhLT5hY3JlZ21heDsNCj4gPiArCQlh cmdzLT5hY2Rpcm1pbgkJPSBkYXRhLT5hY2Rpcm1pbjsNCj4gPiArCQlhcmdzLT5hY2Rpcm1heAkJ PSBkYXRhLT5hY2Rpcm1heDsNCj4gPiArCQlhcmdzLT5uZWVkX21vdW50CT0gZmFsc2U7DQo+ID4g Kw0KPiA+ICsJCW1lbWNweShzYXAsICZkYXRhLT5hZGRyLCBzaXplb2YoZGF0YS0+YWRkcikpOw0K PiA+ICsJCWFyZ3MtPm5mc19zZXJ2ZXIuYWRkcmxlbiA9IHNpemVvZihkYXRhLT5hZGRyKTsNCj4g PiArCQlhcmdzLT5uZnNfc2VydmVyLnBvcnQgPSBudG9ocyhkYXRhLT5hZGRyLnNpbl9wb3J0KTsN Cj4gPiArCQlpZiAoc2FwLT5zYV9mYW1pbHkgIT0gQUZfSU5FVCB8fA0KPiA+ICsJCSAgICAhbmZz X3ZlcmlmeV9zZXJ2ZXJfYWRkcmVzcyhzYXApKQ0KPiA+ICsJCQlnb3RvIG91dF9ub19hZGRyZXNz Ow0KPiA+ICsNCj4gPiArCQlpZiAoIShkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9UQ1ApKQ0KPiA+ ICsJCQlhcmdzLT5uZnNfc2VydmVyLnByb3RvY29sID0gWFBSVF9UUkFOU1BPUlRfVURQOw0KPiA+ ICsJCS8qIE4uQi4gY2FsbGVyIHdpbGwgZnJlZSBuZnNfc2VydmVyLmhvc3RuYW1lIGluIGFsbA0K PiA+IGNhc2VzICovDQo+ID4gKwkJYXJncy0+bmZzX3NlcnZlci5ob3N0bmFtZSA9IGtzdHJkdXAo ZGF0YS0+aG9zdG5hbWUsDQo+ID4gR0ZQX0tFUk5FTCk7DQo+ID4gKwkJYXJncy0+bmFtbGVuCQk9 IGRhdGEtPm5hbWxlbjsNCj4gPiArCQlhcmdzLT5ic2l6ZQkJPSBkYXRhLT5ic2l6ZTsNCj4gPiAr DQo+ID4gKwkJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1NFQ0ZMQVZPVVIpDQo+ID4gKwkJ CWFyZ3MtPnNlbGVjdGVkX2ZsYXZvciA9IGRhdGEtPnBzZXVkb2ZsYXZvcjsNCj4gPiArCQllbHNl DQo+ID4gKwkJCWFyZ3MtPnNlbGVjdGVkX2ZsYXZvciA9IFJQQ19BVVRIX1VOSVg7DQo+ID4gKwkJ aWYgKCFhcmdzLT5uZnNfc2VydmVyLmhvc3RuYW1lKQ0KPiA+ICsJCQlnb3RvIG91dF9ub21lbTsN Cj4gPiArDQo+ID4gKwkJaWYgKCEoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfTk9OTE0pKQ0KPiA+ ICsJCQlhcmdzLT5mbGFncyAmPSB+KE5GU19NT1VOVF9MT0NBTF9GTE9DS3wNCj4gPiArCQkJCQkg TkZTX01PVU5UX0xPQ0FMX0ZDTlRMKTsNCj4gPiArCQllbHNlDQo+ID4gKwkJCWFyZ3MtPmZsYWdz IHw9IChORlNfTU9VTlRfTE9DQUxfRkxPQ0t8DQo+ID4gKwkJCQkJTkZTX01PVU5UX0xPQ0FMX0ZD TlRMKTsNCj4gPiArCQkvKg0KPiA+ICsJCSAqIFRoZSBsZWdhY3kgdmVyc2lvbiA2IGJpbmFyeSBt b3VudCBkYXRhIGZyb20NCj4gPiB1c2Vyc3BhY2UgaGFzIGENCj4gPiArCQkgKiBmaWVsZCB1c2Vk IG9ubHkgdG8gdHJhbnNwb3J0IHNlbGludXggaW5mb3JtYXRpb24NCj4gPiBpbnRvIHRoZQ0KPiA+ ICsJCSAqIHRoZSBrZXJuZWwuICBUbyBjb250aW51ZSB0byBzdXBwb3J0IHRoYXQNCj4gPiBmdW5j dGlvbmFsaXR5IHdlDQo+ID4gKwkJICogaGF2ZSBhIHRvdWNoIG9mIHNlbGludXgga25vd2xlZGdl IGhlcmUgaW4gdGhlIE5GUw0KPiA+IGNvZGUuIFRoZQ0KPiA+ICsJCSAqIHVzZXJzcGFjZSBjb2Rl IGNvbnZlcnRlZCBjb250ZXh0PWJsYWggdG8ganVzdCBibGFoDQo+ID4gc28gd2UgYXJlDQo+ID4g KwkJICogY29udmVydGluZyBiYWNrIHRvIHRoZSBmdWxsIHN0cmluZyBzZWxpbnV4DQo+ID4gdW5k ZXJzdGFuZHMuDQo+ID4gKwkJICovDQo+ID4gKwkJaWYgKGRhdGEtPmNvbnRleHRbMF0pew0KPiA+ ICsjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1NFTElOVVgNCj4gPiArCQkJaW50IHJjOw0KPiA+ICsJ CQlkYXRhLT5jb250ZXh0W05GU19NQVhfQ09OVEVYVF9MRU5dID0gJ1wwJzsNCj4gPiArCQkJcmMg PSBzZWN1cml0eV9hZGRfbW50X29wdCgiY29udGV4dCIsIGRhdGEtDQo+ID4gPmNvbnRleHQsDQo+ ID4gKwkJCQkJc3RybGVuKGRhdGEtPmNvbnRleHQpLCAmYXJncy0NCj4gPiA+bHNtX29wdHMpOw0K PiA+ICsJCQlpZiAocmMpDQo+ID4gKwkJCQlyZXR1cm4gcmM7DQo+ID4gKyNlbHNlDQo+ID4gKwkJ CXJldHVybiAtRUlOVkFMOw0KPiA+ICsjZW5kaWYNCj4gPiArCQl9DQo+ID4gKw0KPiA+ICsJCWJy ZWFrOw0KPiA+ICsJZGVmYXVsdDoNCj4gPiArCQlyZXR1cm4gTkZTX1RFWFRfREFUQTsNCj4gPiAr CX0NCj4gPiArDQo+ID4gKwlyZXR1cm4gMDsNCj4gPiArDQo+ID4gK291dF9ub19kYXRhOg0KPiA+ ICsJZGZwcmludGsoTU9VTlQsICJORlM6IG1vdW50IHByb2dyYW0gZGlkbid0IHBhc3MgYW55IG1v dW50DQo+ID4gZGF0YVxuIik7DQo+ID4gKwlyZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+ID4gK291 dF9ub192MzoNCj4gPiArCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBuZnNfbW91bnRfZGF0YSB2ZXJz aW9uICVkIGRvZXMgbm90DQo+ID4gc3VwcG9ydCB2M1xuIiwNCj4gPiArCQkgZGF0YS0+dmVyc2lv bik7DQo+ID4gKwlyZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+ID4gK291dF9ub19zZWM6DQo+ID4g KwlkZnByaW50ayhNT1VOVCwgIk5GUzogbmZzX21vdW50X2RhdGEgdmVyc2lvbiBzdXBwb3J0cyBv bmx5DQo+ID4gQVVUSF9TWVNcbiIpOw0KPiA+ICsJcmV0dXJuIC1FSU5WQUw7DQo+ID4gKw0KPiA+ ICtvdXRfbm9tZW06DQo+ID4gKwlkZnByaW50ayhNT1VOVCwgIk5GUzogbm90IGVub3VnaCBtZW1v cnkgdG8gaGFuZGxlIG1vdW50DQo+ID4gb3B0aW9uc1xuIik7DQo+ID4gKwlyZXR1cm4gLUVOT01F TTsNCj4gPiArDQo+ID4gK291dF9ub19hZGRyZXNzOg0KPiA+ICsJZGZwcmludGsoTU9VTlQsICJO RlM6IG1vdW50IHByb2dyYW0gZGlkbid0IHBhc3MgcmVtb3RlDQo+ID4gYWRkcmVzc1xuIik7DQo+ ID4gKwlyZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+ID4gK291dF9pbnZhbGlkX2ZoOg0KPiA+ICsJ ZGZwcmludGsoTU9VTlQsICJORlM6IGludmFsaWQgcm9vdCBmaWxlaGFuZGxlXG4iKTsNCj4gPiAr CXJldHVybiAtRUlOVkFMOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICsjaWYgSVNfRU5BQkxFRChDT05G SUdfTkZTX1Y0KQ0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQgbmZzNF92YWxpZGF0ZV9tb3VudF9m bGFncyhzdHJ1Y3QgbmZzX3BhcnNlZF9tb3VudF9kYXRhDQo+ID4gKmFyZ3MpDQo+ID4gK3sNCj4g PiArCWFyZ3MtPmZsYWdzICY9DQo+ID4gfihORlNfTU9VTlRfTk9OTE18TkZTX01PVU5UX05PQUNM fE5GU19NT1VOVF9WRVIzfA0KPiA+ICsJCQkgTkZTX01PVU5UX0xPQ0FMX0ZMT0NLfE5GU19NT1VO VF9MT0NBTF9GQ05UTCk7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qDQo+ID4gKyAqIFZhbGlkYXRl IE5GU3Y0IG1vdW50IG9wdGlvbnMNCj4gPiArICovDQo+ID4gK3N0YXRpYyBpbnQgbmZzNF92YWxp ZGF0ZV9tb3VudF9kYXRhKHZvaWQgKm9wdGlvbnMsDQo+ID4gKwkJCQkgICAgc3RydWN0IG5mc19w YXJzZWRfbW91bnRfZGF0YSAqYXJncywNCj4gPiArCQkJCSAgICBjb25zdCBjaGFyICpkZXZfbmFt ZSkNCj4gPiArew0KPiA+ICsJc3RydWN0IHNvY2thZGRyICpzYXAgPSAoc3RydWN0IHNvY2thZGRy ICopJmFyZ3MtDQo+ID4gPm5mc19zZXJ2ZXIuYWRkcmVzczsNCj4gPiArCXN0cnVjdCBuZnM0X21v dW50X2RhdGEgKmRhdGEgPSAoc3RydWN0IG5mczRfbW91bnRfZGF0YQ0KPiA+ICopb3B0aW9uczsN Cj4gPiArCWNoYXIgKmM7DQo+ID4gKw0KPiA+ICsJaWYgKGRhdGEgPT0gTlVMTCkNCj4gPiArCQln b3RvIG91dF9ub19kYXRhOw0KPiA+ICsNCj4gPiArCWFyZ3MtPnZlcnNpb24gPSA0Ow0KPiA+ICsN Cj4gPiArCXN3aXRjaCAoZGF0YS0+dmVyc2lvbikgew0KPiA+ICsJY2FzZSAxOg0KPiA+ICsJCWlm IChkYXRhLT5ob3N0X2FkZHJsZW4gPiBzaXplb2YoYXJncy0NCj4gPiA+bmZzX3NlcnZlci5hZGRy ZXNzKSkNCj4gPiArCQkJZ290byBvdXRfbm9fYWRkcmVzczsNCj4gPiArCQlpZiAoZGF0YS0+aG9z dF9hZGRybGVuID09IDApDQo+ID4gKwkJCWdvdG8gb3V0X25vX2FkZHJlc3M7DQo+ID4gKwkJYXJn cy0+bmZzX3NlcnZlci5hZGRybGVuID0gZGF0YS0+aG9zdF9hZGRybGVuOw0KPiA+ICsJCWlmIChj b3B5X2Zyb21fdXNlcihzYXAsIGRhdGEtPmhvc3RfYWRkciwgZGF0YS0NCj4gPiA+aG9zdF9hZGRy bGVuKSkNCj4gPiArCQkJcmV0dXJuIC1FRkFVTFQ7DQo+ID4gKwkJaWYgKCFuZnNfdmVyaWZ5X3Nl cnZlcl9hZGRyZXNzKHNhcCkpDQo+ID4gKwkJCWdvdG8gb3V0X25vX2FkZHJlc3M7DQo+ID4gKwkJ YXJncy0+bmZzX3NlcnZlci5wb3J0ID0gbnRvaHMoKChzdHJ1Y3Qgc29ja2FkZHJfaW4NCj4gPiAq KXNhcCktPnNpbl9wb3J0KTsNCj4gPiArDQo+ID4gKwkJaWYgKGRhdGEtPmF1dGhfZmxhdm91cmxl bikgew0KPiA+ICsJCQlycGNfYXV0aGZsYXZvcl90IHBzZXVkb2ZsYXZvcjsNCj4gPiArCQkJaWYg KGRhdGEtPmF1dGhfZmxhdm91cmxlbiA+IDEpDQo+ID4gKwkJCQlnb3RvIG91dF9pbnZhbF9hdXRo Ow0KPiA+ICsJCQlpZiAoY29weV9mcm9tX3VzZXIoJnBzZXVkb2ZsYXZvciwNCj4gPiArCQkJCQkg ICBkYXRhLT5hdXRoX2ZsYXZvdXJzLA0KPiA+ICsJCQkJCSAgIHNpemVvZihwc2V1ZG9mbGF2b3Ip KSkNCj4gPiArCQkJCXJldHVybiAtRUZBVUxUOw0KPiA+ICsJCQlhcmdzLT5zZWxlY3RlZF9mbGF2 b3IgPSBwc2V1ZG9mbGF2b3I7DQo+ID4gKwkJfSBlbHNlDQo+ID4gKwkJCWFyZ3MtPnNlbGVjdGVk X2ZsYXZvciA9IFJQQ19BVVRIX1VOSVg7DQo+ID4gKw0KPiA+ICsJCWMgPSBzdHJuZHVwX3VzZXIo ZGF0YS0+aG9zdG5hbWUuZGF0YSwgTkZTNF9NQVhOQU1MRU4pOw0KPiA+ICsJCWlmIChJU19FUlIo YykpDQo+ID4gKwkJCXJldHVybiBQVFJfRVJSKGMpOw0KPiA+ICsJCWFyZ3MtPm5mc19zZXJ2ZXIu aG9zdG5hbWUgPSBjOw0KPiA+ICsNCj4gPiArCQljID0gc3RybmR1cF91c2VyKGRhdGEtPm1udF9w YXRoLmRhdGEsIE5GUzRfTUFYUEFUSExFTik7DQo+ID4gKwkJaWYgKElTX0VSUihjKSkNCj4gPiAr CQkJcmV0dXJuIFBUUl9FUlIoYyk7DQo+ID4gKwkJYXJncy0+bmZzX3NlcnZlci5leHBvcnRfcGF0 aCA9IGM7DQo+ID4gKwkJZGZwcmludGsoTU9VTlQsICJORlM6IE1OVFBBVEg6ICclcydcbiIsIGMp Ow0KPiA+ICsNCj4gPiArCQljID0gc3RybmR1cF91c2VyKGRhdGEtPmNsaWVudF9hZGRyLmRhdGEs IDE2KTsNCj4gPiArCQlpZiAoSVNfRVJSKGMpKQ0KPiA+ICsJCQlyZXR1cm4gUFRSX0VSUihjKTsN Cj4gPiArCQlhcmdzLT5jbGllbnRfYWRkcmVzcyA9IGM7DQo+ID4gKw0KPiA+ICsJCS8qDQo+ID4g KwkJICogVHJhbnNsYXRlIHRvIG5mc19wYXJzZWRfbW91bnRfZGF0YSwgd2hpY2gNCj4gPiBuZnM0 X2ZpbGxfc3VwZXINCj4gPiArCQkgKiBjYW4gZGVhbCB3aXRoLg0KPiA+ICsJCSAqLw0KPiA+ICsN Cj4gPiArCQlhcmdzLT5mbGFncwk9IGRhdGEtPmZsYWdzICYgTkZTNF9NT1VOVF9GTEFHTUFTSzsN Cj4gPiArCQlhcmdzLT5yc2l6ZQk9IGRhdGEtPnJzaXplOw0KPiA+ICsJCWFyZ3MtPndzaXplCT0g ZGF0YS0+d3NpemU7DQo+ID4gKwkJYXJncy0+dGltZW8JPSBkYXRhLT50aW1lbzsNCj4gPiArCQlh cmdzLT5yZXRyYW5zCT0gZGF0YS0+cmV0cmFuczsNCj4gPiArCQlhcmdzLT5hY3JlZ21pbgk9IGRh dGEtPmFjcmVnbWluOw0KPiA+ICsJCWFyZ3MtPmFjcmVnbWF4CT0gZGF0YS0+YWNyZWdtYXg7DQo+ ID4gKwkJYXJncy0+YWNkaXJtaW4JPSBkYXRhLT5hY2Rpcm1pbjsNCj4gPiArCQlhcmdzLT5hY2Rp cm1heAk9IGRhdGEtPmFjZGlybWF4Ow0KPiA+ICsJCWFyZ3MtPm5mc19zZXJ2ZXIucHJvdG9jb2wg PSBkYXRhLT5wcm90bzsNCj4gPiArCQluZnNfdmFsaWRhdGVfdHJhbnNwb3J0X3Byb3RvY29sKGFy Z3MpOw0KPiA+ICsJCWlmIChhcmdzLT5uZnNfc2VydmVyLnByb3RvY29sID09IFhQUlRfVFJBTlNQ T1JUX1VEUCkNCj4gPiArCQkJZ290byBvdXRfaW52YWxpZF90cmFuc3BvcnRfdWRwOw0KPiA+ICsN Cj4gPiArCQlicmVhazsNCj4gPiArCWRlZmF1bHQ6DQo+ID4gKwkJcmV0dXJuIE5GU19URVhUX0RB VEE7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJcmV0dXJuIDA7DQo+ID4gKw0KPiA+ICtvdXRfbm9f ZGF0YToNCj4gPiArCWRmcHJpbnRrKE1PVU5ULCAiTkZTNDogbW91bnQgcHJvZ3JhbSBkaWRuJ3Qg cGFzcyBhbnkgbW91bnQNCj4gPiBkYXRhXG4iKTsNCj4gPiArCXJldHVybiAtRUlOVkFMOw0KPiA+ ICsNCj4gPiArb3V0X2ludmFsX2F1dGg6DQo+ID4gKwlkZnByaW50ayhNT1VOVCwgIk5GUzQ6IElu dmFsaWQgbnVtYmVyIG9mIFJQQyBhdXRoIGZsYXZvdXJzDQo+ID4gJWRcbiIsDQo+ID4gKwkJIGRh dGEtPmF1dGhfZmxhdm91cmxlbik7DQo+ID4gKwlyZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+ID4g K291dF9ub19hZGRyZXNzOg0KPiA+ICsJZGZwcmludGsoTU9VTlQsICJORlM0OiBtb3VudCBwcm9n cmFtIGRpZG4ndCBwYXNzIHJlbW90ZQ0KPiA+IGFkZHJlc3NcbiIpOw0KPiA+ICsJcmV0dXJuIC1F SU5WQUw7DQo+ID4gKw0KPiA+ICtvdXRfaW52YWxpZF90cmFuc3BvcnRfdWRwOg0KPiA+ICsJZGZw cmludGsoTU9VTlQsICJORlN2NDogVW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHByb3RvY29sIHVkcFxu Iik7DQo+ID4gKwlyZXR1cm4gLUVJTlZBTDsNCj4gPiArfQ0KPiA+ICsNCj4gPiAraW50IG5mc192 YWxpZGF0ZV9tb3VudF9kYXRhKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLA0KPiA+ ICsJCQkgICAgdm9pZCAqb3B0aW9ucywNCj4gPiArCQkJICAgIHN0cnVjdCBuZnNfcGFyc2VkX21v dW50X2RhdGEgKmFyZ3MsDQo+ID4gKwkJCSAgICBzdHJ1Y3QgbmZzX2ZoICptbnRmaCwNCj4gPiAr CQkJICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lKQ0KPiA+ICt7DQo+ID4gKwlpZiAoZnNfdHlwZSA9 PSAmbmZzX2ZzX3R5cGUpDQo+ID4gKwkJcmV0dXJuIG5mczIzX3ZhbGlkYXRlX21vdW50X2RhdGEo b3B0aW9ucywgYXJncywgbW50ZmgsDQo+ID4gZGV2X25hbWUpOw0KPiA+ICsJcmV0dXJuIG5mczRf dmFsaWRhdGVfbW91bnRfZGF0YShvcHRpb25zLCBhcmdzLCBkZXZfbmFtZSk7DQo+ID4gK30NCj4g PiArI2Vsc2UNCj4gPiAraW50IG5mc192YWxpZGF0ZV9tb3VudF9kYXRhKHN0cnVjdCBmaWxlX3N5 c3RlbV90eXBlICpmc190eXBlLA0KPiA+ICsJCQkgICAgdm9pZCAqb3B0aW9ucywNCj4gPiArCQkJ ICAgIHN0cnVjdCBuZnNfcGFyc2VkX21vdW50X2RhdGEgKmFyZ3MsDQo+ID4gKwkJCSAgICBzdHJ1 Y3QgbmZzX2ZoICptbnRmaCwNCj4gPiArCQkJICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lKQ0KPiA+ ICt7DQo+ID4gKwlyZXR1cm4gbmZzMjNfdmFsaWRhdGVfbW91bnRfZGF0YShvcHRpb25zLCBhcmdz LCBtbnRmaCwNCj4gPiBkZXZfbmFtZSk7DQo+ID4gK30NCj4gPiArI2VuZGlmDQo+ID4gKw0KPiA+ ICtpbnQgbmZzX3ZhbGlkYXRlX3RleHRfbW91bnRfZGF0YSh2b2lkICpvcHRpb25zLA0KPiA+ICsJ CQkJIHN0cnVjdCBuZnNfcGFyc2VkX21vdW50X2RhdGEgKmFyZ3MsDQo+ID4gKwkJCQkgY29uc3Qg Y2hhciAqZGV2X25hbWUpDQo+ID4gK3sNCj4gPiArCWludCBwb3J0ID0gMDsNCj4gPiArCWludCBt YXhfbmFtZWxlbiA9IFBBR0VfU0laRTsNCj4gPiArCWludCBtYXhfcGF0aGxlbiA9IE5GU19NQVhQ QVRITEVOOw0KPiA+ICsJc3RydWN0IHNvY2thZGRyICpzYXAgPSAoc3RydWN0IHNvY2thZGRyICop JmFyZ3MtDQo+ID4gPm5mc19zZXJ2ZXIuYWRkcmVzczsNCj4gPiArDQo+ID4gKwlpZiAobmZzX3Bh cnNlX21vdW50X29wdGlvbnMoKGNoYXIgKilvcHRpb25zLCBhcmdzKSA9PSAwKQ0KPiA+ICsJCXJl dHVybiAtRUlOVkFMOw0KPiA+ICsNCj4gPiArCWlmICghbmZzX3ZlcmlmeV9zZXJ2ZXJfYWRkcmVz cyhzYXApKQ0KPiA+ICsJCWdvdG8gb3V0X25vX2FkZHJlc3M7DQo+ID4gKw0KPiA+ICsJaWYgKGFy Z3MtPnZlcnNpb24gPT0gNCkgew0KPiA+ICsjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZTX1Y0KQ0K PiA+ICsJCWlmIChhcmdzLT5uZnNfc2VydmVyLnByb3RvY29sID09IFhQUlRfVFJBTlNQT1JUX1JE TUEpDQo+ID4gKwkJCXBvcnQgPSBORlNfUkRNQV9QT1JUOw0KPiA+ICsJCWVsc2UNCj4gPiArCQkJ cG9ydCA9IE5GU19QT1JUOw0KPiA+ICsJCW1heF9uYW1lbGVuID0gTkZTNF9NQVhOQU1MRU47DQo+ ID4gKwkJbWF4X3BhdGhsZW4gPSBORlM0X01BWFBBVEhMRU47DQo+ID4gKwkJbmZzX3ZhbGlkYXRl X3RyYW5zcG9ydF9wcm90b2NvbChhcmdzKTsNCj4gPiArCQlpZiAoYXJncy0+bmZzX3NlcnZlci5w cm90b2NvbCA9PSBYUFJUX1RSQU5TUE9SVF9VRFApDQo+ID4gKwkJCWdvdG8gb3V0X2ludmFsaWRf dHJhbnNwb3J0X3VkcDsNCj4gPiArCQluZnM0X3ZhbGlkYXRlX21vdW50X2ZsYWdzKGFyZ3MpOw0K PiA+ICsjZWxzZQ0KPiA+ICsJCWdvdG8gb3V0X3Y0X25vdF9jb21waWxlZDsNCj4gPiArI2VuZGlm IC8qIENPTkZJR19ORlNfVjQgKi8NCj4gPiArCX0gZWxzZSB7DQo+ID4gKwkJbmZzX3NldF9tb3Vu dF90cmFuc3BvcnRfcHJvdG9jb2woYXJncyk7DQo+ID4gKwkJaWYgKGFyZ3MtPm5mc19zZXJ2ZXIu cHJvdG9jb2wgPT0gWFBSVF9UUkFOU1BPUlRfUkRNQSkNCj4gPiArCQkJcG9ydCA9IE5GU19SRE1B X1BPUlQ7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJbmZzX3NldF9wb3J0KHNhcCwgJmFyZ3MtPm5m c19zZXJ2ZXIucG9ydCwgcG9ydCk7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIG5mc19wYXJzZV9kZXZu YW1lKGRldl9uYW1lLA0KPiA+ICsJCQkJICAgJmFyZ3MtPm5mc19zZXJ2ZXIuaG9zdG5hbWUsDQo+ ID4gKwkJCQkgICBtYXhfbmFtZWxlbiwNCj4gPiArCQkJCSAgICZhcmdzLT5uZnNfc2VydmVyLmV4 cG9ydF9wYXRoLA0KPiA+ICsJCQkJICAgbWF4X3BhdGhsZW4pOw0KPiA+ICsNCj4gPiArI2lmICFJ U19FTkFCTEVEKENPTkZJR19ORlNfVjQpDQo+ID4gK291dF92NF9ub3RfY29tcGlsZWQ6DQo+ID4g KwlkZnByaW50ayhNT1VOVCwgIk5GUzogTkZTdjQgaXMgbm90IGNvbXBpbGVkIGludG8ga2VybmVs XG4iKTsNCj4gPiArCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOw0KPiA+ICsjZWxzZQ0KPiA+ICtv dXRfaW52YWxpZF90cmFuc3BvcnRfdWRwOg0KPiA+ICsJZGZwcmludGsoTU9VTlQsICJORlN2NDog VW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHByb3RvY29sIHVkcFxuIik7DQo+ID4gKwlyZXR1cm4gLUVJ TlZBTDsNCj4gPiArI2VuZGlmIC8qICFDT05GSUdfTkZTX1Y0ICovDQo+ID4gKw0KPiA+ICtvdXRf bm9fYWRkcmVzczoNCj4gPiArCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBtb3VudCBwcm9ncmFtIGRp ZG4ndCBwYXNzIHJlbW90ZQ0KPiA+IGFkZHJlc3NcbiIpOw0KPiA+ICsJcmV0dXJuIC1FSU5WQUw7 DQo+ID4gK30NCj4gPiBkaWZmIC0tZ2l0IGEvZnMvbmZzL2ludGVybmFsLmggYi9mcy9uZnMvaW50 ZXJuYWwuaA0KPiA+IGluZGV4IGQ1MTJlYzM5NDU1OS4uYjY2ZmQzNTk5M2IzIDEwMDY0NA0KPiA+ IC0tLSBhL2ZzL25mcy9pbnRlcm5hbC5oDQo+ID4gKysrIGIvZnMvbmZzL2ludGVybmFsLmgNCj4g PiBAQCAtNyw2ICs3LDcgQEANCj4gPiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4NCj4gPiAjaW5j bHVkZSA8bGludXgvc2VjdXJpdHkuaD4NCj4gPiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4NCj4g PiArI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9hZGRyLmg+DQo+ID4gI2luY2x1ZGUgPGxpbnV4L25m c19wYWdlLmg+DQo+ID4gI2luY2x1ZGUgPGxpbnV4L3dhaXRfYml0Lmg+DQo+ID4gDQo+ID4gQEAg LTIzMiw2ICsyMzMsMjIgQEAgZXh0ZXJuIGNvbnN0IHN0cnVjdCBzdmNfdmVyc2lvbg0KPiA+IG5m czRfY2FsbGJhY2tfdmVyc2lvbjE7DQo+ID4gZXh0ZXJuIGNvbnN0IHN0cnVjdCBzdmNfdmVyc2lv biBuZnM0X2NhbGxiYWNrX3ZlcnNpb240Ow0KPiA+IA0KPiA+IHN0cnVjdCBuZnNfcGFnZWlvX2Rl c2NyaXB0b3I7DQo+ID4gKw0KPiA+ICsvKiBtb3VudC5jICovDQo+ID4gKyNkZWZpbmUgTkZTX1RF WFRfREFUQQkJMQ0KPiA+ICsNCj4gPiArZXh0ZXJuIHN0cnVjdCBuZnNfcGFyc2VkX21vdW50X2Rh dGENCj4gPiAqbmZzX2FsbG9jX3BhcnNlZF9tb3VudF9kYXRhKHZvaWQpOw0KPiA+ICtleHRlcm4g dm9pZCBuZnNfZnJlZV9wYXJzZWRfbW91bnRfZGF0YShzdHJ1Y3QNCj4gPiBuZnNfcGFyc2VkX21v dW50X2RhdGEgKmRhdGEpOw0KPiA+ICtleHRlcm4gaW50IG5mc19wYXJzZV9tb3VudF9vcHRpb25z KGNoYXIgKnJhdywgc3RydWN0DQo+ID4gbmZzX3BhcnNlZF9tb3VudF9kYXRhICptbnQpOw0KPiA+ ICtleHRlcm4gaW50IG5mc192YWxpZGF0ZV9tb3VudF9kYXRhKHN0cnVjdCBmaWxlX3N5c3RlbV90 eXBlDQo+ID4gKmZzX3R5cGUsDQo+ID4gKwkJCQkgICB2b2lkICpvcHRpb25zLA0KPiA+ICsJCQkJ ICAgc3RydWN0IG5mc19wYXJzZWRfbW91bnRfZGF0YSAqYXJncywNCj4gPiArCQkJCSAgIHN0cnVj dCBuZnNfZmggKm1udGZoLA0KPiA+ICsJCQkJICAgY29uc3QgY2hhciAqZGV2X25hbWUpOw0KPiA+ ICtleHRlcm4gaW50IG5mc192YWxpZGF0ZV90ZXh0X21vdW50X2RhdGEodm9pZCAqb3B0aW9ucywN Cj4gPiArCQkJCQlzdHJ1Y3QgbmZzX3BhcnNlZF9tb3VudF9kYXRhDQo+ID4gKmFyZ3MsDQo+ID4g KwkJCQkJY29uc3QgY2hhciAqZGV2X25hbWUpOw0KPiA+ICsNCj4gPiAvKiBwYWdlbGlzdC5jICov DQo+ID4gZXh0ZXJuIGludCBfX2luaXQgbmZzX2luaXRfbmZzcGFnZWNhY2hlKHZvaWQpOw0KPiA+ IGV4dGVybiB2b2lkIG5mc19kZXN0cm95X25mc3BhZ2VjYWNoZSh2b2lkKTsNCj4gPiBAQCAtNzYz LDMgKzc4MCwxNSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgbmZzX2Vycm9yX2lzX2ZhdGFsKGludCBl cnIpDQo+ID4gCX0NCj4gPiB9DQo+ID4gDQo+ID4gKy8qDQo+ID4gKyAqIFNlbGVjdCBiZXR3ZWVu IGEgZGVmYXVsdCBwb3J0IHZhbHVlIGFuZCBhIHVzZXItc3BlY2lmaWVkIHBvcnQNCj4gPiB2YWx1 ZS4NCj4gPiArICogSWYgYSB6ZXJvIHZhbHVlIGlzIHNldCwgdGhlbiBhdXRvYmluZCB3aWxsIGJl IHVzZWQuDQo+ID4gKyAqLw0KPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQgbmZzX3NldF9wb3J0KHN0 cnVjdCBzb2NrYWRkciAqc2FwLCBpbnQgKnBvcnQsDQo+ID4gKwkJCQljb25zdCB1bnNpZ25lZCBz aG9ydCBkZWZhdWx0X3BvcnQpDQo+ID4gK3sNCj4gPiArCWlmICgqcG9ydCA9PSBORlNfVU5TUEVD X1BPUlQpDQo+ID4gKwkJKnBvcnQgPSBkZWZhdWx0X3BvcnQ7DQo+ID4gKw0KPiA+ICsJcnBjX3Nl dF9wb3J0KHNhcCwgKnBvcnQpOw0KPiA+ICt9DQo+ID4gZGlmZiAtLWdpdCBhL2ZzL25mcy9zdXBl ci5jIGIvZnMvbmZzL3N1cGVyLmMNCj4gPiBpbmRleCBkODcwMmU1N2Y3ZmMuLjg4NjIyMGQyZGE0 ZSAxMDA2NDQNCj4gPiAtLS0gYS9mcy9uZnMvc3VwZXIuYw0KPiA+ICsrKyBiL2ZzL25mcy9zdXBl ci5jDQo+ID4gQEAgLTY5LDIyOSArNjksNiBAQA0KPiA+ICNpbmNsdWRlICJuZnMuaCINCj4gPiAN Cj4gPiAjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1ZGUw0KPiA+IC0jZGVmaW5lIE5G U19URVhUX0RBVEEJCTENCj4gPiAtDQo+ID4gLSNpZiBJU19FTkFCTEVEKENPTkZJR19ORlNfVjMp DQo+ID4gLSNkZWZpbmUgTkZTX0RFRkFVTFRfVkVSU0lPTiAzDQo+ID4gLSNlbHNlDQo+ID4gLSNk ZWZpbmUgTkZTX0RFRkFVTFRfVkVSU0lPTiAyDQo+ID4gLSNlbmRpZg0KPiA+IC0NCj4gPiAtI2Rl ZmluZSBORlNfTUFYX0NPTk5FQ1RJT05TIDE2DQo+ID4gLQ0KPiA+IC1lbnVtIHsNCj4gPiAtCS8q IE1vdW50IG9wdGlvbnMgdGhhdCB0YWtlIG5vIGFyZ3VtZW50cyAqLw0KPiA+IC0JT3B0X3NvZnQs IE9wdF9zb2Z0ZXJyLCBPcHRfaGFyZCwNCj4gPiAtCU9wdF9wb3NpeCwgT3B0X25vcG9zaXgsDQo+ ID4gLQlPcHRfY3RvLCBPcHRfbm9jdG8sDQo+ID4gLQlPcHRfYWMsIE9wdF9ub2FjLA0KPiA+IC0J T3B0X2xvY2ssIE9wdF9ub2xvY2ssDQo+ID4gLQlPcHRfdWRwLCBPcHRfdGNwLCBPcHRfcmRtYSwN Cj4gPiAtCU9wdF9hY2wsIE9wdF9ub2FjbCwNCj4gPiAtCU9wdF9yZGlycGx1cywgT3B0X25vcmRp cnBsdXMsDQo+ID4gLQlPcHRfc2hhcmVjYWNoZSwgT3B0X25vc2hhcmVjYWNoZSwNCj4gPiAtCU9w dF9yZXN2cG9ydCwgT3B0X25vcmVzdnBvcnQsDQo+ID4gLQlPcHRfZnNjYWNoZSwgT3B0X25vZnNj YWNoZSwNCj4gPiAtCU9wdF9taWdyYXRpb24sIE9wdF9ub21pZ3JhdGlvbiwNCj4gPiAtDQo+ID4g LQkvKiBNb3VudCBvcHRpb25zIHRoYXQgdGFrZSBpbnRlZ2VyIGFyZ3VtZW50cyAqLw0KPiA+IC0J T3B0X3BvcnQsDQo+ID4gLQlPcHRfcnNpemUsIE9wdF93c2l6ZSwgT3B0X2JzaXplLA0KPiA+IC0J T3B0X3RpbWVvLCBPcHRfcmV0cmFucywNCj4gPiAtCU9wdF9hY3JlZ21pbiwgT3B0X2FjcmVnbWF4 LA0KPiA+IC0JT3B0X2FjZGlybWluLCBPcHRfYWNkaXJtYXgsDQo+ID4gLQlPcHRfYWN0aW1lbywN Cj4gPiAtCU9wdF9uYW1lbGVuLA0KPiA+IC0JT3B0X21vdW50cG9ydCwNCj4gPiAtCU9wdF9tb3Vu dHZlcnMsDQo+ID4gLQlPcHRfbWlub3J2ZXJzaW9uLA0KPiA+IC0NCj4gPiAtCS8qIE1vdW50IG9w dGlvbnMgdGhhdCB0YWtlIHN0cmluZyBhcmd1bWVudHMgKi8NCj4gPiAtCU9wdF9uZnN2ZXJzLA0K PiA+IC0JT3B0X3NlYywgT3B0X3Byb3RvLCBPcHRfbW91bnRwcm90bywgT3B0X21vdW50aG9zdCwN Cj4gPiAtCU9wdF9hZGRyLCBPcHRfbW91bnRhZGRyLCBPcHRfY2xpZW50YWRkciwNCj4gPiAtCU9w dF9uY29ubmVjdCwNCj4gPiAtCU9wdF9sb29rdXBjYWNoZSwNCj4gPiAtCU9wdF9mc2NhY2hlX3Vu aXEsDQo+ID4gLQlPcHRfbG9jYWxfbG9jaywNCj4gPiAtDQo+ID4gLQkvKiBTcGVjaWFsIG1vdW50 IG9wdGlvbnMgKi8NCj4gPiAtCU9wdF91c2Vyc3BhY2UsIE9wdF9kZXByZWNhdGVkLCBPcHRfc2xv cHB5LA0KPiA+IC0NCj4gPiAtCU9wdF9lcnINCj4gPiAtfTsNCj4gPiAtDQo+ID4gLXN0YXRpYyBj b25zdCBtYXRjaF90YWJsZV90IG5mc19tb3VudF9vcHRpb25fdG9rZW5zID0gew0KPiA+IC0JeyBP cHRfdXNlcnNwYWNlLCAiYmciIH0sDQo+ID4gLQl7IE9wdF91c2Vyc3BhY2UsICJmZyIgfSwNCj4g PiAtCXsgT3B0X3VzZXJzcGFjZSwgInJldHJ5PSVzIiB9LA0KPiA+IC0NCj4gPiAtCXsgT3B0X3Ns b3BweSwgInNsb3BweSIgfSwNCj4gPiAtDQo+ID4gLQl7IE9wdF9zb2Z0LCAic29mdCIgfSwNCj4g PiAtCXsgT3B0X3NvZnRlcnIsICJzb2Z0ZXJyIiB9LA0KPiA+IC0JeyBPcHRfaGFyZCwgImhhcmQi IH0sDQo+ID4gLQl7IE9wdF9kZXByZWNhdGVkLCAiaW50ciIgfSwNCj4gPiAtCXsgT3B0X2RlcHJl Y2F0ZWQsICJub2ludHIiIH0sDQo+ID4gLQl7IE9wdF9wb3NpeCwgInBvc2l4IiB9LA0KPiA+IC0J eyBPcHRfbm9wb3NpeCwgIm5vcG9zaXgiIH0sDQo+ID4gLQl7IE9wdF9jdG8sICJjdG8iIH0sDQo+ ID4gLQl7IE9wdF9ub2N0bywgIm5vY3RvIiB9LA0KPiA+IC0JeyBPcHRfYWMsICJhYyIgfSwNCj4g PiAtCXsgT3B0X25vYWMsICJub2FjIiB9LA0KPiA+IC0JeyBPcHRfbG9jaywgImxvY2siIH0sDQo+ ID4gLQl7IE9wdF9ub2xvY2ssICJub2xvY2siIH0sDQo+ID4gLQl7IE9wdF91ZHAsICJ1ZHAiIH0s DQo+ID4gLQl7IE9wdF90Y3AsICJ0Y3AiIH0sDQo+ID4gLQl7IE9wdF9yZG1hLCAicmRtYSIgfSwN Cj4gPiAtCXsgT3B0X2FjbCwgImFjbCIgfSwNCj4gPiAtCXsgT3B0X25vYWNsLCAibm9hY2wiIH0s DQo+ID4gLQl7IE9wdF9yZGlycGx1cywgInJkaXJwbHVzIiB9LA0KPiA+IC0JeyBPcHRfbm9yZGly cGx1cywgIm5vcmRpcnBsdXMiIH0sDQo+ID4gLQl7IE9wdF9zaGFyZWNhY2hlLCAic2hhcmVjYWNo ZSIgfSwNCj4gPiAtCXsgT3B0X25vc2hhcmVjYWNoZSwgIm5vc2hhcmVjYWNoZSIgfSwNCj4gPiAt CXsgT3B0X3Jlc3Zwb3J0LCAicmVzdnBvcnQiIH0sDQo+ID4gLQl7IE9wdF9ub3Jlc3Zwb3J0LCAi bm9yZXN2cG9ydCIgfSwNCj4gPiAtCXsgT3B0X2ZzY2FjaGUsICJmc2MiIH0sDQo+ID4gLQl7IE9w dF9ub2ZzY2FjaGUsICJub2ZzYyIgfSwNCj4gPiAtCXsgT3B0X21pZ3JhdGlvbiwgIm1pZ3JhdGlv biIgfSwNCj4gPiAtCXsgT3B0X25vbWlncmF0aW9uLCAibm9taWdyYXRpb24iIH0sDQo+ID4gLQ0K PiA+IC0JeyBPcHRfcG9ydCwgInBvcnQ9JXMiIH0sDQo+ID4gLQl7IE9wdF9yc2l6ZSwgInJzaXpl PSVzIiB9LA0KPiA+IC0JeyBPcHRfd3NpemUsICJ3c2l6ZT0lcyIgfSwNCj4gPiAtCXsgT3B0X2Jz aXplLCAiYnNpemU9JXMiIH0sDQo+ID4gLQl7IE9wdF90aW1lbywgInRpbWVvPSVzIiB9LA0KPiA+ IC0JeyBPcHRfcmV0cmFucywgInJldHJhbnM9JXMiIH0sDQo+ID4gLQl7IE9wdF9hY3JlZ21pbiwg ImFjcmVnbWluPSVzIiB9LA0KPiA+IC0JeyBPcHRfYWNyZWdtYXgsICJhY3JlZ21heD0lcyIgfSwN Cj4gPiAtCXsgT3B0X2FjZGlybWluLCAiYWNkaXJtaW49JXMiIH0sDQo+ID4gLQl7IE9wdF9hY2Rp cm1heCwgImFjZGlybWF4PSVzIiB9LA0KPiA+IC0JeyBPcHRfYWN0aW1lbywgImFjdGltZW89JXMi IH0sDQo+ID4gLQl7IE9wdF9uYW1lbGVuLCAibmFtbGVuPSVzIiB9LA0KPiA+IC0JeyBPcHRfbW91 bnRwb3J0LCAibW91bnRwb3J0PSVzIiB9LA0KPiA+IC0JeyBPcHRfbW91bnR2ZXJzLCAibW91bnR2 ZXJzPSVzIiB9LA0KPiA+IC0JeyBPcHRfbWlub3J2ZXJzaW9uLCAibWlub3J2ZXJzaW9uPSVzIiB9 LA0KPiA+IC0NCj4gPiAtCXsgT3B0X25mc3ZlcnMsICJuZnN2ZXJzPSVzIiB9LA0KPiA+IC0JeyBP cHRfbmZzdmVycywgInZlcnM9JXMiIH0sDQo+ID4gLQ0KPiA+IC0JeyBPcHRfc2VjLCAic2VjPSVz IiB9LA0KPiA+IC0JeyBPcHRfcHJvdG8sICJwcm90bz0lcyIgfSwNCj4gPiAtCXsgT3B0X21vdW50 cHJvdG8sICJtb3VudHByb3RvPSVzIiB9LA0KPiA+IC0JeyBPcHRfYWRkciwgImFkZHI9JXMiIH0s DQo+ID4gLQl7IE9wdF9jbGllbnRhZGRyLCAiY2xpZW50YWRkcj0lcyIgfSwNCj4gPiAtCXsgT3B0 X21vdW50aG9zdCwgIm1vdW50aG9zdD0lcyIgfSwNCj4gPiAtCXsgT3B0X21vdW50YWRkciwgIm1v dW50YWRkcj0lcyIgfSwNCj4gPiAtDQo+ID4gLQl7IE9wdF9uY29ubmVjdCwgIm5jb25uZWN0PSVz IiB9LA0KPiA+IC0NCj4gPiAtCXsgT3B0X2xvb2t1cGNhY2hlLCAibG9va3VwY2FjaGU9JXMiIH0s DQo+ID4gLQl7IE9wdF9mc2NhY2hlX3VuaXEsICJmc2M9JXMiIH0sDQo+ID4gLQl7IE9wdF9sb2Nh bF9sb2NrLCAibG9jYWxfbG9jaz0lcyIgfSwNCj4gPiAtDQo+ID4gLQkvKiBUaGUgZm9sbG93aW5n IG5lZWRzIHRvIGJlIGxpc3RlZCBhZnRlciBhbGwgb3RoZXIgb3B0aW9ucyAqLw0KPiA+IC0JeyBP cHRfbmZzdmVycywgInYlcyIgfSwNCj4gPiAtDQo+ID4gLQl7IE9wdF9lcnIsIE5VTEwgfQ0KPiA+ IC19Ow0KPiA+IC0NCj4gPiAtZW51bSB7DQo+ID4gLQlPcHRfeHBydF91ZHAsIE9wdF94cHJ0X3Vk cDYsIE9wdF94cHJ0X3RjcCwgT3B0X3hwcnRfdGNwNiwNCj4gPiBPcHRfeHBydF9yZG1hLA0KPiA+ IC0JT3B0X3hwcnRfcmRtYTYsDQo+ID4gLQ0KPiA+IC0JT3B0X3hwcnRfZXJyDQo+ID4gLX07DQo+ ID4gLQ0KPiA+IC1zdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCBuZnNfeHBydF9wcm90b2NvbF90 b2tlbnMgPSB7DQo+ID4gLQl7IE9wdF94cHJ0X3VkcCwgInVkcCIgfSwNCj4gPiAtCXsgT3B0X3hw cnRfdWRwNiwgInVkcDYiIH0sDQo+ID4gLQl7IE9wdF94cHJ0X3RjcCwgInRjcCIgfSwNCj4gPiAt CXsgT3B0X3hwcnRfdGNwNiwgInRjcDYiIH0sDQo+ID4gLQl7IE9wdF94cHJ0X3JkbWEsICJyZG1h IiB9LA0KPiA+IC0JeyBPcHRfeHBydF9yZG1hNiwgInJkbWE2IiB9LA0KPiA+IC0NCj4gPiAtCXsg T3B0X3hwcnRfZXJyLCBOVUxMIH0NCj4gPiAtfTsNCj4gPiAtDQo+ID4gLWVudW0gew0KPiA+IC0J T3B0X3NlY19ub25lLCBPcHRfc2VjX3N5cywNCj4gPiAtCU9wdF9zZWNfa3JiNSwgT3B0X3NlY19r cmI1aSwgT3B0X3NlY19rcmI1cCwNCj4gPiAtCU9wdF9zZWNfbGtleSwgT3B0X3NlY19sa2V5aSwg T3B0X3NlY19sa2V5cCwNCj4gPiAtCU9wdF9zZWNfc3BrbSwgT3B0X3NlY19zcGttaSwgT3B0X3Nl Y19zcGttcCwNCj4gPiAtDQo+ID4gLQlPcHRfc2VjX2Vycg0KPiA+IC19Ow0KPiA+IC0NCj4gPiAt c3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgbmZzX3NlY2ZsYXZvcl90b2tlbnMgPSB7DQo+ID4g LQl7IE9wdF9zZWNfbm9uZSwgIm5vbmUiIH0sDQo+ID4gLQl7IE9wdF9zZWNfbm9uZSwgIm51bGwi IH0sDQo+ID4gLQl7IE9wdF9zZWNfc3lzLCAic3lzIiB9LA0KPiA+IC0NCj4gPiAtCXsgT3B0X3Nl Y19rcmI1LCAia3JiNSIgfSwNCj4gPiAtCXsgT3B0X3NlY19rcmI1aSwgImtyYjVpIiB9LA0KPiA+ IC0JeyBPcHRfc2VjX2tyYjVwLCAia3JiNXAiIH0sDQo+ID4gLQ0KPiA+IC0JeyBPcHRfc2VjX2xr ZXksICJsa2V5IiB9LA0KPiA+IC0JeyBPcHRfc2VjX2xrZXlpLCAibGtleWkiIH0sDQo+ID4gLQl7 IE9wdF9zZWNfbGtleXAsICJsa2V5cCIgfSwNCj4gPiAtDQo+ID4gLQl7IE9wdF9zZWNfc3BrbSwg InNwa20zIiB9LA0KPiA+IC0JeyBPcHRfc2VjX3Nwa21pLCAic3BrbTNpIiB9LA0KPiA+IC0JeyBP cHRfc2VjX3Nwa21wLCAic3BrbTNwIiB9LA0KPiA+IC0NCj4gPiAtCXsgT3B0X3NlY19lcnIsIE5V TEwgfQ0KPiA+IC19Ow0KPiA+IC0NCj4gPiAtZW51bSB7DQo+ID4gLQlPcHRfbG9va3VwY2FjaGVf YWxsLCBPcHRfbG9va3VwY2FjaGVfcG9zaXRpdmUsDQo+ID4gLQlPcHRfbG9va3VwY2FjaGVfbm9u ZSwNCj4gPiAtDQo+ID4gLQlPcHRfbG9va3VwY2FjaGVfZXJyDQo+ID4gLX07DQo+ID4gLQ0KPiA+ IC1zdGF0aWMgbWF0Y2hfdGFibGVfdCBuZnNfbG9va3VwY2FjaGVfdG9rZW5zID0gew0KPiA+IC0J eyBPcHRfbG9va3VwY2FjaGVfYWxsLCAiYWxsIiB9LA0KPiA+IC0JeyBPcHRfbG9va3VwY2FjaGVf cG9zaXRpdmUsICJwb3MiIH0sDQo+ID4gLQl7IE9wdF9sb29rdXBjYWNoZV9wb3NpdGl2ZSwgInBv c2l0aXZlIiB9LA0KPiA+IC0JeyBPcHRfbG9va3VwY2FjaGVfbm9uZSwgIm5vbmUiIH0sDQo+ID4g LQ0KPiA+IC0JeyBPcHRfbG9va3VwY2FjaGVfZXJyLCBOVUxMIH0NCj4gPiAtfTsNCj4gPiAtDQo+ ID4gLWVudW0gew0KPiA+IC0JT3B0X2xvY2FsX2xvY2tfYWxsLCBPcHRfbG9jYWxfbG9ja19mbG9j aywgT3B0X2xvY2FsX2xvY2tfcG9zaXgsDQo+ID4gLQlPcHRfbG9jYWxfbG9ja19ub25lLA0KPiA+ IC0NCj4gPiAtCU9wdF9sb2NhbF9sb2NrX2Vycg0KPiA+IC19Ow0KPiA+IC0NCj4gPiAtc3RhdGlj IG1hdGNoX3RhYmxlX3QgbmZzX2xvY2FsX2xvY2tfdG9rZW5zID0gew0KPiA+IC0JeyBPcHRfbG9j YWxfbG9ja19hbGwsICJhbGwiIH0sDQo+ID4gLQl7IE9wdF9sb2NhbF9sb2NrX2Zsb2NrLCAiZmxv Y2siIH0sDQo+ID4gLQl7IE9wdF9sb2NhbF9sb2NrX3Bvc2l4LCAicG9zaXgiIH0sDQo+ID4gLQl7 IE9wdF9sb2NhbF9sb2NrX25vbmUsICJub25lIiB9LA0KPiA+IC0NCj4gPiAtCXsgT3B0X2xvY2Fs X2xvY2tfZXJyLCBOVUxMIH0NCj4gPiAtfTsNCj4gPiAtDQo+ID4gLWVudW0gew0KPiA+IC0JT3B0 X3ZlcnNfMiwgT3B0X3ZlcnNfMywgT3B0X3ZlcnNfNCwgT3B0X3ZlcnNfNF8wLA0KPiA+IC0JT3B0 X3ZlcnNfNF8xLCBPcHRfdmVyc180XzIsDQo+ID4gLQ0KPiA+IC0JT3B0X3ZlcnNfZXJyDQo+ID4g LX07DQo+ID4gLQ0KPiA+IC1zdGF0aWMgbWF0Y2hfdGFibGVfdCBuZnNfdmVyc190b2tlbnMgPSB7 DQo+ID4gLQl7IE9wdF92ZXJzXzIsICIyIiB9LA0KPiA+IC0JeyBPcHRfdmVyc18zLCAiMyIgfSwN Cj4gPiAtCXsgT3B0X3ZlcnNfNCwgIjQiIH0sDQo+ID4gLQl7IE9wdF92ZXJzXzRfMCwgIjQuMCIg fSwNCj4gPiAtCXsgT3B0X3ZlcnNfNF8xLCAiNC4xIiB9LA0KPiA+IC0JeyBPcHRfdmVyc180XzIs ICI0LjIiIH0sDQo+ID4gLQ0KPiA+IC0JeyBPcHRfdmVyc19lcnIsIE5VTEwgfQ0KPiA+IC19Ow0K PiA+IA0KPiA+IHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpuZnNfcHJlcGFyZWRfbW91bnQoc3RydWN0 IGZpbGVfc3lzdGVtX3R5cGUNCj4gPiAqZnNfdHlwZSwNCj4gPiAJCWludCBmbGFncywgY29uc3Qg Y2hhciAqZGV2X25hbWUsIHZvaWQgKnJhd19kYXRhKTsNCj4gPiBAQCAtMzMyLDEwICsxMDksNiBA QCBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBuZnNfc29wcyA9IHsNCj4gPiBFWFBPUlRf U1lNQk9MX0dQTChuZnNfc29wcyk7DQo+ID4gDQo+ID4gI2lmIElTX0VOQUJMRUQoQ09ORklHX05G U19WNCkNCj4gPiAtc3RhdGljIHZvaWQgbmZzNF92YWxpZGF0ZV9tb3VudF9mbGFncyhzdHJ1Y3Qg bmZzX3BhcnNlZF9tb3VudF9kYXRhDQo+ID4gKik7DQo+ID4gLXN0YXRpYyBpbnQgbmZzNF92YWxp ZGF0ZV9tb3VudF9kYXRhKHZvaWQgKm9wdGlvbnMsDQo+ID4gLQlzdHJ1Y3QgbmZzX3BhcnNlZF9t b3VudF9kYXRhICphcmdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSk7DQo+ID4gLQ0KPiA+IHN0cnVj dCBmaWxlX3N5c3RlbV90eXBlIG5mczRfZnNfdHlwZSA9IHsNCj4gPiAJLm93bmVyCQk9IFRISVNf TU9EVUxFLA0KPiA+IAkubmFtZQkJPSAibmZzNCIsDQo+ID4gQEAgLTkzMiwxNDEgKzcwNSw2IEBA IHZvaWQgbmZzX3Vtb3VudF9iZWdpbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQ0KPiA+IH0NCj4g PiBFWFBPUlRfU1lNQk9MX0dQTChuZnNfdW1vdW50X2JlZ2luKTsNCj4gPiANCj4gPiAtc3RhdGlj IHN0cnVjdCBuZnNfcGFyc2VkX21vdW50X2RhdGENCj4gPiAqbmZzX2FsbG9jX3BhcnNlZF9tb3Vu dF9kYXRhKHZvaWQpDQo+ID4gLXsNCj4gPiAtCXN0cnVjdCBuZnNfcGFyc2VkX21vdW50X2RhdGEg KmRhdGE7DQo+ID4gLQ0KPiA+IC0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tF Uk5FTCk7DQo+ID4gLQlpZiAoZGF0YSkgew0KPiA+IC0JCWRhdGEtPnRpbWVvCQk9IE5GU19VTlNQ RUNfVElNRU87DQo+ID4gLQkJZGF0YS0+cmV0cmFucwkJPSBORlNfVU5TUEVDX1JFVFJBTlM7DQo+ ID4gLQkJZGF0YS0+YWNyZWdtaW4JCT0gTkZTX0RFRl9BQ1JFR01JTjsNCj4gPiAtCQlkYXRhLT5h Y3JlZ21heAkJPSBORlNfREVGX0FDUkVHTUFYOw0KPiA+IC0JCWRhdGEtPmFjZGlybWluCQk9IE5G U19ERUZfQUNESVJNSU47DQo+ID4gLQkJZGF0YS0+YWNkaXJtYXgJCT0gTkZTX0RFRl9BQ0RJUk1B WDsNCj4gPiAtCQlkYXRhLT5tb3VudF9zZXJ2ZXIucG9ydAk9IE5GU19VTlNQRUNfUE9SVDsNCj4g PiAtCQlkYXRhLT5uZnNfc2VydmVyLnBvcnQJPSBORlNfVU5TUEVDX1BPUlQ7DQo+ID4gLQkJZGF0 YS0+bmZzX3NlcnZlci5wcm90b2NvbCA9IFhQUlRfVFJBTlNQT1JUX1RDUDsNCj4gPiAtCQlkYXRh LT5zZWxlY3RlZF9mbGF2b3IJPSBSUENfQVVUSF9NQVhGTEFWT1I7DQo+ID4gLQkJZGF0YS0+bWlu b3J2ZXJzaW9uCT0gMDsNCj4gPiAtCQlkYXRhLT5uZWVkX21vdW50CT0gdHJ1ZTsNCj4gPiAtCQlk YXRhLT5uZXQJCT0gY3VycmVudC0+bnNwcm94eS0+bmV0X25zOw0KPiA+IC0JCWRhdGEtPmxzbV9v cHRzCQk9IE5VTEw7DQo+ID4gLQl9DQo+ID4gLQlyZXR1cm4gZGF0YTsNCj4gPiAtfQ0KPiA+IC0N Cj4gPiAtc3RhdGljIHZvaWQgbmZzX2ZyZWVfcGFyc2VkX21vdW50X2RhdGEoc3RydWN0DQo+ID4g bmZzX3BhcnNlZF9tb3VudF9kYXRhICpkYXRhKQ0KPiA+IC17DQo+ID4gLQlpZiAoZGF0YSkgew0K PiA+IC0JCWtmcmVlKGRhdGEtPmNsaWVudF9hZGRyZXNzKTsNCj4gPiAtCQlrZnJlZShkYXRhLT5t b3VudF9zZXJ2ZXIuaG9zdG5hbWUpOw0KPiA+IC0JCWtmcmVlKGRhdGEtPm5mc19zZXJ2ZXIuZXhw b3J0X3BhdGgpOw0KPiA+IC0JCWtmcmVlKGRhdGEtPm5mc19zZXJ2ZXIuaG9zdG5hbWUpOw0KPiA+ IC0JCWtmcmVlKGRhdGEtPmZzY2FjaGVfdW5pcSk7DQo+ID4gLQkJc2VjdXJpdHlfZnJlZV9tbnRf b3B0cygmZGF0YS0+bHNtX29wdHMpOw0KPiA+IC0JCWtmcmVlKGRhdGEpOw0KPiA+IC0JfQ0KPiA+ IC19DQo+ID4gLQ0KPiA+IC0vKg0KPiA+IC0gKiBTYW5pdHktY2hlY2sgYSBzZXJ2ZXIgYWRkcmVz cyBwcm92aWRlZCBieSB0aGUgbW91bnQgY29tbWFuZC4NCj4gPiAtICoNCj4gPiAtICogQWRkcmVz cyBmYW1pbHkgbXVzdCBiZSBpbml0aWFsaXplZCwgYW5kIGFkZHJlc3MgbXVzdCBub3QgYmUNCj4g PiAtICogdGhlIEFOWSBhZGRyZXNzIGZvciB0aGF0IGZhbWlseS4NCj4gPiAtICovDQo+ID4gLXN0 YXRpYyBpbnQgbmZzX3ZlcmlmeV9zZXJ2ZXJfYWRkcmVzcyhzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIp DQo+ID4gLXsNCj4gPiAtCXN3aXRjaCAoYWRkci0+c2FfZmFtaWx5KSB7DQo+ID4gLQljYXNlIEFG X0lORVQ6IHsNCj4gPiAtCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhID0gKHN0cnVjdCBzb2NrYWRk cl9pbiAqKWFkZHI7DQo+ID4gLQkJcmV0dXJuIHNhLT5zaW5fYWRkci5zX2FkZHIgIT0gaHRvbmwo SU5BRERSX0FOWSk7DQo+ID4gLQl9DQo+ID4gLQljYXNlIEFGX0lORVQ2OiB7DQo+ID4gLQkJc3Ry dWN0IGluNl9hZGRyICpzYSA9ICYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyKS0NCj4gPiA+ c2luNl9hZGRyOw0KPiA+IC0JCXJldHVybiAhaXB2Nl9hZGRyX2FueShzYSk7DQo+ID4gLQl9DQo+ ID4gLQl9DQo+ID4gLQ0KPiA+IC0JZGZwcmludGsoTU9VTlQsICJORlM6IEludmFsaWQgSVAgYWRk cmVzcyBzcGVjaWZpZWRcbiIpOw0KPiA+IC0JcmV0dXJuIDA7DQo+ID4gLX0NCj4gPiAtDQo+ID4g LS8qDQo+ID4gLSAqIFNlbGVjdCBiZXR3ZWVuIGEgZGVmYXVsdCBwb3J0IHZhbHVlIGFuZCBhIHVz ZXItc3BlY2lmaWVkIHBvcnQNCj4gPiB2YWx1ZS4NCj4gPiAtICogSWYgYSB6ZXJvIHZhbHVlIGlz IHNldCwgdGhlbiBhdXRvYmluZCB3aWxsIGJlIHVzZWQuDQo+ID4gLSAqLw0KPiA+IC1zdGF0aWMg dm9pZCBuZnNfc2V0X3BvcnQoc3RydWN0IHNvY2thZGRyICpzYXAsIGludCAqcG9ydCwNCj4gPiAt CQkJCSBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZWZhdWx0X3BvcnQpDQo+ID4gLXsNCj4gPiAtCWlm ICgqcG9ydCA9PSBORlNfVU5TUEVDX1BPUlQpDQo+ID4gLQkJKnBvcnQgPSBkZWZhdWx0X3BvcnQ7 DQo+ID4gLQ0KPiA+IC0JcnBjX3NldF9wb3J0KHNhcCwgKnBvcnQpOw0KPiA+IC19DQo+ID4gLQ0K PiA+IC0vKg0KPiA+IC0gKiBTYW5pdHkgY2hlY2sgdGhlIE5GUyB0cmFuc3BvcnQgcHJvdG9jb2wu DQo+ID4gLSAqDQo+ID4gLSAqLw0KPiA+IC1zdGF0aWMgdm9pZCBuZnNfdmFsaWRhdGVfdHJhbnNw b3J0X3Byb3RvY29sKHN0cnVjdA0KPiA+IG5mc19wYXJzZWRfbW91bnRfZGF0YSAqbW50KQ0KPiA+ IC17DQo+ID4gLQlzd2l0Y2ggKG1udC0+bmZzX3NlcnZlci5wcm90b2NvbCkgew0KPiA+IC0JY2Fz ZSBYUFJUX1RSQU5TUE9SVF9VRFA6DQo+ID4gLQljYXNlIFhQUlRfVFJBTlNQT1JUX1RDUDoNCj4g PiAtCWNhc2UgWFBSVF9UUkFOU1BPUlRfUkRNQToNCj4gPiAtCQlicmVhazsNCj4gPiAtCWRlZmF1 bHQ6DQo+ID4gLQkJbW50LT5uZnNfc2VydmVyLnByb3RvY29sID0gWFBSVF9UUkFOU1BPUlRfVENQ Ow0KPiA+IC0JfQ0KPiA+IC19DQo+ID4gLQ0KPiA+IC0vKg0KPiA+IC0gKiBGb3IgdGV4dCBiYXNl ZCBORlN2Mi92MyBtb3VudHMsIHRoZSBtb3VudCBwcm90b2NvbCB0cmFuc3BvcnQNCj4gPiBkZWZh dWx0DQo+ID4gLSAqIHNldHRpbmdzIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUgc3BlY2lmaWVkIE5G UyB0cmFuc3BvcnQuDQo+ID4gLSAqLw0KPiA+IC1zdGF0aWMgdm9pZCBuZnNfc2V0X21vdW50X3Ry YW5zcG9ydF9wcm90b2NvbChzdHJ1Y3QNCj4gPiBuZnNfcGFyc2VkX21vdW50X2RhdGEgKm1udCkN Cj4gPiAtew0KPiA+IC0JbmZzX3ZhbGlkYXRlX3RyYW5zcG9ydF9wcm90b2NvbChtbnQpOw0KPiA+ IC0NCj4gPiAtCWlmIChtbnQtPm1vdW50X3NlcnZlci5wcm90b2NvbCA9PSBYUFJUX1RSQU5TUE9S VF9VRFAgfHwNCj4gPiAtCSAgICBtbnQtPm1vdW50X3NlcnZlci5wcm90b2NvbCA9PSBYUFJUX1RS QU5TUE9SVF9UQ1ApDQo+ID4gLQkJCXJldHVybjsNCj4gPiAtCXN3aXRjaCAobW50LT5uZnNfc2Vy dmVyLnByb3RvY29sKSB7DQo+ID4gLQljYXNlIFhQUlRfVFJBTlNQT1JUX1VEUDoNCj4gPiAtCQlt bnQtPm1vdW50X3NlcnZlci5wcm90b2NvbCA9IFhQUlRfVFJBTlNQT1JUX1VEUDsNCj4gPiAtCQli cmVhazsNCj4gPiAtCWNhc2UgWFBSVF9UUkFOU1BPUlRfVENQOg0KPiA+IC0JY2FzZSBYUFJUX1RS QU5TUE9SVF9SRE1BOg0KPiA+IC0JCW1udC0+bW91bnRfc2VydmVyLnByb3RvY29sID0gWFBSVF9U UkFOU1BPUlRfVENQOw0KPiA+IC0JfQ0KPiA+IC19DQo+ID4gLQ0KPiA+IC0vKg0KPiA+IC0gKiBB ZGQgJ2ZsYXZvcicgdG8gJ2F1dGhfaW5mbycgaWYgbm90IGFscmVhZHkgcHJlc2VudC4NCj4gPiAt ICogUmV0dXJucyB0cnVlIGlmICdmbGF2b3InIGVuZHMgdXAgaW4gdGhlIGxpc3QsIGZhbHNlIG90 aGVyd2lzZQ0KPiA+IC0gKi8NCj4gPiAtc3RhdGljIGJvb2wgbmZzX2F1dGhfaW5mb19hZGQoc3Ry dWN0IG5mc19hdXRoX2luZm8gKmF1dGhfaW5mbywNCj4gPiAtCQkJICAgICAgcnBjX2F1dGhmbGF2 b3JfdCBmbGF2b3IpDQo+ID4gLXsNCj4gPiAtCXVuc2lnbmVkIGludCBpOw0KPiA+IC0JdW5zaWdu ZWQgaW50IG1heF9mbGF2b3JfbGVuID0gQVJSQVlfU0laRShhdXRoX2luZm8tPmZsYXZvcnMpOw0K PiA+IC0NCj4gPiAtCS8qIG1ha2Ugc3VyZSB0aGlzIGZsYXZvciBpc24ndCBhbHJlYWR5IGluIHRo ZSBsaXN0ICovDQo+ID4gLQlmb3IgKGkgPSAwOyBpIDwgYXV0aF9pbmZvLT5mbGF2b3JfbGVuOyBp KyspIHsNCj4gPiAtCQlpZiAoZmxhdm9yID09IGF1dGhfaW5mby0+Zmxhdm9yc1tpXSkNCj4gPiAt CQkJcmV0dXJuIHRydWU7DQo+ID4gLQl9DQo+ID4gLQ0KPiA+IC0JaWYgKGF1dGhfaW5mby0+Zmxh dm9yX2xlbiArIDEgPj0gbWF4X2ZsYXZvcl9sZW4pIHsNCj4gPiAtCQlkZnByaW50ayhNT1VOVCwg Ik5GUzogdG9vIG1hbnkgc2VjPSBmbGF2b3JzXG4iKTsNCj4gPiAtCQlyZXR1cm4gZmFsc2U7DQo+ ID4gLQl9DQo+ID4gLQ0KPiA+IC0JYXV0aF9pbmZvLT5mbGF2b3JzW2F1dGhfaW5mby0+Zmxhdm9y X2xlbisrXSA9IGZsYXZvcjsNCj4gPiAtCXJldHVybiB0cnVlOw0KPiA+IC19DQo+ID4gLQ0KPiA+ IC8qDQo+ID4gICogUmV0dXJuIHRydWUgaWYgJ21hdGNoJyBpcyBpbiBhdXRoX2luZm8gb3IgYXV0 aF9pbmZvIGlzIGVtcHR5Lg0KPiA+ICAqIFJldHVybiBmYWxzZSBvdGhlcndpc2UuDQo+ID4gQEAg LTEwODcsNjI3ICs3MjUsNiBAQCBib29sIG5mc19hdXRoX2luZm9fbWF0Y2goY29uc3Qgc3RydWN0 DQo+ID4gbmZzX2F1dGhfaW5mbyAqYXV0aF9pbmZvLA0KPiA+IH0NCj4gPiBFWFBPUlRfU1lNQk9M X0dQTChuZnNfYXV0aF9pbmZvX21hdGNoKTsNCj4gPiANCj4gPiAtLyoNCj4gPiAtICogUGFyc2Ug dGhlIHZhbHVlIG9mIHRoZSAnc2VjPScgb3B0aW9uLg0KPiA+IC0gKi8NCj4gPiAtc3RhdGljIGlu dCBuZnNfcGFyc2Vfc2VjdXJpdHlfZmxhdm9ycyhjaGFyICp2YWx1ZSwNCj4gPiAtCQkJCSAgICAg IHN0cnVjdCBuZnNfcGFyc2VkX21vdW50X2RhdGENCj4gPiAqbW50KQ0KPiA+IC17DQo+ID4gLQlz dWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107DQo+ID4gLQlycGNfYXV0aGZsYXZvcl90IHBz ZXVkb2ZsYXZvcjsNCj4gPiAtCWNoYXIgKnA7DQo+ID4gLQ0KPiA+IC0JZGZwcmludGsoTU9VTlQs ICJORlM6IHBhcnNpbmcgc2VjPSVzIG9wdGlvblxuIiwgdmFsdWUpOw0KPiA+IC0NCj4gPiAtCXdo aWxlICgocCA9IHN0cnNlcCgmdmFsdWUsICI6IikpICE9IE5VTEwpIHsNCj4gPiAtCQlzd2l0Y2gg KG1hdGNoX3Rva2VuKHAsIG5mc19zZWNmbGF2b3JfdG9rZW5zLCBhcmdzKSkgew0KPiA+IC0JCWNh c2UgT3B0X3NlY19ub25lOg0KPiA+IC0JCQlwc2V1ZG9mbGF2b3IgPSBSUENfQVVUSF9OVUxMOw0K PiA+IC0JCQlicmVhazsNCj4gPiAtCQljYXNlIE9wdF9zZWNfc3lzOg0KPiA+IC0JCQlwc2V1ZG9m bGF2b3IgPSBSUENfQVVUSF9VTklYOw0KPiA+IC0JCQlicmVhazsNCj4gPiAtCQljYXNlIE9wdF9z ZWNfa3JiNToNCj4gPiAtCQkJcHNldWRvZmxhdm9yID0gUlBDX0FVVEhfR1NTX0tSQjU7DQo+ID4g LQkJCWJyZWFrOw0KPiA+IC0JCWNhc2UgT3B0X3NlY19rcmI1aToNCj4gPiAtCQkJcHNldWRvZmxh dm9yID0gUlBDX0FVVEhfR1NTX0tSQjVJOw0KPiA+IC0JCQlicmVhazsNCj4gPiAtCQljYXNlIE9w dF9zZWNfa3JiNXA6DQo+ID4gLQkJCXBzZXVkb2ZsYXZvciA9IFJQQ19BVVRIX0dTU19LUkI1UDsN Cj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfc2VjX2xrZXk6DQo+ID4gLQkJCXBzZXVk b2ZsYXZvciA9IFJQQ19BVVRIX0dTU19MS0VZOw0KPiA+IC0JCQlicmVhazsNCj4gPiAtCQljYXNl IE9wdF9zZWNfbGtleWk6DQo+ID4gLQkJCXBzZXVkb2ZsYXZvciA9IFJQQ19BVVRIX0dTU19MS0VZ STsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfc2VjX2xrZXlwOg0KPiA+IC0JCQlw c2V1ZG9mbGF2b3IgPSBSUENfQVVUSF9HU1NfTEtFWVA7DQo+ID4gLQkJCWJyZWFrOw0KPiA+IC0J CWNhc2UgT3B0X3NlY19zcGttOg0KPiA+IC0JCQlwc2V1ZG9mbGF2b3IgPSBSUENfQVVUSF9HU1Nf U1BLTTsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfc2VjX3Nwa21pOg0KPiA+IC0J CQlwc2V1ZG9mbGF2b3IgPSBSUENfQVVUSF9HU1NfU1BLTUk7DQo+ID4gLQkJCWJyZWFrOw0KPiA+ IC0JCWNhc2UgT3B0X3NlY19zcGttcDoNCj4gPiAtCQkJcHNldWRvZmxhdm9yID0gUlBDX0FVVEhf R1NTX1NQS01QOw0KPiA+IC0JCQlicmVhazsNCj4gPiAtCQlkZWZhdWx0Og0KPiA+IC0JCQlkZnBy aW50ayhNT1VOVCwNCj4gPiAtCQkJCSAiTkZTOiBzZWM9IG9wdGlvbiAnJXMnIG5vdA0KPiA+IHJl Y29nbml6ZWRcbiIsIHApOw0KPiA+IC0JCQlyZXR1cm4gMDsNCj4gPiAtCQl9DQo+ID4gLQ0KPiA+ IC0JCWlmICghbmZzX2F1dGhfaW5mb19hZGQoJm1udC0+YXV0aF9pbmZvLCBwc2V1ZG9mbGF2b3Ip KQ0KPiA+IC0JCQlyZXR1cm4gMDsNCj4gPiAtCX0NCj4gPiAtDQo+ID4gLQlyZXR1cm4gMTsNCj4g PiAtfQ0KPiA+IC0NCj4gPiAtc3RhdGljIGludCBuZnNfcGFyc2VfdmVyc2lvbl9zdHJpbmcoY2hh ciAqc3RyaW5nLA0KPiA+IC0JCXN0cnVjdCBuZnNfcGFyc2VkX21vdW50X2RhdGEgKm1udCwNCj4g PiAtCQlzdWJzdHJpbmdfdCAqYXJncykNCj4gPiAtew0KPiA+IC0JbW50LT5mbGFncyAmPSB+TkZT X01PVU5UX1ZFUjM7DQo+ID4gLQlzd2l0Y2ggKG1hdGNoX3Rva2VuKHN0cmluZywgbmZzX3ZlcnNf dG9rZW5zLCBhcmdzKSkgew0KPiA+IC0JY2FzZSBPcHRfdmVyc18yOg0KPiA+IC0JCW1udC0+dmVy c2lvbiA9IDI7DQo+ID4gLQkJYnJlYWs7DQo+ID4gLQljYXNlIE9wdF92ZXJzXzM6DQo+ID4gLQkJ bW50LT5mbGFncyB8PSBORlNfTU9VTlRfVkVSMzsNCj4gPiAtCQltbnQtPnZlcnNpb24gPSAzOw0K PiA+IC0JCWJyZWFrOw0KPiA+IC0JY2FzZSBPcHRfdmVyc180Og0KPiA+IC0JCS8qIEJhY2t3YXJk IGNvbXBhdGliaWxpdHkgb3B0aW9uLiBJbiBmdXR1cmUsDQo+ID4gLQkJICogdGhlIG1vdW50IHBy b2dyYW0gc2hvdWxkIGFsd2F5cyBzdXBwbHkNCj4gPiAtCQkgKiBhIE5GU3Y0IG1pbm9yIHZlcnNp b24gbnVtYmVyLg0KPiA+IC0JCSAqLw0KPiA+IC0JCW1udC0+dmVyc2lvbiA9IDQ7DQo+ID4gLQkJ YnJlYWs7DQo+ID4gLQljYXNlIE9wdF92ZXJzXzRfMDoNCj4gPiAtCQltbnQtPnZlcnNpb24gPSA0 Ow0KPiA+IC0JCW1udC0+bWlub3J2ZXJzaW9uID0gMDsNCj4gPiAtCQlicmVhazsNCj4gPiAtCWNh c2UgT3B0X3ZlcnNfNF8xOg0KPiA+IC0JCW1udC0+dmVyc2lvbiA9IDQ7DQo+ID4gLQkJbW50LT5t aW5vcnZlcnNpb24gPSAxOw0KPiA+IC0JCWJyZWFrOw0KPiA+IC0JY2FzZSBPcHRfdmVyc180XzI6 DQo+ID4gLQkJbW50LT52ZXJzaW9uID0gNDsNCj4gPiAtCQltbnQtPm1pbm9ydmVyc2lvbiA9IDI7 DQo+ID4gLQkJYnJlYWs7DQo+ID4gLQlkZWZhdWx0Og0KPiA+IC0JCXJldHVybiAwOw0KPiA+IC0J fQ0KPiA+IC0JcmV0dXJuIDE7DQo+ID4gLX0NCj4gPiAtDQo+ID4gLXN0YXRpYyBpbnQgbmZzX2dl dF9vcHRpb25fc3RyKHN1YnN0cmluZ190IGFyZ3NbXSwgY2hhciAqKm9wdGlvbikNCj4gPiAtew0K PiA+IC0Ja2ZyZWUoKm9wdGlvbik7DQo+ID4gLQkqb3B0aW9uID0gbWF0Y2hfc3RyZHVwKGFyZ3Mp Ow0KPiA+IC0JcmV0dXJuICEqb3B0aW9uOw0KPiA+IC19DQo+ID4gLQ0KPiA+IC1zdGF0aWMgaW50 IG5mc19nZXRfb3B0aW9uX3VsKHN1YnN0cmluZ190IGFyZ3NbXSwgdW5zaWduZWQgbG9uZw0KPiA+ ICpvcHRpb24pDQo+ID4gLXsNCj4gPiAtCWludCByYzsNCj4gPiAtCWNoYXIgKnN0cmluZzsNCj4g PiAtDQo+ID4gLQlzdHJpbmcgPSBtYXRjaF9zdHJkdXAoYXJncyk7DQo+ID4gLQlpZiAoc3RyaW5n ID09IE5VTEwpDQo+ID4gLQkJcmV0dXJuIC1FTk9NRU07DQo+ID4gLQlyYyA9IGtzdHJ0b3VsKHN0 cmluZywgMTAsIG9wdGlvbik7DQo+ID4gLQlrZnJlZShzdHJpbmcpOw0KPiA+IC0NCj4gPiAtCXJl dHVybiByYzsNCj4gPiAtfQ0KPiA+IC0NCj4gPiAtc3RhdGljIGludCBuZnNfZ2V0X29wdGlvbl91 bF9ib3VuZChzdWJzdHJpbmdfdCBhcmdzW10sIHVuc2lnbmVkDQo+ID4gbG9uZyAqb3B0aW9uLA0K PiA+IC0JCXVuc2lnbmVkIGxvbmcgbF9ib3VuZCwgdW5zaWduZWQgbG9uZyB1X2JvdW5kKQ0KPiA+ IC17DQo+ID4gLQlpbnQgcmV0Ow0KPiA+IC0NCj4gPiAtCXJldCA9IG5mc19nZXRfb3B0aW9uX3Vs KGFyZ3MsIG9wdGlvbik7DQo+ID4gLQlpZiAocmV0ICE9IDApDQo+ID4gLQkJcmV0dXJuIHJldDsN Cj4gPiAtCWlmICgqb3B0aW9uIDwgbF9ib3VuZCB8fCAqb3B0aW9uID4gdV9ib3VuZCkNCj4gPiAt CQlyZXR1cm4gLUVSQU5HRTsNCj4gPiAtCXJldHVybiAwOw0KPiA+IC19DQo+ID4gLQ0KPiA+IC0v Kg0KPiA+IC0gKiBFcnJvci1jaGVjayBhbmQgY29udmVydCBhIHN0cmluZyBvZiBtb3VudCBvcHRp b25zIGZyb20gdXNlcg0KPiA+IHNwYWNlIGludG8NCj4gPiAtICogYSBkYXRhIHN0cnVjdHVyZS4g IFRoZSB3aG9sZSBtb3VudCBzdHJpbmcgaXMgcHJvY2Vzc2VkOyBiYWQNCj4gPiBvcHRpb25zIGFy ZQ0KPiA+IC0gKiBza2lwcGVkIGFzIHRoZXkgYXJlIGVuY291bnRlcmVkLiAgSWYgdGhlcmUgd2Vy ZSBubyBlcnJvcnMsDQo+ID4gcmV0dXJuIDE7DQo+ID4gLSAqIG90aGVyd2lzZSByZXR1cm4gMCAo emVybykuDQo+ID4gLSAqLw0KPiA+IC1zdGF0aWMgaW50IG5mc19wYXJzZV9tb3VudF9vcHRpb25z KGNoYXIgKnJhdywNCj4gPiAtCQkJCSAgIHN0cnVjdCBuZnNfcGFyc2VkX21vdW50X2RhdGEgKm1u dCkNCj4gPiAtew0KPiA+IC0JY2hhciAqcCwgKnN0cmluZzsNCj4gPiAtCWludCByYywgc2xvcHB5 ID0gMCwgaW52YWxpZF9vcHRpb24gPSAwOw0KPiA+IC0JdW5zaWduZWQgc2hvcnQgcHJvdG9mYW1p bHkgPSBBRl9VTlNQRUM7DQo+ID4gLQl1bnNpZ25lZCBzaG9ydCBtb3VudGZhbWlseSA9IEFGX1VO U1BFQzsNCj4gPiAtDQo+ID4gLQlpZiAoIXJhdykgew0KPiA+IC0JCWRmcHJpbnRrKE1PVU5ULCAi TkZTOiBtb3VudCBvcHRpb25zIHN0cmluZyB3YXMNCj4gPiBOVUxMLlxuIik7DQo+ID4gLQkJcmV0 dXJuIDE7DQo+ID4gLQl9DQo+ID4gLQlkZnByaW50ayhNT1VOVCwgIk5GUzogbmZzIG1vdW50IG9w dHM9JyVzJ1xuIiwgcmF3KTsNCj4gPiAtDQo+ID4gLQlyYyA9IHNlY3VyaXR5X3NiX2VhdF9sc21f b3B0cyhyYXcsICZtbnQtPmxzbV9vcHRzKTsNCj4gPiAtCWlmIChyYykNCj4gPiAtCQlnb3RvIG91 dF9zZWN1cml0eV9mYWlsdXJlOw0KPiA+IC0NCj4gPiAtCXdoaWxlICgocCA9IHN0cnNlcCgmcmF3 LCAiLCIpKSAhPSBOVUxMKSB7DQo+ID4gLQkJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1Nd Ow0KPiA+IC0JCXVuc2lnbmVkIGxvbmcgb3B0aW9uOw0KPiA+IC0JCWludCB0b2tlbjsNCj4gPiAt DQo+ID4gLQkJaWYgKCEqcCkNCj4gPiAtCQkJY29udGludWU7DQo+ID4gLQ0KPiA+IC0JCWRmcHJp bnRrKE1PVU5ULCAiTkZTOiAgIHBhcnNpbmcgbmZzIG1vdW50IG9wdGlvbg0KPiA+ICclcydcbiIs IHApOw0KPiA+IC0NCj4gPiAtCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIG5mc19tb3VudF9vcHRp b25fdG9rZW5zLCBhcmdzKTsNCj4gPiAtCQlzd2l0Y2ggKHRva2VuKSB7DQo+ID4gLQ0KPiA+IC0J CS8qDQo+ID4gLQkJICogYm9vbGVhbiBvcHRpb25zOiAgZm9vL25vZm9vDQo+ID4gLQkJICovDQo+ ID4gLQkJY2FzZSBPcHRfc29mdDoNCj4gPiAtCQkJbW50LT5mbGFncyB8PSBORlNfTU9VTlRfU09G VDsNCj4gPiAtCQkJbW50LT5mbGFncyAmPSB+TkZTX01PVU5UX1NPRlRFUlI7DQo+ID4gLQkJCWJy ZWFrOw0KPiA+IC0JCWNhc2UgT3B0X3NvZnRlcnI6DQo+ID4gLQkJCW1udC0+ZmxhZ3MgfD0gTkZT X01PVU5UX1NPRlRFUlI7DQo+ID4gLQkJCW1udC0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9TT0ZUOw0K PiA+IC0JCQlicmVhazsNCj4gPiAtCQljYXNlIE9wdF9oYXJkOg0KPiA+IC0JCQltbnQtPmZsYWdz ICY9DQo+ID4gfihORlNfTU9VTlRfU09GVHxORlNfTU9VTlRfU09GVEVSUik7DQo+ID4gLQkJCWJy ZWFrOw0KPiA+IC0JCWNhc2UgT3B0X3Bvc2l4Og0KPiA+IC0JCQltbnQtPmZsYWdzIHw9IE5GU19N T1VOVF9QT1NJWDsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfbm9wb3NpeDoNCj4g PiAtCQkJbW50LT5mbGFncyAmPSB+TkZTX01PVU5UX1BPU0lYOw0KPiA+IC0JCQlicmVhazsNCj4g PiAtCQljYXNlIE9wdF9jdG86DQo+ID4gLQkJCW1udC0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9OT0NU TzsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfbm9jdG86DQo+ID4gLQkJCW1udC0+ ZmxhZ3MgfD0gTkZTX01PVU5UX05PQ1RPOw0KPiA+IC0JCQlicmVhazsNCj4gPiAtCQljYXNlIE9w dF9hYzoNCj4gPiAtCQkJbW50LT5mbGFncyAmPSB+TkZTX01PVU5UX05PQUM7DQo+ID4gLQkJCWJy ZWFrOw0KPiA+IC0JCWNhc2UgT3B0X25vYWM6DQo+ID4gLQkJCW1udC0+ZmxhZ3MgfD0gTkZTX01P VU5UX05PQUM7DQo+ID4gLQkJCWJyZWFrOw0KPiA+IC0JCWNhc2UgT3B0X2xvY2s6DQo+ID4gLQkJ CW1udC0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9OT05MTTsNCj4gPiAtCQkJbW50LT5mbGFncyAmPSB+ KE5GU19NT1VOVF9MT0NBTF9GTE9DSyB8DQo+ID4gLQkJCQkJTkZTX01PVU5UX0xPQ0FMX0ZDTlRM KTsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfbm9sb2NrOg0KPiA+IC0JCQltbnQt PmZsYWdzIHw9IE5GU19NT1VOVF9OT05MTTsNCj4gPiAtCQkJbW50LT5mbGFncyB8PSAoTkZTX01P VU5UX0xPQ0FMX0ZMT0NLIHwNCj4gPiAtCQkJCSAgICAgICBORlNfTU9VTlRfTE9DQUxfRkNOVEwp Ow0KPiA+IC0JCQlicmVhazsNCj4gPiAtCQljYXNlIE9wdF91ZHA6DQo+ID4gLQkJCW1udC0+Zmxh Z3MgJj0gfk5GU19NT1VOVF9UQ1A7DQo+ID4gLQkJCW1udC0+bmZzX3NlcnZlci5wcm90b2NvbCA9 IFhQUlRfVFJBTlNQT1JUX1VEUDsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfdGNw Og0KPiA+IC0JCQltbnQtPmZsYWdzIHw9IE5GU19NT1VOVF9UQ1A7DQo+ID4gLQkJCW1udC0+bmZz X3NlcnZlci5wcm90b2NvbCA9IFhQUlRfVFJBTlNQT1JUX1RDUDsNCj4gPiAtCQkJYnJlYWs7DQo+ ID4gLQkJY2FzZSBPcHRfcmRtYToNCj4gPiAtCQkJbW50LT5mbGFncyB8PSBORlNfTU9VTlRfVENQ OyAvKiBmb3Igc2lkZQ0KPiA+IHByb3RvY29scyAqLw0KPiA+IC0JCQltbnQtPm5mc19zZXJ2ZXIu cHJvdG9jb2wgPSBYUFJUX1RSQU5TUE9SVF9SRE1BOw0KPiA+IC0JCQl4cHJ0X2xvYWRfdHJhbnNw b3J0KHApOw0KPiA+IC0JCQlicmVhazsNCj4gPiAtCQljYXNlIE9wdF9hY2w6DQo+ID4gLQkJCW1u dC0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9OT0FDTDsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2Fz ZSBPcHRfbm9hY2w6DQo+ID4gLQkJCW1udC0+ZmxhZ3MgfD0gTkZTX01PVU5UX05PQUNMOw0KPiA+ IC0JCQlicmVhazsNCj4gPiAtCQljYXNlIE9wdF9yZGlycGx1czoNCj4gPiAtCQkJbW50LT5mbGFn cyAmPSB+TkZTX01PVU5UX05PUkRJUlBMVVM7DQo+ID4gLQkJCWJyZWFrOw0KPiA+IC0JCWNhc2Ug T3B0X25vcmRpcnBsdXM6DQo+ID4gLQkJCW1udC0+ZmxhZ3MgfD0gTkZTX01PVU5UX05PUkRJUlBM VVM7DQo+ID4gLQkJCWJyZWFrOw0KPiA+IC0JCWNhc2UgT3B0X3NoYXJlY2FjaGU6DQo+ID4gLQkJ CW1udC0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9VTlNIQVJFRDsNCj4gPiAtCQkJYnJlYWs7DQo+ID4g LQkJY2FzZSBPcHRfbm9zaGFyZWNhY2hlOg0KPiA+IC0JCQltbnQtPmZsYWdzIHw9IE5GU19NT1VO VF9VTlNIQVJFRDsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfcmVzdnBvcnQ6DQo+ ID4gLQkJCW1udC0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9OT1JFU1ZQT1JUOw0KPiA+IC0JCQlicmVh azsNCj4gPiAtCQljYXNlIE9wdF9ub3Jlc3Zwb3J0Og0KPiA+IC0JCQltbnQtPmZsYWdzIHw9IE5G U19NT1VOVF9OT1JFU1ZQT1JUOw0KPiA+IC0JCQlicmVhazsNCj4gPiAtCQljYXNlIE9wdF9mc2Nh Y2hlOg0KPiA+IC0JCQltbnQtPm9wdGlvbnMgfD0gTkZTX09QVElPTl9GU0NBQ0hFOw0KPiA+IC0J CQlrZnJlZShtbnQtPmZzY2FjaGVfdW5pcSk7DQo+ID4gLQkJCW1udC0+ZnNjYWNoZV91bmlxID0g TlVMTDsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfbm9mc2NhY2hlOg0KPiA+IC0J CQltbnQtPm9wdGlvbnMgJj0gfk5GU19PUFRJT05fRlNDQUNIRTsNCj4gPiAtCQkJa2ZyZWUobW50 LT5mc2NhY2hlX3VuaXEpOw0KPiA+IC0JCQltbnQtPmZzY2FjaGVfdW5pcSA9IE5VTEw7DQo+ID4g LQkJCWJyZWFrOw0KPiA+IC0JCWNhc2UgT3B0X21pZ3JhdGlvbjoNCj4gPiAtCQkJbW50LT5vcHRp b25zIHw9IE5GU19PUFRJT05fTUlHUkFUSU9OOw0KPiA+IC0JCQlicmVhazsNCj4gPiAtCQljYXNl IE9wdF9ub21pZ3JhdGlvbjoNCj4gPiAtCQkJbW50LT5vcHRpb25zICY9IH5ORlNfT1BUSU9OX01J R1JBVElPTjsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQ0KPiA+IC0JCS8qDQo+ID4gLQkJICogb3B0 aW9ucyB0aGF0IHRha2UgbnVtZXJpYyB2YWx1ZXMNCj4gPiAtCQkgKi8NCj4gPiAtCQljYXNlIE9w dF9wb3J0Og0KPiA+IC0JCQlpZiAobmZzX2dldF9vcHRpb25fdWwoYXJncywgJm9wdGlvbikgfHwN Cj4gPiAtCQkJICAgIG9wdGlvbiA+IFVTSFJUX01BWCkNCj4gPiAtCQkJCWdvdG8gb3V0X2ludmFs aWRfdmFsdWU7DQo+ID4gLQkJCW1udC0+bmZzX3NlcnZlci5wb3J0ID0gb3B0aW9uOw0KPiA+IC0J CQlicmVhazsNCj4gPiAtCQljYXNlIE9wdF9yc2l6ZToNCj4gPiAtCQkJaWYgKG5mc19nZXRfb3B0 aW9uX3VsKGFyZ3MsICZvcHRpb24pKQ0KPiA+IC0JCQkJZ290byBvdXRfaW52YWxpZF92YWx1ZTsN Cj4gPiAtCQkJbW50LT5yc2l6ZSA9IG9wdGlvbjsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2Fz ZSBPcHRfd3NpemU6DQo+ID4gLQkJCWlmIChuZnNfZ2V0X29wdGlvbl91bChhcmdzLCAmb3B0aW9u KSkNCj4gPiAtCQkJCWdvdG8gb3V0X2ludmFsaWRfdmFsdWU7DQo+ID4gLQkJCW1udC0+d3NpemUg PSBvcHRpb247DQo+ID4gLQkJCWJyZWFrOw0KPiA+IC0JCWNhc2UgT3B0X2JzaXplOg0KPiA+IC0J CQlpZiAobmZzX2dldF9vcHRpb25fdWwoYXJncywgJm9wdGlvbikpDQo+ID4gLQkJCQlnb3RvIG91 dF9pbnZhbGlkX3ZhbHVlOw0KPiA+IC0JCQltbnQtPmJzaXplID0gb3B0aW9uOw0KPiA+IC0JCQli cmVhazsNCj4gPiAtCQljYXNlIE9wdF90aW1lbzoNCj4gPiAtCQkJaWYgKG5mc19nZXRfb3B0aW9u X3VsX2JvdW5kKGFyZ3MsICZvcHRpb24sIDEsDQo+ID4gSU5UX01BWCkpDQo+ID4gLQkJCQlnb3Rv IG91dF9pbnZhbGlkX3ZhbHVlOw0KPiA+IC0JCQltbnQtPnRpbWVvID0gb3B0aW9uOw0KPiA+IC0J CQlicmVhazsNCj4gPiAtCQljYXNlIE9wdF9yZXRyYW5zOg0KPiA+IC0JCQlpZiAobmZzX2dldF9v cHRpb25fdWxfYm91bmQoYXJncywgJm9wdGlvbiwgMCwNCj4gPiBJTlRfTUFYKSkNCj4gPiAtCQkJ CWdvdG8gb3V0X2ludmFsaWRfdmFsdWU7DQo+ID4gLQkJCW1udC0+cmV0cmFucyA9IG9wdGlvbjsN Cj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfYWNyZWdtaW46DQo+ID4gLQkJCWlmIChu ZnNfZ2V0X29wdGlvbl91bChhcmdzLCAmb3B0aW9uKSkNCj4gPiAtCQkJCWdvdG8gb3V0X2ludmFs aWRfdmFsdWU7DQo+ID4gLQkJCW1udC0+YWNyZWdtaW4gPSBvcHRpb247DQo+ID4gLQkJCWJyZWFr Ow0KPiA+IC0JCWNhc2UgT3B0X2FjcmVnbWF4Og0KPiA+IC0JCQlpZiAobmZzX2dldF9vcHRpb25f dWwoYXJncywgJm9wdGlvbikpDQo+ID4gLQkJCQlnb3RvIG91dF9pbnZhbGlkX3ZhbHVlOw0KPiA+ IC0JCQltbnQtPmFjcmVnbWF4ID0gb3B0aW9uOw0KPiA+IC0JCQlicmVhazsNCj4gPiAtCQljYXNl IE9wdF9hY2Rpcm1pbjoNCj4gPiAtCQkJaWYgKG5mc19nZXRfb3B0aW9uX3VsKGFyZ3MsICZvcHRp b24pKQ0KPiA+IC0JCQkJZ290byBvdXRfaW52YWxpZF92YWx1ZTsNCj4gPiAtCQkJbW50LT5hY2Rp cm1pbiA9IG9wdGlvbjsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfYWNkaXJtYXg6 DQo+ID4gLQkJCWlmIChuZnNfZ2V0X29wdGlvbl91bChhcmdzLCAmb3B0aW9uKSkNCj4gPiAtCQkJ CWdvdG8gb3V0X2ludmFsaWRfdmFsdWU7DQo+ID4gLQkJCW1udC0+YWNkaXJtYXggPSBvcHRpb247 DQo+ID4gLQkJCWJyZWFrOw0KPiA+IC0JCWNhc2UgT3B0X2FjdGltZW86DQo+ID4gLQkJCWlmIChu ZnNfZ2V0X29wdGlvbl91bChhcmdzLCAmb3B0aW9uKSkNCj4gPiAtCQkJCWdvdG8gb3V0X2ludmFs aWRfdmFsdWU7DQo+ID4gLQkJCW1udC0+YWNyZWdtaW4gPSBtbnQtPmFjcmVnbWF4ID0NCj4gPiAt CQkJbW50LT5hY2Rpcm1pbiA9IG1udC0+YWNkaXJtYXggPSBvcHRpb247DQo+ID4gLQkJCWJyZWFr Ow0KPiA+IC0JCWNhc2UgT3B0X25hbWVsZW46DQo+ID4gLQkJCWlmIChuZnNfZ2V0X29wdGlvbl91 bChhcmdzLCAmb3B0aW9uKSkNCj4gPiAtCQkJCWdvdG8gb3V0X2ludmFsaWRfdmFsdWU7DQo+ID4g LQkJCW1udC0+bmFtbGVuID0gb3B0aW9uOw0KPiA+IC0JCQlicmVhazsNCj4gPiAtCQljYXNlIE9w dF9tb3VudHBvcnQ6DQo+ID4gLQkJCWlmIChuZnNfZ2V0X29wdGlvbl91bChhcmdzLCAmb3B0aW9u KSB8fA0KPiA+IC0JCQkgICAgb3B0aW9uID4gVVNIUlRfTUFYKQ0KPiA+IC0JCQkJZ290byBvdXRf aW52YWxpZF92YWx1ZTsNCj4gPiAtCQkJbW50LT5tb3VudF9zZXJ2ZXIucG9ydCA9IG9wdGlvbjsN Cj4gPiAtCQkJYnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfbW91bnR2ZXJzOg0KPiA+IC0JCQlpZiAo bmZzX2dldF9vcHRpb25fdWwoYXJncywgJm9wdGlvbikgfHwNCj4gPiAtCQkJICAgIG9wdGlvbiA8 IE5GU19NTlRfVkVSU0lPTiB8fA0KPiA+IC0JCQkgICAgb3B0aW9uID4gTkZTX01OVDNfVkVSU0lP TikNCj4gPiAtCQkJCWdvdG8gb3V0X2ludmFsaWRfdmFsdWU7DQo+ID4gLQkJCW1udC0+bW91bnRf c2VydmVyLnZlcnNpb24gPSBvcHRpb247DQo+ID4gLQkJCWJyZWFrOw0KPiA+IC0JCWNhc2UgT3B0 X21pbm9ydmVyc2lvbjoNCj4gPiAtCQkJaWYgKG5mc19nZXRfb3B0aW9uX3VsKGFyZ3MsICZvcHRp b24pKQ0KPiA+IC0JCQkJZ290byBvdXRfaW52YWxpZF92YWx1ZTsNCj4gPiAtCQkJaWYgKG9wdGlv biA+IE5GUzRfTUFYX01JTk9SX1ZFUlNJT04pDQo+ID4gLQkJCQlnb3RvIG91dF9pbnZhbGlkX3Zh bHVlOw0KPiA+IC0JCQltbnQtPm1pbm9ydmVyc2lvbiA9IG9wdGlvbjsNCj4gPiAtCQkJYnJlYWs7 DQo+ID4gLQ0KPiA+IC0JCS8qDQo+ID4gLQkJICogb3B0aW9ucyB0aGF0IHRha2UgdGV4dCB2YWx1 ZXMNCj4gPiAtCQkgKi8NCj4gPiAtCQljYXNlIE9wdF9uZnN2ZXJzOg0KPiA+IC0JCQlzdHJpbmcg PSBtYXRjaF9zdHJkdXAoYXJncyk7DQo+ID4gLQkJCWlmIChzdHJpbmcgPT0gTlVMTCkNCj4gPiAt CQkJCWdvdG8gb3V0X25vbWVtOw0KPiA+IC0JCQlyYyA9IG5mc19wYXJzZV92ZXJzaW9uX3N0cmlu ZyhzdHJpbmcsIG1udCwNCj4gPiBhcmdzKTsNCj4gPiAtCQkJa2ZyZWUoc3RyaW5nKTsNCj4gPiAt CQkJaWYgKCFyYykNCj4gPiAtCQkJCWdvdG8gb3V0X2ludmFsaWRfdmFsdWU7DQo+ID4gLQkJCWJy ZWFrOw0KPiA+IC0JCWNhc2UgT3B0X3NlYzoNCj4gPiAtCQkJc3RyaW5nID0gbWF0Y2hfc3RyZHVw KGFyZ3MpOw0KPiA+IC0JCQlpZiAoc3RyaW5nID09IE5VTEwpDQo+ID4gLQkJCQlnb3RvIG91dF9u b21lbTsNCj4gPiAtCQkJcmMgPSBuZnNfcGFyc2Vfc2VjdXJpdHlfZmxhdm9ycyhzdHJpbmcsIG1u dCk7DQo+ID4gLQkJCWtmcmVlKHN0cmluZyk7DQo+ID4gLQkJCWlmICghcmMpIHsNCj4gPiAtCQkJ CWRmcHJpbnRrKE1PVU5ULCAiTkZTOiAgIHVucmVjb2duaXplZCAiDQo+ID4gLQkJCQkJCSJzZWN1 cml0eSBmbGF2b3JcbiIpOw0KPiA+IC0JCQkJcmV0dXJuIDA7DQo+ID4gLQkJCX0NCj4gPiAtCQkJ YnJlYWs7DQo+ID4gLQkJY2FzZSBPcHRfcHJvdG86DQo+ID4gLQkJCXN0cmluZyA9IG1hdGNoX3N0 cmR1cChhcmdzKTsNCj4gPiAtCQkJaWYgKHN0cmluZyA9PSBOVUxMKQ0KPiA+IC0JCQkJZ290byBv dXRfbm9tZW07DQo+ID4gLQkJCXRva2VuID0gbWF0Y2hfdG9rZW4oc3RyaW5nLA0KPiA+IC0JCQkJ CSAgICBuZnNfeHBydF9wcm90b2NvbF90b2tlbnMsDQo+ID4gYXJncyk7DQo+ID4gLQ0KPiA+IC0J CQlwcm90b2ZhbWlseSA9IEFGX0lORVQ7DQo+ID4gLQkJCXN3aXRjaCAodG9rZW4pIHsNCj4gPiAt CQkJY2FzZSBPcHRfeHBydF91ZHA2Og0KPiA+IC0JCQkJcHJvdG9mYW1pbHkgPSBBRl9JTkVUNjsN Cj4gPiAtCQkJCS8qIGZhbGwgdGhyb3VnaCAqLw0KPiA+IC0JCQljYXNlIE9wdF94cHJ0X3VkcDoN Cj4gPiAtCQkJCW1udC0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9UQ1A7DQo+ID4gLQkJCQltbnQtPm5m c19zZXJ2ZXIucHJvdG9jb2wgPQ0KPiA+IFhQUlRfVFJBTlNQT1JUX1VEUDsNCj4gPiAtCQkJCWJy ZWFrOw0KPiA+IC0JCQljYXNlIE9wdF94cHJ0X3RjcDY6DQo+ID4gLQkJCQlwcm90b2ZhbWlseSA9 IEFGX0lORVQ2Ow0KPiA+IC0JCQkJLyogZmFsbCB0aHJvdWdoICovDQo+ID4gLQkJCWNhc2UgT3B0 X3hwcnRfdGNwOg0KPiA+IC0JCQkJbW50LT5mbGFncyB8PSBORlNfTU9VTlRfVENQOw0KPiA+IC0J CQkJbW50LT5uZnNfc2VydmVyLnByb3RvY29sID0NCj4gPiBYUFJUX1RSQU5TUE9SVF9UQ1A7DQo+ ID4gLQkJCQlicmVhazsNCj4gPiAtCQkJY2FzZSBPcHRfeHBydF9yZG1hNjoNCj4gPiAtCQkJCXBy b3RvZmFtaWx5ID0gQUZfSU5FVDY7DQo+ID4gLQkJCQkvKiBmYWxsIHRocm91Z2ggKi8NCj4gPiAt CQkJY2FzZSBPcHRfeHBydF9yZG1hOg0KPiA+IC0JCQkJLyogdmVjdG9yIHNpZGUgcHJvdG9jb2xz IHRvIFRDUCAqLw0KPiA+IC0JCQkJbW50LT5mbGFncyB8PSBORlNfTU9VTlRfVENQOw0KPiA+IC0J CQkJbW50LT5uZnNfc2VydmVyLnByb3RvY29sID0NCj4gPiBYUFJUX1RSQU5TUE9SVF9SRE1BOw0K PiA+IC0JCQkJeHBydF9sb2FkX3RyYW5zcG9ydChzdHJpbmcpOw0KPiA+IC0JCQkJYnJlYWs7DQo+ ID4gLQkJCWRlZmF1bHQ6DQo+ID4gLQkJCQlkZnByaW50ayhNT1VOVCwgIk5GUzogICB1bnJlY29n bml6ZWQgIg0KPiA+IC0JCQkJCQkidHJhbnNwb3J0DQo+ID4gcHJvdG9jb2xcbiIpOw0KPiA+IC0J CQkJa2ZyZWUoc3RyaW5nKTsNCj4gPiAtCQkJCXJldHVybiAwOw0KPiA+IC0JCQl9DQo+ID4gLQkJ CWtmcmVlKHN0cmluZyk7DQo+ID4gLQkJCWJyZWFrOw0KPiA+IC0JCWNhc2UgT3B0X21vdW50cHJv dG86DQo+ID4gLQkJCXN0cmluZyA9IG1hdGNoX3N0cmR1cChhcmdzKTsNCj4gPiAtCQkJaWYgKHN0 cmluZyA9PSBOVUxMKQ0KPiA+IC0JCQkJZ290byBvdXRfbm9tZW07DQo+ID4gLQkJCXRva2VuID0g bWF0Y2hfdG9rZW4oc3RyaW5nLA0KPiA+IC0JCQkJCSAgICBuZnNfeHBydF9wcm90b2NvbF90b2tl bnMsDQo+ID4gYXJncyk7DQo+ID4gLQkJCWtmcmVlKHN0cmluZyk7DQo+ID4gLQ0KPiA+IC0JCQlt b3VudGZhbWlseSA9IEFGX0lORVQ7DQo+ID4gLQkJCXN3aXRjaCAodG9rZW4pIHsNCj4gPiAtCQkJ Y2FzZSBPcHRfeHBydF91ZHA2Og0KPiA+IC0JCQkJbW91bnRmYW1pbHkgPSBBRl9JTkVUNjsNCj4g PiAtCQkJCS8qIGZhbGwgdGhyb3VnaCAqLw0KPiA+IC0JCQljYXNlIE9wdF94cHJ0X3VkcDoNCj4g PiAtCQkJCW1udC0+bW91bnRfc2VydmVyLnByb3RvY29sID0NCj4gPiBYUFJUX1RSQU5TUE9SVF9V RFA7DQo+ID4gLQkJCQlicmVhazsNCj4gPiAtCQkJY2FzZSBPcHRfeHBydF90Y3A2Og0KPiA+IC0J CQkJbW91bnRmYW1pbHkgPSBBRl9JTkVUNjsNCj4gPiAtCQkJCS8qIGZhbGwgdGhyb3VnaCAqLw0K PiA+IC0JCQljYXNlIE9wdF94cHJ0X3RjcDoNCj4gPiAtCQkJCW1udC0+bW91bnRfc2VydmVyLnBy b3RvY29sID0NCj4gPiBYUFJUX1RSQU5TUE9SVF9UQ1A7DQo+ID4gLQkJCQlicmVhazsNCj4gPiAt CQkJY2FzZSBPcHRfeHBydF9yZG1hOiAvKiBub3QgdXNlZCBmb3Igc2lkZQ0KPiA+IHByb3RvY29s cyAqLw0KPiA+IC0JCQlkZWZhdWx0Og0KPiA+IC0JCQkJZGZwcmludGsoTU9VTlQsICJORlM6ICAg dW5yZWNvZ25pemVkICINCj4gPiAtCQkJCQkJInRyYW5zcG9ydA0KPiA+IHByb3RvY29sXG4iKTsN Cj4gPiAtCQkJCXJldHVybiAwOw0KPiA+IC0JCQl9DQo+ID4gLQkJCWJyZWFrOw0KPiA+IC0JCWNh c2UgT3B0X2FkZHI6DQo+ID4gLQkJCXN0cmluZyA9IG1hdGNoX3N0cmR1cChhcmdzKTsNCj4gPiAt CQkJaWYgKHN0cmluZyA9PSBOVUxMKQ0KPiA+IC0JCQkJZ290byBvdXRfbm9tZW07DQo+ID4gLQkJ CW1udC0+bmZzX3NlcnZlci5hZGRybGVuID0NCj4gPiAtCQkJCXJwY19wdG9uKG1udC0+bmV0LCBz dHJpbmcsDQo+ID4gc3RybGVuKHN0cmluZyksDQo+ID4gLQkJCQkJKHN0cnVjdCBzb2NrYWRkciAq KQ0KPiA+IC0JCQkJCSZtbnQtPm5mc19zZXJ2ZXIuYWRkcmVzcywNCj4gPiAtCQkJCQlzaXplb2Yo bW50LQ0KPiA+ID5uZnNfc2VydmVyLmFkZHJlc3MpKTsNCj4gPiAtCQkJa2ZyZWUoc3RyaW5nKTsN Cj4gPiAtCQkJaWYgKG1udC0+bmZzX3NlcnZlci5hZGRybGVuID09IDApDQo+ID4gLQkJCQlnb3Rv IG91dF9pbnZhbGlkX2FkZHJlc3M7DQo+ID4gLQkJCWJyZWFrOw0KPiA+IC0JCWNhc2UgT3B0X2Ns aWVudGFkZHI6DQo+ID4gLQkJCWlmIChuZnNfZ2V0X29wdGlvbl9zdHIoYXJncywgJm1udC0NCj4g PiA+Y2xpZW50X2FkZHJlc3MpKQ0KPiA+IC0JCQkJZ290byBvdXRfbm9tZW07DQo+ID4gLQkJCWJy ZWFrOw0KPiA+IC0JCWNhc2UgT3B0X21vdW50aG9zdDoNCj4gPiAtCQkJaWYgKG5mc19nZXRfb3B0 aW9uX3N0cihhcmdzLA0KPiA+IC0JCQkJCSAgICAgICAmbW50LQ0KPiA+ID5tb3VudF9zZXJ2ZXIu aG9zdG5hbWUpKQ0KPiA+IC0JCQkJZ290byBvdXRfbm9tZW07DQo+ID4gLQkJCWJyZWFrOw0KPiA+ IC0JCWNhc2UgT3B0X21vdW50YWRkcjoNCj4gPiAtCQkJc3RyaW5nID0gbWF0Y2hfc3RyZHVwKGFy Z3MpOw0KPiA+IC0JCQlpZiAoc3RyaW5nID09IE5VTEwpDQo+ID4gLQkJCQlnb3RvIG91dF9ub21l bTsNCj4gPiAtCQkJbW50LT5tb3VudF9zZXJ2ZXIuYWRkcmxlbiA9DQo+ID4gLQkJCQlycGNfcHRv bihtbnQtPm5ldCwgc3RyaW5nLA0KPiA+IHN0cmxlbihzdHJpbmcpLA0KPiA+IC0JCQkJCShzdHJ1 Y3Qgc29ja2FkZHIgKikNCj4gPiAtCQkJCQkmbW50LT5tb3VudF9zZXJ2ZXIuYWRkcmVzcywNCj4g PiAtCQkJCQlzaXplb2YobW50LQ0KPiA+ID5tb3VudF9zZXJ2ZXIuYWRkcmVzcykpOw0KPiA+IC0J CQlrZnJlZShzdHJpbmcpOw0KPiA+IC0JCQlpZiAobW50LT5tb3VudF9zZXJ2ZXIuYWRkcmxlbiA9 PSAwKQ0KPiA+IC0JCQkJZ290byBvdXRfaW52YWxpZF9hZGRyZXNzOw0KPiA+IC0JCQlicmVhazsN Cj4gPiAtCQljYXNlIE9wdF9uY29ubmVjdDoNCj4gPiAtCQkJaWYgKG5mc19nZXRfb3B0aW9uX3Vs X2JvdW5kKGFyZ3MsICZvcHRpb24sIDEsDQo+ID4gTkZTX01BWF9DT05ORUNUSU9OUykpDQo+ID4g LQkJCQlnb3RvIG91dF9pbnZhbGlkX3ZhbHVlOw0KPiA+IC0JCQltbnQtPm5mc19zZXJ2ZXIubmNv bm5lY3QgPSBvcHRpb247DQo+ID4gLQkJCWJyZWFrOw0KPiA+IC0JCWNhc2UgT3B0X2xvb2t1cGNh Y2hlOg0KPiA+IC0JCQlzdHJpbmcgPSBtYXRjaF9zdHJkdXAoYXJncyk7DQo+ID4gLQkJCWlmIChz dHJpbmcgPT0gTlVMTCkNCj4gPiAtCQkJCWdvdG8gb3V0X25vbWVtOw0KPiA+IC0JCQl0b2tlbiA9 IG1hdGNoX3Rva2VuKHN0cmluZywNCj4gPiAtCQkJCQluZnNfbG9va3VwY2FjaGVfdG9rZW5zLCBh cmdzKTsNCj4gPiAtCQkJa2ZyZWUoc3RyaW5nKTsNCj4gPiAtCQkJc3dpdGNoICh0b2tlbikgew0K PiA+IC0JCQkJY2FzZSBPcHRfbG9va3VwY2FjaGVfYWxsOg0KPiA+IC0JCQkJCW1udC0+ZmxhZ3Mg Jj0NCj4gPiB+KE5GU19NT1VOVF9MT09LVVBfQ0FDSEVfTk9ORUd8TkZTX01PVU5UX0xPT0tVUF9D QUNIRV9OT05FKTsNCj4gPiAtCQkJCQlicmVhazsNCj4gPiAtCQkJCWNhc2UgT3B0X2xvb2t1cGNh Y2hlX3Bvc2l0aXZlOg0KPiA+IC0JCQkJCW1udC0+ZmxhZ3MgJj0NCj4gPiB+TkZTX01PVU5UX0xP T0tVUF9DQUNIRV9OT05FOw0KPiA+IC0JCQkJCW1udC0+ZmxhZ3MgfD0NCj4gPiBORlNfTU9VTlRf TE9PS1VQX0NBQ0hFX05PTkVHOw0KPiA+IC0JCQkJCWJyZWFrOw0KPiA+IC0JCQkJY2FzZSBPcHRf bG9va3VwY2FjaGVfbm9uZToNCj4gPiAtCQkJCQltbnQtPmZsYWdzIHw9DQo+ID4gTkZTX01PVU5U X0xPT0tVUF9DQUNIRV9OT05FR3xORlNfTU9VTlRfTE9PS1VQX0NBQ0hFX05PTkU7DQo+ID4gLQkJ CQkJYnJlYWs7DQo+ID4gLQkJCQlkZWZhdWx0Og0KPiA+IC0JCQkJCWRmcHJpbnRrKE1PVU5ULCAi TkZTOiAgIGludmFsaWQNCj4gPiAiDQo+ID4gLQkJCQkJCQkibG9va3VwY2FjaGUNCj4gPiBhcmd1 bWVudFxuIik7DQo+ID4gLQkJCQkJcmV0dXJuIDA7DQo+ID4gLQkJCX07DQo+ID4gLQkJCWJyZWFr Ow0KPiA+IC0JCWNhc2UgT3B0X2ZzY2FjaGVfdW5pcToNCj4gPiAtCQkJaWYgKG5mc19nZXRfb3B0 aW9uX3N0cihhcmdzLCAmbW50LQ0KPiA+ID5mc2NhY2hlX3VuaXEpKQ0KPiA+IC0JCQkJZ290byBv dXRfbm9tZW07DQo+ID4gLQkJCW1udC0+b3B0aW9ucyB8PSBORlNfT1BUSU9OX0ZTQ0FDSEU7DQo+ ID4gLQkJCWJyZWFrOw0KPiA+IC0JCWNhc2UgT3B0X2xvY2FsX2xvY2s6DQo+ID4gLQkJCXN0cmlu ZyA9IG1hdGNoX3N0cmR1cChhcmdzKTsNCj4gPiAtCQkJaWYgKHN0cmluZyA9PSBOVUxMKQ0KPiA+ IC0JCQkJZ290byBvdXRfbm9tZW07DQo+ID4gLQkJCXRva2VuID0gbWF0Y2hfdG9rZW4oc3RyaW5n LA0KPiA+IG5mc19sb2NhbF9sb2NrX3Rva2VucywNCj4gPiAtCQkJCQlhcmdzKTsNCj4gPiAtCQkJ a2ZyZWUoc3RyaW5nKTsNCj4gPiAtCQkJc3dpdGNoICh0b2tlbikgew0KPiA+IC0JCQljYXNlIE9w dF9sb2NhbF9sb2NrX2FsbDoNCj4gPiAtCQkJCW1udC0+ZmxhZ3MgfD0gKE5GU19NT1VOVF9MT0NB TF9GTE9DSyB8DQo+ID4gLQkJCQkJICAgICAgIE5GU19NT1VOVF9MT0NBTF9GQ05UTCk7DQo+ID4g LQkJCQlicmVhazsNCj4gPiAtCQkJY2FzZSBPcHRfbG9jYWxfbG9ja19mbG9jazoNCj4gPiAtCQkJ CW1udC0+ZmxhZ3MgfD0gTkZTX01PVU5UX0xPQ0FMX0ZMT0NLOw0KPiA+IC0JCQkJYnJlYWs7DQo+ ID4gLQkJCWNhc2UgT3B0X2xvY2FsX2xvY2tfcG9zaXg6DQo+ID4gLQkJCQltbnQtPmZsYWdzIHw9 IE5GU19NT1VOVF9MT0NBTF9GQ05UTDsNCj4gPiAtCQkJCWJyZWFrOw0KPiA+IC0JCQljYXNlIE9w dF9sb2NhbF9sb2NrX25vbmU6DQo+ID4gLQkJCQltbnQtPmZsYWdzICY9IH4oTkZTX01PVU5UX0xP Q0FMX0ZMT0NLIHwNCj4gPiAtCQkJCQkJTkZTX01PVU5UX0xPQ0FMX0ZDTlRMKTsNCj4gPiAtCQkJ CWJyZWFrOw0KPiA+IC0JCQlkZWZhdWx0Og0KPiA+IC0JCQkJZGZwcmludGsoTU9VTlQsICJORlM6 CWludmFsaWQJIg0KPiA+IC0JCQkJCQkibG9jYWxfbG9jaw0KPiA+IGFyZ3VtZW50XG4iKTsNCj4g PiAtCQkJCXJldHVybiAwOw0KPiA+IC0JCQl9Ow0KPiA+IC0JCQlicmVhazsNCj4gPiAtDQo+ID4g LQkJLyoNCj4gPiAtCQkgKiBTcGVjaWFsIG9wdGlvbnMNCj4gPiAtCQkgKi8NCj4gPiAtCQljYXNl IE9wdF9zbG9wcHk6DQo+ID4gLQkJCXNsb3BweSA9IDE7DQo+ID4gLQkJCWRmcHJpbnRrKE1PVU5U LCAiTkZTOiAgIHJlbGF4aW5nIHBhcnNpbmcNCj4gPiBydWxlc1xuIik7DQo+ID4gLQkJCWJyZWFr Ow0KPiA+IC0JCWNhc2UgT3B0X3VzZXJzcGFjZToNCj4gPiAtCQljYXNlIE9wdF9kZXByZWNhdGVk Og0KPiA+IC0JCQlkZnByaW50ayhNT1VOVCwgIk5GUzogICBpZ25vcmluZyBtb3VudCBvcHRpb24g Ig0KPiA+IC0JCQkJCSInJXMnXG4iLCBwKTsNCj4gPiAtCQkJYnJlYWs7DQo+ID4gLQ0KPiA+IC0J CWRlZmF1bHQ6DQo+ID4gLQkJCWludmFsaWRfb3B0aW9uID0gMTsNCj4gPiAtCQkJZGZwcmludGso TU9VTlQsICJORlM6ICAgdW5yZWNvZ25pemVkIG1vdW50DQo+ID4gb3B0aW9uICINCj4gPiAtCQkJ CQkiJyVzJ1xuIiwgcCk7DQo+ID4gLQkJfQ0KPiA+IC0JfQ0KPiA+IC0NCj4gPiAtCWlmICghc2xv cHB5ICYmIGludmFsaWRfb3B0aW9uKQ0KPiA+IC0JCXJldHVybiAwOw0KPiA+IC0NCj4gPiAtCWlm IChtbnQtPm1pbm9ydmVyc2lvbiAmJiBtbnQtPnZlcnNpb24gIT0gNCkNCj4gPiAtCQlnb3RvIG91 dF9taW5vcnZlcnNpb25fbWlzbWF0Y2g7DQo+ID4gLQ0KPiA+IC0JaWYgKG1udC0+b3B0aW9ucyAm IE5GU19PUFRJT05fTUlHUkFUSU9OICYmDQo+ID4gLQkgICAgKG1udC0+dmVyc2lvbiAhPSA0IHx8 IG1udC0+bWlub3J2ZXJzaW9uICE9IDApKQ0KPiA+IC0JCWdvdG8gb3V0X21pZ3JhdGlvbl9taXN1 c2U7DQo+ID4gLQ0KPiA+IC0JLyoNCj4gPiAtCSAqIHZlcmlmeSB0aGF0IGFueSBwcm90bz0vbW91 bnRwcm90bz0gb3B0aW9ucyBtYXRjaCB0aGUgYWRkcmVzcw0KPiA+IC0JICogZmFtaWxpZXMgaW4g dGhlIGFkZHI9L21vdW50YWRkcj0gb3B0aW9ucy4NCj4gPiAtCSAqLw0KPiA+IC0JaWYgKHByb3Rv ZmFtaWx5ICE9IEFGX1VOU1BFQyAmJg0KPiA+IC0JICAgIHByb3RvZmFtaWx5ICE9IG1udC0+bmZz X3NlcnZlci5hZGRyZXNzLnNzX2ZhbWlseSkNCj4gPiAtCQlnb3RvIG91dF9wcm90b19taXNtYXRj aDsNCj4gPiAtDQo+ID4gLQlpZiAobW91bnRmYW1pbHkgIT0gQUZfVU5TUEVDKSB7DQo+ID4gLQkJ aWYgKG1udC0+bW91bnRfc2VydmVyLmFkZHJsZW4pIHsNCj4gPiAtCQkJaWYgKG1vdW50ZmFtaWx5 ICE9IG1udC0NCj4gPiA+bW91bnRfc2VydmVyLmFkZHJlc3Muc3NfZmFtaWx5KQ0KPiA+IC0JCQkJ Z290byBvdXRfbW91bnRwcm90b19taXNtYXRjaDsNCj4gPiAtCQl9IGVsc2Ugew0KPiA+IC0JCQlp ZiAobW91bnRmYW1pbHkgIT0gbW50LQ0KPiA+ID5uZnNfc2VydmVyLmFkZHJlc3Muc3NfZmFtaWx5 KQ0KPiA+IC0JCQkJZ290byBvdXRfbW91bnRwcm90b19taXNtYXRjaDsNCj4gPiAtCQl9DQo+ID4g LQl9DQo+ID4gLQ0KPiA+IC0JcmV0dXJuIDE7DQo+ID4gLQ0KPiA+IC1vdXRfbW91bnRwcm90b19t aXNtYXRjaDoNCj4gPiAtCXByaW50ayhLRVJOX0lORk8gIk5GUzogbW91bnQgc2VydmVyIGFkZHJl c3MgZG9lcyBub3QgbWF0Y2gNCj4gPiBtb3VudHByb3RvPSAiDQo+ID4gLQkJCSAib3B0aW9uXG4i KTsNCj4gPiAtCXJldHVybiAwOw0KPiA+IC1vdXRfcHJvdG9fbWlzbWF0Y2g6DQo+ID4gLQlwcmlu dGsoS0VSTl9JTkZPICJORlM6IHNlcnZlciBhZGRyZXNzIGRvZXMgbm90IG1hdGNoIHByb3RvPQ0K PiA+IG9wdGlvblxuIik7DQo+ID4gLQlyZXR1cm4gMDsNCj4gPiAtb3V0X2ludmFsaWRfYWRkcmVz czoNCj4gPiAtCXByaW50ayhLRVJOX0lORk8gIk5GUzogYmFkIElQIGFkZHJlc3Mgc3BlY2lmaWVk OiAlc1xuIiwgcCk7DQo+ID4gLQlyZXR1cm4gMDsNCj4gPiAtb3V0X2ludmFsaWRfdmFsdWU6DQo+ ID4gLQlwcmludGsoS0VSTl9JTkZPICJORlM6IGJhZCBtb3VudCBvcHRpb24gdmFsdWUgc3BlY2lm aWVkOiAlc1xuIiwNCj4gPiBwKTsNCj4gPiAtCXJldHVybiAwOw0KPiA+IC1vdXRfbWlub3J2ZXJz aW9uX21pc21hdGNoOg0KPiA+IC0JcHJpbnRrKEtFUk5fSU5GTyAiTkZTOiBtb3VudCBvcHRpb24g dmVycz0ldSBkb2VzIG5vdCBzdXBwb3J0ICINCj4gPiAtCQkJICJtaW5vcnZlcnNpb249JXVcbiIs IG1udC0+dmVyc2lvbiwgbW50LQ0KPiA+ID5taW5vcnZlcnNpb24pOw0KPiA+IC0JcmV0dXJuIDA7 DQo+ID4gLW91dF9taWdyYXRpb25fbWlzdXNlOg0KPiA+IC0JcHJpbnRrKEtFUk5fSU5GTw0KPiA+ IC0JCSJORlM6ICdtaWdyYXRpb24nIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgTkZTDQo+ID4gdmVy c2lvblxuIik7DQo+ID4gLQlyZXR1cm4gMDsNCj4gPiAtb3V0X25vbWVtOg0KPiA+IC0JcHJpbnRr KEtFUk5fSU5GTyAiTkZTOiBub3QgZW5vdWdoIG1lbW9yeSB0byBwYXJzZSBvcHRpb25cbiIpOw0K PiA+IC0JcmV0dXJuIDA7DQo+ID4gLW91dF9zZWN1cml0eV9mYWlsdXJlOg0KPiA+IC0JcHJpbnRr KEtFUk5fSU5GTyAiTkZTOiBzZWN1cml0eSBvcHRpb25zIGludmFsaWQ6ICVkXG4iLCByYyk7DQo+ ID4gLQlyZXR1cm4gMDsNCj4gPiAtfQ0KPiA+IC0NCj4gPiAvKg0KPiA+ICAqIEVuc3VyZSB0aGF0 IGEgc3BlY2lmaWVkIGF1dGh0eXBlIGluIGFyZ3MtPmF1dGhfaW5mbyBpcyBzdXBwb3J0ZWQNCj4g PiBieQ0KPiA+ICAqIHRoZSBzZXJ2ZXIuIFJldHVybnMgMCBhbmQgc2V0cyBhcmdzLT5zZWxlY3Rl ZF9mbGF2b3IgaWYgaXQncyBvaywNCj4gPiBhbmQNCj4gPiBAQCAtMTkwOCwzMjcgKzkyNSw2IEBA IHN0cnVjdCBkZW50cnkgKm5mc190cnlfbW91bnQoaW50IGZsYWdzLA0KPiA+IGNvbnN0IGNoYXIg KmRldl9uYW1lLA0KPiA+IH0NCj4gPiBFWFBPUlRfU1lNQk9MX0dQTChuZnNfdHJ5X21vdW50KTsN Cj4gPiANCj4gPiAtLyoNCj4gPiAtICogU3BsaXQgImRldl9uYW1lIiBpbnRvICJob3N0bmFtZTpl eHBvcnRfcGF0aCIuDQo+ID4gLSAqDQo+ID4gLSAqIFRoZSBsZWZ0bW9zdCBjb2xvbiBkZW1hcmtz IHRoZSBzcGxpdCBiZXR3ZWVuIHRoZSBzZXJ2ZXIncw0KPiA+IGhvc3RuYW1lDQo+ID4gLSAqIGFu ZCB0aGUgZXhwb3J0IHBhdGguICBJZiB0aGUgaG9zdG5hbWUgc3RhcnRzIHdpdGggYSBsZWZ0IHNx dWFyZQ0KPiA+IC0gKiBicmFja2V0LCB0aGVuIGl0IG1heSBjb250YWluIGNvbG9ucy4NCj4gPiAt ICoNCj4gPiAtICogTm90ZTogY2FsbGVyIGZyZWVzIGhvc3RuYW1lIGFuZCBleHBvcnQgcGF0aCwg ZXZlbiBvbiBlcnJvci4NCj4gPiAtICovDQo+ID4gLXN0YXRpYyBpbnQgbmZzX3BhcnNlX2Rldm5h bWUoY29uc3QgY2hhciAqZGV2X25hbWUsDQo+ID4gLQkJCSAgICAgY2hhciAqKmhvc3RuYW1lLCBz aXplX3QgbWF4bmFtbGVuLA0KPiA+IC0JCQkgICAgIGNoYXIgKipleHBvcnRfcGF0aCwgc2l6ZV90 IG1heHBhdGhsZW4pDQo+ID4gLXsNCj4gPiAtCXNpemVfdCBsZW47DQo+ID4gLQljaGFyICplbmQ7 DQo+ID4gLQ0KPiA+IC0JaWYgKHVubGlrZWx5KCFkZXZfbmFtZSB8fCAhKmRldl9uYW1lKSkgew0K PiA+IC0JCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBkZXZpY2UgbmFtZSBub3Qgc3BlY2lmaWVkXG4i KTsNCj4gPiAtCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiAtCX0NCj4gPiAtDQo+ID4gLQkvKiBJcyB0 aGUgaG9zdCBuYW1lIHByb3RlY3RlZCB3aXRoIHNxdWFyZSBicmFrY2V0cz8gKi8NCj4gPiAtCWlm ICgqZGV2X25hbWUgPT0gJ1snKSB7DQo+ID4gLQkJZW5kID0gc3RyY2hyKCsrZGV2X25hbWUsICdd Jyk7DQo+ID4gLQkJaWYgKGVuZCA9PSBOVUxMIHx8IGVuZFsxXSAhPSAnOicpDQo+ID4gLQkJCWdv dG8gb3V0X2JhZF9kZXZuYW1lOw0KPiA+IC0NCj4gPiAtCQlsZW4gPSBlbmQgLSBkZXZfbmFtZTsN Cj4gPiAtCQllbmQrKzsNCj4gPiAtCX0gZWxzZSB7DQo+ID4gLQkJY2hhciAqY29tbWE7DQo+ID4g LQ0KPiA+IC0JCWVuZCA9IHN0cmNocihkZXZfbmFtZSwgJzonKTsNCj4gPiAtCQlpZiAoZW5kID09 IE5VTEwpDQo+ID4gLQkJCWdvdG8gb3V0X2JhZF9kZXZuYW1lOw0KPiA+IC0JCWxlbiA9IGVuZCAt IGRldl9uYW1lOw0KPiA+IC0NCj4gPiAtCQkvKiBraWxsIHBvc3NpYmxlIGhvc3RuYW1lIGxpc3Q6 IG5vdCBzdXBwb3J0ZWQgKi8NCj4gPiAtCQljb21tYSA9IHN0cmNocihkZXZfbmFtZSwgJywnKTsN Cj4gPiAtCQlpZiAoY29tbWEgIT0gTlVMTCAmJiBjb21tYSA8IGVuZCkNCj4gPiAtCQkJbGVuID0g Y29tbWEgLSBkZXZfbmFtZTsNCj4gPiAtCX0NCj4gPiAtDQo+ID4gLQlpZiAobGVuID4gbWF4bmFt bGVuKQ0KPiA+IC0JCWdvdG8gb3V0X2hvc3RuYW1lOw0KPiA+IC0NCj4gPiAtCS8qIE4uQi4gY2Fs bGVyIHdpbGwgZnJlZSBuZnNfc2VydmVyLmhvc3RuYW1lIGluIGFsbCBjYXNlcyAqLw0KPiA+IC0J Kmhvc3RuYW1lID0ga3N0cm5kdXAoZGV2X25hbWUsIGxlbiwgR0ZQX0tFUk5FTCk7DQo+ID4gLQlp ZiAoKmhvc3RuYW1lID09IE5VTEwpDQo+ID4gLQkJZ290byBvdXRfbm9tZW07DQo+ID4gLQlsZW4g PSBzdHJsZW4oKytlbmQpOw0KPiA+IC0JaWYgKGxlbiA+IG1heHBhdGhsZW4pDQo+ID4gLQkJZ290 byBvdXRfcGF0aDsNCj4gPiAtCSpleHBvcnRfcGF0aCA9IGtzdHJuZHVwKGVuZCwgbGVuLCBHRlBf S0VSTkVMKTsNCj4gPiAtCWlmICghKmV4cG9ydF9wYXRoKQ0KPiA+IC0JCWdvdG8gb3V0X25vbWVt Ow0KPiA+IC0NCj4gPiAtCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBNTlRQQVRIOiAnJXMnXG4iLCAq ZXhwb3J0X3BhdGgpOw0KPiA+IC0JcmV0dXJuIDA7DQo+ID4gLQ0KPiA+IC1vdXRfYmFkX2Rldm5h bWU6DQo+ID4gLQlkZnByaW50ayhNT1VOVCwgIk5GUzogZGV2aWNlIG5hbWUgbm90IGluIGhvc3Q6 cGF0aCBmb3JtYXRcbiIpOw0KPiA+IC0JcmV0dXJuIC1FSU5WQUw7DQo+ID4gLQ0KPiA+IC1vdXRf bm9tZW06DQo+ID4gLQlkZnByaW50ayhNT1VOVCwgIk5GUzogbm90IGVub3VnaCBtZW1vcnkgdG8g cGFyc2UgZGV2aWNlDQo+ID4gbmFtZVxuIik7DQo+ID4gLQlyZXR1cm4gLUVOT01FTTsNCj4gPiAt DQo+ID4gLW91dF9ob3N0bmFtZToNCj4gPiAtCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBzZXJ2ZXIg aG9zdG5hbWUgdG9vIGxvbmdcbiIpOw0KPiA+IC0JcmV0dXJuIC1FTkFNRVRPT0xPTkc7DQo+ID4g LQ0KPiA+IC1vdXRfcGF0aDoNCj4gPiAtCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBleHBvcnQgcGF0 aG5hbWUgdG9vIGxvbmdcbiIpOw0KPiA+IC0JcmV0dXJuIC1FTkFNRVRPT0xPTkc7DQo+ID4gLX0N Cj4gPiAtDQo+ID4gLS8qDQo+ID4gLSAqIFZhbGlkYXRlIHRoZSBORlMyL05GUzMgbW91bnQgZGF0 YQ0KPiA+IC0gKiAtIGZpbGxzIGluIHRoZSBtb3VudCByb290IGZpbGVoYW5kbGUNCj4gPiAtICoN Cj4gPiAtICogRm9yIG9wdGlvbiBzdHJpbmdzLCB1c2VyIHNwYWNlIGhhbmRsZXMgdGhlIGZvbGxv d2luZyBiZWhhdmlvcnM6DQo+ID4gLSAqDQo+ID4gLSAqICsgRE5TOiBtYXBwaW5nIHNlcnZlciBo b3N0IG5hbWUgdG8gSVAgYWRkcmVzcyAoImFkZHI9IiBvcHRpb24pDQo+ID4gLSAqDQo+ID4gLSAq ICsgZmFpbHVyZSBtb2RlOiBob3cgdG8gYmVoYXZlIGlmIGEgbW91bnQgcmVxdWVzdCBjYW4ndCBi ZQ0KPiA+IGhhbmRsZWQNCj4gPiAtICogICBpbW1lZGlhdGVseSAoImZnL2JnIiBvcHRpb24pDQo+ ID4gLSAqDQo+ID4gLSAqICsgcmV0cnk6IGhvdyBvZnRlbiB0byByZXRyeSBhIG1vdW50IHJlcXVl c3QgKCJyZXRyeT0iIG9wdGlvbikNCj4gPiAtICoNCj4gPiAtICogKyBicmVha2luZyBiYWNrOiB0 cnlpbmcgcHJvdG89dWRwIGFmdGVyIHByb3RvPXRjcCwgdjIgYWZ0ZXIgdjMsDQo+ID4gLSAqICAg bW91bnRwcm90bz10Y3AgYWZ0ZXIgbW91bnRwcm90bz11ZHAsIGFuZCBzbyBvbg0KPiA+IC0gKi8N Cj4gPiAtc3RhdGljIGludCBuZnMyM192YWxpZGF0ZV9tb3VudF9kYXRhKHZvaWQgKm9wdGlvbnMs DQo+ID4gLQkJCQkgICAgIHN0cnVjdCBuZnNfcGFyc2VkX21vdW50X2RhdGENCj4gPiAqYXJncywN Cj4gPiAtCQkJCSAgICAgc3RydWN0IG5mc19maCAqbW50ZmgsDQo+ID4gLQkJCQkgICAgIGNvbnN0 IGNoYXIgKmRldl9uYW1lKQ0KPiA+IC17DQo+ID4gLQlzdHJ1Y3QgbmZzX21vdW50X2RhdGEgKmRh dGEgPSAoc3RydWN0IG5mc19tb3VudF9kYXRhICopb3B0aW9uczsNCj4gPiAtCXN0cnVjdCBzb2Nr YWRkciAqc2FwID0gKHN0cnVjdCBzb2NrYWRkciAqKSZhcmdzLQ0KPiA+ID5uZnNfc2VydmVyLmFk ZHJlc3M7DQo+ID4gLQlpbnQgZXh0cmFfZmxhZ3MgPSBORlNfTU9VTlRfTEVHQUNZX0lOVEVSRkFD RTsNCj4gPiAtDQo+ID4gLQlpZiAoZGF0YSA9PSBOVUxMKQ0KPiA+IC0JCWdvdG8gb3V0X25vX2Rh dGE7DQo+ID4gLQ0KPiA+IC0JYXJncy0+dmVyc2lvbiA9IE5GU19ERUZBVUxUX1ZFUlNJT047DQo+ ID4gLQlzd2l0Y2ggKGRhdGEtPnZlcnNpb24pIHsNCj4gPiAtCWNhc2UgMToNCj4gPiAtCQlkYXRh LT5uYW1sZW4gPSAwOyAvKiBmYWxsIHRocm91Z2ggKi8NCj4gPiAtCWNhc2UgMjoNCj4gPiAtCQlk YXRhLT5ic2l6ZSA9IDA7IC8qIGZhbGwgdGhyb3VnaCAqLw0KPiA+IC0JY2FzZSAzOg0KPiA+IC0J CWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKQ0KPiA+IC0JCQlnb3RvIG91dF9ub192 MzsNCj4gPiAtCQlkYXRhLT5yb290LnNpemUgPSBORlMyX0ZIU0laRTsNCj4gPiAtCQltZW1jcHko ZGF0YS0+cm9vdC5kYXRhLCBkYXRhLT5vbGRfcm9vdC5kYXRhLA0KPiA+IE5GUzJfRkhTSVpFKTsN Cj4gPiAtCQkvKiBUdXJuIG9mZiBzZWN1cml0eSBuZWdvdGlhdGlvbiAqLw0KPiA+IC0JCWV4dHJh X2ZsYWdzIHw9IE5GU19NT1VOVF9TRUNGTEFWT1VSOw0KPiA+IC0JCS8qIGZhbGwgdGhyb3VnaCAq Lw0KPiA+IC0JY2FzZSA0Og0KPiA+IC0JCWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9TRUNG TEFWT1VSKQ0KPiA+IC0JCQlnb3RvIG91dF9ub19zZWM7DQo+ID4gLQkJLyogZmFsbCB0aHJvdWdo ICovDQo+ID4gLQljYXNlIDU6DQo+ID4gLQkJbWVtc2V0KGRhdGEtPmNvbnRleHQsIDAsIHNpemVv ZihkYXRhLT5jb250ZXh0KSk7DQo+ID4gLQkJLyogZmFsbCB0aHJvdWdoICovDQo+ID4gLQljYXNl IDY6DQo+ID4gLQkJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsNCj4gPiAtCQkJ aWYgKGRhdGEtPnJvb3Quc2l6ZSA+IE5GUzNfRkhTSVpFIHx8IGRhdGEtDQo+ID4gPnJvb3Quc2l6 ZSA9PSAwKQ0KPiA+IC0JCQkJZ290byBvdXRfaW52YWxpZF9maDsNCj4gPiAtCQkJbW50ZmgtPnNp emUgPSBkYXRhLT5yb290LnNpemU7DQo+ID4gLQkJCWFyZ3MtPnZlcnNpb24gPSAzOw0KPiA+IC0J CX0gZWxzZSB7DQo+ID4gLQkJCW1udGZoLT5zaXplID0gTkZTMl9GSFNJWkU7DQo+ID4gLQkJCWFy Z3MtPnZlcnNpb24gPSAyOw0KPiA+IC0JCX0NCj4gPiAtDQo+ID4gLQ0KPiA+IC0JCW1lbWNweSht bnRmaC0+ZGF0YSwgZGF0YS0+cm9vdC5kYXRhLCBtbnRmaC0+c2l6ZSk7DQo+ID4gLQkJaWYgKG1u dGZoLT5zaXplIDwgc2l6ZW9mKG1udGZoLT5kYXRhKSkNCj4gPiAtCQkJbWVtc2V0KG1udGZoLT5k YXRhICsgbW50ZmgtPnNpemUsIDAsDQo+ID4gLQkJCSAgICAgICBzaXplb2YobW50ZmgtPmRhdGEp IC0gbW50ZmgtPnNpemUpOw0KPiA+IC0NCj4gPiAtCQkvKg0KPiA+IC0JCSAqIFRyYW5zbGF0ZSB0 byBuZnNfcGFyc2VkX21vdW50X2RhdGEsIHdoaWNoDQo+ID4gbmZzX2ZpbGxfc3VwZXINCj4gPiAt CQkgKiBjYW4gZGVhbCB3aXRoLg0KPiA+IC0JCSAqLw0KPiA+IC0JCWFyZ3MtPmZsYWdzCQk9IGRh dGEtPmZsYWdzICYgTkZTX01PVU5UX0ZMQUdNQVNLOw0KPiA+IC0JCWFyZ3MtPmZsYWdzCQl8PSBl eHRyYV9mbGFnczsNCj4gPiAtCQlhcmdzLT5yc2l6ZQkJPSBkYXRhLT5yc2l6ZTsNCj4gPiAtCQlh cmdzLT53c2l6ZQkJPSBkYXRhLT53c2l6ZTsNCj4gPiAtCQlhcmdzLT50aW1lbwkJPSBkYXRhLT50 aW1lbzsNCj4gPiAtCQlhcmdzLT5yZXRyYW5zCQk9IGRhdGEtPnJldHJhbnM7DQo+ID4gLQkJYXJn cy0+YWNyZWdtaW4JCT0gZGF0YS0+YWNyZWdtaW47DQo+ID4gLQkJYXJncy0+YWNyZWdtYXgJCT0g ZGF0YS0+YWNyZWdtYXg7DQo+ID4gLQkJYXJncy0+YWNkaXJtaW4JCT0gZGF0YS0+YWNkaXJtaW47 DQo+ID4gLQkJYXJncy0+YWNkaXJtYXgJCT0gZGF0YS0+YWNkaXJtYXg7DQo+ID4gLQkJYXJncy0+ bmVlZF9tb3VudAk9IGZhbHNlOw0KPiA+IC0NCj4gPiAtCQltZW1jcHkoc2FwLCAmZGF0YS0+YWRk ciwgc2l6ZW9mKGRhdGEtPmFkZHIpKTsNCj4gPiAtCQlhcmdzLT5uZnNfc2VydmVyLmFkZHJsZW4g PSBzaXplb2YoZGF0YS0+YWRkcik7DQo+ID4gLQkJYXJncy0+bmZzX3NlcnZlci5wb3J0ID0gbnRv aHMoZGF0YS0+YWRkci5zaW5fcG9ydCk7DQo+ID4gLQkJaWYgKHNhcC0+c2FfZmFtaWx5ICE9IEFG X0lORVQgfHwNCj4gPiAtCQkgICAgIW5mc192ZXJpZnlfc2VydmVyX2FkZHJlc3Moc2FwKSkNCj4g PiAtCQkJZ290byBvdXRfbm9fYWRkcmVzczsNCj4gPiAtDQo+ID4gLQkJaWYgKCEoZGF0YS0+Zmxh Z3MgJiBORlNfTU9VTlRfVENQKSkNCj4gPiAtCQkJYXJncy0+bmZzX3NlcnZlci5wcm90b2NvbCA9 IFhQUlRfVFJBTlNQT1JUX1VEUDsNCj4gPiAtCQkvKiBOLkIuIGNhbGxlciB3aWxsIGZyZWUgbmZz X3NlcnZlci5ob3N0bmFtZSBpbiBhbGwNCj4gPiBjYXNlcyAqLw0KPiA+IC0JCWFyZ3MtPm5mc19z ZXJ2ZXIuaG9zdG5hbWUgPSBrc3RyZHVwKGRhdGEtPmhvc3RuYW1lLA0KPiA+IEdGUF9LRVJORUwp Ow0KPiA+IC0JCWFyZ3MtPm5hbWxlbgkJPSBkYXRhLT5uYW1sZW47DQo+ID4gLQkJYXJncy0+YnNp emUJCT0gZGF0YS0+YnNpemU7DQo+ID4gLQ0KPiA+IC0JCWlmIChkYXRhLT5mbGFncyAmIE5GU19N T1VOVF9TRUNGTEFWT1VSKQ0KPiA+IC0JCQlhcmdzLT5zZWxlY3RlZF9mbGF2b3IgPSBkYXRhLT5w c2V1ZG9mbGF2b3I7DQo+ID4gLQkJZWxzZQ0KPiA+IC0JCQlhcmdzLT5zZWxlY3RlZF9mbGF2b3Ig PSBSUENfQVVUSF9VTklYOw0KPiA+IC0JCWlmICghYXJncy0+bmZzX3NlcnZlci5ob3N0bmFtZSkN Cj4gPiAtCQkJZ290byBvdXRfbm9tZW07DQo+ID4gLQ0KPiA+IC0JCWlmICghKGRhdGEtPmZsYWdz ICYgTkZTX01PVU5UX05PTkxNKSkNCj4gPiAtCQkJYXJncy0+ZmxhZ3MgJj0gfihORlNfTU9VTlRf TE9DQUxfRkxPQ0t8DQo+ID4gLQkJCQkJIE5GU19NT1VOVF9MT0NBTF9GQ05UTCk7DQo+ID4gLQkJ ZWxzZQ0KPiA+IC0JCQlhcmdzLT5mbGFncyB8PSAoTkZTX01PVU5UX0xPQ0FMX0ZMT0NLfA0KPiA+ IC0JCQkJCU5GU19NT1VOVF9MT0NBTF9GQ05UTCk7DQo+ID4gLQkJLyoNCj4gPiAtCQkgKiBUaGUg bGVnYWN5IHZlcnNpb24gNiBiaW5hcnkgbW91bnQgZGF0YSBmcm9tDQo+ID4gdXNlcnNwYWNlIGhh cyBhDQo+ID4gLQkJICogZmllbGQgdXNlZCBvbmx5IHRvIHRyYW5zcG9ydCBzZWxpbnV4IGluZm9y bWF0aW9uDQo+ID4gaW50byB0aGUNCj4gPiAtCQkgKiB0aGUga2VybmVsLiAgVG8gY29udGludWUg dG8gc3VwcG9ydCB0aGF0DQo+ID4gZnVuY3Rpb25hbGl0eSB3ZQ0KPiA+IC0JCSAqIGhhdmUgYSB0 b3VjaCBvZiBzZWxpbnV4IGtub3dsZWRnZSBoZXJlIGluIHRoZSBORlMNCj4gPiBjb2RlLiBUaGUN Cj4gPiAtCQkgKiB1c2Vyc3BhY2UgY29kZSBjb252ZXJ0ZWQgY29udGV4dD1ibGFoIHRvIGp1c3Qg YmxhaA0KPiA+IHNvIHdlIGFyZQ0KPiA+IC0JCSAqIGNvbnZlcnRpbmcgYmFjayB0byB0aGUgZnVs bCBzdHJpbmcgc2VsaW51eA0KPiA+IHVuZGVyc3RhbmRzLg0KPiA+IC0JCSAqLw0KPiA+IC0JCWlm IChkYXRhLT5jb250ZXh0WzBdKXsNCj4gPiAtI2lmZGVmIENPTkZJR19TRUNVUklUWV9TRUxJTlVY DQo+ID4gLQkJCWludCByYzsNCj4gPiAtCQkJZGF0YS0+Y29udGV4dFtORlNfTUFYX0NPTlRFWFRf TEVOXSA9ICdcMCc7DQo+ID4gLQkJCXJjID0gc2VjdXJpdHlfYWRkX21udF9vcHQoImNvbnRleHQi LCBkYXRhLQ0KPiA+ID5jb250ZXh0LA0KPiA+IC0JCQkJCXN0cmxlbihkYXRhLT5jb250ZXh0KSwg JmFyZ3MtDQo+ID4gPmxzbV9vcHRzKTsNCj4gPiAtCQkJaWYgKHJjKQ0KPiA+IC0JCQkJcmV0dXJu IHJjOw0KPiA+IC0jZWxzZQ0KPiA+IC0JCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiAtI2VuZGlmDQo+ ID4gLQkJfQ0KPiA+IC0NCj4gPiAtCQlicmVhazsNCj4gPiAtCWRlZmF1bHQ6DQo+ID4gLQkJcmV0 dXJuIE5GU19URVhUX0RBVEE7DQo+ID4gLQl9DQo+ID4gLQ0KPiA+IC0JcmV0dXJuIDA7DQo+ID4g LQ0KPiA+IC1vdXRfbm9fZGF0YToNCj4gPiAtCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBtb3VudCBw cm9ncmFtIGRpZG4ndCBwYXNzIGFueSBtb3VudA0KPiA+IGRhdGFcbiIpOw0KPiA+IC0JcmV0dXJu IC1FSU5WQUw7DQo+ID4gLQ0KPiA+IC1vdXRfbm9fdjM6DQo+ID4gLQlkZnByaW50ayhNT1VOVCwg Ik5GUzogbmZzX21vdW50X2RhdGEgdmVyc2lvbiAlZCBkb2VzIG5vdA0KPiA+IHN1cHBvcnQgdjNc biIsDQo+ID4gLQkJIGRhdGEtPnZlcnNpb24pOw0KPiA+IC0JcmV0dXJuIC1FSU5WQUw7DQo+ID4g LQ0KPiA+IC1vdXRfbm9fc2VjOg0KPiA+IC0JZGZwcmludGsoTU9VTlQsICJORlM6IG5mc19tb3Vu dF9kYXRhIHZlcnNpb24gc3VwcG9ydHMgb25seQ0KPiA+IEFVVEhfU1lTXG4iKTsNCj4gPiAtCXJl dHVybiAtRUlOVkFMOw0KPiA+IC0NCj4gPiAtb3V0X25vbWVtOg0KPiA+IC0JZGZwcmludGsoTU9V TlQsICJORlM6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBtb3VudA0KPiA+IG9wdGlvbnNc biIpOw0KPiA+IC0JcmV0dXJuIC1FTk9NRU07DQo+ID4gLQ0KPiA+IC1vdXRfbm9fYWRkcmVzczoN Cj4gPiAtCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBtb3VudCBwcm9ncmFtIGRpZG4ndCBwYXNzIHJl bW90ZQ0KPiA+IGFkZHJlc3NcbiIpOw0KPiA+IC0JcmV0dXJuIC1FSU5WQUw7DQo+ID4gLQ0KPiA+ IC1vdXRfaW52YWxpZF9maDoNCj4gPiAtCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBpbnZhbGlkIHJv b3QgZmlsZWhhbmRsZVxuIik7DQo+ID4gLQlyZXR1cm4gLUVJTlZBTDsNCj4gPiAtfQ0KPiA+IC0N Cj4gPiAtI2lmIElTX0VOQUJMRUQoQ09ORklHX05GU19WNCkNCj4gPiAtc3RhdGljIGludCBuZnNf dmFsaWRhdGVfbW91bnRfZGF0YShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZQ0KPiA+ICpmc190eXBl LA0KPiA+IC0JCQkJICAgdm9pZCAqb3B0aW9ucywNCj4gPiAtCQkJCSAgIHN0cnVjdCBuZnNfcGFy c2VkX21vdW50X2RhdGEgKmFyZ3MsDQo+ID4gLQkJCQkgICBzdHJ1Y3QgbmZzX2ZoICptbnRmaCwN Cj4gPiAtCQkJCSAgIGNvbnN0IGNoYXIgKmRldl9uYW1lKQ0KPiA+IC17DQo+ID4gLQlpZiAoZnNf dHlwZSA9PSAmbmZzX2ZzX3R5cGUpDQo+ID4gLQkJcmV0dXJuIG5mczIzX3ZhbGlkYXRlX21vdW50 X2RhdGEob3B0aW9ucywgYXJncywgbW50ZmgsDQo+ID4gZGV2X25hbWUpOw0KPiA+IC0JcmV0dXJu IG5mczRfdmFsaWRhdGVfbW91bnRfZGF0YShvcHRpb25zLCBhcmdzLCBkZXZfbmFtZSk7DQo+ID4g LX0NCj4gPiAtI2Vsc2UNCj4gPiAtc3RhdGljIGludCBuZnNfdmFsaWRhdGVfbW91bnRfZGF0YShz dHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZQ0KPiA+ICpmc190eXBlLA0KPiA+IC0JCQkJICAgdm9pZCAq b3B0aW9ucywNCj4gPiAtCQkJCSAgIHN0cnVjdCBuZnNfcGFyc2VkX21vdW50X2RhdGEgKmFyZ3Ms DQo+ID4gLQkJCQkgICBzdHJ1Y3QgbmZzX2ZoICptbnRmaCwNCj4gPiAtCQkJCSAgIGNvbnN0IGNo YXIgKmRldl9uYW1lKQ0KPiA+IC17DQo+ID4gLQlyZXR1cm4gbmZzMjNfdmFsaWRhdGVfbW91bnRf ZGF0YShvcHRpb25zLCBhcmdzLCBtbnRmaCwNCj4gPiBkZXZfbmFtZSk7DQo+ID4gLX0NCj4gPiAt I2VuZGlmDQo+ID4gLQ0KPiA+IC1zdGF0aWMgaW50IG5mc192YWxpZGF0ZV90ZXh0X21vdW50X2Rh dGEodm9pZCAqb3B0aW9ucywNCj4gPiAtCQkJCQlzdHJ1Y3QgbmZzX3BhcnNlZF9tb3VudF9kYXRh DQo+ID4gKmFyZ3MsDQo+ID4gLQkJCQkJY29uc3QgY2hhciAqZGV2X25hbWUpDQo+ID4gLXsNCj4g PiAtCWludCBwb3J0ID0gMDsNCj4gPiAtCWludCBtYXhfbmFtZWxlbiA9IFBBR0VfU0laRTsNCj4g PiAtCWludCBtYXhfcGF0aGxlbiA9IE5GU19NQVhQQVRITEVOOw0KPiA+IC0Jc3RydWN0IHNvY2th ZGRyICpzYXAgPSAoc3RydWN0IHNvY2thZGRyICopJmFyZ3MtDQo+ID4gPm5mc19zZXJ2ZXIuYWRk cmVzczsNCj4gPiAtDQo+ID4gLQlpZiAobmZzX3BhcnNlX21vdW50X29wdGlvbnMoKGNoYXIgKilv cHRpb25zLCBhcmdzKSA9PSAwKQ0KPiA+IC0JCXJldHVybiAtRUlOVkFMOw0KPiA+IC0NCj4gPiAt CWlmICghbmZzX3ZlcmlmeV9zZXJ2ZXJfYWRkcmVzcyhzYXApKQ0KPiA+IC0JCWdvdG8gb3V0X25v X2FkZHJlc3M7DQo+ID4gLQ0KPiA+IC0JaWYgKGFyZ3MtPnZlcnNpb24gPT0gNCkgew0KPiA+IC0j aWYgSVNfRU5BQkxFRChDT05GSUdfTkZTX1Y0KQ0KPiA+IC0JCWlmIChhcmdzLT5uZnNfc2VydmVy LnByb3RvY29sID09IFhQUlRfVFJBTlNQT1JUX1JETUEpDQo+ID4gLQkJCXBvcnQgPSBORlNfUkRN QV9QT1JUOw0KPiA+IC0JCWVsc2UNCj4gPiAtCQkJcG9ydCA9IE5GU19QT1JUOw0KPiA+IC0JCW1h eF9uYW1lbGVuID0gTkZTNF9NQVhOQU1MRU47DQo+ID4gLQkJbWF4X3BhdGhsZW4gPSBORlM0X01B WFBBVEhMRU47DQo+ID4gLQkJbmZzX3ZhbGlkYXRlX3RyYW5zcG9ydF9wcm90b2NvbChhcmdzKTsN Cj4gPiAtCQlpZiAoYXJncy0+bmZzX3NlcnZlci5wcm90b2NvbCA9PSBYUFJUX1RSQU5TUE9SVF9V RFApDQo+ID4gLQkJCWdvdG8gb3V0X2ludmFsaWRfdHJhbnNwb3J0X3VkcDsNCj4gPiAtCQluZnM0 X3ZhbGlkYXRlX21vdW50X2ZsYWdzKGFyZ3MpOw0KPiA+IC0jZWxzZQ0KPiA+IC0JCWdvdG8gb3V0 X3Y0X25vdF9jb21waWxlZDsNCj4gPiAtI2VuZGlmIC8qIENPTkZJR19ORlNfVjQgKi8NCj4gPiAt CX0gZWxzZSB7DQo+ID4gLQkJbmZzX3NldF9tb3VudF90cmFuc3BvcnRfcHJvdG9jb2woYXJncyk7 DQo+ID4gLQkJaWYgKGFyZ3MtPm5mc19zZXJ2ZXIucHJvdG9jb2wgPT0gWFBSVF9UUkFOU1BPUlRf UkRNQSkNCj4gPiAtCQkJcG9ydCA9IE5GU19SRE1BX1BPUlQ7DQo+ID4gLQl9DQo+ID4gLQ0KPiA+ IC0JbmZzX3NldF9wb3J0KHNhcCwgJmFyZ3MtPm5mc19zZXJ2ZXIucG9ydCwgcG9ydCk7DQo+ID4g LQ0KPiA+IC0JcmV0dXJuIG5mc19wYXJzZV9kZXZuYW1lKGRldl9uYW1lLA0KPiA+IC0JCQkJICAg JmFyZ3MtPm5mc19zZXJ2ZXIuaG9zdG5hbWUsDQo+ID4gLQkJCQkgICBtYXhfbmFtZWxlbiwNCj4g PiAtCQkJCSAgICZhcmdzLT5uZnNfc2VydmVyLmV4cG9ydF9wYXRoLA0KPiA+IC0JCQkJICAgbWF4 X3BhdGhsZW4pOw0KPiA+IC0NCj4gPiAtI2lmICFJU19FTkFCTEVEKENPTkZJR19ORlNfVjQpDQo+ ID4gLW91dF92NF9ub3RfY29tcGlsZWQ6DQo+ID4gLQlkZnByaW50ayhNT1VOVCwgIk5GUzogTkZT djQgaXMgbm90IGNvbXBpbGVkIGludG8ga2VybmVsXG4iKTsNCj4gPiAtCXJldHVybiAtRVBST1RP Tk9TVVBQT1JUOw0KPiA+IC0jZWxzZQ0KPiA+IC1vdXRfaW52YWxpZF90cmFuc3BvcnRfdWRwOg0K PiA+IC0JZGZwcmludGsoTU9VTlQsICJORlN2NDogVW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHByb3Rv Y29sIHVkcFxuIik7DQo+ID4gLQlyZXR1cm4gLUVJTlZBTDsNCj4gPiAtI2VuZGlmIC8qICFDT05G SUdfTkZTX1Y0ICovDQo+ID4gLQ0KPiA+IC1vdXRfbm9fYWRkcmVzczoNCj4gPiAtCWRmcHJpbnRr KE1PVU5ULCAiTkZTOiBtb3VudCBwcm9ncmFtIGRpZG4ndCBwYXNzIHJlbW90ZQ0KPiA+IGFkZHJl c3NcbiIpOw0KPiA+IC0JcmV0dXJuIC1FSU5WQUw7DQo+ID4gLX0NCj4gPiAtDQo+ID4gI2RlZmlu ZSBORlNfUkVNT1VOVF9DTVBfRkxBR01BU0sgfihORlNfTU9VTlRfSU5UUiBcDQo+ID4gCQl8IE5G U19NT1VOVF9TRUNVUkUgXA0KPiA+IAkJfCBORlNfTU9VTlRfVENQIFwNCj4gPiBAQCAtMjcxOSwx MTMgKzE0MTUsNiBAQCBuZnNfcHJlcGFyZWRfbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUN Cj4gPiAqZnNfdHlwZSwgaW50IGZsYWdzLA0KPiA+IA0KPiA+ICNpZiBJU19FTkFCTEVEKENPTkZJ R19ORlNfVjQpDQo+ID4gDQo+ID4gLXN0YXRpYyB2b2lkIG5mczRfdmFsaWRhdGVfbW91bnRfZmxh Z3Moc3RydWN0IG5mc19wYXJzZWRfbW91bnRfZGF0YQ0KPiA+ICphcmdzKQ0KPiA+IC17DQo+ID4g LQlhcmdzLT5mbGFncyAmPQ0KPiA+IH4oTkZTX01PVU5UX05PTkxNfE5GU19NT1VOVF9OT0FDTHxO RlNfTU9VTlRfVkVSM3wNCj4gPiAtCQkJIE5GU19NT1VOVF9MT0NBTF9GTE9DS3xORlNfTU9VTlRf TE9DQUxfRkNOVEwpOw0KPiA+IC19DQo+ID4gLQ0KPiA+IC0vKg0KPiA+IC0gKiBWYWxpZGF0ZSBO RlN2NCBtb3VudCBvcHRpb25zDQo+ID4gLSAqLw0KPiA+IC1zdGF0aWMgaW50IG5mczRfdmFsaWRh dGVfbW91bnRfZGF0YSh2b2lkICpvcHRpb25zLA0KPiA+IC0JCQkJICAgIHN0cnVjdCBuZnNfcGFy c2VkX21vdW50X2RhdGEgKmFyZ3MsDQo+ID4gLQkJCQkgICAgY29uc3QgY2hhciAqZGV2X25hbWUp DQo+ID4gLXsNCj4gPiAtCXN0cnVjdCBzb2NrYWRkciAqc2FwID0gKHN0cnVjdCBzb2NrYWRkciAq KSZhcmdzLQ0KPiA+ID5uZnNfc2VydmVyLmFkZHJlc3M7DQo+ID4gLQlzdHJ1Y3QgbmZzNF9tb3Vu dF9kYXRhICpkYXRhID0gKHN0cnVjdCBuZnM0X21vdW50X2RhdGENCj4gPiAqKW9wdGlvbnM7DQo+ ID4gLQljaGFyICpjOw0KPiA+IC0NCj4gPiAtCWlmIChkYXRhID09IE5VTEwpDQo+ID4gLQkJZ290 byBvdXRfbm9fZGF0YTsNCj4gPiAtDQo+ID4gLQlhcmdzLT52ZXJzaW9uID0gNDsNCj4gPiAtDQo+ ID4gLQlzd2l0Y2ggKGRhdGEtPnZlcnNpb24pIHsNCj4gPiAtCWNhc2UgMToNCj4gPiAtCQlpZiAo ZGF0YS0+aG9zdF9hZGRybGVuID4gc2l6ZW9mKGFyZ3MtDQo+ID4gPm5mc19zZXJ2ZXIuYWRkcmVz cykpDQo+ID4gLQkJCWdvdG8gb3V0X25vX2FkZHJlc3M7DQo+ID4gLQkJaWYgKGRhdGEtPmhvc3Rf YWRkcmxlbiA9PSAwKQ0KPiA+IC0JCQlnb3RvIG91dF9ub19hZGRyZXNzOw0KPiA+IC0JCWFyZ3Mt Pm5mc19zZXJ2ZXIuYWRkcmxlbiA9IGRhdGEtPmhvc3RfYWRkcmxlbjsNCj4gPiAtCQlpZiAoY29w eV9mcm9tX3VzZXIoc2FwLCBkYXRhLT5ob3N0X2FkZHIsIGRhdGEtDQo+ID4gPmhvc3RfYWRkcmxl bikpDQo+ID4gLQkJCXJldHVybiAtRUZBVUxUOw0KPiA+IC0JCWlmICghbmZzX3ZlcmlmeV9zZXJ2 ZXJfYWRkcmVzcyhzYXApKQ0KPiA+IC0JCQlnb3RvIG91dF9ub19hZGRyZXNzOw0KPiA+IC0JCWFy Z3MtPm5mc19zZXJ2ZXIucG9ydCA9IG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luDQo+ID4gKilz YXApLT5zaW5fcG9ydCk7DQo+ID4gLQ0KPiA+IC0JCWlmIChkYXRhLT5hdXRoX2ZsYXZvdXJsZW4p IHsNCj4gPiAtCQkJcnBjX2F1dGhmbGF2b3JfdCBwc2V1ZG9mbGF2b3I7DQo+ID4gLQkJCWlmIChk YXRhLT5hdXRoX2ZsYXZvdXJsZW4gPiAxKQ0KPiA+IC0JCQkJZ290byBvdXRfaW52YWxfYXV0aDsN Cj4gPiAtCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwc2V1ZG9mbGF2b3IsDQo+ID4gLQkJCQkJICAg ZGF0YS0+YXV0aF9mbGF2b3VycywNCj4gPiAtCQkJCQkgICBzaXplb2YocHNldWRvZmxhdm9yKSkp DQo+ID4gLQkJCQlyZXR1cm4gLUVGQVVMVDsNCj4gPiAtCQkJYXJncy0+c2VsZWN0ZWRfZmxhdm9y ID0gcHNldWRvZmxhdm9yOw0KPiA+IC0JCX0gZWxzZQ0KPiA+IC0JCQlhcmdzLT5zZWxlY3RlZF9m bGF2b3IgPSBSUENfQVVUSF9VTklYOw0KPiA+IC0NCj4gPiAtCQljID0gc3RybmR1cF91c2VyKGRh dGEtPmhvc3RuYW1lLmRhdGEsIE5GUzRfTUFYTkFNTEVOKTsNCj4gPiAtCQlpZiAoSVNfRVJSKGMp KQ0KPiA+IC0JCQlyZXR1cm4gUFRSX0VSUihjKTsNCj4gPiAtCQlhcmdzLT5uZnNfc2VydmVyLmhv c3RuYW1lID0gYzsNCj4gPiAtDQo+ID4gLQkJYyA9IHN0cm5kdXBfdXNlcihkYXRhLT5tbnRfcGF0 aC5kYXRhLCBORlM0X01BWFBBVEhMRU4pOw0KPiA+IC0JCWlmIChJU19FUlIoYykpDQo+ID4gLQkJ CXJldHVybiBQVFJfRVJSKGMpOw0KPiA+IC0JCWFyZ3MtPm5mc19zZXJ2ZXIuZXhwb3J0X3BhdGgg PSBjOw0KPiA+IC0JCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBNTlRQQVRIOiAnJXMnXG4iLCBjKTsN Cj4gPiAtDQo+ID4gLQkJYyA9IHN0cm5kdXBfdXNlcihkYXRhLT5jbGllbnRfYWRkci5kYXRhLCAx Nik7DQo+ID4gLQkJaWYgKElTX0VSUihjKSkNCj4gPiAtCQkJcmV0dXJuIFBUUl9FUlIoYyk7DQo+ ID4gLQkJYXJncy0+Y2xpZW50X2FkZHJlc3MgPSBjOw0KPiA+IC0NCj4gPiAtCQkvKg0KPiA+IC0J CSAqIFRyYW5zbGF0ZSB0byBuZnNfcGFyc2VkX21vdW50X2RhdGEsIHdoaWNoDQo+ID4gbmZzNF9m aWxsX3N1cGVyDQo+ID4gLQkJICogY2FuIGRlYWwgd2l0aC4NCj4gPiAtCQkgKi8NCj4gPiAtDQo+ ID4gLQkJYXJncy0+ZmxhZ3MJPSBkYXRhLT5mbGFncyAmIE5GUzRfTU9VTlRfRkxBR01BU0s7DQo+ ID4gLQkJYXJncy0+cnNpemUJPSBkYXRhLT5yc2l6ZTsNCj4gPiAtCQlhcmdzLT53c2l6ZQk9IGRh dGEtPndzaXplOw0KPiA+IC0JCWFyZ3MtPnRpbWVvCT0gZGF0YS0+dGltZW87DQo+ID4gLQkJYXJn cy0+cmV0cmFucwk9IGRhdGEtPnJldHJhbnM7DQo+ID4gLQkJYXJncy0+YWNyZWdtaW4JPSBkYXRh LT5hY3JlZ21pbjsNCj4gPiAtCQlhcmdzLT5hY3JlZ21heAk9IGRhdGEtPmFjcmVnbWF4Ow0KPiA+ IC0JCWFyZ3MtPmFjZGlybWluCT0gZGF0YS0+YWNkaXJtaW47DQo+ID4gLQkJYXJncy0+YWNkaXJt YXgJPSBkYXRhLT5hY2Rpcm1heDsNCj4gPiAtCQlhcmdzLT5uZnNfc2VydmVyLnByb3RvY29sID0g ZGF0YS0+cHJvdG87DQo+ID4gLQkJbmZzX3ZhbGlkYXRlX3RyYW5zcG9ydF9wcm90b2NvbChhcmdz KTsNCj4gPiAtCQlpZiAoYXJncy0+bmZzX3NlcnZlci5wcm90b2NvbCA9PSBYUFJUX1RSQU5TUE9S VF9VRFApDQo+ID4gLQkJCWdvdG8gb3V0X2ludmFsaWRfdHJhbnNwb3J0X3VkcDsNCj4gPiAtDQo+ ID4gLQkJYnJlYWs7DQo+ID4gLQlkZWZhdWx0Og0KPiA+IC0JCXJldHVybiBORlNfVEVYVF9EQVRB Ow0KPiA+IC0JfQ0KPiA+IC0NCj4gPiAtCXJldHVybiAwOw0KPiA+IC0NCj4gPiAtb3V0X25vX2Rh dGE6DQo+ID4gLQlkZnByaW50ayhNT1VOVCwgIk5GUzQ6IG1vdW50IHByb2dyYW0gZGlkbid0IHBh c3MgYW55IG1vdW50DQo+ID4gZGF0YVxuIik7DQo+ID4gLQlyZXR1cm4gLUVJTlZBTDsNCj4gPiAt DQo+ID4gLW91dF9pbnZhbF9hdXRoOg0KPiA+IC0JZGZwcmludGsoTU9VTlQsICJORlM0OiBJbnZh bGlkIG51bWJlciBvZiBSUEMgYXV0aCBmbGF2b3Vycw0KPiA+ICVkXG4iLA0KPiA+IC0JCSBkYXRh LT5hdXRoX2ZsYXZvdXJsZW4pOw0KPiA+IC0JcmV0dXJuIC1FSU5WQUw7DQo+ID4gLQ0KPiA+IC1v dXRfbm9fYWRkcmVzczoNCj4gPiAtCWRmcHJpbnRrKE1PVU5ULCAiTkZTNDogbW91bnQgcHJvZ3Jh bSBkaWRuJ3QgcGFzcyByZW1vdGUNCj4gPiBhZGRyZXNzXG4iKTsNCj4gPiAtCXJldHVybiAtRUlO VkFMOw0KPiA+IC0NCj4gPiAtb3V0X2ludmFsaWRfdHJhbnNwb3J0X3VkcDoNCj4gPiAtCWRmcHJp bnRrKE1PVU5ULCAiTkZTdjQ6IFVuc3VwcG9ydGVkIHRyYW5zcG9ydCBwcm90b2NvbCB1ZHBcbiIp Ow0KPiA+IC0JcmV0dXJuIC1FSU5WQUw7DQo+ID4gLX0NCj4gPiAtDQo+ID4gLyoNCj4gPiAgKiBO RlMgdjQgbW9kdWxlIHBhcmFtZXRlcnMgbmVlZCB0byBzdGF5IGluIHRoZQ0KPiA+ICAqIE5GUyBj bGllbnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5DQo+ID4gLS0gDQo+ID4gMi4xNy4yDQo+ ID4gDQo+IA0KPiAtLQ0KPiBDaHVjayBMZXZlcg0KPiBjaHVja2xldmVyQGdtYWlsLmNvbQ0KPiAN Cj4gDQo+IA0KLS0gDQpUcm9uZCBNeWtsZWJ1c3QNCkxpbnV4IE5GUyBjbGllbnQgbWFpbnRhaW5l ciwgSGFtbWVyc3BhY2UNCnRyb25kLm15a2xlYnVzdEBoYW1tZXJzcGFjZS5jb20NCg0KDQo=