From mboxrd@z Thu Jan 1 00:00:00 1970 From: Petri Latvala Subject: Re: [PATCH i-g-t v4] tools: Add intel_dp_compliance for DisplayPort 1.2 compliance automation Date: Tue, 24 Jan 2017 11:49:48 +0200 Message-ID: <20170124094948.okps5hqkexwaqr6d@platvala-desk.ger.corp.intel.com> References: <1485226133-16233-1-git-send-email-manasi.d.navare@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id 382756E75D for ; Tue, 24 Jan 2017 09:49:52 +0000 (UTC) Content-Disposition: inline In-Reply-To: <1485226133-16233-1-git-send-email-manasi.d.navare@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Manasi Navare Cc: intel-gfx@lists.freedesktop.org, Dhinakaran Pandiyan , Daniel Vetter List-Id: intel-gfx@lists.freedesktop.org Ckp1c3Qgb25lIG1vcmUgbml0cGljayAoaW4gdHdvIHBhcnRzKSBiZWxvdy4gV2l0aCB0aGF0LCB5 b3UgY2FuCmNvbnNpZGVyIHRoaXMgbm93IHRvIGJlCgpSZXZpZXdlZC1ieTogUGV0cmkgTGF0dmFs YSA8cGV0cmkubGF0dmFsYUBpbnRlbC5jb20+CgpUaGlzIHBhdGNoIGNhbiBiZSBwdXNoZWQgd2hl biB0aGUga2VybmVsIGNoYW5nZXMgdGhhdCBjb250YWluICJtdXN0IGJlCmtlcHQgaW4gc3luYyIg bnVtYmVycyBpbiBpbnRlbF9kcF9jb21wbGlhbmNlLmMgaGF2ZSBsYW5kZWQgKGFuZCBoYXZlCmJl ZW4gZG91YmxlLWNoZWNrZWQgdG8gbWF0Y2gpLgoKCi0tClBldHJpIExhdHZhbGEKCgpPbiBNb24s IEphbiAyMywgMjAxNyBhdCAwNjo0ODo1M1BNIC0wODAwLCBNYW5hc2kgTmF2YXJlIHdyb3RlOgo+ IEZyb206ICJOYXZhcmUsIE1hbmFzaSBEIiA8bWFuYXNpLmQubmF2YXJlQGludGVsLmNvbT4KPiAK PiBUaGlzIGlzIHRoZSB1c2Vyc3BhY2UgY29tcG9uZW50IG9mIHRoZSBEaXNwbGF5cG9ydCBDb21w bGlhbmNlCj4gdGVzdGluZyBzb2Z0d2FyZSByZXF1aXJlZCBmb3IgY29tcGxpYW5jZSB0ZXN0aW5n IG9mIHRoZSBJOTE1Cj4gRGlzcGxheSBQb3J0IGRyaXZlci4gVGhpcyBtdXN0IGJlIHJ1bm5pbmcg aW4gb3JkZXIgdG8gc3VjY2Vzc2Z1bGx5Cj4gY29tcGxldGUgRGlzcGxheSBQb3J0IGNvbXBsaWFu Y2UgdGVzdGluZy4gVGhpcyBhcHAgYW5kIHRoZSBrZXJuZWwKPiBjb2RlIHRoYXQgYWNjb21wYW5p ZXMgaXQgaGFzIGJlZW4gd3JpdHRlbiB0byBzYXRpZnkgdGhlIHJlcXVpcmVtZW50cwo+IG9mIHRo ZSBEaXNwbGF5cG9ydCBMaW5rIENUUyAxLjIgcmV2MS4xIHNwZWNpZmljYXRpb24gZnJvbSBWRVNB Lgo+IE5vdGUgdGhhdCB0aGlzIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBvcnQgZURQIGNvbXBs aWFuY2UgdGVzdGluZy4KPiBUaGlzIHV0aWxpdHkgaGFzIGFuIGF1dG9tYXRpb24gc3VwcG9ydCBm b3IgdGhlIExpbmsgdHJhaW5pbmcgdGVzdHMKPiAoNC4zLjEuMS4gLSA0LjMuMi4zKSwgRURJRCB0 ZXN0cyAoNC4yLjIuMwo+IC0gNC4yLjIuNikgYW5kIFZpZGVvIFBhdHRlcm4gZ2VuZXJhdGlvbiB0 ZXN0cyAoNC4zLjMuMSkgZnJvbSBDVFMKPiBzcGVjaWZpY2F0aW9uIDEuMiBSZXYgMS4xLgo+IAo+ IFRoaXMgdG9vbCBoYXMgdGhlIHN1cHBvcnQgZm9yIHJlc3BvbmRpbmcgdG8gdGhlIGhvdHBsdWcg dWV2ZW50cwo+IHNlbnQgYnkgY29tcGxpYW5jZSB0ZXN0dGluZyB1bml0IGFmdGVyIGVhY2ggdGVz dC4KPiAKPiBUaGUgTGludXggRFVUIHJ1bm5pbmcgdGhpcyB1dGlsaXR5IG11c3QgYmUgaW4gdGV4 dCAoY29uc29sZSkgbW9kZQo+IGFuZCBjYW5ub3QgaGF2ZSBhbnkgb3RoZXIgZGlzcGxheSBtYW5h Z2VyIHJ1bm5pbmcuIFNpbmNlIHRoaXMgdXNlcwo+IHN5c2ZzIG5vZGVzIGZvciBrZXJuZWwgaW50 ZXJhY3Rpb24sIHRoaXMgdXRpbGl0eSBzaG91bGQgYmUgcnVuIGFzCj4gUm9vdC4gT25jZSB0aGlz IHVzZXIgYXBwbGljYXRpb24gaXMgdXAgYW5kIHJ1bm5pbmcsIHdhaXRpbmcgZm9yCj4gdGVzdCBy ZXF1ZXN0cywgdGhlIHRlc3QgYXBwbGlhbmNlIHNvZnR3YXJlIG9uIHRoZSB3aW5kb3dzIGhvc3QK PiBjYW4gbm93IGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGUgY29tcGxpYW5jZSB0ZXN0cy4KPiAKPiBU aGlzIGFwcCBpcyBiYXNlZCBvbiBzb21lIHByaW9yIHdvcmsgZG9uZSBpbiBBcHJpbCAyMDE1IChi eQo+IFRvZGQgUHJldml0ZSA8dHByZXZpdGVAZ21haWwuY29tPikKPiAKPiB2MjoKPiAqIEFkZCBt b2RlIHVuc2V0IG9uIGhvdHBsdWcgdWV2ZW50IG9uIGRpc2Nvbm5lY3QgKE1hbmFzaSBOYXZhcmUp Cj4gCj4gdjM6Cj4gTWFkZSBjYXBpdGFsaXphdGlvbiBjb25zaXN0ZW50Cj4gUmVkdWNlZCBsaW5l IGxlbmd0aHMKPiBBZGRlZCByZXR1cm4gdmFsdWUgY2hlY2tzCj4gQ2hhbmdlZCBob3cgR0xpYiBp cyBsaW5rZWQKPiBGaXhlZCBidWlsZCB3YXJuaW5ncwo+IAo+IHY0Ogo+ICogQ29uZGl0aW9uYWxs eSBidWlsZCB0aGlzIHRvb2wgaWYgVURFViBpcyBwcmVzZW50IChQZXRyaSBMYXR2YWxhKQo+ICog aWd0X3dhcm4gYW5kIGluZm8gY2xlYW51cCB0byByZW1vdmUgXHIKPiAqIEFkZCBpbnRlbF9kcF9j b21wbGlhbmNlIHRvIHRvb2xzLy5naXRpZ25vcmUKPiAqIENoYW5nZSB0aGUgeWVhciBpbiBjb3B5 cmlnaHQgc3RhdGVtZW50cyB0byBjdXJyZW50IChQZXRyaSBMYXR2YWxhKQo+IAo+IENjOiBQZXRy aSBMYXR2YWxhIDxwZXRyaS5sYXR2YWxhQGludGVsLmNvbT4KPiBDYzogTWFyaXVzIFZsYWQgPG1h cml1cy5jLnZsYWRAaW50ZWwuY29tPgo+IENjOiBEYW5pZWwgVmV0dGVyIDxkYW5pZWwudmV0dGVy QGZmd2xsLmNoPgo+IFNpZ25lZC1vZmYtYnk6IE1hbmFzaSBOYXZhcmUgPG1hbmFzaS5kLm5hdmFy ZUBpbnRlbC5jb20+Cj4gU2lnbmVkLW9mZi1ieTogRGhpbmFrYXJhbiBQYW5kaXlhbiA8ZGhpbmFr YXJhbi5wYW5kaXlhbkBpbnRlbC5jb20+Cj4gLS0tCj4gIGNvbmZpZ3VyZS5hYyAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgMSArCj4gIHRvb2xzLy5naXRpZ25vcmUgICAgICAgICAgICAgICAg ICAgIHwgICAgMSArCj4gIHRvb2xzL01ha2VmaWxlLmFtICAgICAgICAgICAgICAgICAgIHwgICAg NiArLQo+ICB0b29scy9NYWtlZmlsZS5zb3VyY2VzICAgICAgICAgICAgICB8ICAgIDYgKwo+ICB0 b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmMgICAgICAgICB8IDExMDQgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysKPiAgdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZS5oICAgICAg ICAgfCAgIDM1ICsrCj4gIHRvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2VfaG90cGx1Zy5jIHwgIDEy NCArKysrCj4gIDcgZmlsZXMgY2hhbmdlZCwgMTI3NiBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9u KC0pCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmMKPiAg Y3JlYXRlIG1vZGUgMTAwNjQ0IHRvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2UuaAo+ICBjcmVhdGUg bW9kZSAxMDA2NDQgdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZV9ob3RwbHVnLmMKPiAKPiBkaWZm IC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCj4gaW5kZXggNDExYmZhYi4uZDI2 ODE0MCAxMDA2NDQKPiAtLS0gYS9jb25maWd1cmUuYWMKPiArKysgYi9jb25maWd1cmUuYWMKPiBA QCAtMTY0LDYgKzE2NCw3IEBAIFBLR19DSEVDS19NT0RVTEVTKFhSQU5EUiwgeHJhbmRyID49IDEu MywgQUNfREVGSU5FKEhBVkVfWFJBTkRSLCAxLCBbSGF2ZSBsaWJYcmFuCj4gICMgZm9yIHRlc3Rk aXNwbGF5Cj4gIFBLR19DSEVDS19NT0RVTEVTKENBSVJPLCBbY2Fpcm8gPj0gMS4xMi4wXSkKPiAg UEtHX0NIRUNLX01PRFVMRVMoTElCVURFViwgW2xpYnVkZXZdLCBbdWRldj15ZXNdLCBbdWRldj1u b10pCj4gK0FNX0NPTkRJVElPTkFMKEhBVkVfVURFViwgW3Rlc3QgIngkdWRldiIgPSB4eWVzXSkK PiAgaWYgdGVzdCB4IiR1ZGV2IiA9IHh5ZXM7IHRoZW4KPiAgCUFDX0RFRklORShIQVZFX1VERVYs MSxbRW5hYmxlIHVkZXYtYmFzZWQgbW9uaXRvciBob3RwbHVnIGRldGVjdGlvbl0pCj4gIGZpCj4g ZGlmZiAtLWdpdCBhL3Rvb2xzLy5naXRpZ25vcmUgYi90b29scy8uZ2l0aWdub3JlCj4gaW5kZXgg MTM4MjVhMy4uOWJiODg5ZiAxMDA2NDQKPiAtLS0gYS90b29scy8uZ2l0aWdub3JlCj4gKysrIGIv dG9vbHMvLmdpdGlnbm9yZQo+IEBAIC04LDYgKzgsNyBAQCBpbnRlbF9iaW9zX2R1bXBlcgo+ICBp bnRlbF9iaW9zX3JlYWRlcgo+ICBpbnRlbF9kaXNwbGF5X2NyYwo+ICBpbnRlbF9kaXNwbGF5X3Bv bGxlcgo+ICtpbnRlbF9kcF9jb21wbGlhbmNlCj4gIGludGVsX2R1bXBfZGVjb2RlCj4gIGludGVs X2Vycm9yX2RlY29kZQo+ICBpbnRlbF9maXJtd2FyZV9kZWNvZGUKPiBkaWZmIC0tZ2l0IGEvdG9v bHMvTWFrZWZpbGUuYW0gYi90b29scy9NYWtlZmlsZS5hbQo+IGluZGV4IDE4Zjg2ZjYuLjM2Mzk0 NWQgMTAwNjQ0Cj4gLS0tIGEvdG9vbHMvTWFrZWZpbGUuYW0KPiArKysgYi90b29scy9NYWtlZmls ZS5hbQo+IEBAIC03LDYgKzcsMTEgQEAgYmluX1BST0dSQU1TICs9ICQoTElCRFJNX0lOVEVMX0JJ TikKPiAgaW50ZWxfZXJyb3JfZGVjb2RlX0xERkxBR1MgPSAtbHoKPiAgZW5kaWYKPiAgCj4gK2lm IEhBVkVfVURFVgo+ICtiaW5fUFJPR1JBTVMgKz0gaW50ZWxfZHBfY29tcGxpYW5jZQo+ICtpbnRl bF9kcF9jb21wbGlhbmNlX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJpbnRlbF90b29s cy5sYSAkKEdMSUJfTElCUykKPiArZW5kaWYKPiArCj4gIFNVQkRJUlMgPSBudWxsX3N0YXRlX2dl biByZWdpc3RlcnMKPiAgCj4gIEFNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpIC1JJCh0b3Bf c3JjZGlyKS9saWIKPiBAQCAtMTYsNyArMjEsNiBAQCBBTV9DRkxBR1MgPSAkKERFQlVHX0NGTEFH UykgJChEUk1fQ0ZMQUdTKSAkKFBDSUFDQ0VTU19DRkxBR1MpICQoQ1dBUk5GTEFHUykgXAo+ICBM REFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvbGliaW50ZWxfdG9vbHMubGEKPiAgQU1fTERGTEFH UyA9IC1XbCwtLWFzLW5lZWRlZAo+ICAKPiAtCj4gICMgYXViZHVtcGVyCj4gIAo+ICBtb2R1bGVf TFRMSUJSQVJJRVMgPSBpbnRlbF9hdWJkdW1wLmxhCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL01ha2Vm aWxlLnNvdXJjZXMgYi90b29scy9NYWtlZmlsZS5zb3VyY2VzCj4gaW5kZXggZTI0NTFlYS4uMzRj N2E3NCAxMDA2NDQKPiAtLS0gYS90b29scy9NYWtlZmlsZS5zb3VyY2VzCj4gKysrIGIvdG9vbHMv TWFrZWZpbGUuc291cmNlcwo+IEBAIC01NiwzICs1Niw5IEBAIGludGVsX2wzX3Bhcml0eV9TT1VS Q0VTID0JXAo+ICAJaW50ZWxfbDNfcGFyaXR5LmgJXAo+ICAJaW50ZWxfbDNfdWRldl9saXN0ZW5l ci5jCj4gIAo+ICtpbnRlbF9kcF9jb21wbGlhbmNlX1NPVVJDRVMgPSBcCj4gKyAgICAgICAgaW50 ZWxfZHBfY29tcGxpYW5jZS5jIFwKPiArICAgICAgICBpbnRlbF9kcF9jb21wbGlhbmNlLmggXAo+ ICsgICAgICAgIGludGVsX2RwX2NvbXBsaWFuY2VfaG90cGx1Zy5jIFwKPiArICAgICAgICAkKE5V TEwpCj4gKwo+IGRpZmYgLS1naXQgYS90b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmMgYi90b29s cy9pbnRlbF9kcF9jb21wbGlhbmNlLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAw MDAwMDAuLmIyNWZlODYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvdG9vbHMvaW50ZWxfZHBfY29t cGxpYW5jZS5jCj4gQEAgLTAsMCArMSwxMTA0IEBACj4gKy8qCj4gKyAqIENvcHlyaWdodCDCqSAy MDE3IEludGVsIENvcnBvcmF0aW9uCj4gKyAqCj4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdy YW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCj4gKyAqIGNv cHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0 aGUgIlNvZnR3YXJlIiksCj4gKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVz dHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KPiArICogdGhlIHJpZ2h0cyB0 byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vu c2UsCj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJt aXQgcGVyc29ucyB0byB3aG9tIHRoZQo+ICsgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8g c28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+ICsgKgo+ICsgKiBUaGUg YWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVk aW5nIHRoZSBuZXh0Cj4gKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNv cGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKPiArICogU29mdHdhcmUuCj4gKyAq Cj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZ IE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9U IExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+ICsgKiBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8g RVZFTlQgU0hBTEwKPiArICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElB QkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiArICogTElBQklMSVRZLCBXSEVU SEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcK PiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1Ig VEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwo+ICsgKiBJTiBUSEUgU09GVFdBUkUuCj4gKyAqCj4g KyAqIERpc3BsYXlwb3J0IENvbXBsaWFuY2UgVGVzdGluZyBBcHBsaWNhdGlvbgo+ICsgKgo+ICsg KiBUaGlzIGlzIHRoZSB1c2Vyc3BhY2UgY29tcG9uZW50IG9mIHRoZSBEaXNwbGF5cG9ydCBDb21w bGlhbmNlIHRlc3RpbmcKPiArICogc29mdHdhcmUgcmVxdWlyZWQgZm9yIGNvbXBsaWFuY2UgdGVz dGluZyBvZiB0aGUgSTkxNSBEaXNwbGF5IFBvcnQgZHJpdmVyLgo+ICsgKiBUaGlzIG11c3QgYmUg cnVubmluZyBpbiBvcmRlciB0byBzdWNjZXNzZnVsbHkgY29tcGxldGUgRGlzcGxheSBQb3J0Cj4g KyAqIGNvbXBsaWFuY2UgdGVzdGluZy4gVGhpcyBhcHAgYW5kIHRoZSBrZXJuZWwgY29kZSB0aGF0 IGFjY29tcGFuaWVzIGl0IGhhcyBiZWVuCj4gKyAqIHdyaXR0ZW4gdG8gc2F0aWZ5IHRoZSByZXF1 aXJlbWVudHMgb2YgdGhlIERpc3BsYXlwb3J0IExpbmsgQ1RTIDEuMiByZXYxLjEKPiArICogc3Bl Y2lmaWNhdGlvbiBmcm9tIFZFU0EuIE5vdGUgdGhhdCB0aGlzIGFwcGxpY2F0aW9uIGRvZXMgbm90 IHN1cHBvcnQgZURQCj4gKyAqIGNvbXBsaWFuY2UgdGVzdGluZy4KPiArICoKPiArICogQ29tcGxp YW5jZSBUZXN0aW5nIHJlcXVpcmVzIHNldmVyYWwgY29tcG9uZW50czoKPiArICogICAtIEEga2Vy bmVsIGJ1aWxkIHRoYXQgY29udGFpbnMgdGhlIHBhdGNoIHNldCBmb3IgRFAgY29tcGxpYW5jZSBz dXBwb3J0Cj4gKyAqICAgLSBBIERpc3BsYXlwb3J0IENvbXBsaWFuY2UgVGVzdGluZyBhcHBsaWFu Y2Ugc3VjaCBhcyBVbmlncmFmLURQUjEyMAo+ICsgKiAgIC0gVGhpcyB1c2VyIGFwcGxpY2F0aW9u Cj4gKyAqICAgLSBBIHdpbmRvd3MgaG9zdCBtYWNoaW5lIHRvIHJ1biB0aGUgRFBSIHRlc3Qgc29m dHdhcmUKPiArICogICAtIFJvb3QgYWNjZXNzIG9uIHRoZSBEVVQgZHVlIHRvIHRoZSB1c2Ugb2Yg c3lzZnMgdXRpbGl0eQo+ICsgKgo+ICsgKiBUZXN0IFNldHVwOgo+ICsgKiBJdCBpcyBzdHJvbmds eSByZWNvbW1lbmRlZCB0aGF0IHRoZSB3aW5kb3dzIGhvc3QsIHRlc3QgYXBwbGlhbmNlIGFuZCBE VVQKPiArICogYmUgZnJlc2hseSByZXN0YXJ0ZWQgYmVmb3JlIGFueSB0ZXN0aW5nIGJlZ2lucyB0 byBlbnN1cmUgdGhhdCBhbnkgcHJldmlvdXMKPiArICogY29uZmlndXJhdGlvbnMgYW5kIHNldHRp bmdzIHdpbGwgbm90IGludGVyZmVyZSB3aXRoIHRlc3QgcHJvY2Vzcy4gUmVmZXIgdG8KPiArICog dGhlIHRlc3QgYXBwbGlhbmNlIGRvY3VtZW50YXRpb24gZm9yIHNldHVwLCBzb2Z0d2FyZSBpbnN0 YWxsYXRpb24gYW5kCj4gKyAqIG9wZXJhdGlvbiBzcGVjaWZpYyB0byB0aGF0IGRldmljZS4KPiAr ICoKPiArICogVGhlIExpbnV4IERVVCBtdXN0IGJlIGluIHRleHQgKGNvbnNvbGUpIG1vZGUgYW5k IGNhbm5vdCBoYXZlIGFueSBvdGhlcgo+ICsgKiBkaXNwbGF5IG1hbmFnZXIgcnVubmluZy4gWW91 IG11c3QgYmUgbG9nZ2VkIGluIGFzIHJvb3QgdG8gcnVuIHRoaXMgdXNlciBhcHAuCj4gKyAqIE9u Y2UgdGhlIHVzZXIgYXBwbGljYXRpb24gaXMgdXAgYW5kIHJ1bm5pbmcsIHdhaXRpbmcgZm9yIHRl c3QgcmVxdWVzdHMsIHRoZQo+ICsgKiBzb2Z0d2FyZSBvbiB0aGUgd2luZG93cyBob3N0IGNhbiBu b3cgYmUgdXNlZCB0byBleGVjdXRlIHRoZSBjb21wbGlhbmNlIHRlc3RzLgo+ICsgKgo+ICsgKiBU aGlzIHVzZXJzcGFjZSBhcHBsaWNhdGlvbiBzdXBwb3J0cyBmb2xsb3dpbmcgdGVzdHMgZnJvbSB0 aGUgRFAgQ1RTIFNwZWMKPiArICogUmV2IDEuMToKPiArICogICAtIExpbmsgVHJhaW5pbmcgVGVz dHM6IFN1cHBvcnRzIHRlc3RzIDQuMy4xLjEgdG8gNC4zLjIuMwo+ICsgKiAgIC0gRURJRCBUZXN0 czogU3VwcG9ydHMgRURJRCByZWFkICg0LjIuMi4zKSxFRElEIFJlYWQgZmFpbHVyZSBhbmQgY29y cnVwdGlvbgo+ICsgKiAgICAgZGV0ZWN0aW9uIHRlc3RzICg0LjIuMi40LCA0LjIuMi41LCA0LjIu Mi42KQo+ICsgKiAgIC0gVmlkZW8gUGF0dGVybiBnZW5lcmF0aW9uIHRlc3RzOiBUaGlzIHN1cHBv cnRzIG9ubHkgdGhlIDI0IGFuZCAxOGJwcCBjb2xvcgo+ICsgKiAgICAgcmFtcCB0ZXN0IHBhdHRl cm4gKDQuMy4zLjEpLgo+ICsgKgo+ICsgKiBDb25uZWN0aW9ucyAocmVxdWlyZWQpOgo+ICsgKiAg IC0gVGVzdCBBcHBsaWFuY2UgY29ubmVjdGVkIHRvIHRoZSBleHRlcm5hbCBEaXNwbGF5cG9ydCBj b25uZWN0b3Igb24gdGhlIERVVAo+ICsgKiAgIC0gVGVzdCBBcHBsaWFuY2UgTW9uaXRvciBPdXQg Y29ubmVjdGVkIHRvIERpc3BsYXlwb3J0IGNvbm5lY3RvciBvbiB0aGUKPiArICogbW9uaXRvcgo+ ICsgKiAgIC0gVGVzdCBhcHBsaWFuY2UgY29ubmVjdGVkIHRvIHRoZSBXaW5kb3dzIEhvc3Qgdmlh IFVTQgo+ICsgKgo+ICsgKiBEZWJ1Z2ZzIEZpbGVzOgo+ICsgKiBUaGUgZmlsZSByb290IGZvciBh bGwgIHRoZSBkZWJ1Z2ZzIGZpbGU6Cj4gKyAqIC9zeXMva2VybmVsL2RlYnVnL2RyaS8wLwo+ICsg Kgo+ICsgKiBUaGUgc3BlY2lmaWMgZmlsZXMgYXJlIGFzIGZvbGxvd3M6Cj4gKyAqCj4gKyAqIGk5 MTVfZHBfdGVzdF9hY3RpdmUKPiArICogQSBzaW1wbGUgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0 aGVyIG9yIG5vdCBjb21wbGlhbmNlIHRlc3RpbmcgaXMgY3VycmVudGx5Cj4gKyAqIGFjdGl2ZSBp biB0aGUga2VybmVsLiBUaGlzIGZsYWcgaXMgcG9sbGVkIGJ5IHVzZXJzcGFjZSBhbmQgb25jZSBz ZXQsIGludm9rZXMKPiArICogdGhlIHRlc3QgaGFuZGxlciBpbiB0aGUgdXNlciBhcHAuIFRoaXMg ZmxhZyBpcyBzZXQgYnkgdGhlIHRlc3QgaGFuZGxlciBpbiB0aGUKPiArICoga2VybmVsIGFmdGVy IHJlYWRpbmcgdGhlIHJlZ2lzdGVycyByZXF1ZXN0ZWQgYnkgdGhlIHRlc3QgYXBwbGlhbmNlLgo+ ICsgKgo+ICsgKiBpOTE1X2RwX3Rlc3RfZGF0YQo+ICsgKiBUZXN0IGRhdGEgaXMgdXNlZCBieSB0 aGUga2VybmVsIHRvIHBhc3MgcGFyYW1ldGVycyB0byB0aGUgdXNlciBhcHAuIEVnOiBJbgo+ICsg KiBjYXNlIG9mIEVESUQgdGVzdHMsIHRoZSBkYXRhIHRoYXQgaXMgZGVsaXZlcmVkIHRvIHRoZSB1 c2Vyc3BhY2UgaXMgdGhlIHZpZGVvCj4gKyAqIG1vZGUgdG8gYmUgc2V0IGZvciB0aGUgdGVzdC4K PiArICogSW4gY2FzZSBvZiB2aWRlbyBwYXR0ZXJuIHRlc3QsIHRoZSBkYXRhIHRoYXQgaXMgZGVs aXZlcmVkIHRvIHRoZSB1c2Vyc3BhY2UgaXMKPiArICogdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2Yg dGhlIHRlc3QgcGF0dGVybiBhbmQgdGhlIGJpdHMgcGVyIGNvbG9yIHZhbHVlLgo+ICsgKgo+ICsg KiBpOTE1X2RwX3Rlc3RfdHlwZQo+ICsgKiBUaGUgdGVzdCB0eXBlIHZhcmlhYmxlIGluc3RydWN0 cyB0aGUgdXNlciBhcHAgYXMgdG8gd2hhdCB0aGUgcmVxdWVzdGVkIHRlc3QKPiArICogd2FzIGZy b20gdGhlIHNpbmsgZGV2aWNlLiBUaGVzZSB2YWx1ZXMgZGVmaW5lZCBhdCB0aGUgdG9wIG9mIHRo ZSBhcHBsaWNhdGlvbidzCj4gKyAqIG1haW4gaW1wbGVtZW50YXRpb24gZmlsZSBtdXN0IGJlIGtl cHQgaW4gc3luYyB3aXRoIHRoZSB2YWx1ZXMgZGVmaW5lZCBpbiB0aGUKPiArICoga2VybmVsJ3Mg ZHJtX2RwX2hlbHBlci5oIGZpbGUuCj4gKyAqIFRoaXMgYXBwIGlzIGJhc2VkIG9uIHNvbWUgcHJp b3Igd29yayBzdWJtaXR0ZWQgaW4gQXByaWwgMjAxNSBieSBUb2RkIFByZXZpdGUKPiArICogKDx0 cHJldml0ZUBnbWFpbC5jb20+KQo+ICsgKgo+ICsgKgo+ICsgKiBUaGlzIHRvb2wgY2FuIGJlIHJ1 biBhczoKPiArICogLi9pbnRlbF9kcF9jb21wbGlhbmNlICBJdCB3aWxsIHdhaXQgdGlsbCB5b3Ug c3RhcnQgY29tcGxpYW5jZSBzdWl0ZSBmcm9tCj4gKyAqIERQUiAxMjAuCj4gKyAqIC4vaW50ZWxf ZHBfY29tcGxpYW5jZSAtaCAgVGhpcyB3aWxsIG9wZW4gdGhlIGhlbHAKPiArICogLi9pbnRlbF9k cF9jb21wbGlhbmNlIC1pICBUaGlzIHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBjdXJy ZW50Cj4gKyAqIGNvbm5lY3RvcnMvQ1JUQ3MuIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2lu ZyBwdXJwb3NlLgo+ICsgKgo+ICsgKiBBdXRob3JzOgo+ICsgKiAgICBNYW5hc2kgTmF2YXJlIDxt YW5hc2kuZC5uYXZhcmVAaW50ZWwuY29tPgo+ICsgKgo+ICsgKiBFbGVtZW50cyBvZiB0aGUgbW9k ZXNldCBjb2RlIGFkYXB0ZWQgZnJvbSBEYXZpZCBIZXJybWFubidzCj4gKyAqIERSTSBtb2Rlc2V0 IGV4YW1wbGUKPiArICoKPiArICovCj4gKyNpbmNsdWRlICJpZ3QuaCIKPiArI2luY2x1ZGUgPGVy cm5vLmg+Cj4gKyNpbmNsdWRlIDxnZXRvcHQuaD4KPiArI2luY2x1ZGUgPG1hdGguaD4KPiArI2lu Y2x1ZGUgPHN0ZGludC5oPgo+ICsjaW5jbHVkZSA8c3RkYm9vbC5oPgo+ICsjaW5jbHVkZSA8c3Ry aW5ncy5oPgo+ICsjaW5jbHVkZSA8dW5pc3RkLmg+Cj4gKyNpbmNsdWRlIDx0ZXJtaW9zLmg+Cj4g KyNpbmNsdWRlIDxzeXMvcG9sbC5oPgo+ICsjaW5jbHVkZSA8c3lzL3RpbWUuaD4KPiArI2luY2x1 ZGUgPHN5cy9pb2N0bC5oPgo+ICsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cj4gKyNpbmNsdWRlIDxz eXMvc3RhdC5oPgo+ICsjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgo+ICsjaW5jbHVkZSA8YXNzZXJ0 Lmg+Cj4gKyNpbmNsdWRlIDxzaWduYWwuaD4KPiArI2luY2x1ZGUgPGZjbnRsLmg+Cj4gKyNpbmNs dWRlIDx0aW1lLmg+Cj4gKwo+ICsjaW5jbHVkZSAiaW50ZWxfZHBfY29tcGxpYW5jZS5oIgo+ICsK PiArI2luY2x1ZGUgPHN0ZGxpYi5oPgo+ICsjaW5jbHVkZSA8c2lnbmFsLmg+Cj4gKwo+ICsvKiBV c2VyIElucHV0IGRlZmluaXRpb25zICovCj4gKyNkZWZpbmUgSEVMUF9ERVNDUklQVElPTiAxCj4g Kwo+ICsvKiBEZWJ1Z2ZzIGZpbGUgZGVmaW5pdGlvbnMgKi8KPiArI2RlZmluZSBJTlRFTF9EUF9U RVNUX1RZUEVfRklMRQkJImk5MTVfZHBfdGVzdF90eXBlIgo+ICsjZGVmaW5lIElOVEVMX0RQX1RF U1RfQUNUSVZFX0ZJTEUJImk5MTVfZHBfdGVzdF9hY3RpdmUiCj4gKyNkZWZpbmUgSU5URUxfRFBf VEVTVF9EQVRBX0ZJTEUJCSJpOTE1X2RwX3Rlc3RfZGF0YSIKPiArCj4gKy8qIERSTSBkZWZpbml0 aW9ucyAtIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIERSTSBoZWFkZXIgKi8KPiArI2Rl ZmluZSBEUF9URVNUX0xJTktfVFJBSU5JTkcJCSgxIDw8IDApCj4gKyNkZWZpbmUgRFBfVEVTVF9M SU5LX1ZJREVPX1BBVFRFUk4JKDEgPDwgMSkKPiArI2RlZmluZSBEUF9URVNUX0xJTktfRURJRF9S RUFECQkoMSA8PCAyKQo+ICsjZGVmaW5lIERQX1RFU1RfTElOS19QSFlfVEVTVF9QQVRURVJOCSgx IDw8IDMpIC8qIERQQ0QgPj0gMS4xICovCj4gKwo+ICsjZGVmaW5lIERQX0NPTVBMSUFOQ0VfVEVT VF9UWVBFX01BU0sJKERQX1RFU1RfTElOS19UUkFJTklORyAgICAgIHwJXAo+ICsJCQkJCSBEUF9U RVNUX0xJTktfVklERU9fUEFUVEVSTiB8CVwKPiArCQkJCQkgRFBfVEVTVF9MSU5LX0VESURfUkVB RCAgICAgfAlcCj4gKwkJCQkJIERQX1RFU1RfTElOS19QSFlfVEVTVF9QQVRURVJOKQo+ICsKPiAr LyogTk9URTogVGhlc2UgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgZGVmaW5pdGlvbnMg aW4gaW50ZWxfZHAuYyAqLwo+ICsjZGVmaW5lIElOVEVMX0RQX0VESURfU0hJRlRfTUFTSwkwCj4g KyNkZWZpbmUgSU5URUxfRFBfRURJRF9PSwkJKDAgPDwgSU5URUxfRFBfRURJRF9TSElGVF9NQVNL KQo+ICsjZGVmaW5lIElOVEVMX0RQX0VESURfQ09SUlVQVAkJKDEgPDwgSU5URUxfRFBfRURJRF9T SElGVF9NQVNLKQo+ICsjZGVmaW5lIElOVEVMX0RQX1JFU09MVVRJT05fU0hJRlRfTUFTSwkwCj4g KyNkZWZpbmUgSU5URUxfRFBfUkVTT0xVVElPTl9QUkVGRVJSRUQJKDEgPDwgSU5URUxfRFBfUkVT T0xVVElPTl9TSElGVF9NQVNLKQo+ICsjZGVmaW5lIElOVEVMX0RQX1JFU09MVVRJT05fU1RBTkRB UkQJKDIgPDwgSU5URUxfRFBfUkVTT0xVVElPTl9TSElGVF9NQVNLKQo+ICsjZGVmaW5lIElOVEVM X0RQX1JFU09MVVRJT05fRkFJTFNBRkUJKDMgPDwgSU5URUxfRFBfUkVTT0xVVElPTl9TSElGVF9N QVNLKQo+ICsjZGVmaW5lIERQX0NPTVBMSUFOQ0VfVklERU9fTU9ERV9NQVNLCShJTlRFTF9EUF9S RVNPTFVUSU9OX1BSRUZFUlJFRAl8XAo+ICsJCQkJCSBJTlRFTF9EUF9SRVNPTFVUSU9OX1NUQU5E QVJECXxcCj4gKwkJCQkJIElOVEVMX0RQX1JFU09MVVRJT05fRkFJTFNBRkUpCj4gKwo+ICsvKiBH bG9iYWwgZmlsZSBwb2ludGVycyBmb3IgdGhlIHN5c2ZzIGZpbGVzICovCj4gK0ZJTEUgKnRlc3Rf YWN0aXZlX2ZwLCAqdGVzdF9kYXRhX2ZwLCAqdGVzdF90eXBlX2ZwOwo+ICsKPiArYm9vbCB2aWRl b19wYXR0ZXJuX2ZsYWc7Cj4gKwo+ICsvKiBWaWRlbyBwYXR0ZXJuIHRlc3QgZ2xvYmFscyAqLwo+ ICt1aW50MTZfdCBoZGlzcGxheTsKPiArdWludDE2X3QgdmRpc3BsYXk7Cj4gK3VpbnQ4X3QgYml0 ZGVwdGg7Cj4gKwo+ICtzdGF0aWMgaW50IHRpb19mZDsKPiArc3RydWN0IHRlcm1pb3Mgc2F2ZWRf dGlvOwo+ICsKPiArZHJtTW9kZVJlcyAqcmVzb3VyY2VzOwo+ICtpbnQgZHJtX2ZkLCBtb2RlczsK PiArdWludDY0X3QgdGlsaW5nID0gTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORTsKPiArdWludDMy X3QgZGVwdGggPSAyNCwgc3RyaWRlLCBicHA7Cj4gK2ludCBzcGVjaWZpZWRfbW9kZV9udW0gPSAt MSwgc3BlY2lmaWVkX2Rpc3BfaWQgPSAtMTsKPiAraW50IHdpZHRoLCBoZWlnaHQ7Cj4gK3VpbnQz Ml90IHRlc3RfY3J0YzsKPiArdWludDMyX3QgdGVzdF9jb25uZWN0b3JfaWQ7Cj4gK2VudW0gewo+ ICsJSU5URUxfTU9ERV9JTlZBTElEID0gLTEsCj4gKwlJTlRFTF9NT0RFX05PTkUgPSAwLAo+ICsJ SU5URUxfTU9ERV9QUkVGRVJSRUQsCj4gKwlJTlRFTF9NT0RFX1NUQU5EQVJELAo+ICsJSU5URUxf TU9ERV9GQUlMU0FGRSwKPiArCUlOVEVMX01PREVfVklERU9fUEFUVEVSTl9URVNUCj4gK30gaW50 ZWxfZGlzcGxheV9tb2RlOwo+ICsKPiArc3RydWN0IHRlc3RfdmlkZW9fcGF0dGVybiB7Cj4gKwl1 aW50MTZfdCBoZGlzcGxheTsKPiArCXVpbnQxNl90IHZkaXNwbGF5Owo+ICsJdWludDhfdCBiaXRk ZXB0aDsKPiArCXVpbnQzMl90IGZiOwo+ICsJdWludDMyX3Qgc2l6ZTsKPiArCXN0cnVjdCBpZ3Rf ZmIgZmJfcGF0dGVybjsKPiArCWRybU1vZGVNb2RlSW5mbyBtb2RlOwo+ICsJdWludDMyX3QgKnBp eG1hcDsKPiArfTsKPiArCj4gK3N0cnVjdCBjb25uZWN0b3Igewo+ICsJdWludDMyX3QgaWQ7Cj4g KwlpbnQgbW9kZV92YWxpZDsKPiArCWRybU1vZGVNb2RlSW5mbyBtb2RlLCBtb2RlX3N0YW5kYXJk LCBtb2RlX3ByZWZlcnJlZCwgbW9kZV9mYWlsc2FmZTsKPiArCWRybU1vZGVDb25uZWN0b3IgKmNv bm5lY3RvcjsKPiArCWludCBjcnRjOwo+ICsJLyogU3RhbmRhcmQgYW5kIHByZWZlcnJlZCBmcmFt ZSBidWZmZXIqLwo+ICsJdWludDMyX3QgZmIsIGZiX3dpZHRoLCBmYl9oZWlnaHQsIGZiX3NpemU7 Cj4gKwl1aW50OF90ICpwaXhtYXA7Cj4gKwlzdHJ1Y3QgaWd0X2ZiIGZiX3ZpZGVvX3BhdHRlcm47 Cj4gKwkvKiBGYWlsc2FmZSBmcmFtZWJ1ZmZlciAtIG5vdGUgdGhpcyBpcyBhIDE2LWJpdCBidWZm ZXIgKi8KPiArCXVpbnQzMl90IGZhaWxzYWZlX2ZiLCBmYWlsc2FmZV93aWR0aCwgZmFpbHNhZmVf aGVpZ2h0Owo+ICsJdWludDMyX3QgZmFpbHNhZmVfc2l6ZTsKPiArCXVpbnQ4X3QgKmZhaWxzYWZl X3BpeG1hcDsKPiArCXN0cnVjdCBpZ3RfZmIgZmJfZmFpbHNhZmVfcGF0dGVybjsKPiArCXN0cnVj dCB0ZXN0X3ZpZGVvX3BhdHRlcm4gdGVzdF9wYXR0ZXJuOwo+ICt9Owo+ICsKPiArc3RhdGljIHZv aWQgY2xlYXJfdGVzdF9hY3RpdmUodm9pZCkKPiArewo+ICsJcmV3aW5kKHRlc3RfYWN0aXZlX2Zw KTsKPiArCWZwcmludGYodGVzdF9hY3RpdmVfZnAsICIlZCIsIDApOwo+ICsJZmZsdXNoKHRlc3Rf YWN0aXZlX2ZwKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgc2V0dXBfZGVidWdmc19maWxlcyh2 b2lkKQo+ICt7Cj4gKwl0ZXN0X3R5cGVfZnAgPSBpZ3RfZGVidWdmc19mb3BlbihJTlRFTF9EUF9U RVNUX1RZUEVfRklMRSwgInIiKTsKPiArCWlndF9yZXF1aXJlKHRlc3RfdHlwZV9mcCk7Cj4gKwo+ ICsJdGVzdF9kYXRhX2ZwID0gaWd0X2RlYnVnZnNfZm9wZW4oSU5URUxfRFBfVEVTVF9EQVRBX0ZJ TEUsICJyIik7Cj4gKwlpZ3RfcmVxdWlyZSh0ZXN0X2RhdGFfZnApOwo+ICsKPiArCXRlc3RfYWN0 aXZlX2ZwID0gaWd0X2RlYnVnZnNfZm9wZW4oSU5URUxfRFBfVEVTVF9BQ1RJVkVfRklMRSwgIncr Iik7Cj4gKwlpZ3RfcmVxdWlyZSh0ZXN0X2FjdGl2ZV9mcCk7Cj4gKwo+ICsJLyogUmVzZXQgdGhl IGFjdGl2ZSBmbGFnIGZvciBzYWZldHkgKi8KPiArCWNsZWFyX3Rlc3RfYWN0aXZlKCk7Cj4gK30K PiArCj4gK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF90ZXN0X3R5cGUodm9pZCkKPiArewo+ICsJ dW5zaWduZWQgbG9uZyB0ZXN0X3R5cGU7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCWlmICghdGVzdF90 eXBlX2ZwKQo+ICsJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB0ZXN0X3R5cGUgZmlsZVxuIik7 Cj4gKwlyZXdpbmQodGVzdF90eXBlX2ZwKTsKPiArCXJldCA9IGZzY2FuZih0ZXN0X3R5cGVfZnAs ICIlbHgiLCAmdGVzdF90eXBlKTsKPiArCWlmIChyZXQgPCAxIHx8IHRlc3RfdHlwZSA8PSAwKSB7 Cj4gKwkJaWd0X3dhcm4oInRlc3RfdHlwZSByZWFkIGZhaWxlZCAtICVseFxuIiwgdGVzdF90eXBl KTsKPiArCQlyZXR1cm4gMDsKPiArCX0KPiArCj4gKwlyZXR1cm4gdGVzdF90eXBlOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfdGVzdF9lZGlkX2RhdGEodm9pZCkKPiArewo+ ICsJdW5zaWduZWQgbG9uZyB0ZXN0X2RhdGE7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCWlmICghdGVz dF9kYXRhX2ZwKQo+ICsJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB0ZXN0X2RhdGEgZmlsZVxy XG4iKTsKPiArCj4gKwlyZXdpbmQodGVzdF9kYXRhX2ZwKTsKPiArCXJldCA9IGZzY2FuZih0ZXN0 X2RhdGFfZnAsICIlbHgiLCAmdGVzdF9kYXRhKTsKPiArCWlmIChyZXQgPCAxIHx8IHRlc3RfZGF0 YSA8PSAwKSB7Cj4gKwkJaWd0X3dhcm4oInRlc3RfZGF0YSByZWFkIGZhaWxlZCAtICVseFxyXG4i LCB0ZXN0X2RhdGEpOwo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsKPiArCXJldHVybiB0ZXN0X2Rh dGE7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGdldF90ZXN0X3ZpZGVvcGF0dGVybl9kYXRhKHZv aWQpCj4gK3sKPiArCWludCBjb3VudCA9IDA7Cj4gKwl1aW50MTZfdCB2aWRlb19wYXR0ZXJuX3Zh bHVlWzNdOwo+ICsJY2hhciB2aWRlb19wYXR0ZXJuX2F0dHJpYnV0ZVsxNV07Cj4gKwlpbnQgcmV0 Owo+ICsKPiArCWlmICghdGVzdF9kYXRhX2ZwKQo+ICsJCWZwcmludGYoc3RkZXJyLCAiSW52YWxp ZCB0ZXN0X2RhdGEgZmlsZVxuIik7Cj4gKwo+ICsJcmV3aW5kKHRlc3RfZGF0YV9mcCk7Cj4gKwl3 aGlsZSAoIWZlb2YodGVzdF9kYXRhX2ZwKSAmJiBjb3VudCA8IDMpIHsKPiArCQlyZXQgPSBmc2Nh bmYodGVzdF9kYXRhX2ZwLCAiJXMgJXVcbiIsIHZpZGVvX3BhdHRlcm5fYXR0cmlidXRlLAo+ICsJ CSAgICAgICAodW5zaWduZWQgaW50ICopJnZpZGVvX3BhdHRlcm5fdmFsdWVbY291bnQrK10pOwo+ ICsJCWlmIChyZXQgPCAyKSB7Cj4gKwkJCWlndF93YXJuKCJ0ZXN0X2RhdGEgcmVhZCBmYWlsZWRc biIpOwo+ICsJCQlyZXR1cm47Cj4gKwkJfQo+ICsJfQo+ICsKPiArCWhkaXNwbGF5ID0gdmlkZW9f cGF0dGVybl92YWx1ZVswXTsKPiArCXZkaXNwbGF5ID0gdmlkZW9fcGF0dGVybl92YWx1ZVsxXTsK PiArCWJpdGRlcHRoID0gdmlkZW9fcGF0dGVybl92YWx1ZVsyXTsKPiArCWlndF9pbmZvKCJIZGlz cGxheSA9ICVkXG4iLCBoZGlzcGxheSk7Cj4gKwlpZ3RfaW5mbygiVmRpc3BsYXkgPSAlZFxuIiwg dmRpc3BsYXkpOwo+ICsJaWd0X2luZm8oIkJpdERlcHRoID0gJXVcbiIsIGJpdGRlcHRoKTsKPiAr Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcHJvY2Vzc190ZXN0X3JlcXVlc3QoaW50IHRlc3RfdHlw ZSkKPiArewo+ICsJaW50IG1vZGU7Cj4gKwl1bnNpZ25lZCBsb25nIHRlc3RfZGF0YV9lZGlkOwo+ ICsJYm9vbCB2YWxpZCA9IGZhbHNlOwo+ICsJc3dpdGNoICh0ZXN0X3R5cGUpIHsKPiArCWNhc2Ug RFBfVEVTVF9MSU5LX1ZJREVPX1BBVFRFUk46Cj4gKwkJdmlkZW9fcGF0dGVybl9mbGFnID0gdHJ1 ZTsKPiArCQlnZXRfdGVzdF92aWRlb3BhdHRlcm5fZGF0YSgpOwo+ICsJCW1vZGUgPSBJTlRFTF9N T0RFX1ZJREVPX1BBVFRFUk5fVEVTVDsKPiArCQl2YWxpZCA9IHRydWU7Cj4gKwkJYnJlYWs7Cj4g KwljYXNlIERQX1RFU1RfTElOS19FRElEX1JFQUQ6Cj4gKwkJdGVzdF9kYXRhX2VkaWQgPSBnZXRf dGVzdF9lZGlkX2RhdGEoKTsKPiArCQltb2RlID0gKHRlc3RfZGF0YV9lZGlkICYgRFBfQ09NUExJ QU5DRV9WSURFT19NT0RFX01BU0spID4+Cj4gKwkJCUlOVEVMX0RQX1JFU09MVVRJT05fU0hJRlRf TUFTSzsKPiArCQl2YWxpZCA9IHRydWU7Cj4gKwkJYnJlYWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCS8q IFVua25vd24gdGVzdCB0eXBlICovCj4gKwkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHRlc3Qg cmVxdWVzdCwgaWdub3JlZC5cbiIpOwo+ICsJCWJyZWFrOwo+ICsJfQo+ICsKPiArCWlmICh2YWxp ZCkKPiArCQlyZXR1cm4gdXBkYXRlX2Rpc3BsYXkobW9kZSwgdHJ1ZSk7Cj4gKwo+ICsJcmV0dXJu IC0xOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkdW1wX2Nvbm5lY3RvcnNfZmQoaW50IGRybWZk KQo+ICt7Cj4gKwlpbnQgaSwgajsKPiArCj4gKwlkcm1Nb2RlUmVzICptb2RlX3Jlc291cmNlcyA9 IGRybU1vZGVHZXRSZXNvdXJjZXMoZHJtZmQpOwo+ICsKPiArCWlmICghbW9kZV9yZXNvdXJjZXMp IHsKPiArCQlpZ3Rfd2FybigiZHJtTW9kZUdldFJlc291cmNlcyBmYWlsZWQ6ICVzXG4iLCBzdHJl cnJvcihlcnJubykpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwlpZ3RfaW5mbygiQ29ubmVj dG9yczpcbiIpOwo+ICsJaWd0X2luZm8oImlkXHRlbmNvZGVyXHRzdGF0dXNcdFx0dHlwZVx0c2l6 ZSAobW0pXHRtb2Rlc1xuIik7Cj4gKwlmb3IgKGkgPSAwOyBpIDwgbW9kZV9yZXNvdXJjZXMtPmNv dW50X2Nvbm5lY3RvcnM7IGkrKykgewo+ICsJCWRybU1vZGVDb25uZWN0b3IgKmNvbm5lY3RvcjsK PiArCj4gKwkJY29ubmVjdG9yID0gZHJtTW9kZUdldENvbm5lY3RvckN1cnJlbnQoZHJtZmQsCj4g KwkJCQkJCSAgICAgICBtb2RlX3Jlc291cmNlcy0+Y29ubmVjdG9yc1tpXSk7Cj4gKwkJaWYgKCFj b25uZWN0b3IpIHsKPiArCQkJaWd0X3dhcm4oIkNvdWxkIG5vdCBnZXQgY29ubmVjdG9yICVpOiAl c1xuIiwKPiArCQkJCSBtb2RlX3Jlc291cmNlcy0+Y29ubmVjdG9yc1tpXSwgc3RyZXJyb3IoZXJy bm8pKTsKPiArCQkJY29udGludWU7Cj4gKwkJfQo+ICsKPiArCQlpZ3RfaW5mbygiJWRcdCVkXHQl c1x0JXNcdCVkeCVkXHRcdCVkXG4iLAo+ICsJCQkgY29ubmVjdG9yLT5jb25uZWN0b3JfaWQsCj4g KwkJCSBjb25uZWN0b3ItPmVuY29kZXJfaWQsCj4gKwkJCSBrbXN0ZXN0X2Nvbm5lY3Rvcl9zdGF0 dXNfc3RyKGNvbm5lY3Rvci0+Y29ubmVjdGlvbiksCj4gKwkJCSBrbXN0ZXN0X2Nvbm5lY3Rvcl90 eXBlX3N0cihjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKSwKPiArCQkJIGNvbm5lY3Rvci0+bW1X aWR0aCwKPiArCQkJIGNvbm5lY3Rvci0+bW1IZWlnaHQsCj4gKwkJCSBjb25uZWN0b3ItPmNvdW50 X21vZGVzKTsKPiArCj4gKwkJaWYgKCFjb25uZWN0b3ItPmNvdW50X21vZGVzKQo+ICsJCQljb250 aW51ZTsKPiArCj4gKwkJaWd0X2luZm8oIiAgTW9kZXM6XG4iKTsKPiArCQlpZ3RfaW5mbygiICBu YW1lIHJlZnJlc2ggKEh6KSBoZGlzcCBoc3MgaHNlIGh0b3QgdmRpc3AgIiJ2c3MgdnNlIHZ0b3Qg ZmxhZ3MgdHlwZSBjbG9ja1xuIik7Cj4gKwkJZm9yIChqID0gMDsgaiA8IGNvbm5lY3Rvci0+Y291 bnRfbW9kZXM7IGorKykgewo+ICsJCQlpZ3RfaW5mbygiWyVkXSIsIGopOwo+ICsJCQlrbXN0ZXN0 X2R1bXBfbW9kZSgmY29ubmVjdG9yLT5tb2Rlc1tqXSk7Cj4gKwkJfQo+ICsKPiArCQlkcm1Nb2Rl RnJlZUNvbm5lY3Rvcihjb25uZWN0b3IpOwo+ICsJfQo+ICsJaWd0X2luZm8oIlxuIik7Cj4gKwo+ ICsJZHJtTW9kZUZyZWVSZXNvdXJjZXMobW9kZV9yZXNvdXJjZXMpOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCBkdW1wX2NydGNzX2ZkKGludCBkcm1mZCkKPiArewo+ICsJaW50IGk7Cj4gKwlkcm1N b2RlUmVzICptb2RlX3Jlc291cmNlczsKPiArCj4gKwltb2RlX3Jlc291cmNlcyA9IGRybU1vZGVH ZXRSZXNvdXJjZXMoZHJtZmQpOwo+ICsJaWYgKCFtb2RlX3Jlc291cmNlcykgewo+ICsJCWlndF93 YXJuKCJkcm1Nb2RlR2V0UmVzb3VyY2VzIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7 Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWlndF9pbmZvKCJDUlRDczpcbiIpOwo+ICsJaWd0 X2luZm8oImlkXHRmYlx0cG9zXHRzaXplXG4iKTsKPiArCWZvciAoaSA9IDA7IGkgPCBtb2RlX3Jl c291cmNlcy0+Y291bnRfY3J0Y3M7IGkrKykgewo+ICsJCWRybU1vZGVDcnRjICpjcnRjOwo+ICsK PiArCQljcnRjID0gZHJtTW9kZUdldENydGMoZHJtZmQsIG1vZGVfcmVzb3VyY2VzLT5jcnRjc1tp XSk7Cj4gKwkJaWYgKCFjcnRjKSB7Cj4gKwkJCWlndF93YXJuKCJDb3VsZCBub3QgZ2V0IGNydGMg JWk6ICVzXG4iLCBtb2RlX3Jlc291cmNlcy0+Y3J0Y3NbaV0sIHN0cmVycm9yKGVycm5vKSk7Cj4g KwkJCWNvbnRpbnVlOwo+ICsJCX0KPiArCQlpZ3RfaW5mbygiJWRcdCVkXHQoJWQsJWQpXHQoJWR4 JWQpXG4iLAo+ICsJCQkgY3J0Yy0+Y3J0Y19pZCwKPiArCQkJIGNydGMtPmJ1ZmZlcl9pZCwKPiAr CQkJIGNydGMtPngsCj4gKwkJCSBjcnRjLT55LAo+ICsJCQkgY3J0Yy0+d2lkdGgsCj4gKwkJCSBj cnRjLT5oZWlnaHQpOwo+ICsKPiArCQlrbXN0ZXN0X2R1bXBfbW9kZSgmY3J0Yy0+bW9kZSk7Cj4g Kwo+ICsJCWRybU1vZGVGcmVlQ3J0YyhjcnRjKTsKPiArCX0KPiArCWlndF9pbmZvKCJcbiIpOwo+ ICsKPiArCWRybU1vZGVGcmVlUmVzb3VyY2VzKG1vZGVfcmVzb3VyY2VzKTsKPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgZHVtcF9pbmZvKHZvaWQpCj4gK3sKPiArCWR1bXBfY29ubmVjdG9yc19mZChk cm1fZmQpOwo+ICsJZHVtcF9jcnRjc19mZChkcm1fZmQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IHNldHVwX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgY29ubmVjdG9yICpkcF9jb25uKQo+ICt7Cj4gKwo+ ICsJZHBfY29ubi0+ZmIgPSBpZ3RfY3JlYXRlX2ZiKGRybV9mZCwKPiArCQkJCSAgICBkcF9jb25u LT5mYl93aWR0aCwgZHBfY29ubi0+ZmJfaGVpZ2h0LAo+ICsJCQkJICAgIERSTV9GT1JNQVRfWFJH Qjg4ODgsCj4gKwkJCQkgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKPiArCQkJCSAgICAm ZHBfY29ubi0+ZmJfdmlkZW9fcGF0dGVybik7Cj4gKwlpZ3RfYXNzZXJ0KGRwX2Nvbm4tPmZiKTsK PiArCj4gKwkvKiBNYXAgdGhlIG1hcHBpbmcgb2YgR0VNIG9iamVjdCBpbnRvIHRoZSB2aXJ0dWFs IGFkZHJlc3Mgc3BhY2UgKi8KPiArCWRwX2Nvbm4tPnBpeG1hcCA9IGdlbV9tbWFwX19ndHQoZHJt X2ZkLAo+ICsJCQkJCWRwX2Nvbm4tPmZiX3ZpZGVvX3BhdHRlcm4uZ2VtX2hhbmRsZSwKPiArCQkJ CQlkcF9jb25uLT5mYl92aWRlb19wYXR0ZXJuLnNpemUsCj4gKwkJCQkJUFJPVF9SRUFEIHwgUFJP VF9XUklURSk7Cj4gKwlpZiAoZHBfY29ubi0+cGl4bWFwID09IE5VTEwpCj4gKwkJcmV0dXJuIC0x Owo+ICsKPiArCWdlbV9zZXRfZG9tYWluKGRybV9mZCwgZHBfY29ubi0+ZmJfdmlkZW9fcGF0dGVy bi5nZW1faGFuZGxlLAo+ICsJCSAgICAgICBJOTE1X0dFTV9ET01BSU5fR1RULCBJOTE1X0dFTV9E T01BSU5fR1RUKTsKPiArCWRwX2Nvbm4tPmZiX3NpemUgPSBkcF9jb25uLT5mYl92aWRlb19wYXR0 ZXJuLnNpemU7Cj4gKwo+ICsJLyogQWZ0ZXIgZmlsbGluZyB0aGUgZGV2aWNlIG1lbW9yeSB3aXRo IDBzIGl0IG5lZWRzIHRvIGJlIHVubWFwcGVkICovCj4gKwltZW1zZXQoZHBfY29ubi0+cGl4bWFw LCAwLCBkcF9jb25uLT5mYl9zaXplKTsKPiArCW11bm1hcChkcF9jb25uLT5waXhtYXAsIGRwX2Nv bm4tPmZiX3NpemUpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHNl dHVwX2ZhaWxzYWZlX2ZyYW1lYnVmZmVyKHN0cnVjdCBjb25uZWN0b3IgKmRwX2Nvbm4pCj4gK3sK PiArCj4gKwlkcF9jb25uLT5mYWlsc2FmZV9mYiA9IGlndF9jcmVhdGVfZmIoZHJtX2ZkLAo+ICsJ CQkJCSAgICAgZHBfY29ubi0+ZmFpbHNhZmVfd2lkdGgsCj4gKwkJCQkJICAgICBkcF9jb25uLT5m YWlsc2FmZV9oZWlnaHQsCj4gKwkJCQkJICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAo+ICsJCQkJ CSAgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKPiArCQkJCQkgICAgICZkcF9jb25uLT5m Yl9mYWlsc2FmZV9wYXR0ZXJuKTsKPiArCWlndF9hc3NlcnQoZHBfY29ubi0+ZmFpbHNhZmVfZmIp Owo+ICsKPiArCS8qIE1hcCB0aGUgbWFwcGluZyBvZiBHRU0gb2JqZWN0IGludG8gdGhlIHZpcnR1 YWwgYWRkcmVzcyBzcGFjZSAqLwo+ICsJZHBfY29ubi0+ZmFpbHNhZmVfcGl4bWFwID0gZ2VtX21t YXBfX2d0dChkcm1fZmQsCj4gKwkJCQkJCSBkcF9jb25uLT5mYl9mYWlsc2FmZV9wYXR0ZXJuLmdl bV9oYW5kbGUsCj4gKwkJCQkJCSBkcF9jb25uLT5mYl9mYWlsc2FmZV9wYXR0ZXJuLnNpemUsCj4g KwkJCQkJCSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKPiArCWlmIChkcF9jb25uLT5mYWlsc2Fm ZV9waXhtYXAgPT0gTlVMTCkKPiArCQlyZXR1cm4gLTE7Cj4gKwo+ICsJZ2VtX3NldF9kb21haW4o ZHJtX2ZkLCBkcF9jb25uLT5mYl9mYWlsc2FmZV9wYXR0ZXJuLmdlbV9oYW5kbGUsCj4gKwkJICAg ICAgIEk5MTVfR0VNX0RPTUFJTl9HVFQsIEk5MTVfR0VNX0RPTUFJTl9HVFQpOwo+ICsJZHBfY29u bi0+ZmFpbHNhZmVfc2l6ZSA9IGRwX2Nvbm4tPmZiX2ZhaWxzYWZlX3BhdHRlcm4uc2l6ZTsKPiAr Cj4gKwkvKiBBZnRlciBmaWxsaW5nIHRoZSBkZXZpY2UgZnJhbWVidWZmZXIgdGhlIG1hcHBlZCBt ZW1vcnkgbmVlZHMgdG8gYmUgZnJlZWQgKi8KPiArCW1lbXNldChkcF9jb25uLT5mYWlsc2FmZV9w aXhtYXAsIDAsIGRwX2Nvbm4tPmZhaWxzYWZlX3NpemUpOwo+ICsJbXVubWFwKGRwX2Nvbm4tPmZh aWxzYWZlX3BpeG1hcCwgZHBfY29ubi0+ZmFpbHNhZmVfc2l6ZSk7Cj4gKwo+ICsJcmV0dXJuIDA7 Cj4gKwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHNldHVwX3ZpZGVvX3BhdHRlcm5fZnJhbWVidWZm ZXIoc3RydWN0IGNvbm5lY3RvciAqZHBfY29ubikKPiArewo+ICsJdWludDMyX3QgIHZpZGVvX3dp ZHRoLCB2aWRlb19oZWlnaHQ7Cj4gKwo+ICsJdmlkZW9fd2lkdGggPSBkcF9jb25uLT50ZXN0X3Bh dHRlcm4uaGRpc3BsYXk7Cj4gKwl2aWRlb19oZWlnaHQgPSBkcF9jb25uLT50ZXN0X3BhdHRlcm4u dmRpc3BsYXk7Cj4gKwlkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmIgPSBpZ3RfY3JlYXRlX2ZiKGRy bV9mZCwKPiArCQkJCQkJIHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQsCj4gKwkJCQkJCSBEUk1f Rk9STUFUX1hSR0I4ODg4LAo+ICsJCQkJCQkgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKPiAr CQkJCQkJICZkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmJfcGF0dGVybik7Cj4gKwlpZ3RfYXNzZXJ0 KGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5mYik7Cj4gKwo+ICsJLyogTWFwIHRoZSBtYXBwaW5nIG9m IEdFTSBvYmplY3QgaW50byB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlICovCj4gKwlkcF9jb25u LT50ZXN0X3BhdHRlcm4ucGl4bWFwID0gZ2VtX21tYXBfX2d0dChkcm1fZmQsCj4gKwkJCQkJCSAg ICAgZHBfY29ubi0+dGVzdF9wYXR0ZXJuLmZiX3BhdHRlcm4uZ2VtX2hhbmRsZSwKPiArCQkJCQkJ ICAgICBkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmJfcGF0dGVybi5zaXplLAo+ICsJCQkJCQkgICAg IFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwo+ICsJaWYgKGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5w aXhtYXAgPT0gTlVMTCkKPiArCQlyZXR1cm4gLTE7Cj4gKwo+ICsJZ2VtX3NldF9kb21haW4oZHJt X2ZkLCBkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmJfcGF0dGVybi5nZW1faGFuZGxlLAo+ICsJCSAg ICAgICBJOTE1X0dFTV9ET01BSU5fR1RULCBJOTE1X0dFTV9ET01BSU5fR1RUKTsKPiArCj4gKwlk cF9jb25uLT50ZXN0X3BhdHRlcm4uc2l6ZSA9IGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5mYl9wYXR0 ZXJuLnNpemU7Cj4gKwo+ICsJbWVtc2V0KGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5waXhtYXAsIDAs IGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5zaXplKTsKPiArCXJldHVybiAwOwo+ICsKPiArfQo+ICsK PiArc3RhdGljIGludCBmaWxsX2ZyYW1lYnVmZmVyKHN0cnVjdCBjb25uZWN0b3IgKmRwX2Nvbm4p Cj4gK3sKPiArCXVpbnQzMl90IHRpbGVfaGVpZ2h0LCB0aWxlX3dpZHRoLCB2aWRlb193aWR0aCwg dmlkZW9faGVpZ2h0Owo+ICsJdWludDMyX3QgKnJlZF9wdHIsICpncmVlbl9wdHIsICpibHVlX3B0 ciwgKndoaXRlX3B0ciwgKnNyY19wdHIsICpkc3RfcHRyOwo+ICsJaW50IHgsIHk7Cj4gKwlpbnQz Ml90IHBpeGVsX3ZhbDsKPiArCj4gKwl2aWRlb193aWR0aCA9IGRwX2Nvbm4tPnRlc3RfcGF0dGVy bi5oZGlzcGxheTsKPiArCXZpZGVvX2hlaWdodCA9IGRwX2Nvbm4tPnRlc3RfcGF0dGVybi52ZGlz cGxheTsKPiArCj4gKwl0aWxlX2hlaWdodCA9IDY0Owo+ICsJdGlsZV93aWR0aCA9IDEgPDwgIChk cF9jb25uLT50ZXN0X3BhdHRlcm4uYml0ZGVwdGgpOwo+ICsKPiArCXJlZF9wdHIgPSBkcF9jb25u LT50ZXN0X3BhdHRlcm4ucGl4bWFwOwo+ICsJZ3JlZW5fcHRyID0gcmVkX3B0ciArICh2aWRlb193 aWR0aCAqIHRpbGVfaGVpZ2h0KTsKPiArCWJsdWVfcHRyID0gZ3JlZW5fcHRyICsgKHZpZGVvX3dp ZHRoICogdGlsZV9oZWlnaHQpOwo+ICsJd2hpdGVfcHRyID0gYmx1ZV9wdHIgKyAodmlkZW9fd2lk dGggKiB0aWxlX2hlaWdodCk7Cj4gKwl4ID0gMDsKPiArCj4gKwkvKiBGaWxsIHRoZSBmcmFtZSBi dWZmZXIgd2l0aCB2aWRlbyBwYXR0ZXJuIGZyb20gQ1RTIDMuMS41ICovCj4gKwl3aGlsZSAoeCA8 IHZpZGVvX3dpZHRoKSB7Cj4gKwkJZm9yIChwaXhlbF92YWwgPSAwOyBwaXhlbF92YWwgPCAyNTY7 Cj4gKwkJICAgICBwaXhlbF92YWwgPSBwaXhlbF92YWwgKyAoMjU2IC8gdGlsZV93aWR0aCkpIHsK PiArCQkJcmVkX3B0clt4XSA9IHBpeGVsX3ZhbCA8PCAxNjsKPiArCQkJZ3JlZW5fcHRyW3hdID0g cGl4ZWxfdmFsIDw8IDg7Cj4gKwkJCWJsdWVfcHRyW3hdID0gcGl4ZWxfdmFsIDw8IDA7Cj4gKwkJ CXdoaXRlX3B0clt4XSA9IHJlZF9wdHJbeF0gfCBncmVlbl9wdHJbeF0gfCBibHVlX3B0clt4XTsK PiArCQkJaWYgKCsreCA+PSB2aWRlb193aWR0aCkKPiArCQkJCWJyZWFrOwo+ICsJCX0KPiArCX0K PiArCWZvciAoeSA9IDA7IHkgPCB2aWRlb19oZWlnaHQ7IHkrKykgewo+ICsJCWlmICh5ID09IDAg fHwgeSA9PSA2NCB8fCB5ID09IDEyOCB8fCB5ID09IDE5MikKPiArCQkJY29udGludWU7Cj4gKwkJ c3dpdGNoICgoeSAvIHRpbGVfaGVpZ2h0KSAlIDQpIHsKPiArCQljYXNlIDA6Cj4gKwkJCXNyY19w dHIgPSByZWRfcHRyOwo+ICsJCQlicmVhazsKPiArCQljYXNlIDE6Cj4gKwkJCXNyY19wdHIgPSBn cmVlbl9wdHI7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgMjoKPiArCQkJc3JjX3B0ciA9IGJsdWVf cHRyOwo+ICsJCQlicmVhazsKPiArCQljYXNlIDM6Cj4gKwkJCXNyY19wdHIgPSB3aGl0ZV9wdHI7 Cj4gKwkJCWJyZWFrOwo+ICsJCX0KPiArCQlkc3RfcHRyID0gZHBfY29ubi0+dGVzdF9wYXR0ZXJu LnBpeG1hcCArICh5ICogdmlkZW9fd2lkdGgpOwo+ICsJCW1lbWNweShkc3RfcHRyLCBzcmNfcHRy LCAodmlkZW9fd2lkdGggKiA0KSk7Cj4gKwl9Cj4gKwltdW5tYXAoZHBfY29ubi0+dGVzdF9wYXR0 ZXJuLnBpeG1hcCwKPiArCSAgICAgICBkcF9jb25uLT50ZXN0X3BhdHRlcm4uc2l6ZSk7Cj4gKwly ZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBzZXRfdGVzdF9tb2RlKHN0cnVjdCBjb25u ZWN0b3IgKmRwX2Nvbm4pCj4gK3sKPiArCWludCByZXQgPSAwOwo+ICsJaW50IGk7Cj4gKwlib29s IGZvdW5kX3N0ZCA9IGZhbHNlLCBmb3VuZF9mcyA9IGZhbHNlOwo+ICsJZHJtTW9kZUNvbm5lY3Rv ciAqYyA9IGRwX2Nvbm4tPmNvbm5lY3RvcjsKPiArCj4gKwkvKiBJZ25vcmUgYW55IGRpc2Nvbm5l Y3RlZCBkZXZpY2VzICovCj4gKwlpZiAoYy0+Y29ubmVjdGlvbiAhPSBEUk1fTU9ERV9DT05ORUNU RUQpIHsKPiArCQlpZ3Rfd2FybigiQ29ubmVjdG9yICV1IGRpc2Nvbm5lY3RlZFxuIiwgYy0+Y29u bmVjdG9yX2lkKTsKPiArCQlyZXR1cm4gLUVOT0VOVDsKPiArCX0KPiArCWlndF9pbmZvKCJDb25u ZWN0b3Igc2V0dXA6XG4iKTsKPiArCS8qIFNldHVwIHByZWZlcnJlZCBtb2RlIC0gc2hvdWxkIGJl IG1vZGVbMF0gaW4gdGhlIGxpc3QgKi8KPiArCWRwX2Nvbm4tPm1vZGVfcHJlZmVycmVkID0gYy0+ bW9kZXNbMF07Cj4gKwlkcF9jb25uLT5mYl93aWR0aCA9IGMtPm1vZGVzWzBdLmhkaXNwbGF5Owo+ ICsJZHBfY29ubi0+ZmJfaGVpZ2h0ID0gYy0+bW9kZXNbMF0udmRpc3BsYXk7Cj4gKwo+ICsJZHBf Y29ubi0+dGVzdF9wYXR0ZXJuLm1vZGUgPSBjLT5tb2Rlc1swXTsKPiArCWRwX2Nvbm4tPnRlc3Rf cGF0dGVybi5tb2RlLmhkaXNwbGF5ID0gYy0+bW9kZXNbMF0uaGRpc3BsYXk7Cj4gKwlkcF9jb25u LT50ZXN0X3BhdHRlcm4ubW9kZS52ZGlzcGxheSA9IGMtPm1vZGVzWzBdLnZkaXNwbGF5Owo+ICsK PiArCWlndF9pbmZvKCJQcmVmZXJyZWQgbW9kZSAobW9kZSAwKSBmb3IgY29ubmVjdG9yICV1IGlz ICV1eCV1XG4iLAo+ICsJCSBkcF9jb25uLT5pZCwgYy0+bW9kZXNbMF0uaGRpc3BsYXksIGMtPm1v ZGVzWzBdLnZkaXNwbGF5KTsKPiArCWZmbHVzaChzdGRpbik7Cj4gKwo+ICsJZm9yIChpID0gMTsg aSA8IGMtPmNvdW50X21vZGVzOyBpKyspIHsKPiArCQkvKiBTdGFuZGFyZCBtb2RlIGlzIDgwMHg2 MDBANjAgKi8KPiArCQlpZiAoYy0+bW9kZXNbaV0uaGRpc3BsYXkgPT0gODAwICYmCj4gKwkJICAg IGMtPm1vZGVzW2ldLnZkaXNwbGF5ID09IDYwMCAmJgo+ICsJCSAgICBjLT5tb2Rlc1tpXS52cmVm cmVzaCA9PSA2MCAmJgo+ICsJCSAgICBmb3VuZF9zdGQgPT0gZmFsc2UpIHsKPiArCQkJZHBfY29u bi0+bW9kZV9zdGFuZGFyZCA9IGMtPm1vZGVzW2ldOwo+ICsJCQlpZ3RfaW5mbygiU3RhbmRhcmQg bW9kZSAoJWQpIGZvciBjb25uZWN0b3IgJXUgaXMgJXV4JXVcbiIsCj4gKwkJCQkgaSwKPiArCQkJ CSBjLT5jb25uZWN0b3JfaWQsCj4gKwkJCQkgYy0+bW9kZXNbaV0uaGRpc3BsYXksCj4gKwkJCQkg Yy0+bW9kZXNbaV0udmRpc3BsYXkpOwo+ICsJCQlmb3VuZF9zdGQgPSB0cnVlOwo+ICsJCX0KPiAr CQkvKiBGYWlsc2FmZSBtb2RlIGlzIDY0MHg0ODBANjAgKi8KPiArCQlpZiAoYy0+bW9kZXNbaV0u aGRpc3BsYXkgPT0gNjQwICYmCj4gKwkJICAgIGMtPm1vZGVzW2ldLnZkaXNwbGF5ID09IDQ4MCAm Jgo+ICsJCSAgICBjLT5tb2Rlc1tpXS52cmVmcmVzaCA9PSA2MCAmJgo+ICsJCSAgICBmb3VuZF9m cyA9PSBmYWxzZSkgewo+ICsJCQlkcF9jb25uLT5tb2RlX2ZhaWxzYWZlID0gYy0+bW9kZXNbaV07 Cj4gKwkJCWRwX2Nvbm4tPmZhaWxzYWZlX3dpZHRoID0gYy0+bW9kZXNbaV0uaGRpc3BsYXk7Cj4g KwkJCWRwX2Nvbm4tPmZhaWxzYWZlX2hlaWdodCA9IGMtPm1vZGVzW2ldLnZkaXNwbGF5Owo+ICsJ CQlpZ3RfaW5mbygiRmFpbHNhZmUgbW9kZSAoJWQpIGZvciBjb25uZWN0b3IgJXUgaXMgJXV4JXVc biIsCj4gKwkJCQkgaSwKPiArCQkJCSBjLT5jb25uZWN0b3JfaWQsCj4gKwkJCQkgYy0+bW9kZXNb aV0uaGRpc3BsYXksCj4gKwkJCQkgYy0+bW9kZXNbaV0udmRpc3BsYXkpOwo+ICsJCQlmb3VuZF9m cyA9IHRydWU7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldCA9IHNldHVwX2ZyYW1lYnVmZmVycyhk cF9jb25uKTsKPiArCWlmIChyZXQpIHsKPiArCQlpZ3Rfd2FybigiQ3JlYXRpbmcgZnJhbWVidWZm ZXIgZm9yIGNvbm5lY3RvciAldSBmYWlsZWQgKCVkKVxuIiwKPiArCQkJIGMtPmNvbm5lY3Rvcl9p ZCwgcmV0KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCWlmIChmb3VuZF9mcykgewo+ ICsJCXJldCA9IHNldHVwX2ZhaWxzYWZlX2ZyYW1lYnVmZmVyKGRwX2Nvbm4pOwo+ICsJCWlmIChy ZXQpIHsKPiArCQkJaWd0X3dhcm4oIkNyZWF0aW5nIGZhaWxzYWZlIGZyYW1lYnVmZmVyIGZvciBj b25uZWN0b3IgJXUgZmFpbGVkICglZClcbiIsCj4gKwkJCQkgYy0+Y29ubmVjdG9yX2lkLCByZXQp Owo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0KPiArCX0KPiArCj4gKwlpZiAodmlkZW9fcGF0dGVy bl9mbGFnKSB7Cj4gKwkJZHBfY29ubi0+dGVzdF9wYXR0ZXJuLmhkaXNwbGF5ID0gaGRpc3BsYXk7 Cj4gKwkJZHBfY29ubi0+dGVzdF9wYXR0ZXJuLnZkaXNwbGF5ID0gdmRpc3BsYXk7Cj4gKwkJZHBf Y29ubi0+dGVzdF9wYXR0ZXJuLmJpdGRlcHRoID0gYml0ZGVwdGg7Cj4gKwo+ICsJCXJldCA9IHNl dHVwX3ZpZGVvX3BhdHRlcm5fZnJhbWVidWZmZXIoZHBfY29ubik7Cj4gKwkJaWYgKHJldCkgewo+ ICsJCQlpZ3Rfd2FybigiQ3JlYXRpbmcgZnJhbWVidWZmZXIgZm9yIGNvbm5lY3RvciAldSBmYWls ZWQgKCVkKVxuIiwKPiArCQkJCSBjLT5jb25uZWN0b3JfaWQsIHJldCk7Cj4gKwkJCXJldHVybiBy ZXQ7Cj4gKwkJfQo+ICsKPiArCQlyZXQgPSBmaWxsX2ZyYW1lYnVmZmVyKGRwX2Nvbm4pOwo+ICsJ CWlmIChyZXQpIHsKPiArCQkJaWd0X3dhcm4oIkZpbGxpbmcgZnJhbWVidWZmZXIgZm9yIGNvbm5l Y3RvciAldSBmYWlsZWQgKCVkKVxuIiwKPiArCQkJCSBjLT5jb25uZWN0b3JfaWQsIHJldCk7Cj4g KwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgc2V0X3ZpZGVvKGludCBtb2RlLCBzdHJ1Y3QgY29ubmVjdG9yICp0ZXN0 X2Nvbm5lY3RvcikKPiArewo+ICsJZHJtTW9kZU1vZGVJbmZvICpyZXF1ZXN0ZWRfbW9kZTsKPiAr CXVpbnQzMl90IHJlcXVpcmVkX2ZiX2lkOwo+ICsJc3RydWN0IGlndF9mYiByZXF1aXJlZF9mYjsK PiArCWludCByZXQgPSAwOwo+ICsKPiArCXN3aXRjaCAobW9kZSkgewo+ICsJY2FzZSBJTlRFTF9N T0RFX05PTkU6Cj4gKwkJaWd0X2luZm8oIk5PTkVcbiIpOwo+ICsJCXJldCA9IGRybU1vZGVTZXRD cnRjKGRybV9mZCwgdGVzdF9jb25uZWN0b3ItPmNydGMsCj4gKwkJCQkgICAgIC0xLCAwLCAwLCBO VUxMLCAwLCBOVUxMKTsKPiArCQlnb3RvIG91dDsKPiArCWNhc2UgSU5URUxfTU9ERV9QUkVGRVJS RUQ6Cj4gKwkJaWd0X2luZm8oIlBSRUZFUlJFRFxuIik7Cj4gKwkJcmVxdWVzdGVkX21vZGUgPSAg JnRlc3RfY29ubmVjdG9yLT5tb2RlX3ByZWZlcnJlZDsKPiArCQlyZXF1aXJlZF9mYl9pZCA9IHRl c3RfY29ubmVjdG9yLT5mYjsKPiArCQlyZXF1aXJlZF9mYiA9IHRlc3RfY29ubmVjdG9yLT5mYl92 aWRlb19wYXR0ZXJuOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBJTlRFTF9NT0RFX1NUQU5EQVJEOgo+ ICsJCWlndF9pbmZvKCJTVEFOREFSRFxuIik7Cj4gKwkJcmVxdWVzdGVkX21vZGUgPSAgJnRlc3Rf Y29ubmVjdG9yLT5tb2RlX3N0YW5kYXJkOwo+ICsJCXJlcXVpcmVkX2ZiX2lkID0gdGVzdF9jb25u ZWN0b3ItPmZiOwo+ICsJCXJlcXVpcmVkX2ZiID0gdGVzdF9jb25uZWN0b3ItPmZiX3ZpZGVvX3Bh dHRlcm47Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIElOVEVMX01PREVfRkFJTFNBRkU6Cj4gKwkJaWd0 X2luZm8oIkZBSUxTQUZFXG4iKTsKPiArCQlyZXF1ZXN0ZWRfbW9kZSA9ICAmdGVzdF9jb25uZWN0 b3ItPm1vZGVfZmFpbHNhZmU7Cj4gKwkJcmVxdWlyZWRfZmJfaWQgPSB0ZXN0X2Nvbm5lY3Rvci0+ ZmFpbHNhZmVfZmI7Cj4gKwkJcmVxdWlyZWRfZmIgPSB0ZXN0X2Nvbm5lY3Rvci0+ZmJfZmFpbHNh ZmVfcGF0dGVybjsKPiArCQlicmVhazsKPiArCWNhc2UgSU5URUxfTU9ERV9WSURFT19QQVRURVJO X1RFU1Q6Cj4gKwkJaWd0X2luZm8oIlZJREVPIFBBVFRFUk4gVEVTVFxuIik7Cj4gKwkJcmVxdWVz dGVkX21vZGUgPSAmdGVzdF9jb25uZWN0b3ItPnRlc3RfcGF0dGVybi5tb2RlOwo+ICsJCXJlcXVp cmVkX2ZiX2lkID0gdGVzdF9jb25uZWN0b3ItPnRlc3RfcGF0dGVybi5mYjsKPiArCQlyZXF1aXJl ZF9mYiA9IHRlc3RfY29ubmVjdG9yLT50ZXN0X3BhdHRlcm4uZmJfcGF0dGVybjsKPiArCQlicmVh azsKPiArCWNhc2UgSU5URUxfTU9ERV9JTlZBTElEOgo+ICsJZGVmYXVsdDoKPiArCQlpZ3Rfd2Fy bigiSU5WQUxJRCEgKCUwOHgpIE1vZGUgc2V0IGFib3J0ZWQhXG4iLCBtb2RlKTsKPiArCQlyZXR1 cm4gLTE7Cj4gKwl9Cj4gKwo+ICsJaWd0X2luZm8oIkNSVEMoJXUpOiIsIHRlc3RfY29ubmVjdG9y LT5jcnRjKTsKPiArCWttc3Rlc3RfZHVtcF9tb2RlKHJlcXVlc3RlZF9tb2RlKTsKPiArCXJldCA9 IGRybU1vZGVTZXRDcnRjKGRybV9mZCwgdGVzdF9jb25uZWN0b3ItPmNydGMsIHJlcXVpcmVkX2Zi X2lkLCAwLCAwLAo+ICsJCQkgICAgICZ0ZXN0X2Nvbm5lY3Rvci0+aWQsIDEsIHJlcXVlc3RlZF9t b2RlKTsKPiArCWlmIChyZXQpIHsKPiArCQlpZ3Rfd2FybigiRmFpbGVkIHRvIHNldCBtb2RlICgl ZHglZEAlZEh6KTogJXNcbiIsCj4gKwkJCSByZXF1ZXN0ZWRfbW9kZS0+aGRpc3BsYXksIHJlcXVl c3RlZF9tb2RlLT52ZGlzcGxheSwKPiArCQkJIHJlcXVlc3RlZF9tb2RlLT52cmVmcmVzaCwgc3Ry ZXJyb3IoZXJybm8pKTsKPiArCQlpZ3RfcmVtb3ZlX2ZiKGRybV9mZCwgJnJlcXVpcmVkX2ZiKTsK PiArCj4gKwl9Cj4gKwkvKiBLZWVwIHRoZSBwYXR0ZXJuIG9uIG91dHB1dCBsaW5lcyBmb3IgMSBz ZWMgZm9yIERQUi0xMjAgdG8gZGV0ZWN0IGl0ICovCj4gKwlzbGVlcCgxKTsKPiArCj4gK291dDoK PiArCWlmIChyZXQpIHsKPiArCQlpZ3Rfd2FybigiRmFpbGVkIHRvIHNldCBDUlRDIGZvciBjb25u ZWN0b3IgJXVcbiIsCj4gKwkJCSB0ZXN0X2Nvbm5lY3Rvci0+aWQpOwo+ICsJfQo+ICsKPiArCXJl dHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQKPiArc2V0X2RlZmF1bHRfbW9kZShzdHJ1 Y3QgY29ubmVjdG9yICpjLCBib29sIHNldF9tb2RlKQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQgZmJf aWQgPSAwOwo+ICsJc3RydWN0IGlndF9mYiBmYl9pbmZvOwo+ICsJaW50IHJldCA9IDA7Cj4gKwo+ ICsJaWYgKCFzZXRfbW9kZSkgewo+ICsJCXJldCA9IGRybU1vZGVTZXRDcnRjKGRybV9mZCwgYy0+ Y3J0YywgMCwgMCwgMCwKPiArCQkJCSAgICAgTlVMTCwgMCwgTlVMTCk7Cj4gKwkJaWYgKHJldCkK PiArCQkJaWd0X3dhcm4oIkZhaWxlZCB0byB1bnNldCBtb2RlIik7Cj4gKwkJcmV0dXJuIHJldDsK PiArCX0KPiArCj4gKwljLT5tb2RlID0gYy0+Y29ubmVjdG9yLT5tb2Rlc1swXTsKPiArCj4gKwl3 aWR0aCA9IGMtPm1vZGUuaGRpc3BsYXk7Cj4gKwloZWlnaHQgPSBjLT5tb2RlLnZkaXNwbGF5Owo+ ICsKPiArCWZiX2lkID0gaWd0X2NyZWF0ZV9wYXR0ZXJuX2ZiKGRybV9mZCwgd2lkdGgsIGhlaWdo dCwKPiArCQkJCSAgICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCj4gKwkJCQkgICAgICB0aWxpbmcs ICZmYl9pbmZvKTsKPiArCj4gKwlpZ3RfaW5mbygiQ1JUQygldSk6WyVkXSIsIGMtPmNydGMsIDAp Owo+ICsJa21zdGVzdF9kdW1wX21vZGUoJmMtPm1vZGUpOwo+ICsJZHJtTW9kZVNldENydGMoZHJt X2ZkLCBjLT5jcnRjLCAtMSwgMCwgMCwgTlVMTCwgMCwgTlVMTCk7Cj4gKwlyZXQgPSBkcm1Nb2Rl U2V0Q3J0Yyhkcm1fZmQsIGMtPmNydGMsIGZiX2lkLCAwLCAwLAo+ICsJCQkgICAgICZjLT5pZCwg MSwgJmMtPm1vZGUpOwo+ICsJaWYgKHJldCkgewo+ICsJCWlndF93YXJuKCJGYWlsZWQgdG8gc2V0 IG1vZGUgKCVkeCVkQCVkSHopOiAlc1xuIiwKPiArCQkJIHdpZHRoLCBoZWlnaHQsIGMtPm1vZGUu dnJlZnJlc2gsIHN0cmVycm9yKGVycm5vKSk7Cj4gKwkJaWd0X3JlbW92ZV9mYihkcm1fZmQsICZm Yl9pbmZvKTsKPiArCj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGlj IHVpbnQzMl90IGZpbmRfY3J0Y19mb3JfY29ubmVjdG9yKGRybU1vZGVDb25uZWN0b3IgKmMpCj4g K3sKPiArCWRybU1vZGVFbmNvZGVyICplOwo+ICsJdWludDMyX3QgcG9zc2libGVfY3J0Y3M7Cj4g KwlpbnQgaSwgajsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgYy0+Y291bnRfZW5jb2RlcnM7IGkr Kykgewo+ICsJCWUgPSBkcm1Nb2RlR2V0RW5jb2Rlcihkcm1fZmQsIGMtPmVuY29kZXJzW2ldKTsK PiArCQlwb3NzaWJsZV9jcnRjcyA9IGUtPnBvc3NpYmxlX2NydGNzOwo+ICsJCWRybU1vZGVGcmVl RW5jb2RlcihlKTsKPiArCj4gKwkJZm9yIChqID0gMDsgcG9zc2libGVfY3J0Y3MgPj4gajsgaisr KQo+ICsJCQlpZiAocG9zc2libGVfY3J0Y3MgJiAoMSA8PCBqKSkKPiArCQkJCXJldHVybiByZXNv dXJjZXMtPmNydGNzW2pdOwo+ICsJfQo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gKy8qCj4gKyAq IFJlLXByb2JlIGNvbm5lY3RvcnMgYW5kIGRvIGEgbW9kZXNldCBiYXNlZCBvbiB0ZXN0IHJlcXVl c3Qgb3IKPiArICogaW4gY2FzZSBvZiBhIGhvdHBsdWcgdWV2ZW50Lgo+ICsgKgo+ICsgKiBAbW9k ZTogVmlkZW8gbW9kZSByZXF1ZXN0ZWQgYnkgdGhlIHRlc3QKPiArICogQGlzX2NvbXBsaWFuY2Vf dGVzdDogMTogSWYgaXQgaXMgYSBjb21wbGlhbmNlIHRlc3QKPiArICogICAgICAgICAgICAgICAg ICAgICAgMDogSWYgaXQgaXMgYSBob3RwbHVnIGV2ZW50Cj4gKyAqCj4gKyAqIFJldHVybnM6Cj4g KyAqIDA6IE9uIFN1Y2Nlc3MKPiArICogLTE6IE9uIGZhaWx1cmUKPiArICovCj4gK2ludCB1cGRh dGVfZGlzcGxheShpbnQgbW9kZSwgYm9vbCBpc19jb21wbGlhbmNlX3Rlc3QpCj4gK3sKPiArCXN0 cnVjdCBjb25uZWN0b3IgKmNvbm5lY3RvcnMsICpjb25uOwo+ICsJaW50IGNudCwgcmV0ID0gMDsK PiArCWJvb2wgc2V0X21vZGU7Cj4gKwo+ICsJcmVzb3VyY2VzID0gZHJtTW9kZUdldFJlc291cmNl cyhkcm1fZmQpOwo+ICsJaWYgKCFyZXNvdXJjZXMpIHsKPiArCQlpZ3Rfd2FybigiZHJtTW9kZUdl dFJlc291cmNlcyBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwo+ICsJCXJldHVybiAt MTsKPiArCX0KPiArCj4gKwljb25uZWN0b3JzID0gY2FsbG9jKHJlc291cmNlcy0+Y291bnRfY29u bmVjdG9ycywKPiArCQkJICAgIHNpemVvZihzdHJ1Y3QgY29ubmVjdG9yKSk7Cj4gKwlpZiAoIWNv bm5lY3RvcnMpCj4gKwkJcmV0dXJuIC0xOwo+ICsKPiArCS8qIEZpbmQgYW55IGNvbm5lY3RlZCBk aXNwbGF5cyAqLwo+ICsJZm9yIChjbnQgPSAwOyBjbnQgPCByZXNvdXJjZXMtPmNvdW50X2Nvbm5l Y3RvcnM7IGNudCsrKSB7Cj4gKwkJZHJtTW9kZUNvbm5lY3RvciAqYzsKPiArCj4gKwkJY29ubiA9 ICZjb25uZWN0b3JzW2NudF07Cj4gKwkJY29ubi0+aWQgPSByZXNvdXJjZXMtPmNvbm5lY3RvcnNb Y250XTsKPiArCQljID0gZHJtTW9kZUdldENvbm5lY3Rvcihkcm1fZmQsIGNvbm4tPmlkKTsKPiAr CQlpZiAoYy0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0 ICYmCj4gKwkJICAgIGMtPmNvbm5lY3Rpb24gPT0gRFJNX01PREVfQ09OTkVDVEVEKSB7Cj4gKwkJ CXRlc3RfY29ubmVjdG9yX2lkID0gYy0+Y29ubmVjdG9yX2lkOwo+ICsJCQljb25uLT5jb25uZWN0 b3IgPSBjOwo+ICsJCQljb25uLT5jcnRjID0gZmluZF9jcnRjX2Zvcl9jb25uZWN0b3IoYyk7Cj4g KwkJCXRlc3RfY3J0YyA9IGNvbm4tPmNydGM7Cj4gKwkJCXNldF9tb2RlID0gdHJ1ZTsKPiArCQkJ YnJlYWs7Cj4gKwkJfSBlbHNlIGlmIChjLT5jb25uZWN0b3JfaWQgPT0gdGVzdF9jb25uZWN0b3Jf aWQgJiYKPiArCQkJICAgYy0+Y29ubmVjdGlvbiA9PSBEUk1fTU9ERV9ESVNDT05ORUNURUQpIHsK PiArCQkJY29ubi0+Y29ubmVjdG9yID0gYzsKPiArCQkJY29ubi0+Y3J0YyA9IHRlc3RfY3J0YzsK PiArCQkJc2V0X21vZGUgPSBmYWxzZTsKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJfQo+ICsKPiAr CWlmIChjbnQgPT0gcmVzb3VyY2VzLT5jb3VudF9jb25uZWN0b3JzKSB7Cj4gKwkJcmV0ID0gLTE7 Cj4gKwkJZ290byBlcnI7Cj4gKwl9Cj4gKwo+ICsJaWYgKGlzX2NvbXBsaWFuY2VfdGVzdCkgewo+ ICsJCXNldF90ZXN0X21vZGUoY29ubik7Cj4gKwkJcmV0ID0gc2V0X3ZpZGVvKElOVEVMX01PREVf Tk9ORSwgY29ubik7Cj4gKwkJcmV0ID0gc2V0X3ZpZGVvKG1vZGUsIGNvbm4pOwo+ICsKPiArCX0g ZWxzZQo+ICsJCXJldCA9IHNldF9kZWZhdWx0X21vZGUoY29ubiwgc2V0X21vZGUpOwo+ICsKPiAr IGVycjoKPiArCWRybU1vZGVGcmVlQ29ubmVjdG9yKGNvbm4tPmNvbm5lY3Rvcik7Cj4gKwkvKiBF cnJvciBjb25kaXRpb24gaWYgbm8gY29ubmVjdGVkIGRpc3BsYXlzICovCj4gKwlmcmVlKGNvbm5l Y3RvcnMpOwo+ICsJZHJtTW9kZUZyZWVSZXNvdXJjZXMocmVzb3VyY2VzKTsKPiArCXJldHVybiBy ZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBjaGFyIG9wdHN0cltdID0gImhpIjsKPiArCj4g K3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkgdXNhZ2UoY2hhciAqbmFtZSwg Y2hhciBvcHQpCj4gK3sKPiArCWlndF9pbmZvKCJ1c2FnZTogJXMgWy1oaV1cbiIsIG5hbWUpOwo+ ICsJaWd0X2luZm8oIlx0LWlcdGR1bXAgaW5mb1xuIik7Cj4gKwlpZ3RfaW5mbygiXHREZWZhdWx0 IGlzIHRvIHJlc3BvbmQgdG8gRFBSLTEyMCB0ZXN0c1xuIik7Cj4gKwlleGl0KChvcHQgIT0gJ2gn KSA/IC0xIDogMCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGNsZWFudXBfZGVidWdmcyh2b2lk KQo+ICt7Cj4gKwlmY2xvc2UodGVzdF9hY3RpdmVfZnApOwo+ICsJZmNsb3NlKHRlc3RfZGF0YV9m cCk7Cj4gKwlmY2xvc2UodGVzdF90eXBlX2ZwKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgX19h dHRyaWJ1dGVfXygobm9yZXR1cm4pKSBjbGVhbnVwX2FuZF9leGl0KGludCByZXQpCj4gK3sKPiAr CWNsZWFudXBfZGVidWdmcygpOwo+ICsJY2xvc2UoZHJtX2ZkKTsKPiArCWlndF9pbmZvKCJDb21w bGlhbmNlIHRlc3RpbmcgYXBwbGljYXRpb24gZXhpdGluZ1xuIik7Cj4gKwlleGl0KHJldCk7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIGNsZWFudXBfdGVzdCh2b2lkKQo+ICt7Cj4gKwl2aWRlb19w YXR0ZXJuX2ZsYWcgPSBmYWxzZTsKPiArCWhkaXNwbGF5ID0gMDsKPiArCXZkaXNwbGF5ID0gMDsK PiArCWJpdGRlcHRoID0gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmVhZF90ZXN0X3JlcXVl c3Qodm9pZCkKPiArewo+ICsJdW5zaWduZWQgbG9uZyB0ZXN0X3R5cGU7Cj4gKwo+ICsJdGVzdF90 eXBlID0gZ2V0X3Rlc3RfdHlwZSgpOwo+ICsJcHJvY2Vzc190ZXN0X3JlcXVlc3QodGVzdF90eXBl KTsKPiArCWNsZWFudXBfdGVzdCgpOwo+ICsJY2xlYXJfdGVzdF9hY3RpdmUoKTsKPiArfQo+ICsK PiArc3RhdGljIGdib29sZWFuIHRlc3RfaGFuZGxlcihHSU9DaGFubmVsICpzb3VyY2UsIEdJT0Nv bmRpdGlvbiBjb25kaXRpb24sCj4gKwkJCSAgICAgZ3BvaW50ZXIgZGF0YSkKPiArewo+ICsJdW5z aWduZWQgbG9uZyB0ZXN0X2FjdGl2ZTsKPiArCWludCByZXQ7Cj4gKwo+ICsJcmV3aW5kKHRlc3Rf YWN0aXZlX2ZwKTsKPiArCj4gKwlyZXQgPSBmc2NhbmYodGVzdF9hY3RpdmVfZnAsICIlbHgiLCAm dGVzdF9hY3RpdmUpOwo+ICsJaWYgKHJldCA8IDEpCj4gKwkJcmV0dXJuIEZBTFNFOwo+ICsKPiAr CWlmICh0ZXN0X2FjdGl2ZSkKPiArCQlyZWFkX3Rlc3RfcmVxdWVzdCgpOwo+ICsJcmV0dXJuIFRS VUU7Cj4gK30KPiArCj4gK3N0YXRpYyBnYm9vbGVhbiBpbnB1dF9ldmVudChHSU9DaGFubmVsICpz b3VyY2UsIEdJT0NvbmRpdGlvbiBjb25kaXRpb24sCj4gKwkJCQlncG9pbnRlciBkYXRhKQo+ICt7 Cj4gKwlnY2hhciBidWZbMl07Cj4gKwlnc2l6ZSBjb3VudDsKPiArCj4gKwljb3VudCA9IHJlYWQo Z19pb19jaGFubmVsX3VuaXhfZ2V0X2ZkKHNvdXJjZSksIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwo+ICsJ aWYgKGJ1ZlswXSA9PSAncScgJiYgKGNvdW50ID09IDEgfHwgYnVmWzFdID09ICdcbicpKSB7Cj4g KwkJY2xlYW51cF9hbmRfZXhpdCgwKTsKPiArCX0KPiArCj4gKwlyZXR1cm4gVFJVRTsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgZW50ZXJfZXhlY19wYXRoKGNoYXIgKiphcmd2KQo+ICt7Cj4gKwlj aGFyICpleGVjX3BhdGggPSBOVUxMOwo+ICsJY2hhciAqcG9zID0gTlVMTDsKPiArCXNob3J0IGxl bl9wYXRoID0gMDsKPiArCWludCByZXQ7Cj4gKwo+ICsJbGVuX3BhdGggPSBzdHJsZW4oYXJndlsw XSk7Cj4gKwlleGVjX3BhdGggPSAoY2hhciAqKSBtYWxsb2MobGVuX3BhdGgpOwo+ICsKPiArCW1l bWNweShleGVjX3BhdGgsIGFyZ3ZbMF0sIGxlbl9wYXRoKTsKPiArCXBvcyA9IHN0cnJjaHIoZXhl Y19wYXRoLCAnLycpOwo+ICsJaWYgKHBvcyAhPSBOVUxMKQo+ICsJCSoocG9zKzEpID0gJ1wwJzsK PiArCj4gKwlyZXQgPSBjaGRpcihleGVjX3BhdGgpOwo+ICsJaWd0X2Fzc2VydF9lcShyZXQsIDAp Owo+ICsJZnJlZShleGVjX3BhdGgpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCByZXN0b3JlX3Rl cm1pb19tb2RlKGludCBzaWcpCj4gK3sKPiArCXRjc2V0YXR0cih0aW9fZmQsIFRDU0FOT1csICZz YXZlZF90aW8pOwo+ICsJY2xvc2UodGlvX2ZkKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgc2V0 X3Rlcm1pb19tb2RlKHZvaWQpCj4gK3sKPiArCXN0cnVjdCB0ZXJtaW9zIHRpbzsKPiArCj4gKwkv KiBkb24ndCBhdHRlbXB0IHRvIHNldCB0ZXJtaW5hbCBhdHRyaWJ1dGVzIGlmIG5vdCBpbiB0aGUg Zm9yZWdyb3VuZAo+ICsJICogcHJvY2VzcyBncm91cAo+ICsJICovCj4gKwlpZiAoZ2V0cGdycCgp ICE9IHRjZ2V0cGdycChTVERPVVRfRklMRU5PKSkKPiArCQlyZXR1cm47Cj4gKwo+ICsJdGlvX2Zk ID0gZHVwKFNURElOX0ZJTEVOTyk7Cj4gKwl0Y2dldGF0dHIodGlvX2ZkLCAmc2F2ZWRfdGlvKTsK PiArCWlndF9pbnN0YWxsX2V4aXRfaGFuZGxlcihyZXN0b3JlX3Rlcm1pb19tb2RlKTsKPiArCXRp byA9IHNhdmVkX3RpbzsKPiArCXRpby5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7Cj4gKwl0 Y3NldGF0dHIodGlvX2ZkLCBUQ1NBTk9XLCAmdGlvKTsKPiArfQo+ICsKPiAraW50IG1haW4oaW50 IGFyZ2MsIGNoYXIgKiphcmd2KQo+ICt7Cj4gKwlpbnQgYzsKPiArCWludCByZXQgPSAwOwo+ICsJ R0lPQ2hhbm5lbCAqc3RkaW5jaGFubmVsLCAqdGVzdGFjdGl2ZV9jaGFubmVsOwo+ICsJR01haW5M b29wICptYWlubG9vcDsKPiArCWJvb2wgb3B0X2R1bXBfaW5mbyA9IGZhbHNlOwo+ICsJc3RydWN0 IG9wdGlvbiBsb25nX29wdHNbXSA9IHsKPiArCQl7ImhlbHAtZGVzY3JpcHRpb24iLCAwLCAwLCBI RUxQX0RFU0NSSVBUSU9OfSwKPiArCQl7ImhlbHAiLCAwLCAwLCAnaCd9LAo+ICsJfTsKPiArCj4g KwlpZ3Rfc2tpcF9vbl9zaW11bGF0aW9uKCk7Cj4gKwo+ICsJZW50ZXJfZXhlY19wYXRoKGFyZ3Yp Owo+ICsKPiArCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIG9wdHN0ciwgbG9u Z19vcHRzLCBOVUxMKSkgIT0gLTEpIHsKPiArCQlzd2l0Y2ggKGMpIHsKPiArCQljYXNlICdpJzoK PiArCQkJb3B0X2R1bXBfaW5mbyA9IHRydWU7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgSEVMUF9E RVNDUklQVElPTjoKPiArCQkJaWd0X2luZm8oIkRQIENvbXBsaWFuY2UgVGVzdCBTdWl0ZSB1c2lu ZyBEUFItMTIwXG4iKTsKPiArCQkJaWd0X2luZm8oIkVESUQgdGVzdHNcbiIpOwo+ICsJCQlpZ3Rf aW5mbygiVmlkZW8gUGF0dGVybiBHZW5lcmF0aW9uIHRlc3RzXG4iKTsKPiArCQkJZXhpdCgwKTsK PiArCQkJYnJlYWs7Cj4gKwkJZGVmYXVsdDoKPiArCQkJLyogZmFsbCB0aHJvdWdoICovCj4gKwkJ Y2FzZSAnaCc6Cj4gKwkJCXVzYWdlKGFyZ3ZbMF0sIGMpOwo+ICsJCQlicmVhazsKPiArCQl9Cj4g Kwl9Cj4gKwo+ICsJc2V0X3Rlcm1pb19tb2RlKCk7Cj4gKwo+ICsJaWd0X2luZm8oIioqKioqKioq KioqKipEUCBDb21wbGlhbmNlIFRlc3RpbmcgdXNpbmcgRFBSLTEyMCoqKioqKioqKioqKipcbiIp Owo+ICsJaWd0X2luZm8oIldhaXRpbmcgZm9yIHRlc3QgcmVxdWVzdC4uLi4uLlxuIik7CgoKVGhp cyBwcmludG91dCBjb3VsZCBiZSBtb3ZlZCBiZWxvdyBhbGwgdGhlIHJlcXVpcmVkIHNldHVwIHRo YXQgaGFwcGVucyBiZWxvdy4uLgoKCj4gKwlkcm1fZmQgPSBkcm1fb3Blbl9kcml2ZXIoRFJJVkVS X0FOWSk7Cj4gKwo+ICsJa21zdGVzdF9zZXRfdnRfZ3JhcGhpY3NfbW9kZSgpOwo+ICsJc2V0dXBf ZGVidWdmc19maWxlcygpOwo+ICsJY2xlYW51cF90ZXN0KCk7Cj4gKwo+ICsJaWYgKG9wdF9kdW1w X2luZm8pIHsKPiArCQlkdW1wX2luZm8oKTsKPiArCQlnb3RvIG91dF9jbG9zZTsKPiArCX0KPiAr Cj4gKwkvKiBHZXQgdGhlIERQIGNvbm5lY3RvciBJRCBhbmQgQ1JUQyAqLwo+ICsJaWYgKHVwZGF0 ZV9kaXNwbGF5KDAsIGZhbHNlKSkgewo+ICsJCWlndF93YXJuKCJGYWlsZWQgdG8gc2V0IGRlZmF1 bHQgbW9kZVxuIik7Cj4gKwkJcmV0ID0gLTE7Cj4gKwkJZ290byBvdXRfY2xvc2U7Cj4gKwl9Cj4g Kwo+ICsJbWFpbmxvb3AgPSBnX21haW5fbG9vcF9uZXcoTlVMTCwgRkFMU0UpOwo+ICsJaWYgKCFt YWlubG9vcCkgewo+ICsJCWlndF93YXJuKCJGYWlsZWQgdG8gY3JlYXRlIEdNYWluTG9vcFxuIik7 Cj4gKwkJcmV0ID0gLTE7Cj4gKwkJZ290byBvdXRfY2xvc2U7Cj4gKwl9Cj4gKwo+ICsJaWYgKCFp bnRlbF9kcF9jb21wbGlhbmNlX3NldHVwX2hvdHBsdWcoKSkgewo+ICsJCWlndF93YXJuKCJGYWls ZWQgdG8gaW5pdGlhbGl6ZSBob3RwbHVnIHN1cHBvcnRcbiIpOwo+ICsJCWdvdG8gb3V0X21haW5s b29wOwo+ICsJfQo+ICsKPiArCXRlc3RhY3RpdmVfY2hhbm5lbCA9IGdfaW9fY2hhbm5lbF91bml4 X25ldyhmaWxlbm8odGVzdF9hY3RpdmVfZnApKTsKPiArCWlmICghdGVzdGFjdGl2ZV9jaGFubmVs KSB7Cj4gKwkJaWd0X3dhcm4oIkZhaWxlZCB0byBjcmVhdGUgdGVzdF9hY3RpdmUgR0lPQ2hhbm5l bFxuIik7Cj4gKwkJZ290byBvdXRfY2xvc2U7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZ19pb19hZGRf d2F0Y2godGVzdGFjdGl2ZV9jaGFubmVsLCBHX0lPX0lOIHwgR19JT19FUlIsCj4gKwkJCSAgICAg dGVzdF9oYW5kbGVyLCBOVUxMKTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJaWd0X3dhcm4oIkZh aWxlZCB0byBhZGQgd2F0Y2ggb24gdWRldiBHSU9DaGFubmVsXG4iKTsKPiArCQlnb3RvIG91dF9j bG9zZTsKPiArCX0KPiArCj4gKwlzdGRpbmNoYW5uZWwgPSBnX2lvX2NoYW5uZWxfdW5peF9uZXco MCk7Cj4gKwlpZiAoIXN0ZGluY2hhbm5lbCkgewo+ICsJCWlndF93YXJuKCJGYWlsZWQgdG8gY3Jl YXRlIHN0ZGluIEdJT0NoYW5uZWxcbiIpOwo+ICsJCWdvdG8gb3V0X2hvdHBsdWc7Cj4gKwl9Cj4g Kwo+ICsJcmV0ID0gZ19pb19hZGRfd2F0Y2goc3RkaW5jaGFubmVsLCBHX0lPX0lOIHwgR19JT19F UlIsIGlucHV0X2V2ZW50LAo+ICsJCQkgICAgIE5VTEwpOwo+ICsJaWYgKHJldCA8IDApIHsKPiAr CQlpZ3Rfd2FybigiRmFpbGVkIHRvIGFkZCB3YXRjaCBvbiBzdGRpbiBHSU9DaGFubmVsXG4iKTsK PiArCQlnb3RvIG91dF9zdGRpbzsKPiArCX0KPiArCj4gKwlyZXQgPSAwOwoKCi4uLiB0byBoZXJl IG1heWJlLgoKPiArCj4gKwlnX21haW5fbG9vcF9ydW4obWFpbmxvb3ApOwo+ICsKPiArb3V0X3N0 ZGlvOgo+ICsJZ19pb19jaGFubmVsX3NodXRkb3duKHN0ZGluY2hhbm5lbCwgVFJVRSwgTlVMTCk7 Cj4gK291dF9ob3RwbHVnOgo+ICsJaW50ZWxfZHBfY29tcGxpYW5jZV9jbGVhbnVwX2hvdHBsdWco KTsKPiArb3V0X21haW5sb29wOgo+ICsJZ19tYWluX2xvb3BfdW5yZWYobWFpbmxvb3ApOwo+ICtv dXRfY2xvc2U6Cj4gKwljbGVhbnVwX2RlYnVnZnMoKTsKPiArCWNsb3NlKGRybV9mZCk7Cj4gKwo+ ICsJaWd0X2Fzc2VydF9lcShyZXQsIDApOwo+ICsKPiArCWlndF9pbmZvKCJDb21wbGlhbmNlIHRl c3RpbmcgYXBwbGljYXRpb24gZXhpdGluZ1xuIik7Cj4gKwlpZ3RfZXhpdCgpOwo+ICt9Cj4gZGlm ZiAtLWdpdCBhL3Rvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2UuaCBiL3Rvb2xzL2ludGVsX2RwX2Nv bXBsaWFuY2UuaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uNTBhOTY2 Mgo+IC0tLSAvZGV2L251bGwKPiArKysgYi90b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmgKPiBA QCAtMCwwICsxLDM1IEBACj4gKy8qCj4gKyAqIENvcHlyaWdodCAyMDE3IEludGVsIENvcnBvcmF0 aW9uCj4gKyAqIE1hbmFzaSBOYXZhcmUgPG1hbmFzaS5kLm5hdmFyZUBpbnRlbC5jb20+Cj4gKyAq Cj4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBh bnkgcGVyc29uIG9idGFpbmluZyBhCj4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNz b2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCj4gKyAqIHRvIGRl YWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0 IGxpbWl0YXRpb24KPiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2Us IHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCj4gKyAqIGFuZC9vciBzZWxsIGNvcGll cyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+ICsg KiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2lu ZyBjb25kaXRpb25zOgo+ICsgKgo+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQg dGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+ICsgKiBhbGwgY29w aWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiArICoKPiArICog VEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5Z IEtJTkQsIEVYUFJFU1MgT1IKPiArICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRF RCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gKyAqIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNI QUxMIFRIRQo+ICsgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1Ig QU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBB TiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCj4gKyAqIEZS T00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0Ug T1IgT1RIRVIgREVBTElOR1MKPiArICogSU4gVEhFIFNPRlRXQVJFLgo+ICsgKi8KPiArCj4gKyNp bmNsdWRlIDxzdGRpby5oPgo+ICsjaW5jbHVkZSA8c3RyaW5nLmg+Cj4gKyNpbmNsdWRlIDxzdGRs aWIuaD4KPiArI2luY2x1ZGUgPGdsaWIuaD4KPiArCj4gK2V4dGVybiBpbnQgZHJtX2ZkOwo+ICsK PiArZ2Jvb2xlYW4gaW50ZWxfZHBfY29tcGxpYW5jZV9zZXR1cF9ob3RwbHVnKHZvaWQpOwo+ICt2 b2lkIGludGVsX2RwX2NvbXBsaWFuY2VfY2xlYW51cF9ob3RwbHVnKHZvaWQpOwo+ICsKPiArLyog Y2FsbGVkIGJ5IHRoZSBob3RwbHVnIGNvZGUgKi8KPiAraW50IHVwZGF0ZV9kaXNwbGF5KGludCBt b2RlLCBib29sIGlzX2NvbXBsaWFuY2VfdGVzdCk7Cj4gZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVs X2RwX2NvbXBsaWFuY2VfaG90cGx1Zy5jIGIvdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZV9ob3Rw bHVnLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLmI1N2Y4YTIKPiAt LS0gL2Rldi9udWxsCj4gKysrIGIvdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZV9ob3RwbHVnLmMK PiBAQCAtMCwwICsxLDEyNCBAQAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgMjAxNyBJbnRlbCBDb3Jw b3JhdGlvbgo+ICsgKiAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KPiAr ICogICBNYW5hc2kgTmF2YXJlIDxtYW5hc2kuZC5uYXZhcmVAaW50ZWwuY29tPgo+ICsgKgo+ICsg KiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBl cnNvbiBvYnRhaW5pbmcgYQo+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0 ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAo+ICsgKiB0byBkZWFsIGlu IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1p dGF0aW9uCj4gKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJs aXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAo+ICsgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2Yg dGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKPiArICogU29m dHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29u ZGl0aW9uczoKPiArICoKPiArICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMg cGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiArICogYWxsIGNvcGllcyBv ciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4gKyAqCj4gKyAqIFRIRSBT T0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5E LCBFWFBSRVNTIE9SCj4gKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8g VEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+ICsgKiBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBU SEUKPiArICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBD TEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+ICsgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNU SU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+ICsgKiBGUk9NLCBP VVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9U SEVSIERFQUxJTkdTCj4gKyAqIElOIFRIRSBTT0ZUV0FSRS4KPiArICovCj4gKwo+ICsjaW5jbHVk ZSAiaWd0LmgiCj4gKyNpbmNsdWRlIDxzdGRpby5oPgo+ICsjaW5jbHVkZSA8c3RyaW5nLmg+Cj4g KyNpbmNsdWRlIDxzdGRsaWIuaD4KPiArCj4gKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgo+ICsKPiAr I2luY2x1ZGUgImludGVsX2RwX2NvbXBsaWFuY2UuaCIKPiArI2luY2x1ZGUgPGxpYnVkZXYuaD4K PiArc3RhdGljIHN0cnVjdCB1ZGV2X21vbml0b3IgKnVldmVudF9tb25pdG9yOwo+ICtzdGF0aWMg c3RydWN0IHVkZXYgKnVkZXY7Cj4gK3N0YXRpYyBHSU9DaGFubmVsICp1ZGV2Y2hhbm5lbDsKPiAr Cj4gK3N0YXRpYyBnYm9vbGVhbiBob3RwbHVnX2V2ZW50KEdJT0NoYW5uZWwgKnNvdXJjZSwgR0lP Q29uZGl0aW9uIGNvbmRpdGlvbiwKPiArCQkJICAgICAgZ3BvaW50ZXIgZGF0YSkKPiArewo+ICsJ c3RydWN0IHVkZXZfZGV2aWNlICpkZXY7Cj4gKwlkZXZfdCB1ZGV2X2Rldm51bTsKPiArCXN0cnVj dCBzdGF0IHM7Cj4gKwljb25zdCBjaGFyICpob3RwbHVnOwo+ICsKPiArCWRldiA9IHVkZXZfbW9u aXRvcl9yZWNlaXZlX2RldmljZSh1ZXZlbnRfbW9uaXRvcik7Cj4gKwlpZiAoIWRldikKPiArCQln b3RvIG91dDsKPiArCj4gKwl1ZGV2X2Rldm51bSA9IHVkZXZfZGV2aWNlX2dldF9kZXZudW0oZGV2 KTsKPiArCWZzdGF0KGRybV9mZCwgJnMpOwo+ICsKPiArCWhvdHBsdWcgPSB1ZGV2X2RldmljZV9n ZXRfcHJvcGVydHlfdmFsdWUoZGV2LCAiSE9UUExVRyIpOwo+ICsKPiArCWlmIChtZW1jbXAoJnMu c3RfcmRldiwgJnVkZXZfZGV2bnVtLCBzaXplb2YoZGV2X3QpKSA9PSAwICYmCj4gKwkgICAgaG90 cGx1ZyAmJiBhdG9pKGhvdHBsdWcpID09IDEpCj4gKwkJdXBkYXRlX2Rpc3BsYXkoMCwgZmFsc2Up Owo+ICsKPiArCXVkZXZfZGV2aWNlX3VucmVmKGRldik7Cj4gK291dDoKPiArCXJldHVybiBUUlVF Owo+ICt9Cj4gKwo+ICsKPiArZ2Jvb2xlYW4gaW50ZWxfZHBfY29tcGxpYW5jZV9zZXR1cF9ob3Rw bHVnKHZvaWQpCj4gK3sKPiArCWludCByZXQ7Cj4gKwo+ICsJdWRldiA9IHVkZXZfbmV3KCk7Cj4g KwlpZiAoIXVkZXYpIHsKPiArCQlpZ3Rfd2FybigiRmFpbGVkIHRvIGNyZWF0ZSB1ZGV2IG9iamVj dFxuIik7Cj4gKwkJZ290byBvdXQ7Cj4gKwl9Cj4gKwo+ICsJdWV2ZW50X21vbml0b3IgPSB1ZGV2 X21vbml0b3JfbmV3X2Zyb21fbmV0bGluayh1ZGV2LCAidWRldiIpOwo+ICsJaWYgKCF1ZXZlbnRf bW9uaXRvcikgewo+ICsJCWlndF93YXJuKCJGYWlsZWQgdG8gY3JlYXRlIHVkZXYgZXZlbnQgbW9u aXRvclxuIik7Cj4gKwkJZ290byBvdXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gdWRldl9tb25pdG9y X2ZpbHRlcl9hZGRfbWF0Y2hfc3Vic3lzdGVtX2RldnR5cGUodWV2ZW50X21vbml0b3IsCj4gKwkJ CQkJCQkgICAgICAiZHJtIiwKPiArCQkJCQkJCSAgICAgICJkcm1fbWlub3IiKTsKPiArCWlmIChy ZXQgPCAwKSB7Cj4gKwkJaWd0X3dhcm4oIkZhaWxlZCB0byBmaWx0ZXIgZm9yIGRybSBldmVudHNc biIpOwo+ICsJCWdvdG8gb3V0Owo+ICsJfQo+ICsKPiArCXJldCA9IHVkZXZfbW9uaXRvcl9lbmFi bGVfcmVjZWl2aW5nKHVldmVudF9tb25pdG9yKTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJaWd0 X3dhcm4oIkZhaWxlZCB0byBlbmFibGUgdWRldiBldmVudCByZWNlcHRpb25cbiIpOwo+ICsJCWdv dG8gb3V0Owo+ICsJfQo+ICsKPiArCXVkZXZjaGFubmVsID0KPiArCQlnX2lvX2NoYW5uZWxfdW5p eF9uZXcodWRldl9tb25pdG9yX2dldF9mZCh1ZXZlbnRfbW9uaXRvcikpOwo+ICsJaWYgKCF1ZGV2 Y2hhbm5lbCkgewo+ICsJCWlndF93YXJuKCJGYWlsZWQgdG8gY3JlYXRlIHVkZXYgR0lPQ2hhbm5l bFxuIik7Cj4gKwkJZ290byBvdXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZ19pb19hZGRfd2F0Y2go dWRldmNoYW5uZWwsIEdfSU9fSU4gfCBHX0lPX0VSUiwgaG90cGx1Z19ldmVudCwKPiArCQkJICAg ICB1ZGV2KTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJaWd0X3dhcm4oIkZhaWxlZCB0byBhZGQg d2F0Y2ggb24gdWRldiBHSU9DaGFubmVsXG4iKTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4g KwlyZXR1cm4gVFJVRTsKPiArCj4gK291dDoKPiArCWludGVsX2RwX2NvbXBsaWFuY2VfY2xlYW51 cF9ob3RwbHVnKCk7Cj4gKwlyZXR1cm4gRkFMU0U7Cj4gK30KPiArCj4gK3ZvaWQgaW50ZWxfZHBf Y29tcGxpYW5jZV9jbGVhbnVwX2hvdHBsdWcodm9pZCkKPiArewo+ICsJaWYgKHVkZXZjaGFubmVs KQo+ICsJCWdfaW9fY2hhbm5lbF9zaHV0ZG93bih1ZGV2Y2hhbm5lbCwgVFJVRSwgTlVMTCk7Cj4g KwlpZiAodWV2ZW50X21vbml0b3IpCj4gKwkJdWRldl9tb25pdG9yX3VucmVmKHVldmVudF9tb25p dG9yKTsKPiArCWlmICh1ZGV2KQo+ICsJCXVkZXZfdW5yZWYodWRldik7Cj4gK30KPiAtLSAKPiAx LjkuMQo+IApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJ bnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK