Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1452881imu; Tue, 11 Dec 2018 21:01:50 -0800 (PST) X-Google-Smtp-Source: AFSGD/Xpf2fYM0VM9BfDydkTImZYdP8ZV7jlsthlsiDehbagRrpscmmAqYVJ7o7vbc4iGUJpNusX X-Received: by 2002:a17:902:9a9:: with SMTP id 38mr18280733pln.204.1544590910623; Tue, 11 Dec 2018 21:01:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544590910; cv=none; d=google.com; s=arc-20160816; b=QFVCkHOieh7VCjgelR0mhDw/cedCnT48ap/VDj6NHLngkwYVyJoxrdnKHj4oU5XPAi s7qOYHw9kdQTzjIpCljC5mDcA7iWgzldMx34KIzde6c1/nX8mDVkauIjA+uQLMgTm5+o RHXf7ttShxDrtoIr538Lpvb1AshnQUcBw1iakDKeBkBib+rzW5QRZzNlfCmGoVJVzj7B NsFW/rgUTroBL9HoP2ubV+zOtDBcFtFWV0L9z8fBqkoVMmvO3lEnOpOQuzjR2bNqQvmf 7KtKbsvIovJpFceMEVo9IKcZMTCmw4BS+wPj2b1lBtMjrhYwr0Go/Qq3AGtNYod3R0JB mM3g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :spamdiagnosticmetadata:spamdiagnosticoutput:msip_labels :content-language:accept-language:in-reply-to:references:message-id :date:thread-index:thread-topic:subject:to:from:dkim-signature; bh=/sjw4YjTs2taLH5q8X0JZenXZmAa4BJU0cHDMSMpKVQ=; b=XkdFEv1tKFSbTXUDC8VtbecKLuf993KuNP2WEk+y9YCXtpmN+kMfrWejEQzTroTlRf Uej+IwlitNIwAxyXlhdftRvPHhaeWyjRzKhh0Mf+g8dpiSNgiVONjX5d6WEUycdewvxC T6NR7lM3/yB6fPgDq4pH7BfHqRApzyOBnzu6tBT8zW9pdsFXfWQYdDlxczPtyJIaofUX K4gDFjSNIt+0AGFlSNNDQ838kjaK6zo9TObLpX0QmXsa3pGozq7qJgeADwq+k90J26BW n73jIJ/rUzpSTtTxh+9lVh7LLR6meyu3f5JSNgTrTOwswDTv9h2CQXvCrItzqjTp2TXN n+YQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@microsoft.com header.s=selector1 header.b="l1/GrgHY"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=microsoft.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i39si14242762plb.256.2018.12.11.21.01.34; Tue, 11 Dec 2018 21:01:50 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@microsoft.com header.s=selector1 header.b="l1/GrgHY"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=microsoft.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726263AbeLLFAo (ORCPT + 99 others); Wed, 12 Dec 2018 00:00:44 -0500 Received: from mail-eopbgr790129.outbound.protection.outlook.com ([40.107.79.129]:28416 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726218AbeLLFAn (ORCPT ); Wed, 12 Dec 2018 00:00:43 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=/sjw4YjTs2taLH5q8X0JZenXZmAa4BJU0cHDMSMpKVQ=; b=l1/GrgHYyobl3S9FABX0i85ZH238dFId2e1GiAzaE8T167AL+JOMfLYxduUYYR7L3ccjV4wS0cApoOG+Td7rOWytJEICCxCle5KDZdPd/AzJoJD7vC99MvGqALNjugoZqWVc8c2NYiiInlOHQPYA7hOx8J341wRYYkRe6422rBQ= Received: from CY4PR21MB0773.namprd21.prod.outlook.com (10.173.192.19) by CY4PR21MB0854.namprd21.prod.outlook.com (10.173.192.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1446.1; Wed, 12 Dec 2018 05:00:32 +0000 Received: from CY4PR21MB0773.namprd21.prod.outlook.com ([fe80::f597:e00a:584b:fd8c]) by CY4PR21MB0773.namprd21.prod.outlook.com ([fe80::f597:e00a:584b:fd8c%2]) with mapi id 15.20.1446.006; Wed, 12 Dec 2018 05:00:32 +0000 From: Michael Kelley To: Marc Zyngier , KY Srinivasan , "will.deacon@arm.com" , "catalin.marinas@armm.com" , "mark.rutland@arm.com" , "linux-arm-kernel@lists.infradead.org" , "gregkh@linuxfoundation.org" , "linux-kernel@vger.kernel.org" , "devel@linuxdriverproject.org" , "olaf@aepfle.de" , "apw@canonical.com" , "jasowang@redhat.com" , Stephen Hemminger , vkuznets Subject: RE: [PATCH 2/4] arm64: hyperv: Add support for Hyper-V as a hypervisor Thread-Topic: [PATCH 2/4] arm64: hyperv: Add support for Hyper-V as a hypervisor Thread-Index: AQHUghEnmAHBKrXmHkmtduFUzC9VJqVzciwAgAb8qWA= Date: Wed, 12 Dec 2018 05:00:32 +0000 Message-ID: References: <20181122030914.16274-1-kys@linuxonhyperv.com> <20181122031059.16338-1-kys@linuxonhyperv.com> <20181122031059.16338-2-kys@linuxonhyperv.com> <39e47e32-2738-e39a-4ddb-9d27d2513beb@arm.com> In-Reply-To: <39e47e32-2738-e39a-4ddb-9d27d2513beb@arm.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Enabled=True; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SiteId=72f988bf-86f1-41af-91ab-2d7cd011db47; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Owner=mikelley@ntdev.microsoft.com; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SetDate=2018-12-12T05:00:28.7833500Z; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Name=General; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Application=Microsoft Azure Information Protection; MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Extended_MSFT_Method=Automatic; Sensitivity=General x-originating-ip: [24.22.167.197] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;CY4PR21MB0854;6:u0Y9GrpRPoWf5J77AkO3GDoz496vqzO9Rh7NOEoA060vrAGjxpnac9JO/mwJ3pKeNZkBCnTg2zuKkLh0glKzRv44q/p6o1nL1glS1b0e7qvOlQlJ+fikG6y7+ZTLjWYFJtS52VlR4smRSKFWgFWVPb3UQnKobYa89MmIEcxntd8rZuaZbQ2EX9rGu60ipQvqwC0wEmoA/xzWitwRtRKjG+9aGsnowm9BSxZZbjYpnG9g6Lm7OLEN9Q+Jwh57sGiJUxO5RtM83jInBmNoK9oCidSl/QR99k4D9wMK3hhZJ6wzDVYQxQBTKwu7wuQluU2XSWyOkhO1ahOVXfgLcbaew2E4i3FGzvQG+UUdwAXtwOEvDVfxv5fTjfglZW4Vyg3zUnoORuAqhyceleDXulH1q/AOHDb5ujmtYG8thu0p+ROpmHaL19kOhX7pDt2JiaBKhg2Zi+L/n8eab8NwuUApqA==;5:03TO9FczqKJLCKpXRkVzpKRRCGWRl6ZdcV7DXieGHKdSTL6MzVzcpyaAwSgHJRadvwwz+OCmWaT2TIp/Vgnftw85ulmAv9ceBA5ItK+8i7v2ZqONnajkJ61VKWhukOU0oiuGYLrml38xPfUQ+/ZtOIfq5tBaBP/xsCy6+KV5qqU=;7:AUvalDZrUQQ0y4BT5e2w0UKDHZJLHbHp8IE+Nk/yQ1YzcnZuUlH+Th5unV/wkbcbpPbS4xmr8YGX5JCCMzaPlhLxwkZjgpffjPSns3us6x+5phPuWL6VUYoFWlLxQa6odrMc4QaQHZmJy4lRY16CTA== x-ms-office365-filtering-correlation-id: c809f9d9-a500-4deb-ab79-08d65feebe78 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390098)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7193020);SRVR:CY4PR21MB0854; x-ms-traffictypediagnostic: CY4PR21MB0854: x-ms-exchange-purlcount: -3 authentication-results: spf=none (sender IP is ) smtp.mailfrom=mikelley@microsoft.com; x-ld-processed: 72f988bf-86f1-41af-91ab-2d7cd011db47,ExtAddr x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(8211001083)(3230017)(999002)(6040522)(8220035)(2401047)(8121501046)(5005006)(3231472)(944501520)(2018427008)(10201501046)(3002001)(93006095)(93001095)(6055026)(148016)(149066)(150057)(6041310)(20161123560045)(20161123558120)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(201708071742011)(7699051)(76991095);SRVR:CY4PR21MB0854;BCL:0;PCL:0;RULEID:;SRVR:CY4PR21MB0854; x-forefront-prvs: 0884AAA693 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(396003)(376002)(136003)(39860400002)(346002)(366004)(189003)(51914003)(199004)(81166006)(7736002)(81156014)(8676002)(33656002)(6116002)(53936002)(53946003)(102836004)(55016002)(6246003)(9686003)(74316002)(110136005)(186003)(305945005)(97736004)(26005)(7696005)(11346002)(8936002)(2501003)(6436002)(99286004)(105586002)(93886005)(446003)(229853002)(316002)(5660300001)(256004)(6506007)(71190400001)(76176011)(106356001)(486006)(86362001)(7416002)(476003)(86612001)(10090500001)(478600001)(66066001)(575784001)(14444005)(71200400001)(10290500003)(1511001)(2906002)(14454004)(2201001)(25786009)(3846002)(8990500004)(68736007)(22452003)(4744004)(2004002)(921003)(1121003)(559001)(569006);DIR:OUT;SFP:1102;SCL:1;SRVR:CY4PR21MB0854;H:CY4PR21MB0773.namprd21.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: microsoft.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: Lry51bchD4hHZPaMjdsZRUQIm5BpIyVgMnFWGchXGkohFYrMu/0dafBWtkq88A95nib3XHW6zHW/eQULOLALMw1Akb+NygOrWh+4+rDLoLuvwweW/zA/2d33D2/TFy4iP4JnlV8i6ItNAx3S8OwF4jcA+7I55D93HmcW0UIkVQowBxUE7qTVA8AWZteY6B9dkuM73F+tEGLEqogth5aTQeQrqYGWbDyGtiyRvwCujAtlhjEJXS5/esSvRLdz2X/chbkVox2rUIAyU8d41e6YhzESCbRtEmMLvKZqeuNp7lJ1d393uf4NB5uRUSfEWnwr spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-Network-Message-Id: c809f9d9-a500-4deb-ab79-08d65feebe78 X-MS-Exchange-CrossTenant-originalarrivaltime: 12 Dec 2018 05:00:32.0547 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR21MB0854 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org RnJvbTogTWFyYyBaeW5naWVyIDxtYXJjLnp5bmdpZXJAYXJtLmNvbT4gIFNlbnQ6IEZyaWRheSwg RGVjZW1iZXIgNywgMjAxOCA2OjQzIEFNDQoNCj4gPiBBZGQgQVJNNjQtc3BlY2lmaWMgY29kZSB0 byBlbmFibGUgSHlwZXItVi4gVGhpcyBjb2RlIGluY2x1ZGVzOg0KPiA+ICogRGV0ZWN0aW5nIEh5 cGVyLVYgYW5kIGluaXRpYWxpemluZyB0aGUgZ3Vlc3QvSHlwZXItViBpbnRlcmZhY2UNCj4gPiAq IFNldHRpbmcgdXAgSHlwZXItVidzIHN5bnRoZXRpYyBjbG9ja3MNCj4gPiAqIE1ha2luZyBoeXBl cmNhbGxzIHVzaW5nIHRoZSBIVkMgaW5zdHJ1Y3Rpb24NCj4gPiAqIFNldHRpbmcgdXAgVk1idXMg YW5kIHN0aW1lcjAgaW50ZXJydXB0cw0KPiA+ICogU2V0dGluZyB1cCBrZXhlYyBhbmQgY3Jhc2gg aGFuZGxlcnMNCj4gDQo+IFRoaXMgY29tbWl0IG1lc3NhZ2UgaXMgYSBjbGVhciBpbmRpY2F0aW9u IHRoYXQgdGhpcyBzaG91bGQgYmUgc3BsaXQgaW4NCj4gYXQgbGVhc3QgNSBkaWZmZXJlbnQgcGF0 Y2hlcy4NCg0KT0ssIEknbGwgd29yayBvbiBzZXBhcmF0aW5nIGludG8gbXVsdGlwbGUgbGF5ZXJl ZCBwYXRjaGVzIGluIHRoZSBuZXh0DQp2ZXJzaW9uLg0KDQo+IA0KPiA+IFRoaXMgY29kZSBpcyBh cmNoaXRlY3R1cmUgZGVwZW5kZW50IGNvZGUgYW5kIGlzIG1vc3RseSBkcml2ZW4gYnkNCj4gPiBh cmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgY29kZSBpbiB0aGUgVk1idXMgZHJpdmVyIGluIGRyaXZl cnMvaHYvaHYuYw0KPiA+IGFuZCBkcml2ZXJzL2h2L3ZtYnVzX2Rydi5jLg0KPiA+DQo+ID4gVGhp cyBjb2RlIGlzIGJ1aWx0IG9ubHkgd2hlbiBDT05GSUdfSFlQRVJWIGlzIGVuYWJsZWQuDQo+ID4N Cj4gPiBTaWduZWQtb2ZmLWJ5OiBNaWNoYWVsIEtlbGxleSA8bWlrZWxsZXlAbWljcm9zb2Z0LmNv bT4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBLLiBZLiBTcmluaXZhc2FuIDxreXNAbWljcm9zb2Z0LmNv bT4NCj4gPiAtLS0NCj4gPiAgTUFJTlRBSU5FUlMgICAgICAgICAgICAgICAgICB8ICAgMSArDQo+ ID4gIGFyY2gvYXJtNjQvTWFrZWZpbGUgICAgICAgICAgfCAgIDEgKw0KPiA+ICBhcmNoL2FybTY0 L2h5cGVydi9NYWtlZmlsZSAgIHwgICAyICsNCj4gPiAgYXJjaC9hcm02NC9oeXBlcnYvaHZfaHZj LlMgICB8ICA1NCArKysrKw0KPiA+ICBhcmNoL2FybTY0L2h5cGVydi9odl9pbml0LmMgIHwgNDQx ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrDQo+ID4gIGFyY2gvYXJtNjQvaHlw ZXJ2L21zaHlwZXJ2LmMgfCAxNzggKysrKysrKysrKysrKysNCj4gPiAgNiBmaWxlcyBjaGFuZ2Vk LCA2NzcgaW5zZXJ0aW9ucygrKQ0KPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9o eXBlcnYvTWFrZWZpbGUNCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGFyY2gvYXJtNjQvaHlwZXJ2 L2h2X2h2Yy5TDQo+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL2FybTY0L2h5cGVydi9odl9p bml0LmMNCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGFyY2gvYXJtNjQvaHlwZXJ2L21zaHlwZXJ2 LmMNCj4gPg0KPiA+IGRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTDQo+ID4g aW5kZXggNzJmMTljZWY0YzQ4Li4zMjZlZWIzMmEwY2QgMTAwNjQ0DQo+ID4gLS0tIGEvTUFJTlRB SU5FUlMNCj4gPiArKysgYi9NQUlOVEFJTkVSUw0KPiA+IEBAIC02ODM3LDYgKzY4MzcsNyBAQCBG OglhcmNoL3g4Ni9rZXJuZWwvY3B1L21zaHlwZXJ2LmMNCj4gPiAgRjoJYXJjaC94ODYvaHlwZXJ2 DQo+ID4gIEY6CWFyY2gvYXJtNjQvaW5jbHVkZS9hc20vaHlwZXJ2LXRsZnMuaA0KPiA+ICBGOglh cmNoL2FybTY0L2luY2x1ZGUvYXNtL21zaHlwZXJ2LmgNCj4gPiArRjoJYXJjaC9hcm02NC9oeXBl cnYNCj4gPiAgRjoJZHJpdmVycy9oaWQvaGlkLWh5cGVydi5jDQo+ID4gIEY6CWRyaXZlcnMvaHYv DQo+ID4gIEY6CWRyaXZlcnMvaW5wdXQvc2VyaW8vaHlwZXJ2LWtleWJvYXJkLmMNCj4gPiBkaWZm IC0tZ2l0IGEvYXJjaC9hcm02NC9NYWtlZmlsZSBiL2FyY2gvYXJtNjQvTWFrZWZpbGUNCj4gPiBp bmRleCA2Y2I5ZmM3ZTkzODIuLmFkOWVjMDU3OTU1MyAxMDA2NDQNCj4gPiAtLS0gYS9hcmNoL2Fy bTY0L01ha2VmaWxlDQo+ID4gKysrIGIvYXJjaC9hcm02NC9NYWtlZmlsZQ0KPiA+IEBAIC0xMDYs NiArMTA2LDcgQEAgY29yZS15CQkrPSBhcmNoL2FybTY0L2tlcm5lbC8gYXJjaC9hcm02NC9tbS8N Cj4gPiAgY29yZS0kKENPTkZJR19ORVQpICs9IGFyY2gvYXJtNjQvbmV0Lw0KPiA+ICBjb3JlLSQo Q09ORklHX0tWTSkgKz0gYXJjaC9hcm02NC9rdm0vDQo+ID4gIGNvcmUtJChDT05GSUdfWEVOKSAr PSBhcmNoL2FybTY0L3hlbi8NCj4gPiArY29yZS0kKENPTkZJR19IWVBFUlYpICs9IGFyY2gvYXJt NjQvaHlwZXJ2Lw0KPiA+ICBjb3JlLSQoQ09ORklHX0NSWVBUTykgKz0gYXJjaC9hcm02NC9jcnlw dG8vDQo+ID4gIGxpYnMteQkJOj0gYXJjaC9hcm02NC9saWIvICQobGlicy15KQ0KPiA+ICBjb3Jl LSQoQ09ORklHX0VGSV9TVFVCKSArPSAkKG9ianRyZWUpL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xp YnN0dWIvbGliLmENCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9oeXBlcnYvTWFrZWZpbGUg Yi9hcmNoL2FybTY0L2h5cGVydi9NYWtlZmlsZQ0KPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ ID4gaW5kZXggMDAwMDAwMDAwMDAwLi45ODhlZGE1NTMzMGMNCj4gPiAtLS0gL2Rldi9udWxsDQo+ ID4gKysrIGIvYXJjaC9hcm02NC9oeXBlcnYvTWFrZWZpbGUNCj4gPiBAQCAtMCwwICsxLDIgQEAN Cj4gPiArIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KPiA+ICtvYmoteQkJOj0g aHZfaW5pdC5vIGh2X2h2Yy5vIG1zaHlwZXJ2Lm8NCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02 NC9oeXBlcnYvaHZfaHZjLlMgYi9hcmNoL2FybTY0L2h5cGVydi9odl9odmMuUw0KPiA+IG5ldyBm aWxlIG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi44MjYzNjk2OWI0ZjINCj4g PiAtLS0gL2Rldi9udWxsDQo+ID4gKysrIGIvYXJjaC9hcm02NC9oeXBlcnYvaHZfaHZjLlMNCj4g PiBAQCAtMCwwICsxLDU0IEBADQo+ID4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wICovDQo+ID4gKw0KPiA+ICsvKg0KPiA+ICsgKiBNaWNyb3NvZnQgSHlwZXItViBoeXBlcnZp c29yIGludm9jYXRpb24gcm91dGluZXMNCj4gPiArICoNCj4gPiArICogQ29weXJpZ2h0IChDKSAy MDE4LCBNaWNyb3NvZnQsIEluYy4NCj4gPiArICoNCj4gPiArICogQXV0aG9yIDogTWljaGFlbCBL ZWxsZXkgPG1pa2VsbGV5QG1pY3Jvc29mdC5jb20+DQo+ID4gKyAqDQo+ID4gKyAqIFRoaXMgcHJv Z3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5IGl0DQo+ID4gKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZA0KPiA+ICsgKiBieSB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLg0KPiA+ICsgKg0KPiA+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJp YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0DQo+ID4gKyAqIFdJ VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YN Cj4gPiArICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLCBHT09EIFRJVExFIG9yDQo+ID4gKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlDQo+ID4gKyAqIGRldGFpbHMuDQo+ID4g KyAqLw0KPiA+ICsNCj4gPiArI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4NCj4gPiArDQo+ID4g KwkudGV4dA0KPiA+ICsvKg0KPiA+ICsgKiBEbyB0aGUgSFZDIGluc3RydWN0aW9uLiAgRm9yIEh5 cGVyLVYgdGhlIGFyZ3VtZW50IGlzIGFsd2F5cyAxLg0KPiA+ICsgKiB4MCBjb250YWlucyB0aGUg aHlwZXJjYWxsIGNvbnRyb2wgdmFsdWUsIHdoaWxlIGFkZGl0aW9uYWwgcmVnaXN0ZXJzDQo+ID4g KyAqIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBoeXBlcmNhbGwsIGFuZCB3aGV0aGVyIHRoZSBoeXBl cmNhbGwgYXJndW1lbnRzDQo+ID4gKyAqIGFyZSBpbiBtZW1vcnkgb3IgaW4gcmVnaXN0ZXJzIChh ICJmYXN0IiBoeXBlcmNhbGwgcGVyIHRoZSBIeXBlci1WDQo+ID4gKyAqIFRMRlMpLiAgV2hlbiB0 aGUgYXJndW1lbnRzIGFyZSBpbiBtZW1vcnkgeDEgaXMgdGhlIGd1ZXN0IHBoeXNpY2FsDQo+ID4g KyAqIGFkZHJlc3Mgb2YgdGhlIGlucHV0IGFyZ3VtZW50cywgYW5kIHgyIGlzIHRoZSBndWVzdCBw aHlzaWNhbA0KPiA+ICsgKiBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgYXJndW1lbnRzLiAgV2hlbiB0 aGUgYXJndW1lbnRzIGFyZSBpbg0KPiA+ICsgKiByZWdpc3RlcnMsIHRoZSByZWdpc3RlciB2YWx1 ZXMgZGVwZW5kcyBvbiB0aGUgaHlwZXJjYWxsLiAgTm90ZQ0KPiA+ICsgKiB0aGF0IHRoaXMgdmVy c2lvbiBjYW5ub3QgcmV0dXJuIGFueSB2YWx1ZXMgaW4gcmVnaXN0ZXJzLg0KPiA+ICsgKi8NCj4g PiArRU5UUlkoaHZfZG9faHZjKQ0KPiA+ICsJaHZjICMxDQo+ID4gKwlyZXQNCj4gPiArRU5EUFJP Qyhodl9kb19odmMpDQo+ID4gKw0KPiA+ICsvKg0KPiA+ICsgKiBUaGlzIHZhcmlhbnQgb2YgSFZD IGludm9jYXRpb24gaXMgZm9yIGh2X2dldF92cHJlZyBhbmQNCj4gPiArICogaHZfZ2V0X3ZwcmVn XzEyOC4gVGhlIGlucHV0IHBhcmFtZXRlcnMgYXJlIHBhc3NlZCBpbiByZWdpc3RlcnMNCj4gPiAr ICogYWxvbmcgd2l0aCBhIHBvaW50ZXIgaW4geDQgdG8gd2hlcmUgdGhlIG91dHB1dCByZXN1bHQg c2hvdWxkDQo+ID4gKyAqIGJlIHN0b3JlZC4gVGhlIG91dHB1dCBpcyByZXR1cm5lZCBpbiB4MTUg YW5kIHgxNi4gIHgxOCBpcyB1c2VkIGFzDQo+ID4gKyAqIHNjcmF0Y2ggc3BhY2UgdG8gYXZvaWQg YnVpbGRuZyBhIHN0YWNrIGZyYW1lLCBhcyBIeXBlci1WIGRvZXMNCj4gPiArICogbm90IHByZXNl cnZlIHJlZ2lzdGVycyB4MC14MTcuDQo+ID4gKyAqLw0KPiA+ICtFTlRSWShodl9kb19odmNfZmFz dF9nZXQpDQo+ID4gKwltb3YgeDE4LCB4NA0KPiA+ICsJaHZjICMxDQo+ID4gKwlzdHIgeDE1LFt4 MThdDQo+ID4gKwlzdHIgeDE2LFt4MTgsIzhdDQo+ID4gKwlyZXQNCj4gPiArRU5EUFJPQyhodl9k b19odmNfZmFzdF9nZXQpDQo+IA0KPiBBcyBXaWxsIHNhaWQsIHRoaXMgaXNuJ3QgYSB2aWFibGUg b3B0aW9uLiBQbGVhc2UgZm9sbG93IFNNQ0NDIDEuMS4NCg0KSSdsbCBoYXZlIHRvIHN0YXJ0IGEg Y29udmVyc2F0aW9uIHdpdGggdGhlIEh5cGVyLVYgdGVhbSBhYm91dCB0aGlzLg0KSSBkb24ndCBr bm93IHdoeSB0aGV5IGNob3NlIHRvIHVzZSBIVkMgIzEgb3IgdGhpcyByZWdpc3RlciBzY2hlbWUN CmZvciBvdXRwdXQgdmFsdWVzLiAgSXQgbWF5IGJlIHRvdWdoIHRvIGNoYW5nZSBhdCB0aGlzIHBv aW50IGJlY2F1c2UNCnRoZXJlIGFyZSBXaW5kb3dzIGd1ZXN0cyBvbiBIeXBlci1WIGZvciBBUk02 NCB0aGF0IGFyZSBhbHJlYWR5DQp1c2luZyB0aGlzIGFwcHJvYWNoLg0KDQo+IA0KPiA+IGRpZmYg LS1naXQgYS9hcmNoL2FybTY0L2h5cGVydi9odl9pbml0LmMgYi9hcmNoL2FybTY0L2h5cGVydi9o dl9pbml0LmMNCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAwMDAw MC4uYWExYThjMDlkOTg5DQo+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ICsrKyBiL2FyY2gvYXJtNjQv aHlwZXJ2L2h2X2luaXQuYw0KPiA+IEBAIC0wLDAgKzEsNDQxIEBADQo+ID4gKy8vIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wDQo+ID4gKw0KPiA+ICsvKg0KPiA+ICsgKiBJbml0aWFs aXphdGlvbiBvZiB0aGUgaW50ZXJmYWNlIHdpdGggTWljcm9zb2Z0J3MgSHlwZXItViBoeXBlcnZp c29yLA0KPiA+ICsgKiBhbmQgdmFyaW91cyBsb3cgbGV2ZWwgdXRpbGl0eSByb3V0aW5lcyBmb3Ig aW50ZXJhY3Rpbmcgd2l0aCBIeXBlci1WLg0KPiA+ICsgKg0KPiA+ICsgKiBDb3B5cmlnaHQgKEMp IDIwMTgsIE1pY3Jvc29mdCwgSW5jLg0KPiA+ICsgKg0KPiA+ICsgKiBBdXRob3IgOiBNaWNoYWVs IEtlbGxleSA8bWlrZWxsZXlAbWljcm9zb2Z0LmNvbT4NCj4gPiArICoNCj4gPiArICogVGhpcyBw cm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt b2RpZnkgaXQNCj4gPiArICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkDQo+ID4gKyAqIGJ5IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24uDQo+ID4gKyAqDQo+ID4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0 cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQNCj4gPiArICog V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv Zg0KPiA+ICsgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UsIEdPT0QgVElUTEUgb3INCj4gPiArICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUNCj4gPiArICogZGV0YWlscy4NCj4g PiArICovDQo+ID4gKw0KPiA+ICsNCj4gPiArI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQo+ID4g KyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9leHBvcnQu aD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4 L21tLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPg0KPiA+ICsjaW5jbHVk ZSA8bGludXgvc2NoZWRfY2xvY2suaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4NCj4g PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvaHlwZXJ2 Lmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9j cHVob3RwbHVnLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9wc2NpLmg+DQo+ID4gKyNpbmNsdWRl IDxhc20tZ2VuZXJpYy9idWcuaD4NCj4gPiArI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+DQo+ ID4gKyNpbmNsdWRlIDxhc20vaHlwZXJ2LXRsZnMuaD4NCj4gPiArI2luY2x1ZGUgPGFzbS9tc2h5 cGVydi5oPg0KPiA+ICsjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPg0KPiA+ICsjaW5jbHVkZSA8Y2xv Y2tzb3VyY2UvYXJtX2FyY2hfdGltZXIuaD4NCj4gPiArDQo+ID4gK3N0YXRpYyBib29sCWh5cGVy dl9pbml0aWFsaXplZDsNCj4gPiArc3RydWN0CQltc19oeXBlcnZfaW5mbyBtc19oeXBlcnY7DQo+ ID4gK0VYUE9SVF9TWU1CT0xfR1BMKG1zX2h5cGVydik7DQo+IA0KPiBXaG8gYXJlIHRoZSB1c2Vy cyBvZiB0aGlzIHN0cnVjdHVyZT8gU2hvdWxkIHRoZXkgZ28gdmlhIGFjY2Vzc29ycyBpbnN0ZWFk Pw0KDQpUaGUgc3RydWN0dXJlIGlzIGFuIGFnZ3JlZ2F0aW9uIG9mIHNldmVyYWwgZmxhZ3MgZmll bGRzIHRoYXQgZGVzY3JpYmUgYSBteXJpYWQNCm9mIGZlYXR1cmVzIGFuZCBoaW50cyB0aGF0IG1h eSBvciBtYXkgbm90IGJlIHByZXNlbnQgb24gYW55IHBhcnRpY3VsYXIgdmVyc2lvbg0Kb2YgSHlw ZXItViwgcGx1cyB0aGUgbWF4IHZpcnR1YWwgcHJvY2Vzc29yIElEIHZhbHVlcy4gIEV2ZXJ5dGhp bmcgaXMgcmVhZC1vbmx5DQphZnRlciBpbml0aWFsaXphdGlvbi4gICBNb3N0IG9mIHRoZSByZWZl cmVuY2VzIGFyZSB0byB0ZXN0IG9uZSBvZiB0aGUgZmxhZ3MuICBJdCdzDQphIGp1ZGdtZW50IGNh bGwsIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgZGlmZmVyZW50IGZsYWdzIHdpdGggbG9uZyBuYW1l cywgYW5kDQp3cml0aW5nIGFjY2Vzc29ycyBmb3IgZWFjaCBvbmUgZG9lc24ndCBzZWVtIHRvIG1l IHRvIGFkZCBhbnkgY2xhcml0eS4NCg0KPiANCj4gPiArDQo+ID4gK3N0YXRpYyBzdHJ1Y3QgbXNf aHlwZXJ2X3RzY19wYWdlICp0c2NfcGc7DQo+ID4gKw0KPiA+ICtzdHJ1Y3QgbXNfaHlwZXJ2X3Rz Y19wYWdlICpodl9nZXRfdHNjX3BhZ2Uodm9pZCkNCj4gPiArew0KPiA+ICsJcmV0dXJuIHRzY19w ZzsNCj4gPiArfQ0KPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChodl9nZXRfdHNjX3BhZ2UpOw0KPiA+ ICsNCj4gPiArc3RhdGljIHU2NCByZWFkX2h2X3NjaGVkX2Nsb2NrX3RzYyh2b2lkKQ0KPiA+ICt7 DQo+ID4gKwl1NjQgY3VycmVudF90aWNrID0gaHZfcmVhZF90c2NfcGFnZSh0c2NfcGcpOw0KPiA+ ICsNCj4gPiArCWlmIChjdXJyZW50X3RpY2sgPT0gVTY0X01BWCkNCj4gPiArCQljdXJyZW50X3Rp Y2sgPSBodl9nZXRfdnByZWcoSFZfUkVHSVNURVJfVElNRV9SRUZDT1VOVCk7DQo+ID4gKw0KPiA+ ICsJcmV0dXJuIGN1cnJlbnRfdGljazsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIHU2NCBy ZWFkX2h2X2Nsb2NrX3RzYyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmFyZykNCj4gPiArew0KPiA+ICsJ dTY0IGN1cnJlbnRfdGljayA9IGh2X3JlYWRfdHNjX3BhZ2UodHNjX3BnKTsNCj4gPiArDQo+ID4g KwlpZiAoY3VycmVudF90aWNrID09IFU2NF9NQVgpDQo+ID4gKwkJY3VycmVudF90aWNrID0gaHZf Z2V0X3ZwcmVnKEhWX1JFR0lTVEVSX1RJTUVfUkVGQ09VTlQpOw0KPiA+ICsNCj4gPiArCXJldHVy biBjdXJyZW50X3RpY2s7DQo+ID4gK30NCj4gDQo+IENhbid0IHlvdSBkZWZpbmUgb25lIGZ1bmN0 aW9uIGluIHRlcm1zIG9mIHRoZSBvdGhlcj8NCg0KWWVzLCBpdCBsb29rcyBsaWtlIHRoYXQgd29y a3MuICBJJ2xsIGNoYW5nZSBpdCBpbiB0aGUgbmV4dCB2ZXJzaW9uIG9mIHRoZQ0KcGF0Y2guDQoN Cj4gDQo+ID4gKw0KPiA+ICtzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGh5cGVydl9jc190c2Mg PSB7DQo+ID4gKwkJLm5hbWUJCT0gImh5cGVydl9jbG9ja3NvdXJjZV90c2NfcGFnZSIsDQo+ID4g KwkJLnJhdGluZwkJPSA0MDAsDQo+ID4gKwkJLnJlYWQJCT0gcmVhZF9odl9jbG9ja190c2MsDQo+ ID4gKwkJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCksDQo+ID4gKwkJLmZsYWdzCQk9IENM T0NLX1NPVVJDRV9JU19DT05USU5VT1VTLA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIHU2 NCByZWFkX2h2X3NjaGVkX2Nsb2NrX21zcih2b2lkKQ0KPiA+ICt7DQo+ID4gKwlyZXR1cm4gaHZf Z2V0X3ZwcmVnKEhWX1JFR0lTVEVSX1RJTUVfUkVGQ09VTlQpOw0KPiA+ICt9DQo+ID4gKw0KPiA+ ICtzdGF0aWMgdTY0IHJlYWRfaHZfY2xvY2tfbXNyKHN0cnVjdCBjbG9ja3NvdXJjZSAqYXJnKQ0K PiA+ICt7DQo+ID4gKwlyZXR1cm4gaHZfZ2V0X3ZwcmVnKEhWX1JFR0lTVEVSX1RJTUVfUkVGQ09V TlQpOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGh5cGVy dl9jc19tc3IgPSB7DQo+ID4gKwkubmFtZQkJPSAiaHlwZXJ2X2Nsb2Nrc291cmNlX21zciIsDQo+ ID4gKwkucmF0aW5nCQk9IDQwMCwNCj4gPiArCS5yZWFkCQk9IHJlYWRfaHZfY2xvY2tfbXNyLA0K PiA+ICsJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCksDQo+ID4gKwkuZmxhZ3MJCT0gQ0xP Q0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsDQo+ID4gK307DQo+ID4gKw0KPiA+ICtzdHJ1Y3QgY2xv Y2tzb3VyY2UgKmh5cGVydl9jczsNCj4gPiArRVhQT1JUX1NZTUJPTF9HUEwoaHlwZXJ2X2NzKTsN Cj4gDQo+IFdoeT8gV2hvIG5lZWRzIHRvIHBva2UgdGhpcz8NCg0KSXQncyByZWZlcmVuY2VkIGlu IHRoZSBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgZHJpdmVyIGNvZGUNCmZvciB0aGUgSHlwZXIt ViBjbG9ja3NvdXJjZSBpbiBkcml2ZXJzL2h2L2h2LmMsIGFuZCBpbiB0aGUNCmNvZGUgdG8gc3lu YyB0aGUgdGltZSB3aXRoIHRoZSBIeXBlci1WIGhvc3QgaW4NCmRyaXZlcnMvaHYvaHZfdXRpbC5j Lg0KDQo+IA0KPiA+ICsNCj4gPiArdTMyICpodl92cF9pbmRleDsNCj4gPiArRVhQT1JUX1NZTUJP TF9HUEwoaHZfdnBfaW5kZXgpOw0KPiA+ICsNCj4gPiArdTMyIGh2X21heF92cF9pbmRleDsNCj4g DQo+IFNhbWUgdGhpbmcuDQoNCkFncmVlZCAtLSB0aGlzIG9uZSBkb2Vzbid0IHNlZW0gdG8gYmUg bmVlZGVkLiAgVGhlIHZhcmlhYmxlDQppcyBub3QgdXNlZCBvdXRzaWRlIG9mIHRoZSBhcmNoaXRl Y3R1cmUgZGVwZW5kZW50IEh5cGVyLVYgY29kZS4NCg0KPiANCj4gPiArDQo+ID4gK3N0YXRpYyBp bnQgaHZfY3B1X2luaXQodW5zaWduZWQgaW50IGNwdSkNCj4gPiArew0KPiA+ICsJdTY0IG1zcl92 cF9pbmRleDsNCj4gPiArDQo+ID4gKwlodl9nZXRfdnBfaW5kZXgobXNyX3ZwX2luZGV4KTsNCj4g PiArDQo+ID4gKwlodl92cF9pbmRleFtzbXBfcHJvY2Vzc29yX2lkKCldID0gbXNyX3ZwX2luZGV4 Ow0KPiA+ICsNCj4gPiArCWlmIChtc3JfdnBfaW5kZXggPiBodl9tYXhfdnBfaW5kZXgpDQo+ID4g KwkJaHZfbWF4X3ZwX2luZGV4ID0gbXNyX3ZwX2luZGV4Ow0KPiA+ICsNCj4gPiArCXJldHVybiAw Ow0KPiA+ICt9DQo+IA0KPiBJcyB0aGF0IHNvbWUgbmV3IHdheSB0byBkZXNjcmliZSBhIENQVSB0 b3BvbG9neT8gSWYgc28sIHdoeSBpc24ndCB0aGF0DQo+IGV4cG9zZWQgdmlhIHRoZSBBQ1BJIHRh YmxlcyB0aGF0IHRoZSBrZXJuZWwgYWxyZWFkeSBwYXJzZXM/DQoNCkh5cGVyLVYncyBoeXBlcmNh bGwgaW50ZXJmYWNlIHVzZXMgdkNQVSBpZGVudGlmaWVycyB0aGF0IGFyZSBub3QNCmd1YXJhbnRl ZWQgdG8gYmUgY29uc2VjdXRpdmUgaW50ZWdlcnMgb3IgdG8gbWF0Y2ggd2hhdCBBQ1BJIHNob3dz Lg0KTm8gdG9wb2xvZ3kgaW5mb3JtYXRpb24gaXMgaW1wbGllZCAtLSBpdCdzIGp1c3QgdW5pcXVl IGlkZW50aWZpZXJzLiAgVGhlIA0KaHZfdnBfaW5kZXggYXJyYXkgcHJvdmlkZXMgZWFzeSBtYXBw aW5nIGZyb20gTGludXgncyBjb25zZWN1dGl2ZQ0KaW50ZWdlciBJRHMgZm9yIENQVXMgd2hlbiBu ZWVkZWQgdG8gY29uc3RydWN0IGh5cGVyY2FsbCBhcmd1bWVudHMuDQoNCj4gDQo+ID4gKw0KPiA+ ICsvKg0KPiA+ICsgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgdmlhIHRoZSBBQ1BJIGNsb2Nr c291cmNlIHByb2JlIG1lY2hhbmlzbS4gV2UNCj4gPiArICogZG9uJ3QgYWN0dWFsbHkgdXNlIGFu eSB2YWx1ZXMgZnJvbSB0aGUgQUNQSSBHVERUIHRhYmxlLCBidXQgd2Ugc2V0IHVwDQo+IA0KPiBU aGlzIGRvZXNuJ3QgZmVlbCBsaWtlIGEgZ29vZCBpZGVhIGF0IGFsbC4gUGlnZ3ktYmFja2luZyBv biBhbiBleGlzdGluZw0KPiBtZWNoYW5pc20gYW5kIHVzZSBpdCBmb3Igc29tZXRoaW5nIGNvbXBs ZXRlbHkgZGlmZmVyZW50IGlzIG5vdCBleGFjdGx5DQo+IGZ1dHVyZS1wcm9vZi4NCj4gDQo+IEFs c28sIGlmIHRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgYSBjbG9ja3NvdXJjZSwgd2h5IGlzbid0IHRo YXQgYQ0KPiBjbG9ja3NvdXJjZSBkcml2ZXIgb24gaXRzIG93biByaWdodD8NCg0KSSBhZ3JlZSB0 aGlzIGlzIG5vdCB0aGUgcmlnaHQgbG9uZyB0ZXJtIHNvbHV0aW9uLiAgSXMgdGhlcmUgYSBiZXR0 ZXIgcGxhY2UgdG8NCmhhbmcgdGhlIGluaXRpYWxpemF0aW9uIGNvZGU/ICBPciBzaG91bGQgSSBq dXN0IG1ha2UgYW4gZXhwbGljaXQgY2FsbCB0bw0KaW5pdGlhbGl6ZSBIeXBlci1WIGF0IHRoZSBy aWdodCBwbGFjZT8gIE9uIHRoZSB4ODYgc2lkZSwgdGhlcmUncyBhbg0KZXhwbGljaXQgZnJhbWV3 b3JrIGZvciBoeXBlcnZpc29yLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzIHRvIHBs dWcNCmludG8uICBNYXliZSBpdCdzIHRpbWUgZm9yIGEgYmFzaWMgdmVyc2lvbiBvZiBzdWNoIGEg ZnJhbWV3b3JrIG9uIHRoZQ0KQVJNNjQgc2lkZS4gIFRob3VnaHRzIG9uIHRoZSBiZXN0IGFwcHJv YWNoLCBib3RoIGluIHRoZSBzaG9ydC10ZXJtIGFuZA0KdGhlIGxvbmdlci10ZXJtPyBJZiB3ZSBw dXQgYSBmcmFtZXdvcmsgaW4gcGxhY2UsIGRvZXMgdGhhdCBuZWVkIHRvDQpoYXBwZW4gYmVmb3Jl IGFkZGluZyBIeXBlci1WIGNvZGUsIG9yIGFmdGVyd2FyZHMgYXMgYSBjbGVhbnVwPw0KDQpBbmQg eWVzLCBIeXBlci1WIGRvZXMgZWZmZWN0aXZlbHkgaGF2ZSBpdHMgb3duIGNsb2Nrc291cmNlLiAg VGhlDQptYWluIGNvZGUgaXMgaW4gZHJpdmVycy9odi9odi5jLCBidXQgaXQncyBub3QgYnJva2Vu IG91dCBhcyBhIHNlcGFyYXRlDQpkcml2ZXIgaW4gZHJpdmVycy9jbG9ja3NvdXJjZSwgcHJvYmFi bHkgZHVlIHRvIHNvbWUgaGlzdG9yeSBvbiB0aGUNCng4NiBzaWRlIHRoYXQgcHJlLWRhdGVzIG1l LiAgSSdsbCBoYXZlIHRvIHJlc2VhcmNoLg0KDQo+IA0KPiA+ICsgKiB0aGUgSHlwZXItViBzeW50 aGV0aWMgY2xvY2tzb3VyY2UgYW5kIGRvIG90aGVyIGluaXRpYWxpemF0aW9uIGZvcg0KPiA+ICsg KiBpbnRlcmFjdGluZyB3aXRoIEh5cGVyLVYgdGhlIGZpcnN0IHRpbWUuICBVc2luZyBlYXJseV9p bml0Y2FsbCB0byBpbnZva2UNCj4gPiArICogdGhpcyBmdW5jdGlvbiBpcyB0b28gbGF0ZSBiZWNh dXNlIGludGVycnVwdHMgYXJlIGFscmVhZHkgZW5hYmxlZCBhdCB0aGF0DQo+ID4gKyAqIHBvaW50 LCBhbmQgc2NoZWRfY2xvY2tfcmVnaXN0ZXIgbXVzdCBydW4gYmVmb3JlIGludGVycnVwdHMgYXJl IGVuYWJsZWQuDQo+ID4gKyAqDQo+ID4gKyAqIDEuIFNldHVwIHRoZSBndWVzdCBJRC4NCj4gPiAr ICogMi4gR2V0IGZlYXR1cmVzIGFuZCBoaW50cyBpbmZvIGZyb20gSHlwZXItVg0KPiA+ICsgKiAz LiBTZXR1cCBwZXItY3B1IFZQIGluZGljZXMuDQo+ID4gKyAqIDQuIFJlZ2lzdGVyIEh5cGVyLVYg c3BlY2lmaWMgY2xvY2tzb3VyY2UuDQo+ID4gKyAqIDUuIFJlZ2lzdGVyIHRoZSBzY2hlZHVsZXIg Y2xvY2suDQo+ID4gKyAqLw0KPiA+ICsNCj4gPiArc3RhdGljIGludCBfX2luaXQgaHlwZXJ2X2lu aXQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSkNCj4gPiArew0KPiA+ICsJc3RydWN0 IGh2X2dldF92cF9yZWdpc3Rlcl9vdXRwdXQgcmVzdWx0Ow0KPiA+ICsJdTMyCWEsIGIsIGMsIGQ7 DQo+ID4gKwl1NjQJZ3Vlc3RfaWQ7DQo+ID4gKwlpbnQJaTsNCj4gPiArDQo+ID4gKwkvKg0KPiA+ ICsJICogSWYgd2UncmUgaW4gYSBWTSBvbiBIeXBlci1WLCB0aGUgQUNQSSBoeXBlcnZpc29yX2lk IGZpZWxkIHdpbGwNCj4gPiArCSAqIGhhdmUgdGhlIHN0cmluZyAiTXNIeXBlclYiLg0KPiA+ICsJ ICovDQo+ID4gKwlpZiAoc3RybmNtcCgoY2hhciAqKSZhY3BpX2dibF9GQURULmh5cGVydmlzb3Jf aWQsICJNc0h5cGVyViIsIDgpKQ0KPiA+ICsJCXJldHVybiAxOw0KPiA+ICsNCj4gPiArCS8qIFNl dHVwIHRoZSBndWVzdCBJRCAqLw0KPiA+ICsJZ3Vlc3RfaWQgPSBnZW5lcmF0ZV9ndWVzdF9pZCgw LCBMSU5VWF9WRVJTSU9OX0NPREUsIDApOw0KPiA+ICsJaHZfc2V0X3ZwcmVnKEhWX1JFR0lTVEVS X0dVRVNUX09TSUQsIGd1ZXN0X2lkKTsNCj4gPiArDQo+ID4gKwkvKiBHZXQgdGhlIGZlYXR1cmVz IGFuZCBoaW50cyBmcm9tIEh5cGVyLVYgKi8NCj4gPiArCWh2X2dldF92cHJlZ18xMjgoSFZfUkVH SVNURVJfUFJJVklMRUdFU19BTkRfRkVBVFVSRVMsICZyZXN1bHQpOw0KPiA+ICsJbXNfaHlwZXJ2 LmZlYXR1cmVzID0gbG93ZXJfMzJfYml0cyhyZXN1bHQucmVnaXN0ZXJ2YWx1ZWxvdyk7DQo+ID4g Kwltc19oeXBlcnYubWlzY19mZWF0dXJlcyA9IHVwcGVyXzMyX2JpdHMocmVzdWx0LnJlZ2lzdGVy dmFsdWVoaWdoKTsNCj4gPiArDQo+ID4gKwlodl9nZXRfdnByZWdfMTI4KEhWX1JFR0lTVEVSX0ZF QVRVUkVTLCAmcmVzdWx0KTsNCj4gPiArCW1zX2h5cGVydi5oaW50cyA9IGxvd2VyXzMyX2JpdHMo cmVzdWx0LnJlZ2lzdGVydmFsdWVsb3cpOw0KPiA+ICsNCj4gPiArCXByX2luZm8oIkh5cGVyLVY6 IEZlYXR1cmVzIDB4JXgsIGhpbnRzIDB4JXhcbiIsDQo+ID4gKwkJbXNfaHlwZXJ2LmZlYXR1cmVz LCBtc19oeXBlcnYuaGludHMpOw0KPiA+ICsNCj4gPiArCS8qDQo+ID4gKwkgKiBEaXJlY3QgbW9k ZSBpcyB0aGUgb25seSBvcHRpb24gZm9yIFNUSU1FUnMgcHJvdmlkZWQgSHlwZXItVg0KPiA+ICsJ ICogb24gQVJNNjQsIHNvIEh5cGVyLVYgZG9lc24ndCBhY3R1YWxseSBzZXQgdGhlIGZsYWcuICBC dXQgYWRkIHRoZQ0KPiA+ICsJICogZmxhZyBzbyB0aGUgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50 IGNvZGUgaW4gZHJpdmVycy9odi9odi5jDQo+ID4gKwkgKiB3aWxsIGNvcnJlY3RseSB1c2UgdGhh dCBtb2RlLg0KPiA+ICsJICovDQo+ID4gKwltc19oeXBlcnYubWlzY19mZWF0dXJlcyB8PSBIVl9T VElNRVJfRElSRUNUX01PREVfQVZBSUxBQkxFOw0KPiA+ICsNCj4gPiArCS8qDQo+ID4gKwkgKiBI eXBlci1WIG9uIEFSTTY0IGRvZXNuJ3Qgc3VwcG9ydCBBdXRvRU9JLiAgQWRkIHRoZSBoaW50DQo+ ID4gKwkgKiB0aGF0IHRlbGxzIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCBjb2RlIG5vdCB0byB1 c2UgdGhpcw0KPiA+ICsJICogZmVhdHVyZS4NCj4gPiArCSAqLw0KPiA+ICsJbXNfaHlwZXJ2Lmhp bnRzIHw9IEhWX0RFUFJFQ0FUSU5HX0FFT0lfUkVDT01NRU5ERUQ7DQo+ID4gKw0KPiA+ICsJLyog R2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBIeXBlci1WIGhvc3QgdmVyc2lvbiAqLw0KPiA+ICsJ aHZfZ2V0X3ZwcmVnXzEyOChIVl9SRUdJU1RFUl9IWVBFUlZJU09SX1ZFUlNJT04sICZyZXN1bHQp Ow0KPiA+ICsJYSA9IGxvd2VyXzMyX2JpdHMocmVzdWx0LnJlZ2lzdGVydmFsdWVsb3cpOw0KPiA+ ICsJYiA9IHVwcGVyXzMyX2JpdHMocmVzdWx0LnJlZ2lzdGVydmFsdWVsb3cpOw0KPiA+ICsJYyA9 IGxvd2VyXzMyX2JpdHMocmVzdWx0LnJlZ2lzdGVydmFsdWVoaWdoKTsNCj4gPiArCWQgPSB1cHBl cl8zMl9iaXRzKHJlc3VsdC5yZWdpc3RlcnZhbHVlaGlnaCk7DQo+ID4gKwlwcl9pbmZvKCJIeXBl ci1WOiBIb3N0IEJ1aWxkICVkLiVkLiVkLiVkLSVkLSVkXG4iLA0KPiA+ICsJCWIgPj4gMTYsIGIg JiAweEZGRkYsIGEsIGQgJiAweEZGRkZGRiwgYywgZCA+PiAyNCk7DQo+ID4gKw0KPiA+ICsJLyog QWxsb2NhdGUgcGVyY3B1IFZQIGluZGV4ICovDQo+ID4gKwlodl92cF9pbmRleCA9IGttYWxsb2Nf YXJyYXkobnVtX3Bvc3NpYmxlX2NwdXMoKSwgc2l6ZW9mKCpodl92cF9pbmRleCksDQo+ID4gKwkJ CQkgICAgR0ZQX0tFUk5FTCk7DQo+IA0KPiBXaHkgaXNuJ3QgdGhpcyBhIHBlcmNwdSB2YXJpYWJs ZT8NCg0KSW4gY3VycmVudCBjb2RlIGluIHRoZSBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgSHlw ZXItViBkcml2ZXJzIChhcyB3ZWxsDQphcyBzb21lIGZ1dHVyZSBIeXBlci1WIGVubGlnaHRlbm1l bnRzIHRoYXQgYXJlbid0IHlldCBpbXBsZW1lbnRlZA0KZm9yIEFSTTY0KSwgdGhlIHJ1bm5pbmcg Q1BVIG5lZWRzIHRvIGdldCB0aGUgVlAgaW5kZXggdmFsdWVzIGZvciBhbnkgQ1BVcw0KaW4gdGhl IGh2X3ZwX2luZGV4IGFycmF5LiAgU29tZSBvZiB0aGUgY29kZSBpcyBwZXJmb3JtYW5jZSBzZW5z aXRpdmUsIGFuZA0KYWNjZXNzaW5nIGEgZ2xvYmFsIGFycmF5IGlzIGZhc3RlciB0aGFuIGFjY2Vz c2luZyBvdGhlciBDUFVzJyBwZXItY3B1IGRhdGEuDQoNCj4gDQo+ID4gKwlpZiAoIWh2X3ZwX2lu ZGV4KQ0KPiA+ICsJCXJldHVybiAxOw0KPiA+ICsNCj4gPiArCWZvciAoaSA9IDA7IGkgPCBudW1f cG9zc2libGVfY3B1cygpOyBpKyspDQo+ID4gKwkJaHZfdnBfaW5kZXhbaV0gPSBWUF9JTlZBTDsN Cj4gPiArDQo+ID4gKwlpZiAoY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfT05MSU5FX0RZTiwg ImFybTY0L2h5cGVydl9pbml0Om9ubGluZSIsDQo+ID4gKwkJCSAgICAgIGh2X2NwdV9pbml0LCBO VUxMKSA8IDApDQo+ID4gKwkJZ290byBmcmVlX3ZwX2luZGV4Ow0KPiA+ICsNCj4gPiArCS8qDQo+ ID4gKwkgKiBUcnkgdG8gc2V0IHVwIHdoYXQgSHlwZXItViBjYWxscyB0aGUgIlRTQyByZWZlcmVu Y2UgcGFnZSIsIHdoaWNoDQo+ID4gKwkgKiB1c2VzIHRoZSBBUk0gR2VuZXJpYyBUaW1lciB2aXJ0 dWFsIGNvdW50ZXIgd2l0aCBzb21lIHNjYWxpbmcNCj4gPiArCSAqIGluZm9ybWF0aW9uIHRvIHBy b3ZpZGUgYSBmYXN0IGFuZCBzdGFibGUgZ3Vlc3QgVk0gY2xvY2tzb3VyY2UuDQo+ID4gKwkgKiBJ ZiB0aGUgVFNDIHJlZmVyZW5jZSBwYWdlIGNhbid0IGJlIHNldCB1cCwgZmFsbCBiYWNrIHRvIHJl YWRpbmcNCj4gPiArCSAqIHRoZSBndWVzdCBjbG9jayBwcm92aWRlZCBieSBIeXBlci1WJ3Mgc3lu dGhldGljIHJlZmVyZW5jZSB0aW1lDQo+ID4gKwkgKiByZWdpc3Rlci4NCj4gPiArCSAqLw0KPiA+ ICsJaWYgKG1zX2h5cGVydi5mZWF0dXJlcyAmIEhWX01TUl9SRUZFUkVOQ0VfVFNDX0FWQUlMQUJM RSkgew0KPiA+ICsNCj4gPiArCQl1NjQJCXRzY19tc3I7DQo+ID4gKwkJcGh5c19hZGRyX3QJcGh5 c19hZGRyOw0KPiA+ICsNCj4gPiArCQl0c2NfcGcgPSBfX3ZtYWxsb2MoSFZfSFlQX1BBR0VfU0la RSwgR0ZQX0tFUk5FTCwgUEFHRV9LRVJORUwpOw0KPiANCj4gQW5kIHdoeSBub3Qgdm1hbGxvYz8N Cg0KTG9va3MgbGlrZSBpdCBjb3VsZCBiZSBqdXN0IHZtYWxsb2MoKS4gIEknbGwgY2hhbmdlIGl0 IGluIHRoZSBuZXh0IHZlcnNpb24uDQoNCj4gDQo+ID4gKwkJaWYgKHRzY19wZykgew0KPiA+ICsJ CQlwaHlzX2FkZHIgPSBwYWdlX3RvX3BoeXModm1hbGxvY190b19wYWdlKHRzY19wZykpOw0KPiA+ ICsJCQl0c2NfbXNyID0gaHZfZ2V0X3ZwcmVnKEhWX1JFR0lTVEVSX1JFRkVSRU5DRV9UU0MpOw0K PiA+ICsJCQl0c2NfbXNyICY9IEdFTk1BU0tfVUxMKDExLCAwKTsNCj4gDQo+IE1hZ2ljLg0KDQpQ ZXIgU2VjdGlvbiAxMi42LjEgb2YgdGhlIEh5cGVyLVYgVExGUywgYml0cyAxMSB0aHJ1IDEgbXVz dCBiZSBwcmVzZXJ2ZWQsIGFuZA0KdGhlIGxpbmUgYmVsb3cgc2V0cyBiaXQgMC4gIEknbGwgYWRk IHNvbWUgY29tbWVudHMuIDotKQ0KDQo+IA0KPiA+ICsJCQl0c2NfbXNyID0gdHNjX21zciB8IDB4 MSB8ICh1NjQpcGh5c19hZGRyOw0KPiA+ICsJCQlodl9zZXRfdnByZWcoSFZfUkVHSVNURVJfUkVG RVJFTkNFX1RTQywgdHNjX21zcik7DQo+ID4gKwkJCWh5cGVydl9jcyA9ICZoeXBlcnZfY3NfdHNj Ow0KPiA+ICsJCQlzY2hlZF9jbG9ja19yZWdpc3RlcihyZWFkX2h2X3NjaGVkX2Nsb2NrX3RzYywN Cj4gPiArCQkJCQkJNjQsIEhWX0NMT0NLX0haKTsNCj4gPiArCQl9DQo+ID4gKwl9DQo+ID4gKw0K PiA+ICsJaWYgKCFoeXBlcnZfY3MgJiYNCj4gPiArCSAgICAobXNfaHlwZXJ2LmZlYXR1cmVzICYg SFZfTVNSX1RJTUVfUkVGX0NPVU5UX0FWQUlMQUJMRSkpIHsNCj4gPiArCQloeXBlcnZfY3MgPSAm aHlwZXJ2X2NzX21zcjsNCj4gPiArCQlzY2hlZF9jbG9ja19yZWdpc3RlcihyZWFkX2h2X3NjaGVk X2Nsb2NrX21zciwNCj4gPiArCQkJCQkJNjQsIEhWX0NMT0NLX0haKTsNCj4gPiArCX0NCj4gPiAr DQo+ID4gKwlpZiAoaHlwZXJ2X2NzKSB7DQo+ID4gKwkJaHlwZXJ2X2NzLT5hcmNoZGF0YS52ZHNv X2RpcmVjdCA9IGZhbHNlOw0KPiA+ICsJCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KGh5cGVydl9j cywgSFZfQ0xPQ0tfSFopOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCWh5cGVydl9pbml0aWFsaXpl ZCA9IHRydWU7DQo+ID4gKwlyZXR1cm4gMDsNCj4gPiArDQo+ID4gK2ZyZWVfdnBfaW5kZXg6DQo+ ID4gKwlrZnJlZShodl92cF9pbmRleCk7DQo+ID4gKwlodl92cF9pbmRleCA9IE5VTEw7DQo+ID4g KwlyZXR1cm4gMTsNCj4gDQo+ID8/Pz8NCg0KVGhlIHJldHVybiB2YWx1ZSBpcyB0aGVyZSBiZWNh dXNlIHRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSB0aW1lcg0KaW5pdGlhbGl6YXRp b24gZnVuY3Rpb24sIGFuZCB0aGF0J3Mgd2hhdCB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIHJlcXVp cmVzLg0KQnV0IG1heWJlIEknbSBub3QgdW5kZXJzdGFuZGluZyB5b3VyIHF1ZXN0aW9uLg0KDQo+ IA0KPiA+ICt9DQo+ID4gK1RJTUVSX0FDUElfREVDTEFSRShoeXBlcnYsIEFDUElfU0lHX0dURFQs IGh5cGVydl9pbml0KTsNCj4gPiArDQo+ID4gKy8qDQo+ID4gKyAqIFRoaXMgcm91dGluZSBpcyBj YWxsZWQgYmVmb3JlIGtleGVjL2tkdW1wLCBpdCBkb2VzIHRoZSByZXF1aXJlZCBjbGVhbnVwLg0K PiA+ICsgKi8NCj4gPiArdm9pZCBoeXBlcnZfY2xlYW51cCh2b2lkKQ0KPiA+ICt7DQo+ID4gKwkv KiBSZXNldCBvdXIgT1MgaWQgKi8NCj4gPiArCWh2X3NldF92cHJlZyhIVl9SRUdJU1RFUl9HVUVT VF9PU0lELCAwKTsNCj4gPiArDQo+ID4gK30NCj4gPiArRVhQT1JUX1NZTUJPTF9HUEwoaHlwZXJ2 X2NsZWFudXApOw0KPiA+ICsNCj4gPiArLyoNCj4gPiArICogaHZfZG9faHlwZXJjYWxsLSBJbnZv a2UgdGhlIHNwZWNpZmllZCBoeXBlcmNhbGwNCj4gPiArICovDQo+ID4gK3U2NCBodl9kb19oeXBl cmNhbGwodTY0IGNvbnRyb2wsIHZvaWQgKmlucHV0LCB2b2lkICpvdXRwdXQpDQo+ID4gK3sNCj4g PiArCXU2NCBpbnB1dF9hZGRyZXNzOw0KPiA+ICsJdTY0IG91dHB1dF9hZGRyZXNzOw0KPiA+ICsN Cj4gPiArCWlucHV0X2FkZHJlc3MgPSBpbnB1dCA/IHZpcnRfdG9fcGh5cyhpbnB1dCkgOiAwOw0K PiA+ICsJb3V0cHV0X2FkZHJlc3MgPSBvdXRwdXQgPyB2aXJ0X3RvX3BoeXMob3V0cHV0KSA6IDA7 DQo+ID4gKwlyZXR1cm4gaHZfZG9faHZjKGNvbnRyb2wsIGlucHV0X2FkZHJlc3MsIG91dHB1dF9h ZGRyZXNzKTsNCj4gPiArfQ0KPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChodl9kb19oeXBlcmNhbGwp Ow0KPiA+ICsNCj4gPiArLyoNCj4gPiArICogaHZfZG9fZmFzdF9oeXBlcmNhbGw4IC0tIEludm9r ZSB0aGUgc3BlY2lmaWVkIGh5cGVyY2FsbA0KPiA+ICsgKiB3aXRoIGFyZ3VtZW50cyBpbiByZWdp c3RlcnMgaW5zdGVhZCBvZiBwaHlzaWNhbCBtZW1vcnkuDQo+ID4gKyAqIEF2b2lkcyB0aGUgb3Zl cmhlYWQgb2YgdmlydF90b19waHlzIGZvciBzaW1wbGUgaHlwZXJjYWxscy4NCj4gPiArICovDQo+ ID4gKw0KPiA+ICt1NjQgaHZfZG9fZmFzdF9oeXBlcmNhbGw4KHUxNiBjb2RlLCB1NjQgaW5wdXQp DQo+ID4gK3sNCj4gPiArCXU2NCBjb250cm9sOw0KPiA+ICsNCj4gPiArCWNvbnRyb2wgPSAodTY0 KWNvZGUgfCBIVl9IWVBFUkNBTExfRkFTVF9CSVQ7DQo+ID4gKwlyZXR1cm4gaHZfZG9faHZjKGNv bnRyb2wsIGlucHV0KTsNCj4gPiArfQ0KPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChodl9kb19mYXN0 X2h5cGVyY2FsbDgpOw0KPiA+ICsNCj4gPiArDQo+ID4gKy8qDQo+ID4gKyAqIFNldCBhIHNpbmds ZSBWUCByZWdpc3RlciB0byBhIDY0LWJpdCB2YWx1ZS4NCj4gPiArICovDQo+ID4gK3ZvaWQgaHZf c2V0X3ZwcmVnKHUzMiBtc3IsIHU2NCB2YWx1ZSkNCj4gPiArew0KPiA+ICsJdW5pb24gaHZfaHlw ZXJjYWxsX3N0YXR1cyBzdGF0dXM7DQo+ID4gKw0KPiA+ICsJc3RhdHVzLmFzX3VpbnQ2NCA9IGh2 X2RvX2h2YygNCj4gPiArCQlIVkNBTExfU0VUX1ZQX1JFR0lTVEVSUyB8IEhWX0hZUEVSQ0FMTF9G QVNUX0JJVCB8DQo+ID4gKwkJCUhWX0hZUEVSQ0FMTF9SRVBfQ09VTlRfMSwNCj4gPiArCQlIVl9Q QVJUSVRJT05fSURfU0VMRiwNCj4gPiArCQlIVl9WUF9JTkRFWF9TRUxGLA0KPiA+ICsJCW1zciwN Cj4gPiArCQkwLA0KPiA+ICsJCXZhbHVlLA0KPiA+ICsJCTApOw0KPiA+ICsNCj4gPiArCS8qDQo+ ID4gKwkgKiBTb21ldGhpbmcgaXMgZnVuZGFtZW50YWxseSBicm9rZW4gaW4gdGhlIGh5cGVydmlz b3IgaWYNCj4gPiArCSAqIHNldHRpbmcgYSBWUCByZWdpc3RlciBmYWlscy4gVGhlcmUncyByZWFs bHkgbm8gd2F5IHRvDQo+ID4gKwkgKiBjb250aW51ZSBhcyBhIGd1ZXN0IFZNLCBzbyBwYW5pYy4N Cj4gPiArCSAqLw0KPiA+ICsJQlVHX09OKHN0YXR1cy5zdGF0dXMgIT0gSFZfU1RBVFVTX1NVQ0NF U1MpOw0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0xfR1BMKGh2X3NldF92cHJlZyk7DQo+ID4g Kw0KPiA+ICsNCj4gPiArLyoNCj4gPiArICogR2V0IHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBWUCBy ZWdpc3RlciwgYW5kIG9ubHkgdGhlIGxvdyBvcmRlciA2NCBiaXRzLg0KPiA+ICsgKi8NCj4gPiAr dTY0IGh2X2dldF92cHJlZyh1MzIgbXNyKQ0KPiA+ICt7DQo+ID4gKwl1bmlvbiBodl9oeXBlcmNh bGxfc3RhdHVzIHN0YXR1czsNCj4gPiArCXN0cnVjdCBodl9nZXRfdnBfcmVnaXN0ZXJfb3V0cHV0 IG91dHB1dDsNCj4gPiArDQo+ID4gKwlzdGF0dXMuYXNfdWludDY0ID0gaHZfZG9faHZjX2Zhc3Rf Z2V0KA0KPiA+ICsJCUhWQ0FMTF9HRVRfVlBfUkVHSVNURVJTIHwgSFZfSFlQRVJDQUxMX0ZBU1Rf QklUIHwNCj4gPiArCQkJSFZfSFlQRVJDQUxMX1JFUF9DT1VOVF8xLA0KPiA+ICsJCUhWX1BBUlRJ VElPTl9JRF9TRUxGLA0KPiA+ICsJCUhWX1ZQX0lOREVYX1NFTEYsDQo+ID4gKwkJbXNyLA0KPiA+ ICsJCSZvdXRwdXQpOw0KPiA+ICsNCj4gPiArCS8qDQo+ID4gKwkgKiBTb21ldGhpbmcgaXMgZnVu ZGFtZW50YWxseSBicm9rZW4gaW4gdGhlIGh5cGVydmlzb3IgaWYNCj4gPiArCSAqIGdldHRpbmcg YSBWUCByZWdpc3RlciBmYWlscy4gVGhlcmUncyByZWFsbHkgbm8gd2F5IHRvDQo+ID4gKwkgKiBj b250aW51ZSBhcyBhIGd1ZXN0IFZNLCBzbyBwYW5pYy4NCj4gPiArCSAqLw0KPiA+ICsJQlVHX09O KHN0YXR1cy5zdGF0dXMgIT0gSFZfU1RBVFVTX1NVQ0NFU1MpOw0KPiA+ICsNCj4gPiArCXJldHVy biBvdXRwdXQucmVnaXN0ZXJ2YWx1ZWxvdzsNCj4gPiArfQ0KPiA+ICtFWFBPUlRfU1lNQk9MX0dQ TChodl9nZXRfdnByZWcpOw0KPiA+ICsNCj4gPiArLyoNCj4gPiArICogR2V0IHRoZSB2YWx1ZSBv ZiBhIHNpbmdsZSBWUCByZWdpc3RlciB0aGF0IGlzIDEyOCBiaXRzIGluIHNpemUuICBUaGlzIGlz IGENCj4gPiArICogc2VwYXJhdGUgY2FsbCBpbiBvcmRlciB0byBhdm9pZCBjb21wbGljYXRpbmcg dGhlIGNhbGxpbmcgc2VxdWVuY2UgZm9yDQo+ID4gKyAqIHRoZSBtdWNoIG1vcmUgZnJlcXVlbnRs eSB1c2VkIDY0LWJpdCB2ZXJzaW9uLg0KPiA+ICsgKi8NCj4gPiArdm9pZCBodl9nZXRfdnByZWdf MTI4KHUzMiBtc3IsIHN0cnVjdCBodl9nZXRfdnBfcmVnaXN0ZXJfb3V0cHV0ICpyZXN1bHQpDQo+ ID4gK3sNCj4gPiArCXVuaW9uIGh2X2h5cGVyY2FsbF9zdGF0dXMgc3RhdHVzOw0KPiA+ICsNCj4g PiArCXN0YXR1cy5hc191aW50NjQgPSBodl9kb19odmNfZmFzdF9nZXQoDQo+ID4gKwkJSFZDQUxM X0dFVF9WUF9SRUdJU1RFUlMgfCBIVl9IWVBFUkNBTExfRkFTVF9CSVQgfA0KPiA+ICsJCQlIVl9I WVBFUkNBTExfUkVQX0NPVU5UXzEsDQo+ID4gKwkJSFZfUEFSVElUSU9OX0lEX1NFTEYsDQo+ID4g KwkJSFZfVlBfSU5ERVhfU0VMRiwNCj4gPiArCQltc3IsDQo+ID4gKwkJcmVzdWx0KTsNCj4gPiAr DQo+ID4gKwkvKg0KPiA+ICsJICogU29tZXRoaW5nIGlzIGZ1bmRhbWVudGFsbHkgYnJva2VuIGlu IHRoZSBoeXBlcnZpc29yIGlmDQo+ID4gKwkgKiBnZXR0aW5nIGEgVlAgcmVnaXN0ZXIgZmFpbHMu IFRoZXJlJ3MgcmVhbGx5IG5vIHdheSB0bw0KPiA+ICsJICogY29udGludWUgYXMgYSBndWVzdCBW TSwgc28gcGFuaWMuDQo+ID4gKwkgKi8NCj4gPiArCUJVR19PTihzdGF0dXMuc3RhdHVzICE9IEhW X1NUQVRVU19TVUNDRVNTKTsNCj4gPiArDQo+ID4gKwlyZXR1cm47DQo+ID4gKw0KPiA+ICt9DQo+ ID4gK0VYUE9SVF9TWU1CT0xfR1BMKGh2X2dldF92cHJlZ18xMjgpOw0KPiA+ICsNCj4gPiArdm9p ZCBoeXBlcnZfcmVwb3J0X3BhbmljKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikNCj4g PiArew0KPiA+ICsJc3RhdGljIGJvb2wgcGFuaWNfcmVwb3J0ZWQ7DQo+ID4gKwl1NjQgZ3Vlc3Rf aWQ7DQo+ID4gKw0KPiA+ICsJLyoNCj4gPiArCSAqIFdlIHByZWZlciB0byByZXBvcnQgcGFuaWMg b24gJ2RpZScgY2hhaW4gYXMgd2UgaGF2ZSBwcm9wZXINCj4gPiArCSAqIHJlZ2lzdGVycyB0byBy ZXBvcnQsIGJ1dCBpZiB3ZSBtaXNzIGl0IChlLmcuIG9uIEJVRygpKSB3ZSBuZWVkDQo+ID4gKwkg KiB0byByZXBvcnQgaXQgb24gJ3BhbmljJy4NCj4gPiArCSAqLw0KPiA+ICsJaWYgKHBhbmljX3Jl cG9ydGVkKQ0KPiA+ICsJCXJldHVybjsNCj4gPiArCXBhbmljX3JlcG9ydGVkID0gdHJ1ZTsNCj4g PiArDQo+ID4gKwlndWVzdF9pZCA9IGh2X2dldF92cHJlZyhIVl9SRUdJU1RFUl9HVUVTVF9PU0lE KTsNCj4gPiArDQo+ID4gKwkvKg0KPiA+ICsJICogSHlwZXItViBwcm92aWRlcyB0aGUgYWJpbGl0 eSB0byBzdG9yZSBvbmx5IDUgdmFsdWVzLg0KPiA+ICsJICogUGljayB0aGUgcGFzc2VkIGluIGVy cm9yIHZhbHVlLCB0aGUgZ3Vlc3RfaWQsIGFuZCB0aGUgUEMuDQo+ID4gKwkgKiBUaGUgZmlyc3Qg dHdvIGdlbmVyYWwgcmVnaXN0ZXJzIGFyZSBhZGRlZCBhcmJpdHJhcmlseS4NCj4gPiArCSAqLw0K PiA+ICsJaHZfc2V0X3ZwcmVnKEhWX1JFR0lTVEVSX0NSQVNIX1AwLCBlcnIpOw0KPiA+ICsJaHZf c2V0X3ZwcmVnKEhWX1JFR0lTVEVSX0NSQVNIX1AxLCBndWVzdF9pZCk7DQo+ID4gKwlodl9zZXRf dnByZWcoSFZfUkVHSVNURVJfQ1JBU0hfUDIsIHJlZ3MtPnBjKTsNCj4gPiArCWh2X3NldF92cHJl ZyhIVl9SRUdJU1RFUl9DUkFTSF9QMywgcmVncy0+cmVnc1swXSk7DQo+ID4gKwlodl9zZXRfdnBy ZWcoSFZfUkVHSVNURVJfQ1JBU0hfUDQsIHJlZ3MtPnJlZ3NbMV0pOw0KPiA+ICsNCj4gPiArCS8q DQo+ID4gKwkgKiBMZXQgSHlwZXItViBrbm93IHRoZXJlIGlzIGNyYXNoIGRhdGEgYXZhaWxhYmxl DQo+ID4gKwkgKi8NCj4gPiArCWh2X3NldF92cHJlZyhIVl9SRUdJU1RFUl9DUkFTSF9DVEwsIEhW X0NSQVNIX0NUTF9DUkFTSF9OT1RJRlkpOw0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0xfR1BM KGh5cGVydl9yZXBvcnRfcGFuaWMpOw0KPiA+ICsNCj4gPiArLyoNCj4gPiArICogaHlwZXJ2X3Jl cG9ydF9wYW5pY19tc2cgLSByZXBvcnQgcGFuaWMgbWVzc2FnZSB0byBIeXBlci1WDQo+ID4gKyAq IEBwYTogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcGFuaWMgcGFnZSBjb250YWluaW5nIHRoZSBt ZXNzYWdlDQo+ID4gKyAqIEBzaXplOiBzaXplIG9mIHRoZSBtZXNzYWdlIGluIHRoZSBwYWdlDQo+ ID4gKyAqLw0KPiA+ICt2b2lkIGh5cGVydl9yZXBvcnRfcGFuaWNfbXNnKHBoeXNfYWRkcl90IHBh LCBzaXplX3Qgc2l6ZSkNCj4gPiArew0KPiA+ICsJLyoNCj4gPiArCSAqIFAzIHRvIGNvbnRhaW4g dGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHBhbmljIHBhZ2UgJiBQNCB0bw0KPiA+ICsJICog Y29udGFpbiB0aGUgc2l6ZSBvZiB0aGUgcGFuaWMgZGF0YSBpbiB0aGF0IHBhZ2UuIFJlc3Qgb2Yg dGhlDQo+ID4gKwkgKiByZWdpc3RlcnMgYXJlIG5vLW9wIHdoZW4gdGhlIE5PVElGWV9NU0cgZmxh ZyBpcyBzZXQuDQo+ID4gKwkgKi8NCj4gPiArCWh2X3NldF92cHJlZyhIVl9SRUdJU1RFUl9DUkFT SF9QMCwgMCk7DQo+ID4gKwlodl9zZXRfdnByZWcoSFZfUkVHSVNURVJfQ1JBU0hfUDEsIDApOw0K PiA+ICsJaHZfc2V0X3ZwcmVnKEhWX1JFR0lTVEVSX0NSQVNIX1AyLCAwKTsNCj4gPiArCWh2X3Nl dF92cHJlZyhIVl9SRUdJU1RFUl9DUkFTSF9QMywgcGEpOw0KPiA+ICsJaHZfc2V0X3ZwcmVnKEhW X1JFR0lTVEVSX0NSQVNIX1A0LCBzaXplKTsNCj4gPiArDQo+ID4gKwkvKg0KPiA+ICsJICogTGV0 IEh5cGVyLVYga25vdyB0aGVyZSBpcyBjcmFzaCBkYXRhIGF2YWlsYWJsZSBhbG9uZyB3aXRoDQo+ ID4gKwkgKiB0aGUgcGFuaWMgbWVzc2FnZS4NCj4gPiArCSAqLw0KPiA+ICsJaHZfc2V0X3ZwcmVn KEhWX1JFR0lTVEVSX0NSQVNIX0NUTCwNCj4gPiArCSAgICAgICAoSFZfQ1JBU0hfQ1RMX0NSQVNI X05PVElGWSB8IEhWX0NSQVNIX0NUTF9DUkFTSF9OT1RJRllfTVNHKSk7DQo+ID4gK30NCj4gPiAr RVhQT1JUX1NZTUJPTF9HUEwoaHlwZXJ2X3JlcG9ydF9wYW5pY19tc2cpOw0KPiA+ICsNCj4gPiAr Ym9vbCBodl9pc19oeXBlcnZfaW5pdGlhbGl6ZWQodm9pZCkNCj4gPiArew0KPiA+ICsJcmV0dXJu IGh5cGVydl9pbml0aWFsaXplZDsNCj4gPiArfQ0KPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChodl9p c19oeXBlcnZfaW5pdGlhbGl6ZWQpOw0KPiA+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2h5cGVy di9tc2h5cGVydi5jIGIvYXJjaC9hcm02NC9oeXBlcnYvbXNoeXBlcnYuYw0KPiA+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi4zZWYwNTU1OTk0MTINCj4gPiAt LS0gL2Rldi9udWxsDQo+ID4gKysrIGIvYXJjaC9hcm02NC9oeXBlcnYvbXNoeXBlcnYuYw0KPiA+ IEBAIC0wLDAgKzEsMTc4IEBADQo+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wDQo+ID4gKw0KPiA+ICsvKg0KPiA+ICsgKiBDb3JlIHJvdXRpbmVzIGZvciBpbnRlcmFjdGlu ZyB3aXRoIE1pY3Jvc29mdCdzIEh5cGVyLVYgaHlwZXJ2aXNvciwNCj4gPiArICogaW5jbHVkaW5n IHNldHRpbmcgdXAgVk1idXMgYW5kIFNUSU1FUiBpbnRlcnJ1cHRzLCBhbmQgaGFuZGxpbmcNCj4g PiArICogY3Jhc2hlcyBhbmQga2V4ZWNzLiBUaGVzZSBpbnRlcmFjdGlvbnMgYXJlIHRocm91Z2gg YSBzZXQgb2YNCj4gPiArICogc3RhdGljICJoYW5kbGVyIiB2YXJpYWJsZXMgc2V0IGJ5IHRoZSBh cmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQNCj4gPiArICogVk1idXMgYW5kIFNUSU1FUiBkcml2ZXJz LiAgVGhpcyBkZXNpZ24gaXMgdXNlZCB0byBtZWV0IHg4Ni94NjQNCj4gPiArICogcmVxdWlyZW1l bnRzIGZvciBhdm9pZGluZyBkaXJlY3QgbGlua2FnZXMgYW5kIGFsbG93aW5nIHRoZSBWTWJ1cw0K PiA+ICsgKiBhbmQgU1RJTUVSIGRyaXZlcnMgdG8gYmUgdW5sb2FkZWQgYW5kIHJlbG9hZGVkLg0K PiA+ICsgKg0KPiA+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTgsIE1pY3Jvc29mdCwgSW5jLg0KPiA+ ICsgKg0KPiA+ICsgKiBBdXRob3IgOiBNaWNoYWVsIEtlbGxleSA8bWlrZWxsZXlAbWljcm9zb2Z0 LmNvbT4NCj4gPiArICoNCj4gPiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQNCj4gPiArICogdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVi bGlzaGVkDQo+ID4gKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQo+ID4gKyAq DQo+ID4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLCBidXQNCj4gPiArICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KPiA+ICsgKiBNRVJDSEFOVEFCSUxJVFkg T1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3INCj4gPiAr ICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug Zm9yIG1vcmUNCj4gPiArICogZGV0YWlscy4NCj4gPiArICovDQo+ID4gKw0KPiA+ICsjaW5jbHVk ZSA8bGludXgvdHlwZXMuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPg0KPiA+ICsj aW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5o Pg0KPiA+ICsjaW5jbHVkZSA8bGludXgvYWNwaS5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvcHRy YWNlLmg+DQo+ID4gKyNpbmNsdWRlIDxhc20vaHlwZXJ2LXRsZnMuaD4NCj4gPiArI2luY2x1ZGUg PGFzbS9tc2h5cGVydi5oPg0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQgKCp2bWJ1c19oYW5kbGVy KSh2b2lkKTsNCj4gPiArc3RhdGljIHZvaWQgKCpodl9zdGltZXIwX2hhbmRsZXIpKHZvaWQpOw0K PiA+ICtzdGF0aWMgdm9pZCAoKmh2X2tleGVjX2hhbmRsZXIpKHZvaWQpOw0KPiA+ICtzdGF0aWMg dm9pZCAoKmh2X2NyYXNoX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsNCj4gPiArDQo+ ID4gK3N0YXRpYyBpbnQgdm1idXNfaXJxOw0KPiA+ICtzdGF0aWMgbG9uZyBfX3BlcmNwdSAqdm1i dXNfZXZ0Ow0KPiA+ICtzdGF0aWMgbG9uZyBfX3BlcmNwdSAqc3RpbWVyMF9ldnQ7DQo+ID4gKw0K PiA+ICtpcnFyZXR1cm5fdCBoeXBlcnZfdmVjdG9yX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2 X2lkKQ0KPiA+ICt7DQo+ID4gKwlpZiAodm1idXNfaGFuZGxlcikNCj4gPiArCQl2bWJ1c19oYW5k bGVyKCk7DQo+IA0KPiBJbiB3aGljaCBjaXJjdW1zdGFuY2VzIGNhbiB0aGlzIGJlIE5VTEw/DQoN ClBlcmhhcHMgbm9uZS4gIFRoaXMgbWF5IGJlIGEgbGVmdG92ZXIgZnJvbSB0aGUgZXF1aXZhbGVu dA0KeDg2IGNvZGUuICBJJ2xsIGNoZWNrIGFuZCBwcm9iYWJseSByZW1vdmUgaXQuDQoNCj4gDQo+ ID4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qIE11c3QgYmUg ZG9uZSBqdXN0IG9uY2UgKi8NCj4gPiArdm9pZCBodl9zZXR1cF92bWJ1c19pcnEodm9pZCAoKmhh bmRsZXIpKHZvaWQpKQ0KPiA+ICt7DQo+ID4gKwlpbnQgcmVzdWx0Ow0KPiA+ICsNCj4gPiArCXZt YnVzX2hhbmRsZXIgPSBoYW5kbGVyOw0KPiANCj4gSWYgdGhpc211c3Qgb25seSBiZSBkb25lIG9u Y2UsIG1heWJlIHlvdSBjb3VsZCBjaGVjayB0aGF0IGl0IGhhc24ndCBiZWVuDQo+IGRvbmUgYWxy ZWFkeT8NCg0KT0suDQoNCj4gDQo+ID4gKwl2bWJ1c19pcnEgPSBhY3BpX3JlZ2lzdGVyX2dzaShO VUxMLCBIWVBFUlZJU09SX0NBTExCQUNLX1ZFQ1RPUiwNCj4gPiArCQkJCSBBQ1BJX0xFVkVMX1NF TlNJVElWRSwgQUNQSV9BQ1RJVkVfSElHSCk7DQo+ID4gKwlpZiAodm1idXNfaXJxIDw9IDApIHsN Cj4gPiArCQlwcl9lcnIoIkNhbid0IHJlZ2lzdGVyIEh5cGVyLVYgVk1CdXMgR1NJLiBFcnJvciAl ZCIsDQo+ID4gKwkJCXZtYnVzX2lycSk7DQo+ID4gKwkJdm1idXNfaXJxID0gMDsNCj4gPiArCQly ZXR1cm47DQo+ID4gKwl9DQo+ID4gKwl2bWJ1c19ldnQgPSBhbGxvY19wZXJjcHUobG9uZyk7DQo+ ID4gKwlyZXN1bHQgPSByZXF1ZXN0X3BlcmNwdV9pcnEodm1idXNfaXJxLCBoeXBlcnZfdmVjdG9y X2hhbmRsZXIsDQo+ID4gKwkJCSJIeXBlci1WIFZNYnVzIiwgdm1idXNfZXZ0KTsNCj4gDQo+IElm IHRoaXMgaXMgYSBwZXItY3B1IGludGVycnVwdCwgd2h5IGlzbid0IGl0IHNpZ25hbGxlZCBhcyBh IFBQSSwgaW4gYW4NCj4gYXJjaGl0ZWN0dXJlIGNvbXBsaWFudCB3YXk/DQoNCkV4Y2VwdCBmb3Ig dGhlIGNvZGUgaW4gdGhpcyBtb2R1bGUsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgVk1idXMN CmludGVycnVwdHMgaXMgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50LiAgQnV0IHRoZXJlJ3Mgbm8g c3VwcG9ydCBmb3INCnBlci1wcm9jZXNzIGludGVycnVwdHMgb24gdGhlIHg4Niwgc28gdGhlIGh5 cGVydmlzb3IgaW50ZXJydXB0IHZlY3RvcnMNCmFyZSBoYXJkIGNvZGVkIGluIHRoZSBzYW1lIElE VCBlbnRyeSBhY3Jvc3MgYWxsIHByb2Nlc3NvcnMsIGFuZCB0aGUNCm5vcm1hbCBJUlEgYWxsb2Nh dGlvbiBtZWNoYW5pc20gaXMgYnlwYXNzZWQuICBUaGUgYWJvdmUgYXBwcm9hY2gNCmFzc2lnbnMg YW4gQVJNNjQgUFBJIChIWVBFUlZJU09SX0NBTExCQUNLX1ZFQ1RPUiBpcyAxNikgaW4gYQ0Kd2F5 IHRoYXQgd29ya3Mgd2l0aCB0aGUgYXJjaCBpbmRlcGVuZGVudCBpbnRlcnJ1cHQgaGFuZGxlci4N Cg0KT3IgbWF5YmUgSSdtIG1pc3NpbmcgeW91ciBwb2ludC4gIElmIHNvLCBwbGVhc2Ugc2V0IG1l IHN0cmFpZ2h0Lg0KDQo+IA0KPiA+ICsJaWYgKHJlc3VsdCkgew0KPiA+ICsJCXByX2VycigiQ2Fu J3QgcmVxdWVzdCBIeXBlci1WIFZNQnVzIElSUSAlZC4gRXJyb3IgJWQiLA0KPiA+ICsJCQl2bWJ1 c19pcnEsIHJlc3VsdCk7DQo+ID4gKwkJZnJlZV9wZXJjcHUodm1idXNfZXZ0KTsNCj4gPiArCQlh Y3BpX3VucmVnaXN0ZXJfZ3NpKHZtYnVzX2lycSk7DQo+ID4gKwkJdm1idXNfaXJxID0gMDsNCj4g PiArCX0NCj4gPiArfQ0KPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChodl9zZXR1cF92bWJ1c19pcnEp Ow0KPiA+ICsNCj4gPiArLyogTXVzdCBiZSBkb25lIGp1c3Qgb25jZSAqLw0KPiA+ICt2b2lkIGh2 X3JlbW92ZV92bWJ1c19pcnEodm9pZCkNCj4gPiArew0KPiA+ICsJaWYgKHZtYnVzX2lycSkgew0K PiA+ICsJCWZyZWVfcGVyY3B1X2lycSh2bWJ1c19pcnEsIHZtYnVzX2V2dCk7DQo+ID4gKwkJZnJl ZV9wZXJjcHUodm1idXNfZXZ0KTsNCj4gPiArCQlhY3BpX3VucmVnaXN0ZXJfZ3NpKHZtYnVzX2ly cSk7DQo+ID4gKwl9DQo+ID4gK30NCj4gPiArRVhQT1JUX1NZTUJPTF9HUEwoaHZfcmVtb3ZlX3Zt YnVzX2lycSk7DQo+ID4gKw0KPiA+ICsvKiBNdXN0IGJlIGRvbmUgYnkgZWFjaCBDUFUgKi8NCj4g PiArdm9pZCBodl9lbmFibGVfdm1idXNfaXJxKHZvaWQpDQo+ID4gK3sNCj4gPiArCWVuYWJsZV9w ZXJjcHVfaXJxKHZtYnVzX2lycSwgMCk7DQo+ID4gK30NCj4gPiArRVhQT1JUX1NZTUJPTF9HUEwo aHZfZW5hYmxlX3ZtYnVzX2lycSk7DQo+ID4gKw0KPiA+ICsvKiBNdXN0IGJlIGRvbmUgYnkgZWFj aCBDUFUgKi8NCj4gPiArdm9pZCBodl9kaXNhYmxlX3ZtYnVzX2lycSh2b2lkKQ0KPiA+ICt7DQo+ ID4gKwlkaXNhYmxlX3BlcmNwdV9pcnEodm1idXNfaXJxKTsNCj4gPiArfQ0KPiA+ICtFWFBPUlRf U1lNQk9MX0dQTChodl9kaXNhYmxlX3ZtYnVzX2lycSk7DQo+ID4gKw0KPiA+ICsvKiBSb3V0aW5l cyB0byBkbyBwZXItYXJjaGl0ZWN0dXJlIGhhbmRsaW5nIG9mIFNUSU1FUjAgd2hlbiBpbiBEaXJl Y3QgTW9kZSAqLw0KPiA+ICsNCj4gPiArc3RhdGljIGlycXJldHVybl90IGh2X3N0aW1lcjBfdmVj dG9yX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQ0KPiA+ICt7DQo+ID4gKwlpZiAoaHZf c3RpbWVyMF9oYW5kbGVyKQ0KPiA+ICsJCWh2X3N0aW1lcjBfaGFuZGxlcigpOw0KPiA+ICsJcmV0 dXJuIElSUV9IQU5ETEVEOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtpbnQgaHZfc2V0dXBfc3RpbWVy MF9pcnEoaW50ICppcnEsIGludCAqdmVjdG9yLCB2b2lkICgqaGFuZGxlcikodm9pZCkpDQo+ID4g K3sNCj4gPiArCWludCBsb2NhbGlycTsNCj4gPiArCWludCByZXN1bHQ7DQo+ID4gKw0KPiA+ICsJ bG9jYWxpcnEgPSBhY3BpX3JlZ2lzdGVyX2dzaShOVUxMLCBIVl9TVElNRVIwX0lSUU5SLA0KPiA+ ICsJCQlBQ1BJX0xFVkVMX1NFTlNJVElWRSwgQUNQSV9BQ1RJVkVfSElHSCk7DQo+ID4gKwlpZiAo bG9jYWxpcnEgPD0gMCkgew0KPiA+ICsJCXByX2VycigiQ2FuJ3QgcmVnaXN0ZXIgSHlwZXItViBz dGltZXIwIEdTSS4gRXJyb3IgJWQiLA0KPiA+ICsJCQlsb2NhbGlycSk7DQo+ID4gKwkJKmlycSA9 IDA7DQo+ID4gKwkJcmV0dXJuIC0xOw0KPiA+ICsJfQ0KPiA+ICsJc3RpbWVyMF9ldnQgPSBhbGxv Y19wZXJjcHUobG9uZyk7DQo+ID4gKwlyZXN1bHQgPSByZXF1ZXN0X3BlcmNwdV9pcnEobG9jYWxp cnEsIGh2X3N0aW1lcjBfdmVjdG9yX2hhbmRsZXIsDQo+ID4gKwkJCQkJICJIeXBlci1WIHN0aW1l cjAiLCBzdGltZXIwX2V2dCk7DQo+ID4gKwlpZiAocmVzdWx0KSB7DQo+ID4gKwkJcHJfZXJyKCJD YW4ndCByZXF1ZXN0IEh5cGVyLVYgc3RpbWVyMCBJUlEgJWQuIEVycm9yICVkIiwNCj4gPiArCQkJ bG9jYWxpcnEsIHJlc3VsdCk7DQo+ID4gKwkJZnJlZV9wZXJjcHUoc3RpbWVyMF9ldnQpOw0KPiA+ ICsJCWFjcGlfdW5yZWdpc3Rlcl9nc2kobG9jYWxpcnEpOw0KPiA+ICsJCSppcnEgPSAwOw0KPiA+ ICsJCXJldHVybiAtMTsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlodl9zdGltZXIwX2hhbmRsZXIg PSBoYW5kbGVyOw0KPiA+ICsJKnZlY3RvciA9IEhWX1NUSU1FUjBfSVJRTlI7DQo+ID4gKwkqaXJx ID0gbG9jYWxpcnE7DQo+ID4gKwlyZXR1cm4gMDsNCj4gPiArfQ0KPiA+ICtFWFBPUlRfU1lNQk9M X0dQTChodl9zZXR1cF9zdGltZXIwX2lycSk7DQo+ID4gKw0KPiA+ICt2b2lkIGh2X3JlbW92ZV9z dGltZXIwX2lycShpbnQgaXJxKQ0KPiA+ICt7DQo+ID4gKwlodl9zdGltZXIwX2hhbmRsZXIgPSBO VUxMOw0KPiA+ICsJaWYgKGlycSkgew0KPiA+ICsJCWZyZWVfcGVyY3B1X2lycShpcnEsIHN0aW1l cjBfZXZ0KTsNCj4gPiArCQlmcmVlX3BlcmNwdShzdGltZXIwX2V2dCk7DQo+ID4gKwkJYWNwaV91 bnJlZ2lzdGVyX2dzaShpcnEpOw0KPiA+ICsJfQ0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0xf R1BMKGh2X3JlbW92ZV9zdGltZXIwX2lycSk7DQo+ID4gKw0KPiA+ICt2b2lkIGh2X3NldHVwX2tl eGVjX2hhbmRsZXIodm9pZCAoKmhhbmRsZXIpKHZvaWQpKQ0KPiA+ICt7DQo+ID4gKwlodl9rZXhl Y19oYW5kbGVyID0gaGFuZGxlcjsNCj4gPiArfQ0KPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChodl9z ZXR1cF9rZXhlY19oYW5kbGVyKTsNCj4gPiArDQo+ID4gK3ZvaWQgaHZfcmVtb3ZlX2tleGVjX2hh bmRsZXIodm9pZCkNCj4gPiArew0KPiA+ICsJaHZfa2V4ZWNfaGFuZGxlciA9IE5VTEw7DQo+ID4g K30NCj4gPiArRVhQT1JUX1NZTUJPTF9HUEwoaHZfcmVtb3ZlX2tleGVjX2hhbmRsZXIpOw0KPiA+ ICsNCj4gPiArdm9pZCBodl9zZXR1cF9jcmFzaF9oYW5kbGVyKHZvaWQgKCpoYW5kbGVyKShzdHJ1 Y3QgcHRfcmVncyAqcmVncykpDQo+ID4gK3sNCj4gPiArCWh2X2NyYXNoX2hhbmRsZXIgPSBoYW5k bGVyOw0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0xfR1BMKGh2X3NldHVwX2NyYXNoX2hhbmRs ZXIpOw0KPiA+ICsNCj4gPiArdm9pZCBodl9yZW1vdmVfY3Jhc2hfaGFuZGxlcih2b2lkKQ0KPiA+ ICt7DQo+ID4gKwlodl9jcmFzaF9oYW5kbGVyID0gTlVMTDsNCj4gPiArfQ0KPiA+ICtFWFBPUlRf U1lNQk9MX0dQTChodl9yZW1vdmVfY3Jhc2hfaGFuZGxlcik7DQo+ID4NCj4gDQo+IE92ZXJhbGws IHRoaXMgcGF0Y2ggbmVlZHMgYSBtYXNzaXZlIHNwbGl0IHVwLCBjbGVhbiB1cCwgYW5kIGEgZ29v ZCBkb3NlDQo+IG9mIGRvY3VtZW50YXRpb24gc28gdGhhdCB3ZSBjYW4gdW5kZXJzdGFuZCB3aGF0 IHlvdSBhcmUgdHJ5aW5nIHRvIGFjaGlldmUuDQoNClRoYW5rcyBmb3IgdGhlIGZlZWRiYWNrLiAg SSdsbCBzdGFydCB3b3JrIG9uIGEgbmV3IHZlcnNpb24gZm9yIHRoZQ0KY2hhbmdlcyB0aGF0IGFy ZSBjbGVhciwgYW5kIGF3YWl0IGFkZGl0aW9uYWwgZGlzY3Vzc2lvbiBvbg0KYSBmZXcgaXNzdWVz IHdoZXJlIEkgbmVlZCBzb21lIGZ1cnRoZXIgaW5wdXQuDQoNCk1pY2hhZWwNCg0KPiANCj4gVGhh bmtzLA0KPiANCj4gCU0uDQo+IC0tDQo+IEphenogaXMgbm90IGRlYWQuIEl0IGp1c3Qgc21lbGxz IGZ1bm55Li4uDQo=