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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 0F96ED2125F for ; Thu, 17 Oct 2024 09:04:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:MIME-Version: Content-Transfer-Encoding:Content-Type:References:In-Reply-To:Date:Cc:To:From :Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=59r2IUj3CghKGBZaqUZN+FYiHMfql5ExuTEAx2bhMzg=; b=OUE6y5ouIRfTQb99O3OC/IasC4 IW0jreEsA76lk72hEQTtBKvhQxGHgWPef1VT5UY8bLfS9R6Gon7hakg36pYm2O4GK2XaFUaLcSjMS ncUX59lSZR3+an7a5sAOG3NOg9Y8As7WV2Hga+a6O6oaOeibuRVYFdeRdRY158V3V1rSxdfMg1Gpb mH7oh3xwAp/hYiXQ/FdlN2RB3/30/8kwG0ALv8s3Y5nh18Afb2UGt3ekOd7UmvlFZTKMA8gFuzF3I nh2FO6QMIO5zjIvSUiHAocnTFdwFVT+RTpl52DzLIU/gzq6neiSTrdDkyQzOgx49vtxG4AVxygVsc xnKm8q2A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1t1MR9-0000000EGvB-10uM; Thu, 17 Oct 2024 09:04:51 +0000 Received: from s3.sipsolutions.net ([2a01:4f8:242:246e::2] helo=sipsolutions.net) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1t1MOE-0000000EGT1-1W2g for linux-um@lists.infradead.org; Thu, 17 Oct 2024 09:01:55 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sipsolutions.net; s=mail; h=MIME-Version:Content-Transfer-Encoding: Content-Type:References:In-Reply-To:Date:Cc:To:From:Subject:Message-ID:Sender :Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-To: Resent-Cc:Resent-Message-ID; bh=59r2IUj3CghKGBZaqUZN+FYiHMfql5ExuTEAx2bhMzg=; t=1729155708; x=1730365308; b=qXYGVzyzv+9g93J5kUnG4F7hMwimjQcoj7YV0hvt1rUARSe wlhKoiNSo1wcKClFIyZ6QTzNn6kHvu9N9DvGYhEPYKo8sSV1YTLfRmZPUBqhn8FCDKEk5UKDinvx5 aMw/l4z/RHg180qhC+dYLB70DhbCZhAFDEid7C3TBeKz0yNPDYY/t2UoH+TQk0M2P9OnWb8pmkcRL rLazwnWNoFcSd3NJkvbM7J2nwxUTfKt6f4t9DUatHTXWYKW8vSyz3LaXc6WmCPMIu6ueAb7gFcvXq nKg70K7Dx4SKXMhq1ZtuIaxUhyopeZM5uCh2dIgkgd8CWwUbsaudRbkmcEWWe1YQ==; Received: by sipsolutions.net with esmtpsa (TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.98) (envelope-from ) id 1t1MO8-0000000Dpac-0S9U; Thu, 17 Oct 2024 11:01:44 +0200 Message-ID: Subject: Re: [PATCH v9 02/10] um: use execveat to create userspace MMs From: Benjamin Berg To: David Gow Cc: linux-um@lists.infradead.org, KUnit Development , Kees Cook Date: Thu, 17 Oct 2024 11:01:39 +0200 In-Reply-To: References: <20240919124511.282088-1-benjamin@sipsolutions.net> <20240919124511.282088-3-benjamin@sipsolutions.net> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.52.4 (3.52.4-1.fc40) MIME-Version: 1.0 X-malware-bazaar: not-scanned X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20241017_020150_799929_D21EF700 X-CRM114-Status: GOOD ( 36.37 ) X-BeenThere: linux-um@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-um" Errors-To: linux-um-bounces+linux-um=archiver.kernel.org@lists.infradead.org SGksCgpPbiBUaHUsIDIwMjQtMTAtMTcgYXQgMTU6MTcgKzA4MDAsIERhdmlkIEdvdyB3cm90ZToK PiBPbiBUaHUsIDE5IFNlcHQgMjAyNCBhdCAyMDo0NSwgQmVuamFtaW4gQmVyZyA8YmVuamFtaW5A c2lwc29sdXRpb25zLm5ldD4gd3JvdGU6Cj4gPiAKPiA+IFtTTklQXQo+IAo+IEl0IHR1cm5zIG91 dCB0aGF0IHRoaXMgYnJlYWtzIHRoZSBLVW5pdCB1c2VyIGFsbG9jIGhlbHBlcnMgb24geDg2XzY0 LAo+IGF0IGxlYXN0IG9uIG15IG1hY2hpbmUuCj4gCj4gVGhpcyBjYW4gYmUgcmVwcm9kdWNlZCB3 aXRoOgo+IC4vdG9vbHMvdGVzdGluZy9rdW5pdC9rdW5pdC5weSBydW4gdXNlcmNvcHkKPiAKPiBU aG91Z2ggdGhlIDMyLWJpdCB2ZXJzaW9uIHdvcmtzOgo+IC4vdG9vbHMvdGVzdGluZy9rdW5pdC9r dW5pdC5weSBydW4gdXNlcmNvcHkgLS1rY29uZmlnX2FkZCBDT05GSUdfNjRCSVQ9bgo+IAo+IFRo ZSBlcnJvciB3ZSdyZSBnZXR0aW5nIGlzOgo+IHN0YXJ0X3VzZXJzcGFjZSA6IGV4cGVjdGVkIFNJ R1NUT1AsIGdvdCBzdGF0dXMgPSAxMzkKPiBDb3VsZCBub3QgY3JlYXRlIHVzZXJzcGFjZSBtbQo+ IAo+IFRoaXMgYmFzaWNhbGx5IGlzIHRoZSByZXN1bHQgb2YgdGhlIHN0dWJfZXhlIHNlZ2ZhdWx0 aW5nIHZlcnkgZWFybHkgb24KPiBpbiBpdHMgZXhlY3V0aW9uLgo+IAo+IEl0IHNlZW1zIHRoYXQg dGhpcyBpcyBkdWUgdG8gdGhlIHN0YWNrIGJlaW5nIG1pc2FsaWduZWQsIGFuZCBzbyB0aGUKPiBn ZW5lcmF0ZWQgU1NFIGluc3RydWN0aW9ucyBhcmUgZmF1bHRpbmcuIFRoZSB3b3JrYXJvdW5kcyBJ J3ZlIHRlc3RlZAo+IGhlcmUgaW5jbHVkZToKPiBhKSBCdWlsZCB0aGUgc3R1YiB3aXRoIC1tbm8t c3NlCj4gYikgRGVjb3JhdGUgcmVhbF9pbml0KCkgd2l0aCBfX2F0dHJpYnV0ZV9fKChmb3JjZV9h bGlnbl9hcmdfcG9pbnRlcikpCj4gYykgRGVjb3JhdGUgX19zdGFydCgpIHdpdGggX19hdHRyaWJ1 dGVfXygobmFrZWQpKQo+IAo+IFRoZSBsYXN0IG9uZSBzZWVtcyB0byB2YWxpZGF0ZSBteSB0aGVv cnkgYXMgdG8gd2h5IHRoaXMgaXMgb2NjdXJyaW5nOgo+IF9fc3RhcnQncyBwcm9sb2d1ZSBpcyBt aXNhbGlnbmluZyB0aGUgc3RhY2ssIGFzIF9fc3RhcnQgaXMgbm90Cj4gYWN0dWFsbHkgX2NhbGxl ZF8gZnJvbSBhbnl0aGluZywgc28gdGhlcmUncyBubyA4LWJ5dGUgbWlzYWxpZ25tZW50IHRvCj4g aG9sZCB0aGUgcmV0dXJuIGFkZHJlc3MuCj4gCj4gSWYgdGhpcyBtYWtlcyBzZW5zZSwgSSdsbCBz ZW5kIGEgcGF0Y2ggb3V0IHdpdGggd2hpY2hldmVyIHRoZQo+IHByZWZlcnJlZCBmaXgoZXMpIGFy ZS4gTXkgZ3Vlc3MgaXMgdGhhdCAoYykgaXMgdGhlICJwcm9wZXIiIGZpeCwKPiB0aG91Z2ggSSdk IG5vdCBfbWlzc18gU1NFIGlmIHdlIGNob3NlIHRvIGRpc2FibGUgaXQgZm9yIHRoZSBoYW5kZnVs IG9mCj4gaW5zdHJ1Y3Rpb25zIGhlcmUgYW55d2F5LgoKWWVhaCwgU1NFIGlzIHBvaW50bGVzcyBo ZXJlLCBidXQgd2UgcHJvYmFibHkgc2hvdWxkIGVuc3VyZSB0aGUKYWxpZ25tZW50IGlzIGFzIGV4 cGVjdGVkLgoKU28sIGMpIHNlZW1zIGxpa2UgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGhlcmUuIEkg YW0ganVzdCBhIGJpdCBjb25mdXNlZAphYm91dCB0aGUgYWxpZ25tZW50IGd1YXJhbnRlZXMgZnJv bSB0aGUga2VybmVsLiBBcmUgd2UgY29ycmVjdCB0bwphc3N1bWUgYSAxNiBieXRlIGFsaWdubWVu dCB0aGVyZSBvciBkbyB3ZSBhbHNvIG5lZWQgYikganVzdCB0byBiZSBvbgp0aGUgc2FmZSBzaWRl PwoKVW5mb3J0dW5hdGVseSBJIGhhdmUgbm90IG1hbmFnZWQgdG8gcmVwcm9kdWNlIHRoZSBpc3N1 ZS4KCkJlbmphbWluCgo+IAo+IENoZWVycywKPiAtLSBEYXZpZAo+IAo+ID4gwqBhcmNoL3VtL01h a2VmaWxlwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDC oCAzICstCj4gPiDCoGFyY2gvdW0vaW5jbHVkZS9zaGFyZWQvc2thcy9zdHViLWRhdGEuaCB8wqAg MTEgKysKPiA+IMKgYXJjaC91bS9rZXJuZWwvc2thcy8uZ2l0aWdub3JlwqDCoMKgwqDCoMKgwqDC oMKgIHzCoMKgIDIgKwo+ID4gwqBhcmNoL3VtL2tlcm5lbC9za2FzL01ha2VmaWxlwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB8wqAgMzMgKysrKy0KPiA+IMKgYXJjaC91bS9rZXJuZWwvc2thcy9zdHVi X2V4ZS5jwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCA4OCArKysrKysrKysrKysKPiA+IMKgYXJjaC91 bS9rZXJuZWwvc2thcy9zdHViX2V4ZV9lbWJlZC5TwqDCoMKgIHzCoCAxMSArKwo+ID4gwqBhcmNo L3VtL29zLUxpbnV4L21lbS5jwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDC oCAyICstCj4gPiDCoGFyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmPCoMKgwqDCoMKgwqDC oMKgIHwgMTgxICsrKysrKysrKysrKysrKystLS0tCj4gPiAtLS0tCj4gPiDCoDggZmlsZXMgY2hh bmdlZCwgMjcxIGluc2VydGlvbnMoKyksIDYwIGRlbGV0aW9ucygtKQo+ID4gwqBjcmVhdGUgbW9k ZSAxMDA2NDQgYXJjaC91bS9rZXJuZWwvc2thcy8uZ2l0aWdub3JlCj4gPiDCoGNyZWF0ZSBtb2Rl IDEwMDY0NCBhcmNoL3VtL2tlcm5lbC9za2FzL3N0dWJfZXhlLmMKPiA+IMKgY3JlYXRlIG1vZGUg MTAwNjQ0IGFyY2gvdW0va2VybmVsL3NrYXMvc3R1Yl9leGVfZW1iZWQuUwo+ID4gCj4gPiBkaWZm IC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZSBiL2FyY2gvdW0vTWFrZWZpbGUKPiA+IGluZGV4IDAw YjYzYmFjNWVmZi4uMzFlMzY3ZThhYjRkIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC91bS9NYWtlZmls ZQo+ID4gKysrIGIvYXJjaC91bS9NYWtlZmlsZQo+ID4gQEAgLTYxLDcgKzYxLDggQEAgS0JVSUxE X0NGTEFHUyArPSAkKENGTEFHUykgJChDRkxBR1MteSkgLQo+ID4gRF9fYXJjaF91bV9fIFwKPiA+ IMKgwqDCoMKgwqDCoMKgICQoQVJDSF9JTkNMVURFKSAkKE1PREVfSU5DTFVERSkgLUR2bWFwPWtl cm5lbF92bWFwwqDCoMKgwqDCoCBcCj4gPiDCoMKgwqDCoMKgwqDCoCAtRGxvbmdqbXA9a2VybmVs X2xvbmdqbXAgLURzZXRqbXA9a2VybmVsX3NldGptcCBcCj4gPiDCoMKgwqDCoMKgwqDCoCAtRGlu NmFkZHJfbG9vcGJhY2s9a2VybmVsX2luNmFkZHJfbG9vcGJhY2sgXAo+ID4gLcKgwqDCoMKgwqDC oCAtRGluNmFkZHJfYW55PWtlcm5lbF9pbjZhZGRyX2FueSAtRHN0cnJjaHI9a2VybmVsX3N0cnJj aHIKPiA+ICvCoMKgwqDCoMKgwqAgLURpbjZhZGRyX2FueT1rZXJuZWxfaW42YWRkcl9hbnkgLURz dHJyY2hyPWtlcm5lbF9zdHJyY2hyIFwKPiA+ICvCoMKgwqDCoMKgwqAgLURfX2Nsb3NlX3Jhbmdl PWtlcm5lbF9fY2xvc2VfcmFuZ2UKPiA+IAo+ID4gwqBLQlVJTERfUlVTVEZMQUdTICs9IC1DcmVs b2NhdGlvbi1tb2RlbD1waWUKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9z aGFyZWQvc2thcy9zdHViLWRhdGEuaAo+ID4gYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3NrYXMv c3R1Yi1kYXRhLmgKPiA+IGluZGV4IDJiNmI0NDc1OWRmYS4uM2ZiZGRhNzI3MzczIDEwMDY0NAo+ ID4gLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9za2FzL3N0dWItZGF0YS5oCj4gPiArKysg Yi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3NrYXMvc3R1Yi1kYXRhLmgKPiA+IEBAIC0xMiw2ICsx MiwxNyBAQAo+ID4gwqAjaW5jbHVkZSA8YXMtbGF5b3V0Lmg+Cj4gPiDCoCNpbmNsdWRlIDxzeXNk ZXAvdGxzLmg+Cj4gPiAKPiA+ICtzdHJ1Y3Qgc3R1Yl9pbml0X2RhdGEgewo+ID4gK8KgwqDCoMKg wqDCoCB1bnNpZ25lZCBsb25nIHN0dWJfc3RhcnQ7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgIGlu dCBzdHViX2NvZGVfZmQ7Cj4gPiArwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgc3R1Yl9jb2Rl X29mZnNldDsKPiA+ICvCoMKgwqDCoMKgwqAgaW50IHN0dWJfZGF0YV9mZDsKPiA+ICvCoMKgwqDC oMKgwqAgdW5zaWduZWQgbG9uZyBzdHViX2RhdGFfb2Zmc2V0Owo+ID4gKwo+ID4gK8KgwqDCoMKg wqDCoCB1bnNpZ25lZCBsb25nIHNlZ3ZfaGFuZGxlcjsKPiA+ICt9Owo+ID4gKwo+ID4gwqAjZGVm aW5lIFNUVUJfTkVYVF9TWVNDQUxMKHMpIFwKPiA+IMKgwqDCoMKgwqDCoMKgICgoc3RydWN0IHN0 dWJfc3lzY2FsbCAqKSAoKCh1bnNpZ25lZCBsb25nKSBzKSArIChzKS0KPiA+ID5jbWRfbGVuKSkK PiA+IAo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvLmdpdGlnbm9yZQo+ID4g Yi9hcmNoL3VtL2tlcm5lbC9za2FzLy5naXRpZ25vcmUKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLmMzNDA5Y2VkMGYzOAo+ID4gLS0tIC9kZXYvbnVsbAo+ ID4gKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy8uZ2l0aWdub3JlCj4gPiBAQCAtMCwwICsxLDIg QEAKPiA+ICtzdHViX2V4ZQo+ID4gK3N0dWJfZXhlLmRiZwo+ID4gZGlmZiAtLWdpdCBhL2FyY2gv dW0va2VybmVsL3NrYXMvTWFrZWZpbGUKPiA+IGIvYXJjaC91bS9rZXJuZWwvc2thcy9NYWtlZmls ZQo+ID4gaW5kZXggNmY4NmQ1M2UzZDY5Li5mYmI2MTk2ODA1NWYgMTAwNjQ0Cj4gPiAtLS0gYS9h cmNoL3VtL2tlcm5lbC9za2FzL01ha2VmaWxlCj4gPiArKysgYi9hcmNoL3VtL2tlcm5lbC9za2Fz L01ha2VmaWxlCj4gPiBAQCAtMywxNCArMyw0MyBAQAo+ID4gwqAjIENvcHlyaWdodCAoQykgMjAw MiAtIDIwMDcgSmVmZiBEaWtlCj4gPiAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkK PiA+IMKgIwo+ID4gCj4gPiAtb2JqLXkgOj0gc3R1Yi5vIG1tdS5vIHByb2Nlc3MubyBzeXNjYWxs Lm8gdWFjY2Vzcy5vCj4gPiArb2JqLXkgOj0gc3R1Yi5vIG1tdS5vIHByb2Nlc3MubyBzeXNjYWxs Lm8gdWFjY2Vzcy5vIFwKPiA+ICvCoMKgwqDCoMKgwqDCoCBzdHViX2V4ZV9lbWJlZC5vCj4gPiAr Cj4gPiArIyBTdHViIGV4ZWN1dGFibGUKPiA+ICsKPiA+ICtzdHViX2V4ZV9vYmpzLXkgOj0gc3R1 Yl9leGUubwo+ID4gKwo+ID4gK3N0dWJfZXhlX29ianMgOj0gJChmb3JlYWNoIEYsJChzdHViX2V4 ZV9vYmpzLXkpLCQob2JqKS8kRikKPiA+ICsKPiA+ICsjIE9iamVjdCBmaWxlIGNvbnRhaW5pbmcg dGhlIEVMRiBleGVjdXRhYmxlCj4gPiArJChvYmopL3N0dWJfZXhlX2VtYmVkLm86ICQoc3JjKS9z dHViX2V4ZV9lbWJlZC5TICQob2JqKS9zdHViX2V4ZQo+ID4gKwo+ID4gKyQob2JqKS9zdHViX2V4 ZS5kYmc6ICQoc3R1Yl9leGVfb2JqcykgRk9SQ0UKPiA+ICvCoMKgwqDCoMKgwqAgJChjYWxsIGlm X2NoYW5nZWQsc3R1Yl9leGUpCj4gPiArCj4gPiArJChvYmopL3N0dWJfZXhlOiBPQkpDT1BZRkxB R1MgOj0gLVMKPiA+ICskKG9iaikvc3R1Yl9leGU6ICQob2JqKS9zdHViX2V4ZS5kYmcgRk9SQ0UK PiA+ICvCoMKgwqDCoMKgwqAgJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKPiA+ICsKPiA+ICtx dWlldF9jbWRfc3R1Yl9leGUgPSBTVFVCX0VYRSAkQAo+ID4gK8KgwqDCoMKgwqAgY21kX3N0dWJf ZXhlID0gJChDQykgLW5vc3RkbGliIC1vICRAIFwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAkKEtCVUlMRF9DRkxBR1MpICQoU1RVQl9FWEVf TERGTEFHUykgXAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICQoZmlsdGVyICUubywkXikKPiA+ICsKPiA+ICtTVFVCX0VYRV9MREZMQUdTID0g LW4gLXN0YXRpYwo+ID4gKwo+ID4gK3RhcmdldHMgKz0gc3R1Yl9leGUuZGJnIHN0dWJfZXhlICQo c3R1Yl9leGVfb2Jqcy15KQo+ID4gKwo+ID4gKyMgZW5kCj4gPiAKPiA+IMKgIyBzdHViLm8gaXMg aW4gdGhlIHN0dWIsIHNvIGl0IGNhbid0IGJlIGJ1aWx0IHdpdGggcHJvZmlsaW5nCj4gPiDCoCMg R0NDIGhhcmRlbmVkIGFsc28gYXV0by1lbmFibGVzIC1mcGljLCBidXQgd2UgbmVlZCAlZWJ4IHNv IGl0Cj4gPiBjYW4ndCB3b3JrIC0+Cj4gPiDCoCMgZGlzYWJsZSBpdAo+ID4gCj4gPiDCoENGTEFH U19zdHViLm8gOj0gJChDRkxBR1NfTk9fSEFSREVOSU5HKQo+ID4gLVVOUFJPRklMRV9PQkpTIDo9 IHN0dWIubwo+ID4gK0NGTEFHU19zdHViX2V4ZS5vIDo9ICQoQ0ZMQUdTX05PX0hBUkRFTklORykK PiA+ICtVTlBST0ZJTEVfT0JKUyA6PSBzdHViLm8gc3R1Yl9leGUubwo+ID4gwqBLQ09WX0lOU1RS VU1FTlQgOj0gbgo+ID4gCj4gPiDCoGluY2x1ZGUgJChzcmN0cmVlKS9hcmNoL3VtL3NjcmlwdHMv TWFrZWZpbGUucnVsZXMKPiA+IGRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL3N0dWJf ZXhlLmMKPiA+IGIvYXJjaC91bS9rZXJuZWwvc2thcy9zdHViX2V4ZS5jCj4gPiBuZXcgZmlsZSBt b2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi5iYzZiYTJlNGQ4MDUKPiA+IC0tLSAv ZGV2L251bGwKPiA+ICsrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvc3R1Yl9leGUuYwo+ID4gQEAg LTAsMCArMSw4OCBAQAo+ID4gKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Cj4gPiArI2luY2x1ZGUg PHN5cy9wcmN0bC5oPgo+ID4gKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Cj4gPiArI2luY2x1ZGUg PHN5c2RlcC9zdHViLmg+Cj4gPiArI2luY2x1ZGUgPHN0dWItZGF0YS5oPgo+ID4gKwo+ID4gK3Zv aWQgX3N0YXJ0KHZvaWQpOwo+ID4gKwo+ID4gK25vaW5saW5lIHN0YXRpYyB2b2lkIHJlYWxfaW5p dCh2b2lkKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqAgc3RydWN0IHN0dWJfaW5pdF9kYXRhIGlu aXRfZGF0YTsKPiA+ICvCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyByZXM7Cj4gPiArwqDCoMKg wqDCoMKgIHN0cnVjdCB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2b2lkwqAg KnNzX3NwOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50wqDCoMKgIHNzX2Zs YWdzOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZV90IHNzX3NpemU7Cj4g PiArwqDCoMKgwqDCoMKgIH0gc3RhY2sgPSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAuc3Nfc2l6ZSA9IFNUVUJfREFUQV9QQUdFUyAqIFVNX0tFUk5fUEFHRV9TSVpFLAo+ID4g K8KgwqDCoMKgwqDCoCB9Owo+ID4gK8KgwqDCoMKgwqDCoCBzdHJ1Y3Qgewo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCAqc2FfaGFuZGxlcl87Cj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIHNhX2ZsYWdzOwo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgdm9pZCAqc2FfcmVzdG9yZXI7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIGxvbmcgc2FfbWFzazsKPiA+ICvCoMKgwqDCoMKg wqAgfSBzYSA9IHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIE5lZWQgdG8g c2V0IFNBX1JFU1RPUkVSIChidXQgdGhlIGhhbmRsZXIgbmV2ZXIKPiA+IHJldHVybnMpICovCj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAuc2FfZmxhZ3MgPSBTQV9PTlNUQUNLIHwg U0FfTk9ERUZFUiB8IFNBX1NJR0lORk8gfAo+ID4gMHgwNDAwMDAwMCwKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIC8qIG5vIG5lZWQgdG8gbWFzayBhbnkgc2lnbmFscyAqLwo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLnNhX21hc2sgPSAwLAo+ID4gK8KgwqDCoMKg wqDCoCB9Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoCAvKiBzZXQgYSBuaWNlIG5hbWUgKi8KPiA+ ICvCoMKgwqDCoMKgwqAgc3R1Yl9zeXNjYWxsMihfX05SX3ByY3RsLCBQUl9TRVRfTkFNRSwgKHVu c2lnbmVkIGxvbmcpInVtbC0KPiA+IHVzZXJzcGFjZSIpOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDC oCAvKiByZWFkIGluZm9ybWF0aW9uIGZyb20gU1RESU4gYW5kIGNsb3NlIGl0ICovCj4gPiArwqDC oMKgwqDCoMKgIHJlcyA9IHN0dWJfc3lzY2FsbDMoX19OUl9yZWFkLCAwLAo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHVuc2lnbmVkIGxv bmcpJmluaXRfZGF0YSwKPiA+IHNpemVvZihpbml0X2RhdGEpKTsKPiA+ICvCoMKgwqDCoMKgwqAg aWYgKHJlcyAhPSBzaXplb2YoaW5pdF9kYXRhKSkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0dWJfc3lzY2FsbDEoX19OUl9leGl0LCAxMCk7Cj4gPiArCj4gPiArwqDCoMKgwqDC oMKgIHN0dWJfc3lzY2FsbDEoX19OUl9jbG9zZSwgMCk7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKg IC8qIG1hcCBzdHViIGNvZGUgKyBkYXRhICovCj4gPiArwqDCoMKgwqDCoMKgIHJlcyA9IHN0dWJf c3lzY2FsbDYoU1RVQl9NTUFQX05SLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW5pdF9kYXRhLnN0dWJfc3RhcnQsCj4gPiBVTV9LRVJO X1BBR0VfU0laRSwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIFBST1RfUkVBRCB8IFBST1RfRVhFQywgTUFQX0ZJWEVEIHwKPiA+IE1BUF9T SEFSRUQsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpbml0X2RhdGEuc3R1Yl9jb2RlX2ZkLAo+ID4gaW5pdF9kYXRhLnN0dWJfY29kZV9v ZmZzZXQpOwo+ID4gK8KgwqDCoMKgwqDCoCBpZiAocmVzICE9IGluaXRfZGF0YS5zdHViX3N0YXJ0 KQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3R1Yl9zeXNjYWxsMShfX05SX2V4 aXQsIDExKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqAgcmVzID0gc3R1Yl9zeXNjYWxsNihTVFVC X01NQVBfTlIsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBpbml0X2RhdGEuc3R1Yl9zdGFydCArCj4gPiBVTV9LRVJOX1BBR0VfU0laRSwK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IFNUVUJfREFUQV9QQUdFUyAqIFVNX0tFUk5fUEFHRV9TSVpFLAo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgUFJPVF9SRUFEIHwgUFJPVF9X UklURSwgTUFQX0ZJWEVEIHwKPiA+IE1BUF9TSEFSRUQsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbml0X2RhdGEuc3R1Yl9kYXRhX2Zk LAo+ID4gaW5pdF9kYXRhLnN0dWJfZGF0YV9vZmZzZXQpOwo+ID4gK8KgwqDCoMKgwqDCoCBpZiAo cmVzICE9IGluaXRfZGF0YS5zdHViX3N0YXJ0ICsgVU1fS0VSTl9QQUdFX1NJWkUpCj4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHViX3N5c2NhbGwxKF9fTlJfZXhpdCwgMTIpOwo+ ID4gKwo+ID4gK8KgwqDCoMKgwqDCoCAvKiBzZXR1cCBzaWduYWwgc3RhY2sgaW5zaWRlIHN0dWIg ZGF0YSAqLwo+ID4gK8KgwqDCoMKgwqDCoCBzdGFjay5zc19zcCA9ICh2b2lkICopaW5pdF9kYXRh LnN0dWJfc3RhcnQgKwo+ID4gVU1fS0VSTl9QQUdFX1NJWkU7Cj4gPiArwqDCoMKgwqDCoMKgIHN0 dWJfc3lzY2FsbDIoX19OUl9zaWdhbHRzdGFjaywgKHVuc2lnbmVkIGxvbmcpJnN0YWNrLCAwKTsK PiA+ICsKPiA+ICvCoMKgwqDCoMKgwqAgLyogcmVnaXN0ZXIgU0lHU0VHViBoYW5kbGVyICovCj4g PiArwqDCoMKgwqDCoMKgIHNhLnNhX2hhbmRsZXJfID0gKHZvaWQgKikgaW5pdF9kYXRhLnNlZ3Zf aGFuZGxlcjsKPiA+ICvCoMKgwqDCoMKgwqAgcmVzID0gc3R1Yl9zeXNjYWxsNChfX05SX3J0X3Np Z2FjdGlvbiwgU0lHU0VHViwgKHVuc2lnbmVkCj4gPiBsb25nKSZzYSwgMCwKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVvZihzYS5z YV9tYXNrKSk7Cj4gPiArwqDCoMKgwqDCoMKgIGlmIChyZXMgIT0gMCkKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHN0dWJfc3lzY2FsbDEoX19OUl9leGl0LCAxMyk7Cj4gPiArCj4g PiArwqDCoMKgwqDCoMKgIHN0dWJfc3lzY2FsbDQoX19OUl9wdHJhY2UsIFBUUkFDRV9UUkFDRU1F LCAwLCAwLCAwKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqAgc3R1Yl9zeXNjYWxsMihfX05SX2tp bGwsIHN0dWJfc3lzY2FsbDAoX19OUl9nZXRwaWQpLAo+ID4gU0lHU1RPUCk7Cj4gPiArCj4gPiAr wqDCoMKgwqDCoMKgIHN0dWJfc3lzY2FsbDEoX19OUl9leGl0LCAxNCk7Cj4gPiArCj4gPiArwqDC oMKgwqDCoMKgIF9fYnVpbHRpbl91bnJlYWNoYWJsZSgpOwo+ID4gK30KPiA+ICsKPiA+ICt2b2lk IF9zdGFydCh2b2lkKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqAgY2hhciAqYWxsb2M7Cj4gPiAr Cj4gPiArwqDCoMKgwqDCoMKgIC8qIE1ha2UgZW5vdWdoIHNwYWNlIGZvciB0aGUgc3R1YiAoaW5j bHVkaW5nIHNwYWNlIGZvcgo+ID4gYWxpZ25tZW50KSAqLwo+ID4gK8KgwqDCoMKgwqDCoCBhbGxv YyA9IF9fYnVpbHRpbl9hbGxvY2EoKDEgKyAyICogU1RVQl9EQVRBX1BBR0VTIC0gMSkgKgo+ID4g VU1fS0VSTl9QQUdFX1NJWkUpOwo+ID4gK8KgwqDCoMKgwqDCoCBhc20gdm9sYXRpbGUoIiIgOiAi K3IsbSIoYWxsb2MpIDogOiAibWVtb3J5Iik7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgIHJlYWxf aW5pdCgpOwo+ID4gK30KPiA+IGRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL3N0dWJf ZXhlX2VtYmVkLlMKPiA+IGIvYXJjaC91bS9rZXJuZWwvc2thcy9zdHViX2V4ZV9lbWJlZC5TCj4g PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi42ZDg5MTRmYmU4 ZjEKPiA+IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvc3R1Yl9l eGVfZW1iZWQuUwo+ID4gQEAgLTAsMCArMSwxMSBAQAo+ID4gKy8qIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBHUEwtMi4wICovCj4gPiArI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KPiA+ICsjaW5j bHVkZSA8bGludXgvbGlua2FnZS5oPgo+ID4gKwo+ID4gK19fSU5JVERBVEEKPiA+ICsKPiA+ICtT WU1fREFUQV9TVEFSVChzdHViX2V4ZV9zdGFydCkKPiA+ICvCoMKgwqDCoMKgwqAgLmluY2JpbiAi YXJjaC91bS9rZXJuZWwvc2thcy9zdHViX2V4ZSIKPiA+ICtTWU1fREFUQV9FTkRfTEFCRUwoc3R1 Yl9leGVfc3RhcnQsIFNZTV9MX0dMT0JBTCwgc3R1Yl9leGVfZW5kKQo+ID4gKwo+ID4gK19fRklO SVQKPiA+IGRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L21lbS5jIGIvYXJjaC91bS9vcy1M aW51eC9tZW0uYwo+ID4gaW5kZXggY2Y0NGQzODZmMjNjLi44NTdlM2RlYWIyOTMgMTAwNjQ0Cj4g PiAtLS0gYS9hcmNoL3VtL29zLUxpbnV4L21lbS5jCj4gPiArKysgYi9hcmNoL3VtL29zLUxpbnV4 L21lbS5jCj4gPiBAQCAtNDIsNyArNDIsNyBAQCB2b2lkIGthc2FuX21hcF9tZW1vcnkodm9pZCAq c3RhcnQsIHNpemVfdCBsZW4pCj4gPiDCoH0KPiA+IAo+ID4gwqAvKiBTZXQgYnkgbWFrZV90ZW1w ZmlsZSgpIGR1cmluZyBlYXJseSBib290LiAqLwo+ID4gLXN0YXRpYyBjaGFyICp0ZW1wZGlyID0g TlVMTDsKPiA+ICtjaGFyICp0ZW1wZGlyID0gTlVMTDsKPiA+IAo+ID4gwqAvKiBDaGVjayBpZiBk aXIgaXMgb24gdG1wZnMuIFJldHVybiAwIGlmIHllcywgLTEgaWYgbm8gb3IgZXJyb3IuCj4gPiAq Lwo+ID4gwqBzdGF0aWMgaW50IF9faW5pdCBjaGVja190bXBmcyhjb25zdCBjaGFyICpkaXIpCj4g PiBkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYyBiL2FyY2gvdW0v b3MtCj4gPiBMaW51eC9za2FzL3Byb2Nlc3MuYwo+ID4gaW5kZXggYjZmNjU2YmNmZmIxLi4yY2Fh YTllODU3NTIgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5j Cj4gPiArKysgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCj4gPiBAQCAtMTAsOCAr MTAsMTEgQEAKPiA+IMKgI2luY2x1ZGUgPHNjaGVkLmg+Cj4gPiDCoCNpbmNsdWRlIDxlcnJuby5o Pgo+ID4gwqAjaW5jbHVkZSA8c3RyaW5nLmg+Cj4gPiArI2luY2x1ZGUgPGZjbnRsLmg+Cj4gPiAr I2luY2x1ZGUgPG1lbV91c2VyLmg+Cj4gPiDCoCNpbmNsdWRlIDxzeXMvbW1hbi5oPgo+ID4gwqAj aW5jbHVkZSA8c3lzL3dhaXQuaD4KPiA+ICsjaW5jbHVkZSA8c3lzL3N0YXQuaD4KPiA+IMKgI2lu Y2x1ZGUgPGFzbS91bmlzdGQuaD4KPiA+IMKgI2luY2x1ZGUgPGFzLWxheW91dC5oPgo+ID4gwqAj aW5jbHVkZSA8aW5pdC5oPgo+ID4gQEAgLTE4OSw2OSArMTkyLDEzNSBAQCBzdGF0aWMgdm9pZCBo YW5kbGVfdHJhcChpbnQgcGlkLCBzdHJ1Y3QKPiA+IHVtbF9wdF9yZWdzICpyZWdzKQo+ID4gCj4g PiDCoGV4dGVybiBjaGFyIF9fc3lzY2FsbF9zdHViX3N0YXJ0W107Cj4gPiAKPiA+IC0vKioKPiA+ IC0gKiB1c2Vyc3BhY2VfdHJhbXAoKSAtIHVzZXJzcGFjZSB0cmFtcG9saW5lCj4gPiAtICogQHN0 YWNrOsKgwqDCoMKgIHBvaW50ZXIgdG8gdGhlIG5ldyB1c2Vyc3BhY2Ugc3RhY2sgcGFnZQo+ID4g LSAqCj4gPiAtICogVGhlIHVzZXJzcGFjZSB0cmFtcG9saW5lIGlzIHVzZWQgdG8gc2V0dXAgYSBu ZXcgdXNlcnNwYWNlCj4gPiBwcm9jZXNzIGluIHN0YXJ0X3VzZXJzcGFjZSgpIGFmdGVyIGl0IHdh cyBjbG9uZSgpJ2VkLgo+ID4gLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBydW4gb24gYSB0ZW1wb3Jh cnkgc3RhY2sgcGFnZS4KPiA+IC0gKiBJdCBwdHJhY2UoKSdlcyBpdHNlbGYsIHRoZW4KPiA+IC0g KiBUd28gcGFnZXMgYXJlIG1hcHBlZCBpbnRvIHRoZSB1c2Vyc3BhY2UgYWRkcmVzcyBzcGFjZToK PiA+IC0gKiAtIFNUVUJfQ09ERSAod2l0aCBFWEVDKSwgd2hpY2ggY29udGFpbnMgdGhlIHNrYXMg c3R1YiBjb2RlCj4gPiAtICogLSBTVFVCX0RBVEEgKHdpdGggUi9XKSwgd2hpY2ggY29udGFpbnMg YSBkYXRhIHBhZ2UgdGhhdCBpcyB1c2VkCj4gPiB0byB0cmFuc2ZlciBjZXJ0YWluIGRhdGEgYmV0 d2VlbiB0aGUgVU1MIHVzZXJzcGFjZSBwcm9jZXNzIGFuZCB0aGUKPiA+IFVNTCBrZXJuZWwuCj4g PiAtICogQWxzbyBmb3IgdGhlIHVzZXJzcGFjZSBwcm9jZXNzIGEgU0lHU0VHViBoYW5kbGVyIGlz IGluc3RhbGxlZAo+ID4gdG8gY2F0Y2ggcGFnZWZhdWx0cyBpbiB0aGUgdXNlcnNwYWNlIHByb2Nl c3MuCj4gPiAtICogQW5kIGxhc3QgdGhlIHByb2Nlc3Mgc3RvcHMgaXRzZWxmIHRvIGdpdmUgY29u dHJvbCB0byB0aGUgVU1MCj4gPiBrZXJuZWwgZm9yIHRoaXMgdXNlcnNwYWNlIHByb2Nlc3MuCj4g PiAtICoKPiA+IC0gKiBSZXR1cm46IEFsd2F5cyB6ZXJvLCBvdGhlcndpc2UgdGhlIGN1cnJlbnQg dXNlcnNwYWNlIHByb2Nlc3MgaXMKPiA+IGVuZGVkIHdpdGggbm9uIG51bGwgZXhpdCgpIGNhbGwK PiA+IC0gKi8KPiA+ICtzdGF0aWMgaW50IHN0dWJfZXhlX2ZkOwo+ID4gKwo+ID4gwqBzdGF0aWMg aW50IHVzZXJzcGFjZV90cmFtcCh2b2lkICpzdGFjaykKPiA+IMKgewo+ID4gLcKgwqDCoMKgwqDC oCBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwo+ID4gLcKgwqDCoMKgwqDCoCB2b2lkICphZGRyOwo+ID4g LcKgwqDCoMKgwqDCoCBpbnQgZmQ7Cj4gPiArwqDCoMKgwqDCoMKgIGNoYXIgKmNvbnN0IGFyZ3Zb XSA9IHsgInVtbC11c2Vyc3BhY2UiLCBOVUxMIH07Cj4gPiArwqDCoMKgwqDCoMKgIGludCBwaXBl X2Zkc1syXTsKPiA+IMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQ7Cj4g PiAtwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgc2Vndl9oYW5kbGVyID0gU1RVQl9DT0RFICsK PiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICh1bnNpZ25lZCBsb25nKQo+ID4gc3R1Yl9zZWd2X2hhbmRsZXIg LQo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgKHVuc2lnbmVkIGxvbmcpCj4gPiBfX3N5c2NhbGxfc3R1Yl9z dGFydDsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqAgcHRyYWNlKFBUUkFDRV9UUkFDRU1FLCAwLCAw LCAwKTsKPiA+IC0KPiA+IC3CoMKgwqDCoMKgwqAgc2lnbmFsKFNJR1RFUk0sIFNJR19ERkwpOwo+ ID4gLcKgwqDCoMKgwqDCoCBzaWduYWwoU0lHV0lOQ0gsIFNJR19JR04pOwo+ID4gLQo+ID4gLcKg wqDCoMKgwqDCoCBmZCA9IHBoeXNfbWFwcGluZyh1bWxfdG9fcGh5cyhfX3N5c2NhbGxfc3R1Yl9z dGFydCksCj4gPiAmb2Zmc2V0KTsKPiA+IC3CoMKgwqDCoMKgwqAgYWRkciA9IG1tYXA2NCgodm9p ZCAqKSBTVFVCX0NPREUsIFVNX0tFUk5fUEFHRV9TSVpFLAo+ID4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgUFJPVF9FWEVDLCBNQVBfRklYRUQgfCBNQVBfUFJJVkFU RSwgZmQsCj4gPiBvZmZzZXQpOwo+ID4gLcKgwqDCoMKgwqDCoCBpZiAoYWRkciA9PSBNQVBfRkFJ TEVEKSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBvc19pbmZvKCJtYXBwaW5n IG1tYXAgc3R1YiBhdCAweCVseCBmYWlsZWQsIGVycm5vID0KPiA+ICVkXG4iLAo+ID4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFNUVUJfQ09ERSwgZXJybm8p Owo+ID4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXhpdCgxKTsKPiA+ICvCoMKgwqDC oMKgwqAgc3RydWN0IHN0dWJfaW5pdF9kYXRhIGluaXRfZGF0YSA9IHsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIC5zdHViX3N0YXJ0ID0gU1RVQl9TVEFSVCwKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5zZWd2X2hhbmRsZXIgPSBTVFVCX0NPREUgKwo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAodW5zaWduZWQgbG9uZykgc3R1Yl9zZWd2X2hhbmRsZXIgLQo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAodW5zaWduZWQg bG9uZykKPiA+IF9fc3lzY2FsbF9zdHViX3N0YXJ0LAo+ID4gK8KgwqDCoMKgwqDCoCB9Owo+ID4g K8KgwqDCoMKgwqDCoCBzdHJ1Y3QgaW9tZW1fcmVnaW9uICppb21lbTsKPiA+ICvCoMKgwqDCoMKg wqAgaW50IHJldDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqAgaW5pdF9kYXRhLnN0dWJfY29kZV9m ZCA9Cj4gPiBwaHlzX21hcHBpbmcodW1sX3RvX3BoeXMoX19zeXNjYWxsX3N0dWJfc3RhcnQpLAo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJm9mZnNldCk7Cj4gPiArwqDCoMKg wqDCoMKgIGluaXRfZGF0YS5zdHViX2NvZGVfb2Zmc2V0ID0gTU1BUF9PRkZTRVQob2Zmc2V0KTsK PiA+ICsKPiA+ICvCoMKgwqDCoMKgwqAgaW5pdF9kYXRhLnN0dWJfZGF0YV9mZCA9IHBoeXNfbWFw cGluZyh1bWxfdG9fcGh5cyhzdGFjayksCj4gPiAmb2Zmc2V0KTsKPiA+ICvCoMKgwqDCoMKgwqAg aW5pdF9kYXRhLnN0dWJfZGF0YV9vZmZzZXQgPSBNTUFQX09GRlNFVChvZmZzZXQpOwo+ID4gKwo+ ID4gK8KgwqDCoMKgwqDCoCAvKiBTZXQgQ0xPRVhFQyBvbiBhbGwgRkRzIGFuZCB0aGVuIHVuc2V0 IG9uIGFsbCBtZW1vcnkKPiA+IHJlbGF0ZWQgRkRzICovCj4gPiArwqDCoMKgwqDCoMKgIGNsb3Nl X3JhbmdlKDAsIH4wVSwgQ0xPU0VfUkFOR0VfQ0xPRVhFQyk7Cj4gPiArCj4gPiArwqDCoMKgwqDC oMKgIGZjbnRsKGluaXRfZGF0YS5zdHViX2RhdGFfZmQsIEZfU0VURkQsIDApOwo+ID4gK8KgwqDC oMKgwqDCoCBmb3IgKGlvbWVtID0gaW9tZW1fcmVnaW9uczsgaW9tZW07IGlvbWVtID0gaW9tZW0t Pm5leHQpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmY250bChpb21lbS0+ZmQs IEZfU0VURkQsIDApOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoCAvKiBDcmVhdGUgYSBwaXBlIGZv ciBpbml0X2RhdGEgKG5vIENMT0VYRUMpIGFuZCBkdXAyIHRvCj4gPiBTVERJTiAqLwo+ID4gK8Kg wqDCoMKgwqDCoCBpZiAocGlwZTIocGlwZV9mZHMsIDApKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgZXhpdCgyKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqAgY2xvc2UoMCk7Cj4g PiArwqDCoMKgwqDCoMKgIGlmIChkdXAyKHBpcGVfZmRzWzBdLCAwKSA8IDApIHsKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNsb3NlKHBpcGVfZmRzWzBdKTsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNsb3NlKHBpcGVfZmRzWzFdKTsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGV4aXQoMyk7Cj4gPiDCoMKgwqDCoMKgwqDCoCB9Cj4gPiArwqDC oMKgwqDCoMKgIGNsb3NlKHBpcGVfZmRzWzBdKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqAgLyog V3JpdGUgaW5pdF9kYXRhIGFuZCBjbG9zZSB3cml0ZSBzaWRlICovCj4gPiArwqDCoMKgwqDCoMKg IHJldCA9IHdyaXRlKHBpcGVfZmRzWzFdLCAmaW5pdF9kYXRhLCBzaXplb2YoaW5pdF9kYXRhKSk7 Cj4gPiArwqDCoMKgwqDCoMKgIGNsb3NlKHBpcGVfZmRzWzFdKTsKPiA+ICsKPiA+ICvCoMKgwqDC oMKgwqAgaWYgKHJldCAhPSBzaXplb2YoaW5pdF9kYXRhKSkKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGV4aXQoNCk7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgIGV4ZWN2ZWF0KHN0 dWJfZXhlX2ZkLCAiIiwgYXJndiwgTlVMTCwgQVRfRU1QVFlfUEFUSCk7Cj4gPiAKPiA+IC3CoMKg wqDCoMKgwqAgZmQgPSBwaHlzX21hcHBpbmcodW1sX3RvX3BoeXMoc3RhY2spLCAmb2Zmc2V0KTsK PiA+IC3CoMKgwqDCoMKgwqAgYWRkciA9IG1tYXAoKHZvaWQgKikgU1RVQl9EQVRBLAo+ID4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBTVFVCX0RBVEFfUEFHRVMgKiBVTV9L RVJOX1BBR0VfU0laRSwgUFJPVF9SRUFECj4gPiB8IFBST1RfV1JJVEUsCj4gPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE1BUF9GSVhFRCB8IE1BUF9TSEFSRUQsIGZkLCBv ZmZzZXQpOwo+ID4gLcKgwqDCoMKgwqDCoCBpZiAoYWRkciA9PSBNQVBfRkFJTEVEKSB7Cj4gPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBvc19pbmZvKCJtYXBwaW5nIHNlZ2ZhdWx0IHN0 YWNrIGF0IDB4JWx4IGZhaWxlZCwKPiA+IGVycm5vID0gJWRcbiIsCj4gPiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgU1RVQl9EQVRBLCBlcnJubyk7Cj4gPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBleGl0KDEpOwo+ID4gK8KgwqDCoMKgwqDCoCBl eGl0KDUpOwo+ID4gK30KPiA+ICsKPiA+ICtleHRlcm4gY2hhciBzdHViX2V4ZV9zdGFydFtdOwo+ ID4gK2V4dGVybiBjaGFyIHN0dWJfZXhlX2VuZFtdOwo+ID4gKwo+ID4gK2V4dGVybiBjaGFyICp0 ZW1wZGlyOwo+ID4gKwo+ID4gKyNkZWZpbmUgU1RVQl9FWEVfTkFNRV9URU1QTEFURSAiL3VtbC11 c2Vyc3BhY2UtWFhYWFhYIgo+ID4gKwo+ID4gKyNpZm5kZWYgTUZEX0VYRUMKPiA+ICsjZGVmaW5l IE1GRF9FWEVDIDB4MDAxMFUKPiA+ICsjZW5kaWYKPiA+ICsKPiA+ICtzdGF0aWMgaW50IF9faW5p dCBpbml0X3N0dWJfZXhlX2ZkKHZvaWQpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoCBzaXplX3Qg d3JpdHRlbiA9IDA7Cj4gPiArwqDCoMKgwqDCoMKgIGNoYXIgKnRtcGZpbGUgPSBOVUxMOwo+ID4g Kwo+ID4gK8KgwqDCoMKgwqDCoCBzdHViX2V4ZV9mZCA9IG1lbWZkX2NyZWF0ZSgidW1sLXVzZXJz cGFjZSIsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIE1GRF9FWEVDIHwgTUZEX0NMT0VYRUMgfAo+ID4gTUZEX0FM TE9XX1NFQUxJTkcpOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoCBpZiAoc3R1Yl9leGVfZmQgPCAw KSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcmludGsoVU1fS0VSTl9JTkZP ICJDb3VsZCBub3QgY3JlYXRlIGV4ZWN1dGFibGUKPiA+IG1lbWZkLCB1c2luZyB0ZW1wb3Jhcnkg ZmlsZSEiKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHRtcGZpbGUg PSBtYWxsb2Moc3RybGVuKHRlbXBkaXIpICsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cmxlbihTVFVCX0VYRV9O QU1FX1RFTVBMQVRFKSArCj4gPiAxKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGlmICh0bXBmaWxlID09IE5VTEwpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcGFuaWMoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0dWIK PiA+IGJpbmFyeSBuYW1lIik7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBzdHJjcHkodG1wZmlsZSwgdGVtcGRpcik7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBzdHJjYXQodG1wZmlsZSwgU1RVQl9FWEVfTkFNRV9URU1QTEFURSk7Cj4gPiArCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHViX2V4ZV9mZCA9IG1rc3RlbXAodG1wZmls ZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoc3R1Yl9leGVfZmQgPCAw KQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBhbmlj KCJDb3VsZCBub3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlIGZvcgo+ID4gc3R1YiBiaW5hcnk6ICVk IiwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAtZXJybm8pOwo+ID4gwqDCoMKgwqDCoMKgwqAgfQo+ID4gCj4gPiAtwqDCoMKgwqDC oMKgIHNldF9zaWdzdGFjaygodm9pZCAqKSBTVFVCX0RBVEEsIFNUVUJfREFUQV9QQUdFUyAqCj4g PiBVTV9LRVJOX1BBR0VfU0laRSk7Cj4gPiAtwqDCoMKgwqDCoMKgIHNpZ2VtcHR5c2V0KCZzYS5z YV9tYXNrKTsKPiA+IC3CoMKgwqDCoMKgwqAgc2Euc2FfZmxhZ3MgPSBTQV9PTlNUQUNLIHwgU0Ff Tk9ERUZFUiB8IFNBX1NJR0lORk87Cj4gPiAtwqDCoMKgwqDCoMKgIHNhLnNhX3NpZ2FjdGlvbiA9 ICh2b2lkICopIHNlZ3ZfaGFuZGxlcjsKPiA+IC3CoMKgwqDCoMKgwqAgc2Euc2FfcmVzdG9yZXIg PSBOVUxMOwo+ID4gLcKgwqDCoMKgwqDCoCBpZiAoc2lnYWN0aW9uKFNJR1NFR1YsICZzYSwgTlVM TCkgPCAwKSB7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBvc19pbmZvKCIlcyAt IHNldHRpbmcgU0lHU0VHViBoYW5kbGVyIGZhaWxlZCAtCj4gPiBlcnJubyA9ICVkXG4iLAo+ID4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIF9fZnVuY19fLCBl cnJubyk7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBleGl0KDEpOwo+ID4gK8Kg wqDCoMKgwqDCoCB3aGlsZSAod3JpdHRlbiA8IHN0dWJfZXhlX2VuZCAtIHN0dWJfZXhlX3N0YXJ0 KSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzc2l6ZV90IHJlcyA9IHdyaXRl KHN0dWJfZXhlX2ZkLCBzdHViX2V4ZV9zdGFydCArCj4gPiB3cml0dGVuLAo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHN0dWJfZXhlX2VuZCAtIHN0dWJfZXhlX3N0YXJ0IC0KPiA+IHdyaXR0ZW4pOwo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHJlcyA8IDApIHsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoZXJybm8gPT0gRUlOVFIpCj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGNvbnRpbnVlOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGlmICh0bXBmaWxlKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bmxpbmsodG1wZmlsZSk7Cj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGFuaWMoIkZh aWxlZCB3cml0ZSBzdHViIGJpbmFyeTogJWQiLCAtCj4gPiBlcnJubyk7Cj4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB3cml0dGVuICs9IHJlczsKPiA+ICvCoMKgwqDCoMKgwqAgfQo+ID4gKwo+ID4gK8KgwqDC oMKgwqDCoCBpZiAoIXRtcGZpbGUpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGZjbnRsKHN0dWJfZXhlX2ZkLCBGX0FERF9TRUFMUywKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIEZfU0VBTF9XUklURSB8IEZfU0VBTF9TSFJJTksgfCBGX1NF QUxfR1JPVyB8Cj4gPiBGX1NFQUxfU0VBTCk7Cj4gPiArwqDCoMKgwqDCoMKgIH0gZWxzZSB7Cj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoZmNobW9kKHN0dWJfZXhlX2ZkLCAw MDUwMCkgPCAwKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgdW5saW5rKHRtcGZpbGUpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHBhbmljKCJDb3VsZCBub3QgbWFrZSBzdHViIGJpbmFyeQo+ID4gZXhl Y3V0YWJsZTogJWQiLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIC1lcnJubyk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjbG9zZShzdHVi X2V4ZV9mZCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHViX2V4ZV9mZCA9 IG9wZW4odG1wZmlsZSwgT19SRE9OTFkgfCBPX0NMT0VYRUMgfAo+ID4gT19OT0ZPTExPVyk7Cj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoc3R1Yl9leGVfZmQgPCAwKSB7Cj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5saW5rKHRt cGZpbGUpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHBhbmljKCJDb3VsZCBub3QgcmVvcGVuIHN0dWIgYmluYXJ5OiAlZCIsIC0KPiA+IGVycm5vKTsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHVubGluayh0bXBmaWxlKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGZyZWUodG1wZmlsZSk7Cj4gPiDCoMKgwqDCoMKgwqDCoCB9Cj4gPiAKPiA+ IC3CoMKgwqDCoMKgwqAga2lsbChvc19nZXRwaWQoKSwgU0lHU1RPUCk7Cj4gPiDCoMKgwqDCoMKg wqDCoCByZXR1cm4gMDsKPiA+IMKgfQo+ID4gK19faW5pdGNhbGwoaW5pdF9zdHViX2V4ZV9mZCk7 Cj4gPiAKPiA+IMKgaW50IHVzZXJzcGFjZV9waWRbTlJfQ1BVU107Cj4gPiAKPiA+IEBAIC0yNzAs NyArMzM5LDcgQEAgaW50IHN0YXJ0X3VzZXJzcGFjZSh1bnNpZ25lZCBsb25nIHN0dWJfc3RhY2sp Cj4gPiDCoHsKPiA+IMKgwqDCoMKgwqDCoMKgIHZvaWQgKnN0YWNrOwo+ID4gwqDCoMKgwqDCoMKg wqAgdW5zaWduZWQgbG9uZyBzcDsKPiA+IC3CoMKgwqDCoMKgwqAgaW50IHBpZCwgc3RhdHVzLCBu LCBmbGFncywgZXJyOwo+ID4gK8KgwqDCoMKgwqDCoCBpbnQgcGlkLCBzdGF0dXMsIG4sIGVycjsK PiA+IAo+ID4gwqDCoMKgwqDCoMKgwqAgLyogc2V0dXAgYSB0ZW1wb3Jhcnkgc3RhY2sgcGFnZSAq Lwo+ID4gwqDCoMKgwqDCoMKgwqAgc3RhY2sgPSBtbWFwKE5VTEwsIFVNX0tFUk5fUEFHRV9TSVpF LAo+ID4gQEAgLTI4NiwxMCArMzU1LDEwIEBAIGludCBzdGFydF91c2Vyc3BhY2UodW5zaWduZWQg bG9uZyBzdHViX3N0YWNrKQo+ID4gwqDCoMKgwqDCoMKgwqAgLyogc2V0IHN0YWNrIHBvaW50ZXIg dG8gdGhlIGVuZCBvZiB0aGUgc3RhY2sgcGFnZSwgc28gaXQKPiA+IGNhbiBncm93IGRvd253YXJk cyAqLwo+ID4gwqDCoMKgwqDCoMKgwqAgc3AgPSAodW5zaWduZWQgbG9uZylzdGFjayArIFVNX0tF Uk5fUEFHRV9TSVpFOwo+ID4gCj4gPiAtwqDCoMKgwqDCoMKgIGZsYWdzID0gQ0xPTkVfRklMRVMg fCBTSUdDSExEOwo+ID4gLQo+ID4gwqDCoMKgwqDCoMKgwqAgLyogY2xvbmUgaW50byBuZXcgdXNl cnNwYWNlIHByb2Nlc3MgKi8KPiA+IC3CoMKgwqDCoMKgwqAgcGlkID0gY2xvbmUodXNlcnNwYWNl X3RyYW1wLCAodm9pZCAqKSBzcCwgZmxhZ3MsICh2b2lkICopCj4gPiBzdHViX3N0YWNrKTsKPiA+ ICvCoMKgwqDCoMKgwqAgcGlkID0gY2xvbmUodXNlcnNwYWNlX3RyYW1wLCAodm9pZCAqKSBzcCwK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQ0xPTkVfVkZPUksgfCBD TE9ORV9WTSB8IFNJR0NITEQsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICh2b2lkICopc3R1Yl9zdGFjayk7Cj4gPiDCoMKgwqDCoMKgwqDCoCBpZiAocGlkIDwgMCkg ewo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVyciA9IC1lcnJubzsKPiA+IMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcmludGsoVU1fS0VSTl9FUlIgIiVzIDogY2xv bmUgZmFpbGVkLCBlcnJubyA9Cj4gPiAlZFxuIiwKPiA+IC0tCj4gPiAyLjQ2LjAKPiA+IAo+ID4g Cgo=