ZGlmZiAtLWdpdCBhL25ldC9pcmRhL0tjb25maWcgYi9uZXQvaXJkYS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZmIxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9LY29uZmlnCkBAIC0wLDAgKzEsOTYgQEAKKyMKKyMgSXJEQSBwcm90b2NvbCBjb25maWd1cmF0aW9uCisjCisKK21lbnVjb25maWcgSVJEQQorCWRlcGVuZHMgb24gTkVUCisJdHJpc3RhdGUgIklyREEgKGluZnJhcmVkKSBzdWJzeXN0ZW0gc3VwcG9ydCIKKwlzZWxlY3QgQ1JDX0NDSVRUCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgSXJEQSAoVE0pIHByb3RvY29scy4KKwkgIFRoZSBJbmZyYXJlZCBEYXRhIEFzc29jaWF0aW9ucyAodG0pIHNwZWNpZmllcyBzdGFuZGFyZHMgZm9yIHdpcmVsZXNzCisJICBpbmZyYXJlZCBjb21tdW5pY2F0aW9uIGFuZCBpcyBzdXBwb3J0ZWQgYnkgbW9zdCBsYXB0b3BzIGFuZCBQREEncy4KKworCSAgVG8gdXNlIExpbnV4IHN1cHBvcnQgZm9yIHRoZSBJckRBICh0bSkgcHJvdG9jb2xzLCB5b3Ugd2lsbCBhbHNvIG5lZWQKKwkgIHNvbWUgdXNlci1zcGFjZSB1dGlsaXRpZXMgbGlrZSBpcmF0dGFjaC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKwkgIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcmRhLnR4dD4uICBZb3UgYWxzbyB3YW50IHRvCisJICByZWFkIHRoZSBJUi1IT1dUTywgYXZhaWxhYmxlIGF0CisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBJZiB5b3Ugd2FudCB0byBleGNoYW5nZSBiaXRzIG9mIGRhdGEgKHZDYWwsIHZDYXJkKSB3aXRoIGEgUERBLCB5b3UKKwkgIHdpbGwgbmVlZCB0byBpbnN0YWxsIHNvbWUgT0JFWCBhcHBsaWNhdGlvbiwgc3VjaCBhcyBPcGVuT2JleCA6CisJICA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9vcGVub2JleC8+CisKKwkgIFRvIGNvbXBpbGUgdGhpcyBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBpcmRhLgorCitjb21tZW50ICJJckRBIHByb3RvY29scyIKKwlkZXBlbmRzIG9uIElSREEKKworc291cmNlICJuZXQvaXJkYS9pcmxhbi9LY29uZmlnIgorCitzb3VyY2UgIm5ldC9pcmRhL2lybmV0L0tjb25maWciCisKK3NvdXJjZSAibmV0L2lyZGEvaXJjb21tL0tjb25maWciCisKK2NvbmZpZyBJUkRBX1VMVFJBCisJYm9vbCAiVWx0cmEgKGNvbm5lY3Rpb25sZXNzKSBwcm90b2NvbCIKKwlkZXBlbmRzIG9uIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIGNvbm5lY3Rpb25sZXNzIFVsdHJhIElSREEgcHJvdG9jb2wuCisJICBVbHRyYSBhbGxvd3MgdG8gZXhjaGFuZ2UgZGF0YSBvdmVyIElyREEgd2l0aCByZWFsbHkgc2ltcGxlIGRldmljZXMKKwkgICh3YXRjaCwgYmVhY29uKSB3aXRob3V0IHRoZSBvdmVyaGVhZCBvZiB0aGUgSXJEQSBwcm90b2NvbCAobm8gaGFuZHNoYWtpbmcsCisJICBubyBtYW5hZ2VtZW50IGZyYW1lcywgc2ltcGxlIGZpeGVkIGhlYWRlcikuCisJICBVbHRyYSBpcyBhdmFpbGFibGUgYXMgYSBzcGVjaWFsIHNvY2tldCA6IHNvY2tldChBRl9JUkRBLCBTT0NLX0RHUkFNLCAxKTsKKworY29tbWVudCAiSXJEQSBvcHRpb25zIgorCWRlcGVuZHMgb24gSVJEQQorCitjb25maWcgSVJEQV9DQUNIRV9MQVNUX0xTQVAKKwlib29sICJDYWNoZSBsYXN0IExTQVAiCisJZGVwZW5kcyBvbiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBJckxNUCB0byBjYWNoZSB0aGUgbGFzdCBMU0FQIHVzZWQuICBUaGlzCisJICBtYWtlcyBzZW5zZSBzaW5jZSBtb3N0IGZyYW1lcyB3aWxsIGJlIHNlbnQvcmVjZWl2ZWQgb24gdGhlIHNhbWUKKwkgIGNvbm5lY3Rpb24uICBFbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNhdmUgYSBoYXNoLWxvb2t1cCBwZXIgZnJhbWUuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBJUkRBX0ZBU1RfUlIKKwlib29sICJGYXN0IFJScyAobG93IGxhdGVuY3kpIgorCWRlcGVuZHMgb24gSVJEQQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaXMgeW91IHdhbnQgSXJMQVAgdG8gc2VuZCBmYXN0IFJSIChSZWNlaXZlIFJlYWR5KSBmcmFtZXMKKwkgIHdoZW4gYWN0aW5nIGFzIGEgcHJpbWFyeSBzdGF0aW9uLgorCSAgRGlzYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgbWFrZSBsYXRlbmN5IG92ZXIgSXJEQSB2ZXJ5IGJhZC4gRW5hYmxpbmcKKwkgIHRoaXMgb3B0aW9uIHdpbGwgbWFrZSB0aGUgSXJEQSBzdGFjayBzZW5kIG1vcmUgcGFja2V0IHRoYW4gc3RyaWN0bHkKKwkgIG5lY2Vzc2FyeSwgdGh1cyByZWR1Y2UgeW91ciBiYXR0ZXJ5IGxpZmUgKGJ1dCBub3QgdGhhdCBtdWNoKS4KKworCSAgRmFzdCBSUiB3aWxsIG1ha2UgSXJMQVAgc2VuZCBvdXQgYSBSUiBmcmFtZSBpbW1lZGlhdGVseSB3aGVuCisJICByZWNlaXZpbmcgYSBmcmFtZSBpZiBpdHMgb3duIHRyYW5zbWl0IHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eS4gVGhpcworCSAgd2lsbCBnaXZlIGEgbG90IG9mIHNwZWVkIGltcHJvdmVtZW50IHdoZW4gcmVjZWl2aW5nIG11Y2ggZGF0YSBzaW5jZQorCSAgdGhlIHNlY29uZGFyeSBzdGF0aW9uIHdpbGwgbm90IGhhdmUgdG8gd2FpdCB0aGUgbWF4LiB0dXJuIGFyb3VuZAorCSAgdGltZSAodXN1YWxseSA1MDBtcykgYmVmb3JlIGl0IGlzIGFsbG93ZWQgdG8gdHJhbnNtaXQgdGhlIG5leHQgdGltZS4KKwkgIElmIHRoZSB0cmFuc21pdCBxdWV1ZSBvZiB0aGUgc2Vjb25kYXJ5IGlzIGFsc28gZW1wdHksIHRoZSBwcmltYXJ5IHdpbGwKKwkgIHN0YXJ0IGJhY2tpbmctb2ZmIGJlZm9yZSBzZW5kaW5nIGFub3RoZXIgUlIgZnJhbWUsIHdhaXRpbmcgbG9uZ2VyCisJICBlYWNoIHRpbWUgdW50aWwgdGhlIGJhY2stb2ZmIHJlYWNoZXMgdGhlIG1heC4gdHVybiBhcm91bmQgdGltZS4KKwkgIFRoaXMgYmFjay1vZmYgaW5jcmVhc2UgaW4gY29udHJvbGxlZCB2aWEKKwkgIC9wcm9jL3N5cy9uZXQvaXJkYS9mYXN0X3BvbGxfaW5jcmVhc2UKKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIElSREFfREVCVUcKKwlib29sICJEZWJ1ZyBpbmZvcm1hdGlvbiIKKwlkZXBlbmRzIG9uIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBJckRBIHN1YnN5c3RlbSB0byB3cml0ZSBkZWJ1ZyBpbmZvcm1hdGlvbgorCSAgdG8geW91ciBzeXNsb2cuIFlvdSBjYW4gY2hhbmdlIHRoZSBkZWJ1ZyBsZXZlbCBpbgorCSAgL3Byb2Mvc3lzL25ldC9pcmRhL2RlYnVnIC4KKwkgIFdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgdGhlIElyREEgYWxzbyBwZXJmb3JtIG1hbnkgZXh0cmEgaW50ZXJuYWwKKwkgIHZlcmlmaWNhdGlvbnMgd2hpY2ggd2lsbCB1c3VhbGx5IHByZXZlbnQgdGhlIGtlcm5lbCB0byBjcmFzaCBpbiBjYXNlIG9mCisJICBidWdzLgorCisJICBJZiB1bnN1cmUsIHNheSBZIChzaW5jZSBpdCBtYWtlcyBpdCBlYXNpZXIgdG8gZmluZCB0aGUgYnVncykuCisKK3NvdXJjZSAiZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnIgorCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9NYWtlZmlsZSBiL25ldC9pcmRhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMzY2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggSXJEQSBwcm90b2NvbCBsYXllci4KKyMKKworb2JqLSQoQ09ORklHX0lSREEpICs9IGlyZGEubworb2JqLSQoQ09ORklHX0lSTEFOKSArPSBpcmxhbi8KK29iai0kKENPTkZJR19JUk5FVCkgKz0gaXJuZXQvCitvYmotJChDT05GSUdfSVJDT01NKSArPSBpcmNvbW0vCisKK2lyZGEteSA6PSBpcmlhcC5vIGlyaWFwX2V2ZW50Lm8gaXJsbXAubyBpcmxtcF9ldmVudC5vIGlybG1wX2ZyYW1lLm8gXAorICAgICAgICAgIGlybGFwLm8gaXJsYXBfZXZlbnQubyBpcmxhcF9mcmFtZS5vIHRpbWVyLm8gcW9zLm8gaXJxdWV1ZS5vIFwKKyAgICAgICAgICBpcnR0cC5vIGlyZGFfZGV2aWNlLm8gaXJpYXNfb2JqZWN0Lm8gd3JhcHBlci5vIGFmX2lyZGEubyBcCisJICBkaXNjb3ZlcnkubyBwYXJhbWV0ZXJzLm8gaXJtb2QubworaXJkYS0kKENPTkZJR19QUk9DX0ZTKSArPSBpcnByb2MubworaXJkYS0kKENPTkZJR19TWVNDVEwpICs9IGlyc3lzY3RsLm8KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2FmX2lyZGEuYyBiL25ldC9pcmRhL2FmX2lyZGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmM2ZThkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvYWZfaXJkYS5jCkBAIC0wLDAgKzEsMjU4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICAgIGFmX2lyZGEuYworICogVmVyc2lvbjogICAgICAgMC45CisgKiBEZXNjcmlwdGlvbjogICBJckRBIHNvY2tldHMgaW1wbGVtZW50YXRpb24KKyAqIFN0YXR1czogICAgICAgIFN0YWJsZQorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU3VuIE1heSAzMSAxMDoxMjo0MyAxOTk4CisgKiBNb2RpZmllZCBhdDogICBTYXQgRGVjIDI1IDIxOjEwOjIzIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdAYnJhdHRsaS5uZXQ+CisgKiBTb3VyY2VzOiAgICAgICBhZl9uZXRyb29tLmMsIGFmX2F4MjUuYywgYWZfcm9zZS5jLCBhZl94MjUuYyBldGMuCisgKgorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICAgTGludXgtSXJEQSBub3cgc3VwcG9ydHMgZm91ciBkaWZmZXJlbnQgdHlwZXMgb2YgSXJEQSBzb2NrZXRzOgorICoKKyAqICAgICBvIFNPQ0tfU1RSRUFNOiAgICBUaW55VFAgY29ubmVjdGlvbnMgd2l0aCBTQVIgZGlzYWJsZWQuIFRoZQorICogICAgICAgICAgICAgICAgICAgICAgIG1heCBTRFUgc2l6ZSBpcyAwIGZvciBjb25uLiBvZiB0aGlzIHR5cGUKKyAqICAgICBvIFNPQ0tfU0VRUEFDS0VUOiBUaW55VFAgY29ubmVjdGlvbnMgd2l0aCBTQVIgZW5hYmxlZC4gVFRQIG1heQorICogICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50IHRoZSBtZXNzYWdlcywgYnV0IHdpbGwgcHJlc2VydmUKKyAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVzc2FnZSBib3VuZGFyaWVzCisgKiAgICAgbyBTT0NLX0RHUkFNOiAgICAgSVJEQVBST1RPX1VOSVREQVRBOiBUaW55VFAgY29ubmVjdGlvbnMgd2l0aCBVbml0ZGF0YQorICogICAgICAgICAgICAgICAgICAgICAgICh1bnJlbGlhYmxlKSB0cmFuc2ZlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICBJUkRBUFJPVE9fVUxUUkE6IENvbm5lY3Rpb25sZXNzIGFuZCB1bnJlbGlhYmxlIGRhdGEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJkYS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKworI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4JCS8qIFRJT0NPVVRRLCBUSU9DSU5RICovCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvYWZfaXJkYS5oPgorCitzdGF0aWMgaW50IGlyZGFfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCk7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGlyZGFfc3RyZWFtX29wczsKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGlyZGFfc2VxcGFja2V0X29wczsKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGlyZGFfZGdyYW1fb3BzOworCisjaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGlyZGFfdWx0cmFfb3BzOworI2RlZmluZSBVTFRSQV9NQVhfREFUQSAzODIKKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9VTFRSQSAqLworCisjZGVmaW5lIElSREFfTUFYX0hFQURFUiAoVFRQX01BWF9IRUFERVIpCisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2RhdGFfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgc2tiKQorICoKKyAqICAgIFJlY2VpdmVkIHNvbWUgZGF0YSBmcm9tIFRpbnlUUC4gSnVzdCBxdWV1ZSBpdCBvbiB0aGUgcmVjZWl2ZSBxdWV1ZQorICoKKyAqLworc3RhdGljIGludCBpcmRhX2RhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGY7CisJc3RydWN0IHNvY2sgKnNrOworCWludCBlcnI7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2VsZiA9IGluc3RhbmNlOworCXNrID0gaW5zdGFuY2U7CisJSVJEQV9BU1NFUlQoc2sgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwllcnIgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CisJaWYgKGVycikgeworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBlcnJvcjogbm8gbW9yZSBtZW0hXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzZWxmLT5yeF9mbG93ID0gRkxPV19TVE9QOworCisJCS8qIFdoZW4gd2UgcmV0dXJuIGVycm9yLCBUVFAgd2lsbCBuZWVkIHRvIHJlcXVldWUgdGhlIHNrYiAqLworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9kaXNjb25uZWN0X2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHJlYXNvbiwgc2tiKQorICoKKyAqICAgIENvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkLiBDaGVjayByZWFzb24gdG8gZmluZCBvdXQgd2h5CisgKgorICovCitzdGF0aWMgdm9pZCBpcmRhX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgICAgICBMTV9SRUFTT04gcmVhc29uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGY7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2VsZiA9IGluc3RhbmNlOworCisJSVJEQV9ERUJVRygyLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOworCisJLyogRG9uJ3QgY2FyZSBhYm91dCBpdCwgYnV0IGxldCdzIG5vdCBsZWFrIGl0ICovCisJaWYoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlzayA9IGluc3RhbmNlOworCWlmIChzayA9PSBOVUxMKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCVwKSA6IEJVRyA6IHNrIGlzIE5VTExcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYpOworCQlyZXR1cm47CisJfQorCisJLyogUHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2l0aCBpcmRhX3JlbGVhc2UoKSBhbmQgaXJkYV9zaHV0ZG93bigpICovCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkgJiYgc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSkgeworCQlzay0+c2tfc3RhdGUgICAgID0gVENQX0NMT1NFOworCQlzay0+c2tfZXJyICAgICAgID0gRUNPTk5SRVNFVDsKKwkJc2stPnNrX3NodXRkb3duIHw9IFNFTkRfU0hVVERPV047CisKKwkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCS8qIFVoLW9oLi4uIFNob3VsZCB1c2Ugc29ja19vcnBoYW4gPyAqLworICAgICAgICAgICAgICAgIHNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfREVBRCk7CisKKwkJLyogQ2xvc2Ugb3VyIFRTQVAuCisJCSAqIElmIHdlIGxlYXZlIGl0IG9wZW4sIElyTE1QIHB1dCBpdCBiYWNrIGludG8gdGhlIGxpc3Qgb2YKKwkJICogdW5jb25uZWN0ZWQgTFNBUHMuIFRoZSBwcm9ibGVtIGlzIHRoYXQgYW55IGluY29taW5nIHJlcXVlc3QKKwkJICogY2FuIHRoZW4gYmUgbWF0Y2hlZCB0byB0aGlzIHNvY2tldCAoYW5kIGl0IHdpbGwgYmUsIGJlY2F1c2UKKwkJICogaXQgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QpLiBUaGlzIHdvdWxkIHByZXZlbnQgYW55CisJCSAqIGxpc3RlbmluZyBzb2NrZXQgd2FpdGluZyBvbiB0aGUgc2FtZSBUU0FQIHRvIGdldCB0aG9zZQorCQkgKiByZXF1ZXN0cy4gU29tZSBhcHBzIGZvcmdldCB0byBjbG9zZSBzb2NrZXRzLCBvciBoYW5nIHRvIGl0CisJCSAqIGEgYml0IHRvbyBsb25nLCBzbyB3ZSBtYXkgc3RheSBpbiB0aGlzIGRlYWQgc3RhdGUgbG9uZworCQkgKiBlbm91Z2ggdG8gYmUgbm90aWNlZC4uLgorCQkgKiBOb3RlIDogYWxsIHNvY2tldCBmdW5jdGlvbiBkbyBjaGVjayBzay0+c2tfc3RhdGUsIHNvIHdlIGFyZQorCQkgKiBzYWZlLi4uCisJCSAqIEplYW4gSUkKKwkJICovCisJCWlmIChzZWxmLT50c2FwKSB7CisJCQlpcnR0cF9jbG9zZV90c2FwKHNlbGYtPnRzYXApOworCQkJc2VsZi0+dHNhcCA9IE5VTEw7CisJCX0KKyAgICAgICAgfQorCisJLyogTm90ZSA6IG9uY2Ugd2UgYXJlIHRoZXJlLCB0aGVyZSBpcyBub3QgbXVjaCB5b3Ugd2FudCB0byBkbworCSAqIHdpdGggdGhlIHNvY2tldCBhbnltb3JlLCBhcGFydCBmcm9tIGNsb3NpbmcgaXQuCisJICogRm9yIGV4YW1wbGUsIGJpbmQoKSBhbmQgY29ubmVjdCgpIHdvbid0IHJlc2V0IHNrLT5za19lcnIsCisJICogc2stPnNrX3NodXRkb3duIGFuZCBzay0+c2tfZmxhZ3MgdG8gdmFsaWQgdmFsdWVzLi4uCisJICogSmVhbiBJSQorCSAqLworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9jb25uZWN0X2NvbmZpcm0gKGluc3RhbmNlLCBzYXAsIHFvcywgbWF4X3NkdV9zaXplLCBza2IpCisgKgorICogICAgQ29ubmVjdGlvbnMgaGFzIGJlZW4gY29uZmlybWVkIGJ5IHRoZSByZW1vdGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgdm9pZCBpcmRhX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKKwkJCQkgX191MzIgbWF4X3NkdV9zaXplLCBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmOworCXN0cnVjdCBzb2NrICpzazsKKworCXNlbGYgPSBpbnN0YW5jZTsKKworCUlSREFfREVCVUcoMiwgIiVzKCVwKVxuIiwgX19GVU5DVElPTl9fLCBzZWxmKTsKKworCXNrID0gaW5zdGFuY2U7CisJaWYgKHNrID09IE5VTEwpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJZGV2X2tmcmVlX3NrYihza2IpOworCS8vIFNob3VsZCBiZSA/Pz8gc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCisJLyogSG93IG11Y2ggaGVhZGVyIHNwYWNlIGRvIHdlIG5lZWQgdG8gcmVzZXJ2ZSAqLworCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKKworCS8qIElyVFRQIG1heCBTRFUgc2l6ZSBpbiB0cmFuc21pdCBkaXJlY3Rpb24gKi8KKwlzZWxmLT5tYXhfc2R1X3NpemVfdHggPSBtYXhfc2R1X3NpemU7CisKKwkvKiBGaW5kIG91dCB3aGF0IHRoZSBsYXJnZXN0IGNodW5rIG9mIGRhdGEgdGhhdCB3ZSBjYW4gdHJhbnNtaXQgaXMgKi8KKwlzd2l0Y2ggKHNrLT5za190eXBlKSB7CisJY2FzZSBTT0NLX1NUUkVBTToKKwkJaWYgKG1heF9zZHVfc2l6ZSAhPSAwKSB7CisJCQlJUkRBX0VSUk9SKCIlczogbWF4X3NkdV9zaXplIG11c3QgYmUgMFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuOworCQl9CisJCXNlbGYtPm1heF9kYXRhX3NpemUgPSBpcnR0cF9nZXRfbWF4X3NlZ19zaXplKHNlbGYtPnRzYXApOworCQlicmVhazsKKwljYXNlIFNPQ0tfU0VRUEFDS0VUOgorCQlpZiAobWF4X3NkdV9zaXplID09IDApIHsKKwkJCUlSREFfRVJST1IoIiVzOiBtYXhfc2R1X3NpemUgY2Fubm90IGJlIDBcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybjsKKwkJfQorCQlzZWxmLT5tYXhfZGF0YV9zaXplID0gbWF4X3NkdV9zaXplOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZWxmLT5tYXhfZGF0YV9zaXplID0gaXJ0dHBfZ2V0X21heF9zZWdfc2l6ZShzZWxmLT50c2FwKTsKKwl9OworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgbWF4X2RhdGFfc2l6ZT0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBzZWxmLT5tYXhfZGF0YV9zaXplKTsKKworCW1lbWNweSgmc2VsZi0+cW9zX3R4LCBxb3MsIHNpemVvZihzdHJ1Y3QgcW9zX2luZm8pKTsKKworCS8qIFdlIGFyZSBub3cgY29ubmVjdGVkISAqLworCXNrLT5za19zdGF0ZSA9IFRDUF9FU1RBQkxJU0hFRDsKKwlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfY29ubmVjdF9pbmRpY2F0aW9uKGluc3RhbmNlLCBzYXAsIHFvcywgbWF4X3NkdV9zaXplLCB1c2VyZGF0YSkKKyAqCisgKiAgICBJbmNvbWluZyBjb25uZWN0aW9uCisgKgorICovCitzdGF0aWMgdm9pZCBpcmRhX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NkdV9zaXplLAorCQkJCSAgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmOworCXN0cnVjdCBzb2NrICpzazsKKworCXNlbGYgPSBpbnN0YW5jZTsKKworCUlSREFfREVCVUcoMiwgIiVzKCVwKVxuIiwgX19GVU5DVElPTl9fLCBzZWxmKTsKKworCXNrID0gaW5zdGFuY2U7CisJaWYgKHNrID09IE5VTEwpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJLyogSG93IG11Y2ggaGVhZGVyIHNwYWNlIGRvIHdlIG5lZWQgdG8gcmVzZXJ2ZSAqLworCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKKworCS8qIElyVFRQIG1heCBTRFUgc2l6ZSBpbiB0cmFuc21pdCBkaXJlY3Rpb24gKi8KKwlzZWxmLT5tYXhfc2R1X3NpemVfdHggPSBtYXhfc2R1X3NpemU7CisKKwkvKiBGaW5kIG91dCB3aGF0IHRoZSBsYXJnZXN0IGNodW5rIG9mIGRhdGEgdGhhdCB3ZSBjYW4gdHJhbnNtaXQgaXMgKi8KKwlzd2l0Y2ggKHNrLT5za190eXBlKSB7CisJY2FzZSBTT0NLX1NUUkVBTToKKwkJaWYgKG1heF9zZHVfc2l6ZSAhPSAwKSB7CisJCQlJUkRBX0VSUk9SKCIlczogbWF4X3NkdV9zaXplIG11c3QgYmUgMFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm47CisJCX0KKwkJc2VsZi0+bWF4X2RhdGFfc2l6ZSA9IGlydHRwX2dldF9tYXhfc2VnX3NpemUoc2VsZi0+dHNhcCk7CisJCWJyZWFrOworCWNhc2UgU09DS19TRVFQQUNLRVQ6CisJCWlmIChtYXhfc2R1X3NpemUgPT0gMCkgeworCQkJSVJEQV9FUlJPUigiJXM6IG1heF9zZHVfc2l6ZSBjYW5ub3QgYmUgMFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm47CisJCX0KKwkJc2VsZi0+bWF4X2RhdGFfc2l6ZSA9IG1heF9zZHVfc2l6ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2VsZi0+bWF4X2RhdGFfc2l6ZSA9IGlydHRwX2dldF9tYXhfc2VnX3NpemUoc2VsZi0+dHNhcCk7CisJfTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIG1heF9kYXRhX3NpemU9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgc2VsZi0+bWF4X2RhdGFfc2l6ZSk7CisKKwltZW1jcHkoJnNlbGYtPnFvc190eCwgcW9zLCBzaXplb2Yoc3RydWN0IHFvc19pbmZvKSk7CisKKwlza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2Nvbm5lY3RfcmVzcG9uc2UgKGhhbmRsZSkKKyAqCisgKiAgICBBY2NlcHQgaW5jb21pbmcgY29ubmVjdGlvbgorICoKKyAqLworc3RhdGljIHZvaWQgaXJkYV9jb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCBpcmRhX3NvY2sgKnNlbGYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCkgVW5hYmxlIHRvIGFsbG9jYXRlIHNrX2J1ZmYhXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIE1VWF9DT05UUk9MIGFuZCBMQVAgaGVhZGVyICovCisJc2tiX3Jlc2VydmUoc2tiLCBJUkRBX01BWF9IRUFERVIpOworCisJaXJ0dHBfY29ubmVjdF9yZXNwb25zZShzZWxmLT50c2FwLCBzZWxmLT5tYXhfc2R1X3NpemVfcngsIHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2Zsb3dfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgZmxvdykKKyAqCisgKiAgICBVc2VkIGJ5IFRpbnlUUCB0byB0ZWxsIHVzIGlmIGl0IGNhbiBhY2NlcHQgbW9yZSBkYXRhIG9yIG5vdAorICoKKyAqLworc3RhdGljIHZvaWQgaXJkYV9mbG93X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgTE9DQUxfRkxPVyBmbG93KQoreworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGY7CisJc3RydWN0IHNvY2sgKnNrOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNlbGYgPSBpbnN0YW5jZTsKKwlzayA9IGluc3RhbmNlOworCUlSREFfQVNTRVJUKHNrICE9IE5VTEwsIHJldHVybjspOworCisJc3dpdGNoIChmbG93KSB7CisJY2FzZSBGTE9XX1NUT1A6CisJCUlSREFfREVCVUcoMSwgIiVzKCksIElyVFRQIHdhbnRzIHVzIHRvIHNsb3cgZG93blxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCXNlbGYtPnR4X2Zsb3cgPSBmbG93OworCQlicmVhazsKKwljYXNlIEZMT1dfU1RBUlQ6CisJCXNlbGYtPnR4X2Zsb3cgPSBmbG93OworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBJclRUUCB3YW50cyB1cyB0byBzdGFydCBhZ2FpblxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShzay0+c2tfc2xlZXApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGZsb3cgY29tbWFuZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCS8qIFVua25vd24gZmxvdyBjb21tYW5kLCBiZXR0ZXIgc3RvcCAqLworCQlzZWxmLT50eF9mbG93ID0gZmxvdzsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9nZXR2YWx1ZV9jb25maXJtIChvYmpfaWQsIHZhbHVlLCBwcml2KQorICoKKyAqICAgIEdvdCBhbnN3ZXIgZnJvbSByZW1vdGUgTE0tSUFTLCBqdXN0IHBhc3Mgb2JqZWN0IHRvIHJlcXVlc3Rlci4uLgorICoKKyAqIE5vdGUgOiBkdXBsaWNhdGUgZnJvbSBhYm92ZSwgYnV0IHdlIG5lZWQgb3VyIG93biB2ZXJzaW9uIHRoYXQKKyAqIGRvZXNuJ3QgdG91Y2ggdGhlIGR0c2FwX3NlbCBhbmQgc2F2ZSB0aGUgZnVsbCB2YWx1ZSBzdHJ1Y3R1cmUuLi4KKyAqLworc3RhdGljIHZvaWQgaXJkYV9nZXR2YWx1ZV9jb25maXJtKGludCByZXN1bHQsIF9fdTE2IG9ial9pZCwKKwkJCQkgIHN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGY7CisKKwlzZWxmID0gKHN0cnVjdCBpcmRhX3NvY2sgKikgcHJpdjsKKwlpZiAoIXNlbGYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogbG9zdCBteXNlbGYhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJSVJEQV9ERUJVRygyLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOworCisJLyogV2UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBtYWtlIGFueSBtb3JlIHF1ZXJpZXMgKi8KKwlpcmlhcF9jbG9zZShzZWxmLT5pcmlhcCk7CisJc2VsZi0+aXJpYXAgPSBOVUxMOworCisJLyogQ2hlY2sgaWYgcmVxdWVzdCBzdWNjZWVkZWQgKi8KKwlpZiAocmVzdWx0ICE9IElBU19TVUNDRVNTKSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIElBUyBxdWVyeSBmYWlsZWQhICglZClcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgIHJlc3VsdCk7CisKKwkJc2VsZi0+ZXJybm8gPSByZXN1bHQ7CS8qIFdlIHJlYWxseSBuZWVkIGl0IGxhdGVyICovCisKKwkJLyogV2FrZSB1cCBhbnkgcHJvY2Vzc2VzIHdhaXRpbmcgZm9yIHJlc3VsdCAqLworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlbGYtPnF1ZXJ5X3dhaXQpOworCisJCXJldHVybjsKKwl9CisKKwkvKiBQYXNzIHRoZSBvYmplY3QgdG8gdGhlIGNhbGxlciAoc28gdGhlIGNhbGxlciBtdXN0IGRlbGV0ZSBpdCkgKi8KKwlzZWxmLT5pYXNfcmVzdWx0ID0gdmFsdWU7CisJc2VsZi0+ZXJybm8gPSAwOworCisJLyogV2FrZSB1cCBhbnkgcHJvY2Vzc2VzIHdhaXRpbmcgZm9yIHJlc3VsdCAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VsZi0+cXVlcnlfd2FpdCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3NlbGVjdGl2ZV9kaXNjb3ZlcnlfaW5kaWNhdGlvbiAoZGlzY292ZXJ5KQorICoKKyAqICAgIEdvdCBhIHNlbGVjdGl2ZSBkaXNjb3ZlcnkgaW5kaWNhdGlvbiBmcm9tIElyTE1QLgorICoKKyAqIElyTE1QIGlzIHRlbGxpbmcgdXMgdGhhdCB0aGlzIG5vZGUgaXMgbmV3IGFuZCBtYXRjaGluZyBvdXIgaGludCBiaXQKKyAqIGZpbHRlci4gV2FrZSB1cCBhbnkgcHJvY2VzcyB3YWl0aW5nIGZvciBhbnN3ZXIuLi4KKyAqLworc3RhdGljIHZvaWQgaXJkYV9zZWxlY3RpdmVfZGlzY292ZXJ5X2luZGljYXRpb24oZGlzY2luZm9fdCAqZGlzY292ZXJ5LAorCQkJCQkJRElTQ09WRVJZX01PREUgbW9kZSwKKwkJCQkJCXZvaWQgKnByaXYpCit7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzZWxmID0gKHN0cnVjdCBpcmRhX3NvY2sgKikgcHJpdjsKKwlpZiAoIXNlbGYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogbG9zdCBteXNlbGYhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJLyogUGFzcyBwYXJhbWV0ZXIgdG8gdGhlIGNhbGxlciAqLworCXNlbGYtPmNhY2hlZGFkZHIgPSBkaXNjb3ZlcnktPmRhZGRyOworCisJLyogV2FrZSB1cCBwcm9jZXNzIGlmIGl0cyB3YWl0aW5nIGZvciBkZXZpY2UgdG8gYmUgZGlzY292ZXJlZCAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VsZi0+cXVlcnlfd2FpdCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2Rpc2NvdmVyeV90aW1lb3V0IChwcml2KQorICoKKyAqICAgIFRpbWVvdXQgaW4gdGhlIHNlbGVjdGl2ZSBkaXNjb3ZlcnkgcHJvY2VzcworICoKKyAqIFdlIHdlcmUgd2FpdGluZyBmb3IgYSBub2RlIHRvIGJlIGRpc2NvdmVyZWQsIGJ1dCBub3RoaW5nIGhhcyBjb21lIHVwCisgKiBzbyBmYXIuIFdha2UgdXAgdGhlIHVzZXIgYW5kIHRlbGwgaGltIHRoYXQgd2UgZmFpbGVkLi4uCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfZGlzY292ZXJ5X3RpbWVvdXQodV9sb25nIHByaXYpCit7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzZWxmID0gKHN0cnVjdCBpcmRhX3NvY2sgKikgcHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJLyogTm90aGluZyBmb3IgdGhlIGNhbGxlciAqLworCXNlbGYtPmNhY2hlbG9nID0gTlVMTDsKKwlzZWxmLT5jYWNoZWRhZGRyID0gMDsKKwlzZWxmLT5lcnJubyA9IC1FVElNRTsKKworCS8qIFdha2UgdXAgcHJvY2VzcyBpZiBpdHMgc3RpbGwgd2FpdGluZy4uLiAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VsZi0+cXVlcnlfd2FpdCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX29wZW5fdHNhcCAoc2VsZikKKyAqCisgKiAgICBPcGVuIGxvY2FsIFRyYW5zcG9ydCBTZXJ2aWNlIEFjY2VzcyBQb2ludCAoVFNBUCkKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9vcGVuX3RzYXAoc3RydWN0IGlyZGFfc29jayAqc2VsZiwgX191OCB0c2FwX3NlbCwgY2hhciAqbmFtZSkKK3sKKwlub3RpZnlfdCBub3RpZnk7CisKKwlpZiAoc2VsZi0+dHNhcCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBidXN5IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGNhbGxiYWNrcyB0byBiZSB1c2VkIGJ5IHRoZSBJckRBIHN0YWNrICovCisJaXJkYV9ub3RpZnlfaW5pdCgmbm90aWZ5KTsKKwlub3RpZnkuY29ubmVjdF9jb25maXJtICAgICAgID0gaXJkYV9jb25uZWN0X2NvbmZpcm07CisJbm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbiAgICA9IGlyZGFfY29ubmVjdF9pbmRpY2F0aW9uOworCW5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24gPSBpcmRhX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbjsKKwlub3RpZnkuZGF0YV9pbmRpY2F0aW9uICAgICAgID0gaXJkYV9kYXRhX2luZGljYXRpb247CisJbm90aWZ5LnVkYXRhX2luZGljYXRpb24JICAgICA9IGlyZGFfZGF0YV9pbmRpY2F0aW9uOworCW5vdGlmeS5mbG93X2luZGljYXRpb24gICAgICAgPSBpcmRhX2Zsb3dfaW5kaWNhdGlvbjsKKwlub3RpZnkuaW5zdGFuY2UgPSBzZWxmOworCXN0cm5jcHkobm90aWZ5Lm5hbWUsIG5hbWUsIE5PVElGWV9NQVhfTkFNRSk7CisKKwlzZWxmLT50c2FwID0gaXJ0dHBfb3Blbl90c2FwKHRzYXBfc2VsLCBERUZBVUxUX0lOSVRJQUxfQ1JFRElULAorCQkJCSAgICAgJm5vdGlmeSk7CisJaWYgKHNlbGYtPnRzYXAgPT0gTlVMTCkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmFibGUgdG8gYWxsb2NhdGUgVFNBUCFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogUmVtZW1iZXIgd2hpY2ggVFNBUCBzZWxlY3RvciB3ZSBhY3R1YWxseSBnb3QgKi8KKwlzZWxmLT5zdHNhcF9zZWwgPSBzZWxmLT50c2FwLT5zdHNhcF9zZWw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfb3Blbl9sc2FwIChzZWxmKQorICoKKyAqICAgIE9wZW4gbG9jYWwgTGluayBTZXJ2aWNlIEFjY2VzcyBQb2ludCAoTFNBUCkuIFVzZWQgZm9yIG9wZW5pbmcgVWx0cmEKKyAqICAgIHNvY2tldHMKKyAqLworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCitzdGF0aWMgaW50IGlyZGFfb3Blbl9sc2FwKHN0cnVjdCBpcmRhX3NvY2sgKnNlbGYsIGludCBwaWQpCit7CisJbm90aWZ5X3Qgbm90aWZ5OworCisJaWYgKHNlbGYtPmxzYXApIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBidXN5IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGNhbGxiYWNrcyB0byBiZSB1c2VkIGJ5IHRoZSBJckRBIHN0YWNrICovCisJaXJkYV9ub3RpZnlfaW5pdCgmbm90aWZ5KTsKKwlub3RpZnkudWRhdGFfaW5kaWNhdGlvbgk9IGlyZGFfZGF0YV9pbmRpY2F0aW9uOworCW5vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CisJc3RybmNweShub3RpZnkubmFtZSwgIlVsdHJhIiwgTk9USUZZX01BWF9OQU1FKTsKKworCXNlbGYtPmxzYXAgPSBpcmxtcF9vcGVuX2xzYXAoTFNBUF9DT05OTEVTUywgJm5vdGlmeSwgcGlkKTsKKwlpZiAoc2VsZi0+bHNhcCA9PSBOVUxMKSB7CisJCUlSREFfREVCVUcoIDAsICIlcygpLCBVbmFibGUgdG8gYWxsb2NhdGUgTFNBUCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2ZpbmRfbHNhcF9zZWwgKHNlbGYsIG5hbWUpCisgKgorICogICAgVHJ5IHRvIGxvb2t1cCBMU0FQIHNlbGVjdG9yIGluIHJlbW90ZSBMTS1JQVMKKyAqCisgKiBCYXNpY2FsbHksIHdlIHN0YXJ0IGEgSUFQIHF1ZXJ5LCBhbmQgdGhlbiBnbyB0byBzbGVlcC4gV2hlbiB0aGUgcXVlcnkKKyAqIHJldHVybiwgaXJkYV9nZXR2YWx1ZV9jb25maXJtIHdpbGwgd2FrZSB1cyB1cCwgYW5kIHdlIGNhbiBleGFtaW5lIHRoZQorICogcmVzdWx0IG9mIHRoZSBxdWVyeS4uLgorICogTm90ZSB0aGF0IGluIHNvbWUgY2FzZSwgdGhlIHF1ZXJ5IGZhaWwgZXZlbiBiZWZvcmUgd2UgZ28gdG8gc2xlZXAsCisgKiBjcmVhdGluZyBzb21lIHJhY2VzLi4uCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9maW5kX2xzYXBfc2VsKHN0cnVjdCBpcmRhX3NvY2sgKnNlbGYsIGNoYXIgKm5hbWUpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoJXAsICVzKVxuIiwgX19GVU5DVElPTl9fLCBzZWxmLCBuYW1lKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlpZiAoc2VsZi0+aXJpYXApIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpOiBidXN5IHdpdGggYSBwcmV2aW91cyBxdWVyeVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzZWxmLT5pcmlhcCA9IGlyaWFwX29wZW4oTFNBUF9BTlksIElBU19DTElFTlQsIHNlbGYsCisJCQkJIGlyZGFfZ2V0dmFsdWVfY29uZmlybSk7CisJaWYoc2VsZi0+aXJpYXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBUcmVhdCB1bmV4cGVjdGVkIHdha2V1cCBhcyBkaXNjb25uZWN0ICovCisJc2VsZi0+ZXJybm8gPSAtRUhPU1RVTlJFQUNIOworCisJLyogUXVlcnkgcmVtb3RlIExNLUlBUyAqLworCWlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KHNlbGYtPmlyaWFwLCBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsCisJCQkJICAgICAgbmFtZSwgIklyREE6VGlueVRQOkxzYXBTZWwiKTsKKworCS8qIFdhaXQgZm9yIGFuc3dlciwgaWYgbm90IHlldCBmaW5pc2hlZCAob3IgZmFpbGVkKSAqLworCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2VsZi0+cXVlcnlfd2FpdCwgKHNlbGYtPmlyaWFwPT1OVUxMKSkpCisJCS8qIFRyZWF0IHNpZ25hbHMgYXMgZGlzY29ubmVjdCAqLworCQlyZXR1cm4gLUVIT1NUVU5SRUFDSDsKKworCS8qIENoZWNrIHdoYXQgaGFwcGVuZWQgKi8KKwlpZiAoc2VsZi0+ZXJybm8pCisJeworCQkvKiBSZXF1ZXN0ZWQgb2JqZWN0L2F0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0ICovCisJCWlmKChzZWxmLT5lcnJubyA9PSBJQVNfQ0xBU1NfVU5LTk9XTikgfHwKKwkJICAgKHNlbGYtPmVycm5vID09IElBU19BVFRSSUJfVU5LTk9XTikpCisJCQlyZXR1cm4gKC1FQUREUk5PVEFWQUlMKTsKKwkJZWxzZQorCQkJcmV0dXJuICgtRUhPU1RVTlJFQUNIKTsKKwl9CisKKwkvKiBHZXQgdGhlIHJlbW90ZSBUU0FQIHNlbGVjdG9yICovCisJc3dpdGNoIChzZWxmLT5pYXNfcmVzdWx0LT50eXBlKSB7CisJY2FzZSBJQVNfSU5URUdFUjoKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSBpbnQ9JWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlhc19yZXN1bHQtPnQuaW50ZWdlcik7CisKKwkJaWYgKHNlbGYtPmlhc19yZXN1bHQtPnQuaW50ZWdlciAhPSAtMSkKKwkJCXNlbGYtPmR0c2FwX3NlbCA9IHNlbGYtPmlhc19yZXN1bHQtPnQuaW50ZWdlcjsKKwkJZWxzZQorCQkJc2VsZi0+ZHRzYXBfc2VsID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2VsZi0+ZHRzYXBfc2VsID0gMDsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgYmFkIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwl9CisJaWYgKHNlbGYtPmlhc19yZXN1bHQpCisJCWlyaWFzX2RlbGV0ZV92YWx1ZShzZWxmLT5pYXNfcmVzdWx0KTsKKworCWlmIChzZWxmLT5kdHNhcF9zZWwpCisJCXJldHVybiAwOworCisJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9kaXNjb3Zlcl9kYWRkcl9hbmRfbHNhcF9zZWwgKHNlbGYsIG5hbWUpCisgKgorICogICAgVGhpcyB0cnkgdG8gZmluZCBhIGRldmljZSB3aXRoIHRoZSByZXF1ZXN0ZWQgc2VydmljZS4KKyAqCisgKiBJdCBiYXNpY2FsbHkgbG9vayBpbnRvIHRoZSBkaXNjb3ZlcnkgbG9nLiBGb3IgZWFjaCBhZGRyZXNzIGluIHRoZSBsaXN0LAorICogaXQgcXVlcmllcyB0aGUgTE0tSUFTIG9mIHRoZSBkZXZpY2UgdG8gZmluZCBpZiB0aGlzIGRldmljZSBvZmZlcgorICogdGhlIHJlcXVlc3RlZCBzZXJ2aWNlLgorICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBub2RlIHN1cHBvcnRpbmcgdGhlIHNlcnZpY2UsIHdlIGNvbXBsYWluCisgKiB0byB0aGUgdXNlciAoaXQgc2hvdWxkIG1vdmUgZGV2aWNlcyBhcm91bmQpLgorICogVGhlLCB3ZSBzZXQgYm90aCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgdGhlIGxzYXAgc2VsZWN0b3IgdG8gcG9pbnQKKyAqIG9uIHRoZSBzZXJ2aWNlIG9uIHRoZSB1bmlxdWUgZGV2aWNlIHdlIGhhdmUgZm91bmQuCisgKgorICogTm90ZSA6IHRoaXMgZnVuY3Rpb24gZmFpbHMgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBkZXZpY2UgaW4gcmFuZ2UsCisgKiBiZWNhdXNlIElyTE1QIGRvZXNuJ3QgZGlzY29ubmVjdCB0aGUgTEFQIHdoZW4gdGhlIGxhc3QgTFNBUCBpcyBjbG9zZWQuCisgKiBNb3Jlb3Zlciwgd2Ugd291bGQgbmVlZCB0byB3YWl0IHRoZSBMQVAgZGlzY29ubmVjdGlvbi4uLgorICovCitzdGF0aWMgaW50IGlyZGFfZGlzY292ZXJfZGFkZHJfYW5kX2xzYXBfc2VsKHN0cnVjdCBpcmRhX3NvY2sgKnNlbGYsIGNoYXIgKm5hbWUpCit7CisJZGlzY2luZm9fdCAqZGlzY292ZXJpZXM7CS8qIENvcHkgb2YgdGhlIGRpc2NvdmVyeSBsb2cgKi8KKwlpbnQJbnVtYmVyOwkJCS8qIE51bWJlciBvZiBub2RlcyBpbiB0aGUgbG9nICovCisJaW50CWk7CisJaW50CWVyciA9IC1FTkVUVU5SRUFDSDsKKwlfX3UzMglkYWRkciA9IERFVl9BRERSX0FOWTsJLyogQWRkcmVzcyB3ZSBmb3VuZCB0aGUgc2VydmljZSBvbiAqLworCV9fdTgJZHRzYXBfc2VsID0gMHgwOwkvKiBUU0FQIGFzc29jaWF0ZWQgd2l0aCBpdCAqLworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgbmFtZT0lc1xuIiwgX19GVU5DVElPTl9fLCBuYW1lKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkvKiBBc2sgbG1wIGZvciB0aGUgY3VycmVudCBkaXNjb3ZlcnkgbG9nCisJICogTm90ZSA6IHdlIGhhdmUgdG8gdXNlIGlybG1wX2dldF9kaXNjb3ZlcmllcygpLCBhcyBvcHBvc2VkCisJICogdG8gcGxheSB3aXRoIHRoZSBjYWNoZWxvZyBkaXJlY3RseSwgYmVjYXVzZSB3aGlsZSB3ZSBhcmUKKwkgKiBtYWtpbmcgb3VyIGlhcyBxdWVyeSwgbGUgbG9nIG1pZ2h0IGNoYW5nZS4uLiAqLworCWRpc2NvdmVyaWVzID0gaXJsbXBfZ2V0X2Rpc2NvdmVyaWVzKCZudW1iZXIsIHNlbGYtPm1hc2sud29yZCwKKwkJCQkJICAgIHNlbGYtPm5zbG90cyk7CisJLyogQ2hlY2sgaWYgdGhlIHdlIGdvdCBzb21lIHJlc3VsdHMgKi8KKwlpZiAoZGlzY292ZXJpZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTkVUVU5SRUFDSDsJLyogTm8gbm9kZXMgZGlzY292ZXJlZCAqLworCisJLyoKKwkgKiBOb3csIGNoZWNrIGFsbCBkaXNjb3ZlcmVkIGRldmljZXMgKGlmIGFueSksIGFuZCBjb25uZWN0CisJICogY2xpZW50IG9ubHkgYWJvdXQgdGhlIHNlcnZpY2VzIHRoYXQgdGhlIGNsaWVudCBpcworCSAqIGludGVyZXN0ZWQgaW4uLi4KKwkgKi8KKwlmb3IoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgeworCQkvKiBUcnkgdGhlIGFkZHJlc3MgaW4gdGhlIGxvZyAqLworCQlzZWxmLT5kYWRkciA9IGRpc2NvdmVyaWVzW2ldLmRhZGRyOworCQlzZWxmLT5zYWRkciA9IDB4MDsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgdHJ5aW5nIGRhZGRyID0gJTA4eFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+ZGFkZHIpOworCisJCS8qIFF1ZXJ5IHJlbW90ZSBMTS1JQVMgZm9yIHRoaXMgc2VydmljZSAqLworCQllcnIgPSBpcmRhX2ZpbmRfbHNhcF9zZWwoc2VsZiwgbmFtZSk7CisJCXN3aXRjaCAoZXJyKSB7CisJCWNhc2UgMDoKKwkJCS8qIFdlIGZvdW5kIHRoZSByZXF1ZXN0ZWQgc2VydmljZSAqLworCQkJaWYoZGFkZHIgIT0gREVWX0FERFJfQU5ZKSB7CisJCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgZGlzY292ZXJlZCBzZXJ2aWNlICcnJXMnJyBpbiB0d28gZGlmZmVyZW50IGRldmljZXMgISEhXG4iLAorCQkJCQkgICBfX0ZVTkNUSU9OX18sIG5hbWUpOworCQkJCXNlbGYtPmRhZGRyID0gREVWX0FERFJfQU5ZOworCQkJCWtmcmVlKGRpc2NvdmVyaWVzKTsKKwkJCQlyZXR1cm4oLUVOT1RVTklRKTsKKwkJCX0KKwkJCS8qIEZpcnN0IHRpbWUgd2UgZm91bmQgdGhhdCBvbmUsIHNhdmUgaXQgISAqLworCQkJZGFkZHIgPSBzZWxmLT5kYWRkcjsKKwkJCWR0c2FwX3NlbCA9IHNlbGYtPmR0c2FwX3NlbDsKKwkJCWJyZWFrOworCQljYXNlIC1FQUREUk5PVEFWQUlMOgorCQkJLyogUmVxdWVzdGVkIHNlcnZpY2Ugc2ltcGx5IGRvZXNuJ3QgZXhpc3Qgb24gdGhpcyBub2RlICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIFNvbWV0aGluZyBiYWQgZGlkIGhhcHBlbiA6LSggKi8KKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIHVuZXhwZWN0ZWQgSUFTIHF1ZXJ5IGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlzZWxmLT5kYWRkciA9IERFVl9BRERSX0FOWTsKKwkJCWtmcmVlKGRpc2NvdmVyaWVzKTsKKwkJCXJldHVybigtRUhPU1RVTlJFQUNIKTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIENsZWFudXAgb3VyIGNvcHkgb2YgdGhlIGRpc2NvdmVyeSBsb2cgKi8KKwlrZnJlZShkaXNjb3Zlcmllcyk7CisKKwkvKiBDaGVjayBvdXQgd2hhdCB3ZSBmb3VuZCAqLworCWlmKGRhZGRyID09IERFVl9BRERSX0FOWSkgeworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBjYW5ub3QgZGlzY292ZXIgc2VydmljZSAnJyVzJycgaW4gYW55IGRldmljZSAhISFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIG5hbWUpOworCQlzZWxmLT5kYWRkciA9IERFVl9BRERSX0FOWTsKKwkJcmV0dXJuKC1FQUREUk5PVEFWQUlMKTsKKwl9CisKKwkvKiBSZXZlcnQgYmFjayB0byBkaXNjb3ZlcmVkIGRldmljZSAmIHNlcnZpY2UgKi8KKwlzZWxmLT5kYWRkciA9IGRhZGRyOworCXNlbGYtPnNhZGRyID0gMHgwOworCXNlbGYtPmR0c2FwX3NlbCA9IGR0c2FwX3NlbDsKKworCUlSREFfREVCVUcoMSwgIiVzKCksIGRpc2NvdmVyZWQgcmVxdWVzdGVkIHNlcnZpY2UgJyclcycnIGF0IGFkZHJlc3MgJTA4eFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBuYW1lLCBzZWxmLT5kYWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZ2V0bmFtZSAoc29jaywgdWFkZHIsIHVhZGRyX2xlbiwgcGVlcikKKyAqCisgKiAgICBSZXR1cm4gdGhlIG91ciBvd24sIG9yIHBlZXJzIHNvY2tldCBhZGRyZXNzIChzb2NrYWRkcl9pcmRhKQorICoKKyAqLworc3RhdGljIGludCBpcmRhX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwKKwkJCWludCAqdWFkZHJfbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaXJkYSBzYWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmID0gaXJkYV9zayhzayk7CisKKwlpZiAocGVlcikgeworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJCXJldHVybiAtRU5PVENPTk47CisKKwkJc2FkZHIuc2lyX2ZhbWlseSA9IEFGX0lSREE7CisJCXNhZGRyLnNpcl9sc2FwX3NlbCA9IHNlbGYtPmR0c2FwX3NlbDsKKwkJc2FkZHIuc2lyX2FkZHIgPSBzZWxmLT5kYWRkcjsKKwl9IGVsc2UgeworCQlzYWRkci5zaXJfZmFtaWx5ID0gQUZfSVJEQTsKKwkJc2FkZHIuc2lyX2xzYXBfc2VsID0gc2VsZi0+c3RzYXBfc2VsOworCQlzYWRkci5zaXJfYWRkciA9IHNlbGYtPnNhZGRyOworCX0KKworCUlSREFfREVCVUcoMSwgIiVzKCksIHRzYXBfc2VsID0gJSN4XG4iLCBfX0ZVTkNUSU9OX18sIHNhZGRyLnNpcl9sc2FwX3NlbCk7CisJSVJEQV9ERUJVRygxLCAiJXMoKSwgYWRkciA9ICUwOHhcbiIsIF9fRlVOQ1RJT05fXywgc2FkZHIuc2lyX2FkZHIpOworCisJLyogdWFkZHJfbGVuIGNvbWUgdG8gdXMgdW5pbml0aWFsaXNlZCAqLworCSp1YWRkcl9sZW4gPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9pcmRhKTsKKwltZW1jcHkodWFkZHIsICZzYWRkciwgKnVhZGRyX2xlbik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfbGlzdGVuIChzb2NrLCBiYWNrbG9nKQorICoKKyAqICAgIEp1c3QgbW92ZSB0byB0aGUgbGlzdGVuIHN0YXRlCisgKgorICovCitzdGF0aWMgaW50IGlyZGFfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlmICgoc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0pICYmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkgJiYKKwkgICAgKHNrLT5za190eXBlICE9IFNPQ0tfREdSQU0pKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9MSVNURU4pIHsKKwkJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJCXNrLT5za19zdGF0ZSAgICAgICAgICAgPSBUQ1BfTElTVEVOOworCisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfYmluZCAoc29jaywgdWFkZHIsIGFkZHJfbGVuKQorICoKKyAqICAgIFVzZWQgYnkgc2VydmVycyB0byByZWdpc3RlciB0aGVpciB3ZWxsIGtub3duIFRTQVAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsIGludCBhZGRyX2xlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc29ja2FkZHJfaXJkYSAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaXJkYSAqKSB1YWRkcjsKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmID0gaXJkYV9zayhzayk7CisJaW50IGVycjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcyglcClcbiIsIF9fRlVOQ1RJT05fXywgc2VsZik7CisKKwlpZiAoYWRkcl9sZW4gIT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pcmRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQorCS8qIFNwZWNpYWwgY2FyZSBmb3IgVWx0cmEgc29ja2V0cyAqLworCWlmICgoc2stPnNrX3R5cGUgPT0gU09DS19ER1JBTSkgJiYKKwkgICAgKHNrLT5za19wcm90b2NvbCA9PSBJUkRBUFJPVE9fVUxUUkEpKSB7CisJCXNlbGYtPnBpZCA9IGFkZHItPnNpcl9sc2FwX3NlbDsKKwkJaWYgKHNlbGYtPnBpZCAmIDB4ODApIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIGV4dGVuc2lvbiBpbiBQSUQgbm90IHN1cHAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJCWVyciA9IGlyZGFfb3Blbl9sc2FwKHNlbGYsIHNlbGYtPnBpZCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQkvKiBQcmV0ZW5kIHdlIGFyZSBjb25uZWN0ZWQgKi8KKwkJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisJCXNrLT5za19zdGF0ZSAgID0gVENQX0VTVEFCTElTSEVEOworCisJCXJldHVybiAwOworCX0KKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9VTFRSQSAqLworCisJZXJyID0gaXJkYV9vcGVuX3RzYXAoc2VsZiwgYWRkci0+c2lyX2xzYXBfc2VsLCBhZGRyLT5zaXJfbmFtZSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiAgUmVnaXN0ZXIgd2l0aCBMTS1JQVMgKi8KKwlzZWxmLT5pYXNfb2JqID0gaXJpYXNfbmV3X29iamVjdChhZGRyLT5zaXJfbmFtZSwgamlmZmllcyk7CisJaXJpYXNfYWRkX2ludGVnZXJfYXR0cmliKHNlbGYtPmlhc19vYmosICJJckRBOlRpbnlUUDpMc2FwU2VsIiwKKwkJCQkgc2VsZi0+c3RzYXBfc2VsLCBJQVNfS0VSTkVMX0FUVFIpOworCWlyaWFzX2luc2VydF9vYmplY3Qoc2VsZi0+aWFzX29iaik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfYWNjZXB0IChzb2NrLCBuZXdzb2NrLCBmbGFncykKKyAqCisgKiAgICBXYWl0IGZvciBpbmNvbWluZyBjb25uZWN0aW9uCisgKgorICovCitzdGF0aWMgaW50IGlyZGFfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXJkYV9zb2NrICpuZXcsICpzZWxmID0gaXJkYV9zayhzayk7CisJc3RydWN0IHNvY2sgKm5ld3NrOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVycjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJZXJyID0gaXJkYV9jcmVhdGUobmV3c29jaywgc2stPnNrX3Byb3RvY29sKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHNvY2stPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoc2sgPSBzb2NrLT5zaykgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHNrLT5za190eXBlICE9IFNPQ0tfU1RSRUFNKSAmJiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpICYmCisJICAgIChzay0+c2tfdHlwZSAhPSBTT0NLX0RHUkFNKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICoJVGhlIHJlYWQgcXVldWUgdGhpcyB0aW1lIGlzIGhvbGRpbmcgc29ja2V0cyByZWFkeSB0byB1c2UKKwkgKglob29rZWQgaW50byB0aGUgU0FCTSB3ZSBzYXZlZAorCSAqLworCisJLyoKKwkgKiBXZSBjYW4gcGVyZm9ybSB0aGUgYWNjZXB0IG9ubHkgaWYgdGhlcmUgaXMgaW5jb21pbmcgZGF0YQorCSAqIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0LgorCSAqIFNvLCB3ZSB3aWxsIGJsb2NrIHRoZSBjYWxsZXIgdW50aWwgd2UgcmVjZWl2ZSBhbnkgZGF0YS4KKwkgKiBJZiB0aGUgY2FsbGVyIHdhcyB3YWl0aW5nIG9uIHNlbGVjdCgpIG9yIHBvbGwoKSBiZWZvcmUKKwkgKiBjYWxsaW5nIHVzLCB0aGUgZGF0YSBpcyB3YWl0aW5nIGZvciB1cyA7LSkKKwkgKiBKZWFuIElJCisJICovCisJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJaW50IHJldCA9IDA7CisJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXRxLCBjdXJyZW50KTsKKworCQkvKiBOb24gYmxvY2tpbmcgb3BlcmF0aW9uICovCisJCWlmIChmbGFncyAmIE9fTk9OQkxPQ0spCisJCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCisJCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBhIGN1dCduJ3Bhc3RlIG9mIHRoZQorCQkgKiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKSBtYWNyby4KKwkJICogV2UgZG9uJ3QgdXMgdGhlIG1hY3JvIGJlY2F1c2UgdGhlIGNvbmRpdGlvbiBoYXMKKwkJICogc2lkZSBlZmZlY3RzIDogd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBvbmx5IG9uZQorCQkgKiBza2IgZ2V0IGRlcXVldWVkIC0gSmVhbiBJSSAqLworCQlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0cSk7CisJCWZvciAoOzspIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQkJaWYgKHNrYiAhPSBOVUxMKQorCQkJCWJyZWFrOworCQkJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXNjaGVkdWxlKCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdHEpOworCQlpZihyZXQpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKworCW5ld3NrID0gbmV3c29jay0+c2s7CisJbmV3c2stPnNrX3N0YXRlID0gVENQX0VTVEFCTElTSEVEOworCisJbmV3ID0gaXJkYV9zayhuZXdzayk7CisJSVJEQV9BU1NFUlQobmV3ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJLyogTm93IGF0dGFjaCB1cCB0aGUgbmV3IHNvY2tldCAqLworCW5ldy0+dHNhcCA9IGlydHRwX2R1cChzZWxmLT50c2FwLCBuZXcpOworCWlmICghbmV3LT50c2FwKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGR1cCBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW5ldy0+c3RzYXBfc2VsID0gbmV3LT50c2FwLT5zdHNhcF9zZWw7CisJbmV3LT5kdHNhcF9zZWwgPSBuZXctPnRzYXAtPmR0c2FwX3NlbDsKKwluZXctPnNhZGRyID0gaXJ0dHBfZ2V0X3NhZGRyKG5ldy0+dHNhcCk7CisJbmV3LT5kYWRkciA9IGlydHRwX2dldF9kYWRkcihuZXctPnRzYXApOworCisJbmV3LT5tYXhfc2R1X3NpemVfdHggPSBzZWxmLT5tYXhfc2R1X3NpemVfdHg7CisJbmV3LT5tYXhfc2R1X3NpemVfcnggPSBzZWxmLT5tYXhfc2R1X3NpemVfcng7CisJbmV3LT5tYXhfZGF0YV9zaXplICAgPSBzZWxmLT5tYXhfZGF0YV9zaXplOworCW5ldy0+bWF4X2hlYWRlcl9zaXplID0gc2VsZi0+bWF4X2hlYWRlcl9zaXplOworCisJbWVtY3B5KCZuZXctPnFvc190eCwgJnNlbGYtPnFvc190eCwgc2l6ZW9mKHN0cnVjdCBxb3NfaW5mbykpOworCisJLyogQ2xlYW4gdXAgdGhlIG9yaWdpbmFsIG9uZSB0byBrZWVwIGl0IGluIGxpc3RlbiBzdGF0ZSAqLworCWlydHRwX2xpc3RlbihzZWxmLT50c2FwKTsKKworCS8qIFdvdyAhIFdoYXQgaXMgdGhhdCA/IEplYW4gSUkgKi8KKwlza2ItPnNrID0gTlVMTDsKKwlza2ItPmRlc3RydWN0b3IgPSBOVUxMOworCWtmcmVlX3NrYihza2IpOworCXNrLT5za19hY2tfYmFja2xvZy0tOworCisJbmV3c29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisKKwlpcmRhX2Nvbm5lY3RfcmVzcG9uc2UobmV3KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9jb25uZWN0IChzb2NrLCB1YWRkciwgYWRkcl9sZW4sIGZsYWdzKQorICoKKyAqICAgIENvbm5lY3QgdG8gYSBJckRBIGRldmljZQorICoKKyAqIFRoZSBtYWluIGRpZmZlcmVuY2Ugd2l0aCBhICJzdGFuZGFyZCIgY29ubmVjdCBpcyB0aGF0IHdpdGggSXJEQSB3ZSBuZWVkCisgKiB0byByZXNvbHZlIHRoZSBzZXJ2aWNlIG5hbWUgaW50byBhIFRTQVAgc2VsZWN0b3IgKGluIFRDUCwgcG9ydCBudW1iZXIKKyAqIGRvZXNuJ3QgaGF2ZSB0byBiZSByZXNvbHZlZCkuCisgKiBCZWNhdXNlIG9mIHRoaXMgc2VydmljZSBuYW1lIHJlc29sdGlvbiwgd2UgY2FuIG9mZmVyICJhdXRvLWNvbm5lY3QiLAorICogd2hlcmUgd2UgY29ubmVjdCB0byBhIHNlcnZpY2Ugd2l0aG91dCBzcGVjaWZ5aW5nIGEgZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqCisgKiBOb3RlIDogYnkgY29uc3VsdGluZyAiZXJybm8iLCB0aGUgdXNlciBzcGFjZSBjYWxsZXIgbWF5IGxlYXJuIHRoZSBjYXVzZQorICogb2YgdGhlIGZhaWx1cmUuIE1vc3Qgb2YgdGhlbSBhcmUgdmlzaWJsZSBpbiB0aGUgZnVuY3Rpb24sIG90aGVycyBtYXkgY29tZQorICogZnJvbSBzdWJyb3V0aW5lcyBjYWxsZWQgYW5kIGFyZSBsaXN0ZWQgaGVyZSA6CisgKglvIEVCVVNZIDogYWxyZWFkeSBwcm9jZXNzaW5nIGEgY29ubmVjdAorICoJbyBFSE9TVFVOUkVBQ0ggOiBiYWQgYWRkci0+c2lyX2FkZHIgYXJndW1lbnQKKyAqCW8gRUFERFJOT1RBVkFJTCA6IGJhZCBhZGRyLT5zaXJfbmFtZSBhcmd1bWVudAorICoJbyBFTk9UVU5JUSA6IG1vcmUgdGhhbiBvbmUgbm9kZSBoYXMgYWRkci0+c2lyX25hbWUgKGF1dG8tY29ubmVjdCkKKyAqCW8gRU5FVFVOUkVBQ0ggOiBubyBub2RlIGZvdW5kIG9uIHRoZSBuZXR3b3JrIChhdXRvLWNvbm5lY3QpCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCisJCQlpbnQgYWRkcl9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc29ja2FkZHJfaXJkYSAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaXJkYSAqKSB1YWRkcjsKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmID0gaXJkYV9zayhzayk7CisJaW50IGVycjsKKworCUlSREFfREVCVUcoMiwgIiVzKCVwKVxuIiwgX19GVU5DVElPTl9fLCBzZWxmKTsKKworCS8qIERvbid0IGFsbG93IGNvbm5lY3QgZm9yIFVsdHJhIHNvY2tldHMgKi8KKwlpZiAoKHNrLT5za190eXBlID09IFNPQ0tfREdSQU0pICYmIChzay0+c2tfcHJvdG9jb2wgPT0gSVJEQVBST1RPX1VMVFJBKSkKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCAmJiBzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNUSU5HKSB7CisJCXNvY2stPnN0YXRlID0gU1NfQ09OTkVDVEVEOworCQlyZXR1cm4gMDsgICAvKiBDb25uZWN0IGNvbXBsZXRlZCBkdXJpbmcgYSBFUkVTVEFSVFNZUyBldmVudCAqLworCX0KKworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFICYmIHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RJTkcpIHsKKwkJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQpCisJCXJldHVybiAtRUlTQ09OTjsgICAgICAvKiBObyByZWNvbm5lY3Qgb24gYSBzZXFwYWNrZXQgc29ja2V0ICovCisKKwlzay0+c2tfc3RhdGUgICA9IFRDUF9DTE9TRTsKKwlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCisJaWYgKGFkZHJfbGVuICE9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaXJkYSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgaWYgdXNlciBzdXBwbGllZCBhbnkgZGVzdGluYXRpb24gZGV2aWNlIGFkZHJlc3MgKi8KKwlpZiAoKCFhZGRyLT5zaXJfYWRkcikgfHwgKGFkZHItPnNpcl9hZGRyID09IERFVl9BRERSX0FOWSkpIHsKKwkJLyogVHJ5IHRvIGZpbmQgb25lIHN1aXRhYmxlICovCisJCWVyciA9IGlyZGFfZGlzY292ZXJfZGFkZHJfYW5kX2xzYXBfc2VsKHNlbGYsIGFkZHItPnNpcl9uYW1lKTsKKwkJaWYgKGVycikgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgYXV0by1jb25uZWN0IGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfSBlbHNlIHsKKwkJLyogVXNlIHRoZSBvbmUgcHJvdmlkZWQgYnkgdGhlIHVzZXIgKi8KKwkJc2VsZi0+ZGFkZHIgPSBhZGRyLT5zaXJfYWRkcjsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgZGFkZHIgPSAlMDh4XG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYtPmRhZGRyKTsKKworCQkvKiBJZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgc2VydmljZSBuYW1lLCB3ZSBhc3N1bWUgdGhlCisJCSAqIHVzZXIgd2FudCB0byBjb25uZWN0IG9uIGEgc3BlY2lmaWMgTFNBUC4gUHJldmVudAorCQkgKiB0aGUgdXNlIG9mIGludmFsaWQgTFNBUHMgKElyTE1QIDEuMSBwMTApLiBKZWFuIElJICovCisJCWlmKChhZGRyLT5zaXJfbmFtZVswXSAhPSAnXDAnKSB8fAorCQkgICAoYWRkci0+c2lyX2xzYXBfc2VsID49IDB4NzApKSB7CisJCQkvKiBRdWVyeSByZW1vdGUgTE0tSUFTIHVzaW5nIHNlcnZpY2UgbmFtZSAqLworCQkJZXJyID0gaXJkYV9maW5kX2xzYXBfc2VsKHNlbGYsIGFkZHItPnNpcl9uYW1lKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBjb25uZWN0IGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIERpcmVjdGx5IGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBMU0FQCisJCQkgKiBzcGVjaWZpZWQgYnkgdGhlIHNpcl9sc2FwIGZpZWxkLgorCQkJICogUGxlYXNlIHVzZSB3aXRoIGNhdXRpb24sIGluIElyREEgTFNBUHMgYXJlCisJCQkgKiBkeW5hbWljIGFuZCB0aGVyZSBpcyBubyAid2VsbC1rbm93biIgTFNBUC4gKi8KKwkJCXNlbGYtPmR0c2FwX3NlbCA9IGFkZHItPnNpcl9sc2FwX3NlbDsKKwkJfQorCX0KKworCS8qIENoZWNrIGlmIHdlIGhhdmUgb3BlbmVkIGEgbG9jYWwgVFNBUCAqLworCWlmICghc2VsZi0+dHNhcCkKKwkJaXJkYV9vcGVuX3RzYXAoc2VsZiwgTFNBUF9BTlksIGFkZHItPnNpcl9uYW1lKTsKKworCS8qIE1vdmUgdG8gY29ubmVjdGluZyBzb2NrZXQsIHN0YXJ0IHNlbmRpbmcgQ29ubmVjdCBSZXF1ZXN0cyAqLworCXNvY2stPnN0YXRlID0gU1NfQ09OTkVDVElORzsKKwlzay0+c2tfc3RhdGUgICA9IFRDUF9TWU5fU0VOVDsKKworCS8qIENvbm5lY3QgdG8gcmVtb3RlIGRldmljZSAqLworCWVyciA9IGlydHRwX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwLCBzZWxmLT5kdHNhcF9zZWwsCisJCQkJICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgTlVMTCwKKwkJCQkgICAgc2VsZi0+bWF4X3NkdV9zaXplX3J4LCBOVUxMKTsKKwlpZiAoZXJyKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGNvbm5lY3QgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBOb3cgdGhlIGxvb3AgKi8KKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCAmJiAoZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKKworCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKihzay0+c2tfc2xlZXApLAorCQkJCSAgICAgKHNrLT5za19zdGF0ZSAhPSBUQ1BfU1lOX1NFTlQpKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKSB7CisJCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisJCXJldHVybiBzb2NrX2Vycm9yKHNrKTsJLyogQWx3YXlzIHNldCBhdCB0aGlzIHBvaW50ICovCisJfQorCisJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisKKwkvKiBBdCB0aGlzIHBvaW50LCBJckxNUCBoYXMgYXNzaWduZWQgb3VyIHNvdXJjZSBhZGRyZXNzICovCisJc2VsZi0+c2FkZHIgPSBpcnR0cF9nZXRfc2FkZHIoc2VsZi0+dHNhcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwcm90byBpcmRhX3Byb3RvID0geworCS5uYW1lCSAgPSAiSVJEQSIsCisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUgPSBzaXplb2Yoc3RydWN0IGlyZGFfc29jayksCit9OworCisvKgorICogRnVuY3Rpb24gaXJkYV9jcmVhdGUgKHNvY2ssIHByb3RvY29sKQorICoKKyAqICAgIENyZWF0ZSBJckRBIHNvY2tldAorICoKKyAqLworc3RhdGljIGludCBpcmRhX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGY7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogQ2hlY2sgZm9yIHZhbGlkIHNvY2tldCB0eXBlICovCisJc3dpdGNoIChzb2NrLT50eXBlKSB7CisJY2FzZSBTT0NLX1NUUkVBTTogICAgIC8qIEZvciBUVFAgY29ubmVjdGlvbnMgd2l0aCBTQVIgZGlzYWJsZWQgKi8KKwljYXNlIFNPQ0tfU0VRUEFDS0VUOiAgLyogRm9yIFRUUCBjb25uZWN0aW9ucyB3aXRoIFNBUiBlbmFibGVkICovCisJY2FzZSBTT0NLX0RHUkFNOiAgICAgIC8qIEZvciBUVFAgVW5pdGRhdGEgb3IgTE1QIFVsdHJhIHRyYW5zZmVycyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBuZXR3b3JraW5nIHNvY2tldCAqLworCXNrID0gc2tfYWxsb2MoUEZfSVJEQSwgR0ZQX0FUT01JQywgJmlyZGFfcHJvdG8sIDEpOworCWlmIChzayA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNlbGYgPSBpcmRhX3NrKHNrKTsKKwlJUkRBX0RFQlVHKDIsICIlcygpIDogc2VsZiBpcyAlcFxuIiwgX19GVU5DVElPTl9fLCBzZWxmKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlbGYtPnF1ZXJ5X3dhaXQpOworCisJLyogSW5pdGlhbGlzZSBuZXR3b3JraW5nIHNvY2tldCBzdHJ1Y3QgKi8KKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CS8qIE5vdGUgOiBzZXQgc2stPnNrX3JlZmNudCB0byAxICovCisJc2stPnNrX2ZhbWlseSA9IFBGX0lSREE7CisJc2stPnNrX3Byb3RvY29sID0gcHJvdG9jb2w7CisKKwlzd2l0Y2ggKHNvY2stPnR5cGUpIHsKKwljYXNlIFNPQ0tfU1RSRUFNOgorCQlzb2NrLT5vcHMgPSAmaXJkYV9zdHJlYW1fb3BzOworCQlzZWxmLT5tYXhfc2R1X3NpemVfcnggPSBUVFBfU0FSX0RJU0FCTEU7CisJCWJyZWFrOworCWNhc2UgU09DS19TRVFQQUNLRVQ6CisJCXNvY2stPm9wcyA9ICZpcmRhX3NlcXBhY2tldF9vcHM7CisJCXNlbGYtPm1heF9zZHVfc2l6ZV9yeCA9IFRUUF9TQVJfVU5CT1VORDsKKwkJYnJlYWs7CisJY2FzZSBTT0NLX0RHUkFNOgorCQlzd2l0Y2ggKHByb3RvY29sKSB7CisjaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKKwkJY2FzZSBJUkRBUFJPVE9fVUxUUkE6CisJCQlzb2NrLT5vcHMgPSAmaXJkYV91bHRyYV9vcHM7CisJCQkvKiBJbml0aWFsaXNlIG5vdywgYmVjYXVzZSB3ZSBtYXkgc2VuZCBvbiB1bmJvdW5kCisJCQkgKiBzb2NrZXRzLiBKZWFuIElJICovCisJCQlzZWxmLT5tYXhfZGF0YV9zaXplID0gVUxUUkFfTUFYX0RBVEEgLSBMTVBfUElEX0hFQURFUjsKKwkJCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IElSREFfTUFYX0hFQURFUiArIExNUF9QSURfSEVBREVSOworCQkJYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KKwkJY2FzZSBJUkRBUFJPVE9fVU5JVERBVEE6CisJCQlzb2NrLT5vcHMgPSAmaXJkYV9kZ3JhbV9vcHM7CisJCQkvKiBXZSBsZXQgVW5pdGRhdGEgY29ubi4gYmUgbGlrZSBzZXFwYWNrIGNvbm4uICovCisJCQlzZWxmLT5tYXhfc2R1X3NpemVfcnggPSBUVFBfU0FSX1VOQk9VTkQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSREFfRVJST1IoIiVzOiBwcm90b2NvbCBub3Qgc3VwcG9ydGVkIVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisJfQorCisJLyogUmVnaXN0ZXIgYXMgYSBjbGllbnQgd2l0aCBJckxNUCAqLworCXNlbGYtPmNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9jbGllbnQoMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJc2VsZi0+bWFzay53b3JkID0gMHhmZmZmOworCXNlbGYtPnJ4X2Zsb3cgPSBzZWxmLT50eF9mbG93ID0gRkxPV19TVEFSVDsKKwlzZWxmLT5uc2xvdHMgPSBESVNDT1ZFUllfREVGQVVMVF9TTE9UUzsKKwlzZWxmLT5kYWRkciA9IERFVl9BRERSX0FOWTsJLyogVW50aWwgd2UgZ2V0IGNvbm5lY3RlZCAqLworCXNlbGYtPnNhZGRyID0gMHgwOwkJLyogc28gSXJMTVAgYXNzaWduIHVzIGFueSBsaW5rICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2Rlc3Ryb3lfc29ja2V0IChzZWxmKQorICoKKyAqICAgIERlc3Ryb3kgc29ja2V0CisgKgorICovCitzdGF0aWMgdm9pZCBpcmRhX2Rlc3Ryb3lfc29ja2V0KHN0cnVjdCBpcmRhX3NvY2sgKnNlbGYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIFVucmVnaXN0ZXIgd2l0aCBJckxNUCAqLworCWlybG1wX3VucmVnaXN0ZXJfY2xpZW50KHNlbGYtPmNrZXkpOworCWlybG1wX3VucmVnaXN0ZXJfc2VydmljZShzZWxmLT5za2V5KTsKKworCS8qIFVucmVnaXN0ZXIgd2l0aCBMTS1JQVMgKi8KKwlpZiAoc2VsZi0+aWFzX29iaikgeworCQlpcmlhc19kZWxldGVfb2JqZWN0KHNlbGYtPmlhc19vYmopOworCQlzZWxmLT5pYXNfb2JqID0gTlVMTDsKKwl9CisKKwlpZiAoc2VsZi0+aXJpYXApIHsKKwkJaXJpYXBfY2xvc2Uoc2VsZi0+aXJpYXApOworCQlzZWxmLT5pcmlhcCA9IE5VTEw7CisJfQorCisJaWYgKHNlbGYtPnRzYXApIHsKKwkJaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXAsIE5VTEwsIFBfTk9STUFMKTsKKwkJaXJ0dHBfY2xvc2VfdHNhcChzZWxmLT50c2FwKTsKKwkJc2VsZi0+dHNhcCA9IE5VTEw7CisJfQorI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCisJaWYgKHNlbGYtPmxzYXApIHsKKwkJaXJsbXBfY2xvc2VfbHNhcChzZWxmLT5sc2FwKTsKKwkJc2VsZi0+bHNhcCA9IE5VTEw7CisJfQorI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3JlbGVhc2UgKHNvY2spCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIGlmIChzayA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXNrLT5za19zdGF0ZSAgICAgICA9IFRDUF9DTE9TRTsKKwlzay0+c2tfc2h1dGRvd24gICB8PSBTRU5EX1NIVVRET1dOOworCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCisJLyogRGVzdHJveSBJckRBIHNvY2tldCAqLworCWlyZGFfZGVzdHJveV9zb2NrZXQoaXJkYV9zayhzaykpOworCisJc29ja19vcnBoYW4oc2spOworCXNvY2stPnNrICAgPSBOVUxMOworCisJLyogUHVyZ2UgcXVldWVzIChzZWUgc29ja19pbml0X2RhdGEoKSkgKi8KKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKworCS8qIERlc3Ryb3kgbmV0d29ya2luZyBzb2NrZXQgaWYgd2UgYXJlIHRoZSBsYXN0IHJlZmVyZW5jZSBvbiBpdCwKKwkgKiBpLmUuIGlmKHNrLT5za19yZWZjbnQgPT0gMCkgLT4gc2tfZnJlZShzaykgKi8KKwlzb2NrX3B1dChzayk7CisKKwkvKiBOb3RlcyBvbiBzb2NrZXQgbG9ja2luZyBhbmQgZGVhbGxvY2F0aW9uLi4uIC0gSmVhbiBJSQorCSAqIEluIHRoZW9yeSB3ZSBzaG91bGQgcHV0IHBhaXJzIG9mIHNvY2tfaG9sZCgpIC8gc29ja19wdXQoKSB0bworCSAqIHByZXZlbnQgdGhlIHNvY2tldCB0byBiZSBkZXN0cm95ZWQgd2hlbmV2ZXIgdGhlcmUgaXMgYW4KKwkgKiBvdXRzdGFuZGluZyByZXF1ZXN0IG9yIG91dHN0YW5kaW5nIGluY29taW5nIHBhY2tldCBvciBldmVudC4KKwkgKgorCSAqIDEpIFRoaXMgbWF5IGluY2x1ZGUgSUFTIHJlcXVlc3QsIGJvdGggaW4gY29ubmVjdCBhbmQgZ2V0c29ja29wdC4KKwkgKiBVbmZvcnR1bmF0ZWx5LCB0aGUgc2l0dWF0aW9uIGlzIGEgYml0IG1vcmUgbWVzc3kgdGhhbiBpdCBsb29rcywKKwkgKiBiZWNhdXNlIHdlIGNsb3NlIGlyaWFwIGFuZCBrZnJlZShzZWxmKSBhYm92ZS4KKwkgKgorCSAqIDIpIFRoaXMgbWF5IGluY2x1ZGUgc2VsZWN0aXZlIGRpc2NvdmVyeSBpbiBnZXRzb2Nrb3B0LgorCSAqIFNhbWUgc3R1ZmYgYXMgYWJvdmUsIGlybG1wIHJlZ2lzdHJhdGlvbiBhbmQgc2VsZiBhcmUgZ29uZS4KKwkgKgorCSAqIFByb2JhYmx5IDEgYW5kIDIgbWF5IG5vdCBtYXR0ZXIsIGJlY2F1c2UgaXQncyBhbGwgdHJpZ2dlcmVkCisJICogYnkgYSBwcm9jZXNzIGFuZCB0aGUgc29ja2V0IGxheWVyIGFscmVhZHkgcHJldmVudCB0aGUKKwkgKiBzb2NrZXQgdG8gZ28gYXdheSB3aGlsZSBhIHByb2Nlc3MgaXMgaG9sZGluZyBpdCwgdGhyb3VnaAorCSAqIHNvY2tmZF9wdXQoKSBhbmQgZnB1dCgpLi4uCisJICoKKwkgKiAzKSBUaGlzIG1heSBpbmNsdWRlIGRlZmVycmVkIFRTQVAgY2xvc3VyZS4gSW4gcGFydGljdWxhciwKKwkgKiB3ZSBtYXkgcmVjZWl2ZSBhIGxhdGUgaXJkYV9kaXNjb25uZWN0X2luZGljYXRpb24oKQorCSAqIEZvcnR1bmF0ZWx5LCAodHNhcF9jYiAqKS0+Y2xvc2VfcGVuZCBzaG91bGQgcHJvdGVjdCB1cworCSAqIGZyb20gdGhhdC4KKwkgKgorCSAqIEkgZGlkIHNvbWUgdGVzdGluZyBvbiBTTVAsIGFuZCBpdCBsb29rcyBzb2xpZC4gQW5kIHRoZSBzb2NrZXQKKwkgKiBtZW1vcnkgbGVhayBpcyBub3cgZ29uZS4uLiAtIEplYW4gSUkKKwkgKi8KKworICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfc2VuZG1zZyAoaW9jYiwgc29jaywgbXNnLCBsZW4pCisgKgorICogICAgU2VuZCBtZXNzYWdlIGRvd24gdG8gVGlueVRQLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGJvdGggU1RSRUFNIGFuZAorICogICAgU0VRUEFDSyBzZXJ2aWNlcy4gVGhpcyBpcyBwb3NzaWJsZSBzaW5jZSBpdCBmb3JjZXMgdGhlIGNsaWVudCB0bworICogICAgZnJhZ21lbnQgdGhlIG1lc3NhZ2UgaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyBpbnQgaXJkYV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqYXNtcHRyOworCWludCBlcnI7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBsZW49JXpkXG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CisKKwkvKiBOb3RlIDogc29ja2V0LmMgc2V0IE1TR19FT1Igb24gU0VRUEFDS0VUIHNvY2tldHMgKi8KKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiB+KE1TR19ET05UV0FJVHxNU0dfRU9SfE1TR19DTVNHX0NPTVBBVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNrLT5za19zaHV0ZG93biAmIFNFTkRfU0hVVERPV04pIHsKKwkJc2VuZF9zaWcoU0lHUElQRSwgY3VycmVudCwgMCk7CisJCXJldHVybiAtRVBJUEU7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpCisJCXJldHVybiAtRU5PVENPTk47CisKKwlzZWxmID0gaXJkYV9zayhzayk7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIENoZWNrIGlmIElyVFRQIGlzIHdhbnRzIHVzIHRvIHNsb3cgZG93biAqLworCisJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgqKHNrLT5za19zbGVlcCksCisJICAgIChzZWxmLT50eF9mbG93ICE9IEZMT1dfU1RPUCAgfHwgIHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCS8qIENoZWNrIGlmIHdlIGFyZSBzdGlsbCBjb25uZWN0ZWQgKi8KKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCS8qIENoZWNrIHRoYXQgd2UgZG9uJ3Qgc2VuZCBvdXQgdG8gYmlnIGZyYW1lcyAqLworCWlmIChsZW4gPiBzZWxmLT5tYXhfZGF0YV9zaXplKSB7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIENob3BwaW5nIGZyYW1lIGZyb20gJXpkIHRvICVkIGJ5dGVzIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgbGVuLCBzZWxmLT5tYXhfZGF0YV9zaXplKTsKKwkJbGVuID0gc2VsZi0+bWF4X2RhdGFfc2l6ZTsKKwl9CisKKwlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBsZW4gKyBzZWxmLT5tYXhfaGVhZGVyX3NpemUgKyAxNiwgCisJCQkJICBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PQlVGUzsKKworCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplICsgMTYpOworCisJYXNtcHRyID0gc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBsZW4pOworCWVyciA9IG1lbWNweV9mcm9taW92ZWMoYXNtcHRyLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJaWYgKGVycikgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIEp1c3Qgc2VuZCB0aGUgbWVzc2FnZSB0byBUaW55VFAsIGFuZCBsZXQgaXQgZGVhbCB3aXRoIHBvc3NpYmxlCisJICogZXJyb3JzLiBObyBuZWVkIHRvIGR1cGxpY2F0ZSBhbGwgdGhhdCBoZXJlCisJICovCisJZXJyID0gaXJ0dHBfZGF0YV9yZXF1ZXN0KHNlbGYtPnRzYXAsIHNrYik7CisJaWYgKGVycikgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBlcnI9JWRcbiIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLyogVGVsbCBjbGllbnQgaG93IG11Y2ggZGF0YSB3ZSBhY3R1YWxseSBzZW50ICovCisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfcmVjdm1zZ19kZ3JhbSAoaW9jYiwgc29jaywgbXNnLCBzaXplLCBmbGFncykKKyAqCisgKiAgICBUcnkgdG8gcmVjZWl2ZSBtZXNzYWdlIGFuZCBjb3B5IGl0IHRvIHVzZXIuIFRoZSBmcmFtZSBpcyBkaXNjYXJkZWQKKyAqICAgIGFmdGVyIGJlaW5nIHJlYWQsIHJlZ2FyZGxlc3Mgb2YgaG93IG11Y2ggdGhlIHVzZXIgYWN0dWFsbHkgcmVhZAorICovCitzdGF0aWMgaW50IGlyZGFfcmVjdm1zZ19kZ3JhbShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZiA9IGlyZGFfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2I7CisJc2l6ZV90IGNvcGllZDsKKwlpbnQgZXJyOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MgJiB+TVNHX0RPTlRXQUlULAorCQkJCWZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIGVycjsKKworCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJY29waWVkICAgICA9IHNrYi0+bGVuOworCisJaWYgKGNvcGllZCA+IHNpemUpIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgUmVjZWl2ZWQgdHJ1bmNhdGVkIGZyYW1lICglemQgPCAlemQpIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgY29waWVkLCBzaXplKTsKKwkJY29waWVkID0gc2l6ZTsKKwkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOworCX0KKwlza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKKworCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOworCisJLyoKKwkgKiAgQ2hlY2sgaWYgd2UgaGF2ZSBwcmV2aW91c2x5IHN0b3BwZWQgSXJUVFAgYW5kIHdlIGtub3cKKwkgKiAgaGF2ZSBtb3JlIGZyZWUgc3BhY2UgaW4gb3VyIHJ4X3F1ZXVlLiBJZiBzbyB0ZWxsIElyVFRQCisJICogIHRvIHN0YXJ0IGRlbGl2ZXJpbmcgZnJhbWVzIGFnYWluIGJlZm9yZSBvdXIgcnhfcXVldWUgZ2V0cworCSAqICBlbXB0eQorCSAqLworCWlmIChzZWxmLT5yeF9mbG93ID09IEZMT1dfU1RPUCkgeworCQlpZiAoKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPDwgMikgPD0gc2stPnNrX3JjdmJ1ZikgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgU3RhcnRpbmcgSXJUVFBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlzZWxmLT5yeF9mbG93ID0gRkxPV19TVEFSVDsKKwkJCWlydHRwX2Zsb3dfcmVxdWVzdChzZWxmLT50c2FwLCBGTE9XX1NUQVJUKTsKKwkJfQorCX0KKworCXJldHVybiBjb3BpZWQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3JlY3Ztc2dfc3RyZWFtIChpb2NiLCBzb2NrLCBtc2csIHNpemUsIGZsYWdzKQorICovCitzdGF0aWMgaW50IGlyZGFfcmVjdm1zZ19zdHJlYW0oc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmID0gaXJkYV9zayhzayk7CisJaW50IG5vYmxvY2sgPSBmbGFncyAmIE1TR19ET05UV0FJVDsKKwlzaXplX3QgY29waWVkID0gMDsKKwlpbnQgdGFyZ2V0ID0gMTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0cSwgY3VycmVudCk7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlmIChzb2NrLT5mbGFncyAmIF9fU09fQUNDRVBUQ09OKQorCQlyZXR1cm4oLUVJTlZBTCk7CisKKwlpZiAoZmxhZ3MgJiBNU0dfT09CKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoZmxhZ3MgJiBNU0dfV0FJVEFMTCkKKwkJdGFyZ2V0ID0gc2l6ZTsKKworCW1zZy0+bXNnX25hbWVsZW4gPSAwOworCisJZG8geworCQlpbnQgY2h1bms7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCisJCWlmIChza2I9PU5VTEwpIHsKKwkJCWludCByZXQgPSAwOworCisJCQlpZiAoY29waWVkID49IHRhcmdldCkKKwkJCQlicmVhazsKKworCQkJLyogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGEgY3V0J24ncGFzdGUgb2YgdGhlCisJCQkgKiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKSBtYWNyby4KKwkJCSAqIFdlIGRvbid0IHVzIHRoZSBtYWNybyBiZWNhdXNlIHRoZSB0ZXN0IGNvbmRpdGlvbgorCQkJICogaXMgbWVzc3kuIC0gSmVhbiBJSSAqLworCQkJc2V0X2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCQkJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdHEpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQkJLyoKKwkJCSAqCVBPU0lYIDEwMDMuMWcgbWFuZGF0ZXMgdGhpcyBvcmRlci4KKwkJCSAqLworCQkJaWYgKHNrLT5za19lcnIpCisJCQkJcmV0ID0gc29ja19lcnJvcihzayk7CisJCQllbHNlIGlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pCisJCQkJOworCQkJZWxzZSBpZiAobm9ibG9jaykKKwkJCQlyZXQgPSAtRUFHQUlOOworCQkJZWxzZSBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJZWxzZSBpZiAoc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSA9PSBOVUxMKQorCQkJCS8qIFdhaXQgcHJvY2VzcyB1bnRpbCBkYXRhIGFycml2ZXMgKi8KKwkJCQlzY2hlZHVsZSgpOworCisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXRxKTsKKwkJCWNsZWFyX2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCisJCQlpZihyZXQpCisJCQkJcmV0dXJuKHJldCk7CisJCQlpZiAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKQorCQkJCWJyZWFrOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWNodW5rID0gbWluX3QodW5zaWduZWQgaW50LCBza2ItPmxlbiwgc2l6ZSk7CisJCWlmIChtZW1jcHlfdG9pb3ZlYyhtc2ctPm1zZ19pb3YsIHNrYi0+ZGF0YSwgY2h1bmspKSB7CisJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCQlpZiAoY29waWVkID09IDApCisJCQkJY29waWVkID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWNvcGllZCArPSBjaHVuazsKKwkJc2l6ZSAtPSBjaHVuazsKKworCQkvKiBNYXJrIHJlYWQgcGFydCBvZiBza2IgYXMgdXNlZCAqLworCQlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgeworCQkJc2tiX3B1bGwoc2tiLCBjaHVuayk7CisKKwkJCS8qIHB1dCB0aGUgc2tiIGJhY2sgaWYgd2UgZGlkbid0IHVzZSBpdCB1cC4uICovCisJCQlpZiAoc2tiLT5sZW4pIHsKKwkJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBiYWNrIG9uIHEhXG4iLAorCQkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0gZWxzZSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpIHF1ZXN0aW9uYWJsZSE/XG4iLCBfX0ZVTkNUSU9OX18pOworCisJCQkvKiBwdXQgbWVzc2FnZSBiYWNrIGFuZCByZXR1cm4gKi8KKwkJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoc2l6ZSk7CisKKwkvKgorCSAqICBDaGVjayBpZiB3ZSBoYXZlIHByZXZpb3VzbHkgc3RvcHBlZCBJclRUUCBhbmQgd2Uga25vdworCSAqICBoYXZlIG1vcmUgZnJlZSBzcGFjZSBpbiBvdXIgcnhfcXVldWUuIElmIHNvIHRlbGwgSXJUVFAKKwkgKiAgdG8gc3RhcnQgZGVsaXZlcmluZyBmcmFtZXMgYWdhaW4gYmVmb3JlIG91ciByeF9xdWV1ZSBnZXRzCisJICogIGVtcHR5CisJICovCisJaWYgKHNlbGYtPnJ4X2Zsb3cgPT0gRkxPV19TVE9QKSB7CisJCWlmICgoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA8PCAyKSA8PSBzay0+c2tfcmN2YnVmKSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBTdGFydGluZyBJclRUUFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXNlbGYtPnJ4X2Zsb3cgPSBGTE9XX1NUQVJUOworCQkJaXJ0dHBfZmxvd19yZXF1ZXN0KHNlbGYtPnRzYXAsIEZMT1dfU1RBUlQpOworCQl9CisJfQorCisJcmV0dXJuIGNvcGllZDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfc2VuZG1zZ19kZ3JhbSAoaW9jYiwgc29jaywgbXNnLCBsZW4pCisgKgorICogICAgU2VuZCBtZXNzYWdlIGRvd24gdG8gVGlueVRQIGZvciB0aGUgdW5yZWxpYWJsZSBzZXF1ZW5jZWQKKyAqICAgIHBhY2tldCBzZXJ2aWNlLi4uCisgKgorICovCitzdGF0aWMgaW50IGlyZGFfc2VuZG1zZ19kZ3JhbShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKmFzbXB0cjsKKwlpbnQgZXJyOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbGVuPSV6ZFxuIiwgX19GVU5DVElPTl9fLCBsZW4pOworCisJaWYgKG1zZy0+bXNnX2ZsYWdzICYgfihNU0dfRE9OVFdBSVR8TVNHX0NNU0dfQ09NUEFUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikgeworCQlzZW5kX3NpZyhTSUdQSVBFLCBjdXJyZW50LCAwKTsKKwkJcmV0dXJuIC1FUElQRTsKKwl9CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCXNlbGYgPSBpcmRhX3NrKHNrKTsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJLyoKKwkgKiBDaGVjayB0aGF0IHdlIGRvbid0IHNlbmQgb3V0IHRvIGJpZyBmcmFtZXMuIFRoaXMgaXMgYW4gdW5yZWxpYWJsZQorCSAqIHNlcnZpY2UsIHNvIHdlIGhhdmUgbm8gZnJhZ21lbnRhdGlvbiBhbmQgbm8gY29hbGVzY2VuY2UKKwkgKi8KKwlpZiAobGVuID4gc2VsZi0+bWF4X2RhdGFfc2l6ZSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBXYXJuaW5nIHRvIG11Y2ggZGF0YSEgIgorCQkJICAgIkNob3BwaW5nIGZyYW1lIGZyb20gJXpkIHRvICVkIGJ5dGVzIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgbGVuLCBzZWxmLT5tYXhfZGF0YV9zaXplKTsKKwkJbGVuID0gc2VsZi0+bWF4X2RhdGFfc2l6ZTsKKwl9CisKKwlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBsZW4gKyBzZWxmLT5tYXhfaGVhZGVyX3NpemUsCisJCQkJICBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PQlVGUzsKKworCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIGFwcGVuZGluZyB1c2VyIGRhdGFcbiIsIF9fRlVOQ1RJT05fXyk7CisJYXNtcHRyID0gc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBsZW4pOworCWVyciA9IG1lbWNweV9mcm9taW92ZWMoYXNtcHRyLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJaWYgKGVycikgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIEp1c3Qgc2VuZCB0aGUgbWVzc2FnZSB0byBUaW55VFAsIGFuZCBsZXQgaXQgZGVhbCB3aXRoIHBvc3NpYmxlCisJICogZXJyb3JzLiBObyBuZWVkIHRvIGR1cGxpY2F0ZSBhbGwgdGhhdCBoZXJlCisJICovCisJZXJyID0gaXJ0dHBfdWRhdGFfcmVxdWVzdChzZWxmLT50c2FwLCBza2IpOworCWlmIChlcnIpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZXJyPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3NlbmRtc2dfdWx0cmEgKGlvY2IsIHNvY2ssIG1zZywgbGVuKQorICoKKyAqICAgIFNlbmQgbWVzc2FnZSBkb3duIHRvIElyTE1QIGZvciB0aGUgdW5yZWxpYWJsZSBVbHRyYQorICogICAgcGFja2V0IHNlcnZpY2UuLi4KKyAqLworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCitzdGF0aWMgaW50IGlyZGFfc2VuZG1zZ191bHRyYShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZjsKKwlfX3U4IHBpZCA9IDA7CisJaW50IGJvdW5kID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKmFzbXB0cjsKKwlpbnQgZXJyOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbGVuPSV6ZFxuIiwgX19GVU5DVElPTl9fLCBsZW4pOworCisJaWYgKG1zZy0+bXNnX2ZsYWdzICYgfihNU0dfRE9OVFdBSVR8TVNHX0NNU0dfQ09NUEFUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikgeworCQlzZW5kX3NpZyhTSUdQSVBFLCBjdXJyZW50LCAwKTsKKwkJcmV0dXJuIC1FUElQRTsKKwl9CisKKwlzZWxmID0gaXJkYV9zayhzayk7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIENoZWNrIGlmIGFuIGFkZHJlc3Mgd2FzIHNwZWNpZmllZCB3aXRoIHNlbmR0by4gSmVhbiBJSSAqLworCWlmIChtc2ctPm1zZ19uYW1lKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pcmRhICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pcmRhICopIG1zZy0+bXNnX25hbWU7CisJCS8qIENoZWNrIGFkZHJlc3MsIGV4dHJhY3QgcGlkLiBKZWFuIElJICovCisJCWlmIChtc2ctPm1zZ19uYW1lbGVuIDwgc2l6ZW9mKCphZGRyKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoYWRkci0+c2lyX2ZhbWlseSAhPSBBRl9JUkRBKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcGlkID0gYWRkci0+c2lyX2xzYXBfc2VsOworCQlpZiAocGlkICYgMHg4MCkgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZXh0ZW5zaW9uIGluIFBJRCBub3Qgc3VwcCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKwl9IGVsc2UgeworCQkvKiBDaGVjayB0aGF0IHRoZSBzb2NrZXQgaXMgcHJvcGVybHkgYm91bmQgdG8gYW4gVWx0cmEKKwkJICogcG9ydC4gSmVhbiBJSSAqLworCQlpZiAoKHNlbGYtPmxzYXAgPT0gTlVMTCkgfHwKKwkJICAgIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKSkgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgc29ja2V0IG5vdCBib3VuZCB0byBVbHRyYSBQSUQuXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVOT1RDT05OOworCQl9CisJCS8qIFVzZSBQSUQgZnJvbSBzb2NrZXQgKi8KKwkJYm91bmQgPSAxOworCX0KKworCS8qCisJICogQ2hlY2sgdGhhdCB3ZSBkb24ndCBzZW5kIG91dCB0byBiaWcgZnJhbWVzLiBUaGlzIGlzIGFuIHVucmVsaWFibGUKKwkgKiBzZXJ2aWNlLCBzbyB3ZSBoYXZlIG5vIGZyYWdtZW50YXRpb24gYW5kIG5vIGNvYWxlc2NlbmNlCisJICovCisJaWYgKGxlbiA+IHNlbGYtPm1heF9kYXRhX3NpemUpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgV2FybmluZyB0byBtdWNoIGRhdGEhICIKKwkJCSAgICJDaG9wcGluZyBmcmFtZSBmcm9tICV6ZCB0byAlZCBieXRlcyFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGxlbiwgc2VsZi0+bWF4X2RhdGFfc2l6ZSk7CisJCWxlbiA9IHNlbGYtPm1heF9kYXRhX3NpemU7CisJfQorCisJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgbGVuICsgc2VsZi0+bWF4X2hlYWRlcl9zaXplLAorCQkJCSAgbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlza2JfcmVzZXJ2ZShza2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBhcHBlbmRpbmcgdXNlciBkYXRhXG4iLCBfX0ZVTkNUSU9OX18pOworCWFzbXB0ciA9IHNrYi0+aC5yYXcgPSBza2JfcHV0KHNrYiwgbGVuKTsKKwllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKGFzbXB0ciwgbXNnLT5tc2dfaW92LCBsZW4pOworCWlmIChlcnIpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gaXJsbXBfY29ubmxlc3NfZGF0YV9yZXF1ZXN0KChib3VuZCA/IHNlbGYtPmxzYXAgOiBOVUxMKSwKKwkJCQkJICBza2IsIHBpZCk7CisJaWYgKGVycikgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBlcnI9JWRcbiIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9VTFRSQSAqLworCisvKgorICogRnVuY3Rpb24gaXJkYV9zaHV0ZG93biAoc2ssIGhvdykKKyAqLworc3RhdGljIGludCBpcmRhX3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3cpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZiA9IGlyZGFfc2soc2spOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCUlSREFfREVCVUcoMSwgIiVzKCVwKVxuIiwgX19GVU5DVElPTl9fLCBzZWxmKTsKKworCXNrLT5za19zdGF0ZSAgICAgICA9IFRDUF9DTE9TRTsKKwlzay0+c2tfc2h1dGRvd24gICB8PSBTRU5EX1NIVVRET1dOOworCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCisJaWYgKHNlbGYtPmlyaWFwKSB7CisJCWlyaWFwX2Nsb3NlKHNlbGYtPmlyaWFwKTsKKwkJc2VsZi0+aXJpYXAgPSBOVUxMOworCX0KKworCWlmIChzZWxmLT50c2FwKSB7CisJCWlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwLCBOVUxMLCBQX05PUk1BTCk7CisJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZi0+dHNhcCk7CisJCXNlbGYtPnRzYXAgPSBOVUxMOworCX0KKworCS8qIEEgZmV3IGNsZWFudXAgc28gdGhlIHNvY2tldCBsb29rIGFzIGdvb2QgYXMgbmV3Li4uICovCisJc2VsZi0+cnhfZmxvdyA9IHNlbGYtPnR4X2Zsb3cgPSBGTE9XX1NUQVJUOwkvKiBuZWVkZWQgPz8/ICovCisJc2VsZi0+ZGFkZHIgPSBERVZfQUREUl9BTlk7CS8qIFVudGlsIHdlIGdldCByZS1jb25uZWN0ZWQgKi8KKwlzZWxmLT5zYWRkciA9IDB4MDsJCS8qIHNvIElyTE1QIGFzc2lnbiB1cyBhbnkgbGluayAqLworCisgICAgICAgIHJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9wb2xsIChmaWxlLCBzb2NrLCB3YWl0KQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlyZGFfcG9sbChzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGYgPSBpcmRhX3NrKHNrKTsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlwb2xsX3dhaXQoZmlsZSwgc2stPnNrX3NsZWVwLCB3YWl0KTsKKwltYXNrID0gMDsKKworCS8qIEV4Y2VwdGlvbmFsIGV2ZW50cz8gKi8KKwlpZiAoc2stPnNrX2VycikKKwkJbWFzayB8PSBQT0xMRVJSOworCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgUE9MTEhVUFxuIiwgX19GVU5DVElPTl9fKTsKKwkJbWFzayB8PSBQT0xMSFVQOworCX0KKworCS8qIFJlYWRhYmxlPyAqLworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpIHsKKwkJSVJEQV9ERUJVRyg0LCAiU29ja2V0IGlzIHJlYWRhYmxlXG4iKTsKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKworCS8qIENvbm5lY3Rpb24tYmFzZWQgbmVlZCB0byBjaGVjayBmb3IgdGVybWluYXRpb24gYW5kIHN0YXJ0dXAgKi8KKwlzd2l0Y2ggKHNrLT5za190eXBlKSB7CisJY2FzZSBTT0NLX1NUUkVBTToKKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UpIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIFBPTExIVVBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQltYXNrIHw9IFBPTExIVVA7CisJCX0KKworCQlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCkgeworCQkJaWYgKChzZWxmLT50eF9mbG93ID09IEZMT1dfU1RBUlQpICYmCisJCQkgICAgc29ja193cml0ZWFibGUoc2spKQorCQkJeworCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk0gfCBQT0xMV1JCQU5EOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgU09DS19TRVFQQUNLRVQ6CisJCWlmICgoc2VsZi0+dHhfZmxvdyA9PSBGTE9XX1NUQVJUKSAmJgorCQkgICAgc29ja193cml0ZWFibGUoc2spKQorCQl7CisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNIHwgUE9MTFdSQkFORDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNPQ0tfREdSQU06CisJCWlmIChzb2NrX3dyaXRlYWJsZShzaykpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNIHwgUE9MTFdSQkFORDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBtYXNrOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9pb2N0bCAoc29jaywgY21kLCBhcmcpCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIGNtZD0lI3hcbiIsIF9fRlVOQ1RJT05fXywgY21kKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DT1VUUTogeworCQlsb25nIGFtb3VudDsKKwkJYW1vdW50ID0gc2stPnNrX3NuZGJ1ZiAtIGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYyk7CisJCWlmIChhbW91bnQgPCAwKQorCQkJYW1vdW50ID0gMDsKKwkJaWYgKHB1dF91c2VyKGFtb3VudCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVElPQ0lOUTogeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlsb25nIGFtb3VudCA9IDBMOworCQkvKiBUaGVzZSB0d28gYXJlIHNhZmUgb24gYSBzaW5nbGUgQ1BVIHN5c3RlbSBhcyBvbmx5IHVzZXIgdGFza3MgZmlkZGxlIGhlcmUgKi8KKwkJaWYgKChza2IgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpKSAhPSBOVUxMKQorCQkJYW1vdW50ID0gc2tiLT5sZW47CisJCWlmIChwdXRfdXNlcihhbW91bnQsICh1bnNpZ25lZCBpbnQgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFNJT0NHU1RBTVA6CisJCWlmIChzayAhPSBOVUxMKQorCQkJcmV0dXJuIHNvY2tfZ2V0X3RpbWVzdGFtcChzaywgKHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqKWFyZyk7CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBTSU9DR0lGQUREUjoKKwljYXNlIFNJT0NTSUZBRERSOgorCWNhc2UgU0lPQ0dJRkRTVEFERFI6CisJY2FzZSBTSU9DU0lGRFNUQUREUjoKKwljYXNlIFNJT0NHSUZCUkRBRERSOgorCWNhc2UgU0lPQ1NJRkJSREFERFI6CisJY2FzZSBTSU9DR0lGTkVUTUFTSzoKKwljYXNlIFNJT0NTSUZORVRNQVNLOgorCWNhc2UgU0lPQ0dJRk1FVFJJQzoKKwljYXNlIFNJT0NTSUZNRVRSSUM6CisJCXJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMSwgIiVzKCksIGRvaW5nIGRldmljZSBpb2N0bCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBkZXZfaW9jdGwoY21kLCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwl9CisKKwkvKk5PVFJFQUNIRUQqLworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9zZXRzb2Nrb3B0IChzb2NrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pCisgKgorICogICAgU2V0IHNvbWUgb3B0aW9ucyBmb3IgdGhlIHNvY2tldAorICoKKyAqLworc3RhdGljIGludCBpcmRhX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZiA9IGlyZGFfc2soc2spOworCXN0cnVjdCBpcmRhX2lhc19zZXQgICAgKmlhc19vcHQ7CisJc3RydWN0IGlhc19vYmplY3QgICAgICAqaWFzX29iajsKKwlzdHJ1Y3QgaWFzX2F0dHJpYiAqCWlhc19hdHRyOwkvKiBBdHRyaWJ1dGUgaW4gSUFTIG9iamVjdCAqLworCWludCBvcHQ7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOworCisJaWYgKGxldmVsICE9IFNPTF9JUkxNUCkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgSVJMTVBfSUFTX1NFVDoKKwkJLyogVGhlIHVzZXIgd2FudCB0byBhZGQgYW4gYXR0cmlidXRlIHRvIGFuIGV4aXN0aW5nIElBUyBvYmplY3QKKwkJICogKGluIHRoZSBJQVMgZGF0YWJhc2UpIG9yIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGlzCisJCSAqIGF0dHJpYnV0ZS4KKwkJICogV2UgZmlyc3QgcXVlcnkgSUFTIHRvIGtub3cgaWYgdGhlIG9iamVjdCBleGlzdCwgYW5kIHRoZW4KKwkJICogY3JlYXRlIHRoZSByaWdodCBhdHRyaWJ1dGUuLi4KKwkJICovCisKKwkJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IGlyZGFfaWFzX3NldCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpYXNfb3B0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlyZGFfaWFzX3NldCksIEdGUF9BVE9NSUMpOworCQlpZiAoaWFzX29wdCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogQ29weSBxdWVyeSB0byB0aGUgZHJpdmVyLiAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoaWFzX29wdCwgb3B0dmFsLCBvcHRsZW4pKSB7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJLyogRmluZCB0aGUgb2JqZWN0IHdlIHRhcmdldC4KKwkJICogSWYgdGhlIHVzZXIgZ2l2ZXMgdXMgYW4gZW1wdHkgc3RyaW5nLCB3ZSB1c2UgdGhlIG9iamVjdAorCQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzb2NrZXQuIFRoaXMgd2lsbCB3b3JrYXJvdW5kCisJCSAqIGR1cGxpY2F0ZWQgY2xhc3MgbmFtZSAtIEplYW4gSUkgKi8KKwkJaWYoaWFzX29wdC0+aXJkYV9jbGFzc19uYW1lWzBdID09ICdcMCcpIHsKKwkJCWlmKHNlbGYtPmlhc19vYmogPT0gTlVMTCkgeworCQkJCWtmcmVlKGlhc19vcHQpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWFzX29iaiA9IHNlbGYtPmlhc19vYmo7CisJCX0gZWxzZQorCQkJaWFzX29iaiA9IGlyaWFzX2ZpbmRfb2JqZWN0KGlhc19vcHQtPmlyZGFfY2xhc3NfbmFtZSk7CisKKwkJLyogT25seSBST09UIGNhbiBtZXNzIHdpdGggdGhlIGdsb2JhbCBJQVMgZGF0YWJhc2UuCisJCSAqIFVzZXJzIGNhbiBvbmx5IGFkZCBhdHRyaWJ1dGVzIHRvIHRoZSBvYmplY3QgYXNzb2NpYXRlZAorCQkgKiB3aXRoIHRoZSBzb2NrZXQgdGhleSBvd24gLSBKZWFuIElJICovCisJCWlmKCghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgJiYKKwkJICAgKChpYXNfb2JqID09IE5VTEwpIHx8IChpYXNfb2JqICE9IHNlbGYtPmlhc19vYmopKSkgeworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisKKwkJLyogSWYgdGhlIG9iamVjdCBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgaXQgKi8KKwkJaWYoaWFzX29iaiA9PSAoc3RydWN0IGlhc19vYmplY3QgKikgTlVMTCkgeworCQkJLyogQ3JlYXRlIGEgbmV3IG9iamVjdCAqLworCQkJaWFzX29iaiA9IGlyaWFzX25ld19vYmplY3QoaWFzX29wdC0+aXJkYV9jbGFzc19uYW1lLAorCQkJCQkJICAgamlmZmllcyk7CisJCX0KKworCQkvKiBEbyB3ZSBoYXZlIHRoZSBhdHRyaWJ1dGUgYWxyZWFkeSA/ICovCisJCWlmKGlyaWFzX2ZpbmRfYXR0cmliKGlhc19vYmosIGlhc19vcHQtPmlyZGFfYXR0cmliX25hbWUpKSB7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogTG9vayBhdCB0aGUgdHlwZSAqLworCQlzd2l0Y2goaWFzX29wdC0+aXJkYV9hdHRyaWJfdHlwZSkgeworCQljYXNlIElBU19JTlRFR0VSOgorCQkJLyogQWRkIGFuIGludGVnZXIgYXR0cmlidXRlICovCisJCQlpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIoCisJCQkJaWFzX29iaiwKKwkJCQlpYXNfb3B0LT5pcmRhX2F0dHJpYl9uYW1lLAorCQkJCWlhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9pbnQsCisJCQkJSUFTX1VTRVJfQVRUUik7CisJCQlicmVhazsKKwkJY2FzZSBJQVNfT0NUX1NFUToKKwkJCS8qIENoZWNrIGxlbmd0aCAqLworCQkJaWYoaWFzX29wdC0+YXR0cmlidXRlLmlyZGFfYXR0cmliX29jdGV0X3NlcS5sZW4gPgorCQkJICAgSUFTX01BWF9PQ1RFVF9TVFJJTkcpIHsKKwkJCQlrZnJlZShpYXNfb3B0KTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCS8qIEFkZCBhbiBvY3RldCBzZXF1ZW5jZSBhdHRyaWJ1dGUgKi8KKwkJCWlyaWFzX2FkZF9vY3RzZXFfYXR0cmliKAorCQkJICAgICAgaWFzX29iaiwKKwkJCSAgICAgIGlhc19vcHQtPmlyZGFfYXR0cmliX25hbWUsCisJCQkgICAgICBpYXNfb3B0LT5hdHRyaWJ1dGUuaXJkYV9hdHRyaWJfb2N0ZXRfc2VxLm9jdGV0X3NlcSwKKwkJCSAgICAgIGlhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9vY3RldF9zZXEubGVuLAorCQkJICAgICAgSUFTX1VTRVJfQVRUUik7CisJCQlicmVhazsKKwkJY2FzZSBJQVNfU1RSSU5HOgorCQkJLyogU2hvdWxkIGNoZWNrIGNoYXJzZXQgJiBjbyAqLworCQkJLyogQ2hlY2sgbGVuZ3RoICovCisJCQkvKiBUaGUgbGVuZ3RoIGlzIGVuY29kZWQgaW4gYSBfX3U4LCBhbmQKKwkJCSAqIElBU19NQVhfU1RSSU5HID09IDI1Niwgc28gdGhlcmUgaXMgbm8gd2F5CisJCQkgKiB1c2Vyc3BhY2UgY2FuIHBhc3MgdXMgYSBzdHJpbmcgdG9vIGxhcmdlLgorCQkJICogSmVhbiBJSSAqLworCQkJLyogTlVMTCB0ZXJtaW5hdGUgdGhlIHN0cmluZyAoYXZvaWQgdHJvdWJsZXMpICovCisJCQlpYXNfb3B0LT5hdHRyaWJ1dGUuaXJkYV9hdHRyaWJfc3RyaW5nLnN0cmluZ1tpYXNfb3B0LT5hdHRyaWJ1dGUuaXJkYV9hdHRyaWJfc3RyaW5nLmxlbl0gPSAnXDAnOworCQkJLyogQWRkIGEgc3RyaW5nIGF0dHJpYnV0ZSAqLworCQkJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIoCisJCQkJaWFzX29iaiwKKwkJCQlpYXNfb3B0LT5pcmRhX2F0dHJpYl9uYW1lLAorCQkJCWlhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9zdHJpbmcuc3RyaW5nLAorCQkJCUlBU19VU0VSX0FUVFIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQgOgorCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpcmlhc19pbnNlcnRfb2JqZWN0KGlhc19vYmopOworCQlrZnJlZShpYXNfb3B0KTsKKwkJYnJlYWs7CisJY2FzZSBJUkxNUF9JQVNfREVMOgorCQkvKiBUaGUgdXNlciB3YW50IHRvIGRlbGV0ZSBhbiBvYmplY3QgZnJvbSBvdXIgbG9jYWwgSUFTCisJCSAqIGRhdGFiYXNlLiBXZSBqdXN0IG5lZWQgdG8gcXVlcnkgdGhlIElBUywgY2hlY2sgaXMgdGhlCisJCSAqIG9iamVjdCBpcyBub3Qgb3duZWQgYnkgdGhlIGtlcm5lbCBhbmQgZGVsZXRlIGl0LgorCQkgKi8KKworCQlpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3QgaXJkYV9pYXNfc2V0KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlhc19vcHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJkYV9pYXNfc2V0KSwgR0ZQX0FUT01JQyk7CisJCWlmIChpYXNfb3B0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBDb3B5IHF1ZXJ5IHRvIHRoZSBkcml2ZXIuICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihpYXNfb3B0LCBvcHR2YWwsIG9wdGxlbikpIHsKKwkJCWtmcmVlKGlhc19vcHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBGaW5kIHRoZSBvYmplY3Qgd2UgdGFyZ2V0LgorCQkgKiBJZiB0aGUgdXNlciBnaXZlcyB1cyBhbiBlbXB0eSBzdHJpbmcsIHdlIHVzZSB0aGUgb2JqZWN0CisJCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvY2tldC4gVGhpcyB3aWxsIHdvcmthcm91bmQKKwkJICogZHVwbGljYXRlZCBjbGFzcyBuYW1lIC0gSmVhbiBJSSAqLworCQlpZihpYXNfb3B0LT5pcmRhX2NsYXNzX25hbWVbMF0gPT0gJ1wwJykKKwkJCWlhc19vYmogPSBzZWxmLT5pYXNfb2JqOworCQllbHNlCisJCQlpYXNfb2JqID0gaXJpYXNfZmluZF9vYmplY3QoaWFzX29wdC0+aXJkYV9jbGFzc19uYW1lKTsKKwkJaWYoaWFzX29iaiA9PSAoc3RydWN0IGlhc19vYmplY3QgKikgTlVMTCkgeworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIE9ubHkgUk9PVCBjYW4gbWVzcyB3aXRoIHRoZSBnbG9iYWwgSUFTIGRhdGFiYXNlLgorCQkgKiBVc2VycyBjYW4gb25seSBkZWwgYXR0cmlidXRlcyBmcm9tIHRoZSBvYmplY3QgYXNzb2NpYXRlZAorCQkgKiB3aXRoIHRoZSBzb2NrZXQgdGhleSBvd24gLSBKZWFuIElJICovCisJCWlmKCghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgJiYKKwkJICAgKChpYXNfb2JqID09IE5VTEwpIHx8IChpYXNfb2JqICE9IHNlbGYtPmlhc19vYmopKSkgeworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisKKwkJLyogRmluZCB0aGUgYXR0cmlidXRlIChpbiB0aGUgb2JqZWN0KSB3ZSB0YXJnZXQgKi8KKwkJaWFzX2F0dHIgPSBpcmlhc19maW5kX2F0dHJpYihpYXNfb2JqLAorCQkJCQkgICAgIGlhc19vcHQtPmlyZGFfYXR0cmliX25hbWUpOworCQlpZihpYXNfYXR0ciA9PSAoc3RydWN0IGlhc19hdHRyaWIgKikgTlVMTCkgeworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIENoZWNrIGlzIHRoZSB1c2VyIHNwYWNlIG93biB0aGUgb2JqZWN0ICovCisJCWlmKGlhc19hdHRyLT52YWx1ZS0+b3duZXIgIT0gSUFTX1VTRVJfQVRUUikgeworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgYXR0ZW1wdGluZyB0byBkZWxldGUgYSBrZXJuZWwgYXR0cmlidXRlXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisKKwkJLyogUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgKGFuZCBtYXliZSB0aGUgb2JqZWN0KSAqLworCQlpcmlhc19kZWxldGVfYXR0cmliKGlhc19vYmosIGlhc19hdHRyLCAxKTsKKwkJa2ZyZWUoaWFzX29wdCk7CisJCWJyZWFrOworCWNhc2UgSVJMTVBfTUFYX1NEVV9TSVpFOgorCQlpZiAob3B0bGVuIDwgc2l6ZW9mKGludCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoZ2V0X3VzZXIob3B0LCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBPbmx5IHBvc3NpYmxlIGZvciBhIHNlcXBhY2tldCBzZXJ2aWNlIChUVFAgd2l0aCBTQVIpICovCisJCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgc2V0dGluZyBtYXhfc2R1X3NpemUgPSAlZFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIG9wdCk7CisJCQlzZWxmLT5tYXhfc2R1X3NpemVfcnggPSBvcHQ7CisJCX0gZWxzZSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzOiBub3QgYWxsb3dlZCB0byBzZXQgTUFYU0RVU0laRSBmb3IgdGhpcyBzb2NrZXQgdHlwZSFcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwkJfQorCQlicmVhazsKKwljYXNlIElSTE1QX0hJTlRTX1NFVDoKKwkJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogVGhlIGlucHV0IGlzIHJlYWxseSBhIChfX3U4IGhpbnRzWzJdKSwgZWFzaWVyIGFzIGFuIGludCAqLworCQlpZiAoZ2V0X3VzZXIob3B0LCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBVbnJlZ2lzdGVyIGFueSBvbGQgcmVnaXN0cmF0aW9uICovCisJCWlmIChzZWxmLT5za2V5KQorCQkJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNlbGYtPnNrZXkpOworCisJCXNlbGYtPnNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlKChfX3UxNikgb3B0KTsKKwkJYnJlYWs7CisJY2FzZSBJUkxNUF9ISU5UX01BU0tfU0VUOgorCQkvKiBBcyBvcHBvc2VkIHRvIHRoZSBwcmV2aW91cyBjYXNlIHdoaWNoIHNldCB0aGUgaGludCBiaXRzCisJCSAqIHRoYXQgd2UgYWR2ZXJ0aXNlLCB0aGlzIG9uZSBzZXQgdGhlIGZpbHRlciB3ZSB1c2Ugd2hlbgorCQkgKiBtYWtpbmcgYSBkaXNjb3ZlcnkgKG5vZGVzIHdoaWNoIGRvbid0IG1hdGNoIGFueSBoaW50CisJCSAqIGJpdCBpbiB0aGUgbWFzayBhcmUgbm90IHJlcG9ydGVkKS4KKwkJICovCisJCWlmIChvcHRsZW4gPCBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIFRoZSBpbnB1dCBpcyByZWFsbHkgYSAoX191OCBoaW50c1syXSksIGVhc2llciBhcyBhbiBpbnQgKi8KKwkJaWYgKGdldF91c2VyKG9wdCwgKGludCBfX3VzZXIgKilvcHR2YWwpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLyogU2V0IHRoZSBuZXcgaGludCBtYXNrICovCisJCXNlbGYtPm1hc2sud29yZCA9IChfX3UxNikgb3B0OworCQkvKiBNYXNrIG91dCBleHRlbnNpb24gYml0cyAqLworCQlzZWxmLT5tYXNrLndvcmQgJj0gMHg3ZjdmOworCQkvKiBDaGVjayBpZiBubyBiaXRzICovCisJCWlmKCFzZWxmLT5tYXNrLndvcmQpCisJCQlzZWxmLT5tYXNrLndvcmQgPSAweEZGRkY7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2V4dHJhY3RfaWFzX3ZhbHVlKGlhc19vcHQsIGlhc192YWx1ZSkKKyAqCisgKiAgICBUcmFuc2xhdGUgaW50ZXJuYWwgSUFTIHZhbHVlIHN0cnVjdHVyZSB0byB0aGUgdXNlciBzcGFjZSByZXByZXNlbnRhdGlvbgorICoKKyAqIFRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBJQVMgdmFsdWVzLCBhcyB3ZSBleGNoYW5nZSB0aGVtIHdpdGgKKyAqIHVzZXIgc3BhY2UgcHJvZ3JhbSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24sCisgKiBhcyBzdG9yZWQgaW4gdGhlIElBUyBkYXRhYmFzZSAoYmVjYXVzZSB3ZSBuZWVkIGEgZmxhdCBzdHJ1Y3R1cmUgZm9yCisgKiBjcm9zc2luZyBrZXJuZWwgYm91bmRhcnkpLgorICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm0gdGhlIGZvcm1lciBpbiB0aGUgbGF0dGVyLiBXZSBhbHNvIGNoZWNrCisgKiB0aGF0IHRoZSB2YWx1ZSB0eXBlIGlzIHZhbGlkLgorICovCitzdGF0aWMgaW50IGlyZGFfZXh0cmFjdF9pYXNfdmFsdWUoc3RydWN0IGlyZGFfaWFzX3NldCAqaWFzX29wdCwKKwkJCQkgIHN0cnVjdCBpYXNfdmFsdWUgKmlhc192YWx1ZSkKK3sKKwkvKiBMb29rIGF0IHRoZSB0eXBlICovCisJc3dpdGNoIChpYXNfdmFsdWUtPnR5cGUpIHsKKwljYXNlIElBU19JTlRFR0VSOgorCQkvKiBDb3B5IHRoZSBpbnRlZ2VyICovCisJCWlhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9pbnQgPSBpYXNfdmFsdWUtPnQuaW50ZWdlcjsKKwkJYnJlYWs7CisJY2FzZSBJQVNfT0NUX1NFUToKKwkJLyogU2V0IGxlbmd0aCAqLworCQlpYXNfb3B0LT5hdHRyaWJ1dGUuaXJkYV9hdHRyaWJfb2N0ZXRfc2VxLmxlbiA9IGlhc192YWx1ZS0+bGVuOworCQkvKiBDb3B5IG92ZXIgKi8KKwkJbWVtY3B5KGlhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9vY3RldF9zZXEub2N0ZXRfc2VxLAorCQkgICAgICAgaWFzX3ZhbHVlLT50Lm9jdF9zZXEsIGlhc192YWx1ZS0+bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBJQVNfU1RSSU5HOgorCQkvKiBTZXQgbGVuZ3RoICovCisJCWlhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9zdHJpbmcubGVuID0gaWFzX3ZhbHVlLT5sZW47CisJCWlhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9zdHJpbmcuY2hhcnNldCA9IGlhc192YWx1ZS0+Y2hhcnNldDsKKwkJLyogQ29weSBvdmVyICovCisJCW1lbWNweShpYXNfb3B0LT5hdHRyaWJ1dGUuaXJkYV9hdHRyaWJfc3RyaW5nLnN0cmluZywKKwkJICAgICAgIGlhc192YWx1ZS0+dC5zdHJpbmcsIGlhc192YWx1ZS0+bGVuKTsKKwkJLyogTlVMTCB0ZXJtaW5hdGUgdGhlIHN0cmluZyAoYXZvaWQgdHJvdWJsZXMpICovCisJCWlhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9zdHJpbmcuc3RyaW5nW2lhc192YWx1ZS0+bGVuXSA9ICdcMCc7CisJCWJyZWFrOworCWNhc2UgSUFTX01JU1NJTkc6CisJZGVmYXVsdCA6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENvcHkgdHlwZSBvdmVyICovCisJaWFzX29wdC0+aXJkYV9hdHRyaWJfdHlwZSA9IGlhc192YWx1ZS0+dHlwZTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9nZXRzb2Nrb3B0IChzb2NrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZiA9IGlyZGFfc2soc2spOworCXN0cnVjdCBpcmRhX2RldmljZV9saXN0IGxpc3Q7CisJc3RydWN0IGlyZGFfZGV2aWNlX2luZm8gKmRpc2NvdmVyaWVzOworCXN0cnVjdCBpcmRhX2lhc19zZXQgKglpYXNfb3B0OwkvKiBJQVMgZ2V0L3F1ZXJ5IHBhcmFtcyAqLworCXN0cnVjdCBpYXNfb2JqZWN0ICoJaWFzX29iajsJLyogT2JqZWN0IGluIElBUyAqLworCXN0cnVjdCBpYXNfYXR0cmliICoJaWFzX2F0dHI7CS8qIEF0dHJpYnV0ZSBpbiBJQVMgb2JqZWN0ICovCisJaW50IGRhZGRyID0gREVWX0FERFJfQU5ZOwkvKiBEZXN0IGFkZHJlc3MgZm9yIElBUyBxdWVyaWVzICovCisJaW50IHZhbCA9IDA7CisJaW50IGxlbiA9IDA7CisJaW50IGVycjsKKwlpbnQgb2Zmc2V0LCB0b3RhbDsKKworCUlSREFfREVCVUcoMiwgIiVzKCVwKVxuIiwgX19GVU5DVElPTl9fLCBzZWxmKTsKKworCWlmIChsZXZlbCAhPSBTT0xfSVJMTVApCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmKGxlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBJUkxNUF9FTlVNREVWSUNFUzoKKwkJLyogQXNrIGxtcCBmb3IgdGhlIGN1cnJlbnQgZGlzY292ZXJ5IGxvZyAqLworCQlkaXNjb3ZlcmllcyA9IGlybG1wX2dldF9kaXNjb3ZlcmllcygmbGlzdC5sZW4sIHNlbGYtPm1hc2sud29yZCwKKwkJCQkJCSAgICBzZWxmLT5uc2xvdHMpOworCQkvKiBDaGVjayBpZiB0aGUgd2UgZ290IHNvbWUgcmVzdWx0cyAqLworCQlpZiAoZGlzY292ZXJpZXMgPT0gTlVMTCkKKwkJCXJldHVybiAtRUFHQUlOOwkJLyogRGlkbid0IGZpbmQgYW55IGRldmljZXMgKi8KKwkJZXJyID0gMDsKKworCQkvKiBXcml0ZSB0b3RhbCBsaXN0IGxlbmd0aCBiYWNrIHRvIGNsaWVudCAqLworCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJmxpc3QsCisJCQkJIHNpemVvZihzdHJ1Y3QgaXJkYV9kZXZpY2VfbGlzdCkgLQorCQkJCSBzaXplb2Yoc3RydWN0IGlyZGFfZGV2aWNlX2luZm8pKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisKKwkJLyogT2Zmc2V0IHRvIGZpcnN0IGRldmljZSBlbnRyeSAqLworCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlyZGFfZGV2aWNlX2xpc3QpIC0KKwkJCXNpemVvZihzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyk7CisKKwkJLyogQ29weSB0aGUgbGlzdCBpdHNlbGYgLSB3YXRjaCBmb3Igb3ZlcmZsb3cgKi8KKwkJaWYobGlzdC5sZW4gPiAyMDQ4KQorCQl7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBiZWQ7CisJCX0KKwkJdG90YWwgPSBvZmZzZXQgKyAobGlzdC5sZW4gKiBzaXplb2Yoc3RydWN0IGlyZGFfZGV2aWNlX2luZm8pKTsKKwkJaWYgKHRvdGFsID4gbGVuKQorCQkJdG90YWwgPSBsZW47CisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsK29mZnNldCwgZGlzY292ZXJpZXMsIHRvdGFsIC0gb2Zmc2V0KSkKKwkJCWVyciA9IC1FRkFVTFQ7CisKKwkJLyogV3JpdGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYmFjayB0byBjbGllbnQgKi8KKwkJaWYgKHB1dF91c2VyKHRvdGFsLCBvcHRsZW4pKQorCQkJZXJyID0gLUVGQVVMVDsKK2JlZDoKKwkJLyogRnJlZSB1cCBvdXIgYnVmZmVyICovCisJCWtmcmVlKGRpc2NvdmVyaWVzKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgSVJMTVBfTUFYX1NEVV9TSVpFOgorCQl2YWwgPSBzZWxmLT5tYXhfZGF0YV9zaXplOworCQlsZW4gPSBzaXplb2YoaW50KTsKKwkJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmdmFsLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgSVJMTVBfSUFTX0dFVDoKKwkJLyogVGhlIHVzZXIgd2FudCBhbiBvYmplY3QgZnJvbSBvdXIgbG9jYWwgSUFTIGRhdGFiYXNlLgorCQkgKiBXZSBqdXN0IG5lZWQgdG8gcXVlcnkgdGhlIElBUyBhbmQgcmV0dXJuIHRoZSB2YWx1ZQorCQkgKiB0aGF0IHdlIGZvdW5kICovCisKKwkJLyogQ2hlY2sgdGhhdCB0aGUgdXNlciBoYXMgYWxsb2NhdGVkIHRoZSByaWdodCBzcGFjZSBmb3IgdXMgKi8KKwkJaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IGlyZGFfaWFzX3NldCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpYXNfb3B0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlyZGFfaWFzX3NldCksIEdGUF9BVE9NSUMpOworCQlpZiAoaWFzX29wdCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogQ29weSBxdWVyeSB0byB0aGUgZHJpdmVyLiAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoaWFzX29wdCwgb3B0dmFsLCBsZW4pKSB7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJLyogRmluZCB0aGUgb2JqZWN0IHdlIHRhcmdldC4KKwkJICogSWYgdGhlIHVzZXIgZ2l2ZXMgdXMgYW4gZW1wdHkgc3RyaW5nLCB3ZSB1c2UgdGhlIG9iamVjdAorCQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzb2NrZXQuIFRoaXMgd2lsbCB3b3JrYXJvdW5kCisJCSAqIGR1cGxpY2F0ZWQgY2xhc3MgbmFtZSAtIEplYW4gSUkgKi8KKwkJaWYoaWFzX29wdC0+aXJkYV9jbGFzc19uYW1lWzBdID09ICdcMCcpCisJCQlpYXNfb2JqID0gc2VsZi0+aWFzX29iajsKKwkJZWxzZQorCQkJaWFzX29iaiA9IGlyaWFzX2ZpbmRfb2JqZWN0KGlhc19vcHQtPmlyZGFfY2xhc3NfbmFtZSk7CisJCWlmKGlhc19vYmogPT0gKHN0cnVjdCBpYXNfb2JqZWN0ICopIE5VTEwpIHsKKwkJCWtmcmVlKGlhc19vcHQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBGaW5kIHRoZSBhdHRyaWJ1dGUgKGluIHRoZSBvYmplY3QpIHdlIHRhcmdldCAqLworCQlpYXNfYXR0ciA9IGlyaWFzX2ZpbmRfYXR0cmliKGlhc19vYmosCisJCQkJCSAgICAgaWFzX29wdC0+aXJkYV9hdHRyaWJfbmFtZSk7CisJCWlmKGlhc19hdHRyID09IChzdHJ1Y3QgaWFzX2F0dHJpYiAqKSBOVUxMKSB7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogVHJhbnNsYXRlIGZyb20gaW50ZXJuYWwgdG8gdXNlciBzdHJ1Y3R1cmUgKi8KKwkJZXJyID0gaXJkYV9leHRyYWN0X2lhc192YWx1ZShpYXNfb3B0LCBpYXNfYXR0ci0+dmFsdWUpOworCQlpZihlcnIpIHsKKwkJCWtmcmVlKGlhc19vcHQpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCS8qIENvcHkgcmVwbHkgdG8gdGhlIHVzZXIgKi8KKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIGlhc19vcHQsCisJCQkJIHNpemVvZihzdHJ1Y3QgaXJkYV9pYXNfc2V0KSkpIHsKKwkJCWtmcmVlKGlhc19vcHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJLyogTm90ZSA6IGRvbid0IG5lZWQgdG8gcHV0IG9wdGxlbiwgd2UgY2hlY2tlZCBpdCAqLworCQlrZnJlZShpYXNfb3B0KTsKKwkJYnJlYWs7CisJY2FzZSBJUkxNUF9JQVNfUVVFUlk6CisJCS8qIFRoZSB1c2VyIHdhbnQgYW4gb2JqZWN0IGZyb20gYSByZW1vdGUgSUFTIGRhdGFiYXNlLgorCQkgKiBXZSBuZWVkIHRvIHVzZSBJQVAgdG8gcXVlcnkgdGhlIHJlbW90ZSBkYXRhYmFzZSBhbmQKKwkJICogdGhlbiB3YWl0IGZvciB0aGUgYW5zd2VyIHRvIGNvbWUgYmFjay4gKi8KKworCQkvKiBDaGVjayB0aGF0IHRoZSB1c2VyIGhhcyBhbGxvY2F0ZWQgdGhlIHJpZ2h0IHNwYWNlIGZvciB1cyAqLworCQlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3QgaXJkYV9pYXNfc2V0KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlhc19vcHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJkYV9pYXNfc2V0KSwgR0ZQX0FUT01JQyk7CisJCWlmIChpYXNfb3B0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBDb3B5IHF1ZXJ5IHRvIHRoZSBkcml2ZXIuICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihpYXNfb3B0LCBvcHR2YWwsIGxlbikpIHsKKwkJCWtmcmVlKGlhc19vcHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBBdCB0aGlzIHBvaW50LCB0aGVyZSBhcmUgdHdvIGNhc2VzLi4uCisJCSAqIDEpIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIC0gdGhhdCdzIHRoZSBlYXN5IGNhc2UsIHdlCisJCSAqCWp1c3QgcXVlcnkgdGhlIGRldmljZSB3ZSBhcmUgY29ubmVjdGVkIHRvLi4uCisJCSAqIDIpIHRoZSBzb2NrZXQgaXMgbm90IGNvbm5lY3RlZCAtIHRoZSB1c2VyIGRvZXNuJ3Qgd2FudAorCQkgKgl0byBjb25uZWN0IGFuZC9vciBtYXkgbm90IGhhdmUgYSB2YWxpZCBzZXJ2aWNlIG5hbWUKKwkJICoJKHNvIGNhbid0IGNyZWF0ZSBhIGZha2UgY29ubmVjdGlvbikuIEluIHRoaXMgY2FzZSwKKwkJICoJd2UgYXNzdW1lIHRoYXQgdGhlIHVzZXIgcGFzcyB1cyBhIHZhbGlkIGRlc3RpbmF0aW9uCisJCSAqCWFkZHJlc3MgaW4gdGhlIHJlcXVlc3Rpbmcgc3RydWN0dXJlLi4uCisJCSAqLworCQlpZihzZWxmLT5kYWRkciAhPSBERVZfQUREUl9BTlkpIHsKKwkJCS8qIFdlIGFyZSBjb25uZWN0ZWQgLSByZXVzZSBrbm93biBkYWRkciAqLworCQkJZGFkZHIgPSBzZWxmLT5kYWRkcjsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGFyZSBub3QgY29ubmVjdGVkLCB3ZSBtdXN0IHNwZWNpZnkgYSB2YWxpZAorCQkJICogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCQkJZGFkZHIgPSBpYXNfb3B0LT5kYWRkcjsKKwkJCWlmKCghZGFkZHIpIHx8IChkYWRkciA9PSBERVZfQUREUl9BTlkpKSB7CisJCQkJa2ZyZWUoaWFzX29wdCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKworCQkvKiBDaGVjayB0aGF0IHdlIGNhbiBwcm9jZWVkIHdpdGggSUFQICovCisJCWlmIChzZWxmLT5pcmlhcCkgeworCQkJSVJEQV9XQVJOSU5HKCIlczogYnVzeSB3aXRoIGEgcHJldmlvdXMgcXVlcnlcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJc2VsZi0+aXJpYXAgPSBpcmlhcF9vcGVuKExTQVBfQU5ZLCBJQVNfQ0xJRU5ULCBzZWxmLAorCQkJCQkgaXJkYV9nZXR2YWx1ZV9jb25maXJtKTsKKworCQlpZiAoc2VsZi0+aXJpYXAgPT0gTlVMTCkgeworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCS8qIFRyZWF0IHVuZXhwZWN0ZWQgd2FrZXVwIGFzIGRpc2Nvbm5lY3QgKi8KKwkJc2VsZi0+ZXJybm8gPSAtRUhPU1RVTlJFQUNIOworCisJCS8qIFF1ZXJ5IHJlbW90ZSBMTS1JQVMgKi8KKwkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3Qoc2VsZi0+aXJpYXAsCisJCQkJCSAgICAgIHNlbGYtPnNhZGRyLCBkYWRkciwKKwkJCQkJICAgICAgaWFzX29wdC0+aXJkYV9jbGFzc19uYW1lLAorCQkJCQkgICAgICBpYXNfb3B0LT5pcmRhX2F0dHJpYl9uYW1lKTsKKworCQkvKiBXYWl0IGZvciBhbnN3ZXIsIGlmIG5vdCB5ZXQgZmluaXNoZWQgKG9yIGZhaWxlZCkgKi8KKwkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZWxmLT5xdWVyeV93YWl0LAorCQkJCQkgICAgIChzZWxmLT5pcmlhcCA9PSBOVUxMKSkpIHsKKwkJCS8qIHBlbmRpbmcgcmVxdWVzdCB1c2VzIGNvcHkgb2YgaWFzX29wdC1jb250ZW50CisJCQkgKiB3ZSBjYW4gZnJlZSBpdCByZWdhcmRsZXNzISAqLworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQkvKiBUcmVhdCBzaWduYWxzIGFzIGRpc2Nvbm5lY3QgKi8KKwkJCXJldHVybiAtRUhPU1RVTlJFQUNIOworCQl9CisKKwkJLyogQ2hlY2sgd2hhdCBoYXBwZW5lZCAqLworCQlpZiAoc2VsZi0+ZXJybm8pCisJCXsKKwkJCWtmcmVlKGlhc19vcHQpOworCQkJLyogUmVxdWVzdGVkIG9iamVjdC9hdHRyaWJ1dGUgZG9lc24ndCBleGlzdCAqLworCQkJaWYoKHNlbGYtPmVycm5vID09IElBU19DTEFTU19VTktOT1dOKSB8fAorCQkJICAgKHNlbGYtPmVycm5vID09IElBU19BVFRSSUJfVU5LTk9XTikpCisJCQkJcmV0dXJuICgtRUFERFJOT1RBVkFJTCk7CisJCQllbHNlCisJCQkJcmV0dXJuICgtRUhPU1RVTlJFQUNIKTsKKwkJfQorCisJCS8qIFRyYW5zbGF0ZSBmcm9tIGludGVybmFsIHRvIHVzZXIgc3RydWN0dXJlICovCisJCWVyciA9IGlyZGFfZXh0cmFjdF9pYXNfdmFsdWUoaWFzX29wdCwgc2VsZi0+aWFzX3Jlc3VsdCk7CisJCWlmIChzZWxmLT5pYXNfcmVzdWx0KQorCQkJaXJpYXNfZGVsZXRlX3ZhbHVlKHNlbGYtPmlhc19yZXN1bHQpOworCQlpZiAoZXJyKSB7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQkvKiBDb3B5IHJlcGx5IHRvIHRoZSB1c2VyICovCisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCBpYXNfb3B0LAorCQkJCSBzaXplb2Yoc3RydWN0IGlyZGFfaWFzX3NldCkpKSB7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCS8qIE5vdGUgOiBkb24ndCBuZWVkIHRvIHB1dCBvcHRsZW4sIHdlIGNoZWNrZWQgaXQgKi8KKwkJa2ZyZWUoaWFzX29wdCk7CisJCWJyZWFrOworCWNhc2UgSVJMTVBfV0FJVERFVklDRToKKwkJLyogVGhpcyBmdW5jdGlvbiBpcyBqdXN0IGFub3RoZXIgd2F5IG9mIHNlZWluZyBsaWZlIDstKQorCQkgKiBJUkxNUF9FTlVNREVWSUNFUyBhc3N1bWVzIHRoYXQgeW91IGhhdmUgYSBzdGF0aWMgbmV0d29yaywKKwkJICogYW5kIHRoYXQgeW91IGp1c3Qgd2FudCB0byBwaWNrIG9uZSBvZiB0aGUgZGV2aWNlcyBwcmVzZW50LgorCQkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaW4gaGVyZSB3ZSBhc3N1bWUgdGhhdCBubyBkZXZpY2UgaXMKKwkJICogcHJlc2VudCBhbmQgdGhhdCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgYSBkZXZpY2Ugd2lsbAorCQkgKiBjb21lIGludG8gcmFuZ2UuIFdoZW4gdGhpcyBkZXZpY2UgYXJyaXZlLCB3ZSBqdXN0IHdha2UKKwkJICogdXAgdGhlIGNhbGxlciwgc28gdGhhdCBoZSBoYXMgdGltZSB0byBjb25uZWN0IHRvIGl0IGJlZm9yZQorCQkgKiB0aGUgZGV2aWNlIGdvZXMgYXdheS4uLgorCQkgKiBOb3RlIDogb25jZSB0aGUgbm9kZSBoYXMgYmVlbiBkaXNjb3ZlcmVkIGZvciBtb3JlIHRoYW4gYQorCQkgKiBmZXcgc2Vjb25kLCBpdCB3b24ndCB0cmlnZ2VyIHRoaXMgZnVuY3Rpb24sIHVubGVzcyBpdAorCQkgKiBnb2VzIGF3YXkgYW5kIGNvbWUgYmFjayBjaGFuZ2VzIGl0cyBoaW50IGJpdHMgKHNvIHdlCisJCSAqIG1pZ2h0IGNhbGwgaXQgSVJMTVBfV0FJVE5FV0RFVklDRSkuCisJCSAqLworCisJCS8qIENoZWNrIHRoYXQgdGhlIHVzZXIgaXMgcGFzc2luZyB1cyBhbiBpbnQgKi8KKwkJaWYgKGxlbiAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKiBHZXQgdGltZW91dCBpbiBtcyAobWF4IHRpbWUgd2UgYmxvY2sgdGhlIGNhbGxlcikgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilvcHR2YWwpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLyogVGVsbCBJckxNUCB3ZSB3YW50IHRvIGJlIG5vdGlmaWVkICovCisJCWlybG1wX3VwZGF0ZV9jbGllbnQoc2VsZi0+Y2tleSwgc2VsZi0+bWFzay53b3JkLAorCQkJCSAgICBpcmRhX3NlbGVjdGl2ZV9kaXNjb3ZlcnlfaW5kaWNhdGlvbiwKKwkJCQkgICAgTlVMTCwgKHZvaWQgKikgc2VsZik7CisKKwkJLyogRG8gc29tZSBkaXNjb3ZlcnkgKGFuZCBhbHNvIHJldHVybiBjYWNoZWQgcmVzdWx0cykgKi8KKwkJaXJsbXBfZGlzY292ZXJ5X3JlcXVlc3Qoc2VsZi0+bnNsb3RzKTsKKworCQkvKiBXYWl0IHVudGlsIGEgbm9kZSBpcyBkaXNjb3ZlcmVkICovCisJCWlmICghc2VsZi0+Y2FjaGVkYWRkcikgeworCQkJaW50IHJldCA9IDA7CisKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIG5vdGhpbmcgZGlzY292ZXJlZCB5ZXQsIGdvaW5nIHRvIHNsZWVwLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCQkvKiBTZXQgd2F0Y2hkb2cgdGltZXIgdG8gZXhwaXJlIGluIDx2YWw+IG1zLiAqLworCQkJc2VsZi0+ZXJybm8gPSAwOworCQkJaW5pdF90aW1lcigmc2VsZi0+d2F0Y2hkb2cpOworCQkJc2VsZi0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBpcmRhX2Rpc2NvdmVyeV90aW1lb3V0OworCQkJc2VsZi0+d2F0Y2hkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzZWxmOworCQkJc2VsZi0+d2F0Y2hkb2cuZXhwaXJlcyA9IGppZmZpZXMgKyAodmFsICogSFovMTAwMCk7CisJCQlhZGRfdGltZXIoJihzZWxmLT53YXRjaGRvZykpOworCisJCQkvKiBXYWl0IGZvciBJUi1MTVAgdG8gY2FsbCB1cyBiYWNrICovCisJCQlfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZWxmLT5xdWVyeV93YWl0LAorCQkJICAgICAgKHNlbGYtPmNhY2hlZGFkZHIgIT0gMCB8fCBzZWxmLT5lcnJubyA9PSAtRVRJTUUpLAorCQkJCQkJICAgcmV0KTsKKworCQkJLyogSWYgd2F0Y2hkb2cgaXMgc3RpbGwgYWN0aXZhdGVkLCBraWxsIGl0ISAqLworCQkJaWYodGltZXJfcGVuZGluZygmKHNlbGYtPndhdGNoZG9nKSkpCisJCQkJZGVsX3RpbWVyKCYoc2VsZi0+d2F0Y2hkb2cpKTsKKworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgLi4ud2FraW5nIHVwICFcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCWVsc2UKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIGZvdW5kIGltbWVkaWF0ZWx5ICFcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKworCQkvKiBUZWxsIElyTE1QIHRoYXQgd2UgaGF2ZSBiZWVuIG5vdGlmaWVkICovCisJCWlybG1wX3VwZGF0ZV9jbGllbnQoc2VsZi0+Y2tleSwgc2VsZi0+bWFzay53b3JkLAorCQkJCSAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKworCQkvKiBDaGVjayBpZiB0aGUgd2UgZ290IHNvbWUgcmVzdWx0cyAqLworCQlpZiAoIXNlbGYtPmNhY2hlZGFkZHIpCisJCQlyZXR1cm4gLUVBR0FJTjsJCS8qIERpZG4ndCBmaW5kIGFueSBkZXZpY2VzICovCisJCWRhZGRyID0gc2VsZi0+Y2FjaGVkYWRkcjsKKwkJLyogQ2xlYW51cCAqLworCQlzZWxmLT5jYWNoZWRhZGRyID0gMDsKKworCQkvKiBXZSByZXR1cm4gdGhlIGRhZGRyIG9mIHRoZSBkZXZpY2UgdGhhdCB0cmlnZ2VyIHRoZQorCQkgKiB3YWtldXAuIEFzIGlybG1wIHBhc3MgdXMgb25seSB0aGUgbmV3IGRldmljZXMsIHdlCisJCSAqIGFyZSBzdXJlIHRoYXQgaXQncyBub3QgYW4gb2xkIGRldmljZS4KKwkJICogSWYgdGhlIHVzZXIgd2FudCBtb3JlIGRldGFpbHMsIGhlIHNob3VsZCBxdWVyeQorCQkgKiB0aGUgd2hvbGUgZGlzY292ZXJ5IGxvZyBhbmQgcGljayBvbmUgZGV2aWNlLi4uCisJCSAqLworCQlpZiAocHV0X3VzZXIoZGFkZHIsIChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBpcmRhX2ZhbWlseV9vcHMgPSB7CisJLmZhbWlseSA9IFBGX0lSREEsCisJLmNyZWF0ZSA9IGlyZGFfY3JlYXRlLAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgU09DS09QU19XUkFQUEVEKGlyZGFfc3RyZWFtX29wcykgPSB7CisJLmZhbWlseSA9CVBGX0lSREEsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlbGVhc2UgPQlpcmRhX3JlbGVhc2UsCisJLmJpbmQgPQkJaXJkYV9iaW5kLAorCS5jb25uZWN0ID0JaXJkYV9jb25uZWN0LAorCS5zb2NrZXRwYWlyID0Jc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQgPQlpcmRhX2FjY2VwdCwKKwkuZ2V0bmFtZSA9CWlyZGFfZ2V0bmFtZSwKKwkucG9sbCA9CQlpcmRhX3BvbGwsCisJLmlvY3RsID0JaXJkYV9pb2N0bCwKKwkubGlzdGVuID0JaXJkYV9saXN0ZW4sCisJLnNodXRkb3duID0JaXJkYV9zaHV0ZG93biwKKwkuc2V0c29ja29wdCA9CWlyZGFfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdCA9CWlyZGFfZ2V0c29ja29wdCwKKwkuc2VuZG1zZyA9CWlyZGFfc2VuZG1zZywKKwkucmVjdm1zZyA9CWlyZGFfcmVjdm1zZ19zdHJlYW0sCisJLm1tYXAgPQkJc29ja19ub19tbWFwLAorCS5zZW5kcGFnZSA9CXNvY2tfbm9fc2VuZHBhZ2UsCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBTT0NLT1BTX1dSQVBQRUQoaXJkYV9zZXFwYWNrZXRfb3BzKSA9IHsKKwkuZmFtaWx5ID0JUEZfSVJEQSwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVsZWFzZSA9CWlyZGFfcmVsZWFzZSwKKwkuYmluZCA9CQlpcmRhX2JpbmQsCisJLmNvbm5lY3QgPQlpcmRhX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCA9CWlyZGFfYWNjZXB0LAorCS5nZXRuYW1lID0JaXJkYV9nZXRuYW1lLAorCS5wb2xsID0JCWRhdGFncmFtX3BvbGwsCisJLmlvY3RsID0JaXJkYV9pb2N0bCwKKwkubGlzdGVuID0JaXJkYV9saXN0ZW4sCisJLnNodXRkb3duID0JaXJkYV9zaHV0ZG93biwKKwkuc2V0c29ja29wdCA9CWlyZGFfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdCA9CWlyZGFfZ2V0c29ja29wdCwKKwkuc2VuZG1zZyA9CWlyZGFfc2VuZG1zZywKKwkucmVjdm1zZyA9CWlyZGFfcmVjdm1zZ19kZ3JhbSwKKwkubW1hcCA9CQlzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlID0Jc29ja19ub19zZW5kcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIFNPQ0tPUFNfV1JBUFBFRChpcmRhX2RncmFtX29wcykgPSB7CisJLmZhbWlseSA9CVBGX0lSREEsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlbGVhc2UgPQlpcmRhX3JlbGVhc2UsCisJLmJpbmQgPQkJaXJkYV9iaW5kLAorCS5jb25uZWN0ID0JaXJkYV9jb25uZWN0LAorCS5zb2NrZXRwYWlyID0Jc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQgPQlpcmRhX2FjY2VwdCwKKwkuZ2V0bmFtZSA9CWlyZGFfZ2V0bmFtZSwKKwkucG9sbCA9CQlkYXRhZ3JhbV9wb2xsLAorCS5pb2N0bCA9CWlyZGFfaW9jdGwsCisJLmxpc3RlbiA9CWlyZGFfbGlzdGVuLAorCS5zaHV0ZG93biA9CWlyZGFfc2h1dGRvd24sCisJLnNldHNvY2tvcHQgPQlpcmRhX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgPQlpcmRhX2dldHNvY2tvcHQsCisJLnNlbmRtc2cgPQlpcmRhX3NlbmRtc2dfZGdyYW0sCisJLnJlY3Ztc2cgPQlpcmRhX3JlY3Ztc2dfZGdyYW0sCisJLm1tYXAgPQkJc29ja19ub19tbWFwLAorCS5zZW5kcGFnZSA9CXNvY2tfbm9fc2VuZHBhZ2UsCit9OworCisjaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIFNPQ0tPUFNfV1JBUFBFRChpcmRhX3VsdHJhX29wcykgPSB7CisJLmZhbWlseSA9CVBGX0lSREEsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlbGVhc2UgPQlpcmRhX3JlbGVhc2UsCisJLmJpbmQgPQkJaXJkYV9iaW5kLAorCS5jb25uZWN0ID0Jc29ja19ub19jb25uZWN0LAorCS5zb2NrZXRwYWlyID0Jc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQgPQlzb2NrX25vX2FjY2VwdCwKKwkuZ2V0bmFtZSA9CWlyZGFfZ2V0bmFtZSwKKwkucG9sbCA9CQlkYXRhZ3JhbV9wb2xsLAorCS5pb2N0bCA9CWlyZGFfaW9jdGwsCisJLmxpc3RlbiA9CXNvY2tfbm9fbGlzdGVuLAorCS5zaHV0ZG93biA9CWlyZGFfc2h1dGRvd24sCisJLnNldHNvY2tvcHQgPQlpcmRhX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgPQlpcmRhX2dldHNvY2tvcHQsCisJLnNlbmRtc2cgPQlpcmRhX3NlbmRtc2dfdWx0cmEsCisJLnJlY3Ztc2cgPQlpcmRhX3JlY3Ztc2dfZGdyYW0sCisJLm1tYXAgPQkJc29ja19ub19tbWFwLAorCS5zZW5kcGFnZSA9CXNvY2tfbm9fc2VuZHBhZ2UsCit9OworI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCisKKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorU09DS09QU19XUkFQKGlyZGFfc3RyZWFtLCBQRl9JUkRBKTsKK1NPQ0tPUFNfV1JBUChpcmRhX3NlcXBhY2tldCwgUEZfSVJEQSk7CitTT0NLT1BTX1dSQVAoaXJkYV9kZ3JhbSwgUEZfSVJEQSk7CisjaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKK1NPQ0tPUFNfV1JBUChpcmRhX3VsdHJhLCBQRl9JUkRBKTsKKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9VTFRSQSAqLworCisvKgorICogRnVuY3Rpb24gaXJzb2NrX2luaXQgKHBybykKKyAqCisgKiAgICBJbml0aWFsaXplIElyREEgcHJvdG9jb2wKKyAqCisgKi8KK2ludCBfX2luaXQgaXJzb2NrX2luaXQodm9pZCkKK3sKKwlpbnQgcmMgPSBwcm90b19yZWdpc3RlcigmaXJkYV9wcm90bywgMCk7CisKKwlpZiAocmMgPT0gMCkKKwkJcmMgPSBzb2NrX3JlZ2lzdGVyKCZpcmRhX2ZhbWlseV9vcHMpOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogRnVuY3Rpb24gaXJzb2NrX2NsZWFudXAgKHZvaWQpCisgKgorICogICAgUmVtb3ZlIElyREEgcHJvdG9jb2wKKyAqCisgKi8KK3ZvaWQgX19leGl0IGlyc29ja19jbGVhbnVwKHZvaWQpCit7CisJc29ja191bnJlZ2lzdGVyKFBGX0lSREEpOworCXByb3RvX3VucmVnaXN0ZXIoJmlyZGFfcHJvdG8pOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvZGlzY292ZXJ5LmMgYi9uZXQvaXJkYS9kaXNjb3ZlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGJhNWZhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvZGlzY292ZXJ5LmMKQEAgLTAsMCArMSw0MTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgZGlzY292ZXJ5LmMKKyAqIFZlcnNpb246ICAgICAgIDAuMQorICogRGVzY3JpcHRpb246ICAgUm91dGluZXMgZm9yIGhhbmRsaW5nIGRpc2NvdmVyaWVzIGF0IHRoZSBJckxNUCBsYXllcgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgVHVlIEFwciAgNiAxNTozMzo1MCAxOTk5CisgKiBNb2RpZmllZCBhdDogICBTYXQgT2N0ICA5IDE3OjExOjMxIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBNYXkgMjggIDM6MTEgQ1NUIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIEhvcnN0IHZvbiBCcmFuZCA8dm9uYnJhbmRAc2xlaXBuaXIudmFscGFyYWlzby5jbD4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2Rpc2NvdmVyeS5oPgorCisvKgorICogRnVuY3Rpb24gaXJsbXBfYWRkX2Rpc2NvdmVyeSAoY2FjaGVsb2csIGRpc2NvdmVyeSkKKyAqCisgKiAgICBBZGQgYSBuZXcgZGlzY292ZXJ5IHRvIHRoZSBjYWNoZWxvZywgYW5kIHJlbW92ZSBhbnkgb2xkIGRpc2NvdmVyaWVzCisgKiAgICBmcm9tIHRoZSBzYW1lIGRldmljZQorICoKKyAqIE5vdGUgOiB3ZSB0cnkgdG8gcHJlc2VydmUgdGhlIHRpbWUgdGhpcyBkZXZpY2Ugd2FzICpmaXJzdCogZGlzY292ZXJlZAorICogKGFzIG9wcG9zZWQgdG8gdGhlIHRpbWUgb2YgbGFzdCBkaXNjb3ZlcnkgdXNlZCBmb3IgY2xlYW51cCkuIFRoaXMgaXMKKyAqIHVzZWQgYnkgY2xpZW50cyB3YWl0aW5nIGZvciBkaXNjb3ZlcnkgZXZlbnRzIHRvIHRlbGwgaWYgdGhlIGRldmljZQorICogZGlzY292ZXJlZCBpcyAibmV3IiBvciBqdXN0IHRoZSBzYW1lIG9sZCBvbmUuIFRoZXkgY2FuJ3QgcmVseSB0aGVyZQorICogb24gYSBiaW5hcnkgZmxhZyAobmV3L29sZCksIGJlY2F1c2Ugbm90IGFsbCBkaXNjb3ZlcnkgZXZlbnRzIGFyZQorICogcHJvcGFnYXRlZCB0byB0aGVtLCBhbmQgdGhleSBtaWdodCBub3QgYWx3YXlzIGxpc3Rlbiwgc28gdGhleSB3b3VsZAorICogbWlzcyBzb21lIG5ldyBkZXZpY2VzIHBvcHBpbmcgdXAuLi4KKyAqIEplYW4gSUkKKyAqLwordm9pZCBpcmxtcF9hZGRfZGlzY292ZXJ5KGhhc2hiaW5fdCAqY2FjaGVsb2csIGRpc2NvdmVyeV90ICpuZXcpCit7CisJZGlzY292ZXJ5X3QgKmRpc2NvdmVyeSwgKm5vZGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFNldCB0aW1lIG9mIGZpcnN0IGRpc2NvdmVyeSBpZiBub2RlIGlzIG5ldyAoc2VlIGJlbG93KSAqLworCW5ldy0+Zmlyc3RzdGFtcCA9IG5ldy0+dGltZXN0YW1wOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhY2hlbG9nLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJLyogCisJICogUmVtb3ZlIGFsbCBkaXNjb3ZlcmllcyBvZiBkZXZpY2VzIHRoYXQgaGFzIHByZXZpb3VzbHkgYmVlbiAKKwkgKiBkaXNjb3ZlcmVkIG9uIHRoZSBzYW1lIGxpbmsgd2l0aCB0aGUgc2FtZSBuYW1lIChpbmZvKSwgb3IgdGhlIAorCSAqIHNhbWUgZGFkZHIuIFdlIGRvIHRoaXMgc2luY2Ugc29tZSBkZXZpY2VzIChtb3N0bHkgUERBcykgY2hhbmdlCisJICogdGhlaXIgZGV2aWNlIGFkZHJlc3MgYmV0d2VlbiBldmVyeSBkaXNjb3ZlcnkuCisJICovCisJZGlzY292ZXJ5ID0gKGRpc2NvdmVyeV90ICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGNhY2hlbG9nKTsKKwl3aGlsZSAoZGlzY292ZXJ5ICE9IE5VTEwgKSB7CisJCW5vZGUgPSBkaXNjb3Zlcnk7CisKKwkJLyogQmUgc3VyZSB0byBzdGF5IG9uZSBpdGVtIGFoZWFkICovCisJCWRpc2NvdmVyeSA9IChkaXNjb3ZlcnlfdCAqKSBoYXNoYmluX2dldF9uZXh0KGNhY2hlbG9nKTsKKworCQlpZiAoKG5vZGUtPmRhdGEuc2FkZHIgPT0gbmV3LT5kYXRhLnNhZGRyKSAmJgorCQkgICAgKChub2RlLT5kYXRhLmRhZGRyID09IG5ldy0+ZGF0YS5kYWRkcikgfHwgCisJCSAgICAgKHN0cmNtcChub2RlLT5kYXRhLmluZm8sIG5ldy0+ZGF0YS5pbmZvKSA9PSAwKSkpCisJCXsKKwkJCS8qIFRoaXMgZGlzY292ZXJ5IGlzIGEgcHJldmlvdXMgZGlzY292ZXJ5IAorCQkJICogZnJvbSB0aGUgc2FtZSBkZXZpY2UsIHNvIGp1c3QgcmVtb3ZlIGl0CisJCQkgKi8KKwkJCWhhc2hiaW5fcmVtb3ZlX3RoaXMoY2FjaGVsb2csIChpcmRhX3F1ZXVlX3QgKikgbm9kZSk7CisJCQkvKiBDaGVjayBpZiBoaW50cyBiaXRzIGFyZSB1bmNoYW5nZWQgKi8KKwkJCWlmKHUxNmhvKG5vZGUtPmRhdGEuaGludHMpID09IHUxNmhvKG5ldy0+ZGF0YS5oaW50cykpCisJCQkJLyogU2V0IHRpbWUgb2YgZmlyc3QgZGlzY292ZXJ5IGZvciB0aGlzIG5vZGUgKi8KKwkJCQluZXctPmZpcnN0c3RhbXAgPSBub2RlLT5maXJzdHN0YW1wOworCQkJa2ZyZWUobm9kZSk7CisJCX0KKwl9CisKKwkvKiBJbnNlcnQgdGhlIG5ldyBhbmQgdXBkYXRlZCB2ZXJzaW9uICovCisJaGFzaGJpbl9pbnNlcnQoY2FjaGVsb2csIChpcmRhX3F1ZXVlX3QgKikgbmV3LCBuZXctPmRhdGEuZGFkZHIsIE5VTEwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FjaGVsb2ctPmhiX3NwaW5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9hZGRfZGlzY292ZXJ5X2xvZyAoY2FjaGVsb2csIGxvZykKKyAqCisgKiAgICBNZXJnZSBhIGRpc292ZXJ5IGxvZyBpbnRvIHRoZSBjYWNoZWxvZy4KKyAqCisgKi8KK3ZvaWQgaXJsbXBfYWRkX2Rpc2NvdmVyeV9sb2coaGFzaGJpbl90ICpjYWNoZWxvZywgaGFzaGJpbl90ICpsb2cpCit7CisJZGlzY292ZXJ5X3QgKmRpc2NvdmVyeTsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKgorCSAqICBJZiBsb2cgaXMgbWlzc2luZyB0aGlzIG1lYW5zIHRoYXQgSXJMQVAgd2FzIHVuYWJsZSB0byBwZXJmb3JtIHRoZQorCSAqICBkaXNjb3ZlcnksIHNvIHJlc3RhcnQgZGlzY292ZXJ5IGFnYWluIHdpdGgganVzdCB0aGUgaGFsZiB0aW1lb3V0CisJICogIG9mIHRoZSBub3JtYWwgb25lLgorCSAqLworCS8qIFdlbGwuLi4gSXQgbWVhbnMgdGhhdCB0aGVyZSB3YXMgbm9ib2R5IG91dCB0aGVyZSAtIEplYW4gSUkgKi8KKwlpZiAobG9nID09IE5VTEwpIHsKKwkJLyogaXJsbXBfc3RhcnRfZGlzY292ZXJ5X3RpbWVyKGlybG1wLCAxNTApOyAqLworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBMb2NraW5nIDogd2UgYXJlIHRoZSBvbmx5IG93bmVyIG9mIHRoaXMgZGlzY292ZXJ5IGxvZywgc28KKwkgKiBubyBuZWVkIHRvIGxvY2sgaXQuCisJICogV2UganVzdCBuZWVkIHRvIGxvY2sgdGhlIGdsb2JhbCBsb2cgaW4gaXJsbXBfYWRkX2Rpc2NvdmVyeSgpLgorCSAqLworCWRpc2NvdmVyeSA9IChkaXNjb3ZlcnlfdCAqKSBoYXNoYmluX3JlbW92ZV9maXJzdChsb2cpOworCXdoaWxlIChkaXNjb3ZlcnkgIT0gTlVMTCkgeworCQlpcmxtcF9hZGRfZGlzY292ZXJ5KGNhY2hlbG9nLCBkaXNjb3ZlcnkpOworCisJCWRpc2NvdmVyeSA9IChkaXNjb3ZlcnlfdCAqKSBoYXNoYmluX3JlbW92ZV9maXJzdChsb2cpOworCX0KKwkKKwkvKiBEZWxldGUgdGhlIG5vdyBlbXB0eSBsb2cgKi8KKwloYXNoYmluX2RlbGV0ZShsb2csIChGUkVFX0ZVTkMpIGtmcmVlKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2V4cGlyZV9kaXNjb3ZlcmllcyAobG9nLCBzYWRkciwgZm9yY2UpCisgKgorICogICAgR28gdGhyb3VnaCBhbGwgZGlzY292ZXJpZXMgYW5kIGV4cGlyZSBhbGwgdGhhdCBoYXMgc3RheWVkIHRvbyBsb25nCisgKgorICogTm90ZSA6IHRoaXMgYXNzdW1lIHRoYXQgSXJMQVAgd29uJ3QgY2hhbmdlIGl0cyBzYWRkciwgd2hpY2gKKyAqIGN1cnJlbnRseSBpcyBhIHZhbGlkIGFzc3VtcHRpb24uLi4KKyAqLwordm9pZCBpcmxtcF9leHBpcmVfZGlzY292ZXJpZXMoaGFzaGJpbl90ICpsb2csIF9fdTMyIHNhZGRyLCBpbnQgZm9yY2UpCit7CisJZGlzY292ZXJ5X3QgKgkJZGlzY292ZXJ5OworCWRpc2NvdmVyeV90ICoJCWN1cnI7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJZGlzY2luZm9fdCAqCQlidWZmZXIgPSBOVUxMOworCWludAkJCW47CQkvKiBTaXplIG9mIHRoZSBmdWxsIGxvZyAqLworCWludAkJCWkgPSAwOwkJLyogSG93IG1hbnkgd2UgZXhwaXJlZCAqLworCisJSVJEQV9BU1NFUlQobG9nICE9IE5VTEwsIHJldHVybjspOworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9nLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJZGlzY292ZXJ5ID0gKGRpc2NvdmVyeV90ICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGxvZyk7CisJd2hpbGUgKGRpc2NvdmVyeSAhPSBOVUxMKSB7CisJCS8qIEJlIHN1cmUgdG8gYmUgb25lIGl0ZW0gYWhlYWQgKi8KKwkJY3VyciA9IGRpc2NvdmVyeTsKKwkJZGlzY292ZXJ5ID0gKGRpc2NvdmVyeV90ICopIGhhc2hiaW5fZ2V0X25leHQobG9nKTsKKworCQkvKiBUZXN0IGlmIGl0J3MgdGltZSB0byBleHBpcmUgdGhpcyBkaXNjb3ZlcnkgKi8KKwkJaWYgKChjdXJyLT5kYXRhLnNhZGRyID09IHNhZGRyKSAmJgorCQkgICAgKGZvcmNlIHx8CisJCSAgICAgKChqaWZmaWVzIC0gY3Vyci0+dGltZXN0YW1wKSA+IERJU0NPVkVSWV9FWFBJUkVfVElNRU9VVCkpKQorCQl7CisJCQkvKiBDcmVhdGUgYnVmZmVyIGFzIG5lZWRlZC4KKwkJCSAqIEFzIHRoaXMgZnVuY3Rpb24gZ2V0IGNhbGxlZCBhIGxvdCBhbmQgbW9zdCB0aW1lCisJCQkgKiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHB1dCBpbiB0aGUgbG9nICh3ZSBhcmUKKwkJCSAqIHF1aXRlIHBpY2t5KSwgd2UgY2FuIHNhdmUgYSBsb3Qgb2Ygb3ZlcmhlYWQKKwkJCSAqIGJ5IG5vdCBjYWxsaW5nIGttYWxsb2MuIEplYW4gSUkgKi8KKwkJCWlmKGJ1ZmZlciA9PSBOVUxMKSB7CisJCQkJLyogQ3JlYXRlIHRoZSBjbGllbnQgc3BlY2lmaWMgYnVmZmVyICovCisJCQkJbiA9IEhBU0hCSU5fR0VUX1NJWkUobG9nKTsKKwkJCQlidWZmZXIgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IGlyZGFfZGV2aWNlX2luZm8pLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAoYnVmZmVyID09IE5VTEwpIHsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQl9CisKKwkJCS8qIENvcHkgZGlzY292ZXJ5IGluZm9ybWF0aW9uICovCisJCQltZW1jcHkoJihidWZmZXJbaV0pLCAmKGN1cnItPmRhdGEpLAorCQkJICAgICAgIHNpemVvZihkaXNjaW5mb190KSk7CisJCQlpKys7CisKKwkJCS8qIFJlbW92ZSBpdCBmcm9tIHRoZSBsb2cgKi8KKwkJCWN1cnIgPSBoYXNoYmluX3JlbW92ZV90aGlzKGxvZywgKGlyZGFfcXVldWVfdCAqKSBjdXJyKTsKKwkJCWlmIChjdXJyKQorCQkJCWtmcmVlKGN1cnIpOworCQl9CisJfQorCisJLyogRHJvcCB0aGUgc3BpbmxvY2sgYmVmb3JlIGNhbGxpbmcgdGhlIGhpZ2hlciBsYXllcnMsIGFzCisJICogd2UgY2FuJ3QgZ3VhcmFudGVlIHRoZXkgd29uJ3QgY2FsbCB1cyBiYWNrIGFuZCBjcmVhdGUgYQorCSAqIGRlYWRsb2NrLiBXZSB3aWxsIHdvcmsgb24gb3VyIG93biBwcml2YXRlIGRhdGEsIHNvIHdlCisJICogZG9uJ3QgY2FyZSB0byBiZSBpbnRlcnVwdGVkLiAtIEplYW4gSUkgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2ctPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwlpZihidWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogVGVsbCBJckxNUCBhbmQgcmVnaXN0ZXJlZCBjbGllbnRzIGFib3V0IGl0ICovCisJaXJsbXBfZGlzY292ZXJ5X2V4cGlyeShidWZmZXIsIGkpOworCisJLyogRnJlZSB1cCBvdXIgYnVmZmVyICovCisJa2ZyZWUoYnVmZmVyKTsKK30KKworI2lmIDAKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9kdW1wX2Rpc2NvdmVyaWVzIChsb2cpCisgKgorICogICAgUHJpbnQgb3V0IGFsbCBkaXNjb3ZlcmllcyBpbiBsb2cKKyAqCisgKi8KK3ZvaWQgaXJsbXBfZHVtcF9kaXNjb3ZlcmllcyhoYXNoYmluX3QgKmxvZykKK3sKKwlkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5OworCisJSVJEQV9BU1NFUlQobG9nICE9IE5VTEwsIHJldHVybjspOworCisJZGlzY292ZXJ5ID0gKGRpc2NvdmVyeV90ICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGxvZyk7CisJd2hpbGUgKGRpc2NvdmVyeSAhPSBOVUxMKSB7CisJCUlSREFfREVCVUcoMCwgIkRpc2NvdmVyeTpcbiIpOworCQlJUkRBX0RFQlVHKDAsICIgIGRhZGRyPSUwOHhcbiIsIGRpc2NvdmVyeS0+ZGF0YS5kYWRkcik7CisJCUlSREFfREVCVUcoMCwgIiAgc2FkZHI9JTA4eFxuIiwgZGlzY292ZXJ5LT5kYXRhLnNhZGRyKTsgCisJCUlSREFfREVCVUcoMCwgIiAgbmlja25hbWU9JXNcbiIsIGRpc2NvdmVyeS0+ZGF0YS5pbmZvKTsKKworCQlkaXNjb3ZlcnkgPSAoZGlzY292ZXJ5X3QgKikgaGFzaGJpbl9nZXRfbmV4dChsb2cpOworCX0KK30KKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gaXJsbXBfY29weV9kaXNjb3ZlcmllcyAobG9nLCBwbiwgbWFzaykKKyAqCisgKiAgICBDb3B5IGFsbCBkaXNjb3ZlcmllcyBpbiBhIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50IGEgc2FmZSB3YXkgZm9yIGxtcCBjbGllbnRzIHRvIGFjY2VzcyB0aGUKKyAqIGRpc2NvdmVyeSBsb2cuIFRoZSBiYXNpYyBwcm9ibGVtIGlzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0aGUgbG9nCisgKiB0byBjaGFuZ2UgKGFkZC9yZW1vdmUpIHdoaWxlIHRoZSBjbGllbnQgaXMgcmVhZGluZyBpdC4gSWYgdGhlCisgKiBsbXAgY2xpZW50IG1hbmlwdWxhdGUgZGlyZWN0bHkgdGhlIGhhc2hiaW4sIGhlIGlzIHN1cmUgdG8gZ2V0CisgKiBpbnRvIHRyb3VibGVzLi4uCisgKiBUaGUgaWRlYSBpcyB0aGF0IHdlIGNvcHkgYWxsIHRoZSBjdXJyZW50IGRpc2NvdmVyeSBsb2cgaW4gYSBidWZmZXIKKyAqIHdoaWNoIGlzIHNwZWNpZmljIHRvIHRoZSBjbGllbnQgYW5kIHBhc3MgdGhpcyBjb3B5IHRvIGhpbS4gQXMgd2UKKyAqIGRvIHRoaXMgb3BlcmF0aW9uIHdpdGggdGhlIHNwaW5sb2NrIGdyYWJiZWQsIHdlIGFyZSBzYWZlLi4uCisgKiBOb3RlIDogd2UgZG9uJ3Qgd2FudCB0aG9zZSBjbGllbnRzIHRvIGdyYWIgdGhlIHNwaW5sb2NrLCBiZWNhdXNlCisgKiB3ZSBoYXZlIG5vIGNvbnRyb2wgb24gaG93IGxvbmcgdGhleSB3aWxsIGhvbGQgaXQuLi4KKyAqIE5vdGUgOiB3ZSBjaG9vc2UgdG8gY29weSB0aGUgbG9nIGluICJzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyIgdG8KKyAqIHNhdmUgc3BhY2UuLi4KKyAqIE5vdGUgOiB0aGUgY2xpZW50IG11c3Qga2ZyZWUgaGltc2VsZigpIHRoZSBsb2cuLi4KKyAqIEplYW4gSUkKKyAqLworc3RydWN0IGlyZGFfZGV2aWNlX2luZm8gKmlybG1wX2NvcHlfZGlzY292ZXJpZXMoaGFzaGJpbl90ICpsb2csIGludCAqcG4sCisJCQkJCQlfX3UxNiBtYXNrLCBpbnQgb2xkX2VudHJpZXMpCit7CisJZGlzY292ZXJ5X3QgKgkJZGlzY292ZXJ5OworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWRpc2NpbmZvX3QgKgkJYnVmZmVyID0gTlVMTDsKKwlpbnQJCQlqX3RpbWVvdXQgPSAoc3lzY3RsX2Rpc2NvdmVyeV90aW1lb3V0ICogSFopOworCWludAkJCW47CQkvKiBTaXplIG9mIHRoZSBmdWxsIGxvZyAqLworCWludAkJCWkgPSAwOwkJLyogSG93IG1hbnkgd2UgcGlja2VkICovCisKKwlJUkRBX0FTU0VSVChwbiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKGxvZyAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCisJLyogU2F2ZSBzcGluIGxvY2sgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9nLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJZGlzY292ZXJ5ID0gKGRpc2NvdmVyeV90ICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGxvZyk7CisJd2hpbGUgKGRpc2NvdmVyeSAhPSBOVUxMKSB7CisJCS8qIE1hc2sgb3V0IHRoZSBvbmVzIHdlIGRvbid0IHdhbnQgOgorCQkgKiBXZSB3YW50IHRvIG1hdGNoIHRoZSBkaXNjb3ZlcnkgbWFzaywgYW5kIHRvIGdldCBvbmx5CisJCSAqIHRoZSBtb3N0IHJlY2VudCBvbmUgKHVubGVzcyB3ZSB3YW50IG9sZCBvbmVzKSAqLworCQlpZiAoKHUxNmhvKGRpc2NvdmVyeS0+ZGF0YS5oaW50cykgJiBtYXNrKSAmJgorCQkgICAgKChvbGRfZW50cmllcykgfHwKKwkJICAgICAoKGppZmZpZXMgLSBkaXNjb3ZlcnktPmZpcnN0c3RhbXApIDwgal90aW1lb3V0KSkgKSB7CisJCQkvKiBDcmVhdGUgYnVmZmVyIGFzIG5lZWRlZC4KKwkJCSAqIEFzIHRoaXMgZnVuY3Rpb24gZ2V0IGNhbGxlZCBhIGxvdCBhbmQgbW9zdCB0aW1lCisJCQkgKiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHB1dCBpbiB0aGUgbG9nICh3ZSBhcmUKKwkJCSAqIHF1aXRlIHBpY2t5KSwgd2UgY2FuIHNhdmUgYSBsb3Qgb2Ygb3ZlcmhlYWQKKwkJCSAqIGJ5IG5vdCBjYWxsaW5nIGttYWxsb2MuIEplYW4gSUkgKi8KKwkJCWlmKGJ1ZmZlciA9PSBOVUxMKSB7CisJCQkJLyogQ3JlYXRlIHRoZSBjbGllbnQgc3BlY2lmaWMgYnVmZmVyICovCisJCQkJbiA9IEhBU0hCSU5fR0VUX1NJWkUobG9nKTsKKwkJCQlidWZmZXIgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IGlyZGFfZGV2aWNlX2luZm8pLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAoYnVmZmVyID09IE5VTEwpIHsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisKKwkJCX0KKworCQkJLyogQ29weSBkaXNjb3ZlcnkgaW5mb3JtYXRpb24gKi8KKwkJCW1lbWNweSgmKGJ1ZmZlcltpXSksICYoZGlzY292ZXJ5LT5kYXRhKSwKKwkJCSAgICAgICBzaXplb2YoZGlzY2luZm9fdCkpOworCQkJaSsrOworCQl9CisJCWRpc2NvdmVyeSA9IChkaXNjb3ZlcnlfdCAqKSBoYXNoYmluX2dldF9uZXh0KGxvZyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJLyogR2V0IHRoZSBhY3R1YWwgbnVtYmVyIG9mIGRldmljZSBpbiB0aGUgYnVmZmVyIGFuZCByZXR1cm4gKi8KKwkqcG4gPSBpOworCXJldHVybihidWZmZXIpOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbmxpbmUgZGlzY292ZXJ5X3QgKmRpc2NvdmVyeV9zZXFfaWR4KGxvZmZfdCBwb3MpCisKK3sKKwlkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5OworCisJZm9yIChkaXNjb3ZlcnkgPSAoZGlzY292ZXJ5X3QgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJsbXAtPmNhY2hlbG9nKTsgCisJICAgICBkaXNjb3ZlcnkgIT0gTlVMTDsKKwkgICAgIGRpc2NvdmVyeSA9IChkaXNjb3ZlcnlfdCAqKSBoYXNoYmluX2dldF9uZXh0KGlybG1wLT5jYWNoZWxvZykpIHsKKwkJaWYgKHBvcy0tID09IDApCisJCQlicmVhazsKKwl9CisJCQorCXJldHVybiBkaXNjb3Zlcnk7Cit9CisKK3N0YXRpYyB2b2lkICpkaXNjb3Zlcnlfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzcGluX2xvY2tfaXJxKCZpcmxtcC0+Y2FjaGVsb2ctPmhiX3NwaW5sb2NrKTsKKyAgICAgICAgcmV0dXJuICpwb3MgPyBkaXNjb3Zlcnlfc2VxX2lkeCgqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICpkaXNjb3Zlcnlfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCSsrKnBvczsKKwlyZXR1cm4gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSAKKwkJPyAodm9pZCAqKSBoYXNoYmluX2dldF9maXJzdChpcmxtcC0+Y2FjaGVsb2cpCisJCTogKHZvaWQgKikgaGFzaGJpbl9nZXRfbmV4dChpcmxtcC0+Y2FjaGVsb2cpOworfQorCitzdGF0aWMgdm9pZCBkaXNjb3Zlcnlfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3Bpbl91bmxvY2tfaXJxKCZpcmxtcC0+Y2FjaGVsb2ctPmhiX3NwaW5sb2NrKTsKK30KKworc3RhdGljIGludCBkaXNjb3Zlcnlfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHV0cyhzZXEsICJJckxNUDogRGlzY292ZXJ5IGxvZzpcblxuIik7CisJZWxzZSB7CisJCWNvbnN0IGRpc2NvdmVyeV90ICpkaXNjb3ZlcnkgPSB2OworCisJCXNlcV9wcmludGYoc2VxLCAibmlja25hbWU6ICVzLCBoaW50OiAweCUwMnglMDJ4IiwgCisJCQkgICBkaXNjb3ZlcnktPmRhdGEuaW5mbywKKwkJCSAgIGRpc2NvdmVyeS0+ZGF0YS5oaW50c1swXSwgCisJCQkgICBkaXNjb3ZlcnktPmRhdGEuaGludHNbMV0pOworI2lmIDAKKwkJaWYgKCBkaXNjb3ZlcnktPmRhdGEuaGludHNbMF0gJiBISU5UX1BOUCkKKwkJCXNlcV9wdXRzKHNlcSwgIlBuUCBDb21wYXRpYmxlICIpOworCQlpZiAoIGRpc2NvdmVyeS0+ZGF0YS5oaW50c1swXSAmIEhJTlRfUERBKQorCQkJc2VxX3B1dHMoc2VxLCAiUERBL1BhbG10b3AgIik7CisJCWlmICggZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzBdICYgSElOVF9DT01QVVRFUikKKwkJCXNlcV9wdXRzKHNlcSwgIkNvbXB1dGVyICIpOworCQlpZiAoIGRpc2NvdmVyeS0+ZGF0YS5oaW50c1swXSAmIEhJTlRfUFJJTlRFUikKKwkJCXNlcV9wdXRzKHNlcSwgIlByaW50ZXIgIik7CisJCWlmICggZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzBdICYgSElOVF9NT0RFTSkKKwkJCXNlcV9wdXRzKHNlcSwgIk1vZGVtICIpOworCQlpZiAoIGRpc2NvdmVyeS0+ZGF0YS5oaW50c1swXSAmIEhJTlRfRkFYKQorCQkJc2VxX3B1dHMoc2VxLCAiRmF4ICIpOworCQlpZiAoIGRpc2NvdmVyeS0+ZGF0YS5oaW50c1swXSAmIEhJTlRfTEFOKQorCQkJc2VxX3B1dHMoc2VxLCAiTEFOIEFjY2VzcyAiKTsKKwkJCisJCWlmICggZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzFdICYgSElOVF9URUxFUEhPTlkpCisJCQlzZXFfcHV0cyhzZXEsICJUZWxlcGhvbnkgIik7CisJCWlmICggZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzFdICYgSElOVF9GSUxFX1NFUlZFUikKKwkJCXNlcV9wdXRzKHNlcSwgIkZpbGUgU2VydmVyICIpOyAgICAgICAKKwkJaWYgKCBkaXNjb3ZlcnktPmRhdGEuaGludHNbMV0gJiBISU5UX0NPTU0pCisJCQlzZXFfcHV0cyhzZXEsICJJckNPTU0gIik7CisJCWlmICggZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzFdICYgSElOVF9PQkVYKQorCQkJc2VxX3B1dHMoc2VxLCAiSXJPQkVYICIpOworI2VuZGlmCQkKKwkJc2VxX3ByaW50ZihzZXEsIiwgc2FkZHI6IDB4JTA4eCwgZGFkZHI6IDB4JTA4eFxuXG4iLAorCQkJICAgICAgIGRpc2NvdmVyeS0+ZGF0YS5zYWRkciwKKwkJCSAgICAgICBkaXNjb3ZlcnktPmRhdGEuZGFkZHIpOworCQkKKwkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZGlzY292ZXJ5X3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IGRpc2NvdmVyeV9zZXFfc3RhcnQsCisJLm5leHQgICA9IGRpc2NvdmVyeV9zZXFfbmV4dCwKKwkuc3RvcCAgID0gZGlzY292ZXJ5X3NlcV9zdG9wLAorCS5zaG93ICAgPSBkaXNjb3Zlcnlfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGRpc2NvdmVyeV9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlJUkRBX0FTU0VSVChpcmxtcCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTDspOworCisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZkaXNjb3Zlcnlfc2VxX29wcyk7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGlzY292ZXJ5X3NlcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgICAgICAgPSBkaXNjb3Zlcnlfc2VxX29wZW4sCisJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vS2NvbmZpZyBiL25ldC9pcmRhL2lyY29tbS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNGM2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmNvbW0vS2NvbmZpZwpAQCAtMCwwICsxLDEyIEBACitjb25maWcgSVJDT01NCisJdHJpc3RhdGUgIklyQ09NTSBwcm90b2NvbCIKKwlkZXBlbmRzIG9uIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBJckNPTU0gcHJvdG9jb2wuCisJICBUbyBjb21waWxlIGl0IGFzIG1vZHVsZXMsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGVzIHdpbGwgYmUKKwkgIGNhbGxlZCBpcmNvbW0gYW5kIGlyY29tbV90dHkuCisJICBJckNPTU0gaW1wbGVtZW50cyBzZXJpYWwgcG9ydCBlbXVsYXRpb24sIGFuZCBtYWtlcyBpdCBwb3NzaWJsZSB0bworCSAgdXNlIGFsbCBleGlzdGluZyBhcHBsaWNhdGlvbnMgdGhhdCB1bmRlcnN0YW5kcyBUVFkncyB3aXRoIGFuCisJICBpbmZyYXJlZCBsaW5rLiAgVGh1cyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIGFwcGxpY2F0aW9uIGxpa2UgUFBQLAorCSAgbWluaWNvbSBhbmQgb3RoZXJzLgorCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vTWFrZWZpbGUgYi9uZXQvaXJkYS9pcmNvbW0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2ODk0NQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lyY29tbS9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBJckRBIElyQ09NTSBwcm90b2NvbCBsYXllci4KKyMKKworb2JqLSQoQ09ORklHX0lSQ09NTSkgKz0gaXJjb21tLm8gaXJjb21tLXR0eS5vCisKK2lyY29tbS1vYmpzIDo9IGlyY29tbV9jb3JlLm8gaXJjb21tX2V2ZW50Lm8gaXJjb21tX2xtcC5vIGlyY29tbV90dHAubworaXJjb21tLXR0eS1vYmpzIDo9IGlyY29tbV90dHkubyBpcmNvbW1fdHR5X2F0dGFjaC5vIGlyY29tbV90dHlfaW9jdGwubyBpcmNvbW1fcGFyYW0ubwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJjb21tL2lyY29tbV9jb3JlLmMgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODY4ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV9jb3JlLmMKQEAgLTAsMCArMSw1ODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJjb21tX2NvcmUuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBJckNPTU0gc2VydmljZSBpbnRlcmZhY2UKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBKdW4gIDYgMjA6Mzc6MzQgMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgVHVlIERlYyAyMSAxMzoyNjo0MSAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhc19vYmplY3QuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV9ldmVudC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV9sbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fdHRwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX3BhcmFtLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX2NvcmUuaD4KKworc3RhdGljIGludCBfX2lyY29tbV9jbG9zZShzdHJ1Y3QgaXJjb21tX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIGlyY29tbV9jb250cm9sX2luZGljYXRpb24oc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGNsZW4pOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK2V4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaXJkYTsKK3N0YXRpYyBpbnQgaXJjb21tX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXJjb21tX3Byb2NfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgICAgICAgID0gaXJjb21tX3NlcV9vcGVuLAorCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCitoYXNoYmluX3QgKmlyY29tbSA9IE5VTEw7CisKK3N0YXRpYyBpbnQgX19pbml0IGlyY29tbV9pbml0KHZvaWQpCit7CisJaXJjb21tID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7IAorCWlmIChpcmNvbW0gPT0gTlVMTCkgeworCQlJUkRBX0VSUk9SKCIlcygpLCBjYW4ndCBhbGxvY2F0ZSBoYXNoYmluIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCQorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJeyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKKwllbnQgPSBjcmVhdGVfcHJvY19lbnRyeSgiaXJjb21tIiwgMCwgcHJvY19pcmRhKTsKKwlpZiAoZW50KSAKKwkJZW50LT5wcm9jX2ZvcHMgPSAmaXJjb21tX3Byb2NfZm9wczsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKwkKKwlJUkRBX01FU1NBR0UoIklyQ09NTSBwcm90b2NvbCAoRGFnIEJyYXR0bGkpXG4iKTsKKwkJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcmNvbW1fY2xlYW51cCh2b2lkKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaGFzaGJpbl9kZWxldGUoaXJjb21tLCAoRlJFRV9GVU5DKSBfX2lyY29tbV9jbG9zZSk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXJlbW92ZV9wcm9jX2VudHJ5KCJpcmNvbW0iLCBwcm9jX2lyZGEpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fb3BlbiAoY2xpZW50X25vdGlmeSkKKyAqCisgKiAgICBTdGFydCBhIG5ldyBJckNPTU0gaW5zdGFuY2UKKyAqCisgKi8KK3N0cnVjdCBpcmNvbW1fY2IgKmlyY29tbV9vcGVuKG5vdGlmeV90ICpub3RpZnksIF9fdTggc2VydmljZV90eXBlLCBpbnQgbGluZSkKK3sKKwlzdHJ1Y3QgaXJjb21tX2NiICpzZWxmID0gTlVMTDsKKwlpbnQgcmV0OworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgc2VydmljZV90eXBlPTB4JTAyeFxuIiwgX19GVU5DVElPTl9fICwKKwkJICAgc2VydmljZV90eXBlKTsKKworCUlSREFfQVNTRVJUKGlyY29tbSAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCisJc2VsZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcmNvbW1fY2IpLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChzZWxmLCAwLCBzaXplb2Yoc3RydWN0IGlyY29tbV9jYikpOworCisJc2VsZi0+bm90aWZ5ID0gKm5vdGlmeTsKKwlzZWxmLT5tYWdpYyA9IElSQ09NTV9NQUdJQzsKKworCS8qIENoZWNrIGlmIHdlIHNob3VsZCB1c2UgSXJMTVAgb3IgSXJUVFAgKi8KKwlpZiAoc2VydmljZV90eXBlICYgSVJDT01NXzNfV0lSRV9SQVcpIHsKKwkJc2VsZi0+Zmxvd19zdGF0dXMgPSBGTE9XX1NUQVJUOworCQlyZXQgPSBpcmNvbW1fb3Blbl9sc2FwKHNlbGYpOworCX0gZWxzZQorCQlyZXQgPSBpcmNvbW1fb3Blbl90c2FwKHNlbGYpOworCisJaWYgKHJldCA8IDApIHsKKwkJa2ZyZWUoc2VsZik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNlbGYtPnNlcnZpY2VfdHlwZSA9IHNlcnZpY2VfdHlwZTsKKwlzZWxmLT5saW5lID0gbGluZTsKKworCWhhc2hiaW5faW5zZXJ0KGlyY29tbSwgKGlyZGFfcXVldWVfdCAqKSBzZWxmLCBsaW5lLCBOVUxMKTsKKworCWlyY29tbV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9JRExFKTsJCisKKwlyZXR1cm4gc2VsZjsKK30KKworRVhQT1JUX1NZTUJPTChpcmNvbW1fb3Blbik7CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fY2xvc2VfaW5zdGFuY2UgKHNlbGYpCisgKgorICogICAgUmVtb3ZlIElyQ09NTSBpbnN0YW5jZQorICoKKyAqLworc3RhdGljIGludCBfX2lyY29tbV9jbG9zZShzdHJ1Y3QgaXJjb21tX2NiICpzZWxmKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogRGlzY29ubmVjdCBsaW5rIGlmIGFueSAqLworCWlyY29tbV9kb19ldmVudChzZWxmLCBJUkNPTU1fRElTQ09OTkVDVF9SRVFVRVNULCBOVUxMLCBOVUxMKTsKKworCS8qIFJlbW92ZSBUU0FQICovCisJaWYgKHNlbGYtPnRzYXApIHsKKwkJaXJ0dHBfY2xvc2VfdHNhcChzZWxmLT50c2FwKTsKKwkJc2VsZi0+dHNhcCA9IE5VTEw7CisJfQorCisJLyogUmVtb3ZlIExTQVAgKi8KKwlpZiAoc2VsZi0+bHNhcCkgeworCQlpcmxtcF9jbG9zZV9sc2FwKHNlbGYtPmxzYXApOworCQlzZWxmLT5sc2FwID0gTlVMTDsKKwl9CisJc2VsZi0+bWFnaWMgPSAwOworCisJa2ZyZWUoc2VsZik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9jbG9zZSAoc2VsZikKKyAqCisgKiAgICBDbG9zZXMgYW5kIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBJckNPTU0gaW5zdGFuY2UKKyAqCisgKi8KK2ludCBpcmNvbW1fY2xvc2Uoc3RydWN0IGlyY29tbV9jYiAqc2VsZikKK3sKKwlzdHJ1Y3QgaXJjb21tX2NiICplbnRyeTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC1FSU87KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybiAtRUlPOyk7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWVudHJ5ID0gaGFzaGJpbl9yZW1vdmUoaXJjb21tLCBzZWxmLT5saW5lLCBOVUxMKTsKKworCUlSREFfQVNTRVJUKGVudHJ5ID09IHNlbGYsIHJldHVybiAtMTspOworCQorICAgICAgICByZXR1cm4gX19pcmNvbW1fY2xvc2Uoc2VsZik7Cit9CisKK0VYUE9SVF9TWU1CT0woaXJjb21tX2Nsb3NlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9jb25uZWN0X3JlcXVlc3QgKHNlbGYsIHNlcnZpY2VfdHlwZSkKKyAqCisgKiAgICBJbXBsLiBvZiB0aGlzIGZ1bmN0aW9uIGlzIGRpZmZlciBmcm9tIG9uZSBvZiB0aGUgcmVmZXJlbmNlLiBUaGlzCisgKiAgICBmdW5jdGlvbiBkb2VzIGRpc2NvdmVyeSBhcyB3ZWxsIGFzIHNlbmRpbmcgY29ubmVjdCByZXF1ZXN0CisgKiAKKyAqLworaW50IGlyY29tbV9jb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgX191OCBkbHNhcF9zZWwsIAorCQkJICAgX191MzIgc2FkZHIsIF9fdTMyIGRhZGRyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgX191OCBzZXJ2aWNlX3R5cGUpCit7CisJc3RydWN0IGlyY29tbV9pbmZvIGluZm87CisJaW50IHJldDsKKworCUlSREFfREVCVUcoMiAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm4gLTE7KTsKKworCXNlbGYtPnNlcnZpY2VfdHlwZT0gc2VydmljZV90eXBlOworCisJaW5mby5kbHNhcF9zZWwgPSBkbHNhcF9zZWw7CisJaW5mby5zYWRkciA9IHNhZGRyOworCWluZm8uZGFkZHIgPSBkYWRkcjsKKworCXJldCA9IGlyY29tbV9kb19ldmVudChzZWxmLCBJUkNPTU1fQ09OTkVDVF9SRVFVRVNULCBza2IsICZpbmZvKTsKKworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woaXJjb21tX2Nvbm5lY3RfcmVxdWVzdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fY29ubmVjdF9pbmRpY2F0aW9uIChzZWxmLCBxb3MsIHNrYikKKyAqCisgKiAgICBOb3RpZnkgdXNlciBsYXllciBhYm91dCB0aGUgaW5jb21pbmcgY29ubmVjdGlvbgorICoKKyAqLwordm9pZCBpcmNvbW1fY29ubmVjdF9pbmRpY2F0aW9uKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKQoreworCWludCBjbGVuID0gMDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgY29udGFpbnMgZGF0YSBvbiB0aGUgY29udHJvbCBjaGFubmVsICovCisJaWYgKHNrYi0+bGVuID4gMCkKKwkJY2xlbiA9IHNrYi0+ZGF0YVswXTsKKwkKKwkvKiAKKwkgKiBJZiB0aGVyZSBhcmUgYW55IGRhdGEgaGlkaW5nIGluIHRoZSBjb250cm9sIGNoYW5uZWwsIHdlIG11c3QgCisJICogZGVsaXZlciBpdCBmaXJzdC4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgdGhlIGNvbnRyb2wgY2hhbm5lbCAKKwkgKiB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2tiCisJICovCisJaWYgKHNlbGYtPm5vdGlmeS5jb25uZWN0X2luZGljYXRpb24pCisJCXNlbGYtPm5vdGlmeS5jb25uZWN0X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLCAKKwkJCQkJCWluZm8tPnFvcywgaW5mby0+bWF4X2RhdGFfc2l6ZSwKKwkJCQkJCWluZm8tPm1heF9oZWFkZXJfc2l6ZSwgc2tiKTsKKwllbHNlIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgbWlzc2luZyBoYW5kbGVyXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fY29ubmVjdF9yZXNwb25zZSAoc2VsZiwgdXNlcmRhdGEsIG1heF9zZHVfc2l6ZSkKKyAqCisgKiAgICBVc2VyIGFjY2VwdHMgY29ubmVjdGlvbgorICoKKyAqLworaW50IGlyY29tbV9jb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSkKK3sKKwlpbnQgcmV0OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlyZXQgPSBpcmNvbW1fZG9fZXZlbnQoc2VsZiwgSVJDT01NX0NPTk5FQ1RfUkVTUE9OU0UsIHVzZXJkYXRhLCBOVUxMKTsKKworCXJldHVybiByZXQ7Cit9CQorCitFWFBPUlRfU1lNQk9MKGlyY29tbV9jb25uZWN0X3Jlc3BvbnNlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGNvbm5lY3RfY29uZmlybSAoc2VsZiwgc2tiKQorICoKKyAqICAgIE5vdGlmeSB1c2VyIGxheWVyIHRoYXQgdGhlIGxpbmsgaXMgbm93IGNvbm5lY3RlZAorICoKKyAqLwordm9pZCBpcmNvbW1fY29ubmVjdF9jb25maXJtKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaWYgKHNlbGYtPm5vdGlmeS5jb25uZWN0X2NvbmZpcm0gKQorCQlzZWxmLT5ub3RpZnkuY29ubmVjdF9jb25maXJtKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwKKwkJCQkJICAgICBzZWxmLCBpbmZvLT5xb3MsIAorCQkJCQkgICAgIGluZm8tPm1heF9kYXRhX3NpemUsCisJCQkJCSAgICAgaW5mby0+bWF4X2hlYWRlcl9zaXplLCBza2IpOworCWVsc2UgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBtaXNzaW5nIGhhbmRsZXJcbiIsIF9fRlVOQ1RJT05fXyApOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9kYXRhX3JlcXVlc3QgKHNlbGYsIHVzZXJkYXRhKQorICoKKyAqICAgIFNlbmQgSXJDT01NIGRhdGEgdG8gcGVlciBkZXZpY2UKKyAqCisgKi8KK2ludCBpcmNvbW1fZGF0YV9yZXF1ZXN0KHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJldDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLUVGQVVMVDspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9NQUdJQywgcmV0dXJuIC1FRkFVTFQ7KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC1FRkFVTFQ7KTsKKwkKKwlyZXQgPSBpcmNvbW1fZG9fZXZlbnQoc2VsZiwgSVJDT01NX0RBVEFfUkVRVUVTVCwgc2tiLCBOVUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woaXJjb21tX2RhdGFfcmVxdWVzdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fZGF0YV9pbmRpY2F0aW9uIChzZWxmLCBza2IpCisgKgorICogICAgRGF0YSBhcnJpdmVkLCBzbyBkZWxpdmVyIGl0IHRvIHVzZXIKKyAqCisgKi8KK3ZvaWQgaXJjb21tX2RhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorewkKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNrYi0+bGVuID4gMCwgcmV0dXJuOyk7CisKKwlpZiAoc2VsZi0+bm90aWZ5LmRhdGFfaW5kaWNhdGlvbikKKwkJc2VsZi0+bm90aWZ5LmRhdGFfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsIHNrYik7CisJZWxzZSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIG1pc3NpbmcgaGFuZGxlclxuIiwgX19GVU5DVElPTl9fICk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3Byb2Nlc3NfZGF0YSAoc2VsZiwgc2tiKQorICoKKyAqICAgIERhdGEgYXJyaXZlZCB3aGljaCBtYXkgY29udGFpbiBjb250cm9sIGNoYW5uZWwgZGF0YQorICoKKyAqLwordm9pZCBpcmNvbW1fcHJvY2Vzc19kYXRhKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGNsZW47CisKKwlJUkRBX0FTU0VSVChza2ItPmxlbiA+IDAsIHJldHVybjspOworCisJY2xlbiA9IHNrYi0+ZGF0YVswXTsKKworCS8qIAorCSAqIElmIHRoZXJlIGFyZSBhbnkgZGF0YSBoaWRpbmcgaW4gdGhlIGNvbnRyb2wgY2hhbm5lbCwgd2UgbXVzdCAKKwkgKiBkZWxpdmVyIGl0IGZpcnN0LiBUaGUgc2lkZSBlZmZlY3QgaXMgdGhhdCB0aGUgY29udHJvbCBjaGFubmVsIAorCSAqIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBza2IKKwkgKi8KKwlpZiAoY2xlbiA+IDApCisJCWlyY29tbV9jb250cm9sX2luZGljYXRpb24oc2VsZiwgc2tiLCBjbGVuKTsKKworCS8qIFJlbW92ZSBjb250cm9sIGNoYW5uZWwgZnJvbSBkYXRhIGNoYW5uZWwgKi8KKwlza2JfcHVsbChza2IsIGNsZW4rMSk7CisKKwlpZiAoc2tiLT5sZW4pCisJCWlyY29tbV9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiKTsJCQorCWVsc2UgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBkYXRhIHdhcyBjb250cm9sIGluZm8gb25seSFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18gKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fY29udHJvbF9yZXF1ZXN0IChzZWxmLCBwYXJhbXMpCisgKgorICogICAgU2VuZCBjb250cm9sIGRhdGEgdG8gcGVlciBkZXZpY2UKKyAqCisgKi8KK2ludCBpcmNvbW1fY29udHJvbF9yZXF1ZXN0KHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJldDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC1FRkFVTFQ7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybiAtRUZBVUxUOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtRUZBVUxUOyk7CisJCisJcmV0ID0gaXJjb21tX2RvX2V2ZW50KHNlbGYsIElSQ09NTV9DT05UUk9MX1JFUVVFU1QsIHNrYiwgTlVMTCk7CisKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKGlyY29tbV9jb250cm9sX3JlcXVlc3QpOworCisvKgorICogRnVuY3Rpb24gaXJjb21tX2NvbnRyb2xfaW5kaWNhdGlvbiAoc2VsZiwgc2tiKQorICoKKyAqICAgIERhdGEgaGFzIGFycml2ZWQgb24gdGhlIGNvbnRyb2wgY2hhbm5lbAorICoKKyAqLworc3RhdGljIHZvaWQgaXJjb21tX2NvbnRyb2xfaW5kaWNhdGlvbihzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCAKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY2xlbikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisKKwkvKiBVc2UgdWRhdGEgZm9yIGRlbGl2ZXJpbmcgZGF0YSBvbiB0aGUgY29udHJvbCBjaGFubmVsICovCisJaWYgKHNlbGYtPm5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uKSB7CisJCXN0cnVjdCBza19idWZmICpjdHJsX3NrYjsKKworCQkvKiBXZSBkb24ndCBvd24gdGhlIHNrYiwgc28gY2xvbmUgaXQgKi8KKwkJY3RybF9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFjdHJsX3NrYikKKwkJCXJldHVybjsKKworCQkvKiBSZW1vdmUgZGF0YSBjaGFubmVsIGZyb20gY29udHJvbCBjaGFubmVsICovCisJCXNrYl90cmltKGN0cmxfc2tiLCBjbGVuKzEpOworCQorCQlzZWxmLT5ub3RpZnkudWRhdGFfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsIAorCQkJCQkgICAgICBjdHJsX3NrYik7CisKKwkJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLQorCQkgKiBzZWUgaXJjb21tX3R0eV9jb250cm9sX2luZGljYXRpb24oKS4gKi8KKwkJZGV2X2tmcmVlX3NrYihjdHJsX3NrYik7CisJfSBlbHNlIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgbWlzc2luZyBoYW5kbGVyXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fZGlzY29ubmVjdF9yZXF1ZXN0IChzZWxmLCB1c2VyZGF0YSwgcHJpb3JpdHkpCisgKgorICogICAgVXNlciBsYXllciB3YW50cyB0byBkaXNjb25uZWN0IHRoZSBJckNPTU0gY29ubmVjdGlvbgorICoKKyAqLworaW50IGlyY29tbV9kaXNjb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKQoreworCXN0cnVjdCBpcmNvbW1faW5mbyBpbmZvOworCWludCByZXQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm4gLTE7KTsKKworCXJldCA9IGlyY29tbV9kb19ldmVudChzZWxmLCBJUkNPTU1fRElTQ09OTkVDVF9SRVFVRVNULCB1c2VyZGF0YSwgCisJCQkgICAgICAmaW5mbyk7CisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChpcmNvbW1fZGlzY29ubmVjdF9yZXF1ZXN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGRpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoc2VsZiwgc2tiKQorICoKKyAqICAgIFRlbGwgdXNlciB0aGF0IHRoZSBsaW5rIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZAorICoKKyAqLwordm9pZCBpcmNvbW1fZGlzY29ubmVjdF9pbmRpY2F0aW9uKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisgICAgICAgCisJSVJEQV9BU1NFUlQoaW5mbyAhPSBOVUxMLCByZXR1cm47KTsKKworCWlmIChzZWxmLT5ub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uKSB7CisJCXNlbGYtPm5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLAorCQkJCQkJICAgaW5mby0+cmVhc29uLCBza2IpOworCX0gZWxzZSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIG1pc3NpbmcgaGFuZGxlclxuIiwgX19GVU5DVElPTl9fICk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX2Zsb3dfcmVxdWVzdCAoc2VsZiwgZmxvdykKKyAqCisgKiAgICAKKyAqCisgKi8KK3ZvaWQgaXJjb21tX2Zsb3dfcmVxdWVzdChzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCBMT0NBTF9GTE9XIGZsb3cpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9NQUdJQywgcmV0dXJuOyk7CisKKwlpZiAoc2VsZi0+c2VydmljZV90eXBlID09IElSQ09NTV8zX1dJUkVfUkFXKQorCQlyZXR1cm47CisKKwlpcnR0cF9mbG93X3JlcXVlc3Qoc2VsZi0+dHNhcCwgZmxvdyk7Cit9CisKK0VYUE9SVF9TWU1CT0woaXJjb21tX2Zsb3dfcmVxdWVzdCk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHZvaWQgKmlyY29tbV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBpcmNvbW1fY2IgKnNlbGY7CisJbG9mZl90IG9mZiA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZpcmNvbW0tPmhiX3NwaW5sb2NrKTsKKworCWZvciAoc2VsZiA9IChzdHJ1Y3QgaXJjb21tX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlyY29tbSk7CisJICAgICBzZWxmICE9IE5VTEw7CisJICAgICBzZWxmID0gKHN0cnVjdCBpcmNvbW1fY2IgKikgaGFzaGJpbl9nZXRfbmV4dChpcmNvbW0pKSB7CisJCWlmIChvZmYrKyA9PSAqcG9zKQorCQkJYnJlYWs7CisJCQorCX0KKwlyZXR1cm4gc2VsZjsKK30KKworc3RhdGljIHZvaWQgKmlyY29tbV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCisJcmV0dXJuICh2b2lkICopIGhhc2hiaW5fZ2V0X25leHQoaXJjb21tKTsKK30KKworc3RhdGljIHZvaWQgaXJjb21tX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXNwaW5fdW5sb2NrX2lycSgmaXJjb21tLT5oYl9zcGlubG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaXJjb21tX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreyAJCisJY29uc3Qgc3RydWN0IGlyY29tbV9jYiAqc2VsZiA9IHY7CisKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybiAtRUlOVkFMOyApOworCisJaWYoc2VsZi0+bGluZSA8IDB4MTApCisJCXNlcV9wcmludGYoc2VxLCAiaXJjb21tJWQiLCBzZWxmLT5saW5lKTsKKwllbHNlCisJCXNlcV9wcmludGYoc2VxLCAiaXJscHQlZCIsIHNlbGYtPmxpbmUgLSAweDEwKTsKKworCXNlcV9wcmludGYoc2VxLAorCQkgICAiIHN0YXRlOiAlcywgc2xzYXBfc2VsOiAlIzAyeCwgZGxzYXBfc2VsOiAlIzAyeCwgbW9kZToiLAorCQkgICBpcmNvbW1fc3RhdGVbIHNlbGYtPnN0YXRlXSwKKwkJICAgc2VsZi0+c2xzYXBfc2VsLCBzZWxmLT5kbHNhcF9zZWwpOyAKKworCWlmKHNlbGYtPnNlcnZpY2VfdHlwZSAmIElSQ09NTV8zX1dJUkVfUkFXKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAzLXdpcmUtcmF3Iik7CisJaWYoc2VsZi0+c2VydmljZV90eXBlICYgSVJDT01NXzNfV0lSRSkKKwkJc2VxX3ByaW50ZihzZXEsICIgMy13aXJlIik7CisJaWYoc2VsZi0+c2VydmljZV90eXBlICYgSVJDT01NXzlfV0lSRSkKKwkJc2VxX3ByaW50ZihzZXEsICIgOS13aXJlIik7CisJaWYoc2VsZi0+c2VydmljZV90eXBlICYgSVJDT01NX0NFTlRST05JQ1MpCisJCXNlcV9wcmludGYoc2VxLCAiIENlbnRyb25pY3MiKTsKKwlzZXFfcHV0YyhzZXEsICdcbicpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXJjb21tX3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IGlyY29tbV9zZXFfc3RhcnQsCisJLm5leHQgICA9IGlyY29tbV9zZXFfbmV4dCwKKwkuc3RvcCAgID0gaXJjb21tX3NlcV9zdG9wLAorCS5zaG93ICAgPSBpcmNvbW1fc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGlyY29tbV9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmlyY29tbV9zZXFfb3BzKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnQGJyYXR0bGkubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJckNPTU0gcHJvdG9jb2wiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoaXJjb21tX2luaXQpOworbW9kdWxlX2V4aXQoaXJjb21tX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJjb21tL2lyY29tbV9ldmVudC5jIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjRlODAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX2V2ZW50LmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJjb21tX2V2ZW50LmMKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgSXJDT01NIGxheWVyIHN0YXRlIG1hY2hpbmUKKyAqIFN0YXR1czogICAgICAgIFN0YWJsZQorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU3VuIEp1biAgNiAyMDozMzoxMSAxOTk5CisgKiBNb2RpZmllZCBhdDogICBTdW4gRGVjIDEyIDEzOjQ0OjMyIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhc19vYmplY3QuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX2V2ZW50Lmg+CisKK3N0YXRpYyBpbnQgaXJjb21tX3N0YXRlX2lkbGUoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgSVJDT01NX0VWRU5UIGV2ZW50LCAKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJjb21tX3N0YXRlX3dhaXRpKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIElSQ09NTV9FVkVOVCBldmVudCwgCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pOworc3RhdGljIGludCBpcmNvbW1fc3RhdGVfd2FpdHIoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgSVJDT01NX0VWRU5UIGV2ZW50LCAKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmNvbW1faW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlyY29tbV9zdGF0ZV9jb25uKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIElSQ09NTV9FVkVOVCBldmVudCwgCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmNvbW1faW5mbyAqaW5mbyk7CisKK2NoYXIgKmlyY29tbV9zdGF0ZVtdID0geworCSJJUkNPTU1fSURMRSIsCisJIklSQ09NTV9XQUlUSSIsCisJIklSQ09NTV9XQUlUUiIsCisJIklSQ09NTV9DT05OIiwKK307CisKKyNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRworc3RhdGljIGNoYXIgKmlyY29tbV9ldmVudFtdID0geworCSJJUkNPTU1fQ09OTkVDVF9SRVFVRVNUIiwKKyAgICAgICAgIklSQ09NTV9DT05ORUNUX1JFU1BPTlNFIiwKKyAgICAgICAgIklSQ09NTV9UVFBfQ09OTkVDVF9JTkRJQ0FUSU9OIiwKKwkiSVJDT01NX0xNUF9DT05ORUNUX0lORElDQVRJT04iLAorICAgICAgICAiSVJDT01NX1RUUF9DT05ORUNUX0NPTkZJUk0iLAorCSJJUkNPTU1fTE1QX0NPTk5FQ1RfQ09ORklSTSIsCisKKyAgICAgICAgIklSQ09NTV9MTVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OIiwKKwkiSVJDT01NX1RUUF9ESVNDT05ORUNUX0lORElDQVRJT04iLAorICAgICAgICAiSVJDT01NX0RJU0NPTk5FQ1RfUkVRVUVTVCIsCisKKyAgICAgICAgIklSQ09NTV9UVFBfREFUQV9JTkRJQ0FUSU9OIiwKKwkiSVJDT01NX0xNUF9EQVRBX0lORElDQVRJT04iLAorICAgICAgICAiSVJDT01NX0RBVEFfUkVRVUVTVCIsCisgICAgICAgICJJUkNPTU1fQ09OVFJPTF9SRVFVRVNUIiwKKyAgICAgICAgIklSQ09NTV9DT05UUk9MX0lORElDQVRJT04iLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9ERUJVRyAqLworCitzdGF0aWMgaW50ICgqc3RhdGVbXSkoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgSVJDT01NX0VWRU5UIGV2ZW50LAorCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pID0gCit7CisJaXJjb21tX3N0YXRlX2lkbGUsCisJaXJjb21tX3N0YXRlX3dhaXRpLAorCWlyY29tbV9zdGF0ZV93YWl0ciwKKwlpcmNvbW1fc3RhdGVfY29ubiwKK307CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fc3RhdGVfaWRsZSAoc2VsZiwgZXZlbnQsIHNrYikKKyAqCisgKiAgICBJckNPTU0gaXMgY3VycmVudGx5IGlkbGUKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3N0YXRlX2lkbGUoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgSVJDT01NX0VWRU5UIGV2ZW50LCAKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSVJDT01NX0NPTk5FQ1RfUkVRVUVTVDoKKwkJaXJjb21tX25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1dBSVRJKTsJCQorCQlyZXQgPSBzZWxmLT5pc3N1ZS5jb25uZWN0X3JlcXVlc3Qoc2VsZiwgc2tiLCBpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRQX0NPTk5FQ1RfSU5ESUNBVElPTjoKKwljYXNlIElSQ09NTV9MTVBfQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlpcmNvbW1fbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fV0FJVFIpOworCQlpcmNvbW1fY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIHNrYiwgaW5mbyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoNCwgIiVzKCksIHVua25vd24gZXZlbnQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18gLAorCQkJICAgaXJjb21tX2V2ZW50W2V2ZW50XSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fc3RhdGVfd2FpdGkgKHNlbGYsIGV2ZW50LCBza2IpCisgKgorICogICAgVGhlIElyQ09NTSB1c2VyIGhhcyByZXF1ZXN0ZWQgYW4gSXJDT01NIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSAKKyAqICAgIGRldmljZSBhbmQgaXMgYXdhaXRpbmcgY29uZmlybWF0aW9uCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3N0YXRlX3dhaXRpKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIElSQ09NTV9FVkVOVCBldmVudCwgCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkNPTU1fVFRQX0NPTk5FQ1RfQ09ORklSTToKKwljYXNlIElSQ09NTV9MTVBfQ09OTkVDVF9DT05GSVJNOgorCQlpcmNvbW1fbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fQ09OTik7CisJCWlyY29tbV9jb25uZWN0X2NvbmZpcm0oc2VsZiwgc2tiLCBpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKKwljYXNlIElSQ09NTV9MTVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlpcmNvbW1fbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fSURMRSk7CisJCWlyY29tbV9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgc2tiLCBpbmZvKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5rbm93biBldmVudDogJXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCQkgICBpcmNvbW1fZXZlbnRbZXZlbnRdKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9zdGF0ZV93YWl0ciAoc2VsZiwgZXZlbnQsIHNrYikKKyAqCisgKiAgICBJckNPTU0gaGFzIHJlY2VpdmVkIGFuIGluY29taW5nIGNvbm5lY3Rpb24gcmVxdWVzdCBhbmQgaXMgYXdhaXRpbmcKKyAqICAgIHJlc3BvbnNlIGZyb20gdGhlIHVzZXIKKyAqLworc3RhdGljIGludCBpcmNvbW1fc3RhdGVfd2FpdHIoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgSVJDT01NX0VWRU5UIGV2ZW50LCAKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmNvbW1faW5mbyAqaW5mbykgCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkNPTU1fQ09OTkVDVF9SRVNQT05TRToKKwkJaXJjb21tX25leHRfc3RhdGUoc2VsZiwgSVJDT01NX0NPTk4pOworCQlyZXQgPSBzZWxmLT5pc3N1ZS5jb25uZWN0X3Jlc3BvbnNlKHNlbGYsIHNrYik7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX0RJU0NPTk5FQ1RfUkVRVUVTVDoKKwkJaXJjb21tX25leHRfc3RhdGUoc2VsZiwgSVJDT01NX0lETEUpOworCQlyZXQgPSBzZWxmLT5pc3N1ZS5kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZiwgc2tiLCBpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKKwljYXNlIElSQ09NTV9MTVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlpcmNvbW1fbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fSURMRSk7CisJCWlyY29tbV9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgc2tiLCBpbmZvKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5rbm93biBldmVudCA9ICVzXG4iLCBfX0ZVTkNUSU9OX18gLAorCQkJICAgaXJjb21tX2V2ZW50W2V2ZW50XSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fc3RhdGVfY29ubiAoc2VsZiwgZXZlbnQsIHNrYikKKyAqCisgKiAgICBJckNPTU0gaXMgY29ubmVjdGVkIHRvIHRoZSBwZWVyIElyQ09NTSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3N0YXRlX2Nvbm4oc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgSVJDT01NX0VWRU5UIGV2ZW50LCAKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSVJDT01NX0RBVEFfUkVRVUVTVDoKKwkJcmV0ID0gc2VsZi0+aXNzdWUuZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYiwgMCk7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUUF9EQVRBX0lORElDQVRJT046CisJCWlyY29tbV9wcm9jZXNzX2RhdGEoc2VsZiwgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fTE1QX0RBVEFfSU5ESUNBVElPTjoKKwkJaXJjb21tX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IpOworCQlicmVhazsKKwljYXNlIElSQ09NTV9DT05UUk9MX1JFUVVFU1Q6CisJCS8qIEp1c3Qgc2VuZCBhIHNlcGFyYXRlIGZyYW1lIGZvciBub3cgKi8KKwkJcmV0ID0gc2VsZi0+aXNzdWUuZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYiwgc2tiLT5sZW4pOworCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCWNhc2UgSVJDT01NX0xNUF9ESVNDT05ORUNUX0lORElDQVRJT046CisJCWlyY29tbV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9JRExFKTsKKwkJaXJjb21tX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBza2IsIGluZm8pOworCQlicmVhazsKKwljYXNlIElSQ09NTV9ESVNDT05ORUNUX1JFUVVFU1Q6CisJCWlyY29tbV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9JRExFKTsKKwkJcmV0ID0gc2VsZi0+aXNzdWUuZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYsIHNrYiwgaW5mbyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHVua25vd24gZXZlbnQgPSAlc1xuIiwgX19GVU5DVElPTl9fICwKKwkJCSAgIGlyY29tbV9ldmVudFtldmVudF0pOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX2RvX2V2ZW50IChzZWxmLCBldmVudCwgc2tiKQorICoKKyAqICAgIFByb2Nlc3MgZXZlbnQKKyAqCisgKi8KK2ludCBpcmNvbW1fZG9fZXZlbnQoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgSVJDT01NX0VWRU5UIGV2ZW50LAorCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKSAKK3sKKwlJUkRBX0RFQlVHKDQsICIlczogc3RhdGU9JXMsIGV2ZW50PSVzXG4iLCBfX0ZVTkNUSU9OX18gLAorCQkgICBpcmNvbW1fc3RhdGVbc2VsZi0+c3RhdGVdLCBpcmNvbW1fZXZlbnRbZXZlbnRdKTsKKworCXJldHVybiAoKnN0YXRlW3NlbGYtPnN0YXRlXSkoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fbmV4dF9zdGF0ZSAoc2VsZiwgc3RhdGUpCisgKgorICogICAgU3dpdGNoIHN0YXRlCisgKgorICovCit2b2lkIGlyY29tbV9uZXh0X3N0YXRlKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIElSQ09NTV9TVEFURSBzdGF0ZSkKK3sKKwlzZWxmLT5zdGF0ZSA9IHN0YXRlOworCQorCUlSREFfREVCVUcoNCwgIiVzOiBuZXh0IHN0YXRlPSVzLCBzZXJ2aWNlIHR5cGU9JWRcbiIsIF9fRlVOQ1RJT05fXyAsIAorCQkgICBpcmNvbW1fc3RhdGVbc2VsZi0+c3RhdGVdLCBzZWxmLT5zZXJ2aWNlX3R5cGUpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJjb21tL2lyY29tbV9sbXAuYyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fbG1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkwOTcyMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fbG1wLmMKQEAgLTAsMCArMSwzNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJjb21tX2xtcC5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIEludGVyZmFjZSBiZXR3ZWVuIElyQ09NTSBhbmQgSXJMTVAKKyAqIFN0YXR1czogICAgICAgIFN0YWJsZQorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU3VuIEp1biAgNiAyMDo0ODoyNyAxOTk5CisgKiBNb2RpZmllZCBhdDogICBTdW4gRGVjIDEyIDEzOjQ0OjE3IDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIFNvdXJjZXM6ICAgICAgIFByZXZpb3VzIElyTFBUIHdvcmsgYnkgVGhvbWFzIERhdmlzCisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CS8qIHN0cnVjdCBpcmRhX3NrYl9jYiAqLworCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX2V2ZW50Lmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX2xtcC5oPgorCisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fbG1wX2Nvbm5lY3RfcmVxdWVzdCAoc2VsZiwgdXNlcmRhdGEpCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV9sbXBfY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSwgCisJCQkJICAgICAgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgLSBzaG91bGQgYmUgTlVMTCBhbnl3YXkgKi8KKwlpZih1c2VyZGF0YSkKKwkJc2tiX2dldCh1c2VyZGF0YSk7CisKKwlyZXQgPSBpcmxtcF9jb25uZWN0X3JlcXVlc3Qoc2VsZi0+bHNhcCwgaW5mby0+ZGxzYXBfc2VsLAorCQkJCSAgICBpbmZvLT5zYWRkciwgaW5mby0+ZGFkZHIsIE5VTEwsIHVzZXJkYXRhKTsgCisJcmV0dXJuIHJldDsKK30JCisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fbG1wX2Nvbm5lY3RfcmVzcG9uc2UgKHNlbGYsIHNrYikKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX2xtcF9jb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCWludCByZXQ7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwkvKiBBbnkgdXNlcmRhdGEgc3VwcGxpZWQ/ICovCisJaWYgKHVzZXJkYXRhID09IE5VTEwpIHsKKwkJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJCWlmICghdHhfc2tiKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyICovCisJCXNrYl9yZXNlcnZlKHR4X3NrYiwgTE1QX01BWF9IRUFERVIpOworCX0gZWxzZSB7CisJCS8qICAKKwkJICogIENoZWNrIHRoYXQgdGhlIGNsaWVudCBoYXMgcmVzZXJ2ZWQgZW5vdWdoIHNwYWNlIGZvciAKKwkJICogIGhlYWRlcnMKKwkJICovCisJCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbSh1c2VyZGF0YSkgPj0gTE1QX01BWF9IRUFERVIsCisJCQkgICAgcmV0dXJuIC0xOyk7CisKKwkJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2hvdWxkIGJlIE5VTEwgYW55d2F5ICovCisJCXNrYl9nZXQodXNlcmRhdGEpOworCQl0eF9za2IgPSB1c2VyZGF0YTsKKwl9CisKKwlyZXQgPSBpcmxtcF9jb25uZWN0X3Jlc3BvbnNlKHNlbGYtPmxzYXAsIHR4X3NrYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcmNvbW1fbG1wX2Rpc2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCAKKwkJCQkJIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSwgCisJCQkJCSBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pCit7CisgICAgICAgIHN0cnVjdCBza19idWZmICp0eF9za2I7CisJaW50IHJldDsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisgICAgICAgIGlmICghdXNlcmRhdGEpIHsKKwkJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJCWlmICghdHhfc2tiKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCQorCQkvKiAgUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyICovCisJCXNrYl9yZXNlcnZlKHR4X3NrYiwgTE1QX01BWF9IRUFERVIpOwkJCisJCXVzZXJkYXRhID0gdHhfc2tiOworCX0gZWxzZSB7CisJCS8qIERvbid0IGZvcmdldCB0byByZWZjb3VudCBpdCAtIHNob3VsZCBiZSBOVUxMIGFueXdheSAqLworCQlza2JfZ2V0KHVzZXJkYXRhKTsKKwl9CisKKwlyZXQgPSBpcmxtcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+bHNhcCwgdXNlcmRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9sbXBfZmxvd19jb250cm9sIChza2IpCisgKgorICogICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGRhdGEgZnJhbWUgd2UgaGF2ZSBzZW50IHRvIElyTEFQIGhhcworICogICAgYmVlbiBkZWFsbG9jYXRlZC4gV2UgZG8gdGhpcyB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgZmxvb2QgSXJMQVAgd2l0aCAKKyAqICAgIGZyYW1lcywgc2luY2Ugd2UgYXJlIG5vdCB1c2luZyB0aGUgSXJUVFAgZmxvdyBjb250cm9sIG1lY2hhbmlzbQorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fbG1wX2Zsb3dfY29udHJvbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmRhX3NrYl9jYiAqY2I7CisJc3RydWN0IGlyY29tbV9jYiAqc2VsZjsKKwlpbnQgbGluZTsKKworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCWNiID0gKHN0cnVjdCBpcmRhX3NrYl9jYiAqKSBza2ItPmNiOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisgCisgICAgICAgIGxpbmUgPSBjYi0+bGluZTsKKworCXNlbGYgPSAoc3RydWN0IGlyY29tbV9jYiAqKSBoYXNoYmluX2xvY2tfZmluZChpcmNvbW0sIGxpbmUsIE5VTEwpOworICAgICAgICBpZiAoIXNlbGYpIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgZGlkbid0IGZpbmQgbXlzZWxmXG4iLCBfX0ZVTkNUSU9OX18gKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisJfQorCisgICAgICAgIElSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm47KTsKKworCXNlbGYtPnBrdF9jb3VudC0tOworCisgICAgICAgIGlmICgoc2VsZi0+cGt0X2NvdW50IDwgMikgJiYgKHNlbGYtPmZsb3dfc3RhdHVzID09IEZMT1dfU1RPUCkpIHsKKyAgICAgICAgICAgICAgICBJUkRBX0RFQlVHKDIsICIlcygpLCBhc2tpbmcgVFRZIHRvIHN0YXJ0IGFnYWluIVxuIiwgX19GVU5DVElPTl9fICk7CisgICAgICAgICAgICAgICAgc2VsZi0+Zmxvd19zdGF0dXMgPSBGTE9XX1NUQVJUOworICAgICAgICAgICAgICAgIGlmIChzZWxmLT5ub3RpZnkuZmxvd19pbmRpY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+bm90aWZ5LmZsb3dfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIAorCQkJCQkJICAgICBzZWxmLCBGTE9XX1NUQVJUKTsKKyAgICAgICAgfQorfQorICAgIAorLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9sbXBfZGF0YV9yZXF1ZXN0IChzZWxmLCB1c2VyZGF0YSkKKyAqCisgKiAgICBTZW5kIGRhdGEgZnJhbWUgdG8gcGVlciBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX2xtcF9kYXRhX3JlcXVlc3Qoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkgICBpbnQgbm90X3VzZWQpCit7CisJc3RydWN0IGlyZGFfc2tiX2NiICpjYjsKKwlpbnQgcmV0OworCisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOworCisJY2IgPSAoc3RydWN0IGlyZGFfc2tiX2NiICopIHNrYi0+Y2I7CisJCisgICAgICAgIGNiLT5saW5lID0gc2VsZi0+bGluZTsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIHNlbmRpbmcgZnJhbWVcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2VlIGlyY29tbV90dHlfZG9fc29mdGludCgpICovCisJc2tiX2dldChza2IpOworCisJc2tiLT5kZXN0cnVjdG9yID0gaXJjb21tX2xtcF9mbG93X2NvbnRyb2w7CisKKyAgICAgICAgaWYgKChzZWxmLT5wa3RfY291bnQrKyA+IDcpICYmIChzZWxmLT5mbG93X3N0YXR1cyA9PSBGTE9XX1NUQVJUKSkgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBhc2tpbmcgVFRZIHRvIHNsb3cgZG93biFcbiIsIF9fRlVOQ1RJT05fXyApOworCSAgICAgICAgc2VsZi0+Zmxvd19zdGF0dXMgPSBGTE9XX1NUT1A7CisgICAgICAgICAgICAgICAgaWYgKHNlbGYtPm5vdGlmeS5mbG93X2luZGljYXRpb24pCisgICAgICAgICAgICAgCSAgICAgICAgc2VsZi0+bm90aWZ5LmZsb3dfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIAorCQkJCSAgICAgICAgICAgICAgICAgICAgIHNlbGYsIEZMT1dfU1RPUCk7CisgICAgICAgIH0KKwlyZXQgPSBpcmxtcF9kYXRhX3JlcXVlc3Qoc2VsZi0+bHNhcCwgc2tiKTsKKwlpZiAocmV0KSB7CisJCUlSREFfRVJST1IoIiVzKCksIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJLyogaXJsbXBfZGF0YV9yZXF1ZXN0IGFscmVhZHkgZnJlZSB0aGUgcGFja2V0ICovCisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9sbXBfZGF0YV9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBza2IpCisgKgorICogICAgSW5jb21pbmcgZGF0YSB3aGljaCB3ZSBtdXN0IGRlbGl2ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUsIHRvIGNoZWNrCisgKiAgICB3ZSBhcmUgc3RpbGwgY29ubmVjdGVkLgorICovCitzdGF0aWMgaW50IGlyY29tbV9sbXBfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJjb21tX2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9NQUdJQywgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOworCQorCWlyY29tbV9kb19ldmVudChzZWxmLCBJUkNPTU1fTE1QX0RBVEFfSU5ESUNBVElPTiwgc2tiLCBOVUxMKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlyY29tbV90dHlfZGF0YV9pbmRpY2F0aW9uKCkuICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fbG1wX2Nvbm5lY3RfY29uZmlybSAoaW5zdGFuY2UsIHNhcCwgcW9zLCBtYXhfc2R1X3NpemUsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfaGVhZGVyX3NpemUsIHNrYikKKyAqCisgKiAgICBDb25uZWN0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZCBieSBwZWVyIGRldmljZQorICoKKyAqLworc3RhdGljIHZvaWQgaXJjb21tX2xtcF9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgICAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIAorCQkJCSAgICAgICBfX3UzMiBtYXhfc2VnX3NpemUsIAorCQkJCSAgICAgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJjb21tX2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fY2IgKikgaW5zdGFuY2U7CisJc3RydWN0IGlyY29tbV9pbmZvIGluZm87CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQocW9zICE9IE5VTEwsIHJldHVybjspOworCisJaW5mby5tYXhfZGF0YV9zaXplID0gbWF4X3NlZ19zaXplOworCWluZm8ubWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplOworCWluZm8ucW9zID0gcW9zOworCisJaXJjb21tX2RvX2V2ZW50KHNlbGYsIElSQ09NTV9MTVBfQ09OTkVDVF9DT05GSVJNLCBza2IsICZpbmZvKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlyY29tbV90dHlfY29ubmVjdF9jb25maXJtKCkuICovCisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX2xtcF9jb25uZWN0X2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHFvcywgbWF4X3NkdV9zaXplLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9oZWFkZXJfc2l6ZSwgc2tiKQorICoKKyAqICAgIFBlZXIgZGV2aWNlIHdhbnRzIHRvIG1ha2UgYSBjb25uZWN0aW9uIHdpdGggdXMKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV9sbXBfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsCisJCQkJCSAgX191MzIgbWF4X3NlZ19zaXplLAorCQkJCQkgIF9fdTggbWF4X2hlYWRlcl9zaXplLAorCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyY29tbV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX2NiICopaW5zdGFuY2U7CisJc3RydWN0IGlyY29tbV9pbmZvIGluZm87CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQocW9zICE9IE5VTEwsIHJldHVybjspOworCisJaW5mby5tYXhfZGF0YV9zaXplID0gbWF4X3NlZ19zaXplOworCWluZm8ubWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplOworCWluZm8ucW9zID0gcW9zOworCisJaXJjb21tX2RvX2V2ZW50KHNlbGYsIElSQ09NTV9MTVBfQ09OTkVDVF9JTkRJQ0FUSU9OLCBza2IsICZpbmZvKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlyY29tbV90dHlfY29ubmVjdF9pbmRpY2F0aW9uKCkuICovCisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX2xtcF9kaXNjb25uZWN0X2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHJlYXNvbiwgc2tiKQorICoKKyAqICAgIFBlZXIgZGV2aWNlIGhhcyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24sIG9yIHRoZSBsaW5rIHdlbnQgZG93biBmb3Igc29tZQorICogICAgb3RoZXIgcmVhc29uCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV9sbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAorCQkJCQkgICAgIExNX1JFQVNPTiByZWFzb24sCisJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJjb21tX2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fY2IgKikgaW5zdGFuY2U7CisJc3RydWN0IGlyY29tbV9pbmZvIGluZm87CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm47KTsKKworCWluZm8ucmVhc29uID0gcmVhc29uOworCisJaXJjb21tX2RvX2V2ZW50KHNlbGYsIElSQ09NTV9MTVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OLCBza2IsICZpbmZvKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlyY29tbV90dHlfZGlzY29ubmVjdF9pbmRpY2F0aW9uKCkuICovCisJaWYoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisvKgorICogRnVuY3Rpb24gaXJjb21tX29wZW5fbHNhcCAoc2VsZikKKyAqCisgKiAgICBPcGVuIExTQVAuIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIHVzZWQgd2hlbiB1c2luZyAicmF3IiBzZXJ2aWNlcworICoKKyAqLworaW50IGlyY29tbV9vcGVuX2xzYXAoc3RydWN0IGlyY29tbV9jYiAqc2VsZikKK3sKKwlub3RpZnlfdCBub3RpZnk7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIFJlZ2lzdGVyIGNhbGxiYWNrcyAqLworCWlyZGFfbm90aWZ5X2luaXQoJm5vdGlmeSk7CisJbm90aWZ5LmRhdGFfaW5kaWNhdGlvbiAgICAgICA9IGlyY29tbV9sbXBfZGF0YV9pbmRpY2F0aW9uOworCW5vdGlmeS5jb25uZWN0X2NvbmZpcm0gICAgICAgPSBpcmNvbW1fbG1wX2Nvbm5lY3RfY29uZmlybTsKKwlub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uICAgID0gaXJjb21tX2xtcF9jb25uZWN0X2luZGljYXRpb247CisJbm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IGlyY29tbV9sbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uOworCW5vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CisJc3RybGNweShub3RpZnkubmFtZSwgIklyQ09NTSIsIHNpemVvZihub3RpZnkubmFtZSkpOworCisJc2VsZi0+bHNhcCA9IGlybG1wX29wZW5fbHNhcChMU0FQX0FOWSwgJm5vdGlmeSwgMCk7CisJaWYgKCFzZWxmLT5sc2FwKSB7CisJCUlSREFfREVCVUcoMCwiJXNmYWlsZWQgdG8gYWxsb2NhdGUgdHNhcFxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAtMTsKKwl9CisJc2VsZi0+c2xzYXBfc2VsID0gc2VsZi0+bHNhcC0+c2xzYXBfc2VsOworCisJLyoKKwkgKiAgSW5pdGlhbGl6ZSB0aGUgY2FsbC10YWJsZSBmb3IgaXNzdWluZyBjb21tYW5kcworCSAqLworCXNlbGYtPmlzc3VlLmRhdGFfcmVxdWVzdCAgICAgICA9IGlyY29tbV9sbXBfZGF0YV9yZXF1ZXN0OworCXNlbGYtPmlzc3VlLmNvbm5lY3RfcmVxdWVzdCAgICA9IGlyY29tbV9sbXBfY29ubmVjdF9yZXF1ZXN0OworCXNlbGYtPmlzc3VlLmNvbm5lY3RfcmVzcG9uc2UgICA9IGlyY29tbV9sbXBfY29ubmVjdF9yZXNwb25zZTsKKwlzZWxmLT5pc3N1ZS5kaXNjb25uZWN0X3JlcXVlc3QgPSBpcmNvbW1fbG1wX2Rpc2Nvbm5lY3RfcmVxdWVzdDsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJjb21tL2lyY29tbV9wYXJhbS5jIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV9wYXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDliYWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3BhcmFtLmMKQEAgLTAsMCArMSw1MTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJjb21tX3BhcmFtLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgUGFyYW1ldGVyIGhhbmRsaW5nIGZvciB0aGUgSXJDT01NIHByb3RvY29sCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBNb24gSnVuICA3IDEwOjI1OjExIDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBKYW4gMzAgMTQ6MzI6MDMgMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3BhcmFtZXRlcnMuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX3R0eV9hdHRhY2guaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fdHR5Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fcGFyYW0uaD4KKworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fc2VydmljZV90eXBlKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICAgIGludCBnZXQpOworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fcG9ydF90eXBlKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgIGludCBnZXQpOworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fcG9ydF9uYW1lKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgIGludCBnZXQpOworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fc2VydmljZV90eXBlKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICAgIGludCBnZXQpOworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fZGF0YV9yYXRlKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgIGludCBnZXQpOworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fZGF0YV9mb3JtYXQodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgICBpbnQgZ2V0KTsKK3N0YXRpYyBpbnQgaXJjb21tX3BhcmFtX2Zsb3dfY29udHJvbCh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgCisJCQkJICAgICBpbnQgZ2V0KTsKK3N0YXRpYyBpbnQgaXJjb21tX3BhcmFtX3hvbl94b2ZmKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCBpbnQgZ2V0KTsKK3N0YXRpYyBpbnQgaXJjb21tX3BhcmFtX2VucV9hY2sodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIGludCBnZXQpOworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fbGluZV9zdGF0dXModm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgICBpbnQgZ2V0KTsKK3N0YXRpYyBpbnQgaXJjb21tX3BhcmFtX2R0ZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCk7CitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9kY2Uodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIGludCBnZXQpOworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fcG9sbCh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCk7CisKK3N0YXRpYyBwaV9taW5vcl9pbmZvX3QgcGlfbWlub3JfY2FsbF90YWJsZV9jb21tb25bXSA9IHsKKwl7IGlyY29tbV9wYXJhbV9zZXJ2aWNlX3R5cGUsIFBWX0lOVF84X0JJVFMgfSwKKwl7IGlyY29tbV9wYXJhbV9wb3J0X3R5cGUsICAgIFBWX0lOVF84X0JJVFMgfSwKKwl7IGlyY29tbV9wYXJhbV9wb3J0X25hbWUsICAgIFBWX1NUUklORyB9Cit9Oworc3RhdGljIHBpX21pbm9yX2luZm9fdCBwaV9taW5vcl9jYWxsX3RhYmxlX25vbl9yYXdbXSA9IHsKKwl7IGlyY29tbV9wYXJhbV9kYXRhX3JhdGUsICAgIFBWX0lOVF8zMl9CSVRTIHwgUFZfQklHX0VORElBTiB9LAorCXsgaXJjb21tX3BhcmFtX2RhdGFfZm9ybWF0LCAgUFZfSU5UXzhfQklUUyB9LAorCXsgaXJjb21tX3BhcmFtX2Zsb3dfY29udHJvbCwgUFZfSU5UXzhfQklUUyB9LAorCXsgaXJjb21tX3BhcmFtX3hvbl94b2ZmLCAgICAgUFZfSU5UXzE2X0JJVFMgfSwKKwl7IGlyY29tbV9wYXJhbV9lbnFfYWNrLCAgICAgIFBWX0lOVF8xNl9CSVRTIH0sCisJeyBpcmNvbW1fcGFyYW1fbGluZV9zdGF0dXMsICBQVl9JTlRfOF9CSVRTIH0KK307CitzdGF0aWMgcGlfbWlub3JfaW5mb190IHBpX21pbm9yX2NhbGxfdGFibGVfOV93aXJlW10gPSB7CisJeyBpcmNvbW1fcGFyYW1fZHRlLCAgICAgICAgICBQVl9JTlRfOF9CSVRTIH0sCisJeyBpcmNvbW1fcGFyYW1fZGNlLCAgICAgICAgICBQVl9JTlRfOF9CSVRTIH0sCisJeyBpcmNvbW1fcGFyYW1fcG9sbCwgICAgICAgICBQVl9OT19WQUxVRSB9LAorfTsKKworc3RhdGljIHBpX21ham9yX2luZm9fdCBwaV9tYWpvcl9jYWxsX3RhYmxlW10gPSB7CisJeyBwaV9taW5vcl9jYWxsX3RhYmxlX2NvbW1vbiwgIDMgfSwKKwl7IHBpX21pbm9yX2NhbGxfdGFibGVfbm9uX3JhdywgNiB9LAorIAl7IHBpX21pbm9yX2NhbGxfdGFibGVfOV93aXJlLCAgMyB9CisvKiAJeyBwaV9taW5vcl9jYWxsX3RhYmxlX2NlbnRyb25pY3MgfSAgKi8KK307CisKK3BpX3BhcmFtX2luZm9fdCBpcmNvbW1fcGFyYW1faW5mbyA9IHsgcGlfbWFqb3JfY2FsbF90YWJsZSwgMywgMHgwZiwgNCB9OworCisvKgorICogRnVuY3Rpb24gaXJjb21tX3BhcmFtX3JlcXVlc3QgKHNlbGYsIHBpLCBmbHVzaCkKKyAqCisgKiAgICBRdWV1ZSBhIHBhcmFtZXRlciBmb3IgdGhlIGNvbnRyb2wgY2hhbm5lbAorICoKKyAqLworaW50IGlyY29tbV9wYXJhbV9yZXF1ZXN0KHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCBfX3U4IHBpLCBpbnQgZmx1c2gpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGNvdW50OworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJdHR5ID0gc2VsZi0+dHR5OworCWlmICghdHR5KQorCQlyZXR1cm4gMDsKKworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBzZW5kIHBhcmFtZXRlcnMgZm9yIHJhdyBtb2RlICovCisJaWYgKHNlbGYtPnNlcnZpY2VfdHlwZSA9PSBJUkNPTU1fM19XSVJFX1JBVykKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXNrYiA9IHNlbGYtPmN0cmxfc2tiOwkKKwlpZiAoIXNrYikgeworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKDI1Nik7CisJCWlmICghc2tiKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJCisJCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKwkJc2VsZi0+Y3RybF9za2IgPSBza2I7CisJfQorCS8qIAorCSAqIEluc2VydGluZyBpcyBhIGxpdHRsZSBiaXQgdHJpY2t5IHNpbmNlIHdlIGRvbid0IGtub3cgaG93IG11Y2gKKwkgKiByb29tIHdlIHdpbGwgbmVlZC4gQnV0IHRoaXMgc2hvdWxkIGhvcGVmdWxseSB3b3JrIE9LIAorCSAqLworCWNvdW50ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgcGksIHNrYi0+dGFpbCwgc2tiX3RhaWxyb29tKHNrYiksCisJCQkJICAmaXJjb21tX3BhcmFtX2luZm8pOworCWlmIChjb3VudCA8IDApIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBubyByb29tIGZvciBwYXJhbWV0ZXIhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCXNrYl9wdXQoc2tiLCBjb3VudCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgc2tiLT5sZW49JWRcbiIsIF9fRlVOQ1RJT05fXyAsIHNrYi0+bGVuKTsKKworCWlmIChmbHVzaCkgeworCQkvKiBpcmNvbW1fdHR5X2RvX3NvZnRpbnQgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIHJlc3QgKi8KKwkJc2NoZWR1bGVfd29yaygmc2VsZi0+dHF1ZXVlKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fcGFyYW1fc2VydmljZV90eXBlIChzZWxmLCBidWYsIGxlbikKKyAqCisgKiAgICBIYW5kbGUgc2VydmljZSB0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYm90aCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIExNLUlBUworICogICAgcXVlcnkgYW5kIHRoZW4gdGhlIHJlbW90ZSBkZXZpY2Ugc2VuZHMgaXRzIGluaXRpYWwgcGFyYW1ldGVycworICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fc2VydmljZV90eXBlKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICAgIGludCBnZXQpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisJX191OCBzZXJ2aWNlX3R5cGUgPSAoX191OCkgcGFyYW0tPnB2Lmk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJaWYgKGdldCkgeworCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnNldHRpbmdzLnNlcnZpY2VfdHlwZTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRmluZCBhbGwgY29tbW9uIHNlcnZpY2UgdHlwZXMgKi8KKwlzZXJ2aWNlX3R5cGUgJj0gc2VsZi0+c2VydmljZV90eXBlOworCWlmICghc2VydmljZV90eXBlKSB7CisJCUlSREFfREVCVUcoMiwgCisJCQkgICAiJXMoKSwgTm8gY29tbW9uIHNlcnZpY2UgdHlwZSB0byB1c2UhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIC0xOworCX0KKwlJUkRBX0RFQlVHKDAsICIlcygpLCBzZXJ2aWNlcyBpbiBjb21tb249JTAyeFxuIiwgX19GVU5DVElPTl9fICwKKwkJICAgc2VydmljZV90eXBlKTsKKworCS8qCisJICogTm93IGNob29zZSBhIHByZWZlcnJlZCBzZXJ2aWNlIHR5cGUgb2YgdGhvc2UgYXZhaWxhYmxlCisJICovCisJaWYgKHNlcnZpY2VfdHlwZSAmIElSQ09NTV9DRU5UUk9OSUNTKQorCQlzZWxmLT5zZXR0aW5ncy5zZXJ2aWNlX3R5cGUgPSBJUkNPTU1fQ0VOVFJPTklDUzsKKwllbHNlIGlmIChzZXJ2aWNlX3R5cGUgJiBJUkNPTU1fOV9XSVJFKQorCQlzZWxmLT5zZXR0aW5ncy5zZXJ2aWNlX3R5cGUgPSBJUkNPTU1fOV9XSVJFOworCWVsc2UgaWYgKHNlcnZpY2VfdHlwZSAmIElSQ09NTV8zX1dJUkUpCisJCXNlbGYtPnNldHRpbmdzLnNlcnZpY2VfdHlwZSA9IElSQ09NTV8zX1dJUkU7CisJZWxzZSBpZiAoc2VydmljZV90eXBlICYgSVJDT01NXzNfV0lSRV9SQVcpCisJCXNlbGYtPnNldHRpbmdzLnNlcnZpY2VfdHlwZSA9IElSQ09NTV8zX1dJUkVfUkFXOworCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgcmVzdWx0aW5nIHNlcnZpY2UgdHlwZT0weCUwMnhcbiIsIF9fRlVOQ1RJT05fXyAsIAorCQkgICBzZWxmLT5zZXR0aW5ncy5zZXJ2aWNlX3R5cGUpOworCisJLyogCisJICogTm93IHRoZSBsaW5lIGlzIHJlYWR5IGZvciBzb21lIGNvbW11bmljYXRpb24uIENoZWNrIGlmIHdlIGFyZSBhCisgICAgICAgICAqIHNlcnZlciwgYW5kIHNlbmQgb3ZlciBzb21lIGluaXRpYWwgcGFyYW1ldGVycy4KKwkgKiBDbGllbnQgZG8gaXQgaW4gaXJjb21tX3R0eV9zdGF0ZV9zZXR1cCgpLgorCSAqIE5vdGUgOiB3ZSBtYXkgZ2V0IGNhbGxlZCBmcm9tIGlyY29tbV90dHlfZ2V0dmFsdWVfY29uZmlybSgpLAorCSAqIHRoZXJlZm9yZSBiZWZvcmUgd2UgZXZlbiBoYXZlIG9wZW4gYW55IHNvY2tldC4gQW5kIHNlbGYtPmNsaWVudAorCSAqIGlzIGluaXRpYWxpc2VkIHRvIFRSVUUgb25seSBsYXRlci4gU28sIHdlIGNoZWNrIGlmIHRoZSBsaW5rIGlzCisJICogcmVhbGx5IGluaXRpYWxpc2VkLiAtIEplYW4gSUkKKwkgKi8KKwlpZiAoKHNlbGYtPm1heF9oZWFkZXJfc2l6ZSAhPSBJUkNPTU1fVFRZX0hEUl9VTklOSVRJQUxJU0VEKSAmJgorCSAgICAoIXNlbGYtPmNsaWVudCkgJiYKKwkgICAgKHNlbGYtPnNldHRpbmdzLnNlcnZpY2VfdHlwZSAhPSBJUkNPTU1fM19XSVJFX1JBVykpCisJeworCQkvKiBJbml0IGNvbm5lY3Rpb24gKi8KKwkJaXJjb21tX3R0eV9zZW5kX2luaXRpYWxfcGFyYW1ldGVycyhzZWxmKTsKKwkJaXJjb21tX3R0eV9saW5rX2VzdGFibGlzaGVkKHNlbGYpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3BhcmFtX3BvcnRfdHlwZSAoc2VsZiwgcGFyYW0pCisgKgorICogICAgVGhlIHBvcnQgdHlwZSBwYXJhbWV0ZXIgdGVsbHMgaWYgdGhlIGRldmljZXMgYXJlIHNlcmlhbCBvciBwYXJhbGxlbC4KKyAqICAgIFNpbmNlIHdlIG9ubHkgYWR2ZXJ0aXNlIHNlcmlhbCBzZXJ2aWNlLCB0aGlzIHBhcmFtZXRlciBzaG91bGQgb25seQorICogICAgYmUgZXF1YWwgdG8gSVJDT01NX1NFUklBTC4KKyAqLworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fcG9ydF90eXBlKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCBpbnQgZ2V0KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKwkKKwlpZiAoZ2V0KQorCQlwYXJhbS0+cHYuaSA9IElSQ09NTV9TRVJJQUw7CisJZWxzZSB7CisJCXNlbGYtPnNldHRpbmdzLnBvcnRfdHlwZSA9IChfX3U4KSBwYXJhbS0+cHYuaTsKKworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBwb3J0IHR5cGU9JWRcbiIsIF9fRlVOQ1RJT05fXyAsIAorCQkJICAgc2VsZi0+c2V0dGluZ3MucG9ydF90eXBlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fcGFyYW1fcG9ydF9uYW1lIChzZWxmLCBwYXJhbSkKKyAqCisgKiAgICBFeGNoYW5nZSBwb3J0IG5hbWUKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3BhcmFtX3BvcnRfbmFtZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBpbnN0YW5jZTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJaWYgKGdldCkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBub3QgaW1wIVxuIiwgX19GVU5DVElPTl9fICk7CisJfSBlbHNlIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgcG9ydC1uYW1lPSVzXG4iLCBfX0ZVTkNUSU9OX18gLCBwYXJhbS0+cHYuYyk7CisJCXN0cm5jcHkoc2VsZi0+c2V0dGluZ3MucG9ydF9uYW1lLCBwYXJhbS0+cHYuYywgMzIpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3BhcmFtX2RhdGFfcmF0ZSAoc2VsZiwgcGFyYW0pCisgKgorICogICAgRXhjaGFuZ2UgZGF0YSByYXRlIHRvIGJlIHVzZWQgaW4gdGhpcyBzZXR0aW5ncworICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fZGF0YV9yYXRlKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCBpbnQgZ2V0KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGluc3RhbmNlOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlpZiAoZ2V0KQorCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnNldHRpbmdzLmRhdGFfcmF0ZTsKKwllbHNlCisJCXNlbGYtPnNldHRpbmdzLmRhdGFfcmF0ZSA9IHBhcmFtLT5wdi5pOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIGRhdGEgcmF0ZSA9ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBwYXJhbS0+cHYuaSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9wYXJhbV9kYXRhX2Zvcm1hdCAoc2VsZiwgcGFyYW0pCisgKgorICogICAgRXhjaGFuZ2UgZGF0YSBmb3JtYXQgdG8gYmUgdXNlZCBpbiB0aGlzIHNldHRpbmdzCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9kYXRhX2Zvcm1hdCh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgCisJCQkJICAgIGludCBnZXQpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJaWYgKGdldCkKKwkJcGFyYW0tPnB2LmkgPSBzZWxmLT5zZXR0aW5ncy5kYXRhX2Zvcm1hdDsKKwllbHNlCisJCXNlbGYtPnNldHRpbmdzLmRhdGFfZm9ybWF0ID0gKF9fdTgpIHBhcmFtLT5wdi5pOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3BhcmFtX2Zsb3dfY29udHJvbCAoc2VsZiwgcGFyYW0pCisgKgorICogICAgRXhjaGFuZ2UgZmxvdyBjb250cm9sIHNldHRpbmdzIHRvIGJlIHVzZWQgaW4gdGhpcyBzZXR0aW5ncworICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fZmxvd19jb250cm9sKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICAgIGludCBnZXQpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCQorCWlmIChnZXQpCisJCXBhcmFtLT5wdi5pID0gc2VsZi0+c2V0dGluZ3MuZmxvd19jb250cm9sOworCWVsc2UKKwkJc2VsZi0+c2V0dGluZ3MuZmxvd19jb250cm9sID0gKF9fdTgpIHBhcmFtLT5wdi5pOworCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgZmxvdyBjb250cm9sID0gMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18gLCAoX191OCkgcGFyYW0tPnB2LmkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fcGFyYW1feG9uX3hvZmYgKHNlbGYsIHBhcmFtKQorICoKKyAqICAgIEV4Y2hhbmdlIFhPTi9YT0ZGIGNoYXJhY3RlcnMKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3BhcmFtX3hvbl94b2ZmKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCBpbnQgZ2V0KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKwkKKwlpZiAoZ2V0KSB7CisJCXBhcmFtLT5wdi5pID0gc2VsZi0+c2V0dGluZ3MueG9ueG9mZlswXTsKKwkJcGFyYW0tPnB2LmkgfD0gc2VsZi0+c2V0dGluZ3MueG9ueG9mZlsxXSA8PCA4OworCX0gZWxzZSB7CisJCXNlbGYtPnNldHRpbmdzLnhvbnhvZmZbMF0gPSAoX191MTYpIHBhcmFtLT5wdi5pICYgMHhmZjsKKwkJc2VsZi0+c2V0dGluZ3MueG9ueG9mZlsxXSA9IChfX3UxNikgcGFyYW0tPnB2LmkgPj4gODsKKwl9CisKKwlJUkRBX0RFQlVHKDAsICIlcygpLCBYT04vWE9GRiA9IDB4JTAyeCwweCUwMnhcbiIsIF9fRlVOQ1RJT05fXyAsIAorCQkgICBwYXJhbS0+cHYuaSAmIDB4ZmYsIHBhcmFtLT5wdi5pID4+IDgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fcGFyYW1fZW5xX2FjayAoc2VsZiwgcGFyYW0pCisgKgorICogICAgRXhjaGFuZ2UgRU5RL0FDSyBjaGFyYWN0ZXJzCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9lbnFfYWNrKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCBpbnQgZ2V0KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKwkKKwlpZiAoZ2V0KSB7CisJCXBhcmFtLT5wdi5pID0gc2VsZi0+c2V0dGluZ3MuZW5xYWNrWzBdOworCQlwYXJhbS0+cHYuaSB8PSBzZWxmLT5zZXR0aW5ncy5lbnFhY2tbMV0gPDwgODsKKwl9IGVsc2UgeworCQlzZWxmLT5zZXR0aW5ncy5lbnFhY2tbMF0gPSAoX191MTYpIHBhcmFtLT5wdi5pICYgMHhmZjsKKwkJc2VsZi0+c2V0dGluZ3MuZW5xYWNrWzFdID0gKF9fdTE2KSBwYXJhbS0+cHYuaSA+PiA4OworCX0KKworCUlSREFfREVCVUcoMCwgIiVzKCksIEVOUS9BQ0sgPSAweCUwMngsMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18gLAorCQkgICBwYXJhbS0+cHYuaSAmIDB4ZmYsIHBhcmFtLT5wdi5pID4+IDgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fcGFyYW1fbGluZV9zdGF0dXMgKHNlbGYsIHBhcmFtKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fbGluZV9zdGF0dXModm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgICBpbnQgZ2V0KQoreworCUlSREFfREVCVUcoMiwgIiVzKCksIG5vdCBpbXBsLlxuIiwgX19GVU5DVElPTl9fICk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9wYXJhbV9kdGUgKGluc3RhbmNlLCBwYXJhbSkKKyAqCisgKiAgICBJZiB3ZSBnZXQgaGVyZSwgdGhlcmUgbXVzdCBiZSBzb21lIHNvcnQgb2YgbnVsbC1tb2RlbSBjb25uZWN0aW9uLCBhbmQKKyAqICAgIHdlIGFyZSBwcm9iYWJseSB3b3JraW5nIGluIHNlcnZlciBtb2RlIGFzIHdlbGwuCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3BhcmFtX2R0ZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBpbnN0YW5jZTsKKwlfX3U4IGR0ZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlpZiAoZ2V0KQorCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnNldHRpbmdzLmR0ZTsKKwllbHNlIHsKKwkJZHRlID0gKF9fdTgpIHBhcmFtLT5wdi5pOworCisJCXNlbGYtPnNldHRpbmdzLmRjZSA9IDA7CisJCQkJCisJCWlmIChkdGUgJiBJUkNPTU1fREVMVEFfRFRSKQorCQkJc2VsZi0+c2V0dGluZ3MuZGNlIHw9IChJUkNPTU1fREVMVEFfRFNSfAorCQkJCQkgICAgICBJUkNPTU1fREVMVEFfUkkgfAorCQkJCQkgICAgICBJUkNPTU1fREVMVEFfQ0QpOworCQlpZiAoZHRlICYgSVJDT01NX0RUUikKKwkJCXNlbGYtPnNldHRpbmdzLmRjZSB8PSAoSVJDT01NX0RTUnwKKwkJCQkJICAgICAgSVJDT01NX1JJIHwKKwkJCQkJICAgICAgSVJDT01NX0NEKTsKKwkJCisJCWlmIChkdGUgJiBJUkNPTU1fREVMVEFfUlRTKQorCQkJc2VsZi0+c2V0dGluZ3MuZGNlIHw9IElSQ09NTV9ERUxUQV9DVFM7CisJCWlmIChkdGUgJiBJUkNPTU1fUlRTKQorCQkJc2VsZi0+c2V0dGluZ3MuZGNlIHw9IElSQ09NTV9DVFM7CisKKwkJLyogVGFrZSBhcHByb3ByaWF0ZSBhY3Rpb25zICovCisJCWlyY29tbV90dHlfY2hlY2tfbW9kZW1fc3RhdHVzKHNlbGYpOworCisJCS8qIE51bGwgbW9kZW0gY2FibGUgZW11bGF0b3IgKi8KKwkJc2VsZi0+c2V0dGluZ3MubnVsbF9tb2RlbSA9IFRSVUU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fcGFyYW1fZGNlIChpbnN0YW5jZSwgcGFyYW0pCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9kY2Uodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIGludCBnZXQpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisJX191OCBkY2U7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBkY2UgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXyAsIChfX3U4KSBwYXJhbS0+cHYuaSk7CisKKwlkY2UgPSAoX191OCkgcGFyYW0tPnB2Lmk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJc2VsZi0+c2V0dGluZ3MuZGNlID0gZGNlOworCisJLyogQ2hlY2sgaWYgYW55IG9mIHRoZSBzZXR0aW5ncyBoYXZlIGNoYW5nZWQgKi8KKwlpZiAoZGNlICYgMHgwZikgeworCQlpZiAoZGNlICYgSVJDT01NX0RFTFRBX0NUUykgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgQ1RTIFxuIiwgX19GVU5DVElPTl9fICk7CisJCX0KKwl9CisKKwlpcmNvbW1fdHR5X2NoZWNrX21vZGVtX3N0YXR1cyhzZWxmKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3BhcmFtX3BvbGwgKGluc3RhbmNlLCBwYXJhbSkKKyAqCisgKiAgICBDYWxsZWQgd2hlbiB0aGUgcGVlciBkZXZpY2UgaXMgcG9sbGluZyBmb3IgdGhlIGxpbmUgc2V0dGluZ3MKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3BhcmFtX3BvbGwodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIGludCBnZXQpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJLyogUG9sbCBwYXJhbWV0ZXJzIGFyZSBhbHdheXMgb2YgbGVuZ2h0IDAgKGp1c3QgYSBzaWduYWwpICovCisJaWYgKCFnZXQpIHsKKwkJLyogUmVzcG9uZCB3aXRoIERURSBsaW5lIHNldHRpbmdzICovCisJCWlyY29tbV9wYXJhbV9yZXF1ZXN0KHNlbGYsIElSQ09NTV9EVEUsIFRSVUUpOworCX0KKwlyZXR1cm4gMDsKK30KKworCisKKworCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0cC5jIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV90dHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOThiZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV90dHAuYwpAQCAtMCwwICsxLDM2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcmNvbW1fdHRwLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgSW50ZXJmYWNlIGJldHdlZW4gSXJDT01NIGFuZCBJclRUUAorICogU3RhdHVzOiAgICAgICAgU3RhYmxlCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTdW4gSnVuICA2IDIwOjQ4OjI3IDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIE1vbiBEZWMgMTMgMTE6MzU6MTMgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX2V2ZW50Lmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX3R0cC5oPgorCitzdGF0aWMgaW50IGlyY29tbV90dHBfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBpcmNvbW1fdHRwX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgCisJCQkJICAgICAgIF9fdTMyIG1heF9zZHVfc2l6ZSwgCisJCQkJICAgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHBfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsCisJCQkJCSAgX191MzIgbWF4X3NkdV9zaXplLAorCQkJCQkgIF9fdTggbWF4X2hlYWRlcl9zaXplLAorCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgaXJjb21tX3R0cF9mbG93X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgICAgICAgTE9DQUxfRkxPVyBjbWQpOworc3RhdGljIHZvaWQgaXJjb21tX3R0cF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJCSAgICAgTE1fUkVBU09OIHJlYXNvbiwKKwkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJjb21tX3R0cF9kYXRhX3JlcXVlc3Qoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkgICBpbnQgY2xlbik7CitzdGF0aWMgaW50IGlyY29tbV90dHBfY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSwgCisJCQkJICAgICAgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJjb21tX3R0cF9jb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSk7CitzdGF0aWMgaW50IGlyY29tbV90dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIAorCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhLCAKKwkJCQkJIHN0cnVjdCBpcmNvbW1faW5mbyAqaW5mbyk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fb3Blbl90c2FwIChzZWxmKQorICoKKyAqICAgIAorICoKKyAqLworaW50IGlyY29tbV9vcGVuX3RzYXAoc3RydWN0IGlyY29tbV9jYiAqc2VsZikKK3sKKwlub3RpZnlfdCBub3RpZnk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIFJlZ2lzdGVyIGNhbGxiYWNrcyAqLworCWlyZGFfbm90aWZ5X2luaXQoJm5vdGlmeSk7CisJbm90aWZ5LmRhdGFfaW5kaWNhdGlvbiAgICAgICA9IGlyY29tbV90dHBfZGF0YV9pbmRpY2F0aW9uOworCW5vdGlmeS5jb25uZWN0X2NvbmZpcm0gICAgICAgPSBpcmNvbW1fdHRwX2Nvbm5lY3RfY29uZmlybTsKKwlub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uICAgID0gaXJjb21tX3R0cF9jb25uZWN0X2luZGljYXRpb247CisJbm90aWZ5LmZsb3dfaW5kaWNhdGlvbiAgICAgICA9IGlyY29tbV90dHBfZmxvd19pbmRpY2F0aW9uOworCW5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24gPSBpcmNvbW1fdHRwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbjsKKwlub3RpZnkuaW5zdGFuY2UgPSBzZWxmOworCXN0cmxjcHkobm90aWZ5Lm5hbWUsICJJckNPTU0iLCBzaXplb2Yobm90aWZ5Lm5hbWUpKTsKKworCXNlbGYtPnRzYXAgPSBpcnR0cF9vcGVuX3RzYXAoTFNBUF9BTlksIERFRkFVTFRfSU5JVElBTF9DUkVESVQsCisJCQkJICAgICAmbm90aWZ5KTsKKwlpZiAoIXNlbGYtPnRzYXApIHsKKwkJSVJEQV9ERUJVRygwLCAiJXNmYWlsZWQgdG8gYWxsb2NhdGUgdHNhcFxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAtMTsKKwl9CisJc2VsZi0+c2xzYXBfc2VsID0gc2VsZi0+dHNhcC0+c3RzYXBfc2VsOworCisJLyoKKwkgKiAgSW5pdGlhbGl6ZSB0aGUgY2FsbC10YWJsZSBmb3IgaXNzdWluZyBjb21tYW5kcworCSAqLworCXNlbGYtPmlzc3VlLmRhdGFfcmVxdWVzdCAgICAgICA9IGlyY29tbV90dHBfZGF0YV9yZXF1ZXN0OworCXNlbGYtPmlzc3VlLmNvbm5lY3RfcmVxdWVzdCAgICA9IGlyY29tbV90dHBfY29ubmVjdF9yZXF1ZXN0OworCXNlbGYtPmlzc3VlLmNvbm5lY3RfcmVzcG9uc2UgICA9IGlyY29tbV90dHBfY29ubmVjdF9yZXNwb25zZTsKKwlzZWxmLT5pc3N1ZS5kaXNjb25uZWN0X3JlcXVlc3QgPSBpcmNvbW1fdHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdDsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0cF9jb25uZWN0X3JlcXVlc3QgKHNlbGYsIHVzZXJkYXRhKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHRwX2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCAKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEsIAorCQkJCSAgICAgIHN0cnVjdCBpcmNvbW1faW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2hvdWxkIGJlIE5VTEwgYW55d2F5ICovCisJaWYodXNlcmRhdGEpCisJCXNrYl9nZXQodXNlcmRhdGEpOworCisJcmV0ID0gaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXAsIGluZm8tPmRsc2FwX3NlbCwKKwkJCQkgICAgaW5mby0+c2FkZHIsIGluZm8tPmRhZGRyLCBOVUxMLCAKKwkJCQkgICAgVFRQX1NBUl9ESVNBQkxFLCB1c2VyZGF0YSk7IAorCisJcmV0dXJuIHJldDsKK30JCisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHRwX2Nvbm5lY3RfcmVzcG9uc2UgKHNlbGYsIHNrYikKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3R0cF9jb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSkKK3sKKwlpbnQgcmV0OworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2hvdWxkIGJlIE5VTEwgYW55d2F5ICovCisJaWYodXNlcmRhdGEpCisJCXNrYl9nZXQodXNlcmRhdGEpOworCisJcmV0ID0gaXJ0dHBfY29ubmVjdF9yZXNwb25zZShzZWxmLT50c2FwLCBUVFBfU0FSX0RJU0FCTEUsIHVzZXJkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHRwX2RhdGFfcmVxdWVzdCAoc2VsZiwgdXNlcmRhdGEpCisgKgorICogICAgU2VuZCBJckNPTU0gZGF0YSB0byBJclRUUCBsYXllci4gQ3VycmVudGx5IHdlIGRvIG5vdCB0cnkgdG8gY29tYmluZSAKKyAqICAgIGNvbnRyb2wgZGF0YSB3aXRoIHB1cmUgZGF0YSwgc28gdGhleSB3aWxsIGJlIHNlbnQgYXMgc2VwYXJhdGUgZnJhbWVzLiAKKyAqICAgIFNob3VsZCBub3QgYmUgYSBiaWcgcHJvYmxlbSB0aG91Z2gsIHNpbmNlIGNvbnRyb2wgZnJhbWVzIGFyZSByYXJlLiBCdXQKKyAqICAgIHNvbWUgb2YgdGhlbSBhcmUgc2VudCBhZnRlciBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQsIHNvIHRoaXMgY2FuIAorICogICAgaW5jcmVhc2UgdGhlIGxhdGVuY3kgYSBiaXQuCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3R0cF9kYXRhX3JlcXVlc3Qoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkgICBpbnQgY2xlbikKK3sKKwlpbnQgcmV0OworCisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgY2xlbj0lZFxuIiwgX19GVU5DVElPTl9fICwgY2xlbik7CisKKwkvKiAKKwkgKiBJbnNlcnQgY2xlbiBmaWVsZCwgY3VycmVudGx5IHdlIGVpdGhlciBzZW5kIGRhdGEgb25seSwgb3IgY29udHJvbAorCSAqIG9ubHkgZnJhbWVzLCB0byBtYWtlIHRoaW5ncyBlYXNpZXIgYW5kIGF2b2lkIHF1ZXVlaW5nCisJICovCisJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHNrYikgPj0gSVJDT01NX0hFQURFUl9TSVpFLCByZXR1cm4gLTE7KTsKKworCS8qIERvbid0IGZvcmdldCB0byByZWZjb3VudCBpdCAtIHNlZSBpcmNvbW1fdHR5X2RvX3NvZnRpbnQoKSAqLworCXNrYl9nZXQoc2tiKTsKKworCXNrYl9wdXNoKHNrYiwgSVJDT01NX0hFQURFUl9TSVpFKTsKKworCXNrYi0+ZGF0YVswXSA9IGNsZW47CisKKwlyZXQgPSBpcnR0cF9kYXRhX3JlcXVlc3Qoc2VsZi0+dHNhcCwgc2tiKTsKKwlpZiAocmV0KSB7CisJCUlSREFfRVJST1IoIiVzKCksIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJLyogaXJ0dHBfZGF0YV9yZXF1ZXN0IGFscmVhZHkgZnJlZSB0aGUgcGFja2V0ICovCisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHBfZGF0YV9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBza2IpCisgKgorICogICAgSW5jb21pbmcgZGF0YQorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHRwX2RhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyY29tbV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX2NiICopIGluc3RhbmNlOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlyY29tbV9kb19ldmVudChzZWxmLCBJUkNPTU1fVFRQX0RBVEFfSU5ESUNBVElPTiwgc2tiLCBOVUxMKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlyY29tbV90dHlfZGF0YV9pbmRpY2F0aW9uKCkuICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlyY29tbV90dHBfY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCAKKwkJCQkgICAgICAgX191MzIgbWF4X3NkdV9zaXplLCAKKwkJCQkgICAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyY29tbV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX2NiICopIGluc3RhbmNlOworCXN0cnVjdCBpcmNvbW1faW5mbyBpbmZvOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHFvcyAhPSBOVUxMLCBnb3RvIG91dDspOworCisJaWYgKG1heF9zZHVfc2l6ZSAhPSBUVFBfU0FSX0RJU0FCTEUpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgU0FSIG5vdCBhbGxvd2VkIGZvciBJckNPTU0hXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXQ7CisJfQorCisJaW5mby5tYXhfZGF0YV9zaXplID0gaXJ0dHBfZ2V0X21heF9zZWdfc2l6ZShzZWxmLT50c2FwKQorCQktIElSQ09NTV9IRUFERVJfU0laRTsKKwlpbmZvLm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZSArIElSQ09NTV9IRUFERVJfU0laRTsKKwlpbmZvLnFvcyA9IHFvczsKKworCWlyY29tbV9kb19ldmVudChzZWxmLCBJUkNPTU1fVFRQX0NPTk5FQ1RfQ09ORklSTSwgc2tiLCAmaW5mbyk7CisKK291dDoKKwkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBpcmNvbW1fdHR5X2Nvbm5lY3RfY29uZmlybSgpLiAqLworCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHBfY29ubmVjdF9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBxb3MsIG1heF9zZHVfc2l6ZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfaGVhZGVyX3NpemUsIHNrYikKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHBfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsCisJCQkJCSAgX191MzIgbWF4X3NkdV9zaXplLAorCQkJCQkgIF9fdTggbWF4X2hlYWRlcl9zaXplLAorCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyY29tbV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX2NiICopaW5zdGFuY2U7CisJc3RydWN0IGlyY29tbV9pbmZvIGluZm87CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQocW9zICE9IE5VTEwsIGdvdG8gb3V0Oyk7CisKKwlpZiAobWF4X3NkdV9zaXplICE9IFRUUF9TQVJfRElTQUJMRSkgeworCQlJUkRBX0VSUk9SKCIlcygpLCBTQVIgbm90IGFsbG93ZWQgZm9yIElyQ09NTSFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisKKwlpbmZvLm1heF9kYXRhX3NpemUgPSBpcnR0cF9nZXRfbWF4X3NlZ19zaXplKHNlbGYtPnRzYXApCisJCS0gSVJDT01NX0hFQURFUl9TSVpFOworCWluZm8ubWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplICsgSVJDT01NX0hFQURFUl9TSVpFOworCWluZm8ucW9zID0gcW9zOworCisJaXJjb21tX2RvX2V2ZW50KHNlbGYsIElSQ09NTV9UVFBfQ09OTkVDVF9JTkRJQ0FUSU9OLCBza2IsICZpbmZvKTsKKworb3V0OgorCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlyY29tbV90dHlfY29ubmVjdF9pbmRpY2F0aW9uKCkuICovCisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0cF9kaXNjb25uZWN0X3JlcXVlc3QgKHNlbGYsIHVzZXJkYXRhLCBpbmZvKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCAKKwkJCQkJIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSwgCisJCQkJCSBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pCit7CisJaW50IHJldDsKKworCS8qIERvbid0IGZvcmdldCB0byByZWZjb3VudCBpdCAtIHNob3VsZCBiZSBOVUxMIGFueXdheSAqLworCWlmKHVzZXJkYXRhKQorCQlza2JfZ2V0KHVzZXJkYXRhKTsKKworCXJldCA9IGlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwLCB1c2VyZGF0YSwgUF9OT1JNQUwpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHBfZGlzY29ubmVjdF9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCByZWFzb24sIHNrYikKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAorCQkJCQkgICAgIExNX1JFQVNPTiByZWFzb24sCisJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJjb21tX2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fY2IgKikgaW5zdGFuY2U7CisJc3RydWN0IGlyY29tbV9pbmZvIGluZm87CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm47KTsKKworCWluZm8ucmVhc29uID0gcmVhc29uOworCisJaXJjb21tX2RvX2V2ZW50KHNlbGYsIElSQ09NTV9UVFBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OLCBza2IsICZpbmZvKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlyY29tbV90dHlfZGlzY29ubmVjdF9pbmRpY2F0aW9uKCkuICovCisJaWYoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHRwX2Zsb3dfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgY21kKQorICoKKyAqICAgIExheWVyIGJlbG93IGlzIHRlbGxpbmcgdXMgdG8gc3RhcnQgb3Igc3RvcCB0aGUgZmxvdyBvZiBkYXRhCisgKgorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHRwX2Zsb3dfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgICAgICBMT0NBTF9GTE9XIGNtZCkKK3sKKwlzdHJ1Y3QgaXJjb21tX2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm47KTsKKwkKKwlpZiAoc2VsZi0+bm90aWZ5LmZsb3dfaW5kaWNhdGlvbikKKwkJc2VsZi0+bm90aWZ5LmZsb3dfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsIGNtZCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJjb21tL2lyY29tbV90dHkuYyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxZTYxMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5LmMKQEAgLTAsMCArMSwxNDA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlyY29tbV90dHkuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBJckNPTU0gc2VyaWFsIFRUWSBkcml2ZXIKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBKdW4gIDYgMjE6MDA6NTYgMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgV2VkIEZlYiAyMyAwMDowOTowMiAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBTb3VyY2VzOiAgICAgICBzZXJpYWwuYyBhbmQgcHJldmlvdXMgSXJDT01NIHdvcmsgYnkgVGFrYWhpZGUgSGlndWNoaQorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CQkvKiBmb3IgTU9EVUxFX0FMSUFTX0NIQVJERVZfTUFKT1IgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX3BhcmFtLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX3R0eV9hdHRhY2guaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fdHR5Lmg+CisKK3N0YXRpYyBpbnQgIGlyY29tbV90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgaW50ICBpcmNvbW1fdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LAorCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CitzdGF0aWMgaW50ICBpcmNvbW1fdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgaXJjb21tX3R0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIGludCAgaXJjb21tX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9kb19zb2Z0aW50KHZvaWQgKnByaXZhdGVfKTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfc2h1dGRvd24oc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworCitzdGF0aWMgaW50IGlyY29tbV90dHlfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IGlyY29tbV90dHlfY29udHJvbF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfZmxvd19pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAorCQkJCSAgICAgICBMT0NBTF9GTE9XIGNtZCk7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9yZWFkX3Byb2MoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwKKwkJCQlpbnQgKmVvZiwgdm9pZCAqdW51c2VkKTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXI7CisKK2hhc2hiaW5fdCAqaXJjb21tX3R0eSA9IE5VTEw7CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgb3BzID0geworCS5vcGVuICAgICAgICAgICAgPSBpcmNvbW1fdHR5X29wZW4sCisJLmNsb3NlICAgICAgICAgICA9IGlyY29tbV90dHlfY2xvc2UsCisJLndyaXRlICAgICAgICAgICA9IGlyY29tbV90dHlfd3JpdGUsCisJLndyaXRlX3Jvb20gICAgICA9IGlyY29tbV90dHlfd3JpdGVfcm9vbSwKKwkuY2hhcnNfaW5fYnVmZmVyID0gaXJjb21tX3R0eV9jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciAgICA9IGlyY29tbV90dHlfZmx1c2hfYnVmZmVyLAorCS5pb2N0bCAgICAgICAgICAgPSBpcmNvbW1fdHR5X2lvY3RsLAkvKiBpcmNvbW1fdHR5X2lvY3RsLmMgKi8KKwkudGlvY21nZXQgICAgICAgID0gaXJjb21tX3R0eV90aW9jbWdldCwJLyogaXJjb21tX3R0eV9pb2N0bC5jICovCisJLnRpb2Ntc2V0ICAgICAgICA9IGlyY29tbV90dHlfdGlvY21zZXQsCS8qIGlyY29tbV90dHlfaW9jdGwuYyAqLworCS50aHJvdHRsZSAgICAgICAgPSBpcmNvbW1fdHR5X3Rocm90dGxlLAorCS51bnRocm90dGxlICAgICAgPSBpcmNvbW1fdHR5X3VudGhyb3R0bGUsCisJLnNlbmRfeGNoYXIgICAgICA9IGlyY29tbV90dHlfc2VuZF94Y2hhciwKKwkuc2V0X3Rlcm1pb3MgICAgID0gaXJjb21tX3R0eV9zZXRfdGVybWlvcywKKwkuc3RvcCAgICAgICAgICAgID0gaXJjb21tX3R0eV9zdG9wLAorCS5zdGFydCAgICAgICAgICAgPSBpcmNvbW1fdHR5X3N0YXJ0LAorCS5oYW5ndXAgICAgICAgICAgPSBpcmNvbW1fdHR5X2hhbmd1cCwKKwkud2FpdF91bnRpbF9zZW50ID0gaXJjb21tX3R0eV93YWl0X3VudGlsX3NlbnQsCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwkucmVhZF9wcm9jICAgICAgID0gaXJjb21tX3R0eV9yZWFkX3Byb2MsCisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KK307CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2luaXQoKQorICoKKyAqICAgIEluaXQgSXJDT01NIFRUWSBsYXllci9kcml2ZXIKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGlyY29tbV90dHlfaW5pdCh2b2lkKQoreworCWRyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoSVJDT01NX1RUWV9QT1JUUyk7CisJaWYgKCFkcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCWlyY29tbV90dHkgPSBoYXNoYmluX25ldyhIQl9MT0NLKTsgCisJaWYgKGlyY29tbV90dHkgPT0gTlVMTCkgeworCQlJUkRBX0VSUk9SKCIlcygpLCBjYW4ndCBhbGxvY2F0ZSBoYXNoYmluIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcHV0X3R0eV9kcml2ZXIoZHJpdmVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZHJpdmVyLT5vd25lcgkJPSBUSElTX01PRFVMRTsKKwlkcml2ZXItPmRyaXZlcl9uYW1lICAgICA9ICJpcmNvbW0iOworCWRyaXZlci0+bmFtZSAgICAgICAgICAgID0gImlyY29tbSI7CisJZHJpdmVyLT5kZXZmc19uYW1lICAgICAgPSAiaXJjb21tIjsKKwlkcml2ZXItPm1ham9yICAgICAgICAgICA9IElSQ09NTV9UVFlfTUFKT1I7CisJZHJpdmVyLT5taW5vcl9zdGFydCAgICAgPSBJUkNPTU1fVFRZX01JTk9SOworCWRyaXZlci0+dHlwZSAgICAgICAgICAgID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlkcml2ZXItPnN1YnR5cGUgICAgICAgICA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlkcml2ZXItPmluaXRfdGVybWlvcyAgICA9IHR0eV9zdGRfdGVybWlvczsKKwlkcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCWRyaXZlci0+ZmxhZ3MgICAgICAgICAgID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoZHJpdmVyLCAmb3BzKTsKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIpKSB7CisJCUlSREFfRVJST1IoIiVzKCk6IENvdWxkbid0IHJlZ2lzdGVyIHNlcmlhbCBkcml2ZXJcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlwdXRfdHR5X2RyaXZlcihkcml2ZXIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgX19pcmNvbW1fdHR5X2NsZWFudXAoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYpCit7CisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJaXJjb21tX3R0eV9zaHV0ZG93bihzZWxmKTsKKworCXNlbGYtPm1hZ2ljID0gMDsKKwlrZnJlZShzZWxmKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfY2xlYW51cCAoKQorICoKKyAqICAgIFJlbW92ZSBJckNPTU0gVFRZIGxheWVyL2RyaXZlcgorICoKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGlyY29tbV90dHlfY2xlYW51cCh2b2lkKQoreworCWludCByZXQ7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisKKwlyZXQgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIElSREFfRVJST1IoIiVzKCksIGZhaWxlZCB0byB1bnJlZ2lzdGVyIGRyaXZlclxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwloYXNoYmluX2RlbGV0ZShpcmNvbW1fdHR5LCAoRlJFRV9GVU5DKSBfX2lyY29tbV90dHlfY2xlYW51cCk7CisJcHV0X3R0eV9kcml2ZXIoZHJpdmVyKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9zdGFydHVwIChzZWxmKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X3N0YXJ0dXAoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYpCit7CisJbm90aWZ5X3Qgbm90aWZ5OworCWludCByZXQgPSAtRU5PREVWOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJLyogQ2hlY2sgaWYgYWxyZWFkeSBvcGVuICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoQVNZTkNfQl9JTklUSUFMSVpFRCwgJnNlbGYtPmZsYWdzKSkgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBhbHJlYWR5IG9wZW4gc28gYnJlYWsgb3V0IVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAwOworCX0KKworCS8qIFJlZ2lzdGVyIHdpdGggSXJDT01NICovCisJaXJkYV9ub3RpZnlfaW5pdCgmbm90aWZ5KTsKKwkvKiBUaGVzZSBjYWxsYmFja3Mgd2UgbXVzdCBoYW5kbGUgb3Vyc2VsdmVzICovCisJbm90aWZ5LmRhdGFfaW5kaWNhdGlvbiAgICAgICA9IGlyY29tbV90dHlfZGF0YV9pbmRpY2F0aW9uOworCW5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uICAgICAgPSBpcmNvbW1fdHR5X2NvbnRyb2xfaW5kaWNhdGlvbjsKKyAJbm90aWZ5LmZsb3dfaW5kaWNhdGlvbiAgICAgICA9IGlyY29tbV90dHlfZmxvd19pbmRpY2F0aW9uOworCisJLyogVXNlIHRoZSBpcmNvbW1fdHR5IGludGVyZmFjZSBmb3IgdGhlc2Ugb25lcyAqLworIAlub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gaXJjb21tX3R0eV9kaXNjb25uZWN0X2luZGljYXRpb247CisJbm90aWZ5LmNvbm5lY3RfY29uZmlybSAgICAgICA9IGlyY29tbV90dHlfY29ubmVjdF9jb25maXJtOworIAlub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uICAgID0gaXJjb21tX3R0eV9jb25uZWN0X2luZGljYXRpb247CisJc3RybGNweShub3RpZnkubmFtZSwgImlyY29tbV90dHkiLCBzaXplb2Yobm90aWZ5Lm5hbWUpKTsKKwlub3RpZnkuaW5zdGFuY2UgPSBzZWxmOworCisJaWYgKCFzZWxmLT5pcmNvbW0pIHsKKwkJc2VsZi0+aXJjb21tID0gaXJjb21tX29wZW4oJm5vdGlmeSwgc2VsZi0+c2VydmljZV90eXBlLCAKKwkJCQkJICAgc2VsZi0+bGluZSk7CisJfQorCWlmICghc2VsZi0+aXJjb21tKQorCQlnb3RvIGVycjsKKworCXNlbGYtPnNsc2FwX3NlbCA9IHNlbGYtPmlyY29tbS0+c2xzYXBfc2VsOworCisJLyogQ29ubmVjdCBJckNPTU0gbGluayB3aXRoIHJlbW90ZSBkZXZpY2UgKi8KKwlyZXQgPSBpcmNvbW1fdHR5X2F0dGFjaF9jYWJsZShzZWxmKTsKKwlpZiAocmV0IDwgMCkgeworCQlJUkRBX0VSUk9SKCIlcygpLCBlcnJvciBhdHRhY2hpbmcgY2FibGUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwljbGVhcl9iaXQoQVNZTkNfQl9JTklUSUFMSVpFRCwgJnNlbGYtPmZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX2Jsb2NrX3RpbF9yZWFkeSAoc2VsZiwgZmlscCkKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9ibG9ja190aWxfcmVhZHkoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsIAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxwKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludAkJcmV0dmFsOworCWludAkJZG9fY2xvY2FsID0gMCwgZXh0cmFfY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCXR0eSA9IHNlbGYtPnR0eTsKKworCS8qCisJICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCBvciB0aGUgcG9ydCBpcyBub3QgZW5hYmxlZCwKKwkgKiB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250IGFuZCB0aGVuIGV4aXQuCisJICovCQorCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyB8fCB0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSl7CisJCS8qIG5vbmJsb2NrIG1vZGUgaXMgc2V0IG9yIHBvcnQgaXMgbm90IGVuYWJsZWQgKi8KKwkJc2VsZi0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgT19OT05CTE9DSyByZXF1ZXN0ZWQhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgeworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBkb2luZyBDTE9DQUwhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJZG9fY2xvY2FsID0gMTsKKwl9CisJCisJLyogV2FpdCBmb3IgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQorCSAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCisJICogdGhpcyBsb29wLCBzZWxmLT5vcGVuX2NvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0CisJICogbWdzbF9jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCSAKKwlyZXR2YWwgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZzZWxmLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcyglZCk6YmxvY2tfdGlsX3JlYWR5IGJlZm9yZSBibG9jayBvbiAlcyBvcGVuX2NvdW50PSVkXG4iLAorCSAgICAgIF9fRklMRV9fLF9fTElORV9fLCB0dHktPmRyaXZlci0+bmFtZSwgc2VsZi0+b3Blbl9jb3VudCApOworCisJLyogQXMgZmFyIGFzIEkgY2FuIHNlZSwgd2UgcHJvdGVjdCBvcGVuX2NvdW50IC0gSmVhbiBJSSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlleHRyYV9jb3VudCA9IDE7CisJCXNlbGYtPm9wZW5fY291bnQtLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKwlzZWxmLT5ibG9ja2VkX29wZW4rKzsKKwkKKwl3aGlsZSAoMSkgeworCQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpIHsKKwkJCS8qIEhlcmUsIHdlIHVzZSB0byBsb2NrIHRob3NlIHR3byBndXlzLCBidXQKKwkJCSAqIGFzIGlyY29tbV9wYXJhbV9yZXF1ZXN0KCkgZG9lcyBpdCBpdHNlbGYsCisJCQkgKiBJIGRvbid0IHNlZSB0aGUgcG9pbnQgKGFuZCBJIHNlZSB0aGUgZGVhZGxvY2spLgorCQkJICogSmVhbiBJSSAqLworCQkJc2VsZi0+c2V0dGluZ3MuZHRlIHw9IElSQ09NTV9SVFMgKyBJUkNPTU1fRFRSOworCQkgCQorCQkJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0RURSwgVFJVRSk7CisJCX0KKwkJCisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKKwkJICAgICF0ZXN0X2JpdChBU1lOQ19CX0lOSVRJQUxJWkVELCAmc2VsZi0+ZmxhZ3MpKSB7CisJCQlyZXR2YWwgPSAoc2VsZi0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSA/CisJCQkJCS1FQUdBSU4gOiAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQkKKwkJLyogIAorCQkgKiBDaGVjayBpZiBsaW5rIGlzIHJlYWR5IG5vdy4gRXZlbiBpZiBDTE9DQUwgaXMKKwkJICogc3BlY2lmaWVkLCB3ZSBjYW5ub3QgcmV0dXJuIGJlZm9yZSB0aGUgSXJDT01NIGxpbmsgaXMKKwkJICogcmVhZHkgCisJCSAqLworIAkJaWYgKCF0ZXN0X2JpdChBU1lOQ19CX0NMT1NJTkcsICZzZWxmLT5mbGFncykgJiYKKyAJCSAgICAoZG9fY2xvY2FsIHx8IChzZWxmLT5zZXR0aW5ncy5kY2UgJiBJUkNPTU1fQ0QpKSAmJgorCQkgICAgc2VsZi0+c3RhdGUgPT0gSVJDT01NX1RUWV9SRUFEWSkKKwkJeworIAkJCWJyZWFrOworCQl9CisJCQkKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQkKKwkJSVJEQV9ERUJVRygxLCAiJXMoJWQpOmJsb2NrX3RpbF9yZWFkeSBibG9ja2luZyBvbiAlcyBvcGVuX2NvdW50PSVkXG4iLAorCQkgICAgICBfX0ZJTEVfXyxfX0xJTkVfXywgdHR5LT5kcml2ZXItPm5hbWUsIHNlbGYtPm9wZW5fY291bnQgKTsKKwkJCisJCXNjaGVkdWxlKCk7CisJfQorCQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmc2VsZi0+b3Blbl93YWl0LCAmd2FpdCk7CisJCisJaWYgKGV4dHJhX2NvdW50KSB7CisJCS8qICsrIGlzIG5vdCBhdG9taWMsIHNvIHRoaXMgc2hvdWxkIGJlIHByb3RlY3RlZCAtIEplYW4gSUkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisJCXNlbGYtPm9wZW5fY291bnQrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKwl9CisJc2VsZi0+YmxvY2tlZF9vcGVuLS07CisJCisJSVJEQV9ERUJVRygxLCAiJXMoJWQpOmJsb2NrX3RpbF9yZWFkeSBhZnRlciBibG9ja2luZyBvbiAlcyBvcGVuX2NvdW50PSVkXG4iLAorCSAgICAgIF9fRklMRV9fLF9fTElORV9fLCB0dHktPmRyaXZlci0+bmFtZSwgc2VsZi0+b3Blbl9jb3VudCk7CisJCQkgCisJaWYgKCFyZXR2YWwpCisJCXNlbGYtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCQorCXJldHVybiByZXR2YWw7CQorfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9vcGVuICh0dHksIGZpbHApCisgKgorICogICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGEgcGFydGljdWxhciB0dHkgZGV2aWNlIGlzIG9wZW5lZC4gVGhpcworICogICAgcm91dGluZSBpcyBtYW5kYXRvcnk7IGlmIHRoaXMgcm91dGluZSBpcyBub3QgZmlsbGVkIGluLCB0aGUgYXR0ZW1wdGVkCisgKiAgICBvcGVuIHdpbGwgZmFpbCB3aXRoIEVOT0RFVi4KKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGY7CisJdW5zaWduZWQgaW50IGxpbmU7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQgcmV0OworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlsaW5lID0gdHR5LT5pbmRleDsKKwlpZiAoKGxpbmUgPCAwKSB8fCAobGluZSA+PSBJUkNPTU1fVFRZX1BPUlRTKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBDaGVjayBpZiBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cyAqLworCXNlbGYgPSBoYXNoYmluX2xvY2tfZmluZChpcmNvbW1fdHR5LCBsaW5lLCBOVUxMKTsKKwlpZiAoIXNlbGYpIHsKKwkJLyogTm8sIHNvIG1ha2UgbmV3IGluc3RhbmNlICovCisJCXNlbGYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJjb21tX3R0eV9jYiksIEdGUF9LRVJORUwpOworCQlpZiAoc2VsZiA9PSBOVUxMKSB7CisJCQlJUkRBX0VSUk9SKCIlcygpLCBrbWFsbG9jIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQoc2VsZiwgMCwgc2l6ZW9mKHN0cnVjdCBpcmNvbW1fdHR5X2NiKSk7CisJCQorCQlzZWxmLT5tYWdpYyA9IElSQ09NTV9UVFlfTUFHSUM7CisJCXNlbGYtPmZsb3cgPSBGTE9XX1NUT1A7CisKKwkJc2VsZi0+bGluZSA9IGxpbmU7CisJCUlOSVRfV09SSygmc2VsZi0+dHF1ZXVlLCBpcmNvbW1fdHR5X2RvX3NvZnRpbnQsIHNlbGYpOworCQlzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBJUkNPTU1fVFRZX0hEUl9VTklOSVRJQUxJU0VEOworCQlzZWxmLT5tYXhfZGF0YV9zaXplID0gSVJDT01NX1RUWV9EQVRBX1VOSU5JVElBTElTRUQ7CisJCXNlbGYtPmNsb3NlX2RlbGF5ID0gNSpIWi8xMDsKKwkJc2VsZi0+Y2xvc2luZ193YWl0ID0gMzAqSFo7CisKKwkJLyogSW5pdCBzb21lIGltcG9ydGFudCBzdHVmZiAqLworCQlpbml0X3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlbGYtPm9wZW5fd2FpdCk7CisgCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZWxmLT5jbG9zZV93YWl0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJnNlbGYtPnNwaW5sb2NrKTsKKworCQkvKiAKKwkJICogRm9yY2UgVFRZIGludG8gcmF3IG1vZGUgYnkgZGVmYXVsdCB3aGljaCBpcyB1c3VhbGx5IHdoYXQKKwkJICogd2Ugd2FudCBmb3IgSXJDT01NIGFuZCBJckxQVC4gVGhpcyB3YXkgYXBwbGljYXRpb25zIHdpbGwKKwkJICogbm90IGhhdmUgdG8gdHdpZGRsZSB3aXRoIHByaW50Y2FwIGV0Yy4gIAorCQkgKi8KKwkJdHR5LT50ZXJtaW9zLT5jX2lmbGFnID0gMDsKKwkJdHR5LT50ZXJtaW9zLT5jX29mbGFnID0gMDsKKworCQkvKiBJbnNlcnQgaW50byBoYXNoICovCisJCWhhc2hiaW5faW5zZXJ0KGlyY29tbV90dHksIChpcmRhX3F1ZXVlX3QgKikgc2VsZiwgbGluZSwgTlVMTCk7CisJfQorCS8qICsrIGlzIG5vdCBhdG9taWMsIHNvIHRoaXMgc2hvdWxkIGJlIHByb3RlY3RlZCAtIEplYW4gSUkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKwlzZWxmLT5vcGVuX2NvdW50Kys7CisKKwl0dHktPmRyaXZlcl9kYXRhID0gc2VsZjsKKwlzZWxmLT50dHkgPSB0dHk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCUlSREFfREVCVUcoMSwgIiVzKCksICVzJWQsIGNvdW50ID0gJWRcbiIsIF9fRlVOQ1RJT05fXyAsIHR0eS0+ZHJpdmVyLT5uYW1lLCAKKwkJICAgc2VsZi0+bGluZSwgc2VsZi0+b3Blbl9jb3VudCk7CisKKwkvKiBOb3QgcmVhbGx5IHVzZWQgYnkgdXMsIGJ1dCBsZXRzIGRvIGl0IGFueXdheSAqLworCXNlbGYtPnR0eS0+bG93X2xhdGVuY3kgPSAoc2VsZi0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKworCS8qCisJICogSWYgdGhlIHBvcnQgaXMgdGhlIG1pZGRsZSBvZiBjbG9zaW5nLCBiYWlsIG91dCBub3cKKwkgKi8KKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAorCSAgICB0ZXN0X2JpdChBU1lOQ19CX0NMT1NJTkcsICZzZWxmLT5mbGFncykpIHsKKworCQkvKiBIbSwgd2h5IGFyZSB3ZSBibG9ja2luZyBvbiBBU1lOQ19DTE9TSU5HIGlmIHdlCisJCSAqIGRvIHJldHVybiAtRUFHQUlOLy1FUkVTVEFSVFNZUyBiZWxvdyBhbnl3YXk/CisJCSAqIElNSE8gaXQncyBlaXRoZXIgbm90IG5lZWRlZCBpbiB0aGUgZmlyc3QgcGxhY2UKKwkJICogb3IgZm9yIHNvbWUgcmVhc29uIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBhc3luYworCQkgKiBjbG9zaW5nIGhhcyBiZWVuIGZpbmlzaGVkIC0gaWYgc28sIHdvdWxkbid0IHdlCisJCSAqIHByb2JhYmx5IGJldHRlciBzbGVlcCB1bmludGVycnVwdGlibGU/CisJCSAqLworCisJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2VsZi0+Y2xvc2Vfd2FpdCwgIXRlc3RfYml0KEFTWU5DX0JfQ0xPU0lORywgJnNlbGYtPmZsYWdzKSkpIHsKKwkJCUlSREFfV0FSTklORygiJXMgLSBnb3Qgc2lnbmFsIHdoaWxlIGJsb2NraW5nIG9uIEFTWU5DX0NMT1NJTkchXG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCX0KKworI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCisJCXJldHVybiAoKHNlbGYtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7CisjZWxzZQorCQlyZXR1cm4gLUVBR0FJTjsKKyNlbmRpZgorCX0KKworCS8qIENoZWNrIGlmIHRoaXMgaXMgYSAibm9ybWFsIiBpcmNvbW0gZGV2aWNlLCBvciBhbiBpcmxwdCBkZXZpY2UgKi8KKwlpZiAobGluZSA8IDB4MTApIHsKKwkJc2VsZi0+c2VydmljZV90eXBlID0gSVJDT01NXzNfV0lSRSB8IElSQ09NTV85X1dJUkU7CisJCXNlbGYtPnNldHRpbmdzLnNlcnZpY2VfdHlwZSA9IElSQ09NTV85X1dJUkU7IC8qIDkgd2lyZSBhcyBkZWZhdWx0ICovCisJCS8qIEphbiBLaXN6a2EgLT4gYWRkIERTUi9SSSAtPiBDb25mb3JtIHRvIElyQ09NTSBzcGVjICovCisJCXNlbGYtPnNldHRpbmdzLmRjZSA9IElSQ09NTV9DVFMgfCBJUkNPTU1fQ0QgfCBJUkNPTU1fRFNSIHwgSVJDT01NX1JJOyAvKiBEZWZhdWx0IGxpbmUgc2V0dGluZ3MgKi8KKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSXJDT01NIGRldmljZVxuIiwgX19GVU5DVElPTl9fICk7CisJfSBlbHNlIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSXJMUFQgZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJc2VsZi0+c2VydmljZV90eXBlID0gSVJDT01NXzNfV0lSRV9SQVc7CisJCXNlbGYtPnNldHRpbmdzLnNlcnZpY2VfdHlwZSA9IElSQ09NTV8zX1dJUkVfUkFXOyAvKiBEZWZhdWx0ICovCisJfQorCisJcmV0ID0gaXJjb21tX3R0eV9zdGFydHVwKHNlbGYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBpcmNvbW1fdHR5X2Jsb2NrX3RpbF9yZWFkeShzZWxmLCBmaWxwKTsKKwlpZiAocmV0KSB7CisJCUlSREFfREVCVUcoMiwgCisJCSAgICAgICIlcygpLCByZXR1cm5pbmcgYWZ0ZXIgYmxvY2tfdGlsX3JlYWR5IHdpdGggJWRcbiIsIF9fRlVOQ1RJT05fXyAsCisJCSAgICAgIHJldCk7CisKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2Nsb3NlICh0dHksIGZpbHApCisgKgorICogICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGEgcGFydGljdWxhciB0dHkgZGV2aWNlIGlzIGNsb3NlZC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCQlJUkRBX0RFQlVHKDAsICIlcygpLCByZXR1cm5pbmcgMVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKHNlbGYtPm9wZW5fY291bnQgIT0gMSkpIHsKKwkJLyoKKwkJICogVWgsIG9oLiAgdHR5LT5jb3VudCBpcyAxLCB3aGljaCBtZWFucyB0aGF0IHRoZSB0dHkKKwkJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICBzdGF0ZS0+Y291bnQgc2hvdWxkIGFsd2F5cworCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCisJCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQorCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KKwkJICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksIGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgIgorCQkJICAgInR0eS0+Y291bnQgaXMgMSwgc3RhdGUtPmNvdW50IGlzICVkXG4iLCBfX0ZVTkNUSU9OX18gLCAKKwkJCSAgIHNlbGYtPm9wZW5fY291bnQpOworCQlzZWxmLT5vcGVuX2NvdW50ID0gMTsKKwl9CisKKwlpZiAoLS1zZWxmLT5vcGVuX2NvdW50IDwgMCkgeworCQlJUkRBX0VSUk9SKCIlcygpLCBiYWQgc2VyaWFsIHBvcnQgY291bnQgZm9yIHR0eXMlZDogJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmxpbmUsIHNlbGYtPm9wZW5fY291bnQpOworCQlzZWxmLT5vcGVuX2NvdW50ID0gMDsKKwl9CisJaWYgKHNlbGYtPm9wZW5fY291bnQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBvcGVuIGNvdW50ID4gMFxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBIdW0uLi4gU2hvdWxkIGJlIHRlc3RfYW5kX3NldF9iaXQgPz8/IC0gSmVhbiBJSSAqLworCXNldF9iaXQoQVNZTkNfQl9DTE9TSU5HLCAmc2VsZi0+ZmxhZ3MpOworCisJLyogV2UgbmVlZCB0byB1bmxvY2sgaGVyZSAod2Ugd2VyZSB1bmxvY2tpbmcgYXQgdGhlIGVuZCBvZiB0aGlzCisJICogZnVuY3Rpb24pLCBiZWNhdXNlIHR0eV93YWl0X3VudGlsX3NlbnQoKSBtYXkgc2NoZWR1bGUuCisJICogSSBkb24ndCBrbm93IGlmIHRoZSByZXN0IHNob3VsZCBiZSBwcm90ZWN0ZWQgc29tZWhvdywKKwkgKiBzbyBzb21lb25lIHNob3VsZCBjaGVjay4gLSBKZWFuIElJICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkgCisJICogdGhlIGxpbmUgZGlzY2lwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4KKwkgKi8KKwl0dHktPmNsb3NpbmcgPSAxOworCWlmIChzZWxmLT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBzZWxmLT5jbG9zaW5nX3dhaXQpOworCisJaXJjb21tX3R0eV9zaHV0ZG93bihzZWxmKTsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJaWYgKHR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKQorCQl0dHktPmxkaXNjLmZsdXNoX2J1ZmZlcih0dHkpOworCisJdHR5LT5jbG9zaW5nID0gMDsKKwlzZWxmLT50dHkgPSBOVUxMOworCisJaWYgKHNlbGYtPmJsb2NrZWRfb3BlbikgeworCQlpZiAoc2VsZi0+Y2xvc2VfZGVsYXkpIHsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkJc2NoZWR1bGVfdGltZW91dChzZWxmLT5jbG9zZV9kZWxheSk7CisJCX0KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZWxmLT5vcGVuX3dhaXQpOworCX0KKworCXNlbGYtPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxBU1lOQ19DTE9TSU5HKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlbGYtPmNsb3NlX3dhaXQpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9mbHVzaF9idWZmZXIgKHR0eSkKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiAKKwkgKiBMZXQgZG9fc29mdGludCgpIGRvIHRoaXMgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24gd2l0aCAKKwkgKiBkb19zb2Z0aW50KCkgOy0pIAorCSAqLworCXNjaGVkdWxlX3dvcmsoJnNlbGYtPnRxdWV1ZSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2RvX3NvZnRpbnQgKHByaXZhdGVfKQorICoKKyAqICAgIFdlIHVzZSB0aGlzIHJvdXRpbmUgdG8gZ2l2ZSB0aGUgd3JpdGUgd2FrZXVwIHRvIHRoZSB1c2VyIGF0IGF0IGEKKyAqICAgIHNhZmUgdGltZSAoYXMgZmFzdCBhcyBwb3NzaWJsZSBhZnRlciB3cml0ZSBoYXZlIGNvbXBsZXRlZCkuIFRoaXMgCisgKiAgICBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIFR4IGludGVycnVwdC4KKyAqLworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9kb19zb2Z0aW50KHZvaWQgKnByaXZhdGVfKQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIHByaXZhdGVfOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqY3RybF9za2I7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWlmICghc2VsZiB8fCBzZWxmLT5tYWdpYyAhPSBJUkNPTU1fVFRZX01BR0lDKQorCQlyZXR1cm47CisKKwl0dHkgPSBzZWxmLT50dHk7CisJaWYgKCF0dHkpCisJCXJldHVybjsKKworCS8qIFVubGluayBjb250cm9sIGJ1ZmZlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJY3RybF9za2IgPSBzZWxmLT5jdHJsX3NrYjsKKwlzZWxmLT5jdHJsX3NrYiA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogRmx1c2ggY29udHJvbCBidWZmZXIgaWYgYW55ICovCisJaWYoY3RybF9za2IpIHsKKwkJaWYoc2VsZi0+ZmxvdyA9PSBGTE9XX1NUQVJUKQorCQkJaXJjb21tX2NvbnRyb2xfcmVxdWVzdChzZWxmLT5pcmNvbW0sIGN0cmxfc2tiKTsKKwkJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJjb21tX3R0cF9kYXRhX3JlcXVlc3QoKS4gKi8KKwkJZGV2X2tmcmVlX3NrYihjdHJsX3NrYik7CisJfQorCisJaWYgKHR0eS0+aHdfc3RvcHBlZCkKKwkJcmV0dXJuOworCisJLyogVW5saW5rIHRyYW5zbWl0IGJ1ZmZlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCQorCXNrYiA9IHNlbGYtPnR4X3NrYjsKKwlzZWxmLT50eF9za2IgPSBOVUxMOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIEZsdXNoIHRyYW5zbWl0IGJ1ZmZlciBpZiBhbnkgKi8KKwlpZiAoc2tiKSB7CisJCWlyY29tbV90dHlfZG9fZXZlbnQoc2VsZiwgSVJDT01NX1RUWV9EQVRBX1JFUVVFU1QsIHNrYiwgTlVMTCk7CisJCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlyY29tbV90dHBfZGF0YV9yZXF1ZXN0KCkuICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisJCQorCS8qIENoZWNrIGlmIHVzZXIgKHN0aWxsKSB3YW50cyB0byBiZSB3YWtlbiB1cCAqLworCWlmICgodHR5LT5mbGFncyAmICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApKSAmJiAKKwkgICAgdHR5LT5sZGlzYy53cml0ZV93YWtldXApCisJeworCQkodHR5LT5sZGlzYy53cml0ZV93YWtldXApKHR0eSk7CisJfQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfd3JpdGUgKHR0eSwgYnVmLCBjb3VudCkKKyAqCisgKiAgICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBrZXJuZWwgdG8gd3JpdGUgYSBzZXJpZXMgb2YgY2hhcmFjdGVycworICogICAgdG8gdGhlIHR0eSBkZXZpY2UuIFRoZSBjaGFyYWN0ZXJzIG1heSBjb21lIGZyb20gdXNlciBzcGFjZSBvciBrZXJuZWwKKyAqICAgIHNwYWNlLiBUaGlzIHJvdXRpbmUgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5CisgKiAgICBhY2NlcHRlZCBmb3Igd3JpdGluZy4gVGhpcyByb3V0aW5lIGlzIG1hbmRhdG9yeS4KKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHRhaWxyb29tID0gMDsKKwlpbnQgbGVuID0gMDsKKwlpbnQgc2l6ZTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIGNvdW50PSVkLCBod19zdG9wcGVkPSVkXG4iLCBfX0ZVTkNUSU9OX18gLCBjb3VudCwKKwkJICAgdHR5LT5od19zdG9wcGVkKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwkvKiBXZSBtYXkgcmVjZWl2ZSBwYWNrZXRzIGZyb20gdGhlIFRUWSBldmVuIGJlZm9yZSB3ZSBoYXZlIGZpbmlzaGVkCisJICogb3VyIHNldHVwLiBOb3QgY29vbC4KKwkgKiBUaGUgcHJvYmxlbSBpcyB0aGF0IHdlIGRvbid0IGtub3cgdGhlIGZpbmFsIGhlYWRlciBhbmQgZGF0YSBzaXplCisJICogdG8gY3JlYXRlIHRoZSBwcm9wZXIgc2tiLCBzbyBhbnkgc2tiIHdlIHdvdWxkIGNyZWF0ZSB3b3VsZCBoYXZlCisJICogYm9ndXMgaGVhZGVyIGFuZCBkYXRhIHNpemUsIHNvIG5lZWQgY2FyZS4KKwkgKiBXZSB1c2UgYSBib2d1cyBoZWFkZXIgc2l6ZSB0byBzYWZlbHkgZGV0ZWN0IHRoaXMgY29uZGl0aW9uLgorCSAqIEFub3RoZXIgcHJvYmxlbSBpcyB0aGF0IGh3X3N0b3BwZWQgd2FzIHNldCB0byAwIHdheSBiZWZvcmUgaXQKKwkgKiBzaG91bGQgYmUsIHNvIHdlIHdvdWxkIGRyb3AgdGhpcyBza2IuIEl0IHNob3VsZCBub3cgYmUgZml4ZWQuCisJICogT25lIG9wdGlvbiBpcyB0byBub3QgYWNjZXB0IGRhdGEgdW50aWwgd2UgYXJlIHByb3Blcmx5IHNldHVwLgorCSAqIEJ1dCwgSSBzdXNwZWN0IHRoYXQgd2hlbiBpdCBoYXBwZW5zLCB0aGUgcHBwIGxpbmUgZGlzY2lwbGluZQorCSAqIGp1c3QgImRyb3BzIiB0aGUgZGF0YSwgd2hpY2ggbWlnaHQgc2NyZXcgdXAgY29ubmVjdCBzY3JpcHRzLgorCSAqIFRoZSBzZWNvbmQgb3B0aW9uIGlzIHRvIGNyZWF0ZSBhICJzYWZlIHNrYiIsIHdpdGggbGFyZ2UgaGVhZGVyCisJICogYW5kIHNtYWxsIHNpemUgKHNlZSBpcmNvbW1fdHR5X29wZW4oKSBmb3IgdmFsdWVzKS4KKwkgKiBXZSBqdXN0IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2hlbiB0aGUgcmVhbCB2YWx1ZXMgZ2V0IGZpbGxlZCwKKwkgKiB3ZSBkb24ndCBtZXNzIHVwIHRoZSBvcmlnaW5hbCAic2FmZSBza2IiIChzZWUgdHhfZGF0YV9zaXplKS4KKwkgKiBKZWFuIElJICovCisJaWYgKHNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9PSBJUkNPTU1fVFRZX0hEUl9VTklOSVRJQUxJU0VEKSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCkgOiBub3QgaW5pdGlhbGlzZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSVJDT01NX05PX1RYX0JFRk9SRV9JTklUCisJCS8qIFdlIGRpZG4ndCBjb25zdW1lIGFueXRoaW5nLCBUVFkgd2lsbCByZXRyeSAqLworCQlyZXR1cm4gMDsKKyNlbmRpZgorCX0KKworCWlmIChjb3VudCA8IDEpCisJCXJldHVybiAwOworCisJLyogUHJvdGVjdCBvdXIgbWFuaXB1bGF0aW9uIG9mIHNlbGYtPnR4X3NrYiBhbmQgcmVsYXRlZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogRmV0Y2ggY3VycmVudCB0cmFuc21pdCBidWZmZXIgKi8KKwlza2IgPSBzZWxmLT50eF9za2I7CisKKwkvKiAgCisJICogU2VuZCBvdXQgYWxsIHRoZSBkYXRhIHdlIGdldCwgcG9zc2libHkgYXMgbXVsdGlwbGUgZnJhZ21lbnRlZAorCSAqIGZyYW1lcywgYnV0IHRoaXMgd2lsbCBvbmx5IGhhcHBlbiBpZiB0aGUgZGF0YSBpcyBsYXJnZXIgdGhhbiB0aGUKKwkgKiBtYXggZGF0YSBzaXplLiBUaGUgbm9ybWFsIGNhc2UgaG93ZXZlciBpcyBqdXN0IHRoZSBvcHBvc2l0ZSwgYW5kCisJICogdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBhbmQgd2lsbCB0aGVuIGFjdHVhbGx5CisJICogZGVmcmFnbWVudCB0aGUgZGF0YSBhbmQgc2VuZCBpdCBvdXQgYXMgb25lIHBhY2tldCBhcyBzb29uIGFzIAorCSAqIHBvc3NpYmxlLCBidXQgYXQgYSBzYWZlciBwb2ludCBpbiB0aW1lCisJICovCisJd2hpbGUgKGNvdW50KSB7CisJCXNpemUgPSBjb3VudDsKKworCQkvKiBBZGp1c3QgZGF0YSBzaXplIHRvIHRoZSBtYXggZGF0YSBzaXplICovCisJCWlmIChzaXplID4gc2VsZi0+bWF4X2RhdGFfc2l6ZSkKKwkJCXNpemUgPSBzZWxmLT5tYXhfZGF0YV9zaXplOworCQkKKwkJLyogCisJCSAqIERvIHdlIGFscmVhZHkgaGF2ZSBhIGJ1ZmZlciByZWFkeSBmb3IgdHJhbnNtaXQsIG9yIGRvCisJCSAqIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgZnJhbWUgCisJCSAqLworCQlpZiAoc2tiKSB7CQkJCisJCQkvKiAKKwkJCSAqIEFueSByb29tIGZvciBtb3JlIGRhdGEgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCAKKwkJCSAqIHRyYW5zbWl0IGJ1ZmZlcj8gQ2Fubm90IHVzZSBza2JfdGFpbHJvb20sIHNpbmNlCisJCQkgKiBkZXZfYWxsb2Nfc2tiIGdpdmVzIHVzIGEgbGFyZ2VyIHNrYiB0aGFuIHdlIAorCQkJICogcmVxdWVzdGVkCisJCQkgKiBOb3RlIDogdXNlIHR4X2RhdGFfc2l6ZSwgYmVjYXVzZSBtYXhfZGF0YV9zaXplCisJCQkgKiBtYXkgaGF2ZSBjaGFuZ2VkIGFuZCB3ZSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZQorCQkJICogdGhlIHNrYi4gLSBKZWFuIElJCisJCQkgKi8KKwkJCWlmICgodGFpbHJvb20gPSAoc2VsZi0+dHhfZGF0YV9zaXplIC0gc2tiLT5sZW4pKSA+IDApIHsKKwkJCQkvKiBBZGp1c3QgZGF0YSB0byB0YWlscm9vbSAqLworCQkJCWlmIChzaXplID4gdGFpbHJvb20pCisJCQkJCXNpemUgPSB0YWlscm9vbTsKKwkJCX0gZWxzZSB7CisJCQkJLyogCisJCQkJICogQ3VycmVudCB0cmFuc21pdCBmcmFtZSBpcyBmdWxsLCBzbyBicmVhayAKKwkJCQkgKiBvdXQsIHNvIHdlIGNhbiBzZW5kIGl0IGFzIHNvb24gYXMgcG9zc2libGUKKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFByZXBhcmUgYSBmdWxsIHNpemVkIGZyYW1lICovCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNlbGYtPm1heF9kYXRhX3NpemUrCisJCQkJCSAgICBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOworCQkJaWYgKCFza2IpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCQkJCXJldHVybiAtRU5PQlVGUzsKKwkJCX0KKwkJCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKwkJCXNlbGYtPnR4X3NrYiA9IHNrYjsKKwkJCS8qIFJlbWVtYmVyIHNrYiBzaXplIGJlY2F1c2UgbWF4X2RhdGFfc2l6ZSBtYXkKKwkJCSAqIGNoYW5nZSBsYXRlciBvbiAtIEplYW4gSUkgKi8KKwkJCXNlbGYtPnR4X2RhdGFfc2l6ZSA9IHNlbGYtPm1heF9kYXRhX3NpemU7CisJCX0KKworCQkvKiBDb3B5IGRhdGEgKi8KKwkJbWVtY3B5KHNrYl9wdXQoc2tiLHNpemUpLCBidWYgKyBsZW4sIHNpemUpOworCisJCWNvdW50IC09IHNpemU7CisJCWxlbiArPSBzaXplOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiAgICAgCisJICogU2NoZWR1bGUgYSBuZXcgdGhyZWFkIHdoaWNoIHdpbGwgdHJhbnNtaXQgdGhlIGZyYW1lIGFzIHNvb24KKwkgKiBhcyBwb3NzaWJsZSwgYnV0IGF0IGEgc2FmZSBwb2ludCBpbiB0aW1lLiBXZSBkbyB0aGlzIHNvIHRoZQorCSAqICJ1c2VyIiBjYW4gZ2l2ZSB1cyBkYXRhIG11bHRpcGxlIHRpbWVzLCBhcyBQUFAgZG9lcyAoYmVjYXVzZSBvZgorCSAqIGl0cyAyNTYgYnl0ZSB0eCBidWZmZXIpLiBXZSB3aWxsIHRoZW4gZGVmcmFnbWVudCBhbmQgc2VuZCBvdXQKKwkgKiBhbGwgdGhpcyBkYXRhIGFzIG9uZSBzaW5nbGUgcGFja2V0LiAgCisJICovCisJc2NoZWR1bGVfd29yaygmc2VsZi0+dHF1ZXVlKTsKKwkKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV93cml0ZV9yb29tICh0dHkpCisgKgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIG51bWJlcnMgb2YgY2hhcmFjdGVycyB0aGUgdHR5IGRyaXZlciB3aWxsCisgKiAgICBhY2NlcHQgZm9yIHF1ZXVpbmcgdG8gYmUgd3JpdHRlbi4gVGhpcyBudW1iZXIgaXMgc3ViamVjdCB0byBjaGFuZ2UgYXMKKyAqICAgIG91dHB1dCBidWZmZXJzIGdldCBlbXB0aWVkLCBvciBpZiB0aGUgb3V0cHV0IGZsb3cgY29udHJvbCBpcyBhY3RlZC4KKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKyNpZmRlZiBJUkNPTU1fTk9fVFhfQkVGT1JFX0lOSVQKKwkvKiBtYXhfaGVhZGVyX3NpemUgdGVsbHMgdXMgaWYgdGhlIGNoYW5uZWwgaXMgaW5pdGlhbGlzZWQgb3Igbm90LiAqLworCWlmIChzZWxmLT5tYXhfaGVhZGVyX3NpemUgPT0gSVJDT01NX1RUWV9IRFJfVU5JTklUSUFMSVNFRCkKKwkJLyogRG9uJ3QgYm90aGVyIHVzIHlldCAqLworCQlyZXR1cm4gMDsKKyNlbmRpZgorCisJLyogQ2hlY2sgaWYgd2UgYXJlIGFsbG93ZWQgdG8gdHJhbnNtaXQgYW55IGRhdGEuCisJICogaHdfc3RvcHBlZCBpcyB0aGUgcmVndWxhciBmbG93IGNvbnRyb2wuCisJICogSmVhbiBJSSAqLworCWlmICh0dHktPmh3X3N0b3BwZWQpCisJCXJldCA9IDA7CisJZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCQlpZiAoc2VsZi0+dHhfc2tiKQorCQkJcmV0ID0gc2VsZi0+dHhfZGF0YV9zaXplIC0gc2VsZi0+dHhfc2tiLT5sZW47CisJCWVsc2UKKwkJCXJldCA9IHNlbGYtPm1heF9kYXRhX3NpemU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisJfQorCUlSREFfREVCVUcoMiwgIiVzKCksIHJldD0lZFxuIiwgX19GVU5DVElPTl9fICwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3dhaXRfdW50aWxfc2VudCAodHR5LCB0aW1lb3V0KQorICoKKyAqICAgIFRoaXMgcm91dGluZSB3YWl0cyB1bnRpbCB0aGUgZGV2aWNlIGhhcyB3cml0dGVuIG91dCBhbGwgb2YgdGhlCisgKiAgICBjaGFyYWN0ZXJzIGluIGl0cyB0cmFuc21pdHRlciBGSUZPLgorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzLCBwb2xsX3RpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwlvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworCisJLyogU2V0IHBvbGwgdGltZSB0byAyMDAgbXMgKi8KKwlwb2xsX3RpbWUgPSBJUkRBX01JTih0aW1lb3V0LCBtc2Vjc190b19qaWZmaWVzKDIwMCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisJd2hpbGUgKHNlbGYtPnR4X3NrYiAmJiBzZWxmLT50eF9za2ItPmxlbikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc2NoZWR1bGVfdGltZW91dChwb2xsX3RpbWUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfdGhyb3R0bGUgKHR0eSkKKyAqCisgKiAgICBUaGlzIHJvdXRpbmUgbm90aWZpZXMgdGhlIHR0eSBkcml2ZXIgdGhhdCBpbnB1dCBidWZmZXJzIGZvciB0aGUgbGluZQorICogICAgZGlzY2lwbGluZSBhcmUgY2xvc2UgdG8gZnVsbCwgYW5kIGl0IHNob3VsZCBzb21laG93IHNpZ25hbCB0aGF0IG5vCisgKiAgICBtb3JlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHR0eS4gIAorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKworCS8qIFNvZnR3YXJlIGZsb3cgY29udHJvbD8gKi8KKwlpZiAoSV9JWE9GRih0dHkpKQorCQlpcmNvbW1fdHR5X3NlbmRfeGNoYXIodHR5LCBTVE9QX0NIQVIodHR5KSk7CisJCisJLyogSGFyZHdhcmUgZmxvdyBjb250cm9sPyAqLworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCXNlbGYtPnNldHRpbmdzLmR0ZSAmPSB+SVJDT01NX1JUUzsKKwkJc2VsZi0+c2V0dGluZ3MuZHRlIHw9IElSQ09NTV9ERUxUQV9SVFM7CisJCisJCWlyY29tbV9wYXJhbV9yZXF1ZXN0KHNlbGYsIElSQ09NTV9EVEUsIFRSVUUpOworCX0KKworICAgICAgICBpcmNvbW1fZmxvd19yZXF1ZXN0KHNlbGYtPmlyY29tbSwgRkxPV19TVE9QKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfdW50aHJvdHRsZSAodHR5KQorICoKKyAqICAgIFRoaXMgcm91dGluZSBub3RpZmllcyB0aGUgdHR5IGRyaXZlcnMgdGhhdCBpdCBzaG91bGQgc2lnbmFscyB0aGF0CisgKiAgICBjaGFyYWN0ZXJzIGNhbiBub3cgYmUgc2VudCB0byB0aGUgdHR5IHdpdGhvdXQgZmVhciBvZiBvdmVycnVubmluZyB0aGUKKyAqICAgIGlucHV0IGJ1ZmZlcnMgb2YgdGhlIGxpbmUgZGlzY2lwbGluZXMuCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBVc2luZyBzb2Z0d2FyZSBmbG93IGNvbnRyb2w/ICovCisJaWYgKElfSVhPRkYodHR5KSkgeworCQlpcmNvbW1fdHR5X3NlbmRfeGNoYXIodHR5LCBTVEFSVF9DSEFSKHR0eSkpOworCX0KKworCS8qIFVzaW5nIGhhcmR3YXJlIGZsb3cgY29udHJvbD8gKi8KKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQlzZWxmLT5zZXR0aW5ncy5kdGUgfD0gKElSQ09NTV9SVFN8SVJDT01NX0RFTFRBX1JUUyk7CisKKwkJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0RURSwgVFJVRSk7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIEZMT1dfU1RBUlRcbiIsIF9fRlVOQ1RJT05fXyApOworCX0KKyAgICAgICAgaXJjb21tX2Zsb3dfcmVxdWVzdChzZWxmLT5pcmNvbW0sIEZMT1dfU1RBUlQpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9jaGFyc19pbl9idWZmZXIgKHR0eSkKKyAqCisgKiAgICBJbmRpY2F0ZXMgaWYgdGhlcmUgYXJlIGFueSBkYXRhIGluIHRoZSBidWZmZXIKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGxlbiA9IDA7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoc2VsZi0+dHhfc2tiKQorCQlsZW4gPSBzZWxmLT50eF9za2ItPmxlbjsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X3NodXRkb3duKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChBU1lOQ19CX0lOSVRJQUxJWkVELCAmc2VsZi0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwlpcmNvbW1fdHR5X2RldGFjaF9jYWJsZShzZWxmKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisJCisJLyogRnJlZSBwYXJhbWV0ZXIgYnVmZmVyICovCisJaWYgKHNlbGYtPmN0cmxfc2tiKSB7CisJCWRldl9rZnJlZV9za2Ioc2VsZi0+Y3RybF9za2IpOworCQlzZWxmLT5jdHJsX3NrYiA9IE5VTEw7CisJfQorCisJLyogRnJlZSB0cmFuc21pdCBidWZmZXIgKi8KKwlpZiAoc2VsZi0+dHhfc2tiKSB7CisJCWRldl9rZnJlZV9za2Ioc2VsZi0+dHhfc2tiKTsKKwkJc2VsZi0+dHhfc2tiID0gTlVMTDsKKwl9CisKKwlpZiAoc2VsZi0+aXJjb21tKSB7CisJCWlyY29tbV9jbG9zZShzZWxmLT5pcmNvbW0pOworCQlzZWxmLT5pcmNvbW0gPSBOVUxMOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2hhbmd1cCAodHR5KQorICoKKyAqICAgIFRoaXMgcm91dGluZSBub3RpZmllcyB0aGUgdHR5IGRyaXZlciB0aGF0IGl0IHNob3VsZCBoYW5ndXAgdGhlIHR0eQorICogICAgZGV2aWNlLgorICogCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJaWYgKCF0dHkpCisJCXJldHVybjsKKworCS8qIGlyY29tbV90dHlfZmx1c2hfYnVmZmVyKHR0eSk7ICovCisJaXJjb21tX3R0eV9zaHV0ZG93bihzZWxmKTsKKworCS8qIEkgZ3Vlc3Mgd2UgbmVlZCB0byBsb2NrIGhlcmUgLSBKZWFuIElJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisJc2VsZi0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJc2VsZi0+dHR5ID0gTlVMTDsKKwlzZWxmLT5vcGVuX2NvdW50ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZWxmLT5vcGVuX3dhaXQpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9zZW5kX3hjaGFyICh0dHksIGNoKQorICoKKyAqICAgIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHNlbmQgYSBoaWdoLXByaW9yaXR5IFhPTi9YT0ZGIGNoYXJhY3RlciB0bworICogICAgdGhlIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpCit7CisJSVJEQV9ERUJVRygwLCAiJXMoKSwgbm90IGltcGxcbiIsIF9fRlVOQ1RJT05fXyApOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9zdGFydCAodHR5KQorICoKKyAqICAgIFRoaXMgcm91dGluZSBub3RpZmllcyB0aGUgdHR5IGRyaXZlciB0aGF0IGl0IHJlc3VtZSBzZW5kaW5nCisgKiAgICBjaGFyYWN0ZXJzIHRvIHRoZSB0dHkgZGV2aWNlLiAgCisgKi8KK3ZvaWQgaXJjb21tX3R0eV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpcmNvbW1fZmxvd19yZXF1ZXN0KHNlbGYtPmlyY29tbSwgRkxPV19TVEFSVCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3N0b3AgKHR0eSkKKyAqCisgKiAgICAgVGhpcyByb3V0aW5lIG5vdGlmaWVzIHRoZSB0dHkgZHJpdmVyIHRoYXQgaXQgc2hvdWxkIHN0b3Agb3V0cHV0dGluZworICogICAgIGNoYXJhY3RlcnMgdG8gdGhlIHR0eSBkZXZpY2UuIAorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwlpcmNvbW1fZmxvd19yZXF1ZXN0KHNlbGYtPmlyY29tbSwgRkxPV19TVE9QKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9jaGVja19tb2RlbV9zdGF0dXMgKHNlbGYpCisgKgorICogICAgQ2hlY2sgZm9yIGFueSBjaGFuZ2VzIGluIHRoZSBEQ0UncyBsaW5lIHNldHRpbmdzLiBUaGlzIGZ1bmN0aW9uIHNob3VsZAorICogICAgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBkY2UgcGFyYW1ldGVyIHNldHRpbmdzIGNoYW5nZXMsIHRvIHVwZGF0ZSB0aGUKKyAqICAgIGZsb3cgY29udHJvbCBzZXR0aW5ncyBhbmQgb3RoZXIgdGhpbmdzCisgKi8KK3ZvaWQgaXJjb21tX3R0eV9jaGVja19tb2RlbV9zdGF0dXMoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgc3RhdHVzOworCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJdHR5ID0gc2VsZi0+dHR5OworCisJc3RhdHVzID0gc2VsZi0+c2V0dGluZ3MuZGNlOworCisJaWYgKHN0YXR1cyAmIElSQ09NTV9EQ0VfREVMVEFfQU5ZKSB7CisJCS8qd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZWxmLT5kZWx0YV9tc3Jfd2FpdCk7Ki8KKwl9CisJaWYgKChzZWxmLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAoc3RhdHVzICYgSVJDT01NX0RFTFRBX0NEKSkgeworCQlJUkRBX0RFQlVHKDIsIAorCQkJICAgIiVzKCksIGlyY29tbSVkIENEIG5vdyAlcy4uLlxuIiwgX19GVU5DVElPTl9fICwgc2VsZi0+bGluZSwKKwkJCSAgIChzdGF0dXMgJiBJUkNPTU1fQ0QpID8gIm9uIiA6ICJvZmYiKTsKKworCQlpZiAoc3RhdHVzICYgSVJDT01NX0NEKSB7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlbGYtPm9wZW5fd2FpdCk7CisJCX0gZWxzZSB7CisJCQlJUkRBX0RFQlVHKDIsIAorCQkJCSAgICIlcygpLCBEb2luZyBzZXJpYWwgaGFuZ3VwLi5cbiIsIF9fRlVOQ1RJT05fXyApOworCQkJaWYgKHR0eSkKKwkJCQl0dHlfaGFuZ3VwKHR0eSk7CisKKwkJCS8qIEhhbmd1cCB3aWxsIHJlbW90ZSB0aGUgdHR5LCBzbyBiZXR0ZXIgYnJlYWsgb3V0ICovCisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKHNlbGYtPmZsYWdzICYgQVNZTkNfQ1RTX0ZMT1cpIHsKKwkJaWYgKHR0eS0+aHdfc3RvcHBlZCkgeworCQkJaWYgKHN0YXR1cyAmIElSQ09NTV9DVFMpIHsKKwkJCQlJUkRBX0RFQlVHKDIsIAorCQkJCQkgICAiJXMoKSwgQ1RTIHR4IHN0YXJ0Li4uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQkJCQorCQkJCS8qIFdha2UgdXAgcHJvY2Vzc2VzIGJsb2NrZWQgb24gb3BlbiAqLworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VsZi0+b3Blbl93YWl0KTsKKworCQkJCXNjaGVkdWxlX3dvcmsoJnNlbGYtPnRxdWV1ZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCEoc3RhdHVzICYgSVJDT01NX0NUUykpIHsKKwkJCQlJUkRBX0RFQlVHKDIsIAorCQkJCQkgICAiJXMoKSwgQ1RTIHR4IHN0b3AuLi5cbiIsIF9fRlVOQ1RJT05fXyApOworCQkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2RhdGFfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgc2tiKQorICoKKyAqICAgIEhhbmRsZSBpbmNvbWluZyBkYXRhLCBhbmQgZGVsaXZlciBpdCB0byB0aGUgbGluZSBkaXNjaXBsaW5lCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHlfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaWYgKCFzZWxmLT50dHkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgbm8gdHR5IVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAwOworCX0KKworCS8qIAorCSAqIElmIHdlIHJlY2VpdmUgZGF0YSB3aGVuIGhhcmR3YXJlIGlzIHN0b3BwZWQgdGhlbiBzb21ldGhpbmcgaXMgd3JvbmcuCisJICogV2UgdHJ5IHRvIHBvbGwgdGhlIHBlZXJzIGxpbmUgc2V0dGluZ3MgdG8gY2hlY2sgaWYgd2UgYXJlIHVwIHRvZGF0ZS4KKwkgKiBEZXZpY2VzIGxpa2UgV2luQ0UgY2FuIGRvIHRoaXMsIGFuZCBzaW5jZSB0aGV5IGRvbid0IHNlbmQgYW55IAorCSAqIHBhcmFtcywgd2UgY2FuIGp1c3QgYXMgd2VsbCBkZWNsYXJlIHRoZSBoYXJkd2FyZSBmb3IgcnVubmluZy4KKwkgKi8KKwlpZiAoc2VsZi0+dHR5LT5od19zdG9wcGVkICYmIChzZWxmLT5mbG93ID09IEZMT1dfU1RBUlQpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHBvbGxpbmcgZm9yIGxpbmUgc2V0dGluZ3MhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX1BPTEwsIFRSVUUpOworCisJCS8qIFdlIGNhbiBqdXN0IGFzIHdlbGwgZGVjbGFyZSB0aGUgaGFyZHdhcmUgZm9yIHJ1bm5pbmcgKi8KKwkJaXJjb21tX3R0eV9zZW5kX2luaXRpYWxfcGFyYW1ldGVycyhzZWxmKTsKKwkJaXJjb21tX3R0eV9saW5rX2VzdGFibGlzaGVkKHNlbGYpOworCX0KKworCS8qIAorCSAqIEp1c3QgZ2l2ZSBpdCBvdmVyIHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUuIFRoZXJlIGlzIG5vIG5lZWQgdG8KKwkgKiBpbnZvbHZlIHRoZSBmbGlwIGJ1ZmZlcnMsIHNpbmNlIHdlIGFyZSBub3QgcnVubmluZyBpbiBhbiBpbnRlcnJ1cHQgCisJICogaGFuZGxlcgorCSAqLworCXNlbGYtPnR0eS0+bGRpc2MucmVjZWl2ZV9idWYoc2VsZi0+dHR5LCBza2ItPmRhdGEsIE5VTEwsIHNrYi0+bGVuKTsKKworCS8qIE5vIG5lZWQgdG8ga2ZyZWVfc2tiIC0gc2VlIGlyY29tbV90dHBfZGF0YV9pbmRpY2F0aW9uKCkgKi8KKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9jb250cm9sX2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHNrYikKKyAqCisgKiAgICBQYXJzZSBhbGwgaW5jb21pbmcgcGFyYW1ldGVycyAoZWFzeSEpCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHlfY29udHJvbF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGluc3RhbmNlOworCWludCBjbGVuOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwljbGVuID0gc2tiLT5kYXRhWzBdOworCisJaXJkYV9wYXJhbV9leHRyYWN0X2FsbChzZWxmLCBza2ItPmRhdGErMSwgSVJEQV9NSU4oc2tiLT5sZW4tMSwgY2xlbiksIAorCQkJICAgICAgICZpcmNvbW1fcGFyYW1faW5mbyk7CisKKwkvKiBObyBuZWVkIHRvIGtmcmVlX3NrYiAtIHNlZSBpcmNvbW1fY29udHJvbF9pbmRpY2F0aW9uKCkgKi8KKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9mbG93X2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIGNtZCkKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBJclRUUCB3aGVuIGl0IHdhbnRzIHVzIHRvIHNsb3cgZG93biB0aGUKKyAqICAgIHRyYW5zbWlzc2lvbiBvZiBkYXRhLiBXZSBqdXN0IG1hcmsgdGhlIGhhcmR3YXJlIGFzIHN0b3BwZWQsIGFuZCB3YWl0CisgKiAgICBmb3IgSXJUVFAgdG8gbm90aWZ5IHVzIHRoYXQgdGhpbmdzIGFyZSBPSyBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9mbG93X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJICAgICAgIExPQ0FMX0ZMT1cgY21kKQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGluc3RhbmNlOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJdHR5ID0gc2VsZi0+dHR5OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEZMT1dfU1RBUlQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIGh3IHN0YXJ0IVxuIiwgX19GVU5DVElPTl9fICk7CisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisKKwkJLyogaXJjb21tX3R0eV9kb19zb2Z0aW50IHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZXN0ICovCisJCXNjaGVkdWxlX3dvcmsoJnNlbGYtPnRxdWV1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6ICAvKiBJZiB3ZSBnZXQgaGVyZSwgc29tZXRoaW5nIGlzIHZlcnkgd3JvbmcsIGJldHRlciBzdG9wICovCisJY2FzZSBGTE9XX1NUT1A6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIGh3IHN0b3BwZWQhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJdHR5LT5od19zdG9wcGVkID0gMTsKKwkJYnJlYWs7CisJfQorCXNlbGYtPmZsb3cgPSBjbWQ7Cit9CisKK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9saW5lX2luZm8oc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsIGNoYXIgKmJ1ZikKK3sKKyAgICAgICAgaW50ICByZXQ9MDsKKworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJTdGF0ZTogJXNcbiIsIGlyY29tbV90dHlfc3RhdGVbc2VsZi0+c3RhdGVdKTsKKworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJTZXJ2aWNlIHR5cGU6ICIpOworCWlmIChzZWxmLT5zZXJ2aWNlX3R5cGUgJiBJUkNPTU1fOV9XSVJFKQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiOV9XSVJFIik7CisJZWxzZSBpZiAoc2VsZi0+c2VydmljZV90eXBlICYgSVJDT01NXzNfV0lSRSkKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIjNfV0lSRSIpOworCWVsc2UgaWYgKHNlbGYtPnNlcnZpY2VfdHlwZSAmIElSQ09NTV8zX1dJUkVfUkFXKQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiM19XSVJFX1JBVyIpOworCWVsc2UKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIk5vIGNvbW1vbiBzZXJ2aWNlIHR5cGUhXG4iKTsKKyAgICAgICAgcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlxuIik7CisKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiUG9ydCBuYW1lOiAlc1xuIiwgc2VsZi0+c2V0dGluZ3MucG9ydF9uYW1lKTsKKworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJEVEUgc3RhdHVzOiAiKTsJCisgICAgICAgIGlmIChzZWxmLT5zZXR0aW5ncy5kdGUgJiBJUkNPTU1fUlRTKQorICAgICAgICAgICAgICAgIHJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJSVFN8Iik7CisgICAgICAgIGlmIChzZWxmLT5zZXR0aW5ncy5kdGUgJiBJUkNPTU1fRFRSKQorICAgICAgICAgICAgICAgIHJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJEVFJ8Iik7CisJaWYgKHNlbGYtPnNldHRpbmdzLmR0ZSkKKwkJcmV0LS07IC8qIHJlbW92ZSB0aGUgbGFzdCB8ICovCisgICAgICAgIHJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJcbiIpOworCisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkRDRSBzdGF0dXM6ICIpOworICAgICAgICBpZiAoc2VsZi0+c2V0dGluZ3MuZGNlICYgSVJDT01NX0NUUykKKyAgICAgICAgICAgICAgICByZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiQ1RTfCIpOworICAgICAgICBpZiAoc2VsZi0+c2V0dGluZ3MuZGNlICYgSVJDT01NX0RTUikKKyAgICAgICAgICAgICAgICByZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiRFNSfCIpOworICAgICAgICBpZiAoc2VsZi0+c2V0dGluZ3MuZGNlICYgSVJDT01NX0NEKQorICAgICAgICAgICAgICAgIHJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJDRHwiKTsKKyAgICAgICAgaWYgKHNlbGYtPnNldHRpbmdzLmRjZSAmIElSQ09NTV9SSSkgCisgICAgICAgICAgICAgICAgcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlJJfCIpOworCWlmIChzZWxmLT5zZXR0aW5ncy5kY2UpCisJCXJldC0tOyAvKiByZW1vdmUgdGhlIGxhc3QgfCAqLworICAgICAgICByZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiXG4iKTsKKworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJDb25maWd1cmF0aW9uOiAiKTsKKwlpZiAoIXNlbGYtPnNldHRpbmdzLm51bGxfbW9kZW0pCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJEVEUgPC0+IERDRVxuIik7CisJZWxzZQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAKKwkJCSAgICAgICAiRFRFIDwtPiBEVEUgKG51bGwgbW9kZW0gZW11bGF0aW9uKVxuIik7CisKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiRGF0YSByYXRlOiAlZFxuIiwgc2VsZi0+c2V0dGluZ3MuZGF0YV9yYXRlKTsKKworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJGbG93IGNvbnRyb2w6ICIpOworCWlmIChzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2wgJiBJUkNPTU1fWE9OX1hPRkZfSU4pCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJYT05fWE9GRl9JTnwiKTsKKwlpZiAoc2VsZi0+c2V0dGluZ3MuZmxvd19jb250cm9sICYgSVJDT01NX1hPTl9YT0ZGX09VVCkKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlhPTl9YT0ZGX09VVHwiKTsKKwlpZiAoc2VsZi0+c2V0dGluZ3MuZmxvd19jb250cm9sICYgSVJDT01NX1JUU19DVFNfSU4pCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJSVFNfQ1RTX0lOfCIpOworCWlmIChzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2wgJiBJUkNPTU1fUlRTX0NUU19PVVQpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJSVFNfQ1RTX09VVHwiKTsKKwlpZiAoc2VsZi0+c2V0dGluZ3MuZmxvd19jb250cm9sICYgSVJDT01NX0RTUl9EVFJfSU4pCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJEU1JfRFRSX0lOfCIpOworCWlmIChzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2wgJiBJUkNPTU1fRFNSX0RUUl9PVVQpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJEU1JfRFRSX09VVHwiKTsKKwlpZiAoc2VsZi0+c2V0dGluZ3MuZmxvd19jb250cm9sICYgSVJDT01NX0VOUV9BQ0tfSU4pCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJFTlFfQUNLX0lOfCIpOworCWlmIChzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2wgJiBJUkNPTU1fRU5RX0FDS19PVVQpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJFTlFfQUNLX09VVHwiKTsKKwlpZiAoc2VsZi0+c2V0dGluZ3MuZmxvd19jb250cm9sKQorCQlyZXQtLTsgLyogcmVtb3ZlIHRoZSBsYXN0IHwgKi8KKyAgICAgICAgcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlxuIik7CisKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiRmxhZ3M6ICIpOworCWlmIChzZWxmLT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiQVNZTkNfQ1RTX0ZMT1d8Iik7CisJaWYgKHNlbGYtPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJBU1lOQ19DSEVDS19DRHwiKTsKKwlpZiAoc2VsZi0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkFTWU5DX0lOSVRJQUxJWkVEfCIpOworCWlmIChzZWxmLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiQVNZTkNfTE9XX0xBVEVOQ1l8Iik7CisJaWYgKHNlbGYtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkFTWU5DX0NMT1NJTkd8Iik7CisJaWYgKHNlbGYtPmZsYWdzICYgQVNZTkNfTk9STUFMX0FDVElWRSkKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkFTWU5DX05PUk1BTF9BQ1RJVkV8Iik7CisJaWYgKHNlbGYtPmZsYWdzKQorCQlyZXQtLTsgLyogcmVtb3ZlIHRoZSBsYXN0IHwgKi8KKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiXG4iKTsKKworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJSb2xlOiAlc1xuIiwgc2VsZi0+Y2xpZW50ID8gCisJCSAgICAgICAiY2xpZW50IiA6ICJzZXJ2ZXIiKTsKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiT3BlbiBjb3VudDogJWRcbiIsIHNlbGYtPm9wZW5fY291bnQpOworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJNYXggZGF0YSBzaXplOiAlZFxuIiwgc2VsZi0+bWF4X2RhdGFfc2l6ZSk7CisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIk1heCBoZWFkZXIgc2l6ZTogJWRcbiIsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7CisJCQorCWlmIChzZWxmLT50dHkpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJIYXJkd2FyZTogJXNcbiIsIAorCQkJICAgICAgIHNlbGYtPnR0eS0+aHdfc3RvcHBlZCA/ICJTdG9wcGVkIiA6ICJSdW5uaW5nIik7CisKKyAgICAgICAgcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlxuIik7CisgICAgICAgIHJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfcmVhZF9wcm9jIChidWYsIHN0YXJ0LCBvZmZzZXQsIGxlbiwgZW9mLCB1bnVzZWQpCisgKgorICogICAgCisgKgorICovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9yZWFkX3Byb2MoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwKKwkJCQlpbnQgKmVvZiwgdm9pZCAqdW51c2VkKQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmOworICAgICAgICBpbnQgY291bnQgPSAwLCBsOworICAgICAgICBvZmZfdCBiZWdpbiA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpcmNvbW1fdHR5LT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBoYXNoYmluX2dldF9maXJzdChpcmNvbW1fdHR5KTsKKwl3aGlsZSAoKHNlbGYgIT0gTlVMTCkgJiYgKGNvdW50IDwgNDAwMCkpIHsKKwkJaWYgKHNlbGYtPm1hZ2ljICE9IElSQ09NTV9UVFlfTUFHSUMpCisJCQlicmVhazsKKworICAgICAgICAgICAgICAgIGwgPSBpcmNvbW1fdHR5X2xpbmVfaW5mbyhzZWxmLCBidWYgKyBjb3VudCk7CisgICAgICAgICAgICAgICAgY291bnQgKz0gbDsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQrYmVnaW4gPiBvZmZzZXQrbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIGlmIChjb3VudCtiZWdpbiA8IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4gKz0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgfQorCQkJCQorCQlzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGhhc2hiaW5fZ2V0X25leHQoaXJjb21tX3R0eSk7CisgICAgICAgIH0KKyAgICAgICAgKmVvZiA9IDE7Citkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlyY29tbV90dHktPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKyAgICAgICAgaWYgKG9mZnNldCA+PSBjb3VudCtiZWdpbikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgKnN0YXJ0ID0gYnVmICsgKG9mZnNldC1iZWdpbik7CisgICAgICAgIHJldHVybiAoKGxlbiA8IGJlZ2luK2NvdW50LW9mZnNldCkgPyBsZW4gOiBiZWdpbitjb3VudC1vZmZzZXQpOworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSXJDT01NIHNlcmlhbCBUVFkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfQ0hBUkRFVl9NQUpPUihJUkNPTU1fVFRZX01BSk9SKTsKKworbW9kdWxlX2luaXQoaXJjb21tX3R0eV9pbml0KTsKK21vZHVsZV9leGl0KGlyY29tbV90dHlfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eV9hdHRhY2guYyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5X2F0dGFjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjVlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eV9hdHRhY2guYwpAQCAtMCwwICsxLDEwMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJjb21tX3R0eV9hdHRhY2guYworICogVmVyc2lvbjogICAgICAgCisgKiBEZXNjcmlwdGlvbjogICBDb2RlIGZvciBhdHRhY2hpbmcgdGhlIHNlcmlhbCBkcml2ZXIgdG8gSXJDT01NCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgSnVuICA1IDE3OjQyOjAwIDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIFR1ZSBKYW4gIDQgMTQ6MjA6NDkgMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lydHRwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvcGFyYW1ldGVycy5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fcGFyYW0uaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fZXZlbnQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV90dHkuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fdHR5X2F0dGFjaC5oPgorCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2lhc19yZWdpc3RlcihzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2Rpc2NvdmVyeV9pbmRpY2F0aW9uKGRpc2NpbmZvX3QgKmRpc2NvdmVyeSwKKwkJCQkJICAgIERJU0NPVkVSWV9NT0RFIG1vZGUsCisJCQkJCSAgICB2b2lkICpwcml2KTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfZ2V0dmFsdWVfY29uZmlybShpbnQgcmVzdWx0LCBfX3UxNiBvYmpfaWQsIAorCQkJCQlzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZSwgdm9pZCAqcHJpdik7CitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLAorCQkJCQkgICAgaW50IHRpbWVvdXQpOworc3RhdGljIHZvaWQgaXJjb21tX3R0eV93YXRjaGRvZ190aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpOworCitzdGF0aWMgaW50IGlyY29tbV90dHlfc3RhdGVfaWRsZShzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwgCisJCQkJIElSQ09NTV9UVFlfRVZFTlQgZXZlbnQsIAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkgc3RydWN0IGlyY29tbV90dHlfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlyY29tbV90dHlfc3RhdGVfc2VhcmNoKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCAKKwkJCQkgICBJUkNPTU1fVFRZX0VWRU5UIGV2ZW50LCAKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkgICBzdHJ1Y3QgaXJjb21tX3R0eV9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9zdGF0ZV9xdWVyeV9wYXJhbWV0ZXJzKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCAKKwkJCQkJICAgICBJUkNPTU1fVFRZX0VWRU5UIGV2ZW50LCAKKwkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkJICAgICBzdHJ1Y3QgaXJjb21tX3R0eV9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9zdGF0ZV9xdWVyeV9sc2FwX3NlbChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwgCisJCQkJCSAgIElSQ09NTV9UVFlfRVZFTlQgZXZlbnQsIAorCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkJICAgc3RydWN0IGlyY29tbV90dHlfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlyY29tbV90dHlfc3RhdGVfc2V0dXAoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsIAorCQkJCSAgSVJDT01NX1RUWV9FVkVOVCBldmVudCwgCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkgIHN0cnVjdCBpcmNvbW1fdHR5X2luZm8gKmluZm8pOworc3RhdGljIGludCBpcmNvbW1fdHR5X3N0YXRlX3JlYWR5KHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCAKKwkJCQkgIElSQ09NTV9UVFlfRVZFTlQgZXZlbnQsIAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCQkJICBzdHJ1Y3QgaXJjb21tX3R0eV9pbmZvICppbmZvKTsKKworY2hhciAqaXJjb21tX3R0eV9zdGF0ZVtdID0geworCSJJUkNPTU1fVFRZX0lETEUiLAorCSJJUkNPTU1fVFRZX1NFQVJDSCIsCisJIklSQ09NTV9UVFlfUVVFUllfUEFSQU1FVEVSUyIsCisJIklSQ09NTV9UVFlfUVVFUllfTFNBUF9TRUwiLAorCSJJUkNPTU1fVFRZX1NFVFVQIiwKKwkiSVJDT01NX1RUWV9SRUFEWSIsCisJIioqKiBFUlJPUiAqKiogIiwKK307CisKKyNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRworc3RhdGljIGNoYXIgKmlyY29tbV90dHlfZXZlbnRbXSA9IHsKKwkiSVJDT01NX1RUWV9BVFRBQ0hfQ0FCTEUiLAorCSJJUkNPTU1fVFRZX0RFVEFDSF9DQUJMRSIsCisJIklSQ09NTV9UVFlfREFUQV9SRVFVRVNUIiwKKwkiSVJDT01NX1RUWV9EQVRBX0lORElDQVRJT04iLAorCSJJUkNPTU1fVFRZX0RJU0NPVkVSWV9SRVFVRVNUIiwKKwkiSVJDT01NX1RUWV9ESVNDT1ZFUllfSU5ESUNBVElPTiIsCisJIklSQ09NTV9UVFlfQ09OTkVDVF9DT05GSVJNIiwKKwkiSVJDT01NX1RUWV9DT05ORUNUX0lORElDQVRJT04iLAorCSJJUkNPTU1fVFRZX0RJU0NPTk5FQ1RfUkVRVUVTVCIsCisJIklSQ09NTV9UVFlfRElTQ09OTkVDVF9JTkRJQ0FUSU9OIiwKKwkiSVJDT01NX1RUWV9XRF9USU1FUl9FWFBJUkVEIiwKKwkiSVJDT01NX1RUWV9HT1RfUEFSQU1FVEVSUyIsCisJIklSQ09NTV9UVFlfR09UX0xTQVBTRUwiLAorCSIqKiogRVJST1IgKioqKiIsCit9OworI2VuZGlmIC8qIENPTkZJR19JUkRBX0RFQlVHICovCisKK3N0YXRpYyBpbnQgKCpzdGF0ZVtdKShzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwgSVJDT01NX1RUWV9FVkVOVCBldmVudCwKKwkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlyY29tbV90dHlfaW5mbyAqaW5mbykgPSAKK3sKKwlpcmNvbW1fdHR5X3N0YXRlX2lkbGUsCisJaXJjb21tX3R0eV9zdGF0ZV9zZWFyY2gsCisJaXJjb21tX3R0eV9zdGF0ZV9xdWVyeV9wYXJhbWV0ZXJzLAorCWlyY29tbV90dHlfc3RhdGVfcXVlcnlfbHNhcF9zZWwsCisJaXJjb21tX3R0eV9zdGF0ZV9zZXR1cCwKKwlpcmNvbW1fdHR5X3N0YXRlX3JlYWR5LAorfTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfYXR0YWNoX2NhYmxlIChkcml2ZXIpCisgKgorICogICAgVHJ5IHRvIGF0dGFjaCBjYWJsZSAoSXJDT01NIGxpbmspLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSByZXR1cm4KKyAqICAgIHdoZW4gdGhlIGxpbmsgaGFzIGJlZW4gY29ubmVjdGVkLCBvciBpZiBhbiBlcnJvciBjb25kaXRpb24gb2NjdXJzLiAKKyAqICAgIElmIHN1Y2Nlc3MsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHJlc3VsdGluZyBzZXJ2aWNlIHR5cGUuCisgKi8KK2ludCBpcmNvbW1fdHR5X2F0dGFjaF9jYWJsZShzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKyAgICAgICAJLyogQ2hlY2sgaWYgc29tZWJvZHkgaGFzIGFscmVhZHkgY29ubmVjdGVkIHRvIHVzICovCisJaWYgKGlyY29tbV9pc19jb25uZWN0ZWQoc2VsZi0+aXJjb21tKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBhbHJlYWR5IGNvbm5lY3RlZCFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgbm9ib2R5IHRyaWVzIHRvIHdyaXRlIGJlZm9yZSB0aGUgbGluayBpcyB1cCAqLworCXNlbGYtPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisKKwlpcmNvbW1fdHR5X2lhc19yZWdpc3RlcihzZWxmKTsKKworCWlyY29tbV90dHlfZG9fZXZlbnQoc2VsZiwgSVJDT01NX1RUWV9BVFRBQ0hfQ0FCTEUsIE5VTEwsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fZGV0YWNoX2NhYmxlIChkcml2ZXIpCisgKgorICogICAgRGV0YWNoIGNhYmxlLCBvciBjYWJsZSBoYXMgYmVlbiBkZXRhY2hlZCBieSBwZWVyCisgKgorICovCit2b2lkIGlyY29tbV90dHlfZGV0YWNoX2NhYmxlKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmKQoreworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKworCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCisJLyogUmVtb3ZlIGRpc2NvdmVyeSBoYW5kbGVyICovCisJaWYgKHNlbGYtPmNrZXkpIHsKKwkJaXJsbXBfdW5yZWdpc3Rlcl9jbGllbnQoc2VsZi0+Y2tleSk7CisJCXNlbGYtPmNrZXkgPSBOVUxMOworCX0KKwkvKiBSZW1vdmUgSXJDT01NIGhpbnQgYml0cyAqLworCWlmIChzZWxmLT5za2V5KSB7CisJCWlybG1wX3VucmVnaXN0ZXJfc2VydmljZShzZWxmLT5za2V5KTsKKwkJc2VsZi0+c2tleSA9IE5VTEw7CisJfQorCisJaWYgKHNlbGYtPmlyaWFwKSB7IAorCQlpcmlhcF9jbG9zZShzZWxmLT5pcmlhcCk7CisJCXNlbGYtPmlyaWFwID0gTlVMTDsKKwl9CisKKwkvKiBSZW1vdmUgTE0tSUFTIG9iamVjdCAqLworCWlmIChzZWxmLT5vYmopIHsKKwkJaXJpYXNfZGVsZXRlX29iamVjdChzZWxmLT5vYmopOworCQlzZWxmLT5vYmogPSBOVUxMOworCX0KKworCWlyY29tbV90dHlfZG9fZXZlbnQoc2VsZiwgSVJDT01NX1RUWV9ERVRBQ0hfQ0FCTEUsIE5VTEwsIE5VTEwpOworCisJLyogUmVzZXQgc29tZSB2YWx1ZXMgKi8KKwlzZWxmLT5kYWRkciA9IHNlbGYtPnNhZGRyID0gMDsKKwlzZWxmLT5kbHNhcF9zZWwgPSBzZWxmLT5zbHNhcF9zZWwgPSAwOworCisJbWVtc2V0KCZzZWxmLT5zZXR0aW5ncywgMCwgc2l6ZW9mKHN0cnVjdCBpcmNvbW1fcGFyYW1zKSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2lhc19yZWdpc3RlciAoc2VsZikKKyAqCisgKiAgICBSZWdpc3RlciB3aXRoIExNLUlBUyBkZXBlbmRpbmcgb24gd2hpY2ggc2VydmljZSB0eXBlIHdlIGFyZQorICoKKyAqLworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9pYXNfcmVnaXN0ZXIoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYpCit7CisJX191OCBvY3Rfc2VxWzZdOworCV9fdTE2IGhpbnRzOworCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCQorCS8qIENvbXB1dGUgaGludCBiaXRzIGJhc2VkIG9uIHNlcnZpY2UgKi8KKwloaW50cyA9IGlybG1wX3NlcnZpY2VfdG9faGludChTX0NPTU0pOworCWlmIChzZWxmLT5zZXJ2aWNlX3R5cGUgJiBJUkNPTU1fM19XSVJFX1JBVykKKwkJaGludHMgfD0gaXJsbXBfc2VydmljZV90b19oaW50KFNfUFJJTlRFUik7CisKKwkvKiBBZHZlcnRpc2UgSXJDT01NIGhpbnQgYml0IGluIGRpc2NvdmVyeSAqLworCWlmICghc2VsZi0+c2tleSkKKwkJc2VsZi0+c2tleSA9IGlybG1wX3JlZ2lzdGVyX3NlcnZpY2UoaGludHMpOworCS8qIFNldCB1cCBhIGRpc2NvdmVyeSBoYW5kbGVyICovCisJaWYgKCFzZWxmLT5ja2V5KQorCQlzZWxmLT5ja2V5ID0gaXJsbXBfcmVnaXN0ZXJfY2xpZW50KGhpbnRzLAorCQkJCQkJICAgaXJjb21tX3R0eV9kaXNjb3ZlcnlfaW5kaWNhdGlvbiwKKwkJCQkJCSAgIE5VTEwsICh2b2lkICopIHNlbGYpOworCisJLyogSWYgYWxyZWFkeSBkb25lLCBubyBuZWVkIHRvIGRvIGl0IGFnYWluICovCisJaWYgKHNlbGYtPm9iaikKKwkJcmV0dXJuOworCisJaWYgKHNlbGYtPnNlcnZpY2VfdHlwZSAmIElSQ09NTV8zX1dJUkVfUkFXKSB7CisJCS8qIFJlZ2lzdGVyIElyTFBUIHdpdGggTE0tSUFTICovCisJCXNlbGYtPm9iaiA9IGlyaWFzX25ld19vYmplY3QoIklyTFBUIiwgSUFTX0lSTFBUX0lEKTsKKwkJaXJpYXNfYWRkX2ludGVnZXJfYXR0cmliKHNlbGYtPm9iaiwgIklyREE6SXJMTVA6THNhcFNlbCIsIAorCQkJCQkgc2VsZi0+c2xzYXBfc2VsLCBJQVNfS0VSTkVMX0FUVFIpOworCX0gZWxzZSB7CisJCS8qIFJlZ2lzdGVyIElyQ09NTSB3aXRoIExNLUlBUyAqLworCQlzZWxmLT5vYmogPSBpcmlhc19uZXdfb2JqZWN0KCJJckRBOklyQ09NTSIsIElBU19JUkNPTU1fSUQpOworCQlpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIoc2VsZi0+b2JqLCAiSXJEQTpUaW55VFA6THNhcFNlbCIsIAorCQkJCQkgc2VsZi0+c2xzYXBfc2VsLCBJQVNfS0VSTkVMX0FUVFIpOworCQkKKwkJLyogQ29kZSB0aGUgcGFyYW1ldGVycyBpbnRvIHRoZSBidWZmZXIgKi8KKwkJaXJkYV9wYXJhbV9wYWNrKG9jdF9zZXEsICJiYmJiYmIiLCAKKwkJCQlJUkNPTU1fU0VSVklDRV9UWVBFLCAxLCBzZWxmLT5zZXJ2aWNlX3R5cGUsCisJCQkJSVJDT01NX1BPUlRfVFlQRSwgICAgMSwgSVJDT01NX1NFUklBTCk7CisJCQorCQkvKiBSZWdpc3RlciBwYXJhbWV0ZXJzIHdpdGggTE0tSUFTICovCisJCWlyaWFzX2FkZF9vY3RzZXFfYXR0cmliKHNlbGYtPm9iaiwgIlBhcmFtZXRlcnMiLCBvY3Rfc2VxLCA2LAorCQkJCQlJQVNfS0VSTkVMX0FUVFIpOworCX0KKwlpcmlhc19pbnNlcnRfb2JqZWN0KHNlbGYtPm9iaik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2lhc191bnJlZ2lzdGVyIChzZWxmKQorICoKKyAqICAgIFJlbW92ZSBvdXIgSUFTIG9iamVjdCBhbmQgY2xpZW50IGhvb2sgd2hpbGUgY29ubmVjdGVkLgorICoKKyAqLworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9pYXNfdW5yZWdpc3RlcihzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZikKK3sKKwkvKiBSZW1vdmUgTE0tSUFTIG9iamVjdCBub3cgc28gaXQgaXMgbm90IHJldXNlZC4KKwkgKiBJckNPTU0gZGVhbHMgdmVyeSBwb29ybHkgd2l0aCBtdWx0aXBsZSBpbmNvbWluZyBjb25uZWN0aW9ucy4KKwkgKiBJdCBzaG91bGQgbG9va3MgYSBsb3QgbW9yZSBsaWtlIElyTkVULCBhbmQgImR1cCIgYSBzZXJ2ZXIgVFNBUAorCSAqIHRvIHRoZSBhcHBsaWNhdGlvbiBUU0FQIChiYXNlZCBvbiB2YXJpb3VzIHJ1bGVzKS4KKwkgKiBUaGlzIGlzIGEgY2hlYXAgd29ya2Fyb3VuZCBhbGxvd2luZyBtdWx0aXBsZSBjbGllbnRzIHRvCisJICogY29ubmVjdCB0byB1cy4gSXQgd2lsbCBub3QgYWx3YXlzIHdvcmsuCisJICogRWFjaCBJckNPTU0gc29ja2V0IGhhcyBhbiBJQVMgZW50cnkuIEluY29taW5nIGNvbm5lY3Rpb24gd2lsbAorCSAqIHBpY2sgdGhlIGZpcnN0IG9uZSBmb3VuZC4gU28sIHdoZW4gd2UgYXJlIGZ1bGx5IGNvbm5lY3RlZCwKKwkgKiB3ZSByZW1vdmUgb3VyIElBUyBlbnRyaWVzIHNvIHRoYXQgdGhlIG5leHQgSUFTIGVudHJ5IGlzIHVzZWQuCisJICogV2UgZG8gdGhhdCBmb3IgKmJvdGgqIGNsaWVudCBhbmQgc2VydmVyLCBiZWNhdXNlIGEgc2VydmVyCisJICogY2FuIGFsc28gY3JlYXRlIGNsaWVudCBpbnN0YW5jZXMuCisJICogSmVhbiBJSSAqLworCWlmIChzZWxmLT5vYmopIHsKKwkJaXJpYXNfZGVsZXRlX29iamVjdChzZWxmLT5vYmopOworCQlzZWxmLT5vYmogPSBOVUxMOworCX0KKworI2lmIDAKKwkvKiBSZW1vdmUgZGlzY292ZXJ5IGhhbmRsZXIuCisJICogV2hpbGUgd2UgYXJlIGNvbm5lY3RlZCwgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gcmVjZWl2ZQorCSAqIGRpc2NvdmVyeSBldmVudHMuIFRoaXMgd291bGQgYmUgdGhlIGNhc2UgaWYgdGhlcmUgaXMKKwkgKiBtdWx0aXBsZSBJckxBUCBpbnRlcmZhY2VzLiBKZWFuIElJICovCisJaWYgKHNlbGYtPmNrZXkpIHsKKwkJaXJsbXBfdW5yZWdpc3Rlcl9jbGllbnQoc2VsZi0+Y2tleSk7CisJCXNlbGYtPmNrZXkgPSBOVUxMOworCX0KKyNlbmRpZgorfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3NlbmRfaW5pdGlhbF9wYXJhbWV0ZXJzIChzZWxmKQorICoKKyAqICAgIFNlbmQgaW5pdGlhbCBwYXJhbWV0ZXJzIHRvIHRoZSByZW1vdGUgSXJDT01NIGRldmljZS4gVGhlc2UgcGFyYW1ldGVycworICogICAgbXVzdCBiZSBzZW50IGJlZm9yZSBhbnkgZGF0YS4KKyAqLworaW50IGlyY29tbV90dHlfc2VuZF9pbml0aWFsX3BhcmFtZXRlcnMoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKworCWlmIChzZWxmLT5zZXJ2aWNlX3R5cGUgJiBJUkNPTU1fM19XSVJFX1JBVykgCisJCXJldHVybiAwOworCisJLyogCisJICogU2V0IGRlZmF1bHQgdmFsdWVzLCBidXQgb25seSBpZiB0aGUgYXBwbGljYXRpb24gZm9yIHNvbWUgcmVhc29uIAorCSAqIGhhdmVuJ3Qgc2V0IHRoZW0gYWxyZWFkeQorCSAqLworCUlSREFfREVCVUcoMiwgIiVzKCksIGRhdGEtcmF0ZSA9ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCAKKwkJICAgc2VsZi0+c2V0dGluZ3MuZGF0YV9yYXRlKTsKKwlpZiAoIXNlbGYtPnNldHRpbmdzLmRhdGFfcmF0ZSkKKwkJc2VsZi0+c2V0dGluZ3MuZGF0YV9yYXRlID0gOTYwMDsKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBkYXRhLWZvcm1hdCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCAKKwkJICAgc2VsZi0+c2V0dGluZ3MuZGF0YV9mb3JtYXQpOworCWlmICghc2VsZi0+c2V0dGluZ3MuZGF0YV9mb3JtYXQpCisJCXNlbGYtPnNldHRpbmdzLmRhdGFfZm9ybWF0ID0gSVJDT01NX1dTSVpFXzg7ICAvKiA4TjEgKi8KKworCUlSREFfREVCVUcoMiwgIiVzKCksIGZsb3ctY29udHJvbCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCAKKwkJICAgc2VsZi0+c2V0dGluZ3MuZmxvd19jb250cm9sKTsKKwkvKnNlbGYtPnNldHRpbmdzLmZsb3dfY29udHJvbCA9IElSQ09NTV9SVFNfQ1RTX0lOfElSQ09NTV9SVFNfQ1RTX09VVDsqLworCisJLyogRG8gbm90IHNldCBkZWx0YSB2YWx1ZXMgZm9yIHRoZSBpbml0aWFsIHBhcmFtZXRlcnMgKi8KKwlzZWxmLT5zZXR0aW5ncy5kdGUgPSBJUkNPTU1fRFRSIHwgSVJDT01NX1JUUzsKKworCS8qIE9ubHkgc2VuZCBzZXJ2aWNlIHR5cGUgcGFyYW1ldGVyIHdoZW4gd2UgYXJlIHRoZSBjbGllbnQgKi8KKwlpZiAoc2VsZi0+Y2xpZW50KQorCQlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fU0VSVklDRV9UWVBFLCBGQUxTRSk7CisJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0RBVEFfUkFURSwgRkFMU0UpOworCWlyY29tbV9wYXJhbV9yZXF1ZXN0KHNlbGYsIElSQ09NTV9EQVRBX0ZPUk1BVCwgRkFMU0UpOworCQorCS8qIEZvciBhIDMgd2lyZSBzZXJ2aWNlLCB3ZSBqdXN0IGZsdXNoIHRoZSBsYXN0IHBhcmFtZXRlciBhbmQgcmV0dXJuICovCisJaWYgKHNlbGYtPnNldHRpbmdzLnNlcnZpY2VfdHlwZSA9PSBJUkNPTU1fM19XSVJFKSB7CisJCWlyY29tbV9wYXJhbV9yZXF1ZXN0KHNlbGYsIElSQ09NTV9GTE9XX0NPTlRST0wsIFRSVUUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBPbmx5IDktd2lyZSBzZXJ2aWNlIHR5cGVzIGNvbnRpbnVlIGhlcmUgKi8KKwlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fRkxPV19DT05UUk9MLCBGQUxTRSk7CisjaWYgMAorCWlyY29tbV9wYXJhbV9yZXF1ZXN0KHNlbGYsIElSQ09NTV9YT05fWE9GRiwgRkFMU0UpOworCWlyY29tbV9wYXJhbV9yZXF1ZXN0KHNlbGYsIElSQ09NTV9FTlFfQUNLLCBGQUxTRSk7CisjZW5kaWYJCisJLyogTm90aWZ5IHBlZXIgdGhhdCB3ZSBhcmUgcmVhZHkgdG8gcmVjZWl2ZSBkYXRhICovCisJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0RURSwgVFJVRSk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2Rpc2NvdmVyeV9pbmRpY2F0aW9uIChkaXNjb3ZlcnkpCisgKgorICogICAgUmVtb3RlIGRldmljZSBpcyBkaXNjb3ZlcmVkLCB0cnkgcXVlcnkgdGhlIHJlbW90ZSBJQVMgdG8gc2VlIHdoaWNoCisgKiAgICBkZXZpY2UgaXQgaXMsIGFuZCB3aGljaCBzZXJ2aWNlcyBpdCBoYXMuCisgKgorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2Rpc2NvdmVyeV9pbmRpY2F0aW9uKGRpc2NpbmZvX3QgKmRpc2NvdmVyeSwKKwkJCQkJICAgIERJU0NPVkVSWV9NT0RFIG1vZGUsCisJCQkJCSAgICB2b2lkICpwcml2KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmOworCXN0cnVjdCBpcmNvbW1fdHR5X2luZm8gaW5mbzsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogSW1wb3J0YW50IG5vdGUgOgorCSAqIFdlIG5lZWQgdG8gZHJvcCBhbGwgcGFzc2l2ZSBkaXNjb3Zlcmllcy4KKwkgKiBUaGUgTFNBUCBtYW5hZ2VtZW50IG9mIElyQ29tbSBpcyBkZWZpY2llbnQgYW5kIGRvZXNuJ3QgZGVhbAorCSAqIHdpdGggdGhlIGNhc2Ugb2YgdHdvIGluc3RhbmNlIGNvbm5lY3RpbmcgdG8gZWFjaCBvdGhlcgorCSAqIHNpbXVsdGFuZW91c2x5IChpdCB3aWxsIGRlYWRsb2NrIGluIExNUCkuCisJICogVGhlIHByb3BlciBmaXggd291bGQgYmUgdG8gdXNlIHRoZSBzYW1lIHRlY2huaXF1ZSBhcyBpbiBJck5FVCwKKwkgKiB0byBoYXZlIG9uZSBzZXJ2ZXIgc29ja2V0IGFuZCBzZXBhcmF0ZSBpbnN0YW5jZXMgZm9yIHRoZQorCSAqIGNvbm5lY3RpbmcvY29ubmVjdGVkIHNvY2tldC4KKwkgKiBUaGUgd29ya2Fyb3VuZCBpcyB0byBkcm9wIHBhc3NpdmUgZGlzY292ZXJ5LCB3aGljaCBkcmFzdGljYWxseQorCSAqIHJlZHVjZSB0aGUgcHJvYmFiaWxpdHkgb2YgdGhpcyBoYXBwZW5pbmcuCisJICogSmVhbiBJSSAqLworCWlmKG1vZGUgPT0gRElTQ09WRVJZX1BBU1NJVkUpCisJCXJldHVybjsKKworCWluZm8uZGFkZHIgPSBkaXNjb3ZlcnktPmRhZGRyOworCWluZm8uc2FkZHIgPSBkaXNjb3ZlcnktPnNhZGRyOworCisJLyogRklYTUUuIFdlIGhhdmUgYSBsb2NraW5nIHByb2JsZW0gb24gdGhlIGhhc2hiaW4gaGVyZS4KKwkgKiBXZSBwcm9iYWJseSBuZWVkIHRvIHVzZSBoYXNoYmluX2ZpbmRfbmV4dCgpLCBidXQgd2UgZmlyc3QKKwkgKiBuZWVkIHRvIGVuc3VyZSB0aGF0ICJsaW5lIiBpcyB1bmlxdWUuIC0gSmVhbiBJSSAqLworCXNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJjb21tX3R0eSk7CisJd2hpbGUgKHNlbGYgIT0gTlVMTCkgeworCQlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKwkJCisJCWlyY29tbV90dHlfZG9fZXZlbnQoc2VsZiwgSVJDT01NX1RUWV9ESVNDT1ZFUllfSU5ESUNBVElPTiwgCisJCQkJICAgIE5VTEwsICZpbmZvKTsKKworCQlzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGhhc2hiaW5fZ2V0X25leHQoaXJjb21tX3R0eSk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9kaXNjb25uZWN0X2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHJlYXNvbiwgc2tiKQorICoKKyAqICAgIExpbmsgZGlzY29ubmVjdGVkCisgKgorICovCit2b2lkIGlyY29tbV90dHlfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAorCQkJCSAgICAgIExNX1JFQVNPTiByZWFzb24sCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKworCWlmICghc2VsZi0+dHR5KQorCQlyZXR1cm47CisKKwkvKiBUaGlzIHdpbGwgc3RvcCBjb250cm9sIGRhdGEgdHJhbnNmZXJzICovCisJc2VsZi0+ZmxvdyA9IEZMT1dfU1RPUDsKKworCS8qIFN0b3AgZGF0YSB0cmFuc2ZlcnMgKi8KKwlzZWxmLT50dHktPmh3X3N0b3BwZWQgPSAxOworCisJaXJjb21tX3R0eV9kb19ldmVudChzZWxmLCBJUkNPTU1fVFRZX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiwgTlVMTCwgCisJCQkgICAgTlVMTCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2dldHZhbHVlX2NvbmZpcm0gKHJlc3VsdCwgb2JqX2lkLCB2YWx1ZSwgcHJpdikKKyAqCisgKiAgICBHb3QgcmVzdWx0IGZyb20gdGhlIElBUyBxdWVyeSB3ZSBtYWtlCisgKgorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2dldHZhbHVlX2NvbmZpcm0oaW50IHJlc3VsdCwgX191MTYgb2JqX2lkLCAKKwkJCQkJc3RydWN0IGlhc192YWx1ZSAqdmFsdWUsIAorCQkJCQl2b2lkICpwcml2KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIHByaXY7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBXZSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIG1ha2UgYW55IG1vcmUgcXVlcmllcyAqLworCWlyaWFwX2Nsb3NlKHNlbGYtPmlyaWFwKTsKKwlzZWxmLT5pcmlhcCA9IE5VTEw7CisKKwkvKiBDaGVjayBpZiByZXF1ZXN0IHN1Y2NlZWRlZCAqLworCWlmIChyZXN1bHQgIT0gSUFTX1NVQ0NFU1MpIHsKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgZ290IE5VTEwgdmFsdWUhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAodmFsdWUtPnR5cGUpIHsKKyAJY2FzZSBJQVNfT0NUX1NFUToKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgZ290IG9jdGV0IHNlcXVlbmNlXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCQlpcmRhX3BhcmFtX2V4dHJhY3RfYWxsKHNlbGYsIHZhbHVlLT50Lm9jdF9zZXEsIHZhbHVlLT5sZW4sCisJCQkJICAgICAgICZpcmNvbW1fcGFyYW1faW5mbyk7CisKKwkJaXJjb21tX3R0eV9kb19ldmVudChzZWxmLCBJUkNPTU1fVFRZX0dPVF9QQVJBTUVURVJTLCBOVUxMLCAKKwkJCQkgICAgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgSUFTX0lOVEVHRVI6CisJCS8qIEdvdCBMU0FQIHNlbGVjdG9yICovCQorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBnb3QgbHNhcHNlbCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCAKKwkJCSAgIHZhbHVlLT50LmludGVnZXIpOworCisJCWlmICh2YWx1ZS0+dC5pbnRlZ2VyID09IC0xKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBpbnZhbGlkIHZhbHVlIVxuIiwgX19GVU5DVElPTl9fICk7CisJCX0gZWxzZQorCQkJc2VsZi0+ZGxzYXBfc2VsID0gdmFsdWUtPnQuaW50ZWdlcjsKKworCQlpcmNvbW1fdHR5X2RvX2V2ZW50KHNlbGYsIElSQ09NTV9UVFlfR09UX0xTQVBTRUwsIE5VTEwsIE5VTEwpOworCQlicmVhazsKKwljYXNlIElBU19NSVNTSU5HOgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBnb3QgSUFTX01JU1NJTkdcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBnb3QgdW5rbm93biB0eXBlIVxuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCX0KKwlpcmlhc19kZWxldGVfdmFsdWUodmFsdWUpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9jb25uZWN0X2NvbmZpcm0gKGluc3RhbmNlLCBzYXAsIHFvcywgbWF4X3NkdV9zaXplLCBza2IpCisgKgorICogICAgQ29ubmVjdGlvbiBjb25maXJtZWQKKyAqCisgKi8KK3ZvaWQgaXJjb21tX3R0eV9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJc3RydWN0IHFvc19pbmZvICpxb3MsIAorCQkJCV9fdTMyIG1heF9kYXRhX3NpemUsIAorCQkJCV9fdTggbWF4X2hlYWRlcl9zaXplLCAKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGluc3RhbmNlOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJc2VsZi0+Y2xpZW50ID0gVFJVRTsKKwlzZWxmLT5tYXhfZGF0YV9zaXplID0gbWF4X2RhdGFfc2l6ZTsKKwlzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CisJc2VsZi0+ZmxvdyA9IEZMT1dfU1RBUlQ7CisKKwlpcmNvbW1fdHR5X2RvX2V2ZW50KHNlbGYsIElSQ09NTV9UVFlfQ09OTkVDVF9DT05GSVJNLCBOVUxMLCBOVUxMKTsKKworCS8qIE5vIG5lZWQgdG8ga2ZyZWVfc2tiIC0gc2VlIGlyY29tbV90dHBfY29ubmVjdF9jb25maXJtKCkgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfY29ubmVjdF9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBxb3MsIG1heF9zZHVfc2l6ZSwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiKQorICoKKyAqICAgIHdlIGFyZSBkaXNjb3ZlcmVkIGFuZCBiZWluZyByZXF1ZXN0ZWQgdG8gY29ubmVjdCBieSByZW1vdGUgZGV2aWNlICEKKyAqCisgKi8KK3ZvaWQgaXJjb21tX3R0eV9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJICAgc3RydWN0IHFvc19pbmZvICpxb3MsIAorCQkJCSAgIF9fdTMyIG1heF9kYXRhX3NpemUsCisJCQkJICAgX191OCBtYXhfaGVhZGVyX3NpemUsIAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisJaW50IGNsZW47CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwlzZWxmLT5jbGllbnQgPSBGQUxTRTsKKwlzZWxmLT5tYXhfZGF0YV9zaXplID0gbWF4X2RhdGFfc2l6ZTsKKwlzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CisJc2VsZi0+ZmxvdyA9IEZMT1dfU1RBUlQ7CisKKwljbGVuID0gc2tiLT5kYXRhWzBdOworCWlmIChjbGVuKQorCQlpcmRhX3BhcmFtX2V4dHJhY3RfYWxsKHNlbGYsIHNrYi0+ZGF0YSsxLCAKKwkJCQkgICAgICAgSVJEQV9NSU4oc2tiLT5sZW4sIGNsZW4pLCAKKwkJCQkgICAgICAgJmlyY29tbV9wYXJhbV9pbmZvKTsKKworCWlyY29tbV90dHlfZG9fZXZlbnQoc2VsZiwgSVJDT01NX1RUWV9DT05ORUNUX0lORElDQVRJT04sIE5VTEwsIE5VTEwpOworCisJLyogTm8gbmVlZCB0byBrZnJlZV9za2IgLSBzZWUgaXJjb21tX3R0cF9jb25uZWN0X2luZGljYXRpb24oKSAqLworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9saW5rX2VzdGFibGlzaGVkIChzZWxmKQorICoKKyAqICAgIENhbGxlZCB3aGVuIHRoZSBJckNPTU0gbGluayBpcyBlc3RhYmxpc2hlZAorICoKKyAqLwordm9pZCBpcmNvbW1fdHR5X2xpbmtfZXN0YWJsaXNoZWQoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJaWYgKCFzZWxmLT50dHkpCisJCXJldHVybjsKKwkKKwlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCS8qIAorCSAqIElyQ09NTSBsaW5rIGlzIG5vdyB1cCwgYW5kIGlmIHdlIGFyZSBub3QgdXNpbmcgaGFyZHdhcmUKKwkgKiBmbG93LWNvbnRyb2wsIHRoZW4gZGVjbGFyZSB0aGUgaGFyZHdhcmUgYXMgcnVubmluZy4gT3RoZXJ3aXNlIHdlCisJICogd2lsbCBoYXZlIHRvIHdhaXQgZm9yIHRoZSBwZWVyIGRldmljZSAoRENFKSB0byByYWlzZSB0aGUgQ1RTCisJICogbGluZS4gIAorCSAqLworCWlmICgoc2VsZi0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgJiYgKChzZWxmLT5zZXR0aW5ncy5kY2UgJiBJUkNPTU1fQ1RTKSA9PSAwKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCB3YWl0aW5nIGZvciBDVFMgLi4uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIHN0YXJ0aW5nIGhhcmR3YXJlIVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkJc2VsZi0+dHR5LT5od19zdG9wcGVkID0gMDsKKwkKKwkJLyogV2FrZSB1cCBwcm9jZXNzZXMgYmxvY2tlZCBvbiBvcGVuICovCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VsZi0+b3Blbl93YWl0KTsKKwl9CisKKwlzY2hlZHVsZV93b3JrKCZzZWxmLT50cXVldWUpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9zdGFydF93YXRjaGRvZ190aW1lciAoc2VsZiwgdGltZW91dCkKKyAqCisgKiAgICBTdGFydCB0aGUgd2F0Y2hkb2cgdGltZXIuIFRoaXMgdGltZXIgaXMgdXNlZCB0byBtYWtlIHN1cmUgdGhhdCBhbnkgCisgKiAgICBjb25uZWN0aW9uIGF0dGVtcHQgaXMgc3VjY2Vzc2Z1bCwgYW5kIGlmIG5vdCwgd2Ugd2lsbCByZXRyeSBhZnRlciAKKyAqICAgIHRoZSB0aW1lb3V0CisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsCisJCQkJCSAgICBpbnQgdGltZW91dCkKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsCisJCQkgaXJjb21tX3R0eV93YXRjaGRvZ190aW1lcl9leHBpcmVkKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfd2F0Y2hkb2dfdGltZXJfZXhwaXJlZCAoZGF0YSkKKyAqCisgKiAgICBDYWxsZWQgd2hlbiB0aGUgY29ubmVjdCBwcm9jZWR1cmUgaGF2ZSB0YWtlbiB0byBtdWNoIHRpbWUuCisgKgorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBkYXRhOworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKworCWlyY29tbV90dHlfZG9fZXZlbnQoc2VsZiwgSVJDT01NX1RUWV9XRF9USU1FUl9FWFBJUkVELCBOVUxMLCBOVUxMKTsKK30KKworCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9kb19ldmVudCAoc2VsZiwgZXZlbnQsIHNrYikKKyAqCisgKiAgICBQcm9jZXNzIGV2ZW50CisgKgorICovCitpbnQgaXJjb21tX3R0eV9kb19ldmVudChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwgSVJDT01NX1RUWV9FVkVOVCBldmVudCwKKwkJCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmNvbW1fdHR5X2luZm8gKmluZm8pIAoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlczogc3RhdGU9JXMsIGV2ZW50PSVzXG4iLCBfX0ZVTkNUSU9OX18gLAorCQkgICBpcmNvbW1fdHR5X3N0YXRlW3NlbGYtPnN0YXRlXSwgaXJjb21tX3R0eV9ldmVudFtldmVudF0pOworCQorCXJldHVybiAoKnN0YXRlW3NlbGYtPnN0YXRlXSkoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X25leHRfc3RhdGUgKHNlbGYsIHN0YXRlKQorICoKKyAqICAgIFN3aXRjaCBzdGF0ZQorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlyY29tbV90dHlfbmV4dF9zdGF0ZShzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwgSVJDT01NX1RUWV9TVEFURSBzdGF0ZSkKK3sKKwkvKgorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlczogbmV4dCBzdGF0ZT0lcywgc2VydmljZSB0eXBlPSVkXG4iLCBfX0ZVTkNUSU9OX18gLCAKKwkJICAgaXJjb21tX3R0eV9zdGF0ZVtzZWxmLT5zdGF0ZV0sIHNlbGYtPnNlcnZpY2VfdHlwZSk7CisJKi8KKwlzZWxmLT5zdGF0ZSA9IHN0YXRlOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9zdGF0ZV9pZGxlIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIEp1c3QgaGFuZ2luZyBhcm91bmQKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9zdGF0ZV9pZGxlKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCAKKwkJCQkgSVJDT01NX1RUWV9FVkVOVCBldmVudCwgCisJCQkJIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCSBzdHJ1Y3QgaXJjb21tX3R0eV9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXM6IHN0YXRlPSVzLCBldmVudD0lc1xuIiwgX19GVU5DVElPTl9fICwKKwkJICAgaXJjb21tX3R0eV9zdGF0ZVtzZWxmLT5zdGF0ZV0sIGlyY29tbV90dHlfZXZlbnRbZXZlbnRdKTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkNPTU1fVFRZX0FUVEFDSF9DQUJMRToKKwkJLyogVHJ5IHRvIGRpc2NvdmVyIGFueSByZW1vdGUgZGV2aWNlcyAqLwkJCisJCWlyY29tbV90dHlfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgMypIWik7CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1NFQVJDSCk7CisJCQorCQlpcmxtcF9kaXNjb3ZlcnlfcmVxdWVzdChESVNDT1ZFUllfREVGQVVMVF9TTE9UUyk7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9ESVNDT1ZFUllfSU5ESUNBVElPTjoKKwkJc2VsZi0+ZGFkZHIgPSBpbmZvLT5kYWRkcjsKKwkJc2VsZi0+c2FkZHIgPSBpbmZvLT5zYWRkcjsKKworCQlpZiAoc2VsZi0+aXJpYXApIHsKKwkJCUlSREFfV0FSTklORygiJXMoKSwgYnVzeSB3aXRoIGEgcHJldmlvdXMgcXVlcnlcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCXNlbGYtPmlyaWFwID0gaXJpYXBfb3BlbihMU0FQX0FOWSwgSUFTX0NMSUVOVCwgc2VsZiwKKwkJCQkJIGlyY29tbV90dHlfZ2V0dmFsdWVfY29uZmlybSk7CisKKwkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3Qoc2VsZi0+aXJpYXAsCisJCQkJCSAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwKKwkJCQkJICAgICAgIklyREE6SXJDT01NIiwgIlBhcmFtZXRlcnMiKTsKKwkJCisJCWlyY29tbV90dHlfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgMypIWik7CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1FVRVJZX1BBUkFNRVRFUlMpOworCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFlfQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCQkvKiBBY2NlcHQgY29ubmVjdGlvbiAqLworCQlpcmNvbW1fY29ubmVjdF9yZXNwb25zZShzZWxmLT5pcmNvbW0sIE5VTEwpOworCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9SRUFEWSk7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9XRF9USU1FUl9FWFBJUkVEOgorCQkvKiBKdXN0IHN0YXkgaWRsZSAqLworCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFlfREVUQUNIX0NBQkxFOgorCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9JRExFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgdW5rbm93biBldmVudDogJXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCQkgICBpcmNvbW1fdHR5X2V2ZW50W2V2ZW50XSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3N0YXRlX3NlYXJjaCAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBUcnlpbmcgdG8gZGlzY292ZXIgYW4gSXJDT01NIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X3N0YXRlX3NlYXJjaChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwgCisJCQkJICAgSVJDT01NX1RUWV9FVkVOVCBldmVudCwgCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCQkJICAgc3RydWN0IGlyY29tbV90dHlfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzOiBzdGF0ZT0lcywgZXZlbnQ9JXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCSAgIGlyY29tbV90dHlfc3RhdGVbc2VsZi0+c3RhdGVdLCBpcmNvbW1fdHR5X2V2ZW50W2V2ZW50XSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkNPTU1fVFRZX0RJU0NPVkVSWV9JTkRJQ0FUSU9OOgorCQlzZWxmLT5kYWRkciA9IGluZm8tPmRhZGRyOworCQlzZWxmLT5zYWRkciA9IGluZm8tPnNhZGRyOworCisJCWlmIChzZWxmLT5pcmlhcCkgeworCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBidXN5IHdpdGggYSBwcmV2aW91cyBxdWVyeVxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCQorCQlzZWxmLT5pcmlhcCA9IGlyaWFwX29wZW4oTFNBUF9BTlksIElBU19DTElFTlQsIHNlbGYsCisJCQkJCSBpcmNvbW1fdHR5X2dldHZhbHVlX2NvbmZpcm0pOworCQkKKwkJaWYgKHNlbGYtPnNlcnZpY2VfdHlwZSA9PSBJUkNPTU1fM19XSVJFX1JBVykgeworCQkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3Qoc2VsZi0+aXJpYXAsIHNlbGYtPnNhZGRyLAorCQkJCQkJICAgICAgc2VsZi0+ZGFkZHIsICJJckxQVCIsIAorCQkJCQkJICAgICAgIklyREE6SXJMTVA6THNhcFNlbCIpOworCQkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfUVVFUllfTFNBUF9TRUwpOworCQl9IGVsc2UgeworCQkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3Qoc2VsZi0+aXJpYXAsIHNlbGYtPnNhZGRyLAorCQkJCQkJICAgICAgc2VsZi0+ZGFkZHIsIAorCQkJCQkJICAgICAgIklyREE6SXJDT01NIiwgCisJCQkJCQkgICAgICAiUGFyYW1ldGVycyIpOworCisJCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9RVUVSWV9QQVJBTUVURVJTKTsKKwkJfQorCQlpcmNvbW1fdHR5X3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHNlbGYsIDMqSFopOworCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFlfQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKwkJaXJjb21tX3R0eV9pYXNfdW5yZWdpc3RlcihzZWxmKTsKKworCQkvKiBBY2NlcHQgY29ubmVjdGlvbiAqLworCQlpcmNvbW1fY29ubmVjdF9yZXNwb25zZShzZWxmLT5pcmNvbW0sIE5VTEwpOworCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9SRUFEWSk7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9XRF9USU1FUl9FWFBJUkVEOgorI2lmIDEKKwkJLyogR2l2ZSB1cCAqLworI2Vsc2UKKwkJLyogVHJ5IHRvIGRpc2NvdmVyIGFueSByZW1vdGUgZGV2aWNlcyAqLwkJCisJCWlyY29tbV90dHlfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgMypIWik7CisJCWlybG1wX2Rpc2NvdmVyeV9yZXF1ZXN0KERJU0NPVkVSWV9ERUZBVUxUX1NMT1RTKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFlfREVUQUNIX0NBQkxFOgorCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9JRExFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgdW5rbm93biBldmVudDogJXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCQkgICBpcmNvbW1fdHR5X2V2ZW50W2V2ZW50XSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3N0YXRlX3F1ZXJ5IChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFF1ZXJ5aW5nIHRoZSByZW1vdGUgTE0tSUFTIGZvciBJckNPTU0gcGFyYW1ldGVycworICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X3N0YXRlX3F1ZXJ5X3BhcmFtZXRlcnMoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsIAorCQkJCQkgICAgIElSQ09NTV9UVFlfRVZFTlQgZXZlbnQsIAorCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCQkgICAgIHN0cnVjdCBpcmNvbW1fdHR5X2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlczogc3RhdGU9JXMsIGV2ZW50PSVzXG4iLCBfX0ZVTkNUSU9OX18gLAorCQkgICBpcmNvbW1fdHR5X3N0YXRlW3NlbGYtPnN0YXRlXSwgaXJjb21tX3R0eV9ldmVudFtldmVudF0pOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSVJDT01NX1RUWV9HT1RfUEFSQU1FVEVSUzoKKwkJaWYgKHNlbGYtPmlyaWFwKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzKCksIGJ1c3kgd2l0aCBhIHByZXZpb3VzIHF1ZXJ5XG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJCisJCXNlbGYtPmlyaWFwID0gaXJpYXBfb3BlbihMU0FQX0FOWSwgSUFTX0NMSUVOVCwgc2VsZiwKKwkJCQkJIGlyY29tbV90dHlfZ2V0dmFsdWVfY29uZmlybSk7CisKKwkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3Qoc2VsZi0+aXJpYXAsIHNlbGYtPnNhZGRyLCAKKwkJCQkJICAgICAgc2VsZi0+ZGFkZHIsICJJckRBOklyQ09NTSIsIAorCQkJCQkgICAgICAiSXJEQTpUaW55VFA6THNhcFNlbCIpOworCisJCWlyY29tbV90dHlfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgMypIWik7CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1FVRVJZX0xTQVBfU0VMKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRZX1dEX1RJTUVSX0VYUElSRUQ6CisJCS8qIEdvIGJhY2sgdG8gc2VhcmNoIG1vZGUgKi8KKwkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfU0VBUkNIKTsKKwkJaXJjb21tX3R0eV9zdGFydF93YXRjaGRvZ190aW1lcihzZWxmLCAzKkhaKTsgCisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9DT05ORUNUX0lORElDQVRJT046CisJCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCQlpcmNvbW1fdHR5X2lhc191bnJlZ2lzdGVyKHNlbGYpOworCisJCS8qIEFjY2VwdCBjb25uZWN0aW9uICovCisJCWlyY29tbV9jb25uZWN0X3Jlc3BvbnNlKHNlbGYtPmlyY29tbSwgTlVMTCk7CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1JFQURZKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRZX0RFVEFDSF9DQUJMRToKKwkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfSURMRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIHVua25vd24gZXZlbnQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18gLAorCQkJICAgaXJjb21tX3R0eV9ldmVudFtldmVudF0pOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9zdGF0ZV9xdWVyeV9sc2FwX3NlbCAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBRdWVyeSByZW1vdGUgTE0tSUFTIGZvciB0aGUgTFNBUCBzZWxlY3RvciB3aGljaCB3ZSBjYW4gY29ubmVjdCB0bworICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X3N0YXRlX3F1ZXJ5X2xzYXBfc2VsKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCAKKwkJCQkJICAgSVJDT01NX1RUWV9FVkVOVCBldmVudCwgCisJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCQkgICBzdHJ1Y3QgaXJjb21tX3R0eV9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXM6IHN0YXRlPSVzLCBldmVudD0lc1xuIiwgX19GVU5DVElPTl9fICwKKwkJICAgaXJjb21tX3R0eV9zdGF0ZVtzZWxmLT5zdGF0ZV0sIGlyY29tbV90dHlfZXZlbnRbZXZlbnRdKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElSQ09NTV9UVFlfR09UX0xTQVBTRUw6CisJCS8qIENvbm5lY3QgdG8gcmVtb3RlIGRldmljZSAqLworCQlyZXQgPSBpcmNvbW1fY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmlyY29tbSwgc2VsZi0+ZGxzYXBfc2VsLAorCQkJCQkgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgCisJCQkJCSAgICAgTlVMTCwgc2VsZi0+c2VydmljZV90eXBlKTsKKwkJaXJjb21tX3R0eV9zdGFydF93YXRjaGRvZ190aW1lcihzZWxmLCAzKkhaKTsKKwkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfU0VUVVApOworCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFlfV0RfVElNRVJfRVhQSVJFRDoKKwkJLyogR28gYmFjayB0byBzZWFyY2ggbW9kZSAqLworCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9TRUFSQ0gpOworCQlpcmNvbW1fdHR5X3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHNlbGYsIDMqSFopOworCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFlfQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKwkJaXJjb21tX3R0eV9pYXNfdW5yZWdpc3RlcihzZWxmKTsKKworCQkvKiBBY2NlcHQgY29ubmVjdGlvbiAqLworCQlpcmNvbW1fY29ubmVjdF9yZXNwb25zZShzZWxmLT5pcmNvbW0sIE5VTEwpOworCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9SRUFEWSk7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9ERVRBQ0hfQ0FCTEU6CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX0lETEUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIGV2ZW50OiAlc1xuIiwgX19GVU5DVElPTl9fICwKKwkJCSAgIGlyY29tbV90dHlfZXZlbnRbZXZlbnRdKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfc3RhdGVfc2V0dXAgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgVHJ5aW5nIHRvIGNvbm5lY3QKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9zdGF0ZV9zZXR1cChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwgCisJCQkJICBJUkNPTU1fVFRZX0VWRU5UIGV2ZW50LCAKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCSAgc3RydWN0IGlyY29tbV90dHlfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzOiBzdGF0ZT0lcywgZXZlbnQ9JXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCSAgIGlyY29tbV90dHlfc3RhdGVbc2VsZi0+c3RhdGVdLCBpcmNvbW1fdHR5X2V2ZW50W2V2ZW50XSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkNPTU1fVFRZX0NPTk5FQ1RfQ09ORklSTToKKwkJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisJCWlyY29tbV90dHlfaWFzX3VucmVnaXN0ZXIoc2VsZik7CisJCQorCQkvKiAKKwkJICogU2VuZCBpbml0aWFsIHBhcmFtZXRlcnMuIFRoaXMgd2lsbCBhbHNvIHNlbmQgb3V0IHF1ZXVlZAorCQkgKiBwYXJhbWV0ZXJzIHdhaXRpbmcgZm9yIHRoZSBjb25uZWN0aW9uIHRvIGNvbWUgdXAgCisJCSAqLworCQlpcmNvbW1fdHR5X3NlbmRfaW5pdGlhbF9wYXJhbWV0ZXJzKHNlbGYpOworCQlpcmNvbW1fdHR5X2xpbmtfZXN0YWJsaXNoZWQoc2VsZik7CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1JFQURZKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRZX0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisJCWlyY29tbV90dHlfaWFzX3VucmVnaXN0ZXIoc2VsZik7CisJCQorCQkvKiBBY2NlcHQgY29ubmVjdGlvbiAqLworCQlpcmNvbW1fY29ubmVjdF9yZXNwb25zZShzZWxmLT5pcmNvbW0sIE5VTEwpOworCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9SRUFEWSk7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9XRF9USU1FUl9FWFBJUkVEOgorCQkvKiBHbyBiYWNrIHRvIHNlYXJjaCBtb2RlICovCisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1NFQVJDSCk7CisJCWlyY29tbV90dHlfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgMypIWik7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9ERVRBQ0hfQ0FCTEU6CisJCS8qIGlyY29tbV9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+aXJjb21tLCBOVUxMKTsgKi8KKwkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfSURMRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIHVua25vd24gZXZlbnQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18gLAorCQkJICAgaXJjb21tX3R0eV9ldmVudFtldmVudF0pOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9zdGF0ZV9yZWFkeSAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBJckNPTU0gaXMgbm93IGNvbm5lY3RlZAorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X3N0YXRlX3JlYWR5KHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCAKKwkJCQkgIElSQ09NTV9UVFlfRVZFTlQgZXZlbnQsIAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCQkJICBzdHJ1Y3QgaXJjb21tX3R0eV9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSVJDT01NX1RUWV9EQVRBX1JFUVVFU1Q6CisJCXJldCA9IGlyY29tbV9kYXRhX3JlcXVlc3Qoc2VsZi0+aXJjb21tLCBza2IpOworCQlicmVhazsJCQorCWNhc2UgSVJDT01NX1RUWV9ERVRBQ0hfQ0FCTEU6CisJCWlyY29tbV9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+aXJjb21tLCBOVUxMKTsKKwkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfSURMRSk7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9ESVNDT05ORUNUX0lORElDQVRJT046CisJCWlyY29tbV90dHlfaWFzX3JlZ2lzdGVyKHNlbGYpOworCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9TRUFSQ0gpOworCQlpcmNvbW1fdHR5X3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHNlbGYsIDMqSFopOworCisJCWlmIChzZWxmLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSB7CisJCQkvKiBEcm9wIGNhcnJpZXIgKi8KKwkJCXNlbGYtPnNldHRpbmdzLmRjZSA9IElSQ09NTV9ERUxUQV9DRDsKKwkJCWlyY29tbV90dHlfY2hlY2tfbW9kZW1fc3RhdHVzKHNlbGYpOworCQl9IGVsc2UgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaGFuZ2luZyB1cCFcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJaWYgKHNlbGYtPnR0eSkKKwkJCQl0dHlfaGFuZ3VwKHNlbGYtPnR0eSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgdW5rbm93biBldmVudDogJXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCQkgICBpcmNvbW1fdHR5X2V2ZW50W2V2ZW50XSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5X2lvY3RsLmMgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eV9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5N2UzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eV9pb2N0bC5jCkBAIC0wLDAgKzEsNDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlyY29tbV90dHlfaW9jdGwuYworICogVmVyc2lvbjogICAgICAgCisgKiBEZXNjcmlwdGlvbjogICAKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFRodSBKdW4gMTAgMTQ6Mzk6MDkgMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgV2VkIEphbiAgNSAxNDo0NTo0MyAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fcGFyYW0uaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fdHR5X2F0dGFjaC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV90dHkuaD4KKworI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2NoYW5nZV9zcGVlZCAoZHJpdmVyKQorICoKKyAqICAgIENoYW5nZSBzcGVlZCBvZiB0aGUgZHJpdmVyLiBJZiB0aGUgcmVtb3RlIGRldmljZSBpcyBhIERDRSwgdGhlbiB0aGlzCisgKiAgICBzaG91bGQgbWFrZSBpdCBjaGFuZ2UgdGhlIHNwZWVkIG9mIGl0cyBzZXJpYWwgcG9ydAorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZikKK3sKKwl1bnNpZ25lZCBjZmxhZywgY3ZhbDsKKwlpbnQgYmF1ZDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaWYgKCFzZWxmLT50dHkgfHwgIXNlbGYtPnR0eS0+dGVybWlvcyB8fCAhc2VsZi0+aXJjb21tKQorCQlyZXR1cm47CisKKwljZmxhZyA9IHNlbGYtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCS8qICBieXRlIHNpemUgYW5kIHBhcml0eSAqLworCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OiBjdmFsID0gSVJDT01NX1dTSVpFXzU7IGJyZWFrOworCWNhc2UgQ1M2OiBjdmFsID0gSVJDT01NX1dTSVpFXzY7IGJyZWFrOworCWNhc2UgQ1M3OiBjdmFsID0gSVJDT01NX1dTSVpFXzc7IGJyZWFrOworCWNhc2UgQ1M4OiBjdmFsID0gSVJDT01NX1dTSVpFXzg7IGJyZWFrOworCWRlZmF1bHQ6ICBjdmFsID0gSVJDT01NX1dTSVpFXzU7IGJyZWFrOworCX0KKwlpZiAoY2ZsYWcgJiBDU1RPUEIpCisJCWN2YWwgfD0gSVJDT01NXzJfU1RPUF9CSVQ7CisJCisJaWYgKGNmbGFnICYgUEFSRU5CKQorCQljdmFsIHw9IElSQ09NTV9QQVJJVFlfRU5BQkxFOworCWlmICghKGNmbGFnICYgUEFST0REKSkKKwkJY3ZhbCB8PSBJUkNPTU1fUEFSSVRZX0VWRU47CisKKwkvKiBEZXRlcm1pbmUgZGl2aXNvciBiYXNlZCBvbiBiYXVkIHJhdGUgKi8KKwliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoc2VsZi0+dHR5KTsKKwlpZiAoIWJhdWQpCisJCWJhdWQgPSA5NjAwOwkvKiBCMCB0cmFuc2l0aW9uIGhhbmRsZWQgaW4gcnNfc2V0X3Rlcm1pb3MgKi8KKworCXNlbGYtPnNldHRpbmdzLmRhdGFfcmF0ZSA9IGJhdWQ7CisJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0RBVEFfUkFURSwgRkFMU0UpOworCQorCS8qIENUUyBmbG93IGNvbnRyb2wgZmxhZyBhbmQgbW9kZW0gc3RhdHVzIGludGVycnVwdHMgKi8KKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCXNlbGYtPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCQlzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2wgfD0gSVJDT01NX1JUU19DVFNfSU47CisJCS8qIFRoaXMgZ290IG1lLiBCdW1tZXIuIEplYW4gSUkgKi8KKwkJaWYgKHNlbGYtPnNlcnZpY2VfdHlwZSA9PSBJUkNPTU1fM19XSVJFX1JBVykKKwkJCUlSREFfV0FSTklORygiJXMoKSwgZW5hYmxpbmcgUlRTL0NUUyBvbiBsaW5rIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0ICgzLXdpcmUtcmF3KVxuIiwgX19GVU5DVElPTl9fKTsKKwl9IGVsc2UgeworCQlzZWxmLT5mbGFncyAmPSB+QVNZTkNfQ1RTX0ZMT1c7CisJCXNlbGYtPnNldHRpbmdzLmZsb3dfY29udHJvbCAmPSB+SVJDT01NX1JUU19DVFNfSU47CisJfQorCWlmIChjZmxhZyAmIENMT0NBTCkKKwkJc2VsZi0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCWVsc2UKKwkJc2VsZi0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisjaWYgMAkKKwkvKgorCSAqIFNldCB1cCBwYXJpdHkgY2hlY2sgZmxhZworCSAqLworCisJaWYgKElfSU5QQ0soc2VsZi0+dHR5KSkKKwkJZHJpdmVyLT5yZWFkX3N0YXR1c19tYXNrIHw9IExTUl9GRSB8IExTUl9QRTsKKwlpZiAoSV9CUktJTlQoZHJpdmVyLT50dHkpIHx8IElfUEFSTVJLKGRyaXZlci0+dHR5KSkKKwkJZHJpdmVyLT5yZWFkX3N0YXR1c19tYXNrIHw9IExTUl9CSTsKKwkKKwkvKgorCSAqIENoYXJhY3RlcnMgdG8gaWdub3JlCisJICovCisJZHJpdmVyLT5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOworCWlmIChJX0lHTlBBUihkcml2ZXItPnR0eSkpCisJCWRyaXZlci0+aWdub3JlX3N0YXR1c19tYXNrIHw9IExTUl9QRSB8IExTUl9GRTsKKworCWlmIChJX0lHTkJSSyhzZWxmLT50dHkpKSB7CisJCXNlbGYtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBMU1JfQkk7CisJCS8qCisJCSAqIElmIHdlJ3JlIGlnbm9yZSBwYXJpdHkgYW5kIGJyZWFrIGluZGljYXRvcnMsIGlnbm9yZSAKKwkJICogb3ZlcnJ1bnMgdG9vLiAoRm9yIHJlYWwgcmF3IHN1cHBvcnQpLgorCQkgKi8KKwkJaWYgKElfSUdOUEFSKHNlbGYtPnR0eSkpIAorCQkJc2VsZi0+aWdub3JlX3N0YXR1c19tYXNrIHw9IExTUl9PRTsKKwl9CisjZW5kaWYKKwlzZWxmLT5zZXR0aW5ncy5kYXRhX2Zvcm1hdCA9IGN2YWw7CisKKwlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fREFUQV9GT1JNQVQsIEZBTFNFKTsKKyAJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0ZMT1dfQ09OVFJPTCwgVFJVRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3NldF90ZXJtaW9zICh0dHksIG9sZF90ZXJtaW9zKQorICoKKyAqICAgIFRoaXMgcm91dGluZSBhbGxvd3MgdGhlIHR0eSBkcml2ZXIgdG8gYmUgbm90aWZpZWQgd2hlbiBkZXZpY2UncworICogICAgdGVybWlvcyBzZXR0aW5ncyBoYXZlIGNoYW5nZWQuICBOb3RlIHRoYXQgYSB3ZWxsLWRlc2lnbmVkIHR0eSBkcml2ZXIKKyAqICAgIHNob3VsZCBiZSBwcmVwYXJlZCB0byBhY2NlcHQgdGhlIGNhc2Ugd2hlcmUgb2xkID09IE5VTEwsIGFuZCB0cnkgdG8KKyAqICAgIGRvIHNvbWV0aGluZyByYXRpb25hbC4KKyAqLwordm9pZCBpcmNvbW1fdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIAorCQkJICAgIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGludCBjZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaWYgKChjZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykgJiYgCisJICAgIChSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpID09IAorCSAgICAgUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpcmNvbW1fdHR5X2NoYW5nZV9zcGVlZChzZWxmKTsKKworCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLworCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYKKwkgICAgIShjZmxhZyAmIENCQVVEKSkgeworCQlzZWxmLT5zZXR0aW5ncy5kdGUgJj0gfihJUkNPTU1fRFRSfElSQ09NTV9SVFMpOworCQlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fRFRFLCBUUlVFKTsKKwl9CisJCisJLyogSGFuZGxlIHRyYW5zaXRpb24gYXdheSBmcm9tIEIwIHN0YXR1cyAqLworCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmCisJICAgIChjZmxhZyAmIENCQVVEKSkgeworCQlzZWxmLT5zZXR0aW5ncy5kdGUgfD0gSVJDT01NX0RUUjsKKwkJaWYgKCEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgfHwgCisJCSAgICAhdGVzdF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpKSB7CisJCQlzZWxmLT5zZXR0aW5ncy5kdGUgfD0gSVJDT01NX1JUUzsKKwkJfQorCQlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fRFRFLCBUUlVFKTsKKwl9CisJCisJLyogSGFuZGxlIHR1cm5pbmcgb2ZmIENSVFNDVFMgKi8KKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKKwkgICAgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgCisJeworCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQlpcmNvbW1fdHR5X3N0YXJ0KHR0eSk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV90aW9jbWdldCAodHR5LCBmaWxlKQorICoKKyAqICAgIAorICoKKyAqLworaW50IGlyY29tbV90dHlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCXJldHVybiAtRUlPOworCisJcmVzdWx0ID0gICgoc2VsZi0+c2V0dGluZ3MuZHRlICYgSVJDT01NX1JUUykgPyBUSU9DTV9SVFMgOiAwKQorCQl8ICgoc2VsZi0+c2V0dGluZ3MuZHRlICYgSVJDT01NX0RUUikgPyBUSU9DTV9EVFIgOiAwKQorCQl8ICgoc2VsZi0+c2V0dGluZ3MuZGNlICYgSVJDT01NX0NEKSAgPyBUSU9DTV9DQVIgOiAwKQorCQl8ICgoc2VsZi0+c2V0dGluZ3MuZGNlICYgSVJDT01NX1JJKSAgPyBUSU9DTV9STkcgOiAwKQorCQl8ICgoc2VsZi0+c2V0dGluZ3MuZGNlICYgSVJDT01NX0RTUikgPyBUSU9DTV9EU1IgOiAwKQorCQl8ICgoc2VsZi0+c2V0dGluZ3MuZGNlICYgSVJDT01NX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV90aW9jbXNldCAodHR5LCBmaWxlLCBzZXQsIGNsZWFyKQorICoKKyAqICAgIAorICoKKyAqLworaW50IGlyY29tbV90dHlfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7IAorCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJcmV0dXJuIC1FSU87CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJc2VsZi0+c2V0dGluZ3MuZHRlIHw9IElSQ09NTV9SVFM7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJc2VsZi0+c2V0dGluZ3MuZHRlIHw9IElSQ09NTV9EVFI7CisKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCXNlbGYtPnNldHRpbmdzLmR0ZSAmPSB+SVJDT01NX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCXNlbGYtPnNldHRpbmdzLmR0ZSAmPSB+SVJDT01NX0RUUjsKKworCWlmICgoc2V0fGNsZWFyKSAmIFRJT0NNX1JUUykKKwkJc2VsZi0+c2V0dGluZ3MuZHRlIHw9IElSQ09NTV9ERUxUQV9SVFM7CisJaWYgKChzZXR8Y2xlYXIpICYgVElPQ01fRFRSKQorCQlzZWxmLT5zZXR0aW5ncy5kdGUgfD0gSVJDT01NX0RFTFRBX0RUUjsKKworCWlyY29tbV9wYXJhbV9yZXF1ZXN0KHNlbGYsIElSQ09NTV9EVEUsIFRSVUUpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gZ2V0X3NlcmlhbF9pbmZvIChkcml2ZXIsIHJldGluZm8pCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHlfZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLAorCQkJCSAgICAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqcmV0aW5mbykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBpbmZvOworICAgCisJaWYgKCFyZXRpbmZvKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCWluZm8ubGluZSA9IHNlbGYtPmxpbmU7CisJaW5mby5mbGFncyA9IHNlbGYtPmZsYWdzOworCWluZm8uYmF1ZF9iYXNlID0gc2VsZi0+c2V0dGluZ3MuZGF0YV9yYXRlOworCWluZm8uY2xvc2VfZGVsYXkgPSBzZWxmLT5jbG9zZV9kZWxheTsKKwlpbmZvLmNsb3Npbmdfd2FpdCA9IHNlbGYtPmNsb3Npbmdfd2FpdDsKKworCS8qIEZvciBjb21wYXRpYmlsaXR5ICAqLworIAlpbmZvLnR5cGUgPSBQT1JUXzE2NTUwQTsKKyAJaW5mby5wb3J0ID0gMDsKKyAJaW5mby5pcnEgPSAwOworCWluZm8ueG1pdF9maWZvX3NpemUgPSAwOworCWluZm8uaHViNiA9IDA7ICAgCisJaW5mby5jdXN0b21fZGl2aXNvciA9IDA7CisKKwlpZiAoY29weV90b191c2VyKHJldGluZm8sICZpbmZvLCBzaXplb2YoKnJldGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNldF9zZXJpYWxfaW5mbyAoZHJpdmVyLCBuZXdfaW5mbykKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9zZXRfc2VyaWFsX2luZm8oc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsCisJCQkJICAgICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpuZXdfaW5mbykKK3sKKyNpZiAwCisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiBvbGRfc3RhdGUsICpzdGF0ZTsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2VyaWFsLG5ld19pbmZvLHNpemVvZihuZXdfc2VyaWFsKSkpCisJCXJldHVybiAtRUZBVUxUOworCisKKwlzdGF0ZSA9IHNlbGYKKwlvbGRfc3RhdGUgPSAqc2VsZjsKKyAgCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWlmICgobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gc3RhdGUtPnNldHRpbmdzLmRhdGFfcmF0ZSkgfHwKKwkJICAgIChuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICE9IHN0YXRlLT5jbG9zZV9kZWxheSkgfHwKKwkJICAgICgobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KKwkJICAgICAoc2VsZi0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXN0YXRlLT5mbGFncyA9ICgoc3RhdGUtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CisJCQkJIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKwkJc2VsZi0+ZmxhZ3MgPSAoKHNlbGYtPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CisJCQkgICAgICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOworCQkvKiBzZWxmLT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7ICovCisJCWdvdG8gY2hlY2tfYW5kX2V4aXQ7CisJfQorCisJLyoKKwkgKiBPSywgcGFzdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRvbmUuCisJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RhcnQgbWFraW5nIGNoYW5nZXMuLi4uLgorCSAqLworCisJaWYgKHNlbGYtPnNldHRpbmdzLmRhdGFfcmF0ZSAhPSBuZXdfc2VyaWFsLmJhdWRfYmFzZSkgeworCQlzZWxmLT5zZXR0aW5ncy5kYXRhX3JhdGUgPSBuZXdfc2VyaWFsLmJhdWRfYmFzZTsKKwkJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0RBVEFfUkFURSwgVFJVRSk7CisJfQorCisJc2VsZi0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogSFovMTAwOworCXNlbGYtPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFovMTAwOworCS8qIHNlbGYtPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsgKi8KKworCXNlbGYtPmZsYWdzID0gKChzZWxmLT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfAorCQkgICAgICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUykpOworCXNlbGYtPnR0eS0+bG93X2xhdGVuY3kgPSAoc2VsZi0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKworIGNoZWNrX2FuZF9leGl0OgorCisJaWYgKHNlbGYtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKwkJaWYgKCgob2xkX3N0YXRlLmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9CisJCSAgICAgKHNlbGYtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spKSB8fAorCQkgICAgKG9sZF9kcml2ZXIuY3VzdG9tX2Rpdmlzb3IgIT0gZHJpdmVyLT5jdXN0b21fZGl2aXNvcikpIHsKKwkJCWlmICgoZHJpdmVyLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJCQkJZHJpdmVyLT50dHktPmFsdF9zcGVlZCA9IDU3NjAwOworCQkJaWYgKChkcml2ZXItPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCisJCQkJZHJpdmVyLT50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKKwkJCWlmICgoZHJpdmVyLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfU0hJKQorCQkJCWRyaXZlci0+dHR5LT5hbHRfc3BlZWQgPSAyMzA0MDA7CisJCQlpZiAoKGRyaXZlci0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1dBUlApCisJCQkJZHJpdmVyLT50dHktPmFsdF9zcGVlZCA9IDQ2MDgwMDsKKwkJCWlyY29tbV90dHlfY2hhbmdlX3NwZWVkKGRyaXZlcik7CisJCX0KKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfaW9jdGwgKHR0eSwgZmlsZSwgY21kLCBhcmcpCisgKgorICogICAgCisgKgorICovCitpbnQgaXJjb21tX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCisJICAgIChjbWQgIT0gVElPQ1NFUkNPTkZJRykgJiYgKGNtZCAhPSBUSU9DU0VSR1NUUlVDVCkgJiYKKwkgICAgKGNtZCAhPSBUSU9DTUlXQUlUKSAmJiAoY21kICE9IFRJT0NHSUNPVU5UKSkgeworCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCisJCSAgICByZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElPQ0dTRVJJQUw6CisJCXJldCA9IGlyY29tbV90dHlfZ2V0X3NlcmlhbF9pbmZvKHNlbGYsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DU1NFUklBTDoKKwkJcmV0ID0gaXJjb21tX3R0eV9zZXRfc2VyaWFsX2luZm8oc2VsZiwgKHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKwljYXNlIFRJT0NNSVdBSVQ6CisJCUlSREFfREVCVUcoMCwgIigpLCBUSU9DTUlXQUlULCBub3QgaW1wbCFcbiIpOworCQlicmVhazsKKworCWNhc2UgVElPQ0dJQ09VTlQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFRJT0NHSUNPVU5UIG5vdCBpbXBsIVxuIiwgX19GVU5DVElPTl9fICk7CisjaWYgMAorCQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJCWNub3cgPSBkcml2ZXItPmljb3VudDsKKwkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXBfY3VzZXIgPSAoc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgX191c2VyICopIGFyZzsKKwkJaWYgKHB1dF91c2VyKGNub3cuY3RzLCAmcF9jdXNlci0+Y3RzKSB8fAorCQkgICAgcHV0X3VzZXIoY25vdy5kc3IsICZwX2N1c2VyLT5kc3IpIHx8CisJCSAgICBwdXRfdXNlcihjbm93LnJuZywgJnBfY3VzZXItPnJuZykgfHwKKwkJICAgIHB1dF91c2VyKGNub3cuZGNkLCAmcF9jdXNlci0+ZGNkKSB8fAorCQkgICAgcHV0X3VzZXIoY25vdy5yeCwgJnBfY3VzZXItPnJ4KSB8fAorCQkgICAgcHV0X3VzZXIoY25vdy50eCwgJnBfY3VzZXItPnR4KSB8fAorCQkgICAgcHV0X3VzZXIoY25vdy5mcmFtZSwgJnBfY3VzZXItPmZyYW1lKSB8fAorCQkgICAgcHV0X3VzZXIoY25vdy5vdmVycnVuLCAmcF9jdXNlci0+b3ZlcnJ1bikgfHwKKwkJICAgIHB1dF91c2VyKGNub3cucGFyaXR5LCAmcF9jdXNlci0+cGFyaXR5KSB8fAorCQkgICAgcHV0X3VzZXIoY25vdy5icmssICZwX2N1c2VyLT5icmspIHx8CisJCSAgICBwdXRfdXNlcihjbm93LmJ1Zl9vdmVycnVuLCAmcF9jdXNlci0+YnVmX292ZXJydW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisjZW5kaWYJCQorCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PSU9DVExDTUQ7ICAvKiBpb2N0bHMgd2hpY2ggd2UgbXVzdCBpZ25vcmUgKi8KKwl9CisJcmV0dXJuIHJldDsKK30KKworCisKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyZGFfZGV2aWNlLmMgYi9uZXQvaXJkYS9pcmRhX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTI5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmRhX2RldmljZS5jCkBAIC0wLDAgKzEsNDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgaXJkYV9kZXZpY2UuYworICogVmVyc2lvbjogICAgICAgMC45CisgKiBEZXNjcmlwdGlvbjogICBVdGlsaXR5IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBkZXZpY2UgZHJpdmVycworICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU2F0IE9jdCAgOSAwOToyMjoyNyAxOTk5CisgKiBNb2RpZmllZCBhdDogICBTdW4gSmFuIDIzIDE3OjQxOjI0IDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisKK3N0YXRpYyB2b2lkIF9faXJkYV90YXNrX2RlbGV0ZShzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKKworc3RhdGljIGhhc2hiaW5fdCAqZG9uZ2xlcyA9IE5VTEw7CitzdGF0aWMgaGFzaGJpbl90ICp0YXNrcyA9IE5VTEw7CisKKyNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRworc3RhdGljIGNvbnN0IGNoYXIgKnRhc2tfc3RhdGVbXSA9IHsKKwkiSVJEQV9UQVNLX0lOSVQiLAorCSJJUkRBX1RBU0tfRE9ORSIsCisJIklSREFfVEFTS19XQUlUIiwKKwkiSVJEQV9UQVNLX1dBSVQxIiwKKwkiSVJEQV9UQVNLX1dBSVQyIiwKKwkiSVJEQV9UQVNLX1dBSVQzIiwKKwkiSVJEQV9UQVNLX0NISUxEX0lOSVQiLAorCSJJUkRBX1RBU0tfQ0hJTERfV0FJVCIsCisJIklSREFfVEFTS19DSElMRF9ET05FIiwKK307CisjZW5kaWYJLyogQ09ORklHX0lSREFfREVCVUcgKi8KKworc3RhdGljIHZvaWQgaXJkYV90YXNrX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSk7CisKK2ludCBfX2luaXQgaXJkYV9kZXZpY2VfaW5pdCggdm9pZCkKK3sKKwlkb25nbGVzID0gaGFzaGJpbl9uZXcoSEJfTk9MT0NLKTsKKwlpZiAoZG9uZ2xlcyA9PSBOVUxMKSB7CisJCUlSREFfV0FSTklORygiSXJEQTogQ2FuJ3QgYWxsb2NhdGUgZG9uZ2xlcyBoYXNoYmluIVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzcGluX2xvY2tfaW5pdCgmZG9uZ2xlcy0+aGJfc3BpbmxvY2spOworCisJdGFza3MgPSBoYXNoYmluX25ldyhIQl9MT0NLKTsKKwlpZiAodGFza3MgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIklyREE6IENhbid0IGFsbG9jYXRlIHRhc2tzIGhhc2hiaW4hXG4iKTsKKwkJaGFzaGJpbl9kZWxldGUoZG9uZ2xlcywgTlVMTCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFdlIG5vIGxvbmdlciBpbml0aWFsaXNlIHRoZSBkcml2ZXIgb3Vyc2VsdmVzIGhlcmUsIHdlIGxldAorCSAqIHRoZSBzeXN0ZW0gZG8gaXQgZm9yIHVzLi4uIC0gSmVhbiBJSSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsZWZ0b3Zlcl9kb25nbGUodm9pZCAqYXJnKQoreworCXN0cnVjdCBkb25nbGVfcmVnICpyZWcgPSBhcmc7CisJSVJEQV9XQVJOSU5HKCJJckRBOiBEb25nbGUgdHlwZSAleCBub3QgdW5yZWdpc3RlcmVkXG4iLAorCQkgICAgIHJlZy0+dHlwZSk7Cit9CisKK3ZvaWQgX19leGl0IGlyZGFfZGV2aWNlX2NsZWFudXAodm9pZCkKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaGFzaGJpbl9kZWxldGUodGFza3MsIChGUkVFX0ZVTkMpIF9faXJkYV90YXNrX2RlbGV0ZSk7CisKKwloYXNoYmluX2RlbGV0ZShkb25nbGVzLCBsZWZ0b3Zlcl9kb25nbGUpOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3kgKHNlbGYsIHN0YXR1cykKKyAqCisgKiAgICBDYWxsZWQgd2hlbiB3ZSBoYXZlIGRldGVjdGVkIHRoYXQgYW5vdGhlciBzdGF0aW9uIGlzIHRyYW5zbWl0dGluZworICogICAgaW4gY29udGVudGlvbiBtb2RlLgorICovCit2b2lkIGlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGF0dXMpCit7CisJc3RydWN0IGlybGFwX2NiICpzZWxmOworCisJSVJEQV9ERUJVRyg0LCAiJXMoJXMpXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyA/ICJUUlVFIiA6ICJGQUxTRSIpOworCisJc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGV2LT5hdGFsa19wdHI7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlpZiAoc3RhdHVzKSB7CisJCXNlbGYtPm1lZGlhX2J1c3kgPSBUUlVFOworCQlpZiAoc3RhdHVzID09IFNNQUxMKQorCQkJaXJsYXBfc3RhcnRfbWJ1c3lfdGltZXIoc2VsZiwgU01BTExCVVNZX1RJTUVPVVQpOworCQllbHNlCisJCQlpcmxhcF9zdGFydF9tYnVzeV90aW1lcihzZWxmLCBNRURJQUJVU1lfVElNRU9VVCk7CisJCUlSREFfREVCVUcoIDQsICJNZWRpYSBidXN5IVxuIik7CisJfSBlbHNlIHsKKwkJc2VsZi0+bWVkaWFfYnVzeSA9IEZBTFNFOworCQlpcmxhcF9zdG9wX21idXN5X3RpbWVyKHNlbGYpOworCX0KK30KK0VYUE9SVF9TWU1CT0woaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3kpOworCisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2RldmljZV9pc19yZWNlaXZpbmcgKGRldikKKyAqCisgKiAgICBDaGVjayBpZiB0aGUgZGV2aWNlIGRyaXZlciBpcyBjdXJyZW50bHkgcmVjZWl2aW5nIGRhdGEKKyAqCisgKi8KK2ludCBpcmRhX2RldmljZV9pc19yZWNlaXZpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWZfaXJkYV9yZXEgcmVxOworCWludCByZXQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKCFkZXYtPmRvX2lvY3RsKSB7CisJCUlSREFfRVJST1IoIiVzOiBkb19pb2N0bCBub3QgaW1wbC4gYnkgZGV2aWNlIGRyaXZlclxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSBkZXYtPmRvX2lvY3RsKGRldiwgKHN0cnVjdCBpZnJlcSAqKSAmcmVxLCBTSU9DR1JFQ0VJVklORyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmVxLmlmcl9yZWNlaXZpbmc7Cit9CisKK3ZvaWQgaXJkYV90YXNrX25leHRfc3RhdGUoc3RydWN0IGlyZGFfdGFzayAqdGFzaywgSVJEQV9UQVNLX1NUQVRFIHN0YXRlKQoreworCUlSREFfREVCVUcoMiwgIiVzKCksIHN0YXRlID0gJXNcbiIsIF9fRlVOQ1RJT05fXywgdGFza19zdGF0ZVtzdGF0ZV0pOworCisJdGFzay0+c3RhdGUgPSBzdGF0ZTsKK30KK0VYUE9SVF9TWU1CT0woaXJkYV90YXNrX25leHRfc3RhdGUpOworCitzdGF0aWMgdm9pZCBfX2lyZGFfdGFza19kZWxldGUoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkZWxfdGltZXIoJnRhc2stPnRpbWVyKTsKKworCWtmcmVlKHRhc2spOworfQorCit2b2lkIGlyZGFfdGFza19kZWxldGUoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwkvKiBVbnJlZ2lzdGVyIHRhc2sgKi8KKwloYXNoYmluX3JlbW92ZSh0YXNrcywgKGxvbmcpIHRhc2ssIE5VTEwpOworCisJX19pcmRhX3Rhc2tfZGVsZXRlKHRhc2spOworfQorRVhQT1JUX1NZTUJPTChpcmRhX3Rhc2tfZGVsZXRlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfdGFza19raWNrICh0YXNrKQorICoKKyAqICAgIFRyaWVzIHRvIGV4ZWN1dGUgYSB0YXNrIHBvc3NpYmxlIG11bHRpcGxlIHRpbWVzIHVudGlsIHRoZSB0YXNrIGlzIGVpdGhlcgorICogICAgZmluaXNoZWQsIG9yIGFza2VzIGZvciBhIHRpbWVvdXQuIFdoZW4gYSB0YXNrIGlzIGZpbmlzaGVkLCB3ZSBkbyBwb3N0CisgKiAgICBwcm9jZXNzaW5nLCBhbmQgbm90aWZ5IHRoZSBwYXJlbnQgdGFzaywgdGhhdCBpcyB3YWl0aW5nIGZvciB0aGlzIHRhc2sKKyAqICAgIHRvIGNvbXBsZXRlLgorICovCitzdGF0aWMgaW50IGlyZGFfdGFza19raWNrKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJaW50IGZpbmlzaGVkID0gVFJVRTsKKwlpbnQgY291bnQgPSAwOworCWludCB0aW1lb3V0OworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHRhc2sgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQodGFzay0+bWFnaWMgPT0gSVJEQV9UQVNLX01BR0lDLCByZXR1cm4gLTE7KTsKKworCS8qIEV4ZWN1dGUgdGFzayB1bnRpbCBpdCdzIGZpbmlzaGVkLCBvciBhc2tlcyBmb3IgYSB0aW1lb3V0ICovCisJZG8geworCQl0aW1lb3V0ID0gdGFzay0+ZnVuY3Rpb24odGFzayk7CisJCWlmIChjb3VudCsrID4gMTAwKSB7CisJCQlJUkRBX0VSUk9SKCIlczogZXJyb3IgaW4gdGFzayBoYW5kbGVyIVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJaXJkYV90YXNrX2RlbGV0ZSh0YXNrKTsKKwkJCXJldHVybiBUUlVFOworCQl9CisJfSB3aGlsZSAoKHRpbWVvdXQgPT0gMCkgJiYgKHRhc2stPnN0YXRlICE9IElSREFfVEFTS19ET05FKSk7CisKKwlpZiAodGltZW91dCA8IDApIHsKKwkJSVJEQV9FUlJPUigiJXM6IEVycm9yIGV4ZWN1dGluZyB0YXNrIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJaXJkYV90YXNrX2RlbGV0ZSh0YXNrKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgYXJlIGZpbmlzaGVkICovCisJaWYgKHRhc2stPnN0YXRlID09IElSREFfVEFTS19ET05FKSB7CisJCWRlbF90aW1lcigmdGFzay0+dGltZXIpOworCisJCS8qIERvIHBvc3QgcHJvY2Vzc2luZyAqLworCQlpZiAodGFzay0+ZmluaXNoZWQpCisJCQl0YXNrLT5maW5pc2hlZCh0YXNrKTsKKworCQkvKiBOb3RpZnkgcGFyZW50ICovCisJCWlmICh0YXNrLT5wYXJlbnQpIHsKKwkJCS8qIENoZWNrIGlmIHBhcmVudCBpcyB3YWl0aW5nIGZvciB1cyB0byBjb21wbGV0ZSAqLworCQkJaWYgKHRhc2stPnBhcmVudC0+c3RhdGUgPT0gSVJEQV9UQVNLX0NISUxEX1dBSVQpIHsKKwkJCQl0YXNrLT5wYXJlbnQtPnN0YXRlID0gSVJEQV9UQVNLX0NISUxEX0RPTkU7CisKKwkJCQkvKiBTdG9wIHRpbWVyIG5vdyB0aGF0IHdlIGFyZSBoZXJlICovCisJCQkJZGVsX3RpbWVyKCZ0YXNrLT5wYXJlbnQtPnRpbWVyKTsKKworCQkJCS8qIEtpY2sgcGFyZW50IHRhc2sgKi8KKwkJCQlpcmRhX3Rhc2tfa2ljayh0YXNrLT5wYXJlbnQpOworCQkJfQorCQl9CisJCWlyZGFfdGFza19kZWxldGUodGFzayk7CisJfSBlbHNlIGlmICh0aW1lb3V0ID4gMCkgeworCQlpcmRhX3N0YXJ0X3RpbWVyKCZ0YXNrLT50aW1lciwgdGltZW91dCwgKHZvaWQgKikgdGFzaywKKwkJCQkgaXJkYV90YXNrX3RpbWVyX2V4cGlyZWQpOworCQlmaW5pc2hlZCA9IEZBTFNFOworCX0gZWxzZSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIG5vdCBmaW5pc2hlZCwgYW5kIG5vIHRpbWVvdXQhXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZmluaXNoZWQgPSBGQUxTRTsKKwl9CisKKwlyZXR1cm4gZmluaXNoZWQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3Rhc2tfZXhlY3V0ZSAoaW5zdGFuY2UsIGZ1bmN0aW9uLCBmaW5pc2hlZCkKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBhbmQgdHJpZXMgdG8gZXhlY3V0ZSB0YXNrcyB0aGF0IG1heSB0YWtlIHNvbWUKKyAqICAgIHRpbWUgdG8gY29tcGxldGUuIFdlIGRvIGl0IHRoaXMgaGFpcnkgd2F5IHNpbmNlIHdlIG1heSBoYXZlIGJlZW4KKyAqICAgIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LCBzbyBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UKKyAqICAgIHNjaGVkdWxlX3RpbWVvdXQoKQorICogVHdvIGltcG9ydGFudCBub3RlcyA6CisgKglvIE1ha2Ugc3VyZSB5b3UgaXJkYV90YXNrX2RlbGV0ZSh0YXNrKTsgaW4gY2FzZSB5b3UgZGVsZXRlIHRoZQorICoJICBjYWxsaW5nIGluc3RhbmNlLgorICoJbyBObyByZWFsIG5lZWQgdG8gbG9jayB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgYnV0IHlvdSBtYXkKKyAqCSAgd2FudCB0byBsb2NrIHdpdGhpbiB0aGUgdGFzayBoYW5kbGVyLgorICogSmVhbiBJSQorICovCitzdHJ1Y3QgaXJkYV90YXNrICppcmRhX3Rhc2tfZXhlY3V0ZSh2b2lkICppbnN0YW5jZSwKKwkJCQkgICAgSVJEQV9UQVNLX0NBTExCQUNLIGZ1bmN0aW9uLAorCQkJCSAgICBJUkRBX1RBU0tfQ0FMTEJBQ0sgZmluaXNoZWQsCisJCQkJICAgIHN0cnVjdCBpcmRhX3Rhc2sgKnBhcmVudCwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGlyZGFfdGFzayAqdGFzazsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwl0YXNrID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlyZGFfdGFzayksIEdGUF9BVE9NSUMpOworCWlmICghdGFzaykKKwkJcmV0dXJuIE5VTEw7CisKKwl0YXNrLT5zdGF0ZSAgICA9IElSREFfVEFTS19JTklUOworCXRhc2stPmluc3RhbmNlID0gaW5zdGFuY2U7CisJdGFzay0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKKwl0YXNrLT5maW5pc2hlZCA9IGZpbmlzaGVkOworCXRhc2stPnBhcmVudCAgID0gcGFyZW50OworCXRhc2stPnBhcmFtICAgID0gcGFyYW07CisJdGFzay0+bWFnaWMgICAgPSBJUkRBX1RBU0tfTUFHSUM7CisKKwlpbml0X3RpbWVyKCZ0YXNrLT50aW1lcik7CisKKwkvKiBSZWdpc3RlciB0YXNrICovCisJaGFzaGJpbl9pbnNlcnQodGFza3MsIChpcmRhX3F1ZXVlX3QgKikgdGFzaywgKGxvbmcpIHRhc2ssIE5VTEwpOworCisJLyogTm8gdGltZSB0byB3YXN0ZSwgc28gbGV0cyBnZXQgZ29pbmchICovCisJcmV0dXJuIGlyZGFfdGFza19raWNrKHRhc2spID8gTlVMTCA6IHRhc2s7Cit9CitFWFBPUlRfU1lNQk9MKGlyZGFfdGFza19leGVjdXRlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfdGFza190aW1lcl9leHBpcmVkIChkYXRhKQorICoKKyAqICAgIFRhc2sgdGltZSBoYXMgZXhwaXJlZC4gV2Ugbm93IHRyeSB0byBleGVjdXRlIHRhc2sgKGFnYWluKSwgYW5kIHJlc3RhcnQKKyAqICAgIHRoZSB0aW1lciBpZiB0aGUgdGFzayBoYXMgbm90IGZpbmlzaGVkIHlldAorICovCitzdGF0aWMgdm9pZCBpcmRhX3Rhc2tfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcmRhX3Rhc2sgKnRhc2s7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJdGFzayA9IChzdHJ1Y3QgaXJkYV90YXNrICopIGRhdGE7CisKKwlpcmRhX3Rhc2tfa2ljayh0YXNrKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZGV2aWNlX3NldHVwIChkZXYpCisgKgorICogICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBieSBsb3cgbGV2ZWwgZGV2aWNlIGRyaXZlcnMgaW4gYSBzaW1pbGFyIHdheQorICogICAgYXMgZXRoZXJfc2V0dXAoKSBpcyB1c2VkIGJ5IG5vcm1hbCBuZXR3b3JrIGRldmljZSBkcml2ZXJzCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfZGV2aWNlX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGRldi0+aGFyZF9oZWFkZXJfbGVuID0gMDsKKyAgICAgICAgZGV2LT5hZGRyX2xlbiAgICAgICAgPSAwOworCisgICAgICAgIGRldi0+dHlwZSAgICAgICAgICAgID0gQVJQSFJEX0lSREE7CisgICAgICAgIGRldi0+dHhfcXVldWVfbGVuICAgID0gODsgLyogV2luZG93IHNpemUgKyAxIHMtZnJhbWUgKi8KKworCW1lbXNldChkZXYtPmJyb2FkY2FzdCwgMHhmZiwgNCk7CisKKwlkZXYtPm10dSA9IDIwNDg7CisJZGV2LT5mbGFncyA9IElGRl9OT0FSUDsKK30KKworLyoKKyAqIEZ1bmNpdG9uICBhbGxvY19pcmRhZGV2IAorICogCUFsbG9jYXRlcyBhbmQgc2V0cyB1cCBhbiBJUkRBIGRldmljZSBpbiBhIG1hbm5lciBzaW1pbGFyIHRvCisgKiAJYWxsb2NfZXRoZXJkZXYuCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19pcmRhZGV2KGludCBzaXplb2ZfcHJpdikKK3sKKwlyZXR1cm4gYWxsb2NfbmV0ZGV2KHNpemVvZl9wcml2LCAiaXJkYSVkIiwgaXJkYV9kZXZpY2Vfc2V0dXApOworfQorRVhQT1JUX1NZTUJPTChhbGxvY19pcmRhZGV2KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZGV2aWNlX2luaXRfZG9uZ2xlIChzZWxmLCB0eXBlLCBxb3MpCisgKgorICogICAgSW5pdGlhbGl6ZSBhdHRhY2hlZCBkb25nbGUuCisgKgorICogSW1wb3J0YW50IDogcmVxdWVzdF9tb2R1bGUgcmVxdWlyZSB1cyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aAorICogYSBwcm9jZXNzIGNvbnRleHQgYW5kIGlycSBlbmFibGVkLiAtIEplYW4gSUkKKyAqLworZG9uZ2xlX3QgKmlyZGFfZGV2aWNlX2RvbmdsZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB0eXBlKQoreworCXN0cnVjdCBkb25nbGVfcmVnICpyZWc7CisJZG9uZ2xlX3QgKmRvbmdsZSA9IE5VTEw7CisKKwltaWdodF9zbGVlcCgpOworCisJc3Bpbl9sb2NrKCZkb25nbGVzLT5oYl9zcGlubG9jayk7CisJcmVnID0gaGFzaGJpbl9maW5kKGRvbmdsZXMsIHR5cGUsIE5VTEwpOworCisjaWZkZWYgQ09ORklHX0tNT0QKKwkvKiBUcnkgdG8gbG9hZCB0aGUgbW9kdWxlIG5lZWRlZCAqLworCWlmICghcmVnICYmIGNhcGFibGUoQ0FQX1NZU19NT0RVTEUpKSB7CisJCXNwaW5fdW5sb2NrKCZkb25nbGVzLT5oYl9zcGlubG9jayk7CisJCisJCXJlcXVlc3RfbW9kdWxlKCJpcmRhLWRvbmdsZS0lZCIsIHR5cGUpOworCQkKKwkJc3Bpbl9sb2NrKCZkb25nbGVzLT5oYl9zcGlubG9jayk7CisJCXJlZyA9IGhhc2hiaW5fZmluZChkb25nbGVzLCB0eXBlLCBOVUxMKTsKKwl9CisjZW5kaWYKKworCWlmICghcmVnIHx8ICF0cnlfbW9kdWxlX2dldChyZWctPm93bmVyKSApIHsKKwkJSVJEQV9FUlJPUigiSXJEQTogVW5hYmxlIHRvIGZpbmQgcmVxdWVzdGVkIGRvbmdsZSB0eXBlICV4XG4iLAorCQkJICAgdHlwZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFsbG9jYXRlIGRvbmdsZSBpbmZvIGZvciB0aGlzIGluc3RhbmNlICovCisJZG9uZ2xlID0ga21hbGxvYyhzaXplb2YoZG9uZ2xlX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRvbmdsZSkKKwkJZ290byBvdXQ7CisKKwltZW1zZXQoZG9uZ2xlLCAwLCBzaXplb2YoZG9uZ2xlX3QpKTsKKworCS8qIEJpbmQgdGhlIHJlZ2lzdHJhdGlvbiBpbmZvIHRvIHRoaXMgcGFydGljdWxhciBpbnN0YW5jZSAqLworCWRvbmdsZS0+aXNzdWUgPSByZWc7CisJZG9uZ2xlLT5kZXYgPSBkZXY7CisKKyBvdXQ6CisJc3Bpbl91bmxvY2soJmRvbmdsZXMtPmhiX3NwaW5sb2NrKTsKKwlyZXR1cm4gZG9uZ2xlOworfQorRVhQT1JUX1NZTUJPTChpcmRhX2RldmljZV9kb25nbGVfaW5pdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2RldmljZV9kb25nbGVfY2xlYW51cCAoZG9uZ2xlKQorICovCitpbnQgaXJkYV9kZXZpY2VfZG9uZ2xlX2NsZWFudXAoZG9uZ2xlX3QgKmRvbmdsZSkKK3sKKwlJUkRBX0FTU0VSVChkb25nbGUgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlkb25nbGUtPmlzc3VlLT5jbG9zZShkb25nbGUpOworCW1vZHVsZV9wdXQoZG9uZ2xlLT5pc3N1ZS0+b3duZXIpOworCWtmcmVlKGRvbmdsZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXJkYV9kZXZpY2VfZG9uZ2xlX2NsZWFudXApOworCisvKgorICogRnVuY3Rpb24gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlIChkb25nbGUpCisgKi8KK2ludCBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUoc3RydWN0IGRvbmdsZV9yZWcgKm5ldykKK3sKKwlzcGluX2xvY2soJmRvbmdsZXMtPmhiX3NwaW5sb2NrKTsKKwkvKiBDaGVjayBpZiB0aGlzIGRvbmdsZSBoYXMgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSAqLworCWlmIChoYXNoYmluX2ZpbmQoZG9uZ2xlcywgbmV3LT50eXBlLCBOVUxMKSkgeworCQlJUkRBX01FU1NBR0UoIiVzOiBEb25nbGUgdHlwZSAleCBhbHJlYWR5IHJlZ2lzdGVyZWRcbiIsIAorCQkJICAgICBfX0ZVTkNUSU9OX18sIG5ldy0+dHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisJCS8qIEluc2VydCBJckRBIGRvbmdsZSBpbnRvIGhhc2hiaW4gKi8KKwkJaGFzaGJpbl9pbnNlcnQoZG9uZ2xlcywgKGlyZGFfcXVldWVfdCAqKSBuZXcsIG5ldy0+dHlwZSwgTlVMTCk7CisJfQorCXNwaW5fdW5sb2NrKCZkb25nbGVzLT5oYl9zcGlubG9jayk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSAoZG9uZ2xlKQorICoKKyAqICAgIFVucmVnaXN0ZXIgZG9uZ2xlLCBhbmQgcmVtb3ZlIGRvbmdsZSBmcm9tIGxpc3Qgb2YgcmVnaXN0ZXJlZCBkb25nbGVzCisgKgorICovCit2b2lkIGlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKHN0cnVjdCBkb25nbGVfcmVnICpkb25nbGUpCit7CisJc3RydWN0IGRvbmdsZSAqbm9kZTsKKworCXNwaW5fbG9jaygmZG9uZ2xlcy0+aGJfc3BpbmxvY2spOworCW5vZGUgPSBoYXNoYmluX3JlbW92ZShkb25nbGVzLCBkb25nbGUtPnR5cGUsIE5VTEwpOworCWlmICghbm9kZSkgCisJCUlSREFfRVJST1IoIiVzOiBkb25nbGUgbm90IGZvdW5kIVxuIiwgX19GVU5DVElPTl9fKTsKKwlzcGluX3VubG9jaygmZG9uZ2xlcy0+aGJfc3BpbmxvY2spOworfQorRVhQT1JUX1NZTUJPTChpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSk7CisKKyNpZmRlZiBDT05GSUdfSVNBCisvKgorICogRnVuY3Rpb24gc2V0dXBfZG1hIChpZGV2LCBidWZmZXIsIGNvdW50LCBtb2RlKQorICoKKyAqICAgIFNldHVwIHRoZSBETUEgY2hhbm5lbC4gQ29tbW9ubHkgdXNlZCBieSBJU0EgRklSIGRyaXZlcnMKKyAqCisgKi8KK3ZvaWQgaXJkYV9zZXR1cF9kbWEoaW50IGNoYW5uZWwsIGRtYV9hZGRyX3QgYnVmZmVyLCBpbnQgY291bnQsIGludCBtb2RlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisKKwlkaXNhYmxlX2RtYShjaGFubmVsKTsKKwljbGVhcl9kbWFfZmYoY2hhbm5lbCk7CisJc2V0X2RtYV9tb2RlKGNoYW5uZWwsIG1vZGUpOworCXNldF9kbWFfYWRkcihjaGFubmVsLCBidWZmZXIpOworCXNldF9kbWFfY291bnQoY2hhbm5lbCwgY291bnQpOworCWVuYWJsZV9kbWEoY2hhbm5lbCk7CisKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woaXJkYV9zZXR1cF9kbWEpOworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmlhcC5jIGIvbmV0L2lyZGEvaXJpYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGJiNzhhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJpYXAuYwpAQCAtMCwwICsxLDEwODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBpcmlhcC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjgKKyAqIERlc2NyaXB0aW9uOiAgIEluZm9ybWF0aW9uIEFjY2VzcyBQcm90b2NvbCAoSUFQKQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgVGh1IEF1ZyAyMSAwMDowMjowNyAxOTk3CisgKiBNb2RpZmllZCBhdDogICBTYXQgRGVjIDI1IDE2OjQyOjQyIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lydHRwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhc19vYmplY3QuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcF9ldmVudC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CisKKyNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRworLyogRklYTUU6IFRoaXMgb25lIHNob3VsZCBnbyBpbiBpcmxtcC5jICovCitzdGF0aWMgY29uc3QgY2hhciAqaWFzX2NoYXJzZXRfdHlwZXNbXSA9IHsKKwkiQ1NfQVNDSUkiLAorCSJDU19JU09fODg1OV8xIiwKKwkiQ1NfSVNPXzg4NTlfMiIsCisJIkNTX0lTT184ODU5XzMiLAorCSJDU19JU09fODg1OV80IiwKKwkiQ1NfSVNPXzg4NTlfNSIsCisJIkNTX0lTT184ODU5XzYiLAorCSJDU19JU09fODg1OV83IiwKKwkiQ1NfSVNPXzg4NTlfOCIsCisJIkNTX0lTT184ODU5XzkiLAorCSJDU19VTklDT0RFIgorfTsKKyNlbmRpZgkvKiBDT05GSUdfSVJEQV9ERUJVRyAqLworCitzdGF0aWMgaGFzaGJpbl90ICppcmlhcCA9IE5VTEw7CitzdGF0aWMgdm9pZCAqc2VydmljZV9oYW5kbGU7CisKK3N0YXRpYyB2b2lkIF9faXJpYXBfY2xvc2Uoc3RydWN0IGlyaWFwX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgaXJpYXBfcmVnaXN0ZXJfbHNhcChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIF9fdTggc2xzYXBfc2VsLCBpbnQgbW9kZSk7CitzdGF0aWMgdm9pZCBpcmlhcF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkJTE1fUkVBU09OIHJlYXNvbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBpcmlhcF9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCBfX3UzMiBtYXhfc2R1X3NpemUsCisJCQkJICAgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKKwkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgaXJpYXBfY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKKwkJCQkgIF9fdTMyIG1heF9zZHVfc2l6ZSwgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJpYXBfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgdm9pZCBpcmlhcF93YXRjaGRvZ190aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpOworCitzdGF0aWMgaW5saW5lIHZvaWQgaXJpYXBfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc3RydWN0IGlyaWFwX2NiICpzZWxmLCAKKwkJCQkJICAgICAgaW50IHRpbWVvdXQpIAoreworCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyLCB0aW1lb3V0LCBzZWxmLCAKKwkJCSBpcmlhcF93YXRjaGRvZ190aW1lcl9leHBpcmVkKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2luaXQgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZXMgdGhlIElySUFQIGxheWVyLCBjYWxsZWQgYnkgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBjb2RlCisgKiAgICBpbiBpcm1vZC5jCisgKi8KK2ludCBfX2luaXQgaXJpYXBfaW5pdCh2b2lkKQoreworCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CisJc3RydWN0IGlyaWFwX2NiICpzZXJ2ZXI7CisJX191OCBvY3Rfc2VxWzZdOworCV9fdTE2IGhpbnRzOworCisJLyogQWxsb2NhdGUgbWFzdGVyIGFycmF5ICovCisJaXJpYXAgPSBoYXNoYmluX25ldyhIQl9MT0NLKTsKKwlpZiAoIWlyaWFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIE9iamVjdCByZXBvc2l0b3J5IC0gZGVmaW5lZCBpbiBpcmlhc19vYmplY3QuYyAqLworCWlyaWFzX29iamVjdHMgPSBoYXNoYmluX25ldyhIQl9MT0NLKTsKKwlpZiAoIWlyaWFzX29iamVjdHMpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogQ2FuJ3QgYWxsb2NhdGUgaXJpYXNfb2JqZWN0cyBoYXNoYmluIVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJaGFzaGJpbl9kZWxldGUoaXJpYXAsIE5VTEwpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqICBSZWdpc3RlciBzb21lIGRlZmF1bHQgc2VydmljZXMgZm9yIElyTE1QCisJICovCisJaGludHMgID0gaXJsbXBfc2VydmljZV90b19oaW50KFNfQ09NUFVURVIpOworCXNlcnZpY2VfaGFuZGxlID0gaXJsbXBfcmVnaXN0ZXJfc2VydmljZShoaW50cyk7CisKKwkvKiBSZWdpc3RlciB0aGUgRGV2aWNlIG9iamVjdCB3aXRoIExNLUlBUyAqLworCW9iaiA9IGlyaWFzX25ld19vYmplY3QoIkRldmljZSIsIElBU19ERVZJQ0VfSUQpOworCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIkRldmljZU5hbWUiLCAiTGludXgiLCBJQVNfS0VSTkVMX0FUVFIpOworCisJb2N0X3NlcVswXSA9IDB4MDE7ICAvKiBWZXJzaW9uIDEgKi8KKwlvY3Rfc2VxWzFdID0gMHgwMDsgIC8qIElBUyBzdXBwb3J0IGJpdHMgKi8KKwlvY3Rfc2VxWzJdID0gMHgwMDsgIC8qIExNLU1VWCBzdXBwb3J0IGJpdHMgKi8KKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQorCW9jdF9zZXFbMl0gfD0gMHgwNDsgLyogQ29ubmVjdGlvbmxlc3MgRGF0YSBzdXBwb3J0ICovCisjZW5kaWYKKwlpcmlhc19hZGRfb2N0c2VxX2F0dHJpYihvYmosICJJckxNUFN1cHBvcnQiLCBvY3Rfc2VxLCAzLAorCQkJCUlBU19LRVJORUxfQVRUUik7CisJaXJpYXNfaW5zZXJ0X29iamVjdChvYmopOworCisJLyoKKwkgKiAgUmVnaXN0ZXIgc2VydmVyIHN1cHBvcnQgd2l0aCBJckxNUCBzbyB3ZSBjYW4gYWNjZXB0IGluY29taW5nCisJICogIGNvbm5lY3Rpb25zCisJICovCisJc2VydmVyID0gaXJpYXBfb3BlbihMU0FQX0lBUywgSUFTX1NFUlZFUiwgTlVMTCwgTlVMTCk7CisJaWYgKCFzZXJ2ZXIpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIG9wZW4gc2VydmVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorCWlyaWFwX3JlZ2lzdGVyX2xzYXAoc2VydmVyLCBMU0FQX0lBUywgSUFTX1NFUlZFUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2NsZWFudXAgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZXMgdGhlIElySUFQIGxheWVyLCBjYWxsZWQgYnkgdGhlIG1vZHVsZSBjbGVhbnVwIGNvZGUgaW4KKyAqICAgIGlybW9kLmMKKyAqLwordm9pZCBfX2V4aXQgaXJpYXBfY2xlYW51cCh2b2lkKQoreworCWlybG1wX3VucmVnaXN0ZXJfc2VydmljZShzZXJ2aWNlX2hhbmRsZSk7CisKKwloYXNoYmluX2RlbGV0ZShpcmlhcCwgKEZSRUVfRlVOQykgX19pcmlhcF9jbG9zZSk7CisJaGFzaGJpbl9kZWxldGUoaXJpYXNfb2JqZWN0cywgKEZSRUVfRlVOQykgX19pcmlhc19kZWxldGVfb2JqZWN0KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX29wZW4gKHZvaWQpCisgKgorICogICAgT3BlbnMgYW4gaW5zdGFuY2Ugb2YgdGhlIElySUFQIGxheWVyLCBhbmQgcmVnaXN0ZXJzIHdpdGggSXJMTVAKKyAqLworc3RydWN0IGlyaWFwX2NiICppcmlhcF9vcGVuKF9fdTggc2xzYXBfc2VsLCBpbnQgbW9kZSwgdm9pZCAqcHJpdiwKKwkJCSAgICBDT05GSVJNX0NBTExCQUNLIGNhbGxiYWNrKQoreworCXN0cnVjdCBpcmlhcF9jYiAqc2VsZjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzZWxmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlyaWFwX2NiKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFzZWxmKSB7CisJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiAgSW5pdGlhbGl6ZSBpbnN0YW5jZQorCSAqLworCW1lbXNldChzZWxmLCAwLCBzaXplb2Yoc3RydWN0IGlyaWFwX2NiKSk7CisKKwlzZWxmLT5tYWdpYyA9IElBU19NQUdJQzsKKwlzZWxmLT5tb2RlID0gbW9kZTsKKwlpZiAobW9kZSA9PSBJQVNfQ0xJRU5UKQorCQlpcmlhcF9yZWdpc3Rlcl9sc2FwKHNlbGYsIHNsc2FwX3NlbCwgbW9kZSk7CisKKwlzZWxmLT5jb25maXJtID0gY2FsbGJhY2s7CisJc2VsZi0+cHJpdiA9IHByaXY7CisKKwkvKiBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdCgpIHdpbGwgY29uc3RydWN0IHBhY2tldHMgYmVmb3JlCisJICogd2UgY29ubmVjdCwgc28gdGhpcyBtdXN0IGhhdmUgYSBzYW5lIHZhbHVlLi4uIEplYW4gSUkgKi8KKwlzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBMTVBfTUFYX0hFQURFUjsKKworCWluaXRfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCWhhc2hiaW5faW5zZXJ0KGlyaWFwLCAoaXJkYV9xdWV1ZV90ICopIHNlbGYsIChsb25nKSBzZWxmLCBOVUxMKTsKKworCS8qIEluaXRpYWxpemUgc3RhdGUgbWFjaGluZXMgKi8KKwlpcmlhcF9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBTX0RJU0NPTk5FQ1QpOworCWlyaWFwX25leHRfY2FsbF9zdGF0ZShzZWxmLCBTX01BS0VfQ0FMTCk7CisJaXJpYXBfbmV4dF9zZXJ2ZXJfc3RhdGUoc2VsZiwgUl9ESVNDT05ORUNUKTsKKwlpcmlhcF9uZXh0X3JfY29ubmVjdF9zdGF0ZShzZWxmLCBSX1dBSVRJTkcpOworCisJcmV0dXJuIHNlbGY7Cit9CitFWFBPUlRfU1lNQk9MKGlyaWFwX29wZW4pOworCisvKgorICogRnVuY3Rpb24gX19pcmlhcF9jbG9zZSAoc2VsZikKKyAqCisgKiAgICBSZW1vdmVzIChkZWFsbG9jYXRlcykgdGhlIElySUFQIGluc3RhbmNlCisgKgorICovCitzdGF0aWMgdm9pZCBfX2lyaWFwX2Nsb3NlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisKKwlpZiAoc2VsZi0+cmVxdWVzdF9za2IpCisJCWRldl9rZnJlZV9za2Ioc2VsZi0+cmVxdWVzdF9za2IpOworCisJc2VsZi0+bWFnaWMgPSAwOworCisJa2ZyZWUoc2VsZik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9jbG9zZSAodm9pZCkKKyAqCisgKiAgICBDbG9zZXMgSXJJQVAgYW5kIGRlcmVnaXN0ZXJzIHdpdGggSXJMTVAKKyAqLwordm9pZCBpcmlhcF9jbG9zZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYpCit7CisJc3RydWN0IGlyaWFwX2NiICplbnRyeTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisKKwlpZiAoc2VsZi0+bHNhcCkgeworCQlpcmxtcF9jbG9zZV9sc2FwKHNlbGYtPmxzYXApOworCQlzZWxmLT5sc2FwID0gTlVMTDsKKwl9CisKKwllbnRyeSA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaGFzaGJpbl9yZW1vdmUoaXJpYXAsIChsb25nKSBzZWxmLCBOVUxMKTsKKwlJUkRBX0FTU0VSVChlbnRyeSA9PSBzZWxmLCByZXR1cm47KTsKKworCV9faXJpYXBfY2xvc2Uoc2VsZik7Cit9CitFWFBPUlRfU1lNQk9MKGlyaWFwX2Nsb3NlKTsKKworc3RhdGljIGludCBpcmlhcF9yZWdpc3Rlcl9sc2FwKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgX191OCBzbHNhcF9zZWwsIGludCBtb2RlKQoreworCW5vdGlmeV90IG5vdGlmeTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpcmRhX25vdGlmeV9pbml0KCZub3RpZnkpOworCW5vdGlmeS5jb25uZWN0X2NvbmZpcm0gICAgICAgPSBpcmlhcF9jb25uZWN0X2NvbmZpcm07CisJbm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbiAgICA9IGlyaWFwX2Nvbm5lY3RfaW5kaWNhdGlvbjsKKwlub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gaXJpYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uOworCW5vdGlmeS5kYXRhX2luZGljYXRpb24gICAgICAgPSBpcmlhcF9kYXRhX2luZGljYXRpb247CisJbm90aWZ5Lmluc3RhbmNlID0gc2VsZjsKKwlpZiAobW9kZSA9PSBJQVNfQ0xJRU5UKQorCQlzdHJjcHkobm90aWZ5Lm5hbWUsICJJcklBUyBjbGkiKTsKKwllbHNlCisJCXN0cmNweShub3RpZnkubmFtZSwgIklySUFTIHNydiIpOworCisJc2VsZi0+bHNhcCA9IGlybG1wX29wZW5fbHNhcChzbHNhcF9zZWwsICZub3RpZnksIDApOworCWlmIChzZWxmLT5sc2FwID09IE5VTEwpIHsKKwkJSVJEQV9FUlJPUigiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZWQgTFNBUCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisJc2VsZi0+c2xzYXBfc2VsID0gc2VsZi0+bHNhcC0+c2xzYXBfc2VsOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9kaXNjb25uZWN0X2luZGljYXRpb24gKGhhbmRsZSwgcmVhc29uKQorICoKKyAqICAgIEdvdCBkaXNjb25uZWN0LCBzbyBjbGVhbiB1cCBldmVyeXRoaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyaWFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCQlMTV9SRUFTT04gcmVhc29uLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmlhcF9jYiAqc2VsZjsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIHJlYXNvbj0lc1xuIiwgX19GVU5DVElPTl9fLCBpcmxtcF9yZWFzb25zW3JlYXNvbl0pOworCisJc2VsZiA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisKKwlJUkRBX0FTU0VSVChpcmlhcCAhPSBOVUxMLCByZXR1cm47KTsKKworCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCisJLyogTm90IG5lZWRlZCAqLworCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCWlmIChzZWxmLT5tb2RlID09IElBU19DTElFTlQpIHsKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgZGlzY29ubmVjdCBhcyBjbGllbnRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKworCQlpcmlhcF9kb19jbGllbnRfZXZlbnQoc2VsZiwgSUFQX0xNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiwKKwkJCQkgICAgICBOVUxMKTsKKwkJLyoKKwkJICogSW5mb3JtIHNlcnZpY2UgdXNlciB0aGF0IHRoZSByZXF1ZXN0IGZhaWxlZCBieSBzZW5kaW5nCisJCSAqIGl0IGEgTlVMTCB2YWx1ZS4gV2FybmluZywgdGhlIGNsaWVudCBtaWdodCBjbG9zZSB1cywgc28KKwkJICogcmVtZW1iZXIgbm8gdG8gdXNlIHNlbGYgYW55bW9yZSBhZnRlciBjYWxsaW5nIGNvbmZpcm0KKwkJICovCisJCWlmIChzZWxmLT5jb25maXJtKQorCQkJc2VsZi0+Y29uZmlybShJQVNfRElTQ09OTkVDVCwgMCwgTlVMTCwgc2VsZi0+cHJpdik7CisJfSBlbHNlIHsKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgZGlzY29ubmVjdCBhcyBzZXJ2ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlyaWFwX2RvX3NlcnZlcl9ldmVudChzZWxmLCBJQVBfTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OLAorCQkJCSAgICAgIE5VTEwpOworCQlpcmlhcF9jbG9zZShzZWxmKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3QgKGhhbmRsZSkKKyAqLworc3RhdGljIHZvaWQgaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCXR4X3NrYiA9IGRldl9hbGxvY19za2IoNjQpOworCWlmICh0eF9za2IgPT0gTlVMTCkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBDb3VsZCBub3QgYWxsb2NhdGUgYW4gc2tfYnVmZiBvZiBsZW5ndGggJWRcbiIsIAorCQkJX19GVU5DVElPTl9fLCA2NCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqICBSZXNlcnZlIHNwYWNlIGZvciBNVVggY29udHJvbCBhbmQgTEFQIGhlYWRlcgorCSAqLworCXNrYl9yZXNlcnZlKHR4X3NrYiwgTE1QX01BWF9IRUFERVIpOworCisJaXJsbXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmxzYXAsIHR4X3NrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3MgKGFkZHIsIG5hbWUsIGF0dHIpCisgKgorICogICAgUmV0cmVpdmUgYWxsIHZhbHVlcyBmcm9tIGF0dHJpYnV0ZSBpbiBhbGwgb2JqZWN0cyB3aXRoIGdpdmVuIGNsYXNzCisgKiAgICBuYW1lCisgKi8KK2ludCBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsCisJCQkJICBfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsCisJCQkJICBjaGFyICpuYW1lLCBjaGFyICphdHRyKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJaW50IG5hbWVfbGVuLCBhdHRyX2xlbiwgc2tiX2xlbjsKKwlfX3U4ICpmcmFtZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm4gLTE7KTsKKworCS8qIENsaWVudCBtdXN0IHN1cHBseSB0aGUgZGVzdGluYXRpb24gZGV2aWNlIGFkZHJlc3MgKi8KKwlpZiAoIWRhZGRyKQorCQlyZXR1cm4gLTE7CisKKwlzZWxmLT5kYWRkciA9IGRhZGRyOworCXNlbGYtPnNhZGRyID0gc2FkZHI7CisKKwkvKgorCSAqICBTYXZlIG9wZXJhdGlvbiwgc28gd2Uga25vdyB3aGF0IHRoZSBsYXRlciBpbmRpY2F0aW9uIGlzIGFib3V0CisJICovCisJc2VsZi0+b3BlcmF0aW9uID0gR0VUX1ZBTFVFX0JZX0NMQVNTOworCisJLyogR2l2ZSBvdXJzZWx2ZXMgMTAgc2VjcyB0byBmaW5pc2ggdGhpcyBvcGVyYXRpb24gKi8KKwlpcmlhcF9zdGFydF93YXRjaGRvZ190aW1lcihzZWxmLCAxMCpIWik7CisKKwluYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsJLyogVXAgdG8gSUFTX01BWF9DTEFTU05BTUUgPSA2MCAqLworCWF0dHJfbGVuID0gc3RybGVuKGF0dHIpOwkvKiBVcCB0byBJQVNfTUFYX0FUVFJJQk5BTUUgPSA2MCAqLworCisJc2tiX2xlbiA9IHNlbGYtPm1heF9oZWFkZXJfc2l6ZSsyK25hbWVfbGVuKzErYXR0cl9sZW4rNDsKKwl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKHNrYl9sZW4pOworCWlmICghdHhfc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIE1VWCBhbmQgTEFQIGhlYWRlciAqLworCXNrYl9yZXNlcnZlKHR4X3NrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKwlza2JfcHV0KHR4X3NrYiwgMytuYW1lX2xlbithdHRyX2xlbik7CisJZnJhbWUgPSB0eF9za2ItPmRhdGE7CisKKwkvKiBCdWlsZCBmcmFtZSAqLworCWZyYW1lWzBdID0gSUFQX0xTVCB8IEdFVF9WQUxVRV9CWV9DTEFTUzsKKwlmcmFtZVsxXSA9IG5hbWVfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zZXJ0IGxlbmd0aCBvZiBuYW1lICovCisJbWVtY3B5KGZyYW1lKzIsIG5hbWUsIG5hbWVfbGVuKTsgICAgICAgICAgIC8qIEluc2VydCBuYW1lICovCisJZnJhbWVbMituYW1lX2xlbl0gPSBhdHRyX2xlbjsgICAgICAgICAgICAgIC8qIEluc2VydCBsZW5ndGggb2YgYXR0ciAqLworCW1lbWNweShmcmFtZSszK25hbWVfbGVuLCBhdHRyLCBhdHRyX2xlbik7ICAvKiBJbnNlcnQgYXR0ciAqLworCisJaXJpYXBfZG9fY2xpZW50X2V2ZW50KHNlbGYsIElBUF9DQUxMX1JFUVVFU1RfR1ZCQywgdHhfc2tiKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIHN0YXRlX3NfZGlzY29ubmVjdCgpLiAqLworCWRldl9rZnJlZV9za2IodHhfc2tiKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfY29uZmlybSAoc2VsZiwgc2tiKQorICoKKyAqICAgIEdvdCByZXN1bHQgZnJvbSBHZXRWYWx1ZUJ5Q2xhc3MgY29tbWFuZC4gUGFyc2UgaXQgYW5kIHJldHVybiByZXN1bHQKKyAqICAgIHRvIHNlcnZpY2UgdXNlci4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyaWFwX2dldHZhbHVlYnljbGFzc19jb25maXJtKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwKKwkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlOworCWludCBjaGFyc2V0OworCV9fdTMyIHZhbHVlX2xlbjsKKwlfX3UzMiB0bXBfY3B1MzI7CisJX191MTYgb2JqX2lkOworCV9fdTE2IGxlbjsKKwlfX3U4ICB0eXBlOworCV9fdTggKmZwOworCWludCBuOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCisJZnAgPSBza2ItPmRhdGE7CisJbiA9IDI7CisKKwkvKiBHZXQgbGVuZ3RoLCBNU0IgZmlyc3QgKi8KKwlsZW4gPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX3UxNiAqKShmcCtuKSkpOyBuICs9IDI7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBsZW49JWRcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKKworCS8qIEdldCBvYmplY3QgSUQsIE1TQiBmaXJzdCAqLworCW9ial9pZCA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fdTE2ICopKGZwK24pKSk7IG4gKz0gMjsKKworCXR5cGUgPSBmcFtuKytdOworCUlSREFfREVCVUcoNCwgIiVzKCksIFZhbHVlIHR5cGUgPSAlZFxuIiwgX19GVU5DVElPTl9fLCB0eXBlKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSUFTX0lOVEVHRVI6CisJCW1lbWNweSgmdG1wX2NwdTMyLCBmcCtuLCA0KTsgbiArPSA0OworCQliZTMyX3RvX2NwdXMoJnRtcF9jcHUzMik7CisJCXZhbHVlID0gaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUodG1wX2NwdTMyKTsKKworCQkvKiAgTGVnYWwgdmFsdWVzIHJlc3RyaWN0ZWQgdG8gMHgwMS0weDZmLCBwYWdlIDE1IGlydHRwICovCisJCUlSREFfREVCVUcoNCwgIiVzKCksIGxzYXA9JWRcbiIsIF9fRlVOQ1RJT05fXywgdmFsdWUtPnQuaW50ZWdlcik7CisJCWJyZWFrOworCWNhc2UgSUFTX1NUUklORzoKKwkJY2hhcnNldCA9IGZwW24rK107CisKKwkJc3dpdGNoIChjaGFyc2V0KSB7CisJCWNhc2UgQ1NfQVNDSUk6CisJCQlicmVhazsKKy8qCQljYXNlIENTX0lTT184ODU5XzE6ICovCisvKgkJY2FzZSBDU19JU09fODg1OV8yOiAqLworLyoJCWNhc2UgQ1NfSVNPXzg4NTlfMzogKi8KKy8qCQljYXNlIENTX0lTT184ODU5XzQ6ICovCisvKgkJY2FzZSBDU19JU09fODg1OV81OiAqLworLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNjogKi8KKy8qCQljYXNlIENTX0lTT184ODU5Xzc6ICovCisvKgkJY2FzZSBDU19JU09fODg1OV84OiAqLworLyoJCWNhc2UgQ1NfSVNPXzg4NTlfOTogKi8KKy8qCQljYXNlIENTX1VOSUNPREU6ICovCisJCWRlZmF1bHQ6CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBjaGFyc2V0ICVzLCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXywgaWFzX2NoYXJzZXRfdHlwZXNbY2hhcnNldF0pOworCisJCQkvKiBBYm9ydGluZywgY2xvc2UgY29ubmVjdGlvbiEgKi8KKwkJCWlyaWFwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmKTsKKwkJCXJldHVybjsKKwkJCS8qIGJyZWFrOyAqLworCQl9CisJCXZhbHVlX2xlbiA9IGZwW24rK107CisJCUlSREFfREVCVUcoNCwgIiVzKCksIHN0cmxlbj0lZFxuIiwgX19GVU5DVElPTl9fLCB2YWx1ZV9sZW4pOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgc3RyaW5nIGlzIG51bGwtdGVybWluYXRlZCAqLworCQlmcFtuK3ZhbHVlX2xlbl0gPSAweDAwOworCQlJUkRBX0RFQlVHKDQsICJHb3Qgc3RyaW5nICVzXG4iLCBmcCtuKTsKKworCQkvKiBXaWxsIHRydW5jYXRlIHRvIElBU19NQVhfU1RSSU5HIGJ5dGVzICovCisJCXZhbHVlID0gaXJpYXNfbmV3X3N0cmluZ192YWx1ZShmcCtuKTsKKwkJYnJlYWs7CisJY2FzZSBJQVNfT0NUX1NFUToKKwkJdmFsdWVfbGVuID0gYmUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX191MTYgKikoZnArbikpKTsKKwkJbiArPSAyOworCisJCS8qIFdpbGwgdHJ1bmNhdGUgdG8gSUFTX01BWF9PQ1RFVF9TVFJJTkcgYnl0ZXMgKi8KKwkJdmFsdWUgPSBpcmlhc19uZXdfb2N0c2VxX3ZhbHVlKGZwK24sIHZhbHVlX2xlbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZhbHVlID0gaXJpYXNfbmV3X21pc3NpbmdfdmFsdWUoKTsKKwkJYnJlYWs7CisJfQorCisJLyogRmluaXNoZWQsIGNsb3NlIGNvbm5lY3Rpb24hICovCisJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOworCisJLyogV2FybmluZywgdGhlIGNsaWVudCBtaWdodCBjbG9zZSB1cywgc28gcmVtZW1iZXIgbm8gdG8gdXNlIHNlbGYKKwkgKiBhbnltb3JlIGFmdGVyIGNhbGxpbmcgY29uZmlybQorCSAqLworCWlmIChzZWxmLT5jb25maXJtKQorCQlzZWxmLT5jb25maXJtKElBU19TVUNDRVNTLCBvYmpfaWQsIHZhbHVlLCBzZWxmLT5wcml2KTsKKwllbHNlIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgbWlzc2luZyBoYW5kbGVyIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJaXJpYXNfZGVsZXRlX3ZhbHVlKHZhbHVlKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2UgKCkKKyAqCisgKiAgICBTZW5kIGFuc3dlciBiYWNrIHRvIHJlbW90ZSBMTS1JQVMKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsCisJCQkJCSAgIF9fdTE2IG9ial9pZCwKKwkJCQkJICAgX191OCByZXRfY29kZSwKKwkJCQkJICAgc3RydWN0IGlhc192YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlpbnQgbjsKKwlfX3UzMiB0bXBfYmUzMiwgdG1wX2JlMTY7CisJX191OCAqZnA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHZhbHVlICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHZhbHVlLT5sZW4gPD0gMTAyNCwgcmV0dXJuOyk7CisKKwkvKiBJbml0aWFsaXplIHZhcmlhYmxlcyAqLworCW4gPSAwOworCisJLyoKKwkgKiAgV2UgbXVzdCBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIHJlc3BvbnNlIGFmdGVyIHRoZSBsZW5ndGggb2YgdGhlCisJICogIHZhbHVlLiBXZSBhZGQgMzIgYnl0ZXMgYmVjYXVzZSBvZiB0aGUgNiBieXRlcyBmb3IgdGhlIGZyYW1lIGFuZAorCSAqICBtYXggNSBieXRlcyBmb3IgdGhlIHZhbHVlIGNvZGluZy4KKwkgKi8KKwl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKHZhbHVlLT5sZW4gKyBzZWxmLT5tYXhfaGVhZGVyX3NpemUgKyAzMik7CisJaWYgKCF0eF9za2IpCisJCXJldHVybjsKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIE1VWCBhbmQgTEFQIGhlYWRlciAqLworCXNrYl9yZXNlcnZlKHR4X3NrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKwlza2JfcHV0KHR4X3NrYiwgNik7CisKKwlmcCA9IHR4X3NrYi0+ZGF0YTsKKworCS8qIEJ1aWxkIGZyYW1lICovCisJZnBbbisrXSA9IEdFVF9WQUxVRV9CWV9DTEFTUyB8IElBUF9MU1Q7CisJZnBbbisrXSA9IHJldF9jb2RlOworCisJLyogSW5zZXJ0IGxpc3QgbGVuZ3RoIChNU0IgZmlyc3QpICovCisJdG1wX2JlMTYgPSBfX2NvbnN0YW50X2h0b25zKDB4MDAwMSk7CisJbWVtY3B5KGZwK24sICZ0bXBfYmUxNiwgMik7ICBuICs9IDI7CisKKwkvKiBJbnNlcnQgb2JqZWN0IGlkZW50aWZpZXIgKCBNU0IgZmlyc3QpICovCisJdG1wX2JlMTYgPSBjcHVfdG9fYmUxNihvYmpfaWQpOworCW1lbWNweShmcCtuLCAmdG1wX2JlMTYsIDIpOyBuICs9IDI7CisKKwlzd2l0Y2ggKHZhbHVlLT50eXBlKSB7CisJY2FzZSBJQVNfU1RSSU5HOgorCQlza2JfcHV0KHR4X3NrYiwgMyArIHZhbHVlLT5sZW4pOworCQlmcFtuKytdID0gdmFsdWUtPnR5cGU7CisJCWZwW24rK10gPSAwOyAvKiBBU0NJSSAqLworCQlmcFtuKytdID0gKF9fdTgpIHZhbHVlLT5sZW47CisJCW1lbWNweShmcCtuLCB2YWx1ZS0+dC5zdHJpbmcsIHZhbHVlLT5sZW4pOyBuKz12YWx1ZS0+bGVuOworCQlicmVhazsKKwljYXNlIElBU19JTlRFR0VSOgorCQlza2JfcHV0KHR4X3NrYiwgNSk7CisJCWZwW24rK10gPSB2YWx1ZS0+dHlwZTsKKworCQl0bXBfYmUzMiA9IGNwdV90b19iZTMyKHZhbHVlLT50LmludGVnZXIpOworCQltZW1jcHkoZnArbiwgJnRtcF9iZTMyLCA0KTsgbiArPSA0OworCQlicmVhazsKKwljYXNlIElBU19PQ1RfU0VROgorCQlza2JfcHV0KHR4X3NrYiwgMyArIHZhbHVlLT5sZW4pOworCQlmcFtuKytdID0gdmFsdWUtPnR5cGU7CisKKwkJdG1wX2JlMTYgPSBjcHVfdG9fYmUxNih2YWx1ZS0+bGVuKTsKKwkJbWVtY3B5KGZwK24sICZ0bXBfYmUxNiwgMik7IG4gKz0gMjsKKwkJbWVtY3B5KGZwK24sIHZhbHVlLT50Lm9jdF9zZXEsIHZhbHVlLT5sZW4pOyBuKz12YWx1ZS0+bGVuOworCQlicmVhazsKKwljYXNlIElBU19NSVNTSU5HOgorCQlJUkRBX0RFQlVHKCAzLCAiJXM6IHNlbmRpbmcgSUFTX01JU1NJTkdcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNrYl9wdXQodHhfc2tiLCAxKTsKKwkJZnBbbisrXSA9IHZhbHVlLT50eXBlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCB0eXBlIG5vdCBpbXBsZW1lbnRlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCX0KKwlpcmlhcF9kb19yX2Nvbm5lY3RfZXZlbnQoc2VsZiwgSUFQX0NBTExfUkVTUE9OU0UsIHR4X3NrYik7CisKKwkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBzdGF0ZV9yX2V4ZWN1dGUoKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHR4X3NrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfaW5kaWNhdGlvbiAoc2VsZiwgc2tiKQorICoKKyAqICAgIGdldHZhbHVlYnljbGFzcyBpcyByZXF1ZXN0ZWQgZnJvbSBwZWVyIExNLUlBUworICoKKyAqLworc3RhdGljIHZvaWQgaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2luZGljYXRpb24oc3RydWN0IGlyaWFwX2NiICpzZWxmLAorCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlhc19vYmplY3QgKm9iajsKKwlzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOworCWludCBuYW1lX2xlbjsKKwlpbnQgYXR0cl9sZW47CisJY2hhciBuYW1lW0lBU19NQVhfQ0xBU1NOQU1FICsgMV07CS8qIDYwIGJ5dGVzICovCisJY2hhciBhdHRyW0lBU19NQVhfQVRUUklCTkFNRSArIDFdOwkvKiA2MCBieXRlcyAqLworCV9fdTggKmZwOworCWludCBuOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlmcCA9IHNrYi0+ZGF0YTsKKwluID0gMTsKKworCW5hbWVfbGVuID0gZnBbbisrXTsKKwltZW1jcHkobmFtZSwgZnArbiwgbmFtZV9sZW4pOyBuKz1uYW1lX2xlbjsKKwluYW1lW25hbWVfbGVuXSA9ICdcMCc7CisKKwlhdHRyX2xlbiA9IGZwW24rK107CisJbWVtY3B5KGF0dHIsIGZwK24sIGF0dHJfbGVuKTsgbis9YXR0cl9sZW47CisJYXR0clthdHRyX2xlbl0gPSAnXDAnOworCisJSVJEQV9ERUJVRyg0LCAiTE0tSUFTOiBMb29raW5nIHVwICVzOiAlc1xuIiwgbmFtZSwgYXR0cik7CisJb2JqID0gaXJpYXNfZmluZF9vYmplY3QobmFtZSk7CisKKwlpZiAob2JqID09IE5VTEwpIHsKKwkJSVJEQV9ERUJVRygyLCAiTE0tSUFTOiBPYmplY3QgJXMgbm90IGZvdW5kXG4iLCBuYW1lKTsKKwkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3Jlc3BvbnNlKHNlbGYsIDB4MTIzNSwgSUFTX0NMQVNTX1VOS05PV04sCisJCQkJCSAgICAgICAmaXJpYXNfbWlzc2luZyk7CisJCXJldHVybjsKKwl9CisJSVJEQV9ERUJVRyg0LCAiTE0tSUFTOiBmb3VuZCAlcywgaWQ9JWRcbiIsIG9iai0+bmFtZSwgb2JqLT5pZCk7CisKKwlhdHRyaWIgPSBpcmlhc19maW5kX2F0dHJpYihvYmosIGF0dHIpOworCWlmIChhdHRyaWIgPT0gTlVMTCkgeworCQlJUkRBX0RFQlVHKDIsICJMTS1JQVM6IEF0dHJpYnV0ZSAlcyBub3QgZm91bmRcbiIsIGF0dHIpOworCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2Uoc2VsZiwgb2JqLT5pZCwKKwkJCQkJICAgICAgIElBU19BVFRSSUJfVU5LTk9XTiwgCisJCQkJCSAgICAgICAmaXJpYXNfbWlzc2luZyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBXZSBoYXZlIGEgbWF0Y2g7IHNlbmQgdGhlIHZhbHVlLiAgKi8KKwlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2Uoc2VsZiwgb2JqLT5pZCwgSUFTX1NVQ0NFU1MsCisJCQkJICAgICAgIGF0dHJpYi0+dmFsdWUpOworCisJcmV0dXJuOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXBfc2VuZF9hY2sgKHZvaWQpCisgKgorICogICAgQ3VycmVudGx5IG5vdCB1c2VkCisgKgorICovCit2b2lkIGlyaWFwX3NlbmRfYWNrKHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCV9fdTggKmZyYW1lOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCXR4X3NrYiA9IGRldl9hbGxvY19za2IoNjQpOworCWlmICghdHhfc2tiKQorCQlyZXR1cm47CisKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciBNVVggYW5kIExBUCBoZWFkZXIgKi8KKwlza2JfcmVzZXJ2ZSh0eF9za2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7CisJc2tiX3B1dCh0eF9za2IsIDEpOworCWZyYW1lID0gdHhfc2tiLT5kYXRhOworCisJLyogQnVpbGQgZnJhbWUgKi8KKwlmcmFtZVswXSA9IElBUF9MU1QgfCBJQVBfQUNLIHwgc2VsZi0+b3BlcmF0aW9uOworCisJaXJsbXBfZGF0YV9yZXF1ZXN0KHNlbGYtPmxzYXAsIHR4X3NrYik7Cit9CisKK3ZvaWQgaXJpYXBfY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKK3sKKwlpbnQgcmV0OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJcmV0ID0gaXJsbXBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmxzYXAsIExTQVBfSUFTLAorCQkJCSAgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsCisJCQkJICAgIE5VTEwsIE5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGNvbm5lY3QgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJc2VsZi0+Y29uZmlybShJQVNfRElTQ09OTkVDVCwgMCwgTlVMTCwgc2VsZi0+cHJpdik7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJpYXBfY29ubmVjdF9jb25maXJtIChoYW5kbGUsIHNrYikKKyAqCisgKiAgICBMU0FQIGNvbm5lY3Rpb24gY29uZmlybWVkIQorICoKKyAqLworc3RhdGljIHZvaWQgaXJpYXBfY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NlZ19zaXplLAorCQkJCSAgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmlhcF9jYiAqc2VsZjsKKworCXNlbGYgPSAoc3RydWN0IGlyaWFwX2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCXNlbGYtPm1heF9kYXRhX3NpemUgPSBtYXhfc2VnX3NpemU7CisJc2VsZi0+bWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplOworCisJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisKKwlpcmlhcF9kb19jbGllbnRfZXZlbnQoc2VsZiwgSUFQX0xNX0NPTk5FQ1RfQ09ORklSTSwgc2tiKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIHN0YXRlX3NfbWFrZV9jYWxsKCkuICovCisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXBfY29ubmVjdF9pbmRpY2F0aW9uICggaGFuZGxlLCBza2IpCisgKgorICogICAgUmVtb3RlIExNLUlBUyBpcyByZXF1ZXN0aW5nIGNvbm5lY3Rpb24KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyaWFwX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZWdfc2l6ZSwKKwkJCQkgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsICpuZXc7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2VsZiA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCBnb3RvIG91dDspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgZ290byBvdXQ7KTsKKworCS8qIFN0YXJ0IG5ldyBzZXJ2ZXIgKi8KKwluZXcgPSBpcmlhcF9vcGVuKExTQVBfSUFTLCBJQVNfU0VSVkVSLCBOVUxMLCBOVUxMKTsKKwlpZiAoIW5ldykgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBvcGVuIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogTm93IGF0dGFjaCB1cCB0aGUgbmV3ICJzb2NrZXQiICovCisJbmV3LT5sc2FwID0gaXJsbXBfZHVwKHNlbGYtPmxzYXAsIG5ldyk7CisJaWYgKCFuZXctPmxzYXApIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZHVwIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKworCW5ldy0+bWF4X2RhdGFfc2l6ZSA9IG1heF9zZWdfc2l6ZTsKKwluZXctPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKKworCS8qIENsZWFuIHVwIHRoZSBvcmlnaW5hbCBvbmUgdG8ga2VlcCBpdCBpbiBsaXN0ZW4gc3RhdGUgKi8KKwlpcmxtcF9saXN0ZW4oc2VsZi0+bHNhcCk7CisKKwlpcmlhcF9kb19zZXJ2ZXJfZXZlbnQobmV3LCBJQVBfTE1fQ09OTkVDVF9JTkRJQ0FUSU9OLCBza2IpOworCitvdXQ6CisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgc3RhdGVfcl9kaXNjb25uZWN0KCkuICovCisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXBfZGF0YV9pbmRpY2F0aW9uIChoYW5kbGUsIHNrYikKKyAqCisgKiAgICBSZWNlaXZlcyBkYXRhIGZyb20gY29ubmVjdGlvbiBpZGVudGlmaWVkIGJ5IGhhbmRsZSBmcm9tIElyTE1QCisgKgorICovCitzdGF0aWMgaW50IGlyaWFwX2RhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmlhcF9jYiAqc2VsZjsKKwlfX3U4ICAqZnJhbWU7CisJX191OCAgb3Bjb2RlOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNlbGYgPSAoc3RydWN0IGlyaWFwX2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAwOyk7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCBnb3RvIG91dDspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgZ290byBvdXQ7KTsKKworCWZyYW1lID0gc2tiLT5kYXRhOworCisJaWYgKHNlbGYtPm1vZGUgPT0gSUFTX1NFUlZFUikgeworCQkvKiBDYWxsIHNlcnZlciAqLworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBDYWxsaW5nIHNlcnZlciFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlyaWFwX2RvX3JfY29ubmVjdF9ldmVudChzZWxmLCBJQVBfUkVDVl9GX0xTVCwgc2tiKTsKKwkJZ290byBvdXQ7CisJfQorCW9wY29kZSA9IGZyYW1lWzBdOworCWlmICh+b3Bjb2RlICYgSUFQX0xTVCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiwgSXJJQVMgbXVsdGlmcmFtZSBjb21tYW5kcyBvciAiCisJCQkgICAgICJyZXN1bHRzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDaGVjayBmb3IgYWNrIGZyYW1lcyBzaW5jZSB0aGV5IGRvbid0IGNvbnRhaW4gYW55IGRhdGEgKi8KKwlpZiAob3Bjb2RlICYgSUFQX0FDSykgeworCQlJUkRBX0RFQlVHKDAsICIlcygpIEdvdCBhY2sgZnJhbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisKKwlvcGNvZGUgJj0gfklBUF9MU1Q7IC8qIE1hc2sgYXdheSBMU1QgYml0ICovCisKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgR0VUX0lORk9fQkFTRToKKwkJSVJEQV9ERUJVRygwLCAiSXJMTVAgR2V0SW5mb0Jhc2VEZXRhaWxzIG5vdCBpbXBsZW1lbnRlZCFcbiIpOworCQlicmVhazsKKwljYXNlIEdFVF9WQUxVRV9CWV9DTEFTUzoKKwkJaXJpYXBfZG9fY2FsbF9ldmVudChzZWxmLCBJQVBfUkVDVl9GX0xTVCwgTlVMTCk7CisKKwkJc3dpdGNoIChmcmFtZVsxXSkgeworCQljYXNlIElBU19TVUNDRVNTOgorCQkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2NvbmZpcm0oc2VsZiwgc2tiKTsKKwkJCWJyZWFrOworCQljYXNlIElBU19DTEFTU19VTktOT1dOOgorCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgTm8gc3VjaCBjbGFzcyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkvKiBGaW5pc2hlZCwgY2xvc2UgY29ubmVjdGlvbiEgKi8KKwkJCWlyaWFwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmKTsKKworCQkJLyoKKwkJCSAqIFdhcm5pbmcsIHRoZSBjbGllbnQgbWlnaHQgY2xvc2UgdXMsIHNvIHJlbWVtYmVyCisJCQkgKiBubyB0byB1c2Ugc2VsZiBhbnltb3JlIGFmdGVyIGNhbGxpbmcgY29uZmlybQorCQkJICovCisJCQlpZiAoc2VsZi0+Y29uZmlybSkKKwkJCQlzZWxmLT5jb25maXJtKElBU19DTEFTU19VTktOT1dOLCAwLCBOVUxMLAorCQkJCQkgICAgICBzZWxmLT5wcml2KTsKKwkJCWJyZWFrOworCQljYXNlIElBU19BVFRSSUJfVU5LTk9XTjoKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIE5vIHN1Y2ggYXR0cmlidXRlIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCS8qIEZpbmlzaGVkLCBjbG9zZSBjb25uZWN0aW9uISAqLworCQkJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOworCisJCQkvKgorCQkJICogV2FybmluZywgdGhlIGNsaWVudCBtaWdodCBjbG9zZSB1cywgc28gcmVtZW1iZXIKKwkJCSAqIG5vIHRvIHVzZSBzZWxmIGFueW1vcmUgYWZ0ZXIgY2FsbGluZyBjb25maXJtCisJCQkgKi8KKwkJCWlmIChzZWxmLT5jb25maXJtKQorCQkJCXNlbGYtPmNvbmZpcm0oSUFTX0FUVFJJQl9VTktOT1dOLCAwLCBOVUxMLAorCQkJCQkgICAgICBzZWxmLT5wcml2KTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gb3AtY29kZTogJTAyeFxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgb3Bjb2RlKTsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJLyogQ2xlYW51cCAtIHN1Yi1jYWxscyB3aWxsIGhhdmUgZG9uZSBza2JfZ2V0KCkgYXMgbmVlZGVkLiAqLworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2NhbGxfaW5kaWNhdGlvbiAoc2VsZiwgc2tiKQorICoKKyAqICAgIFJlY2VpdmVkIGNhbGwgdG8gc2VydmVyIGZyb20gcGVlciBMTS1JQVMKKyAqCisgKi8KK3ZvaWQgaXJpYXBfY2FsbF9pbmRpY2F0aW9uKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3U4ICpmcDsKKwlfX3U4IG9wY29kZTsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCisJZnAgPSBza2ItPmRhdGE7CisKKwlvcGNvZGUgPSBmcFswXTsKKwlpZiAofm9wY29kZSAmIDB4ODApIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogSXJJQVMgbXVsdGlmcmFtZSBjb21tYW5kcyBvciByZXN1bHRzIgorCQkJICAgICAiaXMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJb3Bjb2RlICY9IDB4N2Y7IC8qIE1hc2sgYXdheSBMU1QgYml0ICovCisKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgR0VUX0lORk9fQkFTRToKKwkJSVJEQV9XQVJOSU5HKCIlczogR2V0SW5mb0Jhc2VEZXRhaWxzIG5vdCBpbXBsZW1lbnRlZCB5ZXQhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwljYXNlIEdFVF9WQUxVRV9CWV9DTEFTUzoKKwkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2luZGljYXRpb24oc2VsZiwgc2tiKTsKKwkJYnJlYWs7CisJfQorCS8qIHNrYiB3aWxsIGJlIGNsZWFuZWQgdXAgaW4gaXJpYXBfZGF0YV9pbmRpY2F0aW9uICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF93YXRjaGRvZ190aW1lcl9leHBpcmVkIChkYXRhKQorICoKKyAqICAgIFF1ZXJ5IGhhcyB0YWtlbiB0b28gbG9uZyB0aW1lLCBzbyBhYm9ydAorICoKKyAqLworc3RhdGljIHZvaWQgaXJpYXBfd2F0Y2hkb2dfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcmlhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgZGF0YTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCS8qIGlyaWFwX2Nsb3NlKHNlbGYpOyAqLworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIGNvbnN0IGNoYXIgKmlhc192YWx1ZV90eXBlc1tdID0geworCSJJQVNfTUlTU0lORyIsCisJIklBU19JTlRFR0VSIiwKKwkiSUFTX09DVF9TRVEiLAorCSJJQVNfU1RSSU5HIgorfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWFzX29iamVjdCAqaXJpYXNfc2VxX2lkeChsb2ZmX3QgcG9zKSAKK3sKKwlzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOworCisJZm9yIChvYmogPSAoc3RydWN0IGlhc19vYmplY3QgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJpYXNfb2JqZWN0cyk7CisJICAgICBvYmo7IG9iaiA9IChzdHJ1Y3QgaWFzX29iamVjdCAqKSBoYXNoYmluX2dldF9uZXh0KGlyaWFzX29iamVjdHMpKSB7CisJCWlmIChwb3MtLSA9PSAwKQorCQkJYnJlYWs7CisJfQorCQkKKwlyZXR1cm4gb2JqOworfQorCitzdGF0aWMgdm9pZCAqaXJpYXNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzcGluX2xvY2tfaXJxKCZpcmlhc19vYmplY3RzLT5oYl9zcGlubG9jayk7CisKKwlyZXR1cm4gKnBvcyA/IGlyaWFzX3NlcV9pZHgoKnBvcyAtIDEpIDogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqaXJpYXNfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCSsrKnBvczsKKworCXJldHVybiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIAorCQk/ICh2b2lkICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlyaWFzX29iamVjdHMpCisJCTogKHZvaWQgKikgaGFzaGJpbl9nZXRfbmV4dChpcmlhc19vYmplY3RzKTsKK30KKworc3RhdGljIHZvaWQgaXJpYXNfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3Bpbl91bmxvY2tfaXJxKCZpcmlhc19vYmplY3RzLT5oYl9zcGlubG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaXJpYXNfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHV0cyhzZXEsICJMTS1JQVMgT2JqZWN0czpcbiIpOworCWVsc2UgeworCQlzdHJ1Y3QgaWFzX29iamVjdCAqb2JqID0gdjsKKwkJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKKworCQlJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybiAtRUlOVkFMOyk7CisKKwkJc2VxX3ByaW50ZihzZXEsICJuYW1lOiAlcywgaWQ9JWRcbiIsCisJCQkgICBvYmotPm5hbWUsIG9iai0+aWQpOworCisJCS8qIENhcmVmdWwgZm9yIHByaW9yaXR5IGludmVyc2lvbnMgaGVyZSAhCisJCSAqIEFsbCBvdGhlciB1c2VzIG9mIGF0dHJpYiBzcGlubG9jayBhcmUgaW5kZXBlbmRlbnQgb2YKKwkJICogdGhlIG9iamVjdCBzcGlubG9jaywgc28gd2UgYXJlIHNhZmUuIEplYW4gSUkgKi8KKwkJc3Bpbl9sb2NrKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrKTsKKworCQkvKiBMaXN0IGFsbCBhdHRyaWJ1dGVzIGZvciB0aGlzIG9iamVjdCAqLworCQlmb3IgKGF0dHJpYiA9IChzdHJ1Y3QgaWFzX2F0dHJpYiAqKSBoYXNoYmluX2dldF9maXJzdChvYmotPmF0dHJpYnMpOworCQkgICAgIGF0dHJpYiAhPSBOVUxMOworCQkgICAgIGF0dHJpYiA9IChzdHJ1Y3QgaWFzX2F0dHJpYiAqKSBoYXNoYmluX2dldF9uZXh0KG9iai0+YXR0cmlicykpIHsKKwkJICAgICAKKwkJCUlSREFfQVNTRVJUKGF0dHJpYi0+bWFnaWMgPT0gSUFTX0FUVFJJQl9NQUdJQywKKwkJCQkgICAgZ290byBvdXRsb29wOyApOworCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAtIEF0dHJpYnV0ZSBuYW1lOiBcIiVzXCIsICIsCisJCQkJICAgYXR0cmliLT5uYW1lKTsKKwkJCXNlcV9wcmludGYoc2VxLCAidmFsdWVbJXNdOiAiLAorCQkJCSAgIGlhc192YWx1ZV90eXBlc1thdHRyaWItPnZhbHVlLT50eXBlXSk7CisKKwkJCXN3aXRjaCAoYXR0cmliLT52YWx1ZS0+dHlwZSkgeworCQkJY2FzZSBJQVNfSU5URUdFUjoKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiVkXG4iLAorCQkJCQkgICBhdHRyaWItPnZhbHVlLT50LmludGVnZXIpOworCQkJCWJyZWFrOworCQkJY2FzZSBJQVNfU1RSSU5HOgorCQkJCXNlcV9wcmludGYoc2VxLCAiXCIlc1wiXG4iLAorCQkJCQkgICBhdHRyaWItPnZhbHVlLT50LnN0cmluZyk7CisJCQkJYnJlYWs7CisJCQljYXNlIElBU19PQ1RfU0VROgorCQkJCXNlcV9wcmludGYoc2VxLCAib2N0ZXQgc2VxdWVuY2UgKCVkIGJ5dGVzKVxuIiwgCisJCQkJCSAgIGF0dHJpYi0+dmFsdWUtPmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIElBU19NSVNTSU5HOgorCQkJCXNlcV9wdXRzKHNlcSwgIm1pc3NpbmdcbiIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzZXFfcHJpbnRmKHNlcSwgInR5cGUgJWQ/XG4iLCAKKwkJCQkJICAgYXR0cmliLT52YWx1ZS0+dHlwZSk7CisJCQl9CisJCQlzZXFfcHV0YyhzZXEsICdcbicpOworCisJCX0KKwlJUkRBX0FTU0VSVF9MQUJFTChvdXRsb29wOikKKwkJc3Bpbl91bmxvY2soJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2spOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlyaWFzX3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IGlyaWFzX3NlcV9zdGFydCwKKwkubmV4dCAgID0gaXJpYXNfc2VxX25leHQsCisJLnN0b3AgICA9IGlyaWFzX3NlcV9zdG9wLAorCS5zaG93ICAgPSBpcmlhc19zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgaXJpYXNfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJSVJEQV9BU1NFUlQoIGlyaWFzX29iamVjdHMgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUw7KTsKKworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmaXJpYXNfc2VxX29wcyk7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXJpYXNfc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgICAgICAgICA9IGlyaWFzX3NlcV9vcGVuLAorCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworI2VuZGlmIC8qIFBST0NfRlMgKi8KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyaWFwX2V2ZW50LmMgYi9uZXQvaXJkYS9pcmlhcF9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MzYwNzQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmlhcF9ldmVudC5jCkBAIC0wLDAgKzEsNTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgaXJpYXBfZXZlbnQuYworICogVmVyc2lvbjogICAgICAgMC4xCisgKiBEZXNjcmlwdGlvbjogICBJQVAgRmluaXRlIFN0YXRlIE1hY2hpbmUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFRodSBBdWcgMjEgMDA6MDI6MDcgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgV2VkIE1hciAgMSAxMToyODozNCAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKgorICogICAgIENvcHlyaWdodCAoYykgMTk5NywgMTk5OS0yMDAwIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwX2V2ZW50Lmg+CisKK3N0YXRpYyB2b2lkIHN0YXRlX3NfZGlzY29ubmVjdCAgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBzdGF0ZV9zX2Nvbm5lY3RpbmcgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgc3RhdGVfc19jYWxsICAgICAgICAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RhdGljIHZvaWQgc3RhdGVfc19tYWtlX2NhbGwgICAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHN0YXRlX3NfY2FsbGluZyAgICAgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBzdGF0ZV9zX291dHN0YW5kaW5nICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgc3RhdGVfc19yZXBseWluZyAgICAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHN0YXRlX3Nfd2FpdF9mb3JfY2FsbChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBzdGF0ZV9zX3dhaXRfYWN0aXZlICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgdm9pZCBzdGF0ZV9yX2Rpc2Nvbm5lY3QgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgc3RhdGVfcl9jYWxsICAgICAgICAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHN0YXRlX3Jfd2FpdGluZyAgICAgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBzdGF0ZV9yX3dhaXRfYWN0aXZlICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgc3RhdGVfcl9yZWNlaXZpbmcgICAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHN0YXRlX3JfZXhlY3V0ZSAgICAgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBzdGF0ZV9yX3JldHVybmluZyAgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgdm9pZCAoKmlyaWFwX3N0YXRlW10pKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpID0geworCS8qIENsaWVudCBGU00gKi8KKwlzdGF0ZV9zX2Rpc2Nvbm5lY3QsCisJc3RhdGVfc19jb25uZWN0aW5nLAorCXN0YXRlX3NfY2FsbCwKKworCS8qIFMtQ2FsbCBGU00gKi8KKwlzdGF0ZV9zX21ha2VfY2FsbCwKKwlzdGF0ZV9zX2NhbGxpbmcsCisJc3RhdGVfc19vdXRzdGFuZGluZywKKwlzdGF0ZV9zX3JlcGx5aW5nLAorCXN0YXRlX3Nfd2FpdF9mb3JfY2FsbCwKKwlzdGF0ZV9zX3dhaXRfYWN0aXZlLAorCisJLyogU2VydmVyIEZTTSAqLworCXN0YXRlX3JfZGlzY29ubmVjdCwKKwlzdGF0ZV9yX2NhbGwsCisKKwkvKiBSLUNvbm5lY3QgRlNNICovCisJc3RhdGVfcl93YWl0aW5nLAorCXN0YXRlX3Jfd2FpdF9hY3RpdmUsCisJc3RhdGVfcl9yZWNlaXZpbmcsCisJc3RhdGVfcl9leGVjdXRlLAorCXN0YXRlX3JfcmV0dXJuaW5nLAorfTsKKwordm9pZCBpcmlhcF9uZXh0X2NsaWVudF9zdGF0ZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX1NUQVRFIHN0YXRlKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCXNlbGYtPmNsaWVudF9zdGF0ZSA9IHN0YXRlOworfQorCit2b2lkIGlyaWFwX25leHRfY2FsbF9zdGF0ZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX1NUQVRFIHN0YXRlKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCXNlbGYtPmNhbGxfc3RhdGUgPSBzdGF0ZTsKK30KKwordm9pZCBpcmlhcF9uZXh0X3NlcnZlcl9zdGF0ZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX1NUQVRFIHN0YXRlKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCXNlbGYtPnNlcnZlcl9zdGF0ZSA9IHN0YXRlOworfQorCit2b2lkIGlyaWFwX25leHRfcl9jb25uZWN0X3N0YXRlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfU1RBVEUgc3RhdGUpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJc2VsZi0+cl9jb25uZWN0X3N0YXRlID0gc3RhdGU7Cit9CisKK3ZvaWQgaXJpYXBfZG9fY2xpZW50X2V2ZW50KHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCSgqaXJpYXBfc3RhdGVbIHNlbGYtPmNsaWVudF9zdGF0ZV0pIChzZWxmLCBldmVudCwgc2tiKTsKK30KKwordm9pZCBpcmlhcF9kb19jYWxsX2V2ZW50KHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisKKwkoKmlyaWFwX3N0YXRlWyBzZWxmLT5jYWxsX3N0YXRlXSkgKHNlbGYsIGV2ZW50LCBza2IpOworfQorCit2b2lkIGlyaWFwX2RvX3NlcnZlcl9ldmVudChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisKKwkoKmlyaWFwX3N0YXRlWyBzZWxmLT5zZXJ2ZXJfc3RhdGVdKSAoc2VsZiwgZXZlbnQsIHNrYik7Cit9CisKK3ZvaWQgaXJpYXBfZG9fcl9jb25uZWN0X2V2ZW50KHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCSgqaXJpYXBfc3RhdGVbIHNlbGYtPnJfY29ubmVjdF9zdGF0ZV0pIChzZWxmLCBldmVudCwgc2tiKTsKK30KKworCisvKgorICogRnVuY3Rpb24gc3RhdGVfc19kaXNjb25uZWN0IChldmVudCwgc2tiKQorICoKKyAqICAgIFMtRGlzY29ubmVjdCwgVGhlIGRldmljZSBoYXMgbm8gTFNBUCBjb25uZWN0aW9uIHRvIGEgcGFydGljdWxhcgorICogICAgcmVtb3RlIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgc3RhdGVfc19kaXNjb25uZWN0KHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJQVBfQ0FMTF9SRVFVRVNUX0dWQkM6CisJCWlyaWFwX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIFNfQ09OTkVDVElORyk7CisJCUlSREFfQVNTRVJUKHNlbGYtPnJlcXVlc3Rfc2tiID09IE5VTEwsIHJldHVybjspOworCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgLQorCQkgKiBzZWUgaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3QoKS4gKi8KKwkJc2tiX2dldChza2IpOworCQlzZWxmLT5yZXF1ZXN0X3NrYiA9IHNrYjsKKwkJaXJpYXBfY29ubmVjdF9yZXF1ZXN0KHNlbGYpOworCQlicmVhazsKKwljYXNlIElBUF9MTV9ESVNDT05ORUNUX0lORElDQVRJT046CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXZlbnQpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzdGF0ZV9zX2Nvbm5lY3RpbmcgKHNlbGYsIGV2ZW50LCBza2IpCisgKgorICogICAgUy1Db25uZWN0aW5nCisgKgorICovCitzdGF0aWMgdm9pZCBzdGF0ZV9zX2Nvbm5lY3Rpbmcoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElBUF9MTV9DT05ORUNUX0NPTkZJUk06CisJCS8qCisJCSAqICBKdW1wIHRvIFMtQ2FsbCBGU00KKwkJICovCisJCWlyaWFwX2RvX2NhbGxfZXZlbnQoc2VsZiwgSUFQX0NBTExfUkVRVUVTVCwgc2tiKTsKKwkJLyogaXJpYXBfY2FsbF9yZXF1ZXN0KHNlbGYsIDAsMCwwKTsgKi8KKwkJaXJpYXBfbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgU19DQUxMKTsKKwkJYnJlYWs7CisJY2FzZSBJQVBfTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQkvKiBBYm9ydCBjYWxscyAqLworCQlpcmlhcF9uZXh0X2NhbGxfc3RhdGUoc2VsZiwgU19NQUtFX0NBTEwpOworCQlpcmlhcF9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBTX0RJU0NPTk5FQ1QpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gc3RhdGVfc19jYWxsIChzZWxmLCBldmVudCwgc2tiKQorICoKKyAqICAgIFMtQ2FsbCwgVGhlIGRldmljZSBjYW4gcHJvY2VzcyBjYWxscyB0byBhIHNwZWNpZmljIHJlbW90ZQorICogICAgZGV2aWNlLiBXaGVuZXZlciB0aGUgTFNBUCBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZCwgdGhpcyBzdGF0ZQorICogICAgY2F0Y2hlcyB0aGF0IGV2ZW50IGFuZCBjbGVhcnMgdXAKKyAqLworc3RhdGljIHZvaWQgc3RhdGVfc19jYWxsKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSUFQX0xNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJLyogQWJvcnQgY2FsbHMgKi8KKwkJaXJpYXBfbmV4dF9jYWxsX3N0YXRlKHNlbGYsIFNfTUFLRV9DQUxMKTsKKwkJaXJpYXBfbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgU19ESVNDT05ORUNUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAic3RhdGVfc19jYWxsOiBVbmtub3duIGV2ZW50ICVkXG4iLCBldmVudCk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRlX3NfbWFrZV9jYWxsIChldmVudCwgc2tiKQorICoKKyAqICAgIFMtTWFrZS1DYWxsCisgKgorICovCitzdGF0aWMgdm9pZCBzdGF0ZV9zX21ha2VfY2FsbChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElBUF9DQUxMX1JFUVVFU1Q6CisJCS8qIEFscmVhZHkgcmVmY291bnRlZCAtIHNlZSBzdGF0ZV9zX2Rpc2Nvbm5lY3QoKSAqLworCQl0eF9za2IgPSBzZWxmLT5yZXF1ZXN0X3NrYjsKKwkJc2VsZi0+cmVxdWVzdF9za2IgPSBOVUxMOworCisJCWlybG1wX2RhdGFfcmVxdWVzdChzZWxmLT5sc2FwLCB0eF9za2IpOworCQlpcmlhcF9uZXh0X2NhbGxfc3RhdGUoc2VsZiwgU19PVVRTVEFORElORyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXZlbnQpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzdGF0ZV9zX2NhbGxpbmcgKGV2ZW50LCBza2IpCisgKgorICogICAgUy1DYWxsaW5nCisgKgorICovCitzdGF0aWMgdm9pZCBzdGF0ZV9zX2NhbGxpbmcoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoMCwgIiVzKCksIE5vdCBpbXBsZW1lbnRlZFxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRlX3Nfb3V0c3RhbmRpbmcgKGV2ZW50LCBza2IpCisgKgorICogICAgUy1PdXRzdGFuZGluZywgVGhlIGRldmljZSBpcyB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIHRvIGEgY29tbWFuZAorICoKKyAqLworc3RhdGljIHZvaWQgc3RhdGVfc19vdXRzdGFuZGluZyhzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElBUF9SRUNWX0ZfTFNUOgorCQkvKmlyaWFwX3NlbmRfYWNrKHNlbGYpOyovCisJCS8qTE1fSWRsZV9yZXF1ZXN0KGlkbGUpOyAqLworCisJCWlyaWFwX25leHRfY2FsbF9zdGF0ZShzZWxmLCBTX1dBSVRfRk9SX0NBTEwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gc3RhdGVfc19yZXBseWluZyAoZXZlbnQsIHNrYikKKyAqCisgKiAgICBTLVJlcGx5aW5nLCBUaGUgZGV2aWNlIGlzIGNvbGxlY3RpbmcgYSBtdWx0aXBsZSBwYXJ0IHJlc3BvbnNlCisgKi8KK3N0YXRpYyB2b2lkIHN0YXRlX3NfcmVwbHlpbmcoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDAsICIlcygpLCBOb3QgaW1wbGVtZW50ZWRcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzdGF0ZV9zX3dhaXRfZm9yX2NhbGwgKGV2ZW50LCBza2IpCisgKgorICogICAgUy1XYWl0LWZvci1DYWxsCisgKgorICovCitzdGF0aWMgdm9pZCBzdGF0ZV9zX3dhaXRfZm9yX2NhbGwoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9ERUJVRygwLCAiJXMoKSwgTm90IGltcGxlbWVudGVkXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBzdGF0ZV9zX3dhaXRfYWN0aXZlIChldmVudCwgc2tiKQorICoKKyAqICAgIFMtV2FpdC1BY3RpdmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHN0YXRlX3Nfd2FpdF9hY3RpdmUoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoMCwgIiVzKCksIE5vdCBpbXBsZW1lbnRlZFxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFNlcnZlciBGU00KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBGdW5jdGlvbiBzdGF0ZV9yX2Rpc2Nvbm5lY3QgKHNlbGYsIGV2ZW50LCBza2IpCisgKgorICogICAgTE0tSUFTIHNlcnZlciBpcyBkaXNjb25uZWN0ZWQgKG5vdCBwcm9jZXNzaW5nIGFueSByZXF1ZXN0cyEpCisgKgorICovCitzdGF0aWMgdm9pZCBzdGF0ZV9yX2Rpc2Nvbm5lY3Qoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJQVBfTE1fQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKKwkJaWYgKHR4X3NrYiA9PSBOVUxMKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzOiB1bmFibGUgdG8gbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIFJlc2VydmUgc3BhY2UgZm9yIE1VWF9DT05UUk9MIGFuZCBMQVAgaGVhZGVyICovCisJCXNrYl9yZXNlcnZlKHR4X3NrYiwgTE1QX01BWF9IRUFERVIpOworCisJCWlybG1wX2Nvbm5lY3RfcmVzcG9uc2Uoc2VsZi0+bHNhcCwgdHhfc2tiKTsKKwkJLypMTV9JZGxlX3JlcXVlc3QoaWRsZSk7ICovCisKKwkJaXJpYXBfbmV4dF9zZXJ2ZXJfc3RhdGUoc2VsZiwgUl9DQUxMKTsKKworCQkvKgorCQkgKiAgSnVtcCB0byBSLUNvbm5lY3QgRlNNLCB3ZSBza2lwIFItV2FpdGluZyBzaW5jZSB3ZSBkbyBub3QKKwkJICogIGNhcmUgYWJvdXQgTE1fSWRsZV9yZXF1ZXN0KCkhCisJCSAqLworCQlpcmlhcF9uZXh0X3JfY29ubmVjdF9zdGF0ZShzZWxmLCBSX1JFQ0VJVklORyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXZlbnQpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzdGF0ZV9yX2NhbGwgKHNlbGYsIGV2ZW50LCBza2IpCisgKi8KK3N0YXRpYyB2b2lkIHN0YXRlX3JfY2FsbChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElBUF9MTV9ESVNDT05ORUNUX0lORElDQVRJT046CisJCS8qIEFib3J0IGNhbGwgKi8KKwkJaXJpYXBfbmV4dF9zZXJ2ZXJfc3RhdGUoc2VsZiwgUl9ESVNDT05ORUNUKTsKKwkJaXJpYXBfbmV4dF9yX2Nvbm5lY3Rfc3RhdGUoc2VsZiwgUl9XQUlUSU5HKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5rbm93biBldmVudCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqICBSLUNvbm5lY3QgRlNNCisgKi8KKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRlX3Jfd2FpdGluZyAoc2VsZiwgZXZlbnQsIHNrYikKKyAqLworc3RhdGljIHZvaWQgc3RhdGVfcl93YWl0aW5nKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDAsICIlcygpLCBOb3QgaW1wbGVtZW50ZWRcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXRlX3Jfd2FpdF9hY3RpdmUoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoMCwgIiVzKCksIE5vdCBpbXBsZW1lbnRlZFxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRlX3JfcmVjZWl2aW5nIChzZWxmLCBldmVudCwgc2tiKQorICoKKyAqICAgIFdlIGFyZSByZWNlaXZpbmcgYSBjb21tYW5kCisgKgorICovCitzdGF0aWMgdm9pZCBzdGF0ZV9yX3JlY2VpdmluZyhzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSUFQX1JFQ1ZfRl9MU1Q6CisJCWlyaWFwX25leHRfcl9jb25uZWN0X3N0YXRlKHNlbGYsIFJfRVhFQ1VURSk7CisKKwkJaXJpYXBfY2FsbF9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHVua25vd24gZXZlbnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzdGF0ZV9yX2V4ZWN1dGUgKHNlbGYsIGV2ZW50LCBza2IpCisgKgorICogICAgVGhlIHNlcnZlciBpcyBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0CisgKgorICovCitzdGF0aWMgdm9pZCBzdGF0ZV9yX2V4ZWN1dGUoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSUFQX0NBTExfUkVTUE9OU0U6CisJCS8qCisJCSAqICBTaW5jZSB3ZSBkb24ndCBpbXBsZW1lbnQgdGhlIFdhaXRpbmcgc3RhdGUsIHdlIHJldHVybgorCQkgKiAgdG8gc3RhdGUgUmVjZWl2aW5nIGluc3RlYWQsIERCLgorCQkgKi8KKwkJaXJpYXBfbmV4dF9yX2Nvbm5lY3Rfc3RhdGUoc2VsZiwgUl9SRUNFSVZJTkcpOworCisJCS8qIERvbid0IGZvcmdldCB0byByZWZjb3VudCBpdCAtIHNlZQorCQkgKiBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2UoKS4gKi8KKwkJc2tiX2dldChza2IpOworCisJCWlybG1wX2RhdGFfcmVxdWVzdChzZWxmLT5sc2FwLCBza2IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmtub3duIGV2ZW50IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGF0ZV9yX3JldHVybmluZyhzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDAsICIlcygpLCBldmVudD0lZFxuIiwgX19GVU5DVElPTl9fLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJQVBfUkVDVl9GX0xTVDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJpYXNfb2JqZWN0LmMgYi9uZXQvaXJkYS9pcmlhc19vYmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmVjNDI4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJpYXNfb2JqZWN0LmMKQEAgLTAsMCArMSw1ODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBpcmlhc19vYmplY3QuYworICogVmVyc2lvbjogICAgICAgMC4zCisgKiBEZXNjcmlwdGlvbjogICBJQVMgb2JqZWN0IGRhdGFiYXNlIGFuZCBmdW5jdGlvbnMKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFRodSBPY3QgIDEgMjI6NTA6MDQgMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgV2VkIERlYyAxNSAxMToyMzoxNiAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKgorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CisKK2hhc2hiaW5fdCAqaXJpYXNfb2JqZWN0czsKKworLyoKKyAqICBVc2VkIHdoZW4gYSBtaXNzaW5nIHZhbHVlIG5lZWRzIHRvIGJlIHJldHVybmVkCisgKi8KK3N0cnVjdCBpYXNfdmFsdWUgaXJpYXNfbWlzc2luZyA9IHsgSUFTX01JU1NJTkcsIDAsIDAsIDAsIHswfX07CisKKy8qCisgKiBGdW5jdGlvbiBzdHJuZHVwIChzdHIsIG1heCkKKyAqCisgKiAgICBNeSBvd24ga2VybmVsIHZlcnNpb24gb2Ygc3RybmR1cCEKKyAqCisgKiBGYXN0ZXIsIGNoZWNrIGJvdW5kYXJ5Li4uIEplYW4gSUkKKyAqLworc3RhdGljIGNoYXIgKnN0cm5kdXAoY2hhciAqc3RyLCBpbnQgbWF4KQoreworCWNoYXIgKm5ld19zdHI7CisJaW50IGxlbjsKKworCS8qIENoZWNrIHN0cmluZyAqLworCWlmIChzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJLyogQ2hlY2sgbGVuZ3RoLCB0cnVuY2F0ZSAqLworCWxlbiA9IHN0cmxlbihzdHIpOworCWlmKGxlbiA+IG1heCkKKwkJbGVuID0gbWF4OworCisJLyogQWxsb2NhdGUgbmV3IHN0cmluZyAqLworICAgICAgICBuZXdfc3RyID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgaWYgKG5ld19zdHIgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIENvcHkgYW5kIHRydW5jYXRlICovCisJbWVtY3B5KG5ld19zdHIsIHN0ciwgbGVuKTsKKwluZXdfc3RyW2xlbl0gPSAnXDAnOworCisJcmV0dXJuIG5ld19zdHI7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpYXNfbmV3X29iamVjdCAobmFtZSwgaWQpCisgKgorICogICAgQ3JlYXRlIGEgbmV3IElBUyBvYmplY3QKKyAqCisgKi8KK3N0cnVjdCBpYXNfb2JqZWN0ICppcmlhc19uZXdfb2JqZWN0KCBjaGFyICpuYW1lLCBpbnQgaWQpCit7CisgICAgICAgIHN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CisKKwlJUkRBX0RFQlVHKCA0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCW9iaiA9IChzdHJ1Y3QgaWFzX29iamVjdCAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX29iamVjdCksCisJCQkJCSAgICBHRlBfQVRPTUlDKTsKKwlpZiAob2JqID09IE5VTEwpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBVbmFibGUgdG8gYWxsb2NhdGUgb2JqZWN0IVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChvYmosIDAsIHNpemVvZiggc3RydWN0IGlhc19vYmplY3QpKTsKKworCW9iai0+bWFnaWMgPSBJQVNfT0JKRUNUX01BR0lDOworCW9iai0+bmFtZSA9IHN0cm5kdXAobmFtZSwgSUFTX01BWF9DTEFTU05BTUUpOworCW9iai0+aWQgPSBpZDsKKworCS8qIExvY2tpbmcgbm90ZXMgOiB0aGUgYXR0cmliIHNwaW5sb2NrIGhhcyBsb3dlciBwcmVjZW5kZW5jZQorCSAqIHRoYW4gdGhlIG9iamVjdHMgc3BpbmxvY2suIE5ldmVyIGdyYXAgdGhlIG9iamVjdHMgc3BpbmxvY2sKKwkgKiB3aGlsZSBob2xkaW5nIGFueSBhdHRyaWIgc3BpbmxvY2sgKHJpc2sgb2YgZGVhZGxvY2spLiBKZWFuIElJICovCisJb2JqLT5hdHRyaWJzID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7CisKKwlpZiAob2JqLT5hdHRyaWJzID09IE5VTEwpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlicyFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCWtmcmVlKG9iaik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBvYmo7Cit9CitFWFBPUlRfU1lNQk9MKGlyaWFzX25ld19vYmplY3QpOworCisvKgorICogRnVuY3Rpb24gaXJpYXNfZGVsZXRlX2F0dHJpYiAoYXR0cmliKQorICoKKyAqICAgIERlbGV0ZSBnaXZlbiBhdHRyaWJ1dGUgYW5kIGRlYWxsb2NhdGUgYWxsIGl0cyBtZW1vcnkKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9faXJpYXNfZGVsZXRlX2F0dHJpYihzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliKQoreworCUlSREFfQVNTRVJUKGF0dHJpYiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChhdHRyaWItPm1hZ2ljID09IElBU19BVFRSSUJfTUFHSUMsIHJldHVybjspOworCisJaWYgKGF0dHJpYi0+bmFtZSkKKwkJa2ZyZWUoYXR0cmliLT5uYW1lKTsKKworCWlyaWFzX2RlbGV0ZV92YWx1ZShhdHRyaWItPnZhbHVlKTsKKwlhdHRyaWItPm1hZ2ljID0gfklBU19BVFRSSUJfTUFHSUM7CisKKwlrZnJlZShhdHRyaWIpOworfQorCit2b2lkIF9faXJpYXNfZGVsZXRlX29iamVjdChzdHJ1Y3QgaWFzX29iamVjdCAqb2JqKQoreworCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOworCisJaWYgKG9iai0+bmFtZSkKKwkJa2ZyZWUob2JqLT5uYW1lKTsKKworCWhhc2hiaW5fZGVsZXRlKG9iai0+YXR0cmlicywgKEZSRUVfRlVOQykgX19pcmlhc19kZWxldGVfYXR0cmliKTsKKworCW9iai0+bWFnaWMgPSB+SUFTX09CSkVDVF9NQUdJQzsKKworCWtmcmVlKG9iaik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfb2JqZWN0IChvYmopCisgKgorICogICAgUmVtb3ZlIG9iamVjdCBmcm9tIGhhc2hiaW4gYW5kIGRlYWxsb2NhdGUgYWxsIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoCisgKiAgICB3aXRoIHRoaXMgb2JqZWN0IGFuZCB0aGUgb2JqZWN0IGl0c2VsZgorICoKKyAqLworaW50IGlyaWFzX2RlbGV0ZV9vYmplY3Qoc3RydWN0IGlhc19vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgaWFzX29iamVjdCAqbm9kZTsKKworCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybiAtMTspOworCisJLyogUmVtb3ZlIGZyb20gbGlzdCAqLworCW5vZGUgPSBoYXNoYmluX3JlbW92ZV90aGlzKGlyaWFzX29iamVjdHMsIChpcmRhX3F1ZXVlX3QgKikgb2JqKTsKKwlpZiAoIW5vZGUpCisJCUlSREFfREVCVUcoIDAsICIlcygpLCBvYmplY3QgYWxyZWFkeSByZW1vdmVkIVxuIiwKKwkJCSAgICBfX0ZVTkNUSU9OX18pOworCisJLyogRGVzdHJveSAqLworCV9faXJpYXNfZGVsZXRlX29iamVjdChvYmopOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlyaWFzX2RlbGV0ZV9vYmplY3QpOworCisvKgorICogRnVuY3Rpb24gaXJpYXNfZGVsZXRlX2F0dHJpYiAob2JqKQorICoKKyAqICAgIFJlbW92ZSBhdHRyaWJ1dGUgZnJvbSBoYXNoYmluIGFuZCwgaWYgaXQgd2FzIHRoZSBsYXN0IGF0dHJpYnV0ZSBvZgorICogICAgdGhlIG9iamVjdCwgcmVtb3ZlIHRoZSBvYmplY3QgYXMgd2VsbC4KKyAqCisgKi8KK2ludCBpcmlhc19kZWxldGVfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIHN0cnVjdCBpYXNfYXR0cmliICphdHRyaWIsCisJCQlpbnQgY2xlYW5vYmplY3QpCit7CisJc3RydWN0IGlhc19hdHRyaWIgKm5vZGU7CisKKwlJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChhdHRyaWIgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkvKiBSZW1vdmUgYXR0cmlidXRlIGZyb20gb2JqZWN0ICovCisJbm9kZSA9IGhhc2hiaW5fcmVtb3ZlX3RoaXMob2JqLT5hdHRyaWJzLCAoaXJkYV9xdWV1ZV90ICopIGF0dHJpYik7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gMDsgLyogQWxyZWFkeSByZW1vdmVkIG9yIG5vbi1leGlzdGVudCAqLworCisJLyogRGVhbGxvY2F0ZSBhdHRyaWJ1dGUgKi8KKwlfX2lyaWFzX2RlbGV0ZV9hdHRyaWIobm9kZSk7CisKKwkvKiBDaGVjayBpZiBvYmplY3QgaGFzIHN0aWxsIHNvbWUgYXR0cmlidXRlcywgZGVzdHJveSBpdCBpZiBub25lLgorCSAqIEF0IGZpcnN0IGdsYW5jZSwgdGhpcyBsb29rIGRhbmdlcm91cywgYXMgdGhlIGtlcm5lbCByZWZlcmVuY2UKKwkgKiB2YXJpb3VzIElBUyBvYmplY3RzLiBIb3dldmVyLCB3ZSBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIG9uCisJICogdXNlciBhdHRyaWJ1dGVzLCBub3Qga2VybmVsIGF0dHJpYnV0ZXMsIHNvIHRoZXJlIGlzIG5vIHJpc2sKKwkgKiBvZiBkZWxldGluZyBhIGtlcm5lbCBvYmplY3QgdGhpcyB3YXkuIEplYW4gSUkgKi8KKwlub2RlID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGhhc2hiaW5fZ2V0X2ZpcnN0KG9iai0+YXR0cmlicyk7CisJaWYgKGNsZWFub2JqZWN0ICYmICFub2RlKQorCQlpcmlhc19kZWxldGVfb2JqZWN0KG9iaik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFzX2luc2VydF9vYmplY3QgKG9iaikKKyAqCisgKiAgICBJbnNlcnQgYW4gb2JqZWN0IGludG8gdGhlIExNLUlBUyBkYXRhYmFzZQorICoKKyAqLwordm9pZCBpcmlhc19pbnNlcnRfb2JqZWN0KHN0cnVjdCBpYXNfb2JqZWN0ICpvYmopCit7CisJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CisKKwloYXNoYmluX2luc2VydChpcmlhc19vYmplY3RzLCAoaXJkYV9xdWV1ZV90ICopIG9iaiwgMCwgb2JqLT5uYW1lKTsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXNfaW5zZXJ0X29iamVjdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhc19maW5kX29iamVjdCAobmFtZSkKKyAqCisgKiAgICBGaW5kIG9iamVjdCB3aXRoIGdpdmVuIG5hbWUKKyAqCisgKi8KK3N0cnVjdCBpYXNfb2JqZWN0ICppcmlhc19maW5kX29iamVjdChjaGFyICpuYW1lKQoreworCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKworCS8qIFVuc2FmZSAobG9ja2luZyksIG9iamVjdCBtaWdodCBjaGFuZ2UgKi8KKwlyZXR1cm4gaGFzaGJpbl9sb2NrX2ZpbmQoaXJpYXNfb2JqZWN0cywgMCwgbmFtZSk7Cit9CitFWFBPUlRfU1lNQk9MKGlyaWFzX2ZpbmRfb2JqZWN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFzX2ZpbmRfYXR0cmliIChvYmosIG5hbWUpCisgKgorICogICAgRmluZCBuYW1lZCBhdHRyaWJ1dGUgaW4gb2JqZWN0CisgKgorICovCitzdHJ1Y3QgaWFzX2F0dHJpYiAqaXJpYXNfZmluZF9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOworCisJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKworCWF0dHJpYiA9IGhhc2hiaW5fbG9ja19maW5kKG9iai0+YXR0cmlicywgMCwgbmFtZSk7CisJaWYgKGF0dHJpYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFVuc2FmZSAobG9ja2luZyksIGF0dHJpYiBtaWdodCBjaGFuZ2UgKi8KKwlyZXR1cm4gYXR0cmliOworfQorRVhQT1JUX1NZTUJPTChpcmlhc19maW5kX2F0dHJpYik7CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhc19hZGRfYXR0cmlidXRlIChvYmosIGF0dHJpYikKKyAqCisgKiAgICBBZGQgYXR0cmlidXRlIHRvIG9iamVjdAorICoKKyAqLworc3RhdGljIHZvaWQgaXJpYXNfYWRkX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliLAorCQkJICAgICBpbnQgb3duZXIpCit7CisJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CisKKwlJUkRBX0FTU0VSVChhdHRyaWIgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoYXR0cmliLT5tYWdpYyA9PSBJQVNfQVRUUklCX01BR0lDLCByZXR1cm47KTsKKworCS8qIFNldCBpZiBhdHRyaWIgaXMgb3duZWQgYnkga2VybmVsIG9yIHVzZXIgc3BhY2UgKi8KKwlhdHRyaWItPnZhbHVlLT5vd25lciA9IG93bmVyOworCisJaGFzaGJpbl9pbnNlcnQob2JqLT5hdHRyaWJzLCAoaXJkYV9xdWV1ZV90ICopIGF0dHJpYiwgMCwgYXR0cmliLT5uYW1lKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlIChvYmpfbmFtZSwgYXR0cmliX25hbWUsIG5ld192YWx1ZSkKKyAqCisgKiAgICBDaGFuZ2UgdGhlIHZhbHVlIG9mIGFuIG9iamVjdHMgYXR0cmlidXRlLgorICoKKyAqLworaW50IGlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlKGNoYXIgKm9ial9uYW1lLCBjaGFyICphdHRyaWJfbmFtZSwKKwkJCQkgIHN0cnVjdCBpYXNfdmFsdWUgKm5ld192YWx1ZSkKK3sKKwlzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOworCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIEZpbmQgb2JqZWN0ICovCisJb2JqID0gaGFzaGJpbl9sb2NrX2ZpbmQoaXJpYXNfb2JqZWN0cywgMCwgb2JqX25hbWUpOworCWlmIChvYmogPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gZmluZCBvYmplY3Q6ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgIG9ial9uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFNsaWdodGx5IHVuc2FmZSAob2JqIG1pZ2h0IGdldCByZW1vdmVkIHVuZGVyIHVzKSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBGaW5kIGF0dHJpYnV0ZSAqLworCWF0dHJpYiA9IGhhc2hiaW5fZmluZChvYmotPmF0dHJpYnMsIDAsIGF0dHJpYl9uYW1lKTsKKwlpZiAoYXR0cmliID09IE5VTEwpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGZpbmQgYXR0cmlidXRlOiAlc1xuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBhdHRyaWJfbmFtZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICggYXR0cmliLT52YWx1ZS0+dHlwZSAhPSBuZXdfdmFsdWUtPnR5cGUpIHsKKwkJSVJEQV9ERUJVRyggMCwgIiVzKCksIGNoYW5naW5nIHZhbHVlIHR5cGUgbm90IGFsbG93ZWQhXG4iLAorCQkJICAgIF9fRlVOQ1RJT05fXyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIERlbGV0ZSBvbGQgdmFsdWUgKi8KKwlpcmlhc19kZWxldGVfdmFsdWUoYXR0cmliLT52YWx1ZSk7CisKKwkvKiBJbnNlcnQgbmV3IHZhbHVlICovCisJYXR0cmliLT52YWx1ZSA9IG5ld192YWx1ZTsKKworCS8qIFN1Y2Nlc3MgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFzX29iamVjdF9hZGRfaW50ZWdlcl9hdHRyaWIgKG9iaiwgbmFtZSwgdmFsdWUpCisgKgorICogICAgQWRkIGFuIGludGVnZXIgYXR0cmlidXRlIHRvIGFuIExNLUlBUyBvYmplY3QKKyAqCisgKi8KK3ZvaWQgaXJpYXNfYWRkX2ludGVnZXJfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUsIGludCB2YWx1ZSwKKwkJCSAgICAgIGludCBvd25lcikKK3sKKwlzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOworCisJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm47KTsKKworCWF0dHJpYiA9IChzdHJ1Y3QgaWFzX2F0dHJpYiAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX2F0dHJpYiksCisJCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKKwlpZiAoYXR0cmliID09IE5VTEwpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KGF0dHJpYiwgMCwgc2l6ZW9mKCBzdHJ1Y3QgaWFzX2F0dHJpYikpOworCisJYXR0cmliLT5tYWdpYyA9IElBU19BVFRSSUJfTUFHSUM7CisJYXR0cmliLT5uYW1lID0gc3RybmR1cChuYW1lLCBJQVNfTUFYX0FUVFJJQk5BTUUpOworCisJLyogSW5zZXJ0IHZhbHVlICovCisJYXR0cmliLT52YWx1ZSA9IGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKHZhbHVlKTsKKworCWlyaWFzX2FkZF9hdHRyaWIob2JqLCBhdHRyaWIsIG93bmVyKTsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXNfYWRkX2ludGVnZXJfYXR0cmliKTsKKworIC8qCisgKiBGdW5jdGlvbiBpcmlhc19hZGRfb2N0c2VxX2F0dHJpYiAob2JqLCBuYW1lLCBvY3RldF9zZXEsIGxlbikKKyAqCisgKiAgICBBZGQgYSBvY3RldCBzZXF1ZW5jZSBhdHRyaWJ1dGUgdG8gYW4gTE0tSUFTIG9iamVjdAorICoKKyAqLworCit2b2lkIGlyaWFzX2FkZF9vY3RzZXFfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUsIF9fdTggKm9jdGV0cywKKwkJCSAgICAgaW50IGxlbiwgaW50IG93bmVyKQoreworCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CisKKwlJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKKworCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQob2N0ZXRzICE9IE5VTEwsIHJldHVybjspOworCisJYXR0cmliID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfYXR0cmliKSwKKwkJCQkJICAgICAgIEdGUF9BVE9NSUMpOworCWlmIChhdHRyaWIgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlidXRlIVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQoYXR0cmliLCAwLCBzaXplb2YoIHN0cnVjdCBpYXNfYXR0cmliKSk7CisKKwlhdHRyaWItPm1hZ2ljID0gSUFTX0FUVFJJQl9NQUdJQzsKKwlhdHRyaWItPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQVRUUklCTkFNRSk7CisKKwlhdHRyaWItPnZhbHVlID0gaXJpYXNfbmV3X29jdHNlcV92YWx1ZSggb2N0ZXRzLCBsZW4pOworCisJaXJpYXNfYWRkX2F0dHJpYihvYmosIGF0dHJpYiwgb3duZXIpOworfQorRVhQT1JUX1NZTUJPTChpcmlhc19hZGRfb2N0c2VxX2F0dHJpYik7CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhc19vYmplY3RfYWRkX3N0cmluZ19hdHRyaWIgKG9iaiwgc3RyaW5nKQorICoKKyAqICAgIEFkZCBhIHN0cmluZyBhdHRyaWJ1dGUgdG8gYW4gTE0tSUFTIG9iamVjdAorICoKKyAqLwordm9pZCBpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSwKKwkJCSAgICAgaW50IG93bmVyKQoreworCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CisKKwlJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKKworCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQodmFsdWUgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlhdHRyaWIgPSAoc3RydWN0IGlhc19hdHRyaWIgKikga21hbGxvYyhzaXplb2YoIHN0cnVjdCBpYXNfYXR0cmliKSwKKwkJCQkJICAgICAgIEdGUF9BVE9NSUMpOworCWlmIChhdHRyaWIgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlidXRlIVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQoYXR0cmliLCAwLCBzaXplb2YoIHN0cnVjdCBpYXNfYXR0cmliKSk7CisKKwlhdHRyaWItPm1hZ2ljID0gSUFTX0FUVFJJQl9NQUdJQzsKKwlhdHRyaWItPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQVRUUklCTkFNRSk7CisKKwlhdHRyaWItPnZhbHVlID0gaXJpYXNfbmV3X3N0cmluZ192YWx1ZSh2YWx1ZSk7CisKKwlpcmlhc19hZGRfYXR0cmliKG9iaiwgYXR0cmliLCBvd25lcik7Cit9CitFWFBPUlRfU1lNQk9MKGlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlIChpbnRlZ2VyKQorICoKKyAqICAgIENyZWF0ZSBuZXcgSUFTIGludGVnZXIgdmFsdWUKKyAqCisgKi8KK3N0cnVjdCBpYXNfdmFsdWUgKmlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKGludCBpbnRlZ2VyKQoreworCXN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlOworCisJdmFsdWUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSwgR0ZQX0FUT01JQyk7CisJaWYgKHZhbHVlID09IE5VTEwpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KHZhbHVlLCAwLCBzaXplb2Yoc3RydWN0IGlhc192YWx1ZSkpOworCisJdmFsdWUtPnR5cGUgPSBJQVNfSU5URUdFUjsKKwl2YWx1ZS0+bGVuID0gNDsKKwl2YWx1ZS0+dC5pbnRlZ2VyID0gaW50ZWdlcjsKKworCXJldHVybiB2YWx1ZTsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUpOworCisvKgorICogRnVuY3Rpb24gaXJpYXNfbmV3X3N0cmluZ192YWx1ZSAoc3RyaW5nKQorICoKKyAqICAgIENyZWF0ZSBuZXcgSUFTIHN0cmluZyB2YWx1ZQorICoKKyAqIFBlciBJckxNUCAxLjEsIDQuMy4zLjIsIHN0cmluZ3MgYXJlIHVwIHRvIDI1NiBjaGFycyAtIEplYW4gSUkKKyAqLworc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X3N0cmluZ192YWx1ZShjaGFyICpzdHJpbmcpCit7CisJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CisKKwl2YWx1ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpLCBHRlBfQVRPTUlDKTsKKwlpZiAodmFsdWUgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoIHZhbHVlLCAwLCBzaXplb2YoIHN0cnVjdCBpYXNfdmFsdWUpKTsKKworCXZhbHVlLT50eXBlID0gSUFTX1NUUklORzsKKwl2YWx1ZS0+Y2hhcnNldCA9IENTX0FTQ0lJOworCXZhbHVlLT50LnN0cmluZyA9IHN0cm5kdXAoc3RyaW5nLCBJQVNfTUFYX1NUUklORyk7CisJdmFsdWUtPmxlbiA9IHN0cmxlbih2YWx1ZS0+dC5zdHJpbmcpOworCisJcmV0dXJuIHZhbHVlOworfQorRVhQT1JUX1NZTUJPTChpcmlhc19uZXdfc3RyaW5nX3ZhbHVlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFzX25ld19vY3RzZXFfdmFsdWUgKG9jdGV0cywgbGVuKQorICoKKyAqICAgIENyZWF0ZSBuZXcgSUFTIG9jdGV0LXNlcXVlbmNlIHZhbHVlCisgKgorICogUGVyIElyTE1QIDEuMSwgNC4zLjMuMiwgb2N0ZXQtc2VxdWVuY2UgYXJlIHVwIHRvIDEwMjQgYnl0ZXMgLSBKZWFuIElJCisgKi8KK3N0cnVjdCBpYXNfdmFsdWUgKmlyaWFzX25ld19vY3RzZXFfdmFsdWUoX191OCAqb2N0c2VxICwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKKworCXZhbHVlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc192YWx1ZSksIEdGUF9BVE9NSUMpOworCWlmICh2YWx1ZSA9PSBOVUxMKSB7CisJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldCh2YWx1ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpKTsKKworCXZhbHVlLT50eXBlID0gSUFTX09DVF9TRVE7CisJLyogQ2hlY2sgbGVuZ3RoICovCisJaWYobGVuID4gSUFTX01BWF9PQ1RFVF9TVFJJTkcpCisJCWxlbiA9IElBU19NQVhfT0NURVRfU1RSSU5HOworCXZhbHVlLT5sZW4gPSBsZW47CisKKwl2YWx1ZS0+dC5vY3Rfc2VxID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOworCWlmICh2YWx1ZS0+dC5vY3Rfc2VxID09IE5VTEwpeworCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWtmcmVlKHZhbHVlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbWNweSh2YWx1ZS0+dC5vY3Rfc2VxLCBvY3RzZXEgLCBsZW4pOworCXJldHVybiB2YWx1ZTsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXNfbmV3X29jdHNlcV92YWx1ZSk7CisKK3N0cnVjdCBpYXNfdmFsdWUgKmlyaWFzX25ld19taXNzaW5nX3ZhbHVlKHZvaWQpCit7CisJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CisKKwl2YWx1ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpLCBHRlBfQVRPTUlDKTsKKwlpZiAodmFsdWUgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQodmFsdWUsIDAsIHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSk7CisKKwl2YWx1ZS0+dHlwZSA9IElBU19NSVNTSU5HOworCXZhbHVlLT5sZW4gPSAwOworCisJcmV0dXJuIHZhbHVlOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXNfZGVsZXRlX3ZhbHVlICh2YWx1ZSkKKyAqCisgKiAgICBEZWxldGUgSUFTIHZhbHVlCisgKgorICovCit2b2lkIGlyaWFzX2RlbGV0ZV92YWx1ZShzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZSkKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQodmFsdWUgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlzd2l0Y2ggKHZhbHVlLT50eXBlKSB7CisJY2FzZSBJQVNfSU5URUdFUjogLyogRmFsbHRocm91Z2ggKi8KKwljYXNlIElBU19NSVNTSU5HOgorCQkvKiBObyBuZWVkIHRvIGRlYWxsb2NhdGUgKi8KKwkJYnJlYWs7CisJY2FzZSBJQVNfU1RSSU5HOgorCQkvKiBJZiBzdHJpbmcsIGRlYWxsb2NhdGUgc3RyaW5nICovCisJCWlmICh2YWx1ZS0+dC5zdHJpbmcgIT0gTlVMTCkKKwkJCWtmcmVlKHZhbHVlLT50LnN0cmluZyk7CisJCWJyZWFrOworCWNhc2UgSUFTX09DVF9TRVE6CisJCS8qIElmIGJ5dGUgc3RyZWFtLCBkZWFsbG9jYXRlIGJ5dGUgc3RyZWFtICovCisJCSBpZiAodmFsdWUtPnQub2N0X3NlcSAhPSBOVUxMKQorCQkJIGtmcmVlKHZhbHVlLT50Lm9jdF9zZXEpOworCQkgYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biB2YWx1ZSB0eXBlIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJfQorCWtmcmVlKHZhbHVlKTsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXNfZGVsZXRlX3ZhbHVlKTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFuL0tjb25maWcgYi9uZXQvaXJkYS9pcmxhbi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MWFiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmxhbi9LY29uZmlnCkBAIC0wLDAgKzEsMTQgQEAKK2NvbmZpZyBJUkxBTgorCXRyaXN0YXRlICJJckxBTiBwcm90b2NvbCIKKwlkZXBlbmRzIG9uIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBJckxBTiBwcm90b2NvbC4KKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIGlybGFuLiAgSXJMQU4gZW11bGF0ZXMgYW4gRXRoZXJuZXQgYW5kIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHB1dCB1cAorCSAgYSB3aXJlbGVzcyBMQU4gdXNpbmcgaW5mcmFyZWQgYmVhbXMuCisKKwkgIFRoZSBJckxBTiBwcm90b2NvbCBjYW4gYmUgdXNlZCB0byB0YWxrIHdpdGggaW5mcmFyZWQgYWNjZXNzIHBvaW50cworCSAgbGlrZSB0aGUgSFAgTmV0YmVhbUlSLCBvciB0aGUgRVNJIEpldEV5ZSBORVQuICBZb3UgY2FuIGFsc28gY29ubmVjdAorCSAgdG8gYW5vdGhlciBMaW51eCBtYWNoaW5lIHJ1bm5pbmcgdGhlIElyTEFOIHByb3RvY29sIGZvciBhZC1ob2MKKwkgIG5ldHdvcmtpbmchCisKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFuL01ha2VmaWxlIGIvbmV0L2lyZGEvaXJsYW4vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1NDliYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybGFuL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IElyREEgSXJMQU4gcHJvdG9jb2wgbGF5ZXIuCisjCisKK29iai0kKENPTkZJR19JUkxBTikgKz0gaXJsYW4ubworCitpcmxhbi1vYmpzIDo9IGlybGFuX2NvbW1vbi5vIGlybGFuX2V0aC5vIGlybGFuX2V2ZW50Lm8gaXJsYW5fY2xpZW50Lm8gaXJsYW5fcHJvdmlkZXIubyBpcmxhbl9maWx0ZXIubyBpcmxhbl9wcm92aWRlcl9ldmVudC5vIGlybGFuX2NsaWVudF9ldmVudC5vCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jbGllbnQuYyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2NsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZTZjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jbGllbnQuYwpAQCAtMCwwICsxLDU3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcmxhbl9jbGllbnQuYworICogVmVyc2lvbjogICAgICAgMC45CisgKiBEZXNjcmlwdGlvbjogICBJckRBIExBTiBBY2Nlc3MgUHJvdG9jb2wgKElyTEFOKSBDbGllbnQKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgMzEgMjA6MTQ6MzcgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgVHVlIERlYyAxNCAxNTo0NzowMiAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBTb3VyY2VzOiAgICAgICBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIgPGJlY2tlckBDRVNESVMuZ3NmYy5uYXNhLmdvdj4KKyAqICAgICAgICAgICAgICAgIHNsaXAuYyBieSBMYXVyZW5jZSBDdWxoYW5lLCA8bG96QGhvbG1lcy5kZW1vbi5jby51az4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdXdhbHQubmwubXVnbmV0Lm9yZz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sIAorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFzX29iamVjdC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V2ZW50Lmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXRoLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jbGllbnQuaD4KKworI3VuZGVmIENPTkZJR19JUkxBTl9HUkFUVUlUT1VTX0FSUAorCitzdGF0aWMgdm9pZCBpcmxhbl9jbGllbnRfY3RybF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJCQkgICAgTE1fUkVBU09OIHJlYXNvbiwgCisJCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9jdHJsX2RhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIGlybGFuX2NsaWVudF9jdHJsX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkJICAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIAorCQkJCQkgICAgICBfX3UzMiBtYXhfc2R1X3NpemUsCisJCQkJCSAgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyB2b2lkIGlybGFuX2NoZWNrX3Jlc3BvbnNlX3BhcmFtKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgY2hhciAqcGFyYW0sIAorCQkJCSAgICAgICBjaGFyICp2YWx1ZSwgaW50IHZhbF9sZW4pOworc3RhdGljIHZvaWQgaXJsYW5fY2xpZW50X29wZW5fY3RybF90c2FwKHN0cnVjdCBpcmxhbl9jYiAqc2VsZik7CisKK3N0YXRpYyB2b2lkIGlybGFuX2NsaWVudF9raWNrX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGRhdGE7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKwkKKwkvKiAgCisJICogSWYgd2UgYXJlIGluIHBlZXIgbW9kZSwgdGhlIGNsaWVudCBtYXkgbm90IGhhdmUgZ290IHRoZSBkaXNjb3ZlcnkKKwkgKiBpbmRpY2F0aW9uIGl0IG5lZWRzIHRvIG1ha2UgcHJvZ3Jlc3MuIElmIHRoZSBjbGllbnQgaXMgc3RpbGwgaW4gCisJICogSURMRSBzdGF0ZSwgd2UgbXVzdCBraWNrIGl0IHRvLCBidXQgb25seSBpZiB0aGUgcHJvdmlkZXIgaXMgbm90IElETEUKKyAJICovCisJaWYgKChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9PSBBQ0NFU1NfUEVFUikgJiYgCisJICAgIChzZWxmLT5jbGllbnQuc3RhdGUgPT0gSVJMQU5fSURMRSkgJiYKKwkgICAgKHNlbGYtPnByb3ZpZGVyLnN0YXRlICE9IElSTEFOX0lETEUpKSB7CisJCWlybGFuX2NsaWVudF93YWtldXAoc2VsZiwgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlybGFuX2NsaWVudF9zdGFydF9raWNrX3RpbWVyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+Y2xpZW50LmtpY2tfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsIAorCQkJIGlybGFuX2NsaWVudF9raWNrX3RpbWVyX2V4cGlyZWQpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3dha2V1cCAoc2VsZiwgc2FkZHIsIGRhZGRyKQorICoKKyAqICAgIFdha2UgdXAgY2xpZW50CisgKgorICovCit2b2lkIGlybGFuX2NsaWVudF93YWtldXAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBfX3UzMiBzYWRkciwgX191MzIgZGFkZHIpCit7CisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCS8qIAorCSAqIENoZWNrIGlmIHdlIGFyZSBhbHJlYWR5IGF3YWtlLCBvciBpZiB3ZSBhcmUgYSBwcm92aWRlciBpbiBkaXJlY3QKKwkgKiBtb2RlIChpbiB0aGF0IGNhc2Ugd2UgbXVzdCBsZWF2ZSB0aGUgY2xpZW50IGlkbGUKKwkgKi8KKwlpZiAoKHNlbGYtPmNsaWVudC5zdGF0ZSAhPSBJUkxBTl9JRExFKSB8fCAKKwkgICAgKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19ESVJFQ1QpKQorCXsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIGFscmVhZHkgYXdha2UhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCXJldHVybjsKKwl9CisKKwkvKiBBZGRyZXNzZXMgbWF5IGhhdmUgY2hhbmdlZCEgKi8KKwlzZWxmLT5zYWRkciA9IHNhZGRyOworCXNlbGYtPmRhZGRyID0gZGFkZHI7CisKKwlpZiAoc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPT0gTE1fVVNFUl9SRVFVRVNUKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBzdGlsbCBzdG9wcGVkIGJ5IHVzZXJcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJcmV0dXJuOworCX0KKworCS8qIE9wZW4gVFNBUHMgKi8KKwlpcmxhbl9jbGllbnRfb3Blbl9jdHJsX3RzYXAoc2VsZik7CisJaXJsYW5fb3Blbl9kYXRhX3RzYXAoc2VsZik7CisKKwlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fRElTQ09WRVJZX0lORElDQVRJT04sIE5VTEwpOworCQorCS8qIFN0YXJ0IGtpY2sgdGltZXIgKi8KKwlpcmxhbl9jbGllbnRfc3RhcnRfa2lja190aW1lcihzZWxmLCAyKkhaKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2Rpc2NvdmVyeV9pbmRpY2F0aW9uIChkYWRkcikKKyAqCisgKiAgICBSZW1vdGUgZGV2aWNlIHdpdGggSXJMQU4gc2VydmVyIHN1cHBvcnQgZGlzY292ZXJlZAorICoKKyAqLwordm9pZCBpcmxhbl9jbGllbnRfZGlzY292ZXJ5X2luZGljYXRpb24oZGlzY2luZm9fdCAqZGlzY292ZXJ5LAorCQkJCSAgICAgICBESVNDT1ZFUllfTU9ERSBtb2RlLAorCQkJCSAgICAgICB2b2lkICpwcml2KSAKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CisJX191MzIgc2FkZHIsIGRhZGRyOworCQorCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoZGlzY292ZXJ5ICE9IE5VTEwsIHJldHVybjspOworCisJLyoKKwkgKiBJIGRpZG4ndCBjaGVjayBpdCwgYnV0IEkgYmV0IHRoYXQgSXJMQU4gc3VmZmVyIGZyb20gdGhlIHNhbWUKKwkgKiBkZWZpY2llbmN5IGFzIElyQ29tbSBhbmQgZG9lc24ndCBoYW5kbGUgdHdvIGluc3RhbmNlcworCSAqIHNpbXVsdGFuZW91c2x5IGNvbm5lY3RpbmcgdG8gZWFjaCBvdGhlci4KKwkgKiBTYW1lIHdvcmthcm91bmQsIGRyb3AgcGFzc2l2ZSBkaXNjb3Zlcmllcy4KKwkgKiBKZWFuIElJICovCisJaWYobW9kZSA9PSBESVNDT1ZFUllfUEFTU0lWRSkKKwkJcmV0dXJuOworCisJc2FkZHIgPSBkaXNjb3ZlcnktPnNhZGRyOworCWRhZGRyID0gZGlzY292ZXJ5LT5kYWRkcjsKKworCS8qIEZpbmQgaW5zdGFuY2UgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJc2VsZiA9IGlybGFuX2dldF9hbnkoKTsKKwlpZiAoc2VsZikgeworCQlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgRm91bmQgaW5zdGFuY2UgKCUwOHgpIVxuIiwgX19GVU5DVElPTl9fICwKKwkJICAgICAgZGFkZHIpOworCQkKKwkJaXJsYW5fY2xpZW50X3dha2V1cChzZWxmLCBzYWRkciwgZGFkZHIpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKwkKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfZGF0YV9pbmRpY2F0aW9uIChoYW5kbGUsIHNrYikKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGRhdGEgdGhhdCBpcyByZWNlaXZlZCBvbiB0aGUgY29udHJvbCBjaGFubmVsCisgKgorICovCitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9jdHJsX2RhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCisJaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0RBVEFfSU5ESUNBVElPTiwgc2tiKTsgCisKKwkvKiBSZWFkeSBmb3IgYSBuZXcgY29tbWFuZCAqLwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBjbGVhcmluZyB0eF9idXN5XG4iLCBfX0ZVTkNUSU9OX18gKTsKKwlzZWxmLT5jbGllbnQudHhfYnVzeSA9IEZBTFNFOworCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBzb21lIHF1ZXVlZCBjb21tYW5kcyB3YWl0aW5nIHRvIGJlIHNlbnQgKi8KKwlpcmxhbl9ydW5fY3RybF90eF9xdWV1ZShzZWxmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpcmxhbl9jbGllbnRfY3RybF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJCQkgICAgTE1fUkVBU09OIHJlYXNvbiwgCisJCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKSAKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CisJc3RydWN0IHRzYXBfY2IgKnRzYXA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIHJlYXNvbj0lZFxuIiwgX19GVU5DVElPTl9fICwgcmVhc29uKTsKKwkKKwlzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKKwl0c2FwID0gKHN0cnVjdCB0c2FwX2NiICopIHNhcDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwkKKwlJUkRBX0FTU0VSVCh0c2FwICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHRzYXAtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKKwkKKwlJUkRBX0FTU0VSVCh0c2FwID09IHNlbGYtPmNsaWVudC50c2FwX2N0cmwsIHJldHVybjspOworCisgICAgICAgCS8qIFJlbW92ZSBmcmFtZXMgcXVldWVkIG9uIHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT5jbGllbnQudHhxKSkgIT0gTlVMTCkgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCXNlbGYtPmNsaWVudC50eF9idXN5ID0gRkFMU0U7CisKKwlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fTE1QX0RJU0NPTk5FQ1QsIE5VTEwpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X29wZW5fdHNhcHMgKHNlbGYpCisgKgorICogICAgSW5pdGlhbGl6ZSBjYWxsYmFja3MgYW5kIG9wZW4gSXJUVFAgVFNBUHMKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFuX2NsaWVudF9vcGVuX2N0cmxfdHNhcChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCit7CisJc3RydWN0IHRzYXBfY2IgKnRzYXA7CisJbm90aWZ5X3Qgbm90aWZ5OworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCS8qIENoZWNrIGlmIGFscmVhZHkgb3BlbiAqLworCWlmIChzZWxmLT5jbGllbnQudHNhcF9jdHJsKQorCQlyZXR1cm47CisKKwlpcmRhX25vdGlmeV9pbml0KCZub3RpZnkpOworCisJLyogU2V0IHVwIGNhbGxiYWNrcyAqLworCW5vdGlmeS5kYXRhX2luZGljYXRpb24gICAgICAgPSBpcmxhbl9jbGllbnRfY3RybF9kYXRhX2luZGljYXRpb247CisJbm90aWZ5LmNvbm5lY3RfY29uZmlybSAgICAgICA9IGlybGFuX2NsaWVudF9jdHJsX2Nvbm5lY3RfY29uZmlybTsKKwlub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gaXJsYW5fY2xpZW50X2N0cmxfZGlzY29ubmVjdF9pbmRpY2F0aW9uOworCW5vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CisJc3RybGNweShub3RpZnkubmFtZSwgIklyTEFOIGN0cmwgKGMpIiwgc2l6ZW9mKG5vdGlmeS5uYW1lKSk7CisJCisJdHNhcCA9IGlydHRwX29wZW5fdHNhcChMU0FQX0FOWSwgREVGQVVMVF9JTklUSUFMX0NSRURJVCwgJm5vdGlmeSk7CisJaWYgKCF0c2FwKSB7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIEdvdCBubyB0c2FwIVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybjsKKwl9CisJc2VsZi0+Y2xpZW50LnRzYXBfY3RybCA9IHRzYXA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfY29ubmVjdF9jb25maXJtIChoYW5kbGUsIHNrYikKKyAqCisgKiAgICBDb25uZWN0aW9uIHRvIHBlZXIgSXJMQU4gbGF5ZSBjb25maXJtZWQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFuX2NsaWVudF9jdHJsX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkJICAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIAorCQkJCQkgICAgICBfX3UzMiBtYXhfc2R1X3NpemUsCisJCQkJCSAgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwlzZWxmLT5jbGllbnQubWF4X3NkdV9zaXplID0gbWF4X3NkdV9zaXplOworCXNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CisKKwkvKiBUT0RPOiB3ZSBjb3VsZCBzZXQgdGhlIE1UVSBkZXBlbmRpbmcgb24gdGhlIG1heF9zZHVfc2l6ZSAqLworCisJaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0NPTk5FQ1RfQ09NUExFVEUsIE5VTEwpOworfQorCisvKgorICogRnVuY3Rpb24gcHJpbnRfcmV0X2NvZGUgKGNvZGUpCisgKgorICogICAgUHJpbnQgcmV0dXJuIGNvZGUgb2YgcmVxdWVzdCB0byBwZWVyIElyTEFOIGxheWVyLgorICoKKyAqLworc3RhdGljIHZvaWQgcHJpbnRfcmV0X2NvZGUoX191OCBjb2RlKSAKK3sKKwlzd2l0Y2goY29kZSkgeworCWNhc2UgMDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU3VjY2Vzc1xuIik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJSVJEQV9XQVJOSU5HKCJJckxBTjogSW5zdWZmaWNpZW50IHJlc291cmNlc1xuIik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJSVJEQV9XQVJOSU5HKCJJckxBTjogSW52YWxpZCBjb21tYW5kIGZvcm1hdFxuIik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJSVJEQV9XQVJOSU5HKCJJckxBTjogQ29tbWFuZCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBQYXJhbWV0ZXIgbm90IHN1cHBvcnRlZFxuIik7CisJCWJyZWFrOworCWNhc2UgNToKKwkJSVJEQV9XQVJOSU5HKCJJckxBTjogVmFsdWUgbm90IHN1cHBvcnRlZFxuIik7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJSVJEQV9XQVJOSU5HKCJJckxBTjogTm90IG9wZW5cbiIpOworCQlicmVhazsKKwljYXNlIDc6CisJCUlSREFfV0FSTklORygiSXJMQU46IEF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBJbnZhbGlkIHBhc3N3b3JkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBQcm90b2NvbCBlcnJvclxuIik7CisJCWJyZWFrOworCWNhc2UgMjU1OgorCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBBc3luY2hyb25vdXMgc3RhdHVzXG4iKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3BhcnNlX3Jlc3BvbnNlIChzZWxmLCBza2IpCisgKgorICogICAgRXh0cmFjdCBhbGwgcGFyYW1ldGVycyBmcm9tIHJlY2VpdmVkIGJ1ZmZlciwgdGhlbiBmZWVkIHRoZW0gdG8gCisgKiAgICBjaGVja19wYXJhbXMgZm9yIHBhcnNpbmcKKyAqLwordm9pZCBpcmxhbl9jbGllbnRfcGFyc2VfcmVzcG9uc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTggKmZyYW1lOworCV9fdTggKnB0cjsKKwlpbnQgY291bnQ7CisJaW50IHJldDsKKwlfX3UxNiB2YWxfbGVuOworCWludCBpOworICAgICAgICBjaGFyICpuYW1lOworICAgICAgICBjaGFyICp2YWx1ZTsKKworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsJCisJCisJSVJEQV9ERUJVRyg0LCAiJXMoKSBza2ItPmxlbj0lZFxuIiwgX19GVU5DVElPTl9fICwgKGludCkgc2tiLT5sZW4pOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCQorCWlmICghc2tiKSB7CisJCUlSREFfRVJST1IoIiVzKCksIEdvdCBOVUxMIHNrYiFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJZnJhbWUgPSBza2ItPmRhdGE7CisJCisJLyogCisJICogIENoZWNrIHJldHVybiBjb2RlIGFuZCBwcmludCBpdCBpZiBub3Qgc3VjY2VzcyAKKwkgKi8KKwlpZiAoZnJhbWVbMF0pIHsKKwkJcHJpbnRfcmV0X2NvZGUoZnJhbWVbMF0pOworCQlyZXR1cm47CisJfQorCQorCW5hbWUgPSBrbWFsbG9jKDI1NSwgR0ZQX0FUT01JQyk7CisJaWYgKCFuYW1lKQorCQlyZXR1cm47CisJdmFsdWUgPSBrbWFsbG9jKDEwMTYsIEdGUF9BVE9NSUMpOworCWlmICghdmFsdWUpIHsKKwkJa2ZyZWUobmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBIb3cgbWFueSBwYXJhbWV0ZXJzPyAqLworCWNvdW50ID0gZnJhbWVbMV07CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBnb3QgJWQgcGFyYW1ldGVyc1xuIiwgX19GVU5DVElPTl9fICwgY291bnQpOworCQorCXB0ciA9IGZyYW1lKzI7CisKKwkvKiBGb3IgYWxsIHBhcmFtZXRlcnMgKi8KKyAJZm9yIChpPTA7IGk8Y291bnQ7aSsrKSB7CisJCXJldCA9IGlybGFuX2V4dHJhY3RfcGFyYW0ocHRyLCBuYW1lLCB2YWx1ZSwgJnZhbF9sZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSXJMQU4sIEVycm9yIVxuIiwgX19GVU5DVElPTl9fICk7CisJCQlicmVhazsKKwkJfQorCQlwdHIgKz0gcmV0OworCQlpcmxhbl9jaGVja19yZXNwb25zZV9wYXJhbShzZWxmLCBuYW1lLCB2YWx1ZSwgdmFsX2xlbik7CisgCX0KKwkvKiBDbGVhbnVwICovCisJa2ZyZWUobmFtZSk7CisJa2ZyZWUodmFsdWUpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2hlY2tfcmVzcG9uc2VfcGFyYW0gKHNlbGYsIHBhcmFtLCB2YWx1ZSwgdmFsX2xlbikKKyAqCisgKiAgICAgQ2hlY2sgd2hpY2ggcGFyYW1ldGVyIGlzIHJlY2VpdmVkIGFuZCB1cGRhdGUgbG9jYWwgdmFyaWFibGVzCisgKgorICovCitzdGF0aWMgdm9pZCBpcmxhbl9jaGVja19yZXNwb25zZV9wYXJhbShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIGNoYXIgKnBhcmFtLCAKKwkJCQkgICAgICAgY2hhciAqdmFsdWUsIGludCB2YWxfbGVuKSAKK3sKKwlfX3UxNiB0bXBfY3B1OyAvKiBUZW1wb3JhcnkgdmFsdWUgaW4gaG9zdCBvcmRlciAqLworCV9fdTggKmJ5dGVzOworCWludCBpOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgcGFybT0lc1xuIiwgX19GVU5DVElPTl9fICwgcGFyYW0pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBNZWRpYSB0eXBlICovCisJaWYgKHN0cmNtcChwYXJhbSwgIk1FRElBIikgPT0gMCkgeworCQlpZiAoc3RyY21wKHZhbHVlLCAiODAyLjMiKSA9PSAwKQorCQkJc2VsZi0+bWVkaWEgPSBNRURJQV84MDJfMzsKKwkJZWxzZQorCQkJc2VsZi0+bWVkaWEgPSBNRURJQV84MDJfNTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc3RyY21wKHBhcmFtLCAiRklMVEVSX1RZUEUiKSA9PSAwKSB7CisJCWlmIChzdHJjbXAodmFsdWUsICJESVJFQ1RFRCIpID09IDApCisJCQlzZWxmLT5jbGllbnQuZmlsdGVyX3R5cGUgfD0gSVJMQU5fRElSRUNURUQ7CisJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIkZVTkNUSU9OQUwiKSA9PSAwKQorCQkJc2VsZi0+Y2xpZW50LmZpbHRlcl90eXBlIHw9IElSTEFOX0ZVTkNUSU9OQUw7CisJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIkdST1VQIikgPT0gMCkKKwkJCXNlbGYtPmNsaWVudC5maWx0ZXJfdHlwZSB8PSBJUkxBTl9HUk9VUDsKKwkJZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAiTUFDX0ZSQU1FIikgPT0gMCkKKwkJCXNlbGYtPmNsaWVudC5maWx0ZXJfdHlwZSB8PSBJUkxBTl9NQUNfRlJBTUU7CisJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIk1VTFRJQ0FTVCIpID09IDApCisJCQlzZWxmLT5jbGllbnQuZmlsdGVyX3R5cGUgfD0gSVJMQU5fTVVMVElDQVNUOworCQllbHNlIGlmIChzdHJjbXAodmFsdWUsICJCUk9BRENBU1QiKSA9PSAwKQorCQkJc2VsZi0+Y2xpZW50LmZpbHRlcl90eXBlIHw9IElSTEFOX0JST0FEQ0FTVDsKKwkJZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAiSVBYX1NPQ0tFVCIpID09IDApCisJCQlzZWxmLT5jbGllbnQuZmlsdGVyX3R5cGUgfD0gSVJMQU5fSVBYX1NPQ0tFVDsKKwkJCisJfQorCWlmIChzdHJjbXAocGFyYW0sICJBQ0NFU1NfVFlQRSIpID09IDApIHsKKwkJaWYgKHN0cmNtcCh2YWx1ZSwgIkRJUkVDVCIpID09IDApCisJCQlzZWxmLT5jbGllbnQuYWNjZXNzX3R5cGUgPSBBQ0NFU1NfRElSRUNUOworCQllbHNlIGlmIChzdHJjbXAodmFsdWUsICJQRUVSIikgPT0gMCkKKwkJCXNlbGYtPmNsaWVudC5hY2Nlc3NfdHlwZSA9IEFDQ0VTU19QRUVSOworCQllbHNlIGlmIChzdHJjbXAodmFsdWUsICJIT1NURUQiKSA9PSAwKQorCQkJc2VsZi0+Y2xpZW50LmFjY2Vzc190eXBlID0gQUNDRVNTX0hPU1RFRDsKKwkJZWxzZSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIGFjY2VzcyB0eXBlIVxuIiwgX19GVU5DVElPTl9fICk7CisJCX0KKwl9CisJLyogSVJMQU4gdmVyc2lvbiAqLworCWlmIChzdHJjbXAocGFyYW0sICJJUkxBTl9WRVIiKSA9PSAwKSB7CisJCUlSREFfREVCVUcoNCwgIklyTEFOIHZlcnNpb24gJWQuJWRcbiIsIChfX3U4KSB2YWx1ZVswXSwgCisJCSAgICAgIChfX3U4KSB2YWx1ZVsxXSk7CisKKwkJc2VsZi0+dmVyc2lvblswXSA9IHZhbHVlWzBdOworCQlzZWxmLT52ZXJzaW9uWzFdID0gdmFsdWVbMV07CisJCXJldHVybjsKKwl9CisJLyogV2hpY2ggcmVtb3RlIFRTQVAgdG8gdXNlIGZvciBkYXRhIGNoYW5uZWwgKi8KKwlpZiAoc3RyY21wKHBhcmFtLCAiREFUQV9DSEFOIikgPT0gMCkgeworCQlzZWxmLT5kdHNhcF9zZWxfZGF0YSA9IHZhbHVlWzBdOworCQlJUkRBX0RFQlVHKDQsICJEYXRhIFRTQVAgPSAlMDJ4XG4iLCBzZWxmLT5kdHNhcF9zZWxfZGF0YSk7CisJCXJldHVybjsKKwl9CisJaWYgKHN0cmNtcChwYXJhbSwgIkNPTl9BUkIiKSA9PSAwKSB7CisJCW1lbWNweSgmdG1wX2NwdSwgdmFsdWUsIDIpOyAvKiBBbGlnbiB2YWx1ZSAqLworCQlsZTE2X3RvX2NwdXMoJnRtcF9jcHUpOyAgICAgLyogQ29udmVydCB0byBob3N0IG9yZGVyICovCisJCXNlbGYtPmNsaWVudC5yZWN2X2FyYl92YWwgPSB0bXBfY3B1OworCQlJUkRBX0RFQlVHKDIsICIlcygpLCByZWNlaXZlIGFyYiB2YWw9JWRcbiIsIF9fRlVOQ1RJT05fXyAsIAorCQkJICAgc2VsZi0+Y2xpZW50LnJlY3ZfYXJiX3ZhbCk7CisJfQorCWlmIChzdHJjbXAocGFyYW0sICJNQVhfRlJBTUUiKSA9PSAwKSB7CisJCW1lbWNweSgmdG1wX2NwdSwgdmFsdWUsIDIpOyAvKiBBbGlnbiB2YWx1ZSAqLworCQlsZTE2X3RvX2NwdXMoJnRtcF9jcHUpOyAgICAgLyogQ29udmVydCB0byBob3N0IG9yZGVyICovCisJCXNlbGYtPmNsaWVudC5tYXhfZnJhbWUgPSB0bXBfY3B1OworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBtYXggZnJhbWU9JWRcbiIsIF9fRlVOQ1RJT05fXyAsIAorCQkJICAgc2VsZi0+Y2xpZW50Lm1heF9mcmFtZSk7CisJfQorCSAKKwkvKiBSRUNPTk5FQ1RfS0VZLCBpbiBjYXNlIHRoZSBsaW5rIGdvZXMgZG93biEgKi8KKwlpZiAoc3RyY21wKHBhcmFtLCAiUkVDT05ORUNUX0tFWSIpID09IDApIHsKKwkJSVJEQV9ERUJVRyg0LCAiR290IHJlY29ubmVjdCBrZXk6ICIpOworCQkvKiBmb3IgKGkgPSAwOyBpIDwgdmFsX2xlbjsgaSsrKSAqLworLyogCQkJcHJpbnRrKCIlMDJ4IiwgdmFsdWVbaV0pOyAqLworCQltZW1jcHkoc2VsZi0+Y2xpZW50LnJlY29ubmVjdF9rZXksIHZhbHVlLCB2YWxfbGVuKTsKKwkJc2VsZi0+Y2xpZW50LmtleV9sZW4gPSB2YWxfbGVuOworCQlJUkRBX0RFQlVHKDQsICJcbiIpOworCX0KKwkvKiBGSUxURVJfRU5UUlksIGhhdmUgd2UgZ290IGFuIGV0aGVybmV0IGFkZHJlc3M/ICovCisJaWYgKHN0cmNtcChwYXJhbSwgIkZJTFRFUl9FTlRSWSIpID09IDApIHsKKwkJYnl0ZXMgPSB2YWx1ZTsKKwkJSVJEQV9ERUJVRyg0LCAiRXRoZXJuZXQgYWRkcmVzcyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgICAgICBieXRlc1swXSwgYnl0ZXNbMV0sIGJ5dGVzWzJdLCBieXRlc1szXSwgYnl0ZXNbNF0sIAorCQkgICAgICBieXRlc1s1XSk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIAorCQkJc2VsZi0+ZGV2LT5kZXZfYWRkcltpXSA9IGJ5dGVzW2ldOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9nZXRfdmFsdWVfY29uZmlybSAob2JqX2lkLCB2YWx1ZSkKKyAqCisgKiAgICBHb3QgcmVzdWx0cyBmcm9tIHJlbW90ZSBMTS1JQVMKKyAqCisgKi8KK3ZvaWQgaXJsYW5fY2xpZW50X2dldF92YWx1ZV9jb25maXJtKGludCByZXN1bHQsIF9fdTE2IG9ial9pZCwgCisJCQkJICAgIHN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlLCB2b2lkICpwcml2KSAKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CisJCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybjspOworCisJc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgcHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBXZSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIG1ha2UgYW55IG1vcmUgcXVlcmllcyAqLworCWlyaWFwX2Nsb3NlKHNlbGYtPmNsaWVudC5pcmlhcCk7CisJc2VsZi0+Y2xpZW50LmlyaWFwID0gTlVMTDsKKworCS8qIENoZWNrIGlmIHJlcXVlc3Qgc3VjY2VlZGVkICovCisJaWYgKHJlc3VsdCAhPSBJQVNfU1VDQ0VTUykgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBnb3QgTlVMTCB2YWx1ZSFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fSUFTX1BST1ZJREVSX05PVF9BVkFJTCwgCisJCQkJICAgICAgTlVMTCk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKHZhbHVlLT50eXBlKSB7CisJY2FzZSBJQVNfSU5URUdFUjoKKwkJc2VsZi0+ZHRzYXBfc2VsX2N0cmwgPSB2YWx1ZS0+dC5pbnRlZ2VyOworCisJCWlmICh2YWx1ZS0+dC5pbnRlZ2VyICE9IC0xKSB7CisJCQlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fSUFTX1BST1ZJREVSX0FWQUlMLAorCQkJCQkgICAgICBOVUxMKTsKKwkJCXJldHVybjsKKwkJfQorCQlpcmlhc19kZWxldGVfdmFsdWUodmFsdWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJfQorCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9JQVNfUFJPVklERVJfTk9UX0FWQUlMLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFuL2lybGFuX2NsaWVudF9ldmVudC5jIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY2xpZW50X2V2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5NDNiNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2NsaWVudF9ldmVudC5jCkBAIC0wLDAgKzEsNTMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlybGFuX2NsaWVudF9ldmVudC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjkKKyAqIERlc2NyaXB0aW9uOiAgIElyTEFOIGNsaWVudCBzdGF0ZSBtYWNoaW5lCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTdW4gQXVnIDMxIDIwOjE0OjM3IDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBEZWMgMjYgMjE6NTI6MjQgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NsaWVudC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V2ZW50Lmg+CisKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2lkbGUgKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3F1ZXJ5KHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2Nvbm4gKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2luZm8gKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX21lZGlhKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX29wZW4gKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3dhaXQgKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2FyYiAgKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2RhdGEgKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2Nsb3NlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3N5bmMgKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RhdGljIGludCAoKnN0YXRlW10pKHN0cnVjdCBpcmxhbl9jYiAqLCBJUkxBTl9FVkVOVCBldmVudCwgc3RydWN0IHNrX2J1ZmYgKikgPQoreyAKKwlpcmxhbl9jbGllbnRfc3RhdGVfaWRsZSwKKwlpcmxhbl9jbGllbnRfc3RhdGVfcXVlcnksCisJaXJsYW5fY2xpZW50X3N0YXRlX2Nvbm4sCisJaXJsYW5fY2xpZW50X3N0YXRlX2luZm8sCisJaXJsYW5fY2xpZW50X3N0YXRlX21lZGlhLAorCWlybGFuX2NsaWVudF9zdGF0ZV9vcGVuLAorCWlybGFuX2NsaWVudF9zdGF0ZV93YWl0LAorCWlybGFuX2NsaWVudF9zdGF0ZV9hcmIsCisJaXJsYW5fY2xpZW50X3N0YXRlX2RhdGEsCisJaXJsYW5fY2xpZW50X3N0YXRlX2Nsb3NlLAorCWlybGFuX2NsaWVudF9zdGF0ZV9zeW5jCit9OworCit2b2lkIGlybGFuX2RvX2NsaWVudF9ldmVudChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCSAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisJKCpzdGF0ZVsgc2VsZi0+Y2xpZW50LnN0YXRlXSkgKHNlbGYsIGV2ZW50LCBza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX2lkbGUgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgSURMRSwgV2UgYXJlIHdhaXRpbmcgZm9yIGFuIGluZGljYXRpb24gdGhhdCB0aGVyZSBpcyBhIHByb3ZpZGVyCisgKiAgICBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2lkbGUoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm4gLTE7KTsKKwkKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9ESVNDT1ZFUllfSU5ESUNBVElPTjoKKwkJaWYgKHNlbGYtPmNsaWVudC5pcmlhcCkgeworCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBidXN5IHdpdGggYSBwcmV2aW91cyBxdWVyeVxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCQorCQlzZWxmLT5jbGllbnQuaXJpYXAgPSBpcmlhcF9vcGVuKExTQVBfQU5ZLCBJQVNfQ0xJRU5ULCBzZWxmLAorCQkJCQkJaXJsYW5fY2xpZW50X2dldF92YWx1ZV9jb25maXJtKTsKKwkJLyogR2V0IHNvbWUgdmFsdWVzIGZyb20gcGVlciBJQVMgKi8KKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fUVVFUlkpOworCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdChzZWxmLT5jbGllbnQuaXJpYXAsCisJCQkJCSAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwKKwkJCQkJICAgICAgIklyTEFOIiwgIklyREE6VGlueVRQOkxzYXBTZWwiKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJUkxBTl9XQVRDSERPR19USU1FT1VUXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikgCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX3F1ZXJ5IChldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFFVRVJZLCBXZSBoYXZlIHF1ZXJ5ZWQgdGhlIHJlbW90ZSBJQVMgYW5kIGlzIHJlYWR5IHRvIGNvbm5lY3QKKyAqICAgIHRvIHByb3ZpZGVyLCBqdXN0IHdhaXRpbmcgZm9yIHRoZSBjb25maXJtLgorICoKKyAqLworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfcXVlcnkoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CisJCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9JQVNfUFJPVklERVJfQVZBSUw6CisJCUlSREFfQVNTRVJUKHNlbGYtPmR0c2FwX3NlbF9jdHJsICE9IDAsIHJldHVybiAtMTspOworCisJCXNlbGYtPmNsaWVudC5vcGVuX3JldHJpZXMgPSAwOworCQkKKwkJaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmNsaWVudC50c2FwX2N0cmwsIAorCQkJCSAgICAgIHNlbGYtPmR0c2FwX3NlbF9jdHJsLCAKKwkJCQkgICAgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsIE5VTEwsIAorCQkJCSAgICAgIElSTEFOX01UVSwgTlVMTCk7CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0NPTk4pOworCQlicmVhazsKKwljYXNlIElSTEFOX0lBU19QUk9WSURFUl9OT1RfQVZBSUw6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIElBU19QUk9WSURFUl9OT1RfQVZBSUxcbiIsIF9fRlVOQ1RJT05fXyApOworCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKworCQkvKiBHaXZlIHRoZSBjbGllbnQgYSBraWNrISAqLworCQlpZiAoKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSAmJiAKKwkJICAgIChzZWxmLT5wcm92aWRlci5zdGF0ZSAhPSBJUkxBTl9JRExFKSkKKwkJCWlybGFuX2NsaWVudF93YWtldXAoc2VsZiwgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDoKKwljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgorCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJUkxBTl9XQVRDSERPR19USU1FT1VUXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX2Nvbm4gKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgQ09OTiwgV2UgaGF2ZSBjb25uZWN0ZWQgdG8gYSBwcm92aWRlciBidXQgaGFzIG5vdCBpc3N1ZWQgYW55CisgKiAgICBjb21tYW5kcyB5ZXQuCisgKgorICovCitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9jb25uKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSVJMQU5fQ09OTkVDVF9DT01QTEVURToKKwkJLyogU2VuZCBnZXRpbmZvIGNtZCAqLworCQlpcmxhbl9nZXRfcHJvdmlkZXJfaW5mbyhzZWxmKTsKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSU5GTyk7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CisJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fV0FUQ0hET0dfVElNRU9VVDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSVJMQU5fV0FUQ0hET0dfVElNRU9VVFxuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV9pbmZvIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIElORk8sIFdlIGhhdmUgaXNzdWVkIGEgR2V0SW5mbyBjb21tYW5kIGFuZCBpcyBhd2FpdGluZyBhIHJlcGx5LgorICovCitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9pbmZvKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9EQVRBX0lORElDQVRJT046CisJCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkKKwkJaXJsYW5fY2xpZW50X3BhcnNlX3Jlc3BvbnNlKHNlbGYsIHNrYik7CisJCQorCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9NRURJQSk7CisJCQorCQlpcmxhbl9nZXRfbWVkaWFfY2hhcihzZWxmKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CisJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fV0FUQ0hET0dfVElNRU9VVDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSVJMQU5fV0FUQ0hET0dfVElNRU9VVFxuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV9tZWRpYSAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBNRURJQSwgVGhlIGlybGFuX2NsaWVudCBoYXMgaXNzdWVkIGEgR2V0TWVkaWEgY29tbWFuZCBhbmQgaXMgYXdhaXRpbmcgYQorICogICAgcmVwbHkuCisgKgorICovCitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9tZWRpYShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaChldmVudCkgeworCWNhc2UgSVJMQU5fREFUQV9JTkRJQ0FUSU9OOgorCQlpcmxhbl9jbGllbnRfcGFyc2VfcmVzcG9uc2Uoc2VsZiwgc2tiKTsKKwkJaXJsYW5fb3Blbl9kYXRhX2NoYW5uZWwoc2VsZik7CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX09QRU4pOworCQlicmVhazsKKwljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOgorCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCQlicmVhazsKKwljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CisJCWJyZWFrOworCX0KKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfb3BlbiAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBPUEVOLCBUaGUgaXJsYW5fY2xpZW50IGhhcyBpc3N1ZWQgYSBPcGVuRGF0YSBjb21tYW5kIGFuZCBpcyBhd2FpdGluZyBhCisgKiAgICByZXBseQorICoKKyAqLworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfb3BlbihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gcW9zOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaChldmVudCkgeworCWNhc2UgSVJMQU5fREFUQV9JTkRJQ0FUSU9OOgorCQlpcmxhbl9jbGllbnRfcGFyc2VfcmVzcG9uc2Uoc2VsZiwgc2tiKTsKKwkJCisJCS8qCisJCSAqICBDaGVjayBpZiB3ZSBoYXZlIGdvdCB0aGUgcmVtb3RlIFRTQVAgZm9yIGRhdGEgCisJCSAqICBjb21tdW5pY2F0aW9ucworCQkgKi8KKwkgIAlJUkRBX0FTU0VSVChzZWxmLT5kdHNhcF9zZWxfZGF0YSAhPSAwLCByZXR1cm4gLTE7KTsKKworCQkvKiBDaGVjayB3aGljaCBhY2Nlc3MgdHlwZSB3ZSBhcmUgZGVhbGluZyB3aXRoICovCisJCXN3aXRjaCAoc2VsZi0+Y2xpZW50LmFjY2Vzc190eXBlKSB7CisJCWNhc2UgQUNDRVNTX1BFRVI6CisJCSAgICBpZiAoc2VsZi0+cHJvdmlkZXIuc3RhdGUgPT0gSVJMQU5fT1BFTikgeworCQkJICAgIAorCQkJICAgIGlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0FSQik7CisJCQkgICAgaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0NIRUNLX0NPTl9BUkIsIAorCQkJCQkJICBOVUxMKTsKKwkJICAgIH0gZWxzZSB7CisJCQkKKwkJCSAgICBpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9XQUlUKTsKKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQljYXNlIEFDQ0VTU19ESVJFQ1Q6CisJCWNhc2UgQUNDRVNTX0hPU1RFRDoKKwkJCXFvcy5saW5rX2Rpc2NfdGltZS5iaXRzID0gMHgwMTsgLyogMyBzZWNzICovCisJCQkKKwkJCWlydHRwX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwX2RhdGEsIAorCQkJCQkgICAgICBzZWxmLT5kdHNhcF9zZWxfZGF0YSwgCisJCQkJCSAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgJnFvcywgCisJCQkJCSAgICAgIElSTEFOX01UVSwgTlVMTCk7CisJCQkKKwkJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0RBVEEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIGFjY2VzcyB0eXBlIVxuIiwgX19GVU5DVElPTl9fICk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOgorCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCQlicmVhazsKKwljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CisJCWJyZWFrOworCX0KKwkKKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV93YWl0IChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFdBSVQsIFRoZSBpcmxhbl9jbGllbnQgaXMgd2FpdGluZyBmb3IgdGhlIGxvY2FsIHByb3ZpZGVyIHRvIGVudGVyIHRoZQorICogICAgcHJvdmlkZXIgT1BFTiBzdGF0ZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3dhaXQoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIElSTEFOX1BST1ZJREVSX1NJR05BTDoKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fQVJCKTsKKwkJaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0NIRUNLX0NPTl9BUkIsIE5VTEwpOworCQlicmVhazsKKwljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOgorCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCQlicmVhazsKKwljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CisJCWJyZWFrOworCX0KKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2FyYihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCXN0cnVjdCBxb3NfaW5mbyBxb3M7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9DSEVDS19DT05fQVJCOgorCQlpZiAoc2VsZi0+Y2xpZW50LnJlY3ZfYXJiX3ZhbCA9PSBzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwpIHsKKwkJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0NMT1NFKTsKKwkJCWlybGFuX2Nsb3NlX2RhdGFfY2hhbm5lbChzZWxmKTsKKwkJfSBlbHNlIGlmIChzZWxmLT5jbGllbnQucmVjdl9hcmJfdmFsIDwgCisJCQkgICBzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwpIAorCQl7CisJCQlxb3MubGlua19kaXNjX3RpbWUuYml0cyA9IDB4MDE7IC8qIDMgc2VjcyAqLworCisJCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9EQVRBKTsKKwkJCWlydHRwX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwX2RhdGEsIAorCQkJCQkgICAgICBzZWxmLT5kdHNhcF9zZWxfZGF0YSwgCisJCQkJCSAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgJnFvcywgCisJCQkJCSAgICAgIElSTEFOX01UVSwgTlVMTCk7CisJCX0gZWxzZSBpZiAoc2VsZi0+Y2xpZW50LnJlY3ZfYXJiX3ZhbCA+CisJCQkgICBzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwpIAorCQl7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBsb3N0IHRoZSBiYXR0bGUgOi0oXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElSTEFOX0RBVEFfQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9EQVRBKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDoKKwljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgorCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJUkxBTl9XQVRDSERPR19USU1FT1VUXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX2RhdGEgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgREFUQSwgVGhlIGRhdGEgY2hhbm5lbCBpcyBjb25uZWN0ZWQsIGFsbG93aW5nIGRhdGEgdHJhbnNmZXJzIGJldHdlZW4KKyAqICAgIHRoZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzLgorICoKKyAqLworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfZGF0YShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtMTspOworCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9EQVRBX0lORElDQVRJT046CisJCWlybGFuX2NsaWVudF9wYXJzZV9yZXNwb25zZShzZWxmLCBza2IpOworCQlicmVhazsJCQorCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6IC8qIEZBTExUSFJPVUdIICovCisJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV9jbG9zZSAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2Nsb3NlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX3N5bmMgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9zeW5jKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdkMTIyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMKQEAgLTAsMCArMSwxMjAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlybGFuX2NvbW1vbi5jCisgKiBWZXJzaW9uOiAgICAgICAwLjkKKyAqIERlc2NyaXB0aW9uOiAgIElyREEgTEFOIEFjY2VzcyBQcm90b2NvbCBJbXBsZW1lbnRhdGlvbgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU3VuIEF1ZyAzMSAyMDoxNDozNyAxOTk3CisgKiBNb2RpZmllZCBhdDogICBTdW4gRGVjIDI2IDIxOjUzOjEwIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5NywgMTk5OSBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+LCAKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lydHRwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jb21tb24uaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jbGllbnQuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9wcm92aWRlci5oPiAKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9ldGguaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9maWx0ZXIuaD4KKworCisvKiAKKyAqIFNlbmQgZ3JhdHVpdG91cyBBUlAgd2hlbiBjb25uZWN0ZWQgdG8gYSBuZXcgQVAgb3Igbm90LiBNYXkgYmUgYSBjbGV2ZXIKKyAqIHRoaW5nIHRvIGRvLCBidXQgZm9yIHNvbWUgcmVhc29uIHRoZSBtYWNoaW5lIGNyYXNoZXMgaWYgeW91IHVzZSBESENQLiBTbworICogbGV0cyBub3QgdXNlIGl0IGJ5IGRlZmF1bHQuCisgKi8KKyN1bmRlZiBDT05GSUdfSVJMQU5fU0VORF9HUkFUVUlUT1VTX0FSUAorCisvKiBleHRlcm4gY2hhciBzeXNjdGxfZGV2bmFtZVtdOyAqLworCisvKgorICogIE1hc3RlciBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIExJU1RfSEVBRChpcmxhbnMpOworCitzdGF0aWMgdm9pZCAqY2tleTsKK3N0YXRpYyB2b2lkICpza2V5OworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBldGg7ICAgLyogVXNlICJldGgiIG9yICJpcmxhbiIgbmFtZSBmb3IgZGV2aWNlcyAqLworc3RhdGljIGludCBhY2Nlc3MgPSBBQ0NFU1NfUEVFUjsgLyogUEVFUiwgRElSRUNUIG9yIEhPU1RFRCAqLworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBjb25zdCBjaGFyICppcmxhbl9hY2Nlc3NbXSA9IHsKKwkiVU5LTk9XTiIsCisJIkRJUkVDVCIsCisJIlBFRVIiLAorCSJIT1NURUQiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaXJsYW5fbWVkaWFbXSA9IHsKKwkiVU5LTk9XTiIsCisJIjgwMi4zIiwKKwkiODAyLjUiCit9OworCitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2lyZGE7CisKK3N0YXRpYyBpbnQgaXJsYW5fc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcmxhbl9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IGlybGFuX3NlcV9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKK2V4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaXJkYTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCitzdGF0aWMgc3RydWN0IGlybGFuX2NiICppcmxhbl9vcGVuKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkcik7CitzdGF0aWMgdm9pZCBfX2lybGFuX2Nsb3NlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZik7CitzdGF0aWMgaW50IF9faXJsYW5faW5zZXJ0X3BhcmFtKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKnBhcmFtLCBpbnQgdHlwZSwgCisJCQkJX191OCB2YWx1ZV9ieXRlLCBfX3UxNiB2YWx1ZV9zaG9ydCwgCisJCQkJX191OCAqdmFsdWVfYXJyYXksIF9fdTE2IHZhbHVlX2xlbik7CitzdGF0aWMgdm9pZCBpcmxhbl9vcGVuX3VuaWNhc3RfYWRkcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpOworc3RhdGljIHZvaWQgaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpOwordm9pZCBpcmxhbl9jbG9zZV90c2FwcyhzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpOworCisvKgorICogRnVuY3Rpb24gaXJsYW5faW5pdCAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIElyTEFOIGxheWVyCisgKgorICovCitzdGF0aWMgaW50IF9faW5pdCBpcmxhbl9pbml0KHZvaWQpCit7CisJc3RydWN0IGlybGFuX2NiICpuZXc7CisJX191MTYgaGludHM7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJeyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CisJcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJpcmxhbiIsIDAsIHByb2NfaXJkYSk7CisJaWYgKCFwcm9jKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXJsYW5faW5pdDogY2FuJ3QgY3JlYXRlIC9wcm9jIGVudHJ5IVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXByb2MtPnByb2NfZm9wcyA9ICZpcmxhbl9mb3BzOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJaGludHMgPSBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQoU19MQU4pOworCisJLyogUmVnaXN0ZXIgd2l0aCBJckxNUCBhcyBhIGNsaWVudCAqLworCWNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9jbGllbnQoaGludHMsICZpcmxhbl9jbGllbnRfZGlzY292ZXJ5X2luZGljYXRpb24sCisJCQkJICAgICBOVUxMLCBOVUxMKTsKKwkKKwkvKiBSZWdpc3RlciB3aXRoIElyTE1QIGFzIGEgc2VydmljZSAqLworIAlza2V5ID0gaXJsbXBfcmVnaXN0ZXJfc2VydmljZShoaW50cyk7CisKKwkvKiBTdGFydCB0aGUgbWFzdGVyIElyTEFOIGluc3RhbmNlICh0aGUgb25seSBvbmUgZm9yIG5vdykgKi8KKyAJbmV3ID0gaXJsYW5fb3BlbihERVZfQUREUl9BTlksIERFVl9BRERSX0FOWSk7CisKKwkvKiBUaGUgbWFzdGVyIHdpbGwgb25seSBvcGVuIGl0cyAobGlzdGVuKSBjb250cm9sIFRTQVAgKi8KKwlpcmxhbl9wcm92aWRlcl9vcGVuX2N0cmxfdHNhcChuZXcpOworCisJLyogRG8gc29tZSBmYXN0IGRpc2NvdmVyeSEgKi8KKwlpcmxtcF9kaXNjb3ZlcnlfcmVxdWVzdChESVNDT1ZFUllfREVGQVVMVF9TTE9UUyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlybGFuX2NsZWFudXAodm9pZCkgCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmLCAqbmV4dDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaXJsbXBfdW5yZWdpc3Rlcl9jbGllbnQoY2tleSk7CisJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNrZXkpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlyZW1vdmVfcHJvY19lbnRyeSgiaXJsYW4iLCBwcm9jX2lyZGEpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKwkvKiBDbGVhbnVwIGFueSBsZWZ0b3ZlciBuZXR3b3JrIGRldmljZXMgKi8KKwlydG5sX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2VsZiwgbmV4dCwgJmlybGFucywgZGV2X2xpc3QpIHsKKwkJX19pcmxhbl9jbG9zZShzZWxmKTsKKwl9CisJcnRubF91bmxvY2soKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX29wZW4gKHZvaWQpCisgKgorICogICAgT3BlbiBuZXcgaW5zdGFuY2Ugb2YgYSBjbGllbnQvcHJvdmlkZXIsIHdlIHNob3VsZCBvbmx5IHJlZ2lzdGVyIHRoZSAKKyAqICAgIG5ldHdvcmsgZGV2aWNlIGlmIHRoaXMgaW5zdGFuY2UgaXMgbWVudCBmb3IgYSBwYXJ0aWN1bGFyIGNsaWVudC9wcm92aWRlcgorICovCitzdGF0aWMgc3RydWN0IGlybGFuX2NiICppcmxhbl9vcGVuKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogQ3JlYXRlIG5ldHdvcmsgZGV2aWNlIHdpdGggaXJsYW4gKi8KKwlkZXYgPSBhbGxvY19pcmxhbmRldihldGggPyAiZXRoJWQiIDogImlybGFuJWQiKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisKKwlzZWxmID0gZGV2LT5wcml2OworCXNlbGYtPmRldiA9IGRldjsKKworCS8qCisJICogIEluaXRpYWxpemUgbG9jYWwgZGV2aWNlIHN0cnVjdHVyZQorCSAqLworCXNlbGYtPm1hZ2ljID0gSVJMQU5fTUFHSUM7CisJc2VsZi0+c2FkZHIgPSBzYWRkcjsKKwlzZWxmLT5kYWRkciA9IGRhZGRyOworCisJLyogUHJvdmlkZXIgYWNjZXNzIGNhbiBvbmx5IGJlIFBFRVIsIERJUkVDVCwgb3IgSE9TVEVEICovCisJc2VsZi0+cHJvdmlkZXIuYWNjZXNzX3R5cGUgPSBhY2Nlc3M7CisJaWYgKGFjY2VzcyA9PSBBQ0NFU1NfRElSRUNUKSB7CisJCS8qICAKKwkJICogU2luY2Ugd2UgYXJlIGVtdWxhdGluZyBhbiBJckxBTiBzZXZlciB3ZSB3aWxsIGhhdmUgdG8KKwkJICogZ2l2ZSBvdXJzZWxmIGFuIGV0aGVybmV0IGFkZHJlc3MhICAKKwkJICovCisJCWRldi0+ZGV2X2FkZHJbMF0gPSAweDQwOworCQlkZXYtPmRldl9hZGRyWzFdID0gMHgwMDsKKwkJZGV2LT5kZXZfYWRkclsyXSA9IDB4MDA7CisJCWRldi0+ZGV2X2FkZHJbM10gPSAweDAwOworCQlnZXRfcmFuZG9tX2J5dGVzKGRldi0+ZGV2X2FkZHIrNCwgMSk7CisJCWdldF9yYW5kb21fYnl0ZXMoZGV2LT5kZXZfYWRkcis1LCAxKTsKKwl9CisKKwlzZWxmLT5tZWRpYSA9IE1FRElBXzgwMl8zOworCXNlbGYtPmRpc2Nvbm5lY3RfcmVhc29uID0gTE1fVVNFUl9SRVFVRVNUOworCWluaXRfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKwlpbml0X3RpbWVyKCZzZWxmLT5jbGllbnQua2lja190aW1lcik7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2VsZi0+b3Blbl93YWl0KTsJCisJCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2VsZi0+Y2xpZW50LnR4cSk7CisJCisJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CisJaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWQhXG4iLCAKKwkJCSAgIF9fRlVOQ1RJT05fXyApOworCQlzZWxmID0gTlVMTDsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9IGVsc2UgeworCQlydG5sX2xvY2soKTsKKwkJbGlzdF9hZGRfcmN1KCZzZWxmLT5kZXZfbGlzdCwgJmlybGFucyk7CisJCXJ0bmxfdW5sb2NrKCk7CisJfQorCisJcmV0dXJuIHNlbGY7Cit9CisvKgorICogRnVuY3Rpb24gX19pcmxhbl9jbG9zZSAoc2VsZikKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGNsb3NlcyBhbmQgZGVhbGxvY2F0ZXMgdGhlIElyTEFOIGNsaWVudCBpbnN0YW5jZXMuIEJlIAorICogICAgYXdhcmUgdGhhdCBvdGhlciBmdW5jdGlvbnMgd2hpY2ggY2FsbHMgY2xpZW50X2Nsb3NlKCkgbXVzdAorICogICAgcmVtb3ZlIHNlbGYgZnJvbSBpcmxhbnMgbGlzdCBmaXJzdC4KKyAqLworc3RhdGljIHZvaWQgX19pcmxhbl9jbG9zZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJQVNTRVJUX1JUTkwoKTsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCWRlbF90aW1lcl9zeW5jKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnNlbGYtPmNsaWVudC5raWNrX3RpbWVyKTsKKworCS8qIENsb3NlIGFsbCBvcGVuIGNvbm5lY3Rpb25zIGFuZCByZW1vdmUgVFNBUHMgKi8KKwlpcmxhbl9jbG9zZV90c2FwcyhzZWxmKTsKKwkKKwlpZiAoc2VsZi0+Y2xpZW50LmlyaWFwKSAKKwkJaXJpYXBfY2xvc2Uoc2VsZi0+Y2xpZW50LmlyaWFwKTsKKworCS8qIFJlbW92ZSBmcmFtZXMgcXVldWVkIG9uIHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKwlza2JfcXVldWVfcHVyZ2UoJnNlbGYtPmNsaWVudC50eHEpOworCisJLyogVW5yZWdpc3RlciBhbmQgZnJlZSBzZWxmIHZpYSBkZXN0cnVjdG9yICovCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Uoc2VsZi0+ZGV2KTsKK30KKworLyogRmluZCBhbnkgaW5zdGFuY2Ugb2YgaXJsYW4sIHVzZWQgZm9yIGNsaWVudCBkaXNjb3Zlcnkgd2FrZXVwICovCitzdHJ1Y3QgaXJsYW5fY2IgKmlybGFuX2dldF9hbnkodm9pZCkKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZWxmLCAmaXJsYW5zLCBkZXZfbGlzdCkgeworCQlyZXR1cm4gc2VsZjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jb25uZWN0X2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHFvcywgbWF4X3NkdV9zaXplLCBza2IpCisgKgorICogICAgSGVyZSB3ZSByZWNlaXZlIHRoZSBjb25uZWN0IGluZGljYXRpb24gZm9yIHRoZSBkYXRhIGNoYW5uZWwKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFuX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsCisJCQkJICAgICBfX3UzMiBtYXhfc2R1X3NpemUsCisJCQkJICAgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwgCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKKwlzdHJ1Y3QgdHNhcF9jYiAqdHNhcDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOworCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHRzYXAgPT0gc2VsZi0+dHNhcF9kYXRhLHJldHVybjspOworCisJc2VsZi0+bWF4X3NkdV9zaXplID0gbWF4X3NkdV9zaXplOworCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKKworCUlSREFfREVCVUcoMCwgIiVzOiBXZSBhcmUgbm93IGNvbm5lY3RlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCS8qIElmIHlvdSB3YW50IHRvIHBhc3MgdGhlIHNrYiB0byAqYm90aCogc3RhdGUgbWFjaGluZXMsIHlvdSB3aWxsCisJICogbmVlZCB0byBza2JfY2xvbmUoKSBpdCwgc28gdGhhdCB5b3UgZG9uJ3QgZnJlZSBpdCB0d2ljZS4KKwkgKiBBcyB0aGUgc3RhdGUgbWFjaGluZXMgZG9uJ3QgbmVlZCBpdCwgZ2l0IHJpZCBvZiBpdCBoZXJlLi4uCisJICogSmVhbiBJSSAqLworCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX0RBVEFfQ09OTkVDVF9JTkRJQ0FUSU9OLCBOVUxMKTsKKwlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fREFUQV9DT05ORUNUX0lORElDQVRJT04sIE5VTEwpOworCisJaWYgKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSB7CisJCS8qIAorCQkgKiBEYXRhIGNoYW5uZWwgaXMgb3Blbiwgc28gd2UgYXJlIG5vdyBhbGxvd2VkIHRvCisJCSAqIGNvbmZpZ3VyZSB0aGUgcmVtb3RlIGZpbHRlciAKKwkJICovCisJCWlybGFuX2dldF91bmljYXN0X2FkZHIoc2VsZik7CisJCWlybGFuX29wZW5fdW5pY2FzdF9hZGRyKHNlbGYpOworCX0KKwkvKiBSZWFkeSB0byB0cmFuc2ZlciBFdGhlcm5ldCBmcmFtZXMgKGF0IGxhc3QpICovCisJbmV0aWZfc3RhcnRfcXVldWUoc2VsZi0+ZGV2KTsgLyogQ2xlYXIgcmVhc29uICovCit9CisKK3N0YXRpYyB2b2lkIGlybGFuX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsIAorCQkJCSAgX191MzIgbWF4X3NkdV9zaXplLAorCQkJCSAgX191OCBtYXhfaGVhZGVyX3NpemUsIAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmOworCisJc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCXNlbGYtPm1heF9zZHVfc2l6ZSA9IG1heF9zZHVfc2l6ZTsKKwlzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CisKKwkvKiBUT0RPOiB3ZSBjb3VsZCBzZXQgdGhlIE1UVSBkZXBlbmRpbmcgb24gdGhlIG1heF9zZHVfc2l6ZSAqLworCisJSVJEQV9ERUJVRygwLCAiJXM6IFdlIGFyZSBub3cgY29ubmVjdGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCS8qIAorCSAqIERhdGEgY2hhbm5lbCBpcyBvcGVuLCBzbyB3ZSBhcmUgbm93IGFsbG93ZWQgdG8gY29uZmlndXJlIHRoZSByZW1vdGUKKwkgKiBmaWx0ZXIgCisJICovCisJaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzZWxmKTsKKwlpcmxhbl9vcGVuX3VuaWNhc3RfYWRkcihzZWxmKTsKKwkKKwkvKiBPcGVuIGJyb2FkY2FzdCBhbmQgbXVsdGljYXN0IGZpbHRlciBieSBkZWZhdWx0ICovCisgCWlybGFuX3NldF9icm9hZGNhc3RfZmlsdGVyKHNlbGYsIFRSVUUpOworIAlpcmxhbl9zZXRfbXVsdGljYXN0X2ZpbHRlcihzZWxmLCBUUlVFKTsKKworCS8qIFJlYWR5IHRvIHRyYW5zZmVyIEV0aGVybmV0IGZyYW1lcyAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKHNlbGYtPmRldik7CisJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSAwOyAvKiBDbGVhciByZWFzb24gKi8KKyNpZmRlZiBDT05GSUdfSVJMQU5fU0VORF9HUkFUVUlUT1VTX0FSUAorCWlybGFuX2V0aF9zZW5kX2dyYXR1aXRvdXNfYXJwKCZzZWxmLT5kZXYpOworI2VuZGlmCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZWxmLT5vcGVuX3dhaXQpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoaGFuZGxlKQorICoKKyAqICAgIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgSXJUVFAgbGF5ZXIuIEluZGljYXRlcyBhIGRpc2Nvbm5lY3Rpb24gb2YKKyAqICAgIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiAoaGFuZGxlKQorICovCitzdGF0aWMgdm9pZCBpcmxhbl9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsCisJCQkJCXZvaWQgKnNhcCwgTE1fUkVBU09OIHJlYXNvbiwgCisJCQkJCXN0cnVjdCBza19idWZmICp1c2VyZGF0YSkgCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmOworCXN0cnVjdCB0c2FwX2NiICp0c2FwOworCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgcmVhc29uPSVkXG4iLCBfX0ZVTkNUSU9OX18gLCByZWFzb24pOworCQorCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOworCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CQorCUlSREFfQVNTRVJUKHRzYXAgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQodHNhcC0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOworCQorCUlSREFfQVNTRVJUKHRzYXAgPT0gc2VsZi0+dHNhcF9kYXRhLCByZXR1cm47KTsKKworCUlSREFfREVCVUcoMiwgIklyTEFOLCBkYXRhIGNoYW5uZWwgZGlzY29ubmVjdGVkIGJ5IHBlZXIhXG4iKTsKKworCS8qIFNhdmUgcmVhc29uIHNvIHdlIGtub3cgaWYgd2Ugc2hvdWxkIHRyeSB0byByZWNvbm5lY3Qgb3Igbm90ICovCisJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSByZWFzb247CisJCisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIExNX1VTRVJfUkVRVUVTVDogLyogVXNlciByZXF1ZXN0ICovCisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVzZXIgcmVxdWVzdGVkXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9MQVBfRElTQ09OTkVDVDogLyogVW5leHBlY3RlZCBJckxBUCBkaXNjb25uZWN0ICovCisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVuZXhwZWN0ZWQgSXJMQVAgZGlzY29ubmVjdFxuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCWNhc2UgTE1fQ09OTkVDVF9GQUlMVVJFOiAvKiBGYWlsZWQgdG8gZXN0YWJsaXNoIElyTEFQIGNvbm5lY3Rpb24gKi8KKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSXJMQVAgY29ubmVjdCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwljYXNlIExNX0xBUF9SRVNFVDogIC8qIElyTEFQIHJlc2V0ICovCisJCUlSREFfREVCVUcoMiwgIiVzKCksIElyTEFQIHJlc2V0XG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9JTklUX0RJU0NPTk5FQ1Q6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIElyTE1QIGNvbm5lY3QgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgVW5rbm93biBkaXNjb25uZWN0IHJlYXNvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJfQorCQorCS8qIElmIHlvdSB3YW50IHRvIHBhc3MgdGhlIHNrYiB0byAqYm90aCogc3RhdGUgbWFjaGluZXMsIHlvdSB3aWxsCisJICogbmVlZCB0byBza2JfY2xvbmUoKSBpdCwgc28gdGhhdCB5b3UgZG9uJ3QgZnJlZSBpdCB0d2ljZS4KKwkgKiBBcyB0aGUgc3RhdGUgbWFjaGluZXMgZG9uJ3QgbmVlZCBpdCwgZ2l0IHJpZCBvZiBpdCBoZXJlLi4uCisJICogSmVhbiBJSSAqLworCWlmICh1c2VyZGF0YSkKKwkJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CisKKwlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fTE1QX0RJU0NPTk5FQ1QsIE5VTEwpOworCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX0xNUF9ESVNDT05ORUNULCBOVUxMKTsKKwkKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlbGYtPm9wZW5fd2FpdCk7Cit9CisKK3ZvaWQgaXJsYW5fb3Blbl9kYXRhX3RzYXAoc3RydWN0IGlybGFuX2NiICpzZWxmKQoreworCXN0cnVjdCB0c2FwX2NiICp0c2FwOworCW5vdGlmeV90IG5vdGlmeTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBDaGVjayBpZiBhbHJlYWR5IG9wZW4gKi8KKwlpZiAoc2VsZi0+dHNhcF9kYXRhKQorCQlyZXR1cm47CisKKwlpcmRhX25vdGlmeV9pbml0KCZub3RpZnkpOworCQorCW5vdGlmeS5kYXRhX2luZGljYXRpb24gICAgICAgPSBpcmxhbl9ldGhfcmVjZWl2ZTsKKwlub3RpZnkudWRhdGFfaW5kaWNhdGlvbiAgICAgID0gaXJsYW5fZXRoX3JlY2VpdmU7CisJbm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbiAgICA9IGlybGFuX2Nvbm5lY3RfaW5kaWNhdGlvbjsKKwlub3RpZnkuY29ubmVjdF9jb25maXJtICAgICAgID0gaXJsYW5fY29ubmVjdF9jb25maXJtOworIAlub3RpZnkuZmxvd19pbmRpY2F0aW9uICAgICAgID0gaXJsYW5fZXRoX2Zsb3dfaW5kaWNhdGlvbjsKKwlub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gaXJsYW5fZGlzY29ubmVjdF9pbmRpY2F0aW9uOworCW5vdGlmeS5pbnN0YW5jZSAgICAgICAgICAgICAgPSBzZWxmOworCXN0cmxjcHkobm90aWZ5Lm5hbWUsICJJckxBTiBkYXRhIiwgc2l6ZW9mKG5vdGlmeS5uYW1lKSk7CisKKwl0c2FwID0gaXJ0dHBfb3Blbl90c2FwKExTQVBfQU5ZLCBERUZBVUxUX0lOSVRJQUxfQ1JFRElULCAmbm90aWZ5KTsKKwlpZiAoIXRzYXApIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgR290IG5vIHRzYXAhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuOworCX0KKwlzZWxmLT50c2FwX2RhdGEgPSB0c2FwOworCisJLyogCisJICogIFRoaXMgaXMgdGhlIGRhdGEgVFNBUCBzZWxlY3RvciB3aGljaCB3ZSB3aWxsIHBhc3MgdG8gdGhlIGNsaWVudAorCSAqICB3aGVuIHRoZSBjbGllbnQgYXNrIGZvciBpdC4KKwkgKi8KKwlzZWxmLT5zdHNhcF9zZWxfZGF0YSA9IHNlbGYtPnRzYXBfZGF0YS0+c3RzYXBfc2VsOworfQorCit2b2lkIGlybGFuX2Nsb3NlX3RzYXBzKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisJLyogRGlzY29ubmVjdCBhbmQgY2xvc2UgYWxsIG9wZW4gVFNBUCBjb25uZWN0aW9ucyAqLworCWlmIChzZWxmLT50c2FwX2RhdGEpIHsKKwkJaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXBfZGF0YSwgTlVMTCwgUF9OT1JNQUwpOworCQlpcnR0cF9jbG9zZV90c2FwKHNlbGYtPnRzYXBfZGF0YSk7CisJCXNlbGYtPnRzYXBfZGF0YSA9IE5VTEw7CisJfQorCWlmIChzZWxmLT5jbGllbnQudHNhcF9jdHJsKSB7CisJCWlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5jbGllbnQudHNhcF9jdHJsLCBOVUxMLCAKKwkJCQkJIFBfTk9STUFMKTsKKwkJaXJ0dHBfY2xvc2VfdHNhcChzZWxmLT5jbGllbnQudHNhcF9jdHJsKTsKKwkJc2VsZi0+Y2xpZW50LnRzYXBfY3RybCA9IE5VTEw7CisJfQorCWlmIChzZWxmLT5wcm92aWRlci50c2FwX2N0cmwpIHsKKwkJaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnByb3ZpZGVyLnRzYXBfY3RybCwgTlVMTCwgCisJCQkJCSBQX05PUk1BTCk7CisJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsKTsKKwkJc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsID0gTlVMTDsKKwl9CisJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSBMTV9VU0VSX1JFUVVFU1Q7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9pYXNfcmVnaXN0ZXIgKHNlbGYsIHRzYXBfc2VsKQorICoKKyAqICAgIFJlZ2lzdGVyIHdpdGggTE0tSUFTCisgKgorICovCit2b2lkIGlybGFuX2lhc19yZWdpc3RlcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIF9fdTggdHNhcF9zZWwpCit7CisJc3RydWN0IGlhc19vYmplY3QgKm9iajsKKwlzdHJ1Y3QgaWFzX3ZhbHVlICpuZXdfdmFsdWU7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKwkKKwkvKiAKKwkgKiBDaGVjayBpZiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGJ5IGEgcHJldmlvdXMgcHJvdmlkZXIuCisJICogSWYgdGhhdCBpcyB0aGUgY2FzZSwgd2UganVzdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKKwkgKi8KKwlpZiAoIWlyaWFzX2ZpbmRfb2JqZWN0KCJJckxBTiIpKSB7CisJCW9iaiA9IGlyaWFzX25ld19vYmplY3QoIklyTEFOIiwgSUFTX0lSTEFOX0lEKTsKKwkJaXJpYXNfYWRkX2ludGVnZXJfYXR0cmliKG9iaiwgIklyREE6VGlueVRQOkxzYXBTZWwiLCB0c2FwX3NlbCwKKwkJCQkJIElBU19LRVJORUxfQVRUUik7CisJCWlyaWFzX2luc2VydF9vYmplY3Qob2JqKTsKKwl9IGVsc2UgeworCQluZXdfdmFsdWUgPSBpcmlhc19uZXdfaW50ZWdlcl92YWx1ZSh0c2FwX3NlbCk7CisJCWlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlKCJJckxBTiIsICJJckRBOlRpbnlUUDpMc2FwU2VsIiwKKwkJCQkJICAgICAgbmV3X3ZhbHVlKTsKKwl9CisJCisgICAgICAgIC8qIFJlZ2lzdGVyIFBuUCBvYmplY3Qgb25seSBpZiBub3QgcmVnaXN0ZXJlZCBiZWZvcmUgKi8KKyAgICAgICAgaWYgKCFpcmlhc19maW5kX29iamVjdCgiUG5QIikpIHsKKwkJb2JqID0gaXJpYXNfbmV3X29iamVjdCgiUG5QIiwgSUFTX1BOUF9JRCk7CisjaWYgMAorCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJOYW1lIiwgc3lzY3RsX2Rldm5hbWUsCisJCQkJCUlBU19LRVJORUxfQVRUUik7CisjZWxzZQorCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJOYW1lIiwgIkxpbnV4IiwgSUFTX0tFUk5FTF9BVFRSKTsKKyNlbmRpZgorCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJEZXZpY2VJRCIsICJIV1AxOUYwIiwKKwkJCQkJSUFTX0tFUk5FTF9BVFRSKTsKKwkJaXJpYXNfYWRkX2ludGVnZXJfYXR0cmliKG9iaiwgIkNvbXBDbnQiLCAxLCBJQVNfS0VSTkVMX0FUVFIpOworCQlpZiAoc2VsZi0+cHJvdmlkZXIuYWNjZXNzX3R5cGUgPT0gQUNDRVNTX1BFRVIpCisJCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJDb21wIzAxIiwgIlBOUDgzODkiLAorCQkJCQkJSUFTX0tFUk5FTF9BVFRSKTsKKwkJZWxzZQorCQkJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiQ29tcCMwMSIsICJQTlA4Mjk0IiwKKwkJCQkJCUlBU19LRVJORUxfQVRUUik7CisKKwkJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiTWFudWZhY3R1cmVyIiwKKwkJCQkJIkxpbnV4LUlyREEgUHJvamVjdCIsIElBU19LRVJORUxfQVRUUik7CisJCWlyaWFzX2luc2VydF9vYmplY3Qob2JqKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9ydW5fY3RybF90eF9xdWV1ZSAoc2VsZikKKyAqCisgKiAgICBUcnkgdG8gc2VuZCB0aGUgbmV4dCBjb21tYW5kIGluIHRoZSBjb250cm9sIHRyYW5zbWl0IHF1ZXVlCisgKgorICovCitpbnQgaXJsYW5fcnVuX2N0cmxfdHhfcXVldWUoc3RydWN0IGlybGFuX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWlmIChpcmRhX2xvY2soJnNlbGYtPmNsaWVudC50eF9idXN5KSA9PSBGQUxTRSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT5jbGllbnQudHhxKTsKKwlpZiAoIXNrYikgeworCQlzZWxmLT5jbGllbnQudHhfYnVzeSA9IEZBTFNFOworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogQ2hlY2sgdGhhdCBpdCdzIHJlYWxseSBwb3NzaWJsZSB0byBzZW5kIGNvbW1hbmRzICovCisJaWYgKChzZWxmLT5jbGllbnQudHNhcF9jdHJsID09IE5VTEwpIHx8IAorCSAgICAoc2VsZi0+Y2xpZW50LnN0YXRlID09IElSTEFOX0lETEUpKSAKKwl7CisJCXNlbGYtPmNsaWVudC50eF9idXN5ID0gRkFMU0U7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlJUkRBX0RFQlVHKDIsICIlcygpLCBzZW5kaW5nIC4uLlxuIiwgX19GVU5DVElPTl9fICk7CisKKwlyZXR1cm4gaXJ0dHBfZGF0YV9yZXF1ZXN0KHNlbGYtPmNsaWVudC50c2FwX2N0cmwsIHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdCAoc2VsZiwgc2tiKQorICoKKyAqICAgIFRoaXMgZnVuY3Rpb24gbWFrZXMgc3VyZSB0aGF0IGNvbW1hbmRzIG9uIHRoZSBjb250cm9sIGNoYW5uZWwgaXMgYmVpbmcKKyAqICAgIHNlbnQgaW4gYSBjb21tYW5kL3Jlc3BvbnNlIGZhc2hpb24KKyAqLworc3RhdGljIHZvaWQgaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc3RydWN0IGlybGFuX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogUXVldWUgY29tbWFuZCAqLworCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT5jbGllbnQudHhxLCBza2IpOworCisJLyogVHJ5IHRvIHNlbmQgY29tbWFuZCAqLworCWlybGFuX3J1bl9jdHJsX3R4X3F1ZXVlKHNlbGYpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fZ2V0X3Byb3ZpZGVyX2luZm8gKHNlbGYpCisgKgorICogICAgU2VuZCBHZXQgUHJvdmlkZXIgSW5mb3JtYXRpb24gY29tbWFuZCB0byBwZWVyIElyTEFOIGxheWVyCisgKgorICovCit2b2lkIGlybGFuX2dldF9wcm92aWRlcl9pbmZvKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCV9fdTggKmZyYW1lOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCisJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKKwlza2JfcHV0KHNrYiwgMik7CisJCisJZnJhbWUgPSBza2ItPmRhdGE7CisJCisgCWZyYW1lWzBdID0gQ01EX0dFVF9QUk9WSURFUl9JTkZPOworCWZyYW1lWzFdID0gMHgwMDsgICAgICAgICAgICAgICAgIC8qIFplcm8gcGFyYW1ldGVycyAqLworCQorCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9vcGVuX2RhdGFfY2hhbm5lbCAoc2VsZikKKyAqCisgKiAgICBTZW5kIGFuIE9wZW4gRGF0YSBDb21tYW5kIHRvIHByb3ZpZGVyCisgKgorICovCit2b2lkIGlybGFuX29wZW5fZGF0YV9jaGFubmVsKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikgCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlfX3U4ICpmcmFtZTsKKwkKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCQorCXNrYiA9IGRldl9hbGxvY19za2IoNjQpOworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwlza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQoc2tiLCAyKTsKKwkKKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKwkKKwkvKiBCdWlsZCBmcmFtZSAqLworIAlmcmFtZVswXSA9IENNRF9PUEVOX0RBVEFfQ0hBTk5FTDsKKwlmcmFtZVsxXSA9IDB4MDI7IC8qIFR3byBwYXJhbWV0ZXJzICovCisKKwlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIk1FRElBIiwgIjgwMi4zIik7CisJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJBQ0NFU1NfVFlQRSIsICJESVJFQ1QiKTsKKwkvKiBpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIk1PREUiLCAiVU5SRUxJQUJMRSIpOyAqLworCisvKiAJc2VsZi0+dXNlX3VkYXRhID0gVFJVRTsgKi8KKworCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cit9CisKK3ZvaWQgaXJsYW5fY2xvc2VfZGF0YV9jaGFubmVsKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikgCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlfX3U4ICpmcmFtZTsKKwkKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisJLyogQ2hlY2sgaWYgdGhlIFRTQVAgaXMgc3RpbGwgdGhlcmUgKi8KKwlpZiAoc2VsZi0+Y2xpZW50LnRzYXBfY3RybCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKKwlza2JfcHV0KHNrYiwgMik7CisJCisJZnJhbWUgPSBza2ItPmRhdGE7CisJCisJLyogQnVpbGQgZnJhbWUgKi8KKyAJZnJhbWVbMF0gPSBDTURfQ0xPU0VfREFUQV9DSEFOOworCWZyYW1lWzFdID0gMHgwMTsgLyogVHdvIHBhcmFtZXRlcnMgKi8KKworCWlybGFuX2luc2VydF9ieXRlX3BhcmFtKHNrYiwgIkRBVEFfQ0hBTiIsIHNlbGYtPmR0c2FwX3NlbF9kYXRhKTsKKworCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9vcGVuX3VuaWNhc3RfYWRkciAoc2VsZikKKyAqCisgKiAgICBNYWtlIElyTEFOIHByb3ZpZGVyIGFjY2VwdCBldGhlcm5ldCBmcmFtZXMgYWRkcmVzc2VkIHRvIHRoZSB1bmljYXN0IAorICogICAgYWRkcmVzcy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFuX29wZW5fdW5pY2FzdF9hZGRyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCV9fdTggKmZyYW1lOworCQorCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CQorCQorCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCisJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQoc2tiLCAyKTsKKwkKKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKwkKKyAJZnJhbWVbMF0gPSBDTURfRklMVEVSX09QRVJBVElPTjsKKwlmcmFtZVsxXSA9IDB4MDM7ICAgICAgICAgICAgICAgICAvKiBUaHJlZSBwYXJhbWV0ZXJzICovCisgCWlybGFuX2luc2VydF9ieXRlX3BhcmFtKHNrYiwgIkRBVEFfQ0hBTiIgLCBzZWxmLT5kdHNhcF9zZWxfZGF0YSk7CisgCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX1RZUEUiLCAiRElSRUNURUQiKTsKKyAJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfTU9ERSIsICJGSUxURVIiKTsgCisJCisJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX3NldF9icm9hZGNhc3RfZmlsdGVyIChzZWxmLCBzdGF0dXMpCisgKgorICogICAgTWFrZSBJckxBTiBwcm92aWRlciBhY2NlcHQgZXRoZXJuZXQgZnJhbWVzIGFkZHJlc3NlZCB0byB0aGUgYnJvYWRjYXN0CisgKiAgICBhZGRyZXNzLiBCZSBjYXJlZnVsIHdpdGggdGhlIHVzZSBvZiB0aGlzIG9uZSwgc2luY2UgdGhlcmUgbWF5IGJlIGEgbG90CisgKiAgICBvZiBicm9hZGNhc3QgdHJhZmZpYyBvdXQgdGhlcmUuIFdlIGNhbiBzdGlsbCBmdW5jdGlvbiB3aXRob3V0IHRoaXMKKyAqICAgIG9uZSBidXQgdGhlbiBfd2VfIGhhdmUgdG8gaW5pdGlhdGUgYWxsIGNvbW11bmljYXRpb24gd2l0aCBvdGhlcgorICogICAgaG9zdHMsIHNpbmNlIEFSUCByZXF1ZXN0IGZvciB0aGlzIGhvc3Qgd2lsbCBub3QgYmUgYW5zd2VyZWQuCisgKi8KK3ZvaWQgaXJsYW5fc2V0X2Jyb2FkY2FzdF9maWx0ZXIoc3RydWN0IGlybGFuX2NiICpzZWxmLCBpbnQgc3RhdHVzKSAKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCV9fdTggKmZyYW1lOworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisJCisgCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCisJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKKwlza2JfcHV0KHNrYiwgMik7CisJCisJZnJhbWUgPSBza2ItPmRhdGE7CisJCisgCWZyYW1lWzBdID0gQ01EX0ZJTFRFUl9PUEVSQVRJT047CisJZnJhbWVbMV0gPSAweDAzOyAgICAgICAgICAgICAgICAgLyogVGhyZWUgcGFyYW1ldGVycyAqLworIAlpcmxhbl9pbnNlcnRfYnl0ZV9wYXJhbShza2IsICJEQVRBX0NIQU4iLCBzZWxmLT5kdHNhcF9zZWxfZGF0YSk7CisgCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX1RZUEUiLCAiQlJPQURDQVNUIik7CisJaWYgKHN0YXR1cykKKwkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfTU9ERSIsICJGSUxURVIiKTsgCisJZWxzZQorCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9NT0RFIiwgIk5PTkUiKTsgCisKKwlpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fc2V0X211bHRpY2FzdF9maWx0ZXIgKHNlbGYsIHN0YXR1cykKKyAqCisgKiAgICBNYWtlIElyTEFOIHByb3ZpZGVyIGFjY2VwdCBldGhlcm5ldCBmcmFtZXMgYWRkcmVzc2VkIHRvIHRoZSBtdWx0aWNhc3QKKyAqICAgIGFkZHJlc3MuIAorICoKKyAqLwordm9pZCBpcmxhbl9zZXRfbXVsdGljYXN0X2ZpbHRlcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIGludCBzdGF0dXMpIAoreworCXN0cnVjdCBza19idWZmICpza2I7CisJX191OCAqZnJhbWU7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworIAlza2IgPSBkZXZfYWxsb2Nfc2tiKDEyOCk7CisJaWYgKCFza2IpCisJCXJldHVybjsKKwkKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KKwlza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQoc2tiLCAyKTsKKwkKKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKwkKKyAJZnJhbWVbMF0gPSBDTURfRklMVEVSX09QRVJBVElPTjsKKwlmcmFtZVsxXSA9IDB4MDM7ICAgICAgICAgICAgICAgICAvKiBUaHJlZSBwYXJhbWV0ZXJzICovCisgCWlybGFuX2luc2VydF9ieXRlX3BhcmFtKHNrYiwgIkRBVEFfQ0hBTiIsIHNlbGYtPmR0c2FwX3NlbF9kYXRhKTsKKyAJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJNVUxUSUNBU1QiKTsKKwlpZiAoc3RhdHVzKQorCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9NT0RFIiwgIkFMTCIpOyAKKwllbHNlCisJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiTk9ORSIpOyAKKworCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9nZXRfdW5pY2FzdF9hZGRyIChzZWxmKQorICoKKyAqICAgIFJldHJpZXZlcyB0aGUgdW5pY2FzdCBhZGRyZXNzIGZyb20gdGhlIElyTEFOIHByb3ZpZGVyLiBUaGlzIGFkZHJlc3MKKyAqICAgIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgZGV2aWNlcyBzdHJ1Y3R1cmUsIHNvIHRoZSBldGhlcm5ldCBsYXllcgorICogICAgY2FuIGNvbnN0cnVjdCBpdHMgcGFja2V0cy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFuX2dldF91bmljYXN0X2FkZHIoc3RydWN0IGlybGFuX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJX191OCAqZnJhbWU7CisJCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisJCisJc2tiID0gZGV2X2FsbG9jX3NrYigxMjgpOworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KKwlza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQoc2tiLCAyKTsKKwkKKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKwkKKyAJZnJhbWVbMF0gPSBDTURfRklMVEVSX09QRVJBVElPTjsKKwlmcmFtZVsxXSA9IDB4MDM7ICAgICAgICAgICAgICAgICAvKiBUaHJlZSBwYXJhbWV0ZXJzICovCisgCWlybGFuX2luc2VydF9ieXRlX3BhcmFtKHNrYiwgIkRBVEFfQ0hBTiIsIHNlbGYtPmR0c2FwX3NlbF9kYXRhKTsKKyAJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJESVJFQ1RFRCIpOworIAlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9PUEVSQVRJT04iLCAiRFlOQU1JQyIpOyAKKwkKKwlpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fZ2V0X21lZGlhX2NoYXIgKHNlbGYpCisgKgorICogICAgCisgKgorICovCit2b2lkIGlybGFuX2dldF9tZWRpYV9jaGFyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikgCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlfX3U4ICpmcmFtZTsKKwkKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCQorCXNrYiA9IGRldl9hbGxvY19za2IoNjQpOworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KKwlza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQoc2tiLCAyKTsKKwkKKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKwkKKwkvKiBCdWlsZCBmcmFtZSAqLworIAlmcmFtZVswXSA9IENNRF9HRVRfTUVESUFfQ0hBUjsKKwlmcmFtZVsxXSA9IDB4MDE7IC8qIE9uZSBwYXJhbWV0ZXIgKi8KKwkKKwlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIk1FRElBIiwgIjgwMi4zIik7CisJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGluc2VydF9ieXRlX3BhcmFtIChza2IsIHBhcmFtLCB2YWx1ZSkKKyAqCisgKiAgICBJbnNlcnQgYnl0ZSBwYXJhbWV0ZXIgaW50byBmcmFtZQorICoKKyAqLworaW50IGlybGFuX2luc2VydF9ieXRlX3BhcmFtKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKnBhcmFtLCBfX3U4IHZhbHVlKQoreworCXJldHVybiBfX2lybGFuX2luc2VydF9wYXJhbShza2IsIHBhcmFtLCBJUkxBTl9CWVRFLCB2YWx1ZSwgMCwgTlVMTCwgMCk7Cit9CisKK2ludCBpcmxhbl9pbnNlcnRfc2hvcnRfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqcGFyYW0sIF9fdTE2IHZhbHVlKQoreworCXJldHVybiBfX2lybGFuX2luc2VydF9wYXJhbShza2IsIHBhcmFtLCBJUkxBTl9TSE9SVCwgMCwgdmFsdWUsIE5VTEwsIDApOworfQorCisvKgorICogRnVuY3Rpb24gaW5zZXJ0X3N0cmluZyAoc2tiLCBwYXJhbSwgdmFsdWUpCisgKgorICogICAgSW5zZXJ0IHN0cmluZyBwYXJhbWV0ZXIgaW50byBmcmFtZQorICoKKyAqLworaW50IGlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqcGFyYW0sIGNoYXIgKnN0cmluZykKK3sKKwlpbnQgc3RyaW5nX2xlbiA9IHN0cmxlbihzdHJpbmcpOworCisJcmV0dXJuIF9faXJsYW5faW5zZXJ0X3BhcmFtKHNrYiwgcGFyYW0sIElSTEFOX0FSUkFZLCAwLCAwLCBzdHJpbmcsIAorCQkJCSAgICBzdHJpbmdfbGVuKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGluc2VydF9hcnJheV9wYXJhbShza2IsIHBhcmFtLCB2YWx1ZSwgbGVuX3ZhbHVlKQorICoKKyAqICAgIEluc2VydCBhcnJheSBwYXJhbWV0ZXIgaW50byBmcmFtZQorICoKKyAqLworaW50IGlybGFuX2luc2VydF9hcnJheV9wYXJhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpuYW1lLCBfX3U4ICphcnJheSwKKwkJCSAgICAgX191MTYgYXJyYXlfbGVuKQoreworCXJldHVybiBfX2lybGFuX2luc2VydF9wYXJhbShza2IsIG5hbWUsIElSTEFOX0FSUkFZLCAwLCAwLCBhcnJheSwgCisJCQkJICAgIGFycmF5X2xlbik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpbnNlcnRfcGFyYW0gKHNrYiwgcGFyYW0sIHZhbHVlLCBieXRlKQorICoKKyAqICAgIEluc2VydCBwYXJhbWV0ZXIgYXQgZW5kIG9mIGJ1ZmZlciwgc3RydWN0dXJlIG9mIGEgcGFyYW1ldGVyIGlzOgorICoKKyAqICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICB8IE5hbWUgTGVuZ3RoWzFdIHwgUGFyYW0gTmFtZVsxLi4yNTVdIHwgVmFsIExlbmd0aFsyXSB8IFZhbHVlWzAuLjEwMTZdfAorICogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBfX2lybGFuX2luc2VydF9wYXJhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpwYXJhbSwgaW50IHR5cGUsIAorCQkJCV9fdTggdmFsdWVfYnl0ZSwgX191MTYgdmFsdWVfc2hvcnQsIAorCQkJCV9fdTggKnZhbHVlX2FycmF5LCBfX3UxNiB2YWx1ZV9sZW4pCit7CisJX191OCAqZnJhbWU7CisJX191OCBwYXJhbV9sZW47CisJX191MTYgdG1wX2xlOyAvKiBUZW1wb3JhcnkgdmFsdWUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KKwlpbnQgbj0wOworCQorCWlmIChza2IgPT0gTlVMTCkgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBHb3QgTlVMTCBza2JcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gMDsKKwl9CQorCisJcGFyYW1fbGVuID0gc3RybGVuKHBhcmFtKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSTEFOX0JZVEU6CisJCXZhbHVlX2xlbiA9IDE7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fU0hPUlQ6CisJCXZhbHVlX2xlbiA9IDI7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fQVJSQVk6CisJCUlSREFfQVNTRVJUKHZhbHVlX2FycmF5ICE9IE5VTEwsIHJldHVybiAwOyk7CisJCUlSREFfQVNTRVJUKHZhbHVlX2xlbiA+IDAsIHJldHVybiAwOyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gcGFyYW1ldGVyIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCX0KKwkKKwkvKiBJbnNlcnQgYXQgZW5kIG9mIHNrLWJ1ZmZlciAqLworCWZyYW1lID0gc2tiLT50YWlsOworCisJLyogTWFrZSBzcGFjZSBmb3IgZGF0YSAqLworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IChwYXJhbV9sZW4rdmFsdWVfbGVuKzMpKSB7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIE5vIG1vcmUgc3BhY2UgYXQgZW5kIG9mIHNrYlxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAwOworCX0JCisJc2tiX3B1dChza2IsIHBhcmFtX2xlbit2YWx1ZV9sZW4rMyk7CisJCisJLyogSW5zZXJ0IHBhcmFtZXRlciBsZW5ndGggKi8KKwlmcmFtZVtuKytdID0gcGFyYW1fbGVuOworCQorCS8qIEluc2VydCBwYXJhbWV0ZXIgKi8KKwltZW1jcHkoZnJhbWUrbiwgcGFyYW0sIHBhcmFtX2xlbik7IG4gKz0gcGFyYW1fbGVuOworCQorCS8qIEluc2VydCB2YWx1ZSBsZW5ndGggKDIgYnl0ZSBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgTFNCIGZpcnN0KSAqLworCXRtcF9sZSA9IGNwdV90b19sZTE2KHZhbHVlX2xlbik7CisJbWVtY3B5KGZyYW1lK24sICZ0bXBfbGUsIDIpOyBuICs9IDI7IC8qIFRvIGF2b2lkIGFsaWdubWVudCBwcm9ibGVtcyAqLworCisJLyogSW5zZXJ0IHZhbHVlICovCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUkxBTl9CWVRFOgorCQlmcmFtZVtuKytdID0gdmFsdWVfYnl0ZTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9TSE9SVDoKKwkJdG1wX2xlID0gY3B1X3RvX2xlMTYodmFsdWVfc2hvcnQpOworCQltZW1jcHkoZnJhbWUrbiwgJnRtcF9sZSwgMik7IG4gKz0gMjsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9BUlJBWToKKwkJbWVtY3B5KGZyYW1lK24sIHZhbHVlX2FycmF5LCB2YWx1ZV9sZW4pOyBuKz12YWx1ZV9sZW47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlJUkRBX0FTU0VSVChuID09IChwYXJhbV9sZW4rdmFsdWVfbGVuKzMpLCByZXR1cm4gMDspOworCisJcmV0dXJuIHBhcmFtX2xlbit2YWx1ZV9sZW4rMzsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2V4dHJhY3RfcGFyYW0gKGJ1ZiwgbmFtZSwgdmFsdWUsIGxlbikKKyAqCisgKiAgICBFeHRyYWN0cyBhIHNpbmdsZSBwYXJhbWV0ZXIgbmFtZS92YWx1ZSBwYWlyIGZyb20gYnVmZmVyIGFuZCB1cGRhdGVzCisgKiAgICB0aGUgYnVmZmVyIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIG5leHQgbmFtZS92YWx1ZSBwYWlyLiAKKyAqLworaW50IGlybGFuX2V4dHJhY3RfcGFyYW0oX191OCAqYnVmLCBjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSwgX191MTYgKmxlbikKK3sKKwlfX3U4IG5hbWVfbGVuOworCV9fdTE2IHZhbF9sZW47CisJaW50IG49MDsKKwkKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwkvKiBnZXQgbGVuZ3RoIG9mIHBhcmFtZXRlciBuYW1lICgxIGJ5dGUpICovCisJbmFtZV9sZW4gPSBidWZbbisrXTsKKwkKKwlpZiAobmFtZV9sZW4gPiAyNTQpIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgbmFtZV9sZW4gPiAyNTRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gLVJTUF9JTlZBTElEX0NPTU1BTkRfRk9STUFUOworCX0KKwkKKwkvKiBnZXQgcGFyYW1ldGVyIG5hbWUgKi8KKwltZW1jcHkobmFtZSwgYnVmK24sIG5hbWVfbGVuKTsKKwluYW1lW25hbWVfbGVuXSA9ICdcMCc7CisJbis9bmFtZV9sZW47CisJCisJLyogIAorCSAqICBHZXQgbGVuZ3RoIG9mIHBhcmFtZXRlciB2YWx1ZSAoMiBieXRlcyBpbiBsaXR0bGUgZW5kaWFuIAorCSAqICBmb3JtYXQpIAorCSAqLworCW1lbWNweSgmdmFsX2xlbiwgYnVmK24sIDIpOyAvKiBUbyBhdm9pZCBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KKwlsZTE2X3RvX2NwdXMoJnZhbF9sZW4pOyBuKz0yOworCQorCWlmICh2YWxfbGVuID4gMTAxNikgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBwYXJhbWV0ZXIgbGVuZ3RoIHRvIGxvbmdcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gLVJTUF9JTlZBTElEX0NPTU1BTkRfRk9STUFUOworCX0KKwkqbGVuID0gdmFsX2xlbjsKKworCS8qIGdldCBwYXJhbWV0ZXIgdmFsdWUgKi8KKwltZW1jcHkodmFsdWUsIGJ1ZituLCB2YWxfbGVuKTsKKwl2YWx1ZVt2YWxfbGVuXSA9ICdcMCc7CisJbis9dmFsX2xlbjsKKwkKKwlJUkRBX0RFQlVHKDQsICJQYXJhbWV0ZXI6ICVzICIsIG5hbWUpOyAKKwlJUkRBX0RFQlVHKDQsICJWYWx1ZTogJXNcbiIsIHZhbHVlKTsgCisKKwlyZXR1cm4gbjsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKKy8qCisgKiBTdGFydCBvZiByZWFkaW5nIC9wcm9jIGVudHJpZXMuCisgKiBSZXR1cm4gZW50cnkgYXQgcG9zLCAKKyAqCW9yIHN0YXJ0X3Rva2VuIHRvIGluZGljYXRlIHByaW50IGhlYWRlciBsaW5lCisgKglvciBOVUxMIGlmIGVuZCBvZiBmaWxlCisgKi8KK3N0YXRpYyB2b2lkICppcmxhbl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCWludCBpID0gMTsKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKCpwb3MgPT0gMCkKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VsZiwgJmlybGFucywgZGV2X2xpc3QpIHsKKwkJaWYgKCpwb3MgPT0gaSkgCisJCQlyZXR1cm4gc2VsZjsKKwkJKytpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIGVudHJ5IGFmdGVyIHYsIGFuZCBpbmNyZW1lbnQgcG9zICovCitzdGF0aWMgdm9pZCAqaXJsYW5fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm54dDsKKworCSsrKnBvczsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIAorCQlueHQgPSBpcmxhbnMubmV4dDsKKwllbHNlCisJCW54dCA9ICgoc3RydWN0IGlybGFuX2NiICopdiktPmRldl9saXN0Lm5leHQ7CisKKwlyZXR1cm4gKG54dCA9PSAmaXJsYW5zKSA/IE5VTEwgCisJCTogbGlzdF9lbnRyeShueHQsIHN0cnVjdCBpcmxhbl9jYiwgZGV2X2xpc3QpOworfQorCisvKiBFbmQgb2YgcmVhZGluZyAvcHJvYyBmaWxlICovCitzdGF0aWMgdm9pZCBpcmxhbl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworCisvKgorICogU2hvdyBvbmUgZW50cnkgaW4gL3Byb2MgZmlsZS4KKyAqLworc3RhdGljIGludCBpcmxhbl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgIklyTEFOIGluc3RhbmNlczpcbiIpOworCWVsc2UgeworCQlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSB2OworCQkKKwkJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtMTspOworCisJCXNlcV9wcmludGYoc2VxLCJpZm5hbWU6ICVzLFxuIiwKKwkJCSAgICAgICBzZWxmLT5kZXYtPm5hbWUpOworCQlzZXFfcHJpbnRmKHNlcSwiY2xpZW50IHN0YXRlOiAlcywgIiwKKwkJCSAgICAgICBpcmxhbl9zdGF0ZVsgc2VsZi0+Y2xpZW50LnN0YXRlXSk7CisJCXNlcV9wcmludGYoc2VxLCJwcm92aWRlciBzdGF0ZTogJXMsXG4iLAorCQkJICAgICAgIGlybGFuX3N0YXRlWyBzZWxmLT5wcm92aWRlci5zdGF0ZV0pOworCQlzZXFfcHJpbnRmKHNlcSwic2FkZHI6ICUjMDh4LCAiLAorCQkJICAgICAgIHNlbGYtPnNhZGRyKTsKKwkJc2VxX3ByaW50ZihzZXEsImRhZGRyOiAlIzA4eFxuIiwKKwkJCSAgICAgICBzZWxmLT5kYWRkcik7CisJCXNlcV9wcmludGYoc2VxLCJ2ZXJzaW9uOiAlZC4lZCxcbiIsCisJCQkgICAgICAgc2VsZi0+dmVyc2lvblsxXSwgc2VsZi0+dmVyc2lvblswXSk7CisJCXNlcV9wcmludGYoc2VxLCJhY2Nlc3MgdHlwZTogJXNcbiIsIAorCQkJICAgICAgIGlybGFuX2FjY2Vzc1tzZWxmLT5jbGllbnQuYWNjZXNzX3R5cGVdKTsKKwkJc2VxX3ByaW50ZihzZXEsIm1lZGlhOiAlc1xuIiwgCisJCQkgICAgICAgaXJsYW5fbWVkaWFbc2VsZi0+bWVkaWFdKTsKKwkJCisJCXNlcV9wcmludGYoc2VxLCJsb2NhbCBmaWx0ZXI6XG4iKTsKKwkJc2VxX3ByaW50ZihzZXEsInJlbW90ZSBmaWx0ZXI6ICIpOworCQlpcmxhbl9wcmludF9maWx0ZXIoc2VxLCBzZWxmLT5jbGllbnQuZmlsdGVyX3R5cGUpOworCQlzZXFfcHJpbnRmKHNlcSwidHggYnVzeTogJXNcbiIsIAorCQkJICAgICAgIG5ldGlmX3F1ZXVlX3N0b3BwZWQoc2VsZi0+ZGV2KSA/ICJUUlVFIiA6ICJGQUxTRSIpOworCQkJCisJCXNlcV9wdXRjKHNlcSwnXG4nKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXJsYW5fc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBpcmxhbl9zZXFfc3RhcnQsCisJLm5leHQgID0gaXJsYW5fc2VxX25leHQsCisJLnN0b3AgID0gaXJsYW5fc2VxX3N0b3AsCisJLnNob3cgID0gaXJsYW5fc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGlybGFuX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmaXJsYW5fc2VxX29wcyk7Cit9CisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUaGUgTGludXggSXJEQSBMQU4gcHJvdG9jb2wiKTsgCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShldGgsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhldGgsICJOYW1lIGRldmljZXMgZXRoWCAoMCkgb3IgaXJsYW5YICgxKSIpOworbW9kdWxlX3BhcmFtKGFjY2VzcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWNjZXNzLCAiQWNjZXNzIHR5cGUgRElSRUNUPTEsIFBFRVI9MiwgSE9TVEVEPTMiKTsKKworbW9kdWxlX2luaXQoaXJsYW5faW5pdCk7Cittb2R1bGVfZXhpdChpcmxhbl9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fZXRoLmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9ldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzFjZDJjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fZXRoLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJsYW5fZXRoLmMKKyAqIFZlcnNpb246ICAgICAgIAorICogRGVzY3JpcHRpb246ICAgCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBUaHUgT2N0IDE1IDA4OjM3OjU4IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFR1ZSBNYXIgMjEgMDk6MDY6NDEgMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogU291cmNlczogICAgICAgc2tlbGV0b24uYyBieSBEb25hbGQgQmVja2VyIDxiZWNrZXJAQ0VTRElTLmdzZmMubmFzYS5nb3Y+CisgKiAgICAgICAgICAgICAgICBzbGlwLmMgYnkgTGF1cmVuY2UgQ3VsaGFuZSwgICA8bG96QGhvbG1lcy5kZW1vbi5jby51az4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdXdhbHQubmwubXVnbmV0Lm9yZz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jb21tb24uaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jbGllbnQuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9ldmVudC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V0aC5oPgorCitzdGF0aWMgaW50ICBpcmxhbl9ldGhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIGlybGFuX2V0aF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIGlybGFuX2V0aF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaXJsYW5fZXRoX3NldF9tdWx0aWNhc3RfbGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlybGFuX2V0aF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9ldGhfc2V0dXAgKGRldikKKyAqCisgKiAgICBUaGUgbmV0d29yayBkZXZpY2UgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCisgKgorICovCitzdGF0aWMgdm9pZCBpcmxhbl9ldGhfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPm9wZW4gICAgICAgICAgICAgICA9IGlybGFuX2V0aF9vcGVuOworCWRldi0+c3RvcCAgICAgICAgICAgICAgID0gaXJsYW5fZXRoX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ICAgID0gaXJsYW5fZXRoX3htaXQ7IAorCWRldi0+Z2V0X3N0YXRzCSAgICAgICAgPSBpcmxhbl9ldGhfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gaXJsYW5fZXRoX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPmRlc3RydWN0b3IJCT0gZnJlZV9uZXRkZXY7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlldGhlcl9zZXR1cChkZXYpOworCQorCS8qIAorCSAqIExldHMgZG8gYWxsIHF1ZXVlaW5nIGluIElyVFRQIGluc3RlYWQgb2YgdGhpcyBkZXZpY2UgZHJpdmVyLgorCSAqIFF1ZXVlaW5nIGhlcmUgYXMgd2VsbCBjYW4gaW50cm9kdWNlIHNvbWUgc3RyYW5nZSBsYXRlbmN5CisJICogcHJvYmxlbXMsIHdoaWNoIHdlIHdpbGwgYXZvaWQgYnkgc2V0dGluZyB0aGUgcXVldWUgc2l6ZSB0byAwLgorCSAqLworCS8qCisJICogVGhlIGJ1Z3MgaW4gSXJUVFAgYW5kIElyTEFOIHRoYXQgY3JlYXRlZCB0aGlzIGxhdGVuY3kgaXNzdWUKKwkgKiBoYXZlIG5vdyBiZWVuIGZpeGVkLCBhbmQgd2UgY2FuIHByb3BhZ2F0ZSBmbG93IGNvbnRyb2wgcHJvcGVybHkKKwkgKiB0byB0aGUgbmV0d29yayBsYXllci4gSG93ZXZlciwgdGhpcyByZXF1aXJlcyBhIG1pbmltYWwgcXVldWUgb2YKKwkgKiBwYWNrZXRzIGZvciB0aGUgZGV2aWNlLgorCSAqIFdpdGhvdXQgZmxvdyBjb250cm9sLCB0aGUgVHggUXVldWUgaXMgMTQgKHR0cCkgKyAwIChkZXYpID0gMTQKKwkgKiBXaXRoIGZsb3cgY29udHJvbCwgdGhlIFR4IFF1ZXVlIGlzIDcgKHR0cCkgKyA0IChkZXYpID0gMTEKKwkgKiBTZWUgaXJsYW5fZXRoX2Zsb3dfaW5kaWNhdGlvbigpLi4uCisJICogTm90ZSA6IHRoaXMgbnVtYmVyIHdhcyByYW5kb21seSBzZWxlY3RlZCBhbmQgd291bGQgbmVlZCB0bworCSAqIGJlIGFkanVzdGVkLgorCSAqIEplYW4gSUkgKi8KKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGxvY19pcmxhbmRldgorICoKKyAqICAgIEFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlIGFuZCBjb250cm9sIGJsb2NrCisgKgorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfaXJsYW5kZXYoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgaXJsYW5fY2IpLCBuYW1lLAorCQkJICAgIGlybGFuX2V0aF9zZXR1cCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9ldGhfb3BlbiAoZGV2KQorICoKKyAqICAgIE5ldHdvcmsgZGV2aWNlIGhhcyBiZWVuIG9wZW5lZCBieSB1c2VyCisgKgorICovCitzdGF0aWMgaW50IGlybGFuX2V0aF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIFJlYWR5IHRvIHBsYXkhICovCisgCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsgLyogV2FpdCB1bnRpbCBkYXRhIGxpbmsgaXMgcmVhZHkgKi8KKworCS8qIFdlIGFyZSBub3cgb3Blbiwgc28gdGltZSB0byBkbyBzb21lIHdvcmsgKi8KKwlzZWxmLT5kaXNjb25uZWN0X3JlYXNvbiA9IDA7CisJaXJsYW5fY2xpZW50X3dha2V1cChzZWxmLCBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIpOworCisJLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBoYXJkd2FyZSBhZGRyZXNzIGJlZm9yZSB3ZSByZXR1cm4sIAorCSAgIHNvIERIQ1AgY2xpZW50cyBnZXRzIGhhcHB5ICovCisJcmV0dXJuIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZWxmLT5vcGVuX3dhaXQsCisJCQkJCSFzZWxmLT50c2FwX2RhdGEtPmNvbm5lY3RlZCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9ldGhfY2xvc2UgKGRldikKKyAqCisgKiAgICBTdG9wIHRoZSBldGhlciBuZXR3b3JrIGRldmljZSwgaGlzIGZ1bmN0aW9uIHdpbGwgdXN1YWxseSBiZSBjYWxsZWQgYnkKKyAqICAgIGlmY29uZmlnIGRvd24uIFdlIHNob3VsZCBub3cgZGlzY29ubmVjdCB0aGUgbGluaywgV2Ugc3RhcnQgdGhlIAorICogICAgY2xvc2UgdGltZXIsIHNvIHRoYXQgdGhlIGluc3RhbmNlIHdpbGwgYmUgcmVtb3ZlZCBpZiB3ZSBhcmUgdW5hYmxlCisgKiAgICB0byBkaXNjb3ZlciB0aGUgcmVtb3RlIGRldmljZSBhZnRlciB0aGUgZGlzY29ubmVjdC4KKyAqLworc3RhdGljIGludCBpcmxhbl9ldGhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCS8qIFN0b3AgZGV2aWNlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWlybGFuX2Nsb3NlX2RhdGFfY2hhbm5lbChzZWxmKTsKKwlpcmxhbl9jbG9zZV90c2FwcyhzZWxmKTsKKworCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9MTVBfRElTQ09OTkVDVCwgTlVMTCk7CisJaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc2VsZiwgSVJMQU5fTE1QX0RJU0NPTk5FQ1QsIE5VTEwpOwkKKwkKKwkvKiBSZW1vdmUgZnJhbWVzIHF1ZXVlZCBvbiB0aGUgY29udHJvbCBjaGFubmVsICovCisJc2tiX3F1ZXVlX3B1cmdlKCZzZWxmLT5jbGllbnQudHhxKTsKKworCXNlbGYtPmNsaWVudC50eF9idXN5ID0gMDsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2V0aF90eCAoc2tiKQorICoKKyAqICAgIFRyYW5zbWl0cyBldGhlcm5ldCBmcmFtZXMgb3ZlciBJckRBIGxpbmsuCisgKgorICovCitzdGF0aWMgaW50IGlybGFuX2V0aF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJLyogc2tiIGhlYWRyb29tIGxhcmdlIGVub3VnaCB0byBjb250YWluIGFsbCBJckRBLWhlYWRlcnM/ICovCisJaWYgKChza2JfaGVhZHJvb20oc2tiKSA8IHNlbGYtPm1heF9oZWFkZXJfc2l6ZSkgfHwgKHNrYl9zaGFyZWQoc2tiKSkpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPSAKKwkJCXNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKworCQkvKiAgV2UgaGF2ZSB0byBmcmVlIHRoZSBvcmlnaW5hbCBza2IgYW55d2F5ICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCQkvKiBEaWQgdGhlIHJlYWxsb2Mgc3VjY2VlZD8gKi8KKwkJaWYgKG5ld19za2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCisJCS8qIFVzZSB0aGUgbmV3IHNrYiBpbnN0ZWFkICovCisJCXNrYiA9IG5ld19za2I7CisJfSAKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogTm93IHF1ZXVlIHRoZSBwYWNrZXQgaW4gdGhlIHRyYW5zcG9ydCBsYXllciAqLworCWlmIChzZWxmLT51c2VfdWRhdGEpCisJCXJldCA9IGlydHRwX3VkYXRhX3JlcXVlc3Qoc2VsZi0+dHNhcF9kYXRhLCBza2IpOworCWVsc2UKKwkJcmV0ID0gaXJ0dHBfZGF0YV9yZXF1ZXN0KHNlbGYtPnRzYXBfZGF0YSwgc2tiKTsKKworCWlmIChyZXQgPCAwKSB7CisJCS8qICAgCisJCSAqIElyVFRQcyB0eCBxdWV1ZSBpcyBmdWxsLCBzbyB3ZSBqdXN0IGhhdmUgdG8KKwkJICogZHJvcCB0aGUgZnJhbWUhIFlvdSBtaWdodCB0aGluayB0aGF0IHdlIHNob3VsZAorCQkgKiBqdXN0IHJldHVybiAtMSBhbmQgZG9uJ3QgZGVhbGxvY2F0ZSB0aGUgZnJhbWUsCisJCSAqIGJ1dCB0aGF0IGlzIGRhbmdlcm91cyBzaW5jZSBpdCdzIHBvc3NpYmxlIHRoYXQKKwkJICogd2UgaGF2ZSByZXBsYWNlZCB0aGUgb3JpZ2luYWwgc2tiIHdpdGggYSBuZXcKKwkJICogb25lIHdpdGggbGFyZ2VyIGhlYWRyb29tLCBhbmQgdGhhdCB3b3VsZCByZWFsbHkKKwkJICogY29uZnVzZSBkb19kZXZfcXVldWVfeG1pdCgpIGluIGRldi5jISBJIGhhdmUKKwkJICogdHJpZWQgOi0pIERCIAorCQkgKi8KKwkJLyogaXJ0dHBfZGF0YV9yZXF1ZXN0IGFscmVhZHkgZnJlZSB0aGUgcGFja2V0ICovCisJCXNlbGYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwl9IGVsc2UgeworCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOyAKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9ldGhfcmVjZWl2ZSAoaGFuZGxlLCBza2IpCisgKgorICogICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBkYXRhIHRoYXQgaXMgcmVjZWl2ZWQgb24gdGhlIGRhdGEgY2hhbm5lbAorICoKKyAqLworaW50IGlybGFuX2V0aF9yZWNlaXZlKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmID0gaW5zdGFuY2U7CisKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJKytzZWxmLT5zdGF0cy5yeF9kcm9wcGVkOyAKKwkJcmV0dXJuIDA7CisJfQorCWlmIChza2ItPmxlbiA8IEVUSF9ITEVOKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCkgOiBJckxBTiBmcmFtZSB0b28gc2hvcnQgKCVkKVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgc2tiLT5sZW4pOworCQkrK3NlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQ7IAorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKwkJCisJLyogCisJICogQWRvcHQgdGhpcyBmcmFtZSEgSW1wb3J0YW50IHRvIHNldCBhbGwgdGhlc2UgZmllbGRzIHNpbmNlIHRoZXkgCisJICogbWlnaHQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBsb3cgbGV2ZWwgSXJEQSBuZXR3b3JrCisJICogZGV2aWNlIGRyaXZlciAKKwkgKi8KKwlza2ItPmRldiA9IHNlbGYtPmRldjsKKwlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOyAvKiBSZW1vdmUgZXRoIGhlYWRlciAqLworCQorCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsgCisKKwluZXRpZl9yeChza2IpOyAgIC8qIEVhdCBpdCEgKi8KKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2V0aF9mbG93IChzdGF0dXMpCisgKgorICogICAgRG8gZmxvdyBjb250cm9sIGJldHdlZW4gSVAvRXRoZXJuZXQgYW5kIElyTEFOL0lyVFRQLiBUaGlzIGlzIGRvbmUgYnkgCisgKiAgICBjb250cm9sbGluZyB0aGUgcXVldWUgc3RvcC9zdGFydC4KKyAqCisgKiBUaGUgSXJEQSBsaW5rIGxheWVyIGhhcyB0aGUgYWR2YW50YWdlIHRvIGhhdmUgZmxvdyBjb250cm9sLCBhbmQKKyAqIElyVFRQIG5vdyBwcm9wZXJseSBoYW5kbGVzIHRoYXQuIEZsb3cgY29udHJvbGxpbmcgdGhlIGhpZ2hlciBsYXllcnMKKyAqIHByZXZlbnQgdXMgdG8gZHJvcCBUeCBwYWNrZXRzIGluIGhlcmUgKHVwIHRvIDE1JSBmb3IgYSBUQ1Agc29ja2V0LAorICogbW9yZSBmb3IgVURQIHNvY2tldCkuCisgKiBBbHNvLCB0aGlzIGFsbG93IHVzIHRvIHJlZHVjZSB0aGUgb3ZlcmFsbCB0cmFuc21pdCBxdWV1ZSwgd2hpY2ggbWVhbnMKKyAqIGxlc3MgbGF0ZW5jeSBpbiBjYXNlIG9mIG1peGVkIHRyYWZmaWMuCisgKiBKZWFuIElJCisgKi8KK3ZvaWQgaXJsYW5fZXRoX2Zsb3dfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCBMT0NBTF9GTE9XIGZsb3cpCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCQorCWRldiA9IHNlbGYtPmRldjsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm47KTsKKwkKKwlJUkRBX0RFQlVHKDAsICIlcygpIDogZmxvdyAlcyA7IHJ1bm5pbmcgJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgZmxvdyA9PSBGTE9XX1NUT1AgPyAiRkxPV19TVE9QIiA6ICJGTE9XX1NUQVJUIiwKKwkJICAgbmV0aWZfcnVubmluZyhkZXYpKTsKKworCXN3aXRjaCAoZmxvdykgeworCWNhc2UgRkxPV19TVE9QOgorCQkvKiBJclRUUCBpcyBmdWxsLCBzdG9wIGhpZ2hlciBsYXllcnMgKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlicmVhazsKKwljYXNlIEZMT1dfU1RBUlQ6CisJZGVmYXVsdDoKKwkJLyogVGVsbCB1cHBlciBsYXllcnMgdGhhdCBpdHMgdGltZSB0byB0cmFuc21pdCBmcmFtZXMgYWdhaW4gKi8KKwkJLyogU2NoZWR1bGUgbmV0d29yayBsYXllciAqLworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2V0Y19zZW5kX2dyYXR1aXRvdXNfYXJwIChkZXYpCisgKgorICogICAgU2VuZCBncmF0dWl0b3VzIEFSUCB0byBhbm5vdW5jZSB0aGF0IHdlIGhhdmUgY2hhbmdlZAorICogICAgaGFyZHdhcmUgYWRkcmVzcywgc28gdGhhdCBhbGwgcGVlcnMgdXBkYXRlcyB0aGVpciBBUlAgdGFibGVzCisgKi8KK3ZvaWQgaXJsYW5fZXRoX3NlbmRfZ3JhdHVpdG91c19hcnAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwkvKiAKKwkgKiBXaGVuIHdlIGdldCBhIG5ldyBNQUMgYWRkcmVzcyBkbyBhIGdyYXR1aXRvdXMgQVJQLiBUaGlzCisJICogaXMgdXNlZnVsIGlmIHdlIGhhdmUgY2hhbmdlZCBhY2Nlc3MgcG9pbnRzIG9uIHRoZSBzYW1lCisJICogc3VibmV0LiAgCisJICovCisjaWZkZWYgQ09ORklHX0lORVQKKwlJUkRBX0RFQlVHKDQsICJJckxBTjogU2VuZGluZyBncmF0dWl0b3VzIEFSUFxuIik7CisJcmN1X3JlYWRfbG9jaygpOworCWluX2RldiA9IF9faW5fZGV2X2dldChkZXYpOworCWlmIChpbl9kZXYgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJaWYgKGluX2Rldi0+aWZhX2xpc3QpCisJCQorCWFycF9zZW5kKEFSUE9QX1JFUVVFU1QsIEVUSF9QX0FSUCwgCisJCSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfYWRkcmVzcywKKwkJIGRldiwgCisJCSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfYWRkcmVzcywKKwkJIE5VTEwsIGRldi0+ZGV2X2FkZHIsIE5VTEwpOworb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworI2VuZGlmIC8qIENPTkZJR19JTkVUICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBzZXRfbXVsdGljYXN0X2xpc3QgKGRldikKKyAqCisgKiAgICBDb25maWd1cmUgdGhlIGZpbHRlcmluZyBvZiB0aGUgZGV2aWNlCisgKgorICovCisjZGVmaW5lIEhXX01BWF9BRERSUyA0IC8qIE11c3QgcXVlcnkgdG8gZ2V0IGl0ISAqLworc3RhdGljIHZvaWQgaXJsYW5fZXRoX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKyAJc3RydWN0IGlybGFuX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogQ2hlY2sgaWYgZGF0YSBjaGFubmVsIGhhcyBiZWVuIGNvbm5lY3RlZCB5ZXQgKi8KKwlpZiAoc2VsZi0+Y2xpZW50LnN0YXRlICE9IElSTEFOX0RBVEEpIHsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgZGVsYXlpbmchXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJSVJEQV9XQVJOSU5HKCJQcm9taXNjb3VzIG1vZGUgbm90IGltcGxlbWVudGVkIGJ5IElyTEFOIVxuIik7CisJfSAKKwllbHNlIGlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgZGV2LT5tY19jb3VudCA+IEhXX01BWF9BRERSUykgeworCQkvKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUsIHVzZSBub3JtYWwgbW9kZS4gKi8KKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgU2V0dGluZyBtdWx0aWNhc3QgZmlsdGVyXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJLyogaGFyZHdhcmVfc2V0X2ZpbHRlcihOVUxMKTsgKi8KKworCQlpcmxhbl9zZXRfbXVsdGljYXN0X2ZpbHRlcihzZWxmLCBUUlVFKTsKKwl9CisJZWxzZSBpZiAoZGV2LT5tY19jb3VudCkgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBTZXR0aW5nIG11bHRpY2FzdCBmaWx0ZXJcbiIsIF9fRlVOQ1RJT05fXyApOworCQkvKiBXYWxrIHRoZSBhZGRyZXNzIGxpc3QsIGFuZCBsb2FkIHRoZSBmaWx0ZXIgKi8KKwkJLyogaGFyZHdhcmVfc2V0X2ZpbHRlcihkZXYtPm1jX2xpc3QpOyAqLworCisJCWlybGFuX3NldF9tdWx0aWNhc3RfZmlsdGVyKHNlbGYsIFRSVUUpOworCX0KKwllbHNlIHsKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgQ2xlYXJpbmcgbXVsdGljYXN0IGZpbHRlclxuIiwgX19GVU5DVElPTl9fICk7CisJCWlybGFuX3NldF9tdWx0aWNhc3RfZmlsdGVyKHNlbGYsIEZBTFNFKTsKKwl9CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9CUk9BRENBU1QpCisJCWlybGFuX3NldF9icm9hZGNhc3RfZmlsdGVyKHNlbGYsIFRSVUUpOworCWVsc2UKKwkJaXJsYW5fc2V0X2Jyb2FkY2FzdF9maWx0ZXIoc2VsZiwgRkFMU0UpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fZ2V0X3N0YXRzIChkZXYpCisgKgorICogICAgR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MgZm9yIHRoaXMgZGV2aWNlCisgKgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlybGFuX2V0aF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAmc2VsZi0+c3RhdHM7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9ldmVudC5jIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzc4ZDhjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fZXZlbnQuYwpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlybGFuX2V2ZW50LmMKKyAqIFZlcnNpb246ICAgICAgIAorICogRGVzY3JpcHRpb246ICAgCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBUdWUgT2N0IDIwIDA5OjEwOjE2IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFNhdCBPY3QgMzAgMTI6NTk6MDEgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V2ZW50Lmg+CisKK2NoYXIgKmlybGFuX3N0YXRlW10gPSB7CisJIklSTEFOX0lETEUiLAorCSJJUkxBTl9RVUVSWSIsCisJIklSTEFOX0NPTk4iLAorCSJJUkxBTl9JTkZPIiwKKwkiSVJMQU5fTUVESUEiLAorCSJJUkxBTl9PUEVOIiwKKwkiSVJMQU5fV0FJVCIsCisJIklSTEFOX0FSQiIsCisJIklSTEFOX0RBVEEiLAorCSJJUkxBTl9DTE9TRSIsCisJIklSTEFOX1NZTkMiLAorfTsKKwordm9pZCBpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX1NUQVRFIHN0YXRlKSAKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAlc1xuIiwgX19GVU5DVElPTl9fICwgaXJsYW5fc3RhdGVbc3RhdGVdKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisJc2VsZi0+Y2xpZW50LnN0YXRlID0gc3RhdGU7Cit9CisKK3ZvaWQgaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX1NUQVRFIHN0YXRlKSAKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAlc1xuIiwgX19GVU5DVElPTl9fICwgaXJsYW5fc3RhdGVbc3RhdGVdKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisJc2VsZi0+cHJvdmlkZXIuc3RhdGUgPSBzdGF0ZTsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fZmlsdGVyLmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNjNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fZmlsdGVyLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJsYW5fZmlsdGVyLmMKKyAqIFZlcnNpb246ICAgICAgIAorICogRGVzY3JpcHRpb246ICAgCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBGcmkgSmFuIDI5IDExOjE2OjM4IDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIFNhdCBPY3QgMzAgMTI6NTg6NDUgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jb21tb24uaD4KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2ZpbHRlcl9yZXF1ZXN0IChzZWxmLCBza2IpCisgKgorICogICAgSGFuZGxlIGZpbHRlciByZXF1ZXN0IGZyb20gY2xpZW50IHBlZXIgZGV2aWNlCisgKgorICovCit2b2lkIGlybGFuX2ZpbHRlcl9yZXF1ZXN0KHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fRElSRUNURUQpICYmIAorCSAgICAoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX29wZXJhdGlvbiA9PSBEWU5BTUlDKSkKKwl7CisJCUlSREFfREVCVUcoMCwgIkdpdmluZyBwZWVyIGEgZHluYW1pYyBFdGhlcm5ldCBhZGRyZXNzXG4iKTsKKwkJc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3NbMF0gPSAweDQwOworCQlzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzc1sxXSA9IDB4MDA7CisJCXNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzWzJdID0gMHgwMDsKKwkJc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3NbM10gPSAweDAwOworCQkKKwkJLyogVXNlIGFyYml0cmF0aW9uIHZhbHVlIHRvIGdlbmVyYXRlIE1BQyBhZGRyZXNzICovCisJCWlmIChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9PSBBQ0NFU1NfUEVFUikgeworCQkJc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3NbNF0gPSAKKwkJCQlzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwgJiAweGZmOworCQkJc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3NbNV0gPSAKKwkJCQkoc2VsZi0+cHJvdmlkZXIuc2VuZF9hcmJfdmFsID4+IDgpICYgMHhmZjsKKwkJfSBlbHNlIHsKKwkJCS8qIEp1c3QgZ2VuZXJhdGUgc29tZXRoaW5nIGZvciBub3cgKi8KKwkJCWdldF9yYW5kb21fYnl0ZXMoc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3MrNCwgMSk7CisJCQlnZXRfcmFuZG9tX2J5dGVzKHNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzKzUsIDEpOworCQl9CisKKwkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLworCQlza2ItPmRhdGFbMV0gPSAweDAzOworCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9NT0RFIiwgIk5PTkUiKTsKKwkJaXJsYW5faW5zZXJ0X3Nob3J0X3BhcmFtKHNrYiwgIk1BWF9FTlRSWSIsIDB4MDAwMSk7CisJCWlybGFuX2luc2VydF9hcnJheV9wYXJhbShza2IsICJGSUxURVJfRU5UUlkiLCAKKwkJCQkJIHNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzLCA2KTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID09IElSTEFOX0RJUkVDVEVEKSAmJiAKKwkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID09IEZJTFRFUikpCisJeworCQlJUkRBX0RFQlVHKDAsICJEaXJlY3RlZCBmaWx0ZXIgb25cbiIpOworCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCisJCXNrYi0+ZGF0YVsxXSA9IDB4MDA7CisJCXJldHVybjsKKwl9CisJaWYgKChzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9PSBJUkxBTl9ESVJFQ1RFRCkgJiYgCisJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9PSBOT05FKSkKKwl7CisJCUlSREFfREVCVUcoMCwgIkRpcmVjdGVkIGZpbHRlciBvZmZcbiIpOworCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCisJCXNrYi0+ZGF0YVsxXSA9IDB4MDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID09IElSTEFOX0JST0FEQ0FTVCkgJiYgCisJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9PSBGSUxURVIpKQorCXsKKwkJSVJEQV9ERUJVRygwLCAiQnJvYWRjYXN0IGZpbHRlciBvblxuIik7CisJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KKwkJc2tiLT5kYXRhWzFdID0gMHgwMDsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID09IElSTEFOX0JST0FEQ0FTVCkgJiYgCisJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9PSBOT05FKSkKKwl7CisJCUlSREFfREVCVUcoMCwgIkJyb2FkY2FzdCBmaWx0ZXIgb2ZmXG4iKTsKKwkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLworCQlza2ItPmRhdGFbMV0gPSAweDAwOworCQlyZXR1cm47CisJfQorCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fTVVMVElDQVNUKSAmJiAKKwkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID09IEZJTFRFUikpCisJeworCQlJUkRBX0RFQlVHKDAsICJNdWx0aWNhc3QgZmlsdGVyIG9uXG4iKTsKKwkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLworCQlza2ItPmRhdGFbMV0gPSAweDAwOworCQlyZXR1cm47CisJfQorCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fTVVMVElDQVNUKSAmJiAKKwkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID09IE5PTkUpKQorCXsKKwkJSVJEQV9ERUJVRygwLCAiTXVsdGljYXN0IGZpbHRlciBvZmZcbiIpOworCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCisJCXNrYi0+ZGF0YVsxXSA9IDB4MDA7CisJCXJldHVybjsKKwl9CisJaWYgKChzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9PSBJUkxBTl9NVUxUSUNBU1QpICYmIAorCSAgICAoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX29wZXJhdGlvbiA9PSBHRVQpKQorCXsKKwkJSVJEQV9ERUJVRygwLCAiTXVsdGljYXN0IGZpbHRlciBnZXRcbiIpOworCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzPyAqLworCQlza2ItPmRhdGFbMV0gPSAweDAyOworCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9NT0RFIiwgIk5PTkUiKTsKKwkJaXJsYW5faW5zZXJ0X3Nob3J0X3BhcmFtKHNrYiwgIk1BWF9FTlRSWSIsIDE2KTsKKwkJcmV0dXJuOworCX0KKwlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBDb21tYW5kIG5vdCBzdXBwb3J0ZWQgKi8KKwlza2ItPmRhdGFbMV0gPSAweDAwOworCisJSVJEQV9ERUJVRygwLCAiTm90IGltcGxlbWVudGVkIVxuIik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBjaGVja19yZXF1ZXN0X3BhcmFtIChzZWxmLCBwYXJhbSwgdmFsdWUpCisgKgorICogICAgQ2hlY2sgcGFyYW1ldGVycyBpbiByZXF1ZXN0IGZyb20gcGVlciBkZXZpY2UKKyAqCisgKi8KK3ZvaWQgaXJsYW5fY2hlY2tfY29tbWFuZF9wYXJhbShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIGNoYXIgKnBhcmFtLCBjaGFyICp2YWx1ZSkKK3sKKwlfX3U4ICpieXRlczsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJYnl0ZXMgPSB2YWx1ZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisJSVJEQV9ERUJVRyg0LCAiJXMsICVzXG4iLCBwYXJhbSwgdmFsdWUpOworCisJLyoKKwkgKiAgVGhpcyBpcyBleHBlcmltZW50YWwhISBEQi4KKwkgKi8KKwkgaWYgKHN0cmNtcChwYXJhbSwgIk1PREUiKSA9PSAwKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQlzZWxmLT51c2VfdWRhdGEgPSBUUlVFOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiAgRklMVEVSX1RZUEUKKwkgKi8KKwlpZiAoc3RyY21wKHBhcmFtLCAiRklMVEVSX1RZUEUiKSA9PSAwKSB7CisJCWlmIChzdHJjbXAodmFsdWUsICJESVJFQ1RFRCIpID09IDApIHsKKwkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID0gSVJMQU5fRElSRUNURUQ7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHN0cmNtcCh2YWx1ZSwgIk1VTFRJQ0FTVCIpID09IDApIHsKKwkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID0gSVJMQU5fTVVMVElDQVNUOworCQkJcmV0dXJuOworCQl9CisJCWlmIChzdHJjbXAodmFsdWUsICJCUk9BRENBU1QiKSA9PSAwKSB7CisJCQlzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9IElSTEFOX0JST0FEQ0FTVDsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKgorCSAqICBGSUxURVJfTU9ERQorCSAqLworCWlmIChzdHJjbXAocGFyYW0sICJGSUxURVJfTU9ERSIpID09IDApIHsKKwkJaWYgKHN0cmNtcCh2YWx1ZSwgIkFMTCIpID09IDApIHsKKwkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID0gQUxMOworCQkJcmV0dXJuOworCQl9CisJCWlmIChzdHJjbXAodmFsdWUsICJGSUxURVIiKSA9PSAwKSB7CisJCQlzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9IEZJTFRFUjsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoc3RyY21wKHZhbHVlLCAiTk9ORSIpID09IDApIHsKKwkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID0gRklMVEVSOworCQkJcmV0dXJuOworCQl9CisJfQorCS8qCisJICogIEZJTFRFUl9PUEVSQVRJT04KKwkgKi8KKwlpZiAoc3RyY21wKHBhcmFtLCAiRklMVEVSX09QRVJBVElPTiIpID09IDApIHsKKwkJaWYgKHN0cmNtcCh2YWx1ZSwgIkRZTkFNSUMiKSA9PSAwKSB7CisJCQlzZWxmLT5wcm92aWRlci5maWx0ZXJfb3BlcmF0aW9uID0gRFlOQU1JQzsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoc3RyY21wKHZhbHVlLCAiR0VUIikgPT0gMCkgeworCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX29wZXJhdGlvbiA9IEdFVDsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX3ByaW50X2ZpbHRlciAoZmlsdGVyX3R5cGUsIGJ1ZikKKyAqCisgKiAgICBQcmludCBzdGF0dXMgb2YgZmlsdGVyLiBVc2VkIGJ5IC9wcm9jIGZpbGUgc3lzdGVtCisgKgorICovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyNkZWZpbmUgTUFTSzJTVFIobSxzKQl7IC5tYXNrID0gbSwgLnN0ciA9IHMgfQorCit2b2lkIGlybGFuX3ByaW50X2ZpbHRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgaW50IGZpbHRlcl90eXBlKQoreworCXN0YXRpYyBzdHJ1Y3QgeworCQlpbnQgbWFzazsKKwkJY29uc3QgY2hhciAqc3RyOworCX0gZmlsdGVyX21hc2syc3RyW10gPSB7CisJCU1BU0syU1RSKElSTEFOX0RJUkVDVEVELAkiRElSRUNURUQiKSwKKwkJTUFTSzJTVFIoSVJMQU5fRlVOQ1RJT05BTCwJIkZVTkNUSU9OQUwiKSwKKwkJTUFTSzJTVFIoSVJMQU5fR1JPVVAsCQkiR1JPVVAiKSwKKwkJTUFTSzJTVFIoSVJMQU5fTUFDX0ZSQU1FLAkiTUFDX0ZSQU1FIiksCisJCU1BU0syU1RSKElSTEFOX01VTFRJQ0FTVCwJIk1VTFRJQ0FTVCIpLAorCQlNQVNLMlNUUihJUkxBTl9CUk9BRENBU1QsCSJCUk9BRENBU1QiKSwKKwkJTUFTSzJTVFIoSVJMQU5fSVBYX1NPQ0tFVCwJIklQWF9TT0NLRVQiKSwKKwkJTUFTSzJTVFIoMCwJCQlOVUxMKQorCX0sICpwOworCisJZm9yIChwID0gZmlsdGVyX21hc2syc3RyOyBwLT5zdHI7IHArKykgeworCQlpZiAoZmlsdGVyX3R5cGUgJiBwLT5tYXNrKQorCQkJc2VxX3ByaW50ZihzZXEsICIlcyAiLCBwLT5zdHIpOworCX0KKwlzZXFfcHV0YyhzZXEsICdcbicpOworfQorI3VuZGVmIE1BU0syU1RSCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFuL2lybGFuX3Byb3ZpZGVyLmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9wcm92aWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YzIwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9wcm92aWRlci5jCkBAIC0wLDAgKzEsNDEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlybGFuX3Byb3ZpZGVyLmMKKyAqIFZlcnNpb246ICAgICAgIDAuOQorICogRGVzY3JpcHRpb246ICAgSXJEQSBMQU4gQWNjZXNzIFByb3RvY29sIEltcGxlbWVudGF0aW9uCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTdW4gQXVnIDMxIDIwOjE0OjM3IDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFNhdCBPY3QgMzAgMTI6NTI6MTAgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogU291cmNlczogICAgICAgc2tlbGV0b24uYyBieSBEb25hbGQgQmVja2VyIDxiZWNrZXJAQ0VTRElTLmdzZmMubmFzYS5nb3Y+CisgKiAgICAgICAgICAgICAgICBzbGlwLmMgYnkgTGF1cmVuY2UgQ3VsaGFuZSwgICA8bG96QGhvbG1lcy5kZW1vbi5jby51az4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdXdhbHQubmwubXVnbmV0Lm9yZz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sIAorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fY29tbW9uLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXRoLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXZlbnQuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9wcm92aWRlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2ZpbHRlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NsaWVudC5oPgorCitzdGF0aWMgdm9pZCBpcmxhbl9wcm92aWRlcl9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJCSAgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCAKKwkJCQkJICAgICAgX191MzIgbWF4X3NkdV9zaXplLAorCQkJCQkgICAgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKKwkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9wcm92aWRlcl9jb250cm9sX2RhdGFfaW5kaWNhdGlvbiAoaGFuZGxlLCBza2IpCisgKgorICogICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBkYXRhIHRoYXQgaXMgcmVjZWl2ZWQgb24gdGhlIGNvbnRyb2wgY2hhbm5lbAorICoKKyAqLworc3RhdGljIGludCBpcmxhbl9wcm92aWRlcl9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmOworCV9fdTggY29kZTsKKwkKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtMTspOworCisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOworCisJY29kZSA9IHNrYi0+ZGF0YVswXTsKKwlzd2l0Y2goY29kZSkgeworCWNhc2UgQ01EX0dFVF9QUk9WSURFUl9JTkZPOgorCQlJUkRBX0RFQlVHKDQsICJHb3QgR0VUX1BST1ZJREVSX0lORk8gY29tbWFuZCFcbiIpOworCQlpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9HRVRfSU5GT19DTUQsIHNrYik7IAorCQlicmVhazsKKworCWNhc2UgQ01EX0dFVF9NRURJQV9DSEFSOgorCQlJUkRBX0RFQlVHKDQsICJHb3QgR0VUX01FRElBX0NIQVIgY29tbWFuZCFcbiIpOworCQlpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9HRVRfTUVESUFfQ01ELCBza2IpOyAKKwkJYnJlYWs7CisJY2FzZSBDTURfT1BFTl9EQVRBX0NIQU5ORUw6CisJCUlSREFfREVCVUcoNCwgIkdvdCBPUEVOX0RBVEFfQ0hBTk5FTCBjb21tYW5kIVxuIik7CisJCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX09QRU5fREFUQV9DTUQsIHNrYik7IAorCQlicmVhazsKKwljYXNlIENNRF9GSUxURVJfT1BFUkFUSU9OOgorCQlJUkRBX0RFQlVHKDQsICJHb3QgRklMVEVSX09QRVJBVElPTiBjb21tYW5kIVxuIik7CisJCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX0ZJTFRFUl9DT05GSUdfQ01ELCBza2IpOworCQlicmVhazsKKwljYXNlIENNRF9SRUNPTk5FQ1RfREFUQV9DSEFOOgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBHb3QgUkVDT05ORUNUX0RBVEFfQ0hBTiBjb21tYW5kXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgTk9UIElNUExFTUVOVEVEXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfQ0xPU0VfREFUQV9DSEFOOgorCQlJUkRBX0RFQlVHKDIsICJHb3QgQ0xPU0VfREFUQV9DSEFOIGNvbW1hbmQhXG4iKTsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgTk9UIElNUExFTUVOVEVEXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBjb21tYW5kIVxuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX3Byb3ZpZGVyX2Nvbm5lY3RfaW5kaWNhdGlvbiAoaGFuZGxlLCBza2IsIHByaXYpCisgKgorICogICAgR290IGNvbm5lY3Rpb24gZnJvbSBwZWVyIElyTEFOIGNsaWVudAorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAorCQkJCQkgICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKKwkJCQkJICAgICAgX191MzIgbWF4X3NkdV9zaXplLCAKKwkJCQkJICAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmOworCXN0cnVjdCB0c2FwX2NiICp0c2FwOworCV9fdTMyIHNhZGRyLCBkYWRkcjsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOworCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCQorCUlSREFfQVNTRVJUKHRzYXAgPT0gc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsLHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPnByb3ZpZGVyLnN0YXRlID09IElSTEFOX0lETEUsIHJldHVybjspOworCisJZGFkZHIgPSBpcnR0cF9nZXRfZGFkZHIodHNhcCk7CisJc2FkZHIgPSBpcnR0cF9nZXRfc2FkZHIodHNhcCk7CisJc2VsZi0+cHJvdmlkZXIubWF4X3NkdV9zaXplID0gbWF4X3NkdV9zaXplOworCXNlbGYtPnByb3ZpZGVyLm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKKworCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX0NPTk5FQ1RfSU5ESUNBVElPTiwgTlVMTCk7CisKKwkvKiAgCisJICogSWYgd2UgYXJlIGluIHBlZXIgbW9kZSwgdGhlIGNsaWVudCBtYXkgbm90IGhhdmUgZ290IHRoZSBkaXNjb3ZlcnkKKwkgKiBpbmRpY2F0aW9uIGl0IG5lZWRzIHRvIG1ha2UgcHJvZ3Jlc3MuIElmIHRoZSBjbGllbnQgaXMgc3RpbGwgaW4gCisJICogSURMRSBzdGF0ZSwgd2UgbXVzdCBraWNrIGl0LiAKKwkgKi8KKwlpZiAoKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSAmJiAKKwkgICAgKHNlbGYtPmNsaWVudC5zdGF0ZSA9PSBJUkxBTl9JRExFKSkgCisJeworCQlpcmxhbl9jbGllbnRfd2FrZXVwKHNlbGYsIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkcik7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9yZXNwb25zZSAoaGFuZGxlKQorICoKKyAqICAgIEFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9uCisgKgorICovCit2b2lkIGlybGFuX3Byb3ZpZGVyX2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmLAorCQkJCSAgICAgc3RydWN0IHRzYXBfY2IgKnRzYXApCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBKdXN0IGFjY2VwdCAqLworCWlydHRwX2Nvbm5lY3RfcmVzcG9uc2UodHNhcCwgSVJMQU5fTVRVLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgaXJsYW5fcHJvdmlkZXJfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAorCQkJCQkJIExNX1JFQVNPTiByZWFzb24sIAorCQkJCQkJIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSkgCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmOworCXN0cnVjdCB0c2FwX2NiICp0c2FwOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgcmVhc29uPSVkXG4iLCBfX0ZVTkNUSU9OX18gLCByZWFzb24pOworCQorCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOworCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CQorCUlSREFfQVNTRVJUKHRzYXAgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQodHNhcC0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOworCQorCUlSREFfQVNTRVJUKHRzYXAgPT0gc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsLCByZXR1cm47KTsKKwkKKwlpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9MTVBfRElTQ09OTkVDVCwgTlVMTCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9wYXJzZV9vcGVuX2RhdGFfY21kIChzZWxmLCBza2IpCisgKgorICogICAgCisgKgorICovCitpbnQgaXJsYW5fcGFyc2Vfb3Blbl9kYXRhX2NtZChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJldDsKKwkKKwlyZXQgPSBpcmxhbl9wcm92aWRlcl9wYXJzZV9jb21tYW5kKHNlbGYsIENNRF9PUEVOX0RBVEFfQ0hBTk5FTCwgc2tiKTsKKworCS8qIE9wZW4gZGF0YSBjaGFubmVsICovCisJaXJsYW5fb3Blbl9kYXRhX3RzYXAoc2VsZik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gcGFyc2VfY29tbWFuZCAoc2tiKQorICoKKyAqICAgIEV4dHJhY3QgYWxsIHBhcmFtZXRlcnMgZnJvbSByZWNlaXZlZCBidWZmZXIsIHRoZW4gZmVlZCB0aGVtIHRvIAorICogICAgY2hlY2tfcGFyYW1zIGZvciBwYXJzaW5nCisgKgorICovCitpbnQgaXJsYW5fcHJvdmlkZXJfcGFyc2VfY29tbWFuZChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIGludCBjbWQsCisJCQkJIHN0cnVjdCBza19idWZmICpza2IpIAoreworCV9fdTggKmZyYW1lOworCV9fdTggKnB0cjsKKwlpbnQgY291bnQ7CisJX191MTYgdmFsX2xlbjsKKwlpbnQgaTsKKwljaGFyICpuYW1lOworICAgICAgICBjaGFyICp2YWx1ZTsKKwlpbnQgcmV0ID0gUlNQX1NVQ0NFU1M7CisJCisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtUlNQX1BST1RPQ09MX0VSUk9SOyk7CisJCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgc2tiLT5sZW49JWRcbiIsIF9fRlVOQ1RJT05fXyAsIChpbnQpc2tiLT5sZW4pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLVJTUF9QUk9UT0NPTF9FUlJPUjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm4gLVJTUF9QUk9UT0NPTF9FUlJPUjspOworCQorCWlmICghc2tiKQorCQlyZXR1cm4gLVJTUF9QUk9UT0NPTF9FUlJPUjsKKworCWZyYW1lID0gc2tiLT5kYXRhOworCisJbmFtZSA9IGttYWxsb2MoMjU1LCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5hbWUpCisJCXJldHVybiAtUlNQX0lOU1VGRklDSUVOVF9SRVNPVVJDRVM7CisJdmFsdWUgPSBrbWFsbG9jKDEwMTYsIEdGUF9BVE9NSUMpOworCWlmICghdmFsdWUpIHsKKwkJa2ZyZWUobmFtZSk7CisJCXJldHVybiAtUlNQX0lOU1VGRklDSUVOVF9SRVNPVVJDRVM7CisJfQorCisJLyogSG93IG1hbnkgcGFyYW1ldGVycz8gKi8KKwljb3VudCA9IGZyYW1lWzFdOworCisJSVJEQV9ERUJVRyg0LCAiR290ICVkIHBhcmFtZXRlcnNcbiIsIGNvdW50KTsKKwkKKwlwdHIgPSBmcmFtZSsyOworCQorCS8qIEZvciBhbGwgcGFyYW1ldGVycyAqLworIAlmb3IgKGk9MDsgaTxjb3VudDtpKyspIHsKKwkJcmV0ID0gaXJsYW5fZXh0cmFjdF9wYXJhbShwdHIsIG5hbWUsIHZhbHVlLCAmdmFsX2xlbik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJckxBTiwgRXJyb3IhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCWJyZWFrOworCQl9CisJCXB0cis9cmV0OworCQlyZXQgPSBSU1BfU1VDQ0VTUzsKKwkJaXJsYW5fY2hlY2tfY29tbWFuZF9wYXJhbShzZWxmLCBuYW1lLCB2YWx1ZSk7CisJfQorCS8qIENsZWFudXAgKi8KKwlrZnJlZShuYW1lKTsKKwlrZnJlZSh2YWx1ZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfc2VuZF9yZXBseSAoc2VsZiwgaW5mbykKKyAqCisgKiAgICBTZW5kIHJlcGx5IHRvIHF1ZXJ5IHRvIHBlZXIgSXJMQU4gbGF5ZXIKKyAqCisgKi8KK3ZvaWQgaXJsYW5fcHJvdmlkZXJfc2VuZF9yZXBseShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIGludCBjb21tYW5kLCAKKwkJCSAgICAgICBpbnQgcmV0X2NvZGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKDEyOCk7CisJaWYgKCFza2IpCisJCXJldHVybjsKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIFRUUCwgTE1QLCBhbmQgTEFQIGhlYWRlciAqLworCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+cHJvdmlkZXIubWF4X2hlYWRlcl9zaXplKTsKKwlza2JfcHV0KHNrYiwgMik7CisgICAgICAgCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBDTURfR0VUX1BST1ZJREVSX0lORk86CisJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KKwkJc2tiLT5kYXRhWzFdID0gMHgwMjsgLyogMiBwYXJhbWV0ZXJzICovCisJCXN3aXRjaCAoc2VsZi0+bWVkaWEpIHsKKwkJY2FzZSBNRURJQV84MDJfMzoKKwkJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiTUVESUEiLCAiODAyLjMiKTsKKwkJCWJyZWFrOworCQljYXNlIE1FRElBXzgwMl81OgorCQkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJNRURJQSIsICI4MDIuNSIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIG1lZGlhIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCWJyZWFrOworCQl9CisJCWlybGFuX2luc2VydF9zaG9ydF9wYXJhbShza2IsICJJUkxBTl9WRVIiLCAweDAxMDEpOworCQlicmVhazsKKworCWNhc2UgQ01EX0dFVF9NRURJQV9DSEFSOgorCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCisJCXNrYi0+ZGF0YVsxXSA9IDB4MDU7IC8qIDUgcGFyYW1ldGVycyAqLworCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9UWVBFIiwgIkRJUkVDVEVEIik7CisJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX1RZUEUiLCAiQlJPQURDQVNUIik7CisJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX1RZUEUiLCAiTVVMVElDQVNUIik7CisKKwkJc3dpdGNoIChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSkgeworCQljYXNlIEFDQ0VTU19ESVJFQ1Q6CisJCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkFDQ0VTU19UWVBFIiwgIkRJUkVDVCIpOworCQkJYnJlYWs7CisJCWNhc2UgQUNDRVNTX1BFRVI6CisJCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkFDQ0VTU19UWVBFIiwgIlBFRVIiKTsKKwkJCWJyZWFrOworCQljYXNlIEFDQ0VTU19IT1NURUQ6CisJCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkFDQ0VTU19UWVBFIiwgIkhPU1RFRCIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGFjY2VzcyB0eXBlXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCWJyZWFrOworCQl9CisJCWlybGFuX2luc2VydF9zaG9ydF9wYXJhbShza2IsICJNQVhfRlJBTUUiLCAweDA1ZWUpOworCQlicmVhazsKKwljYXNlIENNRF9PUEVOX0RBVEFfQ0hBTk5FTDoKKwkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLworCQlpZiAoc2VsZi0+cHJvdmlkZXIuc2VuZF9hcmJfdmFsKSB7CisJCQlza2ItPmRhdGFbMV0gPSAweDAzOyAvKiAzIHBhcmFtZXRlcnMgKi8KKwkJCWlybGFuX2luc2VydF9zaG9ydF9wYXJhbShza2IsICJDT05fQVJCIiwgCisJCQkJCQkgc2VsZi0+cHJvdmlkZXIuc2VuZF9hcmJfdmFsKTsKKwkJfSBlbHNlCisJCQlza2ItPmRhdGFbMV0gPSAweDAyOyAvKiAyIHBhcmFtZXRlcnMgKi8KKwkJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiwgc2VsZi0+c3RzYXBfc2VsX2RhdGEpOworCQlpcmxhbl9pbnNlcnRfYXJyYXlfcGFyYW0oc2tiLCAiUkVDT05ORUNUX0tFWSIsICJMSU5VWCBSVUxFUyEiLAorCQkJCQkgMTIpOworCQlicmVhazsKKwljYXNlIENNRF9GSUxURVJfT1BFUkFUSU9OOgorCQlpcmxhbl9maWx0ZXJfcmVxdWVzdChzZWxmLCBza2IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGNvbW1hbmQhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJfQorCisJaXJ0dHBfZGF0YV9yZXF1ZXN0KHNlbGYtPnByb3ZpZGVyLnRzYXBfY3RybCwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX3Byb3ZpZGVyX3JlZ2lzdGVyKHZvaWQpCisgKgorICogICAgUmVnaXN0ZXIgcHJvdmlkZXIgc3VwcG9ydCBzbyB3ZSBjYW4gYWNjZXB0IGluY29taW5nIGNvbm5lY3Rpb25zLgorICogCisgKi8KK2ludCBpcmxhbl9wcm92aWRlcl9vcGVuX2N0cmxfdHNhcChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCit7CisJc3RydWN0IHRzYXBfY2IgKnRzYXA7CisJbm90aWZ5X3Qgbm90aWZ5OworCQorCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwkvKiBDaGVjayBpZiBhbHJlYWR5IG9wZW4gKi8KKwlpZiAoc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsKQorCQlyZXR1cm4gLTE7CisJCisJLyoKKwkgKiAgRmlyc3QgcmVnaXN0ZXIgd2VsbCBrbm93biBjb250cm9sIFRTQVAKKwkgKi8KKwlpcmRhX25vdGlmeV9pbml0KCZub3RpZnkpOworCW5vdGlmeS5kYXRhX2luZGljYXRpb24gICAgICAgPSBpcmxhbl9wcm92aWRlcl9kYXRhX2luZGljYXRpb247CisJbm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbiAgICA9IGlybGFuX3Byb3ZpZGVyX2Nvbm5lY3RfaW5kaWNhdGlvbjsKKwlub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gaXJsYW5fcHJvdmlkZXJfZGlzY29ubmVjdF9pbmRpY2F0aW9uOworCW5vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CisJc3RybGNweShub3RpZnkubmFtZSwgIklyTEFOIGN0cmwgKHApIiwgc2l6ZW9mKG5vdGlmeS5uYW1lKSk7CisKKwl0c2FwID0gaXJ0dHBfb3Blbl90c2FwKExTQVBfQU5ZLCAxLCAmbm90aWZ5KTsKKwlpZiAoIXRzYXApIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgR290IG5vIHRzYXAhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZWxmLT5wcm92aWRlci50c2FwX2N0cmwgPSB0c2FwOworCisJLyogUmVnaXN0ZXIgd2l0aCBMTS1JQVMgKi8KKwlpcmxhbl9pYXNfcmVnaXN0ZXIoc2VsZiwgdHNhcC0+c3RzYXBfc2VsKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9wcm92aWRlcl9ldmVudC5jIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fcHJvdmlkZXJfZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTA4NmY5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fcHJvdmlkZXJfZXZlbnQuYwpAQCAtMCwwICsxLDI0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcmxhbl9wcm92aWRlcl9ldmVudC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjkKKyAqIERlc2NyaXB0aW9uOiAgIElyTEFOIHByb3ZpZGVyIHN0YXRlIG1hY2hpbmUpCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTdW4gQXVnIDMxIDIwOjE0OjM3IDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFNhdCBPY3QgMzAgMTI6NTI6NDEgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXZlbnQuaD4KKworc3RhdGljIGludCBpcmxhbl9wcm92aWRlcl9zdGF0ZV9pZGxlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IGlybGFuX3Byb3ZpZGVyX3N0YXRlX2luZm8oc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fcHJvdmlkZXJfc3RhdGVfb3BlbihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmxhbl9wcm92aWRlcl9zdGF0ZV9kYXRhKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyBpbnQgKCpzdGF0ZVtdKShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgPSAKK3sgCisJaXJsYW5fcHJvdmlkZXJfc3RhdGVfaWRsZSwKKwlOVUxMLCAvKiBRdWVyeSAqLworCU5VTEwsIC8qIEluZm8gKi8KKwlpcmxhbl9wcm92aWRlcl9zdGF0ZV9pbmZvLAorCU5VTEwsIC8qIE1lZGlhICovCisJaXJsYW5fcHJvdmlkZXJfc3RhdGVfb3BlbiwKKwlOVUxMLCAvKiBXYWl0ICovCisJTlVMTCwgLyogQXJiICovCisJaXJsYW5fcHJvdmlkZXJfc3RhdGVfZGF0YSwKKwlOVUxMLCAvKiBDbG9zZSAqLworCU5VTEwsIC8qIFN5bmMgKi8KK307CisKK3ZvaWQgaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfQVNTRVJUKCpzdGF0ZVsgc2VsZi0+cHJvdmlkZXIuc3RhdGVdICE9IE5VTEwsIHJldHVybjspOworCisJKCpzdGF0ZVtzZWxmLT5wcm92aWRlci5zdGF0ZV0pIChzZWxmLCBldmVudCwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX3Byb3ZpZGVyX3N0YXRlX2lkbGUgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgSURMRSwgV2UgYXJlIHdhaXRpbmcgZm9yIGFuIGluZGljYXRpb24gdGhhdCB0aGVyZSBpcyBhIHByb3ZpZGVyCisgKiAgICBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fcHJvdmlkZXJfc3RhdGVfaWRsZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCQorCXN3aXRjaChldmVudCkgeworCWNhc2UgSVJMQU5fQ09OTkVDVF9JTkRJQ0FUSU9OOgorCSAgICAgaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9yZXNwb25zZSggc2VsZiwgc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsKTsKKwkgICAgIGlybGFuX25leHRfcHJvdmlkZXJfc3RhdGUoIHNlbGYsIElSTEFOX0lORk8pOworCSAgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9wcm92aWRlcl9zdGF0ZV9pbmZvIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIElORk8sIFdlIGhhdmUgaXNzdWVkIGEgR2V0SW5mbyBjb21tYW5kIGFuZCBpcyBhd2FpdGluZyBhIHJlcGx5LgorICovCitzdGF0aWMgaW50IGlybGFuX3Byb3ZpZGVyX3N0YXRlX2luZm8oc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlpbnQgcmV0OworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaChldmVudCkgeworCWNhc2UgSVJMQU5fR0VUX0lORk9fQ01EOgorCQkvKiBCZSBzdXJlIHRvIHVzZSA4MDIuMyBpbiBjYXNlIG9mIHBlZXIgbW9kZSAqLworCQlpZiAoc2VsZi0+cHJvdmlkZXIuYWNjZXNzX3R5cGUgPT0gQUNDRVNTX1BFRVIpIHsKKwkJCXNlbGYtPm1lZGlhID0gTUVESUFfODAyXzM7CisJCQkKKwkJCS8qIENoZWNrIGlmIGNsaWVudCBoYXMgc3RhcnRlZCB5ZXQgKi8KKwkJCWlmIChzZWxmLT5jbGllbnQuc3RhdGUgPT0gSVJMQU5fSURMRSkgeworCQkJCS8qIFRoaXMgc2hvdWxkIGdldCB0aGUgY2xpZW50IGdvaW5nICovCisJCQkJaXJsbXBfZGlzY292ZXJ5X3JlcXVlc3QoOCk7CisJCQl9CisJCX0KKworCQlpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5KHNlbGYsIENNRF9HRVRfUFJPVklERVJfSU5GTywgCisJCQkJCSAgUlNQX1NVQ0NFU1MpOworCQkvKiBLZWVwIHN0YXRlICovCisJCWJyZWFrOworCWNhc2UgSVJMQU5fR0VUX01FRElBX0NNRDogCisJCWlybGFuX3Byb3ZpZGVyX3NlbmRfcmVwbHkoc2VsZiwgQ01EX0dFVF9NRURJQV9DSEFSLCAKKwkJCQkJICBSU1BfU1VDQ0VTUyk7CisJCS8qIEtlZXAgc3RhdGUgKi8KKwkJYnJlYWs7CQkKKwljYXNlIElSTEFOX09QRU5fREFUQV9DTUQ6CisJCXJldCA9IGlybGFuX3BhcnNlX29wZW5fZGF0YV9jbWQoc2VsZiwgc2tiKTsKKwkJaWYgKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSB7CisJCQkvKiBGSVhNRTogbWFrZSB1c2Ugb2YgcmFuZG9tIGZ1bmN0aW9ucyEgKi8KKwkJCXNlbGYtPnByb3ZpZGVyLnNlbmRfYXJiX3ZhbCA9IChqaWZmaWVzICYgMHhmZmZmKTsKKwkJfQorCQlpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5KHNlbGYsIENNRF9PUEVOX0RBVEFfQ0hBTk5FTCwgcmV0KTsKKworCQlpZiAocmV0ID09IFJTUF9TVUNDRVNTKSB7CisJCQlpcmxhbl9uZXh0X3Byb3ZpZGVyX3N0YXRlKHNlbGYsIElSTEFOX09QRU4pOworCisJCQkvKiBTaWduYWwgY2xpZW50IHRoYXQgd2UgYXJlIG5vdyBvcGVuICovCisJCQlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fUFJPVklERVJfU0lHTkFMLCBOVUxMKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOiAgLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgorCQlpcmxhbl9uZXh0X3Byb3ZpZGVyX3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKCAwLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfc3RhdGVfb3BlbiAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBPUEVOLCBUaGUgY2xpZW50IGhhcyBpc3N1ZWQgYSBPcGVuRGF0YSBjb21tYW5kIGFuZCBpcyBhd2FpdGluZyBhCisgKiAgICByZXBseQorICoKKyAqLworc3RhdGljIGludCBpcmxhbl9wcm92aWRlcl9zdGF0ZV9vcGVuKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIElSTEFOX0ZJTFRFUl9DT05GSUdfQ01EOgorCQlpcmxhbl9wcm92aWRlcl9wYXJzZV9jb21tYW5kKHNlbGYsIENNRF9GSUxURVJfT1BFUkFUSU9OLCBza2IpOworCQlpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5KHNlbGYsIENNRF9GSUxURVJfT1BFUkFUSU9OLCAKKwkJCQkJICBSU1BfU1VDQ0VTUyk7CisJCS8qIEtlZXAgc3RhdGUgKi8KKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9EQVRBX0NPTk5FQ1RfSU5ESUNBVElPTjogCisJCWlybGFuX25leHRfcHJvdmlkZXJfc3RhdGUoc2VsZiwgSVJMQU5fREFUQSk7CisJCWlybGFuX3Byb3ZpZGVyX2Nvbm5lY3RfcmVzcG9uc2Uoc2VsZiwgc2VsZi0+dHNhcF9kYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDogIC8qIEZBTExUSFJPVUdIICovCisJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKKwkJaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9wcm92aWRlcl9zdGF0ZV9kYXRhIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIERBVEEsIFRoZSBkYXRhIGNoYW5uZWwgaXMgY29ubmVjdGVkLCBhbGxvd2luZyBkYXRhIHRyYW5zZmVycyBiZXR3ZWVuCisgKiAgICB0aGUgbG9jYWwgYW5kIHJlbW90ZSBtYWNoaW5lcy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fcHJvdmlkZXJfc3RhdGVfZGF0YShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIElSTEFOX0ZJTFRFUl9DT05GSUdfQ01EOgorCQlpcmxhbl9wcm92aWRlcl9wYXJzZV9jb21tYW5kKHNlbGYsIENNRF9GSUxURVJfT1BFUkFUSU9OLCBza2IpOworCQlpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5KHNlbGYsIENNRF9GSUxURVJfT1BFUkFUSU9OLCAKKwkJCQkJICBSU1BfU1VDQ0VTUyk7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6IC8qIEZBTExUSFJPVUdIICovCisJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKKwkJaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRyggMCwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYXAuYyBiL25ldC9pcmRhL2lybGFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2YWQwNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybGFwLmMKQEAgLTAsMCArMSwxMjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgaXJsYXAuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBJckxBUCBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXgKKyAqIFN0YXR1czogICAgICAgIFN0YWJsZQorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgTW9uIEF1ZyAgNCAyMDo0MDo1MyAxOTk3CisgKiBNb2RpZmllZCBhdDogICBUdWUgRGVjIDE0IDA5OjI2OjQ0IDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJxdWV1ZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXBfZnJhbWUuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcF9mcmFtZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9xb3MuaD4KKworc3RhdGljIGhhc2hiaW5fdCAqaXJsYXAgPSBOVUxMOworaW50IHN5c2N0bF9zbG90X3RpbWVvdXQgPSBTTE9UX1RJTUVPVVQgKiAxMDAwIC8gSFo7CisKKy8qIFRoaXMgaXMgdGhlIGRlbGF5IG9mIG1pc3NlZCBwZiBwZXJpb2QgYmVmb3JlIGdlbmVyYXRpbmcgYW4gZXZlbnQKKyAqIHRvIHRoZSBhcHBsaWNhdGlvbi4gVGhlIHNwZWMgbWFuZGF0ZSAzIHNlY29uZHMsIGJ1dCBpbiBzb21lIGNhc2VzCisgKiBpdCdzIHdheSB0b28gbG9uZy4gLSBKZWFuIElJICovCitpbnQgc3lzY3RsX3dhcm5fbm9yZXBseV90aW1lID0gMzsKKworZXh0ZXJuIHZvaWQgaXJsYXBfcXVldWVfeG1pdChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgX19pcmxhcF9jbG9zZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgaXJsYXBfaW5pdF9xb3NfY2FwYWJpbGl0aWVzKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwKKwkJCQkJc3RydWN0IHFvc19pbmZvICpxb3NfdXNlcik7CisKKyNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRworc3RhdGljIGNoYXIgKmxhcF9yZWFzb25zW10gPSB7CisJIkVSUk9SLCBOT1QgVVNFRCIsCisJIkxBUF9ESVNDX0lORElDQVRJT04iLAorCSJMQVBfTk9fUkVTUE9OU0UiLAorCSJMQVBfUkVTRVRfSU5ESUNBVElPTiIsCisJIkxBUF9GT1VORF9OT05FIiwKKwkiTEFQX01FRElBX0JVU1kiLAorCSJMQVBfUFJJTUFSWV9DT05GTElDVCIsCisJIkVSUk9SLCBOT1QgVVNFRCIsCit9OworI2VuZGlmCS8qIENPTkZJR19JUkRBX0RFQlVHICovCisKK2ludCBfX2luaXQgaXJsYXBfaW5pdCh2b2lkKQoreworCS8qIENoZWNrIGlmIHRoZSBjb21waWxlciBkaWQgaXRzIGpvYiBwcm9wZXJseS4KKwkgKiBNYXkgaGFwcGVuIG9uIHNvbWUgQVJNIGNvbmZpZ3VyYXRpb24sIGNoZWNrIHdpdGggUnVzc2VsbCBLaW5nLiAqLworCUlSREFfQVNTRVJUKHNpemVvZihzdHJ1Y3QgeGlkX2ZyYW1lKSA9PSAxNCwgOyk7CisJSVJEQV9BU1NFUlQoc2l6ZW9mKHN0cnVjdCB0ZXN0X2ZyYW1lKSA9PSAxMCwgOyk7CisJSVJEQV9BU1NFUlQoc2l6ZW9mKHN0cnVjdCB1YV9mcmFtZSkgPT0gMTAsIDspOworCUlSREFfQVNTRVJUKHNpemVvZihzdHJ1Y3Qgc25ybV9mcmFtZSkgPT0gMTEsIDspOworCisJLyogQWxsb2NhdGUgbWFzdGVyIGFycmF5ICovCisJaXJsYXAgPSBoYXNoYmluX25ldyhIQl9MT0NLKTsKKwlpZiAoaXJsYXAgPT0gTlVMTCkgeworCSAgICAgICAgSVJEQV9FUlJPUigiJXM6IGNhbid0IGFsbG9jYXRlIGlybGFwIGhhc2hiaW4hXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19leGl0IGlybGFwX2NsZWFudXAodm9pZCkKK3sKKwlJUkRBX0FTU0VSVChpcmxhcCAhPSBOVUxMLCByZXR1cm47KTsKKworCWhhc2hiaW5fZGVsZXRlKGlybGFwLCAoRlJFRV9GVU5DKSBfX2lybGFwX2Nsb3NlKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX29wZW4gKGRyaXZlcikKKyAqCisgKiAgICBJbml0aWFsaXplIElyTEFQIGxheWVyCisgKgorICovCitzdHJ1Y3QgaXJsYXBfY2IgKmlybGFwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHFvc19pbmZvICpxb3MsCisJCQkgICAgY29uc3QgY2hhciAqaHdfbmFtZSkKK3sKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGY7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogSW5pdGlhbGl6ZSB0aGUgaXJsYXAgc3RydWN0dXJlLiAqLworCXNlbGYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJsYXBfY2IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChzZWxmLCAwLCBzaXplb2Yoc3RydWN0IGlybGFwX2NiKSk7CisJc2VsZi0+bWFnaWMgPSBMQVBfTUFHSUM7CisKKwkvKiBNYWtlIGEgYmluZGluZyBiZXR3ZWVuIHRoZSBsYXllcnMgKi8KKwlzZWxmLT5uZXRkZXYgPSBkZXY7CisJc2VsZi0+cW9zX2RldiA9IHFvczsKKwkvKiBDb3B5IGhhcmR3YXJlIG5hbWUgKi8KKwlpZihod19uYW1lICE9IE5VTEwpIHsKKwkJc3RybGNweShzZWxmLT5od19uYW1lLCBod19uYW1lLCBzaXplb2Yoc2VsZi0+aHdfbmFtZSkpOworCX0gZWxzZSB7CisJCXNlbGYtPmh3X25hbWVbMF0gPSAnXDAnOworCX0KKworCS8qIEZJWE1FOiBzaG91bGQgd2UgZ2V0IG91ciBvd24gZmllbGQ/ICovCisJZGV2LT5hdGFsa19wdHIgPSBzZWxmOworCisJc2VsZi0+c3RhdGUgPSBMQVBfT0ZGTElORTsKKworCS8qIEluaXRpYWxpemUgdHJhbnNtaXQgcXVldWUgKi8KKwlza2JfcXVldWVfaGVhZF9pbml0KCZzZWxmLT50eHEpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNlbGYtPnR4cV91bHRyYSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2VsZi0+d3hfbGlzdCk7CisKKwkvKiBNeSB1bmlxdWUgSXJMQVAgZGV2aWNlIGFkZHJlc3MhICovCisJLyogV2UgZG9uJ3Qgd2FudCB0aGUgYnJvYWRjYXN0IGFkZHJlc3MsIG5laXRoZXIgdGhlIE5VTEwgYWRkcmVzcworCSAqIChtb3N0IG9mdGVuIHVzZWQgdG8gc2lnbmlmeSAiaW52YWxpZCIpLCBhbmQgd2UgZG9uJ3Qgd2FudCBhbgorCSAqIGFkZHJlc3MgYWxyZWFkeSBpbiB1c2UgKG90aGVyd2lzZSBjb25uZWN0IHdvbid0IGJlIGFibGUKKwkgKiB0byBzZWxlY3QgdGhlIHByb3BlciBsaW5rKS4gLSBKZWFuIElJICovCisJZG8geworCQlnZXRfcmFuZG9tX2J5dGVzKCZzZWxmLT5zYWRkciwgc2l6ZW9mKHNlbGYtPnNhZGRyKSk7CisJfSB3aGlsZSAoKHNlbGYtPnNhZGRyID09IDB4MCkgfHwgKHNlbGYtPnNhZGRyID09IEJST0FEQ0FTVCkgfHwKKwkJIChoYXNoYmluX2xvY2tfZmluZChpcmxhcCwgc2VsZi0+c2FkZHIsIE5VTEwpKSApOworCS8qIENvcHkgdG8gdGhlIGRyaXZlciAqLworCW1lbWNweShkZXYtPmRldl9hZGRyLCAmc2VsZi0+c2FkZHIsIDQpOworCisJaW5pdF90aW1lcigmc2VsZi0+c2xvdF90aW1lcik7CisJaW5pdF90aW1lcigmc2VsZi0+cXVlcnlfdGltZXIpOworCWluaXRfdGltZXIoJnNlbGYtPmRpc2NvdmVyeV90aW1lcik7CisJaW5pdF90aW1lcigmc2VsZi0+ZmluYWxfdGltZXIpOworCWluaXRfdGltZXIoJnNlbGYtPnBvbGxfdGltZXIpOworCWluaXRfdGltZXIoJnNlbGYtPndkX3RpbWVyKTsKKwlpbml0X3RpbWVyKCZzZWxmLT5iYWNrb2ZmX3RpbWVyKTsKKwlpbml0X3RpbWVyKCZzZWxmLT5tZWRpYV9idXN5X3RpbWVyKTsKKworCWlybGFwX2FwcGx5X2RlZmF1bHRfY29ubmVjdGlvbl9wYXJhbWV0ZXJzKHNlbGYpOworCisJc2VsZi0+TjMgPSAzOyAvKiAjIGNvbm5lY3Rpb25zIGF0dGVtdHMgdG8gdHJ5IGJlZm9yZSBnaXZpbmcgdXAgKi8KKworCXNlbGYtPnN0YXRlID0gTEFQX05ETTsKKworCWhhc2hiaW5faW5zZXJ0KGlybGFwLCAoaXJkYV9xdWV1ZV90ICopIHNlbGYsIHNlbGYtPnNhZGRyLCBOVUxMKTsKKworCWlybG1wX3JlZ2lzdGVyX2xpbmsoc2VsZiwgc2VsZi0+c2FkZHIsICZzZWxmLT5ub3RpZnkpOworCisJcmV0dXJuIHNlbGY7Cit9CitFWFBPUlRfU1lNQk9MKGlybGFwX29wZW4pOworCisvKgorICogRnVuY3Rpb24gX19pcmxhcF9jbG9zZSAoc2VsZikKKyAqCisgKiAgICBSZW1vdmUgSXJMQVAgYW5kIGFsbCBhbGxvY2F0ZWQgbWVtb3J5LiBTdG9wIGFueSBwZW5kaW5nIHRpbWVycy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9faXJsYXBfY2xvc2Uoc3RydWN0IGlybGFwX2NiICpzZWxmKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCS8qIFN0b3AgdGltZXJzICovCisJZGVsX3RpbWVyKCZzZWxmLT5zbG90X3RpbWVyKTsKKwlkZWxfdGltZXIoJnNlbGYtPnF1ZXJ5X3RpbWVyKTsKKwlkZWxfdGltZXIoJnNlbGYtPmRpc2NvdmVyeV90aW1lcik7CisJZGVsX3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisJZGVsX3RpbWVyKCZzZWxmLT5wb2xsX3RpbWVyKTsKKwlkZWxfdGltZXIoJnNlbGYtPndkX3RpbWVyKTsKKwlkZWxfdGltZXIoJnNlbGYtPmJhY2tvZmZfdGltZXIpOworCWRlbF90aW1lcigmc2VsZi0+bWVkaWFfYnVzeV90aW1lcik7CisKKwlpcmxhcF9mbHVzaF9hbGxfcXVldWVzKHNlbGYpOworCisJc2VsZi0+bWFnaWMgPSAwOworCisJa2ZyZWUoc2VsZik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9jbG9zZSAoc2VsZikKKyAqCisgKiAgICBSZW1vdmUgSXJMQVAgaW5zdGFuY2UKKyAqCisgKi8KK3ZvaWQgaXJsYXBfY2xvc2Uoc3RydWN0IGlybGFwX2NiICpzZWxmKQoreworCXN0cnVjdCBpcmxhcF9jYiAqbGFwOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCS8qIFdlIHVzZWQgdG8gc2VuZCBhIExBUF9ESVNDX0lORElDQVRJT04gaGVyZSwgYnV0IHRoaXMgd2FzCisJICogcmFjeS4gVGhpcyBoYXMgYmVlbiBtb3ZlIHdpdGhpbiBpcmxtcF91bnJlZ2lzdGVyX2xpbmsoKQorCSAqIGl0c2VsZi4gSmVhbiBJSSAqLworCisJLyogS2lsbCB0aGUgTEFQIGFuZCBhbGwgTFNBUHMgb24gdG9wIG9mIGl0ICovCisJaXJsbXBfdW5yZWdpc3Rlcl9saW5rKHNlbGYtPnNhZGRyKTsKKwlzZWxmLT5ub3RpZnkuaW5zdGFuY2UgPSBOVUxMOworCisJLyogQmUgc3VyZSB0aGF0IHdlIG1hbmFnZSB0byByZW1vdmUgb3Vyc2VsZiBmcm9tIHRoZSBoYXNoICovCisJbGFwID0gaGFzaGJpbl9yZW1vdmUoaXJsYXAsIHNlbGYtPnNhZGRyLCBOVUxMKTsKKwlpZiAoIWxhcCkgeworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBEaWRuJ3QgZmluZCBteXNlbGYhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCV9faXJsYXBfY2xvc2UobGFwKTsKK30KK0VYUE9SVF9TWU1CT0woaXJsYXBfY2xvc2UpOworCisvKgorICogRnVuY3Rpb24gaXJsYXBfY29ubmVjdF9pbmRpY2F0aW9uIChzZWxmLCBza2IpCisgKgorICogICAgQW5vdGhlciBkZXZpY2UgaXMgYXR0ZW1wdGluZyB0byBtYWtlIGEgY29ubmVjdGlvbgorICoKKyAqLwordm9pZCBpcmxhcF9jb25uZWN0X2luZGljYXRpb24oc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlpcmxhcF9pbml0X3Fvc19jYXBhYmlsaXRpZXMoc2VsZiwgTlVMTCk7IC8qIE5vIHVzZXIgUW9TISAqLworCisJaXJsbXBfbGlua19jb25uZWN0X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLT5zYWRkciwKKwkJCQkgICAgICBzZWxmLT5kYWRkciwgJnNlbGYtPnFvc190eCwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2Nvbm5lY3RfcmVzcG9uc2UgKHNlbGYsIHNrYikKKyAqCisgKiAgICBTZXJ2aWNlIHVzZXIgaGFzIGFjY2VwdGVkIGluY29taW5nIGNvbm5lY3Rpb24KKyAqCisgKi8KK3ZvaWQgaXJsYXBfY29ubmVjdF9yZXNwb25zZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSkKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaXJsYXBfZG9fZXZlbnQoc2VsZiwgQ09OTkVDVF9SRVNQT05TRSwgdXNlcmRhdGEsIE5VTEwpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfY29ubmVjdF9yZXF1ZXN0IChzZWxmLCBkYWRkciwgcW9zX3VzZXIsIHNuaWZmKQorICoKKyAqICAgIFJlcXVlc3QgY29ubmVjdGlvbiB3aXRoIGFub3RoZXIgZGV2aWNlLCBzbmlmZmluZyBpcyBub3QgaW1wbGVtZW50ZWQKKyAqICAgIHlldC4KKyAqCisgKi8KK3ZvaWQgaXJsYXBfY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgX191MzIgZGFkZHIsCisJCQkgICBzdHJ1Y3QgcW9zX2luZm8gKnFvc191c2VyLCBpbnQgc25pZmYpCit7CisJSVJEQV9ERUJVRygzLCAiJXMoKSwgZGFkZHI9MHglMDh4XG4iLCBfX0ZVTkNUSU9OX18sIGRhZGRyKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCXNlbGYtPmRhZGRyID0gZGFkZHI7CisKKwkvKgorCSAqICBJZiB0aGUgc2VydmljZSB1c2VyIHNwZWNpZmllcyBRb1MgdmFsdWVzIGZvciB0aGlzIGNvbm5lY3Rpb24sCisJICogIHRoZW4gdXNlIHRoZW0KKwkgKi8KKwlpcmxhcF9pbml0X3Fvc19jYXBhYmlsaXRpZXMoc2VsZiwgcW9zX3VzZXIpOworCisJaWYgKChzZWxmLT5zdGF0ZSA9PSBMQVBfTkRNKSAmJiAhc2VsZi0+bWVkaWFfYnVzeSkKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgQ09OTkVDVF9SRVFVRVNULCBOVUxMLCBOVUxMKTsKKwllbHNlCisJCXNlbGYtPmNvbm5lY3RfcGVuZGluZyA9IFRSVUU7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9jb25uZWN0X2NvbmZpcm0gKHNlbGYsIHNrYikKKyAqCisgKiAgICBDb25uZWN0aW9uIHJlcXVlc3QgaGFzIGJlZW4gYWNjZXB0ZWQKKyAqCisgKi8KK3ZvaWQgaXJsYXBfY29ubmVjdF9jb25maXJtKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJaXJsbXBfbGlua19jb25uZWN0X2NvbmZpcm0oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCAmc2VsZi0+cW9zX3R4LCBza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfZGF0YV9pbmRpY2F0aW9uIChzZWxmLCBza2IpCisgKgorICogICAgUmVjZWl2ZWQgZGF0YSBmcmFtZXMgZnJvbSBJUi1wb3J0LCBzbyB3ZSBqdXN0IHBhc3MgdGhlbSB1cCB0bworICogICAgSXJMTVAgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZworICoKKyAqLwordm9pZCBpcmxhcF9kYXRhX2luZGljYXRpb24oc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgaW50IHVucmVsaWFibGUpCit7CisJLyogSGlkZSBMQVAgaGVhZGVyIGZyb20gSXJMTVAgbGF5ZXIgKi8KKwlza2JfcHVsbChza2IsIExBUF9BRERSX0hFQURFUitMQVBfQ1RSTF9IRUFERVIpOworCisJaXJsbXBfbGlua19kYXRhX2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBza2IsIHVucmVsaWFibGUpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9kYXRhX3JlcXVlc3QgKHNlbGYsIHNrYikKKyAqCisgKiAgICBRdWV1ZSBkYXRhIGZvciB0cmFuc21pc3Npb24sIG11c3Qgd2FpdCB1bnRpbCBYTUlUIHN0YXRlCisgKgorICovCit2b2lkIGlybGFwX2RhdGFfcmVxdWVzdChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlpbnQgdW5yZWxpYWJsZSkKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHNrYikgPj0gKExBUF9BRERSX0hFQURFUitMQVBfQ1RSTF9IRUFERVIpLAorCQkgICAgcmV0dXJuOyk7CisJc2tiX3B1c2goc2tiLCBMQVBfQUREUl9IRUFERVIrTEFQX0NUUkxfSEVBREVSKTsKKworCS8qCisJICogIE11c3Qgc2V0IGZyYW1lIGZvcm1hdCBub3cgc28gdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29kZSBrbm93cworCSAqICBpZiBpdHMgZGVhbGluZyB3aXRoIGFuIEkgb3IgYW4gVUkgZnJhbWUKKwkgKi8KKwlpZiAodW5yZWxpYWJsZSkKKwkJc2tiLT5kYXRhWzFdID0gVUlfRlJBTUU7CisJZWxzZQorCQlza2ItPmRhdGFbMV0gPSBJX0ZSQU1FOworCisJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2VlIGlybG1wX2Nvbm5lY3RfcmVxdWVzdCgpLiAqLworCXNrYl9nZXQoc2tiKTsKKworCS8qIEFkZCBhdCB0aGUgZW5kIG9mIHRoZSBxdWV1ZSAoa2VlcCBvcmRlcmluZykgLSBKZWFuIElJICovCisJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPnR4cSwgc2tiKTsKKworCS8qCisJICogIFNlbmQgZXZlbnQgaWYgdGhpcyBmcmFtZSBvbmx5IGlmIHdlIGFyZSBpbiB0aGUgcmlnaHQgc3RhdGUKKwkgKiAgRklYTUU6IHVkYXRhIHNob3VsZCBiZSBzZW50IGZpcnN0ISAoc2tiX3F1ZXVlX2hlYWQ/KQorCSAqLworCWlmICgoc2VsZi0+c3RhdGUgPT0gTEFQX1hNSVRfUCkgfHwgKHNlbGYtPnN0YXRlID09IExBUF9YTUlUX1MpKSB7CisJCS8qIElmIHdlIGFyZSBub3QgYWxyZWFkeSBwcm9jZXNzaW5nIHRoZSBUeCBxdWV1ZSwgdHJpZ2dlcgorCQkgKiB0cmFuc21pc3Npb24gaW1tZWRpYXRlbHkgLSBKZWFuIElJICovCisJCWlmKChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpIDw9IDEpICYmICghc2VsZi0+bG9jYWxfYnVzeSkpCisJCQlpcmxhcF9kb19ldmVudChzZWxmLCBEQVRBX1JFUVVFU1QsIHNrYiwgTlVMTCk7CisJCS8qIE90aGVyd2lzZSwgdGhlIHBhY2tldHMgd2lsbCBiZSBzZW50IG5vcm1hbGx5IGF0IHRoZQorCQkgKiBuZXh0IHBmLXBvbGwgLSBKZWFuIElJICovCisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfdW5pdGRhdGFfcmVxdWVzdCAoc2VsZiwgc2tiKQorICoKKyAqICAgIFNlbmQgVWx0cmEgZGF0YS4gVGhpcyBpcyBkYXRhIHRoYXQgbXVzdCBiZSBzZW50IG91dHNpZGUgYW55IGNvbm5lY3Rpb24KKyAqCisgKi8KKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQordm9pZCBpcmxhcF91bml0ZGF0YV9yZXF1ZXN0KHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHNrYikgPj0gKExBUF9BRERSX0hFQURFUitMQVBfQ1RSTF9IRUFERVIpLAorCSAgICAgICByZXR1cm47KTsKKwlza2JfcHVzaChza2IsIExBUF9BRERSX0hFQURFUitMQVBfQ1RSTF9IRUFERVIpOworCisJc2tiLT5kYXRhWzBdID0gQ0JST0FEQ0FTVDsKKwlza2ItPmRhdGFbMV0gPSBVSV9GUkFNRTsKKworCS8qIERvbid0IG5lZWQgdG8gcmVmY291bnQsIHNlZSBpcmxtcF9jb25ubGVzc19kYXRhX3JlcXVlc3QoKSAqLworCisJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPnR4cV91bHRyYSwgc2tiKTsKKworCWlybGFwX2RvX2V2ZW50KHNlbGYsIFNFTkRfVUlfRlJBTUUsIE5VTEwsIE5VTEwpOworfQorI2VuZGlmIC8qQ09ORklHX0lSREFfVUxUUkEgKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3VkYXRhX2luZGljYXRpb24gKHNlbGYsIHNrYikKKyAqCisgKiAgICBSZWNlaXZlIFVsdHJhIGRhdGEuIFRoaXMgaXMgZGF0YSB0aGF0IGlzIHJlY2VpdmVkIG91dHNpZGUgYW55IGNvbm5lY3Rpb24KKyAqCisgKi8KKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQordm9pZCBpcmxhcF91bml0ZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIEhpZGUgTEFQIGhlYWRlciBmcm9tIElyTE1QIGxheWVyICovCisJc2tiX3B1bGwoc2tiLCBMQVBfQUREUl9IRUFERVIrTEFQX0NUUkxfSEVBREVSKTsKKworCWlybG1wX2xpbmtfdW5pdGRhdGFfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNrYik7Cit9CisjZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2Rpc2Nvbm5lY3RfcmVxdWVzdCAodm9pZCkKKyAqCisgKiAgICBSZXF1ZXN0IHRvIGRpc2Nvbm5lY3QgY29ubmVjdGlvbiBieSBzZXJ2aWNlIHVzZXIKKyAqLwordm9pZCBpcmxhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlybGFwX2NiICpzZWxmKQoreworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBEb24ndCBkaXNjb25uZWN0IHVudGlsIGFsbCBkYXRhIGZyYW1lcyBhcmUgc3VjY2Vzc2Z1bGx5IHNlbnQgKi8KKwlpZiAoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSA+IDApIHsKKwkJc2VsZi0+ZGlzY29ubmVjdF9wZW5kaW5nID0gVFJVRTsKKworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgaWYgd2UgYXJlIGluIHRoZSByaWdodCBzdGF0ZSBmb3IgZGlzY29ubmVjdGluZyAqLworCXN3aXRjaCAoc2VsZi0+c3RhdGUpIHsKKwljYXNlIExBUF9YTUlUX1A6ICAgICAgICAvKiBGQUxMVFJPVUdIICovCisJY2FzZSBMQVBfWE1JVF9TOiAgICAgICAgLyogRkFMTFRST1VHSCAqLworCWNhc2UgTEFQX0NPTk46ICAgICAgICAgIC8qIEZBTExUUk9VR0ggKi8KKwljYXNlIExBUF9SRVNFVF9XQUlUOiAgICAvKiBGQUxMVFJPVUdIICovCisJY2FzZSBMQVBfUkVTRVRfQ0hFQ0s6CisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIERJU0NPTk5FQ1RfUkVRVUVTVCwgTlVMTCwgTlVMTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIGRpc2Nvbm5lY3QgcGVuZGluZyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNlbGYtPmRpc2Nvbm5lY3RfcGVuZGluZyA9IFRSVUU7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAodm9pZCkKKyAqCisgKiAgICBEaXNjb25uZWN0IHJlcXVlc3QgZnJvbSBvdGhlciBkZXZpY2UKKyAqCisgKi8KK3ZvaWQgaXJsYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgTEFQX1JFQVNPTiByZWFzb24pCit7CisJSVJEQV9ERUJVRygxLCAiJXMoKSwgcmVhc29uPSVzXG4iLCBfX0ZVTkNUSU9OX18sIGxhcF9yZWFzb25zW3JlYXNvbl0pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJLyogRmx1c2ggcXVldWVzICovCisJaXJsYXBfZmx1c2hfYWxsX3F1ZXVlcyhzZWxmKTsKKworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBMQVBfUkVTRVRfSU5ESUNBVElPTjoKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgU2VuZGluZyByZXNldCByZXF1ZXN0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVTRVRfUkVRVUVTVCwgTlVMTCwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgTEFQX05PX1JFU1BPTlNFOgkgICAvKiBGQUxMVFJPVUdIICovCisJY2FzZSBMQVBfRElTQ19JTkRJQ0FUSU9OOiAgLyogRkFMTFRST1VHSCAqLworCWNhc2UgTEFQX0ZPVU5EX05PTkU6ICAgICAgIC8qIEZBTExUUk9VR0ggKi8KKwljYXNlIExBUF9NRURJQV9CVVNZOgorCQlpcmxtcF9saW5rX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsCisJCQkJCQkgcmVhc29uLCBOVUxMKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXM6IFVua25vd24gcmVhc29uICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlYXNvbik7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfZGlzY292ZXJ5X3JlcXVlc3QgKGdlbl9hZGRyX2JpdCkKKyAqCisgKiAgICBTdGFydCBvbmUgc2luZ2xlIGRpc2NvdmVyeSBvcGVyYXRpb24uCisgKgorICovCit2b2lkIGlybGFwX2Rpc2NvdmVyeV9yZXF1ZXN0KHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgZGlzY292ZXJ5X3QgKmRpc2NvdmVyeSkKK3sKKwlzdHJ1Y3QgaXJsYXBfaW5mbyBpbmZvOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKGRpc2NvdmVyeSAhPSBOVUxMLCByZXR1cm47KTsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIG5zbG90cyA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGRpc2NvdmVyeS0+bnNsb3RzKTsKKworCUlSREFfQVNTRVJUKChkaXNjb3ZlcnktPm5zbG90cyA9PSAxKSB8fCAoZGlzY292ZXJ5LT5uc2xvdHMgPT0gNikgfHwKKwkJICAgIChkaXNjb3ZlcnktPm5zbG90cyA9PSA4KSB8fCAoZGlzY292ZXJ5LT5uc2xvdHMgPT0gMTYpLAorCQkgICAgcmV0dXJuOyk7CisKKwkvKiBEaXNjb3ZlcnkgaXMgb25seSBwb3NzaWJsZSBpbiBORE0gbW9kZSAqLworCWlmIChzZWxmLT5zdGF0ZSAhPSBMQVBfTkRNKSB7CisJCUlSREFfREVCVUcoNCwgIiVzKCksIGRpc2NvdmVyeSBvbmx5IHBvc3NpYmxlIGluIE5ETSBtb2RlXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJaXJsYXBfZGlzY292ZXJ5X2NvbmZpcm0oc2VsZiwgTlVMTCk7CisJCS8qIE5vdGUgOiBpbiB0aGVvcnksIGlmIHdlIGFyZSBub3QgaW4gTkRNLCB3ZSBjb3VsZCBwb3N0cG9uZQorCQkgKiB0aGUgZGlzY292ZXJ5IGxpa2Ugd2UgZG8gZm9yIGNvbm5lY3Rpb24gcmVxdWVzdC4KKwkJICogSW4gcHJhY3RpY2UsIGl0J3Mgbm90IHdvcnRoIGl0LiBJZiB0aGUgbWVkaWEgd2FzIGJ1c3ksCisJCSAqIGl0J3MgbGlrZWx5IG5leHQgdGltZSBhcm91bmQgaXQgd29uJ3QgYmUgYnVzeS4gSWYgd2UgYXJlCisJCSAqIGluIFJFUExZIHN0YXRlLCB3ZSB3aWxsIGdldCBwYXNzaXZlIGRpc2NvdmVyeSBpbmZvICYgZXZlbnQuCisJCSAqIEplYW4gSUkgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIGlmIGxhc3QgZGlzY292ZXJ5IHJlcXVlc3QgZmluaXNoZWQgaW4gdGltZSwgb3IgaWYKKwkgKiBpdCB3YXMgYWJvcnRlZCBkdWUgdG8gdGhlIG1lZGlhIGJ1c3kgZmxhZy4gKi8KKwlpZiAoc2VsZi0+ZGlzY292ZXJ5X2xvZyAhPSBOVUxMKSB7CisJCWhhc2hiaW5fZGVsZXRlKHNlbGYtPmRpc2NvdmVyeV9sb2csIChGUkVFX0ZVTkMpIGtmcmVlKTsKKwkJc2VsZi0+ZGlzY292ZXJ5X2xvZyA9IE5VTEw7CisJfQorCisJLyogQWxsIG9wZXJhdGlvbnMgd2lsbCBvY2N1ciBhdCBwcmVkaWN0YWJsZSB0aW1lLCBubyBuZWVkIHRvIGxvY2sgKi8KKwlzZWxmLT5kaXNjb3ZlcnlfbG9nID0gaGFzaGJpbl9uZXcoSEJfTk9MT0NLKTsKKworCWlmIChzZWxmLT5kaXNjb3ZlcnlfbG9nID09IE5VTEwpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBVbmFibGUgdG8gYWxsb2NhdGUgZGlzY292ZXJ5IGxvZyFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlpbmZvLlMgPSBkaXNjb3ZlcnktPm5zbG90czsgLyogTnVtYmVyIG9mIHNsb3RzICovCisJaW5mby5zID0gMDsgLyogQ3VycmVudCBzbG90ICovCisKKwlzZWxmLT5kaXNjb3ZlcnlfY21kID0gZGlzY292ZXJ5OworCWluZm8uZGlzY292ZXJ5ID0gZGlzY292ZXJ5OworCisJLyogc3lzY3RsX3Nsb3RfdGltZW91dCBib3VuZHMgYXJlIGNoZWNrZWQgaW4gaXJzeXNjdGwuYyAtIEplYW4gSUkgKi8KKwlzZWxmLT5zbG90X3RpbWVvdXQgPSBzeXNjdGxfc2xvdF90aW1lb3V0ICogSFogLyAxMDAwOworCisJaXJsYXBfZG9fZXZlbnQoc2VsZiwgRElTQ09WRVJZX1JFUVVFU1QsIE5VTEwsICZpbmZvKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2Rpc2NvdmVyeV9jb25maXJtIChsb2cpCisgKgorICogICAgQSBkZXZpY2UgaGFzIGJlZW4gZGlzY292ZXJlZCBpbiBmcm9udCBvZiB0aGlzIHN0YXRpb24sIHdlCisgKiAgICByZXBvcnQgZGlyZWN0bHkgdG8gTE1QLgorICovCit2b2lkIGlybGFwX2Rpc2NvdmVyeV9jb25maXJtKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaGFzaGJpbl90ICpkaXNjb3ZlcnlfbG9nKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCUlSREFfQVNTRVJUKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qCisJICogQ2hlY2sgZm9yIHN1Y2Nlc3NmdWwgZGlzY292ZXJ5LCBzaW5jZSB3ZSBhcmUgdGhlbiBhbGxvd2VkIHRvIGNsZWFyCisJICogdGhlIG1lZGlhIGJ1c3kgY29uZGl0aW9uIChJckxBUCA2LjEzLjQgLSBwLjk0KS4gVGhpcyBzaG91bGQgYWxsb3cKKwkgKiB1cyB0byBtYWtlIGNvbm5lY3Rpb24gYXR0ZW1wdHMgbXVjaCBmYXN0ZXIgYW5kIGVhc2llciAoaS5lLiBubworCSAqIGNvbGxpc2lvbnMpLgorCSAqIFNldHRpbmcgbWVkaWEgYnVzeSB0byBmYWxzZSB3aWxsIGFsc28gZ2VuZXJhdGUgYW4gZXZlbnQgYWxsb3dpbmcKKwkgKiB0byBwcm9jZXNzIHBlbmRpbmcgZXZlbnRzIGluIE5ETSBzdGF0ZSBtYWNoaW5lLgorCSAqIE5vdGUgOiB0aGUgc3BlYyBkb2Vzbid0IGRlZmluZSB3aGF0J3MgYSBzdWNjZXNzZnVsIGRpc2NvdmVyeSBpcy4KKwkgKiBJZiB3ZSB3YW50IFVsdHJhIHRvIHdvcmssIGl0J3Mgc3VjY2Vzc2Z1bCBldmVuIGlmIHRoZXJlIGlzCisJICogbm9ib2R5IGRpc2NvdmVyZWQgLSBKZWFuIElJCisJICovCisJaWYgKGRpc2NvdmVyeV9sb2cpCisJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KHNlbGYtPm5ldGRldiwgRkFMU0UpOworCisJLyogSW5mb3JtIElyTE1QICovCisJaXJsbXBfbGlua19kaXNjb3ZlcnlfY29uZmlybShzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIGRpc2NvdmVyeV9sb2cpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfZGlzY292ZXJ5X2luZGljYXRpb24gKGxvZykKKyAqCisgKiAgICBTb21lYm9keSBpcyB0cnlpbmcgdG8gZGlzY292ZXIgdXMhCisgKgorICovCit2b2lkIGlybGFwX2Rpc2NvdmVyeV9pbmRpY2F0aW9uKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgZGlzY292ZXJ5X3QgKmRpc2NvdmVyeSkKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKGRpc2NvdmVyeSAhPSBOVUxMLCByZXR1cm47KTsKKworCUlSREFfQVNTRVJUKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIEEgZGV2aWNlIGlzIHZlcnkgbGlrZWx5IHRvIGNvbm5lY3QgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgcGVyZm9ybXMKKwkgKiBhIHN1Y2Nlc3NmdWwgZGlzY292ZXJ5LiBUaGlzIG1lYW5zIHRoYXQgaW4gb3VyIGNhc2UsIHdlIGFyZSBtdWNoCisJICogbW9yZSBsaWtlbHkgdG8gcmVjZWl2ZSBhIGNvbm5lY3Rpb24gcmVxdWVzdCBvdmVyIHRoZSBtZWRpdW0uCisJICogU28sIHdlIGJhY2tvZmYgdG8gYXZvaWQgY29sbGlzaW9ucy4KKwkgKiBJckxBUCBzcGVjIDYuMTMuNCBzdWdnZXN0IDEwMG1zLi4uCisJICogTm90ZSA6IHRoaXMgbGl0dGxlIHRyaWNrIGFjdHVhbGx5IG1ha2UgYSAqQklHKiBkaWZmZXJlbmNlLiBJZiBJIHNldAorCSAqIG15IExpbnV4IGJveCB3aXRoIGRpc2NvdmVyeSBlbmFibGVkIGFuZCBvbmUgVWx0cmEgZnJhbWUgc2VudCBldmVyeQorCSAqIHNlY29uZCwgbXkgUGFsbSBoYXMgbm8gdHJvdWJsZSBjb25uZWN0aW5nIHRvIGl0IGV2ZXJ5IHRpbWUgIQorCSAqIEplYW4gSUkgKi8KKwlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFNNQUxMKTsKKworCWlybG1wX2xpbmtfZGlzY292ZXJ5X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBkaXNjb3ZlcnkpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc3RhdHVzX2luZGljYXRpb24gKHF1YWxpdHlfb2ZfbGluaykKKyAqLwordm9pZCBpcmxhcF9zdGF0dXNfaW5kaWNhdGlvbihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCBxdWFsaXR5X29mX2xpbmspCit7CisJc3dpdGNoIChxdWFsaXR5X29mX2xpbmspIHsKKwljYXNlIFNUQVRVU19OT19BQ1RJVklUWToKKwkJSVJEQV9NRVNTQUdFKCJJckxBUCwgbm8gYWN0aXZpdHkgb24gbGluayFcbiIpOworCQlicmVhazsKKwljYXNlIFNUQVRVU19OT0lTWToKKwkJSVJEQV9NRVNTQUdFKCJJckxBUCwgbm9pc3kgbGluayFcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJaXJsbXBfc3RhdHVzX2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLAorCQkJCXF1YWxpdHlfb2ZfbGluaywgTE9DS19OT19DSEFOR0UpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcmVzZXRfaW5kaWNhdGlvbiAodm9pZCkKKyAqLwordm9pZCBpcmxhcF9yZXNldF9pbmRpY2F0aW9uKHN0cnVjdCBpcmxhcF9jYiAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJaWYgKHNlbGYtPnN0YXRlID09IExBUF9SRVNFVF9XQUlUKQorCQlpcmxhcF9kb19ldmVudChzZWxmLCBSRVNFVF9SRVFVRVNULCBOVUxMLCBOVUxMKTsKKwllbHNlCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFU0VUX1JFU1BPTlNFLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3Jlc2V0X2NvbmZpcm0gKHZvaWQpCisgKi8KK3ZvaWQgaXJsYXBfcmVzZXRfY29uZmlybSh2b2lkKQoreworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9nZW5lcmF0ZV9yYW5kX3RpbWVfc2xvdCAoUywgcykKKyAqCisgKiAgICBHZW5lcmF0ZSBhIHJhbmRvbSB0aW1lIHNsb3QgYmV0d2VlbiBzIGFuZCBTLTEgd2hlcmUKKyAqICAgIFMgPSBOdW1iZXIgb2Ygc2xvdHMgKDAgLT4gUy0xKQorICogICAgcyA9IEN1cnJlbnQgc2xvdAorICovCitpbnQgaXJsYXBfZ2VuZXJhdGVfcmFuZF90aW1lX3Nsb3QoaW50IFMsIGludCBzKQoreworCXN0YXRpYyBpbnQgcmFuZDsKKwlpbnQgc2xvdDsKKworCUlSREFfQVNTRVJUKChTIC0gcykgPiAwLCByZXR1cm4gMDspOworCisJcmFuZCArPSBqaWZmaWVzOworCXJhbmQgXj0gKHJhbmQgPDwgMTIpOworCXJhbmQgXj0gKHJhbmQgPj4gMjApOworCisJc2xvdCA9IHMgKyByYW5kICUgKFMtcyk7CisKKwlJUkRBX0FTU0VSVCgoc2xvdCA+PSBzKSB8fCAoc2xvdCA8IFMpLCByZXR1cm4gMDspOworCisJcmV0dXJuIHNsb3Q7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQgKG5yKQorICoKKyAqICAgIFJlbW92ZSBhbGwgYWNrbm93bGVkZ2VkIGZyYW1lcyBpbiBjdXJyZW50IHdpbmRvdyBxdWV1ZS4gVGhpcyBjb2RlIGlzCisgKiAgICBub3QgaW50dWl0aXZlIGFuZCB5b3Ugc2hvdWxkIG5vdCB0cnkgdG8gY2hhbmdlIGl0LiBJZiB5b3UgdGhpbmsgaXQKKyAqICAgIGNvbnRhaW5zIGJ1Z3MsIHBsZWFzZSBtYWlsIGEgcGF0Y2ggdG8gdGhlIGF1dGhvciBpbnN0ZWFkLgorICovCit2b2lkIGlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCBucikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgY291bnQgPSAwOworCisJLyoKKyAgICAgICAgICogUmVtb3ZlIGFsbCB0aGUgYWNrLWVkIGZyYW1lcyBmcm9tIHRoZSB3aW5kb3cgcXVldWUuCisgICAgICAgICAqLworCisJLyoKKwkgKiAgT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZS4gSXQgaXMgbW9zdCBsaWtlbHkgdGhhdCB0aGUgcmVjZWl2ZXIKKwkgKiAgd2lsbCBhY2tub3dsZWRnZSBhbGwgdGhlIGZyYW1lcyB3ZSBoYXZlIHNlbnQhIFNvIGluIHRoYXQgY2FzZSB3ZQorCSAqICBkZWxldGUgYWxsIGZyYW1lcyBzdG9yZWQgaW4gd2luZG93LgorCSAqLworCWlmIChuciA9PSBzZWxmLT52cykgeworCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT53eF9saXN0KSkgIT0gTlVMTCkgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisJCS8qIFRoZSBsYXN0IGFja2VkIGZyYW1lIGlzIHRoZSBuZXh0IHRvIHNlbmQgbWludXMgb25lICovCisJCXNlbGYtPnZhID0gbnIgLSAxOworCX0gZWxzZSB7CisJCS8qIFJlbW92ZSBhbGwgYWNrbm93bGVkZ2VkIGZyYW1lcyBpbiBjdXJyZW50IHdpbmRvdyAqLworCQl3aGlsZSAoKHNrYl9wZWVrKCZzZWxmLT53eF9saXN0KSAhPSBOVUxMKSAmJgorCQkgICAgICAgKCgoc2VsZi0+dmErMSkgJSA4KSAhPSBucikpCisJCXsKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT53eF9saXN0KTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCQkJc2VsZi0+dmEgPSAoc2VsZi0+dmEgKyAxKSAlIDg7CisJCQljb3VudCsrOworCQl9CisJfQorCisJLyogQWR2YW5jZSB3aW5kb3cgKi8KKwlzZWxmLT53aW5kb3cgPSBzZWxmLT53aW5kb3dfc2l6ZSAtIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnd4X2xpc3QpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfdmFsaWRhdGVfbnNfcmVjZWl2ZWQgKG5zKQorICoKKyAqICAgIFZhbGlkYXRlIHRoZSBuZXh0IHRvIHNlbmQgKG5zKSBmaWVsZCBmcm9tIHJlY2VpdmVkIGZyYW1lLgorICovCitpbnQgaXJsYXBfdmFsaWRhdGVfbnNfcmVjZWl2ZWQoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgbnMpCit7CisJLyogIG5zIGFzIGV4cGVjdGVkPyAgKi8KKwlpZiAobnMgPT0gc2VsZi0+dnIpCisJCXJldHVybiBOU19FWFBFQ1RFRDsKKwkvKgorCSAqICBTdGF0aW9ucyBhcmUgYWxsb3dlZCB0byB0cmVhdCBpbnZhbGlkIE5TIGFzIHVuZXhwZWN0ZWQgTlMKKwkgKiAgSXJMQVAsIFJlY3YgLi4uIHdpdGgtaW52YWxpZC1Ocy4gcC4gODQKKwkgKi8KKwlyZXR1cm4gTlNfVU5FWFBFQ1RFRDsKKworCS8qIHJldHVybiBOUl9JTlZBTElEOyAqLworfQorLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3ZhbGlkYXRlX25yX3JlY2VpdmVkIChucikKKyAqCisgKiAgICBWYWxpZGF0ZSB0aGUgbmV4dCB0byByZWNlaXZlIChucikgZmllbGQgZnJvbSByZWNlaXZlZCBmcmFtZS4KKyAqCisgKi8KK2ludCBpcmxhcF92YWxpZGF0ZV9ucl9yZWNlaXZlZChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCBucikKK3sKKwkvKiAgbnIgYXMgZXhwZWN0ZWQ/ICAqLworCWlmIChuciA9PSBzZWxmLT52cykgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBleHBlY3RlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOUl9FWFBFQ1RFRDsKKwl9CisKKwkvKgorCSAqICB1bmV4cGVjdGVkIG5yPyAoYnV0IHdpdGhpbiBjdXJyZW50IHdpbmRvdyksIGZpcnN0IHdlIGNoZWNrIGlmIHRoZQorCSAqICBucyBudW1iZXJzIG9mIHRoZSBmcmFtZXMgaW4gdGhlIGN1cnJlbnQgd2luZG93IHdyYXAuCisJICovCisJaWYgKHNlbGYtPnZhIDwgc2VsZi0+dnMpIHsKKwkJaWYgKChuciA+PSBzZWxmLT52YSkgJiYgKG5yIDw9IHNlbGYtPnZzKSkKKwkJCXJldHVybiBOUl9VTkVYUEVDVEVEOworCX0gZWxzZSB7CisJCWlmICgobnIgPj0gc2VsZi0+dmEpIHx8IChuciA8PSBzZWxmLT52cykpCisJCQlyZXR1cm4gTlJfVU5FWFBFQ1RFRDsKKwl9CisKKwkvKiBJbnZhbGlkIG5yISAgKi8KKwlyZXR1cm4gTlJfSU5WQUxJRDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2luaXRpYXRlX2Nvbm5lY3Rpb25fc3RhdGUgKCkKKyAqCisgKiAgICBJbml0aWFsaXplIHRoZSBjb25uZWN0aW9uIHN0YXRlIHBhcmFtZXRlcnMKKyAqCisgKi8KK3ZvaWQgaXJsYXBfaW5pdGlhdGVfY29ubmVjdGlvbl9zdGF0ZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCS8qIE5leHQgdG8gc2VuZCBhbmQgbmV4dCB0byByZWNlaXZlICovCisJc2VsZi0+dnMgPSBzZWxmLT52ciA9IDA7CisKKwkvKiBMYXN0IGZyYW1lIHdoaWNoIGdvdCBhY2tlZCAoMCAtIDEpICUgOCAqLworCXNlbGYtPnZhID0gNzsKKworCXNlbGYtPndpbmRvdyA9IDE7CisKKwlzZWxmLT5yZW1vdGVfYnVzeSA9IEZBTFNFOworCXNlbGYtPnJldHJ5X2NvdW50ID0gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kIChzZWxmLCBxb3MpCisgKgorICogICAgV2FpdCBuZWdvdGlhdGVkIG1pbmltdW0gdHVybiBhcm91bmQgdGltZSwgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSBzZXRzCisgKiAgICB0aGUgbnVtYmVyIG9mIEJPUydzIHRoYXQgbXVzdCBiZSBzZW50IGJlZm9yZSB0aGUgbmV4dCB0cmFuc21pdHRlZAorICogICAgZnJhbWUgaW4gb3JkZXIgdG8gZGVsYXkgZm9yIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUuIFRoaXMgaXMKKyAqICAgIGRvbmUgdG8gYXZvaWQgdXNpbmcgdGltZXJzLCBhbmQgdGhlIGZvcmJpZGRlbiB1ZGVsYXkhCisgKi8KK3ZvaWQgaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwlfX3UzMiBtaW5fdHVybl90aW1lOworCV9fdTMyIHNwZWVkOworCisJLyogR2V0IFFvUyB2YWx1ZXMuICAqLworCXNwZWVkID0gcW9zLT5iYXVkX3JhdGUudmFsdWU7CisJbWluX3R1cm5fdGltZSA9IHFvcy0+bWluX3R1cm5fdGltZS52YWx1ZTsKKworCS8qIE5vIG5lZWQgdG8gY2FsY3VsYXRlIFhCT0ZzIGZvciBzcGVlZHMgb3ZlciAxMTUyMDAgYnBzICovCisJaWYgKHNwZWVkID4gMTE1MjAwKSB7CisJCXNlbGYtPm10dF9yZXF1aXJlZCA9IG1pbl90dXJuX3RpbWU7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqICBTZW5kIGFkZGl0aW9uYWwgQk9GJ3MgZm9yIHRoZSBuZXh0IGZyYW1lIGZvciB0aGUgcmVxdWVzdGVkCisJICogIG1pbiB0dXJuIHRpbWUsIHNvIG5vdyB3ZSBtdXN0IGNhbGN1bGF0ZSBob3cgbWFueSBjaGFycyAoWEJPRidzKSB3ZQorCSAqICBtdXN0IHNlbmQgZm9yIHRoZSByZXF1ZXN0ZWQgdGltZSBwZXJpb2QgKG1pbiB0dXJuIHRpbWUpCisJICovCisJc2VsZi0+eGJvZnNfZGVsYXkgPSBpcmxhcF9taW5fdHVybl90aW1lX2luX2J5dGVzKHNwZWVkLCBtaW5fdHVybl90aW1lKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2ZsdXNoX2FsbF9xdWV1ZXMgKHZvaWQpCisgKgorICogICAgRmx1c2ggYWxsIHF1ZXVlcworICoKKyAqLwordm9pZCBpcmxhcF9mbHVzaF9hbGxfcXVldWVzKHN0cnVjdCBpcmxhcF9jYiAqc2VsZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiogc2tiOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJLyogRnJlZSB0cmFuc21pc3Npb24gcXVldWUgKi8KKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT50eHEpKSAhPSBOVUxMKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT50eHFfdWx0cmEpKSAhPSBOVUxMKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwkvKiBGcmVlIHNsaWRpbmcgd2luZG93IGJ1ZmZlcmVkIHBhY2tldHMgKi8KKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT53eF9saXN0KSkgIT0gTlVMTCkKKwkJZGV2X2tmcmVlX3NrYihza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc2V0c3BlZWQgKHNlbGYsIHNwZWVkKQorICoKKyAqICAgIENoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIElyREEgcG9ydAorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgX191MzIgc3BlZWQsIGludCBub3cpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUlSREFfREVCVUcoMCwgIiVzKCksIHNldHRpbmcgc3BlZWQgdG8gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3BlZWQpOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJc2VsZi0+c3BlZWQgPSBzcGVlZDsKKworCS8qIENoYW5nZSBzcGVlZCBub3csIG9yIGp1c3QgcGlnZ3liYWNrIHNwZWVkIG9uIGZyYW1lcyAqLworCWlmIChub3cpIHsKKwkJLyogU2VuZCBkb3duIGVtcHR5IGZyYW1lIHRvIHRyaWdnZXIgc3BlZWQgY2hhbmdlICovCisJCXNrYiA9IGRldl9hbGxvY19za2IoMCk7CisJCWlybGFwX3F1ZXVlX3htaXQoc2VsZiwgc2tiKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9pbml0X3Fvc19jYXBhYmlsaXRpZXMgKHNlbGYsIHFvcykKKyAqCisgKiAgICBJbml0aWFsaXplIFFvUyBmb3IgdGhpcyBJckxBUCBzZXNzaW9uLCBXaGF0IHdlIGRvIGlzIHRvIGNvbXB1dGUgdGhlCisgKiAgICBpbnRlcnNlY3Rpb24gb2YgdGhlIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoZSB1c2VyLCBkcml2ZXIgYW5kIGZvcgorICogICAgSXJMQVAgaXRzZWxmLiBOb3JtYWxseSwgSXJMQVAgd2lsbCBub3Qgc3BlY2lmeSBhbnkgdmFsdWVzLCBidXQgaXQgY2FuCisgKiAgICBiZSB1c2VkIHRvIHJlc3RyaWN0IGNlcnRhaW4gdmFsdWVzLgorICovCitzdGF0aWMgdm9pZCBpcmxhcF9pbml0X3Fvc19jYXBhYmlsaXRpZXMoc3RydWN0IGlybGFwX2NiICpzZWxmLAorCQkJCQlzdHJ1Y3QgcW9zX2luZm8gKnFvc191c2VyKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5uZXRkZXYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwkvKiBTdGFydCBvdXQgd2l0aCB0aGUgbWF4aW11bSBRb1Mgc3VwcG9ydCBwb3NzaWJsZSAqLworCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJnNlbGYtPnFvc19yeCk7CisKKwkvKiBBcHBseSBkcml2ZXJzIFFvUyBjYXBhYmlsaXRpZXMgKi8KKwlpcmRhX3Fvc19jb21wdXRlX2ludGVyc2VjdGlvbigmc2VsZi0+cW9zX3J4LCBzZWxmLT5xb3NfZGV2KTsKKworCS8qCisJICogIENoZWNrIGZvciB1c2VyIHN1cHBsaWVkIFFvUyBwYXJhbWV0ZXJzLiBUaGUgc2VydmljZSB1c2VyIGlzIG9ubHkKKwkgKiAgYWxsb3dlZCB0byBzdXBwbHkgdGhlc2UgdmFsdWVzLiBXZSBjaGVjayBlYWNoIHBhcmFtZXRlciBzaW5jZSB0aGUKKwkgKiAgdXNlciBtYXkgbm90IGhhdmUgc2V0IGFsbCBvZiB0aGVtLgorCSAqLworCWlmIChxb3NfdXNlcikgeworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBGb3VuZCB1c2VyIHNwZWNpZmllZCBRb1MhXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWlmIChxb3NfdXNlci0+YmF1ZF9yYXRlLmJpdHMpCisJCQlzZWxmLT5xb3NfcnguYmF1ZF9yYXRlLmJpdHMgJj0gcW9zX3VzZXItPmJhdWRfcmF0ZS5iaXRzOworCisJCWlmIChxb3NfdXNlci0+bWF4X3R1cm5fdGltZS5iaXRzKQorCQkJc2VsZi0+cW9zX3J4Lm1heF90dXJuX3RpbWUuYml0cyAmPSBxb3NfdXNlci0+bWF4X3R1cm5fdGltZS5iaXRzOworCQlpZiAocW9zX3VzZXItPmRhdGFfc2l6ZS5iaXRzKQorCQkJc2VsZi0+cW9zX3J4LmRhdGFfc2l6ZS5iaXRzICY9IHFvc191c2VyLT5kYXRhX3NpemUuYml0czsKKworCQlpZiAocW9zX3VzZXItPmxpbmtfZGlzY190aW1lLmJpdHMpCisJCQlzZWxmLT5xb3NfcngubGlua19kaXNjX3RpbWUuYml0cyAmPSBxb3NfdXNlci0+bGlua19kaXNjX3RpbWUuYml0czsKKwl9CisKKwkvKiBVc2UgNTAwbXMgaW4gSXJMQVAgZm9yIG5vdyAqLworCXNlbGYtPnFvc19yeC5tYXhfdHVybl90aW1lLmJpdHMgJj0gMHgwMTsKKworCS8qIFNldCBkYXRhIHNpemUgKi8KKwkvKnNlbGYtPnFvc19yeC5kYXRhX3NpemUuYml0cyAmPSAweDAzOyovCisKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzZWxmLT5xb3NfcngpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfYXBwbHlfZGVmYXVsdF9jb25uZWN0aW9uX3BhcmFtZXRlcnMgKHZvaWQsIG5vdykKKyAqCisgKiAgICBVc2UgdGhlIGRlZmF1bHQgY29ubmVjdGlvbiBhbmQgdHJhbnNtaXNzaW9uIHBhcmFtZXRlcnMKKyAqLwordm9pZCBpcmxhcF9hcHBseV9kZWZhdWx0X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCS8qIHhib2ZzIDogRGVmYXVsdCB2YWx1ZSBpbiBORE0gKi8KKwlzZWxmLT5uZXh0X2JvZnMgICA9IDEyOworCXNlbGYtPmJvZnNfY291bnQgID0gMTI7CisKKwkvKiBORE0gU3BlZWQgaXMgOTYwMCAqLworCWlybGFwX2NoYW5nZV9zcGVlZChzZWxmLCA5NjAwLCBUUlVFKTsKKworCS8qIFNldCBtYnVzeSB3aGVuIGdvaW5nIHRvIE5ETSBzdGF0ZSAqLworCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KHNlbGYtPm5ldGRldiwgVFJVRSk7CisKKwkvKgorCSAqIEdlbmVyYXRlIHJhbmRvbSBjb25uZWN0aW9uIGFkZHJlc3MgZm9yIHRoaXMgc2Vzc2lvbiwgd2hpY2ggbXVzdAorCSAqIGJlIDcgYml0cyB3aWRlIGFuZCBkaWZmZXJlbnQgZnJvbSAweDAwIGFuZCAweGZlCisJICovCisJd2hpbGUgKChzZWxmLT5jYWRkciA9PSAweDAwKSB8fCAoc2VsZi0+Y2FkZHIgPT0gMHhmZSkpIHsKKwkJZ2V0X3JhbmRvbV9ieXRlcygmc2VsZi0+Y2FkZHIsIHNpemVvZihzZWxmLT5jYWRkcikpOworCQlzZWxmLT5jYWRkciAmPSAweGZlOworCX0KKworCS8qIFVzZSBkZWZhdWx0IHZhbHVlcyB1bnRpbCBjb25uZWN0aW9uIGhhcyBiZWVuIG5lZ2l0aWF0ZWQgKi8KKwlzZWxmLT5zbG90X3RpbWVvdXQgPSBzeXNjdGxfc2xvdF90aW1lb3V0OworCXNlbGYtPmZpbmFsX3RpbWVvdXQgPSBGSU5BTF9USU1FT1VUOworCXNlbGYtPnBvbGxfdGltZW91dCA9IFBPTExfVElNRU9VVDsKKwlzZWxmLT53ZF90aW1lb3V0ID0gV0RfVElNRU9VVDsKKworCS8qIFNldCBzb21lIGRlZmF1bHQgdmFsdWVzICovCisJc2VsZi0+cW9zX3R4LmJhdWRfcmF0ZS52YWx1ZSA9IDk2MDA7CisJc2VsZi0+cW9zX3J4LmJhdWRfcmF0ZS52YWx1ZSA9IDk2MDA7CisJc2VsZi0+cW9zX3R4Lm1heF90dXJuX3RpbWUudmFsdWUgPSAwOworCXNlbGYtPnFvc19yeC5tYXhfdHVybl90aW1lLnZhbHVlID0gMDsKKwlzZWxmLT5xb3NfdHgubWluX3R1cm5fdGltZS52YWx1ZSA9IDA7CisJc2VsZi0+cW9zX3J4Lm1pbl90dXJuX3RpbWUudmFsdWUgPSAwOworCXNlbGYtPnFvc190eC5kYXRhX3NpemUudmFsdWUgPSA2NDsKKwlzZWxmLT5xb3NfcnguZGF0YV9zaXplLnZhbHVlID0gNjQ7CisJc2VsZi0+cW9zX3R4LndpbmRvd19zaXplLnZhbHVlID0gMTsKKwlzZWxmLT5xb3Nfcngud2luZG93X3NpemUudmFsdWUgPSAxOworCXNlbGYtPnFvc190eC5hZGRpdGlvbmFsX2JvZnMudmFsdWUgPSAxMjsKKwlzZWxmLT5xb3NfcnguYWRkaXRpb25hbF9ib2ZzLnZhbHVlID0gMTI7CisJc2VsZi0+cW9zX3R4LmxpbmtfZGlzY190aW1lLnZhbHVlID0gMDsKKwlzZWxmLT5xb3NfcngubGlua19kaXNjX3RpbWUudmFsdWUgPSAwOworCisJaXJsYXBfZmx1c2hfYWxsX3F1ZXVlcyhzZWxmKTsKKworCXNlbGYtPmRpc2Nvbm5lY3RfcGVuZGluZyA9IEZBTFNFOworCXNlbGYtPmNvbm5lY3RfcGVuZGluZyA9IEZBTFNFOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfYXBwbHlfY29ubmVjdGlvbl9wYXJhbWV0ZXJzIChxb3MsIG5vdykKKyAqCisgKiAgICBJbml0aWFsaXplIElyTEFQIHdpdGggdGhlIG5lZ290aWF0ZWQgUW9TIHZhbHVlcworICoKKyAqIElmICdub3cnIGlzIGZhbHNlLCB0aGUgc3BlZWQgYW5kIHhib2ZzIHdpbGwgYmUgY2hhbmdlZCBhZnRlciB0aGUgbmV4dAorICogZnJhbWUgaXMgc2VudC4KKyAqIElmICdub3cnIGlzIHRydWUsIHRoZSBzcGVlZCBhbmQgeGJvZnMgaXMgY2hhbmdlZCBpbW1lZGlhdGVseQorICovCit2b2lkIGlybGFwX2FwcGx5X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCBub3cpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCS8qIFNldCB0aGUgbmVnb3RpYXRlZCB4Ym9mcyB2YWx1ZSAqLworCXNlbGYtPm5leHRfYm9mcyAgID0gc2VsZi0+cW9zX3R4LmFkZGl0aW9uYWxfYm9mcy52YWx1ZTsKKwlpZiAobm93KQorCQlzZWxmLT5ib2ZzX2NvdW50ID0gc2VsZi0+bmV4dF9ib2ZzOworCisJLyogU2V0IHRoZSBuZWdvdGlhdGVkIGxpbmsgc3BlZWQgKG1heSBuZWVkIHRoZSBuZXcgeGJvZnMgdmFsdWUpICovCisJaXJsYXBfY2hhbmdlX3NwZWVkKHNlbGYsIHNlbGYtPnFvc190eC5iYXVkX3JhdGUudmFsdWUsIG5vdyk7CisKKwlzZWxmLT53aW5kb3dfc2l6ZSA9IHNlbGYtPnFvc190eC53aW5kb3dfc2l6ZS52YWx1ZTsKKwlzZWxmLT53aW5kb3cgICAgICA9IHNlbGYtPnFvc190eC53aW5kb3dfc2l6ZS52YWx1ZTsKKworI2lmZGVmIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XCisJLyoKKwkgKiAgQ2FsY3VsYXRlIGhvdyBtYW55IGJ5dGVzIGl0IGlzIHBvc3NpYmxlIHRvIHRyYW5zbWl0IGJlZm9yZSB0aGUKKwkgKiAgbGluayBtdXN0IGJlIHR1cm5lZCBhcm91bmQKKwkgKi8KKwlzZWxmLT5saW5lX2NhcGFjaXR5ID0KKwkJaXJsYXBfbWF4X2xpbmVfY2FwYWNpdHkoc2VsZi0+cW9zX3R4LmJhdWRfcmF0ZS52YWx1ZSwKKwkJCQkJc2VsZi0+cW9zX3R4Lm1heF90dXJuX3RpbWUudmFsdWUpOworCXNlbGYtPmJ5dGVzX2xlZnQgPSBzZWxmLT5saW5lX2NhcGFjaXR5OworI2VuZGlmIC8qIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XICovCisKKworCS8qCisJICogIEluaXRpYWxpemUgdGltZW91dCB2YWx1ZXMsIHNvbWUgb2YgdGhlIHJ1bGVzIGFyZSBsaXN0ZWQgb24KKwkgKiAgcGFnZSA5MiBpbiBJckxBUC4KKwkgKi8KKwlJUkRBX0FTU0VSVChzZWxmLT5xb3NfdHgubWF4X3R1cm5fdGltZS52YWx1ZSAhPSAwLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5xb3NfcngubWF4X3R1cm5fdGltZS52YWx1ZSAhPSAwLCByZXR1cm47KTsKKwkvKiBUaGUgcG9sbCB0aW1lb3V0IGFwcGxpZXMgb25seSB0byB0aGUgcHJpbWFyeSBzdGF0aW9uLgorCSAqIEl0IGRlZmluZXMgdGhlIG1heGltdW0gdGltZSB0aGUgcHJpbWFyeSBzdGF5IGluIFhNSVQgbW9kZQorCSAqIGJlZm9yZSB0aW1lb3V0IGFuZCB0dXJuaW5nIHRoZSBsaW5rIGFyb3VuZCAoc2VuZGluZyBhIFJSKS4KKwkgKiBPciwgdGhpcyBpcyBob3cgbXVjaCB3ZSBjYW4ga2VlcCB0aGUgcGYgYml0IGluIHByaW1hcnkgbW9kZS4KKwkgKiBUaGVyZWZvcmUsIGl0IG11c3QgYmUgbG93ZXIgb3IgZXF1YWwgdGhhbiBvdXIgKk9XTiogbWF4IHR1cm4gYXJvdW5kLgorCSAqIEplYW4gSUkgKi8KKwlzZWxmLT5wb2xsX3RpbWVvdXQgPSBzZWxmLT5xb3NfdHgubWF4X3R1cm5fdGltZS52YWx1ZSAqIEhaIC8gMTAwMDsKKwkvKiBUaGUgRmluYWwgdGltZW91dCBhcHBsaWVzIG9ubHkgdG8gdGhlIHByaW1hcnkgc3RhdGlvbi4KKwkgKiBJdCBkZWZpbmVzIHRoZSBtYXhpbXVtIHRpbWUgdGhlIHByaW1hcnkgd2FpdCAobW9zdGx5IGluIFJFQ1YgbW9kZSkKKwkgKiBmb3IgYW4gYW5zd2VyIGZyb20gdGhlIHNlY29uZGFyeSBzdGF0aW9uIGJlZm9yZSBwb2xsaW5nIGl0IGFnYWluLgorCSAqIFRoZXJlZm9yZSwgaXQgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRoYW4gb3VyICpQQVJUTkVSKgorCSAqIG1heCB0dXJuIGFyb3VuZCB0aW1lIC0gSmVhbiBJSSAqLworCXNlbGYtPmZpbmFsX3RpbWVvdXQgPSBzZWxmLT5xb3NfcngubWF4X3R1cm5fdGltZS52YWx1ZSAqIEhaIC8gMTAwMDsKKwkvKiBUaGUgV2F0Y2hkb2cgQml0IHRpbWVvdXQgYXBwbGllcyBvbmx5IHRvIHRoZSBzZWNvbmRhcnkgc3RhdGlvbi4KKwkgKiBJdCBkZWZpbmVzIHRoZSBtYXhpbXVtIHRpbWUgdGhlIHNlY29uZGFyeSB3YWl0IChtb3N0bHkgaW4gUkVDViBtb2RlKQorCSAqIGZvciBwb2xsIGZyb20gdGhlIHByaW1hcnkgc3RhdGlvbiBiZWZvcmUgZ2V0dGluZyBhbm5veWVkLgorCSAqIFRoZXJlZm9yZSwgaXQgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRoYW4gb3VyICpQQVJUTkVSKgorCSAqIG1heCB0dXJuIGFyb3VuZCB0aW1lIC0gSmVhbiBJSSAqLworCXNlbGYtPndkX3RpbWVvdXQgPSBzZWxmLT5maW5hbF90aW1lb3V0ICogMjsKKworCS8qCisJICogTjEgYW5kIE4yIGFyZSBtYXhpbXVtIHJldHJ5IGNvdW50IGZvciAqYm90aCogdGhlIGZpbmFsIHRpbWVyCisJICogYW5kIHRoZSB3ZCB0aW1lciAod2l0aCBhIGZhY3RvciAyKSBhcyBkZWZpbmVkIGFib3ZlLgorCSAqIEFmdGVyIE4xIHJldHJ5IG9mIGEgdGltZXIsIHdlIGdpdmUgYSB3YXJuaW5nIHRvIHRoZSB1c2VyLgorCSAqIEFmdGVyIE4yIHJldHJ5LCB3ZSBjb25zaWRlciB0aGUgbGluayBkZWFkIGFuZCBkaXNjb25uZWN0IGl0LgorCSAqIEplYW4gSUkKKwkgKi8KKworCS8qCisJICogIFNldCBOMSB0byAwIGlmIExpbmsgRGlzY29ubmVjdC9UaHJlc2hvbGQgVGltZSA9IDMgYW5kIHNldCBpdCB0bworCSAqICAzIHNlY29uZHMgb3RoZXJ3aXNlLiBTZWUgcGFnZSA3MSBpbiBJckxBUCBmb3IgbW9yZSBkZXRhaWxzLgorCSAqICBBY3R1YWxseSwgaXQncyBub3QgYWx3YXlzIDMgc2Vjb25kcywgYXMgd2UgYWxsb3cgdG8gc2V0CisJICogIGl0IHZpYSBzeXNjdGwuLi4gTWF4IG1heHR0IGlzIDUwMG1zLCBhbmQgTjEgbmVlZCB0byBiZSBtdWx0aXBsZQorCSAqICBvZiAyLCBzbyAxIHNlY29uZCBpcyBtaW5pbXVtIHdlIGNhbiBhbGxvdy4gLSBKZWFuIElJCisJICovCisJaWYgKHNlbGYtPnFvc190eC5saW5rX2Rpc2NfdGltZS52YWx1ZSA9PSBzeXNjdGxfd2Fybl9ub3JlcGx5X3RpbWUpCisJCS8qCisJCSAqIElmIHdlIHNldCBOMSB0byAwLCBpdCB3aWxsIHRyaWdnZXIgaW1tZWRpYXRlbHksIHdoaWNoIGlzCisJCSAqIG5vdCB3aGF0IHdlIHdhbnQuIFdoYXQgd2UgcmVhbGx5IHdhbnQgaXMgdG8gZGlzYWJsZSBpdCwKKwkJICogSmVhbiBJSQorCQkgKi8KKwkJc2VsZi0+TjEgPSAtMjsgLyogRGlzYWJsZSAtIE5lZWQgdG8gYmUgbXVsdGlwbGUgb2YgMiovCisJZWxzZQorCQlzZWxmLT5OMSA9IHN5c2N0bF93YXJuX25vcmVwbHlfdGltZSAqIDEwMDAgLworCQkgIHNlbGYtPnFvc19yeC5tYXhfdHVybl90aW1lLnZhbHVlOworCisJSVJEQV9ERUJVRyg0LCAiU2V0dGluZyBOMSA9ICVkXG4iLCBzZWxmLT5OMSk7CisKKwkvKiBTZXQgTjIgdG8gbWF0Y2ggb3VyIG93biBkaXNjb25uZWN0IHRpbWUgKi8KKwlzZWxmLT5OMiA9IHNlbGYtPnFvc190eC5saW5rX2Rpc2NfdGltZS52YWx1ZSAqIDEwMDAgLworCQlzZWxmLT5xb3NfcngubWF4X3R1cm5fdGltZS52YWx1ZTsKKwlJUkRBX0RFQlVHKDQsICJTZXR0aW5nIE4yID0gJWRcbiIsIHNlbGYtPk4yKTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdHJ1Y3QgaXJsYXBfaXRlcl9zdGF0ZSB7CisJaW50IGlkOworfTsKKworc3RhdGljIHZvaWQgKmlybGFwX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGlybGFwX2l0ZXJfc3RhdGUgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IGlybGFwX2NiICpzZWxmOworCisJLyogUHJvdGVjdCBvdXIgYWNjZXNzIHRvIHRoZSB0c2FwIGxpc3QgKi8KKwlzcGluX2xvY2tfaXJxKCZpcmxhcC0+aGJfc3BpbmxvY2spOworCWl0ZXItPmlkID0gMDsKKworCWZvciAoc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJsYXApOyAKKwkgICAgIHNlbGY7IHNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGhhc2hiaW5fZ2V0X25leHQoaXJsYXApKSB7CisJCWlmIChpdGVyLT5pZCA9PSAqcG9zKQorCQkJYnJlYWs7CisJCSsraXRlci0+aWQ7CisJfQorCQkKKwlyZXR1cm4gc2VsZjsKK30KKworc3RhdGljIHZvaWQgKmlybGFwX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXJsYXBfaXRlcl9zdGF0ZSAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKKworCSsrKnBvczsKKwkrK2l0ZXItPmlkOworCXJldHVybiAodm9pZCAqKSBoYXNoYmluX2dldF9uZXh0KGlybGFwKTsKK30KKworc3RhdGljIHZvaWQgaXJsYXBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3Bpbl91bmxvY2tfaXJxKCZpcmxhcC0+aGJfc3BpbmxvY2spOworfQorCitzdGF0aWMgaW50IGlybGFwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWNvbnN0IHN0cnVjdCBpcmxhcF9pdGVyX3N0YXRlICppdGVyID0gc2VxLT5wcml2YXRlOworCWNvbnN0IHN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IHY7CisJCisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm4gLUVJTlZBTDspOworCisJc2VxX3ByaW50ZihzZXEsICJpcmxhcCVkICIsIGl0ZXItPmlkKTsKKwlzZXFfcHJpbnRmKHNlcSwgInN0YXRlOiAlc1xuIiwKKwkJICAgaXJsYXBfc3RhdGVbc2VsZi0+c3RhdGVdKTsKKworCXNlcV9wcmludGYoc2VxLCAiICBkZXZpY2UgbmFtZTogJXMsICIsCisJCSAgIChzZWxmLT5uZXRkZXYpID8gc2VsZi0+bmV0ZGV2LT5uYW1lIDogImJ1ZyIpOworCXNlcV9wcmludGYoc2VxLCAiaGFyZHdhcmUgbmFtZTogJXNcbiIsIHNlbGYtPmh3X25hbWUpOworCisJc2VxX3ByaW50ZihzZXEsICIgIGNhZGRyOiAlIzAyeCwgIiwgc2VsZi0+Y2FkZHIpOworCXNlcV9wcmludGYoc2VxLCAic2FkZHI6ICUjMDh4LCAiLCBzZWxmLT5zYWRkcik7CisJc2VxX3ByaW50ZihzZXEsICJkYWRkcjogJSMwOHhcbiIsIHNlbGYtPmRhZGRyKTsKKworCXNlcV9wcmludGYoc2VxLCAiICB3aW4gc2l6ZTogJWQsICIsCisJCSAgIHNlbGYtPndpbmRvd19zaXplKTsKKwlzZXFfcHJpbnRmKHNlcSwgIndpbjogJWQsICIsIHNlbGYtPndpbmRvdyk7CisjaWZkZWYgQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cKKwlzZXFfcHJpbnRmKHNlcSwgImxpbmUgY2FwYWNpdHk6ICVkLCAiLAorCQkgICBzZWxmLT5saW5lX2NhcGFjaXR5KTsKKwlzZXFfcHJpbnRmKHNlcSwgImJ5dGVzIGxlZnQ6ICVkXG4iLCBzZWxmLT5ieXRlc19sZWZ0KTsKKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLworCXNlcV9wcmludGYoc2VxLCAiICB0eCBxdWV1ZSBsZW46ICVkICIsCisJCSAgIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkpOworCXNlcV9wcmludGYoc2VxLCAid2luIHF1ZXVlIGxlbjogJWQgIiwKKwkJICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+d3hfbGlzdCkpOworCXNlcV9wcmludGYoc2VxLCAicmJ1c3k6ICVzIiwgc2VsZi0+cmVtb3RlX2J1c3kgPworCQkgICAiVFJVRSIgOiAiRkFMU0UiKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiBtYnVzeTogJXNcbiIsIHNlbGYtPm1lZGlhX2J1c3kgPworCQkgICAiVFJVRSIgOiAiRkFMU0UiKTsKKworCXNlcV9wcmludGYoc2VxLCAiICByZXRyYW5zOiAlZCAiLCBzZWxmLT5yZXRyeV9jb3VudCk7CisJc2VxX3ByaW50ZihzZXEsICJ2czogJWQgIiwgc2VsZi0+dnMpOworCXNlcV9wcmludGYoc2VxLCAidnI6ICVkICIsIHNlbGYtPnZyKTsKKwlzZXFfcHJpbnRmKHNlcSwgInZhOiAlZFxuIiwgc2VsZi0+dmEpOworCisJc2VxX3ByaW50ZihzZXEsICIgIHFvc1x0YnBzXHRtYXh0dFx0ZHNpemVcdHdpbnNpemVcdGFkZGJvZnNcdG1pbnR0XHRsZGlzY1x0Y29tcFxuIik7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiAgdHhcdCVkXHQiLAorCQkgICBzZWxmLT5xb3NfdHguYmF1ZF9yYXRlLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVkXHQiLAorCQkgICBzZWxmLT5xb3NfdHgubWF4X3R1cm5fdGltZS52YWx1ZSk7CisJc2VxX3ByaW50ZihzZXEsICIlZFx0IiwKKwkJICAgc2VsZi0+cW9zX3R4LmRhdGFfc2l6ZS52YWx1ZSk7CisJc2VxX3ByaW50ZihzZXEsICIlZFx0IiwKKwkJICAgc2VsZi0+cW9zX3R4LndpbmRvd19zaXplLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVkXHQiLAorCQkgICBzZWxmLT5xb3NfdHguYWRkaXRpb25hbF9ib2ZzLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVkXHQiLAorCQkgICBzZWxmLT5xb3NfdHgubWluX3R1cm5fdGltZS52YWx1ZSk7CisJc2VxX3ByaW50ZihzZXEsICIlZFx0IiwKKwkJICAgc2VsZi0+cW9zX3R4LmxpbmtfZGlzY190aW1lLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiAgcnhcdCVkXHQiLAorCQkgICBzZWxmLT5xb3NfcnguYmF1ZF9yYXRlLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVkXHQiLAorCQkgICBzZWxmLT5xb3NfcngubWF4X3R1cm5fdGltZS52YWx1ZSk7CisJc2VxX3ByaW50ZihzZXEsICIlZFx0IiwKKwkJICAgc2VsZi0+cW9zX3J4LmRhdGFfc2l6ZS52YWx1ZSk7CisJc2VxX3ByaW50ZihzZXEsICIlZFx0IiwKKwkJICAgc2VsZi0+cW9zX3J4LndpbmRvd19zaXplLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVkXHQiLAorCQkgICBzZWxmLT5xb3NfcnguYWRkaXRpb25hbF9ib2ZzLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVkXHQiLAorCQkgICBzZWxmLT5xb3NfcngubWluX3R1cm5fdGltZS52YWx1ZSk7CisJc2VxX3ByaW50ZihzZXEsICIlZFxuIiwKKwkJICAgc2VsZi0+cW9zX3J4LmxpbmtfZGlzY190aW1lLnZhbHVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlybGFwX3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IGlybGFwX3NlcV9zdGFydCwKKwkubmV4dCAgID0gaXJsYXBfc2VxX25leHQsCisJLnN0b3AgICA9IGlybGFwX3NlcV9zdG9wLAorCS5zaG93ICAgPSBpcmxhcF9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgaXJsYXBfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3QgaXJsYXBfaXRlcl9zdGF0ZSAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisgICAgICAgCisJaWYgKCFzKQorCQlnb3RvIG91dDsKKworCWlmIChpcmxhcCA9PSBOVUxMKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfa2ZyZWU7CisJfQorCisJcmMgPSBzZXFfb3BlbihmaWxlLCAmaXJsYXBfc2VxX29wcyk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9rZnJlZTsKKworCXNlcQkgICAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZSA9IHM7CisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcmxhcF9zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgICAgICAgID0gaXJsYXBfc2VxX29wZW4sCisJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYXBfZXZlbnQuYyBiL25ldC9pcmRhL2lybGFwX2V2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkODlmNQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybGFwX2V2ZW50LmMKQEAgLTAsMCArMSwyMzM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgaXJsYXBfZXZlbnQuYworICogVmVyc2lvbjogICAgICAgMC45CisgKiBEZXNjcmlwdGlvbjogICBJckxBUCBzdGF0ZSBtYWNoaW5lIGltcGxlbWVudGF0aW9uCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnQGJyYXR0bGkubmV0PgorICogQ3JlYXRlZCBhdDogICAgU2F0IEF1ZyAxNiAwMDo1OToyOSAxOTk3CisgKiBNb2RpZmllZCBhdDogICBTYXQgRGVjIDI1IDIxOjA3OjU3IDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdAYnJhdHRsaS5uZXQ+CisgKgorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpIDxkYWdAYnJhdHRsaS5uZXQ+LAorICogICAgIENvcHlyaWdodCAoYykgMTk5OCAgICAgIFRob21hcyBEYXZpcyA8cmF0YmVydEByYWRpa3MubmV0PgorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcF9ldmVudC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwX2ZyYW1lLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvcW9zLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvcGFyYW1ldGVycy5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CQkvKiBpcmxtcF9mbG93X2luZGljYXRpb24oKSwgLi4uICovCisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaWZkZWYgQ09ORklHX0lSREFfRkFTVF9SUgoraW50IHN5c2N0bF9mYXN0X3BvbGxfaW5jcmVhc2UgPSA1MDsKKyNlbmRpZgorCitzdGF0aWMgaW50IGlybGFwX3N0YXRlX25kbSAgICAoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlybGFwX3N0YXRlX3F1ZXJ5ICAoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlybGFwX3N0YXRlX3JlcGx5ICAoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlybGFwX3N0YXRlX2Nvbm4gICAoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlybGFwX3N0YXRlX3NldHVwICAoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlybGFwX3N0YXRlX29mZmxpbmUoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlybGFwX3N0YXRlX3htaXRfcCAoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlybGFwX3N0YXRlX3BjbG9zZSAoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlybGFwX3N0YXRlX25ybV9wICAoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlybGFwX3N0YXRlX3Jlc2V0X3dhaXQoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfcmVzZXQgIChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfbnJtX3MgIChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfeG1pdF9zIChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfc2Nsb3NlIChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfcmVzZXRfY2hlY2soc3RydWN0IGlybGFwX2NiICosIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJCSAgIHN0cnVjdCBza19idWZmICosIHN0cnVjdCBpcmxhcF9pbmZvICopOworCisjaWZkZWYgQ09ORklHX0lSREFfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICppcmxhcF9ldmVudFtdID0geworCSJESVNDT1ZFUllfUkVRVUVTVCIsCisJIkNPTk5FQ1RfUkVRVUVTVCIsCisJIkNPTk5FQ1RfUkVTUE9OU0UiLAorCSJESVNDT05ORUNUX1JFUVVFU1QiLAorCSJEQVRBX1JFUVVFU1QiLAorCSJSRVNFVF9SRVFVRVNUIiwKKwkiUkVTRVRfUkVTUE9OU0UiLAorCSJTRU5EX0lfQ01EIiwKKwkiU0VORF9VSV9GUkFNRSIsCisJIlJFQ1ZfRElTQ09WRVJZX1hJRF9DTUQiLAorCSJSRUNWX0RJU0NPVkVSWV9YSURfUlNQIiwKKwkiUkVDVl9TTlJNX0NNRCIsCisJIlJFQ1ZfVEVTVF9DTUQiLAorCSJSRUNWX1RFU1RfUlNQIiwKKwkiUkVDVl9VQV9SU1AiLAorCSJSRUNWX0RNX1JTUCIsCisJIlJFQ1ZfUkRfUlNQIiwKKwkiUkVDVl9JX0NNRCIsCisJIlJFQ1ZfSV9SU1AiLAorCSJSRUNWX1VJX0ZSQU1FIiwKKwkiUkVDVl9GUk1SX1JTUCIsCisJIlJFQ1ZfUlJfQ01EIiwKKwkiUkVDVl9SUl9SU1AiLAorCSJSRUNWX1JOUl9DTUQiLAorCSJSRUNWX1JOUl9SU1AiLAorCSJSRUNWX1JFSl9DTUQiLAorCSJSRUNWX1JFSl9SU1AiLAorCSJSRUNWX1NSRUpfQ01EIiwKKwkiUkVDVl9TUkVKX1JTUCIsCisJIlJFQ1ZfRElTQ19DTUQiLAorCSJTTE9UX1RJTUVSX0VYUElSRUQiLAorCSJRVUVSWV9USU1FUl9FWFBJUkVEIiwKKwkiRklOQUxfVElNRVJfRVhQSVJFRCIsCisJIlBPTExfVElNRVJfRVhQSVJFRCIsCisJIkRJU0NPVkVSWV9USU1FUl9FWFBJUkVEIiwKKwkiV0RfVElNRVJfRVhQSVJFRCIsCisJIkJBQ0tPRkZfVElNRVJfRVhQSVJFRCIsCisJIk1FRElBX0JVU1lfVElNRVJfRVhQSVJFRCIsCit9OworI2VuZGlmCS8qIENPTkZJR19JUkRBX0RFQlVHICovCisKK2NvbnN0IGNoYXIgKmlybGFwX3N0YXRlW10gPSB7CisJIkxBUF9ORE0iLAorCSJMQVBfUVVFUlkiLAorCSJMQVBfUkVQTFkiLAorCSJMQVBfQ09OTiIsCisJIkxBUF9TRVRVUCIsCisJIkxBUF9PRkZMSU5FIiwKKwkiTEFQX1hNSVRfUCIsCisJIkxBUF9QQ0xPU0UiLAorCSJMQVBfTlJNX1AiLAorCSJMQVBfUkVTRVRfV0FJVCIsCisJIkxBUF9SRVNFVCIsCisJIkxBUF9OUk1fUyIsCisJIkxBUF9YTUlUX1MiLAorCSJMQVBfU0NMT1NFIiwKKwkiTEFQX1JFU0VUX0NIRUNLIiwKK307CisKK3N0YXRpYyBpbnQgKCpzdGF0ZVtdKShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykgPQoreworCWlybGFwX3N0YXRlX25kbSwKKwlpcmxhcF9zdGF0ZV9xdWVyeSwKKwlpcmxhcF9zdGF0ZV9yZXBseSwKKwlpcmxhcF9zdGF0ZV9jb25uLAorCWlybGFwX3N0YXRlX3NldHVwLAorCWlybGFwX3N0YXRlX29mZmxpbmUsCisJaXJsYXBfc3RhdGVfeG1pdF9wLAorCWlybGFwX3N0YXRlX3BjbG9zZSwKKwlpcmxhcF9zdGF0ZV9ucm1fcCwKKwlpcmxhcF9zdGF0ZV9yZXNldF93YWl0LAorCWlybGFwX3N0YXRlX3Jlc2V0LAorCWlybGFwX3N0YXRlX25ybV9zLAorCWlybGFwX3N0YXRlX3htaXRfcywKKwlpcmxhcF9zdGF0ZV9zY2xvc2UsCisJaXJsYXBfc3RhdGVfcmVzZXRfY2hlY2ssCit9OworCisvKgorICogRnVuY3Rpb24gaXJkYV9wb2xsX3RpbWVyX2V4cGlyZWQgKGRhdGEpCisgKgorICogICAgUG9sbCB0aW1lciBoYXMgZXhwaXJlZC4gTm9ybWFsbHkgd2UgbXVzdCBub3cgc2VuZCBhIFJSIGZyYW1lIHRvIHRoZQorICogICAgcmVtb3RlIGRldmljZQorICovCitzdGF0aWMgdm9pZCBpcmxhcF9wb2xsX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGRhdGE7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlpcmxhcF9kb19ldmVudChzZWxmLCBQT0xMX1RJTUVSX0VYUElSRUQsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogQ2FsY3VsYXRlIGFuZCBzZXQgdGltZSBiZWZvcmUgd2Ugd2lsbCBoYXZlIHRvIHNlbmQgYmFjayB0aGUgcGYgYml0CisgKiB0byB0aGUgcGVlci4gVXNlIGluIHByaW1hcnkuCisgKiBNYWtlIHN1cmUgdGhhdCBzdGF0ZSBpcyBYTUlUX1AvWE1JVF9TIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisgKiAoYW5kIHRoYXQgbm9ib2R5IG1lc3NlZCB1cCB3aXRoIHRoZSBzdGF0ZSkuIC0gSmVhbiBJSQorICovCitzdGF0aWMgdm9pZCBpcmxhcF9zdGFydF9wb2xsX3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisjaWZkZWYgQ09ORklHX0lSREFfRkFTVF9SUgorCS8qCisJICogU2VuZCBvdXQgdGhlIFJSIGZyYW1lcyBmYXN0ZXIgaWYgb3VyIG93biB0cmFuc21pdCBxdWV1ZSBpcyBlbXB0eSwgb3IKKwkgKiBpZiB0aGUgcGVlciBpcyBidXN5LiBUaGUgZWZmZWN0IGlzIGEgbXVjaCBmYXN0ZXIgY29udmVyc2F0aW9uCisJICovCisJaWYgKChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID09IDApIHx8IChzZWxmLT5yZW1vdGVfYnVzeSkpIHsKKwkJaWYgKHNlbGYtPmZhc3RfUlIgPT0gVFJVRSkgeworCQkJLyoKKwkJCSAqICBBc3NlcnQgdGhhdCB0aGUgZmFzdCBwb2xsIHRpbWVyIGhhcyBub3QgcmVhY2hlZCB0aGUKKwkJCSAqICBub3JtYWwgcG9sbCB0aW1lciB5ZXQKKwkJCSAqLworCQkJaWYgKHNlbGYtPmZhc3RfUlJfdGltZW91dCA8IHRpbWVvdXQpIHsKKwkJCQkvKgorCQkJCSAqICBGSVhNRTogdGhpcyBzaG91bGQgYmUgYSBtb3JlIGNvbmZpZ3VyYWJsZQorCQkJCSAqICAgICAgICAgZnVuY3Rpb24KKwkJCQkgKi8KKwkJCQlzZWxmLT5mYXN0X1JSX3RpbWVvdXQgKz0KKwkJCQkJKHN5c2N0bF9mYXN0X3BvbGxfaW5jcmVhc2UgKiBIWi8xMDAwKTsKKworCQkJCS8qIFVzZSB0aGlzIGZhc3QoZXIpIHRpbWVvdXQgaW5zdGVhZCAqLworCQkJCXRpbWVvdXQgPSBzZWxmLT5mYXN0X1JSX3RpbWVvdXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzZWxmLT5mYXN0X1JSID0gVFJVRTsKKworCQkJLyogU3RhcnQgd2l0aCBqdXN0IDAgbXMgKi8KKwkJCXNlbGYtPmZhc3RfUlJfdGltZW91dCA9IDA7CisJCQl0aW1lb3V0ID0gMDsKKwkJfQorCX0gZWxzZQorCQlzZWxmLT5mYXN0X1JSID0gRkFMU0U7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpLCB0aW1lb3V0PSVkICglbGQpXG4iLCBfX0ZVTkNUSU9OX18sIHRpbWVvdXQsIGppZmZpZXMpOworI2VuZGlmIC8qIENPTkZJR19JUkRBX0ZBU1RfUlIgKi8KKworCWlmICh0aW1lb3V0ID09IDApCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFBPTExfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7CisJZWxzZQorCQlpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5wb2xsX3RpbWVyLCB0aW1lb3V0LCBzZWxmLAorCQkJCSBpcmxhcF9wb2xsX3RpbWVyX2V4cGlyZWQpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfZG9fZXZlbnQgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgUnVzaGVzIHRocm91Z2ggdGhlIHN0YXRlIG1hY2hpbmUgd2l0aG91dCBhbnkgZGVsYXkuIElmIHN0YXRlID09IFhNSVQKKyAqICAgIHRoZW4gc2VuZCBxdWV1ZWQgZGF0YSBmcmFtZXMuCisgKi8KK3ZvaWQgaXJsYXBfZG9fZXZlbnQoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCWludCByZXQ7CisKKwlpZiAoIXNlbGYgfHwgc2VsZi0+bWFnaWMgIT0gTEFQX01BR0lDKQorCQlyZXR1cm47CisKKwlJUkRBX0RFQlVHKDMsICIlcygpLCBldmVudCA9ICVzLCBzdGF0ZSA9ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIGlybGFwX2V2ZW50W2V2ZW50XSwgaXJsYXBfc3RhdGVbc2VsZi0+c3RhdGVdKTsKKworCXJldCA9ICgqc3RhdGVbc2VsZi0+c3RhdGVdKShzZWxmLCBldmVudCwgc2tiLCBpbmZvKTsKKworCS8qCisJICogIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcGVuZGluZyBldmVudHMgdGhhdCBuZWVkcyB0byBiZSBleGVjdXRlZAorCSAqLworCXN3aXRjaCAoc2VsZi0+c3RhdGUpIHsKKwljYXNlIExBUF9YTUlUX1A6IC8qIEZBTExUSFJPVUdIICovCisJY2FzZSBMQVBfWE1JVF9TOgorCQkvKgorCQkgKiBXZSBqdXN0IHJlY2VpdmVkIHRoZSBwZiBiaXQgYW5kIGFyZSBhdCB0aGUgYmVnaW5uaW5nCisJCSAqIG9mIGEgbmV3IExBUCB0cmFuc21pdCB3aW5kb3cuCisJCSAqIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcXVldWVkIGRhdGEgZnJhbWVzLCBhbmQgZG8gbm90CisJCSAqIHRyeSB0byBkaXNjb25uZWN0IGxpbmsgaWYgd2Ugc2VuZCBhbnkgZGF0YSBmcmFtZXMsIHNpbmNlCisJCSAqIHRoYXQgd2lsbCBjaGFuZ2UgdGhlIHN0YXRlIGF3YXkgZm9ybSBYTUlUCisJCSAqLworCQlJUkRBX0RFQlVHKDIsICIlcygpIDogcXVldWUgbGVuID0gJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkpOworCisJCWlmIChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpKSB7CisJCQkvKiBQcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aXRoIGlybGFwX2RhdGFfcmVxdWVzdCgpICovCisJCQlzZWxmLT5sb2NhbF9idXN5ID0gVFJVRTsKKworCQkJLyogVGhlb3J5IG9mIG9wZXJhdGlvbi4KKwkJCSAqIFdlIHNlbmQgZnJhbWVzIHVwIHRvIHdoZW4gd2UgZmlsbCB0aGUgd2luZG93IG9yCisJCQkgKiByZWFjaCBsaW5lIGNhcGFjaXR5LiBUaG9zZSBmcmFtZXMgd2lsbCBxdWV1ZSB1cAorCQkJICogaW4gdGhlIGRldmljZSBxdWV1ZSwgYW5kIHRoZSBkcml2ZXIgd2lsbCBzbG93bHkKKwkJCSAqIHNlbmQgdGhlbS4KKwkJCSAqIEFmdGVyIGVhY2ggZnJhbWUgdGhhdCB3ZSBzZW5kLCB3ZSBwb2xsIHRoZSBoaWdoZXIKKwkJCSAqIGxheWVyIGZvciBtb3JlIGRhdGEuIEl0J3MgdGhlIHJpZ2h0IHRpbWUgdG8gZG8KKwkJCSAqIHRoYXQgYmVjYXVzZSB0aGUgbGluayBsYXllciBuZWVkIHRvIHBlcmZvcm0gdGhlIG10dAorCQkJICogYW5kIHRoZW4gc2VuZCB0aGUgZmlyc3QgZnJhbWUsIHNvIHdlIGNhbiBhZmZvcmQKKwkJCSAqIHRvIHNlbmQgYSBiaXQgb2YgdGltZSBpbiBrZXJuZWwgc3BhY2UuCisJCQkgKiBUaGUgZXhwbGljaXQgZmxvdyBpbmRpY2F0aW9uIGFsbG93IHRvIG1pbmltaXNlCisJCQkgKiBidWZmZXJzICg9PSBsb3dlciBsYXRlbmN5KSwgdG8gYXZvaWQgaGlnaGVyIGxheWVyCisJCQkgKiBwb2xsaW5nIHZpYSB0aW1lcnMgKD09IGxlc3MgY29udGV4dCBzd2l0Y2hlcykgYW5kCisJCQkgKiB0byBpbXBsZW1lbnQgYSBjcnVkZSBzY2hlZHVsZXIgLSBKZWFuIElJICovCisKKwkJCS8qIFRyeSB0byBzZW5kIGF3YXkgYWxsIHF1ZXVlZCBkYXRhIGZyYW1lcyAqLworCQkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+dHhxKSkgIT0gTlVMTCkgeworCQkJCS8qIFNlbmQgb25lIGZyYW1lICovCisJCQkJcmV0ID0gKCpzdGF0ZVtzZWxmLT5zdGF0ZV0pKHNlbGYsIFNFTkRfSV9DTUQsCisJCQkJCQkJICAgIHNrYiwgTlVMTCk7CisJCQkJLyogRHJvcCByZWZlcmVuY2UgY291bnQuCisJCQkJICogSXQgd2lsbCBiZSBpbmNyZWFzZSBhcyBuZWVkZWQgaW4KKwkJCQkgKiBpcmxhcF9zZW5kX2RhdGFfeHh4KCkgKi8KKwkJCQlrZnJlZV9za2Ioc2tiKTsKKworCQkJCS8qIFBvbGwgdGhlIGhpZ2hlciBsYXllcnMgZm9yIG9uZSBtb3JlIGZyYW1lICovCisJCQkJaXJsbXBfZmxvd19pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwKKwkJCQkJCSAgICAgIEZMT1dfU1RBUlQpOworCisJCQkJaWYgKHJldCA9PSAtRVBST1RPKQorCQkJCQlicmVhazsgLyogVHJ5IGFnYWluIGxhdGVyISAqLworCQkJfQorCQkJLyogRmluaXNoZWQgdHJhbnNtaXR0aW5nICovCisJCQlzZWxmLT5sb2NhbF9idXN5ID0gRkFMU0U7CisJCX0gZWxzZSBpZiAoc2VsZi0+ZGlzY29ubmVjdF9wZW5kaW5nKSB7CisJCQlzZWxmLT5kaXNjb25uZWN0X3BlbmRpbmcgPSBGQUxTRTsKKworCQkJcmV0ID0gKCpzdGF0ZVtzZWxmLT5zdGF0ZV0pKHNlbGYsIERJU0NPTk5FQ1RfUkVRVUVTVCwKKwkJCQkJCSAgICBOVUxMLCBOVUxMKTsKKwkJfQorCQlicmVhazsKKy8qCWNhc2UgTEFQX05ETTogKi8KKy8qCWNhc2UgTEFQX0NPTk46ICovCisvKgljYXNlIExBUF9SRVNFVF9XQUlUOiAqLworLyoJY2FzZSBMQVBfUkVTRVRfQ0hFQ0s6ICovCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfbmV4dF9zdGF0ZSAoc2VsZiwgc3RhdGUpCisgKgorICogICAgU3dpdGNoZXMgc3RhdGUgYW5kIHByb3ZpZGVzIGRlYnVnIGluZm9ybWF0aW9uCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJsYXBfbmV4dF9zdGF0ZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX1NUQVRFIHN0YXRlKQoreworCS8qCisJaWYgKCFzZWxmIHx8IHNlbGYtPm1hZ2ljICE9IExBUF9NQUdJQykKKwkJcmV0dXJuOworCisJSVJEQV9ERUJVRyg0LCAibmV4dCBMQVAgc3RhdGUgPSAlc1xuIiwgaXJsYXBfc3RhdGVbc3RhdGVdKTsKKwkqLworCXNlbGYtPnN0YXRlID0gc3RhdGU7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV9uZG0gKGV2ZW50LCBza2IsIGZyYW1lKQorICoKKyAqICAgIE5ETSAoTm9ybWFsIERpc2Nvbm5lY3RlZCBNb2RlKSBzdGF0ZQorICoKKyAqLworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9uZG0oc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCWRpc2NvdmVyeV90ICpkaXNjb3ZlcnlfcnNwOworCWludCByZXQgPSAwOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQ09OTkVDVF9SRVFVRVNUOgorCQlJUkRBX0FTU0VSVChzZWxmLT5uZXRkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkJaWYgKHNlbGYtPm1lZGlhX2J1c3kpIHsKKwkJCS8qIE5vdGUgOiB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuLCBiZWNhdXNlIHdlIHRlc3QKKwkJCSAqIG1lZGlhIGJ1c3kgaW4gaXJsYXBfY29ubmVjdF9yZXF1ZXN0KCkgYW5kCisJCQkgKiBwb3N0cG9uZSB0aGUgZXZlbnQuLi4gLSBKZWFuIElJICovCisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBDT05ORUNUX1JFUVVFU1Q6IG1lZGlhIGJ1c3khXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisKKwkJCS8qIEFsd2F5cyBzd2l0Y2ggc3RhdGUgYmVmb3JlIGNhbGxpbmcgdXBwZXIgbGF5ZXJzICovCisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCisJCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX01FRElBX0JVU1kpOworCQl9IGVsc2UgeworCQkJaXJsYXBfc2VuZF9zbnJtX2ZyYW1lKHNlbGYsICZzZWxmLT5xb3NfcngpOworCisJCQkvKiBTdGFydCBGaW5hbC1iaXQgdGltZXIgKi8KKwkJCWlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHNlbGYsIHNlbGYtPmZpbmFsX3RpbWVvdXQpOworCisJCQlzZWxmLT5yZXRyeV9jb3VudCA9IDA7CisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9TRVRVUCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSRUNWX1NOUk1fQ01EOgorCQkvKiBDaGVjayBpZiB0aGUgZnJhbWUgY29udGFpbnMgYW5kIEkgZmllbGQgKi8KKwkJaWYgKGluZm8pIHsKKwkJCXNlbGYtPmRhZGRyID0gaW5mby0+ZGFkZHI7CisJCQlzZWxmLT5jYWRkciA9IGluZm8tPmNhZGRyOworCisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9DT05OKTsKKworCQkJaXJsYXBfY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CisJCX0gZWxzZSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBTTlJNIGZyYW1lIGRvZXMgbm90ICIKKwkJCQkgICAiY29udGFpbiBhbiBJIGZpZWxkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJfQorCQlicmVhazsKKwljYXNlIERJU0NPVkVSWV9SRVFVRVNUOgorCQlJUkRBX0FTU0VSVChpbmZvICE9IE5VTEwsIHJldHVybiAtMTspOworCisJCWlmIChzZWxmLT5tZWRpYV9idXN5KSB7CisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBESVNDT1ZFUllfUkVRVUVTVDogbWVkaWEgYnVzeSFcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCS8qIGlybGFwLT5sb2cuY29uZGl0aW9uID0gTUVESUFfQlVTWTsgKi8KKworCQkJLyogVGhpcyB3aWxsIG1ha2UgSXJMTVAgdHJ5IGFnYWluICovCisJCQlpcmxhcF9kaXNjb3ZlcnlfY29uZmlybShzZWxmLCBOVUxMKTsKKwkJCS8qIE5vdGUgOiB0aGUgZGlzY292ZXJ5IGxvZyBpcyBub3QgY2xlYW5lZCB1cCBoZXJlLAorCQkJICogaXQgd2lsbCBiZSBkb25lIGluIGlybGFwX2Rpc2NvdmVyeV9yZXF1ZXN0KCkKKwkJCSAqIEplYW4gSUkgKi8KKwkJCXJldHVybiAwOworCQl9CisKKwkJc2VsZi0+UyA9IGluZm8tPlM7CisJCXNlbGYtPnMgPSBpbmZvLT5zOworCQlpcmxhcF9zZW5kX2Rpc2NvdmVyeV94aWRfZnJhbWUoc2VsZiwgaW5mby0+UywgaW5mby0+cywgVFJVRSwKKwkJCQkJICAgICAgIGluZm8tPmRpc2NvdmVyeSk7CisJCXNlbGYtPmZyYW1lX3NlbnQgPSBGQUxTRTsKKwkJc2VsZi0+cysrOworCisJCWlybGFwX3N0YXJ0X3Nsb3RfdGltZXIoc2VsZiwgc2VsZi0+c2xvdF90aW1lb3V0KTsKKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfUVVFUlkpOworCQlicmVhazsKKwljYXNlIFJFQ1ZfRElTQ09WRVJZX1hJRF9DTUQ6CisJCUlSREFfQVNTRVJUKGluZm8gIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkJLyogQXNzZXJ0IHRoYXQgdGhpcyBpcyBub3QgdGhlIGZpbmFsIHNsb3QgKi8KKwkJaWYgKGluZm8tPnMgPD0gaW5mby0+UykgeworCQkJc2VsZi0+c2xvdCA9IGlybGFwX2dlbmVyYXRlX3JhbmRfdGltZV9zbG90KGluZm8tPlMsCisJCQkJCQkJCSAgIGluZm8tPnMpOworCQkJaWYgKHNlbGYtPnNsb3QgPT0gaW5mby0+cykgeworCQkJCWRpc2NvdmVyeV9yc3AgPSBpcmxtcF9nZXRfZGlzY292ZXJ5X3Jlc3BvbnNlKCk7CisJCQkJZGlzY292ZXJ5X3JzcC0+ZGF0YS5kYWRkciA9IGluZm8tPmRhZGRyOworCisJCQkJaXJsYXBfc2VuZF9kaXNjb3ZlcnlfeGlkX2ZyYW1lKHNlbGYsIGluZm8tPlMsCisJCQkJCQkJICAgICAgIHNlbGYtPnNsb3QsCisJCQkJCQkJICAgICAgIEZBTFNFLAorCQkJCQkJCSAgICAgICBkaXNjb3ZlcnlfcnNwKTsKKwkJCQlzZWxmLT5mcmFtZV9zZW50ID0gVFJVRTsKKwkJCX0gZWxzZQorCQkJCXNlbGYtPmZyYW1lX3NlbnQgPSBGQUxTRTsKKworCQkJLyoKKwkJCSAqIEdvIHRvIHJlcGx5IHN0YXRlIHVudGlsIGVuZCBvZiBkaXNjb3ZlcnkgdG8KKwkJCSAqIGluaGliaXQgb3VyIG93biB0cmFuc21pc3Npb25zLiBTZXQgdGhlIHRpbWVyCisJCQkgKiB0byBub3Qgc3RheSBmb3JldmVyIHRoZXJlLi4uIEplYW4gSUkKKwkJCSAqLworCQkJaXJsYXBfc3RhcnRfcXVlcnlfdGltZXIoc2VsZiwgaW5mby0+UywgaW5mby0+cyk7CisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9SRVBMWSk7CisJCX0gZWxzZSB7CisJCS8qIFRoaXMgaXMgdGhlIGZpbmFsIHNsb3QuIEhvdyBpcyBpdCBwb3NzaWJsZSA/CisJCSAqIFRoaXMgd291bGQgaGFwcGVuIGlzIGJvdGggZGlzY292ZXJpZXMgYXJlIGp1c3Qgc2xpZ2h0bHkKKwkJICogb2Zmc2V0IChpZiB0aGV5IGFyZSBpbiBzeW5jLCBhbGwgcGFja2V0cyBhcmUgbG9zdCkuCisJCSAqIE1vc3Qgb2Z0ZW4sIGFsbCB0aGUgZGlzY292ZXJ5IHJlcXVlc3RzIHdpbGwgYmUgcmVjZWl2ZWQKKwkJICogaW4gUVVFUlkgc3RhdGUgKHNlZSBteSBjb21tZW50IHRoZXJlKSwgZXhjZXB0IGZvciB0aGUKKwkJICogbGFzdCBmcmFtZSB0aGF0IHdpbGwgY29tZSBoZXJlLgorCQkgKiBUaGUgYmlnIHRyb3VibGUgd2hlbiBpdCBoYXBwZW4gaXMgdGhhdCBhY3RpdmUgZGlzY292ZXJ5CisJCSAqIGRvZXNuJ3QgaGFwcGVuLCBiZWNhdXNlIG5vYm9keSBhbnN3ZXIgdGhlIGRpc2NvdmVyaWVzCisJCSAqIGZyYW1lIG9mIHRoZSBvdGhlciBndXksIHNvIHRoZSBsb2cgc2hvd3MgdXAgZW1wdHkuCisJCSAqIFdoYXQgc2hvdWxkIHdlIGRvID8KKwkJICogTm90IG11Y2guIEl0J3MgdG9vIGxhdGUgdG8gYW5zd2VyIHRob3NlIGRpc2NvdmVyeSBmcmFtZXMsCisJCSAqIHNvIHdlIGp1c3QgcGFzcyB0aGUgaW5mbyB0byBJckxNUCB3aG8gd2lsbCBwdXQgaXQgaW4gdGhlCisJCSAqIGxvZyAoYW5kIHBvc3QgYW4gZXZlbnQpLgorCQkgKiBBbm90aGVyIGNhdXNlIHdvdWxkIGJlIGRldmljZXMgdGhhdCBkbyBkaXNjb3ZlcnkgbXVjaAorCQkgKiBzbG93ZXIgdGhhbiB1cywgaG93ZXZlciB0aGUgbGF0ZXN0IGZpeGVzIHNob3VsZCBtaW5pbWlzZQorCQkgKiB0aG9zZSBjYXNlcy4uLgorCQkgKiBKZWFuIElJCisJCSAqLworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgUmVjZWl2aW5nIGZpbmFsIGRpc2NvdmVyeSByZXF1ZXN0LCBtaXNzZWQgdGhlIGRpc2NvdmVyeSBzbG90cyA6LShcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJCS8qIExhc3QgZGlzY292ZXJ5IHJlcXVlc3QgLT4gaW4gdGhlIGxvZyAqLworCQkJaXJsYXBfZGlzY292ZXJ5X2luZGljYXRpb24oc2VsZiwgaW5mby0+ZGlzY292ZXJ5KTsKKwkJfQorCQlicmVhazsKKwljYXNlIE1FRElBX0JVU1lfVElNRVJfRVhQSVJFRDoKKwkJLyogQSBidW5jaCBvZiBldmVudHMgbWF5IGJlIHBvc3Rwb25lZCBiZWNhdXNlIHRoZSBtZWRpYSBpcworCQkgKiBidXN5ICh1c3VhbGx5IGltbWVkaWF0ZWx5IGFmdGVyIHdlIGNsb3NlIGEgY29ubmVjdGlvbiksCisJCSAqIG9yIHdoaWxlIHdlIGFyZSBkb2luZyBkaXNjb3ZlcnkgKHN0YXRlIHF1ZXJ5L3JlcGx5KS4KKwkJICogSW4gYWxsIHRob3NlIGNhc2VzLCB0aGUgbWVkaWEgYnVzeSBmbGFnIHdpbGwgYmUgY2xlYXJlZAorCQkgKiB3aGVuIGl0J3MgT0sgZm9yIHVzIHRvIHByb2Nlc3MgdGhvc2UgcG9zdHBvbmVkIGV2ZW50cy4KKwkJICogVGhpcyBldmVudCBpcyBub3QgbWVudGlvbmVkIGluIHRoZSBzdGF0ZSBtYWNoaW5lcyBpbiB0aGUKKwkJICogSXJMQVAgc3BlYy4gSXQncyBiZWNhdXNlIHRoZXkgZGlkbid0IGNvbnNpZGVyIFVsdHJhIGFuZAorCQkgKiBwb3N0cG9uaW5nIGNvbm5lY3Rpb24gcmVxdWVzdCBpcyBvcHRpb25hbC4KKwkJICogSmVhbiBJSSAqLworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCisJCS8qIFNlbmQgYW55IHBlbmRpbmcgVWx0cmEgZnJhbWVzIGlmIGFueSAqLworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxX3VsdHJhKSkgeworCQkJLyogV2UgZG9uJ3Qgc2VuZCB0aGUgZnJhbWUsIGp1c3QgcG9zdCBhbiBldmVudC4KKwkJCSAqIEFsc28sIHByZXZpb3VzbHkgdGhpcyBjb2RlIHdhcyBpbiB0aW1lci5jLi4uCisJCQkgKiBKZWFuIElJICovCisJCQlyZXQgPSAoKnN0YXRlW3NlbGYtPnN0YXRlXSkoc2VsZiwgU0VORF9VSV9GUkFNRSwKKwkJCQkJCSAgICBOVUxMLCBOVUxMKTsKKwkJfQorI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCisJCS8qIENoZWNrIGlmIHdlIHNob3VsZCB0cnkgdG8gY29ubmVjdC4KKwkJICogVGhpcyBjb2RlIHdhcyBwcmV2aW91c2x5IGluIGlybGFwX2RvX2V2ZW50KCkgKi8KKwkJaWYgKHNlbGYtPmNvbm5lY3RfcGVuZGluZykgeworCQkJc2VsZi0+Y29ubmVjdF9wZW5kaW5nID0gRkFMU0U7CisKKwkJCS8qIFRoaXMgb25lICpzaG91bGQqIG5vdCBwZW5kIGluIHRoaXMgc3RhdGUsIGV4Y2VwdAorCQkJICogaWYgYSBzb2NrZXQgdHJ5IHRvIGNvbm5lY3QgYW5kIGltbWVkaWF0ZWx5CisJCQkgKiBkaXNjb25uZWN0LiAtIGNsZWFyIC0gSmVhbiBJSSAqLworCQkJaWYgKHNlbGYtPmRpc2Nvbm5lY3RfcGVuZGluZykKKwkJCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX0RJU0NfSU5ESUNBVElPTik7CisJCQllbHNlCisJCQkJcmV0ID0gKCpzdGF0ZVtzZWxmLT5zdGF0ZV0pKHNlbGYsCisJCQkJCQkJICAgIENPTk5FQ1RfUkVRVUVTVCwKKwkJCQkJCQkgICAgTlVMTCwgTlVMTCk7CisJCQlzZWxmLT5kaXNjb25uZWN0X3BlbmRpbmcgPSBGQUxTRTsKKwkJfQorCQkvKiBOb3RlIDogb25lIHdheSB0byB0ZXN0IGlmIHRoaXMgY29kZSB3b3JrcyB3ZWxsIChpbmNsdWRpbmcKKwkJICogbWVkaWEgYnVzeSBhbmQgc21hbGwgYnVzeSkgaXMgdG8gY3JlYXRlIGEgdXNlciBzcGFjZQorCQkgKiBhcHBsaWNhdGlvbiBnZW5lcmF0aW5nIGFuIFVsdHJhIHBhY2tldCBldmVyeSAzLjA1IHNlYyAob3IKKwkJICogMi45NSBzZWMpIGFuZCB0byBzZWUgaG93IGl0IGludGVyYWN0IHdpdGggZGlzY292ZXJ5LgorCQkgKiBJdCdzIGZhaXJseSBlYXN5IHRvIGNoZWNrIHRoYXQgbm8gcGFja2V0IGlzIGxvc3QsIHRoYXQgdGhlCisJCSAqIHBhY2tldHMgYXJlIHBvc3Rwb25lZCBkdXJpbmcgZGlzY292ZXJ5IGFuZCB0aGF0IGFmdGVyCisJCSAqIGRpc2NvdmVyeSBpbmRpY2F0aW9uIHlvdSBoYXZlIGEgMTAwbXMgImdhcCIuCisJCSAqIEFzIGNvbm5lY3Rpb24gcmVxdWVzdCBhbmQgVWx0cmEgYXJlIG5vdyBwcm9jZXNzZWQgdGhlIHNhbWUKKwkJICogd2F5LCB0aGlzIGF2b2lkIHRoZSB0ZWRpb3VzIGpvYiBvZiB0cnlpbmcgSXJMQVAgY29ubmVjdGlvbgorCQkgKiBpbiBhbGwgdGhvc2UgY2FzZXMuLi4KKwkJICogSmVhbiBJSSAqLworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQorCWNhc2UgU0VORF9VSV9GUkFNRToKKwl7CisJCWludCBpOworCQkvKiBPbmx5IGFsbG93ZWQgdG8gcmVwZWF0IGFuIG9wZXJhdGlvbiB0d2ljZSAqLworCQlmb3IgKGk9MDsgKChpPDIpICYmIChzZWxmLT5tZWRpYV9idXN5ID09IEZBTFNFKSk7IGkrKykgeworCQkJc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPnR4cV91bHRyYSk7CisJCQlpZiAoc2tiKQorCQkJCWlybGFwX3NlbmRfdWlfZnJhbWUoc2VsZiwgc2tiLCBDQlJPQURDQVNULAorCQkJCQkJICAgIENNRF9GUkFNRSk7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCQkvKiBpcmxhcF9zZW5kX3VpX2ZyYW1lKCkgd29uJ3QgaW5jcmVhc2Ugc2tiIHJlZmVyZW5jZQorCQkJICogY291bnQsIHNvIG5vIGRldl9rZnJlZV9za2IoKSAtIEplYW4gSUkgKi8KKwkJfQorCQlpZiAoaSA9PSAyKSB7CisJCQkvKiBGb3JjZSB1cyB0byBsaXN0ZW4gNTAwIG1zIGFnYWluICovCisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFRSVUUpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFJFQ1ZfVUlfRlJBTUU6CisJCS8qIE9ubHkgYWNjZXB0IGJyb2FkY2FzdCBmcmFtZXMgaW4gTkRNIG1vZGUgKi8KKwkJaWYgKGluZm8tPmNhZGRyICE9IENCUk9BRENBU1QpIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIG5vdCBhIGJyb2FkY2FzdCBmcmFtZSFcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJfSBlbHNlCisJCQlpcmxhcF91bml0ZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CisJCWJyZWFrOworI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCisJY2FzZSBSRUNWX1RFU1RfQ01EOgorCQkvKiBSZW1vdmUgdGVzdCBmcmFtZSBoZWFkZXIgKi8KKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHRlc3RfZnJhbWUpKTsKKworCQkvKgorCQkgKiBTZW5kIHJlc3BvbnNlLiBUaGlzIHNrYiB3aWxsIG5vdCBiZSBzZW50IG91dCBhZ2FpbiwgYW5kCisJCSAqIHdpbGwgb25seSBiZSB1c2VkIHRvIHNlbmQgb3V0IHRoZSBzYW1lIGluZm8gYXMgdGhlIGNtZAorCQkgKi8KKwkJaXJsYXBfc2VuZF90ZXN0X2ZyYW1lKHNlbGYsIENCUk9BRENBU1QsIGluZm8tPmRhZGRyLCBza2IpOworCQlicmVhazsKKwljYXNlIFJFQ1ZfVEVTVF9SU1A6CisJCUlSREFfREVCVUcoMCwgIiVzKCkgbm90IGltcGxlbWVudGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlc1xuIiwgX19GVU5DVElPTl9fLAorCQkJICAgaXJsYXBfZXZlbnRbZXZlbnRdKTsKKworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV9xdWVyeSAoZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBRVUVSWSBzdGF0ZQorICoKKyAqLworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9xdWVyeShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFJFQ1ZfRElTQ09WRVJZX1hJRF9SU1A6CisJCUlSREFfQVNTRVJUKGluZm8gIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCUlSREFfQVNTRVJUKGluZm8tPmRpc2NvdmVyeSAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBkYWRkcj0lMDh4XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICBpbmZvLT5kaXNjb3ZlcnktPmRhdGEuZGFkZHIpOworCisJCWlmICghc2VsZi0+ZGlzY292ZXJ5X2xvZykgeworCQkJSVJEQV9XQVJOSU5HKCIlczogZGlzY292ZXJ5IGxvZyBpcyBnb25lISAiCisJCQkJICAgICAibWF5YmUgdGhlIGRpc2NvdmVyeSB0aW1lb3V0IGhhcyBiZWVuIHNldCIKKwkJCQkgICAgICIgdG8gc2hvcnQ/XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJYnJlYWs7CisJCX0KKwkJaGFzaGJpbl9pbnNlcnQoc2VsZi0+ZGlzY292ZXJ5X2xvZywKKwkJCSAgICAgICAoaXJkYV9xdWV1ZV90ICopIGluZm8tPmRpc2NvdmVyeSwKKwkJCSAgICAgICBpbmZvLT5kaXNjb3ZlcnktPmRhdGEuZGFkZHIsIE5VTEwpOworCisJCS8qIEtlZXAgc3RhdGUgKi8KKwkJLyogaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfUVVFUlkpOyAgKi8KKworCQlicmVhazsKKwljYXNlIFJFQ1ZfRElTQ09WRVJZX1hJRF9DTUQ6CisJCS8qIFllcywgaXQgaXMgcG9zc2libGUgdG8gcmVjZWl2ZSB0aG9zZSBmcmFtZXMgaW4gdGhpcyBtb2RlLgorCQkgKiBOb3RlIHRoYXQgbW9zdCBvZnRlbiB0aGUgbGFzdCBkaXNjb3ZlcnkgcmVxdWVzdCB3b24ndAorCQkgKiBvY2N1ciBoZXJlIGJ1dCBpbiBORE0gc3RhdGUgKHNlZSBteSBjb21tZW50IHRoZXJlKS4KKwkJICogV2hhdCBzaG91bGQgd2UgZG8gPworCQkgKiBOb3QgbXVjaC4gV2UgYXJlIGN1cnJlbnRseSBwZXJmb3JtaW5nIG91ciBvd24gZGlzY292ZXJ5LAorCQkgKiB0aGVyZWZvcmUgd2UgY2FuJ3QgYW5zd2VyIHRob3NlIGZyYW1lcy4gV2UgZG9uJ3Qgd2FudAorCQkgKiB0byBjaGFuZ2Ugc3RhdGUgZWl0aGVyLiBXZSBqdXN0IHBhc3MgdGhlIGluZm8gdG8KKwkJICogSXJMTVAgd2hvIHdpbGwgcHV0IGl0IGluIHRoZSBsb2cgKGFuZCBwb3N0IGFuIGV2ZW50KS4KKwkJICogSmVhbiBJSQorCQkgKi8KKworCQlJUkRBX0FTU0VSVChpbmZvICE9IE5VTEwsIHJldHVybiAtMTspOworCisJCUlSREFfREVCVUcoMSwgIiVzKCksIFJlY2VpdmluZyBkaXNjb3ZlcnkgcmVxdWVzdCAocyA9ICVkKSB3aGlsZSBwZXJmb3JtaW5nIGRpc2NvdmVyeSA6LShcbiIsIF9fRlVOQ1RJT05fXywgaW5mby0+cyk7CisKKwkJLyogTGFzdCBkaXNjb3ZlcnkgcmVxdWVzdCA/ICovCisJCWlmIChpbmZvLT5zID09IDB4ZmYpCisJCQlpcmxhcF9kaXNjb3ZlcnlfaW5kaWNhdGlvbihzZWxmLCBpbmZvLT5kaXNjb3ZlcnkpOworCQlicmVhazsKKwljYXNlIFNMT1RfVElNRVJfRVhQSVJFRDoKKwkJLyoKKwkJICogV2FpdCBhIGxpdHRsZSBsb25nZXIgaWYgd2UgZGV0ZWN0IGFuIGluY29taW5nIGZyYW1lLiBUaGlzCisJCSAqIGlzIG5vdCBtZW50aW9uZWQgaW4gdGhlIHNwZWMsIGJ1dCBpcyBhIGdvb2QgdGhpbmcgdG8gZG8sCisJCSAqIHNpbmNlIHdlIHdhbnQgdG8gd29yayBldmVuIHdpdGggZGV2aWNlcyB0aGF0IHZpb2xhdGUgdGhlCisJCSAqIHRpbWluZyByZXF1aXJlbWVudHMuCisJCSAqLworCQlpZiAoaXJkYV9kZXZpY2VfaXNfcmVjZWl2aW5nKHNlbGYtPm5ldGRldikgJiYgIXNlbGYtPmFkZF93YWl0KSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBkZXZpY2UgaXMgc2xvdyB0byBhbnN3ZXIsICIKKwkJCQkgICAid2FpdGluZyBzb21lIG1vcmUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJaXJsYXBfc3RhcnRfc2xvdF90aW1lcihzZWxmLCBtc2Vjc190b19qaWZmaWVzKDEwKSk7CisJCQlzZWxmLT5hZGRfd2FpdCA9IFRSVUU7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXNlbGYtPmFkZF93YWl0ID0gRkFMU0U7CisKKwkJaWYgKHNlbGYtPnMgPCBzZWxmLT5TKSB7CisJCQlpcmxhcF9zZW5kX2Rpc2NvdmVyeV94aWRfZnJhbWUoc2VsZiwgc2VsZi0+UywKKwkJCQkJCSAgICAgICBzZWxmLT5zLCBUUlVFLAorCQkJCQkJICAgICAgIHNlbGYtPmRpc2NvdmVyeV9jbWQpOworCQkJc2VsZi0+cysrOworCQkJaXJsYXBfc3RhcnRfc2xvdF90aW1lcihzZWxmLCBzZWxmLT5zbG90X3RpbWVvdXQpOworCisJCQkvKiBLZWVwIHN0YXRlICovCisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9RVUVSWSk7CisJCX0gZWxzZSB7CisJCQkvKiBUaGlzIGlzIHRoZSBmaW5hbCBzbG90ISAqLworCQkJaXJsYXBfc2VuZF9kaXNjb3ZlcnlfeGlkX2ZyYW1lKHNlbGYsIHNlbGYtPlMsIDB4ZmYsCisJCQkJCQkgICAgICAgVFJVRSwKKwkJCQkJCSAgICAgICBzZWxmLT5kaXNjb3ZlcnlfY21kKTsKKworCQkJLyogQWx3YXlzIHN3aXRjaCBzdGF0ZSBiZWZvcmUgY2FsbGluZyB1cHBlciBsYXllcnMgKi8KKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisKKwkJCS8qCisJCQkgKiAgV2UgYXJlIG5vdyBmaW5pc2hlZCB3aXRoIHRoZSBkaXNjb3ZlcnkgcHJvY2VkdXJlLAorCQkJICogIHNvIG5vdyB3ZSBtdXN0IHJldHVybiB0aGUgcmVzdWx0cworCQkJICovCisJCQlpcmxhcF9kaXNjb3ZlcnlfY29uZmlybShzZWxmLCBzZWxmLT5kaXNjb3ZlcnlfbG9nKTsKKworCQkJLyogSXJMTVAgc2hvdWxkIG5vdyBoYXZlIHRha2VuIGNhcmUgb2YgdGhlIGxvZyAqLworCQkJc2VsZi0+ZGlzY292ZXJ5X2xvZyA9IE5VTEw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlc1xuIiwgX19GVU5DVElPTl9fLAorCQkJICAgaXJsYXBfZXZlbnRbZXZlbnRdKTsKKworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV9yZXBseSAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBSRVBMWSwgd2UgaGF2ZSByZWNlaXZlZCBhIFhJRCBkaXNjb3ZlcnkgZnJhbWUgZnJvbSBhIGRldmljZSBhbmQgd2UKKyAqICAgIGFyZSB3YWl0aW5nIGZvciB0aGUgcmlnaHQgdGltZSBzbG90IHRvIHNlbmQgYSByZXNwb25zZSBYSUQgZnJhbWUKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfcmVwbHkoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJZGlzY292ZXJ5X3QgKmRpc2NvdmVyeV9yc3A7CisJaW50IHJldD0wOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFFVRVJZX1RJTUVSX0VYUElSRUQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFFVRVJZX1RJTUVSX0VYUElSRUQgPCVsZD5cbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGppZmZpZXMpOworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCQlicmVhazsKKwljYXNlIFJFQ1ZfRElTQ09WRVJZX1hJRF9DTUQ6CisJCUlSREFfQVNTRVJUKGluZm8gIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCS8qIExhc3QgZnJhbWU/ICovCisJCWlmIChpbmZvLT5zID09IDB4ZmYpIHsKKwkJCWRlbF90aW1lcigmc2VsZi0+cXVlcnlfdGltZXIpOworCisJCQkvKiBpbmZvLT5sb2cuY29uZGl0aW9uID0gUkVNT1RFOyAqLworCisJCQkvKiBBbHdheXMgc3dpdGNoIHN0YXRlIGJlZm9yZSBjYWxsaW5nIHVwcGVyIGxheWVycyAqLworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTkRNKTsKKworCQkJaXJsYXBfZGlzY292ZXJ5X2luZGljYXRpb24oc2VsZiwgaW5mby0+ZGlzY292ZXJ5KTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIGl0J3Mgb3VyIHNsb3QsIHNlbmQgb3VyIHJlcGx5ICovCisJCQlpZiAoKGluZm8tPnMgPj0gc2VsZi0+c2xvdCkgJiYgKCFzZWxmLT5mcmFtZV9zZW50KSkgeworCQkJCWRpc2NvdmVyeV9yc3AgPSBpcmxtcF9nZXRfZGlzY292ZXJ5X3Jlc3BvbnNlKCk7CisJCQkJZGlzY292ZXJ5X3JzcC0+ZGF0YS5kYWRkciA9IGluZm8tPmRhZGRyOworCisJCQkJaXJsYXBfc2VuZF9kaXNjb3ZlcnlfeGlkX2ZyYW1lKHNlbGYsIGluZm8tPlMsCisJCQkJCQkJICAgICAgIHNlbGYtPnNsb3QsCisJCQkJCQkJICAgICAgIEZBTFNFLAorCQkJCQkJCSAgICAgICBkaXNjb3ZlcnlfcnNwKTsKKworCQkJCXNlbGYtPmZyYW1lX3NlbnQgPSBUUlVFOworCQkJfQorCQkJLyogUmVhZGp1c3Qgb3VyIHRpbWVyIHRvIGFjY29tb2RhdGUgZGV2aWNlcworCQkJICogZG9pbmcgZmFzdGVyIG9yIHNsb3dlciBkaXNjb3ZlcnkgdGhhbiB1cy4uLgorCQkJICogSmVhbiBJSSAqLworCQkJaXJsYXBfc3RhcnRfcXVlcnlfdGltZXIoc2VsZiwgaW5mby0+UywgaW5mby0+cyk7CisKKwkJCS8qIEtlZXAgc3RhdGUgKi8KKwkJCS8vaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfUkVQTFkpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVua25vd24gZXZlbnQgJWQsICVzXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICBldmVudCwgaXJsYXBfZXZlbnRbZXZlbnRdKTsKKworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV9jb25uIChldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIENPTk4sIHdlIGhhdmUgcmVjZWl2ZWQgYSBTTlJNIGNvbW1hbmQgYW5kIGlzIHdhaXRpbmcgZm9yIHRoZSB1cHBlcgorICogICAgbGF5ZXIgdG8gYWNjZXB0IG9yIHJlZnVzZSBjb25uZWN0aW9uCisgKgorICovCitzdGF0aWMgaW50IGlybGFwX3N0YXRlX2Nvbm4oc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIGV2ZW50PSVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybGFwX2V2ZW50WyBldmVudF0pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQ09OTkVDVF9SRVNQT05TRToKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHNucm1fZnJhbWUpKTsKKworCQlJUkRBX0FTU0VSVChzZWxmLT5uZXRkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkJaXJsYXBfcW9zX25lZ290aWF0ZShzZWxmLCBza2IpOworCisJCWlybGFwX2luaXRpYXRlX2Nvbm5lY3Rpb25fc3RhdGUoc2VsZik7CisKKwkJLyoKKwkJICogQXBwbHlpbmcgdGhlIHBhcmFtZXRlcnMgbm93IHdpbGwgbWFrZSBzdXJlIHdlIGNoYW5nZSBzcGVlZAorCQkgKiAqYWZ0ZXIqIHdlIGhhdmUgc2VudCB0aGUgbmV4dCBmcmFtZQorCQkgKi8KKwkJaXJsYXBfYXBwbHlfY29ubmVjdGlvbl9wYXJhbWV0ZXJzKHNlbGYsIEZBTFNFKTsKKworCQkvKgorCQkgKiBTZW5kaW5nIHRoaXMgZnJhbWUgd2lsbCBmb3JjZSBhIHNwZWVkIGNoYW5nZSBhZnRlciBpdCBoYXMKKwkJICogYmVlbiBzZW50IChpLmUuIHRoZSBmcmFtZSB3aWxsIGJlIHNlbnQgYXQgOTYwMCkuCisJCSAqLworCQlpcmxhcF9zZW5kX3VhX3Jlc3BvbnNlX2ZyYW1lKHNlbGYsICZzZWxmLT5xb3NfcngpOworCisjaWYgMAorCQkvKgorCQkgKiBXZSBhcmUgYWxsb3dlZCB0byBzZW5kIHR3byBmcmFtZXMsIGJ1dCB0aGlzIG1heSBpbmNyZWFzZQorCQkgKiB0aGUgY29ubmVjdCBsYXRlbmN5LCBzbyBsZXRzIG5vdCBkbyBpdCBmb3Igbm93LgorCQkgKi8KKwkJLyogVGhpcyBpcyBmdWxsIG9mIGdvb2QgaW50ZW50aW9ucywgYnV0IGRvZXNuJ3Qgd29yayBpbgorCQkgKiBwcmFjdGljZS4KKwkJICogQWZ0ZXIgc2VuZGluZyB0aGUgZmlyc3QgVUEgcmVzcG9uc2UsIHdlIHN3aXRjaCB0aGUKKwkJICogZG9uZ2xlIHRvIHRoZSBuZWdvdGlhdGVkIHNwZWVkLCB3aGljaCBpcyB1c3VhbGx5CisJCSAqIGRpZmZlcmVudCB0aGFuIDk2MDAga2Ivcy4KKwkJICogRnJvbSB0aGVyZSwgdGhlcmUgaXMgdHdvIHNvbHV0aW9ucyA6CisJCSAqIDEpIFRoZSBvdGhlciBlbmQgaGFzIHJlY2VpdmVkIHRoZSBmaXJzdCBVQSByZXNwb25zZSA6CisJCSAqIGl0IHdpbGwgc2V0IHVwIHRoZSBjb25uZWN0aW9uLCBtb3ZlIHRvIHN0YXRlIExBUF9OUk1fUCwKKwkJICogYW5kIHdpbGwgaWdub3JlIGFuZCBkcm9wIHRoZSBzZWNvbmQgVUEgcmVzcG9uc2UuCisJCSAqIEFjdHVhbGx5LCBpdCdzIGV2ZW4gd29yc2UgOiB0aGUgb3RoZXIgc2lkZSB3aWxsIGFsbW9zdAorCQkgKiBpbW1lZGlhdGVseSBzZW5kIGEgUlIgdGhhdCB3aWxsIGxpa2VseSBjb2xsaWRlIHdpdGggdGhlCisJCSAqIFVBIHJlc3BvbnNlIChkZXBlbmRpbmcgb24gbmVnb3RpYXRlZCB0dXJuYXJvdW5kKS4KKwkJICogMikgVGhlIG90aGVyIGVuZCBoYXMgbm90IHJlY2VpdmVkIHRoZSBmaXJzdCBVQSByZXNwb25zZSwKKwkJICogd2lsbCBzdGF5IGF0IDk2MDAgYW5kIHdpbGwgbmV2ZXIgc2VlIHRoZSBzZWNvbmQgVUEgcmVzcG9uc2UuCisJCSAqIEplYW4gSUkgKi8KKwkJaXJsYXBfc2VuZF91YV9yZXNwb25zZV9mcmFtZShzZWxmLCAmc2VsZi0+cW9zX3J4KTsKKyNlbmRpZgorCisJCS8qCisJCSAqICBUaGUgV0QtdGltZXIgY291bGQgYmUgc2V0IHRvIHRoZSBkdXJhdGlvbiBvZiB0aGUgUC10aW1lcgorCQkgKiAgZm9yIHRoaXMgY2FzZSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0d2ljZSB0aGUKKwkJICogIHZhbHVlIChub3RlIDMgSXJMQVAgcC4gNjApLgorCQkgKi8KKwkJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgc2VsZi0+d2RfdGltZW91dCk7CisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsKKworCQlicmVhazsKKwljYXNlIFJFQ1ZfRElTQ09WRVJZX1hJRF9DTUQ6CisJCUlSREFfREVCVUcoMywgIiVzKCksIGV2ZW50IFJFQ1ZfRElTQ09WRVJfWElEX0NNRCFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCisJCWJyZWFrOworCWNhc2UgRElTQ09OTkVDVF9SRVFVRVNUOgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBEaXNjb25uZWN0IHJlcXVlc3QhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpcmxhcF9zZW5kX2RtX2ZyYW1lKHNlbGYpOworCQlpcmxhcF9uZXh0X3N0YXRlKCBzZWxmLCBMQVBfTkRNKTsKKwkJaXJsYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExBUF9ESVNDX0lORElDQVRJT04pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGV2ZW50ICVkLCAlc1xuIiwgX19GVU5DVElPTl9fLCAKKwkJCSAgIGV2ZW50LCBpcmxhcF9ldmVudFtldmVudF0pOworCisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc3RhdGVfc2V0dXAgKGV2ZW50LCBza2IsIGZyYW1lKQorICoKKyAqICAgIFNFVFVQIHN0YXRlLCBUaGUgbG9jYWwgbGF5ZXIgaGFzIHRyYW5zbWl0dGVkIGEgU05STSBjb21tYW5kIGZyYW1lIHRvCisgKiAgICBhIHJlbW90ZSBwZWVyIGxheWVyIGFuZCBpcyBhd2FpdGluZyBhIHJlcGx5IC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfc2V0dXAoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRklOQUxfVElNRVJfRVhQSVJFRDoKKwkJaWYgKHNlbGYtPnJldHJ5X2NvdW50IDwgc2VsZi0+TjMpIHsKKy8qCisgKiAgUGVyZm9ybSByYW5kb20gYmFja29mZiwgV2FpdCBhIHJhbmRvbSBudW1iZXIgb2YgdGltZSB1bml0cywgbWluaW11bQorICogIGR1cmF0aW9uIGhhbGYgdGhlIHRpbWUgdGFrZW4gdG8gdHJhbnNtaXR0IGEgU05STSBmcmFtZSwgbWF4aW11bSBkdXJhdGlvbgorICogIDEuNSB0aW1lcyB0aGUgdGltZSB0YWtlbiB0byB0cmFuc21pdCBhIFNOUk0gZnJhbWUuIFNvIHRoaXMgdGltZSBzaG91bGQKKyAqICBiZXR3ZWVuIDE1IG1zZWNzIGFuZCA0NSBtc2Vjcy4KKyAqLworCQkJaXJsYXBfc3RhcnRfYmFja29mZl90aW1lcihzZWxmLCBtc2Vjc190b19qaWZmaWVzKDIwICsKKwkJCQkJCSAgICAgICAgKGppZmZpZXMgJSAzMCkpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEFsd2F5cyBzd2l0Y2ggc3RhdGUgYmVmb3JlIGNhbGxpbmcgdXBwZXIgbGF5ZXJzICovCisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCisJCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX0ZPVU5EX05PTkUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQkFDS09GRl9USU1FUl9FWFBJUkVEOgorCQlpcmxhcF9zZW5kX3Nucm1fZnJhbWUoc2VsZiwgJnNlbGYtPnFvc19yeCk7CisJCWlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHNlbGYsIHNlbGYtPmZpbmFsX3RpbWVvdXQpOworCQlzZWxmLT5yZXRyeV9jb3VudCsrOworCQlicmVhazsKKwljYXNlIFJFQ1ZfU05STV9DTUQ6CisJCUlSREFfREVCVUcoNCwgIiVzKCksIFNOUk0gYmF0dGxlIVxuIiwgX19GVU5DVElPTl9fKTsKKworCQlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwkJSVJEQV9BU1NFUlQoaW5mbyAhPSBOVUxMLCByZXR1cm4gMDspOworCisJCS8qCisJCSAqICBUaGUgZGV2aWNlIHdpdGggdGhlIGxhcmdlc3QgZGV2aWNlIGFkZHJlc3Mgd2lucyB0aGUgYmF0dGxlCisJCSAqICAoYm90aCBoYXZlIHNlbnQgYSBTTlJNIGNvbW1hbmQhKQorCQkgKi8KKwkJaWYgKGluZm8gJiYoaW5mby0+ZGFkZHIgPiBzZWxmLT5zYWRkcikpIHsKKwkJCWRlbF90aW1lcigmc2VsZi0+ZmluYWxfdGltZXIpOworCQkJaXJsYXBfaW5pdGlhdGVfY29ubmVjdGlvbl9zdGF0ZShzZWxmKTsKKworCQkJSVJEQV9BU1NFUlQoc2VsZi0+bmV0ZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3Qgc25ybV9mcmFtZSkpOworCisJCQlpcmxhcF9xb3NfbmVnb3RpYXRlKHNlbGYsIHNrYik7CisKKwkJCS8qIFNlbmQgVUEgZnJhbWUgYW5kIHRoZW4gY2hhbmdlIGxpbmsgc2V0dGluZ3MgKi8KKwkJCWlybGFwX2FwcGx5X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzZWxmLCBGQUxTRSk7CisJCQlpcmxhcF9zZW5kX3VhX3Jlc3BvbnNlX2ZyYW1lKHNlbGYsICZzZWxmLT5xb3NfcngpOworCisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUyk7CisJCQlpcmxhcF9jb25uZWN0X2NvbmZpcm0oc2VsZiwgc2tiKTsKKworCQkJLyoKKwkJCSAqICBUaGUgV0QtdGltZXIgY291bGQgYmUgc2V0IHRvIHRoZSBkdXJhdGlvbiBvZiB0aGUKKwkJCSAqICBQLXRpbWVyIGZvciB0aGlzIGNhc2UsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZAorCQkJICogIHRvIHVzZSB0d2ljZSB0aGUgdmFsdWUgKG5vdGUgMyBJckxBUCBwLiA2MCkuCisJCQkgKi8KKwkJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsIHNlbGYtPndkX3RpbWVvdXQpOworCQl9IGVsc2UgeworCQkJLyogV2UganVzdCBpZ25vcmUgdGhlIG90aGVyIGRldmljZSEgKi8KKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1NFVFVQKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFQ1ZfVUFfUlNQOgorCQkvKiBTdG9wIEYtdGltZXIgKi8KKwkJZGVsX3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisKKwkJLyogSW5pdGlhdGUgY29ubmVjdGlvbiBzdGF0ZSAqLworCQlpcmxhcF9pbml0aWF0ZV9jb25uZWN0aW9uX3N0YXRlKHNlbGYpOworCisJCS8qIE5lZ290aWF0ZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgKi8KKwkJSVJEQV9BU1NFUlQoc2tiLT5sZW4gPiAxMCwgcmV0dXJuIC0xOyk7CisKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHVhX2ZyYW1lKSk7CisKKwkJSVJEQV9BU1NFUlQoc2VsZi0+bmV0ZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJCWlybGFwX3Fvc19uZWdvdGlhdGUoc2VsZiwgc2tiKTsKKworCQkvKiBTZXQgdGhlIG5ldyBsaW5rIHNldHRpbmcgKm5vdyogKGJlZm9yZSB0aGUgcnIgZnJhbWUpICovCisJCWlybGFwX2FwcGx5X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzZWxmLCBUUlVFKTsKKwkJc2VsZi0+cmV0cnlfY291bnQgPSAwOworCisJCS8qIFdhaXQgZm9yIHR1cm5hcm91bmQgdGltZSB0byBnaXZlIGEgY2hhbmNlIHRvIHRoZSBvdGhlcgorCQkgKiBkZXZpY2UgdG8gYmUgcmVhZHkgdG8gcmVjZWl2ZSB1cy4KKwkJICogTm90ZSA6IHRoZSB0aW1lIHRvIHN3aXRjaCBzcGVlZCBpcyB0eXBpY2FsbHkgbGFyZ2VyCisJCSAqIHRoYW4gdGhlIHR1cm5hcm91bmQgdGltZSwgYnV0IGFzIHdlIGRvbid0IGhhdmUgdGhlIG90aGVyCisJCSAqIHNpZGUgc3BlZWQgc3dpdGNoIHRpbWUsIHRoYXQncyBvdXIgYmVzdCBndWVzcy4uLgorCQkgKiBKZWFuIElJICovCisJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCisJCS8qIFRoaXMgZnJhbWUgd2lsbCBhY3R1YWxseSBiZSBzZW50IGF0IHRoZSBuZXcgc3BlZWQgKi8KKwkJaXJsYXBfc2VuZF9ycl9mcmFtZShzZWxmLCBDTURfRlJBTUUpOworCisJCS8qIFRoZSB0aW1lciBpcyBzZXQgdG8gaGFsZiB0aGUgbm9ybWFsIHRpbWVyIHRvIHF1aWNrbHkKKwkJICogZGV0ZWN0IGEgZmFpbHVyZSB0byBuZWdvY2lhdGUgdGhlIG5ldyBjb25uZWN0aW9uCisJCSAqIHBhcmFtZXRlcnMuIElyTEFQIDYuMTEuMy4yLCBub3RlIDMuCisJCSAqIE5vdGUgdGhhdCBjdXJyZW50bHkgd2UgZG9uJ3QgcHJvY2VzcyB0aGlzIGZhaWx1cmUKKwkJICogcHJvcGVybHksIGFzIHdlIHNob3VsZCBkbyBhIHF1aWNrIGRpc2Nvbm5lY3QuCisJCSAqIEplYW4gSUkgKi8KKwkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgc2VsZi0+ZmluYWxfdGltZW91dC8yKTsKKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1ApOworCisJCWlybGFwX2Nvbm5lY3RfY29uZmlybShzZWxmLCBza2IpOworCQlicmVhazsKKwljYXNlIFJFQ1ZfRE1fUlNQOiAgICAgLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIFJFQ1ZfRElTQ19DTUQ6CisJCWRlbF90aW1lcigmc2VsZi0+ZmluYWxfdGltZXIpOworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCisJCWlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBMQVBfRElTQ19JTkRJQ0FUSU9OKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5rbm93biBldmVudCAlZCwgJXNcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgIGV2ZW50LCBpcmxhcF9ldmVudFtldmVudF0pOworCisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3N0YXRlX29mZmxpbmUgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgT0ZGTElORSBzdGF0ZSwgbm90IHVzZWQgZm9yIG5vdyEKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfb2ZmbGluZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCUlSREFfREVCVUcoIDAsICIlcygpLCBVbmtub3duIGV2ZW50XG4iLCBfX0ZVTkNUSU9OX18pOworCisJcmV0dXJuIC0xOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc3RhdGVfeG1pdF9wIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFhNSVQsIE9ubHkgdGhlIHByaW1hcnkgc3RhdGlvbiBoYXMgcmlnaHQgdG8gdHJhbnNtaXQsIGFuZCB3ZQorICogICAgdGhlcmVmb3JlIGRvIG5vdCBleHBlY3QgdG8gcmVjZWl2ZSBhbnkgdHJhbnNtaXNzaW9ucyBmcm9tIG90aGVyCisgKiAgICBzdGF0aW9ucy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfeG1pdF9wKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNFTkRfSV9DTUQ6CisJCS8qCisJCSAqICBPbmx5IHNlbmQgZnJhbWUgaWYgc2VuZC13aW5kb3cgPiAwLgorCQkgKi8KKwkJaWYgKChzZWxmLT53aW5kb3cgPiAwKSAmJiAoIXNlbGYtPnJlbW90ZV9idXN5KSkgeworCQkJaW50IG5leHRmaXQ7CisjaWZkZWYgQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cKKwkJCXN0cnVjdCBza19idWZmICpza2JfbmV4dDsKKworCQkJLyogV2l0aCBEWU5BTUlDX1dJTkRPVywgd2Uga2VlcCB0aGUgd2luZG93IHNpemUKKwkJCSAqIG1heGltdW0sIGFuZCBhZGFwdCBvbiB0aGUgcGFja2V0cyB3ZSBhcmUgc2VuZGluZy4KKwkJCSAqIEF0IDExNWssIHdlIGNhbiBzZW5kIG9ubHkgMiBwYWNrZXRzIG9mIDIwNDggYnl0ZXMKKwkJCSAqIGluIGEgNTAwIG1zIHR1cm5hcm91bmQuIFdpdGhvdXQgdGhpcyBvcHRpb24sIHdlCisJCQkgKiB3b3VsZCBhbHdheXMgbGltaXQgdGhlIHdpbmRvdyB0byAyLiBXaXRoIHRoaXMKKwkJCSAqIG9wdGlvbiwgaWYgd2Ugc2VuZCBzbWFsbGVyIHBhY2tldHMsIHdlIGNhbiBzZW5kCisJCQkgKiB1cCB0byA3IG9mIHRoZW0gKGFsd2F5cyBkZXBlbmRpbmcgb24gUW9TKS4KKwkJCSAqIEplYW4gSUkgKi8KKworCQkJLyogTG9vayBhdCB0aGUgbmV4dCBza2IuIFRoaXMgaXMgc2FmZSwgYXMgd2UgYXJlCisJCQkgKiB0aGUgb25seSBjb25zdW1lciBvZiB0aGUgVHggcXVldWUgKGlmIHdlIGFyZSBub3QsCisJCQkgKiB3ZSBoYXZlIG90aGVyIHByb2JsZW1zKSAtIEplYW4gSUkgKi8KKwkJCXNrYl9uZXh0ID0gc2tiX3BlZWsoJnNlbGYtPnR4cSk7CisKKwkJCS8qIENoZWNrIGlmIGEgc3Vic2VxdWVudCBza2IgZXhpc3QgYW5kIHdvdWxkIGZpdCBpbgorCQkJICogdGhlIGN1cnJlbnQgd2luZG93ICh3aXRoIHJlc3BlY3QgdG8gdHVybmFyb3VuZAorCQkJICogdGltZSkuCisJCQkgKiBUaGlzIGFsbG93IHVzIHRvIHByb3Blcmx5IG1hcmsgdGhlIGN1cnJlbnQgcGFja2V0CisJCQkgKiB3aXRoIHRoZSBwZiBiaXQsIHRvIGF2b2lkIGZhbGxpbmcgYmFjayBvbiB0aGUKKwkJCSAqIHNlY29uZCB0ZXN0IGJlbG93LCBhbmQgYXZvaWQgd2FpdGluZyB0aGUKKwkJCSAqIGVuZCBvZiB0aGUgd2luZG93IGFuZCBzZW5kaW5nIGEgZXh0cmEgUlIuCisJCQkgKiBOb3RlIDogKHNrYl9uZXh0ICE9IE5VTEwpIDw9PiAoc2tiX3F1ZXVlX2xlbigpID4gMCkKKwkJCSAqIEplYW4gSUkgKi8KKwkJCW5leHRmaXQgPSAoKHNrYl9uZXh0ICE9IE5VTEwpICYmCisJCQkJICAgKChza2JfbmV4dC0+bGVuICsgc2tiLT5sZW4pIDw9CisJCQkJICAgIHNlbGYtPmJ5dGVzX2xlZnQpKTsKKworCQkJLyoKKwkJCSAqIFRoZSBjdXJyZW50IHBhY2tldCBtYXkgbm90IGZpdCAhIEJlY2F1c2Ugb2YgdGVzdAorCQkJICogYWJvdmUsIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gYW55IG1vcmUgISEhCisJCQkgKiAgVGVzdCBpZiB3ZSBoYXZlIHRyYW5zbWl0dGVkIG1vcmUgYnl0ZXMgb3ZlciB0aGUKKwkJCSAqICBsaW5rIHRoYW4gaXRzIHBvc3NpYmxlIHRvIGRvIHdpdGggdGhlIGN1cnJlbnQKKwkJCSAqICBzcGVlZCBhbmQgdHVybi1hcm91bmQtdGltZS4KKwkJCSAqLworCQkJaWYoKCFuZXh0Zml0KSAmJiAoc2tiLT5sZW4gPiBzZWxmLT5ieXRlc19sZWZ0KSkgeworCQkJCUlSREFfREVCVUcoMCwgIiVzKCksIE5vdCBhbGxvd2VkIHRvIHRyYW5zbWl0IgorCQkJCQkgICAiIG1vcmUgYnl0ZXMhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCS8qIFJlcXVldWUgdGhlIHNrYiAqLworCQkJCXNrYl9xdWV1ZV9oZWFkKCZzZWxmLT50eHEsIHNrYl9nZXQoc2tiKSk7CisJCQkJLyoKKwkJCQkgKiAgV2Ugc2hvdWxkIHN3aXRjaCBzdGF0ZSB0byBMQVBfTlJNX1AsIGJ1dAorCQkJCSAqICB0aGF0IGlzIG5vdCBwb3NzaWJsZSBzaW5jZSB3ZSBtdXN0IGJlIHN1cmUKKwkJCQkgKiAgdGhhdCB3ZSBwb2xsIHRoZSBvdGhlciBzaWRlLiBTaW5jZSB3ZSBoYXZlCisJCQkJICogIHVzZWQgdXAgb3VyIHRpbWUsIHRoZSBwb2xsIHRpbWVyIHNob3VsZAorCQkJCSAqICB0cmlnZ2VyIGFueXdheSBub3csIHNvIHdlIGp1c3Qgd2FpdCBmb3IgaXQKKwkJCQkgKiAgREIKKwkJCQkgKi8KKwkJCQkvKgorCQkJCSAqIFNvcnJ5LCBidXQgdGhhdCdzIG5vdCB0b3RhbGx5IHRydWUuIElmCisJCQkJICogd2Ugc2VuZCAyMDAwQiBwYWNrZXRzLCB3ZSBtYXkgd2FpdCBhbm90aGVyCisJCQkJICogMTAwMEIgdW50aWwgb3VyIHR1cm5hcm91bmQgZXhwaXJlLiBUaGF0J3MKKwkJCQkgKiB3aHkgd2UgbmVlZCB0byBiZSBwcm9hY3RpdmUgaW4gYXZvaWRpbmcKKwkJCQkgKiBjb21pbmcgaGVyZS4gLSBKZWFuIElJCisJCQkJICovCisJCQkJcmV0dXJuIC1FUFJPVE87CisJCQl9CisKKwkJCS8qIFN1YnN0cmFjdCBzcGFjZSB1c2VkIGJ5IHRoaXMgc2tiICovCisJCQlzZWxmLT5ieXRlc19sZWZ0IC09IHNrYi0+bGVuOworI2Vsc2UJLyogQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cgKi8KKwkJCS8qIFdpbmRvdyBoYXMgYmVlbiBhZGp1c3RlZCBmb3IgdGhlIG1heCBwYWNrZXQKKwkJCSAqIHNpemUsIHNvIG11Y2ggc2ltcGxlci4uLiAtIEplYW4gSUkgKi8KKwkJCW5leHRmaXQgPSAoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSA+IDApOworI2VuZGlmCS8qIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XICovCisJCQkvKgorCQkJICogIFNlbmQgZGF0YSB3aXRoIHBvbGwgYml0IGNsZWFyZWQgb25seSBpZiB3aW5kb3cgPiAxCisJCQkgKiAgYW5kIHRoZXJlIGlzIG1vcmUgZnJhbWVzIGFmdGVyIHRoaXMgb25lIHRvIGJlIHNlbnQKKwkJCSAqLworCQkJaWYgKChzZWxmLT53aW5kb3cgPiAxKSAmJiAobmV4dGZpdCkpIHsKKwkJCQkvKiBNb3JlIHBhY2tldCB0byBzZW5kIGluIGN1cnJlbnQgd2luZG93ICovCisJCQkJaXJsYXBfc2VuZF9kYXRhX3ByaW1hcnkoc2VsZiwgc2tiKTsKKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9YTUlUX1ApOworCQkJfSBlbHNlIHsKKwkJCQkvKiBGaW5hbCBwYWNrZXQgb2Ygd2luZG93ICovCisJCQkJaXJsYXBfc2VuZF9kYXRhX3ByaW1hcnlfcG9sbChzZWxmLCBza2IpOworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9QKTsKKworCQkJCS8qCisJCQkJICogTWFrZSBzdXJlIHN0YXRlIG1hY2hpbmUgZG9lcyBub3QgdHJ5IHRvIHNlbmQKKwkJCQkgKiBhbnkgbW9yZSBmcmFtZXMKKwkJCQkgKi8KKwkJCQlyZXQgPSAtRVBST1RPOworCQkJfQorI2lmZGVmIENPTkZJR19JUkRBX0ZBU1RfUlIKKwkJCS8qIFBlZXIgbWF5IHdhbnQgdG8gcmVwbHkgaW1tZWRpYXRlbHkgKi8KKwkJCXNlbGYtPmZhc3RfUlIgPSBGQUxTRTsKKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9GQVNUX1JSICovCisJCX0gZWxzZSB7CisJCQlJUkRBX0RFQlVHKDQsICIlcygpLCBVbmFibGUgdG8gc2VuZCEgcmVtb3RlIGJ1c3k/XG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlza2JfcXVldWVfaGVhZCgmc2VsZi0+dHhxLCBza2JfZ2V0KHNrYikpOworCisJCQkvKgorCQkJICogIFRoZSBuZXh0IHJldCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXQgdGVsbHMKKwkJCSAqICBpcmxhcF9uZXh0X3N0YXRlIF9ub3RfIHRvIGRlbGl2ZXIgbW9yZSBmcmFtZXMKKwkJCSAqLworCQkJcmV0ID0gLUVQUk9UTzsKKwkJfQorCQlicmVhazsKKwljYXNlIFBPTExfVElNRVJfRVhQSVJFRDoKKwkJSVJEQV9ERUJVRygzLCAiJXMoKSwgUE9MTF9USU1FUl9FWFBJUkVEIDwlbGQ+XG4iLAorCQkJICAgIF9fRlVOQ1RJT05fXywgamlmZmllcyk7CisJCWlybGFwX3NlbmRfcnJfZnJhbWUoc2VsZiwgQ01EX0ZSQU1FKTsKKwkJLyogUmV0dXJuIHRvIE5STSBwcm9wZXJseSAtIEplYW4gSUkgICovCisJCXNlbGYtPndpbmRvdyA9IHNlbGYtPndpbmRvd19zaXplOworI2lmZGVmIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XCisJCS8qIEFsbG93ZWQgdG8gdHJhbnNtaXQgYSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBhZ2Fpbi4gKi8KKwkJc2VsZi0+Ynl0ZXNfbGVmdCA9IHNlbGYtPmxpbmVfY2FwYWNpdHk7CisjZW5kaWYgLyogQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cgKi8KKwkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgc2VsZi0+ZmluYWxfdGltZW91dCk7CisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9QKTsKKwkJYnJlYWs7CisJY2FzZSBESVNDT05ORUNUX1JFUVVFU1Q6CisJCWRlbF90aW1lcigmc2VsZi0+cG9sbF90aW1lcik7CisJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQlpcmxhcF9zZW5kX2Rpc2NfZnJhbWUoc2VsZik7CisJCWlybGFwX2ZsdXNoX2FsbF9xdWV1ZXMoc2VsZik7CisJCWlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHNlbGYsIHNlbGYtPmZpbmFsX3RpbWVvdXQpOworCQlzZWxmLT5yZXRyeV9jb3VudCA9IDA7CisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1BDTE9TRSk7CisJCWJyZWFrOworCWNhc2UgREFUQV9SRVFVRVNUOgorCQkvKiBOb3RoaW5nIHRvIGRvLCBpcmxhcF9kb19ldmVudCgpIHdpbGwgc2VuZCB0aGUgcGFja2V0CisJCSAqIHdoZW4gd2UgcmV0dXJuLi4uIC0gSmVhbiBJSSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVzXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBpcmxhcF9ldmVudFtldmVudF0pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc3RhdGVfcGNsb3NlIChldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFBDTE9TRSBzdGF0ZQorICovCitzdGF0aWMgaW50IGlybGFwX3N0YXRlX3BjbG9zZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUkVDVl9VQV9SU1A6IC8qIEZBTExUSFJPVUdIICovCisJY2FzZSBSRUNWX0RNX1JTUDoKKwkJZGVsX3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisKKwkJLyogU2V0IG5ldyBsaW5rIHBhcmFtZXRlcnMgKi8KKwkJaXJsYXBfYXBwbHlfZGVmYXVsdF9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc2VsZik7CisKKwkJLyogQWx3YXlzIHN3aXRjaCBzdGF0ZSBiZWZvcmUgY2FsbGluZyB1cHBlciBsYXllcnMgKi8KKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTkRNKTsKKworCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX0RJU0NfSU5ESUNBVElPTik7CisJCWJyZWFrOworCWNhc2UgRklOQUxfVElNRVJfRVhQSVJFRDoKKwkJaWYgKHNlbGYtPnJldHJ5X2NvdW50IDwgc2VsZi0+TjMpIHsKKwkJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQkJaXJsYXBfc2VuZF9kaXNjX2ZyYW1lKHNlbGYpOworCQkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgc2VsZi0+ZmluYWxfdGltZW91dCk7CisJCQlzZWxmLT5yZXRyeV9jb3VudCsrOworCQkJLyogS2VlcCBzdGF0ZSAqLworCQl9IGVsc2UgeworCQkJaXJsYXBfYXBwbHlfZGVmYXVsdF9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc2VsZik7CisKKwkJCS8qICBBbHdheXMgc3dpdGNoIHN0YXRlIGJlZm9yZSBjYWxsaW5nIHVwcGVyIGxheWVycyAqLworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTkRNKTsKKworCQkJaXJsYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExBUF9OT19SRVNQT05TRSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fLCBldmVudCk7CisKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc3RhdGVfbnJtX3AgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICBOUk1fUCAoTm9ybWFsIFJlc3BvbnNlIE1vZGUgYXMgUHJpbWFyeSksIFRoZSBwcmltYXJ5IHN0YXRpb24gaGFzIGdpdmVuCisgKiAgIHBlcm1pc3Npb25zIHRvIGEgc2Vjb25kYXJ5IHN0YXRpb24gdG8gdHJhbnNtaXQgSXJMQVAgcmVzb25zZSBmcmFtZXMKKyAqICAgKGJ5IHNlbmRpbmcgYSBmcmFtZSB3aXRoIHRoZSBQIGJpdCBzZXQpLiBUaGUgcHJpbWFyeSBzdGF0aW9uIHdpbGwgbm90CisgKiAgIHRyYW5zbWl0IGFueSBmcmFtZXMgYW5kIGlzIGV4cGVjdGluZyB0byByZWNlaXZlIGZyYW1lcyBvbmx5IGZyb20gdGhlCisgKiAgIHNlY29uZGFyeSB0byB3aGljaCB0cmFuc21pc3Npb24gcGVybWlzc2lvbnMgaGFzIGJlZW4gZ2l2ZW4uCisgKi8KK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfbnJtX3Aoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisJaW50IG5zX3N0YXR1czsKKwlpbnQgbnJfc3RhdHVzOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUkVDVl9JX1JTUDogLyogT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSAqLworCQkvKiBGSVhNRTogbXVzdCBjaGVjayBmb3IgcmVtb3RlX2J1c3kgYmVsb3cgKi8KKyNpZmRlZiBDT05GSUdfSVJEQV9GQVNUX1JSCisJCS8qCisJCSAqICBSZXNldCB0aGUgZmFzdF9SUiBzbyB3ZSBjYW4gdXNlIHRoZSBmYXN0IFJSIGNvZGUgd2l0aAorCQkgKiAgZnVsbCBzcGVlZCB0aGUgbmV4dCB0aW1lIHNpbmNlIHBlZXIgbWF5IGhhdmUgbW9yZSBmcmFtZXMKKwkJICogIHRvIHRyYW5zbWl0dAorCQkgKi8KKwkJc2VsZi0+ZmFzdF9SUiA9IEZBTFNFOworI2VuZGlmIC8qIENPTkZJR19JUkRBX0ZBU1RfUlIgKi8KKwkJSVJEQV9BU1NFUlQoIGluZm8gIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkJbnNfc3RhdHVzID0gaXJsYXBfdmFsaWRhdGVfbnNfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnMpOworCQlucl9zdGF0dXMgPSBpcmxhcF92YWxpZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisKKwkJLyoKKwkJICogIENoZWNrIGZvciBleHBlY3RlZCBJKG5mb3JtYXRpb24pIGZyYW1lCisJCSAqLworCQlpZiAoKG5zX3N0YXR1cyA9PSBOU19FWFBFQ1RFRCkgJiYgKG5yX3N0YXR1cyA9PSBOUl9FWFBFQ1RFRCkpIHsKKworCQkJLyogVXBkYXRlIFZyIChuZXh0IGZyYW1lIGZvciB1cyB0byByZWNlaXZlKSAqLworCQkJc2VsZi0+dnIgPSAoc2VsZi0+dnIgKyAxKSAlIDg7CisKKwkJCS8qIFVwZGF0ZSBOciByZWNlaXZlZCwgY2xlYW51cCBvdXIgcmV0cnkgcXVldWUgKi8KKwkJCWlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisKKwkJCS8qCisJCQkgKiAgR290IGV4cGVjdGVkIE5SLCBzbyByZXNldCB0aGUKKwkJCSAqICByZXRyeV9jb3VudC4gVGhpcyBpcyBub3QgZG9uZSBieSBJckxBUCBzcGVjLAorCQkJICogIHdoaWNoIGlzIHN0cmFuZ2UhCisJCQkgKi8KKwkJCXNlbGYtPnJldHJ5X2NvdW50ID0gMDsKKwkJCXNlbGYtPmFja19yZXF1aXJlZCA9IFRSVUU7CisKKwkJCS8qICBwb2xsIGJpdCBjbGVhcmVkPyAgKi8KKwkJCWlmICghaW5mby0+cGYpIHsKKwkJCQkvKiBLZWVwIHN0YXRlLCBkbyBub3QgbW92ZSB0aGlzIGxpbmUgKi8KKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUCk7CisKKwkJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBGQUxTRSk7CisJCQl9IGVsc2UgeworCQkJCS8qIE5vIGxvbmdlciB3YWl0aW5nIGZvciBwZiAqLworCQkJCWRlbF90aW1lcigmc2VsZi0+ZmluYWxfdGltZXIpOworCisJCQkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisKKwkJCQkvKiBDYWxsIGhpZ2hlciBsYXllciAqYmVmb3JlKiBjaGFuZ2luZyBzdGF0ZQorCQkJCSAqIHRvIGdpdmUgdGhlbSBhIGNoYW5jZSB0byBzZW5kIGRhdGEgaW4gdGhlCisJCQkJICogbmV4dCBMQVAgZnJhbWUuCisJCQkJICogSmVhbiBJSSAqLworCQkJCWlybGFwX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IsIEZBTFNFKTsKKworCQkJCS8qIFhNSVQgc3RhdGVzIGFyZSB0aGUgbW9zdCBkYW5nZXJvdXMgc3RhdGUKKwkJCQkgKiB0byBiZSBpbiwgYmVjYXVzZSB1c2VyIHJlcXVlc3RzIGFyZQorCQkJCSAqIHByb2Nlc3NlZCBkaXJlY3RseSBhbmQgbWF5IGNoYW5nZSBzdGF0ZS4KKwkJCQkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaW4gTkRNX1AsIHRob3NlCisJCQkJICogcmVxdWVzdHMgYXJlIHF1ZXVlZCBhbmQgd2Ugd2lsbCBwcm9jZXNzCisJCQkJICogdGhlbSB3aGVuIHdlIHJldHVybiB0byBpcmxhcF9kb19ldmVudCgpLgorCQkJCSAqIEplYW4gSUkKKwkJCQkgKi8KKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9YTUlUX1ApOworCisJCQkJLyogVGhpcyBpcyB0aGUgbGFzdCBmcmFtZS4KKwkJCQkgKiBNYWtlIHN1cmUgaXQncyBhbHdheXMgY2FsbGVkIGluIFhNSVQgc3RhdGUuCisJCQkJICogLSBKZWFuIElJICovCisJCQkJaXJsYXBfc3RhcnRfcG9sbF90aW1lcihzZWxmLCBzZWxmLT5wb2xsX3RpbWVvdXQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJfQorCQkvKiBVbmV4cGVjdGVkIG5leHQgdG8gc2VuZCAoTnMpICovCisJCWlmICgobnNfc3RhdHVzID09IE5TX1VORVhQRUNURUQpICYmIChucl9zdGF0dXMgPT0gTlJfRVhQRUNURUQpKQorCQl7CisJCQlpZiAoIWluZm8tPnBmKSB7CisJCQkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKworCQkJCS8qCisJCQkJICogIFdhaXQgdW50aWwgdGhlIGxhc3QgZnJhbWUgYmVmb3JlIGRvaW5nCisJCQkJICogIGFueXRoaW5nCisJCQkJICovCisKKwkJCQkvKiBLZWVwIHN0YXRlICovCisJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1ApOworCQkJfSBlbHNlIHsKKwkJCQlJUkRBX0RFQlVHKDQsCisJCQkJICAgICAgICIlcygpLCBtaXNzaW5nIG9yIGR1cGxpY2F0ZSBmcmFtZSFcbiIsCisJCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisKKwkJCQkvKiBVcGRhdGUgTnIgcmVjZWl2ZWQgKi8KKwkJCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCisJCQkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisJCQkJaXJsYXBfc2VuZF9ycl9mcmFtZShzZWxmLCBDTURfRlJBTUUpOworCisJCQkJc2VsZi0+YWNrX3JlcXVpcmVkID0gRkFMU0U7CisKKwkJCQlpcmxhcF9zdGFydF9maW5hbF90aW1lcihzZWxmLCBzZWxmLT5maW5hbF90aW1lb3V0KTsKKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiAgVW5leHBlY3RlZCBuZXh0IHRvIHJlY2VpdmUgKE5yKQorCQkgKi8KKwkJaWYgKChuc19zdGF0dXMgPT0gTlNfRVhQRUNURUQpICYmIChucl9zdGF0dXMgPT0gTlJfVU5FWFBFQ1RFRCkpCisJCXsKKwkJCWlmIChpbmZvLT5wZikgeworCQkJCXNlbGYtPnZyID0gKHNlbGYtPnZyICsgMSkgJSA4OworCisJCQkJLyogVXBkYXRlIE5yIHJlY2VpdmVkICovCisJCQkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKworCQkJCS8qIFJlc2VuZCByZWplY3RlZCBmcmFtZXMgKi8KKwkJCQlpcmxhcF9yZXNlbmRfcmVqZWN0ZWRfZnJhbWVzKHNlbGYsIENNRF9GUkFNRSk7CisKKwkJCQlzZWxmLT5hY2tfcmVxdWlyZWQgPSBGQUxTRTsKKworCQkJCS8qIE1ha2Ugc3VyZSB3ZSBhY2NvdW50IGZvciB0aGUgdGltZQorCQkJCSAqIHRvIHRyYW5zbWl0IG91ciBmcmFtZXMuIFNlZSBjb21lbW50cworCQkJCSAqIGluIGlybGFwX3NlbmRfZGF0YV9wcmltYXJ5X3BvbGwoKS4KKwkJCQkgKiBKZWFuIElJICovCisJCQkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgMiAqIHNlbGYtPmZpbmFsX3RpbWVvdXQpOworCisJCQkJLyogS2VlcCBzdGF0ZSwgZG8gbm90IG1vdmUgdGhpcyBsaW5lICovCisJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1ApOworCisJCQkJaXJsYXBfZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYiwgRkFMU0UpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqICBEbyBub3QgcmVzZW5kIGZyYW1lcyB1bnRpbCB0aGUgbGFzdAorCQkJCSAqICBmcmFtZSBoYXMgYXJyaXZlZCBmcm9tIHRoZSBvdGhlcgorCQkJCSAqICBkZXZpY2UuIFRoaXMgaXMgbm90IGRvY3VtZW50ZWQgaW4KKwkJCQkgKiAgSXJMQVAhIQorCQkJCSAqLworCQkJCXNlbGYtPnZyID0gKHNlbGYtPnZyICsgMSkgJSA4OworCisJCQkJLyogVXBkYXRlIE5yIHJlY2VpdmVkICovCisJCQkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKworCQkJCXNlbGYtPmFja19yZXF1aXJlZCA9IEZBTFNFOworCisJCQkJLyogS2VlcCBzdGF0ZSwgZG8gbm90IG1vdmUgdGhpcyBsaW5lISovCisJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1ApOworCisJCQkJaXJsYXBfZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYiwgRkFMU0UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICogIFVuZXhwZWN0ZWQgbmV4dCB0byBzZW5kIChOcykgYW5kIG5leHQgdG8gcmVjZWl2ZSAoTnIpCisJCSAqICBOb3QgZG9jdW1lbnRlZCBieSBJckxBUCEKKwkJICovCisJCWlmICgobnNfc3RhdHVzID09IE5TX1VORVhQRUNURUQpICYmCisJCSAgICAobnJfc3RhdHVzID09IE5SX1VORVhQRUNURUQpKQorCQl7CisJCQlJUkRBX0RFQlVHKDQsICIlcygpLCB1bmV4cGVjdGVkIG5yIGFuZCBucyFcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCWlmIChpbmZvLT5wZikgeworCQkJCS8qIFJlc2VuZCByZWplY3RlZCBmcmFtZXMgKi8KKwkJCQlpcmxhcF9yZXNlbmRfcmVqZWN0ZWRfZnJhbWVzKHNlbGYsIENNRF9GUkFNRSk7CisKKwkJCQkvKiBHaXZlIHBlZXIgc29tZSB0aW1lIHRvIHJldHJhbnNtaXQhIAorCQkJCSAqIEJ1dCBhY2NvdW50IGZvciBvdXIgb3duIFR4LiAqLworCQkJCWlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHNlbGYsIDIgKiBzZWxmLT5maW5hbF90aW1lb3V0KTsKKworCQkJCS8qIEtlZXAgc3RhdGUsIGRvIG5vdCBtb3ZlIHRoaXMgbGluZSAqLworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9QKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVXBkYXRlIE5yIHJlY2VpdmVkICovCisJCQkJLyogaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKCBpbmZvLT5ucik7ICovCisKKwkJCQlzZWxmLT5hY2tfcmVxdWlyZWQgPSBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogIEludmFsaWQgTlIgb3IgTlMKKwkJICovCisJCWlmICgobnJfc3RhdHVzID09IE5SX0lOVkFMSUQpIHx8IChuc19zdGF0dXMgPT0gTlNfSU5WQUxJRCkpIHsKKwkJCWlmIChpbmZvLT5wZikgeworCQkJCWRlbF90aW1lcigmc2VsZi0+ZmluYWxfdGltZXIpOworCisJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfUkVTRVRfV0FJVCk7CisKKwkJCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX1JFU0VUX0lORElDQVRJT04pOworCQkJCXNlbGYtPnhtaXRmbGFnID0gVFJVRTsKKwkJCX0gZWxzZSB7CisJCQkJZGVsX3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisKKwkJCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX1JFU0VUX0lORElDQVRJT04pOworCisJCQkJc2VsZi0+eG1pdGZsYWcgPSBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCUlSREFfREVCVUcoMSwgIiVzKCksIE5vdCBpbXBsZW1lbnRlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIGV2ZW50PSVzLCBuc19zdGF0dXM9JWQsIG5yX3N0YXR1cz0lZFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJsYXBfZXZlbnRbZXZlbnRdLCBuc19zdGF0dXMsIG5yX3N0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgUkVDVl9VSV9GUkFNRToKKwkJLyogUG9sbCBiaXQgY2xlYXJlZD8gKi8KKwkJaWYgKCFpbmZvLT5wZikgeworCQkJaXJsYXBfZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYiwgVFJVRSk7CisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUCk7CisJCX0gZWxzZSB7CisJCQlkZWxfdGltZXIoJnNlbGYtPmZpbmFsX3RpbWVyKTsKKwkJCWlybGFwX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IsIFRSVUUpOworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfWE1JVF9QKTsKKwkJCUlSREFfREVCVUcoMSwgIiVzOiBSRUNWX1VJX0ZSQU1FOiBuZXh0IHN0YXRlICVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybGFwX3N0YXRlW3NlbGYtPnN0YXRlXSk7CisJCQlpcmxhcF9zdGFydF9wb2xsX3RpbWVyKHNlbGYsIHNlbGYtPnBvbGxfdGltZW91dCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSRUNWX1JSX1JTUDoKKwkJLyoKKwkJICogIElmIHlvdSBnZXQgYSBSUiwgdGhlIHJlbW90ZSBpc24ndCBidXN5IGFueW1vcmUsCisJCSAqICBubyBtYXR0ZXIgd2hhdCB0aGUgTlIKKwkJICovCisJCXNlbGYtPnJlbW90ZV9idXN5ID0gRkFMU0U7CisKKwkJLyoKKwkJICogIE5yIGFzIGV4cGVjdGVkPworCQkgKi8KKwkJcmV0ID0gaXJsYXBfdmFsaWRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCQlpZiAocmV0ID09IE5SX0VYUEVDVEVEKSB7CisJCQkvKiBTdG9wIGZpbmFsIHRpbWVyICovCisJCQlkZWxfdGltZXIoJnNlbGYtPmZpbmFsX3RpbWVyKTsKKworCQkJLyogVXBkYXRlIE5yIHJlY2VpdmVkICovCisJCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCisJCQkvKgorCQkJICogIEdvdCBleHBlY3RlZCBOUiwgc28gcmVzZXQgdGhlIHJldHJ5X2NvdW50LiBUaGlzCisJCQkgKiAgaXMgbm90IGRvbmUgYnkgdGhlIElyTEFQIHN0YW5kYXJkICwgd2hpY2ggaXMKKwkJCSAqICBzdHJhbmdlISBEQi4KKwkJCSAqLworCQkJc2VsZi0+cmV0cnlfY291bnQgPSAwOworCQkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisKKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1hNSVRfUCk7CisKKwkJCS8qIFN0YXJ0IHBvbGwgdGltZXIgKi8KKwkJCWlybGFwX3N0YXJ0X3BvbGxfdGltZXIoc2VsZiwgc2VsZi0+cG9sbF90aW1lb3V0KTsKKwkJfSBlbHNlIGlmIChyZXQgPT0gTlJfVU5FWFBFQ1RFRCkgeworCQkJSVJEQV9BU1NFUlQoaW5mbyAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkJCS8qCisJCQkgKiAgVW5leHBlY3RlZCBuciEKKwkJCSAqLworCisJCQkvKiBVcGRhdGUgTnIgcmVjZWl2ZWQgKi8KKwkJCWlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisKKwkJCUlSREFfREVCVUcoNCwgIlJFQ1ZfUlJfRlJBTUU6IFJldHJhbnM6JWQsIG5yPSVkLCB2YT0lZCwgIgorCQkJICAgICAgInZzPSVkLCB2cj0lZFxuIiwKKwkJCSAgICAgIHNlbGYtPnJldHJ5X2NvdW50LCBpbmZvLT5uciwgc2VsZi0+dmEsCisJCQkgICAgICBzZWxmLT52cywgc2VsZi0+dnIpOworCisJCQkvKiBSZXNlbmQgcmVqZWN0ZWQgZnJhbWVzICovCisJCQlpcmxhcF9yZXNlbmRfcmVqZWN0ZWRfZnJhbWVzKHNlbGYsIENNRF9GUkFNRSk7CisKKwkJCS8qIEZpbmFsIHRpbWVyID8/PyBKZWFuIElJICovCisKKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9QKTsKKwkJfSBlbHNlIGlmIChyZXQgPT0gTlJfSU5WQUxJRCkgeworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgUmVjZWl2ZWQgUlIgd2l0aCAiCisJCQkJICAgImludmFsaWQgbnIgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRlbF90aW1lcigmc2VsZi0+ZmluYWxfdGltZXIpOworCisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9SRVNFVF9XQUlUKTsKKworCQkJaXJsYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExBUF9SRVNFVF9JTkRJQ0FUSU9OKTsKKwkJCXNlbGYtPnhtaXRmbGFnID0gVFJVRTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFQ1ZfUk5SX1JTUDoKKwkJSVJEQV9BU1NFUlQoaW5mbyAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCQkvKiBTdG9wIGZpbmFsIHRpbWVyICovCisJCWRlbF90aW1lcigmc2VsZi0+ZmluYWxfdGltZXIpOworCQlzZWxmLT5yZW1vdGVfYnVzeSA9IFRSVUU7CisKKwkJLyogVXBkYXRlIE5yIHJlY2VpdmVkICovCisJCWlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1hNSVRfUCk7CisKKwkJLyogU3RhcnQgcG9sbCB0aW1lciAqLworCQlpcmxhcF9zdGFydF9wb2xsX3RpbWVyKHNlbGYsIHNlbGYtPnBvbGxfdGltZW91dCk7CisJCWJyZWFrOworCWNhc2UgUkVDVl9GUk1SX1JTUDoKKwkJZGVsX3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisJCXNlbGYtPnhtaXRmbGFnID0gVFJVRTsKKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfUkVTRVRfV0FJVCk7CisJCWlybGFwX3Jlc2V0X2luZGljYXRpb24oc2VsZik7CisJCWJyZWFrOworCWNhc2UgRklOQUxfVElNRVJfRVhQSVJFRDoKKwkJLyoKKwkJICogIFdlIGFyZSBhbGxvd2VkIHRvIHdhaXQgZm9yIGFkZGl0aW9uYWwgMzAwIG1zIGlmCisJCSAqICBmaW5hbCB0aW1lciBleHBpcmVzIHdoZW4gd2UgYXJlIGluIHRoZSBtaWRkbGUKKwkJICogIG9mIHJlY2VpdmluZyBhIGZyYW1lIChwYWdlIDQ1LCBJckxBUCkuIENoZWNrIHRoYXQKKwkJICogIHdlIG9ubHkgZG8gdGhpcyBvbmNlIGZvciBlYWNoIGZyYW1lLgorCQkgKi8KKwkJaWYgKGlyZGFfZGV2aWNlX2lzX3JlY2VpdmluZyhzZWxmLT5uZXRkZXYpICYmICFzZWxmLT5hZGRfd2FpdCkgeworCQkJSVJEQV9ERUJVRygxLCAiRklOQUxfVElNRVJfRVhQSVJFRCB3aGVuIHJlY2VpdmluZyBhICIKKwkJCSAgICAgICJmcmFtZSEgV2FpdGluZyBhIGxpdHRsZSBiaXQgbW9yZSFcbiIpOworCQkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgbXNlY3NfdG9famlmZmllcygzMDApKTsKKworCQkJLyoKKwkJCSAqICBEb24ndCBhbGxvdyB0aGlzIHRvIGhhcHBlbiBvbmUgbW9yZSB0aW1lIGluIGEgcm93LAorCQkJICogIG9yIGVsc2Ugd2UgY2FuIGdldCBhIHByZXR0eSB0aWdodCBsb29wIGhlcmUgaWYKKwkJCSAqICBpZiB3ZSBvbmx5IHJlY2VpdmUgaGFsZiBhIGZyYW1lLiBEQi4KKwkJCSAqLworCQkJc2VsZi0+YWRkX3dhaXQgPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKwkJc2VsZi0+YWRkX3dhaXQgPSBGQUxTRTsKKworCQkvKiBOMiBpcyB0aGUgZGlzY29ubmVjdCB0aW1lci4gVW50aWwgd2UgcmVhY2ggaXQsIHdlIHJldHJ5ICovCisJCWlmIChzZWxmLT5yZXRyeV9jb3VudCA8IHNlbGYtPk4yKSB7CisJCQkvKiBSZXRyeSBzZW5kaW5nIHRoZSBwZiBiaXQgdG8gdGhlIHNlY29uZGFyeSAqLworCQkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisJCQlpcmxhcF9zZW5kX3JyX2ZyYW1lKHNlbGYsIENNRF9GUkFNRSk7CisKKwkJCWlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHNlbGYsIHNlbGYtPmZpbmFsX3RpbWVvdXQpOworCQkJc2VsZi0+cmV0cnlfY291bnQrKzsKKwkJCUlSREFfREVCVUcoNCwgImlybGFwX3N0YXRlX25ybV9wOiBGSU5BTF9USU1FUl9FWFBJUkVEOiIKKwkJCQkgICAiIHJldHJ5X2NvdW50PSVkXG4iLCBzZWxmLT5yZXRyeV9jb3VudCk7CisKKwkJCS8qIEVhcmx5IHdhcm5pbmcgZXZlbnQuIEknbSB1c2luZyBhIHByZXR0eSBsaWJlcmFsCisJCQkgKiBpbnRlcnByZXRhdGlvbiBvZiB0aGUgc3BlYyBhbmQgZ2VuZXJhdGUgYW4gZXZlbnQKKwkJCSAqIGV2ZXJ5IHRpbWUgdGhlIHRpbWVyIGlzIG11bHRpcGxlIG9mIE4xIChhbmQgbm90CisJCQkgKiBvbmx5IHRoZSBmaXJzdCB0aW1lKS4gVGhpcyBhbGxvdyBhcHBsaWNhdGlvbgorCQkJICogdG8ga25vdyBwcmVjaXNlbHkgaWYgY29ubmVjdGl2aXR5IHJlc3RhcnQuLi4KKwkJCSAqIEplYW4gSUkgKi8KKwkJCWlmKChzZWxmLT5yZXRyeV9jb3VudCAlIHNlbGYtPk4xKSA9PSAwKQorCQkJCWlybGFwX3N0YXR1c19pbmRpY2F0aW9uKHNlbGYsCisJCQkJCQkJU1RBVFVTX05PX0FDVElWSVRZKTsKKworCQkJLyogS2VlcCBzdGF0ZSAqLworCQl9IGVsc2UgeworCQkJaXJsYXBfYXBwbHlfZGVmYXVsdF9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc2VsZik7CisKKwkJCS8qIEFsd2F5cyBzd2l0Y2ggc3RhdGUgYmVmb3JlIGNhbGxpbmcgdXBwZXIgbGF5ZXJzICovCisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCQkJaXJsYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExBUF9OT19SRVNQT05TRSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSRUNWX1JFSl9SU1A6CisJCWlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisJCWlmIChzZWxmLT5yZW1vdGVfYnVzeSkgeworCQkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisJCQlpcmxhcF9zZW5kX3JyX2ZyYW1lKHNlbGYsIENNRF9GUkFNRSk7CisJCX0gZWxzZQorCQkJaXJsYXBfcmVzZW5kX3JlamVjdGVkX2ZyYW1lcyhzZWxmLCBDTURfRlJBTUUpOworCQlpcmxhcF9zdGFydF9maW5hbF90aW1lcihzZWxmLCAyICogc2VsZi0+ZmluYWxfdGltZW91dCk7CisJCWJyZWFrOworCWNhc2UgUkVDVl9TUkVKX1JTUDoKKwkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKwkJaWYgKHNlbGYtPnJlbW90ZV9idXN5KSB7CisJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJCWlybGFwX3NlbmRfcnJfZnJhbWUoc2VsZiwgQ01EX0ZSQU1FKTsKKwkJfSBlbHNlCisJCQlpcmxhcF9yZXNlbmRfcmVqZWN0ZWRfZnJhbWUoc2VsZiwgQ01EX0ZSQU1FKTsKKwkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgMiAqIHNlbGYtPmZpbmFsX3RpbWVvdXQpOworCQlicmVhazsKKwljYXNlIFJFQ1ZfUkRfUlNQOgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBSRUNWX1JEX1JTUFxuIiwgX19GVU5DVElPTl9fKTsKKworCQlpcmxhcF9mbHVzaF9hbGxfcXVldWVzKHNlbGYpOworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9YTUlUX1ApOworCQkvKiBDYWxsIGJhY2sgdGhlIExBUCBzdGF0ZSBtYWNoaW5lIHRvIGRvIGEgcHJvcGVyIGRpc2Nvbm5lY3QgKi8KKwkJaXJsYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGV2ZW50ICVzXG4iLAorCQkJICAgIF9fRlVOQ1RJT05fXywgaXJsYXBfZXZlbnRbZXZlbnRdKTsKKworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV9yZXNldF93YWl0IChldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFdlIGhhdmUgaW5mb3JtZWQgdGhlIHNlcnZpY2UgdXNlciBvZiBhIHJlc2V0IGNvbmRpdGlvbiwgYW5kIGlzCisgKiAgICBhd2FpdGluZyByZXNldCBvZiBkaXNjb25uZWN0IHJlcXVlc3QuCisgKgorICovCitzdGF0aWMgaW50IGlybGFwX3N0YXRlX3Jlc2V0X3dhaXQoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygzLCAiJXMoKSwgZXZlbnQgPSAlc1xuIiwgX19GVU5DVElPTl9fLCBpcmxhcF9ldmVudFtldmVudF0pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUkVTRVRfUkVRVUVTVDoKKwkJaWYgKHNlbGYtPnhtaXRmbGFnKSB7CisJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJCWlybGFwX3NlbmRfc25ybV9mcmFtZShzZWxmLCBOVUxMKTsKKwkJCWlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHNlbGYsIHNlbGYtPmZpbmFsX3RpbWVvdXQpOworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfUkVTRVQpOworCQl9IGVsc2UgeworCQkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgc2VsZi0+ZmluYWxfdGltZW91dCk7CisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9SRVNFVCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBESVNDT05ORUNUX1JFUVVFU1Q6CisJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKCBzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJaXJsYXBfc2VuZF9kaXNjX2ZyYW1lKCBzZWxmKTsKKwkJaXJsYXBfZmx1c2hfYWxsX3F1ZXVlcyggc2VsZik7CisJCWlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKCBzZWxmLCBzZWxmLT5maW5hbF90aW1lb3V0KTsKKwkJc2VsZi0+cmV0cnlfY291bnQgPSAwOworCQlpcmxhcF9uZXh0X3N0YXRlKCBzZWxmLCBMQVBfUENMT1NFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlc1xuIiwgX19GVU5DVElPTl9fLAorCQkJICAgaXJsYXBfZXZlbnRbZXZlbnRdKTsKKworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV9yZXNldCAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBXZSBoYXZlIHNlbnQgYSBTTlJNIHJlc2V0IGNvbW1hbmQgdG8gdGhlIHBlZXIgbGF5ZXIsIGFuZCBpcyBhd2FpdGluZworICogICAgcmVwbHkuCisgKgorICovCitzdGF0aWMgaW50IGlybGFwX3N0YXRlX3Jlc2V0KHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygzLCAiJXMoKSwgZXZlbnQgPSAlc1xuIiwgX19GVU5DVElPTl9fLCBpcmxhcF9ldmVudFtldmVudF0pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUkVDVl9ESVNDX0NNRDoKKwkJZGVsX3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisKKwkJaXJsYXBfYXBwbHlfZGVmYXVsdF9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc2VsZik7CisKKwkJLyogQWx3YXlzIHN3aXRjaCBzdGF0ZSBiZWZvcmUgY2FsbGluZyB1cHBlciBsYXllcnMgKi8KKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTkRNKTsKKworCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX05PX1JFU1BPTlNFKTsKKworCQlicmVhazsKKwljYXNlIFJFQ1ZfVUFfUlNQOgorCQlkZWxfdGltZXIoJnNlbGYtPmZpbmFsX3RpbWVyKTsKKworCQkvKiBJbml0aWF0ZSBjb25uZWN0aW9uIHN0YXRlICovCisJCWlybGFwX2luaXRpYXRlX2Nvbm5lY3Rpb25fc3RhdGUoc2VsZik7CisKKwkJaXJsYXBfcmVzZXRfY29uZmlybSgpOworCisJCXNlbGYtPnJlbW90ZV9idXN5ID0gRkFMU0U7CisKKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfWE1JVF9QKTsKKworCQlpcmxhcF9zdGFydF9wb2xsX3RpbWVyKHNlbGYsIHNlbGYtPnBvbGxfdGltZW91dCk7CisKKwkJYnJlYWs7CisJY2FzZSBGSU5BTF9USU1FUl9FWFBJUkVEOgorCQlpZiAoc2VsZi0+cmV0cnlfY291bnQgPCAzKSB7CisJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKworCQkJSVJEQV9BU1NFUlQoc2VsZi0+bmV0ZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCQkJaXJsYXBfc2VuZF9zbnJtX2ZyYW1lKHNlbGYsIHNlbGYtPnFvc19kZXYpOworCisJCQlzZWxmLT5yZXRyeV9jb3VudCsrOyAvKiBFeHBlcmltZW50YWwhISAqLworCisJCQlpcmxhcF9zdGFydF9maW5hbF90aW1lcihzZWxmLCBzZWxmLT5maW5hbF90aW1lb3V0KTsKKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1JFU0VUKTsKKwkJfSBlbHNlIGlmIChzZWxmLT5yZXRyeV9jb3VudCA+PSBzZWxmLT5OMykgeworCQkJaXJsYXBfYXBwbHlfZGVmYXVsdF9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc2VsZik7CisKKwkJCS8qIEFsd2F5cyBzd2l0Y2ggc3RhdGUgYmVmb3JlIGNhbGxpbmcgdXBwZXIgbGF5ZXJzICovCisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCisJCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX05PX1JFU1BPTlNFKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFQ1ZfU05STV9DTUQ6CisJCS8qCisJCSAqIFNOUk0gZnJhbWUgaXMgbm90IGFsbG93ZWQgdG8gY29udGFpbiBhbiBJLWZpZWxkIGluIHRoaXMKKwkJICogc3RhdGUKKwkJICovCisJCWlmICghaW5mbykgeworCQkJSVJEQV9ERUJVRygzLCAiJXMoKSwgUkVDVl9TTlJNX0NNRFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWlybGFwX2luaXRpYXRlX2Nvbm5lY3Rpb25fc3RhdGUoc2VsZik7CisJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJCWlybGFwX3NlbmRfdWFfcmVzcG9uc2VfZnJhbWUoc2VsZiwgJnNlbGYtPnFvc19yeCk7CisJCQlpcmxhcF9yZXNldF9jb25maXJtKCk7CisJCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisJCX0gZWxzZSB7CisJCQlJUkRBX0RFQlVHKDAsCisJCQkJICAgIiVzKCksIFNOUk0gZnJhbWUgY29udGFpbmVkIGFuIEkgZmllbGQhXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5rbm93biBldmVudCAlc1xuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgaXJsYXBfZXZlbnRbZXZlbnRdKTsKKworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV94bWl0X3MgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICBYTUlUX1MsIFRoZSBzZWNvbmRhcnkgc3RhdGlvbiBoYXMgYmVlbiBnaXZlbiB0aGUgcmlnaHQgdG8gdHJhbnNtaXQsCisgKiAgIGFuZCB3ZSB0aGVyZWZvciBkbyBub3QgZXhwZWN0IHRvIHJlY2VpdmUgYW55IHRyYW5zbWlzc2lvbnMgZnJvbSBvdGhlcgorICogICBzdGF0aW9ucy4KKyAqLworc3RhdGljIGludCBpcmxhcF9zdGF0ZV94bWl0X3Moc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgZXZlbnQ9JXNcbiIsIF9fRlVOQ1RJT05fXywgaXJsYXBfZXZlbnRbZXZlbnRdKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC1FTk9ERVY7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtRUJBRFI7KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNFTkRfSV9DTUQ6CisJCS8qCisJCSAqICBTZW5kIGZyYW1lIG9ubHkgaWYgc2VuZCB3aW5kb3cgPiAwCisJCSAqLworCQlpZiAoKHNlbGYtPndpbmRvdyA+IDApICYmICghc2VsZi0+cmVtb3RlX2J1c3kpKSB7CisJCQlpbnQgbmV4dGZpdDsKKyNpZmRlZiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYl9uZXh0OworCisJCQkvKgorCQkJICogU2FtZSBkZWFsIGFzIGluIGlybGFwX3N0YXRlX3htaXRfcCgpLCBzbyBzZWUKKwkJCSAqIHRoZSBjb21tZW50cyBhdCB0aGF0IHBvaW50LgorCQkJICogV2UgYXJlIHRoZSBzZWNvbmRhcnksIHNvIHRoZXJlIGFyZSBvbmx5IHN1YnRsZQorCQkJICogZGlmZmVyZW5jZXMuIC0gSmVhbiBJSQorCQkJICovCisKKwkJCS8qIENoZWNrIGlmIGEgc3Vic2VxdWVudCBza2IgZXhpc3QgYW5kIHdvdWxkIGZpdCBpbgorCQkJICogdGhlIGN1cnJlbnQgd2luZG93ICh3aXRoIHJlc3BlY3QgdG8gdHVybmFyb3VuZAorCQkJICogdGltZSkuIC0gSmVhbiBJSSAqLworCQkJc2tiX25leHQgPSBza2JfcGVlaygmc2VsZi0+dHhxKTsKKwkJCW5leHRmaXQgPSAoKHNrYl9uZXh0ICE9IE5VTEwpICYmCisJCQkJICAgKChza2JfbmV4dC0+bGVuICsgc2tiLT5sZW4pIDw9CisJCQkJICAgIHNlbGYtPmJ5dGVzX2xlZnQpKTsKKworCQkJLyoKKwkJCSAqICBUZXN0IGlmIHdlIGhhdmUgdHJhbnNtaXR0ZWQgbW9yZSBieXRlcyBvdmVyIHRoZQorCQkJICogIGxpbmsgdGhhbiBpdHMgcG9zc2libGUgdG8gZG8gd2l0aCB0aGUgY3VycmVudAorCQkJICogIHNwZWVkIGFuZCB0dXJuLWFyb3VuZC10aW1lLgorCQkJICovCisJCQlpZigoIW5leHRmaXQpICYmIChza2ItPmxlbiA+IHNlbGYtPmJ5dGVzX2xlZnQpKSB7CisJCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgTm90IGFsbG93ZWQgdG8gdHJhbnNtaXQiCisJCQkJCSAgICIgbW9yZSBieXRlcyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJLyogUmVxdWV1ZSB0aGUgc2tiICovCisJCQkJc2tiX3F1ZXVlX2hlYWQoJnNlbGYtPnR4cSwgc2tiX2dldChza2IpKTsKKworCQkJCS8qCisJCQkJICogIFN3aXRjaCB0byBOUk1fUywgdGhpcyBpcyBvbmx5IHBvc3NpYmxlCisJCQkJICogIHdoZW4gd2UgYXJlIGluIHNlY29uZGFyeSBtb2RlLCBzaW5jZSB3ZQorCQkJCSAqICBtdXN0IGJlIHN1cmUgdGhhdCB3ZSBkb24ndCBtaXNzIGFueSBSUgorCQkJCSAqICBmcmFtZXMKKwkJCQkgKi8KKwkJCQlzZWxmLT53aW5kb3cgPSBzZWxmLT53aW5kb3dfc2l6ZTsKKwkJCQlzZWxmLT5ieXRlc19sZWZ0ID0gc2VsZi0+bGluZV9jYXBhY2l0eTsKKwkJCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsKKwkJCQkvKiBTbGlnaHQgZGlmZmVyZW5jZSB3aXRoIHByaW1hcnkgOgorCQkJCSAqIGhlcmUgd2Ugd291bGQgd2FpdCBmb3IgdGhlIG90aGVyIHNpZGUgdG8KKwkJCQkgKiBleHBpcmUgdGhlIHR1cm5hcm91bmQuIC0gSmVhbiBJSSAqLworCisJCQkJcmV0dXJuIC1FUFJPVE87IC8qIFRyeSBhZ2FpbiBsYXRlciAqLworCQkJfQorCQkJLyogU3Vic3RyYWN0IHNwYWNlIHVzZWQgYnkgdGhpcyBza2IgKi8KKwkJCXNlbGYtPmJ5dGVzX2xlZnQgLT0gc2tiLT5sZW47CisjZWxzZQkvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLworCQkJLyogV2luZG93IGhhcyBiZWVuIGFkanVzdGVkIGZvciB0aGUgbWF4IHBhY2tldAorCQkJICogc2l6ZSwgc28gbXVjaCBzaW1wbGVyLi4uIC0gSmVhbiBJSSAqLworCQkJbmV4dGZpdCA9IChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID4gMCk7CisjZW5kaWYgLyogQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cgKi8KKwkJCS8qCisJCQkgKiAgU2VuZCBkYXRhIHdpdGggZmluYWwgYml0IGNsZWFyZWQgb25seSBpZiB3aW5kb3cgPiAxCisJCQkgKiAgYW5kIHRoZXJlIGlzIG1vcmUgZnJhbWVzIHRvIGJlIHNlbnQKKwkJCSAqLworCQkJaWYgKChzZWxmLT53aW5kb3cgPiAxKSAmJiAobmV4dGZpdCkpIHsKKwkJCQlpcmxhcF9zZW5kX2RhdGFfc2Vjb25kYXJ5KHNlbGYsIHNrYik7CisJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfWE1JVF9TKTsKKwkJCX0gZWxzZSB7CisJCQkJaXJsYXBfc2VuZF9kYXRhX3NlY29uZGFyeV9maW5hbChzZWxmLCBza2IpOworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsKKworCQkJCS8qCisJCQkJICogTWFrZSBzdXJlIHN0YXRlIG1hY2hpbmUgZG9lcyBub3QgdHJ5IHRvIHNlbmQKKwkJCQkgKiBhbnkgbW9yZSBmcmFtZXMKKwkJCQkgKi8KKwkJCQlyZXQgPSAtRVBST1RPOworCQkJfQorCQl9IGVsc2UgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5hYmxlIHRvIHNlbmQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJc2tiX3F1ZXVlX2hlYWQoJnNlbGYtPnR4cSwgc2tiX2dldChza2IpKTsKKwkJCXJldCA9IC1FUFJPVE87CisJCX0KKwkJYnJlYWs7CisJY2FzZSBESVNDT05ORUNUX1JFUVVFU1Q6CisJCWlybGFwX3NlbmRfcmRfZnJhbWUoc2VsZik7CisJCWlybGFwX2ZsdXNoX2FsbF9xdWV1ZXMoc2VsZik7CisJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsIHNlbGYtPndkX3RpbWVvdXQpOworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9TQ0xPU0UpOworCQlicmVhazsKKwljYXNlIERBVEFfUkVRVUVTVDoKKwkJLyogTm90aGluZyB0byBkbywgaXJsYXBfZG9fZXZlbnQoKSB3aWxsIHNlbmQgdGhlIHBhY2tldAorCQkgKiB3aGVuIHdlIHJldHVybi4uLiAtIEplYW4gSUkgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlc1xuIiwgX19GVU5DVElPTl9fLAorCQkJICAgaXJsYXBfZXZlbnRbZXZlbnRdKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3N0YXRlX25ybV9zIChldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIE5STV9TIChOb3JtYWwgUmVzcG9uc2UgTW9kZSBhcyBTZWNvbmRhcnkpIHN0YXRlLCBpbiB0aGlzIHN0YXRlIHdlIGFyZQorICogICAgZXhwZWN0aW5nIHRvIHJlY2VpdmUgZnJhbWVzIGZyb20gdGhlIHByaW1hcnkgc3RhdGlvbgorICoKKyAqLworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9ucm1fcyhzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykKK3sKKwlpbnQgbnNfc3RhdHVzOworCWludCBucl9zdGF0dXM7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBldmVudD0lc1xuIiwgX19GVU5DVElPTl9fLCBpcmxhcF9ldmVudFsgZXZlbnRdKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFJFQ1ZfSV9DTUQ6IC8qIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2UgKi8KKwkJLyogRklYTUU6IG11c3QgY2hlY2sgZm9yIHJlbW90ZV9idXN5IGJlbG93ICovCisJCUlSREFfREVCVUcoNCwgIiVzKCksIGV2ZW50PSVzIG5yPSVkLCB2cz0lZCwgbnM9JWQsICIKKwkJCSAgICJ2cj0lZCwgcGY9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgIGlybGFwX2V2ZW50W2V2ZW50XSwgaW5mby0+bnIsCisJCQkgICBzZWxmLT52cywgaW5mby0+bnMsIHNlbGYtPnZyLCBpbmZvLT5wZik7CisKKwkJc2VsZi0+cmV0cnlfY291bnQgPSAwOworCisJCW5zX3N0YXR1cyA9IGlybGFwX3ZhbGlkYXRlX25zX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5zKTsKKwkJbnJfc3RhdHVzID0gaXJsYXBfdmFsaWRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCQkvKgorCQkgKiAgQ2hlY2sgZm9yIGV4cGVjdGVkIEkobmZvcm1hdGlvbikgZnJhbWUKKwkJICovCisJCWlmICgobnNfc3RhdHVzID09IE5TX0VYUEVDVEVEKSAmJiAobnJfc3RhdHVzID09IE5SX0VYUEVDVEVEKSkgeworCisJCQkvKiBVcGRhdGUgVnIgKG5leHQgZnJhbWUgZm9yIHVzIHRvIHJlY2VpdmUpICovCisJCQlzZWxmLT52ciA9IChzZWxmLT52ciArIDEpICUgODsKKworCQkJLyogVXBkYXRlIE5yIHJlY2VpdmVkICovCisJCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCisJCQkvKgorCQkJICogIHBvbGwgYml0IGNsZWFyZWQ/CisJCQkgKi8KKwkJCWlmICghaW5mby0+cGYpIHsKKworCQkJCXNlbGYtPmFja19yZXF1aXJlZCA9IFRSVUU7CisKKwkJCQkvKgorCQkJCSAqICBTdGFydGluZyBXRC10aW1lciBoZXJlIGlzIG9wdGlvbmFsLCBidXQKKwkJCQkgKiAgbm90IHJlY29tbWVuZGVkLiBOb3RlIDYgSXJMQVAgcC4gODMKKwkJCQkgKi8KKyNpZiAwCisJCQkJaXJkYV9zdGFydF90aW1lcihXRF9USU1FUiwgc2VsZi0+d2RfdGltZW91dCk7CisjZW5kaWYKKwkJCQkvKiBLZWVwIHN0YXRlLCBkbyBub3QgbW92ZSB0aGlzIGxpbmUgKi8KKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUyk7CisKKwkJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogIFdlIHNob3VsZCB3YWl0IGJlZm9yZSBzZW5kaW5nIFJSLCBhbmQKKwkJCQkgKiAgYWxzbyBiZWZvcmUgY2hhbmdpbmcgdG8gWE1JVF9TCisJCQkJICogIHN0YXRlLiAobm90ZSAxLCBJckxBUCBwLiA4MikKKwkJCQkgKi8KKwkJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKworCQkJCS8qCisJCQkJICogR2l2ZSBoaWdoZXIgbGF5ZXJzIGEgY2hhbmNlIHRvCisJCQkJICogaW1tZWRpYXRlbHkgcmVwbHkgd2l0aCBzb21lIGRhdGEgYmVmb3JlCisJCQkJICogd2UgZGVjaWRlIGlmIHdlIHNob3VsZCBzZW5kIGEgUlIgZnJhbWUKKwkJCQkgKiBvciBub3QKKwkJCQkgKi8KKwkJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBGQUxTRSk7CisKKwkJCQkvKiBBbnkgcGVuZGluZyBkYXRhIHJlcXVlc3RzPyAgKi8KKwkJCQlpZiAoKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkgPiAwKSAmJgorCQkJCSAgICAoc2VsZi0+d2luZG93ID4gMCkpCisJCQkJeworCQkJCQlzZWxmLT5hY2tfcmVxdWlyZWQgPSBUUlVFOworCisJCQkJCWRlbF90aW1lcigmc2VsZi0+d2RfdGltZXIpOworCisJCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1hNSVRfUyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaXJsYXBfc2VuZF9ycl9mcmFtZShzZWxmLCBSU1BfRlJBTUUpOworCQkJCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLAorCQkJCQkJCSAgICAgc2VsZi0+d2RfdGltZW91dCk7CisKKwkJCQkJLyogS2VlcCB0aGUgc3RhdGUgKi8KKwkJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1MpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiAgQ2hlY2sgZm9yIFVuZXhwZWN0ZWQgbmV4dCB0byBzZW5kIChOcykKKwkJICovCisJCWlmICgobnNfc3RhdHVzID09IE5TX1VORVhQRUNURUQpICYmIChucl9zdGF0dXMgPT0gTlJfRVhQRUNURUQpKQorCQl7CisJCQkvKiBVbmV4cGVjdGVkIG5leHQgdG8gc2VuZCwgd2l0aCBmaW5hbCBiaXQgY2xlYXJlZCAqLworCQkJaWYgKCFpbmZvLT5wZikgeworCQkJCWlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisKKwkJCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVXBkYXRlIE5yIHJlY2VpdmVkICovCisJCQkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKworCQkJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQkJCWlybGFwX3NlbmRfcnJfZnJhbWUoc2VsZiwgUlNQX0ZSQU1FKTsKKworCQkJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsIHNlbGYtPndkX3RpbWVvdXQpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiAgVW5leHBlY3RlZCBOZXh0IHRvIFJlY2VpdmUoTlIpID8KKwkJICovCisJCWlmICgobnNfc3RhdHVzID09IE5TX0VYUEVDVEVEKSAmJiAobnJfc3RhdHVzID09IE5SX1VORVhQRUNURUQpKQorCQl7CisJCQlpZiAoaW5mby0+cGYpIHsKKwkJCQlJUkRBX0RFQlVHKDQsICJSRUNWX0lfUlNQOiBmcmFtZShzKSBsb3N0XG4iKTsKKworCQkJCXNlbGYtPnZyID0gKHNlbGYtPnZyICsgMSkgJSA4OworCisJCQkJLyogVXBkYXRlIE5yIHJlY2VpdmVkICovCisJCQkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKworCQkJCS8qIFJlc2VuZCByZWplY3RlZCBmcmFtZXMgKi8KKwkJCQlpcmxhcF9yZXNlbmRfcmVqZWN0ZWRfZnJhbWVzKHNlbGYsIFJTUF9GUkFNRSk7CisKKwkJCQkvKiBLZWVwIHN0YXRlLCBkbyBub3QgbW92ZSB0aGlzIGxpbmUgKi8KKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUyk7CisKKwkJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBGQUxTRSk7CisJCQkJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgc2VsZi0+d2RfdGltZW91dCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKgorCQkJICogIFRoaXMgaXMgbm90IGRvY3VtZW50ZWQgaW4gSXJMQVAhISBVbmV4cGVjdGVkIE5SCisJCQkgKiAgd2l0aCBwb2xsIGJpdCBjbGVhcmVkCisJCQkgKi8KKwkJCWlmICghaW5mby0+cGYpIHsKKwkJCQlzZWxmLT52ciA9IChzZWxmLT52ciArIDEpICUgODsKKworCQkJCS8qIFVwZGF0ZSBOciByZWNlaXZlZCAqLworCQkJCWlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisKKwkJCQkvKiBLZWVwIHN0YXRlLCBkbyBub3QgbW92ZSB0aGlzIGxpbmUgKi8KKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUyk7CisKKwkJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBGQUxTRSk7CisJCQkJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgc2VsZi0+d2RfdGltZW91dCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWlmIChyZXQgPT0gTlJfSU5WQUxJRCkgeworCQkJSVJEQV9ERUJVRygwLCAiTlJNX1MsIE5SX0lOVkFMSUQgbm90IGltcGxlbWVudGVkIVxuIik7CisJCX0KKwkJaWYgKHJldCA9PSBOU19JTlZBTElEKSB7CisJCQlJUkRBX0RFQlVHKDAsICJOUk1fUywgTlNfSU5WQUxJRCBub3QgaW1wbGVtZW50ZWQhXG4iKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFQ1ZfVUlfRlJBTUU6CisJCS8qCisJCSAqICBwb2xsIGJpdCBjbGVhcmVkPworCQkgKi8KKwkJaWYgKCFpbmZvLT5wZikgeworCQkJaXJsYXBfZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYiwgVFJVRSk7CisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUyk7IC8qIEtlZXAgc3RhdGUgKi8KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiAgQW55IHBlbmRpbmcgZGF0YSByZXF1ZXN0cz8KKwkJCSAqLworCQkJaWYgKChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID4gMCkgJiYKKwkJCSAgICAoc2VsZi0+d2luZG93ID4gMCkgJiYgIXNlbGYtPnJlbW90ZV9idXN5KQorCQkJeworCQkJCWlybGFwX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IsIFRSVUUpOworCisJCQkJZGVsX3RpbWVyKCZzZWxmLT53ZF90aW1lcik7CisKKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9YTUlUX1MpOworCQkJfSBlbHNlIHsKKwkJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBUUlVFKTsKKworCQkJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCisJCQkJaXJsYXBfc2VuZF9ycl9mcmFtZShzZWxmLCBSU1BfRlJBTUUpOworCQkJCXNlbGYtPmFja19yZXF1aXJlZCA9IEZBTFNFOworCisJCQkJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgc2VsZi0+d2RfdGltZW91dCk7CisKKwkJCQkvKiBLZWVwIHRoZSBzdGF0ZSAqLworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIFJFQ1ZfUlJfQ01EOgorCQlzZWxmLT5yZXRyeV9jb3VudCA9IDA7CisKKwkJLyoKKwkJICogIE5yIGFzIGV4cGVjdGVkPworCQkgKi8KKwkJbnJfc3RhdHVzID0gaXJsYXBfdmFsaWRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCQlpZiAobnJfc3RhdHVzID09IE5SX0VYUEVDVEVEKSB7CisJCQlpZiAoKHNrYl9xdWV1ZV9sZW4oICZzZWxmLT50eHEpID4gMCkgJiYKKwkJCSAgICAoc2VsZi0+d2luZG93ID4gMCkpIHsKKwkJCQlzZWxmLT5yZW1vdGVfYnVzeSA9IEZBTFNFOworCisJCQkJLyogVXBkYXRlIE5yIHJlY2VpdmVkICovCisJCQkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKwkJCQlkZWxfdGltZXIoJnNlbGYtPndkX3RpbWVyKTsKKworCQkJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1hNSVRfUyk7CisJCQl9IGVsc2UgeworCQkJCXNlbGYtPnJlbW90ZV9idXN5ID0gRkFMU0U7CisJCQkJLyogVXBkYXRlIE5yIHJlY2VpdmVkICovCisJCQkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKwkJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKworCQkJCS8qIE5vdGUgOiBpZiB0aGUgbGluayBpcyBpZGxlICh0aGlzIGNhc2UpLAorCQkJCSAqIHdlIG5ldmVyIGdvIGluIFhNSVRfUywgc28gd2UgbmV2ZXIgZ2V0IGEKKwkJCQkgKiBjaGFuY2UgdG8gcHJvY2VzcyBhbnkgRElTQ09OTkVDVF9SRVFVRVNULgorCQkJCSAqIERvIGl0IG5vdyAhIC0gSmVhbiBJSSAqLworCQkJCWlmIChzZWxmLT5kaXNjb25uZWN0X3BlbmRpbmcpIHsKKwkJCQkJLyogRGlzY29ubmVjdCAqLworCQkJCQlpcmxhcF9zZW5kX3JkX2ZyYW1lKHNlbGYpOworCQkJCQlpcmxhcF9mbHVzaF9hbGxfcXVldWVzKHNlbGYpOworCisJCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1NDTE9TRSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogSnVzdCBzZW5kIGJhY2sgcGYgYml0ICovCisJCQkJCWlybGFwX3NlbmRfcnJfZnJhbWUoc2VsZiwgUlNQX0ZSQU1FKTsKKworCQkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUyk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKG5yX3N0YXR1cyA9PSBOUl9VTkVYUEVDVEVEKSB7CisJCQlzZWxmLT5yZW1vdGVfYnVzeSA9IEZBTFNFOworCQkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKwkJCWlybGFwX3Jlc2VuZF9yZWplY3RlZF9mcmFtZXMoc2VsZiwgUlNQX0ZSQU1FKTsKKworCQkJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgc2VsZi0+d2RfdGltZW91dCk7CisKKwkJCS8qIEtlZXAgc3RhdGUgKi8KKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsKKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIGludmFsaWQgbnIgbm90IGltcGxlbWVudGVkIVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQl9CisJCWJyZWFrOworCWNhc2UgUkVDVl9TTlJNX0NNRDoKKwkJLyogU05STSBmcmFtZSBpcyBub3QgYWxsb3dlZCB0byBjb250YWluIGFuIEktZmllbGQgKi8KKwkJaWYgKCFpbmZvKSB7CisJCQlkZWxfdGltZXIoJnNlbGYtPndkX3RpbWVyKTsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIHJlY2VpdmVkIFNOUk0gY21kXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfUkVTRVRfQ0hFQ0spOworCisJCQlpcmxhcF9yZXNldF9pbmRpY2F0aW9uKHNlbGYpOworCQl9IGVsc2UgeworCQkJSVJEQV9ERUJVRygwLAorCQkJCSAgICIlcygpLCBTTlJNIGZyYW1lIGNvbnRhaW5lZCBhbiBJLWZpZWxkIVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCisJCX0KKwkJYnJlYWs7CisJY2FzZSBSRUNWX1JFSl9DTUQ6CisJCWlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisJCWlmIChzZWxmLT5yZW1vdGVfYnVzeSkgeworCQkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisJCQlpcmxhcF9zZW5kX3JyX2ZyYW1lKHNlbGYsIFJTUF9GUkFNRSk7CisJCX0gZWxzZQorCQkJaXJsYXBfcmVzZW5kX3JlamVjdGVkX2ZyYW1lcyhzZWxmLCBSU1BfRlJBTUUpOworCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBSRUNWX1NSRUpfQ01EOgorCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCQlpZiAoc2VsZi0+cmVtb3RlX2J1c3kpIHsKKwkJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQkJaXJsYXBfc2VuZF9ycl9mcmFtZShzZWxmLCBSU1BfRlJBTUUpOworCQl9IGVsc2UKKwkJCWlybGFwX3Jlc2VuZF9yZWplY3RlZF9mcmFtZShzZWxmLCBSU1BfRlJBTUUpOworCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBXRF9USU1FUl9FWFBJUkVEOgorCQkvKgorCQkgKiAgV2FpdCB1bnRpbCByZXRyeV9jb3VudCAqIG4gbWF0Y2hlcyBuZWdvdGlhdGVkIHRocmVzaG9sZC8KKwkJICogIGRpc2Nvbm5lY3QgdGltZSAobm90ZSAyIGluIElyTEFQIHAuIDgyKQorCQkgKgorCQkgKiBTaW1pbGFyIHRvIGlybGFwX3N0YXRlX25ybV9wKCkgLT4gRklOQUxfVElNRVJfRVhQSVJFRAorCQkgKiBOb3RlIDogc2VsZi0+d2RfdGltZW91dCA9IChzZWxmLT5maW5hbF90aW1lb3V0ICogMiksCisJCSAqICAgd2hpY2ggZXhwbGFpbiB3aHkgd2UgdXNlIChzZWxmLT5OMiAvIDIpIGhlcmUgISEhCisJCSAqIEplYW4gSUkKKwkJICovCisJCUlSREFfREVCVUcoMSwgIiVzKCksIHJldHJ5X2NvdW50ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgIHNlbGYtPnJldHJ5X2NvdW50KTsKKworCQlpZiAoc2VsZi0+cmV0cnlfY291bnQgPCAoc2VsZi0+TjIgLyAyKSkgeworCQkJLyogTm8gcmV0cnksIGp1c3Qgd2FpdCBmb3IgcHJpbWFyeSAqLworCQkJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgc2VsZi0+d2RfdGltZW91dCk7CisJCQlzZWxmLT5yZXRyeV9jb3VudCsrOworCisJCQlpZigoc2VsZi0+cmV0cnlfY291bnQgJSAoc2VsZi0+TjEgLyAyKSkgPT0gMCkKKwkJCQlpcmxhcF9zdGF0dXNfaW5kaWNhdGlvbihzZWxmLAorCQkJCQkJCVNUQVRVU19OT19BQ1RJVklUWSk7CisJCX0gZWxzZSB7CisJCQlpcmxhcF9hcHBseV9kZWZhdWx0X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzZWxmKTsKKworCQkJLyogQWx3YXlzIHN3aXRjaCBzdGF0ZSBiZWZvcmUgY2FsbGluZyB1cHBlciBsYXllcnMgKi8KKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisJCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX05PX1JFU1BPTlNFKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFQ1ZfRElTQ19DTUQ6CisJCS8qIEFsd2F5cyBzd2l0Y2ggc3RhdGUgYmVmb3JlIGNhbGxpbmcgdXBwZXIgbGF5ZXJzICovCisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisKKwkJLyogU2VuZCBkaXNjb25uZWN0IHJlc3BvbnNlICovCisJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQlpcmxhcF9zZW5kX3VhX3Jlc3BvbnNlX2ZyYW1lKHNlbGYsIE5VTEwpOworCisJCWRlbF90aW1lcigmc2VsZi0+d2RfdGltZXIpOworCQlpcmxhcF9mbHVzaF9hbGxfcXVldWVzKHNlbGYpOworCQkvKiBTZXQgZGVmYXVsdCBsaW5rIHBhcmFtZXRlcnMgKi8KKwkJaXJsYXBfYXBwbHlfZGVmYXVsdF9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc2VsZik7CisKKwkJaXJsYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExBUF9ESVNDX0lORElDQVRJT04pOworCQlicmVhazsKKwljYXNlIFJFQ1ZfRElTQ09WRVJZX1hJRF9DTUQ6CisJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQlpcmxhcF9zZW5kX3JyX2ZyYW1lKHNlbGYsIFJTUF9GUkFNRSk7CisJCXNlbGYtPmFja19yZXF1aXJlZCA9IFRSVUU7CisJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsIHNlbGYtPndkX3RpbWVvdXQpOworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUyk7CisKKwkJYnJlYWs7CisJY2FzZSBSRUNWX1RFU1RfQ01EOgorCQkvKiBSZW1vdmUgdGVzdCBmcmFtZSBoZWFkZXIgKG9ubHkgTEFQIGhlYWRlciBpbiBOUk0pICovCisJCXNrYl9wdWxsKHNrYiwgTEFQX0FERFJfSEVBREVSICsgTEFQX0NUUkxfSEVBREVSKTsKKworCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgc2VsZi0+d2RfdGltZW91dCk7CisKKwkJLyogU2VuZCByZXNwb25zZSAoaW5mbyB3aWxsIGJlIGNvcGllZCkgKi8KKwkJaXJsYXBfc2VuZF90ZXN0X2ZyYW1lKHNlbGYsIHNlbGYtPmNhZGRyLCBpbmZvLT5kYWRkciwgc2tiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5rbm93biBldmVudCAlZCwgKCVzKVxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgZXZlbnQsIGlybGFwX2V2ZW50W2V2ZW50XSk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV9zY2xvc2UgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKi8KK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfc2Nsb3NlKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtRU5PREVWOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm4gLUVCQURSOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSRUNWX0RJU0NfQ01EOgorCQkvKiBBbHdheXMgc3dpdGNoIHN0YXRlIGJlZm9yZSBjYWxsaW5nIHVwcGVyIGxheWVycyAqLworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCisJCS8qIFNlbmQgZGlzY29ubmVjdCByZXNwb25zZSAqLworCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJaXJsYXBfc2VuZF91YV9yZXNwb25zZV9mcmFtZShzZWxmLCBOVUxMKTsKKworCQlkZWxfdGltZXIoJnNlbGYtPndkX3RpbWVyKTsKKwkJLyogU2V0IGRlZmF1bHQgbGluayBwYXJhbWV0ZXJzICovCisJCWlybGFwX2FwcGx5X2RlZmF1bHRfY29ubmVjdGlvbl9wYXJhbWV0ZXJzKHNlbGYpOworCisJCWlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBMQVBfRElTQ19JTkRJQ0FUSU9OKTsKKwkJYnJlYWs7CisJY2FzZSBSRUNWX0RNX1JTUDoKKwkJLyogSXJMQVAtMS4xIHAuODI6IGluIFNDTE9TRSwgUyBhbmQgSSB0eXBlIFJTUCBmcmFtZXMKKwkJICogc2hhbGwgdGFrZSB1cyBkb3duIGludG8gZGVmYXVsdCBORE0gc3RhdGUsIGxpa2UgRE1fUlNQCisJCSAqLworCWNhc2UgUkVDVl9SUl9SU1A6CisJY2FzZSBSRUNWX1JOUl9SU1A6CisJY2FzZSBSRUNWX1JFSl9SU1A6CisJY2FzZSBSRUNWX1NSRUpfUlNQOgorCWNhc2UgUkVDVl9JX1JTUDoKKwkJLyogQWx3YXlzIHN3aXRjaCBzdGF0ZSBiZWZvcmUgY2FsbGluZyB1cHBlciBsYXllcnMgKi8KKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTkRNKTsKKworCQlkZWxfdGltZXIoJnNlbGYtPndkX3RpbWVyKTsKKwkJaXJsYXBfYXBwbHlfZGVmYXVsdF9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc2VsZik7CisKKwkJaXJsYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExBUF9ESVNDX0lORElDQVRJT04pOworCQlicmVhazsKKwljYXNlIFdEX1RJTUVSX0VYUElSRUQ6CisJCS8qIEFsd2F5cyBzd2l0Y2ggc3RhdGUgYmVmb3JlIGNhbGxpbmcgdXBwZXIgbGF5ZXJzICovCisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisKKwkJaXJsYXBfYXBwbHlfZGVmYXVsdF9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc2VsZik7CisKKwkJaXJsYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExBUF9ESVNDX0lORElDQVRJT04pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJckxBUC0xLjEgcC44MjogaW4gU0NMT1NFLCBiYXNpY2FsbHkgYW55IHJlY2VpdmVkIGZyYW1lCisJCSAqIHdpdGggcGY9MSBzaGFsbCByZXN0YXJ0IHRoZSB3ZC10aW1lciBhbmQgcmVzZW5kIHRoZSByZDpyc3AKKwkJICovCisJCWlmIChpbmZvICE9IE5VTEwgICYmICBpbmZvLT5wZikgeworCQkJZGVsX3RpbWVyKCZzZWxmLT53ZF90aW1lcik7CisJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJCWlybGFwX3NlbmRfcmRfZnJhbWUoc2VsZik7CisJCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKwkJCWJyZWFrOwkJLyogc3RheSBpbiBTQ0xPU0UgKi8KKwkJfQorCisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVua25vd24gZXZlbnQgJWQsICglcylcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgIGV2ZW50LCBpcmxhcF9ldmVudFtldmVudF0pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9yZXNldF9jaGVjayggc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgZXZlbnQ9JXNcbiIsIF9fRlVOQ1RJT05fXywgaXJsYXBfZXZlbnRbZXZlbnRdKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC1FTk9ERVY7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtRUJBRFI7KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFJFU0VUX1JFU1BPTlNFOgorCQlpcmxhcF9zZW5kX3VhX3Jlc3BvbnNlX2ZyYW1lKHNlbGYsICZzZWxmLT5xb3NfcngpOworCQlpcmxhcF9pbml0aWF0ZV9jb25uZWN0aW9uX3N0YXRlKHNlbGYpOworCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBXRF9USU1FT1VUKTsKKwkJaXJsYXBfZmx1c2hfYWxsX3F1ZXVlcyhzZWxmKTsKKworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUyk7CisJCWJyZWFrOworCWNhc2UgRElTQ09OTkVDVF9SRVFVRVNUOgorCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJaXJsYXBfc2VuZF9yZF9mcmFtZShzZWxmKTsKKwkJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgV0RfVElNRU9VVCk7CisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1NDTE9TRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVua25vd24gZXZlbnQgJWQsICglcylcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgIGV2ZW50LCBpcmxhcF9ldmVudFtldmVudF0pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYXBfZnJhbWUuYyBiL25ldC9pcmRhL2lybGFwX2ZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQwYWJlNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybGFwX2ZyYW1lLmMKQEAgLTAsMCArMSwxNDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgaXJsYXBfZnJhbWUuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBCdWlsZCBhbmQgdHJhbnNtaXQgSXJMQVAgZnJhbWVzCisgKiBTdGF0dXM6ICAgICAgICBTdGFibGUKKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFR1ZSBBdWcgMTkgMTA6Mjc6MjYgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgV2VkIEphbiAgNSAwODo1OTowNCAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKgorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXJkYS5oPgorCisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwX2ZyYW1lLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvcW9zLmg+CisKK3N0YXRpYyB2b2lkIGlybGFwX3NlbmRfaV9mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgaW50IGNvbW1hbmQpOworCisvKgorICogRnVuY3Rpb24gaXJsYXBfaW5zZXJ0X2luZm8gKHNlbGYsIHNrYikKKyAqCisgKiAgICBJbnNlcnQgbWluaW11bSB0dXJuYXJvdW5kIHRpbWUgYW5kIHNwZWVkIGluZm9ybWF0aW9uIGludG8gdGhlIHNrYi4gV2UKKyAqICAgIG5lZWQgdG8gZG8gdGhpcyBzaW5jZSBpdCdzIHBlciBwYWNrZXQgcmVsZXZhbnQgaW5mb3JtYXRpb24uIFNhZmUgdG8KKyAqICAgIGhhdmUgdGhpcyBmdW5jdGlvbiBpbmxpbmVkIHNpbmNlIGl0J3Mgb25seSBjYWxsZWQgZnJvbSBvbmUgcGxhY2UKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlybGFwX2luc2VydF9pbmZvKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwKKwkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyZGFfc2tiX2NiICpjYiA9IChzdHJ1Y3QgaXJkYV9za2JfY2IgKikgc2tiLT5jYjsKKworCS8qCisJICogSW5zZXJ0IE1UVCAobWluLiB0dXJuIHRpbWUpIGFuZCBzcGVlZCBpbnRvIHNrYiwgc28gdGhhdCB0aGUKKwkgKiBkZXZpY2UgZHJpdmVyIGtub3dzIHdoaWNoIHNldHRpbmdzIHRvIHVzZQorCSAqLworCWNiLT5tYWdpYyA9IExBUF9NQUdJQzsKKwljYi0+bXR0ID0gc2VsZi0+bXR0X3JlcXVpcmVkOworCWNiLT5uZXh0X3NwZWVkID0gc2VsZi0+c3BlZWQ7CisKKwkvKiBSZXNldCAqLworCXNlbGYtPm10dF9yZXF1aXJlZCA9IDA7CisKKwkvKgorCSAqIERlbGF5IGVxdWFscyBuZWdvdGlhdGVkIEJPRnMgY291bnQsIHBsdXMgdGhlIG51bWJlciBvZiBCT0ZzIHRvCisJICogZm9yY2UgdGhlIG5lZ290aWF0ZWQgbWluaW11bSB0dXJuYXJvdW5kIHRpbWUKKwkgKi8KKwljYi0+eGJvZnMgPSBzZWxmLT5ib2ZzX2NvdW50OworCWNiLT5uZXh0X3hib2ZzID0gc2VsZi0+bmV4dF9ib2ZzOworCWNiLT54Ym9mc19kZWxheSA9IHNlbGYtPnhib2ZzX2RlbGF5OworCisJLyogUmVzZXQgWEJPRidzIGRlbGF5ICh1c2VkIG9ubHkgZm9yIGdldHRpbmcgbWluIHR1cm4gdGltZSkgKi8KKwlzZWxmLT54Ym9mc19kZWxheSA9IDA7CisJLyogUHV0IHRoZSBjb3JyZWN0IHhib2ZzIHZhbHVlIGZvciB0aGUgbmV4dCBwYWNrZXQgKi8KKwlzZWxmLT5ib2ZzX2NvdW50ID0gc2VsZi0+bmV4dF9ib2ZzOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcXVldWVfeG1pdCAoc2VsZiwgc2tiKQorICoKKyAqICAgIEEgbGl0dGxlIHdyYXBwZXIgZm9yIGRldl9xdWV1ZV94bWl0LCBzbyB3ZSBjYW4gaW5zZXJ0IHNvbWUgY29tbW9uCisgKiAgICBjb2RlIGludG8gaXQuCisgKi8KK3ZvaWQgaXJsYXBfcXVldWVfeG1pdChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogU29tZSBjb21tb24gaW5pdCBzdHVmZiAqLworCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OworCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdyA9IHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisJc2tiLT5wcmlvcml0eSA9IFRDX1BSSU9fQkVTVEVGRk9SVDsKKworCWlybGFwX2luc2VydF9pbmZvKHNlbGYsIHNrYik7CisKKwlkZXZfcXVldWVfeG1pdChza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc2VuZF9zbnJtX2NtZCAodm9pZCkKKyAqCisgKiAgICBUcmFuc21pdHMgYSBjb25uZWN0IFNOUk0gY29tbWFuZCBmcmFtZQorICovCit2b2lkIGlybGFwX3NlbmRfc25ybV9mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJc3RydWN0IHNucm1fZnJhbWUgKmZyYW1lOworCWludCByZXQ7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBBbGxvY2F0ZSBmcmFtZSAqLworCXR4X3NrYiA9IGRldl9hbGxvY19za2IoNjQpOworCWlmICghdHhfc2tiKQorCQlyZXR1cm47CisKKwlmcmFtZSA9IChzdHJ1Y3Qgc25ybV9mcmFtZSAqKSBza2JfcHV0KHR4X3NrYiwgMik7CisKKwkvKiBJbnNlcnQgY29ubmVjdGlvbiBhZGRyZXNzIGZpZWxkICovCisJaWYgKHFvcykKKwkJZnJhbWUtPmNhZGRyID0gQ01EX0ZSQU1FIHwgQ0JST0FEQ0FTVDsKKwllbHNlCisJCWZyYW1lLT5jYWRkciA9IENNRF9GUkFNRSB8IHNlbGYtPmNhZGRyOworCisJLyogSW5zZXJ0IGNvbnRyb2wgZmllbGQgKi8KKwlmcmFtZS0+Y29udHJvbCA9IFNOUk1fQ01EIHwgUEZfQklUOworCisJLyoKKwkgKiAgSWYgd2UgYXJlIGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24gdGhlbiBpbnNlcnQgUW9TIHBhcmFtZXJ0ZXJzCisJICovCisJaWYgKHFvcykgeworCQlza2JfcHV0KHR4X3NrYiwgOSk7IC8qIDIxIGxlZnQgKi8KKwkJZnJhbWUtPnNhZGRyID0gY3B1X3RvX2xlMzIoc2VsZi0+c2FkZHIpOworCQlmcmFtZS0+ZGFkZHIgPSBjcHVfdG9fbGUzMihzZWxmLT5kYWRkcik7CisKKwkJZnJhbWUtPm5jYWRkciA9IHNlbGYtPmNhZGRyOworCisJCXJldCA9IGlybGFwX2luc2VydF9xb3NfbmVnb3RpYXRpb25fcGFyYW1zKHNlbGYsIHR4X3NrYik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfa2ZyZWVfc2tiKHR4X3NrYik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaXJsYXBfcXVldWVfeG1pdChzZWxmLCB0eF9za2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcmVjdl9zbnJtX2NtZCAoc2tiLCBpbmZvKQorICoKKyAqICAgIFJlY2VpdmVkIFNOUk0gKFNldCBOb3JtYWwgUmVzcG9uc2UgTW9kZSkgY29tbWFuZCBmcmFtZQorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfcmVjdl9zbnJtX2NtZChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJc3RydWN0IHNucm1fZnJhbWUgKmZyYW1lOworCisJaWYgKHBza2JfbWF5X3B1bGwoc2tiLHNpemVvZihzdHJ1Y3Qgc25ybV9mcmFtZSkpKSB7CisJCWZyYW1lID0gKHN0cnVjdCBzbnJtX2ZyYW1lICopIHNrYi0+ZGF0YTsKKworCQkvKiBDb3B5IHRoZSBuZXcgY29ubmVjdGlvbiBhZGRyZXNzIGlnbm9yaW5nIHRoZSBDL1IgYml0ICovCisJCWluZm8tPmNhZGRyID0gZnJhbWUtPm5jYWRkciAmIDB4RkU7CisKKwkJLyogQ2hlY2sgaWYgdGhlIG5ldyBjb25uZWN0aW9uIGFkZHJlc3MgaXMgdmFsaWQgKi8KKwkJaWYgKChpbmZvLT5jYWRkciA9PSAweDAwKSB8fCAoaW5mby0+Y2FkZHIgPT0gMHhmZSkpIHsKKwkJCUlSREFfREVCVUcoMywgIiVzKCksIGludmFsaWQgY29ubmVjdGlvbiBhZGRyZXNzIVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogQ29weSBwZWVyIGRldmljZSBhZGRyZXNzICovCisJCWluZm8tPmRhZGRyID0gbGUzMl90b19jcHUoZnJhbWUtPnNhZGRyKTsKKwkJaW5mby0+c2FkZHIgPSBsZTMyX3RvX2NwdShmcmFtZS0+ZGFkZHIpOworCisJCS8qIE9ubHkgYWNjZXB0IGlmIGFkZHJlc3NlZCBkaXJlY3RseSB0byB1cyAqLworCQlpZiAoaW5mby0+c2FkZHIgIT0gc2VsZi0+c2FkZHIpIHsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIG5vdCBhZGRyZXNzZWQgdG8gdXMhXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm47CisJCX0KKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9TTlJNX0NNRCwgc2tiLCBpbmZvKTsKKwl9IGVsc2UgeworCQkvKiBTaWduYWwgdGhhdCB0aGlzIFNOUk0gZnJhbWUgZG9lcyBub3QgY29udGFpbiBhbmQgSS1maWVsZCAqLworCQlpcmxhcF9kb19ldmVudChzZWxmLCBSRUNWX1NOUk1fQ01ELCBza2IsIE5VTEwpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3NlbmRfdWFfcmVzcG9uc2VfZnJhbWUgKHFvcykKKyAqCisgKiAgICBTZW5kIFVBIChVbm51bWJlcmVkIEFja25vd2xlZGdlbWVudCkgZnJhbWUKKyAqCisgKi8KK3ZvaWQgaXJsYXBfc2VuZF91YV9yZXNwb25zZV9mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJc3RydWN0IHVhX2ZyYW1lICpmcmFtZTsKKwlpbnQgcmV0OworCisJSVJEQV9ERUJVRygyLCAiJXMoKSA8JWxkPlxuIiwgX19GVU5DVElPTl9fLCBqaWZmaWVzKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCS8qIEFsbG9jYXRlIGZyYW1lICovCisJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJaWYgKCF0eF9za2IpCisJCXJldHVybjsKKworCWZyYW1lID0gKHN0cnVjdCB1YV9mcmFtZSAqKSBza2JfcHV0KHR4X3NrYiwgMTApOworCisJLyogQnVpbGQgVUEgcmVzcG9uc2UgKi8KKwlmcmFtZS0+Y2FkZHIgPSBzZWxmLT5jYWRkcjsKKwlmcmFtZS0+Y29udHJvbCA9IFVBX1JTUCB8IFBGX0JJVDsKKworCWZyYW1lLT5zYWRkciA9IGNwdV90b19sZTMyKHNlbGYtPnNhZGRyKTsKKwlmcmFtZS0+ZGFkZHIgPSBjcHVfdG9fbGUzMihzZWxmLT5kYWRkcik7CisKKwkvKiBTaG91bGQgd2Ugc2VuZCBRb1MgbmVnb3RpYXRpb24gcGFyYW1ldGVycz8gKi8KKwlpZiAocW9zKSB7CisJCXJldCA9IGlybGFwX2luc2VydF9xb3NfbmVnb3RpYXRpb25fcGFyYW1zKHNlbGYsIHR4X3NrYik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfa2ZyZWVfc2tiKHR4X3NrYik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpcmxhcF9xdWV1ZV94bWl0KHNlbGYsIHR4X3NrYik7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3NlbmRfZG1fZnJhbWUgKHZvaWQpCisgKgorICogICAgU2VuZCBkaXNjb25uZWN0ZWQgbW9kZSAoRE0pIGZyYW1lCisgKgorICovCit2b2lkIGlybGFwX3NlbmRfZG1fZnJhbWUoIHN0cnVjdCBpcmxhcF9jYiAqc2VsZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiID0gTlVMTDsKKwlfX3U4ICpmcmFtZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCXR4X3NrYiA9IGRldl9hbGxvY19za2IoMzIpOworCWlmICghdHhfc2tiKQorCQlyZXR1cm47CisKKwlmcmFtZSA9IHNrYl9wdXQodHhfc2tiLCAyKTsKKworCWlmIChzZWxmLT5zdGF0ZSA9PSBMQVBfTkRNKQorCQlmcmFtZVswXSA9IENCUk9BRENBU1Q7CisJZWxzZQorCQlmcmFtZVswXSA9IHNlbGYtPmNhZGRyOworCisJZnJhbWVbMV0gPSBETV9SU1AgfCBQRl9CSVQ7CisKKwlpcmxhcF9xdWV1ZV94bWl0KHNlbGYsIHR4X3NrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zZW5kX2Rpc2NfZnJhbWUgKHZvaWQpCisgKgorICogICAgU2VuZCBkaXNjb25uZWN0IChESVNDKSBmcmFtZQorICoKKyAqLwordm9pZCBpcmxhcF9zZW5kX2Rpc2NfZnJhbWUoc3RydWN0IGlybGFwX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2IgPSBOVUxMOworCV9fdTggKmZyYW1lOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCXR4X3NrYiA9IGRldl9hbGxvY19za2IoMTYpOworCWlmICghdHhfc2tiKQorCQlyZXR1cm47CisKKwlmcmFtZSA9IHNrYl9wdXQodHhfc2tiLCAyKTsKKworCWZyYW1lWzBdID0gc2VsZi0+Y2FkZHIgfCBDTURfRlJBTUU7CisJZnJhbWVbMV0gPSBESVNDX0NNRCB8IFBGX0JJVDsKKworCWlybGFwX3F1ZXVlX3htaXQoc2VsZiwgdHhfc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3NlbmRfZGlzY292ZXJ5X3hpZF9mcmFtZSAoUywgcywgY29tbWFuZCkKKyAqCisgKiAgICBCdWlsZCBhbmQgdHJhbnNtaXQgYSBYSUQgKGVYY2hhbmdlIHN0YXRpb24gSURlbnRpZmllcikgZGlzY292ZXJ5CisgKiAgICBmcmFtZS4KKyAqLwordm9pZCBpcmxhcF9zZW5kX2Rpc2NvdmVyeV94aWRfZnJhbWUoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgUywgX191OCBzLAorCQkJCSAgICBfX3U4IGNvbW1hbmQsIGRpc2NvdmVyeV90ICpkaXNjb3ZlcnkpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYiA9IE5VTEw7CisJc3RydWN0IHhpZF9mcmFtZSAqZnJhbWU7CisJX191MzIgYmNhc3QgPSBCUk9BRENBU1Q7CisJX191OCAqaW5mbzsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIHM9JWQsIFM9JWQsIGNvbW1hbmQ9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgcywgUywgY29tbWFuZCk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoZGlzY292ZXJ5ICE9IE5VTEwsIHJldHVybjspOworCisJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJaWYgKCF0eF9za2IpCisJCXJldHVybjsKKworCXNrYl9wdXQodHhfc2tiLCAxNCk7CisJZnJhbWUgPSAoc3RydWN0IHhpZF9mcmFtZSAqKSB0eF9za2ItPmRhdGE7CisKKwlpZiAoY29tbWFuZCkgeworCQlmcmFtZS0+Y2FkZHIgPSBDQlJPQURDQVNUIHwgQ01EX0ZSQU1FOworCQlmcmFtZS0+Y29udHJvbCA9ICBYSURfQ01EIHwgUEZfQklUOworCX0gZWxzZSB7CisJCWZyYW1lLT5jYWRkciA9IENCUk9BRENBU1Q7CisJCWZyYW1lLT5jb250cm9sID0gIFhJRF9SU1AgfCBQRl9CSVQ7CisJfQorCWZyYW1lLT5pZGVudCA9IFhJRF9GT1JNQVQ7CisKKwlmcmFtZS0+c2FkZHIgPSBjcHVfdG9fbGUzMihzZWxmLT5zYWRkcik7CisKKwlpZiAoY29tbWFuZCkKKwkJZnJhbWUtPmRhZGRyID0gY3B1X3RvX2xlMzIoYmNhc3QpOworCWVsc2UKKwkJZnJhbWUtPmRhZGRyID0gY3B1X3RvX2xlMzIoZGlzY292ZXJ5LT5kYXRhLmRhZGRyKTsKKworCXN3aXRjaCAoUykgeworCWNhc2UgMToKKwkJZnJhbWUtPmZsYWdzID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlmcmFtZS0+ZmxhZ3MgPSAweDAxOworCQlicmVhazsKKwljYXNlIDg6CisJCWZyYW1lLT5mbGFncyA9IDB4MDI7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWZyYW1lLT5mbGFncyA9IDB4MDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZyYW1lLT5mbGFncyA9IDB4MDI7CisJCWJyZWFrOworCX0KKworCWZyYW1lLT5zbG90bnIgPSBzOworCWZyYW1lLT52ZXJzaW9uID0gMHgwMDsKKworCS8qCisJICogIFByb3ZpZGUgaW5mbyBmb3IgZmluYWwgc2xvdCBvbmx5IGluIGNvbW1hbmRzLCBhbmQgZm9yIGFsbAorCSAqICByZXNwb25zZXMuIFNlbmQgdGhlIHNlY29uZCBieXRlIG9mIHRoZSBoaW50IG9ubHkgaWYgdGhlCisJICogIEVYVEVOU0lPTiBiaXQgaXMgc2V0IGluIHRoZSBmaXJzdCBieXRlLgorCSAqLworCWlmICghY29tbWFuZCB8fCAoZnJhbWUtPnNsb3RuciA9PSAweGZmKSkgeworCQlpbnQgbGVuOworCisJCWlmIChkaXNjb3ZlcnktPmRhdGEuaGludHNbMF0gJiBISU5UX0VYVEVOU0lPTikgeworCQkJaW5mbyA9IHNrYl9wdXQodHhfc2tiLCAyKTsKKwkJCWluZm9bMF0gPSBkaXNjb3ZlcnktPmRhdGEuaGludHNbMF07CisJCQlpbmZvWzFdID0gZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzFdOworCQl9IGVsc2UgeworCQkJaW5mbyA9IHNrYl9wdXQodHhfc2tiLCAxKTsKKwkJCWluZm9bMF0gPSBkaXNjb3ZlcnktPmRhdGEuaGludHNbMF07CisJCX0KKwkJaW5mbyA9IHNrYl9wdXQodHhfc2tiLCAxKTsKKwkJaW5mb1swXSA9IGRpc2NvdmVyeS0+ZGF0YS5jaGFyc2V0OworCisJCWxlbiA9IElSREFfTUlOKGRpc2NvdmVyeS0+bmFtZV9sZW4sIHNrYl90YWlscm9vbSh0eF9za2IpKTsKKwkJaW5mbyA9IHNrYl9wdXQodHhfc2tiLCBsZW4pOworCQltZW1jcHkoaW5mbywgZGlzY292ZXJ5LT5kYXRhLmluZm8sIGxlbik7CisJfQorCWlybGFwX3F1ZXVlX3htaXQoc2VsZiwgdHhfc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3JlY3ZfZGlzY292ZXJ5X3hpZF9yc3AgKHNrYiwgaW5mbykKKyAqCisgKiAgICBSZWNlaXZlZCBhIFhJRCBkaXNjb3ZlcnkgcmVzcG9uc2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFwX3JlY3ZfZGlzY292ZXJ5X3hpZF9yc3Aoc3RydWN0IGlybGFwX2NiICpzZWxmLAorCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCXN0cnVjdCB4aWRfZnJhbWUgKnhpZDsKKwlkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5ID0gTlVMTDsKKwlfX3U4ICpkaXNjb3ZlcnlfaW5mbzsKKwljaGFyICp0ZXh0OworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgeGlkX2ZyYW1lKSkpIHsKKwkJSVJEQV9FUlJPUigiJXM6IGZyYW1lIHRvIHNob3J0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwkJCisJeGlkID0gKHN0cnVjdCB4aWRfZnJhbWUgKikgc2tiLT5kYXRhOworCisJaW5mby0+ZGFkZHIgPSBsZTMyX3RvX2NwdSh4aWQtPnNhZGRyKTsKKwlpbmZvLT5zYWRkciA9IGxlMzJfdG9fY3B1KHhpZC0+ZGFkZHIpOworCisJLyogTWFrZSBzdXJlIGZyYW1lIGlzIGFkZHJlc3NlZCB0byB1cyAqLworCWlmICgoaW5mby0+c2FkZHIgIT0gc2VsZi0+c2FkZHIpICYmIChpbmZvLT5zYWRkciAhPSBCUk9BRENBU1QpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGZyYW1lIGlzIG5vdCBhZGRyZXNzZWQgdG8gdXMhXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoZGlzY292ZXJ5ID0ga21hbGxvYyhzaXplb2YoZGlzY292ZXJ5X3QpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBrbWFsbG9jIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KGRpc2NvdmVyeSwgMCwgc2l6ZW9mKGRpc2NvdmVyeV90KSk7CisKKwlkaXNjb3ZlcnktPmRhdGEuZGFkZHIgPSBpbmZvLT5kYWRkcjsKKwlkaXNjb3ZlcnktPmRhdGEuc2FkZHIgPSBzZWxmLT5zYWRkcjsKKwlkaXNjb3ZlcnktPnRpbWVzdGFtcCA9IGppZmZpZXM7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBkYWRkcj0lMDh4XG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIGRpc2NvdmVyeS0+ZGF0YS5kYWRkcik7CisKKwlkaXNjb3ZlcnlfaW5mbyA9IHNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB4aWRfZnJhbWUpKTsKKworCS8qIEdldCBpbmZvIHJldHVybmVkIGZyb20gcGVlciAqLworCWRpc2NvdmVyeS0+ZGF0YS5oaW50c1swXSA9IGRpc2NvdmVyeV9pbmZvWzBdOworCWlmIChkaXNjb3ZlcnlfaW5mb1swXSAmIEhJTlRfRVhURU5TSU9OKSB7CisJCUlSREFfREVCVUcoNCwgIkVYVEVOU0lPTlxuIik7CisJCWRpc2NvdmVyeS0+ZGF0YS5oaW50c1sxXSA9IGRpc2NvdmVyeV9pbmZvWzFdOworCQlkaXNjb3ZlcnktPmRhdGEuY2hhcnNldCA9IGRpc2NvdmVyeV9pbmZvWzJdOworCQl0ZXh0ID0gKGNoYXIgKikgJmRpc2NvdmVyeV9pbmZvWzNdOworCX0gZWxzZSB7CisJCWRpc2NvdmVyeS0+ZGF0YS5oaW50c1sxXSA9IDA7CisJCWRpc2NvdmVyeS0+ZGF0YS5jaGFyc2V0ID0gZGlzY292ZXJ5X2luZm9bMV07CisJCXRleHQgPSAoY2hhciAqKSAmZGlzY292ZXJ5X2luZm9bMl07CisJfQorCS8qCisJICogIFRlcm1pbmF0ZSBpbmZvIHN0cmluZywgc2hvdWxkIGJlIHNhZmUgc2luY2UgdGhpcyBpcyB3aGVyZSB0aGUKKwkgKiAgRkNTIGJ5dGVzIHJlc2lkZXMuCisJICovCisJc2tiLT5kYXRhW3NrYi0+bGVuXSA9ICdcMCc7CisJc3RybmNweShkaXNjb3ZlcnktPmRhdGEuaW5mbywgdGV4dCwgTklDS05BTUVfTUFYX0xFTik7CisJZGlzY292ZXJ5LT5uYW1lX2xlbiA9IHN0cmxlbihkaXNjb3ZlcnktPmRhdGEuaW5mbyk7CisKKwlpbmZvLT5kaXNjb3ZlcnkgPSBkaXNjb3Zlcnk7CisKKwlpcmxhcF9kb19ldmVudChzZWxmLCBSRUNWX0RJU0NPVkVSWV9YSURfUlNQLCBza2IsIGluZm8pOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcmVjdl9kaXNjb3ZlcnlfeGlkX2NtZCAoc2tiLCBpbmZvKQorICoKKyAqICAgIFJlY2VpdmVkIGEgWElEIGRpc2NvdmVyeSBjb21tYW5kCisgKgorICovCitzdGF0aWMgdm9pZCBpcmxhcF9yZWN2X2Rpc2NvdmVyeV94aWRfY21kKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwKKwkJCQkJIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgeGlkX2ZyYW1lICp4aWQ7CisJZGlzY292ZXJ5X3QgKmRpc2NvdmVyeSA9IE5VTEw7CisJX191OCAqZGlzY292ZXJ5X2luZm87CisJY2hhciAqdGV4dDsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgeGlkX2ZyYW1lKSkpIHsKKwkJSVJEQV9FUlJPUigiJXM6IGZyYW1lIHRvIHNob3J0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwkKKwl4aWQgPSAoc3RydWN0IHhpZF9mcmFtZSAqKSBza2ItPmRhdGE7CisKKwlpbmZvLT5kYWRkciA9IGxlMzJfdG9fY3B1KHhpZC0+c2FkZHIpOworCWluZm8tPnNhZGRyID0gbGUzMl90b19jcHUoeGlkLT5kYWRkcik7CisKKwkvKiBNYWtlIHN1cmUgZnJhbWUgaXMgYWRkcmVzc2VkIHRvIHVzICovCisJaWYgKChpbmZvLT5zYWRkciAhPSBzZWxmLT5zYWRkcikgJiYgKGluZm8tPnNhZGRyICE9IEJST0FEQ0FTVCkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZnJhbWUgaXMgbm90IGFkZHJlc3NlZCB0byB1cyFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoICh4aWQtPmZsYWdzICYgMHgwMykgeworCWNhc2UgMHgwMDoKKwkJaW5mby0+UyA9IDE7CisJCWJyZWFrOworCWNhc2UgMHgwMToKKwkJaW5mby0+UyA9IDY7CisJCWJyZWFrOworCWNhc2UgMHgwMjoKKwkJaW5mby0+UyA9IDg7CisJCWJyZWFrOworCWNhc2UgMHgwMzoKKwkJaW5mby0+UyA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBFcnJvciEhICovCisJCXJldHVybjsKKwl9CisJaW5mby0+cyA9IHhpZC0+c2xvdG5yOworCisJZGlzY292ZXJ5X2luZm8gPSBza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgeGlkX2ZyYW1lKSk7CisKKwkvKgorCSAqICBDaGVjayBpZiBsYXN0IGZyYW1lCisJICovCisJaWYgKGluZm8tPnMgPT0gMHhmZikgeworCQkvKiBDaGVjayBpZiB0aGluZ3MgYXJlIHNhbmUgYXQgdGhpcyBwb2ludC4uLiAqLworCQlpZigoZGlzY292ZXJ5X2luZm8gPT0gTlVMTCkgfHwgCisJCSAgICFwc2tiX21heV9wdWxsKHNrYiwgMykpIHsKKwkJCUlSREFfRVJST1IoIiVzOiBkaXNjb3ZlcnkgZnJhbWUgdG8gc2hvcnQhXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKgorCQkgKiAgV2Ugbm93IGhhdmUgc29tZSBkaXNjb3ZlcnkgaW5mbyB0byBkZWxpdmVyIQorCQkgKi8KKwkJZGlzY292ZXJ5ID0ga21hbGxvYyhzaXplb2YoZGlzY292ZXJ5X3QpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFkaXNjb3ZlcnkpIHsKKwkJCUlSREFfV0FSTklORygiJXM6IHVuYWJsZSB0byBtYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuOworCQl9CisKKwkJZGlzY292ZXJ5LT5kYXRhLmRhZGRyID0gaW5mby0+ZGFkZHI7CisJCWRpc2NvdmVyeS0+ZGF0YS5zYWRkciA9IHNlbGYtPnNhZGRyOworCQlkaXNjb3ZlcnktPnRpbWVzdGFtcCA9IGppZmZpZXM7CisKKwkJZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzBdID0gZGlzY292ZXJ5X2luZm9bMF07CisJCWlmIChkaXNjb3ZlcnlfaW5mb1swXSAmIEhJTlRfRVhURU5TSU9OKSB7CisJCQlkaXNjb3ZlcnktPmRhdGEuaGludHNbMV0gPSBkaXNjb3ZlcnlfaW5mb1sxXTsKKwkJCWRpc2NvdmVyeS0+ZGF0YS5jaGFyc2V0ID0gZGlzY292ZXJ5X2luZm9bMl07CisJCQl0ZXh0ID0gKGNoYXIgKikgJmRpc2NvdmVyeV9pbmZvWzNdOworCQl9IGVsc2UgeworCQkJZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzFdID0gMDsKKwkJCWRpc2NvdmVyeS0+ZGF0YS5jaGFyc2V0ID0gZGlzY292ZXJ5X2luZm9bMV07CisJCQl0ZXh0ID0gKGNoYXIgKikgJmRpc2NvdmVyeV9pbmZvWzJdOworCQl9CisJCS8qCisJCSAqICBUZXJtaW5hdGUgc3RyaW5nLCBzaG91bGQgYmUgc2FmZSBzaW5jZSB0aGlzIGlzIHdoZXJlIHRoZQorCQkgKiAgRkNTIGJ5dGVzIHJlc2lkZXMuCisJCSAqLworCQlza2ItPmRhdGFbc2tiLT5sZW5dID0gJ1wwJzsKKwkJc3RybmNweShkaXNjb3ZlcnktPmRhdGEuaW5mbywgdGV4dCwgTklDS05BTUVfTUFYX0xFTik7CisJCWRpc2NvdmVyeS0+bmFtZV9sZW4gPSBzdHJsZW4oZGlzY292ZXJ5LT5kYXRhLmluZm8pOworCisJCWluZm8tPmRpc2NvdmVyeSA9IGRpc2NvdmVyeTsKKwl9IGVsc2UKKwkJaW5mby0+ZGlzY292ZXJ5ID0gTlVMTDsKKworCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfRElTQ09WRVJZX1hJRF9DTUQsIHNrYiwgaW5mbyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zZW5kX3JyX2ZyYW1lIChzZWxmLCBjb21tYW5kKQorICoKKyAqICAgIEJ1aWxkIGFuZCB0cmFuc21pdCBSUiAoUmVjZWl2ZSBSZWFkeSkgZnJhbWUuIE5vdGljZSB0aGF0IGl0IGlzIGN1cnJlbnRseQorICogICAgb25seSBwb3NzaWJsZSB0byBzZW5kIFJSIGZyYW1lcyB3aXRoIHRoZSBwb2xsIGJpdCBzZXQuCisgKi8KK3ZvaWQgaXJsYXBfc2VuZF9ycl9mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCBjb21tYW5kKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJX191OCAqZnJhbWU7CisKKwl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKDE2KTsKKwlpZiAoIXR4X3NrYikKKwkJcmV0dXJuOworCisJZnJhbWUgPSBza2JfcHV0KHR4X3NrYiwgMik7CisKKwlmcmFtZVswXSA9IHNlbGYtPmNhZGRyOworCWZyYW1lWzBdIHw9IChjb21tYW5kKSA/IENNRF9GUkFNRSA6IDA7CisKKwlmcmFtZVsxXSA9IFJSIHwgUEZfQklUIHwgKHNlbGYtPnZyIDw8IDUpOworCisJaXJsYXBfcXVldWVfeG1pdChzZWxmLCB0eF9za2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc2VuZF9yZF9mcmFtZSAoc2VsZikKKyAqCisgKiAgICBSZXF1ZXN0IGRpc2Nvbm5lY3QuIFVzZWQgYnkgYSBzZWNvbmRhcnkgc3RhdGlvbiB0byByZXF1ZXN0IHRoZQorICogICAgZGlzY29ubmVjdGlvbiBvZiB0aGUgbGluay4KKyAqLwordm9pZCBpcmxhcF9zZW5kX3JkX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCV9fdTggKmZyYW1lOworCisJdHhfc2tiID0gZGV2X2FsbG9jX3NrYigxNik7CisJaWYgKCF0eF9za2IpCisJCXJldHVybjsKKworCWZyYW1lID0gc2tiX3B1dCh0eF9za2IsIDIpOworCisJZnJhbWVbMF0gPSBzZWxmLT5jYWRkcjsKKwlmcmFtZVsxXSA9IFJEX1JTUCB8IFBGX0JJVDsKKworCWlybGFwX3F1ZXVlX3htaXQoc2VsZiwgdHhfc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3JlY3ZfcnJfZnJhbWUgKHNrYiwgaW5mbykKKyAqCisgKiAgICBSZWNlaXZlZCBSUiAoUmVjZWl2ZSBSZWFkeSkgZnJhbWUgZnJvbSBwZWVyIHN0YXRpb24sIG5vIGhhcm0gaW4KKyAqICAgIG1ha2luZyBpdCBpbmxpbmUgc2luY2UgaXRzIGNhbGxlZCBvbmx5IGZyb20gb25lIHNpbmdsZSBwbGFjZQorICogICAgKGlybGFwX2RyaXZlcl9yY3YpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJsYXBfcmVjdl9ycl9mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvLCBpbnQgY29tbWFuZCkKK3sKKwlpbmZvLT5uciA9IHNrYi0+ZGF0YVsxXSA+PiA1OworCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIGNvbW1hbmQgb3IgYSByZXNwb25zZSBmcmFtZSAqLworCWlmIChjb21tYW5kKQorCQlpcmxhcF9kb19ldmVudChzZWxmLCBSRUNWX1JSX0NNRCwgc2tiLCBpbmZvKTsKKwllbHNlCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfUlJfUlNQLCBza2IsIGluZm8pOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcmVjdl9ybnJfZnJhbWUgKHNlbGYsIHNrYiwgaW5mbykKKyAqCisgKiAgICBSZWNlaXZlZCBSTlIgKFJlY2VpdmUgTm90IFJlYWR5KSBmcmFtZSBmcm9tIHBlZXIgc3RhdGlvbgorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfcmVjdl9ybnJfZnJhbWUoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbywgaW50IGNvbW1hbmQpCit7CisJaW5mby0+bnIgPSBza2ItPmRhdGFbMV0gPj4gNTsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIG5yPSVkLCAlbGRcbiIsIF9fRlVOQ1RJT05fXywgaW5mby0+bnIsIGppZmZpZXMpOworCisJaWYgKGNvbW1hbmQpCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfUk5SX0NNRCwgc2tiLCBpbmZvKTsKKwllbHNlCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfUk5SX1JTUCwgc2tiLCBpbmZvKTsKK30KKworc3RhdGljIHZvaWQgaXJsYXBfcmVjdl9yZWpfZnJhbWUoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbywgaW50IGNvbW1hbmQpCit7CisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWluZm8tPm5yID0gc2tiLT5kYXRhWzFdID4+IDU7CisKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGEgY29tbWFuZCBvciBhIHJlc3BvbnNlIGZyYW1lICovCisJaWYgKGNvbW1hbmQpCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfUkVKX0NNRCwgc2tiLCBpbmZvKTsKKwllbHNlCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfUkVKX1JTUCwgc2tiLCBpbmZvKTsKK30KKworc3RhdGljIHZvaWQgaXJsYXBfcmVjdl9zcmVqX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvLCBpbnQgY29tbWFuZCkKK3sKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaW5mby0+bnIgPSBza2ItPmRhdGFbMV0gPj4gNTsKKworCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBjb21tYW5kIG9yIGEgcmVzcG9uc2UgZnJhbWUgKi8KKwlpZiAoY29tbWFuZCkKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9TUkVKX0NNRCwgc2tiLCBpbmZvKTsKKwllbHNlCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfU1JFSl9SU1AsIHNrYiwgaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIGlybGFwX3JlY3ZfZGlzY19mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbywgaW50IGNvbW1hbmQpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBjb21tYW5kIG9yIGEgcmVzcG9uc2UgZnJhbWUgKi8KKwlpZiAoY29tbWFuZCkKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9ESVNDX0NNRCwgc2tiLCBpbmZvKTsKKwllbHNlCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfUkRfUlNQLCBza2IsIGluZm8pOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcmVjdl91YV9mcmFtZSAoc2tiLCBmcmFtZSkKKyAqCisgKiAgICBSZWNlaXZlZCBVQSAoVW5udW1iZXJlZCBBY2tub3dsZWRnZW1lbnQpIGZyYW1lCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJsYXBfcmVjdl91YV9mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfVUFfUlNQLCBza2IsIGluZm8pOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc2VuZF9kYXRhX3ByaW1hcnkoc2VsZiwgc2tiKQorICoKKyAqICAgIFNlbmQgSS1mcmFtZXMgYXMgdGhlIHByaW1hcnkgc3RhdGlvbiBidXQgd2l0aG91dCB0aGUgcG9sbCBiaXQgc2V0CisgKgorICovCit2b2lkIGlybGFwX3NlbmRfZGF0YV9wcmltYXJ5KHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCisJaWYgKHNrYi0+ZGF0YVsxXSA9PSBJX0ZSQU1FKSB7CisKKwkJLyoKKwkJICogIEluc2VydCBmcmFtZSBzZXF1ZW5jZSBudW1iZXIgKFZzKSBpbiBjb250cm9sIGZpZWxkIGJlZm9yZQorCQkgKiAgaW5zZXJ0aW5nIGludG8gdHJhbnNtaXQgd2luZG93IHF1ZXVlLgorCQkgKi8KKwkJc2tiLT5kYXRhWzFdID0gSV9GUkFNRSB8IChzZWxmLT52cyA8PCAxKTsKKworCQkvKgorCQkgKiAgSW5zZXJ0IGZyYW1lIGluIHN0b3JlLCBpbiBjYXNlIG9mIHJldHJhbnNtaXNzaW9ucworCQkgKiAgSW5jcmVhc2Ugc2tiIHJlZmVyZW5jZSBjb3VudCwgc2VlIGlybGFwX2RvX2V2ZW50KCkKKwkJICovCisJCXNrYl9nZXQoc2tiKTsKKwkJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPnd4X2xpc3QsIHNrYik7CisKKwkJLyogQ29weSBidWZmZXIgKi8KKwkJdHhfc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmICh0eF9za2IgPT0gTlVMTCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJc2VsZi0+dnMgPSAoc2VsZi0+dnMgKyAxKSAlIDg7CisJCXNlbGYtPmFja19yZXF1aXJlZCA9IEZBTFNFOworCQlzZWxmLT53aW5kb3cgLT0gMTsKKworCQlpcmxhcF9zZW5kX2lfZnJhbWUoIHNlbGYsIHR4X3NrYiwgQ01EX0ZSQU1FKTsKKwl9IGVsc2UgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBzZW5kaW5nIHVucmVsaWFibGUgZnJhbWVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlybGFwX3NlbmRfdWlfZnJhbWUoc2VsZiwgc2tiX2dldChza2IpLCBzZWxmLT5jYWRkciwgQ01EX0ZSQU1FKTsKKwkJc2VsZi0+d2luZG93IC09IDE7CisJfQorfQorLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3NlbmRfZGF0YV9wcmltYXJ5X3BvbGwgKHNlbGYsIHNrYikKKyAqCisgKiAgICBTZW5kIEkobmZvcm1hdGlvbikgZnJhbWUgYXMgcHJpbWFyeSB3aXRoIHBvbGwgYml0IHNldAorICovCit2b2lkIGlybGFwX3NlbmRfZGF0YV9wcmltYXJ5X3BvbGwoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJaW50IHRyYW5zbWlzc2lvbl90aW1lOworCisJLyogU3RvcCBQIHRpbWVyICovCisJZGVsX3RpbWVyKCZzZWxmLT5wb2xsX3RpbWVyKTsKKworCS8qIElzIHRoaXMgcmVsaWFibGUgb3IgdW5yZWxpYWJsZSBkYXRhPyAqLworCWlmIChza2ItPmRhdGFbMV0gPT0gSV9GUkFNRSkgeworCisJCS8qCisJCSAqICBJbnNlcnQgZnJhbWUgc2VxdWVuY2UgbnVtYmVyIChWcykgaW4gY29udHJvbCBmaWVsZCBiZWZvcmUKKwkJICogIGluc2VydGluZyBpbnRvIHRyYW5zbWl0IHdpbmRvdyBxdWV1ZS4KKwkJICovCisJCXNrYi0+ZGF0YVsxXSA9IElfRlJBTUUgfCAoc2VsZi0+dnMgPDwgMSk7CisKKwkJLyoKKwkJICogIEluc2VydCBmcmFtZSBpbiBzdG9yZSwgaW4gY2FzZSBvZiByZXRyYW5zbWlzc2lvbnMKKwkJICogIEluY3JlYXNlIHNrYiByZWZlcmVuY2UgY291bnQsIHNlZSBpcmxhcF9kb19ldmVudCgpCisJCSAqLworCQlza2JfZ2V0KHNrYik7CisJCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT53eF9saXN0LCBza2IpOworCisJCS8qIENvcHkgYnVmZmVyICovCisJCXR4X3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAodHhfc2tiID09IE5VTEwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqICBTZXQgcG9sbCBiaXQgaWYgbmVjZXNzYXJ5LiBXZSBkbyB0aGlzIHRvIHRoZSBjb3BpZWQKKwkJICogIHNrYiwgc2luY2UgcmV0cmFuc21pdHRlZCBuZWVkIHRvIHNldCBvciBjbGVhciB0aGUgcG9sbAorCQkgKiAgYml0IGRlcGVuZGluZyBvbiB3aGVuIHRoZXkgYXJlIHNlbnQuCisJCSAqLworCQl0eF9za2ItPmRhdGFbMV0gfD0gUEZfQklUOworCisJCXNlbGYtPnZzID0gKHNlbGYtPnZzICsgMSkgJSA4OworCQlzZWxmLT5hY2tfcmVxdWlyZWQgPSBGQUxTRTsKKworCQlpcmxhcF9zZW5kX2lfZnJhbWUoc2VsZiwgdHhfc2tiLCBDTURfRlJBTUUpOworCX0gZWxzZSB7CisJCUlSREFfREVCVUcoNCwgIiVzKCksIHNlbmRpbmcgdW5yZWxpYWJsZSBmcmFtZVxuIiwgX19GVU5DVElPTl9fKTsKKworCQlpZiAoc2VsZi0+YWNrX3JlcXVpcmVkKSB7CisJCQlpcmxhcF9zZW5kX3VpX2ZyYW1lKHNlbGYsIHNrYl9nZXQoc2tiKSwgc2VsZi0+Y2FkZHIsIENNRF9GUkFNRSk7CisJCQlpcmxhcF9zZW5kX3JyX2ZyYW1lKHNlbGYsIENNRF9GUkFNRSk7CisJCQlzZWxmLT5hY2tfcmVxdWlyZWQgPSBGQUxTRTsKKwkJfSBlbHNlIHsKKwkJCXNrYi0+ZGF0YVsxXSB8PSBQRl9CSVQ7CisJCQlpcmxhcF9zZW5kX3VpX2ZyYW1lKHNlbGYsIHNrYl9nZXQoc2tiKSwgc2VsZi0+Y2FkZHIsIENNRF9GUkFNRSk7CisJCX0KKwl9CisKKwkvKiBIb3cgbXVjaCB0aW1lIHdlIHRvb2sgZm9yIHRyYW5zbWlzc2lvbiBvZiBhbGwgZnJhbWVzLgorCSAqIFdlIGRvbid0IGtub3csIHNvIGxldCBhc3N1bWUgd2UgdXNlZCB0aGUgZnVsbCB3aW5kb3cuIEplYW4gSUkgKi8KKwl0cmFuc21pc3Npb25fdGltZSA9IHNlbGYtPmZpbmFsX3RpbWVvdXQ7CisKKwkvKiBSZXNldCBwYXJhbWV0ZXIgc28gdGhhdCB3ZSBjYW4gZmlsbCBuZXh0IHdpbmRvdyAqLworCXNlbGYtPndpbmRvdyA9IHNlbGYtPndpbmRvd19zaXplOworCisjaWZkZWYgQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cKKwkvKiBSZW1vdmUgd2hhdCB3ZSBoYXZlIG5vdCB1c2VkLiBKdXN0IGRvIGEgcHJvcmF0YSBvZiB0aGUKKwkgKiBieXRlcyBsZWZ0IGluIHdpbmRvdyB0byB3aW5kb3cgY2FwYWNpdHkuCisJICogU2VlIG1heF9saW5lX2NhcGFjaXRpZXNbXVtdIGluIHFvcy5jIGZvciBkZXRhaWxzLiBKZWFuIElJICovCisJdHJhbnNtaXNzaW9uX3RpbWUgLT0gKHNlbGYtPmZpbmFsX3RpbWVvdXQgKiBzZWxmLT5ieXRlc19sZWZ0CisJCQkgICAgICAvIHNlbGYtPmxpbmVfY2FwYWNpdHkpOworCUlSREFfREVCVUcoNCwgIiVzKCkgYWRqdXN0aW5nIHRyYW5zbWlzc2lvbl90aW1lIDogZnQ9JWQsIGJsPSVkLCBsYz0lZCAtPiB0dD0lZFxuIiwgX19GVU5DVElPTl9fLCBzZWxmLT5maW5hbF90aW1lb3V0LCBzZWxmLT5ieXRlc19sZWZ0LCBzZWxmLT5saW5lX2NhcGFjaXR5LCB0cmFuc21pc3Npb25fdGltZSk7CisKKwkvKiBXZSBhcmUgYWxsb3dlZCB0byB0cmFuc21pdCBhIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGFnYWluLiAqLworCXNlbGYtPmJ5dGVzX2xlZnQgPSBzZWxmLT5saW5lX2NhcGFjaXR5OworI2VuZGlmIC8qIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XICovCisKKwkvKgorCSAqIFRoZSBuZXR3b3JrIGxheWVyIGhhcyBhIGludGVybWVkaWF0ZSBidWZmZXIgYmV0d2VlbiBJckxBUAorCSAqIGFuZCB0aGUgSXJEQSBkcml2ZXIgd2hpY2ggY2FuIGNvbnRhaW4gOCBmcmFtZXMuIFNvLCBldmVuCisJICogdGhvdWdoIElyTEFQIGlzIGN1cnJlbnRseSBzZW5kaW5nIHRoZSAqbGFzdCogZnJhbWUgb2YgdGhlCisJICogdHgtd2luZG93LCB0aGUgZHJpdmVyIG1vc3QgbGlrZWx5IGhhcyBvbmx5IGp1c3Qgc3RhcnRlZAorCSAqIHNlbmRpbmcgdGhlICpmaXJzdCogZnJhbWUgb2YgdGhlIHNhbWUgdHgtd2luZG93LgorCSAqIEkuZS4gd2UgYXJlIGFsd2F5cyBhdCB0aGUgdmVyeSBiZWdpbmluZyBvZiBvciBUeCB3aW5kb3cuCisJICogTm93LCB3ZSBhcmUgc3VwcG9zZWQgdG8gc2V0IHRoZSBmaW5hbCB0aW1lciBmcm9tIHRoZSBlbmQKKwkgKiBvZiBvdXIgdHgtd2luZG93IHRvIGxldCB0aGUgb3RoZXIgcGVlciByZXBseS4gU28sIHdlIG5lZWQKKwkgKiB0byBhZGQgZXh0cmEgdGltZSB0byBjb21wZW5zYXRlIGZvciB0aGUgZmFjdCB0aGF0IHdlCisJICogYXJlIHJlYWxseSBhdCB0aGUgc3RhcnQgb2YgdHgtd2luZG93LCBvdGhlcndpc2UgdGhlIGZpbmFsIHRpbWVyCisJICogbWlnaHQgZXhwaXJlIGJlZm9yZSBoZSBjYW4gYW5zd2VyLi4uCisJICogSmVhbiBJSQorCSAqLworCWlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHNlbGYsIHNlbGYtPmZpbmFsX3RpbWVvdXQgKyB0cmFuc21pc3Npb25fdGltZSk7CisKKwkvKgorCSAqIFRoZSBjbGV2ZXIgYW1vbmdzdCB5b3UgbWlnaHQgYXNrIHdoeSB3ZSBkbyB0aGlzIGFkanVzdGVtZW50CisJICogb25seSBoZXJlLCBhbmQgbm90IGluIGFsbCB0aGUgb3RoZXIgY2FzZXMgaW4gaXJsYXBfZXZlbnQuYy4KKwkgKiBJbiBhbGwgdGhvc2Ugb3RoZXIgY2FzZSwgd2Ugb25seSBzZW5kIGEgdmVyeSBzaG9ydCBtYW5hZ2VtZW50CisJICogZnJhbWUgKGZldyBieXRlcyksIHNvIHRoZSBhZGp1c3RlbWVudCB3b3VsZCBiZSBsb3N0IGluIHRoZQorCSAqIG5vaXNlLi4uCisJICogVGhlIGV4Y2VwdGlvbiBvZiBjb3Vyc2UgaXMgaXJsYXBfcmVzZW5kX3JlamVjdGVkX2ZyYW1lKCkuCisJICogSmVhbiBJSSAqLworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc2VuZF9kYXRhX3NlY29uZGFyeV9maW5hbCAoc2VsZiwgc2tiKQorICoKKyAqICAgIFNlbmQgSShuZm9ybWF0aW9uKSBmcmFtZSBhcyBzZWNvbmRhcnkgd2l0aCBmaW5hbCBiaXQgc2V0CisgKgorICovCit2b2lkIGlybGFwX3NlbmRfZGF0YV9zZWNvbmRhcnlfZmluYWwoc3RydWN0IGlybGFwX2NiICpzZWxmLAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiID0gTlVMTDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwkvKiBJcyB0aGlzIHJlbGlhYmxlIG9yIHVucmVsaWFibGUgZGF0YT8gKi8KKwlpZiAoc2tiLT5kYXRhWzFdID09IElfRlJBTUUpIHsKKworCQkvKgorCQkgKiAgSW5zZXJ0IGZyYW1lIHNlcXVlbmNlIG51bWJlciAoVnMpIGluIGNvbnRyb2wgZmllbGQgYmVmb3JlCisJCSAqICBpbnNlcnRpbmcgaW50byB0cmFuc21pdCB3aW5kb3cgcXVldWUuCisJCSAqLworCQlza2ItPmRhdGFbMV0gPSBJX0ZSQU1FIHwgKHNlbGYtPnZzIDw8IDEpOworCisJCS8qCisJCSAqICBJbnNlcnQgZnJhbWUgaW4gc3RvcmUsIGluIGNhc2Ugb2YgcmV0cmFuc21pc3Npb25zCisJCSAqICBJbmNyZWFzZSBza2IgcmVmZXJlbmNlIGNvdW50LCBzZWUgaXJsYXBfZG9fZXZlbnQoKQorCQkgKi8KKwkJc2tiX2dldChza2IpOworCQlza2JfcXVldWVfdGFpbCgmc2VsZi0+d3hfbGlzdCwgc2tiKTsKKworCQl0eF9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHR4X3NrYiA9PSBOVUxMKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl0eF9za2ItPmRhdGFbMV0gfD0gUEZfQklUOworCisJCXNlbGYtPnZzID0gKHNlbGYtPnZzICsgMSkgJSA4OworCQlzZWxmLT5hY2tfcmVxdWlyZWQgPSBGQUxTRTsKKworCQlpcmxhcF9zZW5kX2lfZnJhbWUoc2VsZiwgdHhfc2tiLCBSU1BfRlJBTUUpOworCX0gZWxzZSB7CisJCWlmIChzZWxmLT5hY2tfcmVxdWlyZWQpIHsKKwkJCWlybGFwX3NlbmRfdWlfZnJhbWUoc2VsZiwgc2tiX2dldChza2IpLCBzZWxmLT5jYWRkciwgUlNQX0ZSQU1FKTsKKwkJCWlybGFwX3NlbmRfcnJfZnJhbWUoc2VsZiwgUlNQX0ZSQU1FKTsKKwkJCXNlbGYtPmFja19yZXF1aXJlZCA9IEZBTFNFOworCQl9IGVsc2UgeworCQkJc2tiLT5kYXRhWzFdIHw9IFBGX0JJVDsKKwkJCWlybGFwX3NlbmRfdWlfZnJhbWUoc2VsZiwgc2tiX2dldChza2IpLCBzZWxmLT5jYWRkciwgUlNQX0ZSQU1FKTsKKwkJfQorCX0KKworCXNlbGYtPndpbmRvdyA9IHNlbGYtPndpbmRvd19zaXplOworI2lmZGVmIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XCisJLyogV2UgYXJlIGFsbG93ZWQgdG8gdHJhbnNtaXQgYSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBhZ2Fpbi4gKi8KKwlzZWxmLT5ieXRlc19sZWZ0ID0gc2VsZi0+bGluZV9jYXBhY2l0eTsKKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLworCisJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgc2VsZi0+d2RfdGltZW91dCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zZW5kX2RhdGFfc2Vjb25kYXJ5IChzZWxmLCBza2IpCisgKgorICogICAgU2VuZCBJKG5mb3JtYXRpb24pIGZyYW1lIGFzIHNlY29uZGFyeSB3aXRob3V0IGZpbmFsIGJpdCBzZXQKKyAqCisgKi8KK3ZvaWQgaXJsYXBfc2VuZF9kYXRhX3NlY29uZGFyeShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYiA9IE5VTEw7CisKKwkvKiBJcyB0aGlzIHJlbGlhYmxlIG9yIHVucmVsaWFibGUgZGF0YT8gKi8KKwlpZiAoc2tiLT5kYXRhWzFdID09IElfRlJBTUUpIHsKKworCQkvKgorCQkgKiAgSW5zZXJ0IGZyYW1lIHNlcXVlbmNlIG51bWJlciAoVnMpIGluIGNvbnRyb2wgZmllbGQgYmVmb3JlCisJCSAqICBpbnNlcnRpbmcgaW50byB0cmFuc21pdCB3aW5kb3cgcXVldWUuCisJCSAqLworCQlza2ItPmRhdGFbMV0gPSBJX0ZSQU1FIHwgKHNlbGYtPnZzIDw8IDEpOworCisJCS8qCisJCSAqICBJbnNlcnQgZnJhbWUgaW4gc3RvcmUsIGluIGNhc2Ugb2YgcmV0cmFuc21pc3Npb25zCisJCSAqICBJbmNyZWFzZSBza2IgcmVmZXJlbmNlIGNvdW50LCBzZWUgaXJsYXBfZG9fZXZlbnQoKQorCQkgKi8KKwkJc2tiX2dldChza2IpOworCQlza2JfcXVldWVfdGFpbCgmc2VsZi0+d3hfbGlzdCwgc2tiKTsKKworCQl0eF9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHR4X3NrYiA9PSBOVUxMKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlzZWxmLT52cyA9IChzZWxmLT52cyArIDEpICUgODsKKwkJc2VsZi0+YWNrX3JlcXVpcmVkID0gRkFMU0U7CisJCXNlbGYtPndpbmRvdyAtPSAxOworCisJCWlybGFwX3NlbmRfaV9mcmFtZShzZWxmLCB0eF9za2IsIFJTUF9GUkFNRSk7CisJfSBlbHNlIHsKKwkJaXJsYXBfc2VuZF91aV9mcmFtZShzZWxmLCBza2JfZ2V0KHNrYiksIHNlbGYtPmNhZGRyLCBSU1BfRlJBTUUpOworCQlzZWxmLT53aW5kb3cgLT0gMTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9yZXNlbmRfcmVqZWN0ZWRfZnJhbWVzIChucikKKyAqCisgKiAgICBSZXNlbmQgZnJhbWVzIHdoaWNoIGhhcyBub3QgYmVlbiBhY2tub3dsZWRnZWQuIFNob3VsZCBiZSBzYWZlIHRvCisgKiAgICB0cmF2ZXJzZSB0aGUgbGlzdCB3aXRob3V0IGxvY2tpbmcgaXQgc2luY2UgdGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgYmUKKyAqICAgIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0IChCSCkKKyAqLwordm9pZCBpcmxhcF9yZXNlbmRfcmVqZWN0ZWRfZnJhbWVzKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IGNvbW1hbmQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBjb3VudDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCisJY291bnQgPSBza2JfcXVldWVfbGVuKCZzZWxmLT53eF9saXN0KTsKKworCS8qICBSZXNlbmQgdW5hY2tub3dsZWRnZWQgZnJhbWUocykgKi8KKwlza2IgPSBza2JfcGVlaygmc2VsZi0+d3hfbGlzdCk7CisJd2hpbGUgKHNrYiAhPSBOVUxMKSB7CisJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCisJCS8qIFdlIGNvcHkgdGhlIHNrYiB0byBiZSByZXRyYW5zbWl0dGVkIHNpbmNlIHdlIHdpbGwgaGF2ZSB0bworCQkgKiBtb2RpZnkgaXQuIENsb25pbmcgd2lsbCBjb25mdXNlIHBhY2tldCBzbmlmZmVycworCQkgKi8KKwkJLyogdHhfc2tiID0gc2tiX2Nsb25lKCBza2IsIEdGUF9BVE9NSUMpOyAqLworCQl0eF9za2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAoIXR4X3NrYikgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIGNvcHlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogVW5saW5rIHR4X3NrYiBmcm9tIGxpc3QgKi8KKwkJdHhfc2tiLT5uZXh0ID0gdHhfc2tiLT5wcmV2ID0gTlVMTDsKKwkJdHhfc2tiLT5saXN0ID0gTlVMTDsKKworCQkvKiBDbGVhciBvbGQgTnIgZmllbGQgKyBwb2xsIGJpdCAqLworCQl0eF9za2ItPmRhdGFbMV0gJj0gMHgwZjsKKworCQkvKgorCQkgKiAgU2V0IHBvbGwgYml0IG9uIHRoZSBsYXN0IGZyYW1lIHJldHJhbnNtaXR0ZWQKKwkJICovCisJCWlmIChjb3VudC0tID09IDEpCisJCQl0eF9za2ItPmRhdGFbMV0gfD0gUEZfQklUOyAvKiBTZXQgcC9mIGJpdCAqLworCQllbHNlCisJCQl0eF9za2ItPmRhdGFbMV0gJj0gflBGX0JJVDsgLyogQ2xlYXIgcC9mIGJpdCAqLworCisJCWlybGFwX3NlbmRfaV9mcmFtZShzZWxmLCB0eF9za2IsIGNvbW1hbmQpOworCisJCS8qCisJCSAqICBJZiBvdXIgc2tiIGlzIHRoZSBsYXN0IGJ1ZmZlciBpbiB0aGUgbGlzdCwgdGhlbgorCQkgKiAgd2UgYXJlIGZpbmlzaGVkLCBpZiBub3QsIG1vdmUgdG8gdGhlIG5leHQgc2stYnVmZmVyCisJCSAqLworCQlpZiAoc2tiID09IHNrYl9wZWVrX3RhaWwoJnNlbGYtPnd4X2xpc3QpKQorCQkJc2tiID0gTlVMTDsKKwkJZWxzZQorCQkJc2tiID0gc2tiLT5uZXh0OworCX0KKyNpZiAwIC8qIE5vdCB5ZXQgKi8KKwkvKgorCSAqICBXZSBjYW4gbm93IGZpbGwgdGhlIHdpbmRvdyB3aXRoIGFkZGl0aW9uYWwgZGF0YSBmcmFtZXMKKwkgKi8KKwl3aGlsZSAoc2tiX3F1ZXVlX2xlbiggJnNlbGYtPnR4cSkgPiAwKSB7CisKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgc2VuZGluZyBhZGRpdGlvbmFsIGZyYW1lcyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmICgoc2tiX3F1ZXVlX2xlbiggJnNlbGYtPnR4cSkgPiAwKSAmJgorCQkgICAgKHNlbGYtPndpbmRvdyA+IDApKSB7CisJCQlza2IgPSBza2JfZGVxdWV1ZSggJnNlbGYtPnR4cSk7CisJCQlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwkJCS8qCisJCQkgKiAgSWYgc2VuZCB3aW5kb3cgPiAxIHRoZW4gc2VuZCBmcmFtZSB3aXRoIHBmCisJCQkgKiAgYml0IGNsZWFyZWQKKwkJCSAqLworCQkJaWYgKChzZWxmLT53aW5kb3cgPiAxKSAmJgorCQkJICAgIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkgPiAwKQorCQkJeworCQkJCWlybGFwX3NlbmRfZGF0YV9wcmltYXJ5KHNlbGYsIHNrYik7CisJCQl9IGVsc2UgeworCQkJCWlybGFwX3NlbmRfZGF0YV9wcmltYXJ5X3BvbGwoc2VsZiwgc2tiKTsKKwkJCX0KKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisJfQorI2VuZGlmCit9CisKK3ZvaWQgaXJsYXBfcmVzZW5kX3JlamVjdGVkX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IGNvbW1hbmQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJLyogIFJlc2VuZCB1bmFja25vd2xlZGdlZCBmcmFtZShzKSAqLworCXNrYiA9IHNrYl9wZWVrKCZzZWxmLT53eF9saXN0KTsKKwlpZiAoc2tiICE9IE5VTEwpIHsKKwkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisKKwkJLyogV2UgY29weSB0aGUgc2tiIHRvIGJlIHJldHJhbnNtaXR0ZWQgc2luY2Ugd2Ugd2lsbCBoYXZlIHRvCisJCSAqIG1vZGlmeSBpdC4gQ2xvbmluZyB3aWxsIGNvbmZ1c2UgcGFja2V0IHNuaWZmZXJzCisJCSAqLworCQkvKiB0eF9za2IgPSBza2JfY2xvbmUoIHNrYiwgR0ZQX0FUT01JQyk7ICovCisJCXR4X3NrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmICghdHhfc2tiKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmFibGUgdG8gY29weVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBVbmxpbmsgdHhfc2tiIGZyb20gbGlzdCAqLworCQl0eF9za2ItPm5leHQgPSB0eF9za2ItPnByZXYgPSBOVUxMOworCQl0eF9za2ItPmxpc3QgPSBOVUxMOworCisJCS8qIENsZWFyIG9sZCBOciBmaWVsZCArIHBvbGwgYml0ICovCisJCXR4X3NrYi0+ZGF0YVsxXSAmPSAweDBmOworCisJCS8qICBTZXQgcG9sbC9maW5hbCBiaXQgKi8KKwkJdHhfc2tiLT5kYXRhWzFdIHw9IFBGX0JJVDsgLyogU2V0IHAvZiBiaXQgKi8KKworCQlpcmxhcF9zZW5kX2lfZnJhbWUoc2VsZiwgdHhfc2tiLCBjb21tYW5kKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zZW5kX3VpX2ZyYW1lIChzZWxmLCBza2IsIGNvbW1hbmQpCisgKgorICogICAgQ29udHJ1Y3QgYW5kIHRyYW5zbWl0IGFuIFVubnVtYmVyZWQgSW5mb3JtYXRpb24gKFVJKSBmcmFtZQorICoKKyAqLwordm9pZCBpcmxhcF9zZW5kX3VpX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSBfX3U4IGNhZGRyLCBpbnQgY29tbWFuZCkKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIEluc2VydCBjb25uZWN0aW9uIGFkZHJlc3MgKi8KKwlza2ItPmRhdGFbMF0gPSBjYWRkciB8ICgoY29tbWFuZCkgPyBDTURfRlJBTUUgOiAwKTsKKworCWlybGFwX3F1ZXVlX3htaXQoc2VsZiwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3NlbmRfaV9mcmFtZSAoc2tiKQorICoKKyAqICAgIENvbnRydWN0IGFuZCB0cmFuc21pdCBJbmZvcm1hdGlvbiAoSSkgZnJhbWUKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfc2VuZF9pX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBpbnQgY29tbWFuZCkKK3sKKwkvKiBJbnNlcnQgY29ubmVjdGlvbiBhZGRyZXNzICovCisJc2tiLT5kYXRhWzBdID0gc2VsZi0+Y2FkZHI7CisJc2tiLT5kYXRhWzBdIHw9IChjb21tYW5kKSA/IENNRF9GUkFNRSA6IDA7CisKKwkvKiBJbnNlcnQgbmV4dCB0byByZWNlaXZlIChWcikgKi8KKwlza2ItPmRhdGFbMV0gfD0gKHNlbGYtPnZyIDw8IDUpOyAgLyogaW5zZXJ0IG5yICovCisKKwlpcmxhcF9xdWV1ZV94bWl0KHNlbGYsIHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9yZWN2X2lfZnJhbWUgKHNrYiwgZnJhbWUpCisgKgorICogICAgUmVjZWl2ZSBhbmQgcGFyc2UgYW4gSSAoSW5mb3JtYXRpb24pIGZyYW1lLCBubyBoYXJtIGluIG1ha2luZyBpdCBpbmxpbmUKKyAqICAgIHNpbmNlIGl0J3MgY2FsbGVkIG9ubHkgZnJvbSBvbmUgc2luZ2xlIHBsYWNlIChpcmxhcF9kcml2ZXJfcmN2KS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlybGFwX3JlY3ZfaV9mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbywgaW50IGNvbW1hbmQpCit7CisJaW5mby0+bnIgPSBza2ItPmRhdGFbMV0gPj4gNTsgICAgICAgICAgLyogTmV4dCB0byByZWNlaXZlICovCisJaW5mby0+cGYgPSBza2ItPmRhdGFbMV0gJiBQRl9CSVQ7ICAgICAgLyogRmluYWwgYml0ICovCisJaW5mby0+bnMgPSAoc2tiLT5kYXRhWzFdID4+IDEpICYgMHgwNzsgLyogTmV4dCB0byBzZW5kICovCisKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGEgY29tbWFuZCBvciBhIHJlc3BvbnNlIGZyYW1lICovCisJaWYgKGNvbW1hbmQpCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfSV9DTUQsIHNrYiwgaW5mbyk7CisJZWxzZQorCQlpcmxhcF9kb19ldmVudChzZWxmLCBSRUNWX0lfUlNQLCBza2IsIGluZm8pOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcmVjdl91aV9mcmFtZSAoc2VsZiwgc2tiLCBpbmZvKQorICoKKyAqICAgIFJlY2VpdmUgYW5kIHBhcnNlIGFuIFVubnVtYmVyZWQgSW5mb3JtYXRpb24gKFVJKSBmcmFtZQorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfcmVjdl91aV9mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpbmZvLT5wZiA9IHNrYi0+ZGF0YVsxXSAmIFBGX0JJVDsgICAgICAvKiBGaW5hbCBiaXQgKi8KKworCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfVUlfRlJBTUUsIHNrYiwgaW5mbyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9yZWN2X2ZybXJfZnJhbWUgKHNrYiwgZnJhbWUpCisgKgorICogICAgUmVjZWl2ZWQgRnJhbWUgUmVqZWN0IHJlc3BvbnNlLgorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfcmVjdl9mcm1yX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCV9fdTggKmZyYW1lOworCWludCB3LCB4LCB5LCB6OworCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoaW5mbyAhPSBOVUxMLCByZXR1cm47KTsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIDQpKSB7CisJCUlSREFfRVJST1IoIiVzOiBmcmFtZSB0byBzaG9ydCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKworCWluZm8tPm5yID0gZnJhbWVbMl0gPj4gNTsgICAgICAgICAgLyogTmV4dCB0byByZWNlaXZlICovCisJaW5mby0+cGYgPSBmcmFtZVsyXSAmIFBGX0JJVDsgICAgICAvKiBGaW5hbCBiaXQgKi8KKwlpbmZvLT5ucyA9IChmcmFtZVsyXSA+PiAxKSAmIDB4MDc7IC8qIE5leHQgdG8gc2VuZCAqLworCisJdyA9IGZyYW1lWzNdICYgMHgwMTsKKwl4ID0gZnJhbWVbM10gJiAweDAyOworCXkgPSBmcmFtZVszXSAmIDB4MDQ7CisJeiA9IGZyYW1lWzNdICYgMHgwODsKKworCWlmICh3KSB7CisJCUlSREFfREVCVUcoMCwgIlJlamVjdGVkIGNvbnRyb2wgZmllbGQgaXMgdW5kZWZpbmVkIG9yIG5vdCAiCisJCSAgICAgICJpbXBsZW1lbnRlZC5cbiIpOworCX0KKwlpZiAoeCkgeworCQlJUkRBX0RFQlVHKDAsICJSZWplY3RlZCBjb250cm9sIGZpZWxkIHdhcyBpbnZhbGlkIGJlY2F1c2UgaXQgIgorCQkgICAgICAiY29udGFpbmVkIGEgbm9uIHBlcm1pdHRlZCBJIGZpZWxkLlxuIik7CisJfQorCWlmICh5KSB7CisJCUlSREFfREVCVUcoMCwgIlJlY2VpdmVkIEkgZmllbGQgZXhjZWVkZWQgdGhlIG1heGltdW0gbmVnb3RpYXRlZCAiCisJCSAgICAgICJmb3IgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb24gb3IgZXhjZWVkZWQgdGhlIG1heGltdW0gIgorCQkgICAgICAidGhpcyBzdGF0aW9uIHN1cHBvcnRzIGlmIG5vIGNvbm5lY3Rpb24gZXhpc3RzLlxuIik7CisJfQorCWlmICh6KSB7CisJCUlSREFfREVCVUcoMCwgIlJlamVjdGVkIGNvbnRyb2wgZmllbGQgY29udHJvbCBmaWVsZCBjb250YWluZWQgYW4gIgorCQkgICAgICAiaW52YWxpZCBOciBjb3VudC5cbiIpOworCX0KKwlpcmxhcF9kb19ldmVudChzZWxmLCBSRUNWX0ZSTVJfUlNQLCBza2IsIGluZm8pOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc2VuZF90ZXN0X2ZyYW1lIChzZWxmLCBkYWRkcikKKyAqCisgKiAgICBTZW5kIGEgdGVzdCBmcmFtZSByZXNwb25zZQorICoKKyAqLwordm9pZCBpcmxhcF9zZW5kX3Rlc3RfZnJhbWUoc3RydWN0IGlybGFwX2NiICpzZWxmLCBfX3U4IGNhZGRyLCBfX3UzMiBkYWRkciwKKwkJCSAgIHN0cnVjdCBza19idWZmICpjbWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlzdHJ1Y3QgdGVzdF9mcmFtZSAqZnJhbWU7CisJX191OCAqaW5mbzsKKworCXR4X3NrYiA9IGRldl9hbGxvY19za2IoY21kLT5sZW4rc2l6ZW9mKHN0cnVjdCB0ZXN0X2ZyYW1lKSk7CisJaWYgKCF0eF9za2IpCisJCXJldHVybjsKKworCS8qIEJyb2FkY2FzdCBmcmFtZXMgbXVzdCBpbmNsdWRlIHNhZGRyIGFuZCBkYWRkciBmaWVsZHMgKi8KKwlpZiAoY2FkZHIgPT0gQ0JST0FEQ0FTVCkgeworCQlmcmFtZSA9IChzdHJ1Y3QgdGVzdF9mcmFtZSAqKQorCQkJc2tiX3B1dCh0eF9za2IsIHNpemVvZihzdHJ1Y3QgdGVzdF9mcmFtZSkpOworCisJCS8qIEluc2VydCB0aGUgc3dhcHBlZCBhZGRyZXNzZXMgKi8KKwkJZnJhbWUtPnNhZGRyID0gY3B1X3RvX2xlMzIoc2VsZi0+c2FkZHIpOworCQlmcmFtZS0+ZGFkZHIgPSBjcHVfdG9fbGUzMihkYWRkcik7CisJfSBlbHNlCisJCWZyYW1lID0gKHN0cnVjdCB0ZXN0X2ZyYW1lICopIHNrYl9wdXQodHhfc2tiLCBMQVBfQUREUl9IRUFERVIgKyBMQVBfQ1RSTF9IRUFERVIpOworCisJZnJhbWUtPmNhZGRyID0gY2FkZHI7CisJZnJhbWUtPmNvbnRyb2wgPSBURVNUX1JTUCB8IFBGX0JJVDsKKworCS8qIENvcHkgaW5mbyAqLworCWluZm8gPSBza2JfcHV0KHR4X3NrYiwgY21kLT5sZW4pOworCW1lbWNweShpbmZvLCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsKKworCS8qIFJldHVybiB0byBzZW5kZXIgKi8KKwlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwlpcmxhcF9xdWV1ZV94bWl0KHNlbGYsIHR4X3NrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9yZWN2X3Rlc3RfZnJhbWUgKHNlbGYsIHNrYikKKyAqCisgKiAgICBSZWNlaXZlIGEgdGVzdCBmcmFtZQorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfcmVjdl90ZXN0X2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvLCBpbnQgY29tbWFuZCkKK3sKKwlzdHJ1Y3QgdGVzdF9mcmFtZSAqZnJhbWU7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCpmcmFtZSkpKSB7CisJCUlSREFfRVJST1IoIiVzOiBmcmFtZSB0byBzaG9ydCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJZnJhbWUgPSAoc3RydWN0IHRlc3RfZnJhbWUgKikgc2tiLT5kYXRhOworCisJLyogQnJvYWRjYXN0IGZyYW1lcyBtdXN0IGNhcnJ5IHNhZGRyIGFuZCBkYWRkciBmaWVsZHMgKi8KKwlpZiAoaW5mby0+Y2FkZHIgPT0gQ0JST0FEQ0FTVCkgeworCQlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IHRlc3RfZnJhbWUpKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpIHRlc3QgZnJhbWUgdG8gc2hvcnQhXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBSZWFkIGFuZCBzd2FwIGFkZHJlc3NlcyAqLworCQlpbmZvLT5kYWRkciA9IGxlMzJfdG9fY3B1KGZyYW1lLT5zYWRkcik7CisJCWluZm8tPnNhZGRyID0gbGUzMl90b19jcHUoZnJhbWUtPmRhZGRyKTsKKworCQkvKiBNYWtlIHN1cmUgZnJhbWUgaXMgYWRkcmVzc2VkIHRvIHVzICovCisJCWlmICgoaW5mby0+c2FkZHIgIT0gc2VsZi0+c2FkZHIpICYmCisJCSAgICAoaW5mby0+c2FkZHIgIT0gQlJPQURDQVNUKSkgeworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKGNvbW1hbmQpCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfVEVTVF9DTUQsIHNrYiwgaW5mbyk7CisJZWxzZQorCQlpcmxhcF9kb19ldmVudChzZWxmLCBSRUNWX1RFU1RfUlNQLCBza2IsIGluZm8pOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfZHJpdmVyX3JjdiAoc2tiLCBuZXRkZXYsIHB0eXBlKQorICoKKyAqICAgIENhbGxlZCB3aGVuIGEgZnJhbWUgaXMgcmVjZWl2ZWQuIERpc3BhdGNoZXMgdGhlIHJpZ2h0IHJlY2VpdmUgZnVuY3Rpb24KKyAqICAgIGZvciBwcm9jZXNzaW5nIG9mIHRoZSBmcmFtZS4KKyAqCisgKiBOb3RlIG9uIHNrYiBtYW5hZ2VtZW50IDoKKyAqIEFmdGVyIGNhbGxpbmcgdGhlIGhpZ2hlciBsYXllcnMgb2YgdGhlIElyREEgc3RhY2ssIHdlIGFsd2F5cworICoga2ZyZWUoKSB0aGUgc2tiLCB3aGljaCBkcm9wIHRoZSByZWZlcmVuY2UgY291bnQgKGFuZCBwb3RlbnRpYWxseQorICogZGVzdHJveSBpdCkuCisgKiBJZiBhIGhpZ2hlciBsYXllciBvZiB0aGUgc3RhY2sgd2FudCB0byBrZWVwIHRoZSBza2IgYXJvdW5kICh0byBwdXQKKyAqIGluIGEgcXVldWUgb3IgcGFzcyBpdCB0byB0aGUgaGlnaGVyIGxheWVyKSwgaXQgd2lsbCBuZWVkIHRvIHVzZQorICogc2tiX2dldCgpIHRvIGtlZXAgYSByZWZlcmVuY2Ugb24gaXQuIFRoaXMgaXMgdXN1YWxseSBkb25lIGF0IHRoZQorICogTE1QIGxldmVsIGluIGlybG1wLmMuCisgKiBKZWFuIElJCisgKi8KK2ludCBpcmxhcF9kcml2ZXJfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSkKK3sKKwlzdHJ1Y3QgaXJsYXBfaW5mbyBpbmZvOworCXN0cnVjdCBpcmxhcF9jYiAqc2VsZjsKKwlpbnQgY29tbWFuZDsKKwlfX3U4IGNvbnRyb2w7CisKKwkvKiBGSVhNRTogc2hvdWxkIHdlIGdldCBvdXIgb3duIGZpZWxkPyAqLworCXNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGRldi0+YXRhbGtfcHRyOworCisJLyogSWYgdGhlIG5ldCBkZXZpY2UgaXMgZG93biwgdGhlbiBJckxBUCBpcyBnb25lISAqLworCWlmICghc2VsZiB8fCBzZWxmLT5tYWdpYyAhPSBMQVBfTUFHSUMpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogV2UgYXJlIG5vIGxvbmdlciBhbiAib2xkIiBwcm90b2NvbCwgc28gd2UgbmVlZCB0byBoYW5kbGUKKwkgKiBzaGFyZSBhbmQgbm9uIGxpbmVhciBza2JzLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIHNvCisJICogd2UgZG9uJ3QgbmVlZCB0byBiZSBjbGV2ZXIgYWJvdXQgaXQuIEplYW4gSUkgKi8KKwlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCUlSREFfRVJST1IoIiVzOiBjYW4ndCBjbG9uZSBzaGFyZWQgc2tiIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ2hlY2sgaWYgZnJhbWUgaXMgbGFyZ2UgZW5vdWdoIGZvciBwYXJzaW5nICovCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgMikpIHsKKwkJSVJEQV9FUlJPUigiJXM6IGZyYW1lIHRvIHNob3J0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLTE7CisJfQorCisJY29tbWFuZCAgICA9IHNrYi0+ZGF0YVswXSAmIENNRF9GUkFNRTsKKwlpbmZvLmNhZGRyID0gc2tiLT5kYXRhWzBdICYgQ0JST0FEQ0FTVDsKKworCWluZm8ucGYgICAgICA9IHNrYi0+ZGF0YVsxXSAmICBQRl9CSVQ7CisJaW5mby5jb250cm9sID0gc2tiLT5kYXRhWzFdICYgflBGX0JJVDsgLyogTWFzayBhd2F5IHBvbGwvZmluYWwgYml0ICovCisKKwljb250cm9sID0gaW5mby5jb250cm9sOworCisJLyogIEZpcnN0IHdlIGNoZWNrIGlmIHRoaXMgZnJhbWUgaGFzIGEgdmFsaWQgY29ubmVjdGlvbiBhZGRyZXNzICovCisJaWYgKChpbmZvLmNhZGRyICE9IHNlbGYtPmNhZGRyKSAmJiAoaW5mby5jYWRkciAhPSBDQlJPQURDQVNUKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCB3cm9uZyBjb25uZWN0aW9uIGFkZHJlc3MhXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXQ7CisJfQorCS8qCisJICogIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2UgYW5kIGNoZWNrIGlmIHRoZSBmcmFtZSBpcyBhbgorCSAqICBJKG5mb3JtYXRpb24pIGZyYW1lLiBPbmx5IEktZnJhbWVzIGhhdmUgYml0IDAgc2V0IHRvIDAKKwkgKi8KKwlpZiAofmNvbnRyb2wgJiAweDAxKSB7CisJCWlybGFwX3JlY3ZfaV9mcmFtZShzZWxmLCBza2IsICZpbmZvLCBjb21tYW5kKTsKKwkJZ290byBvdXQ7CisJfQorCS8qCisJICogIFdlIG5vdyBjaGVjayBpcyB0aGUgZnJhbWUgaXMgYW4gUyh1cGVydmlzb3J5KSBmcmFtZS4gT25seQorCSAqICBTLWZyYW1lcyBoYXZlIGJpdCAwIHNldCB0byAxIGFuZCBiaXQgMSBzZXQgdG8gMAorCSAqLworCWlmICh+Y29udHJvbCAmIDB4MDIpIHsKKwkJLyoKKwkJICogIFJlY2VpdmVkIFModXBlcnZpc29yeSkgZnJhbWUsIGNoZWNrIHdoaWNoIGZyYW1lIHR5cGUgaXQgaXMKKwkJICogIG9ubHkgdGhlIGZpcnN0IG5pYmJsZSBpcyBvZiBpbnRlcmVzdAorCQkgKi8KKwkJc3dpdGNoIChjb250cm9sICYgMHgwZikgeworCQljYXNlIFJSOgorCQkJaXJsYXBfcmVjdl9ycl9mcmFtZShzZWxmLCBza2IsICZpbmZvLCBjb21tYW5kKTsKKwkJCWJyZWFrOworCQljYXNlIFJOUjoKKwkJCWlybGFwX3JlY3Zfcm5yX2ZyYW1lKHNlbGYsIHNrYiwgJmluZm8sIGNvbW1hbmQpOworCQkJYnJlYWs7CisJCWNhc2UgUkVKOgorCQkJaXJsYXBfcmVjdl9yZWpfZnJhbWUoc2VsZiwgc2tiLCAmaW5mbywgY29tbWFuZCk7CisJCQlicmVhazsKKwkJY2FzZSBTUkVKOgorCQkJaXJsYXBfcmVjdl9zcmVqX2ZyYW1lKHNlbGYsIHNrYiwgJmluZm8sIGNvbW1hbmQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmtub3duIFMtZnJhbWUgJTAyeCByZWNlaXZlZCFcbiIsCisJCQkJX19GVU5DVElPTl9fLCBpbmZvLmNvbnRyb2wpOworCQkJYnJlYWs7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCS8qCisJICogIFRoaXMgbXVzdCBiZSBhIEMob250cm9sKSBmcmFtZQorCSAqLworCXN3aXRjaCAoY29udHJvbCkgeworCWNhc2UgWElEX1JTUDoKKwkJaXJsYXBfcmVjdl9kaXNjb3ZlcnlfeGlkX3JzcChzZWxmLCBza2IsICZpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBYSURfQ01EOgorCQlpcmxhcF9yZWN2X2Rpc2NvdmVyeV94aWRfY21kKHNlbGYsIHNrYiwgJmluZm8pOworCQlicmVhazsKKwljYXNlIFNOUk1fQ01EOgorCQlpcmxhcF9yZWN2X3Nucm1fY21kKHNlbGYsIHNrYiwgJmluZm8pOworCQlicmVhazsKKwljYXNlIERNX1JTUDoKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9ETV9SU1AsIHNrYiwgJmluZm8pOworCQlicmVhazsKKwljYXNlIERJU0NfQ01EOiAvKiBBbmQgUkRfUlNQIHNpbmNlIHRoZXkgaGF2ZSB0aGUgc2FtZSB2YWx1ZSAqLworCQlpcmxhcF9yZWN2X2Rpc2NfZnJhbWUoc2VsZiwgc2tiLCAmaW5mbywgY29tbWFuZCk7CisJCWJyZWFrOworCWNhc2UgVEVTVF9DTUQ6CisJCWlybGFwX3JlY3ZfdGVzdF9mcmFtZShzZWxmLCBza2IsICZpbmZvLCBjb21tYW5kKTsKKwkJYnJlYWs7CisJY2FzZSBVQV9SU1A6CisJCWlybGFwX3JlY3ZfdWFfZnJhbWUoc2VsZiwgc2tiLCAmaW5mbyk7CisJCWJyZWFrOworCWNhc2UgRlJNUl9SU1A6CisJCWlybGFwX3JlY3ZfZnJtcl9mcmFtZShzZWxmLCBza2IsICZpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBVSV9GUkFNRToKKwkJaXJsYXBfcmVjdl91aV9mcmFtZShzZWxmLCBza2IsICZpbmZvKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9XQVJOSU5HKCIlczogVW5rbm93biBmcmFtZSAlMDJ4IHJlY2VpdmVkIVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGluZm8uY29udHJvbCk7CisJCWJyZWFrOworCX0KK291dDoKKwkvKiBBbHdheXMgZHJvcCBvdXIgcmVmZXJlbmNlIG9uIHRoZSBza2IgKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxtcC5jIGIvbmV0L2lyZGEvaXJsbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTRhNGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJsbXAuYwpAQCAtMCwwICsxLDIwNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBpcmxtcC5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIElyREEgTGluayBNYW5hZ2VtZW50IFByb3RvY29sIChMTVApIGxheWVyCisgKiBTdGF0dXM6ICAgICAgICBTdGFibGUuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTdW4gQXVnIDE3IDIwOjU0OjMyIDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFdlZCBKYW4gIDUgMTE6MjY6MDMgMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+LAorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3Fvcy5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wX2ZyYW1lLmg+CisKK3N0YXRpYyBfX3U4IGlybG1wX2ZpbmRfZnJlZV9zbHNhcCh2b2lkKTsKK3N0YXRpYyBpbnQgaXJsbXBfc2xzYXBfaW51c2UoX191OCBzbHNhcF9zZWwpOworCisvKiBNYXN0ZXIgc3RydWN0dXJlICovCitzdHJ1Y3QgaXJsbXBfY2IgKmlybG1wID0gTlVMTDsKKworLyogVGhlc2UgY2FuIGJlIGFsdGVyZWQgYnkgdGhlIHN5c2N0bCBpbnRlcmZhY2UgKi8KK2ludCAgc3lzY3RsX2Rpc2NvdmVyeSAgICAgICAgID0gMDsKK2ludCAgc3lzY3RsX2Rpc2NvdmVyeV90aW1lb3V0ID0gMzsgLyogMyBzZWNvbmRzIGJ5IGRlZmF1bHQgKi8KK0VYUE9SVF9TWU1CT0woc3lzY3RsX2Rpc2NvdmVyeV90aW1lb3V0KTsKK2ludCAgc3lzY3RsX2Rpc2NvdmVyeV9zbG90cyAgID0gNjsgLyogNiBzbG90cyBieSBkZWZhdWx0ICovCitpbnQgIHN5c2N0bF9sYXBfa2VlcGFsaXZlX3RpbWUgPSBMTV9JRExFX1RJTUVPVVQgKiAxMDAwIC8gSFo7CitjaGFyIHN5c2N0bF9kZXZuYW1lWzY1XTsKKworY29uc3QgY2hhciAqaXJsbXBfcmVhc29uc1tdID0geworCSJFUlJPUiwgTk9UIFVTRUQiLAorCSJMTV9VU0VSX1JFUVVFU1QiLAorCSJMTV9MQVBfRElTQ09OTkVDVCIsCisJIkxNX0NPTk5FQ1RfRkFJTFVSRSIsCisJIkxNX0xBUF9SRVNFVCIsCisJIkxNX0lOSVRfRElTQ09OTkVDVCIsCisJIkVSUk9SLCBOT1QgVVNFRCIsCit9OworRVhQT1JUX1NZTUJPTChpcmxtcF9yZWFzb25zKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2luaXQgKHZvaWQpCisgKgorICogICAgQ3JlYXRlIChhbGxvY2F0ZSkgdGhlIG1haW4gSXJMTVAgc3RydWN0dXJlCisgKgorICovCitpbnQgX19pbml0IGlybG1wX2luaXQodm9pZCkKK3sKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCS8qIEluaXRpYWxpemUgdGhlIGlybG1wIHN0cnVjdHVyZS4gKi8KKwlpcmxtcCA9IGttYWxsb2MoIHNpemVvZihzdHJ1Y3QgaXJsbXBfY2IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaXJsbXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGlybG1wLCAwLCBzaXplb2Yoc3RydWN0IGlybG1wX2NiKSk7CisKKwlpcmxtcC0+bWFnaWMgPSBMTVBfTUFHSUM7CisKKwlpcmxtcC0+Y2xpZW50cyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOworCWlybG1wLT5zZXJ2aWNlcyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOworCWlybG1wLT5saW5rcyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOworCWlybG1wLT51bmNvbm5lY3RlZF9sc2FwcyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOworCWlybG1wLT5jYWNoZWxvZyA9IGhhc2hiaW5fbmV3KEhCX05PTE9DSyk7CisKKwlpZiAoKGlybG1wLT5jbGllbnRzID09IE5VTEwpIHx8CisJICAgIChpcmxtcC0+c2VydmljZXMgPT0gTlVMTCkgfHwKKwkgICAgKGlybG1wLT5saW5rcyA9PSBOVUxMKSB8fAorCSAgICAoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzID09IE5VTEwpIHx8CisJICAgIChpcmxtcC0+Y2FjaGVsb2cgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJmlybG1wLT5jYWNoZWxvZy0+aGJfc3BpbmxvY2spOworCisJaXJsbXAtPmxhc3RfbHNhcF9zZWwgPSAweDBmOyAvKiBSZXNlcnZlZCAweDAwLTB4MGYgKi8KKwlzdHJjcHkoc3lzY3RsX2Rldm5hbWUsICJMaW51eCIpOworCisJLyogRG8gZGlzY292ZXJ5IGV2ZXJ5IDMgc2Vjb25kcyAqLworCWluaXRfdGltZXIoJmlybG1wLT5kaXNjb3ZlcnlfdGltZXIpOworCWlybG1wX3N0YXJ0X2Rpc2NvdmVyeV90aW1lcihpcmxtcCwgc3lzY3RsX2Rpc2NvdmVyeV90aW1lb3V0KkhaKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfY2xlYW51cCAodm9pZCkKKyAqCisgKiAgICBSZW1vdmUgSXJMTVAgbGF5ZXIKKyAqCisgKi8KK3ZvaWQgX19leGl0IGlybG1wX2NsZWFudXAodm9pZCkgCit7CisJLyogQ2hlY2sgZm9yIG1haW4gc3RydWN0dXJlICovCisJSVJEQV9BU1NFUlQoaXJsbXAgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoaXJsbXAtPm1hZ2ljID09IExNUF9NQUdJQywgcmV0dXJuOyk7CisKKwlkZWxfdGltZXIoJmlybG1wLT5kaXNjb3ZlcnlfdGltZXIpOworCisJaGFzaGJpbl9kZWxldGUoaXJsbXAtPmxpbmtzLCAoRlJFRV9GVU5DKSBrZnJlZSk7CisJaGFzaGJpbl9kZWxldGUoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLCAoRlJFRV9GVU5DKSBrZnJlZSk7CisJaGFzaGJpbl9kZWxldGUoaXJsbXAtPmNsaWVudHMsIChGUkVFX0ZVTkMpIGtmcmVlKTsKKwloYXNoYmluX2RlbGV0ZShpcmxtcC0+c2VydmljZXMsIChGUkVFX0ZVTkMpIGtmcmVlKTsKKwloYXNoYmluX2RlbGV0ZShpcmxtcC0+Y2FjaGVsb2csIChGUkVFX0ZVTkMpIGtmcmVlKTsKKworCS8qIERlLWFsbG9jYXRlIG1haW4gc3RydWN0dXJlICovCisJa2ZyZWUoaXJsbXApOworCWlybG1wID0gTlVMTDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX29wZW5fbHNhcCAoc2xzYXAsIG5vdGlmeSkKKyAqCisgKiAgIFJlZ2lzdGVyIHdpdGggSXJMTVAgYW5kIGNyZWF0ZSBhIGxvY2FsIExTQVAsCisgKiAgIHJldHVybnMgaGFuZGxlIHRvIExTQVAuCisgKi8KK3N0cnVjdCBsc2FwX2NiICppcmxtcF9vcGVuX2xzYXAoX191OCBzbHNhcF9zZWwsIG5vdGlmeV90ICpub3RpZnksIF9fdTggcGlkKQoreworCXN0cnVjdCBsc2FwX2NiICpzZWxmOworCisJSVJEQV9BU1NFUlQobm90aWZ5ICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisJSVJEQV9BU1NFUlQoaXJsbXAgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKwlJUkRBX0FTU0VSVChpcmxtcC0+bWFnaWMgPT0gTE1QX01BR0lDLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKG5vdGlmeS0+aW5zdGFuY2UgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKworCS8qICBEb2VzIHRoZSBjbGllbnQgY2FyZSB3aGljaCBTb3VyY2UgTFNBUCBzZWxlY3RvciBpdCBnZXRzPyAgKi8KKwlpZiAoc2xzYXBfc2VsID09IExTQVBfQU5ZKSB7CisJCXNsc2FwX3NlbCA9IGlybG1wX2ZpbmRfZnJlZV9zbHNhcCgpOworCQlpZiAoIXNsc2FwX3NlbCkKKwkJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAoaXJsbXBfc2xzYXBfaW51c2Uoc2xzYXBfc2VsKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBBbGxvY2F0ZSBuZXcgaW5zdGFuY2Ugb2YgYSBMU0FQIGNvbm5lY3Rpb24gKi8KKwlzZWxmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxzYXBfY2IpLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2VsZiA9PSBOVUxMKSB7CisJCUlSREFfRVJST1IoIiVzOiBjYW4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoc2VsZiwgMCwgc2l6ZW9mKHN0cnVjdCBsc2FwX2NiKSk7CisKKwlzZWxmLT5tYWdpYyA9IExNUF9MU0FQX01BR0lDOworCXNlbGYtPnNsc2FwX3NlbCA9IHNsc2FwX3NlbDsKKworCS8qIEZpeCBjb25uZWN0aW9ubGVzcyBMU0FQJ3MgKi8KKwlpZiAoc2xzYXBfc2VsID09IExTQVBfQ09OTkxFU1MpIHsKKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQorCQlzZWxmLT5kbHNhcF9zZWwgPSBMU0FQX0NPTk5MRVNTOworCQlzZWxmLT5waWQgPSBwaWQ7CisjZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KKwl9IGVsc2UKKwkJc2VsZi0+ZGxzYXBfc2VsID0gTFNBUF9BTlk7CisJLyogc2VsZi0+Y29ubmVjdGVkID0gRkFMU0U7IC0+IGFscmVhZHkgTlVMTCB2aWEgbWVtc2V0KCkgKi8KKworCWluaXRfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCXNlbGYtPm5vdGlmeSA9ICpub3RpZnk7CisKKwlzZWxmLT5sc2FwX3N0YXRlID0gTFNBUF9ESVNDT05ORUNURUQ7CisKKwkvKiBJbnNlcnQgaW50byBxdWV1ZSBvZiB1bmNvbm5lY3RlZCBMU0FQcyAqLworCWhhc2hiaW5faW5zZXJ0KGlybG1wLT51bmNvbm5lY3RlZF9sc2FwcywgKGlyZGFfcXVldWVfdCAqKSBzZWxmLAorCQkgICAgICAgKGxvbmcpIHNlbGYsIE5VTEwpOworCisJcmV0dXJuIHNlbGY7Cit9CitFWFBPUlRfU1lNQk9MKGlybG1wX29wZW5fbHNhcCk7CisKKy8qCisgKiBGdW5jdGlvbiBfX2lybG1wX2Nsb3NlX2xzYXAgKHNlbGYpCisgKgorICogICAgUmVtb3ZlIGFuIGluc3RhbmNlIG9mIExTQVAKKyAqLworc3RhdGljIHZvaWQgX19pcmxtcF9jbG9zZV9sc2FwKHN0cnVjdCBsc2FwX2NiICpzZWxmKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm47KTsKKworCS8qCisJICogIFNldCBzb21lIG9mIHRoZSB2YXJpYWJsZXMgdG8gcHJlc2V0IHZhbHVlcworCSAqLworCXNlbGYtPm1hZ2ljID0gMDsKKwlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsgLyogSW1wb3J0YW50ISAqLworCisJaWYgKHNlbGYtPmNvbm5fc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNlbGYtPmNvbm5fc2tiKTsKKworCWtmcmVlKHNlbGYpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfY2xvc2VfbHNhcCAoc2VsZikKKyAqCisgKiAgICBDbG9zZSBhbmQgcmVtb3ZlIExTQVAKKyAqCisgKi8KK3ZvaWQgaXJsbXBfY2xvc2VfbHNhcChzdHJ1Y3QgbHNhcF9jYiAqc2VsZikKK3sKKwlzdHJ1Y3QgbGFwX2NiICpsYXA7CisJc3RydWN0IGxzYXBfY2IgKmxzYXAgPSBOVUxMOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuOyk7CisKKwkvKgorCSAqICBGaW5kIG91dCBpZiB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgTFNBUCBmcm9tIGEgbGluayBvciBmcm9tIHRoZQorCSAqICBsaXN0IG9mIHVuY29ubmVjdGVkIGxzYXBzIChub3QgYXNzb2NpYXRlZCB3aXRoIGEgbGluaykKKwkgKi8KKwlsYXAgPSBzZWxmLT5sYXA7CisJaWYgKGxhcCkgeworCQlJUkRBX0FTU0VSVChsYXAtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOworCQkvKiBXZSBtaWdodCBjbG9zZSBhIExTQVAgYmVmb3JlIGl0IGhhcyBjb21wbGV0ZWQgdGhlCisJCSAqIGNvbm5lY3Rpb24gc2V0dXAuIEluIHRob3NlIGNhc2UsIGhpZ2hlciBsYXllcnMgd29uJ3QKKwkJICogc2VuZCBhIHByb3BlciBkaXNjb25uZWN0IHJlcXVlc3QuIEhhcm1sZXNzLCBleGNlcHQKKwkJICogdGhhdCB3ZSB3aWxsIGZvcmdldCB0byBjbG9zZSBMQVAuLi4gLSBKZWFuIElJICovCisJCWlmKHNlbGYtPmxzYXBfc3RhdGUgIT0gTFNBUF9ESVNDT05ORUNURUQpIHsKKwkJCXNlbGYtPmxzYXBfc3RhdGUgPSBMU0FQX0RJU0NPTk5FQ1RFRDsKKwkJCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLT5sYXAsCisJCQkJCSAgIExNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1QsIE5VTEwpOworCQl9CisJCS8qIE5vdywgcmVtb3ZlIGZyb20gdGhlIGxpbmsgKi8KKwkJbHNhcCA9IGhhc2hiaW5fcmVtb3ZlKGxhcC0+bHNhcHMsIChsb25nKSBzZWxmLCBOVUxMKTsKKyNpZmRlZiBDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVAKKwkJbGFwLT5jYWNoZS52YWxpZCA9IEZBTFNFOworI2VuZGlmCisJfQorCXNlbGYtPmxhcCA9IE5VTEw7CisJLyogQ2hlY2sgaWYgd2UgZm91bmQgdGhlIExTQVAhIElmIG5vdCB0aGVuIHRyeSB0aGUgdW5jb25uZWN0ZWQgbHNhcHMgKi8KKwlpZiAoIWxzYXApIHsKKwkJbHNhcCA9IGhhc2hiaW5fcmVtb3ZlKGlybG1wLT51bmNvbm5lY3RlZF9sc2FwcywgKGxvbmcpIHNlbGYsCisJCQkJICAgICAgTlVMTCk7CisJfQorCWlmICghbHNhcCkgeworCQlJUkRBX0RFQlVHKDAsCisJCSAgICAgIiVzKCksIExvb2tzIGxpa2Ugc29tZWJvZHkgaGFzIHJlbW92ZWQgbWUgYWxyZWFkeSFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCV9faXJsbXBfY2xvc2VfbHNhcChzZWxmKTsKK30KK0VYUE9SVF9TWU1CT0woaXJsbXBfY2xvc2VfbHNhcCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9yZWdpc3Rlcl9pcmxhcCAoc2FkZHIsIG5vdGlmeSkKKyAqCisgKiAgICBSZWdpc3RlciBJckxBUCBsYXllciB3aXRoIElyTE1QLiBUaGVyZSBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlCisgKiAgICBpbnN0YW5jZXMgb2YgdGhlIElyTEFQIGxheWVyLCBlYWNoIGNvbm5lY3RlZCB0byBkaWZmZXJlbnQgSXJEQSBwb3J0cworICoKKyAqLwordm9pZCBpcmxtcF9yZWdpc3Rlcl9saW5rKHN0cnVjdCBpcmxhcF9jYiAqaXJsYXAsIF9fdTMyIHNhZGRyLCBub3RpZnlfdCAqbm90aWZ5KQoreworCXN0cnVjdCBsYXBfY2IgKmxhcDsKKworCUlSREFfQVNTRVJUKGlybG1wICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKGlybG1wLT5tYWdpYyA9PSBMTVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKG5vdGlmeSAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qCisJICogIEFsbG9jYXRlIG5ldyBpbnN0YW5jZSBvZiBhIExTQVAgY29ubmVjdGlvbgorCSAqLworCWxhcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsYXBfY2IpLCBHRlBfS0VSTkVMKTsKKwlpZiAobGFwID09IE5VTEwpIHsKKwkJSVJEQV9FUlJPUigiJXM6IHVuYWJsZSB0byBrbWFsbG9jXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCW1lbXNldChsYXAsIDAsIHNpemVvZihzdHJ1Y3QgbGFwX2NiKSk7CisKKwlsYXAtPmlybGFwID0gaXJsYXA7CisJbGFwLT5tYWdpYyA9IExNUF9MQVBfTUFHSUM7CisJbGFwLT5zYWRkciA9IHNhZGRyOworCWxhcC0+ZGFkZHIgPSBERVZfQUREUl9BTlk7CisjaWZkZWYgQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQCisJbGFwLT5jYWNoZS52YWxpZCA9IEZBTFNFOworI2VuZGlmCisJbGFwLT5sc2FwcyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOworCWlmIChsYXAtPmxzYXBzID09IE5VTEwpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCB1bmFibGUgdG8ga21hbGxvYyBsc2Fwc1xuIiwgX19GVU5DVElPTl9fKTsKKwkJa2ZyZWUobGFwKTsKKwkJcmV0dXJuOworCX0KKworCWxhcC0+bGFwX3N0YXRlID0gTEFQX1NUQU5EQlk7CisKKwlpbml0X3RpbWVyKCZsYXAtPmlkbGVfdGltZXIpOworCisJLyoKKwkgKiAgSW5zZXJ0IGludG8gcXVldWUgb2YgTE1QIGxpbmtzCisJICovCisJaGFzaGJpbl9pbnNlcnQoaXJsbXAtPmxpbmtzLCAoaXJkYV9xdWV1ZV90ICopIGxhcCwgbGFwLT5zYWRkciwgTlVMTCk7CisKKwkvKgorCSAqICBXZSBzZXQgb25seSB0aGlzIHZhcmlhYmxlIHNvIElyTEFQIGNhbiB0ZWxsIHVzIG9uIHdoaWNoIGxpbmsgdGhlCisJICogIGRpZmZlcmVudCBldmVudHMgaGFwcGVuZWQgb24KKwkgKi8KKwlpcmRhX25vdGlmeV9pbml0KG5vdGlmeSk7CisJbm90aWZ5LT5pbnN0YW5jZSA9IGxhcDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3VucmVnaXN0ZXJfaXJsYXAgKHNhZGRyKQorICoKKyAqICAgIElyTEFQIGxheWVyIGhhcyBiZWVuIHJlbW92ZWQhCisgKgorICovCit2b2lkIGlybG1wX3VucmVnaXN0ZXJfbGluayhfX3UzMiBzYWRkcikKK3sKKwlzdHJ1Y3QgbGFwX2NiICpsaW5rOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFdlIG11c3QgcmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBoYXNoYmluICpmaXJzdCouIFRoaXMgZW5zdXJlCisJICogdGhhdCBubyBtb3JlIExTQVBzIHdpbGwgYmUgb3BlbiBvbiB0aGlzIGxpbmsgYW5kIG5vIGRpc2NvdmVyeQorCSAqIHdpbGwgYmUgdHJpZ2dlcmVkIGFueW1vcmUuIEplYW4gSUkgKi8KKwlsaW5rID0gaGFzaGJpbl9yZW1vdmUoaXJsbXAtPmxpbmtzLCBzYWRkciwgTlVMTCk7CisJaWYgKGxpbmspIHsKKwkJSVJEQV9BU1NFUlQobGluay0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CisKKwkJLyogS2lsbCBhbGwgdGhlIExTQVBzIG9uIHRoaXMgbGluay4gSmVhbiBJSSAqLworCQlsaW5rLT5yZWFzb24gPSBMQVBfRElTQ19JTkRJQ0FUSU9OOworCQlsaW5rLT5kYWRkciA9IERFVl9BRERSX0FOWTsKKwkJaXJsbXBfZG9fbGFwX2V2ZW50KGxpbmssIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT04sIE5VTEwpOworCisJCS8qIFJlbW92ZSBhbGwgZGlzY292ZXJpZXMgZGlzY292ZXJlZCBhdCB0aGlzIGxpbmsgKi8KKwkJaXJsbXBfZXhwaXJlX2Rpc2NvdmVyaWVzKGlybG1wLT5jYWNoZWxvZywgbGluay0+c2FkZHIsIFRSVUUpOworCisJCS8qIEZpbmFsIGNsZWFudXAgKi8KKwkJZGVsX3RpbWVyKCZsaW5rLT5pZGxlX3RpbWVyKTsKKwkJbGluay0+bWFnaWMgPSAwOworCQlrZnJlZShsaW5rKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9jb25uZWN0X3JlcXVlc3QgKGhhbmRsZSwgZGxzYXAsIHVzZXJkYXRhKQorICoKKyAqICAgIENvbm5lY3Qgd2l0aCBhIHBlZXIgTFNBUAorICoKKyAqLworaW50IGlybG1wX2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgX191OCBkbHNhcF9zZWwsCisJCQkgIF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKKwkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiID0gdXNlcmRhdGE7CisJc3RydWN0IGxhcF9jYiAqbGFwOworCXN0cnVjdCBsc2FwX2NiICpsc2FwOworCWludCByZXQ7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtRUJBRFI7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC1FQkFEUjspOworCisJSVJEQV9ERUJVRygyLAorCSAgICAgICIlcygpLCBzbHNhcF9zZWw9JTAyeCwgZGxzYXBfc2VsPSUwMngsIHNhZGRyPSUwOHgsIGRhZGRyPSUwOHhcbiIsCisJICAgICAgX19GVU5DVElPTl9fLCBzZWxmLT5zbHNhcF9zZWwsIGRsc2FwX3NlbCwgc2FkZHIsIGRhZGRyKTsKKworCWlmICh0ZXN0X2JpdCgwLCAmc2VsZi0+Y29ubmVjdGVkKSkgeworCQlyZXQgPSAtRUlTQ09OTjsKKwkJZ290byBlcnI7CisJfQorCisJLyogQ2xpZW50IG11c3Qgc3VwcGx5IGRlc3RpbmF0aW9uIGRldmljZSBhZGRyZXNzICovCisJaWYgKCFkYWRkcikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBBbnkgdXNlcmRhdGE/ICovCisJaWYgKHR4X3NrYiA9PSBOVUxMKSB7CisJCXR4X3NrYiA9IGRldl9hbGxvY19za2IoNjQpOworCQlpZiAoIXR4X3NrYikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXNrYl9yZXNlcnZlKHR4X3NrYiwgTE1QX01BWF9IRUFERVIpOworCX0KKworCS8qIE1ha2Ugcm9vbSBmb3IgTVVYIGNvbnRyb2wgaGVhZGVyICgzIGJ5dGVzKSAqLworCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbSh0eF9za2IpID49IExNUF9DT05UUk9MX0hFQURFUiwgcmV0dXJuIC0xOyk7CisJc2tiX3B1c2godHhfc2tiLCBMTVBfQ09OVFJPTF9IRUFERVIpOworCisJc2VsZi0+ZGxzYXBfc2VsID0gZGxzYXBfc2VsOworCisJLyoKKwkgKiBGaW5kIHRoZSBsaW5rIHRvIHdoZXJlIHdlIHNob3VsZCB0cnkgdG8gY29ubmVjdCBzaW5jZSB0aGVyZSBtYXkKKwkgKiBiZSBtb3JlIHRoYW4gb25lIElyREEgcG9ydCBvbiB0aGlzIG1hY2hpbmUuIElmIHRoZSBjbGllbnQgaGFzCisJICogcGFzc2VkIHVzIHRoZSBzYWRkciAoYW5kIGFscmVhZHkga25vd3Mgd2hpY2ggbGluayB0byB1c2UpLCB0aGVuCisJICogd2UgdXNlIHRoYXQgdG8gZmluZCB0aGUgbGluaywgaWYgbm90IHRoZW4gd2UgaGF2ZSB0byBsb29rIGluIHRoZQorCSAqIGRpc2NvdmVyeSBsb2cgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGUgbGlua3MgaGFzIGRpc2NvdmVyZWQgYQorCSAqIGRldmljZSB3aXRoIHRoZSBnaXZlbiBkYWRkcgorCSAqLworCWlmICgoIXNhZGRyKSB8fCAoc2FkZHIgPT0gREVWX0FERFJfQU5ZKSkgeworCQlkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5OworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpcmxtcC0+Y2FjaGVsb2ctPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJCWlmIChkYWRkciAhPSBERVZfQUREUl9BTlkpCisJCQlkaXNjb3ZlcnkgPSBoYXNoYmluX2ZpbmQoaXJsbXAtPmNhY2hlbG9nLCBkYWRkciwgTlVMTCk7CisJCWVsc2UgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgbm8gZGFkZHJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkaXNjb3ZlcnkgPSAoZGlzY292ZXJ5X3QgKikKKwkJCQloYXNoYmluX2dldF9maXJzdChpcmxtcC0+Y2FjaGVsb2cpOworCQl9CisKKwkJaWYgKGRpc2NvdmVyeSkgeworCQkJc2FkZHIgPSBkaXNjb3ZlcnktPmRhdGEuc2FkZHI7CisJCQlkYWRkciA9IGRpc2NvdmVyeS0+ZGF0YS5kYWRkcjsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmxtcC0+Y2FjaGVsb2ctPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfQorCWxhcCA9IGhhc2hiaW5fbG9ja19maW5kKGlybG1wLT5saW5rcywgc2FkZHIsIE5VTEwpOworCWlmIChsYXAgPT0gTlVMTCkgeworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmFibGUgdG8gZmluZCBhIHVzYWJsZSBsaW5rIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0ID0gLUVIT1NUVU5SRUFDSDsKKwkJZ290byBlcnI7CisJfQorCisJLyogQ2hlY2sgaWYgTEFQIGlzIGRpc2Nvbm5lY3RlZCBvciBhbHJlYWR5IGNvbm5lY3RlZCAqLworCWlmIChsYXAtPmRhZGRyID09IERFVl9BRERSX0FOWSkKKwkJbGFwLT5kYWRkciA9IGRhZGRyOworCWVsc2UgaWYgKGxhcC0+ZGFkZHIgIT0gZGFkZHIpIHsKKwkJLyogQ2hlY2sgaWYgc29tZSBMU0FQcyBhcmUgYWN0aXZlIG9uIHRoaXMgTEFQICovCisJCWlmIChIQVNIQklOX0dFVF9TSVpFKGxhcC0+bHNhcHMpID09IDApIHsKKwkJCS8qIE5vIGFjdGl2ZSBjb25uZWN0aW9uLCBidXQgTEFQIGhhc24ndCBiZWVuCisJCQkgKiBkaXNjb25uZWN0ZWQgeWV0ICh3YWl0aW5nIGZvciB0aW1lb3V0IGluIExBUCkuCisJCQkgKiBNYXliZSB3ZSBjb3VsZCBnaXZlIExBUCBhIGJpdCBvZiBoZWxwIGluIHRoaXMgY2FzZS4KKwkJCSAqLworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgc29ycnksIGJ1dCBJJ20gd2FpdGluZyBmb3IgTEFQIHRvIHRpbWVvdXQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogTEFQIGlzIGFscmVhZHkgY29ubmVjdGVkIHRvIGEgZGlmZmVyZW50IG5vZGUsIGFuZCBMQVAKKwkJICogY2FuIG9ubHkgdGFsayB0byBvbmUgbm9kZSBhdCBhIHRpbWUgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgc29ycnksIGJ1dCBsaW5rIGlzIGJ1c3khXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyOworCX0KKworCXNlbGYtPmxhcCA9IGxhcDsKKworCS8qCisJICogIFJlbW92ZSBMU0FQIGZyb20gbGlzdCBvZiB1bmNvbm5lY3RlZCBMU0FQcyBhbmQgaW5zZXJ0IGl0IGludG8gdGhlCisJICogIGxpc3Qgb2YgY29ubmVjdGVkIExTQVBzIGZvciB0aGUgcGFydGljdWxhciBsaW5rCisJICovCisJbHNhcCA9IGhhc2hiaW5fcmVtb3ZlKGlybG1wLT51bmNvbm5lY3RlZF9sc2FwcywgKGxvbmcpIHNlbGYsIE5VTEwpOworCisJSVJEQV9BU1NFUlQobHNhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChsc2FwLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQobHNhcC0+bGFwICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKGxzYXAtPmxhcC0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwloYXNoYmluX2luc2VydChzZWxmLT5sYXAtPmxzYXBzLCAoaXJkYV9xdWV1ZV90ICopIHNlbGYsIChsb25nKSBzZWxmLAorCQkgICAgICAgTlVMTCk7CisKKwlzZXRfYml0KDAsICZzZWxmLT5jb25uZWN0ZWQpOwkvKiBUUlVFICovCisKKwkvKgorCSAqICBVc2VyIHN1cHBsaWVkIHFvcyBzcGVjaWZpY2F0aW9ucz8KKwkgKi8KKwlpZiAocW9zKQorCQlzZWxmLT5xb3MgPSAqcW9zOworCisJaXJsbXBfZG9fbHNhcF9ldmVudChzZWxmLCBMTV9DT05ORUNUX1JFUVVFU1QsIHR4X3NrYik7CisKKwkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBpcmxhcF9kYXRhX3JlcXVlc3QoKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHR4X3NrYik7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCS8qIENsZWFudXAgKi8KKwlpZih0eF9za2IpCisJCWRldl9rZnJlZV9za2IodHhfc2tiKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpcmxtcF9jb25uZWN0X3JlcXVlc3QpOworCisvKgorICogRnVuY3Rpb24gaXJsbXBfY29ubmVjdF9pbmRpY2F0aW9uIChzZWxmKQorICoKKyAqICAgIEluY29taW5nIGNvbm5lY3Rpb24KKyAqCisgKi8KK3ZvaWQgaXJsbXBfY29ubmVjdF9pbmRpY2F0aW9uKHN0cnVjdCBsc2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBtYXhfc2VnX3NpemU7CisJaW50IGxhcF9oZWFkZXJfc2l6ZTsKKwlpbnQgbWF4X2hlYWRlcl9zaXplOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm47KTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIHNsc2FwX3NlbD0lMDJ4LCBkbHNhcF9zZWw9JTAyeFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBzZWxmLT5zbHNhcF9zZWwsIHNlbGYtPmRsc2FwX3NlbCk7CisKKwkvKiBOb3RlIDogc2VsZi0+bGFwIGlzIHNldCBpbiBpcmxtcF9saW5rX2RhdGFfaW5kaWNhdGlvbigpLAorCSAqIChjYXNlIENPTk5FQ1RfQ01EOikgYmVjYXVzZSB3ZSBoYXZlIG5vIHdheSB0byBzZXQgaXQgaGVyZS4KKwkgKiBTaW1pbGFybHksIHNlbGYtPmRsc2FwX3NlbCBpcyB1c3VhbGx5IHNldCBpbiBpcmxtcF9maW5kX2xzYXAoKS4KKwkgKiBKZWFuIElJICovCisKKwlzZWxmLT5xb3MgPSAqc2VsZi0+bGFwLT5xb3M7CisKKwltYXhfc2VnX3NpemUgPSBzZWxmLT5sYXAtPnFvcy0+ZGF0YV9zaXplLnZhbHVlLUxNUF9IRUFERVI7CisJbGFwX2hlYWRlcl9zaXplID0gSVJMQVBfR0VUX0hFQURFUl9TSVpFKHNlbGYtPmxhcC0+aXJsYXApOworCW1heF9oZWFkZXJfc2l6ZSA9IExNUF9IRUFERVIgKyBsYXBfaGVhZGVyX3NpemU7CisKKwkvKiBIaWRlIExNUF9DT05UUk9MX0hFQURFUiBoZWFkZXIgZnJvbSBsYXllciBhYm92ZSAqLworCXNrYl9wdWxsKHNrYiwgTE1QX0NPTlRST0xfSEVBREVSKTsKKworCWlmIChzZWxmLT5ub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uKSB7CisJCS8qIERvbid0IGZvcmdldCB0byByZWZjb3VudCBpdCAtIHNlZSBpcmxhcF9kcml2ZXJfcmN2KCkuICovCisJCXNrYl9nZXQoc2tiKTsKKwkJc2VsZi0+bm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsCisJCQkJCQkmc2VsZi0+cW9zLCBtYXhfc2VnX3NpemUsCisJCQkJCQltYXhfaGVhZGVyX3NpemUsIHNrYik7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfY29ubmVjdF9yZXNwb25zZSAoaGFuZGxlLCB1c2VyZGF0YSkKKyAqCisgKiAgICBTZXJ2aWNlIHVzZXIgaXMgYWNjZXB0aW5nIGNvbm5lY3Rpb24KKyAqCisgKi8KK2ludCBpcmxtcF9jb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCBsc2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQodXNlcmRhdGEgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkvKiBXZSBzZXQgdGhlIGNvbm5lY3RlZCBiaXQgYW5kIG1vdmUgdGhlIGxzYXAgdG8gdGhlIGNvbm5lY3RlZCBsaXN0CisJICogaW4gdGhlIHN0YXRlIG1hY2hpbmUgaXRzZWxmLiBKZWFuIElJICovCisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBzbHNhcF9zZWw9JTAyeCwgZGxzYXBfc2VsPSUwMnhcbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+c2xzYXBfc2VsLCBzZWxmLT5kbHNhcF9zZWwpOworCisJLyogTWFrZSByb29tIGZvciBNVVggY29udHJvbCBoZWFkZXIgKDMgYnl0ZXMpICovCisJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHVzZXJkYXRhKSA+PSBMTVBfQ09OVFJPTF9IRUFERVIsIHJldHVybiAtMTspOworCXNrYl9wdXNoKHVzZXJkYXRhLCBMTVBfQ09OVFJPTF9IRUFERVIpOworCisJaXJsbXBfZG9fbHNhcF9ldmVudChzZWxmLCBMTV9DT05ORUNUX1JFU1BPTlNFLCB1c2VyZGF0YSk7CisKKwkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBpcmxhcF9kYXRhX3JlcXVlc3QoKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpcmxtcF9jb25uZWN0X3Jlc3BvbnNlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2Nvbm5lY3RfY29uZmlybSAoaGFuZGxlLCBza2IpCisgKgorICogICAgTFNBUCBjb25uZWN0aW9uIGNvbmZpcm1lZCBwZWVyIGRldmljZSEKKyAqLwordm9pZCBpcmxtcF9jb25uZWN0X2NvbmZpcm0oc3RydWN0IGxzYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG1heF9oZWFkZXJfc2l6ZTsKKwlpbnQgbGFwX2hlYWRlcl9zaXplOworCWludCBtYXhfc2VnX3NpemU7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm47KTsKKworCXNlbGYtPnFvcyA9ICpzZWxmLT5sYXAtPnFvczsKKworCW1heF9zZWdfc2l6ZSAgICA9IHNlbGYtPmxhcC0+cW9zLT5kYXRhX3NpemUudmFsdWUtTE1QX0hFQURFUjsKKwlsYXBfaGVhZGVyX3NpemUgPSBJUkxBUF9HRVRfSEVBREVSX1NJWkUoc2VsZi0+bGFwLT5pcmxhcCk7CisJbWF4X2hlYWRlcl9zaXplID0gTE1QX0hFQURFUiArIGxhcF9oZWFkZXJfc2l6ZTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIG1heF9oZWFkZXJfc2l6ZT0lZFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBtYXhfaGVhZGVyX3NpemUpOworCisJLyogSGlkZSBMTVBfQ09OVFJPTF9IRUFERVIgaGVhZGVyIGZyb20gbGF5ZXIgYWJvdmUgKi8KKwlza2JfcHVsbChza2IsIExNUF9DT05UUk9MX0hFQURFUik7CisKKwlpZiAoc2VsZi0+bm90aWZ5LmNvbm5lY3RfY29uZmlybSkgeworCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgLSBzZWUgaXJsYXBfZHJpdmVyX3JjdigpICovCisJCXNrYl9nZXQoc2tiKTsKKwkJc2VsZi0+bm90aWZ5LmNvbm5lY3RfY29uZmlybShzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsCisJCQkJCSAgICAgJnNlbGYtPnFvcywgbWF4X3NlZ19zaXplLAorCQkJCQkgICAgIG1heF9oZWFkZXJfc2l6ZSwgc2tiKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9kdXAgKG9yaWcsIGluc3RhbmNlKQorICoKKyAqICAgIER1cGxpY2F0ZSBMU0FQLCBjYW4gYmUgdXNlZCBieSBzZXJ2ZXJzIHRvIGNvbmZpcm0gYSBjb25uZWN0aW9uIG9uIGEKKyAqICAgIG5ldyBMU0FQIHNvIGl0IGNhbiBrZWVwIGxpc3RlbmluZyBvbiB0aGUgb2xkIG9uZS4KKyAqCisgKi8KK3N0cnVjdCBsc2FwX2NiICppcmxtcF9kdXAoc3RydWN0IGxzYXBfY2IgKm9yaWcsIHZvaWQgKmluc3RhbmNlKQoreworCXN0cnVjdCBsc2FwX2NiICpuZXc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJLyogT25seSBhbGxvd2VkIHRvIGR1cGxpY2F0ZSB1bmNvbm5lY3RlZCBMU0FQJ3MsIGFuZCBvbmx5IExTQVBzCisJICogdGhhdCBoYXZlIHJlY2VpdmVkIGEgY29ubmVjdCBpbmRpY2F0aW9uLiBKZWFuIElJICovCisJaWYgKCghaGFzaGJpbl9maW5kKGlybG1wLT51bmNvbm5lY3RlZF9sc2FwcywgKGxvbmcpIG9yaWcsIE5VTEwpKSB8fAorCSAgICAob3JpZy0+bGFwID09IE5VTEwpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGludmFsaWQgTFNBUCAod3Jvbmcgc3RhdGUpXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLT5oYl9zcGlubG9jaywKKwkJCQkgICAgICAgZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyBpbnN0YW5jZSAqLworCW5ldyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsc2FwX2NiKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFuZXcpICB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHVuYWJsZSB0byBrbWFsbG9jXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLAorCQkJCSAgICAgICBmbGFncyk7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBEdXAgKi8KKwltZW1jcHkobmV3LCBvcmlnLCBzaXplb2Yoc3RydWN0IGxzYXBfY2IpKTsKKwkvKiBuZXctPmxhcCA9IG9yaWctPmxhcDsgPT4gZG9uZSBpbiB0aGUgbWVtY3B5KCkgKi8KKwkvKiBuZXctPnNsc2FwX3NlbCA9IG9yaWctPnNsc2FwX3NlbDsgPT4gZG9uZSBpbiB0aGUgbWVtY3B5KCkgKi8KKwluZXctPmNvbm5fc2tiID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIE5vdCBldmVyeXRoaW5nIGlzIHRoZSBzYW1lICovCisJbmV3LT5ub3RpZnkuaW5zdGFuY2UgPSBpbnN0YW5jZTsKKworCWluaXRfdGltZXIoJm5ldy0+d2F0Y2hkb2dfdGltZXIpOworCisJaGFzaGJpbl9pbnNlcnQoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLCAoaXJkYV9xdWV1ZV90ICopIG5ldywKKwkJICAgICAgIChsb25nKSBuZXcsIE5VTEwpOworCisjaWZkZWYgQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQCisJLyogTWFrZSBzdXJlIHRoYXQgd2UgaW52YWxpZGF0ZSB0aGUgTFNBUCBjYWNoZSAqLworCW5ldy0+bGFwLT5jYWNoZS52YWxpZCA9IEZBTFNFOworI2VuZGlmIC8qIENPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUCAqLworCisJcmV0dXJuIG5ldzsKK30KK0VYUE9SVF9TWU1CT0woaXJsbXBfZHVwKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2Rpc2Nvbm5lY3RfcmVxdWVzdCAoaGFuZGxlLCB1c2VyZGF0YSkKKyAqCisgKiAgICBUaGUgc2VydmljZSB1c2VyIGlzIHJlcXVlc3RpbmcgZGlzY29ubmVjdGlvbiwgdGhpcyB3aWxsIG5vdCByZW1vdmUgdGhlCisgKiAgICBMU0FQLCBidXQgb25seSBtYXJrIGl0IGFzIGRpc2Nvbm5lY3RlZAorICovCitpbnQgaXJsbXBfZGlzY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBsc2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpCit7CisJc3RydWN0IGxzYXBfY2IgKmxzYXA7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVCh1c2VyZGF0YSAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIEFscmVhZHkgZGlzY29ubmVjdGVkID8KKwkgKiBUaGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKCkKKwkgKiBhbmQgdXMgdGhhdCBtaWdodCBtZXNzIHVwIHRoZSBoYXNoYmlucyBiZWxvdy4gVGhpcyBmaXhlcyBpdC4KKwkgKiBKZWFuIElJICovCisJaWYgKCEgdGVzdF9hbmRfY2xlYXJfYml0KDAsICZzZWxmLT5jb25uZWN0ZWQpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGFscmVhZHkgZGlzY29ubmVjdGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlza2JfcHVzaCh1c2VyZGF0YSwgTE1QX0NPTlRST0xfSEVBREVSKTsKKworCS8qCisJICogIERvIHRoZSBldmVudCBiZWZvcmUgdGhlIG90aGVyIHN0dWZmIHNpbmNlIHdlIG11c3Qga25vdworCSAqICB3aGljaCBsYXAgbGF5ZXIgdGhhdCB0aGUgZnJhbWUgc2hvdWxkIGJlIHRyYW5zbWl0dGVkIG9uCisJICovCisJaXJsbXBfZG9fbHNhcF9ldmVudChzZWxmLCBMTV9ESVNDT05ORUNUX1JFUVVFU1QsIHVzZXJkYXRhKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlybGFwX2RhdGFfcmVxdWVzdCgpLiAqLworCWRldl9rZnJlZV9za2IodXNlcmRhdGEpOworCisJLyoKKwkgKiAgUmVtb3ZlIExTQVAgZnJvbSBsaXN0IG9mIGNvbm5lY3RlZCBMU0FQcyBmb3IgdGhlIHBhcnRpY3VsYXIgbGluaworCSAqICBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIGxpc3Qgb2YgdW5jb25uZWN0ZWQgTFNBUHMKKwkgKi8KKwlJUkRBX0FTU0VSVChzZWxmLT5sYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5sYXAtPmxzYXBzICE9IE5VTEwsIHJldHVybiAtMTspOworCisJbHNhcCA9IGhhc2hiaW5fcmVtb3ZlKHNlbGYtPmxhcC0+bHNhcHMsIChsb25nKSBzZWxmLCBOVUxMKTsKKyNpZmRlZiBDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVAKKwlzZWxmLT5sYXAtPmNhY2hlLnZhbGlkID0gRkFMU0U7CisjZW5kaWYKKworCUlSREFfQVNTRVJUKGxzYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQobHNhcC0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKGxzYXAgPT0gc2VsZiwgcmV0dXJuIC0xOyk7CisKKwloYXNoYmluX2luc2VydChpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMsIChpcmRhX3F1ZXVlX3QgKikgc2VsZiwKKwkJICAgICAgIChsb25nKSBzZWxmLCBOVUxMKTsKKworCS8qIFJlc2V0IHNvbWUgdmFsdWVzICovCisJc2VsZi0+ZGxzYXBfc2VsID0gTFNBUF9BTlk7CisJc2VsZi0+bGFwID0gTlVMTDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpcmxtcF9kaXNjb25uZWN0X3JlcXVlc3QpOworCisvKgorICogRnVuY3Rpb24gaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uIChyZWFzb24sIHVzZXJkYXRhKQorICoKKyAqICAgIExTQVAgaXMgYmVpbmcgY2xvc2VkIQorICovCit2b2lkIGlybG1wX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgTE1fUkVBU09OIHJlYXNvbiwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKKworCUlSREFfREVCVUcoMSwgIiVzKCksIHJlYXNvbj0lc1xuIiwgX19GVU5DVElPTl9fLCBpcmxtcF9yZWFzb25zW3JlYXNvbl0pOworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybjspOworCisJSVJEQV9ERUJVRygzLCAiJXMoKSwgc2xzYXBfc2VsPSUwMngsIGRsc2FwX3NlbD0lMDJ4XG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPnNsc2FwX3NlbCwgc2VsZi0+ZGxzYXBfc2VsKTsKKworCS8qIEFscmVhZHkgZGlzY29ubmVjdGVkID8KKwkgKiBUaGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gaXJsbXBfZGlzY29ubmVjdF9yZXF1ZXN0KCkKKwkgKiBhbmQgdXMgdGhhdCBtaWdodCBtZXNzIHVwIHRoZSBoYXNoYmlucyBiZWxvdy4gVGhpcyBmaXhlcyBpdC4KKwkgKiBKZWFuIElJICovCisJaWYgKCEgdGVzdF9hbmRfY2xlYXJfYml0KDAsICZzZWxmLT5jb25uZWN0ZWQpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGFscmVhZHkgZGlzY29ubmVjdGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogIFJlbW92ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoaXMgTFNBUCBhbmQgdGhlIGxpbmsgaXQgdXNlZAorCSAqLworCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5sYXAtPmxzYXBzICE9IE5VTEwsIHJldHVybjspOworCisJbHNhcCA9IGhhc2hiaW5fcmVtb3ZlKHNlbGYtPmxhcC0+bHNhcHMsIChsb25nKSBzZWxmLCBOVUxMKTsKKyNpZmRlZiBDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVAKKwlzZWxmLT5sYXAtPmNhY2hlLnZhbGlkID0gRkFMU0U7CisjZW5kaWYKKworCUlSREFfQVNTRVJUKGxzYXAgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQobHNhcCA9PSBzZWxmLCByZXR1cm47KTsKKwloYXNoYmluX2luc2VydChpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMsIChpcmRhX3F1ZXVlX3QgKikgbHNhcCwKKwkJICAgICAgIChsb25nKSBsc2FwLCBOVUxMKTsKKworCXNlbGYtPmRsc2FwX3NlbCA9IExTQVBfQU5ZOworCXNlbGYtPmxhcCA9IE5VTEw7CisKKwkvKgorCSAqICBJbmZvcm0gc2VydmljZSB1c2VyCisJICovCisJaWYgKHNlbGYtPm5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24pIHsKKwkJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2VlIGlybGFwX2RyaXZlcl9yY3YoKS4gKi8KKwkJaWYoc2tiKQorCQkJc2tiX2dldChza2IpOworCQlzZWxmLT5ub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwKKwkJCQkJCSAgIHNlbGYsIHJlYXNvbiwgc2tiKTsKKwl9IGVsc2UgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBubyBoYW5kbGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2RvX2V4cGlyeSAodm9pZCkKKyAqCisgKiAgICBEbyBhIGNsZWFudXAgb2YgdGhlIGRpc2NvdmVyeSBsb2cgKHJlbW92ZSBvbGQgZW50cmllcykKKyAqCisgKiBOb3RlIDogc2VwYXJhdGUgZnJvbSBpcmxtcF9kb19kaXNjb3ZlcnkoKSBzbyB0aGF0IHdlIGNhbiBoYW5kbGUKKyAqIHBhc3NpdmUgZGlzY292ZXJ5IHByb3Blcmx5LgorICovCit2b2lkIGlybG1wX2RvX2V4cGlyeSh2b2lkKQoreworCXN0cnVjdCBsYXBfY2IgKmxhcDsKKworCS8qCisJICogRXhwaXJlIGRpc2NvdmVyeSBvbiBhbGwgbGlua3Mgd2hpY2ggYXJlICpub3QqIGNvbm5lY3RlZC4KKwkgKiBPbiBsaW5rcyB3aGljaCBhcmUgY29ubmVjdGVkLCB3ZSBjYW4ndCBkbyBkaXNjb3ZlcnkKKwkgKiBhbnltb3JlIGFuZCBjYW4ndCByZWZyZXNoIHRoZSBsb2csIHNvIHdlIGZyZWV6ZSB0aGUKKwkgKiBkaXNjb3ZlcnkgbG9nIHRvIGtlZXAgaW5mbyBhYm91dCB0aGUgZGV2aWNlIHdlIGFyZQorCSAqIGNvbm5lY3RlZCB0by4KKwkgKiBUaGlzIGluZm8gaXMgbWFuZGF0b3J5IGlmIHdlIHdhbnQgaXJsbXBfY29ubmVjdF9yZXF1ZXN0KCkKKwkgKiB0byB3b3JrIHByb3Blcmx5LiAtIEplYW4gSUkKKwkgKi8KKwlsYXAgPSAoc3RydWN0IGxhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdChpcmxtcC0+bGlua3MpOworCXdoaWxlIChsYXAgIT0gTlVMTCkgeworCQlJUkRBX0FTU0VSVChsYXAtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOworCisJCWlmIChsYXAtPmxhcF9zdGF0ZSA9PSBMQVBfU1RBTkRCWSkgeworCQkJLyogRXhwaXJlIGRpc2NvdmVyaWVzIGRpc2NvdmVyZWQgb24gdGhpcyBsaW5rICovCisJCQlpcmxtcF9leHBpcmVfZGlzY292ZXJpZXMoaXJsbXAtPmNhY2hlbG9nLCBsYXAtPnNhZGRyLAorCQkJCQkJIEZBTFNFKTsKKwkJfQorCQlsYXAgPSAoc3RydWN0IGxhcF9jYiAqKSBoYXNoYmluX2dldF9uZXh0KGlybG1wLT5saW5rcyk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfZG9fZGlzY292ZXJ5IChuc2xvdHMpCisgKgorICogICAgRG8gc29tZSBkaXNjb3Zlcnkgb24gYWxsIGxpbmtzCisgKgorICogTm90ZSA6IGxvZyBleHBpcnkgaXMgZG9uZSBhYm92ZS4KKyAqLwordm9pZCBpcmxtcF9kb19kaXNjb3ZlcnkoaW50IG5zbG90cykKK3sKKwlzdHJ1Y3QgbGFwX2NiICpsYXA7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHZhbHVlIGlzIHNhbmUgKi8KKwlpZiAoKG5zbG90cyAhPSAxKSAmJiAobnNsb3RzICE9IDYpICYmIChuc2xvdHMgIT0gOCkgJiYgKG5zbG90cyAhPSAxNikpeworCQlJUkRBX1dBUk5JTkcoIiVzOiBpbnZhbGlkIHZhbHVlIGZvciBudW1iZXIgb2Ygc2xvdHMhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQluc2xvdHMgPSBzeXNjdGxfZGlzY292ZXJ5X3Nsb3RzID0gODsKKwl9CisKKwkvKiBDb25zdHJ1Y3QgbmV3IGRpc2NvdmVyeSBpbmZvIHRvIGJlIHVzZWQgYnkgSXJMQVAsICovCisJdTE2aG8oaXJsbXAtPmRpc2NvdmVyeV9jbWQuZGF0YS5oaW50cykgPSBpcmxtcC0+aGludHMud29yZDsKKworCS8qCisJICogIFNldCBjaGFyYWN0ZXIgc2V0IGZvciBkZXZpY2UgbmFtZSAod2UgdXNlIEFTQ0lJKSwgYW5kCisJICogIGNvcHkgZGV2aWNlIG5hbWUuIFJlbWVtYmVyIHRvIG1ha2Ugcm9vbSBmb3IgYSBcMCBhdCB0aGUKKwkgKiAgZW5kCisJICovCisJaXJsbXAtPmRpc2NvdmVyeV9jbWQuZGF0YS5jaGFyc2V0ID0gQ1NfQVNDSUk7CisJc3RybmNweShpcmxtcC0+ZGlzY292ZXJ5X2NtZC5kYXRhLmluZm8sIHN5c2N0bF9kZXZuYW1lLAorCQlOSUNLTkFNRV9NQVhfTEVOKTsKKwlpcmxtcC0+ZGlzY292ZXJ5X2NtZC5uYW1lX2xlbiA9IHN0cmxlbihpcmxtcC0+ZGlzY292ZXJ5X2NtZC5kYXRhLmluZm8pOworCWlybG1wLT5kaXNjb3ZlcnlfY21kLm5zbG90cyA9IG5zbG90czsKKworCS8qCisJICogVHJ5IHRvIHNlbmQgZGlzY292ZXJ5IHBhY2tldHMgb24gYWxsIGxpbmtzCisJICovCisJbGFwID0gKHN0cnVjdCBsYXBfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJsbXAtPmxpbmtzKTsKKwl3aGlsZSAobGFwICE9IE5VTEwpIHsKKwkJSVJEQV9BU1NFUlQobGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKKworCQlpZiAobGFwLT5sYXBfc3RhdGUgPT0gTEFQX1NUQU5EQlkpIHsKKwkJCS8qIFRyeSB0byBkaXNjb3ZlciAqLworCQkJaXJsbXBfZG9fbGFwX2V2ZW50KGxhcCwgTE1fTEFQX0RJU0NPVkVSWV9SRVFVRVNULAorCQkJCQkgICBOVUxMKTsKKwkJfQorCQlsYXAgPSAoc3RydWN0IGxhcF9jYiAqKSBoYXNoYmluX2dldF9uZXh0KGlybG1wLT5saW5rcyk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfZGlzY292ZXJ5X3JlcXVlc3QgKG5zbG90cykKKyAqCisgKiAgICBEbyBhIGRpc2NvdmVyeSBvZiBkZXZpY2VzIGluIGZyb250IG9mIHRoZSBjb21wdXRlcgorICoKKyAqIElmIHRoZSBjYWxsZXIgaGFzIHJlZ2lzdGVyZWQgYSBjbGllbnQgZGlzY292ZXJ5IGNhbGxiYWNrLCB0aGlzCisgKiBhbGxvdyBoaW0gdG8gcmVjZWl2ZSB0aGUgZnVsbCBjb250ZW50IG9mIHRoZSBkaXNjb3ZlcnkgbG9nIHRocm91Z2gKKyAqIHRoaXMgY2FsbGJhY2sgKGFzIG5vcm1hbGx5IGhlIHdpbGwgcmVjZWl2ZSBvbmx5IG5ldyBkaXNjb3ZlcmllcykuCisgKi8KK3ZvaWQgaXJsbXBfZGlzY292ZXJ5X3JlcXVlc3QoaW50IG5zbG90cykKK3sKKwkvKiBSZXR1cm4gY3VycmVudCBjYWNoZWQgZGlzY292ZXJ5IGxvZyAoaW4gZnVsbCkgKi8KKwlpcmxtcF9kaXNjb3ZlcnlfY29uZmlybShpcmxtcC0+Y2FjaGVsb2csIERJU0NPVkVSWV9MT0cpOworCisJLyoKKwkgKiBTdGFydCBhIHNpbmdsZSBkaXNjb3Zlcnkgb3BlcmF0aW9uIGlmIGRpc2NvdmVyeSBpcyBub3QgYWxyZWFkeQorICAgICAgICAgKiBydW5uaW5nCisJICovCisJaWYgKCFzeXNjdGxfZGlzY292ZXJ5KSB7CisJCS8qIENoZWNrIGlmIHVzZXIgd2FudHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgKi8KKwkJaWYgKG5zbG90cyA9PSBESVNDT1ZFUllfREVGQVVMVF9TTE9UUykKKwkJCW5zbG90cyA9IHN5c2N0bF9kaXNjb3Zlcnlfc2xvdHM7CisKKwkJaXJsbXBfZG9fZGlzY292ZXJ5KG5zbG90cyk7CisJCS8qIE5vdGUgOiB3ZSBuZXZlciBkbyBleHBpcnkgaGVyZS4gRXhwaXJ5IHdpbGwgcnVuIG9uIHRoZQorCQkgKiBkaXNjb3ZlcnkgdGltZXIgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdGUgb2Ygc3lzY3RsX2Rpc2NvdmVyeQorCQkgKiBKZWFuIElJICovCisJfQorfQorRVhQT1JUX1NZTUJPTChpcmxtcF9kaXNjb3ZlcnlfcmVxdWVzdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9nZXRfZGlzY292ZXJpZXMgKHBuLCBtYXNrLCBzbG90cykKKyAqCisgKiAgICBSZXR1cm4gdGhlIGN1cnJlbnQgZGlzY292ZXJ5IGxvZworICoKKyAqIElmIGRpc2NvdmVyeSBpcyBub3QgZW5hYmxlZCwgeW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYWdhaW4KKyAqIGFmdGVyIDEgb3IgMiBzZWNvbmRzIChpLmUuIGFmdGVyIGRpc2NvdmVyeSBoYXMgYmVlbiBkb25lKS4KKyAqLworc3RydWN0IGlyZGFfZGV2aWNlX2luZm8gKmlybG1wX2dldF9kaXNjb3ZlcmllcyhpbnQgKnBuLCBfX3UxNiBtYXNrLCBpbnQgbnNsb3RzKQoreworCS8qIElmIGRpc2NvdmVyeSBpcyBub3QgZW5hYmxlZCwgaXQncyBsaWtlbHkgdGhhdCB0aGUgZGlzY292ZXJ5IGxvZworCSAqIHdpbGwgYmUgZW1wdHkuIFNvLCB3ZSB0cmlnZ2VyIGEgc2luZ2xlIGRpc2NvdmVyeSwgc28gdGhhdCBuZXh0CisJICogdGltZSB0aGUgdXNlciBjYWxsIHVzIHRoZXJlIG1pZ2h0IGJlIHNvbWUgcmVzdWx0cyBpbiB0aGUgbG9nLgorCSAqIEplYW4gSUkKKwkgKi8KKwlpZiAoIXN5c2N0bF9kaXNjb3ZlcnkpIHsKKwkJLyogQ2hlY2sgaWYgdXNlciB3YW50cyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCAqLworCQlpZiAobnNsb3RzID09IERJU0NPVkVSWV9ERUZBVUxUX1NMT1RTKQorCQkJbnNsb3RzID0gc3lzY3RsX2Rpc2NvdmVyeV9zbG90czsKKworCQkvKiBTdGFydCBkaXNjb3ZlcnkgLSB3aWxsIGNvbXBsZXRlIHNvbWV0aW1lIGxhdGVyICovCisJCWlybG1wX2RvX2Rpc2NvdmVyeShuc2xvdHMpOworCQkvKiBOb3RlIDogd2UgbmV2ZXIgZG8gZXhwaXJ5IGhlcmUuIEV4cGlyeSB3aWxsIHJ1biBvbiB0aGUKKwkJICogZGlzY292ZXJ5IHRpbWVyIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIHN5c2N0bF9kaXNjb3ZlcnkKKwkJICogSmVhbiBJSSAqLworCX0KKworCS8qIFJldHVybiBjdXJyZW50IGNhY2hlZCBkaXNjb3ZlcnkgbG9nICovCisJcmV0dXJuKGlybG1wX2NvcHlfZGlzY292ZXJpZXMoaXJsbXAtPmNhY2hlbG9nLCBwbiwgbWFzaywgVFJVRSkpOworfQorRVhQT1JUX1NZTUJPTChpcmxtcF9nZXRfZGlzY292ZXJpZXMpOworCisvKgorICogRnVuY3Rpb24gaXJsbXBfbm90aWZ5X2NsaWVudCAobG9nKQorICoKKyAqICAgIE5vdGlmeSBhbGwgYWJvdXQgZGlzY292ZXJlZCBkZXZpY2VzCisgKgorICogQ2xpZW50cyByZWdpc3RlcmVkIHdpdGggSXJMTVAgYXJlIDoKKyAqCW8gSXJDb21tCisgKglvIElyTEFOCisgKglvIEFueSBzb2NrZXQgKGluIGFueSBzdGF0ZSAtIG91Y2gsIHRoYXQgbWF5IGJlIGEgbG90ICEpCisgKiBUaGUgY2xpZW50IG1heSBoYXZlIGRlZmluZWQgYSBjYWxsYmFjayB0byBiZSBub3RpZmllZCBpbiBjYXNlIG9mCisgKiBwYXJ0aWFsL3NlbGVjdGl2ZSBkaXNjb3ZlcnkgYmFzZWQgb24gdGhlIGhpbnRzIHRoYXQgaXQgcGFzc2VkIHRvIElyTE1QLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2lybG1wX25vdGlmeV9jbGllbnQoaXJsbXBfY2xpZW50X3QgKmNsaWVudCwKKwkJICAgIGhhc2hiaW5fdCAqbG9nLCBESVNDT1ZFUllfTU9ERSBtb2RlKQoreworCWRpc2NpbmZvX3QgKmRpc2NvdmVyaWVzOwkvKiBDb3B5IG9mIHRoZSBkaXNjb3ZlcnkgbG9nICovCisJaW50CW51bWJlcjsJCQkvKiBOdW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGxvZyAqLworCWludAlpOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIENoZWNrIGlmIGNsaWVudCB3YW50cyBvciBub3QgcGFydGlhbC9zZWxlY3RpdmUgbG9nIChvcHRpbWlzYXRpb24pICovCisJaWYgKCFjbGllbnQtPmRpc2NvX2NhbGxiYWNrKQorCQlyZXR1cm47CisKKwkvKgorCSAqIExvY2tpbmcgbm90ZXMgOgorCSAqIHRoZSBvbGQgY29kZSB3YXMgbWFuaXB1bGF0aW5nIHRoZSBsb2cgZGlyZWN0bHksIHdoaWNoIHdhcworCSAqIHZlcnkgcmFjeS4gTm93LCB3ZSB1c2UgY29weV9kaXNjb3ZlcmllcywgdGhhdCBwcm90ZWN0cworCSAqIGl0c2VsZiB3aGlsZSBkdW1waW5nIHRoZSBsb2cgZm9yIHVzLgorCSAqIFRoZSBvdmVyaGVhZCBvZiB0aGUgY29weSBpcyBjb21wZW5zYXRlZCBieSB0aGUgZmFjdCB0aGF0CisJICogd2Ugb25seSBwYXNzIG5ldyBkaXNjb3ZlcmllcyBpbiBub3JtYWwgbW9kZSBhbmQgZG9uJ3QKKwkgKiBwYXNzIHRoZSBzYW1lIG9sZCBlbnRyeSBldmVyeSAzcyB0byB0aGUgY2FsbGVyIGFzIHdlIHVzZWQKKwkgKiB0byBkbyAodmlydHVhbCBmdW5jdGlvbiBjYWxsaW5nIGlzIGV4cGVuc2l2ZSkuCisJICogSmVhbiBJSQorCSAqLworCisJLyoKKwkgKiBOb3csIGNoZWNrIGFsbCBkaXNjb3ZlcmVkIGRldmljZXMgKGlmIGFueSksIGFuZCBub3RpZnkgY2xpZW50CisJICogb25seSBhYm91dCB0aGUgc2VydmljZXMgdGhhdCB0aGUgY2xpZW50IGlzIGludGVyZXN0ZWQgaW4KKwkgKiBXZSBhbHNvIG5vdGlmeSBvbmx5IGFib3V0IHRoZSBuZXcgZGV2aWNlcyB1bmxlc3MgdGhlIGNhbGxlcgorCSAqIGV4cGxpY2l0bHkgcmVxdWVzdCBhIGR1bXAgb2YgdGhlIGxvZy4gSmVhbiBJSQorCSAqLworCWRpc2NvdmVyaWVzID0gaXJsbXBfY29weV9kaXNjb3Zlcmllcyhsb2csICZudW1iZXIsCisJCQkJCSAgICAgY2xpZW50LT5oaW50X21hc2sud29yZCwKKwkJCQkJICAgICAobW9kZSA9PSBESVNDT1ZFUllfTE9HKSk7CisJLyogQ2hlY2sgaWYgdGhlIHdlIGdvdCBzb21lIHJlc3VsdHMgKi8KKwlpZiAoZGlzY292ZXJpZXMgPT0gTlVMTCkKKwkJcmV0dXJuOwkvKiBObyBub2RlcyBkaXNjb3ZlcmVkICovCisKKwkvKiBQYXNzIGFsbCBlbnRyaWVzIHRvIHRoZSBsaXN0ZW5lciAqLworCWZvcihpID0gMDsgaSA8IG51bWJlcjsgaSsrKQorCQljbGllbnQtPmRpc2NvX2NhbGxiYWNrKCYoZGlzY292ZXJpZXNbaV0pLCBtb2RlLCBjbGllbnQtPnByaXYpOworCisJLyogRnJlZSB1cCBvdXIgYnVmZmVyICovCisJa2ZyZWUoZGlzY292ZXJpZXMpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfZGlzY292ZXJ5X2NvbmZpcm0gKCBzZWxmLCBsb2cpCisgKgorICogICAgU29tZSBkZXZpY2UocykgYW5zd2VyZWQgdG8gb3VyIGRpc2NvdmVyeSByZXF1ZXN0ISBDaGVjayB0byBzZWUgd2hpY2gKKyAqICAgIGRldmljZSBpdCBpcywgYW5kIGdpdmUgaW5kaWNhdGlvbiB0byB0aGUgY2xpZW50KHMpCisgKgorICovCit2b2lkIGlybG1wX2Rpc2NvdmVyeV9jb25maXJtKGhhc2hiaW5fdCAqbG9nLCBESVNDT1ZFUllfTU9ERSBtb2RlKQoreworCWlybG1wX2NsaWVudF90ICpjbGllbnQ7CisJaXJsbXBfY2xpZW50X3QgKmNsaWVudF9uZXh0OworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKGxvZyAhPSBOVUxMLCByZXR1cm47KTsKKworCWlmICghKEhBU0hCSU5fR0VUX1NJWkUobG9nKSkpCisJCXJldHVybjsKKworCS8qIEZvciBlYWNoIGNsaWVudCAtIG5vdGlmeSBjYWxsYmFjayBtYXkgdG91Y2ggY2xpZW50IGxpc3QgKi8KKwljbGllbnQgPSAoaXJsbXBfY2xpZW50X3QgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJsbXAtPmNsaWVudHMpOworCXdoaWxlIChOVUxMICE9IGhhc2hiaW5fZmluZF9uZXh0KGlybG1wLT5jbGllbnRzLCAobG9uZykgY2xpZW50LCBOVUxMLAorCQkJCQkgKHZvaWQgKikgJmNsaWVudF9uZXh0KSApIHsKKwkJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIG5vdGlmeSBjbGllbnQgKi8KKwkJaXJsbXBfbm90aWZ5X2NsaWVudChjbGllbnQsIGxvZywgbW9kZSk7CisKKwkJY2xpZW50ID0gY2xpZW50X25leHQ7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfZGlzY292ZXJ5X2V4cGlyeSAoZXhwaXJ5KQorICoKKyAqCVRoaXMgZGV2aWNlIGlzIG5vIGxvbmdlciBiZWVuIGRpc2NvdmVyZWQsIGFuZCB0aGVyZWZvcmUgaXQgaXMgYmVpbmcKKyAqCXB1cmdlZCBmcm9tIHRoZSBkaXNjb3ZlcnkgbG9nLiBJbmZvcm0gYWxsIGNsaWVudHMgd2hvIGhhdmUKKyAqCXJlZ2lzdGVyZWQgZm9yIHRoaXMgZXZlbnQuLi4KKyAqCisgKglOb3RlIDogY2FsbGVkIGV4Y2x1c2l2ZWx5IGZyb20gZGlzY292ZXJ5LmMKKyAqCU5vdGUgOiB0aGlzIGlzIG5vIGxvbmdlciBjYWxsZWQgdW5kZXIgZGlzY292ZXJ5IHNwaW5sb2NrLCBzbyB0aGUKKyAqCQljbGllbnQgY2FuIGRvIHdoYXRldmVyIGhlIHdhbnRzIGluIHRoZSBjYWxsYmFjay4KKyAqLwordm9pZCBpcmxtcF9kaXNjb3ZlcnlfZXhwaXJ5KGRpc2NpbmZvX3QgKmV4cGlyaWVzLCBpbnQgbnVtYmVyKQoreworCWlybG1wX2NsaWVudF90ICpjbGllbnQ7CisJaXJsbXBfY2xpZW50X3QgKmNsaWVudF9uZXh0OworCWludAkJaTsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChleHBpcmllcyAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIEZvciBlYWNoIGNsaWVudCAtIG5vdGlmeSBjYWxsYmFjayBtYXkgdG91Y2ggY2xpZW50IGxpc3QgKi8KKwljbGllbnQgPSAoaXJsbXBfY2xpZW50X3QgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJsbXAtPmNsaWVudHMpOworCXdoaWxlIChOVUxMICE9IGhhc2hiaW5fZmluZF9uZXh0KGlybG1wLT5jbGllbnRzLCAobG9uZykgY2xpZW50LCBOVUxMLAorCQkJCQkgKHZvaWQgKikgJmNsaWVudF9uZXh0KSApIHsKKworCQkvKiBQYXNzIGFsbCBlbnRyaWVzIHRvIHRoZSBsaXN0ZW5lciAqLworCQlmb3IoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgeworCQkJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIG5vdGlmeSBjbGllbnQgKi8KKwkJCWlmICgoY2xpZW50LT5leHBpcl9jYWxsYmFjaykgJiYKKwkJCSAgICAoY2xpZW50LT5oaW50X21hc2sud29yZCAmIHUxNmhvKGV4cGlyaWVzW2ldLmhpbnRzKQorCQkJICAgICAmIDB4N2Y3ZikgKQorCQkJCWNsaWVudC0+ZXhwaXJfY2FsbGJhY2soJihleHBpcmllc1tpXSksCisJCQkJCQkgICAgICAgRVhQSVJZX1RJTUVPVVQsCisJCQkJCQkgICAgICAgY2xpZW50LT5wcml2KTsKKwkJfQorCisJCS8qIE5leHQgY2xpZW50ICovCisJCWNsaWVudCA9IGNsaWVudF9uZXh0OworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2dldF9kaXNjb3ZlcnlfcmVzcG9uc2UgKCkKKyAqCisgKiAgICBVc2VkIGJ5IElyTEFQIHRvIGdldCB0aGUgZGlzY292ZXJ5IGluZm8gaXQgbmVlZHMgd2hlbiBhbnN3ZXJpbmcKKyAqICAgIGRpc2NvdmVyeSByZXF1ZXN0cyBieSBvdGhlciBkZXZpY2VzLgorICovCitkaXNjb3ZlcnlfdCAqaXJsbXBfZ2V0X2Rpc2NvdmVyeV9yZXNwb25zZSh2b2lkKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChpcmxtcCAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCisJdTE2aG8oaXJsbXAtPmRpc2NvdmVyeV9yc3AuZGF0YS5oaW50cykgPSBpcmxtcC0+aGludHMud29yZDsKKworCS8qCisJICogIFNldCBjaGFyYWN0ZXIgc2V0IGZvciBkZXZpY2UgbmFtZSAod2UgdXNlIEFTQ0lJKSwgYW5kCisJICogIGNvcHkgZGV2aWNlIG5hbWUuIFJlbWVtYmVyIHRvIG1ha2Ugcm9vbSBmb3IgYSBcMCBhdCB0aGUKKwkgKiAgZW5kCisJICovCisJaXJsbXAtPmRpc2NvdmVyeV9yc3AuZGF0YS5jaGFyc2V0ID0gQ1NfQVNDSUk7CisKKwlzdHJuY3B5KGlybG1wLT5kaXNjb3ZlcnlfcnNwLmRhdGEuaW5mbywgc3lzY3RsX2Rldm5hbWUsCisJCU5JQ0tOQU1FX01BWF9MRU4pOworCWlybG1wLT5kaXNjb3ZlcnlfcnNwLm5hbWVfbGVuID0gc3RybGVuKGlybG1wLT5kaXNjb3ZlcnlfcnNwLmRhdGEuaW5mbyk7CisKKwlyZXR1cm4gJmlybG1wLT5kaXNjb3ZlcnlfcnNwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfZGF0YV9yZXF1ZXN0IChzZWxmLCBza2IpCisgKgorICogICAgU2VuZCBzb21lIGRhdGEgdG8gcGVlciBkZXZpY2UKKyAqCisgKiBOb3RlIG9uIHNrYiBtYW5hZ2VtZW50IDoKKyAqIEFmdGVyIGNhbGxpbmcgdGhlIGxvd2VyIGxheWVycyBvZiB0aGUgSXJEQSBzdGFjaywgd2UgYWx3YXlzCisgKiBrZnJlZSgpIHRoZSBza2IsIHdoaWNoIGRyb3AgdGhlIHJlZmVyZW5jZSBjb3VudCAoYW5kIHBvdGVudGlhbGx5CisgKiBkZXN0cm95IGl0KS4KKyAqIElyTE1QIGFuZCBJckxBUCBtYXkgcXVldWUgdGhlIHBhY2tldCwgYW5kIGluIHRob3NlIGNhc2VzIHdpbGwgbmVlZAorICogdG8gdXNlIHNrYl9nZXQoKSB0byBrZWVwIGl0IGFyb3VuZC4KKyAqIEplYW4gSUkKKyAqLworaW50IGlybG1wX2RhdGFfcmVxdWVzdChzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKQoreworCWludAlyZXQ7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCS8qIE1ha2Ugcm9vbSBmb3IgTVVYIGhlYWRlciAqLworCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbSh1c2VyZGF0YSkgPj0gTE1QX0hFQURFUiwgcmV0dXJuIC0xOyk7CisJc2tiX3B1c2godXNlcmRhdGEsIExNUF9IRUFERVIpOworCisJcmV0ID0gaXJsbXBfZG9fbHNhcF9ldmVudChzZWxmLCBMTV9EQVRBX1JFUVVFU1QsIHVzZXJkYXRhKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlybGFwX2RhdGFfcmVxdWVzdCgpLiAqLworCWRldl9rZnJlZV9za2IodXNlcmRhdGEpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaXJsbXBfZGF0YV9yZXF1ZXN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2RhdGFfaW5kaWNhdGlvbiAoaGFuZGxlLCBza2IpCisgKgorICogICAgR290IGRhdGEgZnJvbSBMQVAgbGF5ZXIgc28gcGFzcyBpdCB1cCB0byB1cHBlciBsYXllcgorICoKKyAqLwordm9pZCBpcmxtcF9kYXRhX2luZGljYXRpb24oc3RydWN0IGxzYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogSGlkZSBMTVAgaGVhZGVyIGZyb20gbGF5ZXIgYWJvdmUgKi8KKwlza2JfcHVsbChza2IsIExNUF9IRUFERVIpOworCisJaWYgKHNlbGYtPm5vdGlmeS5kYXRhX2luZGljYXRpb24pIHsKKwkJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2VlIGlybGFwX2RyaXZlcl9yY3YoKS4gKi8KKwkJc2tiX2dldChza2IpOworCQlzZWxmLT5ub3RpZnkuZGF0YV9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwgc2tiKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF91ZGF0YV9yZXF1ZXN0IChzZWxmLCBza2IpCisgKi8KK2ludCBpcmxtcF91ZGF0YV9yZXF1ZXN0KHN0cnVjdCBsc2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpCit7CisJaW50CXJldDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVCh1c2VyZGF0YSAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIE1ha2Ugcm9vbSBmb3IgTVVYIGhlYWRlciAqLworCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbSh1c2VyZGF0YSkgPj0gTE1QX0hFQURFUiwgcmV0dXJuIC0xOyk7CisJc2tiX3B1c2godXNlcmRhdGEsIExNUF9IRUFERVIpOworCisJcmV0ID0gaXJsbXBfZG9fbHNhcF9ldmVudChzZWxmLCBMTV9VREFUQV9SRVFVRVNULCB1c2VyZGF0YSk7CisKKwkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBpcmxhcF9kYXRhX3JlcXVlc3QoKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF91ZGF0YV9pbmRpY2F0aW9uIChzZWxmLCBza2IpCisgKgorICogICAgU2VuZCB1bnJlbGlhYmxlIGRhdGEgKGJ1dCBzdGlsbCB3aXRoaW4gdGhlIGNvbm5lY3Rpb24pCisgKgorICovCit2b2lkIGlybG1wX3VkYXRhX2luZGljYXRpb24oc3RydWN0IGxzYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIEhpZGUgTE1QIGhlYWRlciBmcm9tIGxheWVyIGFib3ZlICovCisJc2tiX3B1bGwoc2tiLCBMTVBfSEVBREVSKTsKKworCWlmIChzZWxmLT5ub3RpZnkudWRhdGFfaW5kaWNhdGlvbikgeworCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgLSBzZWUgaXJsYXBfZHJpdmVyX3JjdigpLiAqLworCQlza2JfZ2V0KHNrYik7CisJCXNlbGYtPm5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwKKwkJCQkJICAgICAgc2tiKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9jb25ubGVzc19kYXRhX3JlcXVlc3QgKHNlbGYsIHNrYikKKyAqLworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCitpbnQgaXJsbXBfY29ubmxlc3NfZGF0YV9yZXF1ZXN0KHN0cnVjdCBsc2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEsCisJCQkJX191OCBwaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKmNsb25lX3NrYjsKKwlzdHJ1Y3QgbGFwX2NiICpsYXA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQodXNlcmRhdGEgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkvKiBNYWtlIHJvb20gZm9yIE1VWCBhbmQgUElEIGhlYWRlciAqLworCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbSh1c2VyZGF0YSkgPj0gTE1QX0hFQURFUitMTVBfUElEX0hFQURFUiwKKwkJICAgIHJldHVybiAtMTspOworCisJLyogSW5zZXJ0IHByb3RvY29sIGlkZW50aWZpZXIgKi8KKwlza2JfcHVzaCh1c2VyZGF0YSwgTE1QX1BJRF9IRUFERVIpOworCWlmKHNlbGYgIT0gTlVMTCkKKwkgIHVzZXJkYXRhLT5kYXRhWzBdID0gc2VsZi0+cGlkOworCWVsc2UKKwkgIHVzZXJkYXRhLT5kYXRhWzBdID0gcGlkOworCisJLyogQ29ubmVjdGlvbmxlc3Mgc29ja2V0cyBtdXN0IHVzZSAweDcwICovCisJc2tiX3B1c2godXNlcmRhdGEsIExNUF9IRUFERVIpOworCXVzZXJkYXRhLT5kYXRhWzBdID0gdXNlcmRhdGEtPmRhdGFbMV0gPSBMU0FQX0NPTk5MRVNTOworCisJLyogVHJ5IHRvIHNlbmQgQ29ubmVjdGlvbmxlc3MgIHBhY2tldHMgb3V0IG9uIGFsbCBsaW5rcyAqLworCWxhcCA9IChzdHJ1Y3QgbGFwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlybG1wLT5saW5rcyk7CisJd2hpbGUgKGxhcCAhPSBOVUxMKSB7CisJCUlSREFfQVNTRVJUKGxhcC0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwkJY2xvbmVfc2tiID0gc2tiX2Nsb25lKHVzZXJkYXRhLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFjbG9uZV9za2IpIHsKKwkJCWRldl9rZnJlZV9za2IodXNlcmRhdGEpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlpcmxhcF91bml0ZGF0YV9yZXF1ZXN0KGxhcC0+aXJsYXAsIGNsb25lX3NrYik7CisJCS8qIGlybGFwX3VuaXRkYXRhX3JlcXVlc3QoKSBkb24ndCBpbmNyZWFzZSByZWZjb3VudCwKKwkJICogc28gbm8gZGV2X2tmcmVlX3NrYigpIC0gSmVhbiBJSSAqLworCisJCWxhcCA9IChzdHJ1Y3QgbGFwX2NiICopIGhhc2hiaW5fZ2V0X25leHQoaXJsbXAtPmxpbmtzKTsKKwl9CisJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9VTFRSQSAqLworCisvKgorICogRnVuY3Rpb24gaXJsbXBfY29ubmxlc3NfZGF0YV9pbmRpY2F0aW9uIChzZWxmLCBza2IpCisgKgorICogICAgUmVjZWl2ZSB1bnJlbGlhYmxlIGRhdGEgb3V0c2lkZSBhbnkgY29ubmVjdGlvbi4gTW9zdGx5IHVzZWQgYnkgVWx0cmEKKyAqCisgKi8KKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQordm9pZCBpcmxtcF9jb25ubGVzc19kYXRhX2luZGljYXRpb24oc3RydWN0IGxzYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIEhpZGUgTE1QIGFuZCBQSUQgaGVhZGVyIGZyb20gbGF5ZXIgYWJvdmUgKi8KKwlza2JfcHVsbChza2IsIExNUF9IRUFERVIrTE1QX1BJRF9IRUFERVIpOworCisJaWYgKHNlbGYtPm5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uKSB7CisJCS8qIERvbid0IGZvcmdldCB0byByZWZjb3VudCBpdCAtIHNlZSBpcmxhcF9kcml2ZXJfcmN2KCkuICovCisJCXNrYl9nZXQoc2tiKTsKKwkJc2VsZi0+bm90aWZ5LnVkYXRhX2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLAorCQkJCQkgICAgICBza2IpOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9VTFRSQSAqLworCisvKgorICogUHJvcGFnYXRlIHN0YXR1cyBpbmRpY2F0aW9uIGZyb20gTEFQIHRvIExTQVBzICh2aWEgTE1QKQorICogVGhpcyBkb24ndCB0cmlnZ2VyIGFueSBjaGFuZ2Ugb2Ygc3RhdGUgaW4gbGFwX2NiLCBsbXBfY2Igb3IgbHNhcF9jYiwKKyAqIGFuZCB0aGUgZXZlbnQgaXMgc3RhdGVsZXNzLCB0aGVyZWZvcmUgd2UgY2FuIGJ5cGFzcyBib3RoIHN0YXRlIG1hY2hpbmVzCisgKiBhbmQgc2VuZCB0aGUgZXZlbnQgZGlyZWN0IHRvIHRoZSBMU0FQIHVzZXIuCisgKiBKZWFuIElJCisgKi8KK3ZvaWQgaXJsbXBfc3RhdHVzX2luZGljYXRpb24oc3RydWN0IGxhcF9jYiAqc2VsZiwKKwkJCSAgICAgTElOS19TVEFUVVMgbGluaywgTE9DS19TVEFUVVMgbG9jaykKK3sKKwlzdHJ1Y3QgbHNhcF9jYiAqbmV4dDsKKwlzdHJ1Y3QgbHNhcF9jYiAqY3VycjsKKworCS8qIFNlbmQgc3RhdHVzX2luZGljYXRpb24gdG8gYWxsIExTQVBzIHVzaW5nIHRoaXMgbGluayAqLworCWN1cnIgPSAoc3RydWN0IGxzYXBfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QoIHNlbGYtPmxzYXBzKTsKKwl3aGlsZSAoTlVMTCAhPSBoYXNoYmluX2ZpbmRfbmV4dChzZWxmLT5sc2FwcywgKGxvbmcpIGN1cnIsIE5VTEwsCisJCQkJCSAodm9pZCAqKSAmbmV4dCkgKSB7CisJCUlSREFfQVNTRVJUKGN1cnItPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm47KTsKKwkJLyoKKwkJICogIEluZm9ybSBzZXJ2aWNlIHVzZXIgaWYgaGUgaGFzIHJlcXVlc3RlZCBpdAorCQkgKi8KKwkJaWYgKGN1cnItPm5vdGlmeS5zdGF0dXNfaW5kaWNhdGlvbiAhPSBOVUxMKQorCQkJY3Vyci0+bm90aWZ5LnN0YXR1c19pbmRpY2F0aW9uKGN1cnItPm5vdGlmeS5pbnN0YW5jZSwKKwkJCQkJCSAgICAgICBsaW5rLCBsb2NrKTsKKwkJZWxzZQorCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgbm8gaGFuZGxlclxuIiwgX19GVU5DVElPTl9fKTsKKworCQljdXJyID0gbmV4dDsKKwl9Cit9CisKKy8qCisgKiBSZWNlaXZlIGZsb3cgY29udHJvbCBpbmRpY2F0aW9uIGZyb20gTEFQLgorICogTEFQIHdhbnQgdXMgdG8gc2VuZCBpdCBvbmUgbW9yZSBmcmFtZS4gV2UgaW1wbGVtZW50IGEgc2ltcGxlIHJvdW5kCisgKiByb2JpbiBzY2hlZHVsZXIgYmV0d2VlbiB0aGUgYWN0aXZlIHNvY2tldHMgc28gdGhhdCB3ZSBnZXQgYSBiaXQgb2YKKyAqIGZhaXJuZXNzLiBOb3RlIHRoYXQgdGhlIHJvdW5kIHJvYmluIGlzIGZhciBmcm9tIHBlcmZlY3QsIGJ1dCBpdCdzCisgKiBiZXR0ZXIgdGhhbiBub3RoaW5nLgorICogV2UgdGhlbiBwb2xsIHRoZSBzZWxlY3RlZCBzb2NrZXQgc28gdGhhdCB3ZSBjYW4gZG8gc3luY2hyb25vdXMKKyAqIHJlZmlsbGluZyBvZiBJckxBUCAod2hpY2ggYWxsb3cgdG8gbWluaW1pc2UgdGhlIG51bWJlciBvZiBidWZmZXJzKS4KKyAqIEplYW4gSUkKKyAqLwordm9pZCBpcmxtcF9mbG93X2luZGljYXRpb24oc3RydWN0IGxhcF9jYiAqc2VsZiwgTE9DQUxfRkxPVyBmbG93KQoreworCXN0cnVjdCBsc2FwX2NiICpuZXh0OworCXN0cnVjdCBsc2FwX2NiICpjdXJyOworCWludAlsc2FwX3RvZG87CisKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChmbG93ID09IEZMT1dfU1RBUlQsIHJldHVybjspOworCisJLyogR2V0IHRoZSBudW1iZXIgb2YgbHNhcC4gVGhhdCdzIHRoZSBvbmx5IHNhZmUgd2F5IHRvIGtub3cKKwkgKiB0aGF0IHdlIGhhdmUgbG9vcGVkIGFyb3VuZC4uLiAtIEplYW4gSUkgKi8KKwlsc2FwX3RvZG8gPSBIQVNIQklOX0dFVF9TSVpFKHNlbGYtPmxzYXBzKTsKKwlJUkRBX0RFQlVHKDQsICIlcygpIDogJWQgbHNhcHMgdG8gc2NhblxuIiwgX19GVU5DVElPTl9fLCBsc2FwX3RvZG8pOworCisJLyogUG9sbCBsc2FwIGluIG9yZGVyIHVudGlsIHRoZSBxdWV1ZSBpcyBmdWxsIG9yIHVudGlsIHdlCisJICogdHJpZWQgdGhlbSBhbGwuCisJICogTW9zdCBvZnRlbiwgdGhlIGN1cnJlbnQgTFNBUCB3aWxsIGhhdmUgc29tZXRoaW5nIHRvIHNlbmQsCisJICogc28gd2Ugd2lsbCBnbyB0aHJvdWdoIHRoaXMgbG9vcCBvbmx5IG9uY2UuIC0gSmVhbiBJSSAqLworCXdoaWxlKChsc2FwX3RvZG8tLSkgJiYKKwkgICAgICAoSVJMQVBfR0VUX1RYX1FVRVVFX0xFTihzZWxmLT5pcmxhcCkgPCBMQVBfSElHSF9USFJFU0hPTEQpKSB7CisJCS8qIFRyeSB0byBmaW5kIHRoZSBuZXh0IGxzYXAgd2Ugc2hvdWxkIHBvbGwuICovCisJCW5leHQgPSBzZWxmLT5mbG93X25leHQ7CisJCS8qIElmIHdlIGhhdmUgbm8gbHNhcCwgcmVzdGFydCBmcm9tIGZpcnN0IG9uZSAqLworCQlpZihuZXh0ID09IE5VTEwpCisJCQluZXh0ID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KHNlbGYtPmxzYXBzKTsKKwkJLyogVmVyaWZ5IGN1cnJlbnQgb25lIGFuZCBmaW5kIHRoZSBuZXh0IG9uZSAqLworCQljdXJyID0gaGFzaGJpbl9maW5kX25leHQoc2VsZi0+bHNhcHMsIChsb25nKSBuZXh0LCBOVUxMLAorCQkJCQkgKHZvaWQgKikgJnNlbGYtPmZsb3dfbmV4dCk7CisJCS8qIFVoLW9oLi4uIFBhcmFub2lhICovCisJCWlmKGN1cnIgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlJUkRBX0RFQlVHKDQsICIlcygpIDogY3VyciBpcyAlcCwgbmV4dCB3YXMgJXAgYW5kIGlzIG5vdyAlcCwgc3RpbGwgJWQgdG8gZ28gLSBxdWV1ZSBsZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBjdXJyLCBuZXh0LCBzZWxmLT5mbG93X25leHQsIGxzYXBfdG9kbywgSVJMQVBfR0VUX1RYX1FVRVVFX0xFTihzZWxmLT5pcmxhcCkpOworCisJCS8qIEluZm9ybSBsc2FwIHVzZXIgdGhhdCBpdCBjYW4gc2VuZCBvbmUgbW9yZSBwYWNrZXQuICovCisJCWlmIChjdXJyLT5ub3RpZnkuZmxvd19pbmRpY2F0aW9uICE9IE5VTEwpCisJCQljdXJyLT5ub3RpZnkuZmxvd19pbmRpY2F0aW9uKGN1cnItPm5vdGlmeS5pbnN0YW5jZSwKKwkJCQkJCSAgICAgY3VyciwgZmxvdyk7CisJCWVsc2UKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIG5vIGhhbmRsZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorfQorCisjaWYgMAorLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2hpbnRfdG9fc2VydmljZSAoaGludCkKKyAqCisgKiAgICBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgc2VydmljcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIGhpbnQgYml0cy4gVGhpcworICogICAgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSBoaW50IGJpdHMgaGF2ZSB0aGUgc2l6ZSBvZiB0d28gYnl0ZXMgb25seQorICovCitfX3U4ICppcmxtcF9oaW50X3RvX3NlcnZpY2UoX191OCAqaGludCkKK3sKKwlfX3U4ICpzZXJ2aWNlOworCWludCBpID0gMDsKKworCS8qCisJICogQWxsb2NhdGUgYXJyYXkgdG8gc3RvcmUgc2VydmljZXMgaW4uIDE2IGVudHJpZXMgc2hvdWxkIGJlIHNhZmUKKwkgKiBzaW5jZSB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IDIgaGludCBieXRlcworCSAqLworCXNlcnZpY2UgPSBrbWFsbG9jKDE2LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNlcnZpY2UpIHsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWhpbnRbMF0pIHsKKwkJSVJEQV9ERUJVRygxLCAiPE5vbmU+XG4iKTsKKwkJa2ZyZWUoc2VydmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoaGludFswXSAmIEhJTlRfUE5QKQorCQlJUkRBX0RFQlVHKDEsICJQblAgQ29tcGF0aWJsZSAiKTsKKwlpZiAoaGludFswXSAmIEhJTlRfUERBKQorCQlJUkRBX0RFQlVHKDEsICJQREEvUGFsbXRvcCAiKTsKKwlpZiAoaGludFswXSAmIEhJTlRfQ09NUFVURVIpCisJCUlSREFfREVCVUcoMSwgIkNvbXB1dGVyICIpOworCWlmIChoaW50WzBdICYgSElOVF9QUklOVEVSKSB7CisJCUlSREFfREVCVUcoMSwgIlByaW50ZXIgIik7CisJCXNlcnZpY2VbaSsrXSA9IFNfUFJJTlRFUjsKKwl9CisJaWYgKGhpbnRbMF0gJiBISU5UX01PREVNKQorCQlJUkRBX0RFQlVHKDEsICJNb2RlbSAiKTsKKwlpZiAoaGludFswXSAmIEhJTlRfRkFYKQorCQlJUkRBX0RFQlVHKDEsICJGYXggIik7CisJaWYgKGhpbnRbMF0gJiBISU5UX0xBTikgeworCQlJUkRBX0RFQlVHKDEsICJMQU4gQWNjZXNzICIpOworCQlzZXJ2aWNlW2krK10gPSBTX0xBTjsKKwl9CisJLyoKKwkgKiAgVGVzdCBpZiBleHRlbnNpb24gYnl0ZSBleGlzdHMuIFRoaXMgYnl0ZSB3aWxsIHVzdWFsbHkgYmUKKwkgKiAgdGhlcmUsIGJ1dCB0aGlzIGlzIG5vdCByZWFsbHkgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkLgorCSAqICAoSXJMTVAgcC4gMjkpCisJICovCisJaWYgKGhpbnRbMF0gJiBISU5UX0VYVEVOU0lPTikgeworCQlpZiAoaGludFsxXSAmIEhJTlRfVEVMRVBIT05ZKSB7CisJCQlJUkRBX0RFQlVHKDEsICJUZWxlcGhvbnkgIik7CisJCQlzZXJ2aWNlW2krK10gPSBTX1RFTEVQSE9OWTsKKwkJfSBpZiAoaGludFsxXSAmIEhJTlRfRklMRV9TRVJWRVIpCisJCQlJUkRBX0RFQlVHKDEsICJGaWxlIFNlcnZlciAiKTsKKworCQlpZiAoaGludFsxXSAmIEhJTlRfQ09NTSkgeworCQkJSVJEQV9ERUJVRygxLCAiSXJDT01NICIpOworCQkJc2VydmljZVtpKytdID0gU19DT01NOworCQl9CisJCWlmIChoaW50WzFdICYgSElOVF9PQkVYKSB7CisJCQlJUkRBX0RFQlVHKDEsICJJck9CRVggIik7CisJCQlzZXJ2aWNlW2krK10gPSBTX09CRVg7CisJCX0KKwl9CisJSVJEQV9ERUJVRygxLCAiXG4iKTsKKworCS8qIFNvIHRoYXQgY2xpZW50IGNhbiBiZSBub3RpZmllZCBhYm91dCBhbnkgZGlzY292ZXJ5ICovCisJc2VydmljZVtpKytdID0gU19BTlk7CisKKwlzZXJ2aWNlW2ldID0gU19FTkQ7CisKKwlyZXR1cm4gc2VydmljZTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgX191MTYgc2VydmljZV9oaW50X21hcHBpbmdbU19FTkRdWzJdID0geworCXsgSElOVF9QTlAsCQkwIH0sCQkJLyogU19QTlAgKi8KKwl7IEhJTlRfUERBLAkJMCB9LAkJCS8qIFNfUERBICovCisJeyBISU5UX0NPTVBVVEVSLAkwIH0sCQkJLyogU19DT01QVVRFUiAqLworCXsgSElOVF9QUklOVEVSLAkJMCB9LAkJCS8qIFNfUFJJTlRFUiAqLworCXsgSElOVF9NT0RFTSwJCTAgfSwJCQkvKiBTX01PREVNICovCisJeyBISU5UX0ZBWCwJCTAgfSwJCQkvKiBTX0ZBWCAqLworCXsgSElOVF9MQU4sCQkwIH0sCQkJLyogU19MQU4gKi8KKwl7IEhJTlRfRVhURU5TSU9OLAlISU5UX1RFTEVQSE9OWSB9LAkvKiBTX1RFTEVQSE9OWSAqLworCXsgSElOVF9FWFRFTlNJT04sCUhJTlRfQ09NTSB9LAkJLyogU19DT01NICovCisJeyBISU5UX0VYVEVOU0lPTiwJSElOVF9PQkVYIH0sCQkvKiBTX09CRVggKi8KKwl7IDB4RkYsCQkJMHhGRiB9LAkJCS8qIFNfQU5ZICovCit9OworCisvKgorICogRnVuY3Rpb24gaXJsbXBfc2VydmljZV90b19oaW50IChzZXJ2aWNlKQorICoKKyAqICAgIENvbnZlcnRzIGEgc2VydmljZSB0eXBlLCB0byBhIGhpbnQgYml0CisgKgorICogICAgUmV0dXJuczogYSAxNiBiaXQgaGludCB2YWx1ZSwgd2l0aCB0aGUgc2VydmljZSBiaXQgc2V0CisgKi8KK19fdTE2IGlybG1wX3NlcnZpY2VfdG9faGludChpbnQgc2VydmljZSkKK3sKKwlfX3UxNl9ob3N0X29yZGVyIGhpbnQ7CisKKwloaW50LmJ5dGVbMF0gPSBzZXJ2aWNlX2hpbnRfbWFwcGluZ1tzZXJ2aWNlXVswXTsKKwloaW50LmJ5dGVbMV0gPSBzZXJ2aWNlX2hpbnRfbWFwcGluZ1tzZXJ2aWNlXVsxXTsKKworCXJldHVybiBoaW50LndvcmQ7Cit9CitFWFBPUlRfU1lNQk9MKGlybG1wX3NlcnZpY2VfdG9faGludCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlIChzZXJ2aWNlKQorICoKKyAqICAgIFJlZ2lzdGVyIGxvY2FsIHNlcnZpY2Ugd2l0aCBJckxNUAorICoKKyAqLwordm9pZCAqaXJsbXBfcmVnaXN0ZXJfc2VydmljZShfX3UxNiBoaW50cykKK3sKKwlpcmxtcF9zZXJ2aWNlX3QgKnNlcnZpY2U7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBoaW50cyA9ICUwNHhcbiIsIF9fRlVOQ1RJT05fXywgaGludHMpOworCisJLyogTWFrZSBhIG5ldyByZWdpc3RyYXRpb24gKi8KKwlzZXJ2aWNlID0ga21hbGxvYyhzaXplb2YoaXJsbXBfc2VydmljZV90KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFzZXJ2aWNlKSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNlcnZpY2UtPmhpbnRzLndvcmQgPSBoaW50czsKKwloYXNoYmluX2luc2VydChpcmxtcC0+c2VydmljZXMsIChpcmRhX3F1ZXVlX3QgKikgc2VydmljZSwKKwkJICAgICAgIChsb25nKSBzZXJ2aWNlLCBOVUxMKTsKKworCWlybG1wLT5oaW50cy53b3JkIHw9IGhpbnRzOworCisJcmV0dXJuICh2b2lkICopc2VydmljZTsKK30KK0VYUE9SVF9TWU1CT0woaXJsbXBfcmVnaXN0ZXJfc2VydmljZSk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF91bnJlZ2lzdGVyX3NlcnZpY2UgKGhhbmRsZSkKKyAqCisgKiAgICBVbnJlZ2lzdGVyIHNlcnZpY2Ugd2l0aCBJckxNUC4KKyAqCisgKiAgICBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisgKi8KK2ludCBpcmxtcF91bnJlZ2lzdGVyX3NlcnZpY2Uodm9pZCAqaGFuZGxlKQoreworCWlybG1wX3NlcnZpY2VfdCAqc2VydmljZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gLTE7CisKKwkvKiBDYWxsZXIgbWF5IGNhbGwgd2l0aCBpbnZhbGlkIGhhbmRsZSAoaXQncyBsZWdhbCkgLSBKZWFuIElJICovCisJc2VydmljZSA9IGhhc2hiaW5fbG9ja19maW5kKGlybG1wLT5zZXJ2aWNlcywgKGxvbmcpIGhhbmRsZSwgTlVMTCk7CisJaWYgKCFzZXJ2aWNlKSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVua25vd24gc2VydmljZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwloYXNoYmluX3JlbW92ZV90aGlzKGlybG1wLT5zZXJ2aWNlcywgKGlyZGFfcXVldWVfdCAqKSBzZXJ2aWNlKTsKKwlrZnJlZShzZXJ2aWNlKTsKKworCS8qIFJlbW92ZSBvbGQgaGludCBiaXRzICovCisJaXJsbXAtPmhpbnRzLndvcmQgPSAwOworCisJLyogUmVmcmVzaCBjdXJyZW50IGhpbnQgYml0cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpcmxtcC0+c2VydmljZXMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisgICAgICAgIHNlcnZpY2UgPSAoaXJsbXBfc2VydmljZV90ICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlybG1wLT5zZXJ2aWNlcyk7CisgICAgICAgIHdoaWxlIChzZXJ2aWNlKSB7CisJCWlybG1wLT5oaW50cy53b3JkIHw9IHNlcnZpY2UtPmhpbnRzLndvcmQ7CisKKyAgICAgICAgICAgICAgICBzZXJ2aWNlID0gKGlybG1wX3NlcnZpY2VfdCAqKWhhc2hiaW5fZ2V0X25leHQoaXJsbXAtPnNlcnZpY2VzKTsKKyAgICAgICAgfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlybG1wLT5zZXJ2aWNlcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3JlZ2lzdGVyX2NsaWVudCAoaGludF9tYXNrLCBjYWxsYmFjazEsIGNhbGxiYWNrMikKKyAqCisgKiAgICBSZWdpc3RlciBhIGxvY2FsIGNsaWVudCB3aXRoIElyTE1QCisgKglGaXJzdCBjYWxsYmFjayBpcyBzZWxlY3RpdmUgZGlzY292ZXJ5IChiYXNlZCBvbiBoaW50cykKKyAqCVNlY29uZCBjYWxsYmFjayBpcyBmb3Igc2VsZWN0aXZlIGRpc2NvdmVyeSBleHBpcmllcworICoKKyAqICAgIFJldHVybnM6IGhhbmRsZSA+IDAgb24gc3VjY2VzcywgMCBvbiBlcnJvcgorICovCit2b2lkICppcmxtcF9yZWdpc3Rlcl9jbGllbnQoX191MTYgaGludF9tYXNrLCBESVNDT1ZFUllfQ0FMTEJBQ0sxIGRpc2NvX2NsYiwKKwkJCSAgICBESVNDT1ZFUllfQ0FMTEJBQ0syIGV4cGlyX2NsYiwgdm9pZCAqcHJpdikKK3sKKwlpcmxtcF9jbGllbnRfdCAqY2xpZW50OworCisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlJUkRBX0FTU0VSVChpcmxtcCAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCisJLyogTWFrZSBhIG5ldyByZWdpc3RyYXRpb24gKi8KKwljbGllbnQgPSBrbWFsbG9jKHNpemVvZihpcmxtcF9jbGllbnRfdCksIEdGUF9BVE9NSUMpOworCWlmICghY2xpZW50KSB7CisJCUlSREFfREVCVUcoIDEsICIlcygpLCBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFJlZ2lzdGVyIHRoZSBkZXRhaWxzICovCisJY2xpZW50LT5oaW50X21hc2sud29yZCA9IGhpbnRfbWFzazsKKwljbGllbnQtPmRpc2NvX2NhbGxiYWNrID0gZGlzY29fY2xiOworCWNsaWVudC0+ZXhwaXJfY2FsbGJhY2sgPSBleHBpcl9jbGI7CisJY2xpZW50LT5wcml2ID0gcHJpdjsKKworCWhhc2hiaW5faW5zZXJ0KGlybG1wLT5jbGllbnRzLCAoaXJkYV9xdWV1ZV90ICopIGNsaWVudCwKKwkJICAgICAgIChsb25nKSBjbGllbnQsIE5VTEwpOworCisJcmV0dXJuICh2b2lkICopIGNsaWVudDsKK30KK0VYUE9SVF9TWU1CT0woaXJsbXBfcmVnaXN0ZXJfY2xpZW50KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3VwZGF0ZV9jbGllbnQgKGhhbmRsZSwgaGludF9tYXNrLCBjYWxsYmFjazEsIGNhbGxiYWNrMikKKyAqCisgKiAgICBVcGRhdGVzIHNwZWNpZmllZCBjbGllbnQgKGhhbmRsZSkgd2l0aCBwb3NzaWJseSBuZXcgaGludF9tYXNrIGFuZAorICogICAgY2FsbGJhY2sKKyAqCisgKiAgICBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisgKi8KK2ludCBpcmxtcF91cGRhdGVfY2xpZW50KHZvaWQgKmhhbmRsZSwgX191MTYgaGludF9tYXNrLAorCQkJRElTQ09WRVJZX0NBTExCQUNLMSBkaXNjb19jbGIsCisJCQlESVNDT1ZFUllfQ0FMTEJBQ0syIGV4cGlyX2NsYiwgdm9pZCAqcHJpdikKK3sKKwlpcmxtcF9jbGllbnRfdCAqY2xpZW50OworCisJaWYgKCFoYW5kbGUpCisJCXJldHVybiAtMTsKKworCWNsaWVudCA9IGhhc2hiaW5fbG9ja19maW5kKGlybG1wLT5jbGllbnRzLCAobG9uZykgaGFuZGxlLCBOVUxMKTsKKwlpZiAoIWNsaWVudCkgeworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGNsaWVudCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwljbGllbnQtPmhpbnRfbWFzay53b3JkID0gaGludF9tYXNrOworCWNsaWVudC0+ZGlzY29fY2FsbGJhY2sgPSBkaXNjb19jbGI7CisJY2xpZW50LT5leHBpcl9jYWxsYmFjayA9IGV4cGlyX2NsYjsKKwljbGllbnQtPnByaXYgPSBwcml2OworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlybG1wX3VwZGF0ZV9jbGllbnQpOworCisvKgorICogRnVuY3Rpb24gaXJsbXBfdW5yZWdpc3Rlcl9jbGllbnQgKGhhbmRsZSkKKyAqCisgKiAgICBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisgKgorICovCitpbnQgaXJsbXBfdW5yZWdpc3Rlcl9jbGllbnQodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBpcmxtcF9jbGllbnQgKmNsaWVudDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoIWhhbmRsZSkKKwkJcmV0dXJuIC0xOworCisJLyogQ2FsbGVyIG1heSBjYWxsIHdpdGggaW52YWxpZCBoYW5kbGUgKGl0J3MgbGVnYWwpIC0gSmVhbiBJSSAqLworCWNsaWVudCA9IGhhc2hiaW5fbG9ja19maW5kKGlybG1wLT5jbGllbnRzLCAobG9uZykgaGFuZGxlLCBOVUxMKTsKKwlpZiAoIWNsaWVudCkgeworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGNsaWVudCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCByZW1vdmluZyBjbGllbnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCWhhc2hiaW5fcmVtb3ZlX3RoaXMoaXJsbXAtPmNsaWVudHMsIChpcmRhX3F1ZXVlX3QgKikgY2xpZW50KTsKKwlrZnJlZShjbGllbnQpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlybG1wX3VucmVnaXN0ZXJfY2xpZW50KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3Nsc2FwX2ludXNlIChzbHNhcCkKKyAqCisgKiAgICBDaGVjayBpZiB0aGUgZ2l2ZW4gc291cmNlIExTQVAgc2VsZWN0b3IgaXMgaW4gdXNlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjbGVhcmx5IG5vdCB2ZXJ5IGVmZmljaWVudC4gT24gdGhlIG1pdGlnYXRpbmcgc2lkZSwgdGhlCisgKiBzdGFjayBtYWtlIHN1cmUgdGhhdCBpbiA5OSUgb2YgdGhlIGNhc2VzLCB3ZSBhcmUgY2FsbGVkIG9ubHkgb25jZQorICogZm9yIGVhY2ggc29ja2V0IGFsbG9jYXRpb24uIFdlIGNvdWxkIHByb2JhYmx5IGtlZXAgYSBiaXRtYXAKKyAqIG9mIHRoZSBhbGxvY2F0ZWQgTFNBUCwgYnV0IEknbSBub3Qgc3VyZSB0aGUgY29tcGxleGl0eSBpcyB3b3J0aCBpdC4KKyAqIEplYW4gSUkKKyAqLworc3RhdGljIGludCBpcmxtcF9zbHNhcF9pbnVzZShfX3U4IHNsc2FwX3NlbCkKK3sKKwlzdHJ1Y3QgbHNhcF9jYiAqc2VsZjsKKwlzdHJ1Y3QgbGFwX2NiICpsYXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUlSREFfQVNTRVJUKGlybG1wICE9IE5VTEwsIHJldHVybiBUUlVFOyk7CisJSVJEQV9BU1NFUlQoaXJsbXAtPm1hZ2ljID09IExNUF9NQUdJQywgcmV0dXJuIFRSVUU7KTsKKwlJUkRBX0FTU0VSVChzbHNhcF9zZWwgIT0gTFNBUF9BTlksIHJldHVybiBUUlVFOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisjaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKKwkvKiBBY2NlcHQgYWxsIGJpbmRpbmdzIHRvIHRoZSBjb25uZWN0aW9ubGVzcyBMU0FQICovCisJaWYgKHNsc2FwX3NlbCA9PSBMU0FQX0NPTk5MRVNTKQorCQlyZXR1cm4gRkFMU0U7CisjZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KKworCS8qIFZhbGlkIHZhbHVlcyBhcmUgYmV0d2VlbiAwIGFuZCAxMjcgKDB4MC0weDZGKSAqLworCWlmIChzbHNhcF9zZWwgPiBMU0FQX01BWCkKKwkJcmV0dXJuIFRSVUU7CisKKwkvKgorCSAqICBDaGVjayBpZiBzbHNhcCBpcyBhbHJlYWR5IGluIHVzZS4gVG8gZG8gdGhpcyB3ZSBoYXZlIHRvIGxvb3Agb3ZlcgorCSAqICBldmVyeSBJckxBUCBjb25uZWN0aW9uIGFuZCBjaGVjayBldmVyeSBMU0FQIGFzc29jaWF0ZWQgd2l0aCBlYWNoCisJICogIHRoZSBjb25uZWN0aW9uLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpcmxtcC0+bGlua3MtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJbGFwID0gKHN0cnVjdCBsYXBfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJsbXAtPmxpbmtzKTsKKwl3aGlsZSAobGFwICE9IE5VTEwpIHsKKwkJSVJEQV9BU1NFUlQobGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCBnb3RvIGVycmxhcDspOworCisJCS8qIENhcmVmdWwgZm9yIHByaW9yaXR5IGludmVyc2lvbnMgaGVyZSAhCisJCSAqIGlybG1wLT5saW5rcyBpcyBuZXZlciB0YWtlbiB3aGlsZSBhbm90aGVyIElyREEKKwkJICogc3BpbmxvY2sgaXMgaGVsZCwgc28gd2UgYXJlIHNhZmUuIEplYW4gSUkgKi8KKwkJc3Bpbl9sb2NrKCZsYXAtPmxzYXBzLT5oYl9zcGlubG9jayk7CisKKwkJLyogRm9yIHRoaXMgSXJMQVAsIGNoZWNrIGFsbCB0aGUgTFNBUHMgKi8KKwkJc2VsZiA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdChsYXAtPmxzYXBzKTsKKwkJd2hpbGUgKHNlbGYgIT0gTlVMTCkgeworCQkJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsCisJCQkJICAgIGdvdG8gZXJybHNhcDspOworCisJCQlpZiAoKHNlbGYtPnNsc2FwX3NlbCA9PSBzbHNhcF9zZWwpKSB7CisJCQkJSVJEQV9ERUJVRyg0LCAiU291cmNlIExTQVAgc2VsZWN0b3I9JTAyeCBpbiB1c2VcbiIsCisJCQkJCSAgIHNlbGYtPnNsc2FwX3NlbCk7CisJCQkJZ290byBlcnJsc2FwOworCQkJfQorCQkJc2VsZiA9IChzdHJ1Y3QgbHNhcF9jYiopIGhhc2hiaW5fZ2V0X25leHQobGFwLT5sc2Fwcyk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmxhcC0+bHNhcHMtPmhiX3NwaW5sb2NrKTsKKworCQkvKiBOZXh0IExBUCAqLworCQlsYXAgPSAoc3RydWN0IGxhcF9jYiAqKSBoYXNoYmluX2dldF9uZXh0KGlybG1wLT5saW5rcyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlybG1wLT5saW5rcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogU2VydmVyIHNvY2tldHMgYXJlIHR5cGljYWxseSB3YWl0aW5nIGZvciBjb25uZWN0aW9ucyBhbmQKKwkgKiB0aGVyZWZvcmUgcmVzaWRlIGluIHRoZSB1bmNvbm5lY3RlZCBsaXN0LiBXZSBkb24ndCB3YW50CisJICogdG8gZ2l2ZSBvdXQgdGhlaXIgTFNBUHMgZm9yIG9idmlvdXMgcmVhc29ucy4uLgorCSAqIEplYW4gSUkKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJc2VsZiA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdChpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMpOworCXdoaWxlIChzZWxmICE9IE5VTEwpIHsKKwkJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIGdvdG8gZXJydW5jb247KTsKKwkJaWYgKChzZWxmLT5zbHNhcF9zZWwgPT0gc2xzYXBfc2VsKSkgeworCQkJSVJEQV9ERUJVRyg0LCAiU291cmNlIExTQVAgc2VsZWN0b3I9JTAyeCBpbiB1c2UgKHVuY29ubmVjdGVkKVxuIiwKKwkJCQkgICBzZWxmLT5zbHNhcF9zZWwpOworCQkJZ290byBlcnJ1bmNvbjsKKwkJfQorCQlzZWxmID0gKHN0cnVjdCBsc2FwX2NiKikgaGFzaGJpbl9nZXRfbmV4dChpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gRkFMU0U7CisKKwkvKiBFcnJvciBleGl0IGZyb20gd2l0aGluIG9uZSBvZiB0aGUgdHdvIG5lc3RlZCBsb29wcy4KKwkgKiBNYWtlIHN1cmUgd2UgcmVsZWFzZSB0aGUgcmlnaHQgc3BpbmxvY2sgaW4gdGhlIHJpZ2ggb3JkZXIuCisJICogSmVhbiBJSSAqLworZXJybHNhcDoKKwlzcGluX3VubG9jaygmbGFwLT5sc2Fwcy0+aGJfc3BpbmxvY2spOworSVJEQV9BU1NFUlRfTEFCRUwoZXJybGFwOikKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmxtcC0+bGlua3MtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIFRSVUU7CisKKwkvKiBFcnJvciBleGl0IGZyb20gd2l0aGluIHRoZSB1bmNvbm5lY3RlZCBsb29wLgorCSAqIEp1c3Qgb25lIHNwaW5sb2NrIHRvIHJlbGVhc2UuLi4gSmVhbiBJSSAqLworZXJydW5jb246CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCXJldHVybiBUUlVFOworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfZmluZF9mcmVlX3Nsc2FwICgpCisgKgorICogICAgRmluZCBhIGZyZWUgc291cmNlIExTQVAgdG8gdXNlLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiB0aGUgc2VydmljZQorICogICAgdXNlciBoYXMgcmVxdWVzdGVkIGEgc291cmNlIExTQVAgZXF1YWwgdG8gTE1fQU5ZCisgKi8KK3N0YXRpYyBfX3U4IGlybG1wX2ZpbmRfZnJlZV9zbHNhcCh2b2lkKQoreworCV9fdTggbHNhcF9zZWw7CisJaW50IHdyYXBwZWQgPSAwOworCisJSVJEQV9BU1NFUlQoaXJsbXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoaXJsbXAtPm1hZ2ljID09IExNUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwkvKiBNb3N0IHVzZXJzIGRvbid0IHJlYWxseSBjYXJlIHdoaWNoIExTQVBzIHRoZXkgYXJlIGdpdmVuLAorCSAqIGFuZCB0aGVyZWZvcmUgd2UgYXV0b21hdGljYWxseSBnaXZlIHRoZW0gYSBmcmVlIExTQVAuCisJICogVGhpcyBmdW5jdGlvbiB0cnkgdG8gZmluZCBhIHN1aXRhYmxlIExTQVAsIGkuZS4gd2hpY2ggaXMKKwkgKiBub3QgaW4gdXNlIGFuZCBpcyB3aXRoaW4gdGhlIGFjY2VwdGFibGUgcmFuZ2UuIEplYW4gSUkgKi8KKworCWRvIHsKKwkJLyogQWx3YXlzIGluY3JlbWVudCB0byBMU0FQIG51bWJlciBiZWZvcmUgdXNpbmcgaXQuCisJCSAqIEluIHRoZW9yeSwgd2UgY291bGQgcmV1c2UgdGhlIGxhc3QgTFNBUCBudW1iZXIsIGFzIGxvbmcKKwkJICogYXMgaXQgaXMgbm8gbG9uZ2VyIGluIHVzZS4gU29tZSBJckRBIHN0YWNrIGRvIHRoYXQuCisJCSAqIEhvd2V2ZXIsIHRoZSBwcmV2aW91cyBzb2NrZXQgbWF5IGJlIGhhbGYgY2xvc2VkLCBpLmUuCisJCSAqIHdlIGNsb3NlZCBpdCwgd2UgdGhpbmsgaXQncyBubyBsb25nZXIgaW4gdXNlLCBidXQgdGhlCisJCSAqIG90aGVyIHNpZGUgZGlkIG5vdCByZWNlaXZlIG91ciBjbG9zZSBhbmQgdGhpbmsgaXQncworCQkgKiBhY3RpdmUgYW5kIHN0aWxsIHNlbmQgZGF0YSBvbiBpdC4KKwkJICogVGhpcyBpcyBzaW1pbGFyIHRvIHdoYXQgaXMgZG9uZSB3aXRoIFBJRHMgYW5kIFRDUCBwb3J0cy4KKwkJICogQWxzbywgdGhpcyByZWR1Y2UgdGhlIG51bWJlciBvZiBjYWxscyB0byBpcmxtcF9zbHNhcF9pbnVzZSgpCisJCSAqIHdoaWNoIGlzIGFuIGV4cGVuc2l2ZSBmdW5jdGlvbiB0byBjYWxsLgorCQkgKiBKZWFuIElJICovCisJCWlybG1wLT5sYXN0X2xzYXBfc2VsKys7CisKKwkJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byB3cmFwYXJvdW5kICgweDcwLTB4N2YgYXJlIHJlc2VydmVkKSAqLworCQlpZiAoaXJsbXAtPmxhc3RfbHNhcF9zZWwgPiBMU0FQX01BWCkgeworCQkJLyogMHgwMC0weDEwIGFyZSBhbHNvIHJlc2VydmVkIGZvciB3ZWxsIGtub3cgcG9ydHMgKi8KKwkJCWlybG1wLT5sYXN0X2xzYXBfc2VsID0gMHgxMDsKKworCQkJLyogTWFrZSBzdXJlIHdlIHRlcm1pbmF0ZSB0aGUgbG9vcCAqLworCQkJaWYgKHdyYXBwZWQrKykgeworCQkJCUlSREFfRVJST1IoIiVzOiBubyBtb3JlIGZyZWUgTFNBUHMgIVxuIiwKKwkJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJCS8qIElmIHRoZSBMU0FQIGlzIGluIHVzZSwgdHJ5IHRoZSBuZXh0IG9uZS4KKwkJICogRGVzcGl0ZSB0aGUgYXV0b2luY3JlbWVudCwgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgbHNhcAorCQkgKiBpcyByZWFsbHkgaW4gdXNlIG9yIG5vdCwgZmlyc3QgYmVjYXVzZSBMU0FQIG1heSBiZQorCQkgKiBkaXJlY3RseSBhbGxvY2F0ZWQgaW4gaXJsbXBfb3Blbl9sc2FwKCksIGFuZCBhbHNvIGJlY2F1c2UKKwkJICogd2UgbWF5IHdyYXBhcm91bmQgb24gb2xkIHNvY2tldHMuIEplYW4gSUkgKi8KKwl9IHdoaWxlIChpcmxtcF9zbHNhcF9pbnVzZShpcmxtcC0+bGFzdF9sc2FwX3NlbCkpOworCisJLyogR290IGl0ICEgKi8KKwlsc2FwX3NlbCA9IGlybG1wLT5sYXN0X2xzYXBfc2VsOworCUlSREFfREVCVUcoNCwgIiVzKCksIGZvdW5kIGZyZWUgbHNhcF9zZWw9JTAyeFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBsc2FwX3NlbCk7CisKKwlyZXR1cm4gbHNhcF9zZWw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9jb252ZXJ0X2xhcF9yZWFzb24gKGxhcF9yZWFzb24pCisgKgorICogICAgQ29udmVydHMgSXJMQVAgZGlzY29ubmVjdCByZWFzb24gY29kZXMgdG8gSXJMTVAgZGlzY29ubmVjdCByZWFzb24KKyAqICAgIGNvZGVzCisgKgorICovCitMTV9SRUFTT04gaXJsbXBfY29udmVydF9sYXBfcmVhc29uKCBMQVBfUkVBU09OIGxhcF9yZWFzb24pCit7CisJaW50IHJlYXNvbiA9IExNX0xBUF9ESVNDT05ORUNUOworCisJc3dpdGNoIChsYXBfcmVhc29uKSB7CisJY2FzZSBMQVBfRElTQ19JTkRJQ0FUSU9OOiAvKiBSZWNlaXZlZCBhIGRpc2Nvbm5lY3QgcmVxdWVzdCBmcm9tIHBlZXIgKi8KKwkJSVJEQV9ERUJVRyggMSwgIiVzKCksIExBUF9ESVNDX0lORElDQVRJT05cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJlYXNvbiA9IExNX1VTRVJfUkVRVUVTVDsKKwkJYnJlYWs7CisJY2FzZSBMQVBfTk9fUkVTUE9OU0U6ICAgIC8qIFRvIG1hbnkgcmV0cmFuc21pdHMgd2l0aG91dCByZXNwb25zZSAqLworCQlJUkRBX0RFQlVHKCAxLCAiJXMoKSwgTEFQX05PX1JFU1BPTlNFXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZWFzb24gPSBMTV9MQVBfRElTQ09OTkVDVDsKKwkJYnJlYWs7CisJY2FzZSBMQVBfUkVTRVRfSU5ESUNBVElPTjoKKwkJSVJEQV9ERUJVRyggMSwgIiVzKCksIExBUF9SRVNFVF9JTkRJQ0FUSU9OXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZWFzb24gPSBMTV9MQVBfUkVTRVQ7CisJCWJyZWFrOworCWNhc2UgTEFQX0ZPVU5EX05PTkU6CisJY2FzZSBMQVBfTUVESUFfQlVTWToKKwljYXNlIExBUF9QUklNQVJZX0NPTkZMSUNUOgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBMQVBfRk9VTkRfTk9ORSwgTEFQX01FRElBX0JVU1kgb3IgTEFQX1BSSU1BUllfQ09ORkxJQ1RcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJlYXNvbiA9IExNX0NPTk5FQ1RfRkFJTFVSRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5rbm93IElyTEFQIGRpc2Nvbm5lY3QgcmVhc29uICVkIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgbGFwX3JlYXNvbik7CisJCXJlYXNvbiA9IExNX0xBUF9ESVNDT05ORUNUOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVhc29uOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RydWN0IGlybG1wX2l0ZXJfc3RhdGUgeworCWhhc2hiaW5fdCAqaGFzaGJpbjsKK307CisKKyNkZWZpbmUgTFNBUF9TVEFSVF9UT0tFTgkoKHZvaWQgKikxKQorI2RlZmluZSBMSU5LX1NUQVJUX1RPS0VOCSgodm9pZCAqKTIpCisKK3N0YXRpYyB2b2lkICppcmxtcF9zZXFfaGJfaWR4KHN0cnVjdCBpcmxtcF9pdGVyX3N0YXRlICppdGVyLCBsb2ZmX3QgKm9mZikKK3sKKwl2b2lkICplbGVtZW50OworCisJc3Bpbl9sb2NrX2lycSgmaXRlci0+aGFzaGJpbi0+aGJfc3BpbmxvY2spOworCWZvciAoZWxlbWVudCA9IGhhc2hiaW5fZ2V0X2ZpcnN0KGl0ZXItPmhhc2hiaW4pOworCSAgICAgZWxlbWVudCAhPSBOVUxMOyAKKwkgICAgIGVsZW1lbnQgPSBoYXNoYmluX2dldF9uZXh0KGl0ZXItPmhhc2hiaW4pKSB7CisJCWlmICghb2ZmIHx8ICpvZmYtLSA9PSAwKSB7CisJCQkvKiBOQjogaGFzaGJpbiBsZWZ0IGxvY2tlZCAqLworCQkJcmV0dXJuIGVsZW1lbnQ7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZpdGVyLT5oYXNoYmluLT5oYl9zcGlubG9jayk7CisJaXRlci0+aGFzaGJpbiA9IE5VTEw7CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgKmlybG1wX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGlybG1wX2l0ZXJfc3RhdGUgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJdm9pZCAqdjsKKwlsb2ZmX3Qgb2ZmID0gKnBvczsKKworCWl0ZXItPmhhc2hiaW4gPSBOVUxMOworCWlmIChvZmYtLSA9PSAwKQorCQlyZXR1cm4gTFNBUF9TVEFSVF9UT0tFTjsKKworCWl0ZXItPmhhc2hiaW4gPSBpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHM7CisJdiA9IGlybG1wX3NlcV9oYl9pZHgoaXRlciwgJm9mZik7CisJaWYgKHYpCisJCXJldHVybiB2OworCisJaWYgKG9mZi0tID09IDApCisJCXJldHVybiBMSU5LX1NUQVJUX1RPS0VOOworCisJaXRlci0+aGFzaGJpbiA9IGlybG1wLT5saW5rczsKKwlyZXR1cm4gaXJsbXBfc2VxX2hiX2lkeChpdGVyLCAmb2ZmKTsKK30KKworc3RhdGljIHZvaWQgKmlybG1wX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXJsbXBfaXRlcl9zdGF0ZSAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKKworCSsrKnBvczsKKworCWlmICh2ID09IExTQVBfU1RBUlRfVE9LRU4pIHsJCS8qIHN0YXJ0IG9mIGxpc3Qgb2YgbHNhcHMgKi8KKwkJaXRlci0+aGFzaGJpbiA9IGlybG1wLT51bmNvbm5lY3RlZF9sc2FwczsKKwkJdiA9IGlybG1wX3NlcV9oYl9pZHgoaXRlciwgTlVMTCk7CisJCXJldHVybiB2ID8gdiA6IExJTktfU1RBUlRfVE9LRU47CisJfQorCisJaWYgKHYgPT0gTElOS19TVEFSVF9UT0tFTikgewkJLyogc3RhcnQgb2YgbGlzdCBvZiBsaW5rcyAqLworCQlpdGVyLT5oYXNoYmluID0gaXJsbXAtPmxpbmtzOworCQlyZXR1cm4gaXJsbXBfc2VxX2hiX2lkeChpdGVyLCBOVUxMKTsKKwl9CisKKwl2ID0gaGFzaGJpbl9nZXRfbmV4dChpdGVyLT5oYXNoYmluKTsKKworCWlmICh2ID09IE5VTEwpIHsJCQkvKiBubyBtb3JlIGluIHRoaXMgaGFzaCBiaW4gKi8KKwkJc3Bpbl91bmxvY2tfaXJxKCZpdGVyLT5oYXNoYmluLT5oYl9zcGlubG9jayk7CisKKwkJaWYgKGl0ZXItPmhhc2hiaW4gPT0gaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzKSAKKwkJCXYgPSAgTElOS19TVEFSVF9UT0tFTjsKKworCQlpdGVyLT5oYXNoYmluID0gTlVMTDsKKwl9CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyB2b2lkIGlybG1wX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpcmxtcF9pdGVyX3N0YXRlICppdGVyID0gc2VxLT5wcml2YXRlOworCisJaWYgKGl0ZXItPmhhc2hiaW4pCisJCXNwaW5fdW5sb2NrX2lycSgmaXRlci0+aGFzaGJpbi0+aGJfc3BpbmxvY2spOworfQorCitzdGF0aWMgaW50IGlybG1wX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWNvbnN0IHN0cnVjdCBpcmxtcF9pdGVyX3N0YXRlICppdGVyID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBsc2FwX2NiICpzZWxmID0gdjsKKworCWlmICh2ID09IExTQVBfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgIlVuY29ubmVjdGVkIExTQVBzOlxuIik7CisJZWxzZSBpZiAodiA9PSBMSU5LX1NUQVJUX1RPS0VOKQorCQlzZXFfcHV0cyhzZXEsICJcblJlZ2lzdGVyZWQgTGluayBMYXllcnM6XG4iKTsKKwllbHNlIGlmIChpdGVyLT5oYXNoYmluID09IGlybG1wLT51bmNvbm5lY3RlZF9sc2FwcykgeworCQlzZWxmID0gdjsKKwkJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybiAtRUlOVkFMOyApOworCQlzZXFfcHJpbnRmKHNlcSwgImxzYXAgc3RhdGU6ICVzLCAiLAorCQkJICAgaXJsc2FwX3N0YXRlWyBzZWxmLT5sc2FwX3N0YXRlXSk7CisJCXNlcV9wcmludGYoc2VxLAorCQkJICAgInNsc2FwX3NlbDogJSMwMngsIGRsc2FwX3NlbDogJSMwMngsICIsCisJCQkgICBzZWxmLT5zbHNhcF9zZWwsIHNlbGYtPmRsc2FwX3NlbCk7CisJCXNlcV9wcmludGYoc2VxLCAiKCVzKSIsIHNlbGYtPm5vdGlmeS5uYW1lKTsKKwkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCX0gZWxzZSBpZiAoaXRlci0+aGFzaGJpbiA9PSBpcmxtcC0+bGlua3MpIHsKKwkJc3RydWN0IGxhcF9jYiAqbGFwID0gdjsKKworCQlzZXFfcHJpbnRmKHNlcSwgImxhcCBzdGF0ZTogJXMsICIsCisJCQkgICBpcmxtcF9zdGF0ZVtsYXAtPmxhcF9zdGF0ZV0pOworCisJCXNlcV9wcmludGYoc2VxLCAic2FkZHI6ICUjMDh4LCBkYWRkcjogJSMwOHgsICIsCisJCQkgICBsYXAtPnNhZGRyLCBsYXAtPmRhZGRyKTsKKwkJc2VxX3ByaW50ZihzZXEsICJudW0gbHNhcHM6ICVkIiwKKwkJCSAgIEhBU0hCSU5fR0VUX1NJWkUobGFwLT5sc2FwcykpOworCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisKKwkJLyogQ2FyZWZ1bCBmb3IgcHJpb3JpdHkgaW52ZXJzaW9ucyBoZXJlICEKKwkJICogQWxsIG90aGVyIHVzZXMgb2YgYXR0cmliIHNwaW5sb2NrIGFyZSBpbmRlcGVuZGVudCBvZgorCQkgKiB0aGUgb2JqZWN0IHNwaW5sb2NrLCBzbyB3ZSBhcmUgc2FmZS4gSmVhbiBJSSAqLworCQlzcGluX2xvY2soJmxhcC0+bHNhcHMtPmhiX3NwaW5sb2NrKTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIlxuICBDb25uZWN0ZWQgTFNBUHM6XG4iKTsKKwkJZm9yIChzZWxmID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGxhcC0+bHNhcHMpOworCQkgICAgIHNlbGYgIT0gTlVMTDsKKwkJICAgICBzZWxmID0gKHN0cnVjdCBsc2FwX2NiICopaGFzaGJpbl9nZXRfbmV4dChsYXAtPmxzYXBzKSkgeworCQkJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsCisJCQkJICAgIGdvdG8gb3V0bG9vcDspOworCQkJc2VxX3ByaW50ZihzZXEsICIgIGxzYXAgc3RhdGU6ICVzLCAiLAorCQkJCSAgIGlybHNhcF9zdGF0ZVsgc2VsZi0+bHNhcF9zdGF0ZV0pOworCQkJc2VxX3ByaW50ZihzZXEsCisJCQkJICAgInNsc2FwX3NlbDogJSMwMngsIGRsc2FwX3NlbDogJSMwMngsICIsCisJCQkJICAgc2VsZi0+c2xzYXBfc2VsLCBzZWxmLT5kbHNhcF9zZWwpOworCQkJc2VxX3ByaW50ZihzZXEsICIoJXMpIiwgc2VsZi0+bm90aWZ5Lm5hbWUpOworCQkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKworCQl9CisJSVJEQV9BU1NFUlRfTEFCRUwob3V0bG9vcDopCisJCXNwaW5fdW5sb2NrKCZsYXAtPmxzYXBzLT5oYl9zcGlubG9jayk7CisJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXJsbXBfc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gaXJsbXBfc2VxX3N0YXJ0LAorCS5uZXh0ICAgPSBpcmxtcF9zZXFfbmV4dCwKKwkuc3RvcCAgID0gaXJsbXBfc2VxX3N0b3AsCisJLnNob3cgICA9IGlybG1wX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBpcmxtcF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBpcmxtcF9pdGVyX3N0YXRlICpzOworCisJSVJEQV9BU1NFUlQoaXJsbXAgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUw7KTsKKworCXMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmICghcykKKwkJZ290byBvdXQ7CisKKwlyYyA9IHNlcV9vcGVuKGZpbGUsICZpcmxtcF9zZXFfb3BzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2tmcmVlOworCisJc2VxCSAgICAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gczsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWU6CisJa2ZyZWUocyk7CisJZ290byBvdXQ7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXJsbXBfc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgICAgICAgICA9IGlybG1wX3NlcV9vcGVuLAorCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworCisjZW5kaWYgLyogUFJPQ19GUyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsbXBfZXZlbnQuYyBiL25ldC9pcmRhL2lybG1wX2V2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2NDlmNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybG1wX2V2ZW50LmMKQEAgLTAsMCArMSw5MTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBpcmxtcF9ldmVudC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjgKKyAqIERlc2NyaXB0aW9uOiAgIEFuIElyREEgTE1QIGV2ZW50IGRyaXZlciBmb3IgTGludXgKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIE1vbiBBdWcgIDQgMjA6NDA6NTMgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgVHVlIERlYyAxNCAyMzowNDoxNiAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKgorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcF9mcmFtZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wX2V2ZW50Lmg+CisKK2NvbnN0IGNoYXIgKmlybG1wX3N0YXRlW10gPSB7CisJIkxBUF9TVEFOREJZIiwKKwkiTEFQX1VfQ09OTkVDVCIsCisJIkxBUF9BQ1RJVkUiLAorfTsKKworY29uc3QgY2hhciAqaXJsc2FwX3N0YXRlW10gPSB7CisJIkxTQVBfRElTQ09OTkVDVEVEIiwKKwkiTFNBUF9DT05ORUNUIiwKKwkiTFNBUF9DT05ORUNUX1BFTkQiLAorCSJMU0FQX0RBVEFfVFJBTlNGRVJfUkVBRFkiLAorCSJMU0FQX1NFVFVQIiwKKwkiTFNBUF9TRVRVUF9QRU5EIiwKK307CisKKyNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRworc3RhdGljIGNvbnN0IGNoYXIgKmlybG1wX2V2ZW50W10gPSB7CisJIkxNX0NPTk5FQ1RfUkVRVUVTVCIsCisJIkxNX0NPTk5FQ1RfQ09ORklSTSIsCisJIkxNX0NPTk5FQ1RfUkVTUE9OU0UiLAorCSJMTV9DT05ORUNUX0lORElDQVRJT04iLAorCisJIkxNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiIsCisJIkxNX0RJU0NPTk5FQ1RfUkVRVUVTVCIsCisKKwkiTE1fREFUQV9SRVFVRVNUIiwKKwkiTE1fVURBVEFfUkVRVUVTVCIsCisJIkxNX0RBVEFfSU5ESUNBVElPTiIsCisJIkxNX1VEQVRBX0lORElDQVRJT04iLAorCisJIkxNX1dBVENIRE9HX1RJTUVPVVQiLAorCisJLyogSXJMQVAgZXZlbnRzICovCisJIkxNX0xBUF9DT05ORUNUX1JFUVVFU1QiLAorCSJMTV9MQVBfQ09OTkVDVF9JTkRJQ0FUSU9OIiwKKwkiTE1fTEFQX0NPTk5FQ1RfQ09ORklSTSIsCisJIkxNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT04iLAorCSJMTV9MQVBfRElTQ09OTkVDVF9SRVFVRVNUIiwKKwkiTE1fTEFQX0RJU0NPVkVSWV9SRVFVRVNUIiwKKwkiTE1fTEFQX0RJU0NPVkVSWV9DT05GSVJNIiwKKwkiTE1fTEFQX0lETEVfVElNRU9VVCIsCit9OworI2VuZGlmCS8qIENPTkZJR19JUkRBX0RFQlVHICovCisKKy8qIExBUCBDb25uZWN0aW9uIGNvbnRyb2wgcHJvdG8gZGVjbGFyYXRpb25zICovCitzdGF0aWMgdm9pZCBpcmxtcF9zdGF0ZV9zdGFuZGJ5ICAoc3RydWN0IGxhcF9jYiAqLCBJUkxNUF9FVkVOVCwKKwkJCQkgIHN0cnVjdCBza19idWZmICopOworc3RhdGljIHZvaWQgaXJsbXBfc3RhdGVfdV9jb25uZWN0KHN0cnVjdCBsYXBfY2IgKiwgSVJMTVBfRVZFTlQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyB2b2lkIGlybG1wX3N0YXRlX2FjdGl2ZSAgIChzdHJ1Y3QgbGFwX2NiICosIElSTE1QX0VWRU5ULAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKik7CisKKy8qIExTQVAgQ29ubmVjdGlvbiBjb250cm9sIHByb3RvIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIGludCBpcmxtcF9zdGF0ZV9kaXNjb25uZWN0ZWQoc3RydWN0IGxzYXBfY2IgKiwgSVJMTVBfRVZFTlQsCisJCQkJICAgIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBpcmxtcF9zdGF0ZV9jb25uZWN0ICAgICAoc3RydWN0IGxzYXBfY2IgKiwgSVJMTVBfRVZFTlQsCisJCQkJICAgIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBpcmxtcF9zdGF0ZV9jb25uZWN0X3BlbmQoc3RydWN0IGxzYXBfY2IgKiwgSVJMTVBfRVZFTlQsCisJCQkJICAgIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBpcmxtcF9zdGF0ZV9kdHIgICAgICAgICAoc3RydWN0IGxzYXBfY2IgKiwgSVJMTVBfRVZFTlQsCisJCQkJICAgIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBpcmxtcF9zdGF0ZV9zZXR1cCAgICAgICAoc3RydWN0IGxzYXBfY2IgKiwgSVJMTVBfRVZFTlQsCisJCQkJICAgIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBpcmxtcF9zdGF0ZV9zZXR1cF9wZW5kICAoc3RydWN0IGxzYXBfY2IgKiwgSVJMTVBfRVZFTlQsCisJCQkJICAgIHN0cnVjdCBza19idWZmICopOworCitzdGF0aWMgdm9pZCAoKmxhcF9zdGF0ZVtdKSAoc3RydWN0IGxhcF9jYiAqLCBJUkxNUF9FVkVOVCwgc3RydWN0IHNrX2J1ZmYgKikgPQoreworCWlybG1wX3N0YXRlX3N0YW5kYnksCisJaXJsbXBfc3RhdGVfdV9jb25uZWN0LAorCWlybG1wX3N0YXRlX2FjdGl2ZSwKK307CisKK3N0YXRpYyBpbnQgKCpsc2FwX3N0YXRlW10pKCBzdHJ1Y3QgbHNhcF9jYiAqLCBJUkxNUF9FVkVOVCwgc3RydWN0IHNrX2J1ZmYgKikgPQoreworCWlybG1wX3N0YXRlX2Rpc2Nvbm5lY3RlZCwKKwlpcmxtcF9zdGF0ZV9jb25uZWN0LAorCWlybG1wX3N0YXRlX2Nvbm5lY3RfcGVuZCwKKwlpcmxtcF9zdGF0ZV9kdHIsCisJaXJsbXBfc3RhdGVfc2V0dXAsCisJaXJsbXBfc3RhdGVfc2V0dXBfcGVuZAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGlybG1wX25leHRfbGFwX3N0YXRlKHN0cnVjdCBsYXBfY2IgKnNlbGYsCisJCQkJCUlSTE1QX1NUQVRFIHN0YXRlKQoreworCS8qCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTE1QIExBUCA9ICVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybG1wX3N0YXRlW3N0YXRlXSk7CisJKi8KKwlzZWxmLT5sYXBfc3RhdGUgPSBzdGF0ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlybG1wX25leHRfbHNhcF9zdGF0ZShzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwKKwkJCQkJIExTQVBfU1RBVEUgc3RhdGUpCit7CisJLyoKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfREVCVUcoNCwgIiVzKCksIExNUCBMU0FQID0gJXNcbiIsIF9fRlVOQ1RJT05fXywgaXJsc2FwX3N0YXRlW3N0YXRlXSk7CisJKi8KKwlzZWxmLT5sc2FwX3N0YXRlID0gc3RhdGU7Cit9CisKKy8qIERvIGNvbm5lY3Rpb24gY29udHJvbCBldmVudHMgKi8KK2ludCBpcmxtcF9kb19sc2FwX2V2ZW50KHN0cnVjdCBsc2FwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKKwkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBFVkVOVCA9ICVzLCBTVEFURSA9ICVzXG4iLAorCQlfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSwgaXJsc2FwX3N0YXRlWyBzZWxmLT5sc2FwX3N0YXRlXSk7CisKKwlyZXR1cm4gKCpsc2FwX3N0YXRlW3NlbGYtPmxzYXBfc3RhdGVdKSAoc2VsZiwgZXZlbnQsIHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBkb19sYXBfZXZlbnQgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgRG8gSXJMQVAgY29udHJvbCBldmVudHMKKyAqCisgKi8KK3ZvaWQgaXJsbXBfZG9fbGFwX2V2ZW50KHN0cnVjdCBsYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgRVZFTlQgPSAlcywgU1RBVEUgPSAlc1xuIiwgX19GVU5DVElPTl9fLAorCQkgICBpcmxtcF9ldmVudFtldmVudF0sCisJCSAgIGlybG1wX3N0YXRlW3NlbGYtPmxhcF9zdGF0ZV0pOworCisJKCpsYXBfc3RhdGVbc2VsZi0+bGFwX3N0YXRlXSkgKHNlbGYsIGV2ZW50LCBza2IpOworfQorCit2b2lkIGlybG1wX2Rpc2NvdmVyeV90aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFdlIGFsd2F5cyBjbGVhbnVwIHRoZSBsb2cgKGFjdGl2ZSAmIHBhc3NpdmUgZGlzY292ZXJ5KSAqLworCWlybG1wX2RvX2V4cGlyeSgpOworCisJLyogQWN0aXZlIGRpc2NvdmVyeSBpcyBjb25kaXRpb25hbCAqLworCWlmIChzeXNjdGxfZGlzY292ZXJ5KQorCQlpcmxtcF9kb19kaXNjb3Zlcnkoc3lzY3RsX2Rpc2NvdmVyeV9zbG90cyk7CisKKwkvKiBSZXN0YXJ0IHRpbWVyICovCisJaXJsbXBfc3RhcnRfZGlzY292ZXJ5X3RpbWVyKGlybG1wLCBzeXNjdGxfZGlzY292ZXJ5X3RpbWVvdXQgKiBIWik7Cit9CisKK3ZvaWQgaXJsbXBfd2F0Y2hkb2dfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBsc2FwX2NiICpzZWxmID0gKHN0cnVjdCBsc2FwX2NiICopIGRhdGE7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlpcmxtcF9kb19sc2FwX2V2ZW50KHNlbGYsIExNX1dBVENIRE9HX1RJTUVPVVQsIE5VTEwpOworfQorCit2b2lkIGlybG1wX2lkbGVfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGxhcF9jYiAqKSBkYXRhOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZiwgTE1fTEFQX0lETEVfVElNRU9VVCwgTlVMTCk7Cit9CisKKy8qCisgKiBTZW5kIGFuIGV2ZW50IG9uIGFsbCBMU0FQcyBhdHRhY2hlZCB0byB0aGlzIExBUC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitpcmxtcF9kb19hbGxfbHNhcF9ldmVudChoYXNoYmluX3QgKglsc2FwX2hhc2hiaW4sCisJCQlJUkxNUF9FVkVOVAlldmVudCkKK3sKKwlzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKKwlzdHJ1Y3QgbHNhcF9jYiAqbHNhcF9uZXh0OworCisJLyogTm90ZSA6IHRoaXMgZnVuY3Rpb24gdXNlIHRoZSBuZXcgaGFzaGJpbl9maW5kX25leHQoKQorCSAqIGZ1bmN0aW9uLCBpbnN0ZWFkIG9mIHRoZSBvbGQgaGFzaGJpbl9nZXRfbmV4dCgpLgorCSAqIFRoaXMgbWFrZSBzdXJlIHRoYXQgd2UgYXJlIGFsd2F5cyBwb2ludGluZyBvbmUgbHNhcAorCSAqIGFoZWFkLCBzbyB0aGF0IGlmIHRoZSBjdXJyZW50IGxzYXAgaXMgcmVtb3ZlZCBhcyB0aGUKKwkgKiByZXN1bHQgb2Ygc2VuZGluZyB0aGUgZXZlbnQsIHdlIGRvbid0IGNhcmUuCisJICogQWxzbywgYXMgd2Ugc3RvcmUgdGhlIGNvbnRleHQgb3Vyc2VsdmVzLCBpZiBhbiBlbnVtZXJhdGlvbgorCSAqIG9mIHRoZSBzYW1lIGxzYXAgaGFzaGJpbiBoYXBwZW5zIGFzIHRoZSByZXN1bHQgb2Ygc2VuZGluZyB0aGUKKwkgKiBldmVudCwgd2UgZG9uJ3QgY2FyZS4KKwkgKiBUaGUgb25seSBwcm9ibGVtIGlzIGlmIHRoZSBuZXh0IGxzYXAgaXMgcmVtb3ZlZC4gSW4gdGhhdCBjYXNlLAorCSAqIGhhc2hiaW5fZmluZF9uZXh0KCkgd2lsbCByZXR1cm4gTlVMTCBhbmQgd2Ugd2lsbCBhYm9ydCB0aGUKKwkgKiBlbnVtZXJhdGlvbi4gLSBKZWFuIElJICovCisKKwkvKiBBbHNvIDogd2UgZG9uJ3QgYWNjZXB0IGFueSBza2IgaW4gaW5wdXQuIFdlIGNhbiAqTk9UKiBwYXNzCisJICogdGhlIHNhbWUgc2tiIHRvIG11bHRpcGxlIGNsaWVudHMgc2FmZWx5LCB3ZSB3b3VsZCBuZWVkIHRvCisJICogc2tiX2Nsb25lKCkgaXQuIC0gSmVhbiBJSSAqLworCisJbHNhcCA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdChsc2FwX2hhc2hiaW4pOworCisJd2hpbGUgKE5VTEwgIT0gaGFzaGJpbl9maW5kX25leHQobHNhcF9oYXNoYmluLAorCQkJCQkgKGxvbmcpIGxzYXAsCisJCQkJCSBOVUxMLAorCQkJCQkgKHZvaWQgKikgJmxzYXBfbmV4dCkgKSB7CisJCWlybG1wX2RvX2xzYXBfZXZlbnQobHNhcCwgZXZlbnQsIE5VTEwpOworCQlsc2FwID0gbHNhcF9uZXh0OworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgIExBUCBjb25uZWN0aW9uIGNvbnRyb2wgc3RhdGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfc3RhbmRieSAoZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBTVEFOREJZLCBUaGUgSXJMQVAgY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybG1wX3N0YXRlX3N0YW5kYnkoc3RydWN0IGxhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCUlSREFfQVNTRVJUKHNlbGYtPmlybGFwICE9IE5VTEwsIHJldHVybjspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTE1fTEFQX0RJU0NPVkVSWV9SRVFVRVNUOgorCQkvKiBpcmxtcF9uZXh0X3N0YXRpb25fc3RhdGUoIExNUF9ESVNDT1ZFUik7ICovCisKKwkJaXJsYXBfZGlzY292ZXJ5X3JlcXVlc3Qoc2VsZi0+aXJsYXAsICZpcmxtcC0+ZGlzY292ZXJ5X2NtZCk7CisJCWJyZWFrOworCWNhc2UgTE1fTEFQX0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJLyogIEl0J3MgaW1wb3J0YW50IHRvIHN3aXRjaCBzdGF0ZSBmaXJzdCwgdG8gYXZvaWQgSXJMTVAgdG8KKwkJICogIHRoaW5rIHRoYXQgdGhlIGxpbmsgaXMgZnJlZSBzaW5jZSBJckxNUCBtYXkgdGhlbiBzdGFydAorCQkgKiAgZGlzY292ZXJ5IGJlZm9yZSB0aGUgY29ubmVjdGlvbiBpcyBwcm9wZXJseSBzZXQgdXAuIERCLgorCQkgKi8KKwkJaXJsbXBfbmV4dF9sYXBfc3RhdGUoc2VsZiwgTEFQX0FDVElWRSk7CisKKwkJLyogSnVzdCBhY2NlcHQgY29ubmVjdGlvbiBUT0RPLCB0aGlzIHNob3VsZCBiZSBmaXhlZCAqLworCQlpcmxhcF9jb25uZWN0X3Jlc3BvbnNlKHNlbGYtPmlybGFwLCBza2IpOworCQlicmVhazsKKwljYXNlIExNX0xBUF9DT05ORUNUX1JFUVVFU1Q6CisJCUlSREFfREVCVUcoNCwgIiVzKCkgTFNfQ09OTkVDVF9SRVFVRVNUXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWlybG1wX25leHRfbGFwX3N0YXRlKHNlbGYsIExBUF9VX0NPTk5FQ1QpOworCisJCS8qIEZJWE1FOiBuZWVkIHRvIHNldCB1c2VycyByZXF1ZXN0ZWQgUW9TICovCisJCWlybGFwX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5pcmxhcCwgc2VsZi0+ZGFkZHIsIE5VTEwsIDApOworCQlicmVhazsKKwljYXNlIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT046CisJCUlSREFfREVCVUcoNCwgIiVzKCksIEVycm9yIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT05cbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCisJCWlybG1wX25leHRfbGFwX3N0YXRlKHNlbGYsIExBUF9TVEFOREJZKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlc1xuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfdV9jb25uZWN0IChldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFVfQ09OTkVDVCwgVGhlIGxheWVyIGFib3ZlIGhhcyB0cmllZCB0byBvcGVuIGFuIExTQVAgY29ubmVjdGlvbiBidXQKKyAqICAgIHNpbmNlIHRoZSBJckxBUCBjb25uZWN0aW9uIGRvZXMgbm90IGV4aXN0LCB3ZSBtdXN0IGZpcnN0IHN0YXJ0IGFuCisgKiAgICBJckxBUCBjb25uZWN0aW9uLiBXZSBhcmUgbm93IHdhaXRpbmcgcmVzcG9uc2UgZnJvbSBJckxBUC4KKyAqICovCitzdGF0aWMgdm9pZCBpcmxtcF9zdGF0ZV91X2Nvbm5lY3Qoc3RydWN0IGxhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoMiwgIiVzKCksIGV2ZW50PSVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBMTV9MQVBfQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQkvKiAgSXQncyBpbXBvcnRhbnQgdG8gc3dpdGNoIHN0YXRlIGZpcnN0LCB0byBhdm9pZCBJckxNUCB0bworCQkgKiAgdGhpbmsgdGhhdCB0aGUgbGluayBpcyBmcmVlIHNpbmNlIElyTE1QIG1heSB0aGVuIHN0YXJ0CisJCSAqICBkaXNjb3ZlcnkgYmVmb3JlIHRoZSBjb25uZWN0aW9uIGlzIHByb3Blcmx5IHNldCB1cC4gREIuCisJCSAqLworCQlpcmxtcF9uZXh0X2xhcF9zdGF0ZShzZWxmLCBMQVBfQUNUSVZFKTsKKworCQkvKiBKdXN0IGFjY2VwdCBjb25uZWN0aW9uIFRPRE8sIHRoaXMgc2hvdWxkIGJlIGZpeGVkICovCisJCWlybGFwX2Nvbm5lY3RfcmVzcG9uc2Uoc2VsZi0+aXJsYXAsIHNrYik7CisKKwkJLyogVGVsbCBMU0FQcyB0aGF0IHRoZXkgY2FuIHN0YXJ0IHNlbmRpbmcgZGF0YSAqLworCQlpcmxtcF9kb19hbGxfbHNhcF9ldmVudChzZWxmLT5sc2FwcywgTE1fTEFQX0NPTk5FQ1RfQ09ORklSTSk7CisKKwkJLyogTm90ZSA6IGJ5IHRoZSB0aW1lIHdlIGdldCB0aGVyZSAoTEFQIHJldHJpZXMgYW5kIGNvKSwKKwkJICogdGhlIGxzYXBzIG1heSBhbHJlYWR5IGhhdmUgZ29uZS4gVGhpcyBhdm9pZCBnZXR0aW5nIHN0dWNrCisJCSAqIGZvcmV2ZXIgaW4gTEFQX0FDVElWRSBzdGF0ZSAtIEplYW4gSUkgKi8KKwkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpID09IDApIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCkgTk8gTFNBUHMgIVxuIiwgIF9fRlVOQ1RJT05fXyk7CisJCQlpcmxtcF9zdGFydF9pZGxlX3RpbWVyKHNlbGYsIExNX0lETEVfVElNRU9VVCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMTV9MQVBfQ09OTkVDVF9SRVFVRVNUOgorCQkvKiBBbHJlYWR5IHRyeWluZyB0byBjb25uZWN0ICovCisJCWJyZWFrOworCWNhc2UgTE1fTEFQX0NPTk5FQ1RfQ09ORklSTToKKwkJLyogRm9yIGFsbCBsc2FwX2NlIEUgQXNzb2NpYXRlZCBkbyBMU19Db25uZWN0X2NvbmZpcm0gKi8KKwkJaXJsbXBfbmV4dF9sYXBfc3RhdGUoc2VsZiwgTEFQX0FDVElWRSk7CisKKwkJLyogVGVsbCBMU0FQcyB0aGF0IHRoZXkgY2FuIHN0YXJ0IHNlbmRpbmcgZGF0YSAqLworCQlpcmxtcF9kb19hbGxfbHNhcF9ldmVudChzZWxmLT5sc2FwcywgTE1fTEFQX0NPTk5FQ1RfQ09ORklSTSk7CisKKwkJLyogTm90ZSA6IGJ5IHRoZSB0aW1lIHdlIGdldCB0aGVyZSAoTEFQIHJldHJpZXMgYW5kIGNvKSwKKwkJICogdGhlIGxzYXBzIG1heSBhbHJlYWR5IGhhdmUgZ29uZS4gVGhpcyBhdm9pZCBnZXR0aW5nIHN0dWNrCisJCSAqIGZvcmV2ZXIgaW4gTEFQX0FDVElWRSBzdGF0ZSAtIEplYW4gSUkgKi8KKwkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpID09IDApIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCkgTk8gTFNBUHMgIVxuIiwgIF9fRlVOQ1RJT05fXyk7CisJCQlpcmxtcF9zdGFydF9pZGxlX3RpbWVyKHNlbGYsIExNX0lETEVfVElNRU9VVCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlJUkRBX0RFQlVHKDQsICIlcygpLCBMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OXG4iLCAgX19GVU5DVElPTl9fKTsKKwkJaXJsbXBfbmV4dF9sYXBfc3RhdGUoc2VsZiwgTEFQX1NUQU5EQlkpOworCisJCS8qIFNlbmQgZGlzY29ubmVjdCBldmVudCB0byBhbGwgTFNBUHMgdXNpbmcgdGhpcyBsaW5rICovCisJCWlybG1wX2RvX2FsbF9sc2FwX2V2ZW50KHNlbGYtPmxzYXBzLAorCQkJCQlMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9MQVBfRElTQ09OTkVDVF9SRVFVRVNUOgorCQlJUkRBX0RFQlVHKDQsICIlcygpLCBMTV9MQVBfRElTQ09OTkVDVF9SRVFVRVNUXG4iLCAgX19GVU5DVElPTl9fKTsKKworCQkvKiBPbmUgb2YgdGhlIExTQVAgZGlkIHRpbWVvdXQgb3Igd2FzIGNsb3NlZCwgaWYgaXQgd2FzCisJCSAqIHRoZSBsYXN0IG9uZSwgdHJ5IHRvIGdldCBvdXQgb2YgaGVyZSAtIEplYW4gSUkgKi8KKwkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpIDw9IDEpIHsKKwkJCWlybGFwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5pcmxhcCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlc1xuIiwKKwkJCSBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3N0YXRlX2FjdGl2ZSAoZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBBQ1RJVkUsIElyTEFQIGNvbm5lY3Rpb24gaXMgYWN0aXZlCisgKgorICovCitzdGF0aWMgdm9pZCBpcmxtcF9zdGF0ZV9hY3RpdmUoc3RydWN0IGxhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTE1fTEFQX0NPTk5FQ1RfUkVRVUVTVDoKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTFNfQ09OTkVDVF9SRVFVRVNUXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCS8qCisJCSAqIElyTEFQIG1heSBoYXZlIGEgcGVuZGluZyBkaXNjb25uZWN0LiBXZSB0cmllZCB0byBjbG9zZQorCQkgKiBJckxBUCwgYnV0IGl0IHdhcyBwb3N0cG9uZWQgYmVjYXVzZSB0aGUgbGluayB3YXMKKwkJICogYnVzeSBvciB3ZSB3ZXJlIHN0aWxsIHNlbmRpbmcgcGFja2V0cy4gQXMgd2Ugbm93CisJCSAqIG5lZWQgaXQsIG1ha2Ugc3VyZSBpdCBzdGF5cyBvbi4gSmVhbiBJSQorCQkgKi8KKwkJaXJsYXBfY2xlYXJfZGlzY29ubmVjdChzZWxmLT5pcmxhcCk7CisKKwkJLyoKKwkJICogIExBUCBjb25uZWN0aW9uIGFscmVhZHkgYWN0aXZlLCBqdXN0IGJvdW5jZSBiYWNrISBTaW5jZSB3ZQorCQkgKiAgZG9uJ3Qga25vdyB3aGljaCBMU0FQIHRoYXQgdHJpZWQgdG8gZG8gdGhpcywgd2UgaGF2ZSB0bworCQkgKiAgbm90aWZ5IGFsbCBMU0FQcyB1c2luZyB0aGlzIExBUCwgYnV0IHRoYXQgc2hvdWxkIGJlIHNhZmUgdG8KKwkJICogIGRvIGFueXdheS4KKwkJICovCisJCWlybG1wX2RvX2FsbF9sc2FwX2V2ZW50KHNlbGYtPmxzYXBzLCBMTV9MQVBfQ09OTkVDVF9DT05GSVJNKTsKKworCQkvKiBOZWVkZWQgYnkgY29ubmVjdCBpbmRpY2F0aW9uICovCisJCWlybG1wX2RvX2FsbF9sc2FwX2V2ZW50KGlybG1wLT51bmNvbm5lY3RlZF9sc2FwcywKKwkJCQkJTE1fTEFQX0NPTk5FQ1RfQ09ORklSTSk7CisJCS8qIEtlZXAgc3RhdGUgKi8KKwkJYnJlYWs7CisJY2FzZSBMTV9MQVBfRElTQ09OTkVDVF9SRVFVRVNUOgorCQkvKgorCQkgKiAgTmVlZCB0byBmaW5kIG91dCBpZiB3ZSBzaG91bGQgY2xvc2UgSXJMQVAgb3Igbm90LiBJZiB0aGVyZQorCQkgKiAgaXMgb25seSBvbmUgTFNBUCBjb25uZWN0aW9uIGxlZnQgb24gdGhpcyBsaW5rLCB0aGF0IExTQVAKKwkJICogIG11c3QgYmUgdGhlIG9uZSB0aGF0IHRyaWVzIHRvIGNsb3NlIElyTEFQLiBJdCB3aWxsIGJlCisJCSAqICByZW1vdmVkIGxhdGVyIGFuZCBtb3ZlZCB0byB0aGUgbGlzdCBvZiB1bmNvbm5lY3RlZCBMU0FQcworCQkgKi8KKwkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpID4gMCkgeworCQkJLyogVGltZXIgdmFsdWUgaXMgY2hlY2tlZCBpbiBpcnN5c2N0bCAtIEplYW4gSUkgKi8KKwkJCWlybG1wX3N0YXJ0X2lkbGVfdGltZXIoc2VsZiwgc3lzY3RsX2xhcF9rZWVwYWxpdmVfdGltZSAqIEhaIC8gMTAwMCk7CisJCX0gZWxzZSB7CisJCQkvKiBObyBtb3JlIGNvbm5lY3Rpb25zLCBzbyBjbG9zZSBJckxBUCAqLworCisJCQkvKiBXZSBkb24ndCB3YW50IHRvIGNoYW5nZSBzdGF0ZSBqdXN0IHlldCwgYmVjYXVzZQorCQkJICogd2Ugd2FudCB0byByZWZsZWN0IGFjY3VyYXRlbHkgdGhlIHJlYWwgc3RhdGUgb2YKKwkJCSAqIHRoZSBMQVAsIG5vdCB0aGUgc3RhdGUgd2Ugd2lzaCBpdCB3YXMgaW4sCisJCQkgKiBzbyB0aGF0IHdlIGRvbid0IGxvc2UgTE1fTEFQX0NPTk5FQ1RfUkVRVUVTVC4KKwkJCSAqIEluIHNvbWUgY2FzZXMsIElyTEFQIHdvbid0IGNsb3NlIHRoZSBMQVAKKwkJCSAqIGltbWVkaWF0ZWx5LiBGb3IgZXhhbXBsZSwgaXQgbWlnaHQgc3RpbGwgYmUKKwkJCSAqIHJldHJ5aW5nIHBhY2tldHMgb3Igd2FpdGluZyBmb3IgdGhlIHBmIGJpdC4KKwkJCSAqIEFzIHRoZSBMQVAgYWx3YXlzIHNlbmQgYSBESVNDT05ORUNUX0lORElDQVRJT04KKwkJCSAqIGluIFBDTE9TRSBvciBTQ0xPU0UsIGp1c3QgY2hhbmdlIHN0YXRlIG9uIHRoYXQuCisJCQkgKiBKZWFuIElJICovCisJCQlpcmxhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+aXJsYXApOworCQl9CisJCWJyZWFrOworCWNhc2UgTE1fTEFQX0lETEVfVElNRU9VVDoKKwkJaWYgKEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpID09IDApIHsKKwkJCS8qIFNhbWUgcmVhc29uaW5nIGFzIGFib3ZlIC0ga2VlcCBzdGF0ZSAqLworCQkJaXJsYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmlybGFwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT046CisJCWlybG1wX25leHRfbGFwX3N0YXRlKHNlbGYsIExBUF9TVEFOREJZKTsKKworCQkvKiBJbiBzb21lIGNhc2UsIGF0IHRoaXMgcG9pbnQgb3VyIHNpZGUgaGFzIGFscmVhZHkgY2xvc2VkCisJCSAqIGFsbCBsc2FwcywgYW5kIHdlIGFyZSB3YWl0aW5nIGZvciB0aGUgaWRsZV90aW1lciB0bworCQkgKiBleHBpcmUuIElmIGFub3RoZXIgZGV2aWNlIHJlY29ubmVjdCBpbW1lZGlhdGVseSwgdGhlCisJCSAqIGlkbGUgdGltZXIgd2lsbCBleHBpcmUgaW4gdGhlIG1pZGxlIG9mIHRoZSBjb25uZWN0aW9uCisJCSAqIGluaXRpYWxpc2F0aW9uLCBzY3Jld2luZyB1cCB0aGluZ3MgYSBsb3QuLi4KKwkJICogVGhlcmVmb3JlLCB3ZSBtdXN0IHN0b3AgdGhlIHRpbWVyLi4uICovCisJCWlybG1wX3N0b3BfaWRsZV90aW1lcihzZWxmKTsKKworCQkvKgorCQkgKiAgSW5mb3JtIGFsbCBjb25uZWN0ZWQgTFNBUCdzIHVzaW5nIHRoaXMgbGluaworCQkgKi8KKwkJaXJsbXBfZG9fYWxsX2xzYXBfZXZlbnQoc2VsZi0+bHNhcHMsCisJCQkJCUxNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT04pOworCisJCS8qIEZvcmNlIGFuIGV4cGlyeSBvZiB0aGUgZGlzY292ZXJ5IGxvZy4KKwkJICogTm93IHRoYXQgdGhlIExBUCBpcyBmcmVlLCB0aGUgc3lzdGVtIG1heSBhdHRlbXB0IHRvCisJCSAqIGNvbm5lY3QgdG8gYW5vdGhlciBkZXZpY2UuIFVuZm9ydHVuYXRlbHksIG91ciBlbnRyaWVzCisJCSAqIGFyZSBzdGFsZS4gVGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgKDwzcykgYmVmb3JlIHRoZQorCQkgKiBub3JtYWwgZGlzY292ZXJ5IHdpbGwgcnVuIGFuZCB3aGVyZSBpcmxtcF9jb25uZWN0X3JlcXVlc3QoKQorCQkgKiBjYW4gZ2V0IHRoZSB3cm9uZyBpbmZvLCBzbyBtYWtlIHN1cmUgdGhpbmdzIGdldAorCQkgKiBjbGVhbmVkICpOT1cqIDstKSAtIEplYW4gSUkgKi8KKwkJaXJsbXBfZG9fZXhwaXJ5KCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJXNcbiIsCisJCQkgX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0pOworCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICBMU0FQIGNvbm5lY3Rpb24gY29udHJvbCBzdGF0ZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9zdGF0ZV9kaXNjb25uZWN0ZWQgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgRElTQ09OTkVDVEVECisgKgorICovCitzdGF0aWMgaW50IGlybG1wX3N0YXRlX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisjaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKKwljYXNlIExNX1VEQVRBX0lORElDQVRJT046CisJCS8qIFRoaXMgaXMgbW9zdCBiaXp6YXJlLiBUaG9zZSBwYWNrZXRzIGFyZSAgYWthIHVucmVsaWFibGUKKwkJICogY29ubmVjdGVkLCBha2EgSXJMUFQgb3IgU09DS19ER1JBTS9JUkRBUFJPVE9fVU5JVERBVEEuCisJCSAqIFdoeSBkbyB3ZSBwYXNzIHRoZW0gYXMgVWx0cmEgPz8/IEplYW4gSUkgKi8KKwkJaXJsbXBfY29ubmxlc3NfZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CisJCWJyZWFrOworI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCisJY2FzZSBMTV9DT05ORUNUX1JFUVVFU1Q6CisJCUlSREFfREVCVUcoNCwgIiVzKCksIExNX0NPTk5FQ1RfUkVRVUVTVFxuIiwgX19GVU5DVElPTl9fKTsKKworCQlpZiAoc2VsZi0+Y29ubl9za2IpIHsKKwkJCUlSREFfV0FSTklORygiJXM6IGJ1c3kgd2l0aCBhbm90aGVyIHJlcXVlc3QhXG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IChzZWUgaXJsbXBfY29ubmVjdF9yZXF1ZXN0KCkpICovCisJCXNrYl9nZXQoc2tiKTsKKwkJc2VsZi0+Y29ubl9za2IgPSBza2I7CisKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfU0VUVVBfUEVORCk7CisKKwkJLyogU3RhcnQgd2F0Y2hkb2cgdGltZXIgKDUgc2VjcyBmb3Igbm93KSAqLworCQlpcmxtcF9zdGFydF93YXRjaGRvZ190aW1lcihzZWxmLCA1KkhaKTsKKworCQlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZi0+bGFwLCBMTV9MQVBfQ09OTkVDVF9SRVFVRVNULCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9DT05ORUNUX0lORElDQVRJT046CisJCWlmIChzZWxmLT5jb25uX3NrYikgeworCQkJSVJEQV9XQVJOSU5HKCIlczogYnVzeSB3aXRoIGFub3RoZXIgcmVxdWVzdCFcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgKHNlZSBpcmxhcF9kcml2ZXJfcmN2KCkpICovCisJCXNrYl9nZXQoc2tiKTsKKwkJc2VsZi0+Y29ubl9za2IgPSBza2I7CisKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfQ09OTkVDVF9QRU5EKTsKKworCQkvKiBTdGFydCB3YXRjaGRvZyB0aW1lcgorCQkgKiBUaGlzIGlzIG5vdCBtZW50aW9ubmVkIGluIHRoZSBzcGVjLCBidXQgdGhlcmUgaXMgYSByYXJlCisJCSAqIHJhY2UgY29uZGl0aW9uIHRoYXQgY2FuIGdldCB0aGUgc29ja2V0IHN0dWNrLgorCQkgKiBJZiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQgd2hpbGUgb3VyIExBUCBpcyBjbG9zaW5nIGRvd24sCisJCSAqIHRoZSBMTV9MQVBfQ09OTkVDVF9SRVFVRVNUIGdldCBsb3N0IGFuZCB3ZSBnZXQgc3R1Y2sgaW4KKwkJICogQ09OTkVDVF9QRU5EIHN0YXRlIGZvcmV2ZXIuCisJCSAqIFRoZSBvdGhlciBjYXVzZSBvZiBnZXR0aW5nIHN0dWNrIGRvd24gdGhlcmUgaXMgaWYgdGhlCisJCSAqIGhpZ2hlciBsYXllciBuZXZlciByZXBseSB0byB0aGUgQ09OTkVDVF9JTkRJQ0FUSU9OLgorCQkgKiBBbnl3YXksIGl0IG1ha2Ugc2Vuc2UgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUKKwkJICogYSBiYWNrdXAgcGxhbi4gMSBzZWNvbmQgaXMgcGxlbnR5IChzaG91bGQgYmUgaW1tZWRpYXRlKS4KKwkJICogSmVhbiBJSSAqLworCQlpcmxtcF9zdGFydF93YXRjaGRvZ190aW1lcihzZWxmLCAxKkhaKTsKKworCQlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZi0+bGFwLCBMTV9MQVBfQ09OTkVDVF9SRVFVRVNULCBOVUxMKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5rbm93biBldmVudCAlcyBvbiBMU0FQICUjMDJ4XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0sIHNlbGYtPnNsc2FwX3NlbCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfY29ubmVjdCAoc2VsZiwgZXZlbnQsIHNrYikKKyAqCisgKiAgICBDT05ORUNUCisgKgorICovCitzdGF0aWMgaW50IGlybG1wX3N0YXRlX2Nvbm5lY3Qoc3RydWN0IGxzYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxzYXBfY2IgKmxzYXA7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBMTV9DT05ORUNUX1JFU1BPTlNFOgorCQkvKgorCQkgKiAgQmluZCB0aGlzIExTQVAgdG8gdGhlIElyTEFQIGxpbmsgd2hlcmUgdGhlIGNvbm5lY3Qgd2FzCisJCSAqICByZWNlaXZlZAorCQkgKi8KKwkJbHNhcCA9IGhhc2hiaW5fcmVtb3ZlKGlybG1wLT51bmNvbm5lY3RlZF9sc2FwcywgKGxvbmcpIHNlbGYsCisJCQkJICAgICAgTlVMTCk7CisKKwkJSVJEQV9BU1NFUlQobHNhcCA9PSBzZWxmLCByZXR1cm4gLTE7KTsKKwkJSVJEQV9BU1NFUlQoc2VsZi0+bGFwICE9IE5VTEwsIHJldHVybiAtMTspOworCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAtPmxzYXBzICE9IE5VTEwsIHJldHVybiAtMTspOworCisJCWhhc2hiaW5faW5zZXJ0KHNlbGYtPmxhcC0+bHNhcHMsIChpcmRhX3F1ZXVlX3QgKikgc2VsZiwKKwkJCSAgICAgICAobG9uZykgc2VsZiwgTlVMTCk7CisKKwkJc2V0X2JpdCgwLCAmc2VsZi0+Y29ubmVjdGVkKTsJLyogVFJVRSAqLworCisJCWlybG1wX3NlbmRfbGNmX3BkdShzZWxmLT5sYXAsIHNlbGYtPmRsc2FwX3NlbCwKKwkJCQkgICBzZWxmLT5zbHNhcF9zZWwsIENPTk5FQ1RfQ05GLCBza2IpOworCisJCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCisJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RBVEFfVFJBTlNGRVJfUkVBRFkpOworCQlicmVhazsKKwljYXNlIExNX1dBVENIRE9HX1RJTUVPVVQ6CisJCS8qIE1heSBoYXBwZW4sIHdobyBrbm93cy4uLgorCQkgKiBKZWFuIElJICovCisJCUlSREFfREVCVUcoMCwgIiVzKCkgV0FUQ0hET0dfVElNRU9VVCFcbiIsICBfX0ZVTkNUSU9OX18pOworCisJCS8qIERpc2Nvbm5lY3QsIGdldCBvdXQuLi4gLSBKZWFuIElJICovCisJCXNlbGYtPmxhcCA9IE5VTEw7CisJCXNlbGYtPmRsc2FwX3NlbCA9IExTQVBfQU5ZOworCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9ESVNDT05ORUNURUQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OIDogU2hvdWxkIG5ldmVyIGhhcHBlbiwgd2UKKwkJICogYXJlICpub3QqIHlldCBib3VuZCB0byB0aGUgSXJMQVAgbGluay4gSmVhbiBJSSAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVzIG9uIExTQVAgJSMwMnhcbiIsIAorCQkJICAgX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0sIHNlbGYtPnNsc2FwX3NlbCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfY29ubmVjdF9wZW5kIChldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIENPTk5FQ1RfUEVORAorICoKKyAqLworc3RhdGljIGludCBpcmxtcF9zdGF0ZV9jb25uZWN0X3BlbmQoc3RydWN0IGxzYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBMTV9DT05ORUNUX1JFUVVFU1Q6CisJCS8qIEtlZXAgc3RhdGUgKi8KKwkJYnJlYWs7CisJY2FzZSBMTV9DT05ORUNUX1JFU1BPTlNFOgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBMTV9DT05ORUNUX1JFU1BPTlNFLCAiCisJCQkgICAibm8gaW5kaWNhdGlvbiBpc3N1ZWQgeWV0XG4iLCAgX19GVU5DVElPTl9fKTsKKwkJLyogS2VlcCBzdGF0ZSAqLworCQlicmVhazsKKwljYXNlIExNX0RJU0NPTk5FQ1RfUkVRVUVTVDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgTE1fRElTQ09OTkVDVF9SRVFVRVNULCAiCisJCQkgICAibm90IHlldCBib3VuZCB0byBJckxBUCBjb25uZWN0aW9uXG4iLCAgX19GVU5DVElPTl9fKTsKKwkJLyogS2VlcCBzdGF0ZSAqLworCQlicmVhazsKKwljYXNlIExNX0xBUF9DT05ORUNUX0NPTkZJUk06CisJCUlSREFfREVCVUcoNCwgIiVzKCksIExTX0NPTk5FQ1RfQ09ORklSTVxuIiwgIF9fRlVOQ1RJT05fXyk7CisJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0NPTk5FQ1QpOworCisJCXR4X3NrYiA9IHNlbGYtPmNvbm5fc2tiOworCQlzZWxmLT5jb25uX3NrYiA9IE5VTEw7CisKKwkJaXJsbXBfY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIHR4X3NrYik7CisJCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlybG1wX2Nvbm5lY3RfaW5kaWNhdGlvbigpLiAqLworCQlkZXZfa2ZyZWVfc2tiKHR4X3NrYik7CisJCWJyZWFrOworCWNhc2UgTE1fV0FUQ0hET0dfVElNRU9VVDoKKwkJLyogV2lsbCBoYXBwZW4gaW4gc29tZSByYXJlIGNhc2VzIGJlY2F1c2Ugb2YgYSByYWNlIGNvbmRpdGlvbi4KKwkJICogSnVzdCBtYWtlIHN1cmUgd2UgZG9uJ3Qgc3RheSB0aGVyZSBmb3JldmVyLi4uCisJCSAqIEplYW4gSUkgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSBXQVRDSERPR19USU1FT1VUIVxuIiwgIF9fRlVOQ1RJT05fXyk7CisKKwkJLyogR28gYmFjayB0byBkaXNjb25uZWN0ZWQgbW9kZSwga2VlcCB0aGUgc29ja2V0IHdhaXRpbmcgKi8KKwkJc2VsZi0+bGFwID0gTlVMTDsKKwkJc2VsZi0+ZGxzYXBfc2VsID0gTFNBUF9BTlk7CisJCWlmKHNlbGYtPmNvbm5fc2tiKQorCQkJZGV2X2tmcmVlX3NrYihzZWxmLT5jb25uX3NrYik7CisJCXNlbGYtPmNvbm5fc2tiID0gTlVMTDsKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiA6IFNob3VsZCBuZXZlciBoYXBwZW4sIHdlCisJCSAqIGFyZSAqbm90KiB5ZXQgYm91bmQgdG8gdGhlIElyTEFQIGxpbmsuIEplYW4gSUkgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlcyBvbiBMU0FQICUjMDJ4XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0sIHNlbGYtPnNsc2FwX3NlbCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfZHRyIChzZWxmLCBldmVudCwgc2tiKQorICoKKyAqICAgIERBVEFfVFJBTlNGRVJfUkVBRFkKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsbXBfc3RhdGVfZHRyKHN0cnVjdCBsc2FwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKKwkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJTE1fUkVBU09OIHJlYXNvbjsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5sYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBMTV9EQVRBX1JFUVVFU1Q6IC8qIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2UgKi8KKwkJaXJsbXBfc2VuZF9kYXRhX3BkdShzZWxmLT5sYXAsIHNlbGYtPmRsc2FwX3NlbCwKKwkJCQkgICAgc2VsZi0+c2xzYXBfc2VsLCBGQUxTRSwgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9EQVRBX0lORElDQVRJT046IC8qIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2UgKi8KKwkJaXJsbXBfZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CisJCWJyZWFrOworCWNhc2UgTE1fVURBVEFfUkVRVUVTVDoKKwkJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOworCQlpcmxtcF9zZW5kX2RhdGFfcGR1KHNlbGYtPmxhcCwgc2VsZi0+ZGxzYXBfc2VsLAorCQkJCSAgICBzZWxmLT5zbHNhcF9zZWwsIFRSVUUsIHNrYik7CisJCWJyZWFrOworCWNhc2UgTE1fVURBVEFfSU5ESUNBVElPTjoKKwkJaXJsbXBfdWRhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IpOworCQlicmVhazsKKwljYXNlIExNX0NPTk5FQ1RfUkVRVUVTVDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgTE1fQ09OTkVDVF9SRVFVRVNULCAiCisJCQkgICAiZXJyb3IsIExTQVAgYWxyZWFkeSBjb25uZWN0ZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCS8qIEtlZXAgc3RhdGUgKi8KKwkJYnJlYWs7CisJY2FzZSBMTV9DT05ORUNUX1JFU1BPTlNFOgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBMTV9DT05ORUNUX1JFU1BPTlNFLCAiCisJCQkgICAiZXJyb3IsIExTQVAgYWxyZWFkeSBjb25uZWN0ZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCS8qIEtlZXAgc3RhdGUgKi8KKwkJYnJlYWs7CisJY2FzZSBMTV9ESVNDT05ORUNUX1JFUVVFU1Q6CisJCWlybG1wX3NlbmRfbGNmX3BkdShzZWxmLT5sYXAsIHNlbGYtPmRsc2FwX3NlbCwgc2VsZi0+c2xzYXBfc2VsLAorCQkJCSAgIERJU0NPTk5FQ1QsIHNrYik7CisJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CisJCS8qIENhbGxlZCBvbmx5IGZyb20gaXJsbXBfZGlzY29ubmVjdF9yZXF1ZXN0KCksIHdpbGwKKwkJICogdW5iaW5kIGZyb20gTEFQIG92ZXIgdGhlcmUuIEplYW4gSUkgKi8KKworCQkvKiBUcnkgdG8gY2xvc2UgdGhlIExBUCBjb25uZWN0aW9uIGlmIGl0cyBzdGlsbCB0aGVyZSAqLworCQlpZiAoc2VsZi0+bGFwKSB7CisJCQlJUkRBX0RFQlVHKDQsICIlcygpLCB0cnlpbmcgdG8gY2xvc2UgSXJMQVBcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLT5sYXAsCisJCQkJCSAgIExNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1QsCisJCQkJCSAgIE5VTEwpOworCQl9CisJCWJyZWFrOworCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKKworCQlyZWFzb24gPSBpcmxtcF9jb252ZXJ0X2xhcF9yZWFzb24oc2VsZi0+bGFwLT5yZWFzb24pOworCisJCWlybG1wX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCByZWFzb24sIE5VTEwpOworCQlicmVhazsKKwljYXNlIExNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKKworCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCUlSREFfQVNTRVJUKHNlbGYtPmxhcC0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwkJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOworCQlJUkRBX0FTU0VSVChza2ItPmxlbiA+IDMsIHJldHVybiAtMTspOworCQlyZWFzb24gPSBza2ItPmRhdGFbM107CisKKwkJIC8qIFRyeSB0byBjbG9zZSB0aGUgTEFQIGNvbm5lY3Rpb24gKi8KKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgdHJ5aW5nIHRvIGNsb3NlIElyTEFQXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZi0+bGFwLCBMTV9MQVBfRElTQ09OTkVDVF9SRVFVRVNULCBOVUxMKTsKKworCQlpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgcmVhc29uLCBza2IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVzIG9uIExTQVAgJSMwMnhcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSwgc2VsZi0+c2xzYXBfc2VsKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9zdGF0ZV9zZXR1cCAoZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBTRVRVUCwgU3RhdGlvbiBDb250cm9sIGhhcyBzZXQgdXAgdGhlIHVuZGVybHlpbmcgSXJMQVAgY29ubmVjdGlvbi4KKyAqICAgIEFuIExTQVAgY29ubmVjdGlvbiByZXF1ZXN0IGhhcyBiZWVuIHRyYW5zbWl0dGVkIHRvIHRoZSBwZWVyCisgKiAgICBMU0FQLUNvbm5lY3Rpb24gQ29udHJvbCBGU00gYW5kIHdlIGFyZSBhd2FpdGluZyByZXBseS4KKyAqLworc3RhdGljIGludCBpcmxtcF9zdGF0ZV9zZXR1cChzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJTE1fUkVBU09OIHJlYXNvbjsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIExNX0NPTk5FQ1RfQ09ORklSTToKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfREFUQV9UUkFOU0ZFUl9SRUFEWSk7CisKKwkJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisKKwkJaXJsbXBfY29ubmVjdF9jb25maXJtKHNlbGYsIHNrYik7CisJCWJyZWFrOworCWNhc2UgTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9ESVNDT05ORUNURUQpOworCisJCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkJSVJEQV9BU1NFUlQoc2VsZi0+bGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCQlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCUlSREFfQVNTRVJUKHNrYi0+bGVuID4gMywgcmV0dXJuIC0xOyk7CisJCXJlYXNvbiA9IHNrYi0+ZGF0YVszXTsKKworCQkgLyogVHJ5IHRvIGNsb3NlIHRoZSBMQVAgY29ubmVjdGlvbiAqLworCQlJUkRBX0RFQlVHKDQsICIlcygpLCB0cnlpbmcgdG8gY2xvc2UgSXJMQVBcbiIsICBfX0ZVTkNUSU9OX18pOworCQlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZi0+bGFwLCBMTV9MQVBfRElTQ09OTkVDVF9SRVFVRVNULCBOVUxMKTsKKworCQlpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgcmVhc29uLCBza2IpOworCQlicmVhazsKKwljYXNlIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT046CisJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CisKKwkJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisKKwkJSVJEQV9BU1NFUlQoc2VsZi0+bGFwICE9IE5VTEwsIHJldHVybiAtMTspOworCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJCXJlYXNvbiA9IGlybG1wX2NvbnZlcnRfbGFwX3JlYXNvbihzZWxmLT5sYXAtPnJlYXNvbik7CisKKwkJaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIHJlYXNvbiwgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9XQVRDSERPR19USU1FT1VUOgorCQlJUkRBX0RFQlVHKDAsICIlcygpIFdBVENIRE9HX1RJTUVPVVQhXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkJaXJsbXBfZG9fbGFwX2V2ZW50KHNlbGYtPmxhcCwgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVCwgTlVMTCk7CisJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CisKKwkJaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExNX0NPTk5FQ1RfRkFJTFVSRSwgTlVMTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJXMgb24gTFNBUCAlIzAyeFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdLCBzZWxmLT5zbHNhcF9zZWwpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3N0YXRlX3NldHVwX3BlbmQgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgU0VUVVBfUEVORCwgQW4gTE1fQ09OTkVDVF9SRVFVRVNUIGhhcyBiZWVuIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZpY2UKKyAqICAgIHVzZXIgdG8gc2V0IHVwIGFuIExTQVAgY29ubmVjdGlvbi4gQSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQgdG8gdGhlCisgKiAgICBMQVAgRlNNIHRvIHNldCB1cCB0aGUgdW5kZXJseWluZyBJckxBUCBjb25uZWN0aW9uLCBhbmQgd2UKKyAqICAgIGFyZSBhd2FpdGluZyBjb25maXJtLgorICovCitzdGF0aWMgaW50IGlybG1wX3N0YXRlX3NldHVwX3BlbmQoc3RydWN0IGxzYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCUxNX1JFQVNPTiByZWFzb247CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChpcmxtcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIExNX0xBUF9DT05ORUNUX0NPTkZJUk06CisJCUlSREFfQVNTRVJUKHNlbGYtPmNvbm5fc2tiICE9IE5VTEwsIHJldHVybiAtMTspOworCisJCXR4X3NrYiA9IHNlbGYtPmNvbm5fc2tiOworCQlzZWxmLT5jb25uX3NrYiA9IE5VTEw7CisKKwkJaXJsbXBfc2VuZF9sY2ZfcGR1KHNlbGYtPmxhcCwgc2VsZi0+ZGxzYXBfc2VsLAorCQkJCSAgIHNlbGYtPnNsc2FwX3NlbCwgQ09OTkVDVF9DTUQsIHR4X3NrYik7CisJCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlybGFwX2RhdGFfcmVxdWVzdCgpLiAqLworCQlkZXZfa2ZyZWVfc2tiKHR4X3NrYik7CisKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfU0VUVVApOworCQlicmVhazsKKwljYXNlIExNX1dBVENIRE9HX1RJTUVPVVQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCkgOiBXQVRDSERPR19USU1FT1VUICFcbiIsICBfX0ZVTkNUSU9OX18pOworCisJCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkJaXJsbXBfZG9fbGFwX2V2ZW50KHNlbGYtPmxhcCwgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVCwgTlVMTCk7CisJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CisKKwkJaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExNX0NPTk5FQ1RfRkFJTFVSRSwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjogLyogTFNfRGlzY29ubmVjdC5pbmRpY2F0aW9uICovCisJCWRlbF90aW1lciggJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9ESVNDT05ORUNURUQpOworCisJCXJlYXNvbiA9IGlybG1wX2NvbnZlcnRfbGFwX3JlYXNvbihzZWxmLT5sYXAtPnJlYXNvbik7CisKKwkJaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIHJlYXNvbiwgTlVMTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJXMgb24gTFNBUCAlIzAyeFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdLCBzZWxmLT5zbHNhcF9zZWwpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybG1wX2ZyYW1lLmMgYi9uZXQvaXJkYS9pcmxtcF9mcmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxY2QyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmxtcF9mcmFtZS5jCkBAIC0wLDAgKzEsNDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlybG1wX2ZyYW1lLmMKKyAqIFZlcnNpb246ICAgICAgIDAuOQorICogRGVzY3JpcHRpb246ICAgSXJMTVAgZnJhbWUgaW1wbGVtZW50YXRpb24KKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFR1ZSBBdWcgMTkgMDI6MDk6NTkgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgTW9uIERlYyAxMyAxMzo0MToxMiAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcF9mcmFtZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2Rpc2NvdmVyeS5oPgorCitzdGF0aWMgc3RydWN0IGxzYXBfY2IgKmlybG1wX2ZpbmRfbHNhcChzdHJ1Y3QgbGFwX2NiICpzZWxmLCBfX3U4IGRsc2FwLCAKKwkJCQkgICAgICAgX191OCBzbHNhcCwgaW50IHN0YXR1cywgaGFzaGJpbl90ICopOworCitpbmxpbmUgdm9pZCBpcmxtcF9zZW5kX2RhdGFfcGR1KHN0cnVjdCBsYXBfY2IgKnNlbGYsIF9fdTggZGxzYXAsIF9fdTggc2xzYXAsCisJCQkJaW50IGV4cGVkaXRlZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2ItPmRhdGFbMF0gPSBkbHNhcDsKKwlza2ItPmRhdGFbMV0gPSBzbHNhcDsKKworCWlmIChleHBlZGl0ZWQpIHsKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgc2VuZGluZyBleHBlZGl0ZWQgZGF0YVxuIiwgX19GVU5DVElPTl9fKTsKKwkJaXJsYXBfZGF0YV9yZXF1ZXN0KHNlbGYtPmlybGFwLCBza2IsIFRSVUUpOworCX0gZWxzZQorCQlpcmxhcF9kYXRhX3JlcXVlc3Qoc2VsZi0+aXJsYXAsIHNrYiwgRkFMU0UpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfc2VuZF9sY2ZfcGR1IChkbHNhcCwgc2xzYXAsIG9wY29kZSxza2IpCisgKgorICogICAgU2VuZCBMaW5rIENvbnRyb2wgRnJhbWUgdG8gSXJMQVAKKyAqLwordm9pZCBpcmxtcF9zZW5kX2xjZl9wZHUoc3RydWN0IGxhcF9jYiAqc2VsZiwgX191OCBkbHNhcCwgX191OCBzbHNhcCwKKwkJCV9fdTggb3Bjb2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlfX3U4ICpmcmFtZTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisJCisJZnJhbWUgPSBza2ItPmRhdGE7CisJCisJZnJhbWVbMF0gPSBkbHNhcCB8IENPTlRST0xfQklUOworCWZyYW1lWzFdID0gc2xzYXA7CisKKwlmcmFtZVsyXSA9IG9wY29kZTsKKworCWlmIChvcGNvZGUgPT0gRElTQ09OTkVDVCkKKwkJZnJhbWVbM10gPSAweDAxOyAvKiBTZXJ2aWNlIHVzZXIgcmVxdWVzdCAqLworCWVsc2UKKwkJZnJhbWVbM10gPSAweDAwOyAvKiByc3ZkICovCisKKwlpcmxhcF9kYXRhX3JlcXVlc3Qoc2VsZi0+aXJsYXAsIHNrYiwgRkFMU0UpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfaW5wdXQgKHNrYikKKyAqCisgKiAgICBVc2VkIGJ5IElyTEFQIHRvIHBhc3MgcmVjZWl2ZWQgZGF0YSBmcmFtZXMgdG8gSXJMTVAgbGF5ZXIKKyAqCisgKi8KK3ZvaWQgaXJsbXBfbGlua19kYXRhX2luZGljYXRpb24oc3RydWN0IGxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCQkJaW50IHVucmVsaWFibGUpCit7CisJc3RydWN0IGxzYXBfY2IgKmxzYXA7CisJX191OCAgIHNsc2FwX3NlbDsgICAvKiBTb3VyY2UgKHRoaXMpIExTQVAgYWRkcmVzcyAqLworCV9fdTggICBkbHNhcF9zZWw7ICAgLyogRGVzdGluYXRpb24gTFNBUCBhZGRyZXNzICovCisJX191OCAgICpmcDsKKwkKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2ItPmxlbiA+IDIsIHJldHVybjspOworCisJZnAgPSBza2ItPmRhdGE7CisKKwkvKgorCSAqICBUaGUgbmV4dCBzdGF0ZW1lbnRzIG1heSBiZSBjb25mdXNpbmcsIGJ1dCB3ZSBkbyB0aGlzIHNvIHRoYXQgCisJICogIGRlc3RpbmF0aW9uIExTQVAgb2YgcmVjZWl2ZWQgZnJhbWUgaXMgc291cmNlIExTQVAgaW4gb3VyIHZpZXcKKwkgKi8KKwlzbHNhcF9zZWwgPSBmcFswXSAmIExTQVBfTUFTSzsgCisJZGxzYXBfc2VsID0gZnBbMV07CQorCisJLyoKKwkgKiAgQ2hlY2sgaWYgdGhpcyBpcyBhbiBpbmNvbWluZyBjb25uZWN0aW9uLCBzaW5jZSB3ZSBtdXN0IGRlYWwgd2l0aAorCSAqICBpdCBpbiBhIGRpZmZlcmVudCB3YXkgdGhhbiBvdGhlciBlc3RhYmxpc2hlZCBjb25uZWN0aW9ucy4KKwkgKi8KKwlpZiAoKGZwWzBdICYgQ09OVFJPTF9CSVQpICYmIChmcFsyXSA9PSBDT05ORUNUX0NNRCkpIHsKKwkJSVJEQV9ERUJVRygzLCAiJXMoKSwgaW5jb21pbmcgY29ubmVjdGlvbiwgIgorCQkJICAgInNvdXJjZSBMU0FQPSVkLCBkZXN0IExTQVA9JWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHNsc2FwX3NlbCwgZGxzYXBfc2VsKTsKKwkJCisJCS8qIFRyeSB0byBmaW5kIExTQVAgYW1vbmcgdGhlIHVuY29ubmVjdGVkIExTQVBzICovCisJCWxzYXAgPSBpcmxtcF9maW5kX2xzYXAoc2VsZiwgZGxzYXBfc2VsLCBzbHNhcF9zZWwsIENPTk5FQ1RfQ01ELAorCQkJCSAgICAgICBpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMpOworCQkKKwkJLyogTWF5YmUgTFNBUCB3YXMgYWxyZWFkeSBjb25uZWN0ZWQsIHNvIHRyeSBvbmUgbW9yZSB0aW1lICovCisJCWlmICghbHNhcCkgeworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgaW5jb21pbmcgY29ubmVjdGlvbiBmb3IgTFNBUCBhbHJlYWR5IGNvbm5lY3RlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWxzYXAgPSBpcmxtcF9maW5kX2xzYXAoc2VsZiwgZGxzYXBfc2VsLCBzbHNhcF9zZWwsIDAsCisJCQkJCSAgICAgICBzZWxmLT5sc2Fwcyk7CisJCX0KKwl9IGVsc2UKKwkJbHNhcCA9IGlybG1wX2ZpbmRfbHNhcChzZWxmLCBkbHNhcF9zZWwsIHNsc2FwX3NlbCwgMCwgCisJCQkJICAgICAgIHNlbGYtPmxzYXBzKTsKKwkKKwlpZiAobHNhcCA9PSBOVUxMKSB7CisJCUlSREFfREVCVUcoMiwgIklyTE1QLCBTb3JyeSwgbm8gTFNBUCBmb3IgcmVjZWl2ZWQgZnJhbWUhXG4iKTsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgc2xzYXBfc2VsID0gJTAyeCwgZGxzYXBfc2VsID0gJTAyeFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgc2xzYXBfc2VsLCBkbHNhcF9zZWwpOworCQlpZiAoZnBbMF0gJiBDT05UUk9MX0JJVCkgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgcmVjZWl2ZWQgY29udHJvbCBmcmFtZSAlMDJ4XG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXywgZnBbMl0pOworCQl9IGVsc2UgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgcmVjZWl2ZWQgZGF0YSBmcmFtZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogCisJICogIENoZWNrIGlmIHdlIHJlY2VpdmVkIGEgY29udHJvbCBmcmFtZT8gCisJICovCisJaWYgKGZwWzBdICYgQ09OVFJPTF9CSVQpIHsKKwkJc3dpdGNoIChmcFsyXSkgeworCQljYXNlIENPTk5FQ1RfQ01EOgorCQkJbHNhcC0+bGFwID0gc2VsZjsKKwkJCWlybG1wX2RvX2xzYXBfZXZlbnQobHNhcCwgTE1fQ09OTkVDVF9JTkRJQ0FUSU9OLCBza2IpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OTkVDVF9DTkY6CisJCQlpcmxtcF9kb19sc2FwX2V2ZW50KGxzYXAsIExNX0NPTk5FQ1RfQ09ORklSTSwgc2tiKTsKKwkJCWJyZWFrOworCQljYXNlIERJU0NPTk5FQ1Q6CisJCQlJUkRBX0RFQlVHKDQsICIlcygpLCBEaXNjb25uZWN0IGluZGljYXRpb24hXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlpcmxtcF9kb19sc2FwX2V2ZW50KGxzYXAsIExNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiwgCisJCQkJCSAgICBza2IpOworCQkJYnJlYWs7CisJCWNhc2UgQUNDRVNTTU9ERV9DTUQ6CisJCQlJUkRBX0RFQlVHKDAsICJBY2Nlc3MgbW9kZSBjbWQgbm90IGltcGxlbWVudGVkIVxuIik7CisJCQlicmVhazsKKwkJY2FzZSBBQ0NFU1NNT0RFX0NORjoKKwkJCUlSREFfREVCVUcoMCwgIkFjY2VzcyBtb2RlIGNuZiBub3QgaW1wbGVtZW50ZWQhXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBjb250cm9sIGZyYW1lICUwMnhcbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBmcFsyXSk7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAodW5yZWxpYWJsZSkgeworCQkvKiBPcHRpbWl6ZSBhbmQgYnlwYXNzIHRoZSBzdGF0ZSBtYWNoaW5lIGlmIHBvc3NpYmxlICovCisJCWlmIChsc2FwLT5sc2FwX3N0YXRlID09IExTQVBfREFUQV9UUkFOU0ZFUl9SRUFEWSkKKwkJCWlybG1wX3VkYXRhX2luZGljYXRpb24obHNhcCwgc2tiKTsKKwkJZWxzZQorCQkJaXJsbXBfZG9fbHNhcF9ldmVudChsc2FwLCBMTV9VREFUQV9JTkRJQ0FUSU9OLCBza2IpOworCX0gZWxzZSB7CQorCQkvKiBPcHRpbWl6ZSBhbmQgYnlwYXNzIHRoZSBzdGF0ZSBtYWNoaW5lIGlmIHBvc3NpYmxlICovCisJCWlmIChsc2FwLT5sc2FwX3N0YXRlID09IExTQVBfREFUQV9UUkFOU0ZFUl9SRUFEWSkKKwkJCWlybG1wX2RhdGFfaW5kaWNhdGlvbihsc2FwLCBza2IpOworCQllbHNlCisJCQlpcmxtcF9kb19sc2FwX2V2ZW50KGxzYXAsIExNX0RBVEFfSU5ESUNBVElPTiwgc2tiKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9saW5rX3VuaXRkYXRhX2luZGljYXRpb24gKHNlbGYsIHNrYikKKyAqCisgKiAgICAKKyAqCisgKi8KKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQordm9pZCBpcmxtcF9saW5rX3VuaXRkYXRhX2luZGljYXRpb24oc3RydWN0IGxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKKwlfX3U4ICAgc2xzYXBfc2VsOyAgIC8qIFNvdXJjZSAodGhpcykgTFNBUCBhZGRyZXNzICovCisJX191OCAgIGRsc2FwX3NlbDsgICAvKiBEZXN0aW5hdGlvbiBMU0FQIGFkZHJlc3MgKi8KKwlfX3U4ICAgcGlkOyAgICAgICAgIC8qIFByb3RvY29sIGlkZW50aWZpZXIgKi8KKwlfX3U4ICAgKmZwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiLT5sZW4gPiAyLCByZXR1cm47KTsKKworCWZwID0gc2tiLT5kYXRhOworCisJLyoKKwkgKiAgVGhlIG5leHQgc3RhdGVtZW50cyBtYXkgYmUgY29uZnVzaW5nLCBidXQgd2UgZG8gdGhpcyBzbyB0aGF0IAorCSAqICBkZXN0aW5hdGlvbiBMU0FQIG9mIHJlY2VpdmVkIGZyYW1lIGlzIHNvdXJjZSBMU0FQIGluIG91ciB2aWV3CisJICovCisJc2xzYXBfc2VsID0gZnBbMF0gJiBMU0FQX01BU0s7IAorCWRsc2FwX3NlbCA9IGZwWzFdOworCXBpZCAgICAgICA9IGZwWzJdOworCQorCWlmIChwaWQgJiAweDgwKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGV4dGVuc2lvbiBpbiBQSUQgbm90IHN1cHAhXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIGlmIGZyYW1lIGlzIGFkZHJlc3NlZCB0byB0aGUgY29ubmVjdGlvbmxlc3MgTFNBUCAqLworCWlmICgoc2xzYXBfc2VsICE9IExTQVBfQ09OTkxFU1MpIHx8IChkbHNhcF9zZWwgIT0gTFNBUF9DT05OTEVTUykpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZHJvcHBpbmcgZnJhbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCQorCS8qIFNlYXJjaCB0aGUgY29ubmVjdGlvbmxlc3MgTFNBUCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJbHNhcCA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdChpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMpOworCXdoaWxlIChsc2FwICE9IE5VTEwpIHsKKwkJLyoKKwkJICogIENoZWNrIGlmIHNvdXJjZSBMU0FQIGFuZCBkZXN0IExTQVAgc2VsZWN0b3JzIGFuZCBQSUQgbWF0Y2guCisJCSAqLworCQlpZiAoKGxzYXAtPnNsc2FwX3NlbCA9PSBzbHNhcF9zZWwpICYmIAorCQkgICAgKGxzYXAtPmRsc2FwX3NlbCA9PSBkbHNhcF9zZWwpICYmIAorCQkgICAgKGxzYXAtPnBpZCA9PSBwaWQpKSAKKwkJewkJCQorCQkJYnJlYWs7CisJCX0KKwkJbHNhcCA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9uZXh0KGlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKworCWlmIChsc2FwKQorCQlpcmxtcF9jb25ubGVzc19kYXRhX2luZGljYXRpb24obHNhcCwgc2tiKTsKKwllbHNlIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZm91bmQgbm8gbWF0Y2hpbmcgTFNBUCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9saW5rX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAocmVhc29uLCB1c2VyZGF0YSkKKyAqCisgKiAgICBJckxBUCBoYXMgZGlzY29ubmVjdGVkIAorICoKKyAqLwordm9pZCBpcmxtcF9saW5rX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzdHJ1Y3QgbGFwX2NiICpsYXAsIAorCQkJCSAgICAgIHN0cnVjdCBpcmxhcF9jYiAqaXJsYXAsIAorCQkJCSAgICAgIExBUF9SRUFTT04gcmVhc29uLCAKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChsYXAgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQobGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKKworCWxhcC0+cmVhc29uID0gcmVhc29uOworCWxhcC0+ZGFkZHIgPSBERVZfQUREUl9BTlk7CisKKyAgICAgICAgLyogRklYTUU6IG11c3QgZG8gc29tZXRoaW5nIHdpdGggdGhlIHNrYiBpZiBhbnkgKi8KKwkKKwkvKgorCSAqICBJbmZvcm0gc3RhdGlvbiBzdGF0ZSBtYWNoaW5lCisJICovCisJaXJsbXBfZG9fbGFwX2V2ZW50KGxhcCwgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiwgTlVMTCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9saW5rX2Nvbm5lY3RfaW5kaWNhdGlvbiAocW9zKQorICoKKyAqICAgIEluY29taW5nIExBUCBjb25uZWN0aW9uIQorICoKKyAqLwordm9pZCBpcmxtcF9saW5rX2Nvbm5lY3RfaW5kaWNhdGlvbihzdHJ1Y3QgbGFwX2NiICpzZWxmLCBfX3UzMiBzYWRkciwgCisJCQkJICAgX191MzIgZGFkZHIsIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBDb3B5IFFvUyBzZXR0aW5ncyBmb3IgdGhpcyBzZXNzaW9uICovCisJc2VsZi0+cW9zID0gcW9zOworCisJLyogVXBkYXRlIGRlc3RpbmF0aW9uIGRldmljZSBhZGRyZXNzICovCisJc2VsZi0+ZGFkZHIgPSBkYWRkcjsKKwlJUkRBX0FTU0VSVChzZWxmLT5zYWRkciA9PSBzYWRkciwgcmV0dXJuOyk7CisKKwlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZiwgTE1fTEFQX0NPTk5FQ1RfSU5ESUNBVElPTiwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfY29ubmVjdF9jb25maXJtIChxb3MpCisgKgorICogICAgTEFQIGNvbm5lY3Rpb24gY29uZmlybWVkIQorICoKKyAqLwordm9pZCBpcmxtcF9saW5rX2Nvbm5lY3RfY29uZmlybShzdHJ1Y3QgbGFwX2NiICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChxb3MgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwkvKiBEb24ndCBuZWVkIHVzZSB0aGUgc2tiIGZvciBub3cgKi8KKworCS8qIENvcHkgUW9TIHNldHRpbmdzIGZvciB0aGlzIHNlc3Npb24gKi8KKwlzZWxmLT5xb3MgPSBxb3M7CisKKwlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZiwgTE1fTEFQX0NPTk5FQ1RfQ09ORklSTSwgTlVMTCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9saW5rX2Rpc2NvdmVyeV9pbmRpY2F0aW9uIChzZWxmLCBsb2cpCisgKgorICogICAgRGV2aWNlIGlzIGRpc2NvdmVyaW5nIHVzCisgKgorICogSXQncyBub3QgYW4gYW5zd2VyIHRvIG91ciBvd24gZGlzY292ZXJpZXMsIGp1c3QgYW5vdGhlciBkZXZpY2UgdHJ5aW5nCisgKiB0byBwZXJmb3JtIGRpc2NvdmVyeSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gbWlzcyB0aGUgb3Bwb3J0dW5pdHkKKyAqIHRvIGV4cGxvaXQgdGhpcyBpbmZvcm1hdGlvbiwgYmVjYXVzZSA6CisgKglvIFdlIG1heSBub3QgYWN0aXZlbHkgcGVyZm9ybSBkaXNjb3ZlcnkgKGp1c3QgcGFzc2l2ZSBkaXNjb3ZlcnkpCisgKglvIFRoaXMgdHlwZSBvZiBkaXNjb3ZlcnkgaXMgbXVjaCBtb3JlIHJlbGlhYmxlLiBJbiBzb21lIGNhc2VzLCBpdAorICoJICBzZWVtIHRoYXQgbGVzcyB0aGFuIDUwJSBvZiBvdXIgZGlzY292ZXJpZXMgZ2V0IGFuIGFuc3dlciwgd2hpbGUKKyAqCSAgd2UgYWx3YXlzIGdldCB+MTAwJSBvZiB0aGVzZS4KKyAqCW8gTWFrZSBmYXN0ZXIgZGlzY292ZXJ5LCBzdGF0aXN0aWNhbGx5IGRpdmlkZSB0aW1lIG9mIGRpc2NvdmVyeQorICoJICBldmVudHMgYnkgMiAoaW1wb3J0YW50IGZvciB0aGUgbGF0ZW5jeSBhc3BlY3QgYW5kIHVzZXIgZmVlbCkKKyAqCW8gRXZlbiBpcyB3ZSBkbyBhY3RpdmUgZGlzY292ZXJ5LCB0aGUgb3RoZXIgbm9kZSBtaWdodCBub3QKKyAqCSAgYW5zd2VyIG91ciBkaXNjb3ZlcmllcyAoZXg6IFBhbG0pLiBUaGUgUGFsbSB3aWxsIGp1c3QgcGVyZm9ybQorICoJICBvbmUgYWN0aXZlIGRpc2NvdmVyeSBhbmQgY29ubmVjdCBkaXJlY3RseSB0byB1cy4KKyAqCisgKiBIb3dldmVyLCB3aGVuIGJvdGggZGV2aWNlcyBkaXNjb3ZlciBlYWNoIG90aGVyLCB0aGV5IG1pZ2h0IGF0dGVtcHQgdG8KKyAqIGNvbm5lY3QgdG8gZWFjaCBvdGhlciBmb2xsb3dpbmcgdGhlIGRpc2NvdmVyeSBldmVudCwgYW5kIGl0IHdvdWxkIGNyZWF0ZQorICogY29sbGlzaW9ucyBvbiB0aGUgbWVkaXVtIChTTlJNIGJhdHRsZSkuCisgKiBUaGUgImZpeCIgZm9yIHRoYXQgaXMgdG8gZGlzYWJsZSBhbGwgY29ubmVjdGlvbiByZXF1ZXN0cyBpbiBJckxBUAorICogZm9yIDEwMG1zIGFmdGVyIGEgZGlzY292ZXJ5IGluZGljYXRpb24gYnkgc2V0dGluZyB0aGUgbWVkaWFfYnVzeSBmbGFnLgorICogUHJldmlvdXNseSwgd2UgdXNlZCB0byBwb3N0cG9uZSB0aGUgZXZlbnQgd2hpY2ggd2FzIHF1aXRlIHVnbHkuIE5vdworICogdGhhdCBJckxBUCB0YWtlcyBjYXJlIG9mIHRoaXMgcHJvYmxlbSwganVzdCBwYXNzIHRoZSBldmVudCB1cC4uLgorICoKKyAqIEplYW4gSUkKKyAqLwordm9pZCBpcmxtcF9saW5rX2Rpc2NvdmVyeV9pbmRpY2F0aW9uKHN0cnVjdCBsYXBfY2IgKnNlbGYsIAorCQkJCSAgICAgZGlzY292ZXJ5X3QgKmRpc2NvdmVyeSkKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOworCisJLyogQWRkIHRvIG1haW4gbG9nLCBjbGVhbnVwICovCisJaXJsbXBfYWRkX2Rpc2NvdmVyeShpcmxtcC0+Y2FjaGVsb2csIGRpc2NvdmVyeSk7CisJCisJLyogSnVzdCBoYW5kbGUgaXQgdGhlIHNhbWUgd2F5IGFzIGEgZGlzY292ZXJ5IGNvbmZpcm0sCisJICogYnlwYXNzIHRoZSBMTV9MQVAgc3RhdGUgbWFjaGluZSAoc2VlIGJlbG93KSAqLworCWlybG1wX2Rpc2NvdmVyeV9jb25maXJtKGlybG1wLT5jYWNoZWxvZywgRElTQ09WRVJZX1BBU1NJVkUpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfbGlua19kaXNjb3ZlcnlfY29uZmlybSAoc2VsZiwgbG9nKQorICoKKyAqICAgIENhbGxlZCBieSBJckxBUCB3aXRoIGEgbGlzdCBvZiBkaXNjb3ZlcmllcyBhZnRlciB0aGUgZGlzY292ZXJ5CisgKiAgICByZXF1ZXN0IGhhcyBiZWVuIGNhcnJpZWQgb3V0LiBBIE5VTEwgbG9nIGlzIHJlY2VpdmVkIGlmIElyTEFQCisgKiAgICB3YXMgdW5hYmxlIHRvIGNhcnJ5IG91dCB0aGUgZGlzY292ZXJ5IHJlcXVlc3QKKyAqCisgKi8KK3ZvaWQgaXJsbXBfbGlua19kaXNjb3ZlcnlfY29uZmlybShzdHJ1Y3QgbGFwX2NiICpzZWxmLCBoYXNoYmluX3QgKmxvZykKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKKwkKKwkvKiBBZGQgdG8gbWFpbiBsb2csIGNsZWFudXAgKi8KKwlpcmxtcF9hZGRfZGlzY292ZXJ5X2xvZyhpcmxtcC0+Y2FjaGVsb2csIGxvZyk7CisKKwkvKiBQcm9wYWdhdGUgZXZlbnQgdG8gdmFyaW91cyBMU0FQcyByZWdpc3RlcmVkIGZvciBpdC4KKwkgKiBXZSBieXBhc3MgdGhlIExNX0xBUCBzdGF0ZSBtYWNoaW5lIGJlY2F1c2UKKwkgKgkxKSBXZSBkbyBpdCByZWdhcmRsZXNzIG9mIHRoZSBMTV9MQVAgc3RhdGUKKwkgKgkyKSBJdCBkb2Vzbid0IGFmZmVjdCB0aGUgTE1fTEFQIHN0YXRlCisJICoJMykgRmFzdGVyLCBzbGltZXIsIHNpbXBsZXIsIC4uLgorCSAqIEplYW4gSUkgKi8KKwlpcmxtcF9kaXNjb3ZlcnlfY29uZmlybShpcmxtcC0+Y2FjaGVsb2csIERJU0NPVkVSWV9BQ1RJVkUpOworfQorCisjaWZkZWYgQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQCitzdGF0aWMgaW5saW5lIHZvaWQgaXJsbXBfdXBkYXRlX2NhY2hlKHN0cnVjdCBsYXBfY2IgKmxhcCwKKwkJCQkgICAgICBzdHJ1Y3QgbHNhcF9jYiAqbHNhcCkKK3sKKwkvKiBQcmV2ZW50IGNvbmN1cnJlbnQgcmVhZCB0byBnZXQgZ2FyYmFnZSAqLworCWxhcC0+Y2FjaGUudmFsaWQgPSBGQUxTRTsKKwkvKiBVcGRhdGUgY2FjaGUgZW50cnkgKi8KKwlsYXAtPmNhY2hlLmRsc2FwX3NlbCA9IGxzYXAtPmRsc2FwX3NlbDsKKwlsYXAtPmNhY2hlLnNsc2FwX3NlbCA9IGxzYXAtPnNsc2FwX3NlbDsKKwlsYXAtPmNhY2hlLmxzYXAgPSBsc2FwOworCWxhcC0+Y2FjaGUudmFsaWQgPSBUUlVFOworfQorI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9maW5kX2hhbmRsZSAoc2VsZiwgZGxzYXBfc2VsLCBzbHNhcF9zZWwsIHN0YXR1cywgcXVldWUpCisgKgorICogICAgRmluZCBoYW5kbGUgYXNzb2NpYXRlZCB3aXRoIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2UgTFNBUAorICoKKyAqIEFueSBJckRBIGNvbm5lY3Rpb24gKExTQVAvVFNBUCkgaXMgdW5pcXVlbHkgaWRlbnRpZmllZCBieQorICogMyBwYXJhbWV0ZXJzLCB0aGUgbG9jYWwgbHNhcCwgdGhlIHJlbW90ZSBsc2FwIGFuZCB0aGUgcmVtb3RlIGFkZHJlc3MuIAorICogV2UgbWF5IGluaXRpYXRlIG11bHRpcGxlIGNvbm5lY3Rpb25zIHRvIHRoZSBzYW1lIHJlbW90ZSBzZXJ2aWNlCisgKiAodGhleSB3aWxsIGhhdmUgZGlmZmVyZW50IGxvY2FsIGxzYXApLCBhIHJlbW90ZSBkZXZpY2UgbWF5IGluaXRpYXRlCisgKiBtdWx0aXBsZSBjb25uZWN0aW9ucyB0byB0aGUgc2FtZSBsb2NhbCBzZXJ2aWNlICh0aGV5IHdpbGwgaGF2ZQorICogZGlmZmVyZW50IHJlbW90ZSBsc2FwKSwgb3IgbXVsdGlwbGUgZGV2aWNlcyBtYXkgY29ubmVjdCB0byB0aGUgc2FtZQorICogc2VydmljZSBhbmQgbWF5IHVzZSB0aGUgc2FtZSByZW1vdGUgbHNhcCAoYW5kIHRoZXkgd2lsbCBoYXZlCisgKiBkaWZmZXJlbnQgcmVtb3RlIGFkZHJlc3MpLgorICogU28sIHdoZXJlIGlzIHRoZSByZW1vdGUgYWRkcmVzcyA/IEVhY2ggTEFQIGNvbm5lY3Rpb24gaXMgbWFkZSB3aXRoCisgKiBhIHNpbmdsZSByZW1vdGUgZGV2aWNlLCBzbyBpbXBseSBhIHNwZWNpZmljIHJlbW90ZSBhZGRyZXNzLgorICogSmVhbiBJSQorICovCitzdGF0aWMgc3RydWN0IGxzYXBfY2IgKmlybG1wX2ZpbmRfbHNhcChzdHJ1Y3QgbGFwX2NiICpzZWxmLCBfX3U4IGRsc2FwX3NlbCwKKwkJCQkgICAgICAgX191OCBzbHNhcF9zZWwsIGludCBzdGF0dXMsCisJCQkJICAgICAgIGhhc2hiaW5fdCAqcXVldWUpIAoreworCXN0cnVjdCBsc2FwX2NiICpsc2FwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJLyogCisJICogIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2UuIFdlIGFzc3VtZSB0aGF0IHRoZSBsYXN0IGZyYW1lCisJICogIHJlY2VpdmVkIGlzIGluIHRoZSBzYW1lIGNvbm5lY3Rpb24gYXMgdGhlIGxhc3Qgb25lLCBzbyBjaGVjayBpbgorCSAqICBjYWNoZSBmaXJzdCB0byBhdm9pZCB0aGUgbGluZWFyIHNlYXJjaAorCSAqLworI2lmZGVmIENPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUAorCWlmICgoc2VsZi0+Y2FjaGUudmFsaWQpICYmIAorCSAgICAoc2VsZi0+Y2FjaGUuc2xzYXBfc2VsID09IHNsc2FwX3NlbCkgJiYgCisJICAgIChzZWxmLT5jYWNoZS5kbHNhcF9zZWwgPT0gZGxzYXBfc2VsKSkgCisJeworCQlyZXR1cm4gKHNlbGYtPmNhY2hlLmxzYXApOworCX0KKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJbHNhcCA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdChxdWV1ZSk7CisJd2hpbGUgKGxzYXAgIT0gTlVMTCkgeworCQkvKiAKKwkJICogIElmIHRoaXMgaXMgYW4gaW5jb21pbmcgY29ubmVjdGlvbiwgdGhlbiB0aGUgZGVzdGluYXRpb24gCisJCSAqICBMU0FQIHNlbGVjdG9yIG1heSBoYXZlIGJlZW4gc3BlY2lmaWVkIGFzIExNX0FOWSBzbyB0aGF0IAorCQkgKiAgYW55IGNsaWVudCBjYW4gY29ubmVjdC4gSW4gdGhhdCBjYXNlIHdlIG9ubHkgbmVlZCB0byBjaGVjaworCQkgKiAgaWYgdGhlIHNvdXJjZSBMU0FQIChpbiBvdXIgdmlldyEpIG1hdGNoIQorCQkgKi8KKwkJaWYgKChzdGF0dXMgPT0gQ09OTkVDVF9DTUQpICYmIAorCQkgICAgKGxzYXAtPnNsc2FwX3NlbCA9PSBzbHNhcF9zZWwpICYmICAgICAgCisJCSAgICAobHNhcC0+ZGxzYXBfc2VsID09IExTQVBfQU5ZKSkgeworCQkJLyogVGhpcyBpcyB3aGVyZSB0aGUgZGVzdCBsc2FwIHNlbCBpcyBzZXQgb24gaW5jb21pbmcKKwkJCSAqIGxzYXBzICovCisJCQlsc2FwLT5kbHNhcF9zZWwgPSBkbHNhcF9zZWw7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiAgQ2hlY2sgaWYgc291cmNlIExTQVAgYW5kIGRlc3QgTFNBUCBzZWxlY3RvcnMgbWF0Y2guCisJCSAqLworCQlpZiAoKGxzYXAtPnNsc2FwX3NlbCA9PSBzbHNhcF9zZWwpICYmIAorCQkgICAgKGxzYXAtPmRsc2FwX3NlbCA9PSBkbHNhcF9zZWwpKSAKKwkJCWJyZWFrOworCisJCWxzYXAgPSAoc3RydWN0IGxzYXBfY2IgKikgaGFzaGJpbl9nZXRfbmV4dChxdWV1ZSk7CisJfQorI2lmZGVmIENPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUAorCWlmKGxzYXApCisJCWlybG1wX3VwZGF0ZV9jYWNoZShzZWxmLCBsc2FwKTsKKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJLyogUmV0dXJuIHdoYXQgd2UndmUgZm91bmQgb3IgTlVMTCAqLworCXJldHVybiBsc2FwOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJtb2QuYyBiL25ldC9pcmRhL2lybW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmYWVkNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybW9kLmMKQEAgLTAsMCArMSwxODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJtb2QuYworICogVmVyc2lvbjogICAgICAgMC45CisgKiBEZXNjcmlwdGlvbjogICBJckRBIHN0YWNrIG1haW4gZW50cnkgcG9pbnRzCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBNb24gRGVjIDE1IDEzOjU1OjM5IDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFdlZCBKYW4gIDUgMTU6MTI6NDEgMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk5LTIwMDAgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gZW50cnkgcG9pbnRzIG9mIHRoZSBJckRBIHN0YWNrLgorICogVGhleSBhcmUgaW4gdGhpcyBmaWxlIGFuZCBub3QgYWZfaXJkYS5jIGJlY2F1c2Ugc29tZSBkZXZlbG9wcGVycworICogYXJlIHVzaW5nIHRoZSBJckRBIHN0YWNrIHdpdGhvdXQgdGhlIHNvY2tldCBBUEkgKGNvbXBpbGluZyBvdXQKKyAqIGFmX2lyZGEuYykuCisgKiBKZWFuIElJCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4JCS8qIG5vdGlmeV90ICovCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4JCS8qIGlybGFwX2luaXQgKi8KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgkJLyogaXJsbXBfaW5pdCAqLworI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CQkvKiBpcmlhcF9pbml0ICovCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4JCS8qIGlydHRwX2luaXQgKi8KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgkvKiBpcmRhX2RldmljZV9pbml0ICovCisKKy8qIGlycHJvYy5jICovCitleHRlcm4gdm9pZCBpcmRhX3Byb2NfcmVnaXN0ZXIodm9pZCk7CitleHRlcm4gdm9pZCBpcmRhX3Byb2NfdW5yZWdpc3Rlcih2b2lkKTsKKy8qIGlyc3lzY3RsLmMgKi8KK2V4dGVybiBpbnQgIGlyZGFfc3lzY3RsX3JlZ2lzdGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgaXJkYV9zeXNjdGxfdW5yZWdpc3Rlcih2b2lkKTsKKy8qIGFmX2lyZGEuYyAqLworZXh0ZXJuIGludCAgaXJzb2NrX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpcnNvY2tfY2xlYW51cCh2b2lkKTsKKy8qIGlybGFwX2ZyYW1lLmMgKi8KK2V4dGVybiBpbnQgIGlybGFwX2RyaXZlcl9yY3Yoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKiwgCisJCQkgICAgIHN0cnVjdCBwYWNrZXRfdHlwZSAqKTsKKworLyoKKyAqIE1vZHVsZSBwYXJhbWV0ZXJzCisgKi8KKyNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRwordW5zaWduZWQgaW50IGlyZGFfZGVidWcgPSBJUkRBX0RFQlVHX0xFVkVMOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBpcmRhX2RlYnVnLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJJUkRBIGRlYnVnZ2luZyBsZXZlbCIpOworRVhQT1JUX1NZTUJPTChpcmRhX2RlYnVnKTsKKyNlbmRpZgorCisvKiBQYWNrZXQgdHlwZSBoYW5kbGVyLgorICogVGVsbCB0aGUga2VybmVsIGhvdyBJckRBIHBhY2tldHMgc2hvdWxkIGJlIGhhbmRsZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgaXJkYV9wYWNrZXRfdHlwZSA9IHsKKwkudHlwZQk9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVJEQSksCisJLmZ1bmMJPSBpcmxhcF9kcml2ZXJfcmN2LAkvKiBQYWNrZXQgdHlwZSBoYW5kbGVyIGlybGFwX2ZyYW1lLmMgKi8KK307CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX25vdGlmeV9pbml0IChub3RpZnkpCisgKgorICogICAgVXNlZCBmb3IgaW5pdGlhbGl6aW5nIHRoZSBub3RpZnkgc3RydWN0dXJlCisgKgorICovCit2b2lkIGlyZGFfbm90aWZ5X2luaXQobm90aWZ5X3QgKm5vdGlmeSkKK3sKKwlub3RpZnktPmRhdGFfaW5kaWNhdGlvbiA9IE5VTEw7CisJbm90aWZ5LT51ZGF0YV9pbmRpY2F0aW9uID0gTlVMTDsKKwlub3RpZnktPmNvbm5lY3RfY29uZmlybSA9IE5VTEw7CisJbm90aWZ5LT5jb25uZWN0X2luZGljYXRpb24gPSBOVUxMOworCW5vdGlmeS0+ZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gTlVMTDsKKwlub3RpZnktPmZsb3dfaW5kaWNhdGlvbiA9IE5VTEw7CisJbm90aWZ5LT5zdGF0dXNfaW5kaWNhdGlvbiA9IE5VTEw7CisJbm90aWZ5LT5pbnN0YW5jZSA9IE5VTEw7CisJc3RybGNweShub3RpZnktPm5hbWUsICJVbmtub3duIiwgc2l6ZW9mKG5vdGlmeS0+bmFtZSkpOworfQorRVhQT1JUX1NZTUJPTChpcmRhX25vdGlmeV9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfaW5pdCAodm9pZCkKKyAqCisgKiAgUHJvdG9jb2wgc3RhY2sgaW5pdGlhbGlzYXRpb24gZW50cnkgcG9pbnQuCisgKiAgSW5pdGlhbGlzZSB0aGUgdmFyaW91cyBjb21wb25lbnRzIG9mIHRoZSBJckRBIHN0YWNrCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGlyZGFfaW5pdCh2b2lkKQoreworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBMb3dlciBsYXllciBvZiB0aGUgc3RhY2sgKi8KKyAJaXJsbXBfaW5pdCgpOworCWlybGFwX2luaXQoKTsKKwkKKwkvKiBIaWdoZXIgbGF5ZXJzIG9mIHRoZSBzdGFjayAqLworCWlyaWFwX2luaXQoKTsKKyAJaXJ0dHBfaW5pdCgpOworCWlyc29ja19pbml0KCk7CisJCisJLyogQWRkIElyREEgcGFja2V0IHR5cGUgKFN0YXJ0IHJlY2VpdmluZyBwYWNrZXRzKSAqLworICAgICAgICBkZXZfYWRkX3BhY2soJmlyZGFfcGFja2V0X3R5cGUpOworCisJLyogRXh0ZXJuYWwgQVBJcyAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJaXJkYV9wcm9jX3JlZ2lzdGVyKCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJaXJkYV9zeXNjdGxfcmVnaXN0ZXIoKTsKKyNlbmRpZgorCisJLyogRHJpdmVyL2RvbmdsZSBzdXBwb3J0ICovCisgCWlyZGFfZGV2aWNlX2luaXQoKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9jbGVhbnVwICh2b2lkKQorICoKKyAqICBQcm90b2NvbCBzdGFjayBjbGVhbnVwL3JlbW92YWwgZW50cnkgcG9pbnQuCisgKiAgQ2xlYW51cCB0aGUgdmFyaW91cyBjb21wb25lbnRzIG9mIHRoZSBJckRBIHN0YWNrCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBpcmRhX2NsZWFudXAodm9pZCkKK3sKKwkvKiBSZW1vdmUgRXh0ZXJuYWwgQVBJcyAqLworI2lmZGVmIENPTkZJR19TWVNDVEwKKwlpcmRhX3N5c2N0bF91bnJlZ2lzdGVyKCk7CisjZW5kaWYJCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlpcmRhX3Byb2NfdW5yZWdpc3RlcigpOworI2VuZGlmCisKKwkvKiBSZW1vdmUgSXJEQSBwYWNrZXQgdHlwZSAoc3RvcCByZWNlaXZpbmcgcGFja2V0cykgKi8KKyAgICAgICAgZGV2X3JlbW92ZV9wYWNrKCZpcmRhX3BhY2tldF90eXBlKTsKKwkKKwkvKiBSZW1vdmUgaGlnaGVyIGxheWVycyAqLworCWlyc29ja19jbGVhbnVwKCk7CisJaXJ0dHBfY2xlYW51cCgpOworCWlyaWFwX2NsZWFudXAoKTsKKworCS8qIFJlbW92ZSBsb3dlciBsYXllcnMgKi8KKwlpcmRhX2RldmljZV9jbGVhbnVwKCk7CisJaXJsYXBfY2xlYW51cCgpOyAvKiBNdXN0IGJlIGRvbmUgYmVmb3JlIGlybG1wX2NsZWFudXAoKSEgREIgKi8KKworCS8qIFJlbW92ZSBtaWRkbGUgbGF5ZXIgKi8KKwlpcmxtcF9jbGVhbnVwKCk7Cit9CisKKy8qCisgKiBUaGUgSXJEQSBzdGFjayBtdXN0IGJlIGluaXRpYWxpc2VkICpiZWZvcmUqIGRyaXZlcnMgZ2V0IGluaXRpYWxpc2VkLAorICogYW5kICpiZWZvcmUqIGhpZ2hlciBwcm90b2NvbHMgKElyTEFOL0lyQ09NTS9Jck5FVCkgZ2V0IGluaXRpYWxpc2VkLAorICogb3RoZXJ3aXNlIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4gKGhhc2hiaW5zIHdpbGwgYmUgTlVMTCBmb3IgZXhhbXBsZSkuCisgKiBUaG9zZSBtb2R1bGVzIGFyZSBhdCBtb2R1bGVfaW5pdCgpL2RldmljZV9pbml0Y2FsbCgpIGxldmVsLgorICoKKyAqIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBuZWVkcyB0byBiZSBpbml0aWFsaXNlZCAqYWZ0ZXIqIHRoZSBiYXNpYworICogbmV0d29ya2luZywgdGhlIC9wcm9jL25ldCBmaWxlc3lzdGVtIGFuZCBzeXNjdGwgbW9kdWxlLiBUaG9zZSBhcmUKKyAqIGN1cnJlbnRseSBpbml0aWFsaXNlZCBpbiAuLi4vaW5pdC9tYWluLmMgKGJlZm9yZSBpbml0Y2FsbHMpLgorICogQWxzbywgSXJEQSBkcml2ZXJzIG5lZWRzIHRvIGJlIGluaXRpYWxpc2VkICphZnRlciogdGhlIHJhbmRvbSBudW1iZXIKKyAqIGdlbmVyYXRvciAobWFpbiBzdGFjayBhbmQgaGlnaGVyIGxheWVyIGluaXQgZG9uJ3QgbmVlZCBpdCBhbnltb3JlKS4KKyAqCisgKiBKZWFuIElJCisgKi8KK3N1YnN5c19pbml0Y2FsbChpcmRhX2luaXQpOworbW9kdWxlX2V4aXQoaXJkYV9jbGVhbnVwKTsKKyAKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4gJiBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRoZSBMaW51eCBJckRBIFByb3RvY29sIFN0YWNrIik7IAorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX05FVFBST1RPKFBGX0lSREEpOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJuZXQvS2NvbmZpZyBiL25ldC9pcmRhL2lybmV0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjNTU3ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybmV0L0tjb25maWcKQEAgLTAsMCArMSwxMyBAQAorY29uZmlnIElSTkVUCisJdHJpc3RhdGUgIklyTkVUIHByb3RvY29sIgorCWRlcGVuZHMgb24gSVJEQSAmJiBQUFAKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBJck5FVCBwcm90b2NvbC4KKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGlybmV0LiAgSXJORVQgaXMgYSBQUFAgZHJpdmVyLCBzbyB5b3Ugd2lsbCBhbHNvIG5lZWQgYQorCSAgd29ya2luZyBQUFAgc3Vic3lzdGVtIChkcml2ZXIsIGRhZW1vbiBhbmQgY29uZmlnKS4uLgorCisJICBJck5FVCBpcyBhbiBhbHRlcm5hdGUgd2F5IHRvIHRyYW5zZmVyIFRDUC9JUCB0cmFmZmljIG92ZXIgSXJEQS4gIEl0CisJICB1c2VzIHN5bmNocm9ub3VzIFBQUCBvdmVyIGEgc2V0IG9mIHBvaW50IHRvIHBvaW50IElyREEgc29ja2V0cy4gIFlvdQorCSAgY2FuIHVzZSBpdCBiZXR3ZWVuIExpbnV4IG1hY2hpbmUgb3Igd2l0aCBXMmsuCisKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybmV0L01ha2VmaWxlIGIvbmV0L2lyZGEvaXJuZXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlZTAxZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybmV0L01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IElyREEgSXJORVQgcHJvdG9jb2wgbGF5ZXIuCisjCisKK29iai0kKENPTkZJR19JUk5FVCkgKz0gaXJuZXQubworCitpcm5ldC1vYmpzIDo9IGlybmV0X3BwcC5vIGlybmV0X2lyZGEubwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJuZXQvaXJuZXQuaCBiL25ldC9pcmRhL2lybmV0L2lybmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAwNGY3MwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybmV0L2lybmV0LmgKQEAgLTAsMCArMSw1MjkgQEAKKy8qCisgKglJck5FVCBwcm90b2NvbCBtb2R1bGUgOiBTeW5jaHJvbm91cyBQUFAgb3ZlciBhbiBJckRBIHNvY2tldC4KKyAqCisgKgkJSmVhbiBJSSAtIEhQTCBgMDAgLSA8anRAaHBsLmhwLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBnbG9iYWwgdG8gdGhlIElyTkVUIG1vZHVsZSwKKyAqIGFsbCBncm91cGVkIGluIG9uZSBwbGFjZS4uLgorICogVGhpcyBmaWxlIGlzIGEgKnByaXZhdGUqIGhlYWRlciwgc28gb3RoZXIgbW9kdWxlcyBkb24ndCB3YW50IHRvIGtub3cKKyAqIHdoYXQncyBpbiB0aGVyZS4uLgorICoKKyAqIE5vdGUgOiBhcyBtb3N0IHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgdGhpcyBtb2R1bGUgaXMgYXZhaWxhYmxlCisgKiB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkuCisgKi8KKworI2lmbmRlZiBJUk5FVF9ICisjZGVmaW5lIElSTkVUX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIERPQ1VNRU5UQVRJT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFdoYXQgaXMgSXJORVQKKyAqIC0tLS0tLS0tLS0tLS0KKyAqIElyTkVUIGlzIGEgcHJvdG9jb2wgYWxsb3dpbmcgdG8gY2FycnkgVENQL0lQIHRyYWZmaWMgYmV0d2VlbiB0d28KKyAqIElyREEgcGVlcnMgaW4gYW4gZWZmaWNpZW50IGZhc2hpb24uIEl0IGlzIGEgdGhpbiBsYXllciwgcGFzc2luZyBQUFAKKyAqIHBhY2tldHMgdG8gSXJUVFAgYW5kIHZpY2UgdmVyc2EuIEl0IHVzZXMgUFBQIGluIHN5bmNocm9ub3VzIG1vZGUsCisgKiBiZWNhdXNlIElyVFRQIG9mZmVyIGEgcmVsaWFibGUgc2VxdWVuY2VkIHBhY2tldCBzZXJ2aWNlIChhcyBvcHBvc2VkCisgKiB0byBhIGJ5dGUgc3RyZWFtKS4gSW4gZmFjdCwgeW91IGNvdWxkIHNlZSBJck5FVCBhcyBjYXJyeWluZyBUQ1AvSVAKKyAqIGluIGEgSXJEQSBzb2NrZXQsIHVzaW5nIFBQUCB0byBwcm92aWRlIHRoZSBnbHVlLgorICoKKyAqIFRoZSBtYWluIGRpZmZlcmVuY2Ugd2l0aCB0cmFkaXRpb25hbCBQUFAgb3ZlciBJckNPTU0gaXMgdGhhdCB3ZQorICogYXZvaWQgdGhlIGZyYW1pbmcgYW5kIHNlcmlhbCBlbXVsYXRpb24gd2hpY2ggYXJlIGEgcGVyZm9ybWFuY2UKKyAqIGJvdHRsZW5lY2suIEl0IGFsc28gYWxsb3dzIG11bHRpcG9pbnQgY29tbXVuaWNhdGlvbnMgaW4gYSBzZW5zaWJsZQorICogZmFzaGlvbi4KKyAqCisgKiBUaGUgbWFpbiBkaWZmZXJlbmNlIHdpdGggSXJMQU4gaXMgdGhhdCB3ZSB1c2UgUFBQIGZvciB0aGUgbGluaworICogbWFuYWdlbWVudCwgd2hpY2ggaXMgbW9yZSBzdGFuZGFyZCwgaW50ZXJvcGVyYWJsZSBhbmQgZmxleGlibGUgdGhhbgorICogdGhlIElyTEFOIHByb3RvY29sLiBGb3IgZXhhbXBsZSwgUFBQIGFkZHMgYXV0aGVudGljYXRpb24sCisgKiBlbmNyeXB0aW9uLCBjb21wcmVzc2lvbiwgaGVhZGVyIGNvbXByZXNzaW9uIGFuZCBhdXRvbWF0ZWQgcm91dGluZworICogc2V0dXAuIEFuZCwgYXMgSXJORVQgbGV0IFBQUCBkbyB0aGUgaGFyZCB3b3JrLCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGlzIG11Y2ggc2ltcGxlciB0aGFuIElyTEFOLgorICoKKyAqIFRoZSBMaW51eCBpbXBsZW1lbnRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJck5FVCBpcyB3cml0dGVuIG9uIHRvcCBvZiB0aGUgTGludXgtSXJEQSBzdGFjaywgYW5kIGludGVyZmFjZSB3aXRoCisgKiB0aGUgZ2VuZXJpYyBMaW51eCBQUFAgZHJpdmVyLiBCZWNhdXNlIElyTkVUIGRlcGVuZCBvbiByZWNlbnQKKyAqIGNoYW5nZXMgb2YgdGhlIFBQUCBkcml2ZXIgaW50ZXJmYWNlLCBJck5FVCB3aWxsIHdvcmsgb25seSB3aXRoIHZlcnkKKyAqIHJlY2VudCBrZXJuZWwgKDIuMy45OS1wcmU2IGFuZCB1cCkuCisgKiAKKyAqIFRoZSBwcmVzZW50IGltcGxlbWVudGF0aW9uIG9mZmVyIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgOgorICoJbyBzaW1wbGUgdXNlciBpbnRlcmZhY2UgdXNpbmcgcHBwZAorICoJbyBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gKGludGVyZmFjZSBkaXJlY3RseSB0byBQUFAgYW5kIElyVFRQKQorICoJbyBhZGRyZXNzaW5nICh5b3UgY2FuIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIElyTkVUIHJlY2lwaWVudCkKKyAqCW8gbXVsdGlwb2ludCBvcGVyYXRpb24gKGxpbWl0ZWQgYnkgSXJMQVAgc3BlY2lmaWNhdGlvbikKKyAqCW8gaW5mb3JtYXRpb24gaW4gL3Byb2MvbmV0L2lyZGEvaXJuZXQKKyAqCW8gSXJORVQgZXZlbnRzIG9uIC9kZXYvaXJuZXQgKGZvciB1c2VyIHNwYWNlIGRhZW1vbikKKyAqCW8gSXJORVQgZGFlbW9uIChpcm5ldGQpIHRvIGF1dG9tYXRpY2FsbHkgaGFuZGxlIGluY29taW5nIHJlcXVlc3RzCisgKglvIFdpbmRvd3MgMjAwMCBjb21wYXRpYmlsaXR5ICh0ZXN0ZWQsIGJ1dCBuZWVkIG1vcmUgd29yaykKKyAqIEN1cnJlbnRseSBtaXNzaW5nIDoKKyAqCW8gTG90J3Mgb2YgdGVzdGluZyAodGhhdCdzIHlvdXIgam9iKQorICoJbyBDb25uZWN0aW9uIHJldHJpZXMgKG1heSBiZSB0b28gaGFyZCB0byBkbykKKyAqCW8gQ2hlY2sgcHBwZCBwZXJzaXN0IG1vZGUKKyAqCW8gVXNlciBzcGFjZSBkYWVtb24gKHRvIGF1dG9tYXRpY2FsbHkgaGFuZGxlIGluY29taW5nIHJlcXVlc3RzKQorICoKKyAqIFRoZSBzZXR1cCBpcyBub3QgY3VycmVudGx5IHRoZSBtb3N0IGVhc3ksIGJ1dCB0aGlzIHNob3VsZCBnZXQgbXVjaAorICogYmV0dGVyIHdoZW4gZXZlcnl0aGluZyB3aWxsIGdldCBpbnRlZ3JhdGVkLi4uCisgKgorICogQWNrbm93bGVkZ2VtZW50cworICogLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBtb2R1bGUgaXMgYmFzZWQgb24gOgorICoJbyBUaGUgUFBQIGRyaXZlciAocHBwX3N5bmN0dHkvcHBwX2dlbmVyaWMpIGJ5IFBhdWwgTWFja2VycmFzCisgKglvIFRoZSBJckxBTiBwcm90b2NvbCAoaXJsYW5fY29tbW9uL1hYWCkgYnkgRGFnIEJyYXR0bGkKKyAqCW8gVGhlIElyU29jayBpbnRlcmZhY2UgKGFmX2lyZGEpIGJ5IERhZyBCcmF0dGxpCisgKglvIFNvbWUgb3RoZXIgYml0cyBmcm9tIHRoZSBrZXJuZWwgYW5kIG15IGRyaXZlcnMuLi4KKyAqIEluZmluaXRlIHRoYW5rcyB0byB0aG9zZSBicmF2ZSBzb3VscyBmb3IgcHJvdmlkaW5nIHRoZSBpbmZyYXN0cnVjdHVyZQorICogdXBvbiB3aGljaCBJck5FVCBpcyBidWlsdC4KKyAqCisgKiBUaGFua3MgdG8gYWxsIG15IGNvbGxlZ3VlcyBpbiBIUCBmb3IgaGVscGluZyBtZS4gSW4gcGFydGljdWxhciwKKyAqIHRoYW5rcyB0byBTYWxpbCBQcmFkaGFuIGFuZCBCaWxsIFNlcnJhIGZvciBXMmsgdGVzdGluZy4uLgorICogVGhhbmtzIHRvIEx1aXogTWFnYWxoYWVzIGZvciBpcm5ldGQgYW5kIG11Y2ggdGVzdGluZy4uLgorICoKKyAqIFRoYW5rcyB0byBBbGFuIENveCBmb3IgYW5zd2VyaW5nIGxvdCdzIG9mIG15IHN0dXBpZCBxdWVzdGlvbnMsIGFuZAorICogdG8gUGF1bCBNYWNrZXJyYXMgYW5zd2VyaW5nIG15IHF1ZXN0aW9ucyBvbiBob3cgdG8gYmVzdCBpbnRlZ3JhdGUKKyAqIElyTkVUIGFuZCBwcHBkLgorICoKKyAqIEplYW4gSUkKKyAqCisgKiBOb3RlIG9uIHNvbWUgaW1wbGVtZW50YXRpb25zIGNob2ljZXMuLi4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJMSkgRGlyZWN0IGludGVyZmFjZSB2cyB0dHkvc29ja2V0CisgKiBJIGNvdWxkIGhhdmUgdXNlZCBhIHR0eSBpbnRlcmZhY2UgdG8gaG9vayB0byBwcHAgYW5kIHVzZSB0aGUgZnVsbAorICogc29ja2V0IEFQSSB0byBjb25uZWN0IHRvIElyREEuIFRoZSBjb2RlIHdvdWxkIGhhdmUgYmVlbiBlYXNpZXIgdG8KKyAqIG1haW50YWluLCBhbmQgbWF5YmUgdGhlIGNvZGUgd291bGQgaGF2ZSBiZWVuIHNtYWxsZXIuLi4KKyAqIEluc3RlYWQsIHdlIGhvb2sgZGlyZWN0bHkgdG8gcHBwX2dlbmVyaWMgYW5kIHRvIElyVFRQLCB3aGljaCBtYWtlCisgKiB0aGluZ3MgbW9yZSBjb21wbGljYXRlZC4uLgorICoKKyAqIFRoZSBmaXJzdCByZWFzb24gaXMgZmxleGliaWxpdHkgOiB0aGlzIGFsbG93IHVzIHRvIGNyZWF0ZSBJck5FVAorICogaW5zdGFuY2VzIG9uIGRlbWFuZCAobm8gL2Rldi9pcmNvbW1YIGNyYXApIGFuZCB0byBhbGxvdyBsaW5rbmFtZQorICogc3BlY2lmaWNhdGlvbiBvbiBwcHBkIGNvbW1hbmQgbGluZS4uLgorICoKKyAqIFNlY29uZCByZWFzb24gaXMgc3BlZWQgb3B0aW1pc2F0aW9uLiBJZiB5b3UgbG9vayBjbG9zZWx5IGF0IHRoZQorICogdHJhbnNtaXQgYW5kIHJlY2VpdmUgcGF0aHMsIHlvdSB3aWxsIG5vdGljZSB0aGF0IHRoZXkgYXJlICJzdXBlciBsZWFuIgorICogKHRoYXQncyB3aHkgdGhleSBsb29rIHVnbHkpLCB3aXRoIG5vIGZ1bmN0aW9uIGNhbGxzIGFuZCBhcyBsaXR0bGUgZGF0YQorICogY29weSBhbmQgbW9kaWZpY2F0aW9uIGFzIEkgY291bGQuLi4KKyAqCisgKgkyKSBpcm5ldGQgaW4gdXNlciBzcGFjZQorICogaXJuZXRkIGlzIGltcGxlbWVudGVkIGluIHVzZXIgc3BhY2UsIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBjYWxsIHBwcGQuCisgKiBUaGlzIGFsc28gZ2l2ZSBtYXhpbXVtIGJlbmVmaXRzIGluIHRlcm0gb2YgZmxleGliaWxpdHkgYW5kIGN1c3RvbWFiaWxpdHksCisgKiBhbmQgYWxsb3cgdG8gb2ZmZXIgdGhlIGV2ZW50IGNoYW5uZWwsIHVzZWZ1bCBmb3Igb3RoZXIgc3R1ZmYgbGlrZSBkZWJ1Zy4KKyAqCisgKiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhpcyByZXF1aXJlIGEgbG9vc2UgY29vcmRpbmF0aW9uIGJldHdlZW4gdGhlCisgKiBwcmVzZW50IG1vZHVsZSBhbmQgaXJuZXRkLiBPbmUgY3JpdGljYWwgYXJlYSBpcyBob3cgaW5jb21pbmcgcmVxdWVzdAorICogYXJlIGhhbmRsZWQuCisgKiBXaGVuIGlybmV0IHJlY2VpdmUgYW4gaW5jb21pbmcgcmVxdWVzdCwgaXQgc2VuZCBhbiBldmVudCB0byBpcm5ldGQgYW5kCisgKiBkcm9wIHRoZSBpbmNvbWluZyBJck5FVCBzb2NrZXQuCisgKiBpcm5ldGQgc3RhcnQgYSBwcHBkIGluc3RhbmNlLCB3aGljaCBjcmVhdGUgYSBuZXcgSXJORVQgc29ja2V0LiBUaGlzIG5ldworICogc29ja2V0IGlzIHRoZW4gY29ubmVjdGVkIGluIHRoZSBvcmlnaW5hdGluZyBub2RlIHRvIHRoZSBwcHBkIGluc3RhbmNlLgorICogQXQgdGhpcyBwb2ludCwgaW4gdGhlIG9yaWdpbmF0aW5nIG5vZGUsIHRoZSBmaXJzdCBzb2NrZXQgaXMgY2xvc2VkLgorICoKKyAqIEkgYWRtaXQsIHRoaXMgaXMgYSBiaXQgbWVzc3kgYW5kIHdhc3RlIHNvbWUgcmVzb3VyY2VzLiBUaGUgYWx0ZXJuYXRpdmUKKyAqIGlzIGNhY2hpbmcgaW5jb21pbmcgc29ja2V0LCBhbmQgdGhhdCdzIGFsc28gcXVpdGUgbWVzc3kgYW5kIHdhc3RlCisgKiByZXNvdXJjZXMuCisgKiBXZSBhbHNvIG1ha2UgY29ubmVjdGlvbiB0aW1lIHNsb3dlci4gRm9yIGV4YW1wbGUsIG9uIGEgMTE1IGtiL3MgbGluayBpdAorICogYWRkcyA2MG1zIHRvIHRoZSBjb25uZWN0aW9uIHRpbWUgKDc3MCBtcykuIEhvd2V2ZXIsIHRoaXMgaXMgc2xvd2VyIHRoYW4KKyAqIHRoZSB0aW1lIGl0IHRha2VzIHRvIGZpcmUgdXAgcHBwZCBvbiBteSBQMTMzLi4uCisgKgorICoKKyAqIEhpc3RvcnkgOgorICogLS0tLS0tLQorICoKKyAqIHYxIC0gMTUuNS4wMCAtIEplYW4gSUkKKyAqCW8gQmFzaWMgSXJORVQgKGhvb2sgdG8gcHBwX2dlbmVyaWMgJiBJclRUUCAtIGluY2wuIG11bHRpcG9pbnQpCisgKglvIGNvbnRyb2wgY2hhbm5lbCBvbiAvZGV2L2lybmV0IChzZXQgbmFtZS9hZGRyZXNzKQorICoJbyBldmVudCBjaGFubmVsIG9uIC9kZXYvaXJuZXQgKGZvciB1c2VyIHNwYWNlIGRhZW1vbikKKyAqCisgKiB2MiAtIDUuNi4wMCAtIEplYW4gSUkKKyAqCW8gRW5hYmxlIERST1BfTk9UX1JFQURZIHRvIGF2b2lkIFBQUCB0aW1lb3V0cyAmIG90aGVyIHdlaXJkbmVzcy4uLgorICoJbyBBZGQgRElTQ09OTkVDVF9UTyBldmVudCBhbmQgcmVuYW1lIERJU0NPTk5FQ1RfRlJPTS4KKyAqCW8gU2V0IG9mZmljaWFsIGRldmljZSBudW1iZXIgYWxsb2FjdGlvbiBvbiAvZGV2L2lybmV0CisgKgorICogdjMgLSAzMC44LjAwIC0gSmVhbiBJSQorICoJbyBVcGRhdGUgdG8gbGF0ZXN0IExpbnV4LUlyREEgY2hhbmdlcyA6CisgKgkJLSBxdWV1ZV90ID0+IGlyZGFfcXVldWVfdAorICoJbyBVcGRhdGUgdG8gcHBwLTIuNC4wIDoKKyAqCQktIG1vdmUgaXJkYV9pcm5ldF9jb25uZWN0IGZyb20gUFBQSU9DQVRUQUNIIHRvIFRJT0NTRVRECisgKglvIEFkZCBFWFBJUkUgZXZlbnQgKGRlcGVuZCBvbiBuZXcgSXJEQS1MaW51eCBwYXRjaCkKKyAqCW8gU3dpdGNoIGZyb20gYGhhc2hiaW5fcmVtb3ZlJyB0byBgaGFzaGJpbl9yZW1vdmVfdGhpcycgdG8gZml4CisgKgkgIGEgbXVsdGlsaW5rIGJ1Zy4uLiAoZGVwZW5kIG9uIG5ldyBJckRBLUxpbnV4IHBhdGNoKQorICoJbyBmaXggYSBzZWxmLT5kYWRkciB0byBzZWxmLT5yYWRkciBpbiBpcmRhX2lybmV0X2Nvbm5lY3QgdG8gZml4CisgKgkgIGFub3RoZXIgbXVsdGlsaW5rIGJ1ZyAoZGFybiAhKQorICoJbyBSZW1vdmUgTElOS05BTUVfSU9DVEwgY3J1ZnQKKyAqCisgKiB2M2IgLSAzMS44LjAwIC0gSmVhbiBJSQorICoJbyBEdW1wIGRpc2NvdmVyeSBsb2cgYXQgZXZlbnQgY2hhbm5lbCBzdGFydHVwCisgKgorICogdjQgLSAyOC45LjAwIC0gSmVhbiBJSQorICoJbyBGaXggaW50ZXJhY3Rpb24gYmV0d2VlbiBwb2xsL3NlbGVjdCBhbmQgZHVtcCBkaXNjb3ZlcnkgbG9nCisgKglvIEFkZCBJUk5FVF9CTE9DS0VEX0xJTksgZXZlbnQgKGRlcGVuZCBvbiBuZXcgSXJEQS1MaW51eCBwYXRjaCkKKyAqCW8gQWRkIElSTkVUX05PQU5TV0VSX0ZST00gZXZlbnQgKG1vc3RseSB0byBoZWxwIHN1cHBvcnQpCisgKglvIFJlbGVhc2UgZmxvdyBjb250cm9sIGluIGRpc2Nvbm5lY3RfaW5kaWNhdGlvbgorICoJbyBCbG9jayBwYWNrZXRzIHdoaWxlIGNvbm5lY3RpbmcgKHNwZWVkIHVwIGNvbm5lY3Rpb25zKQorICoKKyAqIHY1IC0gMTEuMDEuMDEgLSBKZWFuIElJCisgKglvIEluaXQgc2VsZi0+bWF4X2hlYWRlcl9zaXplLCBqdXN0IGluIGNhc2UuLi4KKyAqCW8gU2V0IHVwIGFwLT5jaGFuLmhkcmxlbiwgdG8gZ2V0IHplcm8gY29weSBvbiB0eCBzaWRlIHdvcmtpbmcuCisgKglvIGF2b2lkIHR4LT50dHAtPmZsb3ctPnBwcC0+dHgtPi4uLiBsb29wLCBieSBjaGVja2luZyBmbG93IHN0YXRlCisgKgkJVGhhbmtzIHRvIENocmlzdGlhbiBHZW5uZXJhdCBmb3IgZmluZGluZyB0aGlzIGJ1ZyAhCisgKgktLS0KKyAqCW8gRGVjbGFyZSB0aGUgcHJvcGVyIE1UVS9NUlUgdGhhdCB3ZSBjYW4gc3VwcG9ydAorICoJCShidXQgUFBQIGRvZXNuJ3QgcmVhZCB0aGUgTVRVIHZhbHVlIDotKCkKKyAqCW8gRGVjbGFyZSBoYXNoYmluIEhCX05PTE9DSyBpbnN0ZWFkIG9mIEhCX0xPQ0FMIHRvIGF2b2lkCisgKgkJZGlzYWJsaW5nIGFuZCBlbmFibGluZyBpcnEgdHdpY2UKKyAqCisgKiB2NiAtIDMxLjA1LjAxIC0gSmVhbiBJSQorICoJbyBQcmludCBzb3VyY2UgYWRkcmVzcyBpbiBGb3VuZCwgRGlzY292ZXJ5LCBFeHBpcnkgJiBSZXF1ZXN0IGV2ZW50cworICoJbyBQcmludCByZXF1ZXN0ZWQgc291cmNlIGFkZHJlc3MgaW4gL3Byb2MvbmV0L2lybmV0CisgKglvIENoYW5nZSBjb250cm9sIGNoYW5uZWwgaW5wdXQuIEFsbG93IG11bHRpcGxlIGNvbW1hbmRzIGluIG9uZSBsaW5lLgorICoJbyBBZGQgc2FkZHIgY29tbWFuZCB0byBjaGFuZ2UgYXAtPnJzYWRkciAoYW5kIHVzZSB0aGF0IGluIElyREEpCisgKgktLS0KKyAqCW8gTWFrZSB0aGUgSXJEQSBjb25uZWN0aW9uIHByb2NlZHVyZSB0b3RhbGx5IGFzeW5jaHJvbm91cy4KKyAqCSAgSGVhdnkgcmV3cml0ZSBvZiB0aGUgSUFTIHF1ZXJ5IGNvZGUgYW5kIHRoZSB3aG9sZSBjb25uZWN0aW9uCisgKgkgIHByb2NlZHVyZS4gTm93LCBpcm5ldF9jb25uZWN0KCkgbm8gbG9uZ2VyIG5lZWQgdG8gYmUgY2FsbGVkIGZyb20KKyAqCSAgYSBwcm9jZXNzIGNvbnRleHQuLi4KKyAqCW8gRW5hYmxlIElyREEgY29ubmVjdCByZXRyaWVzIGluIHBwcF9pcm5ldF9zZW5kKCkuIFRoZSBnb29kIHRoaW5nCisgKgkgIGlzIHRoYXQgSXJEQSBjb25uZWN0IHJldHJpZXMgYXJlIGRpcmVjdGx5IGRyaXZlbiBieSBQUFAgTENQCisgKgkgIHJldHJpZXMgKHdlIHJldHJ5IGZvciBlYWNoIExDUCBwYWNrZXQpLCBzbyB0aGF0IGV2ZXJ5dGhpbmcKKyAqCSAgaXMgdHJhbnNwYXJlbnRseSBjb250cm9sbGVkIGZyb20gcHBwZCBsY3AtbWF4LWNvbmZpZ3VyZS4KKyAqCW8gQWRkIHR0cF9jb25uZWN0IGZsYWcgdG8gcHJldmVudCByZW50cnkgb24gdGhlIGNvbm5lY3QgcHJvY2VkdXJlCisgKglvIFRlc3QgYW5kIGZpeHVwcyB0byBlbGltaW5hdGUgc2lkZSBlZmZlY3RzIG9mIHJldHJpZXMKKyAqCisgKiB2NyAtIDIyLjA4LjAxIC0gSmVhbiBJSQorICoJbyBDbGVhbnVwIDogQ2hhbmdlICJzYWRkciA9IDB4MCIgdG8gInNhZGRyID0gREVWX0FERFJfQU5ZIgorICoJbyBGaXggYnVnIGluIEJMT0NLX1dIRU5fQ09OTkVDVCBpbnRyb2R1Y2VkIGluIHY2IDogZHVlIHRvIHRoZQorICoJICBhc3luY2hyb25vdXMgSUFTIHF1ZXJ5LCBzZWxmLT50c2FwIGlzIE5VTEwgd2hlbiBQUFAgc2VuZCB0aGUKKyAqCSAgZmlyc3QgcGFja2V0LiAgVGhpcyB3YXMgcHJldmVudGluZyAiY29ubmVjdC1kZWxheSAwIiB0byB3b3JrLgorICoJICBDaGFuZ2UgdGhlIHRlc3QgaW4gcHBwX2lybmV0X3NlbmQoKSB0byBzZWxmLT50dHBfY29ubmVjdC4KKyAqCisgKiB2OCAtIDEuMTEuMDEgLSBKZWFuIElJCisgKglvIFRpZ2h0ZW4gdGhlIHVzZSBvZiBzZWxmLT50dHBfY29ubmVjdCBhbmQgc2VsZi0+dHRwX29wZW4gdG8KKyAqCSAgcHJldmVudCB2YXJpb3VzIHJhY2UgY29uZGl0aW9ucy4KKyAqCW8gQXZvaWQgbGVha2luZyBkaXNjb3ZlcnkgbG9nIGFuZCBza2IKKyAqCW8gUmVwbGFjZSAic2VsZiIgd2l0aCAic2VydmVyIiBpbiBpcm5ldF9jb25uZWN0X2luZGljYXRpb24oKSB0bworICoJICBiZXR0ZXIgZGV0ZWN0IGN1dCduJ3Bhc3RlIGVycm9yIDstKQorICoKKyAqIHY5IC0gMjkuMTEuMDEgLSBKZWFuIElJCisgKglvIEZpeCBldmVudCBnZW5lcmF0aW9uIGluIGRpc2Nvbm5lY3QgaW5kaWNhdGlvbiB0aGF0IEkgYnJva2UgaW4gdjgKKyAqCSAgSXQgd2FzIGFsd2F5cyBnZW5lcmF0aW9uICJOby1BbnN3ZXIiIGJlY2F1c2UgSSB3YXMgdGVzdGluZyB0dHBfb3BlbgorICoJICBqdXN0IGFmdGVyIGNsZWFyaW5nIGl0LiAqYmx1c2gqLgorICoJbyBVc2UgbmV3bHkgY3JlYXRlZCBpcnR0cF9saXN0ZW4oKSB0byBmaXggcG90ZW50aWFsIGNyYXNoIHdoZW4gTEFQCisgKgkgIGRlc3Ryb3llZCBiZWZvcmUgaXJuZXQgbW9kdWxlIHJlbW92ZWQuCisgKgorICogdjEwIC0gNC4zLjIgLSBKZWFuIElJCisgKglvIFdoZW4gcmVjZWl2aW5nIGEgZGlzY29ubmVjdCBpbmRpY2F0aW9uLCBkb24ndCByZWVuYWJsZSB0aGUKKyAqCSAgUFBQIFR4IHF1ZXVlLCB0aGlzIHdpbGwgdHJpZ2dlciBhIHJlY29ubmVjdC4gSW5zdGVhZCwgY2xvc2UKKyAqCSAgdGhlIGNoYW5uZWwsIHdoaWNoIHdpbGwga2lsbCBwcHBkLi4uCisgKgorICogdjExIC0gMjAuMy4wMiAtIEplYW4gSUkKKyAqCW8gT29wcyAhIHYxMCBmaXggZGlzYWJsZWQgSXJORVQgcmV0cmllcyBhbmQgcGFzc2l2ZSBiZWhhdmlvdXIuCisgKgkgIEJldHRlciBmaXggaW4gaXJuZXRfZGlzY29ubmVjdF9pbmRpY2F0aW9uKCkgOgorICoJICAtIGlmIGNvbm5lY3RlZCwga2lsbCBwcHBkIHZpYSBoYW5ndXAuCisgKgkgIC0gaWYgbm90IGNvbm5lY3RlZCwgcmVlbmFibGUgcHBwIFR4LCB3aGljaCB0cmlnZ2VyIElyTkVUIHJldHJ5LgorICoKKyAqIHYxMiAtIDEwLjQuMDIgLSBKZWFuIElJCisgKglvIEZpeCByYWNlIGNvbmRpdGlvbiBpbiBpcm5ldF9jb25uZWN0X2luZGljYXRpb24oKS4KKyAqCSAgSWYgdGhlIHNvY2tldCB3YXMgYWxyZWFkeSB0cnlpbmcgdG8gY29ubmVjdCwgZHJvcCBvbGQgY29ubmVjdGlvbgorICoJICBhbmQgdXNlIG5ldyBvbmUgb25seSBpZiBhY3RpbmcgYXMgcHJpbWFyeS4gU2VlIGNvbW1lbnRzLgorICoKKyAqIHYxMyAtIDMwLjUuMDIgLSBKZWFuIElJCisgKglvIFVwZGF0ZSBtb2R1bGUgaW5pdCBjb2RlCisgKgorICogdjE0IC0gMjAuMi4wMyAtIEplYW4gSUkKKyAqCW8gQWRkIGRpc2NvdmVyeSBoaW50IGJpdHMgaW4gdGhlIGNvbnRyb2wgY2hhbm5lbC4KKyAqCW8gUmVtb3ZlIG9ic29sZXRlIE1PRF9JTkMvREVDX1VTRV9DT1VOVCBpbiBmYXZvciBvZiAub3duZXIKKyAqCisgKiB2MTUgLSA3LjQuMDMgLSBKZWFuIElJCisgKglvIFJlcGxhY2Ugc3Bpbl9sb2NrX2lycXNhdmUoKSB3aXRoIHNwaW5fbG9ja19iaCgpIHNvIHRoYXQgd2UgY2FuCisgKgkgIHVzZSBwcHBfdW5pdF9udW1iZXIoKS4gSXQncyBwcm9iYWJseSBhbHNvIGJldHRlciBvdmVyYWxsLi4uCisgKglvIERpc2FibGUgY2FsbCB0byBwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKCksIGJlY2F1c2Ugd2UgY2FuJ3QgZG8gaXQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOQ0xVREVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgkvKiBpc3NwYWNlKCkgKi8KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwLmg+CisjaW5jbHVkZSA8bGludXgvcHBwX2NoYW5uZWwuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFzX29iamVjdC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9kaXNjb3ZlcnkuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE9QVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogRGVmaW5lIG9yIHVuZGVmaW5lIHRvIGNvbXBpbGUgb3Igbm90IHNvbWUgb3B0aW9uYWwgcGFydCBvZiB0aGUKKyAqIElyTkVUIGRyaXZlci4uLgorICogTm90ZSA6IHRoZSBwcmVzZW50IGRlZmF1bHRzIG1ha2Ugc2Vuc2UsIHBsYXkgd2l0aCB0aGF0IGF0IHlvdXIKKyAqIG93biByaXNrLi4uCisgKi8KKy8qIElyREEgc2lkZSBvZiB0aGUgYnVzaW5lc3MuLi4gKi8KKyNkZWZpbmUgRElTQ09WRVJZX05PTUFTSwkvKiBUbyBlbmFibGUgVzJrIGNvbXBhdGliaWxpdHkuLi4gKi8KKyNkZWZpbmUgQURWRVJUSVNFX0hJTlQJCS8qIEFkdmVydGlzZSBJckxBTiBoaW50IGJpdCAqLworI2RlZmluZSBBTExPV19TSU1VTFRfQ09OTkVDVAkvKiBUaGlzIHNlZW0gdG8gd29yaywgY3Jvc3MgZmluZ2Vycy4uLiAqLworI2RlZmluZSBESVNDT1ZFUllfRVZFTlRTCS8qIFF1ZXJ5IHRoZSBkaXNjb3ZlcnkgbG9nIHRvIHBvc3QgZXZlbnRzICovCisjZGVmaW5lIElOSVRJQUxfRElTQ09WRVJZCS8qIER1bXAgY3VycmVudCBkaXNjb3ZlcnkgbG9nIGFzIGV2ZW50cyAqLworI3VuZGVmIFNUUkVBTV9DT01QQVQJCS8qIE5vdCBuZWVkZWQgLSBwb3RlbnRpYWxseSBtZXNzeSAqLworI3VuZGVmIENPTk5FQ1RfSU5ESUNfS0lDSwkvKiBNaWdodCBtZXNzIElyREEsIG5vdCBuZWVkZWQgKi8KKyN1bmRlZiBGQUlMX1NFTkRfRElTQ09OTkVDVAkvKiBNaWdodCBtZXNzIElyREEsIG5vdCBuZWVkZWQgKi8KKyN1bmRlZiBQQVNTX0NPTk5FQ1RfUEFDS0VUUwkvKiBOb3QgbmVlZGVkID8gU2FmZSAqLworI3VuZGVmIE1JU1NJTkdfUFBQX0FQSQkJLyogU3R1ZmYgSSB3aXNoIEkgY291bGQgZG8gKi8KKworLyogUFBQIHNpZGUgb2YgdGhlIGJ1c2luZXNzICovCisjZGVmaW5lIEJMT0NLX1dIRU5fQ09OTkVDVAkvKiBCbG9jayBwYWNrZXRzIHdoZW4gY29ubmVjdGluZyAqLworI2RlZmluZSBDT05ORUNUX0lOX1NFTkQJCS8qIFJldHJ5IElyREEgY29ubmVjdGlvbiBwcm9jZWR1cmUgKi8KKyN1bmRlZiBGTFVTSF9UT19QUFAJCS8qIE5vdCBzdXJlIGFib3V0IHRoaXMgb25lLCBsZXQncyBwbGF5IHNhZmUgKi8KKyN1bmRlZiBTRUNVUkVfREVWSVJORVQJCS8qIEJhaC4uLiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERFQlVHICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgc2V0IG9mIGZsYWdzIGVuYWJsZSBhbmQgZGlzYWJsZSBhbGwgdGhlIHZhcmlvdXMgd2FybmluZywKKyAqIGVycm9yIGFuZCBkZWJ1ZyBtZXNzYWdlIG9mIHRoaXMgZHJpdmVyLgorICogRWFjaCBzZWN0aW9uIGNhbiBiZSBlbmFibGVkIGFuZCBkaXNhYmxlZCBpbmRlcGVuZGVudGx5CisgKi8KKy8qIEluIHRoZSBQUFAgcGFydCAqLworI2RlZmluZSBERUJVR19DVFJMX1RSQUNFCTAJLyogQ29udHJvbCBjaGFubmVsICovCisjZGVmaW5lIERFQlVHX0NUUkxfSU5GTwkJMAkvKiB2YXJpb3VzIGluZm8gKi8KKyNkZWZpbmUgREVCVUdfQ1RSTF9FUlJPUgkxCS8qIHByb2JsZW1zICovCisjZGVmaW5lIERFQlVHX0ZTX1RSQUNFCQkwCS8qIGZpbGVzeXN0ZW0gY2FsbGJhY2tzICovCisjZGVmaW5lIERFQlVHX0ZTX0lORk8JCTAJLyogdmFyaW91cyBpbmZvICovCisjZGVmaW5lIERFQlVHX0ZTX0VSUk9SCQkxCS8qIHByb2JsZW1zICovCisjZGVmaW5lIERFQlVHX1BQUF9UUkFDRQkJMAkvKiBQUFAgcmVsYXRlZCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgREVCVUdfUFBQX0lORk8JCTAJLyogdmFyaW91cyBpbmZvICovCisjZGVmaW5lIERFQlVHX1BQUF9FUlJPUgkJMQkvKiBwcm9ibGVtcyAqLworI2RlZmluZSBERUJVR19NT0RVTEVfVFJBQ0UJMAkvKiBtb2R1bGUgaW5zZXJ0aW9uL3JlbW92YWwgKi8KKyNkZWZpbmUgREVCVUdfTU9EVUxFX0VSUk9SCTEJLyogcHJvYmxlbXMgKi8KKworLyogSW4gdGhlIElyREEgcGFydCAqLworI2RlZmluZSBERUJVR19JUkRBX1NSX1RSQUNFCTAJLyogSVJEQSBzdWJyb3V0aW5lcyAqLworI2RlZmluZSBERUJVR19JUkRBX1NSX0lORk8JMAkvKiB2YXJpb3VzIGluZm8gKi8KKyNkZWZpbmUgREVCVUdfSVJEQV9TUl9FUlJPUgkxCS8qIHByb2JsZW1zICovCisjZGVmaW5lIERFQlVHX0lSREFfU09DS19UUkFDRQkwCS8qIElSREEgbWFpbiBzb2NrZXQgZnVuY3Rpb25zICovCisjZGVmaW5lIERFQlVHX0lSREFfU09DS19JTkZPCTAJLyogdmFyaW91cyBpbmZvICovCisjZGVmaW5lIERFQlVHX0lSREFfU09DS19FUlJPUgkxCS8qIHByb2JsZW1zICovCisjZGVmaW5lIERFQlVHX0lSREFfU0VSVl9UUkFDRQkwCS8qIFRoZSBJck5FVCBzZXJ2ZXIgKi8KKyNkZWZpbmUgREVCVUdfSVJEQV9TRVJWX0lORk8JMAkvKiB2YXJpb3VzIGluZm8gKi8KKyNkZWZpbmUgREVCVUdfSVJEQV9TRVJWX0VSUk9SCTEJLyogcHJvYmxlbXMgKi8KKyNkZWZpbmUgREVCVUdfSVJEQV9UQ0JfVFJBQ0UJMAkvKiBJUkRBIElyVFRQIGNhbGxiYWNrcyAqLworI2RlZmluZSBERUJVR19JUkRBX0NCX0lORk8JMAkvKiB2YXJpb3VzIGluZm8gKi8KKyNkZWZpbmUgREVCVUdfSVJEQV9DQl9FUlJPUgkxCS8qIHByb2JsZW1zICovCisjZGVmaW5lIERFQlVHX0lSREFfT0NCX1RSQUNFCTAJLyogSVJEQSBvdGhlciBjYWxsYmFja3MgKi8KKyNkZWZpbmUgREVCVUdfSVJEQV9PQ0JfSU5GTwkwCS8qIHZhcmlvdXMgaW5mbyAqLworI2RlZmluZSBERUJVR19JUkRBX09DQl9FUlJPUgkxCS8qIHByb2JsZW1zICovCisKKyNkZWZpbmUgREVCVUdfQVNTRVJUCQkwCS8qIFZlcmlmeSBhbGwgYXNzZXJ0aW9ucyAqLworCisvKiAKKyAqIFRoZXNlIGFyZSB0aGUgbWFjcm9zIHdlIGFyZSB1c2luZyB0byBhY3R1YWxseSBwcmludCB0aGUgZGVidWcKKyAqIHN0YXRlbWVudHMuIERvbid0IGxvb2sgYXQgaXQsIGl0J3MgdWdseS4uLgorICoKKyAqIE9uZSBvZiB0aGUgdHJpY2sgaXMgdGhhdCwgYXMgdGhlIERFQlVHX1hYWCBhcmUgY29uc3RhbnQsIHRoZQorICogY29tcGlsZXIgd2lsbCBvcHRpbWlzZSBhd2F5IHRoZSBpZigpIGluIGFsbCBjYXNlcy4KKyAqLworLyogQWxsIGVycm9yIG1lc3NhZ2VzICh3aWxsIHNob3cgdXAgaW4gdGhlIG5vcm1hbCBsb2dzKSAqLworI2RlZmluZSBERVJST1IoZGJnLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKwl7aWYoREVCVUdfIyNkYmcpIFwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXJuZXQ6ICVzKCk6ICIgZm9ybWF0LCBfX0ZVTkNUSU9OX18gLCAjI2FyZ3MpO30KKworLyogTm9ybWFsIGRlYnVnIG1lc3NhZ2UgKHdpbGwgc2hvdyB1cCBpbiAvdmFyL2xvZy9kZWJ1ZykgKi8KKyNkZWZpbmUgREVCVUcoZGJnLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKwl7aWYoREVCVUdfIyNkYmcpIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImlybmV0OiAlcygpOiAiIGZvcm1hdCwgX19GVU5DVElPTl9fICwgIyNhcmdzKTt9CisKKy8qIEVudGVyaW5nIGEgZnVuY3Rpb24gKHRyYWNlKSAqLworI2RlZmluZSBERU5URVIoZGJnLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKwl7aWYoREVCVUdfIyNkYmcpIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImlybmV0OiAtPiAlcyIgZm9ybWF0LCBfX0ZVTkNUSU9OX18gLCAjI2FyZ3MpO30KKworLyogRW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBmdW5jdGlvbiBpbiBvbmUgZ28gKHRyYWNlKSAqLworI2RlZmluZSBEUEFTUyhkYmcsIGZvcm1hdCwgYXJncy4uLikgXAorCXtpZihERUJVR18jI2RiZykgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiaXJuZXQ6IDw+JXMiIGZvcm1hdCwgX19GVU5DVElPTl9fICwgIyNhcmdzKTt9CisKKy8qIEV4aXRpbmcgYSBmdW5jdGlvbiAodHJhY2UpICovCisjZGVmaW5lIERFWElUKGRiZywgZm9ybWF0LCBhcmdzLi4uKSBcCisJe2lmKERFQlVHXyMjZGJnKSBcCisJCXByaW50ayhLRVJOX0RFQlVHICJpcm5ldDogPC0lcygpIiBmb3JtYXQsIF9fRlVOQ1RJT05fXyAsICMjYXJncyk7fQorCisvKiBFeGl0IGEgZnVuY3Rpb24gd2l0aCBkZWJ1ZyAqLworI2RlZmluZSBEUkVUVVJOKHJldCwgZGJnLCBhcmdzLi4uKSBcCisJe0RFWElUKGRiZywgIjogIiBhcmdzKTtcCisJcmV0dXJuIHJldDsgfQorCisvKiBFeGl0IGEgZnVuY3Rpb24gb24gZmFpbGVkIGNvbmRpdGlvbiAqLworI2RlZmluZSBEQUJPUlQoY29uZCwgcmV0LCBkYmcsIGFyZ3MuLi4pIFwKKwl7aWYoY29uZCkge1wKKwkJREVSUk9SKGRiZywgYXJncyk7XAorCQlyZXR1cm4gcmV0OyB9fQorCisvKiBJbnZhbGlkIGFzc2VydGlvbiwgcHJpbnQgb3V0IGFuIGVycm9yIGFuZCBleGl0Li4uICovCisjZGVmaW5lIERBU1NFUlQoY29uZCwgcmV0LCBkYmcsIGFyZ3MuLi4pIFwKKwl7aWYoKERFQlVHX0FTU0VSVCkgJiYgIShjb25kKSkge1wKKwkJREVSUk9SKGRiZywgIkludmFsaWQgYXNzZXJ0aW9uOiAiIGFyZ3MpO1wKKwkJcmV0dXJuIHJldDsgfX0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBDT05TVEFOVFMgJiBNQUNST1MgKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQYXJhbm9pYSAqLworI2RlZmluZSBJUk5FVF9NQUdJQwkweEIwMDc1NAorCisvKiBOdW1iZXIgb2YgY29udHJvbCBldmVudHMgaW4gdGhlIGNvbnRyb2wgY2hhbm5lbCBidWZmZXIuLi4gKi8KKyNkZWZpbmUgSVJORVRfTUFYX0VWRU5UUwk4CS8qIFNob3VsZCBiZSBtb3JlIHRoYW4gZW5vdWdoLi4uICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBpcyB0aGUgbWFpbiBzdHJ1Y3R1cmUgd2hlcmUgd2Ugc3RvcmUgYWxsIHRoZSBkYXRhIHBlcnRhaW5pbmcgdG8KKyAqIG9uZSBpbnN0YW5jZSBvZiBpcm5ldC4KKyAqIE5vdGUgOiBpbiBpcm5ldCBmdW5jdGlvbnMsIGEgcG9pbnRlciB0aGlzIHN0cnVjdHVyZSBpcyB1c3VhbGx5IGNhbGxlZAorICogImFwIiBvciAic2VsZiIuIElmIHRoZSBjb2RlIGlzIGJvcnJvd2VkIGZyb20gdGhlIElyREEgc3RhY2ssIGl0IHRlbmQKKyAqIHRvIGJlIGNhbGxlZCAic2VsZiIsIGFuZCBpZiBpdCBpcyBib3Jyb3dlZCBmcm9tIHRoZSBQUFAgZHJpdmVyIGl0IGlzCisgKiAiYXAiLiBBcGFydCBmcm9tIHRoYXQsIGl0J3MgZXhhY3RseSB0aGUgc2FtZSBzdHJ1Y3R1cmUgOy0pCisgKi8KK3R5cGVkZWYgc3RydWN0IGlybmV0X3NvY2tldAoreworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIG1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiBXZSBtYW5hZ2UgYSBsaW5rZWQgbGlzdCBvZiBJck5FVCBzb2NrZXQgaW5zdGFuY2VzICovCisgIGlyZGFfcXVldWVfdAkJcTsJCS8qIE11c3QgYmUgZmlyc3QgLSBmb3IgaGFzYmluICovCisgIGludAkJCW1hZ2ljOwkJLyogUGFyYW5vaWEgKi8KKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlsZVN5c3RlbSBwYXJ0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiAicHBwZCIgaW50ZXJhY3QgZGlyZWN0bHkgd2l0aCB1cyBvbiBhIC9kZXYvIGZpbGUgKi8KKyAgc3RydWN0IGZpbGUgKgkJZmlsZTsJCS8qIEZpbGUgZGVzY3JpcHRvciBvZiB0aGlzIGluc3RhbmNlICovCisgIC8qIFRUWSBzdHVmZiAtIHRvIGtlZXAgInBwcGQiIGhhcHB5ICovCisgIHN0cnVjdCB0ZXJtaW9zCXRlcm1pb3M7CS8qIFZhcmlvdXMgdHR5IGZsYWdzICovCisgIC8qIFN0dWZmIGZvciB0aGUgY29udHJvbCBjaGFubmVsICovCisgIGludAkJCWV2ZW50X2luZGV4OwkvKiBMYXN0IHJlYWQgaW4gdGhlIGV2ZW50IGxvZyAqLworCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFBQIHBhcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiBXZSBpbnRlcmZhY2UgZGlyZWN0bHkgdG8gdGhlIHBwcF9nZW5lcmljIGRyaXZlciBpbiB0aGUga2VybmVsICovCisgIGludAkJCXBwcF9vcGVuOwkvKiByZWdpc3RlcmVkIHdpdGggcHBwX2dlbmVyaWMgKi8KKyAgc3RydWN0IHBwcF9jaGFubmVsCWNoYW47CQkvKiBJbnRlcmZhY2UgdG8gZ2VuZXJpYyBwcHAgbGF5ZXIgKi8KKworICBpbnQJCQltcnU7CQkvKiBNYXggc2l6ZSBvZiBQUFAgcGF5bG9hZCAqLworICB1MzIJCQl4YWNjbVs4XTsJLyogQXN5bmNocm9ub3VzIGNoYXJhY3RlciBtYXAgKGp1c3QgKi8KKyAgdTMyCQkJcmFjY207CQkvKiB0byBwbGVhc2UgcHBwZCAtIGR1bW15KSAqLworICB1bnNpZ25lZCBpbnQJCWZsYWdzOwkJLyogUFBQIGZsYWdzIChjb21wcmVzc2lvbiwgLi4uKSAqLworICB1bnNpZ25lZCBpbnQJCXJiaXRzOwkJLyogVW51c2VkIHJlY2VpdmUgZmxhZ3MgPz8/ICovCisKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElyVFRQIHBhcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qIFdlIGNyZWF0ZSBhIHBzZXVkbyAic29ja2V0IiBvdmVyIHRoZSBJckRBIHRyYW5wb3J0ICovCisgIHVuc2lnbmVkIGxvbmcJCXR0cF9vcGVuOwkvKiBTZXQgd2hlbiBJclRUUCBpcyByZWFkeSAqLworICB1bnNpZ25lZCBsb25nCQl0dHBfY29ubmVjdDsJLyogU2V0IHdoZW4gSXJUVFAgaXMgY29ubmVjdGluZyAqLworICBzdHJ1Y3QgdHNhcF9jYiAqCXRzYXA7CQkvKiBJclRUUCBpbnN0YW5jZSAodGhlIGNvbm5lY3Rpb24pICovCisKKyAgY2hhcgkJCXJuYW1lW05JQ0tOQU1FX01BWF9MRU4gKyAxXTsKKwkJCQkJLyogSXJEQSBuaWNrbmFtZSBvZiBkZXN0aW5hdGlvbiAqLworICBfX3UzMgkJCXJkYWRkcjsJCS8qIFJlcXVlc3RlZCBwZWVyIElyREEgYWRkcmVzcyAqLworICBfX3UzMgkJCXJzYWRkcjsJCS8qIFJlcXVlc3RlZCBsb2NhbCBJckRBIGFkZHJlc3MgKi8KKyAgX191MzIJCQlkYWRkcjsJCS8qIGFjdHVhbCBwZWVyIElyREEgYWRkcmVzcyAqLworICBfX3UzMgkJCXNhZGRyOwkJLyogbXkgbG9jYWwgSXJEQSBhZGRyZXNzICovCisgIF9fdTgJCQlkdHNhcF9zZWw7CS8qIFJlbW90ZSBUU0FQIHNlbGVjdG9yICovCisgIF9fdTgJCQlzdHNhcF9zZWw7CS8qIExvY2FsIFRTQVAgc2VsZWN0b3IgKi8KKworICBfX3UzMgkJCW1heF9zZHVfc2l6ZV9yeDsvKiBTb2NrZXQgcGFyYW1ldGVycyB1c2VkIGZvciBJclRUUCAqLworICBfX3UzMgkJCW1heF9zZHVfc2l6ZV90eDsKKyAgX191MzIJCQltYXhfZGF0YV9zaXplOworICBfX3U4CQkJbWF4X2hlYWRlcl9zaXplOworICBMT0NBTF9GTE9XCQl0eF9mbG93OwkvKiBTdGF0ZSBvZiB0aGUgVHggcGF0aCBpbiBJclRUUCAqLworCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gSXJMTVAgYW5kIElySUFTIHBhcnQgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiBVc2VkIGZvciBJckRBIERpc2NvdmVyeSBhbmQgc29ja2V0IG5hbWUgcmVzb2x1dGlvbiAqLworICB2b2lkICoJCWNrZXk7CQkvKiBJckxNUCBjbGllbnQgaGFuZGxlICovCisgIF9fdTE2CQkJbWFzazsJCS8qIEhpbnQgYml0cyBtYXNrIChmaWx0ZXIgZGlzY292LikqLworICBpbnQJCQluc2xvdHM7CQkvKiBOdW1iZXIgb2Ygc2xvdHMgZm9yIGRpc2NvdmVyeSAqLworCisgIHN0cnVjdCBpcmlhcF9jYiAqCWlyaWFwOwkJLyogVXNlZCB0byBxdWVyeSByZW1vdGUgSUFTICovCisgIGludAkJCWVycm5vOwkJLyogc3RhdHVzIG9mIHRoZSBJQVMgcXVlcnkgKi8KKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBEaXNjb3ZlcnkgbG9nIHBhcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgLyogVXNlZCBieSBpbml0aWFsIGRpc2NvdmVyeSBvbiB0aGUgY29udHJvbCBjaGFubmVsCisgICAqIGFuZCBieSBpcm5ldF9kaXNjb3Zlcl9kYWRkcl9hbmRfbHNhcF9zZWwoKSAqLworICBzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyAqZGlzY292ZXJpZXM7CS8qIENvcHkgb2YgdGhlIGRpc2NvdmVyeSBsb2cgKi8KKyAgaW50CQkJZGlzY29faW5kZXg7CS8qIExhc3QgcmVhZCBpbiB0aGUgZGlzY292ZXJ5IGxvZyAqLworICBpbnQJCQlkaXNjb19udW1iZXI7CS8qIFNpemUgb2YgdGhlIGRpc2NvdmVyeSBsb2cgKi8KKworfSBpcm5ldF9zb2NrZXQ7CisKKy8qCisgKiBUaGlzIGlzIHRoZSB2YXJpb3VzIGV2ZW50IHRoYXQgd2Ugd2lsbCBnZW5lcmF0ZSBvbiB0aGUgY29udHJvbCBjaGFubmVsCisgKi8KK3R5cGVkZWYgZW51bSBpcm5ldF9ldmVudAoreworICBJUk5FVF9ESVNDT1ZFUiwJCS8qIE5ldyBJck5FVCBub2RlIGRpc2NvdmVyZWQgKi8KKyAgSVJORVRfRVhQSVJFLAkJCS8qIElyTkVUIG5vZGUgZXhwaXJlZCAqLworICBJUk5FVF9DT05ORUNUX1RPLAkJLyogSXJORVQgc29ja2V0IGhhcyBjb25uZWN0ZWQgdG8gb3RoZXIgbm9kZSAqLworICBJUk5FVF9DT05ORUNUX0ZST00sCQkvKiBPdGhlciBub2RlIGhhcyBjb25uZWN0ZWQgdG8gSXJORVQgc29ja2V0ICovCisgIElSTkVUX1JFUVVFU1RfRlJPTSwJCS8qIE5vbiBzYXRpc2ZpZWQgY29ubmVjdGlvbiByZXF1ZXN0ICovCisgIElSTkVUX05PQU5TV0VSX0ZST00sCQkvKiBGYWlsZWQgY29ubmVjdGlvbiByZXF1ZXN0ICovCisgIElSTkVUX0JMT0NLRURfTElOSywJCS8qIExpbmsgKElyTEFQKSBpcyBibG9ja2VkIGZvciA+IDNzICovCisgIElSTkVUX0RJU0NPTk5FQ1RfRlJPTSwJLyogSXJORVQgc29ja2V0IGhhcyBkaXNjb25uZWN0ZWQgKi8KKyAgSVJORVRfRElTQ09OTkVDVF9UTwkJLyogQ2xvc2luZyBJck5FVCBzb2NrZXQgKi8KK30gaXJuZXRfZXZlbnQ7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdG9yYWdlIGZvciBhbiBldmVudCBhbmQgaXRzIGFyZ3VtZW50cworICovCit0eXBlZGVmIHN0cnVjdCBpcm5ldF9sb2cKK3sKKyAgaXJuZXRfZXZlbnQJZXZlbnQ7CisgIGludAkJdW5pdDsKKyAgX191MzIJCXNhZGRyOworICBfX3UzMgkJZGFkZHI7CisgIGNoYXIJCW5hbWVbTklDS05BTUVfTUFYX0xFTiArIDFdOwkvKiAyMSArIDEgKi8KKyAgX191MTZfaG9zdF9vcmRlciBoaW50czsJCQkvKiBEaXNjb3ZlcnkgaGludCBiaXRzICovCit9IGlybmV0X2xvZzsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0b3JhZ2UgZm9yIGFsbCBldmVudHMgYW5kIHJlbGF0ZWQgc3R1ZmYuLi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaXJuZXRfY3RybF9jaGFubmVsCit7CisgIGlybmV0X2xvZwlsb2dbSVJORVRfTUFYX0VWRU5UU107CS8qIEV2ZW50IGxvZyAqLworICBpbnQJCWluZGV4OwkJLyogQ3VycmVudCBpbmRleCBpbiBsb2cgKi8KKyAgc3BpbmxvY2tfdAlzcGlubG9jazsJLyogU2VyaWFsaXplIGFjY2VzcyB0byB0aGUgZXZlbnQgbG9nICovCisgIHdhaXRfcXVldWVfaGVhZF90CXJ3YWl0OwkvKiBwcm9jZXNzZXMgYmxvY2tlZCBvbiByZWFkIChvciBwb2xsKSAqLworfSBpcm5ldF9jdHJsX2NoYW5uZWw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBST1RPVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBHbG9iYWwgZnVuY3Rpb25zIG9mIHRoZSBJck5FVCBtb2R1bGUKKyAqIE5vdGUgOiB3ZSBsaXN0IGhlcmUgYWxzbyBmdW5jdGlvbnMgY2FsbGVkIGZyb20gb25lIGZpbGUgdG8gdGhlIG90aGVyLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElSREEgUEFSVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXh0ZXJuIGludAorCWlyZGFfaXJuZXRfY3JlYXRlKGlybmV0X3NvY2tldCAqKTsJLyogSW5pdGlhbGlzZSBhIElyTkVUIHNvY2tldCAqLworZXh0ZXJuIGludAorCWlyZGFfaXJuZXRfY29ubmVjdChpcm5ldF9zb2NrZXQgKik7CS8qIFRyeSB0byBjb25uZWN0IG92ZXIgSXJEQSAqLworZXh0ZXJuIHZvaWQKKwlpcmRhX2lybmV0X2Rlc3Ryb3koaXJuZXRfc29ja2V0ICopOwkvKiBUZWFyZG93biAgYSBJck5FVCBzb2NrZXQgKi8KK2V4dGVybiBpbnQKKwlpcmRhX2lybmV0X2luaXQodm9pZCk7CQkvKiBJbml0aWFsaXNlIElyREEgcGFydCBvZiBJck5FVCAqLworZXh0ZXJuIHZvaWQKKwlpcmRhX2lybmV0X2NsZWFudXAodm9pZCk7CS8qIFRlYXJkb3duIElyREEgcGFydCBvZiBJck5FVCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNT0RVTEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXh0ZXJuIGludAorCWlybmV0X2luaXQodm9pZCk7CQkvKiBJbml0aWFsaXNlIElyTkVUIG1vZHVsZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWQVJJQUJMRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29udHJvbCBjaGFubmVsIHN0dWZmIC0gYWxsb2NhdGVkIGluIGlybmV0X2lyZGEuaCAqLworZXh0ZXJuIHN0cnVjdCBpcm5ldF9jdHJsX2NoYW5uZWwJaXJuZXRfZXZlbnRzOworCisjZW5kaWYgLyogSVJORVRfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJuZXQvaXJuZXRfaXJkYS5jIGIvbmV0L2lyZGEvaXJuZXQvaXJuZXRfaXJkYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZWMzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcm5ldC9pcm5ldF9pcmRhLmMKQEAgLTAsMCArMSwxODY2IEBACisvKgorICoJSXJORVQgcHJvdG9jb2wgbW9kdWxlIDogU3luY2hyb25vdXMgUFBQIG92ZXIgYW4gSXJEQSBzb2NrZXQuCisgKgorICoJCUplYW4gSUkgLSBIUEwgYDAwIC0gPGp0QGhwbC5ocC5jb20+CisgKgorICogVGhpcyBmaWxlIGltcGxlbWVudCB0aGUgSVJEQSBpbnRlcmZhY2Ugb2YgSXJORVQuCisgKiBCYXNpY2FsbHksIHdlIHNpdCBvbiB0b3Agb2YgSXJUVFAuIFdlIHNldCB1cCBJclRUUCwgSXJJQVMgcHJvcGVybHksCisgKiBhbmQgZXhjaGFuZ2UgZnJhbWVzIHdpdGggSXJUVFAuCisgKi8KKworI2luY2x1ZGUgImlybmV0X2lyZGEuaCIJCS8qIFByaXZhdGUgaGVhZGVyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIENPTlRST0wgQ0hBTk5FTCAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFdoZW4gcHBwIGlzIG5vdCBhY3RpdmUsIC9kZXYvaXJuZXQgYWN0IGFzIGEgY29udHJvbCBjaGFubmVsLgorICogV3JpdGluZyBhbGxvdyB0byBzZXQgdXAgdGhlIElyREEgZGVzdGluYXRpb24gb2YgdGhlIElyTkVUIGNoYW5uZWwsCisgKiBhbmQgYW55IGFwcGxpY2F0aW9uIG1heSBiZSByZWFkIGV2ZW50cyBoYXBwZW5pbmcgb24gSXJORVQuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUG9zdCBhbiBldmVudCB0byB0aGUgY29udHJvbCBjaGFubmVsLi4uCisgKiBQdXQgdGhlIGV2ZW50IGluIHRoZSBsb2csIGFuZCB0aGVuIHdhaXQgYWxsIHByb2Nlc3MgYmxvY2tlZCBvbiByZWFkCisgKiBzbyB0aGV5IGNhbiByZWFkIHRoZSBsb2cuLi4KKyAqLworc3RhdGljIHZvaWQKK2lybmV0X3Bvc3RfZXZlbnQoaXJuZXRfc29ja2V0ICoJYXAsCisJCSBpcm5ldF9ldmVudAlldmVudCwKKwkJIF9fdTMyCQlzYWRkciwKKwkJIF9fdTMyCQlkYWRkciwKKwkJIGNoYXIgKgkJbmFtZSwKKwkJIF9fdTE2CQloaW50cykKK3sKKyAgaW50CQkJaW5kZXg7CQkvKiBJbiB0aGUgbG9nICovCisKKyAgREVOVEVSKENUUkxfVFJBQ0UsICIoYXA9MHglcCwgZXZlbnQ9JWQsIGRhZGRyPSUwOHgsIG5hbWU9YGAlcycnKVxuIiwKKwkgYXAsIGV2ZW50LCBkYWRkciwgbmFtZSk7CisKKyAgLyogUHJvdGVjdCB0aGlzIHNlY3Rpb24gdmlhIHNwaW5sb2NrLgorICAgKiBOb3RlIDogYXMgd2UgYXJlIHRoZSBvbmx5IGV2ZW50IHByb2R1Y2VyLCB3ZSBvbmx5IG5lZWQgdG8gZXhjbHVkZQorICAgKiBvdXJzZWxmIHdoZW4gdG91Y2hpbmcgdGhlIGxvZywgd2hpY2ggaXMgbmljZSBhbmQgZWFzeS4KKyAgICovCisgIHNwaW5fbG9ja19iaCgmaXJuZXRfZXZlbnRzLnNwaW5sb2NrKTsKKworICAvKiBDb3B5IHRoZSBldmVudCBpbiB0aGUgbG9nICovCisgIGluZGV4ID0gaXJuZXRfZXZlbnRzLmluZGV4OworICBpcm5ldF9ldmVudHMubG9nW2luZGV4XS5ldmVudCA9IGV2ZW50OworICBpcm5ldF9ldmVudHMubG9nW2luZGV4XS5kYWRkciA9IGRhZGRyOworICBpcm5ldF9ldmVudHMubG9nW2luZGV4XS5zYWRkciA9IHNhZGRyOworICAvKiBUcnkgdG8gY29weSBJckRBIG5pY2tuYW1lICovCisgIGlmKG5hbWUpCisgICAgc3RyY3B5KGlybmV0X2V2ZW50cy5sb2dbaW5kZXhdLm5hbWUsIG5hbWUpOworICBlbHNlCisgICAgaXJuZXRfZXZlbnRzLmxvZ1tpbmRleF0ubmFtZVswXSA9ICdcMCc7CisgIC8qIENvcHkgaGludHMgKi8KKyAgaXJuZXRfZXZlbnRzLmxvZ1tpbmRleF0uaGludHMud29yZCA9IGhpbnRzOworICAvKiBUcnkgdG8gZ2V0IHBwcCB1bml0IG51bWJlciAqLworICBpZigoYXAgIT0gKGlybmV0X3NvY2tldCAqKSBOVUxMKSAmJiAoYXAtPnBwcF9vcGVuKSkKKyAgICBpcm5ldF9ldmVudHMubG9nW2luZGV4XS51bml0ID0gcHBwX3VuaXRfbnVtYmVyKCZhcC0+Y2hhbik7CisgIGVsc2UKKyAgICBpcm5ldF9ldmVudHMubG9nW2luZGV4XS51bml0ID0gLTE7CisKKyAgLyogSW5jcmVtZW50IHRoZSBpbmRleAorICAgKiBOb3RlIHRoYXQgd2UgaW5jcmVtZW50IHRoZSBpbmRleCBvbmx5IGFmdGVyIHRoZSBldmVudCBpcyB3cml0dGVuLAorICAgKiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVhZGVycyBkb24ndCBnZXQgZ2FyYmFnZS4uLiAqLworICBpcm5ldF9ldmVudHMuaW5kZXggPSAoaW5kZXggKyAxKSAlIElSTkVUX01BWF9FVkVOVFM7CisKKyAgREVCVUcoQ1RSTF9JTkZPLCAiTmV3IGV2ZW50IGluZGV4IGlzICVkXG4iLCBpcm5ldF9ldmVudHMuaW5kZXgpOworCisgIC8qIFNwaW4gbG9jayBlbmQgKi8KKyAgc3Bpbl91bmxvY2tfYmgoJmlybmV0X2V2ZW50cy5zcGlubG9jayk7CisKKyAgLyogTm93IDogd2FrZSB1cCBldmVyeWJvZHkgd2FpdGluZyBmb3IgZXZlbnRzLi4uICovCisgIHdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmlybmV0X2V2ZW50cy5yd2FpdCk7CisKKyAgREVYSVQoQ1RSTF9UUkFDRSwgIlxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIElSREEgU1VCUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGVzZSBhcmUgYSBidW5jaCBvZiBzdWJyb3V0aW5lcyBjYWxsZWQgZnJvbSBvdGhlciBmdW5jdGlvbnMKKyAqIGRvd24gdGhlcmUsIG1vc3RseSBjb21tb24gY29kZSBvciB0byBpbXByb3ZlIHJlYWRhYmlsaXR5Li4uCisgKgorICogTm90ZSA6IHdlIGR1cGxpY2F0ZSBxdWl0ZSBoZWF2aWx5IHNvbWUgcm91dGluZXMgb2YgYWZfaXJkYS5jLAorICogYmVjYXVzZSBvdXIgaW5wdXQgc3RydWN0dXJlIChzZWxmKSBpcyBxdWl0ZSBkaWZmZXJlbnQKKyAqIChzdHJ1Y3QgaXJuZXQgaW5zdGVhZCBvZiBzdHJ1Y3QgaXJkYV9zb2NrKSwgd2hpY2ggbWFrZSBzaGFyaW5nCisgKiB0aGUgc2FtZSBjb2RlIGltcG9zc2libGUgKGF0IGxlYXN0LCB3aXRob3V0IHRlbXBsYXRlcykuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfb3Blbl90c2FwIChzZWxmKQorICoKKyAqICAgIE9wZW4gbG9jYWwgVHJhbnNwb3J0IFNlcnZpY2UgQWNjZXNzIFBvaW50IChUU0FQKQorICoKKyAqIENyZWF0ZSBhIElyVFRQIGluc3RhbmNlIGZvciB1cyBhbmQgc2V0IGFsbCB0aGUgSXJUVFAgY2FsbGJhY2tzLgorICovCitzdGF0aWMgaW5saW5lIGludAoraXJuZXRfb3Blbl90c2FwKGlybmV0X3NvY2tldCAqCXNlbGYpCit7CisgIG5vdGlmeV90CW5vdGlmeTsJCS8qIENhbGxiYWNrIHN0cnVjdHVyZSAqLworCisgIERFTlRFUihJUkRBX1NSX1RSQUNFLCAiKHNlbGY9MHglcClcbiIsIHNlbGYpOworCisgIERBQk9SVChzZWxmLT50c2FwICE9IE5VTEwsIC1FQlVTWSwgSVJEQV9TUl9FUlJPUiwgIkFscmVhZHkgYnVzeSAhXG4iKTsKKworICAvKiBJbml0aWFsaXplIElyVFRQIGNhbGxiYWNrcyB0byBiZSB1c2VkIGJ5IHRoZSBJckRBIHN0YWNrICovCisgIGlyZGFfbm90aWZ5X2luaXQoJm5vdGlmeSk7CisgIG5vdGlmeS5jb25uZWN0X2NvbmZpcm0JPSBpcm5ldF9jb25uZWN0X2NvbmZpcm07CisgIG5vdGlmeS5jb25uZWN0X2luZGljYXRpb24JPSBpcm5ldF9jb25uZWN0X2luZGljYXRpb247CisgIG5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24JPSBpcm5ldF9kaXNjb25uZWN0X2luZGljYXRpb247CisgIG5vdGlmeS5kYXRhX2luZGljYXRpb24JPSBpcm5ldF9kYXRhX2luZGljYXRpb247CisgIC8qbm90aWZ5LnVkYXRhX2luZGljYXRpb24JPSBOVUxMOyovCisgIG5vdGlmeS5mbG93X2luZGljYXRpb24JPSBpcm5ldF9mbG93X2luZGljYXRpb247CisgIG5vdGlmeS5zdGF0dXNfaW5kaWNhdGlvbgk9IGlybmV0X3N0YXR1c19pbmRpY2F0aW9uOworICBub3RpZnkuaW5zdGFuY2UJCT0gc2VsZjsKKyAgc3RybGNweShub3RpZnkubmFtZSwgSVJORVRfTk9USUZZX05BTUUsIHNpemVvZihub3RpZnkubmFtZSkpOworCisgIC8qIE9wZW4gYW4gSXJUVFAgaW5zdGFuY2UgKi8KKyAgc2VsZi0+dHNhcCA9IGlydHRwX29wZW5fdHNhcChMU0FQX0FOWSwgREVGQVVMVF9JTklUSUFMX0NSRURJVCwKKwkJCSAgICAgICAmbm90aWZ5KTsJCisgIERBQk9SVChzZWxmLT50c2FwID09IE5VTEwsIC1FTk9NRU0sCisJIElSREFfU1JfRVJST1IsICJVbmFibGUgdG8gYWxsb2NhdGUgVFNBUCAhXG4iKTsKKworICAvKiBSZW1lbWJlciB3aGljaCBUU0FQIHNlbGVjdG9yIHdlIGFjdHVhbGx5IGdvdCAqLworICBzZWxmLT5zdHNhcF9zZWwgPSBzZWxmLT50c2FwLT5zdHNhcF9zZWw7CisKKyAgREVYSVQoSVJEQV9TUl9UUkFDRSwgIiAtIHRzYXA9MHglcCwgc2VsPTB4JVhcbiIsCisJc2VsZi0+dHNhcCwgc2VsZi0+c3RzYXBfc2VsKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9pYXNfdG9fdHNhcCAoc2VsZiwgcmVzdWx0LCB2YWx1ZSkKKyAqCisgKiAgICBFeGFtaW5lIGFuIElBUyBvYmplY3QgYW5kIGV4dHJhY3QgVFNBUAorICoKKyAqIFdlIGRvIGFuIElBUCBxdWVyeSB0byBmaW5kIHRoZSBUU0FQIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXJORVQgc2VydmljZS4KKyAqIFdoZW4gSXJJQVAgcGFzcyB1cyB0aGUgcmVzdWx0IG9mIHRoZSBxdWVyeSwgdGhpcyBmdW5jdGlvbiBsb29rIGF0CisgKiB0aGUgcmV0dXJuIHZhbHVlcyB0byBjaGVjayBmb3IgZmFpbHVyZXMgYW5kIGV4dHJhY3QgdGhlIFRTQVAgaWYKKyAqIHBvc3NpYmxlLgorICogQWxzbyBkZWFsbG9jYXRlIHZhbHVlCisgKiBUaGUgZmFpbHVyZSBpcyBpbiBzZWxmLT5lcnJubworICogUmV0dXJuIFRTQVAgb3IgLTEKKyAqLworc3RhdGljIGlubGluZSBfX3U4Citpcm5ldF9pYXNfdG9fdHNhcChpcm5ldF9zb2NrZXQgKglzZWxmLAorCQkgIGludAkJCXJlc3VsdCwKKwkJICBzdHJ1Y3QgaWFzX3ZhbHVlICoJdmFsdWUpCit7CisgIF9fdTgJZHRzYXBfc2VsID0gMDsJCS8qIFRTQVAgd2UgYXJlIGxvb2tpbmcgZm9yICovCisKKyAgREVOVEVSKElSREFfU1JfVFJBQ0UsICIoc2VsZj0weCVwKVxuIiwgc2VsZik7CisKKyAgLyogQnkgZGVmYXVsdCwgbm8gZXJyb3IgKi8KKyAgc2VsZi0+ZXJybm8gPSAwOworCisgIC8qIENoZWNrIGlmIHJlcXVlc3Qgc3VjY2VlZGVkICovCisgIHN3aXRjaChyZXN1bHQpCisgICAgeworICAgICAgLyogU3RhbmRhcmQgZXJyb3JzIDogc2VydmljZSBub3QgYXZhaWxhYmxlICovCisgICAgY2FzZSBJQVNfQ0xBU1NfVU5LTk9XTjoKKyAgICBjYXNlIElBU19BVFRSSUJfVU5LTk9XTjoKKyAgICAgIERFQlVHKElSREFfU1JfSU5GTywgIklBUyBvYmplY3QgZG9lc24ndCBleGlzdCAhICglZClcbiIsIHJlc3VsdCk7CisgICAgICBzZWxmLT5lcnJubyA9IC1FQUREUk5PVEFWQUlMOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIE90aGVyIGVycm9ycywgbW9zdCBsaWtlbHkgSXJEQSBzdGFjayBmYWlsdXJlICovCisgICAgZGVmYXVsdCA6CisgICAgICBERUJVRyhJUkRBX1NSX0lORk8sICJJQVMgcXVlcnkgZmFpbGVkICEgKCVkKVxuIiwgcmVzdWx0KTsKKyAgICAgIHNlbGYtPmVycm5vID0gLUVIT1NUVU5SRUFDSDsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBTdWNjZXNzIDogd2UgZ290IHdoYXQgd2Ugd2FudGVkICovCisgICAgY2FzZSBJQVNfU1VDQ0VTUzoKKyAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBDaGVjayB3aGF0IHdhcyByZXR1cm5lZCB0byB1cyAqLworICBpZih2YWx1ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFdoYXQgdHlwZSBvZiBhcmd1bWVudCBoYXZlIHdlIGdvdCA/ICovCisgICAgICBzd2l0Y2godmFsdWUtPnR5cGUpCisJeworCWNhc2UgSUFTX0lOVEVHRVI6CisJICBERUJVRyhJUkRBX1NSX0lORk8sICJyZXN1bHQ9JWRcbiIsIHZhbHVlLT50LmludGVnZXIpOworCSAgaWYodmFsdWUtPnQuaW50ZWdlciAhPSAtMSkKKwkgICAgLyogR2V0IHRoZSByZW1vdGUgVFNBUCBzZWxlY3RvciAqLworCSAgICBkdHNhcF9zZWwgPSB2YWx1ZS0+dC5pbnRlZ2VyOworCSAgZWxzZSAKKwkgICAgc2VsZi0+ZXJybm8gPSAtRUFERFJOT1RBVkFJTDsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBzZWxmLT5lcnJubyA9IC1FQUREUk5PVEFWQUlMOworCSAgREVSUk9SKElSREFfU1JfRVJST1IsICJiYWQgdHlwZSAhICgweCVYKVxuIiwgdmFsdWUtPnR5cGUpOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBDbGVhbnVwICovCisgICAgICBpcmlhc19kZWxldGVfdmFsdWUodmFsdWUpOworICAgIH0KKyAgZWxzZQkvKiB2YWx1ZSA9PSBOVUxMICovCisgICAgeworICAgICAgLyogTm90aGluZyByZXR1cm5lZCB0byB1cyAtIHVzdWFsbHkgcmVzdWx0ICE9IFNVQ0NFU1MgKi8KKyAgICAgIGlmKCEoc2VsZi0+ZXJybm8pKQorCXsKKwkgIERFUlJPUihJUkRBX1NSX0VSUk9SLAorCQkgIklyREEgYnVnIDogcmVzdWx0ID09IFNVQ0NFU1MgJiYgdmFsdWUgPT0gTlVMTFxuIik7CisJICBzZWxmLT5lcnJubyA9IC1FSE9TVFVOUkVBQ0g7CisJfQorICAgIH0KKyAgREVYSVQoSVJEQV9TUl9UUkFDRSwgIlxuIik7CisKKyAgLyogUmV0dXJuIHRoZSBUU0FQICovCisgIHJldHVybihkdHNhcF9zZWwpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfZmluZF9sc2FwX3NlbCAoc2VsZikKKyAqCisgKiAgICBUcnkgdG8gbG9va3VwIExTQVAgc2VsZWN0b3IgaW4gcmVtb3RlIExNLUlBUworICoKKyAqIEJhc2ljYWxseSwgd2Ugc3RhcnQgYSBJQVAgcXVlcnksIGFuZCB0aGVuIGdvIHRvIHNsZWVwLiBXaGVuIHRoZSBxdWVyeQorICogcmV0dXJuLCBpcm5ldF9nZXR2YWx1ZV9jb25maXJtIHdpbGwgd2FrZSB1cyB1cCwgYW5kIHdlIGNhbiBleGFtaW5lIHRoZQorICogcmVzdWx0IG9mIHRoZSBxdWVyeS4uLgorICogTm90ZSB0aGF0IGluIHNvbWUgY2FzZSwgdGhlIHF1ZXJ5IGZhaWwgZXZlbiBiZWZvcmUgd2UgZ28gdG8gc2xlZXAsCisgKiBjcmVhdGluZyBzb21lIHJhY2VzLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citpcm5ldF9maW5kX2xzYXBfc2VsKGlybmV0X3NvY2tldCAqCXNlbGYpCit7CisgIERFTlRFUihJUkRBX1NSX1RSQUNFLCAiKHNlbGY9MHglcClcbiIsIHNlbGYpOworCisgIC8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KKyAgREFCT1JUKHNlbGYtPmlyaWFwLCAtRUJVU1ksIElSREFfU1JfRVJST1IsICJidXN5IHdpdGggYSBwcmV2aW91cyBxdWVyeS5cbiIpOworCisgIC8qIENyZWF0ZSBhbiBJQVAgaW5zdGFuY2UsIHdpbGwgYmUgY2xvc2VkIGluIGlybmV0X2dldHZhbHVlX2NvbmZpcm0oKSAqLworICBzZWxmLT5pcmlhcCA9IGlyaWFwX29wZW4oTFNBUF9BTlksIElBU19DTElFTlQsIHNlbGYsCisJCQkgICBpcm5ldF9nZXR2YWx1ZV9jb25maXJtKTsKKworICAvKiBUcmVhdCB1bmV4cGVjdGVkIHNpZ25hbHMgYXMgZGlzY29ubmVjdCAqLworICBzZWxmLT5lcnJubyA9IC1FSE9TVFVOUkVBQ0g7CisKKyAgLyogUXVlcnkgcmVtb3RlIExNLUlBUyAqLworICBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdChzZWxmLT5pcmlhcCwgc2VsZi0+cnNhZGRyLCBzZWxmLT5kYWRkciwKKwkJCQlJUk5FVF9TRVJWSUNFX05BTUUsIElSTkVUX0lBU19WQUxVRSk7CisKKyAgLyogVGhlIGFib3ZlIHJlcXVlc3QgaXMgbm9uLWJsb2NraW5nLgorICAgKiBBZnRlciBhIHdoaWxlLCBJckRBIHdpbGwgY2FsbCB1cyBiYWNrIGluIGlybmV0X2dldHZhbHVlX2NvbmZpcm0oKQorICAgKiBXZSB3aWxsIHRoZW4gY2FsbCBpcm5ldF9pYXNfdG9fdHNhcCgpIGFuZCBmaW5pc2ggdGhlCisgICAqIGNvbm5lY3Rpb24gcHJvY2VkdXJlICovCisKKyAgREVYSVQoSVJEQV9TUl9UUkFDRSwgIlxuIik7CisgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfY29ubmVjdF90c2FwIChzZWxmKQorICoKKyAqICAgIEluaXRpYWxpc2UgdGhlIFRUUCBzb2NrZXQgYW5kIGluaXRpYXRlIFRUUCBjb25uZWN0aW9uCisgKgorICovCitzdGF0aWMgaW5saW5lIGludAoraXJuZXRfY29ubmVjdF90c2FwKGlybmV0X3NvY2tldCAqCXNlbGYpCit7CisgIGludAkJZXJyOworCisgIERFTlRFUihJUkRBX1NSX1RSQUNFLCAiKHNlbGY9MHglcClcbiIsIHNlbGYpOworCisgIC8qIE9wZW4gYSBsb2NhbCBUU0FQIChhbiBJclRUUCBpbnN0YW5jZSkgKi8KKyAgZXJyID0gaXJuZXRfb3Blbl90c2FwKHNlbGYpOworICBpZihlcnIgIT0gMCkKKyAgICB7CisgICAgICBjbGVhcl9iaXQoMCwgJnNlbGYtPnR0cF9jb25uZWN0KTsKKyAgICAgIERFUlJPUihJUkRBX1NSX0VSUk9SLCAiY29ubmVjdCBhYm9ydGVkIVxuIik7CisgICAgICByZXR1cm4oZXJyKTsKKyAgICB9CisKKyAgLyogQ29ubmVjdCB0byByZW1vdGUgZGV2aWNlICovCisgIGVyciA9IGlydHRwX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwLCBzZWxmLT5kdHNhcF9zZWwsIAorCQkJICAgICAgc2VsZi0+cnNhZGRyLCBzZWxmLT5kYWRkciwgTlVMTCwgCisJCQkgICAgICBzZWxmLT5tYXhfc2R1X3NpemVfcngsIE5VTEwpOworICBpZihlcnIgIT0gMCkKKyAgICB7CisgICAgICBjbGVhcl9iaXQoMCwgJnNlbGYtPnR0cF9jb25uZWN0KTsKKyAgICAgIERFUlJPUihJUkRBX1NSX0VSUk9SLCAiY29ubmVjdCBhYm9ydGVkIVxuIik7CisgICAgICByZXR1cm4oZXJyKTsKKyAgICB9CisKKyAgLyogVGhlIGFib3ZlIGNhbGwgaXMgbm9uLWJsb2NraW5nLgorICAgKiBBZnRlciBhIHdoaWxlLCB0aGUgSXJEQSBzdGFjayB3aWxsIGVpdGhlciBjYWxsIHVzIGJhY2sgaW4KKyAgICogaXJuZXRfY29ubmVjdF9jb25maXJtKCkgb3IgaXJuZXRfZGlzY29ubmVjdF9pbmRpY2F0aW9uKCkKKyAgICogU2VlIHlvdSB0aGVyZSA7LSkgKi8KKworICBERVhJVChJUkRBX1NSX1RSQUNFLCAiXG4iKTsKKyAgcmV0dXJuKGVycik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9kaXNjb3Zlcl9uZXh0X2RhZGRyIChzZWxmKQorICoKKyAqICAgIFF1ZXJ5IHRoZSBJck5FVCBUU0FQIG9mIHRoZSBuZXh0IGRldmljZSBpbiB0aGUgbG9nLgorICoKKyAqIFVzZWQgaW4gdGhlIFRTQVAgZGlzY292ZXJ5IHByb2NlZHVyZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lybmV0X2Rpc2NvdmVyX25leHRfZGFkZHIoaXJuZXRfc29ja2V0ICoJc2VsZikKK3sKKyAgLyogQ2xvc2UgdGhlIGxhc3QgaW5zdGFuY2Ugb2YgSXJJQVAsIGFuZCBvcGVuIGEgbmV3IG9uZS4KKyAgICogV2UgY2FuJ3QgcmV1c2UgdGhlIElySUFQIGluc3RhbmNlIGluIHRoZSBJcklBUCBjYWxsYmFjayAqLworICBpZihzZWxmLT5pcmlhcCkKKyAgICB7CisgICAgICBpcmlhcF9jbG9zZShzZWxmLT5pcmlhcCk7CisgICAgICBzZWxmLT5pcmlhcCA9IE5VTEw7CisgICAgfQorICAvKiBDcmVhdGUgYSBuZXcgSUFQIGluc3RhbmNlICovCisgIHNlbGYtPmlyaWFwID0gaXJpYXBfb3BlbihMU0FQX0FOWSwgSUFTX0NMSUVOVCwgc2VsZiwKKwkJCSAgIGlybmV0X2Rpc2NvdmVydmFsdWVfY29uZmlybSk7CisgIGlmKHNlbGYtPmlyaWFwID09IE5VTEwpCisgICAgcmV0dXJuIC1FTk9NRU07CisKKyAgLyogTmV4dCBkaXNjb3ZlcnkgLSBiZWZvcmUgdGhlIGNhbGwgdG8gYXZvaWQgcmFjZXMgKi8KKyAgc2VsZi0+ZGlzY29faW5kZXgrKzsKKworICAvKiBDaGVjayBpZiB3ZSBoYXZlIG9uZSBtb3JlIGFkZHJlc3MgdG8gdHJ5ICovCisgIGlmKHNlbGYtPmRpc2NvX2luZGV4IDwgc2VsZi0+ZGlzY29fbnVtYmVyKQorICAgIHsKKyAgICAgIC8qIFF1ZXJ5IHJlbW90ZSBMTS1JQVMgKi8KKyAgICAgIGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KHNlbGYtPmlyaWFwLAorCQkJCSAgICBzZWxmLT5kaXNjb3Zlcmllc1tzZWxmLT5kaXNjb19pbmRleF0uc2FkZHIsCisJCQkJICAgIHNlbGYtPmRpc2NvdmVyaWVzW3NlbGYtPmRpc2NvX2luZGV4XS5kYWRkciwKKwkJCQkgICAgSVJORVRfU0VSVklDRV9OQU1FLCBJUk5FVF9JQVNfVkFMVUUpOworICAgICAgLyogVGhlIGFib3ZlIHJlcXVlc3QgaXMgbm9uLWJsb2NraW5nLgorICAgICAgICogQWZ0ZXIgYSB3aGlsZSwgSXJEQSB3aWxsIGNhbGwgdXMgYmFjayBpbiBpcm5ldF9kaXNjb3ZlcnZhbHVlX2NvbmZpcm0oKQorICAgICAgICogV2Ugd2lsbCB0aGVuIGNhbGwgaXJuZXRfaWFzX3RvX3RzYXAoKSBhbmQgY29tZSBiYWNrIGhlcmUgYWdhaW4uLi4gKi8KKyAgICAgIHJldHVybigwKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4oMSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9kaXNjb3Zlcl9kYWRkcl9hbmRfbHNhcF9zZWwgKHNlbGYpCisgKgorICogICAgVGhpcyB0cnkgdG8gZmluZCBhIGRldmljZSB3aXRoIHRoZSByZXF1ZXN0ZWQgc2VydmljZS4KKyAqCisgKiBJbml0aWF0ZSBhIFRTQVAgZGlzY292ZXJ5IHByb2NlZHVyZS4KKyAqIEl0IGJhc2ljYWxseSBsb29rIGludG8gdGhlIGRpc2NvdmVyeSBsb2cuIEZvciBlYWNoIGFkZHJlc3MgaW4gdGhlIGxpc3QsCisgKiBpdCBxdWVyaWVzIHRoZSBMTS1JQVMgb2YgdGhlIGRldmljZSB0byBmaW5kIGlmIHRoaXMgZGV2aWNlIG9mZmVyCisgKiB0aGUgcmVxdWVzdGVkIHNlcnZpY2UuCisgKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIG5vZGUgc3VwcG9ydGluZyB0aGUgc2VydmljZSwgd2UgY29tcGxhaW4KKyAqIHRvIHRoZSB1c2VyIChpdCBzaG91bGQgbW92ZSBkZXZpY2VzIGFyb3VuZCkuCisgKiBJZiB3ZSBmaW5kIG9uZSBub2RlIHdoaWNoIGhhdmUgdGhlIHJlcXVlc3RlZCBUU0FQLCB3ZSBjb25uZWN0IHRvIGl0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24ganVzdCBzdGFydCB0aGUgd2hvbGUgcHJvY2VkdXJlLiBJdCByZXF1ZXN0IHRoZSBkaXNjb3ZlcnkKKyAqIGxvZyBhbmQgc3VibWl0IHRoZSBmaXJzdCBJQVMgcXVlcnkuCisgKiBUaGUgYnVsayBvZiB0aGUgam9iIGlzIGhhbmRsZWQgaW4gaXJuZXRfZGlzY292ZXJ2YWx1ZV9jb25maXJtKCkKKyAqCisgKiBOb3RlIDogdGhpcyBwcm9jZWR1cmUgZmFpbHMgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBkZXZpY2UgaW4gcmFuZ2UKKyAqIG9uIHRoZSBzYW1lIGRvbmdsZSwgYmVjYXVzZSBJckxNUCBkb2Vzbid0IGRpc2Nvbm5lY3QgdGhlIExBUCB3aGVuIHRoZQorICogbGFzdCBMU0FQIGlzIGNsb3NlZC4gTW9yZW92ZXIsIHdlIHdvdWxkIG5lZWQgdG8gd2FpdCB0aGUgTEFQCisgKiBkaXNjb25uZWN0aW9uLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citpcm5ldF9kaXNjb3Zlcl9kYWRkcl9hbmRfbHNhcF9zZWwoaXJuZXRfc29ja2V0ICoJc2VsZikKK3sKKyAgaW50CXJldDsKKworICBERU5URVIoSVJEQV9TUl9UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKworICAvKiBBc2sgbG1wIGZvciB0aGUgY3VycmVudCBkaXNjb3ZlcnkgbG9nICovCisgIHNlbGYtPmRpc2NvdmVyaWVzID0gaXJsbXBfZ2V0X2Rpc2NvdmVyaWVzKCZzZWxmLT5kaXNjb19udW1iZXIsIHNlbGYtPm1hc2ssCisJCQkJCSAgICBESVNDT1ZFUllfREVGQVVMVF9TTE9UUyk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIHdlIGdvdCBzb21lIHJlc3VsdHMgKi8KKyAgaWYoc2VsZi0+ZGlzY292ZXJpZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBzZWxmLT5kaXNjb19udW1iZXIgPSAtMTsKKyAgICAgIGNsZWFyX2JpdCgwLCAmc2VsZi0+dHRwX2Nvbm5lY3QpOworICAgICAgRFJFVFVSTigtRU5FVFVOUkVBQ0gsIElSREFfU1JfSU5GTywgIk5vIENhY2hlbG9nLi4uXG4iKTsKKyAgICB9CisgIERFQlVHKElSREFfU1JfSU5GTywgIkdvdCB0aGUgbG9nICgweCVwKSwgc2l6ZSBpcyAlZFxuIiwKKwlzZWxmLT5kaXNjb3Zlcmllcywgc2VsZi0+ZGlzY29fbnVtYmVyKTsKKworICAvKiBTdGFydCB3aXRoIHRoZSBmaXJzdCBkaXNjb3ZlcnkgKi8KKyAgc2VsZi0+ZGlzY29faW5kZXggPSAtMTsKKyAgc2VsZi0+ZGFkZHIgPSBERVZfQUREUl9BTlk7CisKKyAgLyogVGhpcyB3aWxsIGZhaWwgaWYgdGhlIGxvZyBpcyBlbXB0eSAtIHRoaXMgaXMgbm9uLWJsb2NraW5nICovCisgIHJldCA9IGlybmV0X2Rpc2NvdmVyX25leHRfZGFkZHIoc2VsZik7CisgIGlmKHJldCkKKyAgICB7CisgICAgICAvKiBDbG9zZSBJQVAgKi8KKyAgICAgIGlmKHNlbGYtPmlyaWFwKQorCWlyaWFwX2Nsb3NlKHNlbGYtPmlyaWFwKTsKKyAgICAgIHNlbGYtPmlyaWFwID0gTlVMTDsKKworICAgICAgLyogQ2xlYW51cCBvdXIgY29weSBvZiB0aGUgZGlzY292ZXJ5IGxvZyAqLworICAgICAga2ZyZWUoc2VsZi0+ZGlzY292ZXJpZXMpOworICAgICAgc2VsZi0+ZGlzY292ZXJpZXMgPSBOVUxMOworCisgICAgICBjbGVhcl9iaXQoMCwgJnNlbGYtPnR0cF9jb25uZWN0KTsKKyAgICAgIERSRVRVUk4oLUVORVRVTlJFQUNILCBJUkRBX1NSX0lORk8sICJDYWNoZWxvZyBlbXB0eS4uLlxuIik7CisgICAgfQorCisgIC8qIEZvbGxvdyBtZSBpbiBpcm5ldF9kaXNjb3ZlcnZhbHVlX2NvbmZpcm0oKSAqLworCisgIERFWElUKElSREFfU1JfVFJBQ0UsICJcbiIpOworICByZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9kbmFtZV90b19kYWRkciAoc2VsZikKKyAqCisgKiAgICBDb252ZXJ0IGFuIElyREEgbmlja25hbWUgdG8gYSB2YWxpZCBJckRBIGFkZHJlc3MKKyAqCisgKiBJdCBiYXNpY2FsbHkgbG9vayBpbnRvIHRoZSBkaXNjb3ZlcnkgbG9nIHVudGlsIHRoZXJlIGlzIGEgbWF0Y2guCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citpcm5ldF9kbmFtZV90b19kYWRkcihpcm5ldF9zb2NrZXQgKglzZWxmKQoreworICBzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyAqZGlzY292ZXJpZXM7CS8qIENvcHkgb2YgdGhlIGRpc2NvdmVyeSBsb2cgKi8KKyAgaW50CW51bWJlcjsJCQkvKiBOdW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGxvZyAqLworICBpbnQJaTsKKworICBERU5URVIoSVJEQV9TUl9UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKworICAvKiBBc2sgbG1wIGZvciB0aGUgY3VycmVudCBkaXNjb3ZlcnkgbG9nICovCisgIGRpc2NvdmVyaWVzID0gaXJsbXBfZ2V0X2Rpc2NvdmVyaWVzKCZudW1iZXIsIDB4ZmZmZiwKKwkJCQkgICAgICBESVNDT1ZFUllfREVGQVVMVF9TTE9UUyk7CisgIC8qIENoZWNrIGlmIHRoZSB3ZSBnb3Qgc29tZSByZXN1bHRzICovCisgIGlmKGRpc2NvdmVyaWVzID09IE5VTEwpCisgICAgRFJFVFVSTigtRU5FVFVOUkVBQ0gsIElSREFfU1JfSU5GTywgIkNhY2hlbG9nIGVtcHR5Li4uXG4iKTsKKworICAvKiAKKyAgICogTm93LCBjaGVjayBhbGwgZGlzY292ZXJlZCBkZXZpY2VzIChpZiBhbnkpLCBhbmQgY29ubmVjdAorICAgKiBjbGllbnQgb25seSBhYm91dCB0aGUgc2VydmljZXMgdGhhdCB0aGUgY2xpZW50IGlzCisgICAqIGludGVyZXN0ZWQgaW4uLi4KKyAgICovCisgIGZvcihpID0gMDsgaSA8IG51bWJlcjsgaSsrKQorICAgIHsKKyAgICAgIC8qIERvZXMgdGhlIG5hbWUgbWF0Y2ggPyAqLworICAgICAgaWYoIXN0cm5jbXAoZGlzY292ZXJpZXNbaV0uaW5mbywgc2VsZi0+cm5hbWUsIE5JQ0tOQU1FX01BWF9MRU4pKQorCXsKKwkgIC8qIFllcyAhISEgR2V0IGl0Li4gKi8KKwkgIHNlbGYtPmRhZGRyID0gZGlzY292ZXJpZXNbaV0uZGFkZHI7CisJICBERUJVRyhJUkRBX1NSX0lORk8sICJkaXNjb3ZlcmVkIGRldmljZSBgYCVzJycgYXQgYWRkcmVzcyAweCUwOHguXG4iLAorCQlzZWxmLT5ybmFtZSwgc2VsZi0+ZGFkZHIpOworCSAga2ZyZWUoZGlzY292ZXJpZXMpOworCSAgREVYSVQoSVJEQV9TUl9UUkFDRSwgIlxuIik7CisJICByZXR1cm4gMDsKKwl9CisgICAgfQorICAvKiBObyBsdWNrICEgKi8KKyAgREVCVUcoSVJEQV9TUl9JTkZPLCAiY2Fubm90IGRpc2NvdmVyIGRldmljZSBgYCVzJycgISEhXG4iLCBzZWxmLT5ybmFtZSk7CisgIGtmcmVlKGRpc2NvdmVyaWVzKTsKKyAgcmV0dXJuKC1FQUREUk5PVEFWQUlMKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBTT0NLRVQgUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIGFyZSB0aGUgbWFpbiBvcGVyYXRpb25zIG9uIElyTkVUIHNvY2tldHMsIGJhc2ljYWxseSB0byBjcmVhdGUKKyAqIGFuZCBkZXN0cm95IElyTkVUIHNvY2tldHMuIFRoZXNlIGFyZSBjYWxsZWQgZnJvbSB0aGUgUFBQIHBhcnQuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ3JlYXRlIGEgSXJORVQgaW5zdGFuY2UgOiBqdXN0IGluaXRpYWxpc2Ugc29tZSBwYXJhbWV0ZXJzLi4uCisgKi8KK2ludAoraXJkYV9pcm5ldF9jcmVhdGUoaXJuZXRfc29ja2V0ICoJc2VsZikKK3sKKyAgREVOVEVSKElSREFfU09DS19UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKworICBzZWxmLT5tYWdpYyA9IElSTkVUX01BR0lDOwkvKiBQYXJhbm9pYSAqLworCisgIHNlbGYtPnR0cF9vcGVuID0gMDsJCS8qIFByZXZlbnQgaGlnaGVyIGxheWVyIGZyb20gYWNjZXNzaW5nIElyVFRQICovCisgIHNlbGYtPnR0cF9jb25uZWN0ID0gMDsJLyogTm90IGNvbm5lY3RpbmcgeWV0ICovCisgIHNlbGYtPnJuYW1lWzBdID0gJ1wwJzsJLyogTWF5IGJlIHNldCB2aWEgY29udHJvbCBjaGFubmVsICovCisgIHNlbGYtPnJkYWRkciA9IERFVl9BRERSX0FOWTsJLyogTWF5IGJlIHNldCB2aWEgY29udHJvbCBjaGFubmVsICovCisgIHNlbGYtPnJzYWRkciA9IERFVl9BRERSX0FOWTsJLyogTWF5IGJlIHNldCB2aWEgY29udHJvbCBjaGFubmVsICovCisgIHNlbGYtPmRhZGRyID0gREVWX0FERFJfQU5ZOwkvKiBVbnRpbCB3ZSBnZXQgY29ubmVjdGVkICovCisgIHNlbGYtPnNhZGRyID0gREVWX0FERFJfQU5ZOwkvKiBVbnRpbCB3ZSBnZXQgY29ubmVjdGVkICovCisgIHNlbGYtPm1heF9zZHVfc2l6ZV9yeCA9IFRUUF9TQVJfVU5CT1VORDsKKworICAvKiBSZWdpc3RlciBhcyBhIGNsaWVudCB3aXRoIElyTE1QICovCisgIHNlbGYtPmNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9jbGllbnQoMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisjaWZkZWYgRElTQ09WRVJZX05PTUFTSworICBzZWxmLT5tYXNrID0gMHhmZmZmOwkJLyogRm9yIFcyayBjb21wYXRpYmlsaXR5ICovCisjZWxzZSAvKiBESVNDT1ZFUllfTk9NQVNLICovCisgIHNlbGYtPm1hc2sgPSBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQoU19MQU4pOworI2VuZGlmIC8qIERJU0NPVkVSWV9OT01BU0sgKi8KKyAgc2VsZi0+dHhfZmxvdyA9IEZMT1dfU1RBUlQ7CS8qIEZsb3cgY29udHJvbCBmcm9tIElyVFRQICovCisKKyAgREVYSVQoSVJEQV9TT0NLX1RSQUNFLCAiXG4iKTsKKyAgcmV0dXJuKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29ubmVjdCB0byB0aGUgb3RoZXIgc2lkZSA6CisgKglvIGNvbnZlcnQgZGV2aWNlIG5hbWUgdG8gYW4gYWRkcmVzcworICoJbyBmaW5kIHRoZSBzb2NrZXQgbnVtYmVyIChkbHNhcCkKKyAqCW8gRXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uCisgKgorICogTm90ZSA6IFdlIG5vIGxvbmdlciBtaW1pYyBhZl9pcmRhLiBUaGUgSUFTIHF1ZXJ5IGZvciBmaW5kaW5nIHRoZSBUU0FQCisgKiBpcyBkb25lIGFzeW5jaHJvbm91c2x5LCBsaWtlIHRoZSBUVFAgY29ubmVjdGlvbi4gVGhpcyBhbGxvdyB1cyB0bworICogY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gYW55IGNvbnRleHQgKG5vdCBvbmx5IHByb2Nlc3MpLgorICogVGhlIGRvd25zaWRlIGlzIHRoYXQgZm9sbG93aW5nIHdoYXQncyBoYXBwZW5pbmcgaW4gdGhlcmUgaXMgdHJpY2t5CisgKiBiZWNhdXNlIGl0IGludm9sdmUgdmFyaW91cyBmdW5jdGlvbnMgYWxsIG92ZXIgdGhlIHBsYWNlLi4uCisgKi8KK2ludAoraXJkYV9pcm5ldF9jb25uZWN0KGlybmV0X3NvY2tldCAqCXNlbGYpCit7CisgIGludAkJZXJyOworCisgIERFTlRFUihJUkRBX1NPQ0tfVFJBQ0UsICIoc2VsZj0weCVwKVxuIiwgc2VsZik7CisKKyAgLyogQ2hlY2sgaWYgd2UgYXJlIGFscmVhZHkgdHJ5aW5nIHRvIGNvbm5lY3QuCisgICAqIEJlY2F1c2UgaXJkYV9pcm5ldF9jb25uZWN0KCkgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBieSBwcHBkIHBsdXMKKyAgICogcGFja2V0IHJldHJpZXMgaW4gcHBwX2dlbmVyaWMgYW5kIGNvbm5lY3QgbWF5IHRha2UgdGltZSwgcGx1cyB3ZSBtYXkKKyAgICogcmFjZSB3aXRoIGlybmV0X2Nvbm5lY3RfaW5kaWNhdGlvbigpLCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgdGhlcmUuLi4gKi8KKyAgaWYodGVzdF9hbmRfc2V0X2JpdCgwLCAmc2VsZi0+dHRwX2Nvbm5lY3QpKQorICAgIERSRVRVUk4oLUVCVVNZLCBJUkRBX1NPQ0tfSU5GTywgIkFscmVhZHkgY29ubmVjdGluZy4uLlxuIik7CisgIGlmKChzZWxmLT5pcmlhcCAhPSBOVUxMKSB8fCAoc2VsZi0+dHNhcCAhPSBOVUxMKSkKKyAgICBERVJST1IoSVJEQV9TT0NLX0VSUk9SLCAiU29ja2V0IG5vdCBjbGVhbmVkIHVwLi4uXG4iKTsKKworICAvKiBJbnNlcnQgb3Vyc2VsdmVzIGluIHRoZSBoYXNoYmluIHNvIHRoYXQgdGhlIElyTkVUIHNlcnZlciBjYW4gZmluZCB1cy4KKyAgICogTm90ZXMgOiA0dGggYXJnIGlzIHN0cmluZyBvZiAzMiBjaGFyIG1heCBhbmQgbXVzdCBiZSBudWxsIHRlcm1pbmF0ZWQKKyAgICoJICAgICBXaGVuIDR0aCBhcmcgaXMgdXNlZCAoc3RyaW5nKSwgM3JkIGFyZyBpc24ndCAoaW50KQorICAgKgkgICAgIENhbid0IHJlLWluc2VydCAoTVVTVCByZW1vdmUgZmlyc3QpIHNvIGNoZWNrIGZvciB0aGF0Li4uICovCisgIGlmKChpcm5ldF9zZXJ2ZXIucnVubmluZykgJiYgKHNlbGYtPnEucV9uZXh0ID09IE5VTEwpKQorICAgIHsKKyAgICAgIHNwaW5fbG9ja19iaCgmaXJuZXRfc2VydmVyLnNwaW5sb2NrKTsKKyAgICAgIGhhc2hiaW5faW5zZXJ0KGlybmV0X3NlcnZlci5saXN0LCAoaXJkYV9xdWV1ZV90ICopIHNlbGYsIDAsIHNlbGYtPnJuYW1lKTsKKyAgICAgIHNwaW5fdW5sb2NrX2JoKCZpcm5ldF9zZXJ2ZXIuc3BpbmxvY2spOworICAgICAgREVCVUcoSVJEQV9TT0NLX0lORk8sICJJbnNlcnRlZCBgYCVzJycgaW4gaGFzaGJpbi4uLlxuIiwgc2VsZi0+cm5hbWUpOworICAgIH0KKworICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIChubyBhZGRyZXNzLCBubyBuYW1lKSAqLworICBpZigoc2VsZi0+cmRhZGRyID09IERFVl9BRERSX0FOWSkgJiYgKHNlbGYtPnJuYW1lWzBdID09ICdcMCcpKQorICAgIHsKKyAgICAgIC8qIFRyeSB0byBmaW5kIGEgc3VpdGFibGUgYWRkcmVzcyAqLworICAgICAgaWYoKGVyciA9IGlybmV0X2Rpc2NvdmVyX2RhZGRyX2FuZF9sc2FwX3NlbChzZWxmKSkgIT0gMCkKKwlEUkVUVVJOKGVyciwgSVJEQV9TT0NLX0lORk8sICJhdXRvLWNvbm5lY3QgZmFpbGVkIVxuIik7CisgICAgICAvKiBJbiBtb3N0IGNhc2VzLCB0aGUgY2FsbCBhYm92ZSBpcyBub24tYmxvY2tpbmcgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB3ZSBoYXZlIG9ubHkgdGhlIG5hbWUgKG5vIGFkZHJlc3MpLCB0cnkgdG8gZ2V0IGFuIGFkZHJlc3MgKi8KKyAgICAgIGlmKHNlbGYtPnJkYWRkciA9PSBERVZfQUREUl9BTlkpCisJeworCSAgaWYoKGVyciA9IGlybmV0X2RuYW1lX3RvX2RhZGRyKHNlbGYpKSAhPSAwKQorCSAgICBEUkVUVVJOKGVyciwgSVJEQV9TT0NLX0lORk8sICJuYW1lIGNvbm5lY3QgZmFpbGVkIVxuIik7CisJfQorICAgICAgZWxzZQorCS8qIFVzZSB0aGUgcmVxdWVzdGVkIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlzZWxmLT5kYWRkciA9IHNlbGYtPnJkYWRkcjsKKworICAgICAgLyogUXVlcnkgcmVtb3RlIExNLUlBUyB0byBmaW5kIExTQVAgc2VsZWN0b3IgKi8KKyAgICAgIGlybmV0X2ZpbmRfbHNhcF9zZWwoc2VsZik7CisgICAgICAvKiBUaGUgYWJvdmUgY2FsbCBpcyBub24gYmxvY2tpbmcgKi8KKyAgICB9CisKKyAgLyogQXQgdGhpcyBwb2ludCwgd2UgYXJlIHdhaXRpbmcgZm9yIHRoZSBJckRBIHN0YWNrIHRvIGNhbGwgdXMgYmFjaywKKyAgICogb3Igd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZC4KKyAgICogV2Ugd2lsbCBmaW5pc2ggdGhlIGNvbm5lY3Rpb24gcHJvY2VkdXJlIGluIGlybmV0X2Nvbm5lY3RfdHNhcCgpLgorICAgKi8KKyAgREVYSVQoSVJEQV9TT0NLX1RSQUNFLCAiXG4iKTsKKyAgcmV0dXJuKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJkYV9pcm5ldF9kZXN0cm95KHNlbGYpCisgKgorICogICAgRGVzdHJveSBpcm5ldCBpbnN0YW5jZQorICoKKyAqIE5vdGUgOiB0aGlzIG5lZWQgdG8gYmUgY2FsbGVkIGZyb20gYSBwcm9jZXNzIGNvbnRleHQuCisgKi8KK3ZvaWQKK2lyZGFfaXJuZXRfZGVzdHJveShpcm5ldF9zb2NrZXQgKglzZWxmKQoreworICBERU5URVIoSVJEQV9TT0NLX1RSQUNFLCAiKHNlbGY9MHglcClcbiIsIHNlbGYpOworICBpZihzZWxmID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIFJlbW92ZSBvdXJzZWx2ZXMgZnJvbSBoYXNoYmluIChpZiB3ZSBhcmUgcXVldWVkIGluIGhhc2hiaW4pCisgICAqIE5vdGUgOiBgaXJuZXRfc2VydmVyLnJ1bm5pbmcnIHByb3RlY3QgdXMgZnJvbSBjYWxscyBpbiBoYXNoYmluX2RlbGV0ZSgpICovCisgIGlmKChpcm5ldF9zZXJ2ZXIucnVubmluZykgJiYgKHNlbGYtPnEucV9uZXh0ICE9IE5VTEwpKQorICAgIHsKKyAgICAgIHN0cnVjdCBpcm5ldF9zb2NrZXQgKgllbnRyeTsKKyAgICAgIERFQlVHKElSREFfU09DS19JTkZPLCAiUmVtb3ZpbmcgZnJvbSBoYXNoLi5cbiIpOworICAgICAgc3Bpbl9sb2NrX2JoKCZpcm5ldF9zZXJ2ZXIuc3BpbmxvY2spOworICAgICAgZW50cnkgPSBoYXNoYmluX3JlbW92ZV90aGlzKGlybmV0X3NlcnZlci5saXN0LCAoaXJkYV9xdWV1ZV90ICopIHNlbGYpOworICAgICAgc2VsZi0+cS5xX25leHQgPSBOVUxMOworICAgICAgc3Bpbl91bmxvY2tfYmgoJmlybmV0X3NlcnZlci5zcGlubG9jayk7CisgICAgICBEQVNTRVJUKGVudHJ5ID09IHNlbGYsICwgSVJEQV9TT0NLX0VSUk9SLCAiQ2FuJ3QgcmVtb3ZlIGZyb20gaGFzaC5cbiIpOworICAgIH0KKworICAvKiBJZiB3ZSB3ZXJlIGNvbm5lY3RlZCwgcG9zdCBhIG1lc3NhZ2UgKi8KKyAgaWYodGVzdF9iaXQoMCwgJnNlbGYtPnR0cF9vcGVuKSkKKyAgICB7CisgICAgICAvKiBOb3RlIDogYXMgdGhlIGRpc2Nvbm5lY3QgY29tZXMgZnJvbSBwcHBfZ2VuZXJpYywgdGhlIHVuaXQgbnVtYmVyCisgICAgICAgKiBkb2Vzbid0IGV4aXN0IGFueW1vcmUgd2hlbiB3ZSBwb3N0IHRoZSBldmVudCwgc28gd2UgbmVlZCB0byBwYXNzCisgICAgICAgKiBOVUxMIGFzIHRoZSBmaXJzdCBhcmcuLi4gKi8KKyAgICAgIGlybmV0X3Bvc3RfZXZlbnQoTlVMTCwgSVJORVRfRElTQ09OTkVDVF9UTywKKwkJICAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgc2VsZi0+cm5hbWUsIDApOworICAgIH0KKworICAvKiBQcmV2ZW50IHZhcmlvdXMgSXJEQSBjYWxsYmFja3MgZnJvbSBtZXNzaW5nIHVwIHRoaW5ncworICAgKiBOZWVkIHRvIGJlIGZpcnN0ICovCisgIGNsZWFyX2JpdCgwLCAmc2VsZi0+dHRwX2Nvbm5lY3QpOworCisgIC8qIFByZXZlbnQgaGlnaGVyIGxheWVyIGZyb20gYWNjZXNzaW5nIElyVFRQICovCisgIGNsZWFyX2JpdCgwLCAmc2VsZi0+dHRwX29wZW4pOworCisgIC8qIFVucmVnaXN0ZXIgd2l0aCBJckxNUCAqLworICBpcmxtcF91bnJlZ2lzdGVyX2NsaWVudChzZWxmLT5ja2V5KTsKKworICAvKiBVbnJlZ2lzdGVyIHdpdGggTE0tSUFTICovCisgIGlmKHNlbGYtPmlyaWFwKQorICAgIHsgCisgICAgICBpcmlhcF9jbG9zZShzZWxmLT5pcmlhcCk7CisgICAgICBzZWxmLT5pcmlhcCA9IE5VTEw7CisgICAgfQorCisgIC8qIENsZWFudXAgZXZlbnR1YWwgZGlzY292ZXJpZXMgZnJvbSBjb25uZWN0aW9uIGF0dGVtcHQgb3IgY29udHJvbCBjaGFubmVsICovCisgIGlmKHNlbGYtPmRpc2NvdmVyaWVzICE9IE5VTEwpCisgICAgeworICAgICAgLyogQ2xlYW51cCBvdXIgY29weSBvZiB0aGUgZGlzY292ZXJ5IGxvZyAqLworICAgICAga2ZyZWUoc2VsZi0+ZGlzY292ZXJpZXMpOworICAgICAgc2VsZi0+ZGlzY292ZXJpZXMgPSBOVUxMOworICAgIH0KKworICAvKiBDbG9zZSBvdXIgSXJUVFAgY29ubmVjdGlvbiAqLworICBpZihzZWxmLT50c2FwKQorICAgIHsKKyAgICAgIERFQlVHKElSREFfU09DS19JTkZPLCAiQ2xvc2luZyBvdXIgVFRQIGNvbm5lY3Rpb24uXG4iKTsKKyAgICAgIGlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwLCBOVUxMLCBQX05PUk1BTCk7CisgICAgICBpcnR0cF9jbG9zZV90c2FwKHNlbGYtPnRzYXApOworICAgICAgc2VsZi0+dHNhcCA9IE5VTEw7CisgICAgfQorICBzZWxmLT5zdHNhcF9zZWwgPSAwOworCisgIERFWElUKElSREFfU09DS19UUkFDRSwgIlxuIik7CisgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogU0VSVkVSIFNPQ0tFVCAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGUgSXJORVQgc2VydmljZSBpcyBjb21wb3NlZCBvZiBvbmUgc2VydmVyIHNvY2tldCBhbmQgYSB2YXJpYWJsZQorICogbnVtYmVyIG9mIHJlZ3VsYXIgSXJORVQgc29ja2V0cy4gVGhlIHNlcnZlciBzb2NrZXQgaXMgc3VwcG9zZWQgdG8KKyAqIGhhbmRsZSBpbmNvbWluZyBjb25uZWN0aW9ucyBhbmQgcmVkaXJlY3QgdGhlbSB0byBvbmUgSXJORVQgc29ja2V0cy4KKyAqIEl0J3MgYSBzdXBlcnNldCBvZiB0aGUgcmVndWxhciBJck5FVCBzb2NrZXQsIGJ1dCBoYXMgYSB2ZXJ5IGRpc3RpbmN0CisgKiBiZWhhdmlvdXIuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfZGFkZHJfdG9fZG5hbWUgKHNlbGYpCisgKgorICogICAgQ29udmVydCBhbiBJckRBIGFkZHJlc3MgdG8gYSBJckRBIG5pY2tuYW1lCisgKgorICogSXQgYmFzaWNhbGx5IGxvb2sgaW50byB0aGUgZGlzY292ZXJ5IGxvZyB1bnRpbCB0aGVyZSBpcyBhIG1hdGNoLgorICovCitzdGF0aWMgaW5saW5lIGludAoraXJuZXRfZGFkZHJfdG9fZG5hbWUoaXJuZXRfc29ja2V0ICoJc2VsZikKK3sKKyAgc3RydWN0IGlyZGFfZGV2aWNlX2luZm8gKmRpc2NvdmVyaWVzOwkvKiBDb3B5IG9mIHRoZSBkaXNjb3ZlcnkgbG9nICovCisgIGludAludW1iZXI7CQkJLyogTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBsb2cgKi8KKyAgaW50CWk7CisKKyAgREVOVEVSKElSREFfU0VSVl9UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKworICAvKiBBc2sgbG1wIGZvciB0aGUgY3VycmVudCBkaXNjb3ZlcnkgbG9nICovCisgIGRpc2NvdmVyaWVzID0gaXJsbXBfZ2V0X2Rpc2NvdmVyaWVzKCZudW1iZXIsIDB4ZmZmZiwKKwkJCQkgICAgICBESVNDT1ZFUllfREVGQVVMVF9TTE9UUyk7CisgIC8qIENoZWNrIGlmIHRoZSB3ZSBnb3Qgc29tZSByZXN1bHRzICovCisgIGlmIChkaXNjb3ZlcmllcyA9PSBOVUxMKQorICAgIERSRVRVUk4oLUVORVRVTlJFQUNILCBJUkRBX1NFUlZfSU5GTywgIkNhY2hlbG9nIGVtcHR5Li4uXG4iKTsKKworICAvKiBOb3csIGNoZWNrIGFsbCBkaXNjb3ZlcmVkIGRldmljZXMgKGlmIGFueSkgKi8KKyAgZm9yKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCisgICAgeworICAgICAgLyogRG9lcyB0aGUgbmFtZSBtYXRjaCA/ICovCisgICAgICBpZihkaXNjb3Zlcmllc1tpXS5kYWRkciA9PSBzZWxmLT5kYWRkcikKKwl7CisJICAvKiBZZXMgISEhIEdldCBpdC4uICovCisJICBzdHJsY3B5KHNlbGYtPnJuYW1lLCBkaXNjb3Zlcmllc1tpXS5pbmZvLCBzaXplb2Yoc2VsZi0+cm5hbWUpKTsKKwkgIHNlbGYtPnJuYW1lW05JQ0tOQU1FX01BWF9MRU4gKyAxXSA9ICdcMCc7CisJICBERUJVRyhJUkRBX1NFUlZfSU5GTywgIkRldmljZSAweCUwOHggaXMgaW4gZmFjdCBgYCVzJycuXG4iLAorCQlzZWxmLT5kYWRkciwgc2VsZi0+cm5hbWUpOworCSAga2ZyZWUoZGlzY292ZXJpZXMpOworCSAgREVYSVQoSVJEQV9TRVJWX1RSQUNFLCAiXG4iKTsKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisgIC8qIE5vIGx1Y2sgISAqLworICBERVhJVChJUkRBX1NFUlZfSU5GTywgIjogY2Fubm90IGRpc2NvdmVyIGRldmljZSAweCUwOHggISEhXG4iLCBzZWxmLT5kYWRkcik7CisgIGtmcmVlKGRpc2NvdmVyaWVzKTsKKyAgcmV0dXJuKC1FQUREUk5PVEFWQUlMKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZmluZF9zb2NrZXQgKHNlbGYpCisgKgorICogICAgRmluZCB0aGUgY29ycmVjdCBJck5FVCBzb2NrZXQKKyAqCisgKiBMb29rIGludG8gdGhlIGxpc3Qgb2YgSXJORVQgc29ja2V0cyBhbmQgZmluZHMgb25lIHdpdGggdGhlIHJpZ2h0CisgKiBwcm9wZXJ0aWVzLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaXJuZXRfc29ja2V0ICoKK2lybmV0X2ZpbmRfc29ja2V0KGlybmV0X3NvY2tldCAqCXNlbGYpCit7CisgIGlybmV0X3NvY2tldCAqCW5ldyA9IChpcm5ldF9zb2NrZXQgKikgTlVMTDsKKyAgaW50CQkJZXJyOworCisgIERFTlRFUihJUkRBX1NFUlZfVFJBQ0UsICIoc2VsZj0weCVwKVxuIiwgc2VsZik7CisKKyAgLyogR2V0IHRoZSBhZGRyZXNzZXMgb2YgdGhlIHJlcXVlc3RlciAqLworICBzZWxmLT5kYWRkciA9IGlydHRwX2dldF9kYWRkcihzZWxmLT50c2FwKTsKKyAgc2VsZi0+c2FkZHIgPSBpcnR0cF9nZXRfc2FkZHIoc2VsZi0+dHNhcCk7CisKKyAgLyogVHJ5IHRvIGdldCB0aGUgSXJEQSBuaWNrbmFtZSBvZiB0aGUgcmVxdWVzdGVyICovCisgIGVyciA9IGlybmV0X2RhZGRyX3RvX2RuYW1lKHNlbGYpOworCisgIC8qIFByb3RlY3QgYWNjZXNzIHRvIHRoZSBpbnN0YW5jZSBsaXN0ICovCisgIHNwaW5fbG9ja19iaCgmaXJuZXRfc2VydmVyLnNwaW5sb2NrKTsKKworICAvKiBTbyBub3csIHRyeSB0byBnZXQgYW4gc29ja2V0IGhhdmluZyBzcGVjaWZpY2FsbHkKKyAgICogcmVxdWVzdGVkIHRoYXQgbmlja25hbWUgKi8KKyAgaWYoZXJyID09IDApCisgICAgeworICAgICAgbmV3ID0gKGlybmV0X3NvY2tldCAqKSBoYXNoYmluX2ZpbmQoaXJuZXRfc2VydmVyLmxpc3QsCisJCQkJCSAgMCwgc2VsZi0+cm5hbWUpOworICAgICAgaWYobmV3KQorCURFQlVHKElSREFfU0VSVl9JTkZPLCAiU29ja2V0IDB4JXAgbWF0Y2hlcyBybmFtZSBgYCVzJycuXG4iLAorCSAgICAgIG5ldywgbmV3LT5ybmFtZSk7CisgICAgfQorCisgIC8qIElmIG5vIG5hbWUgbWF0Y2hlcywgdHJ5IHRvIGZpbmQgYW4gc29ja2V0IGJ5IHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisgIC8qIEl0IGNhbiBiZSBlaXRoZXIgdGhlIHJlcXVlc3RlZCBkZXN0aW5hdGlvbiBhZGRyZXNzIChzZXQgdmlhIHRoZQorICAgKiBjb250cm9sIGNoYW5uZWwpLCBvciB0aGUgY3VycmVudCBkZXN0aW5hdGlvbiBhZGRyZXNzIGlmIHRoZQorICAgKiBzb2NrZXQgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIGNvbm5lY3Rpb24gcmVxdWVzdCAqLworICBpZihuZXcgPT0gKGlybmV0X3NvY2tldCAqKSBOVUxMKQorICAgIHsKKyAgICAgIG5ldyA9IChpcm5ldF9zb2NrZXQgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJuZXRfc2VydmVyLmxpc3QpOworICAgICAgd2hpbGUobmV3ICE9KGlybmV0X3NvY2tldCAqKSBOVUxMKQorCXsKKwkgIC8qIERvZXMgaXQgaGF2ZSB0aGUgc2FtZSBhZGRyZXNzID8gKi8KKwkgIGlmKChuZXctPnJkYWRkciA9PSBzZWxmLT5kYWRkcikgfHwgKG5ldy0+ZGFkZHIgPT0gc2VsZi0+ZGFkZHIpKQorCSAgICB7CisJICAgICAgLyogWWVzICEhISBHZXQgaXQuLiAqLworCSAgICAgIERFQlVHKElSREFfU0VSVl9JTkZPLCAiU29ja2V0IDB4JXAgbWF0Y2hlcyBkYWRkciAlIzA4eC5cbiIsCisJCSAgICBuZXcsIHNlbGYtPmRhZGRyKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgbmV3ID0gKGlybmV0X3NvY2tldCAqKSBoYXNoYmluX2dldF9uZXh0KGlybmV0X3NlcnZlci5saXN0KTsKKwl9CisgICAgfQorCisgIC8qIElmIHdlIGRvbid0IGhhdmUgYW55IHNvY2tldCwgZ2V0IHRoZSBmaXJzdCB1bmNvbm5lY3RlZCBzb2NrZXQgKi8KKyAgaWYobmV3ID09IChpcm5ldF9zb2NrZXQgKikgTlVMTCkKKyAgICB7CisgICAgICBuZXcgPSAoaXJuZXRfc29ja2V0ICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlybmV0X3NlcnZlci5saXN0KTsKKyAgICAgIHdoaWxlKG5ldyAhPShpcm5ldF9zb2NrZXQgKikgTlVMTCkKKwl7CisJICAvKiBJcyBpdCBhdmFpbGFibGUgPyAqLworCSAgaWYoISh0ZXN0X2JpdCgwLCAmbmV3LT50dHBfb3BlbikpICYmIChuZXctPnJkYWRkciA9PSBERVZfQUREUl9BTlkpICYmCisJICAgICAobmV3LT5ybmFtZVswXSA9PSAnXDAnKSAmJiAobmV3LT5wcHBfb3BlbikpCisJICAgIHsKKwkgICAgICAvKiBZZXMgISEhIEdldCBpdC4uICovCisJICAgICAgREVCVUcoSVJEQV9TRVJWX0lORk8sICJTb2NrZXQgMHglcCBpcyBmcmVlLlxuIiwKKwkJICAgIG5ldyk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIG5ldyA9IChpcm5ldF9zb2NrZXQgKikgaGFzaGJpbl9nZXRfbmV4dChpcm5ldF9zZXJ2ZXIubGlzdCk7CisJfQorICAgIH0KKworICAvKiBTcGluIGxvY2sgZW5kICovCisgIHNwaW5fdW5sb2NrX2JoKCZpcm5ldF9zZXJ2ZXIuc3BpbmxvY2spOworCisgIERFWElUKElSREFfU0VSVl9UUkFDRSwgIiAtIG5ldyA9IDB4JXBcbiIsIG5ldyk7CisgIHJldHVybiBuZXc7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcmRhX2Nvbm5lY3Rfc29ja2V0IChzZWxmKQorICoKKyAqICAgIENvbm5lY3QgYW4gaW5jb21pbmcgY29ubmVjdGlvbiB0byB0aGUgc29ja2V0CisgKgorICovCitzdGF0aWMgaW5saW5lIGludAoraXJuZXRfY29ubmVjdF9zb2NrZXQoaXJuZXRfc29ja2V0ICoJc2VydmVyLAorCQkgICAgIGlybmV0X3NvY2tldCAqCW5ldywKKwkJICAgICBzdHJ1Y3QgcW9zX2luZm8gKglxb3MsCisJCSAgICAgX191MzIJCW1heF9zZHVfc2l6ZSwKKwkJICAgICBfX3U4CQltYXhfaGVhZGVyX3NpemUpCit7CisgIERFTlRFUihJUkRBX1NFUlZfVFJBQ0UsICIoc2VydmVyPTB4JXAsIG5ldz0weCVwKVxuIiwKKwkgc2VydmVyLCBuZXcpOworCisgIC8qIE5vdyBhdHRhY2ggdXAgdGhlIG5ldyBzb2NrZXQgKi8KKyAgbmV3LT50c2FwID0gaXJ0dHBfZHVwKHNlcnZlci0+dHNhcCwgbmV3KTsKKyAgREFCT1JUKG5ldy0+dHNhcCA9PSBOVUxMLCAtMSwgSVJEQV9TRVJWX0VSUk9SLCAiZHVwIGZhaWxlZCFcbiIpOworCisgIC8qIFNldCB1cCBhbGwgdGhlIHJlbGV2YW50IHBhcmFtZXRlcnMgb24gdGhlIG5ldyBzb2NrZXQgKi8KKyAgbmV3LT5zdHNhcF9zZWwgPSBuZXctPnRzYXAtPnN0c2FwX3NlbDsKKyAgbmV3LT5kdHNhcF9zZWwgPSBuZXctPnRzYXAtPmR0c2FwX3NlbDsKKyAgbmV3LT5zYWRkciA9IGlydHRwX2dldF9zYWRkcihuZXctPnRzYXApOworICBuZXctPmRhZGRyID0gaXJ0dHBfZ2V0X2RhZGRyKG5ldy0+dHNhcCk7CisKKyAgbmV3LT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CisgIG5ldy0+bWF4X3NkdV9zaXplX3R4ID0gbWF4X3NkdV9zaXplOworICBuZXctPm1heF9kYXRhX3NpemUgICA9IG1heF9zZHVfc2l6ZTsKKyNpZmRlZiBTVFJFQU1fQ09NUEFUCisgIC8qIElmIHdlIHdhbnQgdG8gcmVjZWl2ZSAic3RyZWFtIHNvY2tldHMiICovCisgIGlmKG1heF9zZHVfc2l6ZSA9PSAwKQorICAgIG5ldy0+bWF4X2RhdGFfc2l6ZSA9IGlydHRwX2dldF9tYXhfc2VnX3NpemUobmV3LT50c2FwKTsKKyNlbmRpZiAvKiBTVFJFQU1fQ09NUEFUICovCisKKyAgLyogQ2xlYW4gdXAgdGhlIG9yaWdpbmFsIG9uZSB0byBrZWVwIGl0IGluIGxpc3RlbiBzdGF0ZSAqLworICBpcnR0cF9saXN0ZW4oc2VydmVyLT50c2FwKTsKKworICAvKiBTZW5kIGEgY29ubmVjdGlvbiByZXNwb25zZSBvbiB0aGUgbmV3IHNvY2tldCAqLworICBpcnR0cF9jb25uZWN0X3Jlc3BvbnNlKG5ldy0+dHNhcCwgbmV3LT5tYXhfc2R1X3NpemVfcngsIE5VTEwpOworCisgIC8qIEFsbG93IFBQUCB0byBzZW5kIGl0cyBqdW5rIG92ZXIgdGhlIG5ldyBzb2NrZXQuLi4gKi8KKyAgc2V0X2JpdCgwLCAmbmV3LT50dHBfb3Blbik7CisKKyAgLyogTm90IGNvbm5lY3RpbmcgYW55bW9yZSwgYW5kIGNsZWFuIHVwIGxhc3QgcG9zc2libGUgcmVtYWlucworICAgKiBvZiBjb25uZWN0aW9uIGF0dGVtcHRzIG9uIHRoZSBzb2NrZXQgKi8KKyAgY2xlYXJfYml0KDAsICZuZXctPnR0cF9jb25uZWN0KTsKKyAgaWYobmV3LT5pcmlhcCkKKyAgICB7CisgICAgICBpcmlhcF9jbG9zZShuZXctPmlyaWFwKTsKKyAgICAgIG5ldy0+aXJpYXAgPSBOVUxMOworICAgIH0KKyAgaWYobmV3LT5kaXNjb3ZlcmllcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGtmcmVlKG5ldy0+ZGlzY292ZXJpZXMpOworICAgICAgbmV3LT5kaXNjb3ZlcmllcyA9IE5VTEw7CisgICAgfQorCisjaWZkZWYgQ09OTkVDVF9JTkRJQ19LSUNLCisgIC8qIEFzIGN1cnJlbnRseSB3ZSBkb24ndCBibG9jayBwYWNrZXRzIGluIHBwcF9pcm5ldF9zZW5kKCkgd2hpbGUgcGFzc2l2ZSwKKyAgICogdGhpcyBpcyBub3QgcmVhbGx5IG5lZWRlZC4uLgorICAgKiBBbHNvLCBub3QgZG9pbmcgaXQgZ2l2ZSBJckRBIGEgY2hhbmNlIHRvIGZpbmlzaCB0aGUgc2V0dXAgcHJvcGVybHkKKyAgICogYmVmb3JlIGJlaW5nIHN3YW1wZWQgd2l0aCBwYWNrZXRzLi4uICovCisgIHBwcF9vdXRwdXRfd2FrZXVwKCZuZXctPmNoYW4pOworI2VuZGlmIC8qIENPTk5FQ1RfSU5ESUNfS0lDSyAqLworCisgIC8qIE5vdGlmeSB0aGUgY29udHJvbCBjaGFubmVsICovCisgIGlybmV0X3Bvc3RfZXZlbnQobmV3LCBJUk5FVF9DT05ORUNUX0ZST00sCisJCSAgIG5ldy0+c2FkZHIsIG5ldy0+ZGFkZHIsIHNlcnZlci0+cm5hbWUsIDApOworCisgIERFWElUKElSREFfU0VSVl9UUkFDRSwgIlxuIik7CisgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJkYV9kaXNjb25uZWN0X3NlcnZlciAoc2VsZikKKyAqCisgKiAgICBDbGVhbnVwIHRoZSBzZXJ2ZXIgc29ja2V0IHdoZW4gdGhlIGluY29taW5nIGNvbm5lY3Rpb24gYWJvcnQKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraXJuZXRfZGlzY29ubmVjdF9zZXJ2ZXIoaXJuZXRfc29ja2V0ICoJc2VsZiwKKwkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisgIERFTlRFUihJUkRBX1NFUlZfVFJBQ0UsICIoc2VsZj0weCVwKVxuIiwgc2VsZik7CisKKyAgLyogUHV0IHRoZSByZWNlaXZlZCBwYWNrZXQgaW4gdGhlIGJsYWNrIGhvbGUgKi8KKyAga2ZyZWVfc2tiKHNrYik7CisKKyNpZmRlZiBGQUlMX1NFTkRfRElTQ09OTkVDVAorICAvKiBUZWxsIHRoZSBvdGhlciBwYXJ0eSB3ZSBkb24ndCB3YW50IHRvIGJlIGNvbm5lY3RlZCAqLworICAvKiBIdW0uLi4gSXMgaXQgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvID8gQW5kIGRvIHdlIG5lZWQgdG8gc2VuZAorICAgKiBhIGNvbm5lY3QgcmVzcG9uc2UgYmVmb3JlID8gSXQgbG9va3Mgb2sgd2l0aG91dCB0aGlzLi4uICovCisgIGlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwLCBOVUxMLCBQX05PUk1BTCk7CisjZW5kaWYgLyogRkFJTF9TRU5EX0RJU0NPTk5FQ1QgKi8KKworICAvKiBOb3RpZnkgdGhlIGNvbnRyb2wgY2hhbm5lbCAoc2VlIGlybmV0X2ZpbmRfc29ja2V0KCkpICovCisgIGlybmV0X3Bvc3RfZXZlbnQoTlVMTCwgSVJORVRfUkVRVUVTVF9GUk9NLAorCQkgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsIHNlbGYtPnJuYW1lLCAwKTsKKworICAvKiBDbGVhbiB1cCB0aGUgc2VydmVyIHRvIGtlZXAgaXQgaW4gbGlzdGVuIHN0YXRlICovCisgIGlydHRwX2xpc3RlbihzZWxmLT50c2FwKTsKKworICBERVhJVChJUkRBX1NFUlZfVFJBQ0UsICJcbiIpOworICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcmRhX3NldHVwX3NlcnZlciAoc2VsZikKKyAqCisgKiAgICBDcmVhdGUgYSBJclRUUCBzZXJ2ZXIgYW5kIHNldCBpdCB1cC4uLgorICoKKyAqIFJlZ2lzdGVyIHRoZSBJckxBTiBoaW50IGJpdCwgY3JlYXRlIGEgSXJUVFAgaW5zdGFuY2UgZm9yIHVzLAorICogc2V0IGFsbCB0aGUgSXJUVFAgY2FsbGJhY2tzIGFuZCBjcmVhdGUgYW4gSXJJQVMgZW50cnkuLi4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lybmV0X3NldHVwX3NlcnZlcih2b2lkKQoreworICBfX3UxNgkJaGludHM7CisKKyAgREVOVEVSKElSREFfU0VSVl9UUkFDRSwgIigpXG4iKTsKKworICAvKiBJbml0aWFsaXNlIHRoZSByZWd1bGFyIHNvY2tldCBwYXJ0IG9mIHRoZSBzZXJ2ZXIgKi8KKyAgaXJkYV9pcm5ldF9jcmVhdGUoJmlybmV0X3NlcnZlci5zKTsKKworICAvKiBPcGVuIGEgbG9jYWwgVFNBUCAoYW4gSXJUVFAgaW5zdGFuY2UpIGZvciB0aGUgc2VydmVyICovCisgIGlybmV0X29wZW5fdHNhcCgmaXJuZXRfc2VydmVyLnMpOworCisgIC8qIFBQUCBwYXJ0IHNldHVwICovCisgIGlybmV0X3NlcnZlci5zLnBwcF9vcGVuID0gMDsKKyAgaXJuZXRfc2VydmVyLnMuY2hhbi5wcml2YXRlID0gTlVMTDsKKyAgaXJuZXRfc2VydmVyLnMuZmlsZSA9IE5VTEw7CisKKyAgLyogR2V0IHRoZSBoaW50IGJpdCBjb3JyZXNwb25kaW5nIHRvIElyTEFOICovCisgIC8qIE5vdGUgOiB3ZSBvdmVybG9hZCB0aGUgSXJMQU4gaGludCBiaXQuIEFzIGl0IGlzIG9ubHkgYSAiaGludCIsIGFuZCBhcworICAgKiB3ZSBwcm92aWRlIHJvdWdobHkgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBJckxBTiwgdGhpcyBpcyBvay4KKyAgICogSW4gZmFjdCwgdGhlIHNpdHVhdGlvbiBpcyBzaW1pbGFyIGFzIEpldFNlbmQgb3ZlcmxvYWRpbmcgdGhlIE9iZXggaGludAorICAgKi8KKyAgaGludHMgPSBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQoU19MQU4pOworCisjaWZkZWYgQURWRVJUSVNFX0hJTlQKKyAgLyogUmVnaXN0ZXIgd2l0aCBJckxNUCBhcyBhIHNlcnZpY2UgKGFkdmVydGlzZSBvdXIgaGludCBiaXQpICovCisgIGlybmV0X3NlcnZlci5za2V5ID0gaXJsbXBfcmVnaXN0ZXJfc2VydmljZShoaW50cyk7CisjZW5kaWYgLyogQURWRVJUSVNFX0hJTlQgKi8KKworICAvKiBSZWdpc3RlciB3aXRoIExNLUlBUyAoc28gdGhhdCBwZW9wbGUgY2FuIGNvbm5lY3QgdG8gdXMpICovCisgIGlybmV0X3NlcnZlci5pYXNfb2JqID0gaXJpYXNfbmV3X29iamVjdChJUk5FVF9TRVJWSUNFX05BTUUsIGppZmZpZXMpOworICBpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIoaXJuZXRfc2VydmVyLmlhc19vYmosIElSTkVUX0lBU19WQUxVRSwgCisJCQkgICBpcm5ldF9zZXJ2ZXIucy5zdHNhcF9zZWwsIElBU19LRVJORUxfQVRUUik7CisgIGlyaWFzX2luc2VydF9vYmplY3QoaXJuZXRfc2VydmVyLmlhc19vYmopOworCisjaWZkZWYgRElTQ09WRVJZX0VWRU5UUworICAvKiBUZWxsIElyTE1QIHdlIHdhbnQgdG8gYmUgbm90aWZpZWQgb2YgbmV3bHkgZGlzY292ZXJlZCBub2RlcyAqLworICBpcmxtcF91cGRhdGVfY2xpZW50KGlybmV0X3NlcnZlci5zLmNrZXksIGhpbnRzLAorCQkgICAgICBpcm5ldF9kaXNjb3ZlcnlfaW5kaWNhdGlvbiwgaXJuZXRfZXhwaXJ5X2luZGljYXRpb24sCisJCSAgICAgICh2b2lkICopICZpcm5ldF9zZXJ2ZXIucyk7CisjZW5kaWYKKworICBERVhJVChJUkRBX1NFUlZfVFJBQ0UsICIgLSBzZWxmPTB4JXBcbiIsICZpcm5ldF9zZXJ2ZXIucyk7CisgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJkYV9kZXN0cm95X3NlcnZlciAoc2VsZikKKyAqCisgKiAgICBEZXN0cm95IHRoZSBJclRUUCBzZXJ2ZXIuLi4KKyAqCisgKiBSZXZlcnNlIG9mIHRoZSBwcmV2aW91cyBmdW5jdGlvbi4uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2lybmV0X2Rlc3Ryb3lfc2VydmVyKHZvaWQpCit7CisgIERFTlRFUihJUkRBX1NFUlZfVFJBQ0UsICIoKVxuIik7CisKKyNpZmRlZiBBRFZFUlRJU0VfSElOVAorICAvKiBVbnJlZ2lzdGVyIHdpdGggSXJMTVAgKi8KKyAgaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKGlybmV0X3NlcnZlci5za2V5KTsKKyNlbmRpZiAvKiBBRFZFUlRJU0VfSElOVCAqLworCisgIC8qIFVucmVnaXN0ZXIgd2l0aCBMTS1JQVMgKi8KKyAgaWYoaXJuZXRfc2VydmVyLmlhc19vYmopCisgICAgaXJpYXNfZGVsZXRlX29iamVjdChpcm5ldF9zZXJ2ZXIuaWFzX29iaik7CisKKyAgLyogQ2xlYW51cCB0aGUgc29ja2V0IHBhcnQgKi8KKyAgaXJkYV9pcm5ldF9kZXN0cm95KCZpcm5ldF9zZXJ2ZXIucyk7CisKKyAgREVYSVQoSVJEQV9TRVJWX1RSQUNFLCAiXG4iKTsKKyAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogSVJEQS1UVFAgQ0FMTEJBQ0tTICoqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBXaGVuIHdlIGNyZWF0ZSBhIElyVFRQIGluc3RhbmNlLCB3ZSBwYXNzIHRvIGl0IGEgc2V0IG9mIGNhbGxiYWNrcworICogdGhhdCBJclRUUCB3aWxsIGNhbGwgaW4gY2FzZSBvZiB2YXJpb3VzIGV2ZW50cy4KKyAqIFdlIHRha2UgY2FyZSBvZiB0aG9zZSBldmVudHMgaGVyZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfZGF0YV9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBza2IpCisgKgorICogICAgUmVjZWl2ZWQgc29tZSBkYXRhIGZyb20gVGlueVRQLiBKdXN0IHF1ZXVlIGl0IG9uIHRoZSByZWNlaXZlIHF1ZXVlCisgKgorICovCitzdGF0aWMgaW50Citpcm5ldF9kYXRhX2luZGljYXRpb24odm9pZCAqCWluc3RhbmNlLAorCQkgICAgICB2b2lkICoJc2FwLAorCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICBpcm5ldF9zb2NrZXQgKglhcCA9IChpcm5ldF9zb2NrZXQgKikgaW5zdGFuY2U7CisgIHVuc2lnbmVkIGNoYXIgKglwOworICBpbnQJCQljb2RlID0gMDsKKworICBERU5URVIoSVJEQV9UQ0JfVFJBQ0UsICIoc2VsZi9hcD0weCVwLCBza2I9MHglcClcbiIsCisJIGFwLCBza2IpOworICBEQVNTRVJUKHNrYiAhPSBOVUxMLCAwLCBJUkRBX0NCX0VSUk9SLCAic2tiIGlzIE5VTEwgISEhXG4iKTsKKworICAvKiBDaGVjayBpcyBwcHAgaXMgcmVhZHkgdG8gcmVjZWl2ZSBvdXIgcGFja2V0ICovCisgIGlmKCFhcC0+cHBwX29wZW4pCisgICAgeworICAgICAgREVSUk9SKElSREFfQ0JfRVJST1IsICJQUFAgbm90IHJlYWR5LCBkcm9wcGluZyBwYWNrZXQuLi5cbiIpOworICAgICAgLyogV2hlbiB3ZSByZXR1cm4gZXJyb3IsIFRUUCB3aWxsIG5lZWQgdG8gcmVxdWV1ZSB0aGUgc2tiIGFuZAorICAgICAgICogd2lsbCBzdG9wIHRoZSBzZW5kZXIuIElyVFRQIHdpbGwgc3RhbGwgdW50aWwgd2Ugc2VuZCBpdCBhCisgICAgICAgKiBmbG93IGNvbnRyb2wgcmVxdWVzdC4uLiAqLworICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorCisgIC8qIHN0cmlwIGFkZHJlc3MvY29udHJvbCBmaWVsZCBpZiBwcmVzZW50ICovCisgIHAgPSBza2ItPmRhdGE7CisgIGlmKChwWzBdID09IFBQUF9BTExTVEFUSU9OUykgJiYgKHBbMV0gPT0gUFBQX1VJKSkKKyAgICB7CisgICAgICAvKiBjaG9wIG9mZiBhZGRyZXNzL2NvbnRyb2wgKi8KKyAgICAgIGlmKHNrYi0+bGVuIDwgMykKKwlnb3RvIGVycl9leGl0OworICAgICAgcCA9IHNrYl9wdWxsKHNrYiwgMik7CisgICAgfQorCisgIC8qIGRlY29tcHJlc3MgcHJvdG9jb2wgZmllbGQgaWYgY29tcHJlc3NlZCAqLworICBpZihwWzBdICYgMSkKKyAgICB7CisgICAgICAvKiBwcm90b2NvbCBpcyBjb21wcmVzc2VkICovCisgICAgICBza2JfcHVzaChza2IsIDEpWzBdID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICBpZihza2ItPmxlbiA8IDIpCisgICAgICBnb3RvIGVycl9leGl0OworCisgIC8qIHBhc3MgdG8gZ2VuZXJpYyBwcHAgbGF5ZXIgKi8KKyAgLyogTm90ZSA6IGhvdyBkbyBJIGtub3cgaWYgcHBwIGNhbiBhY2NlcHQgb3Igbm90IHRoZSBwYWNrZXQgPyBUaGlzIGlzCisgICAqIGVzc2VudGlhbCBpZiBJIHdhbnQgdG8gbWFuYWdlIGZsb3cgY29udHJvbCBzbW9vdGhseS4uLiAqLworICBwcHBfaW5wdXQoJmFwLT5jaGFuLCBza2IpOworCisgIERFWElUKElSREFfVENCX1RSQUNFLCAiXG4iKTsKKyAgcmV0dXJuIDA7CisKKyBlcnJfZXhpdDoKKyAgREVSUk9SKElSREFfQ0JfRVJST1IsICJQYWNrZXQgdG9vIHNtYWxsLCBkcm9wcGluZy4uLlxuIik7CisgIGtmcmVlX3NrYihza2IpOworICBwcHBfaW5wdXRfZXJyb3IoJmFwLT5jaGFuLCBjb2RlKTsKKyAgcmV0dXJuIDA7CS8qIERvbid0IHJldHVybiBhbiBlcnJvciBjb2RlLCBvbmx5IGZvciBmbG93IGNvbnRyb2wuLi4gKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlybmV0X2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgcmVhc29uLCBza2IpCisgKgorICogICAgQ29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuIENoZWNoIHJlYXNvbiB0byBmaW5kIG91dCB3aHkKKyAqCisgKiBOb3RlIDogdGhlcmUgYXJlIG1hbnkgY2FzZXMgd2hlcmUgd2UgY29tZSBoZXJlIDoKKyAqCW8gYXR0ZW1wdGVkIHRvIGNvbm5lY3QsIHRpbWVvdXQKKyAqCW8gY29ubmVjdGVkLCBsaW5rIGlzIGJyb2tlbiwgTEFQIGhhcyB0aW1lb3V0CisgKglvIGNvbm5lY3RlZCwgb3RoZXIgc2lkZSBjbG9zZSB0aGUgbGluaworICoJbyBjb25uZWN0aW9uIHJlcXVlc3Qgb24gdGhlIHNlcnZlciBub3QgaGFuZGxlZAorICovCitzdGF0aWMgdm9pZAoraXJuZXRfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKglpbnN0YW5jZSwKKwkJCSAgICB2b2lkICoJc2FwLCAKKwkJCSAgICBMTV9SRUFTT04JcmVhc29uLAorCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisgIGlybmV0X3NvY2tldCAqCXNlbGYgPSAoaXJuZXRfc29ja2V0ICopIGluc3RhbmNlOworICBpbnQJCQl0ZXN0X29wZW47CisgIGludAkJCXRlc3RfY29ubmVjdDsKKworICBERU5URVIoSVJEQV9UQ0JfVFJBQ0UsICIoc2VsZj0weCVwKVxuIiwgc2VsZik7CisgIERBU1NFUlQoc2VsZiAhPSBOVUxMLCAsIElSREFfQ0JfRVJST1IsICJTZWxmIGlzIE5VTEwgISEhXG4iKTsKKworICAvKiBEb24ndCBjYXJlIGFib3V0IGl0LCBidXQgbGV0J3Mgbm90IGxlYWsgaXQgKi8KKyAgaWYoc2tiKQorICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKworICAvKiBQcmV2ZW50IGhpZ2hlciBsYXllciBmcm9tIGFjY2Vzc2luZyBJclRUUCAqLworICB0ZXN0X29wZW4gPSB0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJnNlbGYtPnR0cF9vcGVuKTsKKyAgLyogTm90IGNvbm5lY3RpbmcgYW55bW9yZS4uLgorICAgKiAobm90ZSA6IFRTQVAgaXMgb3Blbiwgc28gSUFQIGNhbGxiYWNrcyBhcmUgbm8gbG9uZ2VyIHBlbmRpbmcuLi4pICovCisgIHRlc3RfY29ubmVjdCA9IHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmc2VsZi0+dHRwX2Nvbm5lY3QpOworCisgIC8qIElmIGJvdGggc2VsZi0+dHRwX29wZW4gYW5kIHNlbGYtPnR0cF9jb25uZWN0IGFyZSBOVUxMLCBpdCBtZWFuIHRoYXQgd2UKKyAgICogaGF2ZSBhIHJhY2UgY29uZGl0aW9uIHdpdGggaXJkYV9pcm5ldF9kZXN0cm95KCkgb3IKKyAgICogaXJuZXRfY29ubmVjdF9pbmRpY2F0aW9uKCksIHNvIGRvbid0IG1lc3MgdXAgdHNhcC4uLgorICAgKi8KKyAgaWYoISh0ZXN0X29wZW4gfHwgdGVzdF9jb25uZWN0KSkKKyAgICB7CisgICAgICBERVJST1IoSVJEQV9DQl9FUlJPUiwgIlJhY2UgY29uZGl0aW9uIGRldGVjdGVkLi4uXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogSWYgd2Ugd2VyZSBhY3RpdmUsIG5vdGlmeSB0aGUgY29udHJvbCBjaGFubmVsICovCisgIGlmKHRlc3Rfb3BlbikKKyAgICBpcm5ldF9wb3N0X2V2ZW50KHNlbGYsIElSTkVUX0RJU0NPTk5FQ1RfRlJPTSwKKwkJICAgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsIHNlbGYtPnJuYW1lLCAwKTsKKyAgZWxzZQorICAgIC8qIElmIHdlIHdlcmUgdHJ5aW5nIHRvIGNvbm5lY3QsIG5vdGlmeSB0aGUgY29udHJvbCBjaGFubmVsICovCisgICAgaWYoKHNlbGYtPnRzYXApICYmIChzZWxmICE9ICZpcm5ldF9zZXJ2ZXIucykpCisgICAgICBpcm5ldF9wb3N0X2V2ZW50KHNlbGYsIElSTkVUX05PQU5TV0VSX0ZST00sCisJCSAgICAgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsIHNlbGYtPnJuYW1lLCAwKTsKKworICAvKiBDbG9zZSBvdXIgSXJUVFAgY29ubmVjdGlvbiwgY2xlYW51cCB0c2FwICovCisgIGlmKChzZWxmLT50c2FwKSAmJiAoc2VsZiAhPSAmaXJuZXRfc2VydmVyLnMpKQorICAgIHsKKyAgICAgIERFQlVHKElSREFfQ0JfSU5GTywgIkNsb3Npbmcgb3VyIFRUUCBjb25uZWN0aW9uLlxuIik7CisgICAgICBpcnR0cF9jbG9zZV90c2FwKHNlbGYtPnRzYXApOworICAgICAgc2VsZi0+dHNhcCA9IE5VTEw7CisgICAgfQorICAvKiBDbGVhbnVwIHRoZSBzb2NrZXQgaW4gY2FzZSB3ZSB3YW50IHRvIHJlY29ubmVjdCBpbiBwcHBfb3V0cHV0X3dha2V1cCgpICovCisgIHNlbGYtPnN0c2FwX3NlbCA9IDA7CisgIHNlbGYtPmRhZGRyID0gREVWX0FERFJfQU5ZOworICBzZWxmLT50eF9mbG93ID0gRkxPV19TVEFSVDsKKworICAvKiBEZWFsIHdpdGggdGhlIHBwcCBpbnN0YW5jZSBpZiBpdCdzIHN0aWxsIGFsaXZlICovCisgIGlmKHNlbGYtPnBwcF9vcGVuKQorICAgIHsKKyAgICAgIGlmKHRlc3Rfb3BlbikKKwl7CisjaWZkZWYgTUlTU0lOR19QUFBfQVBJCisJICAvKiBwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKCkgd2FudHMgYSB1c2VyIGNvbnRleHQsIHdoaWNoIHdlCisJICAgKiBhcmUgZ3VhcmFudGVlZCB0byBOT1QgaGF2ZSBoZXJlLiBXaGF0IGFyZSB3ZSBzdXBwb3NlZAorCSAgICogdG8gZG8gaGVyZSA/IEplYW4gSUkgKi8KKwkgIC8qIElmIHdlIHdlcmUgY29ubmVjdGVkLCBjbGVhbnVwICYgY2xvc2UgdGhlIFBQUCBjaGFubmVsLAorCSAgICogd2hpY2ggd2lsbCBraWxsIHBwcGQgKGhhbmd1cCkgYW5kIHRoZSByZXN0ICovCisJICBwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKCZzZWxmLT5jaGFuKTsKKwkgIHNlbGYtPnBwcF9vcGVuID0gMDsKKyNlbmRpZgorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBJZiB3ZSB3ZXJlIHRyeWluZyB0byBjb25uZWN0LCBmbHVzaCAoZHJhaW4pIHBwcF9nZW5lcmljCisJICAgKiBUeCBxdWV1ZSAobW9zdCBvZnRlbiB3ZSBoYXZlIGJsb2NrZWQgaXQpLCB3aGljaCB3aWxsCisJICAgKiB0cmlnZ2VyIGFuIG90aGVyIGF0dGVtcHQgdG8gY29ubmVjdC4gSWYgd2UgYXJlIHBhc3NpdmUsCisJICAgKiB0aGlzIHdpbGwgZW1wdHkgdGhlIFR4IHF1ZXVlIGFmdGVyIGxhc3QgdHJ5LiAqLworCSAgcHBwX291dHB1dF93YWtldXAoJnNlbGYtPmNoYW4pOworCX0KKyAgICB9CisKKyAgREVYSVQoSVJEQV9UQ0JfVFJBQ0UsICJcbiIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfY29ubmVjdF9jb25maXJtIChpbnN0YW5jZSwgc2FwLCBxb3MsIG1heF9zZHVfc2l6ZSwgc2tiKQorICoKKyAqICAgIENvbm5lY3Rpb25zIGhhcyBiZWVuIGNvbmZpcm1lZCBieSB0aGUgcmVtb3RlIGRldmljZQorICoKKyAqLworc3RhdGljIHZvaWQKK2lybmV0X2Nvbm5lY3RfY29uZmlybSh2b2lkICoJaW5zdGFuY2UsCisJCSAgICAgIHZvaWQgKglzYXAsIAorCQkgICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKKwkJICAgICAgX191MzIJbWF4X3NkdV9zaXplLAorCQkgICAgICBfX3U4CW1heF9oZWFkZXJfc2l6ZSwgCisJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisgIGlybmV0X3NvY2tldCAqCXNlbGYgPSAoaXJuZXRfc29ja2V0ICopIGluc3RhbmNlOworCisgIERFTlRFUihJUkRBX1RDQl9UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKworICAvKiBDaGVjayBpZiBzb2NrZXQgaXMgY2xvc2luZyBkb3duICh2aWEgaXJkYV9pcm5ldF9kZXN0cm95KCkpICovCisgIGlmKCEgdGVzdF9iaXQoMCwgJnNlbGYtPnR0cF9jb25uZWN0KSkKKyAgICB7CisgICAgICBERVJST1IoSVJEQV9DQl9FUlJPUiwgIlNvY2tldCBubyBsb25nZXIgY29ubmVjdGluZy4gT3VjaCAhXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogSG93IG11Y2ggaGVhZGVyIHNwYWNlIGRvIHdlIG5lZWQgdG8gcmVzZXJ2ZSAqLworICBzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CisKKyAgLyogSXJUVFAgbWF4IFNEVSBzaXplIGluIHRyYW5zbWl0IGRpcmVjdGlvbiAqLworICBzZWxmLT5tYXhfc2R1X3NpemVfdHggPSBtYXhfc2R1X3NpemU7CisgIHNlbGYtPm1heF9kYXRhX3NpemUgPSBtYXhfc2R1X3NpemU7CisjaWZkZWYgU1RSRUFNX0NPTVBBVAorICBpZihtYXhfc2R1X3NpemUgPT0gMCkKKyAgICBzZWxmLT5tYXhfZGF0YV9zaXplID0gaXJ0dHBfZ2V0X21heF9zZWdfc2l6ZShzZWxmLT50c2FwKTsKKyNlbmRpZiAvKiBTVFJFQU1fQ09NUEFUICovCisKKyAgLyogQXQgdGhpcyBwb2ludCwgSXJMTVAgaGFzIGFzc2lnbmVkIG91ciBzb3VyY2UgYWRkcmVzcyAqLworICBzZWxmLT5zYWRkciA9IGlydHRwX2dldF9zYWRkcihzZWxmLT50c2FwKTsKKworICAvKiBBbGxvdyBoaWdoZXIgbGF5ZXIgdG8gYWNjZXNzIElyVFRQICovCisgIHNldF9iaXQoMCwgJnNlbGYtPnR0cF9vcGVuKTsKKyAgY2xlYXJfYml0KDAsICZzZWxmLT50dHBfY29ubmVjdCk7CS8qIE5vdCByYWN5LCBJckRBIHRyYWZmaWMgaXMgc2VyaWFsICovCisgIC8qIEdpdmUgYSBraWNrIGluIHRoZSBhc3Mgb2YgcHBwX2dlbmVyaWMgc28gdGhhdCBoZSBzZW5kcyB1cyBzb21lIGRhdGEgKi8KKyAgcHBwX291dHB1dF93YWtldXAoJnNlbGYtPmNoYW4pOworCisgIC8qIENoZWNrIHNpemUgb2YgcmVjZWl2ZWQgcGFja2V0ICovCisgIGlmKHNrYi0+bGVuID4gMCkKKyAgICB7CisjaWZkZWYgUEFTU19DT05ORUNUX1BBQ0tFVFMKKyAgICAgIERFQlVHKElSREFfQ0JfSU5GTywgIlBhc3NpbmcgY29ubmVjdCBwYWNrZXQgdG8gUFBQLlxuIik7CisgICAgICAvKiBUcnkgdG8gcGFzcyBpdCB0byBQUFAgKi8KKyAgICAgIGlybmV0X2RhdGFfaW5kaWNhdGlvbihpbnN0YW5jZSwgc2FwLCBza2IpOworI2Vsc2UgLyogUEFTU19DT05ORUNUX1BBQ0tFVFMgKi8KKyAgICAgIERFUlJPUihJUkRBX0NCX0VSUk9SLCAiRHJvcHBpbmcgbm9uIGVtcHR5IHBhY2tldC5cbiIpOworICAgICAga2ZyZWVfc2tiKHNrYik7CS8qIE5vdGUgOiB3aWxsIGJlIG9wdGltaXNlZCB3aXRoIG90aGVyIGtmcmVlLi4uICovCisjZW5kaWYgLyogUEFTU19DT05ORUNUX1BBQ0tFVFMgKi8KKyAgICB9CisgIGVsc2UKKyAgICBrZnJlZV9za2Ioc2tiKTsKKworICAvKiBOb3RpZnkgdGhlIGNvbnRyb2wgY2hhbm5lbCAqLworICBpcm5ldF9wb3N0X2V2ZW50KHNlbGYsIElSTkVUX0NPTk5FQ1RfVE8sCisJCSAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgc2VsZi0+cm5hbWUsIDApOworCisgIERFWElUKElSREFfVENCX1RSQUNFLCAiXG4iKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlybmV0X2Zsb3dfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgZmxvdykKKyAqCisgKiAgICBVc2VkIGJ5IFRpbnlUUCB0byB0ZWxsIHVzIGlmIGl0IGNhbiBhY2NlcHQgbW9yZSBkYXRhIG9yIG5vdAorICoKKyAqLworc3RhdGljIHZvaWQKK2lybmV0X2Zsb3dfaW5kaWNhdGlvbih2b2lkICoJaW5zdGFuY2UsCisJCSAgICAgIHZvaWQgKglzYXAsCisJCSAgICAgIExPQ0FMX0ZMT1cgZmxvdykgCit7CisgIGlybmV0X3NvY2tldCAqCXNlbGYgPSAoaXJuZXRfc29ja2V0ICopIGluc3RhbmNlOworICBMT0NBTF9GTE9XCQlvbGRmbG93ID0gc2VsZi0+dHhfZmxvdzsKKworICBERU5URVIoSVJEQV9UQ0JfVFJBQ0UsICIoc2VsZj0weCVwLCBmbG93PSVkKVxuIiwgc2VsZiwgZmxvdyk7CisKKyAgLyogVXBkYXRlIG91ciBzdGF0ZSAqLworICBzZWxmLT50eF9mbG93ID0gZmxvdzsKKworICAvKiBDaGVjayB3aGF0IElyVFRQIHdhbnQgdXMgdG8gZG8uLi4gKi8KKyAgc3dpdGNoKGZsb3cpCisgICAgeworICAgIGNhc2UgRkxPV19TVEFSVDoKKyAgICAgIERFQlVHKElSREFfQ0JfSU5GTywgIklyVFRQIHdhbnRzIHVzIHRvIHN0YXJ0IGFnYWluXG4iKTsKKyAgICAgIC8qIENoZWNrIGlmIHdlIHJlYWxseSBuZWVkIHRvIHdha2UgdXAgUFBQICovCisgICAgICBpZihvbGRmbG93ID09IEZMT1dfU1RPUCkKKwlwcHBfb3V0cHV0X3dha2V1cCgmc2VsZi0+Y2hhbik7CisgICAgICBlbHNlCisJREVCVUcoSVJEQV9DQl9JTkZPLCAiQnV0IHdlIHdlcmUgYWxyZWFkeSB0cmFuc21pdHRpbmcgISEhXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkxPV19TVE9QOgorICAgICAgREVCVUcoSVJEQV9DQl9JTkZPLCAiSXJUVFAgd2FudHMgdXMgdG8gc2xvdyBkb3duXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBERUJVRyhJUkRBX0NCX0lORk8sICJVbmtub3duIGZsb3cgY29tbWFuZCFcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIERFWElUKElSREFfVENCX1RSQUNFLCAiXG4iKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlybmV0X3N0YXR1c19pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCByZWFzb24sIHNrYikKKyAqCisgKiAgICBMaW5rIChJckxBUCkgc3RhdHVzIHJlcG9ydC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkCitpcm5ldF9zdGF0dXNfaW5kaWNhdGlvbih2b2lkICoJaW5zdGFuY2UsCisJCQlMSU5LX1NUQVRVUyBsaW5rLAorCQkJTE9DS19TVEFUVVMgbG9jaykKK3sKKyAgaXJuZXRfc29ja2V0ICoJc2VsZiA9IChpcm5ldF9zb2NrZXQgKikgaW5zdGFuY2U7CisKKyAgREVOVEVSKElSREFfVENCX1RSQUNFLCAiKHNlbGY9MHglcClcbiIsIHNlbGYpOworICBEQVNTRVJUKHNlbGYgIT0gTlVMTCwgLCBJUkRBX0NCX0VSUk9SLCAiU2VsZiBpcyBOVUxMICEhIVxuIik7CisKKyAgLyogV2UgY2FuIG9ubHkgZ2V0IHRoaXMgZXZlbnQgaWYgd2UgYXJlIGNvbm5lY3RlZCAqLworICBzd2l0Y2gobGluaykKKyAgICB7CisgICAgY2FzZSBTVEFUVVNfTk9fQUNUSVZJVFk6CisgICAgICBpcm5ldF9wb3N0X2V2ZW50KHNlbGYsIElSTkVUX0JMT0NLRURfTElOSywKKwkJICAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgc2VsZi0+cm5hbWUsIDApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIERFQlVHKElSREFfQ0JfSU5GTywgIlVua25vd24gc3RhdHVzLi4uXG4iKTsKKyAgICB9CisKKyAgREVYSVQoSVJEQV9UQ0JfVFJBQ0UsICJcbiIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfY29ubmVjdF9pbmRpY2F0aW9uKGluc3RhbmNlLCBzYXAsIHFvcywgbWF4X3NkdV9zaXplLCB1c2VyZGF0YSkKKyAqCisgKiAgICBJbmNvbWluZyBjb25uZWN0aW9uCisgKgorICogSW4gdGhlb3J5LCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uIHRoZSBzZXJ2ZXIgc29ja2V0LgorICogU29tZSBvdGhlciBub2RlIGlzIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byB0aGUgSXJORVQgc2VydmljZSwgYW5kIGhhcworICogc2VudCBhIGNvbm5lY3Rpb24gcmVxdWVzdCBvbiBvdXIgc2VydmVyIHNvY2tldC4KKyAqIFdlIGp1c3QgcmVkaXJlY3QgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHJlbGV2YW50IElyTkVUIHNvY2tldC4KKyAqIAorICogTm90ZSA6IHdlIGFsc28gbWFrZSBzdXJlIHRoYXQgYmV0d2VlbiAyIGlybmV0IG5vZGVzLCB0aGVyZSBjYW4KKyAqIGV4aXN0IG9ubHkgb25lIGlybmV0IGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkCitpcm5ldF9jb25uZWN0X2luZGljYXRpb24odm9pZCAqCQlpbnN0YW5jZSwKKwkJCSB2b2lkICoJCXNhcCwgCisJCQkgc3RydWN0IHFvc19pbmZvICpxb3MsCisJCQkgX191MzIJCW1heF9zZHVfc2l6ZSwKKwkJCSBfX3U4CQltYXhfaGVhZGVyX3NpemUsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgaXJuZXRfc29ja2V0ICoJc2VydmVyID0gJmlybmV0X3NlcnZlci5zOworICBpcm5ldF9zb2NrZXQgKgluZXcgPSAoaXJuZXRfc29ja2V0ICopIE5VTEw7CisKKyAgREVOVEVSKElSREFfVENCX1RSQUNFLCAiKHNlcnZlcj0weCVwKVxuIiwgc2VydmVyKTsKKyAgREFTU0VSVChpbnN0YW5jZSA9PSAmaXJuZXRfc2VydmVyLCAsIElSREFfQ0JfRVJST1IsCisJICAiSW52YWxpZCBpbnN0YW5jZSAoMHglcCkgISEhXG4iLCBpbnN0YW5jZSk7CisgIERBU1NFUlQoc2FwID09IGlybmV0X3NlcnZlci5zLnRzYXAsICwgSVJEQV9DQl9FUlJPUiwgIkludmFsaWQgc2FwICEhIVxuIik7CisKKyAgLyogVHJ5IHRvIGZpbmQgdGhlIG1vc3QgYXBwcm9wcmlhdGUgSXJORVQgc29ja2V0ICovCisgIG5ldyA9IGlybmV0X2ZpbmRfc29ja2V0KHNlcnZlcik7CisKKyAgLyogQWZ0ZXIgYWxsIHRoaXMgaGFyZCB3b3JrLCBkbyB3ZSBoYXZlIGFuIHNvY2tldCA/ICovCisgIGlmKG5ldyA9PSAoaXJuZXRfc29ja2V0ICopIE5VTEwpCisgICAgeworICAgICAgREVYSVQoSVJEQV9DQl9JTkZPLCAiOiBObyBzb2NrZXQgd2FpdGluZyBmb3IgdGhpcyBjb25uZWN0aW9uLlxuIik7CisgICAgICBpcm5ldF9kaXNjb25uZWN0X3NlcnZlcihzZXJ2ZXIsIHNrYik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIElzIHRoZSBzb2NrZXQgYWxyZWFkeSBidXN5ID8gKi8KKyAgaWYodGVzdF9iaXQoMCwgJm5ldy0+dHRwX29wZW4pKQorICAgIHsKKyAgICAgIERFWElUKElSREFfQ0JfSU5GTywgIjogU29ja2V0IGFscmVhZHkgY29ubmVjdGVkLlxuIik7CisgICAgICBpcm5ldF9kaXNjb25uZWN0X3NlcnZlcihzZXJ2ZXIsIHNrYik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBhIGJpdCB0cmlja3ksIHNvIG5lZWQgY29tbWVudHMgOy0pCisgICAqLworICAvKiBJZiB0dHBfY29ubmVjdCBpcyBzZXQsIHRoZSBzb2NrZXQgaXMgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gdGhlIG90aGVyCisgICAqIGVuZCBhbmQgbWF5IGhhdmUgc2VudCBhIElyVFRQIGNvbm5lY3Rpb24gcmVxdWVzdCBhbmQgaXMgd2FpdGluZyBmb3IKKyAgICogYSBjb25uZWN0aW9uIHJlc3BvbnNlICh0aGF0IG1heSBuZXZlciBjb21lKS4KKyAgICogTm93LCB0aGUgcGFpbiBpcyB0aGF0IHRoZSBzb2NrZXQgbWF5IGhhdmUgb3BlbmVkIGEgdHNhcCBhbmQgaXMKKyAgICogd2FpdGluZyBvbiBpdCwgd2hpbGUgdGhlIG90aGVyIGVuZCBpcyB0cnlpbmcgdG8gY29ubmVjdCB0byBpdCBvbgorICAgKiBhbm90aGVyIHRzYXAuCisgICAqIEJlY2F1c2UgSXJORVQgY2FuIGJlIHBlZXIgdG8gcGVlciwgd2UgbmVlZCB0byB3b3JrYXJvdW5kIHRoaXMuCisgICAqIEZ1cnRoZXJtb3JlLCB0aGUgd2F5IHRoZSBpcm5ldGQgc2NyaXB0IGlzIGltcGxlbWVudGVkLCB0aGUKKyAgICogdGFyZ2V0IHdpbGwgY3JlYXRlIGEgc2Vjb25kIElyTkVUIGNvbm5lY3Rpb24gYmFjayB0byB0aGUKKyAgICogb3JpZ2luYXRvciBhbmQgZXhwZWN0IHRoZSBvcmlnaW5hdG9yIHRvIGJpbmQgdGhpcyBuZXcgY29ubmVjdGlvbgorICAgKiB0byB0aGUgb3JpZ2luYWwgUFBQRCBpbnN0YW5jZS4KKyAgICogQW5kIG9mIGNvdXJzZSwgaWYgd2UgZG9uJ3QgdXNlIGlybmV0ZCwgd2UgY2FuIGhhdmUgYSByYWNlIHdoZW4KKyAgICogYm90aCBzaWRlIHRyeSB0byBjb25uZWN0IHNpbXVsdGFuZW91c2x5LCB3aGljaCBjb3VsZCBsZWF2ZSBib3RoCisgICAqIGNvbm5lY3Rpb25zIGhhbGYgY2xvc2VkICh5dWNrKS4KKyAgICogQ29uY2x1c2lvbnMgOgorICAgKgkxKSBUaGUgIm9yaWdpbmF0b3IiIG11c3QgYWNjZXB0IHRoZSBuZXcgY29ubmVjdGlvbiBhbmQgZ2V0IHJpZAorICAgKgkgICBvZiB0aGUgb2xkIG9uZSBzbyB0aGF0IGlybmV0ZCB3b3JrcworICAgKgkyKSBPbmUgc2lkZSBtdXN0IGRlbnkgdGhlIG5ldyBjb25uZWN0aW9uIHRvIGF2b2lkIHJhY2VzLAorICAgKgkgICBidXQgYm90aCBzaWRlIG11c3QgYWdyZWUgb24gd2hpY2ggc2lkZSBpdCBpcy4uLgorICAgKiBNb3N0IG9mdGVuLCB0aGUgb3JpZ2luYXRvciBpcyBwcmltYXJ5IGF0IHRoZSBMQVAgbGF5ZXIuCisgICAqIEplYW4gSUkKKyAgICovCisgIC8qIE5vdywgbGV0J3MgbG9vayBhdCB0aGUgd2F5IEkgd3JvdGUgdGhlIHRlc3QuLi4KKyAgICogV2UgbmVlZCB0byBjbGVhciB1cCB0aGUgdHRwX2Nvbm5lY3QgZmxhZyBhdG9taWNhbGx5IHRvIHByZXZlbnQKKyAgICogaXJuZXRfZGlzY29ubmVjdF9pbmRpY2F0aW9uKCkgdG8gbWVzcyB1cCB0aGUgdHNhcCB3ZSBhcmUgZ29pbmcgdG8gY2xvc2UuCisgICAqIFdlIHdhbnQgdG8gY2xlYXIgdGhlIHR0cF9jb25uZWN0IGZsYWcgb25seSBpZiB3ZSBjbG9zZSB0aGUgdHNhcCwKKyAgICogb3RoZXJ3aXNlIHdlIHdpbGwgbmV2ZXIgY2xvc2UgaXQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHByaW1hcnkKKyAgICogKmJlZm9yZSogZG9pbmcgdGhlIHRlc3Qgb24gdGhlIGZsYWcuCisgICAqIEFuZCBvZiBjb3Vyc2UsIEFMTE9XX1NJTVVMVF9DT05ORUNUIGNhbiBkaXNhYmxlIHRoaXMgZW50aXJlbHkuLi4KKyAgICogSmVhbiBJSQorICAgKi8KKworICAvKiBTb2NrZXQgYWxyZWFkeSBjb25uZWN0aW5nID8gT24gcHJpbWFyeSA/ICovCisgIGlmKDAKKyNpZmRlZiBBTExPV19TSU1VTFRfQ09OTkVDVAorICAgICB8fCAoKGlydHRwX2lzX3ByaW1hcnkoc2VydmVyLT50c2FwKSA9PSAxKQkvKiBwcmltYXJ5ICovCisJICYmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJm5ldy0+dHRwX2Nvbm5lY3QpKSkKKyNlbmRpZiAvKiBBTExPV19TSU1VTFRfQ09OTkVDVCAqLworICAgICApCisgICAgeworICAgICAgREVSUk9SKElSREFfQ0JfRVJST1IsICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0aW5nLCBidXQgZ29pbmcgdG8gcmV1c2UgaXQgIVxuIik7CisKKyAgICAgIC8qIENsZWFudXAgdGhlIG9sZCBUU0FQIGlmIG5lY2Vzc2FyeSAtIElySUFQIHdpbGwgYmUgY2xlYW5lZCB1cCBsYXRlciAqLworICAgICAgaWYobmV3LT50c2FwICE9IE5VTEwpCisJeworCSAgLyogQ2xvc2UgdGhlIG9sZCBjb25uZWN0aW9uIHRoZSBuZXcgc29ja2V0IHdhcyBhdHRlbXB0aW5nLAorCSAgICogc28gdGhhdCB3ZSBjYW4gaG9vayBpdCB1cCB0byB0aGUgbmV3IGNvbm5lY3Rpb24uCisJICAgKiBJdCdzIG5vdyBzYWZlIHRvIGRvIGl0Li4uICovCisJICBpcnR0cF9jbG9zZV90c2FwKG5ldy0+dHNhcCk7CisJICBuZXctPnRzYXAgPSBOVUxMOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaHJlZSBvcHRpb25zIDoKKyAgICAgICAqIDEpIHNvY2tldCB3YXMgbm90IGNvbm5lY3Rpbmcgb3IgY29ubmVjdGVkIDogdHRwX2Nvbm5lY3Qgc2hvdWxkIGJlIDAuCisgICAgICAgKiAyKSB3ZSBkb24ndCB3YW50IHRvIGNvbm5lY3QgdGhlIHNvY2tldCBiZWNhdXNlIHdlIGFyZSBzZWNvbmRhcnkgb3IKKyAgICAgICAqIEFMTE9XX1NJTVVMVF9DT05ORUNUIGlzIHVuZGVmaW5lZC4gdHRwX2Nvbm5lY3Qgc2hvdWxkIGJlIDEuCisgICAgICAgKiAzKSB3ZSBhcmUgaGFsZiB3YXkgaW4gaXJuZXRfZGlzY29ubmVjdF9pbmRpY2F0aW9uKCksIGFuZCBpdCdzIGEKKyAgICAgICAqIG5pY2UgcmFjZSBjb25kaXRpb24uLi4gRm9ydHVuYXRlbHksIHdlIGNhbiBkZXRlY3QgdGhhdCBieSBjaGVja2luZworICAgICAgICogaWYgdHNhcCBpcyBzdGlsbCBhbGl2ZS4gT24gdGhlIG90aGVyIGhhbmQsIHdlIGNhbid0IGJlIGluCisgICAgICAgKiBpcmRhX2lybmV0X2Rlc3Ryb3koKSBvdGhlcndpc2Ugd2Ugd291bGQgbm90IGhhdmUgZm91bmQgdGhpcworICAgICAgICogc29ja2V0IGluIHRoZSBoYXNoYmluLgorICAgICAgICogSmVhbiBJSSAqLworICAgICAgaWYoKHRlc3RfYml0KDAsICZuZXctPnR0cF9jb25uZWN0KSkgfHwgKG5ldy0+dHNhcCAhPSBOVUxMKSkKKwl7CisJICAvKiBEb24ndCBtZXNzIHRoaXMgc29ja2V0LCBzb21lYm9keSBlbHNlIGluIGluIGNoYXJnZS4uLiAqLworCSAgREVSUk9SKElSREFfQ0JfRVJST1IsICJSYWNlIGNvbmRpdGlvbiBkZXRlY3RlZCwgc29ja2V0IGluIHVzZSwgYWJvcnQgY29ubmVjdC4uLlxuIik7CisJICBpcm5ldF9kaXNjb25uZWN0X3NlcnZlcihzZXJ2ZXIsIHNrYik7CisJICByZXR1cm47CisJfQorICAgIH0KKworICAvKiBTbyA6IGF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYSBzb2NrZXQsIGFuZCBpdCBpcyBpZGxlLiBHb29kICEgKi8KKyAgaXJuZXRfY29ubmVjdF9zb2NrZXQoc2VydmVyLCBuZXcsIHFvcywgbWF4X3NkdV9zaXplLCBtYXhfaGVhZGVyX3NpemUpOworCisgIC8qIENoZWNrIHNpemUgb2YgcmVjZWl2ZWQgcGFja2V0ICovCisgIGlmKHNrYi0+bGVuID4gMCkKKyAgICB7CisjaWZkZWYgUEFTU19DT05ORUNUX1BBQ0tFVFMKKyAgICAgIERFQlVHKElSREFfQ0JfSU5GTywgIlBhc3NpbmcgY29ubmVjdCBwYWNrZXQgdG8gUFBQLlxuIik7CisgICAgICAvKiBUcnkgdG8gcGFzcyBpdCB0byBQUFAgKi8KKyAgICAgIGlybmV0X2RhdGFfaW5kaWNhdGlvbihuZXcsIG5ldy0+dHNhcCwgc2tiKTsKKyNlbHNlIC8qIFBBU1NfQ09OTkVDVF9QQUNLRVRTICovCisgICAgICBERVJST1IoSVJEQV9DQl9FUlJPUiwgIkRyb3BwaW5nIG5vbiBlbXB0eSBwYWNrZXQuXG4iKTsKKyAgICAgIGtmcmVlX3NrYihza2IpOwkvKiBOb3RlIDogd2lsbCBiZSBvcHRpbWlzZWQgd2l0aCBvdGhlciBrZnJlZS4uLiAqLworI2VuZGlmIC8qIFBBU1NfQ09OTkVDVF9QQUNLRVRTICovCisgICAgfQorICBlbHNlCisgICAga2ZyZWVfc2tiKHNrYik7CisKKyAgREVYSVQoSVJEQV9UQ0JfVFJBQ0UsICJcbiIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIElSREEtSUFTL0xNUCBDQUxMQkFDS1MgKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGVzZSBhcmUgdGhlIGNhbGxiYWNrcyBjYWxsZWQgYnkgb3RoZXIgbGF5ZXJzIG9mIHRoZSBJckRBIHN0YWNrLAorICogbWFpbmx5IExNUCBmb3IgZGlzY292ZXJ5IGFuZCBJQVMgZm9yIG5hbWUgcXVlcmllcy4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfZ2V0dmFsdWVfY29uZmlybSAocmVzdWx0LCBvYmpfaWQsIHZhbHVlLCBwcml2KQorICoKKyAqICAgIEdvdCBhbnN3ZXIgZnJvbSByZW1vdGUgTE0tSUFTLCBqdXN0IGNvbm5lY3QKKyAqCisgKiBUaGlzIGlzIHRoZSByZXBseSB0byBhIElBUyBxdWVyeSB3ZSB3ZXJlIGRvaW5nIHRvIGZpbmQgdGhlIFRTQVAgb2YKKyAqIHRoZSBkZXZpY2Ugd2Ugd2FudCB0byBjb25uZWN0IHRvLgorICogSWYgd2UgaGF2ZSBmb3VuZCBhIHZhbGlkIFRTQVAsIGp1c3QgaW5pdGlhdGUgdGhlIFRUUCBjb25uZWN0aW9uCisgKiBvbiB0aGlzIFRTQVAuCisgKi8KK3N0YXRpYyB2b2lkCitpcm5ldF9nZXR2YWx1ZV9jb25maXJtKGludAlyZXN1bHQsCisJCSAgICAgICBfX3UxNglvYmpfaWQsIAorCQkgICAgICAgc3RydWN0IGlhc192YWx1ZSAqdmFsdWUsCisJCSAgICAgICB2b2lkICoJcHJpdikKK3sKKyAgaXJuZXRfc29ja2V0ICoJc2VsZiA9IChpcm5ldF9zb2NrZXQgKikgcHJpdjsKKworICBERU5URVIoSVJEQV9PQ0JfVFJBQ0UsICIoc2VsZj0weCVwKVxuIiwgc2VsZik7CisgIERBU1NFUlQoc2VsZiAhPSBOVUxMLCAsIElSREFfT0NCX0VSUk9SLCAiU2VsZiBpcyBOVUxMICEhIVxuIik7CisKKyAgLyogQ2hlY2sgaWYgYWxyZWFkeSBjb25uZWN0ZWQgKHZpYSBpcm5ldF9jb25uZWN0X3NvY2tldCgpKQorICAgKiBvciBzb2NrZXQgaXMgY2xvc2luZyBkb3duICh2aWEgaXJkYV9pcm5ldF9kZXN0cm95KCkpICovCisgIGlmKCEgdGVzdF9iaXQoMCwgJnNlbGYtPnR0cF9jb25uZWN0KSkKKyAgICB7CisgICAgICBERVJST1IoSVJEQV9PQ0JfRVJST1IsICJTb2NrZXQgbm8gbG9uZ2VyIGNvbm5lY3RpbmcuIE91Y2ggIVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFdlIHByb2JhYmx5IGRvbid0IG5lZWQgdG8gbWFrZSBhbnkgbW9yZSBxdWVyaWVzICovCisgIGlyaWFwX2Nsb3NlKHNlbGYtPmlyaWFwKTsKKyAgc2VsZi0+aXJpYXAgPSBOVUxMOworCisgIC8qIFBvc3QgcHJvY2VzcyB0aGUgSUFTIHJlcGx5ICovCisgIHNlbGYtPmR0c2FwX3NlbCA9IGlybmV0X2lhc190b190c2FwKHNlbGYsIHJlc3VsdCwgdmFsdWUpOworCisgIC8qIElmIGVycm9yLCBqdXN0IGdvIG91dCAqLworICBpZihzZWxmLT5lcnJubykKKyAgICB7CisgICAgICBjbGVhcl9iaXQoMCwgJnNlbGYtPnR0cF9jb25uZWN0KTsKKyAgICAgIERFUlJPUihJUkRBX09DQl9FUlJPUiwgIklBUyBjb25uZWN0IGZhaWxlZCAhICgweCVYKVxuIiwgc2VsZi0+ZXJybm8pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBERUJVRyhJUkRBX09DQl9JTkZPLCAiZGFkZHIgPSAlMDh4LCBsc2FwID0gJWQsIHN0YXJ0aW5nIElyVFRQIGNvbm5lY3Rpb25cbiIsCisJc2VsZi0+ZGFkZHIsIHNlbGYtPmR0c2FwX3NlbCk7CisKKyAgLyogU3RhcnQgdXAgVFRQIC0gbm9uIGJsb2NraW5nICovCisgIGlybmV0X2Nvbm5lY3RfdHNhcChzZWxmKTsKKworICBERVhJVChJUkRBX09DQl9UUkFDRSwgIlxuIik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9kaXNjb3ZlcnZhbHVlX2NvbmZpcm0gKHJlc3VsdCwgb2JqX2lkLCB2YWx1ZSwgcHJpdikKKyAqCisgKiAgICBIYW5kbGUgdGhlIFRTQVAgZGlzY292ZXJ5IHByb2NlZHVyZSBzdGF0ZSBtYWNoaW5lLgorICogICAgR290IGFuc3dlciBmcm9tIHJlbW90ZSBMTS1JQVMsIHRyeSBuZXh0IGRldmljZQorICoKKyAqIFdlIGFyZSBkb2luZyBhICBUU0FQIGRpc2NvdmVyeSBwcm9jZWR1cmUsIGFuZCB3ZSBnb3QgYW4gYW5zd2VyIHRvCisgKiBhIElBUyBxdWVyeSB3ZSB3ZXJlIGRvaW5nIHRvIGZpbmQgdGhlIFRTQVAgb24gb25lIG9mIHRoZSBhZGRyZXNzCisgKiBpbiB0aGUgZGlzY292ZXJ5IGxvZy4KKyAqCisgKiBJZiB3ZSBoYXZlIGZvdW5kIGEgdmFsaWQgVFNBUCBmb3IgdGhlIGZpcnN0IHRpbWUsIHNhdmUgaXQuIElmIGl0J3MKKyAqIG5vdCB0aGUgZmlyc3QgdGltZSB3ZSBmb3VuZCBvbmUsIGNvbXBsYWluLgorICoKKyAqIElmIHdlIGhhdmUgbW9yZSBhZGRyZXNzZXMgaW4gdGhlIGxvZywganVzdCBpbml0aWF0ZSBhIG5ldyBxdWVyeS4KKyAqIE5vdGUgdGhhdCB0aG9zZSBxdWVyeSBtYXkgZmFpbCAoc2VlIGlybmV0X2Rpc2NvdmVyX2RhZGRyX2FuZF9sc2FwX3NlbCgpKQorICoKKyAqIE90aGVyd2lzZSwgd3JhcCB1cCB0aGUgcHJvY2VkdXJlIChjbGVhbnVwKSwgY2hlY2sgaWYgd2UgaGF2ZSBmb3VuZAorICogYW55IGRldmljZSBhbmQgY29ubmVjdCB0byBpdC4KKyAqLworc3RhdGljIHZvaWQKK2lybmV0X2Rpc2NvdmVydmFsdWVfY29uZmlybShpbnQJCXJlc3VsdCwKKwkJCSAgICBfX3UxNglvYmpfaWQsIAorCQkJICAgIHN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlLAorCQkJICAgIHZvaWQgKglwcml2KQoreworICBpcm5ldF9zb2NrZXQgKglzZWxmID0gKGlybmV0X3NvY2tldCAqKSBwcml2OworICBfX3U4CQkJZHRzYXBfc2VsOwkJLyogVFNBUCB3ZSBhcmUgbG9va2luZyBmb3IgKi8KKworICBERU5URVIoSVJEQV9PQ0JfVFJBQ0UsICIoc2VsZj0weCVwKVxuIiwgc2VsZik7CisgIERBU1NFUlQoc2VsZiAhPSBOVUxMLCAsIElSREFfT0NCX0VSUk9SLCAiU2VsZiBpcyBOVUxMICEhIVxuIik7CisKKyAgLyogQ2hlY2sgaWYgYWxyZWFkeSBjb25uZWN0ZWQgKHZpYSBpcm5ldF9jb25uZWN0X3NvY2tldCgpKQorICAgKiBvciBzb2NrZXQgaXMgY2xvc2luZyBkb3duICh2aWEgaXJkYV9pcm5ldF9kZXN0cm95KCkpICovCisgIGlmKCEgdGVzdF9iaXQoMCwgJnNlbGYtPnR0cF9jb25uZWN0KSkKKyAgICB7CisgICAgICBERVJST1IoSVJEQV9PQ0JfRVJST1IsICJTb2NrZXQgbm8gbG9uZ2VyIGNvbm5lY3RpbmcuIE91Y2ggIVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFBvc3QgcHJvY2VzcyB0aGUgSUFTIHJlcGx5ICovCisgIGR0c2FwX3NlbCA9IGlybmV0X2lhc190b190c2FwKHNlbGYsIHJlc3VsdCwgdmFsdWUpOworCisgIC8qIEhhdmUgd2UgZ290IHNvbWV0aGluZyA/ICovCisgIGlmKHNlbGYtPmVycm5vID09IDApCisgICAgeworICAgICAgLyogV2UgZm91bmQgdGhlIHJlcXVlc3RlZCBzZXJ2aWNlICovCisgICAgICBpZihzZWxmLT5kYWRkciAhPSBERVZfQUREUl9BTlkpCisJeworCSAgREVSUk9SKElSREFfT0NCX0VSUk9SLCAiTW9yZSB0aGFuIG9uZSBkZXZpY2UgaW4gcmFuZ2Ugc3VwcG9ydHMgSXJORVQuLi5cbiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBGaXJzdCB0aW1lIHdlIGZvdW5kIHRoYXQgb25lLCBzYXZlIGl0ICEgKi8KKwkgIHNlbGYtPmRhZGRyID0gc2VsZi0+ZGlzY292ZXJpZXNbc2VsZi0+ZGlzY29faW5kZXhdLmRhZGRyOworCSAgc2VsZi0+ZHRzYXBfc2VsID0gZHRzYXBfc2VsOworCX0KKyAgICB9CisKKyAgLyogSWYgbm8gZmFpbHVyZSAqLworICBpZigoc2VsZi0+ZXJybm8gPT0gLUVBRERSTk9UQVZBSUwpIHx8IChzZWxmLT5lcnJubyA9PSAwKSkKKyAgICB7CisgICAgICBpbnQJcmV0OworCisgICAgICAvKiBTZWFyY2ggdGhlIG5leHQgbm9kZSAqLworICAgICAgcmV0ID0gaXJuZXRfZGlzY292ZXJfbmV4dF9kYWRkcihzZWxmKTsKKyAgICAgIGlmKCFyZXQpCisJeworCSAgLyogSW4gdGhpcyBjYXNlLCB0aGUgYWJvdmUgcmVxdWVzdCB3YXMgbm9uLWJsb2NraW5nLgorCSAgICogV2Ugd2lsbCByZXR1cm4gaGVyZSBhZnRlciBhIHdoaWxlLi4uICovCisJICByZXR1cm47CisJfQorICAgICAgLyogSW4gdGhpcyBjYXNlLCB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUgbGFzdCBkaXNjb3ZlcnkgaXRlbSAqLworICAgIH0KKworICAvKiBObyBtb3JlIHF1ZXJpZXMgdG8gYmUgZG9uZSAoZmFpbHVyZSBvciBsYXN0IG9uZSkgKi8KKworICAvKiBXZSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIG1ha2UgYW55IG1vcmUgcXVlcmllcyAqLworICBpcmlhcF9jbG9zZShzZWxmLT5pcmlhcCk7CisgIHNlbGYtPmlyaWFwID0gTlVMTDsKKworICAvKiBObyBtb3JlIGl0ZW1zIDogcmVtb3ZlIHRoZSBsb2cgYW5kIHNpZ25hbCB0ZXJtaW5hdGlvbiAqLworICBERUJVRyhJUkRBX09DQl9JTkZPLCAiQ2xlYW5pbmcgdXAgbG9nICgweCVwKVxuIiwKKwlzZWxmLT5kaXNjb3Zlcmllcyk7CisgIGlmKHNlbGYtPmRpc2NvdmVyaWVzICE9IE5VTEwpCisgICAgeworICAgICAgLyogQ2xlYW51cCBvdXIgY29weSBvZiB0aGUgZGlzY292ZXJ5IGxvZyAqLworICAgICAga2ZyZWUoc2VsZi0+ZGlzY292ZXJpZXMpOworICAgICAgc2VsZi0+ZGlzY292ZXJpZXMgPSBOVUxMOworICAgIH0KKyAgc2VsZi0+ZGlzY29fbnVtYmVyID0gLTE7CisKKyAgLyogQ2hlY2sgb3V0IHdoYXQgd2UgZm91bmQgKi8KKyAgaWYoc2VsZi0+ZGFkZHIgPT0gREVWX0FERFJfQU5ZKQorICAgIHsKKyAgICAgIHNlbGYtPmRhZGRyID0gREVWX0FERFJfQU5ZOworICAgICAgY2xlYXJfYml0KDAsICZzZWxmLT50dHBfY29ubmVjdCk7CisgICAgICBERVhJVChJUkRBX09DQl9UUkFDRSwgIjogY2Fubm90IGRpc2NvdmVyIElyTkVUIGluIGFueSBkZXZpY2UgISEhXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogV2UgaGF2ZSBhIHZhbGlkIGFkZHJlc3MgLSBqdXN0IGNvbm5lY3QgKi8KKworICBERUJVRyhJUkRBX09DQl9JTkZPLCAiZGFkZHIgPSAlMDh4LCBsc2FwID0gJWQsIHN0YXJ0aW5nIElyVFRQIGNvbm5lY3Rpb25cbiIsCisJc2VsZi0+ZGFkZHIsIHNlbGYtPmR0c2FwX3NlbCk7CisKKyAgLyogU3RhcnQgdXAgVFRQIC0gbm9uIGJsb2NraW5nICovCisgIGlybmV0X2Nvbm5lY3RfdHNhcChzZWxmKTsKKworICBERVhJVChJUkRBX09DQl9UUkFDRSwgIlxuIik7Cit9CisKKyNpZmRlZiBESVNDT1ZFUllfRVZFTlRTCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfZGlzY292ZXJ5X2luZGljYXRpb24gKGRpc2NvdmVyeSkKKyAqCisgKiAgICBHb3QgYSBkaXNjb3ZlcnkgaW5kaWNhdGlvbiBmcm9tIElyTE1QLCBwb3N0IGFuIGV2ZW50CisgKgorICogTm90ZSA6IElyTE1QIHRha2UgY2FyZSBvZiBtYXRjaGluZyB0aGUgaGludCBtYXNrIGZvciB1cywgYW5kIGFsc28KKyAqIGNoZWNrIGlmIGl0IGlzIGEgIm5ldyIgbm9kZSBmb3IgdXMuLi4KKyAqCisgKiBBcyBJckxNUCBmaWx0ZXIgb24gdGhlIElyTEFOIGhpbnQgYml0LCB3ZSBnZXQgYm90aCBJckxBTiBhbmQgSXJORVQKKyAqIG5vZGVzLCBzbyBpdCdzIG9ubHkgYXQgY29ubmVjdGlvbiB0aW1lIHRoYXQgd2Ugd2lsbCBrbm93IGlmIHRoZQorICogbm9kZSBzdXBwb3J0IElyTkVULCBJckxBTiBvciBib3RoLiBUaGUgb3RoZXIgc29sdXRpb24gaXMgdG8gY2hlY2sKKyAqIGluIElBUyB0aGUgUE5QIGlkcyBhbmQgc2VydmljZSBuYW1lLgorICogTm90ZSA6IGV2ZW4gaWYgYSBub2RlIHN1cHBvcnQgSXJORVQgKG9yIElyTEFOKSwgaXQncyBubyBndWFyYW50ZWUKKyAqIHRoYXQgd2Ugd2lsbCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gaXQsIHRoZSBub2RlIG1pZ2h0IGFscmVhZHkgYmUKKyAqIGJ1c3kuLi4KKyAqCisgKiBPbmUgbGFzdCB0aGluZyA6IGluIHNvbWUgY2FzZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHRyaWdnZXIgZHVwbGljYXRlCisgKiBkaXNjb3ZlcnkgZXZlbnRzLiBPbiB0aGUgb3RoZXIgaGFuZCwgd2Ugc2hvdWxkIGNhdGNoIGFsbAorICogZGlzY292ZXJpZXMgcHJvcGVybHkgKGkuZS4gbm90IG1pc3Mgb25lKS4gRmlsdGVyaW5nIGR1cGxpY2F0ZSBoZXJlCisgKiBpcyB0byBtZXNzeSwgc28gd2UgbGVhdmUgdGhhdCB0byB1c2VyIHNwYWNlLi4uCisgKi8KK3N0YXRpYyB2b2lkCitpcm5ldF9kaXNjb3ZlcnlfaW5kaWNhdGlvbihkaXNjaW5mb190ICoJCWRpc2NvdmVyeSwKKwkJCSAgIERJU0NPVkVSWV9NT0RFCW1vZGUsCisJCQkgICB2b2lkICoJCXByaXYpCit7CisgIGlybmV0X3NvY2tldCAqCXNlbGYgPSAmaXJuZXRfc2VydmVyLnM7CisJCisgIERFTlRFUihJUkRBX09DQl9UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKyAgREFTU0VSVChwcml2ID09ICZpcm5ldF9zZXJ2ZXIsICwgSVJEQV9PQ0JfRVJST1IsCisJICAiSW52YWxpZCBpbnN0YW5jZSAoMHglcCkgISEhXG4iLCBwcml2KTsKKworICBERUJVRyhJUkRBX09DQl9JTkZPLCAiRGlzY292ZXJlZCBuZXcgSXJORVQvSXJMQU4gbm9kZSAlcy4uLlxuIiwKKwlkaXNjb3ZlcnktPmluZm8pOworCisgIC8qIE5vdGlmeSB0aGUgY29udHJvbCBjaGFubmVsICovCisgIGlybmV0X3Bvc3RfZXZlbnQoTlVMTCwgSVJORVRfRElTQ09WRVIsCisJCSAgIGRpc2NvdmVyeS0+c2FkZHIsIGRpc2NvdmVyeS0+ZGFkZHIsIGRpc2NvdmVyeS0+aW5mbywKKwkJICAgdTE2aG8oZGlzY292ZXJ5LT5oaW50cykpOworCisgIERFWElUKElSREFfT0NCX1RSQUNFLCAiXG4iKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlybmV0X2V4cGlyeV9pbmRpY2F0aW9uIChleHBpcnkpCisgKgorICogICAgR290IGEgZXhwaXJ5IGluZGljYXRpb24gZnJvbSBJckxNUCwgcG9zdCBhbiBldmVudAorICoKKyAqIE5vdGUgOiBJckxNUCB0YWtlIGNhcmUgb2YgbWF0Y2hpbmcgdGhlIGhpbnQgbWFzayBmb3IgdXMsIHdlIG9ubHkKKyAqIGNoZWNrIGlmIGl0IGlzIGEgIm5ldyIgbm9kZS4uLgorICovCitzdGF0aWMgdm9pZAoraXJuZXRfZXhwaXJ5X2luZGljYXRpb24oZGlzY2luZm9fdCAqCWV4cGlyeSwKKwkJCURJU0NPVkVSWV9NT0RFCW1vZGUsCisJCQl2b2lkICoJCXByaXYpCit7CisgIGlybmV0X3NvY2tldCAqCXNlbGYgPSAmaXJuZXRfc2VydmVyLnM7CisJCisgIERFTlRFUihJUkRBX09DQl9UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKyAgREFTU0VSVChwcml2ID09ICZpcm5ldF9zZXJ2ZXIsICwgSVJEQV9PQ0JfRVJST1IsCisJICAiSW52YWxpZCBpbnN0YW5jZSAoMHglcCkgISEhXG4iLCBwcml2KTsKKworICBERUJVRyhJUkRBX09DQl9JTkZPLCAiSXJORVQvSXJMQU4gbm9kZSAlcyBleHBpcmVkLi4uXG4iLAorCWV4cGlyeS0+aW5mbyk7CisKKyAgLyogTm90aWZ5IHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKyAgaXJuZXRfcG9zdF9ldmVudChOVUxMLCBJUk5FVF9FWFBJUkUsCisJCSAgIGV4cGlyeS0+c2FkZHIsIGV4cGlyeS0+ZGFkZHIsIGV4cGlyeS0+aW5mbywKKwkJICAgdTE2aG8oZXhwaXJ5LT5oaW50cykpOworCisgIERFWElUKElSREFfT0NCX1RSQUNFLCAiXG4iKTsKK30KKyNlbmRpZiAvKiBESVNDT1ZFUllfRVZFTlRTICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqIFBST0MgRU5UUlkgQ0FMTEJBQ0tTICoqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFdlIGNyZWF0ZSBhIGluc3RhbmNlIGluIHRoZSAvcHJvYyBmaWxlc3lzdGVtLCBhbmQgaGVyZSB3ZSB0YWtlIGNhcmUKKyAqIG9mIHRoYXQuLi4KKyAqLworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9wcm9jX3JlYWQgKGJ1Ziwgc3RhcnQsIG9mZnNldCwgbGVuLCB1bnVzZWQpCisgKgorICogICAgR2l2ZSBzb21lIGluZm8gdG8gdGhlIC9wcm9jIGZpbGUgc3lzdGVtCisgKi8KK3N0YXRpYyBpbnQKK2lybmV0X3Byb2NfcmVhZChjaGFyICoJYnVmLAorCQljaGFyICoqCXN0YXJ0LAorCQlvZmZfdAlvZmZzZXQsCisJCWludAlsZW4pCit7CisgIGlybmV0X3NvY2tldCAqCXNlbGY7CisgIGNoYXIgKgkJc3RhdGU7CisgIGludAkJCWkgPSAwOworCisgIGxlbiA9IDA7CisJCisgIC8qIEdldCB0aGUgSXJORVQgc2VydmVyIGluZm9ybWF0aW9uLi4uICovCisgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJJck5FVCBzZXJ2ZXIgLSAiKTsKKyAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIklyREEgc3RhdGU6ICVzLCAiLAorCQkgKGlybmV0X3NlcnZlci5ydW5uaW5nID8gInJ1bm5pbmciIDogImRlYWQiKSk7CisgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJzdHNhcF9zZWw6ICUwMngsICIsIGlybmV0X3NlcnZlci5zLnN0c2FwX3NlbCk7CisgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJkdHNhcF9zZWw6ICUwMnhcbiIsIGlybmV0X3NlcnZlci5zLmR0c2FwX3NlbCk7CisKKyAgLyogRG8gd2UgbmVlZCB0byBjb250aW51ZSA/ICovCisgIGlmKCFpcm5ldF9zZXJ2ZXIucnVubmluZykKKyAgICByZXR1cm4gbGVuOworCisgIC8qIFByb3RlY3QgYWNjZXNzIHRvIHRoZSBpbnN0YW5jZSBsaXN0ICovCisgIHNwaW5fbG9ja19iaCgmaXJuZXRfc2VydmVyLnNwaW5sb2NrKTsKKworICAvKiBHZXQgdGhlIHNvY2tldHMgb25lIGJ5IG9uZS4uLiAqLworICBzZWxmID0gKGlybmV0X3NvY2tldCAqKSBoYXNoYmluX2dldF9maXJzdChpcm5ldF9zZXJ2ZXIubGlzdCk7CisgIHdoaWxlKHNlbGYgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTdGFydCBwcmludGluZyBpbmZvIGFib3V0IHRoZSBzb2NrZXQuICovCisgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiXG5Jck5FVCBzb2NrZXQgJWQgLSAiLCBpKyspOworCisgICAgICAvKiBGaXJzdCwgZ2V0IHRoZSByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiAqLworICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIlJlcXVlc3RlZCBJckRBIG5hbWU6IFwiJXNcIiwgIiwgc2VsZi0+cm5hbWUpOworICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgImRhZGRyOiAlMDh4LCAiLCBzZWxmLT5yZGFkZHIpOworICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgInNhZGRyOiAlMDh4XG4iLCBzZWxmLT5yc2FkZHIpOworCisgICAgICAvKiBTZWNvbmQsIGdldCBhbGwgdGhlIFBQUCBpbmZvICovCisgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiCVBQUCBzdGF0ZTogJXMiLAorCQkgKHNlbGYtPnBwcF9vcGVuID8gInJlZ2lzdGVyZWQiIDogInVucmVnaXN0ZXJlZCIpKTsKKyAgICAgIGlmKHNlbGYtPnBwcF9vcGVuKQorCXsKKwkgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIsIHVuaXQ6IHBwcCVkIiwKKwkJCSBwcHBfdW5pdF9udW1iZXIoJnNlbGYtPmNoYW4pKTsKKwkgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIsIGNoYW5uZWw6ICVkIiwKKwkJCSBwcHBfY2hhbm5lbF9pbmRleCgmc2VsZi0+Y2hhbikpOworCSAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiwgbXJ1OiAlZCIsCisJCQkgc2VsZi0+bXJ1KTsKKwkgIC8qIE1heWJlIGFkZCBzZWxmLT5mbGFncyA/IExhdGVyLi4uICovCisJfQorCisgICAgICAvKiBUaGVuLCBnZXQgYWxsIHRoZSBJckRBIHNwZWNpZmljIGluZm8uLi4gKi8KKyAgICAgIGlmKHNlbGYtPnR0cF9vcGVuKQorCXN0YXRlID0gImNvbm5lY3RlZCI7CisgICAgICBlbHNlCisJaWYoc2VsZi0+dHNhcCAhPSBOVUxMKQorCSAgc3RhdGUgPSAiY29ubmVjdGluZyI7CisJZWxzZQorCSAgaWYoc2VsZi0+aXJpYXAgIT0gTlVMTCkKKwkgICAgc3RhdGUgPSAic2VhcmNoaW5nIjsKKwkgIGVsc2UKKwkgICAgaWYoc2VsZi0+dHRwX2Nvbm5lY3QpCisJICAgICAgc3RhdGUgPSAid2VpcmQiOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAiaWRsZSI7CisgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiXG4JSXJEQSBzdGF0ZTogJXMsICIsIHN0YXRlKTsKKyAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJkYWRkcjogJTA4eCwgIiwgc2VsZi0+ZGFkZHIpOworICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgInN0c2FwX3NlbDogJTAyeCwgIiwgc2VsZi0+c3RzYXBfc2VsKTsKKyAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJkdHNhcF9zZWw6ICUwMnhcbiIsIHNlbGYtPmR0c2FwX3NlbCk7CisKKyAgICAgIC8qIE5leHQgc29ja2V0LCBwbGVhc2UuLi4gKi8KKyAgICAgIHNlbGYgPSAoaXJuZXRfc29ja2V0ICopIGhhc2hiaW5fZ2V0X25leHQoaXJuZXRfc2VydmVyLmxpc3QpOworICAgIH0KKworICAvKiBTcGluIGxvY2sgZW5kICovCisgIHNwaW5fdW5sb2NrX2JoKCZpcm5ldF9zZXJ2ZXIuc3BpbmxvY2spOworCisgIHJldHVybiBsZW47Cit9CisjZW5kaWYgLyogUFJPQ19GUyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqIENPTkZJR1VSQVRJT04vQ0xFQU5VUCAqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEluaXRpYWxpc2F0aW9uIGFuZCB0ZWFyZG93biBvZiB0aGUgSXJEQSBwYXJ0LCBjYWxsZWQgYXQgbW9kdWxlCisgKiBpbnNlcnRpb24gYW5kIHJlbW92YWwuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJlcGFyZSB0aGUgSXJORVQgbGF5ZXIgZm9yIG9wZXJhdGlvbi4uLgorICovCitpbnQgX19pbml0CitpcmRhX2lybmV0X2luaXQodm9pZCkKK3sKKyAgaW50CQllcnIgPSAwOworCisgIERFTlRFUihNT0RVTEVfVFJBQ0UsICIoKVxuIik7CisKKyAgLyogUHVyZSBwYXJhbm9pYSAtIHNob3VsZCBiZSByZWR1bmRhbnQgKi8KKyAgbWVtc2V0KCZpcm5ldF9zZXJ2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgaXJuZXRfcm9vdCkpOworCisgIC8qIFNldHVwIHN0YXJ0IG9mIGlybmV0IGluc3RhbmNlIGxpc3QgKi8KKyAgaXJuZXRfc2VydmVyLmxpc3QgPSBoYXNoYmluX25ldyhIQl9OT0xPQ0spOyAKKyAgREFCT1JUKGlybmV0X3NlcnZlci5saXN0ID09IE5VTEwsIC1FTk9NRU0sCisJIE1PRFVMRV9FUlJPUiwgIkNhbid0IGFsbG9jYXRlIGhhc2hiaW4hXG4iKTsKKyAgLyogSW5pdCBzcGlubG9jayBmb3IgaW5zdGFuY2UgbGlzdCAqLworICBzcGluX2xvY2tfaW5pdCgmaXJuZXRfc2VydmVyLnNwaW5sb2NrKTsKKworICAvKiBJbml0aWFsaXNlIGNvbnRyb2wgY2hhbm5lbCAqLworICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpcm5ldF9ldmVudHMucndhaXQpOworICBpcm5ldF9ldmVudHMuaW5kZXggPSAwOworICAvKiBJbml0IHNwaW5sb2NrIGZvciBldmVudCBsb2dnaW5nICovCisgIHNwaW5fbG9ja19pbml0KCZpcm5ldF9ldmVudHMuc3BpbmxvY2spOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgLyogQWRkIGEgL3Byb2MgZmlsZSBmb3IgaXJuZXQgaW5mb3MgKi8KKyAgY3JlYXRlX3Byb2NfaW5mb19lbnRyeSgiaXJuZXQiLCAwLCBwcm9jX2lyZGEsIGlybmV0X3Byb2NfcmVhZCk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworICAvKiBTZXR1cCB0aGUgSXJORVQgc2VydmVyICovCisgIGVyciA9IGlybmV0X3NldHVwX3NlcnZlcigpOworCisgIGlmKCFlcnIpCisgICAgLyogV2UgYXJlIG5vIGxvbmdlciBmdW5jdGlvbmFsLi4uICovCisgICAgaXJuZXRfc2VydmVyLnJ1bm5pbmcgPSAxOworCisgIERFWElUKE1PRFVMRV9UUkFDRSwgIlxuIik7CisgIHJldHVybiBlcnI7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDbGVhbnVwIGF0IGV4aXQuLi4KKyAqLwordm9pZCBfX2V4aXQKK2lyZGFfaXJuZXRfY2xlYW51cCh2b2lkKQoreworICBERU5URVIoTU9EVUxFX1RSQUNFLCAiKClcbiIpOworCisgIC8qIFdlIGFyZSBubyBsb25nZXIgdGhlcmUuLi4gKi8KKyAgaXJuZXRfc2VydmVyLnJ1bm5pbmcgPSAwOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgLyogUmVtb3ZlIG91ciAvcHJvYyBmaWxlICovCisgIHJlbW92ZV9wcm9jX2VudHJ5KCJpcm5ldCIsIHByb2NfaXJkYSk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworICAvKiBSZW1vdmUgb3VyIElyTkVUIHNlcnZlciBmcm9tIGV4aXN0ZW5jZSAqLworICBpcm5ldF9kZXN0cm95X3NlcnZlcigpOworCisgIC8qIFJlbW92ZSBhbGwgaW5zdGFuY2VzIG9mIElyTkVUIHNvY2tldCBzdGlsbCBwcmVzZW50ICovCisgIGhhc2hiaW5fZGVsZXRlKGlybmV0X3NlcnZlci5saXN0LCAoRlJFRV9GVU5DKSBpcmRhX2lybmV0X2Rlc3Ryb3kpOworCisgIERFWElUKE1PRFVMRV9UUkFDRSwgIlxuIik7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcm5ldC9pcm5ldF9pcmRhLmggYi9uZXQvaXJkYS9pcm5ldC9pcm5ldF9pcmRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmZWNkMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybmV0L2lybmV0X2lyZGEuaApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqCUlyTkVUIHByb3RvY29sIG1vZHVsZSA6IFN5bmNocm9ub3VzIFBQUCBvdmVyIGFuIElyREEgc29ja2V0LgorICoKKyAqCQlKZWFuIElJIC0gSFBMIGAwMCAtIDxqdEBocGwuaHAuY29tPgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBuZWNlc3NhcnkgZm9yIHRoZQorICogSVJEQSBwYXJ0IG9mIHRoZSBJck5FVCBtb2R1bGUgKGRlYWxpbmcgd2l0aCBJclRUUCwgSXJJQVMgYW5kIGNvKS4KKyAqIFRoaXMgZmlsZSBpcyBhIHByaXZhdGUgaGVhZGVyLCBzbyBvdGhlciBtb2R1bGVzIGRvbid0IHdhbnQgdG8ga25vdworICogd2hhdCdzIGluIHRoZXJlLi4uCisgKi8KKworI2lmbmRlZiBJUk5FVF9JUkRBX0gKKyNkZWZpbmUgSVJORVRfSVJEQV9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBsZWFzZSBhZGQgb3RoZXIgaGVhZGVycyBpbiBpcm5ldC5oICovCisKKyNpbmNsdWRlICJpcm5ldC5oIgkJLyogTW9kdWxlIGdsb2JhbCBpbmNsdWRlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogQ09OU1RBTlRTICYgTUFDUk9TICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE5hbWUgb2YgdGhlIHNlcnZpY2UgKHNvY2tldCBuYW1lKSB1c2VkIGJ5IElyTkVUCisgKi8KKy8qIElBUyBvYmplY3QgbmFtZSAob3IgcGFydCBvZiBpdCkgKi8KKyNkZWZpbmUgSVJORVRfU0VSVklDRV9OQU1FCSJJck5ldHYxIgorLyogSUFTIGF0dHJpYnV0ZSAqLworI2RlZmluZSBJUk5FVF9JQVNfVkFMVUUJCSJJckRBOlRpbnlUUDpMc2FwU2VsIgorLyogTE1QIG5vdGlmeSBuYW1lIGZvciBjbGllbnQgKG9ubHkgZm9yIC9wcm9jL25ldC9pcmRhL2lybG1wKSAqLworI2RlZmluZSBJUk5FVF9OT1RJRllfTkFNRQkiSXJORVQgc29ja2V0IgorLyogTE1QIG5vdGlmeSBuYW1lIGZvciBzZXJ2ZXIgKG9ubHkgZm9yIC9wcm9jL25ldC9pcmRhL2lybG1wKSAqLworI2RlZmluZSBJUk5FVF9OT1RJRllfTkFNRV9TRVJWCSJJck5FVCBzZXJ2ZXIiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBpcyB0aGUgbWFpbiBzdHJ1Y3R1cmUgd2hlcmUgd2Ugc3RvcmUgYWxsIHRoZSBkYXRhIHBlcnRhaW5pbmcgdG8KKyAqIHRoZSBJck5FVCBzZXJ2ZXIgKGxpc3RlbiBmb3IgY29ubmVjdGlvbiByZXF1ZXN0cykgYW5kIHRoZSByb290CisgKiBvZiB0aGUgSXJORVQgc29ja2V0IGxpc3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaXJuZXRfcm9vdAoreworICBpcm5ldF9zb2NrZXQJCXM7CQkvKiBUbyBwcmV0ZW5kIHdlIGFyZSBhIGNsaWVudC4uLiAqLworCisgIC8qIEdlbmVyaWMgc3R1ZmYgKi8KKyAgaW50CQkJbWFnaWM7CQkvKiBQYXJhbm9pYSAqLworICBpbnQJCQlydW5uaW5nOwkvKiBBcmUgd2Ugb3BlcmF0aW9uYWwgPyAqLworCisgIC8qIExpbmsgbGlzdCBvZiBhbGwgSXJORVQgaW5zdGFuY2VzIG9wZW5lZCAqLworICBoYXNoYmluX3QgKgkJbGlzdDsKKyAgc3BpbmxvY2tfdAkJc3BpbmxvY2s7CS8qIFNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIGxpc3QgKi8KKyAgLyogTm90ZSA6IHRoZSB3YXkgaGFzaGJpbiBoYXMgYmVlbiBkZXNpZ25lZCBpcyBhYnNvbHV0ZWx5IG5vdAorICAgKiByZWVudHJhbnQsIGJld2FyZS4uLiBTbywgd2UgYmxpbmRseSBwcm90ZWN0IGFsbCB3aXRoIHNwaW5sb2NrICovCisKKyAgLyogSGFuZGxlIGZvciB0aGUgaGludCBiaXQgYWR2ZXJ0aXNlZCBpbiBJckxNUCAqLworICB2b2lkICoJCXNrZXk7CisKKyAgLyogU2VydmVyIHNvY2tldCBwYXJ0ICovCisgIHN0cnVjdCBpYXNfb2JqZWN0ICoJaWFzX29iajsJLyogT3VyIHNlcnZpY2UgbmFtZSArIGxzYXAgaW4gSUFTICovCisKK30gaXJuZXRfcm9vdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQUk9UT1RZUEVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTlRST0wgQ0hBTk5FTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQKKwlpcm5ldF9wb3N0X2V2ZW50KGlybmV0X3NvY2tldCAqLAorCQkJIGlybmV0X2V2ZW50LAorCQkJIF9fdTMyLAorCQkJIF9fdTMyLAorCQkJIGNoYXIgKiwKKwkJCSBfX3UxNik7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJUkRBIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIGludAorCWlybmV0X29wZW5fdHNhcChpcm5ldF9zb2NrZXQgKik7CitzdGF0aWMgaW5saW5lIF9fdTgKKwlpcm5ldF9pYXNfdG9fdHNhcChpcm5ldF9zb2NrZXQgKiwKKwkJCSAgaW50LAorCQkJICBzdHJ1Y3QgaWFzX3ZhbHVlICopOworc3RhdGljIGlubGluZSBpbnQKKwlpcm5ldF9maW5kX2xzYXBfc2VsKGlybmV0X3NvY2tldCAqKTsKK3N0YXRpYyBpbmxpbmUgaW50CisJaXJuZXRfY29ubmVjdF90c2FwKGlybmV0X3NvY2tldCAqKTsKK3N0YXRpYyBpbmxpbmUgaW50CisJaXJuZXRfZGlzY292ZXJfbmV4dF9kYWRkcihpcm5ldF9zb2NrZXQgKik7CitzdGF0aWMgaW5saW5lIGludAorCWlybmV0X2Rpc2NvdmVyX2RhZGRyX2FuZF9sc2FwX3NlbChpcm5ldF9zb2NrZXQgKik7CitzdGF0aWMgaW5saW5lIGludAorCWlybmV0X2RuYW1lX3RvX2RhZGRyKGlybmV0X3NvY2tldCAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRVJWRVIgU09DS0VUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSBpbnQKKwlpcm5ldF9kYWRkcl90b19kbmFtZShpcm5ldF9zb2NrZXQgKik7CitzdGF0aWMgaW5saW5lIGlybmV0X3NvY2tldCAqCisJaXJuZXRfZmluZF9zb2NrZXQoaXJuZXRfc29ja2V0ICopOworc3RhdGljIGlubGluZSBpbnQKKwlpcm5ldF9jb25uZWN0X3NvY2tldChpcm5ldF9zb2NrZXQgKiwKKwkJCSAgICAgaXJuZXRfc29ja2V0ICosCisJCQkgICAgIHN0cnVjdCBxb3NfaW5mbyAqLAorCQkJICAgICBfX3UzMiwKKwkJCSAgICAgX191OCk7CitzdGF0aWMgaW5saW5lIHZvaWQKKwlpcm5ldF9kaXNjb25uZWN0X3NlcnZlcihpcm5ldF9zb2NrZXQgKiwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyBpbmxpbmUgaW50CisJaXJuZXRfc2V0dXBfc2VydmVyKHZvaWQpOworc3RhdGljIGlubGluZSB2b2lkCisJaXJuZXRfZGVzdHJveV9zZXJ2ZXIodm9pZCk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElSREEtVFRQIENBTExCQUNLUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50CisJaXJuZXRfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKiwJCS8qIGluc3RhbmNlICovCisJCQkgICAgICB2b2lkICosCQkvKiBzYXAgKi8KKwkJCSAgICAgIHN0cnVjdCBza19idWZmICopOworc3RhdGljIHZvaWQKKwlpcm5ldF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqLAorCQkJCSAgICB2b2lkICosCisJCQkJICAgIExNX1JFQVNPTiwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgdm9pZAorCWlybmV0X2Nvbm5lY3RfY29uZmlybSh2b2lkICosCisJCQkgICAgICB2b2lkICosCisJCQkgICAgICBzdHJ1Y3QgcW9zX2luZm8gKiwKKwkJCSAgICAgIF9fdTMyLAorCQkJICAgICAgX191OCwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICopOworc3RhdGljIHZvaWQKKwlpcm5ldF9mbG93X2luZGljYXRpb24odm9pZCAqLAorCQkJICAgICAgdm9pZCAqLAorCQkJICAgICAgTE9DQUxfRkxPVyk7CitzdGF0aWMgdm9pZAorCWlybmV0X3N0YXR1c19pbmRpY2F0aW9uKHZvaWQgKiwKKwkJCQlMSU5LX1NUQVRVUywKKwkJCQlMT0NLX1NUQVRVUyk7CitzdGF0aWMgdm9pZAorCWlybmV0X2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICosCisJCQkJIHZvaWQgKiwKKwkJCQkgc3RydWN0IHFvc19pbmZvICosCisJCQkJIF9fdTMyLAorCQkJCSBfX3U4LAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIElSREEtSUFTL0xNUCBDQUxMQkFDS1MgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkCisJaXJuZXRfZ2V0dmFsdWVfY29uZmlybShpbnQsCisJCQkgICAgICAgX191MTYsCisJCQkgICAgICAgc3RydWN0IGlhc192YWx1ZSAqLAorCQkJICAgICAgIHZvaWQgKik7CitzdGF0aWMgdm9pZAorCWlybmV0X2Rpc2NvdmVydmFsdWVfY29uZmlybShpbnQsCisJCQkJICAgIF9fdTE2LCAKKwkJCQkgICAgc3RydWN0IGlhc192YWx1ZSAqLAorCQkJCSAgICB2b2lkICopOworI2lmZGVmIERJU0NPVkVSWV9FVkVOVFMKK3N0YXRpYyB2b2lkCisJaXJuZXRfZGlzY292ZXJ5X2luZGljYXRpb24oZGlzY2luZm9fdCAqLAorCQkJCSAgIERJU0NPVkVSWV9NT0RFLAorCQkJCSAgIHZvaWQgKik7CitzdGF0aWMgdm9pZAorCWlybmV0X2V4cGlyeV9pbmRpY2F0aW9uKGRpc2NpbmZvX3QgKiwKKwkJCQlESVNDT1ZFUllfTU9ERSwKKwkJCQl2b2lkICopOworI2VuZGlmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQUk9DIEVOVFJZIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQKKwlpcm5ldF9wcm9jX3JlYWQoY2hhciAqLAorCQkJY2hhciAqKiwKKwkJCW9mZl90LAorCQkJaW50KTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWQVJJQUJMRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSBJck5FVCBzZXJ2ZXIuIExpc3RlbiB0byBjb25uZWN0aW9uIHJlcXVlc3RzIGFuZCBjby4uLgorICovCitzdGF0aWMgc3RydWN0IGlybmV0X3Jvb3QJaXJuZXRfc2VydmVyOworCisvKiBDb250cm9sIGNoYW5uZWwgc3R1ZmYgKG5vdGUgOiBleHRlcm4pICovCitzdHJ1Y3QgaXJuZXRfY3RybF9jaGFubmVsCWlybmV0X2V2ZW50czsKKworLyogVGhlIC9wcm9jL25ldC9pcmRhIGRpcmVjdG9yeSwgZGVmaW5lZCBlbHNld2hlcmUuLi4gKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pcmRhOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKyNlbmRpZiAvKiBJUk5FVF9JUkRBX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybmV0L2lybmV0X3BwcC5jIGIvbmV0L2lyZGEvaXJuZXQvaXJuZXRfcHBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmOTg0YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybmV0L2lybmV0X3BwcC5jCkBAIC0wLDAgKzEsMTE0MiBAQAorLyoKKyAqCUlyTkVUIHByb3RvY29sIG1vZHVsZSA6IFN5bmNocm9ub3VzIFBQUCBvdmVyIGFuIElyREEgc29ja2V0LgorICoKKyAqCQlKZWFuIElJIC0gSFBMIGAwMCAtIDxqdEBocGwuaHAuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnQgdGhlIFBQUCBpbnRlcmZhY2UgYW5kIC9kZXYvaXJuZXQgY2hhcmFjdGVyIGRldmljZS4KKyAqIFRoZSBQUFAgaW50ZXJmYWNlIGhvb2sgdG8gdGhlIHBwcF9nZW5lcmljIG1vZHVsZSwgaGFuZGxlIGFsbCBvdXIKKyAqCXJlbGF0aW9uc2hpcCB0byB0aGUgUFBQIGNvZGUgaW4gdGhlIGtlcm5lbCAoYW5kIGJ5IGV4dGVuc2lvbiB0byBwcHBkKSwKKyAqCWFuZCBleGNoYW5nZSBQUFAgZnJhbWVzIHdpdGggdGhpcyBtb2R1bGUgKHNlbmQvcmVjZWl2ZSkuCisgKiBUaGUgL2Rldi9pcm5ldCBkZXZpY2UgaXMgdXNlZCBwcmltYXJpbHkgZm9yIDIgZnVuY3Rpb25zIDoKKyAqCTEpIGFzIGEgc3R1YiBmb3IgcHBwZCAodGhlIHBwcCBkYWVtb24pLCBzbyB0aGF0IHdlIGNhbiBhcHByb3ByaWF0ZWx5CisgKglnZW5lcmF0ZSBQUFAgc2Vzc2lvbnMgKHdlIHByZXRlbmQgd2UgYXJlIGEgdHR5KS4KKyAqCTIpIGFzIGEgY29udHJvbCBjaGFubmVsICh3cml0ZSBjb21tYW5kcywgcmVhZCBldmVudHMpCisgKi8KKworI2luY2x1ZGUgImlybmV0X3BwcC5oIgkJLyogUHJpdmF0ZSBoZWFkZXIgKi8KKy8qIFBsZWFzZSBwdXQgb3RoZXIgaGVhZGVycyBpbiBpcm5ldC5oIC0gVGhhbmtzICovCisKKy8qIEdlbmVyaWMgUFBQIGNhbGxiYWNrcyAodG8gY2FsbCB1cykgKi8KK3N0YXRpYyBzdHJ1Y3QgcHBwX2NoYW5uZWxfb3BzIGlybmV0X3BwcF9vcHMgPSB7CisJLnN0YXJ0X3htaXQgPSBwcHBfaXJuZXRfc2VuZCwKKwkuaW9jdGwgPSBwcHBfaXJuZXRfaW9jdGwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIENPTlRST0wgQ0hBTk5FTCAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFdoZW4gYSBwcHBkIGluc3RhbmNlIGlzIG5vdCBhY3RpdmUgb24gL2Rldi9pcm5ldCwgaXQgYWN0cyBhcyBhIGNvbnRyb2wKKyAqIGNoYW5uZWwuCisgKiBXcml0aW5nIGFsbG93IHRvIHNldCB1cCB0aGUgSXJEQSBkZXN0aW5hdGlvbiBvZiB0aGUgSXJORVQgY2hhbm5lbCwKKyAqIGFuZCBhbnkgYXBwbGljYXRpb24gbWF5IGJlIHJlYWQgZXZlbnRzIGhhcHBlbmluZyBpbiBJck5FVC4uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSBpcyB1c2VkIHRvIHNlbmQgYSBjb21tYW5kIHRvIGNvbmZpZ3VyZSBhIElyTkVUIGNoYW5uZWwKKyAqIGJlZm9yZSBpdCBpcyBvcGVuIGJ5IHBwcGQuIFRoZSBzeW50YXggaXMgOiAiY29tbWFuZCBhcmd1bWVudCIKKyAqIEN1cnJlbnRseSB0aGVyZSBpcyBvbmx5IHR3byBkZWZpbmVkIGNvbW1hbmRzIDoKKyAqCW8gbmFtZSA6IHNldCB0aGUgcmVxdWVzdGVkIElyREEgbmlja25hbWUgb2YgdGhlIElyTkVUIHBlZXIuCisgKglvIGFkZHIgOiBzZXQgdGhlIHJlcXVlc3RlZCBJckRBIGFkZHJlc3Mgb2YgdGhlIElyTkVUIHBlZXIuCisgKiBOb3RlIDogdGhlIGNvZGUgaXMgY3J1ZGUsIGJ1dCBlZmZlY3RpdmUuLi4KKyAqLworc3RhdGljIGlubGluZSBzc2l6ZV90Citpcm5ldF9jdHJsX3dyaXRlKGlybmV0X3NvY2tldCAqCWFwLAorCQkgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJIHNpemVfdAkJY291bnQpCit7CisgIGNoYXIJCWNvbW1hbmRbSVJORVRfTUFYX0NPTU1BTkRdOworICBjaGFyICoJc3RhcnQ7CQkvKiBDdXJyZW50IGNvbW1hbmQgYmVpbmcgcHJvY2Vzc2VkICovCisgIGNoYXIgKgluZXh0OwkJLyogTmV4dCBjb21tYW5kIHRvIHByb2Nlc3MgKi8KKyAgaW50CQlsZW5ndGg7CQkvKiBMZW5ndGggb2YgY3VycmVudCBjb21tYW5kICovCisKKyAgREVOVEVSKENUUkxfVFJBQ0UsICIoYXA9MHglcCwgY291bnQ9JVpkKVxuIiwgYXAsIGNvdW50KTsKKworICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuLi4gKi8KKyAgREFCT1JUKGNvdW50ID49IElSTkVUX01BWF9DT01NQU5ELCAtRU5PTUVNLAorCSBDVFJMX0VSUk9SLCAiVG9vIG11Y2ggZGF0YSAhISFcbiIpOworCisgIC8qIEdldCB0aGUgZGF0YSBpbiB0aGUgZHJpdmVyICovCisgIGlmKGNvcHlfZnJvbV91c2VyKGNvbW1hbmQsIGJ1ZiwgY291bnQpKQorICAgIHsKKyAgICAgIERFUlJPUihDVFJMX0VSUk9SLCAiSW52YWxpZCB1c2VyIHNwYWNlIHBvaW50ZXIuXG4iKTsKKyAgICAgIHJldHVybiAtRUZBVUxUOworICAgIH0KKworICAvKiBTYWZlIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisgIGNvbW1hbmRbY291bnRdID0gJ1wwJzsKKyAgREVCVUcoQ1RSTF9JTkZPLCAiQ29tbWFuZCBsaW5lIHJlY2VpdmVkIGlzIGBgJXMnJyAoJVpkKS5cbiIsCisJY29tbWFuZCwgY291bnQpOworCisgIC8qIENoZWNrIGV2ZXJ5IGNvbW1hbmRzIGluIHRoZSBjb21tYW5kIGxpbmUgKi8KKyAgbmV4dCA9IGNvbW1hbmQ7CisgIHdoaWxlKG5leHQgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBMb29rIGF0IHRoZSBuZXh0IGNvbW1hbmQgKi8KKyAgICAgIHN0YXJ0ID0gbmV4dDsKKworICAgICAgLyogU2NyYXAgd2hpdGVzcGFjZXMgYmVmb3JlIHRoZSBjb21tYW5kICovCisgICAgICB3aGlsZShpc3NwYWNlKCpzdGFydCkpCisJc3RhcnQrKzsKKworICAgICAgLyogJywnIGlzIG91ciBjb21tYW5kIHNlcGFyYXRvciAqLworICAgICAgbmV4dCA9IHN0cmNocihzdGFydCwgJywnKTsKKyAgICAgIGlmKG5leHQpCisJeworCSAgKm5leHQgPSAnXDAnOwkJCS8qIFRlcm1pbmF0ZSBjb21tYW5kICovCisJICBsZW5ndGggPSBuZXh0IC0gc3RhcnQ7CS8qIExlbmd0aCAqLworCSAgbmV4dCsrOwkJCS8qIFNraXAgdGhlICdcMCcgKi8KKwl9CisgICAgICBlbHNlCisJbGVuZ3RoID0gc3RybGVuKHN0YXJ0KTsKKworICAgICAgREVCVUcoQ1RSTF9JTkZPLCAiRm91bmQgY29tbWFuZCBgYCVzJycgKCVkKS5cbiIsIHN0YXJ0LCBsZW5ndGgpOworCisgICAgICAvKiBDaGVjayBpZiB3ZSByZWNvZ25pc2VkIG9uZSBvZiB0aGUga25vd24gY29tbWFuZAorICAgICAgICogV2UgY2FuJ3QgdXNlICJzd2l0Y2giIHdpdGggc3RyaW5ncywgc28gaGFjayB3aXRoICJjb250aW51ZSIgKi8KKyAgICAgIAorICAgICAgLyogRmlyc3QgY29tbWFuZCA6IG5hbWUgLT4gUmVxdWVzdGVkIElyREEgbmlja25hbWUgKi8KKyAgICAgIGlmKCFzdHJuY21wKHN0YXJ0LCAibmFtZSIsIDQpKQorCXsKKwkgIC8qIENvcHkgdGhlIG5hbWUgb25seSBpZiBpcyBpbmNsdWRlZCBhbmQgbm90ICJhbnkiICovCisJICBpZigobGVuZ3RoID4gNSkgJiYgKHN0cmNtcChzdGFydCArIDUsICJhbnkiKSkpCisJICAgIHsKKwkgICAgICAvKiBTdHJpcCBvdXQgdHJhaWxpbmcgd2hpdGVzcGFjZXMgKi8KKwkgICAgICB3aGlsZShpc3NwYWNlKHN0YXJ0W2xlbmd0aCAtIDFdKSkKKwkJbGVuZ3RoLS07CisKKwkgICAgICAvKiBDb3B5IHRoZSBuYW1lIGZvciBsYXRlciByZXVzZSAqLworCSAgICAgIG1lbWNweShhcC0+cm5hbWUsIHN0YXJ0ICsgNSwgbGVuZ3RoIC0gNSk7CisJICAgICAgYXAtPnJuYW1lW2xlbmd0aCAtIDVdID0gJ1wwJzsKKwkgICAgfQorCSAgZWxzZQorCSAgICBhcC0+cm5hbWVbMF0gPSAnXDAnOworCSAgREVCVUcoQ1RSTF9JTkZPLCAiR290IHJuYW1lID0gYGAlcycnXG4iLCBhcC0+cm5hbWUpOworCisJICAvKiBSZXN0YXJ0IHRoZSBsb29wICovCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFNlY29uZCBjb21tYW5kIDogYWRkciwgZGFkZHIgLT4gUmVxdWVzdGVkIElyREEgZGVzdGluYXRpb24gYWRkcmVzcworICAgICAgICogQWxzbyBwcm9jZXNzIDogc2FkZHIgLT4gUmVxdWVzdGVkIElyREEgc291cmNlIGFkZHJlc3MgKi8KKyAgICAgIGlmKCghc3RybmNtcChzdGFydCwgImFkZHIiLCA0KSkgfHwKKwkgKCFzdHJuY21wKHN0YXJ0LCAiZGFkZHIiLCA1KSkgfHwKKwkgKCFzdHJuY21wKHN0YXJ0LCAic2FkZHIiLCA1KSkpCisJeworCSAgX191MzIJCWFkZHIgPSBERVZfQUREUl9BTlk7CisKKwkgIC8qIENvcHkgdGhlIGFkZHJlc3Mgb25seSBpZiBpcyBpbmNsdWRlZCBhbmQgbm90ICJhbnkiICovCisJICBpZigobGVuZ3RoID4gNSkgJiYgKHN0cmNtcChzdGFydCArIDUsICJhbnkiKSkpCisJICAgIHsKKwkgICAgICBjaGFyICoJYmVncCA9IHN0YXJ0ICsgNTsKKwkgICAgICBjaGFyICoJZW5kcDsKKworCSAgICAgIC8qIFNjcmFwIHdoaXRlc3BhY2VzIGJlZm9yZSB0aGUgY29tbWFuZCAqLworCSAgICAgIHdoaWxlKGlzc3BhY2UoKmJlZ3ApKQorCQliZWdwKys7CisKKwkgICAgICAvKiBDb252ZXJ0IGFyZ3VtZW50IHRvIGEgbnVtYmVyIChsYXN0IGFyZyBpcyB0aGUgYmFzZSkgKi8KKwkgICAgICBhZGRyID0gc2ltcGxlX3N0cnRvdWwoYmVncCwgJmVuZHAsIDE2KTsKKwkgICAgICAvKiBIYXMgaXQgd29ya2VkICA/IChlbmRwIHNob3VsZCBiZSBzdGFydCArIGxlbmd0aCkgKi8KKwkgICAgICBEQUJPUlQoZW5kcCA8PSAoc3RhcnQgKyA1KSwgLUVJTlZBTCwKKwkJICAgICBDVFJMX0VSUk9SLCAiSW52YWxpZCBhZGRyZXNzLlxuIik7CisJICAgIH0KKwkgIC8qIFdoaWNoIHR5cGUgb2YgYWRkcmVzcyA/ICovCisJICBpZihzdGFydFswXSA9PSAncycpCisJICAgIHsKKwkgICAgICAvKiBTYXZlIGl0ICovCisJICAgICAgYXAtPnJzYWRkciA9IGFkZHI7CisJICAgICAgREVCVUcoQ1RSTF9JTkZPLCAiR290IHJzYWRkciA9ICUwOHhcbiIsIGFwLT5yc2FkZHIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBTYXZlIGl0ICovCisJICAgICAgYXAtPnJkYWRkciA9IGFkZHI7CisJICAgICAgREVCVUcoQ1RSTF9JTkZPLCAiR290IHJkYWRkciA9ICUwOHhcbiIsIGFwLT5yZGFkZHIpOworCSAgICB9CisKKwkgIC8qIFJlc3RhcnQgdGhlIGxvb3AgKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogT3RoZXIgcG9zc2libGUgY29tbWFuZCA6IGNvbm5lY3QgTiAobnVtYmVyIG9mIHJldHJpZXMpICovCisKKyAgICAgIC8qIE5vIGNvbW1hbmQgbWF0Y2hlZCAtPiBGYWlsZWQuLi4gKi8KKyAgICAgIERBQk9SVCgxLCAtRUlOVkFMLCBDVFJMX0VSUk9SLCAiTm90IGEgcmVjb2duaXNlZCBJck5FVCBjb21tYW5kLlxuIik7CisgICAgfQorCisgIC8qIFN1Y2Nlc3MgOiB3ZSBoYXZlIHBhcnNlZCBhbGwgY29tbWFuZHMgc3VjY2Vzc2Z1bGx5ICovCisgIHJldHVybihjb3VudCk7Cit9CisKKyNpZmRlZiBJTklUSUFMX0RJU0NPVkVSWQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlybmV0X2dldF9kaXNjb3ZlcnlfbG9nIChzZWxmKQorICoKKyAqICAgIFF1ZXJ5IHRoZSBjb250ZW50IG9uIHRoZSBkaXNjb3ZlcnkgbG9nIGlmIG5vdCBkb25lCisgKgorICogVGhpcyBmdW5jdGlvbiBxdWVyeSB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBkaXNjb3ZlcnkgbG9nCisgKiBhdCB0aGUgc3RhcnR1cCBvZiB0aGUgZXZlbnQgY2hhbm5lbCBhbmQgc2F2ZSBpdCBpbiB0aGUgaW50ZXJuYWwgc3RydWN0LgorICovCitzdGF0aWMgdm9pZAoraXJuZXRfZ2V0X2Rpc2NvdmVyeV9sb2coaXJuZXRfc29ja2V0ICoJYXApCit7CisgIF9fdTE2CQltYXNrID0gaXJsbXBfc2VydmljZV90b19oaW50KFNfTEFOKTsKKworICAvKiBBc2sgSXJMTVAgZm9yIHRoZSBjdXJyZW50IGRpc2NvdmVyeSBsb2cgKi8KKyAgYXAtPmRpc2NvdmVyaWVzID0gaXJsbXBfZ2V0X2Rpc2NvdmVyaWVzKCZhcC0+ZGlzY29fbnVtYmVyLCBtYXNrLAorCQkJCQkgIERJU0NPVkVSWV9ERUZBVUxUX1NMT1RTKTsKKworICAvKiBDaGVjayBpZiB0aGUgd2UgZ290IHNvbWUgcmVzdWx0cyAqLworICBpZihhcC0+ZGlzY292ZXJpZXMgPT0gTlVMTCkKKyAgICBhcC0+ZGlzY29fbnVtYmVyID0gLTE7CisKKyAgREVCVUcoQ1RSTF9JTkZPLCAiR290IHRoZSBsb2cgKDB4JXApLCBzaXplIGlzICVkXG4iLAorCWFwLT5kaXNjb3ZlcmllcywgYXAtPmRpc2NvX251bWJlcik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9yZWFkX2Rpc2NvdmVyeV9sb2cgKHNlbGYsIGV2ZW50KQorICoKKyAqICAgIFJlYWQgdGhlIGNvbnRlbnQgb24gdGhlIGRpc2NvdmVyeSBsb2cKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGR1bXAgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgZGlzY292ZXJ5IGxvZworICogYXQgdGhlIHN0YXJ0dXAgb2YgdGhlIGV2ZW50IGNoYW5uZWwuCisgKiBSZXR1cm4gMSBpZiB3cm90ZSBhbiBldmVudCBvbiB0aGUgY29udHJvbCBjaGFubmVsLi4uCisgKgorICogU3RhdGUgb2YgdGhlIGFwLT5kaXNjb19YWFggdmFyaWFibGVzIDoKKyAqIFNvY2tldCBjcmVhdGlvbiA6ICBkaXNjb3ZlcmllcyA9IE5VTEwgOyBkaXNjb19pbmRleCA9IDAgOyBkaXNjb19udW1iZXIgPSAwCisgKiBXaGlsZSByZWFkaW5nIDogICAgZGlzY292ZXJpZXMgPSBwdHIgIDsgZGlzY29faW5kZXggPSBYIDsgZGlzY29fbnVtYmVyID0gWQorICogQWZ0ZXIgcmVhZGluZyA6ICAgIGRpc2NvdmVyaWVzID0gTlVMTCA7IGRpc2NvX2luZGV4ID0gWSA7IGRpc2NvX251bWJlciA9IC0xCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citpcm5ldF9yZWFkX2Rpc2NvdmVyeV9sb2coaXJuZXRfc29ja2V0ICoJYXAsCisJCQkgY2hhciAqCQlldmVudCkKK3sKKyAgaW50CQlkb25lX2V2ZW50ID0gMDsKKworICBERU5URVIoQ1RSTF9UUkFDRSwgIihhcD0weCVwLCBldmVudD0weCVwKVxuIiwKKwkgYXAsIGV2ZW50KTsKKworICAvKiBUZXN0IGlmIHdlIGhhdmUgc29tZSB3b3JrIHRvIGRvIG9yIHdlIGhhdmUgYWxyZWFkeSBmaW5pc2hlZCAqLworICBpZihhcC0+ZGlzY29fbnVtYmVyID09IC0xKQorICAgIHsKKyAgICAgIERFQlVHKENUUkxfSU5GTywgIkFscmVhZHkgZG9uZVxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogVGVzdCBpZiBpdCdzIHRoZSBmaXJzdCB0aW1lIGFuZCB0aGVyZWZvcmUgd2UgbmVlZCB0byBnZXQgdGhlIGxvZyAqLworICBpZihhcC0+ZGlzY292ZXJpZXMgPT0gTlVMTCkKKyAgICBpcm5ldF9nZXRfZGlzY292ZXJ5X2xvZyhhcCk7CisKKyAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBtb3JlIGl0ZW0gdG8gZHVtcCAqLworICBpZihhcC0+ZGlzY29faW5kZXggPCBhcC0+ZGlzY29fbnVtYmVyKQorICAgIHsKKyAgICAgIC8qIFdyaXRlIGFuIGV2ZW50ICovCisgICAgICBzcHJpbnRmKGV2ZW50LCAiRm91bmQgJTA4eCAoJXMpIGJlaGluZCAlMDh4IHtoaW50cyAlMDJYLSUwMlh9XG4iLAorCSAgICAgIGFwLT5kaXNjb3Zlcmllc1thcC0+ZGlzY29faW5kZXhdLmRhZGRyLAorCSAgICAgIGFwLT5kaXNjb3Zlcmllc1thcC0+ZGlzY29faW5kZXhdLmluZm8sCisJICAgICAgYXAtPmRpc2NvdmVyaWVzW2FwLT5kaXNjb19pbmRleF0uc2FkZHIsCisJICAgICAgYXAtPmRpc2NvdmVyaWVzW2FwLT5kaXNjb19pbmRleF0uaGludHNbMF0sCisJICAgICAgYXAtPmRpc2NvdmVyaWVzW2FwLT5kaXNjb19pbmRleF0uaGludHNbMV0pOworICAgICAgREVCVUcoQ1RSTF9JTkZPLCAiV3JpdGluZyBkaXNjb3ZlcnkgJWQgOiAlc1xuIiwKKwkgICAgYXAtPmRpc2NvX2luZGV4LCBhcC0+ZGlzY292ZXJpZXNbYXAtPmRpc2NvX2luZGV4XS5pbmZvKTsKKworICAgICAgLyogV2UgaGF2ZSBhbiBldmVudCAqLworICAgICAgZG9uZV9ldmVudCA9IDE7CisgICAgICAvKiBOZXh0IGRpc2NvdmVyeSAqLworICAgICAgYXAtPmRpc2NvX2luZGV4Kys7CisgICAgfQorCisgIC8qIENoZWNrIGlmIHdlIGhhdmUgZG9uZSB0aGUgbGFzdCBpdGVtICovCisgIGlmKGFwLT5kaXNjb19pbmRleCA+PSBhcC0+ZGlzY29fbnVtYmVyKQorICAgIHsKKyAgICAgIC8qIE5vIG1vcmUgaXRlbXMgOiByZW1vdmUgdGhlIGxvZyBhbmQgc2lnbmFsIHRlcm1pbmF0aW9uICovCisgICAgICBERUJVRyhDVFJMX0lORk8sICJDbGVhbmluZyB1cCBsb2cgKDB4JXApXG4iLAorCSAgICBhcC0+ZGlzY292ZXJpZXMpOworICAgICAgaWYoYXAtPmRpc2NvdmVyaWVzICE9IE5VTEwpCisJeworCSAgLyogQ2xlYW51cCBvdXIgY29weSBvZiB0aGUgZGlzY292ZXJ5IGxvZyAqLworCSAga2ZyZWUoYXAtPmRpc2NvdmVyaWVzKTsKKwkgIGFwLT5kaXNjb3ZlcmllcyA9IE5VTEw7CisJfQorICAgICAgYXAtPmRpc2NvX251bWJlciA9IC0xOworICAgIH0KKworICByZXR1cm4gZG9uZV9ldmVudDsKK30KKyNlbmRpZiAvKiBJTklUSUFMX0RJU0NPVkVSWSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCBpcyB1c2VkIHRvIGdldCBJck5FVCBldmVudHMKKyAqLworc3RhdGljIGlubGluZSBzc2l6ZV90Citpcm5ldF9jdHJsX3JlYWQoaXJuZXRfc29ja2V0ICoJYXAsCisJCXN0cnVjdCBmaWxlICoJZmlsZSwKKwkJY2hhciBfX3VzZXIgKglidWYsCisJCXNpemVfdAkJY291bnQpCit7CisgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworICBjaGFyCQlldmVudFs2NF07CS8qIE1heCBldmVudCBpcyA2MSBjaGFyICovCisgIHNzaXplX3QJcmV0ID0gMDsKKworICBERU5URVIoQ1RSTF9UUkFDRSwgIihhcD0weCVwLCBjb3VudD0lWmQpXG4iLCBhcCwgY291bnQpOworCisgIC8qIENoZWNrIGlmIHdlIGNhbiB3cml0ZSBhbiBldmVudCBvdXQgaW4gb25lIGdvICovCisgIERBQk9SVChjb3VudCA8IHNpemVvZihldmVudCksIC1FT1ZFUkZMT1csIENUUkxfRVJST1IsICJCdWZmZXIgdG8gc21hbGwuXG4iKTsKKworI2lmZGVmIElOSVRJQUxfRElTQ09WRVJZCisgIC8qIENoZWNrIGlmIHdlIGhhdmUgcmVhZCB0aGUgbG9nICovCisgIGlmKGlybmV0X3JlYWRfZGlzY292ZXJ5X2xvZyhhcCwgZXZlbnQpKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgYW4gZXZlbnQgISEhIENvcHkgaXQgdG8gdGhlIHVzZXIgKi8KKyAgICAgIGlmKGNvcHlfdG9fdXNlcihidWYsIGV2ZW50LCBzdHJsZW4oZXZlbnQpKSkKKwl7CisJICBERVJST1IoQ1RSTF9FUlJPUiwgIkludmFsaWQgdXNlciBzcGFjZSBwb2ludGVyLlxuIik7CisJICByZXR1cm4gLUVGQVVMVDsKKwl9CisKKyAgICAgIERFWElUKENUUkxfVFJBQ0UsICJcbiIpOworICAgICAgcmV0dXJuKHN0cmxlbihldmVudCkpOworICAgIH0KKyNlbmRpZiAvKiBJTklUSUFMX0RJU0NPVkVSWSAqLworCisgIC8qIFB1dCBvdXJzZWx2ZXMgb24gdGhlIHdhaXQgcXVldWUgdG8gYmUgd29rZW4gdXAgKi8KKyAgYWRkX3dhaXRfcXVldWUoJmlybmV0X2V2ZW50cy5yd2FpdCwgJndhaXQpOworICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKyAgZm9yKDs7KQorICAgIHsKKyAgICAgIC8qIElmIHRoZXJlIGlzIHVucmVhZCBldmVudHMgKi8KKyAgICAgIHJldCA9IDA7CisgICAgICBpZihhcC0+ZXZlbnRfaW5kZXggIT0gaXJuZXRfZXZlbnRzLmluZGV4KQorCWJyZWFrOworICAgICAgcmV0ID0gLUVBR0FJTjsKKyAgICAgIGlmKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCWJyZWFrOworICAgICAgcmV0ID0gLUVSRVNUQVJUU1lTOworICAgICAgaWYoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJYnJlYWs7CisgICAgICAvKiBZaWVsZCBhbmQgd2FpdCB0byBiZSB3b2tlbiB1cCAqLworICAgICAgc2NoZWR1bGUoKTsKKyAgICB9CisgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworICByZW1vdmVfd2FpdF9xdWV1ZSgmaXJuZXRfZXZlbnRzLnJ3YWl0LCAmd2FpdCk7CisKKyAgLyogRGlkIHdlIGdvdCBpdCA/ICovCisgIGlmKHJldCAhPSAwKQorICAgIHsKKyAgICAgIC8qIE5vLCByZXR1cm4gdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgIERFWElUKENUUkxfVFJBQ0UsICIgLSByZXQgJVpkXG4iLCByZXQpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgLyogV2hpY2ggZXZlbnQgaXMgaXQgPyAqLworICBzd2l0Y2goaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLmV2ZW50KQorICAgIHsKKyAgICBjYXNlIElSTkVUX0RJU0NPVkVSOgorICAgICAgc3ByaW50ZihldmVudCwgIkRpc2NvdmVyZWQgJTA4eCAoJXMpIGJlaGluZCAlMDh4IHtoaW50cyAlMDJYLSUwMlh9XG4iLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5kYWRkciwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0ubmFtZSwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uc2FkZHIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLmhpbnRzLmJ5dGVbMF0sCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLmhpbnRzLmJ5dGVbMV0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUk5FVF9FWFBJUkU6CisgICAgICBzcHJpbnRmKGV2ZW50LCAiRXhwaXJlZCAlMDh4ICglcykgYmVoaW5kICUwOHgge2hpbnRzICUwMlgtJTAyWH1cbiIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLmRhZGRyLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5uYW1lLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5zYWRkciwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uaGludHMuYnl0ZVswXSwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uaGludHMuYnl0ZVsxXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElSTkVUX0NPTk5FQ1RfVE86CisgICAgICBzcHJpbnRmKGV2ZW50LCAiQ29ubmVjdGVkIHRvICUwOHggKCVzKSBvbiBwcHAlZFxuIiwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uZGFkZHIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLm5hbWUsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLnVuaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUk5FVF9DT05ORUNUX0ZST006CisgICAgICBzcHJpbnRmKGV2ZW50LCAiQ29ubmVjdGlvbiBmcm9tICUwOHggKCVzKSBvbiBwcHAlZFxuIiwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uZGFkZHIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLm5hbWUsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLnVuaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUk5FVF9SRVFVRVNUX0ZST006CisgICAgICBzcHJpbnRmKGV2ZW50LCAiUmVxdWVzdCBmcm9tICUwOHggKCVzKSBiZWhpbmQgJTA4eFxuIiwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uZGFkZHIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLm5hbWUsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLnNhZGRyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVJORVRfTk9BTlNXRVJfRlJPTToKKyAgICAgIHNwcmludGYoZXZlbnQsICJOby1hbnN3ZXIgZnJvbSAlMDh4ICglcykgb24gcHBwJWRcbiIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLmRhZGRyLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5uYW1lLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS51bml0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVJORVRfQkxPQ0tFRF9MSU5LOgorICAgICAgc3ByaW50ZihldmVudCwgIkJsb2NrZWQgbGluayB3aXRoICUwOHggKCVzKSBvbiBwcHAlZFxuIiwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uZGFkZHIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLm5hbWUsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLnVuaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUk5FVF9ESVNDT05ORUNUX0ZST006CisgICAgICBzcHJpbnRmKGV2ZW50LCAiRGlzY29ubmVjdGlvbiBmcm9tICUwOHggKCVzKSBvbiBwcHAlZFxuIiwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uZGFkZHIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLm5hbWUsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLnVuaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUk5FVF9ESVNDT05ORUNUX1RPOgorICAgICAgc3ByaW50ZihldmVudCwgIkRpc2Nvbm5lY3RlZCB0byAlMDh4ICglcylcbiIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLmRhZGRyLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzcHJpbnRmKGV2ZW50LCAiQnVnXG4iKTsKKyAgICB9CisgIC8qIEluY3JlbWVudCBvdXIgZXZlbnQgaW5kZXggKi8KKyAgYXAtPmV2ZW50X2luZGV4ID0gKGFwLT5ldmVudF9pbmRleCArIDEpICUgSVJORVRfTUFYX0VWRU5UUzsKKworICBERUJVRyhDVFJMX0lORk8sICJFdmVudCBpcyA6JXMiLCBldmVudCk7CisKKyAgLyogQ29weSBpdCB0byB0aGUgdXNlciAqLworICBpZihjb3B5X3RvX3VzZXIoYnVmLCBldmVudCwgc3RybGVuKGV2ZW50KSkpCisgICAgeworICAgICAgREVSUk9SKENUUkxfRVJST1IsICJJbnZhbGlkIHVzZXIgc3BhY2UgcG9pbnRlci5cbiIpOworICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgfQorCisgIERFWElUKENUUkxfVFJBQ0UsICJcbiIpOworICByZXR1cm4oc3RybGVuKGV2ZW50KSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQb2xsIDogY2FsbGVkIHdoZW4gc29tZW9uZSBkbyBhIHNlbGVjdCBvbiAvZGV2L2lybmV0LgorICogSnVzdCBjaGVjayBpZiB0aGVyZSBhcmUgbmV3IGV2ZW50cy4uLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAoraXJuZXRfY3RybF9wb2xsKGlybmV0X3NvY2tldCAqCWFwLAorCQlzdHJ1Y3QgZmlsZSAqCWZpbGUsCisJCXBvbGxfdGFibGUgKgl3YWl0KQoreworICB1bnNpZ25lZCBpbnQgbWFzazsKKworICBERU5URVIoQ1RSTF9UUkFDRSwgIihhcD0weCVwKVxuIiwgYXApOworCisgIHBvbGxfd2FpdChmaWxlLCAmaXJuZXRfZXZlbnRzLnJ3YWl0LCB3YWl0KTsKKyAgbWFzayA9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworICAvKiBJZiB0aGVyZSBpcyB1bnJlYWQgZXZlbnRzICovCisgIGlmKGFwLT5ldmVudF9pbmRleCAhPSBpcm5ldF9ldmVudHMuaW5kZXgpCisgICAgbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworI2lmZGVmIElOSVRJQUxfRElTQ09WRVJZCisgIGlmKGFwLT5kaXNjb19udW1iZXIgIT0gLTEpCisgICAgeworICAgICAgLyogVGVzdCBpZiBpdCdzIHRoZSBmaXJzdCB0aW1lIGFuZCB0aGVyZWZvcmUgd2UgbmVlZCB0byBnZXQgdGhlIGxvZyAqLworICAgICAgaWYoYXAtPmRpc2NvdmVyaWVzID09IE5VTEwpCisJaXJuZXRfZ2V0X2Rpc2NvdmVyeV9sb2coYXApOworICAgICAgLyogUmVjaGVjayAqLworICAgICAgaWYoYXAtPmRpc2NvX251bWJlciAhPSAtMSkKKwltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisgICAgfQorI2VuZGlmIC8qIElOSVRJQUxfRElTQ09WRVJZICovCisKKyAgREVYSVQoQ1RSTF9UUkFDRSwgIiAtIG1hc2s9MHglWFxuIiwgbWFzayk7CisgIHJldHVybiBtYXNrOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBGSUxFU1lTVEVNIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBJbXBsZW1lbnQgdGhlIHVzdWFsIG9wZW4sIHJlYWQsIHdyaXRlIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYmUgY2FsbGVkCisgKiBieSB0aGUgZmlsZSBzeXN0ZW0gd2hlbiBzb21lIGFjdGlvbiBpcyBwZXJmb3JtZWQgb24gL2Rldi9pcm5ldC4KKyAqIE1vc3Qgb2YgdGhvc2UgYWN0aW9ucyB3aWxsIGluIGZhY3QgYmUgcGVyZm9ybWVkIGJ5ICJwcHBkIiBvcgorICogdGhlIGNvbnRyb2wgY2hhbm5lbCwgd2UganVzdCBhY3QgYXMgYSByZWRpcmVjdG9yLi4uCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIE9wZW4gOiB3aGVuIHNvbWVib2R5IG9wZW4gL2Rldi9pcm5ldAorICogV2UgYmFzaWNhbGx5IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBpcm5ldCBhbmQgaW5pdGlhbGlzZSBpdC4KKyAqLworc3RhdGljIGludAorZGV2X2lybmV0X29wZW4oc3RydWN0IGlub2RlICoJaW5vZGUsCisJICAgICAgIHN0cnVjdCBmaWxlICoJZmlsZSkKK3sKKyAgc3RydWN0IGlybmV0X3NvY2tldCAqCWFwOworICBpbnQJCQllcnI7CisKKyAgREVOVEVSKEZTX1RSQUNFLCAiKGZpbGU9MHglcClcbiIsIGZpbGUpOworCisjaWZkZWYgU0VDVVJFX0RFVklSTkVUCisgIC8qIFRoaXMgY291bGQgKHNob3VsZD8pIGJlIGVuZm9yY2VkIGJ5IHRoZSBwZXJtaXNzaW9ucyBvbiAvZGV2L2lybmV0LiAqLworICBpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKyAgICByZXR1cm4gLUVQRVJNOworI2VuZGlmIC8qIFNFQ1VSRV9ERVZJUk5FVCAqLworCisgIC8qIEFsbG9jYXRlIGEgcHJpdmF0ZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgSXJORVQgaW5zdGFuY2UgKi8KKyAgYXAgPSBrbWFsbG9jKHNpemVvZigqYXApLCBHRlBfS0VSTkVMKTsKKyAgREFCT1JUKGFwID09IE5VTEwsIC1FTk9NRU0sIEZTX0VSUk9SLCAiQ2FuJ3QgYWxsb2NhdGUgc3RydWN0IGlybmV0Li4uXG4iKTsKKworICAvKiBpbml0aWFsaXplIHRoZSBpcm5ldCBzdHJ1Y3R1cmUgKi8KKyAgbWVtc2V0KGFwLCAwLCBzaXplb2YoKmFwKSk7CisgIGFwLT5maWxlID0gZmlsZTsKKworICAvKiBQUFAgY2hhbm5lbCBzZXR1cCAqLworICBhcC0+cHBwX29wZW4gPSAwOworICBhcC0+Y2hhbi5wcml2YXRlID0gYXA7CisgIGFwLT5jaGFuLm9wcyA9ICZpcm5ldF9wcHBfb3BzOworICBhcC0+Y2hhbi5tdHUgPSAoMjA0OCAtIFRUUF9NQVhfSEVBREVSIC0gMiAtIFBQUF9IRFJMRU4pOworICBhcC0+Y2hhbi5oZHJsZW4gPSAyICsgVFRQX01BWF9IRUFERVI7CQkvKiBmb3IgQS9DICsgTWF4IElyREEgaGRyICovCisgIC8qIFBQUCBwYXJhbWV0ZXJzICovCisgIGFwLT5tcnUgPSAoMjA0OCAtIFRUUF9NQVhfSEVBREVSIC0gMiAtIFBQUF9IRFJMRU4pOworICBhcC0+eGFjY21bMF0gPSB+MFU7CisgIGFwLT54YWNjbVszXSA9IDB4NjAwMDAwMDBVOworICBhcC0+cmFjY20gPSB+MFU7CisKKyAgLyogU2V0dXAgdGhlIElyREEgcGFydC4uLiAqLworICBlcnIgPSBpcmRhX2lybmV0X2NyZWF0ZShhcCk7CisgIGlmKGVycikKKyAgICB7CisgICAgICBERVJST1IoRlNfRVJST1IsICJDYW4ndCBzZXR1cCBJckRBIGxpbmsuLi5cbiIpOworICAgICAga2ZyZWUoYXApOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgLyogRm9yIHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKyAgYXAtPmV2ZW50X2luZGV4ID0gaXJuZXRfZXZlbnRzLmluZGV4OwkvKiBDYW5jZWwgYWxsIHBhc3QgZXZlbnRzICovCisKKyAgLyogUHV0IG91ciBzdHVmZiB3aGVyZSB3ZSB3aWxsIGJlIGFibGUgdG8gZmluZCBpdCBsYXRlciAqLworICBmaWxlLT5wcml2YXRlX2RhdGEgPSBhcDsKKworICBERVhJVChGU19UUkFDRSwgIiAtIGFwPTB4JXBcbiIsIGFwKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENsb3NlIDogd2hlbiBzb21lYm9keSBjbG9zZSAvZGV2L2lybmV0CisgKiBEZXN0cm95IHRoZSBpbnN0YW5jZSBvZiAvZGV2L2lybmV0CisgKi8KK3N0YXRpYyBpbnQKK2Rldl9pcm5ldF9jbG9zZShzdHJ1Y3QgaW5vZGUgKglpbm9kZSwKKwkJc3RydWN0IGZpbGUgKglmaWxlKQoreworICBpcm5ldF9zb2NrZXQgKglhcCA9IChzdHJ1Y3QgaXJuZXRfc29ja2V0ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworICBERU5URVIoRlNfVFJBQ0UsICIoZmlsZT0weCVwLCBhcD0weCVwKVxuIiwKKwkgZmlsZSwgYXApOworICBEQUJPUlQoYXAgPT0gTlVMTCwgMCwgRlNfRVJST1IsICJhcCBpcyBOVUxMICEhIVxuIik7CisKKyAgLyogRGV0YWNoIG91cnNlbHZlcyAqLworICBmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisgIC8qIENsb3NlIElyREEgc3R1ZmYgKi8KKyAgaXJkYV9pcm5ldF9kZXN0cm95KGFwKTsKKworICAvKiBEaXNjb25uZWN0IGZyb20gdGhlIGdlbmVyaWMgUFBQIGxheWVyIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KKyAgaWYoYXAtPnBwcF9vcGVuKQorICAgIHsKKyAgICAgIERFUlJPUihGU19FUlJPUiwgIkNoYW5uZWwgc3RpbGwgcmVnaXN0ZXJlZCAtIGRlcmVnaXN0ZXJpbmcgIVxuIik7CisgICAgICBhcC0+cHBwX29wZW4gPSAwOworICAgICAgcHBwX3VucmVnaXN0ZXJfY2hhbm5lbCgmYXAtPmNoYW4pOworICAgIH0KKworICBrZnJlZShhcCk7CisKKyAgREVYSVQoRlNfVFJBQ0UsICJcbiIpOworICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIGRvZXMgbm90aGluZy4KKyAqICh3ZSByZWNlaXZlIHBhY2tldCBmcm9tIHBwcF9nZW5lcmljIHRocm91Z2ggcHBwX2lybmV0X3NlbmQoKSkKKyAqLworc3RhdGljIHNzaXplX3QKK2Rldl9pcm5ldF93cml0ZShzdHJ1Y3QgZmlsZSAqCWZpbGUsCisJCWNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCXNpemVfdAkJY291bnQsCisJCWxvZmZfdCAqCXBwb3MpCit7CisgIGlybmV0X3NvY2tldCAqCWFwID0gKHN0cnVjdCBpcm5ldF9zb2NrZXQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCisgIERQQVNTKEZTX1RSQUNFLCAiKGZpbGU9MHglcCwgYXA9MHglcCwgY291bnQ9JVpkKVxuIiwKKwlmaWxlLCBhcCwgY291bnQpOworICBEQUJPUlQoYXAgPT0gTlVMTCwgLUVOWElPLCBGU19FUlJPUiwgImFwIGlzIE5VTEwgISEhXG4iKTsKKworICAvKiBJZiB3ZSBhcmUgY29ubmVjdGVkIHRvIHBwcF9nZW5lcmljLCBsZXQgaXQgaGFuZGxlIHRoZSBqb2IgKi8KKyAgaWYoYXAtPnBwcF9vcGVuKQorICAgIHJldHVybiAtRUFHQUlOOworICBlbHNlCisgICAgcmV0dXJuIGlybmV0X2N0cmxfd3JpdGUoYXAsIGJ1ZiwgY291bnQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCBkb2Vzbid0IGRvIG11Y2ggZWl0aGVyLgorICogKHBwcGQgcG9sbCB1cywgYnV0IHVsdGltYXRlbHkgcmVhZHMgdGhyb3VnaCAvZGV2L3BwcCkKKyAqLworc3RhdGljIHNzaXplX3QKK2Rldl9pcm5ldF9yZWFkKHN0cnVjdCBmaWxlICoJZmlsZSwKKwkgICAgICAgY2hhciBfX3VzZXIgKglidWYsCisJICAgICAgIHNpemVfdAkJY291bnQsCisJICAgICAgIGxvZmZfdCAqCQlwcG9zKQoreworICBpcm5ldF9zb2NrZXQgKglhcCA9IChzdHJ1Y3QgaXJuZXRfc29ja2V0ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworICBEUEFTUyhGU19UUkFDRSwgIihmaWxlPTB4JXAsIGFwPTB4JXAsIGNvdW50PSVaZClcbiIsCisJZmlsZSwgYXAsIGNvdW50KTsKKyAgREFCT1JUKGFwID09IE5VTEwsIC1FTlhJTywgRlNfRVJST1IsICJhcCBpcyBOVUxMICEhIVxuIik7CisKKyAgLyogSWYgd2UgYXJlIGNvbm5lY3RlZCB0byBwcHBfZ2VuZXJpYywgbGV0IGl0IGhhbmRsZSB0aGUgam9iICovCisgIGlmKGFwLT5wcHBfb3BlbikKKyAgICByZXR1cm4gLUVBR0FJTjsKKyAgZWxzZQorICAgIHJldHVybiBpcm5ldF9jdHJsX3JlYWQoYXAsIGZpbGUsIGJ1ZiwgY291bnQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUG9sbCA6IGNhbGxlZCB3aGVuIHNvbWVvbmUgZG8gYSBzZWxlY3Qgb24gL2Rldi9pcm5ldAorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitkZXZfaXJuZXRfcG9sbChzdHJ1Y3QgZmlsZSAqCWZpbGUsCisJICAgICAgIHBvbGxfdGFibGUgKgl3YWl0KQoreworICBpcm5ldF9zb2NrZXQgKglhcCA9IChzdHJ1Y3QgaXJuZXRfc29ja2V0ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKyAgdW5zaWduZWQgaW50CQltYXNrOworCisgIERFTlRFUihGU19UUkFDRSwgIihmaWxlPTB4JXAsIGFwPTB4JXApXG4iLAorCSBmaWxlLCBhcCk7CisKKyAgbWFzayA9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworICBEQUJPUlQoYXAgPT0gTlVMTCwgbWFzaywgRlNfRVJST1IsICJhcCBpcyBOVUxMICEhIVxuIik7CisKKyAgLyogSWYgd2UgYXJlIGNvbm5lY3RlZCB0byBwcHBfZ2VuZXJpYywgbGV0IGl0IGhhbmRsZSB0aGUgam9iICovCisgIGlmKCFhcC0+cHBwX29wZW4pCisgICAgbWFzayB8PSBpcm5ldF9jdHJsX3BvbGwoYXAsIGZpbGUsIHdhaXQpOworCisgIERFWElUKEZTX1RSQUNFLCAiIC0gbWFzaz0weCVYXG4iLCBtYXNrKTsKKyAgcmV0dXJuKG1hc2spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogSU9DdGwgOiBDYWxsZWQgd2hlbiBzb21lb25lIGRvZXMgc29tZSBpb2N0bHMgb24gL2Rldi9pcm5ldAorICogVGhpcyBpcyB0aGUgd2F5IHBwcGQgY29uZmlndXJlIHVzIGFuZCBjb250cm9sIHVzIHdoaWxlIHRoZSBQUFAKKyAqIGluc3RhbmNlIGlzIGFjdGl2ZS4KKyAqLworc3RhdGljIGludAorZGV2X2lybmV0X2lvY3RsKHN0cnVjdCBpbm9kZSAqCWlub2RlLAorCQlzdHJ1Y3QgZmlsZSAqCWZpbGUsCisJCXVuc2lnbmVkIGludAljbWQsCisJCXVuc2lnbmVkIGxvbmcJYXJnKQoreworICBpcm5ldF9zb2NrZXQgKglhcCA9IChzdHJ1Y3QgaXJuZXRfc29ja2V0ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKyAgaW50CQkJZXJyOworICBpbnQJCQl2YWw7CisgIHZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisgIERFTlRFUihGU19UUkFDRSwgIihmaWxlPTB4JXAsIGFwPTB4JXAsIGNtZD0weCVYKVxuIiwKKwkgZmlsZSwgYXAsIGNtZCk7CisKKyAgLyogQmFzaWMgY2hlY2tzLi4uICovCisgIERBU1NFUlQoYXAgIT0gTlVMTCwgLUVOWElPLCBQUFBfRVJST1IsICJhcCBpcyBOVUxMLi4uXG4iKTsKKyNpZmRlZiBTRUNVUkVfREVWSVJORVQKKyAgaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisgICAgcmV0dXJuIC1FUEVSTTsKKyNlbmRpZiAvKiBTRUNVUkVfREVWSVJORVQgKi8KKworICBlcnIgPSAtRUZBVUxUOworICBzd2l0Y2goY21kKQorICAgIHsKKyAgICAgIC8qIFNldCBkaXNjaXBsaW5lIChzaG91bGQgYmUgTl9TWU5DX1BQUCBvciBOX1RUWSkgKi8KKyAgICBjYXNlIFRJT0NTRVREOgorICAgICAgaWYoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCWJyZWFrOworICAgICAgaWYoKHZhbCA9PSBOX1NZTkNfUFBQKSB8fCAodmFsID09IE5fUFBQKSkKKwl7CisJICBERUJVRyhGU19JTkZPLCAiRW50ZXJpbmcgUFBQIGRpc2NpcGxpbmUuXG4iKTsKKwkgIC8qIFBQUCBjaGFubmVsIHNldHVwIChhcC0+Y2hhbiBpbiBjb25maWd1ZWQgaW4gZGV2X2lybmV0X29wZW4oKSkqLworCSAgZXJyID0gcHBwX3JlZ2lzdGVyX2NoYW5uZWwoJmFwLT5jaGFuKTsKKwkgIGlmKGVyciA9PSAwKQorCSAgICB7CisJICAgICAgLyogT3VyIHBwcCBzaWRlIGlzIGFjdGl2ZSAqLworCSAgICAgIGFwLT5wcHBfb3BlbiA9IDE7CisKKwkgICAgICBERUJVRyhGU19JTkZPLCAiVHJ5aW5nIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24uXG4iKTsKKwkgICAgICAvKiBTZXR1cCB0aGUgSXJEQSBsaW5rIG5vdyAtIG1heSBmYWlsLi4uICovCisJICAgICAgaXJkYV9pcm5ldF9jb25uZWN0KGFwKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBERVJST1IoRlNfRVJST1IsICJDYW4ndCBzZXR1cCBQUFAgY2hhbm5lbC4uLlxuIik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEluIHRoZW9yeSwgc2hvdWxkIGJlIE5fVFRZICovCisJICBERUJVRyhGU19JTkZPLCAiRXhpdGluZyBQUFAgZGlzY2lwbGluZS5cbiIpOworCSAgLyogRGlzY29ubmVjdCBmcm9tIHRoZSBnZW5lcmljIFBQUCBsYXllciAqLworCSAgaWYoYXAtPnBwcF9vcGVuKQorCSAgICB7CisJICAgICAgYXAtPnBwcF9vcGVuID0gMDsKKwkgICAgICBwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKCZhcC0+Y2hhbik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgREVSUk9SKEZTX0VSUk9SLCAiQ2hhbm5lbCBub3QgcmVnaXN0ZXJlZCAhXG4iKTsKKwkgIGVyciA9IDA7CisJfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFF1ZXJ5IFBQUCBjaGFubmVsIGFuZCB1bml0IG51bWJlciAqLworICAgIGNhc2UgUFBQSU9DR0NIQU46CisgICAgICBpZighYXAtPnBwcF9vcGVuKQorCWJyZWFrOworICAgICAgaWYocHV0X3VzZXIocHBwX2NoYW5uZWxfaW5kZXgoJmFwLT5jaGFuKSwgKGludCBfX3VzZXIgKilhcmdwKSkKKwlicmVhazsKKyAgICAgIERFQlVHKEZTX0lORk8sICJRdWVyeSBjaGFubmVsLlxuIik7CisgICAgICBlcnIgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUFBJT0NHVU5JVDoKKyAgICAgIGlmKCFhcC0+cHBwX29wZW4pCisJYnJlYWs7CisgICAgICBpZihwdXRfdXNlcihwcHBfdW5pdF9udW1iZXIoJmFwLT5jaGFuKSwgKGludCBfX3VzZXIgKilhcmdwKSkKKwlicmVhazsKKyAgICAgIERFQlVHKEZTX0lORk8sICJRdWVyeSB1bml0IG51bWJlci5cbiIpOworICAgICAgZXJyID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBBbGwgdGhlc2UgaW9jdGxzIGNhbiBiZSBwYXNzZWQgYm90aCBkaXJlY3RseSBhbmQgZnJvbSBwcHBfZ2VuZXJpYywKKyAgICAgICAqIHNvIHdlIGp1c3QgZGVhbCB3aXRoIHRoZW0gaW4gb25lIHBsYWNlLi4uCisgICAgICAgKi8KKyAgICBjYXNlIFBQUElPQ0dGTEFHUzoKKyAgICBjYXNlIFBQUElPQ1NGTEFHUzoKKyAgICBjYXNlIFBQUElPQ0dBU1lOQ01BUDoKKyAgICBjYXNlIFBQUElPQ1NBU1lOQ01BUDoKKyAgICBjYXNlIFBQUElPQ0dSQVNZTkNNQVA6CisgICAgY2FzZSBQUFBJT0NTUkFTWU5DTUFQOgorICAgIGNhc2UgUFBQSU9DR1hBU1lOQ01BUDoKKyAgICBjYXNlIFBQUElPQ1NYQVNZTkNNQVA6CisgICAgY2FzZSBQUFBJT0NHTVJVOgorICAgIGNhc2UgUFBQSU9DU01SVToKKyAgICAgIERFQlVHKEZTX0lORk8sICJTdGFuZGFyZCBQUFAgaW9jdGwuXG4iKTsKKyAgICAgIGlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCWVyciA9IC1FUEVSTTsKKyAgICAgIGVsc2UKKwllcnIgPSBwcHBfaXJuZXRfaW9jdGwoJmFwLT5jaGFuLCBjbWQsIGFyZyk7CisgICAgICBicmVhazsKKworICAgICAgLyogVFRZIElPQ1RMcyA6IFByZXRlbmQgdGhhdCB3ZSBhcmUgYSB0dHksIHRvIGtlZXAgcHBwZCBoYXBweSAqLworICAgICAgLyogR2V0IHRlcm1pb3MgKi8KKyAgICBjYXNlIFRDR0VUUzoKKyAgICAgIERFQlVHKEZTX0lORk8sICJHZXQgdGVybWlvcy5cbiIpOworICAgICAgaWYoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKilhcmdwLCAmYXAtPnRlcm1pb3MpKQorCWJyZWFrOworICAgICAgZXJyID0gMDsKKyAgICAgIGJyZWFrOworICAgICAgLyogU2V0IHRlcm1pb3MgKi8KKyAgICBjYXNlIFRDU0VUU0Y6CisgICAgICBERUJVRyhGU19JTkZPLCAiU2V0IHRlcm1pb3MuXG4iKTsKKyAgICAgIGlmKHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcygmYXAtPnRlcm1pb3MsIChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKilhcmdwKSkKKwlicmVhazsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKworICAgICAgLyogU2V0IERUUi9SVFMgKi8KKyAgICBjYXNlIFRJT0NNQklTOiAKKyAgICBjYXNlIFRJT0NNQklDOgorICAgICAgLyogU2V0IGV4Y2x1c2l2ZS9ub24tZXhjbHVzaXZlIG1vZGUgKi8KKyAgICBjYXNlIFRJT0NFWENMOgorICAgIGNhc2UgVElPQ05YQ0w6CisgICAgICBERUJVRyhGU19JTkZPLCAiVFRZIGNvbXBhdGliaWxpdHkuXG4iKTsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVENHRVRBOgorICAgICAgREVCVUcoRlNfSU5GTywgIlRDR0VUQVxuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVENGTFNIOgorICAgICAgREVCVUcoRlNfSU5GTywgIlRDRkxTSFxuIik7CisgICAgICAvKiBOb3RlIDogdGhpcyB3aWxsIGZsdXNoIGJ1ZmZlcnMgaW4gUFBQLCBzbyBpdCAqbXVzdCogYmUgZG9uZQorICAgICAgICogV2Ugc2hvdWxkIGFsc28gd29ycnkgdGhhdCB3ZSBkb24ndCBhY2NlcHQganVuayBoZXJlIGFuZCB0aGF0CisgICAgICAgKiB3ZSBnZXQgcmlkIG9mIG91ciBvd24gYnVmZmVycyAqLworI2lmZGVmIEZMVVNIX1RPX1BQUAorICAgICAgcHBwX291dHB1dF93YWtldXAoJmFwLT5jaGFuKTsKKyNlbmRpZiAvKiBGTFVTSF9UT19QUFAgKi8KKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRklPTlJFQUQ6CisgICAgICBERUJVRyhGU19JTkZPLCAiRklPTlJFQURcbiIpOworICAgICAgdmFsID0gMDsKKyAgICAgIGlmKHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwlicmVhazsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBERVJST1IoRlNfRVJST1IsICJVbnN1cHBvcnRlZCBpb2N0bCAoMHglWClcbiIsIGNtZCk7CisgICAgICBlcnIgPSAtRU5PSU9DVExDTUQ7CisgICAgfQorCisgIERFWElUKEZTX1RSQUNFLCAiIC0gZXJyID0gMHglWFxuIiwgZXJyKTsKKyAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFBQUCBDQUxMQkFDS1MgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBhcmUgdGhlIGZ1bmN0aW9ucyB0aGF0IHRoZSBnZW5lcmljIFBQUCBkcml2ZXIgaW4gdGhlIGtlcm5lbAorICogd2lsbCBjYWxsIHRvIGNvbW11bmljYXRlIHRvIHVzLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQcmVwYXJlIHRoZSBwcHAgZnJhbWUgZm9yIHRyYW5zbWlzc2lvbiBvdmVyIHRoZSBJckRBIHNvY2tldC4KKyAqIFdlIG1ha2Ugc3VyZSB0aGF0IHRoZSBoZWFkZXIgc3BhY2UgaXMgZW5vdWdoLCBhbmQgd2UgY2hhbmdlIHBwcCBoZWFkZXIKKyAqIGFjY29yZGluZyB0byBmbGFncyBwYXNzZWQgYnkgcHBwZC4KKyAqIFRoaXMgaXMgbm90IGEgY2FsbGJhY2ssIGJ1dCBqdXN0IGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgaW4gcHBwX2lybmV0X3NlbmQoKQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKK2lybmV0X3ByZXBhcmVfc2tiKGlybmV0X3NvY2tldCAqCWFwLAorCQkgIHN0cnVjdCBza19idWZmICoJc2tiKQoreworICB1bnNpZ25lZCBjaGFyICoJZGF0YTsKKyAgaW50CQkJcHJvdG87CQkvKiBQUFAgcHJvdG9jb2wgKi8KKyAgaW50CQkJaXNsY3A7CQkvKiBQcm90b2NvbCA9PSBMQ1AgKi8KKyAgaW50CQkJbmVlZGFkZHI7CS8qIE5lZWQgUFBQIGFkZHJlc3MgKi8KKworICBERU5URVIoUFBQX1RSQUNFLCAiKGFwPTB4JXAsIHNrYj0weCVwKVxuIiwKKwkgYXAsIHNrYik7CisKKyAgLyogRXh0cmFjdCBQUFAgcHJvdG9jb2wgZnJvbSB0aGUgZnJhbWUgKi8KKyAgZGF0YSAgPSBza2ItPmRhdGE7CisgIHByb3RvID0gKGRhdGFbMF0gPDwgOCkgKyBkYXRhWzFdOworCisgIC8qIExDUCBwYWNrZXRzIHdpdGggY29kZXMgYmV0d2VlbiAxIChjb25maWd1cmUtcmVxdWVzdCkKKyAgICogYW5kIDcgKGNvZGUtcmVqZWN0KSBtdXN0IGJlIHNlbnQgYXMgdGhvdWdoIG5vIG9wdGlvbnMKKyAgICogaGF2ZSBiZWVuIG5lZ290aWF0ZWQuICovCisgIGlzbGNwID0gKHByb3RvID09IFBQUF9MQ1ApICYmICgxIDw9IGRhdGFbMl0pICYmIChkYXRhWzJdIDw9IDcpOworCisgIC8qIGNvbXByZXNzIHByb3RvY29sIGZpZWxkIGlmIG9wdGlvbiBlbmFibGVkICovCisgIGlmKChkYXRhWzBdID09IDApICYmIChhcC0+ZmxhZ3MgJiBTQ19DT01QX1BST1QpICYmICghaXNsY3ApKQorICAgIHNrYl9wdWxsKHNrYiwxKTsKKworICAvKiBDaGVjayBpZiB3ZSBuZWVkIGFkZHJlc3MvY29udHJvbCBmaWVsZHMgKi8KKyAgbmVlZGFkZHIgPSAyKigoYXAtPmZsYWdzICYgU0NfQ09NUF9BQykgPT0gMCB8fCBpc2xjcCk7CisKKyAgLyogSXMgdGhlIHNrYiBoZWFkcm9vbSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBhbGwgSXJEQS1oZWFkZXJzPyAqLworICBpZigoc2tiX2hlYWRyb29tKHNrYikgPCAoYXAtPm1heF9oZWFkZXJfc2l6ZSArIG5lZWRhZGRyKSkgfHwKKyAgICAgIChza2Jfc2hhcmVkKHNrYikpKQorICAgIHsKKyAgICAgIHN0cnVjdCBza19idWZmICoJbmV3X3NrYjsKKworICAgICAgREVCVUcoUFBQX0lORk8sICJSZWFsbG9jYXRpbmcgc2tiXG4iKTsKKworICAgICAgLyogQ3JlYXRlIGEgbmV3IHNrYiAqLworICAgICAgbmV3X3NrYiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgYXAtPm1heF9oZWFkZXJfc2l6ZSArIG5lZWRhZGRyKTsKKworICAgICAgLyogV2UgaGF2ZSB0byBmcmVlIHRoZSBvcmlnaW5hbCBza2IgYW55d2F5ICovCisgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CisKKyAgICAgIC8qIERpZCB0aGUgcmVhbGxvYyBzdWNjZWVkID8gKi8KKyAgICAgIERBQk9SVChuZXdfc2tiID09IE5VTEwsIE5VTEwsIFBQUF9FUlJPUiwgIkNvdWxkIG5vdCByZWFsbG9jIHNrYlxuIik7CisKKyAgICAgIC8qIFVzZSB0aGUgbmV3IHNrYiBpbnN0ZWFkICovCisgICAgICBza2IgPSBuZXdfc2tiOworICAgIH0KKworICAvKiBwcmVwZW5kIGFkZHJlc3MvY29udHJvbCBmaWVsZHMgaWYgbmVjZXNzYXJ5ICovCisgIGlmKG5lZWRhZGRyKQorICAgIHsKKyAgICAgIHNrYl9wdXNoKHNrYiwgMik7CisgICAgICBza2ItPmRhdGFbMF0gPSBQUFBfQUxMU1RBVElPTlM7CisgICAgICBza2ItPmRhdGFbMV0gPSBQUFBfVUk7CisgICAgfQorCisgIERFWElUKFBQUF9UUkFDRSwgIlxuIik7CisKKyAgcmV0dXJuIHNrYjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNlbmQgYSBwYWNrZXQgdG8gdGhlIHBlZXIgb3ZlciB0aGUgSXJUVFAgY29ubmVjdGlvbi4KKyAqIFJldHVybnMgMSBpZmYgdGhlIHBhY2tldCB3YXMgYWNjZXB0ZWQuCisgKiBSZXR1cm5zIDAgaWZmIHBhY2tldCB3YXMgbm90IGNvbnN1bWVkLgorICogSWYgdGhlIHBhY2tldCB3YXMgbm90IGFjY2VwdGVkLCB3ZSB3aWxsIGNhbGwgcHBwX291dHB1dF93YWtldXAKKyAqIGF0IHNvbWUgbGF0ZXIgdGltZSB0byByZWFjdGl2YXRlIGZsb3cgY29udHJvbCBpbiBwcHBfZ2VuZXJpYy4KKyAqLworc3RhdGljIGludAorcHBwX2lybmV0X3NlbmQoc3RydWN0IHBwcF9jaGFubmVsICoJY2hhbiwKKwkgICAgICAgc3RydWN0IHNrX2J1ZmYgKgkJc2tiKQoreworICBpcm5ldF9zb2NrZXQgKglzZWxmID0gKHN0cnVjdCBpcm5ldF9zb2NrZXQgKikgY2hhbi0+cHJpdmF0ZTsKKyAgaW50CQkJcmV0OworCisgIERFTlRFUihQUFBfVFJBQ0UsICIoY2hhbm5lbD0weCVwLCBhcC9zZWxmPTB4JXApXG4iLAorCSBjaGFuLCBzZWxmKTsKKworICAvKiBDaGVjayBpZiB0aGluZ3MgYXJlIHNvbWV3aGF0IHZhbGlkLi4uICovCisgIERBU1NFUlQoc2VsZiAhPSBOVUxMLCAwLCBQUFBfRVJST1IsICJTZWxmIGlzIE5VTEwgISEhXG4iKTsKKworICAvKiBDaGVjayBpZiB3ZSBhcmUgY29ubmVjdGVkICovCisgIGlmKCEodGVzdF9iaXQoMCwgJnNlbGYtPnR0cF9vcGVuKSkpCisgICAgeworI2lmZGVmIENPTk5FQ1RfSU5fU0VORAorICAgICAgLyogTGV0J3MgdHJ5IHRvIGNvbm5lY3Qgb25lIG1vcmUgdGltZS4uLiAqLworICAgICAgLyogTm90ZSA6IHdlIHdvbid0IGJlIGNvbm5lY3RlZCBhZnRlciB0aGlzIGNhbGwsIGJ1dCB3ZSBzaG91bGQgYmUKKyAgICAgICAqIHJlYWR5IGZvciBuZXh0IHBhY2tldC4uLiAqLworICAgICAgLyogSWYgd2UgYXJlIGFscmVhZHkgY29ubmVjdGluZywgdGhpcyB3aWxsIGZhaWwgKi8KKyAgICAgIGlyZGFfaXJuZXRfY29ubmVjdChzZWxmKTsKKyNlbmRpZiAvKiBDT05ORUNUX0lOX1NFTkQgKi8KKworICAgICAgREVCVUcoUFBQX0lORk8sICJJclRUUCBub3QgcmVhZHkgISAoJWxkLSVsZClcbiIsCisJICAgIHNlbGYtPnR0cF9vcGVuLCBzZWxmLT50dHBfY29ubmVjdCk7CisKKyAgICAgIC8qIE5vdGUgOiB3ZSBjYW4gZWl0aGVyIGRyb3AgdGhlIHBhY2tldCBvciBibG9jayB0aGUgcGFja2V0LgorICAgICAgICoKKyAgICAgICAqIEJsb2NraW5nIHRoZSBwYWNrZXQgYWxsb3cgdXMgYSBiZXR0ZXIgY29ubmVjdGlvbiB0aW1lLAorICAgICAgICogYmVjYXVzZSBieSBjYWxsaW5nIHBwcF9vdXRwdXRfd2FrZXVwKCkgd2UgY2FuIGhhdmUKKyAgICAgICAqIHBwcF9nZW5lcmljIHJlc2VuZGluZyB0aGUgTENQIHJlcXVlc3QgaW1tZWRpYXRlbHkgdG8gdXMsCisgICAgICAgKiByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciBvbmUgb2YgcHBwZCBwZXJpb2RpYyB0cmFuc21pc3Npb24gb2YKKyAgICAgICAqIExDUCByZXF1ZXN0LgorICAgICAgICoKKyAgICAgICAqIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBibG9jayBhbGwgcGFja2V0LCBhbGwgdGhvc2UgcGVyaW9kaWMKKyAgICAgICAqIHRyYW5zbWlzc2lvbnMgb2YgcHBwZCBhY2N1bXVsYXRlIGluIHBwcF9nZW5lcmljLCBjcmVhdGluZyBhCisgICAgICAgKiBiYWNrbG9nIG9mIExDUCByZXF1ZXN0LiBXaGVuIHdlIGV2ZW50dWFsbHkgY29ubmVjdCBsYXRlciBvbiwKKyAgICAgICAqIHdlIGhhdmUgdG8gdHJhbnNtaXQgYWxsIHRoaXMgYmFja2xvZyBiZWZvcmUgd2UgY2FuIGNvbm5lY3QKKyAgICAgICAqIHByb3BlciAoaWYgd2UgZG9uJ3QgdGltZW91dCBiZWZvcmUpLgorICAgICAgICoKKyAgICAgICAqIFRoZSBjdXJyZW50IHN0cmF0ZWd5IGlzIGFzIGZvbGxvdyA6CisgICAgICAgKiBXaGlsZSB3ZSBhcmUgYXR0ZW1wdGluZyB0byBjb25uZWN0LCB3ZSBibG9jayBwYWNrZXRzIHRvIGdldAorICAgICAgICogYSBiZXR0ZXIgY29ubmVjdGlvbiB0aW1lLgorICAgICAgICogSWYgd2UgZmFpbCB0byBjb25uZWN0LCB3ZSBkcmFpbiB0aGUgcXVldWUgYW5kIHN0YXJ0IGRyb3BwaW5nIHBhY2tldHMKKyAgICAgICAqLworI2lmZGVmIEJMT0NLX1dIRU5fQ09OTkVDVAorICAgICAgLyogSWYgd2UgYXJlIGF0dGVtcHRpbmcgdG8gY29ubmVjdCAqLworICAgICAgaWYodGVzdF9iaXQoMCwgJnNlbGYtPnR0cF9jb25uZWN0KSkKKwl7CisJICAvKiBCbG9ja2luZyBwYWNrZXQsIHBwcF9nZW5lcmljIHdpbGwgcmV0cnkgbGF0ZXIgKi8KKwkgIHJldHVybiAwOworCX0KKyNlbmRpZiAvKiBCTE9DS19XSEVOX0NPTk5FQ1QgKi8KKworICAgICAgLyogRHJvcHBpbmcgcGFja2V0LCBwcHBkIHdpbGwgcmV0cnkgbGF0ZXIgKi8KKyAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBDaGVjayBpZiB0aGUgcXVldWUgY2FuIGFjY2VwdCBhbnkgcGFja2V0LCBvdGhlcndpc2UgYmxvY2sgKi8KKyAgaWYoc2VsZi0+dHhfZmxvdyAhPSBGTE9XX1NUQVJUKQorICAgIERSRVRVUk4oMCwgUFBQX0lORk8sICJJclRUUCBxdWV1ZSBmdWxsICglZCBza2JzKS4uLlxuIiwKKwkgICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHNhcC0+dHhfcXVldWUpKTsKKworICAvKiBQcmVwYXJlIHBwcCBmcmFtZSBmb3IgdHJhbnNtaXNzaW9uICovCisgIHNrYiA9IGlybmV0X3ByZXBhcmVfc2tiKHNlbGYsIHNrYik7CisgIERBQk9SVChza2IgPT0gTlVMTCwgMSwgUFBQX0VSUk9SLCAiUHJlcGFyZSBza2IgZm9yIFR4IGZhaWxlZC5cbiIpOworCisgIC8qIFNlbmQgdGhlIHBhY2tldCB0byBJclRUUCAqLworICByZXQgPSBpcnR0cF9kYXRhX3JlcXVlc3Qoc2VsZi0+dHNhcCwgc2tiKTsKKyAgaWYocmV0IDwgMCkKKyAgICB7CisgICAgICAvKiAgIAorICAgICAgICogPiBJclRUUHMgdHggcXVldWUgaXMgZnVsbCwgc28gd2UganVzdCBoYXZlIHRvCisgICAgICAgKiA+IGRyb3AgdGhlIGZyYW1lISBZb3UgbWlnaHQgdGhpbmsgdGhhdCB3ZSBzaG91bGQKKyAgICAgICAqID4ganVzdCByZXR1cm4gLTEgYW5kIGRvbid0IGRlYWxsb2NhdGUgdGhlIGZyYW1lLAorICAgICAgICogPiBidXQgdGhhdCBpcyBkYW5nZXJvdXMgc2luY2UgaXQncyBwb3NzaWJsZSB0aGF0CisgICAgICAgKiA+IHdlIGhhdmUgcmVwbGFjZWQgdGhlIG9yaWdpbmFsIHNrYiB3aXRoIGEgbmV3CisgICAgICAgKiA+IG9uZSB3aXRoIGxhcmdlciBoZWFkcm9vbSwgYW5kIHRoYXQgd291bGQgcmVhbGx5CisgICAgICAgKiA+IGNvbmZ1c2UgZG9fZGV2X3F1ZXVlX3htaXQoKSBpbiBkZXYuYyEgSSBoYXZlCisgICAgICAgKiA+IHRyaWVkIDotKSBEQiAKKyAgICAgICAqIENvcnJlY3Rpb24gOiB3ZSB2ZXJpZnkgdGhlIGZsb3cgY29udHJvbCBhYm92ZSAoc2VsZi0+dHhfZmxvdyksCisgICAgICAgKiBzbyB3ZSBjb21lIGhlcmUgb25seSBpZiBJclRUUCBkb2Vzbid0IGxpa2UgdGhlIHBhY2tldCAoZW1wdHksCisgICAgICAgKiB0b28gbGFyZ2UsIElyVFRQIG5vdCBjb25uZWN0ZWQpLiBJbiB0aG9zZSByYXJlIGNhc2VzLCBpdCdzIG9rCisgICAgICAgKiB0byBkcm9wIGl0LCB3ZSBkb24ndCB3YW50IHRvIHNlZSBpdCBoZXJlIGFnYWluLi4uCisgICAgICAgKiBKZWFuIElJCisgICAgICAgKi8KKyAgICAgIERFUlJPUihQUFBfRVJST1IsICJJclRUUCBkb2Vzbid0IGxpa2UgdGhpcyBwYWNrZXQgISEhICgweCVYKVxuIiwgcmV0KTsKKyAgICAgIC8qIGlydHRwX2RhdGFfcmVxdWVzdCBhbHJlYWR5IGZyZWUgdGhlIHBhY2tldCAqLworICAgIH0KKworICBERVhJVChQUFBfVFJBQ0UsICJcbiIpOworICByZXR1cm4gMTsJLyogUGFja2V0IGhhcyBiZWVuIGNvbnN1bWVkICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUYWtlIGNhcmUgb2YgdGhlIGlvY3RscyB0aGF0IHBwcF9nZW5lcmljIGRvZXNuJ3Qgd2FudCB0byBkZWFsIHdpdGguLi4KKyAqIE5vdGUgOiB3ZSBhcmUgYWxzbyBjYWxsZWQgZnJvbSBkZXZfaXJuZXRfaW9jdGwoKS4KKyAqLworc3RhdGljIGludAorcHBwX2lybmV0X2lvY3RsKHN0cnVjdCBwcHBfY2hhbm5lbCAqCWNoYW4sCisJCXVuc2lnbmVkIGludAkJY21kLAorCQl1bnNpZ25lZCBsb25nCQlhcmcpCit7CisgIGlybmV0X3NvY2tldCAqCWFwID0gKHN0cnVjdCBpcm5ldF9zb2NrZXQgKikgY2hhbi0+cHJpdmF0ZTsKKyAgaW50CQkJZXJyOworICBpbnQJCQl2YWw7CisgIHUzMgkJCWFjY21bOF07CisgIHZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisgIERFTlRFUihQUFBfVFJBQ0UsICIoY2hhbm5lbD0weCVwLCBhcD0weCVwLCBjbWQ9MHglWClcbiIsCisJIGNoYW4sIGFwLCBjbWQpOworCisgIC8qIEJhc2ljIGNoZWNrcy4uLiAqLworICBEQVNTRVJUKGFwICE9IE5VTEwsIC1FTlhJTywgUFBQX0VSUk9SLCAiYXAgaXMgTlVMTC4uLlxuIik7CisKKyAgZXJyID0gLUVGQVVMVDsKKyAgc3dpdGNoKGNtZCkKKyAgICB7CisgICAgICAvKiBQUFAgZmxhZ3MgKi8KKyAgICBjYXNlIFBQUElPQ0dGTEFHUzoKKyAgICAgIHZhbCA9IGFwLT5mbGFncyB8IGFwLT5yYml0czsKKyAgICAgIGlmKHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJncCkpCisJYnJlYWs7CisgICAgICBlcnIgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUFBJT0NTRkxBR1M6CisgICAgICBpZihnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZ3ApKQorCWJyZWFrOworICAgICAgYXAtPmZsYWdzID0gdmFsICYgflNDX1JDVl9CSVRTOworICAgICAgYXAtPnJiaXRzID0gdmFsICYgU0NfUkNWX0JJVFM7CisgICAgICBlcnIgPSAwOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEFzeW5jIG1hcCBzdHVmZiAtIGFsbCBkdW1teSB0byBwbGVhc2UgcHBwZCAqLworICAgIGNhc2UgUFBQSU9DR0FTWU5DTUFQOgorICAgICAgaWYocHV0X3VzZXIoYXAtPnhhY2NtWzBdLCAodTMyIF9fdXNlciAqKSBhcmdwKSkKKwlicmVhazsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBQUElPQ1NBU1lOQ01BUDoKKyAgICAgIGlmKGdldF91c2VyKGFwLT54YWNjbVswXSwgKHUzMiBfX3VzZXIgKikgYXJncCkpCisJYnJlYWs7CisgICAgICBlcnIgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUFBJT0NHUkFTWU5DTUFQOgorICAgICAgaWYocHV0X3VzZXIoYXAtPnJhY2NtLCAodTMyIF9fdXNlciAqKSBhcmdwKSkKKwlicmVhazsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBQUElPQ1NSQVNZTkNNQVA6CisgICAgICBpZihnZXRfdXNlcihhcC0+cmFjY20sICh1MzIgX191c2VyICopIGFyZ3ApKQorCWJyZWFrOworICAgICAgZXJyID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFBQSU9DR1hBU1lOQ01BUDoKKyAgICAgIGlmKGNvcHlfdG9fdXNlcihhcmdwLCBhcC0+eGFjY20sIHNpemVvZihhcC0+eGFjY20pKSkKKwlicmVhazsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBQUElPQ1NYQVNZTkNNQVA6CisgICAgICBpZihjb3B5X2Zyb21fdXNlcihhY2NtLCBhcmdwLCBzaXplb2YoYWNjbSkpKQorCWJyZWFrOworICAgICAgYWNjbVsyXSAmPSB+MHg0MDAwMDAwMFU7CQkvKiBjYW4ndCBlc2NhcGUgMHg1ZSAqLworICAgICAgYWNjbVszXSB8PSAweDYwMDAwMDAwVTsJCS8qIG11c3QgZXNjYXBlIDB4N2QsIDB4N2UgKi8KKyAgICAgIG1lbWNweShhcC0+eGFjY20sIGFjY20sIHNpemVvZihhcC0+eGFjY20pKTsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKworICAgICAgLyogTWF4IFBQUCBmcmFtZSBzaXplICovCisgICAgY2FzZSBQUFBJT0NHTVJVOgorICAgICAgaWYocHV0X3VzZXIoYXAtPm1ydSwgKGludCBfX3VzZXIgKikgYXJncCkpCisJYnJlYWs7CisgICAgICBlcnIgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUFBJT0NTTVJVOgorICAgICAgaWYoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBhcmdwKSkKKwlicmVhazsKKyAgICAgIGlmKHZhbCA8IFBQUF9NUlUpCisJdmFsID0gUFBQX01SVTsKKyAgICAgIGFwLT5tcnUgPSB2YWw7CisgICAgICBlcnIgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgREVCVUcoUFBQX0lORk8sICJVbnN1cHBvcnRlZCBpb2N0bCAoMHglWClcbiIsIGNtZCk7CisgICAgICBlcnIgPSAtRU5PSU9DVExDTUQ7CisgICAgfQorCisgIERFWElUKFBQUF9UUkFDRSwgIiAtIGVyciA9IDB4JVhcbiIsIGVycik7CisgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBJTklUSUFMSVNBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBNb2R1bGUgaW5pdGlhbGlzYXRpb24gYW5kIGFsbCB0aGF0IGphenouLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogSG9vayBvdXIgZGV2aWNlIGNhbGxiYWNrcyBpbiB0aGUgZmlsZXN5c3RlbSwgdG8gY29ubmVjdCBvdXIgY29kZQorICogdG8gL2Rldi9pcm5ldAorICovCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQKK3BwcF9pcm5ldF9pbml0KHZvaWQpCit7CisgIGludCBlcnIgPSAwOworCisgIERFTlRFUihNT0RVTEVfVFJBQ0UsICIoKVxuIik7CisKKyAgLyogQWxsb2NhdGUgb3Vyc2VsdmVzIGFzIGEgbWlub3IgaW4gdGhlIG1pc2MgcmFuZ2UgKi8KKyAgZXJyID0gbWlzY19yZWdpc3RlcigmaXJuZXRfbWlzY19kZXZpY2UpOworCisgIERFWElUKE1PRFVMRV9UUkFDRSwgIlxuIik7CisgIHJldHVybiBlcnI7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDbGVhbnVwIGF0IGV4aXQuLi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdAorcHBwX2lybmV0X2NsZWFudXAodm9pZCkKK3sKKyAgREVOVEVSKE1PRFVMRV9UUkFDRSwgIigpXG4iKTsKKworICAvKiBEZS1hbGxvY2F0ZSAvZGV2L2lybmV0IG1pbm9yIGluIG1pc2MgcmFuZ2UgKi8KKyAgbWlzY19kZXJlZ2lzdGVyKCZpcm5ldF9taXNjX2RldmljZSk7CisKKyAgREVYSVQoTU9EVUxFX1RSQUNFLCAiXG4iKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIE1vZHVsZSBtYWluIGVudHJ5IHBvaW50CisgKi8KK2ludCBfX2luaXQKK2lybmV0X2luaXQodm9pZCkKK3sKKyAgaW50IGVycjsKKworICAvKiBJbml0aWFsaXNlIGJvdGggcGFydHMuLi4gKi8KKyAgZXJyID0gaXJkYV9pcm5ldF9pbml0KCk7CisgIGlmKCFlcnIpCisgICAgZXJyID0gcHBwX2lybmV0X2luaXQoKTsKKyAgcmV0dXJuIGVycjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIE1vZHVsZSBleGl0CisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdAoraXJuZXRfY2xlYW51cCh2b2lkKQoreworICBpcmRhX2lybmV0X2NsZWFudXAoKTsKKyAgcHBwX2lybmV0X2NsZWFudXAoKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIE1vZHVsZSBtYWdpYworICovCittb2R1bGVfaW5pdChpcm5ldF9pbml0KTsKK21vZHVsZV9leGl0KGlybmV0X2NsZWFudXApOworTU9EVUxFX0FVVEhPUigiSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJck5FVCA6IFN5bmNocm9ub3VzIFBQUCBvdmVyIElyREEiKTsgCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfQ0hBUkRFVigxMCwgMTg3KTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybmV0L2lybmV0X3BwcC5oIGIvbmV0L2lyZGEvaXJuZXQvaXJuZXRfcHBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiZWI3ZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybmV0L2lybmV0X3BwcC5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICoJSXJORVQgcHJvdG9jb2wgbW9kdWxlIDogU3luY2hyb25vdXMgUFBQIG92ZXIgYW4gSXJEQSBzb2NrZXQuCisgKgorICoJCUplYW4gSUkgLSBIUEwgYDAwIC0gPGp0QGhwbC5ocC5jb20+CisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIG5lY2Vzc2FyeSBmb3IgdGhlCisgKiBQUFAgcGFydCBvZiB0aGUgSXJORVQgbW9kdWxlLgorICogVGhpcyBmaWxlIGlzIGEgcHJpdmF0ZSBoZWFkZXIsIHNvIG90aGVyIG1vZHVsZXMgZG9uJ3Qgd2FudCB0byBrbm93CisgKiB3aGF0J3MgaW4gdGhlcmUuLi4KKyAqLworCisjaWZuZGVmIElSTkVUX1BQUF9ICisjZGVmaW5lIElSTkVUX1BQUF9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImlybmV0LmgiCQkvKiBNb2R1bGUgZ2xvYmFsIGluY2x1ZGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBDT05TVEFOVFMgJiBNQUNST1MgKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAvZGV2L2lybmV0IGZpbGUgY29uc3RhbnRzICovCisjZGVmaW5lIElSTkVUX01BSk9SCTEwCS8qIE1pc2MgcmFuZ2UgKi8KKyNkZWZpbmUgSVJORVRfTUlOT1IJMTg3CS8qIE9mZmljaWFsIGFsbG9jYXRpb24gKi8KKworLyogSXJORVQgY29udHJvbCBjaGFubmVsIHN0dWZmICovCisjZGVmaW5lIElSTkVUX01BWF9DT01NQU5ECTI1NgkvKiBNYXggbGVuZ3RoIG9mIGEgY29tbWFuZCBsaW5lICovCisKKy8qIFBQUCBoYXJkY29yZSBzdHVmZiAqLworCisvKiBCaXRzIGluIHJiaXRzIChQUFAgZmxhZ3MgaW4gaXJuZXQgc3RydWN0KSAqLworI2RlZmluZSBTQ19SQ1ZfQklUUwkoU0NfUkNWX0I3XzF8U0NfUkNWX0I3XzB8U0NfUkNWX09ERFB8U0NfUkNWX0VWTlApCisKKy8qIEJpdCBudW1iZXJzIGluIGJ1c3kgKi8KKyNkZWZpbmUgWE1JVF9CVVNZCTAKKyNkZWZpbmUgUkVDVl9CVVNZCTEKKyNkZWZpbmUgWE1JVF9XQUtFVVAJMgorI2RlZmluZSBYTUlUX0ZVTEwJMworCisvKiBRdWV1ZSBtYW5hZ2VtZW50ICovCisjZGVmaW5lIFBQUFNZTkNfTUFYX1JRTEVOCTMyCS8qIGFyYml0cmFyeSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRZUEVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQUk9UT1RZUEVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTlRST0wgQ0hBTk5FTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSBzc2l6ZV90CisJaXJuZXRfY3RybF93cml0ZShpcm5ldF9zb2NrZXQgKiwKKwkJCSBjb25zdCBjaGFyICosCisJCQkgc2l6ZV90KTsKK3N0YXRpYyBpbmxpbmUgc3NpemVfdAorCWlybmV0X2N0cmxfcmVhZChpcm5ldF9zb2NrZXQgKiwKKwkJCXN0cnVjdCBmaWxlICosCisJCQljaGFyICosCisJCQlzaXplX3QpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKKwlpcm5ldF9jdHJsX3BvbGwoaXJuZXRfc29ja2V0ICosCisJCQlzdHJ1Y3QgZmlsZSAqLAorCQkJcG9sbF90YWJsZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENIQVJBQ1RFUiBERVZJQ0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQKKwlkZXZfaXJuZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKiwJLyogZnMgY2FsbGJhY2sgOiBvcGVuICovCisJCSAgICAgICBzdHJ1Y3QgZmlsZSAqKSwKKwlkZXZfaXJuZXRfY2xvc2Uoc3RydWN0IGlub2RlICosCisJCQlzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBzc2l6ZV90CisJZGV2X2lybmV0X3dyaXRlKHN0cnVjdCBmaWxlICosCisJCQljb25zdCBjaGFyIF9fdXNlciAqLAorCQkJc2l6ZV90LAorCQkJbG9mZl90ICopLAorCWRldl9pcm5ldF9yZWFkKHN0cnVjdCBmaWxlICosCisJCSAgICAgICBjaGFyIF9fdXNlciAqLAorCQkgICAgICAgc2l6ZV90LAorCQkgICAgICAgbG9mZl90ICopOworc3RhdGljIHVuc2lnbmVkIGludAorCWRldl9pcm5ldF9wb2xsKHN0cnVjdCBmaWxlICosCisJCSAgICAgICBwb2xsX3RhYmxlICopOworc3RhdGljIGludAorCWRldl9pcm5ldF9pb2N0bChzdHJ1Y3QgaW5vZGUgKiwKKwkJCXN0cnVjdCBmaWxlICosCisJCQl1bnNpZ25lZCBpbnQsCisJCQl1bnNpZ25lZCBsb25nKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQUFAgSU5URVJGQUNFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCisJaXJuZXRfcHJlcGFyZV9za2IoaXJuZXRfc29ja2V0ICosCisJCQkgIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludAorCXBwcF9pcm5ldF9zZW5kKHN0cnVjdCBwcHBfY2hhbm5lbCAqLAorCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyBpbnQKKwlwcHBfaXJuZXRfaW9jdGwoc3RydWN0IHBwcF9jaGFubmVsICosCisJCQl1bnNpZ25lZCBpbnQsCisJCQl1bnNpZ25lZCBsb25nKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogVkFSSUFCTEVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZpbGVzeXN0ZW0gY2FsbGJhY2tzICh0byBjYWxsIHVzKSAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXJuZXRfZGV2aWNlX2ZvcHMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBkZXZfaXJuZXRfcmVhZCwKKwkud3JpdGUJCT0gZGV2X2lybmV0X3dyaXRlLAorCS5wb2xsCQk9IGRldl9pcm5ldF9wb2xsLAorCS5pb2N0bAkJPSBkZXZfaXJuZXRfaW9jdGwsCisJLm9wZW4JCT0gZGV2X2lybmV0X29wZW4sCisJLnJlbGVhc2UJPSBkZXZfaXJuZXRfY2xvc2UKKyAgLyogQWxzbyA6IGxsc2VlaywgcmVhZGRpciwgbW1hcCwgZmx1c2gsIGZzeW5jLCBmYXN5bmMsIGxvY2ssIHJlYWR2LCB3cml0ZXYgKi8KK307CisKKy8qIFN0cnVjdHVyZSBzbyB0aGF0IHRoZSBtaXNjIG1ham9yIChkcml2ZXJzL2NoYXIvbWlzYy5jKSB0YWtlIGNhcmUgb2YgdXMuLi4gKi8KK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBpcm5ldF9taXNjX2RldmljZSA9Cit7CisJSVJORVRfTUlOT1IsCisJImlybmV0IiwKKwkmaXJuZXRfZGV2aWNlX2ZvcHMKK307CisKKyNlbmRpZiAvKiBJUk5FVF9QUFBfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJwcm9jLmMgYi9uZXQvaXJkYS9pcnByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGI5YzQzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJwcm9jLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJwcm9jLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgVmFyaW91cyBlbnRyaWVzIGluIHRoZSAvcHJvYyBmaWxlIHN5c3RlbQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgVGhvbWFzIERhdmlzLCA8cmF0YmVydEByYWRpa3MubmV0PgorICogQ3JlYXRlZCBhdDogICAgU2F0IEZlYiAyMSAyMTozMzoyNCAxOTk4CisgKiBNb2RpZmllZCBhdDogICBTdW4gTm92IDE0IDA4OjU0OjU0IDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTksIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIFRob21hcyBEYXZpcywgPHJhdGJlcnRAcmFkaWtzLm5ldD4sIAorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgSSwgVGhvbWFzIERhdmlzLCBwcm92aWRlIG5vIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gCisgKiAgICAgVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuIAorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRpc2NvdmVyeV9zZXFfZm9wczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlybGFwX3NlcV9mb3BzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXJsbXBfc2VxX2ZvcHM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcnR0cF9zZXFfZm9wczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlyaWFzX3NlcV9mb3BzOworCitzdHJ1Y3QgaXJkYV9lbnRyeSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzOworfTsKKworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2lyZGE7CitFWFBPUlRfU1lNQk9MKHByb2NfaXJkYSk7CisgCitzdGF0aWMgc3RydWN0IGlyZGFfZW50cnkgaXJkYV9kaXJzW10gPSB7CisJeyJkaXNjb3ZlcnkiLAkmZGlzY292ZXJ5X3NlcV9mb3BzfSwKKwl7ImlydHRwIiwJJmlydHRwX3NlcV9mb3BzfSwKKwl7ImlybG1wIiwJJmlybG1wX3NlcV9mb3BzfSwKKwl7ImlybGFwIiwJJmlybGFwX3NlcV9mb3BzfSwKKwl7ImlyaWFzIiwJJmlyaWFzX3NlcV9mb3BzfSwKK307CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3Byb2NfcmVnaXN0ZXIgKHZvaWQpCisgKgorICogICAgUmVnaXN0ZXIgaXJkYSBlbnRyeSBpbiAvcHJvYyBmaWxlIHN5c3RlbQorICoKKyAqLwordm9pZCBfX2luaXQgaXJkYV9wcm9jX3JlZ2lzdGVyKHZvaWQpIAoreworCWludCBpOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZDsKKworCXByb2NfaXJkYSA9IHByb2NfbWtkaXIoImlyZGEiLCBwcm9jX25ldCk7CisJaWYgKHByb2NfaXJkYSA9PSBOVUxMKQorCQlyZXR1cm47CisJcHJvY19pcmRhLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJZm9yIChpPTA7IGk8QVJSQVlfU0laRShpcmRhX2RpcnMpOyBpKyspIHsKKwkJZCA9IGNyZWF0ZV9wcm9jX2VudHJ5KGlyZGFfZGlyc1tpXS5uYW1lLCAwLCBwcm9jX2lyZGEpOworCQlpZiAoZCkgCisJCQlkLT5wcm9jX2ZvcHMgPSBpcmRhX2RpcnNbaV0uZm9wczsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3Byb2NfdW5yZWdpc3RlciAodm9pZCkKKyAqCisgKiAgICBVbnJlZ2lzdGVyIGlyZGEgZW50cnkgaW4gL3Byb2MgZmlsZSBzeXN0ZW0KKyAqCisgKi8KK3ZvaWQgX19leGl0IGlyZGFfcHJvY191bnJlZ2lzdGVyKHZvaWQpIAoreworCWludCBpOworCisgICAgICAgIGlmIChwcm9jX2lyZGEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGlyZGFfZGlycyk7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KGlyZGFfZGlyc1tpXS5uYW1lLCBwcm9jX2lyZGEpOworCisgICAgICAgICAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoImlyZGEiLCBwcm9jX25ldCk7CisgICAgICAgICAgICAgICAgcHJvY19pcmRhID0gTlVMTDsKKyAgICAgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lycXVldWUuYyBiL25ldC9pcmRhL2lycXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGRkM2VhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJxdWV1ZS5jCkBAIC0wLDAgKzEsOTE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlycXVldWUuYworICogVmVyc2lvbjogICAgICAgMC4zCisgKiBEZXNjcmlwdGlvbjogICBHZW5lcmFsIHF1ZXVlIGltcGxlbWVudGF0aW9uCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBUdWUgSnVuICA5IDEzOjI5OjMxIDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBEZWMgMTIgMTM6NDg6MjIgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogTW9kaWZpZWQgYXQ6ICAgVGh1IEphbiAgNCAxNDoyOToxMCBDRVQgMjAwMQorICogTW9kaWZpZWQgYnk6ICAgTWFyYyBaeW5naWVyIDxtenluZ2llckBmcmVlc3VyZi5mcj4KKyAqIAorICogICAgIENvcHlyaWdodCAoQykgMTk5OC0xOTk5LCBBYWdlIEt2YWxuZXMgPGFhZ2VAY3MudWl0Lm5vPgorICogICAgIENvcHlyaWdodCAoQykgMTk5OCwgRGFnIEJyYXR0bGksIAorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICAgIFRoaXMgY29kZSBpcyB0YWtlbiBmcm9tIHRoZSBWb3J0ZXggT3BlcmF0aW5nIFN5c3RlbSB3cml0dGVuIGJ5IEFhZ2UKKyAqICAgICBLdmFsbmVzLiBBYWdlIGhhcyBhZ3JlZWQgdGhhdCB0aGlzIGNvZGUgY2FuIHVzZSB0aGUgR1BMIGxpY2VuY2UsCisgKiAgICAgYWx0aG91Z2ggaGUgZG9lcyBub3QgdXNlIHRoYXQgbGljZW5jZSBpbiBoaXMgb3duIGNvZGUuCisgKiAgICAgCisgKiAgICAgVGhpcyBjb3B5cmlnaHQgZG9lcyBob3dldmVyIF9ub3RfIGluY2x1ZGUgdGhlIEVMRiBoYXNoKCkgZnVuY3Rpb24KKyAqICAgICB3aGljaCBJIGN1cnJlbnRseSBkb24ndCBrbm93IHdoaWNoIGxpY2VuY2Ugb3IgY29weXJpZ2h0IGl0CisgKiAgICAgaGFzLiBQbGVhc2UgaW5mb3JtIG1lIGlmIHlvdSBrbm93LgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBOT1RFIDoKKyAqIFRoZXJlIGFyZSB2YXJpb3VzIHByb2JsZW1zIHdpdGggdGhpcyBwYWNrYWdlIDoKKyAqCW8gdGhlIGhhc2ggZnVuY3Rpb24gZm9yIGludHMgaXMgcGF0aGV0aWMgKGJ1dCBjb3VsZCBiZSBjaGFuZ2VkKQorICoJbyBsb2NraW5nIGlzIHNvbWV0aW1lIHN1c3BpY2lvdXMgKGVzcGVjaWFsbHkgZHVyaW5nIGVudW1lcmF0aW9uKQorICoJbyBtb3N0IHVzZXJzIGhhdmUgb25seSBhIGZldyBlbGVtZW50cyAoPT0gb3ZlcmhlYWQpCisgKglvIG1vc3QgdXNlcnMgbmV2ZXIgdXNlIHNlYWNoLCBzbyBkb24ndCBiZW5lZml0IGZyb20gaGFzaGluZworICogUHJvYmxlbSBhbHJlYWR5IGZpeGVkIDoKKyAqCW8gbm90IDY0IGJpdCBjb21wbGlhbnQgKG1vc3QgdXNlcnMgZG8gaGFzaHYgPSAoaW50KSBzZWxmKQorICoJbyBoYXNoYmluX3JlbW92ZSgpIGlzIGJyb2tlbiA9PiB1c2UgaGFzaGJpbl9yZW1vdmVfdGhpcygpCisgKiBJIHRoaW5rIG1vc3QgdXNlcnMgd291bGQgYmUgYmV0dGVyIHNlcnZlZCBieSBhIHNpbXBsZSBsaW5rZWQgbGlzdAorICogKGxpa2UgaW5jbHVkZS9saW51eC9saXN0LmgpIHdpdGggYSBnbG9iYWwgc3BpbmxvY2sgcGVyIGxpc3QuCisgKiBKZWFuIElJCisgKi8KKworLyoKKyAqIE5vdGVzIG9uIHRoZSBjb25jdXJyZW50IGFjY2VzcyB0byBoYXNoYmluIGFuZCBvdGhlciBTTVAgaXNzdWVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglIYXNoYmlucyBhcmUgdmVyeSBvZnRlbiBpbiB0aGUgSXJEQSBzdGFjayBhIGdsb2JhbCByZXBvc2l0b3J5IG9mCisgKiBpbmZvcm1hdGlvbiwgYW5kIHRoZXJlZm9yZSB1c2VkIGluIGEgdmVyeSBhc3luY2hyb25vdXMgbWFubmVyIGZvbGxvd2luZworICogdmFyaW91cyBldmVudHMgKGRyaXZlciBjYWxscywgdGltZXJzLCB1c2VyIGNhbGxzLi4uKS4KKyAqCVRoZXJlZm9yZSwgdmVyeSBvZnRlbiBpdCBpcyBoaWdobHkgaW1wb3J0YW50IHRvIGNvbnNpZGVyIHRoZQorICogbWFuYWdlbWVudCBvZiBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgaGFzaGJpbiBhbmQgaG93IHRvIGd1YXJhbnRlZSB0aGUKKyAqIGNvbnNpc3RlbmN5IG9mIHRoZSBvcGVyYXRpb25zIG9uIGl0LgorICoKKyAqCUZpcnN0LCB3ZSBuZWVkIHRvIGRlZmluZSB0aGUgb2JqZWN0aXZlIG9mIGxvY2tpbmcgOgorICoJCTEpIFByb3RlY3QgdXNlciBkYXRhIChjb250ZW50IHBvaW50ZWQgYnkgdGhlIGhhc2hiaW4pCisgKgkJMikgUHJvdGVjdCBoYXNoYmluIHN0cnVjdHVyZSBpdHNlbGYgKGxpbmtlZCBsaXN0IGluIGVhY2ggYmluKQorICoKKyAqCQkJICAgICBPTEQgTE9DS0lORworICoJCQkgICAgIC0tLS0tLS0tLS0tCisgKgorICoJVGhlIHByZXZpb3VzIGxvY2tpbmcgc3RyYXRlZ3ksIGVpdGhlciBIQl9MT0NBTCBvciBIQl9HTE9CQUwgd2VyZQorICogYm90aCBpbmFkZXF1YXRlIGluICpib3RoKiBhc3BlY3QuCisgKgkJbyBIQl9HTE9CQUwgd2FzIHVzaW5nIGEgc3BpbmxvY2sgZm9yIGVhY2ggYmluIChsb2NhbCBsb2NraW5nKS4KKyAqCQlvIEhCX0xPQ0FMIHdhcyBkaXNhYmxpbmcgaXJxIG9uICphbGwqIENQVXMsIHNvIHVzZSBhIHNpbmdsZQorICoJCSAgZ2xvYmFsIHNlbWFwaG9yZS4KKyAqCVRoZSBwcm9ibGVtcyB3ZXJlIDoKKyAqCQlBKSBHbG9iYWwgaXJxIGRpc2FibGluZyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwKKyAqCQlCKSBObyBwcm90ZWN0aW9uIGZvciB0aGUgaGFzaGJpbiBzdHJ1Y3QgZ2xvYmFsIGRhdGEKKyAqCQkJbyBoYXNoYmluX2RlbGV0ZSgpCisgKgkJCW8gaGJfY3VycmVudAorICoJCUMpIE5vIHByb3RlY3Rpb24gZm9yIHVzZXIgZGF0YSBpbiBzb21lIGNhc2VzCisgKgorICoJQSkgSEJfTE9DQUwgdXNlIGdsb2JhbCBpcnEgZGlzYWJsaW5nLCBzbyBkb2Vzbid0IHdvcmsgb24ga2VybmVsCisgKiAyLjUuWC4gRXZlbiB3aGVuIGl0IGlzIHN1cHBvcnRlZCAoa2VybmVsIDIuNC5YIGFuZCBlYXJsaWVyKSwgaXRzCisgKiBwZXJmb3JtYW5jZSBpcyBub3Qgc2F0aXNmYWN0b3J5IG9uIFNNUCBzZXR1cHMuIE1vc3QgaGFzaGJpbnMgd2VyZQorICogSEJfTE9DQUwsIHNvIChBKSBkZWZpbml0ZWx5IG5lZWQgZml4aW5nLgorICoJQikgSEJfTE9DQUwgY291bGQgYmUgbW9kaWZpZWQgdG8gZml4IChCKS4gSG93ZXZlciwgYmVjYXVzZSBIQl9HTE9CQUwKKyAqIGxvY2sgb25seSB0aGUgaW5kaXZpZHVhbCBiaW5zLCBpdCB3aWxsIG5ldmVyIGJlIGFibGUgdG8gbG9jayB0aGUKKyAqIGdsb2JhbCBkYXRhLCBzbyBjYW4ndCBkbyAoQikuCisgKglDKSBTb21lIGZ1bmN0aW9ucyByZXR1cm4gcG9pbnRlciB0byBkYXRhIHRoYXQgaXMgc3RpbGwgaW4gdGhlCisgKiBoYXNoYmluIDoKKyAqCQlvIGhhc2hiaW5fZmluZCgpCisgKgkJbyBoYXNoYmluX2dldF9maXJzdCgpCisgKgkJbyBoYXNoYmluX2dldF9uZXh0KCkKKyAqCUFzIHRoZSBkYXRhIGlzIHN0aWxsIGluIHRoZSBoYXNoYmluLCBpdCBtYXkgYmUgY2hhbmdlZCBvciBmcmVlJ2QKKyAqIHdoaWxlIHRoZSBjYWxsZXIgaXMgZXhhbWluaW1nIHRoZSBkYXRhLiBJbiB0aG9zZSBjYXNlLCBsb2NraW5nIGNhbid0CisgKiBiZSBkb25lIHdpdGhpbiB0aGUgaGFzaGJpbiwgYnV0IG11c3QgaW5jbHVkZSB1c2Ugb2YgdGhlIGRhdGEgd2l0aGluCisgKiB0aGUgY2FsbGVyLgorICoJVGhlIGNhbGxlciBjYW4gZWFzaWx5IGRvIHRoaXMgd2l0aCBIQl9MT0NBTCAoanVzdCBkaXNhYmxlIGlycXMpLgorICogSG93ZXZlciwgdGhpcyBpcyBpbXBvc3NpYmxlIHdpdGggSEJfR0xPQkFMIGJlY2F1c2UgdGhlIGNhbGxlciBoYXMgbm8KKyAqIHdheSB0byBrbm93IHRoZSBwcm9wZXIgYmluLCBzbyBkb24ndCBrbm93IHdoaWNoIHNwaW5sb2NrIHRvIHVzZS4KKyAqCisgKglRdWljayBzdW1tYXJ5IDogY2FuIG5vIGxvbmdlciB1c2UgSEJfTE9DQUwsIGFuZCBIQl9HTE9CQUwgaXMKKyAqIGZ1bmRhbWVudGFsbHkgYnJva2VuIGFuZCB3aWxsIG5ldmVyIHdvcmsuCisgKgorICoJCQkgICAgIE5FVyBMT0NLSU5HCisgKgkJCSAgICAgLS0tLS0tLS0tLS0KKyAqCisgKglUbyBmaXggdGhvc2UgcHJvYmxlbXMsIEkndmUgaW50cm9kdWNlIGEgZmV3IGNoYW5nZXMgaW4gdGhlCisgKiBoYXNoYmluIGxvY2tpbmcgOgorICoJCTEpIE5ldyBIQl9MT0NLIHNjaGVtZQorICoJCTIpIGhhc2hiaW4tPmhiX3NwaW5sb2NrCisgKgkJMykgTmV3IGhhc2hiaW4gdXNhZ2UgcG9saWN5CisgKgorICogSEJfTE9DSyA6CisgKiAtLS0tLS0tCisgKglIQl9MT0NLIGlzIGEgbG9ja2luZyBzY2hlbWUgaW50ZXJtZWRpYXRlIGJldHdlZW4gdGhlIG9sZCBIQl9MT0NBTAorICogYW5kIEhCX0dMT0JBTC4gSXQgdXNlcyBhIHNpbmdsZSBzcGlubG9jayB0byBwcm90ZWN0IHRoZSB3aG9sZSBjb250ZW50CisgKiBvZiB0aGUgaGFzaGJpbi4gQXMgaXQgaXMgYSBzaW5nbGUgc3BpbmxvY2ssIGl0IGNhbiBwcm90ZWN0IHRoZSBnbG9iYWwKKyAqIGRhdGEgb2YgdGhlIGhhc2hiaW4gYW5kIG5vdCBvbmx5IHRoZSBiaW5zIHRoZW1zZWx2ZXMuCisgKglIQl9MT0NLIGNhbiBvbmx5IHByb3RlY3Qgc29tZSBvZiB0aGUgaGFzaGJpbiBjYWxscywgc28gaXQgb25seSBsb2NrCisgKiBjYWxsIHRoYXQgY2FuIGJlIG1hZGUgMTAwJSBzYWZlIGFuZCBsZWF2ZSBvdGhlciBjYWxsIHVucHJvdGVjdGVkLgorICoJSEJfTE9DSyBpbiB0aGVvcnkgaXMgc2xvd2VyIHRoYW4gSEJfR0xPQkFMLCBidXQgYXMgdGhlIGhhc2hiaW4KKyAqIGNvbnRlbnQgaXMgYWx3YXlzIHNtYWxsIGNvbnRlbnRpb24gaXMgbm90IGhpZ2gsIHNvIGl0IGRvZXNuJ3QgbWF0dGVyCisgKiBtdWNoLiBIQl9MT0NLIGlzIHByb2JhYmx5IGZhc3RlciB0aGFuIEhCX0xPQ0FMLgorICoKKyAqIGhhc2hiaW4tPmhiX3NwaW5sb2NrIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglUaGUgc3BpbmxvY2sgdGhhdCBIQl9MT0NLIHVzZXMgaXMgYXZhaWxhYmxlIGZvciBjYWxsZXIsIHNvIHRoYXQKKyAqIHRoZSBjYWxsZXIgY2FuIHByb3RlY3QgdW5wcm90ZWN0ZWQgY2FsbHMgKHNlZSBiZWxvdykuCisgKglJZiB0aGUgY2FsbGVyIHdhbnQgdG8gZG8gZW50aXJlbHkgaXRzIG93biBsb2NraW5nIChIQl9OT0xPQ0spLCBoZQorICogY2FuIGRvIHNvIGFuZCBtYXkgdXNlIHNhZmVseSB0aGlzIHNwaW5sb2NrLgorICoJTG9ja2luZyBpcyBkb25lIGxpa2UgdGhpcyA6CisgKgkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisgKglSZWxlYXNpbmcgdGhlIGxvY2sgOgorICoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisgKgorICogU2FmZSAmIFByb3RlY3RlZCBjYWxscyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglUaGUgZm9sbG93aW5nIGNhbGxzIGFyZSBzYWZlIG9yIHByb3RlY3RlZCB2aWEgSEJfTE9DSyA6CisgKgkJbyBoYXNoYmluX25ldygpCQktPiBzYWZlCisgKgkJbyBoYXNoYmluX2RlbGV0ZSgpCisgKgkJbyBoYXNoYmluX2luc2VydCgpCisgKgkJbyBoYXNoYmluX3JlbW92ZV9maXJzdCgpCisgKgkJbyBoYXNoYmluX3JlbW92ZSgpCisgKgkJbyBoYXNoYmluX3JlbW92ZV90aGlzKCkKKyAqCQlvIEhBU0hCSU5fR0VUX1NJWkUoKQktPiBhdG9taWMKKyAqCisgKglUaGUgZm9sbG93aW5nIGNhbGxzIG9ubHkgcHJvdGVjdCB0aGUgaGFzaGJpbiBpdHNlbGYgOgorICoJCW8gaGFzaGJpbl9sb2NrX2ZpbmQoKQorICoJCW8gaGFzaGJpbl9maW5kX25leHQoKQorICoKKyAqIFVucHJvdGVjdGVkIGNhbGxzIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tCisgKglUaGUgZm9sbG93aW5nIGNhbGxzIG5lZWQgdG8gYmUgcHJvdGVjdGVkIGJ5IHRoZSBjYWxsZXIgOgorICoJCW8gaGFzaGJpbl9maW5kKCkKKyAqCQlvIGhhc2hiaW5fZ2V0X2ZpcnN0KCkKKyAqCQlvIGhhc2hiaW5fZ2V0X25leHQoKQorICoKKyAqIExvY2tpbmcgUG9saWN5IDoKKyAqIC0tLS0tLS0tLS0tLS0tCisgKglJZiB0aGUgaGFzaGJpbiBpcyB1c2VkIG9ubHkgaW4gYSBzaW5nbGUgdGhyZWFkIG9mIGV4ZWN1dGlvbgorICogKGV4cGxpY2l0bHkgb3IgaW1wbGljaXRlbHkpLCB5b3UgY2FuIHVzZSBIQl9OT0xPQ0sKKyAqCUlmIHRoZSBjYWxsaW5nIG1vZHVsZSBhbHJlYWR5IHByb3ZpZGUgY29uY3VycmVudCBhY2Nlc3MgcHJvdGVjdGlvbiwKKyAqIHlvdSBtYXkgdXNlIEhCX05PTE9DSy4KKyAqCisgKglJbiBhbGwgb3RoZXIgY2FzZXMsIHlvdSBuZWVkIHRvIHVzZSBIQl9MT0NLIGFuZCBsb2NrIHRoZSBoYXNoYmluCisgKiBldmVyeSB0aW1lIGJlZm9yZSBjYWxsaW5nIG9uZSBvZiB0aGUgdW5wcm90ZWN0ZWQgY2FsbHMuIFlvdSBhbHNvIG11c3QKKyAqIHVzZSB0aGUgcG9pbnRlciByZXR1cm5lZCBieSB0aGUgdW5wcm90ZWN0ZWQgY2FsbCB3aXRoaW4gdGhlIGxvY2tlZAorICogcmVnaW9uLgorICoKKyAqIEV4dHJhIGNhcmUgZm9yIGVudW1lcmF0aW9uIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgloYXNoYmluX2dldF9maXJzdCgpIGFuZCBoYXNoYmluX2dldF9uZXh0KCkgdXNlIHRoZSBoYXNoYmluIHRvCisgKiBzdG9yZSB0aGUgY3VycmVudCBwb3NpdGlvbiwgaW4gaGJfY3VycmVudC4KKyAqCUFzIGxvbmcgYXMgdGhlIGhhc2hiaW4gcmVtYWlucyBsb2NrZWQsIHRoaXMgaXMgc2FmZS4gSWYgeW91IHVubG9jaworICogdGhlIGhhc2hiaW4sIHRoZSBjdXJyZW50IHBvc2l0aW9uIG1heSBjaGFuZ2UgaWYgYW55Ym9keSBlbHNlIG1vZGlmeQorICogb3IgZW51bWVyYXRlIHRoZSBoYXNoYmluLgorICoJU3VtbWFyeSA6IGRvIHRoZSBmdWxsIGVudW1lcmF0aW9uIHdoaWxlIGxvY2tlZC4KKyAqCisgKglBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IHVzZSBoYXNoYmluX2ZpbmRfbmV4dCgpLiBCdXQsIHRoaXMgd2lsbAorICogYmUgc2xvd2VyLCBpcyBtb3JlIGNvbXBsZXggdG8gdXNlIGFuZCBkb2Vzbid0IHByb3RlY3QgdGhlIGhhc2hiaW4KKyAqIGNvbnRlbnQuIFNvLCBjYXJlIGlzIG5lZWRlZCBoZXJlIGFzIHdlbGwuCisgKgorICogT3RoZXIgaXNzdWVzIDoKKyAqIC0tLS0tLS0tLS0tLQorICoJSSBiZWxpZXZlIHRoYXQgd2UgYXJlIG92ZXJkb2luZyBpdCBieSB1c2luZyBzcGluX2xvY2tfaXJxc2F2ZSgpCisgKiBhbmQgd2Ugc2hvdWxkIHVzZSBvbmx5IHNwaW5fbG9ja19iaCgpIG9yIHNpbWlsYXIuIEJ1dCwgSSBkb24ndCBoYXZlCisgKiB0aGUgYmFsbHMgdG8gdHJ5IGl0IG91dC4KKyAqCURvbid0IGJlbGlldmUgdGhhdCBiZWNhdXNlIGhhc2hiaW4gYXJlIG5vdyAoc29tZXdoYXQpIFNNUCBzYWZlCisgKiB0aGF0IHRoZSByZXN0IG9mIHRoZSBjb2RlIGlzLiBIaWdoZXIgbGF5ZXJzIHRlbmQgdG8gYmUgc2FmZXN0LAorICogYnV0IExBUCBhbmQgTE1QIHdvdWxkIG5lZWQgc29tZSBzZXJpb3VzIGRlZGljYXRlZCBsb3ZlLgorICoKKyAqIEplYW4gSUkKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lycXVldWUuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBRVUVVRSBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIYXNoYmluCisgKi8KKyNkZWZpbmUgR0VUX0hBU0hCSU4oeCkgKCB4ICYgSEFTSEJJTl9NQVNLICkKKworLyoKKyAqIEZ1bmN0aW9uIGhhc2ggKG5hbWUpCisgKgorICogICAgVGhpcyBmdW5jdGlvbiBoYXNoIHRoZSBpbnB1dCBzdHJpbmcgJ25hbWUnIHVzaW5nIHRoZSBFTEYgaGFzaAorICogICAgZnVuY3Rpb24gZm9yIHN0cmluZ3MuCisgKi8KK3N0YXRpYyBfX3UzMiBoYXNoKCBjb25zdCBjaGFyKiBuYW1lKQoreworCV9fdTMyIGggPSAwOworCV9fdTMyIGc7CisJCisJd2hpbGUoKm5hbWUpIHsKKwkJaCA9IChoPDw0KSArICpuYW1lKys7CisJCWlmICgoZyA9IChoICYgMHhmMDAwMDAwMCkpKQorCQkJaCBePWc+PjI0OworCQloICY9fmc7CisJfQorCXJldHVybiBoOworfQorCisvKgorICogRnVuY3Rpb24gZW5xdWV1ZV9maXJzdCAocXVldWUsIHByb2MpCisgKgorICogICAgSW5zZXJ0IGl0ZW0gZmlyc3QgaW4gcXVldWUuCisgKgorICovCitzdGF0aWMgdm9pZCBlbnF1ZXVlX2ZpcnN0KGlyZGFfcXVldWVfdCAqKnF1ZXVlLCBpcmRhX3F1ZXVlX3QqIGVsZW1lbnQpCit7CisJCisJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKgorCSAqIENoZWNrIGlmIHF1ZXVlIGlzIGVtcHR5LgorCSAqLworCWlmICggKnF1ZXVlID09IE5VTEwgKSB7CisJCS8qCisJCSAqIFF1ZXVlIGlzIGVtcHR5LiAgSW5zZXJ0IG9uZSBlbGVtZW50IGludG8gdGhlIHF1ZXVlLgorCQkgKi8KKwkJZWxlbWVudC0+cV9uZXh0ID0gZWxlbWVudC0+cV9wcmV2ID0gKnF1ZXVlID0gZWxlbWVudDsKKwkJCisJfSBlbHNlIHsKKwkJLyoKKwkJICogUXVldWUgaXMgbm90IGVtcHR5LiAgSW5zZXJ0IGVsZW1lbnQgaW50byBmcm9udCBvZiBxdWV1ZS4KKwkJICovCisJCWVsZW1lbnQtPnFfbmV4dCAgICAgICAgICA9ICgqcXVldWUpOworCQkoKnF1ZXVlKS0+cV9wcmV2LT5xX25leHQgPSBlbGVtZW50OworCQllbGVtZW50LT5xX3ByZXYgICAgICAgICAgPSAoKnF1ZXVlKS0+cV9wcmV2OworCQkoKnF1ZXVlKS0+cV9wcmV2ICAgICAgICAgPSBlbGVtZW50OworCQkoKnF1ZXVlKSAgICAgICAgICAgICAgICAgPSBlbGVtZW50OworCX0KK30KKworCisvKgorICogRnVuY3Rpb24gZGVxdWV1ZSAocXVldWUpCisgKgorICogICAgUmVtb3ZlIGZpcnN0IGVudHJ5IGluIHF1ZXVlCisgKgorICovCitzdGF0aWMgaXJkYV9xdWV1ZV90ICpkZXF1ZXVlX2ZpcnN0KGlyZGFfcXVldWVfdCAqKnF1ZXVlKQoreworCWlyZGFfcXVldWVfdCAqcmV0OworCisJSVJEQV9ERUJVRyggNCwgImRlcXVldWVfZmlyc3QoKVxuIik7CisJCisJLyoKKwkgKiBTZXQgcmV0dXJuIHZhbHVlCisJICovCisJcmV0ID0gICpxdWV1ZTsKKwkKKwlpZiAoICpxdWV1ZSA9PSBOVUxMICkgeworCQkvKgorCQkgKiBRdWV1ZSB3YXMgZW1wdHkuCisJCSAqLworCX0gZWxzZSBpZiAoICgqcXVldWUpLT5xX25leHQgPT0gKnF1ZXVlICkgeworCQkvKiAKKwkJICogIFF1ZXVlIG9ubHkgY29udGFpbmVkIGEgc2luZ2xlIGVsZW1lbnQuIEl0IHdpbGwgbm93IGJlCisJCSAqICBlbXB0eS4gIAorCQkgKi8KKwkJKnF1ZXVlID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBRdWV1ZSBjb250YWluZWQgc2V2ZXJhbCBlbGVtZW50LiAgUmVtb3ZlIHRoZSBmaXJzdCBvbmUuCisJCSAqLworCQkoKnF1ZXVlKS0+cV9wcmV2LT5xX25leHQgPSAoKnF1ZXVlKS0+cV9uZXh0OworCQkoKnF1ZXVlKS0+cV9uZXh0LT5xX3ByZXYgPSAoKnF1ZXVlKS0+cV9wcmV2OworCQkqcXVldWUgPSAoKnF1ZXVlKS0+cV9uZXh0OworCX0KKwkKKwkvKgorCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBlbnRyeSAob3IgTlVMTCBvZiBxdWV1ZSB3YXMgZW1wdHkpLgorCSAqLworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBkZXF1ZXVlX2dlbmVyYWwgKHF1ZXVlLCBlbGVtZW50KQorICoKKyAqCisgKi8KK3N0YXRpYyBpcmRhX3F1ZXVlX3QgKmRlcXVldWVfZ2VuZXJhbChpcmRhX3F1ZXVlX3QgKipxdWV1ZSwgaXJkYV9xdWV1ZV90KiBlbGVtZW50KQoreworCWlyZGFfcXVldWVfdCAqcmV0OworCQorCUlSREFfREVCVUcoIDQsICJkZXF1ZXVlX2dlbmVyYWwoKVxuIik7CisJCisJLyoKKwkgKiBTZXQgcmV0dXJuIHZhbHVlCisJICovCisJcmV0ID0gICpxdWV1ZTsKKwkJCisJaWYgKCAqcXVldWUgPT0gTlVMTCApIHsKKwkJLyoKKwkJICogUXVldWUgd2FzIGVtcHR5LgorCQkgKi8KKwl9IGVsc2UgaWYgKCAoKnF1ZXVlKS0+cV9uZXh0ID09ICpxdWV1ZSApIHsKKwkJLyogCisJCSAqICBRdWV1ZSBvbmx5IGNvbnRhaW5lZCBhIHNpbmdsZSBlbGVtZW50LiBJdCB3aWxsIG5vdyBiZQorCQkgKiAgZW1wdHkuICAKKwkJICovCisJCSpxdWV1ZSA9IE5VTEw7CisJCQorCX0gZWxzZSB7CisJCS8qCisJCSAqICBSZW1vdmUgc3BlY2lmaWMgZWxlbWVudC4KKwkJICovCisJCWVsZW1lbnQtPnFfcHJldi0+cV9uZXh0ID0gZWxlbWVudC0+cV9uZXh0OworCQllbGVtZW50LT5xX25leHQtPnFfcHJldiA9IGVsZW1lbnQtPnFfcHJldjsKKwkJaWYgKCAoKnF1ZXVlKSA9PSBlbGVtZW50KQorCQkJKCpxdWV1ZSkgPSBlbGVtZW50LT5xX25leHQ7CisJfQorCQorCS8qCisJICogUmV0dXJuIHRoZSByZW1vdmVkIGVudHJ5IChvciBOVUxMIG9mIHF1ZXVlIHdhcyBlbXB0eSkuCisJICovCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBIQVNIQklOIE1BTkFHRU1FTlQgKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRnVuY3Rpb24gaGFzaGJpbl9jcmVhdGUgKCB0eXBlLCBuYW1lICkKKyAqCisgKiAgICBDcmVhdGUgaGFzaGJpbiEKKyAqCisgKi8KK2hhc2hiaW5fdCAqaGFzaGJpbl9uZXcoaW50IHR5cGUpCit7CisJaGFzaGJpbl90KiBoYXNoYmluOworCQorCS8qCisJICogQWxsb2NhdGUgbmV3IGhhc2hiaW4KKwkgKi8KKwloYXNoYmluID0ga21hbGxvYyggc2l6ZW9mKGhhc2hiaW5fdCksIEdGUF9BVE9NSUMpOworCWlmICghaGFzaGJpbikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIEluaXRpYWxpemUgc3RydWN0dXJlCisJICovCisJbWVtc2V0KGhhc2hiaW4sIDAsIHNpemVvZihoYXNoYmluX3QpKTsKKwloYXNoYmluLT5oYl90eXBlID0gdHlwZTsKKwloYXNoYmluLT5tYWdpYyA9IEhCX01BR0lDOworCS8vaGFzaGJpbi0+aGJfY3VycmVudCA9IE5VTEw7CisKKwkvKiBNYWtlIHN1cmUgYWxsIHNwaW5sb2NrJ3MgYXJlIHVubG9ja2VkICovCisJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKKwkJc3Bpbl9sb2NrX2luaXQoJmhhc2hiaW4tPmhiX3NwaW5sb2NrKTsKKwl9CisKKwlyZXR1cm4gaGFzaGJpbjsKK30KK0VYUE9SVF9TWU1CT0woaGFzaGJpbl9uZXcpOworCisKKy8qCisgKiBGdW5jdGlvbiBoYXNoYmluX2RlbGV0ZSAoaGFzaGJpbiwgZnJlZV9mdW5jKQorICoKKyAqICAgIERlc3Ryb3kgaGFzaGJpbiwgdGhlIGZyZWVfZnVuYyBjYW4gYmUgYSB1c2VyIHN1cHBsaWVkIHNwZWNpYWwgcm91dGluZSAKKyAqICAgIGZvciBkZWFsbG9jYXRpbmcgdGhpcyBzdHJ1Y3R1cmUgaWYgaXQncyBjb21wbGV4LiBJZiBub3QgdGhlIHVzZXIgY2FuIAorICogICAganVzdCBzdXBwbHkga2ZyZWUsIHdoaWNoIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhlIGpvYi4KKyAqLworaW50IGhhc2hiaW5fZGVsZXRlKCBoYXNoYmluX3QqIGhhc2hiaW4sIEZSRUVfRlVOQyBmcmVlX2Z1bmMpCit7CisJaXJkYV9xdWV1ZV90KiBxdWV1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQgaTsKKworCUlSREFfQVNTRVJUKGhhc2hiaW4gIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiAtMTspOworCQorCS8qIFN5bmNocm9uaXplICovCisJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfQorCisJLyoKKwkgKiAgRnJlZSB0aGUgZW50cmllcyBpbiB0aGUgaGFzaGJpbiwgVE9ETzogdXNlIGhhc2hiaW5fY2xlYXIgd2hlbgorCSAqICBpdCBoYXMgYmVlbiBzaG93biB0byB3b3JrCisJICovCisJZm9yIChpID0gMDsgaSA8IEhBU0hCSU5fU0laRTsgaSArKyApIHsKKwkJcXVldWUgPSBkZXF1ZXVlX2ZpcnN0KChpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlW2ldKTsKKwkJd2hpbGUgKHF1ZXVlICkgeworCQkJaWYgKGZyZWVfZnVuYykKKwkJCQkoKmZyZWVfZnVuYykocXVldWUpOworCQkJcXVldWUgPSBkZXF1ZXVlX2ZpcnN0KCAKKwkJCQkoaXJkYV9xdWV1ZV90KiopICZoYXNoYmluLT5oYl9xdWV1ZVtpXSk7CisJCX0KKwl9CisJCisJLyogQ2xlYW51cCBsb2NhbCBkYXRhICovCisJaGFzaGJpbi0+aGJfY3VycmVudCA9IE5VTEw7CisJaGFzaGJpbi0+bWFnaWMgPSB+SEJfTUFHSUM7CisKKwkvKiBSZWxlYXNlIGxvY2sgKi8KKwlpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfQorCisJLyoKKwkgKiAgRnJlZSB0aGUgaGFzaGJpbiBzdHJ1Y3R1cmUKKwkgKi8KKwlrZnJlZShoYXNoYmluKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoYXNoYmluX2RlbGV0ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKiogSEFTSEJJTiBMSVNUIE9QRVJBVElPTlMgKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRnVuY3Rpb24gaGFzaGJpbl9pbnNlcnQgKGhhc2hiaW4sIGVudHJ5LCBuYW1lKQorICoKKyAqICAgIEluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSBoYXNoYmluCisgKgorICovCit2b2lkIGhhc2hiaW5faW5zZXJ0KGhhc2hiaW5fdCogaGFzaGJpbiwgaXJkYV9xdWV1ZV90KiBlbnRyeSwgbG9uZyBoYXNodiwgCisJCSAgICBjb25zdCBjaGFyKiBuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCBiaW47CisKKwlJUkRBX0RFQlVHKCA0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuOyk7CisKKwkvKgorCSAqIExvY2F0ZSBoYXNoYmluCisJICovCisJaWYgKCBuYW1lICkKKwkJaGFzaHYgPSBoYXNoKCBuYW1lICk7CisJYmluID0gR0VUX0hBU0hCSU4oIGhhc2h2ICk7CisKKwkvKiBTeW5jaHJvbml6ZSAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLworCQorCS8qCisJICogU3RvcmUgbmFtZSBhbmQga2V5CisJICovCisJZW50cnktPnFfaGFzaCA9IGhhc2h2OworCWlmICggbmFtZSApCisJCXN0cmxjcHkoIGVudHJ5LT5xX25hbWUsIG5hbWUsIHNpemVvZihlbnRyeS0+cV9uYW1lKSk7CisJCisJLyoKKwkgKiBJbnNlcnQgbmV3IGVudHJ5IGZpcnN0CisJICovCisJZW5xdWV1ZV9maXJzdCggKGlyZGFfcXVldWVfdCoqKSAmaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdLAorCQkgICAgICAgZW50cnkpOworCWhhc2hiaW4tPmhiX3NpemUrKzsKKworCS8qIFJlbGVhc2UgbG9jayAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCit9CitFWFBPUlRfU1lNQk9MKGhhc2hiaW5faW5zZXJ0KTsKKworLyogCisgKiAgRnVuY3Rpb24gaGFzaGJpbl9yZW1vdmVfZmlyc3QgKGhhc2hiaW4pCisgKgorICogICAgUmVtb3ZlIGZpcnN0IGVudHJ5IG9mIHRoZSBoYXNoYmluCisgKgorICogTm90ZSA6IHRoaXMgZnVuY3Rpb24gbm8gbG9uZ2VyIHVzZSBoYXNoYmluX3JlbW92ZSgpLCBidXQgZG9lcyB0aGluZ3MKKyAqIHNpbWlsYXIgdG8gaGFzaGJpbl9yZW1vdmVfdGhpcygpLCBzbyBjYW4gYmUgY29uc2lkZXJlZCBzYWZlLgorICogSmVhbiBJSQorICovCit2b2lkICpoYXNoYmluX3JlbW92ZV9maXJzdCggaGFzaGJpbl90ICpoYXNoYmluKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWlyZGFfcXVldWVfdCAqZW50cnkgPSBOVUxMOworCisJLyogU3luY2hyb25pemUgKi8KKwlpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KKworCWVudHJ5ID0gaGFzaGJpbl9nZXRfZmlyc3QoIGhhc2hiaW4pOworCWlmICggZW50cnkgIT0gTlVMTCkgeworCQlpbnQJYmluOworCQlsb25nCWhhc2h2OworCQkvKgorCQkgKiBMb2NhdGUgaGFzaGJpbgorCQkgKi8KKwkJaGFzaHYgPSBlbnRyeS0+cV9oYXNoOworCQliaW4gPSBHRVRfSEFTSEJJTiggaGFzaHYgKTsKKworCQkvKgorCQkgKiBEZXF1ZXVlIHRoZSBlbnRyeS4uLgorCQkgKi8KKwkJZGVxdWV1ZV9nZW5lcmFsKCAoaXJkYV9xdWV1ZV90KiopICZoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0sCisJCQkJIChpcmRhX3F1ZXVlX3QqKSBlbnRyeSApOworCQloYXNoYmluLT5oYl9zaXplLS07CisJCWVudHJ5LT5xX25leHQgPSBOVUxMOworCQllbnRyeS0+cV9wcmV2ID0gTlVMTDsKKworCQkvKgorCQkgKiAgQ2hlY2sgaWYgdGhpcyBpdGVtIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgYW5kIGluCisJCSAqICB0aGF0IGNhc2Ugd2UgbXVzdCByZXNldCBoYl9jdXJyZW50CisJCSAqLworCQlpZiAoIGVudHJ5ID09IGhhc2hiaW4tPmhiX2N1cnJlbnQpCisJCQloYXNoYmluLT5oYl9jdXJyZW50ID0gTlVMTDsKKwl9CisKKwkvKiBSZWxlYXNlIGxvY2sgKi8KKwlpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLworCisJcmV0dXJuIGVudHJ5OworfQorCisKKy8qIAorICogIEZ1bmN0aW9uIGhhc2hiaW5fcmVtb3ZlIChoYXNoYmluLCBoYXNodiwgbmFtZSkKKyAqCisgKiAgICBSZW1vdmUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICoKKyAqICBUaGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgaGlnaGx5IGRpc2NvdXJhZ2VkLCBiZWNhdXNlIHRoZSB3aG9sZQorICogIGNvbmNlcHQgYmVoaW5kIGhhc2hiaW5fcmVtb3ZlKCkgaXMgYnJva2VuLiBJbiBtYW55IGNhc2VzLCBpdCdzIG5vdAorICogIHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgdW5pY2l0eSBvZiB0aGUgaW5kZXggKGVpdGhlciBoYXNodiBvciBuYW1lKSwKKyAqICBsZWFkaW5nIHRvIHJlbW92aW5nIHRoZSBXUk9ORyBlbnRyeS4KKyAqICBUaGUgb25seSBzaW1wbGUgc2FmZSB1c2UgaXMgOgorICoJCWhhc2hiaW5fcmVtb3ZlKGhhc2JpbiwgKGludCkgc2VsZiwgTlVMTCk7CisgKiAgSW4gb3RoZXIgY2FzZSwgeW91IG11c3QgdGhpbmsgaGFyZCB0byBndWFyYW50ZWUgdW5pY2l0eSBvZiB0aGUgaW5kZXguCisgKiAgSmVhbiBJSQorICovCit2b2lkKiBoYXNoYmluX3JlbW92ZSggaGFzaGJpbl90KiBoYXNoYmluLCBsb25nIGhhc2h2LCBjb25zdCBjaGFyKiBuYW1lKQoreworCWludCBiaW4sIGZvdW5kID0gRkFMU0U7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaXJkYV9xdWV1ZV90KiBlbnRyeTsKKworCUlSREFfREVCVUcoIDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoIGhhc2hiaW4gIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKwlJUkRBX0FTU0VSVCggaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiBOVUxMOyk7CisJCisJLyoKKwkgKiBMb2NhdGUgaGFzaGJpbgorCSAqLworCWlmICggbmFtZSApCisJCWhhc2h2ID0gaGFzaCggbmFtZSApOworCWJpbiA9IEdFVF9IQVNIQklOKCBoYXNodiApOworCisJLyogU3luY2hyb25pemUgKi8KKwlpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KKworCS8qCisJICogU2VhcmNoIGZvciBlbnRyeQorCSAqLworCWVudHJ5ID0gaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdOworCWlmICggZW50cnkgKSB7CisJCWRvIHsKKwkJCS8qCisJCQkgKiBDaGVjayBmb3Iga2V5CisJCQkgKi8KKwkJCWlmICggZW50cnktPnFfaGFzaCA9PSBoYXNodiApIHsKKwkJCQkvKgorCQkJCSAqIE5hbWUgY29tcGFyZSB0b28/CisJCQkJICovCisJCQkJaWYgKCBuYW1lICkgeworCQkJCQlpZiAoIHN0cmNtcCggZW50cnktPnFfbmFtZSwgbmFtZSkgPT0gMCkKKwkJCQkJeworCQkJCQkJZm91bmQgPSBUUlVFOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlmb3VuZCA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWVudHJ5ID0gZW50cnktPnFfbmV4dDsKKwkJfSB3aGlsZSAoIGVudHJ5ICE9IGhhc2hiaW4tPmhiX3F1ZXVlWyBiaW4gXSApOworCX0KKwkKKwkvKgorCSAqIElmIGVudHJ5IHdhcyBmb3VuZCwgZGVxdWV1ZSBpdAorCSAqLworCWlmICggZm91bmQgKSB7CisJCWRlcXVldWVfZ2VuZXJhbCggKGlyZGFfcXVldWVfdCoqKSAmaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdLAorCQkJCSAoaXJkYV9xdWV1ZV90KikgZW50cnkgKTsKKwkJaGFzaGJpbi0+aGJfc2l6ZS0tOworCisJCS8qCisJCSAqICBDaGVjayBpZiB0aGlzIGl0ZW0gaXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLCBhbmQgaW4KKwkJICogIHRoYXQgY2FzZSB3ZSBtdXN0IHJlc2V0IGhiX2N1cnJlbnQKKwkJICovCisJCWlmICggZW50cnkgPT0gaGFzaGJpbi0+aGJfY3VycmVudCkKKwkJCWhhc2hiaW4tPmhiX2N1cnJlbnQgPSBOVUxMOworCX0KKworCS8qIFJlbGVhc2UgbG9jayAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCisgICAgICAgCisJCisJLyogUmV0dXJuICovCisJaWYgKCBmb3VuZCApIAorCQlyZXR1cm4gZW50cnk7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKwkKK30KK0VYUE9SVF9TWU1CT0woaGFzaGJpbl9yZW1vdmUpOworCisvKiAKKyAqICBGdW5jdGlvbiBoYXNoYmluX3JlbW92ZV90aGlzIChoYXNoYmluLCBlbnRyeSkKKyAqCisgKiAgICBSZW1vdmUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICoKKyAqIEluIHNvbWUgY2FzZXMsIHRoZSB1c2VyIG9mIGhhc2hiaW4gY2FuJ3QgZ3VhcmFudGVlIHRoZSB1bmljaXR5CisgKiBvZiBlaXRoZXIgdGhlIGhhc2h2IG9yIG5hbWUuCisgKiBJbiB0aG9zZSBjYXNlcywgdXNpbmcgdGhlIGFib3ZlIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gY2F1c2UgdHJvdWJsZXMsCisgKiBzbyB3ZSB1c2UgdGhpcyBvbmUgaW5zdGVhZC4uLgorICogQW5kIGJ5IHRoZSB3YXksIGl0J3MgYWxzbyBmYXN0ZXIsIGJlY2F1c2Ugd2Ugc2tpcCB0aGUgc2VhcmNoIHBoYXNlIDstKQorICovCit2b2lkKiBoYXNoYmluX3JlbW92ZV90aGlzKCBoYXNoYmluX3QqIGhhc2hiaW4sIGlyZGFfcXVldWVfdCogZW50cnkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50CWJpbjsKKwlsb25nCWhhc2h2OworCisJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVCggaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIE5VTEw7KTsKKwlJUkRBX0FTU0VSVCggZW50cnkgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKwkKKwkvKiBTeW5jaHJvbml6ZSAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLworCisJLyogQ2hlY2sgaWYgdmFsaWQgYW5kIG5vdCBhbHJlYWR5IHJlbW92ZWQuLi4gKi8KKwlpZigoZW50cnktPnFfbmV4dCA9PSBOVUxMKSB8fCAoZW50cnktPnFfcHJldiA9PSBOVUxMKSkgeworCQllbnRyeSA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogTG9jYXRlIGhhc2hiaW4KKwkgKi8KKwloYXNodiA9IGVudHJ5LT5xX2hhc2g7CisJYmluID0gR0VUX0hBU0hCSU4oIGhhc2h2ICk7CisKKwkvKgorCSAqIERlcXVldWUgdGhlIGVudHJ5Li4uCisJICovCisJZGVxdWV1ZV9nZW5lcmFsKCAoaXJkYV9xdWV1ZV90KiopICZoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0sCisJCQkgKGlyZGFfcXVldWVfdCopIGVudHJ5ICk7CisJaGFzaGJpbi0+aGJfc2l6ZS0tOworCWVudHJ5LT5xX25leHQgPSBOVUxMOworCWVudHJ5LT5xX3ByZXYgPSBOVUxMOworCisJLyoKKwkgKiAgQ2hlY2sgaWYgdGhpcyBpdGVtIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgYW5kIGluCisJICogIHRoYXQgY2FzZSB3ZSBtdXN0IHJlc2V0IGhiX2N1cnJlbnQKKwkgKi8KKwlpZiAoIGVudHJ5ID09IGhhc2hiaW4tPmhiX2N1cnJlbnQpCisJCWhhc2hiaW4tPmhiX2N1cnJlbnQgPSBOVUxMOworb3V0OgorCS8qIFJlbGVhc2UgbG9jayAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCisKKwlyZXR1cm4gZW50cnk7Cit9CitFWFBPUlRfU1lNQk9MKGhhc2hiaW5fcmVtb3ZlX3RoaXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKiogSEFTSEJJTiBFTlVNRVJBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZ1bmN0aW9uIGhhc2hiaW5fY29tbW9uX2ZpbmQgKGhhc2hiaW4sIGhhc2h2LCBuYW1lKQorICoKKyAqICAgIEZpbmQgaXRlbSB3aXRoIHRoZSBnaXZlbiBoYXNodiBvciBuYW1lCisgKgorICovCit2b2lkKiBoYXNoYmluX2ZpbmQoIGhhc2hiaW5fdCogaGFzaGJpbiwgbG9uZyBoYXNodiwgY29uc3QgY2hhciogbmFtZSApCit7CisJaW50IGJpbjsKKwlpcmRhX3F1ZXVlX3QqIGVudHJ5OworCisJSVJEQV9ERUJVRyggNCwgImhhc2hiaW5fZmluZCgpXG4iKTsKKworCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPm1hZ2ljID09IEhCX01BR0lDLCByZXR1cm4gTlVMTDspOworCisJLyoKKwkgKiBMb2NhdGUgaGFzaGJpbgorCSAqLworCWlmICggbmFtZSApCisJCWhhc2h2ID0gaGFzaCggbmFtZSApOworCWJpbiA9IEdFVF9IQVNIQklOKCBoYXNodiApOworCQorCS8qCisJICogU2VhcmNoIGZvciBlbnRyeQorCSAqLworCWVudHJ5ID0gaGFzaGJpbi0+aGJfcXVldWVbIGJpbl07CisJaWYgKCBlbnRyeSApIHsKKwkJZG8geworCQkJLyoKKwkJCSAqIENoZWNrIGZvciBrZXkKKwkJCSAqLworCQkJaWYgKCBlbnRyeS0+cV9oYXNoID09IGhhc2h2ICkgeworCQkJCS8qCisJCQkJICogTmFtZSBjb21wYXJlIHRvbz8KKwkJCQkgKi8KKwkJCQlpZiAoIG5hbWUgKSB7CisJCQkJCWlmICggc3RyY21wKCBlbnRyeS0+cV9uYW1lLCBuYW1lICkgPT0gMCApIHsKKwkJCQkJCXJldHVybiBlbnRyeTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBlbnRyeTsKKwkJCQl9CisJCQl9CisJCQllbnRyeSA9IGVudHJ5LT5xX25leHQ7CisJCX0gd2hpbGUgKCBlbnRyeSAhPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0gKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaGFzaGJpbl9maW5kKTsKKworLyoKKyAqIEZ1bmN0aW9uIGhhc2hiaW5fbG9ja19maW5kIChoYXNoYmluLCBoYXNodiwgbmFtZSkKKyAqCisgKiAgICBGaW5kIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gaGFzaHYgb3IgbmFtZQorICoKKyAqIFNhbWUsIGJ1dCB3aXRoIHNwaW5sb2NrIHByb3RlY3Rpb24uLi4KKyAqIEkgY2FsbCBpdCBzYWZlLCBidXQgaXQncyBvbmx5IHNhZmUgd2l0aCByZXNwZWN0IHRvIHRoZSBoYXNoYmluLCBub3QgaXRzCisgKiBjb250ZW50LiAtIEplYW4gSUkKKyAqLwordm9pZCogaGFzaGJpbl9sb2NrX2ZpbmQoIGhhc2hiaW5fdCogaGFzaGJpbiwgbG9uZyBoYXNodiwgY29uc3QgY2hhciogbmFtZSApCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaXJkYV9xdWV1ZV90KiBlbnRyeTsKKworCS8qIFN5bmNocm9uaXplICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFNlYXJjaCBmb3IgZW50cnkKKwkgKi8KKwllbnRyeSA9IChpcmRhX3F1ZXVlX3QqICkgaGFzaGJpbl9maW5kKCBoYXNoYmluLCBoYXNodiwgbmFtZSApOworCisJLyogUmVsZWFzZSBsb2NrICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlbnRyeTsKK30KK0VYUE9SVF9TWU1CT0woaGFzaGJpbl9sb2NrX2ZpbmQpOworCisvKgorICogRnVuY3Rpb24gaGFzaGJpbl9maW5kIChoYXNoYmluLCBoYXNodiwgbmFtZSwgcG5leHQpCisgKgorICogICAgRmluZCBhbiBpdGVtIHdpdGggdGhlIGdpdmVuIGhhc2h2IG9yIG5hbWUsIGFuZCBpdHMgc3VjY2Vzc29yCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvdyB0byBkbyBjb25jdXJyZW50IGVudW1lcmF0aW9ucyB3aXRob3V0IHRoZQorICogbmVlZCB0byBsb2NrIG92ZXIgdGhlIHdob2xlIHNlc3Npb24sIGJlY2F1c2UgdGhlIGNhbGxlciBrZWVwIHRoZQorICogY29udGV4dCBvZiB0aGUgc2VhcmNoLiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgbWlnaHQgZmFpbCBhbmQgcmV0dXJuCisgKiBOVUxMIGlmIHRoZSBlbnRyeSBpcyByZW1vdmVkLiAtIEplYW4gSUkKKyAqLwordm9pZCogaGFzaGJpbl9maW5kX25leHQoIGhhc2hiaW5fdCogaGFzaGJpbiwgbG9uZyBoYXNodiwgY29uc3QgY2hhciogbmFtZSwKKwkJCSB2b2lkICoqIHBuZXh0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWlyZGFfcXVldWVfdCogZW50cnk7CisKKwkvKiBTeW5jaHJvbml6ZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBTZWFyY2ggZm9yIGN1cnJlbnQgZW50cnkKKwkgKiBUaGlzIGFsbG93IHRvIGNoZWNrIGlmIHRoZSBjdXJyZW50IGl0ZW0gaXMgc3RpbGwgaW4gdGhlCisJICogaGFzaGJpbiBvciBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCWVudHJ5ID0gKGlyZGFfcXVldWVfdCogKSBoYXNoYmluX2ZpbmQoIGhhc2hiaW4sIGhhc2h2LCBuYW1lICk7CisKKwkvKgorCSAqIFRyaWNrIGhhc2hiaW5fZ2V0X25leHQoKSB0byByZXR1cm4gd2hhdCB3ZSB3YW50CisJICovCisJaWYoZW50cnkpIHsKKwkJaGFzaGJpbi0+aGJfY3VycmVudCA9IGVudHJ5OworCQkqcG5leHQgPSBoYXNoYmluX2dldF9uZXh0KCBoYXNoYmluICk7CisJfSBlbHNlCisJCSpwbmV4dCA9IE5VTEw7CisKKwkvKiBSZWxlYXNlIGxvY2sgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVudHJ5OworfQorRVhQT1JUX1NZTUJPTChoYXNoYmluX2ZpbmRfbmV4dCk7CisKKy8qCisgKiBGdW5jdGlvbiBoYXNoYmluX2dldF9maXJzdCAoaGFzaGJpbikKKyAqCisgKiAgICBHZXQgYSBwb2ludGVyIHRvIGZpcnN0IGVsZW1lbnQgaW4gaGFzaGJpbiwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCisgKiAgICBjYWxsZWQgYmVmb3JlIGFueSBjYWxscyB0byBoYXNoYmluX2dldF9uZXh0KCkhCisgKgorICovCitpcmRhX3F1ZXVlX3QgKmhhc2hiaW5fZ2V0X2ZpcnN0KCBoYXNoYmluX3QqIGhhc2hiaW4pIAoreworCWlyZGFfcXVldWVfdCAqZW50cnk7CisJaW50IGk7CisKKwlJUkRBX0FTU0VSVCggaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIE5VTEw7KTsKKworCWlmICggaGFzaGJpbiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoIGkgPSAwOyBpIDwgSEFTSEJJTl9TSVpFOyBpICsrICkgeworCQllbnRyeSA9IGhhc2hiaW4tPmhiX3F1ZXVlWyBpXTsKKwkJaWYgKCBlbnRyeSkgeworCQkJaGFzaGJpbi0+aGJfY3VycmVudCA9IGVudHJ5OworCQkJcmV0dXJuIGVudHJ5OworCQl9CisJfQorCS8qCisJICogIERpZCBub3QgZmluZCBhbnkgaXRlbSBpbiBoYXNoYmluCisJICovCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGhhc2hiaW5fZ2V0X2ZpcnN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGhhc2hiaW5fZ2V0X25leHQgKGhhc2hiaW4pCisgKgorICogICAgR2V0IG5leHQgaXRlbSBpbiBoYXNoYmluLiBBIHNlcmllcyBvZiBoYXNoYmluX2dldF9uZXh0KCkgY2FsbHMgbXVzdAorICogICAgYmUgc3RhcnRlZCBieSBhIGNhbGwgdG8gaGFzaGJpbl9nZXRfZmlyc3QoKS4gVGhlIGZ1bmN0aW9uIHJldHVybnMKKyAqICAgIE5VTEwgd2hlbiBhbGwgaXRlbXMgaGF2ZSBiZWVuIHRyYXZlcnNlZAorICogCisgKiBUaGUgY29udGV4dCBvZiB0aGUgc2VhcmNoIGlzIHN0b3JlZCB3aXRoaW4gdGhlIGhhc2hiaW4sIHNvIHlvdSBtdXN0CisgKiBwcm90ZWN0IHlvdXJzZWxmIGZyb20gY29uY3VycmVudCBlbnVtZXJhdGlvbnMuIC0gSmVhbiBJSQorICovCitpcmRhX3F1ZXVlX3QgKmhhc2hiaW5fZ2V0X25leHQoIGhhc2hiaW5fdCAqaGFzaGJpbikKK3sKKwlpcmRhX3F1ZXVlX3QqIGVudHJ5OworCWludCBiaW47CisJaW50IGk7CisKKwlJUkRBX0FTU0VSVCggaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIE5VTEw7KTsKKworCWlmICggaGFzaGJpbi0+aGJfY3VycmVudCA9PSBOVUxMKSB7CisJCUlSREFfQVNTRVJUKCBoYXNoYmluLT5oYl9jdXJyZW50ICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisJCXJldHVybiBOVUxMOworCX0JCisJZW50cnkgPSBoYXNoYmluLT5oYl9jdXJyZW50LT5xX25leHQ7CisJYmluID0gR0VUX0hBU0hCSU4oIGVudHJ5LT5xX2hhc2gpOworCisJLyogIAorCSAqICBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IGJhY2sgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcXVldWUKKwkgKiAgYWdhaW4gCisJICovCisJaWYgKCBlbnRyeSAhPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0pIHsKKwkJaGFzaGJpbi0+aGJfY3VycmVudCA9IGVudHJ5OworCisJCXJldHVybiBlbnRyeTsKKwl9CisKKwkvKgorCSAqICBDaGVjayB0aGF0IHRoaXMgaXMgbm90IHRoZSBsYXN0IHF1ZXVlIGluIGhhc2hiaW4KKwkgKi8KKwlpZiAoIGJpbiA+PSBIQVNIQklOX1NJWkUpCisJCXJldHVybiBOVUxMOworCQorCS8qCisJICogIE1vdmUgdG8gbmV4dCBxdWV1ZSBpbiBoYXNoYmluCisJICovCisJYmluKys7CisJZm9yICggaSA9IGJpbjsgaSA8IEhBU0hCSU5fU0laRTsgaSsrICkgeworCQllbnRyeSA9IGhhc2hiaW4tPmhiX3F1ZXVlWyBpXTsKKwkJaWYgKCBlbnRyeSkgeworCQkJaGFzaGJpbi0+aGJfY3VycmVudCA9IGVudHJ5OworCQkJCisJCQlyZXR1cm4gZW50cnk7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGhhc2hiaW5fZ2V0X25leHQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJzeXNjdGwuYyBiL25ldC9pcmRhL2lyc3lzY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxYzQxOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lyc3lzY3RsLmMKQEAgLTAsMCArMSwyOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJzeXNjdGwuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBTeXNjdGwgaW50ZXJmYWNlIGZvciBJckRBCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTdW4gTWF5IDI0IDIyOjEyOjA2IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBKdW4gIDQgMDI6NTA6MTUgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4JCS8qIGlyZGFfZGVidWcgKi8KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhc19vYmplY3QuaD4KKworI2RlZmluZSBORVRfSVJEQSA0MTIgLyogUmFuZG9tIG51bWJlciAqLworZW51bSB7IERJU0NPVkVSWT0xLCBERVZOQU1FLCBERUJVRywgRkFTVF9QT0xMLCBESVNDT1ZFUllfU0xPVFMsCisgICAgICAgRElTQ09WRVJZX1RJTUVPVVQsIFNMT1RfVElNRU9VVCwgTUFYX0JBVURfUkFURSwgTUlOX1RYX1RVUk5fVElNRSwKKyAgICAgICBNQVhfVFhfREFUQV9TSVpFLCBNQVhfVFhfV0lORE9XLCBNQVhfTk9SRVBMWV9USU1FLCBXQVJOX05PUkVQTFlfVElNRSwKKyAgICAgICBMQVBfS0VFUEFMSVZFX1RJTUUgfTsKKworZXh0ZXJuIGludCAgc3lzY3RsX2Rpc2NvdmVyeTsKK2V4dGVybiBpbnQgIHN5c2N0bF9kaXNjb3Zlcnlfc2xvdHM7CitleHRlcm4gaW50ICBzeXNjdGxfZGlzY292ZXJ5X3RpbWVvdXQ7CitleHRlcm4gaW50ICBzeXNjdGxfc2xvdF90aW1lb3V0OworZXh0ZXJuIGludCAgc3lzY3RsX2Zhc3RfcG9sbF9pbmNyZWFzZTsKK2V4dGVybiBjaGFyIHN5c2N0bF9kZXZuYW1lW107CitleHRlcm4gaW50ICBzeXNjdGxfbWF4X2JhdWRfcmF0ZTsKK2V4dGVybiBpbnQgIHN5c2N0bF9taW5fdHhfdHVybl90aW1lOworZXh0ZXJuIGludCAgc3lzY3RsX21heF90eF9kYXRhX3NpemU7CitleHRlcm4gaW50ICBzeXNjdGxfbWF4X3R4X3dpbmRvdzsKK2V4dGVybiBpbnQgIHN5c2N0bF9tYXhfbm9yZXBseV90aW1lOworZXh0ZXJuIGludCAgc3lzY3RsX3dhcm5fbm9yZXBseV90aW1lOworZXh0ZXJuIGludCAgc3lzY3RsX2xhcF9rZWVwYWxpdmVfdGltZTsKKworLyogdGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBwcm9jX2RvaW50dmVjX21pbm1heCAtIEplYW4gSUkgKi8KK3N0YXRpYyBpbnQgbWF4X2Rpc2NvdmVyeV9zbG90cyA9IDE2OwkJLyogPz8/ICovCitzdGF0aWMgaW50IG1pbl9kaXNjb3Zlcnlfc2xvdHMgPSAxOworLyogSXJMQVAgNi4xMy4yIHNheXMgMjVtcyB0byAxMCs3MG1zIC0gYWxsb3cgaGlnaGVyIHNpbmNlIHNvbWUgZGV2aWNlcworICogc2VlbXMgdG8gcmVxdWlyZSBpdC4gKGZyb20gRGFnJ3MgY29tbWVudCkgKi8KK3N0YXRpYyBpbnQgbWF4X3Nsb3RfdGltZW91dCA9IDE2MDsKK3N0YXRpYyBpbnQgbWluX3Nsb3RfdGltZW91dCA9IDIwOworc3RhdGljIGludCBtYXhfbWF4X2JhdWRfcmF0ZSA9IDE2MDAwMDAwOwkvKiBTZWUgcW9zLmMgLSBJckxBUCBzcGVjICovCitzdGF0aWMgaW50IG1pbl9tYXhfYmF1ZF9yYXRlID0gMjQwMDsKK3N0YXRpYyBpbnQgbWF4X21pbl90eF90dXJuX3RpbWUgPSAxMDAwMDsJLyogU2VlIHFvcy5jIC0gSXJMQVAgc3BlYyAqLworc3RhdGljIGludCBtaW5fbWluX3R4X3R1cm5fdGltZTsKK3N0YXRpYyBpbnQgbWF4X21heF90eF9kYXRhX3NpemUgPSAyMDQ4OwkJLyogU2VlIHFvcy5jIC0gSXJMQVAgc3BlYyAqLworc3RhdGljIGludCBtaW5fbWF4X3R4X2RhdGFfc2l6ZSA9IDY0Oworc3RhdGljIGludCBtYXhfbWF4X3R4X3dpbmRvdyA9IDc7CQkvKiBTZWUgcW9zLmMgLSBJckxBUCBzcGVjICovCitzdGF0aWMgaW50IG1pbl9tYXhfdHhfd2luZG93ID0gMTsKK3N0YXRpYyBpbnQgbWF4X21heF9ub3JlcGx5X3RpbWUgPSA0MDsJCS8qIFNlZSBxb3MuYyAtIElyTEFQIHNwZWMgKi8KK3N0YXRpYyBpbnQgbWluX21heF9ub3JlcGx5X3RpbWUgPSAzOworc3RhdGljIGludCBtYXhfd2Fybl9ub3JlcGx5X3RpbWUgPSAzOwkJLyogM3MgPT0gc3RhbmRhcmQgKi8KK3N0YXRpYyBpbnQgbWluX3dhcm5fbm9yZXBseV90aW1lID0gMTsJCS8qIDFzID09IG1pbiBXRF9USU1FUiAqLworc3RhdGljIGludCBtYXhfbGFwX2tlZXBhbGl2ZV90aW1lID0gMTAwMDA7CS8qIDEwcyAqLworc3RhdGljIGludCBtaW5fbGFwX2tlZXBhbGl2ZV90aW1lID0gMTAwOwkvKiAxMDB1cyAqLworLyogRm9yIG90aGVyIHN5c2N0bCwgSSd2ZSBubyBpZGVhIG9mIHRoZSByYW5nZS4gTWF5YmUgRGFnIGNvdWxkIGhlbHAKKyAqIHVzIG9uIHRoYXQgLSBKZWFuIElJICovCisKK3N0YXRpYyBpbnQgZG9fZGV2bmFtZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcHJvY19kb3N0cmluZyh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKHJldCA9PSAwICYmIHdyaXRlKSB7CisJCXN0cnVjdCBpYXNfdmFsdWUgKnZhbDsKKworCQl2YWwgPSBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlKHN5c2N0bF9kZXZuYW1lKTsKKwkJaWYgKHZhbCkKKwkJCWlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlKCJEZXZpY2UiLCAiRGV2aWNlTmFtZSIsIHZhbCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIE9uZSBmaWxlICovCitzdGF0aWMgY3RsX3RhYmxlIGlyZGFfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IERJU0NPVkVSWSwKKwkJLnByb2NuYW1lCT0gImRpc2NvdmVyeSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfZGlzY292ZXJ5LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gREVWTkFNRSwKKwkJLnByb2NuYW1lCT0gImRldm5hbWUiLAorCQkuZGF0YQkJPSBzeXNjdGxfZGV2bmFtZSwKKwkJLm1heGxlbgkJPSA2NSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZkb19kZXZuYW1lLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX3N0cmluZworCX0sCisjaWZkZWYgQ09ORklHX0lSREFfREVCVUcKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBERUJVRywKKwkJLnByb2NuYW1lCT0gImRlYnVnIiwKKwkJLmRhdGEJCT0gJmlyZGFfZGVidWcsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSVJEQV9GQVNUX1JSCisgICAgICAgIHsKKwkJLmN0bF9uYW1lCT0gRkFTVF9QT0xMLAorCQkucHJvY25hbWUJPSAiZmFzdF9wb2xsX2luY3JlYXNlIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9mYXN0X3BvbGxfaW5jcmVhc2UsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisjZW5kaWYKKwl7CisJCS5jdGxfbmFtZQk9IERJU0NPVkVSWV9TTE9UUywKKwkJLnByb2NuYW1lCT0gImRpc2NvdmVyeV9zbG90cyIsCisJCS5kYXRhCQk9ICZzeXNjdGxfZGlzY292ZXJ5X3Nsb3RzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX2Rpc2NvdmVyeV9zbG90cywKKwkJLmV4dHJhMgkJPSAmbWF4X2Rpc2NvdmVyeV9zbG90cworCX0sCisJeworCQkuY3RsX25hbWUJPSBESVNDT1ZFUllfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gImRpc2NvdmVyeV90aW1lb3V0IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9kaXNjb3ZlcnlfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IFNMT1RfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gInNsb3RfdGltZW91dCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfc2xvdF90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX3Nsb3RfdGltZW91dCwKKwkJLmV4dHJhMgkJPSAmbWF4X3Nsb3RfdGltZW91dAorCX0sCisJeworCQkuY3RsX25hbWUJPSBNQVhfQkFVRF9SQVRFLAorCQkucHJvY25hbWUJPSAibWF4X2JhdWRfcmF0ZSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfbWF4X2JhdWRfcmF0ZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9tYXhfYmF1ZF9yYXRlLAorCQkuZXh0cmEyCQk9ICZtYXhfbWF4X2JhdWRfcmF0ZQorCX0sCisJeworCQkuY3RsX25hbWUJPSBNSU5fVFhfVFVSTl9USU1FLAorCQkucHJvY25hbWUJPSAibWluX3R4X3R1cm5fdGltZSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfbWluX3R4X3R1cm5fdGltZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9taW5fdHhfdHVybl90aW1lLAorCQkuZXh0cmEyCQk9ICZtYXhfbWluX3R4X3R1cm5fdGltZQorCX0sCisJeworCQkuY3RsX25hbWUJPSBNQVhfVFhfREFUQV9TSVpFLAorCQkucHJvY25hbWUJPSAibWF4X3R4X2RhdGFfc2l6ZSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfbWF4X3R4X2RhdGFfc2l6ZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9tYXhfdHhfZGF0YV9zaXplLAorCQkuZXh0cmEyCQk9ICZtYXhfbWF4X3R4X2RhdGFfc2l6ZQorCX0sCisJeworCQkuY3RsX25hbWUJPSBNQVhfVFhfV0lORE9XLAorCQkucHJvY25hbWUJPSAibWF4X3R4X3dpbmRvdyIsCisJCS5kYXRhCQk9ICZzeXNjdGxfbWF4X3R4X3dpbmRvdywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9tYXhfdHhfd2luZG93LAorCQkuZXh0cmEyCQk9ICZtYXhfbWF4X3R4X3dpbmRvdworCX0sCisJeworCQkuY3RsX25hbWUJPSBNQVhfTk9SRVBMWV9USU1FLAorCQkucHJvY25hbWUJPSAibWF4X25vcmVwbHlfdGltZSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfbWF4X25vcmVwbHlfdGltZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9tYXhfbm9yZXBseV90aW1lLAorCQkuZXh0cmEyCQk9ICZtYXhfbWF4X25vcmVwbHlfdGltZQorCX0sCisJeworCQkuY3RsX25hbWUJPSBXQVJOX05PUkVQTFlfVElNRSwKKwkJLnByb2NuYW1lCT0gIndhcm5fbm9yZXBseV90aW1lIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF93YXJuX25vcmVwbHlfdGltZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl93YXJuX25vcmVwbHlfdGltZSwKKwkJLmV4dHJhMgkJPSAmbWF4X3dhcm5fbm9yZXBseV90aW1lCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IExBUF9LRUVQQUxJVkVfVElNRSwKKwkJLnByb2NuYW1lCT0gImxhcF9rZWVwYWxpdmVfdGltZSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfbGFwX2tlZXBhbGl2ZV90aW1lLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX2xhcF9rZWVwYWxpdmVfdGltZSwKKwkJLmV4dHJhMgkJPSAmbWF4X2xhcF9rZWVwYWxpdmVfdGltZQorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKKy8qIE9uZSBkaXJlY3RvcnkgKi8KK3N0YXRpYyBjdGxfdGFibGUgaXJkYV9uZXRfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUkRBLAorCQkucHJvY25hbWUJPSAiaXJkYSIsCisJCS5tYXhsZW4JCT0gMCwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IGlyZGFfdGFibGUKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCisvKiBUaGUgcGFyZW50IGRpcmVjdG9yeSAqLworc3RhdGljIGN0bF90YWJsZSBpcmRhX3Jvb3RfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9ORVQsCisJCS5wcm9jbmFtZQk9ICJuZXQiLAorCQkubWF4bGVuCQk9IDAsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBpcmRhX25ldF90YWJsZQorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaXJkYV90YWJsZV9oZWFkZXI7CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3N5c2N0bF9yZWdpc3RlciAodm9pZCkKKyAqCisgKiAgICBSZWdpc3RlciBvdXIgc3lzY3RsIGludGVyZmFjZQorICoKKyAqLworaW50IF9faW5pdCBpcmRhX3N5c2N0bF9yZWdpc3Rlcih2b2lkKQoreworCWlyZGFfdGFibGVfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGlyZGFfcm9vdF90YWJsZSwgMCk7CisJaWYgKCFpcmRhX3RhYmxlX2hlYWRlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfc3lzY3RsX3VucmVnaXN0ZXIgKHZvaWQpCisgKgorICogICAgVW5yZWdpc3RlciBvdXIgc3lzY3RsIGludGVyZmFjZQorICoKKyAqLwordm9pZCBfX2V4aXQgaXJkYV9zeXNjdGxfdW5yZWdpc3Rlcih2b2lkKSAKK3sKKwl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShpcmRhX3RhYmxlX2hlYWRlcik7Cit9CisKKworCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcnR0cC5jIGIvbmV0L2lyZGEvaXJ0dHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDkxY2NmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJ0dHAuYwpAQCAtMCwwICsxLDE5MTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJ0dHAuYworICogVmVyc2lvbjogICAgICAgMS4yCisgKiBEZXNjcmlwdGlvbjogICBUaW55IFRyYW5zcG9ydCBQcm90b2NvbCAoVFRQKSBpbXBsZW1lbnRhdGlvbgorICogU3RhdHVzOiAgICAgICAgU3RhYmxlCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTdW4gQXVnIDMxIDIwOjE0OjMxIDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFdlZCBKYW4gIDUgMTE6MzE6MjcgMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3BhcmFtZXRlcnMuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgorCitzdGF0aWMgc3RydWN0IGlydHRwX2NiICppcnR0cCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIF9faXJ0dHBfY2xvc2VfdHNhcChzdHJ1Y3QgdHNhcF9jYiAqc2VsZik7CisKK3N0YXRpYyBpbnQgaXJ0dHBfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJ0dHBfdWRhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgaXJ0dHBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsICAKKwkJCQkJTE1fUkVBU09OIHJlYXNvbiwgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgdm9pZCBpcnR0cF9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NkdV9zaXplLAorCQkJCSAgICAgX191OCBoZWFkZXJfc2l6ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBpcnR0cF9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NkdV9zaXplLCAKKwkJCQkgIF9fdTggaGVhZGVyX3NpemUsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgaXJ0dHBfcnVuX3R4X3F1ZXVlKHN0cnVjdCB0c2FwX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIGlydHRwX3J1bl9yeF9xdWV1ZShzdHJ1Y3QgdHNhcF9jYiAqc2VsZik7CisKK3N0YXRpYyB2b2lkIGlydHRwX2ZsdXNoX3F1ZXVlcyhzdHJ1Y3QgdHNhcF9jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBpcnR0cF9mcmFnbWVudF9za2Ioc3RydWN0IHRzYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHN0cnVjdCBza19idWZmICppcnR0cF9yZWFzc2VtYmxlX3NrYihzdHJ1Y3QgdHNhcF9jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBpcnR0cF90b2RvX2V4cGlyZWQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyBpbnQgaXJ0dHBfcGFyYW1fbWF4X3NkdV9zaXplKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICAgaW50IGdldCk7CisKK3N0YXRpYyB2b2lkIGlydHRwX2Zsb3dfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCBMT0NBTF9GTE9XIGZsb3cpOworc3RhdGljIHZvaWQgaXJ0dHBfc3RhdHVzX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsCisJCQkJICAgIExJTktfU1RBVFVTIGxpbmssIExPQ0tfU1RBVFVTIGxvY2spOworCisvKiBJbmZvcm1hdGlvbiBmb3IgcGFyc2luZyBwYXJhbWV0ZXJzIGluIElyVFRQICovCitzdGF0aWMgcGlfbWlub3JfaW5mb190IHBpX21pbm9yX2NhbGxfdGFibGVbXSA9IHsKKwl7IE5VTEwsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwICovCisJeyBpcnR0cF9wYXJhbV9tYXhfc2R1X3NpemUsIFBWX0lOVEVHRVIgfCBQVl9CSUdfRU5ESUFOIH0gLyogMHgwMSAqLworfTsKK3N0YXRpYyBwaV9tYWpvcl9pbmZvX3QgcGlfbWFqb3JfY2FsbF90YWJsZVtdID0ge3sgcGlfbWlub3JfY2FsbF90YWJsZSwgMiB9fTsKK3N0YXRpYyBwaV9wYXJhbV9pbmZvX3QgcGFyYW1faW5mbyA9IHsgcGlfbWFqb3JfY2FsbF90YWJsZSwgMSwgMHgwZiwgNCB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqIEdMT0JBTCBQUk9DRURVUkVTICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2luaXQgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZSB0aGUgSXJUVFAgbGF5ZXIuIENhbGxlZCBieSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gY29kZQorICoKKyAqLworaW50IF9faW5pdCBpcnR0cF9pbml0KHZvaWQpCit7CisJLyogSW5pdGlhbGl6ZSB0aGUgaXJ0dHAgc3RydWN0dXJlLiAqLworCWlmIChpcnR0cCA9PSBOVUxMKSB7CisJCWlydHRwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlydHRwX2NiKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChpcnR0cCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChpcnR0cCwgMCwgc2l6ZW9mKHN0cnVjdCBpcnR0cF9jYikpOworCisJaXJ0dHAtPm1hZ2ljID0gVFRQX01BR0lDOworCisJaXJ0dHAtPnRzYXBzID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7CisJaWYgKCFpcnR0cC0+dHNhcHMpIHsKKwkJSVJEQV9FUlJPUigiJXM6IGNhbid0IGFsbG9jYXRlIElyVFRQIGhhc2hiaW4hXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9jbGVhbnVwICh2b2lkKQorICoKKyAqICAgIENhbGxlZCBieSBtb2R1bGUgZGVzdHJ1Y3Rpb24vY2xlYW51cCBjb2RlCisgKgorICovCit2b2lkIF9fZXhpdCBpcnR0cF9jbGVhbnVwKHZvaWQpIAoreworCS8qIENoZWNrIGZvciBtYWluIHN0cnVjdHVyZSAqLworCUlSREFfQVNTRVJUKGlydHRwICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKGlydHRwLT5tYWdpYyA9PSBUVFBfTUFHSUMsIHJldHVybjspOworCisJLyoKKwkgKiAgRGVsZXRlIGhhc2hiaW4gYW5kIGNsb3NlIGFsbCBUU0FQIGluc3RhbmNlcyBpbiBpdAorCSAqLworCWhhc2hiaW5fZGVsZXRlKGlydHRwLT50c2FwcywgKEZSRUVfRlVOQykgX19pcnR0cF9jbG9zZV90c2FwKTsKKworCWlydHRwLT5tYWdpYyA9IDA7CisKKwkvKiBEZS1hbGxvY2F0ZSBtYWluIHN0cnVjdHVyZSAqLworCWtmcmVlKGlydHRwKTsKKworCWlydHRwID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9zdGFydF90b2RvX3RpbWVyIChzZWxmLCB0aW1lb3V0KQorICoKKyAqICAgIFN0YXJ0IHRvZG8gdGltZXIuCisgKgorICogTWFkZSBpdCBtb3JlIGVmZmllbnQgYW5kIHVuc2Vuc2l0aXZlIHRvIHJhY2UgY29uZGl0aW9ucyAtIEplYW4gSUkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlydHRwX3N0YXJ0X3RvZG9fdGltZXIoc3RydWN0IHRzYXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KQoreworCS8qIFNldCBuZXcgdmFsdWUgZm9yIHRpbWVyICovCisJbW9kX3RpbWVyKCZzZWxmLT50b2RvX3RpbWVyLCBqaWZmaWVzICsgdGltZW91dCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF90b2RvX2V4cGlyZWQgKGRhdGEpCisgKgorICogICAgVG9kbyB0aW1lciBoYXMgZXhwaXJlZCEKKyAqCisgKiBPbmUgb2YgdGhlIHJlc3RyaWN0aW9uIG9mIHRoZSB0aW1lciBpcyB0aGF0IGl0IGlzIHJ1biBvbmx5IG9uIHRoZSB0aW1lcgorICogaW50ZXJydXB0IHdoaWNoIHJ1biBldmVyeSAxMG1zLiBUaGlzIG1lYW4gdGhhdCBldmVuIGlmIHlvdSBzZXQgdGhlIHRpbWVyCisgKiB3aXRoIGEgZGVsYXkgb2YgMCwgaXQgbWF5IHRha2UgdXAgdG8gMTBtcyBiZWZvcmUgaXQncyBydW4uCisgKiBTbywgdG8gbWluaW1pc2UgbGF0ZW5jeSBhbmQga2VlcCBjYWNoZSBmcmVzaCwgd2UgdHJ5IHRvIGF2b2lkIHVzaW5nCisgKiBpdCBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICogTm90ZSA6IHdlIGNhbid0IHVzZSB0YXNrbGV0cywgYmVjYXVzZSB0aGV5IGNhbid0IGJlIGFzeW5jaHJvbm91c2x5CisgKiBraWxsZWQgKG5lZWQgdXNlciBjb250ZXh0KSwgYW5kIHdlIGNhbid0IGd1YXJhbnRlZSB0aGF0IGhlcmUuLi4KKyAqIEplYW4gSUkKKyAqLworc3RhdGljIHZvaWQgaXJ0dHBfdG9kb19leHBpcmVkKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgdHNhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBkYXRhOworCisJLyogQ2hlY2sgdGhhdCB3ZSBzdGlsbCBleGlzdCAqLworCWlmICghc2VsZiB8fCBzZWxmLT5tYWdpYyAhPSBUVFBfVFNBUF9NQUdJQykKKwkJcmV0dXJuOworCisJSVJEQV9ERUJVRyg0LCAiJXMoaW5zdGFuY2U9JXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOworCisJLyogVHJ5IHRvIG1ha2Ugc29tZSBwcm9ncmVzcywgZXNwZWNpYWxseSBvbiBUeCBzaWRlIC0gSmVhbiBJSSAqLworCWlydHRwX3J1bl9yeF9xdWV1ZShzZWxmKTsKKwlpcnR0cF9ydW5fdHhfcXVldWUoc2VsZik7CisKKwkvKiBDaGVjayBpZiB0aW1lIGZvciBkaXNjb25uZWN0ICovCisJaWYgKHRlc3RfYml0KDAsICZzZWxmLT5kaXNjb25uZWN0X3BlbmQpKSB7CisJCS8qIENoZWNrIGlmIGl0J3MgcG9zc2libGUgdG8gZGlzY29ubmVjdCB5ZXQgKi8KKwkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhfcXVldWUpKSB7CisJCQkvKiBNYWtlIHN1cmUgZGlzY29ubmVjdCBpcyBub3QgcGVuZGluZyBhbnltb3JlICovCisJCQljbGVhcl9iaXQoMCwgJnNlbGYtPmRpc2Nvbm5lY3RfcGVuZCk7CS8qIEZBTFNFICovCisKKwkJCS8qIE5vdGUgOiBzZWxmLT5kaXNjb25uZWN0X3NrYiBtYXkgYmUgTlVMTCAqLworCQkJaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYsIHNlbGYtPmRpc2Nvbm5lY3Rfc2tiLAorCQkJCQkJIFBfTk9STUFMKTsKKwkJCXNlbGYtPmRpc2Nvbm5lY3Rfc2tiID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qIFRyeSBhZ2FpbiBsYXRlciAqLworCQkJaXJ0dHBfc3RhcnRfdG9kb190aW1lcihzZWxmLCBIWi8xMCk7CisKKwkJCS8qIE5vIHJlYXNvbiB0byB0cnkgYW5kIGNsb3NlIG5vdyAqLworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogQ2hlY2sgaWYgaXQncyBjbG9zaW5nIHRpbWUgKi8KKwlpZiAoc2VsZi0+Y2xvc2VfcGVuZCkKKwkJLyogRmluaXNoIGNsZWFudXAgKi8KKwkJaXJ0dHBfY2xvc2VfdHNhcChzZWxmKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2ZsdXNoX3F1ZXVlcyAoc2VsZikKKyAqCisgKiAgICAgRmx1c2hlcyAocmVtb3ZlcyBhbGwgZnJhbWVzKSBpbiB0cmFuc2l0dC1idWZmZXIgKHR4X2xpc3QpCisgKi8KK3ZvaWQgaXJ0dHBfZmx1c2hfcXVldWVzKHN0cnVjdCB0c2FwX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmKiBza2I7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBEZWFsbG9jYXRlIGZyYW1lcyB3YWl0aW5nIHRvIGJlIHNlbnQgKi8KKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT50eF9xdWV1ZSkpICE9IE5VTEwpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCS8qIERlYWxsb2NhdGUgcmVjZWl2ZWQgZnJhbWVzICovCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+cnhfcXVldWUpKSAhPSBOVUxMKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwkvKiBEZWFsbG9jYXRlIHJlY2VpdmVkIGZyYWdtZW50cyAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPnJ4X2ZyYWdtZW50cykpICE9IE5VTEwpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX3JlYXNzZW1ibGUgKHNlbGYpCisgKgorICogICAgTWFrZXMgYSBuZXcgKGNvbnRpbnVvdXMpIHNrYiBvZiBhbGwgdGhlIGZyYWdtZW50cyBpbiB0aGUgZnJhZ21lbnQKKyAqICAgIHF1ZXVlCisgKgorICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmlydHRwX3JlYXNzZW1ibGVfc2tiKHN0cnVjdCB0c2FwX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICpza2IsICpmcmFnOworCWludCBuID0gMDsgIC8qIEZyYWdtZW50IGluZGV4ICovCisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybiBOVUxMOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBzZWxmLT5yeF9zZHVfc2l6ZT0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBzZWxmLT5yeF9zZHVfc2l6ZSk7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKFRUUF9IRUFERVIgKyBzZWxmLT5yeF9zZHVfc2l6ZSk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBOZWVkIHRvIHJlc2VydmUgc3BhY2UgZm9yIFRUUCBoZWFkZXIgaW4gY2FzZSB0aGlzIHNrYiBuZWVkcyB0bworCSAqIGJlIHJlcXVldWVkIGluIGNhc2UgZGVsaXZlcnkgZmFpbGVzCisJICovCisJc2tiX3Jlc2VydmUoc2tiLCBUVFBfSEVBREVSKTsKKwlza2JfcHV0KHNrYiwgc2VsZi0+cnhfc2R1X3NpemUpOworCisJLyoKKwkgKiAgQ29weSBhbGwgZnJhZ21lbnRzIHRvIGEgbmV3IGJ1ZmZlcgorCSAqLworCXdoaWxlICgoZnJhZyA9IHNrYl9kZXF1ZXVlKCZzZWxmLT5yeF9mcmFnbWVudHMpKSAhPSBOVUxMKSB7CisJCW1lbWNweShza2ItPmRhdGErbiwgZnJhZy0+ZGF0YSwgZnJhZy0+bGVuKTsKKwkJbiArPSBmcmFnLT5sZW47CisKKwkJZGV2X2tmcmVlX3NrYihmcmFnKTsKKwl9CisKKwlJUkRBX0RFQlVHKDIsCisJCSAgICIlcygpLCBmcmFtZSBsZW49JWQsIHJ4X3NkdV9zaXplPSVkLCByeF9tYXhfc2R1X3NpemU9JWRcbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgbiwgc2VsZi0+cnhfc2R1X3NpemUsIHNlbGYtPnJ4X21heF9zZHVfc2l6ZSk7CisJLyogTm90ZSA6IGlydHRwX3J1bl9yeF9xdWV1ZSgpIGNhbGN1bGF0ZSBzZWxmLT5yeF9zZHVfc2l6ZQorCSAqIGJ5IHN1bW1pbmcgdGhlIHNpemUgb2YgYWxsIGZyYWdtZW50cywgc28gd2Ugc2hvdWxkIGFsd2F5cworCSAqIGhhdmUgbiA9PSBzZWxmLT5yeF9zZHVfc2l6ZSwgZXhjZXB0IGluIGNhc2VzIHdoZXJlIHdlCisJICogZHJvcGVkIHRoZSBsYXN0IGZyYWdtZW50ICh3aGVuIHNlbGYtPnJ4X3NkdV9zaXplIGV4Y2VlZAorCSAqIHNlbGYtPnJ4X21heF9zZHVfc2l6ZSksIHdoZXJlIG4gPCBzZWxmLT5yeF9zZHVfc2l6ZS4KKwkgKiBKZWFuIElJICovCisJSVJEQV9BU1NFUlQobiA8PSBzZWxmLT5yeF9zZHVfc2l6ZSwgbiA9IHNlbGYtPnJ4X3NkdV9zaXplOyk7CisKKwkvKiBTZXQgdGhlIG5ldyBsZW5ndGggKi8KKwlza2JfdHJpbShza2IsIG4pOworCisJc2VsZi0+cnhfc2R1X3NpemUgPSAwOworCisJcmV0dXJuIHNrYjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2ZyYWdtZW50X3NrYiAoc2tiKQorICoKKyAqICAgIEZyYWdtZW50cyBhIGZyYW1lIGFuZCBxdWV1ZXMgYWxsIHRoZSBmcmFnbWVudHMgZm9yIHRyYW5zbWlzc2lvbgorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlydHRwX2ZyYWdtZW50X3NrYihzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpmcmFnOworCV9fdTggKmZyYW1lOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qCisJICogIFNwbGl0IGZyYW1lIGludG8gYSBudW1iZXIgb2Ygc2VnbWVudHMKKwkgKi8KKwl3aGlsZSAoc2tiLT5sZW4gPiBzZWxmLT5tYXhfc2VnX3NpemUpIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgZnJhZ21lbnRpbmcgLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCS8qIE1ha2UgbmV3IHNlZ21lbnQgKi8KKwkJZnJhZyA9IGRldl9hbGxvY19za2Ioc2VsZi0+bWF4X3NlZ19zaXplK3NlbGYtPm1heF9oZWFkZXJfc2l6ZSk7CisJCWlmICghZnJhZykKKwkJCXJldHVybjsKKworCQlza2JfcmVzZXJ2ZShmcmFnLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOworCisJCS8qIENvcHkgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCBza2IgaW50byB0aGlzIGZyYWdtZW50LiAqLworCQltZW1jcHkoc2tiX3B1dChmcmFnLCBzZWxmLT5tYXhfc2VnX3NpemUpLCBza2ItPmRhdGEsCisJCSAgICAgICBzZWxmLT5tYXhfc2VnX3NpemUpOworCisJCS8qIEluc2VydCBUVFAgaGVhZGVyLCB3aXRoIHRoZSBtb3JlIGJpdCBzZXQgKi8KKwkJZnJhbWUgPSBza2JfcHVzaChmcmFnLCBUVFBfSEVBREVSKTsKKwkJZnJhbWVbMF0gPSBUVFBfTU9SRTsKKworCQkvKiBIaWRlIHRoZSBjb3BpZWQgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCBza2IgKi8KKwkJc2tiX3B1bGwoc2tiLCBzZWxmLT5tYXhfc2VnX3NpemUpOworCisJCS8qIFF1ZXVlIGZyYWdtZW50ICovCisJCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT50eF9xdWV1ZSwgZnJhZyk7CisJfQorCS8qIFF1ZXVlIHdoYXQgaXMgbGVmdCBvZiB0aGUgb3JpZ2luYWwgc2tiICovCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgcXVldWluZyBsYXN0IHNlZ21lbnRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlmcmFtZSA9IHNrYl9wdXNoKHNrYiwgVFRQX0hFQURFUik7CisJZnJhbWVbMF0gPSAweDAwOyAvKiBDbGVhciBtb3JlIGJpdCAqLworCisJLyogUXVldWUgZnJhZ21lbnQgKi8KKwlza2JfcXVldWVfdGFpbCgmc2VsZi0+dHhfcXVldWUsIHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9wYXJhbV9tYXhfc2R1X3NpemUgKHNlbGYsIHBhcmFtKQorICoKKyAqICAgIEhhbmRsZSB0aGUgTWF4U2R1U2l6ZSBwYXJhbWV0ZXIgaW4gdGhlIGNvbm5lY3QgZnJhbWVzLCB0aGlzIGZ1bmN0aW9uCisgKiAgICB3aWxsIGJlIGNhbGxlZCBib3RoIHdoZW4gdGhpcyBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgaW50bywgYW5kCisgKiAgICBleHRyYWN0ZWQgZnJvbSB0aGUgY29ubmVjdCBmcmFtZXMKKyAqLworc3RhdGljIGludCBpcnR0cF9wYXJhbV9tYXhfc2R1X3NpemUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sCisJCQkJICAgIGludCBnZXQpCit7CisJc3RydWN0IHRzYXBfY2IgKnNlbGY7CisKKwlzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlpZiAoZ2V0KQorCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnR4X21heF9zZHVfc2l6ZTsKKwllbHNlCisJCXNlbGYtPnR4X21heF9zZHVfc2l6ZSA9IHBhcmFtLT5wdi5pOworCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgTWF4U2R1U2l6ZT0lZFxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+cHYuaSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBDTElFTlQgQ0FMTFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIExNUCBDQUxMQkFDS1MgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFdmVyeXRoaW5nIGlzIGhhcHBpbHkgbWl4ZWQgdXAuIFdhaXRpbmcgZm9yIG5leHQgY2xlYW4gdXAgLSBKZWFuIElJICovCisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9vcGVuX3RzYXAgKHN0c2FwLCBub3RpZnkpCisgKgorICogICAgQ3JlYXRlIFRTQVAgY29ubmVjdGlvbiBlbmRwb2ludCwKKyAqLworc3RydWN0IHRzYXBfY2IgKmlydHRwX29wZW5fdHNhcChfX3U4IHN0c2FwX3NlbCwgaW50IGNyZWRpdCwgbm90aWZ5X3QgKm5vdGlmeSkKK3sKKwlzdHJ1Y3QgdHNhcF9jYiAqc2VsZjsKKwlzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKKwlub3RpZnlfdCB0dHBfbm90aWZ5OworCisJSVJEQV9BU1NFUlQoaXJ0dHAgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKwlJUkRBX0FTU0VSVChpcnR0cC0+bWFnaWMgPT0gVFRQX01BR0lDLCByZXR1cm4gTlVMTDspOworCisJLyogVGhlIElyTE1QIHNwZWMgKElyTE1QIDEuMSBwMTApIHNheXMgdGhhdCB3ZSBoYXZlIHRoZSByaWdodCB0bworCSAqIHVzZSBvbmx5IDB4MDEtMHg2Ri4gT2YgY291cnNlLCB3ZSBjYW4gdXNlIExTQVBfQU5ZIGFzIHdlbGwuCisJICogSmVhbklJICovCisJaWYoKHN0c2FwX3NlbCAhPSBMU0FQX0FOWSkgJiYKKwkgICAoKHN0c2FwX3NlbCA8IDB4MDEpIHx8IChzdHNhcF9zZWwgPj0gMHg3MCkpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGludmFsaWQgdHNhcCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNlbGYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHNhcF9jYiksIEdGUF9BVE9NSUMpOworCWlmIChzZWxmID09IE5VTEwpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KHNlbGYsIDAsIHNpemVvZihzdHJ1Y3QgdHNhcF9jYikpOworCXNwaW5fbG9ja19pbml0KCZzZWxmLT5sb2NrKTsKKworCS8qIEluaXRpYWxpc2UgdG9kbyB0aW1lciAqLworCWluaXRfdGltZXIoJnNlbGYtPnRvZG9fdGltZXIpOworCXNlbGYtPnRvZG9fdGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZykgc2VsZjsKKwlzZWxmLT50b2RvX3RpbWVyLmZ1bmN0aW9uID0gJmlydHRwX3RvZG9fZXhwaXJlZDsKKworCS8qIEluaXRpYWxpemUgY2FsbGJhY2tzIGZvciBJckxNUCB0byB1c2UgKi8KKwlpcmRhX25vdGlmeV9pbml0KCZ0dHBfbm90aWZ5KTsKKwl0dHBfbm90aWZ5LmNvbm5lY3RfY29uZmlybSA9IGlydHRwX2Nvbm5lY3RfY29uZmlybTsKKwl0dHBfbm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbiA9IGlydHRwX2Nvbm5lY3RfaW5kaWNhdGlvbjsKKwl0dHBfbm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IGlydHRwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbjsKKwl0dHBfbm90aWZ5LmRhdGFfaW5kaWNhdGlvbiA9IGlydHRwX2RhdGFfaW5kaWNhdGlvbjsKKwl0dHBfbm90aWZ5LnVkYXRhX2luZGljYXRpb24gPSBpcnR0cF91ZGF0YV9pbmRpY2F0aW9uOworCXR0cF9ub3RpZnkuZmxvd19pbmRpY2F0aW9uID0gaXJ0dHBfZmxvd19pbmRpY2F0aW9uOworCWlmKG5vdGlmeS0+c3RhdHVzX2luZGljYXRpb24gIT0gTlVMTCkKKwkJdHRwX25vdGlmeS5zdGF0dXNfaW5kaWNhdGlvbiA9IGlydHRwX3N0YXR1c19pbmRpY2F0aW9uOworCXR0cF9ub3RpZnkuaW5zdGFuY2UgPSBzZWxmOworCXN0cm5jcHkodHRwX25vdGlmeS5uYW1lLCBub3RpZnktPm5hbWUsIE5PVElGWV9NQVhfTkFNRSk7CisKKwlzZWxmLT5tYWdpYyA9IFRUUF9UU0FQX01BR0lDOworCXNlbGYtPmNvbm5lY3RlZCA9IEZBTFNFOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2VsZi0+cnhfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNlbGYtPnR4X3F1ZXVlKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZzZWxmLT5yeF9mcmFnbWVudHMpOworCS8qCisJICogIENyZWF0ZSBMU0FQIGF0IElyTE1QIGxheWVyCisJICovCisJbHNhcCA9IGlybG1wX29wZW5fbHNhcChzdHNhcF9zZWwsICZ0dHBfbm90aWZ5LCAwKTsKKwlpZiAobHNhcCA9PSBOVUxMKSB7CisJCUlSREFfV0FSTklORygiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBMU0FQISFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogIElmIHVzZXIgc3BlY2lmaWVkIExTQVBfQU5ZIGFzIHNvdXJjZSBUU0FQIHNlbGVjdG9yLCB0aGVuIElyTE1QCisJICogIHdpbGwgcmVwbGFjZSBpdCB3aXRoIHdoYXRldmVyIHNvdXJjZSBzZWxlY3RvciB3aGljaCBpcyBmcmVlLCBzbworCSAqICB0aGUgc3RzYXBfc2VsIHdlIGhhdmUgbWlnaHQgbm90IGJlIHZhbGlkIGFueW1vcmUKKwkgKi8KKwlzZWxmLT5zdHNhcF9zZWwgPSBsc2FwLT5zbHNhcF9zZWw7CisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgc3RzYXBfc2VsPSUwMnhcbiIsIF9fRlVOQ1RJT05fXywgc2VsZi0+c3RzYXBfc2VsKTsKKworCXNlbGYtPm5vdGlmeSA9ICpub3RpZnk7CisJc2VsZi0+bHNhcCA9IGxzYXA7CisKKwloYXNoYmluX2luc2VydChpcnR0cC0+dHNhcHMsIChpcmRhX3F1ZXVlX3QgKikgc2VsZiwgKGxvbmcpIHNlbGYsIE5VTEwpOworCisJaWYgKGNyZWRpdCA+IFRUUF9SWF9NQVhfQ1JFRElUKQorCQlzZWxmLT5pbml0aWFsX2NyZWRpdCA9IFRUUF9SWF9NQVhfQ1JFRElUOworCWVsc2UKKwkJc2VsZi0+aW5pdGlhbF9jcmVkaXQgPSBjcmVkaXQ7CisKKwlyZXR1cm4gc2VsZjsKK30KK0VYUE9SVF9TWU1CT0woaXJ0dHBfb3Blbl90c2FwKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2Nsb3NlIChoYW5kbGUpCisgKgorICogICAgUmVtb3ZlIGFuIGluc3RhbmNlIG9mIGEgVFNBUC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBkZWFsIHdpdGggdGhlCisgKiAgICBkZWFsbG9jYXRpb24gb2YgdGhlIFRTQVAsIGFuZCByZXNldHRpbmcgb2YgdGhlIFRTQVBzIHZhbHVlczsKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9faXJ0dHBfY2xvc2VfdHNhcChzdHJ1Y3QgdHNhcF9jYiAqc2VsZikKK3sKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkLiAqLworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOworCisJaXJ0dHBfZmx1c2hfcXVldWVzKHNlbGYpOworCisJZGVsX3RpbWVyKCZzZWxmLT50b2RvX3RpbWVyKTsKKworCS8qIFRoaXMgb25lIHdvbid0IGJlIGNsZWFuZWQgdXAgaWYgd2UgYXJlIGRpc2Nvbm5lY3RfcGVuZCArIGNsb3NlX3BlbmQKKwkgKiBhbmQgd2UgcmVjZWl2ZSBhIGRpc2Nvbm5lY3RfaW5kaWNhdGlvbiAqLworCWlmIChzZWxmLT5kaXNjb25uZWN0X3NrYikKKwkJZGV2X2tmcmVlX3NrYihzZWxmLT5kaXNjb25uZWN0X3NrYik7CisKKwlzZWxmLT5jb25uZWN0ZWQgPSBGQUxTRTsKKwlzZWxmLT5tYWdpYyA9IH5UVFBfVFNBUF9NQUdJQzsKKworCWtmcmVlKHNlbGYpOworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHBfY2xvc2UgKHNlbGYpCisgKgorICogICAgUmVtb3ZlIFRTQVAgZnJvbSBsaXN0IG9mIGFsbCBUU0FQcyBhbmQgdGhlbiBkZWFsbG9jYXRlIGFsbCByZXNvdXJjZXMKKyAqICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRTQVAKKyAqCisgKiBOb3RlIDogYmVjYXVzZSB3ZSAqZnJlZSogdGhlIHRzYXAgc3RydWN0dXJlLCBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkKKyAqIG9mIHRoZSBjYWxsZXIgdG8gbWFrZSBzdXJlIHdlIGFyZSBjYWxsZWQgb25seSBvbmNlIGFuZCB0byBkZWFsIHdpdGgKKyAqIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9ucy4gLSBKZWFuIElJCisgKi8KK2ludCBpcnR0cF9jbG9zZV90c2FwKHN0cnVjdCB0c2FwX2NiICpzZWxmKQoreworCXN0cnVjdCB0c2FwX2NiICp0c2FwOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJLyogTWFrZSBzdXJlIHRzYXAgaGFzIGJlZW4gZGlzY29ubmVjdGVkICovCisJaWYgKHNlbGYtPmNvbm5lY3RlZCkgeworCQkvKiBDaGVjayBpZiBkaXNjb25uZWN0IGlzIG5vdCBwZW5kaW5nICovCisJCWlmICghdGVzdF9iaXQoMCwgJnNlbGYtPmRpc2Nvbm5lY3RfcGVuZCkpIHsKKwkJCUlSREFfV0FSTklORygiJXM6IFRTQVAgc3RpbGwgY29ubmVjdGVkIVxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZiwgTlVMTCwgUF9OT1JNQUwpOworCQl9CisJCXNlbGYtPmNsb3NlX3BlbmQgPSBUUlVFOworCQlpcnR0cF9zdGFydF90b2RvX3RpbWVyKHNlbGYsIEhaLzEwKTsKKworCQlyZXR1cm4gMDsgLyogV2lsbCBiZSBiYWNrISAqLworCX0KKworCXRzYXAgPSBoYXNoYmluX3JlbW92ZShpcnR0cC0+dHNhcHMsIChsb25nKSBzZWxmLCBOVUxMKTsKKworCUlSREFfQVNTRVJUKHRzYXAgPT0gc2VsZiwgcmV0dXJuIC0xOyk7CisKKwkvKiBDbG9zZSBjb3JyZXNwb25kaW5nIExTQVAgKi8KKwlpZiAoc2VsZi0+bHNhcCkgeworCQlpcmxtcF9jbG9zZV9sc2FwKHNlbGYtPmxzYXApOworCQlzZWxmLT5sc2FwID0gTlVMTDsKKwl9CisKKwlfX2lydHRwX2Nsb3NlX3RzYXAoc2VsZik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXJ0dHBfY2xvc2VfdHNhcCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF91ZGF0YV9yZXF1ZXN0IChzZWxmLCBza2IpCisgKgorICogICAgU2VuZCB1bnJlbGlhYmxlIGRhdGEgb24gdGhpcyBUU0FQCisgKgorICovCitpbnQgaXJ0dHBfdWRhdGFfcmVxdWVzdChzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogQ2hlY2sgdGhhdCBub3RoaW5nIGJhZCBoYXBwZW5zICovCisJaWYgKChza2ItPmxlbiA9PSAwKSB8fCAoIXNlbGYtPmNvbm5lY3RlZCkpIHsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgTm8gZGF0YSwgb3Igbm90IGNvbm5lY3RlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChza2ItPmxlbiA+IHNlbGYtPm1heF9zZWdfc2l6ZSkgeworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVRGF0YSBpcyB0byBsYXJnZSBmb3IgSXJMQVAhXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZ290byBlcnI7CisJfQorCisJaXJsbXBfdWRhdGFfcmVxdWVzdChzZWxmLT5sc2FwLCBza2IpOworCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCXJldHVybiAwOworCitlcnI6CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAtMTsKK30KK0VYUE9SVF9TWU1CT0woaXJ0dHBfdWRhdGFfcmVxdWVzdCk7CisKKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2RhdGFfcmVxdWVzdCAoaGFuZGxlLCBza2IpCisgKgorICogICAgUXVldWUgZnJhbWUgZm9yIHRyYW5zbWlzc2lvbi4gSWYgU0FSIGlzIGVuYWJsZWQsIGZyYWdlbWVudCB0aGUgZnJhbWUKKyAqICAgIGFuZCBxdWV1ZSB0aGUgZnJhZ21lbnRzIGZvciB0cmFuc21pc3Npb24KKyAqLworaW50IGlydHRwX2RhdGFfcmVxdWVzdChzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3U4ICpmcmFtZTsKKwlpbnQgcmV0OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSA6IHF1ZXVlIGxlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4X3F1ZXVlKSk7CisKKwkvKiBDaGVjayB0aGF0IG5vdGhpbmcgYmFkIGhhcHBlbnMgKi8KKwlpZiAoKHNrYi0+bGVuID09IDApIHx8ICghc2VsZi0+Y29ubmVjdGVkKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBObyBkYXRhLCBvciBub3QgY29ubmVjdGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtRU5PVENPTk47CisJCWdvdG8gZXJyOworCX0KKworCS8qCisJICogIENoZWNrIGlmIFNBUiBpcyBkaXNhYmxlZCwgYW5kIHRoZSBmcmFtZSBpcyBsYXJnZXIgdGhhbiB3aGF0IGZpdHMKKwkgKiAgaW5zaWRlIGFuIElyTEFQIGZyYW1lCisJICovCisJaWYgKChzZWxmLT50eF9tYXhfc2R1X3NpemUgPT0gMCkgJiYgKHNrYi0+bGVuID4gc2VsZi0+bWF4X3NlZ19zaXplKSkgeworCQlJUkRBX0VSUk9SKCIlczogU0FSIGRpc2FibGVkLCBhbmQgZGF0YSBpcyB0byBsYXJnZSBmb3IgSXJMQVAhXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJcmV0ID0gLUVNU0dTSVpFOworCQlnb3RvIGVycjsKKwl9CisKKwkvKgorCSAqICBDaGVjayBpZiBTQVIgaXMgZW5hYmxlZCwgYW5kIHRoZSBmcmFtZSBpcyBsYXJnZXIgdGhhbiB0aGUKKwkgKiAgVHhNYXhTZHVTaXplCisJICovCisJaWYgKChzZWxmLT50eF9tYXhfc2R1X3NpemUgIT0gMCkgJiYKKwkgICAgKHNlbGYtPnR4X21heF9zZHVfc2l6ZSAhPSBUVFBfU0FSX1VOQk9VTkQpICYmCisJICAgIChza2ItPmxlbiA+IHNlbGYtPnR4X21heF9zZHVfc2l6ZSkpCisJeworCQlJUkRBX0VSUk9SKCIlczogU0FSIGVuYWJsZWQsIGJ1dCBkYXRhIGlzIGxhcmdlciB0aGFuIFR4TWF4U2R1U2l6ZSFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtRU1TR1NJWkU7CisJCWdvdG8gZXJyOworCX0KKwkvKgorCSAqICBDaGVjayBpZiB0cmFuc21pdCBxdWV1ZSBpcyBmdWxsCisJICovCisJaWYgKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4X3F1ZXVlKSA+PSBUVFBfVFhfTUFYX1FVRVVFKSB7CisJCS8qCisJCSAqICBHaXZlIGl0IGEgY2hhbmNlIHRvIGVtcHR5IGl0c2VsZgorCQkgKi8KKwkJaXJ0dHBfcnVuX3R4X3F1ZXVlKHNlbGYpOworCisJCS8qIERyb3AgcGFja2V0LiBUaGlzIGVycm9yIGNvZGUgc2hvdWxkIHRyaWdnZXIgdGhlIGNhbGxlcgorCQkgKiB0byByZXNlbmQgdGhlIGRhdGEgaW4gdGhlIGNsaWVudCBjb2RlIC0gSmVhbiBJSSAqLworCQlyZXQgPSAtRU5PQlVGUzsKKwkJZ290byBlcnI7CisJfQorCisJLyogUXVldWUgZnJhbWUsIG9yIHF1ZXVlIGZyYW1lIHNlZ21lbnRzICovCisJaWYgKChzZWxmLT50eF9tYXhfc2R1X3NpemUgPT0gMCkgfHwgKHNrYi0+bGVuIDwgc2VsZi0+bWF4X3NlZ19zaXplKSkgeworCQkvKiBRdWV1ZSBmcmFtZSAqLworCQlJUkRBX0FTU0VSVChza2JfaGVhZHJvb20oc2tiKSA+PSBUVFBfSEVBREVSLCByZXR1cm4gLTE7KTsKKwkJZnJhbWUgPSBza2JfcHVzaChza2IsIFRUUF9IRUFERVIpOworCQlmcmFtZVswXSA9IDB4MDA7IC8qIENsZWFyIG1vcmUgYml0ICovCisKKwkJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPnR4X3F1ZXVlLCBza2IpOworCX0gZWxzZSB7CisJCS8qCisJCSAqICBGcmFnbWVudCB0aGUgZnJhbWUsIHRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIHF1ZXVlIHRoZQorCQkgKiAgZnJhZ21lbnRzLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBmYWN0IHRoZSB0cmFuc21pdAorCQkgKiAgcXVldWUgbWF5IGJlIG92ZXJmaWxsZWQgYnkgYWxsIHRoZSBzZWdtZW50cyBmb3IgYSBsaXR0bGUKKwkJICogIHdoaWxlCisJCSAqLworCQlpcnR0cF9mcmFnbWVudF9za2Ioc2VsZiwgc2tiKTsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gYWNjZXB0IG1vcmUgZGF0YSBmcm9tIGNsaWVudCAqLworCWlmICgoIXNlbGYtPnR4X3NkdV9idXN5KSAmJgorCSAgICAoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhfcXVldWUpID4gVFRQX1RYX0hJR0hfVEhSRVNIT0xEKSkgeworCQkvKiBUeCBxdWV1ZSBmaWxsaW5nIHVwLCBzbyBzdG9wIGNsaWVudC4gKi8KKwkJaWYgKHNlbGYtPm5vdGlmeS5mbG93X2luZGljYXRpb24pIHsKKwkJCXNlbGYtPm5vdGlmeS5mbG93X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLAorCQkJCQkJICAgICBzZWxmLCBGTE9XX1NUT1ApOworCQl9CisJCS8qIHNlbGYtPnR4X3NkdV9idXN5IGlzIHRoZSBzdGF0ZSBvZiB0aGUgY2xpZW50LgorCQkgKiBVcGRhdGUgc3RhdGUgYWZ0ZXIgbm90aWZ5aW5nIGNsaWVudCB0byBhdm9pZAorCQkgKiByYWNlIGNvbmRpdGlvbiB3aXRoIGlydHRwX2Zsb3dfaW5kaWNhdGlvbigpLgorCQkgKiBJZiB0aGUgcXVldWUgZW1wdHkgaXRzZWxmIGFmdGVyIG91ciB0ZXN0IGJ1dCBiZWZvcmUKKwkJICogd2Ugc2V0IHRoZSBmbGFnLCB3ZSB3aWxsIGZpeCBvdXJzZWx2ZXMgYmVsb3cgaW4KKwkJICogaXJ0dHBfcnVuX3R4X3F1ZXVlKCkuCisJCSAqIEplYW4gSUkgKi8KKwkJc2VsZi0+dHhfc2R1X2J1c3kgPSBUUlVFOworCX0KKworCS8qIFRyeSB0byBtYWtlIHNvbWUgcHJvZ3Jlc3MgKi8KKwlpcnR0cF9ydW5fdHhfcXVldWUoc2VsZik7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpcnR0cF9kYXRhX3JlcXVlc3QpOworCisvKgorICogRnVuY3Rpb24gaXJ0dHBfcnVuX3R4X3F1ZXVlIChzZWxmKQorICoKKyAqICAgIFRyYW5zbWl0IHBhY2tldHMgcXVldWVkIGZvciB0cmFuc21pc3Npb24gKGlmIHBvc3NpYmxlKQorICoKKyAqLworc3RhdGljIHZvaWQgaXJ0dHBfcnVuX3R4X3F1ZXVlKHN0cnVjdCB0c2FwX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbjsKKworCUlSREFfREVCVUcoMiwgIiVzKCkgOiBzZW5kX2NyZWRpdCA9ICVkLCBxdWV1ZV9sZW4gPSAlZFxuIiwKKwkJICAgX19GVU5DVElPTl9fLAorCQkgICBzZWxmLT5zZW5kX2NyZWRpdCwgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhfcXVldWUpKTsKKworCS8qIEdldCBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSB0eCBxdWV1ZSwgb3RoZXJ3aXNlIGRvbid0IHRvdWNoIGl0ICovCisJaWYgKGlyZGFfbG9jaygmc2VsZi0+dHhfcXVldWVfbG9jaykgPT0gRkFMU0UpCisJCXJldHVybjsKKworCS8qIFRyeSB0byBzZW5kIG91dCBmcmFtZXMgYXMgbG9uZyBhcyB3ZSBoYXZlIGNyZWRpdHMKKwkgKiBhbmQgYXMgbG9uZyBhcyBMQVAgaXMgbm90IGZ1bGwuIElmIExBUCBpcyBmdWxsLCBpdCB3aWxsCisJICogcG9sbCB1cyB0aHJvdWdoIGlydHRwX2Zsb3dfaW5kaWNhdGlvbigpIC0gSmVhbiBJSSAqLworCXdoaWxlICgoc2VsZi0+c2VuZF9jcmVkaXQgPiAwKSAmJgorCSAgICAgICAoIWlybG1wX2xhcF90eF9xdWV1ZV9mdWxsKHNlbGYtPmxzYXApKSAmJgorCSAgICAgICAoc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPnR4X3F1ZXVlKSkpCisJeworCQkvKgorCQkgKiAgU2luY2Ugd2UgY2FuIHRyYW5zbWl0IGFuZCByZWNlaXZlIGZyYW1lcyBjb25jdXJyZW50bHksCisJCSAqICB0aGUgY29kZSBiZWxvdyBpcyBhIGNyaXRpY2FsIHJlZ2lvbiBhbmQgd2UgbXVzdCBhc3N1cmUgdGhhdAorCQkgKiAgbm9ib2R5IG1lc3NlcyB3aXRoIHRoZSBjcmVkaXRzIHdoaWxlIHdlIHVwZGF0ZSB0aGVtLgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCQluID0gc2VsZi0+YXZhaWxfY3JlZGl0OworCQlzZWxmLT5hdmFpbF9jcmVkaXQgPSAwOworCisJCS8qIE9ubHkgcm9vbSBmb3IgMTI3IGNyZWRpdHMgaW4gZnJhbWUgKi8KKwkJaWYgKG4gPiAxMjcpIHsKKwkJCXNlbGYtPmF2YWlsX2NyZWRpdCA9IG4tMTI3OworCQkJbiA9IDEyNzsKKwkJfQorCQlzZWxmLT5yZW1vdGVfY3JlZGl0ICs9IG47CisJCXNlbGYtPnNlbmRfY3JlZGl0LS07CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJCS8qCisJCSAqICBNb3JlIGJpdCBtdXN0IGJlIHNldCBieSB0aGUgZGF0YV9yZXF1ZXN0KCkgb3IgZnJhZ21lbnQoKQorCQkgKiAgZnVuY3Rpb25zCisJCSAqLworCQlza2ItPmRhdGFbMF0gfD0gKG4gJiAweDdmKTsKKworCQkvKiBEZXRhY2ggZnJvbSBzb2NrZXQuCisJCSAqIFRoZSBjdXJyZW50IHNrYiBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIHNvY2tldCB0aGF0IHNlbnQKKwkJICogaXQgKHNrYi0+c2spLiBXaGVuIHdlIHBhc3MgaXQgdG8gSXJMTVAsIHRoZSBza2Igd2lsbCBiZQorCQkgKiBzdG9yZWQgaW4gaW4gSXJMQVAgKHNlbGYtPnd4X2xpc3QpLiBXaGVuIHdlIGFyZSB3aXRoaW4KKwkJICogSXJMQVAsIHdlIGxvc2UgdGhlIG5vdGlvbiBvZiBzb2NrZXQsIHNvIHdlIHNob3VsZCBub3QKKwkJICogaGF2ZSBhIHJlZmVyZW5jZSB0byBhIHNvY2tldC4gU28sIHdlIGRyb3AgaXQgaGVyZS4KKwkJICoKKwkJICogV2h5IGRvZXMgaXQgbWF0dGVyID8KKwkJICogV2hlbiB0aGUgc2tiIGlzIGZyZWVkIChrZnJlZV9za2IpLCBpZiBpdCBpcyBhc3NvY2lhdGVkCisJCSAqIHdpdGggYSBzb2NrZXQsIGl0IHJlbGVhc2UgYnVmZmVyIHNwYWNlIG9uIHRoZSBzb2NrZXQKKwkJICogKHRocm91Z2ggc29ja193ZnJlZSgpIGFuZCBzb2NrX2RlZl93cml0ZV9zcGFjZSgpKS4KKwkJICogSWYgdGhlIHNvY2tldCBubyBsb25nZXIgZXhpc3QsIHdlIG1heSBjcmFzaC4gSGFyZC4KKwkJICogV2hlbiB3ZSBjbG9zZSBhIHNvY2tldCwgd2UgbWFrZSBzdXJlIHRoYXQgYXNzb2NpYXRlZCBwYWNrZXRzCisJCSAqIGluIElyVFRQIGFyZSBmcmVlZC4gSG93ZXZlciwgd2UgaGF2ZSBubyB3YXkgdG8gY2FuY2VsCisJCSAqIHRoZSBwYWNrZXQgdGhhdCB3ZSBoYXZlIHBhc3NlZCB0byBJckxBUC4gU28sIGlmIGEgcGFja2V0CisJCSAqIHJlbWFpbnMgaW4gSXJMQVAgKHJldHJ5IG9uIHRoZSBsaW5rIG9yIGVsc2UpIGFmdGVyIHdlCisJCSAqIGNsb3NlIHRoZSBzb2NrZXQsIHdlIGFyZSBkZWFkICEKKwkJICogSmVhbiBJSSAqLworCQlpZiAoc2tiLT5zayAhPSBOVUxMKSB7CisJCQkvKiBJclNPQ0sgYXBwbGljYXRpb24sIElyT0JFWCwgLi4uICovCisJCQlza2Jfb3JwaGFuKHNrYik7CisJCX0KKwkJCS8qIElyQ09NTSBvdmVyIElyVFRQLCBJckxBTiwgLi4uICovCisKKwkJLyogUGFzcyB0aGUgc2tiIHRvIElyTE1QIC0gZG9uZSAqLworCQlpcmxtcF9kYXRhX3JlcXVlc3Qoc2VsZi0+bHNhcCwgc2tiKTsKKwkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCX0KKworCS8qIENoZWNrIGlmIHdlIGNhbiBhY2NlcHQgbW9yZSBmcmFtZXMgZnJvbSBjbGllbnQuCisJICogV2UgZG9uJ3Qgd2FudCB0byB3YWl0IHVudGlsIHRoZSB0b2RvIHRpbWVyIHRvIGRvIHRoYXQsIGFuZCB3ZQorCSAqIGNhbid0IHVzZSB0YXNrbGV0cyAoZ3JyLi4uKSwgc28gd2UgYXJlIG9ibGlnZWQgdG8gZ2l2ZSBjb250cm9sCisJICogdG8gY2xpZW50LiBUaGF0J3Mgb2ssIHRoaXMgdGVzdCB3aWxsIGJlIHRydWUgbm90IHRvbyBvZnRlbgorCSAqIChtYXggb25jZSBwZXIgTEFQIHdpbmRvdykgYW5kIHdlIGFyZSBjYWxsZWQgZnJvbSBwbGFjZXMKKwkgKiB3aGVyZSB3ZSBjYW4gc3BlbmQgYSBiaXQgb2YgdGltZSBkb2luZyBzdHVmZi4gLSBKZWFuIElJICovCisJaWYgKChzZWxmLT50eF9zZHVfYnVzeSkgJiYKKwkgICAgKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4X3F1ZXVlKSA8IFRUUF9UWF9MT1dfVEhSRVNIT0xEKSAmJgorCSAgICAoIXNlbGYtPmNsb3NlX3BlbmQpKQorCXsKKwkJaWYgKHNlbGYtPm5vdGlmeS5mbG93X2luZGljYXRpb24pCisJCQlzZWxmLT5ub3RpZnkuZmxvd19pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwKKwkJCQkJCSAgICAgc2VsZiwgRkxPV19TVEFSVCk7CisKKwkJLyogc2VsZi0+dHhfc2R1X2J1c3kgaXMgdGhlIHN0YXRlIG9mIHRoZSBjbGllbnQuCisJCSAqIFdlIGRvbid0IHJlYWxseSBoYXZlIGEgcmFjZSBoZXJlLCBidXQgaXQncyBhbHdheXMgc2FmZXIKKwkJICogdG8gdXBkYXRlIG91ciBzdGF0ZSBhZnRlciB0aGUgY2xpZW50IC0gSmVhbiBJSSAqLworCQlzZWxmLT50eF9zZHVfYnVzeSA9IEZBTFNFOworCX0KKworCS8qIFJlc2V0IGxvY2sgKi8KKwlzZWxmLT50eF9xdWV1ZV9sb2NrID0gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2dpdmVfY3JlZGl0IChzZWxmKQorICoKKyAqICAgIFNlbmQgYSBkYXRhbGVzcyBmbG93ZGF0YSBUVFAtUERVIGFuZCBnaXZlIGF2YWlsYWJsZSBjcmVkaXQgdG8gcGVlcgorICogICAgVFNBUAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJ0dHBfZ2l2ZV9jcmVkaXQoc3RydWN0IHRzYXBfY2IgKnNlbGYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSBzZW5kPSVkLGF2YWlsPSVkLHJlbW90ZT0lZFxuIiwKKwkJICAgX19GVU5DVElPTl9fLAorCQkgICBzZWxmLT5zZW5kX2NyZWRpdCwgc2VsZi0+YXZhaWxfY3JlZGl0LCBzZWxmLT5yZW1vdGVfY3JlZGl0KTsKKworCS8qIEdpdmUgY3JlZGl0IHRvIHBlZXIgKi8KKwl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKKwlpZiAoIXR4X3NrYikKKwkJcmV0dXJuOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTE1QLCBhbmQgTEFQIGhlYWRlciAqLworCXNrYl9yZXNlcnZlKHR4X3NrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKworCS8qCisJICogIFNpbmNlIHdlIGNhbiB0cmFuc21pdCBhbmQgcmVjZWl2ZSBmcmFtZXMgY29uY3VycmVudGx5LAorCSAqICB0aGUgY29kZSBiZWxvdyBpcyBhIGNyaXRpY2FsIHJlZ2lvbiBhbmQgd2UgbXVzdCBhc3N1cmUgdGhhdAorCSAqICBub2JvZHkgbWVzc2VzIHdpdGggdGhlIGNyZWRpdHMgd2hpbGUgd2UgdXBkYXRlIHRoZW0uCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCW4gPSBzZWxmLT5hdmFpbF9jcmVkaXQ7CisJc2VsZi0+YXZhaWxfY3JlZGl0ID0gMDsKKworCS8qIE9ubHkgc3BhY2UgZm9yIDEyNyBjcmVkaXRzIGluIGZyYW1lICovCisJaWYgKG4gPiAxMjcpIHsKKwkJc2VsZi0+YXZhaWxfY3JlZGl0ID0gbiAtIDEyNzsKKwkJbiA9IDEyNzsKKwl9CisJc2VsZi0+cmVtb3RlX2NyZWRpdCArPSBuOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJc2tiX3B1dCh0eF9za2IsIDEpOworCXR4X3NrYi0+ZGF0YVswXSA9IChfX3U4KSAobiAmIDB4N2YpOworCisJaXJsbXBfZGF0YV9yZXF1ZXN0KHNlbGYtPmxzYXAsIHR4X3NrYik7CisJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHBfdWRhdGFfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgc2tiKQorICoKKyAqICAgIFJlY2VpdmVkIHNvbWUgdW5pdC1kYXRhICh1bnJlbGlhYmxlKQorICoKKyAqLworc3RhdGljIGludCBpcnR0cF91ZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0c2FwX2NiICpzZWxmOworCWludCBlcnI7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCS8qIEp1c3QgcGFzcyBkYXRhIHRvIGxheWVyIGFib3ZlICovCisJaWYgKHNlbGYtPm5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uKSB7CisJCWVyciA9IHNlbGYtPm5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwKKwkJCQkJCSAgICBzZWxmLHNrYik7CisJCS8qIFNhbWUgY29tbWVudCBhcyBpbiBpcnR0cF9kb19kYXRhX2luZGljYXRpb24oKSAqLworCQlpZiAoIWVycikgCisJCQlyZXR1cm4gMDsKKwl9CisJLyogRWl0aGVyIG5vIGhhbmRsZXIsIG9yIGhhbmRsZXIgcmV0dXJucyBhbiBlcnJvciAqLworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHBfZGF0YV9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBza2IpCisgKgorICogICAgUmVjZWl2ZSBzZWdtZW50IGZyb20gSXJMTVAuCisgKgorICovCitzdGF0aWMgaW50IGlydHRwX2RhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0c2FwX2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG47CisKKwlzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOworCisJbiA9IHNrYi0+ZGF0YVswXSAmIDB4N2Y7ICAgICAvKiBFeHRyYWN0IHRoZSBjcmVkaXRzICovCisKKwlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisKKwkvKiAgRGVhbCB3aXRoIGluYm91bmQgY3JlZGl0CisJICogIFNpbmNlIHdlIGNhbiB0cmFuc21pdCBhbmQgcmVjZWl2ZSBmcmFtZXMgY29uY3VycmVudGx5LAorCSAqICB0aGUgY29kZSBiZWxvdyBpcyBhIGNyaXRpY2FsIHJlZ2lvbiBhbmQgd2UgbXVzdCBhc3N1cmUgdGhhdAorCSAqICBub2JvZHkgbWVzc2VzIHdpdGggdGhlIGNyZWRpdHMgd2hpbGUgd2UgdXBkYXRlIHRoZW0uCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlzZWxmLT5zZW5kX2NyZWRpdCArPSBuOworCWlmIChza2ItPmxlbiA+IDEpCisJCXNlbGYtPnJlbW90ZV9jcmVkaXQtLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqICBEYXRhIG9yIGRhdGFsZXNzIHBhY2tldD8gRGF0YWxlc3MgZnJhbWVzIGNvbnRhaW5zIG9ubHkgdGhlCisJICogIFRUUF9IRUFERVIuCisJICovCisJaWYgKHNrYi0+bGVuID4gMSkgeworCQkvKgorCQkgKiAgV2UgZG9uJ3QgcmVtb3ZlIHRoZSBUVFAgaGVhZGVyLCBzaW5jZSB3ZSBtdXN0IHByZXNlcnZlIHRoZQorCQkgKiAgbW9yZSBiaXQsIHNvIHRoZSBkZWZyYWdtZW50IHJvdXRpbmcga25vd3Mgd2hhdCB0byBkbworCQkgKi8KKwkJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPnJ4X3F1ZXVlLCBza2IpOworCX0gZWxzZSB7CisJCS8qIERhdGFsZXNzIGZsb3dkYXRhIFRUUC1QRFUgKi8KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKworCisJLyogUHVzaCBkYXRhIHRvIHRoZSBoaWdoZXIgbGF5ZXIuCisJICogV2UgZG8gaXQgc3luY2hyb25vdXNseSBiZWNhdXNlIHJ1bm5pbmcgdGhlIHRvZG8gdGltZXIgZm9yIGVhY2gKKwkgKiByZWNlaXZlIHBhY2tldCB3b3VsZCBiZSB0b28gbXVjaCBvdmVyaGVhZCBhbmQgbGF0ZW5jeS4KKwkgKiBCeSBwYXNzaW5nIGNvbnRyb2wgdG8gdGhlIGhpZ2hlciBsYXllciwgd2UgcnVuIHRoZSByaXNrIHRoYXQKKwkgKiBpdCBtYXkgdGFrZSB0aW1lIG9yIGdyYWIgYSBsb2NrLiBNb3N0IG9mdGVuLCB0aGUgaGlnaGVyIGxheWVyCisJICogd2lsbCBvbmx5IHB1dCBwYWNrZXQgaW4gYSBxdWV1ZS4KKwkgKiBBbnl3YXksIHBhY2tldHMgYXJlIG9ubHkgZHJpcHBpbmcgdGhyb3VnaCB0aGUgSXJEQSwgc28gd2UgY2FuCisJICogaGF2ZSB0aW1lIGJlZm9yZSB0aGUgbmV4dCBwYWNrZXQuCisJICogRnVydGhlciwgd2UgYXJlIHJ1biBmcm9tIE5FVF9CSCwgc28gdGhlIHdvcnNlIHRoYXQgY2FuIGhhcHBlbiBpcworCSAqIHVzIG1pc3NpbmcgdGhlIG9wdGltYWwgdGltZSB0byBzZW5kIGJhY2sgdGhlIFBGIGJpdCBpbiBMQVAuCisJICogSmVhbiBJSSAqLworCWlydHRwX3J1bl9yeF9xdWV1ZShzZWxmKTsKKworCS8qIFdlIG5vdyBnaXZlIGNyZWRpdHMgdG8gcGVlciBpbiBpcnR0cF9ydW5fcnhfcXVldWUoKS4KKwkgKiBXZSBuZWVkIHRvIHNlbmQgY3JlZGl0ICpOT1cqLCBvdGhlcndpc2Ugd2UgYXJlIGdvaW5nCisJICogdG8gbWlzcyB0aGUgbmV4dCBUeCB3aW5kb3cuIFRoZSB0b2RvIHRpbWVyIG1heSB0YWtlCisJICogYSB3aGlsZSBiZWZvcmUgaXQncyBydW4uLi4gLSBKZWFuIElJICovCisKKwkvKgorCSAqIElmIHRoZSBwZWVyIGRldmljZSBoYXMgZ2l2ZW4gdXMgc29tZSBjcmVkaXRzIGFuZCB3ZSBkaWRuJ3QgaGF2ZQorICAgICAgICAgKiBhbnlvbmUgZnJvbSBiZWZvcmUsIHRoZW4gd2UgbmVlZCB0byBzaGVkdWxlIHRoZSB0eCBxdWV1ZS4KKwkgKiBXZSBuZWVkIHRvIGRvIHRoYXQgYmVjYXVzZSBvdXIgVHggaGF2ZSBzdG9wcGVkIChzbyB3ZSBtYXkgbm90CisJICogZ2V0IGFueSBMQVAgZmxvdyBpbmRpY2F0aW9uKSBhbmQgdGhlIHVzZXIgbWF5IGJlIHN0b3BwZWQgYXMKKwkgKiB3ZWxsLiAtIEplYW4gSUkKKwkgKi8KKwlpZiAoc2VsZi0+c2VuZF9jcmVkaXQgPT0gbikgeworCQkvKiBSZXN0YXJ0IHB1c2hpbmcgc3R1ZmYgdG8gTEFQICovCisJCWlydHRwX3J1bl90eF9xdWV1ZShzZWxmKTsKKwkJLyogTm90ZSA6IHdlIGRvbid0IHdhbnQgdG8gc2NoZWR1bGUgdGhlIHRvZG8gdGltZXIKKwkJICogYmVjYXVzZSBpdCBoYXMgaG9ycmlibGUgbGF0ZW5jeS4gTm8gdGFza2xldHMKKwkJICogYmVjYXVzZSB0aGUgdGFza2xldCBBUEkgaXMgYnJva2VuLiAtIEplYW4gSUkgKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX3N0YXR1c19pbmRpY2F0aW9uIChzZWxmLCByZWFzb24pCisgKgorICogICAgU3RhdHVzX2luZGljYXRpb24sIGp1c3QgcGFzcyB0byB0aGUgaGlnaGVyIGxheWVyLi4uCisgKgorICovCitzdGF0aWMgdm9pZCBpcnR0cF9zdGF0dXNfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwKKwkJCQkgICAgTElOS19TVEFUVVMgbGluaywgTE9DS19TVEFUVVMgbG9jaykKK3sKKwlzdHJ1Y3QgdHNhcF9jYiAqc2VsZjsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBDaGVjayBpZiBjbGllbnQgaGFzIGFscmVhZHkgY2xvc2VkIHRoZSBUU0FQIGFuZCBnb25lIGF3YXkgKi8KKwlpZiAoc2VsZi0+Y2xvc2VfcGVuZCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiAgSW5mb3JtIHNlcnZpY2UgdXNlciBpZiBoZSBoYXMgcmVxdWVzdGVkIGl0CisJICovCisJaWYgKHNlbGYtPm5vdGlmeS5zdGF0dXNfaW5kaWNhdGlvbiAhPSBOVUxMKQorCQlzZWxmLT5ub3RpZnkuc3RhdHVzX2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLAorCQkJCQkgICAgICAgbGluaywgbG9jayk7CisJZWxzZQorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBubyBoYW5kbGVyXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHBfZmxvd19pbmRpY2F0aW9uIChzZWxmLCByZWFzb24pCisgKgorICogICAgRmxvd19pbmRpY2F0aW9uIDogSXJMQVAgdGVsbHMgdXMgdG8gc2VuZCBtb3JlIGRhdGEuCisgKgorICovCitzdGF0aWMgdm9pZCBpcnR0cF9mbG93X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgTE9DQUxfRkxPVyBmbG93KQoreworCXN0cnVjdCB0c2FwX2NiICpzZWxmOworCisJc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOworCisJSVJEQV9ERUJVRyg0LCAiJXMoaW5zdGFuY2U9JXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOworCisJLyogV2UgYXJlICJwb2xsZWQiIGRpcmVjdGx5IGZyb20gTEFQLCBhbmQgdGhlIExBUCB3YW50IHRvIGZpbGwKKwkgKiBpdHMgVHggd2luZG93LiBXZSB3YW50IHRvIGRvIG91ciBiZXN0IHRvIHNlbmQgaXQgZGF0YSwgc28gdGhhdAorCSAqIHdlIG1heGltaXNlIHRoZSB3aW5kb3cuIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSB3YW50IHRvIGxpbWl0IHRoZQorCSAqIGFtb3VudCBvZiB3b3JrIGhlcmUgc28gdGhhdCBMQVAgZG9lc24ndCBoYW5nIGZvcmV2ZXIgd2FpdGluZworCSAqIGZvciBwYWNrZXRzLiAtIEplYW4gSUkgKi8KKworCS8qIFRyeSB0byBzZW5kIHNvbWUgcGFja2V0cy4gQ3VycmVudGx5LCBMQVAgY2FsbHMgdXMgZXZlcnkgdGltZQorCSAqIHRoZXJlIGlzIG9uZSBmcmVlIHNsb3QsIHNvIHdlIHdpbGwgc2VuZCBvbmx5IG9uZSBwYWNrZXQuCisJICogVGhpcyBhbGxvdyB0aGUgc2NoZWR1bGVyIHRvIGRvIGl0cyByb3VuZCByb2JpbiAtIEplYW4gSUkgKi8KKwlpcnR0cF9ydW5fdHhfcXVldWUoc2VsZik7CisKKwkvKiBOb3RlIHJlZ2FyZGluZyB0aGUgaW50ZXJyYWN0aW9uIHdpdGggaGlnaGVyIGxheWVyLgorCSAqIGlydHRwX3J1bl90eF9xdWV1ZSgpIG1heSBjYWxsIHRoZSBjbGllbnQgd2hlbiBpdHMgcXVldWUKKwkgKiBzdGFydCB0byBlbXB0eSwgdmlhIG5vdGlmeS5mbG93X2luZGljYXRpb24oKS4gSW5pdGlhbGx5LgorCSAqIEkgd2FudGVkIHRoaXMgdG8gaGFwcGVuIGluIGEgdGFza2xldCwgdG8gYXZvaWQgY2xpZW50CisJICogZ3JhYmJpbmcgdGhlIENQVSwgYnV0IHdlIGNhbid0IHVzZSB0YXNrbGV0cyBzYWZlbHkuIEFuZCB0aW1lcgorCSAqIGlzIGRlZmluaXRlbHkgdG9vIHNsb3cuCisJICogVGhpcyB3aWxsIGhhcHBlbiBvbmx5IG9uY2UgcGVyIExBUCB3aW5kb3csIGFuZCB1c3VhbGx5IGF0CisJICogdGhlIHRoaXJkIHBhY2tldCAodW5sZXNzIHdpbmRvdyBpcyBzbWFsbGVyKS4gTEFQIGlzIHN0aWxsCisJICogZG9pbmcgbXR0IGFuZCBzZW5kaW5nIGZpcnN0IHBhY2tldCBzbyBpdCdzIHNvcnQgb2YgT0sKKwkgKiB0byBkbyB0aGF0LiBKZWFuIElJICovCisKKwkvKiBJZiB3ZSBuZWVkIHRvIHNlbmQgZGlzY29ubmVjdC4gdHJ5IHRvIGRvIGl0IG5vdyAqLworCWlmKHNlbGYtPmRpc2Nvbm5lY3RfcGVuZCkKKwkJaXJ0dHBfc3RhcnRfdG9kb190aW1lcihzZWxmLCAwKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2Zsb3dfcmVxdWVzdCAoc2VsZiwgY29tbWFuZCkKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIHVzZWQgYnkgdGhlIHVwcGVyIGxheWVycyB0byB0ZWxsIElyVFRQIHRvIHN0b3AKKyAqICAgIGRlbGl2ZXJpbmcgZnJhbWVzIGlmIHRoZSByZWNlaXZlIHF1ZXVlcyBhcmUgc3RhcnRpbmcgdG8gZ2V0IGZ1bGwsIG9yCisgKiAgICB0byB0ZWxsIElyVFRQIHRvIHN0YXJ0IGRlbGl2ZXJpbmcgZnJhbWVzIGFnYWluLgorICovCit2b2lkIGlydHRwX2Zsb3dfcmVxdWVzdChzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgTE9DQUxfRkxPVyBmbG93KQoreworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKKworCXN3aXRjaCAoZmxvdykgeworCWNhc2UgRkxPV19TVE9QOgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBmbG93IHN0b3BcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNlbGYtPnJ4X3NkdV9idXN5ID0gVFJVRTsKKwkJYnJlYWs7CisJY2FzZSBGTE9XX1NUQVJUOgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBmbG93IHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOworCQlzZWxmLT5yeF9zZHVfYnVzeSA9IEZBTFNFOworCisJCS8qIENsaWVudCBzYXkgaGUgY2FuIGFjY2VwdCBtb3JlIGRhdGEsIHRyeSB0byBmcmVlIG91cgorCQkgKiBxdWV1ZXMgQVNBUCAtIEplYW4gSUkgKi8KKwkJaXJ0dHBfcnVuX3J4X3F1ZXVlKHNlbGYpOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVua25vd24gZmxvdyBjb21tYW5kIVxuIiwgX19GVU5DVElPTl9fKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlydHRwX2Zsb3dfcmVxdWVzdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9jb25uZWN0X3JlcXVlc3QgKHNlbGYsIGR0c2FwX3NlbCwgZGFkZHIsIHFvcykKKyAqCisgKiAgICBUcnkgdG8gY29ubmVjdCB0byByZW1vdGUgZGVzdGluYXRpb24gVFNBUCBzZWxlY3RvcgorICoKKyAqLworaW50IGlydHRwX2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgX191OCBkdHNhcF9zZWwsCisJCQkgIF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKKwkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZHVfc2l6ZSwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJX191OCAqZnJhbWU7CisJX191OCBuOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbWF4X3NkdV9zaXplPSVkXG4iLCBfX0ZVTkNUSU9OX18sIG1heF9zZHVfc2l6ZSk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtRUJBRFI7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC1FQkFEUjspOworCisJaWYgKHNlbGYtPmNvbm5lY3RlZCkgeworCQlpZih1c2VyZGF0YSkKKwkJCWRldl9rZnJlZV9za2IodXNlcmRhdGEpOworCQlyZXR1cm4gLUVJU0NPTk47CisJfQorCisJLyogQW55IHVzZXJkYXRhIHN1cHBsaWVkPyAqLworCWlmICh1c2VyZGF0YSA9PSBOVUxMKSB7CisJCXR4X3NrYiA9IGRldl9hbGxvY19za2IoNjQpOworCQlpZiAoIXR4X3NrYikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIFJlc2VydmUgc3BhY2UgZm9yIE1VWF9DT05UUk9MIGFuZCBMQVAgaGVhZGVyICovCisJCXNrYl9yZXNlcnZlKHR4X3NrYiwgVFRQX01BWF9IRUFERVIpOworCX0gZWxzZSB7CisJCXR4X3NrYiA9IHVzZXJkYXRhOworCQkvKgorCQkgKiAgQ2hlY2sgdGhhdCB0aGUgY2xpZW50IGhhcyByZXNlcnZlZCBlbm91Z2ggc3BhY2UgZm9yCisJCSAqICBoZWFkZXJzCisJCSAqLworCQlJUkRBX0FTU0VSVChza2JfaGVhZHJvb20odXNlcmRhdGEpID49IFRUUF9NQVhfSEVBREVSLAorCQkJeyBkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsgcmV0dXJuIC0xOyB9ICk7CisJfQorCisJLyogSW5pdGlhbGl6ZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgKi8KKwlzZWxmLT5jb25uZWN0ZWQgPSBGQUxTRTsKKwlzZWxmLT5hdmFpbF9jcmVkaXQgPSAwOworCXNlbGYtPnJ4X21heF9zZHVfc2l6ZSA9IG1heF9zZHVfc2l6ZTsKKwlzZWxmLT5yeF9zZHVfc2l6ZSA9IDA7CisJc2VsZi0+cnhfc2R1X2J1c3kgPSBGQUxTRTsKKwlzZWxmLT5kdHNhcF9zZWwgPSBkdHNhcF9zZWw7CisKKwluID0gc2VsZi0+aW5pdGlhbF9jcmVkaXQ7CisKKwlzZWxmLT5yZW1vdGVfY3JlZGl0ID0gMDsKKwlzZWxmLT5zZW5kX2NyZWRpdCA9IDA7CisKKwkvKgorCSAqICBHaXZlIGF3YXkgbWF4IDEyNyBjcmVkaXRzIGZvciBub3cKKwkgKi8KKwlpZiAobiA+IDEyNykgeworCQlzZWxmLT5hdmFpbF9jcmVkaXQ9bi0xMjc7CisJCW4gPSAxMjc7CisJfQorCisJc2VsZi0+cmVtb3RlX2NyZWRpdCA9IG47CisKKwkvKiBTQVIgZW5hYmxlZD8gKi8KKwlpZiAobWF4X3NkdV9zaXplID4gMCkgeworCQlJUkRBX0FTU0VSVChza2JfaGVhZHJvb20odHhfc2tiKSA+PSAoVFRQX01BWF9IRUFERVIgKyBUVFBfU0FSX0hFQURFUiksCisJCQl7IGRldl9rZnJlZV9za2IodHhfc2tiKTsgcmV0dXJuIC0xOyB9ICk7CisKKwkJLyogSW5zZXJ0IFNBUiBwYXJhbWV0ZXJzICovCisJCWZyYW1lID0gc2tiX3B1c2godHhfc2tiLCBUVFBfSEVBREVSK1RUUF9TQVJfSEVBREVSKTsKKworCQlmcmFtZVswXSA9IFRUUF9QQVJBTUVURVJTIHwgbjsKKwkJZnJhbWVbMV0gPSAweDA0OyAvKiBMZW5ndGggKi8KKwkJZnJhbWVbMl0gPSAweDAxOyAvKiBNYXhTZHVTaXplICovCisJCWZyYW1lWzNdID0gMHgwMjsgLyogVmFsdWUgbGVuZ3RoICovCisKKwkJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmUxNigoX191MTYpIG1heF9zZHVfc2l6ZSksCisJCQkgICAgICAoX191MTYgKikoZnJhbWUrNCkpOworCX0gZWxzZSB7CisJCS8qIEluc2VydCBwbGFpbiBUVFAgaGVhZGVyICovCisJCWZyYW1lID0gc2tiX3B1c2godHhfc2tiLCBUVFBfSEVBREVSKTsKKworCQkvKiBJbnNlcnQgaW5pdGlhbCBjcmVkaXQgaW4gZnJhbWUgKi8KKwkJZnJhbWVbMF0gPSBuICYgMHg3ZjsKKwl9CisKKwkvKiBDb25uZWN0IHdpdGggSXJMTVAuIE5vIFFvUyBwYXJhbWV0ZXJzIGZvciBub3cgKi8KKwlyZXR1cm4gaXJsbXBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmxzYXAsIGR0c2FwX3NlbCwgc2FkZHIsIGRhZGRyLCBxb3MsCisJCQkJICAgICB0eF9za2IpOworfQorRVhQT1JUX1NZTUJPTChpcnR0cF9jb25uZWN0X3JlcXVlc3QpOworCisvKgorICogRnVuY3Rpb24gaXJ0dHBfY29ubmVjdF9jb25maXJtIChoYW5kbGUsIHFvcywgc2tiKQorICoKKyAqICAgIFNldmljZSB1c2VyIGNvbmZpcm1zIFRTQVAgY29ubmVjdGlvbiB3aXRoIHBlZXIuCisgKgorICovCitzdGF0aWMgdm9pZCBpcnR0cF9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCBfX3UzMiBtYXhfc2VnX3NpemUsCisJCQkJICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdHNhcF9jYiAqc2VsZjsKKwlpbnQgcGFyYW1ldGVyczsKKwlpbnQgcmV0OworCV9fdTggcGxlbjsKKwlfX3U4IG47CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCXNlbGYtPm1heF9zZWdfc2l6ZSA9IG1heF9zZWdfc2l6ZSAtIFRUUF9IRUFERVI7CisJc2VsZi0+bWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplICsgVFRQX0hFQURFUjsKKworCS8qCisJICogIENoZWNrIGlmIHdlIGhhdmUgZ290IHNvbWUgUW9TIHBhcmFtZXRlcnMgYmFjayEgVGhpcyBzaG91bGQgYmUgdGhlCisJICogIG5lZ290aWF0ZWQgUW9TIGZvciB0aGUgbGluay4KKwkgKi8KKwlpZiAocW9zKSB7CisJCUlSREFfREVCVUcoNCwgIklyVFRQLCBOZWdvdGlhdGVkIEJBVURfUkFURTogJTAyeFxuIiwKKwkJICAgICAgIHFvcy0+YmF1ZF9yYXRlLmJpdHMpOworCQlJUkRBX0RFQlVHKDQsICJJclRUUCwgTmVnb3RpYXRlZCBCQVVEX1JBVEU6ICVkIGJwcy5cbiIsCisJCSAgICAgICBxb3MtPmJhdWRfcmF0ZS52YWx1ZSk7CisJfQorCisJbiA9IHNrYi0+ZGF0YVswXSAmIDB4N2Y7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBJbml0aWFsIHNlbmRfY3JlZGl0PSVkXG4iLCBfX0ZVTkNUSU9OX18sIG4pOworCisJc2VsZi0+c2VuZF9jcmVkaXQgPSBuOworCXNlbGYtPnR4X21heF9zZHVfc2l6ZSA9IDA7CisJc2VsZi0+Y29ubmVjdGVkID0gVFJVRTsKKworCXBhcmFtZXRlcnMgPSBza2ItPmRhdGFbMF0gJiAweDgwOworCisJSVJEQV9BU1NFUlQoc2tiLT5sZW4gPj0gVFRQX0hFQURFUiwgcmV0dXJuOyk7CisJc2tiX3B1bGwoc2tiLCBUVFBfSEVBREVSKTsKKworCWlmIChwYXJhbWV0ZXJzKSB7CisJCXBsZW4gPSBza2ItPmRhdGFbMF07CisKKwkJcmV0ID0gaXJkYV9wYXJhbV9leHRyYWN0X2FsbChzZWxmLCBza2ItPmRhdGErMSwKKwkJCQkJICAgICBJUkRBX01JTihza2ItPmxlbi0xLCBwbGVuKSwKKwkJCQkJICAgICAmcGFyYW1faW5mbyk7CisKKwkJLyogQW55IGVycm9ycyBpbiB0aGUgcGFyYW1ldGVyIGxpc3Q/ICovCisJCWlmIChyZXQgPCAwKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzOiBlcnJvciBleHRyYWN0aW5nIHBhcmFtZXRlcnNcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCisJCQkvKiBEbyBub3QgYWNjZXB0IHRoaXMgY29ubmVjdGlvbiBhdHRlbXB0ICovCisJCQlyZXR1cm47CisJCX0KKwkJLyogUmVtb3ZlIHBhcmFtZXRlcnMgKi8KKwkJc2tiX3B1bGwoc2tiLCBJUkRBX01JTihza2ItPmxlbiwgcGxlbisxKSk7CisJfQorCisJSVJEQV9ERUJVRyg0LCAiJXMoKSBzZW5kPSVkLGF2YWlsPSVkLHJlbW90ZT0lZFxuIiwgX19GVU5DVElPTl9fLAorCSAgICAgIHNlbGYtPnNlbmRfY3JlZGl0LCBzZWxmLT5hdmFpbF9jcmVkaXQsIHNlbGYtPnJlbW90ZV9jcmVkaXQpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgTWF4U2R1U2l6ZT0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBzZWxmLT50eF9tYXhfc2R1X3NpemUpOworCisJaWYgKHNlbGYtPm5vdGlmeS5jb25uZWN0X2NvbmZpcm0pIHsKKwkJc2VsZi0+bm90aWZ5LmNvbm5lY3RfY29uZmlybShzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsIHFvcywKKwkJCQkJICAgICBzZWxmLT50eF9tYXhfc2R1X3NpemUsCisJCQkJCSAgICAgc2VsZi0+bWF4X2hlYWRlcl9zaXplLCBza2IpOworCX0gZWxzZQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9jb25uZWN0X2luZGljYXRpb24gKGhhbmRsZSwgc2tiKQorICoKKyAqICAgIFNvbWUgb3RoZXIgZGV2aWNlIGlzIGNvbm5lY3RpbmcgdG8gdGhpcyBUU0FQCisgKgorICovCit2b2lkIGlydHRwX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKKwkJCSAgICAgIF9fdTMyIG1heF9zZWdfc2l6ZSwgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0c2FwX2NiICpzZWxmOworCXN0cnVjdCBsc2FwX2NiICpsc2FwOworCWludCBwYXJhbWV0ZXJzOworCWludCByZXQ7CisJX191OCBwbGVuOworCV9fdTggbjsKKworCXNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlsc2FwID0gKHN0cnVjdCBsc2FwX2NiICopIHNhcDsKKworCXNlbGYtPm1heF9zZWdfc2l6ZSA9IG1heF9zZWdfc2l6ZSAtIFRUUF9IRUFERVI7CisJc2VsZi0+bWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplK1RUUF9IRUFERVI7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBUU0FQIHNlbD0lMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYtPnN0c2FwX3NlbCk7CisKKwkvKiBOZWVkIHRvIHVwZGF0ZSBkdHNhcF9zZWwgaWYgaXRzIGVxdWFsIHRvIExTQVBfQU5ZICovCisJc2VsZi0+ZHRzYXBfc2VsID0gbHNhcC0+ZGxzYXBfc2VsOworCisJbiA9IHNrYi0+ZGF0YVswXSAmIDB4N2Y7CisKKwlzZWxmLT5zZW5kX2NyZWRpdCA9IG47CisJc2VsZi0+dHhfbWF4X3NkdV9zaXplID0gMDsKKworCXBhcmFtZXRlcnMgPSBza2ItPmRhdGFbMF0gJiAweDgwOworCisJSVJEQV9BU1NFUlQoc2tiLT5sZW4gPj0gVFRQX0hFQURFUiwgcmV0dXJuOyk7CisJc2tiX3B1bGwoc2tiLCBUVFBfSEVBREVSKTsKKworCWlmIChwYXJhbWV0ZXJzKSB7CisJCXBsZW4gPSBza2ItPmRhdGFbMF07CisKKwkJcmV0ID0gaXJkYV9wYXJhbV9leHRyYWN0X2FsbChzZWxmLCBza2ItPmRhdGErMSwKKwkJCQkJICAgICBJUkRBX01JTihza2ItPmxlbi0xLCBwbGVuKSwKKwkJCQkJICAgICAmcGFyYW1faW5mbyk7CisKKwkJLyogQW55IGVycm9ycyBpbiB0aGUgcGFyYW1ldGVyIGxpc3Q/ICovCisJCWlmIChyZXQgPCAwKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzOiBlcnJvciBleHRyYWN0aW5nIHBhcmFtZXRlcnNcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCisJCQkvKiBEbyBub3QgYWNjZXB0IHRoaXMgY29ubmVjdGlvbiBhdHRlbXB0ICovCisJCQlyZXR1cm47CisJCX0KKworCQkvKiBSZW1vdmUgcGFyYW1ldGVycyAqLworCQlza2JfcHVsbChza2IsIElSREFfTUlOKHNrYi0+bGVuLCBwbGVuKzEpKTsKKwl9CisKKwlpZiAoc2VsZi0+bm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbikgeworCQlzZWxmLT5ub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwKKwkJCQkJCXFvcywgc2VsZi0+dHhfbWF4X3NkdV9zaXplLAorCQkJCQkJc2VsZi0+bWF4X2hlYWRlcl9zaXplLCBza2IpOworCX0gZWxzZQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9jb25uZWN0X3Jlc3BvbnNlIChoYW5kbGUsIHVzZXJkYXRhKQorICoKKyAqICAgIFNlcnZpY2UgdXNlciBpcyBhY2NlcHRpbmcgdGhlIGNvbm5lY3Rpb24sIGp1c3QgcGFzcyBpdCBkb3duIHRvCisgKiAgICBJckxNUCEKKyAqCisgKi8KK2ludCBpcnR0cF9jb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCB0c2FwX2NiICpzZWxmLCBfX3UzMiBtYXhfc2R1X3NpemUsCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlfX3U4ICpmcmFtZTsKKwlpbnQgcmV0OworCV9fdTggbjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgU291cmNlIFRTQVAgc2VsZWN0b3I9JTAyeFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBzZWxmLT5zdHNhcF9zZWwpOworCisJLyogQW55IHVzZXJkYXRhIHN1cHBsaWVkPyAqLworCWlmICh1c2VyZGF0YSA9PSBOVUxMKSB7CisJCXR4X3NrYiA9IGRldl9hbGxvY19za2IoNjQpOworCQlpZiAoIXR4X3NrYikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIFJlc2VydmUgc3BhY2UgZm9yIE1VWF9DT05UUk9MIGFuZCBMQVAgaGVhZGVyICovCisJCXNrYl9yZXNlcnZlKHR4X3NrYiwgVFRQX01BWF9IRUFERVIpOworCX0gZWxzZSB7CisJCXR4X3NrYiA9IHVzZXJkYXRhOworCQkvKgorCQkgKiAgQ2hlY2sgdGhhdCB0aGUgY2xpZW50IGhhcyByZXNlcnZlZCBlbm91Z2ggc3BhY2UgZm9yCisJCSAqICBoZWFkZXJzCisJCSAqLworCQlJUkRBX0FTU0VSVChza2JfaGVhZHJvb20odXNlcmRhdGEpID49IFRUUF9NQVhfSEVBREVSLAorCQkJeyBkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsgcmV0dXJuIC0xOyB9ICk7CisJfQorCisJc2VsZi0+YXZhaWxfY3JlZGl0ID0gMDsKKwlzZWxmLT5yZW1vdGVfY3JlZGl0ID0gMDsKKwlzZWxmLT5yeF9tYXhfc2R1X3NpemUgPSBtYXhfc2R1X3NpemU7CisJc2VsZi0+cnhfc2R1X3NpemUgPSAwOworCXNlbGYtPnJ4X3NkdV9idXN5ID0gRkFMU0U7CisKKwluID0gc2VsZi0+aW5pdGlhbF9jcmVkaXQ7CisKKwkvKiBGcmFtZSBoYXMgb25seSBzcGFjZSBmb3IgbWF4IDEyNyBjcmVkaXRzICg3IGJpdHMpICovCisJaWYgKG4gPiAxMjcpIHsKKwkJc2VsZi0+YXZhaWxfY3JlZGl0ID0gbiAtIDEyNzsKKwkJbiA9IDEyNzsKKwl9CisKKwlzZWxmLT5yZW1vdGVfY3JlZGl0ID0gbjsKKwlzZWxmLT5jb25uZWN0ZWQgPSBUUlVFOworCisJLyogU0FSIGVuYWJsZWQ/ICovCisJaWYgKG1heF9zZHVfc2l6ZSA+IDApIHsKKwkJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHR4X3NrYikgPj0gKFRUUF9NQVhfSEVBREVSICsgVFRQX1NBUl9IRUFERVIpLAorCQkJeyBkZXZfa2ZyZWVfc2tiKHR4X3NrYik7IHJldHVybiAtMTsgfSApOworCisJCS8qIEluc2VydCBUVFAgaGVhZGVyIHdpdGggU0FSIHBhcmFtZXRlcnMgKi8KKwkJZnJhbWUgPSBza2JfcHVzaCh0eF9za2IsIFRUUF9IRUFERVIrVFRQX1NBUl9IRUFERVIpOworCisJCWZyYW1lWzBdID0gVFRQX1BBUkFNRVRFUlMgfCBuOworCQlmcmFtZVsxXSA9IDB4MDQ7IC8qIExlbmd0aCAqLworCisJCS8qIGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIElSVFRQX01BWF9TRFVfU0laRSwgZnJhbWUrMSwgICovCisvKgkJCQkgIFRUUF9TQVJfSEVBREVSLCAmcGFyYW1faW5mbykgKi8KKworCQlmcmFtZVsyXSA9IDB4MDE7IC8qIE1heFNkdVNpemUgKi8KKwkJZnJhbWVbM10gPSAweDAyOyAvKiBWYWx1ZSBsZW5ndGggKi8KKworCQlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTE2KChfX3UxNikgbWF4X3NkdV9zaXplKSwKKwkJCSAgICAgIChfX3UxNiAqKShmcmFtZSs0KSk7CisJfSBlbHNlIHsKKwkJLyogSW5zZXJ0IFRUUCBoZWFkZXIgKi8KKwkJZnJhbWUgPSBza2JfcHVzaCh0eF9za2IsIFRUUF9IRUFERVIpOworCisJCWZyYW1lWzBdID0gbiAmIDB4N2Y7CisJfQorCisJcmV0ID0gaXJsbXBfY29ubmVjdF9yZXNwb25zZShzZWxmLT5sc2FwLCB0eF9za2IpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaXJ0dHBfY29ubmVjdF9yZXNwb25zZSk7CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9kdXAgKHNlbGYsIGluc3RhbmNlKQorICoKKyAqICAgIER1cGxpY2F0ZSBUU0FQLCBjYW4gYmUgdXNlZCBieSBzZXJ2ZXJzIHRvIGNvbmZpcm0gYSBjb25uZWN0aW9uIG9uIGEKKyAqICAgIG5ldyBUU0FQIHNvIGl0IGNhbiBrZWVwIGxpc3RlbmluZyBvbiB0aGUgb2xkIG9uZS4KKyAqLworc3RydWN0IHRzYXBfY2IgKmlydHRwX2R1cChzdHJ1Y3QgdHNhcF9jYiAqb3JpZywgdm9pZCAqaW5zdGFuY2UpCit7CisJc3RydWN0IHRzYXBfY2IgKm5ldzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFByb3RlY3Qgb3VyIGFjY2VzcyB0byB0aGUgb2xkIHRzYXAgaW5zdGFuY2UgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJ0dHAtPnRzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJLyogRmluZCB0aGUgb2xkIGluc3RhbmNlICovCisJaWYgKCFoYXNoYmluX2ZpbmQoaXJ0dHAtPnRzYXBzLCAobG9uZykgb3JpZywgTlVMTCkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIGZpbmQgVFNBUFxuIiwgX19GVU5DVElPTl9fKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJ0dHAtPnRzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyBpbnN0YW5jZSAqLworCW5ldyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0c2FwX2NiKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFuZXcpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIGttYWxsb2NcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlydHRwLT50c2Fwcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIER1cCAqLworCW1lbWNweShuZXcsIG9yaWcsIHNpemVvZihzdHJ1Y3QgdHNhcF9jYikpOworCisJLyogV2UgZG9uJ3QgbmVlZCB0aGUgb2xkIGluc3RhbmNlIGFueSBtb3JlICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJ0dHAtPnRzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJLyogVHJ5IHRvIGR1cCB0aGUgTFNBUCAobWF5IGZhaWwgaWYgd2Ugd2VyZSB0b28gc2xvdykgKi8KKwluZXctPmxzYXAgPSBpcmxtcF9kdXAob3JpZy0+bHNhcCwgbmV3KTsKKwlpZiAoIW5ldy0+bHNhcCkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBkdXAgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJa2ZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogTm90IGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIGNvcGllZCAqLworCW5ldy0+bm90aWZ5Lmluc3RhbmNlID0gaW5zdGFuY2U7CisJaW5pdF90aW1lcigmbmV3LT50b2RvX3RpbWVyKTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5ldy0+cnhfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5ldy0+dHhfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5ldy0+cnhfZnJhZ21lbnRzKTsKKworCS8qIFRoaXMgaXMgbG9ja2VkICovCisJaGFzaGJpbl9pbnNlcnQoaXJ0dHAtPnRzYXBzLCAoaXJkYV9xdWV1ZV90ICopIG5ldywgKGxvbmcpIG5ldywgTlVMTCk7CisKKwlyZXR1cm4gbmV3OworfQorRVhQT1JUX1NZTUJPTChpcnR0cF9kdXApOworCisvKgorICogRnVuY3Rpb24gaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0IChzZWxmKQorICoKKyAqICAgIENsb3NlIHRoaXMgY29ubmVjdGlvbiBwbGVhc2UhIElmIHByaW9yaXR5IGlzIGhpZ2gsIHRoZSBxdWV1ZWQgZGF0YQorICogICAgc2VnbWVudHMsIGlmIGFueSwgd2lsbCBiZSBkZWFsbG9jYXRlZCBmaXJzdAorICoKKyAqLworaW50IGlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhLAorCQkJICAgICBpbnQgcHJpb3JpdHkpCit7CisJaW50IHJldDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJLyogQWxyZWFkeSBkaXNjb25uZWN0ZWQ/ICovCisJaWYgKCFzZWxmLT5jb25uZWN0ZWQpIHsKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgYWxyZWFkeSBkaXNjb25uZWN0ZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpZiAodXNlcmRhdGEpCisJCQlkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIERpc2Nvbm5lY3QgYWxyZWFkeSBwZW5kaW5nID8KKwkgKiBXZSBuZWVkIHRvIHVzZSBhbiBhdG9taWMgb3BlcmF0aW9uIHRvIHByZXZlbnQgcmVlbnRyeS4gVGhpcworCSAqIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSB2YXJpb3VzIGNvbnRleHQsIGxpa2UgdXNlciwgdGltZXIKKwkgKiBmb3IgZm9sbG93aW5nIGEgZGlzY29ubmVjdF9pbmRpY2F0aW9uKCkgKGkuZS4gbmV0X2JoKS4KKwkgKiBKZWFuIElJICovCisJaWYodGVzdF9hbmRfc2V0X2JpdCgwLCAmc2VsZi0+ZGlzY29ubmVjdF9wZW5kKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBkaXNjb25uZWN0IGFscmVhZHkgcGVuZGluZ1xuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCWlmICh1c2VyZGF0YSkKKwkJCWRldl9rZnJlZV9za2IodXNlcmRhdGEpOworCisJCS8qIFRyeSB0byBtYWtlIHNvbWUgcHJvZ3Jlc3MgKi8KKwkJaXJ0dHBfcnVuX3R4X3F1ZXVlKHNlbGYpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiAgQ2hlY2sgaWYgdGhlcmUgaXMgc3RpbGwgZGF0YSBzZWdtZW50cyBpbiB0aGUgdHJhbnNtaXQgcXVldWUKKwkgKi8KKwlpZiAoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhfcXVldWUpID4gMCkgeworCQlpZiAocHJpb3JpdHkgPT0gUF9ISUdIKSB7CisJCQkvKgorCQkJICogIE5vIG5lZWQgdG8gc2VuZCB0aGUgcXVldWVkIGRhdGEsIGlmIHdlIGFyZQorCQkJICogIGRpc2Nvbm5lY3RpbmcgcmlnaHQgbm93IHNpbmNlIHRoZSBkYXRhIHdpbGwKKwkJCSAqICBub3QgaGF2ZSBhbnkgdXNhYmxlIGNvbm5lY3Rpb24gdG8gYmUgc2VudCBvbgorCQkJICovCisJCQlJUkRBX0RFQlVHKDEsICIlcygpOiBIaWdoIHByaW9yaXR5ISEoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWlydHRwX2ZsdXNoX3F1ZXVlcyhzZWxmKTsKKwkJfSBlbHNlIGlmIChwcmlvcml0eSA9PSBQX05PUk1BTCkgeworCQkJLyoKKwkJCSAqICBNdXN0IGRlbGF5IGRpc2Nvbm5lY3QgdW50aWwgYWZ0ZXIgYWxsIGRhdGEgc2VnbWVudHMKKwkJCSAqICBoYXZlIGJlZW4gc2VudCBhbmQgdGhlIHR4X3F1ZXVlIGlzIGVtcHR5CisJCQkgKi8KKwkJCS8qIFdlJ2xsIHJldXNlIHRoaXMgb25lIGxhdGVyIGZvciB0aGUgZGlzY29ubmVjdCAqLworCQkJc2VsZi0+ZGlzY29ubmVjdF9za2IgPSB1c2VyZGF0YTsgIC8qIE1heSBiZSBOVUxMICovCisKKwkJCWlydHRwX3J1bl90eF9xdWV1ZShzZWxmKTsKKworCQkJaXJ0dHBfc3RhcnRfdG9kb190aW1lcihzZWxmLCBIWi8xMCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJLyogTm90ZSA6IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgc2VsZi0+cnhfcXVldWUgaXMgZnVsbCBhbmQgdGhlCisJICogc3RhdGUgb2Ygc2VsZi0+cnhfc2R1X2J1c3kgYmVjYXVzZSB0aGUgZGlzY29ubmVjdCByZXNwb25zZSB3aWxsCisJICogYmUgc2VudCBhdCB0aGUgTE1QIGxldmVsIChzbyBldmVuIGlmIHRoZSBwZWVyIGhhcyBpdHMgVHggcXVldWUKKwkgKiBmdWxsIG9mIGRhdGEpLiAtIEplYW4gSUkgKi8KKworCUlSREFfREVCVUcoMSwgIiVzKCksIERpc2Nvbm5lY3RpbmcgLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCXNlbGYtPmNvbm5lY3RlZCA9IEZBTFNFOworCisJaWYgKCF1c2VyZGF0YSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCQl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKKwkJaWYgKCF0eF9za2IpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKgorCQkgKiAgUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyCisJCSAqLworCQlza2JfcmVzZXJ2ZSh0eF9za2IsIFRUUF9NQVhfSEVBREVSKTsKKworCQl1c2VyZGF0YSA9IHR4X3NrYjsKKwl9CisJcmV0ID0gaXJsbXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmxzYXAsIHVzZXJkYXRhKTsKKworCS8qIFRoZSBkaXNjb25uZWN0IGlzIG5vIGxvbmdlciBwZW5kaW5nICovCisJY2xlYXJfYml0KDAsICZzZWxmLT5kaXNjb25uZWN0X3BlbmQpOwkvKiBGQUxTRSAqLworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoc2VsZiwgcmVhc29uKQorICoKKyAqICAgIERpc2Nvbm5lY3QgaW5kaWNhdGlvbiwgVFNBUCBkaXNjb25uZWN0ZWQgYnkgcGVlcj8KKyAqCisgKi8KK3ZvaWQgaXJ0dHBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIExNX1JFQVNPTiByZWFzb24sCisJCQkJIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHRzYXBfY2IgKnNlbGY7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOworCisJLyogUHJldmVudCBoaWdoZXIgbGF5ZXIgdG8gc2VuZCBtb3JlIGRhdGEgKi8KKwlzZWxmLT5jb25uZWN0ZWQgPSBGQUxTRTsKKworCS8qIENoZWNrIGlmIGNsaWVudCBoYXMgYWxyZWFkeSB0cmllZCB0byBjbG9zZSB0aGUgVFNBUCAqLworCWlmIChzZWxmLT5jbG9zZV9wZW5kKSB7CisJCS8qIEluIHRoaXMgY2FzZSwgdGhlIGhpZ2hlciBsYXllciBpcyBwcm9iYWJseSBnb25lLiBEb24ndAorCQkgKiBib3RoZXIgaXQgYW5kIGNsZWFuIHVwIHRoZSByZW1haW5zIC0gSmVhbiBJSSAqLworCQlpZiAoc2tiKQorCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQlpcnR0cF9jbG9zZV90c2FwKHNlbGYpOworCQlyZXR1cm47CisJfQorCisJLyogSWYgd2UgYXJlIGhlcmUsIHdlIGFzc3VtZSB0aGF0IGlzIHRoZSBoaWdoZXIgbGF5ZXIgaXMgc3RpbGwKKwkgKiB3YWl0aW5nIGZvciB0aGUgZGlzY29ubmVjdCBub3RpZmljYXRpb24gYW5kIGFibGUgdG8gcHJvY2VzcyBpdCwKKwkgKiBldmVuIGlmIGhlIHRyaWVkIHRvIGRpc2Nvbm5lY3QuIE90aGVyd2lzZSwgaXQgd291bGQgaGF2ZSBhbHJlYWR5CisJICogYXR0ZW1wdGVkIHRvIGNsb3NlIHRoZSB0c2FwIGFuZCBzZWxmLT5jbG9zZV9wZW5kIHdvdWxkIGJlIFRSVUUuCisJICogSmVhbiBJSSAqLworCisJLyogTm8gbmVlZCB0byBub3RpZnkgdGhlIGNsaWVudCBpZiBoYXMgYWxyZWFkeSB0cmllZCB0byBkaXNjb25uZWN0ICovCisJaWYoc2VsZi0+bm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbikKKwkJc2VsZi0+bm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsCisJCQkJCQkgICByZWFzb24sIHNrYik7CisJZWxzZQorCQlpZiAoc2tiKQorCQkJZGV2X2tmcmVlX3NrYihza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHBfZG9fZGF0YV9pbmRpY2F0aW9uIChzZWxmLCBza2IpCisgKgorICogICAgVHJ5IHRvIGRlbGl2ZXIgcmVhc3NlbWJsZWQgc2tiIHRvIGxheWVyIGFib3ZlLCBhbmQgcmVxdWV1ZSBpdCBpZiB0aGF0CisgKiAgICBmb3Igc29tZSByZWFzb24gc2hvdWxkIGZhaWwuIFdlIG1hcmsgcnggc2R1IGFzIGJ1c3kgdG8gYXBwbHkgYmFjaworICogICAgcHJlc3N1cmUgaXMgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgdm9pZCBpcnR0cF9kb19kYXRhX2luZGljYXRpb24oc3RydWN0IHRzYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGVycjsKKworCS8qIENoZWNrIGlmIGNsaWVudCBoYXMgYWxyZWFkeSBjbG9zZWQgdGhlIFRTQVAgYW5kIGdvbmUgYXdheSAqLworCWlmIChzZWxmLT5jbG9zZV9wZW5kKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWVyciA9IHNlbGYtPm5vdGlmeS5kYXRhX2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLCBza2IpOworCisJLyogVXN1YWxseSB0aGUgbGF5ZXIgYWJvdmUgd2lsbCBub3RpZnkgdGhhdCBpdCdzIGlucHV0IHF1ZXVlIGlzCisJICogc3RhcnRpbmcgdG8gZ2V0IGZpbGxlZCBieSB1c2luZyB0aGUgZmxvdyByZXF1ZXN0LCBidXQgdGhpcyBtYXkKKwkgKiBiZSBkaWZmaWN1bHQsIHNvIGl0IGNhbiBpbnN0ZWFkIGp1c3QgcmVmdXNlIHRvIGVhdCBpdCBhbmQganVzdAorCSAqIGdpdmUgYW4gZXJyb3IgYmFjaworCSAqLworCWlmIChlcnIpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSByZXF1ZXVlaW5nIHNrYiFcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJLyogTWFrZSBzdXJlIHdlIHRha2UgYSBicmVhayAqLworCQlzZWxmLT5yeF9zZHVfYnVzeSA9IFRSVUU7CisKKwkJLyogTmVlZCB0byBwdXNoIHRoZSBoZWFkZXIgaW4gYWdhaW4gKi8KKwkJc2tiX3B1c2goc2tiLCBUVFBfSEVBREVSKTsKKwkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogTWFrZSBzdXJlIE1PUkUgYml0IGlzIGNsZWFyZWQgKi8KKworCQkvKiBQdXQgc2tiIGJhY2sgb24gcXVldWUgKi8KKwkJc2tiX3F1ZXVlX2hlYWQoJnNlbGYtPnJ4X3F1ZXVlLCBza2IpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX3J1bl9yeF9xdWV1ZSAoc2VsZikKKyAqCisgKiAgICAgQ2hlY2sgaWYgd2UgaGF2ZSBhbnkgZnJhbWVzIHRvIGJlIHRyYW5zbWl0dGVkLCBvciBpZiB3ZSBoYXZlIGFueQorICogICAgIGF2YWlsYWJsZSBjcmVkaXQgdG8gZ2l2ZSBhd2F5LgorICovCit2b2lkIGlydHRwX3J1bl9yeF9xdWV1ZShzdHJ1Y3QgdHNhcF9jYiAqc2VsZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBtb3JlID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKCkgc2VuZD0lZCxhdmFpbD0lZCxyZW1vdGU9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgc2VsZi0+c2VuZF9jcmVkaXQsIHNlbGYtPmF2YWlsX2NyZWRpdCwgc2VsZi0+cmVtb3RlX2NyZWRpdCk7CisKKwkvKiBHZXQgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgcnggcXVldWUsIG90aGVyd2lzZSBkb24ndCB0b3VjaCBpdCAqLworCWlmIChpcmRhX2xvY2soJnNlbGYtPnJ4X3F1ZXVlX2xvY2spID09IEZBTFNFKQorCQlyZXR1cm47CisKKwkvKgorCSAqICBSZWFzc2VtYmxlIGFsbCBmcmFtZXMgaW4gcmVjZWl2ZSBxdWV1ZSBhbmQgZGVsaXZlciB0aGVtCisJICovCisJd2hpbGUgKCFzZWxmLT5yeF9zZHVfYnVzeSAmJiAoc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPnJ4X3F1ZXVlKSkpIHsKKwkJLyogVGhpcyBiaXQgd2lsbCB0ZWxsIHVzIGlmIGl0J3MgdGhlIGxhc3QgZnJhZ21lbnQgb3Igbm90ICovCisJCW1vcmUgPSBza2ItPmRhdGFbMF0gJiAweDgwOworCisJCS8qIFJlbW92ZSBUVFAgaGVhZGVyICovCisJCXNrYl9wdWxsKHNrYiwgVFRQX0hFQURFUik7CisKKwkJLyogQWRkIHRoZSBsZW5ndGggb2YgdGhlIHJlbWFpbmluZyBkYXRhICovCisJCXNlbGYtPnJ4X3NkdV9zaXplICs9IHNrYi0+bGVuOworCisJCS8qCisJCSAqIElmIFNBUiBpcyBkaXNhYmxlZCwgb3IgdXNlciBoYXMgcmVxdWVzdGVkIG5vIHJlYXNzZW1ibHkKKwkJICogb2YgcmVjZWl2ZWQgZnJhZ21lbnRzIHRoZW4gd2UganVzdCBkZWxpdmVyIHRoZW0KKwkJICogaW1tZWRpYXRlbHkuIFRoaXMgY2FuIGJlIHJlcXVlc3RlZCBieSBjbGllbnRzIHRoYXQKKwkJICogaW1wbGVtZW50cyBieXRlIHN0cmVhbXMgd2l0aG91dCBhbnkgbWVzc2FnZSBib3VuZGFyaWVzCisJCSAqLworCQlpZiAoc2VsZi0+cnhfbWF4X3NkdV9zaXplID09IFRUUF9TQVJfRElTQUJMRSkgeworCQkJaXJ0dHBfZG9fZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CisJCQlzZWxmLT5yeF9zZHVfc2l6ZSA9IDA7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIGZyYWdtZW50LCBhbmQgbm90IHRoZSBsYXN0IGZyYWdtZW50ICovCisJCWlmIChtb3JlKSB7CisJCQkvKgorCQkJICogIFF1ZXVlIHRoZSBmcmFnbWVudCBpZiB3ZSBzdGlsbCBhcmUgd2l0aGluIHRoZQorCQkJICogIGxpbWl0cyBvZiB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSByeF9zZHUKKwkJCSAqLworCQkJaWYgKHNlbGYtPnJ4X3NkdV9zaXplIDw9IHNlbGYtPnJ4X21heF9zZHVfc2l6ZSkgeworCQkJCUlSREFfREVCVUcoNCwgIiVzKCksIHF1ZXVlaW5nIGZyYWdcbiIsCisJCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQkJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPnJ4X2ZyYWdtZW50cywgc2tiKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogRnJlZSB0aGUgcGFydCBvZiB0aGUgU0RVIHRoYXQgaXMgdG9vIGJpZyAqLworCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqICBUaGlzIGlzIHRoZSBsYXN0IGZyYWdtZW50LCBzbyB0aW1lIHRvIHJlYXNzZW1ibGUhCisJCSAqLworCQlpZiAoKHNlbGYtPnJ4X3NkdV9zaXplIDw9IHNlbGYtPnJ4X21heF9zZHVfc2l6ZSkgfHwKKwkJICAgIChzZWxmLT5yeF9tYXhfc2R1X3NpemUgPT0gVFRQX1NBUl9VTkJPVU5EKSkKKwkJeworCQkJLyoKKwkJCSAqIEEgbGl0dGxlIG9wdGltaXppbmcuIE9ubHkgcXVldWUgdGhlIGZyYWdtZW50IGlmCisJCQkgKiB0aGVyZSBhcmUgb3RoZXIgZnJhZ21lbnRzLiBTaW5jZSBpZiB0aGlzIGlzIHRoZQorCQkJICogbGFzdCBhbmQgb25seSBmcmFnbWVudCwgdGhlcmUgaXMgbm8gbmVlZCB0bworCQkJICogcmVhc3NlbWJsZSA6LSkKKwkJCSAqLworCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnJ4X2ZyYWdtZW50cykpIHsKKwkJCQlza2JfcXVldWVfdGFpbCgmc2VsZi0+cnhfZnJhZ21lbnRzLAorCQkJCQkgICAgICAgc2tiKTsKKworCQkJCXNrYiA9IGlydHRwX3JlYXNzZW1ibGVfc2tiKHNlbGYpOworCQkJfQorCisJCQkvKiBOb3cgd2UgY2FuIGRlbGl2ZXIgdGhlIHJlYXNzZW1ibGVkIHNrYiAqLworCQkJaXJ0dHBfZG9fZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CisJCX0gZWxzZSB7CisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBUcnVuY2F0ZWQgZnJhbWVcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJCS8qIEZyZWUgdGhlIHBhcnQgb2YgdGhlIFNEVSB0aGF0IGlzIHRvbyBiaWcgKi8KKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCQkJLyogRGVsaXZlciBvbmx5IHRoZSB2YWxpZCBidXQgdHJ1bmNhdGVkIHBhcnQgb2YgU0RVICovCisJCQlza2IgPSBpcnR0cF9yZWFzc2VtYmxlX3NrYihzZWxmKTsKKworCQkJaXJ0dHBfZG9fZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CisJCX0KKwkJc2VsZi0+cnhfc2R1X3NpemUgPSAwOworCX0KKworCS8qCisJICogSXQncyBub3QgdHJpdmlhbCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGNyZWRpdHMgYXJlIGF2YWlsYWJsZQorCSAqIGJ5IGluY3JlbWVudGluZyBhdCBlYWNoIHBhY2tldCwgYmVjYXVzZSBkZWxpdmVyeSBtYXkgZmFpbAorCSAqIChpcnR0cF9kb19kYXRhX2luZGljYXRpb24oKSBtYXkgcmVxdWV1ZSB0aGUgZnJhbWUpIGFuZCBiZWNhdXNlCisJICogd2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgZnJhZ21lbnRhdGlvbi4KKwkgKiBXZSB3YW50IHRoZSBvdGhlciBzaWRlIHRvIHNlbmQgdXAgdG8gaW5pdGlhbF9jcmVkaXQgcGFja2V0cy4KKwkgKiBXZSBoYXZlIHNvbWUgZnJhbWVzIGluIG91ciBxdWV1ZXMsIGFuZCB3ZSBoYXZlIGFscmVhZHkgYWxsb3dlZCBpdAorCSAqIHRvIHNlbmQgcmVtb3RlX2NyZWRpdC4KKwkgKiBObyBuZWVkIHRvIHNwaW5sb2NrLCB3cml0ZSBpcyBhdG9taWMgYW5kIHNlbGYgY29ycmVjdGluZy4uLgorCSAqIEplYW4gSUkKKwkgKi8KKwlzZWxmLT5hdmFpbF9jcmVkaXQgPSAoc2VsZi0+aW5pdGlhbF9jcmVkaXQgLQorCQkJICAgICAgKHNlbGYtPnJlbW90ZV9jcmVkaXQgKworCQkJICAgICAgIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnJ4X3F1ZXVlKSArCisJCQkgICAgICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+cnhfZnJhZ21lbnRzKSkpOworCisJLyogRG8gd2UgaGF2ZSB0b28gbXVjaCBjcmVkaXRzIHRvIHNlbmQgdG8gcGVlciA/ICovCisJaWYgKChzZWxmLT5yZW1vdGVfY3JlZGl0IDw9IFRUUF9SWF9NSU5fQ1JFRElUKSAmJgorCSAgICAoc2VsZi0+YXZhaWxfY3JlZGl0ID4gMCkpIHsKKwkJLyogU2VuZCBleHBsaWNpdCBjcmVkaXQgZnJhbWUgKi8KKwkJaXJ0dHBfZ2l2ZV9jcmVkaXQoc2VsZik7CisJCS8qIE5vdGUgOiBkbyAqTk9UKiBjaGVjayBpZiB0eF9xdWV1ZSBpcyBub24tZW1wdHksIHRoYXQKKwkJICogd2lsbCBwcm9kdWNlIGRlYWRsb2Nrcy4gSSByZXBlYXQgOiBzZW5kIGEgY3JlZGl0IGZyYW1lCisJCSAqIGV2ZW4gaWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gc2VuZCBpbiBvdXIgVHggcXVldWUuCisJCSAqIElmIHdlIGhhdmUgY3JlZGl0cywgaXQgbWVhbnMgdGhhdCBvdXIgVHggcXVldWUgaXMgYmxvY2tlZC4KKwkJICoKKwkJICogTGV0J3Mgc3VwcG9zZSB0aGUgcGVlciBjYW4ndCBrZWVwIHVwIHdpdGggb3VyIFR4LiBIZSB3aWxsCisJCSAqIGZsb3cgY29udHJvbCB1cyBieSBub3Qgc2VuZGluZyB1cyBhbnkgY3JlZGl0cywgYW5kIHdlCisJCSAqIHdpbGwgc3RvcCBUeCBhbmQgc3RhcnQgYWNjdW11bGF0aW5nIGNyZWRpdHMgaGVyZS4KKwkJICogVXAgdG8gdGhlIHBvaW50IHdoZXJlIHRoZSBwZWVyIHdpbGwgc3RvcCBpdHMgVHggcXVldWUsCisJCSAqIGZvciBsYWNrIG9mIGNyZWRpdHMuCisJCSAqIExldCdzIGFzc3VtZSB0aGUgcGVlciBhcHBsaWNhdGlvbiBpcyBzaW5nbGUgdGhyZWFkZWQuCisJCSAqIEl0IHdpbGwgYmxvY2sgb24gVHggYW5kIG5ldmVyIGNvbnN1bWUgYW55IFJ4IGJ1ZmZlci4KKwkJICogRGVhZGxvY2suIEd1YXJhbnRlZWQuIC0gSmVhbiBJSQorCQkgKi8KKwl9CisKKwkvKiBSZXNldCBsb2NrICovCisJc2VsZi0+cnhfcXVldWVfbG9jayA9IDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RydWN0IGlydHRwX2l0ZXJfc3RhdGUgeworCWludCBpZDsKK307CisKK3N0YXRpYyB2b2lkICppcnR0cF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBpcnR0cF9pdGVyX3N0YXRlICppdGVyID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCB0c2FwX2NiICpzZWxmOworCisJLyogUHJvdGVjdCBvdXIgYWNjZXNzIHRvIHRoZSB0c2FwIGxpc3QgKi8KKwlzcGluX2xvY2tfaXJxKCZpcnR0cC0+dHNhcHMtPmhiX3NwaW5sb2NrKTsKKwlpdGVyLT5pZCA9IDA7CisKKwlmb3IgKHNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJ0dHAtPnRzYXBzKTsgCisJICAgICBzZWxmICE9IE5VTEw7CisJICAgICBzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGhhc2hiaW5fZ2V0X25leHQoaXJ0dHAtPnRzYXBzKSkgeworCQlpZiAoaXRlci0+aWQgPT0gKnBvcykKKwkJCWJyZWFrOworCQkrK2l0ZXItPmlkOworCX0KKwkJCisJcmV0dXJuIHNlbGY7Cit9CisKK3N0YXRpYyB2b2lkICppcnR0cF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGlydHRwX2l0ZXJfc3RhdGUgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisKKwkrKypwb3M7CisJKytpdGVyLT5pZDsKKwlyZXR1cm4gKHZvaWQgKikgaGFzaGJpbl9nZXRfbmV4dChpcnR0cC0+dHNhcHMpOworfQorCitzdGF0aWMgdm9pZCBpcnR0cF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzcGluX3VubG9ja19pcnEoJmlydHRwLT50c2Fwcy0+aGJfc3BpbmxvY2spOworfQorCitzdGF0aWMgaW50IGlydHRwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWNvbnN0IHN0cnVjdCBpcnR0cF9pdGVyX3N0YXRlICppdGVyID0gc2VxLT5wcml2YXRlOworCWNvbnN0IHN0cnVjdCB0c2FwX2NiICpzZWxmID0gdjsKKworCXNlcV9wcmludGYoc2VxLCAiVFNBUCAlZCwgIiwgaXRlci0+aWQpOworCXNlcV9wcmludGYoc2VxLCAic3RzYXBfc2VsOiAlMDJ4LCAiLAorCQkgICBzZWxmLT5zdHNhcF9zZWwpOworCXNlcV9wcmludGYoc2VxLCAiZHRzYXBfc2VsOiAlMDJ4XG4iLAorCQkgICBzZWxmLT5kdHNhcF9zZWwpOworCXNlcV9wcmludGYoc2VxLCAiICBjb25uZWN0ZWQ6ICVzLCAiLAorCQkgICBzZWxmLT5jb25uZWN0ZWQ/ICJUUlVFIjoiRkFMU0UiKTsKKwlzZXFfcHJpbnRmKHNlcSwgImF2YWlsIGNyZWRpdDogJWQsICIsCisJCSAgIHNlbGYtPmF2YWlsX2NyZWRpdCk7CisJc2VxX3ByaW50ZihzZXEsICJyZW1vdGUgY3JlZGl0OiAlZCwgIiwKKwkJICAgc2VsZi0+cmVtb3RlX2NyZWRpdCk7CisJc2VxX3ByaW50ZihzZXEsICJzZW5kIGNyZWRpdDogJWRcbiIsCisJCSAgIHNlbGYtPnNlbmRfY3JlZGl0KTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgdHggcGFja2V0czogJWxkLCAiLAorCQkgICBzZWxmLT5zdGF0cy50eF9wYWNrZXRzKTsKKwlzZXFfcHJpbnRmKHNlcSwgInJ4IHBhY2tldHM6ICVsZCwgIiwKKwkJICAgc2VsZi0+c3RhdHMucnhfcGFja2V0cyk7CisJc2VxX3ByaW50ZihzZXEsICJ0eF9xdWV1ZSBsZW46ICVkICIsCisJCSAgIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4X3F1ZXVlKSk7CisJc2VxX3ByaW50ZihzZXEsICJyeF9xdWV1ZSBsZW46ICVkXG4iLAorCQkgICBza2JfcXVldWVfbGVuKCZzZWxmLT5yeF9xdWV1ZSkpOworCXNlcV9wcmludGYoc2VxLCAiICB0eF9zZHVfYnVzeTogJXMsICIsCisJCSAgIHNlbGYtPnR4X3NkdV9idXN5PyAiVFJVRSI6IkZBTFNFIik7CisJc2VxX3ByaW50ZihzZXEsICJyeF9zZHVfYnVzeTogJXNcbiIsCisJCSAgIHNlbGYtPnJ4X3NkdV9idXN5PyAiVFJVRSI6IkZBTFNFIik7CisJc2VxX3ByaW50ZihzZXEsICIgIG1heF9zZWdfc2l6ZTogJWQsICIsCisJCSAgIHNlbGYtPm1heF9zZWdfc2l6ZSk7CisJc2VxX3ByaW50ZihzZXEsICJ0eF9tYXhfc2R1X3NpemU6ICVkLCAiLAorCQkgICBzZWxmLT50eF9tYXhfc2R1X3NpemUpOworCXNlcV9wcmludGYoc2VxLCAicnhfbWF4X3NkdV9zaXplOiAlZFxuIiwKKwkJICAgc2VsZi0+cnhfbWF4X3NkdV9zaXplKTsKKworCXNlcV9wcmludGYoc2VxLCAiICBVc2VkIGJ5ICglcylcblxuIiwKKwkJICAgc2VsZi0+bm90aWZ5Lm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlydHRwX3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IGlydHRwX3NlcV9zdGFydCwKKwkubmV4dCAgID0gaXJ0dHBfc2VxX25leHQsCisJLnN0b3AgICA9IGlydHRwX3NlcV9zdG9wLAorCS5zaG93ICAgPSBpcnR0cF9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgaXJ0dHBfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3QgaXJ0dHBfaXRlcl9zdGF0ZSAqczsKKyAgICAgICAKKwlJUkRBX0FTU0VSVChpcnR0cCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTDspOworCisJcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKQorCQlnb3RvIG91dDsKKworCXJjID0gc2VxX29wZW4oZmlsZSwgJmlydHRwX3NlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlzZXEJICAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBzOworCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWU6CisJa2ZyZWUocyk7CisJZ290byBvdXQ7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXJ0dHBfc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgICAgICAgICA9IGlydHRwX3NlcV9vcGVuLAorCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworCisjZW5kaWYgLyogUFJPQ19GUyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvcGFyYW1ldGVycy5jIGIvbmV0L2lyZGEvcGFyYW1ldGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMjQ5NDIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9wYXJhbWV0ZXJzLmMKQEAgLTAsMCArMSw1ODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBwYXJhbWV0ZXJzLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgQSBtb3JlIGdlbmVyYWwgd2F5IHRvIGhhbmRsZSAocGkscGwscHYpIHBhcmFtZXRlcnMKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIE1vbiBKdW4gIDcgMTA6MjU6MTEgMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgU3VuIEphbiAzMCAxNDowODozOSAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKgorICogICAgIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvcGFyYW1ldGVycy5oPgorCitzdGF0aWMgaW50IGlyZGFfZXh0cmFjdF9pbnRlZ2VyKHZvaWQgKnNlbGYsIF9fdTggKmJ1ZiwgaW50IGxlbiwgX191OCBwaSwKKwkJCQlQVl9UWVBFIHR5cGUsIFBJX0hBTkRMRVIgZnVuYyk7CitzdGF0aWMgaW50IGlyZGFfZXh0cmFjdF9zdHJpbmcodm9pZCAqc2VsZiwgX191OCAqYnVmLCBpbnQgbGVuLCBfX3U4IHBpLAorCQkJICAgICAgIFBWX1RZUEUgdHlwZSwgUElfSEFORExFUiBmdW5jKTsKK3N0YXRpYyBpbnQgaXJkYV9leHRyYWN0X29jdHNlcSh2b2lkICpzZWxmLCBfX3U4ICpidWYsIGludCBsZW4sIF9fdTggcGksCisJCQkgICAgICAgUFZfVFlQRSB0eXBlLCBQSV9IQU5ETEVSIGZ1bmMpOworc3RhdGljIGludCBpcmRhX2V4dHJhY3Rfbm9fdmFsdWUodm9pZCAqc2VsZiwgX191OCAqYnVmLCBpbnQgbGVuLCBfX3U4IHBpLAorCQkJCSBQVl9UWVBFIHR5cGUsIFBJX0hBTkRMRVIgZnVuYyk7CisKK3N0YXRpYyBpbnQgaXJkYV9pbnNlcnRfaW50ZWdlcih2b2lkICpzZWxmLCBfX3U4ICpidWYsIGludCBsZW4sIF9fdTggcGksCisJCQkgICAgICAgUFZfVFlQRSB0eXBlLCBQSV9IQU5ETEVSIGZ1bmMpOworc3RhdGljIGludCBpcmRhX2luc2VydF9ub192YWx1ZSh2b2lkICpzZWxmLCBfX3U4ICpidWYsIGludCBsZW4sIF9fdTggcGksCisJCQkJUFZfVFlQRSB0eXBlLCBQSV9IQU5ETEVSIGZ1bmMpOworCitzdGF0aWMgaW50IGlyZGFfcGFyYW1fdW5wYWNrKF9fdTggKmJ1ZiwgY2hhciAqZm10LCAuLi4pOworCisvKiBQYXJhbWV0ZXIgdmFsdWUgY2FsbCB0YWJsZS4gTXVzdCBtYXRjaCBQVl9UWVBFICovCitzdGF0aWMgUFZfSEFORExFUiBwdl9leHRyYWN0X3RhYmxlW10gPSB7CisJaXJkYV9leHRyYWN0X2ludGVnZXIsIC8qIEhhbmRsZXIgZm9yIGFueSBsZW5ndGggaW50ZWdlcnMgKi8KKwlpcmRhX2V4dHJhY3RfaW50ZWdlciwgLyogSGFuZGxlciBmb3IgOCAgYml0cyBpbnRlZ2VycyAqLworCWlyZGFfZXh0cmFjdF9pbnRlZ2VyLCAvKiBIYW5kbGVyIGZvciAxNiBiaXRzIGludGVnZXJzICovCisJaXJkYV9leHRyYWN0X3N0cmluZywgIC8qIEhhbmRsZXIgZm9yIHN0cmluZ3MgKi8KKwlpcmRhX2V4dHJhY3RfaW50ZWdlciwgLyogSGFuZGxlciBmb3IgMzIgYml0cyBpbnRlZ2VycyAqLworCWlyZGFfZXh0cmFjdF9vY3RzZXEsICAvKiBIYW5kbGVyIGZvciBvY3RldCBzZXF1ZW5jZXMgKi8KKwlpcmRhX2V4dHJhY3Rfbm9fdmFsdWUgLyogSGFuZGxlciBmb3Igbm8gdmFsdWUgcGFyYW1ldGVycyAqLworfTsKKworc3RhdGljIFBWX0hBTkRMRVIgcHZfaW5zZXJ0X3RhYmxlW10gPSB7CisJaXJkYV9pbnNlcnRfaW50ZWdlciwgLyogSGFuZGxlciBmb3IgYW55IGxlbmd0aCBpbnRlZ2VycyAqLworCWlyZGFfaW5zZXJ0X2ludGVnZXIsIC8qIEhhbmRsZXIgZm9yIDggIGJpdHMgaW50ZWdlcnMgKi8KKwlpcmRhX2luc2VydF9pbnRlZ2VyLCAvKiBIYW5kbGVyIGZvciAxNiBiaXRzIGludGVnZXJzICovCisJTlVMTCwgICAgICAgICAgICAgICAgLyogSGFuZGxlciBmb3Igc3RyaW5ncyAqLworCWlyZGFfaW5zZXJ0X2ludGVnZXIsIC8qIEhhbmRsZXIgZm9yIDMyIGJpdHMgaW50ZWdlcnMgKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAvKiBIYW5kbGVyIGZvciBvY3RldCBzZXF1ZW5jZXMgKi8KKwlpcmRhX2luc2VydF9ub192YWx1ZSAvKiBIYW5kbGVyIGZvciBubyB2YWx1ZSBwYXJhbWV0ZXJzICovCit9OworCisvKgorICogRnVuY3Rpb24gaXJkYV9pbnNlcnRfbm9fdmFsdWUgKHNlbGYsIGJ1ZiwgbGVuLCBwaSwgdHlwZSwgZnVuYykKKyAqLworc3RhdGljIGludCBpcmRhX2luc2VydF9ub192YWx1ZSh2b2lkICpzZWxmLCBfX3U4ICpidWYsIGludCBsZW4sIF9fdTggcGksCisJCQkJUFZfVFlQRSB0eXBlLCBQSV9IQU5ETEVSIGZ1bmMpCit7CisJaXJkYV9wYXJhbV90IHA7CisJaW50IHJldDsKKworCXAucGkgPSBwaTsKKwlwLnBsID0gMDsKKworCS8qIENhbGwgaGFuZGxlciBmb3IgdGhpcyBwYXJhbWV0ZXIgKi8KKwlyZXQgPSAoKmZ1bmMpKHNlbGYsICZwLCBQVl9HRVQpOworCisJLyogRXh0cmFjdCB2YWx1ZXMgYW55d2F5LCBzaW5jZSBoYW5kbGVyIG1heSBuZWVkIHRoZW0gKi8KKwlpcmRhX3BhcmFtX3BhY2soYnVmLCAiYmIiLCBwLnBpLCBwLnBsKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDI7IC8qIEluc2VydGVkIHBsKzIgYnl0ZXMgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZXh0cmFjdF9ub192YWx1ZSAoc2VsZiwgYnVmLCBsZW4sIHR5cGUsIGZ1bmMpCisgKgorICogICAgRXh0cmFjdHMgYSBwYXJhbWV0ZXIgd2l0aG91dCBhIHB2IGZpZWxkIChwbD0wKQorICoKKyAqLworc3RhdGljIGludCBpcmRhX2V4dHJhY3Rfbm9fdmFsdWUodm9pZCAqc2VsZiwgX191OCAqYnVmLCBpbnQgbGVuLCBfX3U4IHBpLAorCQkJCSBQVl9UWVBFIHR5cGUsIFBJX0hBTkRMRVIgZnVuYykKK3sKKwlpcmRhX3BhcmFtX3QgcDsKKwlpbnQgcmV0OworCisJLyogRXh0cmFjdCB2YWx1ZXMgYW55d2F5LCBzaW5jZSBoYW5kbGVyIG1heSBuZWVkIHRoZW0gKi8KKwlpcmRhX3BhcmFtX3VucGFjayhidWYsICJiYiIsICZwLnBpLCAmcC5wbCk7CisKKwkvKiBDYWxsIGhhbmRsZXIgZm9yIHRoaXMgcGFyYW1ldGVyICovCisJcmV0ID0gKCpmdW5jKShzZWxmLCAmcCwgUFZfUFVUKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDI7IC8qIEV4dHJhY3RlZCBwbCsyIGJ5dGVzICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2luc2VydF9pbnRlZ2VyIChzZWxmLCBidWYsIGxlbiwgcGksIHR5cGUsIGZ1bmMpCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9pbnNlcnRfaW50ZWdlcih2b2lkICpzZWxmLCBfX3U4ICpidWYsIGludCBsZW4sIF9fdTggcGksCisJCQkgICAgICAgUFZfVFlQRSB0eXBlLCBQSV9IQU5ETEVSIGZ1bmMpCit7CisJaXJkYV9wYXJhbV90IHA7CisJaW50IG4gPSAwOworCWludCBlcnI7CisKKwlwLnBpID0gcGk7ICAgICAgICAgICAgIC8qIEluIGNhc2UgaGFuZGxlciBuZWVkcyB0byBrbm93ICovCisJcC5wbCA9IHR5cGUgJiBQVl9NQVNLOyAvKiBUaGUgaW50ZWdlciB0eXBlIGNvZGVzIHRoZSBsZW5naHQgYXMgd2VsbCAqLworCXAucHYuaSA9IDA7ICAgICAgICAgICAgLyogQ2xlYXIgdmFsdWUgKi8KKworCS8qIENhbGwgaGFuZGxlciBmb3IgdGhpcyBwYXJhbWV0ZXIgKi8KKwllcnIgPSAoKmZ1bmMpKHNlbGYsICZwLCBQVl9HRVQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyoKKwkgKiBJZiBwYXJhbWV0ZXIgbGVuZ2h0IGlzIHN0aWxsIDAsIHRoZW4gKDEpIHRoaXMgaXMgYW4gYW55IGxlbmd0aAorCSAqIGludGVnZXIsIGFuZCAoMikgdGhlIGhhbmRsZXIgZnVuY3Rpb24gZG9lcyBub3QgY2FyZSB3aGljaCBsZW5ndGgKKwkgKiB3ZSBjaG9vc2UgdG8gdXNlLCBzbyB3ZSBwaWNrIHRoZSBvbmUgdGhlIGdpdmVzIHRoZSBmZXdlc3QgYnl0ZXMuCisJICovCisJaWYgKHAucGwgPT0gMCkgeworCQlpZiAocC5wdi5pIDwgMHhmZikgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgdXNpbmcgMSBieXRlXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcC5wbCA9IDE7CisJCX0gZWxzZSBpZiAocC5wdi5pIDwgMHhmZmZmKSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1c2luZyAyIGJ5dGVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcC5wbCA9IDI7CisJCX0gZWxzZSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1c2luZyA0IGJ5dGVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcC5wbCA9IDQ7IC8qIERlZmF1bHQgbGVuZ3RoICovCisJCX0KKwl9CisJLyogQ2hlY2sgaWYgYnVmZmVyIGlzIGxvbmcgZW5vdWdoIGZvciBpbnNlcnRpb24gKi8KKwlpZiAobGVuIDwgKDIrcC5wbCkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogYnVmZmVyIHRvIHNob3J0IGZvciBpbnNlcnRpb24hXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorCUlSREFfREVCVUcoMiwgIiVzKCksIHBpPSUjeCwgcGw9JWQsIHBpPSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIHAucGksIHAucGwsIHAucHYuaSk7CisJc3dpdGNoIChwLnBsKSB7CisJY2FzZSAxOgorCQluICs9IGlyZGFfcGFyYW1fcGFjayhidWYsICJiYmIiLCBwLnBpLCBwLnBsLCAoX191OCkgcC5wdi5pKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZiAodHlwZSAmIFBWX0JJR19FTkRJQU4pCisJCQlwLnB2LmkgPSBjcHVfdG9fYmUxNigoX191MTYpIHAucHYuaSk7CisJCWVsc2UKKwkJCXAucHYuaSA9IGNwdV90b19sZTE2KChfX3UxNikgcC5wdi5pKTsKKwkJbiArPSBpcmRhX3BhcmFtX3BhY2soYnVmLCAiYmJzIiwgcC5waSwgcC5wbCwgKF9fdTE2KSBwLnB2LmkpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWlmICh0eXBlICYgUFZfQklHX0VORElBTikKKwkJCWNwdV90b19iZTMycygmcC5wdi5pKTsKKwkJZWxzZQorCQkJY3B1X3RvX2xlMzJzKCZwLnB2LmkpOworCQluICs9IGlyZGFfcGFyYW1fcGFjayhidWYsICJiYmkiLCBwLnBpLCBwLnBsLCBwLnB2LmkpOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfV0FSTklORygiJXM6IGxlbmd0aCAlZCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIHAucGwpOworCQkvKiBTa2lwIHBhcmFtZXRlciAqLworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIHAucGwrMjsgLyogSW5zZXJ0ZWQgcGwrMiBieXRlcyAqLworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9leHRyYWN0IGludGVnZXIgKHNlbGYsIGJ1ZiwgbGVuLCBwaSwgdHlwZSwgZnVuYykKKyAqCisgKiAgICBFeHRyYWN0IGEgcG9zc2libHkgdmFyaWFibGUgbGVuZ3RoIGludGVnZXIgZnJvbSBidWZmZXIsIGFuZCBjYWxsCisgKiAgICBoYW5kbGVyIGZvciBwcm9jZXNzaW5nIG9mIHRoZSBwYXJhbWV0ZXIKKyAqLworc3RhdGljIGludCBpcmRhX2V4dHJhY3RfaW50ZWdlcih2b2lkICpzZWxmLCBfX3U4ICpidWYsIGludCBsZW4sIF9fdTggcGksCisJCQkJUFZfVFlQRSB0eXBlLCBQSV9IQU5ETEVSIGZ1bmMpCit7CisJaXJkYV9wYXJhbV90IHA7CisJaW50IG4gPSAwOworCWludCBleHRyYWN0X2xlbjsJLyogUmVhbCBsZW5naHQgd2UgZXh0cmFjdCAqLworCWludCBlcnI7CisKKwlwLnBpID0gcGk7ICAgICAvKiBJbiBjYXNlIGhhbmRsZXIgbmVlZHMgdG8ga25vdyAqLworCXAucGwgPSBidWZbMV07IC8qIEV4dHJhY3QgbGVuZ2h0IG9mIHZhbHVlICovCisJcC5wdi5pID0gMDsgICAgLyogQ2xlYXIgdmFsdWUgKi8KKwlleHRyYWN0X2xlbiA9IHAucGw7CS8qIERlZmF1bHQgOiBleHRyYWN0IGFsbCAqLworCisJLyogQ2hlY2sgaWYgYnVmZmVyIGlzIGxvbmcgZW5vdWdoIGZvciBwYXJzaW5nICovCisJaWYgKGxlbiA8ICgyK3AucGwpKSB7CisJCUlSREFfV0FSTklORygiJXM6IGJ1ZmZlciB0byBzaG9ydCBmb3IgcGFyc2luZyEgIgorCQkJICAgICAiTmVlZCAlZCBieXRlcywgYnV0IGxlbiBpcyBvbmx5ICVkXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIHAucGwsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIGludGVnZXIgbGVuZ3RoIGlzIHdoYXQgd2UgZXhwZWN0IGl0IHRvIGJlLiBJZiB0aGUKKwkgKiBoYW5kbGVyIHdhbnQgYSAxNiBiaXRzIGludGVnZXIgdGhlbiBhIDMyIGJpdHMgaXMgbm90IGdvb2QgZW5vdWdoCisJICogUFZfSU5URUdFUiBtZWFucyB0aGF0IHRoZSBoYW5kbGVyIGlzIGZsZXhpYmxlLgorCSAqLworCWlmICgoKHR5cGUgJiBQVl9NQVNLKSAhPSBQVl9JTlRFR0VSKSAmJiAoKHR5cGUgJiBQVl9NQVNLKSAhPSBwLnBsKSkgeworCQlJUkRBX0VSUk9SKCIlczogaW52YWxpZCBwYXJhbWV0ZXIgbGVuZ3RoISAiCisJCQkgICAiRXhwZWN0ZWQgJWQgYnl0ZXMsIGJ1dCB2YWx1ZSBoYWQgJWQgYnl0ZXMhXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB0eXBlICYgUFZfTUFTSywgcC5wbCk7CisKKwkJLyogTW9zdCBwYXJhbWV0ZXJzIGFyZSBiaXQvYnl0ZSBmaWVsZHMgb3IgbGl0dGxlIGVuZGlhbiwKKwkJICogc28gaXQncyBvayB0byBvbmx5IGV4dHJhY3QgYSBzdWJzZXQgb2YgaXQgKHRoZSBzdWJzZXQKKwkJICogdGhhdCB0aGUgaGFuZGxlciBleHBlY3QpLiBUaGlzIGlzIG5lY2Vzc2FyeSwgYXMgc29tZQorCQkgKiBicm9rZW4gaW1wbGVtZW50YXRpb25zIHNlZW1zIHRvIGFkZCBleHRyYSB1bmRlZmluZWQgYml0cy4KKwkJICogSWYgdGhlIHBhcmFtZXRlciBpcyBzaG9ydGVyIHRoYW4gd2UgZXhwZWN0IG9yIGlzIGJpZworCQkgKiBlbmRpYW4sIHdlIGNhbid0IHBsYXkgdGhvc2UgdHJpY2tzLiBKZWFuIElJICovCisJCWlmKChwLnBsIDwgKHR5cGUgJiBQVl9NQVNLKSkgfHwgKHR5cGUgJiBQVl9CSUdfRU5ESUFOKSkgeworCQkJLyogU2tpcCBwYXJhbWV0ZXIgKi8KKwkJCXJldHVybiBwLnBsKzI7CisJCX0gZWxzZSB7CisJCQkvKiBFeHRyYWN0IHN1YnNldCBvZiBpdCwgZmFsbHRocm91Z2ggKi8KKwkJCWV4dHJhY3RfbGVuID0gdHlwZSAmIFBWX01BU0s7CisJCX0KKwl9CisKKworCXN3aXRjaCAoZXh0cmFjdF9sZW4pIHsKKwljYXNlIDE6CisJCW4gKz0gaXJkYV9wYXJhbV91bnBhY2soYnVmKzIsICJiIiwgJnAucHYuaSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbiArPSBpcmRhX3BhcmFtX3VucGFjayhidWYrMiwgInMiLCAmcC5wdi5pKTsKKwkJaWYgKHR5cGUgJiBQVl9CSUdfRU5ESUFOKQorCQkJcC5wdi5pID0gYmUxNl90b19jcHUoKF9fdTE2KSBwLnB2LmkpOworCQllbHNlCisJCQlwLnB2LmkgPSBsZTE2X3RvX2NwdSgoX191MTYpIHAucHYuaSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJbiArPSBpcmRhX3BhcmFtX3VucGFjayhidWYrMiwgImkiLCAmcC5wdi5pKTsKKwkJaWYgKHR5cGUgJiBQVl9CSUdfRU5ESUFOKQorCQkJYmUzMl90b19jcHVzKCZwLnB2LmkpOworCQllbHNlCisJCQlsZTMyX3RvX2NwdXMoJnAucHYuaSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfV0FSTklORygiJXM6IGxlbmd0aCAlZCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIHAucGwpOworCisJCS8qIFNraXAgcGFyYW1ldGVyICovCisJCXJldHVybiBwLnBsKzI7CisJfQorCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgcGk9JSN4LCBwbD0lZCwgcGk9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgcC5waSwgcC5wbCwgcC5wdi5pKTsKKwkvKiBDYWxsIGhhbmRsZXIgZm9yIHRoaXMgcGFyYW1ldGVyICovCisJZXJyID0gKCpmdW5jKShzZWxmLCAmcCwgUFZfUFVUKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBwLnBsKzI7IC8qIEV4dHJhY3RlZCBwbCsyIGJ5dGVzICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2V4dHJhY3Rfc3RyaW5nIChzZWxmLCBidWYsIGxlbiwgdHlwZSwgZnVuYykKKyAqLworc3RhdGljIGludCBpcmRhX2V4dHJhY3Rfc3RyaW5nKHZvaWQgKnNlbGYsIF9fdTggKmJ1ZiwgaW50IGxlbiwgX191OCBwaSwKKwkJCSAgICAgICBQVl9UWVBFIHR5cGUsIFBJX0hBTkRMRVIgZnVuYykKK3sKKwljaGFyIHN0clszM107CisJaXJkYV9wYXJhbV90IHA7CisJaW50IGVycjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlwLnBpID0gcGk7ICAgICAvKiBJbiBjYXNlIGhhbmRsZXIgbmVlZHMgdG8ga25vdyAqLworCXAucGwgPSBidWZbMV07IC8qIEV4dHJhY3QgbGVuZ2h0IG9mIHZhbHVlICovCisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBwaT0lI3gsIHBsPSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIHAucGksIHAucGwpOworCisJLyogQ2hlY2sgaWYgYnVmZmVyIGlzIGxvbmcgZW5vdWdoIGZvciBwYXJzaW5nICovCisJaWYgKGxlbiA8ICgyK3AucGwpKSB7CisJCUlSREFfV0FSTklORygiJXM6IGJ1ZmZlciB0byBzaG9ydCBmb3IgcGFyc2luZyEgIgorCQkJICAgICAiTmVlZCAlZCBieXRlcywgYnV0IGxlbiBpcyBvbmx5ICVkXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIHAucGwsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBTaG91bGQgYmUgc2FmZSB0byBjb3B5IHN0cmluZyBsaWtlIHRoaXMgc2luY2Ugd2UgaGF2ZSBhbHJlYWR5CisJICogY2hlY2tlZCB0aGF0IHRoZSBidWZmZXIgaXMgbG9uZyBlbm91Z2ggKi8KKwlzdHJuY3B5KHN0ciwgYnVmKzIsIHAucGwpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgc3RyPTB4JTAyeCAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgKF9fdTgpIHN0clswXSwgKF9fdTgpIHN0clsxXSk7CisKKwkvKiBOdWxsIHRlcm1pbmF0ZSBzdHJpbmcgKi8KKwlzdHJbcC5wbCsxXSA9ICdcMCc7CisKKwlwLnB2LmMgPSBzdHI7IC8qIEhhbmRsZXIgd2lsbCBuZWVkIHRvIHRha2UgYSBjb3B5ICovCisKKwkvKiBDYWxsIGhhbmRsZXIgZm9yIHRoaXMgcGFyYW1ldGVyICovCisJZXJyID0gKCpmdW5jKShzZWxmLCAmcCwgUFZfUFVUKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBwLnBsKzI7IC8qIEV4dHJhY3RlZCBwbCsyIGJ5dGVzICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2V4dHJhY3Rfb2N0c2VxIChzZWxmLCBidWYsIGxlbiwgdHlwZSwgZnVuYykKKyAqLworc3RhdGljIGludCBpcmRhX2V4dHJhY3Rfb2N0c2VxKHZvaWQgKnNlbGYsIF9fdTggKmJ1ZiwgaW50IGxlbiwgX191OCBwaSwKKwkJCSAgICAgICBQVl9UWVBFIHR5cGUsIFBJX0hBTkRMRVIgZnVuYykKK3sKKwlpcmRhX3BhcmFtX3QgcDsKKworCXAucGkgPSBwaTsgICAgIC8qIEluIGNhc2UgaGFuZGxlciBuZWVkcyB0byBrbm93ICovCisJcC5wbCA9IGJ1ZlsxXTsgLyogRXh0cmFjdCBsZW5naHQgb2YgdmFsdWUgKi8KKworCS8qIENoZWNrIGlmIGJ1ZmZlciBpcyBsb25nIGVub3VnaCBmb3IgcGFyc2luZyAqLworCWlmIChsZW4gPCAoMitwLnBsKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBidWZmZXIgdG8gc2hvcnQgZm9yIHBhcnNpbmchICIKKwkJCSAgICAgIk5lZWQgJWQgYnl0ZXMsIGJ1dCBsZW4gaXMgb25seSAlZFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBwLnBsLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgbm90IGltcGxcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlyZXR1cm4gcC5wbCsyOyAvKiBFeHRyYWN0ZWQgcGwrMiBieXRlcyAqLworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9wYXJhbV9wYWNrIChza2IsIGZtdCwgLi4uKQorICoKKyAqICAgIEZvcm1hdDoKKyAqICAgICAgICAnaScgPSAzMiBiaXRzIGludGVnZXIKKyAqICAgICAgICAncycgPSBzdHJpbmcKKyAqCisgKi8KK2ludCBpcmRhX3BhcmFtX3BhY2soX191OCAqYnVmLCBjaGFyICpmbXQsIC4uLikKK3sKKwlpcmRhX3B2X3QgYXJnOworCXZhX2xpc3QgYXJnczsKKwljaGFyICpwOworCWludCBuID0gMDsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisKKwlmb3IgKHAgPSBmbXQ7ICpwICE9ICdcMCc7IHArKykgeworCQlzd2l0Y2ggKCpwKSB7CisJCWNhc2UgJ2InOiAgLyogOCBiaXRzIHVuc2lnbmVkIGJ5dGUgKi8KKwkJCWJ1ZltuKytdID0gKF9fdTgpdmFfYXJnKGFyZ3MsIGludCk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6ICAvKiAxNiBiaXRzIHVuc2lnbmVkIHNob3J0ICovCisJCQlhcmcuaSA9IChfX3UxNil2YV9hcmcoYXJncywgaW50KTsKKwkJCXB1dF91bmFsaWduZWQoKF9fdTE2KWFyZy5pLCAoX191MTYgKikoYnVmK24pKTsgbis9MjsKKwkJCWJyZWFrOworCQljYXNlICdpJzogIC8qIDMyIGJpdHMgdW5zaWduZWQgaW50ZWdlciAqLworCQkJYXJnLmkgPSB2YV9hcmcoYXJncywgX191MzIpOworCQkJcHV0X3VuYWxpZ25lZChhcmcuaSwgKF9fdTMyICopKGJ1ZituKSk7IG4rPTQ7CisJCQlicmVhazsKKyNpZiAwCisJCWNhc2UgJ2MnOiAvKiBcMCB0ZXJtaW5hdGVkIHN0cmluZyAqLworCQkJYXJnLmMgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKKwkJCXN0cmNweShidWYrbiwgYXJnLmMpOworCQkJbiArPSBzdHJsZW4oYXJnLmMpICsgMTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQl2YV9lbmQoYXJncyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlyZGFfcGFyYW1fcGFjayk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3BhcmFtX3VucGFjayAoc2tiLCBmbXQsIC4uLikKKyAqLworc3RhdGljIGludCBpcmRhX3BhcmFtX3VucGFjayhfX3U4ICpidWYsIGNoYXIgKmZtdCwgLi4uKQoreworCWlyZGFfcHZfdCBhcmc7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgKnA7CisJaW50IG4gPSAwOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKworCWZvciAocCA9IGZtdDsgKnAgIT0gJ1wwJzsgcCsrKSB7CisJCXN3aXRjaCAoKnApIHsKKwkJY2FzZSAnYic6ICAvKiA4IGJpdHMgYnl0ZSAqLworCQkJYXJnLmlwID0gdmFfYXJnKGFyZ3MsIF9fdTMyICopOworCQkJKmFyZy5pcCA9IGJ1ZltuKytdOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOiAgLyogMTYgYml0cyBzaG9ydCAqLworCQkJYXJnLmlwID0gdmFfYXJnKGFyZ3MsIF9fdTMyICopOworCQkJKmFyZy5pcCA9IGdldF91bmFsaWduZWQoKF9fdTE2ICopKGJ1ZituKSk7IG4rPTI7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6ICAvKiAzMiBiaXRzIHVuc2lnbmVkIGludGVnZXIgKi8KKwkJCWFyZy5pcCA9IHZhX2FyZyhhcmdzLCBfX3UzMiAqKTsKKwkJCSphcmcuaXAgPSBnZXRfdW5hbGlnbmVkKChfX3UzMiAqKShidWYrbikpOyBuKz00OworCQkJYnJlYWs7CisjaWYgMAorCQljYXNlICdjJzogICAvKiBcMCB0ZXJtaW5hdGVkIHN0cmluZyAqLworCQkJYXJnLmMgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKKwkJCXN0cmNweShhcmcuYywgYnVmK24pOworCQkJbiArPSBzdHJsZW4oYXJnLmMpICsgMTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQl2YV9lbmQoYXJncyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCX0KKwl2YV9lbmQoYXJncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfcGFyYW1faW5zZXJ0IChzZWxmLCBwaSwgYnVmLCBsZW4sIGluZm8pCisgKgorICogICAgSW5zZXJ0IHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIChwaSkgaW50byBidWZmZXIuIFJldHVybnMgbnVtYmVyIG9mCisgKiAgICBieXRlcyBpbnNlcnRlZAorICovCitpbnQgaXJkYV9wYXJhbV9pbnNlcnQodm9pZCAqc2VsZiwgX191OCBwaSwgX191OCAqYnVmLCBpbnQgbGVuLAorCQkgICAgICBwaV9wYXJhbV9pbmZvX3QgKmluZm8pCit7CisJcGlfbWlub3JfaW5mb190ICpwaV9taW5vcl9pbmZvOworCV9fdTggcGlfbWlub3I7CisJX191OCBwaV9tYWpvcjsKKwlpbnQgdHlwZTsKKwlpbnQgcmV0ID0gLTE7CisJaW50IG4gPSAwOworCisJSVJEQV9BU1NFUlQoYnVmICE9IE5VTEwsIHJldHVybiByZXQ7KTsKKwlJUkRBX0FTU0VSVChpbmZvICE9IDAsIHJldHVybiByZXQ7KTsKKworCXBpX21pbm9yID0gcGkgJiBpbmZvLT5waV9tYXNrOworCXBpX21ham9yID0gcGkgPj4gaW5mby0+cGlfbWFqb3Jfb2Zmc2V0OworCisJLyogQ2hlY2sgaWYgdGhlIGlkZW50aWZpZXIgdmFsdWUgKHBpKSBpcyB2YWxpZCAqLworCWlmICgocGlfbWFqb3IgPiBpbmZvLT5sZW4tMSkgfHwKKwkgICAgKHBpX21pbm9yID4gaW5mby0+dGFibGVzW3BpX21ham9yXS5sZW4tMSkpCisJeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBubyBoYW5kbGVyIGZvciBwYXJhbWV0ZXI9MHglMDJ4XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBwaSk7CisKKwkJLyogU2tpcCB0aGlzIHBhcmFtZXRlciAqLworCQlyZXR1cm4gLTE7CisJfQorCisJLyogTG9va3VwIHRoZSBpbmZvIG9uIGhvdyB0byBwYXJzZSB0aGlzIHBhcmFtZXRlciAqLworCXBpX21pbm9yX2luZm8gPSAmaW5mby0+dGFibGVzW3BpX21ham9yXS5waV9taW5vcl9jYWxsX3RhYmxlW3BpX21pbm9yXTsKKworCS8qIEZpbmQgZXhwZWN0ZWQgZGF0YSB0eXBlIGZvciB0aGlzIHBhcmFtZXRlciBpZGVudGlmaWVyIChwaSkqLworCXR5cGUgPSBwaV9taW5vcl9pbmZvLT50eXBlOworCisJLyogIENoZWNrIGlmIGhhbmRsZXIgaGFzIGJlZW4gaW1wbGVtZW50ZWQgKi8KKwlpZiAoIXBpX21pbm9yX2luZm8tPmZ1bmMpIHsKKwkJSVJEQV9NRVNTQUdFKCIlczogbm8gaGFuZGxlciBmb3IgcGk9JSN4XG4iLCBfX0ZVTkNUSU9OX18sIHBpKTsKKwkJLyogU2tpcCB0aGlzIHBhcmFtZXRlciAqLworCQlyZXR1cm4gLTE7CisJfQorCisJLyogSW5zZXJ0IHBhcmFtZXRlciB2YWx1ZSAqLworCXJldCA9ICgqcHZfaW5zZXJ0X3RhYmxlW3R5cGUgJiBQVl9NQVNLXSkoc2VsZiwgYnVmK24sIGxlbiwgcGksIHR5cGUsCisJCQkJCQkgcGlfbWlub3JfaW5mby0+ZnVuYyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaXJkYV9wYXJhbV9pbnNlcnQpOworCisvKgorICogRnVuY3Rpb24gaXJkYV9wYXJhbV9leHRyYWN0IChzZWxmLCBidWYsIGxlbiwgaW5mbykKKyAqCisgKiAgICBQYXJzZSBhbGwgcGFyYW1ldGVycy4gSWYgbGVuIGlzIGNvcnJlY3QsIHRoZW4gZXZlcnl0aGluZyBzaG91bGQgYmUKKyAqICAgIHNhZmUuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdhcyBwYXJzZWQKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9wYXJhbV9leHRyYWN0KHZvaWQgKnNlbGYsIF9fdTggKmJ1ZiwgaW50IGxlbiwKKwkJCSAgICAgIHBpX3BhcmFtX2luZm9fdCAqaW5mbykKK3sKKwlwaV9taW5vcl9pbmZvX3QgKnBpX21pbm9yX2luZm87CisJX191OCBwaV9taW5vcjsKKwlfX3U4IHBpX21ham9yOworCWludCB0eXBlOworCWludCByZXQgPSAtMTsKKwlpbnQgbiA9IDA7CisKKwlJUkRBX0FTU0VSVChidWYgIT0gTlVMTCwgcmV0dXJuIHJldDspOworCUlSREFfQVNTRVJUKGluZm8gIT0gMCwgcmV0dXJuIHJldDspOworCisJcGlfbWlub3IgPSBidWZbbl0gJiBpbmZvLT5waV9tYXNrOworCXBpX21ham9yID0gYnVmW25dID4+IGluZm8tPnBpX21ham9yX29mZnNldDsKKworCS8qIENoZWNrIGlmIHRoZSBpZGVudGlmaWVyIHZhbHVlIChwaSkgaXMgdmFsaWQgKi8KKwlpZiAoKHBpX21ham9yID4gaW5mby0+bGVuLTEpIHx8CisJICAgIChwaV9taW5vciA+IGluZm8tPnRhYmxlc1twaV9tYWpvcl0ubGVuLTEpKQorCXsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgbm8gaGFuZGxlciBmb3IgcGFyYW1ldGVyPTB4JTAyeFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgYnVmWzBdKTsKKworCQkvKiBTa2lwIHRoaXMgcGFyYW1ldGVyICovCisJCXJldHVybiAyICsgYnVmW24gKyAxXTsgIC8qIENvbnRpbnVlICovCisJfQorCisJLyogTG9va3VwIHRoZSBpbmZvIG9uIGhvdyB0byBwYXJzZSB0aGlzIHBhcmFtZXRlciAqLworCXBpX21pbm9yX2luZm8gPSAmaW5mby0+dGFibGVzW3BpX21ham9yXS5waV9taW5vcl9jYWxsX3RhYmxlW3BpX21pbm9yXTsKKworCS8qIEZpbmQgZXhwZWN0ZWQgZGF0YSB0eXBlIGZvciB0aGlzIHBhcmFtZXRlciBpZGVudGlmaWVyIChwaSkqLworCXR5cGUgPSBwaV9taW5vcl9pbmZvLT50eXBlOworCisJSVJEQV9ERUJVRygzLCAiJXMoKSwgcGk9WyVkLCVkXSwgdHlwZT0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBwaV9tYWpvciwgcGlfbWlub3IsIHR5cGUpOworCisJLyogIENoZWNrIGlmIGhhbmRsZXIgaGFzIGJlZW4gaW1wbGVtZW50ZWQgKi8KKwlpZiAoIXBpX21pbm9yX2luZm8tPmZ1bmMpIHsKKwkJSVJEQV9NRVNTQUdFKCIlczogbm8gaGFuZGxlciBmb3IgcGk9JSN4XG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIGJ1ZltuXSk7CisJCS8qIFNraXAgdGhpcyBwYXJhbWV0ZXIgKi8KKwkJcmV0dXJuIDIgKyBidWZbbiArIDFdOyAvKiBDb250aW51ZSAqLworCX0KKworCS8qIFBhcnNlIHBhcmFtZXRlciB2YWx1ZSAqLworCXJldCA9ICgqcHZfZXh0cmFjdF90YWJsZVt0eXBlICYgUFZfTUFTS10pKHNlbGYsIGJ1ZituLCBsZW4sIGJ1ZltuXSwKKwkJCQkJCSAgdHlwZSwgcGlfbWlub3JfaW5mby0+ZnVuYyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfcGFyYW1fZXh0cmFjdF9hbGwgKHNlbGYsIGJ1ZiwgbGVuLCBpbmZvKQorICoKKyAqICAgIFBhcnNlIGFsbCBwYXJhbWV0ZXJzLiBJZiBsZW4gaXMgY29ycmVjdCwgdGhlbiBldmVyeXRoaW5nIHNob3VsZCBiZQorICogICAgc2FmZS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2FzIHBhcnNlZAorICoKKyAqLworaW50IGlyZGFfcGFyYW1fZXh0cmFjdF9hbGwodm9pZCAqc2VsZiwgX191OCAqYnVmLCBpbnQgbGVuLCAKKwkJCSAgIHBpX3BhcmFtX2luZm9fdCAqaW5mbykKK3sKKwlpbnQgcmV0ID0gLTE7CisJaW50IG4gPSAwOworCisJSVJEQV9BU1NFUlQoYnVmICE9IE5VTEwsIHJldHVybiByZXQ7KTsKKwlJUkRBX0FTU0VSVChpbmZvICE9IDAsIHJldHVybiByZXQ7KTsKKworCS8qCisJICogUGFyc2UgYWxsIHBhcmFtZXRlcnMuIEVhY2ggcGFyYW1ldGVyIG11c3QgYmUgYXQgbGVhc3QgdHdvIGJ5dGVzCisJICogbG9uZyBvciBlbHNlIHRoZXJlIGlzIG5vIHBvaW50IGluIHRyeWluZyB0byBwYXJzZSBpdAorCSAqLworCXdoaWxlIChsZW4gPiAyKSB7CisJCXJldCA9IGlyZGFfcGFyYW1fZXh0cmFjdChzZWxmLCBidWYrbiwgbGVuLCBpbmZvKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCW4gKz0gcmV0OworCQlsZW4gLT0gcmV0OworCX0KKwlyZXR1cm4gbjsKK30KK0VYUE9SVF9TWU1CT0woaXJkYV9wYXJhbV9leHRyYWN0X2FsbCk7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9xb3MuYyBiL25ldC9pcmRhL3Fvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzMyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9xb3MuYwpAQCAtMCwwICsxLDc3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgcW9zLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgSXJMQVAgUW9TIHBhcmFtZXRlciBuZWdvdGlhdGlvbgorICogU3RhdHVzOiAgICAgICAgU3RhYmxlCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBUdWUgU2VwICA5IDAwOjAwOjI2IDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBKYW4gMzAgMTQ6Mjk6MTYgMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvcGFyYW1ldGVycy5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3Fvcy5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CisKKy8qCisgKiBNYXhpbXVtIHZhbHVlcyBvZiB0aGUgYmF1ZCByYXRlIHdlIG5lZ29jaWF0ZSB3aXRoIHRoZSBvdGhlciBlbmQuCisgKiBNb3N0IG9mdGVuLCB5b3UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UgdGhhdCwgYmVjYXVzZSBMaW51eC1JckRBIHdpbGwKKyAqIHVzZSB0aGUgbWF4aW11bSBvZmZlcmVkIGJ5IHRoZSBsaW5rIGxheWVyLCB3aGljaCB1c3VhbGx5IHdvcmtzIGZpbmUuCisgKiBJbiBzb21lIHZlcnkgcmFyZSBjYXNlcywgeW91IG1heSB3YW50IHRvIGxpbWl0IGl0IHRvIGxvd2VyIHNwZWVkcy4uLgorICovCitpbnQgc3lzY3RsX21heF9iYXVkX3JhdGUgPSAxNjAwMDAwMDsKKy8qCisgKiBNYXhpbXVtIHZhbHVlIG9mIHRoZSBsYXAgZGlzY29ubmVjdCB0aW1lciB3ZSBuZWdvY2lhdGUgd2l0aCB0aGUgb3RoZXIgZW5kLgorICogTW9zdCBvZnRlbiwgdGhlIHZhbHVlIGJlbG93IHJlcHJlc2VudCB0aGUgYmVzdCBjb21wcm9taXNlLCBidXQgc29tZSB1c2VyCisgKiBtYXkgd2FudCB0byBrZWVwIHRoZSBMQVAgYWxpdmUgbG9uZ3VlciBvciBzaG9ydGVyIGluIGNhc2Ugb2YgbGluayBmYWlsdXJlLgorICogUmVtZW1iZXIgdGhhdCB0aGUgdGhyZXNob2xkIHRpbWUgKGVhcmx5IHdhcm5pbmcpIGlzIGZpeGVkIHRvIDNzLi4uCisgKi8KK2ludCBzeXNjdGxfbWF4X25vcmVwbHlfdGltZSA9IDEyOworLyoKKyAqIE1pbmltdW0gdHVybiB0aW1lIHRvIGJlIGFwcGxpZWQgYmVmb3JlIHRyYW5zbWl0dGluZyB0byB0aGUgcGVlci4KKyAqIE5vbnplcm8gdmFsdWVzICh1c2VjKSBhcmUgdXNlZCBhcyBsb3dlciBsaW1pdCB0byB0aGUgcGVyLWNvbm5lY3Rpb24KKyAqIG10dCB2YWx1ZSB3aGljaCB3YXMgYW5ub3VuY2VkIGJ5IHRoZSBvdGhlciBlbmQgZHVyaW5nIG5lZ290aWF0aW9uLgorICogTWlnaHQgYmUgaGVscGZ1bCBpZiB0aGUgcGVlciBkZXZpY2UgcHJvdmlkZXMgdG9vIHNob3J0IG10dC4KKyAqIERlZmF1bHQgaXMgMTB1cyB3aGljaCBtZWFucyB1c2luZyB0aGUgdW5tb2RpZmllZCB2YWx1ZSBnaXZlbiBieSB0aGUKKyAqIHBlZXIgZXhjZXB0IGlmIGl0J3MgMCAoMCBpcyBsaWtlbHkgYSBidWcgaW4gdGhlIG90aGVyIHN0YWNrKS4KKyAqLwordW5zaWduZWQgc3lzY3RsX21pbl90eF90dXJuX3RpbWUgPSAxMDsKKy8qCisgKiBNYXhpbXVtIGRhdGEgc2l6ZSB0byBiZSB1c2VkIGluIHRyYW5zbWlzc2lvbiBpbiBwYXlsb2FkIG9mIExBUCBmcmFtZS4KKyAqIFRoZXJlIGlzIGEgYml0IG9mIGNvbmZ1c2lvbiBpbiB0aGUgSXJEQSBzcGVjIDoKKyAqIFRoZSBMQVAgc3BlYyBkZWZpbmVzIHRoZSBwYXlsb2FkIG9mIGEgTEFQIGZyYW1lIChJIGZpZWxkKSB0byBiZQorICogMjA0OCBieXRlcyBtYXggKElyTEFQIDEuMSwgY2hhcHQgNi42LjUsIHA0MCkuCisgKiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIFBIWSBtZW50aW9uIGZyYW1lcyBvZiAyMDQ4IGJ5dGVzIG1heCAoSXJQSFkKKyAqIDEuMiwgY2hhcHQgNS4zLjIuMSwgcDQxKS4gQnV0LCB0aGlzIG51bWJlciBpbmNsdWRlcyB0aGUgTEFQIGhlYWRlcgorICogKDIgYnl0ZXMpLCBhbmQgQ1JDICgzMiBiaXRzIGF0IDQgTWIvcykuIFNvLCBmb3IgdGhlIEkgZmllbGQgKExBUAorICogcGF5bG9hZCksIHRoYXQncyBvbmx5IDIwNDIgYnl0ZXMuIE91cHMgIQorICogTXkgbnNjLWlyY2MgaGFyZHdhcmUgaGFzIHRyb3VibGVzIHJlY2VpdmluZyAyMDQ4IGJ5dGVzIGZyYW1lcyBhdCA0IE1iL3MsCisgKiBzbyBhZGp1c3QgdG8gMjA0Mi4uLiBJIGRvbid0IGtub3cgaWYgdGhpcyBidWcgYXBwbGllcyBvbmx5IGZvciAyMDQ4CisgKiBieXRlcyBmcmFtZXMgb3IgYWxsIG5lZ290aWF0ZWQgZnJhbWUgc2l6ZXMsIGJ1dCB5b3UgY2FuIHVzZSB0aGUgc3lzY3RsCisgKiB0byBwbGF5IHdpdGggdGhpcyB2YWx1ZSBhbnl3YXkuCisgKiBKZWFuIElJICovCit1bnNpZ25lZCBzeXNjdGxfbWF4X3R4X2RhdGFfc2l6ZSA9IDIwNDI7CisvKgorICogTWF4aW11bSB0cmFuc21pdCB3aW5kb3csIGkuZS4gbnVtYmVyIG9mIExBUCBmcmFtZXMgYmV0d2VlbiB0dXJuLWFyb3VuZC4KKyAqIFRoaXMgYWxsb3cgdG8gb3ZlcnJpZGUgd2hhdCB0aGUgcGVlciB0b2xkIHVzLiBTb21lIHBlZXJzIGFyZSBidWdneSBhbmQKKyAqIGRvbid0IGFsd2F5cyBzdXBwb3J0IHdoYXQgdGhleSB0ZWxsIHVzLgorICogSmVhbiBJSSAqLwordW5zaWduZWQgc3lzY3RsX21heF90eF93aW5kb3cgPSA3OworCitzdGF0aWMgaW50IGlybGFwX3BhcmFtX2JhdWRfcmF0ZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCk7CitzdGF0aWMgaW50IGlybGFwX3BhcmFtX2xpbmtfZGlzY29ubmVjdCh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJtLCAKKwkJCQkgICAgICAgaW50IGdldCk7CitzdGF0aWMgaW50IGlybGFwX3BhcmFtX21heF90dXJuX3RpbWUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgICAgaW50IGdldCk7CitzdGF0aWMgaW50IGlybGFwX3BhcmFtX2RhdGFfc2l6ZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCk7CitzdGF0aWMgaW50IGlybGFwX3BhcmFtX3dpbmRvd19zaXplKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICBpbnQgZ2V0KTsKK3N0YXRpYyBpbnQgaXJsYXBfcGFyYW1fYWRkaXRpb25hbF9ib2ZzKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcm0sIAorCQkJCSAgICAgICBpbnQgZ2V0KTsKK3N0YXRpYyBpbnQgaXJsYXBfcGFyYW1fbWluX3R1cm5fdGltZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgCisJCQkJICAgICBpbnQgZ2V0KTsKKworI2lmbmRlZiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVworc3RhdGljIF9fdTMyIGlybGFwX3JlcXVlc3RlZF9saW5lX2NhcGFjaXR5KHN0cnVjdCBxb3NfaW5mbyAqcW9zKTsKKyNlbmRpZgorCitzdGF0aWMgX191MzIgbWluX3R1cm5fdGltZXNbXSAgPSB7IDEwMDAwLCA1MDAwLCAxMDAwLCA1MDAsIDEwMCwgNTAsIDEwLCAwIH07IC8qIHVzICovCitzdGF0aWMgX191MzIgYmF1ZF9yYXRlc1tdICAgICAgPSB7IDI0MDAsIDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgNTc2MDAwLCAKKwkJCQkgICAxMTUyMDAwLCA0MDAwMDAwLCAxNjAwMDAwMCB9OyAgICAgICAgICAgLyogYnBzICovCitzdGF0aWMgX191MzIgZGF0YV9zaXplc1tdICAgICAgPSB7IDY0LCAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4IH07ICAgICAgICAvKiBieXRlcyAqLworc3RhdGljIF9fdTMyIGFkZF9ib2ZzW10gICAgICAgID0geyA0OCwgMjQsIDEyLCA1LCAzLCAyLCAxLCAwIH07ICAgICAgICAgICAgLyogYnl0ZXMgKi8KK3N0YXRpYyBfX3UzMiBtYXhfdHVybl90aW1lc1tdICA9IHsgNTAwLCAyNTAsIDEwMCwgNTAgfTsgICAgICAgICAgICAgICAgICAgIC8qIG1zICovCitzdGF0aWMgX191MzIgbGlua19kaXNjX3RpbWVzW10gPSB7IDMsIDgsIDEyLCAxNiwgMjAsIDI1LCAzMCwgNDAgfTsgICAgICAgICAvKiBzZWNzICovCisKK3N0YXRpYyBfX3UzMiBtYXhfbGluZV9jYXBhY2l0aWVzWzEwXVs0XSA9IHsKKyAgICAgICAvKiA1MDAgbXMgICAgIDI1MCBtcyAgMTAwIG1zICA1MCBtcyAobWF4IHR1cm4gdGltZSkgKi8KKwl7ICAgIDEwMCwgICAgICAwLCAgICAgIDAsICAgICAwIH0sIC8qICAgICAyNDAwIGJwcyAqLworCXsgICAgNDAwLCAgICAgIDAsICAgICAgMCwgICAgIDAgfSwgLyogICAgIDk2MDAgYnBzICovCisJeyAgICA4MDAsICAgICAgMCwgICAgICAwLCAgICAgMCB9LCAvKiAgICAxOTIwMCBicHMgKi8KKwl7ICAgMTYwMCwgICAgICAwLCAgICAgIDAsICAgICAwIH0sIC8qICAgIDM4NDAwIGJwcyAqLworCXsgICAyMzYwLCAgICAgIDAsICAgICAgMCwgICAgIDAgfSwgLyogICAgNTc2MDAgYnBzICovCisJeyAgIDQ4MDAsICAgMjQwMCwgICAgOTYwLCAgIDQ4MCB9LCAvKiAgIDExNTIwMCBicHMgKi8KKwl7ICAyODgwMCwgIDExNTIwLCAgIDU3NjAsICAyODgwIH0sIC8qICAgNTc2MDAwIGJwcyAqLworCXsgIDU3NjAwLCAgMjg4MDAsICAxMTUyMCwgIDU3NjAgfSwgLyogIDExNTIwMDAgYnBzICovCisJeyAyMDAwMDAsIDEwMDAwMCwgIDQwMDAwLCAyMDAwMCB9LCAvKiAgNDAwMDAwMCBicHMgKi8KKwl7IDgwMDAwMCwgNDAwMDAwLCAxNjAwMDAsIDgwMDAwIH0sIC8qIDE2MDAwMDAwIGJwcyAqLworfTsKKworc3RhdGljIHBpX21pbm9yX2luZm9fdCBwaV9taW5vcl9jYWxsX3RhYmxlX3R5cGVfMFtdID0geworCXsgTlVMTCwgMCB9LAorLyogMDEgKi97IGlybGFwX3BhcmFtX2JhdWRfcmF0ZSwgICAgICAgUFZfSU5URUdFUiB8IFBWX0xJVFRMRV9FTkRJQU4gfSwKKwl7IE5VTEwsIDAgfSwKKwl7IE5VTEwsIDAgfSwKKwl7IE5VTEwsIDAgfSwKKwl7IE5VTEwsIDAgfSwKKwl7IE5VTEwsIDAgfSwKKwl7IE5VTEwsIDAgfSwKKy8qIDA4ICoveyBpcmxhcF9wYXJhbV9saW5rX2Rpc2Nvbm5lY3QsIFBWX0lOVF84X0JJVFMgfQorfTsKKworc3RhdGljIHBpX21pbm9yX2luZm9fdCBwaV9taW5vcl9jYWxsX3RhYmxlX3R5cGVfMVtdID0geworCXsgTlVMTCwgMCB9LAorCXsgTlVMTCwgMCB9LAorLyogODIgKi97IGlybGFwX3BhcmFtX21heF90dXJuX3RpbWUsICAgUFZfSU5UXzhfQklUUyB9LAorLyogODMgKi97IGlybGFwX3BhcmFtX2RhdGFfc2l6ZSwgICAgICAgUFZfSU5UXzhfQklUUyB9LAorLyogODQgKi97IGlybGFwX3BhcmFtX3dpbmRvd19zaXplLCAgICAgUFZfSU5UXzhfQklUUyB9LAorLyogODUgKi97IGlybGFwX3BhcmFtX2FkZGl0aW9uYWxfYm9mcywgUFZfSU5UXzhfQklUUyB9LAorLyogODYgKi97IGlybGFwX3BhcmFtX21pbl90dXJuX3RpbWUsICAgUFZfSU5UXzhfQklUUyB9LAorfTsKKworc3RhdGljIHBpX21ham9yX2luZm9fdCBwaV9tYWpvcl9jYWxsX3RhYmxlW10gPSB7CisJeyBwaV9taW5vcl9jYWxsX3RhYmxlX3R5cGVfMCwgOSB9LAorCXsgcGlfbWlub3JfY2FsbF90YWJsZV90eXBlXzEsIDcgfSwKK307CisKK3N0YXRpYyBwaV9wYXJhbV9pbmZvX3QgaXJsYXBfcGFyYW1faW5mbyA9IHsgcGlfbWFqb3JfY2FsbF90YWJsZSwgMiwgMHg3ZiwgNyB9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExPQ0FMIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIE5vdGUgOiB3ZSBzdGFydCB3aXRoIGEgYnVuY2ggb2YgbG9jYWwgc3Vicm91dGluZXMuCisgKiBBcyB0aGUgY29tcGlsZXIgaXMgIm9uZSBwYXNzIiwgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gZ2V0IHRoZW0gdG8KKyAqIGlubGluZSBwcm9wZXJseS4uLgorICogSmVhbiBJSQorICovCisvKgorICogRnVuY3Rpb24gdmFsdWVfaW5kZXggKHZhbHVlLCBhcnJheSwgc2l6ZSkKKyAqCisgKiAgICBSZXR1cm5zIHRoZSBpbmRleCB0byB0aGUgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCBhcnJheQorICovCitzdGF0aWMgaW5saW5lIGludCB2YWx1ZV9pbmRleChfX3UzMiB2YWx1ZSwgX191MzIgKmFycmF5LCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKwkKKwlmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykKKwkJaWYgKGFycmF5W2ldID09IHZhbHVlKQorCQkJYnJlYWs7CisJcmV0dXJuIGk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpbmRleF92YWx1ZSAoaW5kZXgsIGFycmF5KQorICoKKyAqICAgIFJldHVybnMgdmFsdWUgdG8gaW5kZXggaW4gYXJyYXksIGVhc3khCisgKgorICovCitzdGF0aWMgaW5saW5lIF9fdTMyIGluZGV4X3ZhbHVlKGludCBpbmRleCwgX191MzIgKmFycmF5KSAKK3sKKwlyZXR1cm4gYXJyYXlbaW5kZXhdOworfQorCisvKgorICogRnVuY3Rpb24gbXNiX2luZGV4ICh3b3JkKQorICoKKyAqICAgIFJldHVybnMgaW5kZXggdG8gbW9zdCBzaWduaWZpY2FudCBiaXQgKE1TQikgaW4gd29yZAorICoKKyAqLworc3RhdGljIGludCBtc2JfaW5kZXggKF9fdTE2IHdvcmQpIAoreworCV9fdTE2IG1zYiA9IDB4ODAwMDsKKwlpbnQgaW5kZXggPSAxNTsgICAvKiBDdXJyZW50IE1TQiAqLworCisJLyogQ2hlY2sgZm9yIGJ1Z2d5IHBlZXJzLgorCSAqIE5vdGUgOiB0aGVyZSBpcyBhIHNtYWxsIHByb2JhYmlsaXR5IHRoYXQgaXQgY291bGQgYmUgdXMsIGJ1dCBJCisJICogd291bGQgZXhwZWN0IGRyaXZlciBhdXRob3JzIHRvIGNhdGNoIHRoYXQgcHJldHR5IGVhcmx5IGFuZCBiZQorCSAqIGFibGUgdG8gY2hlY2sgcHJlY2lzZWx5IHdoYXQncyBnb2luZyBvbi4gSWYgYSBlbmQgdXNlciBzZWVzIHRoaXMsCisJICogaXQncyB2ZXJ5IGxpa2VseSB0aGUgcGVlci4gLSBKZWFuIElJICovCisJaWYgKHdvcmQgPT0gMCkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIERldGVjdGVkIGJ1Z2d5IHBlZXIsIGFkanVzdCBudWxsIFBWIHRvIDB4MSFcbiIsCisJCQkgX19GVU5DVElPTl9fKTsKKwkJLyogVGhlIG9ubHkgc2FmZSBjaG9pY2UgKHdlIGRvbid0IGtub3cgdGhlIGFycmF5IHNpemUpICovCisJCXdvcmQgPSAweDE7CisJfQorCisJd2hpbGUgKG1zYikgeworCQlpZiAod29yZCAmIG1zYikKKwkJCWJyZWFrOyAgIC8qIEZvdW5kIGl0ISAqLworCQltc2IgPj49MTsKKwkJaW5kZXgtLTsKKwl9CisJcmV0dXJuIGluZGV4OworfQorCisvKgorICogRnVuY3Rpb24gdmFsdWVfbG93ZXJfYml0cyAodmFsdWUsIGFycmF5KQorICoKKyAqICAgIFJldHVybnMgYSBiaXQgZmllbGQgbWFya2luZyBhbGwgcG9zc2liaWxpdHkgbG93ZXIgdGhhbiB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdmFsdWVfbG93ZXJfYml0cyhfX3UzMiB2YWx1ZSwgX191MzIgKmFycmF5LCBpbnQgc2l6ZSwgX191MTYgKmZpZWxkKQoreworCWludAlpOworCV9fdTE2CW1hc2sgPSAweDE7CisJX191MTYJcmVzdWx0ID0gMHgwOworCisJZm9yIChpPTA7IGkgPCBzaXplOyBpKyspIHsKKwkJLyogQWRkIHRoZSBjdXJyZW50IHZhbHVlIHRvIHRoZSBiaXQgZmllbGQsIHNoaWZ0IG1hc2sgKi8KKwkJcmVzdWx0IHw9IG1hc2s7CisJCW1hc2sgPDw9IDE7CisJCS8qIEZpbmlzaGVkID8gKi8KKwkJaWYgKGFycmF5W2ldID49IHZhbHVlKQorCQkJYnJlYWs7CisJfQorCS8qIFNlbmQgYmFjayBhIHZhbGlkIGluZGV4ICovCisJaWYoaSA+PSBzaXplKQorCSAgaSA9IHNpemUgLSAxOwkvKiBMYXN0IGl0ZW0gKi8KKwkqZmllbGQgPSByZXN1bHQ7CisJcmV0dXJuIGk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2YWx1ZV9oaWdoZXN0X2JpdCAodmFsdWUsIGFycmF5KQorICoKKyAqICAgIFJldHVybnMgYSBiaXQgZmllbGQgbWFya2luZyB0aGUgaGlnaGVzdCBwb3NzaWJpbGl0eSBsb3dlciB0aGFuIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIGludCB2YWx1ZV9oaWdoZXN0X2JpdChfX3UzMiB2YWx1ZSwgX191MzIgKmFycmF5LCBpbnQgc2l6ZSwgX191MTYgKmZpZWxkKQoreworCWludAlpOworCV9fdTE2CW1hc2sgPSAweDE7CisJX191MTYJcmVzdWx0ID0gMHgwOworCisJZm9yIChpPTA7IGkgPCBzaXplOyBpKyspIHsKKwkJLyogRmluaXNoZWQgPyAqLworCQlpZiAoYXJyYXlbaV0gPD0gdmFsdWUpCisJCQlicmVhazsKKwkJLyogU2hpZnQgbWFzayAqLworCQltYXNrIDw8PSAxOworCX0KKwkvKiBTZXQgdGhlIGN1cnJlbnQgdmFsdWUgdG8gdGhlIGJpdCBmaWVsZCAqLworCXJlc3VsdCB8PSBtYXNrOworCS8qIFNlbmQgYmFjayBhIHZhbGlkIGluZGV4ICovCisJaWYoaSA+PSBzaXplKQorCSAgaSA9IHNpemUgLSAxOwkvKiBMYXN0IGl0ZW0gKi8KKwkqZmllbGQgPSByZXN1bHQ7CisJcmV0dXJuIGk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1BSU4gQ0FMTFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfcW9zX2NvbXB1dGVfaW50ZXJzZWN0aW9uIChxb3MsIG5ldykKKyAqCisgKiAgICBDb21wdXRlIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG9sZCBRb1MgY2FwYWJpbGl0aWVzIHdpdGggbmV3IG9uZXMKKyAqCisgKi8KK3ZvaWQgaXJkYV9xb3NfY29tcHV0ZV9pbnRlcnNlY3Rpb24oc3RydWN0IHFvc19pbmZvICpxb3MsIHN0cnVjdCBxb3NfaW5mbyAqbmV3KQoreworCUlSREFfQVNTRVJUKHFvcyAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChuZXcgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwkvKiBBcHBseSAqLworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgICAgICAgJj0gbmV3LT5iYXVkX3JhdGUuYml0czsKKwlxb3MtPndpbmRvd19zaXplLmJpdHMgICAgICY9IG5ldy0+d2luZG93X3NpemUuYml0czsKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyAgICY9IG5ldy0+bWluX3R1cm5fdGltZS5iaXRzOworCXFvcy0+bWF4X3R1cm5fdGltZS5iaXRzICAgJj0gbmV3LT5tYXhfdHVybl90aW1lLmJpdHM7CisJcW9zLT5kYXRhX3NpemUuYml0cyAgICAgICAmPSBuZXctPmRhdGFfc2l6ZS5iaXRzOworCXFvcy0+bGlua19kaXNjX3RpbWUuYml0cyAgJj0gbmV3LT5saW5rX2Rpc2NfdGltZS5iaXRzOworCXFvcy0+YWRkaXRpb25hbF9ib2ZzLmJpdHMgJj0gbmV3LT5hZGRpdGlvbmFsX2JvZnMuYml0czsKKworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMgKHFvcykKKyAqCisgKiAgICBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGZvciBsYXllcnMgYW5kIGRyaXZlcnMgdG8gYmUgYWJsZSB0bworICogICAgc2V0IHRoZSBtYXhpbXVtIFFvUyBwb3NzaWJsZSBhbmQgdGhlbiAiYW5kIGluIiB0aGVpciBvd24gbGltaXRhdGlvbnMKKyAqIAorICovCit2b2lkIGlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJaW50IGk7CisJLyogCisJICogIFRoZXNlIGFyZSB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgdmFsdWVzIGFzIHNwZWNpZmllZCBvbiBwYWdlcworCSAqICAzOS00MyBpbiBJckxBUAorCSAqLworCisJLyogVXNlIHN5c2N0bCB0byBzZXQgc29tZSBjb25maWd1cmFibGUgdmFsdWVzLi4uICovCisJLyogU2V0IGNvbmZpZ3VyZWQgbWF4IHNwZWVkICovCisJaSA9IHZhbHVlX2xvd2VyX2JpdHMoc3lzY3RsX21heF9iYXVkX3JhdGUsIGJhdWRfcmF0ZXMsIDEwLAorCQkJICAgICAmcW9zLT5iYXVkX3JhdGUuYml0cyk7CisJc3lzY3RsX21heF9iYXVkX3JhdGUgPSBpbmRleF92YWx1ZShpLCBiYXVkX3JhdGVzKTsKKworCS8qIFNldCBjb25maWd1cmVkIG1heCBkaXNjIHRpbWUgKi8KKwlpID0gdmFsdWVfbG93ZXJfYml0cyhzeXNjdGxfbWF4X25vcmVwbHlfdGltZSwgbGlua19kaXNjX3RpbWVzLCA4LAorCQkJICAgICAmcW9zLT5saW5rX2Rpc2NfdGltZS5iaXRzKTsKKwlzeXNjdGxfbWF4X25vcmVwbHlfdGltZSA9IGluZGV4X3ZhbHVlKGksIGxpbmtfZGlzY190aW1lcyk7CisKKwkvKiBMU0IgaXMgZmlyc3QgYnl0ZSwgTVNCIGlzIHNlY29uZCBieXRlICovCisJcW9zLT5iYXVkX3JhdGUuYml0cyAgICAmPSAweDAzZmY7CisKKwlxb3MtPndpbmRvd19zaXplLmJpdHMgICAgID0gMHg3ZjsKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyAgID0gMHhmZjsKKwlxb3MtPm1heF90dXJuX3RpbWUuYml0cyAgID0gMHgwZjsKKwlxb3MtPmRhdGFfc2l6ZS5iaXRzICAgICAgID0gMHgzZjsKKwlxb3MtPmxpbmtfZGlzY190aW1lLmJpdHMgJj0gMHhmZjsKKwlxb3MtPmFkZGl0aW9uYWxfYm9mcy5iaXRzID0gMHhmZjsKK30KK0VYUE9SVF9TWU1CT0woaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcyk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9hZGp1c3RfcW9zX3NldHRpbmdzIChxb3MpCisgKgorICogICAgIEFkanVzdCBRb1Mgc2V0dGluZ3MgaW4gY2FzZSBzb21lIHZhbHVlcyBhcmUgbm90IHBvc3NpYmxlIHRvIHVzZSBiZWNhdXNlCisgKiAgICAgb2Ygb3RoZXIgc2V0dGluZ3MKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfYWRqdXN0X3Fvc19zZXR0aW5ncyhzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwlfX3UzMiBsaW5lX2NhcGFjaXR5OworCWludCBpbmRleDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgbWludHQgaXMgc2Vuc2libGUuCisJICogTWFpbiBjdWxwcml0IDogRXJpY3Nzb24gVDM5LiAtIEplYW4gSUkKKwkgKi8KKwlpZiAoc3lzY3RsX21pbl90eF90dXJuX3RpbWUgPiBxb3MtPm1pbl90dXJuX3RpbWUudmFsdWUpIHsKKwkJaW50IGk7CisKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBEZXRlY3RlZCBidWdneSBwZWVyLCBhZGp1c3QgbXR0IHRvICVkdXMhXG4iLAorCQkJIF9fRlVOQ1RJT05fXywgc3lzY3RsX21pbl90eF90dXJuX3RpbWUpOworCisJCS8qIFdlIGRvbid0IHJlYWxseSBuZWVkIGJpdHMsIGJ1dCBlYXNpZXIgdGhpcyB3YXkgKi8KKwkJaSA9IHZhbHVlX2hpZ2hlc3RfYml0KHN5c2N0bF9taW5fdHhfdHVybl90aW1lLCBtaW5fdHVybl90aW1lcywKKwkJCQkgICAgICA4LCAmcW9zLT5taW5fdHVybl90aW1lLmJpdHMpOworCQlzeXNjdGxfbWluX3R4X3R1cm5fdGltZSA9IGluZGV4X3ZhbHVlKGksIG1pbl90dXJuX3RpbWVzKTsKKwkJcW9zLT5taW5fdHVybl90aW1lLnZhbHVlID0gc3lzY3RsX21pbl90eF90dXJuX3RpbWU7CisJfQorCisJLyogCisJICogTm90IGFsbG93ZWQgdG8gdXNlIGEgbWF4IHR1cm4gdGltZSBsZXNzIHRoYW4gNTAwIG1zIGlmIHRoZSBiYXVkcmF0ZQorCSAqIGlzIGxlc3MgdGhhbiAxMTUyMDAKKwkgKi8KKwlpZiAoKHFvcy0+YmF1ZF9yYXRlLnZhbHVlIDwgMTE1MjAwKSAmJiAKKwkgICAgKHFvcy0+bWF4X3R1cm5fdGltZS52YWx1ZSA8IDUwMCkpCisJeworCQlJUkRBX0RFQlVHKDAsIAorCQkJICAgIiVzKCksIGFkanVzdGluZyBtYXggdHVybiB0aW1lIGZyb20gJWQgdG8gNTAwIG1zXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBxb3MtPm1heF90dXJuX3RpbWUudmFsdWUpOworCQlxb3MtPm1heF90dXJuX3RpbWUudmFsdWUgPSA1MDA7CisJfQorCQorCS8qCisJICogVGhlIGRhdGEgc2l6ZSBtdXN0IGJlIGFkanVzdGVkIGFjY29yZGluZyB0byB0aGUgYmF1ZCByYXRlIGFuZCBtYXggCisJICogdHVybiB0aW1lCisJICovCisJaW5kZXggPSB2YWx1ZV9pbmRleChxb3MtPmRhdGFfc2l6ZS52YWx1ZSwgZGF0YV9zaXplcywgNik7CisJbGluZV9jYXBhY2l0eSA9IGlybGFwX21heF9saW5lX2NhcGFjaXR5KHFvcy0+YmF1ZF9yYXRlLnZhbHVlLCAKKwkJCQkJCXFvcy0+bWF4X3R1cm5fdGltZS52YWx1ZSk7CisKKyNpZmRlZiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVworCXdoaWxlICgocW9zLT5kYXRhX3NpemUudmFsdWUgPiBsaW5lX2NhcGFjaXR5KSAmJiAoaW5kZXggPiAwKSkgeworCQlxb3MtPmRhdGFfc2l6ZS52YWx1ZSA9IGRhdGFfc2l6ZXNbaW5kZXgtLV07CisJCUlSREFfREVCVUcoMiwgIiVzKCksIHJlZHVjaW5nIGRhdGEgc2l6ZSB0byAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgcW9zLT5kYXRhX3NpemUudmFsdWUpOworCX0KKyNlbHNlIC8qIFVzZSBtZXRob2QgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi42LjExIG9mIElyTEFQICovCisJd2hpbGUgKGlybGFwX3JlcXVlc3RlZF9saW5lX2NhcGFjaXR5KHFvcykgPiBsaW5lX2NhcGFjaXR5KSB7CisJCUlSREFfQVNTRVJUKGluZGV4ICE9IDAsIHJldHVybjspOworCisJCS8qIE11c3QgYmUgYWJsZSB0byBzZW5kIGF0IGxlYXN0IG9uZSBmcmFtZSAqLworCQlpZiAocW9zLT53aW5kb3dfc2l6ZS52YWx1ZSA+IDEpIHsKKwkJCXFvcy0+d2luZG93X3NpemUudmFsdWUtLTsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIHJlZHVjaW5nIHdpbmRvdyBzaXplIHRvICVkXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXywgcW9zLT53aW5kb3dfc2l6ZS52YWx1ZSk7CisJCX0gZWxzZSBpZiAoaW5kZXggPiAxKSB7CisJCQlxb3MtPmRhdGFfc2l6ZS52YWx1ZSA9IGRhdGFfc2l6ZXNbaW5kZXgtLV07CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCByZWR1Y2luZyBkYXRhIHNpemUgdG8gJWRcbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBxb3MtPmRhdGFfc2l6ZS52YWx1ZSk7CisJCX0gZWxzZSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzKCksIG5vdGhpbmcgbW9yZSB3ZSBjYW4gZG8hXG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLworCS8qCisJICogRml4IHR4IGRhdGEgc2l6ZSBhY2NvcmRpbmcgdG8gdXNlciBsaW1pdHMgLSBKZWFuIElJCisJICovCisJaWYgKHFvcy0+ZGF0YV9zaXplLnZhbHVlID4gc3lzY3RsX21heF90eF9kYXRhX3NpemUpCisJCS8qIEFsbG93IG5vbiBkaXNjcmV0ZSBhZGp1c3RlbWVudCB0byBhdm9pZCBsb29zaW5nIGNhcGFjaXR5ICovCisJCXFvcy0+ZGF0YV9zaXplLnZhbHVlID0gc3lzY3RsX21heF90eF9kYXRhX3NpemU7CisJLyoKKwkgKiBPdmVycmlkZSBUeCB3aW5kb3cgaWYgdXNlciByZXF1ZXN0IGl0LiAtIEplYW4gSUkKKwkgKi8KKwlpZiAocW9zLT53aW5kb3dfc2l6ZS52YWx1ZSA+IHN5c2N0bF9tYXhfdHhfd2luZG93KQorCQlxb3MtPndpbmRvd19zaXplLnZhbHVlID0gc3lzY3RsX21heF90eF93aW5kb3c7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9uZWdvdGlhdGUgKHFvc19kZXZpY2UsIHFvc19zZXNzaW9uLCBza2IpCisgKgorICogICAgTmVnb3RpYXRlIFFvUyB2YWx1ZXMsIG5vdCByZWFsbHkgdGhhdCBtdWNoIG5lZ290aWF0aW9uIDotKQorICogICAgV2UganVzdCBzZXQgdGhlIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoZSBwZWVyIHN0YXRpb24KKyAqCisgKi8KK2ludCBpcmxhcF9xb3NfbmVnb3RpYXRlKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJaW50IHJldDsKKwkKKwlyZXQgPSBpcmRhX3BhcmFtX2V4dHJhY3RfYWxsKHNlbGYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIAorCQkJCSAgICAgJmlybGFwX3BhcmFtX2luZm8pOworCQorCS8qIENvbnZlcnQgdGhlIG5lZ290aWF0ZWQgYml0cyB0byB2YWx1ZXMgKi8KKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzZWxmLT5xb3NfdHgpOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJnNlbGYtPnFvc19yeCk7CisKKwlpcmxhcF9hZGp1c3RfcW9zX3NldHRpbmdzKCZzZWxmLT5xb3NfdHgpOworCisJSVJEQV9ERUJVRygyLCAiU2V0dGluZyBCQVVEX1JBVEUgdG8gJWQgYnBzLlxuIiwgCisJCSAgIHNlbGYtPnFvc190eC5iYXVkX3JhdGUudmFsdWUpOworCUlSREFfREVCVUcoMiwgIlNldHRpbmcgREFUQV9TSVpFIHRvICVkIGJ5dGVzXG4iLAorCQkgICBzZWxmLT5xb3NfdHguZGF0YV9zaXplLnZhbHVlKTsKKwlJUkRBX0RFQlVHKDIsICJTZXR0aW5nIFdJTkRPV19TSVpFIHRvICVkXG4iLCAKKwkJICAgc2VsZi0+cW9zX3R4LndpbmRvd19zaXplLnZhbHVlKTsKKwlJUkRBX0RFQlVHKDIsICJTZXR0aW5nIFhCT0ZTIHRvICVkXG4iLCAKKwkJICAgc2VsZi0+cW9zX3R4LmFkZGl0aW9uYWxfYm9mcy52YWx1ZSk7CisJSVJEQV9ERUJVRygyLCAiU2V0dGluZyBNQVhfVFVSTl9USU1FIHRvICVkIG1zLlxuIiwKKwkJICAgc2VsZi0+cW9zX3R4Lm1heF90dXJuX3RpbWUudmFsdWUpOworCUlSREFfREVCVUcoMiwgIlNldHRpbmcgTUlOX1RVUk5fVElNRSB0byAlZCB1c2Vjcy5cbiIsCisJCSAgIHNlbGYtPnFvc190eC5taW5fdHVybl90aW1lLnZhbHVlKTsKKwlJUkRBX0RFQlVHKDIsICJTZXR0aW5nIExJTktfRElTQyB0byAlZCBzZWNzLlxuIiwgCisJCSAgIHNlbGYtPnFvc190eC5saW5rX2Rpc2NfdGltZS52YWx1ZSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2luc2VydF9uZWdvdGlhdGlvbl9wYXJhbXMgKHFvcywgZnApCisgKgorICogICAgSW5zZXJ0IFFvUyBuZWdvdGlhaW9uIHBhcmFyYW1ldGVycyBpbnRvIGZyYW1lCisgKgorICovCitpbnQgaXJsYXBfaW5zZXJ0X3Fvc19uZWdvdGlhdGlvbl9wYXJhbXMoc3RydWN0IGlybGFwX2NiICpzZWxmLCAKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCisJLyogSW5zZXJ0IGRhdGEgcmF0ZSAqLworCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX0JBVURfUkFURSwgc2tiLT50YWlsLCAKKwkJCQlza2JfdGFpbHJvb20oc2tiKSwgJmlybGFwX3BhcmFtX2luZm8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXNrYl9wdXQoc2tiLCByZXQpOworCisJLyogSW5zZXJ0IG1heCB0dXJuYXJvdW5kIHRpbWUgKi8KKwlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9NQVhfVFVSTl9USU1FLCBza2ItPnRhaWwsIAorCQkJCXNrYl90YWlscm9vbShza2IpLCAmaXJsYXBfcGFyYW1faW5mbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJc2tiX3B1dChza2IsIHJldCk7CisKKwkvKiBJbnNlcnQgZGF0YSBzaXplICovCisJcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfREFUQV9TSVpFLCBza2ItPnRhaWwsIAorCQkJCXNrYl90YWlscm9vbShza2IpLCAmaXJsYXBfcGFyYW1faW5mbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJc2tiX3B1dChza2IsIHJldCk7CisKKwkvKiBJbnNlcnQgd2luZG93IHNpemUgKi8KKwlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9XSU5ET1dfU0laRSwgc2tiLT50YWlsLCAKKwkJCQlza2JfdGFpbHJvb20oc2tiKSwgJmlybGFwX3BhcmFtX2luZm8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXNrYl9wdXQoc2tiLCByZXQpOworCisJLyogSW5zZXJ0IGFkZGl0aW9uYWwgQk9GcyAqLworCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX0FERF9CT0ZTLCBza2ItPnRhaWwsIAorCQkJCXNrYl90YWlscm9vbShza2IpLCAmaXJsYXBfcGFyYW1faW5mbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJc2tiX3B1dChza2IsIHJldCk7CisKKwkvKiBJbnNlcnQgbWluaW11bSB0dXJuYXJvdW5kIHRpbWUgKi8KKwlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9NSU5fVFVSTl9USU1FLCBza2ItPnRhaWwsIAorCQkJCXNrYl90YWlscm9vbShza2IpLCAmaXJsYXBfcGFyYW1faW5mbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJc2tiX3B1dChza2IsIHJldCk7CisKKwkvKiBJbnNlcnQgbGluayBkaXNjb25uZWN0L3RocmVzaG9sZCB0aW1lICovCisJcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfTElOS19ESVNDLCBza2ItPnRhaWwsIAorCQkJCXNrYl90YWlscm9vbShza2IpLCAmaXJsYXBfcGFyYW1faW5mbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJc2tiX3B1dChza2IsIHJldCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3BhcmFtX2JhdWRfcmF0ZSAoaW5zdGFuY2UsIHBhcmFtLCBnZXQpCisgKgorICogICAgTmVnb3RpYXRlIGRhdGEtcmF0ZQorICoKKyAqLworc3RhdGljIGludCBpcmxhcF9wYXJhbV9iYXVkX3JhdGUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIGludCBnZXQpCit7CisJX191MTYgZmluYWw7CisKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJaWYgKGdldCkgeworCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnFvc19yeC5iYXVkX3JhdGUuYml0czsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgYmF1ZCByYXRlID0gMHglMDJ4XG4iLCAKKwkJCSAgIF9fRlVOQ1RJT05fXywgcGFyYW0tPnB2LmkpOwkJCisJfSBlbHNlIHsKKwkJLyogCisJCSAqICBTdGF0aW9ucyBtdXN0IGFncmVlIG9uIGJhdWQgcmF0ZSwgc28gY2FsY3VsYXRlCisJCSAqICBpbnRlcnNlY3Rpb24gCisJCSAqLworCQlJUkRBX0RFQlVHKDIsICJSZXF1ZXN0ZWQgQkFVRF9SQVRFOiAweCUwNHhcbiIsIChfX3UxNikgcGFyYW0tPnB2LmkpOworCQlmaW5hbCA9IChfX3UxNikgcGFyYW0tPnB2LmkgJiBzZWxmLT5xb3NfcnguYmF1ZF9yYXRlLmJpdHM7CisKKwkJSVJEQV9ERUJVRygyLCAiRmluYWwgQkFVRF9SQVRFOiAweCUwNHhcbiIsIGZpbmFsKTsKKwkJc2VsZi0+cW9zX3R4LmJhdWRfcmF0ZS5iaXRzID0gZmluYWw7CisJCXNlbGYtPnFvc19yeC5iYXVkX3JhdGUuYml0cyA9IGZpbmFsOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcGFyYW1fbGlua19kaXNjb25uZWN0IChpbnN0YW5jZSwgcGFyYW0sIGdldCkKKyAqCisgKiAgICBOZWdvdGlhdGUgbGluayBkaXNjb25uZWN0L3RocmVzaG9sZCB0aW1lLiAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYXBfcGFyYW1fbGlua19kaXNjb25uZWN0KHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICAgICAgaW50IGdldCkKK3sKKwlfX3UxNiBmaW5hbDsKKwkKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGluc3RhbmNlOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKwkKKwlpZiAoZ2V0KQorCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnFvc19yeC5saW5rX2Rpc2NfdGltZS5iaXRzOworCWVsc2UgeworCQkvKiAgCisJCSAqICBTdGF0aW9ucyBtdXN0IGFncmVlIG9uIGxpbmsgZGlzY29ubmVjdC90aHJlc2hvbGQgCisJCSAqICB0aW1lLgorCQkgKi8KKwkJSVJEQV9ERUJVRygyLCAiTElOS19ESVNDOiAlMDJ4XG4iLCAoX191OCkgcGFyYW0tPnB2LmkpOworCQlmaW5hbCA9IChfX3U4KSBwYXJhbS0+cHYuaSAmIHNlbGYtPnFvc19yeC5saW5rX2Rpc2NfdGltZS5iaXRzOworCisJCUlSREFfREVCVUcoMiwgIkZpbmFsIExJTktfRElTQzogJTAyeFxuIiwgZmluYWwpOworCQlzZWxmLT5xb3NfdHgubGlua19kaXNjX3RpbWUuYml0cyA9IGZpbmFsOworCQlzZWxmLT5xb3NfcngubGlua19kaXNjX3RpbWUuYml0cyA9IGZpbmFsOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3BhcmFtX21heF90dXJuX3RpbWUgKGluc3RhbmNlLCBwYXJhbSwgZ2V0KQorICoKKyAqICAgIE5lZ290aWF0ZSB0aGUgbWF4aW11bSB0dXJuYXJvdW5kIHRpbWUuIFRoaXMgaXMgYSB0eXBlIDEgcGFyYW1ldGVyIGFuZAorICogICAgd2lsbCBiZSBuZWdvdGlhdGVkIGluZGVwZW5kZW50bHkgZm9yIGVhY2ggc3RhdGlvbgorICoKKyAqLworc3RhdGljIGludCBpcmxhcF9wYXJhbV9tYXhfdHVybl90aW1lKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICAgIGludCBnZXQpCit7CisJc3RydWN0IGlybGFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBpbnN0YW5jZTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisJCisJaWYgKGdldCkKKwkJcGFyYW0tPnB2LmkgPSBzZWxmLT5xb3NfcngubWF4X3R1cm5fdGltZS5iaXRzOworCWVsc2UKKwkJc2VsZi0+cW9zX3R4Lm1heF90dXJuX3RpbWUuYml0cyA9IChfX3U4KSBwYXJhbS0+cHYuaTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcGFyYW1fZGF0YV9zaXplIChpbnN0YW5jZSwgcGFyYW0sIGdldCkKKyAqCisgKiAgICBOZWdvdGlhdGUgdGhlIGRhdGEgc2l6ZS4gVGhpcyBpcyBhIHR5cGUgMSBwYXJhbWV0ZXIgYW5kCisgKiAgICB3aWxsIGJlIG5lZ290aWF0ZWQgaW5kZXBlbmRlbnRseSBmb3IgZWFjaCBzdGF0aW9uCisgKgorICovCitzdGF0aWMgaW50IGlybGFwX3BhcmFtX2RhdGFfc2l6ZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCkKK3sKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGluc3RhbmNlOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKwkKKwlpZiAoZ2V0KQorCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnFvc19yeC5kYXRhX3NpemUuYml0czsKKwllbHNlCisJCXNlbGYtPnFvc190eC5kYXRhX3NpemUuYml0cyA9IChfX3U4KSBwYXJhbS0+cHYuaTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcGFyYW1fd2luZG93X3NpemUgKGluc3RhbmNlLCBwYXJhbSwgZ2V0KQorICoKKyAqICAgIE5lZ290aWF0ZSB0aGUgd2luZG93IHNpemUuIFRoaXMgaXMgYSB0eXBlIDEgcGFyYW1ldGVyIGFuZAorICogICAgd2lsbCBiZSBuZWdvdGlhdGVkIGluZGVwZW5kZW50bHkgZm9yIGVhY2ggc3RhdGlvbgorICoKKyAqLworc3RhdGljIGludCBpcmxhcF9wYXJhbV93aW5kb3dfc2l6ZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgCisJCQkJICAgaW50IGdldCkKK3sKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGluc3RhbmNlOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKwkKKwlpZiAoZ2V0KQorCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnFvc19yeC53aW5kb3dfc2l6ZS5iaXRzOworCWVsc2UKKwkJc2VsZi0+cW9zX3R4LndpbmRvd19zaXplLmJpdHMgPSAoX191OCkgcGFyYW0tPnB2Lmk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3BhcmFtX2FkZGl0aW9uYWxfYm9mcyAoaW5zdGFuY2UsIHBhcmFtLCBnZXQpCisgKgorICogICAgTmVnb3RpYXRlIGFkZGl0aW9uYWwgQk9GIGNoYXJhY3RlcnMuIFRoaXMgaXMgYSB0eXBlIDEgcGFyYW1ldGVyIGFuZAorICogICAgd2lsbCBiZSBuZWdvdGlhdGVkIGluZGVwZW5kZW50bHkgZm9yIGVhY2ggc3RhdGlvbi4KKyAqLworc3RhdGljIGludCBpcmxhcF9wYXJhbV9hZGRpdGlvbmFsX2JvZnModm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIGludCBnZXQpCit7CisJc3RydWN0IGlybGFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBpbnN0YW5jZTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisJCisJaWYgKGdldCkKKwkJcGFyYW0tPnB2LmkgPSBzZWxmLT5xb3NfcnguYWRkaXRpb25hbF9ib2ZzLmJpdHM7CisJZWxzZQorCQlzZWxmLT5xb3NfdHguYWRkaXRpb25hbF9ib2ZzLmJpdHMgPSAoX191OCkgcGFyYW0tPnB2Lmk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3BhcmFtX21pbl90dXJuX3RpbWUgKGluc3RhbmNlLCBwYXJhbSwgZ2V0KQorICoKKyAqICAgIE5lZ290aWF0ZSB0aGUgbWluaW11bSB0dXJuIGFyb3VuZCB0aW1lLiBUaGlzIGlzIGEgdHlwZSAxIHBhcmFtZXRlciBhbmQKKyAqICAgIHdpbGwgYmUgbmVnb3RpYXRlZCBpbmRlcGVuZGVudGx5IGZvciBlYWNoIHN0YXRpb24KKyAqLworc3RhdGljIGludCBpcmxhcF9wYXJhbV9taW5fdHVybl90aW1lKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICAgIGludCBnZXQpCit7CisJc3RydWN0IGlybGFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBpbnN0YW5jZTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisJCisJaWYgKGdldCkKKwkJcGFyYW0tPnB2LmkgPSBzZWxmLT5xb3NfcngubWluX3R1cm5fdGltZS5iaXRzOworCWVsc2UKKwkJc2VsZi0+cW9zX3R4Lm1pbl90dXJuX3RpbWUuYml0cyA9IChfX3U4KSBwYXJhbS0+cHYuaTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfbWF4X2xpbmVfY2FwYWNpdHkgKHNwZWVkLCBtYXhfdHVybl90aW1lLCBtaW5fdHVybl90aW1lKQorICoKKyAqICAgIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBsaW5lIGNhcGFjaXR5CisgKgorICovCitfX3UzMiBpcmxhcF9tYXhfbGluZV9jYXBhY2l0eShfX3UzMiBzcGVlZCwgX191MzIgbWF4X3R1cm5fdGltZSkKK3sKKwlfX3UzMiBsaW5lX2NhcGFjaXR5OworCWludCBpLGo7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBzcGVlZD0lZCwgbWF4X3R1cm5fdGltZT0lZFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBzcGVlZCwgbWF4X3R1cm5fdGltZSk7CisKKwlpID0gdmFsdWVfaW5kZXgoc3BlZWQsIGJhdWRfcmF0ZXMsIDEwKTsKKwlqID0gdmFsdWVfaW5kZXgobWF4X3R1cm5fdGltZSwgbWF4X3R1cm5fdGltZXMsIDQpOworCisJSVJEQV9BU1NFUlQoKChpID49MCkgJiYgKGkgPDEwKSksIHJldHVybiAwOyk7CisJSVJEQV9BU1NFUlQoKChqID49MCkgJiYgKGogPDQpKSwgcmV0dXJuIDA7KTsKKworCWxpbmVfY2FwYWNpdHkgPSBtYXhfbGluZV9jYXBhY2l0aWVzW2ldW2pdOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgbGluZSBjYXBhY2l0eT0lZCBieXRlc1xuIiwgCisJCSAgIF9fRlVOQ1RJT05fXywgbGluZV9jYXBhY2l0eSk7CisJCisJcmV0dXJuIGxpbmVfY2FwYWNpdHk7Cit9CisKKyNpZm5kZWYgQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cKK3N0YXRpYyBfX3UzMiBpcmxhcF9yZXF1ZXN0ZWRfbGluZV9jYXBhY2l0eShzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwlfX3UzMiBsaW5lX2NhcGFjaXR5OworCisJbGluZV9jYXBhY2l0eSA9IHFvcy0+d2luZG93X3NpemUudmFsdWUgKgorCQkocW9zLT5kYXRhX3NpemUudmFsdWUgKyA2ICsgcW9zLT5hZGRpdGlvbmFsX2JvZnMudmFsdWUpICsKKwkJaXJsYXBfbWluX3R1cm5fdGltZV9pbl9ieXRlcyhxb3MtPmJhdWRfcmF0ZS52YWx1ZSwKKwkJCQkJICAgICBxb3MtPm1pbl90dXJuX3RpbWUudmFsdWUpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgcmVxdWVzdGVkIGxpbmUgY2FwYWNpdHk9JWRcbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgbGluZV9jYXBhY2l0eSk7CisKKwlyZXR1cm4gbGluZV9jYXBhY2l0eTsKK30KKyNlbmRpZgorCit2b2lkIGlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJaW50IGluZGV4OworCisJSVJEQV9BU1NFUlQocW9zICE9IE5VTEwsIHJldHVybjspOworCQorCWluZGV4ID0gbXNiX2luZGV4KHFvcy0+YmF1ZF9yYXRlLmJpdHMpOworCXFvcy0+YmF1ZF9yYXRlLnZhbHVlID0gYmF1ZF9yYXRlc1tpbmRleF07CisKKwlpbmRleCA9IG1zYl9pbmRleChxb3MtPmRhdGFfc2l6ZS5iaXRzKTsKKwlxb3MtPmRhdGFfc2l6ZS52YWx1ZSA9IGRhdGFfc2l6ZXNbaW5kZXhdOworCisJaW5kZXggPSBtc2JfaW5kZXgocW9zLT53aW5kb3dfc2l6ZS5iaXRzKTsKKwlxb3MtPndpbmRvd19zaXplLnZhbHVlID0gaW5kZXgrMTsKKworCWluZGV4ID0gbXNiX2luZGV4KHFvcy0+bWluX3R1cm5fdGltZS5iaXRzKTsKKwlxb3MtPm1pbl90dXJuX3RpbWUudmFsdWUgPSBtaW5fdHVybl90aW1lc1tpbmRleF07CisJCisJaW5kZXggPSBtc2JfaW5kZXgocW9zLT5tYXhfdHVybl90aW1lLmJpdHMpOworCXFvcy0+bWF4X3R1cm5fdGltZS52YWx1ZSA9IG1heF90dXJuX3RpbWVzW2luZGV4XTsKKworCWluZGV4ID0gbXNiX2luZGV4KHFvcy0+bGlua19kaXNjX3RpbWUuYml0cyk7CisJcW9zLT5saW5rX2Rpc2NfdGltZS52YWx1ZSA9IGxpbmtfZGlzY190aW1lc1tpbmRleF07CisJCisJaW5kZXggPSBtc2JfaW5kZXgocW9zLT5hZGRpdGlvbmFsX2JvZnMuYml0cyk7CisJcW9zLT5hZGRpdGlvbmFsX2JvZnMudmFsdWUgPSBhZGRfYm9mc1tpbmRleF07Cit9CitFWFBPUlRfU1lNQk9MKGlyZGFfcW9zX2JpdHNfdG9fdmFsdWUpOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvdGltZXIuYyBiL25ldC9pcmRhL3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxN2Y5NwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL3RpbWVyLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgdGltZXIuYworICogVmVyc2lvbjogICAgICAgCisgKiBEZXNjcmlwdGlvbjogICAKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBBdWcgMTYgMDA6NTk6MjkgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgV2VkIERlYyAgOCAxMjo1MDozNCAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorCitleHRlcm4gaW50ICBzeXNjdGxfc2xvdF90aW1lb3V0OworCitzdGF0aWMgdm9pZCBpcmxhcF9zbG90X3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CitzdGF0aWMgdm9pZCBpcmxhcF9xdWVyeV90aW1lcl9leHBpcmVkKHZvaWQqIGRhdGEpOworc3RhdGljIHZvaWQgaXJsYXBfZmluYWxfdGltZXJfZXhwaXJlZCh2b2lkKiBkYXRhKTsKK3N0YXRpYyB2b2lkIGlybGFwX3dkX3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CitzdGF0aWMgdm9pZCBpcmxhcF9iYWNrb2ZmX3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CitzdGF0aWMgdm9pZCBpcmxhcF9tZWRpYV9idXN5X2V4cGlyZWQodm9pZCogZGF0YSk7IAorCit2b2lkIGlybGFwX3N0YXJ0X3Nsb3RfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgdGltZW91dCkKK3sKKwlpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5zbG90X3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLCAKKwkJCSBpcmxhcF9zbG90X3RpbWVyX2V4cGlyZWQpOworfQorCit2b2lkIGlybGFwX3N0YXJ0X3F1ZXJ5X3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IFMsIGludCBzKQoreworCWludCB0aW1lb3V0OworCisJLyogQ2FsY3VsYXRlIHdoZW4gdGhlIHBlZXIgZGlzY292ZXJ5IHNob3VsZCBlbmQuIE5vcm1hbGx5LCB3ZQorCSAqIGdldCB0aGUgZW5kLW9mLWRpc2NvdmVyeSBmcmFtZSwgc28gdGhpcyBpcyBqdXN0IGluIGNhc2UKKwkgKiB3ZSBtaXNzIGl0LgorCSAqIEJhc2ljYWxseSwgd2UgbXVsdGlwbHkgdGhlIG51bWJlciBvZiByZW1haW5pbmcgc2xvdHMgYnkgb3VyCisJICogc2xvdCB0aW1lLCBwbHVzIGFkZCBzb21lIGV4dHJhIHRpbWUgdG8gcHJvcGVybHkgcmVjZWl2ZSB0aGUgbGFzdAorCSAqIGRpc2NvdmVyeSBwYWNrZXQgKHdoaWNoIGlzIGxvbmdlciBkdWUgdG8gZXh0cmEgZGlzY292ZXJ5IGluZm8pLAorCSAqIHRvIGF2b2lkIG1lc3Npbmcgd2l0aCBmb3IgaW5jb21taW5nIGNvbm5lY3Rpb25zIHJlcXVlc3RzIGFuZAorCSAqIHRvIGFjY29tb2RhdGUgZGV2aWNlcyB0aGF0IHBlcmZvcm0gZGlzY292ZXJ5IHNsb3dlciB0aGFuIHVzLgorCSAqIEplYW4gSUkgKi8KKwl0aW1lb3V0ID0gKChzeXNjdGxfc2xvdF90aW1lb3V0ICogSFogLyAxMDAwKSAqIChTIC0gcykKKwkJICAgKyBYSURFWFRSQV9USU1FT1VUICsgU01BTExCVVNZX1RJTUVPVVQpOworCisJLyogU2V0IG9yIHJlLXNldCB0aGUgdGltZXIuIFdlIHJlc2V0IHRoZSB0aW1lciBmb3IgZWFjaCByZWNlaXZlZAorCSAqIGRpc2NvdmVyeSBxdWVyeSwgd2hpY2ggYWxsb3cgdXMgdG8gYXV0b21hdGljYWxseSBhZGp1c3QgdG8KKwkgKiB0aGUgc3BlZWQgb2YgdGhlIHBlZXIgZGlzY292ZXJ5IChmYXN0ZXIgb3Igc2xvd2VyKS4gSmVhbiBJSSAqLworCWlyZGFfc3RhcnRfdGltZXIoICZzZWxmLT5xdWVyeV90aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwgCisJCQkgIGlybGFwX3F1ZXJ5X3RpbWVyX2V4cGlyZWQpOworfQorCit2b2lkIGlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCit7CisJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+ZmluYWxfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsIAorCQkJIGlybGFwX2ZpbmFsX3RpbWVyX2V4cGlyZWQpOworfQorCit2b2lkIGlybGFwX3N0YXJ0X3dkX3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCit7CisJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+d2RfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsIAorCQkJIGlybGFwX3dkX3RpbWVyX2V4cGlyZWQpOworfQorCit2b2lkIGlybGFwX3N0YXJ0X2JhY2tvZmZfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgdGltZW91dCkKK3sKKwlpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5iYWNrb2ZmX3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLCAKKwkJCSBpcmxhcF9iYWNrb2ZmX3RpbWVyX2V4cGlyZWQpOworfQorCit2b2lkIGlybGFwX3N0YXJ0X21idXN5X3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCit7CisJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+bWVkaWFfYnVzeV90aW1lciwgdGltZW91dCwgCisJCQkgKHZvaWQgKikgc2VsZiwgaXJsYXBfbWVkaWFfYnVzeV9leHBpcmVkKTsKK30KKwordm9pZCBpcmxhcF9zdG9wX21idXN5X3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZikKK3sKKwkvKiBJZiB0aW1lciBpcyBhY3RpdmF0ZWQsIGtpbGwgaXQhICovCisJZGVsX3RpbWVyKCZzZWxmLT5tZWRpYV9idXN5X3RpbWVyKTsKKworCS8qIElmIHdlIGFyZSBpbiBORE0sIHRoZXJlIGlzIGEgYnVuY2ggb2YgZXZlbnRzIGluIExBUCB0aGF0CisJICogdGhhdCBiZSBwZW5kaW5nIGR1ZSB0byB0aGUgbWVkaWFfYnVzeSBjb25kaXRpb24sIHN1Y2ggYXMKKwkgKiBDT05ORUNUX1JFUVVFU1QgYW5kIFNFTkRfVUlfRlJBTUUuIElmIHdlIGRvbid0IGdlbmVyYXRlCisJICogYW4gZXZlbnQsIHRoZXkgd2lsbCB3YWl0IGZvcmV2ZXIuLi4KKwkgKiBKZWFuIElJICovCisJaWYgKHNlbGYtPnN0YXRlID09IExBUF9ORE0pCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIE1FRElBX0JVU1lfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cit9CisKK3ZvaWQgaXJsbXBfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc3RydWN0IGxzYXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KSAKK3sKKwlpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwKKwkJCSBpcmxtcF93YXRjaGRvZ190aW1lcl9leHBpcmVkKTsKK30KKwordm9pZCBpcmxtcF9zdGFydF9kaXNjb3ZlcnlfdGltZXIoc3RydWN0IGlybG1wX2NiICpzZWxmLCBpbnQgdGltZW91dCkgCit7CisJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+ZGlzY292ZXJ5X3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLAorCQkJIGlybG1wX2Rpc2NvdmVyeV90aW1lcl9leHBpcmVkKTsKK30KKwordm9pZCBpcmxtcF9zdGFydF9pZGxlX3RpbWVyKHN0cnVjdCBsYXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KSAKK3sKKwlpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5pZGxlX3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLAorCQkJIGlybG1wX2lkbGVfdGltZXJfZXhwaXJlZCk7Cit9CisKK3ZvaWQgaXJsbXBfc3RvcF9pZGxlX3RpbWVyKHN0cnVjdCBsYXBfY2IgKnNlbGYpIAoreworCS8qIElmIHRpbWVyIGlzIGFjdGl2YXRlZCwga2lsbCBpdCEgKi8KKwlkZWxfdGltZXIoJnNlbGYtPmlkbGVfdGltZXIpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc2xvdF90aW1lcl9leHBpcmVkIChkYXRhKQorICoKKyAqICAgIElyTEFQIHNsb3QgdGltZXIgaGFzIGV4cGlyZWQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFwX3Nsb3RfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGF0YTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCWlybGFwX2RvX2V2ZW50KHNlbGYsIFNMT1RfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cit9IAorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcXVlcnlfdGltZXJfZXhwaXJlZCAoZGF0YSkKKyAqCisgKiAgICBJckxBUCBxdWVyeSB0aW1lciBoYXMgZXhwaXJlZAorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfcXVlcnlfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGF0YTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCWlybGFwX2RvX2V2ZW50KHNlbGYsIFFVRVJZX1RJTUVSX0VYUElSRUQsIE5VTEwsIE5VTEwpOworfSAKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZmluYWxfdGltZXJfZXhwaXJlZCAoZGF0YSkKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFwX2ZpbmFsX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGRhdGE7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlpcmxhcF9kb19ldmVudChzZWxmLCBGSU5BTF9USU1FUl9FWFBJUkVELCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfd2RfdGltZXJfZXhwaXJlZCAoZGF0YSkKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFwX3dkX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGRhdGE7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCQorCWlybGFwX2RvX2V2ZW50KHNlbGYsIFdEX1RJTUVSX0VYUElSRUQsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9iYWNrb2ZmX3RpbWVyX2V4cGlyZWQgKGRhdGEpCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgdm9pZCBpcmxhcF9iYWNrb2ZmX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGRhdGE7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCQorCWlybGFwX2RvX2V2ZW50KHNlbGYsIEJBQ0tPRkZfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIGlydHR5X21lZGlhX2J1c3lfZXhwaXJlZCAoZGF0YSkKKyAqCisgKiAgICAKKyAqLwordm9pZCBpcmxhcF9tZWRpYV9idXN5X2V4cGlyZWQodm9pZCogZGF0YSkKK3sKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGRhdGE7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koc2VsZi0+bmV0ZGV2LCBGQUxTRSk7CisJLyogTm90ZSA6IHRoZSBMQVAgZXZlbnQgd2lsbCBiZSBzZW5kIGluIGlybGFwX3N0b3BfbWJ1c3lfdGltZXIoKSwKKwkqIHRvIGNhdGNoIG90aGVyIGNhc2VzIHdoZXJlIHRoZSBmbGFnIGlzIGNsZWFyZWQgKGZvciBleGFtcGxlCisJKiBhZnRlciBhIGRpc2NvdmVyeSkgLSBKZWFuIElJICovCit9CmRpZmYgLS1naXQgYS9uZXQvaXJkYS93cmFwcGVyLmMgYi9uZXQvaXJkYS93cmFwcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxMzBjMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL3dyYXBwZXIuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICAgIHdyYXBwZXIuYworICogVmVyc2lvbjogICAgICAgMS4yCisgKiBEZXNjcmlwdGlvbjogICBJckRBIFNJUiBhc3luYyB3cmFwcGVyIGxheWVyCisgKiBTdGF0dXM6ICAgICAgICBTdGFibGUKKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIE1vbiBBdWcgIDQgMjA6NDA6NTMgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgRnJpIEphbiAyOCAxMzoyMTowOSAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBNb2RpZmllZCBhdDogICBGcmkgTWF5IDI4ICAzOjExIENTVCAxOTk5CisgKiBNb2RpZmllZCBieTogICBIb3JzdCB2b24gQnJhbmQgPHZvbmJyYW5kQHNsZWlwbmlyLnZhbHBhcmFpc28uY2w+CisgKgorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2NyYy5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXBfZnJhbWUuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRlJBTUUgV1JBUFBJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVW53cmFwIGFuZCB1bnN0dWZmIFNJUiBmcmFtZXMKKyAqCisgKiBOb3RlIDogYXQgRklSIGFuZCBNSVIsIEhETEMgZnJhbWluZyBpcyB1c2VkIGFuZCB1c3VhbGx5IGhhbmRsZWQKKyAqIGJ5IHRoZSBjb250cm9sbGVyLCBzbyB3ZSBjb21lIGhlcmUgb25seSBmb3IgU0lSLi4uIEplYW4gSUkKKyAqLworCisvKgorICogRnVuY3Rpb24gc3R1ZmZfYnl0ZSAoYnl0ZSwgYnVmKQorICoKKyAqICAgIEJ5dGUgc3R1ZmYgb25lIHNpbmdsZSBieXRlIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiBidWZmZXIgcG9pbnRlZCB0byBieQorICogICAgYnVmLiBUaGUgYnVmZmVyIG11c3QgYXQgYWxsIHRpbWVzIGJlIGFibGUgdG8gaGF2ZSB0d28gYnl0ZXMgaW5zZXJ0ZWQuCisgKgorICogVGhpcyBpcyBpbiBhIHRpZ2h0IGxvb3AsIGJldHRlciBpbmxpbmUgaXQsIHNvIG5lZWQgdG8gYmUgcHJpb3IgdG8gY2FsbGVycy4KKyAqICgyMDAwIGJ5dGVzIG9uIFA2IDIwME1Ieiwgbm9uLWlubGluZWQgfjM3MHVzLCBpbmxpbmUgfjE3MHVzKSAtIEplYW4gSUkKKyAqLworc3RhdGljIGlubGluZSBpbnQgc3R1ZmZfYnl0ZShfX3U4IGJ5dGUsIF9fdTggKmJ1ZikKK3sKKwlzd2l0Y2ggKGJ5dGUpIHsKKwljYXNlIEJPRjogLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIEVPRjogLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIENFOgorCQkvKiBJbnNlcnQgdHJhbnNwYXJlbnRseSBjb2RlZCAqLworCQlidWZbMF0gPSBDRTsgICAgICAgICAgICAgICAvKiBTZW5kIGxpbmsgZXNjYXBlICovCisJCWJ1ZlsxXSA9IGJ5dGVeSVJEQV9UUkFOUzsgICAgLyogQ29tcGxlbWVudCBiaXQgNSAqLworCQlyZXR1cm4gMjsKKwkJLyogYnJlYWs7ICovCisJZGVmYXVsdDoKKwkJIC8qIE5vbi1zcGVjaWFsIHZhbHVlLCBubyB0cmFuc3BhcmVuY3kgcmVxdWlyZWQgKi8KKwkJYnVmWzBdID0gYnl0ZTsKKwkJcmV0dXJuIDE7CisJCS8qIGJyZWFrOyAqLworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGFzeW5jX3dyYXAgKHNrYiwgKnR4X2J1ZmYsIGJ1ZmZzaXplKQorICoKKyAqICAgIE1ha2VzIGEgbmV3IGJ1ZmZlciB3aXRoIHdyYXBwaW5nIGFuZCBzdHVmZmluZywgc2hvdWxkIGNoZWNrIHRoYXQKKyAqICAgIHdlIGRvbid0IGdldCB0eCBidWZmZXIgb3ZlcmZsb3cuCisgKi8KK2ludCBhc3luY193cmFwX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3U4ICp0eF9idWZmLCBpbnQgYnVmZnNpemUpCit7CisJc3RydWN0IGlyZGFfc2tiX2NiICpjYiA9IChzdHJ1Y3QgaXJkYV9za2JfY2IgKikgc2tiLT5jYjsKKwlpbnQgeGJvZnM7CisJaW50IGk7CisJaW50IG47CisJdW5pb24geworCQlfX3UxNiB2YWx1ZTsKKwkJX191OCBieXRlc1syXTsKKwl9IGZjczsKKworCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCisJZmNzLnZhbHVlID0gSU5JVF9GQ1M7CisJbiA9IDA7CisKKwkvKgorCSAqICBTZW5kICBYQk9GJ3MgZm9yIHJlcXVpcmVkIG1pbi4gdHVybiB0aW1lIGFuZCBmb3IgdGhlIG5lZ290aWF0ZWQKKwkgKiAgYWRkaXRpb25hbCBYQk9GUworCSAqLworCisJaWYgKGNiLT5tYWdpYyAhPSBMQVBfTUFHSUMpIHsKKwkJLyoKKwkJICogVGhpcyB3aWxsIGhhcHBlbiBmb3IgYWxsIGZyYW1lcyBzZW50IGZyb20gdXNlci1zcGFjZS4KKwkJICogTm90aGluZyB0byB3b3JyeSBhYm91dCwgYnV0IHdlIHNldCB0aGUgZGVmYXVsdCBudW1iZXIgb2YKKwkJICogQk9GJ3MKKwkJICovCisJCUlSREFfREVCVUcoMSwgIiVzKCksIHdyb25nIG1hZ2ljIGluIHNrYiFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXhib2ZzID0gMTA7CisJfSBlbHNlCisJCXhib2ZzID0gY2ItPnhib2ZzICsgY2ItPnhib2ZzX2RlbGF5OworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgeGJvZnM9JWRcbiIsIF9fRlVOQ1RJT05fXywgeGJvZnMpOworCisJLyogQ2hlY2sgdGhhdCB3ZSBuZXZlciB1c2UgbW9yZSB0aGFuIDExNSArIDQ4IHhib2ZzICovCisJaWYgKHhib2ZzID4gMTYzKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHRvbyBtYW55IHhib2ZzICglZClcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgIHhib2ZzKTsKKwkJeGJvZnMgPSAxNjM7CisJfQorCisJbWVtc2V0KHR4X2J1ZmYgKyBuLCBYQk9GLCB4Ym9mcyk7CisJbiArPSB4Ym9mczsKKworCS8qIFN0YXJ0IG9mIHBhY2tldCBjaGFyYWN0ZXIgQk9GICovCisJdHhfYnVmZltuKytdID0gQk9GOworCisJLyogSW5zZXJ0IGZyYW1lIGFuZCBjYWxjIENSQyAqLworCWZvciAoaT0wOyBpIDwgc2tiLT5sZW47IGkrKykgeworCQkvKgorCQkgKiAgQ2hlY2sgZm9yIHRoZSBwb3NzaWJpbGl0eSBvZiB0eCBidWZmZXIgb3ZlcmZsb3cuIFdlIHVzZQorCQkgKiAgYnVmc2l6ZS01IHNpbmNlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZQorCQkgKiAgdHJhbnNtaXR0ZWQgYWZ0ZXIgdGhpcyBwb2ludCBpcyA1LgorCQkgKi8KKwkJaWYobiA+PSAoYnVmZnNpemUtNSkpIHsKKwkJCUlSREFfRVJST1IoIiVzKCksIHR4IGJ1ZmZlciBvdmVyZmxvdyAobj0lZClcbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBuKTsKKwkJCXJldHVybiBuOworCQl9CisKKwkJbiArPSBzdHVmZl9ieXRlKHNrYi0+ZGF0YVtpXSwgdHhfYnVmZituKTsKKwkJZmNzLnZhbHVlID0gaXJkYV9mY3MoZmNzLnZhbHVlLCBza2ItPmRhdGFbaV0pOworCX0KKworCS8qIEluc2VydCBDUkMgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgKExTQiBmaXJzdCkgKi8KKwlmY3MudmFsdWUgPSB+ZmNzLnZhbHVlOworI2lmZGVmIF9fTElUVExFX0VORElBTgorCW4gKz0gc3R1ZmZfYnl0ZShmY3MuYnl0ZXNbMF0sIHR4X2J1ZmYrbik7CisJbiArPSBzdHVmZl9ieXRlKGZjcy5ieXRlc1sxXSwgdHhfYnVmZituKTsKKyNlbHNlIC8qIGlmZGVmIF9fQklHX0VORElBTiAqLworCW4gKz0gc3R1ZmZfYnl0ZShmY3MuYnl0ZXNbMV0sIHR4X2J1ZmYrbik7CisJbiArPSBzdHVmZl9ieXRlKGZjcy5ieXRlc1swXSwgdHhfYnVmZituKTsKKyNlbmRpZgorCXR4X2J1ZmZbbisrXSA9IEVPRjsKKworCXJldHVybiBuOworfQorRVhQT1JUX1NZTUJPTChhc3luY193cmFwX3NrYik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEZSQU1FIFVOV1JBUFBJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBVbndyYXAgYW5kIHVuc3R1ZmYgU0lSIGZyYW1lcworICoKKyAqIENvbXBsZXRlIHJld3JpdGUgYnkgSmVhbiBJSSA6CisgKiBNb3JlIGlubGluZSwgZmFzdGVyLCBtb3JlIGNvbXBhY3QsIG1vcmUgbG9naWNhbC4gSmVhbiBJSQorICogKDE2IGJ5dGVzIG9uIFA2IDIwME1Ieiwgb2xkIDUgdG8gNyB1cywgbmV3IDQgdG8gNiB1cykKKyAqICgyNCBieXRlcyBvbiBQNiAyMDBNSHosIG9sZCA5IHRvIDEwIHVzLCBuZXcgNyB0byA4IHVzKQorICogKGZvciByZWZlcmVuY2UsIDExNTIwMCBiL3MgaXMgMSBieXRlIGV2ZXJ5IDY5IHVzKQorICogQW5kIHJlZHVjZSB3cmFwcGVyLm8gYnkgfjkwMEIgaW4gdGhlIHByb2Nlc3MgOy0pCisgKgorICogVGhlbiwgd2UgaGF2ZSB0aGUgYWRkaXRpb24gb2YgWmVyb0NvcHksIHdoaWNoIGlzIG9wdGlvbmFsCisgKiAoaS5lLiB0aGUgZHJpdmVyIG11c3QgaW5pdGlhdGUgaXQpIGFuZCBpbXByb3ZlIGZpbmFsIHByb2Nlc3NpbmcuCisgKiAoMjAwNSBCIGZyYW1lICsgRU9GIG9uIFA2IDIwME1Ieiwgd2l0aG91dCAzMCB0byA1MCB1cywgd2l0aCAxMCB0byAyNSB1cykKKyAqCisgKiBOb3RlIDogYXQgRklSIGFuZCBNSVIsIEhETEMgZnJhbWluZyBpcyB1c2VkIGFuZCB1c3VhbGx5IGhhbmRsZWQKKyAqIGJ5IHRoZSBjb250cm9sbGVyLCBzbyB3ZSBjb21lIGhlcmUgb25seSBmb3IgU0lSLi4uIEplYW4gSUkKKyAqLworCisvKgorICogV2UgY2FuIGFsc28gY2hvb3NlIHdoZXJlIHdlIHdhbnQgdG8gZG8gdGhlIENSQyBjYWxjdWxhdGlvbi4gV2UgY2FuCisgKiBkbyBpdCAiaW5saW5lIiwgYXMgd2UgcmVjZWl2ZSB0aGUgYnl0ZXMsIG9yICJwb3N0cG9uZWQiLCB3aGVuCisgKiByZWNlaXZpbmcgdGhlIEVuZC1PZi1GcmFtZS4KKyAqICgxNiBieXRlcyBvbiBQNiAyMDBNSHosIGlubGluZWQgNCB0byA2IHVzLCBwb3N0cG9uZWQgNCB0byA1IHVzKQorICogKDI0IGJ5dGVzIG9uIFA2IDIwME1IeiwgaW5saW5lZCA3IHRvIDggdXMsIHBvc3Rwb25lZCA1IHRvIDcgdXMpCisgKiBXaXRoIFplcm9Db3B5IDoKKyAqICgyMDA1IEIgZnJhbWUgb24gUDYgMjAwTUh6LCBpbmxpbmVkIDEwIHRvIDI1IHVzLCBwb3N0cG9uZWQgMTQwIHRvIDE4MCB1cykKKyAqIFdpdGhvdXQgWmVyb0NvcHkgOgorICogKDIwMDUgQiBmcmFtZSBvbiBQNiAyMDBNSHosIGlubGluZWQgMzAgdG8gNTAgdXMsIHBvc3Rwb25lZCAxNTAgdG8gMTgwIHVzKQorICogKE5vdGUgOiBudW1iZXJzIHRha2VuIHdpdGggaXJxIGRpc2FibGVkKQorICoKKyAqIEZyb20gdGhvc2UgbnVtYmVycywgaXQncyBub3QgY2xlYXIgd2hpY2ggaXMgdGhlIGJlc3Qgc3RyYXRlZ3ksIGJlY2F1c2UKKyAqIHdlIGVuZCB1cCBydW5uaW5nIHRocm91Z2ggYSBsb3Qgb2YgZGF0YSBvbmUgd2F5IG9yIGFub3RoZXIgKGkuZS4gY2FjaGUKKyAqIG1pc3NlcykuIEkgcGVyc29uYWxseSBwcmVmZXIgdG8gYXZvaWQgdGhlIGh1Z2UgbGF0ZW5jeSBzcGlrZSBvZiB0aGUKKyAqICJwb3N0cG9uZWQiIHNvbHV0aW9uLCBiZWNhdXNlIGl0IGNvbWUganVzdCBhdCB0aGUgdGltZSB3aGVuIHdlIGhhdmUKKyAqIGxvdCdzIG9mIHByb3RvY29sIHByb2Nlc3NpbmcgdG8gZG8gYW5kIGl0IHdpbGwgaHVydCBvdXIgYWJpbGl0eSB0bworICogcmVhY2ggbG93IGxpbmsgdHVybmFyb3VuZCB0aW1lcy4uLiBKZWFuIElJCisgKi8KKy8vI2RlZmluZSBQT1NUUE9ORV9SWF9DUkMKKworLyoKKyAqIEZ1bmN0aW9uIGFzeW5jX2J1bXAgKGJ1ZiwgbGVuLCBzdGF0cykKKyAqCisgKiAgICBHb3QgYSBmcmFtZSwgbWFrZSBhIGNvcHkgb2YgaXQsIGFuZCBwYXNzIGl0IHVwIHRoZSBzdGFjayEgV2UgY2FuIHRyeQorICogICAgdG8gaW5saW5lIGl0IHNpbmNlIGl0J3Mgb25seSBjYWxsZWQgZnJvbSBzdGF0ZV9pbnNpZGVfZnJhbWUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCithc3luY19idW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzLAorCSAgIGlvYnVmZl90ICpyeF9idWZmKQoreworCXN0cnVjdCBza19idWZmICpuZXdza2I7CisJc3RydWN0IHNrX2J1ZmYgKmRhdGFza2I7CisJaW50CQlkb2NvcHk7CisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvcHkgdGhlIGRhdGEgdG8gYSBuZXcgc2tiIG9yIG5vdC4KKwkgKiBJZiB0aGUgZHJpdmVyIGRvZXNuJ3QgdXNlIFplcm9Db3B5IFJ4LCB3ZSBoYXZlIHRvIGRvIGl0LgorCSAqIFdpdGggWmVyb0NvcHkgUngsIHRoZSByeF9idWZmIGFscmVhZHkgcG9pbnQgdG8gYSB2YWxpZAorCSAqIHNrYi4gQnV0LCBpZiB0aGUgZnJhbWUgaXMgc21hbGwsIGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvCisJICogY29weSBpdCB0byBzYXZlIG1lbW9yeSAoY29weSB3aWxsIGJlIGZhc3QgYW55d2F5IC0gdGhhdCdzCisJICogY2FsbGVkIFJ4LWNvcHktYnJlYWspLiBKZWFuIElJICovCisJZG9jb3B5ID0gKChyeF9idWZmLT5za2IgPT0gTlVMTCkgfHwKKwkJICAocnhfYnVmZi0+bGVuIDwgSVJEQV9SWF9DT1BZX1RIUkVTSE9MRCkpOworCisJLyogQWxsb2NhdGUgYSBuZXcgc2tiICovCisJbmV3c2tiID0gZGV2X2FsbG9jX3NrYihkb2NvcHkgPyByeF9idWZmLT5sZW4gKyAxIDogcnhfYnVmZi0+dHJ1ZXNpemUpOworCWlmICghbmV3c2tiKSAgeworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQkvKiBXZSBjb3VsZCBkZWxpdmVyIHRoZSBjdXJyZW50IHNrYiBpZiBkb2luZyBaZXJvQ29weSBSeCwKKwkJICogYnV0IHRoaXMgd291bGQgc3RhbGwgdGhlIFJ4IHBhdGguIEJldHRlciBkcm9wIHRoZQorCQkgKiBwYWNrZXQuLi4gSmVhbiBJSSAqLworCQlyZXR1cm47CisJfQorCisJLyogQWxpZ24gSVAgaGVhZGVyIHRvIDIwIGJ5dGVzIChpLmUuIGluY3JlYXNlIHNrYi0+ZGF0YSkKKwkgKiBOb3RlIHRoaXMgaXMgb25seSB1c2VmdWwgd2l0aCBJckxBTiwgYXMgUFBQIGhhcyBhIHZhcmlhYmxlCisJICogaGVhZGVyIHNpemUgKDIgb3IgMSBieXRlcykgLSBKZWFuIElJICovCisJc2tiX3Jlc2VydmUobmV3c2tiLCAxKTsKKworCWlmKGRvY29weSkgeworCQkvKiBDb3B5IGRhdGEgd2l0aG91dCBDUkMgKGxlbmdodCBhbHJlYWR5IGNoZWNrZWQpICovCisJCW1lbWNweShuZXdza2ItPmRhdGEsIHJ4X2J1ZmYtPmRhdGEsIHJ4X2J1ZmYtPmxlbiAtIDIpOworCQkvKiBEZWxpdmVyIHRoaXMgc2tiICovCisJCWRhdGFza2IgPSBuZXdza2I7CisJfSBlbHNlIHsKKwkJLyogV2UgYXJlIHVzaW5nIFplcm9Db3B5LiBEZWxpdmVyIG9sZCBza2IgKi8KKwkJZGF0YXNrYiA9IHJ4X2J1ZmYtPnNrYjsKKwkJLyogQW5kIGhvb2sgdGhlIG5ldyBza2IgdG8gdGhlIHJ4X2J1ZmYgKi8KKwkJcnhfYnVmZi0+c2tiID0gbmV3c2tiOworCQlyeF9idWZmLT5oZWFkID0gbmV3c2tiLT5kYXRhOwkvKiBOT1QgbmV3c2tiLT5oZWFkICovCisJCS8vcHJpbnRrKEtFUk5fREVCVUcgIlplcm9Db3B5IDogbGVuID0gJWQsIGRhdGFza2IgPSAlcCwgbmV3c2tiID0gJXBcbiIsIHJ4X2J1ZmYtPmxlbiwgZGF0YXNrYiwgbmV3c2tiKTsKKwl9CisKKwkvKiBTZXQgcHJvcGVyIGxlbmd0aCBvbiBza2IgKHdpdGhvdXQgQ1JDKSAqLworCXNrYl9wdXQoZGF0YXNrYiwgcnhfYnVmZi0+bGVuIC0gMik7CisKKwkvKiBGZWVkIGl0IHRvIElyTEFQIGxheWVyICovCisJZGF0YXNrYi0+ZGV2ID0gZGV2OworCWRhdGFza2ItPm1hYy5yYXcgID0gZGF0YXNrYi0+ZGF0YTsKKwlkYXRhc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCisJbmV0aWZfcngoZGF0YXNrYik7CisKKwlzdGF0cy0+cnhfcGFja2V0cysrOworCXN0YXRzLT5yeF9ieXRlcyArPSByeF9idWZmLT5sZW47CisKKwkvKiBDbGVhbiB1cCByeF9idWZmIChyZWR1bmRhbnQgd2l0aCBhc3luY191bndyYXBfYm9mKCkgPz8/KSAqLworCXJ4X2J1ZmYtPmRhdGEgPSByeF9idWZmLT5oZWFkOworCXJ4X2J1ZmYtPmxlbiA9IDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhc3luY191bndyYXBfYm9mKGRldiwgYnl0ZSkKKyAqCisgKiAgICBIYW5kbGUgQmVnaW5uaW5nIE9mIEZyYW1lIGNoYXJhY3RlciByZWNlaXZlZCB3aXRoaW4gYSBmcmFtZQorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkCithc3luY191bndyYXBfYm9mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMsCisJCSBpb2J1ZmZfdCAqcnhfYnVmZiwgX191OCBieXRlKQoreworCXN3aXRjaChyeF9idWZmLT5zdGF0ZSkgeworCWNhc2UgTElOS19FU0NBUEU6CisJY2FzZSBJTlNJREVfRlJBTUU6CisJCS8qIE5vdCBzdXBwb3NlZCB0byBoYXBwZW4sIHRoZSBwcmV2aW91cyBmcmFtZSBpcyBub3QKKwkJICogZmluaXNoZWQgLSBKZWFuIElJICovCisJCUlSREFfREVCVUcoMSwgIiVzKCksIERpc2NhcmRpbmcgaW5jb21wbGV0ZSBmcmFtZVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisKKwljYXNlIE9VVFNJREVfRlJBTUU6CisJY2FzZSBCRUdJTl9GUkFNRToKKwlkZWZhdWx0OgorCQkvKiBXZSBtYXkgcmVjZWl2ZSBtdWx0aXBsZSBCT0YgYXQgdGhlIHN0YXJ0IG9mIGZyYW1lICovIAorCQlicmVhazsKKwl9CisKKwkvKiBOb3cgcmVjZWl2aW5nIGZyYW1lICovCisJcnhfYnVmZi0+c3RhdGUgPSBCRUdJTl9GUkFNRTsKKwlyeF9idWZmLT5pbl9mcmFtZSA9IFRSVUU7CisKKwkvKiBUaW1lIHRvIGluaXRpYWxpemUgcmVjZWl2ZSBidWZmZXIgKi8KKwlyeF9idWZmLT5kYXRhID0gcnhfYnVmZi0+aGVhZDsKKwlyeF9idWZmLT5sZW4gPSAwOworCXJ4X2J1ZmYtPmZjcyA9IElOSVRfRkNTOworfQorCisvKgorICogRnVuY3Rpb24gYXN5bmNfdW53cmFwX2VvZihkZXYsIGJ5dGUpCisgKgorICogICAgSGFuZGxlIEVuZCBPZiBGcmFtZSBjaGFyYWN0ZXIgcmVjZWl2ZWQgd2l0aGluIGEgZnJhbWUKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorYXN5bmNfdW53cmFwX2VvZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzLAorCQkgaW9idWZmX3QgKnJ4X2J1ZmYsIF9fdTggYnl0ZSkKK3sKKyNpZmRlZiBQT1NUUE9ORV9SWF9DUkMKKwlpbnQJaTsKKyNlbmRpZgorCisJc3dpdGNoKHJ4X2J1ZmYtPnN0YXRlKSB7CisJY2FzZSBPVVRTSURFX0ZSQU1FOgorCQkvKiBQcm9iYWJseSBtaXNzZWQgdGhlIEJPRiAqLworCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCXN0YXRzLT5yeF9taXNzZWRfZXJyb3JzKys7CisJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KGRldiwgVFJVRSk7CisJCWJyZWFrOworCisJY2FzZSBCRUdJTl9GUkFNRToKKwljYXNlIExJTktfRVNDQVBFOgorCWNhc2UgSU5TSURFX0ZSQU1FOgorCWRlZmF1bHQ6CisJCS8qIE5vdGUgOiBpbiB0aGUgY2FzZSBvZiBCRUdJTl9GUkFNRSBhbmQgTElOS19FU0NBUEUsCisJCSAqIHRoZSBmY3Mgd2lsbCBtb3N0IGxpa2VseSBub3QgbWF0Y2ggYW5kIGdlbmVyYXRlIGFuCisJCSAqIGVycm9yLCBhcyBleHBlY3RlZCAtIEplYW4gSUkgKi8KKwkJcnhfYnVmZi0+c3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCQlyeF9idWZmLT5pbl9mcmFtZSA9IEZBTFNFOworCisjaWZkZWYgUE9TVFBPTkVfUlhfQ1JDCisJCS8qIElmIHdlIGhhdmVuJ3QgZG9uZSB0aGUgQ1JDIGFzIHdlIHJlY2VpdmUgYnl0ZXMsIHdlCisJCSAqIG11c3QgZG8gaXQgbm93Li4uIEplYW4gSUkgKi8KKwkJZm9yKGkgPSAwOyBpIDwgcnhfYnVmZi0+bGVuOyBpKyspCisJCQlyeF9idWZmLT5mY3MgPSBpcmRhX2ZjcyhyeF9idWZmLT5mY3MsCisJCQkJCQlyeF9idWZmLT5kYXRhW2ldKTsKKyNlbmRpZgorCisJCS8qIFRlc3QgRkNTIGFuZCBzaWduYWwgc3VjY2VzcyBpZiB0aGUgZnJhbWUgaXMgZ29vZCAqLworCQlpZiAocnhfYnVmZi0+ZmNzID09IEdPT0RfRkNTKSB7CisJCQkvKiBEZWxpdmVyIGZyYW1lICovCisJCQlhc3luY19idW1wKGRldiwgc3RhdHMsIHJ4X2J1ZmYpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQkvKiBXcm9uZyBDUkMsIGRpc2NhcmQgZnJhbWUhICAqLworCQkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koZGV2LCBUUlVFKTsKKworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgY3JjIGVycm9yXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhc3luY191bndyYXBfY2UoZGV2LCBieXRlKQorICoKKyAqICAgIEhhbmRsZSBDaGFyYWN0ZXIgRXNjYXBlIGNoYXJhY3RlciByZWNlaXZlZCB3aXRoaW4gYSBmcmFtZQorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkCithc3luY191bndyYXBfY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cywKKwkJIGlvYnVmZl90ICpyeF9idWZmLCBfX3U4IGJ5dGUpCit7CisJc3dpdGNoKHJ4X2J1ZmYtPnN0YXRlKSB7CisJY2FzZSBPVVRTSURFX0ZSQU1FOgorCQkvKiBBY3RpdmF0ZSBjYXJyaWVyIHNlbnNlICovCisJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KGRldiwgVFJVRSk7CisJCWJyZWFrOworCisJY2FzZSBMSU5LX0VTQ0FQRToKKwkJSVJEQV9XQVJOSU5HKCIlczogc3RhdGUgbm90IGRlZmluZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCisJY2FzZSBCRUdJTl9GUkFNRToKKwljYXNlIElOU0lERV9GUkFNRToKKwlkZWZhdWx0OgorCQkvKiBTdHVmZmVkIGJ5dGUgY29taW5nICovCisJCXJ4X2J1ZmYtPnN0YXRlID0gTElOS19FU0NBUEU7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGFzeW5jX3Vud3JhcF9vdGhlcihkZXYsIGJ5dGUpCisgKgorICogICAgSGFuZGxlIG90aGVyIGNoYXJhY3RlcnMgcmVjZWl2ZWQgd2l0aGluIGEgZnJhbWUKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorYXN5bmNfdW53cmFwX290aGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cywKKwkJICAgaW9idWZmX3QgKnJ4X2J1ZmYsIF9fdTggYnl0ZSkKK3sKKwlzd2l0Y2gocnhfYnVmZi0+c3RhdGUpIHsKKwkJLyogVGhpcyBpcyBvbiB0aGUgY3JpdGljYWwgcGF0aCwgY2FzZSBhcmUgb3JkZXJlZCBieQorCQkgKiBwcm9iYWJpbGl0eSAobW9zdCBmcmVxdWVudCBmaXJzdCkgLSBKZWFuIElJICovCisJY2FzZSBJTlNJREVfRlJBTUU6CisJCS8qIE11c3QgYmUgdGhlIG5leHQgYnl0ZSBvZiB0aGUgZnJhbWUgKi8KKwkJaWYgKHJ4X2J1ZmYtPmxlbiA8IHJ4X2J1ZmYtPnRydWVzaXplKSAgeworCQkJcnhfYnVmZi0+ZGF0YVtyeF9idWZmLT5sZW4rK10gPSBieXRlOworI2lmbmRlZiBQT1NUUE9ORV9SWF9DUkMKKwkJCXJ4X2J1ZmYtPmZjcyA9IGlyZGFfZmNzKHJ4X2J1ZmYtPmZjcywgYnl0ZSk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIFJ4IGJ1ZmZlciBvdmVyZmxvdywgYWJvcnRpbmdcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCXJ4X2J1ZmYtPnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTElOS19FU0NBUEU6CisJCS8qCisJCSAqICBTdHVmZmVkIGNoYXIsIGNvbXBsZW1lbnQgYml0IDUgb2YgYnl0ZQorCQkgKiAgZm9sbG93aW5nIENFLCBJckxBUCBwLjExNAorCQkgKi8KKwkJYnl0ZSBePSBJUkRBX1RSQU5TOworCQlpZiAocnhfYnVmZi0+bGVuIDwgcnhfYnVmZi0+dHJ1ZXNpemUpICB7CisJCQlyeF9idWZmLT5kYXRhW3J4X2J1ZmYtPmxlbisrXSA9IGJ5dGU7CisjaWZuZGVmIFBPU1RQT05FX1JYX0NSQworCQkJcnhfYnVmZi0+ZmNzID0gaXJkYV9mY3MocnhfYnVmZi0+ZmNzLCBieXRlKTsKKyNlbmRpZgorCQkJcnhfYnVmZi0+c3RhdGUgPSBJTlNJREVfRlJBTUU7CisJCX0gZWxzZSB7CisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBSeCBidWZmZXIgb3ZlcmZsb3csIGFib3J0aW5nXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlyeF9idWZmLT5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9VVFNJREVfRlJBTUU6CisJCS8qIEFjdGl2YXRlIGNhcnJpZXIgc2Vuc2UgKi8KKwkJaWYoYnl0ZSAhPSBYQk9GKQorCQkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisKKwljYXNlIEJFR0lOX0ZSQU1FOgorCWRlZmF1bHQ6CisJCXJ4X2J1ZmYtPmRhdGFbcnhfYnVmZi0+bGVuKytdID0gYnl0ZTsKKyNpZm5kZWYgUE9TVFBPTkVfUlhfQ1JDCisJCXJ4X2J1ZmYtPmZjcyA9IGlyZGFfZmNzKHJ4X2J1ZmYtPmZjcywgYnl0ZSk7CisjZW5kaWYKKwkJcnhfYnVmZi0+c3RhdGUgPSBJTlNJREVfRlJBTUU7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGFzeW5jX3Vud3JhcF9jaGFyIChkZXYsIHJ4X2J1ZmYsIGJ5dGUpCisgKgorICogICAgUGFyc2UgYW5kIGRlLXN0dWZmIGZyYW1lIHJlY2VpdmVkIGZyb20gdGhlIElyREEtcG9ydAorICoKKyAqIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIFNJUiBkcml2ZXJzLgorICovCit2b2lkIGFzeW5jX3Vud3JhcF9jaGFyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMsCisJCSAgICAgICBpb2J1ZmZfdCAqcnhfYnVmZiwgX191OCBieXRlKQoreworCXN3aXRjaChieXRlKSB7CisJY2FzZSBDRToKKwkJYXN5bmNfdW53cmFwX2NlKGRldiwgc3RhdHMsIHJ4X2J1ZmYsIGJ5dGUpOworCQlicmVhazsKKwljYXNlIEJPRjoKKwkJYXN5bmNfdW53cmFwX2JvZihkZXYsIHN0YXRzLCByeF9idWZmLCBieXRlKTsKKwkJYnJlYWs7CisJY2FzZSBFT0Y6CisJCWFzeW5jX3Vud3JhcF9lb2YoZGV2LCBzdGF0cywgcnhfYnVmZiwgYnl0ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFzeW5jX3Vud3JhcF9vdGhlcihkZXYsIHN0YXRzLCByeF9idWZmLCBieXRlKTsKKwkJYnJlYWs7CisJfQorfQorRVhQT1JUX1NZTUJPTChhc3luY191bndyYXBfY2hhcik7CisK