From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paulo Zanoni Subject: [PATCH igt] tests: add kms_frontbuffer_tracking Date: Mon, 8 Jun 2015 18:43:02 -0300 Message-ID: <1433799782-1773-1-git-send-email-przanoni@gmail.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-qk0-f171.google.com (mail-qk0-f171.google.com [209.85.220.171]) by gabe.freedesktop.org (Postfix) with ESMTP id 716026E2BD for ; Mon, 8 Jun 2015 14:44:10 -0700 (PDT) Received: by qkx62 with SMTP id 62so70885qkx.3 for ; Mon, 08 Jun 2015 14:44:10 -0700 (PDT) In-Reply-To: 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 Cc: Paulo Zanoni List-Id: intel-gfx@lists.freedesktop.org RnJvbTogUGF1bG8gWmFub25pIDxwYXVsby5yLnphbm9uaUBpbnRlbC5jb20+CgpUaGlzIGlzIGEg bmV3IHRlc3QgdGhhdCBzaG91bGQgZXhlcmNpc2UgdGhlIGZyb250YnVmZmVyIHRyYWNraW5nCmZl YXR1cmUgb2YgdGhlIEtlcm5lbCBpbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cy4gV2UgdXNl IGRpZmZlcmVudApkcmF3aW5nIG1ldGhvZHMsIHdlIHVzZSB0aGUgcHJpbWFyeSwgY3Vyc29yIGFu ZCBzcHJpdGUgcGxhbmVzLCB3ZSBjYW4KdGVzdCBib3RoIG9uIHNpbmdsZSBhbmQgZHVhbCBwaXBl cywgYWxzbyBvbiBidWZmZXJzIG5vdCBhc3NvY2lhdGVkCndpdGggYW55IENSVENzLCBldGMuCgpX ZSBjdXJyZW50bHkgaGF2ZSBhc3NlcnRpb25zIGZvciBib3RoIEZCQyBhbmQgUFNSLCBhbmQgd2Ug YWxzbyBoYXZlIGEKIm5vcCIgdGVzdCBtb2RlIHRoYXQgc2hvdWxkIGRpc2FibGUgYm90aCBGQkMg YW5kIFBTUiwgYW5kIGNhbiBiZQp1c2VkIGZvciBkZWJ1Z2dpbmcuCgpUaGlzIHRlc3QgaXMgYWxz byBjYXBhYmxlIG9mIHRlc3RpbmcgYm90aCBGQkMgYW5kIFBTUiBldmVuIGlmIHRoZXkgYXJlCmRp c2FibGVkIGJ5IGRlZmF1bHQgb24gdGhlIEtlcm5lbDogdGhlIHRlc3Qga25vd3MgaG93IHRvIGNo YW5nZSB0aGUKaTkxNS5rbyBwYXJhbWV0ZXJzIGFuZCB0aGVuIHNldCB0aGVtIGJhY2sgYWZ0ZXIg dGVzdGluZy4KCkkgYW0gZ2V0dGluZyBhIHNpZ25pZmljYW50IG51bWJlciBvZiBmYWlsdXJlcyB3 aGVuIEkgcnVuIHRoaXMgdGVzdCwKd2hpY2ggbWVhbnMgd2UgaGF2ZSBzb21lIHdvcmsgdG8gZG8g b24gdGhlIEtlcm5lbC4KCkkgYWxzbyBzdGlsbCBoYXZlIGEgc21hbGwgbGlzdCBvZiBhZGRpdGlv bmFsIHN1YnRlc3RzIHRoYXQgSSBwbGFuIHRvCmFkZCB0byB0aGlzIHRlc3QsIGFuZCB0aG9zZSB0 ZXN0cyBhcmUgZG9jdW1lbnRlZCBvbiB0aGUgbWFpbiBmdW5jdGlvbi4KCnYyOgogLSBVc2UgaWd0 X2RlYnVnZnNfb3BlbigpIChUaG9tYXMpLgogLSBVc2UgaWd0X3Rlc3RfZGVzY3JpcHRpb24oKSAo VGhvbWFzKS4KIC0gRG9uJ3QgY2hlY2sgZHJtX29wZW5fYW55X21hc3RlcigpJ3MgcmVzdWx0IChU aG9tYXMpLgogLSBVc2UgaWd0X3JlcXVpcmVfZigpIGluIHNvbWUgY2FzZXMgKFRob21hcykuCiAt IFN0YW5kYXJkaXplIHNvbWUgYXNzZXJ0aW9ucy4KIC0gVXNlIHRoZSBuZXcgbW9kdWxlIHBhcmFt IGZ1bmN0aW9ucy4KIC0gQ2hlY2sgaWYgRkJDIGlzIHN1cHBvcnRlZCBieSB0aGUgY2hpcHNldC4K IC0gQWRkIG5ldyBzdWJ0ZXN0cyAobXVsdGlkcmF3LCBlbnVtIGZicywgZmJjK3BzcikuCiAtIE1h a2UgdGVzdHMgYSBsaXR0bGUgc2hvcnRlci4KIC0gUmVvcmdhbml6ZSB3aGljaCB0ZXN0cyBhcmEg cmFuIGJ5IGRlZmF1bHQuCiAtIEJldHRlciBjb21tZW50cyBldmVyeXdoZXJlLgogLSBSZWJhc2Uu CgpTaWduZWQtb2ZmLWJ5OiBQYXVsbyBaYW5vbmkgPHBhdWxvLnIuemFub25pQGludGVsLmNvbT4K LS0tCiB0ZXN0cy8uZ2l0aWdub3JlICAgICAgICAgICAgICAgICB8ICAgIDEgKwogdGVzdHMvTWFr ZWZpbGUuc291cmNlcyAgICAgICAgICAgfCAgICAxICsKIHRlc3RzL2ttc19mcm9udGJ1ZmZlcl90 cmFja2luZy5jIHwgMjIyNCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwog MyBmaWxlcyBjaGFuZ2VkLCAyMjI2IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0 ZXN0cy9rbXNfZnJvbnRidWZmZXJfdHJhY2tpbmcuYwoKZGlmZiAtLWdpdCBhL3Rlc3RzLy5naXRp Z25vcmUgYi90ZXN0cy8uZ2l0aWdub3JlCmluZGV4IGY4MTZkZWQuLmMxNzI2NGMgMTAwNjQ0Ci0t LSBhL3Rlc3RzLy5naXRpZ25vcmUKKysrIGIvdGVzdHMvLmdpdGlnbm9yZQpAQCAtMTM0LDYgKzEz NCw3IEBAIGttc19mbGlwCiBrbXNfZmxpcF9ldmVudF9sZWFrCiBrbXNfZmxpcF90aWxpbmcKIGtt c19mb3JjZV9jb25uZWN0b3IKK2ttc19mcm9udGJ1ZmZlcl90cmFja2luZwoga21zX2xlZ2FjeV9j b2xvcmtleQoga21zX21taW9fdnNfY3NfZmxpcAoga21zX3BpcGVfYl9jX2l2YgpkaWZmIC0tZ2l0 IGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcyBiL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKaW5kZXgg ZDJhNDRlOC4uNTUxYzYwMCAxMDA2NDQKLS0tIGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcworKysg Yi90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCkBAIC02Niw2ICs2Niw3IEBAIFRFU1RTX3Byb2dzX00g PSBcCiAJa21zX2ZsaXAgXAogCWttc19mbGlwX2V2ZW50X2xlYWsgXAogCWttc19mbGlwX3RpbGlu ZyBcCisJa21zX2Zyb250YnVmZmVyX3RyYWNraW5nIFwKIAlrbXNfbGVnYWN5X2NvbG9ya2V5IFwK IAlrbXNfbW1pb192c19jc19mbGlwIFwKIAlrbXNfcGlwZV9iX2NfaXZiIFwKZGlmZiAtLWdpdCBh L3Rlc3RzL2ttc19mcm9udGJ1ZmZlcl90cmFja2luZy5jIGIvdGVzdHMva21zX2Zyb250YnVmZmVy X3RyYWNraW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5MjEzMwot LS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ttc19mcm9udGJ1ZmZlcl90cmFja2luZy5jCkBAIC0w LDAgKzEsMjIyNCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE1IEludGVsIENvcnBvcmF0aW9u CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRv IGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNz b2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFs IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBs aW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVi bGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0 aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdh cmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0 aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNz aW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGlu Y2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBT b2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9V VCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5H IEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisg KiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAg SU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJF IExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdI RVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lO RworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1Ig VEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1 dGhvcnM6IFBhdWxvIFphbm9uaSA8cGF1bG8uci56YW5vbmlAaW50ZWwuY29tPgorICoKKyAqLwor CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRl IDxmY250bC5oPgorCisjaW5jbHVkZSAiZHJtdGVzdC5oIgorI2luY2x1ZGUgImlndF9hdXguaCIK KyNpbmNsdWRlICJpZ3RfZHJhdy5oIgorI2luY2x1ZGUgImlndF9rbXMuaCIKKyNpbmNsdWRlICJp Z3RfZGVidWdmcy5oIgorI2luY2x1ZGUgImludGVsX2NoaXBzZXQuaCIKKyNpbmNsdWRlICJpb2N0 bF93cmFwcGVycy5oIgorCitJR1RfVEVTVF9ERVNDUklQVElPTigiVGVzdCB0aGUgS2VybmVsJ3Mg ZnJvbnRidWZmZXIgdHJhY2tpbmcgbWVjaGFuaXNtIGFuZCAiCisJCSAgICAgIml0cyByZWxhdGVk IGZlYXR1cmVzOiBGQkMgYW5kIFBTUiIpOworCisvKgorICogT25lIG9mIHRoZSBhc3BlY3RzIG9m IHRoaXMgdGVzdCBpcyB0aGF0LCBmb3IgZXZlcnkgc3VidGVzdCwgd2UgdHJ5IGRpZmZlcmVudAor ICogY29tYmluYXRpb25zIG9mIHRoZSBwYXJhbWV0ZXJzIGRlZmluZWQgYnkgdGhlIHN0cnVjdCBi ZWxvdy4gQmVjYXVzZSBvZiB0aGlzLAorICogYSBzaW5nbGUgYWRkaXRpb24gb2YgYSBuZXcgcGFy YW1ldGVyIG9yIHN1YnRlc3QgZnVuY3Rpb24gY2FuIGxlYWQgdG8gaHVuZHJlZHMKKyAqIG9mIG5l dyBzdWJ0ZXN0cy4KKyAqCisgKiBJbiBvcmRlciB0byByZWR1Y2UgdGhlIG51bWJlciBjb21iaW5h dGlvbnMgd2UgY3V0IHRoZSBjYXNlcyB0aGF0IGRvbid0IG1ha2UKKyAqIHNlbnNlLCBzdWNoIGFz IHdyaXRpbmcgb24gdGhlIHNlY29uZGFyeSBzY3JlZW4gd2hlbiB0aGVyZSBpcyBvbmx5IGEgc2lu Z2xlCisgKiBwaXBlLCBvciBmbGlwcGluZyB3aGVuIHRoZSB0YXJnZXQgaXMgdGhlIG9mZnNjcmVl biBidWZmZXIuIFdlIGFsc28gaGlkZSBzb21lCisgKiBjb21iaW5hdGlvbnMgdGhhdCBhcmUgc29t ZXdoYXQgcmVkdW5kYW50IGFuZCBkb24ndCBhZGQgbXVjaCB2YWx1ZSB0byB0aGUKKyAqIHRlc3Qu IEZvciBleGFtcGxlLCBzaW5jZSB3ZSBhbHJlYWR5IGRvIHRoZSBvZmZzY3JlZW4gdGVzdGluZyB3 aXRoIGEgc2luZ2xlCisgKiBwaXBlIGVuYWJsZWQsIHRoZXJlJ3Mgbm8gbXVjaCB2YWx1ZSBpbiBk b2luZyBpdCBhZ2FpbiB3aXRoIGR1YWwgcGlwZXMuIElmIHlvdQorICogc3RpbGwgd2FudCB0byB0 cnkgdGhlc2UgcmVkdW5kYW50IHRlc3RzLCB5b3UgbmVlZCB0byB1c2UgdGhlIC0tc2hvdy1oaWRk ZW4KKyAqIG9wdGlvbi4KKyAqCisgKiBUaGUgbW9zdCBpbXBvcnRhbnQgaGlkZGVuIHRoaW5nIGlz IHRoZSBGRUFUVVJFX05PTkUgc2V0IG9mIHRlc3RzLiBXaGVuZXZlcgorICogeW91IGdldCBhIGZh aWx1cmUgb24gYW55IHRlc3QsIGl0IGlzIGltcG9ydGFudCB0byBjaGVjayB3aGV0aGVyIHRoZSBz YW1lIHRlc3QKKyAqIGZhaWxzIHdpdGggRkVBVFVSRV9OT05FIC0gcmVwbGFjZSB0aGUgZmVhdHVy ZSBuYW1lIGZvciAibm9wIi4gSWYgdGhlIG5vcCB0ZXN0CisgKiBhbHNvIGZhaWxzLCB0aGVuIGl0 J3MgbGlrZWx5IHRoZSBwcm9ibGVtIHdpbGwgYmUgb24gdGhlIElHVCBzaWRlIGluc3RlYWQgb2YK KyAqIHRoZSBLZXJuZWwgc2lkZS4gV2UgZG9uJ3QgZXhwb3NlIHRoaXMgc2V0IG9mIHRlc3RzIGJ5 IGRlZmF1bHQgYmVjYXVzZSAoaSkKKyAqIHRoZXkgdGFrZSBhIGxvbmcgdGltZSB0byB0ZXN0OyBh bmQgKGlpKSBpZiB0aGUgZmVhdHVyZSB0ZXN0cyB3b3JrLCB0aGVuIGl0J3MKKyAqIHZlcnkgbGlr ZWx5IHRoYXQgdGhlIG5vcCB0ZXN0cyB3aWxsIGFsc28gd29yay4KKyAqLworc3RydWN0IHRlc3Rf bW9kZSB7CisJLyogQXJlIHdlIGdvaW5nIHRvIGVuYWJsZSBqdXN0IG9uZSBtb25pdG9yLCBvciBh cmUgd2UgZ29pbmcgdG8gc2V0dXAgYQorCSAqIGR1YWwgc2NyZWVuIGVudmlyb25tZW50IGZvciB0 aGUgdGVzdD8gKi8KKwllbnVtIHsKKwkJUElQRV9TSU5HTEUgPSAwLAorCQlQSVBFX0RVQUwsCisJ CVBJUEVfQ09VTlQsCisJfSBwaXBlczsKKworCS8qIFRoZSBwcmltYXJ5IHNjcmVlbiBpcyB0aGUg b25lIHRoYXQncyBzdXBwb3NlZCB0byBoYXZlIHRoZSAiZmVhdHVyZSIKKwkgKiBlbmFibGVkIG9u LCBidXQgd2UgaGF2ZSB0aGUgb3B0aW9uIHRvIGRyYXcgb24gdGhlIHNlY29uZGFyeSBzY3JlZW4g b3IKKwkgKiBvbiBzb21lIG9mZnNjcmVlbiBidWZmZXIuIFdlIGFsc28gb25seSB0aGVjayB0aGUg Q1JDIG9mIHRoZSBwcmltYXJ5CisJICogc2NyZWVuLiAqLworCWVudW0geworCQlTQ1JFRU5fUFJJ TSA9IDAsCisJCVNDUkVFTl9TQ05ELAorCQlTQ1JFRU5fT0ZGU0NSRUVOLAorCQlTQ1JFRU5fQ09V TlQsCisJfSBzY3JlZW47CisKKwkvKiBXaGVuIHdlIGRyYXcsIHdlIGNhbiBkcmF3IGRpcmVjdGx5 IG9uIHRoZSBwcmltYXJ5IHBsYW5lLCBvbiB0aGUKKwkgKiBjdXJzb3Igb3Igb24gdGhlIHNwcml0 ZSBwbGFuZS4gKi8KKwllbnVtIHsKKwkJUExBTkVfUFJJID0gMCwKKwkJUExBTkVfQ1VSLAorCQlQ TEFORV9TUFIsCisJCVBMQU5FX0NPVU5ULAorCX0gcGxhbmU7CisKKwkvKiBXZSBjYW4gb3JnYW5p emUgdGhlIHNjcmVlbnMgaW4gYSB3YXkgdGhhdCBlYWNoIHNjcmVlbiBoYXMgaXRzIG93bgorCSAq IGZyYW1lYnVmZmVyLCBvciBpbiBhIHdheSB0aGF0IGFsbCBzY3JlZW5zIHBvaW50IHRvIHRoZSBz YW1lCisJICogZnJhbWVidWZmZXIsIGJ1dCBvbiBkaWZmZXJlbnQgcGxhY2VzLiBUaGlzIGluY2x1 ZGVzIHRoZSBvZmZzY3JlZW4KKwkgKiBzY3JlZW4uICovCisJZW51bSB7CisJCUZCU19TSU5HTEUg PSAwLAorCQlGQlNfTVVMVEksCisJCUZCU19DT1VOVAorCX0gZmJzOworCisJLyogV2hpY2ggZmVh dHVyZXMgYXJlIHdlIGdvaW5nIHRvIHRlc3Qgbm93PyBUaGlzIGlzIGEgbWFzayEgKi8KKwllbnVt IHsKKwkJRkVBVFVSRV9OT05FICA9IDAsCisJCUZFQVRVUkVfRkJDICAgPSAxLAorCQlGRUFUVVJF X1BTUiAgID0gMiwKKwkJRkVBVFVSRV9DT1VOVCA9IDQsCisJfSBmZWF0dXJlOworCisJZW51bSBp Z3RfZHJhd19tZXRob2QgbWV0aG9kOworfTsKKworZW51bSBmZWF0dXJlX3N0YXR1cyB7CisJRU5B QkxFRCwKKwlESVNBQkxFRCwKK307CisKK3N0cnVjdCByZWN0IHsKKwlpbnQgeDsKKwlpbnQgeTsK KwlpbnQgdzsKKwlpbnQgaDsKKwl1aW50MzJfdCBjb2xvcjsKK307CisKKyNkZWZpbmUgTUFYX0NP Tk5FQ1RPUlMgMzIKK3N0cnVjdCB7CisJaW50IGZkOworCWRybU1vZGVSZXNQdHIgcmVzOworCWRy bU1vZGVDb25uZWN0b3JQdHIgY29ubmVjdG9yc1tNQVhfQ09OTkVDVE9SU107CisJZHJtTW9kZVBs YW5lUmVzUHRyIHBsYW5lczsKKwlkcm1faW50ZWxfYnVmbWdyICpidWZtZ3I7Cit9IGRybTsKKwor c3RydWN0IHsKKwlpbnQgZmQ7CisJYm9vbCBjYW5fdGVzdDsKKworCWJvb2wgc3VwcG9ydHNfY29t cHJlc3Npbmc7CisJYm9vbCBzdXBwb3J0c19sYXN0X2FjdGlvbjsKKworCXN0cnVjdCB0aW1lc3Bl YyBsYXN0X2FjdGlvbjsKK30gZmJjID0geworCS5mZCA9IC0xLAorCS5jYW5fdGVzdCA9IGZhbHNl LAorCS5zdXBwb3J0c19sYXN0X2FjdGlvbiA9IGZhbHNlLAorCS5zdXBwb3J0c19jb21wcmVzc2lu ZyA9IGZhbHNlLAorfTsKKworc3RydWN0IHsKKwlpbnQgZmQ7CisJYm9vbCBjYW5fdGVzdDsKK30g cHNyID0geworCS5mZCA9IC0xLAorCS5jYW5fdGVzdCA9IGZhbHNlLAorfTsKKworCisjZGVmaW5l IFNJTktfQ1JDX1NJWkUgMTIKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGRhdGFbU0lOS19DUkNf U0laRV07Cit9IHNpbmtfY3JjX3Q7CisKK3N0cnVjdCBib3RoX2NyY3MgeworCWlndF9jcmNfdCBw aXBlOworCXNpbmtfY3JjX3Qgc2luazsKK307CisKK2lndF9waXBlX2NyY190ICpwaXBlX2NyYzsK K3N0cnVjdCBib3RoX2NyY3MgYmx1ZV9jcmM7CitzdHJ1Y3QgYm90aF9jcmNzICp3YW50ZWRfY3Jj OworCitzdHJ1Y3QgeworCWludCBmZDsKK30gc2lua19jcmM7CisKKy8qIFRoZSBnb2FsIG9mIHRo aXMgc3RydWN0dXJlIGlzIHRvIGVhc2lseSBhbGxvdyB1cyB0byBkZWFsIHdpdGggY2FzZXMgd2hl cmUgd2UKKyAqIGhhdmUgYSBiaWcgZnJhbWVidWZmZXIgYW5kIHRoZSBDUlRDIGlzIGp1c3QgZGlz cGxheWluZyBhIHN1YnJlZ2lvbiBvZiB0aGlzCisgKiBiaWcgRkIuICovCitzdHJ1Y3QgZmJfcmVn aW9uIHsKKwlzdHJ1Y3QgaWd0X2ZiICpmYjsKKwlpbnQgeDsKKwlpbnQgeTsKKwlpbnQgdzsKKwlp bnQgaDsKK307CisKK3N0cnVjdCBkcmF3X3BhdHRlcm5faW5mbyB7CisJYm9vbCBpbml0aWFsaXpl ZDsKKwlib29sIGZyYW1lc19zdGFjazsKKwlpbnQgbl9yZWN0czsKKwlzdHJ1Y3QgYm90aF9jcmNz ICpjcmNzOworCXN0cnVjdCByZWN0ICgqZ2V0X3JlY3QpKHN0cnVjdCBmYl9yZWdpb24gKmZiLCBp bnQgcik7Cit9OworCisvKiBEcmF3IGJpZyByZWN0YW5nbGVzIG9uIHRoZSBzY3JlZW4uICovCitz dHJ1Y3QgZHJhd19wYXR0ZXJuX2luZm8gcGF0dGVybjE7CisvKiA2NHg2NCByZWN0YW5nbGVzIGF0 IHg6MCx5OjAsIGp1c3Qgc28gd2UgY2FuIGRyYXcgb24gdGhlIGN1cnNvciBhbmQgc3ByaXRlLiAq Lworc3RydWN0IGRyYXdfcGF0dGVybl9pbmZvIHBhdHRlcm4yOworLyogNjR4NjQgcmVjdGFuZ2xl cyBhdCBkaWZmZXJlbnQgcG9zaXRpb25zLCBzYW1lIGNvbG9yLCBmb3IgdGhlIG1vdmUgdGVzdC4g Ki8KK3N0cnVjdCBkcmF3X3BhdHRlcm5faW5mbyBwYXR0ZXJuMzsKKy8qIEp1c3QgYSBmdWxsc2Ny ZWVuIGdyZWVuIHNxdWFyZS4gKi8KK3N0cnVjdCBkcmF3X3BhdHRlcm5faW5mbyBwYXR0ZXJuNDsK KworLyogQ29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuICovCitzdHJ1Y3QgeworCWJvb2wgY2hlY2tf c3RhdHVzOworCWJvb2wgY2hlY2tfY3JjOworCWJvb2wgZmJjX2NoZWNrX2NvbXByZXNzaW9uOwor CWJvb2wgZmJjX2NoZWNrX2xhc3RfYWN0aW9uOworCWJvb2wgbm9fZWRwOworCWJvb2wgc21hbGxf bW9kZXM7CisJYm9vbCBzaG93X2hpZGRlbjsKKwlpbnQgc3RlcDsKKwlpbnQgb25seV9mZWF0dXJl OworCWludCBvbmx5X3BpcGVzOworfSBvcHQgPSB7CisJLmNoZWNrX3N0YXR1cyA9IHRydWUsCisJ LmNoZWNrX2NyYyA9IHRydWUsCisJLmZiY19jaGVja19jb21wcmVzc2lvbiA9IHRydWUsCisJLmZi Y19jaGVja19sYXN0X2FjdGlvbiA9IHRydWUsCisJLm5vX2VkcCA9IGZhbHNlLAorCS5zbWFsbF9t b2RlcyA9IGZhbHNlLAorCS5zaG93X2hpZGRlbj0gZmFsc2UsCisJLnN0ZXAgPSAwLAorCS5vbmx5 X2ZlYXR1cmUgPSBGRUFUVVJFX0NPVU5ULAorCS5vbmx5X3BpcGVzID0gUElQRV9DT1VOVCwKK307 CisKK3N0cnVjdCBtb2Rlc2V0X3BhcmFtcyB7CisJdWludDMyX3QgY3J0Y19pZDsKKwl1aW50MzJf dCBjb25uZWN0b3JfaWQ7CisJdWludDMyX3Qgc3ByaXRlX2lkOworCWRybU1vZGVNb2RlSW5mb1B0 ciBtb2RlOworCXN0cnVjdCBmYl9yZWdpb24gZmI7CisJc3RydWN0IGZiX3JlZ2lvbiBjdXJzb3I7 CisJc3RydWN0IGZiX3JlZ2lvbiBzcHJpdGU7Cit9OworCitzdHJ1Y3QgbW9kZXNldF9wYXJhbXMg cHJpbV9tb2RlX3BhcmFtczsKK3N0cnVjdCBtb2Rlc2V0X3BhcmFtcyBzY25kX21vZGVfcGFyYW1z Oworc3RydWN0IGZiX3JlZ2lvbiBvZmZzY3JlZW5fZmI7CitzdHJ1Y3QgeworCXN0cnVjdCBpZ3Rf ZmIgcHJpbV9wcmk7CisJc3RydWN0IGlndF9mYiBwcmltX2N1cjsKKwlzdHJ1Y3QgaWd0X2ZiIHBy aW1fc3ByOworCisJc3RydWN0IGlndF9mYiBzY25kX3ByaTsKKwlzdHJ1Y3QgaWd0X2ZiIHNjbmRf Y3VyOworCXN0cnVjdCBpZ3RfZmIgc2NuZF9zcHI7CisKKwlzdHJ1Y3QgaWd0X2ZiIG9mZnNjcmVl bjsKKwlzdHJ1Y3QgaWd0X2ZiIGJpZzsKK30gZmJzOworCitzdGF0aWMgZHJtTW9kZU1vZGVJbmZv UHRyIGdldF9jb25uZWN0b3Jfc21hbGxlc3RfbW9kZShkcm1Nb2RlQ29ubmVjdG9yUHRyIGMpCit7 CisJaW50IGk7CisJZHJtTW9kZU1vZGVJbmZvUHRyIHNtYWxsZXN0ID0gTlVMTDsKKworCWZvciAo aSA9IDA7IGkgPCBjLT5jb3VudF9tb2RlczsgaSsrKSB7CisJCWRybU1vZGVNb2RlSW5mb1B0ciBt b2RlID0gJmMtPm1vZGVzW2ldOworCisJCWlmICghc21hbGxlc3QpCisJCQlzbWFsbGVzdCA9IG1v ZGU7CisKKwkJaWYgKG1vZGUtPmhkaXNwbGF5ICogbW9kZS0+dmRpc3BsYXkgPAorCQkgICAgc21h bGxlc3QtPmhkaXNwbGF5ICogc21hbGxlc3QtPnZkaXNwbGF5KQorCQkJc21hbGxlc3QgPSBtb2Rl OworCX0KKworCXJldHVybiBzbWFsbGVzdDsKK30KKworc3RhdGljIGRybU1vZGVDb25uZWN0b3JQ dHIgZ2V0X2Nvbm5lY3Rvcih1aW50MzJfdCBpZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7 IGkgPCBkcm0ucmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspCisJCWlmIChkcm0ucmVzLT5jb25u ZWN0b3JzW2ldID09IGlkKQorCQkJcmV0dXJuIGRybS5jb25uZWN0b3JzW2ldOworCisJaWd0X2Fz c2VydChmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21vZGVfaW5mbyhjb25zdCBjaGFy ICpzY3JlZW4sIHN0cnVjdCBtb2Rlc2V0X3BhcmFtcyAqcGFyYW1zKQoreworCWRybU1vZGVDb25u ZWN0b3JQdHIgYyA9IGdldF9jb25uZWN0b3IocGFyYW1zLT5jb25uZWN0b3JfaWQpOworCisJaWd0 X2luZm8oIiVzIHNjcmVlbjogJXMgJXNcbiIsCisJCSBzY3JlZW4sCisJCSBrbXN0ZXN0X2Nvbm5l Y3Rvcl90eXBlX3N0cihjLT5jb25uZWN0b3JfdHlwZSksCisJCSBwYXJhbXMtPm1vZGUtPm5hbWUp OworfQorCitzdGF0aWMgdm9pZCBpbml0X21vZGVfcGFyYW1zKHN0cnVjdCBtb2Rlc2V0X3BhcmFt cyAqcGFyYW1zLCB1aW50MzJfdCBjcnRjX2lkLAorCQkJICAgICBpbnQgY3J0Y19pbmRleCwgdWlu dDMyX3QgY29ubmVjdG9yX2lkLAorCQkJICAgICBkcm1Nb2RlTW9kZUluZm9QdHIgbW9kZSkKK3sK Kwl1aW50MzJfdCBwbGFuZV9pZCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHJt LnBsYW5lcy0+Y291bnRfcGxhbmVzICYmIHBsYW5lX2lkID09IDA7IGkrKykgeworCQlkcm1Nb2Rl UGxhbmVQdHIgcGxhbmU7CisKKwkJcGxhbmUgPSBkcm1Nb2RlR2V0UGxhbmUoZHJtLmZkLCBkcm0u cGxhbmVzLT5wbGFuZXNbaV0pOworCQlpZ3RfYXNzZXJ0KHBsYW5lKTsKKworCQlpZiAocGxhbmUt PnBvc3NpYmxlX2NydGNzICYgKDEgPDwgY3J0Y19pbmRleCkpCisJCQlwbGFuZV9pZCA9IHBsYW5l LT5wbGFuZV9pZDsKKworCQlkcm1Nb2RlRnJlZVBsYW5lKHBsYW5lKTsKKwl9CisJaWd0X2Fzc2Vy dChwbGFuZV9pZCk7CisKKwlwYXJhbXMtPmNydGNfaWQgPSBjcnRjX2lkOworCXBhcmFtcy0+Y29u bmVjdG9yX2lkID0gY29ubmVjdG9yX2lkOworCXBhcmFtcy0+bW9kZSA9IG1vZGU7CisJcGFyYW1z LT5zcHJpdGVfaWQgPSBwbGFuZV9pZDsKKworCXBhcmFtcy0+ZmIuZmIgPSBOVUxMOworCXBhcmFt cy0+ZmIudyA9IG1vZGUtPmhkaXNwbGF5OworCXBhcmFtcy0+ZmIuaCA9IG1vZGUtPnZkaXNwbGF5 OworCisJcGFyYW1zLT5jdXJzb3IuZmIgPSBOVUxMOworCXBhcmFtcy0+Y3Vyc29yLnggPSAwOwor CXBhcmFtcy0+Y3Vyc29yLnkgPSAwOworCXBhcmFtcy0+Y3Vyc29yLncgPSA2NDsKKwlwYXJhbXMt PmN1cnNvci5oID0gNjQ7CisKKwlwYXJhbXMtPnNwcml0ZS5mYiA9IE5VTEw7CisJcGFyYW1zLT5z cHJpdGUueCA9IDA7CisJcGFyYW1zLT5zcHJpdGUueSA9IDA7CisJcGFyYW1zLT5zcHJpdGUudyA9 IDY0OworCXBhcmFtcy0+c3ByaXRlLmggPSA2NDsKK30KKworZHJtTW9kZU1vZGVJbmZvIHN0ZF8x MDI0X21vZGUgPSB7CisJLmNsb2NrID0gNjUwMDAsCisJLmhkaXNwbGF5ID0gMTAyNCwKKwkuaHN5 bmNfc3RhcnQgPSAxMDQ4LAorCS5oc3luY19lbmQgPSAxMTg0LAorCS5odG90YWwgPSAxMzQ0LAor CS52dG90YWwgPSA4MDYsCisJLmhza2V3ID0gMCwKKwkudmRpc3BsYXkgPSA3NjgsCisJLnZzeW5j X3N0YXJ0ID0gNzcxLAorCS52c3luY19lbmQgPSA3NzcsCisJLnZ0b3RhbCA9IDgwNiwKKwkudnNj YW4gPSAwLAorCS52cmVmcmVzaCA9IDYwLAorCS5mbGFncyA9IDB4QSwKKwkudHlwZSA9IDB4NDAs CisJLm5hbWUgPSAiQ3VzdG9tIDEwMjR4NzY4IiwKK307CisKK3N0YXRpYyBib29sIGNvbm5lY3Rv cl9nZXRfbW9kZShkcm1Nb2RlQ29ubmVjdG9yUHRyIGMsIGRybU1vZGVNb2RlSW5mb1B0ciAqbW9k ZSkKK3sKKwkqbW9kZSA9IE5VTEw7CisKKwlpZiAoYy0+Y29ubmVjdGlvbiAhPSBEUk1fTU9ERV9D T05ORUNURUQgfHwgIWMtPmNvdW50X21vZGVzKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoYy0+ Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCAmJiBvcHQubm9fZWRwKQor CQlyZXR1cm4gZmFsc2U7CisKKwlpZiAob3B0LnNtYWxsX21vZGVzKQorCQkqbW9kZSA9IGdldF9j b25uZWN0b3Jfc21hbGxlc3RfbW9kZShjKTsKKwllbHNlCisJCSptb2RlID0gJmMtPm1vZGVzWzBd OworCisJLyogQmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzIHdlIGRvbid0IGhhdmUgZW5vdWdoIHN0 b2xlbiBtZW1vcnkgdG8gZml0IGluCisJICogdGhvc2UgM2sgcGFuZWxzLiBBbmQgb24gSFNXIHRo ZSBDUkMgV0EgaXMgc28gYXdmdWwgdGhhdCBpdCBtYWtlcyB5b3UKKwkgKiB0aGluayBldmVyeXRo aW5nIGlzIGJ1Z2dlZC4gKi8KKwlpZiAoYy0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09O TkVDVE9SX2VEUCkKKwkJKm1vZGUgPSAmc3RkXzEwMjRfbW9kZTsKKworCXJldHVybiB0cnVlOwor fQorCitzdGF0aWMgYm9vbCBpbml0X21vZGVzZXRfY2FjaGVkX3BhcmFtcyh2b2lkKQoreworCWlu dCBpOworCXVpbnQzMl90IHByaW1fY29ubmVjdG9yX2lkID0gMCwgc2NuZF9jb25uZWN0b3JfaWQg PSAwOworCWRybU1vZGVNb2RlSW5mb1B0ciBwcmltX21vZGUgPSBOVUxMLCBzY25kX21vZGUgPSBO VUxMOworCWRybU1vZGVNb2RlSW5mb1B0ciB0bXBfbW9kZTsKKworCS8qIEZpcnN0LCB0cnkgdG8g ZmluZCBhbiBlRFAgbW9uaXRvciBzaW5jZSBpdCdzIHRoZSBvbmx5IHBvc3NpYmxlIHR5cGUKKwkg KiBmb3IgUFNSLiAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZHJtLnJlcy0+Y291bnRfY29ubmVjdG9y czsgaSsrKSB7CisJCWlmIChkcm0uY29ubmVjdG9yc1tpXS0+Y29ubmVjdG9yX3R5cGUgIT0gRFJN X01PREVfQ09OTkVDVE9SX2VEUCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjb25uZWN0b3JfZ2V0 X21vZGUoZHJtLmNvbm5lY3RvcnNbaV0sICZ0bXBfbW9kZSkpIHsKKwkJCXByaW1fY29ubmVjdG9y X2lkID0gZHJtLnJlcy0+Y29ubmVjdG9yc1tpXTsKKwkJCXByaW1fbW9kZSA9IHRtcF9tb2RlOwor CQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBkcm0ucmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKysp IHsKKwkJLyogRG9uJ3QgcGljayBhZ2FpbiB3aGF0IHdlIGp1c3Qgc2VsZWN0ZWQgb24gdGhlIGFi b3ZlIGxvb3AuICovCisJCWlmIChkcm0ucmVzLT5jb25uZWN0b3JzW2ldID09IHByaW1fY29ubmVj dG9yX2lkKQorCQkJY29udGludWU7CisKKwkJaWYgKGNvbm5lY3Rvcl9nZXRfbW9kZShkcm0uY29u bmVjdG9yc1tpXSwgJnRtcF9tb2RlKSkgeworCQkJaWYgKCFwcmltX2Nvbm5lY3Rvcl9pZCkgewor CQkJCXByaW1fY29ubmVjdG9yX2lkID0gZHJtLnJlcy0+Y29ubmVjdG9yc1tpXTsKKwkJCQlwcmlt X21vZGUgPSB0bXBfbW9kZTsKKwkJCX0gZWxzZSBpZiAoIXNjbmRfY29ubmVjdG9yX2lkKSB7CisJ CQkJc2NuZF9jb25uZWN0b3JfaWQgPSBkcm0ucmVzLT5jb25uZWN0b3JzW2ldOworCQkJCXNjbmRf bW9kZSA9IHRtcF9tb2RlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKCFwcmlt X2Nvbm5lY3Rvcl9pZCkKKwkJcmV0dXJuIGZhbHNlOworCisJaW5pdF9tb2RlX3BhcmFtcygmcHJp bV9tb2RlX3BhcmFtcywgZHJtLnJlcy0+Y3J0Y3NbMF0sIDAsCisJCQkgcHJpbV9jb25uZWN0b3Jf aWQsIHByaW1fbW9kZSk7CisJcHJpbnRfbW9kZV9pbmZvKCJQcmltYXJ5IiwgJnByaW1fbW9kZV9w YXJhbXMpOworCisJaWYgKCFzY25kX2Nvbm5lY3Rvcl9pZCkgeworCQlzY25kX21vZGVfcGFyYW1z LmNvbm5lY3Rvcl9pZCA9IDA7CisJCXJldHVybiB0cnVlOworCX0KKworCWlndF9hc3NlcnQoZHJt LnJlcy0+Y291bnRfY3J0Y3MgPj0gMik7CisJaW5pdF9tb2RlX3BhcmFtcygmc2NuZF9tb2RlX3Bh cmFtcywgZHJtLnJlcy0+Y3J0Y3NbMV0sIDEsCisJCQkgc2NuZF9jb25uZWN0b3JfaWQsIHNjbmRf bW9kZSk7CisJcHJpbnRfbW9kZV9pbmZvKCJTZWNvbmRhcnkiLCAmc2NuZF9tb2RlX3BhcmFtcyk7 CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFRoaXMgaXMgaG93IHRoZSBwcmltLCBzY25k IGFuZCBvZmZzY3JlZW5zIEZCIHNob3VsZCBiZSBwb3NpdGlvbmVkIGluc2lkZSB0aGUKKyAqIGJp ZyBGQi4gVGhlIHByaW0gYnVmZmVyIHN0YXJ0cyBhdCBhIDUwMHg1MDAgb2Zmc2V0LCB0aGVuIHNj bmQgc3RhcnRzIGF0IHRoZQorICogc2FtZSA1MDAgcGl4ZWwgWSBvZmZzZXQsIHJpZ2h0IGFmdGVy IHByaW0gZW5kcyBvbiB0aGUgWCBheGlzLCB0aGVuIHRoZQorICogb2Zmc2NyZWVuIGZiIHN0YXJ0 cyBhZnRlciBzY25kIGVuZHMuCisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tKworICogfCBiaWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAr LS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisgKiB8ICAgfCBwcmltICAgfCBzY25k ICAgICAgfCBvZmZzY3JlZW4gfAorICogfCAgIHwgICAgICAgIHwgICAgICAgICAgIHwgICAgICAg ICAgIHwKKyAqIHwgICB8ICAgICAgICArLS0tLS0tLS0tLS0rICAgICAgICAgICB8CisgKiB8ICAg fCAgICAgICAgfCAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICogKy0tLSstLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqLworc3RhdGljIHZvaWQgY3JlYXRlX2JpZ19mYih2b2lk KQoreworCWludCBwcmltX3csIHByaW1faCwgc2NuZF93LCBzY25kX2gsIG9mZnNfdywgb2Zmc19o LCBiaWdfdywgYmlnX2g7CisKKwlwcmltX3cgPSBwcmltX21vZGVfcGFyYW1zLm1vZGUtPmhkaXNw bGF5OworCXByaW1faCA9IHByaW1fbW9kZV9wYXJhbXMubW9kZS0+dmRpc3BsYXk7CisKKwlpZiAo c2NuZF9tb2RlX3BhcmFtcy5jb25uZWN0b3JfaWQpIHsKKwkJc2NuZF93ID0gc2NuZF9tb2RlX3Bh cmFtcy5tb2RlLT5oZGlzcGxheTsKKwkJc2NuZF9oID0gc2NuZF9tb2RlX3BhcmFtcy5tb2RlLT52 ZGlzcGxheTsKKwl9IGVsc2UgeworCQlzY25kX3cgPSAwOworCQlzY25kX2ggPSAwOworCX0KKwlv ZmZzX3cgPSBvZmZzY3JlZW5fZmIudzsKKwlvZmZzX2ggPSBvZmZzY3JlZW5fZmIuaDsKKworCWJp Z193ID0gcHJpbV93ICsgc2NuZF93ICsgb2Zmc193ICsgNTAwOworCisJYmlnX2ggPSBwcmltX2g7 CisJaWYgKHNjbmRfaCA+IGJpZ19oKQorCQliaWdfaCA9IHNjbmRfaDsKKwlpZiAob2Zmc19oID4g YmlnX2gpCisJCWJpZ19oID0gb2Zmc19oOworCWJpZ19oICs9IDUwMDsKKworCWlndF9jcmVhdGVf ZmIoZHJtLmZkLCBiaWdfdywgYmlnX2gsIERSTV9GT1JNQVRfWFJHQjg4ODgsCisJCSAgICAgIExP Q0FMX0k5MTVfRk9STUFUX01PRF9YX1RJTEVELCAmZmJzLmJpZyk7Cit9CisKK3N0YXRpYyB2b2lk IGNyZWF0ZV9mYnModm9pZCkKK3sKKwlpZ3RfY3JlYXRlX2ZiKGRybS5mZCwgcHJpbV9tb2RlX3Bh cmFtcy5tb2RlLT5oZGlzcGxheSwKKwkJICAgICAgcHJpbV9tb2RlX3BhcmFtcy5tb2RlLT52ZGlz cGxheSwKKwkJICAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwgTE9DQUxfSTkxNV9GT1JNQVRfTU9E X1hfVElMRUQsCisJCSAgICAgICZmYnMucHJpbV9wcmkpOworCWlndF9jcmVhdGVfZmIoZHJtLmZk LCBwcmltX21vZGVfcGFyYW1zLmN1cnNvci53LAorCQkgICAgICBwcmltX21vZGVfcGFyYW1zLmN1 cnNvci5oLCBEUk1fRk9STUFUX0FSR0I4ODg4LAorCQkgICAgICBMT0NBTF9EUk1fRk9STUFUX01P RF9OT05FLCAmZmJzLnByaW1fY3VyKTsKKwlpZ3RfY3JlYXRlX2ZiKGRybS5mZCwgcHJpbV9tb2Rl X3BhcmFtcy5zcHJpdGUudywKKwkJICAgICAgcHJpbV9tb2RlX3BhcmFtcy5zcHJpdGUuaCwgRFJN X0ZPUk1BVF9YUkdCODg4OCwKKwkJICAgICAgTE9DQUxfSTkxNV9GT1JNQVRfTU9EX1hfVElMRUQs ICZmYnMucHJpbV9zcHIpOworCisJaWd0X2NyZWF0ZV9mYihkcm0uZmQsIG9mZnNjcmVlbl9mYi53 LCBvZmZzY3JlZW5fZmIuaCwKKwkJICAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwgTE9DQUxfSTkx NV9GT1JNQVRfTU9EX1hfVElMRUQsCisJCSAgICAgICZmYnMub2Zmc2NyZWVuKTsKKworCWNyZWF0 ZV9iaWdfZmIoKTsKKworCWlmICghc2NuZF9tb2RlX3BhcmFtcy5jb25uZWN0b3JfaWQpCisJCXJl dHVybjsKKworCWlndF9jcmVhdGVfZmIoZHJtLmZkLCBzY25kX21vZGVfcGFyYW1zLm1vZGUtPmhk aXNwbGF5LAorCQkgICAgICBzY25kX21vZGVfcGFyYW1zLm1vZGUtPnZkaXNwbGF5LAorCQkgICAg ICBEUk1fRk9STUFUX1hSR0I4ODg4LCBMT0NBTF9JOTE1X0ZPUk1BVF9NT0RfWF9USUxFRCwKKwkJ ICAgICAgJmZicy5zY25kX3ByaSk7CisJaWd0X2NyZWF0ZV9mYihkcm0uZmQsIHNjbmRfbW9kZV9w YXJhbXMuY3Vyc29yLncsCisJCSAgICAgIHNjbmRfbW9kZV9wYXJhbXMuY3Vyc29yLmgsIERSTV9G T1JNQVRfQVJHQjg4ODgsCisJCSAgICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsICZmYnMu c2NuZF9jdXIpOworCWlndF9jcmVhdGVfZmIoZHJtLmZkLCBzY25kX21vZGVfcGFyYW1zLnNwcml0 ZS53LAorCQkgICAgICBzY25kX21vZGVfcGFyYW1zLnNwcml0ZS5oLCBEUk1fRk9STUFUX1hSR0I4 ODg4LAorCQkgICAgICBMT0NBTF9JOTE1X0ZPUk1BVF9NT0RfWF9USUxFRCwgJmZicy5zY25kX3Nw cik7Cit9CisKK3N0YXRpYyBib29sIHNldF9tb2RlX2Zvcl9wYXJhbXMoc3RydWN0IG1vZGVzZXRf cGFyYW1zICpwYXJhbXMpCit7CisJaW50IHJjOworCisJcmMgPSBkcm1Nb2RlU2V0Q3J0Yyhkcm0u ZmQsIHBhcmFtcy0+Y3J0Y19pZCwgcGFyYW1zLT5mYi5mYi0+ZmJfaWQsCisJCQkgICAgcGFyYW1z LT5mYi54LCBwYXJhbXMtPmZiLnksCisJCQkgICAgJnBhcmFtcy0+Y29ubmVjdG9yX2lkLCAxLCBw YXJhbXMtPm1vZGUpOworCXJldHVybiAocmMgPT0gMCk7Cit9CisKKyNkZWZpbmUgREVCVUdGU19N U0dfU0laRSAyNTYKKworc3RhdGljIHZvaWQgZ2V0X2RlYnVnZnNfc3RyaW5nKGludCBmZCwgY2hh ciAqYnVmKQoreworCXNzaXplX3Qgbl9yZWFkOworCisJbHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsK KworCW5fcmVhZCA9IHJlYWQoZmQsIGJ1ZiwgREVCVUdGU19NU0dfU0laRSAtMSk7CisJaWd0X2Fz c2VydChuX3JlYWQgPj0gMCk7CisJYnVmW25fcmVhZF0gPSAnXDAnOworfQorCitzdGF0aWMgZW51 bSBmZWF0dXJlX3N0YXR1cyBmYmNfZ2V0X3N0YXR1cyh2b2lkKQoreworCWNoYXIgYnVmW0RFQlVH RlNfTVNHX1NJWkVdOworCisJZ2V0X2RlYnVnZnNfc3RyaW5nKGZiYy5mZCwgYnVmKTsKKworCWlm IChzdHJzdHIoYnVmLCAiRkJDIGVuYWJsZWRcbiIpKQorCQlyZXR1cm4gRU5BQkxFRDsKKwllbHNl CisJCXJldHVybiBESVNBQkxFRDsKK30KKworc3RhdGljIGVudW0gZmVhdHVyZV9zdGF0dXMgcHNy X2dldF9zdGF0dXModm9pZCkKK3sKKwljaGFyIGJ1ZltERUJVR0ZTX01TR19TSVpFXTsKKworCWdl dF9kZWJ1Z2ZzX3N0cmluZyhwc3IuZmQsIGJ1Zik7CisKKwlpZiAoc3Ryc3RyKGJ1ZiwgIlxuQWN0 aXZlOiB5ZXNcbiIpKQorCQlyZXR1cm4gRU5BQkxFRDsKKwllbHNlCisJCXJldHVybiBESVNBQkxF RDsKK30KKworc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBmYmNfZ2V0X2xhc3RfYWN0aW9uKHZvaWQp Cit7CisJc3RydWN0IHRpbWVzcGVjIHJldCA9IHsgMCwgMCB9OworCWNoYXIgYnVmW0RFQlVHRlNf TVNHX1NJWkVdOworCWNoYXIgKmFjdGlvbjsKKwlzc2l6ZV90IG5fcmVhZDsKKworCWdldF9kZWJ1 Z2ZzX3N0cmluZyhmYmMuZmQsIGJ1Zik7CisKKwlhY3Rpb24gPSBzdHJzdHIoYnVmLCAiXG5MYXN0 IGFjdGlvbjoiKTsKKwlpZ3RfYXNzZXJ0KGFjdGlvbik7CisKKwluX3JlYWQgPSBzc2NhbmYoYWN0 aW9uLCAiTGFzdCBhY3Rpb246ICVsZC4lbGQiLAorCQkJJnJldC50dl9zZWMsICZyZXQudHZfbnNl Yyk7CisJaWd0X2Fzc2VydChuX3JlYWQgPT0gMik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0 aWMgYm9vbCBmYmNfbGFzdF9hY3Rpb25fY2hhbmdlZCh2b2lkKQoreworCXN0cnVjdCB0aW1lc3Bl YyB0X25ldywgdF9vbGQ7CisKKwl0X29sZCA9IGZiYy5sYXN0X2FjdGlvbjsKKwl0X25ldyA9IGZi Y19nZXRfbGFzdF9hY3Rpb24oKTsKKworCWZiYy5sYXN0X2FjdGlvbiA9IHRfbmV3OworCisjaWYg MAorCWlndF9pbmZvKCJvbGQ6ICVsZC4lbGRcbiIsIHRfb2xkLnR2X3NlYywgdF9vbGQudHZfbnNl Yyk7CisJaWd0X2luZm8oIm5ldzogJWxkLiVsZFxuIiwgdF9uZXcudHZfc2VjLCB0X25ldy50dl9u c2VjKTsKKyNlbmRpZgorCisJcmV0dXJuIHRfb2xkLnR2X3NlYyAhPSB0X25ldy50dl9zZWMgfHwK KwkgICAgICAgdF9vbGQudHZfbnNlYyAhPSB0X25ldy50dl9uc2VjOworfQorCitzdGF0aWMgdm9p ZCBmYmNfdXBkYXRlX2xhc3RfYWN0aW9uKHZvaWQpCit7CisJaWYgKCFmYmMuc3VwcG9ydHNfbGFz dF9hY3Rpb24pCisJCXJldHVybjsKKworCWZiYy5sYXN0X2FjdGlvbiA9IGZiY19nZXRfbGFzdF9h Y3Rpb24oKTsKKworI2lmIDAKKwlpZ3RfaW5mbygiTGFzdCBhY3Rpb246ICVsZC4lbGRcbiIsCisJ CSBmYmMubGFzdF9hY3Rpb24udHZfc2VjLCBmYmMubGFzdF9hY3Rpb24udHZfbnNlYyk7CisjZW5k aWYKK30KKworc3RhdGljIHZvaWQgZmJjX3NldHVwX2xhc3RfYWN0aW9uKHZvaWQpCit7CisJc3Np emVfdCBuX3JlYWQ7CisJY2hhciBidWZbREVCVUdGU19NU0dfU0laRV07CisJY2hhciAqYWN0aW9u OworCisJZ2V0X2RlYnVnZnNfc3RyaW5nKGZiYy5mZCwgYnVmKTsKKworCWFjdGlvbiA9IHN0cnN0 cihidWYsICJcbkxhc3QgYWN0aW9uOiIpOworCWlmICghYWN0aW9uKSB7CisJCWlndF9pbmZvKCJG QkMgbGFzdCBhY3Rpb24gbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlmYmMu c3VwcG9ydHNfbGFzdF9hY3Rpb24gPSB0cnVlOworCisJbl9yZWFkID0gc3NjYW5mKGFjdGlvbiwg Ikxhc3QgYWN0aW9uOiAlbGQuJWxkIiwKKwkJCSZmYmMubGFzdF9hY3Rpb24udHZfc2VjLCAmZmJj Lmxhc3RfYWN0aW9uLnR2X25zZWMpOworCWlndF9hc3NlcnQobl9yZWFkID09IDIpOworfQorCitz dGF0aWMgYm9vbCBmYmNfaXNfY29tcHJlc3Npbmcodm9pZCkKK3sKKwljaGFyIGJ1ZltERUJVR0ZT X01TR19TSVpFXTsKKworCWdldF9kZWJ1Z2ZzX3N0cmluZyhmYmMuZmQsIGJ1Zik7CisJcmV0dXJu IHN0cnN0cihidWYsICJcbkNvbXByZXNzaW5nOiB5ZXNcbiIpICE9IE5VTEw7Cit9CisKK3N0YXRp YyBib29sIGZiY193YWl0X2Zvcl9jb21wcmVzc2lvbih2b2lkKQoreworCXJldHVybiBpZ3Rfd2Fp dChmYmNfaXNfY29tcHJlc3NpbmcoKSwgNTAwMCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGZiY19z ZXR1cF9jb21wcmVzc2luZyh2b2lkKQoreworCWNoYXIgYnVmW0RFQlVHRlNfTVNHX1NJWkVdOwor CisJZ2V0X2RlYnVnZnNfc3RyaW5nKGZiYy5mZCwgYnVmKTsKKworCWlmIChzdHJzdHIoYnVmLCAi XG5Db21wcmVzc2luZzoiKSkKKwkJZmJjLnN1cHBvcnRzX2NvbXByZXNzaW5nID0gdHJ1ZTsKKwll bHNlCisJCWlndF9pbmZvKCJGQkMgY29tcHJlc3Npb24gaW5mb3JtYXRpb24gbm90IHN1cHBvcnRl ZFxuIik7Cit9CisKK3N0YXRpYyBib29sIGZiY193YWl0X2Zvcl9zdGF0dXMoZW51bSBmZWF0dXJl X3N0YXR1cyBzdGF0dXMpCit7CisJcmV0dXJuIGlndF93YWl0KGZiY19nZXRfc3RhdHVzKCkgPT0g c3RhdHVzLCA1MDAwLCAxKTsKK30KKworc3RhdGljIGJvb2wgcHNyX3dhaXRfZm9yX3N0YXR1cyhl bnVtIGZlYXR1cmVfc3RhdHVzIHN0YXR1cykKK3sKKwlyZXR1cm4gaWd0X3dhaXQocHNyX2dldF9z dGF0dXMoKSA9PSBzdGF0dXMsIDUwMDAsIDEpOworfQorCisjZGVmaW5lIGZiY19lbmFibGUoKSBp Z3Rfc2V0X21vZHVsZV9wYXJhbV9pbnQoImVuYWJsZV9mYmMiLCAxKQorI2RlZmluZSBmYmNfZGlz YWJsZSgpIGlndF9zZXRfbW9kdWxlX3BhcmFtX2ludCgiZW5hYmxlX2ZiYyIsIDApCisjZGVmaW5l IHBzcl9lbmFibGUoKSBpZ3Rfc2V0X21vZHVsZV9wYXJhbV9pbnQoImVuYWJsZV9wc3IiLCAxKQor I2RlZmluZSBwc3JfZGlzYWJsZSgpIGlndF9zZXRfbW9kdWxlX3BhcmFtX2ludCgiZW5hYmxlX3Bz ciIsIDApCisKK3N0YXRpYyB2b2lkIGdldF9zaW5rX2NyYyhzaW5rX2NyY190ICpjcmMpCit7CisJ bHNlZWsoc2lua19jcmMuZmQsIDAsIFNFRUtfU0VUKTsKKworCWlndF9hc3NlcnQocmVhZChzaW5r X2NyYy5mZCwgY3JjLT5kYXRhLCBTSU5LX0NSQ19TSVpFKSA9PQorCQkgICBTSU5LX0NSQ19TSVpF KTsKK30KKworc3RhdGljIGJvb2wgc2lua19jcmNfZXF1YWwoc2lua19jcmNfdCAqYSwgc2lua19j cmNfdCAqYikKK3sKKwlyZXR1cm4gKG1lbWNtcChhLT5kYXRhLCBiLT5kYXRhLCBTSU5LX0NSQ19T SVpFKSA9PSAwKTsKK30KKworI2RlZmluZSBhc3NlcnRfc2lua19jcmNfZXF1YWwoYSwgYikgaWd0 X2Fzc2VydChzaW5rX2NyY19lcXVhbChhLCBiKSkKKworc3RhdGljIHN0cnVjdCByZWN0IHBhdDFf Z2V0X3JlY3Qoc3RydWN0IGZiX3JlZ2lvbiAqZmIsIGludCByKQoreworCXN0cnVjdCByZWN0IHJl Y3Q7CisKKwlzd2l0Y2ggKHIpIHsKKwljYXNlIDA6CisJCXJlY3QueCA9IDA7CisJCXJlY3QueSA9 IDA7CisJCXJlY3QudyA9IGZiLT53IC8gODsKKwkJcmVjdC5oID0gZmItPmggLyA4OworCQlyZWN0 LmNvbG9yID0gMHgwMEZGMDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcmVjdC54ID0gZmItPncg LyA4ICogNDsKKwkJcmVjdC55ID0gZmItPmggLyA4ICogNDsKKwkJcmVjdC53ID0gZmItPncgLyA4 ICogMjsKKwkJcmVjdC5oID0gZmItPmggLyA4ICogMjsKKwkJcmVjdC5jb2xvciA9IDB4RkYwMDAw OworCQlicmVhazsKKwljYXNlIDI6CisJCXJlY3QueCA9IGZiLT53IC8gMTYgKyAxOworCQlyZWN0 LnkgPSBmYi0+aCAvIDE2ICsgMTsKKwkJcmVjdC53ID0gZmItPncgLyA4ICsgMTsKKwkJcmVjdC5o ID0gZmItPmggLyA4ICsgMTsKKwkJcmVjdC5jb2xvciA9IDB4RkYwMEZGOworCQlicmVhazsKKwlj YXNlIDM6CisJCXJlY3QueCA9IGZiLT53IC0gNjQ7CisJCXJlY3QueSA9IGZiLT5oIC0gNjQ7CisJ CXJlY3QudyA9IDY0OworCQlyZWN0LmggPSA2NDsKKwkJcmVjdC5jb2xvciA9IDB4MDBGRkZGOwor CQlicmVhazsKKwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0KGZhbHNlKTsKKwl9CisKKwlyZXR1cm4g cmVjdDsKK30KKworc3RhdGljIHN0cnVjdCByZWN0IHBhdDJfZ2V0X3JlY3Qoc3RydWN0IGZiX3Jl Z2lvbiAqZmIsIGludCByKQoreworCXN0cnVjdCByZWN0IHJlY3Q7CisKKwlyZWN0LnggPSAwOwor CXJlY3QueSA9IDA7CisJcmVjdC53ID0gNjQ7CisJcmVjdC5oID0gNjQ7CisKKwlzd2l0Y2ggKHIp IHsKKwljYXNlIDA6CisJCXJlY3QuY29sb3IgPSAweEZGMDBGRjAwOworCQlicmVhazsKKwljYXNl IDE6CisJCXJlY3QueCA9IDMxOworCQlyZWN0LnkgPSAzMTsKKwkJcmVjdC53ID0gMzE7CisJCXJl Y3QuaCA9IDMxOworCQlyZWN0LmNvbG9yID0gMHhGRkZGMDAwMDsKKwkJYnJlYWs7CisJY2FzZSAy OgorCQlyZWN0LnggPSAxNjsKKwkJcmVjdC55ID0gMTY7CisJCXJlY3QudyA9IDMyOworCQlyZWN0 LmggPSAzMjsKKwkJcmVjdC5jb2xvciA9IDB4RkZGRjAwRkY7CisJCWJyZWFrOworCWNhc2UgMzoK KwkJcmVjdC5jb2xvciA9IDB4RkYwMEZGRkY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlndF9h c3NlcnQoZmFsc2UpOworCX0KKworCXJldHVybiByZWN0OworfQorCitzdGF0aWMgc3RydWN0IHJl Y3QgcGF0M19nZXRfcmVjdChzdHJ1Y3QgZmJfcmVnaW9uICpmYiwgaW50IHIpCit7CisJc3RydWN0 IHJlY3QgcmVjdDsKKworCXJlY3QudyA9IDY0OworCXJlY3QuaCA9IDY0OworCXJlY3QuY29sb3Ig PSAweEZGMDBGRjAwOworCisJc3dpdGNoIChyKSB7CisJY2FzZSAwOgorCQlyZWN0LnggPSAwOwor CQlyZWN0LnkgPSAwOworCQlicmVhazsKKwljYXNlIDE6CisJCXJlY3QueCA9IDY0OworCQlyZWN0 LnkgPSA2NDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlyZWN0LnggPSAxOworCQlyZWN0LnkgPSAx OworCQlicmVhazsKKwljYXNlIDM6CisJCXJlY3QueCA9IGZiLT53IC0gNjQ7CisJCXJlY3QueSA9 IGZiLT5oIC0gNjQ7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJcmVjdC54ID0gZmItPncgLyAyIC0g MzI7CisJCXJlY3QueSA9IGZiLT5oIC8gMiAtIDMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlp Z3RfYXNzZXJ0KGZhbHNlKTsKKwl9CisKKwlyZXR1cm4gcmVjdDsKK30KKworc3RhdGljIHN0cnVj dCByZWN0IHBhdDRfZ2V0X3JlY3Qoc3RydWN0IGZiX3JlZ2lvbiAqZmIsIGludCByKQoreworCXN0 cnVjdCByZWN0IHJlY3Q7CisKKwlpZ3RfYXNzZXJ0KHIgPT0gMCk7CisKKwlyZWN0LnggPSAwOwor CXJlY3QueSA9IDA7CisJcmVjdC53ID0gZmItPnc7CisJcmVjdC5oID0gZmItPmg7CisJcmVjdC5j b2xvciA9IDB4RkYwMEZGMDA7CisKKwlyZXR1cm4gcmVjdDsKK30KKworc3RhdGljIHZvaWQgZHJh d19yZWN0KHN0cnVjdCBkcmF3X3BhdHRlcm5faW5mbyAqcGF0dGVybiwgc3RydWN0IGZiX3JlZ2lv biAqZmIsCisJCSAgICAgIGVudW0gaWd0X2RyYXdfbWV0aG9kIG1ldGhvZCwgaW50IHIpCit7CisJ c3RydWN0IHJlY3QgcmVjdCA9IHBhdHRlcm4tPmdldF9yZWN0KGZiLCByKTsKKworCWlndF9kcmF3 X3JlY3RfZmIoZHJtLmZkLCBkcm0uYnVmbWdyLCBOVUxMLCBmYi0+ZmIsIG1ldGhvZCwKKwkJCSBm Yi0+eCArIHJlY3QueCwgZmItPnkgKyByZWN0LnksCisJCQkgcmVjdC53LCByZWN0LmgsIHJlY3Qu Y29sb3IpOworfQorCitzdGF0aWMgdm9pZCBkcmF3X3JlY3RfaWd0X2ZiKHN0cnVjdCBkcmF3X3Bh dHRlcm5faW5mbyAqcGF0dGVybiwKKwkJCSAgICAgc3RydWN0IGlndF9mYiAqZmIsIGVudW0gaWd0 X2RyYXdfbWV0aG9kIG1ldGhvZCwKKwkJCSAgICAgaW50IHIpCit7CisJc3RydWN0IGZiX3JlZ2lv biByZWdpb24gPSB7CisJCS5mYiA9IGZiLAorCQkueCA9IDAsCisJCS55ID0gMCwKKwkJLncgPSBm Yi0+d2lkdGgsCisJCS5oID0gZmItPmhlaWdodCwKKwl9OworCisJZHJhd19yZWN0KHBhdHRlcm4s ICZyZWdpb24sIG1ldGhvZCwgcik7Cit9CisKK3N0YXRpYyB2b2lkIHVuc2V0X2FsbF9jcnRjcyh2 b2lkKQoreworCWludCBpLCByYzsKKworCWZvciAoaSA9IDA7IGkgPCBkcm0ucmVzLT5jb3VudF9j cnRjczsgaSsrKSB7CisJCXJjID0gZHJtTW9kZVNldENydGMoZHJtLmZkLCBkcm0ucmVzLT5jcnRj c1tpXSwgLTEsIDAsIDAsIE5VTEwsCisJCQkJICAgIDAsIE5VTEwpOworCQlpZ3RfYXNzZXJ0KHJj ID09IDApOworCisJCXJjID0gZHJtTW9kZVNldEN1cnNvcihkcm0uZmQsIGRybS5yZXMtPmNydGNz W2ldLCAwLCAwLCAwKTsKKwkJaWd0X2Fzc2VydChyYyA9PSAwKTsKKwl9CisKKwlmb3IgKGkgPSAw OyBpIDwgZHJtLnBsYW5lcy0+Y291bnRfcGxhbmVzOyBpKyspIHsKKwkJcmMgPSBkcm1Nb2RlU2V0 UGxhbmUoZHJtLmZkLCBkcm0ucGxhbmVzLT5wbGFuZXNbaV0sIDAsIDAsIDAsIDAsCisJCQkJICAg ICAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKwkJaWd0X2Fzc2VydChyYyA9PSAwKTsKKwl9Cit9CisK K3N0YXRpYyB2b2lkIGRpc2FibGVfZmVhdHVyZXModm9pZCkKK3sKKwlmYmNfZGlzYWJsZSgpOwor CXBzcl9kaXNhYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2NyYyhjb25zdCBjaGFyICpz dHIsIHN0cnVjdCBib3RoX2NyY3MgKmNyYykKK3sKKwlpbnQgaTsKKwljaGFyICpwaXBlX3N0cjsK KworCXBpcGVfc3RyID0gaWd0X2NyY190b19zdHJpbmcoJmNyYy0+cGlwZSk7CisKKwlpZ3RfZGVi dWcoIiVzIHBpcGU6WyVzXSBzaW5rOlsiLCBzdHIsIHBpcGVfc3RyKTsKKwlmb3IgKGkgPSAwOyBp IDwgU0lOS19DUkNfU0laRTsgaSsrKQorCQlpZ3RfZGVidWcoIiVjIiwgY3JjLT5zaW5rLmRhdGFb aV0pOworCWlndF9kZWJ1ZygiXVxuIik7CisKKwlmcmVlKHBpcGVfc3RyKTsKK30KKworc3RhdGlj IHZvaWQgY29sbGVjdF9jcmNzKHN0cnVjdCBib3RoX2NyY3MgKmNyY3MpCit7CisJZHJtTW9kZUNv bm5lY3RvclB0ciBjOworCisJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKHBpcGVfY3JjLCAmY3Jj cy0+cGlwZSk7CisKKwljID0gZ2V0X2Nvbm5lY3RvcihwcmltX21vZGVfcGFyYW1zLmNvbm5lY3Rv cl9pZCk7CisJaWYgKGMtPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFAp CisJCWdldF9zaW5rX2NyYygmY3Jjcy0+c2luayk7CisJZWxzZQorCQltZW1jcHkoJmNyY3MtPnNp bmssICJ1bnN1cHBvcnRlZCEiLCBTSU5LX0NSQ19TSVpFKTsKK30KKworc3RhdGljIHZvaWQgaW5p dF9ibHVlX2NyYyh2b2lkKQoreworCXN0cnVjdCBpZ3RfZmIgYmx1ZTsKKwlpbnQgcmM7CisKKwlk aXNhYmxlX2ZlYXR1cmVzKCk7CisJdW5zZXRfYWxsX2NydGNzKCk7CisKKwlpZ3RfY3JlYXRlX2Zi KGRybS5mZCwgcHJpbV9tb2RlX3BhcmFtcy5tb2RlLT5oZGlzcGxheSwKKwkJICAgICAgcHJpbV9t b2RlX3BhcmFtcy5tb2RlLT52ZGlzcGxheSwgRFJNX0ZPUk1BVF9YUkdCODg4OCwKKwkJICAgICAg TE9DQUxfSTkxNV9GT1JNQVRfTU9EX1hfVElMRUQsICZibHVlKTsKKworCWlndF9kcmF3X2ZpbGxf ZmIoZHJtLmZkLCAmYmx1ZSwgMHhGRik7CisKKwlyYyA9IGRybU1vZGVTZXRDcnRjKGRybS5mZCwg cHJpbV9tb2RlX3BhcmFtcy5jcnRjX2lkLAorCQkJICAgIGJsdWUuZmJfaWQsIDAsIDAsICZwcmlt X21vZGVfcGFyYW1zLmNvbm5lY3Rvcl9pZCwgMSwKKwkJCSAgICBwcmltX21vZGVfcGFyYW1zLm1v ZGUpOworCWlndF9hc3NlcnQocmMgPT0gMCk7CisJY29sbGVjdF9jcmNzKCZibHVlX2NyYyk7CisK KwlwcmludF9jcmMoIkJsdWUgQ1JDOiAgIiwgJmJsdWVfY3JjKTsKKworCWlndF9yZW1vdmVfZmIo ZHJtLmZkLCAmYmx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfY3JjcyhzdHJ1Y3QgZHJhd19w YXR0ZXJuX2luZm8gKnBhdHRlcm4pCit7CisJaW50IHIsIHJfLCByYzsKKwlzdHJ1Y3QgaWd0X2Zi IHRtcF9mYnNbcGF0dGVybi0+bl9yZWN0c107CisKKwlpZiAocGF0dGVybi0+aW5pdGlhbGl6ZWQp CisJCXJldHVybjsKKworCXBhdHRlcm4tPmNyY3MgPSBjYWxsb2MocGF0dGVybi0+bl9yZWN0cywg c2l6ZW9mKCoocGF0dGVybi0+Y3JjcykpKTsKKworCWZvciAociA9IDA7IHIgPCBwYXR0ZXJuLT5u X3JlY3RzOyByKyspCisJCWlndF9jcmVhdGVfZmIoZHJtLmZkLCBwcmltX21vZGVfcGFyYW1zLm1v ZGUtPmhkaXNwbGF5LAorCQkJICAgICAgcHJpbV9tb2RlX3BhcmFtcy5tb2RlLT52ZGlzcGxheSwK KwkJCSAgICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCisJCQkgICAgICBMT0NBTF9JOTE1X0ZPUk1B VF9NT0RfWF9USUxFRCwgJnRtcF9mYnNbcl0pOworCisJZm9yIChyID0gMDsgciA8IHBhdHRlcm4t Pm5fcmVjdHM7IHIrKykKKwkJaWd0X2RyYXdfZmlsbF9mYihkcm0uZmQsICZ0bXBfZmJzW3JdLCAw eEZGKTsKKworCWlmIChwYXR0ZXJuLT5mcmFtZXNfc3RhY2spIHsKKwkJZm9yIChyID0gMDsgciA8 IHBhdHRlcm4tPm5fcmVjdHM7IHIrKykKKwkJCWZvciAocl8gPSAwOyByXyA8PSByOyByXysrKQor CQkJCWRyYXdfcmVjdF9pZ3RfZmIocGF0dGVybiwgJnRtcF9mYnNbcl0sCisJCQkJCQkgSUdUX0RS QVdfUFdSSVRFLCByXyk7CisJfSBlbHNlIHsKKwkJZm9yIChyID0gMDsgciA8IHBhdHRlcm4tPm5f cmVjdHM7IHIrKykKKwkJCWRyYXdfcmVjdF9pZ3RfZmIocGF0dGVybiwgJnRtcF9mYnNbcl0sIElH VF9EUkFXX1BXUklURSwKKwkJCQkJIHIpOworCX0KKworCWZvciAociA9IDA7IHIgPCBwYXR0ZXJu LT5uX3JlY3RzOyByKyspIHsKKwkJcmMgPSBkcm1Nb2RlU2V0Q3J0Yyhkcm0uZmQsIHByaW1fbW9k ZV9wYXJhbXMuY3J0Y19pZCwKKwkJCQkgICB0bXBfZmJzW3JdLmZiX2lkLCAwLCAwLAorCQkJCSAg ICZwcmltX21vZGVfcGFyYW1zLmNvbm5lY3Rvcl9pZCwgMSwKKwkJCQkgICBwcmltX21vZGVfcGFy YW1zLm1vZGUpOworCQlpZ3RfYXNzZXJ0KHJjID09IDApOworCQljb2xsZWN0X2NyY3MoJnBhdHRl cm4tPmNyY3Nbcl0pOworCX0KKworCWZvciAociA9IDA7IHIgPCBwYXR0ZXJuLT5uX3JlY3RzOyBy KyspIHsKKwkJaWd0X2RlYnVnKCJSZWN0ICVkIENSQzoiLCByKTsKKwkJcHJpbnRfY3JjKCIiLCAm cGF0dGVybi0+Y3Jjc1tyXSk7CisJfQorCisJdW5zZXRfYWxsX2NydGNzKCk7CisKKwlmb3IgKHIg PSAwOyByIDwgcGF0dGVybi0+bl9yZWN0czsgcisrKQorCQlpZ3RfcmVtb3ZlX2ZiKGRybS5mZCwg JnRtcF9mYnNbcl0pOworCisJcGF0dGVybi0+aW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCitzdGF0 aWMgdm9pZCBzZXR1cF9kcm0odm9pZCkKK3sKKwlpbnQgaTsKKworCWRybS5mZCA9IGRybV9vcGVu X2FueV9tYXN0ZXIoKTsKKworCWRybS5yZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRybS5mZCk7 CisJaWd0X2Fzc2VydChkcm0ucmVzLT5jb3VudF9jb25uZWN0b3JzIDw9IE1BWF9DT05ORUNUT1JT KTsKKworCWZvciAoaSA9IDA7IGkgPCBkcm0ucmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspCisJ CWRybS5jb25uZWN0b3JzW2ldID0gZHJtTW9kZUdldENvbm5lY3Rvcihkcm0uZmQsCisJCQkJCQlk cm0ucmVzLT5jb25uZWN0b3JzW2ldKTsKKworCWRybS5wbGFuZXMgPSBkcm1Nb2RlR2V0UGxhbmVS ZXNvdXJjZXMoZHJtLmZkKTsKKworCWRybS5idWZtZ3IgPSBkcm1faW50ZWxfYnVmbWdyX2dlbV9p bml0KGRybS5mZCwgNDA5Nik7CisJaWd0X2Fzc2VydChkcm0uYnVmbWdyKTsKKwlkcm1faW50ZWxf YnVmbWdyX2dlbV9lbmFibGVfcmV1c2UoZHJtLmJ1Zm1ncik7Cit9CisKK3N0YXRpYyB2b2lkIHRl YXJkb3duX2RybSh2b2lkKQoreworCWludCBpOworCisJZHJtX2ludGVsX2J1Zm1ncl9kZXN0cm95 KGRybS5idWZtZ3IpOworCisJZHJtTW9kZUZyZWVQbGFuZVJlc291cmNlcyhkcm0ucGxhbmVzKTsK KworCWZvciAoaSA9IDA7IGkgPCBkcm0ucmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspCisJCWRy bU1vZGVGcmVlQ29ubmVjdG9yKGRybS5jb25uZWN0b3JzW2ldKTsKKworCWRybU1vZGVGcmVlUmVz b3VyY2VzKGRybS5yZXMpOworCWNsb3NlKGRybS5mZCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVw X21vZGVzZXQodm9pZCkKK3sKKwlpZ3RfcmVxdWlyZShpbml0X21vZGVzZXRfY2FjaGVkX3BhcmFt cygpKTsKKwlvZmZzY3JlZW5fZmIuZmIgPSBOVUxMOworCW9mZnNjcmVlbl9mYi53ID0gMTAyNDsK KwlvZmZzY3JlZW5fZmIuaCA9IDEwMjQ7CisJY3JlYXRlX2ZicygpOworCWttc3Rlc3Rfc2V0X3Z0 X2dyYXBoaWNzX21vZGUoKTsKK30KKworc3RhdGljIHZvaWQgdGVhcmRvd25fbW9kZXNldCh2b2lk KQoreworCWlmIChzY25kX21vZGVfcGFyYW1zLmNvbm5lY3Rvcl9pZCkgeworCQlpZ3RfcmVtb3Zl X2ZiKGRybS5mZCwgJmZicy5zY25kX3ByaSk7CisJCWlndF9yZW1vdmVfZmIoZHJtLmZkLCAmZmJz LnNjbmRfY3VyKTsKKwkJaWd0X3JlbW92ZV9mYihkcm0uZmQsICZmYnMuc2NuZF9zcHIpOworCX0K KwlpZ3RfcmVtb3ZlX2ZiKGRybS5mZCwgJmZicy5wcmltX3ByaSk7CisJaWd0X3JlbW92ZV9mYihk cm0uZmQsICZmYnMucHJpbV9jdXIpOworCWlndF9yZW1vdmVfZmIoZHJtLmZkLCAmZmJzLnByaW1f c3ByKTsKKwlpZ3RfcmVtb3ZlX2ZiKGRybS5mZCwgJmZicy5vZmZzY3JlZW4pOworCWlndF9yZW1v dmVfZmIoZHJtLmZkLCAmZmJzLmJpZyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2NyY3Modm9p ZCkKK3sKKwlwaXBlX2NyYyA9IGlndF9waXBlX2NyY19uZXcoMCwgSU5URUxfUElQRV9DUkNfU09V UkNFX0FVVE8pOworCisJc2lua19jcmMuZmQgPSBpZ3RfZGVidWdmc19vcGVuKCJpOTE1X3Npbmtf Y3JjX2VEUDEiLCBPX1JET05MWSk7CisJaWd0X2Fzc2VydChzaW5rX2NyYy5mZCA+PSAwKTsKKwor CWluaXRfYmx1ZV9jcmMoKTsKKworCXBhdHRlcm4xLmluaXRpYWxpemVkID0gZmFsc2U7CisJcGF0 dGVybjEuZnJhbWVzX3N0YWNrID0gdHJ1ZTsKKwlwYXR0ZXJuMS5uX3JlY3RzID0gNDsKKwlwYXR0 ZXJuMS5jcmNzID0gTlVMTDsKKwlwYXR0ZXJuMS5nZXRfcmVjdCA9IHBhdDFfZ2V0X3JlY3Q7CisK KwlwYXR0ZXJuMi5pbml0aWFsaXplZCA9IGZhbHNlOworCXBhdHRlcm4yLmZyYW1lc19zdGFjayA9 IHRydWU7CisJcGF0dGVybjIubl9yZWN0cyA9IDQ7CisJcGF0dGVybjIuY3JjcyA9IE5VTEw7CisJ cGF0dGVybjIuZ2V0X3JlY3QgPSBwYXQyX2dldF9yZWN0OworCisJcGF0dGVybjMuaW5pdGlhbGl6 ZWQgPSBmYWxzZTsKKwlwYXR0ZXJuMy5mcmFtZXNfc3RhY2sgPSBmYWxzZTsKKwlwYXR0ZXJuMy5u X3JlY3RzID0gNTsKKwlwYXR0ZXJuMy5jcmNzID0gTlVMTDsKKwlwYXR0ZXJuMy5nZXRfcmVjdCA9 IHBhdDNfZ2V0X3JlY3Q7CisKKwlwYXR0ZXJuNC5pbml0aWFsaXplZCA9IGZhbHNlOworCXBhdHRl cm40LmZyYW1lc19zdGFjayA9IGZhbHNlOworCXBhdHRlcm40Lm5fcmVjdHMgPSAxOworCXBhdHRl cm40LmNyY3MgPSBOVUxMOworCXBhdHRlcm40LmdldF9yZWN0ID0gcGF0NF9nZXRfcmVjdDsKK30K Kworc3RhdGljIHZvaWQgdGVhcmRvd25fY3Jjcyh2b2lkKQoreworCWlmIChwYXR0ZXJuMS5jcmNz KQorCQlmcmVlKHBhdHRlcm4xLmNyY3MpOworCWlmIChwYXR0ZXJuMi5jcmNzKQorCQlmcmVlKHBh dHRlcm4yLmNyY3MpOworCWlmIChwYXR0ZXJuMy5jcmNzKQorCQlmcmVlKHBhdHRlcm4zLmNyY3Mp OworCWlmIChwYXR0ZXJuNC5jcmNzKQorCQlmcmVlKHBhdHRlcm40LmNyY3MpOworCisJY2xvc2Uo c2lua19jcmMuZmQpOworCisJaWd0X3BpcGVfY3JjX2ZyZWUocGlwZV9jcmMpOworfQorCitzdGF0 aWMgYm9vbCBmYmNfc3VwcG9ydGVkX29uX2NoaXBzZXQodm9pZCkKK3sKKwljaGFyIGJ1ZltERUJV R0ZTX01TR19TSVpFXTsKKworCWdldF9kZWJ1Z2ZzX3N0cmluZyhmYmMuZmQsIGJ1Zik7CisKKwly ZXR1cm4gIXN0cnN0cihidWYsICJGQkMgdW5zdXBwb3J0ZWQgb24gdGhpcyBjaGlwc2V0XG4iKTsK K30KKworc3RhdGljIHZvaWQgc2V0dXBfZmJjKHZvaWQpCit7CisJZmJjLmZkID0gaWd0X2RlYnVn ZnNfb3BlbigiaTkxNV9mYmNfc3RhdHVzIiwgT19SRE9OTFkpOworCWlndF9hc3NlcnQoZmJjLmZk ID49IDApOworCisJaWYgKCFmYmNfc3VwcG9ydGVkX29uX2NoaXBzZXQoKSkgeworCQlpZ3RfaW5m bygiQ2FuJ3QgdGVzdCBGQkM6IG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBjaGlwc2V0XG4iKTsKKwkJ cmV0dXJuOworCX0KKwlmYmMuY2FuX3Rlc3QgPSB0cnVlOworCisJZmJjX3NldHVwX2xhc3RfYWN0 aW9uKCk7CisJZmJjX3NldHVwX2NvbXByZXNzaW5nKCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlYXJk b3duX2ZiYyh2b2lkKQoreworCWlmIChmYmMuZmQgIT0gLTEpCisJCWNsb3NlKGZiYy5mZCk7Cit9 CisKK3N0YXRpYyBib29sIHBzcl9zaW5rX2hhc19zdXBwb3J0KHZvaWQpCit7CisJY2hhciBidWZb REVCVUdGU19NU0dfU0laRV07CisKKwlnZXRfZGVidWdmc19zdHJpbmcocHNyLmZkLCBidWYpOwor CisJcmV0dXJuIHN0cnN0cihidWYsICJTaW5rX1N1cHBvcnQ6IHllc1xuIik7Cit9CisKK3N0YXRp YyB2b2lkIHNldHVwX3Bzcih2b2lkKQoreworCWlmIChnZXRfY29ubmVjdG9yKHByaW1fbW9kZV9w YXJhbXMuY29ubmVjdG9yX2lkKS0+Y29ubmVjdG9yX3R5cGUgIT0KKwkgICAgRFJNX01PREVfQ09O TkVDVE9SX2VEUCkgeworCQlpZ3RfaW5mbygiQ2FuJ3QgdGVzdCBQU1I6IG5vIHVzYWJsZSBlRFAg c2NyZWVuLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlwc3IuZmQgPSBpZ3RfZGVidWdmc19vcGVu KCJpOTE1X2VkcF9wc3Jfc3RhdHVzIiwgT19SRE9OTFkpOworCWlndF9hc3NlcnQocHNyLmZkID49 IDApOworCisJaWYgKCFwc3Jfc2lua19oYXNfc3VwcG9ydCgpKSB7CisJCWlndF9pbmZvKCJDYW4n dCB0ZXN0IFBTUjogbm90IHN1cHBvcnRlZCBieSBzaW5rLlxuIik7CisJCXJldHVybjsKKwl9CisJ cHNyLmNhbl90ZXN0ID0gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgdGVhcmRvd25fcHNyKHZvaWQp Cit7CisJaWYgKHBzci5mZCAhPSAtMSkKKwkJY2xvc2UocHNyLmZkKTsKK30KKworc3RhdGljIHZv aWQgc2V0dXBfZW52aXJvbm1lbnQodm9pZCkKK3sKKwlzZXR1cF9kcm0oKTsKKwlzZXR1cF9tb2Rl c2V0KCk7CisKKwlzZXR1cF9mYmMoKTsKKwlzZXR1cF9wc3IoKTsKKworCXNldHVwX2NyY3MoKTsK K30KKworc3RhdGljIHZvaWQgdGVhcmRvd25fZW52aXJvbm1lbnQodm9pZCkKK3sKKwl0ZWFyZG93 bl9jcmNzKCk7CisJdGVhcmRvd25fcHNyKCk7CisJdGVhcmRvd25fZmJjKCk7CisJdGVhcmRvd25f bW9kZXNldCgpOworCXRlYXJkb3duX2RybSgpOworfQorCitzdGF0aWMgdm9pZCB3YWl0X3VzZXIo dm9pZCkKK3sKKwlpZ3RfaW5mbygiUHJlc3MgZW50ZXIuLi5cbiIpOworCXdoaWxlIChnZXRjaGFy KCkgIT0gJ1xuJykKKwkJOworfQorCitzdGF0aWMgc3RydWN0IG1vZGVzZXRfcGFyYW1zICpwaWNr X3BhcmFtcyhjb25zdCBzdHJ1Y3QgdGVzdF9tb2RlICp0KQoreworCXN3aXRjaCAodC0+c2NyZWVu KSB7CisJY2FzZSBTQ1JFRU5fUFJJTToKKwkJcmV0dXJuICZwcmltX21vZGVfcGFyYW1zOworCWNh c2UgU0NSRUVOX1NDTkQ6CisJCXJldHVybiAmc2NuZF9tb2RlX3BhcmFtczsKKwljYXNlIFNDUkVF Tl9PRkZTQ1JFRU46CisJCXJldHVybiBOVUxMOworCWRlZmF1bHQ6CisJCWlndF9hc3NlcnQoZmFs c2UpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBmYl9yZWdpb24gKnBpY2tfdGFyZ2V0KGNvbnN0 IHN0cnVjdCB0ZXN0X21vZGUgKnQsCisJCQkJICAgICBzdHJ1Y3QgbW9kZXNldF9wYXJhbXMgKnBh cmFtcykKK3sKKwlpZiAoIXBhcmFtcykKKwkJcmV0dXJuICZvZmZzY3JlZW5fZmI7CisKKwlzd2l0 Y2ggKHQtPnBsYW5lKSB7CisJY2FzZSBQTEFORV9QUkk6CisJCXJldHVybiAmcGFyYW1zLT5mYjsK KwljYXNlIFBMQU5FX0NVUjoKKwkJcmV0dXJuICZwYXJhbXMtPmN1cnNvcjsKKwljYXNlIFBMQU5F X1NQUjoKKwkJcmV0dXJuICZwYXJhbXMtPnNwcml0ZTsKKwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0 KGZhbHNlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRvX2ZsdXNoKGNvbnN0IHN0cnVjdCB0ZXN0 X21vZGUgKnQpCit7CisJc3RydWN0IG1vZGVzZXRfcGFyYW1zICpwYXJhbXMgPSBwaWNrX3BhcmFt cyh0KTsKKwlzdHJ1Y3QgZmJfcmVnaW9uICp0YXJnZXQgPSBwaWNrX3RhcmdldCh0LCBwYXJhbXMp OworCisJZ2VtX3NldF9kb21haW4oZHJtLmZkLCB0YXJnZXQtPmZiLT5nZW1faGFuZGxlLCBJOTE1 X0dFTV9ET01BSU5fR1RULCAwKTsKK30KKworI2RlZmluZSBET05UX0FTU0VSVF9DUkMJCQkoMSA8 PCAwKQorCisjZGVmaW5lIEZCQ19BU1NFUlRfRkxBR1MJCSgweEYgPDwgMSkKKyNkZWZpbmUgQVNT RVJUX0ZCQ19FTkFCTEVECQkoMSA8PCAxKQorI2RlZmluZSBBU1NFUlRfRkJDX0RJU0FCTEVECQko MSA8PCAyKQorI2RlZmluZSBBU1NFUlRfTEFTVF9BQ1RJT05fQ0hBTkdFRAkoMSA8PCAzKQorI2Rl ZmluZSBBU1NFUlRfTk9fQUNUSU9OX0NIQU5HRQkJKDEgPDwgNCkKKworI2RlZmluZSBQU1JfQVNT RVJUX0ZMQUdTCQkoMyA8PCA1KQorI2RlZmluZSBBU1NFUlRfUFNSX0VOQUJMRUQJCSgxIDw8IDUp CisjZGVmaW5lIEFTU0VSVF9QU1JfRElTQUJMRUQJCSgxIDw8IDYpCisKK3N0YXRpYyBpbnQgYWRq dXN0X2Fzc2VydGlvbl9mbGFncyhjb25zdCBzdHJ1Y3QgdGVzdF9tb2RlICp0LCBpbnQgZmxhZ3Mp Cit7CisJaWYgKCEoZmxhZ3MgJiBBU1NFUlRfRkJDX0RJU0FCTEVEKSkKKwkJZmxhZ3MgfD0gQVNT RVJUX0ZCQ19FTkFCTEVEOworCWlmICghKGZsYWdzICYgQVNTRVJUX1BTUl9ESVNBQkxFRCkpCisJ CWZsYWdzIHw9IEFTU0VSVF9QU1JfRU5BQkxFRDsKKworCWlmICgodC0+ZmVhdHVyZSAmIEZFQVRV UkVfRkJDKSA9PSAwKQorCQlmbGFncyAmPSB+RkJDX0FTU0VSVF9GTEFHUzsKKwlpZiAoKHQtPmZl YXR1cmUgJiBGRUFUVVJFX1BTUikgPT0gMCkKKwkJZmxhZ3MgJj0gflBTUl9BU1NFUlRfRkxBR1M7 CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKKyNkZWZpbmUgZG9fY3JjX2Fzc2VydGlvbnMoZmxhZ3Mp IGRvIHsJCQkJCVwKKwlpbnQgZmxhZ3NfXyA9IChmbGFncyk7CQkJCQkJXAorCXN0cnVjdCBib3Ro X2NyY3MgY3JjXzsJCQkJCQlcCisJCQkJCQkJCQlcCisJaWYgKCFvcHQuY2hlY2tfY3JjIHx8IChm bGFnc19fICYgRE9OVF9BU1NFUlRfQ1JDKSkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwkJCQkJCQkJ CVwKKwljb2xsZWN0X2NyY3MoJmNyY18pOwkJCQkJCVwKKwlwcmludF9jcmMoIkNhbGN1bGF0ZWQg Q1JDOiIsICZjcmNfKTsJCQkJXAorCQkJCQkJCQkJXAorCWlndF9hc3NlcnQod2FudGVkX2NyYyk7 CQkJCQkJXAorCWlndF9hc3NlcnRfY3JjX2VxdWFsKCZjcmNfLnBpcGUsICZ3YW50ZWRfY3JjLT5w aXBlKTsJCVwKKwlhc3NlcnRfc2lua19jcmNfZXF1YWwoJmNyY18uc2luaywgJndhbnRlZF9jcmMt PnNpbmspOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBkb19hc3NlcnRpb25zKGZsYWdzKSBk byB7CQkJCQlcCisJaW50IGZsYWdzXyA9IGFkanVzdF9hc3NlcnRpb25fZmxhZ3ModCwgKGZsYWdz KSk7CQlcCisJCQkJCQkJCQlcCisJaWYgKG9wdC5zdGVwID4gMSkJCQkJCQlcCisJCXdhaXRfdXNl cigpOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwkvKiBDaGVjayB0aGUgQ1JDIHRvIG1ha2Ugc3VyZSB0 aGUgZHJhd2luZyBvcGVyYXRpb25zIHdvcmsJXAorCSAqIGltbWVkaWF0ZWx5LCBpbmRlcGVuZGVu dGx5IG9mIHRoZSBmZWF0dXJlcyBiZWluZyBlbmFibGVkLiAqLwlcCisJZG9fY3JjX2Fzc2VydGlv bnMoZmxhZ3NfKTsJCQkJCVwKKwkJCQkJCQkJCVwKKwkvKiBOb3cgd2UgY2FuIGZsdXNoIHRoaW5n cyB0byBtYWtlIHRoZSB0ZXN0IGZhc3Rlci4gKi8JCVwKKwlkb19mbHVzaCh0KTsJCQkJCQkJXAor CQkJCQkJCQkJXAorCWlmIChvcHQuY2hlY2tfc3RhdHVzKSB7CQkJCQkJXAorCQlpZiAoZmxhZ3Nf ICYgQVNTRVJUX0ZCQ19FTkFCTEVEKSB7CQkJXAorCQkJaWd0X2Fzc2VydChmYmNfd2FpdF9mb3Jf c3RhdHVzKEVOQUJMRUQpKTsJXAorCQkJCQkJCQkJXAorCQkJaWYgKGZiYy5zdXBwb3J0c19jb21w cmVzc2luZyAmJiAJCVwKKwkJCSAgICBvcHQuZmJjX2NoZWNrX2NvbXByZXNzaW9uKQkJCVwKKwkJ CQlpZ3RfYXNzZXJ0KGZiY193YWl0X2Zvcl9jb21wcmVzc2lvbigpKTsJXAorCQl9IGVsc2UgaWYg KGZsYWdzXyAmIEFTU0VSVF9GQkNfRElTQUJMRUQpIHsJCVwKKwkJCWlndF9hc3NlcnQoZmJjX3dh aXRfZm9yX3N0YXR1cyhESVNBQkxFRCkpOwlcCisJCX0JCQkJCQkJXAorCQkJCQkJCQkJXAorCQlp ZiAoZmxhZ3NfICYgQVNTRVJUX1BTUl9FTkFCTEVEKQkJCVwKKwkJCWlndF9hc3NlcnQocHNyX3dh aXRfZm9yX3N0YXR1cyhFTkFCTEVEKSk7CVwKKwkJZWxzZSBpZiAoZmxhZ3NfICYgQVNTRVJUX1BT Ul9ESVNBQkxFRCkJCQlcCisJCQlpZ3RfYXNzZXJ0KHBzcl93YWl0X2Zvcl9zdGF0dXMoRElTQUJM RUQpKTsJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJLyogTWFrZSBzdXJlIHdlIHNldHRsZSBiZWZv cmUgY29udGludWluZy4gKi8JCVwKKwkJc2xlZXAoMSk7CQkJCQkJXAorCX0JCQkJCQkJCVwKKwkJ CQkJCQkJCVwKKwkvKiBDaGVjayBDUkMgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZSBjb21wcmVzc2Vk IHNjcmVlbiBpcyBvaywJXAorCSAqIGV4Y2VwdCBpZiB3ZSdyZSBub3QgZHJhd2luZyBvbiB0aGUg cHJpbWFyeSBzY3JlZW4uIE9uIHRoaXMJXAorCSAqIGNhc2UsIHRoZSBmaXJzdCBjaGVjayBzaG91 bGQgYmUgZW5vdWdoIGFuZCBhIG5ldyBDUkMgY2hlY2sJXAorCSAqIHdvdWxkIG9ubHkgZGVsYXkg dGhlIHRlc3Qgc3VpdGUgd2hpbGUgYWRkaW5nIGFueXJlYWwgdmFsdWUJXAorCSAqIHRvIHRoZSB0 ZXN0IHN1aXRlLiAqLwkJCQkJXAorCWlmICh0LT5zY3JlZW4gPT0gU0NSRUVOX1BSSU0pCQkJCQlc CisJCWRvX2NyY19hc3NlcnRpb25zKGZsYWdzXyk7CQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAoZmJj LnN1cHBvcnRzX2xhc3RfYWN0aW9uICYmIG9wdC5mYmNfY2hlY2tfbGFzdF9hY3Rpb24pIHsJXAor CQlpZiAoZmxhZ3NfICYgQVNTRVJUX0xBU1RfQUNUSU9OX0NIQU5HRUQpCQlcCisJCQlpZ3RfYXNz ZXJ0KGZiY19sYXN0X2FjdGlvbl9jaGFuZ2VkKCkpOwkJXAorCQllbHNlIGlmIChmbGFnc18gJiBB U1NFUlRfTk9fQUNUSU9OX0NIQU5HRSkJCVwKKwkJCWlndF9hc3NlcnQoIWZiY19sYXN0X2FjdGlv bl9jaGFuZ2VkKCkpOwkJXAorCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAob3B0LnN0ZXAp CQkJCQkJCVwKKwkJd2FpdF91c2VyKCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZv aWQgZmlsbF9mYl9yZWdpb24oc3RydWN0IGZiX3JlZ2lvbiAqcmVnaW9uLCB1aW50MzJfdCBjb2xv cikKK3sKKwlpZ3RfZHJhd19yZWN0X2ZiKGRybS5mZCwgTlVMTCwgTlVMTCwgcmVnaW9uLT5mYiwg SUdUX0RSQVdfTU1BUF9HVFQsCisJCQkgcmVnaW9uLT54LCByZWdpb24tPnksIHJlZ2lvbi0+dywg cmVnaW9uLT5oLAorCQkJIGNvbG9yKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3ByaW1fc2Ny ZWVuX2FuZF93YWl0KGNvbnN0IHN0cnVjdCB0ZXN0X21vZGUgKnQpCit7CisJZmlsbF9mYl9yZWdp b24oJnByaW1fbW9kZV9wYXJhbXMuZmIsIDB4RkYpOworCXNldF9tb2RlX2Zvcl9wYXJhbXMoJnBy aW1fbW9kZV9wYXJhbXMpOworCisJd2FudGVkX2NyYyA9ICZibHVlX2NyYzsKKwlmYmNfdXBkYXRl X2xhc3RfYWN0aW9uKCk7CisKKwlkb19hc3NlcnRpb25zKEFTU0VSVF9OT19BQ1RJT05fQ0hBTkdF KTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3NjbmRfc2NyZWVuX2FuZF93YWl0KGNvbnN0IHN0 cnVjdCB0ZXN0X21vZGUgKnQpCit7CisJZmlsbF9mYl9yZWdpb24oJnNjbmRfbW9kZV9wYXJhbXMu ZmIsIDB4ODApOworCXNldF9tb2RlX2Zvcl9wYXJhbXMoJnNjbmRfbW9kZV9wYXJhbXMpOworCisJ ZG9fYXNzZXJ0aW9ucyhBU1NFUlRfTk9fQUNUSU9OX0NIQU5HRSk7Cit9CisKK3N0YXRpYyB2b2lk IHNldF9jdXJzb3JfZm9yX3Rlc3QoY29uc3Qgc3RydWN0IHRlc3RfbW9kZSAqdCwKKwkJCQlzdHJ1 Y3QgbW9kZXNldF9wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQgcmM7CisKKwlmaWxsX2ZiX3JlZ2lv bigmcGFyYW1zLT5jdXJzb3IsIDB4RkYwMDAwRkYpOworCisJcmMgPSBkcm1Nb2RlTW92ZUN1cnNv cihkcm0uZmQsIHBhcmFtcy0+Y3J0Y19pZCwgMCwgMCk7CisJaWd0X2Fzc2VydChyYyA9PSAwKTsK KworCXJjID0gZHJtTW9kZVNldEN1cnNvcihkcm0uZmQsIHBhcmFtcy0+Y3J0Y19pZCwKKwkJCSAg ICAgIHBhcmFtcy0+Y3Vyc29yLmZiLT5nZW1faGFuZGxlLAorCQkJICAgICAgcGFyYW1zLT5jdXJz b3IudywKKwkJCSAgICAgIHBhcmFtcy0+Y3Vyc29yLmgpOworCWlndF9hc3NlcnQocmMgPT0gMCk7 CisKKwlkb19hc3NlcnRpb25zKEFTU0VSVF9OT19BQ1RJT05fQ0hBTkdFKTsKK30KKworc3RhdGlj IHZvaWQgc2V0X3Nwcml0ZV9mb3JfdGVzdChjb25zdCBzdHJ1Y3QgdGVzdF9tb2RlICp0LAorCQkJ CXN0cnVjdCBtb2Rlc2V0X3BhcmFtcyAqcGFyYW1zKQoreworCWludCByYzsKKworCWZpbGxfZmJf cmVnaW9uKCZwYXJhbXMtPnNwcml0ZSwgMHhGRjAwMDBGRik7CisKKwlyYyA9IGRybU1vZGVTZXRQ bGFuZShkcm0uZmQsIHBhcmFtcy0+c3ByaXRlX2lkLCBwYXJhbXMtPmNydGNfaWQsCisJCQkgICAg IHBhcmFtcy0+c3ByaXRlLmZiLT5mYl9pZCwgMCwgMCwgMCwKKwkJCSAgICAgcGFyYW1zLT5zcHJp dGUudywgcGFyYW1zLT5zcHJpdGUuaCwKKwkJCSAgICAgMCwgMCwgcGFyYW1zLT5zcHJpdGUudyA8 PCAxNiwKKwkJCSAgICAgcGFyYW1zLT5zcHJpdGUuaCA8PCAxNik7CisJaWd0X2Fzc2VydChyYyA9 PSAwKTsKKworCWRvX2Fzc2VydGlvbnMoQVNTRVJUX05PX0FDVElPTl9DSEFOR0UpOworfQorCitz dGF0aWMgdm9pZCBlbmFibGVfZmVhdHVyZXNfZm9yX3Rlc3QoY29uc3Qgc3RydWN0IHRlc3RfbW9k ZSAqdCkKK3sKKwlpZiAodC0+ZmVhdHVyZSAmIEZFQVRVUkVfRkJDKQorCQlmYmNfZW5hYmxlKCk7 CisJaWYgKHQtPmZlYXR1cmUgJiBGRUFUVVJFX1BTUikKKwkJcHNyX2VuYWJsZSgpOworfQorCitz dGF0aWMgdm9pZCBjaGVja190ZXN0X3JlcXVpcmVtZW50cyhjb25zdCBzdHJ1Y3QgdGVzdF9tb2Rl ICp0KQoreworCWlmICh0LT5waXBlcyA9PSBQSVBFX0RVQUwpCisJCWlndF9yZXF1aXJlX2Yoc2Nu ZF9tb2RlX3BhcmFtcy5jb25uZWN0b3JfaWQsCisJCQkgICAgIkNhbid0IHRlc3QgZHVhbCBwaXBl cyB3aXRoIHRoZSBjdXJyZW50IG91dHB1dHNcbiIpOworCisJaWYgKHQtPmZlYXR1cmUgJiBGRUFU VVJFX0ZCQykKKwkJaWd0X3JlcXVpcmVfZihmYmMuY2FuX3Rlc3QsCisJCQkgICAgICAiQ2FuJ3Qg dGVzdCBGQkMgd2l0aCB0aGlzIGNoaXBzZXRcbiIpOworCisJaWYgKHQtPmZlYXR1cmUgJiBGRUFU VVJFX1BTUikKKwkJaWd0X3JlcXVpcmVfZihwc3IuY2FuX3Rlc3QsCisJCQkgICAgICAiQ2FuJ3Qg dGVzdCBQU1Igd2l0aCB0aGUgY3VycmVudCBvdXRwdXRzXG4iKTsKKworCWlmIChvcHQub25seV9m ZWF0dXJlICE9IEZFQVRVUkVfQ09VTlQpCisJCWlndF9yZXF1aXJlKHQtPmZlYXR1cmUgPT0gb3B0 Lm9ubHlfZmVhdHVyZSk7CisKKwlpZiAob3B0Lm9ubHlfcGlwZXMgIT0gUElQRV9DT1VOVCkKKwkJ aWd0X3JlcXVpcmUodC0+cGlwZXMgPT0gb3B0Lm9ubHlfcGlwZXMpOworfQorCitzdGF0aWMgdm9p ZCBzZXRfY3J0Y19mYnMoY29uc3Qgc3RydWN0IHRlc3RfbW9kZSAqdCkKK3sKKwlzd2l0Y2ggKHQt PmZicykgeworCWNhc2UgRkJTX1NJTkdMRToKKwkJcHJpbV9tb2RlX3BhcmFtcy5mYi5mYiA9ICZm YnMucHJpbV9wcmk7CisJCXNjbmRfbW9kZV9wYXJhbXMuZmIuZmIgPSAmZmJzLnNjbmRfcHJpOwor CQlvZmZzY3JlZW5fZmIuZmIgPSAmZmJzLm9mZnNjcmVlbjsKKworCQlwcmltX21vZGVfcGFyYW1z LmZiLnggPSAwOworCQlzY25kX21vZGVfcGFyYW1zLmZiLnggPSAwOworCQlvZmZzY3JlZW5fZmIu eCA9IDA7CisKKwkJcHJpbV9tb2RlX3BhcmFtcy5mYi55ID0gMDsKKwkJc2NuZF9tb2RlX3BhcmFt cy5mYi55ID0gMDsKKwkJb2Zmc2NyZWVuX2ZiLnkgPSAwOworCQlicmVhazsKKwljYXNlIEZCU19N VUxUSToKKwkJLyogUGxlYXNlIHNlZSB0aGUgY29tbWVudCBhdCB0aGUgdG9wIG9mIGNyZWF0ZV9i aWdfZmIoKS4gKi8KKwkJcHJpbV9tb2RlX3BhcmFtcy5mYi5mYiA9ICZmYnMuYmlnOworCQlzY25k X21vZGVfcGFyYW1zLmZiLmZiID0gJmZicy5iaWc7CisJCW9mZnNjcmVlbl9mYi5mYiA9ICZmYnMu YmlnOworCisJCXByaW1fbW9kZV9wYXJhbXMuZmIueCA9IDUwMDsKKwkJc2NuZF9tb2RlX3BhcmFt cy5mYi54ID0gcHJpbV9tb2RlX3BhcmFtcy5mYi54ICsKKwkJCQkJcHJpbV9tb2RlX3BhcmFtcy5m Yi53OworCQlvZmZzY3JlZW5fZmIueCA9IHNjbmRfbW9kZV9wYXJhbXMuZmIueCArIHNjbmRfbW9k ZV9wYXJhbXMuZmIudzsKKworCQlwcmltX21vZGVfcGFyYW1zLmZiLnkgPSA1MDA7CisJCXNjbmRf bW9kZV9wYXJhbXMuZmIueSA9IDUwMDsKKwkJb2Zmc2NyZWVuX2ZiLnkgPSA1MDA7CisJCWJyZWFr OworCWRlZmF1bHQ6CisJCWlndF9hc3NlcnQoZmFsc2UpOworCX0KKworCXByaW1fbW9kZV9wYXJh bXMuY3Vyc29yLmZiID0gJmZicy5wcmltX2N1cjsKKwlwcmltX21vZGVfcGFyYW1zLnNwcml0ZS5m YiA9ICZmYnMucHJpbV9zcHI7CisJc2NuZF9tb2RlX3BhcmFtcy5jdXJzb3IuZmIgPSAmZmJzLnNj bmRfY3VyOworCXNjbmRfbW9kZV9wYXJhbXMuc3ByaXRlLmZiID0gJmZicy5zY25kX3NwcjsKK30K Kworc3RhdGljIHZvaWQgc2V0X3NjcmVlbnNfZm9yX3Rlc3QoY29uc3Qgc3RydWN0IHRlc3RfbW9k ZSAqdCwKKwkJCQkgc3RydWN0IGRyYXdfcGF0dGVybl9pbmZvICpwYXR0ZXJuKQoreworCWNoZWNr X3Rlc3RfcmVxdWlyZW1lbnRzKHQpOworCisJZGlzYWJsZV9mZWF0dXJlcygpOworCXNldF9jcnRj X2Zicyh0KTsKKworCWlmICh0LT5zY3JlZW4gPT0gU0NSRUVOX09GRlNDUkVFTikKKwkJZmlsbF9m Yl9yZWdpb24oJm9mZnNjcmVlbl9mYiwgMHg4MCk7CisKKwl1bnNldF9hbGxfY3J0Y3MoKTsKKwlp bml0X2NyY3MocGF0dGVybik7CisJZW5hYmxlX2ZlYXR1cmVzX2Zvcl90ZXN0KHQpOworCisJZW5h YmxlX3ByaW1fc2NyZWVuX2FuZF93YWl0KHQpOworCWlmICh0LT5zY3JlZW4gPT0gU0NSRUVOX1BS SU0pIHsKKwkJaWYgKHQtPnBsYW5lID09IFBMQU5FX0NVUikKKwkJCXNldF9jdXJzb3JfZm9yX3Rl c3QodCwgJnByaW1fbW9kZV9wYXJhbXMpOworCQlpZiAodC0+cGxhbmUgPT0gUExBTkVfU1BSKQor CQkJc2V0X3Nwcml0ZV9mb3JfdGVzdCh0LCAmcHJpbV9tb2RlX3BhcmFtcyk7CisJfQorCisJaWYg KHQtPnBpcGVzID09IFBJUEVfU0lOR0xFKQorCQlyZXR1cm47CisKKwllbmFibGVfc2NuZF9zY3Jl ZW5fYW5kX3dhaXQodCk7CisJaWYgKHQtPnNjcmVlbiA9PSBTQ1JFRU5fU0NORCkgeworCQlpZiAo dC0+cGxhbmUgPT0gUExBTkVfQ1VSKQorCQkJc2V0X2N1cnNvcl9mb3JfdGVzdCh0LCAmc2NuZF9t b2RlX3BhcmFtcyk7CisJCWlmICh0LT5wbGFuZSA9PSBQTEFORV9TUFIpCisJCQlzZXRfc3ByaXRl X2Zvcl90ZXN0KHQsICZzY25kX21vZGVfcGFyYW1zKTsKKwl9Cit9CisKKy8qCisgKiBydGUgLSB0 aGUgYmFzaWMgc2FuaXR5IHRlc3QKKyAqCisgKiBNRVRIT0QKKyAqICAgSnVzdCBkaXNhYmxlIGFs bCBzY3JlZW5zLCBhc3NlcnQgZXZlcnl0aGluZyBpcyBkaXNhYmxlZCwgdGhlbiBlbmFibGUgYWxs CisgKiAgIHNjcmVlbnMgLSBpbmNsdWRpbmcgcHJpbWFyeSwgY3Vyc29yIGFuZCBzcHJpdGUgcGxh bmVzIC0gYW5kIGFzc2VydCB0aGF0CisgKiAgIHRoZSB0ZXN0ZWQgZmVhdHVyZSBpcyBlbmFibGVk LgorICoKKyAqIEVYUEVDVEVEIFJFU1VMVFMKKyAqICAgQmx1ZSBzY3JlZW5zIGFuZCB0LT5mZWF0 dXJlIGVuYWJsZWQuCisgKgorICogRkFJTFVSRVMKKyAqICAgQSBmYWlsdXJlIGhlcmUgbWVhbnMg dGhhdCBldmVyeSBvdGhlciBzdWJ0ZXN0IHdpbGwgcHJvYmFibHkgZmFpbCB0b28uIEl0CisgKiAg IHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIEtlcm5lbCBpcyBqdXN0IG5vdCBlbmFibGluZyB0aGUg ZmVhdHVyZSB3ZSB3YW50LgorICovCitzdGF0aWMgdm9pZCBydGVfc3VidGVzdChjb25zdCBzdHJ1 Y3QgdGVzdF9tb2RlICp0KQoreworCWNoZWNrX3Rlc3RfcmVxdWlyZW1lbnRzKHQpOworCisJZGlz YWJsZV9mZWF0dXJlcygpOworCXNldF9jcnRjX2Zicyh0KTsKKworCWVuYWJsZV9mZWF0dXJlc19m b3JfdGVzdCh0KTsKKwl1bnNldF9hbGxfY3J0Y3MoKTsKKwlkb19hc3NlcnRpb25zKEFTU0VSVF9G QkNfRElTQUJMRUQgfCBBU1NFUlRfUFNSX0RJU0FCTEVEIHwKKwkJICAgICAgRE9OVF9BU1NFUlRf Q1JDKTsKKworCWVuYWJsZV9wcmltX3NjcmVlbl9hbmRfd2FpdCh0KTsKKwlzZXRfY3Vyc29yX2Zv cl90ZXN0KHQsICZwcmltX21vZGVfcGFyYW1zKTsKKwlzZXRfc3ByaXRlX2Zvcl90ZXN0KHQsICZw cmltX21vZGVfcGFyYW1zKTsKKworCWlmICh0LT5waXBlcyA9PSBQSVBFX1NJTkdMRSkKKwkJcmV0 dXJuOworCisJZW5hYmxlX3NjbmRfc2NyZWVuX2FuZF93YWl0KHQpOworCXNldF9jdXJzb3JfZm9y X3Rlc3QodCwgJnNjbmRfbW9kZV9wYXJhbXMpOworCXNldF9zcHJpdGVfZm9yX3Rlc3QodCwgJnNj bmRfbW9kZV9wYXJhbXMpOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfd2FudGVkX2NyYyhjb25z dCBzdHJ1Y3QgdGVzdF9tb2RlICp0LCBzdHJ1Y3QgYm90aF9jcmNzICpjcmMpCit7CisJaWYgKHQt PnNjcmVlbiA9PSBTQ1JFRU5fUFJJTSkKKwkJd2FudGVkX2NyYyA9IGNyYzsKK30KKworLyoKKyAq IGRyYXcgLSBkcmF3IGEgc2V0IG9mIHJlY3RhbmdsZXMgb24gdGhlIHNjcmVlbiB1c2luZyB0aGUg cHJvdmlkZWQgbWV0aG9kCisgKgorICogTUVUSE9ECisgKiAgIEp1c3Qgc2V0IHRoZSBzY3JlZW5z IGFzIGFwcHJvcHJpYXRlIGFuZCB0aGVuIHN0YXJ0IGRyYXdpbmcgYSBzZXJpZXMgb2YKKyAqICAg cmVjdGFuZ2xlcyBvbiB0aGUgdGFyZ2V0IHNjcmVlbi4gVGhlIGltcG9ydGFudCBndXkgaGVyZSBp cyB0aGUgZHJhd2luZworICogICBtZXRob2QgdXNlZC4KKyAqCisgKiBFWFBFQ1RFRCBSRVNVTFRT CisgKiAgIFRoZSBmZWF0dXJlIGVpdGhlciBzdGF5cyBlbmFibGVkIG9yIGdldHMgcmVlbmFibGVk IGFmdGVyIHRoZSBvcHJhdGlvbnMuIFlvdQorICogICB3aWxsIGFsc28gc2VlIHRoZSByZWN0YW5n bGVzIG9uIHRoZSB0YXJnZXQgc2NyZWVuLgorICoKKyAqIEZBSUxVUkVTCisgKiAgIEEgZmFpbHVy ZSBoZXJlIGluZGljYXRlcyBhIHByb2JsZW0gc29tZXdoZXJlIGJldHdlZW4gdGhlIEtlcm5lbCdz CisgKiAgIGZyb250YnVmZmVyIHRyYWNraW5nIGluZnJhc3RydWN0dXJlIG9yIHRoZSBmZWF0dXJl IGl0c2VsZi4gWW91IG5lZWQgdG8gcGF5CisgKiAgIGF0dGVudGlvbiB0byB3aGljaCBkcmF3aW5n IG1ldGhvZCBpcyBiZWluZyB1c2VkLgorICovCitzdGF0aWMgdm9pZCBkcmF3X3N1YnRlc3QoY29u c3Qgc3RydWN0IHRlc3RfbW9kZSAqdCkKK3sKKwlpbnQgcjsKKwlpbnQgYXNzZXJ0aW9ucyA9IDA7 CisJc3RydWN0IGRyYXdfcGF0dGVybl9pbmZvICpwYXR0ZXJuOworCXN0cnVjdCBtb2Rlc2V0X3Bh cmFtcyAqcGFyYW1zID0gcGlja19wYXJhbXModCk7CisJc3RydWN0IGZiX3JlZ2lvbiAqdGFyZ2V0 OworCisJc3dpdGNoICh0LT5zY3JlZW4pIHsKKwljYXNlIFNDUkVFTl9QUklNOgorCQlpZiAodC0+ bWV0aG9kICE9IElHVF9EUkFXX01NQVBfR1RUICYmIHQtPnBsYW5lID09IFBMQU5FX1BSSSkKKwkJ CWFzc2VydGlvbnMgfD0gQVNTRVJUX0xBU1RfQUNUSU9OX0NIQU5HRUQ7CisJCWVsc2UKKwkJCWFz c2VydGlvbnMgfD0gQVNTRVJUX05PX0FDVElPTl9DSEFOR0U7CisJCWJyZWFrOworCWNhc2UgU0NS RUVOX1NDTkQ6CisJY2FzZSBTQ1JFRU5fT0ZGU0NSRUVOOgorCQlhc3NlcnRpb25zIHw9IEFTU0VS VF9OT19BQ1RJT05fQ0hBTkdFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0KGZh bHNlKTsKKwl9CisKKwlzd2l0Y2ggKHQtPnBsYW5lKSB7CisJY2FzZSBQTEFORV9QUkk6CisJCXBh dHRlcm4gPSAmcGF0dGVybjE7CisJCWJyZWFrOworCWNhc2UgUExBTkVfQ1VSOgorCWNhc2UgUExB TkVfU1BSOgorCQlwYXR0ZXJuID0gJnBhdHRlcm4yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlp Z3RfYXNzZXJ0KGZhbHNlKTsKKwl9CisKKwlzZXRfc2NyZWVuc19mb3JfdGVzdCh0LCBwYXR0ZXJu KTsKKwl0YXJnZXQgPSBwaWNrX3RhcmdldCh0LCBwYXJhbXMpOworCisJZm9yIChyID0gMDsgciA8 IHBhdHRlcm4tPm5fcmVjdHM7IHIrKykgeworCQlkcmF3X3JlY3QocGF0dGVybiwgdGFyZ2V0LCB0 LT5tZXRob2QsIHIpOworCQl1cGRhdGVfd2FudGVkX2NyYyh0LCAmcGF0dGVybi0+Y3Jjc1tyXSk7 CisJCWRvX2Fzc2VydGlvbnMoYXNzZXJ0aW9ucyk7CisJfQorfQorCisvKgorICogbXVsdGlkcmF3 IC0gZHJhdyBhIHNldCBvZiByZWN0YW5nbGVzIG9uIHRoZSBzY3JlZW4gdXNpbmcgYWx0ZXJuYXRl ZCBkcmF3aW5nCisgKiAgICAgICAgICAgICBtZXRob2RzCisgKgorICogTUVUSE9ECisgKiAgIFRo aXMgaXMganVzdCBsaWtlIHRoZSBkcmF3IHN1YnRlc3QsIGJ1dCBub3cgd2Uga2VlcCBhbHRlcm5h dGluZyBiZXR3ZWVuIHR3bworICogICBkcmF3aW5nIG1ldGhvZHMuIEVhY2ggdGltZSB3ZSBydW4g bXVsdGlkcmF3X3N1YnRlc3Qgd2Ugd2lsbCB0ZXN0IGFsbCB0aGUKKyAqICAgcG9zc2libGUgcGFp cnMgY29udGFpbmluZyB0LT5tZXRob2QuCisgKgorICogRVhQRUNURUQgUkVTVUxUUworICogICBU aGUgc2FtZSBhcyB0aGUgZHJhdyBzdWJ0ZXN0LgorICoKKyAqIEZBSUxVUkVTCisgKiAgIElmIHlv dSBnZXQgYSBmYWlsdXJlIGhlcmUsIGZpcnN0IHlvdSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgeW91 IGFsc28gZ2V0CisgKiAgIGZhaWx1cmVzIG9uIHRoZSBpbmRpdmlkdWFsIGRyYXcgc3VidGVzdHMu IElmIHllcywgdGhlbiBnbyBmaXggZXZlcnkgc2luZ2xlCisgKiAgIGRyYXcgc3VidGVzdCBmaXJz dC4gSWYgYWxsIHRoZSBkcmF3IHN1YnRlc3RzIHBhc3MgYnV0IHRoaXMgb25lIGZhaWxzLCB0aGVu CisgKiAgIHlvdSBoYXZlIHRvIHN0dWR5IGhvdyBvbmUgZHJhd2luZyBtZXRob2QgaXMgc3RvcHBp bmcgdGhlIG90aGVyIGZyb20KKyAqICAgcHJvcGVybHkgd29ya2luZy4KKyAqLworc3RhdGljIHZv aWQgbXVsdGlkcmF3X3N1YnRlc3QoY29uc3Qgc3RydWN0IHRlc3RfbW9kZSAqdCkKK3sKKwlpbnQg cjsKKwlpbnQgYXNzZXJ0aW9ucyA9IDA7CisJc3RydWN0IGRyYXdfcGF0dGVybl9pbmZvICpwYXR0 ZXJuOworCXN0cnVjdCBtb2Rlc2V0X3BhcmFtcyAqcGFyYW1zID0gcGlja19wYXJhbXModCk7CisJ c3RydWN0IGZiX3JlZ2lvbiAqdGFyZ2V0OworCWVudW0gaWd0X2RyYXdfbWV0aG9kIG0sIHVzZWRf bWV0aG9kOworCXVpbnQzMl90IGNvbG9yOworCisJc3dpdGNoICh0LT5wbGFuZSkgeworCWNhc2Ug UExBTkVfUFJJOgorCQlwYXR0ZXJuID0gJnBhdHRlcm4xOworCQlicmVhazsKKwljYXNlIFBMQU5F X0NVUjoKKwljYXNlIFBMQU5FX1NQUjoKKwkJcGF0dGVybiA9ICZwYXR0ZXJuMjsKKwkJYnJlYWs7 CisJZGVmYXVsdDoKKwkJaWd0X2Fzc2VydChmYWxzZSk7CisJfQorCisJc2V0X3NjcmVlbnNfZm9y X3Rlc3QodCwgcGF0dGVybik7CisJdGFyZ2V0ID0gcGlja190YXJnZXQodCwgcGFyYW1zKTsKKwor CWZvciAobSA9IDA7IG0gPCBJR1RfRFJBV19NRVRIT0RfQ09VTlQ7IG0rKykgeworCQlpZiAobSA9 PSB0LT5tZXRob2QpCisJCQljb250aW51ZTsKKworCQlpZ3RfZGVidWcoIk1ldGhvZCAlc1xuIiwg aWd0X2RyYXdfZ2V0X21ldGhvZF9uYW1lKG0pKTsKKwkJZm9yIChyID0gMDsgciA8IHBhdHRlcm4t Pm5fcmVjdHM7IHIrKykgeworCisJCQl1c2VkX21ldGhvZCA9IChyICUgMiA9PSAwKSA/IHQtPm1l dGhvZCA6IG07CisKKwkJCWRyYXdfcmVjdChwYXR0ZXJuLCB0YXJnZXQsIHVzZWRfbWV0aG9kLCBy KTsKKwkJCXVwZGF0ZV93YW50ZWRfY3JjKHQsICZwYXR0ZXJuLT5jcmNzW3JdKTsKKworCQkJYXNz ZXJ0aW9ucyA9IHVzZWRfbWV0aG9kICE9IElHVF9EUkFXX01NQVBfR1RUID8KKwkJCQkgICAgIEFT U0VSVF9MQVNUX0FDVElPTl9DSEFOR0VEIDoKKwkJCQkgICAgIEFTU0VSVF9OT19BQ1RJT05fQ0hB TkdFOworCQkJZG9fYXNzZXJ0aW9ucyhhc3NlcnRpb25zKTsKKwkJfQorCisJCXN3aXRjaCAodC0+ cGxhbmUpIHsKKwkJY2FzZSBQTEFORV9QUkk6CisJCQljb2xvciA9IDB4RkY7CisJCQlicmVhazsK KwkJY2FzZSBQTEFORV9DVVI6CisJCWNhc2UgUExBTkVfU1BSOgorCQkJY29sb3IgPSAweEZGMDAw MEZGOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZ3RfYXNzZXJ0KGZhbHNlKTsKKwkJfQor CQlmaWxsX2ZiX3JlZ2lvbih0YXJnZXQsIGNvbG9yKTsKKworCQl1cGRhdGVfd2FudGVkX2NyYyh0 LCAmYmx1ZV9jcmMpOworCQlkb19hc3NlcnRpb25zKEFTU0VSVF9OT19BQ1RJT05fQ0hBTkdFKTsK Kwl9Cit9CisKKy8qCisgKiBmbGlwIC0ganVzdCBleGVyY2lzZSBwYWdlIGZsaXBzIHdpdGggdGhl IHBhdHRlcm5zIHdlIGhhdmUKKyAqCisgKiBNRVRIT0QKKyAqICAgV2UgZHJhdyB0aGUgcGF0dGVy biBvbiBhIGJhY2tidWZmZXIgdXNpbmcgdGhlIHByb3ZpZGVkIG1ldGhvZCwgdGhlbiB3ZQorICog ICBmbGlwLCBtYWtpbmcgdGhpcyB0aGUgZnJvbnRidWZmZXIuCisgKgorICogRVhQRUNURUQgUkVT VUxUUworICogICBFdmVyeXRoaW5nIHdvcmtzIGFzIGV4cGVjdGVkLCBzY3JlZW4gY29udGVudHMg YXJlIHByb3Blcmx5IHVwZGF0ZWQuCisgKgorICogRkFJTFVSRVMKKyAqICAgT24gYSBmYWlsdXJl IGhlcmUgeW91IG5lZWQgdG8gZ28gZGlyZWN0bHkgdG8gdGhlIEtlcm5lbCdzIGZsaXAgY29kZSBh bmQgc2VlCisgKiAgIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgZmVhdHVyZSBiZWluZyB0ZXN0 ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGZsaXBfc3VidGVzdChjb25zdCBzdHJ1Y3QgdGVzdF9tb2Rl ICp0KQoreworCWludCByLCByYzsKKwlpbnQgYXNzZXJ0aW9ucyA9IDA7CisJc3RydWN0IGlndF9m YiBmYjI7CisJc3RydWN0IGZiX3JlZ2lvbiBmYjJfcmVnaW9uLCAqdGFyZ2V0OworCXN0cnVjdCBt b2Rlc2V0X3BhcmFtcyAqcGFyYW1zID0gcGlja19wYXJhbXModCk7CisJc3RydWN0IGRyYXdfcGF0 dGVybl9pbmZvICpwYXR0ZXJuID0gJnBhdHRlcm4xOworCXVpbnQzMl90IGJnX2NvbG9yOworCisJ c3dpdGNoICh0LT5zY3JlZW4pIHsKKwljYXNlIFNDUkVFTl9QUklNOgorCQlhc3NlcnRpb25zIHw9 IEFTU0VSVF9MQVNUX0FDVElPTl9DSEFOR0VEOworCQliZ19jb2xvciA9IDB4RkY7CisJCWJyZWFr OworCWNhc2UgU0NSRUVOX1NDTkQ6CisJCWFzc2VydGlvbnMgfD0gQVNTRVJUX05PX0FDVElPTl9D SEFOR0U7CisJCWJnX2NvbG9yID0gMHg4MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWd0X2Fz c2VydChmYWxzZSk7CisJfQorCisJc2V0X3NjcmVlbnNfZm9yX3Rlc3QodCwgcGF0dGVybik7CisK KwlpZ3RfY3JlYXRlX2ZiKGRybS5mZCwgcGFyYW1zLT5mYi5mYi0+d2lkdGgsIHBhcmFtcy0+ZmIu ZmItPmhlaWdodCwKKwkJICAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwgTE9DQUxfSTkxNV9GT1JN QVRfTU9EX1hfVElMRUQsICZmYjIpOworCWlndF9kcmF3X2ZpbGxfZmIoZHJtLmZkLCAmZmIyLCBi Z19jb2xvcik7CisJZmIyX3JlZ2lvbi5mYiA9ICZmYjI7CisJZmIyX3JlZ2lvbi54ID0gcGFyYW1z LT5mYi54OworCWZiMl9yZWdpb24ueSA9IHBhcmFtcy0+ZmIueTsKKwlmYjJfcmVnaW9uLncgPSBw YXJhbXMtPmZiLnc7CisJZmIyX3JlZ2lvbi5oID0gcGFyYW1zLT5mYi5oOworCisJZm9yIChyID0g MDsgciA8IHBhdHRlcm4tPm5fcmVjdHM7IHIrKykgeworCQl0YXJnZXQgPSAociAlIDIgPT0gMCkg PyAmZmIyX3JlZ2lvbiA6ICZwYXJhbXMtPmZiOworCisJCWlmIChyICE9IDApCisJCQlkcmF3X3Jl Y3QocGF0dGVybiwgdGFyZ2V0LCB0LT5tZXRob2QsIHIgLSAxKTsKKwkJZHJhd19yZWN0KHBhdHRl cm4sIHRhcmdldCwgdC0+bWV0aG9kLCByKTsKKwkJdXBkYXRlX3dhbnRlZF9jcmModCwgJnBhdHRl cm4tPmNyY3Nbcl0pOworCisJCXJjID0gZHJtTW9kZVBhZ2VGbGlwKGRybS5mZCwgcGFyYW1zLT5j cnRjX2lkLCB0YXJnZXQtPmZiLT5mYl9pZCwKKwkJCQkgICAgIDAsIE5VTEwpOworCQlpZ3RfYXNz ZXJ0KHJjID09IDApOworCisJCWRvX2Fzc2VydGlvbnMoYXNzZXJ0aW9ucyk7CisJfQorCisJaWd0 X3JlbW92ZV9mYihkcm0uZmQsICZmYjIpOworfQorCisvKgorICogbW92ZSAtIGp1c3QgbW92ZSB0 aGUgc3ByaXRlIG9yIGN1cnNvciBhcm91bmQKKyAqCisgKiBNRVRIT0QKKyAqICAgTW92ZSB0aGUg c3VyZmFjZSBhcm91bmQsIGZvbGxvd2luZyB0aGUgZGVmaW5lZCBwYXR0ZXJuLgorICoKKyAqIEVY UEVDVEVEIFJFU1VMVFMKKyAqICAgVGhlIG1vdmUgb3BlcmF0aW9ucyBhcmUgcHJvcGVybHkgZGV0 ZWN0ZWQgYnkgdGhlIEtlcm5lbCwgYW5kIHRoZSBzY3JlZW4gaXMKKyAqICAgcHJvcGVybHkgdXBk YXRlZCBldmVyeSB0aW1lLgorICoKKyAqIEZBSUxVUkVTCisgKiAgIElmIHlvdSBnZXQgYSBmYWls dXJlIGhlcmUsIGNoZWNrIGhvdyB0aGUgS2VybmVsIGlzIGVuYWJsaW5nIG9yIGRpc2FibGluZwor ICogICB5b3VyIGZlYXR1cmUgd2hlbiBpdCBtb3ZlcyB0aGUgcGxhbmVzIGFyb3VuZC4KKyAqLwor c3RhdGljIHZvaWQgbW92ZV9zdWJ0ZXN0KGNvbnN0IHN0cnVjdCB0ZXN0X21vZGUgKnQpCit7CisJ aW50IHIsIHJjOworCWludCBhc3NlcnRpb25zID0gQVNTRVJUX05PX0FDVElPTl9DSEFOR0U7CisJ c3RydWN0IG1vZGVzZXRfcGFyYW1zICpwYXJhbXMgPSBwaWNrX3BhcmFtcyh0KTsKKwlzdHJ1Y3Qg ZHJhd19wYXR0ZXJuX2luZm8gKnBhdHRlcm4gPSAmcGF0dGVybjM7CisJYm9vbCByZXBlYXQgPSBm YWxzZTsKKworCXNldF9zY3JlZW5zX2Zvcl90ZXN0KHQsIHBhdHRlcm4pOworCisJLyogSnVzdCBw YWludCB0aGUgcmlnaHQgY29sb3Igc2luY2Ugd2Ugc3RhcnQgYXQgMHgwLiAqLworCWRyYXdfcmVj dChwYXR0ZXJuLCBwaWNrX3RhcmdldCh0LCBwYXJhbXMpLCB0LT5tZXRob2QsIDApOworCXVwZGF0 ZV93YW50ZWRfY3JjKHQsICZwYXR0ZXJuLT5jcmNzWzBdKTsKKworCWRvX2Fzc2VydGlvbnMoYXNz ZXJ0aW9ucyk7CisKKwlmb3IgKHIgPSAxOyByIDwgcGF0dGVybi0+bl9yZWN0czsgcisrKSB7CisJ CXN0cnVjdCByZWN0IHJlY3QgPSBwYXR0ZXJuLT5nZXRfcmVjdCgmcGFyYW1zLT5mYiwgcik7CisK KwkJc3dpdGNoICh0LT5wbGFuZSkgeworCQljYXNlIFBMQU5FX0NVUjoKKwkJCXJjID0gZHJtTW9k ZU1vdmVDdXJzb3IoZHJtLmZkLCBwYXJhbXMtPmNydGNfaWQsIHJlY3QueCwKKwkJCQkJICAgICAg IHJlY3QueSk7CisJCQlpZ3RfYXNzZXJ0KHJjID09IDApOworCQkJYnJlYWs7CisJCWNhc2UgUExB TkVfU1BSOgorCQkJcmMgPSBkcm1Nb2RlU2V0UGxhbmUoZHJtLmZkLCBwYXJhbXMtPnNwcml0ZV9p ZCwKKwkJCQkJICAgICBwYXJhbXMtPmNydGNfaWQsCisJCQkJCSAgICAgcGFyYW1zLT5zcHJpdGUu ZmItPmZiX2lkLCAwLAorCQkJCQkgICAgIHJlY3QueCwgcmVjdC55LCByZWN0LncsCisJCQkJCSAg ICAgcmVjdC5oLCAwLCAwLCByZWN0LncgPDwgMTYsCisJCQkJCSAgICAgcmVjdC5oIDw8IDE2KTsK KwkJCWlndF9hc3NlcnQocmMgPT0gMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlndF9h c3NlcnQoZmFsc2UpOworCQl9CisJCXVwZGF0ZV93YW50ZWRfY3JjKHQsICZwYXR0ZXJuLT5jcmNz W3JdKTsKKworCQlkb19hc3NlcnRpb25zKGFzc2VydGlvbnMpOworCisJCS8qICJNb3ZlIiB0aGUg bGFzdCByZWN0IHRvIHRoZSBzYW1lIHBvc2l0aW9uIGp1c3QgdG8gbWFrZSBzdXJlCisJCSAqIHRo aXMgd29ya3MgdG9vLiAqLworCQlpZiAocisxID09IHBhdHRlcm4tPm5fcmVjdHMgJiYgIXJlcGVh dCkgeworCQkJcmVwZWF0ID0gdHJ1ZTsKKwkJCXItLTsKKwkJfQorCX0KK30KKworLyoKKyAqIG9u b2ZmIC0ganVzdCBlbmFibGUgYW5kIGRpc2FibGUgdGhlIHNwcml0ZSBvciBjdXJzb3IgcGxhbmUg YSBmZXcgdGltZXMKKyAqCisgKiBNRVRIT0QKKyAqICAgSnVzdCBlbmFibGUgYW5kIGRpc2FibGUg dGhlIGRlc2lyZWQgcGxhbmUgYSBmZXcgdGltZXMuCisgKgorICogRVhQRUNURUQgUkVTVUxUUwor ICogICBFdmVyeXRoaW5nIGlzIHByb3Blcmx5IGRldGVjdGVkIGJ5IHRoZSBLZXJuZWwgYW5kIHRo ZSBzY3JlZW4gY29udGVudHMgYXJlCisgKiAgIGFjY3VyYXRlLgorICoKKyAqIEZBSUxVUkVTCisg KiAgIEFzIHVzdWFsLCBpZiB5b3UgZ2V0IGEgZmFpbHVyZSBoZXJlIHlvdSBuZWVkIHRvIGNoZWNr IGhvdyB0aGUgZmVhdHVyZSBpcworICogICBiZWluZyBoYW5kbGVkIHdoZW4gdGhlIHBsYW5lcyBh cmUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgb25vZmZfc3VidGVzdChj b25zdCBzdHJ1Y3QgdGVzdF9tb2RlICp0KQoreworCWludCByLCByYzsKKwlpbnQgYXNzZXJ0aW9u cyA9IEFTU0VSVF9OT19BQ1RJT05fQ0hBTkdFOworCXN0cnVjdCBtb2Rlc2V0X3BhcmFtcyAqcGFy YW1zID0gcGlja19wYXJhbXModCk7CisJc3RydWN0IGRyYXdfcGF0dGVybl9pbmZvICpwYXR0ZXJu ID0gJnBhdHRlcm4zOworCisJc2V0X3NjcmVlbnNfZm9yX3Rlc3QodCwgcGF0dGVybik7CisKKwkv KiBKdXN0IHBhaW50IHRoZSByaWdodCBjb2xvciBzaW5jZSB3ZSBzdGFydCBhdCAweDAuICovCisJ ZHJhd19yZWN0KHBhdHRlcm4sIHBpY2tfdGFyZ2V0KHQsIHBhcmFtcyksIHQtPm1ldGhvZCwgMCk7 CisJdXBkYXRlX3dhbnRlZF9jcmModCwgJnBhdHRlcm4tPmNyY3NbMF0pOworCWRvX2Fzc2VydGlv bnMoYXNzZXJ0aW9ucyk7CisKKwlmb3IgKHIgPSAwOyByIDwgNDsgcisrKSB7CisJCWlmIChyICUg MiA9PSAwKSB7CisJCQlzd2l0Y2ggKHQtPnBsYW5lKSB7CisJCQljYXNlIFBMQU5FX0NVUjoKKwkJ CQlyYyA9IGRybU1vZGVTZXRDdXJzb3IoZHJtLmZkLCBwYXJhbXMtPmNydGNfaWQsCisJCQkJCQkg ICAgICAwLCAwLCAwKTsKKwkJCQlpZ3RfYXNzZXJ0KHJjID09IDApOworCQkJCWJyZWFrOworCQkJ Y2FzZSBQTEFORV9TUFI6CisJCQkJcmMgPSBkcm1Nb2RlU2V0UGxhbmUoZHJtLmZkLCBwYXJhbXMt PnNwcml0ZV9pZCwKKwkJCQkJCSAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJCQkJ CSAgICAgMCwgMCk7CisJCQkJaWd0X2Fzc2VydChyYyA9PSAwKTsKKwkJCQlicmVhazsKKwkJCWRl ZmF1bHQ6CisJCQkJaWd0X2Fzc2VydChmYWxzZSk7CisJCQl9CisJCQl1cGRhdGVfd2FudGVkX2Ny Yyh0LCAmYmx1ZV9jcmMpOworCisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHQtPnBsYW5lKSB7CisJ CQljYXNlIFBMQU5FX0NVUjoKKwkJCQlyYyA9IGRybU1vZGVTZXRDdXJzb3IoZHJtLmZkLCBwYXJh bXMtPmNydGNfaWQsCisJCQkJCQkgIHBhcmFtcy0+Y3Vyc29yLmZiLT5nZW1faGFuZGxlLAorCQkJ CQkJICBwYXJhbXMtPmN1cnNvci53LAorCQkJCQkJICBwYXJhbXMtPmN1cnNvci5oKTsKKwkJCQlp Z3RfYXNzZXJ0KHJjID09IDApOworCQkJCWJyZWFrOworCQkJY2FzZSBQTEFORV9TUFI6CisJCQkJ cmMgPSBkcm1Nb2RlU2V0UGxhbmUoZHJtLmZkLCBwYXJhbXMtPnNwcml0ZV9pZCwKKwkJCQkJCSAg ICAgcGFyYW1zLT5jcnRjX2lkLAorCQkJCQkJICAgICBwYXJhbXMtPnNwcml0ZS5mYi0+ZmJfaWQs CisJCQkJCQkgICAgIDAsIDAsIDAsIHBhcmFtcy0+c3ByaXRlLncsCisJCQkJCQkgICAgIHBhcmFt cy0+c3ByaXRlLmgsIDAsCisJCQkJCQkgICAgIDAsCisJCQkJCQkgICAgIHBhcmFtcy0+c3ByaXRl LncgPDwgMTYsCisJCQkJCQkgICAgIHBhcmFtcy0+c3ByaXRlLmggPDwgMTYpOworCQkJCWlndF9h c3NlcnQocmMgPT0gMCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWlndF9hc3NlcnQo ZmFsc2UpOworCQkJfQorCQkJdXBkYXRlX3dhbnRlZF9jcmModCwgJnBhdHRlcm4tPmNyY3NbMF0p OworCisJCX0KKworCQlkb19hc3NlcnRpb25zKGFzc2VydGlvbnMpOworCX0KK30KKworLyoKKyAq IGZ1bGxzY3JlZW5fcGxhbmUgLSBwdXQgYSBmdWxsc2NyZWVuIHBsYW5lIGNvdmVyaW5nIHRoZSB3 aG9sZSBzY3JlZW4KKyAqCisgKiBNRVRIT0QKKyAqICAgQXMgc2ltcGxlIGFzIHRoZSBkZXNjcmlw dGlvbiBhYm92ZS4KKyAqCisgKiBFWFBFQ1RFRCBSRVNVTFRTCisgKiAgIEl0IGRlcGVuZHMgb24g dGhlIGZlYXR1cmUgYmVpbmcgdGVzdGVkLiBGQkMgZ2V0cyBkaXNhYmxlZCwgYnV0IFBTUiBkb2Vz bid0LgorICoKKyAqIEZBSUxVUkVTCisgKiAgIEFnYWluLCBpZiB5b3UgZ2V0IGZhaWx1cmVzIGhl cmUgeW91IG5lZWQgdG8gZGlnIGludG8gdGhlIEtlcm5lbCBjb2RlLCBzZWUKKyAqICAgaG93IGl0 IGlzIGhhbmRsaW5nIHlvdXIgZmVhdHVyZSBvbiB0aGlzIHNwZWNpZmljIGNhc2UuCisgKi8KK3N0 YXRpYyB2b2lkIGZ1bGxzY3JlZW5fcGxhbmVfc3VidGVzdChjb25zdCBzdHJ1Y3QgdGVzdF9tb2Rl ICp0KQoreworCXN0cnVjdCBkcmF3X3BhdHRlcm5faW5mbyAqcGF0dGVybiA9ICZwYXR0ZXJuNDsK KwlzdHJ1Y3QgaWd0X2ZiIGZ1bGxzY3JlZW5fZmI7CisJc3RydWN0IHJlY3QgcmVjdDsKKwlzdHJ1 Y3QgbW9kZXNldF9wYXJhbXMgKnBhcmFtcyA9IHBpY2tfcGFyYW1zKHQpOworCWludCBhc3NlcnRp b25zOworCWludCByYzsKKworCXNldF9zY3JlZW5zX2Zvcl90ZXN0KHQsIHBhdHRlcm4pOworCisJ cmVjdCA9IHBhdHRlcm4tPmdldF9yZWN0KCZwYXJhbXMtPmZiLCAwKTsKKwlpZ3RfY3JlYXRlX2Zi KGRybS5mZCwgcmVjdC53LCByZWN0LmgsIERSTV9GT1JNQVRfWFJHQjg4ODgsCisJCSAgICAgIExP Q0FMX0k5MTVfRk9STUFUX01PRF9YX1RJTEVELCAmZnVsbHNjcmVlbl9mYik7CisJaWd0X2RyYXdf ZmlsbF9mYihkcm0uZmQsICZmdWxsc2NyZWVuX2ZiLCByZWN0LmNvbG9yKTsKKworCXJjID0gZHJt TW9kZVNldFBsYW5lKGRybS5mZCwgcGFyYW1zLT5zcHJpdGVfaWQsIHBhcmFtcy0+Y3J0Y19pZCwK KwkJCSAgICAgZnVsbHNjcmVlbl9mYi5mYl9pZCwgMCwgMCwgMCwgZnVsbHNjcmVlbl9mYi53aWR0 aCwKKwkJCSAgICAgZnVsbHNjcmVlbl9mYi5oZWlnaHQsIDAsIDAsCisJCQkgICAgIGZ1bGxzY3Jl ZW5fZmIud2lkdGggPDwgMTYsCisJCQkgICAgIGZ1bGxzY3JlZW5fZmIuaGVpZ2h0IDw8IDE2KTsK KwlpZ3RfYXNzZXJ0KHJjID09IDApOworCXVwZGF0ZV93YW50ZWRfY3JjKHQsICZwYXR0ZXJuLT5j cmNzWzBdKTsKKworCXN3aXRjaCAodC0+c2NyZWVuKSB7CisJY2FzZSBTQ1JFRU5fUFJJTToKKwkJ YXNzZXJ0aW9ucyA9IEFTU0VSVF9GQkNfRElTQUJMRUQgfAorCQkJICAgICBBU1NFUlRfTEFTVF9B Q1RJT05fQ0hBTkdFRDsKKwkJYnJlYWs7CisJY2FzZSBTQ1JFRU5fU0NORDoKKwkJYXNzZXJ0aW9u cyA9IEFTU0VSVF9OT19BQ1RJT05fQ0hBTkdFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZ3Rf YXNzZXJ0KGZhbHNlKTsKKwl9CisJZG9fYXNzZXJ0aW9ucyhhc3NlcnRpb25zKTsKKworCXJjID0g ZHJtTW9kZVNldFBsYW5lKGRybS5mZCwgcGFyYW1zLT5zcHJpdGVfaWQsIDAsIDAsIDAsIDAsIDAs IDAsIDAsIDAsCisJCQkgICAgIDAsIDAsIDApOworCWlndF9hc3NlcnQocmMgPT0gMCk7CisKKwlp ZiAodC0+c2NyZWVuID09IFNDUkVFTl9QUklNKQorCQlhc3NlcnRpb25zID0gQVNTRVJUX0xBU1Rf QUNUSU9OX0NIQU5HRUQ7CisJdXBkYXRlX3dhbnRlZF9jcmModCwgJmJsdWVfY3JjKTsKKwlkb19h c3NlcnRpb25zKGFzc2VydGlvbnMpOworCisJaWd0X3JlbW92ZV9mYihkcm0uZmQsICZmdWxsc2Ny ZWVuX2ZiKTsKK30KKworc3RhdGljIGludCBvcHRfaGFuZGxlcihpbnQgb3B0aW9uLCBpbnQgb3B0 aW9uX2luZGV4LCB2b2lkICpkYXRhKQoreworCXN3aXRjaCAob3B0aW9uKSB7CisJY2FzZSAncyc6 CisJCW9wdC5jaGVja19zdGF0dXMgPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAnYyc6CisJCW9w dC5jaGVja19jcmMgPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAnbyc6CisJCW9wdC5mYmNfY2hl Y2tfY29tcHJlc3Npb24gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAnYSc6CisJCW9wdC5mYmNf Y2hlY2tfbGFzdF9hY3Rpb24gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAnZSc6CisJCW9wdC5u b19lZHAgPSB0cnVlOworCQlicmVhazsKKwljYXNlICdtJzoKKwkJb3B0LnNtYWxsX21vZGVzID0g dHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSAnaSc6CisJCW9wdC5zaG93X2hpZGRlbiA9IHRydWU7CisJ CWJyZWFrOworCWNhc2UgJ3QnOgorCQlvcHQuc3RlcCsrOworCQlicmVhazsKKwljYXNlICduJzoK KwkJaWd0X2Fzc2VydChvcHQub25seV9mZWF0dXJlID09IEZFQVRVUkVfQ09VTlQpOworCQlvcHQu b25seV9mZWF0dXJlID0gRkVBVFVSRV9OT05FOworCQlicmVhazsKKwljYXNlICdmJzoKKwkJaWd0 X2Fzc2VydChvcHQub25seV9mZWF0dXJlID09IEZFQVRVUkVfQ09VTlQpOworCQlvcHQub25seV9m ZWF0dXJlID0gRkVBVFVSRV9GQkM7CisJCWJyZWFrOworCWNhc2UgJ3AnOgorCQlpZ3RfYXNzZXJ0 KG9wdC5vbmx5X2ZlYXR1cmUgPT0gRkVBVFVSRV9DT1VOVCk7CisJCW9wdC5vbmx5X2ZlYXR1cmUg PSBGRUFUVVJFX1BTUjsKKwkJYnJlYWs7CisJY2FzZSAnMSc6CisJCWlndF9hc3NlcnQob3B0Lm9u bHlfcGlwZXMgPT0gUElQRV9DT1VOVCk7CisJCW9wdC5vbmx5X3BpcGVzID0gUElQRV9TSU5HTEU7 CisJCWJyZWFrOworCWNhc2UgJzInOgorCQlpZ3RfYXNzZXJ0KG9wdC5vbmx5X3BpcGVzID09IFBJ UEVfQ09VTlQpOworCQlvcHQub25seV9waXBlcyA9IFBJUEVfRFVBTDsKKwkJYnJlYWs7CisJZGVm YXVsdDoKKwkJaWd0X2Fzc2VydChmYWxzZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0 IGNoYXIgKmhlbHBfc3RyID0KKyIgIC0tbm8tc3RhdHVzLWNoZWNrICAgICAgICAgICBEb24ndCBj aGVjayBmb3IgZW5hYmxlL2Rpc2FibGUgc3RhdHVzXG4iCisiICAtLW5vLWNyYy1jaGVjayAgICAg ICAgICAgICAgRG9uJ3QgY2hlY2sgZm9yIENSQyB2YWx1ZXNcbiIKKyIgIC0tbm8tZmJjLWNvbXBy ZXNzaW9uLWNoZWNrICBEb24ndCBjaGVjayBmb3IgdGhlIEZCQyBjb21wcmVzc2lvbiBzdGF0dXNc biIKKyIgIC0tbm8tZmJjLWFjdGlvbi1jaGVjayAgICAgICBEb24ndCBjaGVjayBmb3IgdGhlIEZC QyBsYXN0IGFjdGlvblxuIgorIiAgLS1uby1lZHAgICAgICAgICAgICAgICAgICAgIERvbid0IHVz ZSBlRFAgbW9uaXRvcnNcbiIKKyIgIC0tdXNlLXNtYWxsLW1vZGVzICAgICAgICAgICBVc2Ugc21h bGxlciByZXNvbHV0aW9ucyBmb3IgdGhlIG1vZGVzXG4iCisiICAtLXNob3ctaGlkZGVuICAgICAg ICAgICAgICAgU2hvdyBoaWRkZW4gc3VidGVzdHNcbiIKKyIgIC0tc3RlcCAgICAgICAgICAgICAg ICAgICAgICBTdG9wIG9uIGVhY2ggc3RlcCBzbyB5b3UgY2FuIGNoZWNrIHRoZSBzY3JlZW5cbiIK KyIgIC0tbm9wLW9ubHkgICAgICAgICAgICAgICAgICBPbmx5IHJ1biB0aGUgXCJub3BcIiBmZWF0 dXJlIHN1YnRlc3RzXG4iCisiICAtLWZiYy1vbmx5ICAgICAgICAgICAgICAgICAgT25seSBydW4g dGhlIFwiZmJjXCIgZmVhdHVyZSBzdWJ0ZXN0c1xuIgorIiAgLS1wc3Itb25seSAgICAgICAgICAg ICAgICAgIE9ubHkgcnVuIHRoZSBcInBzclwiIGZlYXR1cmUgc3VidGVzdHNcbiIKKyIgIC0tMXAt b25seSAgICAgICAgICAgICAgICAgICBPbmx5IHJ1biBzdWJ0ZXN0cyB0aGF0IHVzZSAxIHBpcGVc biIKKyIgIC0tMnAtb25seSAgICAgICAgICAgICAgICAgICBPbmx5IHJ1biBzdWJ0ZXN0cyB0aGF0 IHVzZSAyIHBpcGVzXG4iOworCitzdGF0aWMgY29uc3QgY2hhciAqcGlwZXNfc3RyKGludCBwaXBl cykKK3sKKwlzd2l0Y2ggKHBpcGVzKSB7CisJY2FzZSBQSVBFX1NJTkdMRToKKwkJcmV0dXJuICIx cCI7CisJY2FzZSBQSVBFX0RVQUw6CisJCXJldHVybiAiMnAiOworCWRlZmF1bHQ6CisJCWlndF9h c3NlcnQoZmFsc2UpOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnNjcmVlbl9zdHIoaW50 IHNjcmVlbikKK3sKKwlzd2l0Y2ggKHNjcmVlbikgeworCWNhc2UgU0NSRUVOX1BSSU06CisJCXJl dHVybiAicHJpbXNjcm4iOworCWNhc2UgU0NSRUVOX1NDTkQ6CisJCXJldHVybiAic2NuZHNjcm4i OworCWNhc2UgU0NSRUVOX09GRlNDUkVFTjoKKwkJcmV0dXJuICJvZmZzY3JlbiI7CisJZGVmYXVs dDoKKwkJaWd0X2Fzc2VydChmYWxzZSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqcGxh bmVfc3RyKGludCBwbGFuZSkKK3sKKwlzd2l0Y2ggKHBsYW5lKSB7CisJY2FzZSBQTEFORV9QUkk6 CisJCXJldHVybiAicHJpIjsKKwljYXNlIFBMQU5FX0NVUjoKKwkJcmV0dXJuICJjdXIiOworCWNh c2UgUExBTkVfU1BSOgorCQlyZXR1cm4gInNwciI7CisJZGVmYXVsdDoKKwkJaWd0X2Fzc2VydChm YWxzZSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqZmJzX3N0cihpbnQgZmIpCit7CisJ c3dpdGNoIChmYikgeworCWNhc2UgRkJTX1NJTkdMRToKKwkJcmV0dXJuICJzZmIiOworCWNhc2Ug RkJTX01VTFRJOgorCQlyZXR1cm4gIm1mYiI7CisJZGVmYXVsdDoKKwkJaWd0X2Fzc2VydChmYWxz ZSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqZmVhdHVyZV9zdHIoaW50IGZlYXR1cmUp Cit7CisJc3dpdGNoIChmZWF0dXJlKSB7CisJY2FzZSBGRUFUVVJFX05PTkU6CisJCXJldHVybiAi bm9wIjsKKwljYXNlIEZFQVRVUkVfRkJDOgorCQlyZXR1cm4gImZiYyI7CisJY2FzZSBGRUFUVVJF X1BTUjoKKwkJcmV0dXJuICJwc3IiOworCWNhc2UgRkVBVFVSRV9GQkMgfCBGRUFUVVJFX1BTUjoK KwkJcmV0dXJuICJmYmNwc3IiOworCWRlZmF1bHQ6CisJCWlndF9hc3NlcnQoZmFsc2UpOworCX0K K30KKworI2RlZmluZSBURVNUX01PREVfSVRFUl9CRUdJTih0KSBcCisJZm9yICh0LmZlYXR1cmUg PSAwOyB0LmZlYXR1cmUgPCBGRUFUVVJFX0NPVU5UOyB0LmZlYXR1cmUrKykgewkgICBcCisJZm9y ICh0LnBpcGVzID0gMDsgdC5waXBlcyA8IFBJUEVfQ09VTlQ7IHQucGlwZXMrKykgewkJICAgXAor CWZvciAodC5zY3JlZW4gPSAwOyB0LnNjcmVlbiA8IFNDUkVFTl9DT1VOVDsgdC5zY3JlZW4rKykg ewkgICBcCisJZm9yICh0LnBsYW5lID0gMDsgdC5wbGFuZSA8IFBMQU5FX0NPVU5UOyB0LnBsYW5l KyspIHsJCSAgIFwKKwlmb3IgKHQuZmJzID0gMDsgdC5mYnMgPCBGQlNfQ09VTlQ7IHQuZmJzKysp IHsJCQkgICBcCisJZm9yICh0Lm1ldGhvZCA9IDA7IHQubWV0aG9kIDwgSUdUX0RSQVdfTUVUSE9E X0NPVU5UOyB0Lm1ldGhvZCsrKSB7IFwKKwkJaWYgKHQucGlwZXMgPT0gUElQRV9TSU5HTEUgJiYg dC5zY3JlZW4gPT0gU0NSRUVOX1NDTkQpCSAgIFwKKwkJCWNvbnRpbnVlOwkJCQkJICAgXAorCQlp ZiAoIW9wdC5zaG93X2hpZGRlbiAmJiB0LnBpcGVzID09IFBJUEVfRFVBTCAmJgkJICAgXAorCQkg ICAgdC5zY3JlZW4gPT0gU0NSRUVOX09GRlNDUkVFTikJCQkgICBcCisJCQljb250aW51ZTsJCQkJ CSAgIFwKKwkJaWYgKCghb3B0LnNob3dfaGlkZGVuICYmIG9wdC5vbmx5X2ZlYXR1cmUgIT0gRkVB VFVSRV9OT05FKSBcCisJCSAgICAmJiB0LmZlYXR1cmUgPT0gRkVBVFVSRV9OT05FKQkJCSAgIFwK KwkJCWNvbnRpbnVlOworCisjZGVmaW5lIFRFU1RfTU9ERV9JVEVSX0VORCB9IH0gfSB9IH0gfQor CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0cnVjdCB0ZXN0X21vZGUg dDsKKwlzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQl7ICJuby1zdGF0dXMtY2hl Y2siLCAgICAgICAgICAwLCAwLCAncyd9LAorCQl7ICJuby1jcmMtY2hlY2siLCAgICAgICAgICAg ICAwLCAwLCAnYyd9LAorCQl7ICJuby1mYmMtY29tcHJlc3Npb24tY2hlY2siLCAwLCAwLCAnbyd9 LAorCQl7ICJuby1mYmMtYWN0aW9uLWNoZWNrIiwgICAgICAwLCAwLCAnYSd9LAorCQl7ICJuby1l ZHAiLCAgICAgICAgICAgICAgICAgICAwLCAwLCAnZSd9LAorCQl7ICJ1c2Utc21hbGwtbW9kZXMi LCAgICAgICAgICAwLCAwLCAnbSd9LAorCQl7ICJzaG93LWhpZGRlbiIsICAgICAgICAgICAgICAw LCAwLCAnaSd9LAorCQl7ICJzdGVwIiwgICAgICAgICAgICAgICAgICAgICAwLCAwLCAndCd9LAor CQl7ICJub3Atb25seSIsICAgICAgICAgICAgICAgICAwLCAwLCAnbid9LAorCQl7ICJmYmMtb25s eSIsICAgICAgICAgICAgICAgICAwLCAwLCAnZid9LAorCQl7ICJwc3Itb25seSIsICAgICAgICAg ICAgICAgICAwLCAwLCAncCd9LAorCQl7ICIxcC1vbmx5IiwgICAgICAgICAgICAgICAgICAwLCAw LCAnMSd9LAorCQl7ICIycC1vbmx5IiwgICAgICAgICAgICAgICAgICAwLCAwLCAnMid9LAorCQl7 IDAsIDAsIDAsIDAgfQorCX07CisKKwlpZ3Rfc3VidGVzdF9pbml0X3BhcnNlX29wdHMoJmFyZ2Ms IGFyZ3YsICIiLCBsb25nX29wdGlvbnMsIGhlbHBfc3RyLAorCQkJCSAgICBvcHRfaGFuZGxlciwg TlVMTCk7CisKKwlpZ3RfZml4dHVyZQorCQlzZXR1cF9lbnZpcm9ubWVudCgpOworCisJZm9yICh0 LmZlYXR1cmUgPSAwOyB0LmZlYXR1cmUgPCBGRUFUVVJFX0NPVU5UOyB0LmZlYXR1cmUrKykgewor CQlpZiAoKCFvcHQuc2hvd19oaWRkZW4gJiYgb3B0Lm9ubHlfZmVhdHVyZSAhPSBGRUFUVVJFX05P TkUpCisJCSAgICAmJiB0LmZlYXR1cmUgPT0gRkVBVFVSRV9OT05FKQorCQkJY29udGludWU7CisJ CWZvciAodC5waXBlcyA9IDA7IHQucGlwZXMgPCBQSVBFX0NPVU5UOyB0LnBpcGVzKyspIHsKKwkJ CXQuc2NyZWVuID0gU0NSRUVOX1BSSU07CisJCQl0LnBsYW5lID0gUExBTkVfUFJJOworCQkJdC5m YnMgPSBGQlNfU0lOR0xFOworCQkJLyogTWFrZSBzdXJlIG5vdGhpbmcgaXMgdXNpbmcgdGhpcyB2 YWx1ZS4gKi8KKwkJCXQubWV0aG9kID0gLTE7CisKKwkJCWlndF9zdWJ0ZXN0X2YoIiVzLSVzLXJ0 ZSIsCisJCQkJICAgICAgZmVhdHVyZV9zdHIodC5mZWF0dXJlKSwKKwkJCQkgICAgICBwaXBlc19z dHIodC5waXBlcykpCisJCQkJcnRlX3N1YnRlc3QoJnQpOworCQl9CisJfQorCisJVEVTVF9NT0RF X0lURVJfQkVHSU4odCkKKwkJaWd0X3N1YnRlc3RfZigiJXMtJXMtJXMtJXMtJXMtZHJhdy0lcyIs CisJCQkgICAgICBmZWF0dXJlX3N0cih0LmZlYXR1cmUpLAorCQkJICAgICAgcGlwZXNfc3RyKHQu cGlwZXMpLAorCQkJICAgICAgc2NyZWVuX3N0cih0LnNjcmVlbiksCisJCQkgICAgICBwbGFuZV9z dHIodC5wbGFuZSksCisJCQkgICAgICBmYnNfc3RyKHQuZmJzKSwKKwkJCSAgICAgIGlndF9kcmF3 X2dldF9tZXRob2RfbmFtZSh0Lm1ldGhvZCkpCisJCQlkcmF3X3N1YnRlc3QoJnQpOworCVRFU1Rf TU9ERV9JVEVSX0VORAorCisJVEVTVF9NT0RFX0lURVJfQkVHSU4odCkKKwkJaWYgKHQucGxhbmUg IT0gUExBTkVfUFJJKQorCQkJY29udGludWU7CisJCWlmICh0LnNjcmVlbiA9PSBTQ1JFRU5fT0ZG U0NSRUVOKQorCQkJY29udGludWU7CisJCWlmICghb3B0LnNob3dfaGlkZGVuICYmIHQubWV0aG9k ICE9IElHVF9EUkFXX0JMVCkKKwkJCWNvbnRpbnVlOworCisJCWlndF9zdWJ0ZXN0X2YoIiVzLSVz LSVzLSVzLWZsaXAtJXMiLAorCQkJICAgICAgZmVhdHVyZV9zdHIodC5mZWF0dXJlKSwKKwkJCSAg ICAgIHBpcGVzX3N0cih0LnBpcGVzKSwKKwkJCSAgICAgIHNjcmVlbl9zdHIodC5zY3JlZW4pLAor CQkJICAgICAgZmJzX3N0cih0LmZicyksCisJCQkgICAgICBpZ3RfZHJhd19nZXRfbWV0aG9kX25h bWUodC5tZXRob2QpKQorCQkJZmxpcF9zdWJ0ZXN0KCZ0KTsKKwlURVNUX01PREVfSVRFUl9FTkQK KworCVRFU1RfTU9ERV9JVEVSX0JFR0lOKHQpCisJCWlmICh0LnNjcmVlbiA9PSBTQ1JFRU5fT0ZG U0NSRUVOKQorCQkJY29udGludWU7CisJCWlmICh0Lm1ldGhvZCAhPSBJR1RfRFJBV19CTFQpCisJ CQljb250aW51ZTsKKwkJaWYgKHQucGxhbmUgPT0gUExBTkVfUFJJKQorCQkJY29udGludWU7CisK KwkJaWd0X3N1YnRlc3RfZigiJXMtJXMtJXMtJXMtJXMtbW92ZSIsCisJCQkgICAgICBmZWF0dXJl X3N0cih0LmZlYXR1cmUpLAorCQkJICAgICAgcGlwZXNfc3RyKHQucGlwZXMpLAorCQkJICAgICAg c2NyZWVuX3N0cih0LnNjcmVlbiksCisJCQkgICAgICBwbGFuZV9zdHIodC5wbGFuZSksCisJCQkg ICAgICBmYnNfc3RyKHQuZmJzKSkKKwkJCW1vdmVfc3VidGVzdCgmdCk7CisKKwkJaWd0X3N1YnRl c3RfZigiJXMtJXMtJXMtJXMtJXMtb25vZmYiLAorCQkJICAgICAgZmVhdHVyZV9zdHIodC5mZWF0 dXJlKSwKKwkJCSAgICAgIHBpcGVzX3N0cih0LnBpcGVzKSwKKwkJCSAgICAgIHNjcmVlbl9zdHIo dC5zY3JlZW4pLAorCQkJICAgICAgcGxhbmVfc3RyKHQucGxhbmUpLAorCQkJICAgICAgZmJzX3N0 cih0LmZicykpCisJCQlvbm9mZl9zdWJ0ZXN0KCZ0KTsKKwlURVNUX01PREVfSVRFUl9FTkQKKwor CVRFU1RfTU9ERV9JVEVSX0JFR0lOKHQpCisJCWlmICh0LnNjcmVlbiA9PSBTQ1JFRU5fT0ZGU0NS RUVOKQorCQkJY29udGludWU7CisJCWlmICh0Lm1ldGhvZCAhPSBJR1RfRFJBV19CTFQpCisJCQlj b250aW51ZTsKKwkJaWYgKHQucGxhbmUgIT0gUExBTkVfU1BSKQorCQkJY29udGludWU7CisKKwkJ aWd0X3N1YnRlc3RfZigiJXMtJXMtJXMtJXMtJXMtZnVsbHNjcmVlbiIsCisJCQkgICAgICBmZWF0 dXJlX3N0cih0LmZlYXR1cmUpLAorCQkJICAgICAgcGlwZXNfc3RyKHQucGlwZXMpLAorCQkJICAg ICAgc2NyZWVuX3N0cih0LnNjcmVlbiksCisJCQkgICAgICBwbGFuZV9zdHIodC5wbGFuZSksCisJ CQkgICAgICBmYnNfc3RyKHQuZmJzKSkKKwkJCWZ1bGxzY3JlZW5fcGxhbmVfc3VidGVzdCgmdCk7 CisJVEVTVF9NT0RFX0lURVJfRU5ECisKKwlURVNUX01PREVfSVRFUl9CRUdJTih0KQorCQlpZiAo dC5zY3JlZW4gIT0gU0NSRUVOX1BSSU0pCisJCQljb250aW51ZTsKKwkJaWYgKCFvcHQuc2hvd19o aWRkZW4gJiYgdC5mYnMgIT0gRkJTX1NJTkdMRSkKKwkJCWNvbnRpbnVlOworCisJCWlndF9zdWJ0 ZXN0X2YoIiVzLSVzLSVzLSVzLW11bHRpZHJhdy0lcyIsCisJCQkgICAgICBmZWF0dXJlX3N0cih0 LmZlYXR1cmUpLAorCQkJICAgICAgcGlwZXNfc3RyKHQucGlwZXMpLAorCQkJICAgICAgcGxhbmVf c3RyKHQucGxhbmUpLAorCQkJICAgICAgZmJzX3N0cih0LmZicyksCisJCQkgICAgICBpZ3RfZHJh d19nZXRfbWV0aG9kX25hbWUodC5tZXRob2QpKQorCQkJbXVsdGlkcmF3X3N1YnRlc3QoJnQpOwor CVRFU1RfTU9ERV9JVEVSX0VORAorCisJLyoKKwkgKiBUT0RPOiBpZGVhcyBmb3Igc3VidGVzdHM6 CisJICogLSBBZGQgYSBuZXcgZW51bSB0byBzdHJ1Y3QgdGVzdF9tb2RlIHRoYXQgYWxsb3dzIHVz IHRvIHNwZWNpZnkgdGhlCisJICogICBCUFAvZGVwdGggY29uZmlndXJhdGlvbi4KKwkgKi8KKwor CWlndF9maXh0dXJlCisJCXRlYXJkb3duX2Vudmlyb25tZW50KCk7CisKKwlpZ3RfZXhpdCgpOwor fQotLSAKMi4xLjQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9y ZwpodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4 Cg==