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 lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5EA8BC3DA7A for ; Fri, 6 Jan 2023 06:50:08 +0000 (UTC) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4NpDVQ5x5Fz3cBh for ; Fri, 6 Jan 2023 17:50:06 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=russell.cc header.i=@russell.cc header.a=rsa-sha256 header.s=fm3 header.b=qFhgn5Sn; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.a=rsa-sha256 header.s=fm2 header.b=UZuF6xb8; dkim-atps=neutral Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=russell.cc (client-ip=64.147.123.24; helo=wout1-smtp.messagingengine.com; envelope-from=ruscur@russell.cc; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=russell.cc header.i=@russell.cc header.a=rsa-sha256 header.s=fm3 header.b=qFhgn5Sn; dkim=pass (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.a=rsa-sha256 header.s=fm2 header.b=UZuF6xb8; dkim-atps=neutral Received: from wout1-smtp.messagingengine.com (wout1-smtp.messagingengine.com [64.147.123.24]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4NpDTP0RGVz304m for ; Fri, 6 Jan 2023 17:49:13 +1100 (AEDT) Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.west.internal (Postfix) with ESMTP id AB63A3200A8C; Fri, 6 Jan 2023 01:49:10 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Fri, 06 Jan 2023 01:49:11 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=russell.cc; h=cc :cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm3; t=1672987750; x= 1673074150; bh=ltrG2jkNm9/9kRbwh8zVZqQN9sicXuj29fstdFNgbHo=; b=q Fhgn5SnTQSBU3v3ax835JZK/rRpNMD9b6+JaGn1kfExnNmj930JtlLHveiCuwL/1 XUUjcxxTsyKWaQc6MvshKZ+lrShfkhz0oM6O4bN30sHV5XUS6iMrCjUWEWk3enc9 q/zHAG5SCVz+bMbEtLytz3aKWPLCeUDr7SEAcAvyjxqK+5h53J/0/u2KEg2m9oRB tdtwh7ZU5bAeysEq16p7Q0Hwrvr/RxZmgBwcClnkF5XlZRHnDdH6p9uk123kx2kQ /wbVDkAZAQN0y5abpjpSnrS6sG84tCEQGR64a2EwDlfnpxuzA7HOXLzluVKok2Gu 5c8A0Fkro3qWSTdUB8z+w== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t=1672987750; x= 1673074150; bh=ltrG2jkNm9/9kRbwh8zVZqQN9sicXuj29fstdFNgbHo=; b=U ZuF6xb8XrfXEGfzUcHGHNOmQD640F+iqRgGVfnbFae5lxyviOABrHCipingH4Z7A Blo0a4lvvK+BsfrWjOYEQFBID7VzppGiJxhHrd8iig7d0rkwbsLJjp9HOGa67DHw Mz38k1dbzigN8wY6yQScZIi57sWYTbFjgKiE1qUdd/qO8eya6FCnuwV9pNPuOlJc x2xZnGFuuYS6zm3GaC1K/kq9uGMwUImZXExfW8XyWN2BQ/iXa3qbWAQkQA2jV5WD G+pEHpsMo+xR8u7w44kHzisTnTrHOPUiPvUmO1FP6XihoUfcrp3Ie0SdkLsUAYud qGn9Ub9IRHTNSY9hPM51Q== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvhedrjeelgddutdduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucgfrhhlucfvnfffucdludehmdenucfjughrpefkuf fhvfevffgjfhgtgfgfggesthgsredttderjeenucfhrhhomheptfhushhsvghllhcuvehu rhhrvgihuceorhhushgtuhhrsehruhhsshgvlhhlrdgttgeqnecuggftrfgrthhtvghrnh epheduieduhedtueefueegfffguddugfffveekvefgteethedvfedvheeuhffghefhnecu vehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheprhhushgtuh hrsehruhhsshgvlhhlrdgttg X-ME-Proxy: Feedback-ID: i4421424f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 6 Jan 2023 01:49:07 -0500 (EST) Message-ID: Subject: Re: [PATCH v2 7/7] powerpc/pseries: Implement secvars for dynamic secure boot From: Russell Currey To: Andrew Donnellan , linuxppc-dev@lists.ozlabs.org Date: Fri, 06 Jan 2023 17:49:05 +1100 In-Reply-To: <8b1183aa0e84363545a956118c970220670a636d.camel@linux.ibm.com> References: <20221230042014.154483-1-ruscur@russell.cc> <20221230042014.154483-8-ruscur@russell.cc> <8b1183aa0e84363545a956118c970220670a636d.camel@linux.ibm.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.46.2 (3.46.2-1.fc37) MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: gregkh@linuxfoundation.org, nayna@linux.ibm.com, linux-kernel@vger.kernel.org, zohar@linux.ibm.com, gcwilson@linux.ibm.com Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" T24gVGh1LCAyMDIzLTAxLTA1IGF0IDE5OjE1ICsxMTAwLCBBbmRyZXcgRG9ubmVsbGFuIHdyb3Rl Ogo+IE9uIEZyaSwgMjAyMi0xMi0zMCBhdCAxNToyMCArMTEwMCwgUnVzc2VsbCBDdXJyZXkgd3Jv dGU6Cj4gPiBUaGUgcHNlcmllcyBwbGF0Zm9ybSBjYW4gc3VwcG9ydCBkeW5hbWljIHNlY3VyZSBi b290IChpLmUuIHNlY3VyZQo+ID4gYm9vdAo+ID4gdXNpbmcgdXNlci1kZWZpbmVkIGtleXMpIHVz aW5nIHZhcmlhYmxlcyBjb250YWluZWQgd2l0aCB0aGUgUG93ZXJWTQo+ID4gTFBBUgo+ID4gUGxh dGZvcm0gS2V5U3RvcmUgKFBMUEtTKS7CoCBVc2luZyB0aGUgcG93ZXJwYyBzZWN2YXIgQVBJLCBl eHBvc2UKPiA+IHRoZQo+ID4gcmVsZXZhbnQgdmFyaWFibGVzIGZvciBwc2VyaWVzIGR5bmFtaWMg c2VjdXJlIGJvb3QgdGhyb3VnaCB0aGUKPiA+IGV4aXN0aW5nCj4gPiBzZWN2YXIgZmlsZXN5c3Rl bSBsYXlvdXQuCj4gPiAKPiA+IFRoZSByZWxldmFudCB2YXJpYWJsZXMgZm9yIGR5bmFtaWMgc2Vj dXJlIGJvb3QgYXJlIHNpZ25lZCBpbiB0aGUKPiA+IGtleXN0b3JlLCBhbmQgY2FuIG9ubHkgYmUg bW9kaWZpZWQgdXNpbmcgdGhlIEhfUEtTX1NJR05FRF9VUERBVEUKPiA+IGhjYWxsLgo+ID4gT2Jq ZWN0IGxhYmVscyBpbiB0aGUga2V5c3RvcmUgYXJlIGVuY29kZWQgdXNpbmcgdWNzMiBmb3JtYXQu wqAgV2l0aAo+ID4gb3VyCj4gPiBmaXhlZCB2YXJpYWJsZSBuYW1lcyB3ZSBkb24ndCBoYXZlIHRv IGNhcmUgYWJvdXQgZW5jb2Rpbmcgb3V0c2lkZQo+ID4gb2YKPiA+IHRoZQo+ID4gbmVjZXNzYXJ5 IGJ5dGUgcGFkZGluZy4KPiA+IAo+ID4gV2hlbiBhIHVzZXIgd3JpdGVzIHRvIGEgdmFyaWFibGUs IHRoZSBmaXJzdCA4IGJ5dGVzIG9mIGRhdGEgbXVzdAo+ID4gY29udGFpbgo+ID4gdGhlIHNpZ25l ZCB1cGRhdGUgZmxhZ3MgYXMgZGVmaW5lZCBieSB0aGUgaHlwZXJ2aXNvci4KPiA+IAo+ID4gV2hl biBhIHVzZXIgcmVhZHMgYSB2YXJpYWJsZSwgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgZGF0YSBjb250 YWluIHRoZQo+ID4gcG9saWNpZXMgZGVmaW5lZCBmb3IgdGhlIG9iamVjdC4KPiA+IAo+ID4gTGlt aXRhdGlvbnMgZXhpc3QgZHVlIHRvIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHN5 c2ZzCj4gPiBiaW5hcnkKPiA+IGF0dHJpYnV0ZXMsIGFzIGlzIHRoZSBjYXNlIGZvciB0aGUgT1BB TCBzZWN2YXIgaW1wbGVtZW50YXRpb24gLQo+ID4gcGFydGlhbCB3cml0ZXMgYXJlIHVuc3VwcG9y dGVkIGFuZCB3cml0ZXMgY2Fubm90IGJlIGxhcmdlciB0aGFuCj4gPiBQQUdFX1NJWkUuCj4gCj4g VGhlIFBBR0VfU0laRSBsaW1pdCwgaW4gcHJhY3RpY2UsIHdpbGwgYmUgYSBtYWpvciBsaW1pdGF0 aW9uIHdpdGggNEsKPiBwYWdlcyAod2UgZXhwZWN0IHNldmVyYWwgb2YgdGhlIHZhcmlhYmxlcyB0 byByZWd1bGFybHkgYmUgbGFyZ2VyIHRoYW4KPiA0SykgYnV0IHdvbid0IGJlIG11Y2ggb2YgYW4g aXNzdWUgZm9yIDY0SyAodGhhdCdzIGFsbCB0aGUgc3RvcmFnZQo+IHNwYWNlCj4gdGhlIGh5cGVy dmlzb3Igd2lsbCBnaXZlIHlvdSBhbnl3YXkpLgo+IAo+IEluIGEgcHJldmlvdXMgaW50ZXJuYWwg dmVyc2lvbiwgd2UgcHJpbnRlZCBhIG1lc3NhZ2Ugd2hlbiBQQUdFX1NJWkUgPAo+IHBscGtzX2dl dF9tYXhvYmplY3RzaXplKCksIG1pZ2h0IGJlIHdvcnRoIHN0aWxsIGRvaW5nIHRoYXQ/CgpZZWFo LCB3ZSBzaG91bGQgZG8gdGhhdCBpbiB0aGUgc2VjdmFyIGNvZGUuICBUaGUgc2FtZSBsaW1pdGF0 aW9uCmFwcGxpZXMgb24gdGhlIHBvd2VybnYgc2lkZSBhcyB3ZWxsLgoKPiAKPiA+IAo+ID4gQ28t ZGV2ZWxvcGVkLWJ5OiBOYXluYSBKYWluIDxuYXluYUBsaW51eC5pYm0uY29tPgo+ID4gU2lnbmVk LW9mZi1ieTogTmF5bmEgSmFpbiA8bmF5bmFAbGludXguaWJtLmNvbT4KPiA+IENvLWRldmVsb3Bl ZC1ieTogQW5kcmV3IERvbm5lbGxhbiA8YWpkQGxpbnV4LmlibS5jb20+Cj4gPiBTaWduZWQtb2Zm LWJ5OiBBbmRyZXcgRG9ubmVsbGFuIDxhamRAbGludXguaWJtLmNvbT4KPiA+IFNpZ25lZC1vZmYt Ynk6IFJ1c3NlbGwgQ3VycmV5IDxydXNjdXJAcnVzc2VsbC5jYz4KPiAKPiBTb21lIG1pbm9yIGNv bW1lbnRzIGZvciB2MyBvbiBhIHBhdGNoIHdoaWNoIGFscmVhZHkgY2FycmllcyBteQo+IHNpZ25v ZmYuLi4KPiAKPiA+IC0tLQo+ID4gdjI6IFJlbW92ZSB1bm5lY2Vzc2FyeSBjb25maWcgdmFycyBm cm9tIHN5c2ZzIGFuZCBkb2N1bWVudCB0aGUKPiA+IG90aGVycywKPiA+IMKgwqDCoCB0aGFua3Mg dG8gcmV2aWV3IGZyb20gR3JlZy7CoCBJZiB3ZSBlbmQgdXAgbmVlZGluZyB0byBleHBvc2UKPiA+ IG1vcmUsCj4gPiB3ZQo+ID4gwqDCoMKgIGNhbiBhZGQgdGhlbSBsYXRlciBhbmQgdXBkYXRlIHRo ZSBkb2NzLgo+ID4gCj4gPiDCoMKgwqAgVXNlIHN5c2ZzX2VtaXQoKSBpbnN0ZWFkIG9mIHNwcmlu dGYoKSwgdGhhbmtzIHRvIEdyZWcuCj4gPiAKPiA+IMKgwqDCoCBDaGFuZ2UgdGhlIHNpemUgb2Yg dGhlIHN5c2ZzIGJpbmFyeSBhdHRyaWJ1dGVzIHRvIGluY2x1ZGUgdGhlCj4gPiA4LQo+ID4gYnl0 ZQo+ID4gwqDCoMKgIGZsYWdzIGhlYWRlciwgcHJldmVudGluZyB0cnVuY2F0aW9uIG9mIGxhcmdl IHdyaXRlcy4KPiA+IAo+ID4gwqBEb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXNlY3Zh csKgwqDCoMKgwqDCoMKgIHzCoCA2NyArKysrLQo+ID4gwqBhcmNoL3Bvd2VycGMvcGxhdGZvcm1z L3BzZXJpZXMvS2NvbmZpZ8KgwqDCoMKgwqDCoMKgIHzCoCAxMyArCj4gPiDCoGFyY2gvcG93ZXJw Yy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZcKgwqDCoMKgwqDCoCB8wqDCoCA0ICstCj4gPiDC oGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBrcy1zZWN2YXIuYyB8IDI0NQo+ID4g KysrKysrKysrKysrKysrKysrCj4gPiDCoDQgZmlsZXMgY2hhbmdlZCwgMzI2IGluc2VydGlvbnMo KyksIDMgZGVsZXRpb25zKC0pCj4gPiDCoGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3Bvd2VycGMv cGxhdGZvcm1zL3BzZXJpZXMvcGxwa3Mtc2VjdmFyLmMKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL0Rv Y3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtc2VjdmFyCj4gPiBiL0RvY3VtZW50YXRpb24v QUJJL3Rlc3Rpbmcvc3lzZnMtc2VjdmFyCj4gPiBpbmRleCBmZWViYjhjNTcyOTQuLjQ2NmE4Y2I5 MmI5MiAxMDA2NDQKPiA+IC0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtc2Vj dmFyCj4gPiArKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXNlY3Zhcgo+ID4g QEAgLTM0LDcgKzM0LDcgQEAgRGVzY3JpcHRpb246wqDCoEFuIGludGVnZXIgcmVwcmVzZW50YXRp b24gb2YgdGhlCj4gPiBzaXplCj4gPiBvZiB0aGUgY29udGVudCBvZiB0aGUKPiA+IMKgCj4gPiDC oFdoYXQ6wqDCoMKgwqDCoMKgwqDCoMKgwqAvc3lzL2Zpcm13YXJlL3NlY3Zhci92YXJzLzx2YXJp YWJsZV9uYW1lPi9kYXRhCj4gPiDCoERhdGU6wqDCoMKgwqDCoMKgwqDCoMKgwqBBdWd1c3QgMjAx OQo+ID4gLUNvbnRhY3Q6wqDCoMKgwqDCoMKgwqBOYXluYSBKYWluIGg8bmF5bmFAbGludXguaWJt LmNvbT4KPiA+ICtDb250YWN0OsKgwqDCoMKgwqDCoMKgTmF5bmEgSmFpbiA8bmF5bmFAbGludXgu aWJtLmNvbT4KPiA+IMKgRGVzY3JpcHRpb246wqDCoMKgQSByZWFkLW9ubHkgZmlsZSBjb250YWlu aW5nIHRoZSB2YWx1ZSBvZiB0aGUKPiA+IHZhcmlhYmxlLiBUaGUgc2l6ZQo+ID4gwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvZiB0aGUgZmlsZSByZXByZXNlbnRzIHRoZSBtYXhpbXVt IHNpemUgb2YgdGhlCj4gPiB2YXJpYWJsZSBkYXRhLgo+ID4gwqAKPiA+IEBAIC00NCwzICs0NCw2 OCBAQCBDb250YWN0OsKgwqDCoMKgwqBOYXluYSBKYWluIDxuYXluYUBsaW51eC5pYm0uY29tPgo+ ID4gwqBEZXNjcmlwdGlvbjrCoMKgwqBBIHdyaXRlLW9ubHkgZmlsZSB0aGF0IGlzIHVzZWQgdG8g c3VibWl0IHRoZSBuZXcKPiA+IHZhbHVlIGZvciB0aGUKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgdmFyaWFibGUuIFRoZSBzaXplIG9mIHRoZSBmaWxlIHJlcHJlc2VudHMgdGhl Cj4gPiBtYXhpbXVtCj4gPiBzaXplIG9mCj4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHRoZSB2YXJpYWJsZSBkYXRhIHRoYXQgY2FuIGJlIHdyaXR0ZW4uCj4gPiArCj4gPiArV2hh dDrCoMKgwqDCoMKgwqDCoMKgwqDCoC9zeXMvZmlybXdhcmUvc2VjdmFyL2NvbmZpZwo+ID4gK0Rh dGU6wqDCoMKgwqDCoMKgwqDCoMKgwqBEZWNlbWJlciAyMDIyCj4gPiArQ29udGFjdDrCoMKgwqDC oMKgwqDCoE5heW5hIEphaW4gPG5heW5hQGxpbnV4LmlibS5jb20+Cj4gPiArRGVzY3JpcHRpb246 wqDCoMKgVGhpcyBvcHRpb25hbCBkaXJlY3RvcnkgY29udGFpbnMgcmVhZC1vbmx5IGNvbmZpZwo+ ID4gYXR0cmlidXRlcyBhcwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRlZmlu ZWQgYnkgdGhlIHNlY3VyZSB2YXJpYWJsZSBpbXBsZW1lbnRhdGlvbi7CoCBBbGwKPiA+IGRhdGEg aXMgaW4KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBBU0NJSSBmb3JtYXQuIFRo ZSBkaXJlY3RvcnkgaXMgb25seSBjcmVhdGVkIGlmIHRoZQo+ID4gYmFja2luZwo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIHZhcmlhYmxl cyB0byBwb3B1bGF0ZSBpdCwKPiA+IHdoaWNoIGF0Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgcHJlc2VudCBpcyBvbmx5IFBMUEtTIG9uIHRoZSBwc2VyaWVzIHBsYXRmb3JtLgo+ ID4gKwo+ID4gK1doYXQ6wqDCoMKgwqDCoMKgwqDCoMKgwqAvc3lzL2Zpcm13YXJlL3NlY3Zhci9j b25maWcvdmVyc2lvbgo+ID4gK0RhdGU6wqDCoMKgwqDCoMKgwqDCoMKgwqBEZWNlbWJlciAyMDIy Cj4gPiArQ29udGFjdDrCoMKgwqDCoMKgwqDCoE5heW5hIEphaW4gPG5heW5hQGxpbnV4LmlibS5j b20+Cj4gPiArRGVzY3JpcHRpb246wqDCoMKgUk8gZmlsZSwgb25seSBwcmVzZW50IGlmIHRoZSBz ZWN2YXIgaW1wbGVtZW50YXRpb24KPiA+IGlzCj4gPiBQTFBLUy4KPiA+ICsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBDb250YWlucyB0aGUgY29uZmlnIHZlcnNpb24gYXMgcmVw b3J0ZWQgYnkgdGhlCj4gPiBoeXBlcnZpc29yIGluCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgQVNDSUkgZGVjaW1hbCBmb3JtYXQuCj4gPiArCj4gPiArV2hhdDrCoMKgwqDCoMKg wqDCoMKgwqDCoC9zeXMvZmlybXdhcmUvc2VjdmFyL2NvbmZpZy9tYXhfb2JqZWN0X3NpemUKPiA+ ICtEYXRlOsKgwqDCoMKgwqDCoMKgwqDCoMKgRGVjZW1iZXIgMjAyMgo+ID4gK0NvbnRhY3Q6wqDC oMKgwqDCoMKgwqBOYXluYSBKYWluIDxuYXluYUBsaW51eC5pYm0uY29tPgo+ID4gK0Rlc2NyaXB0 aW9uOsKgwqDCoFJPIGZpbGUsIG9ubHkgcHJlc2VudCBpZiB0aGUgc2VjdmFyIGltcGxlbWVudGF0 aW9uCj4gPiBpcwo+ID4gUExQS1MuCj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgQ29udGFpbnMgdGhlIG1heGltdW0gYWxsb3dlZCBzaXplIG9mIG9iamVjdHMgaW4gdGhl Cj4gPiBrZXlzdG9yZQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGluIGJ5dGVz LCByZXByZXNlbnRlZCBpbiBBU0NJSSBkZWNpbWFsIGZvcm1hdC4KPiA+ICsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBh cyB0aGUgbWF4IHNpemUKPiA+IHRoYXQKPiA+IGNhbiBiZQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHdyaXR0ZW4gdG8gYW4gdXBkYXRlIGZpbGUgYXMgd3JpdGVzIGNhbiBjb250 YWluCj4gPiBtb3JlCj4gPiB0aGFuCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg b2JqZWN0IGRhdGEsIHlvdSBzaG91bGQgdXNlIHRoZSBzaXplIG9mIHRoZSB1cGRhdGUKPiA+IGZp bGUgZm9yCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdGhhdCBwdXJwb3NlLgo+ ID4gKwo+ID4gK1doYXQ6wqDCoMKgwqDCoMKgwqDCoMKgwqAvc3lzL2Zpcm13YXJlL3NlY3Zhci9j b25maWcvdG90YWxfc2l6ZQo+ID4gK0RhdGU6wqDCoMKgwqDCoMKgwqDCoMKgwqBEZWNlbWJlciAy MDIyCj4gPiArQ29udGFjdDrCoMKgwqDCoMKgwqDCoE5heW5hIEphaW4gPG5heW5hQGxpbnV4Lmli bS5jb20+Cj4gPiArRGVzY3JpcHRpb246wqDCoMKgUk8gZmlsZSwgb25seSBwcmVzZW50IGlmIHRo ZSBzZWN2YXIgaW1wbGVtZW50YXRpb24KPiA+IGlzCj4gPiBQTFBLUy4KPiA+ICsKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBDb250YWlucyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUg UExQS1MgaW4gYnl0ZXMsCj4gPiByZXByZXNlbnRlZCBpbgo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoEFTQ0lJIGRlY2ltYWwgZm9ybWF0Lgo+ID4gKwo+ID4gK1doYXQ6wqDCoMKg wqDCoMKgwqDCoMKgwqAvc3lzL2Zpcm13YXJlL3NlY3Zhci9jb25maWcvdXNlZF9zcGFjZQo+ID4g K0RhdGU6wqDCoMKgwqDCoMKgwqDCoMKgwqBEZWNlbWJlciAyMDIyCj4gPiArQ29udGFjdDrCoMKg wqDCoMKgwqDCoE5heW5hIEphaW4gPG5heW5hQGxpbnV4LmlibS5jb20+Cj4gPiArRGVzY3JpcHRp b246wqDCoMKgUk8gZmlsZSwgb25seSBwcmVzZW50IGlmIHRoZSBzZWN2YXIgaW1wbGVtZW50YXRp b24KPiA+IGlzCj4gPiBQTFBLUy4KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBDb250YWlucyB0aGUgY3VycmVudCBzcGFjZSBjb25zdW1lZCBvZiB0aGUgUExQS1MgaW4K PiA+IGJ5dGVzLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJlcHJlc2VudGVk IGluIEFTQ0lJIGRlY2ltYWwgZm9ybWF0Lgo+IAo+IE5vdGUgdGhhdCBwcmVzZW50bHksIHRoaXMg aXNuJ3QgYWN0dWFsbHkgdXBkYXRlZCB3aGVuIHRoZSB1c2VyIHdyaXRlcwo+IG9iamVjdHMuIEkg c3VwcG9zZSB3ZSBjb3VsZCBmaXggdGhpcy4KCldlIHNob3VsZCBkZWZpbml0ZWx5IGZpeCB0aGF0 LgoKPiAKPiA+ICsKPiA+ICtXaGF0OsKgwqDCoMKgwqDCoMKgwqDCoMKgL3N5cy9maXJtd2FyZS9z ZWN2YXIvY29uZmlnL3N1cHBvcnRlZF9wb2xpY2llcwo+ID4gK0RhdGU6wqDCoMKgwqDCoMKgwqDC oMKgwqBEZWNlbWJlciAyMDIyCj4gPiArQ29udGFjdDrCoMKgwqDCoMKgwqDCoE5heW5hIEphaW4g PG5heW5hQGxpbnV4LmlibS5jb20+Cj4gPiArRGVzY3JpcHRpb246wqDCoMKgUk8gZmlsZSwgb25s eSBwcmVzZW50IGlmIHRoZSBzZWN2YXIgaW1wbGVtZW50YXRpb24KPiA+IGlzCj4gPiBQTFBLUy4K PiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBDb250YWlucyBhIGJpdG1h c2sgb2Ygc3VwcG9ydGVkIHBvbGljeSBmbGFncyBieSB0aGUKPiA+IGh5cGVydmlzb3IsCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmVwcmVzZW50ZWQgYXMgYW4gOCBieXRlIGhl eGFkZWNpbWFsIEFTQ0lJIHN0cmluZy7CoAo+ID4gQ29uc3VsdCB0aGUKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBoeXBlcnZpc29yIGRvY3VtZW50YXRpb24gZm9yIHdoYXQgdGhl c2UgZmxhZ3MgYXJlLgo+ID4gKwo+ID4gK1doYXQ6wqDCoMKgwqDCoMKgwqDCoMKgwqAvc3lzL2Zp cm13YXJlL3NlY3Zhci9jb25maWcvc2lnbmVkX3VwZGF0ZV9hbGdvcml0aG0KPiA+IHMKPiA+ICtE YXRlOsKgwqDCoMKgwqDCoMKgwqDCoMKgRGVjZW1iZXIgMjAyMgo+ID4gK0NvbnRhY3Q6wqDCoMKg wqDCoMKgwqBOYXluYSBKYWluIDxuYXluYUBsaW51eC5pYm0uY29tPgo+ID4gK0Rlc2NyaXB0aW9u OsKgwqDCoFJPIGZpbGUsIG9ubHkgcHJlc2VudCBpZiB0aGUgc2VjdmFyIGltcGxlbWVudGF0aW9u Cj4gPiBpcwo+ID4gUExQS1MuCj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgQ29udGFpbnMgYSBiaXRtYXNrIG9mIGZsYWdzIGluZGljYXRpbmcgd2hpY2gKPiA+IGFsZ29y aXRobXMgdGhlCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaHlwZXJ2aXNvciBz dXBwb3J0cyBvYmplY3RzIHRvIGJlIHNpZ25lZCB3aXRoIHdoZW4KPiA+IG1vZGlmeWluZwo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHNlY3ZhcnMsIHJlcHJlc2VudGVkIGFzIGEg MTYgYnl0ZSBoZXhhZGVjaW1hbCBBU0NJSQo+ID4gc3RyaW5nLgo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoENvbnN1bHQgdGhlIGh5cGVydmlzb3IgZG9jdW1lbnRhdGlvbiBmb3Ig d2hhdCB0aGVzZQo+ID4gZmxhZ3MgbWVhbi4KPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMv cGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZwo+ID4gYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bz ZXJpZXMvS2NvbmZpZwo+ID4gaW5kZXggYTNiNGQ5OTU2N2NiLi45NGUwOGM0MDVkNTAgMTAwNjQ0 Cj4gPiAtLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZwo+ID4gKysr IGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL0tjb25maWcKPiA+IEBAIC0xNjIsNiAr MTYyLDE5IEBAIGNvbmZpZyBQU0VSSUVTX1BMUEtTCj4gPiDCoAo+ID4gwqDCoMKgwqDCoMKgwqDC oMKgIElmIHVuc3VyZSwgc2VsZWN0IE4uCj4gPiDCoAo+ID4gK2NvbmZpZyBQU0VSSUVTX1BMUEtT X1NFQ1ZBUgo+ID4gK8KgwqDCoMKgwqDCoMKgZGVwZW5kcyBvbiBQU0VSSUVTX1BMUEtTCj4gCj4g UFNFUklFU19QTFBLUyBoYXMgbm8gdXNlIG9uIGl0cyBvd24gd2l0aG91dCB0aGUgc2VjdmFyIGZy b250ZW5kLiBXZQo+IHNob3VsZCBlaXRoZXIganVzdCBoYXZlIG9uZSBvcHRpb24sIG9yIGZvciBm dXR1cmUtcHJvb2ZpbmcgcHVycG9zZXMKPiB0dXJuIHRoaXMgZGVwZW5kcyBpbnRvIGEgc2VsZWN0 IGFuZCBnZXQgUFNFUklFU19QTFBLUyBvdXQgb2YKPiBtZW51Y29uZmlnLgoKSSBiZWxpZXZlIEkg ZGlkIHRoaXMgdG8gZW5mb3JjZSB0aGUgZGVwZW5kZW5jeSBvbiBQUENfU0VDVVJFX0JPT1QuICBB cwpvZiByaWdodCBub3cgdGhleSdyZSB0aWVkIHRvZ2V0aGVyLCBidXQgaWYgSSBhZGQgdGhhdCBk ZXBlbmRlbmN5IHRvClBTRVJJRVNfUExQS1MsIHRoZW4gaXQgbWFrZXMgdGhpbmdzIGF3a3dhcmQg aWYgdGhlcmUncyBhIG1vcmUgZ2VuZXJpYwpQTFBLUyBpbnRlcmZhY2UgaW4gZnV0dXJlIHRoYXQg aXNuJ3Qgc3BlY2lmaWMgdG8gc2VjdXJlIGJvb3QuICBJCnN1cHBvc2UgdGhpbmdzIGNhbiBiZSBj b21wYXJ0bWVudGFsaXNlZCBpbiBmdXR1cmUgaWYgdGhhdCBoYXBwZW5zLgoKPiAKPiA+ICvCoMKg wqDCoMKgwqDCoGRlcGVuZHMgb24gUFBDX1NFQ1VSRV9CT09UCj4gCj4gRldJVywgc3RhcnRpbmcg ZnJvbSBhIHBzZXJpZXNfbGVfZGVmY29uZmlnLCB0dXJuaW5nIG9uIGFsbCB0aGUKPiBvcHRpb25z Cj4gdGhhdCBhcmUgcmVxdWlyZWQgdG8gZ2V0IHRvIFBQQ19TRUNVUkVfQk9PVCB3YXMgYW5ub3lp bmcuIEknZCBsaWtlIHRvCj4gaGF2ZSBQU0VSSUVTX1BMUEtTX1NFQ1ZBUiBlbmFibGVkIGluIHRo ZSBkZWZjb25maWcgYnV0IGl0IGludm9sdmVzCj4gc3dpdGNoaW5nIG9uIHF1aXRlIGEgbG90LgoK UHJvYmFibHkgbW9yZSBvZiBhbiBtcGUgcXVlc3Rpb24sIGJ1dCB3ZSBoYXZlIHRvIHR1cm4gb24g YSBidW5jaCBvZiBJTUEKc3R1ZmYgdGhhdCBhZGRzIGNvbXBsZXhpdHkgYW5kIGluY3JlYXNlcyB0 aGUgYnVpbGQgdGltZSwgc28gSSdtIG5vdApzdXJlIGlmIHdlJ2Qgd2FudCBpdCBpbiBwc2VyaWVz X2RlZmNvbmZpZy4gIFdlIGNvdWxkIGRlZmluaXRlbHkgZWl0aGVyCmFkZCB0aGluZ3MgdG8gc2Vj dXJpdHkuY29uZmlnIG9yIG1ha2UgYSBuZXcgY29uZmlnIGZyYWdtZW50IGZvciBpdAp0aG91Z2gu Cgo+IAo+ID4gK8KgwqDCoMKgwqDCoMKgYm9vbCAiU3VwcG9ydCBmb3IgdGhlIFBMUEtTIHNlY3Zh ciBpbnRlcmZhY2UiCj4gPiArwqDCoMKgwqDCoMKgwqBoZWxwCj4gPiArwqDCoMKgwqDCoMKgwqDC oCBQb3dlclZNIGNhbiBzdXBwb3J0IGR5bmFtaWMgc2VjdXJlIGJvb3Qgd2l0aCB1c2VyLWRlZmlu ZWQKPiA+IGtleXMKPiA+ICvCoMKgwqDCoMKgwqDCoMKgIHRocm91Z2ggdGhlIFBMUEtTLiBLZXlz dG9yZSBvYmplY3RzIHVzZWQgaW4gZHluYW1pYwo+ID4gc2VjdXJlCj4gPiBib290Cj4gCj4gV2Ug c2hvdWxkIGFsc28gZXhwYW5kIFBMUEtTIHRvIFBvd2VyVk0gTFBBUiBQbGF0Zm9ybSBLZXlTdG9y ZS4KClRydWUuCgo+IAo+ID4gK8KgwqDCoMKgwqDCoMKgwqAgY2FuIGJlIGV4cG9zZWQgdG8gdGhl IGtlcm5lbCBhbmQgdXNlcnNwYWNlIHRocm91Z2ggdGhlCj4gPiBwb3dlcnBjCj4gPiArwqDCoMKg wqDCoMKgwqDCoCBzZWN2YXIgaW5mcmFzdHJ1Y3R1cmUuIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSB0 aGUgUExQS1MKPiA+IGJhY2tlbmQKPiA+ICvCoMKgwqDCoMKgwqDCoMKgIGZvciBzZWN2YXJzIGZv ciB1c2UgaW4gcHNlcmllcyBkeW5hbWljIHNlY3VyZSBib290Lgo+ID4gKwo+ID4gK8KgwqDCoMKg wqDCoMKgwqAgSWYgdW5zdXJlLCBzZWxlY3QgTi4KPiA+ICsKPiA+IMKgY29uZmlnIFBBUFJfU0NN Cj4gPiDCoMKgwqDCoMKgwqDCoMKgZGVwZW5kcyBvbiBQUENfUFNFUklFUyAmJiBNRU1PUllfSE9U UExVRyAmJiBMSUJOVkRJTU0KPiA+IMKgwqDCoMKgwqDCoMKgwqB0cmlzdGF0ZSAiU3VwcG9ydCBm b3IgdGhlIFBBUFIgU3RvcmFnZSBDbGFzcyBNZW1vcnkKPiA+IGludGVyZmFjZSIKPiA+IGRpZmYg LS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKPiA+IGIvYXJj aC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCj4gPiBpbmRleCA5MjMxMDIwMmJk ZDcuLjgwNzc1Njk5MWY5ZCAxMDA2NDQKPiA+IC0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMv cHNlcmllcy9NYWtlZmlsZQo+ID4gKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVz L01ha2VmaWxlCj4gPiBAQCAtMjcsOCArMjcsOCBAQCBvYmotJChDT05GSUdfUEFQUl9TQ00pwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqArPQo+ID4gcGFwcl9zY20ubwo+ID4gwqBvYmot JChDT05GSUdfUFBDX1NQTFBBUinCoMKgwqDCoMKgwqDCoCs9IHZwaG4ubwo+ID4gwqBvYmotJChD T05GSUdfUFBDX1NWTSnCoMKgwqDCoMKgwqDCoMKgwqDCoCs9IHN2bS5vCj4gPiDCoG9iai0kKENP TkZJR19GQV9EVU1QKcKgwqDCoMKgwqDCoMKgwqDCoMKgKz0gcnRhcy1mYWR1bXAubwo+ID4gLW9i ai0kKENPTkZJR19QU0VSSUVTX1BMUEtTKSArPSBwbHBrcy5vCj4gPiAtCj4gPiArb2JqLSQoQ09O RklHX1BTRVJJRVNfUExQS1MpwqDCoMKgwqArPSBwbHBrcy5vCj4gPiArb2JqLSQoQ09ORklHX1BT RVJJRVNfUExQS1NfU0VDVkFSKcKgwqDCoMKgwqArPSBwbHBrcy1zZWN2YXIubwo+ID4gwqBvYmot JChDT05GSUdfU1VTUEVORCnCoMKgwqDCoMKgwqDCoMKgwqDCoCs9IHN1c3BlbmQubwo+ID4gwqBv YmotJChDT05GSUdfUFBDX1ZBUynCoMKgwqDCoMKgwqDCoMKgwqDCoCs9IHZhcy5vIHZhcy1zeXNm cy5vCj4gPiDCoAo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmll cy9wbHBrcy1zZWN2YXIuYwo+ID4gYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGxw a3Mtc2VjdmFyLmMKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAw MDAuLjgyOThmMDM5YmVmNAo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvYXJjaC9wb3dlcnBj L3BsYXRmb3Jtcy9wc2VyaWVzL3BscGtzLXNlY3Zhci5jCj4gPiBAQCAtMCwwICsxLDI0NSBAQAo+ ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKPiA+ICsvKgo+ID4g KyAqIFNlY3VyZSB2YXJpYWJsZSBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgUG93ZXJWTSBMUEFS IFBsYXRmb3JtCj4gPiBLZXlTdG9yZSAoUExQS1MpCj4gPiArICoKPiA+ICsgKiBDb3B5cmlnaHQg MjAyMiwgSUJNIENvcnBvcmF0aW9uCj4gCj4gQW5kIGJ5IHRoZSB0aW1lIHRoaXMgZ2V0cyBtZXJn ZWQsIDIwMjMKCk9wdGltaXN0aWMhICBJJ2xsIHVwZGF0ZSB0aGF0IGluIHYzLgoKPiAKPiA+ICsg KiBBdXRob3JzOiBSdXNzZWxsIEN1cnJleQo+ID4gKyAqwqDCoMKgwqDCoMKgwqDCoMKgIEFuZHJl dyBEb25uZWxsYW4KPiA+ICsgKsKgwqDCoMKgwqDCoMKgwqDCoCBOYXluYSBKYWluCj4gPiArICov Cj4gPiArCj4gPiArI2RlZmluZSBwcl9mbXQoZm10KSAic2VjdmFyOiAiZm10Cj4gPiArCj4gPiAr I2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Cj4g PiArI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4K PiA+ICsjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2tvYmpl Y3QuaD4KPiA+ICsjaW5jbHVkZSA8YXNtL3NlY3Zhci5oPgo+ID4gKyNpbmNsdWRlICJwbHBrcy5o Igo+ID4gKwo+ID4gKy8vIENvbmZpZyBhdHRyaWJ1dGVzIGZvciBzeXNmcwo+ID4gKyNkZWZpbmUg UExQS1NfQ09ORklHX0FUVFIobmFtZSwgZm10LCBmdW5jKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoFwKPiA+ICvCoMKgwqDCoMKgwqDCoHN0YXRpYyBzc2l6ZV90IG5h bWUjI19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLMKgwqDCoMKgwqDCoMKgwqBcCj4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0cizCoFwKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2hh ciAqYnVmKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ID4gK8KgwqDC oMKgwqDCoMKge8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgXAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBzeXNmc19l bWl0KGJ1ZiwgZm10LCBmdW5jKCkpO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiA+ICvCoMKg wqDCoMKgwqDCoH3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoFwKPiA+ICvCoMKgwqDCoMKgwqDCoHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUg YXR0cl8jI25hbWUgPSBfX0FUVFJfUk8obmFtZSkKPiA+ICsKPiA+ICtQTFBLU19DT05GSUdfQVRU Uih2ZXJzaW9uLCAiJXVcbiIsIHBscGtzX2dldF92ZXJzaW9uKTsKPiA+ICtQTFBLU19DT05GSUdf QVRUUihtYXhfb2JqZWN0X3NpemUsICIldVxuIiwKPiA+IHBscGtzX2dldF9tYXhvYmplY3RzaXpl KTsKPiA+ICtQTFBLU19DT05GSUdfQVRUUih0b3RhbF9zaXplLCAiJXVcbiIsIHBscGtzX2dldF90 b3RhbHNpemUpOwo+ID4gK1BMUEtTX0NPTkZJR19BVFRSKHVzZWRfc3BhY2UsICIldVxuIiwgcGxw a3NfZ2V0X3VzZWRzcGFjZSk7Cj4gPiArUExQS1NfQ09ORklHX0FUVFIoc3VwcG9ydGVkX3BvbGlj aWVzLCAiJTA4eFxuIiwKPiA+IHBscGtzX2dldF9zdXBwb3J0ZWRwb2xpY2llcyk7Cj4gPiArUExQ S1NfQ09ORklHX0FUVFIoc2lnbmVkX3VwZGF0ZV9hbGdvcml0aG1zLCAiJTAxNmxseFxuIiwKPiA+ IHBscGtzX2dldF9zaWduZWR1cGRhdGVhbGdvcml0aG1zKTsKPiA+ICsKPiA+ICtzdGF0aWMgY29u c3Qgc3RydWN0IGF0dHJpYnV0ZSAqY29uZmlnX2F0dHJzW10gPSB7Cj4gPiArwqDCoMKgwqDCoMKg wqAmYXR0cl92ZXJzaW9uLmF0dHIsCj4gPiArwqDCoMKgwqDCoMKgwqAmYXR0cl9tYXhfb2JqZWN0 X3NpemUuYXR0ciwKPiA+ICvCoMKgwqDCoMKgwqDCoCZhdHRyX3RvdGFsX3NpemUuYXR0ciwKPiA+ ICvCoMKgwqDCoMKgwqDCoCZhdHRyX3VzZWRfc3BhY2UuYXR0ciwKPiA+ICvCoMKgwqDCoMKgwqDC oCZhdHRyX3N1cHBvcnRlZF9wb2xpY2llcy5hdHRyLAo+ID4gK8KgwqDCoMKgwqDCoMKgJmF0dHJf c2lnbmVkX3VwZGF0ZV9hbGdvcml0aG1zLmF0dHIsCj4gPiArwqDCoMKgwqDCoMKgwqBOVUxMLAo+ ID4gK307Cj4gPiArCj4gPiArc3RhdGljIHUxNiBnZXRfdWNzMm5hbWUoY29uc3QgY2hhciAqbmFt ZSwgdWludDhfdCAqKnVjczJfbmFtZSkKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBpbnQgbmFt ZWxlbiA9IHN0cmxlbihuYW1lKSAqIDI7Cj4gPiArwqDCoMKgwqDCoMKgwqAqdWNzMl9uYW1lID0g a3phbGxvYyhuYW1lbGVuLCBHRlBfS0VSTkVMKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGlm ICghKnVjczJfbmFtZSkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4g MDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGZvciAoaW50IGkgPSAwOyBuYW1lW2ldOyBpKysp IHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAoKnVjczJfbmFtZSlbaSAqIDJd ID0gbmFtZVtpXTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAoKnVjczJfbmFt ZSlbaSAqIDIgKyAxXSA9ICdcMCc7Cj4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDC oMKgwqDCoMKgwqByZXR1cm4gbmFtZWxlbjsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHUzMiBn ZXRfcG9saWN5KGNvbnN0IGNoYXIgKm5hbWUpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgaWYg KChzdHJjbXAobmFtZSwgImRiIikgPT0gMCkgfHwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCAo c3RyY21wKG5hbWUsICJkYngiKSA9PSAwKSB8fAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgIChz dHJjbXAobmFtZSwgImdydWJkYiIpID09IDApIHx8Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqAg KHN0cmNtcChuYW1lLCAic2JhdCIpID09IDApKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHJldHVybiAoV09STERSRUFEQUJMRSB8IFNJR05FRFVQREFURSk7Cj4gPiArwqDCoMKg wqDCoMKgwqBlbHNlCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIFNJ R05FRFVQREFURTsKPiA+ICt9Cj4gPiArCj4gPiArI2RlZmluZSBQTFBLU19TRUNWQVJfQ09VTlQg OAo+ID4gK3N0YXRpYyBjaGFyICp2YXJfbmFtZXNbUExQS1NfU0VDVkFSX0NPVU5UXSA9IHsKPiA+ ICvCoMKgwqDCoMKgwqDCoCJQSyIsCj4gPiArwqDCoMKgwqDCoMKgwqAiS0VLIiwKPiA+ICvCoMKg wqDCoMKgwqDCoCJkYiIsCj4gPiArwqDCoMKgwqDCoMKgwqAiZGJ4IiwKPiA+ICvCoMKgwqDCoMKg wqDCoCJncnViZGIiLAo+ID4gK8KgwqDCoMKgwqDCoMKgInNiYXQiLAo+ID4gK8KgwqDCoMKgwqDC oMKgIm1vZHVsZWRiIiwKPiA+ICvCoMKgwqDCoMKgwqDCoCJ0cnVzdGVkY2FkYiIsCj4gPiArfTsK PiA+ICsKPiA+ICtzdGF0aWMgaW50IHBscGtzX2dldF92YXJpYWJsZShjb25zdCBjaGFyICprZXks IHVpbnQ2NF90IGtleV9sZW4sCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdTggKmRhdGEsIHVpbnQ2NF90ICpkYXRhX3NpemUpCj4g PiArewo+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IHBscGtzX3ZhciB2YXIgPSB7MH07Cj4gPiAr wqDCoMKgwqDCoMKgwqB1MTYgdWNzMl9uYW1lbGVuOwo+ID4gK8KgwqDCoMKgwqDCoMKgdTggKnVj czJfbmFtZTsKPiA+ICvCoMKgwqDCoMKgwqDCoGludCByYyA9IDA7Cj4gPiArCj4gPiArwqDCoMKg wqDCoMKgwqB1Y3MyX25hbWVsZW4gPSBnZXRfdWNzMm5hbWUoa2V5LCAmdWNzMl9uYW1lKTsKPiA+ ICvCoMKgwqDCoMKgwqDCoGlmICghdWNzMl9uYW1lbGVuKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiAtRU5PTUVNOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgdmFy Lm5hbWUgPSB1Y3MyX25hbWU7Cj4gPiArwqDCoMKgwqDCoMKgwqB2YXIubmFtZWxlbiA9IHVjczJf bmFtZWxlbjsKPiA+ICvCoMKgwqDCoMKgwqDCoHZhci5vcyA9IFBMUEtTX1ZBUl9MSU5VWDsKPiA+ ICvCoMKgwqDCoMKgwqDCoHJjID0gcGxwa3NfcmVhZF9vc192YXIoJnZhcik7Cj4gPiArCj4gPiAr wqDCoMKgwqDCoMKgwqBpZiAocmMpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg Z290byBlcnI7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAqZGF0YV9zaXplID0gdmFyLmRhdGFs ZW4gKyBzaXplb2YodmFyLnBvbGljeSk7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAvLyBXZSBj YW4gYmUgY2FsbGVkIHdpdGggZGF0YSA9IE5VTEwgdG8ganVzdCBnZXQgdGhlIG9iamVjdAo+ID4g c2l6ZS4KPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChkYXRhKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgbWVtY3B5KGRhdGEsICZ2YXIucG9saWN5LCBzaXplb2YodmFyLnBvbGlj eSkpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1lbWNweShkYXRhICsgc2l6 ZW9mKHZhci5wb2xpY3kpLCB2YXIuZGF0YSwKPiA+IHZhci5kYXRhbGVuKTsKPiA+ICvCoMKgwqDC oMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGtmcmVlKHZhci5kYXRhKTsKPiA+ICtl cnI6Cj4gPiArwqDCoMKgwqDCoMKgwqBrZnJlZSh1Y3MyX25hbWUpOwo+ID4gK8KgwqDCoMKgwqDC oMKgcmV0dXJuIHJjOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IHBscGtzX3NldF92YXJp YWJsZShjb25zdCBjaGFyICprZXksIHVpbnQ2NF90IGtleV9sZW4sCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdTggKmRhdGEsIHVp bnQ2NF90IGRhdGFfc2l6ZSkKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgcGxwa3Nf dmFyIHZhciA9IHswfTsKPiA+ICvCoMKgwqDCoMKgwqDCoHUxNiB1Y3MyX25hbWVsZW47Cj4gPiAr wqDCoMKgwqDCoMKgwqB1OCAqdWNzMl9uYW1lOwo+ID4gK8KgwqDCoMKgwqDCoMKgaW50IHJjID0g MDsKPiA+ICvCoMKgwqDCoMKgwqDCoHU2NCBmbGFnczsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDC oC8vIFNlY3VyZSB2YXJpYWJsZXMgbmVlZCB0byBiZSBwcmVmaXhlZCB3aXRoIDggYnl0ZXMgb2YK PiA+IGZsYWdzLgo+ID4gK8KgwqDCoMKgwqDCoMKgLy8gV2Ugb25seSB3YW50IHRvIHBlcmZvcm0g dGhlIHdyaXRlIGlmIHdlIGhhdmUgYXQgbGVhc3QKPiA+IG9uZQo+ID4gYnl0ZSBvZiBkYXRhLgo+ ID4gK8KgwqDCoMKgwqDCoMKgaWYgKGRhdGFfc2l6ZSA8PSBzaXplb2YoZmxhZ3MpKQo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUlOVkFMOwo+ID4gKwo+ID4gK8Kg wqDCoMKgwqDCoMKgdWNzMl9uYW1lbGVuID0gZ2V0X3VjczJuYW1lKGtleSwgJnVjczJfbmFtZSk7 Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoIXVjczJfbmFtZWxlbikKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVOT01FTTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDC oG1lbWNweSgmZmxhZ3MsIGRhdGEsIHNpemVvZihmbGFncykpOwo+ID4gKwo+ID4gK8KgwqDCoMKg wqDCoMKgdmFyLmRhdGFsZW4gPSBkYXRhX3NpemUgLSBzaXplb2YoZmxhZ3MpOwo+ID4gK8KgwqDC oMKgwqDCoMKgdmFyLmRhdGEgPSBremFsbG9jKHZhci5kYXRhbGVuLCBHRlBfS0VSTkVMKTsKPiA+ ICvCoMKgwqDCoMKgwqDCoGlmICghdmFyLmRhdGEpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqByYyA9IC1FTk9NRU07Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgZ290byBlcnI7Cj4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKg wqBtZW1jcHkodmFyLmRhdGEsIGRhdGEgKyBzaXplb2YoZmxhZ3MpLCB2YXIuZGF0YWxlbik7Cj4g PiArCj4gPiArwqDCoMKgwqDCoMKgwqB2YXIubmFtZSA9IHVjczJfbmFtZTsKPiA+ICvCoMKgwqDC oMKgwqDCoHZhci5uYW1lbGVuID0gdWNzMl9uYW1lbGVuOwo+ID4gK8KgwqDCoMKgwqDCoMKgdmFy Lm9zID0gUExQS1NfVkFSX0xJTlVYOwo+ID4gK8KgwqDCoMKgwqDCoMKgdmFyLnBvbGljeSA9IGdl dF9wb2xpY3koa2V5KTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJjID0gcGxwa3Nfc2lnbmVk X3VwZGF0ZV92YXIodmFyLCBmbGFncyk7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBrZnJlZSh2 YXIuZGF0YSk7Cj4gPiArZXJyOgo+ID4gK8KgwqDCoMKgwqDCoMKga2ZyZWUodWNzMl9uYW1lKTsK PiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiByYzsKPiA+ICt9Cj4gPiArCj4gPiArLyoKPiA+ICsg KiBnZXRfbmV4dCgpIGluIHRoZSBzZWN2YXIgQVBJIGlzIGRlc2lnbmVkIGZvciB0aGUgT1BBTCBB UEkuCj4gPiArICogSWYgKmtleSBpcyAwLCBpdCByZXR1cm5zIHRoZSBmaXJzdCB2YXJpYWJsZSBp biB0aGUga2V5c3RvcmUuCj4gPiArICogT3RoZXJ3aXNlLCB5b3UgcGFzcyB0aGUgbmFtZSBvZiBh IGtleSBhbmQgaXQgcmV0dXJucyBuZXh0IGluCj4gPiBsaW5lLgo+ID4gKyAqCj4gPiArICogV2Un cmUgZ29pbmcgdG8gY2hlYXQgaGVyZSAtIHNpbmNlIHdlIGhhdmUgZml4ZWQga2V5cyBhbmQgZG9u J3QKPiA+IGNhcmUgYWJvdXQKPiA+ICsgKiBrZXlfbGVuLCB3ZSBjYW4ganVzdCB1c2UgaXQgYXMg YW4gaW5kZXguCj4gCj4gVGhpcyBpcyBraW5kYSBncm9zcy4KCkl0J3MgZ3Jvc3MsIGJ1dCBpdCdz IHJlYWxseSBzaW1wbGUgYW5kIG1lYW5zIHdlIGRvbid0IGVpdGhlciBoYXZlIHRvCmhhdmUgdHdv IG9wcyBmb3IgdGhlIHNhbWUgdGhpbmcgKGdldHRpbmcgYWxsIHRoZSB2YXJpYWJsZXMpIG9yIHJl d29yawpwb3dlcm52IHRvIGJldHRlciBmaXQgcHNlcmllcy4gIE9wZW4gdG8gc3VnZ2VzdGlvbnMg b24gb3RoZXIgd2F5cyB0byBkbwppdCwgdGhpcyBpcyBqdXN0IHRoZSBiZXN0IEkgY2FtZSB1cCB3 aXRoLgoKPiAKPiA+ICsgKi8KPiAKPiBJbmNvbnNpc3RlbnQgY29tbWVudCBzdHlsZQoKVHJ1ZSwg SSdtIHVzaW5nIC8vIGZvciBtdWx0aS1saW5lIGNvbW1lbnRzIGluIG90aGVyIHBsYWNlcy4gIEkg dGhpbmsgbXkKYnJhaW4gZGVjaWRlZCB0aGF0IHRoaXMgb25lIHdhcyB0b28gbG9uZyBmb3IgdGhh dCwgYnV0IEknbGwgbWFrZSB0aGUKb3RoZXIgbXVsdGktbGluZSBjb21tZW50cyBzaW1pbGFybHkg b2xkLWZhc2hpb25lZCBmb3IgY29uc2lzdGVuY3kuCgo+IAo+ID4gK3N0YXRpYyBpbnQgcGxwa3Nf Z2V0X25leHRfdmFyaWFibGUoY29uc3QgY2hhciAqa2V5LCB1aW50NjRfdAo+ID4gKmtleV9sZW4s IHVpbnQ2NF90IGtleWJ1ZnNpemUpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKCFrZXkg fHwgIWtleV9sZW4pCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1F SU5WQUw7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoKmtleV9sZW4gPj0gUExQS1NfU0VD VkFSX0NPVU5UKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5P RU5UOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKHN0cnNjcHkoKGNoYXIgKilrZXksIHZh cl9uYW1lc1soKmtleV9sZW4pKytdLAo+ID4ga2V5YnVmc2l6ZSkKPiA+IDwgMCkKPiAKPiBOb3Qg c3VyZSBob3cgSSBmZWVsIGFib3V0IHRoZSBpbmNyZW1lbnQgYmVpbmcgYnVyaWVkIGluIGhlcmUK ClllYWggdGhpcyBpcyBkZWZpbml0ZWx5IG1vcmUgY2xldmVyIHRoYW4gY2xlYXIsIEknbGwgc2Vw YXJhdGUgdGhlCmluY3JlbWVudC4KCkNoZWVycyBmb3IgdGhlIHJldmlldyAoYW5kIGZvciB5b3Vy IGNvbnRyaWJ1dGlvbnMgb2J2aW91c2x5KQoKPiAKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqByZXR1cm4gLUUyQklHOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIDA7 Cj4gPiArfQo+ID4gKwo+ID4gKy8vIFBMUEtTIGR5bmFtaWMgc2VjdXJlIGJvb3QgZG9lc24ndCBn aXZlIHVzIGEgZm9ybWF0IHN0cmluZyBpbgo+ID4gdGhlCj4gPiBzYW1lIHdheSBPUEFMIGRvZXMu Cj4gPiArLy8gSW5zdGVhZCwgcmVwb3J0IHRoZSBmb3JtYXQgdXNpbmcgdGhlIFNCX1ZFUlNJT04g dmFyaWFibGUgaW4gdGhlCj4gPiBrZXlzdG9yZS4KPiA+ICtzdGF0aWMgc3NpemVfdCBwbHBrc19z ZWN2YXJfZm9ybWF0KGNoYXIgKmJ1ZikKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qg cGxwa3NfdmFyIHZhciA9IHswfTsKPiA+ICvCoMKgwqDCoMKgwqDCoHNzaXplX3QgcmV0Owo+ID4g Kwo+ID4gK8KgwqDCoMKgwqDCoMKgdmFyLmNvbXBvbmVudCA9IE5VTEw7Cj4gPiArwqDCoMKgwqDC oMKgwqAvLyBPbmx5IHRoZSBzaWduZWQgdmFyaWFibGVzIGhhdmUgdWNzMi1lbmNvZGVkIG5hbWVz LCB0aGlzCj4gPiBvbmUgZG9lc24ndAo+ID4gK8KgwqDCoMKgwqDCoMKgdmFyLm5hbWUgPSAiU0Jf VkVSU0lPTiI7Cj4gPiArwqDCoMKgwqDCoMKgwqB2YXIubmFtZWxlbiA9IDEwOwo+ID4gK8KgwqDC oMKgwqDCoMKgdmFyLmRhdGFsZW4gPSAwOwo+ID4gK8KgwqDCoMKgwqDCoMKgdmFyLmRhdGEgPSBO VUxMOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgLy8gVW5saWtlIHRoZSBvdGhlciB2YXJzLCBT Ql9WRVJTSU9OIGlzIG93bmVkIGJ5IGZpcm13YXJlCj4gPiBpbnN0ZWFkIG9mIHRoZSBPUwo+ID4g K8KgwqDCoMKgwqDCoMKgcmV0ID0gcGxwa3NfcmVhZF9md192YXIoJnZhcik7Cj4gPiArwqDCoMKg wqDCoMKgwqBpZiAocmV0KSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg KHJldCA9PSAtRU5PRU5UKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqByZXR1cm4gc3lzZnNfZW1pdChidWYsICJpYm0scGxwa3Mtc2ItCj4gPiB1bmtu b3duXG4iKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcl9lcnIo IkVycm9yICVsZCByZWFkaW5nIFNCX1ZFUlNJT04gZnJvbQo+ID4gZmlybXdhcmVcbiIsIHJldCk7 Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJldDsKPiA+ICvCoMKg wqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoC8vIEh5cGVydmlzb3IgZGVmaW5l cyBTQl9WRVJTSU9OIGFzIGEgIjEgYnl0ZSB1bnNpZ25lZAo+ID4gaW50ZWdlciB2YWx1ZSIKPiA+ ICvCoMKgwqDCoMKgwqDCoHJldCA9IHN5c2ZzX2VtaXQoYnVmLCAiaWJtLHBscGtzLXNiLSVoaHVc biIsIHZhci5kYXRhWzBdKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGtmcmVlKHZhci5kYXRh KTsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgcGxwa3NfbWF4X3NpemUodWludDY0X3QgKm1heF9zaXplKQo+ID4gK3sKPiA+ICvCoMKg wqDCoMKgwqDCoC8vIFRoZSBtYXggb2JqZWN0IHNpemUgcmVwb3J0ZWQgYnkgdGhlIGh5cGVydmlz b3IgaXMKPiA+IGFjY3VyYXRlCj4gPiBmb3IgdGhlCj4gPiArwqDCoMKgwqDCoMKgwqAvLyBvYmpl Y3QgaXRzZWxmLCBidXQgd2UgdXNlIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIGRhdGEgb24KPiA+IHdy aXRlIGFzIHRoZQo+ID4gK8KgwqDCoMKgwqDCoMKgLy8gc2lnbmVkIHVwZGF0ZSBmbGFncywgc28g dGhlIG1heCBzaXplIGEgdXNlciBjYW4gd3JpdGUgaXMKPiA+IGxhcmdlci4KPiA+ICvCoMKgwqDC oMKgwqDCoCptYXhfc2l6ZSA9ICh1aW50NjRfdClwbHBrc19nZXRfbWF4b2JqZWN0c2l6ZSgpICsg ODsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICsK PiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHNlY3Zhcl9vcGVyYXRpb25zIHBscGtzX3NlY3Zhcl9v cHMgPSB7Cj4gPiArwqDCoMKgwqDCoMKgwqAuZ2V0ID0gcGxwa3NfZ2V0X3ZhcmlhYmxlLAo+ID4g K8KgwqDCoMKgwqDCoMKgLmdldF9uZXh0ID0gcGxwa3NfZ2V0X25leHRfdmFyaWFibGUsCj4gPiAr wqDCoMKgwqDCoMKgwqAuc2V0ID0gcGxwa3Nfc2V0X3ZhcmlhYmxlLAo+ID4gK8KgwqDCoMKgwqDC oMKgLmZvcm1hdCA9IHBscGtzX3NlY3Zhcl9mb3JtYXQsCj4gPiArwqDCoMKgwqDCoMKgwqAubWF4 X3NpemUgPSBwbHBrc19tYXhfc2l6ZSwKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgcGxw a3Nfc2VjdmFyX2luaXQodm9pZCkKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoIXBscGtz X2lzX2F2YWlsYWJsZSgpKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVy biAtRU5PREVWOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgc2V0X3NlY3Zhcl9vcHMoJnBscGtz X3NlY3Zhcl9vcHMpOwo+ID4gK8KgwqDCoMKgwqDCoMKgc2V0X3NlY3Zhcl9jb25maWdfYXR0cnMo Y29uZmlnX2F0dHJzKTsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gK30KPiA+ICtk ZXZpY2VfaW5pdGNhbGwocGxwa3Nfc2VjdmFyX2luaXQpOwo+IAoK