From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail29.static.mailgun.info (mail29.static.mailgun.info [104.130.122.29]) by gabe.freedesktop.org (Postfix) with ESMTPS id B58B16E10C for ; Tue, 15 Sep 2020 16:33:49 +0000 (UTC) MIME-Version: 1.0 Date: Tue, 15 Sep 2020 09:33:27 -0700 From: abhinavk@codeaurora.org In-Reply-To: <20200915074634.GW7444@platvala-desk.ger.corp.intel.com> References: <20200904005439.17146-1-abhinavk@codeaurora.org> <20200904005439.17146-6-abhinavk@codeaurora.org> <20200915074634.GW7444@platvala-desk.ger.corp.intel.com> Message-ID: Subject: Re: [igt-dev] [PATCH i-g-t 5/5] tools: add support for msm_dp_compliance to IGT List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: Petri Latvala Cc: khsieh@codeaurora.org, tanmay@codeaurora.org, swboyd@chromium.org, igt-dev@lists.freedesktop.org, nganji@codeaurora.org, seanpaul@chromium.org, aravindh@codeaurora.org List-ID: SGksCgpPbiAyMDIwLTA5LTE1IDAwOjQ2LCBQZXRyaSBMYXR2YWxhIHdyb3RlOgo+IE9uIFRodSwg U2VwIDAzLCAyMDIwIGF0IDA1OjU0OjM5UE0gLTA3MDAsIEFiaGluYXYgS3VtYXIgd3JvdGU6Cj4+ IEFkZCBzdXBwb3J0IGZvciBtc21fZHBfY29tcGxpYW5jZSB0byBpZ3QgdG9vbHMgdG8gdmFsaWRh dGUKPj4gdmlkZW8gcGF0dGVybiBEUCBjb21wbGlhbmNlIHRlc3RzIG9uIE1TTSBjaGlwc2V0cy4K Pj4gCj4+IFNpZ25lZC1vZmYtYnk6IEFiaGluYXYgS3VtYXIgPGFiaGluYXZrQGNvZGVhdXJvcmEu b3JnPgo+PiAtLS0KPj4gIHRvb2xzL01ha2VmaWxlLmFtICAgICAgICAgfCAgIDQgKwo+PiAgdG9v bHMvTWFrZWZpbGUuc291cmNlcyAgICB8ICAgNiArCj4+ICB0b29scy9tZXNvbi5idWlsZCAgICAg ICAgIHwgIDEyICsKPj4gIHRvb2xzL21zbV9kcF9jb21wbGlhbmNlLmMgfCA4MTIgCj4+ICsrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+ICA0IGZpbGVzIGNoYW5nZWQsIDgz NCBpbnNlcnRpb25zKCspCj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMvbXNtX2RwX2NvbXBs aWFuY2UuYwo+PiAKPj4gZGlmZiAtLWdpdCBhL3Rvb2xzL01ha2VmaWxlLmFtIGIvdG9vbHMvTWFr ZWZpbGUuYW0KPj4gaW5kZXggZjk3ZjllMDguLmVhYzUyYmU4IDEwMDY0NAo+PiAtLS0gYS90b29s cy9NYWtlZmlsZS5hbQo+PiArKysgYi90b29scy9NYWtlZmlsZS5hbQo+PiBAQCAtMTQsNiArMTQs MTAgQEAgaW50ZWxfZHBfY29tcGxpYW5jZV9MREFERCA9IAo+PiAkKHRvcF9idWlsZGRpcikvbGli L2xpYmludGVsX3Rvb2xzLmxhCj4+ICBiaW5fUFJPR1JBTVMgKz0gYW1kX2hkbWlfY29tcGxpYW5j ZQo+PiAgYW1kX2hkbWlfY29tcGxpYW5jZV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChHTElCX0NG TEFHUykKPj4gCj4+ICtiaW5fUFJPR1JBTVMgKz0gbXNtX2RwX2NvbXBsaWFuY2UKPj4gK21zbV9k cF9jb21wbGlhbmNlX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKEdMSUJfQ0ZMQUdTKQo+PiArbXNt X2RwX2NvbXBsaWFuY2VfTERBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2xpYmludGVsX3Rvb2xz LmxhCj4+ICsKPj4gIFNVQkRJUlMgPSBpOTE1LXBlcmYgbnVsbF9zdGF0ZV9nZW4gcmVnaXN0ZXJz Cj4+IAo+PiAgQU1fQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikgLUkkKHRvcF9zcmNkaXIpL2lu Y2x1ZGUvZHJtLXVhcGkgCj4+IC1JJCh0b3Bfc3JjZGlyKS9saWIgXAo+PiBkaWZmIC0tZ2l0IGEv dG9vbHMvTWFrZWZpbGUuc291cmNlcyBiL3Rvb2xzL01ha2VmaWxlLnNvdXJjZXMKPj4gaW5kZXgg NDcxNzE0OTAuLmM5M2JmZTdkIDEwMDY0NAo+PiAtLS0gYS90b29scy9NYWtlZmlsZS5zb3VyY2Vz Cj4+ICsrKyBiL3Rvb2xzL01ha2VmaWxlLnNvdXJjZXMKPj4gQEAgLTcyLDMgKzcyLDkgQEAgYW1k X2hkbWlfY29tcGxpYW5jZV9TT1VSQ0VTID0gXAo+PiAgICAgICAgICBhbWRfaGRtaV9jb21wbGlh bmNlLmMgXAo+PiAgCQkkKE5VTEwpCj4+IAo+PiArbXNtX2RwX2NvbXBsaWFuY2VfU09VUkNFUyA9 IFwKPj4gKyAgICAgICAgbXNtX2RwX2NvbXBsaWFuY2UuYyBcCj4+ICsJCWlndF9kcF9jb21wbGlh bmNlLmggXAo+PiArCQlpZ3RfZHBfY29tcGxpYW5jZV9ob3RwbHVnLmMgXAo+PiArCQlpZ3RfY29t cGxpYW5jZV91dGlscy5jIFwKPj4gKwkJJChOVUxMKQo+PiBkaWZmIC0tZ2l0IGEvdG9vbHMvbWVz b24uYnVpbGQgYi90b29scy9tZXNvbi5idWlsZAo+PiBpbmRleCA1Njg3N2ZiMy4uNjVmNzg5Mzgg MTAwNjQ0Cj4+IC0tLSBhL3Rvb2xzL21lc29uLmJ1aWxkCj4+ICsrKyBiL3Rvb2xzL21lc29uLmJ1 aWxkCj4+IEBAIC0xMDEsNSArMTAxLDE3IEBAIGV4ZWN1dGFibGUoJ2FtZF9oZG1pX2NvbXBsaWFu Y2UnLCAKPj4gJ2FtZF9oZG1pX2NvbXBsaWFuY2UuYycsCj4+ICAJICAgaW5zdGFsbF9ycGF0aCA6 IGJpbmRpcl9ycGF0aGRpciwKPj4gIAkgICBpbnN0YWxsIDogdHJ1ZSkKPj4gCj4+ICtpZiBsaWJ1 ZGV2LmZvdW5kKCkKPj4gKwkJbXNtX2RwX2NvbXBsaWFuY2Vfc3JjID0gWwo+PiArCQknbXNtX2Rw X2NvbXBsaWFuY2UuYycsCj4+ICsJCSdpZ3RfZHBfY29tcGxpYW5jZV9ob3RwbHVnLmMnLAo+PiAr CQknaWd0X2NvbXBsaWFuY2VfdXRpbHMuYycKPj4gKwldCj4gCj4gQ2hlY2sgaW5kZW50YXRpb24g aGVyZSBmb3IgdGhlIG1zbV9kcF9jb21wbGlhbmNlX3NyYyA9IFsgbGluZS4KPiAKPiBPdGhlcndp c2UgbG9va3MgZ29vZCwKPiBBY2tlZC1ieTogUGV0cmkgTGF0dmFsYSA8cGV0cmkubGF0dmFsYUBp bnRlbC5jb20+Cj4gCj4gRm9yIGZ1dHVyZSBjaGFuZ2VzIHRoYXQgYWZmZWN0IHRoaXMgdG9vbCwg ZG8geW91IHdhbnQgdG8gYmUgdGhlIG1haW4KPiBjb250YWN0IHBlcnNvbiB0byBhc2sgZm9yIGFj a3MvdGVzdHMvb3BpbmlvbnM/Cj4gCj4gCj4gLS0KPiBQZXRyaSBMYXR2YWxhCgpUaGFua3Mgc28g bXVjaCBmb3IgdGhlIHJldmlldy4gV2lsbCBjaGVjayB0aGUgaW5kZW50LgpZZXMsIEkgd2lsbCBi ZSB0aGUgbWFpbiBjb250YWN0IHBlcnNvbiB0byBhc2sgZm9yIGFja3MvdGVzdHMvb3BpbmlvbnMg b24gCnRoaXMgdG9vbC4KCj4gCj4gCj4gCj4+ICsJZXhlY3V0YWJsZSgnbXNtX2RwX2NvbXBsaWFu Y2UnLCBzb3VyY2VzIDogbXNtX2RwX2NvbXBsaWFuY2Vfc3JjLAo+PiArCQkJZGVwZW5kZW5jaWVz IDogW3Rvb2xfZGVwcywgbGlidWRldl0sCj4+ICsJCQlpbnN0YWxsX3JwYXRoIDogYmluZGlyX3Jw YXRoZGlyLAo+PiArCQkJaW5zdGFsbCA6IHRydWUpCj4+ICtlbmRpZgo+PiArCj4+ICBzdWJkaXIo J2k5MTUtcGVyZicpCj4+ICBzdWJkaXIoJ251bGxfc3RhdGVfZ2VuJykKPj4gZGlmZiAtLWdpdCBh L3Rvb2xzL21zbV9kcF9jb21wbGlhbmNlLmMgYi90b29scy9tc21fZHBfY29tcGxpYW5jZS5jCj4+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+IGluZGV4IDAwMDAwMDAwLi43YmMyYmZhOAo+PiAtLS0g L2Rldi9udWxsCj4+ICsrKyBiL3Rvb2xzL21zbV9kcF9jb21wbGlhbmNlLmMKPj4gQEAgLTAsMCAr MSw4MTIgQEAKPj4gKy8qCj4+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBMaW51eCBGb3Vu ZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+PiArICogQ29weXJpZ2h0IMKpIDIwMTcgSW50 ZWwgQ29ycG9yYXRpb24KPj4gKyAqCj4+ICsgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVk LCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAKPj4gb2J0YWluaW5nIGEKPj4gKyAqIGNv cHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0 aGUgCj4+ICJTb2Z0d2FyZSIpLAo+PiArICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91 dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgCj4+IGxpbWl0YXRpb24KPj4gKyAqIHRo ZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRl LCAKPj4gc3VibGljZW5zZSwKPj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdh cmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIAo+PiB0aGUKPj4gKyAqIFNvZnR3YXJl IGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIAo+PiBjb25k aXRpb25zOgo+PiArICoKPj4gKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlz IHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgCj4+IHRoZSBuZXh0Cj4+ICsgKiBwYXJhZ3Jh cGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlv bnMgCj4+IG9mIHRoZQo+PiArICogU29mdHdhcmUuCj4+ICsgKgo+PiArICogVEhFIFNPRlRXQVJF IElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAo+PiBF WFBSRVNTIE9SCj4+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRI RSBXQVJSQU5USUVTIE9GIAo+PiBNRVJDSEFOVEFCSUxJVFksCj4+ICsgKiBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgCj4+ IFNIQUxMCj4+ICsgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUg Rk9SIEFOWSBDTEFJTSwgREFNQUdFUyAKPj4gT1IgT1RIRVIKPj4gKyAqIExJQUJJTElUWSwgV0hF VEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKPj4gQVJJ U0lORwo+PiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdB UkUgT1IgVEhFIFVTRSBPUiAKPj4gT1RIRVIgREVBTElOR1MKPj4gKyAqIElOIFRIRSBTT0ZUV0FS RS4KPj4gKyAqCj4+ICsgKiBEaXNwbGF5cG9ydCBDb21wbGlhbmNlIFRlc3RpbmcgQXBwbGljYXRp b24KPj4gKyAqCj4+ICsgKiBUaGlzIGlzIHRoZSB1c2Vyc3BhY2UgY29tcG9uZW50IG9mIHRoZSBE aXNwbGF5cG9ydCBDb21wbGlhbmNlIAo+PiB0ZXN0aW5nCj4+ICsgKiBzb2Z0d2FyZSByZXF1aXJl ZCBmb3IgY29tcGxpYW5jZSB0ZXN0aW5nIG9mIHRoZSBNU00gRGlzcGxheSBQb3J0IAo+PiBkcml2 ZXIuCj4+ICsgKiBUaGlzIG11c3QgYmUgcnVubmluZyBpbiBvcmRlciB0byBzdWNjZXNzZnVsbHkg Y29tcGxldGUgRGlzcGxheSAKPj4gUG9ydAo+PiArICogY29tcGxpYW5jZSB0ZXN0aW5nLiBUaGlz IGFwcCBhbmQgdGhlIGtlcm5lbCBjb2RlIHRoYXQgYWNjb21wYW5pZXMgCj4+IGl0IGhhcyBiZWVu Cj4+ICsgKiB3cml0dGVuIHRvIHNhdGlmeSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBEaXNwbGF5 cG9ydCBMaW5rIENUUyAxLjIgCj4+IHJldjEuMQo+PiArICogc3BlY2lmaWNhdGlvbiBmcm9tIFZF U0EuIE5vdGUgdGhhdCB0aGlzIGFwcGxpY2F0aW9uIGRvZXMgbm90IAo+PiBzdXBwb3J0IGVEUAo+ PiArICogY29tcGxpYW5jZSB0ZXN0aW5nLgo+PiArICoKPj4gKyAqIENvbXBsaWFuY2UgVGVzdGlu ZyByZXF1aXJlcyBzZXZlcmFsIGNvbXBvbmVudHM6Cj4+ICsgKiAgIC0gQSBrZXJuZWwgYnVpbGQg dGhhdCBjb250YWlucyB0aGUgcGF0Y2ggc2V0IGZvciBEUCBjb21wbGlhbmNlIAo+PiBzdXBwb3J0 Cj4+ICsgKiAgIC0gQSBEaXNwbGF5cG9ydCBDb21wbGlhbmNlIFRlc3RpbmcgYXBwbGlhbmNlIHN1 Y2ggYXMgUWRib3ggOTgwCj4+ICsgKiAgIC0gVGhpcyB1c2VyIGFwcGxpY2F0aW9uCj4+ICsgKiAg IC0gQSB3aW5kb3dzIGhvc3QgbWFjaGluZSB0byBydW4gdGhlIFFkYm94IDk4MCB0ZXN0IHNvZnR3 YXJlCj4+ICsgKiAgIC0gUm9vdCBhY2Nlc3Mgb24gdGhlIERVVCBkdWUgdG8gdGhlIHVzZSBvZiBz eXNmcyB1dGlsaXR5Cj4+ICsgKgo+PiArICogVGVzdCBTZXR1cDoKPj4gKyAqIEl0IGlzIHN0cm9u Z2x5IHJlY29tbWVuZGVkIHRoYXQgdGhlIHdpbmRvd3MgaG9zdCwgdGVzdCBhcHBsaWFuY2UgCj4+ IGFuZCBEVVQKPj4gKyAqIGJlIGZyZXNobHkgcmVzdGFydGVkIGJlZm9yZSBhbnkgdGVzdGluZyBi ZWdpbnMgdG8gZW5zdXJlIHRoYXQgYW55IAo+PiBwcmV2aW91cwo+PiArICogY29uZmlndXJhdGlv bnMgYW5kIHNldHRpbmdzIHdpbGwgbm90IGludGVyZmVyZSB3aXRoIHRlc3QgcHJvY2Vzcy4gCj4+ IFJlZmVyIHRvCj4+ICsgKiB0aGUgdGVzdCBhcHBsaWFuY2UgZG9jdW1lbnRhdGlvbiBmb3Igc2V0 dXAsIHNvZnR3YXJlIGluc3RhbGxhdGlvbiAKPj4gYW5kCj4+ICsgKiBvcGVyYXRpb24gc3BlY2lm aWMgdG8gdGhhdCBkZXZpY2UuCj4+ICsgKgo+PiArICogVGhlIExpbnV4IERVVCBtdXN0IGJlIGlu IHRleHQgKGNvbnNvbGUpIG1vZGUgYW5kIGNhbm5vdCBoYXZlIGFueSAKPj4gb3RoZXIKPj4gKyAq IGRpc3BsYXkgbWFuYWdlciBydW5uaW5nLiBZb3UgbXVzdCBiZSBsb2dnZWQgaW4gYXMgcm9vdCB0 byBydW4gdGhpcyAKPj4gdXNlciBhcHAuCj4+ICsgKiBPbmNlIHRoZSB1c2VyIGFwcGxpY2F0aW9u IGlzIHVwIGFuZCBydW5uaW5nLCB3YWl0aW5nIGZvciB0ZXN0IAo+PiByZXF1ZXN0cywgdGhlCj4+ ICsgKiBzb2Z0d2FyZSBvbiB0aGUgd2luZG93cyBob3N0IGNhbiBub3cgYmUgdXNlZCB0byBleGVj dXRlIHRoZSAKPj4gY29tcGxpYW5jZSB0ZXN0cy4KPj4gKyAqCj4+ICsgKiBUaGlzIHVzZXJzcGFj ZSBhcHBsaWNhdGlvbiBzdXBwb3J0cyBmb2xsb3dpbmcgdGVzdHMgZnJvbSB0aGUgRFAgCj4+IENU UyBTcGVjCj4+ICsgKiBSZXYgMS4xOgo+PiArICogICAtIFZpZGVvIFBhdHRlcm4gZ2VuZXJhdGlv biB0ZXN0czogVGhpcyBzdXBwb3J0cyBvbmx5IHRoZSAyNCBhbmQKPj4gKyAqICAgICAxOGJwcCBj b2xvcgo+PiArICogICAgIHJhbXAgdGVzdCBwYXR0ZXJuICg0LjMuMy4xKS4KPj4gKyAqCj4+ICsg KiBDb25uZWN0aW9ucyAocmVxdWlyZWQpOgo+PiArICogICAtIFRlc3QgQXBwbGlhbmNlIGNvbm5l Y3RlZCB0byB0aGUgZXh0ZXJuYWwgRGlzcGxheXBvcnQgY29ubmVjdG9yIAo+PiBvbiB0aGUgRFVU Cj4+ICsgKiAgIC0gVGVzdCBBcHBsaWFuY2UgTW9uaXRvciBPdXQgY29ubmVjdGVkIHRvIERpc3Bs YXlwb3J0IGNvbm5lY3RvciAKPj4gb24gdGhlCj4+ICsgKiBtb25pdG9yCj4+ICsgKiAgIC0gVGVz dCBhcHBsaWFuY2UgY29ubmVjdGVkIHRvIHRoZSBXaW5kb3dzIEhvc3QgdmlhIFVTQgo+PiArICoK Pj4gKyAqIERlYnVnZnMgRmlsZXM6Cj4+ICsgKiBUaGUgZmlsZSByb290IGZvciBhbGwgIHRoZSBk ZWJ1Z2ZzIGZpbGU6Cj4+ICsgKiAvc3lzL2tlcm5lbC9kZWJ1Zy9kcmkvMC8KPj4gKyAqCj4+ICsg KiBUaGUgc3BlY2lmaWMgZmlsZXMgYXJlIGFzIGZvbGxvd3M6Cj4+ICsgKgo+PiArICogbXNtX2Rw X3Rlc3RfYWN0aXZlCj4+ICsgKiBBIHNpbXBsZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIg b3Igbm90IGNvbXBsaWFuY2UgdGVzdGluZyBpcyAKPj4gY3VycmVudGx5Cj4+ICsgKiBhY3RpdmUg aW4gdGhlIGtlcm5lbC4gVGhpcyBmbGFnIGlzIHBvbGxlZCBieSB1c2Vyc3BhY2UgYW5kIG9uY2Ug Cj4+IHNldCwgaW52b2tlcwo+PiArICogdGhlIHRlc3QgaGFuZGxlciBpbiB0aGUgdXNlciBhcHAu IFRoaXMgZmxhZyBpcyBzZXQgYnkgdGhlIHRlc3QgCj4+IGhhbmRsZXIgaW4gdGhlCj4+ICsgKiBr ZXJuZWwgYWZ0ZXIgcmVhZGluZyB0aGUgcmVnaXN0ZXJzIHJlcXVlc3RlZCBieSB0aGUgdGVzdCAK Pj4gYXBwbGlhbmNlLgo+PiArICoKPj4gKyAqIG1zbV9kcF90ZXN0X2RhdGEKPj4gKyAqIFRlc3Qg ZGF0YSBpcyB1c2VkIGJ5IHRoZSBrZXJuZWwgdG8gcGFzcyBwYXJhbWV0ZXJzIHRvIHRoZSB1c2Vy IAo+PiBhcHAuIEVnOiBJbgo+PiArICogY2FzZSBvZiBFRElEIHRlc3RzLCB0aGUgZGF0YSB0aGF0 IGlzIGRlbGl2ZXJlZCB0byB0aGUgdXNlcnNwYWNlIGlzIAo+PiB0aGUgdmlkZW8KPj4gKyAqIG1v ZGUgdG8gYmUgc2V0IGZvciB0aGUgdGVzdC4KPj4gKyAqIEluIGNhc2Ugb2YgdmlkZW8gcGF0dGVy biB0ZXN0LCB0aGUgZGF0YSB0aGF0IGlzIGRlbGl2ZXJlZCB0byB0aGUgCj4+IHVzZXJzcGFjZSBp cwo+PiArICogdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHRlc3QgcGF0dGVybiBhbmQgdGhl IGJpdHMgcGVyIGNvbG9yIAo+PiB2YWx1ZS4KPj4gKyAqCj4+ICsgKiBtc21fZHBfdGVzdF90eXBl Cj4+ICsgKiBUaGUgdGVzdCB0eXBlIHZhcmlhYmxlIGluc3RydWN0cyB0aGUgdXNlciBhcHAgYXMg dG8gd2hhdCB0aGUgCj4+IHJlcXVlc3RlZCB0ZXN0Cj4+ICsgKiB3YXMgZnJvbSB0aGUgc2luayBk ZXZpY2UuIFRoZXNlIHZhbHVlcyBkZWZpbmVkIGF0IHRoZSB0b3Agb2YgdGhlCj4+ICsgKiBhcHBs aWNhdGlvbidzIG1haW4gaW1wbGVtZW50YXRpb24gZmlsZSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3 aXRoIAo+PiB0aGUKPj4gKyAqIHZhbHVlcyBkZWZpbmVkIGluIHRoZSBrZXJuZWwncyBkcm1fZHBf aGVscGVyLmggZmlsZS4KPj4gKyAqIFRoaXMgYXBwIGlzIGJhc2VkIG9uIHNvbWUgcHJpb3Igd29y ayBzdWJtaXR0ZWQgaW4gQXByaWwgMjAxNSBieSAKPj4gVG9kZCBQcmV2aXRlCj4+ICsgKiAoPHRw cmV2aXRlQGdtYWlsLmNvbT4pLgo+PiArICoKPj4gKyAqIFRoaXMgd29yayBpcyBiYXNlZCB1cG9u IHRoZSBpbnRlbF9kcF9jb21wbGlhbmNlLmMgYXV0aG9yZWQgYnkKPj4gKyAqIE1hbmFzaSBOYXZh cmUgPG1hbmFzaS5kLm5hdmFyZUBpbnRlbC5jb20+Cj4+ICsgKgo+PiArICoKPj4gKyAqIFRoaXMg dG9vbCBjYW4gYmUgcnVuIGFzOgo+PiArICogLi9tc21fZHBfY29tcGxpYW5jZSAgSXQgd2lsbCB3 YWl0IHRpbGwgeW91IHN0YXJ0IGNvbXBsaWFuY2Ugc3VpdGUgCj4+IGZyb20KPj4gKyAqIFFkYm94 IDk4MC4KPj4gKyAqIC4vbXNtX2RwX2NvbXBsaWFuY2UgLWggIFRoaXMgd2lsbCBvcGVuIHRoZSBo ZWxwCj4+ICsgKiAuL21zbV9kcF9jb21wbGlhbmNlIC1pICBUaGlzIHdpbGwgcHJvdmlkZSBpbmZv cm1hdGlvbiBhYm91dCAKPj4gY3VycmVudAo+PiArICogY29ubmVjdG9ycy9DUlRDcy4gVGhpcyBj YW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2UuCj4+ICsgKgo+PiArICogQXV0aG9yczoK Pj4gKyAqICAgIEFiaGluYXYgS3VtYXIgPGFiaGluYXZrQGNvZGVhdXJvcmEub3JnPgo+PiArICoK Pj4gKyAqIEVsZW1lbnRzIG9mIHRoZSBtb2Rlc2V0IGNvZGUgYWRhcHRlZCBmcm9tIERhdmlkIEhl cnJtYW5uJ3MKPj4gKyAqIERSTSBtb2Rlc2V0IGV4YW1wbGUKPj4gKyAqCj4+ICsgKi8KPj4gKyNp bmNsdWRlICJpZ3QuaCIKPj4gKyNpbmNsdWRlIDxlcnJuby5oPgo+PiArI2luY2x1ZGUgPGdldG9w dC5oPgo+PiArI2luY2x1ZGUgPG1hdGguaD4KPj4gKyNpbmNsdWRlIDxzdGRpbnQuaD4KPj4gKyNp bmNsdWRlIDxzdGRib29sLmg+Cj4+ICsjaW5jbHVkZSA8c3RyaW5ncy5oPgo+PiArI2luY2x1ZGUg PHVuaXN0ZC5oPgo+PiArI2luY2x1ZGUgPHRlcm1pb3MuaD4KPj4gKyNpbmNsdWRlIDxzeXMvcG9s bC5oPgo+PiArI2luY2x1ZGUgPHN5cy90aW1lLmg+Cj4+ICsjaW5jbHVkZSA8c3lzL2lvY3RsLmg+ Cj4+ICsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cj4+ICsjaW5jbHVkZSA8c3lzL3N0YXQuaD4KPj4g KyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Cj4+ICsjaW5jbHVkZSA8YXNzZXJ0Lmg+Cj4+ICsjaW5j bHVkZSA8c2lnbmFsLmg+Cj4+ICsjaW5jbHVkZSA8ZmNudGwuaD4KPj4gKyNpbmNsdWRlIDx0aW1l Lmg+Cj4+ICsKPj4gKyNpbmNsdWRlICJpZ3RfZHBfY29tcGxpYW5jZS5oIgo+PiArCj4+ICsjaW5j bHVkZSA8c3RkbGliLmg+Cj4+ICsjaW5jbHVkZSA8c2lnbmFsLmg+Cj4+ICsKPj4gKy8qIFVzZXIg SW5wdXQgZGVmaW5pdGlvbnMgKi8KPj4gKyNkZWZpbmUgSEVMUF9ERVNDUklQVElPTiAxCj4+ICsK Pj4gKy8qIERlYnVnZnMgZmlsZSBkZWZpbml0aW9ucyAqLwo+PiArI2RlZmluZSBNU01fRFBfVEVT VF9UWVBFX0ZJTEUJCSJtc21fZHBfdGVzdF90eXBlIgo+PiArI2RlZmluZSBNU01fRFBfVEVTVF9B Q1RJVkVfRklMRQkibXNtX2RwX3Rlc3RfYWN0aXZlIgo+PiArI2RlZmluZSBNU01fRFBfVEVTVF9E QVRBX0ZJTEUJCSJtc21fZHBfdGVzdF9kYXRhIgo+PiArCj4+ICsvKiBEUk0gZGVmaW5pdGlvbnMg LSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBEUk0gaGVhZGVyICovCj4+ICsjZGVmaW5l IERQX1RFU1RfTElOS19WSURFT19QQVRURVJOCSgxIDw8IDEpCj4+ICsKPj4gKy8qIEdsb2JhbCBm aWxlIHBvaW50ZXJzIGZvciB0aGUgc3lzZnMgZmlsZXMgKi8KPj4gK0ZJTEUgKnRlc3RfYWN0aXZl X2ZwLCAqdGVzdF9kYXRhX2ZwLCAqdGVzdF90eXBlX2ZwOwo+PiArCj4+ICtib29sIHZpZGVvX3Bh dHRlcm5fZmxhZzsKPj4gKwo+PiArLyogVmlkZW8gcGF0dGVybiB0ZXN0IGdsb2JhbHMgKi8KPj4g K3VpbnQxNl90IGhkaXNwbGF5Owo+PiArdWludDE2X3QgdmRpc3BsYXk7Cj4+ICt1aW50OF90IGJp dGRlcHRoOwo+PiArCj4+ICtkcm1Nb2RlUmVzICpyZXNvdXJjZXM7Cj4+ICtpbnQgZHJtX2ZkLCBt b2RlcywgZ2VuOwo+PiArdWludDY0X3QgdGlsaW5nID0gTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9O RTsKPj4gK3VpbnQzMl90IGRlcHRoID0gMjQsIHN0cmlkZSwgYnBwOwo+PiAraW50IHNwZWNpZmll ZF9tb2RlX251bSA9IC0xLCBzcGVjaWZpZWRfZGlzcF9pZCA9IC0xOwo+PiAraW50IHdpZHRoLCBo ZWlnaHQ7Cj4+ICt1aW50MzJfdCB0ZXN0X2NydGM7Cj4+ICt1aW50MzJfdCBhY3RpdmVfY3J0YzsK Pj4gK3VpbnQzMl90IHRlc3RfY29ubmVjdG9yX2lkOwo+PiArZW51bSB7Cj4+ICsJTVNNX01PREVf SU5WQUxJRCA9IC0xLAo+PiArCU1TTV9NT0RFX05PTkUgPSAwLAo+PiArCU1TTV9NT0RFX1ZJREVP X1BBVFRFUk5fVEVTVAo+PiArfSBtc21fZGlzcGxheV9tb2RlOwo+PiArCj4+ICtzdHJ1Y3QgdGVz dF92aWRlb19wYXR0ZXJuIHsKPj4gKwl1aW50MTZfdCBoZGlzcGxheTsKPj4gKwl1aW50MTZfdCB2 ZGlzcGxheTsKPj4gKwl1aW50OF90IGJpdGRlcHRoOwo+PiArCXVpbnQzMl90IGZiOwo+PiArCXVp bnQzMl90IHNpemU7Cj4+ICsJc3RydWN0IGlndF9mYiBmYl9wYXR0ZXJuOwo+PiArCWRybU1vZGVN b2RlSW5mbyBtb2RlOwo+PiArCXVpbnQzMl90ICpwaXhtYXA7Cj4+ICt9Owo+PiArCj4+ICtzdHJ1 Y3QgY29ubmVjdG9yIHsKPj4gKwl1aW50MzJfdCBpZDsKPj4gKwlpbnQgbW9kZV92YWxpZDsKPj4g Kwlkcm1Nb2RlTW9kZUluZm8gbW9kZSwgbW9kZV9mYWlsc2FmZTsKPj4gKwlkcm1Nb2RlQ29ubmVj dG9yICpjb25uZWN0b3I7Cj4+ICsJaW50IGNydGM7Cj4+ICsJLyogU3RhbmRhcmQgYW5kIHByZWZl cnJlZCBmcmFtZSBidWZmZXIqLwo+PiArCXVpbnQ4X3QgKnBpeG1hcDsKPj4gKwo+PiArCXN0cnVj dCB0ZXN0X3ZpZGVvX3BhdHRlcm4gdGVzdF9wYXR0ZXJuOwo+PiArfTsKPj4gKwo+PiArc3RhdGlj IHZvaWQgY2xlYXJfdGVzdF9hY3RpdmUodm9pZCkKPj4gK3sKPj4gKwlyZXdpbmQodGVzdF9hY3Rp dmVfZnApOwo+PiArCWZwcmludGYodGVzdF9hY3RpdmVfZnAsICIlZCIsIDApOwo+PiArCWZmbHVz aCh0ZXN0X2FjdGl2ZV9mcCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBGSUxFICpmb3BlbmF0KGlu dCBkaXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpCj4+ICt7Cj4+ICsJaW50 IGZkID0gb3BlbmF0KGRpciwgbmFtZSwgT19SRFdSKTsKPj4gKwo+PiArCXJldHVybiBmZG9wZW4o ZmQsIG1vZGUpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBzZXR1cF9kZWJ1Z2ZzX2ZpbGVz KHZvaWQpCj4+ICt7Cj4+ICsJaW50IGRpciA9IGlndF9kZWJ1Z2ZzX2Rpcihkcm1fZmQpOwo+PiAr Cj4+ICsJdGVzdF90eXBlX2ZwID0gZm9wZW5hdChkaXIsIE1TTV9EUF9URVNUX1RZUEVfRklMRSwg InIiKTsKPj4gKwlpZ3RfcmVxdWlyZSh0ZXN0X3R5cGVfZnApOwo+PiArCj4+ICsJdGVzdF9kYXRh X2ZwID0gZm9wZW5hdChkaXIsIE1TTV9EUF9URVNUX0RBVEFfRklMRSwgInIiKTsKPj4gKwlpZ3Rf cmVxdWlyZSh0ZXN0X2RhdGFfZnApOwo+PiArCXRlc3RfYWN0aXZlX2ZwID0gZm9wZW5hdChkaXIs IE1TTV9EUF9URVNUX0FDVElWRV9GSUxFLCAidysiKTsKPj4gKwo+PiArCWlndF9yZXF1aXJlKHRl c3RfYWN0aXZlX2ZwKTsKPj4gKwo+PiArCWNsb3NlKGRpcik7Cj4+ICsKPj4gKwkvKiBSZXNldCB0 aGUgYWN0aXZlIGZsYWcgZm9yIHNhZmV0eSAqLwo+PiArCWNsZWFyX3Rlc3RfYWN0aXZlKCk7Cj4+ ICt9Cj4+ICsKPj4gK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF90ZXN0X3R5cGUodm9pZCkKPj4g K3sKPj4gKwl1bnNpZ25lZCBsb25nIHRlc3RfdHlwZTsKPj4gKwlpbnQgcmV0Owo+PiArCj4+ICsJ aWYgKCF0ZXN0X3R5cGVfZnApCj4+ICsJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB0ZXN0X3R5 cGUgZmlsZVxuIik7Cj4+ICsJcmV3aW5kKHRlc3RfdHlwZV9mcCk7Cj4+ICsJcmV0ID0gZnNjYW5m KHRlc3RfdHlwZV9mcCwgIiVseCIsICZ0ZXN0X3R5cGUpOwo+PiArCWlmIChyZXQgPCAxIHx8IHRl c3RfdHlwZSA8PSAwKSB7Cj4+ICsJCWlndF93YXJuKCJ0ZXN0X3R5cGUgcmVhZCBmYWlsZWQgLSAl bHhcbiIsIHRlc3RfdHlwZSk7Cj4+ICsJCXJldHVybiAwOwo+PiArCX0KPj4gKwo+PiArCXJldHVy biB0ZXN0X3R5cGU7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIGdldF90ZXN0X3ZpZGVvcGF0 dGVybl9kYXRhKHZvaWQpCj4+ICt7Cj4+ICsJaW50IGNvdW50ID0gMDsKPj4gKwl1aW50MTZfdCB2 aWRlb19wYXR0ZXJuX3ZhbHVlWzNdOwo+PiArCWNoYXIgdmlkZW9fcGF0dGVybl9hdHRyaWJ1dGVb MTVdOwo+PiArCWludCByZXQ7Cj4+ICsKPj4gKwlpZiAoIXRlc3RfZGF0YV9mcCkKPj4gKwkJZnBy aW50ZihzdGRlcnIsICJJbnZhbGlkIHRlc3RfZGF0YSBmaWxlXG4iKTsKPj4gKwo+PiArCXJld2lu ZCh0ZXN0X2RhdGFfZnApOwo+PiArCXdoaWxlICghZmVvZih0ZXN0X2RhdGFfZnApICYmIGNvdW50 IDwgMykgewo+PiArCQlyZXQgPSBmc2NhbmYodGVzdF9kYXRhX2ZwLCAiJXMgJXVcbiIsIHZpZGVv X3BhdHRlcm5fYXR0cmlidXRlLAo+PiArCQkgICAgICAgKHVuc2lnbmVkIGludCAqKSZ2aWRlb19w YXR0ZXJuX3ZhbHVlW2NvdW50KytdKTsKPj4gKwkJaWYgKHJldCA8IDIpIHsKPj4gKwkJCWlndF93 YXJuKCJ0ZXN0X2RhdGEgcmVhZCBmYWlsZWRcbiIpOwo+PiArCQkJcmV0dXJuOwo+PiArCQl9Cj4+ ICsJfQo+PiArCj4+ICsJaGRpc3BsYXkgPSB2aWRlb19wYXR0ZXJuX3ZhbHVlWzBdOwo+PiArCXZk aXNwbGF5ID0gdmlkZW9fcGF0dGVybl92YWx1ZVsxXTsKPj4gKwliaXRkZXB0aCA9IHZpZGVvX3Bh dHRlcm5fdmFsdWVbMl07Cj4+ICsJaWd0X2luZm8oIkhkaXNwbGF5ID0gJWRcbiIsIGhkaXNwbGF5 KTsKPj4gKwlpZ3RfaW5mbygiVmRpc3BsYXkgPSAlZFxuIiwgdmRpc3BsYXkpOwo+PiArCWlndF9p bmZvKCJCaXREZXB0aCA9ICV1XG4iLCBiaXRkZXB0aCk7Cj4+ICsKPj4gK30KPj4gKwo+PiArc3Rh dGljIGludCBwcm9jZXNzX3Rlc3RfcmVxdWVzdChpbnQgdGVzdF90eXBlKQo+PiArewo+PiArCWlu dCBtb2RlOwo+PiArCWJvb2wgdmFsaWQgPSBmYWxzZTsKPj4gKwo+PiArCXN3aXRjaCAodGVzdF90 eXBlKSB7Cj4+ICsJY2FzZSBEUF9URVNUX0xJTktfVklERU9fUEFUVEVSTjoKPj4gKwkJdmlkZW9f cGF0dGVybl9mbGFnID0gdHJ1ZTsKPj4gKwkJZ2V0X3Rlc3RfdmlkZW9wYXR0ZXJuX2RhdGEoKTsK Pj4gKwkJbW9kZSA9IE1TTV9NT0RFX1ZJREVPX1BBVFRFUk5fVEVTVDsKPj4gKwkJdmFsaWQgPSB0 cnVlOwo+PiArCQlicmVhazsKPj4gKwlkZWZhdWx0Ogo+PiArCQkvKiBVbmtub3duIHRlc3QgdHlw ZSAqLwo+PiArCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgdGVzdCByZXF1ZXN0LCBpZ25vcmVk LlxuIik7Cj4+ICsJCWJyZWFrOwo+PiArCX0KPj4gKwo+PiArCWlmICh2YWxpZCkKPj4gKwkJcmV0 dXJuIHVwZGF0ZV9kaXNwbGF5KG1vZGUsIHRydWUpOwo+PiArCj4+ICsJcmV0dXJuIC0xOwo+PiAr fQo+PiArCj4+ICtzdGF0aWMgdm9pZCBkdW1wX2luZm8odm9pZCkKPj4gK3sKPj4gKwlpZ3RfZHVt cF9jb25uZWN0b3JzX2ZkKGRybV9mZCk7Cj4+ICsJaWd0X2R1bXBfY3J0Y3NfZmQoZHJtX2ZkKTsK Pj4gK30KPj4gKwo+PiArc3RhdGljIGludCBzZXR1cF92aWRlb19wYXR0ZXJuX2ZyYW1lYnVmZmVy KHN0cnVjdCBjb25uZWN0b3IgKmRwX2Nvbm4pCj4+ICt7Cj4+ICsJdWludDMyX3QgIHZpZGVvX3dp ZHRoLCB2aWRlb19oZWlnaHQ7Cj4+ICsKPj4gKwl2aWRlb193aWR0aCA9IGRwX2Nvbm4tPnRlc3Rf cGF0dGVybi5oZGlzcGxheTsKPj4gKwl2aWRlb19oZWlnaHQgPSBkcF9jb25uLT50ZXN0X3BhdHRl cm4udmRpc3BsYXk7Cj4+ICsKPj4gKwlkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmIgPSBpZ3RfY3Jl YXRlX2ZiKGRybV9mZCwKPj4gKwkJCXZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQsCj4+ICsJCQlE Uk1fRk9STUFUX1hSR0I4ODg4LAo+PiArCQkJTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKPj4g KwkJCSZkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmJfcGF0dGVybik7Cj4+ICsJaWd0X2Fzc2VydChk cF9jb25uLT50ZXN0X3BhdHRlcm4uZmIpOwo+PiArCj4+ICsKPj4gKwlkcF9jb25uLT50ZXN0X3Bh dHRlcm4ucGl4bWFwID0ga21zdGVzdF9kdW1iX21hcF9idWZmZXIoZHJtX2ZkLAo+PiArCQkJZHBf Y29ubi0+dGVzdF9wYXR0ZXJuLmZiX3BhdHRlcm4uZ2VtX2hhbmRsZSwKPj4gKwkJCWRwX2Nvbm4t PnRlc3RfcGF0dGVybi5mYl9wYXR0ZXJuLnNpemUsCj4+ICsJCQlQUk9UX1JFQUQgfCBQUk9UX1dS SVRFKTsKPj4gKwo+PiArCWlmIChkcF9jb25uLT50ZXN0X3BhdHRlcm4ucGl4bWFwID09IE5VTEwp Cj4+ICsJCXJldHVybiAtMTsKPj4gKwo+PiArCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5zaXplID0g ZHBfY29ubi0+dGVzdF9wYXR0ZXJuLmZiX3BhdHRlcm4uc2l6ZTsKPj4gKwltZW1zZXQoZHBfY29u bi0+dGVzdF9wYXR0ZXJuLnBpeG1hcCwgMCwgZHBfY29ubi0+dGVzdF9wYXR0ZXJuLnNpemUpOwo+ PiArCXJldHVybiAwOwo+PiArCj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgc2V0X3Rlc3RfbW9k ZShzdHJ1Y3QgY29ubmVjdG9yICpkcF9jb25uKQo+PiArewo+PiArCWludCByZXQgPSAwOwo+PiAr CWludCBpOwo+PiArCWRybU1vZGVDb25uZWN0b3IgKmMgPSBkcF9jb25uLT5jb25uZWN0b3I7Cj4+ ICsKPj4gKwkvKiBJZ25vcmUgYW55IGRpc2Nvbm5lY3RlZCBkZXZpY2VzICovCj4+ICsJaWYgKGMt PmNvbm5lY3Rpb24gIT0gRFJNX01PREVfQ09OTkVDVEVEKSB7Cj4+ICsJCWlndF93YXJuKCJDb25u ZWN0b3IgJXUgZGlzY29ubmVjdGVkXG4iLCBjLT5jb25uZWN0b3JfaWQpOwo+PiArCQlyZXR1cm4g LUVOT0VOVDsKPj4gKwl9Cj4+ICsJaWd0X2luZm8oIkNvbm5lY3RvciBzZXR1cDpcbiIpOwo+PiAr Cj4+ICsJLyoKPj4gKwkgKiB0by1kbzogZm9yIGNhc2VzIHdoZXJlIGRyaXZlciBkb2Vzbid0IHN1 cHBvcnQgNEsgYnV0Cj4+ICsJICogaXRzIHRoZSBwcmVmZXJyZWQgbW9kZSBvZiB0aGUgc2luaywg dXNlIDY0MHg0ODAgYXMKPj4gKwkgKiBkZWZhdWx0IHJlc29sdXRpb24KPj4gKwkgKi8KPj4gKwo+ PiArCWZvciAoaSA9IDA7IGkgPCBjLT5jb3VudF9tb2RlczsgaSsrKSB7Cj4+ICsJCWlmIChjLT5t b2Rlc1tpXS5oZGlzcGxheSA9PSA2NDAgJiYKPj4gKwkJCWMtPm1vZGVzW2ldLnZkaXNwbGF5ID09 IDQ4MCAmJgo+PiArCQkJYy0+bW9kZXNbaV0udnJlZnJlc2ggPT0gNjApIHsKPj4gKwkJCWlndF9p bmZvKCJmb3VuZCBpZHggb2YgZmFpbHNhZmUgbW9kZSA9ICVkXG4iLCBpKTsKPj4gKwkJCWJyZWFr Owo+PiArCQl9Cj4+ICsJfQo+PiArCj4+ICsJaWYgKGkgPT0gYy0+Y291bnRfbW9kZXMpIHsKPj4g KwkJaWd0X2luZm8oImRpZG4ndCBmaW5kIGZhaWxzYWZlIHVzaW5nIGRlZmF1bHRcbiIpOwo+PiAr CQlpID0gMDsKPj4gKwl9Cj4+ICsKPj4gKwlkcF9jb25uLT50ZXN0X3BhdHRlcm4ubW9kZSA9IGMt Pm1vZGVzW2ldOwo+PiArCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5tb2RlLmhkaXNwbGF5ID0gYy0+ bW9kZXNbaV0uaGRpc3BsYXk7Cj4+ICsJZHBfY29ubi0+dGVzdF9wYXR0ZXJuLm1vZGUudmRpc3Bs YXkgPSBjLT5tb2Rlc1tpXS52ZGlzcGxheTsKPj4gKwo+PiArCWlndF9pbmZvKCJmYWlsc2FmZSAo bW9kZSAlZCkgZm9yIGNvbm5lY3RvciAldSBpcyAldXgldVxuIiwgaSwKPj4gKwkJIGRwX2Nvbm4t PmlkLCBjLT5tb2Rlc1tpXS5oZGlzcGxheSwgYy0+bW9kZXNbaV0udmRpc3BsYXkpOwo+PiArCWZm bHVzaChzdGRpbik7Cj4+ICsKPj4gKwlpZiAodmlkZW9fcGF0dGVybl9mbGFnKSB7Cj4+ICsJCWRw X2Nvbm4tPnRlc3RfcGF0dGVybi5oZGlzcGxheSA9IGhkaXNwbGF5Owo+PiArCQlkcF9jb25uLT50 ZXN0X3BhdHRlcm4udmRpc3BsYXkgPSB2ZGlzcGxheTsKPj4gKwkJZHBfY29ubi0+dGVzdF9wYXR0 ZXJuLmJpdGRlcHRoID0gYml0ZGVwdGg7Cj4+ICsKPj4gKwkJcmV0ID0gc2V0dXBfdmlkZW9fcGF0 dGVybl9mcmFtZWJ1ZmZlcihkcF9jb25uKTsKPj4gKwkJaWYgKHJldCkgewo+PiArCQkJaWd0X3dh cm4oIkNyZWF0aW5nIGZyYW1lYnVmZmVyIGZvciBjb25uZWN0b3IgJXUgZmFpbGVkICglZClcbiIs Cj4+ICsJCQkJIGMtPmNvbm5lY3Rvcl9pZCwgcmV0KTsKPj4gKwkJCXJldHVybiByZXQ7Cj4+ICsJ CX0KPj4gKwo+PiArCQlyZXQgPSBpZ3RfZmlsbF9jdHNfZnJhbWVidWZmZXIoZHBfY29ubi0+dGVz dF9wYXR0ZXJuLnBpeG1hcCwKPj4gKwkJCQlkcF9jb25uLT50ZXN0X3BhdHRlcm4uaGRpc3BsYXks Cj4+ICsJCQkJZHBfY29ubi0+dGVzdF9wYXR0ZXJuLnZkaXNwbGF5LAo+PiArCQkJCWRwX2Nvbm4t PnRlc3RfcGF0dGVybi5iaXRkZXB0aCwKPj4gKwkJCQkwKTsKPj4gKwkJaWYgKHJldCkgewo+PiAr CQkJaWd0X3dhcm4oIkZpbGxpbmcgZnJhbWVidWZmZXIgZm9yIGNvbm5lY3RvciAldSBmYWlsZWQg KCVkKVxuIiwKPj4gKwkJCQkgYy0+Y29ubmVjdG9yX2lkLCByZXQpOwo+PiArCQkJcmV0dXJuIHJl dDsKPj4gKwkJfQo+PiArCQkvKiB1bm1hcHBpbmcgdGhlIGJ1ZmZlciBwcmV2aW91c2x5IG1hcHBl ZCBkdXJpbmcgc2V0dXAgKi8KPj4gKwkJbXVubWFwKGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5waXht YXAsCj4+ICsJCQkJZHBfY29ubi0+dGVzdF9wYXR0ZXJuLnNpemUpOwo+PiArCX0KPj4gKwo+PiAr CXJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgc2V0X3ZpZGVvKGludCBtb2Rl LCBzdHJ1Y3QgY29ubmVjdG9yICp0ZXN0X2Nvbm5lY3RvcikKPj4gK3sKPj4gKwlkcm1Nb2RlTW9k ZUluZm8gKnJlcXVlc3RlZF9tb2RlOwo+PiArCXVpbnQzMl90IHJlcXVpcmVkX2ZiX2lkOwo+PiAr CXN0cnVjdCBpZ3RfZmIgcmVxdWlyZWRfZmI7Cj4+ICsJaW50IHJldCA9IDA7Cj4+ICsKPj4gKwlz d2l0Y2ggKG1vZGUpIHsKPj4gKwljYXNlIE1TTV9NT0RFX05PTkU6Cj4+ICsJCWlndF9pbmZvKCJO T05FXG4iKTsKPj4gKwkJcmV0ID0gZHJtTW9kZVNldENydGMoZHJtX2ZkLCB0ZXN0X2Nvbm5lY3Rv ci0+Y3J0YywKPj4gKwkJCQkgICAgIC0xLCAwLCAwLCBOVUxMLCAwLCBOVUxMKTsKPj4gKwkJZ290 byBvdXQ7Cj4+ICsJY2FzZSBNU01fTU9ERV9WSURFT19QQVRURVJOX1RFU1Q6Cj4+ICsJCWlndF9p bmZvKCJWSURFTyBQQVRURVJOIFRFU1RcbiIpOwo+PiArCQlyZXF1ZXN0ZWRfbW9kZSA9ICZ0ZXN0 X2Nvbm5lY3Rvci0+dGVzdF9wYXR0ZXJuLm1vZGU7Cj4+ICsJCXJlcXVpcmVkX2ZiX2lkID0gdGVz dF9jb25uZWN0b3ItPnRlc3RfcGF0dGVybi5mYjsKPj4gKwkJcmVxdWlyZWRfZmIgPSB0ZXN0X2Nv bm5lY3Rvci0+dGVzdF9wYXR0ZXJuLmZiX3BhdHRlcm47Cj4+ICsJCWJyZWFrOwo+PiArCWNhc2Ug TVNNX01PREVfSU5WQUxJRDoKPj4gKwlkZWZhdWx0Ogo+PiArCQlpZ3Rfd2FybigiSU5WQUxJRCEg KCUwOHgpIE1vZGUgc2V0IGFib3J0ZWQhXG4iLCBtb2RlKTsKPj4gKwkJcmV0dXJuIC0xOwo+PiAr CX0KPj4gKwo+PiArCWlndF9pbmZvKCJDUlRDKCV1KToiLCB0ZXN0X2Nvbm5lY3Rvci0+Y3J0Yyk7 Cj4+ICsJa21zdGVzdF9kdW1wX21vZGUocmVxdWVzdGVkX21vZGUpOwo+PiArCXJldCA9IGRybU1v ZGVTZXRDcnRjKGRybV9mZCwgdGVzdF9jb25uZWN0b3ItPmNydGMsIHJlcXVpcmVkX2ZiX2lkLCAK Pj4gMCwgMCwKPj4gKwkJCSAgICAgJnRlc3RfY29ubmVjdG9yLT5pZCwgMSwgcmVxdWVzdGVkX21v ZGUpOwo+PiArCWlmIChyZXQpIHsKPj4gKwkJaWd0X3dhcm4oIkZhaWxlZCB0byBzZXQgbW9kZSAo JWR4JWRAJWRIeik6ICVzXG4iLAo+PiArCQkJIHJlcXVlc3RlZF9tb2RlLT5oZGlzcGxheSwgcmVx dWVzdGVkX21vZGUtPnZkaXNwbGF5LAo+PiArCQkJIHJlcXVlc3RlZF9tb2RlLT52cmVmcmVzaCwg c3RyZXJyb3IoZXJybm8pKTsKPj4gKwkJaWd0X3JlbW92ZV9mYihkcm1fZmQsICZyZXF1aXJlZF9m Yik7Cj4+ICsKPj4gKwl9Cj4+ICsJLyogS2VlcCB0aGUgcGF0dGVybiBmb3IgMSBzZWMgZm9yIFFk Ym94IDk4MCB0byBkZXRlY3QgaXQgKi8KPj4gKwlzbGVlcCgxKTsKPj4gKwo+PiArb3V0Ogo+PiAr CWlmIChyZXQpIHsKPj4gKwkJaWd0X3dhcm4oIkZhaWxlZCB0byBzZXQgQ1JUQyBmb3IgY29ubmVj dG9yICV1XG4iLAo+PiArCQkJIHRlc3RfY29ubmVjdG9yLT5pZCk7Cj4+ICsJfQo+PiArCj4+ICsJ cmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludAo+PiArc2V0X2RlZmF1bHRfbW9k ZShzdHJ1Y3QgY29ubmVjdG9yICpjLCBib29sIHNldF9tb2RlKQo+PiArewo+PiArCXVuc2lnbmVk IGludCBmYl9pZCA9IDA7Cj4+ICsJc3RydWN0IGlndF9mYiBmYl9pbmZvOwo+PiArCWludCByZXQg PSAwOwo+PiArCWludCBpOwo+PiArCWRybU1vZGVDb25uZWN0b3IgKmNvbm4gPSBjLT5jb25uZWN0 b3I7Cj4+ICsKPj4gKwlpZiAoIXNldF9tb2RlKSB7Cj4+ICsJCWlndF9pbmZvKCJub3QgcmVzZXR0 aW5nIHRoZSBtb2RlXG4iKTsKPj4gKwkJcmV0ID0gZHJtTW9kZVNldENydGMoZHJtX2ZkLCBjLT5j cnRjLCAwLCAwLCAwLAo+PiArCQkJCSAgICAgTlVMTCwgMCwgTlVMTCk7Cj4+ICsJCWlmIChyZXQp Cj4+ICsJCQlpZ3Rfd2FybigiRmFpbGVkIHRvIHVuc2V0IG1vZGUiKTsKPj4gKwkJcmV0dXJuIHJl dDsKPj4gKwl9Cj4+ICsKPj4gKwlmb3IgKGkgPSAwOyBpIDwgY29ubi0+Y291bnRfbW9kZXM7IGkr Kykgewo+PiArCQlpZiAoY29ubi0+bW9kZXNbaV0uaGRpc3BsYXkgPT0gNjQwICYmCj4+ICsJCQlj b25uLT5tb2Rlc1tpXS52ZGlzcGxheSA9PSA0ODAgJiYKPj4gKwkJCWNvbm4tPm1vZGVzW2ldLnZy ZWZyZXNoID09IDYwKSB7Cj4+ICsJCQlpZ3RfaW5mbygiZm91bmQgaWR4IG9mIGZhaWxzYWZlIG1v ZGUgPSAlZFxuIiwgaSk7Cj4+ICsJCQlicmVhazsKPj4gKwkJfQo+PiArCX0KPj4gKwo+PiArCWlm IChpID09IGNvbm4tPmNvdW50X21vZGVzKSB7Cj4+ICsJCWlndF9pbmZvKCJkaWRuJ3QgZmluZCBm YWlsc2FmZSB1c2luZyBkZWZhdWx0XG4iKTsKPj4gKwkJaSA9IDA7Cj4+ICsJfQo+PiArCj4+ICsJ Yy0+bW9kZSA9IGMtPmNvbm5lY3Rvci0+bW9kZXNbaV07Cj4+ICsKPj4gKwl3aWR0aCA9IGMtPm1v ZGUuaGRpc3BsYXk7Cj4+ICsJaGVpZ2h0ID0gYy0+bW9kZS52ZGlzcGxheTsKPj4gKwo+PiArCWZi X2lkID0gaWd0X2NyZWF0ZV9wYXR0ZXJuX2ZiKGRybV9mZCwgd2lkdGgsIGhlaWdodCwKPj4gKwkJ CQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAo+PiArCQkJCSAgICAgIHRpbGluZywgJmZiX2lu Zm8pOwo+PiArCj4+ICsJa21zdGVzdF9kdW1wX21vZGUoJmMtPm1vZGUpOwo+PiArCWRybU1vZGVT ZXRDcnRjKGRybV9mZCwgYy0+Y3J0YywgLTEsIDAsIDAsIE5VTEwsIDAsIE5VTEwpOwo+PiArCXJl dCA9IGRybU1vZGVTZXRDcnRjKGRybV9mZCwgYy0+Y3J0YywgZmJfaWQsIDAsIDAsCj4+ICsJCQkg ICAgICZjLT5pZCwgMSwgJmMtPm1vZGUpOwo+PiArCWlmIChyZXQpIHsKPj4gKwkJaWd0X3dhcm4o IkZhaWxlZCB0byBzZXQgbW9kZSAoJWR4JWRAJWRIeik6ICVzXG4iLAo+PiArCQkJIHdpZHRoLCBo ZWlnaHQsIGMtPm1vZGUudnJlZnJlc2gsIHN0cmVycm9yKGVycm5vKSk7Cj4+ICsJCWlndF9yZW1v dmVfZmIoZHJtX2ZkLCAmZmJfaW5mbyk7Cj4+ICsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gcmV0 Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgdWludDMyX3QgZmluZF9jcnRjX2Zvcl9jb25uZWN0b3Io ZHJtTW9kZUNvbm5lY3RvciAqYykKPj4gK3sKPj4gKwlkcm1Nb2RlRW5jb2RlciAqZTsKPj4gKwlk cm1Nb2RlQ3J0Y1B0ciBjcnRjX3B0cjsKPj4gKwlpbnQgaTsKPj4gKwo+PiArCWFjdGl2ZV9jcnRj ID0gMDsKPj4gKwo+PiArCWZvciAoaSA9IDA7IGkgPCBjLT5jb3VudF9lbmNvZGVyczsgaSsrKSB7 Cj4+ICsJCWUgPSBkcm1Nb2RlR2V0RW5jb2Rlcihkcm1fZmQsIGMtPmVuY29kZXJzW2ldKTsKPj4g Kwo+PiArCQkgLyogaWYgdGhlcmUgaXMgYW4gYWN0aXZlIGNydGMgdXNlIGl0ICovCj4+ICsJCWlm IChlLT5jcnRjX2lkKSB7Cj4+ICsJCQlhY3RpdmVfY3J0YyA9IGUtPmNydGNfaWQ7Cj4+ICsJCQlk cm1Nb2RlRnJlZUVuY29kZXIoZSk7Cj4+ICsJCQlicmVhazsKPj4gKwkJfQo+PiArCQlkcm1Nb2Rl RnJlZUVuY29kZXIoZSk7Cj4+ICsJfQo+PiArCj4+ICsJLyogbm8gbmVlZCB0byBzZWFyY2ggZnVy dGhlciBpZiBhY3RpdmUgY3J0YyBpcyBmb3VuZCAqLwo+PiArCWlmIChhY3RpdmVfY3J0YykKPj4g KwkJcmV0dXJuIGFjdGl2ZV9jcnRjOwo+PiArCj4+ICsJLyoKPj4gKwkgKiBpZiB0aGVyZSBpcyBu byBhY3RpdmUgY3J0YyBmaW5kIG9uZSBmcm9tIHRoZSBsaXN0IG9mCj4+ICsJICogdW51c2VkIG9u ZXMuIENhbm5vdCB1c2UgYW55dGhpbmcgZnJvbSBwb3NzaWJsZV9jcnRjIG9mCj4+ICsJICogb2Yg ZW5jb2RlciBiZWNhdXNlIGl0IHRoZW4gdHJpZXMgdG8gc3RlYWwgdGhlIGNydGMgb2YgdGhlCj4+ ICsJICogcHJpbWFyeSBkaXNwbGF5LiBEUFUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgc3dpdGNo aW5nIENSVENzCj4+ICsJICogYWNyb3NzIGRpc3BsYXlzIGluIHRoZSBzYW1lIGNvbW1pdC4gSGVu Y2UgbmVlZCB0byBmaW5kIHNvbWUKPj4gKwkgKiBvdGhlciB1bnVzZWQgY3J0Yy4KPj4gKwkgKi8K Pj4gKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5jb3VudF9jcnRjczsgaSsrKSB7Cj4+ICsJ CWNydGNfcHRyID0gZHJtTW9kZUdldENydGMoZHJtX2ZkLCByZXNvdXJjZXMtPmNydGNzW2ldKTsK Pj4gKwkJLyogaWYgYSBjcnRjIHdoaWNoIGlzIHVudXNlZCBpcyBmb3VuZCAsIHVzZSBpdCAqLwo+ PiArCQlpZiAoIWNydGNfcHRyLT5tb2RlX3ZhbGlkKSB7Cj4+ICsJCQlhY3RpdmVfY3J0YyA9IGNy dGNfcHRyLT5jcnRjX2lkOwo+PiArCQkJZHJtTW9kZUZyZWVDcnRjKGNydGNfcHRyKTsKPj4gKwkJ CWJyZWFrOwo+PiArCQl9Cj4+ICsJCWRybU1vZGVGcmVlQ3J0YyhjcnRjX3B0cik7Cj4+ICsJfQo+ PiArCj4+ICsJcmV0dXJuIGFjdGl2ZV9jcnRjOwo+PiArfQo+PiArCj4+ICsvKgo+PiArICogUmUt cHJvYmUgY29ubmVjdG9ycyBhbmQgZG8gYSBtb2Rlc2V0IGJhc2VkIG9uIHRlc3QgcmVxdWVzdCBv cgo+PiArICogaW4gY2FzZSBvZiBhIGhvdHBsdWcgdWV2ZW50Lgo+PiArICoKPj4gKyAqIEBtb2Rl OiBWaWRlbyBtb2RlIHJlcXVlc3RlZCBieSB0aGUgdGVzdAo+PiArICogQGlzX2NvbXBsaWFuY2Vf dGVzdDogMTogSWYgaXQgaXMgYSBjb21wbGlhbmNlIHRlc3QKPj4gKyAqICAgICAgICAgICAgICAg ICAgICAgIDA6IElmIGl0IGlzIGEgaG90cGx1ZyBldmVudAo+PiArICoKPj4gKyAqIFJldHVybnM6 Cj4+ICsgKiAwOiBPbiBTdWNjZXNzCj4+ICsgKiAtMTogT24gZmFpbHVyZQo+PiArICovCj4+ICtp bnQgdXBkYXRlX2Rpc3BsYXkoaW50IG1vZGUsIGJvb2wgaXNfY29tcGxpYW5jZV90ZXN0KQo+PiAr ewo+PiArCXN0cnVjdCBjb25uZWN0b3IgKmNvbm5lY3RvcnMsICpjb25uOwo+PiArCWludCBjbnQs IHJldCA9IDA7Cj4+ICsJYm9vbCBzZXRfbW9kZTsKPj4gKwkvL2ludCBjcnRjOwo+PiArCj4+ICsJ cmVzb3VyY2VzID0gZHJtTW9kZUdldFJlc291cmNlcyhkcm1fZmQpOwo+PiArCWlmICghcmVzb3Vy Y2VzKSB7Cj4+ICsJCWlndF93YXJuKCJkcm1Nb2RlR2V0UmVzb3VyY2VzIGZhaWxlZDogJXNcbiIs IHN0cmVycm9yKGVycm5vKSk7Cj4+ICsJCXJldHVybiAtMTsKPj4gKwl9Cj4+ICsKPj4gKwljb25u ZWN0b3JzID0gY2FsbG9jKHJlc291cmNlcy0+Y291bnRfY29ubmVjdG9ycywKPj4gKwkJCSAgICBz aXplb2Yoc3RydWN0IGNvbm5lY3RvcikpOwo+PiArCWlmICghY29ubmVjdG9ycykKPj4gKwkJcmV0 dXJuIC0xOwo+PiArCj4+ICsJLyogRmluZCBhbnkgY29ubmVjdGVkIGRpc3BsYXlzICovCj4+ICsJ Zm9yIChjbnQgPSAwOyBjbnQgPCByZXNvdXJjZXMtPmNvdW50X2Nvbm5lY3RvcnM7IGNudCsrKSB7 Cj4+ICsJCWRybU1vZGVDb25uZWN0b3IgKmM7Cj4+ICsKPj4gKwkJY29ubiA9ICZjb25uZWN0b3Jz W2NudF07Cj4+ICsJCWNvbm4tPmlkID0gcmVzb3VyY2VzLT5jb25uZWN0b3JzW2NudF07Cj4+ICsJ CWMgPSBkcm1Nb2RlR2V0Q29ubmVjdG9yKGRybV9mZCwgY29ubi0+aWQpOwo+PiArCQlpZiAoYy0+ Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0ICYmCj4+ICsJ CQljLT5jb25uZWN0aW9uID09IERSTV9NT0RFX0NPTk5FQ1RFRCkgewo+PiArCQkJdGVzdF9jb25u ZWN0b3JfaWQgPSBjLT5jb25uZWN0b3JfaWQ7Cj4+ICsJCQljb25uLT5jb25uZWN0b3IgPSBjOwo+ PiArCQkJY29ubi0+Y3J0YyA9IGZpbmRfY3J0Y19mb3JfY29ubmVjdG9yKGMpOwo+PiArCQkJdGVz dF9jcnRjID0gY29ubi0+Y3J0YzsKPj4gKwkJCXNldF9tb2RlID0gdHJ1ZTsKPj4gKwkJCWJyZWFr Owo+PiArCQl9IGVsc2UgaWYgKGMtPmNvbm5lY3Rvcl9pZCA9PSB0ZXN0X2Nvbm5lY3Rvcl9pZCAm Jgo+PiArCQkJICAgYy0+Y29ubmVjdGlvbiA9PSBEUk1fTU9ERV9ESVNDT05ORUNURUQpIHsKPj4g KwkJCWNvbm4tPmNvbm5lY3RvciA9IGM7Cj4+ICsJCQljb25uLT5jcnRjID0gdGVzdF9jcnRjOwo+ PiArCQkJc2V0X21vZGUgPSBmYWxzZTsKPj4gKwkJCWJyZWFrOwo+PiArCQl9Cj4+ICsJfQo+PiAr Cj4+ICsJaWYgKGNudCA9PSByZXNvdXJjZXMtPmNvdW50X2Nvbm5lY3RvcnMpIHsKPj4gKwkJcmV0 ID0gLTE7Cj4+ICsJCWdvdG8gZXJyOwo+PiArCX0KPj4gKwo+PiArCWlmIChpc19jb21wbGlhbmNl X3Rlc3QpIHsKPj4gKwkJc2V0X3Rlc3RfbW9kZShjb25uKTsKPj4gKwkJcmV0ID0gc2V0X3ZpZGVv KE1TTV9NT0RFX05PTkUsIGNvbm4pOwo+PiArCQlyZXQgPSBzZXRfdmlkZW8obW9kZSwgY29ubik7 Cj4+ICsKPj4gKwl9IGVsc2UKPj4gKwkJcmV0ID0gc2V0X2RlZmF1bHRfbW9kZShjb25uLCBzZXRf bW9kZSk7Cj4+ICsKPj4gKyBlcnI6Cj4+ICsJZHJtTW9kZUZyZWVDb25uZWN0b3IoY29ubi0+Y29u bmVjdG9yKTsKPj4gKwkvKiBFcnJvciBjb25kaXRpb24gaWYgbm8gY29ubmVjdGVkIGRpc3BsYXlz ICovCj4+ICsJZnJlZShjb25uZWN0b3JzKTsKPj4gKwlkcm1Nb2RlRnJlZVJlc291cmNlcyhyZXNv dXJjZXMpOwo+PiArCXJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBjaGFy IG9wdHN0cltdID0gImhpIjsKPj4gKwo+PiArc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygobm9y ZXR1cm4pKSB1c2FnZShjaGFyICpuYW1lLCBjaGFyIG9wdCkKPj4gK3sKPj4gKwlpZ3RfaW5mbygi dXNhZ2U6ICVzIFstaGldXG4iLCBuYW1lKTsKPj4gKwlpZ3RfaW5mbygiXHQtaVx0ZHVtcCBpbmZv XG4iKTsKPj4gKwlpZ3RfaW5mbygiXHREZWZhdWx0IGlzIHRvIHJlc3BvbmQgdG8gUWQ5ODAgdGVz dHNcbiIpOwo+PiArCWV4aXQoKG9wdCAhPSAnaCcpID8gLTEgOiAwKTsKPj4gK30KPj4gKwo+PiAr c3RhdGljIHZvaWQgY2xlYW51cF9kZWJ1Z2ZzKHZvaWQpCj4+ICt7Cj4+ICsJZmNsb3NlKHRlc3Rf YWN0aXZlX2ZwKTsKPj4gKwlmY2xvc2UodGVzdF9kYXRhX2ZwKTsKPj4gKwlmY2xvc2UodGVzdF90 eXBlX2ZwKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygobm9yZXR1 cm4pKSBjbGVhbnVwX2FuZF9leGl0KGludCByZXQpCj4+ICt7Cj4+ICsJY2xlYW51cF9kZWJ1Z2Zz KCk7Cj4+ICsJY2xvc2UoZHJtX2ZkKTsKPj4gKwlpZ3RfaW5mbygiQ29tcGxpYW5jZSB0ZXN0aW5n IGFwcGxpY2F0aW9uIGV4aXRpbmdcbiIpOwo+PiArCWV4aXQocmV0KTsKPj4gK30KPj4gKwo+PiAr c3RhdGljIHZvaWQgY2xlYW51cF90ZXN0KHZvaWQpCj4+ICt7Cj4+ICsJdmlkZW9fcGF0dGVybl9m bGFnID0gZmFsc2U7Cj4+ICsJaGRpc3BsYXkgPSAwOwo+PiArCXZkaXNwbGF5ID0gMDsKPj4gKwli aXRkZXB0aCA9IDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHJlYWRfdGVzdF9yZXF1ZXN0 KHZvaWQpCj4+ICt7Cj4+ICsJdW5zaWduZWQgbG9uZyB0ZXN0X3R5cGU7Cj4+ICsKPj4gKwl0ZXN0 X3R5cGUgPSBnZXRfdGVzdF90eXBlKCk7Cj4+ICsKPj4gKwlwcm9jZXNzX3Rlc3RfcmVxdWVzdCh0 ZXN0X3R5cGUpOwo+PiArCWNsZWFudXBfdGVzdCgpOwo+PiArCWNsZWFyX3Rlc3RfYWN0aXZlKCk7 Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBnYm9vbGVhbiB0ZXN0X2hhbmRsZXIoR0lPQ2hhbm5lbCAq c291cmNlLCBHSU9Db25kaXRpb24gCj4+IGNvbmRpdGlvbiwKPj4gKwkJCSAgICAgZ3BvaW50ZXIg ZGF0YSkKPj4gK3sKPj4gKwl1bnNpZ25lZCBsb25nIHRlc3RfYWN0aXZlOwo+PiArCWludCByZXQ7 Cj4+ICsKPj4gKwlyZXdpbmQodGVzdF9hY3RpdmVfZnApOwo+PiArCj4+ICsJcmV0ID0gZnNjYW5m KHRlc3RfYWN0aXZlX2ZwLCAiJWx4IiwgJnRlc3RfYWN0aXZlKTsKPj4gKwlpZiAocmV0IDwgMSkK Pj4gKwkJcmV0dXJuIEZBTFNFOwo+PiArCj4+ICsJaWYgKHRlc3RfYWN0aXZlKQo+PiArCQlyZWFk X3Rlc3RfcmVxdWVzdCgpOwo+PiArCj4+ICsJcmV0dXJuIFRSVUU7Cj4+ICt9Cj4+ICsKPj4gK3N0 YXRpYyBnYm9vbGVhbiBpbnB1dF9ldmVudChHSU9DaGFubmVsICpzb3VyY2UsIEdJT0NvbmRpdGlv biAKPj4gY29uZGl0aW9uLAo+PiArCQkJCWdwb2ludGVyIGRhdGEpCj4+ICt7Cj4+ICsJZ2NoYXIg YnVmWzJdOwo+PiArCWdzaXplIGNvdW50Owo+PiArCj4+ICsJY291bnQgPSByZWFkKGdfaW9fY2hh bm5lbF91bml4X2dldF9mZChzb3VyY2UpLCBidWYsIHNpemVvZihidWYpKTsKPj4gKwlpZiAoYnVm WzBdID09ICdxJyAmJiAoY291bnQgPT0gMSB8fCBidWZbMV0gPT0gJ1xuJykpCj4+ICsJCWNsZWFu dXBfYW5kX2V4aXQoMCk7Cj4+ICsKPj4gKwlyZXR1cm4gVFJVRTsKPj4gK30KPj4gKwo+PiAraW50 IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQo+PiArewo+PiArCWludCBjOwo+PiArCWludCBy ZXQgPSAwOwo+PiArCUdJT0NoYW5uZWwgKnN0ZGluY2hhbm5lbCwgKnRlc3RhY3RpdmVfY2hhbm5l bDsKPj4gKwlHTWFpbkxvb3AgKm1haW5sb29wOwo+PiArCWJvb2wgb3B0X2R1bXBfaW5mbyA9IGZh bHNlOwo+PiArCXN0cnVjdCBvcHRpb24gbG9uZ19vcHRzW10gPSB7Cj4+ICsJCXsiaGVscC1kZXNj cmlwdGlvbiIsIDAsIDAsIEhFTFBfREVTQ1JJUFRJT059LAo+PiArCQl7ImhlbHAiLCAwLCAwLCAn aCd9LAo+PiArCX07Cj4+ICsKPj4gKwllbnRlcl9leGVjX3BhdGgoYXJndik7Cj4+ICsKPj4gKwl3 aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBvcHRzdHIsIGxvbmdfb3B0cywgTlVM TCkpICE9IC0xKSAKPj4gewo+PiArCQlzd2l0Y2ggKGMpIHsKPj4gKwkJY2FzZSAnaSc6Cj4+ICsJ CQlvcHRfZHVtcF9pbmZvID0gdHJ1ZTsKPj4gKwkJCWJyZWFrOwo+PiArCQljYXNlIEhFTFBfREVT Q1JJUFRJT046Cj4+ICsJCQlpZ3RfaW5mbygiRFAgQ29tcGxpYW5jZSBUZXN0IFN1aXRlIHVzaW5n IFFkIDk4MFxuIik7Cj4+ICsJCQlpZ3RfaW5mbygiVmlkZW8gUGF0dGVybiBHZW5lcmF0aW9uIHRl c3RzXG4iKTsKPj4gKwkJCWV4aXQoMCk7Cj4+ICsJCQlicmVhazsKPj4gKwkJZGVmYXVsdDoKPj4g KwkJCS8qIGZhbGwgdGhyb3VnaCAqLwo+PiArCQljYXNlICdoJzoKPj4gKwkJCXVzYWdlKGFyZ3Zb MF0sIGMpOwo+PiArCQkJYnJlYWs7Cj4+ICsJCX0KPj4gKwl9Cj4+ICsKPj4gKwlzZXRfdGVybWlv X21vZGUoKTsKPj4gKwo+PiArCWRybV9mZCA9IGRybV9vcGVuX2RyaXZlcihEUklWRVJfQU5ZKTsK Pj4gKwo+PiArCWttc3Rlc3Rfc2V0X3Z0X2dyYXBoaWNzX21vZGUoKTsKPj4gKwlzZXR1cF9kZWJ1 Z2ZzX2ZpbGVzKCk7Cj4+ICsJY2xlYW51cF90ZXN0KCk7Cj4+ICsJaWYgKG9wdF9kdW1wX2luZm8p IHsKPj4gKwkJZHVtcF9pbmZvKCk7Cj4+ICsJCWdvdG8gb3V0X2Nsb3NlOwo+PiArCX0KPj4gKwo+ PiArCS8qIEdldCB0aGUgRFAgY29ubmVjdG9yIElEIGFuZCBDUlRDICovCj4+ICsJaWYgKHVwZGF0 ZV9kaXNwbGF5KDAsIGZhbHNlKSkgewo+PiArCQlpZ3Rfd2FybigiRmFpbGVkIHRvIHNldCBkZWZh dWx0IG1vZGVcbiIpOwo+PiArCQlyZXQgPSAtMTsKPj4gKwkJZ290byBvdXRfY2xvc2U7Cj4+ICsJ fQo+PiArCj4+ICsJbWFpbmxvb3AgPSBnX21haW5fbG9vcF9uZXcoTlVMTCwgRkFMU0UpOwo+PiAr CWlmICghbWFpbmxvb3ApIHsKPj4gKwkJaWd0X3dhcm4oIkZhaWxlZCB0byBjcmVhdGUgR01haW5M b29wXG4iKTsKPj4gKwkJcmV0ID0gLTE7Cj4+ICsJCWdvdG8gb3V0X2Nsb3NlOwo+PiArCX0KPj4g Kwo+PiArCWlmICghaWd0X2RwX2NvbXBsaWFuY2Vfc2V0dXBfaG90cGx1ZygpKSB7Cj4+ICsJCWln dF93YXJuKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBob3RwbHVnIHN1cHBvcnRcbiIpOwo+PiArCQln b3RvIG91dF9tYWlubG9vcDsKPj4gKwl9Cj4+ICsKPj4gKwl0ZXN0YWN0aXZlX2NoYW5uZWwgPSBn X2lvX2NoYW5uZWxfdW5peF9uZXcoZmlsZW5vKHRlc3RfYWN0aXZlX2ZwKSk7Cj4+ICsJaWYgKCF0 ZXN0YWN0aXZlX2NoYW5uZWwpIHsKPj4gKwkJaWd0X3dhcm4oIkZhaWxlZCB0byBjcmVhdGUgdGVz dF9hY3RpdmUgR0lPQ2hhbm5lbFxuIik7Cj4+ICsJCWdvdG8gb3V0X2Nsb3NlOwo+PiArCX0KPj4g Kwo+PiArCXJldCA9IGdfaW9fYWRkX3dhdGNoKHRlc3RhY3RpdmVfY2hhbm5lbCwgR19JT19JTiB8 IEdfSU9fRVJSLAo+PiArCQkJICAgICB0ZXN0X2hhbmRsZXIsIE5VTEwpOwo+PiArCWlmIChyZXQg PCAwKSB7Cj4+ICsJCWlndF93YXJuKCJGYWlsZWQgdG8gYWRkIHdhdGNoIG9uIHVkZXYgR0lPQ2hh bm5lbFxuIik7Cj4+ICsJCQlnb3RvIG91dF9jbG9zZTsKPj4gKwl9Cj4+ICsKPj4gKwlzdGRpbmNo YW5uZWwgPSBnX2lvX2NoYW5uZWxfdW5peF9uZXcoMCk7Cj4+ICsJaWYgKCFzdGRpbmNoYW5uZWwp IHsKPj4gKwkJaWd0X3dhcm4oIkZhaWxlZCB0byBjcmVhdGUgc3RkaW4gR0lPQ2hhbm5lbFxuIik7 Cj4+ICsJCWdvdG8gb3V0X2hvdHBsdWc7Cj4+ICsJfQo+PiArCj4+ICsJcmV0ID0gZ19pb19hZGRf d2F0Y2goc3RkaW5jaGFubmVsLCBHX0lPX0lOIHwgR19JT19FUlIsIGlucHV0X2V2ZW50LAo+PiAr CQkJICAgICBOVUxMKTsKPj4gKwlpZiAocmV0IDwgMCkgewo+PiArCQlpZ3Rfd2FybigiRmFpbGVk IHRvIGFkZCB3YXRjaCBvbiBzdGRpbiBHSU9DaGFubmVsXG4iKTsKPj4gKwkJZ290byBvdXRfc3Rk aW87Cj4+ICsJfQo+PiArCj4+ICsJcmV0ID0gMDsKPj4gKwo+PiArCWlndF9pbmZvKCIqKioqKioq KioqKioqRFAgQ29tcGxpYW5jZSBUZXN0aW5nIHVzaW5nIFFkYm94IAo+PiA5ODAqKioqKioqKioq KioqXG4iKTsKPj4gKwlpZ3RfaW5mbygiV2FpdGluZyBmb3IgdGVzdCByZXF1ZXN0Li4uLi4uXG4i KTsKPj4gKwo+PiArCWdfbWFpbl9sb29wX3J1bihtYWlubG9vcCk7Cj4+ICsKPj4gK291dF9zdGRp bzoKPj4gKwlnX2lvX2NoYW5uZWxfc2h1dGRvd24oc3RkaW5jaGFubmVsLCBUUlVFLCBOVUxMKTsK Pj4gK291dF9ob3RwbHVnOgo+PiArCWlndF9kcF9jb21wbGlhbmNlX2NsZWFudXBfaG90cGx1Zygp Owo+PiArb3V0X21haW5sb29wOgo+PiArCWdfbWFpbl9sb29wX3VucmVmKG1haW5sb29wKTsKPj4g K291dF9jbG9zZToKPj4gKwljbGVhbnVwX2RlYnVnZnMoKTsKPj4gKwljbG9zZShkcm1fZmQpOwo+ PiArCj4+ICsJaWd0X2Fzc2VydF9lcShyZXQsIDApOwo+PiArCj4+ICsJaWd0X2luZm8oIkNvbXBs aWFuY2UgdGVzdGluZyBhcHBsaWNhdGlvbiBleGl0aW5nXG4iKTsKPj4gKwlpZ3RfZXhpdCgpOwo+ PiArfQo+PiAtLQo+PiBUaGUgUXVhbGNvbW0gSW5ub3ZhdGlvbiBDZW50ZXIsIEluYy4gaXMgYSBt ZW1iZXIgb2YgdGhlIENvZGUgQXVyb3JhIAo+PiBGb3J1bSwKPj4gYSBMaW51eCBGb3VuZGF0aW9u IENvbGxhYm9yYXRpdmUgUHJvamVjdAo+PiAKPj4gX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KPj4gaWd0LWRldiBtYWlsaW5nIGxpc3QKPj4gaWd0LWRldkBs aXN0cy5mcmVlZGVza3RvcC5vcmcKPj4gaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9pZ3QtZGV2Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmlndC1kZXYgbWFpbGluZyBsaXN0CmlndC1kZXZAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaWd0 LWRldgo=