From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH i-g-t v9 7/9] tests/perf_pmu: Tests for i915 PMU API Date: Tue, 21 Nov 2017 19:36:30 +0000 Message-ID: <20171121193630.18089-1-tvrtko.ursulin@linux.intel.com> References: <20171121182125.16316-1-tvrtko.ursulin@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wr0-x241.google.com (mail-wr0-x241.google.com [IPv6:2a00:1450:400c:c0c::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3D7AB6E59A for ; Tue, 21 Nov 2017 19:36:44 +0000 (UTC) Received: by mail-wr0-x241.google.com with SMTP id w95so12379312wrc.2 for ; Tue, 21 Nov 2017 11:36:44 -0800 (PST) In-Reply-To: <20171121182125.16316-1-tvrtko.ursulin@linux.intel.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 RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KCkEgYnVuY2gg b2YgdGVzdHMgZm9yIHRoZSBuZXcgaTkxNSBQTVUgZmVhdHVyZS4KClBhcnRzIG9mIHRoZSBjb2Rl IHdlcmUgaW5pdGlhbHkgc2tldGNoZWQgYnkgRG1pdHJ5IFJvZ296aGtpbi4KCnYyOiAoTW9zdCBz dWdnZXN0aW9ucyBieSBDaHJpcyBXaWxzb24pCiAqIEFkZCBuZXcgY2xhc3MvaW5zdGFuY2UgYmFz ZWQgZW5naW5lIGxpc3QuCiAqIEFkZCBnZW1faGFzX2VuZ2luZS9nZW1fcmVxdWlyZV9lbmdpbmUg dG8gd29yayB3aXRoIGNsYXNzL2luc3RhbmNlLgogKiBVc2UgdGhlIGFib3ZlIHR3byB0aHJvdWdo b3V0IHRoZSB0ZXN0LgogKiBTaG9ydGVuIHRlc3RzIHRvIDEwMG1zIGJ1c3kgYmF0Y2hlcywgc2Vl bXMgZW5vdWdoLgogKiBBZGQgcXVldWVkIGNvdW50ZXIgc2FuaXR5IGNoZWNrcy4KICogVXNlIGln dF9uc2VjX2VsYXBzZWQuCiAqIFNraXAgb24gcGVyZiAtRU5PREVWIGluIHNvbWUgdGVzdHMgaW5z dGVhZCBvZiBlbWJlZGRpbmcga25vd2xlZGdlIGxvY2FsbHkuCiAqIEZpeCBtdWx0aSBvcmRlcmlu ZyBmb3IgYnVzeSBhY2NvdW50aW5nLgogKiBVc2UgbmV3IGd1cmFudGVlZF91c2xlZXAgd2hlbiBz bGVlcCB0aW1lIGlzIGFzc2VydGVkIG9uLgogKiBDaGVjayBmb3Igbm8gcXVldWVkIHdoZW4gaWRs ZS9idXN5LgogKiBBZGQgcXVldWVkIGNvdW50ZXIgaW5pdCB0ZXN0LgogKiBBZGQgcXVldWVkIHRl c3RzLgogKiBDb25zb2xpZGF0ZSBhbmQgaW5jcmVhc2UgbXVsdGlwbGUgYnVzeSBlbmdpbmVzIHRl c3RzIHRvIG1vc3QtYnVzeSBhbmQKICAgYWxsLWJ1c3kgdGVzdHMuCiAqIEd1YXJhbnR0ZSBpbnRl cnJ1cHRzIGJ5IHVzaW5nIGZlbmNlcy4KICogVGVzdCBSQzYgdmlhIGZvcmNld2FrZS4KCnYzOgog KiBUd2VhayBhc3NlcnQgaW4gaW50ZXJydXB0cyBzdWJ0ZXN0LgogKiBTcHJpbmtsZSBvZiBjb21t ZW50cy4KICogRml4IG11bHRpLWNsaWVudCB0ZXN0IHdoaWNoIGdvdCBicm9rZW4gaW4gdjIuCgp2 NDoKICogTWVhc3VyZWQgaW5zdGVhZCBvZiBndWFyYW50ZWVkIHNsZWVwLgogKiBNaXNzaW5nIHN5 bmMgaW4gbm9fc2VtYS4KICogTG9nIGJ1c3luZXNzIGJlZm9yZSBhc3NlcnRzIGZvciBkZWJ1Zy4K ICogYWNjZXNzKDIpIGluc3RlYWQgb2Ygb3BlbigyKSB0byBkZXRlcm1pbmUgaWYgY3B1MCBpcyBo b3RwbHVnZ2FibGUuCiAqIFRlc3QgZnJlcXVlbmN5IHJlcG9ydGluZyB2aWEgbWluL21heCBzZXR0 aW5nIGluc3RlYWQgYXNzdW1pbmcuCiAgIF5eIEFsbCBhYm92ZSBzdWdnZXN0ZWQgYnkgQ2hyaXMg V2lsc29uLiBeXgogKiBEcm9wIHF1ZXVlZCBzdWJ0ZXN0cyB0byBtYXRjaCBpOTE1LgogKiBVc2Ug bG9uZyBiYXRjaGVzIHdpdGggZmVuY2VzIHRvIGVuc3VyZSBpbnRlcnJ1cHRzLgogKiBUZXN0IHJl bmRlciBub2RlIGFzIHdlbGwuCgp2NToKICogQWRkIHRvIG1lc29uIGJ1aWxkLiAoUGV0cmkgTGF0 dmFsYSkKICogVXNlIDFlTiBjb25zdGFudHMuIChDaHJpcyBXaWxzb24pCiAqIEFkZCB0ZXN0cyBm b3Igc2VtYXBob3JlIGFuZCBldmVudCB3YWl0aW5nLgoKdjY6CiAqIEZpeCBpbnRlcnJ1cHRzIHN1 YnRlc3QgYnkgcG9sbGluZyB0aGUgZmVuY2UgZnJvbSB0aGUgIm91dHNpZGUiLgogICAoQ2hyaXMg V2lsc29uKQoKdjc6CiAqIEFzc2VydCBudW1iZXIgb2YgaW5pdGlhbGl6ZWQgZW5naW5lcyBtYXRj aGVzIHRoZSBleHBlY3RhdGlvbi4KICAgKENocmlzIFdpbHNvbikKICogV2FybiBpbnN0ZWFkIG9m IHNraXBwaW5nIGlmIHdlIGNvdWxkbid0IHJlc3RvcmUgdGhlIGluaXRpYWwKICAgZnJlcXVlbmN5 LiAoQ2hyaXMgV2lsc29uKQogKiBNb3ZlIGFsbCBhc3NlcnRzIHRvIGFmdGVyIHRoZSB0ZXN0IGNs ZWFudXAgKGp1c3QgYSB0aWR5KS4KICogTW9yZSAxZU4gbm90YXRpb24gZm9yIHRpbWVvdXRzLgog KiBCdW1wIHRoZSB0b2xlcmFuY2UgdG8gNSUgc2luY2UgSSBzYXcgYSBmZXcgbm9pc3kgcnVucyB3 aXRoCiAgIHNhbXBsaW5nIGNvdW50ZXJzLgogKiBBbHdheXMgc3RhcnQgdGhlIFBNVSBiZWZvcmUg c3VibWl0dGluZyBiYXRjaGVzIHRvIGxvd2VyCiAgIHJlbGlhbmNlIG9uIGk5MTUgZG9pbmcgdGhl IGRlbGF5ZWQgZW5naW5lIGJ1c3kgc3RhdHMgZGlzYWJsZS4KCnY4OgogKiBVcGRhdGUgZm9yIHVw c3RyZWFtIGVuZ2luZSBjbGFzcyBlbnVtLgoKdjk6CiAqIEFkZCBtZXNvbiBidWlsZCBzdXBwb3J0 LgoKU2lnbmVkLW9mZi1ieTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNv bT4KQ2M6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgpDYzogRG1pdHJ5 IFJvZ296aGtpbiA8ZG1pdHJ5LnYucm9nb3poa2luQGludGVsLmNvbT4KUmV2aWV3ZWQtYnk6IENo cmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPiAodjgpCi0tLQogbGliL2lndF9n dC5jICAgICAgICAgICB8ICAgNTAgKysKIGxpYi9pZ3RfZ3QuaCAgICAgICAgICAgfCAgIDM4ICsr CiBsaWIvaWd0X3BlcmYuaCAgICAgICAgIHwgICAgOSArLQogdGVzdHMvTWFrZWZpbGUuYW0gICAg ICB8ICAgIDEgKwogdGVzdHMvTWFrZWZpbGUuc291cmNlcyB8ICAgIDEgKwogdGVzdHMvbWVzb24u YnVpbGQgICAgICB8ICAgIDYgKwogdGVzdHMvcGVyZl9wbXUuYyAgICAgICB8IDEyNDIgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiA3IGZpbGVzIGNoYW5n ZWQsIDEzMzkgaW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0 NCB0ZXN0cy9wZXJmX3BtdS5jCgpkaWZmIC0tZ2l0IGEvbGliL2lndF9ndC5jIGIvbGliL2lndF9n dC5jCmluZGV4IDg5NzI3ZDIyZGQ1Yy4uNjNhMDY2MTFmMTZkIDEwMDY0NAotLS0gYS9saWIvaWd0 X2d0LmMKKysrIGIvbGliL2lndF9ndC5jCkBAIC02MDgsMyArNjA4LDUzIEBAIGJvb2wgZ2VtX2Nh bl9zdG9yZV9kd29yZChpbnQgZmQsIHVuc2lnbmVkIGludCBlbmdpbmUpCiAKIAlyZXR1cm4gdHJ1 ZTsKIH0KKworY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyIGludGVsX2V4ZWN1 dGlvbl9lbmdpbmVzMltdID0geworCXsgInJjczAiLCBJOTE1X0VOR0lORV9DTEFTU19SRU5ERVIs IDAgfSwKKwl7ICJiY3MwIiwgSTkxNV9FTkdJTkVfQ0xBU1NfQ09QWSwgMCB9LAorCXsgInZjczAi LCBJOTE1X0VOR0lORV9DTEFTU19WSURFTywgMCB9LAorCXsgInZjczEiLCBJOTE1X0VOR0lORV9D TEFTU19WSURFTywgMSB9LAorCXsgInZlY3MwIiwgSTkxNV9FTkdJTkVfQ0xBU1NfVklERU9fRU5I QU5DRSwgMCB9LAorfTsKKwordW5zaWduZWQgaW50CitnZW1fY2xhc3NfaW5zdGFuY2VfdG9fZWJf ZmxhZ3MoaW50IGdlbV9mZCwKKwkJCSAgICAgICBlbnVtIGRybV9pOTE1X2dlbV9lbmdpbmVfY2xh c3MgY2xhc3MsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGluc3RhbmNlKQoreworCWlmIChjbGFz cyAhPSBJOTE1X0VOR0lORV9DTEFTU19WSURFTykKKwkJaWd0X2Fzc2VydChpbnN0YW5jZSA9PSAw KTsKKwllbHNlCisJCWlndF9hc3NlcnQoaW5zdGFuY2UgPj0gMCAmJiBpbnN0YW5jZSA8PSAxKTsK KworCXN3aXRjaCAoY2xhc3MpIHsKKwljYXNlIEk5MTVfRU5HSU5FX0NMQVNTX1JFTkRFUjoKKwkJ cmV0dXJuIEk5MTVfRVhFQ19SRU5ERVI7CisJY2FzZSBJOTE1X0VOR0lORV9DTEFTU19DT1BZOgor CQlyZXR1cm4gSTkxNV9FWEVDX0JMVDsKKwljYXNlIEk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPOgor CQlpZiAoaW5zdGFuY2UgPT0gMCkgeworCQkJaWYgKGdlbV9oYXNfYnNkMihnZW1fZmQpKQorCQkJ CXJldHVybiBJOTE1X0VYRUNfQlNEIHwgSTkxNV9FWEVDX0JTRF9SSU5HMTsKKwkJCWVsc2UKKwkJ CQlyZXR1cm4gSTkxNV9FWEVDX0JTRDsKKworCQl9IGVsc2UgeworCQkJcmV0dXJuIEk5MTVfRVhF Q19CU0QgfCBJOTE1X0VYRUNfQlNEX1JJTkcyOworCQl9CisJY2FzZSBJOTE1X0VOR0lORV9DTEFT U19WSURFT19FTkhBTkNFOgorCQlyZXR1cm4gSTkxNV9FWEVDX1ZFQk9YOworCWNhc2UgSTkxNV9F TkdJTkVfQ0xBU1NfSU5WQUxJRDoKKwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0KDApOworCX07Cit9 CisKK2Jvb2wgZ2VtX2hhc19lbmdpbmUoaW50IGdlbV9mZCwKKwkJICAgIGVudW0gZHJtX2k5MTVf Z2VtX2VuZ2luZV9jbGFzcyBjbGFzcywKKwkJICAgIHVuc2lnbmVkIGludCBpbnN0YW5jZSkKK3sK KwlyZXR1cm4gZ2VtX2hhc19yaW5nKGdlbV9mZCwKKwkJCSAgICBnZW1fY2xhc3NfaW5zdGFuY2Vf dG9fZWJfZmxhZ3MoZ2VtX2ZkLCBjbGFzcywKKwkJCQkJCQkgICBpbnN0YW5jZSkpOworfQpkaWZm IC0tZ2l0IGEvbGliL2lndF9ndC5oIGIvbGliL2lndF9ndC5oCmluZGV4IDI1NzljYmQzN2JlNy4u NDhlZDQ4YWY4MTE3IDEwMDY0NAotLS0gYS9saWIvaWd0X2d0LmgKKysrIGIvbGliL2lndF9ndC5o CkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIElHVF9HVF9ICiAKICNpbmNsdWRlICJpZ3RfZGVi dWdmcy5oIgorI2luY2x1ZGUgImlndF9jb3JlLmgiCiAKIHZvaWQgaWd0X3JlcXVpcmVfaGFuZ19y aW5nKGludCBmZCwgaW50IHJpbmcpOwogCkBAIC04MCw0ICs4MSw0MSBAQCBleHRlcm4gY29uc3Qg c3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUgewogCiBib29sIGdlbV9jYW5fc3RvcmVfZHdv cmQoaW50IGZkLCB1bnNpZ25lZCBpbnQgZW5naW5lKTsKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBp bnRlbF9leGVjdXRpb25fZW5naW5lMiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgY2xhc3M7 CisJaW50IGluc3RhbmNlOworfSBpbnRlbF9leGVjdXRpb25fZW5naW5lczJbXTsKKworI2RlZmlu ZSBmb3JfZWFjaF9lbmdpbmVfY2xhc3NfaW5zdGFuY2UoZmRfXywgZV9fKSBcCisJZm9yICgoZV9f KSA9IGludGVsX2V4ZWN1dGlvbl9lbmdpbmVzMjtcCisJICAgICAoZV9fKS0+bmFtZTsgXAorCSAg ICAgKGVfXykrKykKKworZW51bSBkcm1faTkxNV9nZW1fZW5naW5lX2NsYXNzIHsKKwlJOTE1X0VO R0lORV9DTEFTU19SRU5ERVIgCT0gMCwKKwlJOTE1X0VOR0lORV9DTEFTU19DT1BZCQk9IDEsCisJ STkxNV9FTkdJTkVfQ0xBU1NfVklERU8JCT0gMiwKKwlJOTE1X0VOR0lORV9DTEFTU19WSURFT19F TkhBTkNFCT0gMywKKworCUk5MTVfRU5HSU5FX0NMQVNTX0lOVkFMSUQJPSAtMQorfTsKKwordW5z aWduZWQgaW50CitnZW1fY2xhc3NfaW5zdGFuY2VfdG9fZWJfZmxhZ3MoaW50IGdlbV9mZCwKKwkJ CSAgICAgICBlbnVtIGRybV9pOTE1X2dlbV9lbmdpbmVfY2xhc3MgY2xhc3MsCisJCQkgICAgICAg dW5zaWduZWQgaW50IGluc3RhbmNlKTsKKworYm9vbCBnZW1faGFzX2VuZ2luZShpbnQgZ2VtX2Zk LAorCQkgICAgZW51bSBkcm1faTkxNV9nZW1fZW5naW5lX2NsYXNzIGNsYXNzLAorCQkgICAgdW5z aWduZWQgaW50IGluc3RhbmNlKTsKKworc3RhdGljIGlubGluZQordm9pZCBnZW1fcmVxdWlyZV9l bmdpbmUoaW50IGdlbV9mZCwKKwkJCWVudW0gZHJtX2k5MTVfZ2VtX2VuZ2luZV9jbGFzcyBjbGFz cywKKwkJCXVuc2lnbmVkIGludCBpbnN0YW5jZSkKK3sKKwlpZ3RfcmVxdWlyZShnZW1faGFzX2Vu Z2luZShnZW1fZmQsIGNsYXNzLCBpbnN0YW5jZSkpOworfQorCiAjZW5kaWYgLyogSUdUX0dUX0gg Ki8KZGlmZiAtLWdpdCBhL2xpYi9pZ3RfcGVyZi5oIGIvbGliL2lndF9wZXJmLmgKaW5kZXggOTM4 ZDU0ODg5MWM1Li41NDI4ZmViMGM3NDYgMTAwNjQ0Ci0tLSBhL2xpYi9pZ3RfcGVyZi5oCisrKyBi L2xpYi9pZ3RfcGVyZi5oCkBAIC0yOSwxNCArMjksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGVy Zl9ldmVudC5oPgogCi1lbnVtIGRybV9pOTE1X2dlbV9lbmdpbmVfY2xhc3MgewotCUk5MTVfRU5H SU5FX0NMQVNTX1JFTkRFUiAJPSAwLAotCUk5MTVfRU5HSU5FX0NMQVNTX0NPUFkJCT0gMSwKLQlJ OTE1X0VOR0lORV9DTEFTU19WSURFTwkJPSAyLAotCUk5MTVfRU5HSU5FX0NMQVNTX1ZJREVPX0VO SEFOQ0UJPSAzLAotCi0JSTkxNV9FTkdJTkVfQ0xBU1NfSU5WQUxJRAk9IC0xCi19OworI2luY2x1 ZGUgImlndF9ndC5oIgogCiBlbnVtIGRybV9pOTE1X3BtdV9lbmdpbmVfc2FtcGxlIHsKIAlJOTE1 X1NBTVBMRV9CVVNZID0gMCwKZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLmFtIGIvdGVzdHMv TWFrZWZpbGUuYW0KaW5kZXggZGIzNjA1MjNkYWQ2Li4xYmMxYzU3YTc0NTIgMTAwNjQ0Ci0tLSBh L3Rlc3RzL01ha2VmaWxlLmFtCisrKyBiL3Rlc3RzL01ha2VmaWxlLmFtCkBAIC0xMzEsNiArMTMx LDcgQEAgZ2VuN19mb3JjZXdha2VfbXRfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoVEhSRUFEX0NG TEFHUykKIGdlbjdfZm9yY2V3YWtlX210X0xEQUREID0gJChMREFERCkgLWxwdGhyZWFkCiBnZW1f dXNlcnB0cl9ibGl0c19DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChUSFJFQURfQ0ZMQUdTKQogZ2Vt X3VzZXJwdHJfYmxpdHNfTERBREQgPSAkKExEQUREKSAtbHB0aHJlYWQKK3BlcmZfcG11X0xEQURE ID0gJChMREFERCkgJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJpZ3RfcGVyZi5sYQogCiBnZW1fd2Fp dF9MREFERCA9ICQoTERBREQpIC1scnQKIGttc19mbGlwX0xEQUREID0gJChMREFERCkgLWxydCAt bHB0aHJlYWQKZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMgYi90ZXN0cy9NYWtl ZmlsZS5zb3VyY2VzCmluZGV4IDIzMTNjMTJiNTA4Yy4uMmMyMjI0MmUwMTEzIDEwMDY0NAotLS0g YS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCisrKyBiL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKQEAg LTIxNSw2ICsyMTUsNyBAQCBURVNUU19wcm9ncyA9IFwKIAlrbXNfdmJsYW5rIFwKIAltZXRhX3Rl c3QgXAogCXBlcmYgXAorCXBlcmZfcG11IFwKIAlwbV9iYWNrbGlnaHQgXAogCXBtX2xwc3AgXAog CXBtX3JjNl9yZXNpZGVuY3kgXApkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzb24uYnVpbGQgYi90ZXN0 cy9tZXNvbi5idWlsZAppbmRleCAyMGZmNzlkY2IxNWYuLmVjZTRjZWFlZmJiNiAxMDA2NDQKLS0t IGEvdGVzdHMvbWVzb24uYnVpbGQKKysrIGIvdGVzdHMvbWVzb24uYnVpbGQKQEAgLTE5NSw2ICsx OTUsNyBAQCB0ZXN0X3Byb2dzID0gWwogCSdrbXNfdmJsYW5rJywKIAknbWV0YV90ZXN0JywKIAkn cGVyZicsCisJJ3BlcmZfcG11JywKIAkncG1fYmFja2xpZ2h0JywKIAkncG1fbHBzcCcsCiAJJ3Bt X3JjNl9yZXNpZGVuY3knLApAQCAtMjY2LDkgKzI2NywxNCBAQCBlbmRpZgogbGliZXhlY2RpciA9 IGpvaW5fcGF0aHMoZ2V0X29wdGlvbigncHJlZml4JyksIGdldF9vcHRpb24oJ2xpYmV4ZWNkaXIn KSwgJ2ludGVsLWdwdS10b29scycpCiAKIGZvcmVhY2ggcHJvZyA6IHRlc3RfcHJvZ3MKKwlsaW5r ID0gW10KKwlpZiBwcm9nID09ICdwZXJmX3BtdScKKwkJbGluayArPSBsaWJfaWd0X3BlcmYKKwll bmRpZgogCWV4ZWN1dGFibGUocHJvZywgcHJvZyArICcuYycsCiAJCSAgIGRlcGVuZGVuY2llcyA6 IHRlc3RfZGVwcywKIAkJICAgaW5zdGFsbF9kaXIgOiBsaWJleGVjZGlyLAorCQkgICBsaW5rX3dp dGggOiBsaW5rLAogCQkgICBpbnN0YWxsIDogdHJ1ZSkKIGVuZGZvcmVhY2gKIApkaWZmIC0tZ2l0 IGEvdGVzdHMvcGVyZl9wbXUuYyBiL3Rlc3RzL3BlcmZfcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAwLi44NTg1ZWQ3YmNlZTgKLS0tIC9kZXYvbnVsbAorKysgYi90 ZXN0cy9wZXJmX3BtdS5jCkBAIC0wLDAgKzEsMTI0MiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAy MDE3IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRl ZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2Yg dGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNv ZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9u LCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29w eSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFu ZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0 byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRv IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5v dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBw YXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwg cG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJP VklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgor ICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBP RiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB TkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9S IENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9U SEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JU IE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04g V0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhF IFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3Rk aW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUg PGludHR5cGVzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgor I2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjaW5jbHVkZSA8 c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lu Y2x1ZGUgPHBvbGwuaD4KKworI2luY2x1ZGUgImlndC5oIgorI2luY2x1ZGUgImlndF9jb3JlLmgi CisjaW5jbHVkZSAiaWd0X3BlcmYuaCIKKyNpbmNsdWRlICJpZ3Rfc3lzZnMuaCIKKworSUdUX1RF U1RfREVTQ1JJUFRJT04oIlRlc3QgdGhlIGk5MTUgcG11IHBlcmYgaW50ZXJmYWNlIik7CisKK2Nv bnN0IGRvdWJsZSB0b2xlcmFuY2UgPSAwLjA1ZjsKK2NvbnN0IHVuc2lnbmVkIGxvbmcgYmF0Y2hf ZHVyYXRpb25fbnMgPSAxMDBlNjsKKworc3RhdGljIGludCBvcGVuX3BtdSh1aW50NjRfdCBjb25m aWcpCit7CisJaW50IGZkOworCisJZmQgPSBwZXJmX2k5MTVfb3Blbihjb25maWcpOworCWlndF9y ZXF1aXJlKGZkID49IDAgfHwgKGZkIDwgMCAmJiBlcnJubyAhPSBFTk9ERVYpKTsKKwlpZ3RfYXNz ZXJ0KGZkID49IDApOworCisJcmV0dXJuIGZkOworfQorCitzdGF0aWMgaW50IG9wZW5fZ3JvdXAo dWludDY0X3QgY29uZmlnLCBpbnQgZ3JvdXApCit7CisJaW50IGZkOworCisJZmQgPSBwZXJmX2k5 MTVfb3Blbl9ncm91cChjb25maWcsIGdyb3VwKTsKKwlpZ3RfcmVxdWlyZShmZCA+PSAwIHx8IChm ZCA8IDAgJiYgZXJybm8gIT0gRU5PREVWKSk7CisJaWd0X2Fzc2VydChmZCA+PSAwKTsKKworCXJl dHVybiBmZDsKK30KKworc3RhdGljIHZvaWQKK2luaXQoaW50IGdlbV9mZCwgY29uc3Qgc3RydWN0 IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplLCB1aW50OF90IHNhbXBsZSkKK3sKKwlpbnQgZmQ7 CisKKwlmZCA9IG9wZW5fcG11KF9fSTkxNV9QTVVfRU5HSU5FKGUtPmNsYXNzLCBlLT5pbnN0YW5j ZSwgc2FtcGxlKSk7CisKKwljbG9zZShmZCk7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBwbXVfcmVh ZF9zaW5nbGUoaW50IGZkKQoreworCXVpbnQ2NF90IGRhdGFbMl07CisKKwlpZ3RfYXNzZXJ0X2Vx KHJlYWQoZmQsIGRhdGEsIHNpemVvZihkYXRhKSksIHNpemVvZihkYXRhKSk7CisKKwlyZXR1cm4g ZGF0YVswXTsKK30KKworc3RhdGljIHZvaWQgcG11X3JlYWRfbXVsdGkoaW50IGZkLCB1bnNpZ25l ZCBpbnQgbnVtLCB1aW50NjRfdCAqdmFsKQoreworCXVpbnQ2NF90IGJ1ZlsyICsgbnVtXTsKKwl1 bnNpZ25lZCBpbnQgaTsKKworCWlndF9hc3NlcnRfZXEocmVhZChmZCwgYnVmLCBzaXplb2YoYnVm KSksIHNpemVvZihidWYpKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJdmFsW2ld ID0gYnVmWzIgKyBpXTsKK30KKworI2RlZmluZSBhc3NlcnRfd2l0aGluX2Vwc2lsb24oeCwgcmVm LCB0b2xlcmFuY2UpIFwKKwlpZ3RfYXNzZXJ0X2YoKGRvdWJsZSkoeCkgPD0gKDEuMCArIHRvbGVy YW5jZSkgKiAoZG91YmxlKXJlZiAmJiBcCisJCSAgICAgKGRvdWJsZSkoeCkgPj0gKDEuMCAtIHRv bGVyYW5jZSkgKiAoZG91YmxlKXJlZiwgXAorCQkgICAgICInJXMnICE9ICclcycgKCVmIG5vdCB3 aXRoaW4gJWYlJSB0b2xlcmFuY2Ugb2YgJWYpXG4iLFwKKwkJICAgICAjeCwgI3JlZiwgKGRvdWJs ZSl4LCB0b2xlcmFuY2UgKiAxMDAuMCwgKGRvdWJsZSlyZWYpCisKKy8qCisgKiBIZWxwZXIgZm9y IGNhc2VzIHdoZXJlIHdlIGFzc2VydCBvbiB0aW1lIHNwZW50IHNsZWVwaW5nIChkaXJlY3RseSBv cgorICogaW5kaXJlY3RseSksIHNvIG1ha2UgaXQgbW9yZSByb2J1c3QgYnkgZW5zdXJpbmcgdGhl IHN5c3RlbSBzbGVlcCB0aW1lCisgKiBpcyB3aXRoaW4gdGVzdCB0b2xlcmFuY2UgdG8gc3RhcnQg d2l0aC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtZWFzdXJlZF91c2xlZXAodW5zaWduZWQg aW50IHVzZWMpCit7CisJdWludDY0X3Qgc2xlcHQgPSAwOworCisJd2hpbGUgKHVzZWMgPiAwKSB7 CisJCXN0cnVjdCB0aW1lc3BlYyBzdGFydCA9IHsgfTsKKwkJdWludDY0X3QgdGhpc19zbGVlcDsK KworCQlpZ3RfbnNlY19lbGFwc2VkKCZzdGFydCk7CisJCXVzbGVlcCh1c2VjKTsKKwkJdGhpc19z bGVlcCA9IGlndF9uc2VjX2VsYXBzZWQoJnN0YXJ0KTsKKwkJc2xlcHQgKz0gdGhpc19zbGVlcDsK KwkJaWYgKHRoaXNfc2xlZXAgPiB1c2VjICogMTAwMCkKKwkJCWJyZWFrOworCQl1c2VjIC09IHRo aXNfc2xlZXA7CisJfQorCisJcmV0dXJuIHNsZXB0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50 IGUycmluZyhpbnQgZ2VtX2ZkLCBjb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIg KmUpCit7CisJcmV0dXJuIGdlbV9jbGFzc19pbnN0YW5jZV90b19lYl9mbGFncyhnZW1fZmQsIGUt PmNsYXNzLCBlLT5pbnN0YW5jZSk7Cit9CisKK3N0YXRpYyB2b2lkCitzaW5nbGUoaW50IGdlbV9m ZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplLCBib29sIGJ1c3kpCit7 CisJZG91YmxlIHJlZiA9IGJ1c3kgPyBiYXRjaF9kdXJhdGlvbl9ucyA6IDAuMGY7CisJaWd0X3Nw aW5fdCAqc3BpbjsKKwl1aW50NjRfdCB2YWw7CisJaW50IGZkOworCisJZmQgPSBvcGVuX3BtdShJ OTE1X1BNVV9FTkdJTkVfQlVTWShlLT5jbGFzcywgZS0+aW5zdGFuY2UpKTsKKworCWlmIChidXN5 KSB7CisJCXNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBlMnJpbmcoZ2VtX2Zk LCBlKSwgMCk7CisJCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW4sIGJhdGNoX2R1cmF0 aW9uX25zKTsKKwl9IGVsc2UgeworCQl1c2xlZXAoYmF0Y2hfZHVyYXRpb25fbnMgLyAxMDAwKTsK Kwl9CisKKwlpZiAoYnVzeSkKKwkJZ2VtX3N5bmMoZ2VtX2ZkLCBzcGluLT5oYW5kbGUpOworCisJ dmFsID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKworCWlmIChidXN5KQorCQlpZ3Rfc3Bpbl9iYXRj aF9mcmVlKGdlbV9mZCwgc3Bpbik7CisJY2xvc2UoZmQpOworCisJYXNzZXJ0X3dpdGhpbl9lcHNp bG9uKHZhbCwgcmVmLCB0b2xlcmFuY2UpOworfQorCitzdGF0aWMgdm9pZCBsb2dfYnVzeShpbnQg ZmQsIHVuc2lnbmVkIGludCBudW1fZW5naW5lcywgdWludDY0X3QgKnZhbCkKK3sKKwljaGFyIGJ1 ZlsxMDI0XTsKKwlpbnQgcmVtID0gc2l6ZW9mKGJ1Zik7CisJdW5zaWduZWQgaW50IGk7CisJY2hh ciAqcCA9IGJ1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZW5naW5lczsgaSsrKSB7CisJCWlu dCBsZW47CisKKwkJbGVuID0gc25wcmludGYocCwgcmVtLCAiJXU9JSIgUFJJdTY0ICJcbiIsICBp LCB2YWxbaV0pOworCQlpZ3RfYXNzZXJ0KGxlbiA+IDApOworCQlyZW0gLT0gbGVuOworCQlwICs9 IGxlbjsKKwl9CisKKwlpZ3RfaW5mbygiJXMiLCBidWYpOworfQorCitzdGF0aWMgdm9pZAorYnVz eV9jaGVja19hbGwoaW50IGdlbV9mZCwgY29uc3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdp bmUyICplLAorCSAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbnVtX2VuZ2luZXMpCit7CisJY29u c3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplXzsKKwl1aW50NjRfdCB2YWxbbnVt X2VuZ2luZXNdOworCWludCBmZFtudW1fZW5naW5lc107CisJaWd0X3NwaW5fdCAqc3BpbjsKKwl1 bnNpZ25lZCBpbnQgYnVzeV9pZHgsIGk7CisKKwlpID0gMDsKKwlmZFswXSA9IC0xOworCWZvcl9l YWNoX2VuZ2luZV9jbGFzc19pbnN0YW5jZShmZCwgZV8pIHsKKwkJaWYgKCFnZW1faGFzX2VuZ2lu ZShnZW1fZmQsIGVfLT5jbGFzcywgZV8tPmluc3RhbmNlKSkKKwkJCWNvbnRpbnVlOworCQllbHNl IGlmIChlID09IGVfKQorCQkJYnVzeV9pZHggPSBpOworCisJCWZkW2krK10gPSBvcGVuX2dyb3Vw KEk5MTVfUE1VX0VOR0lORV9CVVNZKGVfLT5jbGFzcywKKwkJCQkJCQkgIGVfLT5pbnN0YW5jZSks CisJCQkJICAgICBmZFswXSk7CisJfQorCisJaWd0X2Fzc2VydF9lcShpLCBudW1fZW5naW5lcyk7 CisKKwlzcGluID0gaWd0X3NwaW5fYmF0Y2hfbmV3KGdlbV9mZCwgMCwgZTJyaW5nKGdlbV9mZCwg ZSksIDApOworCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW4sIGJhdGNoX2R1cmF0aW9u X25zKTsKKworCWdlbV9zeW5jKGdlbV9mZCwgc3Bpbi0+aGFuZGxlKTsKKworCXBtdV9yZWFkX211 bHRpKGZkWzBdLCBudW1fZW5naW5lcywgdmFsKTsKKwlsb2dfYnVzeShmZFswXSwgbnVtX2VuZ2lu ZXMsIHZhbCk7CisKKwlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7CisJY2xvc2Uo ZmRbMF0pOworCisJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFtidXN5X2lkeF0sIGJhdGNoX2R1 cmF0aW9uX25zLCB0b2xlcmFuY2UpOworCWZvciAoaSA9IDA7IGkgPCBudW1fZW5naW5lczsgaSsr KSB7CisJCWlmIChpID09IGJ1c3lfaWR4KQorCQkJY29udGludWU7CisJCWFzc2VydF93aXRoaW5f ZXBzaWxvbih2YWxbaV0sIDAuMGYsIHRvbGVyYW5jZSk7CisJfQorCit9CisKK3N0YXRpYyB2b2lk Cittb3N0X2J1c3lfY2hlY2tfYWxsKGludCBnZW1fZmQsIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVj dXRpb25fZW5naW5lMiAqZSwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGludCBudW1fZW5naW5lcykK K3sKKwljb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmVfOworCXVpbnQ2NF90 IHZhbFtudW1fZW5naW5lc107CisJaW50IGZkW251bV9lbmdpbmVzXTsKKwlpZ3Rfc3Bpbl90ICpz cGluW251bV9lbmdpbmVzXTsKKwl1bnNpZ25lZCBpbnQgaWRsZV9pZHgsIGk7CisKKwlnZW1fcmVx dWlyZV9lbmdpbmUoZ2VtX2ZkLCBlLT5jbGFzcywgZS0+aW5zdGFuY2UpOworCisJaSA9IDA7CisJ ZmRbMF0gPSAtMTsKKwlmb3JfZWFjaF9lbmdpbmVfY2xhc3NfaW5zdGFuY2UoZmQsIGVfKSB7CisJ CWlmICghZ2VtX2hhc19lbmdpbmUoZ2VtX2ZkLCBlXy0+Y2xhc3MsIGVfLT5pbnN0YW5jZSkpCisJ CQljb250aW51ZTsKKworCQlmZFtpXSA9IG9wZW5fZ3JvdXAoSTkxNV9QTVVfRU5HSU5FX0JVU1ko ZV8tPmNsYXNzLAorCQkJCQkJCWVfLT5pbnN0YW5jZSksCisJCQkJICAgZmRbMF0pOworCisJCWlm IChlID09IGVfKSB7CisJCQlpZGxlX2lkeCA9IGk7CisJCX0gZWxzZSB7CisJCQlzcGluW2ldID0g aWd0X3NwaW5fYmF0Y2hfbmV3KGdlbV9mZCwgMCwKKwkJCQkJCSAgICAgZTJyaW5nKGdlbV9mZCwg ZV8pLCAwKTsKKwkJCWlndF9zcGluX2JhdGNoX3NldF90aW1lb3V0KHNwaW5baV0sIGJhdGNoX2R1 cmF0aW9uX25zKTsKKwkJfQorCisJCWkrKzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Vu Z2luZXM7IGkrKykgeworCQlpZiAoaSAhPSBpZGxlX2lkeCkKKwkJCWdlbV9zeW5jKGdlbV9mZCwg c3BpbltpXS0+aGFuZGxlKTsKKwl9CisKKwlwbXVfcmVhZF9tdWx0aShmZFswXSwgbnVtX2VuZ2lu ZXMsIHZhbCk7CisJbG9nX2J1c3koZmRbMF0sIG51bV9lbmdpbmVzLCB2YWwpOworCisJZm9yIChp ID0gMDsgaSA8IG51bV9lbmdpbmVzOyBpKyspIHsKKwkJaWYgKGkgIT0gaWRsZV9pZHgpCisJCQlp Z3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3BpbltpXSk7CisJfQorCWNsb3NlKGZkWzBdKTsK KworCWZvciAoaSA9IDA7IGkgPCBudW1fZW5naW5lczsgaSsrKSB7CisJCWlmIChpID09IGlkbGVf aWR4KQorCQkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFtpXSwgMC4wZiwgdG9sZXJhbmNlKTsK KwkJZWxzZQorCQkJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFtpXSwgYmF0Y2hfZHVyYXRpb25f bnMsCisJCQkJCSAgICAgIHRvbGVyYW5jZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWxsX2J1 c3lfY2hlY2tfYWxsKGludCBnZW1fZmQsIGNvbnN0IHVuc2lnbmVkIGludCBudW1fZW5naW5lcykK K3sKKwljb25zdCBzdHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmU7CisJdWludDY0X3Qg dmFsW251bV9lbmdpbmVzXTsKKwlpbnQgZmRbbnVtX2VuZ2luZXNdOworCWlndF9zcGluX3QgKnNw aW5bbnVtX2VuZ2luZXNdOworCXVuc2lnbmVkIGludCBpOworCisJaSA9IDA7CisJZmRbMF0gPSAt MTsKKwlmb3JfZWFjaF9lbmdpbmVfY2xhc3NfaW5zdGFuY2UoZmQsIGUpIHsKKwkJaWYgKCFnZW1f aGFzX2VuZ2luZShnZW1fZmQsIGUtPmNsYXNzLCBlLT5pbnN0YW5jZSkpCisJCQljb250aW51ZTsK KworCQlmZFtpXSA9IG9wZW5fZ3JvdXAoSTkxNV9QTVVfRU5HSU5FX0JVU1koZS0+Y2xhc3MsIGUt Pmluc3RhbmNlKSwKKwkJCQkgICBmZFswXSk7CisKKwkJc3BpbltpXSA9IGlndF9zcGluX2JhdGNo X25ldyhnZW1fZmQsIDAsIGUycmluZyhnZW1fZmQsIGUpLCAwKTsKKwkJaWd0X3NwaW5fYmF0Y2hf c2V0X3RpbWVvdXQoc3BpbltpXSwgYmF0Y2hfZHVyYXRpb25fbnMpOworCisJCWkrKzsKKwl9CisK Kwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VuZ2luZXM7IGkrKykKKwkJZ2VtX3N5bmMoZ2VtX2ZkLCBz cGluW2ldLT5oYW5kbGUpOworCisJcG11X3JlYWRfbXVsdGkoZmRbMF0sIG51bV9lbmdpbmVzLCB2 YWwpOworCWxvZ19idXN5KGZkWzBdLCBudW1fZW5naW5lcywgdmFsKTsKKworCWZvciAoaSA9IDA7 IGkgPCBudW1fZW5naW5lczsgaSsrKQorCQlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bp bltpXSk7CisJY2xvc2UoZmRbMF0pOworCisJZm9yIChpID0gMDsgaSA8IG51bV9lbmdpbmVzOyBp KyspCisJCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbaV0sIGJhdGNoX2R1cmF0aW9uX25zLCB0 b2xlcmFuY2UpOworfQorCitzdGF0aWMgdm9pZAorbm9fc2VtYShpbnQgZ2VtX2ZkLCBjb25zdCBz dHJ1Y3QgaW50ZWxfZXhlY3V0aW9uX2VuZ2luZTIgKmUsIGJvb2wgYnVzeSkKK3sKKwlpZ3Rfc3Bp bl90ICpzcGluOworCXVpbnQ2NF90IHZhbFsyXTsKKwlpbnQgZmQ7CisKKwlmZCA9IG9wZW5fZ3Jv dXAoSTkxNV9QTVVfRU5HSU5FX1NFTUEoZS0+Y2xhc3MsIGUtPmluc3RhbmNlKSwgLTEpOworCW9w ZW5fZ3JvdXAoSTkxNV9QTVVfRU5HSU5FX1dBSVQoZS0+Y2xhc3MsIGUtPmluc3RhbmNlKSwgZmQp OworCisJaWYgKGJ1c3kpIHsKKwkJc3BpbiA9IGlndF9zcGluX2JhdGNoX25ldyhnZW1fZmQsIDAs IGUycmluZyhnZW1fZmQsIGUpLCAwKTsKKwkJaWd0X3NwaW5fYmF0Y2hfc2V0X3RpbWVvdXQoc3Bp biwgYmF0Y2hfZHVyYXRpb25fbnMpOworCX0gZWxzZSB7CisJCXVzbGVlcChiYXRjaF9kdXJhdGlv bl9ucyAvIDEwMDApOworCX0KKworCWlmIChidXN5KQorCQlnZW1fc3luYyhnZW1fZmQsIHNwaW4t PmhhbmRsZSk7CisKKwlwbXVfcmVhZF9tdWx0aShmZCwgMiwgdmFsKTsKKworCWlmIChidXN5KQor CQlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7CisJY2xvc2UoZmQpOworCisJYXNz ZXJ0X3dpdGhpbl9lcHNpbG9uKHZhbFswXSwgMC4wZiwgdG9sZXJhbmNlKTsKKwlhc3NlcnRfd2l0 aGluX2Vwc2lsb24odmFsWzFdLCAwLjBmLCB0b2xlcmFuY2UpOworfQorCisjZGVmaW5lIE1JX0lO U1RSKG9wY29kZSwgZmxhZ3MpICgoKG9wY29kZSkgPDwgMjMpIHwgKGZsYWdzKSkKKyNkZWZpbmUg TUlfU0VNQVBIT1JFX1dBSVQJTUlfSU5TVFIoMHgxYywgMikgLyogR0VOOCsgKi8KKyNkZWZpbmUg ICBNSV9TRU1BUEhPUkVfUE9MTAkJKDE8PDE1KQorI2RlZmluZSAgIE1JX1NFTUFQSE9SRV9TQURf R1RFX1NERAkoMTw8MTIpCisKK3N0YXRpYyB2b2lkCitzZW1hX3dhaXQoaW50IGdlbV9mZCwgY29u c3Qgc3RydWN0IGludGVsX2V4ZWN1dGlvbl9lbmdpbmUyICplKQoreworCXN0cnVjdCBkcm1faTkx NV9nZW1fcmVsb2NhdGlvbl9lbnRyeSByZWxvYyA9IHsgfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X2V4ZWNidWZmZXIyIGViID0geyB9OworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3Qy IG9ialsyXTsKKwl1aW50MzJfdCBiYl9oYW5kbGUsIG9ial9oYW5kbGU7CisJdW5zaWduZWQgbG9u ZyBzbGVwdDsKKwl1aW50MzJfdCAqb2JqX3B0cjsKKwl1aW50MzJfdCBiYXRjaFs2XTsKKwl1aW50 NjRfdCB2YWxbMl07CisJaW50IGZkOworCisJaWd0X3JlcXVpcmUoaW50ZWxfZ2VuKGludGVsX2dl dF9kcm1fZGV2aWQoZ2VtX2ZkKSkgPj0gOCk7CisKKwkvKioKKwkgKiBTZXR1cCB1cCBhIGJhdGNo YnVmZmVyIHdpdGggYSBwb2xsaW5nIHNlbWFwaG9yZSB3YWl0IGNvbW1hbmQgd2hpY2gKKwkgKiB3 aWxsIHdhaXQgb24gYW4gdmFsdWUgaW4gYSBzaGFyZWQgYm8gdG8gY2hhbmdlLiBUaGlzIHdheSB3 ZSBhcmUgYWJsZQorCSAqIHRvIGNvbnRyb2wgaG93IG11Y2ggdGltZSB3ZSB3aWxsIHNwZW5kIGlu IHRoaXMgYmIuCisJICovCisKKwliYl9oYW5kbGUgPSBnZW1fY3JlYXRlKGdlbV9mZCwgNDA5Nik7 CisJb2JqX2hhbmRsZSA9IGdlbV9jcmVhdGUoZ2VtX2ZkLCA0MDk2KTsKKworCW9ial9wdHIgPSBn ZW1fbW1hcF9fd2MoZ2VtX2ZkLCBvYmpfaGFuZGxlLCAwLCA0MDk2LCBQUk9UX1dSSVRFKTsKKwor CWJhdGNoWzBdID0gTUlfU0VNQVBIT1JFX1dBSVQgfAorCQkgICBNSV9TRU1BUEhPUkVfUE9MTCB8 CisJCSAgIE1JX1NFTUFQSE9SRV9TQURfR1RFX1NERDsKKwliYXRjaFsxXSA9IDE7CisJYmF0Y2hb Ml0gPSAweDA7CisJYmF0Y2hbM10gPSAweDA7CisJYmF0Y2hbNF0gPSBNSV9OT09QOworCWJhdGNo WzVdID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKKworCWdlbV93cml0ZShnZW1fZmQsIGJiX2hhbmRs ZSwgMCwgYmF0Y2gsIHNpemVvZihiYXRjaCkpOworCisJcmVsb2MudGFyZ2V0X2hhbmRsZSA9IG9i al9oYW5kbGU7CisJcmVsb2Mub2Zmc2V0ID0gMiAqIHNpemVvZih1aW50MzJfdCk7CisJcmVsb2Mu cmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKKworCW1lbXNldChvYmosIDAs IHNpemVvZihvYmopKTsKKworCW9ialswXS5oYW5kbGUgPSBvYmpfaGFuZGxlOworCisJb2JqWzFd LmhhbmRsZSA9IGJiX2hhbmRsZTsKKwlvYmpbMV0ucmVsb2NhdGlvbl9jb3VudCA9IDE7CisJb2Jq WzFdLnJlbG9jc19wdHIgPSB0b191c2VyX3BvaW50ZXIoJnJlbG9jKTsKKworCWViLmJ1ZmZlcl9j b3VudCA9IDI7CisJZWIuYnVmZmVyc19wdHIgPSB0b191c2VyX3BvaW50ZXIob2JqKTsKKwllYi5m bGFncyA9IGUycmluZyhnZW1fZmQsIGUpOworCisJLyoqCisJICogU3RhcnQgdGhlIHNlbWFwaG9y ZSB3YWl0IFBNVSBhbmQgYWZ0ZXIgc29tZSBrbm93biB0aW1lIGxldCB0aGUgYWJvdmUKKwkgKiBz ZW1hcGhvcmUgd2FpdCBjb21tYW5kIGZpbmlzaC4gVGhlbiBjaGVjayB0aGF0IHRoZSBQTVUgaXMg cmVwb3J0aW5nCisJICogdG8gZXhwZWN0ZWQgdGltZSBzcGVudCBpbiBzZW1hcGhvcmUgd2FpdCBz dGF0ZS4KKwkgKi8KKworCWZkID0gb3Blbl9wbXUoSTkxNV9QTVVfRU5HSU5FX1NFTUEoZS0+Y2xh c3MsIGUtPmluc3RhbmNlKSk7CisKKwl2YWxbMF0gPSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCisJ Z2VtX2V4ZWNidWYoZ2VtX2ZkLCAmZWIpOworCisJc2xlcHQgPSBtZWFzdXJlZF91c2xlZXAoMTAw ZTMpOworCisJKm9ial9wdHIgPSAxOworCisJZ2VtX3N5bmMoZ2VtX2ZkLCBiYl9oYW5kbGUpOwor CisJdmFsWzFdID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKworCW11bm1hcChvYmpfcHRyLCA0MDk2 KTsKKwlnZW1fY2xvc2UoZ2VtX2ZkLCBvYmpfaGFuZGxlKTsKKwlnZW1fY2xvc2UoZ2VtX2ZkLCBi Yl9oYW5kbGUpOworCWNsb3NlKGZkKTsKKworCWFzc2VydF93aXRoaW5fZXBzaWxvbih2YWxbMV0g LSB2YWxbMF0sIHNsZXB0LCB0b2xlcmFuY2UpOworfQorCisjZGVmaW5lICAgTUlfV0FJVF9GT1Jf UElQRV9DX1ZCTEFOSyAoMTw8MjEpCisjZGVmaW5lICAgTUlfV0FJVF9GT1JfUElQRV9CX1ZCTEFO SyAoMTw8MTEpCisjZGVmaW5lICAgTUlfV0FJVF9GT1JfUElQRV9BX1ZCTEFOSyAoMTw8MykKKwor dHlwZWRlZiBzdHJ1Y3QgeworCWlndF9kaXNwbGF5X3QgZGlzcGxheTsKKwlzdHJ1Y3QgaWd0X2Zi IHByaW1hcnlfZmI7CisJaWd0X291dHB1dF90ICpvdXRwdXQ7CisJZW51bSBwaXBlIHBpcGU7Cit9 IGRhdGFfdDsKKworc3RhdGljIHZvaWQgcHJlcGFyZV9jcnRjKGRhdGFfdCAqZGF0YSwgaW50IGZk LCBpZ3Rfb3V0cHV0X3QgKm91dHB1dCkKK3sKKwlkcm1Nb2RlTW9kZUluZm8gKm1vZGU7CisJaWd0 X2Rpc3BsYXlfdCAqZGlzcGxheSA9ICZkYXRhLT5kaXNwbGF5OworCWlndF9wbGFuZV90ICpwcmlt YXJ5OworCisJLyogc2VsZWN0IHRoZSBwaXBlIHdlIHdhbnQgdG8gdXNlICovCisJaWd0X291dHB1 dF9zZXRfcGlwZShvdXRwdXQsIGRhdGEtPnBpcGUpOworCisJLyogY3JlYXRlIGFuZCBzZXQgdGhl IHByaW1hcnkgcGxhbmUgZmIgKi8KKwltb2RlID0gaWd0X291dHB1dF9nZXRfbW9kZShvdXRwdXQp OworCWlndF9jcmVhdGVfY29sb3JfZmIoZmQsIG1vZGUtPmhkaXNwbGF5LCBtb2RlLT52ZGlzcGxh eSwKKwkJCSAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAorCQkJICAgIExPQ0FMX0RSTV9GT1JNQVRf TU9EX05PTkUsCisJCQkgICAgMC4wLCAwLjAsIDAuMCwKKwkJCSAgICAmZGF0YS0+cHJpbWFyeV9m Yik7CisKKwlwcmltYXJ5ID0gaWd0X291dHB1dF9nZXRfcGxhbmVfdHlwZShvdXRwdXQsIERSTV9Q TEFORV9UWVBFX1BSSU1BUlkpOworCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmRhdGEtPnBy aW1hcnlfZmIpOworCisJaWd0X2Rpc3BsYXlfY29tbWl0KGRpc3BsYXkpOworCisJaWd0X3dhaXRf Zm9yX3ZibGFuayhmZCwgZGF0YS0+cGlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY3J0 YyhkYXRhX3QgKmRhdGEsIGludCBmZCwgaWd0X291dHB1dF90ICpvdXRwdXQpCit7CisJaWd0X2Rp c3BsYXlfdCAqZGlzcGxheSA9ICZkYXRhLT5kaXNwbGF5OworCWlndF9wbGFuZV90ICpwcmltYXJ5 OworCisJaWd0X3JlbW92ZV9mYihmZCwgJmRhdGEtPnByaW1hcnlfZmIpOworCisJcHJpbWFyeSA9 IGlndF9vdXRwdXRfZ2V0X3BsYW5lX3R5cGUob3V0cHV0LCBEUk1fUExBTkVfVFlQRV9QUklNQVJZ KTsKKwlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksIE5VTEwpOworCisJaWd0X291dHB1dF9zZXRf cGlwZShvdXRwdXQsIFBJUEVfQU5ZKTsKKwlpZ3RfZGlzcGxheV9jb21taXQoZGlzcGxheSk7Cit9 CisKK3N0YXRpYyBpbnQgd2FpdF92YmxhbmsoaW50IGZkLCB1bmlvbiBkcm1fd2FpdF92Ymxhbmsg KnZibCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gMDsKKwlpZiAoaWd0X2lvY3RsKGZkLCBEUk1f SU9DVExfV0FJVF9WQkxBTkssIHZibCkpCisJCWVyciA9IC1lcnJubzsKKworCXJldHVybiBlcnI7 Cit9CisKK3N0YXRpYyB2b2lkCitldmVudF93YWl0KGludCBnZW1fZmQsIGNvbnN0IHN0cnVjdCBp bnRlbF9leGVjdXRpb25fZW5naW5lMiAqZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNf b2JqZWN0MiBvYmogPSB7IH07CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBlYiA9 IHsgfTsKKwlkYXRhX3QgZGF0YTsKKwlpZ3RfZGlzcGxheV90ICpkaXNwbGF5ID0gJmRhdGEuZGlz cGxheTsKKwljb25zdCB1aW50MzJfdCBERVJSTVIgPSAweDQ0MDUwOworCXVuc2lnbmVkIGludCB2 YWxpZF90ZXN0cyA9IDA7CisJdWludDMyX3QgYmF0Y2hbOF0sICpiOworCWlndF9vdXRwdXRfdCAq b3V0cHV0OworCXVpbnQzMl90IGJiX2hhbmRsZTsKKwl1aW50MzJfdCByZWc7CisJZW51bSBwaXBl IHA7CisJaW50IGZkOworCisJaWd0X3JlcXVpcmUoaW50ZWxfZ2VuKGludGVsX2dldF9kcm1fZGV2 aWQoZ2VtX2ZkKSkgPj0gNik7CisJaWd0X3JlcXVpcmUoaW50ZWxfcmVnaXN0ZXJfYWNjZXNzX2lu aXQoaW50ZWxfZ2V0X3BjaV9kZXZpY2UoKSwKKwkJCQkJICAgICAgIGZhbHNlLCBnZW1fZmQpID09 IDApOworCisJLyoqCisJICogV2Ugd2lsbCB1c2UgdGhlIGRpc3BsYXkgdG8gcmVuZGVyIGV2ZW50 IGZvcndhcmluZCBzbyBuZWVkIHRvCisJICogcHJvZ3JhbSB0aGUgREVSUk1SIHJlZ2lzdGVyIGFu ZCByZXN0b3JlIGl0IGF0IGV4aXQuCisJICoKKwkgKiBXZSB3aWxsIGVtaXQgYSBNSV9XQUlUX0ZP Ul9FVkVOVCBsaXN0ZW5pbmcgZm9yIHZibGFuayBldmVudHMsCisJICogaGF2ZSBhIGJhY2tncm91 bmQgaGVscGVyIHRvIGluZGlyZWN0bHkgZW5hYmxlIHZibGFuayBpcnFzLCBhbmQKKwkgKiBsaXN0 ZW4gdG8gdGhlIHJlY29yZGVkIHRpbWUgc3BlbnQgaW4gZW5naW5lIHdhaXQgc3RhdGUgYXMgcmVw b3J0ZWQKKwkgKiBieSB0aGUgUE1VLgorCSAqLworCXJlZyA9IGludGVsX3JlZ2lzdGVyX3JlYWQo REVSUk1SKTsKKworCWttc3Rlc3Rfc2V0X3Z0X2dyYXBoaWNzX21vZGUoKTsKKwlpZ3RfZGlzcGxh eV9pbml0KCZkYXRhLmRpc3BsYXksIGdlbV9mZCk7CisKKwliYl9oYW5kbGUgPSBnZW1fY3JlYXRl KGdlbV9mZCwgNDA5Nik7CisKKwliID0gYmF0Y2g7CisJKmIrKyA9IE1JX0xPQURfUkVHSVNURVJf SU1NOworCSpiKysgPSBERVJSTVI7CisJKmIrKyA9IHJlZyAmIH4oKDEgPDwgMykgfCAoMSA8PCAx MSkgfCAoMSA8PCAyMSkpOworCSpiKysgPSBNSV9XQUlUX0ZPUl9FVkVOVCB8IE1JX1dBSVRfRk9S X1BJUEVfQV9WQkxBTks7CisJKmIrKyA9IE1JX0xPQURfUkVHSVNURVJfSU1NOworCSpiKysgPSBE RVJSTVI7CisJKmIrKyA9IHJlZzsKKwkqYisrID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKKworCW9i ai5oYW5kbGUgPSBiYl9oYW5kbGU7CisKKwllYi5idWZmZXJfY291bnQgPSAxOworCWViLmJ1ZmZl cnNfcHRyID0gdG9fdXNlcl9wb2ludGVyKCZvYmopOworCWViLmZsYWdzID0gZTJyaW5nKGdlbV9m ZCwgZSkgfCBJOTE1X0VYRUNfU0VDVVJFOworCisJZm9yX2VhY2hfcGlwZV93aXRoX3ZhbGlkX291 dHB1dChkaXNwbGF5LCBwLCBvdXRwdXQpIHsKKwkJc3RydWN0IGlndF9oZWxwZXJfcHJvY2VzcyB3 YWl0ZXIgPSB7IH07CisJCWNvbnN0IHVuc2lnbmVkIGludCBmcmFtZXMgPSAzOworCQl1bnNpZ25l ZCBpbnQgZnJhbWU7CisJCXVpbnQ2NF90IHZhbFsyXTsKKworCQliYXRjaFszXSA9IE1JX1dBSVRf Rk9SX0VWRU5UOworCQlzd2l0Y2ggKHApIHsKKwkJY2FzZSBQSVBFX0E6CisJCQliYXRjaFszXSB8 PSBNSV9XQUlUX0ZPUl9QSVBFX0FfVkJMQU5LOworCQkJYnJlYWs7CisJCWNhc2UgUElQRV9COgor CQkJYmF0Y2hbM10gfD0gTUlfV0FJVF9GT1JfUElQRV9CX1ZCTEFOSzsKKwkJCWJyZWFrOworCQlj YXNlIFBJUEVfQzoKKwkJCWJhdGNoWzNdIHw9IE1JX1dBSVRfRk9SX1BJUEVfQ19WQkxBTks7CisJ CQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZ2VtX3dyaXRlKGdl bV9mZCwgYmJfaGFuZGxlLCAwLCBiYXRjaCwgc2l6ZW9mKGJhdGNoKSk7CisKKwkJZGF0YS5waXBl ID0gcDsKKwkJcHJlcGFyZV9jcnRjKCZkYXRhLCBnZW1fZmQsIG91dHB1dCk7CisKKwkJZmQgPSBv cGVuX3BtdShJOTE1X1BNVV9FTkdJTkVfV0FJVChlLT5jbGFzcywgZS0+aW5zdGFuY2UpKTsKKwor CQl2YWxbMF0gPSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCisJCWlndF9mb3JrX2hlbHBlcigmd2Fp dGVyKSB7CisJCQljb25zdCB1aW50MzJfdCBwaXBlX2lkX2ZsYWcgPQorCQkJCQlrbXN0ZXN0X2dl dF92YmxfZmxhZyhkYXRhLnBpcGUpOworCisJCQlmb3IgKDs7KSB7CisJCQkJdW5pb24gZHJtX3dh aXRfdmJsYW5rIHZibCA9IHsgfTsKKworCQkJCXZibC5yZXF1ZXN0LnR5cGUgPSBEUk1fVkJMQU5L X1JFTEFUSVZFOworCQkJCXZibC5yZXF1ZXN0LnR5cGUgfD0gcGlwZV9pZF9mbGFnOworCQkJCXZi bC5yZXF1ZXN0LnNlcXVlbmNlID0gMTsKKwkJCQlpZ3RfYXNzZXJ0X2VxKHdhaXRfdmJsYW5rKGdl bV9mZCwgJnZibCksIDApOworCQkJfQorCQl9CisKKwkJZm9yIChmcmFtZSA9IDA7IGZyYW1lIDwg ZnJhbWVzOyBmcmFtZSsrKSB7CisJCQlnZW1fZXhlY2J1ZihnZW1fZmQsICZlYik7CisJCQlnZW1f c3luYyhnZW1fZmQsIGJiX2hhbmRsZSk7CisJCX0KKworCQlpZ3Rfc3RvcF9oZWxwZXIoJndhaXRl cik7CisKKwkJdmFsWzFdID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKworCQljbG9zZShmZCk7CisK KwkJY2xlYW51cF9jcnRjKCZkYXRhLCBnZW1fZmQsIG91dHB1dCk7CisJCXZhbGlkX3Rlc3RzKys7 CisKKwkJaWd0X2Fzc2VydCh2YWxbMV0gLSB2YWxbMF0gPiAwKTsKKwl9CisKKwlnZW1fY2xvc2Uo Z2VtX2ZkLCBiYl9oYW5kbGUpOworCisJaW50ZWxfcmVnaXN0ZXJfYWNjZXNzX2ZpbmkoKTsKKwor CWlndF9yZXF1aXJlX2YodmFsaWRfdGVzdHMsCisJCSAgICAgICJubyB2YWxpZCBjcnRjL2Nvbm5l Y3RvciBjb21iaW5hdGlvbnMgZm91bmRcbiIpOworfQorCitzdGF0aWMgdm9pZAorbXVsdGlfY2xp ZW50KGludCBnZW1fZmQsIGNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiAqZSkK K3sKKwl1aW50NjRfdCBjb25maWcgPSBJOTE1X1BNVV9FTkdJTkVfQlVTWShlLT5jbGFzcywgZS0+ aW5zdGFuY2UpOworCXVuc2lnbmVkIGludCBzbGVwdDsKKwlpZ3Rfc3Bpbl90ICpzcGluOworCXVp bnQ2NF90IHZhbFsyXTsKKwlpbnQgZmRbMl07CisKKwlmZFswXSA9IG9wZW5fcG11KGNvbmZpZyk7 CisKKwkvKgorCSAqIFNlY29uZCBQTVUgY2xpZW50IHdoaWNoIGlzIGluaXRpYWxpemVkIGFmdGVy IHRoZSBmaXJzdCBvbmUsCisJICogYW5kIGV4aXN0cyBiZWZvcmUgaXQsIHNob3VsZCBub3QgYWZm ZWN0IGFjY291bnRpbmcgYXMgcmVwb3J0ZWQKKwkgKiBpbiB0aGUgZmlyc3QgY2xpZW50LgorCSAq LworCWZkWzFdID0gb3Blbl9wbXUoY29uZmlnKTsKKworCXNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9u ZXcoZ2VtX2ZkLCAwLCBlMnJpbmcoZ2VtX2ZkLCBlKSwgMCk7CisJaWd0X3NwaW5fYmF0Y2hfc2V0 X3RpbWVvdXQoc3BpbiwgYmF0Y2hfZHVyYXRpb25fbnMpOworCisJc2xlcHQgPSBtZWFzdXJlZF91 c2xlZXAoYmF0Y2hfZHVyYXRpb25fbnMgLyAzMDAwKTsKKwl2YWxbMV0gPSBwbXVfcmVhZF9zaW5n bGUoZmRbMV0pOworCWNsb3NlKGZkWzFdKTsKKworCWdlbV9zeW5jKGdlbV9mZCwgc3Bpbi0+aGFu ZGxlKTsKKworCXZhbFswXSA9IHBtdV9yZWFkX3NpbmdsZShmZFswXSk7CisKKwlpZ3Rfc3Bpbl9i YXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7CisJY2xvc2UoZmRbMF0pOworCisJYXNzZXJ0X3dpdGhp bl9lcHNpbG9uKHZhbFswXSwgYmF0Y2hfZHVyYXRpb25fbnMsIHRvbGVyYW5jZSk7CisJYXNzZXJ0 X3dpdGhpbl9lcHNpbG9uKHZhbFsxXSwgc2xlcHQsIHRvbGVyYW5jZSk7Cit9CisKKy8qKgorICog VGVzdHMgdGhhdCBpOTE1IFBNVSBjb3JlY3RseSBlcnJvcnMgb3V0IGluIGludmFsaWQgaW5pdGlh bGl6YXRpb24uCisgKiBpOTE1IFBNVSBpcyB1bmNvcmUgUE1VLCB0aHVzOgorICogIC0gc2FtcGxp bmcgcGVyaW9kIGlzIG5vdCBzdXBwb3J0ZWQKKyAqICAtIHBpZCA+IDAgaXMgbm90IHN1cHBvcnRl ZCBzaW5jZSB3ZSBjYW4ndCBjb3VudCBwZXItcHJvY2VzcyAod2UgY291bnQKKyAqICAgIHBlciB3 aG9sZSBzeXN0ZW0pCisgKiAgLSBjcHUgIT0gMCBpcyBub3Qgc3VwcG9ydGVkIHNpbmNlIGk5MTUg UE1VIGV4cG9zZXMgY3B1bWFzayBmb3IgQ1BVMAorICovCitzdGF0aWMgdm9pZCBpbnZhbGlkX2lu aXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHI7CisJaW50IHBpZCwgY3B1 OworCisjZGVmaW5lIEFUVFJfSU5JVCgpIFwKK2RvIHsgXAorCW1lbXNldCgmYXR0ciwgMCwgc2l6 ZW9mIChhdHRyKSk7IFwKKwlhdHRyLmNvbmZpZyA9IEk5MTVfUE1VX0VOR0lORV9CVVNZKEk5MTVf RU5HSU5FX0NMQVNTX1JFTkRFUiwgMCk7IFwKKwlhdHRyLnR5cGUgPSBpOTE1X3R5cGVfaWQoKTsg XAorCWlndF9hc3NlcnQoYXR0ci50eXBlICE9IDApOyBcCit9IHdoaWxlKDApCisKKwlBVFRSX0lO SVQoKTsKKwlhdHRyLnNhbXBsZV9wZXJpb2QgPSAxMDA7CisJcGlkID0gLTE7CisJY3B1ID0gMDsK KwlpZ3RfYXNzZXJ0X2VxKHBlcmZfZXZlbnRfb3BlbigmYXR0ciwgcGlkLCBjcHUsIC0xLCAwKSwg LTEpOworCWlndF9hc3NlcnRfZXEoZXJybm8sIEVJTlZBTCk7CisKKwlBVFRSX0lOSVQoKTsKKwlw aWQgPSAwOworCWNwdSA9IDA7CisJaWd0X2Fzc2VydF9lcShwZXJmX2V2ZW50X29wZW4oJmF0dHIs IHBpZCwgY3B1LCAtMSwgMCksIC0xKTsKKwlpZ3RfYXNzZXJ0X2VxKGVycm5vLCBFSU5WQUwpOwor CisJQVRUUl9JTklUKCk7CisJcGlkID0gLTE7CisJY3B1ID0gMTsKKwlpZ3RfYXNzZXJ0X2VxKHBl cmZfZXZlbnRfb3BlbigmYXR0ciwgcGlkLCBjcHUsIC0xLCAwKSwgLTEpOworCWlndF9hc3NlcnRf ZXEoZXJybm8sIEVOT0RFVik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb3RoZXIodW5zaWduZWQg aW50IGksIGJvb2wgdmFsaWQpCit7CisJaW50IGZkOworCisJZmQgPSBwZXJmX2k5MTVfb3Blbihf X0k5MTVfUE1VX09USEVSKGkpKTsKKwlpZ3RfcmVxdWlyZSghKGZkIDwgMCAmJiBlcnJubyA9PSBF Tk9ERVYpKTsKKwlpZiAodmFsaWQpIHsKKwkJaWd0X2Fzc2VydChmZCA+PSAwKTsKKwl9IGVsc2Ug eworCQlpZ3RfYXNzZXJ0KGZkIDwgMCk7CisJCXJldHVybjsKKwl9CisKKwljbG9zZShmZCk7Cit9 CisKK3N0YXRpYyB2b2lkIHJlYWRfb3RoZXIodW5zaWduZWQgaW50IGksIGJvb2wgdmFsaWQpCit7 CisJaW50IGZkOworCisJZmQgPSBwZXJmX2k5MTVfb3BlbihfX0k5MTVfUE1VX09USEVSKGkpKTsK KwlpZ3RfcmVxdWlyZSghKGZkIDwgMCAmJiBlcnJubyA9PSBFTk9ERVYpKTsKKwlpZiAodmFsaWQp IHsKKwkJaWd0X2Fzc2VydChmZCA+PSAwKTsKKwl9IGVsc2UgeworCQlpZ3RfYXNzZXJ0KGZkIDwg MCk7CisJCXJldHVybjsKKwl9CisKKwkodm9pZClwbXVfcmVhZF9zaW5nbGUoZmQpOworCisJY2xv c2UoZmQpOworfQorCitzdGF0aWMgYm9vbCBjcHUwX2hvdHBsdWdfc3VwcG9ydCh2b2lkKQorewor CXJldHVybiBhY2Nlc3MoIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTAvb25saW5lIiwgV19P SykgPT0gMDsKK30KKworc3RhdGljIHZvaWQgY3B1X2hvdHBsdWcoaW50IGdlbV9mZCkKK3sKKwlz dHJ1Y3QgdGltZXNwZWMgc3RhcnQgPSB7IH07CisJaWd0X3NwaW5fdCAqc3BpbjsKKwl1aW50NjRf dCB2YWwsIHJlZjsKKwlpbnQgZmQ7CisKKwlpZ3RfcmVxdWlyZShjcHUwX2hvdHBsdWdfc3VwcG9y dCgpKTsKKworCWZkID0gcGVyZl9pOTE1X29wZW4oSTkxNV9QTVVfRU5HSU5FX0JVU1koSTkxNV9F TkdJTkVfQ0xBU1NfUkVOREVSLCAwKSk7CisJaWd0X2Fzc2VydChmZCA+PSAwKTsKKworCXNwaW4g PSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoZ2VtX2ZkLCAwLCBJOTE1X0VYRUNfUkVOREVSLCAwKTsKKwor CWlndF9uc2VjX2VsYXBzZWQoJnN0YXJ0KTsKKworCS8qCisJICogVG9nZ2xlIG9ubGluZSBzdGF0 dXMgb2YgYWxsIHRoZSBDUFVzIGluIGEgY2hpbGQgcHJvY2VzcyBhbmQgZW5zdXJlCisJICogdGhp cyBoYXMgbm90IGFmZmVjdGVkIGJ1c3luZXNzIHN0YXRzIGluIHRoZSBwYXJlbnQuCisJICovCisJ aWd0X2ZvcmsoY2hpbGQsIDEpIHsKKwkJaW50IGNwdSA9IDA7CisKKwkJZm9yICg7OykgeworCQkJ Y2hhciBuYW1lWzEyOF07CisJCQlpbnQgY3B1ZmQ7CisKKwkJCXNwcmludGYobmFtZSwgIi9zeXMv ZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSVkL29ubGluZSIsCisJCQkJY3B1KTsKKwkJCWNwdWZkID0g b3BlbihuYW1lLCBPX1dST05MWSk7CisJCQlpZiAoY3B1ZmQgPT0gLTEpIHsKKwkJCQlpZ3RfYXNz ZXJ0KGNwdSA+IDApOworCQkJCWJyZWFrOworCQkJfQorCQkJaWd0X2Fzc2VydF9lcSh3cml0ZShj cHVmZCwgIjAiLCAyKSwgMik7CisKKwkJCXVzbGVlcCgxZTYpOworCisJCQlpZ3RfYXNzZXJ0X2Vx KHdyaXRlKGNwdWZkLCAiMSIsIDIpLCAyKTsKKworCQkJY2xvc2UoY3B1ZmQpOworCQkJY3B1Kys7 CisJCX0KKwl9CisKKwlpZ3Rfd2FpdGNoaWxkcmVuKCk7CisKKwlpZ3Rfc3Bpbl9iYXRjaF9lbmQo c3Bpbik7CisJZ2VtX3N5bmMoZ2VtX2ZkLCBzcGluLT5oYW5kbGUpOworCisJcmVmID0gaWd0X25z ZWNfZWxhcHNlZCgmc3RhcnQpOworCXZhbCA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisKKwlpZ3Rf c3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7CisJY2xvc2UoZmQpOworCisJYXNzZXJ0X3dp dGhpbl9lcHNpbG9uKHZhbCwgcmVmLCB0b2xlcmFuY2UpOworfQorCitzdGF0aWMgdW5zaWduZWQg bG9uZyBjYWxpYnJhdGVfbm9wKGludCBmZCwgY29uc3QgdW5zaWduZWQgaW50IGNhbGlicmF0aW9u X3VzKQoreworCWNvbnN0IHVuc2lnbmVkIGludCBjYWxfbWluX3VzID0gY2FsaWJyYXRpb25fdXMg KiAzOworCWNvbnN0IHVuc2lnbmVkIGludCB0b2xlcmFuY2VfcGN0ID0gMTA7CisJY29uc3QgdWlu dDMyX3QgYmJlID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKKwljb25zdCB1bnNpZ25lZCBpbnQgbG9v cHMgPSAxNzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBvYmogPSB7fTsKKwlz dHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGViID0KKwkJeyAuYnVmZmVyX2NvdW50ID0g MSwgLmJ1ZmZlcnNfcHRyID0gKHVpbnRwdHJfdCkmb2JqfTsKKwlzdHJ1Y3QgdGltZXNwZWMgdF9i ZWdpbiA9IHsgfTsKKwlsb25nIHNpemUsIGxhc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG5zOwor CisJaWd0X25zZWNfZWxhcHNlZCgmdF9iZWdpbik7CisKKwlzaXplID0gMjU2ICogMTAyNDsKKwlk byB7CisJCXN0cnVjdCB0aW1lc3BlYyB0X3N0YXJ0ID0geyB9OworCisJCW9iai5oYW5kbGUgPSBn ZW1fY3JlYXRlKGZkLCBzaXplKTsKKwkJZ2VtX3dyaXRlKGZkLCBvYmouaGFuZGxlLCBzaXplIC0g c2l6ZW9mKGJiZSksICZiYmUsCisJCQkgIHNpemVvZihiYmUpKTsKKwkJZ2VtX2V4ZWNidWYoZmQs ICZlYik7CisJCWdlbV9zeW5jKGZkLCBvYmouaGFuZGxlKTsKKworCQlpZ3RfbnNlY19lbGFwc2Vk KCZ0X3N0YXJ0KTsKKworCQlmb3IgKGludCBsb29wID0gMDsgbG9vcCA8IGxvb3BzOyBsb29wKysp CisJCQlnZW1fZXhlY2J1ZihmZCwgJmViKTsKKwkJZ2VtX3N5bmMoZmQsIG9iai5oYW5kbGUpOwor CisJCW5zID0gaWd0X25zZWNfZWxhcHNlZCgmdF9zdGFydCk7CisKKwkJZ2VtX2Nsb3NlKGZkLCBv YmouaGFuZGxlKTsKKworCQlsYXN0X3NpemUgPSBzaXplOworCQlzaXplID0gY2FsaWJyYXRpb25f dXMgKiAxMDAwICogc2l6ZSAqIGxvb3BzIC8gbnM7CisJCXNpemUgPSBBTElHTihzaXplLCBzaXpl b2YodWludDMyX3QpKTsKKwl9IHdoaWxlIChpZ3RfbnNlY19lbGFwc2VkKCZ0X2JlZ2luKSAvIDEw MDAgPCBjYWxfbWluX3VzIHx8CisJCSBhYnMoc2l6ZSAtIGxhc3Rfc2l6ZSkgPiAoc2l6ZSAqIHRv bGVyYW5jZV9wY3QgLyAxMDApKTsKKworCXJldHVybiBzaXplIC8gc2l6ZW9mKHVpbnQzMl90KTsK K30KKworc3RhdGljIHZvaWQgZXhlY19ub3AoaW50IGdlbV9mZCwgdW5zaWduZWQgbG9uZyBzeikK K3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBvYmogPSB7fTsKKwlzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGViID0KKwkJeyAuYnVmZmVyX2NvdW50ID0gMSwgLmJ1 ZmZlcnNfcHRyID0gKHVpbnRwdHJfdCkmb2JqfTsKKwljb25zdCB1aW50MzJfdCBiYmUgPSBNSV9C QVRDSF9CVUZGRVJfRU5EOworCXN0cnVjdCBwb2xsZmQgcGZkOworCWludCBmZW5jZTsKKworCXN6 ID0gQUxJR04oc3osIHNpemVvZih1aW50MzJfdCkpOworCisJb2JqLmhhbmRsZSA9IGdlbV9jcmVh dGUoZ2VtX2ZkLCBzeik7CisJZ2VtX3dyaXRlKGdlbV9mZCwgb2JqLmhhbmRsZSwgc3ogLSBzaXpl b2YoYmJlKSwgJmJiZSwgc2l6ZW9mKGJiZSkpOworCisJZWIuZmxhZ3MgPSBJOTE1X0VYRUNfUkVO REVSIHwgSTkxNV9FWEVDX0ZFTkNFX09VVDsKKworCWdlbV9leGVjYnVmX3dyKGdlbV9mZCwgJmVi KTsKKwlmZW5jZSA9IGViLnJzdmQyID4+IDMyOworCisJLyoKKwkgKiBQb2xsIG9uIHRoZSBvdXRw dXQgZmVuY2UgdG8gZW5zdXJlIHVzZXIgaW50ZXJydXB0cyB3aWxsIGJlCisJICogZ2VuZXJhdGVk IGFuZCBsaXN0ZW5lZCB0by4KKwkgKi8KKwlwZmQuZmQgPSBmZW5jZTsKKwlwZmQuZXZlbnRzID0g UE9MTElOOworCWlndF9hc3NlcnRfZXEocG9sbCgmcGZkLCAxLCAtMSksIDEpOworCisJY2xvc2Uo ZmVuY2UpOworCWdlbV9jbG9zZShnZW1fZmQsIG9iai5oYW5kbGUpOworfQorCitzdGF0aWMgdm9p ZAordGVzdF9pbnRlcnJ1cHRzKGludCBnZW1fZmQpCit7CisJY29uc3QgdW5zaWduZWQgaW50IGNh bGlicmF0aW9uX3VzID0gMjUwMDAwOworCWNvbnN0IHVuc2lnbmVkIGludCBiYXRjaF9sZW5fdXMg PSAxMDAwMDA7CisJY29uc3QgdW5zaWduZWQgaW50IGJhdGNoX2NvdW50ID0gM2U2IC8gYmF0Y2hf bGVuX3VzOworCXVpbnQ2NF90IGlkbGUsIGJ1c3ksIHByZXY7CisJdW5zaWduZWQgbG9uZyBjYWws IHN6OworCXVuc2lnbmVkIGludCBpOworCWludCBmZDsKKworCWNhbCA9IGNhbGlicmF0ZV9ub3Ao Z2VtX2ZkLCBjYWxpYnJhdGlvbl91cyk7CisJc3ogPSBiYXRjaF9sZW5fdXMgKiBjYWwgLyBjYWxp YnJhdGlvbl91czsKKworCWZkID0gb3Blbl9wbXUoSTkxNV9QTVVfSU5URVJSVVBUUyk7CisKKwln ZW1fcXVpZXNjZW50X2dwdShnZW1fZmQpOworCisJLyogV2FpdCBmb3IgaWRsZSBzdGF0ZS4gKi8K KwlwcmV2ID0gcG11X3JlYWRfc2luZ2xlKGZkKTsKKwlpZGxlID0gcHJldiArIDE7CisJd2hpbGUg KGlkbGUgIT0gcHJldikgeworCQl1c2xlZXAoMWU2KTsKKwkJcHJldiA9IGlkbGU7CisJCWlkbGUg PSBwbXVfcmVhZF9zaW5nbGUoZmQpOworCX0KKworCWlndF9hc3NlcnRfZXEoaWRsZSAtIHByZXYs IDApOworCisJLyoKKwkgKiBTZW5kIHNvbWUgbm8tb3AgYmF0Y2hlcyB3YWl0aW5nIG9uIG91dHB1 dCBmZW5jZXMgdG8KKwkgKiBlbnN1cmUgaW50ZXJydXB0cy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBp IDwgYmF0Y2hfY291bnQ7IGkrKykKKwkJZXhlY19ub3AoZ2VtX2ZkLCBzeik7CisKKwkvKiBDaGVj ayBhdCBsZWFzdCBhcyBtYW55IGludGVycnVwdHMgaGFzIGJlZW4gZ2VuZXJhdGVkLiAqLworCWJ1 c3kgPSBwbXVfcmVhZF9zaW5nbGUoZmQpIC0gaWRsZTsKKwljbG9zZShmZCk7CisKKwlpZ3RfYXNz ZXJ0KGJ1c3kgPj0gYmF0Y2hfY291bnQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9mcmVxdWVu Y3koaW50IGdlbV9mZCkKK3sKKwljb25zdCB1aW50NjRfdCBkdXJhdGlvbl9ucyA9IDJlOTsKKwl1 aW50MzJfdCBtaW5fZnJlcSwgbWF4X2ZyZXEsIGJvb3N0X2ZyZXE7CisJdWludDY0X3QgbWluWzJd LCBtYXhbMl0sIHN0YXJ0WzJdOworCWlndF9zcGluX3QgKnNwaW47CisJaW50IGZkLCBzeXNmczsK KworCXN5c2ZzID0gaWd0X3N5c2ZzX29wZW4oZ2VtX2ZkLCBOVUxMKTsKKwlpZ3RfcmVxdWlyZShz eXNmcyA+PSAwKTsKKworCW1pbl9mcmVxID0gaWd0X3N5c2ZzX2dldF91MzIoc3lzZnMsICJndF9S UG5fZnJlcV9taHoiKTsKKwltYXhfZnJlcSA9IGlndF9zeXNmc19nZXRfdTMyKHN5c2ZzLCAiZ3Rf UlAwX2ZyZXFfbWh6Iik7CisJYm9vc3RfZnJlcSA9IGlndF9zeXNmc19nZXRfdTMyKHN5c2ZzLCAi Z3RfYm9vc3RfZnJlcV9taHoiKTsKKwlpZ3RfcmVxdWlyZShtaW5fZnJlcSA+IDAgJiYgbWF4X2Zy ZXEgPiAwICYmIGJvb3N0X2ZyZXEgPiAwKTsKKwlpZ3RfcmVxdWlyZShtYXhfZnJlcSA+IG1pbl9m cmVxKTsKKwlpZ3RfcmVxdWlyZShib29zdF9mcmVxID4gbWluX2ZyZXEpOworCisJZmQgPSBvcGVu X2dyb3VwKEk5MTVfUE1VX1JFUVVFU1RFRF9GUkVRVUVOQ1ksIC0xKTsKKwlvcGVuX2dyb3VwKEk5 MTVfUE1VX0FDVFVBTF9GUkVRVUVOQ1ksIGZkKTsKKworCS8qCisJICogU2V0IEdQVSB0byBtaW4g ZnJlcXVlbmN5IGFuZCByZWFkIFBNVSBjb3VudGVycy4KKwkgKi8KKwlpZ3RfcmVxdWlyZShpZ3Rf c3lzZnNfc2V0X3UzMihzeXNmcywgImd0X21heF9mcmVxX21oeiIsIG1pbl9mcmVxKSk7CisJaWd0 X3JlcXVpcmUoaWd0X3N5c2ZzX2dldF91MzIoc3lzZnMsICJndF9tYXhfZnJlcV9taHoiKSA9PSBt aW5fZnJlcSk7CisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX3NldF91MzIoc3lzZnMsICJndF9ib29z dF9mcmVxX21oeiIsIG1pbl9mcmVxKSk7CisJaWd0X3JlcXVpcmUoaWd0X3N5c2ZzX2dldF91MzIo c3lzZnMsICJndF9ib29zdF9mcmVxX21oeiIpID09IG1pbl9mcmVxKTsKKworCXBtdV9yZWFkX211 bHRpKGZkLCAyLCBzdGFydCk7CisKKwlzcGluID0gaWd0X3NwaW5fYmF0Y2hfbmV3KGdlbV9mZCwg MCwgSTkxNV9FWEVDX1JFTkRFUiwgMCk7CisJaWd0X3NwaW5fYmF0Y2hfc2V0X3RpbWVvdXQoc3Bp biwgZHVyYXRpb25fbnMpOworCWdlbV9zeW5jKGdlbV9mZCwgc3Bpbi0+aGFuZGxlKTsKKworCXBt dV9yZWFkX211bHRpKGZkLCAyLCBtaW4pOworCW1pblswXSAtPSBzdGFydFswXTsKKwltaW5bMV0g LT0gc3RhcnRbMV07CisKKwlpZ3Rfc3Bpbl9iYXRjaF9mcmVlKGdlbV9mZCwgc3Bpbik7CisKKwl1 c2xlZXAoMWU2KTsKKworCS8qCisJICogU2V0IEdQVSB0byBtYXggZnJlcXVlbmN5IGFuZCByZWFk IFBNVSBjb3VudGVycy4KKwkgKi8KKwlpZ3RfcmVxdWlyZShpZ3Rfc3lzZnNfc2V0X3UzMihzeXNm cywgImd0X21heF9mcmVxX21oeiIsIG1heF9mcmVxKSk7CisJaWd0X3JlcXVpcmUoaWd0X3N5c2Zz X2dldF91MzIoc3lzZnMsICJndF9tYXhfZnJlcV9taHoiKSA9PSBtYXhfZnJlcSk7CisJaWd0X3Jl cXVpcmUoaWd0X3N5c2ZzX3NldF91MzIoc3lzZnMsICJndF9ib29zdF9mcmVxX21oeiIsIGJvb3N0 X2ZyZXEpKTsKKwlpZ3RfcmVxdWlyZShpZ3Rfc3lzZnNfZ2V0X3UzMihzeXNmcywgImd0X2Jvb3N0 X2ZyZXFfbWh6IikgPT0gYm9vc3RfZnJlcSk7CisKKwlpZ3RfcmVxdWlyZShpZ3Rfc3lzZnNfc2V0 X3UzMihzeXNmcywgImd0X21pbl9mcmVxX21oeiIsIG1heF9mcmVxKSk7CisJaWd0X3JlcXVpcmUo aWd0X3N5c2ZzX2dldF91MzIoc3lzZnMsICJndF9taW5fZnJlcV9taHoiKSA9PSBtYXhfZnJlcSk7 CisKKwlwbXVfcmVhZF9tdWx0aShmZCwgMiwgc3RhcnQpOworCisJc3BpbiA9IGlndF9zcGluX2Jh dGNoX25ldyhnZW1fZmQsIDAsIEk5MTVfRVhFQ19SRU5ERVIsIDApOworCWlndF9zcGluX2JhdGNo X3NldF90aW1lb3V0KHNwaW4sIGR1cmF0aW9uX25zKTsKKwlnZW1fc3luYyhnZW1fZmQsIHNwaW4t PmhhbmRsZSk7CisKKwlwbXVfcmVhZF9tdWx0aShmZCwgMiwgbWF4KTsKKwltYXhbMF0gLT0gc3Rh cnRbMF07CisJbWF4WzFdIC09IHN0YXJ0WzFdOworCisJaWd0X3NwaW5fYmF0Y2hfZnJlZShnZW1f ZmQsIHNwaW4pOworCisJLyoKKwkgKiBSZXN0b3JlIG1pbi9tYXguCisJICovCisJaWd0X3N5c2Zz X3NldF91MzIoc3lzZnMsICJndF9taW5fZnJlcV9taHoiLCBtaW5fZnJlcSk7CisJaWYgKGlndF9z eXNmc19nZXRfdTMyKHN5c2ZzLCAiZ3RfbWluX2ZyZXFfbWh6IikgIT0gbWluX2ZyZXEpCisJCWln dF93YXJuKCJVbmFibGUgdG8gcmVzdG9yZSBtaW4gZnJlcXVlbmN5IHRvIHNhdmVkIHZhbHVlIFsl dSBNSHpdLCBub3cgJXUgTUh6XG4iLAorCQkJIG1pbl9mcmVxLCBpZ3Rfc3lzZnNfZ2V0X3UzMihz eXNmcywgImd0X21pbl9mcmVxX21oeiIpKTsKKwljbG9zZShmZCk7CisKKwlpZ3RfYXNzZXJ0KG1p blswXSA8IG1heFswXSk7CisJaWd0X2Fzc2VydChtaW5bMV0gPCBtYXhbMV0pOworfQorCitzdGF0 aWMgdm9pZAordGVzdF9yYzYoaW50IGdlbV9mZCkKK3sKKwlpbnQ2NF90IGR1cmF0aW9uX25zID0g MmU5OworCXVpbnQ2NF90IGlkbGUsIGJ1c3ksIHByZXY7CisJdW5zaWduZWQgaW50IHNsZXB0Owor CWludCBmZCwgZnc7CisKKwlmZCA9IG9wZW5fcG11KEk5MTVfUE1VX1JDNl9SRVNJREVOQ1kpOwor CisJZ2VtX3F1aWVzY2VudF9ncHUoZ2VtX2ZkKTsKKwl1c2xlZXAoMWU2KTsKKworCS8qIEdvIGlk bGUgYW5kIGNoZWNrIGZ1bGwgUkM2LiAqLworCXByZXYgPSBwbXVfcmVhZF9zaW5nbGUoZmQpOwor CXNsZXB0ID0gbWVhc3VyZWRfdXNsZWVwKGR1cmF0aW9uX25zIC8gMTAwMCk7CisJaWRsZSA9IHBt dV9yZWFkX3NpbmdsZShmZCk7CisKKwlhc3NlcnRfd2l0aGluX2Vwc2lsb24oaWRsZSAtIHByZXYs IHNsZXB0LCB0b2xlcmFuY2UpOworCisJLyogV2FrZSB1cCBkZXZpY2UgYW5kIGNoZWNrIG5vIFJD Ni4gKi8KKwlmdyA9IGlndF9vcGVuX2ZvcmNld2FrZV9oYW5kbGUoZ2VtX2ZkKTsKKwlpZ3RfYXNz ZXJ0KGZ3ID49IDApOworCisJcHJldiA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisJdXNsZWVwKGR1 cmF0aW9uX25zIC8gMTAwMCk7CisJYnVzeSA9IHBtdV9yZWFkX3NpbmdsZShmZCk7CisKKwljbG9z ZShmdyk7CisJY2xvc2UoZmQpOworCisJYXNzZXJ0X3dpdGhpbl9lcHNpbG9uKGJ1c3kgLSBwcmV2 LCAwLjAsIHRvbGVyYW5jZSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JjNnAoaW50IGdlbV9m ZCkKK3sKKwlpbnQ2NF90IGR1cmF0aW9uX25zID0gMmU5OworCXVuc2lnbmVkIGludCBudW1fcG11 ID0gMTsKKwl1aW50NjRfdCBpZGxlWzNdLCBidXN5WzNdLCBwcmV2WzNdOworCXVuc2lnbmVkIGlu dCBzbGVwdCwgaTsKKwlpbnQgZmQsIHJldCwgZnc7CisKKwlmZCA9IG9wZW5fZ3JvdXAoSTkxNV9Q TVVfUkM2X1JFU0lERU5DWSwgLTEpOworCXJldCA9IHBlcmZfaTkxNV9vcGVuX2dyb3VwKEk5MTVf UE1VX1JDNnBfUkVTSURFTkNZLCBmZCk7CisJaWYgKHJldCA+IDApIHsKKwkJbnVtX3BtdSsrOwor CQlyZXQgPSBwZXJmX2k5MTVfb3Blbl9ncm91cChJOTE1X1BNVV9SQzZwcF9SRVNJREVOQ1ksIGZk KTsKKwkJaWYgKHJldCA+IDApCisJCQludW1fcG11Kys7CisJfQorCisJaWd0X3JlcXVpcmUobnVt X3BtdSA9PSAzKTsKKworCWdlbV9xdWllc2NlbnRfZ3B1KGdlbV9mZCk7CisJdXNsZWVwKDFlNik7 CisKKwkvKiBHbyBpZGxlIGFuZCBjaGVjayBmdWxsIFJDNi4gKi8KKwlwbXVfcmVhZF9tdWx0aShm ZCwgbnVtX3BtdSwgcHJldik7CisJc2xlcHQgPSBtZWFzdXJlZF91c2xlZXAoZHVyYXRpb25fbnMg LyAxMDAwKTsKKwlwbXVfcmVhZF9tdWx0aShmZCwgbnVtX3BtdSwgaWRsZSk7CisKKwlmb3IgKGkg PSAwOyBpIDwgbnVtX3BtdTsgaSsrKQorCQlhc3NlcnRfd2l0aGluX2Vwc2lsb24oaWRsZVtpXSAt IHByZXZbaV0sIHNsZXB0LCB0b2xlcmFuY2UpOworCisJLyogV2FrZSB1cCBkZXZpY2UgYW5kIGNo ZWNrIG5vIFJDNi4gKi8KKwlmdyA9IGlndF9vcGVuX2ZvcmNld2FrZV9oYW5kbGUoZ2VtX2ZkKTsK KwlpZ3RfYXNzZXJ0KGZ3ID49IDApOworCisJcG11X3JlYWRfbXVsdGkoZmQsIG51bV9wbXUsIHBy ZXYpOworCXVzbGVlcChkdXJhdGlvbl9ucyAvIDEwMDApOworCXBtdV9yZWFkX211bHRpKGZkLCBu dW1fcG11LCBidXN5KTsKKworCWNsb3NlKGZ3KTsKKwljbG9zZShmZCk7CisKKwlmb3IgKGkgPSAw OyBpIDwgbnVtX3BtdTsgaSsrKQorCQlhc3NlcnRfd2l0aGluX2Vwc2lsb24oYnVzeVtpXSAtIHBy ZXZbaV0sIDAuMCwgdG9sZXJhbmNlKTsKK30KKworaWd0X21haW4KK3sKKwljb25zdCB1bnNpZ25l ZCBpbnQgbnVtX290aGVyX21ldHJpY3MgPQorCQkJCUk5MTVfUE1VX0xBU1QgLSBfX0k5MTVfUE1V X09USEVSKDApICsgMTsKKwl1bnNpZ25lZCBpbnQgbnVtX2VuZ2luZXMgPSAwOworCWludCBmZCA9 IC0xOworCWNvbnN0IHN0cnVjdCBpbnRlbF9leGVjdXRpb25fZW5naW5lMiAqZTsKKwl1bnNpZ25l ZCBpbnQgaTsKKworCWlndF9maXh0dXJlIHsKKwkJZmQgPSBkcm1fb3Blbl9kcml2ZXJfbWFzdGVy KERSSVZFUl9JTlRFTCk7CisKKwkJaWd0X3JlcXVpcmVfZ2VtKGZkKTsKKwkJaWd0X3JlcXVpcmUo aTkxNV90eXBlX2lkKCkgPiAwKTsKKworCQlmb3JfZWFjaF9lbmdpbmVfY2xhc3NfaW5zdGFuY2Uo ZmQsIGUpIHsKKwkJCWlmIChnZW1faGFzX2VuZ2luZShmZCwgZS0+Y2xhc3MsIGUtPmluc3RhbmNl KSkKKwkJCQludW1fZW5naW5lcysrOworCQl9CisJfQorCisJLyoqCisJICogVGVzdCBpbnZhbGlk IGFjY2VzcyB2aWEgcGVyZiBBUEkgaXMgcmVqZWN0ZWQuCisJICovCisJaWd0X3N1YnRlc3QoImlu dmFsaWQtaW5pdCIpCisJCWludmFsaWRfaW5pdCgpOworCisJZm9yX2VhY2hfZW5naW5lX2NsYXNz X2luc3RhbmNlKGZkLCBlKSB7CisJCS8qKgorCQkgKiBUZXN0IHRoYXQgYSBzaW5nbGUgZW5naW5l IG1ldHJpYyBjYW4gYmUgaW5pdGlhbGl6ZWQuCisJCSAqLworCQlpZ3Rfc3VidGVzdF9mKCJpbml0 LWJ1c3ktJXMiLCBlLT5uYW1lKQorCQkJaW5pdChmZCwgZSwgSTkxNV9TQU1QTEVfQlVTWSk7CisK KwkJaWd0X3N1YnRlc3RfZigiaW5pdC13YWl0LSVzIiwgZS0+bmFtZSkKKwkJCWluaXQoZmQsIGUs IEk5MTVfU0FNUExFX1dBSVQpOworCisJCWlndF9zdWJ0ZXN0X2YoImluaXQtc2VtYS0lcyIsIGUt Pm5hbWUpCisJCQlpbml0KGZkLCBlLCBJOTE1X1NBTVBMRV9TRU1BKTsKKworCQkvKioKKwkJICog VGVzdCB0aGF0IGVuZ2luZXMgc2hvdyBubyBsb2FkIHdoZW4gaWRsZS4KKwkJICovCisJCWlndF9z dWJ0ZXN0X2YoImlkbGUtJXMiLCBlLT5uYW1lKQorCQkJc2luZ2xlKGZkLCBlLCBmYWxzZSk7CisK KwkJLyoqCisJCSAqIFRlc3QgdGhhdCBhIHNpbmdsZSBlbmdpbmUgcmVwb3J0cyBsb2FkIGNvcnJl Y3RseS4KKwkJICovCisJCWlndF9zdWJ0ZXN0X2YoImJ1c3ktJXMiLCBlLT5uYW1lKQorCQkJc2lu Z2xlKGZkLCBlLCB0cnVlKTsKKworCQkvKioKKwkJICogVGVzdCB0aGF0IHdoZW4gb25lIGVuZ2lu ZSBpcyBsb2FkZWQgb3RoZXIgcmVwb3J0IG5vIGxvYWQuCisJCSAqLworCQlpZ3Rfc3VidGVzdF9m KCJidXN5LWNoZWNrLWFsbC0lcyIsIGUtPm5hbWUpCisJCQlidXN5X2NoZWNrX2FsbChmZCwgZSwg bnVtX2VuZ2luZXMpOworCisJCS8qKgorCQkgKiBUZXN0IHRoYXQgd2hlbiBhbGwgZXhjZXB0IG9u ZSBlbmdpbmUgYXJlIGxvYWRlZCBhbGwgbG9hZHMKKwkJICogYXJlIGNvcnJlY3RseSByZXBvcnRl ZC4KKwkJICovCisJCWlndF9zdWJ0ZXN0X2YoIm1vc3QtYnVzeS1jaGVjay1hbGwtJXMiLCBlLT5u YW1lKQorCQkJbW9zdF9idXN5X2NoZWNrX2FsbChmZCwgZSwgbnVtX2VuZ2luZXMpOworCisJCS8q KgorCQkgKiBUZXN0IHRoYXQgc2VtcGhvcmUgY291bnRlcnMgcmVwb3J0IG5vIGFjdGl2aXR5IG9u IGlkbGUKKwkJICogb3IgYnVzeSBlbmdpbmVzLgorCQkgKi8KKwkJaWd0X3N1YnRlc3RfZigiaWRs ZS1uby1zZW1hcGhvcmVzLSVzIiwgZS0+bmFtZSkKKwkJCW5vX3NlbWEoZmQsIGUsIGZhbHNlKTsK KworCQlpZ3Rfc3VidGVzdF9mKCJidXN5LW5vLXNlbWFwaG9yZXMtJXMiLCBlLT5uYW1lKQorCQkJ bm9fc2VtYShmZCwgZSwgdHJ1ZSk7CisKKwkJLyoqCisJCSAqIFRlc3QgdGhhdCBzZW1hcGhvcmUg d2FpdHMgYXJlIGNvcnJlY3RseSByZXBvcnRlZC4KKwkJICovCisJCWlndF9zdWJ0ZXN0X2YoInNl bWFwaG9yZS13YWl0LSVzIiwgZS0+bmFtZSkKKwkJCXNlbWFfd2FpdChmZCwgZSk7CisKKwkJLyoq CisJCSAqIFRlc3QgdGhhdCBldmVudCB3YWl0cyBhcmUgY29ycmVjdGx5IHJlcG9ydGVkLgorCQkg Ki8KKwkJaWYgKGUtPmNsYXNzID09IEk5MTVfRU5HSU5FX0NMQVNTX1JFTkRFUikKKwkJCWlndF9z dWJ0ZXN0X2YoImV2ZW50LXdhaXQtJXMiLCBlLT5uYW1lKQorCQkJCWV2ZW50X3dhaXQoZmQsIGUp OworCisJCS8qKgorCQkgKiBDaGVjayB0aGF0IHR3byBwZXJmIGNsaWVudHMgZG8gbm90IGluZmx1 ZW5jZSBlYWNoIG90aGVycworCQkgKiBvYnNlcnZhdGlvbnMuCisJCSAqLworCQlpZ3Rfc3VidGVz dF9mKCJtdWx0aS1jbGllbnQtJXMiLCBlLT5uYW1lKQorCQkJbXVsdGlfY2xpZW50KGZkLCBlKTsK Kwl9CisKKwkvKioKKwkgKiBUZXN0IHRoYXQgd2hlbiBhbGwgZW5naW5lcyBhcmUgbG9hZGVkIGFs bCBsb2FkcyBhcmUKKwkgKiBjb3JyZWN0bHkgcmVwb3J0ZWQuCisJICovCisJaWd0X3N1YnRlc3Qo ImFsbC1idXN5LWNoZWNrLWFsbCIpCisJCWFsbF9idXN5X2NoZWNrX2FsbChmZCwgbnVtX2VuZ2lu ZXMpOworCisJLyoqCisJICogVGVzdCB0aGF0IG5vbi1lbmdpbmUgY291bnRlcnMgY2FuIGJlIGlu aXRpYWxpemVkIGFuZCByZWFkLiBBcGFydAorCSAqIGZyb20gdGhlIGludmFsaWQgbWV0cmljIHdo aWNoIHNob3VsZCBmYWlsLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fb3RoZXJfbWV0cmlj cyArIDE7IGkrKykgeworCQlpZ3Rfc3VidGVzdF9mKCJvdGhlci1pbml0LSV1IiwgaSkKKwkJCWlu aXRfb3RoZXIoaSwgaSA8IG51bV9vdGhlcl9tZXRyaWNzKTsKKworCQlpZ3Rfc3VidGVzdF9mKCJv dGhlci1yZWFkLSV1IiwgaSkKKwkJCXJlYWRfb3RoZXIoaSwgaSA8IG51bV9vdGhlcl9tZXRyaWNz KTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IGNvdW50ZXJzIGFyZSBub3QgYWZmZWN0ZWQgYnkgQ1BV IG9mZmxpbmUvb25saW5lIGV2ZW50cy4KKwkgKi8KKwlpZ3Rfc3VidGVzdCgiY3B1LWhvdHBsdWci KQorCQljcHVfaG90cGx1ZyhmZCk7CisKKwkvKioKKwkgKiBUZXN0IEdQVSBmcmVxdWVuY3kuCisJ ICovCisJaWd0X3N1YnRlc3QoImZyZXF1ZW5jeSIpCisJCXRlc3RfZnJlcXVlbmN5KGZkKTsKKwor CS8qKgorCSAqIFRlc3QgaW50ZXJydXB0IGNvdW50IHJlcG9ydGluZy4KKwkgKi8KKwlpZ3Rfc3Vi dGVzdCgiaW50ZXJydXB0cyIpCisJCXRlc3RfaW50ZXJydXB0cyhmZCk7CisKKwkvKioKKwkgKiBU ZXN0IFJDNiByZXNpZGVuY3kgcmVwb3J0aW5nLgorCSAqLworCWlndF9zdWJ0ZXN0KCJyYzYiKQor CQl0ZXN0X3JjNihmZCk7CisKKwkvKioKKwkgKiBUZXN0IFJDNnAgcmVzaWRlbmN5IHJlcG9ydGlu Zy4KKwkgKi8KKwlpZ3Rfc3VidGVzdCgicmM2cCIpCisJCXRlc3RfcmM2cChmZCk7CisKKwkvKioK KwkgKiBDaGVjayByZW5kZXIgbm9kZXMgYXJlIGNvdW50ZWQuCisJICovCisJaWd0X3N1YnRlc3Rf Z3JvdXAgeworCQlpbnQgcmVuZGVyX2ZkOworCisJCWlndF9maXh0dXJlIHsKKwkJCXJlbmRlcl9m ZCA9IGRybV9vcGVuX2RyaXZlcl9yZW5kZXIoRFJJVkVSX0lOVEVMKTsKKwkJCWlndF9yZXF1aXJl X2dlbShyZW5kZXJfZmQpOworCisJCQlnZW1fcXVpZXNjZW50X2dwdShmZCk7CisJCX0KKworCQlm b3JfZWFjaF9lbmdpbmVfY2xhc3NfaW5zdGFuY2UoZmQsIGUpIHsKKwkJCWlndF9zdWJ0ZXN0X2Yo InJlbmRlci1ub2RlLWJ1c3ktJXMiLCBlLT5uYW1lKQorCQkJCXNpbmdsZShmZCwgZSwgdHJ1ZSk7 CisJCX0KKworCQlpZ3RfZml4dHVyZSB7CisJCQljbG9zZShyZW5kZXJfZmQpOworCQl9CisJfQor fQotLSAKMi4xNC4xCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5v cmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1n ZngK