From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 262EB1FF165 for ; Thu, 6 Nov 2025 10:04:31 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id EF93010B16; Thu, 6 Nov 2025 10:05:11 +0100 (CET) Message-ID: <3b5a03cb-97ea-416e-b7b6-40bb39f38d32@proxmox.com> Date: Thu, 6 Nov 2025 10:04:34 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: Christian Ebner , Proxmox Backup Server development discussion References: <20251105155129.517430-1-n.frey@proxmox.com> <20251105155129.517430-3-n.frey@proxmox.com> <528f6574-c7b1-42cb-ac2a-988c3fbacf08@proxmox.com> From: Nicolas Frey Content-Language: en-US In-Reply-To: <528f6574-c7b1-42cb-ac2a-988c3fbacf08@proxmox.com> X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1762419856142 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.798 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: Re: [pbs-devel] [PATCH proxmox-backup 1/4] api: verify: move chunk loading into parallel handler X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Backup Server development discussion Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" Ck9uIDExLzYvMjUgOTo1NCBBTSwgQ2hyaXN0aWFuIEVibmVyIHdyb3RlOgo+IE9uIDExLzUvMjUg NDo1MSBQTSwgTmljb2xhcyBGcmV5IHdyb3RlOgo+PiBUaGlzIHdheSwgdGhlIGNodW5rcyB3aWxs IGJlIGxvYWRlZCBpbiBwYXJhbGxlbCBpbiBhZGRpdGlvbiB0byBiZWluZwo+PiBjaGVja2VkIGlu IHBhcmFsbGVsLgo+Pgo+PiBEZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgc3RvcmFnZSwgdGhp cyBjYW4gc3BlZWQgdXAgcmVhZGluZyBjaHVua3MKPj4gZnJvbSBkaXNrLCBlc3BlY2lhbGx5IHdo ZW4gdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBpcyBJTyBkZXB0aAo+PiBkZXBlbmRlbnQsIGFuZCB0 aGUgQ1BVIGlzIGZhc3RlciB0aGFuIHRoZSBzdG9yYWdlLgo+Pgo+PiBPcmlnaW5hbGx5LWJ5OiBE b21pbmlrIENzYXBhayA8ZC5jc2FwYWtAcHJveG1veC5jb20+Cj4+IFNpZ25lZC1vZmYtYnk6IE5p Y29sYXMgRnJleSA8bi5mcmV5QHByb3htb3guY29tPgo+PiAtLS0KPj4gwqAgc3JjL2JhY2t1cC92 ZXJpZnkucnMgfCAxMjAgKysrKysrKysrKysrKysrKysrKysrKysrKysKPj4gKy0tLS0tLS0tLS0t LS0tLS0KPj4gwqAgMSBmaWxlIGNoYW5nZWQsIDc1IGluc2VydGlvbnMoKyksIDQ1IGRlbGV0aW9u cygtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEvc3JjL2JhY2t1cC92ZXJpZnkucnMgYi9zcmMvYmFja3Vw L3ZlcmlmeS5ycwo+PiBpbmRleCBlMzNmZGY1MC4uN2Y5MWYzOGMgMTAwNjQ0Cj4+IC0tLSBhL3Ny Yy9iYWNrdXAvdmVyaWZ5LnJzCj4+ICsrKyBiL3NyYy9iYWNrdXAvdmVyaWZ5LnJzCj4+IEBAIC0x LDYgKzEsNiBAQAo+PiDCoCB1c2UgcGJzX2NvbmZpZzo6QmFja3VwTG9ja0d1YXJkOwo+PiDCoCB1 c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaFNldDsKPj4gLXVzZSBzdGQ6OnN5bmM6OmF0b21pYzo6 e0F0b21pY1VzaXplLCBPcmRlcmluZ307Cj4+ICt1c2Ugc3RkOjpzeW5jOjphdG9taWM6OntBdG9t aWNVNjQsIEF0b21pY1VzaXplLCBPcmRlcmluZ307Cj4+IMKgIHVzZSBzdGQ6OnN5bmM6OntBcmMs IE11dGV4fTsKPj4gwqAgdXNlIHN0ZDo6dGltZTo6SW5zdGFudDsKPj4gwqAgQEAgLTIwLDcgKzIw LDcgQEAgdXNlIHBic19kYXRhc3RvcmU6OmluZGV4Ojp7Q2h1bmtSZWFkSW5mbywKPj4gSW5kZXhG aWxlfTsKPj4gwqAgdXNlIHBic19kYXRhc3RvcmU6Om1hbmlmZXN0Ojp7QmFja3VwTWFuaWZlc3Qs IEZpbGVJbmZvfTsKPj4gwqAgdXNlIHBic19kYXRhc3RvcmU6OntEYXRhQmxvYiwgRGF0YVN0b3Jl LCBEYXRhc3RvcmVCYWNrZW5kLAo+PiBTdG9yZVByb2dyZXNzfTsKPj4gwqAgLXVzZSBjcmF0ZTo6 dG9vbHM6OnBhcmFsbGVsX2hhbmRsZXI6OlBhcmFsbGVsSGFuZGxlcjsKPj4gK3VzZSBjcmF0ZTo6 dG9vbHM6OnBhcmFsbGVsX2hhbmRsZXI6OntQYXJhbGxlbEhhbmRsZXIsIFNlbmRIYW5kbGV9Owo+ PiDCoCDCoCB1c2UgY3JhdGU6OmJhY2t1cDo6aGllcmFyY2h5OjpMaXN0QWNjZXNzaWJsZUJhY2t1 cEdyb3VwczsKPj4gwqAgQEAgLTE1NiwyMyArMTU2LDIwIEBAIGltcGwgVmVyaWZ5V29ya2VyIHsK Pj4gwqAgwqDCoMKgwqDCoMKgwqDCoMKgIGxldCBzdGFydF90aW1lID0gSW5zdGFudDo6bm93KCk7 Cj4+IMKgIC3CoMKgwqDCoMKgwqDCoCBsZXQgbXV0IHJlYWRfYnl0ZXMgPSAwOwo+PiAtwqDCoMKg wqDCoMKgwqAgbGV0IG11dCBkZWNvZGVkX2J5dGVzID0gMDsKPj4gK8KgwqDCoMKgwqDCoMKgIGxl dCByZWFkX2J5dGVzID0gQXJjOjpuZXcoQXRvbWljVTY0OjpuZXcoMCkpOwo+PiArwqDCoMKgwqDC oMKgwqAgbGV0IGRlY29kZWRfYnl0ZXMgPSBBcmM6Om5ldyhBdG9taWNVNjQ6Om5ldygwKSk7Cj4+ IMKgIC3CoMKgwqDCoMKgwqDCoCBsZXQgZGF0YXN0b3JlMiA9IEFyYzo6Y2xvbmUoJnNlbGYuZGF0 YXN0b3JlKTsKPj4gLcKgwqDCoMKgwqDCoMKgIGxldCBjb3JydXB0X2NodW5rczIgPSBBcmM6OmNs b25lKCZzZWxmLmNvcnJ1cHRfY2h1bmtzKTsKPj4gLcKgwqDCoMKgwqDCoMKgIGxldCB2ZXJpZmll ZF9jaHVua3MyID0gQXJjOjpjbG9uZSgmc2VsZi52ZXJpZmllZF9jaHVua3MpOwo+PiAtwqDCoMKg wqDCoMKgwqAgbGV0IGVycm9yczIgPSBBcmM6OmNsb25lKCZlcnJvcnMpOwo+PiAtCj4+IC3CoMKg wqDCoMKgwqDCoCBsZXQgZGVjb2Rlcl9wb29sID0gUGFyYWxsZWxIYW5kbGVyOjpuZXcoCj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgICJ2ZXJpZnkgY2h1bmsgZGVjb2RlciIsCj4+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgIDQsCj4+ICvCoMKgwqDCoMKgwqDCoCBsZXQgZGVjb2Rlcl9wb29sID0g UGFyYWxsZWxIYW5kbGVyOjpuZXcoInZlcmlmeSBjaHVuawo+PiBkZWNvZGVyIiwgNCwgewo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQgZGF0YXN0b3JlID0gQXJjOjpjbG9uZSgmc2VsZi5k YXRhc3RvcmUpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQgY29ycnVwdF9jaHVua3Mg PSBBcmM6OmNsb25lKCZzZWxmLmNvcnJ1cHRfY2h1bmtzKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgbGV0IHZlcmlmaWVkX2NodW5rcyA9IEFyYzo6Y2xvbmUoJnNlbGYudmVyaWZpZWRfY2h1 bmtzKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IGVycm9ycyA9IEFyYzo6Y2xvbmUo JmVycm9ycyk7Cj4gCj4gSG1tLCB0aGlzIHJlYWxseSB3YXJyYW50cyBhbiBpbnRlcm5hbCBzdGF0 ZSBzdHJ1Y3QgZm9yIGJ1bmRsaW5nIHRoZXNlcwo+IGFuZCBvbmx5IGNsb25pbmcgdGhlIGFyYyBh cm91bmQgdGhhdC4KPiAKPiBFLmcuIEkgd291bGQgcHJvcG9zZSB0byBpbnRyb2R1Y2UgYSBzdHJ1 Y3QgYWxvbmcgdGhlIGxpbmVzIG9mOgo+IAo+IHN0cnVjdCBJbmRleFZlcmlmeVN0YXRlIHsKPiDC oMKgwqAgcmVhZF9ieXRlczogQXRvbWljVTY0LAo+IMKgwqDCoCBkZWNvZGVkX2J5dGVzOiBBdG9t aWNVNjQsCj4gwqDCoMKgIGVycm9yczogQXRvbWljVXNpemUsCj4gwqDCoMKgIGRhdGFzdG9yZTog QXJjPERhdGFTdG9yZT4sCj4gwqDCoMKgIGNvcnJ1cHRfY2h1bmtzOiBBcmM8TXV0ZXg8SGFzaFNl dDxbdTg7IDMyXT4+PiwKPiDCoMKgwqAgc3RhcnRfdGltZTogSW5zdGFudCwKPiB9Cj4gCj4gV2hp Y2ggY2FuIHRoZW4gYmUgd3JhcHBlZCBpbiBhbiBBcmMgYW5kIGFsc28gcGFzc2VkIGFsb25nIGFz IHBhcmFtZXRlcgo+IHRvIHRoZSBpbm5lciBtZXRob2RzIHdoZXJlIHJlcXVpcmVkLgo+IAo+IFNl ZSB0aGUgZGlmZiBiZWxvdyAodW50ZXN0ZWQpLCB3aGljaCBjb3VsZCBiZSB1c2VkIGZvciBmdXJ0 aGVyCj4gcmVmaW5pbmcgdGhpcy4KPiAKCkkgdGhvdWdodCB0aGlzIGNvdWxkIGJlIGltcHJvdmVk IGluIHRoZSBpbml0aWFsIHBhdGNoLCBidXQgd2Fzbid0CnF1aXRlIHN1cmUgaG93IEkgc2hvdWxk IGFwcHJvYWNoIGl0LCBzbyB0aGFua3MgZm9yIHRoZSBGZWVkYmFjayEKVGhlIGRpZmYgYmVsb3cg bG9va3MgZ29vZCB0byBtZSwgSSdsbCBzZW5kIGEgdjIgZm9yIHRoaXMgaW4gYWRkaXRpb24KdG8g dGhlIHRoaW5ncyB5b3UgcG9pbnRlZCBvdXQgaW4gdGhlIG90aGVyIHBhdGNoZXMuCgo+PiDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBtb3ZlIHwoY2h1bmssIGRpZ2VzdCwgc2l6ZSk6IChEYXRh QmxvYiwgW3U4OyAzMl0sIHU2NCl8IHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBsZXQgY2h1bmtfY3J5cHRfbW9kZSA9IG1hdGNoIGNodW5rLmNyeXB0X21vZGUoKSB7Cj4+ IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBFcnIoZXJyKSA9PiB7 Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgCj4+IGNv cnJ1cHRfY2h1bmtzMi5sb2NrKCkudW53cmFwKCkuaW5zZXJ0KGRpZ2VzdCk7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvcnJ1cHRfY2h1bmtzLmxv Y2soKS51bndyYXAoKS5pbnNlcnQoZGlnZXN0KTsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW5mbyEoImNhbid0IHZlcmlmeSBjaHVuaywgdW5r bm93bgo+PiBDcnlwdE1vZGUgLSB7ZXJyfSIpOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnJvcnMyLmZldGNoX2FkZCgxLCBPcmRlcmluZzo6U2Vx Q3N0KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg ZXJyb3JzLmZldGNoX2FkZCgxLCBPcmRlcmluZzo6U2VxQ3N0KTsKPj4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIE9rKCgpKTsKPj4gwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE9rKG1vZGUpID0+IG1vZGUsCj4+IEBAIC0x ODIsMjEgKzE3OSwyMSBAQCBpbXBsIFZlcmlmeVdvcmtlciB7Cj4+IMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbmZvISgKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICJjaHVuayBDcnlwdE1vZGUge2NodW5rX2NyeXB0X21vZGU6 P30gZG9lcyBub3QKPj4gbWF0Y2ggaW5kZXggQ3J5cHRNb2RlIHtjcnlwdF9tb2RlOj99Igo+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnJvcnMyLmZldGNoX2FkZCgxLCBPcmRlcmluZzo6U2Vx Q3N0KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVycm9ycy5m ZXRjaF9hZGQoMSwgT3JkZXJpbmc6OlNlcUNzdCk7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgfQo+PiDCoCDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlm IGxldCBFcnIoZXJyKSA9IGNodW5rLnZlcmlmeV91bmVuY3J5cHRlZChzaXplCj4+IGFzIHVzaXpl LCAmZGlnZXN0KSB7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBj b3JydXB0X2NodW5rczIubG9jaygpLnVud3JhcCgpLmluc2VydChkaWdlc3QpOwo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29ycnVwdF9jaHVua3MubG9jaygpLnVu d3JhcCgpLmluc2VydChkaWdlc3QpOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgaW5mbyEoIntlcnJ9Iik7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBlcnJvcnMyLmZldGNoX2FkZCgxLCBPcmRlcmluZzo6U2VxQ3N0KTsKPj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgCj4+IFNlbGY6OnJlbmFtZV9j b3JydXB0ZWRfY2h1bmsoZGF0YXN0b3JlMi5jbG9uZSgpLCAmZGlnZXN0KTsKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVycm9ycy5mZXRjaF9hZGQoMSwgT3JkZXJp bmc6OlNlcUNzdCk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBT ZWxmOjpyZW5hbWVfY29ycnVwdGVkX2NodW5rKGRhdGFzdG9yZS5jbG9uZSgpLAo+PiAmZGlnZXN0 KTsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9IGVsc2Ugewo+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdmVyaWZpZWRfY2h1bmtzMi5sb2Nr KCkudW53cmFwKCkuaW5zZXJ0KGRpZ2VzdCk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB2ZXJpZmllZF9jaHVua3MubG9jaygpLnVud3JhcCgpLmluc2VydChkaWdl c3QpOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gwqAgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBPaygoKSkKPj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfSwKPj4gLcKgwqDCoMKgwqDCoMKgICk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IH0KPj4gK8KgwqDCoMKgwqDCoMKgIH0pOwo+PiDCoCDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IHNr aXBfY2h1bmsgPSB8ZGlnZXN0OiAmW3U4OyAzMl18IC0+IGJvb2wgewo+PiDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZgo+PiBzZWxmLnZlcmlmaWVkX2NodW5rcy5sb2NrKCkudW53cmFwKCku Y29udGFpbnMoZGlnZXN0KSB7Cj4+IEBAIC0yMjMsNiArMjIwLDI5IEBAIGltcGwgVmVyaWZ5V29y a2VyIHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLmRhdGFzdG9yZQo+PiDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAuZ2V0X2NodW5rc19pbl9vcmRlcigmKmluZGV4LCBza2lwX2No dW5rLCBjaGVja19hYm9ydCk/Owo+PiDCoCArwqDCoMKgwqDCoMKgwqAgbGV0IHJlYWRlcl9wb29s ID0gUGFyYWxsZWxIYW5kbGVyOjpuZXcoInJlYWQgY2h1bmtzIiwgNCwgewo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBsZXQgZGVjb2Rlcl9wb29sID0gZGVjb2Rlcl9wb29sLmNoYW5uZWwoKTsK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IGRhdGFzdG9yZSA9IEFyYzo6Y2xvbmUoJnNl bGYuZGF0YXN0b3JlKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IGNvcnJ1cHRfY2h1 bmtzID0gQXJjOjpjbG9uZSgmc2VsZi5jb3JydXB0X2NodW5rcyk7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGxldCByZWFkX2J5dGVzID0gQXJjOjpjbG9uZSgmcmVhZF9ieXRlcyk7Cj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxldCBkZWNvZGVkX2J5dGVzID0gQXJjOjpjbG9uZSgmZGVj b2RlZF9ieXRlcyk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxldCBlcnJvcnMgPSBBcmM6 OmNsb25lKCZlcnJvcnMpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQgYmFja2VuZCA9 IHNlbGYuYmFja2VuZC5jbG9uZSgpOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1v dmUgfGluZm86IENodW5rUmVhZEluZm98IHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBTZWxmOjp2ZXJpZnlfY2h1bmtfYnlfYmFja2VuZCgKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICZiYWNrZW5kLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgQXJjOjpjbG9uZSgmZGF0YXN0b3JlKSwKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEFyYzo6Y2xvbmUoJmNvcnJ1cHRfY2h1bmtzKSwK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEFyYzo6Y2xvbmUoJnJl YWRfYnl0ZXMpLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQXJj OjpjbG9uZSgmZGVjb2RlZF9ieXRlcyksCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBBcmM6OmNsb25lKCZlcnJvcnMpLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgJmRlY29kZXJfcG9vbCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICZpbmZvLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqAgfSk7 Cj4+ICsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGZvciAocG9zLCBfKSBpbiBjaHVua19saXN0IHsK Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2VsZi53b3JrZXIuY2hlY2tfYWJvcnQoKT87 Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNlbGYud29ya2VyLmZhaWxfb25fc2h1dGRv d24oKT87Cj4+IEBAIC0yMzQsMTkgKzI1NCwxNiBAQCBpbXBsIFZlcmlmeVdvcmtlciB7Cj4+IMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7IC8vIGFscmVhZHkgdmVy aWZpZWQgb3IgbWFya2VkIGNvcnJ1cHQKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+ PiDCoCAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzZWxmLnZlcmlmeV9jaHVua19ieV9iYWNrZW5k KAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZpbmZvLAo+PiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICZtdXQgcmVhZF9ieXRlcywKPj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAmbXV0IGRlY29kZWRfYnl0ZXMsCj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgQXJjOjpjbG9uZSgmZXJyb3JzKSwKPj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAmZGVjb2Rlcl9wb29sLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAp PzsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVhZGVyX3Bvb2wuc2VuZChpbmZvKT87Cj4+ IMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+IMKgIC3CoMKgwqDCoMKgwqDCoCBkZWNvZGVyX3Bvb2wu Y29tcGxldGUoKT87Cj4+ICvCoMKgwqDCoMKgwqDCoCByZWFkZXJfcG9vbC5jb21wbGV0ZSgpPzsK Pj4gwqAgwqDCoMKgwqDCoMKgwqDCoMKgIGxldCBlbGFwc2VkID0gc3RhcnRfdGltZS5lbGFwc2Vk KCkuYXNfc2Vjc19mNjQoKTsKPj4gwqAgK8KgwqDCoMKgwqDCoMKgIGxldCByZWFkX2J5dGVzID0g cmVhZF9ieXRlcy5sb2FkKE9yZGVyaW5nOjpTZXFDc3QpOwo+PiArwqDCoMKgwqDCoMKgwqAgbGV0 IGRlY29kZWRfYnl0ZXMgPSBkZWNvZGVkX2J5dGVzLmxvYWQoT3JkZXJpbmc6OlNlcUNzdCk7Cj4+ ICsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGxldCByZWFkX2J5dGVzX21pYiA9IChyZWFkX2J5dGVz IGFzIGY2NCkgLyAoMTAyNC4wICogMTAyNC4wKTsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGxldCBk ZWNvZGVkX2J5dGVzX21pYiA9IChkZWNvZGVkX2J5dGVzIGFzIGY2NCkgLyAoMTAyNC4wICoKPj4g MTAyNC4wKTsKPj4gwqAgQEAgLTI2NiwyNiArMjgzLDMxIEBAIGltcGwgVmVyaWZ5V29ya2VyIHsK Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIE9rKCgpKQo+PiDCoMKgwqDCoMKgIH0KPj4gwqAgK8KgwqDC oCAjW2FsbG93KGNsaXBweTo6dG9vX21hbnlfYXJndW1lbnRzKV0KPj4gwqDCoMKgwqDCoCBmbiB2 ZXJpZnlfY2h1bmtfYnlfYmFja2VuZCgKPj4gLcKgwqDCoMKgwqDCoMKgICZzZWxmLAo+PiAtwqDC oMKgwqDCoMKgwqAgaW5mbzogJkNodW5rUmVhZEluZm8sCj4+IC3CoMKgwqDCoMKgwqDCoCByZWFk X2J5dGVzOiAmbXV0IHU2NCwKPj4gLcKgwqDCoMKgwqDCoMKgIGRlY29kZWRfYnl0ZXM6ICZtdXQg dTY0LAo+PiArwqDCoMKgwqDCoMKgwqAgYmFja2VuZDogJkRhdGFzdG9yZUJhY2tlbmQsCj4+ICvC oMKgwqDCoMKgwqDCoCBkYXRhc3RvcmU6IEFyYzxEYXRhU3RvcmU+LAo+PiArwqDCoMKgwqDCoMKg wqAgY29ycnVwdF9jaHVua3M6IEFyYzxNdXRleDxIYXNoU2V0PFt1ODsgMzJdPj4+LAo+PiArwqDC oMKgwqDCoMKgwqAgcmVhZF9ieXRlczogQXJjPEF0b21pY1U2ND4sCj4+ICvCoMKgwqDCoMKgwqDC oCBkZWNvZGVkX2J5dGVzOiBBcmM8QXRvbWljVTY0PiwKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGVy cm9yczogQXJjPEF0b21pY1VzaXplPiwKPj4gLcKgwqDCoMKgwqDCoMKgIGRlY29kZXJfcG9vbDog JlBhcmFsbGVsSGFuZGxlcjwoRGF0YUJsb2IsIFt1ODsgMzJdLCB1NjQpPiwKPj4gK8KgwqDCoMKg wqDCoMKgIGRlY29kZXJfcG9vbDogJlNlbmRIYW5kbGU8KERhdGFCbG9iLCBbdTg7IDMyXSwgdTY0 KT4sCj4+ICvCoMKgwqDCoMKgwqDCoCBpbmZvOiAmQ2h1bmtSZWFkSW5mbywKPj4gwqDCoMKgwqDC oCApIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKPj4gLcKgwqDCoMKgwqDCoMKgIG1hdGNoICZzZWxm LmJhY2tlbmQgewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBEYXRhc3RvcmVCYWNrZW5kOjpG aWxlc3lzdGVtID0+IG1hdGNoCj4+IHNlbGYuZGF0YXN0b3JlLmxvYWRfY2h1bmsoJmluZm8uZGln ZXN0KSB7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRXJyKGVycikgPT4gc2Vs Zi5hZGRfY29ycnVwdF9jaHVuaygKPj4gK8KgwqDCoMKgwqDCoMKgIG1hdGNoIGJhY2tlbmQgewo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBEYXRhc3RvcmVCYWNrZW5kOjpGaWxlc3lzdGVtID0+ IG1hdGNoCj4+IGRhdGFzdG9yZS5sb2FkX2NodW5rKCZpbmZvLmRpZ2VzdCkgewo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEVycihlcnIpID0+IFNlbGY6OmFkZF9jb3JydXB0X2No dW5rKAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZGF0YXN0b3Jl LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29ycnVwdF9jaHVu a3MsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbmZvLmRp Z2VzdCwKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVycm9y cywKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZmb3JtYXQh KCJjYW4ndCB2ZXJpZnkgY2h1bmssIGxvYWQgZmFpbGVkIC0KPj4ge2Vycn0iKSwKPj4gwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCApLAo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIE9rKGNodW5rKSA9PiB7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBsZXQgc2l6ZSA9IGluZm8uc2l6ZSgpOwo+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKnJlYWRfYnl0ZXMgKz0gY2h1bmsucmF3X3NpemUo KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlYWRfYnl0ZXMu ZmV0Y2hfYWRkKGNodW5rLnJhd19zaXplKCksCj4+IE9yZGVyaW5nOjpTZXFDc3QpOwo+PiDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZGVjb2Rlcl9wb29sLnNlbmQo KGNodW5rLCBpbmZvLmRpZ2VzdCwgc2l6ZSkpPzsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgICpkZWNvZGVkX2J5dGVzICs9IHNpemU7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkZWNvZGVkX2J5dGVzLmZldGNoX2FkZChzaXplLCBP cmRlcmluZzo6U2VxQ3N0KTsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9 Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0sCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIERhdGFzdG9yZUJhY2tlbmQ6OlMzKHMzX2NsaWVudCkgPT4gewo+PiBAQCAtMzAyLDkg KzMyNCw5IEBAIGltcGwgVmVyaWZ5V29ya2VyIHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWF0Y2ggY2h1bmtfcmVzdWx0IHsKPj4gwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBPayhj aHVuaykgPT4gewo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IHNpemUgPSBpbmZvLnNpemUoKTsKPj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ICpyZWFkX2J5dGVzICs9IGNodW5rLnJhd19zaXplKCk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoAo+PiByZWFkX2J5dGVz LmZldGNoX2FkZChjaHVuay5yYXdfc2l6ZSgpLCBPcmRlcmluZzo6U2VxQ3N0KTsKPj4gwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGRlY29kZXJfcG9vbC5zZW5kKChjaHVuaywKPj4gaW5mby5kaWdlc3QsIHNpemUpKT87Cj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAqZGVjb2RlZF9ieXRlcyArPSBzaXplOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZGVjb2RlZF9ieXRlcy5m ZXRjaF9hZGQoc2l6ZSwKPj4gT3JkZXJpbmc6OlNlcUNzdCk7Cj4+IMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEVycihlcnIp ID0+IHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGVycm9ycy5mZXRjaF9hZGQoMSwKPj4gT3JkZXJpbmc6OlNlcUNz dCk7Cj4+IEBAIC0zMTIsNyArMzM0LDkgQEAgaW1wbCBWZXJpZnlXb3JrZXIgewo+PiDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgT2soTm9uZSkgPT4gc2VsZi5hZGRfY29ycnVw dF9jaHVuaygKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE9rKE5v bmUpID0+IFNlbGY6OmFkZF9jb3JydXB0X2NodW5rKAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkYXRhc3RvcmUsCj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvcnJ1cHRfY2h1bmtzLAo+PiDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbmZvLmRpZ2VzdCwK Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXJy b3JzLAo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAmZm9ybWF0ISgKPj4gQEAgLTMzMCwxMyArMzU0LDE5IEBAIGltcGwgVmVyaWZ5V29ya2VyIHsK Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIE9rKCgpKQo+PiDCoMKgwqDCoMKgIH0KPj4gwqAgLcKgwqDC oCBmbiBhZGRfY29ycnVwdF9jaHVuaygmc2VsZiwgZGlnZXN0OiBbdTg7IDMyXSwgZXJyb3JzOgo+ PiBBcmM8QXRvbWljVXNpemU+LCBtZXNzYWdlOiAmc3RyKSB7Cj4+ICvCoMKgwqAgZm4gYWRkX2Nv cnJ1cHRfY2h1bmsoCj4+ICvCoMKgwqDCoMKgwqDCoCBkYXRhc3RvcmU6IEFyYzxEYXRhU3RvcmU+ LAo+PiArwqDCoMKgwqDCoMKgwqAgY29ycnVwdF9jaHVua3M6IEFyYzxNdXRleDxIYXNoU2V0PFt1 ODsgMzJdPj4+LAo+PiArwqDCoMKgwqDCoMKgwqAgZGlnZXN0OiBbdTg7IDMyXSwKPj4gK8KgwqDC oMKgwqDCoMKgIGVycm9yczogQXJjPEF0b21pY1VzaXplPiwKPj4gK8KgwqDCoMKgwqDCoMKgIG1l c3NhZ2U6ICZzdHIsCj4+ICvCoMKgwqAgKSB7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCAvLyBQYW5p YyBvbiBwb2lzb25lZCBtdXRleAo+PiAtwqDCoMKgwqDCoMKgwqAgbGV0IG11dCBjb3JydXB0X2No dW5rcyA9IHNlbGYuY29ycnVwdF9jaHVua3MubG9jaygpLnVud3JhcCgpOwo+PiArwqDCoMKgwqDC oMKgwqAgbGV0IG11dCBjb3JydXB0X2NodW5rcyA9IGNvcnJ1cHRfY2h1bmtzLmxvY2soKS51bndy YXAoKTsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGNvcnJ1cHRfY2h1bmtzLmluc2VydChkaWdlc3Qp Owo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgZXJyb3IhKG1lc3NhZ2UpOwo+PiDCoMKgwqDCoMKgwqDC oMKgwqAgZXJyb3JzLmZldGNoX2FkZCgxLCBPcmRlcmluZzo6U2VxQ3N0KTsKPj4gLcKgwqDCoMKg wqDCoMKgIFNlbGY6OnJlbmFtZV9jb3JydXB0ZWRfY2h1bmsoc2VsZi5kYXRhc3RvcmUuY2xvbmUo KSwgJmRpZ2VzdCk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBTZWxmOjpyZW5hbWVfY29ycnVwdGVkX2No dW5rKGRhdGFzdG9yZS5jbG9uZSgpLCAmZGlnZXN0KTsKPj4gwqDCoMKgwqDCoCB9Cj4+IMKgIMKg wqDCoMKgwqAgZm4gdmVyaWZ5X2ZpeGVkX2luZGV4KCZzZWxmLCBiYWNrdXBfZGlyOiAmQmFja3Vw RGlyLCBpbmZvOgo+PiAmRmlsZUluZm8pIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKPiAKPiAKPiBk aWZmIC0tZ2l0IGEvc3JjL2JhY2t1cC92ZXJpZnkucnMgYi9zcmMvYmFja3VwL3ZlcmlmeS5ycwo+ IGluZGV4IDdmOTFmMzhjOS4uZTAxNDA1NzUwIDEwMDY0NAo+IC0tLSBhL3NyYy9iYWNrdXAvdmVy aWZ5LnJzCj4gKysrIGIvc3JjL2JhY2t1cC92ZXJpZnkucnMKPiBAQCAtMTUyLDI0ICsxNTIsMjQg QEAgaW1wbCBWZXJpZnlXb3JrZXIgewo+IMKgwqDCoMKgwqDCoMKgwqAgaW5kZXg6IEJveDxkeW4g SW5kZXhGaWxlICsgU2VuZD4sCj4gwqDCoMKgwqDCoMKgwqDCoCBjcnlwdF9tb2RlOiBDcnlwdE1v ZGUsCj4gwqDCoMKgwqAgKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7Cj4gLcKgwqDCoMKgwqDCoMKg IGxldCBlcnJvcnMgPSBBcmM6Om5ldyhBdG9taWNVc2l6ZTo6bmV3KDApKTsKPiAtCj4gLcKgwqDC oMKgwqDCoMKgIGxldCBzdGFydF90aW1lID0gSW5zdGFudDo6bm93KCk7Cj4gLQo+IC3CoMKgwqDC oMKgwqDCoCBsZXQgcmVhZF9ieXRlcyA9IEFyYzo6bmV3KEF0b21pY1U2NDo6bmV3KDApKTsKPiAt wqDCoMKgwqDCoMKgwqAgbGV0IGRlY29kZWRfYnl0ZXMgPSBBcmM6Om5ldyhBdG9taWNVNjQ6Om5l dygwKSk7Cj4gK8KgwqDCoMKgwqDCoMKgIGxldCBpbmRleF92ZXJpZnlfc3RhdGUgPSBBcmM6Om5l dyhJbmRleFZlcmlmeVN0YXRlIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZWFkX2J5dGVz OiBBdG9taWNVNjQ6Om5ldygwKSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkZWNvZGVkX2J5 dGVzOiBBdG9taWNVNjQ6Om5ldygwKSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnJvcnM6 IEF0b21pY1VzaXplOjpuZXcoMCksCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZGF0YXN0b3Jl OiBBcmM6OmNsb25lKCZzZWxmLmRhdGFzdG9yZSksCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Y29ycnVwdF9jaHVua3M6IEFyYzo6Y2xvbmUoJnNlbGYuY29ycnVwdF9jaHVua3MpLAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHN0YXJ0X3RpbWU6IEluc3RhbnQ6Om5vdygpLAo+ICvCoMKgwqDC oMKgwqDCoCB9KTsKPiAKPiDCoMKgwqDCoMKgwqDCoMKgIGxldCBkZWNvZGVyX3Bvb2wgPSBQYXJh bGxlbEhhbmRsZXI6Om5ldygidmVyaWZ5IGNodW5rCj4gZGVjb2RlciIsIDQsIHsKPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBsZXQgZGF0YXN0b3JlID0gQXJjOjpjbG9uZSgmc2VsZi5kYXRhc3Rv cmUpOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxldCBjb3JydXB0X2NodW5rcyA9IEFyYzo6 Y2xvbmUoJnNlbGYuY29ycnVwdF9jaHVua3MpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxl dCBzdGF0ZSA9IEFyYzo6Y2xvbmUoJmluZGV4X3ZlcmlmeV9zdGF0ZSk7Cj4gwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGxldCB2ZXJpZmllZF9jaHVua3MgPSBBcmM6OmNsb25lKCZzZWxmLnZlcmlm aWVkX2NodW5rcyk7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IGVycm9ycyA9IEFyYzo6 Y2xvbmUoJmVycm9ycyk7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1vdmUgfChjaHVuaywg ZGlnZXN0LCBzaXplKTogKERhdGFCbG9iLCBbdTg7IDMyXSwgdTY0KXwgewo+IMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxldCBjaHVua19jcnlwdF9tb2RlID0gbWF0Y2ggY2h1bmsu Y3J5cHRfbW9kZSgpIHsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IEVycihlcnIpID0+IHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBjb3JydXB0X2NodW5rcy5sb2NrKCkudW53cmFwKCkuaW5zZXJ0KGRpZ2VzdCk7Cj4g KyBzdGF0ZS5jb3JydXB0X2NodW5rcy5sb2NrKCkudW53cmFwKCkuaW5zZXJ0KGRpZ2VzdCk7Cj4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGluZm8hKCJj YW4ndCB2ZXJpZnkgY2h1bmssIHVua25vd24gQ3J5cHRNb2RlCj4gLSB7ZXJyfSIpOwo+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVycm9ycy5mZXRjaF9h ZGQoMSwgT3JkZXJpbmc6OlNlcUNzdCk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgc3RhdGUuZXJyb3JzLmZldGNoX2FkZCgxLCBPcmRlcmluZzo6U2Vx Q3N0KTsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cmV0dXJuIE9rKCgpKTsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IH0KPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE9rKG1vZGUpID0+ IG1vZGUsCj4gQEAgLTE3OSwxNCArMTc5LDE0IEBAIGltcGwgVmVyaWZ5V29ya2VyIHsKPiDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGluZm8hKAo+IMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImNodW5rIENyeXB0TW9kZSB7Y2h1bmtfY3J5 cHRfbW9kZTo/fSBkb2VzIG5vdAo+IG1hdGNoIGluZGV4IENyeXB0TW9kZSB7Y3J5cHRfbW9kZTo/ fSIKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCApOwo+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnJvcnMuZmV0Y2hfYWRkKDEsIE9yZGVyaW5nOjpT ZXFDc3QpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdGF0ZS5l cnJvcnMuZmV0Y2hfYWRkKDEsIE9yZGVyaW5nOjpTZXFDc3QpOwo+IMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIH0KPiAKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBp ZiBsZXQgRXJyKGVycikgPSBjaHVuay52ZXJpZnlfdW5lbmNyeXB0ZWQoc2l6ZSBhcwo+IHVzaXpl LCAmZGlnZXN0KSB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNv cnJ1cHRfY2h1bmtzLmxvY2soKS51bndyYXAoKS5pbnNlcnQoZGlnZXN0KTsKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RhdGUuY29ycnVwdF9jaHVua3MubG9jaygp LnVud3JhcCgpLmluc2VydChkaWdlc3QpOwo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgaW5mbyEoIntlcnJ9Iik7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGVycm9ycy5mZXRjaF9hZGQoMSwgT3JkZXJpbmc6OlNlcUNzdCk7Cj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFNlbGY6OnJlbmFtZV9jb3JydXB0 ZWRfY2h1bmsoZGF0YXN0b3JlLmNsb25lKCksCj4gJmRpZ2VzdCk7Cj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0YXRlLmVycm9ycy5mZXRjaF9hZGQoMSwgT3JkZXJp bmc6OlNlcUNzdCk7Cj4gKyBTZWxmOjpyZW5hbWVfY29ycnVwdGVkX2NodW5rKHN0YXRlLmRhdGFz dG9yZS5jbG9uZSgpLCAmZGlnZXN0KTsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB9IGVsc2Ugewo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdmVy aWZpZWRfY2h1bmtzLmxvY2soKS51bndyYXAoKS5pbnNlcnQoZGlnZXN0KTsKPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gQEAgLTIwMSw3ICsyMDEsNyBAQCBpbXBsIFZlcmlm eVdvcmtlciB7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0gZWxzZSBpZgo+IHNlbGYuY29y cnVwdF9jaHVua3MubG9jaygpLnVud3JhcCgpLmNvbnRhaW5zKGRpZ2VzdCkgewo+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxldCBkaWdlc3Rfc3RyID0gaGV4OjplbmNvZGUoZGln ZXN0KTsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbmZvISgiY2h1bmsge2Rp Z2VzdF9zdHJ9IHdhcyBtYXJrZWQgYXMgY29ycnVwdCIpOwo+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgZXJyb3JzLmZldGNoX2FkZCgxLCBPcmRlcmluZzo6U2VxQ3N0KTsKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGluZGV4X3ZlcmlmeV9zdGF0ZS5lcnJvcnMuZmV0 Y2hfYWRkKDEsCj4gT3JkZXJpbmc6OlNlcUNzdCk7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgdHJ1ZQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9IGVsc2Ugewo+IMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZhbHNlCj4gQEAgLTIyMiwyNCArMjIyLDExIEBA IGltcGwgVmVyaWZ5V29ya2VyIHsKPiAKPiDCoMKgwqDCoMKgwqDCoMKgIGxldCByZWFkZXJfcG9v bCA9IFBhcmFsbGVsSGFuZGxlcjo6bmV3KCJyZWFkIGNodW5rcyIsIDQsIHsKPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgbGV0IGRlY29kZXJfcG9vbCA9IGRlY29kZXJfcG9vbC5jaGFubmVsKCk7 Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IGRhdGFzdG9yZSA9IEFyYzo6Y2xvbmUoJnNl bGYuZGF0YXN0b3JlKTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQgY29ycnVwdF9jaHVu a3MgPSBBcmM6OmNsb25lKCZzZWxmLmNvcnJ1cHRfY2h1bmtzKTsKPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBsZXQgcmVhZF9ieXRlcyA9IEFyYzo6Y2xvbmUoJnJlYWRfYnl0ZXMpOwo+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGxldCBkZWNvZGVkX2J5dGVzID0gQXJjOjpjbG9uZSgmZGVjb2Rl ZF9ieXRlcyk7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IGVycm9ycyA9IEFyYzo6Y2xv bmUoJmVycm9ycyk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0IHN0YXRlID0gQXJjOjpj bG9uZSgmaW5kZXhfdmVyaWZ5X3N0YXRlKTsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0 IGJhY2tlbmQgPSBzZWxmLmJhY2tlbmQuY2xvbmUoKTsKPiAKPiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgbW92ZSB8aW5mbzogQ2h1bmtSZWFkSW5mb3wgewo+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgU2VsZjo6dmVyaWZ5X2NodW5rX2J5X2JhY2tlbmQoCj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZiYWNrZW5kLAo+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBBcmM6OmNsb25lKCZkYXRhc3RvcmUpLAo+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBBcmM6OmNsb25lKCZjb3JydXB0X2NodW5r cyksCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEFyYzo6Y2xvbmUo JnJlYWRfYnl0ZXMpLAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBB cmM6OmNsb25lKCZkZWNvZGVkX2J5dGVzKSwKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgQXJjOjpjbG9uZSgmZXJyb3JzKSwKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgJmRlY29kZXJfcG9vbCwKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgJmluZm8sCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCApCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBTZWxmOjp2ZXJpZnlfY2h1bmtf YnlfYmFja2VuZCgmYmFja2VuZCwKPiBBcmM6OmNsb25lKCZzdGF0ZSksICZkZWNvZGVyX3Bvb2ws ICZpbmZvKQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gwqDCoMKgwqDCoMKgwqDCoCB9 KTsKPiAKPiBAQCAtMjU5LDEwICsyNDYsMTAgQEAgaW1wbCBWZXJpZnlXb3JrZXIgewo+IAo+IMKg wqDCoMKgwqDCoMKgwqAgcmVhZGVyX3Bvb2wuY29tcGxldGUoKT87Cj4gCj4gLcKgwqDCoMKgwqDC oMKgIGxldCBlbGFwc2VkID0gc3RhcnRfdGltZS5lbGFwc2VkKCkuYXNfc2Vjc19mNjQoKTsKPiAr wqDCoMKgwqDCoMKgwqAgbGV0IGVsYXBzZWQgPQo+IGluZGV4X3ZlcmlmeV9zdGF0ZS5zdGFydF90 aW1lLmVsYXBzZWQoKS5hc19zZWNzX2Y2NCgpOwo+IAo+IC3CoMKgwqDCoMKgwqDCoCBsZXQgcmVh ZF9ieXRlcyA9IHJlYWRfYnl0ZXMubG9hZChPcmRlcmluZzo6U2VxQ3N0KTsKPiAtwqDCoMKgwqDC oMKgwqAgbGV0IGRlY29kZWRfYnl0ZXMgPSBkZWNvZGVkX2J5dGVzLmxvYWQoT3JkZXJpbmc6OlNl cUNzdCk7Cj4gK8KgwqDCoMKgwqDCoMKgIGxldCByZWFkX2J5dGVzID0KPiBpbmRleF92ZXJpZnlf c3RhdGUucmVhZF9ieXRlcy5sb2FkKE9yZGVyaW5nOjpTZXFDc3QpOwo+ICvCoMKgwqDCoMKgwqDC oCBsZXQgZGVjb2RlZF9ieXRlcyA9Cj4gaW5kZXhfdmVyaWZ5X3N0YXRlLmRlY29kZWRfYnl0ZXMu bG9hZChPcmRlcmluZzo6U2VxQ3N0KTsKPiAKPiDCoMKgwqDCoMKgwqDCoMKgIGxldCByZWFkX2J5 dGVzX21pYiA9IChyZWFkX2J5dGVzIGFzIGY2NCkgLyAoMTAyNC4wICogMTAyNC4wKTsKPiDCoMKg wqDCoMKgwqDCoMKgIGxldCBkZWNvZGVkX2J5dGVzX21pYiA9IChkZWNvZGVkX2J5dGVzIGFzIGY2 NCkgLyAoMTAyNC4wICoKPiAxMDI0LjApOwo+IEBAIC0yNzAsMTMgKzI1NywxMyBAQCBpbXBsIFZl cmlmeVdvcmtlciB7Cj4gwqDCoMKgwqDCoMKgwqDCoCBsZXQgcmVhZF9zcGVlZCA9IHJlYWRfYnl0 ZXNfbWliIC8gZWxhcHNlZDsKPiDCoMKgwqDCoMKgwqDCoMKgIGxldCBkZWNvZGVfc3BlZWQgPSBk ZWNvZGVkX2J5dGVzX21pYiAvIGVsYXBzZWQ7Cj4gCj4gLcKgwqDCoMKgwqDCoMKgIGxldCBlcnJv cl9jb3VudCA9IGVycm9ycy5sb2FkKE9yZGVyaW5nOjpTZXFDc3QpOwo+ICvCoMKgwqDCoMKgwqDC oCBsZXQgZXJyb3JfY291bnQgPQo+IGluZGV4X3ZlcmlmeV9zdGF0ZS5lcnJvcnMubG9hZChPcmRl cmluZzo6U2VxQ3N0KTsKPiAKPiDCoMKgwqDCoMKgwqDCoMKgIGluZm8hKAo+IMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAiwqAgdmVyaWZpZWQge3JlYWRfYnl0ZXNfbWliOi4yfS97ZGVjb2RlZF9i eXRlc19taWI6LjJ9Cj4gTWlCIGluIHtlbGFwc2VkOi4yfSBzZWNvbmRzLCBzcGVlZCB7cmVhZF9z cGVlZDouMn0ve2RlY29kZV9zcGVlZDouMn0KPiBNaUIvcyAoe2Vycm9yX2NvdW50fSBlcnJvcnMp Igo+IMKgwqDCoMKgwqDCoMKgwqAgKTsKPiAKPiAtwqDCoMKgwqDCoMKgwqAgaWYgZXJyb3JzLmxv YWQoT3JkZXJpbmc6OlNlcUNzdCkgPiAwIHsKPiArwqDCoMKgwqDCoMKgwqAgaWYgaW5kZXhfdmVy aWZ5X3N0YXRlLmVycm9ycy5sb2FkKE9yZGVyaW5nOjpTZXFDc3QpID4gMCB7Cj4gwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGJhaWwhKCJjaHVua3MgY291bGQgbm90IGJlIHZlcmlmaWVkIik7Cj4g wqDCoMKgwqDCoMKgwqDCoCB9Cj4gCj4gQEAgLTI4NiwyOCArMjczLDI2IEBAIGltcGwgVmVyaWZ5 V29ya2VyIHsKPiDCoMKgwqDCoCAjW2FsbG93KGNsaXBweTo6dG9vX21hbnlfYXJndW1lbnRzKV0K PiDCoMKgwqDCoCBmbiB2ZXJpZnlfY2h1bmtfYnlfYmFja2VuZCgKPiDCoMKgwqDCoMKgwqDCoMKg IGJhY2tlbmQ6ICZEYXRhc3RvcmVCYWNrZW5kLAo+IC3CoMKgwqDCoMKgwqDCoCBkYXRhc3RvcmU6 IEFyYzxEYXRhU3RvcmU+LAo+IC3CoMKgwqDCoMKgwqDCoCBjb3JydXB0X2NodW5rczogQXJjPE11 dGV4PEhhc2hTZXQ8W3U4OyAzMl0+Pj4sCj4gLcKgwqDCoMKgwqDCoMKgIHJlYWRfYnl0ZXM6IEFy YzxBdG9taWNVNjQ+LAo+IC3CoMKgwqDCoMKgwqDCoCBkZWNvZGVkX2J5dGVzOiBBcmM8QXRvbWlj VTY0PiwKPiAtwqDCoMKgwqDCoMKgwqAgZXJyb3JzOiBBcmM8QXRvbWljVXNpemU+LAo+ICvCoMKg wqDCoMKgwqDCoCBzdGF0ZTogQXJjPEluZGV4VmVyaWZ5U3RhdGU+LAo+IMKgwqDCoMKgwqDCoMKg wqAgZGVjb2Rlcl9wb29sOiAmU2VuZEhhbmRsZTwoRGF0YUJsb2IsIFt1ODsgMzJdLCB1NjQpPiwK PiDCoMKgwqDCoMKgwqDCoMKgIGluZm86ICZDaHVua1JlYWRJbmZvLAo+IMKgwqDCoMKgICkgLT4g UmVzdWx0PCgpLCBFcnJvcj4gewo+IMKgwqDCoMKgwqDCoMKgwqAgbWF0Y2ggYmFja2VuZCB7Cj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRGF0YXN0b3JlQmFja2VuZDo6RmlsZXN5c3RlbSA9PiBt YXRjaAo+IGRhdGFzdG9yZS5sb2FkX2NodW5rKCZpbmZvLmRpZ2VzdCkgewo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIERhdGFzdG9yZUJhY2tlbmQ6OkZpbGVzeXN0ZW0gPT4gbWF0Y2gKPiBzdGF0 ZS5kYXRhc3RvcmUubG9hZF9jaHVuaygmaW5mby5kaWdlc3QpIHsKPiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBFcnIoZXJyKSA9PiBTZWxmOjphZGRfY29ycnVwdF9jaHVuaygKPiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZGF0YXN0b3JlLAo+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb3JydXB0X2NodW5rcywKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQXJjOjpjbG9uZSgmc3RhdGUuZGF0 YXN0b3JlKSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQXJjOjpj bG9uZSgmc3RhdGUuY29ycnVwdF9jaHVua3MpLAo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgaW5mby5kaWdlc3QsCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGVycm9ycywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgJnN0YXRlLmVycm9ycywKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICZmb3JtYXQhKCJjYW4ndCB2ZXJpZnkgY2h1bmssIGxvYWQgZmFpbGVkIC0ge2Vycn0i KSwKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCApLAo+IMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIE9rKGNodW5rKSA9PiB7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBsZXQgc2l6ZSA9IGluZm8uc2l6ZSgpOwo+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZWFkX2J5dGVzLmZldGNoX2FkZChjaHVuay5y YXdfc2l6ZSgpLAo+IE9yZGVyaW5nOjpTZXFDc3QpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBzdGF0ZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIC5yZWFkX2J5dGVzCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgLmZldGNoX2FkZChjaHVuay5yYXdfc2l6ZSgpLCBPcmRlcmlu Zzo6U2VxQ3N0KTsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRl Y29kZXJfcG9vbC5zZW5kKChjaHVuaywgaW5mby5kaWdlc3QsIHNpemUpKT87Cj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRlY29kZWRfYnl0ZXMuZmV0Y2hfYWRkKHNp emUsIE9yZGVyaW5nOjpTZXFDc3QpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBzdGF0ZS5kZWNvZGVkX2J5dGVzLmZldGNoX2FkZChzaXplLAo+IE9yZGVyaW5nOjpT ZXFDc3QpOwo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgfSwKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRGF0YXN0b3JlQmFj a2VuZDo6UzMoczNfY2xpZW50KSA9PiB7Cj4gQEAgLTMyNCwyOCArMzA5LDMwIEBAIGltcGwgVmVy aWZ5V29ya2VyIHsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgbWF0Y2ggY2h1bmtfcmVzdWx0IHsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBPayhjaHVuaykgPT4gewo+IMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV0 IHNpemUgPSBpbmZvLnNpemUoKTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAKPiByZWFkX2J5dGVzLmZldGNoX2FkZChjaHVu ay5yYXdfc2l6ZSgpLCBPcmRlcmluZzo6U2VxQ3N0KTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RhdGUKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAucmVhZF9ieXRlcwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5mZXRjaF9hZGQoY2h1bmsucmF3 X3NpemUoKSwKPiBPcmRlcmluZzo6U2VxQ3N0KTsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRlY29kZXJfcG9vbC5zZW5k KChjaHVuaywKPiBpbmZvLmRpZ2VzdCwgc2l6ZSkpPzsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZGVjb2RlZF9ieXRlcy5m ZXRjaF9hZGQoc2l6ZSwKPiBPcmRlcmluZzo6U2VxQ3N0KTsKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RhdGUuZGVjb2Rl ZF9ieXRlcy5mZXRjaF9hZGQoc2l6ZSwKPiBPcmRlcmluZzo6U2VxQ3N0KTsKPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRXJyKGVy cikgPT4gewo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBlcnJvcnMuZmV0Y2hfYWRkKDEsIE9yZGVyaW5nOjpTZXFDc3QpOwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBzdGF0ZS5lcnJvcnMuZmV0Y2hfYWRkKDEsCj4gT3JkZXJpbmc6OlNlcUNzdCk7Cj4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBlcnJvciEoImNhbid0IHZlcmlmeSBjaHVuaywgbG9hZAo+IGZhaWxlZCAtIHtlcnJ9 Iik7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB9Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBPayhOb25lKSA9PiBTZWxmOjphZGRf Y29ycnVwdF9jaHVuaygKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBkYXRhc3RvcmUsCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgY29ycnVwdF9jaHVua3MsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgQXJjOjpjbG9uZSgmc3RhdGUuZGF0YXN0b3JlKSwKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBBcmM6OmNsb25lKCZz dGF0ZS5jb3JydXB0X2NodW5rcyksCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGluZm8uZGlnZXN0LAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVycm9ycywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmc3RhdGUuZXJyb3JzLAo+IMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmZm9ybWF0ISgKPiDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAiY2FuJ3QgdmVyaWZ5 IG1pc3NpbmcgY2h1bmsgd2l0aCBkaWdlc3Qge30iLAo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGhleDo6ZW5jb2RlKGluZm8uZGlnZXN0 KQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCApLAo+ IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKSwKPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEVycihlcnIpID0+IHsKPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnJvcnMuZmV0Y2hfYWRkKDEs IE9yZGVyaW5nOjpTZXFDc3QpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHN0YXRlLmVycm9ycy5mZXRjaF9hZGQoMSwgT3JkZXJpbmc6OlNlcUNzdCk7 Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVycm9y ISgiY2FuJ3QgdmVyaWZ5IGNodW5rLCBsb2FkIGZhaWxlZCAtCj4ge2Vycn0iKTsKPiDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB9Cj4gQEAgLTM1OCw3ICszNDUsNyBAQCBpbXBsIFZlcmlmeVdvcmtlciB7 Cj4gwqDCoMKgwqDCoMKgwqDCoCBkYXRhc3RvcmU6IEFyYzxEYXRhU3RvcmU+LAo+IMKgwqDCoMKg wqDCoMKgwqAgY29ycnVwdF9jaHVua3M6IEFyYzxNdXRleDxIYXNoU2V0PFt1ODsgMzJdPj4+LAo+ IMKgwqDCoMKgwqDCoMKgwqAgZGlnZXN0OiBbdTg7IDMyXSwKPiAtwqDCoMKgwqDCoMKgwqAgZXJy b3JzOiBBcmM8QXRvbWljVXNpemU+LAo+ICvCoMKgwqDCoMKgwqDCoCBlcnJvcnM6ICZBdG9taWNV c2l6ZSwKPiDCoMKgwqDCoMKgwqDCoMKgIG1lc3NhZ2U6ICZzdHIsCj4gwqDCoMKgwqAgKSB7Cj4g wqDCoMKgwqDCoMKgwqDCoCAvLyBQYW5pYyBvbiBwb2lzb25lZCBtdXRleAo+IEBAIC02ODEsMyAr NjY4LDEyIEBAIGltcGwgVmVyaWZ5V29ya2VyIHsKPiDCoMKgwqDCoMKgwqDCoMKgIH0KPiDCoMKg wqDCoCB9Cj4gwqB9Cj4gKwo+ICtzdHJ1Y3QgSW5kZXhWZXJpZnlTdGF0ZSB7Cj4gK8KgwqDCoCBy ZWFkX2J5dGVzOiBBdG9taWNVNjQsCj4gK8KgwqDCoCBkZWNvZGVkX2J5dGVzOiBBdG9taWNVNjQs Cj4gK8KgwqDCoCBlcnJvcnM6IEF0b21pY1VzaXplLAo+ICvCoMKgwqAgZGF0YXN0b3JlOiBBcmM8 RGF0YVN0b3JlPiwKPiArwqDCoMKgIGNvcnJ1cHRfY2h1bmtzOiBBcmM8TXV0ZXg8SGFzaFNldDxb dTg7IDMyXT4+PiwKPiArwqDCoMKgIHN0YXJ0X3RpbWU6IEluc3RhbnQsCj4gK30KPiAKCgoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KcGJzLWRldmVsIG1h aWxpbmcgbGlzdApwYnMtZGV2ZWxAbGlzdHMucHJveG1veC5jb20KaHR0cHM6Ly9saXN0cy5wcm94 bW94LmNvbS9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vcGJzLWRldmVsCg==