From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 9EE32F72 for ; Mon, 28 May 2018 13:34:04 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 May 2018 04:34:01 -0700 Message-Id: <0590c7$1ouclg@orsmga001.jf.intel.com> Date: 28 May 2018 04:33:59 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,452,1520924400"; d="scan'208";a="59716272" Received: from unknown (HELO [127.0.1.1]) ([10.240.176.154]) by orsmga001.jf.intel.com with ESMTP; 28 May 2018 04:33:59 -0700 Content-Type: multipart/alternative; boundary="===============6963100185690519969==" MIME-Version: 1.0 From: sys_stv@intel.com To: test-report@dpdk.org Cc: Subject: [dpdk-test-report] |FAILURE| pw40466[dpdk-dev, 18.08, v1, 01/12] net/mlx5: remove flow support X-BeenThere: test-report@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: automatic DPDK test reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 28 May 2018 11:34:06 -0000 --===============6963100185690519969== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 VGVzdC1MYWJlbDogSW50ZWwtY29tcGlsYXRpb24KVGVzdC1TdGF0dXM6IEZBSUxVUkUKaHR0cDov L2RwZGsub3JnL3BhdGNoLzQwNDY2CgpfYXBwbHkgaXNzdWVzXwoKU3VibWl0dGVyOiBObGlvIExh cmFuamVpcm8gPG5lbGlvLmxhcmFuamVpcm9ANndpbmQuY29tPgpEYXRlOiAyMDE4LTA1LTI4IDEx OjIxOjM0CkRQREsgZ2l0IGJhc2VsaW5lOgoJUmVwbzpkcGRrLW1hc3RlciwgQ29tbWl0SUQ6IDgz MDQxMGIyNjU3ZDJhZjBmNWE0NDIyMTM5ZDcxNWMwNGZjNTQ0MTkKCVJlcG86ZHBkay1uZXh0LWV2 ZW50ZGV2LCBDb21taXRJRDogM2M5NTU0OTJiNjAxZDY1NDAyYzAyYWM4MWRmZGM3ZWViNjJmMjNj OQoJUmVwbzpkcGRrLW5leHQtbmV0LCBDb21taXRJRDogYzk0Y2QzMDhmMzQzNTY4ZDUxMmY1NWI4 OTliNzY4NWRhMDA5NmZiMgoJUmVwbzpkcGRrLW5leHQtY3J5cHRvLCBDb21taXRJRDogODMwNDEw YjI2NTdkMmFmMGY1YTQ0MjIxMzlkNzE1YzA0ZmM1NDQxOQoJUmVwbzpkcGRrLW5leHQtdmlydGlv LCBDb21taXRJRDogZTI4MmM3ZWJkNWM3MDM1MDM0NmIzZTEzYjMyZDcwYTJiNDU0MWQ1YgoKKlJl cG86IGRwZGstbWFzdGVyCkNoZWNraW5nIHBhdGNoIGRyaXZlcnMvbmV0L21seDUvbWx4NV9mbG93 LmMuLi4KZXJyb3I6IHdoaWxlIHNlYXJjaGluZyBmb3I6CiNpbmNsdWRlICJtbHg1X3BybS5oIgoj aW5jbHVkZSAibWx4NV9nbHVlLmgiCgovKiBGbG93IHByaW9yaXR5IGZvciBjb250cm9sIHBsYW5l IGZsb3dzLiAqLwojZGVmaW5lIE1MWDVfQ1RSTF9GTE9XX1BSSU9SSVRZIDEKLS0KCi8qKiBTdHJ1 Y3R1cmUgZ2l2ZSB0byB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMuICovCnN0cnVjdCBtbHg1X2Zs b3dfZGF0YSB7CglzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldjsgLyoqIEV0aGVybmV0IGRldmljZS4g Ki8KCXN0cnVjdCBtbHg1X2Zsb3dfcGFyc2UgKnBhcnNlcjsgLyoqIFBhcnNlciBjb250ZXh0LiAq LwoJc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvcjsgLyoqIEVycm9yIGNvbnRleHQuICovCn07 CgpzdGF0aWMgaW50Cm1seDVfZmxvd19jcmVhdGVfZXRoKGNvbnN0IHN0cnVjdCBydGVfZmxvd19p dGVtICppdGVtLAoJCSAgICAgY29uc3Qgdm9pZCAqZGVmYXVsdF9tYXNrLAotLQoJY29uc3QgdWlu dDhfdCAqc3BlYyA9IGl0ZW0tPnNwZWM7Cgljb25zdCB1aW50OF90ICpsYXN0ID0gaXRlbS0+bGFz dDsKCWNvbnN0IHVpbnQ4X3QgKm0gPSBpdGVtLT5tYXNrID8gaXRlbS0+bWFzayA6IG1hc2s7CgoJ aWYgKCFzcGVjICYmIChpdGVtLT5tYXNrIHx8IGxhc3QpKQoJCWdvdG8gZXJyb3I7CglpZiAoIXNw ZWMpCgkJcmV0dXJuIDA7CgkvKgoJICogU2luZ2xlLXBhc3MgY2hlY2sgdG8gbWFrZSBzdXJlIHRo YXQ6CgkgKiAtIGl0ZW0tPm1hc2sgaXMgc3VwcG9ydGVkLCBubyBiaXRzIGFyZSBzZXQgb3V0c2lk ZSBtYXNrLgotLQoJICovCglmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJaWYgKCFtW2ld KQoJCQljb250aW51ZTsKCQlpZiAoKG1baV0gfCBtYXNrW2ldKSAhPSBtYXNrW2ldKQoJCQlnb3Rv IGVycm9yOwoJCWlmIChsYXN0ICYmICgoc3BlY1tpXSAmIG1baV0pICE9IChsYXN0W2ldICYgbVtp XSkpKQoJCQlnb3RvIGVycm9yOwoJfQoJcmV0dXJuIDA7CmVycm9yOgoJcnRlX2Vycm5vID0gRU5P VFNVUDsKCXJldHVybiAtcnRlX2Vycm5vOwp9CgovKioKICogRXh0cmFjdCBhdHRyaWJ1dGUgdG8g dGhlIHBhcnNlci4KICoKICogQHBhcmFtW2luXSBhdHRyCiAqICAgRmxvdyBydWxlIGF0dHJpYnV0 ZXMuCiAqIEBwYXJhbVtvdXRdIGVycm9yCiAqICAgUGVyZm9ybSB2ZXJib3NlIGVycm9yIHJlcG9y dGluZyBpZiBub3QgTlVMTC4KICoKICogQHJldHVybgogKiAgIDAgb24gc3VjY2VzcywgYSBuZWdh dGl2ZSBlcnJubyB2YWx1ZSBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuCiAqLwpzdGF0 aWMgaW50Cm1seDVfZmxvd19jb252ZXJ0X2F0dHJpYnV0ZXMoY29uc3Qgc3RydWN0IHJ0ZV9mbG93 X2F0dHIgKmF0dHIsCgkJCSAgICAgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvcikKewoJaWYg KGF0dHItPmdyb3VwKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLAoJCQkJ ICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRSX0dST1VQLAoJCQkJICAgTlVMTCwKCQkJCSAgICJn cm91cHMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKCQlyZXR1cm4gLXJ0ZV9lcnJubzsKCX0KCWlmIChh dHRyLT5wcmlvcml0eSAmJiBhdHRyLT5wcmlvcml0eSAhPSBNTFg1X0NUUkxfRkxPV19QUklPUklU WSkgewoJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwKCQkJCSAgIFJURV9GTE9X X0VSUk9SX1RZUEVfQVRUUl9QUklPUklUWSwKCQkJCSAgIE5VTEwsCgkJCQkgICAicHJpb3JpdGll cyBhcmUgbm90IHN1cHBvcnRlZCIpOwoJCXJldHVybiAtcnRlX2Vycm5vOwoJfQoJaWYgKGF0dHIt PmVncmVzcykgewoJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwKCQkJCSAgIFJU RV9GTE9XX0VSUk9SX1RZUEVfQVRUUl9FR1JFU1MsCgkJCQkgICBOVUxMLAoJCQkJICAgImVncmVz cyBpcyBub3Qgc3VwcG9ydGVkIik7CgkJcmV0dXJuIC1ydGVfZXJybm87Cgl9CglpZiAoYXR0ci0+ dHJhbnNmZXIpIHsKCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsCgkJCQkgICBS VEVfRkxPV19FUlJPUl9UWVBFX0FUVFJfVFJBTlNGRVIsCgkJCQkgICBOVUxMLAoJCQkJICAgInRy YW5zZmVyIGlzIG5vdCBzdXBwb3J0ZWQiKTsKCQlyZXR1cm4gLXJ0ZV9lcnJubzsKCX0KCWlmICgh YXR0ci0+aW5ncmVzcykgewoJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwKCQkJ CSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQVRUUl9JTkdSRVNTLAoJCQkJICAgTlVMTCwKCQkJCSAg ICJvbmx5IGluZ3Jlc3MgaXMgc3VwcG9ydGVkIik7CgkJcmV0dXJuIC1ydGVfZXJybm87Cgl9Ci0t CiAqCiAqIEBwYXJhbSBkZXYKICogICBQb2ludGVyIHRvIEV0aGVybmV0IGRldmljZS4KICogQHBh cmFtW2luXSBhY3Rpb25zCiAqICAgQXNzb2NpYXRlZCBhY3Rpb25zIChsaXN0IHRlcm1pbmF0ZWQg YnkgdGhlIEVORCBhY3Rpb24pLgogKiBAcGFyYW1bb3V0XSBlcnJvcgogKiAgIFBlcmZvcm0gdmVy Ym9zZSBlcnJvciByZXBvcnRpbmcgaWYgbm90IE5VTEwuCiAqIEBwYXJhbVtpbiwgb3V0XSBwYXJz ZXIKICogICBJbnRlcm5hbCBwYXJzZXIgc3RydWN0dXJlLgogKgogKiBAcmV0dXJuCiAqICAgMCBv biBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5v IGlzIHNldC4KICovCnN0YXRpYyBpbnQKbWx4NV9mbG93X2NvbnZlcnRfYWN0aW9ucyhzdHJ1Y3Qg cnRlX2V0aF9kZXYgKmRldiwKCQkJICBjb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfYWN0aW9uIGFjdGlv bnNbXSwKCQkJICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yLAoJCQkgIHN0cnVjdCBtbHg1 X2Zsb3dfcGFyc2UgKnBhcnNlcikKewoJZW51bSB7IEZBVEUgPSAxLCBNQVJLID0gMiwgQ09VTlQg PSA0LCB9OwoJdWludDMyX3Qgb3ZlcmxhcCA9IDA7CglzdHJ1Y3QgcHJpdiAqcHJpdiA9IGRldi0+ ZGF0YS0+ZGV2X3ByaXZhdGU7Ci0tCgkJCWlmIChvdmVybGFwICYgRkFURSkKCQkJCWdvdG8gZXhp dF9hY3Rpb25fb3ZlcmxhcDsKCQkJb3ZlcmxhcCB8PSBGQVRFOwoJCQlpZiAocnNzLT5mdW5jICYm CgkJCSAgICByc3MtPmZ1bmMgIT0gUlRFX0VUSF9IQVNIX0ZVTkNUSU9OX1RPRVBMSVRaKSB7CgkJ CQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwKCQkJCQkJICAgUlRFX0ZMT1dfRVJS T1JfVFlQRV9BQ1RJT04sCgkJCQkJCSAgIGFjdGlvbnMsCgkJCQkJCSAgICJ0aGUgb25seSBzdXBw b3J0ZWQgUlNTIGhhc2giCgkJCQkJCSAgICIgZnVuY3Rpb24gaXMgVG9lcGxpdHoiKTsKCQkJCXJl dHVybiAtcnRlX2Vycm5vOwoJCQl9CiNpZm5kZWYgSEFWRV9JQlZfREVWSUNFX1RVTk5FTF9TVVBQ T1JUCgkJCWlmIChwYXJzZXItPnJzc19jb25mLmxldmVsID4gMSkgewoJCQkJcnRlX2Zsb3dfZXJy b3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9O LAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAiYSBub256ZXJvIFJTUyBlbmNhcHN1bGF0aW9u IgoJCQkJCQkgICAiIGxldmVsIGlzIG5vdCBzdXBwb3J0ZWQiKTsKCQkJCXJldHVybiAtcnRlX2Vy cm5vOwoJCQl9CiNlbmRpZgoJCQlpZiAocGFyc2VyLT5yc3NfY29uZi5sZXZlbCA+IDIpIHsKCQkJ CXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLAoJCQkJCQkgICBSVEVfRkxPV19FUlJP Ul9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgIlJTUyBlbmNhcHN1bGF0 aW9uIGxldmVsIgoJCQkJCQkgICAiID4gMSBpcyBub3Qgc3VwcG9ydGVkIik7CgkJCQlyZXR1cm4g LXJ0ZV9lcnJubzsKCQkJfQoJCQlpZiAocnNzLT50eXBlcyAmIE1MWDVfUlNTX0hGX01BU0spIHsK CQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLAoJCQkJCQkgICBSVEVfRkxPV19F UlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgInVuc3VwcG9ydGVk IFJTUyB0eXBlIgoJCQkJCQkgICAiIHJlcXVlc3RlZCIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87 Ci0tCgkJCX0gZWxzZSB7CgkJCQlyc3Nfa2V5X2xlbiA9IHJzc19oYXNoX2RlZmF1bHRfa2V5X2xl bjsKCQkJCXJzc19rZXkgPSByc3NfaGFzaF9kZWZhdWx0X2tleTsKCQkJfQoJCQlpZiAocnNzX2tl eV9sZW4gIT0gUlRFX0RJTShwYXJzZXItPnJzc19rZXkpKSB7CgkJCQlydGVfZmxvd19lcnJvcl9z ZXQoZXJyb3IsIEVJTlZBTCwKCQkJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BQ1RJT04sCgkJ CQkJCSAgIGFjdGlvbnMsCgkJCQkJCSAgICJSU1MgaGFzaCBrZXkgbXVzdCBiZSIKCQkJCQkJICAg IiBleGFjdGx5IDQwIGJ5dGVzIGxvbmciKTsKCQkJCXJldHVybiAtcnRlX2Vycm5vOwoJCQl9CgkJ CWlmICghcnNzLT5xdWV1ZV9udW0pIHsKCQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlO VkFMLAoJCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9u cywKCQkJCQkJICAgIm5vIHZhbGlkIHF1ZXVlcyIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87CgkJ CX0KCQkJaWYgKHJzcy0+cXVldWVfbnVtID4gUlRFX0RJTShwYXJzZXItPnF1ZXVlcykpIHsKCQkJ CXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLAoJCQkJCQkgICBSVEVfRkxPV19FUlJP Ul9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgInRvbyBtYW55IHF1ZXVl cyBmb3IgUlNTIgoJCQkJCQkgICAiIGNvbnRleHQiKTsKCQkJCXJldHVybiAtcnRlX2Vycm5vOwoJ CQl9CgkJCWZvciAobiA9IDA7IG4gPCByc3MtPnF1ZXVlX251bTsgKytuKSB7CgkJCQlpZiAocnNz LT5xdWV1ZVtuXSA+PSBwcml2LT5yeHFzX24pIHsKCQkJCQlydGVfZmxvd19lcnJvcl9zZXQoZXJy b3IsIEVJTlZBTCwKCQkJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BQ1RJT04sCgkJCQkJCSAg IGFjdGlvbnMsCgkJCQkJCSAgICJxdWV1ZSBpZCA+IG51bWJlciBvZiIKCQkJCQkJICAgIiBxdWV1 ZXMiKTsKCQkJCQlyZXR1cm4gLXJ0ZV9lcnJubzsKLS0KCgkJCWlmIChvdmVybGFwICYgTUFSSykK CQkJCWdvdG8gZXhpdF9hY3Rpb25fb3ZlcmxhcDsKCQkJb3ZlcmxhcCB8PSBNQVJLOwoJCQlpZiAo IW1hcmspIHsKCQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLAoJCQkJCQkgICBS VEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgIm1h cmsgbXVzdCBiZSBkZWZpbmVkIik7CgkJCQlyZXR1cm4gLXJ0ZV9lcnJubzsKCQkJfSBlbHNlIGlm IChtYXJrLT5pZCA+PSBNTFg1X0ZMT1dfTUFSS19NQVgpIHsKCQkJCXJ0ZV9mbG93X2Vycm9yX3Nl dChlcnJvciwgRU5PVFNVUCwKCQkJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BQ1RJT04sCgkJ CQkJCSAgIGFjdGlvbnMsCgkJCQkJCSAgICJtYXJrIG11c3QgYmUgYmV0d2VlbiAwIgoJCQkJCQkg ICAiIGFuZCAxNjc3NzE5OSIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87Ci0tCglpZiAoIShvdmVy bGFwICYgRkFURSkpCgkJcGFyc2VyLT5kcm9wID0gMTsKCWlmIChwYXJzZXItPmRyb3AgJiYgcGFy c2VyLT5tYXJrKQoJCXBhcnNlci0+bWFyayA9IDA7CglpZiAoIXBhcnNlci0+cnNzX2NvbmYucXVl dWVfbnVtICYmICFwYXJzZXItPmRyb3ApIHsKCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVO T1RTVVAsIFJURV9GTE9XX0VSUk9SX1RZUEVfSEFORExFLAoJCQkJICAgTlVMTCwgIm5vIHZhbGlk IGFjdGlvbiIpOwoJCXJldHVybiAtcnRlX2Vycm5vOwoJfQoJcmV0dXJuIDA7CmV4aXRfYWN0aW9u X25vdF9zdXBwb3J0ZWQ6CglydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsIFJURV9G TE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkgICBhY3Rpb25zLCAiYWN0aW9uIG5vdCBzdXBwb3J0 ZWQiKTsKCXJldHVybiAtcnRlX2Vycm5vOwpleGl0X2FjdGlvbl9vdmVybGFwOgoJcnRlX2Zsb3df ZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLCBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwKCQkJ ICAgYWN0aW9ucywgIm92ZXJsYXBwaW5nIGFjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKCXJl dHVybiAtcnRlX2Vycm5vOwp9CgovKioKICogVmFsaWRhdGUgaXRlbXMuCiAqCiAqIEBwYXJhbVtp bl0gaXRlbXMKICogICBQYXR0ZXJuIHNwZWNpZmljYXRpb24gKGxpc3QgdGVybWluYXRlZCBieSB0 aGUgRU5EIHBhdHRlcm4gaXRlbSkuCiAqIEBwYXJhbVtvdXRdIGVycm9yCiAqICAgUGVyZm9ybSB2 ZXJib3NlIGVycm9yIHJlcG9ydGluZyBpZiBub3QgTlVMTC4KICogQHBhcmFtW2luLCBvdXRdIHBh cnNlcgogKiAgIEludGVybmFsIHBhcnNlciBzdHJ1Y3R1cmUuCiAqCiAqIEByZXR1cm4KICogICAw IG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3aXNlIGFuZCBydGVfZXJy bm8gaXMgc2V0LgogKi8Kc3RhdGljIGludAptbHg1X2Zsb3dfY29udmVydF9pdGVtc192YWxpZGF0 ZShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwKCQkJCSBjb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfaXRl bSBpdGVtc1tdLAoJCQkJIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IsCgkJCQkgc3RydWN0 IG1seDVfZmxvd19wYXJzZSAqcGFyc2VyKQp7CglzdHJ1Y3QgcHJpdiAqcHJpdiA9IGRldi0+ZGF0 YS0+ZGV2X3ByaXZhdGU7Cgljb25zdCBzdHJ1Y3QgbWx4NV9mbG93X2l0ZW1zICpjdXJfaXRlbSA9 IG1seDVfZmxvd19pdGVtczsKCXVuc2lnbmVkIGludCBpOwotLQoJCQkJCSAgICAgIGN1cl9pdGVt LT5tYXNrX3N6KTsKCQlpZiAocmV0KQoJCQlnb3RvIGV4aXRfaXRlbV9ub3Rfc3VwcG9ydGVkOwoJ CWlmIChJU19UVU5ORUwoaXRlbXMtPnR5cGUpKSB7CgkJCWlmIChwYXJzZXItPnR1bm5lbCkgewoJ CQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLAoJCQkJCQkgICBSVEVfRkxPV19F UlJPUl9UWVBFX0lURU0sCgkJCQkJCSAgIGl0ZW1zLAoJCQkJCQkgICAiQ2Fubm90IHJlY29nbml6 ZSBtdWx0aXBsZSIKCQkJCQkJICAgIiB0dW5uZWwgZW5jYXBzdWxhdGlvbnMuIik7CgkJCQlyZXR1 cm4gLXJ0ZV9lcnJubzsKCQkJfQoJCQlpZiAoIXByaXYtPmNvbmZpZy50dW5uZWxfZW4gJiYKCQkJ ICAgIHBhcnNlci0+cnNzX2NvbmYubGV2ZWwgPiAxKSB7CgkJCQlydGVfZmxvd19lcnJvcl9zZXQo ZXJyb3IsIEVOT1RTVVAsCgkJCQkJUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLAoJCQkJCWl0ZW1z LAoJCQkJCSJSU1Mgb24gdHVubmVsIGlzIG5vdCBzdXBwb3J0ZWQiKTsKCQkJCXJldHVybiAtcnRl X2Vycm5vOwoJCQl9Ci0tCgkJZm9yIChpID0gMDsgaSAhPSBoYXNoX3J4cV9pbml0X247ICsraSkK CQkJcGFyc2VyLT5xdWV1ZVtpXS5vZmZzZXQgKz0gc2l6ZTsKCX0KCXJldHVybiAwOwpleGl0X2l0 ZW1fbm90X3N1cHBvcnRlZDoKCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIC1yZXQs IFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwKCQkJCSAgaXRlbXMsICJpdGVtIG5vdCBzdXBwb3J0 ZWQiKTsKfQoKLyoqCiAqIEFsbG9jYXRlIG1lbW9yeSBzcGFjZSB0byBzdG9yZSB2ZXJicyBmbG93 IGF0dHJpYnV0ZXMuCiAqCiAqIEBwYXJhbVtpbl0gc2l6ZQogKiAgIEFtb3VudCBvZiBieXRlIHRv IGFsbG9jYXRlLgogKiBAcGFyYW1bb3V0XSBlcnJvcgogKiAgIFBlcmZvcm0gdmVyYm9zZSBlcnJv ciByZXBvcnRpbmcgaWYgbm90IE5VTEwuCiAqCiAqIEByZXR1cm4KICogICBBIHZlcmJzIGZsb3cg YXR0cmlidXRlIG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlIGFuZCBydGVfZXJybm8gaXMgc2V0 LgogKi8Kc3RhdGljIHN0cnVjdCBpYnZfZmxvd19hdHRyICoKbWx4NV9mbG93X2NvbnZlcnRfYWxs b2NhdGUodW5zaWduZWQgaW50IHNpemUsIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IpCnsK CXN0cnVjdCBpYnZfZmxvd19hdHRyICppYnZfYXR0cjsKCglpYnZfYXR0ciA9IHJ0ZV9jYWxsb2Mo X19mdW5jX18sIDEsIHNpemUsIDApOwoJaWYgKCFpYnZfYXR0cikgewoJCXJ0ZV9mbG93X2Vycm9y X3NldChlcnJvciwgRU5PTUVNLAoJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9VTlNQRUNJRklF RCwKCQkJCSAgIE5VTEwsCgkJCQkgICAiY2Fubm90IGFsbG9jYXRlIHZlcmJzIHNwZWMgYXR0cmli dXRlcyIpOwoJCXJldHVybiBOVUxMOwoJfQotLQogKiAgIEZsb3cgcnVsZSBhdHRyaWJ1dGVzLgog KiBAcGFyYW1baW5dIHBhdHRlcm4KICogICBQYXR0ZXJuIHNwZWNpZmljYXRpb24gKGxpc3QgdGVy bWluYXRlZCBieSB0aGUgRU5EIHBhdHRlcm4gaXRlbSkuCiAqIEBwYXJhbVtpbl0gYWN0aW9ucwog KiAgIEFzc29jaWF0ZWQgYWN0aW9ucyAobGlzdCB0ZXJtaW5hdGVkIGJ5IHRoZSBFTkQgYWN0aW9u KS4KICogQHBhcmFtW291dF0gZXJyb3IKICogICBQZXJmb3JtIHZlcmJvc2UgZXJyb3IgcmVwb3J0 aW5nIGlmIG5vdCBOVUxMLgogKiBAcGFyYW1baW4sIG91dF0gcGFyc2VyCiAqICAgSW50ZXJuYWwg cGFyc2VyIHN0cnVjdHVyZS4KICoKICogQHJldHVybgogKiAgIDAgb24gc3VjY2VzcywgYSBuZWdh dGl2ZSBlcnJubyB2YWx1ZSBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuCi0tCnN0YXRp YyBpbnQKbWx4NV9mbG93X2NvbnZlcnQoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYsCgkJICBjb25z dCBzdHJ1Y3QgcnRlX2Zsb3dfYXR0ciAqYXR0ciwKCQkgIGNvbnN0IHN0cnVjdCBydGVfZmxvd19p dGVtIGl0ZW1zW10sCgkJICBjb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfYWN0aW9uIGFjdGlvbnNbXSwK CQkgIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IsCgkJICBzdHJ1Y3QgbWx4NV9mbG93X3Bh cnNlICpwYXJzZXIpCnsKCWNvbnN0IHN0cnVjdCBtbHg1X2Zsb3dfaXRlbXMgKmN1cl9pdGVtID0g bWx4NV9mbG93X2l0ZW1zOwoJdW5zaWduZWQgaW50IGk7CglpbnQgcmV0OwotLQoJKnBhcnNlciA9 IChzdHJ1Y3QgbWx4NV9mbG93X3BhcnNlKXsKCQkuY3JlYXRlID0gcGFyc2VyLT5jcmVhdGUsCgkJ LmxheWVyID0gSEFTSF9SWFFfRVRILAoJCS5tYXJrX2lkID0gTUxYNV9GTE9XX01BUktfREVGQVVM VCwKCX07CglyZXQgPSBtbHg1X2Zsb3dfY29udmVydF9hdHRyaWJ1dGVzKGF0dHIsIGVycm9yKTsK CWlmIChyZXQpCgkJcmV0dXJuIHJldDsKCXJldCA9IG1seDVfZmxvd19jb252ZXJ0X2FjdGlvbnMo ZGV2LCBhY3Rpb25zLCBlcnJvciwgcGFyc2VyKTsKCWlmIChyZXQpCgkJcmV0dXJuIHJldDsKCXJl dCA9IG1seDVfZmxvd19jb252ZXJ0X2l0ZW1zX3ZhbGlkYXRlKGRldiwgaXRlbXMsIGVycm9yLCBw YXJzZXIpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoJbWx4NV9mbG93X2NvbnZlcnRfZmluYWxp c2UocGFyc2VyKTsKCS8qCgkgKiBTZWNvbmQgc3RlcC4KLS0KCSAqLwoJaWYgKHBhcnNlci0+ZHJv cCkgewoJCXVuc2lnbmVkIGludCBvZmZzZXQgPSBwYXJzZXItPnF1ZXVlW0hBU0hfUlhRX0VUSF0u b2Zmc2V0OwoKCQlwYXJzZXItPnF1ZXVlW0hBU0hfUlhRX0VUSF0uaWJ2X2F0dHIgPQoJCQltbHg1 X2Zsb3dfY29udmVydF9hbGxvY2F0ZShvZmZzZXQsIGVycm9yKTsKCQlpZiAoIXBhcnNlci0+cXVl dWVbSEFTSF9SWFFfRVRIXS5pYnZfYXR0cikKCQkJZ290byBleGl0X2Vub21lbTsKCQlwYXJzZXIt PnF1ZXVlW0hBU0hfUlhRX0VUSF0ub2Zmc2V0ID0KCQkJc2l6ZW9mKHN0cnVjdCBpYnZfZmxvd19h dHRyKTsKCX0gZWxzZSB7CgkJZm9yIChpID0gMDsgaSAhPSBoYXNoX3J4cV9pbml0X247ICsraSkg ewoJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoKCQkJb2Zmc2V0ID0gcGFyc2VyLT5xdWV1ZVtpXS5v ZmZzZXQ7CgkJCXBhcnNlci0+cXVldWVbaV0uaWJ2X2F0dHIgPQoJCQkJbWx4NV9mbG93X2NvbnZl cnRfYWxsb2NhdGUob2Zmc2V0LCBlcnJvcik7CgkJCWlmICghcGFyc2VyLT5xdWV1ZVtpXS5pYnZf YXR0cikKCQkJCWdvdG8gZXhpdF9lbm9tZW07CgkJCXBhcnNlci0+cXVldWVbaV0ub2Zmc2V0ID0g c2l6ZW9mKHN0cnVjdCBpYnZfZmxvd19hdHRyKTsKCQl9Cgl9Ci0tCglwYXJzZXItPmxheWVyID0g SEFTSF9SWFFfRVRIOwoJZm9yICg7IGl0ZW1zLT50eXBlICE9IFJURV9GTE9XX0lURU1fVFlQRV9F TkQ7ICsraXRlbXMpIHsKCQlzdHJ1Y3QgbWx4NV9mbG93X2RhdGEgZGF0YSA9IHsKCQkJLmRldiA9 IGRldiwKCQkJLnBhcnNlciA9IHBhcnNlciwKCQkJLmVycm9yID0gZXJyb3IsCgkJfTsKCgkJaWYg KGl0ZW1zLT50eXBlID09IFJURV9GTE9XX0lURU1fVFlQRV9WT0lEKQoJCQljb250aW51ZTsKCQlj dXJfaXRlbSA9ICZtbHg1X2Zsb3dfaXRlbXNbaXRlbXMtPnR5cGVdOwotLQoJaWYgKHBhcnNlci0+ bWFyaykKCQltbHg1X2Zsb3dfY3JlYXRlX2ZsYWdfbWFyayhwYXJzZXIsIHBhcnNlci0+bWFya19p ZCk7CglpZiAocGFyc2VyLT5jb3VudCAmJiBwYXJzZXItPmNyZWF0ZSkgewoJCW1seDVfZmxvd19j cmVhdGVfY291bnQoZGV2LCBwYXJzZXIpOwoJCWlmICghcGFyc2VyLT5jcykKCQkJZ290byBleGl0 X2NvdW50X2Vycm9yOwoJfQpleGl0X2ZyZWU6CgkvKiBPbmx5IHZlcmlmaWNhdGlvbiBpcyBleHBl Y3RlZCwgYWxsIHJlc291cmNlcyBzaG91bGQgYmUgcmVsZWFzZWQuICovCglpZiAoIXBhcnNlci0+ Y3JlYXRlKSB7CgkJZm9yIChpID0gMDsgaSAhPSBoYXNoX3J4cV9pbml0X247ICsraSkgewotLQoJ CWlmIChwYXJzZXItPnF1ZXVlW2ldLmlidl9hdHRyKSB7CgkJCXJ0ZV9mcmVlKHBhcnNlci0+cXVl dWVbaV0uaWJ2X2F0dHIpOwoJCQlwYXJzZXItPnF1ZXVlW2ldLmlidl9hdHRyID0gTlVMTDsKCQl9 Cgl9CglydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT01FTSwgUlRFX0ZMT1dfRVJST1JfVFlQ RV9VTlNQRUNJRklFRCwKCQkJICAgTlVMTCwgImNhbm5vdCBhbGxvY2F0ZSB2ZXJicyBzcGVjIGF0 dHJpYnV0ZXMiKTsKCXJldHVybiAtcnRlX2Vycm5vOwpleGl0X2NvdW50X2Vycm9yOgoJcnRlX2Zs b3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsIFJURV9GTE9XX0VSUk9SX1RZUEVfVU5TUEVDSUZJ RUQsCgkJCSAgIE5VTEwsICJjYW5ub3QgY3JlYXRlIGNvdW50ZXIiKTsKCXJldHVybiAtcnRlX2Vy cm5vOwp9CgovKioKLS0KCQkJLyoKCQkJICogRnJvbSB2ZXJicyBwZXJzcGVjdGl2ZSBhbiBlbXB0 eSBWTEFOIGlzIGVxdWl2YWxlbnQKCQkJICogdG8gYSBwYWNrZXQgd2l0aG91dCBWTEFOIGxheWVy LgoJCQkgKi8KCQkJaWYgKCFldGgtPm1hc2sudmxhbl90YWcpCgkJCQlnb3RvIGVycm9yOwoJCQkv KiBPdXRlciBUUElEIGNhbm5vdCBiZSBtYXRjaGVkLiAqLwoJCQlpZiAoZXRoLT5tYXNrLmV0aGVy X3R5cGUpIHsKCQkJCW1zZyA9ICJWTEFOIFRQSUQgbWF0Y2hpbmcgaXMgbm90IHN1cHBvcnRlZCI7 CgkJCQlnb3RvIGVycm9yOwoJCQl9CgkJCWV0aC0+dmFsLmV0aGVyX3R5cGUgPSBzcGVjLT5pbm5l cl90eXBlOwoJCQlldGgtPm1hc2suZXRoZXJfdHlwZSA9IG1hc2stPmlubmVyX3R5cGU7CgkJCWV0 aC0+dmFsLmV0aGVyX3R5cGUgJj0gZXRoLT5tYXNrLmV0aGVyX3R5cGU7CgkJfQoJCXJldHVybiAw OwoJfQplcnJvcjoKCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZGF0YS0+ZXJyb3IsIEVJTlZB TCwgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLAoJCQkJICBpdGVtLCBtc2cpOwp9CgovKioKICog Q29udmVydCBJUHY0IGl0ZW0gdG8gVmVyYnMgc3BlY2lmaWNhdGlvbi4KLS0KCX07CgoJaWYgKHBh cnNlci0+bGF5ZXIgPT0gSEFTSF9SWFFfVFVOTkVMICYmCgkgICAgcGFyc2VyLT50dW5uZWwgPT0g cHR5cGVfZXh0W1BUWVBFX0lEWChSVEVfUFRZUEVfVFVOTkVMX1ZYTEFOKV0gJiYKCSAgICAhcHJp di0+Y29uZmlnLmwzX3Z4bGFuX2VuKQoJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZGF0YS0+ ZXJyb3IsIEVJTlZBTCwKCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwKCQkJCQkgIGl0 ZW0sCgkJCQkJICAiTDMgVlhMQU4gbm90IGVuYWJsZWQgYnkgZGV2aWNlIgoJCQkJCSAgIiBwYXJh bWV0ZXIgYW5kL29yIG5vdCBjb25maWd1cmVkIgoJCQkJCSAgIiBpbiBmaXJtd2FyZSIpOwotLQoJ fTsKCglpZiAocGFyc2VyLT5sYXllciA9PSBIQVNIX1JYUV9UVU5ORUwgJiYKCSAgICBwYXJzZXIt PnR1bm5lbCA9PSBwdHlwZV9leHRbUFRZUEVfSURYKFJURV9QVFlQRV9UVU5ORUxfVlhMQU4pXSAm JgoJICAgICFwcml2LT5jb25maWcubDNfdnhsYW5fZW4pCgkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9y X3NldChkYXRhLT5lcnJvciwgRUlOVkFMLAoJCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVN LAoJCQkJCSAgaXRlbSwKCQkJCQkgICJMMyBWWExBTiBub3QgZW5hYmxlZCBieSBkZXZpY2UiCgkJ CQkJICAiIHBhcmFtZXRlciBhbmQvb3Igbm90IGNvbmZpZ3VyZWQiCgkJCQkJICAiIGluIGZpcm13 YXJlIik7Ci0tCgkgKiBiZWZvcmUgd2lsbCBhbHNvIG1hdGNoIHRoaXMgcnVsZS4KCSAqIFRvIGF2 b2lkIHN1Y2ggc2l0dWF0aW9uLCBWTkkgMCBpcyBjdXJyZW50bHkgcmVmdXNlZC4KCSAqLwoJLyog T25seSBhbGxvdyB0dW5uZWwgdy9vIHR1bm5lbCBpZCBwYXR0ZXJuIGFmdGVyIHByb3BlciBvdXRl ciBzcGVjLiAqLwoJaWYgKHBhcnNlci0+b3V0X2xheWVyID09IEhBU0hfUlhRX0VUSCAmJiAhdnhs YW4udmFsLnR1bm5lbF9pZCkKCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGRhdGEtPmVycm9y LCBFSU5WQUwsCgkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJCQkJICBpdGVtLAoJ CQkJCSAgIlZ4TEFOIHZuaSBjYW5ub3QgYmUgMCIpOwoJbWx4NV9mbG93X2NyZWF0ZV9jb3B5KHBh cnNlciwgJnZ4bGFuLCBzaXplKTsKCXJldHVybiAwOwotLQoJCXVpbnQzMl90IHZsYW5faWQ7CgkJ dWludDhfdCB2bmlbNF07Cgl9IGlkOwoKCWlmICghcHJpdi0+Y29uZmlnLmwzX3Z4bGFuX2VuKQoJ CXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZGF0YS0+ZXJyb3IsIEVJTlZBTCwKCQkJCQkgIFJU RV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwKCQkJCQkgIGl0ZW0sCgkJCQkJICAiTDMgVlhMQU4gbm90 IGVuYWJsZWQgYnkgZGV2aWNlIgoJCQkJCSAgIiBwYXJhbWV0ZXIgYW5kL29yIG5vdCBjb25maWd1 cmVkIgoJCQkJCSAgIiBpbiBmaXJtd2FyZSIpOwotLQoJCW1lbWNweSgmaWQudm5pWzFdLCBzcGVj LT52bmksIDMpOwoJCXZ4bGFuLnZhbC50dW5uZWxfaWQgPSBpZC52bGFuX2lkOwoJCW1lbWNweSgm aWQudm5pWzFdLCBtYXNrLT52bmksIDMpOwoJCXZ4bGFuLm1hc2sudHVubmVsX2lkID0gaWQudmxh bl9pZDsKCQlpZiAoc3BlYy0+cHJvdG9jb2wpCgkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQo ZGF0YS0+ZXJyb3IsIEVJTlZBTCwKCQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJ CQkJCSAgaXRlbSwKCQkJCQkJICAiVnhMQU4tR1BFIHByb3RvY29sIG5vdCIKCQkJCQkJICAiIHN1 cHBvcnRlZCIpOwoJCS8qIFJlbW92ZSB1bndhbnRlZCBiaXRzIGZyb20gdmFsdWVzLiAqLwotLQoJ ICogYmVmb3JlIHdpbGwgYWxzbyBtYXRjaCB0aGlzIHJ1bGUuCgkgKiBUbyBhdm9pZCBzdWNoIHNp dHVhdGlvbiwgVk5JIDAgaXMgY3VycmVudGx5IHJlZnVzZWQuCgkgKi8KCS8qIE9ubHkgYWxsb3cg dHVubmVsIHcvbyB0dW5uZWwgaWQgcGF0dGVybiBhZnRlciBwcm9wZXIgb3V0ZXIgc3BlYy4gKi8K CWlmIChwYXJzZXItPm91dF9sYXllciA9PSBIQVNIX1JYUV9FVEggJiYgIXZ4bGFuLnZhbC50dW5u ZWxfaWQpCgkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChkYXRhLT5lcnJvciwgRUlOVkFMLAoJ CQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLAoJCQkJCSAgaXRlbSwKCQkJCQkgICJWeExB Ti1HUEUgdm5pIGNhbm5vdCBiZSAwIik7CgltbHg1X2Zsb3dfY3JlYXRlX2NvcHkocGFyc2VyLCAm dnhsYW4sIHNpemUpOwoJcmV0dXJuIDA7Ci0tCgkJCWlwdjYtPnZhbC5uZXh0X2hkciA9IE1MWDVf R1JFOwoJCQlpcHY2LT5tYXNrLm5leHRfaGRyID0gMHhmZjsKCQl9Cgl9CglpZiAoaSAhPSBoYXNo X3J4cV9pbml0X24pCgkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChkYXRhLT5lcnJvciwgRUlO VkFMLAoJCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLAoJCQkJCSAgaXRlbSwKCQkJCQkg ICJJUCBwcm90b2NvbCBvZiBHUkUgbXVzdCBiZSA0NyIpOwoJbWx4NV9mbG93X2NyZWF0ZV9jb3B5 KHBhcnNlciwgJnR1bm5lbCwgc2l6ZSk7CglyZXR1cm4gMDsKLS0KICogICBQb2ludGVyIHRvIEV0 aGVybmV0IGRldmljZS4KICogQHBhcmFtIHBhcnNlcgogKiAgIEludGVybmFsIHBhcnNlciBzdHJ1 Y3R1cmUuCiAqIEBwYXJhbSBmbG93CiAqICAgUG9pbnRlciB0byB0aGUgcnRlX2Zsb3cuCiAqIEBw YXJhbVtvdXRdIGVycm9yCiAqICAgUGVyZm9ybSB2ZXJib3NlIGVycm9yIHJlcG9ydGluZyBpZiBu b3QgTlVMTC4KICoKICogQHJldHVybgogKiAgIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJu byB2YWx1ZSBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuCiAqLwpzdGF0aWMgaW50Cm1s eDVfZmxvd19jcmVhdGVfYWN0aW9uX3F1ZXVlX2Ryb3Aoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYs CgkJCQkgICBzdHJ1Y3QgbWx4NV9mbG93X3BhcnNlICpwYXJzZXIsCgkJCQkgICBzdHJ1Y3QgcnRl X2Zsb3cgKmZsb3csCgkJCQkgICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQp7CglzdHJ1 Y3QgcHJpdiAqcHJpdiA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7CglzdHJ1Y3QgaWJ2X2Zsb3df c3BlY19hY3Rpb25fZHJvcCAqZHJvcDsKCXVuc2lnbmVkIGludCBzaXplID0gc2l6ZW9mKHN0cnVj dCBpYnZfZmxvd19zcGVjX2FjdGlvbl9kcm9wKTsKCi0tCglwYXJzZXItPnF1ZXVlW0hBU0hfUlhR X0VUSF0uaWJ2X2F0dHIgPSBOVUxMOwoJZmxvdy0+ZnJ4cVtIQVNIX1JYUV9FVEhdLmlidl9mbG93 ID0KCQltbHg1X2dsdWUtPmNyZWF0ZV9mbG93KHByaXYtPmZsb3dfZHJvcF9xdWV1ZS0+cXAsCgkJ CQkgICAgICAgZmxvdy0+ZnJ4cVtIQVNIX1JYUV9FVEhdLmlidl9hdHRyKTsKCWlmICghZmxvdy0+ ZnJ4cVtIQVNIX1JYUV9FVEhdLmlidl9mbG93KSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9y LCBFTk9NRU0sIFJURV9GTE9XX0VSUk9SX1RZUEVfSEFORExFLAoJCQkJICAgTlVMTCwgImZsb3cg cnVsZSBjcmVhdGlvbiBmYWlsdXJlIik7CgkJZ290byBlcnJvcjsKCX0KCXJldHVybiAwOwplcnJv cjoKCWFzc2VydChmbG93KTsKCWlmIChmbG93LT5mcnhxW0hBU0hfUlhRX0VUSF0uaWJ2X2Zsb3cp IHsKCQljbGFpbV96ZXJvKG1seDVfZ2x1ZS0+ZGVzdHJveV9mbG93CgkJCSAgIChmbG93LT5mcnhx W0hBU0hfUlhRX0VUSF0uaWJ2X2Zsb3cpKTsKCQlmbG93LT5mcnhxW0hBU0hfUlhRX0VUSF0uaWJ2 X2Zsb3cgPSBOVUxMOwotLQogKiAgIFBvaW50ZXIgdG8gRXRoZXJuZXQgZGV2aWNlLgogKiBAcGFy YW0gcGFyc2VyCiAqICAgSW50ZXJuYWwgcGFyc2VyIHN0cnVjdHVyZS4KICogQHBhcmFtIGZsb3cK ICogICBQb2ludGVyIHRvIHRoZSBydGVfZmxvdy4KICogQHBhcmFtW291dF0gZXJyb3IKICogICBQ ZXJmb3JtIHZlcmJvc2UgZXJyb3IgcmVwb3J0aW5nIGlmIG5vdCBOVUxMLgogKgogKiBAcmV0dXJu CiAqICAgMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQg cnRlX2Vycm5vIGlzIHNldC4KICovCnN0YXRpYyBpbnQKbWx4NV9mbG93X2NyZWF0ZV9hY3Rpb25f cXVldWVfcnNzKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LAoJCQkJICBzdHJ1Y3QgbWx4NV9mbG93 X3BhcnNlICpwYXJzZXIsCgkJCQkgIHN0cnVjdCBydGVfZmxvdyAqZmxvdywKCQkJCSAgc3RydWN0 IHJ0ZV9mbG93X2Vycm9yICplcnJvcikKewoJdW5zaWduZWQgaW50IGk7CgoJZm9yIChpID0gMDsg aSAhPSBoYXNoX3J4cV9pbml0X247ICsraSkgewoJCWlmICghcGFyc2VyLT5xdWV1ZVtpXS5pYnZf YXR0cikKLS0KCQkJCSAgICAgIHBhcnNlci0+cnNzX2NvbmYucXVldWUsCgkJCQkgICAgICBwYXJz ZXItPnJzc19jb25mLnF1ZXVlX251bSwKCQkJCSAgICAgIHBhcnNlci0+dHVubmVsLAoJCQkJICAg ICAgcGFyc2VyLT5yc3NfY29uZi5sZXZlbCk7CgkJaWYgKCFmbG93LT5mcnhxW2ldLmhyeHEpIHsK CQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PTUVNLAoJCQkJCQkgIFJURV9G TE9XX0VSUk9SX1RZUEVfSEFORExFLAoJCQkJCQkgIE5VTEwsCgkJCQkJCSAgImNhbm5vdCBjcmVh dGUgaGFzaCByeHEiKTsKCQl9Cgl9Ci0tCiAqICAgUG9pbnRlciB0byBFdGhlcm5ldCBkZXZpY2Uu CiAqIEBwYXJhbSBwYXJzZXIKICogICBJbnRlcm5hbCBwYXJzZXIgc3RydWN0dXJlLgogKiBAcGFy YW0gZmxvdwogKiAgIFBvaW50ZXIgdG8gdGhlIHJ0ZV9mbG93LgogKiBAcGFyYW1bb3V0XSBlcnJv cgogKiAgIFBlcmZvcm0gdmVyYm9zZSBlcnJvciByZXBvcnRpbmcgaWYgbm90IE5VTEwuCiAqCiAq IEByZXR1cm4KICogICAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3 aXNlIGFuZCBydGVfZXJybm8gaXMgc2V0LgogKi8Kc3RhdGljIGludAptbHg1X2Zsb3dfY3JlYXRl X2FjdGlvbl9xdWV1ZShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwKCQkJICAgICAgc3RydWN0IG1s eDVfZmxvd19wYXJzZSAqcGFyc2VyLAoJCQkgICAgICBzdHJ1Y3QgcnRlX2Zsb3cgKmZsb3csCgkJ CSAgICAgIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IpCnsKCXN0cnVjdCBwcml2ICpwcml2 IF9fcnRlX3VudXNlZCA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7CglpbnQgcmV0OwoJdW5zaWdu ZWQgaW50IGk7Cgl1bnNpZ25lZCBpbnQgZmxvd3NfbiA9IDA7CgoJYXNzZXJ0KHByaXYtPnBkKTsK CWFzc2VydChwcml2LT5jdHgpOwoJYXNzZXJ0KCFwYXJzZXItPmRyb3ApOwoJcmV0ID0gbWx4NV9m bG93X2NyZWF0ZV9hY3Rpb25fcXVldWVfcnNzKGRldiwgcGFyc2VyLCBmbG93LCBlcnJvcik7Cglp ZiAocmV0KQoJCWdvdG8gZXJyb3I7CglpZiAocGFyc2VyLT5jb3VudCkKCQlmbG93LT5jcyA9IHBh cnNlci0+Y3M7CglpZiAoIWRldi0+ZGF0YS0+ZGV2X3N0YXJ0ZWQpCgkJcmV0dXJuIDA7Cglmb3Ig KGkgPSAwOyBpICE9IGhhc2hfcnhxX2luaXRfbjsgKytpKSB7Ci0tCgkJZmxvdy0+ZnJ4cVtpXS5p YnZfZmxvdyA9CgkJCW1seDVfZ2x1ZS0+Y3JlYXRlX2Zsb3coZmxvdy0+ZnJ4cVtpXS5ocnhxLT5x cCwKCQkJCQkgICAgICAgZmxvdy0+ZnJ4cVtpXS5pYnZfYXR0cik7CgkJbWx4NV9mbG93X2R1bXAo ZGV2LCBmbG93LCBpKTsKCQlpZiAoIWZsb3ctPmZyeHFbaV0uaWJ2X2Zsb3cpIHsKCQkJcnRlX2Zs b3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9NRU0sCgkJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9I QU5ETEUsCgkJCQkJICAgTlVMTCwgImZsb3cgcnVsZSBjcmVhdGlvbiBmYWlsdXJlIik7CgkJCWdv dG8gZXJyb3I7CgkJfQoJCSsrZmxvd3NfbjsKCX0KCWlmICghZmxvd3NfbikgewoJCXJ0ZV9mbG93 X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLCBSVEVfRkxPV19FUlJPUl9UWVBFX0hBTkRMRSwKCQkJ CSAgIE5VTEwsICJpbnRlcm5hbCBlcnJvciBpbiBmbG93IGNyZWF0aW9uIik7CgkJZ290byBlcnJv cjsKCX0KCW1seDVfZmxvd19jcmVhdGVfdXBkYXRlX3J4cXMoZGV2LCBmbG93KTsKCXJldHVybiAw OwplcnJvcjoKCXJldCA9IHJ0ZV9lcnJubzsgLyogU2F2ZSBydGVfZXJybm8gYmVmb3JlIGNsZWFu dXAuICovCglhc3NlcnQoZmxvdyk7Cglmb3IgKGkgPSAwOyBpICE9IGhhc2hfcnhxX2luaXRfbjsg KytpKSB7CgkJaWYgKGZsb3ctPmZyeHFbaV0uaWJ2X2Zsb3cpIHsKCQkJc3RydWN0IGlidl9mbG93 ICppYnZfZmxvdyA9IGZsb3ctPmZyeHFbaV0uaWJ2X2Zsb3c7Ci0tCn0KCi8qKgogKiBDb252ZXJ0 IGEgZmxvdy4KCmVycm9yOiBwYXRjaCBmYWlsZWQ6IGRyaXZlcnMvbmV0L21seDUvbWx4NV9mbG93 LmM6MzEKZXJyb3I6IGRyaXZlcnMvbmV0L21seDUvbWx4NV9mbG93LmM6IHBhdGNoIGRvZXMgbm90 IGFwcGx5CipSZXBvOiBkcGRrLW5leHQtZXZlbnRkZXYKQ2hlY2tpbmcgcGF0Y2ggZHJpdmVycy9u ZXQvbWx4NS9tbHg1X2Zsb3cuYy4uLgplcnJvcjogd2hpbGUgc2VhcmNoaW5nIGZvcjoKI2luY2x1 ZGUgIm1seDVfcHJtLmgiCiNpbmNsdWRlICJtbHg1X2dsdWUuaCIKCi8qIEZsb3cgcHJpb3JpdHkg Zm9yIGNvbnRyb2wgcGxhbmUgZmxvd3MuICovCiNkZWZpbmUgTUxYNV9DVFJMX0ZMT1dfUFJJT1JJ VFkgMQotLQoKLyoqIFN0cnVjdHVyZSBnaXZlIHRvIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4g Ki8Kc3RydWN0IG1seDVfZmxvd19kYXRhIHsKCXN0cnVjdCBydGVfZXRoX2RldiAqZGV2OyAvKiog RXRoZXJuZXQgZGV2aWNlLiAqLwoJc3RydWN0IG1seDVfZmxvd19wYXJzZSAqcGFyc2VyOyAvKiog UGFyc2VyIGNvbnRleHQuICovCglzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yOyAvKiogRXJy b3IgY29udGV4dC4gKi8KfTsKCnN0YXRpYyBpbnQKbWx4NV9mbG93X2NyZWF0ZV9ldGgoY29uc3Qg c3RydWN0IHJ0ZV9mbG93X2l0ZW0gKml0ZW0sCgkJICAgICBjb25zdCB2b2lkICpkZWZhdWx0X21h c2ssCi0tCgljb25zdCB1aW50OF90ICpzcGVjID0gaXRlbS0+c3BlYzsKCWNvbnN0IHVpbnQ4X3Qg Kmxhc3QgPSBpdGVtLT5sYXN0OwoJY29uc3QgdWludDhfdCAqbSA9IGl0ZW0tPm1hc2sgPyBpdGVt LT5tYXNrIDogbWFzazsKCglpZiAoIXNwZWMgJiYgKGl0ZW0tPm1hc2sgfHwgbGFzdCkpCgkJZ290 byBlcnJvcjsKCWlmICghc3BlYykKCQlyZXR1cm4gMDsKCS8qCgkgKiBTaW5nbGUtcGFzcyBjaGVj ayB0byBtYWtlIHN1cmUgdGhhdDoKCSAqIC0gaXRlbS0+bWFzayBpcyBzdXBwb3J0ZWQsIG5vIGJp dHMgYXJlIHNldCBvdXRzaWRlIG1hc2suCi0tCgkgKi8KCWZvciAoaSA9IDA7IGkgPCBzaXplOyBp KyspIHsKCQlpZiAoIW1baV0pCgkJCWNvbnRpbnVlOwoJCWlmICgobVtpXSB8IG1hc2tbaV0pICE9 IG1hc2tbaV0pCgkJCWdvdG8gZXJyb3I7CgkJaWYgKGxhc3QgJiYgKChzcGVjW2ldICYgbVtpXSkg IT0gKGxhc3RbaV0gJiBtW2ldKSkpCgkJCWdvdG8gZXJyb3I7Cgl9CglyZXR1cm4gMDsKZXJyb3I6 CglydGVfZXJybm8gPSBFTk9UU1VQOwoJcmV0dXJuIC1ydGVfZXJybm87Cn0KCi8qKgogKiBFeHRy YWN0IGF0dHJpYnV0ZSB0byB0aGUgcGFyc2VyLgogKgogKiBAcGFyYW1baW5dIGF0dHIKICogICBG bG93IHJ1bGUgYXR0cmlidXRlcy4KICogQHBhcmFtW291dF0gZXJyb3IKICogICBQZXJmb3JtIHZl cmJvc2UgZXJyb3IgcmVwb3J0aW5nIGlmIG5vdCBOVUxMLgogKgogKiBAcmV0dXJuCiAqICAgMCBv biBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5v IGlzIHNldC4KICovCnN0YXRpYyBpbnQKbWx4NV9mbG93X2NvbnZlcnRfYXR0cmlidXRlcyhjb25z dCBzdHJ1Y3QgcnRlX2Zsb3dfYXR0ciAqYXR0ciwKCQkJICAgICBzdHJ1Y3QgcnRlX2Zsb3dfZXJy b3IgKmVycm9yKQp7CglpZiAoYXR0ci0+Z3JvdXApIHsKCQlydGVfZmxvd19lcnJvcl9zZXQoZXJy b3IsIEVOT1RTVVAsCgkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FUVFJfR1JPVVAsCgkJCQkg ICBOVUxMLAoJCQkJICAgImdyb3VwcyBhcmUgbm90IHN1cHBvcnRlZCIpOwoJCXJldHVybiAtcnRl X2Vycm5vOwoJfQoJaWYgKGF0dHItPnByaW9yaXR5ICYmIGF0dHItPnByaW9yaXR5ICE9IE1MWDVf Q1RSTF9GTE9XX1BSSU9SSVRZKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQ LAoJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRSX1BSSU9SSVRZLAoJCQkJICAgTlVMTCwK CQkJCSAgICJwcmlvcml0aWVzIGFyZSBub3Qgc3VwcG9ydGVkIik7CgkJcmV0dXJuIC1ydGVfZXJy bm87Cgl9CglpZiAoYXR0ci0+ZWdyZXNzKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBF Tk9UU1VQLAoJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRSX0VHUkVTUywKCQkJCSAgIE5V TEwsCgkJCQkgICAiZWdyZXNzIGlzIG5vdCBzdXBwb3J0ZWQiKTsKCQlyZXR1cm4gLXJ0ZV9lcnJu bzsKCX0KCWlmIChhdHRyLT50cmFuc2ZlcikgewoJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwg RU5PVFNVUCwKCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQVRUUl9UUkFOU0ZFUiwKCQkJCSAg IE5VTEwsCgkJCQkgICAidHJhbnNmZXIgaXMgbm90IHN1cHBvcnRlZCIpOwoJCXJldHVybiAtcnRl X2Vycm5vOwoJfQoJaWYgKCFhdHRyLT5pbmdyZXNzKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVy cm9yLCBFTk9UU1VQLAoJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRSX0lOR1JFU1MsCgkJ CQkgICBOVUxMLAoJCQkJICAgIm9ubHkgaW5ncmVzcyBpcyBzdXBwb3J0ZWQiKTsKCQlyZXR1cm4g LXJ0ZV9lcnJubzsKCX0KLS0KICoKICogQHBhcmFtIGRldgogKiAgIFBvaW50ZXIgdG8gRXRoZXJu ZXQgZGV2aWNlLgogKiBAcGFyYW1baW5dIGFjdGlvbnMKICogICBBc3NvY2lhdGVkIGFjdGlvbnMg KGxpc3QgdGVybWluYXRlZCBieSB0aGUgRU5EIGFjdGlvbikuCiAqIEBwYXJhbVtvdXRdIGVycm9y CiAqICAgUGVyZm9ybSB2ZXJib3NlIGVycm9yIHJlcG9ydGluZyBpZiBub3QgTlVMTC4KICogQHBh cmFtW2luLCBvdXRdIHBhcnNlcgogKiAgIEludGVybmFsIHBhcnNlciBzdHJ1Y3R1cmUuCiAqCiAq IEByZXR1cm4KICogICAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3 aXNlIGFuZCBydGVfZXJybm8gaXMgc2V0LgogKi8Kc3RhdGljIGludAptbHg1X2Zsb3dfY29udmVy dF9hY3Rpb25zKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LAoJCQkgIGNvbnN0IHN0cnVjdCBydGVf Zmxvd19hY3Rpb24gYWN0aW9uc1tdLAoJCQkgIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3Is CgkJCSAgc3RydWN0IG1seDVfZmxvd19wYXJzZSAqcGFyc2VyKQp7CgllbnVtIHsgRkFURSA9IDEs IE1BUksgPSAyLCBDT1VOVCA9IDQsIH07Cgl1aW50MzJfdCBvdmVybGFwID0gMDsKCXN0cnVjdCBw cml2ICpwcml2ID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsKLS0KCQkJaWYgKG92ZXJsYXAgJiBG QVRFKQoJCQkJZ290byBleGl0X2FjdGlvbl9vdmVybGFwOwoJCQlvdmVybGFwIHw9IEZBVEU7CgkJ CWlmIChyc3MtPmZ1bmMgJiYKCQkJICAgIHJzcy0+ZnVuYyAhPSBSVEVfRVRIX0hBU0hfRlVOQ1RJ T05fVE9FUExJVFopIHsKCQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLAoJCQkJ CQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJ ICAgInRoZSBvbmx5IHN1cHBvcnRlZCBSU1MgaGFzaCIKCQkJCQkJICAgIiBmdW5jdGlvbiBpcyBU b2VwbGl0eiIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0KI2lmbmRlZiBIQVZFX0lCVl9E RVZJQ0VfVFVOTkVMX1NVUFBPUlQKCQkJaWYgKHBhcnNlci0+cnNzX2NvbmYubGV2ZWwgPiAxKSB7 CgkJCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwKCQkJCQkJICAgUlRFX0ZMT1df RVJST1JfVFlQRV9BQ1RJT04sCgkJCQkJCSAgIGFjdGlvbnMsCgkJCQkJCSAgICJhIG5vbnplcm8g UlNTIGVuY2Fwc3VsYXRpb24iCgkJCQkJCSAgICIgbGV2ZWwgaXMgbm90IHN1cHBvcnRlZCIpOwoJ CQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0KI2VuZGlmCgkJCWlmIChwYXJzZXItPnJzc19jb25m LmxldmVsID4gMikgewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJ CSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkg ICAiUlNTIGVuY2Fwc3VsYXRpb24gbGV2ZWwiCgkJCQkJCSAgICIgPiAxIGlzIG5vdCBzdXBwb3J0 ZWQiKTsKCQkJCXJldHVybiAtcnRlX2Vycm5vOwoJCQl9CgkJCWlmIChyc3MtPnR5cGVzICYgTUxY NV9SU1NfSEZfTUFTSykgewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJ CQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJ CQkgICAidW5zdXBwb3J0ZWQgUlNTIHR5cGUiCgkJCQkJCSAgICIgcmVxdWVzdGVkIik7CgkJCQly ZXR1cm4gLXJ0ZV9lcnJubzsKLS0KCQkJfSBlbHNlIHsKCQkJCXJzc19rZXlfbGVuID0gcnNzX2hh c2hfZGVmYXVsdF9rZXlfbGVuOwoJCQkJcnNzX2tleSA9IHJzc19oYXNoX2RlZmF1bHRfa2V5OwoJ CQl9CgkJCWlmIChyc3Nfa2V5X2xlbiAhPSBSVEVfRElNKHBhcnNlci0+cnNzX2tleSkpIHsKCQkJ CXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLAoJCQkJCQkgICBSVEVfRkxPV19FUlJP Ul9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgIlJTUyBoYXNoIGtleSBt dXN0IGJlIgoJCQkJCQkgICAiIGV4YWN0bHkgNDAgYnl0ZXMgbG9uZyIpOwoJCQkJcmV0dXJuIC1y dGVfZXJybm87CgkJCX0KCQkJaWYgKCFyc3MtPnF1ZXVlX251bSkgewoJCQkJcnRlX2Zsb3dfZXJy b3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9O LAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAibm8gdmFsaWQgcXVldWVzIik7CgkJCQlyZXR1 cm4gLXJ0ZV9lcnJubzsKCQkJfQoJCQlpZiAocnNzLT5xdWV1ZV9udW0gPiBSVEVfRElNKHBhcnNl ci0+cXVldWVzKSkgewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJ CSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkg ICAidG9vIG1hbnkgcXVldWVzIGZvciBSU1MiCgkJCQkJCSAgICIgY29udGV4dCIpOwoJCQkJcmV0 dXJuIC1ydGVfZXJybm87CgkJCX0KCQkJZm9yIChuID0gMDsgbiA8IHJzcy0+cXVldWVfbnVtOyAr K24pIHsKCQkJCWlmIChyc3MtPnF1ZXVlW25dID49IHByaXYtPnJ4cXNfbikgewoJCQkJCXJ0ZV9m bG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLAoJCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBF X0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgInF1ZXVlIGlkID4gbnVtYmVyIG9m IgoJCQkJCQkgICAiIHF1ZXVlcyIpOwoJCQkJCXJldHVybiAtcnRlX2Vycm5vOwotLQoKCQkJaWYg KG92ZXJsYXAgJiBNQVJLKQoJCQkJZ290byBleGl0X2FjdGlvbl9vdmVybGFwOwoJCQlvdmVybGFw IHw9IE1BUks7CgkJCWlmICghbWFyaykgewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBF SU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rp b25zLAoJCQkJCQkgICAibWFyayBtdXN0IGJlIGRlZmluZWQiKTsKCQkJCXJldHVybiAtcnRlX2Vy cm5vOwoJCQl9IGVsc2UgaWYgKG1hcmstPmlkID49IE1MWDVfRkxPV19NQVJLX01BWCkgewoJCQkJ cnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLAoJCQkJCQkgICBSVEVfRkxPV19FUlJP Ul9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgIm1hcmsgbXVzdCBiZSBi ZXR3ZWVuIDAiCgkJCQkJCSAgICIgYW5kIDE2Nzc3MTk5Iik7CgkJCQlyZXR1cm4gLXJ0ZV9lcnJu bzsKLS0KCWlmICghKG92ZXJsYXAgJiBGQVRFKSkKCQlwYXJzZXItPmRyb3AgPSAxOwoJaWYgKHBh cnNlci0+ZHJvcCAmJiBwYXJzZXItPm1hcmspCgkJcGFyc2VyLT5tYXJrID0gMDsKCWlmICghcGFy c2VyLT5yc3NfY29uZi5xdWV1ZV9udW0gJiYgIXBhcnNlci0+ZHJvcCkgewoJCXJ0ZV9mbG93X2Vy cm9yX3NldChlcnJvciwgRU5PVFNVUCwgUlRFX0ZMT1dfRVJST1JfVFlQRV9IQU5ETEUsCgkJCQkg ICBOVUxMLCAibm8gdmFsaWQgYWN0aW9uIik7CgkJcmV0dXJuIC1ydGVfZXJybm87Cgl9CglyZXR1 cm4gMDsKZXhpdF9hY3Rpb25fbm90X3N1cHBvcnRlZDoKCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJv ciwgRU5PVFNVUCwgUlRFX0ZMT1dfRVJST1JfVFlQRV9BQ1RJT04sCgkJCSAgIGFjdGlvbnMsICJh Y3Rpb24gbm90IHN1cHBvcnRlZCIpOwoJcmV0dXJuIC1ydGVfZXJybm87CmV4aXRfYWN0aW9uX292 ZXJsYXA6CglydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsIFJURV9GTE9XX0VSUk9S X1RZUEVfQUNUSU9OLAoJCQkgICBhY3Rpb25zLCAib3ZlcmxhcHBpbmcgYWN0aW9ucyBhcmUgbm90 IHN1cHBvcnRlZCIpOwoJcmV0dXJuIC1ydGVfZXJybm87Cn0KCi8qKgogKiBWYWxpZGF0ZSBpdGVt cy4KICoKICogQHBhcmFtW2luXSBpdGVtcwogKiAgIFBhdHRlcm4gc3BlY2lmaWNhdGlvbiAobGlz dCB0ZXJtaW5hdGVkIGJ5IHRoZSBFTkQgcGF0dGVybiBpdGVtKS4KICogQHBhcmFtW291dF0gZXJy b3IKICogICBQZXJmb3JtIHZlcmJvc2UgZXJyb3IgcmVwb3J0aW5nIGlmIG5vdCBOVUxMLgogKiBA cGFyYW1baW4sIG91dF0gcGFyc2VyCiAqICAgSW50ZXJuYWwgcGFyc2VyIHN0cnVjdHVyZS4KICoK ICogQHJldHVybgogKiAgIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvdGhl cndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuCiAqLwpzdGF0aWMgaW50Cm1seDVfZmxvd19jb252 ZXJ0X2l0ZW1zX3ZhbGlkYXRlKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LAoJCQkJIGNvbnN0IHN0 cnVjdCBydGVfZmxvd19pdGVtIGl0ZW1zW10sCgkJCQkgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICpl cnJvciwKCQkJCSBzdHJ1Y3QgbWx4NV9mbG93X3BhcnNlICpwYXJzZXIpCnsKCXN0cnVjdCBwcml2 ICpwcml2ID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsKCWNvbnN0IHN0cnVjdCBtbHg1X2Zsb3df aXRlbXMgKmN1cl9pdGVtID0gbWx4NV9mbG93X2l0ZW1zOwoJdW5zaWduZWQgaW50IGk7Ci0tCgkJ CQkJICAgICAgY3VyX2l0ZW0tPm1hc2tfc3opOwoJCWlmIChyZXQpCgkJCWdvdG8gZXhpdF9pdGVt X25vdF9zdXBwb3J0ZWQ7CgkJaWYgKElTX1RVTk5FTChpdGVtcy0+dHlwZSkpIHsKCQkJaWYgKHBh cnNlci0+dHVubmVsKSB7CgkJCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsCgkJ CQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwKCQkJCQkJICAgaXRlbXMsCgkJCQkJCSAg ICJDYW5ub3QgcmVjb2duaXplIG11bHRpcGxlIgoJCQkJCQkgICAiIHR1bm5lbCBlbmNhcHN1bGF0 aW9ucy4iKTsKCQkJCXJldHVybiAtcnRlX2Vycm5vOwoJCQl9CgkJCWlmICghcHJpdi0+Y29uZmln LnR1bm5lbF9lbiAmJgoJCQkgICAgcGFyc2VyLT5yc3NfY29uZi5sZXZlbCA+IDEpIHsKCQkJCXJ0 ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwKCQkJCQlSVEVfRkxPV19FUlJPUl9UWVBF X0lURU0sCgkJCQkJaXRlbXMsCgkJCQkJIlJTUyBvbiB0dW5uZWwgaXMgbm90IHN1cHBvcnRlZCIp OwoJCQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0KLS0KCQlmb3IgKGkgPSAwOyBpICE9IGhhc2hf cnhxX2luaXRfbjsgKytpKQoJCQlwYXJzZXItPnF1ZXVlW2ldLm9mZnNldCArPSBzaXplOwoJfQoJ cmV0dXJuIDA7CmV4aXRfaXRlbV9ub3Rfc3VwcG9ydGVkOgoJcmV0dXJuIHJ0ZV9mbG93X2Vycm9y X3NldChlcnJvciwgLXJldCwgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLAoJCQkJICBpdGVtcywg Iml0ZW0gbm90IHN1cHBvcnRlZCIpOwp9CgovKioKICogQWxsb2NhdGUgbWVtb3J5IHNwYWNlIHRv IHN0b3JlIHZlcmJzIGZsb3cgYXR0cmlidXRlcy4KICoKICogQHBhcmFtW2luXSBzaXplCiAqICAg QW1vdW50IG9mIGJ5dGUgdG8gYWxsb2NhdGUuCiAqIEBwYXJhbVtvdXRdIGVycm9yCiAqICAgUGVy Zm9ybSB2ZXJib3NlIGVycm9yIHJlcG9ydGluZyBpZiBub3QgTlVMTC4KICoKICogQHJldHVybgog KiAgIEEgdmVyYnMgZmxvdyBhdHRyaWJ1dGUgb24gc3VjY2VzcywgTlVMTCBvdGhlcndpc2UgYW5k IHJ0ZV9lcnJubyBpcyBzZXQuCiAqLwpzdGF0aWMgc3RydWN0IGlidl9mbG93X2F0dHIgKgptbHg1 X2Zsb3dfY29udmVydF9hbGxvY2F0ZSh1bnNpZ25lZCBpbnQgc2l6ZSwgc3RydWN0IHJ0ZV9mbG93 X2Vycm9yICplcnJvcikKewoJc3RydWN0IGlidl9mbG93X2F0dHIgKmlidl9hdHRyOwoKCWlidl9h dHRyID0gcnRlX2NhbGxvYyhfX2Z1bmNfXywgMSwgc2l6ZSwgMCk7CglpZiAoIWlidl9hdHRyKSB7 CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9NRU0sCgkJCQkgICBSVEVfRkxPV19FUlJP Ul9UWVBFX1VOU1BFQ0lGSUVELAoJCQkJICAgTlVMTCwKCQkJCSAgICJjYW5ub3QgYWxsb2NhdGUg dmVyYnMgc3BlYyBhdHRyaWJ1dGVzIik7CgkJcmV0dXJuIE5VTEw7Cgl9Ci0tCiAqICAgRmxvdyBy dWxlIGF0dHJpYnV0ZXMuCiAqIEBwYXJhbVtpbl0gcGF0dGVybgogKiAgIFBhdHRlcm4gc3BlY2lm aWNhdGlvbiAobGlzdCB0ZXJtaW5hdGVkIGJ5IHRoZSBFTkQgcGF0dGVybiBpdGVtKS4KICogQHBh cmFtW2luXSBhY3Rpb25zCiAqICAgQXNzb2NpYXRlZCBhY3Rpb25zIChsaXN0IHRlcm1pbmF0ZWQg YnkgdGhlIEVORCBhY3Rpb24pLgogKiBAcGFyYW1bb3V0XSBlcnJvcgogKiAgIFBlcmZvcm0gdmVy Ym9zZSBlcnJvciByZXBvcnRpbmcgaWYgbm90IE5VTEwuCiAqIEBwYXJhbVtpbiwgb3V0XSBwYXJz ZXIKICogICBJbnRlcm5hbCBwYXJzZXIgc3RydWN0dXJlLgogKgogKiBAcmV0dXJuCiAqICAgMCBv biBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5v IGlzIHNldC4KLS0Kc3RhdGljIGludAptbHg1X2Zsb3dfY29udmVydChzdHJ1Y3QgcnRlX2V0aF9k ZXYgKmRldiwKCQkgIGNvbnN0IHN0cnVjdCBydGVfZmxvd19hdHRyICphdHRyLAoJCSAgY29uc3Qg c3RydWN0IHJ0ZV9mbG93X2l0ZW0gaXRlbXNbXSwKCQkgIGNvbnN0IHN0cnVjdCBydGVfZmxvd19h Y3Rpb24gYWN0aW9uc1tdLAoJCSAgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvciwKCQkgIHN0 cnVjdCBtbHg1X2Zsb3dfcGFyc2UgKnBhcnNlcikKewoJY29uc3Qgc3RydWN0IG1seDVfZmxvd19p dGVtcyAqY3VyX2l0ZW0gPSBtbHg1X2Zsb3dfaXRlbXM7Cgl1bnNpZ25lZCBpbnQgaTsKCWludCBy ZXQ7Ci0tCgkqcGFyc2VyID0gKHN0cnVjdCBtbHg1X2Zsb3dfcGFyc2UpewoJCS5jcmVhdGUgPSBw YXJzZXItPmNyZWF0ZSwKCQkubGF5ZXIgPSBIQVNIX1JYUV9FVEgsCgkJLm1hcmtfaWQgPSBNTFg1 X0ZMT1dfTUFSS19ERUZBVUxULAoJfTsKCXJldCA9IG1seDVfZmxvd19jb252ZXJ0X2F0dHJpYnV0 ZXMoYXR0ciwgZXJyb3IpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoJcmV0ID0gbWx4NV9mbG93 X2NvbnZlcnRfYWN0aW9ucyhkZXYsIGFjdGlvbnMsIGVycm9yLCBwYXJzZXIpOwoJaWYgKHJldCkK CQlyZXR1cm4gcmV0OwoJcmV0ID0gbWx4NV9mbG93X2NvbnZlcnRfaXRlbXNfdmFsaWRhdGUoZGV2 LCBpdGVtcywgZXJyb3IsIHBhcnNlcik7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgltbHg1X2Zs b3dfY29udmVydF9maW5hbGlzZShwYXJzZXIpOwoJLyoKCSAqIFNlY29uZCBzdGVwLgotLQoJICov CglpZiAocGFyc2VyLT5kcm9wKSB7CgkJdW5zaWduZWQgaW50IG9mZnNldCA9IHBhcnNlci0+cXVl dWVbSEFTSF9SWFFfRVRIXS5vZmZzZXQ7CgoJCXBhcnNlci0+cXVldWVbSEFTSF9SWFFfRVRIXS5p YnZfYXR0ciA9CgkJCW1seDVfZmxvd19jb252ZXJ0X2FsbG9jYXRlKG9mZnNldCwgZXJyb3IpOwoJ CWlmICghcGFyc2VyLT5xdWV1ZVtIQVNIX1JYUV9FVEhdLmlidl9hdHRyKQoJCQlnb3RvIGV4aXRf ZW5vbWVtOwoJCXBhcnNlci0+cXVldWVbSEFTSF9SWFFfRVRIXS5vZmZzZXQgPQoJCQlzaXplb2Yo c3RydWN0IGlidl9mbG93X2F0dHIpOwoJfSBlbHNlIHsKCQlmb3IgKGkgPSAwOyBpICE9IGhhc2hf cnhxX2luaXRfbjsgKytpKSB7CgkJCXVuc2lnbmVkIGludCBvZmZzZXQ7CgoJCQlvZmZzZXQgPSBw YXJzZXItPnF1ZXVlW2ldLm9mZnNldDsKCQkJcGFyc2VyLT5xdWV1ZVtpXS5pYnZfYXR0ciA9CgkJ CQltbHg1X2Zsb3dfY29udmVydF9hbGxvY2F0ZShvZmZzZXQsIGVycm9yKTsKCQkJaWYgKCFwYXJz ZXItPnF1ZXVlW2ldLmlidl9hdHRyKQoJCQkJZ290byBleGl0X2Vub21lbTsKCQkJcGFyc2VyLT5x dWV1ZVtpXS5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlidl9mbG93X2F0dHIpOwoJCX0KCX0KLS0K CXBhcnNlci0+bGF5ZXIgPSBIQVNIX1JYUV9FVEg7Cglmb3IgKDsgaXRlbXMtPnR5cGUgIT0gUlRF X0ZMT1dfSVRFTV9UWVBFX0VORDsgKytpdGVtcykgewoJCXN0cnVjdCBtbHg1X2Zsb3dfZGF0YSBk YXRhID0gewoJCQkuZGV2ID0gZGV2LAoJCQkucGFyc2VyID0gcGFyc2VyLAoJCQkuZXJyb3IgPSBl cnJvciwKCQl9OwoKCQlpZiAoaXRlbXMtPnR5cGUgPT0gUlRFX0ZMT1dfSVRFTV9UWVBFX1ZPSUQp CgkJCWNvbnRpbnVlOwoJCWN1cl9pdGVtID0gJm1seDVfZmxvd19pdGVtc1tpdGVtcy0+dHlwZV07 Ci0tCglpZiAocGFyc2VyLT5tYXJrKQoJCW1seDVfZmxvd19jcmVhdGVfZmxhZ19tYXJrKHBhcnNl ciwgcGFyc2VyLT5tYXJrX2lkKTsKCWlmIChwYXJzZXItPmNvdW50ICYmIHBhcnNlci0+Y3JlYXRl KSB7CgkJbWx4NV9mbG93X2NyZWF0ZV9jb3VudChkZXYsIHBhcnNlcik7CgkJaWYgKCFwYXJzZXIt PmNzKQoJCQlnb3RvIGV4aXRfY291bnRfZXJyb3I7Cgl9CmV4aXRfZnJlZToKCS8qIE9ubHkgdmVy aWZpY2F0aW9uIGlzIGV4cGVjdGVkLCBhbGwgcmVzb3VyY2VzIHNob3VsZCBiZSByZWxlYXNlZC4g Ki8KCWlmICghcGFyc2VyLT5jcmVhdGUpIHsKCQlmb3IgKGkgPSAwOyBpICE9IGhhc2hfcnhxX2lu aXRfbjsgKytpKSB7Ci0tCgkJaWYgKHBhcnNlci0+cXVldWVbaV0uaWJ2X2F0dHIpIHsKCQkJcnRl X2ZyZWUocGFyc2VyLT5xdWV1ZVtpXS5pYnZfYXR0cik7CgkJCXBhcnNlci0+cXVldWVbaV0uaWJ2 X2F0dHIgPSBOVUxMOwoJCX0KCX0KCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PTUVNLCBS VEVfRkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVELAoJCQkgICBOVUxMLCAiY2Fubm90IGFsbG9j YXRlIHZlcmJzIHNwZWMgYXR0cmlidXRlcyIpOwoJcmV0dXJuIC1ydGVfZXJybm87CmV4aXRfY291 bnRfZXJyb3I6CglydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwgUlRFX0ZMT1dfRVJS T1JfVFlQRV9VTlNQRUNJRklFRCwKCQkJICAgTlVMTCwgImNhbm5vdCBjcmVhdGUgY291bnRlciIp OwoJcmV0dXJuIC1ydGVfZXJybm87Cn0KCi8qKgotLQoJCQkvKgoJCQkgKiBGcm9tIHZlcmJzIHBl cnNwZWN0aXZlIGFuIGVtcHR5IFZMQU4gaXMgZXF1aXZhbGVudAoJCQkgKiB0byBhIHBhY2tldCB3 aXRob3V0IFZMQU4gbGF5ZXIuCgkJCSAqLwoJCQlpZiAoIWV0aC0+bWFzay52bGFuX3RhZykKCQkJ CWdvdG8gZXJyb3I7CgkJCS8qIE91dGVyIFRQSUQgY2Fubm90IGJlIG1hdGNoZWQuICovCgkJCWlm IChldGgtPm1hc2suZXRoZXJfdHlwZSkgewoJCQkJbXNnID0gIlZMQU4gVFBJRCBtYXRjaGluZyBp cyBub3Qgc3VwcG9ydGVkIjsKCQkJCWdvdG8gZXJyb3I7CgkJCX0KCQkJZXRoLT52YWwuZXRoZXJf dHlwZSA9IHNwZWMtPmlubmVyX3R5cGU7CgkJCWV0aC0+bWFzay5ldGhlcl90eXBlID0gbWFzay0+ aW5uZXJfdHlwZTsKCQkJZXRoLT52YWwuZXRoZXJfdHlwZSAmPSBldGgtPm1hc2suZXRoZXJfdHlw ZTsKCQl9CgkJcmV0dXJuIDA7Cgl9CmVycm9yOgoJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChk YXRhLT5lcnJvciwgRUlOVkFMLCBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJCQkgIGl0ZW0s IG1zZyk7Cn0KCi8qKgogKiBDb252ZXJ0IElQdjQgaXRlbSB0byBWZXJicyBzcGVjaWZpY2F0aW9u LgotLQoJfTsKCglpZiAocGFyc2VyLT5sYXllciA9PSBIQVNIX1JYUV9UVU5ORUwgJiYKCSAgICBw YXJzZXItPnR1bm5lbCA9PSBwdHlwZV9leHRbUFRZUEVfSURYKFJURV9QVFlQRV9UVU5ORUxfVlhM QU4pXSAmJgoJICAgICFwcml2LT5jb25maWcubDNfdnhsYW5fZW4pCgkJcmV0dXJuIHJ0ZV9mbG93 X2Vycm9yX3NldChkYXRhLT5lcnJvciwgRUlOVkFMLAoJCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQ RV9JVEVNLAoJCQkJCSAgaXRlbSwKCQkJCQkgICJMMyBWWExBTiBub3QgZW5hYmxlZCBieSBkZXZp Y2UiCgkJCQkJICAiIHBhcmFtZXRlciBhbmQvb3Igbm90IGNvbmZpZ3VyZWQiCgkJCQkJICAiIGlu IGZpcm13YXJlIik7Ci0tCgl9OwoKCWlmIChwYXJzZXItPmxheWVyID09IEhBU0hfUlhRX1RVTk5F TCAmJgoJICAgIHBhcnNlci0+dHVubmVsID09IHB0eXBlX2V4dFtQVFlQRV9JRFgoUlRFX1BUWVBF X1RVTk5FTF9WWExBTildICYmCgkgICAgIXByaXYtPmNvbmZpZy5sM192eGxhbl9lbikKCQlyZXR1 cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGRhdGEtPmVycm9yLCBFSU5WQUwsCgkJCQkJICBSVEVfRkxP V19FUlJPUl9UWVBFX0lURU0sCgkJCQkJICBpdGVtLAoJCQkJCSAgIkwzIFZYTEFOIG5vdCBlbmFi bGVkIGJ5IGRldmljZSIKCQkJCQkgICIgcGFyYW1ldGVyIGFuZC9vciBub3QgY29uZmlndXJlZCIK CQkJCQkgICIgaW4gZmlybXdhcmUiKTsKLS0KCSAqIGJlZm9yZSB3aWxsIGFsc28gbWF0Y2ggdGhp cyBydWxlLgoJICogVG8gYXZvaWQgc3VjaCBzaXR1YXRpb24sIFZOSSAwIGlzIGN1cnJlbnRseSBy ZWZ1c2VkLgoJICovCgkvKiBPbmx5IGFsbG93IHR1bm5lbCB3L28gdHVubmVsIGlkIHBhdHRlcm4g YWZ0ZXIgcHJvcGVyIG91dGVyIHNwZWMuICovCglpZiAocGFyc2VyLT5vdXRfbGF5ZXIgPT0gSEFT SF9SWFFfRVRIICYmICF2eGxhbi52YWwudHVubmVsX2lkKQoJCXJldHVybiBydGVfZmxvd19lcnJv cl9zZXQoZGF0YS0+ZXJyb3IsIEVJTlZBTCwKCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRF TSwKCQkJCQkgIGl0ZW0sCgkJCQkJICAiVnhMQU4gdm5pIGNhbm5vdCBiZSAwIik7CgltbHg1X2Zs b3dfY3JlYXRlX2NvcHkocGFyc2VyLCAmdnhsYW4sIHNpemUpOwoJcmV0dXJuIDA7Ci0tCgkJdWlu dDMyX3Qgdmxhbl9pZDsKCQl1aW50OF90IHZuaVs0XTsKCX0gaWQ7CgoJaWYgKCFwcml2LT5jb25m aWcubDNfdnhsYW5fZW4pCgkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChkYXRhLT5lcnJvciwg RUlOVkFMLAoJCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLAoJCQkJCSAgaXRlbSwKCQkJ CQkgICJMMyBWWExBTiBub3QgZW5hYmxlZCBieSBkZXZpY2UiCgkJCQkJICAiIHBhcmFtZXRlciBh bmQvb3Igbm90IGNvbmZpZ3VyZWQiCgkJCQkJICAiIGluIGZpcm13YXJlIik7Ci0tCgkJbWVtY3B5 KCZpZC52bmlbMV0sIHNwZWMtPnZuaSwgMyk7CgkJdnhsYW4udmFsLnR1bm5lbF9pZCA9IGlkLnZs YW5faWQ7CgkJbWVtY3B5KCZpZC52bmlbMV0sIG1hc2stPnZuaSwgMyk7CgkJdnhsYW4ubWFzay50 dW5uZWxfaWQgPSBpZC52bGFuX2lkOwoJCWlmIChzcGVjLT5wcm90b2NvbCkKCQkJcmV0dXJuIHJ0 ZV9mbG93X2Vycm9yX3NldChkYXRhLT5lcnJvciwgRUlOVkFMLAoJCQkJCQkgIFJURV9GTE9XX0VS Uk9SX1RZUEVfSVRFTSwKCQkJCQkJICBpdGVtLAoJCQkJCQkgICJWeExBTi1HUEUgcHJvdG9jb2wg bm90IgoJCQkJCQkgICIgc3VwcG9ydGVkIik7CgkJLyogUmVtb3ZlIHVud2FudGVkIGJpdHMgZnJv bSB2YWx1ZXMuICovCi0tCgkgKiBiZWZvcmUgd2lsbCBhbHNvIG1hdGNoIHRoaXMgcnVsZS4KCSAq IFRvIGF2b2lkIHN1Y2ggc2l0dWF0aW9uLCBWTkkgMCBpcyBjdXJyZW50bHkgcmVmdXNlZC4KCSAq LwoJLyogT25seSBhbGxvdyB0dW5uZWwgdy9vIHR1bm5lbCBpZCBwYXR0ZXJuIGFmdGVyIHByb3Bl ciBvdXRlciBzcGVjLiAqLwoJaWYgKHBhcnNlci0+b3V0X2xheWVyID09IEhBU0hfUlhRX0VUSCAm JiAhdnhsYW4udmFsLnR1bm5lbF9pZCkKCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGRhdGEt PmVycm9yLCBFSU5WQUwsCgkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJCQkJICBp dGVtLAoJCQkJCSAgIlZ4TEFOLUdQRSB2bmkgY2Fubm90IGJlIDAiKTsKCW1seDVfZmxvd19jcmVh dGVfY29weShwYXJzZXIsICZ2eGxhbiwgc2l6ZSk7CglyZXR1cm4gMDsKLS0KCQkJaXB2Ni0+dmFs Lm5leHRfaGRyID0gTUxYNV9HUkU7CgkJCWlwdjYtPm1hc2submV4dF9oZHIgPSAweGZmOwoJCX0K CX0KCWlmIChpICE9IGhhc2hfcnhxX2luaXRfbikKCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0 KGRhdGEtPmVycm9yLCBFSU5WQUwsCgkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJ CQkJICBpdGVtLAoJCQkJCSAgIklQIHByb3RvY29sIG9mIEdSRSBtdXN0IGJlIDQ3Iik7CgltbHg1 X2Zsb3dfY3JlYXRlX2NvcHkocGFyc2VyLCAmdHVubmVsLCBzaXplKTsKCXJldHVybiAwOwotLQog KiAgIFBvaW50ZXIgdG8gRXRoZXJuZXQgZGV2aWNlLgogKiBAcGFyYW0gcGFyc2VyCiAqICAgSW50 ZXJuYWwgcGFyc2VyIHN0cnVjdHVyZS4KICogQHBhcmFtIGZsb3cKICogICBQb2ludGVyIHRvIHRo ZSBydGVfZmxvdy4KICogQHBhcmFtW291dF0gZXJyb3IKICogICBQZXJmb3JtIHZlcmJvc2UgZXJy b3IgcmVwb3J0aW5nIGlmIG5vdCBOVUxMLgogKgogKiBAcmV0dXJuCiAqICAgMCBvbiBzdWNjZXNz LCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNldC4K ICovCnN0YXRpYyBpbnQKbWx4NV9mbG93X2NyZWF0ZV9hY3Rpb25fcXVldWVfZHJvcChzdHJ1Y3Qg cnRlX2V0aF9kZXYgKmRldiwKCQkJCSAgIHN0cnVjdCBtbHg1X2Zsb3dfcGFyc2UgKnBhcnNlciwK CQkJCSAgIHN0cnVjdCBydGVfZmxvdyAqZmxvdywKCQkJCSAgIHN0cnVjdCBydGVfZmxvd19lcnJv ciAqZXJyb3IpCnsKCXN0cnVjdCBwcml2ICpwcml2ID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsK CXN0cnVjdCBpYnZfZmxvd19zcGVjX2FjdGlvbl9kcm9wICpkcm9wOwoJdW5zaWduZWQgaW50IHNp emUgPSBzaXplb2Yoc3RydWN0IGlidl9mbG93X3NwZWNfYWN0aW9uX2Ryb3ApOwoKLS0KCXBhcnNl ci0+cXVldWVbSEFTSF9SWFFfRVRIXS5pYnZfYXR0ciA9IE5VTEw7CglmbG93LT5mcnhxW0hBU0hf UlhRX0VUSF0uaWJ2X2Zsb3cgPQoJCW1seDVfZ2x1ZS0+Y3JlYXRlX2Zsb3cocHJpdi0+Zmxvd19k cm9wX3F1ZXVlLT5xcCwKCQkJCSAgICAgICBmbG93LT5mcnhxW0hBU0hfUlhRX0VUSF0uaWJ2X2F0 dHIpOwoJaWYgKCFmbG93LT5mcnhxW0hBU0hfUlhRX0VUSF0uaWJ2X2Zsb3cpIHsKCQlydGVfZmxv d19lcnJvcl9zZXQoZXJyb3IsIEVOT01FTSwgUlRFX0ZMT1dfRVJST1JfVFlQRV9IQU5ETEUsCgkJ CQkgICBOVUxMLCAiZmxvdyBydWxlIGNyZWF0aW9uIGZhaWx1cmUiKTsKCQlnb3RvIGVycm9yOwoJ fQoJcmV0dXJuIDA7CmVycm9yOgoJYXNzZXJ0KGZsb3cpOwoJaWYgKGZsb3ctPmZyeHFbSEFTSF9S WFFfRVRIXS5pYnZfZmxvdykgewoJCWNsYWltX3plcm8obWx4NV9nbHVlLT5kZXN0cm95X2Zsb3cK CQkJICAgKGZsb3ctPmZyeHFbSEFTSF9SWFFfRVRIXS5pYnZfZmxvdykpOwoJCWZsb3ctPmZyeHFb SEFTSF9SWFFfRVRIXS5pYnZfZmxvdyA9IE5VTEw7Ci0tCiAqICAgUG9pbnRlciB0byBFdGhlcm5l dCBkZXZpY2UuCiAqIEBwYXJhbSBwYXJzZXIKICogICBJbnRlcm5hbCBwYXJzZXIgc3RydWN0dXJl LgogKiBAcGFyYW0gZmxvdwogKiAgIFBvaW50ZXIgdG8gdGhlIHJ0ZV9mbG93LgogKiBAcGFyYW1b b3V0XSBlcnJvcgogKiAgIFBlcmZvcm0gdmVyYm9zZSBlcnJvciByZXBvcnRpbmcgaWYgbm90IE5V TEwuCiAqCiAqIEByZXR1cm4KICogICAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gdmFs dWUgb3RoZXJ3aXNlIGFuZCBydGVfZXJybm8gaXMgc2V0LgogKi8Kc3RhdGljIGludAptbHg1X2Zs b3dfY3JlYXRlX2FjdGlvbl9xdWV1ZV9yc3Moc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYsCgkJCQkg IHN0cnVjdCBtbHg1X2Zsb3dfcGFyc2UgKnBhcnNlciwKCQkJCSAgc3RydWN0IHJ0ZV9mbG93ICpm bG93LAoJCQkJICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQp7Cgl1bnNpZ25lZCBpbnQg aTsKCglmb3IgKGkgPSAwOyBpICE9IGhhc2hfcnhxX2luaXRfbjsgKytpKSB7CgkJaWYgKCFwYXJz ZXItPnF1ZXVlW2ldLmlidl9hdHRyKQotLQoJCQkJICAgICAgcGFyc2VyLT5yc3NfY29uZi5xdWV1 ZSwKCQkJCSAgICAgIHBhcnNlci0+cnNzX2NvbmYucXVldWVfbnVtLAoJCQkJICAgICAgcGFyc2Vy LT50dW5uZWwsCgkJCQkgICAgICBwYXJzZXItPnJzc19jb25mLmxldmVsKTsKCQlpZiAoIWZsb3ct PmZyeHFbaV0uaHJ4cSkgewoJCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9N RU0sCgkJCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9IQU5ETEUsCgkJCQkJCSAgTlVMTCwKCQkJ CQkJICAiY2Fubm90IGNyZWF0ZSBoYXNoIHJ4cSIpOwoJCX0KCX0KLS0KICogICBQb2ludGVyIHRv IEV0aGVybmV0IGRldmljZS4KICogQHBhcmFtIHBhcnNlcgogKiAgIEludGVybmFsIHBhcnNlciBz dHJ1Y3R1cmUuCiAqIEBwYXJhbSBmbG93CiAqICAgUG9pbnRlciB0byB0aGUgcnRlX2Zsb3cuCiAq IEBwYXJhbVtvdXRdIGVycm9yCiAqICAgUGVyZm9ybSB2ZXJib3NlIGVycm9yIHJlcG9ydGluZyBp ZiBub3QgTlVMTC4KICoKICogQHJldHVybgogKiAgIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBl cnJubyB2YWx1ZSBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuCiAqLwpzdGF0aWMgaW50 Cm1seDVfZmxvd19jcmVhdGVfYWN0aW9uX3F1ZXVlKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LAoJ CQkgICAgICBzdHJ1Y3QgbWx4NV9mbG93X3BhcnNlICpwYXJzZXIsCgkJCSAgICAgIHN0cnVjdCBy dGVfZmxvdyAqZmxvdywKCQkJICAgICAgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvcikKewoJ c3RydWN0IHByaXYgKnByaXYgX19ydGVfdW51c2VkID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsK CWludCByZXQ7Cgl1bnNpZ25lZCBpbnQgaTsKCXVuc2lnbmVkIGludCBmbG93c19uID0gMDsKCglh c3NlcnQocHJpdi0+cGQpOwoJYXNzZXJ0KHByaXYtPmN0eCk7Cglhc3NlcnQoIXBhcnNlci0+ZHJv cCk7CglyZXQgPSBtbHg1X2Zsb3dfY3JlYXRlX2FjdGlvbl9xdWV1ZV9yc3MoZGV2LCBwYXJzZXIs IGZsb3csIGVycm9yKTsKCWlmIChyZXQpCgkJZ290byBlcnJvcjsKCWlmIChwYXJzZXItPmNvdW50 KQoJCWZsb3ctPmNzID0gcGFyc2VyLT5jczsKCWlmICghZGV2LT5kYXRhLT5kZXZfc3RhcnRlZCkK CQlyZXR1cm4gMDsKCWZvciAoaSA9IDA7IGkgIT0gaGFzaF9yeHFfaW5pdF9uOyArK2kpIHsKLS0K CQlmbG93LT5mcnhxW2ldLmlidl9mbG93ID0KCQkJbWx4NV9nbHVlLT5jcmVhdGVfZmxvdyhmbG93 LT5mcnhxW2ldLmhyeHEtPnFwLAoJCQkJCSAgICAgICBmbG93LT5mcnhxW2ldLmlidl9hdHRyKTsK CQltbHg1X2Zsb3dfZHVtcChkZXYsIGZsb3csIGkpOwoJCWlmICghZmxvdy0+ZnJ4cVtpXS5pYnZf ZmxvdykgewoJCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT01FTSwKCQkJCQkgICBSVEVf RkxPV19FUlJPUl9UWVBFX0hBTkRMRSwKCQkJCQkgICBOVUxMLCAiZmxvdyBydWxlIGNyZWF0aW9u IGZhaWx1cmUiKTsKCQkJZ290byBlcnJvcjsKCQl9CgkJKytmbG93c19uOwoJfQoJaWYgKCFmbG93 c19uKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsIFJURV9GTE9XX0VSUk9S X1RZUEVfSEFORExFLAoJCQkJICAgTlVMTCwgImludGVybmFsIGVycm9yIGluIGZsb3cgY3JlYXRp b24iKTsKCQlnb3RvIGVycm9yOwoJfQoJbWx4NV9mbG93X2NyZWF0ZV91cGRhdGVfcnhxcyhkZXYs IGZsb3cpOwoJcmV0dXJuIDA7CmVycm9yOgoJcmV0ID0gcnRlX2Vycm5vOyAvKiBTYXZlIHJ0ZV9l cnJubyBiZWZvcmUgY2xlYW51cC4gKi8KCWFzc2VydChmbG93KTsKCWZvciAoaSA9IDA7IGkgIT0g aGFzaF9yeHFfaW5pdF9uOyArK2kpIHsKCQlpZiAoZmxvdy0+ZnJ4cVtpXS5pYnZfZmxvdykgewoJ CQlzdHJ1Y3QgaWJ2X2Zsb3cgKmlidl9mbG93ID0gZmxvdy0+ZnJ4cVtpXS5pYnZfZmxvdzsKLS0K fQoKLyoqCiAqIENvbnZlcnQgYSBmbG93LgoKZXJyb3I6IHBhdGNoIGZhaWxlZDogZHJpdmVycy9u ZXQvbWx4NS9tbHg1X2Zsb3cuYzozMQplcnJvcjogZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zsb3cu YzogcGF0Y2ggZG9lcyBub3QgYXBwbHkKKlJlcG86IGRwZGstbmV4dC1uZXQKQ2hlY2tpbmcgcGF0 Y2ggZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zsb3cuYy4uLgplcnJvcjogd2hpbGUgc2VhcmNoaW5n IGZvcjoKI2luY2x1ZGUgIm1seDVfcHJtLmgiCiNpbmNsdWRlICJtbHg1X2dsdWUuaCIKCi8qIEZs b3cgcHJpb3JpdHkgZm9yIGNvbnRyb2wgcGxhbmUgZmxvd3MuICovCiNkZWZpbmUgTUxYNV9DVFJM X0ZMT1dfUFJJT1JJVFkgMQotLQoKLyoqIFN0cnVjdHVyZSBnaXZlIHRvIHRoZSBjb252ZXJzaW9u IGZ1bmN0aW9ucy4gKi8Kc3RydWN0IG1seDVfZmxvd19kYXRhIHsKCXN0cnVjdCBydGVfZXRoX2Rl diAqZGV2OyAvKiogRXRoZXJuZXQgZGV2aWNlLiAqLwoJc3RydWN0IG1seDVfZmxvd19wYXJzZSAq cGFyc2VyOyAvKiogUGFyc2VyIGNvbnRleHQuICovCglzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVy cm9yOyAvKiogRXJyb3IgY29udGV4dC4gKi8KfTsKCnN0YXRpYyBpbnQKbWx4NV9mbG93X2NyZWF0 ZV9ldGgoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW0gKml0ZW0sCgkJICAgICBjb25zdCB2b2lk ICpkZWZhdWx0X21hc2ssCi0tCgljb25zdCB1aW50OF90ICpzcGVjID0gaXRlbS0+c3BlYzsKCWNv bnN0IHVpbnQ4X3QgKmxhc3QgPSBpdGVtLT5sYXN0OwoJY29uc3QgdWludDhfdCAqbSA9IGl0ZW0t Pm1hc2sgPyBpdGVtLT5tYXNrIDogbWFzazsKCglpZiAoIXNwZWMgJiYgKGl0ZW0tPm1hc2sgfHwg bGFzdCkpCgkJZ290byBlcnJvcjsKCWlmICghc3BlYykKCQlyZXR1cm4gMDsKCS8qCgkgKiBTaW5n bGUtcGFzcyBjaGVjayB0byBtYWtlIHN1cmUgdGhhdDoKCSAqIC0gaXRlbS0+bWFzayBpcyBzdXBw b3J0ZWQsIG5vIGJpdHMgYXJlIHNldCBvdXRzaWRlIG1hc2suCi0tCgkgKi8KCWZvciAoaSA9IDA7 IGkgPCBzaXplOyBpKyspIHsKCQlpZiAoIW1baV0pCgkJCWNvbnRpbnVlOwoJCWlmICgobVtpXSB8 IG1hc2tbaV0pICE9IG1hc2tbaV0pCgkJCWdvdG8gZXJyb3I7CgkJaWYgKGxhc3QgJiYgKChzcGVj W2ldICYgbVtpXSkgIT0gKGxhc3RbaV0gJiBtW2ldKSkpCgkJCWdvdG8gZXJyb3I7Cgl9CglyZXR1 cm4gMDsKZXJyb3I6CglydGVfZXJybm8gPSBFTk9UU1VQOwoJcmV0dXJuIC1ydGVfZXJybm87Cn0K Ci8qKgogKiBFeHRyYWN0IGF0dHJpYnV0ZSB0byB0aGUgcGFyc2VyLgogKgogKiBAcGFyYW1baW5d IGF0dHIKICogICBGbG93IHJ1bGUgYXR0cmlidXRlcy4KICogQHBhcmFtW291dF0gZXJyb3IKICog ICBQZXJmb3JtIHZlcmJvc2UgZXJyb3IgcmVwb3J0aW5nIGlmIG5vdCBOVUxMLgogKgogKiBAcmV0 dXJuCiAqICAgMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBh bmQgcnRlX2Vycm5vIGlzIHNldC4KICovCnN0YXRpYyBpbnQKbWx4NV9mbG93X2NvbnZlcnRfYXR0 cmlidXRlcyhjb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfYXR0ciAqYXR0ciwKCQkJICAgICBzdHJ1Y3Qg cnRlX2Zsb3dfZXJyb3IgKmVycm9yKQp7CglpZiAoYXR0ci0+Z3JvdXApIHsKCQlydGVfZmxvd19l cnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsCgkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FUVFJf R1JPVVAsCgkJCQkgICBOVUxMLAoJCQkJICAgImdyb3VwcyBhcmUgbm90IHN1cHBvcnRlZCIpOwoJ CXJldHVybiAtcnRlX2Vycm5vOwoJfQoJaWYgKGF0dHItPnByaW9yaXR5ICYmIGF0dHItPnByaW9y aXR5ICE9IE1MWDVfQ1RSTF9GTE9XX1BSSU9SSVRZKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVy cm9yLCBFTk9UU1VQLAoJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRSX1BSSU9SSVRZLAoJ CQkJICAgTlVMTCwKCQkJCSAgICJwcmlvcml0aWVzIGFyZSBub3Qgc3VwcG9ydGVkIik7CgkJcmV0 dXJuIC1ydGVfZXJybm87Cgl9CglpZiAoYXR0ci0+ZWdyZXNzKSB7CgkJcnRlX2Zsb3dfZXJyb3Jf c2V0KGVycm9yLCBFTk9UU1VQLAoJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRSX0VHUkVT UywKCQkJCSAgIE5VTEwsCgkJCQkgICAiZWdyZXNzIGlzIG5vdCBzdXBwb3J0ZWQiKTsKCQlyZXR1 cm4gLXJ0ZV9lcnJubzsKCX0KCWlmIChhdHRyLT50cmFuc2ZlcikgewoJCXJ0ZV9mbG93X2Vycm9y X3NldChlcnJvciwgRU5PVFNVUCwKCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQVRUUl9UUkFO U0ZFUiwKCQkJCSAgIE5VTEwsCgkJCQkgICAidHJhbnNmZXIgaXMgbm90IHN1cHBvcnRlZCIpOwoJ CXJldHVybiAtcnRlX2Vycm5vOwoJfQoJaWYgKCFhdHRyLT5pbmdyZXNzKSB7CgkJcnRlX2Zsb3df ZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLAoJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRS X0lOR1JFU1MsCgkJCQkgICBOVUxMLAoJCQkJICAgIm9ubHkgaW5ncmVzcyBpcyBzdXBwb3J0ZWQi KTsKCQlyZXR1cm4gLXJ0ZV9lcnJubzsKCX0KLS0KICoKICogQHBhcmFtIGRldgogKiAgIFBvaW50 ZXIgdG8gRXRoZXJuZXQgZGV2aWNlLgogKiBAcGFyYW1baW5dIGFjdGlvbnMKICogICBBc3NvY2lh dGVkIGFjdGlvbnMgKGxpc3QgdGVybWluYXRlZCBieSB0aGUgRU5EIGFjdGlvbikuCiAqIEBwYXJh bVtvdXRdIGVycm9yCiAqICAgUGVyZm9ybSB2ZXJib3NlIGVycm9yIHJlcG9ydGluZyBpZiBub3Qg TlVMTC4KICogQHBhcmFtW2luLCBvdXRdIHBhcnNlcgogKiAgIEludGVybmFsIHBhcnNlciBzdHJ1 Y3R1cmUuCiAqCiAqIEByZXR1cm4KICogICAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8g dmFsdWUgb3RoZXJ3aXNlIGFuZCBydGVfZXJybm8gaXMgc2V0LgogKi8Kc3RhdGljIGludAptbHg1 X2Zsb3dfY29udmVydF9hY3Rpb25zKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LAoJCQkgIGNvbnN0 IHN0cnVjdCBydGVfZmxvd19hY3Rpb24gYWN0aW9uc1tdLAoJCQkgIHN0cnVjdCBydGVfZmxvd19l cnJvciAqZXJyb3IsCgkJCSAgc3RydWN0IG1seDVfZmxvd19wYXJzZSAqcGFyc2VyKQp7CgllbnVt IHsgRkFURSA9IDEsIE1BUksgPSAyLCBDT1VOVCA9IDQsIH07Cgl1aW50MzJfdCBvdmVybGFwID0g MDsKCXN0cnVjdCBwcml2ICpwcml2ID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsKLS0KCQkJaWYg KG92ZXJsYXAgJiBGQVRFKQoJCQkJZ290byBleGl0X2FjdGlvbl9vdmVybGFwOwoJCQlvdmVybGFw IHw9IEZBVEU7CgkJCWlmIChyc3MtPmZ1bmMgJiYKCQkJICAgIHJzcy0+ZnVuYyAhPSBSVEVfRVRI X0hBU0hfRlVOQ1RJT05fVE9FUExJVFopIHsKCQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwg RUlOVkFMLAoJCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0 aW9ucywKCQkJCQkJICAgInRoZSBvbmx5IHN1cHBvcnRlZCBSU1MgaGFzaCIKCQkJCQkJICAgIiBm dW5jdGlvbiBpcyBUb2VwbGl0eiIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0KI2lmbmRl ZiBIQVZFX0lCVl9ERVZJQ0VfVFVOTkVMX1NVUFBPUlQKCQkJaWYgKHBhcnNlci0+cnNzX2NvbmYu bGV2ZWwgPiAxKSB7CgkJCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwKCQkJCQkJ ICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BQ1RJT04sCgkJCQkJCSAgIGFjdGlvbnMsCgkJCQkJCSAg ICJhIG5vbnplcm8gUlNTIGVuY2Fwc3VsYXRpb24iCgkJCQkJCSAgICIgbGV2ZWwgaXMgbm90IHN1 cHBvcnRlZCIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0KI2VuZGlmCgkJCWlmIChwYXJz ZXItPnJzc19jb25mLmxldmVsID4gMikgewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBF SU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rp b25zLAoJCQkJCQkgICAiUlNTIGVuY2Fwc3VsYXRpb24gbGV2ZWwiCgkJCQkJCSAgICIgPiAxIGlz IG5vdCBzdXBwb3J0ZWQiKTsKCQkJCXJldHVybiAtcnRlX2Vycm5vOwoJCQl9CgkJCWlmIChyc3Mt PnR5cGVzICYgTUxYNV9SU1NfSEZfTUFTSykgewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9y LCBFSU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBh Y3Rpb25zLAoJCQkJCQkgICAidW5zdXBwb3J0ZWQgUlNTIHR5cGUiCgkJCQkJCSAgICIgcmVxdWVz dGVkIik7CgkJCQlyZXR1cm4gLXJ0ZV9lcnJubzsKLS0KCQkJfSBlbHNlIHsKCQkJCXJzc19rZXlf bGVuID0gcnNzX2hhc2hfZGVmYXVsdF9rZXlfbGVuOwoJCQkJcnNzX2tleSA9IHJzc19oYXNoX2Rl ZmF1bHRfa2V5OwoJCQl9CgkJCWlmIChyc3Nfa2V5X2xlbiAhPSBSVEVfRElNKHBhcnNlci0+cnNz X2tleSkpIHsKCQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLAoJCQkJCQkgICBS VEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgIlJT UyBoYXNoIGtleSBtdXN0IGJlIgoJCQkJCQkgICAiIGV4YWN0bHkgNDAgYnl0ZXMgbG9uZyIpOwoJ CQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0KCQkJaWYgKCFyc3MtPnF1ZXVlX251bSkgewoJCQkJ cnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9S X1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAibm8gdmFsaWQgcXVldWVz Iik7CgkJCQlyZXR1cm4gLXJ0ZV9lcnJubzsKCQkJfQoJCQlpZiAocnNzLT5xdWV1ZV9udW0gPiBS VEVfRElNKHBhcnNlci0+cXVldWVzKSkgewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBF SU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rp b25zLAoJCQkJCQkgICAidG9vIG1hbnkgcXVldWVzIGZvciBSU1MiCgkJCQkJCSAgICIgY29udGV4 dCIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0KCQkJZm9yIChuID0gMDsgbiA8IHJzcy0+ cXVldWVfbnVtOyArK24pIHsKCQkJCWlmIChyc3MtPnF1ZXVlW25dID49IHByaXYtPnJ4cXNfbikg ewoJCQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLAoJCQkJCQkgICBSVEVfRkxP V19FUlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgInF1ZXVlIGlk ID4gbnVtYmVyIG9mIgoJCQkJCQkgICAiIHF1ZXVlcyIpOwoJCQkJCXJldHVybiAtcnRlX2Vycm5v OwotLQoKCQkJaWYgKG92ZXJsYXAgJiBNQVJLKQoJCQkJZ290byBleGl0X2FjdGlvbl9vdmVybGFw OwoJCQlvdmVybGFwIHw9IE1BUks7CgkJCWlmICghbWFyaykgewoJCQkJcnRlX2Zsb3dfZXJyb3Jf c2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJ CQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAibWFyayBtdXN0IGJlIGRlZmluZWQiKTsKCQkJCXJl dHVybiAtcnRlX2Vycm5vOwoJCQl9IGVsc2UgaWYgKG1hcmstPmlkID49IE1MWDVfRkxPV19NQVJL X01BWCkgewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLAoJCQkJCQkgICBS VEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgIm1h cmsgbXVzdCBiZSBiZXR3ZWVuIDAiCgkJCQkJCSAgICIgYW5kIDE2Nzc3MTk5Iik7CgkJCQlyZXR1 cm4gLXJ0ZV9lcnJubzsKLS0KCWlmICghKG92ZXJsYXAgJiBGQVRFKSkKCQlwYXJzZXItPmRyb3Ag PSAxOwoJaWYgKHBhcnNlci0+ZHJvcCAmJiBwYXJzZXItPm1hcmspCgkJcGFyc2VyLT5tYXJrID0g MDsKCWlmICghcGFyc2VyLT5yc3NfY29uZi5xdWV1ZV9udW0gJiYgIXBhcnNlci0+ZHJvcCkgewoJ CXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwgUlRFX0ZMT1dfRVJST1JfVFlQRV9I QU5ETEUsCgkJCQkgICBOVUxMLCAibm8gdmFsaWQgYWN0aW9uIik7CgkJcmV0dXJuIC1ydGVfZXJy bm87Cgl9CglyZXR1cm4gMDsKZXhpdF9hY3Rpb25fbm90X3N1cHBvcnRlZDoKCXJ0ZV9mbG93X2Vy cm9yX3NldChlcnJvciwgRU5PVFNVUCwgUlRFX0ZMT1dfRVJST1JfVFlQRV9BQ1RJT04sCgkJCSAg IGFjdGlvbnMsICJhY3Rpb24gbm90IHN1cHBvcnRlZCIpOwoJcmV0dXJuIC1ydGVfZXJybm87CmV4 aXRfYWN0aW9uX292ZXJsYXA6CglydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsIFJU RV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkgICBhY3Rpb25zLCAib3ZlcmxhcHBpbmcgYWN0 aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpOwoJcmV0dXJuIC1ydGVfZXJybm87Cn0KCi8qKgogKiBW YWxpZGF0ZSBpdGVtcy4KICoKICogQHBhcmFtW2luXSBpdGVtcwogKiAgIFBhdHRlcm4gc3BlY2lm aWNhdGlvbiAobGlzdCB0ZXJtaW5hdGVkIGJ5IHRoZSBFTkQgcGF0dGVybiBpdGVtKS4KICogQHBh cmFtW291dF0gZXJyb3IKICogICBQZXJmb3JtIHZlcmJvc2UgZXJyb3IgcmVwb3J0aW5nIGlmIG5v dCBOVUxMLgogKiBAcGFyYW1baW4sIG91dF0gcGFyc2VyCiAqICAgSW50ZXJuYWwgcGFyc2VyIHN0 cnVjdHVyZS4KICoKICogQHJldHVybgogKiAgIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJu byB2YWx1ZSBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuCiAqLwpzdGF0aWMgaW50Cm1s eDVfZmxvd19jb252ZXJ0X2l0ZW1zX3ZhbGlkYXRlKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LAoJ CQkJIGNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtIGl0ZW1zW10sCgkJCQkgc3RydWN0IHJ0ZV9m bG93X2Vycm9yICplcnJvciwKCQkJCSBzdHJ1Y3QgbWx4NV9mbG93X3BhcnNlICpwYXJzZXIpCnsK CXN0cnVjdCBwcml2ICpwcml2ID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsKCWNvbnN0IHN0cnVj dCBtbHg1X2Zsb3dfaXRlbXMgKmN1cl9pdGVtID0gbWx4NV9mbG93X2l0ZW1zOwoJdW5zaWduZWQg aW50IGk7Ci0tCgkJCQkJICAgICAgY3VyX2l0ZW0tPm1hc2tfc3opOwoJCWlmIChyZXQpCgkJCWdv dG8gZXhpdF9pdGVtX25vdF9zdXBwb3J0ZWQ7CgkJaWYgKElTX1RVTk5FTChpdGVtcy0+dHlwZSkp IHsKCQkJaWYgKHBhcnNlci0+dHVubmVsKSB7CgkJCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3Is IEVOT1RTVVAsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwKCQkJCQkJICAgaXRl bXMsCgkJCQkJCSAgICJDYW5ub3QgcmVjb2duaXplIG11bHRpcGxlIgoJCQkJCQkgICAiIHR1bm5l bCBlbmNhcHN1bGF0aW9ucy4iKTsKCQkJCXJldHVybiAtcnRlX2Vycm5vOwoJCQl9CgkJCWlmICgh cHJpdi0+Y29uZmlnLnR1bm5lbF9lbiAmJgoJCQkgICAgcGFyc2VyLT5yc3NfY29uZi5sZXZlbCA+ IDEpIHsKCQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwKCQkJCQlSVEVfRkxP V19FUlJPUl9UWVBFX0lURU0sCgkJCQkJaXRlbXMsCgkJCQkJIlJTUyBvbiB0dW5uZWwgaXMgbm90 IHN1cHBvcnRlZCIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0KLS0KCQlmb3IgKGkgPSAw OyBpICE9IGhhc2hfcnhxX2luaXRfbjsgKytpKQoJCQlwYXJzZXItPnF1ZXVlW2ldLm9mZnNldCAr PSBzaXplOwoJfQoJcmV0dXJuIDA7CmV4aXRfaXRlbV9ub3Rfc3VwcG9ydGVkOgoJcmV0dXJuIHJ0 ZV9mbG93X2Vycm9yX3NldChlcnJvciwgLXJldCwgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLAoJ CQkJICBpdGVtcywgIml0ZW0gbm90IHN1cHBvcnRlZCIpOwp9CgovKioKICogQWxsb2NhdGUgbWVt b3J5IHNwYWNlIHRvIHN0b3JlIHZlcmJzIGZsb3cgYXR0cmlidXRlcy4KICoKICogQHBhcmFtW2lu XSBzaXplCiAqICAgQW1vdW50IG9mIGJ5dGUgdG8gYWxsb2NhdGUuCiAqIEBwYXJhbVtvdXRdIGVy cm9yCiAqICAgUGVyZm9ybSB2ZXJib3NlIGVycm9yIHJlcG9ydGluZyBpZiBub3QgTlVMTC4KICoK ICogQHJldHVybgogKiAgIEEgdmVyYnMgZmxvdyBhdHRyaWJ1dGUgb24gc3VjY2VzcywgTlVMTCBv dGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuCiAqLwpzdGF0aWMgc3RydWN0IGlidl9mbG93 X2F0dHIgKgptbHg1X2Zsb3dfY29udmVydF9hbGxvY2F0ZSh1bnNpZ25lZCBpbnQgc2l6ZSwgc3Ry dWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvcikKewoJc3RydWN0IGlidl9mbG93X2F0dHIgKmlidl9h dHRyOwoKCWlidl9hdHRyID0gcnRlX2NhbGxvYyhfX2Z1bmNfXywgMSwgc2l6ZSwgMCk7CglpZiAo IWlidl9hdHRyKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9NRU0sCgkJCQkgICBS VEVfRkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVELAoJCQkJICAgTlVMTCwKCQkJCSAgICJjYW5u b3QgYWxsb2NhdGUgdmVyYnMgc3BlYyBhdHRyaWJ1dGVzIik7CgkJcmV0dXJuIE5VTEw7Cgl9Ci0t CiAqICAgRmxvdyBydWxlIGF0dHJpYnV0ZXMuCiAqIEBwYXJhbVtpbl0gcGF0dGVybgogKiAgIFBh dHRlcm4gc3BlY2lmaWNhdGlvbiAobGlzdCB0ZXJtaW5hdGVkIGJ5IHRoZSBFTkQgcGF0dGVybiBp dGVtKS4KICogQHBhcmFtW2luXSBhY3Rpb25zCiAqICAgQXNzb2NpYXRlZCBhY3Rpb25zIChsaXN0 IHRlcm1pbmF0ZWQgYnkgdGhlIEVORCBhY3Rpb24pLgogKiBAcGFyYW1bb3V0XSBlcnJvcgogKiAg IFBlcmZvcm0gdmVyYm9zZSBlcnJvciByZXBvcnRpbmcgaWYgbm90IE5VTEwuCiAqIEBwYXJhbVtp biwgb3V0XSBwYXJzZXIKICogICBJbnRlcm5hbCBwYXJzZXIgc3RydWN0dXJlLgogKgogKiBAcmV0 dXJuCiAqICAgMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBh bmQgcnRlX2Vycm5vIGlzIHNldC4KLS0Kc3RhdGljIGludAptbHg1X2Zsb3dfY29udmVydChzdHJ1 Y3QgcnRlX2V0aF9kZXYgKmRldiwKCQkgIGNvbnN0IHN0cnVjdCBydGVfZmxvd19hdHRyICphdHRy LAoJCSAgY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW0gaXRlbXNbXSwKCQkgIGNvbnN0IHN0cnVj dCBydGVfZmxvd19hY3Rpb24gYWN0aW9uc1tdLAoJCSAgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICpl cnJvciwKCQkgIHN0cnVjdCBtbHg1X2Zsb3dfcGFyc2UgKnBhcnNlcikKewoJY29uc3Qgc3RydWN0 IG1seDVfZmxvd19pdGVtcyAqY3VyX2l0ZW0gPSBtbHg1X2Zsb3dfaXRlbXM7Cgl1bnNpZ25lZCBp bnQgaTsKCWludCByZXQ7Ci0tCgkqcGFyc2VyID0gKHN0cnVjdCBtbHg1X2Zsb3dfcGFyc2UpewoJ CS5jcmVhdGUgPSBwYXJzZXItPmNyZWF0ZSwKCQkubGF5ZXIgPSBIQVNIX1JYUV9FVEgsCgkJLm1h cmtfaWQgPSBNTFg1X0ZMT1dfTUFSS19ERUZBVUxULAoJfTsKCXJldCA9IG1seDVfZmxvd19jb252 ZXJ0X2F0dHJpYnV0ZXMoYXR0ciwgZXJyb3IpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoJcmV0 ID0gbWx4NV9mbG93X2NvbnZlcnRfYWN0aW9ucyhkZXYsIGFjdGlvbnMsIGVycm9yLCBwYXJzZXIp OwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoJcmV0ID0gbWx4NV9mbG93X2NvbnZlcnRfaXRlbXNf dmFsaWRhdGUoZGV2LCBpdGVtcywgZXJyb3IsIHBhcnNlcik7CglpZiAocmV0KQoJCXJldHVybiBy ZXQ7CgltbHg1X2Zsb3dfY29udmVydF9maW5hbGlzZShwYXJzZXIpOwoJLyoKCSAqIFNlY29uZCBz dGVwLgotLQoJICovCglpZiAocGFyc2VyLT5kcm9wKSB7CgkJdW5zaWduZWQgaW50IG9mZnNldCA9 IHBhcnNlci0+cXVldWVbSEFTSF9SWFFfRVRIXS5vZmZzZXQ7CgoJCXBhcnNlci0+cXVldWVbSEFT SF9SWFFfRVRIXS5pYnZfYXR0ciA9CgkJCW1seDVfZmxvd19jb252ZXJ0X2FsbG9jYXRlKG9mZnNl dCwgZXJyb3IpOwoJCWlmICghcGFyc2VyLT5xdWV1ZVtIQVNIX1JYUV9FVEhdLmlidl9hdHRyKQoJ CQlnb3RvIGV4aXRfZW5vbWVtOwoJCXBhcnNlci0+cXVldWVbSEFTSF9SWFFfRVRIXS5vZmZzZXQg PQoJCQlzaXplb2Yoc3RydWN0IGlidl9mbG93X2F0dHIpOwoJfSBlbHNlIHsKCQlmb3IgKGkgPSAw OyBpICE9IGhhc2hfcnhxX2luaXRfbjsgKytpKSB7CgkJCXVuc2lnbmVkIGludCBvZmZzZXQ7CgoJ CQlvZmZzZXQgPSBwYXJzZXItPnF1ZXVlW2ldLm9mZnNldDsKCQkJcGFyc2VyLT5xdWV1ZVtpXS5p YnZfYXR0ciA9CgkJCQltbHg1X2Zsb3dfY29udmVydF9hbGxvY2F0ZShvZmZzZXQsIGVycm9yKTsK CQkJaWYgKCFwYXJzZXItPnF1ZXVlW2ldLmlidl9hdHRyKQoJCQkJZ290byBleGl0X2Vub21lbTsK CQkJcGFyc2VyLT5xdWV1ZVtpXS5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlidl9mbG93X2F0dHIp OwoJCX0KCX0KLS0KCXBhcnNlci0+bGF5ZXIgPSBIQVNIX1JYUV9FVEg7Cglmb3IgKDsgaXRlbXMt PnR5cGUgIT0gUlRFX0ZMT1dfSVRFTV9UWVBFX0VORDsgKytpdGVtcykgewoJCXN0cnVjdCBtbHg1 X2Zsb3dfZGF0YSBkYXRhID0gewoJCQkuZGV2ID0gZGV2LAoJCQkucGFyc2VyID0gcGFyc2VyLAoJ CQkuZXJyb3IgPSBlcnJvciwKCQl9OwoKCQlpZiAoaXRlbXMtPnR5cGUgPT0gUlRFX0ZMT1dfSVRF TV9UWVBFX1ZPSUQpCgkJCWNvbnRpbnVlOwoJCWN1cl9pdGVtID0gJm1seDVfZmxvd19pdGVtc1tp dGVtcy0+dHlwZV07Ci0tCglpZiAocGFyc2VyLT5tYXJrKQoJCW1seDVfZmxvd19jcmVhdGVfZmxh Z19tYXJrKHBhcnNlciwgcGFyc2VyLT5tYXJrX2lkKTsKCWlmIChwYXJzZXItPmNvdW50ICYmIHBh cnNlci0+Y3JlYXRlKSB7CgkJbWx4NV9mbG93X2NyZWF0ZV9jb3VudChkZXYsIHBhcnNlcik7CgkJ aWYgKCFwYXJzZXItPmNzKQoJCQlnb3RvIGV4aXRfY291bnRfZXJyb3I7Cgl9CmV4aXRfZnJlZToK CS8qIE9ubHkgdmVyaWZpY2F0aW9uIGlzIGV4cGVjdGVkLCBhbGwgcmVzb3VyY2VzIHNob3VsZCBi ZSByZWxlYXNlZC4gKi8KCWlmICghcGFyc2VyLT5jcmVhdGUpIHsKCQlmb3IgKGkgPSAwOyBpICE9 IGhhc2hfcnhxX2luaXRfbjsgKytpKSB7Ci0tCgkJaWYgKHBhcnNlci0+cXVldWVbaV0uaWJ2X2F0 dHIpIHsKCQkJcnRlX2ZyZWUocGFyc2VyLT5xdWV1ZVtpXS5pYnZfYXR0cik7CgkJCXBhcnNlci0+ cXVldWVbaV0uaWJ2X2F0dHIgPSBOVUxMOwoJCX0KCX0KCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJv ciwgRU5PTUVNLCBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVELAoJCQkgICBOVUxMLCAi Y2Fubm90IGFsbG9jYXRlIHZlcmJzIHNwZWMgYXR0cmlidXRlcyIpOwoJcmV0dXJuIC1ydGVfZXJy bm87CmV4aXRfY291bnRfZXJyb3I6CglydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwg UlRFX0ZMT1dfRVJST1JfVFlQRV9VTlNQRUNJRklFRCwKCQkJICAgTlVMTCwgImNhbm5vdCBjcmVh dGUgY291bnRlciIpOwoJcmV0dXJuIC1ydGVfZXJybm87Cn0KCi8qKgotLQoJCQkvKgoJCQkgKiBG cm9tIHZlcmJzIHBlcnNwZWN0aXZlIGFuIGVtcHR5IFZMQU4gaXMgZXF1aXZhbGVudAoJCQkgKiB0 byBhIHBhY2tldCB3aXRob3V0IFZMQU4gbGF5ZXIuCgkJCSAqLwoJCQlpZiAoIWV0aC0+bWFzay52 bGFuX3RhZykKCQkJCWdvdG8gZXJyb3I7CgkJCS8qIE91dGVyIFRQSUQgY2Fubm90IGJlIG1hdGNo ZWQuICovCgkJCWlmIChldGgtPm1hc2suZXRoZXJfdHlwZSkgewoJCQkJbXNnID0gIlZMQU4gVFBJ RCBtYXRjaGluZyBpcyBub3Qgc3VwcG9ydGVkIjsKCQkJCWdvdG8gZXJyb3I7CgkJCX0KCQkJZXRo LT52YWwuZXRoZXJfdHlwZSA9IHNwZWMtPmlubmVyX3R5cGU7CgkJCWV0aC0+bWFzay5ldGhlcl90 eXBlID0gbWFzay0+aW5uZXJfdHlwZTsKCQkJZXRoLT52YWwuZXRoZXJfdHlwZSAmPSBldGgtPm1h c2suZXRoZXJfdHlwZTsKCQl9CgkJcmV0dXJuIDA7Cgl9CmVycm9yOgoJcmV0dXJuIHJ0ZV9mbG93 X2Vycm9yX3NldChkYXRhLT5lcnJvciwgRUlOVkFMLCBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0s CgkJCQkgIGl0ZW0sIG1zZyk7Cn0KCi8qKgogKiBDb252ZXJ0IElQdjQgaXRlbSB0byBWZXJicyBz cGVjaWZpY2F0aW9uLgotLQoJfTsKCglpZiAocGFyc2VyLT5sYXllciA9PSBIQVNIX1JYUV9UVU5O RUwgJiYKCSAgICBwYXJzZXItPnR1bm5lbCA9PSBwdHlwZV9leHRbUFRZUEVfSURYKFJURV9QVFlQ RV9UVU5ORUxfVlhMQU4pXSAmJgoJICAgICFwcml2LT5jb25maWcubDNfdnhsYW5fZW4pCgkJcmV0 dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChkYXRhLT5lcnJvciwgRUlOVkFMLAoJCQkJCSAgUlRFX0ZM T1dfRVJST1JfVFlQRV9JVEVNLAoJCQkJCSAgaXRlbSwKCQkJCQkgICJMMyBWWExBTiBub3QgZW5h YmxlZCBieSBkZXZpY2UiCgkJCQkJICAiIHBhcmFtZXRlciBhbmQvb3Igbm90IGNvbmZpZ3VyZWQi CgkJCQkJICAiIGluIGZpcm13YXJlIik7Ci0tCgl9OwoKCWlmIChwYXJzZXItPmxheWVyID09IEhB U0hfUlhRX1RVTk5FTCAmJgoJICAgIHBhcnNlci0+dHVubmVsID09IHB0eXBlX2V4dFtQVFlQRV9J RFgoUlRFX1BUWVBFX1RVTk5FTF9WWExBTildICYmCgkgICAgIXByaXYtPmNvbmZpZy5sM192eGxh bl9lbikKCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGRhdGEtPmVycm9yLCBFSU5WQUwsCgkJ CQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJCQkJICBpdGVtLAoJCQkJCSAgIkwzIFZY TEFOIG5vdCBlbmFibGVkIGJ5IGRldmljZSIKCQkJCQkgICIgcGFyYW1ldGVyIGFuZC9vciBub3Qg Y29uZmlndXJlZCIKCQkJCQkgICIgaW4gZmlybXdhcmUiKTsKLS0KCSAqIGJlZm9yZSB3aWxsIGFs c28gbWF0Y2ggdGhpcyBydWxlLgoJICogVG8gYXZvaWQgc3VjaCBzaXR1YXRpb24sIFZOSSAwIGlz IGN1cnJlbnRseSByZWZ1c2VkLgoJICovCgkvKiBPbmx5IGFsbG93IHR1bm5lbCB3L28gdHVubmVs IGlkIHBhdHRlcm4gYWZ0ZXIgcHJvcGVyIG91dGVyIHNwZWMuICovCglpZiAocGFyc2VyLT5vdXRf bGF5ZXIgPT0gSEFTSF9SWFFfRVRIICYmICF2eGxhbi52YWwudHVubmVsX2lkKQoJCXJldHVybiBy dGVfZmxvd19lcnJvcl9zZXQoZGF0YS0+ZXJyb3IsIEVJTlZBTCwKCQkJCQkgIFJURV9GTE9XX0VS Uk9SX1RZUEVfSVRFTSwKCQkJCQkgIGl0ZW0sCgkJCQkJICAiVnhMQU4gdm5pIGNhbm5vdCBiZSAw Iik7CgltbHg1X2Zsb3dfY3JlYXRlX2NvcHkocGFyc2VyLCAmdnhsYW4sIHNpemUpOwoJcmV0dXJu IDA7Ci0tCgkJdWludDMyX3Qgdmxhbl9pZDsKCQl1aW50OF90IHZuaVs0XTsKCX0gaWQ7CgoJaWYg KCFwcml2LT5jb25maWcubDNfdnhsYW5fZW4pCgkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChk YXRhLT5lcnJvciwgRUlOVkFMLAoJCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLAoJCQkJ CSAgaXRlbSwKCQkJCQkgICJMMyBWWExBTiBub3QgZW5hYmxlZCBieSBkZXZpY2UiCgkJCQkJICAi IHBhcmFtZXRlciBhbmQvb3Igbm90IGNvbmZpZ3VyZWQiCgkJCQkJICAiIGluIGZpcm13YXJlIik7 Ci0tCgkJbWVtY3B5KCZpZC52bmlbMV0sIHNwZWMtPnZuaSwgMyk7CgkJdnhsYW4udmFsLnR1bm5l bF9pZCA9IGlkLnZsYW5faWQ7CgkJbWVtY3B5KCZpZC52bmlbMV0sIG1hc2stPnZuaSwgMyk7CgkJ dnhsYW4ubWFzay50dW5uZWxfaWQgPSBpZC52bGFuX2lkOwoJCWlmIChzcGVjLT5wcm90b2NvbCkK CQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChkYXRhLT5lcnJvciwgRUlOVkFMLAoJCQkJCQkg IFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwKCQkJCQkJICBpdGVtLAoJCQkJCQkgICJWeExBTi1H UEUgcHJvdG9jb2wgbm90IgoJCQkJCQkgICIgc3VwcG9ydGVkIik7CgkJLyogUmVtb3ZlIHVud2Fu dGVkIGJpdHMgZnJvbSB2YWx1ZXMuICovCi0tCgkgKiBiZWZvcmUgd2lsbCBhbHNvIG1hdGNoIHRo aXMgcnVsZS4KCSAqIFRvIGF2b2lkIHN1Y2ggc2l0dWF0aW9uLCBWTkkgMCBpcyBjdXJyZW50bHkg cmVmdXNlZC4KCSAqLwoJLyogT25seSBhbGxvdyB0dW5uZWwgdy9vIHR1bm5lbCBpZCBwYXR0ZXJu IGFmdGVyIHByb3BlciBvdXRlciBzcGVjLiAqLwoJaWYgKHBhcnNlci0+b3V0X2xheWVyID09IEhB U0hfUlhRX0VUSCAmJiAhdnhsYW4udmFsLnR1bm5lbF9pZCkKCQlyZXR1cm4gcnRlX2Zsb3dfZXJy b3Jfc2V0KGRhdGEtPmVycm9yLCBFSU5WQUwsCgkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lU RU0sCgkJCQkJICBpdGVtLAoJCQkJCSAgIlZ4TEFOLUdQRSB2bmkgY2Fubm90IGJlIDAiKTsKCW1s eDVfZmxvd19jcmVhdGVfY29weShwYXJzZXIsICZ2eGxhbiwgc2l6ZSk7CglyZXR1cm4gMDsKLS0K CQkJaXB2Ni0+dmFsLm5leHRfaGRyID0gTUxYNV9HUkU7CgkJCWlwdjYtPm1hc2submV4dF9oZHIg PSAweGZmOwoJCX0KCX0KCWlmIChpICE9IGhhc2hfcnhxX2luaXRfbikKCQlyZXR1cm4gcnRlX2Zs b3dfZXJyb3Jfc2V0KGRhdGEtPmVycm9yLCBFSU5WQUwsCgkJCQkJICBSVEVfRkxPV19FUlJPUl9U WVBFX0lURU0sCgkJCQkJICBpdGVtLAoJCQkJCSAgIklQIHByb3RvY29sIG9mIEdSRSBtdXN0IGJl IDQ3Iik7CgltbHg1X2Zsb3dfY3JlYXRlX2NvcHkocGFyc2VyLCAmdHVubmVsLCBzaXplKTsKCXJl dHVybiAwOwotLQogKiAgIFBvaW50ZXIgdG8gRXRoZXJuZXQgZGV2aWNlLgogKiBAcGFyYW0gcGFy c2VyCiAqICAgSW50ZXJuYWwgcGFyc2VyIHN0cnVjdHVyZS4KICogQHBhcmFtIGZsb3cKICogICBQ b2ludGVyIHRvIHRoZSBydGVfZmxvdy4KICogQHBhcmFtW291dF0gZXJyb3IKICogICBQZXJmb3Jt IHZlcmJvc2UgZXJyb3IgcmVwb3J0aW5nIGlmIG5vdCBOVUxMLgogKgogKiBAcmV0dXJuCiAqICAg MCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vy cm5vIGlzIHNldC4KICovCnN0YXRpYyBpbnQKbWx4NV9mbG93X2NyZWF0ZV9hY3Rpb25fcXVldWVf ZHJvcChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwKCQkJCSAgIHN0cnVjdCBtbHg1X2Zsb3dfcGFy c2UgKnBhcnNlciwKCQkJCSAgIHN0cnVjdCBydGVfZmxvdyAqZmxvdywKCQkJCSAgIHN0cnVjdCBy dGVfZmxvd19lcnJvciAqZXJyb3IpCnsKCXN0cnVjdCBwcml2ICpwcml2ID0gZGV2LT5kYXRhLT5k ZXZfcHJpdmF0ZTsKCXN0cnVjdCBpYnZfZmxvd19zcGVjX2FjdGlvbl9kcm9wICpkcm9wOwoJdW5z aWduZWQgaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IGlidl9mbG93X3NwZWNfYWN0aW9uX2Ryb3Ap OwoKLS0KCXBhcnNlci0+cXVldWVbSEFTSF9SWFFfRVRIXS5pYnZfYXR0ciA9IE5VTEw7CglmbG93 LT5mcnhxW0hBU0hfUlhRX0VUSF0uaWJ2X2Zsb3cgPQoJCW1seDVfZ2x1ZS0+Y3JlYXRlX2Zsb3co cHJpdi0+Zmxvd19kcm9wX3F1ZXVlLT5xcCwKCQkJCSAgICAgICBmbG93LT5mcnhxW0hBU0hfUlhR X0VUSF0uaWJ2X2F0dHIpOwoJaWYgKCFmbG93LT5mcnhxW0hBU0hfUlhRX0VUSF0uaWJ2X2Zsb3cp IHsKCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT01FTSwgUlRFX0ZMT1dfRVJST1JfVFlQ RV9IQU5ETEUsCgkJCQkgICBOVUxMLCAiZmxvdyBydWxlIGNyZWF0aW9uIGZhaWx1cmUiKTsKCQln b3RvIGVycm9yOwoJfQoJcmV0dXJuIDA7CmVycm9yOgoJYXNzZXJ0KGZsb3cpOwoJaWYgKGZsb3ct PmZyeHFbSEFTSF9SWFFfRVRIXS5pYnZfZmxvdykgewoJCWNsYWltX3plcm8obWx4NV9nbHVlLT5k ZXN0cm95X2Zsb3cKCQkJICAgKGZsb3ctPmZyeHFbSEFTSF9SWFFfRVRIXS5pYnZfZmxvdykpOwoJ CWZsb3ctPmZyeHFbSEFTSF9SWFFfRVRIXS5pYnZfZmxvdyA9IE5VTEw7Ci0tCiAqICAgUG9pbnRl ciB0byBFdGhlcm5ldCBkZXZpY2UuCiAqIEBwYXJhbSBwYXJzZXIKICogICBJbnRlcm5hbCBwYXJz ZXIgc3RydWN0dXJlLgogKiBAcGFyYW0gZmxvdwogKiAgIFBvaW50ZXIgdG8gdGhlIHJ0ZV9mbG93 LgogKiBAcGFyYW1bb3V0XSBlcnJvcgogKiAgIFBlcmZvcm0gdmVyYm9zZSBlcnJvciByZXBvcnRp bmcgaWYgbm90IE5VTEwuCiAqCiAqIEByZXR1cm4KICogICAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRp dmUgZXJybm8gdmFsdWUgb3RoZXJ3aXNlIGFuZCBydGVfZXJybm8gaXMgc2V0LgogKi8Kc3RhdGlj IGludAptbHg1X2Zsb3dfY3JlYXRlX2FjdGlvbl9xdWV1ZV9yc3Moc3RydWN0IHJ0ZV9ldGhfZGV2 ICpkZXYsCgkJCQkgIHN0cnVjdCBtbHg1X2Zsb3dfcGFyc2UgKnBhcnNlciwKCQkJCSAgc3RydWN0 IHJ0ZV9mbG93ICpmbG93LAoJCQkJICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQp7Cgl1 bnNpZ25lZCBpbnQgaTsKCglmb3IgKGkgPSAwOyBpICE9IGhhc2hfcnhxX2luaXRfbjsgKytpKSB7 CgkJaWYgKCFwYXJzZXItPnF1ZXVlW2ldLmlidl9hdHRyKQotLQoJCQkJICAgICAgcGFyc2VyLT5y c3NfY29uZi5xdWV1ZSwKCQkJCSAgICAgIHBhcnNlci0+cnNzX2NvbmYucXVldWVfbnVtLAoJCQkJ ICAgICAgcGFyc2VyLT50dW5uZWwsCgkJCQkgICAgICBwYXJzZXItPnJzc19jb25mLmxldmVsKTsK CQlpZiAoIWZsb3ctPmZyeHFbaV0uaHJ4cSkgewoJCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0 KGVycm9yLCBFTk9NRU0sCgkJCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9IQU5ETEUsCgkJCQkJ CSAgTlVMTCwKCQkJCQkJICAiY2Fubm90IGNyZWF0ZSBoYXNoIHJ4cSIpOwoJCX0KCX0KLS0KICog ICBQb2ludGVyIHRvIEV0aGVybmV0IGRldmljZS4KICogQHBhcmFtIHBhcnNlcgogKiAgIEludGVy bmFsIHBhcnNlciBzdHJ1Y3R1cmUuCiAqIEBwYXJhbSBmbG93CiAqICAgUG9pbnRlciB0byB0aGUg cnRlX2Zsb3cuCiAqIEBwYXJhbVtvdXRdIGVycm9yCiAqICAgUGVyZm9ybSB2ZXJib3NlIGVycm9y IHJlcG9ydGluZyBpZiBub3QgTlVMTC4KICoKICogQHJldHVybgogKiAgIDAgb24gc3VjY2Vzcywg YSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuCiAq LwpzdGF0aWMgaW50Cm1seDVfZmxvd19jcmVhdGVfYWN0aW9uX3F1ZXVlKHN0cnVjdCBydGVfZXRo X2RldiAqZGV2LAoJCQkgICAgICBzdHJ1Y3QgbWx4NV9mbG93X3BhcnNlICpwYXJzZXIsCgkJCSAg ICAgIHN0cnVjdCBydGVfZmxvdyAqZmxvdywKCQkJICAgICAgc3RydWN0IHJ0ZV9mbG93X2Vycm9y ICplcnJvcikKewoJc3RydWN0IHByaXYgKnByaXYgX19ydGVfdW51c2VkID0gZGV2LT5kYXRhLT5k ZXZfcHJpdmF0ZTsKCWludCByZXQ7Cgl1bnNpZ25lZCBpbnQgaTsKCXVuc2lnbmVkIGludCBmbG93 c19uID0gMDsKCglhc3NlcnQocHJpdi0+cGQpOwoJYXNzZXJ0KHByaXYtPmN0eCk7Cglhc3NlcnQo IXBhcnNlci0+ZHJvcCk7CglyZXQgPSBtbHg1X2Zsb3dfY3JlYXRlX2FjdGlvbl9xdWV1ZV9yc3Mo ZGV2LCBwYXJzZXIsIGZsb3csIGVycm9yKTsKCWlmIChyZXQpCgkJZ290byBlcnJvcjsKCWlmIChw YXJzZXItPmNvdW50KQoJCWZsb3ctPmNzID0gcGFyc2VyLT5jczsKCWlmICghZGV2LT5kYXRhLT5k ZXZfc3RhcnRlZCkKCQlyZXR1cm4gMDsKCWZvciAoaSA9IDA7IGkgIT0gaGFzaF9yeHFfaW5pdF9u OyArK2kpIHsKLS0KCQlmbG93LT5mcnhxW2ldLmlidl9mbG93ID0KCQkJbWx4NV9nbHVlLT5jcmVh dGVfZmxvdyhmbG93LT5mcnhxW2ldLmhyeHEtPnFwLAoJCQkJCSAgICAgICBmbG93LT5mcnhxW2ld Lmlidl9hdHRyKTsKCQltbHg1X2Zsb3dfZHVtcChkZXYsIGZsb3csIGkpOwoJCWlmICghZmxvdy0+ ZnJ4cVtpXS5pYnZfZmxvdykgewoJCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT01FTSwK CQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0hBTkRMRSwKCQkJCQkgICBOVUxMLCAiZmxvdyBy dWxlIGNyZWF0aW9uIGZhaWx1cmUiKTsKCQkJZ290byBlcnJvcjsKCQl9CgkJKytmbG93c19uOwoJ fQoJaWYgKCFmbG93c19uKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsIFJU RV9GTE9XX0VSUk9SX1RZUEVfSEFORExFLAoJCQkJICAgTlVMTCwgImludGVybmFsIGVycm9yIGlu IGZsb3cgY3JlYXRpb24iKTsKCQlnb3RvIGVycm9yOwoJfQoJbWx4NV9mbG93X2NyZWF0ZV91cGRh dGVfcnhxcyhkZXYsIGZsb3cpOwoJcmV0dXJuIDA7CmVycm9yOgoJcmV0ID0gcnRlX2Vycm5vOyAv KiBTYXZlIHJ0ZV9lcnJubyBiZWZvcmUgY2xlYW51cC4gKi8KCWFzc2VydChmbG93KTsKCWZvciAo aSA9IDA7IGkgIT0gaGFzaF9yeHFfaW5pdF9uOyArK2kpIHsKCQlpZiAoZmxvdy0+ZnJ4cVtpXS5p YnZfZmxvdykgewoJCQlzdHJ1Y3QgaWJ2X2Zsb3cgKmlidl9mbG93ID0gZmxvdy0+ZnJ4cVtpXS5p YnZfZmxvdzsKLS0KfQoKLyoqCiAqIENvbnZlcnQgYSBmbG93LgoKZXJyb3I6IHBhdGNoIGZhaWxl ZDogZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zsb3cuYzozMQplcnJvcjogZHJpdmVycy9uZXQvbWx4 NS9tbHg1X2Zsb3cuYzogcGF0Y2ggZG9lcyBub3QgYXBwbHkKKlJlcG86IGRwZGstbmV4dC1jcnlw dG8KQ2hlY2tpbmcgcGF0Y2ggZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zsb3cuYy4uLgplcnJvcjog d2hpbGUgc2VhcmNoaW5nIGZvcjoKI2luY2x1ZGUgIm1seDVfcHJtLmgiCiNpbmNsdWRlICJtbHg1 X2dsdWUuaCIKCi8qIEZsb3cgcHJpb3JpdHkgZm9yIGNvbnRyb2wgcGxhbmUgZmxvd3MuICovCiNk ZWZpbmUgTUxYNV9DVFJMX0ZMT1dfUFJJT1JJVFkgMQotLQoKLyoqIFN0cnVjdHVyZSBnaXZlIHRv IHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gKi8Kc3RydWN0IG1seDVfZmxvd19kYXRhIHsKCXN0 cnVjdCBydGVfZXRoX2RldiAqZGV2OyAvKiogRXRoZXJuZXQgZGV2aWNlLiAqLwoJc3RydWN0IG1s eDVfZmxvd19wYXJzZSAqcGFyc2VyOyAvKiogUGFyc2VyIGNvbnRleHQuICovCglzdHJ1Y3QgcnRl X2Zsb3dfZXJyb3IgKmVycm9yOyAvKiogRXJyb3IgY29udGV4dC4gKi8KfTsKCnN0YXRpYyBpbnQK bWx4NV9mbG93X2NyZWF0ZV9ldGgoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW0gKml0ZW0sCgkJ ICAgICBjb25zdCB2b2lkICpkZWZhdWx0X21hc2ssCi0tCgljb25zdCB1aW50OF90ICpzcGVjID0g aXRlbS0+c3BlYzsKCWNvbnN0IHVpbnQ4X3QgKmxhc3QgPSBpdGVtLT5sYXN0OwoJY29uc3QgdWlu dDhfdCAqbSA9IGl0ZW0tPm1hc2sgPyBpdGVtLT5tYXNrIDogbWFzazsKCglpZiAoIXNwZWMgJiYg KGl0ZW0tPm1hc2sgfHwgbGFzdCkpCgkJZ290byBlcnJvcjsKCWlmICghc3BlYykKCQlyZXR1cm4g MDsKCS8qCgkgKiBTaW5nbGUtcGFzcyBjaGVjayB0byBtYWtlIHN1cmUgdGhhdDoKCSAqIC0gaXRl bS0+bWFzayBpcyBzdXBwb3J0ZWQsIG5vIGJpdHMgYXJlIHNldCBvdXRzaWRlIG1hc2suCi0tCgkg Ki8KCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQlpZiAoIW1baV0pCgkJCWNvbnRpbnVl OwoJCWlmICgobVtpXSB8IG1hc2tbaV0pICE9IG1hc2tbaV0pCgkJCWdvdG8gZXJyb3I7CgkJaWYg KGxhc3QgJiYgKChzcGVjW2ldICYgbVtpXSkgIT0gKGxhc3RbaV0gJiBtW2ldKSkpCgkJCWdvdG8g ZXJyb3I7Cgl9CglyZXR1cm4gMDsKZXJyb3I6CglydGVfZXJybm8gPSBFTk9UU1VQOwoJcmV0dXJu IC1ydGVfZXJybm87Cn0KCi8qKgogKiBFeHRyYWN0IGF0dHJpYnV0ZSB0byB0aGUgcGFyc2VyLgog KgogKiBAcGFyYW1baW5dIGF0dHIKICogICBGbG93IHJ1bGUgYXR0cmlidXRlcy4KICogQHBhcmFt W291dF0gZXJyb3IKICogICBQZXJmb3JtIHZlcmJvc2UgZXJyb3IgcmVwb3J0aW5nIGlmIG5vdCBO VUxMLgogKgogKiBAcmV0dXJuCiAqICAgMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZh bHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNldC4KICovCnN0YXRpYyBpbnQKbWx4NV9m bG93X2NvbnZlcnRfYXR0cmlidXRlcyhjb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfYXR0ciAqYXR0ciwK CQkJICAgICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQp7CglpZiAoYXR0ci0+Z3JvdXAp IHsKCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsCgkJCQkgICBSVEVfRkxPV19F UlJPUl9UWVBFX0FUVFJfR1JPVVAsCgkJCQkgICBOVUxMLAoJCQkJICAgImdyb3VwcyBhcmUgbm90 IHN1cHBvcnRlZCIpOwoJCXJldHVybiAtcnRlX2Vycm5vOwoJfQoJaWYgKGF0dHItPnByaW9yaXR5 ICYmIGF0dHItPnByaW9yaXR5ICE9IE1MWDVfQ1RSTF9GTE9XX1BSSU9SSVRZKSB7CgkJcnRlX2Zs b3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLAoJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9B VFRSX1BSSU9SSVRZLAoJCQkJICAgTlVMTCwKCQkJCSAgICJwcmlvcml0aWVzIGFyZSBub3Qgc3Vw cG9ydGVkIik7CgkJcmV0dXJuIC1ydGVfZXJybm87Cgl9CglpZiAoYXR0ci0+ZWdyZXNzKSB7CgkJ cnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLAoJCQkJICAgUlRFX0ZMT1dfRVJST1Jf VFlQRV9BVFRSX0VHUkVTUywKCQkJCSAgIE5VTEwsCgkJCQkgICAiZWdyZXNzIGlzIG5vdCBzdXBw b3J0ZWQiKTsKCQlyZXR1cm4gLXJ0ZV9lcnJubzsKCX0KCWlmIChhdHRyLT50cmFuc2ZlcikgewoJ CXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwKCQkJCSAgIFJURV9GTE9XX0VSUk9S X1RZUEVfQVRUUl9UUkFOU0ZFUiwKCQkJCSAgIE5VTEwsCgkJCQkgICAidHJhbnNmZXIgaXMgbm90 IHN1cHBvcnRlZCIpOwoJCXJldHVybiAtcnRlX2Vycm5vOwoJfQoJaWYgKCFhdHRyLT5pbmdyZXNz KSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLAoJCQkJICAgUlRFX0ZMT1df RVJST1JfVFlQRV9BVFRSX0lOR1JFU1MsCgkJCQkgICBOVUxMLAoJCQkJICAgIm9ubHkgaW5ncmVz cyBpcyBzdXBwb3J0ZWQiKTsKCQlyZXR1cm4gLXJ0ZV9lcnJubzsKCX0KLS0KICoKICogQHBhcmFt IGRldgogKiAgIFBvaW50ZXIgdG8gRXRoZXJuZXQgZGV2aWNlLgogKiBAcGFyYW1baW5dIGFjdGlv bnMKICogICBBc3NvY2lhdGVkIGFjdGlvbnMgKGxpc3QgdGVybWluYXRlZCBieSB0aGUgRU5EIGFj dGlvbikuCiAqIEBwYXJhbVtvdXRdIGVycm9yCiAqICAgUGVyZm9ybSB2ZXJib3NlIGVycm9yIHJl cG9ydGluZyBpZiBub3QgTlVMTC4KICogQHBhcmFtW2luLCBvdXRdIHBhcnNlcgogKiAgIEludGVy bmFsIHBhcnNlciBzdHJ1Y3R1cmUuCiAqCiAqIEByZXR1cm4KICogICAwIG9uIHN1Y2Nlc3MsIGEg bmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3aXNlIGFuZCBydGVfZXJybm8gaXMgc2V0LgogKi8K c3RhdGljIGludAptbHg1X2Zsb3dfY29udmVydF9hY3Rpb25zKHN0cnVjdCBydGVfZXRoX2RldiAq ZGV2LAoJCQkgIGNvbnN0IHN0cnVjdCBydGVfZmxvd19hY3Rpb24gYWN0aW9uc1tdLAoJCQkgIHN0 cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IsCgkJCSAgc3RydWN0IG1seDVfZmxvd19wYXJzZSAq cGFyc2VyKQp7CgllbnVtIHsgRkFURSA9IDEsIE1BUksgPSAyLCBDT1VOVCA9IDQsIH07Cgl1aW50 MzJfdCBvdmVybGFwID0gMDsKCXN0cnVjdCBwcml2ICpwcml2ID0gZGV2LT5kYXRhLT5kZXZfcHJp dmF0ZTsKLS0KCQkJaWYgKG92ZXJsYXAgJiBGQVRFKQoJCQkJZ290byBleGl0X2FjdGlvbl9vdmVy bGFwOwoJCQlvdmVybGFwIHw9IEZBVEU7CgkJCWlmIChyc3MtPmZ1bmMgJiYKCQkJICAgIHJzcy0+ ZnVuYyAhPSBSVEVfRVRIX0hBU0hfRlVOQ1RJT05fVE9FUExJVFopIHsKCQkJCXJ0ZV9mbG93X2Vy cm9yX3NldChlcnJvciwgRUlOVkFMLAoJCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElP TiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgInRoZSBvbmx5IHN1cHBvcnRlZCBSU1MgaGFz aCIKCQkJCQkJICAgIiBmdW5jdGlvbiBpcyBUb2VwbGl0eiIpOwoJCQkJcmV0dXJuIC1ydGVfZXJy bm87CgkJCX0KI2lmbmRlZiBIQVZFX0lCVl9ERVZJQ0VfVFVOTkVMX1NVUFBPUlQKCQkJaWYgKHBh cnNlci0+cnNzX2NvbmYubGV2ZWwgPiAxKSB7CgkJCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3Is IEVJTlZBTCwKCQkJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BQ1RJT04sCgkJCQkJCSAgIGFj dGlvbnMsCgkJCQkJCSAgICJhIG5vbnplcm8gUlNTIGVuY2Fwc3VsYXRpb24iCgkJCQkJCSAgICIg bGV2ZWwgaXMgbm90IHN1cHBvcnRlZCIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0KI2Vu ZGlmCgkJCWlmIChwYXJzZXItPnJzc19jb25mLmxldmVsID4gMikgewoJCQkJcnRlX2Zsb3dfZXJy b3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9O LAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAiUlNTIGVuY2Fwc3VsYXRpb24gbGV2ZWwiCgkJ CQkJCSAgICIgPiAxIGlzIG5vdCBzdXBwb3J0ZWQiKTsKCQkJCXJldHVybiAtcnRlX2Vycm5vOwoJ CQl9CgkJCWlmIChyc3MtPnR5cGVzICYgTUxYNV9SU1NfSEZfTUFTSykgewoJCQkJcnRlX2Zsb3df ZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNU SU9OLAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAidW5zdXBwb3J0ZWQgUlNTIHR5cGUiCgkJ CQkJCSAgICIgcmVxdWVzdGVkIik7CgkJCQlyZXR1cm4gLXJ0ZV9lcnJubzsKLS0KCQkJfSBlbHNl IHsKCQkJCXJzc19rZXlfbGVuID0gcnNzX2hhc2hfZGVmYXVsdF9rZXlfbGVuOwoJCQkJcnNzX2tl eSA9IHJzc19oYXNoX2RlZmF1bHRfa2V5OwoJCQl9CgkJCWlmIChyc3Nfa2V5X2xlbiAhPSBSVEVf RElNKHBhcnNlci0+cnNzX2tleSkpIHsKCQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlO VkFMLAoJCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9u cywKCQkJCQkJICAgIlJTUyBoYXNoIGtleSBtdXN0IGJlIgoJCQkJCQkgICAiIGV4YWN0bHkgNDAg Ynl0ZXMgbG9uZyIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0KCQkJaWYgKCFyc3MtPnF1 ZXVlX251bSkgewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAg IFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAi bm8gdmFsaWQgcXVldWVzIik7CgkJCQlyZXR1cm4gLXJ0ZV9lcnJubzsKCQkJfQoJCQlpZiAocnNz LT5xdWV1ZV9udW0gPiBSVEVfRElNKHBhcnNlci0+cXVldWVzKSkgewoJCQkJcnRlX2Zsb3dfZXJy b3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9O LAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAidG9vIG1hbnkgcXVldWVzIGZvciBSU1MiCgkJ CQkJCSAgICIgY29udGV4dCIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0KCQkJZm9yIChu ID0gMDsgbiA8IHJzcy0+cXVldWVfbnVtOyArK24pIHsKCQkJCWlmIChyc3MtPnF1ZXVlW25dID49 IHByaXYtPnJ4cXNfbikgewoJCQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLAoJ CQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJ CQkJICAgInF1ZXVlIGlkID4gbnVtYmVyIG9mIgoJCQkJCQkgICAiIHF1ZXVlcyIpOwoJCQkJCXJl dHVybiAtcnRlX2Vycm5vOwotLQoKCQkJaWYgKG92ZXJsYXAgJiBNQVJLKQoJCQkJZ290byBleGl0 X2FjdGlvbl9vdmVybGFwOwoJCQlvdmVybGFwIHw9IE1BUks7CgkJCWlmICghbWFyaykgewoJCQkJ cnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9S X1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAibWFyayBtdXN0IGJlIGRl ZmluZWQiKTsKCQkJCXJldHVybiAtcnRlX2Vycm5vOwoJCQl9IGVsc2UgaWYgKG1hcmstPmlkID49 IE1MWDVfRkxPV19NQVJLX01BWCkgewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9U U1VQLAoJCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9u cywKCQkJCQkJICAgIm1hcmsgbXVzdCBiZSBiZXR3ZWVuIDAiCgkJCQkJCSAgICIgYW5kIDE2Nzc3 MTk5Iik7CgkJCQlyZXR1cm4gLXJ0ZV9lcnJubzsKLS0KCWlmICghKG92ZXJsYXAgJiBGQVRFKSkK CQlwYXJzZXItPmRyb3AgPSAxOwoJaWYgKHBhcnNlci0+ZHJvcCAmJiBwYXJzZXItPm1hcmspCgkJ cGFyc2VyLT5tYXJrID0gMDsKCWlmICghcGFyc2VyLT5yc3NfY29uZi5xdWV1ZV9udW0gJiYgIXBh cnNlci0+ZHJvcCkgewoJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwgUlRFX0ZM T1dfRVJST1JfVFlQRV9IQU5ETEUsCgkJCQkgICBOVUxMLCAibm8gdmFsaWQgYWN0aW9uIik7CgkJ cmV0dXJuIC1ydGVfZXJybm87Cgl9CglyZXR1cm4gMDsKZXhpdF9hY3Rpb25fbm90X3N1cHBvcnRl ZDoKCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwgUlRFX0ZMT1dfRVJST1JfVFlQ RV9BQ1RJT04sCgkJCSAgIGFjdGlvbnMsICJhY3Rpb24gbm90IHN1cHBvcnRlZCIpOwoJcmV0dXJu IC1ydGVfZXJybm87CmV4aXRfYWN0aW9uX292ZXJsYXA6CglydGVfZmxvd19lcnJvcl9zZXQoZXJy b3IsIEVOT1RTVVAsIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkgICBhY3Rpb25zLCAi b3ZlcmxhcHBpbmcgYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpOwoJcmV0dXJuIC1ydGVfZXJy bm87Cn0KCi8qKgogKiBWYWxpZGF0ZSBpdGVtcy4KICoKICogQHBhcmFtW2luXSBpdGVtcwogKiAg IFBhdHRlcm4gc3BlY2lmaWNhdGlvbiAobGlzdCB0ZXJtaW5hdGVkIGJ5IHRoZSBFTkQgcGF0dGVy biBpdGVtKS4KICogQHBhcmFtW291dF0gZXJyb3IKICogICBQZXJmb3JtIHZlcmJvc2UgZXJyb3Ig cmVwb3J0aW5nIGlmIG5vdCBOVUxMLgogKiBAcGFyYW1baW4sIG91dF0gcGFyc2VyCiAqICAgSW50 ZXJuYWwgcGFyc2VyIHN0cnVjdHVyZS4KICoKICogQHJldHVybgogKiAgIDAgb24gc3VjY2Vzcywg YSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuCiAq LwpzdGF0aWMgaW50Cm1seDVfZmxvd19jb252ZXJ0X2l0ZW1zX3ZhbGlkYXRlKHN0cnVjdCBydGVf ZXRoX2RldiAqZGV2LAoJCQkJIGNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtIGl0ZW1zW10sCgkJ CQkgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvciwKCQkJCSBzdHJ1Y3QgbWx4NV9mbG93X3Bh cnNlICpwYXJzZXIpCnsKCXN0cnVjdCBwcml2ICpwcml2ID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0 ZTsKCWNvbnN0IHN0cnVjdCBtbHg1X2Zsb3dfaXRlbXMgKmN1cl9pdGVtID0gbWx4NV9mbG93X2l0 ZW1zOwoJdW5zaWduZWQgaW50IGk7Ci0tCgkJCQkJICAgICAgY3VyX2l0ZW0tPm1hc2tfc3opOwoJ CWlmIChyZXQpCgkJCWdvdG8gZXhpdF9pdGVtX25vdF9zdXBwb3J0ZWQ7CgkJaWYgKElTX1RVTk5F TChpdGVtcy0+dHlwZSkpIHsKCQkJaWYgKHBhcnNlci0+dHVubmVsKSB7CgkJCQlydGVfZmxvd19l cnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRF TSwKCQkJCQkJICAgaXRlbXMsCgkJCQkJCSAgICJDYW5ub3QgcmVjb2duaXplIG11bHRpcGxlIgoJ CQkJCQkgICAiIHR1bm5lbCBlbmNhcHN1bGF0aW9ucy4iKTsKCQkJCXJldHVybiAtcnRlX2Vycm5v OwoJCQl9CgkJCWlmICghcHJpdi0+Y29uZmlnLnR1bm5lbF9lbiAmJgoJCQkgICAgcGFyc2VyLT5y c3NfY29uZi5sZXZlbCA+IDEpIHsKCQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNV UCwKCQkJCQlSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJCQkJaXRlbXMsCgkJCQkJIlJTUyBv biB0dW5uZWwgaXMgbm90IHN1cHBvcnRlZCIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0K LS0KCQlmb3IgKGkgPSAwOyBpICE9IGhhc2hfcnhxX2luaXRfbjsgKytpKQoJCQlwYXJzZXItPnF1 ZXVlW2ldLm9mZnNldCArPSBzaXplOwoJfQoJcmV0dXJuIDA7CmV4aXRfaXRlbV9ub3Rfc3VwcG9y dGVkOgoJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgLXJldCwgUlRFX0ZMT1dfRVJS T1JfVFlQRV9JVEVNLAoJCQkJICBpdGVtcywgIml0ZW0gbm90IHN1cHBvcnRlZCIpOwp9CgovKioK ICogQWxsb2NhdGUgbWVtb3J5IHNwYWNlIHRvIHN0b3JlIHZlcmJzIGZsb3cgYXR0cmlidXRlcy4K ICoKICogQHBhcmFtW2luXSBzaXplCiAqICAgQW1vdW50IG9mIGJ5dGUgdG8gYWxsb2NhdGUuCiAq IEBwYXJhbVtvdXRdIGVycm9yCiAqICAgUGVyZm9ybSB2ZXJib3NlIGVycm9yIHJlcG9ydGluZyBp ZiBub3QgTlVMTC4KICoKICogQHJldHVybgogKiAgIEEgdmVyYnMgZmxvdyBhdHRyaWJ1dGUgb24g c3VjY2VzcywgTlVMTCBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuCiAqLwpzdGF0aWMg c3RydWN0IGlidl9mbG93X2F0dHIgKgptbHg1X2Zsb3dfY29udmVydF9hbGxvY2F0ZSh1bnNpZ25l ZCBpbnQgc2l6ZSwgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvcikKewoJc3RydWN0IGlidl9m bG93X2F0dHIgKmlidl9hdHRyOwoKCWlidl9hdHRyID0gcnRlX2NhbGxvYyhfX2Z1bmNfXywgMSwg c2l6ZSwgMCk7CglpZiAoIWlidl9hdHRyKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBF Tk9NRU0sCgkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVELAoJCQkJICAgTlVM TCwKCQkJCSAgICJjYW5ub3QgYWxsb2NhdGUgdmVyYnMgc3BlYyBhdHRyaWJ1dGVzIik7CgkJcmV0 dXJuIE5VTEw7Cgl9Ci0tCiAqICAgRmxvdyBydWxlIGF0dHJpYnV0ZXMuCiAqIEBwYXJhbVtpbl0g cGF0dGVybgogKiAgIFBhdHRlcm4gc3BlY2lmaWNhdGlvbiAobGlzdCB0ZXJtaW5hdGVkIGJ5IHRo ZSBFTkQgcGF0dGVybiBpdGVtKS4KICogQHBhcmFtW2luXSBhY3Rpb25zCiAqICAgQXNzb2NpYXRl ZCBhY3Rpb25zIChsaXN0IHRlcm1pbmF0ZWQgYnkgdGhlIEVORCBhY3Rpb24pLgogKiBAcGFyYW1b b3V0XSBlcnJvcgogKiAgIFBlcmZvcm0gdmVyYm9zZSBlcnJvciByZXBvcnRpbmcgaWYgbm90IE5V TEwuCiAqIEBwYXJhbVtpbiwgb3V0XSBwYXJzZXIKICogICBJbnRlcm5hbCBwYXJzZXIgc3RydWN0 dXJlLgogKgogKiBAcmV0dXJuCiAqICAgMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZh bHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNldC4KLS0Kc3RhdGljIGludAptbHg1X2Zs b3dfY29udmVydChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwKCQkgIGNvbnN0IHN0cnVjdCBydGVf Zmxvd19hdHRyICphdHRyLAoJCSAgY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW0gaXRlbXNbXSwK CQkgIGNvbnN0IHN0cnVjdCBydGVfZmxvd19hY3Rpb24gYWN0aW9uc1tdLAoJCSAgc3RydWN0IHJ0 ZV9mbG93X2Vycm9yICplcnJvciwKCQkgIHN0cnVjdCBtbHg1X2Zsb3dfcGFyc2UgKnBhcnNlcikK ewoJY29uc3Qgc3RydWN0IG1seDVfZmxvd19pdGVtcyAqY3VyX2l0ZW0gPSBtbHg1X2Zsb3dfaXRl bXM7Cgl1bnNpZ25lZCBpbnQgaTsKCWludCByZXQ7Ci0tCgkqcGFyc2VyID0gKHN0cnVjdCBtbHg1 X2Zsb3dfcGFyc2UpewoJCS5jcmVhdGUgPSBwYXJzZXItPmNyZWF0ZSwKCQkubGF5ZXIgPSBIQVNI X1JYUV9FVEgsCgkJLm1hcmtfaWQgPSBNTFg1X0ZMT1dfTUFSS19ERUZBVUxULAoJfTsKCXJldCA9 IG1seDVfZmxvd19jb252ZXJ0X2F0dHJpYnV0ZXMoYXR0ciwgZXJyb3IpOwoJaWYgKHJldCkKCQly ZXR1cm4gcmV0OwoJcmV0ID0gbWx4NV9mbG93X2NvbnZlcnRfYWN0aW9ucyhkZXYsIGFjdGlvbnMs IGVycm9yLCBwYXJzZXIpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoJcmV0ID0gbWx4NV9mbG93 X2NvbnZlcnRfaXRlbXNfdmFsaWRhdGUoZGV2LCBpdGVtcywgZXJyb3IsIHBhcnNlcik7CglpZiAo cmV0KQoJCXJldHVybiByZXQ7CgltbHg1X2Zsb3dfY29udmVydF9maW5hbGlzZShwYXJzZXIpOwoJ LyoKCSAqIFNlY29uZCBzdGVwLgotLQoJICovCglpZiAocGFyc2VyLT5kcm9wKSB7CgkJdW5zaWdu ZWQgaW50IG9mZnNldCA9IHBhcnNlci0+cXVldWVbSEFTSF9SWFFfRVRIXS5vZmZzZXQ7CgoJCXBh cnNlci0+cXVldWVbSEFTSF9SWFFfRVRIXS5pYnZfYXR0ciA9CgkJCW1seDVfZmxvd19jb252ZXJ0 X2FsbG9jYXRlKG9mZnNldCwgZXJyb3IpOwoJCWlmICghcGFyc2VyLT5xdWV1ZVtIQVNIX1JYUV9F VEhdLmlidl9hdHRyKQoJCQlnb3RvIGV4aXRfZW5vbWVtOwoJCXBhcnNlci0+cXVldWVbSEFTSF9S WFFfRVRIXS5vZmZzZXQgPQoJCQlzaXplb2Yoc3RydWN0IGlidl9mbG93X2F0dHIpOwoJfSBlbHNl IHsKCQlmb3IgKGkgPSAwOyBpICE9IGhhc2hfcnhxX2luaXRfbjsgKytpKSB7CgkJCXVuc2lnbmVk IGludCBvZmZzZXQ7CgoJCQlvZmZzZXQgPSBwYXJzZXItPnF1ZXVlW2ldLm9mZnNldDsKCQkJcGFy c2VyLT5xdWV1ZVtpXS5pYnZfYXR0ciA9CgkJCQltbHg1X2Zsb3dfY29udmVydF9hbGxvY2F0ZShv ZmZzZXQsIGVycm9yKTsKCQkJaWYgKCFwYXJzZXItPnF1ZXVlW2ldLmlidl9hdHRyKQoJCQkJZ290 byBleGl0X2Vub21lbTsKCQkJcGFyc2VyLT5xdWV1ZVtpXS5vZmZzZXQgPSBzaXplb2Yoc3RydWN0 IGlidl9mbG93X2F0dHIpOwoJCX0KCX0KLS0KCXBhcnNlci0+bGF5ZXIgPSBIQVNIX1JYUV9FVEg7 Cglmb3IgKDsgaXRlbXMtPnR5cGUgIT0gUlRFX0ZMT1dfSVRFTV9UWVBFX0VORDsgKytpdGVtcykg ewoJCXN0cnVjdCBtbHg1X2Zsb3dfZGF0YSBkYXRhID0gewoJCQkuZGV2ID0gZGV2LAoJCQkucGFy c2VyID0gcGFyc2VyLAoJCQkuZXJyb3IgPSBlcnJvciwKCQl9OwoKCQlpZiAoaXRlbXMtPnR5cGUg PT0gUlRFX0ZMT1dfSVRFTV9UWVBFX1ZPSUQpCgkJCWNvbnRpbnVlOwoJCWN1cl9pdGVtID0gJm1s eDVfZmxvd19pdGVtc1tpdGVtcy0+dHlwZV07Ci0tCglpZiAocGFyc2VyLT5tYXJrKQoJCW1seDVf Zmxvd19jcmVhdGVfZmxhZ19tYXJrKHBhcnNlciwgcGFyc2VyLT5tYXJrX2lkKTsKCWlmIChwYXJz ZXItPmNvdW50ICYmIHBhcnNlci0+Y3JlYXRlKSB7CgkJbWx4NV9mbG93X2NyZWF0ZV9jb3VudChk ZXYsIHBhcnNlcik7CgkJaWYgKCFwYXJzZXItPmNzKQoJCQlnb3RvIGV4aXRfY291bnRfZXJyb3I7 Cgl9CmV4aXRfZnJlZToKCS8qIE9ubHkgdmVyaWZpY2F0aW9uIGlzIGV4cGVjdGVkLCBhbGwgcmVz b3VyY2VzIHNob3VsZCBiZSByZWxlYXNlZC4gKi8KCWlmICghcGFyc2VyLT5jcmVhdGUpIHsKCQlm b3IgKGkgPSAwOyBpICE9IGhhc2hfcnhxX2luaXRfbjsgKytpKSB7Ci0tCgkJaWYgKHBhcnNlci0+ cXVldWVbaV0uaWJ2X2F0dHIpIHsKCQkJcnRlX2ZyZWUocGFyc2VyLT5xdWV1ZVtpXS5pYnZfYXR0 cik7CgkJCXBhcnNlci0+cXVldWVbaV0uaWJ2X2F0dHIgPSBOVUxMOwoJCX0KCX0KCXJ0ZV9mbG93 X2Vycm9yX3NldChlcnJvciwgRU5PTUVNLCBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVE LAoJCQkgICBOVUxMLCAiY2Fubm90IGFsbG9jYXRlIHZlcmJzIHNwZWMgYXR0cmlidXRlcyIpOwoJ cmV0dXJuIC1ydGVfZXJybm87CmV4aXRfY291bnRfZXJyb3I6CglydGVfZmxvd19lcnJvcl9zZXQo ZXJyb3IsIEVJTlZBTCwgUlRFX0ZMT1dfRVJST1JfVFlQRV9VTlNQRUNJRklFRCwKCQkJICAgTlVM TCwgImNhbm5vdCBjcmVhdGUgY291bnRlciIpOwoJcmV0dXJuIC1ydGVfZXJybm87Cn0KCi8qKgot LQoJCQkvKgoJCQkgKiBGcm9tIHZlcmJzIHBlcnNwZWN0aXZlIGFuIGVtcHR5IFZMQU4gaXMgZXF1 aXZhbGVudAoJCQkgKiB0byBhIHBhY2tldCB3aXRob3V0IFZMQU4gbGF5ZXIuCgkJCSAqLwoJCQlp ZiAoIWV0aC0+bWFzay52bGFuX3RhZykKCQkJCWdvdG8gZXJyb3I7CgkJCS8qIE91dGVyIFRQSUQg Y2Fubm90IGJlIG1hdGNoZWQuICovCgkJCWlmIChldGgtPm1hc2suZXRoZXJfdHlwZSkgewoJCQkJ bXNnID0gIlZMQU4gVFBJRCBtYXRjaGluZyBpcyBub3Qgc3VwcG9ydGVkIjsKCQkJCWdvdG8gZXJy b3I7CgkJCX0KCQkJZXRoLT52YWwuZXRoZXJfdHlwZSA9IHNwZWMtPmlubmVyX3R5cGU7CgkJCWV0 aC0+bWFzay5ldGhlcl90eXBlID0gbWFzay0+aW5uZXJfdHlwZTsKCQkJZXRoLT52YWwuZXRoZXJf dHlwZSAmPSBldGgtPm1hc2suZXRoZXJfdHlwZTsKCQl9CgkJcmV0dXJuIDA7Cgl9CmVycm9yOgoJ cmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChkYXRhLT5lcnJvciwgRUlOVkFMLCBSVEVfRkxPV19F UlJPUl9UWVBFX0lURU0sCgkJCQkgIGl0ZW0sIG1zZyk7Cn0KCi8qKgogKiBDb252ZXJ0IElQdjQg aXRlbSB0byBWZXJicyBzcGVjaWZpY2F0aW9uLgotLQoJfTsKCglpZiAocGFyc2VyLT5sYXllciA9 PSBIQVNIX1JYUV9UVU5ORUwgJiYKCSAgICBwYXJzZXItPnR1bm5lbCA9PSBwdHlwZV9leHRbUFRZ UEVfSURYKFJURV9QVFlQRV9UVU5ORUxfVlhMQU4pXSAmJgoJICAgICFwcml2LT5jb25maWcubDNf dnhsYW5fZW4pCgkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChkYXRhLT5lcnJvciwgRUlOVkFM LAoJCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLAoJCQkJCSAgaXRlbSwKCQkJCQkgICJM MyBWWExBTiBub3QgZW5hYmxlZCBieSBkZXZpY2UiCgkJCQkJICAiIHBhcmFtZXRlciBhbmQvb3Ig bm90IGNvbmZpZ3VyZWQiCgkJCQkJICAiIGluIGZpcm13YXJlIik7Ci0tCgl9OwoKCWlmIChwYXJz ZXItPmxheWVyID09IEhBU0hfUlhRX1RVTk5FTCAmJgoJICAgIHBhcnNlci0+dHVubmVsID09IHB0 eXBlX2V4dFtQVFlQRV9JRFgoUlRFX1BUWVBFX1RVTk5FTF9WWExBTildICYmCgkgICAgIXByaXYt PmNvbmZpZy5sM192eGxhbl9lbikKCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGRhdGEtPmVy cm9yLCBFSU5WQUwsCgkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJCQkJICBpdGVt LAoJCQkJCSAgIkwzIFZYTEFOIG5vdCBlbmFibGVkIGJ5IGRldmljZSIKCQkJCQkgICIgcGFyYW1l dGVyIGFuZC9vciBub3QgY29uZmlndXJlZCIKCQkJCQkgICIgaW4gZmlybXdhcmUiKTsKLS0KCSAq IGJlZm9yZSB3aWxsIGFsc28gbWF0Y2ggdGhpcyBydWxlLgoJICogVG8gYXZvaWQgc3VjaCBzaXR1 YXRpb24sIFZOSSAwIGlzIGN1cnJlbnRseSByZWZ1c2VkLgoJICovCgkvKiBPbmx5IGFsbG93IHR1 bm5lbCB3L28gdHVubmVsIGlkIHBhdHRlcm4gYWZ0ZXIgcHJvcGVyIG91dGVyIHNwZWMuICovCglp ZiAocGFyc2VyLT5vdXRfbGF5ZXIgPT0gSEFTSF9SWFFfRVRIICYmICF2eGxhbi52YWwudHVubmVs X2lkKQoJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZGF0YS0+ZXJyb3IsIEVJTlZBTCwKCQkJ CQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwKCQkJCQkgIGl0ZW0sCgkJCQkJICAiVnhMQU4g dm5pIGNhbm5vdCBiZSAwIik7CgltbHg1X2Zsb3dfY3JlYXRlX2NvcHkocGFyc2VyLCAmdnhsYW4s IHNpemUpOwoJcmV0dXJuIDA7Ci0tCgkJdWludDMyX3Qgdmxhbl9pZDsKCQl1aW50OF90IHZuaVs0 XTsKCX0gaWQ7CgoJaWYgKCFwcml2LT5jb25maWcubDNfdnhsYW5fZW4pCgkJcmV0dXJuIHJ0ZV9m bG93X2Vycm9yX3NldChkYXRhLT5lcnJvciwgRUlOVkFMLAoJCQkJCSAgUlRFX0ZMT1dfRVJST1Jf VFlQRV9JVEVNLAoJCQkJCSAgaXRlbSwKCQkJCQkgICJMMyBWWExBTiBub3QgZW5hYmxlZCBieSBk ZXZpY2UiCgkJCQkJICAiIHBhcmFtZXRlciBhbmQvb3Igbm90IGNvbmZpZ3VyZWQiCgkJCQkJICAi IGluIGZpcm13YXJlIik7Ci0tCgkJbWVtY3B5KCZpZC52bmlbMV0sIHNwZWMtPnZuaSwgMyk7CgkJ dnhsYW4udmFsLnR1bm5lbF9pZCA9IGlkLnZsYW5faWQ7CgkJbWVtY3B5KCZpZC52bmlbMV0sIG1h c2stPnZuaSwgMyk7CgkJdnhsYW4ubWFzay50dW5uZWxfaWQgPSBpZC52bGFuX2lkOwoJCWlmIChz cGVjLT5wcm90b2NvbCkKCQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChkYXRhLT5lcnJvciwg RUlOVkFMLAoJCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwKCQkJCQkJICBpdGVtLAoJ CQkJCQkgICJWeExBTi1HUEUgcHJvdG9jb2wgbm90IgoJCQkJCQkgICIgc3VwcG9ydGVkIik7CgkJ LyogUmVtb3ZlIHVud2FudGVkIGJpdHMgZnJvbSB2YWx1ZXMuICovCi0tCgkgKiBiZWZvcmUgd2ls bCBhbHNvIG1hdGNoIHRoaXMgcnVsZS4KCSAqIFRvIGF2b2lkIHN1Y2ggc2l0dWF0aW9uLCBWTkkg MCBpcyBjdXJyZW50bHkgcmVmdXNlZC4KCSAqLwoJLyogT25seSBhbGxvdyB0dW5uZWwgdy9vIHR1 bm5lbCBpZCBwYXR0ZXJuIGFmdGVyIHByb3BlciBvdXRlciBzcGVjLiAqLwoJaWYgKHBhcnNlci0+ b3V0X2xheWVyID09IEhBU0hfUlhRX0VUSCAmJiAhdnhsYW4udmFsLnR1bm5lbF9pZCkKCQlyZXR1 cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGRhdGEtPmVycm9yLCBFSU5WQUwsCgkJCQkJICBSVEVfRkxP V19FUlJPUl9UWVBFX0lURU0sCgkJCQkJICBpdGVtLAoJCQkJCSAgIlZ4TEFOLUdQRSB2bmkgY2Fu bm90IGJlIDAiKTsKCW1seDVfZmxvd19jcmVhdGVfY29weShwYXJzZXIsICZ2eGxhbiwgc2l6ZSk7 CglyZXR1cm4gMDsKLS0KCQkJaXB2Ni0+dmFsLm5leHRfaGRyID0gTUxYNV9HUkU7CgkJCWlwdjYt Pm1hc2submV4dF9oZHIgPSAweGZmOwoJCX0KCX0KCWlmIChpICE9IGhhc2hfcnhxX2luaXRfbikK CQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGRhdGEtPmVycm9yLCBFSU5WQUwsCgkJCQkJICBS VEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJCQkJICBpdGVtLAoJCQkJCSAgIklQIHByb3RvY29s IG9mIEdSRSBtdXN0IGJlIDQ3Iik7CgltbHg1X2Zsb3dfY3JlYXRlX2NvcHkocGFyc2VyLCAmdHVu bmVsLCBzaXplKTsKCXJldHVybiAwOwotLQogKiAgIFBvaW50ZXIgdG8gRXRoZXJuZXQgZGV2aWNl LgogKiBAcGFyYW0gcGFyc2VyCiAqICAgSW50ZXJuYWwgcGFyc2VyIHN0cnVjdHVyZS4KICogQHBh cmFtIGZsb3cKICogICBQb2ludGVyIHRvIHRoZSBydGVfZmxvdy4KICogQHBhcmFtW291dF0gZXJy b3IKICogICBQZXJmb3JtIHZlcmJvc2UgZXJyb3IgcmVwb3J0aW5nIGlmIG5vdCBOVUxMLgogKgog KiBAcmV0dXJuCiAqICAgMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVy d2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNldC4KICovCnN0YXRpYyBpbnQKbWx4NV9mbG93X2NyZWF0 ZV9hY3Rpb25fcXVldWVfZHJvcChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwKCQkJCSAgIHN0cnVj dCBtbHg1X2Zsb3dfcGFyc2UgKnBhcnNlciwKCQkJCSAgIHN0cnVjdCBydGVfZmxvdyAqZmxvdywK CQkJCSAgIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IpCnsKCXN0cnVjdCBwcml2ICpwcml2 ID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBpYnZfZmxvd19zcGVjX2FjdGlvbl9k cm9wICpkcm9wOwoJdW5zaWduZWQgaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IGlidl9mbG93X3Nw ZWNfYWN0aW9uX2Ryb3ApOwoKLS0KCXBhcnNlci0+cXVldWVbSEFTSF9SWFFfRVRIXS5pYnZfYXR0 ciA9IE5VTEw7CglmbG93LT5mcnhxW0hBU0hfUlhRX0VUSF0uaWJ2X2Zsb3cgPQoJCW1seDVfZ2x1 ZS0+Y3JlYXRlX2Zsb3cocHJpdi0+Zmxvd19kcm9wX3F1ZXVlLT5xcCwKCQkJCSAgICAgICBmbG93 LT5mcnhxW0hBU0hfUlhRX0VUSF0uaWJ2X2F0dHIpOwoJaWYgKCFmbG93LT5mcnhxW0hBU0hfUlhR X0VUSF0uaWJ2X2Zsb3cpIHsKCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT01FTSwgUlRF X0ZMT1dfRVJST1JfVFlQRV9IQU5ETEUsCgkJCQkgICBOVUxMLCAiZmxvdyBydWxlIGNyZWF0aW9u IGZhaWx1cmUiKTsKCQlnb3RvIGVycm9yOwoJfQoJcmV0dXJuIDA7CmVycm9yOgoJYXNzZXJ0KGZs b3cpOwoJaWYgKGZsb3ctPmZyeHFbSEFTSF9SWFFfRVRIXS5pYnZfZmxvdykgewoJCWNsYWltX3pl cm8obWx4NV9nbHVlLT5kZXN0cm95X2Zsb3cKCQkJICAgKGZsb3ctPmZyeHFbSEFTSF9SWFFfRVRI XS5pYnZfZmxvdykpOwoJCWZsb3ctPmZyeHFbSEFTSF9SWFFfRVRIXS5pYnZfZmxvdyA9IE5VTEw7 Ci0tCiAqICAgUG9pbnRlciB0byBFdGhlcm5ldCBkZXZpY2UuCiAqIEBwYXJhbSBwYXJzZXIKICog ICBJbnRlcm5hbCBwYXJzZXIgc3RydWN0dXJlLgogKiBAcGFyYW0gZmxvdwogKiAgIFBvaW50ZXIg dG8gdGhlIHJ0ZV9mbG93LgogKiBAcGFyYW1bb3V0XSBlcnJvcgogKiAgIFBlcmZvcm0gdmVyYm9z ZSBlcnJvciByZXBvcnRpbmcgaWYgbm90IE5VTEwuCiAqCiAqIEByZXR1cm4KICogICAwIG9uIHN1 Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3aXNlIGFuZCBydGVfZXJybm8gaXMg c2V0LgogKi8Kc3RhdGljIGludAptbHg1X2Zsb3dfY3JlYXRlX2FjdGlvbl9xdWV1ZV9yc3Moc3Ry dWN0IHJ0ZV9ldGhfZGV2ICpkZXYsCgkJCQkgIHN0cnVjdCBtbHg1X2Zsb3dfcGFyc2UgKnBhcnNl ciwKCQkJCSAgc3RydWN0IHJ0ZV9mbG93ICpmbG93LAoJCQkJICBzdHJ1Y3QgcnRlX2Zsb3dfZXJy b3IgKmVycm9yKQp7Cgl1bnNpZ25lZCBpbnQgaTsKCglmb3IgKGkgPSAwOyBpICE9IGhhc2hfcnhx X2luaXRfbjsgKytpKSB7CgkJaWYgKCFwYXJzZXItPnF1ZXVlW2ldLmlidl9hdHRyKQotLQoJCQkJ ICAgICAgcGFyc2VyLT5yc3NfY29uZi5xdWV1ZSwKCQkJCSAgICAgIHBhcnNlci0+cnNzX2NvbmYu cXVldWVfbnVtLAoJCQkJICAgICAgcGFyc2VyLT50dW5uZWwsCgkJCQkgICAgICBwYXJzZXItPnJz c19jb25mLmxldmVsKTsKCQlpZiAoIWZsb3ctPmZyeHFbaV0uaHJ4cSkgewoJCQlyZXR1cm4gcnRl X2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9NRU0sCgkJCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQ RV9IQU5ETEUsCgkJCQkJCSAgTlVMTCwKCQkJCQkJICAiY2Fubm90IGNyZWF0ZSBoYXNoIHJ4cSIp OwoJCX0KCX0KLS0KICogICBQb2ludGVyIHRvIEV0aGVybmV0IGRldmljZS4KICogQHBhcmFtIHBh cnNlcgogKiAgIEludGVybmFsIHBhcnNlciBzdHJ1Y3R1cmUuCiAqIEBwYXJhbSBmbG93CiAqICAg UG9pbnRlciB0byB0aGUgcnRlX2Zsb3cuCiAqIEBwYXJhbVtvdXRdIGVycm9yCiAqICAgUGVyZm9y bSB2ZXJib3NlIGVycm9yIHJlcG9ydGluZyBpZiBub3QgTlVMTC4KICoKICogQHJldHVybgogKiAg IDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvdGhlcndpc2UgYW5kIHJ0ZV9l cnJubyBpcyBzZXQuCiAqLwpzdGF0aWMgaW50Cm1seDVfZmxvd19jcmVhdGVfYWN0aW9uX3F1ZXVl KHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LAoJCQkgICAgICBzdHJ1Y3QgbWx4NV9mbG93X3BhcnNl ICpwYXJzZXIsCgkJCSAgICAgIHN0cnVjdCBydGVfZmxvdyAqZmxvdywKCQkJICAgICAgc3RydWN0 IHJ0ZV9mbG93X2Vycm9yICplcnJvcikKewoJc3RydWN0IHByaXYgKnByaXYgX19ydGVfdW51c2Vk ID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsKCWludCByZXQ7Cgl1bnNpZ25lZCBpbnQgaTsKCXVu c2lnbmVkIGludCBmbG93c19uID0gMDsKCglhc3NlcnQocHJpdi0+cGQpOwoJYXNzZXJ0KHByaXYt PmN0eCk7Cglhc3NlcnQoIXBhcnNlci0+ZHJvcCk7CglyZXQgPSBtbHg1X2Zsb3dfY3JlYXRlX2Fj dGlvbl9xdWV1ZV9yc3MoZGV2LCBwYXJzZXIsIGZsb3csIGVycm9yKTsKCWlmIChyZXQpCgkJZ290 byBlcnJvcjsKCWlmIChwYXJzZXItPmNvdW50KQoJCWZsb3ctPmNzID0gcGFyc2VyLT5jczsKCWlm ICghZGV2LT5kYXRhLT5kZXZfc3RhcnRlZCkKCQlyZXR1cm4gMDsKCWZvciAoaSA9IDA7IGkgIT0g aGFzaF9yeHFfaW5pdF9uOyArK2kpIHsKLS0KCQlmbG93LT5mcnhxW2ldLmlidl9mbG93ID0KCQkJ bWx4NV9nbHVlLT5jcmVhdGVfZmxvdyhmbG93LT5mcnhxW2ldLmhyeHEtPnFwLAoJCQkJCSAgICAg ICBmbG93LT5mcnhxW2ldLmlidl9hdHRyKTsKCQltbHg1X2Zsb3dfZHVtcChkZXYsIGZsb3csIGkp OwoJCWlmICghZmxvdy0+ZnJ4cVtpXS5pYnZfZmxvdykgewoJCQlydGVfZmxvd19lcnJvcl9zZXQo ZXJyb3IsIEVOT01FTSwKCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0hBTkRMRSwKCQkJCQkg ICBOVUxMLCAiZmxvdyBydWxlIGNyZWF0aW9uIGZhaWx1cmUiKTsKCQkJZ290byBlcnJvcjsKCQl9 CgkJKytmbG93c19uOwoJfQoJaWYgKCFmbG93c19uKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVy cm9yLCBFSU5WQUwsIFJURV9GTE9XX0VSUk9SX1RZUEVfSEFORExFLAoJCQkJICAgTlVMTCwgImlu dGVybmFsIGVycm9yIGluIGZsb3cgY3JlYXRpb24iKTsKCQlnb3RvIGVycm9yOwoJfQoJbWx4NV9m bG93X2NyZWF0ZV91cGRhdGVfcnhxcyhkZXYsIGZsb3cpOwoJcmV0dXJuIDA7CmVycm9yOgoJcmV0 ID0gcnRlX2Vycm5vOyAvKiBTYXZlIHJ0ZV9lcnJubyBiZWZvcmUgY2xlYW51cC4gKi8KCWFzc2Vy dChmbG93KTsKCWZvciAoaSA9IDA7IGkgIT0gaGFzaF9yeHFfaW5pdF9uOyArK2kpIHsKCQlpZiAo Zmxvdy0+ZnJ4cVtpXS5pYnZfZmxvdykgewoJCQlzdHJ1Y3QgaWJ2X2Zsb3cgKmlidl9mbG93ID0g Zmxvdy0+ZnJ4cVtpXS5pYnZfZmxvdzsKLS0KfQoKLyoqCiAqIENvbnZlcnQgYSBmbG93LgoKZXJy b3I6IHBhdGNoIGZhaWxlZDogZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zsb3cuYzozMQplcnJvcjog ZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zsb3cuYzogcGF0Y2ggZG9lcyBub3QgYXBwbHkKKlJlcG86 IGRwZGstbmV4dC12aXJ0aW8KQ2hlY2tpbmcgcGF0Y2ggZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zs b3cuYy4uLgplcnJvcjogd2hpbGUgc2VhcmNoaW5nIGZvcjoKI2luY2x1ZGUgIm1seDVfcHJtLmgi CiNpbmNsdWRlICJtbHg1X2dsdWUuaCIKCi8qIEZsb3cgcHJpb3JpdHkgZm9yIGNvbnRyb2wgcGxh bmUgZmxvd3MuICovCiNkZWZpbmUgTUxYNV9DVFJMX0ZMT1dfUFJJT1JJVFkgMQotLQoKLyoqIFN0 cnVjdHVyZSBnaXZlIHRvIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gKi8Kc3RydWN0IG1seDVf Zmxvd19kYXRhIHsKCXN0cnVjdCBydGVfZXRoX2RldiAqZGV2OyAvKiogRXRoZXJuZXQgZGV2aWNl LiAqLwoJc3RydWN0IG1seDVfZmxvd19wYXJzZSAqcGFyc2VyOyAvKiogUGFyc2VyIGNvbnRleHQu ICovCglzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yOyAvKiogRXJyb3IgY29udGV4dC4gKi8K fTsKCnN0YXRpYyBpbnQKbWx4NV9mbG93X2NyZWF0ZV9ldGgoY29uc3Qgc3RydWN0IHJ0ZV9mbG93 X2l0ZW0gKml0ZW0sCgkJICAgICBjb25zdCB2b2lkICpkZWZhdWx0X21hc2ssCi0tCgljb25zdCB1 aW50OF90ICpzcGVjID0gaXRlbS0+c3BlYzsKCWNvbnN0IHVpbnQ4X3QgKmxhc3QgPSBpdGVtLT5s YXN0OwoJY29uc3QgdWludDhfdCAqbSA9IGl0ZW0tPm1hc2sgPyBpdGVtLT5tYXNrIDogbWFzazsK CglpZiAoIXNwZWMgJiYgKGl0ZW0tPm1hc2sgfHwgbGFzdCkpCgkJZ290byBlcnJvcjsKCWlmICgh c3BlYykKCQlyZXR1cm4gMDsKCS8qCgkgKiBTaW5nbGUtcGFzcyBjaGVjayB0byBtYWtlIHN1cmUg dGhhdDoKCSAqIC0gaXRlbS0+bWFzayBpcyBzdXBwb3J0ZWQsIG5vIGJpdHMgYXJlIHNldCBvdXRz aWRlIG1hc2suCi0tCgkgKi8KCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQlpZiAoIW1b aV0pCgkJCWNvbnRpbnVlOwoJCWlmICgobVtpXSB8IG1hc2tbaV0pICE9IG1hc2tbaV0pCgkJCWdv dG8gZXJyb3I7CgkJaWYgKGxhc3QgJiYgKChzcGVjW2ldICYgbVtpXSkgIT0gKGxhc3RbaV0gJiBt W2ldKSkpCgkJCWdvdG8gZXJyb3I7Cgl9CglyZXR1cm4gMDsKZXJyb3I6CglydGVfZXJybm8gPSBF Tk9UU1VQOwoJcmV0dXJuIC1ydGVfZXJybm87Cn0KCi8qKgogKiBFeHRyYWN0IGF0dHJpYnV0ZSB0 byB0aGUgcGFyc2VyLgogKgogKiBAcGFyYW1baW5dIGF0dHIKICogICBGbG93IHJ1bGUgYXR0cmli dXRlcy4KICogQHBhcmFtW291dF0gZXJyb3IKICogICBQZXJmb3JtIHZlcmJvc2UgZXJyb3IgcmVw b3J0aW5nIGlmIG5vdCBOVUxMLgogKgogKiBAcmV0dXJuCiAqICAgMCBvbiBzdWNjZXNzLCBhIG5l Z2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNldC4KICovCnN0 YXRpYyBpbnQKbWx4NV9mbG93X2NvbnZlcnRfYXR0cmlidXRlcyhjb25zdCBzdHJ1Y3QgcnRlX2Zs b3dfYXR0ciAqYXR0ciwKCQkJICAgICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQp7Cglp ZiAoYXR0ci0+Z3JvdXApIHsKCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsCgkJ CQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FUVFJfR1JPVVAsCgkJCQkgICBOVUxMLAoJCQkJICAg Imdyb3VwcyBhcmUgbm90IHN1cHBvcnRlZCIpOwoJCXJldHVybiAtcnRlX2Vycm5vOwoJfQoJaWYg KGF0dHItPnByaW9yaXR5ICYmIGF0dHItPnByaW9yaXR5ICE9IE1MWDVfQ1RSTF9GTE9XX1BSSU9S SVRZKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLAoJCQkJICAgUlRFX0ZM T1dfRVJST1JfVFlQRV9BVFRSX1BSSU9SSVRZLAoJCQkJICAgTlVMTCwKCQkJCSAgICJwcmlvcml0 aWVzIGFyZSBub3Qgc3VwcG9ydGVkIik7CgkJcmV0dXJuIC1ydGVfZXJybm87Cgl9CglpZiAoYXR0 ci0+ZWdyZXNzKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLAoJCQkJICAg UlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRSX0VHUkVTUywKCQkJCSAgIE5VTEwsCgkJCQkgICAiZWdy ZXNzIGlzIG5vdCBzdXBwb3J0ZWQiKTsKCQlyZXR1cm4gLXJ0ZV9lcnJubzsKCX0KCWlmIChhdHRy LT50cmFuc2ZlcikgewoJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwKCQkJCSAg IFJURV9GTE9XX0VSUk9SX1RZUEVfQVRUUl9UUkFOU0ZFUiwKCQkJCSAgIE5VTEwsCgkJCQkgICAi dHJhbnNmZXIgaXMgbm90IHN1cHBvcnRlZCIpOwoJCXJldHVybiAtcnRlX2Vycm5vOwoJfQoJaWYg KCFhdHRyLT5pbmdyZXNzKSB7CgkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLAoJ CQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRSX0lOR1JFU1MsCgkJCQkgICBOVUxMLAoJCQkJ ICAgIm9ubHkgaW5ncmVzcyBpcyBzdXBwb3J0ZWQiKTsKCQlyZXR1cm4gLXJ0ZV9lcnJubzsKCX0K LS0KICoKICogQHBhcmFtIGRldgogKiAgIFBvaW50ZXIgdG8gRXRoZXJuZXQgZGV2aWNlLgogKiBA cGFyYW1baW5dIGFjdGlvbnMKICogICBBc3NvY2lhdGVkIGFjdGlvbnMgKGxpc3QgdGVybWluYXRl ZCBieSB0aGUgRU5EIGFjdGlvbikuCiAqIEBwYXJhbVtvdXRdIGVycm9yCiAqICAgUGVyZm9ybSB2 ZXJib3NlIGVycm9yIHJlcG9ydGluZyBpZiBub3QgTlVMTC4KICogQHBhcmFtW2luLCBvdXRdIHBh cnNlcgogKiAgIEludGVybmFsIHBhcnNlciBzdHJ1Y3R1cmUuCiAqCiAqIEByZXR1cm4KICogICAw IG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3aXNlIGFuZCBydGVfZXJy bm8gaXMgc2V0LgogKi8Kc3RhdGljIGludAptbHg1X2Zsb3dfY29udmVydF9hY3Rpb25zKHN0cnVj dCBydGVfZXRoX2RldiAqZGV2LAoJCQkgIGNvbnN0IHN0cnVjdCBydGVfZmxvd19hY3Rpb24gYWN0 aW9uc1tdLAoJCQkgIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IsCgkJCSAgc3RydWN0IG1s eDVfZmxvd19wYXJzZSAqcGFyc2VyKQp7CgllbnVtIHsgRkFURSA9IDEsIE1BUksgPSAyLCBDT1VO VCA9IDQsIH07Cgl1aW50MzJfdCBvdmVybGFwID0gMDsKCXN0cnVjdCBwcml2ICpwcml2ID0gZGV2 LT5kYXRhLT5kZXZfcHJpdmF0ZTsKLS0KCQkJaWYgKG92ZXJsYXAgJiBGQVRFKQoJCQkJZ290byBl eGl0X2FjdGlvbl9vdmVybGFwOwoJCQlvdmVybGFwIHw9IEZBVEU7CgkJCWlmIChyc3MtPmZ1bmMg JiYKCQkJICAgIHJzcy0+ZnVuYyAhPSBSVEVfRVRIX0hBU0hfRlVOQ1RJT05fVE9FUExJVFopIHsK CQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLAoJCQkJCQkgICBSVEVfRkxPV19F UlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgInRoZSBvbmx5IHN1 cHBvcnRlZCBSU1MgaGFzaCIKCQkJCQkJICAgIiBmdW5jdGlvbiBpcyBUb2VwbGl0eiIpOwoJCQkJ cmV0dXJuIC1ydGVfZXJybm87CgkJCX0KI2lmbmRlZiBIQVZFX0lCVl9ERVZJQ0VfVFVOTkVMX1NV UFBPUlQKCQkJaWYgKHBhcnNlci0+cnNzX2NvbmYubGV2ZWwgPiAxKSB7CgkJCQlydGVfZmxvd19l cnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwKCQkJCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BQ1RJ T04sCgkJCQkJCSAgIGFjdGlvbnMsCgkJCQkJCSAgICJhIG5vbnplcm8gUlNTIGVuY2Fwc3VsYXRp b24iCgkJCQkJCSAgICIgbGV2ZWwgaXMgbm90IHN1cHBvcnRlZCIpOwoJCQkJcmV0dXJuIC1ydGVf ZXJybm87CgkJCX0KI2VuZGlmCgkJCWlmIChwYXJzZXItPnJzc19jb25mLmxldmVsID4gMikgewoJ CQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VS Uk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAiUlNTIGVuY2Fwc3Vs YXRpb24gbGV2ZWwiCgkJCQkJCSAgICIgPiAxIGlzIG5vdCBzdXBwb3J0ZWQiKTsKCQkJCXJldHVy biAtcnRlX2Vycm5vOwoJCQl9CgkJCWlmIChyc3MtPnR5cGVzICYgTUxYNV9SU1NfSEZfTUFTSykg ewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAgIFJURV9GTE9X X0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAidW5zdXBwb3J0 ZWQgUlNTIHR5cGUiCgkJCQkJCSAgICIgcmVxdWVzdGVkIik7CgkJCQlyZXR1cm4gLXJ0ZV9lcnJu bzsKLS0KCQkJfSBlbHNlIHsKCQkJCXJzc19rZXlfbGVuID0gcnNzX2hhc2hfZGVmYXVsdF9rZXlf bGVuOwoJCQkJcnNzX2tleSA9IHJzc19oYXNoX2RlZmF1bHRfa2V5OwoJCQl9CgkJCWlmIChyc3Nf a2V5X2xlbiAhPSBSVEVfRElNKHBhcnNlci0+cnNzX2tleSkpIHsKCQkJCXJ0ZV9mbG93X2Vycm9y X3NldChlcnJvciwgRUlOVkFMLAoJCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwK CQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgIlJTUyBoYXNoIGtleSBtdXN0IGJlIgoJCQkJCQkg ICAiIGV4YWN0bHkgNDAgYnl0ZXMgbG9uZyIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87CgkJCX0K CQkJaWYgKCFyc3MtPnF1ZXVlX251bSkgewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBF SU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rp b25zLAoJCQkJCQkgICAibm8gdmFsaWQgcXVldWVzIik7CgkJCQlyZXR1cm4gLXJ0ZV9lcnJubzsK CQkJfQoJCQlpZiAocnNzLT5xdWV1ZV9udW0gPiBSVEVfRElNKHBhcnNlci0+cXVldWVzKSkgewoJ CQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAgIFJURV9GTE9XX0VS Uk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAidG9vIG1hbnkgcXVl dWVzIGZvciBSU1MiCgkJCQkJCSAgICIgY29udGV4dCIpOwoJCQkJcmV0dXJuIC1ydGVfZXJybm87 CgkJCX0KCQkJZm9yIChuID0gMDsgbiA8IHJzcy0+cXVldWVfbnVtOyArK24pIHsKCQkJCWlmIChy c3MtPnF1ZXVlW25dID49IHByaXYtPnJ4cXNfbikgewoJCQkJCXJ0ZV9mbG93X2Vycm9yX3NldChl cnJvciwgRUlOVkFMLAoJCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwKCQkJCQkJ ICAgYWN0aW9ucywKCQkJCQkJICAgInF1ZXVlIGlkID4gbnVtYmVyIG9mIgoJCQkJCQkgICAiIHF1 ZXVlcyIpOwoJCQkJCXJldHVybiAtcnRlX2Vycm5vOwotLQoKCQkJaWYgKG92ZXJsYXAgJiBNQVJL KQoJCQkJZ290byBleGl0X2FjdGlvbl9vdmVybGFwOwoJCQlvdmVybGFwIHw9IE1BUks7CgkJCWlm ICghbWFyaykgewoJCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsCgkJCQkJCSAg IFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJCQkJCQkgICBhY3Rpb25zLAoJCQkJCQkgICAi bWFyayBtdXN0IGJlIGRlZmluZWQiKTsKCQkJCXJldHVybiAtcnRlX2Vycm5vOwoJCQl9IGVsc2Ug aWYgKG1hcmstPmlkID49IE1MWDVfRkxPV19NQVJLX01BWCkgewoJCQkJcnRlX2Zsb3dfZXJyb3Jf c2V0KGVycm9yLCBFTk9UU1VQLAoJCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwK CQkJCQkJICAgYWN0aW9ucywKCQkJCQkJICAgIm1hcmsgbXVzdCBiZSBiZXR3ZWVuIDAiCgkJCQkJ CSAgICIgYW5kIDE2Nzc3MTk5Iik7CgkJCQlyZXR1cm4gLXJ0ZV9lcnJubzsKLS0KCWlmICghKG92 ZXJsYXAgJiBGQVRFKSkKCQlwYXJzZXItPmRyb3AgPSAxOwoJaWYgKHBhcnNlci0+ZHJvcCAmJiBw YXJzZXItPm1hcmspCgkJcGFyc2VyLT5tYXJrID0gMDsKCWlmICghcGFyc2VyLT5yc3NfY29uZi5x dWV1ZV9udW0gJiYgIXBhcnNlci0+ZHJvcCkgewoJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwg RU5PVFNVUCwgUlRFX0ZMT1dfRVJST1JfVFlQRV9IQU5ETEUsCgkJCQkgICBOVUxMLCAibm8gdmFs aWQgYWN0aW9uIik7CgkJcmV0dXJuIC1ydGVfZXJybm87Cgl9CglyZXR1cm4gMDsKZXhpdF9hY3Rp b25fbm90X3N1cHBvcnRlZDoKCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwgUlRF X0ZMT1dfRVJST1JfVFlQRV9BQ1RJT04sCgkJCSAgIGFjdGlvbnMsICJhY3Rpb24gbm90IHN1cHBv cnRlZCIpOwoJcmV0dXJuIC1ydGVfZXJybm87CmV4aXRfYWN0aW9uX292ZXJsYXA6CglydGVfZmxv d19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLAoJ CQkgICBhY3Rpb25zLCAib3ZlcmxhcHBpbmcgYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpOwoJ cmV0dXJuIC1ydGVfZXJybm87Cn0KCi8qKgogKiBWYWxpZGF0ZSBpdGVtcy4KICoKICogQHBhcmFt W2luXSBpdGVtcwogKiAgIFBhdHRlcm4gc3BlY2lmaWNhdGlvbiAobGlzdCB0ZXJtaW5hdGVkIGJ5 IHRoZSBFTkQgcGF0dGVybiBpdGVtKS4KICogQHBhcmFtW291dF0gZXJyb3IKICogICBQZXJmb3Jt IHZlcmJvc2UgZXJyb3IgcmVwb3J0aW5nIGlmIG5vdCBOVUxMLgogKiBAcGFyYW1baW4sIG91dF0g cGFyc2VyCiAqICAgSW50ZXJuYWwgcGFyc2VyIHN0cnVjdHVyZS4KICoKICogQHJldHVybgogKiAg IDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvdGhlcndpc2UgYW5kIHJ0ZV9l cnJubyBpcyBzZXQuCiAqLwpzdGF0aWMgaW50Cm1seDVfZmxvd19jb252ZXJ0X2l0ZW1zX3ZhbGlk YXRlKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LAoJCQkJIGNvbnN0IHN0cnVjdCBydGVfZmxvd19p dGVtIGl0ZW1zW10sCgkJCQkgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvciwKCQkJCSBzdHJ1 Y3QgbWx4NV9mbG93X3BhcnNlICpwYXJzZXIpCnsKCXN0cnVjdCBwcml2ICpwcml2ID0gZGV2LT5k YXRhLT5kZXZfcHJpdmF0ZTsKCWNvbnN0IHN0cnVjdCBtbHg1X2Zsb3dfaXRlbXMgKmN1cl9pdGVt ID0gbWx4NV9mbG93X2l0ZW1zOwoJdW5zaWduZWQgaW50IGk7Ci0tCgkJCQkJICAgICAgY3VyX2l0 ZW0tPm1hc2tfc3opOwoJCWlmIChyZXQpCgkJCWdvdG8gZXhpdF9pdGVtX25vdF9zdXBwb3J0ZWQ7 CgkJaWYgKElTX1RVTk5FTChpdGVtcy0+dHlwZSkpIHsKCQkJaWYgKHBhcnNlci0+dHVubmVsKSB7 CgkJCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsCgkJCQkJCSAgIFJURV9GTE9X X0VSUk9SX1RZUEVfSVRFTSwKCQkJCQkJICAgaXRlbXMsCgkJCQkJCSAgICJDYW5ub3QgcmVjb2du aXplIG11bHRpcGxlIgoJCQkJCQkgICAiIHR1bm5lbCBlbmNhcHN1bGF0aW9ucy4iKTsKCQkJCXJl dHVybiAtcnRlX2Vycm5vOwoJCQl9CgkJCWlmICghcHJpdi0+Y29uZmlnLnR1bm5lbF9lbiAmJgoJ CQkgICAgcGFyc2VyLT5yc3NfY29uZi5sZXZlbCA+IDEpIHsKCQkJCXJ0ZV9mbG93X2Vycm9yX3Nl dChlcnJvciwgRU5PVFNVUCwKCQkJCQlSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJCQkJaXRl bXMsCgkJCQkJIlJTUyBvbiB0dW5uZWwgaXMgbm90IHN1cHBvcnRlZCIpOwoJCQkJcmV0dXJuIC1y dGVfZXJybm87CgkJCX0KLS0KCQlmb3IgKGkgPSAwOyBpICE9IGhhc2hfcnhxX2luaXRfbjsgKytp KQoJCQlwYXJzZXItPnF1ZXVlW2ldLm9mZnNldCArPSBzaXplOwoJfQoJcmV0dXJuIDA7CmV4aXRf aXRlbV9ub3Rfc3VwcG9ydGVkOgoJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgLXJl dCwgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLAoJCQkJICBpdGVtcywgIml0ZW0gbm90IHN1cHBv cnRlZCIpOwp9CgovKioKICogQWxsb2NhdGUgbWVtb3J5IHNwYWNlIHRvIHN0b3JlIHZlcmJzIGZs b3cgYXR0cmlidXRlcy4KICoKICogQHBhcmFtW2luXSBzaXplCiAqICAgQW1vdW50IG9mIGJ5dGUg dG8gYWxsb2NhdGUuCiAqIEBwYXJhbVtvdXRdIGVycm9yCiAqICAgUGVyZm9ybSB2ZXJib3NlIGVy cm9yIHJlcG9ydGluZyBpZiBub3QgTlVMTC4KICoKICogQHJldHVybgogKiAgIEEgdmVyYnMgZmxv dyBhdHRyaWJ1dGUgb24gc3VjY2VzcywgTlVMTCBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBz ZXQuCiAqLwpzdGF0aWMgc3RydWN0IGlidl9mbG93X2F0dHIgKgptbHg1X2Zsb3dfY29udmVydF9h bGxvY2F0ZSh1bnNpZ25lZCBpbnQgc2l6ZSwgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvcikK ewoJc3RydWN0IGlidl9mbG93X2F0dHIgKmlidl9hdHRyOwoKCWlidl9hdHRyID0gcnRlX2NhbGxv YyhfX2Z1bmNfXywgMSwgc2l6ZSwgMCk7CglpZiAoIWlidl9hdHRyKSB7CgkJcnRlX2Zsb3dfZXJy b3Jfc2V0KGVycm9yLCBFTk9NRU0sCgkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lG SUVELAoJCQkJICAgTlVMTCwKCQkJCSAgICJjYW5ub3QgYWxsb2NhdGUgdmVyYnMgc3BlYyBhdHRy aWJ1dGVzIik7CgkJcmV0dXJuIE5VTEw7Cgl9Ci0tCiAqICAgRmxvdyBydWxlIGF0dHJpYnV0ZXMu CiAqIEBwYXJhbVtpbl0gcGF0dGVybgogKiAgIFBhdHRlcm4gc3BlY2lmaWNhdGlvbiAobGlzdCB0 ZXJtaW5hdGVkIGJ5IHRoZSBFTkQgcGF0dGVybiBpdGVtKS4KICogQHBhcmFtW2luXSBhY3Rpb25z CiAqICAgQXNzb2NpYXRlZCBhY3Rpb25zIChsaXN0IHRlcm1pbmF0ZWQgYnkgdGhlIEVORCBhY3Rp b24pLgogKiBAcGFyYW1bb3V0XSBlcnJvcgogKiAgIFBlcmZvcm0gdmVyYm9zZSBlcnJvciByZXBv cnRpbmcgaWYgbm90IE5VTEwuCiAqIEBwYXJhbVtpbiwgb3V0XSBwYXJzZXIKICogICBJbnRlcm5h bCBwYXJzZXIgc3RydWN0dXJlLgogKgogKiBAcmV0dXJuCiAqICAgMCBvbiBzdWNjZXNzLCBhIG5l Z2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNldC4KLS0Kc3Rh dGljIGludAptbHg1X2Zsb3dfY29udmVydChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwKCQkgIGNv bnN0IHN0cnVjdCBydGVfZmxvd19hdHRyICphdHRyLAoJCSAgY29uc3Qgc3RydWN0IHJ0ZV9mbG93 X2l0ZW0gaXRlbXNbXSwKCQkgIGNvbnN0IHN0cnVjdCBydGVfZmxvd19hY3Rpb24gYWN0aW9uc1td LAoJCSAgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvciwKCQkgIHN0cnVjdCBtbHg1X2Zsb3df cGFyc2UgKnBhcnNlcikKewoJY29uc3Qgc3RydWN0IG1seDVfZmxvd19pdGVtcyAqY3VyX2l0ZW0g PSBtbHg1X2Zsb3dfaXRlbXM7Cgl1bnNpZ25lZCBpbnQgaTsKCWludCByZXQ7Ci0tCgkqcGFyc2Vy ID0gKHN0cnVjdCBtbHg1X2Zsb3dfcGFyc2UpewoJCS5jcmVhdGUgPSBwYXJzZXItPmNyZWF0ZSwK CQkubGF5ZXIgPSBIQVNIX1JYUV9FVEgsCgkJLm1hcmtfaWQgPSBNTFg1X0ZMT1dfTUFSS19ERUZB VUxULAoJfTsKCXJldCA9IG1seDVfZmxvd19jb252ZXJ0X2F0dHJpYnV0ZXMoYXR0ciwgZXJyb3Ip OwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoJcmV0ID0gbWx4NV9mbG93X2NvbnZlcnRfYWN0aW9u cyhkZXYsIGFjdGlvbnMsIGVycm9yLCBwYXJzZXIpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoJ cmV0ID0gbWx4NV9mbG93X2NvbnZlcnRfaXRlbXNfdmFsaWRhdGUoZGV2LCBpdGVtcywgZXJyb3Is IHBhcnNlcik7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgltbHg1X2Zsb3dfY29udmVydF9maW5h bGlzZShwYXJzZXIpOwoJLyoKCSAqIFNlY29uZCBzdGVwLgotLQoJICovCglpZiAocGFyc2VyLT5k cm9wKSB7CgkJdW5zaWduZWQgaW50IG9mZnNldCA9IHBhcnNlci0+cXVldWVbSEFTSF9SWFFfRVRI XS5vZmZzZXQ7CgoJCXBhcnNlci0+cXVldWVbSEFTSF9SWFFfRVRIXS5pYnZfYXR0ciA9CgkJCW1s eDVfZmxvd19jb252ZXJ0X2FsbG9jYXRlKG9mZnNldCwgZXJyb3IpOwoJCWlmICghcGFyc2VyLT5x dWV1ZVtIQVNIX1JYUV9FVEhdLmlidl9hdHRyKQoJCQlnb3RvIGV4aXRfZW5vbWVtOwoJCXBhcnNl ci0+cXVldWVbSEFTSF9SWFFfRVRIXS5vZmZzZXQgPQoJCQlzaXplb2Yoc3RydWN0IGlidl9mbG93 X2F0dHIpOwoJfSBlbHNlIHsKCQlmb3IgKGkgPSAwOyBpICE9IGhhc2hfcnhxX2luaXRfbjsgKytp KSB7CgkJCXVuc2lnbmVkIGludCBvZmZzZXQ7CgoJCQlvZmZzZXQgPSBwYXJzZXItPnF1ZXVlW2ld Lm9mZnNldDsKCQkJcGFyc2VyLT5xdWV1ZVtpXS5pYnZfYXR0ciA9CgkJCQltbHg1X2Zsb3dfY29u dmVydF9hbGxvY2F0ZShvZmZzZXQsIGVycm9yKTsKCQkJaWYgKCFwYXJzZXItPnF1ZXVlW2ldLmli dl9hdHRyKQoJCQkJZ290byBleGl0X2Vub21lbTsKCQkJcGFyc2VyLT5xdWV1ZVtpXS5vZmZzZXQg PSBzaXplb2Yoc3RydWN0IGlidl9mbG93X2F0dHIpOwoJCX0KCX0KLS0KCXBhcnNlci0+bGF5ZXIg PSBIQVNIX1JYUV9FVEg7Cglmb3IgKDsgaXRlbXMtPnR5cGUgIT0gUlRFX0ZMT1dfSVRFTV9UWVBF X0VORDsgKytpdGVtcykgewoJCXN0cnVjdCBtbHg1X2Zsb3dfZGF0YSBkYXRhID0gewoJCQkuZGV2 ID0gZGV2LAoJCQkucGFyc2VyID0gcGFyc2VyLAoJCQkuZXJyb3IgPSBlcnJvciwKCQl9OwoKCQlp ZiAoaXRlbXMtPnR5cGUgPT0gUlRFX0ZMT1dfSVRFTV9UWVBFX1ZPSUQpCgkJCWNvbnRpbnVlOwoJ CWN1cl9pdGVtID0gJm1seDVfZmxvd19pdGVtc1tpdGVtcy0+dHlwZV07Ci0tCglpZiAocGFyc2Vy LT5tYXJrKQoJCW1seDVfZmxvd19jcmVhdGVfZmxhZ19tYXJrKHBhcnNlciwgcGFyc2VyLT5tYXJr X2lkKTsKCWlmIChwYXJzZXItPmNvdW50ICYmIHBhcnNlci0+Y3JlYXRlKSB7CgkJbWx4NV9mbG93 X2NyZWF0ZV9jb3VudChkZXYsIHBhcnNlcik7CgkJaWYgKCFwYXJzZXItPmNzKQoJCQlnb3RvIGV4 aXRfY291bnRfZXJyb3I7Cgl9CmV4aXRfZnJlZToKCS8qIE9ubHkgdmVyaWZpY2F0aW9uIGlzIGV4 cGVjdGVkLCBhbGwgcmVzb3VyY2VzIHNob3VsZCBiZSByZWxlYXNlZC4gKi8KCWlmICghcGFyc2Vy LT5jcmVhdGUpIHsKCQlmb3IgKGkgPSAwOyBpICE9IGhhc2hfcnhxX2luaXRfbjsgKytpKSB7Ci0t CgkJaWYgKHBhcnNlci0+cXVldWVbaV0uaWJ2X2F0dHIpIHsKCQkJcnRlX2ZyZWUocGFyc2VyLT5x dWV1ZVtpXS5pYnZfYXR0cik7CgkJCXBhcnNlci0+cXVldWVbaV0uaWJ2X2F0dHIgPSBOVUxMOwoJ CX0KCX0KCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PTUVNLCBSVEVfRkxPV19FUlJPUl9U WVBFX1VOU1BFQ0lGSUVELAoJCQkgICBOVUxMLCAiY2Fubm90IGFsbG9jYXRlIHZlcmJzIHNwZWMg YXR0cmlidXRlcyIpOwoJcmV0dXJuIC1ydGVfZXJybm87CmV4aXRfY291bnRfZXJyb3I6CglydGVf Zmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwgUlRFX0ZMT1dfRVJST1JfVFlQRV9VTlNQRUNJ RklFRCwKCQkJICAgTlVMTCwgImNhbm5vdCBjcmVhdGUgY291bnRlciIpOwoJcmV0dXJuIC1ydGVf ZXJybm87Cn0KCi8qKgotLQoJCQkvKgoJCQkgKiBGcm9tIHZlcmJzIHBlcnNwZWN0aXZlIGFuIGVt cHR5IFZMQU4gaXMgZXF1aXZhbGVudAoJCQkgKiB0byBhIHBhY2tldCB3aXRob3V0IFZMQU4gbGF5 ZXIuCgkJCSAqLwoJCQlpZiAoIWV0aC0+bWFzay52bGFuX3RhZykKCQkJCWdvdG8gZXJyb3I7CgkJ CS8qIE91dGVyIFRQSUQgY2Fubm90IGJlIG1hdGNoZWQuICovCgkJCWlmIChldGgtPm1hc2suZXRo ZXJfdHlwZSkgewoJCQkJbXNnID0gIlZMQU4gVFBJRCBtYXRjaGluZyBpcyBub3Qgc3VwcG9ydGVk IjsKCQkJCWdvdG8gZXJyb3I7CgkJCX0KCQkJZXRoLT52YWwuZXRoZXJfdHlwZSA9IHNwZWMtPmlu bmVyX3R5cGU7CgkJCWV0aC0+bWFzay5ldGhlcl90eXBlID0gbWFzay0+aW5uZXJfdHlwZTsKCQkJ ZXRoLT52YWwuZXRoZXJfdHlwZSAmPSBldGgtPm1hc2suZXRoZXJfdHlwZTsKCQl9CgkJcmV0dXJu IDA7Cgl9CmVycm9yOgoJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChkYXRhLT5lcnJvciwgRUlO VkFMLCBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJCQkgIGl0ZW0sIG1zZyk7Cn0KCi8qKgog KiBDb252ZXJ0IElQdjQgaXRlbSB0byBWZXJicyBzcGVjaWZpY2F0aW9uLgotLQoJfTsKCglpZiAo cGFyc2VyLT5sYXllciA9PSBIQVNIX1JYUV9UVU5ORUwgJiYKCSAgICBwYXJzZXItPnR1bm5lbCA9 PSBwdHlwZV9leHRbUFRZUEVfSURYKFJURV9QVFlQRV9UVU5ORUxfVlhMQU4pXSAmJgoJICAgICFw cml2LT5jb25maWcubDNfdnhsYW5fZW4pCgkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChkYXRh LT5lcnJvciwgRUlOVkFMLAoJCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLAoJCQkJCSAg aXRlbSwKCQkJCQkgICJMMyBWWExBTiBub3QgZW5hYmxlZCBieSBkZXZpY2UiCgkJCQkJICAiIHBh cmFtZXRlciBhbmQvb3Igbm90IGNvbmZpZ3VyZWQiCgkJCQkJICAiIGluIGZpcm13YXJlIik7Ci0t Cgl9OwoKCWlmIChwYXJzZXItPmxheWVyID09IEhBU0hfUlhRX1RVTk5FTCAmJgoJICAgIHBhcnNl ci0+dHVubmVsID09IHB0eXBlX2V4dFtQVFlQRV9JRFgoUlRFX1BUWVBFX1RVTk5FTF9WWExBTild ICYmCgkgICAgIXByaXYtPmNvbmZpZy5sM192eGxhbl9lbikKCQlyZXR1cm4gcnRlX2Zsb3dfZXJy b3Jfc2V0KGRhdGEtPmVycm9yLCBFSU5WQUwsCgkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lU RU0sCgkJCQkJICBpdGVtLAoJCQkJCSAgIkwzIFZYTEFOIG5vdCBlbmFibGVkIGJ5IGRldmljZSIK CQkJCQkgICIgcGFyYW1ldGVyIGFuZC9vciBub3QgY29uZmlndXJlZCIKCQkJCQkgICIgaW4gZmly bXdhcmUiKTsKLS0KCSAqIGJlZm9yZSB3aWxsIGFsc28gbWF0Y2ggdGhpcyBydWxlLgoJICogVG8g YXZvaWQgc3VjaCBzaXR1YXRpb24sIFZOSSAwIGlzIGN1cnJlbnRseSByZWZ1c2VkLgoJICovCgkv KiBPbmx5IGFsbG93IHR1bm5lbCB3L28gdHVubmVsIGlkIHBhdHRlcm4gYWZ0ZXIgcHJvcGVyIG91 dGVyIHNwZWMuICovCglpZiAocGFyc2VyLT5vdXRfbGF5ZXIgPT0gSEFTSF9SWFFfRVRIICYmICF2 eGxhbi52YWwudHVubmVsX2lkKQoJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZGF0YS0+ZXJy b3IsIEVJTlZBTCwKCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwKCQkJCQkgIGl0ZW0s CgkJCQkJICAiVnhMQU4gdm5pIGNhbm5vdCBiZSAwIik7CgltbHg1X2Zsb3dfY3JlYXRlX2NvcHko cGFyc2VyLCAmdnhsYW4sIHNpemUpOwoJcmV0dXJuIDA7Ci0tCgkJdWludDMyX3Qgdmxhbl9pZDsK CQl1aW50OF90IHZuaVs0XTsKCX0gaWQ7CgoJaWYgKCFwcml2LT5jb25maWcubDNfdnhsYW5fZW4p CgkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChkYXRhLT5lcnJvciwgRUlOVkFMLAoJCQkJCSAg UlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLAoJCQkJCSAgaXRlbSwKCQkJCQkgICJMMyBWWExBTiBu b3QgZW5hYmxlZCBieSBkZXZpY2UiCgkJCQkJICAiIHBhcmFtZXRlciBhbmQvb3Igbm90IGNvbmZp Z3VyZWQiCgkJCQkJICAiIGluIGZpcm13YXJlIik7Ci0tCgkJbWVtY3B5KCZpZC52bmlbMV0sIHNw ZWMtPnZuaSwgMyk7CgkJdnhsYW4udmFsLnR1bm5lbF9pZCA9IGlkLnZsYW5faWQ7CgkJbWVtY3B5 KCZpZC52bmlbMV0sIG1hc2stPnZuaSwgMyk7CgkJdnhsYW4ubWFzay50dW5uZWxfaWQgPSBpZC52 bGFuX2lkOwoJCWlmIChzcGVjLT5wcm90b2NvbCkKCQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3Nl dChkYXRhLT5lcnJvciwgRUlOVkFMLAoJCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwK CQkJCQkJICBpdGVtLAoJCQkJCQkgICJWeExBTi1HUEUgcHJvdG9jb2wgbm90IgoJCQkJCQkgICIg c3VwcG9ydGVkIik7CgkJLyogUmVtb3ZlIHVud2FudGVkIGJpdHMgZnJvbSB2YWx1ZXMuICovCi0t CgkgKiBiZWZvcmUgd2lsbCBhbHNvIG1hdGNoIHRoaXMgcnVsZS4KCSAqIFRvIGF2b2lkIHN1Y2gg c2l0dWF0aW9uLCBWTkkgMCBpcyBjdXJyZW50bHkgcmVmdXNlZC4KCSAqLwoJLyogT25seSBhbGxv dyB0dW5uZWwgdy9vIHR1bm5lbCBpZCBwYXR0ZXJuIGFmdGVyIHByb3BlciBvdXRlciBzcGVjLiAq LwoJaWYgKHBhcnNlci0+b3V0X2xheWVyID09IEhBU0hfUlhRX0VUSCAmJiAhdnhsYW4udmFsLnR1 bm5lbF9pZCkKCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGRhdGEtPmVycm9yLCBFSU5WQUws CgkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJCQkJICBpdGVtLAoJCQkJCSAgIlZ4 TEFOLUdQRSB2bmkgY2Fubm90IGJlIDAiKTsKCW1seDVfZmxvd19jcmVhdGVfY29weShwYXJzZXIs ICZ2eGxhbiwgc2l6ZSk7CglyZXR1cm4gMDsKLS0KCQkJaXB2Ni0+dmFsLm5leHRfaGRyID0gTUxY NV9HUkU7CgkJCWlwdjYtPm1hc2submV4dF9oZHIgPSAweGZmOwoJCX0KCX0KCWlmIChpICE9IGhh c2hfcnhxX2luaXRfbikKCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGRhdGEtPmVycm9yLCBF SU5WQUwsCgkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sCgkJCQkJICBpdGVtLAoJCQkJ CSAgIklQIHByb3RvY29sIG9mIEdSRSBtdXN0IGJlIDQ3Iik7CgltbHg1X2Zsb3dfY3JlYXRlX2Nv cHkocGFyc2VyLCAmdHVubmVsLCBzaXplKTsKCXJldHVybiAwOwotLQogKiAgIFBvaW50ZXIgdG8g RXRoZXJuZXQgZGV2aWNlLgogKiBAcGFyYW0gcGFyc2VyCiAqICAgSW50ZXJuYWwgcGFyc2VyIHN0 cnVjdHVyZS4KICogQHBhcmFtIGZsb3cKICogICBQb2ludGVyIHRvIHRoZSBydGVfZmxvdy4KICog QHBhcmFtW291dF0gZXJyb3IKICogICBQZXJmb3JtIHZlcmJvc2UgZXJyb3IgcmVwb3J0aW5nIGlm IG5vdCBOVUxMLgogKgogKiBAcmV0dXJuCiAqICAgMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVy cm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNldC4KICovCnN0YXRpYyBpbnQK bWx4NV9mbG93X2NyZWF0ZV9hY3Rpb25fcXVldWVfZHJvcChzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRl diwKCQkJCSAgIHN0cnVjdCBtbHg1X2Zsb3dfcGFyc2UgKnBhcnNlciwKCQkJCSAgIHN0cnVjdCBy dGVfZmxvdyAqZmxvdywKCQkJCSAgIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IpCnsKCXN0 cnVjdCBwcml2ICpwcml2ID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBpYnZfZmxv d19zcGVjX2FjdGlvbl9kcm9wICpkcm9wOwoJdW5zaWduZWQgaW50IHNpemUgPSBzaXplb2Yoc3Ry dWN0IGlidl9mbG93X3NwZWNfYWN0aW9uX2Ryb3ApOwoKLS0KCXBhcnNlci0+cXVldWVbSEFTSF9S WFFfRVRIXS5pYnZfYXR0ciA9IE5VTEw7CglmbG93LT5mcnhxW0hBU0hfUlhRX0VUSF0uaWJ2X2Zs b3cgPQoJCW1seDVfZ2x1ZS0+Y3JlYXRlX2Zsb3cocHJpdi0+Zmxvd19kcm9wX3F1ZXVlLT5xcCwK CQkJCSAgICAgICBmbG93LT5mcnhxW0hBU0hfUlhRX0VUSF0uaWJ2X2F0dHIpOwoJaWYgKCFmbG93 LT5mcnhxW0hBU0hfUlhRX0VUSF0uaWJ2X2Zsb3cpIHsKCQlydGVfZmxvd19lcnJvcl9zZXQoZXJy b3IsIEVOT01FTSwgUlRFX0ZMT1dfRVJST1JfVFlQRV9IQU5ETEUsCgkJCQkgICBOVUxMLCAiZmxv dyBydWxlIGNyZWF0aW9uIGZhaWx1cmUiKTsKCQlnb3RvIGVycm9yOwoJfQoJcmV0dXJuIDA7CmVy cm9yOgoJYXNzZXJ0KGZsb3cpOwoJaWYgKGZsb3ctPmZyeHFbSEFTSF9SWFFfRVRIXS5pYnZfZmxv dykgewoJCWNsYWltX3plcm8obWx4NV9nbHVlLT5kZXN0cm95X2Zsb3cKCQkJICAgKGZsb3ctPmZy eHFbSEFTSF9SWFFfRVRIXS5pYnZfZmxvdykpOwoJCWZsb3ctPmZyeHFbSEFTSF9SWFFfRVRIXS5p YnZfZmxvdyA9IE5VTEw7Ci0tCiAqICAgUG9pbnRlciB0byBFdGhlcm5ldCBkZXZpY2UuCiAqIEBw YXJhbSBwYXJzZXIKICogICBJbnRlcm5hbCBwYXJzZXIgc3RydWN0dXJlLgogKiBAcGFyYW0gZmxv dwogKiAgIFBvaW50ZXIgdG8gdGhlIHJ0ZV9mbG93LgogKiBAcGFyYW1bb3V0XSBlcnJvcgogKiAg IFBlcmZvcm0gdmVyYm9zZSBlcnJvciByZXBvcnRpbmcgaWYgbm90IE5VTEwuCiAqCiAqIEByZXR1 cm4KICogICAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3aXNlIGFu ZCBydGVfZXJybm8gaXMgc2V0LgogKi8Kc3RhdGljIGludAptbHg1X2Zsb3dfY3JlYXRlX2FjdGlv bl9xdWV1ZV9yc3Moc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYsCgkJCQkgIHN0cnVjdCBtbHg1X2Zs b3dfcGFyc2UgKnBhcnNlciwKCQkJCSAgc3RydWN0IHJ0ZV9mbG93ICpmbG93LAoJCQkJICBzdHJ1 Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQp7Cgl1bnNpZ25lZCBpbnQgaTsKCglmb3IgKGkgPSAw OyBpICE9IGhhc2hfcnhxX2luaXRfbjsgKytpKSB7CgkJaWYgKCFwYXJzZXItPnF1ZXVlW2ldLmli dl9hdHRyKQotLQoJCQkJICAgICAgcGFyc2VyLT5yc3NfY29uZi5xdWV1ZSwKCQkJCSAgICAgIHBh cnNlci0+cnNzX2NvbmYucXVldWVfbnVtLAoJCQkJICAgICAgcGFyc2VyLT50dW5uZWwsCgkJCQkg ICAgICBwYXJzZXItPnJzc19jb25mLmxldmVsKTsKCQlpZiAoIWZsb3ctPmZyeHFbaV0uaHJ4cSkg ewoJCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9NRU0sCgkJCQkJCSAgUlRF X0ZMT1dfRVJST1JfVFlQRV9IQU5ETEUsCgkJCQkJCSAgTlVMTCwKCQkJCQkJICAiY2Fubm90IGNy ZWF0ZSBoYXNoIHJ4cSIpOwoJCX0KCX0KLS0KICogICBQb2ludGVyIHRvIEV0aGVybmV0IGRldmlj ZS4KICogQHBhcmFtIHBhcnNlcgogKiAgIEludGVybmFsIHBhcnNlciBzdHJ1Y3R1cmUuCiAqIEBw YXJhbSBmbG93CiAqICAgUG9pbnRlciB0byB0aGUgcnRlX2Zsb3cuCiAqIEBwYXJhbVtvdXRdIGVy cm9yCiAqICAgUGVyZm9ybSB2ZXJib3NlIGVycm9yIHJlcG9ydGluZyBpZiBub3QgTlVMTC4KICoK ICogQHJldHVybgogKiAgIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvdGhl cndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuCiAqLwpzdGF0aWMgaW50Cm1seDVfZmxvd19jcmVh dGVfYWN0aW9uX3F1ZXVlKHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LAoJCQkgICAgICBzdHJ1Y3Qg bWx4NV9mbG93X3BhcnNlICpwYXJzZXIsCgkJCSAgICAgIHN0cnVjdCBydGVfZmxvdyAqZmxvdywK CQkJICAgICAgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvcikKewoJc3RydWN0IHByaXYgKnBy aXYgX19ydGVfdW51c2VkID0gZGV2LT5kYXRhLT5kZXZfcHJpdmF0ZTsKCWludCByZXQ7Cgl1bnNp Z25lZCBpbnQgaTsKCXVuc2lnbmVkIGludCBmbG93c19uID0gMDsKCglhc3NlcnQocHJpdi0+cGQp OwoJYXNzZXJ0KHByaXYtPmN0eCk7Cglhc3NlcnQoIXBhcnNlci0+ZHJvcCk7CglyZXQgPSBtbHg1 X2Zsb3dfY3JlYXRlX2FjdGlvbl9xdWV1ZV9yc3MoZGV2LCBwYXJzZXIsIGZsb3csIGVycm9yKTsK CWlmIChyZXQpCgkJZ290byBlcnJvcjsKCWlmIChwYXJzZXItPmNvdW50KQoJCWZsb3ctPmNzID0g cGFyc2VyLT5jczsKCWlmICghZGV2LT5kYXRhLT5kZXZfc3RhcnRlZCkKCQlyZXR1cm4gMDsKCWZv ciAoaSA9IDA7IGkgIT0gaGFzaF9yeHFfaW5pdF9uOyArK2kpIHsKLS0KCQlmbG93LT5mcnhxW2ld Lmlidl9mbG93ID0KCQkJbWx4NV9nbHVlLT5jcmVhdGVfZmxvdyhmbG93LT5mcnhxW2ldLmhyeHEt PnFwLAoJCQkJCSAgICAgICBmbG93LT5mcnhxW2ldLmlidl9hdHRyKTsKCQltbHg1X2Zsb3dfZHVt cChkZXYsIGZsb3csIGkpOwoJCWlmICghZmxvdy0+ZnJ4cVtpXS5pYnZfZmxvdykgewoJCQlydGVf Zmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT01FTSwKCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBF X0hBTkRMRSwKCQkJCQkgICBOVUxMLCAiZmxvdyBydWxlIGNyZWF0aW9uIGZhaWx1cmUiKTsKCQkJ Z290byBlcnJvcjsKCQl9CgkJKytmbG93c19uOwoJfQoJaWYgKCFmbG93c19uKSB7CgkJcnRlX2Zs b3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsIFJURV9GTE9XX0VSUk9SX1RZUEVfSEFORExFLAoJ CQkJICAgTlVMTCwgImludGVybmFsIGVycm9yIGluIGZsb3cgY3JlYXRpb24iKTsKCQlnb3RvIGVy cm9yOwoJfQoJbWx4NV9mbG93X2NyZWF0ZV91cGRhdGVfcnhxcyhkZXYsIGZsb3cpOwoJcmV0dXJu IDA7CmVycm9yOgoJcmV0ID0gcnRlX2Vycm5vOyAvKiBTYXZlIHJ0ZV9lcnJubyBiZWZvcmUgY2xl YW51cC4gKi8KCWFzc2VydChmbG93KTsKCWZvciAoaSA9IDA7IGkgIT0gaGFzaF9yeHFfaW5pdF9u OyArK2kpIHsKCQlpZiAoZmxvdy0+ZnJ4cVtpXS5pYnZfZmxvdykgewoJCQlzdHJ1Y3QgaWJ2X2Zs b3cgKmlidl9mbG93ID0gZmxvdy0+ZnJ4cVtpXS5pYnZfZmxvdzsKLS0KfQoKLyoqCiAqIENvbnZl cnQgYSBmbG93LgoKZXJyb3I6IHBhdGNoIGZhaWxlZDogZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zs b3cuYzozMQplcnJvcjogZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zsb3cuYzogcGF0Y2ggZG9lcyBu b3QgYXBwbHkKCkRQREsgU1RWIHRlYW0= --===============6963100185690519969==--