From: Todd Previte Subject: [PATCH] igt/dp: Displayport Compliance Testing - Userspace Component Date: Fri, 10 Apr 2015 08:54:19 -0700 Message-ID: <1428681259-21013-2-git-send-email-tprevite@gmail.com> References: <1428681259-21013-1-git-send-email-tprevite@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-pd0-f176.google.com (mail-pd0-f176.google.com [209.85.192.176]) by gabe.freedesktop.org (Postfix) with ESMTP id F22EC6E12D for ; Fri, 10 Apr 2015 08:54:35 -0700 (PDT) Received: by pdea3 with SMTP id a3so26524475pde.3 for ; Fri, 10 Apr 2015 08:54:35 -0700 (PDT) In-Reply-To: <1428681259-21013-1-git-send-email-tprevite@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org VGhpcyBpcyB0aGUgdXNlcnNwYWNlIGNvbXBvbmVudCBvZiB0aGUgRGlzcGxheXBvcnQgY29tcGxp YW5jZSB0ZXN0aW5nCnNvZnR3YXJlIHJlcXVyaWVkIGZvciBjb21wbGlhbmNlIHRlc3Rpbmcgb2Yg dGhlIGk5MTUgZHJpdmVyLiBUaGUgUkVBRE1FCmluY2x1ZGVkIGluIHRoZSBkcF9jb21wbGlhbmNl LyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIG1vc3QgdXAgdG8gZGF0ZQppbmZvcm1hdGlvbiBvbiB0 aGUgdXNlIGFuZCBvcGVyYXRpb24gb2YgdGhlIHVzZXIgYXBwLgoKU2lnbmVkLW9mZi1ieTogVG9k ZCBQcmV2aXRlIDx0cHJldml0ZUBnbWFpbC5jb20+Ci0tLQogZHBfY29tcGxpYW5jZS9SRUFETUUg ICAgICAgICAgfCAxMDIgKysrKysrCiBkcF9jb21wbGlhbmNlL2J1aWxkLnNoICAgICAgICB8ICAg NiArCiBkcF9jb21wbGlhbmNlL2RwX2NvbXBsaWFuY2UuYyB8IDc4MiArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysKIGRwX2NvbXBsaWFuY2UvaW5wdXQuYyAgICAgICAg IHwgIDQ4ICsrKwogNCBmaWxlcyBjaGFuZ2VkLCA5MzggaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1v ZGUgMTAwNjQ0IGRwX2NvbXBsaWFuY2UvUkVBRE1FCiBjcmVhdGUgbW9kZSAxMDA3NTUgZHBfY29t cGxpYW5jZS9idWlsZC5zaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRwX2NvbXBsaWFuY2UvZHBfY29t cGxpYW5jZS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHBfY29tcGxpYW5jZS9pbnB1dC5jCgpkaWZm IC0tZ2l0IGEvZHBfY29tcGxpYW5jZS9SRUFETUUgYi9kcF9jb21wbGlhbmNlL1JFQURNRQpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWY0OTEzCi0tLSAvZGV2L251bGwKKysr IGIvZHBfY29tcGxpYW5jZS9SRUFETUUKQEAgLTAsMCArMSwxMDIgQEAKKworRGlzcGxheXBvcnQg Q29tcGxpYW5jZSBUZXN0aW5nCitVc2Vyc3BhY2UgQXBwbGljYXRpb24KKworVGhpcyBpcyB0aGUg dXNlcnNwYWNlIHBvcnRpb24gb2YgdGhlIERpc3BsYXlwb3J0IENvbXBsaWFuY2UgdGVzdGluZyBz dWl0ZSBmb3IgdGhlCitpOTE1IGRyaXZlci4gSXQgbXVzdCBiZSBydW5uaW5nIGluIG9yZGVyIHRv IHN1Y2Nlc3NmdWxseSBjb21wbGV0ZSBEaXNwbGF5cG9ydAorY29tcGxpYW5jZSB0ZXN0aW5nLiBU aGlzIGZpbGUgY29udGFpbnMgdGhlIGxhdGVzdCBhdmFpbGFibGUgaW5mb3JtYXRpb24gYWJvdXQK K3RoZSB1c2VyIGFwcCBhbmQgaXRzIG9wZXJhdGlvbi4KKworVGhpcyBhcHAgYW5kIHRoZSBrZXJu ZWwgY29kZSB0aGF0IGFjY29tcGFuaWVzIGl0IGhhcyBiZWVuIHdyaXR0ZW4gdG8gc2F0aXNmeSB0 aGUKK3JlcXVpcmVtZW50cyBvZiB0aGUgRGlzcGxheXBvcnQgTGluayBDVFMgQ29yZSAxLjIgcmV2 MS4xIHNwZWNpZmljYXRpb24gZnJvbSBWRVNBLgorCitOb3RlIHRoYXQgdGhpcyBhcHBsaWNhdGlv biBkb2VzIG5vdCBzdXBwb3J0IGVEUCBjb21wbGlhbmNlIHRlc3RpbmcuCisKK0NvbXBsaWFuY2Ug dGVzdGluZyByZXF1aXJlcyBzZXZlcmFsIGNvbXBvbmVudHM6CisJLSBBIGtlcm5lbCBidWlsZCB0 aGF0IGNvbnRhaW5zIHRoZSBwYXRjaCBzZXQgZm9yIERQIGNvbXBsaWFuY2Ugc3VwcG9ydAorCS0g QSBEaXNwbGF5cG9ydCBjb21wbGlhbmNlIHRlc3RpbmcgYXBwbGlhbmNlIHN1Y2ggYXMgdGhlIFVu aWdyYWYgRFBSLTEwMCwKKwkgIERQUi0xMjAgb3IgUXVhbnR1bSBEYXRhIDg4MkVEUAorCS0gVGhp cyB1c2VyIGFwcGxpY2F0aW9uCisJLSBBIFdpbmRvd3MgaG9zdCBtYWNoaW5lIHRvIHJ1biB0aGUg dGVzdCBzb2Z0d2FyZQorCS0gUm9vdCBhY2Nlc3Mgb24gdGhlIERVVAorCitUZXN0IHNldHVwOgor CUl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgdGhlIFdpbmRvd3MgaG9zdCwgdGVzdCBh cHBsaWFuY2UgYW5kIERVVCBiZSBmcmVzaGx5CisJcmVzdGFydGVkIGJlZm9yZSB0ZXN0aW5nIGJl Z2lucy4gVGhpcyBlbnN1cmVzIHRoYXQgYW55IHByZXZpb3VzIGNvbmZpZ3VyYXRpb25zIGFuZAor CXNldHRpbmdzIHdpbGwgbm90IGludGVyZmVyZSB3aXRoIHRoZSB0ZXN0IHByb2Nlc3MuIFJlZmVy IHRvIHRoZSB0ZXN0IGFwcGxpYW5jZQorCWRvY3VtZW50YXRpb24gZm9yIHNldHVwLCBzb2Z0d2Fy ZSBpbnN0YWxsYXRpb24gYW5kIG9wZXJhdGlvbiBzcGVjaWZpYyB0byB0aGF0CisJZGV2aWNlLgor CisJVGhlIExpbnV4IERVVCBtdXN0IGJlIGluIHRleHQgKGNvbnNvbGUpIG1vZGUgYW5kIGNhbm5v dCBoYXZlIGFueSBvdGhlciBkaXNwbGF5CisJbWFuYWdlciBydW5uaW5nLiBUaGUgZWFzaWVzdCB3 YXkgdG8gYWNjb21wbGlzaCB0aGlzIGlzIHRvIHBsYWNlIHRoZSB3b3JkIOKAnHRleHTigJ0KKwlv biB0aGUgY29tbWFuZCBsaW5lIGZvciBib290aW5nIHRoZSBrZXJuZWwuIFRoZSByZWNvbW1lbmRl ZCBib290IHBhcmFtZXRlcnMgZm9yCisJdGhlIGtlcm5lbCBhcmUgYXMgZm9sbG93czoKKwkJ4oCc dGVzdCBkZWJ1ZyBkcm0uZGVidWc9MHgwZeKAnQorCVRoaXMgZW5hYmxlcyBkZWJ1ZyBvdXRwdXQg aW4gdGhlIGxvZ3MgYW5kIHdpbGwgYm9vdCB0aGUgc3lzdGVtIHRvIGEgY29tbWFuZCBwcm9tcHQu CisKKwlZb3UgbXVzdCBiZSBsb2dnZWQgaW4gYXMgcm9vdCBpbiBvcmRlciB0byBydW4gdGhlIHVz ZXIgYXBwLgorCisJQ29ubmVjdGlvbnMgKHJlcXVpcmVkKToKKwkJLSBUZXN0IGFwcGxpYW5jZSBj b25uZWN0ZWQgdG8gdGhlIGV4dGVybmFsIERpc3BsYXlwb3J0IGNvbm5lY3RvciBvbiB0aGUgRFVU CisJCS0gVGVzdCBhcHBsaWFuY2UgY29ubmVjdGVkIHRvIHRoZSBXaW5kb3dzIGhvc3QgKHVzdWFs bHkgdmlhIFVTQikKKworCUNvbm5lY3Rpb25zIChvcHRpb25hbCk6CisJCS0gU1NIL3RlbG5ldCBj b25uZWN0aW9uIHRvIHRoZSBEVVQgZnJvbSB0aGUgV2luZG93cyBob3N0IG9yIG90aGVyIHN5c3Rl bQorCQktIEEgZGlzcGxheSBhdHRhY2hlZCB0byB0aGUgRFVUIGZvciBtb25pdG9yaW5nIHRoZSBj b25zb2xlIG9yIHJ1bm5pbmcKKwkJICB0aGUgdXNlciBhcHAuCisKKwlUaGUgdXNlciBhcHAgY2Fu IGJlIHJ1biBkaXJlY3RseSBmcm9tIHRoZSBjb25zb2xlIG9uIHRoZSBEVVQgKGlmIGEgbm9uLURp c3BsYXlwb3J0CisJZGlzcGxheSBpcyBhdHRhY2hlZCkgb3IgZnJvbSBhbiBTU0gvdGVsbmV0IHNl c3Npb24uIEdlbmVyYWxseSBzcGVha2luZywgaXTigJlzIGJlc3QKKwl0byBydW4gZnJvbSBhbiBT U0ggc2Vzc2lvbiwgYnV0IHRlc3Rpbmcgd2lsbCBvcGVyYXRlIGlkZW50aWNhbGx5IHJlZ2FyZGxl c3Mgb2YgaG93CisJdGhlIHVzZXIgYXBwIGlzIGxhdW5jaGVkLgorCisJT25jZSB0aGUgdXNlciBh cHBsaWNhdGlvbiBpcyB1cCBhbmQgcnVubmluZywgd2FpdGluZyBmb3IgYSB0ZXN0IHJlcXVlc3Qs IHRoZSBzb2Z0d2FyZQorCW9uIHRoZSBXaW5kb3dzIGhvc3QgY2FuIG5vdyBiZSB1c2VkIHRvIGV4 ZWN1dGUgdGhlIGNvbXBsaWFuY2UgdGVzdHMuCisKKwlUTDtEUiB2ZXJzaW9uOgorCQktIEluc3Rh bGwgdGVzdCBhcHBsaWFuY2Ugc29mdHdhcmUgb24gV2luZG93cyBob3N0CisJCS0gQWRqdXN0IGNv bW1hbmQgbGluZSBvbiBMaW51eCBEVVQgYXMgbmVjZXNzYXJ5IHRvIGVuYWJsZSBkZWJ1ZyBhbmQg Ym9vdAorCQkgIHRvIHRoZSBjb25zb2xlCisJCS0gQ29ubmVjdCB0aGUgdGVzdCBhcHBsaWFuY2Ug dmlhIFVTQiB0byB0aGUgV2luZG93cyBob3N0IGFuZCBhIERpc3BsYXlwb3J0CisJCSAgY2FibGUg dG8gdGhlIERVVAorCQktIFJlYm9vdCBhbGwgc3lzdGVtcywgaW5jbHVkaW5nIHRoZSB0ZXN0IGFw cGxpYW5jZQorCQktIFNTSCBpbnRvIHRoZSBEVVQgb3IgbG9naW4gYXQgdGhlIGNvbW1hbmQgcHJv bXB0CisJCS0gRW5zdXJlIHRoYXQgdGhlIGJvb3RlZCBrZXJuZWwgY29udGFpbnMgdGhlIGNvbXBs aWFuY2UgdGVzdCBwYXRjaCBzZXQKKwkJICBhbmQgdGhhdCBhIHZlcnNpb24gb2YgSUdUIHdpdGgg dGhpcyB1c2VyIGFwcCBpcyBhbHNvIHByZXNlbnQKKwkJLSBMYXVuY2ggdGhlIHVzZXIgYXBwLCBh cyByb290LiBGb2xsb3cgdGhlIG9uc2NyZWVuIGluc3RydWN0aW9ucyB1bnRpbAorCQkgIGl0IHNh eXMgaXTigJlzIHdhaXRpbmcgZm9yIGEgdGVzdCB0byBiZWdpbgorCQktIEV4ZWN1dGUgdGhlIHRl c3RzIHZpYSB0aGUgc29mdHdhcmUgb24gdGhlIFdpbmRvd3MgaG9zdCBwZXIgdGhlCisJCSAgZG9j dW1lbnRhdGlvbiBmb3IgdGhlIHRlc3QgYXBwbGlhbmNlCisKK0RlYnVnZnMgRmlsZXM6CisKK1Ro ZSBmaWxlIHJvb3QgZm9yIGFsbCB0aGUgZGVidWdmcyBmaWxlcyBpczoKKworL3N5cy9rZXJuZWwv ZGVidWcvZHJpLzAvCisKK1RoZSBzcGVjaWZpYyBmaWxlcyBhcmUgYXMgZm9sbG93czoKKworaTkx NV9kcF90ZXN0X2FjdGl2ZQorCUEgc2ltcGxlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBv ciBub3QgY29tcGxpYW5jZSB0ZXN0aW5nIGlzIGN1cnJlbnRseSBhY3RpdmUKKwlpbiB0aGUga2Vy bmVsLiBUaGlzIGZsYWcgaXMgcG9sbGVkIGJ5IHVzZXJzcGFjZSBhbmQgb25jZSBzZXQsIGludm9r ZXMgdGhlIHRlc3QKKwloYW5kbGVyIGluIHRoZSB1c2VyIGFwcC4KKworaTkxNV9kcF90ZXN0X2Rh dGEKKwlUZXN0IGRhdGEgaXMgdXNlZCBieSB0aGUga2VybmVsIHRvIHBhc3MgcGFyYW1ldGVycyB0 byB0aGUgdXNlciBhcHAuIEN1cnJlbnRseSwgdGhlCisJb25seSBwYXJhbWV0ZXIgdGhhdCBpcyBk ZWxpdmVyZWQgaXMgdGhlIHZpZGVvIG1vZGUgdG8gc2V0IGZvciB0aGUgdGVzdC4gQXMgbW9yZSB0 ZXN0cworCWFyZSBpbXBsZW1lbnRlZCwgdGhpcyB2YWx1ZSBtYXkgYmUgdXNlZCBmb3IgYWRkaXRp b25hbCB2YWx1ZXMgb3IgaW5mb3JtYXRpb24uCisKK2k5MTVfZHBfdGVzdF90eXBlCisJVGhlIHRl c3QgdHlwZSB2YXJpYWJsZSBpbnN0cnVjdHMgdGhlIHVzZXIgYXBwIGFzIHRvIHdoYXQgdGhlIHJl cXVlc3RlZCB0ZXN0IHdhcworCWZyb20gdGhlIHNpbmsgZGV2aWNlLiBUaGVzZSB2YWx1ZXMgZGVm aW5lZCBhdCB0aGUgdG9wIG9mIHRoZSBhcHBsaWNhdGlvbuKAmXMgbWFpbgorCWltcGxlbWVudGF0 aW9uIGZpbGUgYW5kIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHZhbHVlcyBkZWZpbmVk IGluCisJZHJtX2RwX2hlbHBlci5oLgorCitUZXN0IG9wZXJhdGlvbnM6CisKK05vdGVzOgorCUlm IHRoZSB0ZXN0X2FjdGl2ZSBmbGFnIGlzIHN0dWNrLCBpdCBjYW4gYmUgY2xlYXJlZCB3aXRoIHRo aXMgc2ltcGxlIGNvbW1hbmQ6CisJCWVjaG8gMCA+IC9zeXMva2VybmVsL2RlYnVnL2RyaS8wL2k5 MTVfZHBfdGVzdF9hY3RpdmUKKwlUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgdGVzdCBhcHBsaWFu Y2UgaXMgY29ubmVjdGVkIGFuZCBhIHRlc3QgaXMgcnVuLCBidXQgdGhlCisJdXNlciBhcHAgaXNu 4oCZdCBydW5uaW5nLgorCmRpZmYgLS1naXQgYS9kcF9jb21wbGlhbmNlL2J1aWxkLnNoIGIvZHBf Y29tcGxpYW5jZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4w YjMxN2E5Ci0tLSAvZGV2L251bGwKKysrIGIvZHBfY29tcGxpYW5jZS9idWlsZC5zaApAQCAtMCww ICsxLDYgQEAKKyMhL2Jpbi9zaAorIyBTaW1wbGUgYnVpbGQgc2NyaXB0IGZvciB0aGUgY29tcGxp YW5jZSBhcHAKKyMgRXZlbnR1YWxseSBzaG91bGQgYmUgYSBtYWtlZmlsZSBpbiBJR1QKKworZ2Nj IC1nMyBkcF9jb21wbGlhbmNlLmMgaW5wdXQuYyAtbyBkcF9jb21wbGlhbmNlX2FwcCAtV2FsbCBg cGtnLWNvbmZpZyAtLWxpYnMgLS1jZmxhZ3MgbGliZHJtYAorCmRpZmYgLS1naXQgYS9kcF9jb21w bGlhbmNlL2RwX2NvbXBsaWFuY2UuYyBiL2RwX2NvbXBsaWFuY2UvZHBfY29tcGxpYW5jZS5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNWZlYmIKLS0tIC9kZXYvbnVsbAor KysgYi9kcF9jb21wbGlhbmNlL2RwX2NvbXBsaWFuY2UuYwpAQCAtMCwwICsxLDc4MiBAQAorLyog CisgKiBEaXNwbGF5cG9ydCBDb21wbGlhbmNlIFRlc3RpbmcgQXBwbGljYXRpb24gCisgKiBQZXJm b3JtcyBEaXNwbGF5cG9ydCBjb21wbGlhbmNlIHRlc3RpbmcgZm9yIHRoZSBJbnRlbCBpOTE1IGRy aXZlcgorICoKKyAqIENvcHlyaWdodCA/IDIwMTQtMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbgorICoK KyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkg cGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0 ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0 aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRh dGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gs IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNv ZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlz IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6 CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBu b3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRl ZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdh cmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FS UkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQg Tk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5P IEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFC TEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVS IElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAq IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBV U0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3Jz OgorICogICAgVG9kZCBQcmV2aXRlIDx0cHJldml0ZUBnbWFpbC5jb20+CisgKiAKKyAqIEVsZW1l bnRzIG9mIHRoZSBtb2Rlc2V0IGNvZGUgYWRhcHRlZCBmcm9tIERhdmlkIEhlcnJtYW5uJ3MKKyAq IERSTSBtb2Rlc2V0IGV4YW1wbGUKKyAqCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNs dWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+ CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkcm0uaD4KKyNpbmNsdWRlIDx4Zjg2 ZHJtLmg+CisjaW5jbHVkZSA8eGY4NmRybU1vZGUuaD4KKyNpbmNsdWRlIDxpOTE1X2RybS5oPgor CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxz aWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVk ZSA8cG9sbC5oPgorCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisK KyNkZWZpbmUgSTkxNV9EUklWRVJfTk9ERQkJIi9kZXYvZHJpL2NhcmQwIgorI2RlZmluZSBJTlRF TF9EUF9ERUJVR0ZTX1JPT1QJCSIvc3lzL2tlcm5lbC9kZWJ1Zy9kcmkvMC8iCisKKyNkZWZpbmUg SU5URUxfRFBfVEVTVF9UWVBFX0ZJTEUJCSJpOTE1X2RwX3Rlc3RfdHlwZSIKKyNkZWZpbmUgSU5U RUxfRFBfVEVTVF9BQ1RJVkVfRklMRQkiaTkxNV9kcF90ZXN0X2FjdGl2ZSIKKyNkZWZpbmUgSU5U RUxfRFBfVEVTVF9EQVRBX0ZJTEUJCSJpOTE1X2RwX3Rlc3RfZGF0YSIKKworLyogRFJNIGRlZmlu aXRpb25zIC0gbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgRFJNIGhlYWRlciAqLworI2Rl ZmluZSBEUF9URVNUX0xJTktfVFJBSU5JTkcJICAgICAgIAkoMSA8PCAwKQorI2RlZmluZSBEUF9U RVNUX0xJTktfVklERU9fUEFUVEVSTiAgICAgCSgxIDw8IDEpCisjZGVmaW5lIERQX1RFU1RfTElO S19FRElEX1JFQUQJICAgICAgIAkoMSA8PCAyKQorI2RlZmluZSBEUF9URVNUX0xJTktfUEhZX1RF U1RfUEFUVEVSTiAgCSgxIDw8IDMpIC8qIERQQ0QgPj0gMS4xICovCisKKyNkZWZpbmUgRFBfQ09N UExJQU5DRV9URVNUX1RZUEVfTUFTSyAgIAkoRFBfVEVTVF9MSU5LX1RSQUlOSU5HICAgICAgfCBc CisJCQkJCSBEUF9URVNUX0xJTktfVklERU9fUEFUVEVSTiB8IFwKKwkJCQkJIERQX1RFU1RfTElO S19FRElEX1JFQUQgICAgIHwgXAorCQkJCQkgRFBfVEVTVF9MSU5LX1BIWV9URVNUX1BBVFRFUk4p CisKKy8qIE5PVEU6IFRoZXNlIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGRlZmluaXRp b25zIGluIGludGVsX2RwLmMgKi8KKyNkZWZpbmUgSU5URUxfRFBfRURJRF9TSElGVF9NQVNLCTAK KyNkZWZpbmUgSU5URUxfRFBfRURJRF9PSwkJKDAgPDwgSU5URUxfRFBfRURJRF9TSElGVF9NQVNL KQorI2RlZmluZSBJTlRFTF9EUF9FRElEX0NPUlJVUFQJCSgxIDw8IElOVEVMX0RQX0VESURfU0hJ RlRfTUFTSykKKyNkZWZpbmUgSU5URUxfRFBfUkVTT0xVVElPTl9TSElGVF9NQVNLCTQKKyNkZWZp bmUgSU5URUxfRFBfUkVTT0xVVElPTl9QUkVGRVJSRUQJKDEgPDwgSU5URUxfRFBfUkVTT0xVVElP Tl9TSElGVF9NQVNLKQorI2RlZmluZSBJTlRFTF9EUF9SRVNPTFVUSU9OX1NUQU5EQVJECSgyIDw8 IElOVEVMX0RQX1JFU09MVVRJT05fU0hJRlRfTUFTSykKKyNkZWZpbmUgSU5URUxfRFBfUkVTT0xV VElPTl9GQUlMU0FGRQkoMyA8PCBJTlRFTF9EUF9SRVNPTFVUSU9OX1NISUZUX01BU0spCisjZGVm aW5lIERQX0NPTVBMSUFOQ0VfVklERU9fTU9ERV9NQVNLICAgKElOVEVMX0RQX1JFU09MVVRJT05f UFJFRkVSUkVEIHwgXAorCQkJCQkgSU5URUxfRFBfUkVTT0xVVElPTl9TVEFOREFSRCAgfCBcCisJ CQkJCSBJTlRFTF9EUF9SRVNPTFVUSU9OX0ZBSUxTQUZFKQorCitlbnVtIAoreworCUlOVEVMX01P REVfSU5WQUxJRCA9IC0xLAorCUlOVEVMX01PREVfTk9ORSA9IDAsCisJSU5URUxfTU9ERV9QUkVG RVJSRUQsCisJSU5URUxfTU9ERV9TVEFOREFSRCwKKwlJTlRFTF9NT0RFX0ZBSUxTQUZFCit9IGlu dGVsX2Rpc3BsYXlfbW9kZTsKKworc3RydWN0IGRwX2Nvbm5lY3RvciB7CisJZHJtTW9kZU1vZGVJ bmZvIG1vZGVfc3RhbmRhcmQsIG1vZGVfcHJlZmVycmVkLCBtb2RlX2ZhaWxzYWZlOworCS8qIFN0 YW5kYXJkIGFuZCBwcmVmZXJyZWQgZnJhbWUgYnVmZmVyKi8KKwl1aW50MzJfdCBmYiwgZmJfd2lk dGgsIGZiX2hlaWdodCwgZmJfaGFuZGxlLCBmYl9zdHJpZGUsIGZiX3NpemU7CisJdWludDhfdCAq cGl4bWFwOworCS8qIEZhaWxzYWZlIGZyYW1lYnVmZmVyIC0gbm90ZSB0aGlzIGlzIGEgMTYtYml0 IGJ1ZmZlciAqLworCXVpbnQzMl90IGZhaWxzYWZlX2ZiLCBmYWlsc2FmZV93aWR0aCwgZmFpbHNh ZmVfaGVpZ2h0OworCXVpbnQzMl90IGZhaWxzYWZlX2hhbmRsZSwgZmFpbHNhZmVfc3RyaWRlLCBm YWlsc2FmZV9zaXplOworCXVpbnQ4X3QgKmZhaWxzYWZlX3BpeG1hcDsKKworCXVpbnQzMl90IGNv bm47CisJdWludDMyX3QgY3J0YzsKKworCWRybU1vZGVDcnRjICpzYXZlZF9jcnRjOworCXN0cnVj dCBkcF9jb25uZWN0b3IgKm5leHQ7Cit9OworCisvKiBJbnB1dCBoYW5kbGluZyBmcm9tIGlucHV0 LmMgKi8KK2V4dGVybiB2b2lkIHJlc2V0X3Rlcm1pbmFsX21vZGUodm9pZCk7CitleHRlcm4gdm9p ZCBzZXRfY29uaW9fdGVybWluYWxfbW9kZSh2b2lkKTsKK2V4dGVybiBpbnQga2JoaXQodm9pZCk7 CitleHRlcm4gaW50IGdldGNoKHZvaWQpOworCit2b2lkIHNldHVwX2RlYnVnZnNfZmlsZXMoaW50 ICp0ZXN0X2FjdGl2ZV9mZCwgaW50ICp0ZXN0X3R5cGVfZmQsCisJCQkgaW50ICp0ZXN0X2RhdGFf ZmQpOworIGludCBzZXR1cF9jcnRjX2Zvcl9jb25uZWN0b3IoaW50IGZkLCBkcm1Nb2RlUmVzICpt ciwgZHJtTW9kZUNvbm5lY3RvciAqYywKKwkJCSAgICAgIHN0cnVjdCBkcF9jb25uZWN0b3IgKmRw X2Nvbm4pOworIGludCBzZXR1cF9mcmFtZWJ1ZmZlcnMoaW50IGRydl9mZCwgc3RydWN0IGRwX2Nv bm5lY3RvciAqZHBfY29ubik7CisgaW50IHNldHVwX2ZhaWxzYWZlX2ZyYW1lYnVmZmVyKGludCBk cnZfZmQsIHN0cnVjdCBkcF9jb25uZWN0b3IgKmRwX2Nvbm4pOworIGludCBzZXR1cF9kcF9jb25u ZWN0b3IoaW50IGRydl9mZCwgZHJtTW9kZVJlcyAqbXIsIGRybU1vZGVDb25uZWN0b3IgKmMsCisJ CQlzdHJ1Y3QgZHBfY29ubmVjdG9yICpkcF9jb25uKTsKKyBpbnQgc2V0dXBfY29ubmVjdG9ycyhp bnQgZHJ2X2ZkLCBkcm1Nb2RlUmVzUHRyIHBtcik7CisgaW50IHNldHVwX2RybShpbnQgKmRydl9m ZCwgY29uc3QgY2hhciAqbm9kZSk7CisKK3ZvaWQgc2h1dGRvd24oaW50IGRydl9mZCk7Cit2b2lk IGNsZWFudXBfZGVidWdmcyh2b2lkKTsKKworIGludCBzZXRfdmlkZW9fbW9kZShpbnQgZHJ2X2Zk LCBpbnQgbW9kZSwgc3RydWN0IGRwX2Nvbm5lY3RvciAqdGVzdF9jb25uZWN0b3IpOworIGludCBj aGVja190ZXN0X2FjdGl2ZSh2b2lkKTsKK3ZvaWQgY2xlYXJfdGVzdF9hY3RpdmUodm9pZCk7Cisg aW50IGdldF90ZXN0X2RhdGEodm9pZCk7CisgaW50IGdldF90ZXN0X3R5cGUodm9pZCk7CisKKyBp bnQgcHJvY2Vzc190ZXN0X3JlcXVlc3QoaW50IGRydl9mZCwgaW50IHRlc3RfdHlwZSwgaW50IHRl c3RfZGF0YSwKKwkJCSAgc3RydWN0IGRwX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKKworLyogR2xv YmFsIGNvbm5lY3RvciBsaXN0ICovCitzdHJ1Y3QgZHBfY29ubmVjdG9yICpkcF9jb25uZWN0b3Jf bGlzdDsKK3Vuc2lnbmVkIHNob3J0IGRwX2Nvbm5lY3Rvcl9jb3VudDsKKworLyogR2xvYmFsIGZp bGUgZGVzY3JpcHRvcnMgKi8KK2ludCB0ZXN0X2FjdGl2ZV9mZCwgdGVzdF9kYXRhX2ZkLCB0ZXN0 X3R5cGVfZmQ7CisKK2ludCBnZXRfdGVzdF9kYXRhKHZvaWQpCit7CisJY2hhciBkYXRhX2luWzld OworCWludCBieXRlc19yZWFkOworCWludCBkYXRhOworCisJYXNzZXJ0KHRlc3RfZGF0YV9mZCA+ IDApOworCWxzZWVrKHRlc3RfZGF0YV9mZCwgMCwgU0VFS19TRVQpOworCisJYnl0ZXNfcmVhZCA9 IHJlYWQodGVzdF9kYXRhX2ZkLCBkYXRhX2luLCA4KTsKKwlpZiAoYnl0ZXNfcmVhZCA8PSAwKSB7 CisJCXByaW50ZigiVGVzdCB0eXBlIHJlYWQgZmFpbGVkIC0gJWRcclxuIiwgYnl0ZXNfcmVhZCk7 CisJCXJldHVybiAwOworCX0KKwlkYXRhX2luWzhdID0gJ1wwJzsKKwlkYXRhID0gc3RydG9sKGRh dGFfaW4sIE5VTEwsIDE2KTsKKwlwcmludGYoIlRlc3QgZGF0YSA9ICUwOHhcclxuIiwgZGF0YSk7 CisJcmV0dXJuIGRhdGE7Cit9CisKK2ludCBnZXRfdGVzdF90eXBlKHZvaWQpCit7CisJY2hhciBk YXRhX2luWzVdOworCWludCBieXRlc19yZWFkOworCWludCBkYXRhOworCisJYXNzZXJ0KHRlc3Rf dHlwZV9mZCA+IDApOworCWxzZWVrKHRlc3RfdHlwZV9mZCwgMCwgU0VFS19TRVQpOworCisJYnl0 ZXNfcmVhZCA9IHJlYWQodGVzdF90eXBlX2ZkLCBkYXRhX2luLCA0KTsKKwlpZiAoYnl0ZXNfcmVh ZCA8PSAwKSB7CisJCXByaW50ZigiVGVzdCB0eXBlIHJlYWQgZmFpbGVkIC0gJWRcclxuIiwgYnl0 ZXNfcmVhZCk7CisJCXJldHVybiAwOworCX0KKwlkYXRhX2luWzRdID0gJ1wwJzsKKwlkYXRhID0g c3RydG9sKGRhdGFfaW4sIE5VTEwsIDE2KTsKKwlwcmludGYoIlRlc3QgdHlwZSA9ICUwNHhcclxu IiwgZGF0YSk7CisJcmV0dXJuIGRhdGE7Cit9CisKK2ludCBwcm9jZXNzX3Rlc3RfcmVxdWVzdChp bnQgZHJ2X2ZkLCBpbnQgdGVzdF90eXBlLCBpbnQgdGVzdF9kYXRhLAorCQkJIHN0cnVjdCBkcF9j b25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgbW9kZTsKKwor CS8qIERpc2FibGUgdGhlIG1haW4gbGluayBiZWZvcmUgc3RhcnRpbmcgdGhlIHRlc3QKKwkgKiBO b3RlIHRoYXQgdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc2lnbmFsZWQgdGhyb3VnaCBhIGRlYnVn ZnMgZmlsZQorCSAqIGZyb20gdGhlIGtlcm5lbCBhdCB0aGUgc3RhcnQgb2YgdGVzdGluZy4KKwkg Ki8KKwlzZXRfdmlkZW9fbW9kZShkcnZfZmQsIElOVEVMX01PREVfTk9ORSwgY29ubmVjdG9yKTsK KworCXN3aXRjaCAodGVzdF90eXBlKSB7CisJY2FzZSBEUF9URVNUX0xJTktfVFJBSU5JTkc6CisJ CS8qIExpbmsgdHJhaW5pbmcgPSBmdXR1cmUgaW1wbGVtZW50YXRpb24gKi8KKwkJYnJlYWs7CisJ Y2FzZSBEUF9URVNUX0xJTktfVklERU9fUEFUVEVSTjoKKwkJLyogVmlkZW8gcGF0dGVybiA9IGZ1 dHVyZSBpbXBsZW1lbnRhdGlvbiAqLworCQlicmVhazsKKwljYXNlIERQX1RFU1RfTElOS19FRElE X1JFQUQ6CisJCW1vZGUgPSAodGVzdF9kYXRhICYgRFBfQ09NUExJQU5DRV9WSURFT19NT0RFX01B U0spID4+CisJCQlJTlRFTF9EUF9SRVNPTFVUSU9OX1NISUZUX01BU0s7CisJCXByaW50ZigiRURJ RCB0ZXN0IHJlY2VpdmVkLCBtb2RlICVkXHJcbiIsIG1vZGUpOworCQlzdGF0dXMgPSBzZXRfdmlk ZW9fbW9kZShkcnZfZmQsIG1vZGUsIGNvbm5lY3Rvcik7CisJCWNsZWFyX3Rlc3RfYWN0aXZlKCk7 CisJCWJyZWFrOworCWNhc2UgRFBfVEVTVF9MSU5LX1BIWV9URVNUX1BBVFRFUk46CisJCS8qIFBI WSBUZXN0IFBhdHRlcm4gPSBmdXR1cmUgaW1wbGVtZW50YXRpb24gKi8KKwkJYnJlYWs7CisJZGVm YXVsdDoKKwkJLyogVW5rbm93biB0ZXN0IHR5cGUgKi8KKwkJcHJpbnRmKCJJbnZhbGlkIHRlc3Qg cmVxdWVzdC4gSWdub3JlZC5cclxuIik7CisJCWNsZWFyX3Rlc3RfYWN0aXZlKCk7CisJCWJyZWFr OworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgY2xlYW51cF9kZWJ1Z2ZzKHZvaWQp Cit7CisJY2xvc2UodGVzdF9hY3RpdmVfZmQpOworCWNsb3NlKHRlc3RfZGF0YV9mZCk7CisJY2xv c2UodGVzdF90eXBlX2ZkKTsKK30KKworaW50IGNoZWNrX3Rlc3RfYWN0aXZlKHZvaWQpCit7CisJ Y2hhciBkYXRhX2luWzJdOworCWludCBieXRlc19yZWFkOworCisJYXNzZXJ0KHRlc3RfYWN0aXZl X2ZkID4gMCk7CisJbHNlZWsodGVzdF9hY3RpdmVfZmQsIDAsIFNFRUtfU0VUKTsKKworCWJ5dGVz X3JlYWQgPSByZWFkKHRlc3RfYWN0aXZlX2ZkLCBkYXRhX2luLCAyKTsKKwlpZiAoYnl0ZXNfcmVh ZCA8PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChkYXRhX2luWzBdID09ICcxJykKKwkJcmV0dXJu IDE7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGVhcl90ZXN0X2FjdGl2ZSh2b2lkKQorewor CWludCBieXRlc193cml0dGVuOworCWNoYXIgZGF0YV9vdXRbMl07CisKKwlhc3NlcnQodGVzdF9h Y3RpdmVfZmQgPiAwKTsKKwlsc2Vlayh0ZXN0X2FjdGl2ZV9mZCwgMCwgU0VFS19TRVQpOworCisJ ZGF0YV9vdXRbMF0gPSAnMCc7CisJZGF0YV9vdXRbMV0gPSAnXDAnOworCisJYnl0ZXNfd3JpdHRl biA9IHdyaXRlKHRlc3RfYWN0aXZlX2ZkLCBkYXRhX291dCwgMSk7CisJaWYgKGJ5dGVzX3dyaXR0 ZW4gPD0gMCkKKwkJcHJpbnRmKCJDb3VsZCBub3QgY2xlYXIgdGVzdCBhY3RpdmUgZmxhZy4gV3Jp dGUgZmFpbGVkIVxyXG4iKTsKK30KKwordm9pZCBzZXR1cF9kZWJ1Z2ZzX2ZpbGVzKGludCAqdGVz dF9hY3RpdmVfZmQsIGludCAqdGVzdF90eXBlX2ZkLAorCQkJIGludCAqdGVzdF9kYXRhX2ZkKQor eworCWNoYXIgZGVidWdmc19wYXRoWzI1Nl07CisJY2hhciAqaW5kZXg7CisJaW50IG9mZnNldDsK KworCW9mZnNldCA9IHN0cmxlbihJTlRFTF9EUF9ERUJVR0ZTX1JPT1QpOworCWluZGV4ID0gJmRl YnVnZnNfcGF0aFtvZmZzZXRdOworCisJbWVtc2V0KGRlYnVnZnNfcGF0aCwgMCwgMjU2KTsKKwlz dHJjcHkoZGVidWdmc19wYXRoLCBJTlRFTF9EUF9ERUJVR0ZTX1JPT1QpOworCisJc3RyY3B5KGlu ZGV4LCBJTlRFTF9EUF9URVNUX1RZUEVfRklMRSk7CisJKnRlc3RfdHlwZV9mZCA9IG9wZW4oZGVi dWdmc19wYXRoLCBPX1JET05MWSk7CisJYXNzZXJ0KCp0ZXN0X3R5cGVfZmQgPiAwKTsKKwlwcmlu dGYoIlRlc3QgdHlwZSBwYXRoICAgOiAlc1xyXG4iLCBkZWJ1Z2ZzX3BhdGgpOworCisJc3RyY3B5 KGluZGV4LCBJTlRFTF9EUF9URVNUX0RBVEFfRklMRSk7CisJKnRlc3RfZGF0YV9mZCA9IG9wZW4o ZGVidWdmc19wYXRoLCBPX1JET05MWSk7CisJYXNzZXJ0KCp0ZXN0X2RhdGFfZmQgPiAwKTsKKwlw cmludGYoIlRlc3QgZGF0YSBwYXRoICAgOiAlc1xyXG4iLCBkZWJ1Z2ZzX3BhdGgpOworCisJc3Ry Y3B5KGluZGV4LCBJTlRFTF9EUF9URVNUX0FDVElWRV9GSUxFKTsKKwkqdGVzdF9hY3RpdmVfZmQg PSBvcGVuKGRlYnVnZnNfcGF0aCwgT19SRFdSKTsKKwlhc3NlcnQoKnRlc3RfYWN0aXZlX2ZkID4g MCk7CisJcHJpbnRmKCJUZXN0IGFjdGl2ZSBwYXRoIDogJXNcclxuIiwgZGVidWdmc19wYXRoKTsK KworCS8qIFJlc2V0IHRoZSBhY3RpdmUgZmxhZyBmb3Igc2FmZXR5ICovCisJY2xlYXJfdGVzdF9h Y3RpdmUoKTsKK30KKworaW50IHNldHVwX2RybShpbnQgKmRydl9mZCwgY29uc3QgY2hhciAqbm9k ZSkKK3sKKwlpbnQgZmQsIHJldDsKKwl1aW50NjRfdCB1c2VfZHVtYl9idWZmZXJzOworCisJaWYg KCFkcm1BdmFpbGFibGUoKSkgeworCQlwcmludGYoIkVycm9yOiBEUk0gbm90IGF2YWlsYWJsZVxy XG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWZkID0gZHJtT3BlbigiaTkxNSIs IE5VTEwpOworCisJaWYgKGZkIDwgMCkgeworCQlmZCA9IG9wZW4obm9kZSwgT19SRFdSIHwgT19D TE9FWEVDKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJcmV0ID0gLWVycm5vOworCQkJcHJpbnRmKCJF cnJvcjogY291bGQgbm90IG9wZW4gJyVzJ1xyXG4iLCBub2RlKTsKKwkJCXJldHVybiByZXQ7CisJ CX0KKwl9CisKKwlkcm1HZXRDYXAoZmQsIERSTV9DQVBfRFVNQl9CVUZGRVIsICZ1c2VfZHVtYl9i dWZmZXJzKTsKKworCWlmICghdXNlX2R1bWJfYnVmZmVycykgeworCQlwcmludGYoIiclcycgZG9l cyBub3Qgc3VwcG9ydCBkdW1iIGJ1ZmZlcnNcclxuIiwgbm9kZSk7CisJCWNsb3NlKGZkKTsKKwkJ cmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwkqZHJ2X2ZkID0gZmQ7CisKKwlyZXR1cm4gMDsKK30K KworaW50IHNldHVwX2Nvbm5lY3RvcnMoaW50IGRydl9mZCwgZHJtTW9kZVJlc1B0ciBwbXIpCit7 CisJaW50IHJldCwgaTsKKwlkcm1Nb2RlQ29ubmVjdG9yICpjOworCXN0cnVjdCBkcF9jb25uZWN0 b3IgKmRwX2Nvbm47CisKKwlwbXIgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRydl9mZCk7CisJaWYg KCFwbXIpIHsKKwkJcHJpbnRmKCJFUlJPUjogRmFpbGVkIHRvIHJldHJpZXZlIERSTSByZXNvdXJj ZXNcclxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcG1yLT5jb3Vu dF9jb25uZWN0b3JzOyBpKyspIHsKKworCQljID0gZHJtTW9kZUdldENvbm5lY3RvcihkcnZfZmQs IHBtci0+Y29ubmVjdG9yc1tpXSk7CisJCWlmICghYykgeworCQkJcHJpbnRmKCJGYWlsZWQgdG8g cmV0cmlldmUgY29ubmVjdG9yICV1OiV1XHJcbiIsCisJCQkgICAgICAgaSwKKwkJCSAgICAgICBw bXItPmNvbm5lY3RvcnNbaV0pOworCQkJY29udGludWU7CisJCX0KKworCQlpZihjLT5jb25uZWN0 b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQpCisJCQljb250aW51ZTsK KworCQlkcF9jb25uID0gbWFsbG9jKHNpemVvZigqZHBfY29ubikpOworCQltZW1zZXQoZHBfY29u biwgMCwgc2l6ZW9mKCpkcF9jb25uKSk7CisJCWRwX2Nvbm4tPmNvbm4gPSBjLT5jb25uZWN0b3Jf aWQ7CisKKwkJLyogU2V0dXAgdGhlIERQIGNvbm5lY3RvciovCisJCXJldCA9IHNldHVwX2RwX2Nv bm5lY3RvcihkcnZfZmQsIHBtciwgYywgZHBfY29ubik7CisJCWlmIChyZXQpIHsKKwkJCWlmIChy ZXQgIT0gLUVOT0VOVCkgeworCQkJCWVycm5vID0gLXJldDsKKwkJCQlwcmludGYoIkZhaWxlZCB0 byBzZXR1cCBEUCBjb25uZWN0b3IgJXU6JXVcclxuIiwKKwkJCQkgICAgICAgaSwKKwkJCQkgICAg ICAgcG1yLT5jb25uZWN0b3JzW2ldKTsKKwkJCX0KKwkJCWZyZWUoZHBfY29ubik7CisJCQlkcm1N b2RlRnJlZUNvbm5lY3RvcihjKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UKKwkJCWRwX2Nv bm5lY3Rvcl9jb3VudCsrOworCQkvKiBmcmVlIGNvbm5lY3RvciBkYXRhIGFuZCBsaW5rIGRldmlj ZSBpbnRvIGdsb2JhbCBsaXN0ICovCisJCWRybU1vZGVGcmVlQ29ubmVjdG9yKGMpOworCQlkcF9j b25uLT5uZXh0ID0gZHBfY29ubmVjdG9yX2xpc3Q7CisJCWRwX2Nvbm5lY3Rvcl9saXN0ID0gZHBf Y29ubjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNldHVwX2RwX2Nvbm5lY3RvcihpbnQg ZHJ2X2ZkLCBkcm1Nb2RlUmVzICptciwgZHJtTW9kZUNvbm5lY3RvciAqYywKKwkJICAgICAgIHN0 cnVjdCBkcF9jb25uZWN0b3IgKmRwX2Nvbm4pCit7CisJaW50IHJldCwgaTsKKwlib29sIGZvdW5k X3N0ZCA9IGZhbHNlLCBmb3VuZF9mcyA9IGZhbHNlOworCisJLyogSWdub3JlIGFueSBkaXNjb25u ZWN0ZWQgZGV2aWNlcyAqLworCWlmIChjLT5jb25uZWN0aW9uICE9IERSTV9NT0RFX0NPTk5FQ1RF RCkgeworCQlwcmludGYoIkNvbm5lY3RvciAldSBkaXNjb25uZWN0ZWRcclxuIiwgYy0+Y29ubmVj dG9yX2lkKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCXByaW50ZigiQ29ubmVjdG9yIFNldHVw OlxyXG4iKTsKKwkvKiBTZXR1cCBwcmVmZXJyZWQgbW9kZSAtIHNob3VsZCBiZSBtb2RlWzBdIGlu IHRoZSBsaXN0ICovCisJZHBfY29ubi0+bW9kZV9wcmVmZXJyZWQgPSBjLT5tb2Rlc1swXTsKKwlk cF9jb25uLT5mYl93aWR0aCA9IGMtPm1vZGVzWzBdLmhkaXNwbGF5OworCWRwX2Nvbm4tPmZiX2hl aWdodCA9IGMtPm1vZGVzWzBdLnZkaXNwbGF5OworCXByaW50ZigiXHRQcmVmZXJyZWQgbW9kZSAo bW9kZSAwKSBmb3IgY29ubmVjdG9yICV1IGlzICV1eCV1XHJcbiIsCisJICAgICAgIGMtPmNvbm5l Y3Rvcl9pZCwgYy0+bW9kZXNbMF0uaGRpc3BsYXksIGMtPm1vZGVzWzBdLnZkaXNwbGF5KTsKKwor CWZvciAoaSA9IDE7IGkgPCBjLT5jb3VudF9tb2RlczsgaSsrKSB7CisJCS8qIFN0YW5kYXJkIG1v ZGUgaXMgODAweDYwMEA2MCAqLworCQlpZiAoYy0+bW9kZXNbaV0uaGRpc3BsYXkgPT0gODAwICYm CisJCSAgICBjLT5tb2Rlc1tpXS52ZGlzcGxheSA9PSA2MDAgJiYKKwkJICAgIGMtPm1vZGVzW2ld LnZyZWZyZXNoID09IDYwICYmCisJCSAgICBmb3VuZF9zdGQgPT0gZmFsc2UpIHsKKwkJCWRwX2Nv bm4tPm1vZGVfc3RhbmRhcmQgPSBjLT5tb2Rlc1tpXTsKKwkJCXByaW50ZigiXHRTdGFuZGFyZCBt b2RlICglZCkgZm9yIGNvbm5lY3RvciAldSBpcyAldXgldVxyXG4iLAorCQkJICAgICAgIGksCisJ CQkgICAgICAgYy0+Y29ubmVjdG9yX2lkLAorCQkJICAgICAgIGMtPm1vZGVzW2ldLmhkaXNwbGF5 LAorCQkJICAgICAgIGMtPm1vZGVzW2ldLnZkaXNwbGF5KTsKKwkJCWZvdW5kX3N0ZCA9IHRydWU7 CisJCX0KKwkJLyogRmFpbHNhZmUgbW9kZSBpcyA2NDB4NDgwQDYwICovCisJCWlmIChjLT5tb2Rl c1tpXS5oZGlzcGxheSA9PSA2NDAgJiYKKwkJICAgIGMtPm1vZGVzW2ldLnZkaXNwbGF5ID09IDQ4 MCAmJgorCQkgICAgYy0+bW9kZXNbaV0udnJlZnJlc2ggPT0gNjAgJiYKKwkJICAgIGZvdW5kX2Zz ID09IGZhbHNlKSB7CisJCQlkcF9jb25uLT5tb2RlX2ZhaWxzYWZlID0gYy0+bW9kZXNbaV07CisJ CQlkcF9jb25uLT5mYWlsc2FmZV93aWR0aCA9IGMtPm1vZGVzW2ldLmhkaXNwbGF5OworCQkJZHBf Y29ubi0+ZmFpbHNhZmVfaGVpZ2h0ID0gYy0+bW9kZXNbaV0udmRpc3BsYXk7CisJCQlwcmludGYo Ilx0RmFpbHNhZmUgbW9kZSAoJWQpIGZvciBjb25uZWN0b3IgJXUgaXMgJXV4JXVcclxuIiwKKwkJ CSAgICAgICBpLAorCQkJICAgICAgIGMtPmNvbm5lY3Rvcl9pZCwKKwkJCSAgICAgICBjLT5tb2Rl c1tpXS5oZGlzcGxheSwKKwkJCSAgICAgICBjLT5tb2Rlc1tpXS52ZGlzcGxheSk7CisJCX0KKwl9 CisKKwlyZXQgPSBzZXR1cF9jcnRjX2Zvcl9jb25uZWN0b3IoZHJ2X2ZkLCBtciwgYywgZHBfY29u bik7CisJaWYgKHJldCkgeworCQlwcmludGYoIlNldCBDUlRDIGZvciBjb25uZWN0b3IgJXUgZmFp bGVkICglZClcclxuIiwKKwkJICAgICAgIGMtPmNvbm5lY3Rvcl9pZCwgcmV0KTsKKwkJcmV0dXJu IHJldDsKKwl9CisKKwlyZXQgPSBzZXR1cF9mcmFtZWJ1ZmZlcnMoZHJ2X2ZkLCBkcF9jb25uKTsK KwlpZiAocmV0KSB7CisJCXByaW50ZigiQ3JlYXRlIGZyYW1lYnVmZmVyIGZvciBjb25uZWN0b3Ig JXUgZmFpbGVkICglZClcclxuIiwKKwkJICAgICAgIGMtPmNvbm5lY3Rvcl9pZCwgcmV0KTsKKwkJ cmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzZXR1cF9mYWlsc2FmZV9mcmFtZWJ1ZmZlcihkcnZf ZmQsIGRwX2Nvbm4pOworCWlmIChyZXQpIHsKKwkJcHJpbnRmKCJDcmVhdGUgZmFpbHNhZmUgZnJh bWVidWZmZXIgZm9yIGNvbm5lY3RvciAldSBmYWlsZWQgKCVkKVxyXG4iLAorCQkgICAgICAgYy0+ Y29ubmVjdG9yX2lkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9 CisKK2ludCBzZXR1cF9jcnRjX2Zvcl9jb25uZWN0b3IoaW50IGZkLCBkcm1Nb2RlUmVzICptciwg ZHJtTW9kZUNvbm5lY3RvciAqYywKKwkJCSAgICAgc3RydWN0IGRwX2Nvbm5lY3RvciAqZHBfY29u bikKK3sKKwlkcm1Nb2RlRW5jb2RlciAqZHJtX2VuY29kZXIgPSBOVUxMOworCXN0cnVjdCBkcF9j b25uZWN0b3IgKmRwYzsKKwlpbnQgaSwgajsKKwlpbnQzMl90IGNydGM7CisKKwkvKiBVc2UgYXR0 YWNoZWQgZW5jb2RlciBpZiBwb3NzaWJsZSAqLworCWlmIChjLT5lbmNvZGVyX2lkKQorCQlkcm1f ZW5jb2RlciA9IGRybU1vZGVHZXRFbmNvZGVyKGZkLCBjLT5lbmNvZGVyX2lkKTsKKworCWlmIChk cm1fZW5jb2RlcikgeworCQlpZiAoZHJtX2VuY29kZXItPmNydGNfaWQpIHsKKwkJCWNydGMgPSBk cm1fZW5jb2Rlci0+Y3J0Y19pZDsKKwkJCWZvciAoZHBjID0gZHBfY29ubmVjdG9yX2xpc3Q7IGRw YzsgZHBjID0gZHBjLT5uZXh0KSB7CisJCQkJaWYgKGRwYy0+Y3J0YyA9PSBjcnRjKSB7CisJCQkJ CWNydGMgPSAtMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGNydGMgPj0gMCkg eworCQkJCWRybU1vZGVGcmVlRW5jb2Rlcihkcm1fZW5jb2Rlcik7CisJCQkJZHBfY29ubi0+Y3J0 YyA9IGNydGM7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJZHJtTW9kZUZyZWVFbmNvZGVy KGRybV9lbmNvZGVyKTsKKwl9CisKKwkvKiBDaGVjayBhbGwgZW5jb2Rlci9jcnRjIGNvbWJpbmF0 aW9ucyAqLworCWZvciAoaSA9IDA7IGkgPCBjLT5jb3VudF9lbmNvZGVyczsgKytpKSB7CisJCWRy bV9lbmNvZGVyID0gZHJtTW9kZUdldEVuY29kZXIoZmQsIGMtPmVuY29kZXJzW2ldKTsKKwkJaWYg KCFkcm1fZW5jb2RlcikgeworCQkJY29udGludWU7CisJCX0KKwkJZm9yIChqID0gMDsgaiA8IG1y LT5jb3VudF9jcnRjczsgKytqKSB7CisJCQlpZiAoIShkcm1fZW5jb2Rlci0+cG9zc2libGVfY3J0 Y3MgJiAoMSA8PCBqKSkpCisJCQkJY29udGludWU7CisJCQljcnRjID0gbXItPmNydGNzW2pdOwor CQkJZm9yIChkcGMgPSBkcF9jb25uZWN0b3JfbGlzdDsgZHBjOyBkcGMgPSBkcGMtPm5leHQpIHsK KwkJCQlpZiAoZHBjLT5jcnRjID09IGNydGMpIHsKKwkJCQkJY3J0YyA9IC0xOworCQkJCQlicmVh azsKKwkJCQl9CisJCQl9CisJCQlpZiAoY3J0YyA+PSAwKSB7CisJCQkJZHJtTW9kZUZyZWVFbmNv ZGVyKGRybV9lbmNvZGVyKTsKKwkJCQlkcF9jb25uLT5jcnRjID0gY3J0YzsKKwkJCQlyZXR1cm4g MDsKKwkJCX0KKwkJfQorCQlkcm1Nb2RlRnJlZUVuY29kZXIoZHJtX2VuY29kZXIpOworCX0KKwlw cmludGYoIk5vIENSVEMgYXZhaWxhYmxlIGZvciBjb25uZWN0b3IgJXVcclxuIiwgYy0+Y29ubmVj dG9yX2lkKTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworaW50IHNldHVwX2ZyYW1lYnVmZmVycyhp bnQgZHJ2X2ZkLCBzdHJ1Y3QgZHBfY29ubmVjdG9yICpkcF9jb25uKQoreworCXN0cnVjdCBkcm1f bW9kZV9jcmVhdGVfZHVtYiBjcmVxOworCXN0cnVjdCBkcm1fbW9kZV9kZXN0cm95X2R1bWIgZHJl cTsKKwlzdHJ1Y3QgZHJtX21vZGVfbWFwX2R1bWIgbXJlcTsKKwlpbnQgcmV0OworCisJbWVtc2V0 KCZjcmVxLCAwLCBzaXplb2YoY3JlcSkpOworCW1lbXNldCgmbXJlcSwgMCwgc2l6ZW9mKG1yZXEp KTsKKworCWNyZXEud2lkdGggPSBkcF9jb25uLT5mYl93aWR0aDsKKwljcmVxLmhlaWdodCA9IGRw X2Nvbm4tPmZiX2hlaWdodDsKKwljcmVxLmJwcCA9IDMyOworCXJldCA9IGRybUlvY3RsKGRydl9m ZCwgRFJNX0lPQ1RMX01PREVfQ1JFQVRFX0RVTUIsICZjcmVxKTsKKwlpZiAocmV0IDwgMCkgewor CQlwcmludGYoIkNyZWF0ZSBkdW1iIGJ1ZmZlciBmYWlsZWRcclxuIik7CisJCXJldHVybiAtZXJy bm87CisJfQorCWRwX2Nvbm4tPmZiX3N0cmlkZSA9IGNyZXEucGl0Y2g7CisJZHBfY29ubi0+ZmJf c2l6ZSA9IGNyZXEuc2l6ZTsKKwlkcF9jb25uLT5mYl9oYW5kbGUgPSBjcmVxLmhhbmRsZTsKKwor CXJldCA9IGRybU1vZGVBZGRGQihkcnZfZmQsIGRwX2Nvbm4tPmZiX3dpZHRoLCBkcF9jb25uLT5m Yl9oZWlnaHQsCisJCQkgICAyNCwgMzIsIGRwX2Nvbm4tPmZiX3N0cmlkZSwgZHBfY29ubi0+ZmJf aGFuZGxlLAorCQkJICAgJmRwX2Nvbm4tPmZiKTsKKwlpZiAocmV0KSB7CisJCXByaW50ZigiQ3Jl YXRlIGZyYW1lYnVmZmVyIGZhaWxlZFxyXG4iKTsKKwkJcmV0ID0gLWVycm5vOworCQlnb3RvIGNs ZWFudXA7CisJfQorCisJbXJlcS5oYW5kbGUgPSBkcF9jb25uLT5mYl9oYW5kbGU7CisJcmV0ID0g ZHJtSW9jdGwoZHJ2X2ZkLCBEUk1fSU9DVExfTU9ERV9NQVBfRFVNQiwgJm1yZXEpOworCWlmIChy ZXQpIHsKKwkJcHJpbnRmKCJNYXAgZHVtYiBidWZmZXIgZmFpbGVkXHJcbiIpOworCQlyZXQgPSAt ZXJybm87CisJCWdvdG8gZmJfZmFpbDsKKwl9CisKKwlkcF9jb25uLT5waXhtYXAgPSBtbWFwKDAs IGRwX2Nvbm4tPmZiX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQkgICAgICAgTUFQ X1NIQVJFRCwgZHJ2X2ZkLCBtcmVxLm9mZnNldCk7CisJaWYgKGRwX2Nvbm4tPnBpeG1hcCA9PSBN QVBfRkFJTEVEKSB7CisJCXByaW50ZigiTW1hcCBmYWlsZWRcclxuIik7CisJCXJldCA9IC1lcnJu bzsKKwkJZ290byBmYl9mYWlsOworCX0KKwltZW1zZXQoZHBfY29ubi0+cGl4bWFwLCAwLCBkcF9j b25uLT5mYl9zaXplKTsKKwlyZXR1cm4gMDsKKworZmJfZmFpbDoKKwlkcm1Nb2RlUm1GQihkcnZf ZmQsIGRwX2Nvbm4tPmZiKTsKKworY2xlYW51cDoKKwltZW1zZXQoJmRyZXEsIDAsIHNpemVvZihk cmVxKSk7CisJZHJlcS5oYW5kbGUgPSBkcF9jb25uLT5mYl9oYW5kbGU7CisJZHJtSW9jdGwoZHJ2 X2ZkLCBEUk1fSU9DVExfTU9ERV9ERVNUUk9ZX0RVTUIsICZkcmVxKTsKKwlyZXR1cm4gcmV0Owor fQorCitpbnQgc2V0dXBfZmFpbHNhZmVfZnJhbWVidWZmZXIoaW50IGRydl9mZCwgc3RydWN0IGRw X2Nvbm5lY3RvciAqZHBfY29ubikKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfY3JlYXRlX2R1bWIgY3Jl cTsKKwlzdHJ1Y3QgZHJtX21vZGVfZGVzdHJveV9kdW1iIGRyZXE7CisJc3RydWN0IGRybV9tb2Rl X21hcF9kdW1iIG1yZXE7CisJaW50IHJldDsKKworCW1lbXNldCgmY3JlcSwgMCwgc2l6ZW9mKGNy ZXEpKTsKKwljcmVxLndpZHRoID0gZHBfY29ubi0+ZmFpbHNhZmVfd2lkdGg7CisJY3JlcS5oZWln aHQgPSBkcF9jb25uLT5mYWlsc2FmZV9oZWlnaHQ7CisJY3JlcS5icHAgPSAxNjsKKwlyZXQgPSBk cm1Jb2N0bChkcnZfZmQsIERSTV9JT0NUTF9NT0RFX0NSRUFURV9EVU1CLCAmY3JlcSk7CisJaWYg KHJldCA8IDApIHsKKwkJcHJpbnRmKCJDcmVhdGUgZHVtYiBidWZmZXIgZmFpbGVkXHJcbiIpOwor CQlyZXR1cm4gLWVycm5vOworCX0KKworCWRwX2Nvbm4tPmZhaWxzYWZlX3N0cmlkZSA9IGNyZXEu cGl0Y2g7CisJZHBfY29ubi0+ZmFpbHNhZmVfc2l6ZSA9IGNyZXEuc2l6ZTsKKwlkcF9jb25uLT5m YWlsc2FmZV9oYW5kbGUgPSBjcmVxLmhhbmRsZTsKKworCXJldCA9IGRybU1vZGVBZGRGQihkcnZf ZmQsIGRwX2Nvbm4tPmZhaWxzYWZlX3dpZHRoLAorCQkJICAgZHBfY29ubi0+ZmFpbHNhZmVfaGVp Z2h0LCAxNiwgMTYsCisJCQkgICBkcF9jb25uLT5mYWlsc2FmZV9zdHJpZGUsIGRwX2Nvbm4tPmZh aWxzYWZlX2hhbmRsZSwKKwkJCSAgICZkcF9jb25uLT5mYWlsc2FmZV9mYik7CisJaWYgKHJldCkg eworCQlwcmludGYoIkNyZWF0ZSBmcmFtZWJ1ZmZlciBmYWlsZWRcclxuIik7CisJCXJldCA9IC1l cnJubzsKKwkJZ290byBjbGVhbnVwOworCX0KKworCW1lbXNldCgmbXJlcSwgMCwgc2l6ZW9mKG1y ZXEpKTsKKwltcmVxLmhhbmRsZSA9IGRwX2Nvbm4tPmZhaWxzYWZlX2hhbmRsZTsKKwlyZXQgPSBk cm1Jb2N0bChkcnZfZmQsIERSTV9JT0NUTF9NT0RFX01BUF9EVU1CLCAmbXJlcSk7CisJaWYgKHJl dCkgeworCQlwcmludGYoIk1hcCBkdW1iIGJ1ZmZlciBmYWlsZWRcclxuIik7CisJCXJldCA9IC1l cnJubzsKKwkJZ290byBmYl9mYWlsOworCX0KKworCWRwX2Nvbm4tPmZhaWxzYWZlX3BpeG1hcCA9 IG1tYXAoMCwgZHBfY29ubi0+ZmFpbHNhZmVfc2l6ZSwKKwkJCQkJUFJPVF9SRUFEIHwgUFJPVF9X UklURSwgTUFQX1NIQVJFRCwKKwkJCQkJZHJ2X2ZkLCBtcmVxLm9mZnNldCk7CisJaWYgKGRwX2Nv bm4tPmZhaWxzYWZlX3BpeG1hcCA9PSBNQVBfRkFJTEVEKSB7CisJCXByaW50ZigiY2Fubm90IG1t YXAgZHVtYiBidWZmZXIgKCVkKTogJW1cclxuIiwgZXJybm8pOworCQlyZXQgPSAtZXJybm87CisJ CWdvdG8gZmJfZmFpbDsKKwl9CisKKwltZW1zZXQoZHBfY29ubi0+ZmFpbHNhZmVfcGl4bWFwLCAw LCBkcF9jb25uLT5mYWlsc2FmZV9zaXplKTsKKwlyZXR1cm4gMDsKKworZmJfZmFpbDoKKwlkcm1N b2RlUm1GQihkcnZfZmQsIGRwX2Nvbm4tPmZhaWxzYWZlX2ZiKTsKKworY2xlYW51cDoKKwltZW1z ZXQoJmRyZXEsIDAsIHNpemVvZihkcmVxKSk7CisJZHJlcS5oYW5kbGUgPSBkcF9jb25uLT5mYWls c2FmZV9oYW5kbGU7CisJZHJtSW9jdGwoZHJ2X2ZkLCBEUk1fSU9DVExfTU9ERV9ERVNUUk9ZX0RV TUIsICZkcmVxKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc2V0X3ZpZGVvX21vZGUoaW50IGRy dl9mZCwgaW50IG1vZGUsIHN0cnVjdCBkcF9jb25uZWN0b3IgKnRlc3RfY29ubmVjdG9yKQorewor CWRybU1vZGVNb2RlSW5mbyAqcmVxdWVzdGVkX21vZGU7CisJdWludDMyX3QgcmVxdWlyZWRfZmI7 CisJaW50IHJldCA9IDA7CisKKwlwcmludGYoIk1vZGUgcmVxdWVzdGVkOiAiKTsKKwlzd2l0Y2gg KG1vZGUpIHsKKwljYXNlIElOVEVMX01PREVfTk9ORToKKwkJcHJpbnRmKCJOT05FXHJcbiIpOwor CQlyZXQgPSBkcm1Nb2RlU2V0Q3J0YyhkcnZfZmQsIHRlc3RfY29ubmVjdG9yLT5jcnRjLAorCQkJ CSAgICAgLTEsIDAsIDAsIE5VTEwsIDAsIE5VTEwpOworCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJ Y2FzZSBJTlRFTF9NT0RFX1BSRUZFUlJFRDoKKwkJIHByaW50ZigiUFJFRkVSUkVEXHJcbiIpOwor CQkgcmVxdWVzdGVkX21vZGUgPSAgJnRlc3RfY29ubmVjdG9yLT5tb2RlX3ByZWZlcnJlZDsKKwkJ IHJlcXVpcmVkX2ZiID0gdGVzdF9jb25uZWN0b3ItPmZiOworCQkgYnJlYWs7CisJIGNhc2UgSU5U RUxfTU9ERV9TVEFOREFSRDoKKwkJIHByaW50ZigiU1RBTkRBUkRcclxuIik7CisJCSByZXF1ZXN0 ZWRfbW9kZSA9ICAmdGVzdF9jb25uZWN0b3ItPm1vZGVfc3RhbmRhcmQ7CisJCSByZXF1aXJlZF9m YiA9IHRlc3RfY29ubmVjdG9yLT5mYjsKKwkJIGJyZWFrOworCSBjYXNlIElOVEVMX01PREVfRkFJ TFNBRkU6CisJCSBwcmludGYoIkZBSUxTQUZFXHJcbiIpOworCQkgcmVxdWVzdGVkX21vZGUgPSAg JnRlc3RfY29ubmVjdG9yLT5tb2RlX2ZhaWxzYWZlOworCQkgcmVxdWlyZWRfZmIgPSB0ZXN0X2Nv bm5lY3Rvci0+ZmFpbHNhZmVfZmI7CisJCSBicmVhazsKKwkgY2FzZSBJTlRFTF9NT0RFX0lOVkFM SUQ6CisJIGRlZmF1bHQ6CisJCSBwcmludGYoIklOVkFMSUQhICglMDh4KSBNb2RlIHNldCBhYm9y dGVkIVxyXG4iLCBtb2RlKTsKKwkJIHJldHVybiAtMTsKKwkgYnJlYWs7CisJfQorCXRlc3RfY29u bmVjdG9yLT5zYXZlZF9jcnRjID0gZHJtTW9kZUdldENydGMoZHJ2X2ZkLCB0ZXN0X2Nvbm5lY3Rv ci0+Y3J0Yyk7CisJcmV0ID0gZHJtTW9kZVNldENydGMoZHJ2X2ZkLCB0ZXN0X2Nvbm5lY3Rvci0+ Y3J0YywgcmVxdWlyZWRfZmIsIDAsIDAsCisJCQkgICAgICZ0ZXN0X2Nvbm5lY3Rvci0+Y29ubiwg MSwgcmVxdWVzdGVkX21vZGUpOworb3V0OgorCWlmIChyZXQpIHsKKwkJcHJpbnRmKCJGYWlsZWQg dG8gc2V0IENSVEMgZm9yIGNvbm5lY3RvciAldVxyXG4iLAorCQkgICAgICAgdGVzdF9jb25uZWN0 b3ItPmNvbm4pOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHNodXRkb3duKGludCBkcnZf ZmQpCit7CisJaW50IGk7CisJc3RydWN0IGRwX2Nvbm5lY3RvciAqaW5kZXggPSBkcF9jb25uZWN0 b3JfbGlzdCwgKnByZXY7CisJc3RydWN0IGRybV9tb2RlX2Rlc3Ryb3lfZHVtYiBkcmVxOworCisJ Zm9yIChpID0gMDsgaSA8IGRwX2Nvbm5lY3Rvcl9jb3VudDsgaSsrKSB7CisJCWlmIChpbmRleC0+ c2F2ZWRfY3J0YykgeworCQkJZHJtTW9kZVNldENydGMoZHJ2X2ZkLCBpbmRleC0+c2F2ZWRfY3J0 Yy0+Y3J0Y19pZCwKKwkJCQkgICAgICAgaW5kZXgtPnNhdmVkX2NydGMtPmJ1ZmZlcl9pZCwKKwkJ CQkgICAgICAgaW5kZXgtPnNhdmVkX2NydGMtPngsCisJCQkJICAgICAgIGluZGV4LT5zYXZlZF9j cnRjLT55LCAmaW5kZXgtPmNvbm4sIDEsCisJCQkJICAgICAgICZpbmRleC0+c2F2ZWRfY3J0Yy0+ bW9kZSk7CisJCQlkcm1Nb2RlRnJlZUNydGMoaW5kZXgtPnNhdmVkX2NydGMpOworCQl9CisJCWRy bU1vZGVSbUZCKGRydl9mZCwgaW5kZXgtPmZiKTsKKwkJLyogQ2xlYW4gdXAgZHVtYiBidWZmZXIg Ki8KKwkJbWVtc2V0KCZkcmVxLCAwLCBzaXplb2YoZHJlcSkpOworCQlkcmVxLmhhbmRsZSA9IGlu ZGV4LT5mYl9oYW5kbGU7CisJCWRybUlvY3RsKGRydl9mZCwgRFJNX0lPQ1RMX01PREVfREVTVFJP WV9EVU1CLCAmZHJlcSk7CisJCXByZXYgPSBpbmRleDsKKwkJaW5kZXggPSBpbmRleC0+bmV4dDsK KwkJZnJlZShwcmV2KTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10p Cit7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGRydl9mZCA9IDA7CisJZHJtTW9kZVJlc1B0ciBt b2RlX3Jlc291cmNlcyA9IE5VTEw7CisJaW50IGRvbmUgPSAwOworCWNoYXIgaW5wdXQ7CisJc3Ry dWN0IGRwX2Nvbm5lY3RvciAqYWN0aXZlX2Nvbm5lY3RvcjsKKwlpbnQgdGVzdF9kYXRhLCB0ZXN0 X3R5cGU7CisKKwkvKiBTZXR1cCBpbnB1dCBmb3Iga2V5Ym9hcmQgaGFuZGxpbmcgLSBmcm9tIGlu cHV0LmMgKi8KKwlzZXRfY29uaW9fdGVybWluYWxfbW9kZSgpOworCisJcHJpbnRmKCJBVFRFTlRJ T046XHJcbiIKKwkgICAgICAgIiAgIEVuc3VyZSB0aGF0IG5vIGRpc3BsYXkgbWFuYWdlciBpcyBy dW5uaW5nXHJcbiIKKwkgICAgICAgIiAgIEFwcCBtdXN0IGJlIHJ1biBhcyByb290IGluIGNvbnNv bGUvdGV4dCBtb2RlXHJcbiIKKwkgICAgICAgIiAgIENvbnRpbnVlPyAoWS9OKSIKKwkgICAgICAg KTsKKwlpbnB1dCA9IGdldGNoYXIoKTsKKworCWlmIChpbnB1dCAhPSAnWScgJiYgaW5wdXQgIT0g J3knKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBBbGwtaW4tb25lIHNldHVwIGZ1bmN0aW9uIHRvIGdl dCBEUk0gb2ZmIHRoZSBncm91bmQgKi8KKwlzZXR1cF9kcm0oJmRydl9mZCwgSTkxNV9EUklWRVJf Tk9ERSk7CisKKwkvKiBGcm9tIG1vZGVyZXMsIGdldCB0aGUgY29ubmVjdG9ycywgZW5jb2RlcnMs IENSVENzLCBldGMgKi8KKwlzZXR1cF9jb25uZWN0b3JzKGRydl9mZCwgbW9kZV9yZXNvdXJjZXMp OworCisJYWN0aXZlX2Nvbm5lY3RvciA9ICZkcF9jb25uZWN0b3JfbGlzdFswXTsKKworCXNldHVw X2RlYnVnZnNfZmlsZXMoJnRlc3RfYWN0aXZlX2ZkLCAmdGVzdF90eXBlX2ZkLCAmdGVzdF9kYXRh X2ZkKTsKKworCXByaW50ZigiXHJcblxyXG5XYWl0aW5nIGZvciB0ZXN0IHJlcXVlc3RzLiAnWCcg b3IgJ1EnIGV4aXRzXHJcbiIpOyAKKworCXdoaWxlICghZG9uZSkgeworCQlpZiAoa2JoaXQoKSkg eworCQkJaW5wdXQgPSBnZXRjaCgpOworCQkJc3dpdGNoIChpbnB1dCkgeworCQkJY2FzZSAncSc6 CisJCQljYXNlICdRJzoKKwkJCWNhc2UgJ3gnOgorCQkJY2FzZSAnWCc6CisJCQkJZG9uZSA9IDE7 CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJdXNsZWVwKDEwMDApOworCQlpZiAoY2hlY2tfdGVz dF9hY3RpdmUoKSkgeworCQkJdGVzdF9kYXRhID0gZ2V0X3Rlc3RfZGF0YSgpOworCQkJdGVzdF90 eXBlID0gZ2V0X3Rlc3RfdHlwZSgpOworCQkJcHJvY2Vzc190ZXN0X3JlcXVlc3QoZHJ2X2ZkLCB0 ZXN0X3R5cGUsIHRlc3RfZGF0YSwgYWN0aXZlX2Nvbm5lY3Rvcik7CisJCQl1c2xlZXAoMTAwMDAp OworCQl9CisJfQorCitleGl0OgorCWNsZWFudXBfZGVidWdmcygpOworCisJc2h1dGRvd24oZHJ2 X2ZkKTsKKworCWlmIChkcnZfZmQgPiAwKSB7CisJCXN0YXR1cyA9IGRybUNsb3NlKGRydl9mZCk7 IAorCQlpZiAoc3RhdHVzKQorCQkJcHJpbnRmKCJFcnJvcjogRmFpbGVkIHRvIGNsb3NlIGk5MTUg ZHJpdmVyXHJcbiIpOworCX0KKworCXByaW50ZigiQ29tcGxpYW5jZSB0ZXN0aW5nIGFwcGxpY2F0 aW9uIGV4aXRpbmcuXHJcbiIKKwkgICAgICAgIklmIHRlc3RpbmcgaGFzIGJlZW4gcGVyZm9ybWVk LCB5b3UgbWF5IHdhbnQgdG8gcmVzdGFydFxyXG4iCisJICAgICAgICJ0aGUgc3lzdGVtIHRvIGVu c3VyZSBpdCByZXR1cm5zIHRvIG5vcm1hbCBvcGVyYXRpb24uXHJcbiIpOworCisJcmV0dXJuIHN0 YXR1czsKK30KKwpkaWZmIC0tZ2l0IGEvZHBfY29tcGxpYW5jZS9pbnB1dC5jIGIvZHBfY29tcGxp YW5jZS9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODFjZTYK LS0tIC9kZXYvbnVsbAorKysgYi9kcF9jb21wbGlhbmNlL2lucHV0LmMKQEAgLTAsMCArMSw0OCBA QAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVu aXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisK Ky8qIENvZGUgc291cmNlZCBmcm9tIHN0YWNrb3ZlcmZsb3cuY29tIC0KKwlodHRwOi8vc3RhY2tv dmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ0ODk0NC9jLW5vbi1ibG9ja2luZy1rZXlib2FyZC1pbnB1 dCAKKyovCisKK3N0cnVjdCB0ZXJtaW9zIG9yaWdfdGVybWlvczsKKwordm9pZCByZXNldF90ZXJt aW5hbF9tb2RlKCkKK3sKKyAgICB0Y3NldGF0dHIoMCwgVENTQU5PVywgJm9yaWdfdGVybWlvcyk7 Cit9CisKK3ZvaWQgc2V0X2NvbmlvX3Rlcm1pbmFsX21vZGUoKQoreworICAgIHN0cnVjdCB0ZXJt aW9zIG5ld190ZXJtaW9zOworCisgICAgLyogdGFrZSB0d28gY29waWVzIC0gb25lIGZvciBub3cs IG9uZSBmb3IgbGF0ZXIgKi8KKyAgICB0Y2dldGF0dHIoMCwgJm9yaWdfdGVybWlvcyk7CisgICAg bWVtY3B5KCZuZXdfdGVybWlvcywgJm9yaWdfdGVybWlvcywgc2l6ZW9mKG5ld190ZXJtaW9zKSk7 CisKKyAgICAvKiByZWdpc3RlciBjbGVhbnVwIGhhbmRsZXIsIGFuZCBzZXQgdGhlIG5ldyB0ZXJt aW5hbCBtb2RlICovCisgICAgYXRleGl0KHJlc2V0X3Rlcm1pbmFsX21vZGUpOworICAgIGNmbWFr ZXJhdygmbmV3X3Rlcm1pb3MpOworICAgIHRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmbmV3X3Rlcm1p b3MpOworfQorCitpbnQga2JoaXQoKQoreworICAgIHN0cnVjdCB0aW1ldmFsIHR2ID0geyAwTCwg MEwgfTsKKyAgICBmZF9zZXQgZmRzOworICAgIEZEX1pFUk8oJmZkcyk7CisgICAgRkRfU0VUKDAs ICZmZHMpOworICAgIHJldHVybiBzZWxlY3QoMSwgJmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKK30K KworaW50IGdldGNoKCkKK3sKKyAgICBpbnQgcjsKKyAgICB1bnNpZ25lZCBjaGFyIGMgPSAwOwor ICAgIGlmICgociA9IHJlYWQoMCwgJmMsIHNpemVvZihjKSkpIDwgMCkgeworICAgICAgICByZXR1 cm4gcjsKKyAgICB9IGVsc2UgcmV0dXJuIGM7Cit9Ci0tIAoxLjkuMQoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJ bnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK