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 Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by smtp.lore.kernel.org (Postfix) with ESMTP id 72DBDFD0648 for ; Wed, 11 Mar 2026 07:28:26 +0000 (UTC) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4A1014067C; Wed, 11 Mar 2026 08:28:25 +0100 (CET) Received: from dkmailrelay1.smartsharesystems.com (smartserver.smartsharesystems.com [77.243.40.215]) by mails.dpdk.org (Postfix) with ESMTP id 8A5DA40431 for ; Wed, 11 Mar 2026 08:28:24 +0100 (CET) Received: from smartserver.smartsharesystems.com (smartserver.smartsharesys.local [192.168.4.10]) by dkmailrelay1.smartsharesystems.com (Postfix) with ESMTP id 4794E21B36; Wed, 11 Mar 2026 08:28:24 +0100 (CET) Content-class: urn:content-classes:message Subject: RE: [PATCH v7] eal/x86: optimize memcpy of small sizes MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Date: Wed, 11 Mar 2026 08:28:23 +0100 Message-ID: <98CBD80474FA8B44BF855DF32C47DC35F65774@smartserver.smartshare.dk> In-Reply-To: <20260220110824.235784-1-mb@smartsharesystems.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH v7] eal/x86: optimize memcpy of small sizes X-MimeOLE: Produced By Microsoft Exchange V6.5 Thread-Index: AdyiWUDSmttu37yVSCavLego/gIH9AOzhqQQ References: <20251120114554.950287-1-mb@smartsharesystems.com> <20260220110824.235784-1-mb@smartsharesystems.com> From: =?utf-8?B?TW9ydGVuIEJyw7hydXA=?= To: "Bruce Richardson" , "Konstantin Ananyev" , "Vipin Varghese" Cc: "Thiyagarajan P" , "Bala Murali Krishna" , "Stephen Hemminger" , "Liangxing Wang" , X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org QnJ1Y2UsIEtvbnN0YW50aW4sIFZpcGluIChhcyB4ODYgbWFpbnRhaW5lcnMpLA0KDQpQSU5HIGZv ciBmaW5hbCByZXZpZXcvYWNrLg0KVGhpcyBwYXRjaCBzcGVlZHMgdXAgc21hbGwgY29waWVzLCBl LmcuIHB1dHRpbmcgMX44IG1idWZzIGludG8gYSBtZW1wb29sIGNhY2hlLCBvciBjb3B5aW5nIGEg NjQtYnl0ZSBwYWNrZXQsIHNvIGxldCdzIGdldCBpdCBpbi4NCg0KVmVubGlnIGhpbHNlbiAvIEtp bmQgcmVnYXJkcywNCi1Nb3J0ZW4gQnLDuHJ1cA0KDQo+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0t LS0tDQo+IEZyb206IE1vcnRlbiBCcsO4cnVwIFttYWlsdG86bWJAc21hcnRzaGFyZXN5c3RlbXMu Y29tXQ0KPiBTZW50OiBGcmlkYXksIDIwIEZlYnJ1YXJ5IDIwMjYgMTIuMDgNCj4gVG86IGRldkBk cGRrLm9yZzsgQnJ1Y2UgUmljaGFyZHNvbjsgS29uc3RhbnRpbiBBbmFueWV2OyBWaXBpbiBWYXJn aGVzZTsNCj4gU3RlcGhlbiBIZW1taW5nZXI7IExpYW5neGluZyBXYW5nDQo+IENjOiBUaGl5YWdh cmFqYW4gUDsgQmFsYSBNdXJhbGkgS3Jpc2huYTsgTW9ydGVuIEJyw7hydXANCj4gU3ViamVjdDog W1BBVENIIHY3XSBlYWwveDg2OiBvcHRpbWl6ZSBtZW1jcHkgb2Ygc21hbGwgc2l6ZXMNCj4gDQo+ IFRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgY29weWluZyB1cCB0byA2NCBieXRlcyBkb2VzIG5vdCBk ZXBlbmQgb24NCj4gYWRkcmVzcw0KPiBhbGlnbm1lbnQgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgQ1BV J3MgdmVjdG9yIHJlZ2lzdGVycy4gTm9uZXRoZWxlc3MsIHRoZQ0KPiBleGFjdCBzYW1lIGNvZGUg Zm9yIGNvcHlpbmcgdXAgdG8gNjQgYnl0ZXMgd2FzIHByZXNlbnQgaW4gYm90aCB0aGUNCj4gYWxp Z25lZA0KPiBjb3B5IGZ1bmN0aW9uIGFuZCBhbGwgdGhlIENQVSB2ZWN0b3IgcmVnaXN0ZXIgc2l6 ZSBzcGVjaWZpYyB2YXJpYW50cyBvZg0KPiB0aGUgdW5hbGlnbmVkIGNvcHkgZnVuY3Rpb25zLg0K PiBXaXRoIHRoaXMgcGF0Y2gsIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgY29weWluZyB1cCB0byA2 NCBieXRlcyB3YXMNCj4gY29uc29saWRhdGVkIGludG8gb25lIGluc3RhbmNlLCBsb2NhdGVkIGlu IHRoZSBjb21tb24gY29weSBmdW5jdGlvbiwNCj4gYmVmb3JlIGNoZWNraW5nIGFsaWdubWVudCBy ZXF1aXJlbWVudHMuDQo+IFRoaXMgcHJvdmlkZXMgdGhyZWUgYmVuZWZpdHM6DQo+IDEuIE5vIGNv cHktcGFzdGUgaW4gdGhlIHNvdXJjZSBjb2RlLg0KPiAyLiBBIHBlcmZvcm1hbmNlIGdhaW4gZm9y IGNvcHlpbmcgdXAgdG8gNjQgYnl0ZXMsIGJlY2F1c2UgdGhlDQo+IGFkZHJlc3MgYWxpZ25tZW50 IGNoZWNrIGlzIGF2b2lkZWQgaW4gdGhpcyBjYXNlLg0KPiAzLiBSZWR1Y2VkIGluc3RydWN0aW9u IG1lbW9yeSBmb290cHJpbnQsIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG9ubHkNCj4gZ2VuZXJhdGVz IG9uZSBpbnN0YW5jZSBvZiB0aGUgZnVuY3Rpb24gZm9yIGNvcHlpbmcgdXAgdG8gNjQgYnl0ZXMs DQo+IGluc3RlYWQNCj4gb2YgdHdvIGluc3RhbmNlcyAob25lIGluIHRoZSB1bmFsaWduZWQgY29w eSBmdW5jdGlvbiwgYW5kIG9uZSBpbiB0aGUNCj4gYWxpZ25lZCBjb3B5IGZ1bmN0aW9uKS4NCj4g DQo+IEZ1cnRoZXJtb3JlLCB0aGUgZnVuY3Rpb24gZm9yIGNvcHlpbmcgbGVzcyB0aGFuIDE2IGJ5 dGVzIHdhcyByZXBsYWNlZA0KPiB3aXRoDQo+IGEgc21hcnRlciBpbXBsZW1lbnRhdGlvbiB1c2lu ZyBmZXdlciBicmFuY2hlcyBhbmQgcG90ZW50aWFsbHkgZmV3ZXINCj4gbG9hZC9zdG9yZSBvcGVy YXRpb25zLg0KPiBUaGlzIGZ1bmN0aW9uIHdhcyBhbHNvIGV4dGVuZGVkIHRvIGhhbmRsZSBjb3B5 aW5nIG9mIHVwIHRvIDE2IGJ5dGVzLA0KPiBpbnN0ZWFkIG9mIHVwIHRvIDE1IGJ5dGVzLg0KPiBU aGlzIHNtYWxsIGV4dGVuc2lvbiByZWR1Y2VzIHRoZSBjb2RlIHBhdGgsIGFuZCB0aHVzIGltcHJv dmVzIHRoZQ0KPiBwZXJmb3JtYW5jZSwgZm9yIGNvcHlpbmcgdHdvIHBvaW50ZXJzIG9uIDY0LWJp dCBhcmNoaXRlY3R1cmVzIGFuZCBmb3VyDQo+IHBvaW50ZXJzIG9uIDMyLWJpdCBhcmNoaXRlY3R1 cmVzLg0KPiANCj4gQWxzbywgX19ydGVfcmVzdHJpY3Qgd2FzIGFkZGVkIHRvIHNvdXJjZSBhbmQg ZGVzdGluYXRpb24gYWRkcmVzc2VzLg0KPiANCj4gQW5kIGZpbmFsbHksIHRoZSBtaXNzaW5nIGlt cGxlbWVudGF0aW9uIG9mIHJ0ZV9tb3Y0OCgpIHdhcyBhZGRlZC4NCj4gDQo+IFJlZ2FyZGluZyBw ZXJmb3JtYW5jZSwgdGhlIG1lbWNweSBwZXJmb3JtYW5jZSB0ZXN0IHNob3dlZCBjYWNoZS10by0N Cj4gY2FjaGUNCj4gY29weWluZyBvZiB1cCB0byAzMiBieXRlcyBub3cgdGFrZXMgMiBjeWNsZXMs IHZlcnN1cyBjYS4gNi41IGN5Y2xlcw0KPiBiZWZvcmUNCj4gdGhpcyBwYXRjaC4NCj4gQ29weWlu ZyA2NCBieXRlcyBub3cgdGFrZXMgNCBjeWNsZXMsIHZlcnN1cyA3IGN5Y2xlcyBiZWZvcmUuDQo+ IA0KPiBTaWduZWQtb2ZmLWJ5OiBNb3J0ZW4gQnLDuHJ1cCA8bWJAc21hcnRzaGFyZXN5c3RlbXMu Y29tPg0KPiAtLS0NCj4gdjc6DQo+ICogVXBkYXRlZCBwYXRjaCBkZXNjcmlwdGlvbi4gTWFpbmx5 IHRvIGNsYXJpZnkgdGhhdCB0aGUgY2hhbmdlcyByZWxhdGVkDQo+IHRvDQo+ICAgY29weWluZyB1 cCB0byA2NCBieXRlcyBzaW1wbHkgcmVwbGFjZXMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGNvcHkt DQo+IHBhc3RlZA0KPiAgIGNvZGUgd2l0aCBvbmUgY29tbW9uIGluc3RhbmNlLg0KPiAqIEZpeGVk IGNvcHkgb2YgYnVpbGQgdGltZSBrbm93biAxNiBieXRlcyBpbiBydGVfbW92MTdfdG9fMzIoKS4g KFZpcGluKQ0KPiAqIFJlYmFzZWQuDQo+IHY2Og0KPiAqIFdlbnQgYmFjayB0byB1c2luZyBydGVf dWludE5fYWxpYXMgc3RydWN0dXJlcyBmb3IgY29weWluZyBpbnN0ZWFkIG9mDQo+ICAgdXNpbmcg bWVtY3B5KCkuIFRoZXkgd2VyZSB0aGVyZSBmb3IgYSByZWFzb24uDQo+ICAgKEluc3BpcmVkIGJ5 IHRoZSBkaXNjdXNzaW9uIGFib3V0IG9wdGltaXppbmcgdGhlIGNoZWNrc3VtIGZ1bmN0aW9uLikN Cj4gKiBSZW1vdmVkIG5vdGUgYWJvdXQgY29weWluZyB1bmluaXRpYWxpemVkIGRhdGEuDQo+ICog QWRkZWQgX19ydGVfcmVzdHJpY3QgdG8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMu DQo+ICAgVXBkYXRlZCBmdW5jdGlvbiBkZXNjcmlwdGlvbnMgZnJvbSAic2hvdWxkIiB0byAibXVz dCIgbm90IG92ZXJsYXAuDQo+ICogQ2hhbmdlZCBydGVfbW92NDgoKSBBVlggaW1wbGVtZW50YXRp b24gdG8gY29weSAzMisxNiBieXRlcyBpbnN0ZWFkIG9mDQo+ICAgY29weWluZyAzMiArIDMyIG92 ZXJsYXBwaW5nIGJ5dGVzLiAoS29uc3RhbnRpbikNCj4gKiBJZ25vcmluZyAiLVdzdHJpbmdvcC1v dmVyZmxvdyIgaXMgbm90IG5lZWRlZCwgc28gaXQgd2FzIHJlbW92ZWQuDQo+IHY1Og0KPiAqIFJl dmVydGVkIHY0OiBSZXBsYWNlIFNTRTIgX21tX2xvYWR1X3NpMTI4KCkgd2l0aCBTU0UzDQo+IF9t bV9sZGRxdV9zaTEyOCgpLg0KPiAgIEl0IHdhcyBzbG93ZXIuDQo+ICogSW1wcm92ZWQgc29tZSBj b21tZW50cy4gKEtvbnN0YW50aW4gQW5hbnlldikNCj4gKiBNb3ZlZCB0aGUgc2l6ZSByYW5nZSAx Ny4uMzIgaW5zaWRlIHRoZSBzaXplIDw9IDY0IGJyYW5jaCwgc28gd2hlbg0KPiAgIGJ1aWxkaW5n IGZvciBTU0UsIHRoZSBnZW5lcmF0ZWQgY29kZSBjYW4gc3RhcnQgY29weWluZyB0aGUgZmlyc3QN Cj4gICAxNiBieXRlcyBiZWZvcmUgY29tcGFyaW5nIGlmIHRoZSBzaXplIGlzIGdyZWF0ZXIgdGhh biAzMiBvciBub3QuDQo+ICogSnVzdCByZXF1aXJlIFJURV9NRU1DUFlfQVZYIGZvciB1c2luZyBy dGVfbW92MzIoKSBpbg0KPiBydGVfbW92MzNfdG9fNjQoKS4NCj4gdjQ6DQo+ICogUmVwbGFjZSBT U0UyIF9tbV9sb2FkdV9zaTEyOCgpIHdpdGggU1NFMyBfbW1fbGRkcXVfc2kxMjgoKS4NCj4gdjM6 DQo+ICogRml4ZWQgdHlwbyBpbiBjb21tZW50Lg0KPiB2MjoNCj4gKiBVcGRhdGVkIHBhdGNoIHRp dGxlIHRvIHJlZmxlY3QgdGhhdCB0aGUgcGVyZm9ybWFuY2UgaXMgaW1wcm92ZWQuDQo+ICogVXNl IHRoZSBkZXNpZ24gcGF0dGVybiBvZiB0d28gb3ZlcmxhcHBpbmcgc3RvcmVzIGZvciBzbWFsbCBj b3BpZXMNCj4gdG9vLg0KPiAqIEV4cGFuZGVkIGZpcnN0IGJyYW5jaCBmcm9tIHNpemUgPCAxNiB0 byBzaXplIDw9IDE2Lg0KPiAqIEhhbmRsZSBtb3JlIGJ1aWxkIHRpbWUgY29uc3RhbnQgY29weSBz aXplcy4NCj4gLS0tDQo+ICBsaWIvZWFsL3g4Ni9pbmNsdWRlL3J0ZV9tZW1jcHkuaCB8IDUyNiAr KysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tDQo+ICAxIGZpbGUgY2hhbmdlZCwgMzQ4IGlu c2VydGlvbnMoKyksIDE3OCBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQgYS9saWIvZWFs L3g4Ni9pbmNsdWRlL3J0ZV9tZW1jcHkuaA0KPiBiL2xpYi9lYWwveDg2L2luY2x1ZGUvcnRlX21l bWNweS5oDQo+IGluZGV4IDQ2ZDM0YjgwODEuLmVkOGU1ZjhkYzQgMTAwNjQ0DQo+IC0tLSBhL2xp Yi9lYWwveDg2L2luY2x1ZGUvcnRlX21lbWNweS5oDQo+ICsrKyBiL2xpYi9lYWwveDg2L2luY2x1 ZGUvcnRlX21lbWNweS5oDQo+IEBAIC0yMiwxMSArMjIsNiBAQA0KPiAgZXh0ZXJuICJDIiB7DQo+ ICAjZW5kaWYNCj4gDQo+IC0jaWYgZGVmaW5lZChSVEVfVE9PTENIQUlOX0dDQykgJiYgKEdDQ19W RVJTSU9OID49IDEwMDAwMCkNCj4gLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaA0KPiAtI3By YWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3N0cmluZ29wLW92ZXJmbG93Ig0KPiAtI2Vu ZGlmDQo+IC0NCj4gIC8qDQo+ICAgKiBHQ0Mgb2xkZXIgdGhhbiB2ZXJzaW9uIDExIGRvZXNuJ3Qg Y29tcGlsZSBBVlggcHJvcGVybHksIHNvIHVzZSBTU0UNCj4gaW5zdGVhZC4NCj4gICAqIFRoZXJl IGFyZSBubyBwcm9ibGVtcyB3aXRoIEFWWDIuDQo+IEBAIC00MCw5ICszNSw2IEBAIGV4dGVybiAi QyIgew0KPiAgLyoqDQo+ICAgKiBDb3B5IGJ5dGVzIGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3Ro ZXIuIFRoZSBsb2NhdGlvbnMgbXVzdCBub3QNCj4gb3ZlcmxhcC4NCj4gICAqDQo+IC0gKiBAbm90 ZSBUaGlzIGlzIGltcGxlbWVudGVkIGFzIGEgbWFjcm8sIHNvIGl0J3MgYWRkcmVzcyBzaG91bGQg bm90IGJlDQo+IHRha2VuDQo+IC0gKiBhbmQgY2FyZSBpcyBuZWVkZWQgYXMgcGFyYW1ldGVyIGV4 cHJlc3Npb25zIG1heSBiZSBldmFsdWF0ZWQNCj4gbXVsdGlwbGUgdGltZXMuDQo+IC0gKg0KPiAg ICogQHBhcmFtIGRzdA0KPiAgICogICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUg ZGF0YS4NCj4gICAqIEBwYXJhbSBzcmMNCj4gQEAgLTUzLDYwICs0NSw3OCBAQCBleHRlcm4gIkMi IHsNCj4gICAqICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZGF0YS4NCj4gICAqLw0KPiAg c3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgdm9pZCAqDQo+IC1ydGVfbWVtY3B5KHZvaWQgKmRz dCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgbik7DQo+ICtydGVfbWVtY3B5KHZvaWQgKl9fcnRl X3Jlc3RyaWN0IGRzdCwgY29uc3Qgdm9pZCAqX19ydGVfcmVzdHJpY3Qgc3JjLA0KPiBzaXplX3Qg bik7DQo+IA0KPiAgLyoqDQo+IC0gKiBDb3B5IGJ5dGVzIGZyb20gb25lIGxvY2F0aW9uIHRvIGFu b3RoZXIsDQo+IC0gKiBsb2NhdGlvbnMgc2hvdWxkIG5vdCBvdmVybGFwLg0KPiAtICogVXNlIHdp dGggbiA8PSAxNS4NCj4gKyAqIENvcHkgMSBieXRlIGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3Ro ZXIsDQo+ICsgKiBsb2NhdGlvbnMgbXVzdCBub3Qgb3ZlcmxhcC4NCj4gICAqLw0KPiAtc3RhdGlj IF9fcnRlX2Fsd2F5c19pbmxpbmUgdm9pZCAqDQo+IC1ydGVfbW92MTVfb3JfbGVzcyh2b2lkICpk c3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pDQo+ICtzdGF0aWMgX19ydGVfYWx3YXlzX2lu bGluZSB2b2lkDQo+ICtydGVfbW92MSh1aW50OF90ICpfX3J0ZV9yZXN0cmljdCBkc3QsIGNvbnN0 IHVpbnQ4X3QgKl9fcnRlX3Jlc3RyaWN0DQo+IHNyYykNCj4gK3sNCj4gKwkqZHN0ID0gKnNyYzsN Cj4gK30NCj4gKw0KPiArLyoqDQo+ICsgKiBDb3B5IDIgYnl0ZXMgZnJvbSBvbmUgbG9jYXRpb24g dG8gYW5vdGhlciwNCj4gKyAqIGxvY2F0aW9ucyBtdXN0IG5vdCBvdmVybGFwLg0KPiArICovDQo+ ICtzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB2b2lkDQo+ICtydGVfbW92Mih1aW50OF90ICpf X3J0ZV9yZXN0cmljdCBkc3QsIGNvbnN0IHVpbnQ4X3QgKl9fcnRlX3Jlc3RyaWN0DQo+IHNyYykN Cj4gIHsNCj4gIAkvKioNCj4gLQkgKiBVc2UgdGhlIGZvbGxvd2luZyBzdHJ1Y3RzIHRvIGF2b2lk IHZpb2xhdGluZyBDIHN0YW5kYXJkDQo+ICsJICogVXNlIHRoZSBmb2xsb3dpbmcgc3RydWN0IHRv IGF2b2lkIHZpb2xhdGluZyBDIHN0YW5kYXJkDQo+ICAJICogYWxpZ25tZW50IHJlcXVpcmVtZW50 cyBhbmQgdG8gYXZvaWQgc3RyaWN0IGFsaWFzaW5nIGJ1Z3MNCj4gIAkgKi8NCj4gLQlzdHJ1Y3Qg X19ydGVfcGFja2VkX2JlZ2luIHJ0ZV91aW50NjRfYWxpYXMgew0KPiAtCQl1aW50NjRfdCB2YWw7 DQo+ICsJc3RydWN0IF9fcnRlX3BhY2tlZF9iZWdpbiBydGVfdWludDE2X2FsaWFzIHsNCj4gKwkJ dWludDE2X3QgdmFsOw0KPiAgCX0gX19ydGVfcGFja2VkX2VuZCBfX3J0ZV9tYXlfYWxpYXM7DQo+ ICsNCj4gKwkoKHN0cnVjdCBydGVfdWludDE2X2FsaWFzICopZHN0KS0+dmFsID0gKChjb25zdCBz dHJ1Y3QNCj4gcnRlX3VpbnQxNl9hbGlhcyAqKXNyYyktPnZhbDsNCj4gK30NCj4gKw0KPiArLyoq DQo+ICsgKiBDb3B5IDQgYnl0ZXMgZnJvbSBvbmUgbG9jYXRpb24gdG8gYW5vdGhlciwNCj4gKyAq IGxvY2F0aW9ucyBtdXN0IG5vdCBvdmVybGFwLg0KPiArICovDQo+ICtzdGF0aWMgX19ydGVfYWx3 YXlzX2lubGluZSB2b2lkDQo+ICtydGVfbW92NCh1aW50OF90ICpfX3J0ZV9yZXN0cmljdCBkc3Qs IGNvbnN0IHVpbnQ4X3QgKl9fcnRlX3Jlc3RyaWN0DQo+IHNyYykNCj4gK3sNCj4gKwkvKioNCj4g KwkgKiBVc2UgdGhlIGZvbGxvd2luZyBzdHJ1Y3QgdG8gYXZvaWQgdmlvbGF0aW5nIEMgc3RhbmRh cmQNCj4gKwkgKiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGFuZCB0byBhdm9pZCBzdHJpY3QgYWxp YXNpbmcgYnVncw0KPiArCSAqLw0KPiAgCXN0cnVjdCBfX3J0ZV9wYWNrZWRfYmVnaW4gcnRlX3Vp bnQzMl9hbGlhcyB7DQo+ICAJCXVpbnQzMl90IHZhbDsNCj4gIAl9IF9fcnRlX3BhY2tlZF9lbmQg X19ydGVfbWF5X2FsaWFzOw0KPiAtCXN0cnVjdCBfX3J0ZV9wYWNrZWRfYmVnaW4gcnRlX3VpbnQx Nl9hbGlhcyB7DQo+IC0JCXVpbnQxNl90IHZhbDsNCj4gKw0KPiArCSgoc3RydWN0IHJ0ZV91aW50 MzJfYWxpYXMgKilkc3QpLT52YWwgPSAoKGNvbnN0IHN0cnVjdA0KPiBydGVfdWludDMyX2FsaWFz ICopc3JjKS0+dmFsOw0KPiArfQ0KPiArDQo+ICsvKioNCj4gKyAqIENvcHkgOCBieXRlcyBmcm9t IG9uZSBsb2NhdGlvbiB0byBhbm90aGVyLA0KPiArICogbG9jYXRpb25zIG11c3Qgbm90IG92ZXJs YXAuDQo+ICsgKi8NCj4gK3N0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHZvaWQNCj4gK3J0ZV9t b3Y4KHVpbnQ4X3QgKl9fcnRlX3Jlc3RyaWN0IGRzdCwgY29uc3QgdWludDhfdCAqX19ydGVfcmVz dHJpY3QNCj4gc3JjKQ0KPiArew0KPiArCS8qKg0KPiArCSAqIFVzZSB0aGUgZm9sbG93aW5nIHN0 cnVjdCB0byBhdm9pZCB2aW9sYXRpbmcgQyBzdGFuZGFyZA0KPiArCSAqIGFsaWdubWVudCByZXF1 aXJlbWVudHMgYW5kIHRvIGF2b2lkIHN0cmljdCBhbGlhc2luZyBidWdzDQo+ICsJICovDQo+ICsJ c3RydWN0IF9fcnRlX3BhY2tlZF9iZWdpbiBydGVfdWludDY0X2FsaWFzIHsNCj4gKwkJdWludDY0 X3QgdmFsOw0KPiAgCX0gX19ydGVfcGFja2VkX2VuZCBfX3J0ZV9tYXlfYWxpYXM7DQo+IA0KPiAt CXZvaWQgKnJldCA9IGRzdDsNCj4gLQlpZiAobiAmIDgpIHsNCj4gLQkJKChzdHJ1Y3QgcnRlX3Vp bnQ2NF9hbGlhcyAqKWRzdCktPnZhbCA9DQo+IC0JCQkoKGNvbnN0IHN0cnVjdCBydGVfdWludDY0 X2FsaWFzICopc3JjKS0+dmFsOw0KPiAtCQlzcmMgPSAoY29uc3QgdWludDY0X3QgKilzcmMgKyAx Ow0KPiAtCQlkc3QgPSAodWludDY0X3QgKilkc3QgKyAxOw0KPiAtCX0NCj4gLQlpZiAobiAmIDQp IHsNCj4gLQkJKChzdHJ1Y3QgcnRlX3VpbnQzMl9hbGlhcyAqKWRzdCktPnZhbCA9DQo+IC0JCQko KGNvbnN0IHN0cnVjdCBydGVfdWludDMyX2FsaWFzICopc3JjKS0+dmFsOw0KPiAtCQlzcmMgPSAo Y29uc3QgdWludDMyX3QgKilzcmMgKyAxOw0KPiAtCQlkc3QgPSAodWludDMyX3QgKilkc3QgKyAx Ow0KPiAtCX0NCj4gLQlpZiAobiAmIDIpIHsNCj4gLQkJKChzdHJ1Y3QgcnRlX3VpbnQxNl9hbGlh cyAqKWRzdCktPnZhbCA9DQo+IC0JCQkoKGNvbnN0IHN0cnVjdCBydGVfdWludDE2X2FsaWFzICop c3JjKS0+dmFsOw0KPiAtCQlzcmMgPSAoY29uc3QgdWludDE2X3QgKilzcmMgKyAxOw0KPiAtCQlk c3QgPSAodWludDE2X3QgKilkc3QgKyAxOw0KPiAtCX0NCj4gLQlpZiAobiAmIDEpDQo+IC0JCSoo dWludDhfdCAqKWRzdCA9ICooY29uc3QgdWludDhfdCAqKXNyYzsNCj4gLQlyZXR1cm4gcmV0Ow0K PiArCSgoc3RydWN0IHJ0ZV91aW50NjRfYWxpYXMgKilkc3QpLT52YWwgPSAoKGNvbnN0IHN0cnVj dA0KPiBydGVfdWludDY0X2FsaWFzICopc3JjKS0+dmFsOw0KPiAgfQ0KPiANCj4gIC8qKg0KPiAg ICogQ29weSAxNiBieXRlcyBmcm9tIG9uZSBsb2NhdGlvbiB0byBhbm90aGVyLA0KPiAtICogbG9j YXRpb25zIHNob3VsZCBub3Qgb3ZlcmxhcC4NCj4gKyAqIGxvY2F0aW9ucyBtdXN0IG5vdCBvdmVy bGFwLg0KPiAgICovDQo+ICBzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB2b2lkDQo+IC1ydGVf bW92MTYodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMpDQo+ICtydGVfbW92MTYodWlu dDhfdCAqX19ydGVfcmVzdHJpY3QgZHN0LCBjb25zdCB1aW50OF90ICpfX3J0ZV9yZXN0cmljdA0K PiBzcmMpDQo+ICB7DQo+ICAJX19tMTI4aSB4bW0wOw0KPiANCj4gQEAgLTExNiwxMCArMTI2LDEw IEBAIHJ0ZV9tb3YxNih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYykNCj4gDQo+ICAv KioNCj4gICAqIENvcHkgMzIgYnl0ZXMgZnJvbSBvbmUgbG9jYXRpb24gdG8gYW5vdGhlciwNCj4g LSAqIGxvY2F0aW9ucyBzaG91bGQgbm90IG92ZXJsYXAuDQo+ICsgKiBsb2NhdGlvbnMgbXVzdCBu b3Qgb3ZlcmxhcC4NCj4gICAqLw0KPiAgc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgdm9pZA0K PiAtcnRlX21vdjMyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjKQ0KPiArcnRlX21v djMyKHVpbnQ4X3QgKl9fcnRlX3Jlc3RyaWN0IGRzdCwgY29uc3QgdWludDhfdCAqX19ydGVfcmVz dHJpY3QNCj4gc3JjKQ0KPiAgew0KPiAgI2lmIGRlZmluZWQgUlRFX01FTUNQWV9BVlgNCj4gIAlf X20yNTZpIHltbTA7DQo+IEBAIC0xMzIsMTIgKzE0MiwyOSBAQCBydGVfbW92MzIodWludDhfdCAq ZHN0LCBjb25zdCB1aW50OF90ICpzcmMpDQo+ICAjZW5kaWYNCj4gIH0NCj4gDQo+ICsvKioNCj4g KyAqIENvcHkgNDggYnl0ZXMgZnJvbSBvbmUgbG9jYXRpb24gdG8gYW5vdGhlciwNCj4gKyAqIGxv Y2F0aW9ucyBtdXN0IG5vdCBvdmVybGFwLg0KPiArICovDQo+ICtzdGF0aWMgX19ydGVfYWx3YXlz X2lubGluZSB2b2lkDQo+ICtydGVfbW92NDgodWludDhfdCAqX19ydGVfcmVzdHJpY3QgZHN0LCBj b25zdCB1aW50OF90ICpfX3J0ZV9yZXN0cmljdA0KPiBzcmMpDQo+ICt7DQo+ICsjaWYgZGVmaW5l ZCBSVEVfTUVNQ1BZX0FWWA0KPiArCXJ0ZV9tb3YzMigodWludDhfdCAqKWRzdCwgKGNvbnN0IHVp bnQ4X3QgKilzcmMpOw0KPiArCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCArIDMyLCAoY29uc3Qg dWludDhfdCAqKXNyYyArIDMyKTsNCj4gKyNlbHNlIC8qIFNTRSBpbXBsZW1lbnRhdGlvbiAqLw0K PiArCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCArIDAgKiAxNiwgKGNvbnN0IHVpbnQ4X3QgKilz cmMgKyAwICoNCj4gMTYpOw0KPiArCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCArIDEgKiAxNiwg KGNvbnN0IHVpbnQ4X3QgKilzcmMgKyAxICoNCj4gMTYpOw0KPiArCXJ0ZV9tb3YxNigodWludDhf dCAqKWRzdCArIDIgKiAxNiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgKyAyICoNCj4gMTYpOw0KPiAr I2VuZGlmDQo+ICt9DQo+ICsNCj4gIC8qKg0KPiAgICogQ29weSA2NCBieXRlcyBmcm9tIG9uZSBs b2NhdGlvbiB0byBhbm90aGVyLA0KPiAtICogbG9jYXRpb25zIHNob3VsZCBub3Qgb3ZlcmxhcC4N Cj4gKyAqIGxvY2F0aW9ucyBtdXN0IG5vdCBvdmVybGFwLg0KPiAgICovDQo+ICBzdGF0aWMgX19y dGVfYWx3YXlzX2lubGluZSB2b2lkDQo+IC1ydGVfbW92NjQodWludDhfdCAqZHN0LCBjb25zdCB1 aW50OF90ICpzcmMpDQo+ICtydGVfbW92NjQodWludDhfdCAqX19ydGVfcmVzdHJpY3QgZHN0LCBj b25zdCB1aW50OF90ICpfX3J0ZV9yZXN0cmljdA0KPiBzcmMpDQo+ICB7DQo+ICAjaWYgZGVmaW5l ZCBfX0FWWDUxMkZfXyAmJiBkZWZpbmVkIFJURV9NRU1DUFlfQVZYNTEyDQo+ICAJX19tNTEyaSB6 bW0wOw0KPiBAQCAtMTUyLDEwICsxNzksMTAgQEAgcnRlX21vdjY0KHVpbnQ4X3QgKmRzdCwgY29u c3QgdWludDhfdCAqc3JjKQ0KPiANCj4gIC8qKg0KPiAgICogQ29weSAxMjggYnl0ZXMgZnJvbSBv bmUgbG9jYXRpb24gdG8gYW5vdGhlciwNCj4gLSAqIGxvY2F0aW9ucyBzaG91bGQgbm90IG92ZXJs YXAuDQo+ICsgKiBsb2NhdGlvbnMgbXVzdCBub3Qgb3ZlcmxhcC4NCj4gICAqLw0KPiAgc3RhdGlj IF9fcnRlX2Fsd2F5c19pbmxpbmUgdm9pZA0KPiAtcnRlX21vdjEyOCh1aW50OF90ICpkc3QsIGNv bnN0IHVpbnQ4X3QgKnNyYykNCj4gK3J0ZV9tb3YxMjgodWludDhfdCAqX19ydGVfcmVzdHJpY3Qg ZHN0LCBjb25zdCB1aW50OF90ICpfX3J0ZV9yZXN0cmljdA0KPiBzcmMpDQo+ICB7DQo+ICAJcnRl X21vdjY0KGRzdCArIDAgKiA2NCwgc3JjICsgMCAqIDY0KTsNCj4gIAlydGVfbW92NjQoZHN0ICsg MSAqIDY0LCBzcmMgKyAxICogNjQpOw0KPiBAQCAtMTYzLDE1ICsxOTAsMjM0IEBAIHJ0ZV9tb3Yx MjgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMpDQo+IA0KPiAgLyoqDQo+ICAgKiBD b3B5IDI1NiBieXRlcyBmcm9tIG9uZSBsb2NhdGlvbiB0byBhbm90aGVyLA0KPiAtICogbG9jYXRp b25zIHNob3VsZCBub3Qgb3ZlcmxhcC4NCj4gKyAqIGxvY2F0aW9ucyBtdXN0IG5vdCBvdmVybGFw Lg0KPiAgICovDQo+ICBzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB2b2lkDQo+IC1ydGVfbW92 MjU2KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjKQ0KPiArcnRlX21vdjI1Nih1aW50 OF90ICpfX3J0ZV9yZXN0cmljdCBkc3QsIGNvbnN0IHVpbnQ4X3QgKl9fcnRlX3Jlc3RyaWN0DQo+ IHNyYykNCj4gIHsNCj4gIAlydGVfbW92MTI4KGRzdCArIDAgKiAxMjgsIHNyYyArIDAgKiAxMjgp Ow0KPiAgCXJ0ZV9tb3YxMjgoZHN0ICsgMSAqIDEyOCwgc3JjICsgMSAqIDEyOCk7DQo+ICB9DQo+ IA0KPiArLyoqDQo+ICsgKiBDb3B5IGJ5dGVzIGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3RoZXIs DQo+ICsgKiBsb2NhdGlvbnMgbXVzdCBub3Qgb3ZlcmxhcC4NCj4gKyAqIFVzZSB3aXRoIG4gPD0g MTYuDQo+ICsgKi8NCj4gK3N0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHZvaWQgKg0KPiArcnRl X21vdjE2X29yX2xlc3Modm9pZCAqX19ydGVfcmVzdHJpY3QgZHN0LCBjb25zdCB2b2lkICpfX3J0 ZV9yZXN0cmljdA0KPiBzcmMsIHNpemVfdCBuKQ0KPiArew0KPiArCS8qDQo+ICsJICogRmFzdGVy IHdheSB3aGVuIHNpemUgaXMga25vd24gYXQgYnVpbGQgdGltZS4NCj4gKwkgKiBTaXplcyByZXF1 aXJpbmcgdGhyZWUgY29weSBvcGVyYXRpb25zIGFyZSBub3QgaGFuZGxlZCBoZXJlLA0KPiArCSAq IGJ1dCBwcm9jZWVkIHRvIHRoZSBtZXRob2QgdXNpbmcgdHdvIG92ZXJsYXBwaW5nIGNvcHkNCj4g b3BlcmF0aW9ucy4NCj4gKwkgKi8NCj4gKwlpZiAoX19ydGVfY29uc3RhbnQobikpIHsNCj4gKwkJ aWYgKG4gPT0gMikgew0KPiArCQkJcnRlX21vdjIoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50 OF90ICopc3JjKTsNCj4gKwkJCXJldHVybiBkc3Q7DQo+ICsJCX0NCj4gKwkJaWYgKG4gPT0gMykg ew0KPiArCQkJcnRlX21vdjIoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsN Cj4gKwkJCXJ0ZV9tb3YxKCh1aW50OF90ICopZHN0ICsgMiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMg Kw0KPiAyKTsNCj4gKwkJCXJldHVybiBkc3Q7DQo+ICsJCX0NCj4gKwkJaWYgKG4gPT0gNCkgew0K PiArCQkJcnRlX21vdjQoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4g KwkJCXJldHVybiBkc3Q7DQo+ICsJCX0NCj4gKwkJaWYgKG4gPT0gNSkgew0KPiArCQkJcnRlX21v djQoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gKwkJCXJ0ZV9tb3Yx KCh1aW50OF90ICopZHN0ICsgNCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgKw0KPiA0KTsNCj4gKwkJ CXJldHVybiBkc3Q7DQo+ICsJCX0NCj4gKwkJaWYgKG4gPT0gNikgew0KPiArCQkJcnRlX21vdjQo KHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gKwkJCXJ0ZV9tb3YyKCh1 aW50OF90ICopZHN0ICsgNCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgKw0KPiA0KTsNCj4gKwkJCXJl dHVybiBkc3Q7DQo+ICsJCX0NCj4gKwkJaWYgKG4gPT0gOCkgew0KPiArCQkJcnRlX21vdjgoKHVp bnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gKwkJCXJldHVybiBkc3Q7DQo+ ICsJCX0NCj4gKwkJaWYgKG4gPT0gOSkgew0KPiArCQkJcnRlX21vdjgoKHVpbnQ4X3QgKilkc3Qs IChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gKwkJCXJ0ZV9tb3YxKCh1aW50OF90ICopZHN0ICsg OCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgKw0KPiA4KTsNCj4gKwkJCXJldHVybiBkc3Q7DQo+ICsJ CX0NCj4gKwkJaWYgKG4gPT0gMTApIHsNCj4gKwkJCXJ0ZV9tb3Y4KCh1aW50OF90ICopZHN0LCAo Y29uc3QgdWludDhfdCAqKXNyYyk7DQo+ICsJCQlydGVfbW92MigodWludDhfdCAqKWRzdCArIDgs IChjb25zdCB1aW50OF90ICopc3JjICsNCj4gOCk7DQo+ICsJCQlyZXR1cm4gZHN0Ow0KPiArCQl9 DQo+ICsJCWlmIChuID09IDEyKSB7DQo+ICsJCQlydGVfbW92OCgodWludDhfdCAqKWRzdCwgKGNv bnN0IHVpbnQ4X3QgKilzcmMpOw0KPiArCQkJcnRlX21vdjQoKHVpbnQ4X3QgKilkc3QgKyA4LCAo Y29uc3QgdWludDhfdCAqKXNyYyArDQo+IDgpOw0KPiArCQkJcmV0dXJuIGRzdDsNCj4gKwkJfQ0K PiArCQlpZiAobiA9PSAxNikgew0KPiArCQkJcnRlX21vdjE2KCh1aW50OF90ICopZHN0LCAoY29u c3QgdWludDhfdCAqKXNyYyk7DQo+ICsJCQlyZXR1cm4gZHN0Ow0KPiArCQl9DQo+ICsJfQ0KPiAr DQo+ICsJLyoNCj4gKwkgKiBOb3RlOiBVc2luZyAibiAmIFgiIGdlbmVyYXRlcyAzLWJ5dGUgInRl c3QiIGluc3RydWN0aW9ucywNCj4gKwkgKiBpbnN0ZWFkIG9mICJuID49IFgiLCB3aGljaCB3b3Vs ZCBnZW5lcmF0ZSA0LWJ5dGUgImNtcCINCj4gaW5zdHJ1Y3Rpb25zLg0KPiArCSAqLw0KPiArCWlm IChuICYgMHgxOCkgeyAvKiBuID49IDgsIGluY2x1ZGluZyBuID09IDB4MTAsIGhlbmNlIG4gJiAw eDE4Lg0KPiAqLw0KPiArCQkvKiBDb3B5IDggfiAxNiBieXRlcy4gKi8NCj4gKwkJcnRlX21vdjgo KHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gKwkJcnRlX21vdjgoKHVp bnQ4X3QgKilkc3QgLSA4ICsgbiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgLSA4ICsNCj4gbik7DQo+ ICsJfSBlbHNlIGlmIChuICYgMHg0KSB7DQo+ICsJCS8qIENvcHkgNCB+IDcgYnl0ZXMuICovDQo+ ICsJCXJ0ZV9tb3Y0KCh1aW50OF90ICopZHN0LCAoY29uc3QgdWludDhfdCAqKXNyYyk7DQo+ICsJ CXJ0ZV9tb3Y0KCh1aW50OF90ICopZHN0IC0gNCArIG4sIChjb25zdCB1aW50OF90ICopc3JjIC0g NCArDQo+IG4pOw0KPiArCX0gZWxzZSBpZiAobiAmIDB4Mikgew0KPiArCQkvKiBDb3B5IDIgfiAz IGJ5dGVzLiAqLw0KPiArCQlydGVfbW92MigodWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4X3Qg KilzcmMpOw0KPiArCQlydGVfbW92MigodWludDhfdCAqKWRzdCAtIDIgKyBuLCAoY29uc3QgdWlu dDhfdCAqKXNyYyAtIDIgKw0KPiBuKTsNCj4gKwl9IGVsc2UgaWYgKG4gJiAweDEpIHsNCj4gKwkJ LyogQ29weSAxIGJ5dGUuICovDQo+ICsJCXJ0ZV9tb3YxKCh1aW50OF90ICopZHN0LCAoY29uc3Qg dWludDhfdCAqKXNyYyk7DQo+ICsJfQ0KPiArCXJldHVybiBkc3Q7DQo+ICt9DQo+ICsNCj4gKy8q Kg0KPiArICogQ29weSBieXRlcyBmcm9tIG9uZSBsb2NhdGlvbiB0byBhbm90aGVyLA0KPiArICog bG9jYXRpb25zIG11c3Qgbm90IG92ZXJsYXAuDQo+ICsgKiBVc2Ugd2l0aCAxNyAob3IgMTYpIDwg biA8PSAzMi4NCj4gKyAqLw0KPiArc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgdm9pZCAqDQo+ ICtydGVfbW92MTdfdG9fMzIodm9pZCAqX19ydGVfcmVzdHJpY3QgZHN0LCBjb25zdCB2b2lkICpf X3J0ZV9yZXN0cmljdA0KPiBzcmMsIHNpemVfdCBuKQ0KPiArew0KPiArCS8qDQo+ICsJICogRmFz dGVyIHdheSB3aGVuIHNpemUgaXMga25vd24gYXQgYnVpbGQgdGltZS4NCj4gKwkgKiBTaXplcyBy ZXF1aXJpbmcgdGhyZWUgY29weSBvcGVyYXRpb25zIGFyZSBub3QgaGFuZGxlZCBoZXJlLA0KPiAr CSAqIGJ1dCBwcm9jZWVkIHRvIHRoZSBtZXRob2QgdXNpbmcgdHdvIG92ZXJsYXBwaW5nIGNvcHkN Cj4gb3BlcmF0aW9ucy4NCj4gKwkgKi8NCj4gKwlpZiAoX19ydGVfY29uc3RhbnQobikpIHsNCj4g KwkJaWYgKG4gPT0gMTYpIHsNCj4gKwkJCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCwgKGNvbnN0 IHVpbnQ4X3QgKilzcmMpOw0KPiArCQkJcmV0dXJuIGRzdDsNCj4gKwkJfQ0KPiArCQlpZiAobiA9 PSAxNykgew0KPiArCQkJcnRlX21vdjE2KCh1aW50OF90ICopZHN0LCAoY29uc3QgdWludDhfdCAq KXNyYyk7DQo+ICsJCQlydGVfbW92MSgodWludDhfdCAqKWRzdCArIDE2LCAoY29uc3QgdWludDhf dCAqKXNyYyArDQo+IDE2KTsNCj4gKwkJCXJldHVybiBkc3Q7DQo+ICsJCX0NCj4gKwkJaWYgKG4g PT0gMTgpIHsNCj4gKwkJCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4X3Qg KilzcmMpOw0KPiArCQkJcnRlX21vdjIoKHVpbnQ4X3QgKilkc3QgKyAxNiwgKGNvbnN0IHVpbnQ4 X3QgKilzcmMgKw0KPiAxNik7DQo+ICsJCQlyZXR1cm4gZHN0Ow0KPiArCQl9DQo+ICsJCWlmIChu ID09IDIwKSB7DQo+ICsJCQlydGVfbW92MTYoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90 ICopc3JjKTsNCj4gKwkJCXJ0ZV9tb3Y0KCh1aW50OF90ICopZHN0ICsgMTYsIChjb25zdCB1aW50 OF90ICopc3JjICsNCj4gMTYpOw0KPiArCQkJcmV0dXJuIGRzdDsNCj4gKwkJfQ0KPiArCQlpZiAo biA9PSAyNCkgew0KPiArCQkJcnRlX21vdjE2KCh1aW50OF90ICopZHN0LCAoY29uc3QgdWludDhf dCAqKXNyYyk7DQo+ICsJCQlydGVfbW92OCgodWludDhfdCAqKWRzdCArIDE2LCAoY29uc3QgdWlu dDhfdCAqKXNyYyArDQo+IDE2KTsNCj4gKwkJCXJldHVybiBkc3Q7DQo+ICsJCX0NCj4gKwkJaWYg KG4gPT0gMzIpIHsNCj4gKwkJCXJ0ZV9tb3YzMigodWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4 X3QgKilzcmMpOw0KPiArCQkJcmV0dXJuIGRzdDsNCj4gKwkJfQ0KPiArCX0NCj4gKw0KPiArCS8q IENvcHkgMTcgKG9yIDE2KSB+IDMyIGJ5dGVzLiAqLw0KPiArCXJ0ZV9tb3YxNigodWludDhfdCAq KWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiArCXJ0ZV9tb3YxNigodWludDhfdCAqKWRz dCAtIDE2ICsgbiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgLSAxNiArDQo+IG4pOw0KPiArCXJldHVy biBkc3Q7DQo+ICt9DQo+ICsNCj4gKy8qKg0KPiArICogQ29weSBieXRlcyBmcm9tIG9uZSBsb2Nh dGlvbiB0byBhbm90aGVyLA0KPiArICogbG9jYXRpb25zIG11c3Qgbm90IG92ZXJsYXAuDQo+ICsg KiBVc2Ugd2l0aCAzMyAob3IgMzIpIDwgbiA8PSA2NC4NCj4gKyAqLw0KPiArc3RhdGljIF9fcnRl X2Fsd2F5c19pbmxpbmUgdm9pZCAqDQo+ICtydGVfbW92MzNfdG9fNjQodm9pZCAqX19ydGVfcmVz dHJpY3QgZHN0LCBjb25zdCB2b2lkICpfX3J0ZV9yZXN0cmljdA0KPiBzcmMsIHNpemVfdCBuKQ0K PiArew0KPiArCS8qDQo+ICsJICogRmFzdGVyIHdheSB3aGVuIHNpemUgaXMga25vd24gYXQgYnVp bGQgdGltZS4NCj4gKwkgKiBTaXplcyByZXF1aXJpbmcgbW9yZSBjb3B5IG9wZXJhdGlvbnMgYXJl IG5vdCBoYW5kbGVkIGhlcmUsDQo+ICsJICogYnV0IHByb2NlZWQgdG8gdGhlIG1ldGhvZCB1c2lu ZyBvdmVybGFwcGluZyBjb3B5IG9wZXJhdGlvbnMuDQo+ICsJICovDQo+ICsJaWYgKF9fcnRlX2Nv bnN0YW50KG4pKSB7DQo+ICsJCWlmIChuID09IDMyKSB7DQo+ICsJCQlydGVfbW92MzIoKHVpbnQ4 X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gKwkJCXJldHVybiBkc3Q7DQo+ICsJ CX0NCj4gKwkJaWYgKG4gPT0gMzMpIHsNCj4gKwkJCXJ0ZV9tb3YzMigodWludDhfdCAqKWRzdCwg KGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiArCQkJcnRlX21vdjEoKHVpbnQ4X3QgKilkc3QgKyAz MiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgKw0KPiAzMik7DQo+ICsJCQlyZXR1cm4gZHN0Ow0KPiAr CQl9DQo+ICsJCWlmIChuID09IDM0KSB7DQo+ICsJCQlydGVfbW92MzIoKHVpbnQ4X3QgKilkc3Qs IChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gKwkJCXJ0ZV9tb3YyKCh1aW50OF90ICopZHN0ICsg MzIsIChjb25zdCB1aW50OF90ICopc3JjICsNCj4gMzIpOw0KPiArCQkJcmV0dXJuIGRzdDsNCj4g KwkJfQ0KPiArCQlpZiAobiA9PSAzNikgew0KPiArCQkJcnRlX21vdjMyKCh1aW50OF90ICopZHN0 LCAoY29uc3QgdWludDhfdCAqKXNyYyk7DQo+ICsJCQlydGVfbW92NCgodWludDhfdCAqKWRzdCAr IDMyLCAoY29uc3QgdWludDhfdCAqKXNyYyArDQo+IDMyKTsNCj4gKwkJCXJldHVybiBkc3Q7DQo+ ICsJCX0NCj4gKwkJaWYgKG4gPT0gNDApIHsNCj4gKwkJCXJ0ZV9tb3YzMigodWludDhfdCAqKWRz dCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiArCQkJcnRlX21vdjgoKHVpbnQ4X3QgKilkc3Qg KyAzMiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgKw0KPiAzMik7DQo+ICsJCQlyZXR1cm4gZHN0Ow0K PiArCQl9DQo+ICsJCWlmIChuID09IDQ4KSB7DQo+ICsJCQlydGVfbW92NDgoKHVpbnQ4X3QgKilk c3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gKwkJCXJldHVybiBkc3Q7DQo+ICsJCX0NCj4g KyNpZiAhZGVmaW5lZCBSVEVfTUVNQ1BZX0FWWCAvKiBTU0Ugc3BlY2lmaWMgaW1wbGVtZW50YXRp b24gKi8NCj4gKwkJaWYgKG4gPT0gNDkpIHsNCj4gKwkJCXJ0ZV9tb3Y0OCgodWludDhfdCAqKWRz dCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiArCQkJcnRlX21vdjEoKHVpbnQ4X3QgKilkc3Qg KyA0OCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgKw0KPiA0OCk7DQo+ICsJCQlyZXR1cm4gZHN0Ow0K PiArCQl9DQo+ICsJCWlmIChuID09IDUwKSB7DQo+ICsJCQlydGVfbW92NDgoKHVpbnQ4X3QgKilk c3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gKwkJCXJ0ZV9tb3YyKCh1aW50OF90ICopZHN0 ICsgNDgsIChjb25zdCB1aW50OF90ICopc3JjICsNCj4gNDgpOw0KPiArCQkJcmV0dXJuIGRzdDsN Cj4gKwkJfQ0KPiArCQlpZiAobiA9PSA1Mikgew0KPiArCQkJcnRlX21vdjQ4KCh1aW50OF90ICop ZHN0LCAoY29uc3QgdWludDhfdCAqKXNyYyk7DQo+ICsJCQlydGVfbW92NCgodWludDhfdCAqKWRz dCArIDQ4LCAoY29uc3QgdWludDhfdCAqKXNyYyArDQo+IDQ4KTsNCj4gKwkJCXJldHVybiBkc3Q7 DQo+ICsJCX0NCj4gKwkJaWYgKG4gPT0gNTYpIHsNCj4gKwkJCXJ0ZV9tb3Y0OCgodWludDhfdCAq KWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiArCQkJcnRlX21vdjgoKHVpbnQ4X3QgKilk c3QgKyA0OCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgKw0KPiA0OCk7DQo+ICsJCQlyZXR1cm4gZHN0 Ow0KPiArCQl9DQo+ICsjZW5kaWYNCj4gKwkJaWYgKG4gPT0gNjQpIHsNCj4gKwkJCXJ0ZV9tb3Y2 NCgodWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiArCQkJcmV0dXJuIGRz dDsNCj4gKwkJfQ0KPiArCX0NCj4gKw0KPiArCS8qIENvcHkgMzMgKG9yIDMyKSB+IDY0IGJ5dGVz LiAqLw0KPiArI2lmIGRlZmluZWQgUlRFX01FTUNQWV9BVlgNCj4gKwlydGVfbW92MzIoKHVpbnQ4 X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gKwlydGVfbW92MzIoKHVpbnQ4X3Qg Kilkc3QgLSAzMiArIG4sIChjb25zdCB1aW50OF90ICopc3JjIC0gMzIgKw0KPiBuKTsNCj4gKyNl bHNlIC8qIFNTRSBpbXBsZW1lbnRhdGlvbiAqLw0KPiArCXJ0ZV9tb3YxNigodWludDhfdCAqKWRz dCArIDAgKiAxNiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgKyAwICoNCj4gMTYpOw0KPiArCXJ0ZV9t b3YxNigodWludDhfdCAqKWRzdCArIDEgKiAxNiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgKyAxICoN Cj4gMTYpOw0KPiArCWlmIChuID4gNDgpDQo+ICsJCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCAr IDIgKiAxNiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgKyAyDQo+ICogMTYpOw0KPiArCXJ0ZV9tb3Yx NigodWludDhfdCAqKWRzdCAtIDE2ICsgbiwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgLSAxNiArDQo+ IG4pOw0KPiArI2VuZGlmDQo+ICsJcmV0dXJuIGRzdDsNCj4gK30NCj4gKw0KPiAgI2lmIGRlZmlu ZWQgX19BVlg1MTJGX18gJiYgZGVmaW5lZCBSVEVfTUVNQ1BZX0FWWDUxMg0KPiANCj4gIC8qKg0K PiBAQCAtMTgyLDEwICs0MjgsMTAgQEAgcnRlX21vdjI1Nih1aW50OF90ICpkc3QsIGNvbnN0IHVp bnQ4X3QgKnNyYykNCj4gDQo+ICAvKioNCj4gICAqIENvcHkgMTI4LWJ5dGUgYmxvY2tzIGZyb20g b25lIGxvY2F0aW9uIHRvIGFub3RoZXIsDQo+IC0gKiBsb2NhdGlvbnMgc2hvdWxkIG5vdCBvdmVy bGFwLg0KPiArICogbG9jYXRpb25zIG11c3Qgbm90IG92ZXJsYXAuDQo+ICAgKi8NCj4gIHN0YXRp YyBfX3J0ZV9hbHdheXNfaW5saW5lIHZvaWQNCj4gLXJ0ZV9tb3YxMjhibG9ja3ModWludDhfdCAq ZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCBuKQ0KPiArcnRlX21vdjEyOGJsb2Nrcyh1 aW50OF90ICpfX3J0ZV9yZXN0cmljdCBkc3QsIGNvbnN0IHVpbnQ4X3QNCj4gKl9fcnRlX3Jlc3Ry aWN0IHNyYywgc2l6ZV90IG4pDQo+ICB7DQo+ICAJX19tNTEyaSB6bW0wLCB6bW0xOw0KPiANCj4g QEAgLTIwMiwxMCArNDQ4LDEwIEBAIHJ0ZV9tb3YxMjhibG9ja3ModWludDhfdCAqZHN0LCBjb25z dCB1aW50OF90DQo+ICpzcmMsIHNpemVfdCBuKQ0KPiANCj4gIC8qKg0KPiAgICogQ29weSA1MTIt Ynl0ZSBibG9ja3MgZnJvbSBvbmUgbG9jYXRpb24gdG8gYW5vdGhlciwNCj4gLSAqIGxvY2F0aW9u cyBzaG91bGQgbm90IG92ZXJsYXAuDQo+ICsgKiBsb2NhdGlvbnMgbXVzdCBub3Qgb3ZlcmxhcC4N Cj4gICAqLw0KPiAgc3RhdGljIGlubGluZSB2b2lkDQo+IC1ydGVfbW92NTEyYmxvY2tzKHVpbnQ4 X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3QgbikNCj4gK3J0ZV9tb3Y1MTJibG9j a3ModWludDhfdCAqX19ydGVfcmVzdHJpY3QgZHN0LCBjb25zdCB1aW50OF90DQo+ICpfX3J0ZV9y ZXN0cmljdCBzcmMsIHNpemVfdCBuKQ0KPiAgew0KPiAgCV9fbTUxMmkgem1tMCwgem1tMSwgem1t Miwgem1tMywgem1tNCwgem1tNSwgem1tNiwgem1tNzsNCj4gDQo+IEBAIC0yMzIsNDUgKzQ3OCwy MiBAQCBydGVfbW92NTEyYmxvY2tzKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdA0KPiAqc3Jj LCBzaXplX3QgbikNCj4gIAl9DQo+ICB9DQo+IA0KPiArLyoqDQo+ICsgKiBDb3B5IGJ5dGVzIGZy b20gb25lIGxvY2F0aW9uIHRvIGFub3RoZXIsDQo+ICsgKiBsb2NhdGlvbnMgbXVzdCBub3Qgb3Zl cmxhcC4NCj4gKyAqIFVzZSB3aXRoIG4gPiA2NC4NCj4gKyAqLw0KPiAgc3RhdGljIF9fcnRlX2Fs d2F5c19pbmxpbmUgdm9pZCAqDQo+IC1ydGVfbWVtY3B5X2dlbmVyaWModm9pZCAqZHN0LCBjb25z dCB2b2lkICpzcmMsIHNpemVfdCBuKQ0KPiArcnRlX21lbWNweV9nZW5lcmljX21vcmVfdGhhbl82 NCh2b2lkICpfX3J0ZV9yZXN0cmljdCBkc3QsIGNvbnN0IHZvaWQNCj4gKl9fcnRlX3Jlc3RyaWN0 IHNyYywNCj4gKwkJc2l6ZV90IG4pDQo+ICB7DQo+ICAJdm9pZCAqcmV0ID0gZHN0Ow0KPiAgCXNp emVfdCBkc3RvZnNzOw0KPiAgCXNpemVfdCBiaXRzOw0KPiANCj4gLQkvKioNCj4gLQkgKiBDb3B5 IGxlc3MgdGhhbiAxNiBieXRlcw0KPiAtCSAqLw0KPiAtCWlmIChuIDwgMTYpIHsNCj4gLQkJcmV0 dXJuIHJ0ZV9tb3YxNV9vcl9sZXNzKGRzdCwgc3JjLCBuKTsNCj4gLQl9DQo+IC0NCj4gIAkvKioN Cj4gIAkgKiBGYXN0IHdheSB3aGVuIGNvcHkgc2l6ZSBkb2Vzbid0IGV4Y2VlZCA1MTIgYnl0ZXMN Cj4gIAkgKi8NCj4gLQlpZiAoX19ydGVfY29uc3RhbnQobikgJiYgbiA9PSAzMikgew0KPiAtCQly dGVfbW92MzIoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gLQkJcmV0 dXJuIHJldDsNCj4gLQl9DQo+IC0JaWYgKG4gPD0gMzIpIHsNCj4gLQkJcnRlX21vdjE2KCh1aW50 OF90ICopZHN0LCAoY29uc3QgdWludDhfdCAqKXNyYyk7DQo+IC0JCWlmIChfX3J0ZV9jb25zdGFu dChuKSAmJiBuID09IDE2KQ0KPiAtCQkJcmV0dXJuIHJldDsgLyogYXZvaWQgKGhhcm1sZXNzKSBk dXBsaWNhdGUgY29weSAqLw0KPiAtCQlydGVfbW92MTYoKHVpbnQ4X3QgKilkc3QgLSAxNiArIG4s DQo+IC0JCQkJICAoY29uc3QgdWludDhfdCAqKXNyYyAtIDE2ICsgbik7DQo+IC0JCXJldHVybiBy ZXQ7DQo+IC0JfQ0KPiAtCWlmIChfX3J0ZV9jb25zdGFudChuKSAmJiBuID09IDY0KSB7DQo+IC0J CXJ0ZV9tb3Y2NCgodWludDhfdCAqKWRzdCwgKGNvbnN0IHVpbnQ4X3QgKilzcmMpOw0KPiAtCQly ZXR1cm4gcmV0Ow0KPiAtCX0NCj4gLQlpZiAobiA8PSA2NCkgew0KPiAtCQlydGVfbW92MzIoKHVp bnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gLQkJcnRlX21vdjMyKCh1aW50 OF90ICopZHN0IC0gMzIgKyBuLA0KPiAtCQkJCSAgKGNvbnN0IHVpbnQ4X3QgKilzcmMgLSAzMiAr IG4pOw0KPiAtCQlyZXR1cm4gcmV0Ow0KPiAtCX0NCj4gIAlpZiAobiA8PSA1MTIpIHsNCj4gIAkJ aWYgKG4gPj0gMjU2KSB7DQo+ICAJCQluIC09IDI1NjsNCj4gQEAgLTM1MSwxMCArNTc0LDEwIEBA IHJ0ZV9tZW1jcHlfZ2VuZXJpYyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywNCj4gc2l6ZV90 IG4pDQo+IA0KPiAgLyoqDQo+ICAgKiBDb3B5IDEyOC1ieXRlIGJsb2NrcyBmcm9tIG9uZSBsb2Nh dGlvbiB0byBhbm90aGVyLA0KPiAtICogbG9jYXRpb25zIHNob3VsZCBub3Qgb3ZlcmxhcC4NCj4g KyAqIGxvY2F0aW9ucyBtdXN0IG5vdCBvdmVybGFwLg0KPiAgICovDQo+ICBzdGF0aWMgX19ydGVf YWx3YXlzX2lubGluZSB2b2lkDQo+IC1ydGVfbW92MTI4YmxvY2tzKHVpbnQ4X3QgKmRzdCwgY29u c3QgdWludDhfdCAqc3JjLCBzaXplX3QgbikNCj4gK3J0ZV9tb3YxMjhibG9ja3ModWludDhfdCAq X19ydGVfcmVzdHJpY3QgZHN0LCBjb25zdCB1aW50OF90DQo+ICpfX3J0ZV9yZXN0cmljdCBzcmMs IHNpemVfdCBuKQ0KPiAgew0KPiAgCV9fbTI1NmkgeW1tMCwgeW1tMSwgeW1tMiwgeW1tMzsNCj4g DQo+IEBAIC0zODEsNDEgKzYwNCwyMiBAQCBydGVfbW92MTI4YmxvY2tzKHVpbnQ4X3QgKmRzdCwg Y29uc3QgdWludDhfdA0KPiAqc3JjLCBzaXplX3QgbikNCj4gIAl9DQo+ICB9DQo+IA0KPiArLyoq DQo+ICsgKiBDb3B5IGJ5dGVzIGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3RoZXIsDQo+ICsgKiBs b2NhdGlvbnMgbXVzdCBub3Qgb3ZlcmxhcC4NCj4gKyAqIFVzZSB3aXRoIG4gPiA2NC4NCj4gKyAq Lw0KPiAgc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgdm9pZCAqDQo+IC1ydGVfbWVtY3B5X2dl bmVyaWModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQ0KPiArcnRlX21lbWNw eV9nZW5lcmljX21vcmVfdGhhbl82NCh2b2lkICpfX3J0ZV9yZXN0cmljdCBkc3QsIGNvbnN0IHZv aWQNCj4gKl9fcnRlX3Jlc3RyaWN0IHNyYywNCj4gKwkJc2l6ZV90IG4pDQo+ICB7DQo+ICAJdm9p ZCAqcmV0ID0gZHN0Ow0KPiAgCXNpemVfdCBkc3RvZnNzOw0KPiAgCXNpemVfdCBiaXRzOw0KPiAN Cj4gLQkvKioNCj4gLQkgKiBDb3B5IGxlc3MgdGhhbiAxNiBieXRlcw0KPiAtCSAqLw0KPiAtCWlm IChuIDwgMTYpIHsNCj4gLQkJcmV0dXJuIHJ0ZV9tb3YxNV9vcl9sZXNzKGRzdCwgc3JjLCBuKTsN Cj4gLQl9DQo+IC0NCj4gIAkvKioNCj4gIAkgKiBGYXN0IHdheSB3aGVuIGNvcHkgc2l6ZSBkb2Vz bid0IGV4Y2VlZCAyNTYgYnl0ZXMNCj4gIAkgKi8NCj4gLQlpZiAoX19ydGVfY29uc3RhbnQobikg JiYgbiA9PSAzMikgew0KPiAtCQlydGVfbW92MzIoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50 OF90ICopc3JjKTsNCj4gLQkJcmV0dXJuIHJldDsNCj4gLQl9DQo+IC0JaWYgKG4gPD0gMzIpIHsN Cj4gLQkJcnRlX21vdjE2KCh1aW50OF90ICopZHN0LCAoY29uc3QgdWludDhfdCAqKXNyYyk7DQo+ IC0JCWlmIChfX3J0ZV9jb25zdGFudChuKSAmJiBuID09IDE2KQ0KPiAtCQkJcmV0dXJuIHJldDsg LyogYXZvaWQgKGhhcm1sZXNzKSBkdXBsaWNhdGUgY29weSAqLw0KPiAtCQlydGVfbW92MTYoKHVp bnQ4X3QgKilkc3QgLSAxNiArIG4sDQo+IC0JCQkJKGNvbnN0IHVpbnQ4X3QgKilzcmMgLSAxNiAr IG4pOw0KPiAtCQlyZXR1cm4gcmV0Ow0KPiAtCX0NCj4gLQlpZiAobiA8PSA2NCkgew0KPiAtCQly dGVfbW92MzIoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gLQkJcnRl X21vdjMyKCh1aW50OF90ICopZHN0IC0gMzIgKyBuLA0KPiAtCQkJCShjb25zdCB1aW50OF90ICop c3JjIC0gMzIgKyBuKTsNCj4gLQkJcmV0dXJuIHJldDsNCj4gLQl9DQo+ICAJaWYgKG4gPD0gMjU2 KSB7DQo+ICAJCWlmIChuID49IDEyOCkgew0KPiAgCQkJbiAtPSAxMjg7DQo+IEBAIC00ODIsNyAr Njg2LDcgQEAgcnRlX21lbWNweV9nZW5lcmljKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLA0K PiBzaXplX3QgbikNCj4gIC8qKg0KPiAgICogTWFjcm8gZm9yIGNvcHlpbmcgdW5hbGlnbmVkIGJs b2NrIGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3RoZXIgd2l0aA0KPiBjb25zdGFudCBsb2FkIG9m ZnNldCwNCj4gICAqIDQ3IGJ5dGVzIGxlZnRvdmVyIG1heGltdW0sDQo+IC0gKiBsb2NhdGlvbnMg c2hvdWxkIG5vdCBvdmVybGFwLg0KPiArICogbG9jYXRpb25zIG11c3Qgbm90IG92ZXJsYXAuDQo+ ICAgKiBSZXF1aXJlbWVudHM6DQo+ICAgKiAtIFN0b3JlIGlzIGFsaWduZWQNCj4gICAqIC0gTG9h ZCBvZmZzZXQgaXMgPG9mZnNldD4sIHdoaWNoIG11c3QgYmUgaW1tZWRpYXRlIHZhbHVlIHdpdGhp biBbMSwNCj4gMTVdDQo+IEBAIC01NDIsNyArNzQ2LDcgQEAgcnRlX21lbWNweV9nZW5lcmljKHZv aWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLA0KPiBzaXplX3QgbikNCj4gIC8qKg0KPiAgICogTWFj cm8gZm9yIGNvcHlpbmcgdW5hbGlnbmVkIGJsb2NrIGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3Ro ZXIsDQo+ICAgKiA0NyBieXRlcyBsZWZ0b3ZlciBtYXhpbXVtLA0KPiAtICogbG9jYXRpb25zIHNo b3VsZCBub3Qgb3ZlcmxhcC4NCj4gKyAqIGxvY2F0aW9ucyBtdXN0IG5vdCBvdmVybGFwLg0KPiAg ICogVXNlIHN3aXRjaCBoZXJlIGJlY2F1c2UgdGhlIGFsaWduaW5nIGluc3RydWN0aW9uIHJlcXVp cmVzIGltbWVkaWF0ZQ0KPiB2YWx1ZSBmb3Igc2hpZnQgY291bnQuDQo+ICAgKiBSZXF1aXJlbWVu dHM6DQo+ICAgKiAtIFN0b3JlIGlzIGFsaWduZWQNCj4gQEAgLTU3MywzOCArNzc3LDIzIEBAIHJ0 ZV9tZW1jcHlfZ2VuZXJpYyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywNCj4gc2l6ZV90IG4p DQo+ICAgICAgfQ0KPiBcDQo+ICB9DQo+IA0KPiArLyoqDQo+ICsgKiBDb3B5IGJ5dGVzIGZyb20g b25lIGxvY2F0aW9uIHRvIGFub3RoZXIsDQo+ICsgKiBsb2NhdGlvbnMgbXVzdCBub3Qgb3Zlcmxh cC4NCj4gKyAqIFVzZSB3aXRoIG4gPiA2NC4NCj4gKyAqLw0KPiAgc3RhdGljIF9fcnRlX2Fsd2F5 c19pbmxpbmUgdm9pZCAqDQo+IC1ydGVfbWVtY3B5X2dlbmVyaWModm9pZCAqZHN0LCBjb25zdCB2 b2lkICpzcmMsIHNpemVfdCBuKQ0KPiArcnRlX21lbWNweV9nZW5lcmljX21vcmVfdGhhbl82NCh2 b2lkICpfX3J0ZV9yZXN0cmljdCBkc3QsIGNvbnN0IHZvaWQNCj4gKl9fcnRlX3Jlc3RyaWN0IHNy YywNCj4gKwkJc2l6ZV90IG4pDQo+ICB7DQo+ICAJX19tMTI4aSB4bW0wLCB4bW0xLCB4bW0yLCB4 bW0zLCB4bW00LCB4bW01LCB4bW02LCB4bW03LCB4bW04Ow0KPiAgCXZvaWQgKnJldCA9IGRzdDsN Cj4gIAlzaXplX3QgZHN0b2ZzczsNCj4gIAlzaXplX3Qgc3Jjb2ZzOw0KPiANCj4gLQkvKioNCj4g LQkgKiBDb3B5IGxlc3MgdGhhbiAxNiBieXRlcw0KPiAtCSAqLw0KPiAtCWlmIChuIDwgMTYpIHsN Cj4gLQkJcmV0dXJuIHJ0ZV9tb3YxNV9vcl9sZXNzKGRzdCwgc3JjLCBuKTsNCj4gLQl9DQo+IC0N Cj4gIAkvKioNCj4gIAkgKiBGYXN0IHdheSB3aGVuIGNvcHkgc2l6ZSBkb2Vzbid0IGV4Y2VlZCA1 MTIgYnl0ZXMNCj4gIAkgKi8NCj4gLQlpZiAobiA8PSAzMikgew0KPiAtCQlydGVfbW92MTYoKHVp bnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gLQkJaWYgKF9fcnRlX2NvbnN0 YW50KG4pICYmIG4gPT0gMTYpDQo+IC0JCQlyZXR1cm4gcmV0OyAvKiBhdm9pZCAoaGFybWxlc3Mp IGR1cGxpY2F0ZSBjb3B5ICovDQo+IC0JCXJ0ZV9tb3YxNigodWludDhfdCAqKWRzdCAtIDE2ICsg biwgKGNvbnN0IHVpbnQ4X3QgKilzcmMgLQ0KPiAxNiArIG4pOw0KPiAtCQlyZXR1cm4gcmV0Ow0K PiAtCX0NCj4gLQlpZiAobiA8PSA2NCkgew0KPiAtCQlydGVfbW92MzIoKHVpbnQ4X3QgKilkc3Qs IChjb25zdCB1aW50OF90ICopc3JjKTsNCj4gLQkJaWYgKG4gPiA0OCkNCj4gLQkJCXJ0ZV9tb3Yx NigodWludDhfdCAqKWRzdCArIDMyLCAoY29uc3QgdWludDhfdCAqKXNyYyArDQo+IDMyKTsNCj4g LQkJcnRlX21vdjE2KCh1aW50OF90ICopZHN0IC0gMTYgKyBuLCAoY29uc3QgdWludDhfdCAqKXNy YyAtDQo+IDE2ICsgbik7DQo+IC0JCXJldHVybiByZXQ7DQo+IC0JfQ0KPiAgCWlmIChuIDw9IDEy OCkgew0KPiAgCQlnb3RvIENPUFlfQkxPQ0tfMTI4X0JBQ0sxNTsNCj4gIAl9DQo+IEBAIC02OTYs NDQgKzg4NSwxNyBAQCBydGVfbWVtY3B5X2dlbmVyaWModm9pZCAqZHN0LCBjb25zdCB2b2lkICpz cmMsDQo+IHNpemVfdCBuKQ0KPiANCj4gICNlbmRpZiAvKiBfX0FWWDUxMkZfXyAqLw0KPiANCj4g Ky8qKg0KPiArICogQ29weSBieXRlcyBmcm9tIG9uZSB2ZWN0b3IgcmVnaXN0ZXIgc2l6ZSBhbGln bmVkIGxvY2F0aW9uIHRvDQo+IGFub3RoZXIsDQo+ICsgKiBsb2NhdGlvbnMgbXVzdCBub3Qgb3Zl cmxhcC4NCj4gKyAqIFVzZSB3aXRoIG4gPiA2NC4NCj4gKyAqLw0KPiAgc3RhdGljIF9fcnRlX2Fs d2F5c19pbmxpbmUgdm9pZCAqDQo+IC1ydGVfbWVtY3B5X2FsaWduZWQodm9pZCAqZHN0LCBjb25z dCB2b2lkICpzcmMsIHNpemVfdCBuKQ0KPiArcnRlX21lbWNweV9hbGlnbmVkX21vcmVfdGhhbl82 NCh2b2lkICpfX3J0ZV9yZXN0cmljdCBkc3QsIGNvbnN0IHZvaWQNCj4gKl9fcnRlX3Jlc3RyaWN0 IHNyYywNCj4gKwkJc2l6ZV90IG4pDQo+ICB7DQo+ICAJdm9pZCAqcmV0ID0gZHN0Ow0KPiANCj4g LQkvKiBDb3B5IHNpemUgPCAxNiBieXRlcyAqLw0KPiAtCWlmIChuIDwgMTYpIHsNCj4gLQkJcmV0 dXJuIHJ0ZV9tb3YxNV9vcl9sZXNzKGRzdCwgc3JjLCBuKTsNCj4gLQl9DQo+IC0NCj4gLQkvKiBD b3B5IDE2IDw9IHNpemUgPD0gMzIgYnl0ZXMgKi8NCj4gLQlpZiAoX19ydGVfY29uc3RhbnQobikg JiYgbiA9PSAzMikgew0KPiAtCQlydGVfbW92MzIoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50 OF90ICopc3JjKTsNCj4gLQkJcmV0dXJuIHJldDsNCj4gLQl9DQo+IC0JaWYgKG4gPD0gMzIpIHsN Cj4gLQkJcnRlX21vdjE2KCh1aW50OF90ICopZHN0LCAoY29uc3QgdWludDhfdCAqKXNyYyk7DQo+ IC0JCWlmIChfX3J0ZV9jb25zdGFudChuKSAmJiBuID09IDE2KQ0KPiAtCQkJcmV0dXJuIHJldDsg LyogYXZvaWQgKGhhcm1sZXNzKSBkdXBsaWNhdGUgY29weSAqLw0KPiAtCQlydGVfbW92MTYoKHVp bnQ4X3QgKilkc3QgLSAxNiArIG4sDQo+IC0JCQkJKGNvbnN0IHVpbnQ4X3QgKilzcmMgLSAxNiAr IG4pOw0KPiAtDQo+IC0JCXJldHVybiByZXQ7DQo+IC0JfQ0KPiAtDQo+IC0JLyogQ29weSAzMiA8 IHNpemUgPD0gNjQgYnl0ZXMgKi8NCj4gLQlpZiAoX19ydGVfY29uc3RhbnQobikgJiYgbiA9PSA2 NCkgew0KPiAtCQlydGVfbW92NjQoKHVpbnQ4X3QgKilkc3QsIChjb25zdCB1aW50OF90ICopc3Jj KTsNCj4gLQkJcmV0dXJuIHJldDsNCj4gLQl9DQo+IC0JaWYgKG4gPD0gNjQpIHsNCj4gLQkJcnRl X21vdjMyKCh1aW50OF90ICopZHN0LCAoY29uc3QgdWludDhfdCAqKXNyYyk7DQo+IC0JCXJ0ZV9t b3YzMigodWludDhfdCAqKWRzdCAtIDMyICsgbiwNCj4gLQkJCQkoY29uc3QgdWludDhfdCAqKXNy YyAtIDMyICsgbik7DQo+IC0NCj4gLQkJcmV0dXJuIHJldDsNCj4gLQl9DQo+IC0NCj4gIAkvKiBD b3B5IDY0IGJ5dGVzIGJsb2NrcyAqLw0KPiAgCWZvciAoOyBuID4gNjQ7IG4gLT0gNjQpIHsNCj4g IAkJcnRlX21vdjY0KCh1aW50OF90ICopZHN0LCAoY29uc3QgdWludDhfdCAqKXNyYyk7DQo+IEBA IC03NDksMjAgKzkxMSwyOCBAQCBydGVfbWVtY3B5X2FsaWduZWQodm9pZCAqZHN0LCBjb25zdCB2 b2lkICpzcmMsDQo+IHNpemVfdCBuKQ0KPiAgfQ0KPiANCj4gIHN0YXRpYyBfX3J0ZV9hbHdheXNf aW5saW5lIHZvaWQgKg0KPiAtcnRlX21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywg c2l6ZV90IG4pDQo+ICtydGVfbWVtY3B5KHZvaWQgKl9fcnRlX3Jlc3RyaWN0IGRzdCwgY29uc3Qg dm9pZCAqX19ydGVfcmVzdHJpY3Qgc3JjLA0KPiBzaXplX3QgbikNCj4gIHsNCj4gKwkvKiBDb21t b24gaW1wbGVtZW50YXRpb24gZm9yIHNpemUgPD0gNjQgYnl0ZXMuICovDQo+ICsJaWYgKG4gPD0g MTYpDQo+ICsJCXJldHVybiBydGVfbW92MTZfb3JfbGVzcyhkc3QsIHNyYywgbik7DQo+ICsJaWYg KG4gPD0gNjQpIHsNCj4gKwkJLyogQ29weSAxNyB+IDY0IGJ5dGVzIHVzaW5nIHZlY3RvciBpbnN0 cnVjdGlvbnMuICovDQo+ICsJCWlmIChuIDw9IDMyKQ0KPiArCQkJcmV0dXJuIHJ0ZV9tb3YxN190 b18zMihkc3QsIHNyYywgbik7DQo+ICsJCWVsc2UNCj4gKwkJCXJldHVybiBydGVfbW92MzNfdG9f NjQoZHN0LCBzcmMsIG4pOw0KPiArCX0NCj4gKw0KPiArCS8qIEltcGxlbWVudGF0aW9uIGZvciBz aXplID4gNjQgYnl0ZXMgZGVwZW5kcyBvbiBhbGlnbm1lbnQgd2l0aA0KPiB2ZWN0b3IgcmVnaXN0 ZXIgc2l6ZS4gKi8NCj4gIAlpZiAoISgoKHVpbnRwdHJfdClkc3QgfCAodWludHB0cl90KXNyYykg JiBBTElHTk1FTlRfTUFTSykpDQo+IC0JCXJldHVybiBydGVfbWVtY3B5X2FsaWduZWQoZHN0LCBz cmMsIG4pOw0KPiArCQlyZXR1cm4gcnRlX21lbWNweV9hbGlnbmVkX21vcmVfdGhhbl82NChkc3Qs IHNyYywgbik7DQo+ICAJZWxzZQ0KPiAtCQlyZXR1cm4gcnRlX21lbWNweV9nZW5lcmljKGRzdCwg c3JjLCBuKTsNCj4gKwkJcmV0dXJuIHJ0ZV9tZW1jcHlfZ2VuZXJpY19tb3JlX3RoYW5fNjQoZHN0 LCBzcmMsIG4pOw0KPiAgfQ0KPiANCj4gICN1bmRlZiBBTElHTk1FTlRfTUFTSw0KPiANCj4gLSNp ZiBkZWZpbmVkKFJURV9UT09MQ0hBSU5fR0NDKSAmJiAoR0NDX1ZFUlNJT04gPj0gMTAwMDAwKQ0K PiAtI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3ANCj4gLSNlbmRpZg0KPiAtDQo+ICAjaWZkZWYg X19jcGx1c3BsdXMNCj4gIH0NCj4gICNlbmRpZg0KPiAtLQ0KPiAyLjQzLjANCg0K