From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jim Bride Subject: Re: [PATCH v2 i-g-t] tools: Add intel_dp_compliance for DisplayPort 1.2 compliance automation Date: Fri, 16 Dec 2016 14:42:22 -0800 Message-ID: <20161216224222.GA7670@shiv> References: <1479786027-19231-1-git-send-email-manasi.d.navare@intel.com> <1481148292-25848-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 mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6045D6E165 for ; Fri, 16 Dec 2016 22:43:47 +0000 (UTC) Content-Disposition: inline In-Reply-To: <1481148292-25848-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: Daniel Vetter , intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org T24gV2VkLCBEZWMgMDcsIDIwMTYgYXQgMDI6MDQ6NTJQTSAtMDgwMCwgTWFuYXNpIE5hdmFyZSB3 cm90ZToKPiBUaGlzIGlzIHRoZSB1c2Vyc3BhY2UgY29tcG9uZW50IG9mIHRoZSBEaXNwbGF5cG9y dCBDb21wbGlhbmNlCj4gdGVzdGluZyBzb2Z0d2FyZSByZXF1aXJlZCBmb3IgY29tcGxpYW5jZSB0 ZXN0aW5nIG9mIHRoZSBJOTE1Cj4gRGlzcGxheSBQb3J0IGRyaXZlci4gVGhpcyBtdXN0IGJlIHJ1 bm5pbmcgaW4gb3JkZXIgdG8gc3VjY2Vzc2Z1bGx5Cj4gY29tcGxldGUgRGlzcGxheSBQb3J0IGNv bXBsaWFuY2UgdGVzdGluZy4gVGhpcyBhcHAgYW5kIHRoZSBrZXJuZWwKPiBjb2RlIHRoYXQgYWNj b21wYW5pZXMgaXQgaGFzIGJlZW4gd3JpdHRlbiB0byBzYXRpZnkgdGhlIHJlcXVpcmVtZW50cwo+ IG9mIHRoZSBEaXNwbGF5cG9ydCBMaW5rIENUUyAxLjIgcmV2MS4xIHNwZWNpZmljYXRpb24gZnJv bSBWRVNBLgo+IE5vdGUgdGhhdCB0aGlzIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBvcnQgZURQ IGNvbXBsaWFuY2UgdGVzdGluZy4KPiBUaGlzIHV0aWxpdHkgaGFzIGFuIGF1dG9tYXRpb24gc3Vw cG9ydCBmb3IgdGhlIExpbmsgdHJhaW5pbmcgdGVzdHMKPiAoNC4zLjEuMS4gLSA0LjMuMi4zKSwg RURJRCB0ZXN0cyAoNC4yLjIuMwo+IC0gNC4yLjIuNikgYW5kIFZpZGVvIFBhdHRlcm4gZ2VuZXJh dGlvbiB0ZXN0cyAoNC4zLjMuMSkgZnJvbSBDVFMKPiBzcGVjaWZpY2F0aW9uIDEuMiBSZXYgMS4x Lgo+IAo+IFRoaXMgdG9vbCBoYXMgdGhlIHN1cHBvcnQgZm9yIHJlc3BvbmRpbmcgdG8gdGhlIGhv dHBsdWcgdWV2ZW50cwo+IHNlbnQgYnkgY29tcGxpYW5jZSB0ZXN0dGluZyB1bml0IGFmdGVyIGVh Y2ggdGVzdC4KPiAKPiBUaGUgTGludXggRFVUIHJ1bm5pbmcgdGhpcyB1dGlsaXR5IG11c3QgYmUg aW4gdGV4dCAoY29uc29sZSkgbW9kZQo+IGFuZCBjYW5ub3QgaGF2ZSBhbnkgb3RoZXIgZGlzcGxh eSBtYW5hZ2VyIHJ1bm5pbmcuIFNpbmNlIHRoaXMgdXNlcwo+IHN5c2ZzIG5vZGVzIGZvciBrZXJu ZWwgaW50ZXJhY3Rpb24sIHRoaXMgdXRpbGl0eSBzaG91bGQgYmUgcnVuIGFzCj4gUm9vdC4gT25j ZSB0aGlzIHVzZXIgYXBwbGljYXRpb24gaXMgdXAgYW5kIHJ1bm5pbmcsIHdhaXRpbmcgZm9yCj4g dGVzdCByZXF1ZXN0cywgdGhlIHRlc3QgYXBwbGlhbmNlIHNvZnR3YXJlIG9uIHRoZSB3aW5kb3dz IGhvc3QKPiBjYW4gbm93IGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGUgY29tcGxpYW5jZSB0ZXN0cy4K PiAKPiBUaGlzIGFwcCBpcyBiYXNlZCBvbiBzb21lIHByaW9yIHdvcmsgZG9uZSBpbiBBcHJpbCAy MDE1IChieQo+IFRvZGQgUHJldml0ZSA8dHByZXZpdGVAZ21haWwuY29tPikKPiAKPiB2MjoKPiAq IEFkZCBtb2RlIHVuc2V0IG9uIGhvdHBsdWcgdWV2ZW50IG9uIGRpc2Nvbm5lY3QgKE1hbmFzaSBO YXZhcmUpCj4gCj4gQ2M6IFBldHJpIExhdHZhbGEgPHBldHJpLmxhdHZhbGFAaW50ZWwuY29tPgo+ IENjOiBNYXJpdXMgVmxhZCA8bWFyaXVzLmMudmxhZEBpbnRlbC5jb20+Cj4gQ2M6IERhbmllbCBW ZXR0ZXIgPGRhbmllbC52ZXR0ZXJAZmZ3bGwuY2g+Cj4gU2lnbmVkLW9mZi1ieTogTWFuYXNpIE5h dmFyZSA8bWFuYXNpLmQubmF2YXJlQGludGVsLmNvbT4KClNvbWUgZ2VuZXJhbCBzdWdnZXN0aW9u cyAobW9yZSBpbmxpbmUgYXMgd2VsbCk6CgoqIFBsZWFzZSBhdWRpdCBhbGwgb3V0cHV0IG1lc3Nh Z2VzIGZvciBwcm9wZXIgc3BlbGxpbmcsIGdyYW1tYXIsIGNhcHMsIGV0Yy4KKiBNYW55IG9mIHRo ZSBsaW5lcyBhcmUgcXVpdGUgbG9uZy4gIEl0IHdvdWxkIGJlIG5pY2UgdG8ga2VlcCB0aGUgbGlu ZQogIGxlbmd0aHMgc2hvcnQgKHVuZGVyIDEwMCBjaGFycyBmb3Igc3VyZSwgYnV0IElNSE8gdW5k ZXIgNzggaXMgZXZlbiBiZXR0ZXIuKQoqIE1hbnkgb2YgdGhlIGZ1bmN0aW9ucyBvbmx5IHJldHVy biAnMCc7IGNvbnNpZGVyIGNoYW5naW5nIHRoZW0gdG8gdm9pZC4gIAoqIFBlcmhhcHMgdGhpcyBp cyBleGNlc3MgcGFyYW5vaWEsIGJ1dCBJIHdvdWxkIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBhbnkK ICBwb2ludGVyIHBhc3NlZCBpbnRvIGEgZnVuY3Rpb24gYmVmb3JlIGRlcmVmZXJlbmNpbmcgaXQu ICBUaGlzIGlzbid0IGRvbmUKICBpbiBzZXZlcmFsIGNhc2VzLgoqIE1ha2Ugc3VyZSBhbmQgY2hl Y2sgb3V0IFBldHJpJ3MgZmVlZGJhY2ssIGFsbCBvZiB3aGljaCBJIGFncmVlIHdpdGguCgpKaW0K Cj4gLS0tCj4gIHRvb2xzL01ha2VmaWxlLmFtICAgICAgICAgICAgICAgICAgIHwgICAgMyArLQo+ ICB0b29scy9NYWtlZmlsZS5zb3VyY2VzICAgICAgICAgICAgICB8ICAgIDcgKwo+ICB0b29scy9p bnRlbF9kcF9jb21wbGlhbmNlLmMgICAgICAgICB8IDEwNjAgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysKPiAgdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZS5oICAgICAgICAgfCAg IDM1ICsrCj4gIHRvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2VfaG90cGx1Zy5jIHwgIDEyMyArKysr Cj4gIDUgZmlsZXMgY2hhbmdlZCwgMTIyNyBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCj4g IGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmMKPiAgY3JlYXRl IG1vZGUgMTAwNjQ0IHRvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2UuaAo+ICBjcmVhdGUgbW9kZSAx MDA2NDQgdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZV9ob3RwbHVnLmMKPiAKPiBkaWZmIC0tZ2l0 IGEvdG9vbHMvTWFrZWZpbGUuYW0gYi90b29scy9NYWtlZmlsZS5hbQo+IGluZGV4IDE4Zjg2ZjYu LmVhYzZkNjQgMTAwNjQ0Cj4gLS0tIGEvdG9vbHMvTWFrZWZpbGUuYW0KPiArKysgYi90b29scy9N YWtlZmlsZS5hbQo+IEBAIC0xMyw3ICsxMyw3IEBAIEFNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNk aXIpIC1JJCh0b3Bfc3JjZGlyKS9saWIKPiAgQU1fQ0ZMQUdTID0gJChERUJVR19DRkxBR1MpICQo RFJNX0NGTEFHUykgJChQQ0lBQ0NFU1NfQ0ZMQUdTKSAkKENXQVJORkxBR1MpIFwKPiAgCSAgICAk KENBSVJPX0NGTEFHUykgJChMSUJVTldJTkRfQ0ZMQUdTKSAtRFBLR0RBVEFESVI9XCIkKHBrZ2Rh dGFkaXIpXCIgXAo+ICAJICAgICQoV0VSUk9SX0NGTEFHUykKPiAtTERBREQgPSAkKHRvcF9idWls ZGRpcikvbGliL2xpYmludGVsX3Rvb2xzLmxhCj4gK0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2xp Yi9saWJpbnRlbF90b29scy5sYSAkKEdMSUJfTElCUykKPiAgQU1fTERGTEFHUyA9IC1XbCwtLWFz LW5lZWRlZAo+ICAKPiAgCj4gQEAgLTI0LDYgKzI0LDcgQEAgbW9kdWxlZGlyID0gJChsaWJkaXIp Cj4gIGludGVsX2F1YmR1bXBfbGFfTERGTEFHUyA9IC1tb2R1bGUgLWF2b2lkLXZlcnNpb24gLW5v LXVuZGVmaW5lZAo+ICBpbnRlbF9hdWJkdW1wX2xhX1NPVVJDRVMgPSBhdWJkdW1wLmMKPiAgaW50 ZWxfYXViZHVtcF9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2xpYmludGVsX3Rvb2xz LmxhIC1sZGwKPiAraW50ZWxfZHBfY29tcGxpYW5jZV9sYV9MSUJBREQgPSAkKExEQUREKQo+ICAK PiAgYmluX1NDUklQVFMgPSBpbnRlbF9hdWJkdW1wCj4gIENMRUFORklMRVMgPSAkKGJpbl9TQ1JJ UFRTKQo+IGRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZS5zb3VyY2VzIGIvdG9vbHMvTWFrZWZp bGUuc291cmNlcwo+IGluZGV4IGJlNTg4NzEuLjA5YzA2NjcgMTAwNjQ0Cj4gLS0tIGEvdG9vbHMv TWFrZWZpbGUuc291cmNlcwo+ICsrKyBiL3Rvb2xzL01ha2VmaWxlLnNvdXJjZXMKPiBAQCAtMTMs NiArMTMsNyBAQCB0b29sc19wcm9nX2xpc3RzID0JCVwKPiAgCWludGVsX2Jpb3NfcmVhZGVyCVwK PiAgCWludGVsX2Rpc3BsYXlfY3JjCVwKPiAgCWludGVsX2Rpc3BsYXlfcG9sbGVyCVwKPiArCWlu dGVsX2RwX2NvbXBsaWFuY2UJXAo+ICAJaW50ZWxfZm9yY2V3YWtlZAlcCj4gIAlpbnRlbF9ncHVf ZnJlcXVlbmN5CVwKPiAgCWludGVsX2Zpcm13YXJlX2RlY29kZQlcCj4gQEAgLTU1LDMgKzU2LDkg QEAgaW50ZWxfbDNfcGFyaXR5X1NPVVJDRVMgPQlcCj4gIAlpbnRlbF9sM19wYXJpdHkuaAlcCj4g IAlpbnRlbF9sM191ZGV2X2xpc3RlbmVyLmMKPiAgCj4gK2ludGVsX2RwX2NvbXBsaWFuY2VfU09V UkNFUyA9IFwKPiArICAgICAgICBpbnRlbF9kcF9jb21wbGlhbmNlLmMgXAo+ICsgICAgICAgIGlu dGVsX2RwX2NvbXBsaWFuY2UuaCBcCj4gKyAgICAgICAgaW50ZWxfZHBfY29tcGxpYW5jZV9ob3Rw bHVnLmMgXAo+ICsgICAgICAgICQoTlVMTCkKPiArCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVs X2RwX2NvbXBsaWFuY2UuYyBiL3Rvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2UuYwo+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uODA3ZDNmNAo+IC0tLSAvZGV2L251bGwKPiAr KysgYi90b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmMKPiBAQCAtMCwwICsxLDEwNjAgQEAKPiAr LyoKPiArICogQ29weXJpZ2h0ID8gMjAxNC0yMDE1IEludGVsIENvcnBvcmF0aW9uCj4gKyAqCj4g KyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkg cGVyc29uIG9idGFpbmluZyBhCj4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2Np YXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCj4gKyAqIHRvIGRlYWwg aW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxp bWl0YXRpb24KPiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1 Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBv ZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+ICsgKiBT b2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBj b25kaXRpb25zOgo+ICsgKgo+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhp cyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Cj4gKyAqIHBhcmFncmFwaCkg c2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBv ZiB0aGUKPiArICogU29mdHdhcmUuCj4gKyAqCj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURF RCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gKyAq IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Yg TUVSQ0hBTlRBQklMSVRZLAo+ICsgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB TkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKPiArICogVEhFIEFVVEhPUlMg T1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Ig T1RIRVIKPiArICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwg VE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5F Q1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwo+ICsg KiBJTiBUSEUgU09GVFdBUkUuCj4gKyAqCj4gKyAqIERpc3BsYXlwb3J0IENvbXBsaWFuY2UgVGVz dGluZyBBcHBsaWNhdGlvbgo+ICsgKgo+ICsgKiBUaGlzIGlzIHRoZSB1c2Vyc3BhY2UgY29tcG9u ZW50IG9mIHRoZSBEaXNwbGF5cG9ydCBDb21wbGlhbmNlIHRlc3RpbmcKPiArICogc29mdHdhcmUg cmVxdWlyZWQgZm9yIGNvbXBsaWFuY2UgdGVzdGluZyBvZiB0aGUgSTkxNSBEaXNwbGF5IFBvcnQg ZHJpdmVyLgo+ICsgKiBUaGlzIG11c3QgYmUgcnVubmluZyBpbiBvcmRlciB0byBzdWNjZXNzZnVs bHkgY29tcGxldGUgRGlzcGxheSBQb3J0Cj4gKyAqIGNvbXBsaWFuY2UgdGVzdGluZy4gVGhpcyBh cHAgYW5kIHRoZSBrZXJuZWwgY29kZSB0aGF0IGFjY29tcGFuaWVzIGl0IGhhcyBiZWVuCj4gKyAq IHdyaXR0ZW4gdG8gc2F0aWZ5IHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIERpc3BsYXlwb3J0IExp bmsgQ1RTIDEuMiByZXYxLjEKPiArICogc3BlY2lmaWNhdGlvbiBmcm9tIFZFU0EuIE5vdGUgdGhh dCB0aGlzIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBvcnQgZURQCj4gKyAqIGNvbXBsaWFuY2Ug dGVzdGluZy4KPiArICoKPiArICogQ29tcGxpYW5jZSBUZXN0aW5nIHJlcXVpcmVzIHNldmVyYWwg Y29tcG9uZW50czoKPiArICogICAtIEEga2VybmVsIGJ1aWxkIHRoYXQgY29udGFpbnMgdGhlIHBh dGNoIHNldCBmb3IgRFAgY29tcGxpYW5jZSBzdXBwb3J0Cj4gKyAqICAgLSBBIERpc3BsYXlwb3J0 IENvbXBsaWFuY2UgVGVzdGluZyBhcHBsaWFuY2Ugc3VjaCBhcyBVbmlncmFmLURQUjEyMAo+ICsg KiAgIC0gVGhpcyB1c2VyIGFwcGxpY2F0aW9uCj4gKyAqICAgLSBBIHdpbmRvd3MgaG9zdCBtYWNo aW5lIHRvIHJ1biB0aGUgRFBSIHRlc3Qgc29mdHdhcmUKPiArICogICAtIFJvb3QgYWNjZXNzIG9u IHRoZSBEVVQgZHVlIHRvIHRoZSB1c2Ugb2Ygc3lzZnMgdXRpbGl0eQo+ICsgKgo+ICsgKiBUZXN0 IFNldHVwOgo+ICsgKiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHRoZSB3aW5kb3dz IGhvc3QsIHRlc3QgYXBwbGlhbmNlIGFuZCBEVVQKPiArICogYmUgZnJlc2hseSByZXN0YXJ0ZWQg YmVmb3JlIGFueSB0ZXN0aW5nIGJlZ2lucyB0byBlbnN1cmUgdGhhdCBhbnkgcHJldmlvdXMKPiAr ICogY29uZmlndXJhdGlvbnMgYW5kIHNldHRpbmdzIHdpbGwgbm90IGludGVyZmVyZSB3aXRoIHRl c3QgcHJvY2Vzcy4gUmVmZXIgdG8KPiArICogdGhlIHRlc3QgYXBwbGlhbmNlIGRvY3VtZW50YXRp b24gZm9yIHNldHVwLCBzb2Z0d2FyZSBpbnN0YWxsYXRpb24gYW5kCj4gKyAqIG9wZXJhdGlvbiBz cGVjaWZpYyB0byB0aGF0IGRldmljZS4KPiArICoKPiArICogVGhlIExpbnV4IERVVCBtdXN0IGJl IGluIHRleHQgKGNvbnNvbGUpIG1vZGUgYW5kIGNhbm5vdCBoYXZlIGFueSBvdGhlcgo+ICsgKiBk aXNwbGF5IG1hbmFnZXIgcnVubmluZy4gWW91IG11c3QgYmUgbG9nZ2VkIGluIGFzIHJvb3QgdG8g cnVuIHRoaXMgdXNlciBhcHAuCj4gKyAqIE9uY2UgdGhlIHVzZXIgYXBwbGljYXRpb24gaXMgdXAg YW5kIHJ1bm5pbmcsIHdhaXRpbmcgZm9yIHRlc3QgcmVxdWVzdHMsIHRoZQo+ICsgKiBzb2Z0d2Fy ZSBvbiB0aGUgd2luZG93cyBob3N0IGNhbiBub3cgYmUgdXNlZCB0byBleGVjdXRlIHRoZSBjb21w bGlhbmNlIHRlc3RzLgo+ICsgKgo+ICsgKiBUaGlzIHVzZXJzcGFjZSBhcHBsaWNhdGlvbiBzdXBw b3J0cyBmb2xsb3dpbmcgdGVzdHMgZnJvbSB0aGUgRFAgQ1RTIFNwZWMKPiArICogUmV2IDEuMToK PiArICogICAtIExpbmsgVHJhaW5pbmcgVGVzdHM6IFN1cHBvcnRzIHRlc3RzIDQuMy4xLjEgdG8g NC4zLjIuMwo+ICsgKiAgIC0gRURJRCBUZXN0czogU3VwcG9ydHMgRURJRCByZWFkICg0LjIuMi4z KSxFRElEIFJlYWQgZmFpbHVyZSBhbmQgY29ycnVwdGlvbgo+ICsgKiAgICAgZGV0ZWN0aW9uIHRl c3RzICg0LjIuMi40LCA0LjIuMi41LCA0LjIuMi42KQo+ICsgKiAgIC0gVmlkZW8gUGF0dGVybiBn ZW5lcmF0aW9uIHRlc3RzOiBUaGlzIHN1cHBvcnRzIG9ubHkgdGhlIDI0IGFuZCAxOGJwcCBjb2xv cgo+ICsgKiAgICAgcmFtcCB0ZXN0IHBhdHRlcm4gKDQuMy4zLjEpLgo+ICsgKgo+ICsgKiBDb25u ZWN0aW9ucyAocmVxdWlyZWQpOgo+ICsgKiAgIC0gVGVzdCBBcHBsaWFuY2UgY29ubmVjdGVkIHRv IHRoZSBleHRlcm5hbCBEaXNwbGF5cG9ydCBjb25uZWN0b3Igb24gdGhlIERVVAo+ICsgKiAgIC0g VGVzdCBBcHBsaWFuY2UgTW9uaXRvciBPdXQgY29ubmVjdGVkIHRvIERpc3BsYXlwb3J0IGNvbm5l Y3RvciBvbiB0aGUKPiArICogbW9uaXRvcgo+ICsgKiAgIC0gVGVzdCBhcHBsaWFuY2UgY29ubmVj dGVkIHRvIHRoZSBXaW5kb3dzIEhvc3QgdmlhIFVTQgo+ICsgKgo+ICsgKiBEZWJ1Z2ZzIEZpbGVz Ogo+ICsgKiBUaGUgZmlsZSByb290IGZvciBhbGwgIHRoZSBkZWJ1Z2ZzIGZpbGU6Cj4gKyAqIC9z eXMva2VybmVsL2RlYnVnL2RyaS8wLwo+ICsgKgo+ICsgKiBUaGUgc3BlY2lmaWMgZmlsZXMgYXJl IGFzIGZvbGxvd3M6Cj4gKyAqCj4gKyAqIGk5MTVfZHBfdGVzdF9hY3RpdmUKPiArICogQSBzaW1w bGUgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBjb21wbGlhbmNlIHRlc3Rpbmcg aXMgY3VycmVudGx5Cj4gKyAqIGFjdGl2ZSBpbiB0aGUga2VybmVsLiBUaGlzIGZsYWcgaXMgcG9s bGVkIGJ5IHVzZXJzcGFjZSBhbmQgb25jZSBzZXQsIGludm9rZXMKPiArICogdGhlIHRlc3QgaGFu ZGxlciBpbiB0aGUgdXNlciBhcHAuIFRoaXMgZmxhZyBpcyBzZXQgYnkgdGhlIHRlc3QgaGFuZGxl ciBpbiB0aGUKPiArICoga2VybmVsIGFmdGVyIHJlYWRpbmcgdGhlIHJlZ2lzdGVycyByZXF1ZXN0 ZWQgYnkgdGhlIHRlc3QgYXBwbGlhbmNlLgo+ICsgKgo+ICsgKiBpOTE1X2RwX3Rlc3RfZGF0YQo+ ICsgKiBUZXN0IGRhdGEgaXMgdXNlZCBieSB0aGUga2VybmVsIHRvIHBhc3MgcGFyYW1ldGVycyB0 byB0aGUgdXNlciBhcHAuIEVnOiBJbgo+ICsgKiBjYXNlIG9mIEVESUQgdGVzdHMsIHRoZSBkYXRh IHRoYXQgaXMgZGVsaXZlcmVkIHRvIHRoZSB1c2Vyc3BhY2UgaXMgdGhlIHZpZGVvCj4gKyAqIG1v ZGUgdG8gYmUgc2V0IGZvciB0aGUgdGVzdC4KPiArICogSW4gY2FzZSBvZiB2aWRlbyBwYXR0ZXJu IHRlc3QsIHRoZSBkYXRhIHRoYXQgaXMgZGVsaXZlcmVkIHRvIHRoZSB1c2Vyc3BhY2UgaXMKPiAr ICogdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHRlc3QgcGF0dGVybiBhbmQgdGhlIGJpdHMg cGVyIGNvbG9yIHZhbHVlLgo+ICsgKgo+ICsgKiBpOTE1X2RwX3Rlc3RfdHlwZQo+ICsgKiBUaGUg dGVzdCB0eXBlIHZhcmlhYmxlIGluc3RydWN0cyB0aGUgdXNlciBhcHAgYXMgdG8gd2hhdCB0aGUg cmVxdWVzdGVkIHRlc3QKPiArICogd2FzIGZyb20gdGhlIHNpbmsgZGV2aWNlLiBUaGVzZSB2YWx1 ZXMgZGVmaW5lZCBhdCB0aGUgdG9wIG9mIHRoZSBhcHBsaWNhdGlvbidzCj4gKyAqIG1haW4gaW1w bGVtZW50YXRpb24gZmlsZSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB2YWx1ZXMgZGVm aW5lZCBpbiB0aGUKPiArICoga2VybmVsJ3MgZHJtX2RwX2hlbHBlci5oIGZpbGUuCj4gKyAqIFRo aXMgYXBwIGlzIGJhc2VkIG9uIHNvbWUgcHJpb3Igd29yayBzdWJtaXR0ZWQgaW4gQXByaWwgMjAx NSBieSBUb2RkIFByZXZpdGUKPiArICogKDx0cHJldml0ZUBnbWFpbC5jb20+KQo+ICsgKgo+ICsg Kgo+ICsgKiBUaGlzIHRvb2wgY2FuIGJlIHJ1biBhczoKPiArICogLi9pbnRlbF9kcF9jb21wbGlh bmNlICBJdCB3aWxsIHdhaXQgdGlsbCB5b3Ugc3RhcnQgY29tcGxpYW5jZSBzdWl0ZSBmcm9tCj4g KyAqIERQUiAxMjAuCj4gKyAqIC4vaW50ZWxfZHBfY29tcGxpYW5jZSAtaCAgVGhpcyB3aWxsIG9w ZW4gdGhlIGhlbHAKPiArICogLi9pbnRlbF9kcF9jb21wbGlhbmNlIC1pICBUaGlzIHdpbGwgcHJv dmlkZSBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50Cj4gKyAqIGNvbm5lY3RvcnMvQ1JUQ3MuIFRo aXMgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgo+ICsgKgo+ICsgKiBBdXRob3Jz Ogo+ICsgKiAgICBNYW5hc2kgTmF2YXJlIDxtYW5hc2kuZC5uYXZhcmVAaW50ZWwuY29tPgo+ICsg Kgo+ICsgKiBFbGVtZW50cyBvZiB0aGUgbW9kZXNldCBjb2RlIGFkYXB0ZWQgZnJvbSBEYXZpZCBI ZXJybWFubidzCj4gKyAqIERSTSBtb2Rlc2V0IGV4YW1wbGUKPiArICoKPiArICovCj4gKyNpbmNs dWRlICJpZ3QuaCIKPiArI2luY2x1ZGUgPGVycm5vLmg+Cj4gKyNpbmNsdWRlIDxnZXRvcHQuaD4K PiArI2luY2x1ZGUgPG1hdGguaD4KPiArI2luY2x1ZGUgPHN0ZGludC5oPgo+ICsjaW5jbHVkZSA8 c3RkYm9vbC5oPgo+ICsjaW5jbHVkZSA8c3RyaW5ncy5oPgo+ICsjaW5jbHVkZSA8dW5pc3RkLmg+ Cj4gKyNpbmNsdWRlIDx0ZXJtaW9zLmg+Cj4gKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgo+ICsjaW5j bHVkZSA8c3lzL3RpbWUuaD4KPiArI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgo+ICsjaW5jbHVkZSA8 c3lzL3R5cGVzLmg+Cj4gKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgo+ICsjaW5jbHVkZSA8c3lzL3Nl bGVjdC5oPgo+ICsjaW5jbHVkZSA8YXNzZXJ0Lmg+Cj4gKyNpbmNsdWRlIDxzaWduYWwuaD4KPiAr I2luY2x1ZGUgPGZjbnRsLmg+Cj4gKyNpbmNsdWRlIDx0aW1lLmg+Cj4gKwo+ICsjaW5jbHVkZSAi aW50ZWxfZHBfY29tcGxpYW5jZS5oIgo+ICsKPiArI2luY2x1ZGUgPHN0ZGxpYi5oPgo+ICsjaW5j bHVkZSA8c2lnbmFsLmg+Cj4gKwo+ICsvKiBVc2VyIElucHV0IGRlZmluaXRpb25zICovCj4gKyNk ZWZpbmUgSEVMUF9ERVNDUklQVElPTiAxCj4gKwo+ICsvKiBEZWJ1Z2ZzIGZpbGUgZGVmaW5pdGlv bnMgKi8KPiArI2RlZmluZSBJTlRFTF9EUF9URVNUX1RZUEVfRklMRQkJImk5MTVfZHBfdGVzdF90 eXBlIgo+ICsjZGVmaW5lIElOVEVMX0RQX1RFU1RfQUNUSVZFX0ZJTEUJImk5MTVfZHBfdGVzdF9h Y3RpdmUiCj4gKyNkZWZpbmUgSU5URUxfRFBfVEVTVF9EQVRBX0ZJTEUJCSJpOTE1X2RwX3Rlc3Rf ZGF0YSIKPiArCj4gKy8qIERSTSBkZWZpbml0aW9ucyAtIG11c3QgYmUga2VwdCBpbiBzeW5jIHdp dGggdGhlIERSTSBoZWFkZXIgKi8KPiArI2RlZmluZSBEUF9URVNUX0xJTktfVFJBSU5JTkcJCSgx IDw8IDApCj4gKyNkZWZpbmUgRFBfVEVTVF9MSU5LX1ZJREVPX1BBVFRFUk4JKDEgPDwgMSkKPiAr I2RlZmluZSBEUF9URVNUX0xJTktfRURJRF9SRUFECQkoMSA8PCAyKQo+ICsjZGVmaW5lIERQX1RF U1RfTElOS19QSFlfVEVTVF9QQVRURVJOCSgxIDw8IDMpIC8qIERQQ0QgPj0gMS4xICovCj4gKwo+ ICsjZGVmaW5lIERQX0NPTVBMSUFOQ0VfVEVTVF9UWVBFX01BU0sJKERQX1RFU1RfTElOS19UUkFJ TklORyAgICAgIHwJXAo+ICsJCQkJCSBEUF9URVNUX0xJTktfVklERU9fUEFUVEVSTiB8CVwKPiAr CQkJCQkgRFBfVEVTVF9MSU5LX0VESURfUkVBRCAgICAgfAlcCj4gKwkJCQkJIERQX1RFU1RfTElO S19QSFlfVEVTVF9QQVRURVJOKQo+ICsKPiArLyogTk9URTogVGhlc2UgbXVzdCBiZSBrZXB0IGlu IHN5bmMgd2l0aCB0aGUgZGVmaW5pdGlvbnMgaW4gaW50ZWxfZHAuYyAqLwo+ICsjZGVmaW5lIElO VEVMX0RQX0VESURfU0hJRlRfTUFTSwkwCj4gKyNkZWZpbmUgSU5URUxfRFBfRURJRF9PSwkJKDAg PDwgSU5URUxfRFBfRURJRF9TSElGVF9NQVNLKQo+ICsjZGVmaW5lIElOVEVMX0RQX0VESURfQ09S UlVQVAkJKDEgPDwgSU5URUxfRFBfRURJRF9TSElGVF9NQVNLKQo+ICsjZGVmaW5lIElOVEVMX0RQ X1JFU09MVVRJT05fU0hJRlRfTUFTSwkwCj4gKyNkZWZpbmUgSU5URUxfRFBfUkVTT0xVVElPTl9Q UkVGRVJSRUQJKDEgPDwgSU5URUxfRFBfUkVTT0xVVElPTl9TSElGVF9NQVNLKQo+ICsjZGVmaW5l IElOVEVMX0RQX1JFU09MVVRJT05fU1RBTkRBUkQJKDIgPDwgSU5URUxfRFBfUkVTT0xVVElPTl9T SElGVF9NQVNLKQo+ICsjZGVmaW5lIElOVEVMX0RQX1JFU09MVVRJT05fRkFJTFNBRkUJKDMgPDwg SU5URUxfRFBfUkVTT0xVVElPTl9TSElGVF9NQVNLKQo+ICsjZGVmaW5lIERQX0NPTVBMSUFOQ0Vf VklERU9fTU9ERV9NQVNLCShJTlRFTF9EUF9SRVNPTFVUSU9OX1BSRUZFUlJFRAl8XAo+ICsJCQkJ CSBJTlRFTF9EUF9SRVNPTFVUSU9OX1NUQU5EQVJECXxcCj4gKwkJCQkJIElOVEVMX0RQX1JFU09M VVRJT05fRkFJTFNBRkUpCj4gKwo+ICsvKiBHbG9iYWwgZmlsZSBwb2ludGVycyBmb3IgdGhlIHN5 c2ZzIGZpbGVzICovCj4gK0ZJTEUgKnRlc3RfYWN0aXZlX2ZwLCAqdGVzdF9kYXRhX2ZwLCAqdGVz dF90eXBlX2ZwOwo+ICsKPiArYm9vbCB2aWRlb19wYXR0ZXJuX2ZsYWc7Cj4gKwo+ICsvKiBWaWRl byBwYXR0ZXJuIHRlc3QgZ2xvYmFscyAqLwo+ICt1aW50MTZfdCBoZGlzcGxheTsKPiArdWludDE2 X3QgdmRpc3BsYXk7Cj4gK3VpbnQ4X3QgYml0ZGVwdGg7Cj4gKwo+ICtzdGF0aWMgaW50IHRpb19m ZDsKPiArc3RydWN0IHRlcm1pb3Mgc2F2ZWRfdGlvOwo+ICsKPiArZHJtTW9kZVJlcyAqcmVzb3Vy Y2VzOwo+ICtpbnQgZHJtX2ZkLCBtb2RlczsKPiArdWludDY0X3QgdGlsaW5nID0gTE9DQUxfRFJN X0ZPUk1BVF9NT0RfTk9ORTsKPiArdWludDMyX3QgZGVwdGggPSAyNCwgc3RyaWRlLCBicHA7Cj4g K2ludCBzcGVjaWZpZWRfbW9kZV9udW0gPSAtMSwgc3BlY2lmaWVkX2Rpc3BfaWQgPSAtMTsKPiAr aW50IHdpZHRoLCBoZWlnaHQ7Cj4gK3VpbnQzMl90IHRlc3RfY3J0YzsKPiArdWludDMyX3QgdGVz dF9jb25uZWN0b3JfaWQ7Cj4gK2VudW0gewo+ICsJSU5URUxfTU9ERV9JTlZBTElEID0gLTEsCj4g KwlJTlRFTF9NT0RFX05PTkUgPSAwLAo+ICsJSU5URUxfTU9ERV9QUkVGRVJSRUQsCj4gKwlJTlRF TF9NT0RFX1NUQU5EQVJELAo+ICsJSU5URUxfTU9ERV9GQUlMU0FGRSwKPiArCUlOVEVMX01PREVf VklERU9fUEFUVEVSTl9URVNUCj4gK30gaW50ZWxfZGlzcGxheV9tb2RlOwo+ICsKPiArc3RydWN0 IHRlc3RfdmlkZW9fcGF0dGVybiB7Cj4gKwl1aW50MTZfdCBoZGlzcGxheTsKPiArCXVpbnQxNl90 IHZkaXNwbGF5Owo+ICsJdWludDhfdCBiaXRkZXB0aDsKPiArCXVpbnQzMl90IGZiOwo+ICsJdWlu dDMyX3Qgc2l6ZTsKPiArCXN0cnVjdCBpZ3RfZmIgZmJfcGF0dGVybjsKPiArCWRybU1vZGVNb2Rl SW5mbyBtb2RlOwo+ICsJdWludDMyX3QgKnBpeG1hcDsKPiArfTsKPiArCj4gK3N0cnVjdCBjb25u ZWN0b3Igewo+ICsJdWludDMyX3QgaWQ7Cj4gKwlpbnQgbW9kZV92YWxpZDsKPiArCWRybU1vZGVN b2RlSW5mbyBtb2RlLCBtb2RlX3N0YW5kYXJkLCBtb2RlX3ByZWZlcnJlZCwgbW9kZV9mYWlsc2Fm ZTsKPiArCWRybU1vZGVDb25uZWN0b3IgKmNvbm5lY3RvcjsKPiArCWludCBjcnRjOwo+ICsJLyog U3RhbmRhcmQgYW5kIHByZWZlcnJlZCBmcmFtZSBidWZmZXIqLwo+ICsJdWludDMyX3QgZmIsIGZi X3dpZHRoLCBmYl9oZWlnaHQsIGZiX3NpemU7Cj4gKwl1aW50OF90ICpwaXhtYXA7Cj4gKwlzdHJ1 Y3QgaWd0X2ZiIGZiX3ZpZGVvX3BhdHRlcm47Cj4gKwkvKiBGYWlsc2FmZSBmcmFtZWJ1ZmZlciAt IG5vdGUgdGhpcyBpcyBhIDE2LWJpdCBidWZmZXIgKi8KPiArCXVpbnQzMl90IGZhaWxzYWZlX2Zi LCBmYWlsc2FmZV93aWR0aCwgZmFpbHNhZmVfaGVpZ2h0Owo+ICsJdWludDMyX3QgZmFpbHNhZmVf c2l6ZTsKPiArCXVpbnQ4X3QgKmZhaWxzYWZlX3BpeG1hcDsKPiArCXN0cnVjdCBpZ3RfZmIgZmJf ZmFpbHNhZmVfcGF0dGVybjsKPiArCXN0cnVjdCB0ZXN0X3ZpZGVvX3BhdHRlcm4gdGVzdF9wYXR0 ZXJuOwo+ICt9Owo+ICsKPiArc3RhdGljIHZvaWQgY2xlYXJfdGVzdF9hY3RpdmUodm9pZCkKPiAr ewo+ICsJcmV3aW5kKHRlc3RfYWN0aXZlX2ZwKTsKPiArCWZwcmludGYodGVzdF9hY3RpdmVfZnAs ICIlZCIsIDApOwo+ICsJZmZsdXNoKHRlc3RfYWN0aXZlX2ZwKTsKPiArfQo+ICsKPiArc3RhdGlj IHZvaWQgc2V0dXBfZGVidWdmc19maWxlcyh2b2lkKQo+ICt7Cj4gKwl0ZXN0X3R5cGVfZnAgPSBp Z3RfZGVidWdmc19mb3BlbihJTlRFTF9EUF9URVNUX1RZUEVfRklMRSwgInIiKTsKPiArCWlndF9y ZXF1aXJlKHRlc3RfdHlwZV9mcCk7Cj4gKwo+ICsJdGVzdF9kYXRhX2ZwID0gaWd0X2RlYnVnZnNf Zm9wZW4oSU5URUxfRFBfVEVTVF9EQVRBX0ZJTEUsICJyIik7Cj4gKwlpZ3RfcmVxdWlyZSh0ZXN0 X2RhdGFfZnApOwo+ICsKPiArCXRlc3RfYWN0aXZlX2ZwID0gaWd0X2RlYnVnZnNfZm9wZW4oSU5U RUxfRFBfVEVTVF9BQ1RJVkVfRklMRSwgIncrIik7Cj4gKwlpZ3RfcmVxdWlyZSh0ZXN0X2FjdGl2 ZV9mcCk7Cj4gKwo+ICsJLyogUmVzZXQgdGhlIGFjdGl2ZSBmbGFnIGZvciBzYWZldHkgKi8KPiAr CWNsZWFyX3Rlc3RfYWN0aXZlKCk7Cj4gK30KPiArCj4gK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdl dF90ZXN0X3R5cGUodm9pZCkKPiArewo+ICsJdW5zaWduZWQgbG9uZyB0ZXN0X3R5cGU7Cj4gKwo+ ICsJaWYgKCF0ZXN0X3R5cGVfZnApCj4gKwkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIFRlc3Qg VHlwZSBGaWxlIHBvaW50clxyXG4iKTsKClNwZWxsaW5nICdwb2ludHInLCBmdW5reSBjYXBzLgoK PiArCXJld2luZCh0ZXN0X3R5cGVfZnApOwo+ICsJZnNjYW5mKHRlc3RfdHlwZV9mcCwgIiUwMmx4 IiwgJnRlc3RfdHlwZSk7Cj4gKwlpZiAodGVzdF90eXBlIDw9IDApIHsKPiArCQlpZ3Rfd2Fybigi VGVzdCB0eXBlIHJlYWQgZmFpbGVkIC0gJTAybHhcclxuIiwgdGVzdF90eXBlKTsKPiArCQlyZXR1 cm4gMDsKPiArCX0KPiArCj4gKwlyZXR1cm4gdGVzdF90eXBlOwo+ICt9Cj4gKwo+ICtzdGF0aWMg dW5zaWduZWQgbG9uZyBnZXRfdGVzdF9lZGlkX2RhdGEodm9pZCkKPiArewo+ICsJdW5zaWduZWQg bG9uZyB0ZXN0X2RhdGE7Cj4gKwo+ICsJaWYgKCF0ZXN0X2RhdGFfZnApCj4gKwkJZnByaW50Zihz dGRlcnIsICJJbnZhbGlkIFRlc3QgZGF0YSBGaWxlIFBvaW50ZXJcclxuIik7Cj4gKwo+ICsJcmV3 aW5kKHRlc3RfZGF0YV9mcCk7Cj4gKwlmc2NhbmYodGVzdF9kYXRhX2ZwLCAiJWx4IiwgJnRlc3Rf ZGF0YSk7Cj4gKwlpZiAodGVzdF9kYXRhIDw9IDApIHsKPiArCQlpZ3Rfd2FybigiVGVzdCBkYXRh IHJlYWQgZmFpbGVkIC0gJWx4XHJcbiIsIHRlc3RfZGF0YSk7Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9 Cj4gKwo+ICsJcmV0dXJuIHRlc3RfZGF0YTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZ2V0X3Rl c3RfdmlkZW9wYXR0ZXJuX2RhdGEodm9pZCkKPiArewo+ICsJaW50IGNvdW50ID0gMDsKPiArCXVp bnQxNl90IHZpZGVvX3BhdHRlcm5fdmFsdWVbM107Cj4gKwljaGFyIHZpZGVvX3BhdHRlcm5fYXR0 cmlidXRlWzE1XTsKPiArCj4gKwlpZiAoIXRlc3RfZGF0YV9mcCkKPiArCQlmcHJpbnRmKHN0ZGVy ciwgIkludmFsaWQgVGVzdCBkYXRhIEZpbGUgcG9pbnRlclxyXG4iKTsKPiArCj4gKwlyZXdpbmQo dGVzdF9kYXRhX2ZwKTsKPiArCXdoaWxlICghZmVvZih0ZXN0X2RhdGFfZnApICYmIGNvdW50IDwg MykKPiArCQlmc2NhbmYodGVzdF9kYXRhX2ZwLCAiJXMgJXVcbiIsIHZpZGVvX3BhdHRlcm5fYXR0 cmlidXRlLAo+ICsJCSAgICAgICAodW5zaWduZWQgaW50ICopJnZpZGVvX3BhdHRlcm5fdmFsdWVb Y291bnQrK10pOwo+ICsKPiArCWhkaXNwbGF5ID0gdmlkZW9fcGF0dGVybl92YWx1ZVswXTsKPiAr CXZkaXNwbGF5ID0gdmlkZW9fcGF0dGVybl92YWx1ZVsxXTsKPiArCWJpdGRlcHRoID0gdmlkZW9f cGF0dGVybl92YWx1ZVsyXTsKPiArCWlndF9pbmZvKCJIZGlzcGxheSA9ICVkXHJcbiIsIGhkaXNw bGF5KTsKPiArCWlndF9pbmZvKCJWZGlzcGxheSA9ICVkXHJcbiIsIHZkaXNwbGF5KTsKPiArCWln dF9pbmZvKCJCaXREZXB0aCA9ICV1XHJcbiIsIGJpdGRlcHRoKTsKPiArCj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgcHJvY2Vzc190ZXN0X3JlcXVlc3QoaW50IHRlc3RfdHlwZSkKPiArewo+ICsJaW50 IG1vZGU7Cj4gKwl1bnNpZ25lZCBsb25nIHRlc3RfZGF0YV9lZGlkOwo+ICsJaW50IHN0YXR1cyA9 IDA7CgpJJ2QgcmV3b3JrIHRoaXMgZnVuY3Rpb24gYSBiaXQsIHNpbmNlIHRoZSBmYWlsdXJlIGNh c2UgaXMgbm90IGNvcnJlY3QuCldlIHNob3VsZCBub3QgY2FsbCB1cGRhdGVfZGlzcGxheSgpIGlm IHdlIGhpdCB0aGUgZGVmYXVsdCBjYXNlIG9mIHRoZSBzd2l0Y2gKYmVsb3cgaXMgaGl0LiAgSWYg eW91IHN0YXJ0IHdpdGggc3RhdHVzID0gLTEsIGFuZCB0aGVuIHNldCBzdGF0dXMgdG8gMCB3aGVu CnlvdSBoaXQgb25lIG9mIHRoZSB2YWxpZCB0ZXN0IHR5cGVzLCBhbmQgdGhlbiBvbmx5IGNhbGwg dXBkYXRlX2Rpc3BsYXkoKSBpZgpzdGF0dXMgPT0gMCwgdGhlbiBldmVyeXRoaW5nIHNob3VsZCB3 b3JrIHJpZ2h0LiAgRm9yIHRoYXQgbWF0dGVyLCBzaW5jZSB0aGVyZSdzCnJlYWxseSBvbmx5IG9u ZSBmYWlsdXJlIG1vZGUgeW91IG1pZ2h0IGNvbnNpZGVyIGhhdmluZyB0aGlzIGZ1bmN0aW9uIHJl dHVybgphIGJvb2wuCgo+ICsKPiArCXN3aXRjaCAodGVzdF90eXBlKSB7Cj4gKwljYXNlIERQX1RF U1RfTElOS19WSURFT19QQVRURVJOOgo+ICsJCXZpZGVvX3BhdHRlcm5fZmxhZyA9IHRydWU7Cj4g KwkJZ2V0X3Rlc3RfdmlkZW9wYXR0ZXJuX2RhdGEoKTsKPiArCQltb2RlID0gSU5URUxfTU9ERV9W SURFT19QQVRURVJOX1RFU1Q7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIERQX1RFU1RfTElOS19FRElE X1JFQUQ6Cj4gKwkJdGVzdF9kYXRhX2VkaWQgPSBnZXRfdGVzdF9lZGlkX2RhdGEoKTsKPiArCQlt b2RlID0gKHRlc3RfZGF0YV9lZGlkICYgRFBfQ09NUExJQU5DRV9WSURFT19NT0RFX01BU0spID4+ Cj4gKwkJCUlOVEVMX0RQX1JFU09MVVRJT05fU0hJRlRfTUFTSzsKPiArCQlicmVhazsKPiArCWRl ZmF1bHQ6Cj4gKwkJLyogVW5rbm93biB0ZXN0IHR5cGUgKi8KPiArCQlmcHJpbnRmKHN0ZGVyciwg IkludmFsaWQgdGVzdCByZXF1ZXN0LiBJZ25vcmVkLlxyXG4iKTsKPiArCQlicmVhazsKPiArCX0K PiArCXN0YXR1cyA9IHVwZGF0ZV9kaXNwbGF5KG1vZGUsIHRydWUpOwo+ICsKPiArCS8qIFJldHVy biAwIG9uIHN1Y2Nlc3MgYW5kIC0xIG9uIGZhaWx1cmUgKi8KPiArCXJldHVybiBzdGF0dXM7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIGR1bXBfY29ubmVjdG9yc19mZChpbnQgZHJtZmQpCj4gK3sK PiArCWludCBpLCBqOwo+ICsKPiArCWRybU1vZGVSZXMgKm1vZGVfcmVzb3VyY2VzID0gZHJtTW9k ZUdldFJlc291cmNlcyhkcm1mZCk7Cj4gKwo+ICsJaWYgKCFtb2RlX3Jlc291cmNlcykgewo+ICsJ CWlndF93YXJuKCJkcm1Nb2RlR2V0UmVzb3VyY2VzIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVy cm5vKSk7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWlndF9pbmZvKCJDb25uZWN0b3JzOlxu Iik7Cj4gKwlpZ3RfaW5mbygiaWRcdGVuY29kZXJcdHN0YXR1c1x0XHR0eXBlXHRzaXplIChtbSlc dG1vZGVzXG4iKTsKPiArCWZvciAoaSA9IDA7IGkgPCBtb2RlX3Jlc291cmNlcy0+Y291bnRfY29u bmVjdG9yczsgaSsrKSB7Cj4gKwkJZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9yOwo+ICsKPiAr CQljb25uZWN0b3IgPSBkcm1Nb2RlR2V0Q29ubmVjdG9yQ3VycmVudChkcm1mZCwKPiArCQkJCQkJ ICAgICAgIG1vZGVfcmVzb3VyY2VzLT5jb25uZWN0b3JzW2ldKTsKPiArCQlpZiAoIWNvbm5lY3Rv cikgewo+ICsJCQlpZ3Rfd2FybigiY291bGQgbm90IGdldCBjb25uZWN0b3IgJWk6ICVzXG4iLCBt b2RlX3Jlc291cmNlcy0+Y29ubmVjdG9yc1tpXSwgc3RyZXJyb3IoZXJybm8pKTsKPiArCQkJY29u dGludWU7Cj4gKwkJfQo+ICsKPiArCQlpZ3RfaW5mbygiJWRcdCVkXHQlc1x0JXNcdCVkeCVkXHRc dCVkXG4iLCBjb25uZWN0b3ItPmNvbm5lY3Rvcl9pZCwgY29ubmVjdG9yLT5lbmNvZGVyX2lkLCBr bXN0ZXN0X2Nvbm5lY3Rvcl9zdGF0dXNfc3RyKGNvbm5lY3Rvci0+Y29ubmVjdGlvbiksIGttc3Rl c3RfY29ubmVjdG9yX3R5cGVfc3RyKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUpLCBjb25uZWN0 b3ItPm1tV2lkdGgsIGNvbm5lY3Rvci0+bW1IZWlnaHQsIGNvbm5lY3Rvci0+Y291bnRfbW9kZXMp Owo+ICsKPiArCQlpZiAoIWNvbm5lY3Rvci0+Y291bnRfbW9kZXMpCj4gKwkJCWNvbnRpbnVlOwo+ ICsKPiArCQlpZ3RfaW5mbygiICBtb2RlczpcbiIpOwo+ICsJCWlndF9pbmZvKCIgIG5hbWUgcmVm cmVzaCAoSHopIGhkaXNwIGhzcyBoc2UgaHRvdCB2ZGlzcCAiInZzcyB2c2UgdnRvdCBmbGFncyB0 eXBlIGNsb2NrXG4iKTsKPiArCQlmb3IgKGogPSAwOyBqIDwgY29ubmVjdG9yLT5jb3VudF9tb2Rl czsgaisrKSB7Cj4gKwkJCWlndF9pbmZvKCJbJWRdIiwgaik7Cj4gKwkJCWttc3Rlc3RfZHVtcF9t b2RlKCZjb25uZWN0b3ItPm1vZGVzW2pdKTsKPiArCQl9Cj4gKwo+ICsJCWRybU1vZGVGcmVlQ29u bmVjdG9yKGNvbm5lY3Rvcik7Cj4gKwl9Cj4gKwlpZ3RfaW5mbygiXG4iKTsKPiArCj4gKwlkcm1N b2RlRnJlZVJlc291cmNlcyhtb2RlX3Jlc291cmNlcyk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lk IGR1bXBfY3J0Y3NfZmQoaW50IGRybWZkKQo+ICt7Cj4gKwlpbnQgaTsKPiArCWRybU1vZGVSZXMg Km1vZGVfcmVzb3VyY2VzID0gZHJtTW9kZUdldFJlc291cmNlcyhkcm1mZCk7Cj4gKwoKTmVlZCB0 byBjaGVjayBmb3IgbW9kZV9yZXNvdXJjZXMgPT0gTlVMTCBiZWZvcmUgdXNpbmcgaXQuCgo+ICsJ aWd0X2luZm8oIkNSVENzOlxuIik7Cj4gKwlpZ3RfaW5mbygiaWRcdGZiXHRwb3NcdHNpemVcbiIp Owo+ICsJZm9yIChpID0gMDsgaSA8IG1vZGVfcmVzb3VyY2VzLT5jb3VudF9jcnRjczsgaSsrKSB7 Cj4gKwkJZHJtTW9kZUNydGMgKmNydGM7Cj4gKwo+ICsJCWNydGMgPSBkcm1Nb2RlR2V0Q3J0Yyhk cm1mZCwgbW9kZV9yZXNvdXJjZXMtPmNydGNzW2ldKTsKPiArCQlpZiAoIWNydGMpIHsKPiArCQkJ aWd0X3dhcm4oImNvdWxkIG5vdCBnZXQgY3J0YyAlaTogJXNcbiIsIG1vZGVfcmVzb3VyY2VzLT5j cnRjc1tpXSwgc3RyZXJyb3IoZXJybm8pKTsKPiArCQkJY29udGludWU7Cj4gKwkJfQo+ICsJCWln dF9pbmZvKCIlZFx0JWRcdCglZCwlZClcdCglZHglZClcbiIsIGNydGMtPmNydGNfaWQsIGNydGMt PmJ1ZmZlcl9pZCwgY3J0Yy0+eCwgY3J0Yy0+eSwgY3J0Yy0+d2lkdGgsIGNydGMtPmhlaWdodCk7 Cj4gKwkJa21zdGVzdF9kdW1wX21vZGUoJmNydGMtPm1vZGUpOwo+ICsKPiArCQlkcm1Nb2RlRnJl ZUNydGMoY3J0Yyk7Cj4gKwl9Cj4gKwlpZ3RfaW5mbygiXG4iKTsKPiArCj4gKwlkcm1Nb2RlRnJl ZVJlc291cmNlcyhtb2RlX3Jlc291cmNlcyk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGR1bXBf aW5mbyh2b2lkKQo+ICt7Cj4gKwlkdW1wX2Nvbm5lY3RvcnNfZmQoZHJtX2ZkKTsKPiArCWR1bXBf Y3J0Y3NfZmQoZHJtX2ZkKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBzZXR1cF9mcmFtZWJ1ZmZl cnMoc3RydWN0IGNvbm5lY3RvciAqZHBfY29ubikKCnN0YXRpYyB2b2lkPyAgSSBkb24ndCBzZWUg YW55IGZhaWx1cmUgY2FzZWVzIGhlcmUuCgo+ICt7Cj4gKwoKUGFyYW5vaWE6IGNoZWNrIGZvciBu b24tTlVMTCBkcF9jb25uPwoKPiArCWRwX2Nvbm4tPmZiID0gaWd0X2NyZWF0ZV9mYihkcm1fZmQs Cj4gKwkJCQkgICAgZHBfY29ubi0+ZmJfd2lkdGgsIGRwX2Nvbm4tPmZiX2hlaWdodCwKPiArCQkJ CSAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAo+ICsJCQkJICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9E X05PTkUsCj4gKwkJCQkgICAgJmRwX2Nvbm4tPmZiX3ZpZGVvX3BhdHRlcm4pOwo+ICsJaWd0X2Fz c2VydChkcF9jb25uLT5mYik7Cj4gKwo+ICsJLyogTWFwIHRoZSBtYXBwaW5nIG9mIEdFTSBvYmpl Y3QgaW50byB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlICovCj4gKwlkcF9jb25uLT5waXhtYXAg PSBnZW1fbW1hcF9fZ3R0KGRybV9mZCwKPiArCQkJCQlkcF9jb25uLT5mYl92aWRlb19wYXR0ZXJu LmdlbV9oYW5kbGUsCj4gKwkJCQkJZHBfY29ubi0+ZmJfdmlkZW9fcGF0dGVybi5zaXplLAo+ICsJ CQkJCVBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwo+ICsJZ2VtX3NldF9kb21haW4oZHJtX2ZkLCBk cF9jb25uLT5mYl92aWRlb19wYXR0ZXJuLmdlbV9oYW5kbGUsCj4gKwkJICAgICAgIEk5MTVfR0VN X0RPTUFJTl9HVFQsIEk5MTVfR0VNX0RPTUFJTl9HVFQpOwo+ICsJZHBfY29ubi0+ZmJfc2l6ZSA9 IGRwX2Nvbm4tPmZiX3ZpZGVvX3BhdHRlcm4uc2l6ZTsKPiArCj4gKwkvKiBBZnRlciBmaWxsaW5n IHRoZSBkZXZpY2UgbWVtb3J5IHdpdGggMHMgaXQgbmVlZHMgdG8gYmUgdW5tYXBwZWQgKi8KPiAr CW1lbXNldChkcF9jb25uLT5waXhtYXAsIDAsIGRwX2Nvbm4tPmZiX3NpemUpOwo+ICsJbXVubWFw KGRwX2Nvbm4tPnBpeG1hcCwgZHBfY29ubi0+ZmJfc2l6ZSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgc2V0dXBfZmFpbHNhZmVfZnJhbWVidWZmZXIoc3RydWN0IGNv bm5lY3RvciAqZHBfY29ubikKPiArewo+ICsKPiArCWRwX2Nvbm4tPmZhaWxzYWZlX2ZiID0gaWd0 X2NyZWF0ZV9mYihkcm1fZmQsCj4gKwkJCQkJICAgICBkcF9jb25uLT5mYWlsc2FmZV93aWR0aCwK PiArCQkJCQkgICAgIGRwX2Nvbm4tPmZhaWxzYWZlX2hlaWdodCwKPiArCQkJCQkgICAgIERSTV9G T1JNQVRfWFJHQjg4ODgsCj4gKwkJCQkJICAgICBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLAo+ ICsJCQkJCSAgICAgJmRwX2Nvbm4tPmZiX2ZhaWxzYWZlX3BhdHRlcm4pOwo+ICsJaWd0X2Fzc2Vy dChkcF9jb25uLT5mYWlsc2FmZV9mYik7Cj4gKwo+ICsJLyogTWFwIHRoZSBtYXBwaW5nIG9mIEdF TSBvYmplY3QgaW50byB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlICovCj4gKwlkcF9jb25uLT5m YWlsc2FmZV9waXhtYXAgPSBnZW1fbW1hcF9fZ3R0KGRybV9mZCwKPiArCQkJCQkJIGRwX2Nvbm4t PmZiX2ZhaWxzYWZlX3BhdHRlcm4uZ2VtX2hhbmRsZSwKPiArCQkJCQkJIGRwX2Nvbm4tPmZiX2Zh aWxzYWZlX3BhdHRlcm4uc2l6ZSwKPiArCQkJCQkJIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwo+ ICsJZ2VtX3NldF9kb21haW4oZHJtX2ZkLCBkcF9jb25uLT5mYl9mYWlsc2FmZV9wYXR0ZXJuLmdl bV9oYW5kbGUsCj4gKwkJICAgICAgIEk5MTVfR0VNX0RPTUFJTl9HVFQsIEk5MTVfR0VNX0RPTUFJ Tl9HVFQpOwo+ICsJZHBfY29ubi0+ZmFpbHNhZmVfc2l6ZSA9IGRwX2Nvbm4tPmZiX2ZhaWxzYWZl X3BhdHRlcm4uc2l6ZTsKPiArCj4gKwkvKiBBZnRlciBmaWxsaW5nIHRoZSBkZXZpY2UgZnJhbWVi dWZmZXIgdGhlIG1hcHBlZCBtZW1vcnkgbmVlZHMgdG8gYmUgZnJlZWQgKi8KPiArCW1lbXNldChk cF9jb25uLT5mYWlsc2FmZV9waXhtYXAsIDAsIGRwX2Nvbm4tPmZhaWxzYWZlX3NpemUpOwo+ICsJ bXVubWFwKGRwX2Nvbm4tPmZhaWxzYWZlX3BpeG1hcCwgZHBfY29ubi0+ZmFpbHNhZmVfc2l6ZSk7 Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHNldHVwX3ZpZGVv X3BhdHRlcm5fZnJhbWVidWZmZXIoc3RydWN0IGNvbm5lY3RvciAqZHBfY29ubikKPiArewo+ICsJ dWludDMyX3QgIHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQ7Cj4gKwo+ICsJdmlkZW9fd2lkdGgg PSBkcF9jb25uLT50ZXN0X3BhdHRlcm4uaGRpc3BsYXk7Cj4gKwl2aWRlb19oZWlnaHQgPSBkcF9j b25uLT50ZXN0X3BhdHRlcm4udmRpc3BsYXk7Cj4gKwlkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmIg PSBpZ3RfY3JlYXRlX2ZiKGRybV9mZCwKPiArCQkJCQkJIHZpZGVvX3dpZHRoLCB2aWRlb19oZWln aHQsCj4gKwkJCQkJCSBEUk1fRk9STUFUX1hSR0I4ODg4LAo+ICsJCQkJCQkgTE9DQUxfRFJNX0ZP Uk1BVF9NT0RfTk9ORSwKPiArCQkJCQkJICZkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmJfcGF0dGVy bik7Cj4gKwlpZ3RfYXNzZXJ0KGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5mYik7Cj4gKwo+ICsJLyog TWFwIHRoZSBtYXBwaW5nIG9mIEdFTSBvYmplY3QgaW50byB0aGUgdmlydHVhbCBhZGRyZXNzIHNw YWNlICovCj4gKwlkcF9jb25uLT50ZXN0X3BhdHRlcm4ucGl4bWFwID0gZ2VtX21tYXBfX2d0dChk cm1fZmQsCj4gKwkJCQkJCSAgICAgZHBfY29ubi0+dGVzdF9wYXR0ZXJuLmZiX3BhdHRlcm4uZ2Vt X2hhbmRsZSwKPiArCQkJCQkJICAgICBkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmJfcGF0dGVybi5z aXplLAo+ICsJCQkJCQkgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwo+ICsJZ2VtX3NldF9k b21haW4oZHJtX2ZkLCBkcF9jb25uLT50ZXN0X3BhdHRlcm4uZmJfcGF0dGVybi5nZW1faGFuZGxl LAo+ICsJCSAgICAgICBJOTE1X0dFTV9ET01BSU5fR1RULCBJOTE1X0dFTV9ET01BSU5fR1RUKTsK PiArCj4gKwlkcF9jb25uLT50ZXN0X3BhdHRlcm4uc2l6ZSA9IGRwX2Nvbm4tPnRlc3RfcGF0dGVy bi5mYl9wYXR0ZXJuLnNpemU7Cj4gKwo+ICsJbWVtc2V0KGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5w aXhtYXAsIDAsIGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5zaXplKTsKPiArCXJldHVybiAwOwo+ICsK PiArfQo+ICsKPiArc3RhdGljIGludCBmaWxsX2ZyYW1lYnVmZmVyKHN0cnVjdCBjb25uZWN0b3Ig KmRwX2Nvbm4pCj4gK3sKPiArCXVpbnQzMl90IHRpbGVfaGVpZ2h0LCB0aWxlX3dpZHRoLCB2aWRl b193aWR0aCwgdmlkZW9faGVpZ2h0Owo+ICsJdWludDMyX3QgKnJlZF9wdHIsICpncmVlbl9wdHIs ICpibHVlX3B0ciwgKndoaXRlX3B0ciwgKnNyY19wdHIsICpkc3RfcHRyOwo+ICsJaW50IHgsIHk7 Cj4gKwlpbnQzMl90IHBpeGVsX3ZhbDsKPiArCj4gKwl2aWRlb193aWR0aCA9IGRwX2Nvbm4tPnRl c3RfcGF0dGVybi5oZGlzcGxheTsKPiArCXZpZGVvX2hlaWdodCA9IGRwX2Nvbm4tPnRlc3RfcGF0 dGVybi52ZGlzcGxheTsKPiArCj4gKwl0aWxlX2hlaWdodCA9IDY0Owo+ICsJdGlsZV93aWR0aCA9 IDEgPDwgIChkcF9jb25uLT50ZXN0X3BhdHRlcm4uYml0ZGVwdGgpOwo+ICsKPiArCXJlZF9wdHIg PSBkcF9jb25uLT50ZXN0X3BhdHRlcm4ucGl4bWFwOwo+ICsJZ3JlZW5fcHRyID0gcmVkX3B0ciAr ICh2aWRlb193aWR0aCAqIHRpbGVfaGVpZ2h0KTsKPiArCWJsdWVfcHRyID0gZ3JlZW5fcHRyICsg KHZpZGVvX3dpZHRoICogdGlsZV9oZWlnaHQpOwo+ICsJd2hpdGVfcHRyID0gYmx1ZV9wdHIgKyAo dmlkZW9fd2lkdGggKiB0aWxlX2hlaWdodCk7Cj4gKwl4ID0gMDsKPiArCj4gKwkvKiBGaWxsIHRo ZSBmcmFtZSBidWZmZXIgd2l0aCB2aWRlbyBwYXR0ZXJuIGZyb20gQ1RTIDMuMS41ICovCj4gKwl3 aGlsZSAoeCA8IHZpZGVvX3dpZHRoKSB7Cj4gKwkJZm9yIChwaXhlbF92YWwgPSAwOyBwaXhlbF92 YWwgPCAyNTY7Cj4gKwkJICAgICBwaXhlbF92YWwgPSBwaXhlbF92YWwgKyAoMjU2IC8gdGlsZV93 aWR0aCkpIHsKPiArCQkJcmVkX3B0clt4XSA9IHBpeGVsX3ZhbCA8PCAxNjsKPiArCQkJZ3JlZW5f cHRyW3hdID0gcGl4ZWxfdmFsIDw8IDg7Cj4gKwkJCWJsdWVfcHRyW3hdID0gcGl4ZWxfdmFsIDw8 IDA7Cj4gKwkJCXdoaXRlX3B0clt4XSA9IHJlZF9wdHJbeF0gfCBncmVlbl9wdHJbeF0gfCBibHVl X3B0clt4XTsKPiArCQkJaWYgKCsreCA+PSB2aWRlb193aWR0aCkKPiArCQkJCWJyZWFrOwo+ICsJ CX0KPiArCX0KPiArCWZvciAoeSA9IDA7IHkgPCB2aWRlb19oZWlnaHQ7IHkrKykgewo+ICsJCWlm ICh5ID09IDAgfHwgeSA9PSA2NCB8fCB5ID09IDEyOCB8fCB5ID09IDE5MikKPiArCQkJY29udGlu dWU7Cj4gKwkJc3dpdGNoICgoeSAvIHRpbGVfaGVpZ2h0KSAlIDQpIHsKPiArCQljYXNlIDA6Cj4g KwkJCXNyY19wdHIgPSByZWRfcHRyOwo+ICsJCQlicmVhazsKPiArCQljYXNlIDE6Cj4gKwkJCXNy Y19wdHIgPSBncmVlbl9wdHI7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgMjoKPiArCQkJc3JjX3B0 ciA9IGJsdWVfcHRyOwo+ICsJCQlicmVhazsKPiArCQljYXNlIDM6Cj4gKwkJCXNyY19wdHIgPSB3 aGl0ZV9wdHI7Cj4gKwkJCWJyZWFrOwo+ICsJCX0KPiArCQlkc3RfcHRyID0gZHBfY29ubi0+dGVz dF9wYXR0ZXJuLnBpeG1hcCArICh5ICogdmlkZW9fd2lkdGgpOwo+ICsJCW1lbWNweShkc3RfcHRy LCBzcmNfcHRyLCAodmlkZW9fd2lkdGggKiA0KSk7Cj4gKwl9Cj4gKwltdW5tYXAoZHBfY29ubi0+ dGVzdF9wYXR0ZXJuLnBpeG1hcCwKPiArCSAgICAgICBkcF9jb25uLT50ZXN0X3BhdHRlcm4uc2l6 ZSk7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBzZXRfdGVzdF9tb2RlKHN0 cnVjdCBjb25uZWN0b3IgKmRwX2Nvbm4pCj4gK3sKPiArCWludCByZXQgPSAwOwo+ICsJaW50IGk7 Cj4gKwlib29sIGZvdW5kX3N0ZCA9IGZhbHNlLCBmb3VuZF9mcyA9IGZhbHNlOwo+ICsJZHJtTW9k ZUNvbm5lY3RvciAqYyA9IGRwX2Nvbm4tPmNvbm5lY3RvcjsKPiArCj4gKwkvKiBJZ25vcmUgYW55 IGRpc2Nvbm5lY3RlZCBkZXZpY2VzICovCj4gKwlpZiAoYy0+Y29ubmVjdGlvbiAhPSBEUk1fTU9E RV9DT05ORUNURUQpIHsKPiArCQlpZ3Rfd2FybigiQ29ubmVjdG9yICV1IGRpc2Nvbm5lY3RlZFxy XG4iLCBjLT5jb25uZWN0b3JfaWQpOwo+ICsJCXJldHVybiAtRU5PRU5UOwo+ICsJfQo+ICsJaWd0 X2luZm8oIkNvbm5lY3RvciBTZXR1cDpcclxuIik7Cj4gKwkvKiBTZXR1cCBwcmVmZXJyZWQgbW9k ZSAtIHNob3VsZCBiZSBtb2RlWzBdIGluIHRoZSBsaXN0ICovCj4gKwlkcF9jb25uLT5tb2RlX3By ZWZlcnJlZCA9IGMtPm1vZGVzWzBdOwo+ICsJZHBfY29ubi0+ZmJfd2lkdGggPSBjLT5tb2Rlc1sw XS5oZGlzcGxheTsKPiArCWRwX2Nvbm4tPmZiX2hlaWdodCA9IGMtPm1vZGVzWzBdLnZkaXNwbGF5 Owo+ICsKPiArCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5tb2RlID0gYy0+bW9kZXNbMF07Cj4gKwlk cF9jb25uLT50ZXN0X3BhdHRlcm4ubW9kZS5oZGlzcGxheSA9IGMtPm1vZGVzWzBdLmhkaXNwbGF5 Owo+ICsJZHBfY29ubi0+dGVzdF9wYXR0ZXJuLm1vZGUudmRpc3BsYXkgPSBjLT5tb2Rlc1swXS52 ZGlzcGxheTsKPiArCj4gKwlpZ3RfaW5mbygiUHJlZmVycmVkIG1vZGUgKG1vZGUgMCkgZm9yIGNv bm5lY3RvciAldSBpcyAldXgldVxyXG4iLAo+ICsJCSBkcF9jb25uLT5pZCwgYy0+bW9kZXNbMF0u aGRpc3BsYXksIGMtPm1vZGVzWzBdLnZkaXNwbGF5KTsKPiArCWZmbHVzaChzdGRpbik7Cj4gKwo+ ICsJZm9yIChpID0gMTsgaSA8IGMtPmNvdW50X21vZGVzOyBpKyspIHsKPiArCQkvKiBTdGFuZGFy ZCBtb2RlIGlzIDgwMHg2MDBANjAgKi8KPiArCQlpZiAoYy0+bW9kZXNbaV0uaGRpc3BsYXkgPT0g ODAwICYmCj4gKwkJICAgIGMtPm1vZGVzW2ldLnZkaXNwbGF5ID09IDYwMCAmJgo+ICsJCSAgICBj LT5tb2Rlc1tpXS52cmVmcmVzaCA9PSA2MCAmJgo+ICsJCSAgICBmb3VuZF9zdGQgPT0gZmFsc2Up IHsKPiArCQkJZHBfY29ubi0+bW9kZV9zdGFuZGFyZCA9IGMtPm1vZGVzW2ldOwo+ICsJCQlpZ3Rf aW5mbygiU3RhbmRhcmQgbW9kZSAoJWQpIGZvciBjb25uZWN0b3IgJXUgaXMgJXV4JXVcclxuIiwK PiArCQkJCSBpLAo+ICsJCQkJIGMtPmNvbm5lY3Rvcl9pZCwKPiArCQkJCSBjLT5tb2Rlc1tpXS5o ZGlzcGxheSwKPiArCQkJCSBjLT5tb2Rlc1tpXS52ZGlzcGxheSk7Cj4gKwkJCWZvdW5kX3N0ZCA9 IHRydWU7Cj4gKwkJfQo+ICsJCS8qIEZhaWxzYWZlIG1vZGUgaXMgNjQweDQ4MEA2MCAqLwo+ICsJ CWlmIChjLT5tb2Rlc1tpXS5oZGlzcGxheSA9PSA2NDAgJiYKPiArCQkgICAgYy0+bW9kZXNbaV0u dmRpc3BsYXkgPT0gNDgwICYmCj4gKwkJICAgIGMtPm1vZGVzW2ldLnZyZWZyZXNoID09IDYwICYm Cj4gKwkJICAgIGZvdW5kX2ZzID09IGZhbHNlKSB7Cj4gKwkJCWRwX2Nvbm4tPm1vZGVfZmFpbHNh ZmUgPSBjLT5tb2Rlc1tpXTsKPiArCQkJZHBfY29ubi0+ZmFpbHNhZmVfd2lkdGggPSBjLT5tb2Rl c1tpXS5oZGlzcGxheTsKPiArCQkJZHBfY29ubi0+ZmFpbHNhZmVfaGVpZ2h0ID0gYy0+bW9kZXNb aV0udmRpc3BsYXk7Cj4gKwkJCWlndF9pbmZvKCJGYWlsc2FmZSBtb2RlICglZCkgZm9yIGNvbm5l Y3RvciAldSBpcyAldXgldVxyXG4iLAo+ICsJCQkJIGksCj4gKwkJCQkgYy0+Y29ubmVjdG9yX2lk LAo+ICsJCQkJIGMtPm1vZGVzW2ldLmhkaXNwbGF5LAo+ICsJCQkJIGMtPm1vZGVzW2ldLnZkaXNw bGF5KTsKPiArCQkJZm91bmRfZnMgPSB0cnVlOwo+ICsJCX0KPiArCX0KPiArCj4gKwlyZXQgPSBz ZXR1cF9mcmFtZWJ1ZmZlcnMoZHBfY29ubik7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJaWd0X3dhcm4o IkNyZWF0ZSBmcmFtZWJ1ZmZlciBmb3IgY29ubmVjdG9yICV1IGZhaWxlZCAoJWQpXHJcbiIsCj4g KwkJCSBjLT5jb25uZWN0b3JfaWQsIHJldCk7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4g KwlpZiAoZm91bmRfZnMpIHsKPiArCQlyZXQgPSBzZXR1cF9mYWlsc2FmZV9mcmFtZWJ1ZmZlcihk cF9jb25uKTsKPiArCQlpZiAocmV0KSB7Cj4gKwkJCWlndF93YXJuKCJDcmVhdGUgZmFpbHNhZmUg ZnJhbWVidWZmZXIgZm9yIGNvbm5lY3RvciAldSIKPiArCQkJCSAiZmFpbGVkICglZClcclxuIiwK PiArCQkJCSBjLT5jb25uZWN0b3JfaWQsIHJldCk7Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ ICsJfQo+ICsKPiArCWlmICh2aWRlb19wYXR0ZXJuX2ZsYWcpIHsKPiArCQlkcF9jb25uLT50ZXN0 X3BhdHRlcm4uaGRpc3BsYXkgPSBoZGlzcGxheTsKPiArCQlkcF9jb25uLT50ZXN0X3BhdHRlcm4u dmRpc3BsYXkgPSB2ZGlzcGxheTsKPiArCQlkcF9jb25uLT50ZXN0X3BhdHRlcm4uYml0ZGVwdGgg PSBiaXRkZXB0aDsKPiArCQlyZXQgPSBzZXR1cF92aWRlb19wYXR0ZXJuX2ZyYW1lYnVmZmVyKGRw X2Nvbm4pOwo+ICsJCWlmIChyZXQpIHsKPiArCQkJaWd0X3dhcm4oIkNyZWF0ZSBmcmFtZWJ1ZmZl ciBmb3IgY29ubmVjdG9yICV1IGZhaWxlZCAoJWQpXHJcbiIsCj4gKwkJCQkgYy0+Y29ubmVjdG9y X2lkLCByZXQpOwo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0KPiArCQlyZXQgPSBmaWxsX2ZyYW1l YnVmZmVyKGRwX2Nvbm4pOwo+ICsJCWlmIChyZXQpIHsKPiArCQkJaWd0X3dhcm4oIkZpbGwgZnJh bWVidWZmZXIgZm9yIGNvbm5lY3RvciAldSBmYWlsZWQgKCVkKVxyXG4iLAo+ICsJCQkJIGMtPmNv bm5lY3Rvcl9pZCwgcmV0KTsKPiArCQkJcmV0dXJuIHJldDsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJ cmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBzZXRfdmlkZW8oaW50IG1vZGUsIHN0 cnVjdCBjb25uZWN0b3IgKnRlc3RfY29ubmVjdG9yKQo+ICt7Cj4gKwlkcm1Nb2RlTW9kZUluZm8g KnJlcXVlc3RlZF9tb2RlOwo+ICsJdWludDMyX3QgcmVxdWlyZWRfZmJfaWQ7Cj4gKwlzdHJ1Y3Qg aWd0X2ZiIHJlcXVpcmVkX2ZiOwo+ICsJaW50IHJldCA9IDA7Cj4gKwo+ICsJc3dpdGNoIChtb2Rl KSB7Cj4gKwljYXNlIElOVEVMX01PREVfTk9ORToKPiArCQlpZ3RfaW5mbygiTk9ORVxyXG4iKTsK PiArCQlyZXQgPSBkcm1Nb2RlU2V0Q3J0Yyhkcm1fZmQsIHRlc3RfY29ubmVjdG9yLT5jcnRjLAo+ ICsJCQkJICAgICAtMSwgMCwgMCwgTlVMTCwgMCwgTlVMTCk7Cj4gKwkJZ290byBvdXQ7Cj4gKwlj YXNlIElOVEVMX01PREVfUFJFRkVSUkVEOgo+ICsJCWlndF9pbmZvKCJQUkVGRVJSRURcclxuIik7 Cj4gKwkJcmVxdWVzdGVkX21vZGUgPSAgJnRlc3RfY29ubmVjdG9yLT5tb2RlX3ByZWZlcnJlZDsK PiArCQlyZXF1aXJlZF9mYl9pZCA9IHRlc3RfY29ubmVjdG9yLT5mYjsKPiArCQlyZXF1aXJlZF9m YiA9IHRlc3RfY29ubmVjdG9yLT5mYl92aWRlb19wYXR0ZXJuOwo+ICsJCWJyZWFrOwo+ICsJY2Fz ZSBJTlRFTF9NT0RFX1NUQU5EQVJEOgo+ICsJCWlndF9pbmZvKCJTVEFOREFSRFxyXG4iKTsKPiAr CQlyZXF1ZXN0ZWRfbW9kZSA9ICAmdGVzdF9jb25uZWN0b3ItPm1vZGVfc3RhbmRhcmQ7Cj4gKwkJ cmVxdWlyZWRfZmJfaWQgPSB0ZXN0X2Nvbm5lY3Rvci0+ZmI7Cj4gKwkJcmVxdWlyZWRfZmIgPSB0 ZXN0X2Nvbm5lY3Rvci0+ZmJfdmlkZW9fcGF0dGVybjsKPiArCQlicmVhazsKPiArCWNhc2UgSU5U RUxfTU9ERV9GQUlMU0FGRToKPiArCQlpZ3RfaW5mbygiRkFJTFNBRkVcclxuIik7Cj4gKwkJcmVx dWVzdGVkX21vZGUgPSAgJnRlc3RfY29ubmVjdG9yLT5tb2RlX2ZhaWxzYWZlOwo+ICsJCXJlcXVp cmVkX2ZiX2lkID0gdGVzdF9jb25uZWN0b3ItPmZhaWxzYWZlX2ZiOwo+ICsJCXJlcXVpcmVkX2Zi ID0gdGVzdF9jb25uZWN0b3ItPmZiX2ZhaWxzYWZlX3BhdHRlcm47Cj4gKwkJYnJlYWs7Cj4gKwlj YXNlIElOVEVMX01PREVfVklERU9fUEFUVEVSTl9URVNUOgo+ICsJCWlndF9pbmZvKCJWSURFTyBQ QVRURVJOIFRFU1RcclxuIik7Cj4gKwkJcmVxdWVzdGVkX21vZGUgPSAmdGVzdF9jb25uZWN0b3It PnRlc3RfcGF0dGVybi5tb2RlOwo+ICsJCXJlcXVpcmVkX2ZiX2lkID0gdGVzdF9jb25uZWN0b3It PnRlc3RfcGF0dGVybi5mYjsKPiArCQlyZXF1aXJlZF9mYiA9IHRlc3RfY29ubmVjdG9yLT50ZXN0 X3BhdHRlcm4uZmJfcGF0dGVybjsKPiArCQlicmVhazsKPiArCWNhc2UgSU5URUxfTU9ERV9JTlZB TElEOgo+ICsJZGVmYXVsdDoKPiArCQlpZ3Rfd2FybigiSU5WQUxJRCEgKCUwOHgpIE1vZGUgc2V0 IGFib3J0ZWQhXHJcbiIsIG1vZGUpOwo+ICsJCXJldHVybiAtMTsKPiArCX0KPiArCj4gKwlpZ3Rf aW5mbygiQ1JUQygldSk6IiwgdGVzdF9jb25uZWN0b3ItPmNydGMpOwo+ICsJa21zdGVzdF9kdW1w X21vZGUocmVxdWVzdGVkX21vZGUpOwo+ICsJcmV0ID0gZHJtTW9kZVNldENydGMoZHJtX2ZkLCB0 ZXN0X2Nvbm5lY3Rvci0+Y3J0YywgcmVxdWlyZWRfZmJfaWQsIDAsIDAsCj4gKwkJCSAgICAgJnRl c3RfY29ubmVjdG9yLT5pZCwgMSwgcmVxdWVzdGVkX21vZGUpOwo+ICsJaWYgKHJldCkgewo+ICsJ CWlndF93YXJuKCJmYWlsZWQgdG8gc2V0IG1vZGUgKCVkeCVkQCVkSHopOiAlc1xuIiwKPiArCQkJ IHJlcXVlc3RlZF9tb2RlLT5oZGlzcGxheSwgcmVxdWVzdGVkX21vZGUtPnZkaXNwbGF5LAo+ICsJ CQkgcmVxdWVzdGVkX21vZGUtPnZyZWZyZXNoLCBzdHJlcnJvcihlcnJubykpOwo+ICsJCWlndF9y ZW1vdmVfZmIoZHJtX2ZkLCAmcmVxdWlyZWRfZmIpOwo+ICsKPiArCX0KPiArCS8qIEtlZXAgdGhl IHBhdHRlcm4gb24gb3V0cHV0IGxpbmVzIGZvciBhdGxlYXN0IDAuNSBzZWNzIGZvcgo+ICsJICog RFBSLTEyMCB0byBkZXRlY3QgaXQuCj4gKwkgKi8KPiArCXVzbGVlcCgxMDAwMDAwKTsKCkNvbnNp ZGVyIGEgI2RlZmluZSBmb3IgdGhpcyB2YWx1ZT8KCj4gKwo+ICtvdXQ6Cj4gKwlpZiAocmV0KSB7 Cj4gKwkJaWd0X3dhcm4oIkZhaWxlZCB0byBzZXQgQ1JUQyBmb3IgY29ubmVjdG9yICV1XHJcbiIs Cj4gKwkJCSB0ZXN0X2Nvbm5lY3Rvci0+aWQpOwo+ICsJfQo+ICsKPiArCXJldHVybiByZXQ7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQKPiArc2V0X2RlZmF1bHRfbW9kZShzdHJ1Y3QgY29ubmVjdG9y ICpjLCBib29sIHNldF9tb2RlKQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQgZmJfaWQgPSAwOwo+ICsJ c3RydWN0IGlndF9mYiBmYl9pbmZvOwo+ICsJaW50IHJldCA9IDA7Cj4gKwo+ICsJaWYgKCFzZXRf bW9kZSkgewo+ICsJCXJldCA9IGRybU1vZGVTZXRDcnRjKGRybV9mZCwgYy0+Y3J0YywgMCwgMCwg MCwKPiArCQkJCSAgICAgTlVMTCwgMCwgTlVMTCk7Cj4gKwkJaWYgKHJldCkKPiArCQkJaWd0X3dh cm4oImZhaWxlZCB0byB1bnNldCBtb2RlIik7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4g KwljLT5tb2RlID0gYy0+Y29ubmVjdG9yLT5tb2Rlc1swXTsKPiArCj4gKwl3aWR0aCA9IGMtPm1v ZGUuaGRpc3BsYXk7Cj4gKwloZWlnaHQgPSBjLT5tb2RlLnZkaXNwbGF5Owo+ICsKPiArCWZiX2lk ID0gaWd0X2NyZWF0ZV9wYXR0ZXJuX2ZiKGRybV9mZCwgd2lkdGgsIGhlaWdodCwKPiArCQkJCSAg ICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCj4gKwkJCQkgICAgICB0aWxpbmcsICZmYl9pbmZvKTsK PiArCj4gKwlpZ3RfaW5mbygiQ1JUQygldSk6WyVkXSIsIGMtPmNydGMsIDApOwo+ICsJa21zdGVz dF9kdW1wX21vZGUoJmMtPm1vZGUpOwo+ICsJZHJtTW9kZVNldENydGMoZHJtX2ZkLCBjLT5jcnRj LCAtMSwgMCwgMCwgTlVMTCwgMCwgTlVMTCk7Cj4gKwlyZXQgPSBkcm1Nb2RlU2V0Q3J0Yyhkcm1f ZmQsIGMtPmNydGMsIGZiX2lkLCAwLCAwLAo+ICsJCQkgICAgICZjLT5pZCwgMSwgJmMtPm1vZGUp Owo+ICsJaWYgKHJldCkgewo+ICsJCWlndF93YXJuKCJmYWlsZWQgdG8gc2V0IG1vZGUgKCVkeCVk QCVkSHopOiAlc1xuIiwgd2lkdGgsIGhlaWdodCwgYy0+bW9kZS52cmVmcmVzaCwgc3RyZXJyb3Io ZXJybm8pKTsKPiArCQlpZ3RfcmVtb3ZlX2ZiKGRybV9mZCwgJmZiX2luZm8pOwo+ICsKPiArCX0K PiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdWludDMyX3QgZmluZF9jcnRj X2Zvcl9jb25uZWN0b3IoZHJtTW9kZUNvbm5lY3RvciAqYykKPiArewo+ICsJZHJtTW9kZUVuY29k ZXIgKmU7Cj4gKwl1aW50MzJfdCBwb3NzaWJsZV9jcnRjczsKPiArCWludCBpLCBqOwo+ICsKPiAr CWZvciAoaSA9IDA7IGkgPCBjLT5jb3VudF9lbmNvZGVyczsgaSsrKSB7Cj4gKwkJZSA9IGRybU1v ZGVHZXRFbmNvZGVyKGRybV9mZCwgYy0+ZW5jb2RlcnNbaV0pOwo+ICsJCXBvc3NpYmxlX2NydGNz ID0gZS0+cG9zc2libGVfY3J0Y3M7Cj4gKwkJZHJtTW9kZUZyZWVFbmNvZGVyKGUpOwo+ICsKPiAr CQlmb3IgKGogPSAwOyBwb3NzaWJsZV9jcnRjcyA+PiBqOyBqKyspCj4gKwkJCWlmIChwb3NzaWJs ZV9jcnRjcyAmICgxIDw8IGopKQo+ICsJCQkJcmV0dXJuIHJlc291cmNlcy0+Y3J0Y3Nbal07Cj4g Kwl9Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArLyoKPiArICogUmUtcHJvYmUgY29ubmVjdG9y cyBhbmQgZG8gYSBtb2Rlc2V0IGJhc2VkIG9uIHRlc3QgcmVxdWVzdCBvcgo+ICsgKiBpbiBjYXNl IG9mIGEgaG90cGx1ZyB1ZXZlbnQuCj4gKyAqCj4gKyAqIEBtb2RlOiBWaWRlbyBtb2RlIHJlcXVl c3RlZCBieSB0aGUgdGVzdAo+ICsgKiBAaXNfY29tcGxpYW5jZV90ZXN0OiAxOiBJZiBpdCBpcyBh IGNvbXBsaWFuY2UgdGVzdAo+ICsgKiAgICAgICAgICAgICAgICAgICAgICAwOiBJZiBpdCBpcyBh IGhvdHBsdWcgZXZlbnQKPiArICoKPiArICogUmV0dXJuczoKPiArICogMDogT24gU3VjY2Vzcwo+ ICsgKiAtMTogT24gZmFpbHVyZQo+ICsgKi8KPiAraW50IHVwZGF0ZV9kaXNwbGF5KGludCBtb2Rl LCBib29sIGlzX2NvbXBsaWFuY2VfdGVzdCkKPiArewo+ICsJc3RydWN0IGNvbm5lY3RvciAqY29u bmVjdG9ycywgKmNvbm47Cj4gKwlpbnQgY250LCByZXQgPSAwOwo+ICsJYm9vbCBzZXRfbW9kZTsK PiArCj4gKwlyZXNvdXJjZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRybV9mZCk7Cj4gKwlpZiAo IXJlc291cmNlcykgewo+ICsJCWlndF93YXJuKCJkcm1Nb2RlR2V0UmVzb3VyY2VzIGZhaWxlZDog JXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Cj4gKwkJcmV0dXJuIC0xOwo+ICsJfQo+ICsKPiArCWNv bm5lY3RvcnMgPSBjYWxsb2MocmVzb3VyY2VzLT5jb3VudF9jb25uZWN0b3JzLAo+ICsJCQkgICAg c2l6ZW9mKHN0cnVjdCBjb25uZWN0b3IpKTsKPiArCWlmICghY29ubmVjdG9ycykKPiArCQlyZXR1 cm4gLTE7Cj4gKwo+ICsJLyogRmluZCBhbnkgY29ubmVjdGVkIGRpc3BsYXlzICovCj4gKwlmb3Ig KGNudCA9IDA7IGNudCA8IHJlc291cmNlcy0+Y291bnRfY29ubmVjdG9yczsgY250KyspIHsKPiAr Cj4gKwkJY29ubiA9ICZjb25uZWN0b3JzW2NudF07Cj4gKwkJZHJtTW9kZUNvbm5lY3RvciAqYzsK PiArCj4gKwkJY29ubi0+aWQgPSByZXNvdXJjZXMtPmNvbm5lY3RvcnNbY250XTsKPiArCQljID0g ZHJtTW9kZUdldENvbm5lY3Rvcihkcm1fZmQsIGNvbm4tPmlkKTsKPiArCQlpZiAoYy0+Y29ubmVj dG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0ICYmCj4gKwkJICAgIGMt PmNvbm5lY3Rpb24gPT0gRFJNX01PREVfQ09OTkVDVEVEKSB7Cj4gKwkJCXRlc3RfY29ubmVjdG9y X2lkID0gYy0+Y29ubmVjdG9yX2lkOwo+ICsJCQljb25uLT5jb25uZWN0b3IgPSBjOwo+ICsJCQlj b25uLT5jcnRjID0gZmluZF9jcnRjX2Zvcl9jb25uZWN0b3IoYyk7Cj4gKwkJCXRlc3RfY3J0YyA9 IGNvbm4tPmNydGM7Cj4gKwkJCXNldF9tb2RlID0gdHJ1ZTsKPiArCQkJYnJlYWs7Cj4gKwkJfSBl bHNlIGlmIChjLT5jb25uZWN0b3JfaWQgPT0gdGVzdF9jb25uZWN0b3JfaWQgJiYKPiArCQkJICAg Yy0+Y29ubmVjdGlvbiA9PSBEUk1fTU9ERV9ESVNDT05ORUNURUQpIHsKPiArCQkJY29ubi0+Y29u bmVjdG9yID0gYzsKPiArCQkJY29ubi0+Y3J0YyA9IHRlc3RfY3J0YzsKPiArCQkJc2V0X21vZGUg PSBmYWxzZTsKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCWlmIChjbnQgPT0gcmVz b3VyY2VzLT5jb3VudF9jb25uZWN0b3JzKSB7Cj4gKwkJcmV0ID0gLTE7Cj4gKwkJZ290byBlcnI7 Cj4gKwl9Cj4gKwo+ICsJaWYgKGlzX2NvbXBsaWFuY2VfdGVzdCkgewo+ICsJCXNldF90ZXN0X21v ZGUoY29ubik7Cj4gKwkJcmV0ID0gc2V0X3ZpZGVvKElOVEVMX01PREVfTk9ORSwgY29ubik7Cj4g KwkJcmV0ID0gc2V0X3ZpZGVvKG1vZGUsIGNvbm4pOwo+ICsKPiArCX0gZWxzZQo+ICsJCXJldCA9 IHNldF9kZWZhdWx0X21vZGUoY29ubiwgc2V0X21vZGUpOwo+ICsKPiArIGVycjoKPiArCWRybU1v ZGVGcmVlQ29ubmVjdG9yKGNvbm4tPmNvbm5lY3Rvcik7Cj4gKwkvKiBFcnJvciBjb25kaXRpb24g aWYgbm8gY29ubmVjdGVkIGRpc3BsYXlzICovCj4gKwlmcmVlKGNvbm5lY3RvcnMpOwo+ICsJZHJt TW9kZUZyZWVSZXNvdXJjZXMocmVzb3VyY2VzKTsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4g K3N0YXRpYyBjb25zdCBjaGFyIG9wdHN0cltdID0gImhpIjsKPiArCj4gK3N0YXRpYyB2b2lkIF9f YXR0cmlidXRlX18oKG5vcmV0dXJuKSkgdXNhZ2UoY2hhciAqbmFtZSwgY2hhciBvcHQpCj4gK3sK PiArCWlndF9pbmZvKCJ1c2FnZTogJXMgWy1oaV1cbiIsIG5hbWUpOwo+ICsJaWd0X2luZm8oIlx0 LWlcdGR1bXAgaW5mb1xuIik7Cj4gKwlpZ3RfaW5mbygiXHREZWZhdWx0IGlzIHRvIHJlc3BvbmQg dG8gRFBSLTEyMCB0ZXN0cy5cbiIpOwo+ICsJZXhpdCgob3B0ICE9ICdoJykgPyAtMSA6IDApOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBjbGVhbnVwX2RlYnVnZnModm9pZCkKPiArewo+ICsJZmNs b3NlKHRlc3RfYWN0aXZlX2ZwKTsKPiArCWZjbG9zZSh0ZXN0X2RhdGFfZnApOwo+ICsJZmNsb3Nl KHRlc3RfdHlwZV9mcCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG5v cmV0dXJuKSkgY2xlYW51cF9hbmRfZXhpdChpbnQgcmV0KQo+ICt7Cj4gKwljbGVhbnVwX2RlYnVn ZnMoKTsKPiArCWNsb3NlKGRybV9mZCk7Cj4gKwlpZ3RfaW5mbygiQ29tcGxpYW5jZSB0ZXN0aW5n IEFwcGxpY2F0aW9uIEV4aXRpbmdcbiIpOwo+ICsJZXhpdChyZXQpOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCBjbGVhbnVwX3Rlc3Qodm9pZCkKPiArewo+ICsJdmlkZW9fcGF0dGVybl9mbGFnID0g ZmFsc2U7Cj4gKwloZGlzcGxheSA9IDA7Cj4gKwl2ZGlzcGxheSA9IDA7Cj4gKwliaXRkZXB0aCA9 IDA7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHJlYWRfdGVzdF9yZXF1ZXN0KHZvaWQpCj4gK3sK PiArCXVuc2lnbmVkIGxvbmcgdGVzdF90eXBlOwo+ICsKPiArCXRlc3RfdHlwZSA9IGdldF90ZXN0 X3R5cGUoKTsKPiArCXByb2Nlc3NfdGVzdF9yZXF1ZXN0KHRlc3RfdHlwZSk7Cj4gKwljbGVhbnVw X3Rlc3QoKTsKPiArCWNsZWFyX3Rlc3RfYWN0aXZlKCk7Cj4gK30KPiArCj4gK3N0YXRpYyBnYm9v bGVhbiB0ZXN0X2hhbmRsZXIoR0lPQ2hhbm5lbCAqc291cmNlLCBHSU9Db25kaXRpb24gY29uZGl0 aW9uLAo+ICsJCQkgICAgIGdwb2ludGVyIGRhdGEpCj4gK3sKPiArCXVuc2lnbmVkIGxvbmcgdGVz dF9hY3RpdmU7Cj4gKwo+ICsJcmV3aW5kKHRlc3RfYWN0aXZlX2ZwKTsKPiArCWZzY2FuZih0ZXN0 X2FjdGl2ZV9mcCwgIiVseCIsICZ0ZXN0X2FjdGl2ZSk7Cj4gKwlpZiAodGVzdF9hY3RpdmUpCj4g KwkJcmVhZF90ZXN0X3JlcXVlc3QoKTsKPiArCXJldHVybiBUUlVFOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgZ2Jvb2xlYW4gaW5wdXRfZXZlbnQoR0lPQ2hhbm5lbCAqc291cmNlLCBHSU9Db25kaXRpb24g Y29uZGl0aW9uLAo+ICsJCQkJZ3BvaW50ZXIgZGF0YSkKPiArewo+ICsJZ2NoYXIgYnVmWzJdOwo+ ICsJZ3NpemUgY291bnQ7Cj4gKwo+ICsJY291bnQgPSByZWFkKGdfaW9fY2hhbm5lbF91bml4X2dl dF9mZChzb3VyY2UpLCBidWYsIHNpemVvZihidWYpKTsKPiArCWlmIChidWZbMF0gPT0gJ3EnICYm IChjb3VudCA9PSAxIHx8IGJ1ZlsxXSA9PSAnXG4nKSkgewo+ICsJCWNsZWFudXBfYW5kX2V4aXQo MCk7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIFRSVUU7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGVu dGVyX2V4ZWNfcGF0aChjaGFyICoqYXJndikKPiArewo+ICsJY2hhciAqZXhlY19wYXRoID0gTlVM TDsKPiArCWNoYXIgKnBvcyA9IE5VTEw7Cj4gKwlzaG9ydCBsZW5fcGF0aCA9IDA7Cj4gKwlpbnQg cmV0Owo+ICsKPiArCWxlbl9wYXRoID0gc3RybGVuKGFyZ3ZbMF0pOwo+ICsJZXhlY19wYXRoID0g KGNoYXIgKikgbWFsbG9jKGxlbl9wYXRoKTsKPiArCj4gKwltZW1jcHkoZXhlY19wYXRoLCBhcmd2 WzBdLCBsZW5fcGF0aCk7Cj4gKwlwb3MgPSBzdHJyY2hyKGV4ZWNfcGF0aCwgJy8nKTsKPiArCWlm IChwb3MgIT0gTlVMTCkKPiArCQkqKHBvcysxKSA9ICdcMCc7Cj4gKwo+ICsJcmV0ID0gY2hkaXIo ZXhlY19wYXRoKTsKPiArCWlndF9hc3NlcnRfZXEocmV0LCAwKTsKPiArCWZyZWUoZXhlY19wYXRo KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmVzdG9yZV90ZXJtaW9fbW9kZShpbnQgc2lnKQo+ ICt7Cj4gKwl0Y3NldGF0dHIodGlvX2ZkLCBUQ1NBTk9XLCAmc2F2ZWRfdGlvKTsKPiArCWNsb3Nl KHRpb19mZCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHNldF90ZXJtaW9fbW9kZSh2b2lkKQo+ ICt7Cj4gKwlzdHJ1Y3QgdGVybWlvcyB0aW87Cj4gKwo+ICsJLyogZG9uJ3QgYXR0ZW1wdCB0byBz ZXQgdGVybWluYWwgYXR0cmlidXRlcyBpZiBub3QgaW4gdGhlIGZvcmVncm91bmQKPiArCSAqIHBy b2Nlc3MgZ3JvdXAKPiArCSAqLwo+ICsJaWYgKGdldHBncnAoKSAhPSB0Y2dldHBncnAoU1RET1VU X0ZJTEVOTykpCj4gKwkJcmV0dXJuOwo+ICsKPiArCXRpb19mZCA9IGR1cChTVERJTl9GSUxFTk8p Owo+ICsJdGNnZXRhdHRyKHRpb19mZCwgJnNhdmVkX3Rpbyk7Cj4gKwlpZ3RfaW5zdGFsbF9leGl0 X2hhbmRsZXIocmVzdG9yZV90ZXJtaW9fbW9kZSk7Cj4gKwl0aW8gPSBzYXZlZF90aW87Cj4gKwl0 aW8uY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOwo+ICsJdGNzZXRhdHRyKHRpb19mZCwgVENT QU5PVywgJnRpbyk7Cj4gK30KPiArCj4gK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikK PiArewo+ICsJaW50IGM7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCUdJT0NoYW5uZWwgKnN0ZGluY2hh bm5lbCwgKnRlc3RhY3RpdmVfY2hhbm5lbDsKPiArCUdNYWluTG9vcCAqbWFpbmxvb3A7Cj4gKwli b29sIG9wdF9kdW1wX2luZm8gPSBmYWxzZTsKPiArCXN0cnVjdCBvcHRpb24gbG9uZ19vcHRzW10g PSB7Cj4gKwkJeyJoZWxwLWRlc2NyaXB0aW9uIiwgMCwgMCwgSEVMUF9ERVNDUklQVElPTn0sCj4g KwkJeyJoZWxwIiwgMCwgMCwgJ2gnfSwKPiArCX07Cj4gKwo+ICsJaWd0X3NraXBfb25fc2ltdWxh dGlvbigpOwo+ICsKPiArCWVudGVyX2V4ZWNfcGF0aChhcmd2KTsKPiArCj4gKwl3aGlsZSAoKGMg PSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBvcHRzdHIsIGxvbmdfb3B0cywgTlVMTCkpICE9IC0x KSB7Cj4gKwkJc3dpdGNoIChjKSB7Cj4gKwkJY2FzZSAnaSc6Cj4gKwkJCW9wdF9kdW1wX2luZm8g PSB0cnVlOwo+ICsJCQlicmVhazsKPiArCQljYXNlIEhFTFBfREVTQ1JJUFRJT046Cj4gKwkJCWln dF9pbmZvKCJEUCBDb21wbGlhbmNlIFRlc3QgU3VpdGUgdXNpbmcgRFBSLTEyMFxuIik7Cj4gKwkJ CWlndF9pbmZvKCJFRElEIFRlc3RzXG4iKTsKPiArCQkJaWd0X2luZm8oIlZpZGVvIFBhdHRlcm4g R2VuZXJhdGlvbiBUZXN0c1xuIik7Cj4gKwkJCWV4aXQoMCk7Cj4gKwkJCWJyZWFrOwo+ICsJCWRl ZmF1bHQ6Cj4gKwkJCS8qIGZhbGwgdGhyb3VnaCAqLwo+ICsJCWNhc2UgJ2gnOgo+ICsJCQl1c2Fn ZShhcmd2WzBdLCBjKTsKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXNldF90ZXJt aW9fbW9kZSgpOwo+ICsKPiArCWlndF9pbmZvKCIqKioqKioqKioqKioqRFAgQ29tcGxpYW5jZSBU ZXN0aW5nIHVzaW5nIERQUi0xMjAqKioqKioqKioqKioqXG4iKTsKPiArCWlndF9pbmZvKCJXYWl0 aW5nIGZvciBUZXN0IFJlcXVlc3QgSW5wdXQuLi4uLi5cbiIpOwo+ICsJZHJtX2ZkID0gZHJtX29w ZW5fZHJpdmVyKERSSVZFUl9BTlkpOwo+ICsKPiArCWttc3Rlc3Rfc2V0X3Z0X2dyYXBoaWNzX21v ZGUoKTsKPiArCXNldHVwX2RlYnVnZnNfZmlsZXMoKTsKPiArCWNsZWFudXBfdGVzdCgpOwo+ICsK PiArCWlmIChvcHRfZHVtcF9pbmZvKSB7Cj4gKwkJZHVtcF9pbmZvKCk7Cj4gKwkJZ290byBvdXRf Y2xvc2U7Cj4gKwl9Cj4gKwo+ICsJLyogR2V0IHRoZSBEUCBjb25uZWN0b3IgSUQgYW5kIENSVEMg Ki8KPiArCWlmICh1cGRhdGVfZGlzcGxheSgwLCBmYWxzZSkpIHsKPiArCQlpZ3Rfd2FybigiRmFp bGVkIHRvIHNldCBkZWZhdWx0IG1vZGVcbiIpOwo+ICsJCXJldCA9IC0xOwo+ICsJCWdvdG8gb3V0 X2Nsb3NlOwo+ICsJfQo+ICsKPiArCW1haW5sb29wID0gZ19tYWluX2xvb3BfbmV3KE5VTEwsIEZB TFNFKTsKPiArCWlmICghbWFpbmxvb3ApIHsKPiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0 ZSBnbGliIG1haW5sb29wXG4iKTsKPiArCQlyZXQgPSAtMTsKPiArCQlnb3RvIG91dF9jbG9zZTsK PiArCX0KPiArCj4gKwlpZiAoIWludGVsX2RwX2NvbXBsaWFuY2Vfc2V0dXBfaG90cGx1ZygpKSB7 Cj4gKwkJaWd0X3dhcm4oImZhaWxlZCB0byBpbml0aWFsaXplIGhvdHBsdWcgc3VwcG9ydFxuIik7 Cj4gKwkJZ290byBvdXRfbWFpbmxvb3A7Cj4gKwl9Cj4gKwo+ICsJdGVzdGFjdGl2ZV9jaGFubmVs ID0gZ19pb19jaGFubmVsX3VuaXhfbmV3KGZpbGVubyh0ZXN0X2FjdGl2ZV9mcCkpOwo+ICsJaWYg KCF0ZXN0YWN0aXZlX2NoYW5uZWwpIHsKPiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSBU ZXN0IEFjdGl2ZSBHSU8gY2hhbm5lbFxuIik7Cj4gKwkJZ290byBvdXRfY2xvc2U7Cj4gKwl9Cj4g Kwo+ICsJcmV0ID0gZ19pb19hZGRfd2F0Y2godGVzdGFjdGl2ZV9jaGFubmVsLCBHX0lPX0lOIHwg R19JT19FUlIsIHRlc3RfaGFuZGxlciwKPiArCQkJICAgICBOVUxMKTsKPiArCWlmIChyZXQgPCAw KSB7Cj4gKwkJaWd0X3dhcm4oImZhaWxlZCB0byBhZGQgd2F0Y2ggb24gdWRldiBHSU8gY2hhbm5l bFxuIik7Cj4gKwkJZ290byBvdXRfY2xvc2U7Cj4gKwl9Cj4gKwo+ICsJc3RkaW5jaGFubmVsID0g Z19pb19jaGFubmVsX3VuaXhfbmV3KDApOwo+ICsJaWYgKCFzdGRpbmNoYW5uZWwpIHsKPiArCQlp Z3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSBzdGRpbiBHSU8gY2hhbm5lbFxuIik7Cj4gKwkJZ290 byBvdXRfaG90cGx1ZzsKPiArCX0KPiArCj4gKwlyZXQgPSBnX2lvX2FkZF93YXRjaChzdGRpbmNo YW5uZWwsIEdfSU9fSU4gfCBHX0lPX0VSUiwgaW5wdXRfZXZlbnQsCj4gKwkJCSAgICAgTlVMTCk7 Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCWlndF93YXJuKCJmYWlsZWQgdG8gYWRkIHdhdGNoIG9u IHN0ZGluIEdJTyBjaGFubmVsXG4iKTsKPiArCQlnb3RvIG91dF9zdGRpbzsKPiArCX0KPiArCj4g KwlyZXQgPSAwOwo+ICsKPiArCWdfbWFpbl9sb29wX3J1bihtYWlubG9vcCk7Cj4gKwo+ICtvdXRf c3RkaW86Cj4gKwlnX2lvX2NoYW5uZWxfc2h1dGRvd24oc3RkaW5jaGFubmVsLCBUUlVFLCBOVUxM KTsKPiArb3V0X2hvdHBsdWc6Cj4gKwlpbnRlbF9kcF9jb21wbGlhbmNlX2NsZWFudXBfaG90cGx1 ZygpOwo+ICtvdXRfbWFpbmxvb3A6Cj4gKwlnX21haW5fbG9vcF91bnJlZihtYWlubG9vcCk7Cj4g K291dF9jbG9zZToKPiArCWNsZWFudXBfZGVidWdmcygpOwo+ICsJY2xvc2UoZHJtX2ZkKTsKPiAr Cj4gKwlpZ3RfYXNzZXJ0X2VxKHJldCwgMCk7Cj4gKwo+ICsJaWd0X2luZm8oIkNvbXBsaWFuY2Ug dGVzdGluZyBhcHBsaWNhdGlvbiBleGl0aW5nLlxuIik7Cj4gKwlpZ3RfZXhpdCgpOwo+ICt9Cj4g ZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2UuaCBiL3Rvb2xzL2ludGVsX2Rw X2NvbXBsaWFuY2UuaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uYWRl MWUyZgo+IC0tLSAvZGV2L251bGwKPiArKysgYi90b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmgK PiBAQCAtMCwwICsxLDM1IEBACj4gKy8qCj4gKyAqIENvcHlyaWdodCAyMDEwIEludGVsIENvcnBv cmF0aW9uCj4gKyAqIE1hbmFzaSBOYXZhcmUgPG1hbmFzaS5kLm5hdmFyZUBpbnRlbC5jb20+Cj4g KyAqCj4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0 byBhbnkgcGVyc29uIG9idGFpbmluZyBhCj4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQg YXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCj4gKyAqIHRv IGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRo b3V0IGxpbWl0YXRpb24KPiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVy Z2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCj4gKyAqIGFuZC9vciBzZWxsIGNv cGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+ ICsgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxv d2luZyBjb25kaXRpb25zOgo+ICsgKgo+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBh bmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+ICsgKiBhbGwg Y29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiArICoKPiAr ICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0Yg QU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiArICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElN SVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gKyAqIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5U IFNIQUxMIFRIRQo+ICsgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBG T1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJ TiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCj4gKyAq IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBV U0UgT1IgT1RIRVIgREVBTElOR1MKPiArICogSU4gVEhFIFNPRlRXQVJFLgo+ICsgKi8KPiArCj4g KyNpbmNsdWRlIDxzdGRpby5oPgo+ICsjaW5jbHVkZSA8c3RyaW5nLmg+Cj4gKyNpbmNsdWRlIDxz dGRsaWIuaD4KPiArI2luY2x1ZGUgPGdsaWIuaD4KPiArCj4gK2V4dGVybiBpbnQgZHJtX2ZkOwo+ ICsKPiArZ2Jvb2xlYW4gaW50ZWxfZHBfY29tcGxpYW5jZV9zZXR1cF9ob3RwbHVnKHZvaWQpOwo+ ICt2b2lkIGludGVsX2RwX2NvbXBsaWFuY2VfY2xlYW51cF9ob3RwbHVnKHZvaWQpOwo+ICsKPiAr LyogY2FsbGVkIGJ5IHRoZSBob3RwbHVnIGNvZGUgKi8KPiAraW50IHVwZGF0ZV9kaXNwbGF5KGlu dCBtb2RlLCBib29sIGlzX2NvbXBsaWFuY2VfdGVzdCk7Cj4gZGlmZiAtLWdpdCBhL3Rvb2xzL2lu dGVsX2RwX2NvbXBsaWFuY2VfaG90cGx1Zy5jIGIvdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZV9o b3RwbHVnLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLmQ0ODkwMjYK PiAtLS0gL2Rldi9udWxsCj4gKysrIGIvdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZV9ob3RwbHVn LmMKPiBAQCAtMCwwICsxLDEyMyBAQAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgMjAxMCBJbnRlbCBD b3Jwb3JhdGlvbgo+ICsgKiAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4K PiArICoKPiArICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2Us IHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKPiArICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFu ZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKPiArICog dG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdp dGhvdXQgbGltaXRhdGlvbgo+ICsgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBt ZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKPiArICogYW5kL29yIHNlbGwg Y29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhl Cj4gKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9s bG93aW5nIGNvbmRpdGlvbnM6Cj4gKyAqCj4gKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNl IGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gKyAqIGFs bCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+ICsgKgo+ ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBP RiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBM SU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiArICogRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZF TlQgU0hBTEwgVEhFCj4gKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxF IEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiArICogTElBQklMSVRZLCBXSEVUSEVS IElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiAr ICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhF IFVTRSBPUiBPVEhFUiBERUFMSU5HUwo+ICsgKiBJTiBUSEUgU09GVFdBUkUuCj4gKyAqLwo+ICsK PiArI2luY2x1ZGUgImlndC5oIgo+ICsjaW5jbHVkZSA8c3RkaW8uaD4KPiArI2luY2x1ZGUgPHN0 cmluZy5oPgo+ICsjaW5jbHVkZSA8c3RkbGliLmg+Cj4gKwo+ICsjaW5jbHVkZSA8c3lzL3N0YXQu aD4KPiArCj4gKyNpbmNsdWRlICJpbnRlbF9kcF9jb21wbGlhbmNlLmgiCj4gKyNpbmNsdWRlIDxs aWJ1ZGV2Lmg+Cj4gK3N0YXRpYyBzdHJ1Y3QgdWRldl9tb25pdG9yICp1ZXZlbnRfbW9uaXRvcjsK PiArc3RhdGljIHN0cnVjdCB1ZGV2ICp1ZGV2Owo+ICtzdGF0aWMgR0lPQ2hhbm5lbCAqdWRldmNo YW5uZWw7Cj4gKwo+ICtzdGF0aWMgZ2Jvb2xlYW4gaG90cGx1Z19ldmVudChHSU9DaGFubmVsICpz b3VyY2UsIEdJT0NvbmRpdGlvbiBjb25kaXRpb24sCj4gKwkJCSAgICAgIGdwb2ludGVyIGRhdGEp Cj4gK3sKPiArCXN0cnVjdCB1ZGV2X2RldmljZSAqZGV2Owo+ICsJZGV2X3QgdWRldl9kZXZudW07 Cj4gKwlzdHJ1Y3Qgc3RhdCBzOwo+ICsJY29uc3QgY2hhciAqaG90cGx1ZzsKPiArCj4gKwlkZXYg PSB1ZGV2X21vbml0b3JfcmVjZWl2ZV9kZXZpY2UodWV2ZW50X21vbml0b3IpOwo+ICsJaWYgKCFk ZXYpCj4gKwkJZ290byBvdXQ7Cj4gKwo+ICsJdWRldl9kZXZudW0gPSB1ZGV2X2RldmljZV9nZXRf ZGV2bnVtKGRldik7Cj4gKwlmc3RhdChkcm1fZmQsICZzKTsKPiArCj4gKwlob3RwbHVnID0gdWRl dl9kZXZpY2VfZ2V0X3Byb3BlcnR5X3ZhbHVlKGRldiwgIkhPVFBMVUciKTsKPiArCj4gKwlpZiAo bWVtY21wKCZzLnN0X3JkZXYsICZ1ZGV2X2Rldm51bSwgc2l6ZW9mKGRldl90KSkgPT0gMCAmJgo+ ICsJICAgIGhvdHBsdWcgJiYgYXRvaShob3RwbHVnKSA9PSAxKQo+ICsJCXVwZGF0ZV9kaXNwbGF5 KDAsIGZhbHNlKTsKPiArCj4gKwl1ZGV2X2RldmljZV91bnJlZihkZXYpOwo+ICtvdXQ6Cj4gKwly ZXR1cm4gVFJVRTsKPiArfQo+ICsKPiArCj4gK2dib29sZWFuIGludGVsX2RwX2NvbXBsaWFuY2Vf c2V0dXBfaG90cGx1Zyh2b2lkKQo+ICt7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXVkZXYgPSB1ZGV2 X25ldygpOwo+ICsJaWYgKCF1ZGV2KSB7Cj4gKwkJaWd0X3dhcm4oImZhaWxlZCB0byBjcmVhdGUg dWRldiBvYmplY3RcbiIpOwo+ICsJCWdvdG8gb3V0Owo+ICsJfQo+ICsKPiArCXVldmVudF9tb25p dG9yID0gdWRldl9tb25pdG9yX25ld19mcm9tX25ldGxpbmsodWRldiwgInVkZXYiKTsKPiArCWlm ICghdWV2ZW50X21vbml0b3IpIHsKPiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSB1ZGV2 IGV2ZW50IG1vbml0b3JcbiIpOwo+ICsJCWdvdG8gb3V0Owo+ICsJfQo+ICsKPiArCXJldCA9IHVk ZXZfbW9uaXRvcl9maWx0ZXJfYWRkX21hdGNoX3N1YnN5c3RlbV9kZXZ0eXBlKHVldmVudF9tb25p dG9yLAo+ICsJCQkJCQkJICAgICAgImRybSIsCj4gKwkJCQkJCQkgICAgICAiZHJtX21pbm9yIik7 Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCWlndF93YXJuKCJmYWlsZWQgdG8gZmlsdGVyIGZvciBk cm0gZXZlbnRzXG4iKTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4gKwlyZXQgPSB1ZGV2X21v bml0b3JfZW5hYmxlX3JlY2VpdmluZyh1ZXZlbnRfbW9uaXRvcik7Cj4gKwlpZiAocmV0IDwgMCkg ewo+ICsJCWlndF93YXJuKCJmYWlsZWQgdG8gZW5hYmxlIHVkZXYgZXZlbnQgcmVjZXB0aW9uXG4i KTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4gKwl1ZGV2Y2hhbm5lbCA9Cj4gKwkJZ19pb19j aGFubmVsX3VuaXhfbmV3KHVkZXZfbW9uaXRvcl9nZXRfZmQodWV2ZW50X21vbml0b3IpKTsKPiAr CWlmICghdWRldmNoYW5uZWwpIHsKPiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSB1ZGV2 IEdJTyBjaGFubmVsXG4iKTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4gKwlyZXQgPSBnX2lv X2FkZF93YXRjaCh1ZGV2Y2hhbm5lbCwgR19JT19JTiB8IEdfSU9fRVJSLCBob3RwbHVnX2V2ZW50 LAo+ICsJCQkgICAgIHVkZXYpOwo+ICsJaWYgKHJldCA8IDApIHsKPiArCQlpZ3Rfd2FybigiZmFp bGVkIHRvIGFkZCB3YXRjaCBvbiB1ZGV2IEdJTyBjaGFubmVsXG4iKTsKPiArCQlnb3RvIG91dDsK PiArCX0KPiArCj4gKwlyZXR1cm4gVFJVRTsKPiArCj4gK291dDoKPiArCWludGVsX2RwX2NvbXBs aWFuY2VfY2xlYW51cF9ob3RwbHVnKCk7Cj4gKwlyZXR1cm4gRkFMU0U7Cj4gK30KPiArCj4gK3Zv aWQgaW50ZWxfZHBfY29tcGxpYW5jZV9jbGVhbnVwX2hvdHBsdWcodm9pZCkKPiArewo+ICsJaWYg KHVkZXZjaGFubmVsKQo+ICsJCWdfaW9fY2hhbm5lbF9zaHV0ZG93bih1ZGV2Y2hhbm5lbCwgVFJV RSwgTlVMTCk7Cj4gKwlpZiAodWV2ZW50X21vbml0b3IpCj4gKwkJdWRldl9tb25pdG9yX3VucmVm KHVldmVudF9tb25pdG9yKTsKPiArCWlmICh1ZGV2KQo+ICsJCXVkZXZfdW5yZWYodWRldik7Cj4g K30KPiAtLSAKPiAxLjkuMQo+IAo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCj4gSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdAo+IEludGVsLWdmeEBsaXN0cy5m cmVlZGVza3RvcC5vcmcKPiBodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2ludGVsLWdmeApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3Rv cC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRl bC1nZngK