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 BD31CC43334 for ; Tue, 28 Jun 2022 03:24:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To:Subject: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=EsNw1whlKXEWPr5UOPkmRfDvNuXAxSzJ/ir6/KronMQ=; b=Y0BgLTAHkrq1SA kE6ZTwAA86t3on2PE/Tr/Y5SEkDFZ4lMdBRSTmjB2ObCEQb0j+uc0C6WrqoZIe+9T2XzAjOPO+nGM b2tPHDAAPfQ5xUoo9T0Ehv9AcTWXhdSWOFa/mZL4uOTsgbFmC03HmpxufFg2vtwcJxDzCLppOXvBK GjAzvjV4SFwM+J813Af+zt1H1ix2jHUWskHLQUvMDY7mxnUmEMDjep0Ex2e+MHQBs8bblBKvQciYl hwIeqZd0hw/CqObuPAg1jq8A/Pe7HWGHfgSoMeOnG6C2IjAk8DCDR/1Bc7MUiABoaOPt3z9yG2SFY CZB22h/XaAKSRbGZjt0g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1o61od-0040eW-So; Tue, 28 Jun 2022 03:23:04 +0000 Received: from out30-44.freemail.mail.aliyun.com ([115.124.30.44]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1o61oU-0040aT-7o for linux-arm-kernel@lists.infradead.org; Tue, 28 Jun 2022 03:23:01 +0000 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R141e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018046051;MF=guanghuifeng@linux.alibaba.com;NM=1;PH=DS;RN=21;SR=0;TI=SMTPD_---0VHfBZbm_1656386569; Received: from 30.225.28.186(mailfrom:guanghuifeng@linux.alibaba.com fp:SMTPD_---0VHfBZbm_1656386569) by smtp.aliyun-inc.com; Tue, 28 Jun 2022 11:22:50 +0800 Message-ID: <05412d21-1553-d871-f293-6575c923c491@linux.alibaba.com> Date: Tue, 28 Jun 2022 11:22:48 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0 Subject: Re: [PATCH] arm64: mm: fix linear mapping mem access performace degradation To: Kefeng Wang , Mike Rapoport Cc: baolin.wang@linux.alibaba.com, catalin.marinas@arm.com, will@kernel.org, akpm@linux-foundation.org, david@redhat.com, jianyong.wu@arm.com, james.morse@arm.com, quic_qiancai@quicinc.com, christophe.leroy@csgroup.eu, jonathan@marek.ca, mark.rutland@arm.com, thunder.leizhen@huawei.com, anshuman.khandual@arm.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, geert+renesas@glider.be, ardb@kernel.org, linux-mm@kvack.org, Yao Hongbo References: <1656241815-28494-1-git-send-email-guanghuifeng@linux.alibaba.com> <4d18d303-aeed-0beb-a8a4-32893f2d438d@linux.alibaba.com> <1778c851-c274-063e-db0f-005981aaf0d3@huawei.com> From: "guanghui.fgh" In-Reply-To: <1778c851-c274-063e-db0f-005981aaf0d3@huawei.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220627_202254_676387_9F8AA09F X-CRM114-Status: GOOD ( 28.86 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org VGhhbmtzLgoK5ZyoIDIwMjIvNi8yOCA5OjUwLCBLZWZlbmcgV2FuZyDlhpnpgZM6Cj4gCj4gT24g MjAyMi82LzI4IDA6NDksIE1pa2UgUmFwb3BvcnQgd3JvdGU6Cj4+IE9uIE1vbiwgSnVuIDI3LCAy MDIyIGF0IDA2OjQ2OjUwUE0gKzA4MDAsIGd1YW5naHVpLmZnaCB3cm90ZToKPj4+IOWcqCAyMDIy LzYvMjcgMTc6NDksIE1pa2UgUmFwb3BvcnQg5YaZ6YGTOgo+Pj4+IE9uIE1vbiwgSnVuIDI3LCAy MDIyIGF0IDA1OjI0OjEwUE0gKzA4MDAsIGd1YW5naHVpLmZnaCB3cm90ZToKPj4+Pj4g5ZyoIDIw MjIvNi8yNyAxNDozNCwgTWlrZSBSYXBvcG9ydCDlhpnpgZM6Cj4+Pj4+Cj4+Pj4+IMKgwqDCoMKg wqAgT24gU3VuLCBKdW4gMjYsIDIwMjIgYXQgMDc6MTA6MTVQTSArMDgwMCwgR3VhbmdodWkgRmVu ZyB3cm90ZToKPj4+Pj4KPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIFRoZSBhcm02NCBjYW4gYnVp bGQgMk0vMUcgYmxvY2svc2VjdGlpb24gbWFwcGluZy4gV2hlbiAKPj4+Pj4gdXNpbmcgRE1BL0RN QTMyIHpvbmUKPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIChlbmFibGUgY3Jhc2hrZXJuZWwsIGRp c2FibGUgcm9kYXRhIGZ1bGwsIGRpc2FibGUgCj4+Pj4+IGtmZW5jZSksIHRoZSBtZW1fbWFwIHdp bGwKPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHVzZSBub24gYmxvY2svc2VjdGlvbiBtYXBwaW5n KGZvciBjcmFzaGtlcm5lbCByZXF1aXJlcyB0byAKPj4+Pj4gc2hyaW5rIHRoZSByZWdpb24KPj4+ Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGluIHBhZ2UgZ3JhbnVsYXJpdHkpLiBCdXQgaXQgd2lsbCBk ZWdyYWRlIHBlcmZvcm1hbmNlIAo+Pj4+PiB3aGVuIGRvaW5nIGxhcmdpbmcKPj4+Pj4gwqDCoMKg wqDCoMKgwqDCoMKgIGNvbnRpbnVvdXMgbWVtIGFjY2VzcyBpbiBrZXJuZWwobWVtY3B5L21lbW1v dmUsIGV0YykuCj4+Pj4+Cj4+Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBUaGVyZSBhcmUgbWFueSBj aGFuZ2VzIGFuZCBkaXNjdXNzaW9uczoKPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGNvbW1pdCAw MzE0OTU2MzViNDYKPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGNvbW1pdCAxYThlMWNlZjc2MDMK Pj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGNvbW1pdCA4NDI0ZWNkZGU3ZGYKPj4+Pj4gwqDCoMKg wqDCoMKgwqDCoMKgIGNvbW1pdCAwYTMwYzUzNTczYjAKPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKg IGNvbW1pdCAyNjg3Mjc1YTU4NDMKPj4+Pj4KPj4+Pj4gwqDCoMKgwqDCoCBQbGVhc2UgaW5jbHVk ZSBvbmVsaW5lIHN1bW1hcnkgb2YgdGhlIGNvbW1pdC4gKFNlZSBzZWN0aW9uIAo+Pj4+PiAiRGVz Y3JpYmUgeW91cgo+Pj4+PiDCoMKgwqDCoMKgIGNoYW5nZXMiIGluIERvY3VtZW50YXRpb24vcHJv Y2Vzcy9zdWJtaXR0aW5nLXBhdGNoZXMucnN0KQo+Pj4+Pgo+Pj4+PiBPSywgSSB3aWxsIGFkZCBv bmVsaW5lIHN1bW1hcnkgaW4gdGhlIGdpdCBjb21taXQgbWVzc2FnZXMuCj4+Pj4+Cj4+Pj4+IMKg wqDCoMKgwqDCoMKgwqDCoCBUaGlzIHBhdGNoIGNoYW5nZXMgbWVtX21hcCB0byB1c2UgYmxvY2sv c2VjdGlvbiBtYXBwaW5nIAo+Pj4+PiB3aXRoIGNyYXNoa2VybmVsLgo+Pj4+PiDCoMKgwqDCoMKg wqDCoMKgwqAgRmlyc3RseSwgZG8gYmxvY2svc2VjdGlvbiBtYXBwaW5nKG5vcm1hbGx5IDJNIG9y IDFHKSBmb3IgCj4+Pj4+IGFsbCBhdmFpbCBtZW0gYXQKPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKg IG1lbV9tYXAsIHJlc2VydmUgY3Jhc2hrZXJuZWwgbWVtb3J5LiBBbmQgdGhlbiB3YWxraW5nIAo+ Pj4+PiBwYWdldGFibGUgdG8gc3BsaXQKPj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGJsb2NrL3Nl Y3Rpb24gbWFwcGluZyB0byBub24gYmxvY2svc2VjdGlvbiAKPj4+Pj4gbWFwcGluZyhub3JtYWxs eSA0SykgW1tbb25seV1dXQo+Pj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIGNyYXNoa2VybmVs IG1lbS4KPj4+Pj4KPj4+Pj4gwqDCoMKgwqDCoCBUaGlzIGFscmVhZHkgaGFwcGVucyB3aGVuIFpP TkVfRE1BL1pPTkVfRE1BMzIgYXJlIGRpc2FibGVkLiAKPj4+Pj4gUGxlYXNlIGV4cGxhaW4KPj4+ Pj4gwqDCoMKgwqDCoCB3aHkgaXMgaXQgT2sgdG8gY2hhbmdlIHRoZSB3YXkgdGhlIG1lbW9yeSBp cyBtYXBwZWQgd2l0aAo+Pj4+PiDCoMKgwqDCoMKgIFpPTkVfRE1BL1pPTkVfRE1BMzIgZW5hYmxl ZC4KPj4+Pj4KPj4+Pj4gSW4gc2hvcnQ6Cj4+Pj4+Cj4+Pj4+IDEuYnVpbGRpbmcgYWxsIGF2YWls IG1lbSB3aXRoIGJsb2NrL3NlY3Rpb24gbWFwcGluZ++8iG5vcm1hbGx5IAo+Pj4+PiAxRy8yTe+8 iSB3aXRob3V0Cj4+Pj4+IGluc3BlY3RpbmcgY3Jhc2hrZXJuZWwKPj4+Pj4gMi4gUmVzZXJ2ZSBj cmFzaGtlcm5lbCBtZW0gYXMgc2FtZSBhcyBwcmV2aW91cyBkb2luZwo+Pj4+PiAzLiBvbmx5IGNo YW5nZSB0aGUgY3Jhc2hrZXJubGUgbWVtIG1hcHBpbmcgdG8gbm9ybWFsIAo+Pj4+PiBtYXBwaW5n KG5vcm1hbGx5IDRrKS4KPj4+Pj4gV2l0aCB0aGlzIG1ldGhvZCwgdGhlcmUgYXJlIGJsb2NrL3Nl Y3Rpb24gbWFwcGluZyBhcyBtb3JlIGFzIHBvc3NpYmxlLgo+Pj4+IFRoaXMgZG9lcyBub3QgYW5z d2VyIHRoZSBxdWVzdGlvbiB3aHkgY2hhbmdpbmcgdGhlIHdheSB0aGUgbWVtb3J5IGlzIAo+Pj4+ IG1hcHBlZAo+Pj4+IHdoZW4gdGhlcmUgaXMgWk9ORV9ETUEvRE1BMzIgYW5kIGNyYXNoa2VybmVs IHdvbid0IGNhdXNlIGEgcmVncmVzc2lvbi4KPj4+Pgo+Pj4gMS5RdW90ZWQgbWVzc2FnZXMgZnJv bSBhcmNoL2FybTY0L21tL2luaXQuYwo+Pj4KPj4+ICJNZW1vcnkgcmVzZXJ2YXRpb24gZm9yIGNy YXNoIGtlcm5lbCBlaXRoZXIgZG9uZSBlYXJseSBvciBkZWZlcnJlZAo+Pj4gZGVwZW5kaW5nIG9u IERNQSBtZW1vcnkgem9uZXMgY29uZmlncyAoWk9ORV9ETUEpIC0tCj4+Pgo+Pj4gSW4gYWJzZW5j ZSBvZiBaT05FX0RNQSBjb25maWdzIGFybTY0X2RtYV9waHlzX2xpbWl0IGluaXRpYWxpemVkCj4+ PiBoZXJlIGluc3RlYWQgb2YgbWF4X3pvbmVfcGh5cygpLsKgIFRoaXMgbGV0cyBlYXJseSByZXNl cnZhdGlvbiBvZgo+Pj4gY3Jhc2gga2VybmVsIG1lbW9yeSB3aGljaCBoYXMgYSBkZXBlbmRlbmN5 IG9uIGFybTY0X2RtYV9waHlzX2xpbWl0Lgo+Pj4gUmVzZXJ2aW5nIG1lbW9yeSBlYXJseSBmb3Ig Y3Jhc2gga2VybmVsIGFsbG93cyBsaW5lYXIgY3JlYXRpb24gb2YgYmxvY2sKPj4+IG1hcHBpbmdz IChncmVhdGVyIHRoYW4gcGFnZS1ncmFudWxhcml0eSkgZm9yIGFsbCB0aGUgbWVtb3J5IGJhbmsg cmFuZ3MuCj4+PiBJbiB0aGlzIHNjaGVtZSBhIGNvbXBhcmF0aXZlbHkgcXVpY2tlciBib290IGlz IG9ic2VydmVkLgo+Pj4KPj4+IElmIFpPTkVfRE1BIGNvbmZpZ3MgYXJlIGRlZmluZWQsIGNyYXNo IGtlcm5lbCBtZW1vcnkgcmVzZXJ2YXRpb24KPj4+IGlzIGRlbGF5ZWQgdW50aWwgRE1BIHpvbmUg bWVtb3J5IHJhbmdlIHNpemUgaW5pdGlhbGl6YXRpb24gcGVyZm9ybWVkIGluCj4+PiB6b25lX3Np emVzX2luaXQoKS7CoCBUaGUgZGVmZXIgaXMgbmVjZXNzYXJ5IHRvIHN0ZWVyIGNsZWFyIG9mIERN QSB6b25lCj4+PiBtZW1vcnkgcmFuZ2UgdG8gYXZvaWQgb3ZlcmxhcCBhbGxvY2F0aW9uLsKgIFNv IGNyYXNoIGtlcm5lbCBtZW1vcnkgCj4+PiBib3VuZGFyaWVzCj4+PiBhcmUgbm90IGtub3duIHdo ZW4gbWFwcGluZyBhbGwgYmFuayBtZW1vcnkgcmFuZ2VzLCB3aGljaCBvdGhlcndpc2UgCj4+PiBt ZWFucyBub3QKPj4+IHBvc3NpYmxlIHRvIGV4Y2x1ZGUgY3Jhc2gga2VybmVsIHJhbmdlIGZyb20g Y3JlYXRpbmcgYmxvY2sgbWFwcGluZ3Mgc28KPj4+IHBhZ2UtZ3JhbnVsYXJpdHkgbWFwcGluZ3Mg YXJlIGNyZWF0ZWQgZm9yIHRoZSBlbnRpcmUgbWVtb3J5IHJhbmdlLiIKPj4+Cj4+PiBOYW1lbHks IHRoZSBpbml0IG9yZGVyOiBtZW1ibG9jayBpbml0LS0tPmxpbmVhciBtZW0gbWFwcGluZyg0ayAK Pj4+IG1hcHBpbmcgZm9yCj4+PiBjcmFzaGtlcm5lbCwgcmVxdWlyaW5pZyBwYWdlLWdyYW51bGFy aXR5IGNoYW5naW5nKSktLS0+em9uZSBkbWEKPj4+IGxpbWl0LS0tPnJlc2VydmUgY3Jhc2hrZXJu ZWwuCj4+PiBTbyB3aGVuIGVuYWJsZSBaT05FIERNQSBhbmQgdXNpbmcgY3Jhc2hrZXJuZWwsIHRo ZSBtZW0gbWFwcGluZyB1c2luZyA0awo+Pj4gbWFwcGluZy4KPj4+Cj4+PiAyLkFzIG1lbnRpb25l ZCBhYm92ZSwgd2hlbiBsaW5lYXIgbWVtIHVzZSA0ayBtYXBwaW5nIHNpbXBseSwgdGhlcmUgaXMg Cj4+PiBoaWdoCj4+PiBkdGxiIG1pc3MoZGVncmFkZSBwZXJmb3JtYW5jZSkuCj4+PiBUaGlzIHBh dGNoIHVzZSBibG9jay9zZWN0aW9uIG1hcHBpbmcgYXMgZmFyIGFzIHBvc3NpYmxlIHdpdGggcGVy Zm9ybWFuY2UKPj4+IGltcHJvdmVtZW50Lgo+Pj4KPj4+IDMuVGhpcyBwYXRjaCByZXNlcnZlIGNy YXNoa2VybmVsIGFzIHNhbWUgYXMgdGhlIGhpc3RvcnkoWk9ORSBETUEgJgo+Pj4gY3Jhc2hrZXJu ZWwgcmVzZXJ2aW5nIG9yZGVyKSwgYW5kIG9ubHkgY2hhbmdlIHRoZSBsaW5lYXIgbWVtIG1hcHBp bmcgdG8KPj4+IGJsb2NrL3NlY3Rpb24gbWFwcGluZy4KPj4gVGhhbmsgeW91IGZvciB0aGUgZXhw bGFuYXRpb24uCj4+Cj4+IFNvIGlmIEkgdW5kZXJzdGFuZCBjb3JyZWN0bHksIHlvdSBzdWdnZXN0 IHRvIHJlc2VydmUgdGhlIGNyYXNoIGtlcm5lbAo+PiBtZW1vcnkgbGF0ZSByZWdhcmRsZXNzIG9m IFpPTkVfRE1BLzMyIGNvbmZpZ3VyYXRpb24gYW5kIHRoZW4gbWFwIHRoYXQgCj4+IG1lbW9yeQo+ PiB1c2luZyBwYWdlIGxldmVsIG1hcHBpbmdzIGFmdGVyIHRoZSBtZW1vcnkgaXMgcmVzZXJ2ZWQu Cj4+Cj4+IFRoaXMgbWFrZXMgc2Vuc2UsIGJ1dCBJIHRoaW5rIHRoZSBwYXRjaCBoYXMgYSBmZXcg c2hvcnRjb21pbmdzIHRoYW4gCj4+IG5lZWQgdG8KPj4gYmUgYWRkcmVzc2VkLgo+Pgo+Pj4gU2ln bmVkLW9mZi1ieTogR3VhbmdodWkgRmVuZyA8Z3VhbmdodWlmZW5nQGxpbnV4LmFsaWJhYmEuY29t Pgo+Pj4gLS0tCj4+PiDCoCBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL21tdS5oIHzCoMKgIDEgKwo+ Pj4gwqAgYXJjaC9hcm02NC9tbS9pbml0LmPCoMKgwqDCoMKgwqDCoMKgIHzCoMKgIDggKy0KPj4+ IMKgIGFyY2gvYXJtNjQvbW0vbW11LmPCoMKgwqDCoMKgwqDCoMKgwqAgfCAyNzQgCj4+PiArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tCj4+PiDCoCAzIGZpbGVzIGNo YW5nZWQsIDI1MyBpbnNlcnRpb25zKCspLCAzMCBkZWxldGlvbnMoLSkKPj4+Cj4+PiBkaWZmIC0t Z2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tbXUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9h c20vbW11LmgKPj4+IGluZGV4IDQ4Zjg0NjYuLmRmMTEzY2MgMTAwNjQ0Cj4+PiAtLS0gYS9hcmNo L2FybTY0L2luY2x1ZGUvYXNtL21tdS5oCj4+PiArKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNt L21tdS5oCj4+PiBAQCAtNjMsNiArNjMsNyBAQCBzdGF0aWMgaW5saW5lIGJvb2wgYXJtNjRfa2Vy bmVsX3VubWFwcGVkX2F0X2VsMCh2b2lkKQo+Pj4gwqAgZXh0ZXJuIHZvaWQgYXJtNjRfbWVtYmxv Y2tfaW5pdCh2b2lkKTsKPj4+IMKgIGV4dGVybiB2b2lkIHBhZ2luZ19pbml0KHZvaWQpOwo+Pj4g wqAgZXh0ZXJuIHZvaWQgYm9vdG1lbV9pbml0KHZvaWQpOwo+Pj4gK2V4dGVybiB2b2lkIG1hcHBp bmdfY3Jhc2hrZXJuZWwodm9pZCk7Cj4+IEkgdGhpbmsgbWFwX2NyYXNoa2VybmVsKCkgd291bGQg YmUgYSBiZXR0ZXIgbmFtZS4KPiAKPiBPciBhIG1vcmUgZ2VuZXJpYyBuYW1pbmcgKGFuZCBmb3Ig b3RoZXIgaGVscGVycykswqAgaXQncyB1c2VkIGluIAo+IGNyYXNoa2VybmVsIGZvciBub3csCj4g Cj4gYnV0IG1heWJlIG1vcmUgY2FzZXMuCj4gCj4gCj4+Cj4+PiDCoCBleHRlcm4gdm9pZCBfX2lv bWVtICplYXJseV9pb19tYXAocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyAKPj4+IHZp cnQpOwo+Pj4gwqAgZXh0ZXJuIHZvaWQgaW5pdF9tZW1fcGdwcm90KHZvaWQpOwo+Pj4gwqAgZXh0 ZXJuIHZvaWQgY3JlYXRlX3BnZF9tYXBwaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwaHlzX2Fk ZHJfdCBwaHlzLAo+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vaW5pdC5jIGIvYXJjaC9h cm02NC9tbS9pbml0LmMKPj4+IGluZGV4IDMzOWVlODQuLjBlNzU0MGIgMTAwNjQ0Cj4+PiAtLS0g YS9hcmNoL2FybTY0L21tL2luaXQuYwo+Pj4gKysrIGIvYXJjaC9hcm02NC9tbS9pbml0LmMKPj4+ IEBAIC0zODgsMTAgKzM4OCw2IEBAIHZvaWQgX19pbml0IGFybTY0X21lbWJsb2NrX2luaXQodm9p ZCkKPj4+IMKgwqDCoMKgwqAgfQo+Pj4gwqDCoMKgwqDCoCBlYXJseV9pbml0X2ZkdF9zY2FuX3Jl c2VydmVkX21lbSgpOwo+Pj4gLQo+Pj4gLcKgwqDCoCBpZiAoIUlTX0VOQUJMRUQoQ09ORklHX1pP TkVfRE1BKSAmJiAhSVNfRU5BQkxFRChDT05GSUdfWk9ORV9ETUEzMikpCj4+PiAtwqDCoMKgwqDC oMKgwqAgcmVzZXJ2ZV9jcmFzaGtlcm5lbCgpOwo+Pj4gLQo+Pj4gwqDCoMKgwqDCoCBoaWdoX21l bW9yeSA9IF9fdmEobWVtYmxvY2tfZW5kX29mX0RSQU0oKSAtIDEpICsgMTsKPj4+IMKgIH0KPj4+ IEBAIC00MzgsOCArNDM0LDggQEAgdm9pZCBfX2luaXQgYm9vdG1lbV9pbml0KHZvaWQpCj4+PiDC oMKgwqDCoMKgwqAgKiByZXF1ZXN0X3N0YW5kYXJkX3Jlc291cmNlcygpIGRlcGVuZHMgb24gY3Jh c2hrZXJuZWwncyBtZW1vcnkgCj4+PiBiZWluZwo+Pj4gwqDCoMKgwqDCoMKgICogcmVzZXJ2ZWQs IHNvIGRvIGl0IGhlcmUuCj4+PiDCoMKgwqDCoMKgwqAgKi8KPj4+IC3CoMKgwqAgaWYgKElTX0VO QUJMRUQoQ09ORklHX1pPTkVfRE1BKSB8fCBJU19FTkFCTEVEKENPTkZJR19aT05FX0RNQTMyKSkK Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXNlcnZlX2NyYXNoa2VybmVsKCk7Cj4+PiArwqDCoMKgIHJl c2VydmVfY3Jhc2hrZXJuZWwoKTsKPj4+ICvCoMKgwqAgbWFwcGluZ19jcmFzaGtlcm5lbCgpOwo+ PiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSByZXNlcnZlX2NyYXNoa2VybmVsKCkgZGlyZWN0bHku Cj4+PiDCoMKgwqDCoMKgIG1lbWJsb2NrX2R1bXBfYWxsKCk7Cj4+PiDCoCB9Cj4+PiBkaWZmIC0t Z2l0IGEvYXJjaC9hcm02NC9tbS9tbXUuYyBiL2FyY2gvYXJtNjQvbW0vbW11LmMKPj4+IGluZGV4 IDYyNmVjMzIuLjA2NzJhZmQgMTAwNjQ0Cj4+PiAtLS0gYS9hcmNoL2FybTY0L21tL21tdS5jCj4+ PiArKysgYi9hcmNoL2FybTY0L21tL21tdS5jCj4+PiBAQCAtNDk4LDYgKzQ5OCwyNTYgQEAgc3Rh dGljIGludCBfX2luaXQgZW5hYmxlX2NyYXNoX21lbV9tYXAoY2hhciAqYXJnKQo+Pj4gwqAgfQo+ Pj4gwqAgZWFybHlfcGFyYW0oImNyYXNoa2VybmVsIiwgZW5hYmxlX2NyYXNoX21lbV9tYXApOwo+ Pj4gKyNpZmRlZiBDT05GSUdfS0VYRUNfQ09SRQo+Pj4gK3N0YXRpYyBwaHlzX2FkZHJfdCBfX2lu aXQgZWFybHlfY3Jhc2hrZXJuZWxfcGd0YWJsZV9hbGxvYyhpbnQgc2hpZnQpCj4+PiArewo+Pj4g K8KgwqDCoCBwaHlzX2FkZHJfdCBwaHlzOwo+Pj4gK8KgwqDCoCB2b2lkICpwdHI7Cj4+PiArCj4+ PiArwqDCoMKgIHBoeXMgPSBtZW1ibG9ja19waHlzX2FsbG9jX3JhbmdlKFBBR0VfU0laRSwgUEFH RV9TSVpFLCAwLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg TUVNQkxPQ0tfQUxMT0NfTk9MRUFLVFJBQ0UpOwo+Pj4gK8KgwqDCoCBpZiAoIXBoeXMpCj4+PiAr wqDCoMKgwqDCoMKgwqAgcGFuaWMoIkZhaWxlZCB0byBhbGxvY2F0ZSBwYWdlIHRhYmxlIHBhZ2Vc biIpOwo+Pj4gKwo+Pj4gK8KgwqDCoCBwdHIgPSAodm9pZCAqKV9fcGh5c190b192aXJ0KHBoeXMp Owo+Pj4gK8KgwqDCoCBtZW1zZXQocHRyLCAwLCBQQUdFX1NJWkUpOwo+IGFkZCBkc2IoKSB0byBl bnN1cmUgcGFnZSBpcyB2aXNpYmxlIHRvIHBhZ2UgdGFibGUgd2Fsaz8KSSBoYWQgY29uc3VsdGVk IGZyb20gYWxsb2NfaW5pdF9jb250X3B0ZS4gVGhlcmUgbWF5YmUgbm8gbmVlZCBkc2IgYWN0dWFs bHkuCj4+PiArwqDCoMKgIHJldHVybiBwaHlzOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9p ZCBpbml0X2NyYXNoa2VybmVsX3B0ZShwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBhZGRyLAo+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgZW5kLAo+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBoeXNfYWRkcl90IHBoeXMsIHBn cHJvdF90IHByb3QpCj4+PiArewo+Pj4gK8KgwqDCoCBwdGVfdCAqcHRlcDsKPj4+ICvCoMKgwqAg cHRlcCA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZHAsIGFkZHIpOwo+Pj4gK8KgwqDCoCBkbyB7Cj4+ PiArwqDCoMKgwqDCoMKgwqAgc2V0X3B0ZShwdGVwLCBwZm5fcHRlKF9fcGh5c190b19wZm4ocGh5 cyksIHByb3QpKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBwaHlzICs9IFBBR0VfU0laRTsKPj4+ICvC oMKgwqAgfSB3aGlsZSAocHRlcCsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOwo+ Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCBhbGxvY19jcmFzaGtlcm5lbF9jb250X3B0ZShw bWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBhZGRyLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgZW5kLCBwaHlzX2FkZHJfdCBw aHlzLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBn cHJvdF90IHByb3QsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcGh5c19hZGRyX3QgKCpwZ3RhYmxlX2FsbG9jKShpbnQpLAo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludCBmbGFncykKPj4+ICt7Cj4+PiAr wqDCoMKgIHVuc2lnbmVkIGxvbmcgbmV4dDsKPj4+ICvCoMKgwqAgcG1kX3QgcG1kID0gUkVBRF9P TkNFKCpwbWRwKTsKPj4+ICsKPj4+ICvCoMKgwqAgQlVHX09OKHBtZF9zZWN0KHBtZCkpOwo+Pj4g K8KgwqDCoCBpZiAocG1kX25vbmUocG1kKSkgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIHBtZHZhbF90 IHBtZHZhbCA9IFBNRF9UWVBFX1RBQkxFIHwgUE1EX1RBQkxFX1VYTjsKPj4+ICvCoMKgwqDCoMKg wqDCoCBwaHlzX2FkZHJfdCBwdGVfcGh5czsKPj4+ICsKPj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAo ZmxhZ3MgJiBOT19FWEVDX01BUFBJTkdTKQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcG1k dmFsIHw9IFBNRF9UQUJMRV9QWE47Cj4+PiArwqDCoMKgwqDCoMKgwqAgQlVHX09OKCFwZ3RhYmxl X2FsbG9jKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBwdGVfcGh5cyA9IHBndGFibGVfYWxsb2MoUEFH RV9TSElGVCk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgX19wbWRfcG9wdWxhdGUocG1kcCwgcHRlX3Bo eXMsIHBtZHZhbCk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsK Pj4+ICvCoMKgwqAgfQo+Pj4gK8KgwqDCoCBCVUdfT04ocG1kX2JhZChwbWQpKTsKPj4+ICsKPj4+ ICvCoMKgwqAgZG8gewo+Pj4gK8KgwqDCoMKgwqDCoMKgIHBncHJvdF90IF9fcHJvdCA9IHByb3Q7 Cj4+PiArwqDCoMKgwqDCoMKgwqAgbmV4dCA9IHB0ZV9jb250X2FkZHJfZW5kKGFkZHIsIGVuZCk7 Cj4+PiArwqDCoMKgwqDCoMKgwqAgaW5pdF9jcmFzaGtlcm5lbF9wdGUocG1kcCwgYWRkciwgbmV4 dCwgcGh5cywgX19wcm90KTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBwaHlzICs9IG5leHQgLSBhZGRy Owo+Pj4gK8KgwqDCoCB9IHdoaWxlIChhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwo+Pj4gK30K Pj4+ICsKPj4+ICtzdGF0aWMgdm9pZCBpbml0X2NyYXNoa2VybmVsX3BtZChwdWRfdCAqcHVkcCwg dW5zaWduZWQgbG9uZyBhZGRyLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHVuc2lnbmVkIGxvbmcgZW5kLCBwaHlzX2FkZHJfdCBwaHlzLAo+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHBncHJvdF90IHByb3QsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcGh5c19hZGRyX3QgKCpwZ3RhYmxlX2FsbG9jKShpbnQpLCBpbnQgZmxh Z3MpCj4+PiArewo+Pj4gK8KgwqDCoCBwaHlzX2FkZHJfdCBtYXBfb2Zmc2V0Owo+Pj4gK8KgwqDC oCB1bnNpZ25lZCBsb25nIG5leHQ7Cj4+PiArwqDCoMKgIHBtZF90ICpwbWRwOwo+Pj4gK8KgwqDC oCBwbWR2YWxfdCBwbWR2YWw7Cj4+PiArCj4+PiArwqDCoMKgIHBtZHAgPSBwbWRfb2Zmc2V0KHB1 ZHAsIGFkZHIpOwo+Pj4gK8KgwqDCoCBkbyB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgbmV4dCA9IHBt ZF9hZGRyX2VuZChhZGRyLCBlbmQpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmICghcG1kX25vbmUo KnBtZHApICYmIHBtZF9zZWN0KCpwbWRwKSkgewo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cGh5c19hZGRyX3QgcHRlX3BoeXMgPSBwZ3RhYmxlX2FsbG9jKFBBR0VfU0hJRlQpOwo+Pj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgcG1kX2NsZWFyKHBtZHApOwo+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcG1kdmFsID0gUE1EX1RZUEVfVEFCTEUgfCBQTURfVEFCTEVfVVhOOwo+Pj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGZsYWdzICYgTk9fRVhFQ19NQVBQSU5HUykKPj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcG1kdmFsIHw9IFBNRF9UQUJMRV9QWE47Cj4+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBfX3BtZF9wb3B1bGF0ZShwbWRwLCBwdGVfcGh5cywg cG1kdmFsKTsKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZsdXNoX3RsYl9rZXJuZWxfcmFu Z2UoYWRkciwgYWRkciArIFBBR0VfU0laRSk7Cj4+PiArCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBtYXBfb2Zmc2V0ID0gYWRkciAtIChhZGRyICYgUE1EX01BU0spOwo+Pj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgaWYgKG1hcF9vZmZzZXQpCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGFsbG9jX2luaXRfY29udF9wdGUocG1kcCwgYWRkciAmIFBNRF9NQVNLLCBhZGRy LAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGh5 cyAtIG1hcF9vZmZzZXQsIHByb3QsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBwZ3RhYmxlX2FsbG9jLCBmbGFncyk7Cj4+PiArCj4+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBpZiAobmV4dCA8IChhZGRyICYgUE1EX01BU0spICsgUE1EX1NJWkUp Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGFsbG9jX2luaXRfY29udF9wdGUo cG1kcCwgbmV4dCwgKGFkZHIgJiBQVURfTUFTSykgKwo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgUFVEX1NJWkUsIG5leHQgLSBhZGRyICsgcGh5cywK Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHByb3Qs IHBndGFibGVfYWxsb2MsIGZsYWdzKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+PiArwqDCoMKg wqDCoMKgwqAgYWxsb2NfY3Jhc2hrZXJuZWxfY29udF9wdGUocG1kcCwgYWRkciwgbmV4dCwgcGh5 cywgcHJvdCwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBwZ3RhYmxlX2FsbG9jLCBmbGFncyk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgcGh5cyArPSBuZXh0 IC0gYWRkcjsKPj4+ICvCoMKgwqAgfSB3aGlsZSAocG1kcCsrLCBhZGRyID0gbmV4dCwgYWRkciAh PSBlbmQpOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCBhbGxvY19jcmFzaGtlcm5lbF9j b250X3BtZChwdWRfdCAqcHVkcCwgdW5zaWduZWQgbG9uZyBhZGRyLAo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgZW5kLCBwaHlz X2FkZHJfdCBwaHlzLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHBncHJvdF90IHByb3QsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcGh5c19hZGRyX3QgKCpwZ3RhYmxlX2FsbG9jKShpbnQpLAo+Pj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludCBmbGFncykKPj4+ ICt7Cj4+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgbmV4dDsKPj4+ICvCoMKgwqAgcHVkX3QgcHVk ID0gUkVBRF9PTkNFKCpwdWRwKTsKPj4+ICsKPj4+ICvCoMKgwqAgLyoKPj4+ICvCoMKgwqDCoCAq IENoZWNrIGZvciBpbml0aWFsIHNlY3Rpb24gbWFwcGluZ3MgaW4gdGhlIHBnZC9wdWQuCj4+PiAr wqDCoMKgwqAgKi8KPj4+ICvCoMKgwqAgQlVHX09OKHB1ZF9zZWN0KHB1ZCkpOwo+Pj4gK8KgwqDC oCBpZiAocHVkX25vbmUocHVkKSkgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIHB1ZHZhbF90IHB1ZHZh bCA9IFBVRF9UWVBFX1RBQkxFIHwgUFVEX1RBQkxFX1VYTjsKPj4+ICvCoMKgwqDCoMKgwqDCoCBw aHlzX2FkZHJfdCBwbWRfcGh5czsKPj4+ICsKPj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoZmxhZ3Mg JiBOT19FWEVDX01BUFBJTkdTKQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHVkdmFsIHw9 IFBVRF9UQUJMRV9QWE47Cj4+PiArwqDCoMKgwqDCoMKgwqAgQlVHX09OKCFwZ3RhYmxlX2FsbG9j KTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBwbWRfcGh5cyA9IHBndGFibGVfYWxsb2MoUE1EX1NISUZU KTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBfX3B1ZF9wb3B1bGF0ZShwdWRwLCBwbWRfcGh5cywgcHVk dmFsKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+Pj4gK8Kg wqDCoCB9Cj4+PiArwqDCoMKgIEJVR19PTihwdWRfYmFkKHB1ZCkpOwo+Pj4gKwo+Pj4gK8KgwqDC oCBkbyB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgcGdwcm90X3QgX19wcm90ID0gcHJvdDsKPj4+ICvC oMKgwqDCoMKgwqDCoCBuZXh0ID0gcG1kX2NvbnRfYWRkcl9lbmQoYWRkciwgZW5kKTsKPj4+ICvC oMKgwqDCoMKgwqDCoCBpbml0X2NyYXNoa2VybmVsX3BtZChwdWRwLCBhZGRyLCBuZXh0LCBwaHlz LCBfX3Byb3QsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBw Z3RhYmxlX2FsbG9jLCBmbGFncyk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgcGh5cyArPSBuZXh0IC0g YWRkcjsKPj4+ICvCoMKgwqAgfSB3aGlsZSAoYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKPj4+ ICt9Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgYWxsb2NfY3Jhc2hrZXJuZWxfcHVkKHBnZF90ICpw Z2RwLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB1bnNpZ25lZCBsb25nIGVuZCwgcGh5c19hZGRyX3QgcGh5cywKPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBncHJvdF90IHByb3QsCj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwaHlzX2FkZHJfdCAoKnBndGFibGVfYWxsb2MpKGlu dCksCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbnQgZmxhZ3MpCj4+ PiArewo+Pj4gK8KgwqDCoCBwaHlzX2FkZHJfdCBtYXBfb2Zmc2V0Owo+Pj4gK8KgwqDCoCB1bnNp Z25lZCBsb25nIG5leHQ7Cj4+PiArwqDCoMKgIHB1ZF90ICpwdWRwOwo+Pj4gK8KgwqDCoCBwNGRf dCAqcDRkcCA9IHA0ZF9vZmZzZXQocGdkcCwgYWRkcik7Cj4+PiArwqDCoMKgIHA0ZF90IHA0ZCA9 IFJFQURfT05DRSgqcDRkcCk7Cj4+PiArwqDCoMKgIHB1ZHZhbF90IHB1ZHZhbDsKPj4+ICsKPj4+ ICvCoMKgwqAgaWYgKHA0ZF9ub25lKHA0ZCkpIHsKPj4+ICvCoMKgwqDCoMKgwqDCoCBwNGR2YWxf dCBwNGR2YWwgPSBQNERfVFlQRV9UQUJMRSB8IFA0RF9UQUJMRV9VWE47Cj4+PiArwqDCoMKgwqDC oMKgwqAgcGh5c19hZGRyX3QgcHVkX3BoeXM7Cj4+PiArCj4+PiArwqDCoMKgwqDCoMKgwqAgaWYg KGZsYWdzICYgTk9fRVhFQ19NQVBQSU5HUykKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHA0 ZHZhbCB8PSBQNERfVEFCTEVfUFhOOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIEJVR19PTighcGd0YWJs ZV9hbGxvYyk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgcHVkX3BoeXMgPSBwZ3RhYmxlX2FsbG9jKFBV RF9TSElGVCk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgX19wNGRfcG9wdWxhdGUocDRkcCwgcHVkX3Bo eXMsIHA0ZHZhbCk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgcDRkID0gUkVBRF9PTkNFKCpwNGRwKTsK Pj4+ICvCoMKgwqAgfQo+Pj4gK8KgwqDCoCBCVUdfT04ocDRkX2JhZChwNGQpKTsKPj4+ICsKPj4+ ICvCoMKgwqAgLyoKPj4+ICvCoMKgwqDCoCAqIE5vIG5lZWQgZm9yIGxvY2tpbmcgZHVyaW5nIGVh cmx5IGJvb3QuIEFuZCBpdCBkb2Vzbid0IHdvcmsgYXMKPj4+ICvCoMKgwqDCoCAqIGV4cGVjdGVk IHdpdGggS0FTTFIgZW5hYmxlZC4KPj4+ICvCoMKgwqDCoCAqLwo+Pj4gK8KgwqDCoCBpZiAoc3lz dGVtX3N0YXRlICE9IFNZU1RFTV9CT09USU5HKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIG11dGV4X2xv Y2soJmZpeG1hcF9sb2NrKTsKPiBJdCBzZWVtcyB0aGF0IG5vIG5lZWQgdG8gdXNlIGZpeG1hcF9s b2NrLgpZZXMsIGl0J3MgdGhhdC4KPj4+ICvCoMKgwqAgcHVkcCA9IHB1ZF9vZmZzZXQocDRkcCwg YWRkcik7Cj4+PiArwqDCoMKgIGRvIHsKPj4+ICvCoMKgwqDCoMKgwqDCoCBuZXh0ID0gcHVkX2Fk ZHJfZW5kKGFkZHIsIGVuZCk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgaWYgKCFwdWRfbm9uZSgqcHVk cCkgJiYgcHVkX3NlY3QoKnB1ZHApKSB7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwaHlz X2FkZHJfdCBwbWRfcGh5cyA9IHBndGFibGVfYWxsb2MoUE1EX1NISUZUKTsKPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHB1ZF9jbGVhcihwdWRwKTsKPj4+ICsKPj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHB1ZHZhbCA9IFBVRF9UWVBFX1RBQkxFIHwgUFVEX1RBQkxFX1VYTjsKPj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChmbGFncyAmIE5PX0VYRUNfTUFQUElOR1MpCj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHB1ZHZhbCB8PSBQVURfVEFCTEVfUFhOOwo+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgX19wdWRfcG9wdWxhdGUocHVkcCwgcG1kX3BoeXMs IHB1ZHZhbCk7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmbHVzaF90bGJfa2VybmVsX3Jh bmdlKGFkZHIsIGFkZHIgKyBQQUdFX1NJWkUpOwo+Pj4gKwo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgbWFwX29mZnNldCA9IGFkZHIgLSAoYWRkciAmIFBVRF9NQVNLKTsKPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGlmIChtYXBfb2Zmc2V0KQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBhbGxvY19pbml0X2NvbnRfcG1kKHB1ZHAsIGFkZHIgJiBQVURfTUFTSywgYWRk ciwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBo eXMgLSBtYXBfb2Zmc2V0LCBwcm90LAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcGd0YWJsZV9hbGxvYywgZmxhZ3MpOwo+Pj4gKwo+Pj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgaWYgKG5leHQgPCAoYWRkciAmIFBVRF9NQVNLKSArIFBVRF9TSVpF KQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhbGxvY19pbml0X2NvbnRfcG1k KHB1ZHAsIG5leHQsIChhZGRyICYgUFVEX01BU0spICsKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFBVRF9TSVpFLCBuZXh0IC0gYWRkciArIHBoeXMs Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcm90 LCBwZ3RhYmxlX2FsbG9jLCBmbGFncyk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgfQo+Pj4gK8KgwqDC oMKgwqDCoMKgIGFsbG9jX2NyYXNoa2VybmVsX2NvbnRfcG1kKHB1ZHAsIGFkZHIsIG5leHQsIHBo eXMsIHByb3QsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcGd0YWJsZV9hbGxvYywgZmxhZ3MpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIHBoeXMgKz0gbmV4 dCAtIGFkZHI7Cj4+PiArwqDCoMKgIH0gd2hpbGUgKHB1ZHArKywgYWRkciA9IG5leHQsIGFkZHIg IT0gZW5kKTsKPj4+ICsKPj4+ICvCoMKgwqAgaWYgKHN5c3RlbV9zdGF0ZSAhPSBTWVNURU1fQk9P VElORykKPj4+ICvCoMKgwqDCoMKgwqDCoCBtdXRleF91bmxvY2soJmZpeG1hcF9sb2NrKTsKPj4+ ICt9Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgX19jcmVhdGVfY3Jhc2hrZXJuZWxfbWFwcGluZyhw Z2RfdCAqcGdkaXIsIHBoeXNfYWRkcl90IAo+Pj4gcGh5cywKPj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgdmlydCwgcGh5c19hZGRyX3Qg c2l6ZSwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBncHJv dF90IHByb3QsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBw aHlzX2FkZHJfdCAoKnBndGFibGVfYWxsb2MpKGludCksCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbnQgZmxhZ3MpCj4+PiArewo+Pj4gK8KgwqDCoCB1bnNp Z25lZCBsb25nIGFkZHIsIGVuZCwgbmV4dDsKPj4+ICvCoMKgwqAgcGdkX3QgKnBnZHAgPSBwZ2Rf b2Zmc2V0X3BnZChwZ2RpciwgdmlydCk7Cj4+PiArCj4+PiArwqDCoMKgIC8qCj4+PiArwqDCoMKg wqAgKiBJZiB0aGUgdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzcyBkb24ndCBoYXZlIHRoZSBz YW1lIG9mZnNldAo+Pj4gK8KgwqDCoMKgICogd2l0aGluIGEgcGFnZSwgd2UgY2Fubm90IG1hcCB0 aGUgcmVnaW9uIGFzIHRoZSBjYWxsZXIgZXhwZWN0cy4KPj4+ICvCoMKgwqDCoCAqLwo+Pj4gK8Kg wqDCoCBpZiAoV0FSTl9PTigocGh5cyBeIHZpcnQpICYgflBBR0VfTUFTSykpCj4+PiArwqDCoMKg wqDCoMKgwqAgcmV0dXJuOwo+Pj4gKwo+Pj4gK8KgwqDCoCBwaHlzICY9IFBBR0VfTUFTSzsKPj4+ ICvCoMKgwqAgYWRkciA9IHZpcnQgJiBQQUdFX01BU0s7Cj4+PiArwqDCoMKgIGVuZCA9IFBBR0Vf QUxJR04odmlydCArIHNpemUpOwo+Pj4gKwo+Pj4gK8KgwqDCoCBkbyB7Cj4+PiArwqDCoMKgwqDC oMKgwqAgbmV4dCA9IHBnZF9hZGRyX2VuZChhZGRyLCBlbmQpOwo+Pj4gK8KgwqDCoMKgwqDCoMKg IGFsbG9jX2NyYXNoa2VybmVsX3B1ZChwZ2RwLCBhZGRyLCBuZXh0LCBwaHlzLCBwcm90LAo+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwZ3RhYmxlX2FsbG9j LCBmbGFncyk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgcGh5cyArPSBuZXh0IC0gYWRkcjsKPj4+ICvC oMKgwqAgfSB3aGlsZSAocGdkcCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwo+Pj4gK30K Pj4gX19jcmVhdGVfY3Jhc2hrZXJuZWxfbWFwcGluZygpIGFuZCB0aGUgaGVscGVycyBpdCB1c2Vz IHJlc2VtYmxlIHZlcnkgbXVjaAo+PiBfX2NyZWF0ZV9wZ2RfbWFwcGluZygpIGFuZCBpdCdzIGhl bHBlcnMuIEkgdGhpbmsgYSBjbGVhbmVyIHdheSB3b3VsZCAKPj4gYmUgdG8KPj4gY2xlYXIgc2Vj dGlvbiBtYXBwaW5ncyBhbmQgdGhhbiBjYWxsIF9fY3JlYXRlX3BnZF9tYXBwaW5nKCkgZm9yIGNy YXNoCj4+IGtlcm5lbCBtZW1vcnkgd2l0aCBibG9jay9zZWN0aW9uIG1hcHBpbmdzIGRpc2FibGVk Lgo+IFllcywgdGhlcmUgYXJlIHRvbyBtdWNoIGR1cGxpY2F0ZWQgY29kZXMsIGlmIHRoZSBoYW5k bGluZyBvZiBjcmFzaCAKPiByZXNlcnZlIG1lbW9yeQo+IGlzIGFjY2VwdGFibGUsIHdlIGNvdWxk IGZpbmQgYSBiZXR0ZXIgd2F5KGFzIE1pa2Ugc2FpZCkgdG8gZGVhbCB3aXRoIHRoZSAKPiByZXBl YXQuCj4gQWN0dWFsbHksIHdlIHRyeSBzb21ldGhpbmcgbGlrZSB0aGlzIGJlZm9yZSwgYnV0IEkg YW0gbm90IHN1cmUgaXQgaXMgCj4gcmlnaHQgd2F5LAo+IGFuZCB3ZSBzYXcgVExCIGNvbmZsaWN0 LMKgIEkgd2lsbCB0ZXN0IHRoaXMgcGF0Y2guCk9LLCBJIGhhZCB0ZXN0IHRoaXMgcGF0Y2ggYW5k IHdvcmtlZCB3ZWxsLgoKPj4+ICtzdGF0aWMgdm9pZCBfX2luaXQgbWFwX2NyYXNoa2VybmVsKHBn ZF90ICpwZ2RwLCBwaHlzX2FkZHJfdCBzdGFydCwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcGh5c19hZGRyX3QgZW5kLCBwZ3Byb3RfdCBwcm90LCBpbnQgZmxhZ3Mp Cj4+PiArewo+Pj4gK8KgwqDCoCBfX2NyZWF0ZV9jcmFzaGtlcm5lbF9tYXBwaW5nKHBnZHAsIHN0 YXJ0LCBfX3BoeXNfdG9fdmlydChzdGFydCksCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBlbmQgLSBzdGFydCwgcHJvdCwKPj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVhcmx5X2NyYXNoa2VybmVsX3BndGFibGVfYWxsb2Ms IGZsYWdzKTsKPj4+ICt9Cj4+IE5vIG5lZWQgZm9yIHRoaXMsIHlvdSBjYW4gY2FsbCBfX2NyZWF0 ZV9jcmFzaGtlcm5lbF9tYXBwaW5nKCkgZGlyZWN0bHkgCj4+IGZyb20KPj4gbWFwcGluZ19jcmFz aGtlcm5lbCgpLgo+Pgo+Pj4gKwo+Pj4gK3ZvaWQgX19pbml0IG1hcHBpbmdfY3Jhc2hrZXJuZWwo dm9pZCkKPj4+ICt7Cj4+PiArwqDCoMKgIGlmIChjYW5fc2V0X2RpcmVjdF9tYXAoKSB8fCBJU19F TkFCTEVEKENPTkZJR19LRkVOQ0UpKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4+ICsK Pj4+ICvCoMKgwqAgaWYgKCFjcmFzaF9tZW1fbWFwIHx8ICFjcmFzaGtfcmVzLmVuZCkKPj4+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+PiArCj4+PiArwqDCoMKgIG1hcF9jcmFzaGtlcm5lbChz d2FwcGVyX3BnX2RpciwgY3Jhc2hrX3Jlcy5zdGFydCwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGNyYXNoa19yZXMuZW5kICsgMSwgUEFHRV9LRVJORUwsCj4+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBOT19CTE9DS19NQVBQSU5HUyB8IE5PX0NPTlRfTUFQUElOR1MpOwo+Pj4gK30KPj4+ ICsjZWxzZQo+Pj4gK3ZvaWQgX19pbml0IG1hcHBpbmdfY3Jhc2hrZXJuZWwodm9pZCkge30KPj4+ ICsjZW5kaWYKPj4+ICsKPj4+IMKgIHN0YXRpYyB2b2lkIF9faW5pdCBtYXBfbWVtKHBnZF90ICpw Z2RwKQo+Pj4gwqAgewo+Pj4gwqDCoMKgwqDCoCBzdGF0aWMgY29uc3QgdTY0IGRpcmVjdF9tYXBf ZW5kID0gX1BBR0VfRU5EKFZBX0JJVFNfTUlOKTsKPj4+IEBAIC01MjcsMTcgKzc3Nyw2IEBAIHN0 YXRpYyB2b2lkIF9faW5pdCBtYXBfbWVtKHBnZF90ICpwZ2RwKQo+Pj4gwqDCoMKgwqDCoMKgICov Cj4+PiDCoMKgwqDCoMKgIG1lbWJsb2NrX21hcmtfbm9tYXAoa2VybmVsX3N0YXJ0LCBrZXJuZWxf ZW5kIC0ga2VybmVsX3N0YXJ0KTsKPj4+IC0jaWZkZWYgQ09ORklHX0tFWEVDX0NPUkUKPj4+IC3C oMKgwqAgaWYgKGNyYXNoX21lbV9tYXApIHsKPj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAoSVNfRU5B QkxFRChDT05GSUdfWk9ORV9ETUEpIHx8Cj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBJU19F TkFCTEVEKENPTkZJR19aT05FX0RNQTMyKSkKPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZs YWdzIHw9IE5PX0JMT0NLX01BUFBJTkdTIHwgTk9fQ09OVF9NQVBQSU5HUzsKPj4+IC3CoMKgwqDC oMKgwqDCoCBlbHNlIGlmIChjcmFzaGtfcmVzLmVuZCkKPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIG1lbWJsb2NrX21hcmtfbm9tYXAoY3Jhc2hrX3Jlcy5zdGFydCwKPj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVzb3VyY2Vfc2l6ZSgmY3Jhc2hrX3JlcykpOwo+Pj4gLcKg wqDCoCB9Cj4+PiAtI2VuZGlmCj4+PiAtCj4+PiDCoMKgwqDCoMKgIC8qIG1hcCBhbGwgdGhlIG1l bW9yeSBiYW5rcyAqLwo+Pj4gwqDCoMKgwqDCoCBmb3JfZWFjaF9tZW1fcmFuZ2UoaSwgJnN0YXJ0 LCAmZW5kKSB7Cj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHN0YXJ0ID49IGVuZCkKPj4+IEBA IC01NzAsMTkgKzgwOSw2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBtYXBfbWVtKHBnZF90ICpwZ2Rw KQo+Pj4gwqDCoMKgwqDCoMKgICogaW4gcGFnZSBncmFudWxhcml0eSBhbmQgcHV0IGJhY2sgdW51 c2VkIG1lbW9yeSB0byBidWRkeSBzeXN0ZW0KPj4+IMKgwqDCoMKgwqDCoCAqIHRocm91Z2ggL3N5 cy9rZXJuZWwva2V4ZWNfY3Jhc2hfc2l6ZSBpbnRlcmZhY2UuCj4+PiDCoMKgwqDCoMKgwqAgKi8K Pj4+IC0jaWZkZWYgQ09ORklHX0tFWEVDX0NPUkUKPj4+IC3CoMKgwqAgaWYgKGNyYXNoX21lbV9t YXAgJiYKPj4+IC3CoMKgwqDCoMKgwqDCoCAhSVNfRU5BQkxFRChDT05GSUdfWk9ORV9ETUEpICYm IAo+Pj4gIUlTX0VOQUJMRUQoQ09ORklHX1pPTkVfRE1BMzIpKSB7Cj4+PiAtwqDCoMKgwqDCoMKg wqAgaWYgKGNyYXNoa19yZXMuZW5kKSB7Cj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBfX21h cF9tZW1ibG9jayhwZ2RwLCBjcmFzaGtfcmVzLnN0YXJ0LAo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNyYXNoa19yZXMuZW5kICsgMSwKPj4+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBQQUdFX0tFUk5FTCwKPj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBOT19CTE9DS19N QVBQSU5HUyB8IE5PX0NPTlRfTUFQUElOR1MpOwo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg bWVtYmxvY2tfY2xlYXJfbm9tYXAoY3Jhc2hrX3Jlcy5zdGFydCwKPj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVzb3VyY2Vfc2l6ZSgmY3Jhc2hr X3JlcykpOwo+Pj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4+IC3CoMKgwqAgfQo+Pj4gLSNlbmRpZgo+ Pj4gwqAgfQo+Pj4gwqAgdm9pZCBtYXJrX3JvZGF0YV9ybyh2b2lkKQo+Pj4gLS0gCj4+PiAxLjgu My4xCj4+CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwps aW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJh ZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1hcm0ta2VybmVsCg==