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 X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 855EAC4740A for ; Tue, 10 Sep 2019 07:53:02 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 544CF2084D for ; Tue, 10 Sep 2019 07:53:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="YQw8e4zh"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ti.com header.i=@ti.com header.b="QvuzFMQa" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 544CF2084D Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=ti.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date: Message-ID:From:References:To:Subject:Reply-To:Content-ID:Content-Description :Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=COtfQ11FAzWF6NPEu3fuU4zWHLBDM4FK8JAmavz3qO4=; b=YQw8e4zhdroiqG icwjrjo95BQjA12ILhT2kQ2ES8sPXisfwZmztGSB6oPfyYlXCVSx6THosf0+XnjqnBEdq863C33dy bCaHtVM+0s17nhpoH/3DbdpSLQS2JIuQcVACVeGulASx7xnPO1BDz9QCt6p6RnazVKS/3LqsWtD3n 9Hhfl9mhPGfYOjAO2d5Z0MNjHCcGTAwOseLvsbsaPDLXamsov5XxYpWWe+DmIDvFcgX+9MJBpsr/v 6eM8VGmRdU7yEv7rPc2UIW+F7hSkOHJEiRAwedpzXET9bOZ5UwHN1sl9rjVw6hVb/Lu8wwjnuFyMc XEjabEMTvcJpRRwtVOWg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1i7axL-0002es-Of; Tue, 10 Sep 2019 07:52:55 +0000 Received: from lelv0142.ext.ti.com ([198.47.23.249]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1i7axH-0002eK-6m for linux-arm-kernel@lists.infradead.org; Tue, 10 Sep 2019 07:52:53 +0000 Received: from fllv0035.itg.ti.com ([10.64.41.0]) by lelv0142.ext.ti.com (8.15.2/8.15.2) with ESMTP id x8A7qY5a026137; Tue, 10 Sep 2019 02:52:34 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1568101954; bh=D/bdqATif9/uNAEy9DaH03ppDcnwrNOsEvgtUatY4Lc=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=QvuzFMQaYD7v4N+kuMJRtS/OJtbBWTcQJMgXfUUe6VeY4PEOIsNCPumCF59h9nned zXk+yyPS4l3ihm0pgs+31Ra5zVzhD8Cgy2m5Soc+Z3f45D0RhjUhRBDyzKvtYywzxJ djCN7ad0X1rzOsuZFQYRQjBAeDskwZafhkQSHZrc= Received: from DLEE108.ent.ti.com (dlee108.ent.ti.com [157.170.170.38]) by fllv0035.itg.ti.com (8.15.2/8.15.2) with ESMTP id x8A7qYo5059845; Tue, 10 Sep 2019 02:52:34 -0500 Received: from DLEE105.ent.ti.com (157.170.170.35) by DLEE108.ent.ti.com (157.170.170.38) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Tue, 10 Sep 2019 02:52:32 -0500 Received: from fllv0040.itg.ti.com (10.64.41.20) by DLEE105.ent.ti.com (157.170.170.35) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5 via Frontend Transport; Tue, 10 Sep 2019 02:52:32 -0500 Received: from [192.168.2.6] (ileax41-snat.itg.ti.com [10.172.224.153]) by fllv0040.itg.ti.com (8.15.2/8.15.2) with ESMTP id x8A7qT8R036098; Tue, 10 Sep 2019 02:52:29 -0500 Subject: Re: [PATCH v2 10/14] dmaengine: ti: New driver for K3 UDMA - split#3: alloc/free chan_resources To: Grygorii Strashko , , , , References: <20190730093450.12664-1-peter.ujfalusi@ti.com> <20190730093450.12664-11-peter.ujfalusi@ti.com> <9091414a-6b9f-24c2-1637-2a8c0ac78dee@ti.com> From: Peter Ujfalusi Message-ID: <2340c8d7-5879-cb1a-d3b0-8936d9d43110@ti.com> Date: Tue, 10 Sep 2019 10:53:01 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <9091414a-6b9f-24c2-1637-2a8c0ac78dee@ti.com> Content-Language: en-US X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190910_005251_341216_BA8CA438 X-CRM114-Status: GOOD ( 19.32 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, lokeshvutla@ti.com, j-keerthy@ti.com, linux-kernel@vger.kernel.org, t-kristo@ti.com, tony@atomide.com, dmaengine@vger.kernel.org, dan.j.williams@intel.com, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org CgpPbiAxMC8wOS8yMDE5IDEwLjI1LCBHcnlnb3JpaSBTdHJhc2hrbyB3cm90ZToKPiAKPiAKPiBP biAzMC8wNy8yMDE5IDEyOjM0LCBQZXRlciBVamZhbHVzaSB3cm90ZToKPj4gU3BsaXQgcGF0Y2gg Zm9yIHJldmlldyBjb250YWluaW5nOiBjaGFubmVsIHJzb3VyY2UgYWxsb2NhdGlvbiBhbmQgZnJl ZQo+PiBmdW5jdGlvbnMuCj4+Cj4+IERNQSBkcml2ZXIgZm9yCj4+IFRleGFzIEluc3RydW1lbnRz IEszIE5BVlNTIFVuaWZpZWQgRE1BIOKAkyBQZXJpcGhlcmFsIFJvb3QgQ29tcGxleCAoVURNQS1Q KQo+Pgo+PiBUaGUgVURNQS1QIGlzIGludGVuZGVkIHRvIHBlcmZvcm0gc2ltaWxhciAoYnV0IHNp Z25pZmljYW50bHkgdXBncmFkZWQpCj4+IGZ1bmN0aW9ucwo+PiBhcyB0aGUgcGFja2V0LW9yaWVu dGVkIERNQSB1c2VkIG9uIHByZXZpb3VzIFNvQyBkZXZpY2VzLiBUaGUgVURNQS1QCj4+IG1vZHVs ZQo+PiBzdXBwb3J0cyB0aGUgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gb2YgdmFyaW91cyBw YWNrZXQgdHlwZXMuIFRoZQo+PiBVRE1BLVAgaXMKPj4gYXJjaGl0ZWN0ZWQgdG8gZmFjaWxpdGF0 ZSB0aGUgc2VnbWVudGF0aW9uIGFuZCByZWFzc2VtYmx5IG9mIFNvQyBETUEgZGF0YQo+PiBzdHJ1 Y3R1cmUgY29tcGxpYW50IHBhY2tldHMgdG8vZnJvbSBzbWFsbGVyIGRhdGEgYmxvY2tzIHRoYXQg YXJlIG5hdGl2ZWx5Cj4+IGNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lmaWMgcmVxdWlyZW1lbnRz IG9mIGVhY2ggY29ubmVjdGVkCj4+IHBlcmlwaGVyYWwuIE11bHRpcGxlCj4+IFR4IGFuZCBSeCBj aGFubmVscyBhcmUgcHJvdmlkZWQgd2l0aGluIHRoZSBETUEgd2hpY2ggYWxsb3cgbXVsdGlwbGUK Pj4gc2VnbWVudGF0aW9uCj4+IG9yIHJlYXNzZW1ibHkgb3BlcmF0aW9ucyB0byBiZSBvbmdvaW5n LiBUaGUgRE1BIGNvbnRyb2xsZXIgbWFpbnRhaW5zCj4+IHN0YXRlCj4+IGluZm9ybWF0aW9uIGZv ciBlYWNoIG9mIHRoZSBjaGFubmVscyB3aGljaCBhbGxvd3MgcGFja2V0IHNlZ21lbnRhdGlvbiBh bmQKPj4gcmVhc3NlbWJseSBvcGVyYXRpb25zIHRvIGJlIHRpbWUgZGl2aXNpb24gbXVsdGlwbGV4 ZWQgYmV0d2VlbiBjaGFubmVscwo+PiBpbiBvcmRlcgo+PiB0byBzaGFyZSB0aGUgdW5kZXJseWlu ZyBETUEgaGFyZHdhcmUuIEFuIGV4dGVybmFsIERNQSBzY2hlZHVsZXIgaXMKPj4gdXNlZCB0bwo+ PiBjb250cm9sIHRoZSBvcmRlcmluZyBhbmQgcmF0ZSBhdCB3aGljaCB0aGlzIG11bHRpcGxleGlu ZyBvY2N1cnMgZm9yCj4+IFRyYW5zbWl0Cj4+IG9wZXJhdGlvbnMuIFRoZSBvcmRlcmluZyBhbmQg cmF0ZSBvZiBSZWNlaXZlIG9wZXJhdGlvbnMgaXMgaW5kaXJlY3RseQo+PiBjb250cm9sbGVkCj4+ IGJ5IHRoZSBvcmRlciBpbiB3aGljaCBibG9ja3MgYXJlIHB1c2hlZCBpbnRvIHRoZSBETUEgb24g dGhlIFJ4IFBTSS1MCj4+IGludGVyZmFjZS4KPj4KPj4gVGhlIFVETUEtUCBhbHNvIHN1cHBvcnRz IGFjdGluZyBhcyBib3RoIGEgVVRDIGFuZCBVRE1BLUMgZm9yIGl0cyBpbnRlcm5hbAo+PiBjaGFu bmVscy4gQ2hhbm5lbHMgaW4gdGhlIFVETUEtUCBjYW4gYmUgY29uZmlndXJlZCB0byBiZSBlaXRo ZXIKPj4gUGFja2V0LUJhc2VkIG9yCj4+IFRoaXJkLVBhcnR5IGNoYW5uZWxzIG9uIGEgY2hhbm5l bCBieSBjaGFubmVsIGJhc2lzLgo+Pgo+PiBUaGUgaW5pdGlhbCBkcml2ZXIgc3VwcG9ydHM6Cj4+ IC0gTUVNX1RPX01FTSAoVFIgbW9kZSkKPj4gLSBERVZfVE9fTUVNIChQYWNrZXQgLyBUUiBtb2Rl KQo+PiAtIE1FTV9UT19ERVYgKFBhY2tldCAvIFRSIG1vZGUpCj4+IC0gQ3ljbGljIChQYWNrZXQg LyBUUiBtb2RlKQo+PiAtIE1ldGFkYXRhIGZvciBkZXNjcmlwdG9ycwo+Pgo+PiBTaWduZWQtb2Zm LWJ5OiBQZXRlciBVamZhbHVzaSA8cGV0ZXIudWpmYWx1c2lAdGkuY29tPgo+PiAtLS0KPj4gwqAg ZHJpdmVycy9kbWEvdGkvazMtdWRtYS5jIHwgNzgwICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKwo+PiDCoCAxIGZpbGUgY2hhbmdlZCwgNzgwIGluc2VydGlvbnMoKykKPj4K Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3RpL2szLXVkbWEuYyBiL2RyaXZlcnMvZG1hL3Rp L2szLXVkbWEuYwo+PiBpbmRleCA1MmNjYzZkNDZkZTkuLjBkZTM4ZGIwM2I4ZCAxMDA2NDQKPj4g LS0tIGEvZHJpdmVycy9kbWEvdGkvazMtdWRtYS5jCj4+ICsrKyBiL2RyaXZlcnMvZG1hL3RpL2sz LXVkbWEuYwo+PiBAQCAtMTAzOSw2ICsxMDM5LDc4NiBAQCBzdGF0aWMgaXJxcmV0dXJuX3QgdWRt YV91ZG1hX2lycV9oYW5kbGVyKGludAo+PiBpcnEsIHZvaWQgKmRhdGEpCj4+IMKgwqDCoMKgwqAg cmV0dXJuIElSUV9IQU5ETEVEOwo+PiDCoCB9Cj4+IMKgICtzdGF0aWMgc3RydWN0IHVkbWFfcmZs b3cgKl9fdWRtYV9yZXNlcnZlX3JmbG93KHN0cnVjdCB1ZG1hX2RldiAqdWQsCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVudW0gdWRtYV90 cF9sZXZlbCB0cGwsIGludCBpZCkKPj4gK3sKPj4gK8KgwqDCoCBERUNMQVJFX0JJVE1BUCh0bXAs IEszX1VETUFfTUFYX1JGTE9XUyk7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoaWQgPj0gMCkgewo+PiAr wqDCoMKgwqDCoMKgwqAgaWYgKHRlc3RfYml0KGlkLCB1ZC0+cmZsb3dfbWFwKSkgewo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKHVkLT5kZXYsICJyZmxvdyVkIGlzIGluIHVzZVxu IiwgaWQpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gRVJSX1BUUigtRU5PRU5U KTsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoCB9IGVsc2Ugewo+PiArwqDCoMKgwqDC oMKgwqAgYml0bWFwX29yKHRtcCwgdWQtPnJmbG93X21hcCwgdWQtPnJmbG93X21hcF9yZXNlcnZl ZCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVkLT5yZmxvd19jbnQpOwo+PiArCj4+ ICvCoMKgwqDCoMKgwqDCoCBpZCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh0bXAsIHVkLT5yZmxvd19j bnQsIHVkLT5yY2hhbl9jbnQpOwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKGlkID49IHVkLT5yZmxv d19jbnQpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBFUlJfUFRSKC1FTk9FTlQp Owo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHNldF9iaXQoaWQsIHVkLT5yZmxvd19tYXAp Owo+PiArwqDCoMKgIHJldHVybiAmdWQtPnJmbG93c1tpZF07Cj4+ICt9Cj4+ICsKPj4gKyNkZWZp bmUgVURNQV9SRVNFUlZFX1JFU09VUkNFKHJlcynCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBcCj4+ICtzdGF0aWMgc3RydWN0IHVkbWFfIyNyZXMgKl9fdWRtYV9yZXNlcnZl XyMjcmVzKHN0cnVjdCB1ZG1hX2RldiAqdWQswqDCoMKgIFwKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZW51bSB1ZG1hX3RwX2xldmVsIHRw bCzCoMKgwqAgXAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBpbnQgaWQpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4+ICt7wqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBcCj4+ICvCoMKgwqAgaWYgKGlkID49IDApIHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHRl c3RfYml0KGlkLCB1ZC0+cmVzIyNfbWFwKSkge8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKHVkLT5kZXYsICJyZXMjIyVkIGlzIGluIHVz ZVxuIiwgaWQpO8KgwqDCoCBcCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBFUlJf UFRSKC1FTk9FTlQpO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+PiArwqDCoMKgwqDCoMKgwqAg fcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBc Cj4+ICvCoMKgwqAgfSBlbHNlIHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgXAo+PiArwqDCoMKgwqDCoMKgwqAgaW50IHN0YXJ0O8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBcCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAodHBsID49IHVkLT5tYXRjaF9kYXRhLT50cGxfbGV2 ZWxzKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0 cGwgPSB1ZC0+bWF0Y2hfZGF0YS0+dHBsX2xldmVscyAtIDE7wqDCoMKgwqDCoMKgwqAgXAo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBcCj4+ICvCoMKgwqDCoMKgwqDCoCBzdGFydCA9IHVkLT5tYXRjaF9kYXRh LT5sZXZlbF9zdGFydF9pZHhbdHBsXTvCoMKgwqDCoMKgwqDCoCBcCj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IFwKPj4gK8KgwqDCoMKgwqDCoMKgIGlkID0gZmluZF9uZXh0X3plcm9fYml0KHVkLT5yZXMjI19t YXAsIHVkLT5yZXMjI19jbnQswqDCoMKgIFwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHN0YXJ0KTvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+PiAr wqDCoMKgwqDCoMKgwqAgaWYgKGlkID09IHVkLT5yZXMjI19jbnQpIHvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgXAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gRVJSX1BU UigtRU5PRU5UKTvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPj4gK8KgwqDCoMKgwqDCoMKgIH3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+ PiArwqDCoMKgIH3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBcCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPj4gK8KgwqDCoCBzZXRfYml0 KGlkLCB1ZC0+cmVzIyNfbWFwKTvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBcCj4+ICvCoMKgwqAgcmV0dXJuICZ1ZC0+cmVzIyNzW2lkXTvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPj4gK30KPj4gKwo+PiArVURNQV9SRVNFUlZF X1JFU09VUkNFKHRjaGFuKTsKPj4gK1VETUFfUkVTRVJWRV9SRVNPVVJDRShyY2hhbik7Cj4gCj4g UGVyc29uYWxseSBJJ20gbm90IGEgZmFuIG9mIHN1Y2ggYSBiaWcgbWFjcm8sIHdvdWxkbid0IGJl IHN0YXRpYwo+IGZ1bmN0aW9ucyBiZXR0ZXIuCgpUaGUgb3RoZXIgb3B0aW9uIGlzIHRvIGhhdmUg dHdvIGlkZW50aWNhbCBmdW5jdGlvbiB3aXRoIG9ubHkgZGlmZmVyZW5jZQppcyBzL3RjaGFuL3Jj aGFuLgoKPiAKPj4gKwo+PiArc3RhdGljIGludCB1ZG1hX2dldF90Y2hhbihzdHJ1Y3QgdWRtYV9j aGFuICp1YykKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3QgdWRtYV9kZXYgKnVkID0gdWMtPnVkOwo+ PiArCj4+ICvCoMKgwqAgaWYgKHVjLT50Y2hhbikgewo+PiArwqDCoMKgwqDCoMKgwqAgZGV2X2Ri Zyh1ZC0+ZGV2LCAiY2hhbiVkOiBhbHJlYWR5IGhhdmUgdGNoYW4lZCBhbGxvY2F0ZWRcbiIsCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVjLT5pZCwgdWMtPnRjaGFuLT5pZCk7Cj4+ICvCoMKg wqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCB1Yy0+dGNo YW4gPSBfX3VkbWFfcmVzZXJ2ZV90Y2hhbih1ZCwgdWMtPmNoYW5uZWxfdHBsLCAtMSk7Cj4+ICvC oMKgwqAgaWYgKElTX0VSUih1Yy0+dGNoYW4pKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIFBU Ul9FUlIodWMtPnRjaGFuKTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiAwOwo+PiArfQo+PiArCj4g Cj4gWy4uLl0KPiAKPj4gKwo+PiArc3RhdGljIGludCB1ZG1hX3Rpc2NpX2NoYW5uZWxfY29uZmln KHN0cnVjdCB1ZG1hX2NoYW4gKnVjKQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCB1ZG1hX2RldiAq dWQgPSB1Yy0+dWQ7Cj4+ICvCoMKgwqAgc3RydWN0IHVkbWFfdGlzY2lfcm0gKnRpc2NpX3JtID0g JnVkLT50aXNjaV9ybTsKPj4gK8KgwqDCoCBjb25zdCBzdHJ1Y3QgdGlfc2NpX3JtX3VkbWFwX29w cyAqdGlzY2lfb3BzID0KPj4gdGlzY2lfcm0tPnRpc2NpX3VkbWFwX29wczsKPj4gK8KgwqDCoCBz dHJ1Y3QgdWRtYV90Y2hhbiAqdGNoYW4gPSB1Yy0+dGNoYW47Cj4+ICvCoMKgwqAgc3RydWN0IHVk bWFfcmNoYW4gKnJjaGFuID0gdWMtPnJjaGFuOwo+PiArwqDCoMKgIGludCByZXQgPSAwOwo+PiAr Cj4+ICvCoMKgwqAgaWYgKHVjLT5kaXIgPT0gRE1BX01FTV9UT19NRU0pIHsKPj4gK8KgwqDCoMKg wqDCoMKgIC8qIE5vbiBzeW5jaHJvbml6ZWQgLSBtZW0gdG8gbWVtIHR5cGUgb2YgdHJhbnNmZXIg Ki8KPj4gK8KgwqDCoMKgwqDCoMKgIGludCB0Y19yaW5nID0gazNfcmluZ2FjY19nZXRfcmluZ19p ZCh0Y2hhbi0+dGNfcmluZyk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgdGlfc2NpX21zZ19y bV91ZG1hcF90eF9jaF9jZmcgcmVxX3R4ID0geyAwIH07Cj4+ICvCoMKgwqDCoMKgwqDCoCBzdHJ1 Y3QgdGlfc2NpX21zZ19ybV91ZG1hcF9yeF9jaF9jZmcgcmVxX3J4ID0geyAwIH07Cj4+ICsKPj4g K8KgwqDCoMKgwqDCoMKgIHJlcV90eC52YWxpZF9wYXJhbXMgPQo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0NIX1BBVVNFX09OX0VSUl9WQUxJRCB8 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfQ0hf VFhfRklMVF9FSU5GT19WQUxJRCB8Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFRJX1NDSV9N U0dfVkFMVUVfUk1fVURNQVBfQ0hfVFhfRklMVF9QU1dPUkRTX1ZBTElEIHwKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9DSF9DSEFOX1RZUEVfVkFM SUQgfAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQ X0NIX1RYX1NVUFJfVERQS1RfVkFMSUQgfAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBUSV9T Q0lfTVNHX1ZBTFVFX1JNX1VETUFQX0NIX0ZFVENIX1NJWkVfVkFMSUQgfAo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0NIX0NRX1FOVU1fVkFMSUQ7 Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHJlcV90eC5uYXZfaWQgPSB0aXNjaV9ybS0+dGlzY2lf ZGV2X2lkOwo+PiArwqDCoMKgwqDCoMKgwqAgcmVxX3R4LmluZGV4ID0gdGNoYW4tPmlkOwo+PiAr wqDCoMKgwqDCoMKgwqAgcmVxX3R4LnR4X3BhdXNlX29uX2VyciA9IDA7Cj4+ICvCoMKgwqDCoMKg wqDCoCByZXFfdHgudHhfZmlsdF9laW5mbyA9IDA7Cj4+ICvCoMKgwqDCoMKgwqDCoCByZXFfdHgu dHhfZmlsdF9wc3dvcmRzID0gMDsKPj4gK8KgwqDCoMKgwqDCoMKgIHJlcV90eC50eF9jaGFuX3R5 cGUgPSBUSV9TQ0lfUk1fVURNQVBfQ0hBTl9UWVBFXzNSRFBfQkNPUFlfUEJSUjsKPj4gK8KgwqDC oMKgwqDCoMKgIHJlcV90eC50eF9zdXByX3RkcGt0ID0gMDsKPj4gK8KgwqDCoMKgwqDCoMKgIHJl cV90eC50eF9mZXRjaF9zaXplID0gc2l6ZW9mKHN0cnVjdCBjcHBpNV9kZXNjX2hkcl90KSA+PiAy Owo+PiArwqDCoMKgwqDCoMKgwqAgcmVxX3R4LnR4Y3FfcW51bSA9IHRjX3Jpbmc7Cj4+ICsKPj4g K8KgwqDCoMKgwqDCoMKgIHJldCA9IHRpc2NpX29wcy0+dHhfY2hfY2ZnKHRpc2NpX3JtLT50aXNj aSwgJnJlcV90eCk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAocmV0KSB7Cj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGRldl9lcnIodWQtPmRldiwgInRjaGFuJWQgY2ZnIGZhaWxlZCAlZFxuIiwK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0Y2hhbi0+aWQsIHJldCk7Cj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHJlcV9yeC52YWxpZF9wYXJhbXMgPQo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0NIX1BBVVNFX09OX0VSUl9W QUxJRCB8Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFRJX1NDSV9NU0dfVkFMVUVfUk1fVURN QVBfQ0hfRkVUQ0hfU0laRV9WQUxJRCB8Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFRJX1ND SV9NU0dfVkFMVUVfUk1fVURNQVBfQ0hfQ1FfUU5VTV9WQUxJRCB8Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIFRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfQ0hfQ0hBTl9UWVBFX1ZBTElEIHwK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9DSF9S WF9JR05PUkVfU0hPUlRfVkFMSUQgfAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBUSV9TQ0lf TVNHX1ZBTFVFX1JNX1VETUFQX0NIX1JYX0lHTk9SRV9MT05HX1ZBTElEOwo+PiArCj4+ICvCoMKg wqDCoMKgwqDCoCByZXFfcngubmF2X2lkID0gdGlzY2lfcm0tPnRpc2NpX2Rldl9pZDsKPj4gK8Kg wqDCoMKgwqDCoMKgIHJlcV9yeC5pbmRleCA9IHJjaGFuLT5pZDsKPj4gK8KgwqDCoMKgwqDCoMKg IHJlcV9yeC5yeF9mZXRjaF9zaXplID0gc2l6ZW9mKHN0cnVjdCBjcHBpNV9kZXNjX2hkcl90KSA+ PiAyOwo+PiArwqDCoMKgwqDCoMKgwqAgcmVxX3J4LnJ4Y3FfcW51bSA9IHRjX3Jpbmc7Cj4+ICvC oMKgwqDCoMKgwqDCoCByZXFfcngucnhfcGF1c2Vfb25fZXJyID0gMDsKPj4gK8KgwqDCoMKgwqDC oMKgIHJlcV9yeC5yeF9jaGFuX3R5cGUgPSBUSV9TQ0lfUk1fVURNQVBfQ0hBTl9UWVBFXzNSRFBf QkNPUFlfUEJSUjsKPj4gK8KgwqDCoMKgwqDCoMKgIHJlcV9yeC5yeF9pZ25vcmVfc2hvcnQgPSAw Owo+PiArwqDCoMKgwqDCoMKgwqAgcmVxX3J4LnJ4X2lnbm9yZV9sb25nID0gMDsKPj4gKwo+PiAr wqDCoMKgwqDCoMKgwqAgcmV0ID0gdGlzY2lfb3BzLT5yeF9jaF9jZmcodGlzY2lfcm0tPnRpc2Np LCAmcmVxX3J4KTsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChyZXQpIHsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgZGV2X2Vycih1ZC0+ZGV2LCAicmNoYW4lZCBhbGxvYyBmYWlsZWQgJWRcbiIs Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmNoYW4tPmlkLCByZXQpOwo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+PiArwqDCoMKgwqDCoMKgwqAgfQo+ PiArwqDCoMKgIH0gZWxzZSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCAvKiBTbGF2ZSB0cmFuc2ZlciAq Lwo+PiArwqDCoMKgwqDCoMKgwqAgdTMyIG1vZGUsIGZldGNoX3NpemU7Cj4+ICsKPj4gK8KgwqDC oMKgwqDCoMKgIGlmICh1Yy0+cGt0X21vZGUpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg bW9kZSA9IFRJX1NDSV9STV9VRE1BUF9DSEFOX1RZUEVfUEtUX1BCUlI7Cj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGZldGNoX3NpemUgPSBjcHBpNV9oZGVzY19jYWxjX3NpemUodWMtPm5lZWRz X2VwaWIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgdWMtPnBzZF9zaXplLCAwKTsKPj4gK8KgwqDCoMKgwqDCoMKgIH0gZWxz ZSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1vZGUgPSBUSV9TQ0lfUk1fVURNQVBfQ0hB Tl9UWVBFXzNSRFBfUEJSUjsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmV0Y2hfc2l6ZSA9 IHNpemVvZihzdHJ1Y3QgY3BwaTVfZGVzY19oZHJfdCk7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmICh1Yy0+ZGlyID09IERNQV9NRU1fVE9fREVWKSB7Cj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIFRYICovCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGludCB0Y19yaW5nID0gazNfcmluZ2FjY19nZXRfcmluZ19pZCh0Y2hhbi0+dGNfcmluZyk7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCB0aV9zY2lfbXNnX3JtX3VkbWFwX3R4 X2NoX2NmZyByZXFfdHggPSB7IDAgfTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBy ZXFfdHgudmFsaWRfcGFyYW1zID0KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgVElfU0NJX01T R19WQUxVRV9STV9VRE1BUF9DSF9QQVVTRV9PTl9FUlJfVkFMSUQgfAo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0NIX1RYX0ZJTFRfRUlORk9fVkFM SUQgfAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQ X0NIX1RYX0ZJTFRfUFNXT1JEU19WQUxJRCB8Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFRJ X1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfQ0hfQ0hBTl9UWVBFX1ZBTElEIHwKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9DSF9UWF9TVVBSX1REUEtU X1ZBTElEIHwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgVElfU0NJX01TR19WQUxVRV9STV9V RE1BUF9DSF9GRVRDSF9TSVpFX1ZBTElEIHwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgVElf U0NJX01TR19WQUxVRV9STV9VRE1BUF9DSF9DUV9RTlVNX1ZBTElEOwo+PiArCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHJlcV90eC5uYXZfaWQgPSB0aXNjaV9ybS0+dGlzY2lfZGV2X2lkOwo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXFfdHguaW5kZXggPSB0Y2hhbi0+aWQ7Cj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlcV90eC50eF9wYXVzZV9vbl9lcnIgPSAwOwo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCByZXFfdHgudHhfZmlsdF9laW5mbyA9IDA7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHJlcV90eC50eF9maWx0X3Bzd29yZHMgPSAwOwo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCByZXFfdHgudHhfY2hhbl90eXBlID0gbW9kZTsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgcmVxX3R4LnR4X3N1cHJfdGRwa3QgPSAwOwo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCByZXFfdHgudHhfZmV0Y2hfc2l6ZSA9IGZldGNoX3NpemUgPj4gMjsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcmVxX3R4LnR4Y3FfcW51bSA9IHRjX3Jpbmc7Cj4+ICsKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gdGlzY2lfb3BzLT50eF9jaF9jZmcodGlzY2lfcm0t PnRpc2NpLCAmcmVxX3R4KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHJldCkgewo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRldl9lcnIodWQtPmRldiwgInRjaGFu JWQgY2ZnIGZhaWxlZCAlZFxuIiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHRjaGFuLT5pZCwgcmV0KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCByZXR1cm4gcmV0Owo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqDCoMKg wqDCoCB9IGVsc2Ugewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBSWCAqLwo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBpbnQgZmRfcmluZyA9IGszX3JpbmdhY2NfZ2V0X3JpbmdfaWQo cmNoYW4tPmZkX3JpbmcpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbnQgcnhfcmluZyA9 IGszX3JpbmdhY2NfZ2V0X3JpbmdfaWQocmNoYW4tPnJfcmluZyk7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHN0cnVjdCB0aV9zY2lfbXNnX3JtX3VkbWFwX3J4X2NoX2NmZyByZXFfcnggPSB7 IDAgfTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHRpX3NjaV9tc2dfcm1fdWRt YXBfZmxvd19jZmcgZmxvd19yZXEgPSB7IDAgfTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCByZXFfcngudmFsaWRfcGFyYW1zID0KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgVElf U0NJX01TR19WQUxVRV9STV9VRE1BUF9DSF9QQVVTRV9PTl9FUlJfVkFMSUQgfAo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0NIX0ZFVENIX1NJWkVf VkFMSUQgfAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VE TUFQX0NIX0NRX1FOVU1fVkFMSUQgfAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBUSV9TQ0lf TVNHX1ZBTFVFX1JNX1VETUFQX0NIX0NIQU5fVFlQRV9WQUxJRCB8Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIFRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfQ0hfUlhfSUdOT1JFX1NIT1JUX1ZB TElEIHwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgVElfU0NJX01TR19WQUxVRV9STV9VRE1B UF9DSF9SWF9JR05PUkVfTE9OR19WQUxJRDsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCByZXFfcngubmF2X2lkID0gdGlzY2lfcm0tPnRpc2NpX2Rldl9pZDsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgcmVxX3J4LmluZGV4ID0gcmNoYW4tPmlkOwo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCByZXFfcngucnhfZmV0Y2hfc2l6ZSA9wqAgZmV0Y2hfc2l6ZSA+PiAyOwo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCByZXFfcngucnhjcV9xbnVtID0gcnhfcmluZzsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcmVxX3J4LnJ4X3BhdXNlX29uX2VyciA9IDA7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHJlcV9yeC5yeF9jaGFuX3R5cGUgPSBtb2RlOwo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCByZXFfcngucnhfaWdub3JlX3Nob3J0ID0gMDsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgcmVxX3J4LnJ4X2lnbm9yZV9sb25nID0gMDsKPj4gKwo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCByZXQgPSB0aXNjaV9vcHMtPnJ4X2NoX2NmZyh0aXNjaV9ybS0+dGlzY2ks ICZyZXFfcngpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAocmV0KSB7Cj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZGV2X2Vycih1ZC0+ZGV2LCAicmNoYW4lZCBjZmcg ZmFpbGVkICVkXG4iLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cmNoYW4tPmlkLCByZXQpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVy biByZXQ7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBmbG93X3JlcS52YWxpZF9wYXJhbXMgPQo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0ZMT1dfRUlORk9fUFJFU0VOVF9WQUxJRCB8 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfRkxP V19QU0lORk9fUFJFU0VOVF9WQUxJRCB8Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFRJX1ND SV9NU0dfVkFMVUVfUk1fVURNQVBfRkxPV19FUlJPUl9IQU5ETElOR19WQUxJRCB8Cj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIFRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfRkxPV19ERVNDX1RZ UEVfVkFMSUQgfAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBUSV9TQ0lfTVNHX1ZBTFVFX1JN X1VETUFQX0ZMT1dfREVTVF9RTlVNX1ZBTElEIHwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg VElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9GTE9XX1NSQ19UQUdfSElfU0VMX1ZBTElEIHwKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9GTE9XX1NS Q19UQUdfTE9fU0VMX1ZBTElEIHwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgVElfU0NJX01T R19WQUxVRV9STV9VRE1BUF9GTE9XX0RFU1RfVEFHX0hJX1NFTF9WQUxJRCB8Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIFRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfRkxPV19ERVNUX1RBR19M T19TRUxfVkFMSUQgfAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBUSV9TQ0lfTVNHX1ZBTFVF X1JNX1VETUFQX0ZMT1dfRkRRMF9TWjBfUU5VTV9WQUxJRCB8Cj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIFRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfRkxPV19GRFExX1FOVU1fVkFMSUQgfAo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0ZMT1df RkRRMl9RTlVNX1ZBTElEIHwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgVElfU0NJX01TR19W QUxVRV9STV9VRE1BUF9GTE9XX0ZEUTNfUU5VTV9WQUxJRDsKPj4gKwo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBmbG93X3JlcS5uYXZfaWQgPSB0aXNjaV9ybS0+dGlzY2lfZGV2X2lkOwo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmbG93X3JlcS5mbG93X2luZGV4ID0gcmNoYW4tPmlkOwo+ PiArCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICh1Yy0+bmVlZHNfZXBpYikKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmbG93X3JlcS5yeF9laW5mb19wcmVzZW50ID0g MTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZWxzZQo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGZsb3dfcmVxLnJ4X2VpbmZvX3ByZXNlbnQgPSAwOwo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZiAodWMtPnBzZF9zaXplKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGZsb3dfcmVxLnJ4X3BzaW5mb19wcmVzZW50ID0gMTsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgZWxzZQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZsb3df cmVxLnJ4X3BzaW5mb19wcmVzZW50ID0gMDsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmxv d19yZXEucnhfZXJyb3JfaGFuZGxpbmcgPSAxOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBm bG93X3JlcS5yeF9kZXNjX3R5cGUgPSAwOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmbG93 X3JlcS5yeF9kZXN0X3FudW0gPSByeF9yaW5nOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBm bG93X3JlcS5yeF9zcmNfdGFnX2hpX3NlbCA9IDI7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGZsb3dfcmVxLnJ4X3NyY190YWdfbG9fc2VsID0gNDsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZmxvd19yZXEucnhfZGVzdF90YWdfaGlfc2VsID0gNTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgZmxvd19yZXEucnhfZGVzdF90YWdfbG9fc2VsID0gNDsKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZmxvd19yZXEucnhfZmRxMF9zejBfcW51bSA9IGZkX3Jpbmc7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGZsb3dfcmVxLnJ4X2ZkcTFfcW51bSA9IGZkX3Jpbmc7Cj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGZsb3dfcmVxLnJ4X2ZkcTJfcW51bSA9IGZkX3Jpbmc7Cj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZsb3dfcmVxLnJ4X2ZkcTNfcW51bSA9IGZkX3Jpbmc7Cj4+ ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gdGlzY2lfb3BzLT5yeF9mbG93X2Nm Zyh0aXNjaV9ybS0+dGlzY2ksCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmZmxvd19yZXEpOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGlmIChyZXQpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBk ZXZfZXJyKHVkLT5kZXYsICJmbG93JWQgY29uZmlnIGZhaWxlZDogJWRcbiIsCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByY2hhbi0+aWQsIHJldCk7Cj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDC oMKgIHJldHVybiAwOwo+PiArfQo+IAo+IENvdWxkIHlvdSBzcGxpdCBhYm92ZSBiaWcgZnVuY3Rp b24gcGxzPwoKSSBjYW4gc2xpdCB0bzoKdWRtYV90aXNjaV9tMm1fY2hhbm5lbF9jb25maWcoKQp1 ZG1hX3Rpc2NpX3R4X2NoYW5uZWxfY29uZmlnKCkKdWRtYV90aXNjaV9yeF9jaGFubmVsX2NvbmZp ZygpCgphbmQgY2FsbCB0aGVtIGZyb20gdGhlIGZpcnN0IHN3aXRjaCBjYXNlIGluIHVkbWFfYWxs b2NfY2hhbl9yZXNvdXJjZXMoKQoKPiAKPj4gKwo+PiArc3RhdGljIGludCB1ZG1hX2FsbG9jX2No YW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1 Y3QgdWRtYV9jaGFuICp1YyA9IHRvX3VkbWFfY2hhbihjaGFuKTsKPj4gK8KgwqDCoCBzdHJ1Y3Qg dWRtYV9kZXYgKnVkID0gdG9fdWRtYV9kZXYoY2hhbi0+ZGV2aWNlKTsKPj4gK8KgwqDCoCBjb25z dCBzdHJ1Y3QgdWRtYV9tYXRjaF9kYXRhICptYXRjaF9kYXRhID0gdWQtPm1hdGNoX2RhdGE7Cj4+ ICvCoMKgwqAgc3RydWN0IGszX3JpbmcgKmlycV9yaW5nOwo+PiArwqDCoMKgIHUzMiBpcnFfdWRt YV9pZHg7Cj4+ICvCoMKgwqAgaW50IHJldDsKPj4gKwo+PiArwqDCoMKgIGlmICh1Yy0+cGt0X21v ZGUgfHwgdWMtPmRpciA9PSBETUFfTUVNX1RPX01FTSkgewo+PiArwqDCoMKgwqDCoMKgwqAgdWMt PnVzZV9kbWFfcG9vbCA9IHRydWU7Cj4+ICvCoMKgwqDCoMKgwqDCoCAvKiBpbiBjYXNlIG9mIE1F TV9UT19NRU0gd2UgaGF2ZSBtYXhpbXVtIG9mIHR3byBUUnMgKi8KPj4gK8KgwqDCoMKgwqDCoMKg IGlmICh1Yy0+ZGlyID09IERNQV9NRU1fVE9fTUVNKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHVjLT5oZGVzY19zaXplID0gY3BwaTVfdHJkZXNjX2NhbGNfc2l6ZSgKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVvZihzdHJ1Y3QgY3BwaTVfdHJfdHlw ZTE1X3QpLCAyKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWMtPnBrdF9tb2RlID0gZmFs c2U7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgaWYg KHVjLT51c2VfZG1hX3Bvb2wpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIHVjLT5oZGVzY19wb29sID0g ZG1hX3Bvb2xfY3JlYXRlKHVjLT5uYW1lLCB1ZC0+ZGRldi5kZXYsCj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWMtPmhkZXNjX3NpemUsIHVkLT5k ZXNjX2FsaWduLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIDApOwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKCF1Yy0+aGRlc2NfcG9vbCkgewo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKHVkLT5kZGV2LmRldiwKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiRGVzY3JpcHRvciBwb29sIGFsbG9jYXRpb24gZmFpbGVk XG4iKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWMtPnVzZV9kbWFfcG9vbCA9IGZhbHNl Owo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT01FTTsKPj4gK8KgwqDCoMKg wqDCoMKgIH0KPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCBwbV9ydW50aW1lX2dldF9zeW5j KHVkLT5kZGV2LmRldik7Cj4+ICsKPj4gK8KgwqDCoCAvKgo+PiArwqDCoMKgwqAgKiBNYWtlIHN1 cmUgdGhhdCB0aGUgY29tcGxldGlvbiBpcyBpbiBhIGtub3duIHN0YXRlOgo+PiArwqDCoMKgwqAg KiBObyB0ZWFyZG93biwgdGhlIGNoYW5uZWwgaXMgaWRsZQo+PiArwqDCoMKgwqAgKi8KPj4gK8Kg wqDCoCByZWluaXRfY29tcGxldGlvbigmdWMtPnRlYXJkb3duX2NvbXBsZXRlZCk7Cj4+ICvCoMKg wqAgY29tcGxldGVfYWxsKCZ1Yy0+dGVhcmRvd25fY29tcGxldGVkKTsKPj4gK8KgwqDCoCB1Yy0+ c3RhdGUgPSBVRE1BX0NIQU5fSVNfSURMRTsKPj4gKwo+PiArwqDCoMKgIHN3aXRjaCAodWMtPmRp cikgewo+PiArwqDCoMKgIGNhc2UgRE1BX01FTV9UT19NRU06Cj4+ICvCoMKgwqDCoMKgwqDCoCAv KiBOb24gc3luY2hyb25pemVkIC0gbWVtIHRvIG1lbSB0eXBlIG9mIHRyYW5zZmVyICovCj4+ICvC oMKgwqDCoMKgwqDCoCBkZXZfZGJnKHVjLT51ZC0+ZGV2LCAiJXM6IGNoYW4lZCBhcyBNRU0tdG8t TUVNXG4iLCBfX2Z1bmNfXywKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWMtPmlkKTsKPj4g Kwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gdWRtYV9nZXRfY2hhbl9wYWlyKHVjKTsKPj4gK8Kg wqDCoMKgwqDCoMKgIGlmIChyZXQpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBy ZXQ7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IHVkbWFfYWxsb2NfdHhfcmVzb3VyY2Vz KHVjKTsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChyZXQpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHJldHVybiByZXQ7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IHVkbWFfYWxsb2Nf cnhfcmVzb3VyY2VzKHVjKTsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChyZXQpIHsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgdWRtYV9mcmVlX3R4X3Jlc291cmNlcyh1Yyk7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ICsKPj4g K8KgwqDCoMKgwqDCoMKgIHVjLT5zcmNfdGhyZWFkID0gdWQtPnBzaWxfYmFzZSArIHVjLT50Y2hh bi0+aWQ7Cj4+ICvCoMKgwqDCoMKgwqDCoCB1Yy0+ZHN0X3RocmVhZCA9ICh1ZC0+cHNpbF9iYXNl ICsgdWMtPnJjaGFuLT5pZCkgfAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg VURNQV9QU0lMX0RTVF9USFJFQURfSURfT0ZGU0VUOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBp cnFfcmluZyA9IHVjLT50Y2hhbi0+dGNfcmluZzsKPj4gK8KgwqDCoMKgwqDCoMKgIGlycV91ZG1h X2lkeCA9IHVjLT50Y2hhbi0+aWQ7Cj4+ICvCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4gK8KgwqDC oCBjYXNlIERNQV9NRU1fVE9fREVWOgo+PiArwqDCoMKgwqDCoMKgwqAgLyogU2xhdmUgdHJhbnNm ZXIgc3luY2hyb25pemVkIC0gbWVtIHRvIGRldiAoVFgpIHRyYXNuZmVyICovCj4+ICvCoMKgwqDC oMKgwqDCoCBkZXZfZGJnKHVjLT51ZC0+ZGV2LCAiJXM6IGNoYW4lZCBhcyBNRU0tdG8tREVWXG4i LCBfX2Z1bmNfXywKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWMtPmlkKTsKPj4gKwo+PiAr wqDCoMKgwqDCoMKgwqAgcmV0ID0gdWRtYV9hbGxvY190eF9yZXNvdXJjZXModWMpOwo+PiArwqDC oMKgwqDCoMKgwqAgaWYgKHJldCkgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1Yy0+cmVt b3RlX3RocmVhZF9pZCA9IC0xOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0 Owo+PiArwqDCoMKgwqDCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCB1Yy0+c3JjX3Ro cmVhZCA9IHVkLT5wc2lsX2Jhc2UgKyB1Yy0+dGNoYW4tPmlkOwo+PiArwqDCoMKgwqDCoMKgwqAg dWMtPmRzdF90aHJlYWQgPSB1Yy0+cmVtb3RlX3RocmVhZF9pZDsKPj4gK8KgwqDCoMKgwqDCoMKg IHVjLT5kc3RfdGhyZWFkIHw9IFVETUFfUFNJTF9EU1RfVEhSRUFEX0lEX09GRlNFVDsKPj4gKwo+ PiArwqDCoMKgwqDCoMKgwqAgaXJxX3JpbmcgPSB1Yy0+dGNoYW4tPnRjX3Jpbmc7Cj4+ICvCoMKg wqDCoMKgwqDCoCBpcnFfdWRtYV9pZHggPSB1Yy0+dGNoYW4tPmlkOwo+PiArwqDCoMKgwqDCoMKg wqAgYnJlYWs7Cj4+ICvCoMKgwqAgY2FzZSBETUFfREVWX1RPX01FTToKPj4gK8KgwqDCoMKgwqDC oMKgIC8qIFNsYXZlIHRyYW5zZmVyIHN5bmNocm9uaXplZCAtIGRldiB0byBtZW0gKFJYKSB0cmFz bmZlciAqLwo+PiArwqDCoMKgwqDCoMKgwqAgZGV2X2RiZyh1Yy0+dWQtPmRldiwgIiVzOiBjaGFu JWQgYXMgREVWLXRvLU1FTVxuIiwgX19mdW5jX18sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHVjLT5pZCk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IHVkbWFfYWxsb2NfcnhfcmVz b3VyY2VzKHVjKTsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChyZXQpIHsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgdWMtPnJlbW90ZV90aHJlYWRfaWQgPSAtMTsKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcmV0dXJuIHJldDsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKg wqDCoMKgwqAgdWMtPnNyY190aHJlYWQgPSB1Yy0+cmVtb3RlX3RocmVhZF9pZDsKPj4gK8KgwqDC oMKgwqDCoMKgIHVjLT5kc3RfdGhyZWFkID0gKHVkLT5wc2lsX2Jhc2UgKyB1Yy0+cmNoYW4tPmlk KSB8Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBVRE1BX1BTSUxfRFNUX1RI UkVBRF9JRF9PRkZTRVQ7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGlycV9yaW5nID0gdWMtPnJj aGFuLT5yX3Jpbmc7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpcnFfdWRtYV9pZHggPSBtYXRjaF9kYXRh LT5yY2hhbl9vZXNfb2Zmc2V0ICsgdWMtPnJjaGFuLT5pZDsKPj4gK8KgwqDCoMKgwqDCoMKgIGJy ZWFrOwo+PiArwqDCoMKgIGRlZmF1bHQ6Cj4+ICvCoMKgwqDCoMKgwqDCoCAvKiBDYW4gbm90IGhh cHBlbiAqLwo+PiArwqDCoMKgwqDCoMKgwqAgZGV2X2Vycih1Yy0+dWQtPmRldiwgIiVzOiBjaGFu JWQgaW52YWxpZCBkaXJlY3Rpb24gKCV1KVxuIiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg X19mdW5jX18sIHVjLT5pZCwgdWMtPmRpcik7Cj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJ TlZBTDsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCAvKiBDb25maWd1cmUgY2hhbm5lbChz KSwgcmZsb3cgdmlhIHRpc2NpICovCj4+ICvCoMKgwqAgcmV0ID0gdWRtYV90aXNjaV9jaGFubmVs X2NvbmZpZyh1Yyk7Cj4+ICvCoMKgwqAgaWYgKHJldCkKPj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8g ZXJyX3Jlc19mcmVlOwo+PiArCj4+ICvCoMKgwqAgaWYgKHVkbWFfaXNfY2hhbl9ydW5uaW5nKHVj KSkgewo+PiArwqDCoMKgwqDCoMKgwqAgZGV2X3dhcm4odWQtPmRldiwgImNoYW4lZDogaXMgcnVu bmluZyFcbiIsIHVjLT5pZCk7Cj4+ICvCoMKgwqDCoMKgwqDCoCB1ZG1hX3N0b3AodWMpOwo+PiAr wqDCoMKgwqDCoMKgwqAgaWYgKHVkbWFfaXNfY2hhbl9ydW5uaW5nKHVjKSkgewo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKHVkLT5kZXYsICJjaGFuJWQ6IHdvbid0IHN0b3AhXG4i LCB1Yy0+aWQpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIGVycl9yZXNfZnJlZTsK Pj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCAvKiBQU0kt TCBwYWlyaW5nICovCj4+ICvCoMKgwqAgcmV0ID0gbmF2c3NfcHNpbF9wYWlyKHVkLCB1Yy0+c3Jj X3RocmVhZCwgdWMtPmRzdF90aHJlYWQpOwo+PiArwqDCoMKgIGlmIChyZXQpIHsKPj4gK8KgwqDC oMKgwqDCoMKgIGRldl9lcnIodWQtPmRldiwgIlBTSS1MIHBhaXJpbmcgZmFpbGVkOiAweCUwNHgg LT4gMHglMDR4XG4iLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1Yy0+c3JjX3RocmVhZCwg dWMtPmRzdF90aHJlYWQpOwo+PiArwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfcmVzX2ZyZWU7Cj4+ ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgdWMtPnBzaWxfcGFpcmVkID0gdHJ1ZTsKPj4gKwo+ PiArwqDCoMKgIHVjLT5pcnFfbnVtX3JpbmcgPSBrM19yaW5nYWNjX2dldF9yaW5nX2lycV9udW0o aXJxX3JpbmcpOwo+PiArwqDCoMKgIGlmICh1Yy0+aXJxX251bV9yaW5nIDw9IDApIHsKPj4gK8Kg wqDCoMKgwqDCoMKgIGRldl9lcnIodWQtPmRldiwgIkZhaWxlZCB0byBnZXQgcmluZyBpcnEgKGlu ZGV4OiAldSlcbiIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGszX3JpbmdhY2NfZ2V0X3Jp bmdfaWQoaXJxX3JpbmcpKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IC1FSU5WQUw7Cj4+ICvC oMKgwqDCoMKgwqDCoCBnb3RvIGVycl9wc2lfZnJlZTsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8Kg wqDCoCByZXQgPSByZXF1ZXN0X2lycSh1Yy0+aXJxX251bV9yaW5nLCB1ZG1hX3JpbmdfaXJxX2hh bmRsZXIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBJUlFGX1RSSUdHRVJfSElHSCwg dWMtPm5hbWUsIHVjKTsKPj4gK8KgwqDCoCBpZiAocmV0KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBk ZXZfZXJyKHVkLT5kZXYsICJjaGFuJWQ6IHJpbmcgaXJxIHJlcXVlc3QgZmFpbGVkXG4iLCB1Yy0+ aWQpOwo+PiArwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfaXJxX2ZyZWU7Cj4+ICvCoMKgwqAgfQo+ PiArCj4+ICvCoMKgwqAgLyogRXZlbnQgZnJvbSBVRE1BIChUUiBldmVudHMpIG9ubHkgbmVlZGVk IGZvciBzbGF2ZSBUUiBtb2RlCj4+IGNoYW5uZWxzICovCj4+ICvCoMKgwqAgaWYgKGlzX3NsYXZl X2RpcmVjdGlvbih1Yy0+ZGlyKSAmJiAhdWMtPnBrdF9tb2RlKSB7Cj4+ICvCoMKgwqDCoMKgwqDC oCB1Yy0+aXJxX251bV91ZG1hID0gdGlfc2NpX2ludGFfbXNpX2dldF92aXJxKHVkLT5kZXYsCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpcnFfdWRtYV9pZHgpOwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHVjLT5pcnFfbnVt X3VkbWEgPD0gMCkgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKHVkLT5kZXYs ICJGYWlsZWQgdG8gZ2V0IHVkbWEgaXJxIChpbmRleDogJXUpXG4iLAo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGlycV91ZG1hX2lkeCk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGZyZWVfaXJxKHVjLT5pcnFfbnVtX3JpbmcsIHVjKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcmV0ID0gLUVJTlZBTDsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlcnJf aXJxX2ZyZWU7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHJl dCA9IHJlcXVlc3RfaXJxKHVjLT5pcnFfbnVtX3VkbWEsIHVkbWFfdWRtYV9pcnFfaGFuZGxlciwg MCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWMtPm5hbWUsIHVjKTsK Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChyZXQpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg ZGV2X2Vycih1ZC0+ZGV2LCAiY2hhbiVkOiBVRE1BIGlycSByZXF1ZXN0IGZhaWxlZFxuIiwKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1Yy0+aWQpOwo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBmcmVlX2lycSh1Yy0+aXJxX251bV9yaW5nLCB1Yyk7Cj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGdvdG8gZXJyX2lycV9mcmVlOwo+PiArwqDCoMKgwqDCoMKgwqAgfQo+PiAr wqDCoMKgIH0gZWxzZSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCB1Yy0+aXJxX251bV91ZG1hID0gMDsK Pj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCB1ZG1hX3Jlc2V0X3JpbmdzKHVjKTsKPj4gKwo+ PiArwqDCoMKgIHJldHVybiAwOwo+PiArCj4+ICtlcnJfaXJxX2ZyZWU6Cj4+ICvCoMKgwqAgdWMt PmlycV9udW1fcmluZyA9IDA7Cj4+ICvCoMKgwqAgdWMtPmlycV9udW1fdWRtYSA9IDA7Cj4+ICtl cnJfcHNpX2ZyZWU6Cj4+ICvCoMKgwqAgbmF2c3NfcHNpbF91bnBhaXIodWQsIHVjLT5zcmNfdGhy ZWFkLCB1Yy0+ZHN0X3RocmVhZCk7Cj4+ICvCoMKgwqAgdWMtPnBzaWxfcGFpcmVkID0gZmFsc2U7 Cj4+ICtlcnJfcmVzX2ZyZWU6Cj4+ICvCoMKgwqAgdWRtYV9mcmVlX3R4X3Jlc291cmNlcyh1Yyk7 Cj4+ICvCoMKgwqAgdWRtYV9mcmVlX3J4X3Jlc291cmNlcyh1Yyk7Cj4+ICsKPj4gK8KgwqDCoCB1 Yy0+cmVtb3RlX3RocmVhZF9pZCA9IC0xOwo+PiArwqDCoMKgIHVjLT5kaXIgPSBETUFfTUVNX1RP X01FTTsKPj4gK8KgwqDCoCB1Yy0+cGt0X21vZGUgPSBmYWxzZTsKPj4gK8KgwqDCoCB1Yy0+c3Rh dGljX3RyX3R5cGUgPSAwOwo+PiArwqDCoMKgIHVjLT5lbmFibGVfYWNjMzIgPSAwOwo+PiArwqDC oMKgIHVjLT5lbmFibGVfYnVyc3QgPSAwOwo+PiArwqDCoMKgIHVjLT5jaGFubmVsX3RwbCA9IDA7 Cj4+ICvCoMKgwqAgdWMtPnBzZF9zaXplID0gMDsKPj4gK8KgwqDCoCB1Yy0+bWV0YWRhdGFfc2l6 ZSA9IDA7Cj4+ICvCoMKgwqAgdWMtPmhkZXNjX3NpemUgPSAwOwo+PiArCj4+ICvCoMKgwqAgaWYg KHVjLT51c2VfZG1hX3Bvb2wpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIGRtYV9wb29sX2Rlc3Ryb3ko dWMtPmhkZXNjX3Bvb2wpOwo+PiArwqDCoMKgwqDCoMKgwqAgdWMtPnVzZV9kbWFfcG9vbCA9IGZh bHNlOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHJldHVybiByZXQ7Cj4+ICt9Cj4+ICsK PiAKPiBbLi4uXQo+IAoKLSBQw6l0ZXIKClRleGFzIEluc3RydW1lbnRzIEZpbmxhbmQgT3ksIFBv cmtrYWxhbmthdHUgMjIsIDAwMTgwIEhlbHNpbmtpLgpZLXR1bm51cy9CdXNpbmVzcyBJRDogMDYx NTUyMS00LiBLb3RpcGFpa2thL0RvbWljaWxlOiBIZWxzaW5raQoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxp c3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZy YWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=