From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-HE1-obe.outbound.protection.outlook.com (mail-eopbgr10077.outbound.protection.outlook.com [40.107.1.77]) by dpdk.org (Postfix) with ESMTP id EFD551B5E1 for ; Wed, 19 Dec 2018 16:32:15 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=PeC8HeLusPHyvhoQpPQxBIS4HOPrI6zZd96nga3NE+M=; b=vdQr/5COIVxVNH9emRIqNjM/HzAGsx+Jp2Xkf3WLMWv2Q+oaKXN0WOwvc6FSkrWPyu2VxcOyF7aiU/uL4LC7ORHpTdbksZ48UbBv/WF1uvE4nqzkJFs0CcJQO4lyceAvPhoIGSRl6BN6kI9RzYD5n/EndQHCLtACHQgBze1XVMc= Received: from VI1PR04MB4893.eurprd04.prod.outlook.com (20.177.49.154) by VI1PR04MB1549.eurprd04.prod.outlook.com (10.164.84.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1446.19; Wed, 19 Dec 2018 15:32:13 +0000 Received: from VI1PR04MB4893.eurprd04.prod.outlook.com ([fe80::7dc4:610b:d0c1:146b]) by VI1PR04MB4893.eurprd04.prod.outlook.com ([fe80::7dc4:610b:d0c1:146b%4]) with mapi id 15.20.1446.018; Wed, 19 Dec 2018 15:32:13 +0000 From: Akhil Goyal To: Konstantin Ananyev , "dev@dpdk.org" CC: Thomas Monjalon , Mohammad Abdul Awal Thread-Topic: [dpdk-dev] [PATCH v4 06/10] ipsec: implement SA data-path API Thread-Index: AQHUk8l2jP/G8oUcr0SNuYp6NUBDraWGOGsA Date: Wed, 19 Dec 2018 15:32:13 +0000 Message-ID: References: <1544110714-4514-2-git-send-email-konstantin.ananyev@intel.com> <1544804589-10338-6-git-send-email-konstantin.ananyev@intel.com> In-Reply-To: <1544804589-10338-6-git-send-email-konstantin.ananyev@intel.com> Accept-Language: en-IN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: BM1PR01CA0084.INDPRD01.PROD.OUTLOOK.COM (2603:1096:b00:1::24) To VI1PR04MB4893.eurprd04.prod.outlook.com (2603:10a6:803:56::26) authentication-results: spf=none (sender IP is ) smtp.mailfrom=akhil.goyal@nxp.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [14.143.30.134] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; VI1PR04MB1549; 6:WVZ0qY4zNvWZRjYQORP9vK5KlUoyala7oi6a3TVl/gVJtZ83DevJx350UrfwP4wasZ3CSkt7w1gKxwaATH7JAuIWX0iDG+o2V+Ule5HUaeSKv1Arw6B7XnRMPhTxG/Qwjb9JtUVR1zVb3vSU0XiHZh8vdfF6HsMUgsze68G9BMg5W1LVE6Ah1DP3xXciM6YfD9UnqKq7fzHoPSWxoqmdgVoJtqGzSNb76ihp3E8mefa32Mzoux26NKGdy3c7sUOmaaSPw+LxOEyFvbbVILKmRCEGKqH7kqke6e7K7iIobkyCvqiKePrbG8PMLnDQhdb4rPnjaoEpP1yCNEv43jGRb89B9B2xuCoRGwK2uS2vAMaEzk5gxxcuLGYg7BuWHxzLC8MrEq9S/8UTn5SNYcIeK3vc4eEdzihiQGT2OT8HrbfPy7YFuXTbvmNcIeYWg51D7OpJwcBs3uAsllHY3hZGyg==; 5:dQmV4fyox26V9aJhunZMzMOOH3BbRQcWqFE0TEx2IzwjkCE906KIlPTfYsR59O836034Y1S4zo8uPbVZP+z0LYRBEXI8yWgADzng9+9ipbUZY0BwGreiBzM/LpQcpKogD48ak4kr205LNCTEvukt30nGMjDXiAtJokYAhDoi0do=; 7:wM/Wk9RQ4H16Pwd8FVTlofaZkewY2DMJaFqmgRhOLZzBbHk4jk5QMpf8tb1fzYjZPzCuxIgtJvTGRijn9dPrjf5c2dORDO3BZVVnHwOvY6bNoofU0Y767sLSnAGec1Qf+D4JlIHxYgEsCZeG1iBR+Q== x-ms-office365-filtering-correlation-id: f6a46c39-385e-4e82-7eaa-08d665c725ae x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(7168020)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:VI1PR04MB1549; x-ms-traffictypediagnostic: VI1PR04MB1549: x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(3230021)(999002)(5005020)(6040522)(2401047)(8121501046)(3002001)(10201501046)(93006095)(93001095)(3231475)(944501520)(52105112)(6055026)(148016)(149066)(150057)(6041310)(20161123558120)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(201708071742011)(7699051)(76991095); SRVR:VI1PR04MB1549; BCL:0; PCL:0; RULEID:; SRVR:VI1PR04MB1549; x-forefront-prvs: 0891BC3F3D x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(376002)(346002)(366004)(396003)(136003)(199004)(189003)(99286004)(31686004)(256004)(14444005)(106356001)(5024004)(2906002)(105586002)(5660300001)(316002)(25786009)(54906003)(110136005)(71200400001)(68736007)(71190400001)(4744004)(14454004)(78486014)(11346002)(478600001)(36756003)(4326008)(86362001)(229853002)(305945005)(76176011)(446003)(186003)(66066001)(8676002)(486006)(2501003)(6436002)(6246003)(6486002)(476003)(31696002)(7736002)(8936002)(2616005)(53546011)(6506007)(386003)(3846002)(53946003)(44832011)(55236004)(26005)(6512007)(97736004)(53936002)(81156014)(52116002)(102836004)(81166006)(6116002)(569006); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR04MB1549; H:VI1PR04MB4893.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: fz5IAk/9aa4rsGn0pukQlBTIbiyYQmSZnf21wuUad4Rc6wTTCWT3uO8Lw+fnq6rJZNB5WqBFI6uG2odB5U4oFkEzW5j8dASW38AGsdZQkHoguH+oUnfE8Kij7unHdw081SVE6le6EpB0+JoGvTQLKHUGZL0PudMAqgc8oPQ+lqQ9gDjypbCW+zrPOk1nY4mwGNp3x9v8H2jfBLGONTNMkgcePybfF+Ck6atzQR3i+o7VdcYdTFo225c9+qGIZvVfCI69v0H37H8Pv1yjQS5/Bxp+QpunXsg2K4Z9hXZXqaROdLcwbZoDEq2XZaa/T28C spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" Content-ID: <0C68793B3108504CAA798818FE56761B@eurprd04.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: f6a46c39-385e-4e82-7eaa-08d665c725ae X-MS-Exchange-CrossTenant-originalarrivaltime: 19 Dec 2018 15:32:13.2909 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB1549 Subject: Re: [dpdk-dev] [PATCH v4 06/10] ipsec: implement SA data-path API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Dec 2018 15:32:16 -0000 DQoNCk9uIDEyLzE0LzIwMTggOTo1MyBQTSwgS29uc3RhbnRpbiBBbmFueWV2IHdyb3RlOg0KPiBQ cm92aWRlIGltcGxlbWVudGF0aW9uIGZvciBydGVfaXBzZWNfcGt0X2NyeXB0b19wcmVwYXJlKCkg YW5kDQo+IHJ0ZV9pcHNlY19wa3RfcHJvY2VzcygpLg0KPiBDdXJyZW50IGltcGxlbWVudGF0aW9u Og0KPiAgIC0gc3VwcG9ydHMgRVNQIHByb3RvY29sIHR1bm5lbCBtb2RlLg0KPiAgIC0gc3VwcG9y dHMgRVNQIHByb3RvY29sIHRyYW5zcG9ydCBtb2RlLg0KPiAgIC0gc3VwcG9ydHMgRVNOIGFuZCBy ZXBsYXkgd2luZG93Lg0KPiAgIC0gc3VwcG9ydHMgYWxnb3JpdGhtczogQUVTLUNCQywgQUVTLUdD TSwgSE1BQy1TSEExLCBOVUxMLg0KPiAgIC0gY292ZXJzIGFsbCBjdXJyZW50bHkgZGVmaW5lZCBz ZWN1cml0eSBzZXNzaW9uIHR5cGVzOg0KPiAgICAgICAgICAtIFJURV9TRUNVUklUWV9BQ1RJT05f VFlQRV9OT05FDQo+ICAgICAgICAgIC0gUlRFX1NFQ1VSSVRZX0FDVElPTl9UWVBFX0lOTElORV9D UllQVE8NCj4gICAgICAgICAgLSBSVEVfU0VDVVJJVFlfQUNUSU9OX1RZUEVfSU5MSU5FX1BST1RP Q09MDQo+ICAgICAgICAgIC0gUlRFX1NFQ1VSSVRZX0FDVElPTl9UWVBFX0xPT0tBU0lERV9QUk9U T0NPTA0KPg0KPiBGb3IgZmlyc3QgdHdvIHR5cGVzIFNRTiBjaGVjay91cGRhdGUgaXMgZG9uZSBi eSBTVyAoaW5zaWRlIHRoZSBsaWJyYXJ5KS4NCj4gRm9yIGxhc3QgdHdvIHR5cGUgaXQgaXMgSFcv UE1EIHJlc3BvbnNpYmlsaXR5Lg0KPg0KPiBTaWduZWQtb2ZmLWJ5OiBNb2hhbW1hZCBBYmR1bCBB d2FsIDxtb2hhbW1hZC5hYmR1bC5hd2FsQGludGVsLmNvbT4NCj4gU2lnbmVkLW9mZi1ieTogS29u c3RhbnRpbiBBbmFueWV2IDxrb25zdGFudGluLmFuYW55ZXZAaW50ZWwuY29tPg0KPiBBY2tlZC1i eTogRGVjbGFuIERvaGVydHkgPGRlY2xhbi5kb2hlcnR5QGludGVsLmNvbT4NCj4gLS0tDQo+ICAg bGliL2xpYnJ0ZV9pcHNlYy9jcnlwdG8uaCAgICB8ICAxMjMgKysrKw0KPiAgIGxpYi9saWJydGVf aXBzZWMvaXBoLmggICAgICAgfCAgIDg0ICsrKw0KPiAgIGxpYi9saWJydGVfaXBzZWMvaXBzZWNf c3FuLmggfCAgMTg2ICsrKysrKw0KPiAgIGxpYi9saWJydGVfaXBzZWMvcGFkLmggICAgICAgfCAg IDQ1ICsrDQo+ICAgbGliL2xpYnJ0ZV9pcHNlYy9zYS5jICAgICAgICB8IDEwNDQgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrLQ0KPiAgIDUgZmlsZXMgY2hhbmdlZCwgMTQ4MCBpbnNl cnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQ0KPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvbGli cnRlX2lwc2VjL2NyeXB0by5oDQo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9saWJydGVfaXBz ZWMvaXBoLmgNCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL2xpYnJ0ZV9pcHNlYy9wYWQuaA0K Pg0KPiBkaWZmIC0tZ2l0IGEvbGliL2xpYnJ0ZV9pcHNlYy9jcnlwdG8uaCBiL2xpYi9saWJydGVf aXBzZWMvY3J5cHRvLmgNCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAwMDAw Li42MWY1YzE0MzMNCj4gLS0tIC9kZXYvbnVsbA0KPiArKysgYi9saWIvbGlicnRlX2lwc2VjL2Ny eXB0by5oDQo+IEBAIC0wLDAgKzEsMTIzIEBADQo+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmll cjogQlNELTMtQ2xhdXNlDQo+ICsgKiBDb3B5cmlnaHQoYykgMjAxOCBJbnRlbCBDb3Jwb3JhdGlv bg0KPiArICovDQo+ICsNCj4gKyNpZm5kZWYgX0NSWVBUT19IXw0KPiArI2RlZmluZSBfQ1JZUFRP X0hfDQo+ICsNCj4gKy8qKg0KPiArICogQGZpbGUgY3J5cHRvLmgNCj4gKyAqIENvbnRhaW5zIGNy eXB0byBzcGVjaWZpYyBmdW5jdGlvbnMvc3RydWN0dXJlcy9tYWNyb3MgdXNlZCBpbnRlcm5hbGx5 DQo+ICsgKiBieSBpcHNlYyBsaWJyYXJ5Lg0KPiArICovDQo+ICsNCj4gKyAvKg0KPiArICAqIEFF Uy1HQ00gZGV2aWNlcyBoYXZlIHNvbWUgc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGZvciBJViBhbmQg QUFEIGZvcm1hdHMuDQo+ICsgICogSWRlYWxseSB0aGF0IHRvIGJlIGRvbmUgYnkgdGhlIGRyaXZl ciBpdHNlbGYuDQo+ICsgICovDQpJIGJlbGlldmUgdGhlc2UgY2FuIGJlIG1vdmVkIHRvIHJ0ZV9j cnlwdG9fc3ltLmguIEFsbCBjcnlwdG8gcmVsYXRlZCANCnN0dWZmIHNob3VsZCBiZSBhdCBzYW1l IHBsYWNlLg0KPiArDQo+ICtzdHJ1Y3QgYWVhZF9nY21faXYgew0KPiArCXVpbnQzMl90IHNhbHQ7 DQo+ICsJdWludDY0X3QgaXY7DQo+ICsJdWludDMyX3QgY250Ow0KPiArfSBfX2F0dHJpYnV0ZV9f KChwYWNrZWQpKTsNCj4gKw0KPiArc3RydWN0IGFlYWRfZ2NtX2FhZCB7DQo+ICsJdWludDMyX3Qg c3BpOw0KPiArCS8qDQo+ICsJICogUkZDIDQxMDYsIHNlY3Rpb24gNToNCj4gKwkgKiBUd28gZm9y bWF0cyBvZiB0aGUgQUFEIGFyZSBkZWZpbmVkOg0KPiArCSAqIG9uZSBmb3IgMzItYml0IHNlcXVl bmNlIG51bWJlcnMsIGFuZCBvbmUgZm9yIDY0LWJpdCBFU04uDQo+ICsJICovDQo+ICsJdW5pb24g ew0KPiArCQl1aW50MzJfdCB1MzJbMl07DQo+ICsJCXVpbnQ2NF90IHU2NDsNCj4gKwl9IHNxbjsN Cj4gKwl1aW50MzJfdCBhbGlnbjA7IC8qIGFsaWduIHRvIDE2QiBib3VuZGFyeSAqLw0KPiArfSBf X2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsNCj4gKw0KPiArc3RydWN0IGdjbV9lc3BoX2l2IHsNCj4g KwlzdHJ1Y3QgZXNwX2hkciBlc3BoOw0KPiArCXVpbnQ2NF90IGl2Ow0KPiArfSBfX2F0dHJpYnV0 ZV9fKChwYWNrZWQpKTsNCj4gKw0KPiArDQo+ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4gK2FlYWRf Z2NtX2l2X2ZpbGwoc3RydWN0IGFlYWRfZ2NtX2l2ICpnY20sIHVpbnQ2NF90IGl2LCB1aW50MzJf dCBzYWx0KQ0KPiArew0KPiArCWdjbS0+c2FsdCA9IHNhbHQ7DQo+ICsJZ2NtLT5pdiA9IGl2Ow0K PiArCWdjbS0+Y250ID0gcnRlX2NwdV90b19iZV8zMigxKTsNCj4gK30NCj4gKw0KPiArLyoNCj4g KyAqIFJGQyA0MTA2LCA1IEFBRCBDb25zdHJ1Y3Rpb24NCj4gKyAqIHNwaSBhbmQgc3FuIHNob3Vs ZCBhbHJlYWR5IGJlIGNvbnZlcnRlZCBpbnRvIG5ldHdvcmsgYnl0ZSBvcmRlci4NCj4gKyAqIE1h a2Ugc3VyZSB0aGF0IG5vdCB1c2VkIGJ5dGVzIGFyZSB6ZXJvZWQuDQo+ICsgKi8NCj4gK3N0YXRp YyBpbmxpbmUgdm9pZA0KPiArYWVhZF9nY21fYWFkX2ZpbGwoc3RydWN0IGFlYWRfZ2NtX2FhZCAq YWFkLCBydGVfYmUzMl90IHNwaSwgcnRlX2JlNjRfdCBzcW4sDQo+ICsJaW50IGVzbikNCj4gK3sN Cj4gKwlhYWQtPnNwaSA9IHNwaTsNCj4gKwlpZiAoZXNuKQ0KPiArCQlhYWQtPnNxbi51NjQgPSBz cW47DQo+ICsJZWxzZSB7DQo+ICsJCWFhZC0+c3FuLnUzMlswXSA9IHNxbl9sb3czMihzcW4pOw0K PiArCQlhYWQtPnNxbi51MzJbMV0gPSAwOw0KPiArCX0NCj4gKwlhYWQtPmFsaWduMCA9IDA7DQo+ ICt9DQo+ICsNCj4gK3N0YXRpYyBpbmxpbmUgdm9pZA0KPiArZ2VuX2l2KHVpbnQ2NF90IGl2W0lQ U0VDX01BWF9JVl9RV09SRF0sIHJ0ZV9iZTY0X3Qgc3FuKQ0KPiArew0KPiArCWl2WzBdID0gc3Fu Ow0KPiArCWl2WzFdID0gMDsNCj4gK30NCj4gKw0KPiArLyoNCj4gKyAqIGZyb20gUkZDIDQzMDMg My4zLjIuMS40Og0KPiArICogSWYgdGhlIEVTTiBvcHRpb24gaXMgZW5hYmxlZCBmb3IgdGhlIFNB LCB0aGUgaGlnaC1vcmRlciAzMg0KPiArICogYml0cyBvZiB0aGUgc2VxdWVuY2UgbnVtYmVyIGFy ZSBhcHBlbmRlZCBhZnRlciB0aGUgTmV4dCBIZWFkZXIgZmllbGQNCj4gKyAqIGZvciBwdXJwb3Nl cyBvZiB0aGlzIGNvbXB1dGF0aW9uLCBidXQgYXJlIG5vdCB0cmFuc21pdHRlZC4NCj4gKyAqLw0K PiArDQo+ICsvKg0KPiArICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgbW92ZXMgSUNWIGJ5IDRCIGJl bG93LCBhbmQgaW5zZXJ0cyBTUU4uaGliaXRzLg0KPiArICogaWN2IHBhcmFtZXRlciBwb2ludHMg dG8gdGhlIG5ldyBzdGFydCBvZiBJQ1YuDQo+ICsgKi8NCj4gK3N0YXRpYyBpbmxpbmUgdm9pZA0K PiAraW5zZXJ0X3NxaCh1aW50MzJfdCBzcWgsIHZvaWQgKnBpY3YsIHVpbnQzMl90IGljdl9sZW4p DQo+ICt7DQo+ICsJdWludDMyX3QgKmljdjsNCj4gKwlpbnQzMl90IGk7DQo+ICsNCj4gKwlSVEVf QVNTRVJUKGljdl9sZW4gJSBzaXplb2YodWludDMyX3QpID09IDApOw0KPiArDQo+ICsJaWN2ID0g cGljdjsNCj4gKwlpY3ZfbGVuID0gaWN2X2xlbiAvIHNpemVvZih1aW50MzJfdCk7DQo+ICsJZm9y IChpID0gaWN2X2xlbjsgaS0tICE9IDA7IGljdltpXSA9IGljdltpIC0gMV0pDQo+ICsJCTsNCj4g Kw0KPiArCWljdltpXSA9IHNxaDsNCj4gK30NCj4gKw0KPiArLyoNCj4gKyAqIEhlbHBlciBmdW5j dGlvbiB0aGF0IG1vdmVzIElDViBieSA0QiB1cCwgYW5kIHJlbW92ZXMgU1FOLmhpYml0cy4NCj4g KyAqIGljdiBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSBuZXcgc3RhcnQgb2YgSUNWLg0KPiArICov DQo+ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4gK3JlbW92ZV9zcWgodm9pZCAqcGljdiwgdWludDMy X3QgaWN2X2xlbikNCj4gK3sNCj4gKwl1aW50MzJfdCBpLCAqaWN2Ow0KPiArDQo+ICsJUlRFX0FT U0VSVChpY3ZfbGVuICUgc2l6ZW9mKHVpbnQzMl90KSA9PSAwKTsNCj4gKw0KPiArCWljdiA9IHBp Y3Y7DQo+ICsJaWN2X2xlbiA9IGljdl9sZW4gLyBzaXplb2YodWludDMyX3QpOw0KPiArCWZvciAo aSA9IDA7IGkgIT0gaWN2X2xlbjsgaSsrKQ0KPiArCQlpY3ZbaV0gPSBpY3ZbaSArIDFdOw0KPiAr fQ0KPiArDQo+ICsjZW5kaWYgLyogX0NSWVBUT19IXyAqLw0KPiBkaWZmIC0tZ2l0IGEvbGliL2xp YnJ0ZV9pcHNlYy9pcGguaCBiL2xpYi9saWJydGVfaXBzZWMvaXBoLmgNCj4gbmV3IGZpbGUgbW9k ZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAwMDAwLi4zZmQ5MzAxNmQNCj4gLS0tIC9kZXYvbnVsbA0K PiArKysgYi9saWIvbGlicnRlX2lwc2VjL2lwaC5oDQo+IEBAIC0wLDAgKzEsODQgQEANCj4gKy8q IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UNCj4gKyAqIENvcHlyaWdodChj KSAyMDE4IEludGVsIENvcnBvcmF0aW9uDQo+ICsgKi8NCj4gKw0KPiArI2lmbmRlZiBfSVBIX0hf DQo+ICsjZGVmaW5lIF9JUEhfSF8NCj4gKw0KPiArLyoqDQo+ICsgKiBAZmlsZSBpcGguaA0KPiAr ICogQ29udGFpbnMgZnVuY3Rpb25zL3N0cnVjdHVyZXMvbWFjcm9zIHRvIG1hbmlwdWxhdGUgSVB2 L0lQdjYgaGVhZGVycw0KSVB2NA0KPiArICogdXNlZCBpbnRlcm5hbGx5IGJ5IGlwc2VjIGxpYnJh cnkuDQo+ICsgKi8NCj4gKw0KPiArLyoNCj4gKyAqIE1vdmUgcHJlY2VkaW5nIChMMykgaGVhZGVy cyBkb3duIHRvIHJlbW92ZSBFU1AgaGVhZGVyIGFuZCBJVi4NCj4gKyAqLw0Kd2h5IGNhbnQgd2Ug dXNlIHJ0ZV9tYnVmIEFQSXMgdG8gYXBwZW5kL3ByZXBlbmQvdHJpbS9hZGp1c3QgbGVuZ3Rocy4N CkkgYmVsaWV2ZSB0aGVzZSBhZGp1c3RtZW50cyBhcmUgaGFwcGVuaW5nIGluIHRoZSBtYnVmIGl0 c2VsZi4NCk1vcmVvdmVyIHRoZXNlIEFQSXMgYXJlIG5vdCBzcGVjaWZpYyB0byBlc3AgaGVhZGVy cy4NCj4gK3N0YXRpYyBpbmxpbmUgdm9pZA0KPiArcmVtb3ZlX2VzcGgoY2hhciAqbnAsIGNoYXIg Km9wLCB1aW50MzJfdCBobGVuKQ0KPiArew0KPiArCXVpbnQzMl90IGk7DQo+ICsNCj4gKwlmb3Ig KGkgPSBobGVuOyBpLS0gIT0gMDsgbnBbaV0gPSBvcFtpXSkNCj4gKwkJOw0KPiArfQ0KPiArDQo+ ICsvKg0KPiArICogTW92ZSBwcmVjZWRpbmcgKEwzKSBoZWFkZXJzIHVwIHRvIGZyZWUgc3BhY2Ug Zm9yIEVTUCBoZWFkZXIgYW5kIElWLg0KPiArICovDQo+ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4g K2luc2VydF9lc3BoKGNoYXIgKm5wLCBjaGFyICpvcCwgdWludDMyX3QgaGxlbikNCj4gK3sNCj4g Kwl1aW50MzJfdCBpOw0KPiArDQo+ICsJZm9yIChpID0gMDsgaSAhPSBobGVuOyBpKyspDQo+ICsJ CW5wW2ldID0gb3BbaV07DQo+ICt9DQo+ICsNCj4gKy8qIHVwZGF0ZSBvcmlnaW5hbCBpcCBoZWFk ZXIgZmllbGRzIGZvciB0cmFzbnBvcnQgY2FzZSAqLw0Kc3BlbGwgY2hlY2sNCj4gK3N0YXRpYyBp bmxpbmUgaW50DQo+ICt1cGRhdGVfdHJzX2wzaGRyKGNvbnN0IHN0cnVjdCBydGVfaXBzZWNfc2Eg KnNhLCB2b2lkICpwLCB1aW50MzJfdCBwbGVuLA0KPiArCQl1aW50MzJfdCBsMmxlbiwgdWludDMy X3QgbDNsZW4sIHVpbnQ4X3QgcHJvdG8pDQo+ICt7DQo+ICsJc3RydWN0IGlwdjRfaGRyICp2NGg7 DQo+ICsJc3RydWN0IGlwdjZfaGRyICp2Nmg7DQo+ICsJaW50MzJfdCByYzsNCj4gKw0KPiArCWlm ICgoc2EtPnR5cGUgJiBSVEVfSVBTRUNfU0FUUF9JUFZfTUFTSykgPT0gUlRFX0lQU0VDX1NBVFBf SVBWNCkgew0KPiArCQl2NGggPSBwOw0KPiArCQlyYyA9IHY0aC0+bmV4dF9wcm90b19pZDsNCj4g KwkJdjRoLT5uZXh0X3Byb3RvX2lkID0gcHJvdG87DQo+ICsJCXY0aC0+dG90YWxfbGVuZ3RoID0g cnRlX2NwdV90b19iZV8xNihwbGVuIC0gbDJsZW4pOw0KPiArCX0gZWxzZSBpZiAobDNsZW4gPT0g c2l6ZW9mKCp2NmgpKSB7DQo+ICsJCXY2aCA9IHA7DQo+ICsJCXJjID0gdjZoLT5wcm90bzsNCj4g KwkJdjZoLT5wcm90byA9IHByb3RvOw0KPiArCQl2NmgtPnBheWxvYWRfbGVuID0gcnRlX2NwdV90 b19iZV8xNihwbGVuIC0gbDJsZW4gLQ0KPiArCQkJCXNpemVvZigqdjZoKSk7DQo+ICsJLyogbmVl ZCB0byBhZGQgc3VwcG9ydCBmb3IgSVB2NiB3aXRoIG9wdGlvbnMgKi8NCj4gKwl9IGVsc2UNCj4g KwkJcmMgPSAtRU5PVFNVUDsNCj4gKw0KPiArCXJldHVybiByYzsNCj4gK30NCj4gKw0KPiArLyog dXBkYXRlIG9yaWdpbmFsIGFuZCBuZXcgaXAgaGVhZGVyIGZpZWxkcyBmb3IgdHVubmVsIGNhc2Ug Ki8NCj4gK3N0YXRpYyBpbmxpbmUgdm9pZA0KPiArdXBkYXRlX3R1bl9sM2hkcihjb25zdCBzdHJ1 Y3QgcnRlX2lwc2VjX3NhICpzYSwgdm9pZCAqcCwgdWludDMyX3QgcGxlbiwNCj4gKwkJdWludDMy X3QgbDJsZW4sIHJ0ZV9iZTE2X3QgcGlkKQ0KPiArew0KPiArCXN0cnVjdCBpcHY0X2hkciAqdjRo Ow0KPiArCXN0cnVjdCBpcHY2X2hkciAqdjZoOw0KPiArDQo+ICsJaWYgKHNhLT50eXBlICYgUlRF X0lQU0VDX1NBVFBfTU9ERV9UVU5MVjQpIHsNCj4gKwkJdjRoID0gcDsNCj4gKwkJdjRoLT5wYWNr ZXRfaWQgPSBwaWQ7DQo+ICsJCXY0aC0+dG90YWxfbGVuZ3RoID0gcnRlX2NwdV90b19iZV8xNihw bGVuIC0gbDJsZW4pOw0Kd2hlcmUgYXJlIHdlIHVwZGF0aW5nIHRoZSByZXN0IG9mIHRoZSBmaWVs ZHMsIGxpa2UgdHRsLCBjaGVja3N1bSwgaXAgDQphZGRyZXNzZXMsIGV0Yw0KPiArCX0gZWxzZSB7 DQo+ICsJCXY2aCA9IHA7DQo+ICsJCXY2aC0+cGF5bG9hZF9sZW4gPSBydGVfY3B1X3RvX2JlXzE2 KHBsZW4gLSBsMmxlbiAtDQo+ICsJCQkJc2l6ZW9mKCp2NmgpKTsNCj4gKwl9DQo+ICt9DQo+ICsN Cj4gKyNlbmRpZiAvKiBfSVBIX0hfICovDQo+IGRpZmYgLS1naXQgYS9saWIvbGlicnRlX2lwc2Vj L2lwc2VjX3Nxbi5oIGIvbGliL2xpYnJ0ZV9pcHNlYy9pcHNlY19zcW4uaA0KPiBpbmRleCAxOTM1 ZjZlMzAuLjZlMThjMzRlYiAxMDA2NDQNCj4gLS0tIGEvbGliL2xpYnJ0ZV9pcHNlYy9pcHNlY19z cW4uaA0KPiArKysgYi9saWIvbGlicnRlX2lwc2VjL2lwc2VjX3Nxbi5oDQo+IEBAIC0xNSw2ICsx NSw0NSBAQA0KPiAgIA0KPiAgICNkZWZpbmUgSVNfRVNOKHNhKQkoKHNhKS0+c3FuX21hc2sgPT0g VUlOVDY0X01BWCkNCj4gICANCj4gKy8qDQo+ICsgKiBnZXRzIFNRTi5oaTMyIGJpdHMsIFNRTiBz dXBwb3NlZCB0byBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuDQo+ICsgKi8NCj4gK3N0YXRpYyBp bmxpbmUgcnRlX2JlMzJfdA0KPiArc3FuX2hpMzIocnRlX2JlNjRfdCBzcW4pDQo+ICt7DQo+ICsj aWYgUlRFX0JZVEVfT1JERVIgPT0gUlRFX0JJR19FTkRJQU4NCj4gKwlyZXR1cm4gKHNxbiA+PiAz Mik7DQo+ICsjZWxzZQ0KPiArCXJldHVybiBzcW47DQo+ICsjZW5kaWYNCj4gK30NCj4gKw0KPiAr LyoNCj4gKyAqIGdldHMgU1FOLmxvdzMyIGJpdHMsIFNRTiBzdXBwb3NlZCB0byBiZSBpbiBuZXR3 b3JrIGJ5dGUgb3JkZXIuDQo+ICsgKi8NCj4gK3N0YXRpYyBpbmxpbmUgcnRlX2JlMzJfdA0KPiAr c3FuX2xvdzMyKHJ0ZV9iZTY0X3Qgc3FuKQ0KPiArew0KPiArI2lmIFJURV9CWVRFX09SREVSID09 IFJURV9CSUdfRU5ESUFODQo+ICsJcmV0dXJuIHNxbjsNCj4gKyNlbHNlDQo+ICsJcmV0dXJuIChz cW4gPj4gMzIpOw0KPiArI2VuZGlmDQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiBnZXRzIFNRTi5s b3cxNiBiaXRzLCBTUU4gc3VwcG9zZWQgdG8gYmUgaW4gbmV0d29yayBieXRlIG9yZGVyLg0KPiAr ICovDQo+ICtzdGF0aWMgaW5saW5lIHJ0ZV9iZTE2X3QNCj4gK3Nxbl9sb3cxNihydGVfYmU2NF90 IHNxbikNCj4gK3sNCj4gKyNpZiBSVEVfQllURV9PUkRFUiA9PSBSVEVfQklHX0VORElBTg0KPiAr CXJldHVybiBzcW47DQo+ICsjZWxzZQ0KPiArCXJldHVybiAoc3FuID4+IDQ4KTsNCj4gKyNlbmRp Zg0KPiArfQ0KPiArDQpzaG91bGRuJ3Qgd2UgbW92ZSB0aGVzZSBzZXEgbnVtYmVyIEFQSXMgaW4g cnRlX2VzcC5oIGFuZCBtYWtlIHRoZW0gZ2VuZXJpYw0KPiAgIC8qDQo+ICAgICogZm9yIGdpdmVu IHNpemUsIGNhbGN1bGF0ZSByZXF1aXJlZCBudW1iZXIgb2YgYnVja2V0cy4NCj4gICAgKi8NCj4g QEAgLTMwLDYgKzY5LDE1MyBAQCByZXBsYXlfbnVtX2J1Y2tldCh1aW50MzJfdCB3c3opDQo+ICAg CXJldHVybiBuYjsNCj4gICB9DQo+ICAgDQo+ICsvKg0KPiArICogQWNjb3JkaW5nIHRvIFJGQzQz MDMgQTIuMSwgZGV0ZXJtaW5lIHRoZSBoaWdoLW9yZGVyIGJpdCBvZiBzZXF1ZW5jZSBudW1iZXIu DQo+ICsgKiB1c2UgMzJiaXQgYXJpdGhtZXRpYyBpbnNpZGUsIHJldHVybiB1aW50NjRfdC4NCj4g KyAqLw0KPiArc3RhdGljIGlubGluZSB1aW50NjRfdA0KPiArcmVjb25zdHJ1Y3RfZXNuKHVpbnQ2 NF90IHQsIHVpbnQzMl90IHNxbiwgdWludDMyX3QgdykNCj4gK3sNCj4gKwl1aW50MzJfdCB0aCwg dGwsIGJsOw0KPiArDQo+ICsJdGwgPSB0Ow0KPiArCXRoID0gdCA+PiAzMjsNCj4gKwlibCA9IHRs IC0gdyArIDE7DQo+ICsNCj4gKwkvKiBjYXNlIEE6IHdpbmRvdyBpcyB3aXRoaW4gb25lIHNlcXVl bmNlIG51bWJlciBzdWJzcGFjZSAqLw0KPiArCWlmICh0bCA+PSAodyAtIDEpKQ0KPiArCQl0aCAr PSAoc3FuIDwgYmwpOw0KPiArCS8qIGNhc2UgQjogd2luZG93IHNwYW5zIHR3byBzZXF1ZW5jZSBu dW1iZXIgc3Vic3BhY2VzICovDQo+ICsJZWxzZSBpZiAodGggIT0gMCkNCj4gKwkJdGggLT0gKHNx biA+PSBibCk7DQo+ICsNCj4gKwkvKiByZXR1cm4gY29uc3RydWN0ZWQgc2VxdWVuY2Ugd2l0aCBw cm9wZXIgaGlnaC1vcmRlciBiaXRzICovDQo+ICsJcmV0dXJuICh1aW50NjRfdCl0aCA8PCAzMiB8 IHNxbjsNCj4gK30NCj4gKw0KPiArLyoqDQo+ICsgKiBQZXJmb3JtIHRoZSByZXBsYXkgY2hlY2tp bmcuDQo+ICsgKg0KPiArICogc3RydWN0IHJ0ZV9pcHNlY19zYSBjb250YWlucyB0aGUgd2luZG93 IGFuZCB3aW5kb3cgcmVsYXRlZCBwYXJhbWV0ZXJzLA0KPiArICogc3VjaCBhcyB0aGUgd2luZG93 IHNpemUsIGJpdG1hc2ssIGFuZCB0aGUgbGFzdCBhY2tub3dsZWRnZWQgc2VxdWVuY2UgbnVtYmVy Lg0KPiArICoNCj4gKyAqIEJhc2VkIG9uIFJGQyA2NDc5Lg0KPiArICogQmxvY2tzIGFyZSA2NCBi aXRzIHVuc2lnbmVkIGludGVnZXJzDQo+ICsgKi8NCj4gK3N0YXRpYyBpbmxpbmUgaW50MzJfdA0K PiArZXNuX2luYl9jaGVja19zcW4oY29uc3Qgc3RydWN0IHJlcGxheV9zcW4gKnJzbiwgY29uc3Qg c3RydWN0IHJ0ZV9pcHNlY19zYSAqc2EsDQo+ICsJdWludDY0X3Qgc3FuKQ0KPiArew0KPiArCXVp bnQzMl90IGJpdCwgYnVja2V0Ow0KPiArDQo+ICsJLyogcmVwbGF5IG5vdCBlbmFibGVkICovDQo+ ICsJaWYgKHNhLT5yZXBsYXkud2luX3N6ID09IDApDQo+ICsJCXJldHVybiAwOw0KPiArDQo+ICsJ Lyogc2VxIGlzIGxhcmdlciB0aGFuIGxhc3RzZXEgKi8NCj4gKwlpZiAoc3FuID4gcnNuLT5zcW4p DQo+ICsJCXJldHVybiAwOw0KPiArDQo+ICsJLyogc2VxIGlzIG91dHNpZGUgd2luZG93ICovDQo+ ICsJaWYgKHNxbiA9PSAwIHx8IHNxbiArIHNhLT5yZXBsYXkud2luX3N6IDwgcnNuLT5zcW4pDQo+ ICsJCXJldHVybiAtRUlOVkFMOw0KPiArDQo+ICsJLyogc2VxIGlzIGluc2lkZSB0aGUgd2luZG93 ICovDQo+ICsJYml0ID0gc3FuICYgV0lORE9XX0JJVF9MT0NfTUFTSzsNCj4gKwlidWNrZXQgPSAo c3FuID4+IFdJTkRPV19CVUNLRVRfQklUUykgJiBzYS0+cmVwbGF5LmJ1Y2tldF9pbmRleF9tYXNr Ow0KPiArDQo+ICsJLyogYWxyZWFkeSBzZWVuIHBhY2tldCAqLw0KPiArCWlmIChyc24tPndpbmRv d1tidWNrZXRdICYgKCh1aW50NjRfdCkxIDw8IGJpdCkpDQo+ICsJCXJldHVybiAtRUlOVkFMOw0K PiArDQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gKy8qKg0KPiArICogRm9yIG91dGJvdW5k IFNBIHBlcmZvcm0gdGhlIHNlcXVlbmNlIG51bWJlciB1cGRhdGUuDQo+ICsgKi8NCj4gK3N0YXRp YyBpbmxpbmUgdWludDY0X3QNCj4gK2Vzbl9vdXRiX3VwZGF0ZV9zcW4oc3RydWN0IHJ0ZV9pcHNl Y19zYSAqc2EsIHVpbnQzMl90ICpudW0pDQo+ICt7DQo+ICsJdWludDY0X3Qgbiwgcywgc3FuOw0K PiArDQo+ICsJbiA9ICpudW07DQo+ICsJc3FuID0gc2EtPnNxbi5vdXRiICsgbjsNCj4gKwlzYS0+ c3FuLm91dGIgPSBzcW47DQo+ICsNCj4gKwkvKiBvdmVyZmxvdyAqLw0KPiArCWlmIChzcW4gPiBz YS0+c3FuX21hc2spIHsNCj4gKwkJcyA9IHNxbiAtIHNhLT5zcW5fbWFzazsNCj4gKwkJKm51bSA9 IChzIDwgbikgPyAgbiAtIHMgOiAwOw0KPiArCX0NCj4gKw0KPiArCXJldHVybiBzcW4gLSBuOw0K PiArfQ0KPiArDQo+ICsvKioNCj4gKyAqIEZvciBpbmJvdW5kIFNBIHBlcmZvcm0gdGhlIHNlcXVl bmNlIG51bWJlciBhbmQgcmVwbGF5IHdpbmRvdyB1cGRhdGUuDQo+ICsgKi8NCj4gK3N0YXRpYyBp bmxpbmUgaW50MzJfdA0KPiArZXNuX2luYl91cGRhdGVfc3FuKHN0cnVjdCByZXBsYXlfc3FuICpy c24sIGNvbnN0IHN0cnVjdCBydGVfaXBzZWNfc2EgKnNhLA0KPiArCXVpbnQ2NF90IHNxbikNCj4g K3sNCj4gKwl1aW50MzJfdCBiaXQsIGJ1Y2tldCwgbGFzdF9idWNrZXQsIG5ld19idWNrZXQsIGRp ZmYsIGk7DQo+ICsNCj4gKwkvKiByZXBsYXkgbm90IGVuYWJsZWQgKi8NCj4gKwlpZiAoc2EtPnJl cGxheS53aW5fc3ogPT0gMCkNCj4gKwkJcmV0dXJuIDA7DQo+ICsNCj4gKwkvKiBoYW5kbGUgRVNO ICovDQo+ICsJaWYgKElTX0VTTihzYSkpDQo+ICsJCXNxbiA9IHJlY29uc3RydWN0X2Vzbihyc24t PnNxbiwgc3FuLCBzYS0+cmVwbGF5Lndpbl9zeik7DQo+ICsNCj4gKwkvKiBzZXEgaXMgb3V0c2lk ZSB3aW5kb3cqLw0KPiArCWlmIChzcW4gPT0gMCB8fCBzcW4gKyBzYS0+cmVwbGF5Lndpbl9zeiA8 IHJzbi0+c3FuKQ0KPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArCS8qIHVwZGF0ZSB0aGUg Yml0ICovDQo+ICsJYnVja2V0ID0gKHNxbiA+PiBXSU5ET1dfQlVDS0VUX0JJVFMpOw0KPiArDQo+ ICsJLyogY2hlY2sgaWYgdGhlIHNlcSBpcyB3aXRoaW4gdGhlIHJhbmdlICovDQo+ICsJaWYgKHNx biA+IHJzbi0+c3FuKSB7DQo+ICsJCWxhc3RfYnVja2V0ID0gcnNuLT5zcW4gPj4gV0lORE9XX0JV Q0tFVF9CSVRTOw0KPiArCQlkaWZmID0gYnVja2V0IC0gbGFzdF9idWNrZXQ7DQo+ICsJCS8qIHNl cSBpcyB3YXkgYWZ0ZXIgdGhlIHJhbmdlIG9mIFdJTkRPV19TSVpFICovDQo+ICsJCWlmIChkaWZm ID4gc2EtPnJlcGxheS5uYl9idWNrZXQpDQo+ICsJCQlkaWZmID0gc2EtPnJlcGxheS5uYl9idWNr ZXQ7DQo+ICsNCj4gKwkJZm9yIChpID0gMDsgaSAhPSBkaWZmOyBpKyspIHsNCj4gKwkJCW5ld19i dWNrZXQgPSAoaSArIGxhc3RfYnVja2V0ICsgMSkgJg0KPiArCQkJCXNhLT5yZXBsYXkuYnVja2V0 X2luZGV4X21hc2s7DQo+ICsJCQlyc24tPndpbmRvd1tuZXdfYnVja2V0XSA9IDA7DQo+ICsJCX0N Cj4gKwkJcnNuLT5zcW4gPSBzcW47DQo+ICsJfQ0KPiArDQo+ICsJYnVja2V0ICY9IHNhLT5yZXBs YXkuYnVja2V0X2luZGV4X21hc2s7DQo+ICsJYml0ID0gKHVpbnQ2NF90KTEgPDwgKHNxbiAmIFdJ TkRPV19CSVRfTE9DX01BU0spOw0KPiArDQo+ICsJLyogYWxyZWFkeSBzZWVuIHBhY2tldCAqLw0K PiArCWlmIChyc24tPndpbmRvd1tidWNrZXRdICYgYml0KQ0KPiArCQlyZXR1cm4gLUVJTlZBTDsN Cj4gKw0KPiArCXJzbi0+d2luZG93W2J1Y2tldF0gfD0gYml0Ow0KPiArCXJldHVybiAwOw0KPiAr fQ0KPiArDQo+ICsvKioNCj4gKyAqIFRvIGFjaGlldmUgYWJpbGl0eSB0byBkbyBtdWx0aXBsZSBy ZWFkZXJzIHNpbmdsZSB3cml0ZXIgZm9yDQo+ICsgKiBTQSByZXBsYXkgd2luZG93IGluZm9ybWF0 aW9uIGFuZCBzZXF1ZW5jZSBudW1iZXIgKFJTTikNCj4gKyAqIGJhc2ljIFJDVSBzY2hlbWEgaXMg dXNlZDoNCj4gKyAqIFNBIGhhdmUgMiBjb3BpZXMgb2YgUlNOIChvbmUgZm9yIHJlYWRlcnMsIGFu b3RoZXIgZm9yIHdyaXRlcnMpLg0KPiArICogRWFjaCBSU04gY29udGFpbnMgYSByd2xvY2sgdGhh dCBoYXMgdG8gYmUgZ3JhYmJlZCAoZm9yIHJlYWQvd3JpdGUpDQo+ICsgKiB0byBhdm9pZCByYWNl cyBiZXR3ZWVuIHJlYWRlcnMgYW5kIHdyaXRlci4NCj4gKyAqIFdyaXRlciBpcyByZXNwb25zaWJs ZSB0byBtYWtlIGEgY29weSBvciByZWFkZXIgUlNOLCB1cGRhdGUgaXQNCj4gKyAqIGFuZCBtYXJr IG5ld2x5IHVwZGF0ZWQgUlNOIGFzIHJlYWRlcnMgb25lLg0KPiArICogVGhhdCBhcHByb2FjaCBp cyBpbnRlbmRlZCB0byBtaW5pbWl6ZSBjb250ZW50aW9uIGFuZCBjYWNoZSBzaGFyaW5nDQo+ICsg KiBiZXR3ZWVuIHdyaXRlciBhbmQgcmVhZGVycy4NCj4gKyAqLw0KPiArDQo+ICAgLyoqDQo+ICAg ICogQmFzZWQgb24gbnVtYmVyIG9mIGJ1Y2tldHMgY2FsY3VsYXRlZCByZXF1aXJlZCBzaXplIGZv ciB0aGUNCj4gICAgKiBzdHJ1Y3R1cmUgdGhhdCBob2xkcyByZXBsYXkgd2luZG93IGFuZCBzZXF1 ZW5jZSBudW1iZXIgKFJTTikgaW5mb3JtYXRpb24uDQo+IGRpZmYgLS1naXQgYS9saWIvbGlicnRl X2lwc2VjL3BhZC5oIGIvbGliL2xpYnJ0ZV9pcHNlYy9wYWQuaA0KPiBuZXcgZmlsZSBtb2RlIDEw MDY0NA0KPiBpbmRleCAwMDAwMDAwMDAuLjJmNWNjZDAwZQ0KPiAtLS0gL2Rldi9udWxsDQo+ICsr KyBiL2xpYi9saWJydGVfaXBzZWMvcGFkLmgNCj4gQEAgLTAsMCArMSw0NSBAQA0KPiArLyogU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQ0KPiArICogQ29weXJpZ2h0KGMpIDIw MTggSW50ZWwgQ29ycG9yYXRpb24NCj4gKyAqLw0KPiArDQo+ICsjaWZuZGVmIF9QQURfSF8NCj4g KyNkZWZpbmUgX1BBRF9IXw0KPiArDQo+ICsjZGVmaW5lIElQU0VDX01BWF9QQURfU0laRQlVSU5U OF9NQVgNCj4gKw0KPiArc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXNwX3BhZF9ieXRlc1tJUFNFQ19N QVhfUEFEX1NJWkVdID0gew0KPiArCTEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsDQo+ICsJOSwgMTAs IDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsDQo+ICsJMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMs IDI0LA0KPiArCTI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwNCj4gKwkzMywgMzQsIDM1 LCAzNiwgMzcsIDM4LCAzOSwgNDAsDQo+ICsJNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4 LA0KPiArCTQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwNCj4gKwk1NywgNTgsIDU5LCA2 MCwgNjEsIDYyLCA2MywgNjQsDQo+ICsJNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLA0K PiArCTczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwNCj4gKwk4MSwgODIsIDgzLCA4NCwg ODUsIDg2LCA4NywgODgsDQo+ICsJODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LA0KPiAr CTk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LA0KPiArCTEwNSwgMTA2LCAxMDcs IDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLA0KPiArCTExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAx MTgsIDExOSwgMTIwLA0KPiArCTEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4 LA0KPiArCTEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LA0KPiArCTEzNywg MTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywgMTQ0LA0KPiArCTE0NSwgMTQ2LCAxNDcsIDE0 OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLA0KPiArCTE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgs IDE1OSwgMTYwLA0KPiArCTE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LA0K PiArCTE2OSwgMTcwLCAxNzEsIDE3MiwgMTczLCAxNzQsIDE3NSwgMTc2LA0KPiArCTE3NywgMTc4 LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LA0KPiArCTE4NSwgMTg2LCAxODcsIDE4OCwg MTg5LCAxOTAsIDE5MSwgMTkyLA0KPiArCTE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5 OSwgMjAwLA0KPiArCTIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LA0KPiAr CTIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNSwgMjE2LA0KPiArCTIxNywgMjE4LCAy MTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LA0KPiArCTIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5 LCAyMzAsIDIzMSwgMjMyLA0KPiArCTIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwg MjQwLA0KPiArCTI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LA0KPiArCTI0 OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwNCj4gK307DQo+ICsNCj4gKyNlbmRpZiAv KiBfUEFEX0hfICovDQo+IGRpZmYgLS1naXQgYS9saWIvbGlicnRlX2lwc2VjL3NhLmMgYi9saWIv bGlicnRlX2lwc2VjL3NhLmMNCj4gaW5kZXggZTRjNTM2MWU3Li5iYjU2ZjQyZWIgMTAwNjQ0DQo+ IC0tLSBhL2xpYi9saWJydGVfaXBzZWMvc2EuYw0KPiArKysgYi9saWIvbGlicnRlX2lwc2VjL3Nh LmMNCj4gQEAgLTYsOSArNiwxMyBAQA0KPiAgICNpbmNsdWRlIDxydGVfZXNwLmg+DQo+ICAgI2lu Y2x1ZGUgPHJ0ZV9pcC5oPg0KPiAgICNpbmNsdWRlIDxydGVfZXJybm8uaD4NCj4gKyNpbmNsdWRl IDxydGVfY3J5cHRvZGV2Lmg+DQo+ICAgDQo+ICAgI2luY2x1ZGUgInNhLmgiDQo+ICAgI2luY2x1 ZGUgImlwc2VjX3Nxbi5oIg0KPiArI2luY2x1ZGUgImNyeXB0by5oIg0KPiArI2luY2x1ZGUgImlw aC5oIg0KPiArI2luY2x1ZGUgInBhZC5oIg0KPiAgIA0KPiAgIC8qIHNvbWUgaGVscGVyIHN0cnVj dHVyZXMgKi8NCj4gICBzdHJ1Y3QgY3J5cHRvX3hmb3JtIHsNCj4gQEAgLTIwNyw2ICsyMTEsNyBA QCBlc3Bfc2FfaW5pdChzdHJ1Y3QgcnRlX2lwc2VjX3NhICpzYSwgY29uc3Qgc3RydWN0IHJ0ZV9p cHNlY19zYV9wcm0gKnBybSwNCj4gICAJCS8qIFJGQyA0MTA2ICovDQo+ICAgCQlpZiAoY3hmLT5h ZWFkLT5hbGdvICE9IFJURV9DUllQVE9fQUVBRF9BRVNfR0NNKQ0KPiAgIAkJCXJldHVybiAtRUlO VkFMOw0KPiArCQlzYS0+YWFkX2xlbiA9IHNpemVvZihzdHJ1Y3QgYWVhZF9nY21fYWFkKTsNCj4g ICAJCXNhLT5pY3ZfbGVuID0gY3hmLT5hZWFkLT5kaWdlc3RfbGVuZ3RoOw0KPiAgIAkJc2EtPml2 X29mcyA9IGN4Zi0+YWVhZC0+aXYub2Zmc2V0Ow0KPiAgIAkJc2EtPml2X2xlbiA9IHNpemVvZih1 aW50NjRfdCk7DQo+IEBAIC0zMjYsMTggKzMzMSwxMDUzIEBAIHJ0ZV9pcHNlY19zYV9pbml0KHN0 cnVjdCBydGVfaXBzZWNfc2EgKnNhLCBjb25zdCBzdHJ1Y3QgcnRlX2lwc2VjX3NhX3BybSAqcHJt LA0KPiAgIAlyZXR1cm4gc3o7DQo+ICAgfQ0KPiAgIA0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ ICttYnVmX2J1bGtfY29weShzdHJ1Y3QgcnRlX21idWYgKmRzdFtdLCBzdHJ1Y3QgcnRlX21idWYg KiBjb25zdCBzcmNbXSwNCj4gKwl1aW50MzJfdCBudW0pDQo+ICt7DQo+ICsJdWludDMyX3QgaTsN Cj4gKw0KPiArCWZvciAoaSA9IDA7IGkgIT0gbnVtOyBpKyspDQo+ICsJCWRzdFtpXSA9IHNyY1tp XTsNCj4gK30NCj4gKw0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ICtsa3NkX25vbmVfY29wX3By ZXBhcmUoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpzcywNCj4gKwlzdHJ1Y3QgcnRl X21idWYgKm1iW10sIHN0cnVjdCBydGVfY3J5cHRvX29wICpjb3BbXSwgdWludDE2X3QgbnVtKQ0K PiArew0KPiArCXVpbnQzMl90IGk7DQo+ICsJc3RydWN0IHJ0ZV9jcnlwdG9fc3ltX29wICpzb3A7 DQo+ICsNCj4gKwlmb3IgKGkgPSAwOyBpICE9IG51bTsgaSsrKSB7DQo+ICsJCXNvcCA9IGNvcFtp XS0+c3ltOw0KPiArCQljb3BbaV0tPnR5cGUgPSBSVEVfQ1JZUFRPX09QX1RZUEVfU1lNTUVUUklD Ow0KPiArCQljb3BbaV0tPnN0YXR1cyA9IFJURV9DUllQVE9fT1BfU1RBVFVTX05PVF9QUk9DRVNT RUQ7DQo+ICsJCWNvcFtpXS0+c2Vzc190eXBlID0gUlRFX0NSWVBUT19PUF9XSVRIX1NFU1NJT047 DQo+ICsJCXNvcC0+bV9zcmMgPSBtYltpXTsNCj4gKwkJX19ydGVfY3J5cHRvX3N5bV9vcF9hdHRh Y2hfc3ltX3Nlc3Npb24oc29wLCBzcy0+Y3J5cHRvLnNlcyk7DQo+ICsJfQ0KPiArfQ0KPiArDQo+ ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4gK2VzcF9vdXRiX2NvcF9wcmVwYXJlKHN0cnVjdCBydGVf Y3J5cHRvX29wICpjb3AsDQo+ICsJY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2EsIGNvbnN0 IHVpbnQ2NF90IGl2cFtJUFNFQ19NQVhfSVZfUVdPUkRdLA0KPiArCWNvbnN0IHVuaW9uIHN5bV9v cF9kYXRhICppY3YsIHVpbnQzMl90IGhsZW4sIHVpbnQzMl90IHBsZW4pDQo+ICt7DQo+ICsJc3Ry dWN0IHJ0ZV9jcnlwdG9fc3ltX29wICpzb3A7DQo+ICsJc3RydWN0IGFlYWRfZ2NtX2l2ICpnY207 DQo+ICsNCj4gKwkvKiBmaWxsIHN5bSBvcCBmaWVsZHMgKi8NCj4gKwlzb3AgPSBjb3AtPnN5bTsN Cj4gKw0KPiArCS8qIEFFQUQgKEFFU19HQ00pIGNhc2UgKi8NCj4gKwlpZiAoc2EtPmFhZF9sZW4g IT0gMCkgew0KPiArCQlzb3AtPmFlYWQuZGF0YS5vZmZzZXQgPSBzYS0+Y3RwLmNpcGhlci5vZmZz ZXQgKyBobGVuOw0KPiArCQlzb3AtPmFlYWQuZGF0YS5sZW5ndGggPSBzYS0+Y3RwLmNpcGhlci5s ZW5ndGggKyBwbGVuOw0KPiArCQlzb3AtPmFlYWQuZGlnZXN0LmRhdGEgPSBpY3YtPnZhOw0KPiAr CQlzb3AtPmFlYWQuZGlnZXN0LnBoeXNfYWRkciA9IGljdi0+cGE7DQo+ICsJCXNvcC0+YWVhZC5h YWQuZGF0YSA9IGljdi0+dmEgKyBzYS0+aWN2X2xlbjsNCj4gKwkJc29wLT5hZWFkLmFhZC5waHlz X2FkZHIgPSBpY3YtPnBhICsgc2EtPmljdl9sZW47DQo+ICsNCj4gKwkJLyogZmlsbCBBQUQgSVYg KGxvY2F0ZWQgaW5zaWRlIGNyeXB0byBvcCkgKi8NCj4gKwkJZ2NtID0gcnRlX2NyeXB0b19vcF9j dG9kX29mZnNldChjb3AsIHN0cnVjdCBhZWFkX2djbV9pdiAqLA0KPiArCQkJc2EtPml2X29mcyk7 DQo+ICsJCWFlYWRfZ2NtX2l2X2ZpbGwoZ2NtLCBpdnBbMF0sIHNhLT5zYWx0KTsNCj4gKwkvKiBD UllQVCtBVVRIIGNhc2UgKi8NCj4gKwl9IGVsc2Ugew0KPiArCQlzb3AtPmNpcGhlci5kYXRhLm9m ZnNldCA9IHNhLT5jdHAuY2lwaGVyLm9mZnNldCArIGhsZW47DQo+ICsJCXNvcC0+Y2lwaGVyLmRh dGEubGVuZ3RoID0gc2EtPmN0cC5jaXBoZXIubGVuZ3RoICsgcGxlbjsNCj4gKwkJc29wLT5hdXRo LmRhdGEub2Zmc2V0ID0gc2EtPmN0cC5hdXRoLm9mZnNldCArIGhsZW47DQo+ICsJCXNvcC0+YXV0 aC5kYXRhLmxlbmd0aCA9IHNhLT5jdHAuYXV0aC5sZW5ndGggKyBwbGVuOw0KPiArCQlzb3AtPmF1 dGguZGlnZXN0LmRhdGEgPSBpY3YtPnZhOw0KPiArCQlzb3AtPmF1dGguZGlnZXN0LnBoeXNfYWRk ciA9IGljdi0+cGE7DQpwbGVhc2UgaWdub3JlIG15IHByZXZpb3VzIGNvbW1lbnQgb24gY3RwIGlu IHRoZSBwcmV2aW91cyBwYXRjaC4NCnlvdSBhcmUgbWFraW5nIHRoZSBzeW1fb3AgYWxzbyBpbiB0 aGlzIGxpYnJhcnkuIEl0IHdvdWxkIGJlIGJldHRlciB0byANCnVzZSBzeW1fb3AgaW5zdGVhZCBv ZiBzb3AgdG8gYWxpZ24gd2l0aCByZXN0IG9mIGRwZGsgY29kZS4NCj4gKwl9DQo+ICt9DQo+ICsN Cj4gK3N0YXRpYyBpbmxpbmUgaW50MzJfdA0KPiArZXNwX291dGJfdHVuX3BrdF9wcmVwYXJlKHN0 cnVjdCBydGVfaXBzZWNfc2EgKnNhLCBydGVfYmU2NF90IHNxYywNCj4gKwljb25zdCB1aW50NjRf dCBpdnBbSVBTRUNfTUFYX0lWX1FXT1JEXSwgc3RydWN0IHJ0ZV9tYnVmICptYiwNCj4gKwl1bmlv biBzeW1fb3BfZGF0YSAqaWN2KQ0KPiArew0KPiArCXVpbnQzMl90IGNsZW4sIGhsZW4sIGwybGVu LCBwZGxlbiwgcGRvZnMsIHBsZW4sIHRsZW47DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICptbDsNCj4g KwlzdHJ1Y3QgZXNwX2hkciAqZXNwaDsNCj4gKwlzdHJ1Y3QgZXNwX3RhaWwgKmVzcHQ7DQo+ICsJ Y2hhciAqcGgsICpwdDsNCj4gKwl1aW50NjRfdCAqaXY7DQo+ICsNCj4gKwkvKiBjYWxjdWxhdGUg ZXh0cmEgaGVhZGVyIHNwYWNlIHJlcXVpcmVkICovDQo+ICsJaGxlbiA9IHNhLT5oZHJfbGVuICsg c2EtPml2X2xlbiArIHNpemVvZigqZXNwaCk7DQo+ICsNCj4gKwkvKiBzaXplIG9mIGlwc2VjIHBy b3RlY3RlZCBkYXRhICovDQo+ICsJbDJsZW4gPSBtYi0+bDJfbGVuOw0KPiArCXBsZW4gPSBtYi0+ cGt0X2xlbiAtIG1iLT5sMl9sZW47DQo+ICsNCj4gKwkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gZW5j cnlwdCAqLw0KPiArCWNsZW4gPSBwbGVuICsgc2l6ZW9mKCplc3B0KTsNCj4gKwljbGVuID0gUlRF X0FMSUdOX0NFSUwoY2xlbiwgc2EtPnBhZF9hbGlnbik7DQo+ICsNCj4gKwkvKiBwYWQgbGVuZ3Ro ICsgZXNwIHRhaWwgKi8NCj4gKwlwZGxlbiA9IGNsZW4gLSBwbGVuOw0KPiArCXRsZW4gPSBwZGxl biArIHNhLT5pY3ZfbGVuOw0KPiArDQo+ICsJLyogZG8gYXBwZW5kIGFuZCBwcmVwZW5kICovDQo+ ICsJbWwgPSBydGVfcGt0bWJ1Zl9sYXN0c2VnKG1iKTsNCj4gKwlpZiAodGxlbiArIHNhLT5zcWhf bGVuICsgc2EtPmFhZF9sZW4gPiBydGVfcGt0bWJ1Zl90YWlscm9vbShtbCkpDQo+ICsJCXJldHVy biAtRU5PU1BDOw0KPiArDQo+ICsJLyogcHJlcGVuZCBoZWFkZXIgKi8NCj4gKwlwaCA9IHJ0ZV9w a3RtYnVmX3ByZXBlbmQobWIsIGhsZW4gLSBsMmxlbik7DQo+ICsJaWYgKHBoID09IE5VTEwpDQo+ ICsJCXJldHVybiAtRU5PU1BDOw0KPiArDQo+ICsJLyogYXBwZW5kIHRhaWwgKi8NCj4gKwlwZG9m cyA9IG1sLT5kYXRhX2xlbjsNCj4gKwltbC0+ZGF0YV9sZW4gKz0gdGxlbjsNCj4gKwltYi0+cGt0 X2xlbiArPSB0bGVuOw0KPiArCXB0ID0gcnRlX3BrdG1idWZfbXRvZF9vZmZzZXQobWwsIHR5cGVv ZihwdCksIHBkb2ZzKTsNCj4gKw0KPiArCS8qIHVwZGF0ZSBwa3QgbDIvbDMgbGVuICovDQo+ICsJ bWItPmwyX2xlbiA9IHNhLT5oZHJfbDNfb2ZmOw0KPiArCW1iLT5sM19sZW4gPSBzYS0+aGRyX2xl biAtIHNhLT5oZHJfbDNfb2ZmOw0KPiArDQo+ICsJLyogY29weSB0dW5uZWwgcGt0IGhlYWRlciAq Lw0KPiArCXJ0ZV9tZW1jcHkocGgsIHNhLT5oZHIsIHNhLT5oZHJfbGVuKTsNCj4gKw0KPiArCS8q IHVwZGF0ZSBvcmlnaW5hbCBhbmQgbmV3IGlwIGhlYWRlciBmaWVsZHMgKi8NCj4gKwl1cGRhdGVf dHVuX2wzaGRyKHNhLCBwaCArIHNhLT5oZHJfbDNfb2ZmLCBtYi0+cGt0X2xlbiwgc2EtPmhkcl9s M19vZmYsDQo+ICsJCQlzcW5fbG93MTYoc3FjKSk7DQo+ICsNCj4gKwkvKiB1cGRhdGUgc3BpLCBz ZXFuIGFuZCBpdiAqLw0KPiArCWVzcGggPSAoc3RydWN0IGVzcF9oZHIgKikocGggKyBzYS0+aGRy X2xlbik7DQo+ICsJaXYgPSAodWludDY0X3QgKikoZXNwaCArIDEpOw0KPiArCXJ0ZV9tZW1jcHko aXYsIGl2cCwgc2EtPml2X2xlbik7DQo+ICsNCj4gKwllc3BoLT5zcGkgPSBzYS0+c3BpOw0KPiAr CWVzcGgtPnNlcSA9IHNxbl9sb3czMihzcWMpOw0KPiArDQo+ICsJLyogb2Zmc2V0IGZvciBJQ1Yg Ki8NCj4gKwlwZG9mcyArPSBwZGxlbiArIHNhLT5zcWhfbGVuOw0KPiArDQo+ICsJLyogcGFkIGxl bmd0aCAqLw0KPiArCXBkbGVuIC09IHNpemVvZigqZXNwdCk7DQo+ICsNCj4gKwkvKiBjb3B5IHBh ZGRpbmcgZGF0YSAqLw0KPiArCXJ0ZV9tZW1jcHkocHQsIGVzcF9wYWRfYnl0ZXMsIHBkbGVuKTsN Cj4gKw0KPiArCS8qIHVwZGF0ZSBlc3AgdHJhaWxlciAqLw0KPiArCWVzcHQgPSAoc3RydWN0IGVz cF90YWlsICopKHB0ICsgcGRsZW4pOw0KPiArCWVzcHQtPnBhZF9sZW4gPSBwZGxlbjsNCj4gKwll c3B0LT5uZXh0X3Byb3RvID0gc2EtPnByb3RvOw0KPiArDQo+ICsJaWN2LT52YSA9IHJ0ZV9wa3Rt YnVmX210b2Rfb2Zmc2V0KG1sLCB2b2lkICosIHBkb2ZzKTsNCj4gKwlpY3YtPnBhID0gcnRlX3Br dG1idWZfaW92YV9vZmZzZXQobWwsIHBkb2ZzKTsNCj4gKw0KPiArCXJldHVybiBjbGVuOw0KPiAr fQ0KPiArDQo+ICsvKg0KPiArICogZm9yIHB1cmUgY3J5cHRvZGV2IChsb29rYXNpZGUgbm9uZSkg ZGVwZW5kaW5nIG9uIFNBIHNldHRpbmdzLA0KPiArICogd2UgbWlnaHQgaGF2ZSB0byB3cml0ZSBz b21lIGV4dHJhIGRhdGEgdG8gdGhlIHBhY2tldC4NCj4gKyAqLw0KPiArc3RhdGljIGlubGluZSB2 b2lkDQo+ICtvdXRiX3BrdF94cHJlcGFyZShjb25zdCBzdHJ1Y3QgcnRlX2lwc2VjX3NhICpzYSwg cnRlX2JlNjRfdCBzcWMsDQo+ICsJY29uc3QgdW5pb24gc3ltX29wX2RhdGEgKmljdikNCj4gK3sN Cj4gKwl1aW50MzJfdCAqcHNxaDsNCj4gKwlzdHJ1Y3QgYWVhZF9nY21fYWFkICphYWQ7DQo+ICsN Cj4gKwkvKiBpbnNlcnQgU1FOLmhpIGJldHdlZW4gRVNQIHRyYWlsZXIgYW5kIElDViAqLw0KPiAr CWlmIChzYS0+c3FoX2xlbiAhPSAwKSB7DQo+ICsJCXBzcWggPSAodWludDMyX3QgKikoaWN2LT52 YSAtIHNhLT5zcWhfbGVuKTsNCj4gKwkJcHNxaFswXSA9IHNxbl9oaTMyKHNxYyk7DQo+ICsJfQ0K PiArDQo+ICsJLyoNCj4gKwkgKiBmaWxsIElWIGFuZCBBQUQgZmllbGRzLCBpZiBhbnkgKGFhZCBm aWVsZHMgYXJlIHBsYWNlZCBhZnRlciBpY3YpLA0KPiArCSAqIHJpZ2h0IG5vdyB3ZSBzdXBwb3J0 IG9ubHkgb25lIEFFQUQgYWxnb3JpdGhtOiBBRVMtR0NNIC4NCj4gKwkgKi8NCj4gKwlpZiAoc2Et PmFhZF9sZW4gIT0gMCkgew0KPiArCQlhYWQgPSAoc3RydWN0IGFlYWRfZ2NtX2FhZCAqKShpY3Yt PnZhICsgc2EtPmljdl9sZW4pOw0KPiArCQlhZWFkX2djbV9hYWRfZmlsbChhYWQsIHNhLT5zcGks IHNxYywgSVNfRVNOKHNhKSk7DQo+ICsJfQ0KPiArfQ0KPiArDQpwcm9iYWJseSBhIGNvbW1lbnQg YmVmb3JlIGV2ZXJ5IGZ1bmN0aW9uIHdvdWxkIGJlIGJldHRlciBpbiBhIGxpYnJhcnkgY29kZQ0K PiArc3RhdGljIHVpbnQxNl90DQo+ICtvdXRiX3R1bl9wcmVwYXJlKGNvbnN0IHN0cnVjdCBydGVf aXBzZWNfc2Vzc2lvbiAqc3MsIHN0cnVjdCBydGVfbWJ1ZiAqbWJbXSwNCj4gKwlzdHJ1Y3QgcnRl X2NyeXB0b19vcCAqY29wW10sIHVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwlpbnQzMl90IHJjOw0K PiArCXVpbnQzMl90IGksIGssIG47DQo+ICsJdWludDY0X3Qgc3FuOw0KPiArCXJ0ZV9iZTY0X3Qg c3FjOw0KPiArCXN0cnVjdCBydGVfaXBzZWNfc2EgKnNhOw0KPiArCXVuaW9uIHN5bV9vcF9kYXRh IGljdjsNCj4gKwl1aW50NjRfdCBpdltJUFNFQ19NQVhfSVZfUVdPUkRdOw0KPiArCXN0cnVjdCBy dGVfbWJ1ZiAqZHJbbnVtXTsNCj4gKw0KPiArCXNhID0gc3MtPnNhOw0KPiArDQo+ICsJbiA9IG51 bTsNCj4gKwlzcW4gPSBlc25fb3V0Yl91cGRhdGVfc3FuKHNhLCAmbik7DQo+ICsJaWYgKG4gIT0g bnVtKQ0KPiArCQlydGVfZXJybm8gPSBFT1ZFUkZMT1c7DQo+ICsNCj4gKwlrID0gMDsNCj4gKwlm b3IgKGkgPSAwOyBpICE9IG47IGkrKykgew0KPiArDQo+ICsJCXNxYyA9IHJ0ZV9jcHVfdG9fYmVf NjQoc3FuICsgaSk7DQo+ICsJCWdlbl9pdihpdiwgc3FjKTsNCj4gKw0KPiArCQkvKiB0cnkgdG8g dXBkYXRlIHRoZSBwYWNrZXQgaXRzZWxmICovDQo+ICsJCXJjID0gZXNwX291dGJfdHVuX3BrdF9w cmVwYXJlKHNhLCBzcWMsIGl2LCBtYltpXSwgJmljdik7DQo+ICsNCj4gKwkJLyogc3VjY2Vzcywg c2V0dXAgY3J5cHRvIG9wICovDQo+ICsJCWlmIChyYyA+PSAwKSB7DQo+ICsJCQltYltrXSA9IG1i W2ldOw0KPiArCQkJb3V0Yl9wa3RfeHByZXBhcmUoc2EsIHNxYywgJmljdik7DQo+ICsJCQllc3Bf b3V0Yl9jb3BfcHJlcGFyZShjb3Bba10sIHNhLCBpdiwgJmljdiwgMCwgcmMpOw0KPiArCQkJaysr Ow0KPiArCQkvKiBmYWlsdXJlLCBwdXQgcGFja2V0IGludG8gdGhlIGRlYXRoLXJvdyAqLw0KPiAr CQl9IGVsc2Ugew0KPiArCQkJZHJbaSAtIGtdID0gbWJbaV07DQo+ICsJCQlydGVfZXJybm8gPSAt cmM7DQo+ICsJCX0NCj4gKwl9DQo+ICsNCj4gKwkvKiB1cGRhdGUgY29wcyAqLw0KPiArCWxrc2Rf bm9uZV9jb3BfcHJlcGFyZShzcywgbWIsIGNvcCwgayk7DQo+ICsNCj4gKwkgLyogY29weSBub3Qg cHJlcGFyZWQgbWJ1ZnMgYmV5b25kIGdvb2Qgb25lcyAqLw0KPiArCWlmIChrICE9IG51bSAmJiBr ICE9IDApDQo+ICsJCW1idWZfYnVsa19jb3B5KG1iICsgaywgZHIsIG51bSAtIGspOw0KPiArDQo+ ICsJcmV0dXJuIGs7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbmxpbmUgaW50MzJfdA0KPiArZXNw X291dGJfdHJzX3BrdF9wcmVwYXJlKHN0cnVjdCBydGVfaXBzZWNfc2EgKnNhLCBydGVfYmU2NF90 IHNxYywNCj4gKwljb25zdCB1aW50NjRfdCBpdnBbSVBTRUNfTUFYX0lWX1FXT1JEXSwgc3RydWN0 IHJ0ZV9tYnVmICptYiwNCj4gKwl1aW50MzJfdCBsMmxlbiwgdWludDMyX3QgbDNsZW4sIHVuaW9u IHN5bV9vcF9kYXRhICppY3YpDQo+ICt7DQo+ICsJdWludDhfdCBucDsNCj4gKwl1aW50MzJfdCBj bGVuLCBobGVuLCBwZGxlbiwgcGRvZnMsIHBsZW4sIHRsZW4sIHVobGVuOw0KPiArCXN0cnVjdCBy dGVfbWJ1ZiAqbWw7DQo+ICsJc3RydWN0IGVzcF9oZHIgKmVzcGg7DQo+ICsJc3RydWN0IGVzcF90 YWlsICplc3B0Ow0KPiArCWNoYXIgKnBoLCAqcHQ7DQo+ICsJdWludDY0X3QgKml2Ow0KPiArDQo+ ICsJdWhsZW4gPSBsMmxlbiArIGwzbGVuOw0KPiArCXBsZW4gPSBtYi0+cGt0X2xlbiAtIHVobGVu Ow0KPiArDQo+ICsJLyogY2FsY3VsYXRlIGV4dHJhIGhlYWRlciBzcGFjZSByZXF1aXJlZCAqLw0K PiArCWhsZW4gPSBzYS0+aXZfbGVuICsgc2l6ZW9mKCplc3BoKTsNCj4gKw0KPiArCS8qIG51bWJl ciBvZiBieXRlcyB0byBlbmNyeXB0ICovDQo+ICsJY2xlbiA9IHBsZW4gKyBzaXplb2YoKmVzcHQp Ow0KPiArCWNsZW4gPSBSVEVfQUxJR05fQ0VJTChjbGVuLCBzYS0+cGFkX2FsaWduKTsNCj4gKw0K PiArCS8qIHBhZCBsZW5ndGggKyBlc3AgdGFpbCAqLw0KPiArCXBkbGVuID0gY2xlbiAtIHBsZW47 DQo+ICsJdGxlbiA9IHBkbGVuICsgc2EtPmljdl9sZW47DQo+ICsNCj4gKwkvKiBkbyBhcHBlbmQg YW5kIGluc2VydCAqLw0KPiArCW1sID0gcnRlX3BrdG1idWZfbGFzdHNlZyhtYik7DQo+ICsJaWYg KHRsZW4gKyBzYS0+c3FoX2xlbiArIHNhLT5hYWRfbGVuID4gcnRlX3BrdG1idWZfdGFpbHJvb20o bWwpKQ0KPiArCQlyZXR1cm4gLUVOT1NQQzsNCj4gKw0KPiArCS8qIHByZXBlbmQgc3BhY2UgZm9y IEVTUCBoZWFkZXIgKi8NCj4gKwlwaCA9IHJ0ZV9wa3RtYnVmX3ByZXBlbmQobWIsIGhsZW4pOw0K PiArCWlmIChwaCA9PSBOVUxMKQ0KPiArCQlyZXR1cm4gLUVOT1NQQzsNCj4gKw0KPiArCS8qIGFw cGVuZCB0YWlsICovDQo+ICsJcGRvZnMgPSBtbC0+ZGF0YV9sZW47DQo+ICsJbWwtPmRhdGFfbGVu ICs9IHRsZW47DQo+ICsJbWItPnBrdF9sZW4gKz0gdGxlbjsNCj4gKwlwdCA9IHJ0ZV9wa3RtYnVm X210b2Rfb2Zmc2V0KG1sLCB0eXBlb2YocHQpLCBwZG9mcyk7DQo+ICsNCj4gKwkvKiBzaGlmdCBM Mi9MMyBoZWFkZXJzICovDQo+ICsJaW5zZXJ0X2VzcGgocGgsIHBoICsgaGxlbiwgdWhsZW4pOw0K PiArDQo+ICsJLyogdXBkYXRlIGlwICBoZWFkZXIgZmllbGRzICovDQo+ICsJbnAgPSB1cGRhdGVf dHJzX2wzaGRyKHNhLCBwaCArIGwybGVuLCBtYi0+cGt0X2xlbiwgbDJsZW4sIGwzbGVuLA0KPiAr CQkJSVBQUk9UT19FU1ApOw0KPiArDQo+ICsJLyogdXBkYXRlIHNwaSwgc2VxbiBhbmQgaXYgKi8N Cj4gKwllc3BoID0gKHN0cnVjdCBlc3BfaGRyICopKHBoICsgdWhsZW4pOw0KPiArCWl2ID0gKHVp bnQ2NF90ICopKGVzcGggKyAxKTsNCj4gKwlydGVfbWVtY3B5KGl2LCBpdnAsIHNhLT5pdl9sZW4p Ow0KPiArDQo+ICsJZXNwaC0+c3BpID0gc2EtPnNwaTsNCj4gKwllc3BoLT5zZXEgPSBzcW5fbG93 MzIoc3FjKTsNCj4gKw0KPiArCS8qIG9mZnNldCBmb3IgSUNWICovDQo+ICsJcGRvZnMgKz0gcGRs ZW4gKyBzYS0+c3FoX2xlbjsNCj4gKw0KPiArCS8qIHBhZCBsZW5ndGggKi8NCj4gKwlwZGxlbiAt PSBzaXplb2YoKmVzcHQpOw0KPiArDQo+ICsJLyogY29weSBwYWRkaW5nIGRhdGEgKi8NCj4gKwly dGVfbWVtY3B5KHB0LCBlc3BfcGFkX2J5dGVzLCBwZGxlbik7DQo+ICsNCj4gKwkvKiB1cGRhdGUg ZXNwIHRyYWlsZXIgKi8NCj4gKwllc3B0ID0gKHN0cnVjdCBlc3BfdGFpbCAqKShwdCArIHBkbGVu KTsNCj4gKwllc3B0LT5wYWRfbGVuID0gcGRsZW47DQo+ICsJZXNwdC0+bmV4dF9wcm90byA9IG5w Ow0KPiArDQo+ICsJaWN2LT52YSA9IHJ0ZV9wa3RtYnVmX210b2Rfb2Zmc2V0KG1sLCB2b2lkICos IHBkb2ZzKTsNCj4gKwlpY3YtPnBhID0gcnRlX3BrdG1idWZfaW92YV9vZmZzZXQobWwsIHBkb2Zz KTsNCj4gKw0KPiArCXJldHVybiBjbGVuOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgdWludDE2X3QN Cj4gK291dGJfdHJzX3ByZXBhcmUoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpzcywg c3RydWN0IHJ0ZV9tYnVmICptYltdLA0KPiArCXN0cnVjdCBydGVfY3J5cHRvX29wICpjb3BbXSwg dWludDE2X3QgbnVtKQ0KPiArew0KPiArCWludDMyX3QgcmM7DQo+ICsJdWludDMyX3QgaSwgaywg biwgbDIsIGwzOw0KPiArCXVpbnQ2NF90IHNxbjsNCj4gKwlydGVfYmU2NF90IHNxYzsNCj4gKwlz dHJ1Y3QgcnRlX2lwc2VjX3NhICpzYTsNCj4gKwl1bmlvbiBzeW1fb3BfZGF0YSBpY3Y7DQo+ICsJ dWludDY0X3QgaXZbSVBTRUNfTUFYX0lWX1FXT1JEXTsNCj4gKwlzdHJ1Y3QgcnRlX21idWYgKmRy W251bV07DQo+ICsNCj4gKwlzYSA9IHNzLT5zYTsNCj4gKw0KPiArCW4gPSBudW07DQo+ICsJc3Fu ID0gZXNuX291dGJfdXBkYXRlX3NxbihzYSwgJm4pOw0KPiArCWlmIChuICE9IG51bSkNCj4gKwkJ cnRlX2Vycm5vID0gRU9WRVJGTE9XOw0KPiArDQo+ICsJayA9IDA7DQo+ICsJZm9yIChpID0gMDsg aSAhPSBuOyBpKyspIHsNCj4gKw0KPiArCQlsMiA9IG1iW2ldLT5sMl9sZW47DQo+ICsJCWwzID0g bWJbaV0tPmwzX2xlbjsNCj4gKw0KPiArCQlzcWMgPSBydGVfY3B1X3RvX2JlXzY0KHNxbiArIGkp Ow0KPiArCQlnZW5faXYoaXYsIHNxYyk7DQo+ICsNCj4gKwkJLyogdHJ5IHRvIHVwZGF0ZSB0aGUg cGFja2V0IGl0c2VsZiAqLw0KPiArCQlyYyA9IGVzcF9vdXRiX3Ryc19wa3RfcHJlcGFyZShzYSwg c3FjLCBpdiwgbWJbaV0sDQo+ICsJCQkJbDIsIGwzLCAmaWN2KTsNCj4gKw0KPiArCQkvKiBzdWNj ZXNzLCBzZXR1cCBjcnlwdG8gb3AgKi8NCj4gKwkJaWYgKHJjID49IDApIHsNCj4gKwkJCW1iW2td ID0gbWJbaV07DQo+ICsJCQlvdXRiX3BrdF94cHJlcGFyZShzYSwgc3FjLCAmaWN2KTsNCj4gKwkJ CWVzcF9vdXRiX2NvcF9wcmVwYXJlKGNvcFtrXSwgc2EsIGl2LCAmaWN2LCBsMiArIGwzLCByYyk7 DQo+ICsJCQlrKys7DQo+ICsJCS8qIGZhaWx1cmUsIHB1dCBwYWNrZXQgaW50byB0aGUgZGVhdGgt cm93ICovDQo+ICsJCX0gZWxzZSB7DQo+ICsJCQlkcltpIC0ga10gPSBtYltpXTsNCj4gKwkJCXJ0 ZV9lcnJubyA9IC1yYzsNCj4gKwkJfQ0KPiArCX0NCj4gKw0KPiArCS8qIHVwZGF0ZSBjb3BzICov DQo+ICsJbGtzZF9ub25lX2NvcF9wcmVwYXJlKHNzLCBtYiwgY29wLCBrKTsNCj4gKw0KPiArCS8q IGNvcHkgbm90IHByZXBhcmVkIG1idWZzIGJleW9uZCBnb29kIG9uZXMgKi8NCj4gKwlpZiAoayAh PSBudW0gJiYgayAhPSAwKQ0KPiArCQltYnVmX2J1bGtfY29weShtYiArIGssIGRyLCBudW0gLSBr KTsNCj4gKw0KPiArCXJldHVybiBrOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW5saW5lIGludDMy X3QNCj4gK2VzcF9pbmJfdHVuX2NvcF9wcmVwYXJlKHN0cnVjdCBydGVfY3J5cHRvX29wICpjb3As DQo+ICsJY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2EsIHN0cnVjdCBydGVfbWJ1ZiAqbWIs DQo+ICsJY29uc3QgdW5pb24gc3ltX29wX2RhdGEgKmljdiwgdWludDMyX3QgcG9mcywgdWludDMy X3QgcGxlbikNCj4gK3sNCj4gKwlzdHJ1Y3QgcnRlX2NyeXB0b19zeW1fb3AgKnNvcDsNCj4gKwlz dHJ1Y3QgYWVhZF9nY21faXYgKmdjbTsNCj4gKwl1aW50NjRfdCAqaXZjLCAqaXZwOw0KPiArCXVp bnQzMl90IGNsZW47DQo+ICsNCj4gKwljbGVuID0gcGxlbiAtIHNhLT5jdHAuY2lwaGVyLmxlbmd0 aDsNCj4gKwlpZiAoKGludDMyX3QpY2xlbiA8IDAgfHwgKGNsZW4gJiAoc2EtPnBhZF9hbGlnbiAt IDEpKSAhPSAwKQ0KPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArCS8qIGZpbGwgc3ltIG9w IGZpZWxkcyAqLw0KPiArCXNvcCA9IGNvcC0+c3ltOw0KPiArDQo+ICsJLyogQUVBRCAoQUVTX0dD TSkgY2FzZSAqLw0KPiArCWlmIChzYS0+YWFkX2xlbiAhPSAwKSB7DQo+ICsJCXNvcC0+YWVhZC5k YXRhLm9mZnNldCA9IHBvZnMgKyBzYS0+Y3RwLmNpcGhlci5vZmZzZXQ7DQo+ICsJCXNvcC0+YWVh ZC5kYXRhLmxlbmd0aCA9IGNsZW47DQo+ICsJCXNvcC0+YWVhZC5kaWdlc3QuZGF0YSA9IGljdi0+ dmE7DQo+ICsJCXNvcC0+YWVhZC5kaWdlc3QucGh5c19hZGRyID0gaWN2LT5wYTsNCj4gKwkJc29w LT5hZWFkLmFhZC5kYXRhID0gaWN2LT52YSArIHNhLT5pY3ZfbGVuOw0KPiArCQlzb3AtPmFlYWQu YWFkLnBoeXNfYWRkciA9IGljdi0+cGEgKyBzYS0+aWN2X2xlbjsNCj4gKw0KPiArCQkvKiBmaWxs IEFBRCBJViAobG9jYXRlZCBpbnNpZGUgY3J5cHRvIG9wKSAqLw0KPiArCQlnY20gPSBydGVfY3J5 cHRvX29wX2N0b2Rfb2Zmc2V0KGNvcCwgc3RydWN0IGFlYWRfZ2NtX2l2ICosDQo+ICsJCQlzYS0+ aXZfb2ZzKTsNCj4gKwkJaXZwID0gcnRlX3BrdG1idWZfbXRvZF9vZmZzZXQobWIsIHVpbnQ2NF90 ICosDQo+ICsJCQlwb2ZzICsgc2l6ZW9mKHN0cnVjdCBlc3BfaGRyKSk7DQo+ICsJCWFlYWRfZ2Nt X2l2X2ZpbGwoZ2NtLCBpdnBbMF0sIHNhLT5zYWx0KTsNCj4gKwkvKiBDUllQVCtBVVRIIGNhc2Ug Ki8NCj4gKwl9IGVsc2Ugew0KPiArCQlzb3AtPmNpcGhlci5kYXRhLm9mZnNldCA9IHBvZnMgKyBz YS0+Y3RwLmNpcGhlci5vZmZzZXQ7DQo+ICsJCXNvcC0+Y2lwaGVyLmRhdGEubGVuZ3RoID0gY2xl bjsNCj4gKwkJc29wLT5hdXRoLmRhdGEub2Zmc2V0ID0gcG9mcyArIHNhLT5jdHAuYXV0aC5vZmZz ZXQ7DQo+ICsJCXNvcC0+YXV0aC5kYXRhLmxlbmd0aCA9IHBsZW4gLSBzYS0+Y3RwLmF1dGgubGVu Z3RoOw0KPiArCQlzb3AtPmF1dGguZGlnZXN0LmRhdGEgPSBpY3YtPnZhOw0KPiArCQlzb3AtPmF1 dGguZGlnZXN0LnBoeXNfYWRkciA9IGljdi0+cGE7DQo+ICsNCj4gKwkJLyogY29weSBpdiBmcm9t IHRoZSBpbnB1dCBwYWNrZXQgdG8gdGhlIGNvcCAqLw0KPiArCQlpdmMgPSBydGVfY3J5cHRvX29w X2N0b2Rfb2Zmc2V0KGNvcCwgdWludDY0X3QgKiwgc2EtPml2X29mcyk7DQo+ICsJCWl2cCA9IHJ0 ZV9wa3RtYnVmX210b2Rfb2Zmc2V0KG1iLCB1aW50NjRfdCAqLA0KPiArCQkJcG9mcyArIHNpemVv ZihzdHJ1Y3QgZXNwX2hkcikpOw0KPiArCQlydGVfbWVtY3B5KGl2YywgaXZwLCBzYS0+aXZfbGVu KTsNCj4gKwl9DQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiBmb3IgcHVy ZSBjcnlwdG9kZXYgKGxvb2thc2lkZSBub25lKSBkZXBlbmRpbmcgb24gU0Egc2V0dGluZ3MsDQo+ ICsgKiB3ZSBtaWdodCBoYXZlIHRvIHdyaXRlIHNvbWUgZXh0cmEgZGF0YSB0byB0aGUgcGFja2V0 Lg0KPiArICovDQo+ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4gK2luYl9wa3RfeHByZXBhcmUoY29u c3Qgc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2EsIHJ0ZV9iZTY0X3Qgc3FjLA0KPiArCWNvbnN0IHVu aW9uIHN5bV9vcF9kYXRhICppY3YpDQo+ICt7DQo+ICsJc3RydWN0IGFlYWRfZ2NtX2FhZCAqYWFk Ow0KPiArDQo+ICsJLyogaW5zZXJ0IFNRTi5oaSBiZXR3ZWVuIEVTUCB0cmFpbGVyIGFuZCBJQ1Yg Ki8NCj4gKwlpZiAoc2EtPnNxaF9sZW4gIT0gMCkNCj4gKwkJaW5zZXJ0X3NxaChzcW5faGkzMihz cWMpLCBpY3YtPnZhLCBzYS0+aWN2X2xlbik7DQo+ICsNCj4gKwkvKg0KPiArCSAqIGZpbGwgQUFE IGZpZWxkcywgaWYgYW55IChhYWQgZmllbGRzIGFyZSBwbGFjZWQgYWZ0ZXIgaWN2KSwNCj4gKwkg KiByaWdodCBub3cgd2Ugc3VwcG9ydCBvbmx5IG9uZSBBRUFEIGFsZ29yaXRobTogQUVTLUdDTS4N Cj4gKwkgKi8NCj4gKwlpZiAoc2EtPmFhZF9sZW4gIT0gMCkgew0KPiArCQlhYWQgPSAoc3RydWN0 IGFlYWRfZ2NtX2FhZCAqKShpY3YtPnZhICsgc2EtPmljdl9sZW4pOw0KPiArCQlhZWFkX2djbV9h YWRfZmlsbChhYWQsIHNhLT5zcGksIHNxYywgSVNfRVNOKHNhKSk7DQo+ICsJfQ0KPiArfQ0KPiAr DQo+ICtzdGF0aWMgaW5saW5lIGludDMyX3QNCj4gK2VzcF9pbmJfdHVuX3BrdF9wcmVwYXJlKGNv bnN0IHN0cnVjdCBydGVfaXBzZWNfc2EgKnNhLA0KPiArCWNvbnN0IHN0cnVjdCByZXBsYXlfc3Fu ICpyc24sIHN0cnVjdCBydGVfbWJ1ZiAqbWIsDQo+ICsJdWludDMyX3QgaGxlbiwgdW5pb24gc3lt X29wX2RhdGEgKmljdikNCj4gK3sNCj4gKwlpbnQzMl90IHJjOw0KPiArCXVpbnQ2NF90IHNxbjsN Cj4gKwl1aW50MzJfdCBpY3Zfb2ZzLCBwbGVuOw0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqbWw7DQo+ ICsJc3RydWN0IGVzcF9oZHIgKmVzcGg7DQo+ICsNCj4gKwllc3BoID0gcnRlX3BrdG1idWZfbXRv ZF9vZmZzZXQobWIsIHN0cnVjdCBlc3BfaGRyICosIGhsZW4pOw0KPiArDQo+ICsJLyoNCj4gKwkg KiByZXRyaWV2ZSBhbmQgcmVjb25zdHJ1Y3QgU1FOLCB0aGVuIGNoZWNrIGl0LCB0aGVuDQo+ICsJ ICogY29udmVydCBpdCBiYWNrIGludG8gbmV0d29yayBieXRlIG9yZGVyLg0KPiArCSAqLw0KPiAr CXNxbiA9IHJ0ZV9iZV90b19jcHVfMzIoZXNwaC0+c2VxKTsNCj4gKwlpZiAoSVNfRVNOKHNhKSkN Cj4gKwkJc3FuID0gcmVjb25zdHJ1Y3RfZXNuKHJzbi0+c3FuLCBzcW4sIHNhLT5yZXBsYXkud2lu X3N6KTsNCj4gKw0KPiArCXJjID0gZXNuX2luYl9jaGVja19zcW4ocnNuLCBzYSwgc3FuKTsNCj4g KwlpZiAocmMgIT0gMCkNCj4gKwkJcmV0dXJuIHJjOw0KPiArDQo+ICsJc3FuID0gcnRlX2NwdV90 b19iZV82NChzcW4pOw0KPiArDQo+ICsJLyogc3RhcnQgcGFja2V0IG1hbmlwdWxhdGlvbiAqLw0K PiArCXBsZW4gPSBtYi0+cGt0X2xlbjsNCj4gKwlwbGVuID0gcGxlbiAtIGhsZW47DQo+ICsNCj4g KwltbCA9IHJ0ZV9wa3RtYnVmX2xhc3RzZWcobWIpOw0KPiArCWljdl9vZnMgPSBtbC0+ZGF0YV9s ZW4gLSBzYS0+aWN2X2xlbiArIHNhLT5zcWhfbGVuOw0KPiArDQo+ICsJLyogd2UgaGF2ZSB0byBh bGxvY2F0ZSBzcGFjZSBmb3IgQUFEIHNvbWV3aGVyZSwNCj4gKwkgKiByaWdodCBub3cgLSBqdXN0 IHVzZSBmcmVlIHRyYWlsaW5nIHNwYWNlIGF0IHRoZSBsYXN0IHNlZ21lbnQuDQo+ICsJICogV291 bGQgcHJvYmFibHkgYmUgbW9yZSBjb252ZW5pZW50IHRvIHJlc2VydmUgc3BhY2UgZm9yIEFBRA0K PiArCSAqIGluc2lkZSBydGVfY3J5cHRvX29wIGl0c2VsZg0KPiArCSAqIChhZ2FpbiBmb3IgSVYg c3BhY2UgaXMgYWxyZWFkeSByZXNlcnZlZCBpbnNpZGUgY29wKS4NCj4gKwkgKi8NCj4gKwlpZiAo c2EtPmFhZF9sZW4gKyBzYS0+c3FoX2xlbiA+IHJ0ZV9wa3RtYnVmX3RhaWxyb29tKG1sKSkNCj4g KwkJcmV0dXJuIC1FTk9TUEM7DQo+ICsNCj4gKwlpY3YtPnZhID0gcnRlX3BrdG1idWZfbXRvZF9v ZmZzZXQobWwsIHZvaWQgKiwgaWN2X29mcyk7DQo+ICsJaWN2LT5wYSA9IHJ0ZV9wa3RtYnVmX2lv dmFfb2Zmc2V0KG1sLCBpY3Zfb2ZzKTsNCj4gKw0KPiArCWluYl9wa3RfeHByZXBhcmUoc2EsIHNx biwgaWN2KTsNCj4gKwlyZXR1cm4gcGxlbjsNCj4gK30NCj4gKw0KPiArc3RhdGljIHVpbnQxNl90 DQo+ICtpbmJfcGt0X3ByZXBhcmUoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpzcywg c3RydWN0IHJ0ZV9tYnVmICptYltdLA0KPiArCXN0cnVjdCBydGVfY3J5cHRvX29wICpjb3BbXSwg dWludDE2X3QgbnVtKQ0KPiArew0KPiArCWludDMyX3QgcmM7DQo+ICsJdWludDMyX3QgaSwgaywg aGw7DQo+ICsJc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2E7DQo+ICsJc3RydWN0IHJlcGxheV9zcW4g KnJzbjsNCj4gKwl1bmlvbiBzeW1fb3BfZGF0YSBpY3Y7DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICpk cltudW1dOw0KPiArDQo+ICsJc2EgPSBzcy0+c2E7DQo+ICsJcnNuID0gc2EtPnNxbi5pbmI7DQo+ ICsNCj4gKwlrID0gMDsNCj4gKwlmb3IgKGkgPSAwOyBpICE9IG51bTsgaSsrKSB7DQo+ICsNCj4g KwkJaGwgPSBtYltpXS0+bDJfbGVuICsgbWJbaV0tPmwzX2xlbjsNCj4gKwkJcmMgPSBlc3BfaW5i X3R1bl9wa3RfcHJlcGFyZShzYSwgcnNuLCBtYltpXSwgaGwsICZpY3YpOw0KPiArCQlpZiAocmMg Pj0gMCkNCj4gKwkJCXJjID0gZXNwX2luYl90dW5fY29wX3ByZXBhcmUoY29wW2tdLCBzYSwgbWJb aV0sICZpY3YsDQo+ICsJCQkJaGwsIHJjKTsNCj4gKw0KPiArCQlpZiAocmMgPT0gMCkNCj4gKwkJ CW1iW2srK10gPSBtYltpXTsNCj4gKwkJZWxzZSB7DQo+ICsJCQlkcltpIC0ga10gPSBtYltpXTsN Cj4gKwkJCXJ0ZV9lcnJubyA9IC1yYzsNCj4gKwkJfQ0KPiArCX0NCj4gKw0KPiArCS8qIHVwZGF0 ZSBjb3BzICovDQo+ICsJbGtzZF9ub25lX2NvcF9wcmVwYXJlKHNzLCBtYiwgY29wLCBrKTsNCj4g Kw0KPiArCS8qIGNvcHkgbm90IHByZXBhcmVkIG1idWZzIGJleW9uZCBnb29kIG9uZXMgKi8NCj4g KwlpZiAoayAhPSBudW0gJiYgayAhPSAwKQ0KPiArCQltYnVmX2J1bGtfY29weShtYiArIGssIGRy LCBudW0gLSBrKTsNCj4gKw0KPiArCXJldHVybiBrOw0KPiArfQ0KPiArDQpuYW1pbmcgY29udmVu dGlvbiB1c2VkIGlzIGNyeXB0aWMuIEEgY29tbWVudCB3b3VsZCBiZSBhcHByZWNpYXRlZC4NCj4g K3N0YXRpYyBpbmxpbmUgdm9pZA0KPiArbGtzZF9wcm90b19jb3BfcHJlcGFyZShjb25zdCBzdHJ1 Y3QgcnRlX2lwc2VjX3Nlc3Npb24gKnNzLA0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqbWJbXSwgc3Ry dWN0IHJ0ZV9jcnlwdG9fb3AgKmNvcFtdLCB1aW50MTZfdCBudW0pDQo+ICt7DQo+ICsJdWludDMy X3QgaTsNCj4gKwlzdHJ1Y3QgcnRlX2NyeXB0b19zeW1fb3AgKnNvcDsNCj4gKw0KPiArCWZvciAo aSA9IDA7IGkgIT0gbnVtOyBpKyspIHsNCj4gKwkJc29wID0gY29wW2ldLT5zeW07DQo+ICsJCWNv cFtpXS0+dHlwZSA9IFJURV9DUllQVE9fT1BfVFlQRV9TWU1NRVRSSUM7DQo+ICsJCWNvcFtpXS0+ c3RhdHVzID0gUlRFX0NSWVBUT19PUF9TVEFUVVNfTk9UX1BST0NFU1NFRDsNCj4gKwkJY29wW2ld LT5zZXNzX3R5cGUgPSBSVEVfQ1JZUFRPX09QX1NFQ1VSSVRZX1NFU1NJT047DQo+ICsJCXNvcC0+ bV9zcmMgPSBtYltpXTsNCj4gKwkJX19ydGVfc2VjdXJpdHlfYXR0YWNoX3Nlc3Npb24oc29wLCBz cy0+c2VjdXJpdHkuc2VzKTsNCj4gKwl9DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyB1aW50MTZfdA0K PiArbGtzZF9wcm90b19wcmVwYXJlKGNvbnN0IHN0cnVjdCBydGVfaXBzZWNfc2Vzc2lvbiAqc3Ms DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICptYltdLCBzdHJ1Y3QgcnRlX2NyeXB0b19vcCAqY29wW10s IHVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwlsa3NkX3Byb3RvX2NvcF9wcmVwYXJlKHNzLCBtYiwg Y29wLCBudW0pOw0KPiArCXJldHVybiBudW07DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbmxpbmUg aW50DQo+ICtlc3BfaW5iX3R1bl9zaW5nbGVfcGt0X3Byb2Nlc3Moc3RydWN0IHJ0ZV9pcHNlY19z YSAqc2EsIHN0cnVjdCBydGVfbWJ1ZiAqbWIsDQo+ICsJdWludDMyX3QgKnNxbikNCj4gK3sNCj4g Kwl1aW50MzJfdCBobGVuLCBpY3ZfbGVuLCB0bGVuOw0KPiArCXN0cnVjdCBlc3BfaGRyICplc3Bo Ow0KPiArCXN0cnVjdCBlc3BfdGFpbCAqZXNwdDsNCj4gKwlzdHJ1Y3QgcnRlX21idWYgKm1sOw0K PiArCWNoYXIgKnBkOw0KPiArDQo+ICsJaWYgKG1iLT5vbF9mbGFncyAmIFBLVF9SWF9TRUNfT0ZG TE9BRF9GQUlMRUQpDQo+ICsJCXJldHVybiAtRUJBRE1TRzsNCj4gKw0KPiArCWljdl9sZW4gPSBz YS0+aWN2X2xlbjsNCj4gKw0KPiArCW1sID0gcnRlX3BrdG1idWZfbGFzdHNlZyhtYik7DQo+ICsJ ZXNwdCA9IHJ0ZV9wa3RtYnVmX210b2Rfb2Zmc2V0KG1sLCBzdHJ1Y3QgZXNwX3RhaWwgKiwNCj4g KwkJbWwtPmRhdGFfbGVuIC0gaWN2X2xlbiAtIHNpemVvZigqZXNwdCkpOw0KPiArDQo+ICsJLyoN Cj4gKwkgKiBjaGVjayBwYWRkaW5nIGFuZCBuZXh0IHByb3RvLg0KPiArCSAqIHJldHVybiBhbiBl cnJvciBpZiBzb21ldGhpbmcgaXMgd3JvbmcuDQo+ICsJICovDQo+ICsJcGQgPSAoY2hhciAqKWVz cHQgLSBlc3B0LT5wYWRfbGVuOw0KPiArCWlmIChlc3B0LT5uZXh0X3Byb3RvICE9IHNhLT5wcm90 byB8fA0KPiArCQkJbWVtY21wKHBkLCBlc3BfcGFkX2J5dGVzLCBlc3B0LT5wYWRfbGVuKSkNCj4g KwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsNCj4gKwkvKiBjdXQgb2YgSUNWLCBFU1AgdGFpbCBhbmQg cGFkZGluZyBieXRlcyAqLw0KPiArCXRsZW4gPSBpY3ZfbGVuICsgc2l6ZW9mKCplc3B0KSArIGVz cHQtPnBhZF9sZW47DQo+ICsJbWwtPmRhdGFfbGVuIC09IHRsZW47DQo+ICsJbWItPnBrdF9sZW4g LT0gdGxlbjsNCj4gKw0KPiArCS8qIGN1dCBvZiBMMi9MMyBoZWFkZXJzLCBFU1AgaGVhZGVyIGFu ZCBJViAqLw0KPiArCWhsZW4gPSBtYi0+bDJfbGVuICsgbWItPmwzX2xlbjsNCj4gKwllc3BoID0g cnRlX3BrdG1idWZfbXRvZF9vZmZzZXQobWIsIHN0cnVjdCBlc3BfaGRyICosIGhsZW4pOw0KPiAr CXJ0ZV9wa3RtYnVmX2FkaihtYiwgaGxlbiArIHNhLT5jdHAuY2lwaGVyLm9mZnNldCk7DQo+ICsN Cj4gKwkvKiByZXRyaWV2ZSBTUU4gZm9yIGxhdGVyIGNoZWNrICovDQo+ICsJKnNxbiA9IHJ0ZV9i ZV90b19jcHVfMzIoZXNwaC0+c2VxKTsNCj4gKw0KPiArCS8qIHJlc2V0IG1idWYgbWV0YXRkYXRh OiBMMi9MMyBsZW4sIHBhY2tldCB0eXBlICovDQo+ICsJbWItPnBhY2tldF90eXBlID0gUlRFX1BU WVBFX1VOS05PV047DQo+ICsJbWItPmwyX2xlbiA9IDA7DQo+ICsJbWItPmwzX2xlbiA9IDA7DQo+ ICsNCj4gKwkvKiBjbGVhciB0aGUgUEtUX1JYX1NFQ19PRkZMT0FEIGZsYWcgaWYgc2V0ICovDQo+ ICsJbWItPm9sX2ZsYWdzICY9IH4obWItPm9sX2ZsYWdzICYgUEtUX1JYX1NFQ19PRkZMT0FEKTsN Cj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGlubGluZSBpbnQNCj4gK2VzcF9p bmJfdHJzX3NpbmdsZV9wa3RfcHJvY2VzcyhzdHJ1Y3QgcnRlX2lwc2VjX3NhICpzYSwgc3RydWN0 IHJ0ZV9tYnVmICptYiwNCj4gKwl1aW50MzJfdCAqc3FuKQ0KPiArew0KPiArCXVpbnQzMl90IGhs ZW4sIGljdl9sZW4sIGwybGVuLCBsM2xlbiwgdGxlbjsNCj4gKwlzdHJ1Y3QgZXNwX2hkciAqZXNw aDsNCj4gKwlzdHJ1Y3QgZXNwX3RhaWwgKmVzcHQ7DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICptbDsN Cj4gKwljaGFyICpucCwgKm9wLCAqcGQ7DQo+ICsNCj4gKwlpZiAobWItPm9sX2ZsYWdzICYgUEtU X1JYX1NFQ19PRkZMT0FEX0ZBSUxFRCkNCj4gKwkJcmV0dXJuIC1FQkFETVNHOw0KPiArDQo+ICsJ aWN2X2xlbiA9IHNhLT5pY3ZfbGVuOw0KPiArDQo+ICsJbWwgPSBydGVfcGt0bWJ1Zl9sYXN0c2Vn KG1iKTsNCj4gKwllc3B0ID0gcnRlX3BrdG1idWZfbXRvZF9vZmZzZXQobWwsIHN0cnVjdCBlc3Bf dGFpbCAqLA0KPiArCQltbC0+ZGF0YV9sZW4gLSBpY3ZfbGVuIC0gc2l6ZW9mKCplc3B0KSk7DQo+ ICsNCj4gKwkvKiBjaGVjayBwYWRkaW5nLCByZXR1cm4gYW4gZXJyb3IgaWYgc29tZXRoaW5nIGlz IHdyb25nLiAqLw0KPiArCXBkID0gKGNoYXIgKillc3B0IC0gZXNwdC0+cGFkX2xlbjsNCj4gKwlp ZiAobWVtY21wKHBkLCBlc3BfcGFkX2J5dGVzLCBlc3B0LT5wYWRfbGVuKSkNCj4gKwkJcmV0dXJu IC1FSU5WQUw7DQo+ICsNCj4gKwkvKiBjdXQgb2YgSUNWLCBFU1AgdGFpbCBhbmQgcGFkZGluZyBi eXRlcyAqLw0KPiArCXRsZW4gPSBpY3ZfbGVuICsgc2l6ZW9mKCplc3B0KSArIGVzcHQtPnBhZF9s ZW47DQo+ICsJbWwtPmRhdGFfbGVuIC09IHRsZW47DQo+ICsJbWItPnBrdF9sZW4gLT0gdGxlbjsN Cj4gKw0KPiArCS8qIHJldHJpZXZlIFNRTiBmb3IgbGF0ZXIgY2hlY2sgKi8NCj4gKwlsMmxlbiA9 IG1iLT5sMl9sZW47DQo+ICsJbDNsZW4gPSBtYi0+bDNfbGVuOw0KPiArCWhsZW4gPSBsMmxlbiAr IGwzbGVuOw0KPiArCW9wID0gcnRlX3BrdG1idWZfbXRvZChtYiwgY2hhciAqKTsNCj4gKwllc3Bo ID0gKHN0cnVjdCBlc3BfaGRyICopKG9wICsgaGxlbik7DQo+ICsJKnNxbiA9IHJ0ZV9iZV90b19j cHVfMzIoZXNwaC0+c2VxKTsNCj4gKw0KPiArCS8qIGN1dCBvZmYgRVNQIGhlYWRlciBhbmQgSVYs IHVwZGF0ZSBMMyBoZWFkZXIgKi8NCj4gKwlucCA9IHJ0ZV9wa3RtYnVmX2FkaihtYiwgc2EtPmN0 cC5jaXBoZXIub2Zmc2V0KTsNCj4gKwlyZW1vdmVfZXNwaChucCwgb3AsIGhsZW4pOw0KPiArCXVw ZGF0ZV90cnNfbDNoZHIoc2EsIG5wICsgbDJsZW4sIG1iLT5wa3RfbGVuLCBsMmxlbiwgbDNsZW4s DQo+ICsJCQllc3B0LT5uZXh0X3Byb3RvKTsNCj4gKw0KPiArCS8qIHJlc2V0IG1idWYgcGFja2V0 IHR5cGUgKi8NCj4gKwltYi0+cGFja2V0X3R5cGUgJj0gKFJURV9QVFlQRV9MMl9NQVNLIHwgUlRF X1BUWVBFX0wzX01BU0spOw0KPiArDQo+ICsJLyogY2xlYXIgdGhlIFBLVF9SWF9TRUNfT0ZGTE9B RCBmbGFnIGlmIHNldCAqLw0KPiArCW1iLT5vbF9mbGFncyAmPSB+KG1iLT5vbF9mbGFncyAmIFBL VF9SWF9TRUNfT0ZGTE9BRCk7DQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBp bmxpbmUgdWludDE2X3QNCj4gK2VzcF9pbmJfcnNuX3VwZGF0ZShzdHJ1Y3QgcnRlX2lwc2VjX3Nh ICpzYSwgY29uc3QgdWludDMyX3Qgc3FuW10sDQo+ICsJc3RydWN0IHJ0ZV9tYnVmICptYltdLCBz dHJ1Y3QgcnRlX21idWYgKmRyW10sIHVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwl1aW50MzJfdCBp LCBrOw0KPiArCXN0cnVjdCByZXBsYXlfc3FuICpyc247DQo+ICsNCj4gKwlyc24gPSBzYS0+c3Fu LmluYjsNCj4gKw0KPiArCWsgPSAwOw0KPiArCWZvciAoaSA9IDA7IGkgIT0gbnVtOyBpKyspIHsN Cj4gKwkJaWYgKGVzbl9pbmJfdXBkYXRlX3Nxbihyc24sIHNhLCBzcW5baV0pID09IDApDQo+ICsJ CQltYltrKytdID0gbWJbaV07DQo+ICsJCWVsc2UNCj4gKwkJCWRyW2kgLSBrXSA9IG1iW2ldOw0K PiArCX0NCj4gKw0KPiArCXJldHVybiBrOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgdWludDE2X3QN Cj4gK2luYl90dW5fcGt0X3Byb2Nlc3MoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpz cywgc3RydWN0IHJ0ZV9tYnVmICptYltdLA0KPiArCXVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwl1 aW50MzJfdCBpLCBrOw0KPiArCXN0cnVjdCBydGVfaXBzZWNfc2EgKnNhOw0KPiArCXVpbnQzMl90 IHNxbltudW1dOw0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqZHJbbnVtXTsNCj4gKw0KPiArCXNhID0g c3MtPnNhOw0KPiArDQo+ICsJLyogcHJvY2VzcyBwYWNrZXRzLCBleHRyYWN0IHNlcSBudW1iZXJz ICovDQo+ICsNCj4gKwlrID0gMDsNCj4gKwlmb3IgKGkgPSAwOyBpICE9IG51bTsgaSsrKSB7DQo+ ICsJCS8qIGdvb2QgcGFja2V0ICovDQo+ICsJCWlmIChlc3BfaW5iX3R1bl9zaW5nbGVfcGt0X3By b2Nlc3Moc2EsIG1iW2ldLCBzcW4gKyBrKSA9PSAwKQ0KPiArCQkJbWJbaysrXSA9IG1iW2ldOw0K PiArCQkvKiBiYWQgcGFja2V0LCB3aWxsIGRyb3AgZnJvbSBmdXJodGVyIHByb2Nlc3NpbmcgKi8N Cj4gKwkJZWxzZQ0KPiArCQkJZHJbaSAtIGtdID0gbWJbaV07DQo+ICsJfQ0KPiArDQo+ICsJLyog dXBkYXRlIHNlcSAjIGFuZCByZXBsYXkgd2lub3cgKi8NCj4gKwlrID0gZXNwX2luYl9yc25fdXBk YXRlKHNhLCBzcW4sIG1iLCBkciArIGkgLSBrLCBrKTsNCj4gKw0KPiArCS8qIGhhbmRsZSB1bnBy b2Nlc3NlZCBtYnVmcyAqLw0KPiArCWlmIChrICE9IG51bSkgew0KPiArCQlydGVfZXJybm8gPSBF QkFETVNHOw0KPiArCQlpZiAoayAhPSAwKQ0KPiArCQkJbWJ1Zl9idWxrX2NvcHkobWIgKyBrLCBk ciwgbnVtIC0gayk7DQo+ICsJfQ0KPiArDQo+ICsJcmV0dXJuIGs7DQo+ICt9DQo+ICsNCj4gK3N0 YXRpYyB1aW50MTZfdA0KPiAraW5iX3Ryc19wa3RfcHJvY2Vzcyhjb25zdCBzdHJ1Y3QgcnRlX2lw c2VjX3Nlc3Npb24gKnNzLCBzdHJ1Y3QgcnRlX21idWYgKm1iW10sDQo+ICsJdWludDE2X3QgbnVt KQ0KPiArew0KPiArCXVpbnQzMl90IGksIGs7DQo+ICsJdWludDMyX3Qgc3FuW251bV07DQo+ICsJ c3RydWN0IHJ0ZV9pcHNlY19zYSAqc2E7DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICpkcltudW1dOw0K PiArDQo+ICsJc2EgPSBzcy0+c2E7DQo+ICsNCj4gKwkvKiBwcm9jZXNzIHBhY2tldHMsIGV4dHJh Y3Qgc2VxIG51bWJlcnMgKi8NCj4gKw0KPiArCWsgPSAwOw0KPiArCWZvciAoaSA9IDA7IGkgIT0g bnVtOyBpKyspIHsNCj4gKwkJLyogZ29vZCBwYWNrZXQgKi8NCj4gKwkJaWYgKGVzcF9pbmJfdHJz X3NpbmdsZV9wa3RfcHJvY2VzcyhzYSwgbWJbaV0sIHNxbiArIGspID09IDApDQo+ICsJCQltYltr KytdID0gbWJbaV07DQo+ICsJCS8qIGJhZCBwYWNrZXQsIHdpbGwgZHJvcCBmcm9tIGZ1cmh0ZXIg cHJvY2Vzc2luZyAqLw0KPiArCQllbHNlDQo+ICsJCQlkcltpIC0ga10gPSBtYltpXTsNCj4gKwl9 DQo+ICsNCj4gKwkvKiB1cGRhdGUgc2VxICMgYW5kIHJlcGxheSB3aW5vdyAqLw0KPiArCWsgPSBl c3BfaW5iX3Jzbl91cGRhdGUoc2EsIHNxbiwgbWIsIGRyICsgaSAtIGssIGspOw0KPiArDQo+ICsJ LyogaGFuZGxlIHVucHJvY2Vzc2VkIG1idWZzICovDQo+ICsJaWYgKGsgIT0gbnVtKSB7DQo+ICsJ CXJ0ZV9lcnJubyA9IEVCQURNU0c7DQo+ICsJCWlmIChrICE9IDApDQo+ICsJCQltYnVmX2J1bGtf Y29weShtYiArIGssIGRyLCBudW0gLSBrKTsNCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gazsNCj4g K30NCj4gKw0KPiArLyoNCj4gKyAqIHByb2Nlc3Mgb3V0Ym91bmQgcGFja2V0cyBmb3IgU0Egd2l0 aCBFU04gc3VwcG9ydCwNCj4gKyAqIGZvciBhbGdvcml0aG1zIHRoYXQgcmVxdWlyZSBTUU4uaGli aXRzIHRvIGJlIGltcGxpY3RseSBpbmNsdWRlZA0KPiArICogaW50byBkaWdlc3QgY29tcHV0YXRp b24uDQo+ICsgKiBJbiB0aGF0IGNhc2Ugd2UgaGF2ZSB0byBtb3ZlIElDViBieXRlcyBiYWNrIHRv IHRoZWlyIHByb3BlciBwbGFjZS4NCj4gKyAqLw0KPiArc3RhdGljIHVpbnQxNl90DQo+ICtvdXRi X3NxaF9wcm9jZXNzKGNvbnN0IHN0cnVjdCBydGVfaXBzZWNfc2Vzc2lvbiAqc3MsIHN0cnVjdCBy dGVfbWJ1ZiAqbWJbXSwNCj4gKwl1aW50MTZfdCBudW0pDQo+ICt7DQo+ICsJdWludDMyX3QgaSwg aywgaWN2X2xlbiwgKmljdjsNCj4gKwlzdHJ1Y3QgcnRlX21idWYgKm1sOw0KPiArCXN0cnVjdCBy dGVfaXBzZWNfc2EgKnNhOw0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqZHJbbnVtXTsNCj4gKw0KPiAr CXNhID0gc3MtPnNhOw0KPiArDQo+ICsJayA9IDA7DQo+ICsJaWN2X2xlbiA9IHNhLT5pY3ZfbGVu Ow0KPiArDQo+ICsJZm9yIChpID0gMDsgaSAhPSBudW07IGkrKykgew0KPiArCQlpZiAoKG1iW2ld LT5vbF9mbGFncyAmIFBLVF9SWF9TRUNfT0ZGTE9BRF9GQUlMRUQpID09IDApIHsNCj4gKwkJCW1s ID0gcnRlX3BrdG1idWZfbGFzdHNlZyhtYltpXSk7DQo+ICsJCQlpY3YgPSBydGVfcGt0bWJ1Zl9t dG9kX29mZnNldChtbCwgdm9pZCAqLA0KPiArCQkJCW1sLT5kYXRhX2xlbiAtIGljdl9sZW4pOw0K PiArCQkJcmVtb3ZlX3NxaChpY3YsIGljdl9sZW4pOw0KPiArCQkJbWJbaysrXSA9IG1iW2ldOw0K PiArCQl9IGVsc2UNCj4gKwkJCWRyW2kgLSBrXSA9IG1iW2ldOw0KPiArCX0NCj4gKw0KPiArCS8q IGhhbmRsZSB1bnByb2Nlc3NlZCBtYnVmcyAqLw0KPiArCWlmIChrICE9IG51bSkgew0KPiArCQly dGVfZXJybm8gPSBFQkFETVNHOw0KPiArCQlpZiAoayAhPSAwKQ0KPiArCQkJbWJ1Zl9idWxrX2Nv cHkobWIgKyBrLCBkciwgbnVtIC0gayk7DQo+ICsJfQ0KPiArDQo+ICsJcmV0dXJuIGs7DQo+ICt9 DQo+ICsNCj4gKy8qDQo+ICsgKiBzaW1wbGVzdCBwa3QgcHJvY2VzcyByb3V0aW5lOg0KPiArICog YWxsIGFjdHVhbCBwcm9jZXNzaW5nIGlzIGRvbmUgYWxyZWFkeSBkb25lYnkgSFcvUE1ELA0KDQph bGwgYWN0dWFsIHByb2Nlc3NpbmcgaXMgYWxyZWFkeSBkb25lIGJ5IEhXL1BNRA0KDQo+ICsgKiBq dXN0IGNoZWNrIG1idWYgb2xfZmxhZ3MuDQo+ICsgKiB1c2VkIGZvcjoNCj4gKyAqIC0gaW5ib3Vu ZCBmb3IgUlRFX1NFQ1VSSVRZX0FDVElPTl9UWVBFX0lOTElORV9QUk9UT0NPTA0KPiArICogLSBp bmJvdW5kL291dGJvdW5kIGZvciBSVEVfU0VDVVJJVFlfQUNUSU9OX1RZUEVfTE9PS0FTSURFX1BS T1RPQ09MDQo+ICsgKiAtIG91dGJvdW5kIGZvciBSVEVfU0VDVVJJVFlfQUNUSU9OX1RZUEVfTk9O RSB3aGVuIEVTTiBpcyBkaXNhYmxlZA0KPiArICovDQo+ICtzdGF0aWMgdWludDE2X3QNCj4gK3Br dF9mbGFnX3Byb2Nlc3MoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpzcywgc3RydWN0 IHJ0ZV9tYnVmICptYltdLA0KPiArCXVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwl1aW50MzJfdCBp LCBrOw0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqZHJbbnVtXTsNCj4gKw0KPiArCVJURV9TRVRfVVNF RChzcyk7DQo+ICsNCj4gKwlrID0gMDsNCj4gKwlmb3IgKGkgPSAwOyBpICE9IG51bTsgaSsrKSB7 DQo+ICsJCWlmICgobWJbaV0tPm9sX2ZsYWdzICYgUEtUX1JYX1NFQ19PRkZMT0FEX0ZBSUxFRCkg PT0gMCkNCj4gKwkJCW1iW2srK10gPSBtYltpXTsNCj4gKwkJZWxzZQ0KPiArCQkJZHJbaSAtIGtd ID0gbWJbaV07DQo+ICsJfQ0KPiArDQo+ICsJLyogaGFuZGxlIHVucHJvY2Vzc2VkIG1idWZzICov DQo+ICsJaWYgKGsgIT0gbnVtKSB7DQo+ICsJCXJ0ZV9lcnJubyA9IEVCQURNU0c7DQo+ICsJCWlm IChrICE9IDApDQo+ICsJCQltYnVmX2J1bGtfY29weShtYiArIGssIGRyLCBudW0gLSBrKTsNCj4g Kwl9DQo+ICsNCj4gKwlyZXR1cm4gazsNCj4gK30NCj4gKw0KPiArLyoNCj4gKyAqIHByZXBhcmUg cGFja2V0cyBmb3IgaW5saW5lIGlwc2VjIHByb2Nlc3Npbmc6DQo+ICsgKiBzZXQgb2xfZmxhZ3Mg YW5kIGF0dGFjaCBtZXRhZGF0YS4NCj4gKyAqLw0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ICtp bmxpbmVfb3V0Yl9tYnVmX3ByZXBhcmUoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpz cywNCj4gKwlzdHJ1Y3QgcnRlX21idWYgKm1iW10sIHVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwl1 aW50MzJfdCBpLCBvbF9mbGFnczsNCj4gKw0KPiArCW9sX2ZsYWdzID0gc3MtPnNlY3VyaXR5Lm9s X2ZsYWdzICYgUlRFX1NFQ1VSSVRZX1RYX09MT0FEX05FRURfTURBVEE7DQo+ICsJZm9yIChpID0g MDsgaSAhPSBudW07IGkrKykgew0KPiArDQo+ICsJCW1iW2ldLT5vbF9mbGFncyB8PSBQS1RfVFhf U0VDX09GRkxPQUQ7DQo+ICsJCWlmIChvbF9mbGFncyAhPSAwKQ0KPiArCQkJcnRlX3NlY3VyaXR5 X3NldF9wa3RfbWV0YWRhdGEoc3MtPnNlY3VyaXR5LmN0eCwNCj4gKwkJCQlzcy0+c2VjdXJpdHku c2VzLCBtYltpXSwgTlVMTCk7DQo+ICsJfQ0KPiArfQ0KPiArDQo+ICtzdGF0aWMgdWludDE2X3QN Cj4gK2lubGluZV9vdXRiX3R1bl9wa3RfcHJvY2Vzcyhjb25zdCBzdHJ1Y3QgcnRlX2lwc2VjX3Nl c3Npb24gKnNzLA0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqbWJbXSwgdWludDE2X3QgbnVtKQ0KPiAr ew0KPiArCWludDMyX3QgcmM7DQo+ICsJdWludDMyX3QgaSwgaywgbjsNCj4gKwl1aW50NjRfdCBz cW47DQo+ICsJcnRlX2JlNjRfdCBzcWM7DQo+ICsJc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2E7DQo+ ICsJdW5pb24gc3ltX29wX2RhdGEgaWN2Ow0KPiArCXVpbnQ2NF90IGl2W0lQU0VDX01BWF9JVl9R V09SRF07DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICpkcltudW1dOw0KPiArDQo+ICsJc2EgPSBzcy0+ c2E7DQo+ICsNCj4gKwluID0gbnVtOw0KPiArCXNxbiA9IGVzbl9vdXRiX3VwZGF0ZV9zcW4oc2Es ICZuKTsNCj4gKwlpZiAobiAhPSBudW0pDQo+ICsJCXJ0ZV9lcnJubyA9IEVPVkVSRkxPVzsNCj4g Kw0KPiArCWsgPSAwOw0KPiArCWZvciAoaSA9IDA7IGkgIT0gbjsgaSsrKSB7DQo+ICsNCj4gKwkJ c3FjID0gcnRlX2NwdV90b19iZV82NChzcW4gKyBpKTsNCj4gKwkJZ2VuX2l2KGl2LCBzcWMpOw0K PiArDQo+ICsJCS8qIHRyeSB0byB1cGRhdGUgdGhlIHBhY2tldCBpdHNlbGYgKi8NCj4gKwkJcmMg PSBlc3Bfb3V0Yl90dW5fcGt0X3ByZXBhcmUoc2EsIHNxYywgaXYsIG1iW2ldLCAmaWN2KTsNCj4g Kw0KPiArCQkvKiBzdWNjZXNzLCB1cGRhdGUgbWJ1ZiBmaWVsZHMgKi8NCj4gKwkJaWYgKHJjID49 IDApDQo+ICsJCQltYltrKytdID0gbWJbaV07DQo+ICsJCS8qIGZhaWx1cmUsIHB1dCBwYWNrZXQg aW50byB0aGUgZGVhdGgtcm93ICovDQo+ICsJCWVsc2Ugew0KPiArCQkJZHJbaSAtIGtdID0gbWJb aV07DQo+ICsJCQlydGVfZXJybm8gPSAtcmM7DQo+ICsJCX0NCj4gKwl9DQo+ICsNCj4gKwlpbmxp bmVfb3V0Yl9tYnVmX3ByZXBhcmUoc3MsIG1iLCBrKTsNCj4gKw0KPiArCS8qIGNvcHkgbm90IHBy b2Nlc3NlZCBtYnVmcyBiZXlvbmQgZ29vZCBvbmVzICovDQo+ICsJaWYgKGsgIT0gbnVtICYmIGsg IT0gMCkNCj4gKwkJbWJ1Zl9idWxrX2NvcHkobWIgKyBrLCBkciwgbnVtIC0gayk7DQo+ICsNCj4g KwlyZXR1cm4gazsNCj4gK30NCj4gKw0KPiArc3RhdGljIHVpbnQxNl90DQo+ICtpbmxpbmVfb3V0 Yl90cnNfcGt0X3Byb2Nlc3MoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpzcywNCj4g KwlzdHJ1Y3QgcnRlX21idWYgKm1iW10sIHVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwlpbnQzMl90 IHJjOw0KPiArCXVpbnQzMl90IGksIGssIG4sIGwyLCBsMzsNCj4gKwl1aW50NjRfdCBzcW47DQo+ ICsJcnRlX2JlNjRfdCBzcWM7DQo+ICsJc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2E7DQo+ICsJdW5p b24gc3ltX29wX2RhdGEgaWN2Ow0KPiArCXVpbnQ2NF90IGl2W0lQU0VDX01BWF9JVl9RV09SRF07 DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICpkcltudW1dOw0KPiArDQo+ICsJc2EgPSBzcy0+c2E7DQo+ ICsNCj4gKwluID0gbnVtOw0KPiArCXNxbiA9IGVzbl9vdXRiX3VwZGF0ZV9zcW4oc2EsICZuKTsN Cj4gKwlpZiAobiAhPSBudW0pDQo+ICsJCXJ0ZV9lcnJubyA9IEVPVkVSRkxPVzsNCj4gKw0KPiAr CWsgPSAwOw0KPiArCWZvciAoaSA9IDA7IGkgIT0gbjsgaSsrKSB7DQo+ICsNCj4gKwkJbDIgPSBt YltpXS0+bDJfbGVuOw0KPiArCQlsMyA9IG1iW2ldLT5sM19sZW47DQo+ICsNCj4gKwkJc3FjID0g cnRlX2NwdV90b19iZV82NChzcW4gKyBpKTsNCj4gKwkJZ2VuX2l2KGl2LCBzcWMpOw0KPiArDQo+ ICsJCS8qIHRyeSB0byB1cGRhdGUgdGhlIHBhY2tldCBpdHNlbGYgKi8NCj4gKwkJcmMgPSBlc3Bf b3V0Yl90cnNfcGt0X3ByZXBhcmUoc2EsIHNxYywgaXYsIG1iW2ldLA0KPiArCQkJCWwyLCBsMywg Jmljdik7DQo+ICsNCj4gKwkJLyogc3VjY2VzcywgdXBkYXRlIG1idWYgZmllbGRzICovDQo+ICsJ CWlmIChyYyA+PSAwKQ0KPiArCQkJbWJbaysrXSA9IG1iW2ldOw0KPiArCQkvKiBmYWlsdXJlLCBw dXQgcGFja2V0IGludG8gdGhlIGRlYXRoLXJvdyAqLw0KPiArCQllbHNlIHsNCj4gKwkJCWRyW2kg LSBrXSA9IG1iW2ldOw0KPiArCQkJcnRlX2Vycm5vID0gLXJjOw0KPiArCQl9DQo+ICsJfQ0KPiAr DQo+ICsJaW5saW5lX291dGJfbWJ1Zl9wcmVwYXJlKHNzLCBtYiwgayk7DQo+ICsNCj4gKwkvKiBj b3B5IG5vdCBwcm9jZXNzZWQgbWJ1ZnMgYmV5b25kIGdvb2Qgb25lcyAqLw0KPiArCWlmIChrICE9 IG51bSAmJiBrICE9IDApDQo+ICsJCW1idWZfYnVsa19jb3B5KG1iICsgaywgZHIsIG51bSAtIGsp Ow0KPiArDQo+ICsJcmV0dXJuIGs7DQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiBvdXRib3VuZCBm b3IgUlRFX1NFQ1VSSVRZX0FDVElPTl9UWVBFX0lOTElORV9QUk9UT0NPTDoNCj4gKyAqIGFjdHVh bCBwcm9jZXNzaW5nIGlzIGRvbmUgYnkgSFcvUE1ELCBqdXN0IHNldCBmbGFncyBhbmQgbWV0YWRh dGEuDQo+ICsgKi8NCj4gK3N0YXRpYyB1aW50MTZfdA0KPiArb3V0Yl9pbmxpbmVfcHJvdG9fcHJv Y2Vzcyhjb25zdCBzdHJ1Y3QgcnRlX2lwc2VjX3Nlc3Npb24gKnNzLA0KPiArCQlzdHJ1Y3QgcnRl X21idWYgKm1iW10sIHVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwlpbmxpbmVfb3V0Yl9tYnVmX3By ZXBhcmUoc3MsIG1iLCBudW0pOw0KPiArCXJldHVybiBudW07DQo+ICt9DQo+ICsNCj4gK3N0YXRp YyBpbnQNCj4gK2xrc2Rfbm9uZV9wa3RfZnVuY19zZWxlY3QoY29uc3Qgc3RydWN0IHJ0ZV9pcHNl Y19zYSAqc2EsDQo+ICsJCXN0cnVjdCBydGVfaXBzZWNfc2FfcGt0X2Z1bmMgKnBmKQ0KPiArew0K PiArCWludDMyX3QgcmM7DQo+ICsNCj4gKwlzdGF0aWMgY29uc3QgdWludDY0X3QgbXNrID0gUlRF X0lQU0VDX1NBVFBfRElSX01BU0sgfA0KPiArCQkJUlRFX0lQU0VDX1NBVFBfTU9ERV9NQVNLOw0K PiArDQo+ICsJcmMgPSAwOw0KPiArCXN3aXRjaCAoc2EtPnR5cGUgJiBtc2spIHsNCj4gKwljYXNl IChSVEVfSVBTRUNfU0FUUF9ESVJfSUIgfCBSVEVfSVBTRUNfU0FUUF9NT0RFX1RVTkxWNCk6DQo+ ICsJY2FzZSAoUlRFX0lQU0VDX1NBVFBfRElSX0lCIHwgUlRFX0lQU0VDX1NBVFBfTU9ERV9UVU5M VjYpOg0KPiArCQlwZi0+cHJlcGFyZSA9IGluYl9wa3RfcHJlcGFyZTsNCj4gKwkJcGYtPnByb2Nl c3MgPSBpbmJfdHVuX3BrdF9wcm9jZXNzOw0KPiArCQlicmVhazsNCj4gKwljYXNlIChSVEVfSVBT RUNfU0FUUF9ESVJfSUIgfCBSVEVfSVBTRUNfU0FUUF9NT0RFX1RSQU5TKToNCj4gKwkJcGYtPnBy ZXBhcmUgPSBpbmJfcGt0X3ByZXBhcmU7DQo+ICsJCXBmLT5wcm9jZXNzID0gaW5iX3Ryc19wa3Rf cHJvY2VzczsNCj4gKwkJYnJlYWs7DQo+ICsJY2FzZSAoUlRFX0lQU0VDX1NBVFBfRElSX09CIHwg UlRFX0lQU0VDX1NBVFBfTU9ERV9UVU5MVjQpOg0KPiArCWNhc2UgKFJURV9JUFNFQ19TQVRQX0RJ Ul9PQiB8IFJURV9JUFNFQ19TQVRQX01PREVfVFVOTFY2KToNCj4gKwkJcGYtPnByZXBhcmUgPSBv dXRiX3R1bl9wcmVwYXJlOw0KPiArCQlwZi0+cHJvY2VzcyA9IChzYS0+c3FoX2xlbiAhPSAwKSA/ DQo+ICsJCQlvdXRiX3NxaF9wcm9jZXNzIDogcGt0X2ZsYWdfcHJvY2VzczsNCj4gKwkJYnJlYWs7 DQo+ICsJY2FzZSAoUlRFX0lQU0VDX1NBVFBfRElSX09CIHwgUlRFX0lQU0VDX1NBVFBfTU9ERV9U UkFOUyk6DQo+ICsJCXBmLT5wcmVwYXJlID0gb3V0Yl90cnNfcHJlcGFyZTsNCj4gKwkJcGYtPnBy b2Nlc3MgPSAoc2EtPnNxaF9sZW4gIT0gMCkgPw0KPiArCQkJb3V0Yl9zcWhfcHJvY2VzcyA6IHBr dF9mbGFnX3Byb2Nlc3M7DQo+ICsJCWJyZWFrOw0KPiArCWRlZmF1bHQ6DQo+ICsJCXJjID0gLUVO T1RTVVA7DQo+ICsJfQ0KPiArDQo+ICsJcmV0dXJuIHJjOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMg aW50DQo+ICtpbmxpbmVfY3J5cHRvX3BrdF9mdW5jX3NlbGVjdChjb25zdCBzdHJ1Y3QgcnRlX2lw c2VjX3NhICpzYSwNCj4gKwkJc3RydWN0IHJ0ZV9pcHNlY19zYV9wa3RfZnVuYyAqcGYpDQo+ICt7 DQo+ICsJaW50MzJfdCByYzsNCj4gKw0KPiArCXN0YXRpYyBjb25zdCB1aW50NjRfdCBtc2sgPSBS VEVfSVBTRUNfU0FUUF9ESVJfTUFTSyB8DQo+ICsJCQlSVEVfSVBTRUNfU0FUUF9NT0RFX01BU0s7 DQo+ICsNCj4gKwlyYyA9IDA7DQo+ICsJc3dpdGNoIChzYS0+dHlwZSAmIG1zaykgew0KPiArCWNh c2UgKFJURV9JUFNFQ19TQVRQX0RJUl9JQiB8IFJURV9JUFNFQ19TQVRQX01PREVfVFVOTFY0KToN Cj4gKwljYXNlIChSVEVfSVBTRUNfU0FUUF9ESVJfSUIgfCBSVEVfSVBTRUNfU0FUUF9NT0RFX1RV TkxWNik6DQo+ICsJCXBmLT5wcm9jZXNzID0gaW5iX3R1bl9wa3RfcHJvY2VzczsNCj4gKwkJYnJl YWs7DQo+ICsJY2FzZSAoUlRFX0lQU0VDX1NBVFBfRElSX0lCIHwgUlRFX0lQU0VDX1NBVFBfTU9E RV9UUkFOUyk6DQo+ICsJCXBmLT5wcm9jZXNzID0gaW5iX3Ryc19wa3RfcHJvY2VzczsNCj4gKwkJ YnJlYWs7DQo+ICsJY2FzZSAoUlRFX0lQU0VDX1NBVFBfRElSX09CIHwgUlRFX0lQU0VDX1NBVFBf TU9ERV9UVU5MVjQpOg0KPiArCWNhc2UgKFJURV9JUFNFQ19TQVRQX0RJUl9PQiB8IFJURV9JUFNF Q19TQVRQX01PREVfVFVOTFY2KToNCj4gKwkJcGYtPnByb2Nlc3MgPSBpbmxpbmVfb3V0Yl90dW5f cGt0X3Byb2Nlc3M7DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgKFJURV9JUFNFQ19TQVRQX0RJUl9P QiB8IFJURV9JUFNFQ19TQVRQX01PREVfVFJBTlMpOg0KPiArCQlwZi0+cHJvY2VzcyA9IGlubGlu ZV9vdXRiX3Ryc19wa3RfcHJvY2VzczsNCj4gKwkJYnJlYWs7DQo+ICsJZGVmYXVsdDoNCj4gKwkJ cmMgPSAtRU5PVFNVUDsNCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gcmM7DQo+ICt9DQo+ICsNCj4g ICBpbnQNCj4gICBpcHNlY19zYV9wa3RfZnVuY19zZWxlY3QoY29uc3Qgc3RydWN0IHJ0ZV9pcHNl Y19zZXNzaW9uICpzcywNCj4gICAJY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2EsIHN0cnVj dCBydGVfaXBzZWNfc2FfcGt0X2Z1bmMgKnBmKQ0KPiAgIHsNCj4gICAJaW50MzJfdCByYzsNCj4g ICANCj4gLQlSVEVfU0VUX1VTRUQoc2EpOw0KPiAtDQo+ICAgCXJjID0gMDsNCj4gICAJcGZbMF0g PSAoc3RydWN0IHJ0ZV9pcHNlY19zYV9wa3RfZnVuYykgeyAwIH07DQo+ICAgDQo+ICAgCXN3aXRj aCAoc3MtPnR5cGUpIHsNCj4gKwljYXNlIFJURV9TRUNVUklUWV9BQ1RJT05fVFlQRV9OT05FOg0K PiArCQlyYyA9IGxrc2Rfbm9uZV9wa3RfZnVuY19zZWxlY3Qoc2EsIHBmKTsNCj4gKwkJYnJlYWs7 DQo+ICsJY2FzZSBSVEVfU0VDVVJJVFlfQUNUSU9OX1RZUEVfSU5MSU5FX0NSWVBUTzoNCj4gKwkJ cmMgPSBpbmxpbmVfY3J5cHRvX3BrdF9mdW5jX3NlbGVjdChzYSwgcGYpOw0KPiArCQlicmVhazsN Cj4gKwljYXNlIFJURV9TRUNVUklUWV9BQ1RJT05fVFlQRV9JTkxJTkVfUFJPVE9DT0w6DQo+ICsJ CWlmICgoc2EtPnR5cGUgJiBSVEVfSVBTRUNfU0FUUF9ESVJfTUFTSykgPT0NCj4gKwkJCQlSVEVf SVBTRUNfU0FUUF9ESVJfSUIpDQo+ICsJCQlwZi0+cHJvY2VzcyA9IHBrdF9mbGFnX3Byb2Nlc3M7 DQo+ICsJCWVsc2UNCj4gKwkJCXBmLT5wcm9jZXNzID0gb3V0Yl9pbmxpbmVfcHJvdG9fcHJvY2Vz czsNCj4gKwkJYnJlYWs7DQo+ICsJY2FzZSBSVEVfU0VDVVJJVFlfQUNUSU9OX1RZUEVfTE9PS0FT SURFX1BST1RPQ09MOg0KPiArCQlwZi0+cHJlcGFyZSA9IGxrc2RfcHJvdG9fcHJlcGFyZTsNCmJl dHRlciB0byB1c2UgbG9va2FzaWRlIGluc3RlYWQgb2YgbGtzZA0KPiArCQlwZi0+cHJvY2VzcyA9 IHBrdF9mbGFnX3Byb2Nlc3M7DQo+ICsJCWJyZWFrOw0KPiAgIAlkZWZhdWx0Og0KPiAgIAkJcmMg PSAtRU5PVFNVUDsNCj4gICAJfQ0KDQo=