From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 36DAD1FF16E for ; Mon, 3 Feb 2025 15:21:33 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 4E6BA18B8; Mon, 3 Feb 2025 15:21:31 +0100 (CET) Mime-Version: 1.0 Date: Mon, 03 Feb 2025 15:21:23 +0100 Message-Id: To: "Fiona Ebner" , "Proxmox VE development discussion" From: "Max Carrara" X-Mailer: aerc 0.18.2-0-ge037c095a049 References: <20250109144818.430185-1-m.carrara@proxmox.com> <20250109144818.430185-2-m.carrara@proxmox.com> In-Reply-To: X-SPAM-LEVEL: Spam detection results: 0 AWL -2.438 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 KAM_SOMETLD_ARE_BAD_TLD 5 .bar, .beauty, .buzz, .cam, .casa, .cfd, .club, .date, .guru, .link, .live, .monster, .online, .press, .pw, .quest, .rest, .sbs, .shop, .stream, .top, .trade, .wiki, .work, .xyz TLD abuse 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: [pve-devel] [PATCH v3 pve-common 01/12] introduce PVE::Path X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" T24gRnJpIEphbiAzMSwgMjAyNSBhdCAxOjIzIFBNIENFVCwgRmlvbmEgRWJuZXIgd3JvdGU6Cj4g QW0gMDkuMDEuMjUgdW0gMTU6NDggc2NocmllYiBNYXggQ2FycmFyYToKPiA+ICs9aGVhZDMgcGF0 aF9qb2luKEBwYXRocykKPiA+ICsKPiA+ICtKb2lucyBtdWx0aXBsZSBwYXRocyB0b2dldGhlci4g QWxsIGtpbmRzIG9mIHBhdGhzIGFyZSBzdXBwb3J0ZWQuCj4gPiArCj4gPiArRG9lcyBub3QgcGVy Zm9ybSBhbnkgQzxMPDwgbm9ybWFsaXphdGlvbnwvInBhdGhfbm9ybWFsaXplKCRwYXRoKSIgPj4+ Lgo+ID4gKwo+ID4gKyAgICBteSAkam9pbmVkID0gcGF0aF9qb2luKCJmb28iLCAiYmFyL2JheiIs ICJxdXgudHh0Iik7Cj4gPiArICAgICMgZm9vL2Jhci9iYXovcXV4LnR4dAo+ID4gKwo+ID4gKyAg ICBteSAkam9pbmVkID0gcGF0aF9qb2luKCIvIiwgImV0Yy9wdmUvIiwgInN0b3JhZ2UuY2ZnIik7 Cj4gPiArICAgICMgL2V0Yy9wdmUvc3RvcmFnZS5jZmcKPiA+ICsKPiA+ICtTaW1pbGFyIHRvIEM8 TDw8IHBhdGhfcHVzaCgpfC8icGF0aF9wdXNoKCRwYXRoLCAkb3RoZXIpIj4+Piwgc2hvdWxkIGFu eSBvZiB0aGUKPiA+ICtDPEBwYXRocz4gYmUgYW4gYWJzb2x1dGUgcGF0aCwgaXQgSTxyZXBsYWNl cz4gYWxsIHByZWNlZGluZyBwYXRocy4KPgo+IFNlZW1zIGxpa2UgdGhlIGRvY3MgYXJlIHNvbWVo b3cgYnJva2VuIGhlcmUsIGxvb2tpbmcgYXQgaXQgd2l0aCBwZXJsZG9jLAo+IGl0IGp1c3Qgc3Rh dGVzICdTaW1pbGFyIHRvICJwYXRoX3B1c2goKSInIGFuZCB0aGUgcmVzdCBvZiB0aGUgc2VudGVu Y2UKPiBpcyBtaXNzaW5nLgoKTXkgYmFkOyBtYWRlIGEgdHlwbyBpbiB0aGUgZG9jc3RyaW5nIGZv ciBwYXRoX2NvbXBvbmVudHMoKSAoanVzdCBhYm92ZQp0aGlzIGZ1bmN0aW9uKS4gVGhhbmtzIGZv ciBzcG90dGluZyB0aGlzIQoKPgo+IFdoeSB0aGlzIGtpbmQgb2YgYmVoYXZpb3Igd2l0aCBhYnNv bHV0ZSBwYXRocz8gU2VlbXMgc3VycHJpc2luZyB0byBtZS4KPiBXb3VsZG4ndCBmYWlsaW5nIHRo ZSBjYWxsIGJlIGJldHRlcj8KCkkgZGVjaWRlZCB0byBzdGljayB3aXRoIFJ1c3QncyBiZWhhdmlv dXIgW3BhdGhidWZdIGhlcmUgYW5kIGluIG1vc3QKb3RoZXIgcGxhY2VzLCBzaW1wbHkgaW4gb3Jk ZXIgdG8ga2VlcCB0aGUgYmVoYXZpb3VyIGNvbnNpc3RlbnQuCgpJJ20gbm90ICpyZWFsbHkqIGEg ZmFuIG9mIGl0IGVpdGhlciwgYnV0IEkgdGhpbmsgaXQncyBiZXR0ZXIgdGhhbgpmYWlsaW5nIHRo ZSBjYWxsIC0tIElNTyBoYXZpbmcgdG8gd3JhcCBwYXRoX2pvaW4gLyBwYXRoX3B1c2ggaW50byBh bgpldmFsLWJsb2NrIHdvdWxkIGJlIHF1aXRlIGF3a3dhcmQgZm9yIHdoYXQncyBhIHJhdGhlciAi c21hbGwiIG9wZXJhdGlvbgo6cwoKUGVyaGFwcyBJIHNob3VsZCBwcm92aWRlIHNvbWUgYWRkaXRp b25hbCBjb250ZXh0IGhlcmUgYXMgd2VsbCBzbyBhcyB0bwptYWtlIG15ICJkZXNpZ24gcGhpbG9z b3BoeSIgbW9yZSBjbGVhcjogVGhlIHJlYXNvbiB3aHkgSSBtb2RlbGVkClBWRTo6UGF0aCAobW9z dGx5KSBhZnRlciBSdXN0J3Mgc3RkOjpwYXRoOjp7UGF0aCwgUGF0aEJ1Zn0gaXMgYmVjYXVzZToK CiAgMS4gTW9zdCAobmV3ZXIpIGRldmVsb3BlcnMgd2lsbCBiZSBtdWNoIG1vcmUgbGlrZWx5IHRv IGJlIGZhbWlsaWFyCiAgICAgd2l0aCBSdXN0IGluc3RlYWQgb2YgUGVybCwgc28gaWYgdGhleSBz aG91bGQgc2VlIHRoaXMgbGlicmFyeSwKICAgICB0aGV5J2xsIGhhdmUgYSBtdWNoIGVhc2llciB0 aW1lIHVzaW5nIGl0IChvciBhdCBsZWFzdCB0aGF0J3Mgd2hhdAogICAgIEkgKmhvcGUqIHdvdWxk IGhhcHBlbikuIFNvcnQgb2YgYXMgaW46ICJPaCwgdGhpcyBpcyBqdXN0IGxpa2UgdGhlCiAgICAg cGF0aCBzdHVmZiBpbiBSdXN0LCBleGNlcHQgZm9yIGEgZmV3IFBlcmwtZXNxdWUgZXhjZXB0aW9u cyEiCgogIDIuIEkgd2FudGVkIHRoZSBsaWJyYXJ5IHRvIGJlIGVzc2VudGlhbGx5IGV4Y2VwdGlv bi1mcmVlLCBleGNlcHQgd2hlcmUKICAgICBvYnZpb3VzIGludmFyaWFudHMgYXJlbid0IHVwaGVs ZCBieSB0aGUgY2FsbGVyIChlLmcuIHBhc3NpbmcgdW5kZWYpLgogICAgIFVubGVzcyB5b3UgbWF0 Y2ggdGhlIGVycm9yIG1lc3NhZ2Ugd2l0aCBhIHJlZ2V4LCB0aGVyZSdzIG5vCiAgICAgc3RydWN0 dXJhbGx5IHR5cGVkIHdheSB0byBkaWZmZXIgYmV0d2VlbiBlcnJvcnMgaW4gUGVybCwgc28gSSdk CiAgICAgbGlrZSB0aGUgInR5cGVzIiBvZiBlcnJvcnMgdG8gYmUgbW9zdGx5IHRoZSBzYW1lIHdo ZXJldmVyIHBvc3NpYmxlLgoKICAzLiBJIGRpZG4ndCB3YW50IHRvIHJlaW52ZW50IHRoZSB3aGVl bCBhbmQgaW5zdGVhZCBzdGljayB0byB3aGF0IG90aGVyCiAgICAgcG9wdWxhciBsaWJyYXJpZXMg ZG8gYXMgbXVjaCBhcyBwb3NzaWJsZSwgd2hpbGUgYWxzbyBhdm9pZGluZyBhbnkKICAgICBhZGRp dGlvbmFsIGFic3RyYWN0aW9ucyAoZS5nLiBpbnRyb2R1Y2luZyBhbiBvYmplY3QgZm9yIHBhdGhz KS4KCldpdGggYWxsIHRoYXQgYmVpbmcgc2FpZCwgc2luY2UgdGhhdCBiZWhhdmlvdXIgaXMgc3Vy cHJpc2luZyB0byB5b3UsIEkKaGF2ZSBubyBxdWFycmVscyBjaGFuZ2luZyBpdCEgOlAgQWZ0ZXIg YWxsIEknZCBsaWtlIHRvIGhhdmUgc29tZXRoaW5nCnRoYXQgZG9lc24ndCBjYXVzZSBhbnkgZnJp Y3Rpb24gd2hlbiB1c2luZyBpdC4KCltwYXRoYnVmXTogaHR0cHM6Ly9kb2MucnVzdC1sYW5nLm9y Zy9zdGQvcGF0aC9zdHJ1Y3QuUGF0aEJ1Zi5odG1sI21ldGhvZC5wdXNoCgo+Cj4gPiArCj4gPiAr ICAgIG15ICRqb2luZWQgPSBwYXRoX2pvaW4oImZvby9iYXIiLCAiL2V0YyIsICJyZXNvbHYuY29u ZiIpOwo+ID4gKyAgICAjIC9ldGMvcmVzb2x2LmNvbmYKPiA+ICsKPiA+ICsgICAgbXkgJGpvaW5l ZCA9IHBhdGhfam9pbigiZm9vIiwgIi9ldGMvcmVzb2x2LmNvbmYiLCAiL2V0Yy9ob3N0cyIpOwo+ ID4gKyAgICAjIC9ldGMvaG9zdHMKPiA+ICsKPiA+ICtUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGFu eSBvZiB0aGUgcGFzc2VkIEM8QHBhdGhzPiBpcyBDPHVuZGVmPi4KPiA+ICsKPiA+ICs9Y3V0Cj4g PiArCj4gPiArc3ViIHBhdGhfam9pbiA6IHByb3RvdHlwZShAKSB7Cj4gPiArICAgIG15IChAcGF0 aHMpID0gQF87Cj4gPiArCj4gPiArICAgIGlmICghc2NhbGFyKEBwYXRocykpIHsKPiA+ICsJcmV0 dXJuICcnOwo+ID4gKyAgICB9Cj4gPiArCj4gPiArICAgIGNyb2FrICJvbmUgb2YgdGhlIHByb3Zp ZGVkIHBhdGhzIGlzIHVuZGVmIiBpZiBhbnkgeyAhZGVmaW5lZCgkXykgfSBAcGF0aHM7Cj4gPiAr Cj4KPiBJIHRoaW5rIHRoZSByZXN0IGNvdWxkIGJlIHdyaXR0ZW4gbW9yZSBlZmZpY2llbnRseSBs aWtlICh1bnRlc3RlZCk6Cj4KPiBteSAkcmVzdWx0aW5nX3BhdGggPSBzaGlmdCBAcGF0aHM7Cj4g Zm9yIG15ICRwYXRoIChAcGF0aHMpIHsKPiAgIGlmICgkcGF0aCA9fiBtI14vIykgewo+ICAgICAk cmVzdWx0aW5nX3BhdGggPSAkcGF0aDsKPiAgIH0gZWxzZSB7Cj4gICAgICRyZXN1bHRpbmdfcGF0 aCA9IHBhdGhfcHVzaCgkcmVzdWx0aW5nX3BhdGgsICRwYXRoKTsKPiAgIH0KPiB9CgpOb3RlIHRo YXQgSSdtIGRvaW5nIGEgcmV2ZXJzZSBpdGVyYXRpb24gYmVsb3c7IEkgdGhpbmsgZG9pbmcgaXQg ZWl0aGVyCndheSBzaG91bGQgYmUgZmluZSwgYmVjYXVzZSBJIGRvdWJ0IHdlJ2xsIGV2ZXIgbmVl ZCB0byBqb2luIHRoYXQgbWFueQpwYXRoIGNvbXBvbmVudHMgd2hlcmUgaXQncyBhY3R1YWxseSBn b2luZyB0byBtYWtlIGEgZGlmZmVyZW5jZSA7UAoKPgo+ID4gKyAgICAjIEZpbmQgdGhlIGxhc3Qg b2NjdXJyZW5jZSBvZiBhIHJvb3QgZGlyZWN0b3J5IGFuZCBzdGFydCBjb25qb2luaW5nIHRoZQo+ ID4gKyAgICAjIGNvbXBvbmVudHMgZnJvbSB0aGVyZSBvbndhcmRzCj4gPiArICAgIG15ICRpbmRl eCA9IHNjYWxhcihAcGF0aHMpIC0gMTsKPiA+ICsgICAgd2hpbGUgKCRpbmRleCA+IDApIHsKPiA+ ICsJbGFzdCBpZiAkcGF0aHNbJGluZGV4XSA9fiBtI14vIzsKPiA+ICsJJGluZGV4LS07Cj4gPiAr ICAgIH0KPiA+ICsKPiA+ICsgICAgQHBhdGhzID0gQHBhdGhzWyRpbmRleCAuLiAoc2NhbGFyKEBw YXRocykgLSAxKV07Cj4gPiArCj4gPiArICAgIG15ICRyZXN1bHRpbmdfcGF0aCA9IHNoaWZ0IEBw YXRoczsKPiA+ICsKPiA+ICsgICAgZm9yIG15ICRwYXRoIChAcGF0aHMpIHsKPiA+ICsJJHJlc3Vs dGluZ19wYXRoID0gcGF0aF9wdXNoKCRyZXN1bHRpbmdfcGF0aCwgJHBhdGgpOwo+ID4gKyAgICB9 Cj4gPiArCj4gPiArICAgIHJldHVybiAkcmVzdWx0aW5nX3BhdGg7Cj4gPiArfQo+ID4gKwo+ID4g Kz1oZWFkMyBwYXRoX25vcm1hbGl6ZSgkcGF0aCkKPiA+ICsKPiA+ICtXcmFwcGVyIGZvciBMPEM8 RmlsZTo6U3BlYy9jYW5vbnBhdGg+Pi4gUGVyZm9ybXMgYSBsb2dpY2FsIGNsZWFudXAgb2YgdGhl IGdpdmVuCj4gPiArQzwkcGF0aD4uCj4gPiArCj4gPiArVGhpcyByZW1vdmVzIHVubmVjZXNzYXJ5 IGNvbXBvbmVudHMgb2YgYSBwYXRoIHRoYXQgY2FuIGJlIHNhZmVseQo+ID4gK3JlbW92ZWQsIHN1 Y2ggYXMgQzwuPiwgdHJhaWxpbmcgQzwvPiBvciByZXBlYXRlZCBvY2N1cnJlbmNlcyBvZiBDPC8+ Lgo+ID4gKwo+ID4gK0ZvciBleGFtcGxlLCBDPGZvby8uL2Jhci9iYXovLj4gYW5kIEM8Zm9vLy8v L2Jhci8vYmF6Ly8+IHdpbGwgYm90aCBiZWNvbWUKPiA+ICtDPGZvby9iYXIvYmF6Pi4KPiA+ICsK PiA+ICtCPE5vdGU6PiBUaGlzIHdpbGwgSTxub3Q+IHJlbW92ZSBjb21wb25lbnRzIHJlZmVyZW5j aW5nIHRoZSBwYXJlbnQgZGlyZWN0b3J5LAo+ID4gK2kuZS4gQzwuLj4uIEZvciBleGFtcGxlLCBD PGZvby9iYXIvLi4vYmF6PiBhbmQgQzxmb28vYmFyL2Jhei8uLj4gd2lsbCB0aGVyZWZvcmUKPiA+ ICtyZW1haW4gYXMgdGhleSBhcmUuIEhvd2V2ZXIsIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIEM8 Lz4gaXMgQzwvPiwgc28KPiA+ICtDPC8uLi8uLi9mb28+IHdpbGwgYmUgbm9ybWFsaXplZCB0byBD PC9mb28+Lgo+ID4gKwo+ID4gK1Rocm93cyBhbiBleGNlcHRpb24gaWYgQzwkcGF0aD4gaXMgQzx1 bmRlZj4gb3IgdGhlIGNhbGwgdG8gQzxjYW5vbnBhdGg+IGZhaWxlZC4KPiA+ICsKPiA+ICs9Y3V0 Cj4gPiArCj4gPiArc3ViIHBhdGhfbm9ybWFsaXplIDogcHJvdG90eXBlKCQpIHsKPiA+ICsgICAg bXkgKCRwYXRoKSA9IEBfOwo+ID4gKwo+ID4gKyAgICBjcm9hayAiXCRwYXRoIGlzIHVuZGVmIiBp ZiAhZGVmaW5lZCgkcGF0aCk7Cj4gPiArCj4gPiArICAgIG15ICRjbGVhbmVkX3BhdGggPSBldmFs IHsKPiA+ICsJRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRwYXRoKTsKPiA+ICsgICAgfTsKPiA+ICsK Pgo+IFN0eWxlIG5pdDogYmxhbmsgbGluZXMgYmV0d2VlbiBldmFsIGFuZCB1c2luZyAkQCBhcmUg YmV0dGVyIGF2b2lkZWQKPiBJTUhPLiBJJ2QgYWxzbyBoYXZlIHRoZSBldmFsIGV4cHJlc3Npb24g YmUgYSBzaW5nbGUgbGluZSwgYnV0IG5vIHN0cm9uZwo+IGZlZWxpbmdzLgoKQ291bGQgeW91IHBl cmhhcHMgZWxhYm9yYXRlIHdoeSwgcGxlYXNlPwoKPgo+ID4gKyAgICBjcm9hayAiZmFpbGVkIHRv IGNsZWFuIHVwIHBhdGg6ICRAIiBpZiAkQDsKPiA+ICsKPiA+ICsgICAgcmV0dXJuICRjbGVhbmVk X3BhdGg7Cj4gPiArfQo+ID4gKwo+ID4gKz1oZWFkMyBwYXRoX3BhcmVudCgkcGF0aCkKPiA+ICsK PiA+ICtSZXR1cm5zIHRoZSBnaXZlbiBDPCRwYXRoPiB3aXRob3V0IGl0cyBmaW5hbCBjb21wb25l bnQsIGlmIHRoZXJlIGlzIG9uZS4KPiA+ICsKPiA+ICtUcmFpbGluZyBhbmQgcmVwZWF0ZWQgb2Nj dXJyZW5jZXMgb2YgQzwvPiBhbmQgQzwuPiBhcmUgbm9ybWFsaXplZCBvbiB0aGUgZmx5Cj4gPiAr d2hlbiBuZWVkZWQuIFRoaXMgbWVhbnMgdGhhdCBlLmcuIEM8Zm9vLy8vL2Jhci8vLy4vLz4gYmVj b21lcyBDPGZvbz4sIGJ1dAo+ID4gK0M8Zm9vLy4vL2Jhci8vLi9iYXo+IGJlY29tZXMgQzxmb28v Li8vYmFyPi4KPiA+ICsKPiA+ICtUaGlzIGZ1bmN0aW9uJ3MgYmVoYXZpb3VyIGlzIGFsbW9zdCBp ZGVudGljYWwgdG8gUnVzdCdzCj4gPiArTDw8IFBhdGg6OnBhcmVudHxodHRwczovL2RvYy5ydXN0 LWxhbmcub3JnL3N0ZC9wYXRoL3N0cnVjdC5QYXRoLmh0bWwjbWV0aG9kLnBhcmVudCA+PiwKPiA+ ICt3aXRoIGEgZmV3IGFkYXB0YXRpb25zIG1hZGUgd2hlcmV2ZXIgUGVybCB0cmVhdHMgdGhpbmdz IGRpZmZlcmVudGx5Ogo+ID4gKwo+ID4gKz1vdmVyCj4gPiArCj4gPiArPWl0ZW0gKiBDPC9mb28v YmFyPiBiZWNvbWVzIEM8L2Zvbz4sIEM8Zm9vL2Jhcj4gYmVjb21lcyBDPGZvbz4uCj4gPiArCj4g PiArPWl0ZW0gKiBDPC9mb28+IGJlY29tZXMgQzwvPi4KPiA+ICsKPiA+ICs9aXRlbSAqIEM8Zm9v L2Jhci8uLj4gYmVjb21lcyBDPGZvby9iYXI+LiBOb3RlIHRoYXQgQzxmb28vYmFyPiBpcyBub3QK PiA+ICtuZWNlc3NhcmlseSB0aGUgcmVhbCBwYXJlbnQgaW4gdGhlIGZpbGVzeXN0ZW0gaW4gdGhl IGNhc2Ugb2YgZS5nLiBzeW1saW5rcy4KPiA+ICsKPiA+ICs9aXRlbSAqIEM8Zm9vLy4uL2Jhcj4g YmVjb21lcyBDPGZvby8uLj4uCj4gPiArCj4gPiArPWl0ZW0gKiBDPGZvbz4gaXMgaW50ZXJwcmV0 ZWQgYXMgQzwuL2Zvbz4gYW5kIGJlY29tZXMgQzwuPi4gVGhpcyBpcyBiZWNhdXNlIFBlcmwncwo+ ID4gK0M8TDxGaWxlOjpTcGVjL2Nhbm9ucGF0aD4+IGludGVycHJldHMgQzwuL2Zvbz4gYW5kIEM8 Zm9vPiBhcyB0aGUgc2FtZSB0aGluZy4KPgo+IEkgZmFpbCB0byBzZWUgdGhlICJiZWNhdXNlIiBo ZXJlLiBXaHkgaXMgdGhpcyBzcGVjaWFsIGhhbmRsaW5nIGltcG9ydGFudAo+IGluIHByYWN0aWNl LCBpLmUuIHdoeSBleGFjdGx5IGNhcmUgYWJvdXQgdGhlIGJlaGF2aW9yIG9mIGNhbm9ucGF0aCBo ZXJlPwo+IEl0IHNlZW1zIHJlYWxseSBzdXJwcmlzaW5nIHRvIGdldCAiLiIgd2hlbiBhc2tpbmcg Zm9yIHRoZSBwYXJlbnQgb2YKPiAiZm9vIi4gV2l0aCB0aGUgbm9ybWFsaXphdGlvbiBleHBsYWlu ZWQgYWJvdmUsIEknZCBhcmd1ZSBpdCdkIGJlIG11Y2gKPiBtb3JlIG5hdHVyYWwgdG8gcmV0dXJu IHRoZSBlbXB0eSBzdHJpbmcgZm9yIGJvdGggIi4vZm9vIiBhbmQgImZvbyIuIE9yCj4gaWYgeW91 IHdhbnQgdG8gZm9sbG93IFJ1c3QncyBwYXJlbnQoKSBtb3JlIGNsb3NlbHkgKHdoaWNoIEkgZ3Vl c3MgaXMgdGhlCj4gcmVhc29uIGZvciAiLyIgYW5kICIuIiBoYXZpbmcgZGlmZmVyZW50IHJlc3Vs dHMpLCBoYXZlICIuL2ZvbyIgcmV0dXJuCj4gIi4iIGFuZCAiZm9vIiByZXR1cm4gdGhlIGVtcHR5 IHN0cmluZy4KClllYWgsIHRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgd2hlcmUgSSB3YXNuJ3Qgc3Vy ZSBpZiBpdCdzIHRoZSByaWdodCB3YXkKdG8gZ28uIFRoZSByZWFzb24gd2h5IEkgY2hvc2UgdG8g aGFuZGxlIGl0IHRoYXQgd2F5IGlzIGJlY2F1c2UKRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCkgd2ls bCByZXR1cm4gImZvbyIgZm9yIGJvdGggImZvbyIgYW5kICIuL2ZvbyIKLS0gYW5kIEkgd2Fzbid0 IDEwMCUgc3VyZSB3aGV0aGVyICpub3QqIGhhbmRsaW5nIGl0IHRoZSBzYW1lIHdpbGwgYmUKZGV0 cmltZW50YWwgZWxzZXdoZXJlLgoKSSB0b3RhbGx5IGdldCB0aGF0IGl0J3MgdW5leHBlY3RlZCB0 aG91Z2gsIHNvIEkgcmVhbGx5IHdvdWxkbid0IG1pbmQKY2hhbmdpbmcgaXQgdG8gb25lIG9mIHRo ZSB0d28gYWx0ZXJuYXRpdmVzIHlvdSBzdWdnZXN0ZWQuIDpQCgooQWRkZW5kdW06IEhhbmRsaW5n IHBhdGhzIGlzIHJlYWxseSBmaW5pY2t5LCBzbyBpbiBjYXNlcyB3aGVyZSBJIHdhc24ndAoxMDAl IGNvbnZpbmNlZCBvZiBzb21ldGhpbmcgSSBkZWNpZGVkIHRvIGJlIGNvbnNlcnZhdGl2ZSBpbnN0 ZWFkOyB0aGlzCmlzIG9uZSBzdWNoIGNhc2UuIPCfmIUpCgo+Cj4gPiArPWhlYWQzIHBhdGhfcHVz aCgkcGF0aCwgJG90aGVyKQo+ID4gKwo+ID4gK0V4dGVuZHMgQzwkcGF0aD4gd2l0aCBDPCRvdGhl cj4sIHJldHVybmluZyBhIG5ldyBwYXRoLgo+ID4gKwo+ID4gK0lmIEM8JG90aGVyPiBpcyBhYnNv bHV0ZSwgaXQgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkLgo+ID4gKwo+Cj4gQWdhaW4sIHNlZW1z IHJhdGhlciBzdXJwcmlzaW5nIHRvIG1lIHRvIGF1dG8tbWFnaWNhbGx5IGRvIHRoaXMuCgpTZWUg bXkgZWxhYm9yYXRpb24gZnVydGhlciBhYm92ZS4KCj4KPiA+ICtUaHJvd3MgYW4gZXhjZXB0aW9u IGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIEM8dW5kZWY+Lgo+ID4gKwo+ID4gKz1jdXQKPiA+ ICsKPiA+ICtzdWIgcGF0aF9wdXNoIDogcHJvdG90eXBlKCQkKSB7Cj4gPiArICAgIG15ICgkcGF0 aCwgJG90aGVyKSA9IEBfOwo+ID4gKwo+ID4gKyAgICBjcm9hayAiXCRwYXRoIGlzIHVuZGVmIiBp ZiAhZGVmaW5lZCgkcGF0aCk7Cj4gPiArICAgIGNyb2FrICJcJG90aGVyIGlzIHVuZGVmIiBpZiAh ZGVmaW5lZCgkb3RoZXIpOwo+ID4gKwo+ID4gKyAgICByZXR1cm4gJHBhdGggaWYgJG90aGVyIGVx ICcnOwo+ID4gKyAgICByZXR1cm4gJG90aGVyIGlmIHBhdGhfaXNfYWJzb2x1dGUoJG90aGVyKTsK PiA+ICsKPiA+ICsgICAgbXkgJG5lZWRfc2VwID0gJHBhdGggbmUgJycgJiYgJHBhdGggIX4gbSMv JCM7Cj4gPiArCj4gPiArICAgICRwYXRoIC49ICIvIiBpZiAkbmVlZF9zZXA7Cj4gPiArICAgICRw YXRoIC49ICRvdGhlcjsKPiA+ICsKPiA+ICsgICAgcmV0dXJuICRwYXRoOwo+ID4gK30KPiA+ICsK PiA+ICs9aGVhZDMgcGF0aF9wb3AoJHBhdGgpCj4gPiArCj4gPiArQWxpYXMgZm9yIEM8TDw8IHBh dGhfcGFyZW50KCl8LyJwYXRoX3BhcmVudCgkcGF0aCkiID4+Pi4KPiA+ICsKPgo+IFdoeSBoYXZl IHRoaXMgYWxpYXM/IFRoZSBuYW1lIHN1Z2dlc3RzIGl0IHdvdWxkIGJlaGF2ZSBsaWtlIGFuIGlu dmVyc2UKPiB0byBwYXRoX3B1c2goKSwgYnV0IGl0IGRvZXMgbm90LCBiZWNhdXNlIG9mIHRoZSBu b3JtYWxpemF0aW9uIG9mCj4gcGF0aF9wYXJlbnQoKS4gU28gSSdkIHJhdGhlciBub3QgaGF2ZSBp dCBvciBoYXZlIGl0IGJlIGEgbm9uLW5vcm1hbGl6aW5nCj4gdmVyc2lvbiAoYnV0IG1heWJlIG5v dCB3b3J0aCBpdCkgdG8gYXZvaWQgc3VycHJpc2VzLgoKQ291bGQgeW91IHBsZWFzZSBlbGFib3Jh dGUgd2hhdCB5b3UgbWVhbiByZWdhcmRpbmcgdGhlIG5vcm1hbGl6YXRpb24gb2YKcGF0aF9wYXJl bnQoKT8KCnBhdGhfcGFyZW50KCkgKG9yIHBhdGhfcG9wKCkpIHdpbGwgb25seSBub3JtYWxpemUg YXMgbXVjaCBhcyBpdCBuZWVkcyB0bwppbiBvcmRlciB0byByZW1vdmUgdGhlIGxhc3QgcGF0aCBj b21wb25lbnQgYW5kIGdldCB0byB0aGUgb25lIHRoYXQKcHJlY2VkZXMgdGhhdDoKCiAgbXkgJHAg PSAiZm9vLy4vLi9iYXIvLi8uL2Jhei8uLy4iOwoKICAkcCA9IFBWRTo6UGF0aDo6cGF0aF9wYXJl bnQoJHApOiAgIyBvciBwYXRoX3BvcCgpCiAgIyAkcCBpcyBub3cgImZvby8uLy4vYmFyIgoKcGF0 aF9wdXNoKCkgZG9lcyBhY3R1YWxseSBiZWhhdmUgbGlrZSBhbiBpbnZlcnNlIGlmIHlvdSBpbmNs dWRlIHRoZQpyZWR1bmRhbnQgc3R1ZmY6CgogICRwID0gUFZFOjpQYXRoOjpwYXRoX3B1c2goJHAs ICIuLy4vYmF6Ly4vLiIpCiAgIyAkcCBpcyBub3cgImZvby8uLy4vYmFyLy4vLi9iYXovLi8uIiBh Z2FpbgoKSXQncyBub3QgYSBjb21wbGV0ZSBpbnZlcnNlLCB0aGF0J3MgdHJ1ZSAoYXMgaW4sIGl0 J3Mgbm90IGJpamVjdGl2ZSA7UCksCmJlY2F1c2UgeW91IGNhbid0IHJlcGxpY2F0ZSB0aGUgZXhh bXBsZSBhYm92ZSB3aXRoIGEgcGF0aCBsaWtlCiJmb28vLy9iYXIvLy9iYXoiIHNpbmNlIHlvdSBj YW4ndCBwdXNoICIvLy9iYXoiIG9udG8gImZvby8vL2JhciIKKCIvLy9iYXoiIGlzIHRyZWF0ZWQg YXMgYW4gYWJzb2x1dGUgcGF0aCkuCgpJIHRoaW5rIGEgbm9uLW5vcm1hbGl6aW5nIHZlcnNpb24g d291bGRuJ3QgcmVhbGx5IGJlIHRoYXQgbmljZSB0byB1c2U7Cm9uZSB3b3VsZCBoYXZlIHRvIGNv bnN0YW50bHkgcmVtZW1iZXIgdG8gY2FsbCBwYXRoX25vcm1hbGl6ZSgpCmJlZm9yZWhhbmQgdG8g YWN0dWFsbHkgZ2V0IHRoZSBkZXNpcmVkIHJlc3VsdCAoaS5lLiBnZXR0aW5nIHRoZSBwYXJlbnQK ZGlyZWN0b3J5KS4KCkkgY2FuIGp1c3QgcmVtb3ZlIHRoZSBhbGlhcyBpZiB5b3UgcHJlZmVyOyBp dCdzIG5vdCBlcXVpdmFsZW50IHRvIFJ1c3QncwpQYXRoQnVmOjpwb3AoKSBbcG9wXSBhbmQgaWYg aXQncyBhIHNvdXJjZSBvZiBjb25mdXNpb24sIHdlIGNhbiBwcm9iYWJseQpkbyB3aXRob3V0LgoK W3BvcF06IGh0dHBzOi8vZG9jLnJ1c3QtbGFuZy5vcmcvc3RkL3BhdGgvc3RydWN0LlBhdGhCdWYu aHRtbCNtZXRob2QucG9wCgo+Cj4gPiArPWN1dAo+ID4gKwo+ID4gK3N1YiBwYXRoX3BvcCA6IHBy b3RvdHlwZSgkKSB7Cj4gPiArICAgIG15ICgkcGF0aCkgPSBAXzsKPiA+ICsgICAgcmV0dXJuIHBh dGhfcGFyZW50KCRwYXRoKTsKPiA+ICt9Cj4gPiArCj4gPiArPWhlYWQzIHBhdGhfZmlsZV9uYW1l KCRwYXRoKQo+ID4gKwo+ID4gK1JldHVybnMgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBnaXZl biBDPCRwYXRoPiwgaWYgaXQgaXMgYSBsZWdhbCBmaWxlIG5hbWUsCj4gPiArb3IgQzx1bmRlZj4g b3RoZXJ3aXNlLgo+ID4gKwo+ID4gK0lmIEM8JHBhdGg+IGlzIGFuIGVtcHR5IHN0cmluZywgQzwv PiwgQzwuPiBvciBlbmRzIHdpdGggYSBDPC4uPiBjb21wb25lbnQsCj4gPiArdGhlcmUgaXMgbm8g dmFsaWQgZmlsZSBuYW1lLgo+ID4gKwo+ID4gK0I8Tm90ZTo+IFRoaXMgZG9lcyBub3QgY2hlY2sg d2hldGhlciB0aGUgZ2l2ZW4gQzwkcGF0aD4gYWN0dWFsbHkgcG9pbnRzIHRvIGEKPiA+ICtmaWxl IG9yIGEgZGlyZWN0b3J5IGV0Yy4KPiA+ICsKPiA+ICtUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIEM8 JHBhdGg+IGlzIEM8dW5kZWY+Lgo+ID4gKwo+ID4gKz1jdXQKPiA+ICsKPiA+ICtzdWIgcGF0aF9m aWxlX25hbWUgOiBwcm90b3R5cGUoJCkgewo+ID4gKyAgICBteSAoJHBhdGgpID0gQF87Cj4gPiAr Cj4gPiArICAgIGNyb2FrICJcJHBhdGggaXMgdW5kZWYiIGlmICFkZWZpbmVkKCRwYXRoKTsKPiA+ ICsKPiA+ICsgICAgbXkgQGNvbXBvbmVudHMgPSBwYXRoX2NvbXBvbmVudHMoJHBhdGgpOwo+ID4g Kwo+ID4gKyAgICBpZiAoIXNjYWxhcihAY29tcG9uZW50cykpIHsKPiA+ICsJcmV0dXJuOwo+ID4g KyAgICB9Cj4gPiArCj4gPiArICAgIGlmICgKPiA+ICsJc2NhbGFyKEBjb21wb25lbnRzKSA9PSAx Cj4gPiArCSYmICgkY29tcG9uZW50c1swXSBlcSAnLycgfHwgJGNvbXBvbmVudHNbMF0gZXEgJy4n KQo+ID4gKyAgICApIHsKPgo+IFN0eWxlIG5pdDogdGhpcyBjb25kaXRpb25hbCBmaXRzIHdlbGwg aW50byAxMDAgY2hhcmFjdGVycywgc28gY2FuIGJlIG9uZQo+IGxpbmUgaW5zdGVhZCBvZiBmb3Vy CgpGYWlyIHBvaW50LCBidXQgSSBwcmVmZXIgdG8gaGF2ZSBpdCBhIGxpdHRsZSBtb3JlIHJlYWRh YmxlIGhlcmUsIGFuZAppdCdzIHN0aWxsIGluIGxpbmUgd2l0aCBvdXIgc3R5bGUgZ3VpZGUuIDpQ Cgo+Cj4gPiArCXJldHVybjsKPiA+ICsgICAgfQo+ID4gKwo+ID4gKyAgICBpZiAoJGNvbXBvbmVu dHNbLTFdIGVxICcuLicpIHsKPiA+ICsJcmV0dXJuOwo+ID4gKyAgICB9Cj4gPiArCj4gPiArICAg IHJldHVybiAkY29tcG9uZW50c1stMV07Cj4gPiArfQo+ID4gKwo+ID4gKz1oZWFkMyBwYXRoX3dp dGhfZmlsZV9uYW1lKCRwYXRoLCAkZmlsZV9uYW1lKQo+ID4gKwo+ID4gK1JldHVybnMgQzwkcGF0 aD4gd2l0aCBDPCRmaWxlX25hbWU+IGFzIHRoZSBuZXcgbGFzdCBjb21wb25lbnQuCj4gPiArCj4g PiArVGhpcyBpcyBlc3NlbnRpYWxseSBsaWtlIGNhbGxpbmcgQzxMPDwgcGF0aF9wYXJlbnQoKXwv InBhdGhfcGFyZW50KCRwYXRoKSIgPj4+Cj4gPiArYW5kIHVzaW5nIEM8TDw8IHBhdGhfcHVzaCgp fC8icGF0aF9wdXNoKCRwYXRoLCAkb3RoZXIpIiA+Pj4gdG8gYXBwZW5kIHRoZSBuZXcKPiA+ICtm aWxlIG5hbWUsIGJ1dCBoYW5kbGVzIGEgZmV3IGV4dHJhIGNhc2VzOgo+ID4gKwo+ID4gKz1vdmVy Cj4gPiArCj4gPiArPWl0ZW0gKiBJZiBDPCRwYXRoPiBpcyBDPC8+LCBhcHBlbmRzIEM8JGZpbGVf bmFtZT4uCj4gPiArCj4gPiArPWl0ZW0gKiBJZiBDPCRwYXRoPiBpcyBhbiBlbXB0eSBzdHJpbmcs IGFwcGVuZHMgQzwkZmlsZV9uYW1lPi4KPiA+ICsKPiA+ICs9aXRlbSAqIElmIEM8JHBhdGg+IGVu ZHMgd2l0aCBhIHBhcmVudCBkaXJlY3RvcnkgcmVmZXJlbmNlIChDPC4uPiksIHJlcGxhY2VzIGl0 Cj4gPiArd2l0aCBDPCRmaWxlX25hbWU+Lgo+Cj4gSG1tLCB3aHkgaXMgdGhhdCBhbiAiZXh0cmEg Y2FzZSIgY29tcGFyZWQgdG8gY2FsbGluZyBwYXRoX3BhcmVudCgpIGFuZAo+IHBhdGhfcHVzaCgp PyBJLmUuIHlvdXIgaW1wbGVtZW50YXRpb24gZG9lc24ndCBoYW5kbGUgIi4uIiBzcGVjaWZpY2Fs bHkuCj4KClRoaXMgaXMgc3RhdGVkIGhlcmUgZm9yIGNvbXBsZXRlbmVzcydzIHNha2UsIGJ1dCBJ IGd1ZXNzIGl0J3Mgbm90IHJlYWxseQphbiBleHRyYSBjYXNlLCB5ZWFoLgoKSG93ZXZlciwgeW91 IG1hZGUgbWUgY2hlY2sgdGhlIGV4YWN0IGRldGFpbHMgYWdhaW4gdGhvdWdoLCBhbmQgaXQgc2Vl bXMKdGhhdCBSdXN0J3MgUGF0aEJ1Zjo6c2V0X2ZpbGVfbmFtZSgpIFtzZm5dIHdvdWxkIGFjdHVh bGx5IGJlaGF2ZQpkaWZmZXJlbnRseSBoZXJlOyBpZiBhIHBhdGggZW5kcyB3aXRoIGEgcGFyZW50 IGRpciByZWZlcmVuY2UsIGl0IHdvdWxkCmFjdHVhbGx5IGp1c3QgYXBwZW5kIHRoZSBmaWxlIG5h bWUsIG5vdCByZXBsYWNlIGl0IDpQCgouLiBzbywgdGhhbmtzIGZvciBzcG90dGluZyB0aGlzISBJ IGFjdHVhbGx5IHdhbnQgdG8gYWRhcHQgdGhpcyBub3cg8J+YhAoKW3Nmbl06IGh0dHBzOi8vZG9j LnJ1c3QtbGFuZy5vcmcvc3RkL3BhdGgvc3RydWN0LlBhdGhCdWYuaHRtbCNtZXRob2Quc2V0X2Zp bGVfbmFtZQoKPiA+ICsKPiA+ICs9YmFjawo+ID4gKwo+ID4gK1Rocm93cyBhbiBleGNlcHRpb24g aWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgQzx1bmRlZj4gb3IgaWYgQzwkZmlsZV9uYW1lPgo+ ID4gK2NvbnRhaW5zIGEgcGF0aCBzZXBhcmF0b3IgKEM8Lz4pLgo+ID4gKwo+ID4gKz1jdXQKPiA+ ICsKPiA+ICtzdWIgcGF0aF93aXRoX2ZpbGVfbmFtZSA6IHByb3RvdHlwZSgkJCkgewo+ID4gKyAg ICBteSAoJHBhdGgsICRmaWxlX25hbWUpID0gQF87Cj4gPiArCj4gPiArICAgIGNyb2FrICJcJHBh dGggaXMgdW5kZWYiIGlmICFkZWZpbmVkKCRwYXRoKTsKPiA+ICsgICAgY3JvYWsgIlwkZmlsZV9u YW1lIGlzIHVuZGVmIiBpZiAhZGVmaW5lZCgkZmlsZV9uYW1lKTsKPiA+ICsgICAgY3JvYWsgIlwk ZmlsZV9uYW1lIGNvbnRhaW5zIGEgcGF0aCBzZXBhcmF0b3I6ICRmaWxlX25hbWUiIGlmICRmaWxl X25hbWUgPX4gbXwvfDsKPiA+ICsKPiA+ICsgICAgbXkgJHBhcmVudCA9IHBhdGhfcGFyZW50KCRw YXRoKTsKPiA+ICsKPiA+ICsgICAgIyB1bmRlZiBtZWFucyB0aGF0ICRwYXRoIHdhcyBlaXRoZXIg IiIgb3IgIi8iLCBzbyB3ZSBjYW4ganVzdCBhcHBlbmQgdG8gaXQKPiA+ICsgICAgcmV0dXJuICgk cGF0aCAuICRmaWxlX25hbWUpIGlmICFkZWZpbmVkKCRwYXJlbnQpOwo+ID4gKwo+ID4gKyAgICAj IEJlY2F1c2UgdGhlIHBhcmVudCBvZiAiZm9vIiBpcyAiLiIsIHJldHVybiAkZmlsZV9uYW1lIHRv IHN0YXkgY29uc2lzdGVudC4KPiA+ICsgICAgIyBPdGhlcndpc2UsIHdlJ2QgZW5kIHVwIHdpdGgg YSBjdXJyZW50IHBhdGggcmVmIHByZXBlbmRlZCAoIi4vJGZpbGVfbmFtZSIpCj4gPiArICAgIGlm ICgkcGFyZW50IGVxICcuJyAmJiAkcGF0aCAhfiBtfC98KSB7Cj4gPiArCXJldHVybiAkZmlsZV9u YW1lOwo+ID4gKyAgICB9Cj4KPiBTZWUsIHlvdSBhbHJlYWR5IG5lZWQgc3BlY2lhbCBoYW5kbGlu ZyBiZWNhdXNlIG9mIHRoYXQgc3VycHJpc2luZwo+IGJlaGF2aW9yIDspCgpXZWxsIHllYWgsIGJl Y2F1c2UgSSBjaG9zZSB0aGUgYmVoYXZpb3VyIG9mIHBhdGhfcGFyZW50KCkgdG8gYmUgdGhlIHdh eQppdCBpczsgb2YgY291cnNlIEknbSBnb25uYSBlbnN1cmUgdGhlIG90aGVyIGZ1bmN0aW9ucyB0 YWtlIHRoYXQgZGVjaXNpb24KaW50byBhY2NvdW50IHRvbyDwn5iFCgo+Cj4gPiArCj4gPiArICAg IHJldHVybiBwYXRoX3B1c2goJHBhcmVudCwgJGZpbGVfbmFtZSk7Cj4gPiArfQo+ID4gKwo+ID4g K215IHN1YiBfcGF0aF9maWxlX3ByZWZpeF9zdWZmaXhfc3RyIDogcHJvdG90eXBlKCQpIHsKPiA+ ICsgICAgbXkgKCRmaWxlX25hbWUpID0gQF87Cj4gPiArCj4gPiArICAgIGNvbmZlc3MgIlwkZmls ZV9uYW1lIGlzIHVuZGVmIiBpZiAhZGVmaW5lZCgkZmlsZV9uYW1lKTsKPiA+ICsKPiA+ICsgICAg Y29uZmVzcyAiXCRwcmVmaXggbm90IG1hdGNoZWQiIGlmICRmaWxlX25hbWUgIX4gbXxeKFwuKlte XC5dKikoLiopfDsKPiA+ICsgICAgbXkgKCRwcmVmaXgsICRzdWZmaXhfc3RyKSA9ICgkMSwgJDIp Owo+ID4gKwo+ID4gKyAgICByZXR1cm4gKCRwcmVmaXgsICRzdWZmaXhfc3RyKTsKPiA+ICt9Cj4g PiArCj4gPiArbXkgc3ViIF9wYXRoX2ZpbGVfc3VmZml4ZXNfZnJvbV9zdHIgOiBwcm90b3R5cGUo JCkgewo+ID4gKyAgICBteSAoJHN1ZmZpeF9zdHIpID0gQF87Cj4gPiArCj4gPiArICAgIGNvbmZl c3MgIlwkc3VmZml4X3N0ciBpcyB1bmRlZiIgaWYgIWRlZmluZWQoJHN1ZmZpeF9zdHIpOwo+ID4g Kwo+ID4gKyAgICAjIFN1ZmZpeGVzIGFyZSBleHRyYWN0ZWQgIm1hbnVhbGx5IiBiZWNhdXNlIGpv aW4oKWluZyB0aGUgcmVzdWx0IG9mIHNwbGl0KCkKPiA+ICsgICAgIyByZXN1bHRzIGluIGEgZGlm ZmVyZW50IGZpbGUgbmFtZSB0aGFuIHRoZSBvcmlnaW5hbC4gTGV0J3Mgc2F5IHlvdSBoYXZlIGEK PiA+ICsgICAgIyBmaWxlIG5hbWVkICJmb28uYmFyLiIuIFRoZSBjb3JyZWN0IHN1ZmZpeGVzIHdv dWxkIGJlICgiYmFyIiwgIiIpLgo+ID4gKyAgICAjIFdpdGggc3BsaXQsIHlvdSBnZXQgdGhlIGZv bGxvd2luZzoKPiA+ICsgICAgIyAgICAgc3BsaXQoL1wuLywgIi5iYXIuIikgICAgIC0tPiAoIiIs ICJiYXIiKSAgICAgLS0+IGpvaW4oKWVkIHRvICJmb28uLmJhciIKPiA+ICsgICAgIyAgICAgc3Bs aXQoL1wuLywgIi5iYXIuIiwgLTEpIC0tPiAoIiIsICJiYXIiLCAiIikgLS0+IGpvaW4oKWVkIHRv ICJmb28uLmJhci4iCj4KPiBDb3VsZG4ndCB5b3UganVzdCBzaGlmdCBhd2F5IHRoZSBmaXJzdCBl bnRyeSBmcm9tIHRoZSByZXN1bHQ/CgpIbSwgSSB0aGluayBzby4gSSdsbCBzZWUgaG93IGl0IGJl aGF2ZXMuIFRoYW5rcyBmb3IgdGhlIHN1Z2dlc3Rpb24hCgo+Cj4gPiArICAgIG15IEBzdWZmaXhl cyA9ICgpOwo+ID4gKyAgICB3aGlsZSAoJHN1ZmZpeF9zdHIgPX4gc3xeKFwuW15cLl0qKXx8KSB7 Cj4gPiArCW15ICRzdWZmaXggPSAkMTsKPiA+ICsJJHN1ZmZpeCA9fiBzfF5cLnx8Owo+Cj4gTml0 OiBDb3VsZCBhbHNvIHVzZSBzdWJzdHIoKSByYXRoZXIgdGhlbiByZWdleCByZXBsYWNlLgoKR29v ZCBjYXRjaCwgdGhhbmtzIQoKPgo+ID4gKwlwdXNoKEBzdWZmaXhlcywgJHN1ZmZpeCk7Cj4gPiAr ICAgIH0KPiA+ICsKPiA+ICsgICAgcmV0dXJuIEBzdWZmaXhlczsKPiA+ICt9Cj4gPiArCj4gPiAr PWhlYWQzIHBhdGhfZmlsZV9wcmVmaXgoJHBhdGgpCj4gPiArCj4gPiArUmV0dXJucyB0aGUgcHJl Zml4IG9mIHRoZSBmaWxlIG5hbWUgb2YgdGhlIGdpdmVuIEM8JHBhdGg+LiBJZiB0aGUgQzwkcGF0 aD4gZG9lcwo+ID4gK25vdCBoYXZlIGEgdmFsaWQgZmlsZSBuYW1lIGFuZCB0aHVzIG5vIHByZWZp eCwgQzx1bmRlZj4gaXMgcmV0dXJuZWQgaW5zdGVhZC4KPiA+ICsKPiA+ICtUaGUgcHJlZml4IG9m IGEgZmlsZSBuYW1lIGlzIHRoZSBwYXJ0IGJlZm9yZSBhbnkgZXh0ZW5zaW9ucyAoc3VmZml4ZXMp Lgo+ID4gKwo+ID4gKyAgICBteSAkcHJlZml4ID0gcGF0aF9maWxlX3ByZWZpeCgiL2V0Yy9yZXNv bHYuY29uZiIpOwo+ID4gKyAgICAjIHJlc29sdgo+ID4gKwo+ID4gKyAgICBteSAkcHJlZml4ID0g cGF0aF9maWxlX3ByZWZpeCgiL3RtcC9hcmNoaXZlLnRhci56c3QiKTsKPiA+ICsgICAgIyBhcmNo aXZlCj4gPiArCj4gPiArVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBDPCRwYXRoPiBpcyBDPHVuZGVm Pi4KPiA+ICsKPgo+IERvY3VtZW50YXRpb24gc2hvdWxkIG1lbnRpb24gaG93IGRvdCBmaWxlcyAo ZS5nLiAuZm9vLnR4dCkgYXJlIHRyZWF0ZWQuCj4KClN1cmUsIEkgY2FuIGFkZCB0aGF0LgoKRldJ VyBpbiB0aGUgY2FzZSBvZiAiLmZvby50eHQiLCB0aGUgcHJlZml4IHdvdWxkIGJlICIuZm9vIi4K Cj4gPiArPWN1dAo+ID4gKwo+ID4gK3N1YiBwYXRoX2ZpbGVfcHJlZml4IDogcHJvdG90eXBlKCQp IHsKPiA+ICsgICAgbXkgKCRwYXRoKSA9IEBfOwo+ID4gKwo+ID4gKyAgICBjcm9hayAiXCRwYXRo IGlzIHVuZGVmIiBpZiAhZGVmaW5lZCgkcGF0aCk7Cj4gPiArCj4gPiArICAgIG15ICRmaWxlX25h bWUgPSBwYXRoX2ZpbGVfbmFtZSgkcGF0aCk7Cj4gPiArICAgIHJldHVybiB1bmRlZiBpZiAhZGVm aW5lZCgkZmlsZV9uYW1lKTsKPiA+ICsKPiA+ICsgICAgbXkgKCRwcmVmaXgsICRzdWZmaXhfc3Ry KSA9IF9wYXRoX2ZpbGVfcHJlZml4X3N1ZmZpeF9zdHIoJGZpbGVfbmFtZSk7Cj4gPiArICAgIHJl dHVybiAkcHJlZml4Owo+ID4gK30KPiA+ICsKPiA+ICs9aGVhZDMgcGF0aF93aXRoX2ZpbGVfcHJl Zml4KCRwYXRoLCAkcHJlZml4KQo+ID4gKwo+Cj4gSG1tLCBsb29raW5nIGF0IHRoaXMgYW5kIHBh dGhfd2l0aF9maWxlX3N1ZmZpeHssZXN9KCksIHdvdWxkIGl0IG1heWJlIGJlCj4gbmljZXIgdG8g aGF2ZSBhIHNpbmdsZQo+IHBhdGhfd2l0aF9maWxlX25hbWVfZnJvbV9wYXJ0cygkcGF0aCwgJHBy ZWZpeCwgQHN1ZmZpeGVzKQo+IGZ1bmN0aW9uIGluc3RlYWQgb2YgdGhlc2U/IFdvdWxkIHNlZW0g bW9yZSBuYXR1cmFsL3N0cmFpZ2h0Zm9yd2FyZCB0bwo+IG1lLiBUaGUgaW1wbGVtZW50YXRpb25z IGFyZSByYXRoZXIgaW52b2x2ZWQgSU1ITyBjb21wYXJlZCB0byBob3cgdXNlZnVsCj4gdGhlIGZ1 bmN0aW9ucyBhcmUuIEl0J3MgdmVyeSBlYXN5IHRvIGdldCB0aGUgYmVoYXZpb3IgZm9yIHRoZSAo SSBzdXNwZWN0Cj4gcmF0aGVyIHVuY29tbW9uKSBjYXNlIG9mIHdoZXJlIHlvdSB3YW50IHRvIHJl cGxhY2Ugb25seSBwcmVmaXggb3IKPiBzdWZmaXgoZXMpIHdpdGhvdXQgYWxyZWFkeSBrbm93aW5n IHRoZSBvdGhlci4gSnVzdCBuZWVkIHRvIGNhbGwKPiBwYXRoX2ZpbGVfcGFydHMoKSBmaXJzdC4g T3IgZGlkIHlvdSB0YWtlIGluc3BpcmF0aW9uIGZyb20gc29tZXdoZXJlIGVsc2UKPiBmb3IgdGhl c2U/CgpJJ2xsIGhhdmUgdG8gZGlzYWdyZWUgaGVyZSBwcmVjaXNlbHkgYmVjYXVzZSBoYXZpbmcg dG8gY2FsbApwYXRoX2ZpbGVfcGFydHMoKSBmaXJzdCBpcyBJTU8gdGVkaW91cyBmcm9tIHRoZSBj YWxsZXIncyBwZXJzcGVjdGl2ZS4gSW4KbWFueSBjYXNlcyBJIHJhcmVseSBjYXJlIGFib3V0IGFs bCBvZiB0aGUgaW5kaXZpZHVhbCBwYXJ0czsgaW5zdGVhZCBJCmp1c3QgZS5nLiB3YW50IHRvIHJl bmFtZSBhIGZpbGUgd2hpbGUga2VlcGluZyB0aGUgc3VmZml4KGVzKSwgb3IgSSB3YW50IHRvCnRy aW0gb2ZmIHRoZSBsYXN0IHN1ZmZpeCBvZiBzb21ldGhpbmcgbGlrZSAiYXJjaGl2ZS50YXIuZ3oi IGJlY2F1c2UgSSdtCmRlY29tcHJlc3NpbmcgaXQgdG8gImFyY2hpdmUudGFyIiBvciBzaW1pbGFy LgoKSW4gb3RoZXIgd29yZHMsIGluIGEgbG90IG9mIGNhc2VzIEkganVzdCB3YW50IHRvIHBlcmZv cm0gb25lIGluZGl2aWR1YWwKb3BlcmF0aW9uLCBhbmQgdGhlIHBhdGhfZmlsZV8qIGFuZCBwYXRo X3dpdGhfZmlsZV8qIGZ1bmN0aW9ucyByZXByZXNlbnQKYWxsIHRob3NlIGluZGl2aWR1YWwgb3Bl cmF0aW9ucyBhcyBjb25jaXNlbHkgYXMgcG9zc2libGUuIFRoZSBidXJkZW4gb2YKImZpZ3VyaW5n IG91dCB3aGF0IHRvIGRvIiBzaG91bGRuJ3QgYmUgZ2l2ZW4gdG8gdGhlIGNhbGxlciBpbiBzdWNo CmNhc2VzLgoKUmVnYXJkaW5nIGluc3BpcmF0aW9uOiBUaGVzZSBmdW5jdGlvbnMgd2VyZSBpbnNw aXJlZCBhZnRlciBoYXZpbmcgcmVhZCBhCnJlbGF0ZWQgUnVzdCBHaXRIdWIgaXNzdWUgW2lzc3Vl XSB3aGVyZSBhIGxvdCBvZiB0aGlzIHdhcyBkaXNjdXNzZWQgYXMKd2VsbC4KClRoYXQgaXNzdWUg YWxzbyBzdWdnZXN0cyBoYXZpbmcgc29tZSBraW5kIG9mIGl0ZXJhdG9yIGZvciBmaWxlIHBhcnRz LAp0aGF0IG90aGVyIG1ldGhvZHMgb2Ygc3RkOjpwYXRoOjpQYXRoIGNhbiBiZSBiYXNlZCBvbjsg dGhpcyBpcyBhY3R1YWxseQp3aGF0IGxlZCBtZSB0byBhZGRpbmcgcGF0aF9maWxlX3BhcnRzKCkg YmVsb3cuIFlvdSBoYXZlIGFjY2VzcyB0byB0aGUKaW5kaXZpZHVhbCBwYXJ0cyB0aGVyZSBhbmQg Y2FuIGp1c3Qgam9pbigpIHRoZW0gdG8gdGhlIGZpbGUgbmFtZS4gVGhhdAp3b3VsZCBiZSB2ZXJ5 IHNpbWlsYXIgdG8gdGhlIHBhdGhfd2l0aF9maWxlX25hbWVfZnJvbV9wYXJ0cygpIGZ1bmN0aW9u CnlvdSBzdWdnZXN0ZWQuIDpQCgpbaXNzdWVdOiBodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5n L3J1c3QvaXNzdWVzLzg2MzE5Cgo+Cj4gLS0tc25pcCA4PC0tLQo+Cj4gPiArPWhlYWQzIHBhdGhf ZmlsZV9wYXJ0cygkcGF0aCkKPiA+ICsKPiA+ICtSZXR1cm5zIHRoZSBwYXJ0cyB0aGF0IGNvbnN0 aXR1dGUgdGhlIGZpbGUgbmFtZSAocHJlZml4IGFuZCBzdWZmaXhlcykgb2YgYQo+ID4gK0M8JHBh dGg+IGFzIGEgbGlzdC4gSWYgdGhlIEM8JHBhdGg+IGRvZXMgbm90IGhhdmUgYSB2YWxpZCBmaWxl IG5hbWUsIGFuIGVtcHR5Cj4gPiArbGlzdCBpcyByZXR1cm5lZCBpbnN0ZWFkLgo+ID4gKwo+ID4g K1RoZXNlIHBhcnRzIGFyZSBzcGxpdCBpbiBzdWNoIGEgd2F5IHRoYXQgYWxsb3dzIHRoZW0gdG8g YmUgQzxqb2luPmVkIHRvZ2V0aGVyLAo+ID4gK3Jlc3VsdGluZyBpbiB0aGUgb3JpZ2luYWwgZmls ZSBuYW1lIG9mIHRoZSBnaXZlbiBDPCRwYXRoPiBhZ2Fpbi4KPiA+ICsKPiA+ICsgICAgbXkgQGZp bGVfcGFydHMgPSBwYXRoX2ZpbGVfcGFydHMoIi9ldGMvcHZlL2ZpcmV3YWxsL2NsdXN0ZXIuZnci KTsKPiA+ICsgICAgIyAoImNsdXN0ZXIiLCAiZnciKQo+ID4gKyAgICBteSAkZmlsZV9uYW1lID0g am9pbigiLiIsIEBmaWxlX3BhcnRzKTsKPiA+ICsKPiA+ICsgICAgbXkgQGZpbGVfcGFydHMgPSBw YXRoX2ZpbGVfcGFydHMoIi90bXAvYXJjaGl2ZS50YXIuZ3oiKTsKPiA+ICsgICAgIyAoImFyY2hp dmUiLCAidGFyIiwgImd6IikKPiA+ICsgICAgbXkgJGZpbGVfbmFtZSA9IGpvaW4oIi4iLCBAZmls ZV9wYXJ0cyk7Cj4gPiArCj4gPiArVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBDPCRwYXRoPiBpcyBD PHVuZGVmPi4KPiA+ICsKPgo+IFNob3VsZCBtZW50aW9uIGhvdyBkb3QgZmlsZXMgYXJlIHRyZWF0 ZWQuCgpTdXJlIHRoaW5nIQoKPgo+ID4gKz1jdXQKPiA+ICsKPiA+ICtzdWIgcGF0aF9maWxlX3Bh cnRzIDogcHJvdG90eXBlKCQpIHsKPiA+ICsgICAgbXkgKCRwYXRoKSA9IEBfOwo+ID4gKwo+ID4g KyAgICBjcm9hayAiXCRwYXRoIGlzIHVuZGVmIiBpZiAhZGVmaW5lZCgkcGF0aCk7Cj4gPiArCj4g PiArICAgIG15ICRmaWxlX25hbWUgPSBwYXRoX2ZpbGVfbmFtZSgkcGF0aCk7Cj4gPiArICAgIGlm ICghZGVmaW5lZCgkZmlsZV9uYW1lKSkgewo+ID4gKwlyZXR1cm4gKCk7Cj4gPiArICAgIH0KPiA+ ICsKPiA+ICsgICAgbXkgKCRwcmVmaXgsICRzdWZmaXhfc3RyKSA9IF9wYXRoX2ZpbGVfcHJlZml4 X3N1ZmZpeF9zdHIoJGZpbGVfbmFtZSk7Cj4gPiArICAgIG15IEBzdWZmaXhlcyA9IF9wYXRoX2Zp bGVfc3VmZml4ZXNfZnJvbV9zdHIoJHN1ZmZpeF9zdHIpOwo+ID4gKwo+ID4gKyAgICByZXR1cm4g KCRwcmVmaXgsIEBzdWZmaXhlcyk7Cj4gPiArfQo+ID4gKwo+ID4gKz1oZWFkMyBwYXRoX3N0YXJ0 c193aXRoKCRwYXRoLCAkb3RoZXJfcGF0aCkKPiA+ICsKPiA+ICtDaGVja3Mgd2hldGhlciBhIEM8 JHBhdGg+IHN0YXJ0cyB3aXRoIHRoZSBjb21wb25lbnRzIG9mIEM8JG90aGVyX3BhdGg+Lgo+ID4g Kwo+ID4gKyAgICBteSAkc3RhcnRzX3dpdGggPSBwYXRoX3N0YXJ0c193aXRoKCIvZXRjL3B2ZS9m aXJld2FsbC9jbHVzdGVyLmZ3IiwgIi9ldGMvcHZlIik7Cj4gPiArICAgICMgMQo+ID4gKwo+ID4g K1Rocm93cyBhbiBleGNlcHRpb24gaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgQzx1bmRlZj4u Cj4gPiArCj4KPiBTaG91bGQgZG9jdW1lbnQgdGhlIGJlaGF2aW9yIGZvciBlbXB0eSBwYXRocyBh cyB3ZWxsIGFzIHRoZSBub3JtYWxpemF0aW9uLgoKQUNLLCB3aWxsIGFkZCB0aGF0IQoKPgo+ID4g Kz1jdXQKPiA+ICsKPiA+ICtzdWIgcGF0aF9zdGFydHNfd2l0aCA6IHByb3RvdHlwZSgkJCkgewo+ ID4gKyAgICBteSAoJHBhdGgsICRvdGhlcl9wYXRoKSA9IEBfOwo+ID4gKwo+ID4gKyAgICBjcm9h ayAiXCRwYXRoIGlzIHVuZGVmIiBpZiAhZGVmaW5lZCgkcGF0aCk7Cj4gPiArICAgIGNyb2FrICJc JG90aGVyX3BhdGggaWYgdW5kZWYiIGlmICFkZWZpbmVkKCRvdGhlcl9wYXRoKTsKPiA+ICsKPiA+ ICsgICAgIyBOb3RoaW5nIHN0YXJ0cyB3aXRoIG5vdGhpbmcKPiA+ICsgICAgcmV0dXJuIDEgaWYg KCRwYXRoIGVxICcnICYmICRvdGhlcl9wYXRoIGVxICcnKTsKPiA+ICsKPiA+ICsgICAgIyBOb3Ro aW5nIGNhbm5vdCBzdGFydCB3aXRoIHNvbWV0aGluZwo+ID4gKyAgICAjIFNvbWV0aGluZyBjYW5u b3Qgc3RhcnQgd2l0aCBub3RoaW5nCj4gPiArICAgIHJldHVybiBpZiAoJHBhdGggZXEgJycgfHwg JG90aGVyX3BhdGggZXEgJycpOwo+ID4gKwo+ID4gKyAgICBteSBAY29tcG9uZW50cyA9IHBhdGhf Y29tcG9uZW50cygkcGF0aCk7Cj4gPiArICAgIG15IEBvdGhlcl9jb21wb25lbnRzID0gcGF0aF9j b21wb25lbnRzKCRvdGhlcl9wYXRoKTsKPiA+ICsKPiA+ICsgICAgbXkgQHBhaXJzID0gemlwX3No b3J0ZXN0KFxAY29tcG9uZW50cywgXEBvdGhlcl9jb21wb25lbnRzKTsKPgo+IFdoeSBub3QganVz dCBzaGlmdCBvZmYgZnJvbSBib3RoIGluIGEgbG9vcD8KPgoKU3VyZSwgdGhhdCdzIG9mIGNvdXJz ZSBhbHNvIHBvc3NpYmxlOyBJIGp1c3QgZm91bmQgemlwX3Nob3J0ZXN0IG1vcmUKZXhwcmVzc2l2 ZS4KCj4gPiArCj4gPiArICAgICMgZm9yIG15ICgkY29tcCwgJG90aGVyX2NvbXApIChAcGFpcnMp IGlzIGV4cGVyaW1lbnRhbAo+ID4gKyAgICBmb3IgbXkgJHBhaXIgKEBwYWlycykgewo+ID4gKwlt eSAoJGNvbXAsICRvdGhlcl9jb21wKSA9ICRwYWlyLT5AKjsKPiA+ICsKPiA+ICsJaWYgKCRjb21w IG5lICRvdGhlcl9jb21wKSB7Cj4gPiArCSAgICByZXR1cm47Cj4gPiArCX0KPiA+ICsgICAgfQo+ ID4gKwo+ID4gKyAgICByZXR1cm4gMTsKPiA+ICt9Cj4gPiArCj4gPiArPWhlYWQzIHBhdGhfZW5k c193aXRoKCRwYXRoLCAkb3RoZXJfcGF0aCkKPiA+ICsKPiA+ICtDaGVja3Mgd2hldGhlciBhIEM8 JHBhdGg+IGVuZHMgd2l0aCB0aGUgY29tcG9uZW50cyBvZiBDPCRvdGhlcl9wYXRoPi4KPiA+ICsK PiA+ICsgICAgbXkgJGVuZHNfd2l0aCA9IHBhdGhfZW5kc193aXRoKCIvZXRjL3B2ZS9maXJld2Fs bC9jbHVzdGVyLmZ3IiwgImZpcmV3YWxsL2NsdXN0ZXIuZnciKTsKPiA+ICsgICAgIyAxCj4gPiAr Cj4gPiArVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBDPHVu ZGVmPi4KPiA+ICsKPgo+IFNob3VsZCBkb2N1bWVudCB0aGUgYmVoYXZpb3IgZm9yIGVtcHR5IHBh dGhzIGFzIHdlbGwgYXMgdGhlIG5vcm1hbGl6YXRpb24uCj4KClNhbWUgYXMgYWJvdmU7IHdpbGwg ZG8gdGhhdC4KCj4gPiArPWN1dAo+ID4gKwo+ID4gK3N1YiBwYXRoX2VuZHNfd2l0aCA6IHByb3Rv dHlwZSgkJCkgewo+ID4gKyAgICBteSAoJHBhdGgsICRvdGhlcl9wYXRoKSA9IEBfOwo+ID4gKwo+ ID4gKyAgICBjcm9hayAiXCRwYXRoIGlzIHVuZGVmIiBpZiAhZGVmaW5lZCgkcGF0aCk7Cj4gPiAr ICAgIGNyb2FrICJcJG90aGVyX3BhdGggaWYgdW5kZWYiIGlmICFkZWZpbmVkKCRvdGhlcl9wYXRo KTsKPiA+ICsKPiA+ICsgICAgIyBOb3RoaW5nIGVuZHMgd2l0aCBub3RoaW5nCj4gPiArICAgIHJl dHVybiAxIGlmICgkcGF0aCBlcSAnJyAmJiAkb3RoZXJfcGF0aCBlcSAnJyk7Cj4gPiArCj4gPiAr ICAgICMgTm90aGluZyBjYW5ub3QgZW5kIHdpdGggc29tZXRoaW5nCj4gPiArICAgICMgU29tZXRo aW5nIGNhbm5vdCBlbmQgd2l0aCBub3RoaW5nCj4gPiArICAgIHJldHVybiBpZiAoJHBhdGggZXEg JycgfHwgJG90aGVyX3BhdGggZXEgJycpOwo+ID4gKwo+ID4gKyAgICBteSBAY29tcG9uZW50c19y ZXYgPSByZXZlcnNlKHBhdGhfY29tcG9uZW50cygkcGF0aCkpOwo+ID4gKyAgICBteSBAb3RoZXJf Y29tcG9uZW50c19yZXYgPSByZXZlcnNlKHBhdGhfY29tcG9uZW50cygkb3RoZXJfcGF0aCkpOwo+ ID4gKwo+ID4gKyAgICBteSBAcGFpcnNfcmV2ID0gemlwX3Nob3J0ZXN0KFxAY29tcG9uZW50c19y ZXYsIFxAb3RoZXJfY29tcG9uZW50c19yZXYpOwo+Cj4gV2h5IG5vdCBqdXN0IHNoaWZ0IG9mZiBm cm9tIGJvdGggaW4gYSBsb29wPwo+CgpTYW1lIGFzIGFib3ZlOyBqdXN0IGZvdW5kIHppcF9zaG9y dGVzdCBtb3JlIGV4cHJlc3NpdmUuCgo+ID4gKwo+ID4gKyAgICAjIGZvciBteSAoJGNvbXAsICRv dGhlcl9jb21wKSAoQHBhaXJzX3JldikgaXMgZXhwZXJpbWVudGFsCj4gPiArICAgIGZvciBteSAk cGFpciAoQHBhaXJzX3Jldikgewo+ID4gKwlteSAoJGNvbXAsICRvdGhlcl9jb21wKSA9ICRwYWly LT5AKjsKPiA+ICsKPiA+ICsJaWYgKCRjb21wIG5lICRvdGhlcl9jb21wKSB7Cj4gPiArCSAgICBy ZXR1cm47Cj4gPiArCX0KPiA+ICsgICAgfQo+ID4gKwo+ID4gKyAgICByZXR1cm4gMTsKPiA+ICt9 Cj4gPiArCj4gPiArPWhlYWQzIHBhdGhfZXF1YWxzKCRwYXRoLCAkb3RoZXJfcGF0aCkKPiA+ICsK PiA+ICtDaGVja3Mgd2hldGhlciBDPCRwYXRoPiBlcXVhbHMgQzwkb3RoZXJfcGF0aD4uIFRoZSBw YXRocyBhcmUgY29tcGFyZWQKPiA+ICtieSB0aGVpciBjb21wb25lbnRzLCBtZWFuaW5nIHRoYXQg aXQncyBub3QgbmVjZXNzYXJ5IHRvCj4gPiArTDw8IG5vcm1hbGl6ZXwvInBhdGhfbm9ybWFsaXpl KCRwYXRoKSIgPj4gdGhlbSBiZWZvcmVoYW5kLgo+ID4gKwo+ID4gKz1jdXQKPiA+ICsKPiA+ICtz dWIgcGF0aF9lcXVhbHMgOiBwcm90b3R5cGUoJCQpIHsKPiA+ICsgICAgbXkgKCRwYXRoLCAkb3Ro ZXJfcGF0aCkgPSBAXzsKPiA+ICsKPiA+ICsgICAgY3JvYWsgIlwkcGF0aCBpcyB1bmRlZiIgaWYg IWRlZmluZWQoJHBhdGgpOwo+ID4gKyAgICBjcm9hayAiXCRvdGhlcl9wYXRoIGlmIHVuZGVmIiBp ZiAhZGVmaW5lZCgkb3RoZXJfcGF0aCk7Cj4gPiArCj4gPiArICAgICMgTm90aGluZyBpcyBub3Ro aW5nCj4gPiArICAgIHJldHVybiAxIGlmICgkcGF0aCBlcSAnJyAmJiAkb3RoZXJfcGF0aCBlcSAn Jyk7Cj4gPiArCj4gPiArICAgICMgTm90aGluZyBpcyBub3Qgc29tZXRoaW5nCj4gPiArICAgICMg U29tZXRoaW5nIGlzIG5vdCBub3RoaW5nCj4gPiArICAgIHJldHVybiBpZiAoJHBhdGggZXEgJycg fHwgJG90aGVyX3BhdGggZXEgJycpOwo+ID4gKwo+ID4gKyAgICBteSBAY29tcG9uZW50cyA9IHBh dGhfY29tcG9uZW50cygkcGF0aCk7Cj4gPiArICAgIG15IEBvdGhlcl9jb21wb25lbnRzID0gcGF0 aF9jb21wb25lbnRzKCRvdGhlcl9wYXRoKTsKPiA+ICsKPiA+ICsgICAgcmV0dXJuIGlmIHNjYWxh cihAY29tcG9uZW50cykgIT0gc2NhbGFyKEBvdGhlcl9jb21wb25lbnRzKTsKPiA+ICsKPiA+ICsg ICAgbXkgQHBhaXJzID0gemlwX2xvbmdlc3QoXEBjb21wb25lbnRzLCBcQG90aGVyX2NvbXBvbmVu dHMpOwo+Cj4gV2h5IG5vdCBqdXN0IHNoaWZ0IG9mZiBmcm9tIGJvdGggaW4gYSBsb29wPwo+CgpT aW1pbGFyIHRvIGFib3ZlLCBJIGp1c3QgZm91bmQgemlwX2xvbmdlc3QgbW9yZSBleHByZXNzaXZl LgoKPiA+ICsKPiA+ICsgICAgIyBmb3IgbXkgKCRjb21wLCAkb3RoZXJfY29tcCkgKEBwYWlyc19y ZXYpIGlzIGV4cGVyaW1lbnRhbAo+ID4gKyAgICBmb3IgbXkgJHBhaXIgKEBwYWlycykgewo+ID4g KwlteSAoJGNvbXAsICRvdGhlcl9jb21wKSA9ICRwYWlyLT5AKjsKPiA+ICsKPiA+ICsJcmV0dXJu IGlmICFkZWZpbmVkKCRjb21wKSB8fCAhZGVmaW5lZCgkb3RoZXJfY29tcCk7Cj4gPiArCj4gPiAr CWlmICgkY29tcCBuZSAkb3RoZXJfY29tcCkgewo+ID4gKwkgICAgcmV0dXJuOwo+ID4gKwl9Cj4g PiArICAgIH0KPiA+ICsKPiA+ICsgICAgcmV0dXJuIDE7Cj4gPiArfQo+ID4gKwo+ID4gKzE7CgoK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCnB2ZS1kZXZl bCBtYWlsaW5nIGxpc3QKcHZlLWRldmVsQGxpc3RzLnByb3htb3guY29tCmh0dHBzOi8vbGlzdHMu cHJveG1veC5jb20vY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3B2ZS1kZXZlbAo=