From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from xry111.site (xry111.site [89.208.246.23]) by sourceware.org (Postfix) with ESMTPS id 919963858D3C for ; Fri, 2 Jun 2023 17:32:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 919963858D3C Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=xry111.site Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=xry111.site DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1685727172; bh=kBzPSZu9HpKEcrYEVXqiBt+gpunp44+/oMmGCPcvEKU=; h=Subject:From:To:Date:In-Reply-To:References:From; b=gGKd/Ehqo+0V+eZC2ZuLLoutXxaj04lvxnjfLIMZdQoTStoLNizCFyddoabiEM//8 xARdtfdiTOSp1YpxBr2aSREjj6IWS3iGCc5m70XeLfxoMahhJzted22WdQz+XUymV7 aSWIV3F2MQ/uq3u+WNbVv7HQbIegJk4WuuHvFVDU= Received: from localhost.localdomain (xry111.site [IPv6:2001:470:683e::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id D3DC665A0E; Fri, 2 Jun 2023 13:32:51 -0400 (EDT) Message-ID: <1244c4d8d2ee091855935de1eda1cfb1c0c2b368.camel@xry111.site> Subject: Re: [PATCH] linux: Split tst-ttyname From: Xi Ruoyao To: Adhemerval Zanella , libc-alpha@sourceware.org Date: Sat, 03 Jun 2023 01:32:50 +0800 In-Reply-To: <20230601174432.456518-1-adhemerval.zanella@linaro.org> References: <20230601174432.456518-1-adhemerval.zanella@linaro.org> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.48.1 MIME-Version: 1.0 X-Spam-Status: No, score=-6.4 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,LIKELY_SPAM_FROM,SPF_HELO_PASS,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: T24gVGh1LCAyMDIzLTA2LTAxIGF0IDE0OjQ0IC0wMzAwLCBBZGhlbWVydmFsIFphbmVsbGEgdmlh IExpYmMtYWxwaGEKd3JvdGU6Cj4gVGhlIHRzdC10dHluYW1lIG1heSBmYWlsIGluIGNvbnRhaW5l ciBlbnZpcm9ubWVudHMgd2hpbGUgdHJ5aW5nIHRvCj4gbW91bnQgdGhlIHByb2NmcyBhZnRlciB0 aGUgdW5zaGFyZSAodGVzdCBkb19pbl9jaHJvb3RfMikuwqAgSXQgaXMgbm90Cj4gY2xlYXIgd2h5 IGV4YWNsdHkga2VybmVsIHJldHVybnMgRVBFUk0gaW4gdGhpcyBjYXNlLCB0aGUgY29udGFpbmVy Cj4gZG9lcyBoYXZlIENBUF9TWVNfQ0hST09ULCBTRUxpbnV4L0FwcEFybW9yIGlzIGRpc2FibGVk LCBhbmQgdGhlcmUgaXMKPiBubyBzZWNjb21wIGZpbHRlci4KPiAKPiBUbyBhdm9pZCBhbHdheXMg cmVwb3J0aW5nIHRoZSB0ZXN0IGFzIEZBSUwgaW4gc3VjaCBzY2VuYXJpbywgdGhlCj4gdGVzdCB0 aGF0IHVzZXMgbmV3IG5hbWVzcGFjZXMgaXMgbW92ZWQgdG8gYSBuZXcgb25lIGFuZCB0aGUgZmFp bHVyZQo+IG9uIHRoZSBtb3VudCBjb21tYW5kIGlzIG5vdyByZXBvcnQgYXMgVU5TVVBQT1JURUQu Cj4gCj4gQ2hlY2tlZCBvbiB4ODZfNjQtbGludXgtZ251IGFuZCBhYXJjaDY0LWxpbnV4LWdudS4K Ckl0IGZpeGVzIGEgbG9uZy1zdGFuZGluZyAia25vd24gZmFpbHVyZSIgaW4gTGludXggRnJvbSBT Y3JhdGNoIFsxXS4KClRlc3RlZC1ieTogWGkgUnVveWFvIDx4cnkxMTFAeHJ5MTExLnNpdGU+Cgpb MV06aHR0cHM6Ly93d3cubGludXhmcm9tc2NyYXRjaC5vcmcvbGZzL3ZpZXcvc3lzdGVtZC9jaGFw dGVyMDgvZ2xpYmMuaHRtbAoKPiAtLS0KPiDCoHN5c2RlcHMvdW5peC9zeXN2L2xpbnV4L01ha2Vm aWxlwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqAgMSArCj4gwqBzeXNkZXBzL3VuaXgv c3lzdi9saW51eC90c3QtdHR5bmFtZS1jb21tb24uY8KgIHwgNDE2ICsrKysrKysrKysrKysrCj4g wqAuLi4vdW5peC9zeXN2L2xpbnV4L3RzdC10dHluYW1lLW5hbWVzcGFjZS5jwqDCoCB8IDE0NyAr KysrKwo+IMKgc3lzZGVwcy91bml4L3N5c3YvbGludXgvdHN0LXR0eW5hbWUuY8KgwqDCoMKgwqDC oMKgwqAgfCA1MTIgKy0tLS0tLS0tLS0tLS0tLS0KPiAtCj4gwqA0IGZpbGVzIGNoYW5nZWQsIDU2 NyBpbnNlcnRpb25zKCspLCA1MDkgZGVsZXRpb25zKC0pCj4gwqBjcmVhdGUgbW9kZSAxMDA2NDQg c3lzZGVwcy91bml4L3N5c3YvbGludXgvdHN0LXR0eW5hbWUtY29tbW9uLmMKPiDCoGNyZWF0ZSBt b2RlIDEwMDY0NCBzeXNkZXBzL3VuaXgvc3lzdi9saW51eC90c3QtdHR5bmFtZS1uYW1lc3BhY2Uu Ywo+IAo+IGRpZmYgLS1naXQgYS9zeXNkZXBzL3VuaXgvc3lzdi9saW51eC9NYWtlZmlsZQo+IGIv c3lzZGVwcy91bml4L3N5c3YvbGludXgvTWFrZWZpbGUKPiBpbmRleCA1OTRhNWRjNTNlLi42MWI5 ZTRiZWYwIDEwMDY0NAo+IC0tLSBhL3N5c2RlcHMvdW5peC9zeXN2L2xpbnV4L01ha2VmaWxlCj4g KysrIGIvc3lzZGVwcy91bml4L3N5c3YvbGludXgvTWFrZWZpbGUKPiBAQCAtMjI1LDYgKzIyNSw3 IEBAIHRlc3RzICs9IFwKPiDCoMKgIHRzdC10Z2tpbGwgXAo+IMKgwqAgdHN0LXRpbWVyZmQgXAo+ IMKgwqAgdHN0LXR0eW5hbWUgXAo+ICvCoCB0c3QtdHR5bmFtZS1uYW1lc3BhY2UgXAo+IMKgwqAg IyB0ZXN0cwo+IMKgCj4gwqAjIHByb2Nlc3NfbWFkdmlzZSByZXF1aXJlcyBDQVBfU1lTX0FETUlO Lgo+IGRpZmYgLS1naXQgYS9zeXNkZXBzL3VuaXgvc3lzdi9saW51eC90c3QtdHR5bmFtZS1jb21t b24uYwo+IGIvc3lzZGVwcy91bml4L3N5c3YvbGludXgvdHN0LXR0eW5hbWUtY29tbW9uLmMKPiBu ZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAuLjNmNmQ4ZWU5NDQKPiAtLS0g L2Rldi9udWxsCj4gKysrIGIvc3lzZGVwcy91bml4L3N5c3YvbGludXgvdHN0LXR0eW5hbWUtY29t bW9uLmMKPiBAQCAtMCwwICsxLDQxNiBAQAo+ICsvKiBDb21tb24gZGVmaW5pdGlvbnMgZm9yIHR0 eW5hbWUgdGVzdHMuCj4gK8KgwqAgQ29weXJpZ2h0IChDKSAyMDE3LTIwMjMgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uLCBJbmMuCj4gK8KgwqAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBD IExpYnJhcnkuCj4gKwo+ICvCoMKgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgo+ICvCoMKgIG1vZGlmeSBpdCB1bmRlciB0 aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQo+IGFzCj4g K8KgwqAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDIuMSBvZgo+IHRoZQo+ICvCoMKgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg YW55IGxhdGVyIHZlcnNpb24uCj4gKwo+ICvCoMKgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQo+IHVzZWZ1bCwKPiArwqDCoCBidXQg V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv Zgo+ICvCoMKgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS7CoCBTZWUgdGhlIEdOVQo+ICvCoMKgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuCj4gKwo+ICvCoMKgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh IGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKPiArwqDCoCBMaWNlbnNlIGFs b25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi7CoAo+ IElmCj4gK8KgwqAgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi7CoCAq Lwo+ICsKPiArI2luY2x1ZGUgPGRpcmVudC5oPgo+ICsjaW5jbHVkZSA8ZXJybm8uaD4KPiArI2lu Y2x1ZGUgPGZjbnRsLmg+Cj4gKyNpbmNsdWRlIDxsaW1pdHMuaD4KPiArI2luY2x1ZGUgPHN0ZGJv b2wuaD4KPiArI2luY2x1ZGUgPHN0ZGlvLmg+Cj4gKyNpbmNsdWRlIDxzdGRsaWIuaD4KPiArI2lu Y2x1ZGUgPHN0cmluZy5oPgo+ICsjaW5jbHVkZSA8c3lzL21vdW50Lmg+Cj4gKyNpbmNsdWRlIDxz eXMvcmVzb3VyY2UuaD4KPiArI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Cj4gKyNpbmNsdWRlIDx1bmlz dGQuaD4KPiArCj4gKyNpbmNsdWRlIDxzdXBwb3J0L2NoZWNrLmg+Cj4gKyNpbmNsdWRlIDxzdXBw b3J0L3N1cHBvcnQuaD4KPiArI2luY2x1ZGUgPHN1cHBvcnQvdGVtcF9maWxlLmg+Cj4gKyNpbmNs dWRlIDxzdXBwb3J0L3Rlc3QtZHJpdmVyLmg+Cj4gKyNpbmNsdWRlIDxzdXBwb3J0L3h1bmlzdGQu aD4KPiArCj4gKy8qIGdlbmVyaWMgdXRpbGl0aWVzICovCj4gKwo+ICsjZGVmaW5lCj4gVkVSSUZZ KGV4cHIpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiAr wqAgZG8KPiB7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gK8KgwqDCoCBpZgo+ICghKGV4cHIpKcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiArwqDC oMKgwqDCoAo+IHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gK8KgwqDCoMKgwqDCoMKgIHByaW50ZiAoImVy cm9yOiAlczolZDogJXM6Cj4gJW1cbiIswqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIF9fRklMRV9fLCBfX0xJTkVfXywKPiAjZXhwcik7wqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+ICvCoMKgwqDCoMKgwqDCoCBl eGl0Cj4gKDEpO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBcCj4gK8KgwqDCoMKgwqAKPiB9wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+ICvCoCB9IHdoaWxlICgw KQo+ICsKPiArc3RhdGljIHZvaWQKPiArdG91Y2ggKGNvbnN0IGNoYXIgKnBhdGgsIG1vZGVfdCBt b2RlKQo+ICt7Cj4gK8KgIHhjbG9zZSAoeG9wZW4gKHBhdGgsIE9fV1JPTkxZfE9fQ1JFQVR8T19O T0NUVFksIG1vZGUpKTsKPiArfQo+ICsKPiArc3RhdGljIHNpemVfdAo+ICt0cmltX3ByZWZpeCAo Y2hhciAqc3RyLCBzaXplX3Qgc3RyX2xlbiwgY29uc3QgY2hhciAqcHJlZml4KQo+ICt7Cj4gK8Kg IHNpemVfdCBwcmVmaXhfbGVuID0gc3RybGVuIChwcmVmaXgpOwo+ICvCoCBpZiAoc3RyX2xlbiA+ IHByZWZpeF9sZW4gJiYgbWVtY21wIChzdHIsIHByZWZpeCwgcHJlZml4X2xlbikgPT0gMCkKPiAr wqDCoMKgIHsKPiArwqDCoMKgwqDCoCBtZW1tb3ZlIChzdHIsIHN0ciArIHByZWZpeF9sZW4sIHN0 cl9sZW4gLSBwcmVmaXhfbGVuKTsKPiArwqDCoMKgwqDCoCByZXR1cm4gc3RyX2xlbiAtIHByZWZp eF9sZW47Cj4gK8KgwqDCoCB9Cj4gK8KgIHJldHVybiBzdHJfbGVuOwo+ICt9Cj4gKwo+ICsvKiBy ZXR1cm5zIGEgcG9pbnRlciB0byBzdGF0aWMgc3RvcmFnZSAqLwo+ICtzdGF0aWMgY2hhciAqCj4g K3Byb2NfZmRfcmVhZGxpbmsgKGNvbnN0IGNoYXIgKmxpbmtuYW1lKQo+ICt7Cj4gK8KgIHN0YXRp YyBjaGFyIHRhcmdldFtQQVRIX01BWCsxXTsKPiArwqAgc3NpemVfdCB0YXJnZXRfbGVuID0gcmVh ZGxpbmsgKGxpbmtuYW1lLCB0YXJnZXQsIFBBVEhfTUFYKTsKPiArwqAgVkVSSUZZICh0YXJnZXRf bGVuID4gMCk7Cj4gK8KgIHRhcmdldF9sZW4gPSB0cmltX3ByZWZpeCAodGFyZ2V0LCB0YXJnZXRf bGVuLCAiKHVucmVhY2hhYmxlKSIpOwo+ICvCoCB0YXJnZXRbdGFyZ2V0X2xlbl0gPSAnXDAnOwo+ ICvCoCByZXR1cm4gdGFyZ2V0Owo+ICt9Cj4gKwo+ICsvKiBwbGFpbiB0dHluYW1lIHJ1bm5lciAq Lwo+ICsKPiArc3RydWN0IHJlc3VsdAo+ICt7Cj4gK8KgIGNvbnN0IGNoYXIgKm5hbWU7Cj4gK8Kg IGludCBlcnI7Cj4gK307Cj4gKwo+ICsvKiBzdHJpbmdzIGluIHJlc3VsdCBzdHJ1Y3R1cmUgYXJl IGluIHN0YXRpYyBzdG9yYWdlICovCj4gK3N0YXRpYyBzdHJ1Y3QgcmVzdWx0Cj4gK3J1bl90dHlu YW1lIChpbnQgZmQpCj4gK3sKPiArwqAgc3RydWN0IHJlc3VsdCByZXQ7Cj4gK8KgIGVycm5vID0g MDsKPiArwqAgcmV0Lm5hbWUgPSB0dHluYW1lIChmZCk7Cj4gK8KgIHJldC5lcnIgPSBlcnJubzsK PiArwqAgcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wKPiArZXFfdHR5bmFtZSAo c3RydWN0IHJlc3VsdCBhY3R1YWwsIHN0cnVjdCByZXN1bHQgZXhwZWN0ZWQpCj4gK3sKPiArwqAg Y2hhciAqYWN0dWFsX25hbWUsICpleHBlY3RlZF9uYW1lOwo+ICsKPiArwqAgaWYgKChhY3R1YWwu ZXJyID09IGV4cGVjdGVkLmVycikKPiArwqDCoMKgwqDCoCAmJiAoIWFjdHVhbC5uYW1lID09ICFl eHBlY3RlZC5uYW1lKQo+ICvCoMKgwqDCoMKgICYmIChhY3R1YWwubmFtZSA/IHN0cmNtcCAoYWN0 dWFsLm5hbWUsIGV4cGVjdGVkLm5hbWUpID09IDAgOgo+IHRydWUpKQo+ICvCoMKgwqAgewo+ICvC oMKgwqDCoMKgIGlmIChleHBlY3RlZC5uYW1lKQo+ICvCoMKgwqDCoMKgwqDCoCBleHBlY3RlZF9u YW1lID0geGFzcHJpbnRmICgiXCIlc1wiIiwgZXhwZWN0ZWQubmFtZSk7Cj4gK8KgwqDCoMKgwqAg ZWxzZQo+ICvCoMKgwqDCoMKgwqDCoGV4cGVjdGVkX25hbWUgPSB4c3RyZHVwICgiTlVMTCIpOwo+ ICsKPiArwqDCoMKgwqDCoCBwcmludGYgKCJpbmZvOsKgwqDCoMKgwqAgdHR5bmFtZTogUEFTUyB7 bmFtZT0lcywgZXJybm89JWR9XG4iLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXhwZWN0 ZWRfbmFtZSwgZXhwZWN0ZWQuZXJyKTsKPiArCj4gK8KgwqDCoMKgwqAgZnJlZSAoZXhwZWN0ZWRf bmFtZSk7Cj4gK8KgwqDCoMKgwqAgcmV0dXJuIHRydWU7Cj4gK8KgwqDCoCB9Cj4gKwo+ICvCoCBp ZiAoYWN0dWFsLm5hbWUpCj4gK8KgwqDCoCBhY3R1YWxfbmFtZSA9IHhhc3ByaW50ZiAoIlwiJXNc IiIsIGFjdHVhbC5uYW1lKTsKPiArwqAgZWxzZQo+ICvCoMKgwqAgYWN0dWFsX25hbWUgPSB4c3Ry ZHVwICgiTlVMTCIpOwo+ICsKPiArwqAgaWYgKGV4cGVjdGVkLm5hbWUpCj4gK8KgwqDCoCBleHBl Y3RlZF9uYW1lID0geGFzcHJpbnRmICgiXCIlc1wiIiwgZXhwZWN0ZWQubmFtZSk7Cj4gK8KgIGVs c2UKPiArwqDCoMKgIGV4cGVjdGVkX25hbWUgPSB4c3RyZHVwICgiTlVMTCIpOwo+ICsKPiArwqAg cHJpbnRmICgiZXJyb3I6wqDCoMKgwqAgdHR5bmFtZTogYWN0dWFsIHtuYW1lPSVzLCBlcnJubz0l ZH0gIT0gZXhwZWN0ZWQKPiB7bmFtZT0lcywgZXJybm89JWR9XG4iLAo+ICvCoMKgwqDCoMKgwqDC oMKgIGFjdHVhbF9uYW1lLCBhY3R1YWwuZXJyLAo+ICvCoMKgwqDCoMKgwqDCoMKgIGV4cGVjdGVk X25hbWUsIGV4cGVjdGVkLmVycik7Cj4gKwo+ICvCoCBmcmVlIChhY3R1YWxfbmFtZSk7Cj4gK8Kg IGZyZWUgKGV4cGVjdGVkX25hbWUpOwo+ICvCoCByZXR1cm4gZmFsc2U7Cj4gK30KPiArCj4gKy8q IHR0eW5hbWVfciBydW5uZXIgKi8KPiArCj4gK3N0cnVjdCByZXN1bHRfcgo+ICt7Cj4gK8KgIGNv bnN0IGNoYXIgKm5hbWU7Cj4gK8KgIGludCByZXQ7Cj4gK8KgIGludCBlcnI7Cj4gK307Cj4gKwo+ ICsvKiBzdHJpbmdzIGluIHJlc3VsdCBzdHJ1Y3R1cmUgYXJlIGluIHN0YXRpYyBzdG9yYWdlICov Cj4gK3N0YXRpYyBzdHJ1Y3QgcmVzdWx0X3IKPiArcnVuX3R0eW5hbWVfciAoaW50IGZkKQo+ICt7 Cj4gK8KgIHN0YXRpYyBjaGFyIGJ1ZltUVFlfTkFNRV9NQVhdOwo+ICsKPiArwqAgc3RydWN0IHJl c3VsdF9yIHJldDsKPiArwqAgZXJybm8gPSAwOwo+ICvCoCByZXQucmV0ID0gdHR5bmFtZV9yIChm ZCwgYnVmLCBUVFlfTkFNRV9NQVgpOwo+ICvCoCByZXQuZXJyID0gZXJybm87Cj4gK8KgIGlmIChy ZXQucmV0ID09IDApCj4gK8KgwqDCoCByZXQubmFtZSA9IGJ1ZjsKPiArwqAgZWxzZQo+ICvCoMKg wqAgcmV0Lm5hbWUgPSBOVUxMOwo+ICvCoCByZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMg Ym9vbAo+ICtlcV90dHluYW1lX3IgKHN0cnVjdCByZXN1bHRfciBhY3R1YWwsIHN0cnVjdCByZXN1 bHRfciBleHBlY3RlZCkKPiArewo+ICvCoCBjaGFyICphY3R1YWxfbmFtZSwgKmV4cGVjdGVkX25h bWU7Cj4gKwo+ICvCoCBpZiAoKGFjdHVhbC5lcnIgPT0gZXhwZWN0ZWQuZXJyKQo+ICvCoMKgwqDC oMKgICYmIChhY3R1YWwucmV0ID09IGV4cGVjdGVkLnJldCkKPiArwqDCoMKgwqDCoCAmJiAoIWFj dHVhbC5uYW1lID09ICFleHBlY3RlZC5uYW1lKQo+ICvCoMKgwqDCoMKgICYmIChhY3R1YWwubmFt ZSA/IHN0cmNtcCAoYWN0dWFsLm5hbWUsIGV4cGVjdGVkLm5hbWUpID09IDAgOgo+IHRydWUpKQo+ ICvCoMKgwqAgewo+ICvCoMKgwqDCoMKgIGlmIChleHBlY3RlZC5uYW1lKQo+ICvCoMKgwqDCoMKg wqDCoCBleHBlY3RlZF9uYW1lID0geGFzcHJpbnRmICgiXCIlc1wiIiwgZXhwZWN0ZWQubmFtZSk7 Cj4gK8KgwqDCoMKgwqAgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoCBleHBlY3RlZF9uYW1lID0geHN0 cmR1cCAoIk5VTEwiKTsKPiArCj4gK8KgwqDCoMKgwqAgcHJpbnRmICgiaW5mbzrCoMKgwqDCoMKg IHR0eW5hbWVfcjogUEFTUyB7bmFtZT0lcywgcmV0PSVkLAo+IGVycm5vPSVkfVxuIiwKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXhwZWN0ZWRfbmFtZSwgZXhwZWN0ZWQucmV0LCBleHBl Y3RlZC5lcnIpOwo+ICsKPiArwqDCoMKgwqDCoCBmcmVlIChleHBlY3RlZF9uYW1lKTsKPiArwqDC oMKgwqDCoCByZXR1cm4gdHJ1ZTsKPiArwqDCoMKgIH0KPiArCj4gK8KgIGlmIChhY3R1YWwubmFt ZSkKPiArwqDCoMKgIGFjdHVhbF9uYW1lID0geGFzcHJpbnRmICgiXCIlc1wiIiwgYWN0dWFsLm5h bWUpOwo+ICvCoCBlbHNlCj4gK8KgwqDCoCBhY3R1YWxfbmFtZSA9IHhzdHJkdXAgKCJOVUxMIik7 Cj4gKwo+ICvCoCBpZiAoZXhwZWN0ZWQubmFtZSkKPiArwqDCoMKgIGV4cGVjdGVkX25hbWUgPSB4 YXNwcmludGYgKCJcIiVzXCIiLCBleHBlY3RlZC5uYW1lKTsKPiArwqAgZWxzZQo+ICvCoMKgwqAg ZXhwZWN0ZWRfbmFtZSA9IHhzdHJkdXAgKCJOVUxMIik7Cj4gKwo+ICvCoCBwcmludGYgKCJlcnJv cjrCoMKgwqDCoCB0dHluYW1lX3I6IGFjdHVhbCB7bmFtZT0lcywgcmV0PSVkLCBlcnJubz0lZH0K PiAhPSBleHBlY3RlZCB7bmFtZT0lcywgcmV0PSVkLCBlcnJubz0lZH1cbiIsCj4gK8KgwqDCoMKg wqDCoMKgwqAgYWN0dWFsX25hbWUsIGFjdHVhbC5yZXQsIGFjdHVhbC5lcnIsCj4gK8KgwqDCoMKg wqDCoMKgwqAgZXhwZWN0ZWRfbmFtZSwgZXhwZWN0ZWQucmV0LCBleHBlY3RlZC5lcnIpOwo+ICsK PiArwqAgZnJlZSAoYWN0dWFsX25hbWUpOwo+ICvCoCBmcmVlIChleHBlY3RlZF9uYW1lKTsKPiAr wqAgcmV0dXJuIGZhbHNlOwo+ICt9Cj4gKwo+ICsvKiBjb21iaW5lZCBydW5uZXIgKi8KPiArCj4g K3N0YXRpYyBib29sCj4gK2RvaXQgKGludCBmZCwgY29uc3QgY2hhciAqdGVzdG5hbWUsIHN0cnVj dCByZXN1bHRfciBleHBlY3RlZF9yKQo+ICt7Cj4gK8KgIHN0cnVjdCByZXN1bHQgZXhwZWN0ZWQg PSB7Lm5hbWU9ZXhwZWN0ZWRfci5uYW1lLAo+IC5lcnI9ZXhwZWN0ZWRfci5yZXR9Owo+ICvCoCBi b29sIHJldCA9IHRydWU7Cj4gKwo+ICvCoCBwcmludGYgKCJpbmZvOsKgwqDCoCB0ZXN0Y2FzZTog JXNcbiIsIHRlc3RuYW1lKTsKPiArCj4gK8KgIGlmICghZXFfdHR5bmFtZSAocnVuX3R0eW5hbWUg KGZkKSwgZXhwZWN0ZWQpKQo+ICvCoMKgwqAgcmV0ID0gZmFsc2U7Cj4gK8KgIGlmICghZXFfdHR5 bmFtZV9yIChydW5fdHR5bmFtZV9yIChmZCksIGV4cGVjdGVkX3IpKQo+ICvCoMKgwqAgcmV0ID0g ZmFsc2U7Cj4gKwo+ICvCoCBpZiAoIXJldCkKPiArwqDCoMKgIHN1cHBvcnRfcmVjb3JkX2ZhaWx1 cmUgKCk7Cj4gKwo+ICvCoCByZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICsvKiBjaHJvb3Qgc2V0dXAg Ki8KPiArCj4gK3N0YXRpYyBjaGFyICpjaHJvb3RkaXI7Cj4gKwo+ICtzdGF0aWMgdm9pZAo+ICtw cmVwYXJlIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCj4gK3sKPiArwqAgY2hyb290ZGlyID0geGFz cHJpbnRmICgiJXMvdHN0LXR0eW5hbWUtWFhYWFhYIiwgdGVzdF9kaXIpOwo+ICvCoCBpZiAobWtk dGVtcCAoY2hyb290ZGlyKSA9PSBOVUxMKQo+ICvCoMKgwqAgRkFJTF9FWElUMSAoIm1rZHRlbXAg KFwiJXNcIik6ICVtIiwgY2hyb290ZGlyKTsKPiArwqAgYWRkX3RlbXBfZmlsZSAoY2hyb290ZGly KTsKPiArfQo+ICsjZGVmaW5lIFBSRVBBUkUgcHJlcGFyZQo+ICsKPiArLyogQWRqdXN0IHRoZSBm aWxlIGxpbWl0IHNvIHRoYXQgd2UgaGF2ZSBhIGNoYW5jZSB0byBvcGVuIFBUWS7CoCAqLwo+ICtz dGF0aWMgdm9pZAo+ICthZGp1c3RfZmlsZV9saW1pdCAoY29uc3QgY2hhciAqcHR5KQo+ICt7Cj4g K8KgIGludCBudW1iZXIgPSAtMTsKPiArwqAgaWYgKHNzY2FuZiAocHR5LCAiL2Rldi9wdHMvJWQi LCAmbnVtYmVyKSAhPSAxIHx8IG51bWJlciA8IDApCj4gK8KgwqDCoCBGQUlMX0VYSVQxICgiaW52 YWxpZCBQVFkgbmFtZTogXCIlc1wiIiwgcHR5KTsKPiArCj4gK8KgIC8qIEFkZCBhIGZldyBhZGRp dGlvbmFsIGRlc2NyaXB0b3JzIHRvIGNvdmVyIHN0YW5kYXJkIEkvTyBzdHJlYW1zCj4gK8KgwqDC oMKgIGV0Yy7CoCAqLwo+ICvCoCBybGltX3QgZGVzaXJlZF9saW1pdCA9IG51bWJlciArIDEwOwo+ ICsKPiArwqAgc3RydWN0IHJsaW1pdCBsaW07Cj4gK8KgIGlmIChnZXRybGltaXQgKFJMSU1JVF9O T0ZJTEUsICZsaW0pICE9IDApCj4gK8KgwqDCoCBGQUlMX0VYSVQxICgiZ2V0cmxpbWl0IChSTElN SVRfTk9GSUxFKTogJW0iKTsKPiArwqAgaWYgKGxpbS5ybGltX2N1ciA8IGRlc2lyZWRfbGltaXQp Cj4gK8KgwqDCoCB7Cj4gK8KgwqDCoMKgwqAgcHJpbnRmICgiaW5mbzogYWRqdXN0aW5nIFJMSU1J VF9OT0ZJTEUgZnJvbSAlbGx1IHRvICVsbHVcbiIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAodW5zaWduZWQgbG9uZyBsb25nIGludCkgbGltLnJsaW1fY3VyLAo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIGRlc2lyZWRfbGltaXQpOwo+ICvC oMKgwqDCoMKgIGxpbS5ybGltX2N1ciA9IGRlc2lyZWRfbGltaXQ7Cj4gK8KgwqDCoMKgwqAgaWYg KHNldHJsaW1pdCAoUkxJTUlUX05PRklMRSwgJmxpbSkgIT0gMCkKPiArwqDCoMKgwqDCoMKgwqBw cmludGYgKCJ3YXJuaW5nOiBzZXRybGltaXQgKFJMSU1JVF9OT0ZJTEUpIGZhaWxlZDogJW1cbiIp Owo+ICvCoMKgwqAgfQo+ICt9Cj4gKwo+ICsvKiBtYWluIHRlc3QgKi8KPiArCj4gK3N0YXRpYyBp bnQKPiArcnVuX2Nocm9vdF90ZXN0cyAoY29uc3QgY2hhciAqc2xhdmVuYW1lLCBpbnQgc2xhdmUp Cj4gK3sKPiArwqAgc3RydWN0IHN0YXQgc3Q7Cj4gK8KgIGJvb2wgb2sgPSB0cnVlOwo+ICsKPiAr wqAgLyogVGhlcmUgYXJlIDMgZ3JvdXBzIG9mIHRlc3RzIGhlcmUuwqAgVGhlIGZpcnN0IGdyb3Vw IGZhaXJseQo+ICvCoMKgwqDCoCBnZW5lcmljYWxseSBkb2VzIHRoaW5ncyBrbm93biB0byBtZXNz IHVwIHR0eW5hbWUsIGFuZCB2ZXJpZmllcwo+ICvCoMKgwqDCoCB0aGF0IHR0eW5hbWUgY29wZXMg Y29ycmVjdGx5LsKgIFRoZSByZW1haW5pbmcgZ3JvdXBzIGFyZQo+ICvCoMKgwqDCoCBpbmNyZWFz aW5nbHkgY29udm9sdXRlZCwgYXMgd2UgdGFyZ2V0IHNwZWNpZmljIHBhcnRzIG9mIHR0eW5hbWUK PiArwqDCoMKgwqAgdG8gdHJ5IHRvIGNvbmZ1c2UuwqAgKi8KPiArCj4gK8KgIC8qIEJhc2ljIHRl c3RzIHRoYXQgaXQgZG9lc24ndCBnZXQgY29uZnVzZWQgYnkgbXVsdGlwbGUgZGV2cHRzCj4gK8Kg wqDCoMKgIGluc3RhbmNlcy7CoCAqLwo+ICvCoCB7Cj4gK8KgwqDCoCBWRVJJRlkgKHN0YXQgKHNs YXZlbmFtZSwgJnN0KSA8IDApOyAvKiBzYW5pdHkgY2hlY2sgKi8KPiArwqDCoMKgIGlmICghZG9p dCAoc2xhdmUsICJubyBjb25mbGljdCwgbm8gbWF0Y2giLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIChzdHJ1Y3QgcmVzdWx0X3Ipey5uYW1lPU5VTEwsIC5yZXQ9RU5PREVWLAo+IC5l cnI9RU5PREVWfSkpCj4gK8KgwqDCoMKgwqAgb2sgPSBmYWxzZTsKPiArwqDCoMKgIFZFUklGWSAo bW91bnQgKCIvY29uc29sZSIsICIvZGV2L2NvbnNvbGUiLCBOVUxMLCBNU19CSU5ELCBOVUxMKQo+ ID09IDApOwo+ICvCoMKgwqAgaWYgKCFkb2l0IChzbGF2ZSwgIm5vIGNvbmZsaWN0LCBjb25zb2xl IiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoc3RydWN0IHJlc3VsdF9yKXsubmFt ZT0iL2Rldi9jb25zb2xlIiwgLnJldD0wLAo+IC5lcnI9MH0pKQo+ICvCoMKgwqDCoMKgIG9rID0g ZmFsc2U7Cj4gK8KgwqDCoCBWRVJJRlkgKHVtb3VudCAoIi9kZXYvY29uc29sZSIpID09IDApOwo+ ICsKPiArwqDCoMKgIC8qIEtlZXAgY3JlYXRpbmcgUFRZcyB1bnRpbCB3ZSB3ZSBnZXQgYSBuYW1l IGNvbGxpc2lvbi7CoCAqLwo+ICvCoMKgwqAgd2hpbGUgKHRydWUpCj4gK8KgwqDCoMKgwqAgewo+ ICvCoMKgwqDCoMKgwqDCoGlmIChzdGF0IChzbGF2ZW5hbWUsICZzdCkgPT0gMCkKPiArwqDCoMKg wqDCoMKgwqDCoCBicmVhazsKPiArwqDCoMKgwqDCoMKgwqBpZiAocG9zaXhfb3BlbnB0IChPX1JE V1J8T19OT0NUVFl8T19OT05CTE9DSykgPCAwKQo+ICvCoMKgwqDCoMKgwqDCoMKgIHsKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqAgaWYgKGVycm5vID09IEVOT1NQQyB8fCBlcnJubyA9PSBFTUZJTEUg fHwgZXJybm8gPT0gRU5GSUxFKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRkFJTF9VTlNV UFBPUlRFRCAoImNhbm5vdCByZS1jcmVhdGUgUFRZIFwiJXNcIiBpbgo+IGNocm9vdDogJW0iCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIiAoY29uc2lkZXIgaW5jcmVhc2luZyBsaW1pdHMpIiwKPiBzbGF2ZW5hbWUpOwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoCBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGQUlM X0VYSVQxICgiY2Fubm90IHJlLWNyZWF0ZSBQVFkgXCIlc1wiIGNocm9vdDogJW0iLAo+IHNsYXZl bmFtZSk7Cj4gK8KgwqDCoMKgwqDCoMKgwqAgfQo+ICvCoMKgwqDCoMKgIH0KPiArCj4gK8KgwqDC oCBpZiAoIWRvaXQgKHNsYXZlLCAiY29uZmxpY3QsIG5vIG1hdGNoIiwKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAoc3RydWN0IHJlc3VsdF9yKXsubmFtZT1OVUxMLCAucmV0PUVOT0RF ViwKPiAuZXJyPUVOT0RFVn0pKQo+ICvCoMKgwqDCoMKgIG9rID0gZmFsc2U7Cj4gK8KgwqDCoCBW RVJJRlkgKG1vdW50ICgiL2NvbnNvbGUiLCAiL2Rldi9jb25zb2xlIiwgTlVMTCwgTVNfQklORCwg TlVMTCkKPiA9PSAwKTsKPiArwqDCoMKgIGlmICghZG9pdCAoc2xhdmUsICJjb25mbGljdCwgY29u c29sZSIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHN0cnVjdCByZXN1bHRfcil7 Lm5hbWU9Ii9kZXYvY29uc29sZSIsIC5yZXQ9MCwKPiAuZXJyPTB9KSkKPiArwqDCoMKgwqDCoCBv ayA9IGZhbHNlOwo+ICvCoMKgwqAgVkVSSUZZICh1bW91bnQgKCIvZGV2L2NvbnNvbGUiKSA9PSAw KTsKPiArwqAgfQo+ICsKPiArwqAgLyogVGhlIGZpcnN0IHRlc3RzIGtpbmRhIGFzc3VtZWQgdGhh dCB0aGV5IGhpdCBjZXJ0YWluIGNvZGUtcGF0aHMKPiArwqDCoMKgwqAgYmFzZWQgb24gYXNzdW1p bmcgdGhhdCB0aGUgcmVhZGxpbmsgdGFyZ2V0IGlzICdzbGF2ZW5hbWUnLCBidXQKPiArwqDCoMKg wqAgdGhhdCdzIG5vdCBxdWl0ZSBhbHdheXMgdHJ1ZS7CoCBUaGV5J3JlIHN0aWxsIGEgZ29vZCBw cmVsaW1pbmFyeQo+ICvCoMKgwqDCoCBzYW5pdHkgY2hlY2ssIHNvIGtlZXAgdGhlbSwgYnV0IGxl dCdzIGFkZCB0ZXN0cyB0aGF0IG1ha2Ugc3VyZQo+ICvCoMKgwqDCoCB0aGF0IHRob3NlIGNvZGUt cGF0aHMgYXJlIGhpdCBieSBkb2luZyBhIHJlYWRsaW5rIG91cnNlbGYuwqAgKi8KPiArwqAgewo+ ICvCoMKgwqAgY2hhciAqbGlua25hbWUgPSB4YXNwcmludGYgKCIvcHJvYy9zZWxmL2ZkLyVkIiwg c2xhdmUpOwo+ICvCoMKgwqAgY2hhciAqdGFyZ2V0ID0gcHJvY19mZF9yZWFkbGluayAobGlua25h bWUpOwo+ICvCoMKgwqAgZnJlZSAobGlua25hbWUpOwo+ICvCoMKgwqAgLyogRGVwZW5kaW5nIG9u IGhvdyB3ZSBzZXQgdXAgdGhlIGNocm9vdCwgdGhlIGtlcm5lbCBtYXkgb3IgbWF5Cj4gbm90Cj4g K8KgwqDCoMKgwqDCoCB0cmltIHRoZSBsZWFkaW5nIHBhdGggdG8gdGhlIHRhcmdldCAoaXQgbWF5 IGdpdmUgdXMgIi82IiwKPiArwqDCoMKgwqDCoMKgIGluc3RlYWQgb2YgIi9kZXYvcHRzLzYiKS7C oCBXZSB0ZXN0IGl0IGJvdGggd2F5cwo+IChkb19pbl9jaHJvb3RfMQo+ICvCoMKgwqDCoMKgwqAg YW5kIGRvX2luX2Nocm9vdF8yKS7CoCBUaGlzIHRlc3QgZ3JvdXAgcmVsaWVzIG9uIHRoZSB0YXJn ZXQKPiArwqDCoMKgwqDCoMKgIGV4aXN0aW5nLCBzbyBndWFyYW50ZWUgdGhhdCBpdCBkb2VzIGV4 aXN0IGJ5IGNyZWF0aW5nIGl0IGlmCj4gK8KgwqDCoMKgwqDCoCBuZWNlc3NhcnkuwqAgKi8KPiAr wqDCoMKgIGlmIChzdGF0ICh0YXJnZXQsICZzdCkgPCAwKQo+ICvCoMKgwqDCoMKgIHsKPiArwqDC oMKgwqDCoMKgwqAgVkVSSUZZIChlcnJubyA9PSBFTk9FTlQpOwo+ICvCoMKgwqDCoMKgwqDCoCB0 b3VjaCAodGFyZ2V0LCAwKTsKPiArwqDCoMKgwqDCoCB9Cj4gKwo+ICvCoMKgwqAgVkVSSUZZICht b3VudCAoIi9jb25zb2xlIiwgIi9kZXYvY29uc29sZSIsIE5VTEwsIE1TX0JJTkQsIE5VTEwpCj4g PT0gMCk7Cj4gK8KgwqDCoCBWRVJJRlkgKG1vdW50ICgiL2NvbnNvbGUiLCB0YXJnZXQsIE5VTEws IE1TX0JJTkQsIE5VTEwpID09IDApOwo+ICvCoMKgwqAgaWYgKCFkb2l0IChzbGF2ZSwgIndpdGgg cmVhZGxpbmsgdGFyZ2V0IiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoc3RydWN0 IHJlc3VsdF9yKXsubmFtZT10YXJnZXQsIC5yZXQ9MCwgLmVycj0wfSkpCj4gK8KgwqDCoMKgwqAg b2sgPSBmYWxzZTsKPiArwqDCoMKgIFZFUklGWSAodW1vdW50ICh0YXJnZXQpID09IDApOwo+ICvC oMKgwqAgVkVSSUZZICh1bW91bnQgKCIvZGV2L2NvbnNvbGUiKSA9PSAwKTsKPiArCj4gK8KgwqDC oCBWRVJJRlkgKG1vdW50ICgiL2NvbnNvbGUiLCAiL2Rldi9jb25zb2xlIiwgTlVMTCwgTVNfQklO RCwgTlVMTCkKPiA9PSAwKTsKPiArwqDCoMKgIFZFUklGWSAobW91bnQgKHNsYXZlbmFtZSwgdGFy Z2V0LCBOVUxMLCBNU19CSU5ELCBOVUxMKSA9PSAwKTsKPiArwqDCoMKgIGlmICghZG9pdCAoc2xh dmUsICJ3aXRoIHJlYWRsaW5rIHRyYXA7IGZhbGxiYWNrIiwKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAoc3RydWN0IHJlc3VsdF9yKXsubmFtZT0iL2Rldi9jb25zb2xlIiwgLnJldD0w LAo+IC5lcnI9MH0pKQo+ICvCoMKgwqDCoMKgIG9rID0gZmFsc2U7Cj4gK8KgwqDCoCBWRVJJRlkg KHVtb3VudCAodGFyZ2V0KSA9PSAwKTsKPiArwqDCoMKgIFZFUklGWSAodW1vdW50ICgiL2Rldi9j b25zb2xlIikgPT0gMCk7Cj4gKwo+ICvCoMKgwqAgVkVSSUZZIChtb3VudCAoc2xhdmVuYW1lLCB0 YXJnZXQsIE5VTEwsIE1TX0JJTkQsIE5VTEwpID09IDApOwo+ICvCoMKgwqAgaWYgKCFkb2l0IChz bGF2ZSwgIndpdGggcmVhZGxpbmsgdHJhcDsgbm8gZmFsbGJhY2siLAo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIChzdHJ1Y3QgcmVzdWx0X3Ipey5uYW1lPU5VTEwsIC5yZXQ9RU5PREVW LAo+IC5lcnI9RU5PREVWfSkpCj4gK8KgwqDCoMKgwqAgb2sgPSBmYWxzZTsKPiArwqDCoMKgIFZF UklGWSAodW1vdW50ICh0YXJnZXQpID09IDApOwo+ICvCoCB9Cj4gKwo+ICvCoCAvKiBUaGlzIHRl c3QgbWFrZXMgc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgc3RpbGwgd29ya3MgT0sgaWYgcmVhZGRpcgo+ ICvCoMKgwqDCoCBmaW5kcyBhIHBzZXVkby1tYXRjaCBiZWZvcmUgYW5kL29yIGFmdGVyIHRoZSBh Y3R1YWwgbWF0Y2guwqAgTm93LAo+ICvCoMKgwqDCoCB0byBkbyB0aGF0LCB3ZSBuZWVkIHRvIGNv bnRyb2wgdGhhdCByZWFkZGlyIGZpbmRzIHRoZQo+ICvCoMKgwqDCoCBwc2V1ZG8tbWF0Y2hlcyBi ZWZvcmUgYW5kIGFmdGVyIHRoZSBhY3R1YWwgbWF0Y2g7IGFuZCB0aGVyZSdzIG5vCj4gK8KgwqDC oMKgIGdvb2Qgd2F5IHRvIGNvbnRyb2wgdGhhdCBvcmRlciBpbiBhYnNlbmNlIG9mIHdoaXRlYm94 IHRlc3RpbmcuCj4gK8KgwqDCoMKgIFNvLCBqdXN0IGNyZWF0ZSAzIGZpbGVzLCB0aGVuIHVzZSBv cGVuZGlyL3JlYWRkaXIgdG8gc2VlIHdoYXQKPiArwqDCoMKgwqAgb3JkZXIgdGhleSBhcmUgaW4s IGFuZCBhc3NpZ24gbWVhbmluZyBiYXNlZCBvbiB0aGF0IG9yZGVyLCBub3QKPiBieQo+ICvCoMKg wqDCoCBuYW1lOyBhc3NpZ25pbmcgdGhlIGZpcnN0IHRvIGJlIGEgcHNldWRvLW1hdGNoLCB0aGUg c2Vjb25kIHRvIGJlCj4gK8KgwqDCoMKgIHRoZSBhY3R1YWwgbWF0Y2gsIGFuZCB0aGUgdGhpcmQg dG8gYmUgYSBwc2V1ZG8tbWF0Y2guwqAgVGhpcwo+ICvCoMKgwqDCoCBhc3N1bWVzIHRoYXQgKG9u IHRtcGZzKSBvcmRlcmluZyB3aXRoaW4gdGhlIGRpcmVjdG9yeSBpcyBzdGFibGUKPiArwqDCoMKg wqAgaW4gdGhlIGFic2VuY2Ugb2YgbW9kaWZpY2F0aW9uLCB3aGljaCBzZWVtcyByZWFzb25hYmx5 IHNhZmUuwqAgKi8KPiArwqAgewo+ICvCoMKgwqAgLyogc2luY2Ugd2UncmUgdGVzdGluZyB0aGUg ZmFsbGJhY2sgc2VhcmNoLCBkaXNhYmxlIHRoZSByZWFkbGluawo+ICvCoMKgwqDCoMKgwqAgaGFw cHktcGF0aCAqLwo+ICvCoMKgwqAgVkVSSUZZICh1bW91bnQyICgiL3Byb2MiLCBNTlRfREVUQUNI KSA9PSAwKTsKPiArCj4gK8KgwqDCoCB0b3VjaCAoIi9kZXYvY29uc29sZTEiLCAwKTsKPiArwqDC oMKgIHRvdWNoICgiL2Rldi9jb25zb2xlMiIsIDApOwo+ICvCoMKgwqAgdG91Y2ggKCIvZGV2L2Nv bnNvbGUzIiwgMCk7Cj4gKwo+ICvCoMKgwqAgY2hhciAqY1szXTsKPiArwqDCoMKgIGludCBjaSA9 IDA7Cj4gK8KgwqDCoCBESVIgKmRpcnN0cmVhbSA9IG9wZW5kaXIgKCIvZGV2Iik7Cj4gK8KgwqDC oCBWRVJJRlkgKGRpcnN0cmVhbSAhPSBOVUxMKTsKPiArwqDCoMKgIHN0cnVjdCBkaXJlbnQgKmQ7 Cj4gK8KgwqDCoCB3aGlsZSAoKGQgPSByZWFkZGlyIChkaXJzdHJlYW0pKSAhPSBOVUxMICYmIGNp IDwgMykKPiArwqDCoMKgwqDCoCB7Cj4gK8KgwqDCoMKgwqDCoMKgIGlmIChzdHJjbXAgKGQtPmRf bmFtZSwgImNvbnNvbGUxIikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmJiBzdHJjbXAgKGQt PmRfbmFtZSwgImNvbnNvbGUyIikKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmJiBzdHJjbXAg KGQtPmRfbmFtZSwgImNvbnNvbGUzIikgKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7 Cj4gK8KgwqDCoMKgwqDCoMKgIGNbY2krK10gPSB4YXNwcmludGYgKCIvZGV2LyVzIiwgZC0+ZF9u YW1lKTsKPiArwqDCoMKgwqDCoCB9Cj4gK8KgwqDCoCBWRVJJRlkgKGNpID09IDMpOwo+ICvCoMKg wqAgVkVSSUZZIChjbG9zZWRpciAoZGlyc3RyZWFtKSA9PSAwKTsKPiArCj4gK8KgwqDCoCBWRVJJ RlkgKG1vdW50IChzbGF2ZW5hbWUsIGNbMF0sIE5VTEwsIE1TX0JJTkQsIE5VTEwpID09IDApOwo+ ICvCoMKgwqAgVkVSSUZZIChtb3VudCAoIi9jb25zb2xlIiwgY1sxXSwgTlVMTCwgTVNfQklORCwg TlVMTCkgPT0gMCk7Cj4gK8KgwqDCoCBWRVJJRlkgKG1vdW50IChzbGF2ZW5hbWUsIGNbMl0sIE5V TEwsIE1TX0JJTkQsIE5VTEwpID09IDApOwo+ICvCoMKgwqAgVkVSSUZZICh1bW91bnQyICgiL2Rl di9wdHMiLCBNTlRfREVUQUNIKSA9PSAwKTsKPiArwqDCoMKgIGlmICghZG9pdCAoc2xhdmUsICJ3 aXRoIHNlYXJjaC1wYXRoIHRyYXAiLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChz dHJ1Y3QgcmVzdWx0X3Ipey5uYW1lPWNbMV0sIC5yZXQ9MCwgLmVycj0wfSkpCj4gK8KgwqDCoMKg wqAgb2sgPSBmYWxzZTsKPiArwqDCoMKgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQo+ICvC oMKgwqDCoMKgIHsKPiArwqDCoMKgwqDCoMKgwqAgVkVSSUZZICh1bW91bnQgKGNbaV0pID09IDAp Owo+ICvCoMKgwqDCoMKgwqDCoCBWRVJJRlkgKHVubGluayAoY1tpXSkgPT0gMCk7Cj4gK8KgwqDC oMKgwqDCoMKgIGZyZWUgKGNbaV0pOwo+ICvCoMKgwqDCoMKgIH0KPiArwqAgfQo+ICsKPiArwqAg cmV0dXJuIG9rID8gMCA6IDE7Cj4gK30KPiArCj4gZGlmZiAtLWdpdCBhL3N5c2RlcHMvdW5peC9z eXN2L2xpbnV4L3RzdC10dHluYW1lLW5hbWVzcGFjZS5jCj4gYi9zeXNkZXBzL3VuaXgvc3lzdi9s aW51eC90c3QtdHR5bmFtZS1uYW1lc3BhY2UuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5k ZXggMDAwMDAwMDAwMC4uN2I3NDI1OGMxMAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9zeXNkZXBz L3VuaXgvc3lzdi9saW51eC90c3QtdHR5bmFtZS1uYW1lc3BhY2UuYwo+IEBAIC0wLDAgKzEsMTQ3 IEBACj4gKy8qIFRlc3RzIGZvciB0dHluYW1lL3R0eW5hbWVfciB3aXRoIG5hbWVzcGFjZXMuCj4g K8KgwqAgQ29weXJpZ2h0IChDKSAyMDE3LTIwMjMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ bmMuCj4gK8KgwqAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCj4gKwo+ ICvCoMKgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vcgo+ICvCoMKgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQo+IGFzCj4gK8KgwqAgcHVibGlzaGVk IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgo+ IHRoZQo+ICvCoMKgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uCj4gKwo+ICvCoMKgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd2lsbCBiZQo+IHVzZWZ1bCwKPiArwqDCoCBidXQgV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+ICvCoMKgIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS7CoCBTZWUgdGhl IEdOVQo+ICvCoMKgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp bHMuCj4gKwo+ICvCoMKgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKPiArwqDCoCBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdO VSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi7CoAo+IElmCj4gK8KgwqAgbm90 LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi7CoCAqLwo+ICsKPiArI2luY2x1 ZGUgPHNjaGVkLmg+Cj4gKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KPiArI2luY2x1ZGUgPHN5cy93 YWl0Lmg+Cj4gKwo+ICsjaW5jbHVkZSA8c3VwcG9ydC9uYW1lc3BhY2UuaD4KPiArCj4gKyNpbmNs dWRlICJ0c3QtdHR5bmFtZS1jb21tb24uYyIKPiArCj4gK3N0YXRpYyBpbnQKPiArZG9faW5fY2hy b290XzIgKGludCAoKmNiKShjb25zdCBjaGFyICosIGludCkpCj4gK3sKPiArwqAgcHJpbnRmICgi aW5mbzrCoCBlbnRlcmluZyBjaHJvb3QgMlxuIik7Cj4gKwo+ICvCoCBpbnQgcGlkX3BpcGVbMl07 Cj4gK8KgIHhwaXBlIChwaWRfcGlwZSk7Cj4gK8KgIGludCBleGl0X3BpcGVbMl07Cj4gK8KgIHhw aXBlIChleGl0X3BpcGUpOwo+ICsKPiArwqAgLyogT3BlbiB0aGUgUFRTIHRoYXQgd2UnbGwgYmUg dGVzdGluZyBvbi7CoCAqLwo+ICvCoCBpbnQgbWFzdGVyOwo+ICvCoCBjaGFyICpzbGF2ZW5hbWU7 Cj4gK8KgIFZFUklGWSAoKG1hc3RlciA9IHBvc2l4X29wZW5wdCAoT19SRFdSfE9fTk9DVFRZfE9f Tk9OQkxPQ0spKSA+PSAwKTsKPiArwqAgVkVSSUZZICgoc2xhdmVuYW1lID0gcHRzbmFtZSAobWFz dGVyKSkpOwo+ICvCoCBWRVJJRlkgKHVubG9ja3B0IChtYXN0ZXIpID09IDApOwo+ICvCoCBpZiAo c3RybmNtcCAoc2xhdmVuYW1lLCAiL2Rldi9wdHMvIiwgOSkgIT0gMCkKPiArwqDCoMKgIEZBSUxf VU5TVVBQT1JURUQgKCJzbGF2ZSBwc2V1ZG8tdGVybWluYWwgaXMgbm90IHVuZGVyIC9kZXYvcHRz LzoKPiAlcyIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBz bGF2ZW5hbWUpOwo+ICvCoCBhZGp1c3RfZmlsZV9saW1pdCAoc2xhdmVuYW1lKTsKPiArwqAgLyog d2FpdCB1bnRpbCBpbiBhIG5ldyBtb3VudCBucyB0byBvcGVuIHRoZSBzbGF2ZSAqLwo+ICsKPiAr wqAgLyogZW5hYmxlIGB3YWl0YGluZyBvbiBncmFuZGNoaWxkcmVuICovCj4gK8KgIFZFUklGWSAo cHJjdGwgKFBSX1NFVF9DSElMRF9TVUJSRUFQRVIsIDEpID09IDApOwo+ICsKPiArwqAgcGlkX3Qg cGlkID0geGZvcmsgKCk7IC8qIG91dGVyIGNoaWxkICovCj4gK8KgIGlmIChwaWQgPT0gMCkKPiAr wqDCoMKgIHsKPiArwqDCoMKgwqDCoCB4Y2xvc2UgKG1hc3Rlcik7Cj4gK8KgwqDCoMKgwqAgeGNs b3NlIChwaWRfcGlwZVswXSk7Cj4gK8KgwqDCoMKgwqAgeGNsb3NlIChleGl0X3BpcGVbMV0pOwo+ ICsKPiArwqDCoMKgwqDCoCBpZiAoIXN1cHBvcnRfZW50ZXJfbW91bnRfbmFtZXNwYWNlICgpKQo+ ICvCoMKgwqDCoMKgwqDCoEZBSUxfVU5TVVBQT1JURUQgKCJjb3VsZCBub3QgZW50ZXIgbmV3IG1v dW50IG5hbWVzcGFjZSIpOwo+ICsKPiArwqDCoMKgwqDCoCBpbnQgc2xhdmUgPSB4b3BlbiAoc2xh dmVuYW1lLCBPX1JEV1IsIDApOwo+ICvCoMKgwqDCoMKgIGlmICghZG9pdCAoc2xhdmUsICJiYXNp YyBzbW9rZXRlc3QiLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoc3RydWN0 IHJlc3VsdF9yKXsubmFtZT1zbGF2ZW5hbWUsIC5yZXQ9MCwgLmVycj0wfSkpCj4gK8KgwqDCoMKg wqDCoMKgIF9leGl0ICgxKTsKPiArCj4gK8KgwqDCoMKgwqAgVkVSSUZZIChtb3VudCAoInRtcGZz IiwgY2hyb290ZGlyLCAidG1wZnMiLCAwLCAibW9kZT03NTUiKSA9PQo+IDApOwo+ICvCoMKgwqDC oMKgIFZFUklGWSAoY2hkaXIgKGNocm9vdGRpcikgPT0gMCk7Cj4gKwo+ICvCoMKgwqDCoMKgIHht a2RpciAoInByb2MiLCAwNzU1KTsKPiArwqDCoMKgwqDCoCB4bWtkaXIgKCJkZXYiLCAwNzU1KTsK PiArwqDCoMKgwqDCoCB4bWtkaXIgKCJkZXYvcHRzIiwgMDc1NSk7Cj4gKwo+ICvCoMKgwqDCoMKg IFZFUklGWSAobW91bnQgKCJkZXZwdHMiLCAiZGV2L3B0cyIsICJkZXZwdHMiLAo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE1TX05PU1VJRHxNU19OT0VYRUMsCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIm5ld2luc3RhbmNlLHB0 bXhtb2RlPTA2NjYsbW9kZT02MjAiKSA9PSAwKTsKPiArwqDCoMKgwqDCoCBWRVJJRlkgKHN5bWxp bmsgKCJwdHMvcHRteCIsICJkZXYvcHRteCIpID09IDApOwo+ICsKPiArwqDCoMKgwqDCoCB0b3Vj aCAoImNvbnNvbGUiLCAwKTsKPiArwqDCoMKgwqDCoCB0b3VjaCAoImRldi9jb25zb2xlIiwgMCk7 Cj4gK8KgwqDCoMKgwqAgVkVSSUZZIChtb3VudCAoc2xhdmVuYW1lLCAiY29uc29sZSIsIE5VTEws IE1TX0JJTkQsIE5VTEwpID09Cj4gMCk7Cj4gKwo+ICvCoMKgwqDCoMKgIHhjaHJvb3QgKCIuIik7 Cj4gKwo+ICvCoMKgwqDCoMKgIGlmICh1bnNoYXJlIChDTE9ORV9ORVdOUyB8IENMT05FX05FV1BJ RCkgPCAwKQo+ICvCoMKgwqDCoMKgwqDCoCBGQUlMX1VOU1VQUE9SVEVEICgiY291bGQgbm90IGVu dGVyIG5ldyBQSUQgbmFtZXNwYWNlIik7Cj4gK8KgwqDCoMKgwqAgcGlkID0geGZvcmsgKCk7IC8q IGlubmVyIGNoaWxkICovCj4gK8KgwqDCoMKgwqAgaWYgKHBpZCA9PSAwKQo+ICvCoMKgwqDCoMKg wqDCoCB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoCB4Y2xvc2UgKHBpZF9waXBlWzFdKTsKPiArCj4g K8KgwqDCoMKgwqDCoMKgwqDCoCAvKiB3YWl0IHVudGlsIHRoZSBvdXRlciBjaGlsZCBoYXMgZXhp dGVkICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoCBjaGFyIGM7Cj4gK8KgwqDCoMKgwqDCoMKgwqDC oCBWRVJJRlkgKHJlYWQgKGV4aXRfcGlwZVswXSwgJmMsIDEpID09IDApOwo+ICvCoMKgwqDCoMKg wqDCoMKgwqAgeGNsb3NlIChleGl0X3BpcGVbMF0pOwo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoCBp ZiAobW91bnQgKCJwcm9jIiwgIi9wcm9jIiwgInByb2MiLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBNU19OT1NVSUR8TVNfTk9FWEVDfE1TX05PREVWLCBOVUxMKSAh PSAwKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAvKiBUaGlzIGhhcHBlbnMgaWYgd2UncmUgdHJ5aW5nIHRvIGNyZWF0ZSBhIG5lc3RlZAo+IGNv bnRhaW5lciwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxpa2UgaWYgdGhlIGJ1 aWxkIGlzIHJ1bm5pbmcgdW5kZXIgcG9kbWFuLCBhbmQgd2UKPiBsYWNrCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBwcml2aWxlZGdlcy7CoCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgaWYgKGVycm5vID09IEVQRVJNKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBfZXhpdCAoRVhJVF9VTlNVUFBPUlRFRCk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9leGl0IChFWElUX0ZBSUxV UkUpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqAg Y2hhciAqbGlua25hbWUgPSB4YXNwcmludGYgKCIvcHJvYy9zZWxmL2ZkLyVkIiwgc2xhdmUpOwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqAgY2hhciAqdGFyZ2V0ID0gcHJvY19mZF9yZWFkbGluayAobGlu a25hbWUpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqAgVkVSSUZZIChzdHJjbXAgKHRhcmdldCwgc3Ry cmNociAoc2xhdmVuYW1lLCAnLycpKSA9PSAwKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgIGZyZWUg KGxpbmtuYW1lKTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoCBfZXhpdCAoY2IgKHNsYXZlbmFt ZSwgc2xhdmUpKTsKPiArwqDCoMKgwqDCoMKgwqAgfQo+ICsKPiArwqDCoMKgwqDCoCBpbnQgc3Rh dHVzOwo+ICvCoMKgwqDCoMKgIHh3YWl0cGlkIChwaWQsICZzdGF0dXMsIDApOwo+ICvCoMKgwqDC oMKgIF9leGl0IChXRVhJVFNUQVRVUyAoc3RhdHVzKSk7Cj4gK8KgwqDCoCB9Cj4gK8KgIHhjbG9z ZSAocGlkX3BpcGVbMV0pOwo+ICvCoCB4Y2xvc2UgKGV4aXRfcGlwZVswXSk7Cj4gK8KgIHhjbG9z ZSAoZXhpdF9waXBlWzFdKTsKPiArCj4gK8KgIC8qIHdhaXQgZm9yIHRoZSBvdXRlciBjaGlsZCAq Lwo+ICvCoCBpbnQgc3RhdHVzOwo+ICvCoCB4d2FpdHBpZCAocGlkLCAmc3RhdHVzLCAwKTsKPiAr wqAgVkVSSUZZIChXSUZFWElURUQgKHN0YXR1cykpOwo+ICvCoCBpbnQgcmV0ID0gV0VYSVRTVEFU VVMgKHN0YXR1cyk7Cj4gK8KgIGlmIChyZXQgIT0gMCkKPiArwqDCoMKgIEZBSUxfVU5TVVBQT1JU RUQgKCJ1bmFibGUgdG8gbW91bnQgL3Byb2Mgb24gaW5uZXIgY2hpbGQKPiBwcm9jZXNzIik7Cj4g K8KgIHhjbG9zZSAobWFzdGVyKTsKPiArCj4gK8KgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50Cj4gK2RvX3Rlc3QgKHZvaWQpCj4gK3sKPiArwqAgc3VwcG9ydF9iZWNvbWVfcm9vdCAo KTsKPiArCj4gK8KgIGRvX2luX2Nocm9vdF8yIChydW5fY2hyb290X3Rlc3RzKTsKPiArCj4gK8Kg IHJldHVybiAwOwo+ICt9Cj4gKwo+ICsjaW5jbHVkZSA8c3VwcG9ydC90ZXN0LWRyaXZlci5jPgo+ IGRpZmYgLS1naXQgYS9zeXNkZXBzL3VuaXgvc3lzdi9saW51eC90c3QtdHR5bmFtZS5jCj4gYi9z eXNkZXBzL3VuaXgvc3lzdi9saW51eC90c3QtdHR5bmFtZS5jCj4gaW5kZXggZWY1NTY2NWZiZS4u MDQ2MDE3NzdkNiAxMDA2NDQKPiAtLS0gYS9zeXNkZXBzL3VuaXgvc3lzdi9saW51eC90c3QtdHR5 bmFtZS5jCj4gKysrIGIvc3lzZGVwcy91bml4L3N5c3YvbGludXgvdHN0LXR0eW5hbWUuYwo+IEBA IC0xNSwyNTYgKzE1LDEyIEBACj4gwqDCoMKgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMg TGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLsKgCj4gSWYKPiDCoMKgwqAgbm90LCBz ZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi7CoCAqLwo+IMKgCj4gLSNpbmNsdWRl IDxkaXJlbnQuaD4KPiAtI2luY2x1ZGUgPGVycm5vLmg+Cj4gLSNpbmNsdWRlIDxmY250bC5oPgo+ IC0jaW5jbHVkZSA8bGltaXRzLmg+Cj4gwqAjaW5jbHVkZSA8c2NoZWQuaD4KPiAtI2luY2x1ZGUg PHN0ZGlvLmg+Cj4gLSNpbmNsdWRlIDxzdGRsaWIuaD4KPiAtI2luY2x1ZGUgPHN0cmluZy5oPgo+ IC0jaW5jbHVkZSA8c3lzL21vdW50Lmg+Cj4gwqAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+Cj4gLSNp bmNsdWRlIDxzeXMvc3RhdC5oPgo+IC0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KPiAtI2luY2x1ZGUg PHN5cy9yZXNvdXJjZS5oPgo+IC0jaW5jbHVkZSA8dW5pc3RkLmg+Cj4gwqAKPiAtI2luY2x1ZGUg PHN1cHBvcnQvY2hlY2suaD4KPiDCoCNpbmNsdWRlIDxzdXBwb3J0L25hbWVzcGFjZS5oPgo+IC0j aW5jbHVkZSA8c3VwcG9ydC9zdXBwb3J0Lmg+Cj4gLSNpbmNsdWRlIDxzdXBwb3J0L3RlbXBfZmls ZS5oPgo+IC0jaW5jbHVkZSA8c3VwcG9ydC90ZXN0LWRyaXZlci5oPgo+IC0jaW5jbHVkZSA8c3Vw cG9ydC94dW5pc3RkLmg+Cj4gwqAKPiAtLyogZ2VuZXJpYyB1dGlsaXRpZXMgKi8KPiAtCj4gLSNk ZWZpbmUKPiBWRVJJRlkoZXhwcinCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgXAo+IC3CoCBkbwo+IHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiAtwqDCoMKgIGlmCj4g KCEoZXhwcikpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgXAo+IC3CoMKgwqDCoMKgCj4ge8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPiAtwqDCoMKgwqDCoMKg wqAgcHJpbnRmICgiZXJyb3I6ICVzOiVkOiAlczoKPiAlbVxuIizCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgX19GSUxFX18sIF9fTElORV9fLAo+ICNleHByKTvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4gLcKg wqDCoMKgwqDCoMKgIGV4aXQKPiAoMSk7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIFwKPiAtwqDCoMKgwqDCoAo+IH3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4g LcKgIH0gd2hpbGUgKDApCj4gLQo+IC1zdGF0aWMgdm9pZAo+IC10b3VjaCAoY29uc3QgY2hhciAq cGF0aCwgbW9kZV90IG1vZGUpCj4gLXsKPiAtwqAgeGNsb3NlICh4b3BlbiAocGF0aCwgT19XUk9O TFl8T19DUkVBVHxPX05PQ1RUWSwgbW9kZSkpOwo+IC19Cj4gLQo+IC1zdGF0aWMgc2l6ZV90Cj4g LXRyaW1fcHJlZml4IChjaGFyICpzdHIsIHNpemVfdCBzdHJfbGVuLCBjb25zdCBjaGFyICpwcmVm aXgpCj4gLXsKPiAtwqAgc2l6ZV90IHByZWZpeF9sZW4gPSBzdHJsZW4gKHByZWZpeCk7Cj4gLcKg IGlmIChzdHJfbGVuID4gcHJlZml4X2xlbiAmJiBtZW1jbXAgKHN0ciwgcHJlZml4LCBwcmVmaXhf bGVuKSA9PSAwKQo+IC3CoMKgwqAgewo+IC3CoMKgwqDCoMKgIG1lbW1vdmUgKHN0ciwgc3RyICsg cHJlZml4X2xlbiwgc3RyX2xlbiAtIHByZWZpeF9sZW4pOwo+IC3CoMKgwqDCoMKgIHJldHVybiBz dHJfbGVuIC0gcHJlZml4X2xlbjsKPiAtwqDCoMKgIH0KPiAtwqAgcmV0dXJuIHN0cl9sZW47Cj4g LX0KPiAtCj4gLS8qIHJldHVybnMgYSBwb2ludGVyIHRvIHN0YXRpYyBzdG9yYWdlICovCj4gLXN0 YXRpYyBjaGFyICoKPiAtcHJvY19mZF9yZWFkbGluayAoY29uc3QgY2hhciAqbGlua25hbWUpCj4g LXsKPiAtwqAgc3RhdGljIGNoYXIgdGFyZ2V0W1BBVEhfTUFYKzFdOwo+IC3CoCBzc2l6ZV90IHRh cmdldF9sZW4gPSByZWFkbGluayAobGlua25hbWUsIHRhcmdldCwgUEFUSF9NQVgpOwo+IC3CoCBW RVJJRlkgKHRhcmdldF9sZW4gPiAwKTsKPiAtwqAgdGFyZ2V0X2xlbiA9IHRyaW1fcHJlZml4ICh0 YXJnZXQsIHRhcmdldF9sZW4sICIodW5yZWFjaGFibGUpIik7Cj4gLcKgIHRhcmdldFt0YXJnZXRf bGVuXSA9ICdcMCc7Cj4gLcKgIHJldHVybiB0YXJnZXQ7Cj4gLX0KPiAtCj4gLS8qIHBsYWluIHR0 eW5hbWUgcnVubmVyICovCj4gLQo+IC1zdHJ1Y3QgcmVzdWx0Cj4gLXsKPiAtwqAgY29uc3QgY2hh ciAqbmFtZTsKPiAtwqAgaW50IGVycjsKPiAtfTsKPiAtCj4gLS8qIHN0cmluZ3MgaW4gcmVzdWx0 IHN0cnVjdHVyZSBhcmUgaW4gc3RhdGljIHN0b3JhZ2UgKi8KPiAtc3RhdGljIHN0cnVjdCByZXN1 bHQKPiAtcnVuX3R0eW5hbWUgKGludCBmZCkKPiAtewo+IC3CoCBzdHJ1Y3QgcmVzdWx0IHJldDsK PiAtwqAgZXJybm8gPSAwOwo+IC3CoCByZXQubmFtZSA9IHR0eW5hbWUgKGZkKTsKPiAtwqAgcmV0 LmVyciA9IGVycm5vOwo+IC3CoCByZXR1cm4gcmV0Owo+IC19Cj4gLQo+IC1zdGF0aWMgYm9vbAo+ IC1lcV90dHluYW1lIChzdHJ1Y3QgcmVzdWx0IGFjdHVhbCwgc3RydWN0IHJlc3VsdCBleHBlY3Rl ZCkKPiAtewo+IC3CoCBjaGFyICphY3R1YWxfbmFtZSwgKmV4cGVjdGVkX25hbWU7Cj4gLQo+IC3C oCBpZiAoKGFjdHVhbC5lcnIgPT0gZXhwZWN0ZWQuZXJyKQo+IC3CoMKgwqDCoMKgICYmICghYWN0 dWFsLm5hbWUgPT0gIWV4cGVjdGVkLm5hbWUpCj4gLcKgwqDCoMKgwqAgJiYgKGFjdHVhbC5uYW1l ID8gc3RyY21wIChhY3R1YWwubmFtZSwgZXhwZWN0ZWQubmFtZSkgPT0gMCA6Cj4gdHJ1ZSkpCj4g LcKgwqDCoCB7Cj4gLcKgwqDCoMKgwqAgaWYgKGV4cGVjdGVkLm5hbWUpCj4gLcKgwqDCoMKgwqDC oMKgIGV4cGVjdGVkX25hbWUgPSB4YXNwcmludGYgKCJcIiVzXCIiLCBleHBlY3RlZC5uYW1lKTsK PiAtwqDCoMKgwqDCoCBlbHNlCj4gLcKgwqDCoMKgwqDCoMKgZXhwZWN0ZWRfbmFtZSA9IHhzdHJk dXAgKCJOVUxMIik7Cj4gLQo+IC3CoMKgwqDCoMKgIHByaW50ZiAoImluZm86wqDCoMKgwqDCoCB0 dHluYW1lOiBQQVNTIHtuYW1lPSVzLCBlcnJubz0lZH1cbiIsCj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBleHBlY3RlZF9uYW1lLCBleHBlY3RlZC5lcnIpOwo+IC0KPiAtwqDCoMKgwqDCoCBm cmVlIChleHBlY3RlZF9uYW1lKTsKPiAtwqDCoMKgwqDCoCByZXR1cm4gdHJ1ZTsKPiAtwqDCoMKg IH0KPiAtCj4gLcKgIGlmIChhY3R1YWwubmFtZSkKPiAtwqDCoMKgIGFjdHVhbF9uYW1lID0geGFz cHJpbnRmICgiXCIlc1wiIiwgYWN0dWFsLm5hbWUpOwo+IC3CoCBlbHNlCj4gLcKgwqDCoCBhY3R1 YWxfbmFtZSA9IHhzdHJkdXAgKCJOVUxMIik7Cj4gLQo+IC3CoCBpZiAoZXhwZWN0ZWQubmFtZSkK PiAtwqDCoMKgIGV4cGVjdGVkX25hbWUgPSB4YXNwcmludGYgKCJcIiVzXCIiLCBleHBlY3RlZC5u YW1lKTsKPiAtwqAgZWxzZQo+IC3CoMKgwqAgZXhwZWN0ZWRfbmFtZSA9IHhzdHJkdXAgKCJOVUxM Iik7Cj4gLQo+IC3CoCBwcmludGYgKCJlcnJvcjrCoMKgwqDCoCB0dHluYW1lOiBhY3R1YWwge25h bWU9JXMsIGVycm5vPSVkfSAhPSBleHBlY3RlZAo+IHtuYW1lPSVzLCBlcnJubz0lZH1cbiIsCj4g LcKgwqDCoMKgwqDCoMKgwqAgYWN0dWFsX25hbWUsIGFjdHVhbC5lcnIsCj4gLcKgwqDCoMKgwqDC oMKgwqAgZXhwZWN0ZWRfbmFtZSwgZXhwZWN0ZWQuZXJyKTsKPiAtCj4gLcKgIGZyZWUgKGFjdHVh bF9uYW1lKTsKPiAtwqAgZnJlZSAoZXhwZWN0ZWRfbmFtZSk7Cj4gLcKgIHJldHVybiBmYWxzZTsK PiAtfQo+IC0KPiAtLyogdHR5bmFtZV9yIHJ1bm5lciAqLwo+IC0KPiAtc3RydWN0IHJlc3VsdF9y Cj4gLXsKPiAtwqAgY29uc3QgY2hhciAqbmFtZTsKPiAtwqAgaW50IHJldDsKPiAtwqAgaW50IGVy cjsKPiAtfTsKPiAtCj4gLS8qIHN0cmluZ3MgaW4gcmVzdWx0IHN0cnVjdHVyZSBhcmUgaW4gc3Rh dGljIHN0b3JhZ2UgKi8KPiAtc3RhdGljIHN0cnVjdCByZXN1bHRfcgo+IC1ydW5fdHR5bmFtZV9y IChpbnQgZmQpCj4gLXsKPiAtwqAgc3RhdGljIGNoYXIgYnVmW1RUWV9OQU1FX01BWF07Cj4gLQo+ IC3CoCBzdHJ1Y3QgcmVzdWx0X3IgcmV0Owo+IC3CoCBlcnJubyA9IDA7Cj4gLcKgIHJldC5yZXQg PSB0dHluYW1lX3IgKGZkLCBidWYsIFRUWV9OQU1FX01BWCk7Cj4gLcKgIHJldC5lcnIgPSBlcnJu bzsKPiAtwqAgaWYgKHJldC5yZXQgPT0gMCkKPiAtwqDCoMKgIHJldC5uYW1lID0gYnVmOwo+IC3C oCBlbHNlCj4gLcKgwqDCoCByZXQubmFtZSA9IE5VTEw7Cj4gLcKgIHJldHVybiByZXQ7Cj4gLX0K PiAtCj4gLXN0YXRpYyBib29sCj4gLWVxX3R0eW5hbWVfciAoc3RydWN0IHJlc3VsdF9yIGFjdHVh bCwgc3RydWN0IHJlc3VsdF9yIGV4cGVjdGVkKQo+IC17Cj4gLcKgIGNoYXIgKmFjdHVhbF9uYW1l LCAqZXhwZWN0ZWRfbmFtZTsKPiAtCj4gLcKgIGlmICgoYWN0dWFsLmVyciA9PSBleHBlY3RlZC5l cnIpCj4gLcKgwqDCoMKgwqAgJiYgKGFjdHVhbC5yZXQgPT0gZXhwZWN0ZWQucmV0KQo+IC3CoMKg wqDCoMKgICYmICghYWN0dWFsLm5hbWUgPT0gIWV4cGVjdGVkLm5hbWUpCj4gLcKgwqDCoMKgwqAg JiYgKGFjdHVhbC5uYW1lID8gc3RyY21wIChhY3R1YWwubmFtZSwgZXhwZWN0ZWQubmFtZSkgPT0g MCA6Cj4gdHJ1ZSkpCj4gLcKgwqDCoCB7Cj4gLcKgwqDCoMKgwqAgaWYgKGV4cGVjdGVkLm5hbWUp Cj4gLcKgwqDCoMKgwqDCoMKgIGV4cGVjdGVkX25hbWUgPSB4YXNwcmludGYgKCJcIiVzXCIiLCBl eHBlY3RlZC5uYW1lKTsKPiAtwqDCoMKgwqDCoCBlbHNlCj4gLcKgwqDCoMKgwqDCoMKgIGV4cGVj dGVkX25hbWUgPSB4c3RyZHVwICgiTlVMTCIpOwo+IC0KPiAtwqDCoMKgwqDCoCBwcmludGYgKCJp bmZvOsKgwqDCoMKgwqAgdHR5bmFtZV9yOiBQQVNTIHtuYW1lPSVzLCByZXQ9JWQsCj4gZXJybm89 JWR9XG4iLAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBleHBlY3RlZF9uYW1lLCBleHBl Y3RlZC5yZXQsIGV4cGVjdGVkLmVycik7Cj4gLQo+IC3CoMKgwqDCoMKgIGZyZWUgKGV4cGVjdGVk X25hbWUpOwo+IC3CoMKgwqDCoMKgIHJldHVybiB0cnVlOwo+IC3CoMKgwqAgfQo+IC0KPiAtwqAg aWYgKGFjdHVhbC5uYW1lKQo+IC3CoMKgwqAgYWN0dWFsX25hbWUgPSB4YXNwcmludGYgKCJcIiVz XCIiLCBhY3R1YWwubmFtZSk7Cj4gLcKgIGVsc2UKPiAtwqDCoMKgIGFjdHVhbF9uYW1lID0geHN0 cmR1cCAoIk5VTEwiKTsKPiAtCj4gLcKgIGlmIChleHBlY3RlZC5uYW1lKQo+IC3CoMKgwqAgZXhw ZWN0ZWRfbmFtZSA9IHhhc3ByaW50ZiAoIlwiJXNcIiIsIGV4cGVjdGVkLm5hbWUpOwo+IC3CoCBl bHNlCj4gLcKgwqDCoCBleHBlY3RlZF9uYW1lID0geHN0cmR1cCAoIk5VTEwiKTsKPiAtCj4gLcKg IHByaW50ZiAoImVycm9yOsKgwqDCoMKgIHR0eW5hbWVfcjogYWN0dWFsIHtuYW1lPSVzLCByZXQ9 JWQsIGVycm5vPSVkfQo+ICE9IGV4cGVjdGVkIHtuYW1lPSVzLCByZXQ9JWQsIGVycm5vPSVkfVxu IiwKPiAtwqDCoMKgwqDCoMKgwqDCoCBhY3R1YWxfbmFtZSwgYWN0dWFsLnJldCwgYWN0dWFsLmVy ciwKPiAtwqDCoMKgwqDCoMKgwqDCoCBleHBlY3RlZF9uYW1lLCBleHBlY3RlZC5yZXQsIGV4cGVj dGVkLmVycik7Cj4gLQo+IC3CoCBmcmVlIChhY3R1YWxfbmFtZSk7Cj4gLcKgIGZyZWUgKGV4cGVj dGVkX25hbWUpOwo+IC3CoCByZXR1cm4gZmFsc2U7Cj4gLX0KPiAtCj4gLS8qIGNvbWJpbmVkIHJ1 bm5lciAqLwo+IC0KPiAtc3RhdGljIGJvb2wKPiAtZG9pdCAoaW50IGZkLCBjb25zdCBjaGFyICp0 ZXN0bmFtZSwgc3RydWN0IHJlc3VsdF9yIGV4cGVjdGVkX3IpCj4gLXsKPiAtwqAgc3RydWN0IHJl c3VsdCBleHBlY3RlZCA9IHsubmFtZT1leHBlY3RlZF9yLm5hbWUsCj4gLmVycj1leHBlY3RlZF9y LnJldH07Cj4gLcKgIGJvb2wgcmV0ID0gdHJ1ZTsKPiAtCj4gLcKgIHByaW50ZiAoImluZm86wqDC oMKgIHRlc3RjYXNlOiAlc1xuIiwgdGVzdG5hbWUpOwo+IC0KPiAtwqAgaWYgKCFlcV90dHluYW1l IChydW5fdHR5bmFtZSAoZmQpLCBleHBlY3RlZCkpCj4gLcKgwqDCoCByZXQgPSBmYWxzZTsKPiAt wqAgaWYgKCFlcV90dHluYW1lX3IgKHJ1bl90dHluYW1lX3IgKGZkKSwgZXhwZWN0ZWRfcikpCj4g LcKgwqDCoCByZXQgPSBmYWxzZTsKPiAtCj4gLcKgIGlmICghcmV0KQo+IC3CoMKgwqAgc3VwcG9y dF9yZWNvcmRfZmFpbHVyZSAoKTsKPiAtCj4gLcKgIHJldHVybiByZXQ7Cj4gLX0KPiAtCj4gLS8q IGNocm9vdCBzZXR1cCAqLwo+IC0KPiAtc3RhdGljIGNoYXIgKmNocm9vdGRpcjsKPiAtCj4gLXN0 YXRpYyB2b2lkCj4gLXByZXBhcmUgKGludCBhcmdjLCBjaGFyICoqYXJndikKPiAtewo+IC3CoCBj aHJvb3RkaXIgPSB4YXNwcmludGYgKCIlcy90c3QtdHR5bmFtZS1YWFhYWFgiLCB0ZXN0X2Rpcik7 Cj4gLcKgIGlmIChta2R0ZW1wIChjaHJvb3RkaXIpID09IE5VTEwpCj4gLcKgwqDCoCBGQUlMX0VY SVQxICgibWtkdGVtcCAoXCIlc1wiKTogJW0iLCBjaHJvb3RkaXIpOwo+IC3CoCBhZGRfdGVtcF9m aWxlIChjaHJvb3RkaXIpOwo+IC19Cj4gLSNkZWZpbmUgUFJFUEFSRSBwcmVwYXJlCj4gLQo+IC0v KiBBZGp1c3QgdGhlIGZpbGUgbGltaXQgc28gdGhhdCB3ZSBoYXZlIGEgY2hhbmNlIHRvIG9wZW4g UFRZLsKgICovCj4gLXN0YXRpYyB2b2lkCj4gLWFkanVzdF9maWxlX2xpbWl0IChjb25zdCBjaGFy ICpwdHkpCj4gLXsKPiAtwqAgaW50IG51bWJlciA9IC0xOwo+IC3CoCBpZiAoc3NjYW5mIChwdHks ICIvZGV2L3B0cy8lZCIsICZudW1iZXIpICE9IDEgfHwgbnVtYmVyIDwgMCkKPiAtwqDCoMKgIEZB SUxfRVhJVDEgKCJpbnZhbGlkIFBUWSBuYW1lOiBcIiVzXCIiLCBwdHkpOwo+IC0KPiAtwqAgLyog QWRkIGEgZmV3IGFkZGl0aW9uYWwgZGVzY3JpcHRvcnMgdG8gY292ZXIgc3RhbmRhcmQgSS9PIHN0 cmVhbXMKPiAtwqDCoMKgwqAgZXRjLsKgICovCj4gLcKgIHJsaW1fdCBkZXNpcmVkX2xpbWl0ID0g bnVtYmVyICsgMTA7Cj4gLQo+IC3CoCBzdHJ1Y3QgcmxpbWl0IGxpbTsKPiAtwqAgaWYgKGdldHJs aW1pdCAoUkxJTUlUX05PRklMRSwgJmxpbSkgIT0gMCkKPiAtwqDCoMKgIEZBSUxfRVhJVDEgKCJn ZXRybGltaXQgKFJMSU1JVF9OT0ZJTEUpOiAlbSIpOwo+IC3CoCBpZiAobGltLnJsaW1fY3VyIDwg ZGVzaXJlZF9saW1pdCkKPiAtwqDCoMKgIHsKPiAtwqDCoMKgwqDCoCBwcmludGYgKCJpbmZvOiBh ZGp1c3RpbmcgUkxJTUlUX05PRklMRSBmcm9tICVsbHUgdG8gJWxsdVxuIiwKPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBsaW0ucmxpbV9jdXIsCj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAodW5zaWduZWQgbG9uZyBsb25nIGludCkgZGVzaXJl ZF9saW1pdCk7Cj4gLcKgwqDCoMKgwqAgbGltLnJsaW1fY3VyID0gZGVzaXJlZF9saW1pdDsKPiAt wqDCoMKgwqDCoCBpZiAoc2V0cmxpbWl0IChSTElNSVRfTk9GSUxFLCAmbGltKSAhPSAwKQo+IC3C oMKgwqDCoMKgwqDCoHByaW50ZiAoIndhcm5pbmc6IHNldHJsaW1pdCAoUkxJTUlUX05PRklMRSkg ZmFpbGVkOiAlbVxuIik7Cj4gLcKgwqDCoCB9Cj4gLX0KPiArI2luY2x1ZGUgInRzdC10dHluYW1l LWNvbW1vbi5jIgo+IMKgCj4gwqAvKiBUaGVzZSBjaHJvb3Qgc2V0dXAgZnVuY3Rpb25zIHB1dCB0 aGUgVFRZIGF0IGF0ICIvY29uc29sZSIgKHdoZXJlCj4gaXQKPiDCoMKgwqAgd29uJ3QgYmUgZm91 bmQgYnkgdHR5bmFtZSksIGFuZCBjcmVhdGUgIi9kZXYvY29uc29sZSIgYXMgYW4KPiBAQCAtMzQx LDI3NiArOTcsMTQgQEAgZG9faW5fY2hyb290XzEgKGludCAoKmNiKShjb25zdCBjaGFyICosIGlu dCkpCj4gwqDCoCByZXR1cm4gV0VYSVRTVEFUVVMgKHN0YXR1cyk7Cj4gwqB9Cj4gwqAKPiAtc3Rh dGljIGludAo+IC1kb19pbl9jaHJvb3RfMiAoaW50ICgqY2IpKGNvbnN0IGNoYXIgKiwgaW50KSkK PiAtewo+IC3CoCBwcmludGYgKCJpbmZvOsKgIGVudGVyaW5nIGNocm9vdCAyXG4iKTsKPiAtCj4g LcKgIGludCBwaWRfcGlwZVsyXTsKPiAtwqAgeHBpcGUgKHBpZF9waXBlKTsKPiAtwqAgaW50IGV4 aXRfcGlwZVsyXTsKPiAtwqAgeHBpcGUgKGV4aXRfcGlwZSk7Cj4gLQo+IC3CoCAvKiBPcGVuIHRo ZSBQVFMgdGhhdCB3ZSdsbCBiZSB0ZXN0aW5nIG9uLsKgICovCj4gLcKgIGludCBtYXN0ZXI7Cj4g LcKgIGNoYXIgKnNsYXZlbmFtZTsKPiAtwqAgVkVSSUZZICgobWFzdGVyID0gcG9zaXhfb3BlbnB0 IChPX1JEV1J8T19OT0NUVFl8T19OT05CTE9DSykpID49IDApOwo+IC3CoCBWRVJJRlkgKChzbGF2 ZW5hbWUgPSBwdHNuYW1lIChtYXN0ZXIpKSk7Cj4gLcKgIFZFUklGWSAodW5sb2NrcHQgKG1hc3Rl cikgPT0gMCk7Cj4gLcKgIGlmIChzdHJuY21wIChzbGF2ZW5hbWUsICIvZGV2L3B0cy8iLCA5KSAh PSAwKQo+IC3CoMKgwqAgRkFJTF9VTlNVUFBPUlRFRCAoInNsYXZlIHBzZXVkby10ZXJtaW5hbCBp cyBub3QgdW5kZXIgL2Rldi9wdHMvOgo+ICVzIiwKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHNsYXZlbmFtZSk7Cj4gLcKgIGFkanVzdF9maWxlX2xpbWl0IChz bGF2ZW5hbWUpOwo+IC3CoCAvKiB3YWl0IHVudGlsIGluIGEgbmV3IG1vdW50IG5zIHRvIG9wZW4g dGhlIHNsYXZlICovCj4gLQo+IC3CoCAvKiBlbmFibGUgYHdhaXRgaW5nIG9uIGdyYW5kY2hpbGRy ZW4gKi8KPiAtwqAgVkVSSUZZIChwcmN0bCAoUFJfU0VUX0NISUxEX1NVQlJFQVBFUiwgMSkgPT0g MCk7Cj4gLQo+IC3CoCBwaWRfdCBwaWQgPSB4Zm9yayAoKTsgLyogb3V0ZXIgY2hpbGQgKi8KPiAt wqAgaWYgKHBpZCA9PSAwKQo+IC3CoMKgwqAgewo+IC3CoMKgwqDCoMKgIHhjbG9zZSAobWFzdGVy KTsKPiAtwqDCoMKgwqDCoCB4Y2xvc2UgKHBpZF9waXBlWzBdKTsKPiAtwqDCoMKgwqDCoCB4Y2xv c2UgKGV4aXRfcGlwZVsxXSk7Cj4gLQo+IC3CoMKgwqDCoMKgIGlmICghc3VwcG9ydF9lbnRlcl9t b3VudF9uYW1lc3BhY2UgKCkpCj4gLcKgwqDCoMKgwqDCoMKgRkFJTF9VTlNVUFBPUlRFRCAoImNv dWxkIG5vdCBlbnRlciBuZXcgbW91bnQgbmFtZXNwYWNlIik7Cj4gLQo+IC3CoMKgwqDCoMKgIGlu dCBzbGF2ZSA9IHhvcGVuIChzbGF2ZW5hbWUsIE9fUkRXUiwgMCk7Cj4gLcKgwqDCoMKgwqAgaWYg KCFkb2l0IChzbGF2ZSwgImJhc2ljIHNtb2tldGVzdCIsCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIChzdHJ1Y3QgcmVzdWx0X3Ipey5uYW1lPXNsYXZlbmFtZSwgLnJldD0wLCAu ZXJyPTB9KSkKPiAtwqDCoMKgwqDCoMKgwqAgX2V4aXQgKDEpOwo+IC0KPiAtwqDCoMKgwqDCoCBW RVJJRlkgKG1vdW50ICgidG1wZnMiLCBjaHJvb3RkaXIsICJ0bXBmcyIsIDAsICJtb2RlPTc1NSIp ID09Cj4gMCk7Cj4gLcKgwqDCoMKgwqAgVkVSSUZZIChjaGRpciAoY2hyb290ZGlyKSA9PSAwKTsK PiAtCj4gLcKgwqDCoMKgwqAgeG1rZGlyICgicHJvYyIsIDA3NTUpOwo+IC3CoMKgwqDCoMKgIHht a2RpciAoImRldiIsIDA3NTUpOwo+IC3CoMKgwqDCoMKgIHhta2RpciAoImRldi9wdHMiLCAwNzU1 KTsKPiAtCj4gLcKgwqDCoMKgwqAgVkVSSUZZIChtb3VudCAoImRldnB0cyIsICJkZXYvcHRzIiwg ImRldnB0cyIsCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgTVNf Tk9TVUlEfE1TX05PRVhFQywKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAibmV3aW5zdGFuY2UscHRteG1vZGU9MDY2Nixtb2RlPTYyMCIpID09IDApOwo+IC3CoMKg wqDCoMKgIFZFUklGWSAoc3ltbGluayAoInB0cy9wdG14IiwgImRldi9wdG14IikgPT0gMCk7Cj4g LQo+IC3CoMKgwqDCoMKgIHRvdWNoICgiY29uc29sZSIsIDApOwo+IC3CoMKgwqDCoMKgIHRvdWNo ICgiZGV2L2NvbnNvbGUiLCAwKTsKPiAtwqDCoMKgwqDCoCBWRVJJRlkgKG1vdW50IChzbGF2ZW5h bWUsICJjb25zb2xlIiwgTlVMTCwgTVNfQklORCwgTlVMTCkgPT0KPiAwKTsKPiAtCj4gLcKgwqDC oMKgwqAgeGNocm9vdCAoIi4iKTsKPiAtCj4gLcKgwqDCoMKgwqAgaWYgKHVuc2hhcmUgKENMT05F X05FV05TIHwgQ0xPTkVfTkVXUElEKSA8IDApCj4gLcKgwqDCoMKgwqDCoMKgIEZBSUxfVU5TVVBQ T1JURUQgKCJjb3VsZCBub3QgZW50ZXIgbmV3IFBJRCBuYW1lc3BhY2UiKTsKPiAtwqDCoMKgwqDC oCBwaWQgPSB4Zm9yayAoKTsgLyogaW5uZXIgY2hpbGQgKi8KPiAtwqDCoMKgwqDCoCBpZiAocGlk ID09IDApCj4gLcKgwqDCoMKgwqDCoMKgIHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgIHhjbG9zZSAo cGlkX3BpcGVbMV0pOwo+IC0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgIC8qIHdhaXQgdW50aWwgdGhl IG91dGVyIGNoaWxkIGhhcyBleGl0ZWQgKi8KPiAtwqDCoMKgwqDCoMKgwqDCoMKgIGNoYXIgYzsK PiAtwqDCoMKgwqDCoMKgwqDCoMKgIFZFUklGWSAocmVhZCAoZXhpdF9waXBlWzBdLCAmYywgMSkg PT0gMCk7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoCB4Y2xvc2UgKGV4aXRfcGlwZVswXSk7Cj4gLQo+ IC3CoMKgwqDCoMKgwqDCoMKgwqAgVkVSSUZZIChtb3VudCAoInByb2MiLCAiL3Byb2MiLCAicHJv YyIsCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBN U19OT1NVSUR8TVNfTk9FWEVDfE1TX05PREVWLCBOVUxMKSA9PSAwKTsKPiAtCj4gLcKgwqDCoMKg wqDCoMKgwqDCoCBjaGFyICpsaW5rbmFtZSA9IHhhc3ByaW50ZiAoIi9wcm9jL3NlbGYvZmQvJWQi LCBzbGF2ZSk7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoCBjaGFyICp0YXJnZXQgPSBwcm9jX2ZkX3Jl YWRsaW5rIChsaW5rbmFtZSk7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoCBWRVJJRlkgKHN0cmNtcCAo dGFyZ2V0LCBzdHJyY2hyIChzbGF2ZW5hbWUsICcvJykpID09IDApOwo+IC3CoMKgwqDCoMKgwqDC oMKgwqAgZnJlZSAobGlua25hbWUpOwo+IC0KPiAtwqDCoMKgwqDCoMKgwqDCoMKgIF9leGl0IChj YiAoc2xhdmVuYW1lLCBzbGF2ZSkpOwo+IC3CoMKgwqDCoMKgwqDCoCB9Cj4gLcKgwqDCoMKgwqAg eHdyaXRlIChwaWRfcGlwZVsxXSwgJnBpZCwgc2l6ZW9mIHBpZCk7Cj4gLcKgwqDCoMKgwqAgX2V4 aXQgKDApOwo+IC3CoMKgwqAgfQo+IC3CoCB4Y2xvc2UgKHBpZF9waXBlWzFdKTsKPiAtwqAgeGNs b3NlIChleGl0X3BpcGVbMF0pOwo+IC3CoCB4Y2xvc2UgKGV4aXRfcGlwZVsxXSk7Cj4gLQo+IC3C oCAvKiB3YWl0IGZvciB0aGUgb3V0ZXIgY2hpbGQgKi8KPiAtwqAgaW50IHN0YXR1czsKPiAtwqAg eHdhaXRwaWQgKHBpZCwgJnN0YXR1cywgMCk7Cj4gLcKgIFZFUklGWSAoV0lGRVhJVEVEIChzdGF0 dXMpKTsKPiAtwqAgaW50IHJldCA9IFdFWElUU1RBVFVTIChzdGF0dXMpOwo+IC3CoCBpZiAocmV0 ICE9IDApCj4gLcKgwqDCoCByZXR1cm4gcmV0Owo+IC0KPiAtwqAgLyogc2V0ICdwaWQnIHRvIHRo ZSBpbm5lciBjaGlsZCAqLwo+IC3CoCBWRVJJRlkgKHJlYWQgKHBpZF9waXBlWzBdLCAmcGlkLCBz aXplb2YgcGlkKSA9PSBzaXplb2YgcGlkKTsKPiAtwqAgeGNsb3NlIChwaWRfcGlwZVswXSk7Cj4g LQo+IC3CoCAvKiB3YWl0IGZvciB0aGUgaW5uZXIgY2hpbGQgKi8KPiAtwqAgeHdhaXRwaWQgKHBp ZCwgJnN0YXR1cywgMCk7Cj4gLcKgIFZFUklGWSAoV0lGRVhJVEVEIChzdGF0dXMpKTsKPiAtwqAg eGNsb3NlIChtYXN0ZXIpOwo+IC3CoCByZXR1cm4gV0VYSVRTVEFUVVMgKHN0YXR1cyk7Cj4gLX0K PiAtCj4gLS8qIG1haW4gdGVzdCAqLwo+IC0KPiAtc3RhdGljIGludAo+IC1ydW5fY2hyb290X3Rl c3RzIChjb25zdCBjaGFyICpzbGF2ZW5hbWUsIGludCBzbGF2ZSkKPiAtewo+IC3CoCBzdHJ1Y3Qg c3RhdCBzdDsKPiAtwqAgYm9vbCBvayA9IHRydWU7Cj4gLQo+IC3CoCAvKiBUaGVyZSBhcmUgMyBn cm91cHMgb2YgdGVzdHMgaGVyZS7CoCBUaGUgZmlyc3QgZ3JvdXAgZmFpcmx5Cj4gLcKgwqDCoMKg IGdlbmVyaWNhbGx5IGRvZXMgdGhpbmdzIGtub3duIHRvIG1lc3MgdXAgdHR5bmFtZSwgYW5kIHZl cmlmaWVzCj4gLcKgwqDCoMKgIHRoYXQgdHR5bmFtZSBjb3BlcyBjb3JyZWN0bHkuwqAgVGhlIHJl bWFpbmluZyBncm91cHMgYXJlCj4gLcKgwqDCoMKgIGluY3JlYXNpbmdseSBjb252b2x1dGVkLCBh cyB3ZSB0YXJnZXQgc3BlY2lmaWMgcGFydHMgb2YgdHR5bmFtZQo+IC3CoMKgwqDCoCB0byB0cnkg dG8gY29uZnVzZS7CoCAqLwo+IC0KPiAtwqAgLyogQmFzaWMgdGVzdHMgdGhhdCBpdCBkb2Vzbid0 IGdldCBjb25mdXNlZCBieSBtdWx0aXBsZSBkZXZwdHMKPiAtwqDCoMKgwqAgaW5zdGFuY2VzLsKg ICovCj4gLcKgIHsKPiAtwqDCoMKgIFZFUklGWSAoc3RhdCAoc2xhdmVuYW1lLCAmc3QpIDwgMCk7 IC8qIHNhbml0eSBjaGVjayAqLwo+IC3CoMKgwqAgaWYgKCFkb2l0IChzbGF2ZSwgIm5vIGNvbmZs aWN0LCBubyBtYXRjaCIsCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHN0cnVjdCBy ZXN1bHRfcil7Lm5hbWU9TlVMTCwgLnJldD1FTk9ERVYsCj4gLmVycj1FTk9ERVZ9KSkKPiAtwqDC oMKgwqDCoCBvayA9IGZhbHNlOwo+IC3CoMKgwqAgVkVSSUZZIChtb3VudCAoIi9jb25zb2xlIiwg Ii9kZXYvY29uc29sZSIsIE5VTEwsIE1TX0JJTkQsIE5VTEwpCj4gPT0gMCk7Cj4gLcKgwqDCoCBp ZiAoIWRvaXQgKHNsYXZlLCAibm8gY29uZmxpY3QsIGNvbnNvbGUiLAo+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIChzdHJ1Y3QgcmVzdWx0X3Ipey5uYW1lPSIvZGV2L2NvbnNvbGUiLCAu cmV0PTAsCj4gLmVycj0wfSkpCj4gLcKgwqDCoMKgwqAgb2sgPSBmYWxzZTsKPiAtwqDCoMKgIFZF UklGWSAodW1vdW50ICgiL2Rldi9jb25zb2xlIikgPT0gMCk7Cj4gLQo+IC3CoMKgwqAgLyogS2Vl cCBjcmVhdGluZyBQVFlzIHVudGlsIHdlIHdlIGdldCBhIG5hbWUgY29sbGlzaW9uLsKgICovCj4g LcKgwqDCoCB3aGlsZSAodHJ1ZSkKPiAtwqDCoMKgwqDCoCB7Cj4gLcKgwqDCoMKgwqDCoMKgaWYg KHN0YXQgKHNsYXZlbmFtZSwgJnN0KSA9PSAwKQo+IC3CoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+ IC3CoMKgwqDCoMKgwqDCoGlmIChwb3NpeF9vcGVucHQgKE9fUkRXUnxPX05PQ1RUWXxPX05PTkJM T0NLKSA8IDApCj4gLcKgwqDCoMKgwqDCoMKgwqAgewo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoCBp ZiAoZXJybm8gPT0gRU5PU1BDIHx8IGVycm5vID09IEVNRklMRSB8fCBlcnJubyA9PSBFTkZJTEUp Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGQUlMX1VOU1VQUE9SVEVEICgiY2Fubm90IHJl LWNyZWF0ZSBQVFkgXCIlc1wiIGluCj4gY2hyb290OiAlbSIKPiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAiIChjb25zaWRlciBp bmNyZWFzaW5nIGxpbWl0cykiLAo+IHNsYXZlbmFtZSk7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg IGVsc2UKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEZBSUxfRVhJVDEgKCJjYW5ub3QgcmUt Y3JlYXRlIFBUWSBcIiVzXCIgY2hyb290OiAlbSIsCj4gc2xhdmVuYW1lKTsKPiAtwqDCoMKgwqDC oMKgwqDCoCB9Cj4gLcKgwqDCoMKgwqAgfQo+IC0KPiAtwqDCoMKgIGlmICghZG9pdCAoc2xhdmUs ICJjb25mbGljdCwgbm8gbWF0Y2giLAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChz dHJ1Y3QgcmVzdWx0X3Ipey5uYW1lPU5VTEwsIC5yZXQ9RU5PREVWLAo+IC5lcnI9RU5PREVWfSkp Cj4gLcKgwqDCoMKgwqAgb2sgPSBmYWxzZTsKPiAtwqDCoMKgIFZFUklGWSAobW91bnQgKCIvY29u c29sZSIsICIvZGV2L2NvbnNvbGUiLCBOVUxMLCBNU19CSU5ELCBOVUxMKQo+ID09IDApOwo+IC3C oMKgwqAgaWYgKCFkb2l0IChzbGF2ZSwgImNvbmZsaWN0LCBjb25zb2xlIiwKPiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAoc3RydWN0IHJlc3VsdF9yKXsubmFtZT0iL2Rldi9jb25zb2xl IiwgLnJldD0wLAo+IC5lcnI9MH0pKQo+IC3CoMKgwqDCoMKgIG9rID0gZmFsc2U7Cj4gLcKgwqDC oCBWRVJJRlkgKHVtb3VudCAoIi9kZXYvY29uc29sZSIpID09IDApOwo+IC3CoCB9Cj4gLQo+IC3C oCAvKiBUaGUgZmlyc3QgdGVzdHMga2luZGEgYXNzdW1lZCB0aGF0IHRoZXkgaGl0IGNlcnRhaW4g Y29kZS1wYXRocwo+IC3CoMKgwqDCoCBiYXNlZCBvbiBhc3N1bWluZyB0aGF0IHRoZSByZWFkbGlu ayB0YXJnZXQgaXMgJ3NsYXZlbmFtZScsIGJ1dAo+IC3CoMKgwqDCoCB0aGF0J3Mgbm90IHF1aXRl IGFsd2F5cyB0cnVlLsKgIFRoZXkncmUgc3RpbGwgYSBnb29kIHByZWxpbWluYXJ5Cj4gLcKgwqDC oMKgIHNhbml0eSBjaGVjaywgc28ga2VlcCB0aGVtLCBidXQgbGV0J3MgYWRkIHRlc3RzIHRoYXQg bWFrZSBzdXJlCj4gLcKgwqDCoMKgIHRoYXQgdGhvc2UgY29kZS1wYXRocyBhcmUgaGl0IGJ5IGRv aW5nIGEgcmVhZGxpbmsgb3Vyc2VsZi7CoCAqLwo+IC3CoCB7Cj4gLcKgwqDCoCBjaGFyICpsaW5r bmFtZSA9IHhhc3ByaW50ZiAoIi9wcm9jL3NlbGYvZmQvJWQiLCBzbGF2ZSk7Cj4gLcKgwqDCoCBj aGFyICp0YXJnZXQgPSBwcm9jX2ZkX3JlYWRsaW5rIChsaW5rbmFtZSk7Cj4gLcKgwqDCoCBmcmVl IChsaW5rbmFtZSk7Cj4gLcKgwqDCoCAvKiBEZXBlbmRpbmcgb24gaG93IHdlIHNldCB1cCB0aGUg Y2hyb290LCB0aGUga2VybmVsIG1heSBvciBtYXkKPiBub3QKPiAtwqDCoMKgwqDCoMKgIHRyaW0g dGhlIGxlYWRpbmcgcGF0aCB0byB0aGUgdGFyZ2V0IChpdCBtYXkgZ2l2ZSB1cyAiLzYiLAo+IC3C oMKgwqDCoMKgwqAgaW5zdGVhZCBvZiAiL2Rldi9wdHMvNiIpLsKgIFdlIHRlc3QgaXQgYm90aCB3 YXlzCj4gKGRvX2luX2Nocm9vdF8xCj4gLcKgwqDCoMKgwqDCoCBhbmQgZG9faW5fY2hyb290XzIp LsKgIFRoaXMgdGVzdCBncm91cCByZWxpZXMgb24gdGhlIHRhcmdldAo+IC3CoMKgwqDCoMKgwqAg ZXhpc3RpbmcsIHNvIGd1YXJhbnRlZSB0aGF0IGl0IGRvZXMgZXhpc3QgYnkgY3JlYXRpbmcgaXQg aWYKPiAtwqDCoMKgwqDCoMKgIG5lY2Vzc2FyeS7CoCAqLwo+IC3CoMKgwqAgaWYgKHN0YXQgKHRh cmdldCwgJnN0KSA8IDApCj4gLcKgwqDCoMKgwqAgewo+IC3CoMKgwqDCoMKgwqDCoCBWRVJJRlkg KGVycm5vID09IEVOT0VOVCk7Cj4gLcKgwqDCoMKgwqDCoMKgIHRvdWNoICh0YXJnZXQsIDApOwo+ IC3CoMKgwqDCoMKgIH0KPiAtCj4gLcKgwqDCoCBWRVJJRlkgKG1vdW50ICgiL2NvbnNvbGUiLCAi L2Rldi9jb25zb2xlIiwgTlVMTCwgTVNfQklORCwgTlVMTCkKPiA9PSAwKTsKPiAtwqDCoMKgIFZF UklGWSAobW91bnQgKCIvY29uc29sZSIsIHRhcmdldCwgTlVMTCwgTVNfQklORCwgTlVMTCkgPT0g MCk7Cj4gLcKgwqDCoCBpZiAoIWRvaXQgKHNsYXZlLCAid2l0aCByZWFkbGluayB0YXJnZXQiLAo+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChzdHJ1Y3QgcmVzdWx0X3Ipey5uYW1lPXRh cmdldCwgLnJldD0wLCAuZXJyPTB9KSkKPiAtwqDCoMKgwqDCoCBvayA9IGZhbHNlOwo+IC3CoMKg wqAgVkVSSUZZICh1bW91bnQgKHRhcmdldCkgPT0gMCk7Cj4gLcKgwqDCoCBWRVJJRlkgKHVtb3Vu dCAoIi9kZXYvY29uc29sZSIpID09IDApOwo+IC0KPiAtwqDCoMKgIFZFUklGWSAobW91bnQgKCIv Y29uc29sZSIsICIvZGV2L2NvbnNvbGUiLCBOVUxMLCBNU19CSU5ELCBOVUxMKQo+ID09IDApOwo+ IC3CoMKgwqAgVkVSSUZZIChtb3VudCAoc2xhdmVuYW1lLCB0YXJnZXQsIE5VTEwsIE1TX0JJTkQs IE5VTEwpID09IDApOwo+IC3CoMKgwqAgaWYgKCFkb2l0IChzbGF2ZSwgIndpdGggcmVhZGxpbmsg dHJhcDsgZmFsbGJhY2siLAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChzdHJ1Y3Qg cmVzdWx0X3Ipey5uYW1lPSIvZGV2L2NvbnNvbGUiLCAucmV0PTAsCj4gLmVycj0wfSkpCj4gLcKg wqDCoMKgwqAgb2sgPSBmYWxzZTsKPiAtwqDCoMKgIFZFUklGWSAodW1vdW50ICh0YXJnZXQpID09 IDApOwo+IC3CoMKgwqAgVkVSSUZZICh1bW91bnQgKCIvZGV2L2NvbnNvbGUiKSA9PSAwKTsKPiAt Cj4gLcKgwqDCoCBWRVJJRlkgKG1vdW50IChzbGF2ZW5hbWUsIHRhcmdldCwgTlVMTCwgTVNfQklO RCwgTlVMTCkgPT0gMCk7Cj4gLcKgwqDCoCBpZiAoIWRvaXQgKHNsYXZlLCAid2l0aCByZWFkbGlu ayB0cmFwOyBubyBmYWxsYmFjayIsCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHN0 cnVjdCByZXN1bHRfcil7Lm5hbWU9TlVMTCwgLnJldD1FTk9ERVYsCj4gLmVycj1FTk9ERVZ9KSkK PiAtwqDCoMKgwqDCoCBvayA9IGZhbHNlOwo+IC3CoMKgwqAgVkVSSUZZICh1bW91bnQgKHRhcmdl dCkgPT0gMCk7Cj4gLcKgIH0KPiAtCj4gLcKgIC8qIFRoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQg ZXZlcnl0aGluZyBzdGlsbCB3b3JrcyBPSyBpZiByZWFkZGlyCj4gLcKgwqDCoMKgIGZpbmRzIGEg cHNldWRvLW1hdGNoIGJlZm9yZSBhbmQvb3IgYWZ0ZXIgdGhlIGFjdHVhbCBtYXRjaC7CoCBOb3cs Cj4gLcKgwqDCoMKgIHRvIGRvIHRoYXQsIHdlIG5lZWQgdG8gY29udHJvbCB0aGF0IHJlYWRkaXIg ZmluZHMgdGhlCj4gLcKgwqDCoMKgIHBzZXVkby1tYXRjaGVzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhl IGFjdHVhbCBtYXRjaDsgYW5kIHRoZXJlJ3Mgbm8KPiAtwqDCoMKgwqAgZ29vZCB3YXkgdG8gY29u dHJvbCB0aGF0IG9yZGVyIGluIGFic2VuY2Ugb2Ygd2hpdGVib3ggdGVzdGluZy4KPiAtwqDCoMKg wqAgU28sIGp1c3QgY3JlYXRlIDMgZmlsZXMsIHRoZW4gdXNlIG9wZW5kaXIvcmVhZGRpciB0byBz ZWUgd2hhdAo+IC3CoMKgwqDCoCBvcmRlciB0aGV5IGFyZSBpbiwgYW5kIGFzc2lnbiBtZWFuaW5n IGJhc2VkIG9uIHRoYXQgb3JkZXIsIG5vdAo+IGJ5Cj4gLcKgwqDCoMKgIG5hbWU7IGFzc2lnbmlu ZyB0aGUgZmlyc3QgdG8gYmUgYSBwc2V1ZG8tbWF0Y2gsIHRoZSBzZWNvbmQgdG8gYmUKPiAtwqDC oMKgwqAgdGhlIGFjdHVhbCBtYXRjaCwgYW5kIHRoZSB0aGlyZCB0byBiZSBhIHBzZXVkby1tYXRj aC7CoCBUaGlzCj4gLcKgwqDCoMKgIGFzc3VtZXMgdGhhdCAob24gdG1wZnMpIG9yZGVyaW5nIHdp dGhpbiB0aGUgZGlyZWN0b3J5IGlzIHN0YWJsZQo+IC3CoMKgwqDCoCBpbiB0aGUgYWJzZW5jZSBv ZiBtb2RpZmljYXRpb24sIHdoaWNoIHNlZW1zIHJlYXNvbmFibHkgc2FmZS7CoCAqLwo+IC3CoCB7 Cj4gLcKgwqDCoCAvKiBzaW5jZSB3ZSdyZSB0ZXN0aW5nIHRoZSBmYWxsYmFjayBzZWFyY2gsIGRp c2FibGUgdGhlIHJlYWRsaW5rCj4gLcKgwqDCoMKgwqDCoCBoYXBweS1wYXRoICovCj4gLcKgwqDC oCBWRVJJRlkgKHVtb3VudDIgKCIvcHJvYyIsIE1OVF9ERVRBQ0gpID09IDApOwo+IC0KPiAtwqDC oMKgIHRvdWNoICgiL2Rldi9jb25zb2xlMSIsIDApOwo+IC3CoMKgwqAgdG91Y2ggKCIvZGV2L2Nv bnNvbGUyIiwgMCk7Cj4gLcKgwqDCoCB0b3VjaCAoIi9kZXYvY29uc29sZTMiLCAwKTsKPiAtCj4g LcKgwqDCoCBjaGFyICpjWzNdOwo+IC3CoMKgwqAgaW50IGNpID0gMDsKPiAtwqDCoMKgIERJUiAq ZGlyc3RyZWFtID0gb3BlbmRpciAoIi9kZXYiKTsKPiAtwqDCoMKgIFZFUklGWSAoZGlyc3RyZWFt ICE9IE5VTEwpOwo+IC3CoMKgwqAgc3RydWN0IGRpcmVudCAqZDsKPiAtwqDCoMKgIHdoaWxlICgo ZCA9IHJlYWRkaXIgKGRpcnN0cmVhbSkpICE9IE5VTEwgJiYgY2kgPCAzKQo+IC3CoMKgwqDCoMKg IHsKPiAtwqDCoMKgwqDCoMKgwqAgaWYgKHN0cmNtcCAoZC0+ZF9uYW1lLCAiY29uc29sZTEiKQo+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgICYmIHN0cmNtcCAoZC0+ZF9uYW1lLCAiY29uc29sZTIi KQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgICYmIHN0cmNtcCAoZC0+ZF9uYW1lLCAiY29uc29s ZTMiKSApCj4gLcKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPiAtwqDCoMKgwqDCoMKgwqAg Y1tjaSsrXSA9IHhhc3ByaW50ZiAoIi9kZXYvJXMiLCBkLT5kX25hbWUpOwo+IC3CoMKgwqDCoMKg IH0KPiAtwqDCoMKgIFZFUklGWSAoY2kgPT0gMyk7Cj4gLcKgwqDCoCBWRVJJRlkgKGNsb3NlZGly IChkaXJzdHJlYW0pID09IDApOwo+IC0KPiAtwqDCoMKgIFZFUklGWSAobW91bnQgKHNsYXZlbmFt ZSwgY1swXSwgTlVMTCwgTVNfQklORCwgTlVMTCkgPT0gMCk7Cj4gLcKgwqDCoCBWRVJJRlkgKG1v dW50ICgiL2NvbnNvbGUiLCBjWzFdLCBOVUxMLCBNU19CSU5ELCBOVUxMKSA9PSAwKTsKPiAtwqDC oMKgIFZFUklGWSAobW91bnQgKHNsYXZlbmFtZSwgY1syXSwgTlVMTCwgTVNfQklORCwgTlVMTCkg PT0gMCk7Cj4gLcKgwqDCoCBWRVJJRlkgKHVtb3VudDIgKCIvZGV2L3B0cyIsIE1OVF9ERVRBQ0gp ID09IDApOwo+IC3CoMKgwqAgaWYgKCFkb2l0IChzbGF2ZSwgIndpdGggc2VhcmNoLXBhdGggdHJh cCIsCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHN0cnVjdCByZXN1bHRfcil7Lm5h bWU9Y1sxXSwgLnJldD0wLCAuZXJyPTB9KSkKPiAtwqDCoMKgwqDCoCBvayA9IGZhbHNlOwo+IC3C oMKgwqAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCj4gLcKgwqDCoMKgwqAgewo+IC3CoMKg wqDCoMKgwqDCoCBWRVJJRlkgKHVtb3VudCAoY1tpXSkgPT0gMCk7Cj4gLcKgwqDCoMKgwqDCoMKg IFZFUklGWSAodW5saW5rIChjW2ldKSA9PSAwKTsKPiAtwqDCoMKgwqDCoMKgwqAgZnJlZSAoY1tp XSk7Cj4gLcKgwqDCoMKgwqAgfQo+IC3CoCB9Cj4gLQo+IC3CoCByZXR1cm4gb2sgPyAwIDogMTsK PiAtfQo+IC0KPiDCoHN0YXRpYyBpbnQKPiDCoGRvX3Rlc3QgKHZvaWQpCj4gwqB7Cj4gwqDCoCBz dXBwb3J0X2JlY29tZV9yb290ICgpOwo+IMKgCj4gLcKgIGludCByZXQxID0gZG9faW5fY2hyb290 XzEgKHJ1bl9jaHJvb3RfdGVzdHMpOwo+IC3CoCBpZiAocmV0MSA9PSBFWElUX1VOU1VQUE9SVEVE KQo+IC3CoMKgwqAgcmV0dXJuIHJldDE7Cj4gLQo+IC3CoCBpbnQgcmV0MiA9IGRvX2luX2Nocm9v dF8yIChydW5fY2hyb290X3Rlc3RzKTsKPiAtwqAgaWYgKHJldDIgPT0gRVhJVF9VTlNVUFBPUlRF RCkKPiAtwqDCoMKgIHJldHVybiByZXQyOwo+ICvCoCBkb19pbl9jaHJvb3RfMSAocnVuX2Nocm9v dF90ZXN0cyk7Cj4gwqAKPiAtwqAgcmV0dXJuwqAgcmV0MSB8IHJldDI7Cj4gK8KgIHJldHVybiAw Owo+IMKgfQo+IMKgCj4gwqAjaW5jbHVkZSA8c3VwcG9ydC90ZXN0LWRyaXZlci5jPgoKLS0gClhp IFJ1b3lhbyA8eHJ5MTExQHhyeTExMS5zaXRlPgpTY2hvb2wgb2YgQWVyb3NwYWNlIFNjaWVuY2Ug YW5kIFRlY2hub2xvZ3ksIFhpZGlhbiBVbml2ZXJzaXR5Cg==