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 F1920C07CA9 for ; Tue, 28 Nov 2023 10:16:05 +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-Transfer-Encoding:Content-Type: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=mZ/anxiI8Z24AUmbBbfPDOPEfCQjs/3lka7RSYN56PA=; b=4Cud1yjKD7sCO4 NyXRrWtPf4xaGwTWAIJRPsjZJ/xs5KFe/BvkHDSGvSSBI6bcZWk+9xAHAJBCYXt++rY37osV2vVpe 4PEpl/lQde70NaoIsgrvu+Xy4ph3QIWmw4Ne05rm2OdgIxKMYOYVhkEbXMl1f3mKrIev5ZWbDmyRz GBV+GSTJUJ4IOROadmz4BaW4y+8MakCP7VU7P/o5gTqvu3cWnZYw3eQ2Qmj6E7pj8hWPHNUKljm6o jR8RLHkT1OVmIY/QWIGC/bNvjSXu+/vyYLjJni2Hu/OopHUDVb6qqGBSwuG+tsIaR3s+Cul1Uk4L2 Mjrh19+Hstu2R5iwHJXQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r7v8J-004q4L-0z; Tue, 28 Nov 2023 10:15:59 +0000 Received: from desiato.infradead.org ([2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1r7uAu-004hSf-2R for linux-arm-kernel@bombadil.infradead.org; Tue, 28 Nov 2023 09:14:37 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=Content-Transfer-Encoding:Content-Type :In-Reply-To:From:References:Cc:To:Subject:MIME-Version:Date:Message-ID: Sender:Reply-To:Content-ID:Content-Description; bh=OP3ag60LowcdWpDh5If+yaV6nKcRij37x1mEkiYiuMo=; b=pJ1pqpq7ISxXdjTPGDaxTV418G CkyXuRnmOfGin+AqOYwd1zKQlgijEJdFSSrhmE+aYJfLzErDEeXxpCIEyB970UYs9lBFuAdcizC7Z QNQZulp+9z3Zglar24Wia8V7XwtE6acRVrMgLRbM96D4dpVKK13Y4x6HFTQb0+9di1TJlyzoubtgm rok2j2c0lUzMLLKhz/L6yj/9NU1tdZdprPC4LXgyevJBUf2mHzT0DqEz6kBD6nyVAkLbZJZ5tt87e aqCPtGfGbhcBf/aI+V6/0kuCssXJ3FOjPO+3ltvv/UxCiyLdrojcYRPoNQBTGRj+bUIzi5XyowIMr 7XvaNqPw==; Received: from foss.arm.com ([217.140.110.172]) by desiato.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r7uAn-00GZ8t-0S for linux-arm-kernel@lists.infradead.org; Tue, 28 Nov 2023 09:14:35 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 57CBBC15; Tue, 28 Nov 2023 01:15:11 -0800 (PST) Received: from [10.57.73.192] (unknown [10.57.73.192]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 33A823F73F; Tue, 28 Nov 2023 01:14:19 -0800 (PST) Message-ID: <7c4c8ab2-8eb2-472d-ad8d-9d6c20b2191c@arm.com> Date: Tue, 28 Nov 2023 09:14:17 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 01/14] mm: Batch-copy PTE ranges during fork() Content-Language: en-GB To: Barry Song <21cnbao@gmail.com> Cc: david@redhat.com, akpm@linux-foundation.org, andreyknvl@gmail.com, anshuman.khandual@arm.com, ardb@kernel.org, catalin.marinas@arm.com, dvyukov@google.com, glider@google.com, james.morse@arm.com, jhubbard@nvidia.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, mark.rutland@arm.com, maz@kernel.org, oliver.upton@linux.dev, ryabinin.a.a@gmail.com, suzuki.poulose@arm.com, vincenzo.frascino@arm.com, wangkefeng.wang@huawei.com, will@kernel.org, willy@infradead.org, yuzenghui@huawei.com, yuzhao@google.com, ziy@nvidia.com References: <271f1e98-6217-4b40-bae0-0ac9fe5851cb@redhat.com> <20231127084217.13110-1-v-songbaohua@oppo.com> From: Ryan Roberts In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231128_091429_490312_9E652C5F X-CRM114-Status: GOOD ( 64.20 ) 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-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMjcvMTEvMjAyMyAyMDozNCwgQmFycnkgU29uZyB3cm90ZToKPiBPbiBUdWUsIE5vdiAyOCwg MjAyMyBhdCAxMjowN+KAr0FNIFJ5YW4gUm9iZXJ0cyA8cnlhbi5yb2JlcnRzQGFybS5jb20+IHdy b3RlOgo+Pgo+PiBPbiAyNy8xMS8yMDIzIDEwOjI4LCBCYXJyeSBTb25nIHdyb3RlOgo+Pj4gT24g TW9uLCBOb3YgMjcsIDIwMjMgYXQgMTE6MTHigK9QTSBSeWFuIFJvYmVydHMgPHJ5YW4ucm9iZXJ0 c0Bhcm0uY29tPiB3cm90ZToKPj4+Pgo+Pj4+IE9uIDI3LzExLzIwMjMgMDk6NTksIEJhcnJ5IFNv bmcgd3JvdGU6Cj4+Pj4+IE9uIE1vbiwgTm92IDI3LCAyMDIzIGF0IDEwOjM14oCvUE0gUnlhbiBS b2JlcnRzIDxyeWFuLnJvYmVydHNAYXJtLmNvbT4gd3JvdGU6Cj4+Pj4+Pgo+Pj4+Pj4gT24gMjcv MTEvMjAyMyAwODo0MiwgQmFycnkgU29uZyB3cm90ZToKPj4+Pj4+Pj4+ICsgICAgICAgICAgIGZv ciAoaSA9IDA7IGkgPCBucjsgaSsrLCBwYWdlKyspIHsKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAg ICAgICAgaWYgKGFub24pIHsKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAv Kgo+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIHRoaXMgcGFnZSBt YXkgaGF2ZSBiZWVuIHBpbm5lZCBieSB0aGUKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKiBwYXJlbnQgcHJvY2VzcywgY29weSB0aGUgcGFnZSBpbW1lZGlhdGVseSBmb3IK Pj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgY2hpbGQgc28gdGhh dCB3ZSdsbCBhbHdheXMgZ3VhcmFudGVlIHRoZQo+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAqIHBpbm5lZCBwYWdlIHdvbid0IGJlIHJhbmRvbWx5IHJlcGxhY2VkIGluIHRo ZQo+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZ1dHVyZS4KPj4+Pj4+ Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KPj4+Pj4+Pj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkocGFnZV90cnlfZHVwX2Fub25fcm1hcCgKPj4+ Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSwg ZmFsc2UsIHNyY192bWEpKSkgewo+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaWYgKGkgIT0gMCkKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAvKiBQYWdlIG1heSBiZSBwaW5uZWQsIHdlIGhhdmUgdG8gY29weS4gKi8K Pj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3B5 X3ByZXNlbnRfcGFnZSgKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZHN0X3ZtYSwgc3JjX3ZtYSwgZHN0X3B0ZSwKPj4+Pj4+Pj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3B0ZSwgYWRkciwgcnNzLCBw cmVhbGxvYywKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcGFnZSk7Cj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgfQo+Pj4+ Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc1tNTV9BTk9OUEFHRVNdKys7Cj4+ Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgVk1fQlVHX09OKFBhZ2VBbm9uRXhj bHVzaXZlKHBhZ2UpKTsKPj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKPj4+ Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX2R1cF9maWxlX3JtYXAocGFn ZSwgZmFsc2UpOwo+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc1ttbV9j b3VudGVyX2ZpbGUocGFnZSldKys7Cj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAgIH0KPj4+ Pj4+Pj4+ICAgICAgICAgICAgIH0KPj4+Pj4+Pj4+IC0gICAgICAgICAgIHJzc1tNTV9BTk9OUEFH RVNdKys7Cj4+Pj4+Pj4+PiAtICAgfSBlbHNlIGlmIChwYWdlKSB7Cj4+Pj4+Pj4+PiAtICAgICAg ICAgICBmb2xpb19nZXQoZm9saW8pOwo+Pj4+Pj4+Pj4gLSAgICAgICAgICAgcGFnZV9kdXBfZmls ZV9ybWFwKHBhZ2UsIGZhbHNlKTsKPj4+Pj4+Pj4+IC0gICAgICAgICAgIHJzc1ttbV9jb3VudGVy X2ZpbGUocGFnZSldKys7Cj4+Pj4+Pj4+PiArCj4+Pj4+Pj4+PiArICAgICAgICAgICBuciA9IGk7 Cj4+Pj4+Pj4+PiArICAgICAgICAgICBmb2xpb19yZWZfYWRkKGZvbGlvLCBucik7Cj4+Pj4+Pj4+ Cj4+Pj4+Pj4+IFlvdSdyZSBjaGFuZ2luZyB0aGUgb3JkZXIgb2YgbWFwY291bnQgdnMuIHJlZmNv dW50IGluY3JlbWVudC4gRG9uJ3QuCj4+Pj4+Pj4+IE1ha2Ugc3VyZSB5b3VyIHJlZmNvdW50ID49 IG1hcGNvdW50Lgo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBZb3UgY2FuIGRvIHRoYXQgZWFzaWx5IGJ5IGRv aW5nIHRoZSBmb2xpb19yZWZfYWRkKGZvbGlvLCBucikgZmlyc3QgYW5kCj4+Pj4+Pj4+IHRoZW4g ZGVjcmVtZW50aW5nIGluIGNhc2Ugb2YgZXJyb3IgYWNjb3JkaW5nbHkuIEVycm9ycyBkdWUgdG8g cGlubmVkCj4+Pj4+Pj4+IHBhZ2VzIGFyZSB0aGUgY29ybmVyIGNhc2UuCj4+Pj4+Pj4+Cj4+Pj4+ Pj4+IEknbGwgbm90ZSB0aGF0IGl0IHdpbGwgbWFrZSBhIGxvdCBvZiBzZW5zZSB0byBoYXZlIGJh dGNoIHZhcmlhbnRzIG9mCj4+Pj4+Pj4+IHBhZ2VfdHJ5X2R1cF9hbm9uX3JtYXAoKSBhbmQgcGFn ZV9kdXBfZmlsZV9ybWFwKCkuCj4+Pj4+Pj4+Cj4+Pj4+Pj4KPj4+Pj4+PiBpIHN0aWxsIGRvbid0 IHVuZGVyc3RhbmQgd2h5IGl0IGlzIG5vdCBhIGVudGlyZSBtYXArMSwgYnV0IGFuIGluY3JlbWVu dAo+Pj4+Pj4+IGluIGVhY2ggYmFzZXBhZ2UuCj4+Pj4+Pgo+Pj4+Pj4gQmVjYXVzZSB3ZSBhcmUg UFRFLW1hcHBpbmcgdGhlIGZvbGlvLCB3ZSBoYXZlIHRvIGFjY291bnQgZWFjaCBpbmRpdmlkdWFs IHBhZ2UuCj4+Pj4+PiBJZiB3ZSBhY2NvdW50ZWQgdGhlIGVudGlyZSBmb2xpbywgd2hlcmUgd291 bGQgd2UgdW5hY2NvdW50IGl0PyBFYWNoIHBhZ2UgY2FuIGJlCj4+Pj4+PiB1bm1hcHBlZCBpbmRp dmlkdWFsbHkgKGUuZy4gbXVubWFwKCkgcGFydCBvZiB0aGUgZm9saW8pIHNvIG5lZWQgdG8gYWNj b3VudCBlYWNoCj4+Pj4+PiBwYWdlLiBXaGVuIFBNRCBtYXBwaW5nLCB0aGUgd2hvbGUgdGhpbmcg aXMgZWl0aGVyIG1hcHBlZCBvciB1bm1hcHBlZCwgYW5kIGl0cwo+Pj4+Pj4gYXRvbWljLCBzbyB3 ZSBjYW4gYWNjb3VudCB0aGUgZW50aXJlIHRoaW5nLgo+Pj4+Pgo+Pj4+PiBIaSBSeWFuLAo+Pj4+ Pgo+Pj4+PiBUaGVyZSBpcyBubyBwcm9ibGVtLiBmb3IgZXhhbXBsZSwgYSBsYXJnZSBmb2xpbyBp cyBlbnRpcmVseSBtYXBwZWQgaW4KPj4+Pj4gcHJvY2VzcyBBIHdpdGggQ09OUFRFLAo+Pj4+PiBh bmQgb25seSBwYWdlMiBpcyBtYXBwZWQgaW4gcHJvY2VzcyBCLgo+Pj4+PiB0aGVuIHdlIHdpbGwg aGF2ZQo+Pj4+Pgo+Pj4+PiBlbnRpcmVfbWFwID0gMAo+Pj4+PiBwYWdlMC5tYXAgPSAtMQo+Pj4+ PiBwYWdlMS5tYXAgPSAtMQo+Pj4+PiBwYWdlMi5tYXAgPSAwCj4+Pj4+IHBhZ2UzLm1hcCA9IC0x Cj4+Pj4+IC4uLi4KPj4+Pj4KPj4+Pj4+Cj4+Pj4+Pj4KPj4+Pj4+PiBhcyBsb25nIGFzIGl0IGlz IGEgQ09OVFBURSBsYXJnZSBmb2xpbywgdGhlcmUgaXMgbm8gbXVjaCBkaWZmZXJlbmNlIHdpdGgK Pj4+Pj4+PiBQTUQtbWFwcGVkIGxhcmdlIGZvbGlvLiBpdCBoYXMgYWxsIHRoZSBjaGFuY2UgdG8g YmUgRG91YmxlTWFwIGFuZCBuZWVkCj4+Pj4+Pj4gc3BsaXQuCj4+Pj4+Pj4KPj4+Pj4+PiBXaGVu IEEgYW5kIEIgc2hhcmUgYSBDT05UUFRFIGxhcmdlIGZvbGlvLCB3ZSBkbyBtYWR2aXNlKERPTlRO RUVEKSBvciBhbnkKPj4+Pj4+PiBzaW1pbGFyIHRoaW5ncyBvbiBhIHBhcnQgb2YgdGhlIGxhcmdl IGZvbGlvIGluIHByb2Nlc3MgQSwKPj4+Pj4+Pgo+Pj4+Pj4+IHRoaXMgbGFyZ2UgZm9saW8gd2ls bCBoYXZlIHBhcnRpYWxseSBtYXBwZWQgc3VicGFnZSBpbiBBIChhbGwgQ09OVFBFIGJpdHMKPj4+ Pj4+PiBpbiBhbGwgc3VicGFnZXMgbmVlZCB0byBiZSByZW1vdmVkIHRob3VnaCB3ZSBvbmx5IHVu bWFwIGEgcGFydCBvZiB0aGUKPj4+Pj4+PiBsYXJnZSBmb2xpb2FzIEhXIHJlcXVpcmVzIGNvbnNp c3RlbnQgQ09OVFBURXMpOyBhbmQgaXQgaGFzIGVudGlyZSBtYXAgaW4KPj4+Pj4+PiBwcm9jZXNz IEIoYWxsIFBURXMgYXJlIHN0aWxsIENPTlBURVMgaW4gcHJvY2VzcyBCKS4KPj4+Pj4+Pgo+Pj4+ Pj4+IGlzbid0IGl0IG1vcmUgc2Vuc2libGUgZm9yIHRoaXMgbGFyZ2UgZm9saW9zIHRvIGhhdmUg ZW50aXJlX21hcCA9IDAoZm9yCj4+Pj4+Pj4gcHJvY2VzcyBCKSwgYW5kIHN1YnBhZ2VzIHdoaWNo IGFyZSBzdGlsbCBtYXBwZWQgaW4gcHJvY2VzcyBBIGhhcyBtYXBfY291bnQKPj4+Pj4+PiA9MD8g KHN0YXJ0IGZyb20gLTEpLgo+Pj4+Pj4+Cj4+Pj4+Pj4+IEVzcGVjaWFsbHksIHRoZSBiYXRjaCB2 YXJpYW50IG9mIHBhZ2VfdHJ5X2R1cF9hbm9uX3JtYXAoKSB3b3VsZCBvbmx5Cj4+Pj4+Pj4+IGNo ZWNrIG9uY2UgaWYgdGhlIGZvbGlvIG1heWJlIHBpbm5lZCwgYW5kIGluIHRoYXQgY2FzZSwgeW91 IGNhbiBzaW1wbHkKPj4+Pj4+Pj4gZHJvcCBhbGwgcmVmZXJlbmNlcyBhZ2Fpbi4gU28geW91IGVp dGhlciBoYXZlIGFsbCBvciBubyBwdGVzIHRvIHByb2Nlc3MsCj4+Pj4+Pj4+IHdoaWNoIG1ha2Vz IHRoYXQgY29kZSBlYXNpZXIuCj4+Pj4+Pgo+Pj4+Pj4gSSdtIGFmcmFpZCB0aGlzIGRvZXNuJ3Qg bWFrZSBzZW5zZSB0byBtZS4gUGVyaGFwcyBJJ3ZlIG1pc3VuZGVyc3Rvb2QuIEJ1dAo+Pj4+Pj4g ZnVuZGFtZW50YWxseSB5b3UgY2FuIG9ubHkgdXNlIGVudGlyZV9tYXBjb3VudCBpZiBpdHMgb25s eSBwb3NzaWJsZSB0byBtYXAgYW5kCj4+Pj4+PiB1bm1hcCB0aGUgd2hvbGUgZm9saW8gYXRvbWlj YWxseS4KPj4+Pj4KPj4+Pj4KPj4+Pj4KPj4+Pj4gTXkgcG9pbnQgaXMgdGhhdCBDT05UUEVzIHNo b3VsZCBlaXRoZXIgYWxsLXNldCBpbiBhbGwgMTYgUFRFcyBvciBhbGwgYXJlIGRyb3BwZWQKPj4+ Pj4gaW4gMTYgUFRFcy4gaWYgYWxsIFBURXMgaGF2ZSBDT05ULCBpdCBpcyBlbnRpcmVseSBtYXBw ZWQ7IG90aGVyd2lzZSwKPj4+Pj4gaXQgaXMgcGFydGlhbGx5Cj4+Pj4+IG1hcHBlZC4gaWYgYSBs YXJnZSBmb2xpbyBpcyBtYXBwZWQgaW4gb25lIHByb2Nlc3NlcyB3aXRoIGFsbCBDT05UUFRFcwo+ Pj4+PiBhbmQgbWVhbndoaWxlIGluIGFub3RoZXIgcHJvY2VzcyB3aXRoIHBhcnRpYWwgbWFwcGlu Zyh3L28gQ09OVFBURSksIGl0IGlzCj4+Pj4+IERvdWJsZU1hcHBlZC4KPj4+Pgo+Pj4+IFRoZXJl IGFyZSAyIHByb2JsZW1zIHdpdGggeW91ciBwcm9wb3NhbCwgYXMgSSBzZWUgaXQ7Cj4+Pj4KPj4+ PiAxKSB0aGUgY29yZS1tbSBpcyBub3QgZW5saWdodGVuZWQgZm9yIENPTlRQVEUgbWFwcGluZ3Mu IEFzIGZhciBhcyBpdCBpcwo+Pj4+IGNvbmNlcm5lZCwgaXRzIGp1c3QgbWFwcGluZyBhIGJ1bmNo IG9mIFBURXMuIFNvIGl0IGhhcyBubyBob29rIHRvIGluYy9kZWMKPj4+PiBlbnRpcmVfbWFwY291 bnQuIFRoZSBhcmNoIGNvZGUgaXMgb3Bwb3J0dW5pc3RpY2FsbHkgYW5kICp0cmFuc3BhcmVudGx5 KiBtYW5hZ2luZwo+Pj4+IHRoZSBDT05UX1BURSBiaXQuCj4+Pj4KPj4+PiAyKSBUaGVyZSBpcyBu b3RoaW5nIHRvIHNheSBhIGZvbGlvIGlzbid0ICpiaWdnZXIqIHRoYW4gdGhlIGNvbnRwdGUgYmxv Y2s7IGl0IG1heQo+Pj4+IGJlIDEyOEsgYW5kIGJlIG1hcHBlZCB3aXRoIDIgY29udHB0ZSBibG9j a3MuIE9yIGV2ZW4gYSBQVEUtbWFwcGVkIFRIUCAoMk0pIGFuZAo+Pj4+IGJlIG1hcHBlZCB3aXRo IDMyIGNvbnRwdGUgYmxvY2tzLiBTbyB5b3UgY2FuJ3Qgc2F5IGl0IGlzIGVudGlyZWx5IG1hcHBl ZAo+Pj4+IHVubGVzcy91bnRpbCBBTEwgb2YgdGhvc2UgYmxvY2tzIGFyZSBzZXQgdXAuIEFuZCB0 aGVuIG9mIGNvdXJzZSBlYWNoIGJsb2NrIGNvdWxkCj4+Pj4gYmUgdW5tYXBwZWQgdW5hdG9taWNh bGx5Lgo+Pj4+Cj4+Pj4gRm9yIHRoZSBQTUQgY2FzZSB0aGVyZSBhcmUgYWN0dWFsbHkgMiBwcm9w ZXJ0aWVzIHRoYXQgYWxsb3cgdXNpbmcgdGhlCj4+Pj4gZW50aXJlX21hcGNvdW50IG9wdGltaXph dGlvbjsgSXQncyBhdG9taWNhbGx5IG1hcHBlZC91bm1hcHBlZCB0aHJvdWdoIHRoZSBQTUQKPj4+ PiBhbmQgd2Uga25vdyB0aGF0IHRoZSBmb2xpbyBpcyBleGFjdGx5IFBNRCBzaXplZCAoc2luY2Ug aXQgbXVzdCBiZSBhdCBsZWFzdCBQTUQKPj4+PiBzaXplZCB0byBiZSBhYmxlIHRvIG1hcCBpdCB3 aXRoIHRoZSBQTUQsIGFuZCB3ZSBkb24ndCBhbGxvY2F0ZSBUSFBzIGFueSBiaWdnZXIKPj4+PiB0 aGFuIFBNRCBzaXplKS4gU28gb25lIFBNRCBtYXAgb3IgdW5tYXAgb3BlcmF0aW9uIGNvcnJlc3Bv bmRzIHRvIGV4YWN0bHkgb25lCj4+Pj4gKmVudGlyZSogbWFwIG9yIHVubWFwLiBUaGF0IGlzIG5v dCB0cnVlIHdoZW4gd2UgYXJlIFBURSBtYXBwaW5nLgo+Pj4KPj4+IHdlbGwuIFRoYW5rcyBmb3Ig Y2xhcmlmaWNhdGlvbi4gYmFzZWQgb24gdGhlIGFib3ZlIGRlc2NyaXB0aW9uLCBpIGFncmVlIHRo ZQo+Pj4gY3VycmVudCBjb2RlIG1pZ2h0IG1ha2UgbW9yZSBzZW5zZSBieSBhbHdheXMgdXNpbmcg bWFwY291bnQgaW4gc3VicGFnZS4KPj4+Cj4+PiBJIGdhdmUgbXkgcHJvcG9zYWxzIGFzICBJIHRo b3VnaHQgd2Ugd2VyZSBhbHdheXMgQ09OVFBURSBzaXplIGZvciBzbWFsbC1USFAKPj4+IHRoZW4g d2UgY291bGQgZHJvcCB0aGUgbG9vcCB0byBpdGVyYXRlIDE2IHRpbWVzIHJtYXAuIGlmIHdlIGRv IGl0Cj4+PiBlbnRpcmVseSwgd2Ugb25seQo+Pj4gbmVlZCB0byBkbyBkdXAgcm1hcCBvbmNlIGZv ciBhbGwgMTYgUFRFcyBieSBpbmNyZWFzaW5nIGVudGlyZV9tYXAuCj4+Cj4+IFdlbGwgaXRzIGFs d2F5cyBnb29kIHRvIGhhdmUgdGhlIGRpc2N1c3Npb24gLSBzbyB0aGFua3MgZm9yIHRoZSBpZGVh cy4gSSB0aGluawo+PiB0aGVyZSBpcyBhIGJpZ2dlciBxdWVzdGlvbiBsdXJraW5nIGhlcmU7IHNo b3VsZCB3ZSBiZSBleHBvc2luZyB0aGUgY29uY2VwdCBvZgo+PiBjb250cHRlIG1hcHBpbmdzIHRv IHRoZSBjb3JlLW1tIHJhdGhlciB0aGFuIGJ1cnlpbmcgaXQgaW4gdGhlIGFybTY0IGFyY2ggY29k ZT8KPj4gSSdtIGNvbmZpZGVudCB0aGF0IHdvdWxkIGJlIGEgaHVnZSBhbW91bnQgb2YgZWZmb3J0 IGFuZCB0aGUgZW5kIHJlc3VsdCB3b3VsZCBiZQo+PiBzaW1pbGFyIHBlcmZvcm1hY2UgdG8gd2hh dCB0aGlzIGFwcHJvYWNoIGdpdmVzLiBPbmUgcG90ZW50aWFsIGJlbmVmaXQgb2YgbGV0dGluZwo+ PiBjb3JlLW1tIGNvbnRyb2wgaXQgaXMgdGhhdCBpdCB3b3VsZCBhbHNvIGdpdmUgY29udHJvbCB0 byBjb3JlLW1tIG92ZXIgdGhlCj4+IGdyYW51bGFyaXR5IG9mIGFjY2Vzcy9kaXJ0eSByZXBvcnRp bmcgKG15IGFwcHJvYWNoIGltcGxpY2l0bHkgdGllcyBpdCB0byB0aGUKPj4gZm9saW8pLiBIYXZp bmcgc3ViLWZvbGlvIGFjY2VzcyB0cmFja2luZyBfY291bGRfIHBvdGVudGlhbGx5IGhlbHAgd2l0 aCBmdXR1cmUKPj4gd29yayB0byBtYWtlIFRIUCBzaXplIHNlbGVjdGlvbiBhdXRvbWF0aWMsIGJ1 dCB3ZSBhcmUgbm90IHRoZXJlIHlldCwgYW5kIEkgdGhpbmsKPj4gdGhlcmUgYXJlIG90aGVyIChz aW1wbGVyKSB3YXlzIHRvIGFjaGlldmUgdGhlIHNhbWUgdGhpbmcuIFNvIG15IHZpZXcgaXMgdGhh dAo+PiBfbm90XyBleHBvc2luZyBpdCB0byBjb3JlLW1tIGlzIHRoZSByaWdodCB3YXkgZm9yIG5v dy4KPiAKPiBIaSBSeWFuLAo+IAo+IFdlKE9QUE8pIHN0YXJ0ZWQgYSBzaW1pbGFyIHByb2plY3Qg bGlrZSB5b3UgZXZlbiBiZWZvcmUgZm9saW8gd2FzIGltcG9ydGVkIHRvCj4gbWFpbmxpbmUsIHdl IGhhdmUgZGVwbG95ZWQgdGhlIGR5bmFtaWMgaHVnZXBhZ2UodGhhdCBpcyBob3cgd2UgbmFtZSBp dCkKPiBvbiBtaWxsaW9ucyBvZiBtb2JpbGUgcGhvbmVzIG9uIHJlYWwgcHJvZHVjdHMgYW5kIGtl cm5lbHMgYmVmb3JlIDUuMTYsICBtYWtpbmcKPiBhIGh1Z2Ugc3VjY2VzcyBvbiBwZXJmb3JtYW5j ZSBpbXByb3ZlbWVudC4gZm9yIGV4YW1wbGUsIHlvdSBtYXkKPiBmaW5kIHRoZSBvdXQtb2YtdHJl ZSA1LjE1IHNvdXJjZSBjb2RlIGhlcmUKCk9oIHdvdywgdGhhbmtzIGZvciByZWFjaGluZyBvdXQg YW5kIGV4cGxhaW5pbmcgdGhpcyAtIEkgaGF2ZSB0byBhZG1pdCBJIGZlZWwKZW1iYXJyYXNzZWQg dGhhdCBJIGNsZWFybHkgZGlkbid0IGRvIGVub3VnaCByZXNlYXJjaCBvbiB0aGUgcHJpb3IgYXJ0 IGJlY2F1c2UgSQp3YXNuJ3QgYXdhcmUgb2YgeW91ciB3b3JrLiBTbyBzb3JyeSBhYm91dCB0aGF0 LgoKSSBzZW5zZWQgdGhhdCB5b3UgaGFkIGEgZGlmZmVyZW50IG1vZGVsIGZvciBob3cgdGhpcyBz aG91bGQgd29yayB2cyB3aGF0IEkndmUKaW1wbGVtZW50ZWQgYW5kIG5vdyBJIHVuZGVyc3RhbmQg d2h5IDopLiBJJ2xsIHJldmlldyB5b3VyIHN0dWZmIGFuZCBJJ20gc3VyZQpJJ2xsIGhhdmUgcXVl c3Rpb25zLiBJJ20gc3VyZSBlYWNoIHNvbHV0aW9uIGhhcyBwcm9zIGFuZCBjb25zLgoKCj4gCj4g aHR0cHM6Ly9naXRodWIuY29tL09uZVBsdXNPU1MvYW5kcm9pZF9rZXJuZWxfb25lcGx1c19zbTg1 NTAvdHJlZS9vbmVwbHVzL3NtODU1MF91XzE0LjAuMF9vbmVwbHVzMTEKPiAKPiBPdXIgbW9kaWZp Y2F0aW9uIG1pZ2h0IG5vdCBiZSBzbyBjbGVhbiBhbmQgaGFzIGxvdHMgb2Ygd29ya2Fyb3VuZHMK PiBqdXN0IGZvciB0aGUgc3RhYmlsaXR5IG9mIHByb2R1Y3RzCj4gCj4gV2UgbWFpbmx5IGhhdmUK PiAKPiAxLiBodHRwczovL2dpdGh1Yi5jb20vT25lUGx1c09TUy9hbmRyb2lkX2tlcm5lbF9vbmVw bHVzX3NtODU1MC9ibG9iL29uZXBsdXMvc204NTUwX3VfMTQuMC4wX29uZXBsdXMxMS9tbS9jb250 X3B0ZV9odWdlcGFnZS5jCj4gCj4gc29tZSBDT05UUFRFIGhlbHBlcnMKPiAKPiAyLmh0dHBzOi8v Z2l0aHViLmNvbS9PbmVQbHVzT1NTL2FuZHJvaWRfa2VybmVsX29uZXBsdXNfc204NTUwL2Jsb2Iv b25lcGx1cy9zbTg1NTBfdV8xNC4wLjBfb25lcGx1czExL2luY2x1ZGUvbGludXgvbW0uaAo+IAo+ IHNvbWUgRHluYW1pYyBIdWdlcGFnZSBBUElzCj4gCj4gMy4gaHR0cHM6Ly9naXRodWIuY29tL09u ZVBsdXNPU1MvYW5kcm9pZF9rZXJuZWxfb25lcGx1c19zbTg1NTAvYmxvYi9vbmVwbHVzL3NtODU1 MF91XzE0LjAuMF9vbmVwbHVzMTEvbW0vbWVtb3J5LmMKPiAKPiBtb2RpZmllZCBhbGwgcGFnZSBm YXVsdHMgdG8gc3VwcG9ydAo+ICAgICAgKDEpLiBhbGxvY2F0aW9uIG9mIGh1Z2VwYWdlIG9mIDY0 S0IgaW4gZG9fYW5vbl9wYWdlCgpNeSBTbWFsbC1TaXplZCBUSFAgcGF0Y2ggc2V0IGlzIGhhbmRs aW5nIHRoZSBlcXVpdmFsZW50IG9mIHRoaXMuCgo+ICAgICAgKDIpLiBDb1cgaHVnZXBhZ2UgaW4g ZG9fd3BfcGFnZQoKVGhpcyBpc24ndCBoYW5kbGVkIHlldCBpbiBteSBwYXRjaCBzZXQ7IHRoZSBv cmlnaW5hbCBSRkMgaW1wbGVtZW50ZWQgaXQgYnV0IEkKcmVtb3ZlZCBpdCBpbiBvcmRlciB0byBz dHJpcCBiYWNrIHRvIHRoZSBlc3NlbnRpYWwgY29tcGxleGl0eSBmb3IgdGhlIGluaXRpYWwKc3Vi bWlzc2lvbi4gRGF2aWRIIGhhcyBiZWVuIHdvcmtpbmcgb24gYSBwcmVjaXNlIHNoYXJlZCB2cyBl eGNsdXNpdmUgbWFwCnRyYWNraW5nIG1lY2hhbmlzbSAtIGlmIHRoYXQgZ29lcyBpbiwgaXQgd2ls bCBtYWtlIENvV2luZyBsYXJnZSBmb2xpb3Mgc2ltcGxlci4KT3V0IG9mIGludGVyZXN0LCB3aGF0 IHdvcmtsb2FkcyBiZW5lZml0IG1vc3QgZnJvbSB0aGlzPwoKPiAgICAgICgzKS4gY29weSBDT05Q VEVzIGluIGNvcHlfcHRlX3JhbmdlCgpBcyBkaXNjdXNzZWQgdGhpcyBpcyBkb25lIGFzIHBhcnQg b2YgdGhlIGNvbnRwdGUgcGF0Y2ggc2V0LCBidXQgaXRzIG5vdCBqdXN0IGEKc2ltcGxlIGNvcHk7 IHRoZSBhcmNoIGNvZGUgd2lsbCBub3RpY2UgYW5kIHNldCB0aGUgQ09OVF9QVEUgYml0IGFzIG5l ZWRlZC4KCj4gICAgICAoNCkuIGFsbG9jYXRlIGFuZCBzd2FwLWluIEh1Z2VwYWdlIGFzIGEgd2hv bGUgaW4gZG9fc3dhcF9wYWdlCgpUaGlzIGlzIGdvaW5nIHRvIGJlIGEgcHJvYmxlbSBidXQgSSBo YXZlbid0IGV2ZW4gbG9va2VkIGF0IHRoaXMgcHJvcGVybHkgeWV0LgpUaGUgYWR2aWNlIHNvIGZh ciBoYXMgYmVlbiB0byBjb250aW51ZSB0byBzd2FwLWluIHNtYWxsIHBhZ2VzIG9ubHksIGJ1dCBp bXByb3ZlCmtodWdlcGFnZWQgdG8gY29sbGFwc2UgdG8gc21hbGwtc2l6ZWQgVEhQLiBJJ2xsIHRh a2UgYSBsb29rIGF0IHlvdXIgY29kZSB0bwp1bmRlcnN0YW5kIGhvdyB5b3UgZGlkIHRoaXMuCgo+ IAo+IDQuIGh0dHBzOi8vZ2l0aHViLmNvbS9PbmVQbHVzT1NTL2FuZHJvaWRfa2VybmVsX29uZXBs dXNfc204NTUwL2Jsb2Ivb25lcGx1cy9zbTg1NTBfdV8xNC4wLjBfb25lcGx1czExL21tL3Ztc2Nh bi5jCj4gaHR0cHM6Ly9naXRodWIuY29tL09uZVBsdXNPU1MvYW5kcm9pZF9rZXJuZWxfb25lcGx1 c19zbTg1NTAvYmxvYi9vbmVwbHVzL3NtODU1MF91XzE0LjAuMF9vbmVwbHVzMTEvbW0vcm1hcC5j Cj4gCj4gcmVjbGFpbSBodWdlcGFnZSBhcyBhIHdob2xlIGFuZCBMUlUgb3B0aW1pemF0aW9uIGZv ciA2NEtCIGR5bmFtaWMgaHVnZXBhZ2UuCgpJIHRoaW5rIHRoaXMgaXMgYWxsIG5hdHVyYWxseSBo YW5kbGVkIGJ5IHRoZSBmb2xpbyBjb2RlIHRoYXQgZXhpc3RzIGluIG1vZGVybgprZXJuZWxzPwoK PiAKPiBTbyB3ZSBhcmUgMTAwJSBpbnRlcmVzdGVkIGluIHlvdXIgcGF0Y2hzZXQgYW5kIGhvcGUg aXQgY2FuIGZpbmQgYSB3YXkKPiB0byBsYW5kIG9uIHRoZQo+IG1haW5saW5lLCB0aHVzIGRlY3Jl YXNpbmcgYWxsIHRoZSBjb3N0IHdlIGhhdmUgdG8gbWFpbnRhaW4gb3V0LW9mLXRyZWUKPiBjb2Rl IGZyb20gYQo+IGtlcm5lbCB0byBhbm90aGVyIGtlcm5lbCB2ZXJzaW9uIHdoaWNoIHdlIGhhdmUg ZG9uZSBvbiBhIGNvdXBsZSBvZgo+IGtlcm5lbCB2ZXJzaW9ucwo+IGJlZm9yZSA1LjE2LiBGaXJt bHksIHdlIGFyZSAxMDAlIHN1cHBvcnRpdmUgb2YgbGFyZ2UgYW5vbiBmb2xpb3MKPiB0aGluZ3Mg eW91IGFyZSBsZWFkaW5nLgoKVGhhdCdzIGdyZWF0IHRvIGhlYXIhIE9mIGNvdXJzZSBSZXZpZXdl ZC1CeSdzIGFuZCBUZXN0ZWQtQnkncyB3aWxsIGFsbCBoZWxwIG1vdmUKaXQgY2xvc2VyIDopLiBJ ZiB5b3UgaGFkIGFueSBhYmlsaXR5IHRvIGRvIGFueSBBL0IgcGVyZm9ybWFuY2UgdGVzdGluZywg aXQgd291bGQKYmUgdmVyeSBpbnRlcmVzdGluZyB0byBzZWUgaG93IHRoaXMgc3RhY2tzIHVwIGFn YWluc3QgeW91ciBzb2x1dGlvbiAtIGlmIHRoZXJlCmFyZSBnYXBzIGl0IHdvdWxkIGJlIGdvb2Qg dG8ga25vdyB3aGVyZSBhbmQgZGV2ZWxvcCBhIHBsYW4gdG8gcGx1ZyB0aGUgZ2FwLgoKPiAKPiBB IGJpZyBwYWluIHdhcyB3ZSBmb3VuZCBsb3RzIG9mIHJhY2VzIGVzcGVjaWFsbHkgb24gQ09OVFBU RSB1bmZvbGRpbmcKPiBhbmQgZXNwZWNpYWxseSBhIHBhcnQKPiBvZiBiYXNlcGFnZXMgcmFuIGF3 YXkgZnJvbSB0aGUgMTYgQ09OUFRFcyBncm91cCBzaW5jZSB1c2Vyc3BhY2UgaXMKPiBhbHdheXMg d29ya2luZwo+IG9uIGJhc2VwYWdlcywgaGF2aW5nIG5vIGlkZWEgb2Ygc21hbGwtVEhQLiAgV2Ug cmFuIG91ciBjb2RlIG9uIG1pbGxpb25zIG9mCj4gcmVhbCBwaG9uZXMsIGFuZCBub3cgd2UgaGF2 ZSBnb3QgdGhlbSBmaXhlZCAob3IgbWF5YmUgImNhbid0IHJlcHJvZHVjZSIpLAo+IG5vIG91dHN0 YW5kaW5nIGlzc3VlLgoKSSdtIGdvaW5nIHRvIGJlIGJyYXZlIGFuZCBzYXkgdGhhdCBteSBzb2x1 dGlvbiBzaG91bGRuJ3Qgc3VmZmVyIGZyb20gdGhlc2UKcHJvYmxlbXM7IGJ1dCBvZiBjb3Vyc2Ug dGhlIHByb29mIGlzIG9ubHkgaW4gdGhlIHRlc3RpbmcuIEkgZGlkIGEgbG90IG9mIHdvcmsKd2l0 aCBvdXIgYXJjaGl0ZWN0dXJlIGdyb3VwIGFuZCBtaWNybyBhcmNoaXRlY3RzIHRvIGRldGVybWlu ZSBleGFjdGx5IHdoYXQgaXMKYW5kIGlzbid0IHNhZmU7IFdlIGV2ZW4gdGlnaHRlbmVkIHRoZSBB cm0gQVJNIHNwZWMgdmVyeSBzdWJ0bGVseSB0byBhbGxvdyB0aGUKb3B0aW1pemF0aW9uIGluIHBh dGNoIDEzIChzZWUgdGhlIGNvbW1pdCBsb2cgZm9yIGRldGFpbHMpLiBPZiBjb3Vyc2UgdGhpcyBo YXMKYWxsIGJlZW4gY2hlY2tlZCB3aXRoIHBhcnRuZXJzIGFuZCB3ZSBhcmUgY29uZmlkZW50IHRo YXQgYWxsIGV4aXN0aW5nCmltcGxlbWVudGF0aW9ucyBjb25mb3JtIHRvIHRoZSBtb2RpZmllZCB3 b3JkaW5nLgoKPiAKPiBQYXJ0aWN1bGFybHkgZm9yIHRoZSBybWFwIGlzc3VlIHdlIGFyZSBkaXNj dXNzaW5nLCBvdXIgb3V0LW9mLXRyZWUgaXMKPiB1c2luZyB0aGUgZW50aXJlX21hcCBmb3IKPiBD T05UUFRFIGluIHRoZSB3YXkgSSBzZW50IHRvIHlvdS4gQnV0IEkgZ3Vlc3Mgd2UgY2FuIGxlYXJu IGZyb20geW91IHRvIGRlY291cGxlCj4gQ09OVFBURSBmcm9tIG1tLWNvcmUuCj4gCj4gV2UgYXJl IGRvaW5nIHRoaXMgaW4gbW0vbWVtb3J5LmMKPiAKPiBjb3B5X3ByZXNlbnRfY29udF9wdGUoc3Ry dWN0IHZtX2FyZWFfc3RydWN0ICpkc3Rfdm1hLCBzdHJ1Y3QKPiB2bV9hcmVhX3N0cnVjdCAqc3Jj X3ZtYSwKPiBwdGVfdCAqZHN0X3B0ZSwgcHRlX3QgKnNyY19wdGUsIHVuc2lnbmVkIGxvbmcgYWRk ciwgaW50ICpyc3MsCj4gc3RydWN0IHBhZ2UgKipwcmVhbGxvYykKPiB7Cj4gICAgICAgc3RydWN0 IG1tX3N0cnVjdCAqc3JjX21tID0gc3JjX3ZtYS0+dm1fbW07Cj4gICAgICAgdW5zaWduZWQgbG9u ZyB2bV9mbGFncyA9IHNyY192bWEtPnZtX2ZsYWdzOwo+ICAgICAgIHB0ZV90IHB0ZSA9ICpzcmNf cHRlOwo+ICAgICAgIHN0cnVjdCBwYWdlICpwYWdlOwo+IAo+ICAgICAgICBwYWdlID0gdm1fbm9y bWFsX3BhZ2Uoc3JjX3ZtYSwgYWRkciwgcHRlKTsKPiAgICAgICAuLi4KPiAKPiAgICAgIGdldF9w YWdlKHBhZ2UpOwo+ICAgICAgcGFnZV9kdXBfcm1hcChwYWdlLCB0cnVlKTsgICAvLyBhbiBlbnRp cmUgZHVwX3JtYXAgYXMgeW91IGNhbgo+IHNlZS4uLi4uLi4uLi4uLi4KPiAgICAgIHJzc1ttbV9j b3VudGVyKHBhZ2UpXSArPSBIUEFHRV9DT05UX1BURV9OUjsKPiB9Cj4gCj4gYW5kIHdlIGhhdmUg YSBzcGxpdCBpbiBtbS9jb250X3B0ZV9odWdlcGFnZS5jIHRvIGhhbmRsZSBwYXJ0aWFsbHkgdW5t YXAsCj4gCj4gc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX2NvbnRfcHRlX2xvY2tlZChzdHJ1Y3Qg dm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcHRlX3QgKnB0ZSwKPiB1bnNpZ25lZCBsb25nIGhhZGRyLCBi b29sIGZyZWV6ZSkKPiB7Cj4gLi4uCj4gICAgICAgICAgICBpZiAoY29tcG91bmRfbWFwY291bnQo aGVhZCkgPiAxICYmICFUZXN0U2V0UGFnZURvdWJsZU1hcChoZWFkKSkgewo+ICAgICAgICAgICAg ICAgICAgIGZvciAoaSA9IDA7IGkgPCBIUEFHRV9DT05UX1BURV9OUjsgaSsrKQo+ICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGF0b21pY19pbmMoJmhlYWRbaV0uX21hcGNvdW50KTsKPiAgICAg ICAgICAgICAgICAgIGF0b21pY19sb25nX2luYygmY29udF9wdGVfZG91YmxlX21hcF9jb3VudCk7 Cj4gICAgICAgICAgICB9Cj4gCj4gCj4gICAgICAgICAgICAgaWYgKGF0b21pY19hZGRfbmVnYXRp dmUoLTEsIGNvbXBvdW5kX21hcGNvdW50X3B0cihoZWFkKSkpIHsKPiAgICAgICAgICAgICAgIC4u Lgo+IH0KPiAKPiBJIGFtIG5vdCBzZWxsaW5nIG91ciBzb2x1dGlvbiBhbnkgbW9yZSwgYnV0IGp1 c3Qgc2hvd2luZyB5b3Ugc29tZSBkaWZmZXJlbmNlcyB3ZQo+IGhhdmUgOi0pCgpPSywgSSB1bmRl cnN0YW5kIHdoYXQgeW91IHdlcmUgc2F5aW5nIG5vdy4gSSdtIGN1cnJlbnRseSBzdHJ1Z2dsaW5n IHRvIHNlZSBob3cKdGhpcyBjb3VsZCBmaXQgaW50byBteSBtb2RlbC4gRG8geW91IGhhdmUgYW55 IHdvcmtsb2FkcyBhbmQgbnVtYmVycyBvbiBwZXJmCmltcHJvdmVtZW50IG9mIHVzaW5nIGVudGly ZV9tYXBjb3VudD8KCj4gCj4+Cj4+Pgo+Pj4gQlRXLCBJIGhhdmUgY29uY2VybnMgdGhhdCBhIHZh cmlhYmxlIHNtYWxsLVRIUCBzaXplIHdpbGwgcmVhbGx5IHdvcmsKPj4+IGFzIHVzZXJzcGFjZQo+ Pj4gaXMgcHJvYmFibHkgZnJpZW5kbHkgdG8gb25seSBvbmUgZml4ZWQgc2l6ZS4gZm9yIGV4YW1w bGUsIHVzZXJzcGFjZQo+Pj4gaGVhcCBtYW5hZ2VtZW50Cj4+PiBtaWdodCBiZSBvcHRpbWl6ZWQg dG8gYSBzaXplIGZvciBmcmVlaW5nIG1lbW9yeSB0byB0aGUga2VybmVsLiBpdCBpcwo+Pj4gdmVy eSBkaWZmaWN1bHQKPj4+IGZvciB0aGUgaGVhcCB0byBhZGFwdCB0byB2YXJpb3VzIHNpemVzIGF0 IHRoZSBzYW1lIHRpbWUuIGZyZXF1ZW50IHVubWFwL2ZyZWUKPj4+IHNpemUgbm90IGVxdWFsIHdp dGgsIGFuZCBwYXJ0aWN1bGFybHkgc21hbGxlciB0aGFuIHNtYWxsLVRIUCBzaXplIHdpbGwKPj4+ IGRlZmVhdCBhbGwKPj4+IGVmZm9ydHMgdG8gdXNlIHNtYWxsLVRIUC4KPj4KPj4gSSdsbCBhZG1p dCB0byBub3Qga25vd2luZyBhIGh1Z2UgYW1vdW50IGFib3V0IHVzZXIgc3BhY2UgYWxsb2NhdG9y cy4gQnV0IEkgd2lsbAo+PiBzYXkgdGhhdCBhcyBjdXJyZW50bHkgZGVmaW5lZCwgdGhlIHNtYWxs LXNpemVkIFRIUCBpbnRlcmZhY2UgdG8gdXNlciBzcGFjZQo+PiBhbGxvd3MgYSBzeXNhZG1pbiB0 byBzcGVjaWZpY2FsbHkgZW5hYmxlIHRoZSBzZXQgb2Ygc2l6ZXMgdGhhdCB0aGV5IHdhbnQ7IHNv IGEKPj4gc2luZ2xlIHNpemUgY2FuIGJlIGVuYWJsZWQuIEknbSBkaWxpYmVyYXRlbHkgcHVudGlu ZyB0aGF0IGRlY2lzaW9uIGF3YXkgZnJvbSB0aGUKPj4ga2VybmVsIGZvciBub3cuCj4gCj4gQmFz aWNhbGx5LCB1c2Vyc3BhY2UgaGVhcCBsaWJyYXJ5IGhhcyBhIFBBR0VTSVpFIHNldHRpbmcgYW5k IGFsbG93cyB1c2Vycwo+IHRvIGFsbG9jYXRlL2ZyZWUgYWxsIGtpbmRzIG9mIHNtYWxsIG9iamVj dHMgc3VjaCBhcyAxNiwzMiw2NCwxMjgsMjU2LDUxMiBldGMuCj4gVGhlIGRlZmF1bHQgc2l6ZSBp cyBmb3Igc3VyZSBlcXVhbCB0byB0aGUgYmFzZXBhZ2UgU0laRS4gb25jZSBzb21lIG9iamVjdHMg YXJlCj4gZnJlZWQgYnkgZnJlZSgpIGFuZCBsaWJjIGdldCBhIGZyZWUgInBhZ2UiLCB1c2Vyc3Bh Y2UgaGVhcCBsaWJyYXJpZXMgbWlnaHQgZnJlZQo+IHRoZSBQQUdFU0laRSBwYWdlIHRvIGtlcm5l bCBieSB0aGluZ3MgbGlrZSBNQURWX0RPTlRORUVELCB0aGVuIHphcF9wdGVfcmFuZ2UoKS4KPiBp dCBpcyBxdWl0ZSBzaW1pbGFyIHdpdGgga2VybmVsIHNsYWIuCj4gCj4gc28gaW1hZ2luZSB3ZSBo YXZlIHNtYWxsLVRIUCBub3csIGJ1dCB1c2Vyc3BhY2UgbGlicmFyaWVzIGhhdmUgKk5PKgo+IGlk ZWEgYXQgYWxsLCAgc28gaXQgY2FuIGZyZXF1ZW50bHkgY2F1c2UgdW5mb2xkaW5nLgo+IAo+Pgo+ PiBGV0lXLCBNeSBleHBlcmllbmNlIHdpdGggdGhlIFNwZWVkb21ldGVyL0phdmFTY3JpcHQgdXNl IGNhc2UgaXMgdGhhdCBwZXJmb3JtYW5jZQo+PiBpcyBhIGxpdHRsZSBiaXQgYmV0dGVyIHdoZW4g ZW5hYmxpbmcgNjQrMzIrMTZLIHZzIGp1c3QgNjRLIFRIUC4KPj4KPj4gRnVuY3Rpb25hbGx5LCBp dCB3aWxsIG5vdCBtYXR0ZXIgaWYgdGhlIGFsbG9jYXRvciBpcyBub3QgZW5saWdodGVuZWQgZm9y IHRoZSBUSFAKPj4gc2l6ZTsgaXQgY2FuIGNvbnRpbnVlIHRvIGZyZWUsIGFuZCBpZiBhIHBhcnRp YWwgZm9saW8gaXMgdW5tYXBwZWQgaXQgaXMgcHV0IG9uCj4+IHRoZSBkZWZlcnJlZCBzcGxpdCBs aXN0LCB0aGVuIHVuZGVyIG1lbW9yeSBwcmVzc3VyZSBpdCBpcyBzcGxpdCBhbmQgdGhlIHVudXNl ZAo+PiBwYWdlcyBhcmUgcmVjbGFpbWVkLiBJIGd1ZXNzIHRoaXMgaXMgdGhlIGJpdCB5b3UgYXJl IGNvbmNlcm5lZCBhYm91dCBoYXZpbmcgYQo+PiBwZXJmb3JtYW5jZSBpbXBhY3Q/Cj4gCj4gcmln aHQuIElmIHRoaXMgaXMgaGFwcGVuaW5nIG9uIHRoZSBtYWpvcml0eSBvZiBzbWFsbC1USFAgZm9s aW9zLCB3ZQo+IGRvbid0IGhhdmUgcGVyZm9ybWFuY2UKPiBpbXByb3ZlbWVudCwgYW5kIHByb2Jh Ymx5IHJlZ3Jlc3Npb24gaW5zdGVhZC4gVGhpcyBpcyByZWFsbHkgdHJ1ZSBvbgo+IHJlYWwgd29y a2xvYWRzISEKPiAKPiBTbyB0aGF0IGlzIHdoeSB3ZSByZWFsbHkgbG92ZSBhIHBlci1WTUEgaGlu dCB0byBlbmFibGUgc21hbGwtVEhQIGJ1dAo+IG9idmlvdXNseSB5b3UKPiBoYXZlIGFscmVhZHkg c3VwcG9ydGVkIGl0IG5vdyBieQo+IG1tOiB0aHA6IEludHJvZHVjZSBwZXItc2l6ZSB0aHAgc3lz ZnMgaW50ZXJmYWNlCj4gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGludXgtbW0vMjAyMzExMjIx NjI5NTAuMzg1NDg5Ny00LXJ5YW4ucm9iZXJ0c0Bhcm0uY29tLwo+IAo+IHdlIGNhbiB1c2UgTUFE VklTRSByYXRoZXIgdGhhbiBBTFdBWVMgYW5kIHNldCBmaXhlZCBzaXplIGxpa2UgNjRLQiwgc28g dXNlcnNwYWNlCj4gY2FuIHNldCB0aGUgVk1BIGZsYWcgd2hlbiBpdCBpcyBxdWl0ZSBzdXJlIHRo aXMgVk1BIGlzIHdvcmtpbmcgd2l0aAo+IHRoZSBhbGlnbm1lbnQKPiBvZiA2NEtCPwoKWWVzLCB0 aGF0IGFsbCBleGlzdHMgaW4gdGhlIHNlcmllcyB0b2RheS4gV2UgaGF2ZSBhbHNvIGRpc2N1c3Nl ZCB0aGUgcG9zc2liaWxpdHkKb2YgYWRkaW5nIGEgbmV3IG1hZHZpc2VfcHJvY2VzcygpIGNhbGwg dGhhdCB3b3VsZCB0YWtlIHRoZSBzZXQgb2YgVEhQIHNpemVzIHRoYXQKc2hvdWxkIGJlIGNvbnNp ZGVyZWQuIFRoZW4geW91IGNhbiBzZXQgZGlmZmVyZW50IFZNQXMgdG8gdXNlIGRpZmZlcmVudCBz aXplczsKdGhlIHBsYW4gd2FzIHRvIGxheWVyIHRoYXQgb24gdG9wIGlmL3doZW4gYSB3b3JrbG9h ZCB3YXMgaWRlbnRpZmllZC4gU291bmRzIGxpa2UKeW91IG1pZ2h0IGJlIGFibGUgdG8gaGVscCB0 aGVyZT8KCj4gCj4+Cj4+IFJlZ2FyZGxlc3MsIGl0IHdvdWxkIGJlIGdvb2QgdG8gbW92ZSB0aGlz IGNvbnZlcnNhdGlvbiB0byB0aGUgc21hbGwtc2l6ZWQgVEhQCj4+IHBhdGNoIHNlcmllcyBzaW5j ZSB0aGlzIGlzIGFsbCBpbmRlcGVuZGVudCBvZiBjb250cHRlIG1hcHBpbmdzLgo+Pgo+Pj4KPj4+ Pgo+Pj4+Pgo+Pj4+PiBTaW5jZSB3ZSBhbHdheXMgaG9sZCBwdGwgdG8gc2V0IG9yIGRyb3AgQ09O VFBURSBiaXRzLCBzZXQvZHJvcCBpcwo+Pj4+PiBzdGlsbCBhdG9taWMgaW4gYQo+Pj4+PiBzcGlu bG9jayBhcmVhLgo+Pj4+Pgo+Pj4+Pj4KPj4+Pj4+Pj4KPj4+Pj4+Pj4gQnV0IHRoYXQgY2FuIGJl IGFkZGVkIG9uIHRvcCwgYW5kIEknbGwgaGFwcGlseSBkbyB0aGF0Lgo+Pj4+Pj4+Pgo+Pj4+Pj4+ PiAtLQo+Pj4+Pj4+PiBDaGVlcnMsCj4+Pj4+Pj4+Cj4+Pj4+Pj4+IERhdmlkIC8gZGhpbGRlbmIK Pj4+Pj4+Pgo+Pj4+Pgo+Pj4KPiAKPiBUaGFua3MKPiBCYXJyeQoKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBs aXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5m cmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK