From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 69254606A319 for ; Wed, 21 Oct 2026 09:33:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=TR2Gza3C; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=lanxincomputing-com.20200927.dkim.feishu.cn header.i=@lanxincomputing-com.20200927.dkim.feishu.cn header.a=rsa-sha256 header.s=s1 header.b=3Zb2qQJJ DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:References:Date:Subject:Message-Id:From :Mime-Version:Cc:To:In-Reply-To:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=el0dYFvb6hTIfGPsZyuQ9PMKroI3hi6lOfLYp2tX7fc=; b=TR2Gza3Ck35o1V ev2IAnCQIqBUM15odb8BFv4VHD8r0ZIarmbCnFYDOgL3OWbrXn2kSi95xqji4K4Zpkg17TV0pqrKX 0qtjJjZCkJ9tHINeP7fSRVoyIoQq6Hagsa1mhGyxihcpnLQ77XnFihpvPnGhfEAgxOLzqRe8icnxt xwLzV4q0sJg8uwUqOG7ELmvku78aMyW4BZGyfS1h0Nnz0ckam1chL44s3+gk8kVTHTHEKGbpV9455 2DO2TspMzMX5K5ALNcOWV2wZ2uu12PZ5XM2V57RhAJ2Sq2Ll15TA13E5vrrz2KiPORkDf+O8w/kzR R66aXdVZKsdTsRKOsw6Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1xJSgz-0000000BUsw-37A4; Wed, 21 Oct 2026 09:33:05 +0000 Received: from va-2-40.ptr.blmpb.com ([209.127.231.40]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1xJSgt-0000000BUs5-142y for linux-riscv@lists.infradead.org; Wed, 21 Oct 2026 09:33:03 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=s1; d=lanxincomputing-com.20200927.dkim.feishu.cn; t=1792575169; h=from:subject:mime-version:from:date:message-id:subject:to:cc: reply-to:content-type:mime-version:in-reply-to:message-id; bh=6ckAeucPeYJZwsv39zXkhYohTSd0rEHZZolRFbLvLvM=; b=3Zb2qQJJXu3s9mIJT+kClUcKn8eE82BAvXrHo9cB15YES/y3X966Qrb9wFqOclFlazuDf0 yCKH/i9x5RKQGiPYF6k3GWXtXU2KJ125DHcQ1W7K1EZT1gR+B7ocVR9CMwLXr6xpUA3Cx5 P9ceQflwW5cIvEdkq6O8JceX7A4RXjn4N5AxFkqeY5bVQgpHF9ThxxzSLkRT8mcjsjmdmg d9oSzvsw11PzUZOHj8d6EeCTsue37L6ycG1L4DVdGg5Qaep63SHVTl/mc2Nl+yqPkpQYce zJsyorVRQ/20uNFAqCZKPVvJdDJKzhfF/IQ3hnRibkxJjfa9XkAsSd0JRT2Ekg== In-Reply-To: User-Agent: Mozilla Thunderbird To: "guoyaxing" , "Anup Patel" Cc: "Atish Patra" , "Paul Walmsley" , "Palmer Dabbelt" , "Albert Ou" , "Alexandre Ghiti" , , , , , , X-Archived-By: Mime-Version: 1.0 Content-Language: en-US X-Original-From: BillXiang From: "BillXiang" Message-Id: X-Lms-Return-Path: Subject: Re: [PATCH] RISC-V: KVM: Flush VS-stage TLB before reusing a host CPU Date: Wed, 21 Oct 2026 17:32:44 +0800 References: <20260817102447.40259-1-guoyaxing@bosc.ac.cn> <285419e5-c4fc-4c75-a765-436165bdc8b9@bosc.ac.cn> Received: from [127.0.0.1] ([123.120.5.129]) by smtp.feishu.cn with ESMTPS; Wed, 21 Oct 2026 17:32:46 +0800 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20261021_023259_601380_131D1604 X-CRM114-Status: GOOD ( 33.19 ) X-Spam-Score: -1.9 (-) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" X-Spam-Status: No, score=-15.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 T24gMTAvMTAvMjAyNiA1OjA2IFBNLCBndW95YXhpbmcgd3JvdGU6Cj4gCj4gCj4g5ZyoIDIwMjYv MTAvMTAgMTU6NTAsIEFudXAgUGF0ZWwg5YaZ6YGTOgo+PiBPbiBTYXQsIE9jdCAxMCwgMjAyNiBh dCA0OjEy4oCvQU0gZ3VveWF4aW5nIDxndW95YXhpbmdAYm9zYy5hYy5jbj4gd3JvdGU6Cj4+Pgo+ Pj4KPj4+Cj4+PiDlnKggMjAyNi8xMC8xMCAwMjo1MSwgQW51cCBQYXRlbCDlhpnpgZM6Cj4+Pj4g T24gTW9uLCBBdWcgMTcsIDIwMjYgYXQgMTI6MjXigK9QTSBZYXhpbmcgR3VvIDxndW95YXhpbmdA Ym9zYy5hYy5jbj4gCj4+Pj4gd3JvdGU6Cj4+Pj4+Cj4+Pj4+IEd1ZXN0IExpbnV4IHVzZXMgbW1f Y3B1bWFzayB0byBkZWNpZGUgd2hldGhlciBhbiBzZmVuY2Uudm1hIG5lZWRzIAo+Pj4+PiB0byBi ZQo+Pj4+PiBsb2NhbCBvciByZW1vdGUuIFVuZGVyIEtWTSB0aGF0IG1hc2sgdHJhY2tzIGd1ZXN0 IENQVXMsIG5vdCB0aGUgCj4+Pj4+IGhvc3QgQ1BVcwo+Pj4+PiB0aGF0IHByZXZpb3VzbHkgYmFj a2VkIGEgdkNQVS4KPj4+Pj4KPj4+Pj4gVGhpcyBjYW4gbWlzcyBzdGFsZSBWUy1zdGFnZSBUTEIg ZW50cmllcyB3aGVuIGEgdkNQVSBtaWdyYXRlcyAKPj4+Pj4gYWNyb3NzIGhvc3QKPj4+Pj4gQ1BV cy4gRm9yIGV4YW1wbGU6Cj4+Pj4+Cj4+Pj4+IMKgwqDCoCAtIHZjcHUwIHJ1bnMgb24gaG9zdCBD UFUxIGFuZCBmaWxscyBhIFZTLXN0YWdlIFRMQiBlbnRyeS4KPj4+Pj4gwqDCoMKgIC0gdmNwdTAg bWlncmF0ZXMgdG8gaG9zdCBDUFUwLgo+Pj4+PiDCoMKgwqAgLSB0aGUgZ3Vlc3QgdXBkYXRlcyB0 aGUgbWFwcGluZyBvbiB2Y3B1MCBhbmQgaXNzdWVzIGEgbG9jYWwgCj4+Pj4+IHNmZW5jZS52bWEu Cj4+Pj4+IMKgwqDCoCAtIGxhdGVyLCB0aGUgZ3Vlc3QgdGFzayBydW5zIG9uIHZjcHUxIHdoaWxl IHZjcHUxIGlzIGJhY2tlZCBieSAKPj4+Pj4gaG9zdCBDUFUxLgo+Pj4+Cj4+Pj4gV2hlbiB0aGUg dmNwdTAgaXMgYnJvdWdodCBiYWNrIHRvIGhvc3QgQ1BVMSwgdGhlIAo+Pj4+IGt2bV9yaXNjdl9s b2NhbF90bGJfc2FuaXRpemUoKQo+Pj4+IHdpbGwgZW5zdXJlIFRMQiBlbnRyaWVzIGFzc29jaWF0 ZWQgd2l0aCBHdWVzdC9WTSBhcmUgbnVrZWQuCj4+Pj4KPj4+PiBCeSBkZWZhdWx0LCBrdm1fcmlz Y3ZfbG9jYWxfaGZlbmNlX2d2bWFfdm1pZF9hbGwoKSB3aWxsIG9ubHkgZG8gCj4+Pj4gSEZFTkNF LkdWTUEKPj4+PiBmb3IgdGhlIGFzc29jaWF0ZWQgVk1JRCBiZWNhdXNlIG1vc3QgUklTQy1WIEgt ZXh0ZW5zaW9uIAo+Pj4+IGltcGxlbWVuYXRpb24gd2lsbAo+Pj4+IHRhZyBWUy1zdGFnZSBUTEIg ZW50cmllcyB3aXRoIFZNSUQgYW5kIEhGRU5DRS5HVk1BIG11c3QgcmVtb3ZlIGJvdGgKPj4+PiBH LXN0YWdlIGFuZCBWUy1zdGFnZSBUTEIgZW50cmllcyBmb3IgZ2l2ZW4gVk1JRC4KPj4+Pgo+Pj4+ IElmIHlvdXIgSFcgZG9lcyBub3QgdGFnIFZTLXN0YWdlIFRMQiBlbnRlcmllcyB3aXRoIFZNSUQg dGhlbiBpdCBidWdneQo+Pj4+IC8gaW5lZmZpY2llbnQKPj4+PiBzbyB5b3UgaGF2ZSB0byBzZXQg a3ZtX3Jpc2N2X3Zzc3RhZ2VfdGxiX25vX2dwYSBpbgo+Pj4+IGt2bV9yaXNjdl9zZXR1cF92ZW5k b3JfZmVhdHVyZXMoKQo+Pj4+IGFzIHdvcmstYXJvdW5kLgo+Pj4+Cj4+Pj4gTkFDSyB0byB0aGlz IHBhdGNoIGZyb20gbXlzaWRlLgo+Pj4+Cj4+Pj4gUmVnYXJkcywKPj4+PiBBbnVwCj4+Pj4KPj4+ IEhpIEFudXAsCj4+PiDCoMKgwqAgVGhhbmtzIGZvciB0aGUgcmV2aWV3IGFuZCBjbGFyaWZpY2F0 aW9uLgo+Pj4KPj4+IMKgwqDCoCBSZWdhcmRpbmcg4oCcV2hlbiB0aGUgdmNwdTAgaXMgYnJvdWdo dCBiYWNrIHRvIGhvc3QgQ1BVMeKAnTogdGhlIGZhaWx1cmUKPj4+IHdlIGhpdCBpcyBub3QgY2F1 c2VkIGJ5IHZjcHUwIGJlaW5nIGJyb3VnaHQgYmFjayBvbnRvIGhvc3QgQ1BVMS4gSW4gb3VyCj4+ PiBjYXNlLCBhZnRlciB2Y3B1MCBoYXMgYWxyZWFkeSBtaWdyYXRlZCBhd2F5LCBuZWl0aGVyIHZD UFUgbWlncmF0ZXMKPj4+IGFnYWluLiBUaGUgZ3Vlc3QgcHJvY2VzcyBpcyBsYXRlciBzY2hlZHVs ZWQgaW5zaWRlIHRoZSBtdWx0aS12Q1BVIGd1ZXN0Cj4+PiBvbnRvIHZjcHUxLCB3aGljaCBpcyBz dGlsbCBydW5uaW5nIG9uIGhvc3QgQ1BVMS4gU28gdGhlIHN0YWxlIFRMQiBpcwo+Pj4gcmUtaGl0 IHdpdGhvdXQgYW55IGZ1cnRoZXIgS1ZNIHZDUFUgbWlncmF0aW9uLCBhbmQKPj4+IGt2bV9yaXNj dl9sb2NhbF90bGJfc2FuaXRpemUoKSBpcyBub3QgaW52b2x2ZWQgb24gdGhhdCBwYXRoLgo+Pj4K Pj4+IMKgwqDCoCBNeSBjb21taXQgbWVzc2FnZSB3YXMgYSBiaXQgdG9vIHRlcnNlIG9uIHRoaXMg cG9pbnQuIFRoZSBjb25jcmV0ZQo+Pj4gc2VxdWVuY2Ugd2Ugb2JzZXJ2ZWQgd2FzIGRlc2NyaWJl ZCBlYXJsaWVyIGluIHRoZSBSRkMgZGlzY3Vzc2lvbjoKPj4+Cj4+Pgo+Pj4gaHR0cHM6Ly9sb3Jl Lmtlcm5lbC5vcmcva3ZtLzBkMTViMDk4LWI4ZjctNDA4MC05ZjMzLSAKPj4+IGU4YzQ5YzIzMzFl MUBib3NjLmFjLmNuLwo+Pj4KPj4+IMKgwqDCoCBJbiBzaG9ydCwgdGhlIGlzc3VlIGlzOiBiZWNh dXNlIHZjcHUwIG1pZ3JhdGVkIGF3YXksIGNwdTEgc3RpbGwgaGFzCj4+PiBzdGFsZSBUTEIgZW50 cmllcyB3aGlsZSBjcHUwIGhhcyB0aGUgbmV3IG1hcHBpbmcuIEFmdGVyIHRoYXQsIG5laXRoZXIK Pj4+IHZjcHUgbWlncmF0ZWQgYWdhaW4sIGJ1dCB0aGUgcHJvY2VzcyB3YXMgc2NoZWR1bGVkIGZy b20gdmNwdTAgdG8gdmNwdTEKPj4+ICh3aGljaCBpcyBvbiBjcHUxKSwgY2F1c2luZyBpdCB0byBo aXQgdGhlIHN0YWxlIFRMQi4gQ29uc2lkZXIgdGhlCj4+PiBmb2xsb3dpbmcgc2NlbmFyaW86Cj4+ Pgo+Pj4gwqDCoMKgIDEuIHZjcHUwIGFuZCB2Y3B1MSBhcmUgYm90aCBydW5uaW5nIG9uIGNwdTEu IEF0IHRoaXMgcG9pbnQsIHZjcHUwIGlzCj4+PiBvbiBjcHUxLCBhbmQgYSBwcm9jZXNzIG9uIGl0 IHJlYWRzIGEgcGFnZSwgd2hpY2ggZ2V0cyBjYWNoZWQgaW4gdGhlIFRMQgo+Pj4gKGxldCdzIGNh bGwgdGhpcyB0aGUgInN0YWxlIFRMQiBlbnRyeSIpLgo+Pj4KPj4+IMKgwqDCoCAyLiB2Y3B1MCBt aWdyYXRlcyB0byBjcHUwLCBhbmQgdGhlbiB0aGUgcHJvY2VzcyAob24gdmNwdTAsIG5vdyBvbgo+ Pj4gY3B1MCkgZG9lcyBhIENvVyAoY29weS1vbi13cml0ZSkgYW5kIGVzdGFibGlzaGVzIGEgbmV3 IG1hcHBpbmcuCj4+Pgo+Pj4gwqDCoMKgIDMuIE5laXRoZXIgdmNwdTAgbm9yIHZjcHUxIG1pZ3Jh dGVzIGFnYWluLiBBdCB0aGlzIHBvaW50LCB0aGUgCj4+PiBwcm9jZXNzCj4+PiBnZXRzIHNjaGVk dWxlZCBpbnNpZGUgdGhlIFZNIG9udG8gdmNwdTEgKHdoaWNoIGlzIG9uIGNwdTEpLCByZWFkcyB0 aGUKPj4+IHNhbWUgcGFnZSwgYW5kIGhpdHMgdGhlIHN0YWxlIFRMQiBlbnRyeS4KPj4KPj4gVGhp cyBjYW5ub3QgaGFwcGVuIGJlY2F1c2UgaW4gc3RlcCMyIHdoZW4gbWFwcGluZyB3YXMgdXBkYXRl ZCB0aGUKPj4gR3Vlc3QgT1Mgd2lsbCBkbyBUTEIgZmx1c2ggZm9yIGFsbCBpdHMgVkNQVXMgd2hp Y2ggbWVhbnMgdmNwdTEgb24gY3B1MAo+PiB3aWxsIGFsc28gcmVjZWl2ZSBUTEIgZmx1c2ggYW5k IHRoZSBzdGFsZSBUTEIgd2lsbCBiZSByZW1vdmVkLiBUaGlzIG1lYW5zCj4+IHdoZW4gcHJvY2Vz cyBpcyBtb3ZlZCBiYWNrIHRvIHZjcHUxIG9uIGNwdTAsIEhXIHdpbGwgZmV0Y2ggdXBkYXRlZAo+ PiBQVEUgYW5kIG5ldyBUTEIgZW50cnkgd2lsbCBiZSBwb3B1bGF0ZWQuCj4+Cj4gCj4gSGkgQW51 cCwKPiAKPiBUaGFua3MgZm9yIHRoZSBmb2xsb3ctdXAuIEkgbWF5IGJlIG1pc3Npbmcgc29tZXRo aW5nLCBzbyBJIHdhbnRlZCB0byAKPiBkb3VibGUtY2hlY2sgdGhpcyBhZ2FpbnN0IHRoZSBndWVz dCBUTEIgc2hvb3Rkb3duIHBhdGguCj4gCj4gSWYgSSBmb2xsb3cgdGhlIExpbnV4IGd1ZXN0IENv VyBwYXRoIGNvcnJlY3RseSwgd2hlbiB0aGUgbWFwcGluZyBpcyAKPiB1cGRhdGVkIGluIHN0ZXAj MiBpdCBnb2VzIHRocm91Z2g6Cj4gCj4gIMKgIHdwX3BhZ2VfY29weSgpCj4gIMKgwqDCoCAtPiBw dGVwX2NsZWFyX2ZsdXNoKCkKPiAgwqDCoMKgwqDCoCAtPiBmbHVzaF90bGJfcGFnZSgpCj4gIMKg wqDCoMKgwqDCoMKgIC0+IF9fZmx1c2hfdGxiX3JhbmdlKG1tLCBtbV9jcHVtYXNrKG1tKSwgLi4u KQo+IAo+IFNvIHRoZSByZW1vdGUgU0ZFTkNFLlZNQSBhcHBlYXJzIHRvIGJlIHRhcmdldGVkIG9u bHkgYXQgQ1BVcyBpbiAKPiBtbV9jcHVtYXNrKG1tKSwgcmF0aGVyIHRoYW4gYXQgYWxsIFZDUFVz IG9mIHRoZSBndWVzdC4gbW1fY3B1bWFzayBpcyAKPiB1cGRhdGVkIGluIHN3aXRjaF9tbSgpL3Nl dF9tbSgpIGZvciBndWVzdCBDUFVzIHRoYXQgaGF2ZSBhY3R1YWxseSBydW4gCj4gdGhhdCBtbS4K PiAKPiBJbiBvdXIgY2FzZSwgYmVmb3JlIHRoZSBDb1cgdGhlIHByb2Nlc3MgaGFkIG9ubHkgZXZl ciBydW4gb24gdmNwdTAuIEZyb20gCj4gdGhlIGd1ZXN0J3MgcG9pbnQgb2YgdmlldyBpdCBkaWQg bm90IG1pZ3JhdGU6IHRoZSBob3N0IG1pZ3JhdGlvbiBvZiAKPiB2Y3B1MCBmcm9tIGNwdTEgdG8g Y3B1MCBpcyBub3QgdmlzaWJsZSB0byBndWVzdCBMaW51eCwgd2hpY2ggb25seSBzZWVzIAo+IHZD UFVzLiBTbyBhdCBDb1cgdGltZSBtbV9jcHVtYXNrIHN0aWxsIGNvbnRhaW5zIG9ubHkgdmNwdTAg KG9yIGF0IGxlYXN0IAo+IGRvZXMgbm90IGNvbnRhaW4gdmNwdTEpLCBhbmQgX19mbHVzaF90bGJf cmFuZ2UoKSB3b3VsZCBub3QgSVBJIHZjcHUxLiAKPiBUaGUgbG9jYWwgU0ZFTkNFIG9uIHZjcHUw IHdvdWxkIG9ubHkgY292ZXIgaG9zdCBjcHUwLCB3aGVyZSB2Y3B1MCBpcyAKPiBjdXJyZW50bHkg cnVubmluZy4gVGhlIHN0YWxlIFZTLXN0YWdlIFRMQiBlbnRyeSBsZWZ0IG9uIGhvc3QgY3B1MSBm cm9tIAo+IHdoZW4gdmNwdTAgcHJldmlvdXNseSByYW4gdGhlcmUgd291bGQgdGhlbiByZW1haW4u Cj4gCj4gTGF0ZXIsIHN0aWxsIHdpdGhvdXQgYW55IGZ1cnRoZXIgdkNQVSBtaWdyYXRpb24sIHRo ZSBwcm9jZXNzIGlzIAo+IHNjaGVkdWxlZCBpbnNpZGUgdGhlIGd1ZXN0IG9udG8gdmNwdTEsIHdo aWNoIHJlbWFpbnMgb24gaG9zdCBjcHUxLCBhbmQgCj4gY2FuIGhpdCB0aGF0IHN0YWxlIGVudHJ5 Lgo+IAo+IFRoaXMgYWxzbyBzZWVtcyBtb3JlIGxpa2VseSB3aGVuIHRoZSBBU0lEIGFsbG9jYXRv ciBpcyBlbmFibGVkLCBiZWNhdXNlCj4gc2V0X21tX2FzaWQoKSBkb2VzIG5vdCBhbHdheXMgbG9j YWxfZmx1c2hfdGxiX2FsbCgpIG9uIHN3aXRjaF9tbSgpLiBTbyAKPiBldmVuIHRoZSBmaXJzdCB0 aW1lIHRoZSBwcm9jZXNzIGxhbmRzIG9uIHZjcHUxLCBhIHN0YWxlIEFTSUQtdGFnZ2VkIAo+IGVu dHJ5IG9uIGhvc3QgY3B1MSBtYXkgc3RpbGwgYmUgcHJlc2VudC4KPiAKPiBJbiBvdGhlciB3b3Jk cywgSSBhbSBub3Qgc3VyZSB0aGlzIGNhc2UgaXMgY292ZXJlZCBieSBhIGZ1bGwgZ3Vlc3QgVExC IAo+IGZsdXNoIHRvIGFsbCBWQ1BVcyBvbiB0aGUgbWFwcGluZyB1cGRhdGUuIEd1ZXN0IHNob290 ZG93biBsb29rcyAKPiBtbV9jcHVtYXNrLWJhc2VkLCBhbmQgaG9zdCBwQ1BVIG1pZ3JhdGlvbiBv ZiBhIHZDUFUgZG9lcyBub3QgYnkgaXRzZWxmIAo+IGFkZCBvdGhlciB2Q1BVcyB0aGF0IG5ldmVy IHJhbiB0aGUgbW0gaW50byB0aGF0IG1hc2suCj4gCj4gVGhlIGVhcmxpZXIgUkZDIG5vdGUgaGFz IGEgYml0IG1vcmUgZGV0YWlsIG9uIHRoZSBmbG93IHdlIG9ic2VydmVkOgo+IGh0dHBzOi8vbG9y ZS5rZXJuZWwub3JnL2t2bS8wZDE1YjA5OC1iOGY3LTQwODAtOWYzMy0gCj4gZThjNDljMjMzMWUx QGJvc2MuYWMuY24vCj4gCj4gUGxlYXNlIGxldCBtZSBrbm93IGlmIEkgbWlzdW5kZXJzdG9vZCB0 aGUgaW50ZW5kZWQgaW52YWxpZGF0aW9uIHBhdGggaGVyZS4KPiAKPiBUaGFua3MsCj4gWWF4aW5n Cj4gCgpIaSBZYXhpbmcsCgpUaGFua3MgZm9yIHlvdXIgd29yay4gVG8gaGVscCByZXZpZXcgYW5k IHZhbGlkYXRlIHRoaXMgcGF0Y2gsIEkgYW0gCnNoYXJpbmcgdGhlIHR3byBwcm9ncmFtcyBiZWxv dywgd2hpY2ggd2VyZSBnZW5lcmF0ZWQgd2l0aCB0aGUgaGVscCBvZiBhbiAKQUkgYXNzaXN0YW50 LiBJIHJldmlld2VkIHRoZSBjb2RlIGFuZCByYW4gaXQgb24gbXkgdGVzdCBzeXN0ZW06IHdpdGhv dXQgCnRoaXMgcGF0Y2ggdGhlIHJlcHJvZHVjZXIgdHJpZ2dlcnMgdGhlIHN0YWxlIFZTLXN0YWdl IFRMQiBlbnRyeSwgYW5kIAp3aXRoIHRoZSBwYXRjaCBhcHBsaWVkIGl0IG5vIGxvbmdlciBkb2Vz LgoKVGhlIHRlc3QgY29uc2lzdHMgb2YgdHdvIGNvb3BlcmF0aW5nIGNvbXBvbmVudHM6CgogICAt IGEgaG9zdC1zaWRlIGNvbnRyb2xsZXIgdGhhdCBkaXNjb3ZlcnMgdGhlIFFFTVUgdkNQVSB0aHJl YWQgVElEcywKICAgICBwaW5zIHRoZW0gdG8gc3BlY2lmaWMgaG9zdCBDUFVzIHdpdGggdGFza3Nl dCgxKSwgYW5kIHN5bmNocm9uaXplcwogICAgIHdpdGggdGhlIGd1ZXN0IHByb2dyYW0gb3ZlciBU Q1A7CgogICAtIGEgZ3Vlc3Qtc2lkZSBwcm9ncmFtIHRoYXQgcGVyZm9ybXMgdGhlIG1lbW9yeSBv cGVyYXRpb25zIHRoYXQKICAgICBwb3B1bGF0ZSBhbmQgdGhlbiBwcm9iZSB0aGUgVlMtc3RhZ2Ug VExCIGVudHJpZXMuCgpTdGFydCB0aGUgaG9zdCBjb250cm9sbGVyOgoKICAgc3VkbyBweXRob24z IHZzc3RhZ2VfdGxiX3N0YWxlX2hvc3QucHkgLS1xZW11LXBpZCA8UUVNVV9QSUQ+CgpCdWlsZCBh bmQgcnVuIHRoZSBndWVzdCBwcm9ncmFtIGluc2lkZSB0aGUgZ3Vlc3Q6CgogICBnY2MgLU8wIC1v IHZzc3RhZ2VfdGxiX3N0YWxlX2d1ZXN0IHZzc3RhZ2VfdGxiX3N0YWxlX2d1ZXN0LmMKICAgLi92 c3N0YWdlX3RsYl9zdGFsZV9ndWVzdAoKVGhlIGd1ZXN0IHByb2dyYW0gY29ubmVjdHMgdG8gdGhl IGhvc3QgY29udHJvbGxlciBvbiBUQ1AgcG9ydCAxMjM0NQpieSBkZWZhdWx0LiBXaXRoIFFFTVUg dXNlciBuZXR3b3JraW5nLCB0aGUgaG9zdCBpcyByZWFjaGFibGUgZnJvbSB0aGUKZ3Vlc3QgYXQg MTAuMC4yLjIsIGFuZCB0aGUgZ3Vlc3QgcHJvZ3JhbSB1c2VzIHRoYXQgYWRkcmVzcyBieSBkZWZh dWx0LgoKQm90aCB0aGUgaG9zdCBjb250cm9sbGVyIGFuZCB0aGUgZ3Vlc3QgcHJvZ3JhbSBjYW4g YmUgd3JhcHBlZCBpbiBhCnNoZWxsIHdoaWxlIGxvb3AgdG8gcmVwcm9kdWNlIHRoZSBidWcgcmVw ZWF0ZWRseS4KClJlZ2FyZHMsCkJpbGwKCi0tLSA4PCAtLS0gdnNzdGFnZV90bGJfc3RhbGVfaG9z dC5weSAtLS0gODwgLS0tCiMhL3Vzci9iaW4vZW52IHB5dGhvbjMKIyBTUERYLUxpY2Vuc2UtSWRl bnRpZmllcjogR1BMLTIuMAoiIiIKUklTQy1WIEtWTSBzdGFsZSBWUy1zdGFnZSBUTEIgcmVwcm9k dWNlciAoSG9zdCBjb250cm9sbGVyKQoKU2NlbmFyaW86CiAgIEluaXRpYWxseSBib3RoIHZDUFUw IGFuZCB2Q1BVMSBhcmUgcGlubmVkIHRvIGhvc3QgQ1BVMS4KICAgQWZ0ZXIgcGhhc2UgMSwgdkNQ VTAgaXMgbWlncmF0ZWQgdG8gaG9zdCBDUFUwLgogICBBZnRlciBwaGFzZSAyLCB2Q1BVMSBzdGF5 cyB3aGVyZSBpdCBpcyAoaG9zdCBDUFUxKS4KICAgUGhhc2UgMyBydW5zIG9uIHZDUFUxIGFuZCBj aGVja3MgZm9yIGEgc3RhbGUgVExCIGVudHJ5LgoKVXNhZ2U6CiAgIHN1ZG8gcHl0aG9uMyBhdXRv X3Rlc3QucHkgLS1xZW11LXBpZCA8UUVNVV9QSUQ+IFwKICAgICAgICBbLS1wb3J0IDEyMzQ1XSBb LS1ob3N0LWNwdTAgMF0gWy0taG9zdC1jcHUxIDFdCiIiIgoKaW1wb3J0IGFyZ3BhcnNlCmltcG9y dCBnbG9iCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHNvY2tldAppbXBvcnQgc3VicHJvY2Vz cwppbXBvcnQgc3lzCmltcG9ydCB0aW1lCgojIC0tLS0tLS0tLS0tLS0tLS0gdkNQVSBUSUQgZGlz Y292ZXJ5IC0tLS0tLS0tLS0tLS0tLS0KClZDUFVfUkUgPSByZS5jb21waWxlKHIiXig/OkNQVVxz KyhcZCspL0tWTXx2Y3B1KFxkKykpJCIpCgoKZGVmIGZpbmRfdmNwdV90aWRzKHFlbXVfcGlkKToK ICAgICAiIiJJZGVudGlmeSB2Q1BVIHRocmVhZHMgdW5kZXIgL3Byb2MvPHBpZD4vdGFzay4gUmV0 dXJucyB7aW5kZXg6IAp0aWR9LiIiIgogICAgIHJlc3VsdCA9IHt9CiAgICAgZm9yIHRhc2tfZGly IGluIGdsb2IuZ2xvYihmIi9wcm9jL3txZW11X3BpZH0vdGFzay8qIik6CiAgICAgICAgIHRyeToK ICAgICAgICAgICAgIGNvbW0gPSBvcGVuKGYie3Rhc2tfZGlyfS9jb21tIikucmVhZCgpLnN0cmlw KCkKICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICBjb250aW51ZQogICAgICAg ICBtID0gVkNQVV9SRS5tYXRjaChjb21tKQogICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAg IGNvbnRpbnVlCiAgICAgICAgIGlkeCA9IGludChtLmdyb3VwKDEpIGlmIG0uZ3JvdXAoMSkgaXMg bm90IE5vbmUgZWxzZSBtLmdyb3VwKDIpKQogICAgICAgICB0aWQgPSBpbnQob3MucGF0aC5iYXNl bmFtZSh0YXNrX2RpcikpCiAgICAgICAgIHJlc3VsdFtpZHhdID0gdGlkCiAgICAgcmV0dXJuIHJl c3VsdAoKCiMgLS0tLS0tLS0tLS0tLS0tLSBDUFUgYWZmaW5pdHkgLS0tLS0tLS0tLS0tLS0tLQoK ZGVmIHNldF9hZmZpbml0eSh0aWQsIGNwdSk6CiAgICAgc3VicHJvY2Vzcy5ydW4oWyJ0YXNrc2V0 IiwgIi1wYyIsIHN0cihjcHUpLCBzdHIodGlkKV0sCiAgICAgICAgICAgICAgICAgICAgY2hlY2s9 VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuREVWTlVMTCwKICAgICAgICAgICAgICAgICAgICBzdGRl cnI9c3VicHJvY2Vzcy5ERVZOVUxMKQoKCmRlZiBnZXRfYWZmaW5pdHkodGlkKToKICAgICB0cnk6 CiAgICAgICAgIG91dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAogICAgICAgICAgICAgWyJ0 YXNrc2V0IiwgIi1wYyIsIHN0cih0aWQpXSwgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTAogICAg ICAgICApLmRlY29kZSgpCiAgICAgICAgIHJldHVybiBvdXQuc3RyaXAoKS5zcGxpdCgiOiIpWy0x XS5zdHJpcCgpCiAgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yOgogICAg ICAgICByZXR1cm4gIj8iCgoKZGVmIG9ubGluZV9ob3N0X2NwdXMoKToKICAgICBjcHVzID0gW10K ICAgICB0cnk6CiAgICAgICAgIHJhdyA9IG9wZW4oIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L29u bGluZSIpLnJlYWQoKS5zdHJpcCgpCiAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgIHN5cy5l eGl0KCJGYWlsZWQgdG8gcmVhZCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9vbmxpbmUiKQogICAg IGZvciBpdGVtIGluIHJhdy5zcGxpdCgiLCIpOgogICAgICAgICBpZiAiLSIgaW4gaXRlbToKICAg ICAgICAgICAgIGEsIGIgPSBtYXAoaW50LCBpdGVtLnNwbGl0KCItIikpCiAgICAgICAgICAgICBj cHVzLmV4dGVuZChyYW5nZShhLCBiICsgMSkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBj cHVzLmFwcGVuZChpbnQoaXRlbSkpCiAgICAgcmV0dXJuIGNwdXMKCgojIC0tLS0tLS0tLS0tLS0t LS0gVENQIGNvbW11bmljYXRpb24gLS0tLS0tLS0tLS0tLS0tLQoKZGVmIHJlY3ZfbGluZShjb25u KToKICAgICBidWYgPSBiIiIKICAgICB3aGlsZSBub3QgYnVmLmVuZHN3aXRoKGIiXG4iKToKICAg ICAgICAgY2h1bmsgPSBjb25uLnJlY3YoMSkKICAgICAgICAgaWYgbm90IGNodW5rOgogICAgICAg ICAgICAgcmFpc2UgRU9GRXJyb3IoImd1ZXN0IGRpc2Nvbm5lY3RlZCIpCiAgICAgICAgIGJ1ZiAr PSBjaHVuawogICAgIHJldHVybiBidWYuZGVjb2RlKCkuc3RyaXAoKQoKCmRlZiBzZW5kX2xpbmUo Y29ubiwgbXNnKToKICAgICBjb25uLnNlbmRhbGwoKG1zZyArICJcbiIpLmVuY29kZSgpKQoKCiMg LS0tLS0tLS0tLS0tLS0tLSBNYWluIGZsb3cgLS0tLS0tLS0tLS0tLS0tLQoKZGVmIG1haW4oKToK ICAgICBhcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKICAgICBhcC5hZGRfYXJndW1lbnQo Ii0tcWVtdS1waWQiLCB0eXBlPWludCwgcmVxdWlyZWQ9VHJ1ZSwKICAgICAgICAgICAgICAgICAg ICAgaGVscD0iUUVNVSBwcm9jZXNzIFBJRCIpCiAgICAgYXAuYWRkX2FyZ3VtZW50KCItLXBvcnQi LCB0eXBlPWludCwgZGVmYXVsdD0xMjM0NSkKICAgICBhcC5hZGRfYXJndW1lbnQoIi0taG9zdC1j cHUwIiwgdHlwZT1pbnQsIGRlZmF1bHQ9MCwKICAgICAgICAgICAgICAgICAgICAgaGVscD0iVGFy Z2V0IGhvc3QgQ1BVIGZvciBtaWdyYXRpbmcgdkNQVTAgKGRlZmF1bHQgMCkiKQogICAgIGFwLmFk ZF9hcmd1bWVudCgiLS1ob3N0LWNwdTEiLCB0eXBlPWludCwgZGVmYXVsdD0xLAogICAgICAgICAg ICAgICAgICAgICBoZWxwPSJJbml0aWFsIHNoYXJlZCBob3N0IENQVSwgd2hlcmUgdkNQVTEgc3Rh eXMgCihkZWZhdWx0IDEpIikKICAgICBhcC5hZGRfYXJndW1lbnQoIi0tc2V0dGxlLW1zIiwgdHlw ZT1pbnQsIGRlZmF1bHQ9NTAwLAogICAgICAgICAgICAgICAgICAgICBoZWxwPSJXYWl0IHRpbWUg YWZ0ZXIgZWFjaCBtaWdyYXRpb24gKG1pbGxpc2Vjb25kcykiKQogICAgIGFyZ3MgPSBhcC5wYXJz ZV9hcmdzKCkKCiAgICAgY3B1MCA9IGFyZ3MuaG9zdF9jcHUwCiAgICAgY3B1MSA9IGFyZ3MuaG9z dF9jcHUxCiAgICAgaWYgY3B1MCA9PSBjcHUxOgogICAgICAgICBzeXMuZXhpdCgiLS1ob3N0LWNw dTAgYW5kIC0taG9zdC1jcHUxIG11c3QgZGlmZmVyIikKCiAgICAgb25saW5lID0gb25saW5lX2hv c3RfY3B1cygpCiAgICAgZm9yIGMgaW4gKGNwdTAsIGNwdTEpOgogICAgICAgICBpZiBjIG5vdCBp biBvbmxpbmU6CiAgICAgICAgICAgICBzeXMuZXhpdChmIkhvc3QgQ1BVIHtjfSBpcyBvZmZsaW5l LCBvbmxpbmUgQ1BVczoge29ubGluZX0iKQoKICAgICAjIC0tLS0gMS4gTG9jYXRlIHZDUFUgVElE cyAtLS0tCiAgICAgdmNwdXMgPSBmaW5kX3ZjcHVfdGlkcyhhcmdzLnFlbXVfcGlkKQogICAgIHBy aW50KGYiW0hvc3RdIEZvdW5kIHZDUFUgdGhyZWFkczoge3ZjcHVzfSIpCiAgICAgaWYgMCBub3Qg aW4gdmNwdXMgb3IgMSBub3QgaW4gdmNwdXM6CiAgICAgICAgIHN5cy5leGl0KCJ2Q1BVMC92Q1BV MSB0aHJlYWRzIG5vdCBmb3VuZDsgY2hlY2sgdGhlIFFFTVUgUElEIGFuZCAiCiAgICAgICAgICAg ICAgICAgICJ2Q1BVIHRocmVhZCBuYW1pbmciKQoKICAgICAjIC0tLS0gMi4gSW5pdGlhbCBwaW5u aW5nOiBib3RoIHZDUFUwIGFuZCB2Q1BVMSBvbiBob3N0IENQVTEgLS0tLQogICAgIHByaW50KGYi W0hvc3RdIEluaXRpYWwgcGlubmluZzogdkNQVTAgLT4gQ1BVIHtjcHUxfSwgdkNQVTEgLT4gQ1BV IAp7Y3B1MX0iKQogICAgIHNldF9hZmZpbml0eSh2Y3B1c1swXSwgY3B1MSkKICAgICBzZXRfYWZm aW5pdHkodmNwdXNbMV0sIGNwdTEpCiAgICAgdGltZS5zbGVlcCgwLjMpCiAgICAgcHJpbnQoZiJb SG9zdF0gdkNQVTAgYWZmaW5pdHkgPSB7Z2V0X2FmZmluaXR5KHZjcHVzWzBdKX0iKQogICAgIHBy aW50KGYiW0hvc3RdIHZDUFUxIGFmZmluaXR5ID0ge2dldF9hZmZpbml0eSh2Y3B1c1sxXSl9IikK CiAgICAgIyAtLS0tIDMuIExpc3RlbiBmb3IgdGhlIGd1ZXN0IC0tLS0KICAgICBzcnYgPSBzb2Nr ZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgc3J2LnNl dHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCiAgICAg c3J2LmJpbmQoKCIwLjAuMC4wIiwgYXJncy5wb3J0KSkKICAgICBzcnYubGlzdGVuKDEpCiAgICAg cHJpbnQoZiJbSG9zdF0gTGlzdGVuaW5nIG9uIDAuMC4wLjA6e2FyZ3MucG9ydH0sIHdhaXRpbmcg Zm9yIGd1ZXN0IAouLi4iKQoKICAgICBjb25uLCBhZGRyID0gc3J2LmFjY2VwdCgpCiAgICAgY29u bi5zZXRzb2Nrb3B0KHNvY2tldC5JUFBST1RPX1RDUCwgc29ja2V0LlRDUF9OT0RFTEFZLCAxKQog ICAgIHByaW50KGYiW0hvc3RdIEd1ZXN0IGNvbm5lY3RlZDoge2FkZHJ9IikKCiAgICAgdHJ5Ogog ICAgICAgICAjIC0tLS0gNC4gSGFuZHNoYWtlIC0tLS0KICAgICAgICAgbXNnID0gcmVjdl9saW5l KGNvbm4pCiAgICAgICAgIGlmIG1zZyAhPSAiSEVMTE8iOgogICAgICAgICAgICAgc3lzLmV4aXQo ZiJIYW5kc2hha2UgZmFpbGVkLCByZWNlaXZlZDoge21zZ30iKQogICAgICAgICBzZW5kX2xpbmUo Y29ubiwgIkdPX1BIQVNFMSIpCgogICAgICAgICAjIC0tLS0gNS4gUGhhc2UgMSBkb25lIC0+IG1p Z3JhdGUgdkNQVTAgZnJvbSBDUFUxIHRvIENQVTAgLS0tLQogICAgICAgICBtc2cgPSByZWN2X2xp bmUoY29ubikKICAgICAgICAgaWYgbXNnICE9ICJQSEFTRTFfRE9ORSI6CiAgICAgICAgICAgICBz eXMuZXhpdChmIkV4cGVjdGVkIFBIQVNFMV9ET05FLCByZWNlaXZlZDoge21zZ30iKQogICAgICAg ICBwcmludChmIltIb3N0XSBQaGFzZSAxIGRvbmU7IG1pZ3JhdGluZyB2Q1BVMDogQ1BVIHtjcHUx fSAtPiBDUFUgCntjcHUwfSIpCiAgICAgICAgIHNldF9hZmZpbml0eSh2Y3B1c1swXSwgY3B1MCkK ICAgICAgICAgdGltZS5zbGVlcChhcmdzLnNldHRsZV9tcyAvIDEwMDAuMCkKICAgICAgICAgcHJp bnQoZiJbSG9zdF0gdkNQVTAgYWZmaW5pdHkgPSB7Z2V0X2FmZmluaXR5KHZjcHVzWzBdKX0iKQog ICAgICAgICBzZW5kX2xpbmUoY29ubiwgIk1JR1JBVEVEMCIpCgogICAgICAgICAjIC0tLS0gNi4g UGhhc2UgMiBkb25lIC0+IGNvbmZpcm0gdkNQVTEgc3RheXMgb24gQ1BVMSAtLS0tCiAgICAgICAg IG1zZyA9IHJlY3ZfbGluZShjb25uKQogICAgICAgICBpZiBtc2cgIT0gIlBIQVNFMl9ET05FIjoK ICAgICAgICAgICAgIHN5cy5leGl0KGYiRXhwZWN0ZWQgUEhBU0UyX0RPTkUsIHJlY2VpdmVkOiB7 bXNnfSIpCiAgICAgICAgIHByaW50KGYiW0hvc3RdIFBoYXNlIDIgZG9uZTsgY29uZmlybWluZyB2 Q1BVMSBpcyBzdGlsbCBvbiBDUFUgCntjcHUxfSwgIgogICAgICAgICAgICAgICBmIm5vIG1pZ3Jh dGlvbiIpCiAgICAgICAgIHByaW50KGYiW0hvc3RdIHZDUFUxIGFmZmluaXR5ID0ge2dldF9hZmZp bml0eSh2Y3B1c1sxXSl9IikKICAgICAgICAgc2VuZF9saW5lKGNvbm4sICJNSUdSQVRFRDEiKQoK ICAgICAgICAgIyAtLS0tIDcuIENvbGxlY3QgdGhlIHJlc3VsdCAtLS0tCiAgICAgICAgIG1zZyA9 IHJlY3ZfbGluZShjb25uKQogICAgICAgICBwcmludChmIltIb3N0XSBSZWNlaXZlZCByZXN1bHQ6 IHttc2d9IikKICAgICAgICAgaWYgbXNnID09ICJSRVNVTFQ6MHgwIjoKICAgICAgICAgICAgIHBy aW50KCkKICAgICAgICAgICAgIHByaW50KCI9IiAqIDU1KQogICAgICAgICAgICAgcHJpbnQoIiAg KioqIEJVRyBSRVBST0RVQ0VEICoqKiAocmVhZCB0aGUgc3RhbGUgdmFsdWUgMHgwKSIpCiAgICAg ICAgICAgICBwcmludCgiPSIgKiA1NSkKICAgICAgICAgICAgIHJjID0gMAogICAgICAgICBlbGlm IG1zZyA9PSAiUkVTVUxUOjB4Y2FmZWJhYmUiOgogICAgICAgICAgICAgcHJpbnQoKQogICAgICAg ICAgICAgcHJpbnQoIj0iICogNTUpCiAgICAgICAgICAgICBwcmludCgiICBOb3QgcmVwcm9kdWNl ZCAocmVhZCB0aGUgbmV3IHZhbHVlKSIpCiAgICAgICAgICAgICBwcmludCgiPSIgKiA1NSkKICAg ICAgICAgICAgIHJjID0gMQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcHJpbnQoZiIgIFVu ZXhwZWN0ZWQgcmVzdWx0OiB7bXNnfSIpCiAgICAgICAgICAgICByYyA9IDIKCiAgICAgZmluYWxs eToKICAgICAgICAgY29ubi5jbG9zZSgpCiAgICAgICAgIHNydi5jbG9zZSgpCgogICAgIHN5cy5l eGl0KHJjKQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgbWFpbigpCgotLS0gODwg LS0tIHZzc3RhZ2VfdGxiX3N0YWxlX2d1ZXN0LmMgLS0tIDg8IC0tLQovLyBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMAovKgogICogUklTQy1WIEtWTSBzdGFsZSBWUy1zdGFnZSBUTEIg ZW50cnkgcmVwcm9kdWNlciAoR3Vlc3Qgc2lkZSwgYXV0b21hdGVkKQogICoKICAqIFNjZW5hcmlv OgogICogICBJbml0aWFsbHkgYm90aCB2Q1BVMCBhbmQgdkNQVTEgYXJlIHBpbm5lZCB0byBob3N0 IENQVTEuCiAgKiAgIFBoYXNlIDE6IHRoZSB0YXNrIHJ1bnMgb24gdkNQVTAgKGhvc3QgQ1BVMSkg YW5kIHJlYWRzIHRoZSBzaGFyZWQgcGFnZSwKICAqICAgICAgICAgICAgcG9wdWxhdGluZyBhIHN0 YWxlIFZTLXN0YWdlIFRMQiBlbnRyeSBvbiBob3N0IENQVTEuCiAgKiAgIFBoYXNlIDI6IHRoZSBo b3N0IG1pZ3JhdGVzIHZDUFUwIHRvIGhvc3QgQ1BVMDsgdGhlIHRhc2sgd3JpdGVzIHRoZSAKcGFn ZQogICogICAgICAgICAgICBvbiB2Q1BVMCAoaG9zdCBDUFUwKSwgdHJpZ2dlcmluZyBDT1cuIFRo ZSBndWVzdC1sb2NhbAogICogICAgICAgICAgICBzZmVuY2Uudm1hIG9ubHkgaW52YWxpZGF0ZXMg ZW50cmllcyBvbiBob3N0IENQVTAuCiAgKiAgIFBoYXNlIDM6IHRoZSB0YXNrIGlzIHNjaGVkdWxl ZCBvbnRvIHZDUFUxIChob3N0IENQVTEpIGFuZCByZWFkcyAKdGhlIHNhbWUKICAqICAgICAgICAg ICAgcGFnZSwgaGl0dGluZyB0aGUgc3RhbGUgZW50cnkgbGVmdCBiZWhpbmQgb24gaG9zdCBDUFUx LgogICoKICAqIFVzYWdlOgogICogICAuL3Zzc3RhZ2VfdGxiX3N0YWxlX2d1ZXN0IFtob3N0X2lw XSBbcG9ydF0KICAqICAgRGVmYXVsdCBob3N0X2lwPTEwLjAuMi4yICBwb3J0PTEyMzQ1CiAgKgog ICogQnVpbGQ6CiAgKiAgIGdjYyAtTzAgLW8gdnNzdGFnZV90bGJfc3RhbGVfZ3Vlc3QgdnNzdGFn ZV90bGJfc3RhbGVfZ3Vlc3QuYwogICovCgojZGVmaW5lIF9HTlVfU09VUkNFCiNpbmNsdWRlIDxz dGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUg PHVuaXN0ZC5oPgojaW5jbHVkZSA8c2NoZWQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRl IDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+ CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgojaW5jbHVk ZSA8YXJwYS9pbmV0Lmg+CgojZGVmaW5lIFBBR0VfU0laRSAgICAgICA0MDk2CiNkZWZpbmUgSU5J VElBTF9WQUxVRSAgIDB4MFVMCiNkZWZpbmUgV1JJVEVfVkFMVUUgICAgIDB4Q0FGRUJBQkVVTAoK c3RhdGljIHZvbGF0aWxlIHVpbnQ2NF90ICpzaGFyZWRfcGFnZTsKc3RhdGljIGludCBzb2NrX2Zk ID0gLTE7CgovKiAtLS0tLS0tLS0tLS0tLS0tIFRDUCBjb21tdW5pY2F0aW9uIC0tLS0tLS0tLS0t LS0tLS0gKi8KCnN0YXRpYyBpbnQgY29ubmVjdF9ob3N0KGNvbnN0IGNoYXIgKmhvc3QsIGludCBw b3J0KQp7CiAgICAgc3RydWN0IHNvY2thZGRyX2luIHNhOwogICAgIGludCBmZCwgb25lID0gMSwg aTsKCiAgICAgbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CiAgICAgc2Euc2luX2ZhbWlseSA9 IEFGX0lORVQ7CiAgICAgc2Euc2luX3BvcnQgICA9IGh0b25zKHBvcnQpOwogICAgIGlmIChpbmV0 X3B0b24oQUZfSU5FVCwgaG9zdCwgJnNhLnNpbl9hZGRyKSAhPSAxKSB7CiAgICAgICAgIGZwcmlu dGYoc3RkZXJyLCAiSW52YWxpZCBob3N0IElQOiAlc1xuIiwgaG9zdCk7CiAgICAgICAgIHJldHVy biAtMTsKICAgICB9CgogICAgIGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsK ICAgICBpZiAoZmQgPCAwKSB7IHBlcnJvcigic29ja2V0Iik7IHJldHVybiAtMTsgfQogICAgIHNl dHNvY2tvcHQoZmQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJm9uZSwgc2l6ZW9mKG9uZSkp OwoKICAgICBmb3IgKGkgPSAwOyBpIDwgNjA7IGkrKykgewogICAgICAgICBpZiAoY29ubmVjdChm ZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mKHNhKSkgPT0gMCkKICAgICAgICAgICAg IHJldHVybiBmZDsKICAgICAgICAgaWYgKGkgPT0gMCkKICAgICAgICAgICAgIGZwcmludGYoc3Rk ZXJyLCAiV2FpdGluZyBmb3IgaG9zdCAlczolZCAuLi5cbiIsIGhvc3QsIHBvcnQpOwogICAgICAg ICBzbGVlcCgxKTsKICAgICB9CiAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVj dCB0byBob3N0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICBjbG9zZShmZCk7CiAgICAg cmV0dXJuIC0xOwp9CgpzdGF0aWMgdm9pZCBzZW5kX21zZyhjb25zdCBjaGFyICptc2cpCnsKICAg ICBzaXplX3QgbGVuID0gc3RybGVuKG1zZyk7CiAgICAgaWYgKHNlbmQoc29ja19mZCwgbXNnLCBs ZW4sIDApICE9IChzc2l6ZV90KWxlbiB8fAogICAgICAgICBzZW5kKHNvY2tfZmQsICJcbiIsIDEs IDApICE9IDEpCiAgICAgICAgIHBlcnJvcigic2VuZCIpOwp9CgovKiBSZWFkIG9uZSBsaW5lLCBi bG9ja2luZyB1bnRpbCAnXG4nIGlzIHJlY2VpdmVkLiAqLwpzdGF0aWMgaW50IHJlY3ZfbXNnKGNo YXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKewogICAgIHNpemVfdCBuID0gMDsKICAgICB3aGlsZSAo biArIDEgPCBidWZsZW4pIHsKICAgICAgICAgY2hhciBjOwogICAgICAgICBzc2l6ZV90IHIgPSBy ZWN2KHNvY2tfZmQsICZjLCAxLCAwKTsKICAgICAgICAgaWYgKHIgPD0gMCkgcmV0dXJuIC0xOwog ICAgICAgICBpZiAoYyA9PSAnXG4nKSBicmVhazsKICAgICAgICAgYnVmW24rK10gPSBjOwogICAg IH0KICAgICBidWZbbl0gPSAnXDAnOwogICAgIHJldHVybiAoaW50KW47Cn0KCi8qIC0tLS0tLS0t LS0tLS0tLS0gQ1BVIHBpbm5pbmcgLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIGludCBwaW5f Z3Vlc3RfY3B1KGludCBjcHUpCnsKICAgICBjcHVfc2V0X3Qgc2V0OwoKICAgICBDUFVfWkVSTygm c2V0KTsKICAgICBDUFVfU0VUKGNwdSwgJnNldCk7CiAgICAgaWYgKHNjaGVkX3NldGFmZmluaXR5 KDAsIHNpemVvZihzZXQpLCAmc2V0KSAhPSAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAi RmFpbGVkIHRvIHBpbiB0byBndWVzdCBDUFUgJWQ6ICVzXG4iLAogICAgICAgICAgICAgICAgIGNw dSwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KCiAgICAgLyog R2l2ZSB0aGUgc2NoZWR1bGVyIHRpbWUgdG8gYWN0dWFsbHkgcGxhY2UgdGhlIHRhc2sgb24gdGhl IHRhcmdldCAKdkNQVS4gKi8KICAgICB1c2xlZXAoNTAwMDAwKTsKCiAgICAgcHJpbnRmKCIgIFtH dWVzdF0gTm93IHJ1bm5pbmcgb24gZ3Vlc3QgQ1BVICVkXG4iLCBzY2hlZF9nZXRjcHUoKSk7CiAg ICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgcmV0dXJuIDA7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0g TWFpbiBmbG93IC0tLS0tLS0tLS0tLS0tLS0gKi8KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoq YXJndikKewogICAgIGNvbnN0IGNoYXIgKmhvc3QgPSBhcmdjID4gMSA/IGFyZ3ZbMV0gOiAiMTAu MC4yLjIiOwogICAgIGludCBwb3J0ICAgICAgICAgPSBhcmdjID4gMiA/IGF0b2koYXJndlsyXSkg OiAxMjM0NTsKICAgICB1aW50NjRfdCB2YWw7CiAgICAgY2hhciBidWZbMTI4XTsKICAgICBsb25n IG5jcHVzOwoKICAgICBzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTEJGLCAwKTsKCiAgICAgcHJp bnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PVxuIik7CiAgICAgcHJpbnRmKCIgUklTQy1WIEtWTSBzdGFsZSBWUy1zdGFnZSBUTEIgcmVwcm9k dWNlciAoR3Vlc3QpXG4iKTsKICAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKICAgICBwcmludGYoIkNvbm5lY3Rpbmcg dG8gaG9zdDogJXM6JWRcbiIsIGhvc3QsIHBvcnQpOwoKICAgICBuY3B1cyA9IHN5c2NvbmYoX1ND X05QUk9DRVNTT1JTX09OTE4pOwogICAgIGlmIChuY3B1cyA8IDIpIHsKICAgICAgICAgZnByaW50 ZihzdGRlcnIsICJBdCBsZWFzdCAyIGd1ZXN0IENQVXMgYXJlIHJlcXVpcmVkXG4iKTsKICAgICAg ICAgcmV0dXJuIDE7CiAgICAgfQoKICAgICAvKgogICAgICAqIEFub255bW91cyBwcml2YXRlIG1h cHBpbmcuIFRoZSBmaXJzdCByZWFkIGZhdWx0cyBpbiB0aGUgc2hhcmVkCiAgICAgICogcmVhZC1v bmx5IHplcm8gcGFnZTsgdGhlIGZpcnN0IHdyaXRlIHRyaWdnZXJzIENPVy4KICAgICAgKi8KICAg ICBzaGFyZWRfcGFnZSA9IG1tYXAoTlVMTCwgUEFHRV9TSVpFLCBQUk9UX1JFQUQgfCBQUk9UX1dS SVRFLAogICAgICAgICAgICAgICAgICAgICAgICBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMs IC0xLCAwKTsKICAgICBpZiAoc2hhcmVkX3BhZ2UgPT0gTUFQX0ZBSUxFRCkgewogICAgICAgICBw ZXJyb3IoIm1tYXAiKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIHByaW50ZigiU2hh cmVkIHBhZ2U6ICVwIChpbml0aWFsbHkgbWFwcGVkIHRvIHRoZSByZWFkLW9ubHkgemVybyAKcGFn ZSlcbiIsCiAgICAgICAgICAgICh2b2lkICopc2hhcmVkX3BhZ2UpOwoKICAgICAvKiAtLS0tIENv bm5lY3QgdG8gaG9zdCAtLS0tICovCiAgICAgc29ja19mZCA9IGNvbm5lY3RfaG9zdChob3N0LCBw b3J0KTsKICAgICBpZiAoc29ja19mZCA8IDApIHJldHVybiAxOwoKICAgICBzZW5kX21zZygiSEVM TE8iKTsKICAgICBpZiAocmVjdl9tc2coYnVmLCBzaXplb2YoYnVmKSkgPCAwIHx8IHN0cmNtcChi dWYsICJHT19QSEFTRTEiKSAhPSAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSGFuZHNo YWtlIGZhaWxlZDogJXNcbiIsIGJ1Zik7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KCiAgICAg LyogLS0tLSBQaGFzZSAxOiByZWFkIG9uIHZDUFUwIChob3N0IENQVTEpLCBwb3B1bGF0ZSBzdGFs ZSBUTEIgLS0tLSAqLwogICAgIHByaW50ZigiXG4tLS0gUGhhc2UgMTogdkNQVTAgcmVhZHMgc2hh cmVkIHBhZ2UgKGV4cGVjdGVkIGhvc3QgQ1BVMSkgCi0tLVxuIik7CiAgICAgaWYgKHBpbl9ndWVz dF9jcHUoMCkgIT0gMCkgcmV0dXJuIDE7CgogICAgIF9fc3luY19zeW5jaHJvbml6ZSgpOwogICAg IHZhbCA9IHNoYXJlZF9wYWdlWzBdOwogICAgIF9fc3luY19zeW5jaHJvbml6ZSgpOwogICAgIHBy aW50ZigiICBbR3Vlc3RdIFBoYXNlIDEgcmVhZCAweCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpdmFs KTsKCiAgICAgc2VuZF9tc2coIlBIQVNFMV9ET05FIik7CiAgICAgaWYgKHJlY3ZfbXNnKGJ1Ziwg c2l6ZW9mKGJ1ZikpIDwgMCB8fCBzdHJjbXAoYnVmLCAiTUlHUkFURUQwIikgIT0gMCkgewogICAg ICAgICBmcHJpbnRmKHN0ZGVyciwgIkRpZCBub3QgcmVjZWl2ZSBNSUdSQVRFRDA6ICVzXG4iLCBi dWYpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAgICAgcHJpbnRmKCIgIFtHdWVzdF0gSG9z dCBtaWdyYXRlZCB2Q1BVMCB0byBob3N0IENQVTBcbiIpOwoKICAgICAvKiAtLS0tIFBoYXNlIDI6 IHdyaXRlIG9uIHZDUFUwIChob3N0IENQVTApLCBDT1cgKyBsb2NhbCBzZmVuY2UgLS0tLSAqLwog ICAgIHByaW50ZigiXG4tLS0gUGhhc2UgMjogdkNQVTAgd3JpdGVzIHNoYXJlZCBwYWdlLCB0cmln Z2VyaW5nIENPVyAiCiAgICAgICAgICAgICIoZXhwZWN0ZWQgaG9zdCBDUFUwKSAtLS1cbiIpOwog ICAgIF9fc3luY19zeW5jaHJvbml6ZSgpOwogICAgIHNoYXJlZF9wYWdlWzBdID0gV1JJVEVfVkFM VUU7CiAgICAgX19zeW5jX3N5bmNocm9uaXplKCk7CiAgICAgdmFsID0gc2hhcmVkX3BhZ2VbMF07 CiAgICAgcHJpbnRmKCIgIFtHdWVzdF0gUGhhc2UgMiByZWFkIGJhY2sgMHglbHhcbiIsICh1bnNp Z25lZCBsb25nKXZhbCk7CgogICAgIHNlbmRfbXNnKCJQSEFTRTJfRE9ORSIpOwogICAgIGlmIChy ZWN2X21zZyhidWYsIHNpemVvZihidWYpKSA8IDAgfHwgc3RyY21wKGJ1ZiwgIk1JR1JBVEVEMSIp ICE9IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEaWQgbm90IHJlY2VpdmUgTUlHUkFU RUQxOiAlc1xuIiwgYnVmKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIHByaW50Zigi ICBbR3Vlc3RdIEhvc3QgY29uZmlybWVkIHZDUFUxIGlzIHN0aWxsIG9uIGhvc3QgQ1BVMVxuIik7 CgogICAgIC8qIC0tLS0gUGhhc2UgMzogdGFzayBtaWdyYXRlcyB0byB2Q1BVMSAoaG9zdCBDUFUx KSwgaGl0IHN0YWxlIAplbnRyeSAtLS0tICovCiAgICAgcHJpbnRmKCJcbi0tLSBQaGFzZSAzOiB0 YXNrIG1pZ3JhdGVzIHRvIHZDUFUxIGFuZCByZWFkcyBzaGFyZWQgcGFnZSAiCiAgICAgICAgICAg ICIoZXhwZWN0ZWQgaG9zdCBDUFUxKSAtLS1cbiIpOwogICAgIGlmIChwaW5fZ3Vlc3RfY3B1KDEp ICE9IDApIHJldHVybiAxOwoKICAgICBfX3N5bmNfc3luY2hyb25pemUoKTsKICAgICB2YWwgPSBz aGFyZWRfcGFnZVswXTsKICAgICBfX3N5bmNfc3luY2hyb25pemUoKTsKCiAgICAgcHJpbnRmKCIg IFtHdWVzdF0gUGhhc2UgMyByZWFkIDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZyl2YWwpOwoKICAg ICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiUkVTVUxUOjB4JWx4IiwgKHVuc2lnbmVkIGxv bmcpdmFsKTsKICAgICBzZW5kX21zZyhidWYpOwoKICAgICBwcmludGYoIlxuPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogICAgIGlmICh2 YWwgPT0gV1JJVEVfVkFMVUUpIHsKICAgICAgICAgcHJpbnRmKCIgVmVyZGljdDogT0sgKHJlYWQg dGhlIG5ldyB2YWx1ZSAweCVseClcbiIsCiAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl2 YWwpOwogICAgIH0gZWxzZSBpZiAodmFsID09IElOSVRJQUxfVkFMVUUpIHsKICAgICAgICAgcHJp bnRmKCIgVmVyZGljdDogKioqIEJVRyBSRVBST0RVQ0VEICoqKiByZWFkIHRoZSBzdGFsZSB2YWx1 ZSAKMHgwXG4iKTsKICAgICB9IGVsc2UgewogICAgICAgICBwcmludGYoIiBWZXJkaWN0OiB1bmV4 cGVjdGVkIHZhbHVlIDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZyl2YWwpOwogICAgIH0KICAgICBw cmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09XG4iKTsKCiAgICAgY2xvc2Uoc29ja19mZCk7CiAgICAgbXVubWFwKCh2b2lkICopc2hhcmVk X3BhZ2UsIFBBR0VfU0laRSk7CiAgICAgcmV0dXJuIDA7Cn0KLS0tIDg8IC0tLSBlbmQgLS0tIDg8 IC0tLQoKVGVzdGVkLWJ5OiBCaWxsWGlhbmcgPHhpYW5nd2VuY2hlbmdAbGFueGluY29tcHV0aW5n LmNvbT4KCj4+Pgo+Pj4gwqDCoMKgIFNvIHRoaXMgaXMgYW4gaW50cmEtZ3Vlc3Qgc2NoZWR1bGlu ZyBjYXNlIG9udG8gYSB2Q1BVIHRoYXQgc3RheWVkIG9uCj4+PiB0aGUgb3JpZ2luYWwgaG9zdCBD UFUsIHJhdGhlciB0aGFuIGEg4oCcdmNwdTAgcmV0dXJucyB0byBob3N0IENQVTHigJ0gY2FzZS4K Pj4KPj4gTXkgTkFDSyBzdGlsbCBob2xkcy4KPj4KPj4gUmVnYXJkcywKPj4gQW51cAo+Pgo+Pj4K Pj4+IMKgwqDCoCBUaGFua3MsCj4+PiDCoMKgwqAgWWF4aW5nCj4+Pgo+Pj4+Pgo+Pj4+PiBIb3N0 IENQVTEgZGlkIG5vdCBvYnNlcnZlIHRoZSBndWVzdC1sb2NhbCBzZmVuY2Uudm1hLCBhbmQgS1ZN IGNhbiAKPj4+Pj4gZW50ZXIKPj4+Pj4gdmNwdTEgd2l0aCBhIHN0YWxlIFZTLXN0YWdlIHRyYW5z bGF0aW9uIGxlZnQgYmVoaW5kIGJ5IHZjcHUwLgo+Pj4+Pgo+Pj4+PiBUaGUgcmVwb3J0ZWQgZmFp bHVyZSB3YXMgc2VlbiBvbiBhIFhpYW5nU2hhbiBSSVNDLVYgc3lzdGVtLiBBIGJhc2ggCj4+Pj4+ IHRhc2sKPj4+Pj4gcmFuIG9uIHZjcHUwIHdoaWxlIHZjcHUwIHdhcyBiYWNrZWQgYnkgaG9zdCBD UFUxLCBhbmQgYSByZWFkLW9ubHkgCj4+Pj4+IHBhZ2Ugd2FzCj4+Pj4+IHByZWZldGNoZWQgaW50 byBDUFUxJ3MgVlMtc3RhZ2UgVExCLiB2Y3B1MCBsYXRlciBtaWdyYXRlZCB0byBob3N0IAo+Pj4+ PiBDUFUwLAo+Pj4+PiB3aGVyZSB0aGUgZ3Vlc3QgdHJpZ2dlcmVkIENPVywgdXBkYXRlZCB0aGUg bWFwcGluZywgYW5kIGlzc3VlZCBvbmx5IAo+Pj4+PiBhIGxvY2FsCj4+Pj4+IHNmZW5jZS52bWEu IFRoZSBzdGFsZSBWUy1zdGFnZSBlbnRyeSBvbiBDUFUxIHN1cnZpdmVkLiBXaGVuIHRoZSAKPj4+ Pj4gc2FtZSBndWVzdAo+Pj4+PiB0YXNrIGxhdGVyIHJhbiBvbiBhbm90aGVyIHZDUFUgYmFja2Vk IGJ5IGhvc3QgQ1BVMSwgaXQgaGl0IHRoZSBzdGFsZQo+Pj4+PiB0cmFuc2xhdGlvbi4gVGhlIHBh Z2UgY29udGFpbmVkIGEgR09UIHBvaW50ZXIsIGFuZCB1c2luZyB0aGUgc3RhbGUgCj4+Pj4+IGRh dGEgbGVkCj4+Pj4+IHRvIGEgTlVMTCBkZXJlZmVyZW5jZSBhbmQgYSB1c2Vyc3BhY2Ugc2VnbWVu dGF0aW9uIGZhdWx0Lgo+Pj4+Pgo+Pj4+PiBUaGUgZXhpc3RpbmcgbG9jYWwgVExCIHNhbml0aXpl IHBhdGggZmx1c2hlcyBHLXN0YWdlIGVudHJpZXMgd2hlbiBhIAo+Pj4+PiB2Q1BVCj4+Pj4+IG1p Z3JhdGVzLCBhbmQgZmx1c2hlcyBWUy1zdGFnZSBlbnRyaWVzIG9ubHkgZm9yIGltcGxlbWVudGF0 aW9ucyAKPj4+Pj4gc2VsZWN0ZWQgYnkKPj4+Pj4gdGhlIEFuZGVzLXNwZWNpZmljIGt2bV9yaXNj dl92c3N0YWdlX3RsYl9ub19ncGEgc3RhdGljIGtleS4gVGhhdCAKPj4+Pj4gaGFuZGxlcyBhCj4+ Pj4+IHNwbGl0IHR3by1zdGFnZSBUTEIgaW1wbGVtZW50YXRpb24gd2hlcmUgSEZFTkNFLkdWTUEg ZG9lcyBub3QgCj4+Pj4+IGludmFsaWRhdGUKPj4+Pj4gVlMtc3RhZ2UgZW50cmllcywgYnV0IGl0 IGRvZXMgbm90IGNvdmVyIHRoZSBnZW5lcmljIGd1ZXN0LWxvY2FsIAo+Pj4+PiBzZmVuY2Uudm1h Cj4+Pj4+IGNhc2UgYWJvdmUuCj4+Pj4+Cj4+Pj4+IFRyYWNrLCBwZXIgVk0gYW5kIHBlciBob3N0 IENQVSwgdGhlIGxhc3QgdkNQVSB0aGF0IGVudGVyZWQgdGhlIAo+Pj4+PiBndWVzdCBvbgo+Pj4+ PiB0aGF0IENQVS4gQmVmb3JlIGd1ZXN0IGVudHJ5LCBmbHVzaCB0aGUgY3VycmVudCBDUFUncyBW Uy1zdGFnZSAKPj4+Pj4gY29udGV4dCBmb3IKPj4+Pj4gdGhlIFZNIGlmIGVpdGhlciB0aGUgY3Vy cmVudCB2Q1BVIG1pZ3JhdGVkIHNpbmNlIGl0cyBsYXN0IGV4aXQsIG9yIAo+Pj4+PiB0aGlzCj4+ Pj4+IGhvc3QgQ1BVIGlzIHN3aXRjaGluZyBmcm9tIGFub3RoZXIgdkNQVSBvZiB0aGUgc2FtZSBW TS4gS2VlcCB0aGUgCj4+Pj4+IGV4aXN0aW5nCj4+Pj4+IEhGRU5DRS5HVk1BIGJlaGF2aW9yIHRp ZWQgdG8gdkNQVSBtaWdyYXRpb24uCj4+Pj4+Cj4+Pj4+IFRoaXMgYWxzbyBzdWJzdW1lcyB0aGUg QW5kZXMgc3BsaXQtVExCIHdvcmthcm91bmQuIFRoYXQgd29ya2Fyb3VuZCB3YXMKPj4+Pj4gbmVl ZGVkIGJlY2F1c2UgdGhlIG1pZ3JhdGlvbiBzYW5pdGl6ZSBwYXRoIHByZXZpb3VzbHkgcmVsaWVk IG9uCj4+Pj4+IEhGRU5DRS5HVk1BIGFsb25lIGZvciBtb3N0IGltcGxlbWVudGF0aW9ucywgYW5k IG9ubHkgaXNzdWVkIAo+Pj4+PiBIRkVOQ0UuVlZNQQo+Pj4+PiB3aGVuIGt2bV9yaXNjdl92c3N0 YWdlX3RsYl9ub19ncGEgd2FzIHNldC4gVGhlIG5ldyBzYW5pdGl6ZSBwYXRoIAo+Pj4+PiBhbHdh eXMKPj4+Pj4gaXNzdWVzIEhGRU5DRS5WVk1BIHdoZW4gcmV1c2luZyBhIGhvc3QgQ1BVIGZvciBh IFZNIGNvbnRleHQgdGhhdCAKPj4+Pj4gbWF5IGhhdmUKPj4+Pj4gbWlzc2VkIGEgZ3Vlc3QtbG9j YWwgc2ZlbmNlLnZtYSwgc28gaXQgbm8gbG9uZ2VyIGRlcGVuZHMgb24gCj4+Pj4+IEhGRU5DRS5H Vk1BCj4+Pj4+IGludmFsaWRhdGluZyBWUy1zdGFnZSBlbnRyaWVzLiBUaGUgaW1wbGVtZW50YXRp b24tc3BlY2lmaWMgc3RhdGljIAo+Pj4+PiBrZXkgYW5kCj4+Pj4+IHNldHVwIGhvb2sgYXJlIHRo ZXJlZm9yZSBubyBsb25nZXIgbmVlZGVkLgo+Pj4+Pgo+Pj4+PiBSZXBvcnRlZC1ieTogWmhpenVu IFdhbmcgPGFuem9zb0BvdXRsb29rLmNvbT4KPj4+Pj4gUmV2aWV3ZWQtYnk6IEppdXl1ZSBNYSA8 bWFqaXV5dWVAYm9zYy5hYy5jbj4KPj4+Pj4gU2lnbmVkLW9mZi1ieTogWWF4aW5nIEd1byA8Z3Vv eWF4aW5nQGJvc2MuYWMuY24+Cj4+Pj4+IC0tLQo+Pj4+PiDCoMKgIGFyY2gvcmlzY3YvaW5jbHVk ZS9hc20va3ZtX2hvc3QuaCB8wqAgNiArKystLS0KPj4+Pj4gwqDCoCBhcmNoL3Jpc2N2L2t2bS9t YWluLmPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCAxNSAtLS0tLS0tLS0tLS0tLS0KPj4+Pj4g wqDCoCBhcmNoL3Jpc2N2L2t2bS90bGIuY8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwgMzEg KysrKysrKysrKysrKysrKysrKysrKyAKPj4+Pj4gKy0tLS0tLS0tCj4+Pj4+IMKgwqAgYXJjaC9y aXNjdi9rdm0vdm0uY8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCAxNiArKysrKysrKysr KysrKysrCj4+Pj4+IMKgwqAgNCBmaWxlcyBjaGFuZ2VkLCA0MiBpbnNlcnRpb25zKCspLCAyNiBk ZWxldGlvbnMoLSkKPj4+Pj4KPj4+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9h c20va3ZtX2hvc3QuaCBiL2FyY2gvcmlzY3YvIAo+Pj4+PiBpbmNsdWRlL2FzbS9rdm1faG9zdC5o Cj4+Pj4+IGluZGV4IDI0NTg1MzA0Yy4uMzk2YWM2MjA5IDEwMDY0NAo+Pj4+PiAtLS0gYS9hcmNo L3Jpc2N2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKPj4+Pj4gKysrIGIvYXJjaC9yaXNjdi9pbmNs dWRlL2FzbS9rdm1faG9zdC5oCj4+Pj4+IEBAIC05MSw2ICs5MSw5IEBAIHN0cnVjdCBrdm1fYXJj aCB7Cj4+Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBHLXN0YWdlIHZtaWQgKi8KPj4+Pj4gwqDC oMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBrdm1fdm1pZCB2bWlkOwo+Pj4+Pgo+Pj4+PiArwqDCoMKg wqDCoMKgIC8qIExhc3QgVkNQVSB0aGF0IHJhbiBvbiBlYWNoIHBoeXNpY2FsIENQVSAqLwo+Pj4+ PiArwqDCoMKgwqDCoMKgIGludCBfX3BlcmNwdSAqbGFzdF92Y3B1X3JhbjsKPj4+Pj4gKwo+Pj4+ PiDCoMKgwqDCoMKgwqDCoMKgwqAgLyogRy1zdGFnZSBwYWdlIHRhYmxlICovCj4+Pj4+IMKgwqDC oMKgwqDCoMKgwqDCoCBwZ2RfdCAqcGdkOwo+Pj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcGh5c19h ZGRyX3QgcGdkX3BoeXM7Cj4+Pj4+IEBAIC0zMzAsNyArMzMzLDQgQEAgYm9vbCBrdm1fcmlzY3Zf dmNwdV9zdG9wcGVkKHN0cnVjdCBrdm1fdmNwdSAKPj4+Pj4gKnZjcHUpOwo+Pj4+Pgo+Pj4+PiDC oMKgIHZvaWQga3ZtX3Jpc2N2X3ZjcHVfcmVjb3JkX3N0ZWFsX3RpbWUoc3RydWN0IGt2bV92Y3B1 ICp2Y3B1KTsKPj4+Pj4KPj4+Pj4gLS8qIEZsYWdzIHJlcHJlc2VudGluZyBpbXBsZW1lbnRhdGlv biBzcGVjaWZpYyBkZXRhaWxzICovCj4+Pj4+IC1ERUNMQVJFX1NUQVRJQ19LRVlfRkFMU0Uoa3Zt X3Jpc2N2X3Zzc3RhZ2VfdGxiX25vX2dwYSk7Cj4+Pj4+IC0KPj4+Pj4gwqDCoCAjZW5kaWYgLyog X19SSVNDVl9LVk1fSE9TVF9IX18gKi8KPj4+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3Zt L21haW4uYyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uYwo+Pj4+PiBpbmRleCAwZjNmZTM5ODYuLmIx YmJjMDgzNSAxMDA2NDQKPj4+Pj4gLS0tIGEvYXJjaC9yaXNjdi9rdm0vbWFpbi5jCj4+Pj4+ICsr KyBiL2FyY2gvcmlzY3Yva3ZtL21haW4uYwo+Pj4+PiBAQCAtMTAsMjMgKzEwLDEwIEBACj4+Pj4+ IMKgwqAgI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgo+Pj4+PiDCoMKgICNpbmNsdWRlIDxsaW51eC9t b2R1bGUuaD4KPj4+Pj4gwqDCoCAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KPj4+Pj4gLSNp bmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgo+Pj4+PiDCoMKgICNpbmNsdWRlIDxhc20va3ZtX21t dS5oPgo+Pj4+PiDCoMKgICNpbmNsdWRlIDxhc20va3ZtX25hY2wuaD4KPj4+Pj4gwqDCoCAjaW5j bHVkZSA8YXNtL3NiaS5oPgo+Pj4+Pgo+Pj4+PiAtREVGSU5FX1NUQVRJQ19LRVlfRkFMU0Uoa3Zt X3Jpc2N2X3Zzc3RhZ2VfdGxiX25vX2dwYSk7Cj4+Pj4+IC0KPj4+Pj4gLXN0YXRpYyB2b2lkIGt2 bV9yaXNjdl9zZXR1cF92ZW5kb3JfZmVhdHVyZXModm9pZCkKPj4+Pj4gLXsKPj4+Pj4gLcKgwqDC oMKgwqDCoCAvKiBBbmRlcyBBWDY2OiBzcGxpdCB0d28tc3RhZ2UgVExCcyAqLwo+Pj4+PiAtwqDC oMKgwqDCoMKgIGlmIChyaXNjdl9jYWNoZWRfbXZlbmRvcmlkKDApID09IEFOREVTX1ZFTkRPUl9J RCAmJgo+Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHJpc2N2X2NhY2hlZF9tYXJjaGlkKDAp ICYgMHhGRkZGKSA9PSAweDhBNjYpIHsKPj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgc3RhdGljX2JyYW5jaF9lbmFibGUoJmt2bV9yaXNjdl92c3N0YWdlX3RsYl9ub19ncGEpOwo+ Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBrdm1faW5mbygiVlMtc3RhZ2UgVExC IGRvZXMgbm90IGNhY2hlIGd1ZXN0IAo+Pj4+PiBwaHlzaWNhbCBhZGRyZXNzIGFuZCBWTUlEXG4i KTsKPj4+Pj4gLcKgwqDCoMKgwqDCoCB9Cj4+Pj4+IC19Cj4+Pj4+IC0KPj4+Pj4gwqDCoCBsb25n IGt2bV9hcmNoX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwKPj4+Pj4gwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgaW50IGlvY3Rs LCB1bnNpZ25lZCBsb25nIGFyZykKPj4+Pj4gwqDCoCB7Cj4+Pj4+IEBAIC0xNzIsOCArMTU5LDYg QEAgc3RhdGljIGludCBfX2luaXQgcmlzY3Zfa3ZtX2luaXQodm9pZCkKPj4+Pj4gwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBrdm1faW5mbygiQUlBIGF2YWlsYWJsZSB3aXRoICVk IGd1ZXN0IGV4dGVybmFsIAo+Pj4+PiBpbnRlcnJ1cHRzXG4iLAo+Pj4+PiDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGt2bV9yaXNjdl9haWFfbnJf aGdlaSk7Cj4+Pj4+Cj4+Pj4+IC3CoMKgwqDCoMKgwqAga3ZtX3Jpc2N2X3NldHVwX3ZlbmRvcl9m ZWF0dXJlcygpOwo+Pj4+PiAtCj4+Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBrdm1fcmVnaXN0ZXJf cGVyZl9jYWxsYmFja3MoKTsKPj4+Pj4KPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHJjID0ga3Zt X2luaXQoc2l6ZW9mKHN0cnVjdCBrdm1fdmNwdSksIDAsIFRISVNfTU9EVUxFKTsKPj4+Pj4gZGlm ZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3RsYi5jIGIvYXJjaC9yaXNjdi9rdm0vdGxiLmMKPj4+ Pj4gaW5kZXggZmYxYWVhYzRlLi4xNTQxZDA1OWEgMTAwNjQ0Cj4+Pj4+IC0tLSBhL2FyY2gvcmlz Y3Yva3ZtL3RsYi5jCj4+Pj4+ICsrKyBiL2FyY2gvcmlzY3Yva3ZtL3RsYi5jCj4+Pj4+IEBAIC04 LDYgKzgsNyBAQAo+Pj4+PiDCoMKgICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgo+Pj4+PiDCoMKg ICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KPj4+Pj4gwqDCoCAjaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+Cj4+Pj4+ICsjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Cj4+Pj4+IMKgwqAgI2luY2x1ZGUg PGxpbnV4L3NtcC5oPgo+Pj4+PiDCoMKgICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgo+Pj4+ PiDCoMKgICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgo+Pj4+PiBAQCAtMTYwLDEyICsxNjEs MTkgQEAgdm9pZCBrdm1fcmlzY3ZfbG9jYWxfaGZlbmNlX3Z2bWFfYWxsKHVuc2lnbmVkIAo+Pj4+ PiBsb25nIHZtaWQpCj4+Pj4+Cj4+Pj4+IMKgwqAgdm9pZCBrdm1fcmlzY3ZfbG9jYWxfdGxiX3Nh bml0aXplKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKPj4+Pj4gwqDCoCB7Cj4+Pj4+ICvCoMKgwqDC oMKgwqAgYm9vbCB2Y3B1X21pZ3JhdGVkOwo+Pj4+PiArwqDCoMKgwqDCoMKgIGJvb2wgdmNwdV9z d2l0Y2hlZDsKPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgdm1pZDsKPj4+ Pj4gK8KgwqDCoMKgwqDCoCBpbnQgKmxhc3RfcmFuOwo+Pj4+Pgo+Pj4+PiAtwqDCoMKgwqDCoMKg IGlmICgha3ZtX3Jpc2N2X2dzdGFnZV92bWlkX2JpdHMoKSB8fAo+Pj4+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqAgdmNwdS0+YXJjaC5sYXN0X2V4aXRfY3B1ID09IHZjcHUtPmNwdSkKPj4+Pj4gK8Kg wqDCoMKgwqDCoCBsYXN0X3JhbiA9IHRoaXNfY3B1X3B0cih2Y3B1LT5rdm0tPmFyY2gubGFzdF92 Y3B1X3Jhbik7Cj4+Pj4+ICvCoMKgwqDCoMKgwqAgdmNwdV9taWdyYXRlZCA9ICh2Y3B1LT5hcmNo Lmxhc3RfZXhpdF9jcHUgIT0gdmNwdS0+Y3B1KTsKPj4+Pj4gK8KgwqDCoMKgwqDCoCB2Y3B1X3N3 aXRjaGVkID0gKCpsYXN0X3JhbiAhPSB2Y3B1LT52Y3B1X2lkeCk7Cj4+Pj4+ICvCoMKgwqDCoMKg wqAgaWYgKCF2Y3B1X21pZ3JhdGVkICYmICF2Y3B1X3N3aXRjaGVkKQo+Pj4+PiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4+Pj4KPj4+Pj4gK8KgwqDCoMKgwqDC oCB2bWlkID0gUkVBRF9PTkNFKHZjcHUtPmt2bS0+YXJjaC52bWlkLnZtaWQpOwo+Pj4+PiArCj4+ Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoCAvKgo+Pj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIE9u IFJJU0MtViBwbGF0Zm9ybXMgd2l0aCBoYXJkd2FyZSBWTUlEIHN1cHBvcnQsIHdlIAo+Pj4+PiBz aGFyZSBzYW1lCj4+Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgICogVk1JRCBmb3IgYWxsIFZDUFVz IG9mIGEgcGFydGljdWxhciBHdWVzdC9WTS4gVGhpcyAKPj4+Pj4gbWVhbnMgd2UgbWlnaHQKPj4+ Pj4gQEAgLTE3NiwxNiArMTg0LDIzIEBAIHZvaWQga3ZtX3Jpc2N2X2xvY2FsX3RsYl9zYW5pdGl6 ZShzdHJ1Y3QgCj4+Pj4+IGt2bV92Y3B1ICp2Y3B1KQo+Pj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDC oCAqIFRvIGNsZWFudXAgc3RhbGUgVExCIGVudHJpZXMsIHdlIHNpbXBseSBmbHVzaCBhbGwgRy0g Cj4+Pj4+IHN0YWdlIFRMQgo+Pj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGVudHJpZXMgYnkg Vk1JRCB3aGVuZXZlciB1bmRlcmx5aW5nIEhvc3QgQ1BVIGNoYW5nZXMgCj4+Pj4+IGZvciBhIFZD UFUuCj4+Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgICovCj4+Pj4+IC0KPj4+Pj4gLcKgwqDCoMKg wqDCoCB2bWlkID0gUkVBRF9PTkNFKHZjcHUtPmt2bS0+YXJjaC52bWlkLnZtaWQpOwo+Pj4+PiAt wqDCoMKgwqDCoMKgIGt2bV9yaXNjdl9sb2NhbF9oZmVuY2VfZ3ZtYV92bWlkX2FsbCh2bWlkKTsK Pj4+Pj4gK8KgwqDCoMKgwqDCoCBpZiAodmNwdV9taWdyYXRlZCAmJiBrdm1fcmlzY3ZfZ3N0YWdl X3ZtaWRfYml0cygpKQo+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBrdm1fcmlz Y3ZfbG9jYWxfaGZlbmNlX2d2bWFfdm1pZF9hbGwodm1pZCk7Cj4+Pj4+Cj4+Pj4+IMKgwqDCoMKg wqDCoMKgwqDCoCAvKgo+Pj4+PiAtwqDCoMKgwqDCoMKgwqAgKiBGbHVzaCBWUy1zdGFnZSBUTEIg ZW50cmllcyBmb3IgaW1wbGVtZW50YXRpb24gd2hlcmUgVlMtIAo+Pj4+PiBzdGFnZQo+Pj4+PiAt wqDCoMKgwqDCoMKgwqAgKiBUTEIgZG9lcyBub3QgY2FoY2UgZ3Vlc3QgcGh5c2ljYWwgYWRkcmVz cyBhbmQgVk1JRC4KPj4+Pj4gK8KgwqDCoMKgwqDCoMKgICogR3Vlc3QtbG9jYWwgc2ZlbmNlLnZt YSBvbmx5IGludmFsaWRhdGVzIFZTLXN0YWdlIAo+Pj4+PiB0cmFuc2xhdGlvbnMgb24KPj4+Pj4g K8KgwqDCoMKgwqDCoMKgICogdGhlIEhvc3QgQ1BVIGN1cnJlbnRseSBiYWNraW5nIHRoZSBWQ1BV LiBJZiBhIFZDUFUgCj4+Pj4+IG1pZ3JhdGVzLCBvcgo+Pj4+PiArwqDCoMKgwqDCoMKgwqAgKiBp ZiB0aGlzIEhvc3QgQ1BVIHN3aXRjaGVzIGJldHdlZW4gVkNQVXMgb2YgdGhlIHNhbWUgVk0sIAo+ Pj4+PiBzdGFsZQo+Pj4+PiArwqDCoMKgwqDCoMKgwqAgKiBWUy1zdGFnZSBlbnRyaWVzIGNhbiBi ZSBsZWZ0IGJlaGluZCBvbiBhIEhvc3QgQ1BVIHRoYXQgCj4+Pj4+IG1pc3NlZCBhCj4+Pj4+ICvC oMKgwqDCoMKgwqDCoCAqIGd1ZXN0LWxvY2FsIGZsdXNoLiBGbHVzaCB0aGUgY3VycmVudCBDUFUn cyBWUy1zdGFnZSAKPj4+Pj4gY29udGV4dCBiZWZvcmUKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgICog ZW50ZXJpbmcgdGhlIGd1ZXN0Lgo+Pj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLwo+Pj4+PiAt wqDCoMKgwqDCoMKgIGlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZrdm1fcmlzY3ZfdnNzdGFn ZV90bGJfbm9fZ3BhKSkKPj4+Pj4gK8KgwqDCoMKgwqDCoCBpZiAoa3ZtX3Jpc2N2X25hY2xfYXZh aWxhYmxlKCkpCj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG5hY2xfaGZlbmNl X3Z2bWFfYWxsKG5hY2xfc2htZW0oKSwgdm1pZCk7Cj4+Pj4+ICvCoMKgwqDCoMKgwqAgZWxzZQo+ Pj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGt2bV9yaXNjdl9sb2NhbF9o ZmVuY2VfdnZtYV9hbGwodm1pZCk7Cj4+Pj4+ICsKPj4+Pj4gK8KgwqDCoMKgwqDCoCAqbGFzdF9y YW4gPSB2Y3B1LT52Y3B1X2lkeDsKPj4+Pj4gwqDCoCB9Cj4+Pj4+Cj4+Pj4+IMKgwqAgdm9pZCBr dm1fcmlzY3ZfZmVuY2VfaV9wcm9jZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKPj4+Pj4gZGlm ZiAtLWdpdCBhL2FyY2gvcmlzY3Yva3ZtL3ZtLmMgYi9hcmNoL3Jpc2N2L2t2bS92bS5jCj4+Pj4+ IGluZGV4IDEzYzYzYWUxYS4uMjkwNzIxOGExIDEwMDY0NAo+Pj4+PiAtLS0gYS9hcmNoL3Jpc2N2 L2t2bS92bS5jCj4+Pj4+ICsrKyBiL2FyY2gvcmlzY3Yva3ZtL3ZtLmMKPj4+Pj4gQEAgLTksNiAr OSw3IEBACj4+Pj4+IMKgwqAgI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Cj4+Pj4+IMKgwqAgI2lu Y2x1ZGUgPGxpbnV4L2Vyci5oPgo+Pj4+PiDCoMKgICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4K Pj4+Pj4gKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KPj4+Pj4gwqDCoCAjaW5jbHVkZSA8bGlu dXgvdWFjY2Vzcy5oPgo+Pj4+PiDCoMKgICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgo+Pj4+ PiDCoMKgICNpbmNsdWRlIDxhc20va3ZtX21tdS5oPgo+Pj4+PiBAQCAtMzAsNyArMzEsOSBAQCBj b25zdCBzdHJ1Y3Qga3ZtX3N0YXRzX2hlYWRlciBrdm1fdm1fc3RhdHNfaGVhZGVyIAo+Pj4+PiA9 IHsKPj4+Pj4KPj4+Pj4gwqDCoCBpbnQga3ZtX2FyY2hfaW5pdF92bShzdHJ1Y3Qga3ZtICprdm0s IHVuc2lnbmVkIGxvbmcgdHlwZSkKPj4+Pj4gwqDCoCB7Cj4+Pj4+ICvCoMKgwqDCoMKgwqAgaW50 ICpsYXN0X3JhbjsKPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGludCByOwo+Pj4+PiArwqDCoMKg wqDCoMKgIGludCBjcHU7Cj4+Pj4+Cj4+Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoCByID0ga3ZtX3Jp c2N2X21tdV9hbGxvY19wZ2Qoa3ZtKTsKPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChyKQo+ Pj4+PiBAQCAtNDIsNiArNDUsMTcgQEAgaW50IGt2bV9hcmNoX2luaXRfdm0oc3RydWN0IGt2bSAq a3ZtLCB1bnNpZ25lZCAKPj4+Pj4gbG9uZyB0eXBlKQo+Pj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHJldHVybiByOwo+Pj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+Pj4+ Pgo+Pj4+PiArwqDCoMKgwqDCoMKgIGt2bS0+YXJjaC5sYXN0X3ZjcHVfcmFuID0gYWxsb2NfcGVy Y3B1KGludCk7Cj4+Pj4+ICvCoMKgwqDCoMKgwqAgaWYgKCFrdm0tPmFyY2gubGFzdF92Y3B1X3Jh bikgewo+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBrdm1fcmlzY3ZfbW11X2Zy ZWVfcGdkKGt2bSk7Cj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAt RU5PTUVNOwo+Pj4+PiArwqDCoMKgwqDCoMKgIH0KPj4+Pj4gKwo+Pj4+PiArwqDCoMKgwqDCoMKg IGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgbGFzdF9yYW4gPSBwZXJfY3B1X3B0cihrdm0tPmFyY2gubGFzdF92Y3B1X3Jhbiwg Y3B1KTsKPj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKmxhc3RfcmFuID0gLTE7 Cj4+Pj4+ICvCoMKgwqDCoMKgwqAgfQo+Pj4+PiArCj4+Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBr dm1fcmlzY3ZfYWlhX2luaXRfdm0oa3ZtKTsKPj4+Pj4KPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKg IGt2bV9yaXNjdl9ndWVzdF90aW1lcl9pbml0KGt2bSk7Cj4+Pj4+IEBAIC01NCw2ICs2OCw4IEBA IHZvaWQga3ZtX2FyY2hfZGVzdHJveV92bShzdHJ1Y3Qga3ZtICprdm0pCj4+Pj4+IMKgwqDCoMKg wqDCoMKgwqDCoCBrdm1fZGVzdHJveV92Y3B1cyhrdm0pOwo+Pj4+Pgo+Pj4+PiDCoMKgwqDCoMKg wqDCoMKgwqAga3ZtX3Jpc2N2X2FpYV9kZXN0cm95X3ZtKGt2bSk7Cj4+Pj4+ICsKPj4+Pj4gK8Kg wqDCoMKgwqDCoCBmcmVlX3BlcmNwdShrdm0tPmFyY2gubGFzdF92Y3B1X3Jhbik7Cj4+Pj4+IMKg wqAgfQo+Pj4+Pgo+Pj4+PiDCoMKgIGludCBrdm1fdm1faW9jdGxfaXJxX2xpbmUoc3RydWN0IGt2 bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2lycV9sZXZlbCAKPj4+Pj4gKmlycWwsCj4+Pj4+IC0tIAo+Pj4+ PiAyLjQzLjAKPj4+Pj4KPj4+Cj4gCj4gCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KPiBsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKPiBsaW51eC1yaXNj dkBsaXN0cy5pbmZyYWRlYWQub3JnCj4gaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1h bi9saXN0aW5mby9saW51eC1yaXNjdgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3Rz LmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1yaXNjdgo=