From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: Re: [PATCH] tools/intel_guc_logger: Utility for capturing GuC firmware logs in a file Date: Tue, 6 Sep 2016 14:17:14 +0100 Message-ID: <57CEC1DA.6090009@linux.intel.com> References: <1473158613-12006-1-git-send-email-akash.goel@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTPS id E37746E5EA for ; Tue, 6 Sep 2016 13:17:19 +0000 (UTC) In-Reply-To: <1473158613-12006-1-git-send-email-akash.goel@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: akash.goel@intel.com, intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org CkhpLAoKT24gMDYvMDkvMTYgMTE6NDMsIGFrYXNoLmdvZWxAaW50ZWwuY29tIHdyb3RlOgo+IEZy b206IEFrYXNoIEdvZWwgPGFrYXNoLmdvZWxAaW50ZWwuY29tPgo+Cj4gVGhpcyBwYXRjaCBwcm92 aWRlcyBhIHRlc3QgdXRpbGl0eSB3aGljaCBoZWxwcyBjYXB0dXJlIEd1QyBmaXJtd2FyZSBsb2dz IGFuZAo+IHRoZW4gZHVtcCB0aGVtIHRvIGZpbGUuCj4gVGhlIGxvZ3MgYXJlIHB1bGxlZCBmcm9t IGEgZGVidWdmcyBmaWxlICcvc3lzL2tlcm5lbC9kZWJ1Zy9kcmkvZ3VjX2xvZycgYW5kCj4gc3Rv cmVkIGludG8gYSBmaWxlICcvdG1wL2d1Y19sb2dfZHVtcC5kYXQnLCB0aGUgbmFtZSBvZiB0aGUg b3V0cHV0IGZpbGUgY2FuCj4gYmUgY2hhbmdlZCB0aHJvdWdoIGEgY29tbWFuZCBsaW5lIGFyZ3Vt ZW50Lgo+Cj4gVGhlIHV0aWxpdHkgZ29lcyBpbnRvIGFuIGluZmluaXRlIGxvb3Agd2hlcmUgaXQg d2FpdHMgZm9yIHRoZSBhcnJpdmFsIG9mIG5ldwo+IGxvZ3MgYW5kIGFzIHNvb24gYXMgbmV3IHNl dCBvZiBsb2dzIGFyZSBwcm9kdWNlZCBpdCBjYXB0dXJlcyB0aGVtIGluIGl0cyBsb2NhbAo+IGJ1 ZmZlciB3aGljaCBpcyB0aGVuIGZsdXNoZWQgb3V0IHRvIHRoZSBmaWxlIG9uIGRpc2suCj4gQW55 IHRpbWUgd2hlbiBsb2dnaW5nIG5lZWRzIHRvIGJlIGVuZGVkLCBVc2VyIGNhbiBzdG9wIHRoaXMg dXRpbGl0eSAoQ1RSTCtDKS4KPgo+IEJlZm9yZSBlbnRlcmluZyBpbnRvIGEgbG9vcCwgaXQgZmly c3QgZGlzY2FyZHMgd2hhdGV2ZXIgbG9ncyBhcmUgcHJlc2VudCBpbgo+IHRoZSBkZWJ1Z2ZzIGZp bGUuCj4gVGhpcyB3YXkgVXNlciBjYW4gZmlyc3QgbGF1bmNoIHRoaXMgdXRpbGl0eSBhbmQgdGhl biBzdGFydCBhIHdvcmtsb2FkL2FjdGl2aXR5Cj4gZm9yIHdoaWNoIEd1QyBmaXJtd2FyZSBsb2dz IGFyZSB0byBiZSBhY3R1YWxseSBjYXB0dXJlZCBhbmQga2VlcCBydW5uaW5nIHRoZQo+IHV0aWxp dHkgZm9yIGFzIGxvbmcgYXMgaXRzIG5lZWRlZCwgbGlrZSBvbmNlIHRoZSB3b3JrbG9hZCBpcyBv dmVyIHRoaXMgdXRpbGl0eQo+IGNhbiBiZSBmb3JjZWZ1bGx5IHN0b3BwZWQuCj4KPiBJZiB0aGUg bG9nZ2luZyB3YXNuJ3QgZW5hYmxlZCBvbiBHdUMgc2lkZSBieSB0aGUgRHJpdmVyIGF0IGJvb3Qg dGltZSwgdXRpbGl0eQo+IHdpbGwgZmlyc3QgZW5hYmxlIHRoZSBsb2dnaW5nIGFuZCBsYXRlciBv biB3aGVuIGl0IGlzIHN0b3BwZWQgKENUUkwrQykgaXQgd2lsbAo+IGFsc28gcGF1c2UgdGhlIGxv Z2dpbmcgb24gR3VDIHNpZGUuCj4KPiBTaWduZWQtb2ZmLWJ5OiBBa2FzaCBHb2VsIDxha2FzaC5n b2VsQGludGVsLmNvbT4KPiAtLS0KPiAgIHRvb2xzL01ha2VmaWxlLnNvdXJjZXMgICB8ICAgMSAr Cj4gICB0b29scy9pbnRlbF9ndWNfbG9nZ2VyLmMgfCA0NDEgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysKPiAgIDIgZmlsZXMgY2hhbmdlZCwgNDQyIGluc2Vy dGlvbnMoKykKPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy9pbnRlbF9ndWNfbG9nZ2VyLmMK Pgo+IGRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZS5zb3VyY2VzIGIvdG9vbHMvTWFrZWZpbGUu c291cmNlcwo+IGluZGV4IDJiYjZjOGUuLmJlNTg4NzEgMTAwNjQ0Cj4gLS0tIGEvdG9vbHMvTWFr ZWZpbGUuc291cmNlcwo+ICsrKyBiL3Rvb2xzL01ha2VmaWxlLnNvdXJjZXMKPiBAQCAtMTksNiAr MTksNyBAQCB0b29sc19wcm9nX2xpc3RzID0JCVwKPiAgIAlpbnRlbF9ncHVfdGltZQkJXAo+ICAg CWludGVsX2dwdV90b3AJCVwKPiAgIAlpbnRlbF9ndHQJCVwKPiArCWludGVsX2d1Y19sb2dnZXIg ICAgICAgIFwKPiAgIAlpbnRlbF9pbmZvZnJhbWVzCVwKPiAgIAlpbnRlbF9sM19wYXJpdHkJCVwK PiAgIAlpbnRlbF9saWQJCVwKPiBkaWZmIC0tZ2l0IGEvdG9vbHMvaW50ZWxfZ3VjX2xvZ2dlci5j IGIvdG9vbHMvaW50ZWxfZ3VjX2xvZ2dlci5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRl eCAwMDAwMDAwLi45MjE3MmZhCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL3Rvb2xzL2ludGVsX2d1 Y19sb2dnZXIuYwo+IEBAIC0wLDAgKzEsNDQxIEBACj4gKwo+ICsjZGVmaW5lIF9HTlVfU09VUkNF ICAvKiBGb3IgdXNpbmcgT19ESVJFQ1QgKi8KPiArI2luY2x1ZGUgPGludHR5cGVzLmg+Cj4gKyNp bmNsdWRlIDxzdGRpby5oPgo+ICsjaW5jbHVkZSA8ZmNudGwuaD4KPiArI2luY2x1ZGUgPHNjaGVk Lmg+Cj4gKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KPiArI2luY2x1ZGUgPHN0cmluZy5oPgo+ICsj aW5jbHVkZSA8ZXJybm8uaD4KPiArI2luY2x1ZGUgPHNpZ25hbC5oPgo+ICsjaW5jbHVkZSA8c3Rk bGliLmg+Cj4gKyNpbmNsdWRlIDx1bmlzdGQuaD4KPiArI2luY2x1ZGUgPHN5cy9wb2xsLmg+Cj4g KyNpbmNsdWRlIDxzeXMvd2FpdC5oPgo+ICsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cj4gKyNpbmNs dWRlIDxzeXMvc3lzY2FsbC5oPgo+ICsjaW5jbHVkZSA8c3lzL21tYW4uaD4KPiArI2luY2x1ZGUg PGFzc2VydC5oPgo+ICsjaW5jbHVkZSA8cHRocmVhZC5oPgo+ICsKPiArI2luY2x1ZGUgImlndC5o Igo+ICsKPiArI2RlZmluZSBNQih4KSAoKHVpbnQ2NF90KSh4KSAqIDEwMjQgKiAxMDI0KQo+ICsj aWZuZGVmIFBBR0VfU0laRQo+ICsgICNkZWZpbmUgUEFHRV9TSVpFIDQwOTYKPiArI2VuZGlmCj4g KyNkZWZpbmUgU1VCQlVGX1NJWkUgKDE5KlBBR0VfU0laRSkKPiArLyogTmVlZCBsYXJnZSBidWZm ZXJpbmcgZnJvbSBsb2dnZXIgc2lkZSB0byBoaWRlIHRoZSBESVNLIElPIGxhdGVuY3ksIERyaXZl cgo+ICsgKiBjYW4gb25seSBzdG9yZSA4IHNuYXBzaG90cyBvZiBHdUMgbG9nIGJ1ZmZlciBpbiBy ZWxheS4KPiArICovCj4gKyNkZWZpbmUgTlVNX1NVQkJVRlMgMTAwCj4gKwo+ICsjZGVmaW5lIFJF TEFZX0ZJTEVfTkFNRSAgImd1Y19sb2ciCj4gKyNkZWZpbmUgQ09OVFJPTF9GSUxFX05BTUUgImk5 MTVfZ3VjX2xvZ19jb250cm9sIgo+ICsKPiArY2hhciAqcmVhZF9idWZmZXI7Cj4gK2NoYXIgKm91 dF9maWxlbmFtZTsKPiAraW50IHBvbGxfdGltZW91dCA9IDI7IC8qIGJ5IGRlZmF1bHQgMm1zIHRp bWVvdXQgKi8KPiArcHRocmVhZF9tdXRleF90IG11dGV4Owo+ICtwdGhyZWFkX3QgZmx1c2hfdGhy ZWFkOwo+ICtpbnQgdmVyYm9zaXR5X2xldmVsID0gMzsgLyogYnkgZGVmYXVsdCBjYXB0dXJlIGxv Z3MgYXQgbWF4IHZlcmJvc2l0eSAqLwo+ICt1aW50MzJfdCBwcm9kdWNlZCwgY29uc3VtZWQ7Cj4g K3VpbnQ2NF90IHRvdGFsX2J5dGVzX3dyaXR0ZW47Cj4gK2ludCBudW1fYnVmZmVycyA9IE5VTV9T VUJCVUZTOwo+ICtpbnQgcmVsYXlfZmQsIG91dGZpbGVfZmQgPSAtMTsKPiArYm9vbCBzdG9wX2xv Z2dpbmcsIGRpc2NhcmRfb2xkbG9nczsKPiArdWludDMyX3QgdGVzdF9kdXJhdGlvbiwgbWF4X2Zp bGVzaXplOwo+ICtwdGhyZWFkX2NvbmRfdCB1bmRlcmZsb3dfY29uZCwgb3ZlcmZsb3dfY29uZDsK PiArCj4gK3N0YXRpYyB2b2lkIGd1Y19sb2dfY29udHJvbChib29sIGVuYWJsZV9sb2dnaW5nKQo+ ICt7Cj4gKwlpbnQgY29udHJvbF9mZDsKPiArCWNoYXIgZGF0YVsxOV07Cj4gKwl1aW50NjRfdCB2 YWw7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCWNvbnRyb2xfZmQgPSBpZ3RfZGVidWdmc19vcGVuKENP TlRST0xfRklMRV9OQU1FLCBPX1dST05MWSk7Cj4gKwlpZiAoY29udHJvbF9mZCA8IDApCj4gKwkJ aWd0X2Fzc2VydF9mKDAsICJDb3VsZG4ndCBvcGVuIHRoZSBndWMgbG9nIGNvbnRyb2wgZmlsZSIp Owo+ICsKPiArCXZhbCA9IGVuYWJsZV9sb2dnaW5nID8gKCh2ZXJib3NpdHlfbGV2ZWwgPDwgNCkg fCAweDEpIDogMDsKPiArCj4gKwlzbnByaW50ZihkYXRhLCBzaXplb2YoZGF0YSksICIweCUiIFBS SXg2NCwgdmFsKTsKPiArCXJldCA9IHdyaXRlKGNvbnRyb2xfZmQsIGRhdGEsIHN0cmxlbihkYXRh KSArIDEpOwoKTWlub3I6IEl0IGxvb2tzIHNhZmUgbGlrZSBpdCBpcyBidXQgc29tZXRoaW5nIGxp a2UgYmVsb3cgd291bGQgbWF5YmUgYmUgCm1vcmUgcm9idXN0PwoKcmV0ID0gc25wcmludGYoZGF0 YSwgc2l6ZW9mKGRhdGEpLCAiMHglIiBQUkl4NjQsIHZhbCk7CmlndF9hc3NlcnQocmV0ID4gMiAm JiByZXQgPCBzaXplb2YoZGF0YSkpOwpyZXQgPSB3cml0ZShjb250cm9sX2ZkLCBkYXRhLCByZXQp OwppZ3RfYXNzZXJ0KHJldCA+IDApOyAvLyBhc3N1bWluZyBzaG9ydCB3cml0ZXMgY2FuJ3QgaGFw cGVuCgpVcCB0byB5b3UuCgo+ICsJaWYgKHJldCA8IDApCj4gKwkJaWd0X2Fzc2VydF9mKDAsICJD b3VsZG4ndCB3cml0ZSB0byB0aGUgbG9nIGNvbnRyb2wgZmlsZSIpOwo+ICsKPiArCWNsb3NlKGNv bnRyb2xfZmQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpbnRfc2lnX2hhbmRsZXIoaW50IHNp ZykKPiArewo+ICsJaWd0X2luZm8oIlJlY2VpdmVkIHNpZ25hbCAlZFxuIiwgc2lnKTsKPiArCj4g KwlzdG9wX2xvZ2dpbmcgPSB0cnVlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBwdWxsX2xlZnRv dmVyX2RhdGEodm9pZCkKPiArewo+ICsJdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQgPSAwOwo+ICsJ aW50IHJldDsKPiArCj4gKwl3aGlsZSAoMSkgewo+ICsJCS8qIFJlYWQgdGhlIGxvZ3MgZnJvbSBy ZWxheSBidWZmZXIgKi8KPiArCQlyZXQgPSByZWFkKHJlbGF5X2ZkLCByZWFkX2J1ZmZlciwgU1VC QlVGX1NJWkUpOwo+ICsJCWlmICghcmV0KQo+ICsJCQlicmVhazsKPiArCQllbHNlIGlmIChyZXQg PCAwKQo+ICsJCQlpZ3RfYXNzZXJ0X2YoMCwgIkZhaWxlZCB0byByZWFkIGZyb20gdGhlIGd1YyBs b2cgZmlsZSIpOwo+ICsJCWVsc2UgaWYgKHJldCA8IFNVQkJVRl9TSVpFKQo+ICsJCQlpZ3RfYXNz ZXJ0X2YoMCwgImludmFsaWQgcmVhZCBmcm9tIHJlbGF5IGZpbGUiKTsKPiArCj4gKwkJYnl0ZXNf cmVhZCArPSByZXQ7Cj4gKwo+ICsJCWlmIChvdXRmaWxlX2ZkID4gMCkgewoKID49IDAgSSB0aGlu ay4gT3IgaXMgaXQgZXZlbiBuZWVkZWQgc2luY2Ugb3Blbl9vdXRwdXRfZmlsZSBhc3NlcnRzIGlm IGl0IApmYWlscyB0byBvcGVuPwoKPiArCQkJcmV0ID0gd3JpdGUob3V0ZmlsZV9mZCwgcmVhZF9i dWZmZXIsIFNVQkJVRl9TSVpFKTsKPiArCQkJaWYgKHJldCA8IDApCj4gKwkJCQlpZ3RfYXNzZXJ0 X2YoMCwgIkNvdWxkbid0IGR1bXAgdGhlIGxvZ3MgaW4gYSBmaWxlIik7CgpEbyB5b3UgbmVlZCB0 byBjaGVjayBmb3Igc2hvcnQgd3JpdGVzIGFzIHdlbGwgaGVyZT8gTWFuIHBhZ2UgZm9yIHdyaXRl IApzYXlzIGl0IGNhbiBoYXBwZW4gd2l0aCBvdXQgb2YgZGlzayBzcGFjZSBvciBzaWduYWxzLgoK PiArCQkJdG90YWxfYnl0ZXNfd3JpdHRlbiArPSByZXQ7Cj4gKwkJfQo+ICsJfTsKPiArCj4gKwlp Z3RfZGVidWcoIiV1IGJ5dGVzIGZsdXNoZWRcbiIsIGJ5dGVzX3JlYWQpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IG51bV9maWxsZWRfYnVmcyh2b2lkKQo+ICt7Cj4gKwlyZXR1cm4gKHByb2R1Y2Vk IC0gY29uc3VtZWQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBwdWxsX2RhdGEodm9pZCkKPiAr ewo+ICsJY2hhciAqcHRyOwo+ICsJaW50IHJldDsKPiArCj4gKwlwdGhyZWFkX211dGV4X2xvY2so Jm11dGV4KTsKPiArCXdoaWxlIChudW1fZmlsbGVkX2J1ZnMoKSA+PSBudW1fYnVmZmVycykgewo+ ICsJCWlndF9kZWJ1Zygib3ZlcmZsb3csIHdpbGwgd2FpdCwgcHJvZHVjZWQgJXUsIGNvbnN1bWVk ICV1XG4iLCBwcm9kdWNlZCwgY29uc3VtZWQpOwo+ICsJCS8qIFN0YWxsIHRoZSBtYWluIHRocmVh ZCBpbiBjYXNlIG9mIG92ZXJmbG93LCBhcyB0aGVyZSBhcmUgbm8KPiArCQkgKiBidWZmZXJzIGF2 YWlsYWJsZSB0byBzdG9yZSB0aGUgbmV3IGxvZ3MsIG90aGVyd2lzZSB0aGVyZQo+ICsJCSAqIGNv dWxkIGJlIGNvcnJ1cHRpb24gaWYgYm90aCB0aHJlYWRzIHdvcmsgb24gdGhlIHNhbWUgYnVmZmVy Lgo+ICsJCSAqLwo+ICsJCXB0aHJlYWRfY29uZF93YWl0KCZvdmVyZmxvd19jb25kLCAmbXV0ZXgp Owo+ICsJfTsKPiArCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7Cj4gKwo+ICsJcHRyID0g cmVhZF9idWZmZXIgKyAocHJvZHVjZWQgJSBudW1fYnVmZmVycykgKiBTVUJCVUZfU0laRTsKPiAr Cj4gKwkvKiBSZWFkIHRoZSBsb2dzIGZyb20gcmVsYXkgYnVmZmVyICovCj4gKwlyZXQgPSByZWFk KHJlbGF5X2ZkLCBwdHIsIFNVQkJVRl9TSVpFKTsKPiArCWlmIChyZXQgPCAwKQo+ICsJCWlndF9h c3NlcnRfZigwLCAiRmFpbGVkIHRvIHJlYWQgZnJvbSB0aGUgZ3VjIGxvZyBmaWxlIik7Cj4gKwll bHNlIGlmIChyZXQgJiYgKHJldCA8IFNVQkJVRl9TSVpFKSkKPiArCQlpZ3RfYXNzZXJ0X2YoMCwg ImludmFsaWQgcmVhZCBmcm9tIHJlbGF5IGZpbGUiKTsKPiArCj4gKwlwdGhyZWFkX211dGV4X2xv Y2soJm11dGV4KTsKPiArCWlmIChyZXQpIHsKPiArCQlwcm9kdWNlZCsrOwo+ICsJCXB0aHJlYWRf Y29uZF9zaWduYWwoJnVuZGVyZmxvd19jb25kKTsKPiArCX0KPiArCXB0aHJlYWRfbXV0ZXhfdW5s b2NrKCZtdXRleCk7CgpWZXJ5IG1pbm9yOiBjYW4gbW92ZSB0aGUgbXV0ZXggdW5kZXIgdGhlIGlm LgoKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgKmZsdXNoZXIodm9pZCAqYXJnKQo+ICt7Cj4gKwlj aGFyICpwdHI7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCWlndF9kZWJ1ZygiRXhlY3V0aW9uIHN0YXJ0 ZWQgb2YgZmx1c2hlciB0aHJlYWRcbiIpOwo+ICsKPiArCWRvIHsKPiArCQlwdGhyZWFkX211dGV4 X2xvY2soJm11dGV4KTsKPiArCQl3aGlsZSAoIW51bV9maWxsZWRfYnVmcygpKSB7Cj4gKwkJCS8q IEV4aXQgb25seSBhZnRlciBjb21wbGV0aW5nIHRoZSBmbHVzaCBvZiBhbGwgdGhlIGZpbGxlZAo+ ICsJCQkgKiBidWZmZXJzIGFzIFVzZXIgd291bGQgZXhwZWN0IHRoYXQgYWxsIGxvZ3MgY2FwdHVy ZWQgdXAKPiArCQkJICogdGlsbCB0aGUgcG9pbnQgb2YgaW50ZXJydXB0aW9uL2V4aXQgYXJlIHdy aXR0ZW4gb3V0IHRvCj4gKwkJCSAqIHRoZSBkaXNrIGZpbGUuCj4gKwkJCSAqLwo+ICsJCQlpZiAo c3RvcF9sb2dnaW5nKSB7Cj4gKwkJCQlpZ3RfZGVidWcoImZsdXNoZXIgdG8gZXhpdCBub3dcbiIp Owo+ICsJCQkJcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKPiArCQkJCXJldHVybiBOVUxM Owo+ICsJCQl9Cj4gKwkJCXB0aHJlYWRfY29uZF93YWl0KCZ1bmRlcmZsb3dfY29uZCwgJm11dGV4 KTsKPiArCQl9Owo+ICsJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7Cj4gKwo+ICsJCXB0 ciA9IHJlYWRfYnVmZmVyICsgKGNvbnN1bWVkICUgbnVtX2J1ZmZlcnMpICogU1VCQlVGX1NJWkU7 Cj4gKwo+ICsJCXJldCA9IHdyaXRlKG91dGZpbGVfZmQsIHB0ciwgU1VCQlVGX1NJWkUpOwo+ICsJ CWlmIChyZXQgPCAwKQo+ICsJCQlpZ3RfYXNzZXJ0X2YoMCwgIkNvdWxkbid0IGR1bXAgdGhlIGxv Z3MgaW4gYSBmaWxlIik7CgpRdWVzdGlvbiBhYm91dCBzaG9ydCB3cml0ZXMgYXBwbGllcyBoZXJl IGFzIHdlbGwuCgo+ICsKPiArCQl0b3RhbF9ieXRlc193cml0dGVuICs9IHJldDsKPiArCQlpZiAo bWF4X2ZpbGVzaXplICYmICh0b3RhbF9ieXRlc193cml0dGVuID4gTUIobWF4X2ZpbGVzaXplKSkp IHsKPiArCQkJaWd0X2RlYnVnKCJSZWFjaGVkIHRoZSB0YXJnZXQgb2YgJSIgUFJJdTY0ICIgYnl0 ZXNcbiIsIE1CKG1heF9maWxlc2l6ZSkpOwo+ICsJCQlzdG9wX2xvZ2dpbmcgPSB0cnVlOwo+ICsJ CX0KPiArCj4gKwkJcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7Cj4gKwkJY29uc3VtZWQrKzsK PiArCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZvdmVyZmxvd19jb25kKTsKPiArCQlwdGhyZWFkX211 dGV4X3VubG9jaygmbXV0ZXgpOwo+ICsJfSB3aGlsZSgxKTsKCk1pbm9yIGFnYWluOiBZb3UgdXNl IGJvdGggIndoaWxlKDEpIHt9IiBhbmQgImRvIHsgfSB3aGlsZSgxKSIgaW4gaGVyZS4gCk1heWJl IHN0aWNrIHdpdGggb25lPyA6RCAoSSB0aGluayAiZm9yICg7OykiIGlzIHByZWZlcnJlZCwgYnV0 IG1heWJlIEkgCmFtIG1pc3JlbWVtYmVyaW5nIHRoaW5ncy4pCgo+ICsKPiArCXJldHVybiBOVUxM Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpbml0X2ZsdXNoZXJfdGhyZWFkKHZvaWQpCj4gK3sK PiArCXN0cnVjdCBzY2hlZF9wYXJhbQl0aHJlYWRfc2NoZWQ7Cj4gKwlwdGhyZWFkX2F0dHJfdAkJ cF9hdHRyOwo+ICsKPiArCXB0aHJlYWRfY29uZF9pbml0KCZ1bmRlcmZsb3dfY29uZCwgTlVMTCk7 Cj4gKwlwdGhyZWFkX2NvbmRfaW5pdCgmb3ZlcmZsb3dfY29uZCwgTlVMTCk7Cj4gKwlwdGhyZWFk X211dGV4X2luaXQoJm11dGV4LCBOVUxMKTsKPiArCj4gKwlpZiAocHRocmVhZF9hdHRyX2luaXQo JnBfYXR0cikpCj4gKwkJaWd0X2Fzc2VydF9mKDAsICJFcnJvciBvYnRhaW5pbmcgZGVmYXVsdCB0 aHJlYWQgYXR0cmlidXRlcyIpOwo+ICsKPiArCWlmIChwdGhyZWFkX2F0dHJfc2V0aW5oZXJpdHNj aGVkKCZwX2F0dHIsIFBUSFJFQURfRVhQTElDSVRfU0NIRUQpKQo+ICsJCWlndF9hc3NlcnRfZigw LCAiQ291bGRuJ3Qgc2V0IGluaGVyaXRzY2hlZCIpOwo+ICsKPiArCWlmIChwdGhyZWFkX2F0dHJf c2V0c2NoZWRwb2xpY3koJnBfYXR0ciwgU0NIRURfUlIpKQo+ICsJCWlndF9hc3NlcnRfZigwLCAi Q291bGRuJ3Qgc2V0IHRocmVhZCBzY2hlZHVsaW5nIHBvbGljeSIpOwo+ICsKPiArCS8qIEtlZXAg dGhlIGZsdXNoZXIgdGFzayBhbHNvIGF0IHJ0IHByaW9yaXR5LCBzbyB0aGF0IGl0IGRvZXNuJ3Qg Z2V0Cj4gKwkgKiB0b28gbGF0ZSBpbiBmbHVzaGluZyB0aGUgY29sbGVjdGVkIGxvZ3MgaW4gbG9j YWwgYnVmZmVycyB0byB0aGUgZGlzaywKPiArCSAqIGFuZCBzbyBtYWluIHRocmVhZCBhbHdheXMg aGF2ZSBzcGFyZSBidWZmZXJzIHRvIGNvbGxlY3QgdGhlIGxvZ3MuCj4gKwkgKi8KPiArCXRocmVh ZF9zY2hlZC5zY2hlZF9wcmlvcml0eSA9IDU7Cj4gKwlpZiAocHRocmVhZF9hdHRyX3NldHNjaGVk cGFyYW0oJnBfYXR0ciwgJnRocmVhZF9zY2hlZCkpCj4gKwkJaWd0X2Fzc2VydF9mKDAsICJDb3Vs ZG4ndCBzZXQgdGhyZWFkIHByaW9yaXR5Iik7Cj4gKwo+ICsJaWYgKHB0aHJlYWRfY3JlYXRlKCZm bHVzaF90aHJlYWQsICZwX2F0dHIsIGZsdXNoZXIsIE5VTEwpKQo+ICsJCWlndF9hc3NlcnRfZigw LCAidGhyZWFkIGNyZWF0aW9uIGZhaWxlZCIpOwoKTW9yZSBuaXRwaWNrczogWW91IG1peCBzdGFy dGluZyBlcnJvciBtZXNzYWdlcyB3aXRoIHVwcGVyIGNhc2UgYW5kIGxvd2VyIApjYXNlLgoKPiAr Cj4gKwlpZiAocHRocmVhZF9hdHRyX2Rlc3Ryb3koJnBfYXR0cikpCj4gKwkJaWd0X2Fzc2VydF9m KDAsICJFcnJvciBkZXN0cm95aW5nIHRocmVhZCBhdHRyaWJ1dGVzIik7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIG9wZW5fcmVsYXlfZmlsZSh2b2lkKQo+ICt7Cj4gKwlyZWxheV9mZCA9IGlndF9k ZWJ1Z2ZzX29wZW4oUkVMQVlfRklMRV9OQU1FLCBPX1JET05MWSk7Cj4gKwlpZiAocmVsYXlfZmQg PCAwKQo+ICsJCWlndF9hc3NlcnRfZigwLCAiQ291bGRuJ3Qgb3BlbiB0aGUgZ3VjIGxvZyBmaWxl Iik7Cj4gKwo+ICsJLyogUHVyZ2UgdGhlIG9sZC9ib290LXRpbWUgbG9ncyBmcm9tIHRoZSByZWxh eSBidWZmZXIuCj4gKwkgKiBUaGlzIGlzIG1vcmUgZm9yIFZhbCB0ZWFtJ3MgcmVxdWlyZW1lbnQs IHdoZXJlIHRoZXkgaGF2ZSB0byBmaXJzdAo+ICsJICogcHVyZ2UgdGhlIGV4aXN0aW5nIGxvZ3Mg YmVmb3JlIHN0YXJ0aW5nIHRoZSB0ZXN0cyBmb3Igd2hpY2ggdGhlIGxvZ3MKPiArCSAqIGFyZSBh Y3R1YWxseSBuZWVkZWQuIEFmdGVyIHRoaXMgbG9nZ2VyIHdpbGwgZW50ZXIgaW50byBhIGxvb3Ag YW5kCj4gKwkgKiB3YWl0IGZvciB0aGUgbmV3IGRhdGEsIGF0IHRoYXQgcG9pbnQgYmVuY2htYXJr IGNhbiBiZSBsYXVuY2hlZCBmcm9tCj4gKwkgKiBhIGRpZmZlcmVudCBzaGVsbC4KPiArCSAqLwo+ ICsJaWYgKGRpc2NhcmRfb2xkbG9ncykKPiArCQlwdWxsX2xlZnRvdmVyX2RhdGEoKTsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgb3Blbl9vdXRwdXRfZmlsZSh2b2lkKQo+ICt7Cj4gKwljaGFyICpm aWxlbmFtZTsKPiArCj4gKwlpZiAoYXNwcmludGYoJmZpbGVuYW1lLCAiL3RtcC8lcyIsIG91dF9m aWxlbmFtZSA/IDogImd1Y19sb2dfZHVtcC5kYXQiKSA8IDApCj4gKwkJaWd0X2Fzc2VydF9mKDAs ICJDb3VsZG4ndCBhbGxvY2F0ZSB0aGUgZmlsZW5hbWUiKTsKCkkgdGhpbmsgeW91IG5lZWQgdG8g dGFrZSB0aGUgb3V0X2ZpbGVuYW1lIHdoZW4gc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIAphcy1pcyBh bmQgbm90IHN0aWNrIGl0IGluIC90bXAuIEl0IGlzIHBlcmZlY3RseSByZWFzb25hYmxlIHRoYXQg c29tZW9uZSAKd291bGQgd2FudCB0byBwdXQgaXQgc29tZXdoZXJlIGVsc2UuCgpBbHNvIGJldHRl ciB0byBtb3ZlIHRoZSBkZWZhdWx0IG5hbWUgb2YgImd1Y19sb2dfZHVtcC5kYXQiIHRvIHdoZXJl IApkZWZhdWx0cyBsaWtlIFJFTEFZX0ZJTEVfTkFNRSBhbmQgc3VjaCBhcmUgZGVmaW5lZC4KCkFu ZCBJIHdvdWxkIG5vdCBkZWZhdWx0IHRvIC90bXAgYnV0IHRoZSBjdXJyZW50IGRpcmVjdG9yeS4K Cj4gKwo+ICsJLyogVXNlIERpcmVjdCBJTyBtb2RlIGZvciB0aGUgb3V0cHV0IGZpbGUsIGFzIHRo ZSBkYXRhIHdyaXR0ZW4gaXMgbm90Cj4gKwkgKiBzdXBwb3NlZCB0byBiZSBhY2Nlc3NlZCBhZ2Fp biwgdGhpcyBzYXZlcyBhIGNvcHkgb2YgZGF0YSBmcm9tIEFwcCdzCj4gKwkgKiBidWZmZXIgdG8g a2VybmVsIGJ1ZmZlciAoUGFnZSBjYWNoZSkuIER1ZSB0byBubyBidWZmZXJpbmcgb24ga2VybmVs Cj4gKwkgKiBzaWRlLCBkYXRhIGlzIGZsdXNoZWQgb3V0IHRvIGRpc2sgZmFzdGVyIGFuZCBtb3Jl IGJ1ZmZlcmluZyBjYW4gYmUKPiArCSAqIGRvbmUgb24gdGhlIGxvZ2dlciBzaWRlIHRvIGhpZGUg dGhlIGRpc2sgSU8gbGF0ZW5jeS4KPiArCSAqLwo+ICsJb3V0ZmlsZV9mZCA9IG9wZW4oZmlsZW5h bWUsIE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0RJUkVDVCwgMDQ0NCk7CgowNDAw IG9yIDA0NDAgd291bGQgYmUgYmV0dGVyIEkgdGhpbmsuCgo+ICsJaWYgKG91dGZpbGVfZmQgPCAw KQo+ICsJCWlndF9hc3NlcnRfZigwLCAiQ291bGRuJ3Qgb3BlbiB0aGUgb3V0cHV0IGZpbGUiKTsK PiArCj4gKwlmcmVlKG91dF9maWxlbmFtZSk7Cj4gKwlmcmVlKGZpbGVuYW1lKTsKPiArfQo+ICsK PiArc3RhdGljIHZvaWQgaW5pdF9tYWluX3RocmVhZCh2b2lkKQo+ICt7Cj4gKwlzdHJ1Y3Qgc2No ZWRfcGFyYW0JdGhyZWFkX3NjaGVkOwo+ICsJLyogUnVuIHRoZSBtYWluIHRocmVhZCBhdCBoaWdo ZXN0IHByaW9yaXR5IHRvIGVuc3VyZSB0aGF0IGl0IGFsd2F5cwo+ICsJICogZ2V0cyB3b2tlbi11 cCBhdCBlYXJsaWVzdCBvbiBhcnJpdmFsIG9mIG5ldyBkYXRhIGFuZCBzbyBpcyBhbHdheXMKPiAr CSAqIHJlYWR5IHRvIHB1bGwgdGhlIGxvZ3MsIG90aGVyd2lzZSB0aGVyZSBjb3VsZCBiZSBsb3Nz IGxvZ3MgaWYKPiArCSAqIEd1QyBmaXJtd2FyZSBpcyBnZW5lcmF0aW5nIGxvZ3MgYXQgYSB2ZXJ5 IGhpZ2ggcmF0ZS4KPiArCSAqLwo+ICsJdGhyZWFkX3NjaGVkLnNjaGVkX3ByaW9yaXR5ID0gMTsK PiArCWlmIChzY2hlZF9zZXRzY2hlZHVsZXIoZ2V0cGlkKCksIFNDSEVEX0ZJRk8sICZ0aHJlYWRf c2NoZWQpKQo+ICsJCWlndF9hc3NlcnRfZigwLCAiQ291bGRuJ3Qgc2V0IHRoZSBwcmlvcml0eSIp Owo+ICsKPiArCWlmIChzaWduYWwoU0lHSU5ULCBpbnRfc2lnX2hhbmRsZXIpID09IFNJR19FUlIp Cj4gKwkJaWd0X2Fzc2VydF9mKDAsICJTSUdJTlQgaGFuZGxlciByZWdpc3RyYXRpb24gZmFpbGVk Iik7Cj4gKwo+ICsJLyogTmVlZCBhbiBhbGlnbmVkIHBvaW50ZXIgZm9yIGRpcmVjdCBJTyAqLwo+ ICsJaWYgKHBvc2l4X21lbWFsaWduKCh2b2lkICoqKSZyZWFkX2J1ZmZlciwgUEFHRV9TSVpFLCBu dW1fYnVmZmVycyAqIFNVQkJVRl9TSVpFKSkKPiArCQlpZ3RfYXNzZXJ0X2YoMCwgIkNvdWxkbid0 IGFsbG9jYXRlIHRoZSByZWFkIGJ1ZmZlciIpOwo+ICsKPiArCS8qIEtlZXAgdGhlIHBhZ2VzIGxv Y2tlZCBpbiBSQU0sIGF2b2lkIHBhZ2UgZmF1bHQgb3ZlcmhlYWQgKi8KPiArCWlmIChtbG9jayhy ZWFkX2J1ZmZlciwgbnVtX2J1ZmZlcnMgKiBTVUJCVUZfU0laRSkpCj4gKwkJaWd0X2Fzc2VydF9m KDAsICJGYWlsZWQgdG8gbG9jayBtZW1vcnkiKTsKPiArCj4gKwkvKiBFbmFibGUgdGhlIGxvZ2dp bmcsIGl0IG1heSBub3QgaGF2ZSBiZWVuIGVuYWJsZWQgZnJvbSBib290IGFuZCBzbwo+ICsJICog dGhlIHJlbGF5IGZpbGUgYWxzbyB3b3VsZG4ndCBoYXZlIGJlZW4gY3JlYXRlZC4KPiArCSAqLwo+ ICsJZ3VjX2xvZ19jb250cm9sKHRydWUpOwo+ICsKPiArCW9wZW5fcmVsYXlfZmlsZSgpOwo+ICsJ b3Blbl9vdXRwdXRfZmlsZSgpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMo aW50IG9wdCwgaW50IG9wdF9pbmRleCwgdm9pZCAqZGF0YSkKPiArewo+ICsJaWd0X2RlYnVnKCJv cHQgJWMgb3B0YXJnICVzXG4iLCBvcHQsIG9wdGFyZyk7Cj4gKwo+ICsJc3dpdGNoKG9wdCkgewo+ ICsJY2FzZSAndic6Cj4gKwkJdmVyYm9zaXR5X2xldmVsID0gYXRvaShvcHRhcmcpOwo+ICsJCWlm ICh2ZXJib3NpdHlfbGV2ZWwgPCAwKQo+ICsJCQl2ZXJib3NpdHlfbGV2ZWwgPSAwOwo+ICsJCWVs c2UgaWYgKHZlcmJvc2l0eV9sZXZlbCA+IDMpCj4gKwkJCXZlcmJvc2l0eV9sZXZlbCA9IDM7CgpO b3RpZnkgdXNlciBpZiBpbnZhbGlkIHZhbHVlIHdhcyBwcm92aWRlZD8KCj4gKwo+ICsJCWlndF9k ZWJ1ZygidmVyYm9zaXR5IGxldmVsIHRvIGJlIHVzZWQgaXMgJWRcbiIsIHZlcmJvc2l0eV9sZXZl bCk7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlICdvJzoKPiArCQlpZiAoYXNwcmludGYoJm91dF9maWxl bmFtZSwgIiVzIiwgb3B0YXJnKSA8IDApCgpzdHJkdXA/Cgo+ICsJCQlpZ3RfYXNzZXJ0X2YoMCwg IkNvdWxkbid0IGFsbG9jYXRlIHRoZSBvL3AgZmlsZW5hbWUiKTsKPiArCQlpZ3RfZGVidWcoImxv Z3MgdG8gYmUgc3RvcmVkIGluIGZpbGUgL3RtcC8lc1xuIiwgb3V0X2ZpbGVuYW1lKTsKPiArCQli cmVhazsKPiArCWNhc2UgJ2InOgo+ICsJCW51bV9idWZmZXJzID0gYXRvaShvcHRhcmcpOwo+ICsJ CWlmIChudW1fYnVmZmVycyA9PSAwKQo+ICsJCQludW1fYnVmZmVycyA9IE5VTV9TVUJCVUZTOwoK QWdhaW4gbm90aWZ5IGlmIGludmFsaWQgbnVtYmVyL3ZhbHVlLgoKPiArCQlpZ3RfZGVidWcoIm51 bWJlciBvZiBidWZmZXJzIHRvIGJlIHVzZWQgaXMgJWRcbiIsIG51bV9idWZmZXJzKTsKPiArCQli cmVhazsKPiArCWNhc2UgJ3QnOgo+ICsJCXRlc3RfZHVyYXRpb24gPSBhdG9pKG9wdGFyZyk7Cj4g KwkJaWYgKHRlc3RfZHVyYXRpb24gPiAwKQoKSWYgc3dpdGNoIHdhcyBzcGVjaWZpZWQgaXQgc2hv dWxkIGhhdmUgYSB2YWxpZCBvcHRhcmcgb3IgZXJyb3IgcmVwb3J0ZWQuCgo+ICsJCQlpZ3RfZGVi dWcoImxvZ2dlciB0byBydW4gZm9yICVkIHNlY29uZHNcbiIsIHRlc3RfZHVyYXRpb24pOwo+ICsJ CWJyZWFrOwo+ICsJY2FzZSAncCc6Cj4gKwkJcG9sbF90aW1lb3V0ID0gYXRvaShvcHRhcmcpOwo+ ICsJCWlmIChwb2xsX3RpbWVvdXQgPT0gMCkKPiArCQkJcG9sbF90aW1lb3V0ID0gMjsgLyogYXQg bGVhc3QgdXNlIDJtcyBwb2xsIHRpbWVvdXQgKi8KCkhtIEkgd291bGQgcHJlZmVyIGlmIHlvdSBh bGxvd2VkIG5vIHBvbGwgcGVyaW9kLiBJIGV2ZW4gdGhpbmsgaXQgc2hvdWxkIApiZSB0aGUgZGVm YXVsdCBpZiB3ZSB0aGluayByZWxheWZzIHdpbGwgYmUgZGVmaW5pdGVseSBmaXhlZCB0byBub3Qg CnJlcXVpcmUgaXQuCgpJbiBhbnkgY2FzZSwgY29tbWVuZCBpcyB3cm9uZyBzaW5jZSB1c2VyIGNh biBzcGVjaWZ5IDFtcyBhbmQgZ2V0IGF3YXkgCndpdGggaXQuIDopCgo+ICsJCWlmIChwb2xsX3Rp bWVvdXQgPiAwKQo+ICsJCQlpZ3RfZGVidWcoInBvbGxpbmcgdG8gYmUgZG9uZSB3aXRoICVkIG1p bGxpIHNlY29uZHMgdGltZW91dFxuIiwgcG9sbF90aW1lb3V0KTsKCm1pbGxpc2Vjb25kcwoKPiAr CQlicmVhazsKPiArCWNhc2UgJ3MnOgo+ICsJCW1heF9maWxlc2l6ZSA9IGF0b2kob3B0YXJnKTsK PiArCQlpZiAobWF4X2ZpbGVzaXplID4gMCkKClNhbWUgYXMgZm9yIC10LgoKPiArCQkJaWd0X2Rl YnVnKCJtYXggYWxsb3dlZCBzaXplIG9mIHRoZSBvdXRwdXQgZmlsZSBpcyAlZCBNQnNcbiIsIG1h eF9maWxlc2l6ZSk7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlICdkJzoKPiArCQlkaXNjYXJkX29sZGxv Z3MgPSB0cnVlOwo+ICsJCWlndF9kZWJ1Zygib2xkL2Jvb3QtdGltZSBsb2dzIHdpbGwgYmUgZGlz Y2FyZGVkXG4iKTsKPiArCQlicmVhazsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsK PiArc3RhdGljIHZvaWQgcHJvY2Vzc19jb21tYW5kX2xpbmUoaW50IGFyZ2MsIGNoYXIgKiphcmd2 KQo+ICt7Cj4gKwlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKPiArCQl7 InZlcmJvc2l0eSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAndid9LAo+ICsJCXsib3V0cHV0Zmls ZW5hbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ28nfSwKPiArCQl7ImJ1ZmZlcnMiLCByZXF1 aXJlZF9hcmd1bWVudCwgMCwgJ2InfSwKPiArCQl7InRlc3RkdXJhdGlvbiIsIHJlcXVpcmVkX2Fy Z3VtZW50LCAwLCAndCd9LAo+ICsJCXsicG9sbHRpbWVvdXQiLCByZXF1aXJlZF9hcmd1bWVudCwg MCwgJ3AnfSwKPiArCQl7InNpemUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3MnfSwKPiArCQl7 ImRpc2NhcmQiLCBub19hcmd1bWVudCwgMCwgJ2QnfSwKPiArCQl7IDAsIDAsIDAsIDAgfQo+ICsJ fTsKPiArCj4gKwljb25zdCBjaGFyICpoZWxwID0KPiArCQkiICAtdiAtLXZlcmJvc2l0eT1sZXZl bCAgIHZlcmJvc2l0eSBsZXZlbCBvZiBHdUMgbG9nZ2luZyAoMC0zKVxuIgo+ICsJCSIgIC1vIC0t b3V0ZmlsZT1uYW1lICAgICAgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUgaW4gL3RtcCBkaXJlY3Rv cnksIHdoZXJlIGxvZ3Mgd2lsbCBiZSBzdG9yZWRcbiIKPiArCQkiICAtYiAtLWJ1ZmZlcnM9bnVt ICAgICAgIG51bWJlciBvZiBidWZmZXJzIHRvIGJlIG1haW50YWluZWQgb24gbG9nZ2VyIHNpZGUg Zm9yIHN0b3JpbmcgbG9nc1xuIgo+ICsJCSIgIC10IC0tdGVzdGR1cmF0aW9uPXNlYyAgbWF4IGR1 cmF0aW9uIGluIHNlY29uZHMgZm9yIHdoaWNoIHRoZSBsb2dnZXIgc2hvdWxkIHJ1biwgMCA9PSBm b3JldmVyXG4iCj4gKwkJIiAgLXAgLS1wb2xsdGltZW91dD1tcyAgICBwb2xsaW5nIHRpbWVvdXQg aW4gbXMsIC0xID09IGluZGVmaW5pdGUgd2FpdCBmb3IgdGhlIG5ldyBkYXRhXG4iCj4gKwkJIiAg LXMgLS1zaXplPU1CICAgICAgICAgICBtYXggc2l6ZSBvZiBvdXRwdXQgZmlsZSBpbiBNQnMgYWZ0 ZXIgd2hpY2ggbG9nZ2luZyB3aWxsIGJlIHN0b3BwZWQsIDAgPT0gbm8gbGltaXRcbiIKPiArCQki ICAtZCAtLWRpc2NhcmQgICAgICAgICAgIGRpc2NhcmQgdGhlIG9sZC9ib290LXRpbWUgbG9ncyBi ZWZvcmUgZW50ZXJpbmcgaW50byB0aGUgY2FwdHVyZSBsb29wXG4iOwo+ICsKPiArCWlndF9zaW1w bGVfaW5pdF9wYXJzZV9vcHRzKCZhcmdjLCBhcmd2LCAidjpvOmI6dDpwOnM6ZCIsIGxvbmdfb3B0 aW9ucywKPiArCQkJCSAgIGhlbHAsIHBhcnNlX29wdGlvbnMsIE5VTEwpOwo+ICt9Cj4gKwo+ICtp bnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCj4gK3sKPiArCXN0cnVjdCBwb2xsZmQgcmVs YXlfcG9sbF9mZDsKPiArCXN0cnVjdCB0aW1lc3BlYyBzdGFydD17fTsKPiArCWludCBuZmRzOwo+ ICsJaW50IHJldDsKPiArCj4gKwlwcm9jZXNzX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2KTsKPiAr Cj4gKwlpbml0X21haW5fdGhyZWFkKCk7Cj4gKwo+ICsJLyogVXNlIGEgc2VwYXJhdGUgdGhyZWFk IGZvciBmbHVzaGluZyB0aGUgbG9ncyB0byBhIGZpbGUgb24gZGlzay4KPiArCSAqIE1haW4gdGhy ZWFkIHdpbGwgYnVmZmVyIHRoZSBkYXRhIGZyb20gcmVsYXkgZmlsZSBpbiBpdHMgcG9vbCBvZgo+ ICsJICogYnVmZmVycyBhbmQgb3RoZXIgdGhyZWFkIHdpbGwgZmx1c2ggdGhlIGRhdGEgdG8gZGlz ayBpbiBiYWNrZ3JvdW5kLgo+ICsJICogVGhpcyBpcyBuZWVkZWQsIGFsYmVpdCBieSBkZWZhdWx0 IGRhdGEgaXMgd3JpdHRlbiBvdXQgdG8gZGlzayBpbgo+ICsJICogYXN5bmMgbW9kZSwgYXMgd2hl biB0aGVyZSBhcmUgdG9vIG1hbnkgZGlydHkgcGFnZXMgaW4gdGhlIFJBTSwKPiArCSAqICgvcHJv Yy9zeXMvdm0vZGlydHlfcmF0aW8pLCBrZXJuZWwgc3RhcnRzIGJsb2NraW5nIHRoZSBwcm9jZXNz ZXMKPiArCSAqIGRvaW5nIHRoZSBmaWxlIHdyaXRlcy4KPiArCSAqLwo+ICsJaW5pdF9mbHVzaGVy X3RocmVhZCgpOwo+ICsKPiArCXJlbGF5X3BvbGxfZmQuZmQgPSByZWxheV9mZDsKPiArCXJlbGF5 X3BvbGxfZmQuZXZlbnRzID0gUE9MTElOOwo+ICsJcmVsYXlfcG9sbF9mZC5yZXZlbnRzID0gMDsK PiArCj4gKwluZmRzID0gMTsgLyogb25seSBvbmUgZmQgdG8gcG9sbCAqLwo+ICsKPiArCXdoaWxl ICghc3RvcF9sb2dnaW5nKQo+ICsJewo+ICsJCWlmICh0ZXN0X2R1cmF0aW9uICYmIChpZ3Rfc2Vj b25kc19lbGFwc2VkKCZzdGFydCkgPiB0ZXN0X2R1cmF0aW9uKSkgewoKSWYgeW91IGFncmVlIHRv IGFsbG93IG5vIHBvbGwgcGVyaW9kIHRoZSB0aGlzIHdvdWxkIG5vdCB3b3JrIHJpZ2h0PyBJbiAK dGhhdCBjYXNlIHlvdSB3b3VsZCBuZWVkIHRvIHVzZSBhbGFybSgyKSBvciBzb21ldGhpbmcuCgo+ ICsJCQlpZ3RfZGVidWcoIlJhbiBmb3Igc3RpcHVsYXRlZCAlZCBzZWNvbmRzLCBleGl0IG5vd1xu IiwgdGVzdF9kdXJhdGlvbik7Cj4gKwkJCXN0b3BfbG9nZ2luZyA9IHRydWU7Cj4gKwkJCWJyZWFr Owo+ICsJCX0KPiArCj4gKwkJLyogV2FpdC9wb2xsIGZvciB0aGUgbmV3IGRhdGEgdG8gYmUgYXZh aWxhYmxlLCByZWxheSBkb2Vzbid0Cj4gKwkJICogcHJvdmlkZSBhIGJsb2NraW5nIHJlYWQuCj4g KwkJICogTmVlZCB0byBkbyBwb2xsaW5nIHdpdGggYSB0aW1lb3V0IGluc3RlYWQgb2YgaW5kZWZp bml0ZSB3YWl0LAo+ICsJCSAqIHRvIGF2b2lkIHJlbHlpbmcgb24gcmVsYXkgZm9yIHRoZSB3YWtl dXAsIGFzIHJlbGF5IGRvZXMgd2FrZXVwCj4gKwkJICogaW4gYSBkZWZlcnJlZCBtYW5uZXIgb24g amlmZmllcyBncmFudWxhcml0eSBieSBzY2hlZHVsaW5nIGEKPiArCQkgKiB0aW1lciBhbmQgbW9y ZW92ZXIgdGhhdCB0aW1lciBpcyByZS1zY2hlZHVsZWQgb24gZXZlcnkgbmV3bHkKPiArCQkgKiBw cm9kdWNlZCBidWZmZXIgc28gdGltZXIga2VlcHMgZ2V0dGluZyBwdXNoZWQgb3V0IGlmIHRoZXJl Cj4gKwkJICogYXJlIG11bHRpcGxlIGZsdXNoIGludGVycnVwdHMgaW4gYSB2ZXJ5IHF1aWNrIHN1 Y2Nlc3Npb24gKGxlc3MKPiArCQkgKiB0aGFuIGEgamlmZnkgZ2FwIGJldHdlZW4gMiBmbHVzaCBp bnRlcnJ1cHRzKSBhbmQgcmVsYXkgcnVucwo+ICsJCSAqIG91dCBvZiBzdWIgYnVmZmVycyB0byBz dG9yZSB0aGUgbmV3IGxvZ3MuCj4gKwkJICovCj4gKwkJcmV0ID0gcG9sbCgmcmVsYXlfcG9sbF9m ZCwgbmZkcywgcG9sbF90aW1lb3V0KTsKPiArCQlpZiAocmV0IDwgMCkgewo+ICsJCQlpZiAoZXJy bm8gPT0gRUlOVFIpCj4gKwkJCQlicmVhazsKPiArCQkJZWxzZQo+ICsJCQkJaWd0X2Fzc2VydF9m KDAsICJwb2xsIGNhbGwgZmFpbGVkIik7Cj4gKwkJfQo+ICsKPiArCQkvKiBObyBkYXRhIGF2YWls YWJsZSB5ZXQsIHBvbGwgYWdhaW4sIGhvcGVmdWxseSBuZXcgZGF0YSBpcyByb3VuZCB0aGUgY29y bmVyICovCj4gKwkJaWYgKCFyZWxheV9wb2xsX2ZkLnJldmVudHMpCj4gKwkJCWNvbnRpbnVlOwo+ ICsKPiArCQlwdWxsX2RhdGEoKTsKPiArCX0KPiArCj4gKwkvKiBQYXVzZSBsb2dnaW5nIG9uIHRo ZSBHdUMgc2lkZSovCj4gKwlndWNfbG9nX2NvbnRyb2woZmFsc2UpOwo+ICsJcHRocmVhZF9jb25k X3NpZ25hbCgmdW5kZXJmbG93X2NvbmQpOwo+ICsJcHRocmVhZF9qb2luKGZsdXNoX3RocmVhZCwg TlVMTCk7Cj4gKwlwdWxsX2xlZnRvdmVyX2RhdGEoKTsKPiArCWlndF9pbmZvKCJ0b3RhbF9ieXRl c193cml0dGVuICUiIFBSSXU2NCAiXG4iLCB0b3RhbF9ieXRlc193cml0dGVuKTsKPiArCj4gKwlm cmVlKHJlYWRfYnVmZmVyKTsKPiArCWNsb3NlKHJlbGF5X2ZkKTsKPiArCWNsb3NlKG91dGZpbGVf ZmQpOwo+ICsJaWd0X2V4aXQoKTsKPiArfQo+CgpTbyBvbmx5IG1pbm9yIGNvbW1lbnRzLiBUaGUg cmVzdCBsb29rcyByZWFzb25hYmxlIHRvIG1lIGFuZCBJIHRydXN0IHlvdSAKdGVzdGVkIGl0IHdl bGwgYW5kIGl0IHdvcmtzIGZpbmUuCgpSZWdhcmRzLAoKVHZydGtvCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50 ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=