ZGlmZiAtLWdpdCBhL2hscnN5bmMvaGxyc3luYy5weSBiL2hscnN5bmMvaGxyc3luYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNGE0OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvaGxyc3luYy9obHJzeW5jLnB5CkBAIC0wLDAgKzEsMTI1IEBACisjIS91c3IvYmluL3B5dGhvbjIuNQorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2Zyb20gcHlzcWxpdGUyIGltcG9ydCBkYmFwaTIgYXMgc3FsaXRlMworaW1wb3J0IHN5cworCitobHIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMV0pCit3ZWIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMl0pCisKKyMgc3dpdGNoIHRvIGF1dG9jb21taXQKK2hsci5pc29sYXRpb25fbGV2ZWwgPSBOb25lCit3ZWIuaXNvbGF0aW9uX2xldmVsID0gTm9uZQorCitobHIucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdword2ViLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKKword2l0aCBobHI6CisJaGxyX3N1YnNjcnMgPSBobHIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyCisJIiIiKS5mZXRjaGFsbCgpCisJaGxyX3Rva2VucyA9IGhsci5leGVjdXRlKCIiIgorCQlTRUxFQ1QgKiBGUk9NIEF1dGhUb2tlbgorCSIiIikuZmV0Y2hhbGwoKQorCit3aXRoIHdlYjoKKwl3ZWJfdG9rZW5zID0gd2ViLmV4ZWN1dGUoIiIiCisJCVNFTEVDVCAqIEZST00gcmVnX3Rva2VucworCSIiIikuZmV0Y2hhbGwoKQorCXdlYl9zbXMgPSB3ZWIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBzbXNfcXVldWUKKwkiIiIpLmZldGNoYWxsKCkKKworIyBpbmRleCBieSBzdWJzY3IgaWQKK2hscl9zdWJzY3JzX2J5X2lkID0ge30KK2hscl9zdWJzY3JzX2J5X2V4dCA9IHt9CitobHJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiBobHJfc3Vic2NyczoKKwlobHJfc3Vic2Nyc19ieV9pZFt4WydpZCddXSA9IHgKKwlobHJfc3Vic2Nyc19ieV9leHRbeFsnZXh0ZW5zaW9uJ11dID0geAorZGVsIGhscl9zdWJzY3JzCitmb3IgeCBpbiBobHJfdG9rZW5zOgorCWhscl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgaGxyX3Rva2VucworCit3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiB3ZWJfdG9rZW5zOgorCXdlYl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgd2ViX3Rva2VucworCisjIHJlbW92ZSBsZWZ0b3ZlciB3ZWJfdG9rZW5zIGFuZCBjb3JyZWN0IGluY29uc2lzdGVudCBmaWVsZHMKK3dpdGggd2ViOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiBzdWJzY3IgaXMgTm9uZToKKwkJCXdlYi5leGVjdXRlKCIiIgorCQkJCSAgICAgIERFTEVURSBGUk9NIHJlZ190b2tlbnMgV0hFUkUgc3Vic2NyaWJlcl9pZCA9ID8KKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sKSkKKwkJCWRlbCB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZFt4WydzdWJzY3JpYmVyX2lkJ11dCisJCQljb250aW51ZQorCQlpZiBzdHIoeFsnaW1zaSddKSAhPSBzdHIoc3Vic2NyWydpbXNpJ10pIG9yIFwKKwkJICAgeFsnZXh0ZW5zaW9uJ10gIT0gc3Vic2NyWydleHRlbnNpb24nXSBvciBcCisJCSAgIHhbJ3Rtc2knXSAhPSBzdWJzY3JbJ3Rtc2knXSBvciBcCisJCSAgIHhbJ2xhYyddICE9IHN1YnNjclsnbGFjJ106CisJCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBVUERBVEUgcmVnX3Rva2VucworCQkJCSAgICAgIFNFVCBpbXNpID0gPywgZXh0ZW5zaW9uID0gPywgdG1zaSA9ID8sIGxhYyA9ID8KKwkJCQkgICAgICBXSEVSRSBzdWJzY3JpYmVyX2lkID0gPworCQkJCSAgICIiIiwgKHN0cihzdWJzY3JbJ2ltc2knXSksIHN1YnNjclsnZXh0ZW5zaW9uJ10sCisJCQkJICAgc3Vic2NyWyd0bXNpJ10sIHN1YnNjclsnbGFjJ10sIHhbJ3N1YnNjcmliZXJfaWQnXSkpCisKKyMgYWRkIG1pc3Npbmcgd2ViX3Rva2Vucword2l0aCB3ZWI6CisJZm9yIHggaW4gaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWQudmFsdWVzKCk6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2lkLmdldCh4WydzdWJzY3JpYmVyX2lkJ10sIE5vbmUpCisJCWlmIHN1YnNjciBpcyBOb25lOgorCQkJaGxyLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgREVMRVRFIEZST00gQXV0aFRva2VuIFdIRVJFIHN1YnNjcmliZXJfaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisJCQlkZWwgaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWRbeFsnc3Vic2NyaWJlcl9pZCddXQorCQkJY29udGludWUKKwkJd2VidG9rZW4gPSB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB3ZWJ0b2tlbiBpcyBOb25lOgorCQkJd2ViLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgSU5TRVJUIElOVE8gcmVnX3Rva2VucworCQkJCSAgICAgIChzdWJzY3JpYmVyX2lkLCBleHRlbnNpb24sIHJlZ19jb21wbGV0ZWQsIG5hbWUsIGVtYWlsLCBsYWMsIGltc2ksIHRva2VuLCB0bXNpKQorCQkJCSAgICAgIFZBTFVFUworCQkJCSAgICAgICg/LCA/LCAwLCA/LCAnJywgPywgPywgPywgPykKKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sIHN1YnNjclsnZXh0ZW5zaW9uJ10sIHN1YnNjclsnbmFtZSddLAorCQkJCSAgIHN1YnNjclsnbGFjJ10sIHN0cihzdWJzY3JbJ2ltc2knXSksIHhbJ3Rva2VuJ10sIHN1YnNjclsndG1zaSddKSkKKworIyBhdXRob3JpemUgc3Vic2NyaWJlcnMKK3dpdGggaGxyOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB4WydyZWdfY29tcGxldGVkJ10gYW5kIG5vdCBzdWJzY3JbJ2F1dGhvcml6ZWQnXToKKwkJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIFVQREFURSBTdWJzY3JpYmVyCisJCQkJICAgICAgU0VUIGF1dGhvcml6ZWQgPSAxCisJCQkJICAgICAgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisKKyMgU3luYyBTTVMgZnJvbSB3ZWIgdG8gaGxyCit3aXRoIGhscjoKKwlmb3Igc21zIGluIHdlYl9zbXM6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2V4dC5nZXQoc21zWydyZWNlaXZlcl9leHQnXSkKKwkJaWYgc3Vic2NyIGlzIE5vbmU6CisJCQlwcmludCAnJXMgbm90IGZvdW5kJyAlIHNtc1sncmVjZWl2ZXJfZXh0J10KKwkJCWNvbnRpbnVlCisJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIElOU0VSVCBJTlRPIFNNUworCQkJCSAgICAgIChjcmVhdGVkLCBzZW5kZXJfaWQsIHJlY2VpdmVyX2lkLCByZXBseV9wYXRoX3JlcSwgc3RhdHVzX3JlcF9yZXEsIHByb3RvY29sX2lkLCBkYXRhX2NvZGluZ19zY2hlbWUsIHVkX2hkcl9pbmQsIHRleHQpCisJCQkJICAgICAgVkFMVUVTCisJCQkJICAgICAgKD8sIDEsID8sIDAsIDAsIDAsIDAsIDAsID8pCisJCQkJICAgIiIiLCAoc21zWydjcmVhdGVkJ10sIHN1YnNjclsnaWQnXSwgc21zWyd0ZXh0J10pKQord2l0aCB3ZWI6CisJZm9yIHNtcyBpbiB3ZWJfc21zOgorCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBERUxFVEUgRlJPTSBzbXNfcXVldWUgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoc21zWydpZCddLCkpCisKKworaGxyLmNsb3NlKCkKK3dlYi5jbG9zZSgpCisKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi9saWJvc21vY29yZS8uZ2l0aWdub3JlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSAuZ2l0aWdub3JlCnJlbmFtZSB0byBsaWJvc21vY29yZS8uZ2l0aWdub3JlCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvbGlib3Ntb2NvcmUvQ09QWUlORwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gQ09QWUlORwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvQ09QWUlORwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9saWJvc21vY29yZS9jb25maWd1cmUuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbmZpZ3VyZS5pbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvY29uZmlndXJlLmluCmRpZmYgLS1naXQgYS9naXQtdmVyc2lvbi1nZW4gYi9saWJvc21vY29yZS9naXQtdmVyc2lvbi1nZW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdpdC12ZXJzaW9uLWdlbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvZ2l0LXZlcnNpb24tZ2VuCmRpZmYgLS1naXQgYS9pbmNsdWRlL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvYml0dmVjLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvY29tcDEyOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9jb21wMTI4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtMDgwOC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc20wODA4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvZ3NtMDgwOC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTA4MDguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9nc200OC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc200OC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2dzbTQ4LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9nc200OF9pZS5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc200OF9pZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2dzbTQ4X2llLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9nc21fdXRpbHMuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtX3V0aWxzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvZ3NtX3V0aWxzLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtX3V0aWxzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtdGFwLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbXRhcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2dzbXRhcC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbXRhcC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL2xpbnV4bGlzdC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9saW51eGxpc3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9saW51eGxpc3QuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9saW51eGxpc3QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9sb2dnaW5nLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2xvZ2dpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9sb2dnaW5nLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbG9nZ2luZy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL21uY2MuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbW5jYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL21uY2MuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9tbmNjLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9tc2diLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21zZ2IuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzgwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzgwLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzgwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzA4LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF8wOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF8wOC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF8wOC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF81OC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMTJfMjEuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcnNsLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3JzbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3JzbC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3JzbC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcnhsZXZfc3RhdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yeGxldl9zdGF0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvc2VsZWN0LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3NpZ25hbC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9zdGF0aXN0aWNzLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3N0YXRpc3RpY3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9zdGF0aXN0aWNzLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3RhbGxvYy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS90aW1lci5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90aW1lci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3RpbWVyLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS90bHYuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvdXRpbHMuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS91dGlscy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3V0aWxzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvd3JpdGVfcXVldWUuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvd3JpdGVfcXVldWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS93cml0ZV9xdWV1ZS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3dyaXRlX3F1ZXVlLmgKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlLnBjLmluIGIvbGlib3Ntb2NvcmUvbGlib3Ntb2NvcmUucGMuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYm9zbW9jb3JlLnBjLmluCnJlbmFtZSB0byBsaWJvc21vY29yZS9saWJvc21vY29yZS5wYy5pbgpkaWZmIC0tZ2l0IGEvbTQvRFVNTVkgYi9saWJvc21vY29yZS9tNC9EVU1NWQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbTQvRFVNTVkKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL200L0RVTU1ZCmRpZmYgLS1naXQgYS9zcmMvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9zcmMvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9zcmMvYml0dmVjLmMgYi9saWJvc21vY29yZS9zcmMvYml0dmVjLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9iaXR2ZWMuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2JpdHZlYy5jCmRpZmYgLS1naXQgYS9zcmMvY29tcDEyOC5jIGIvbGlib3Ntb2NvcmUvc3JjL2NvbXAxMjguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvbXAxMjguYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2NvbXAxMjguYwpkaWZmIC0tZ2l0IGEvc3JjL2dzbTA4MDguYyBiL2xpYm9zbW9jb3JlL3NyYy9nc20wODA4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9nc20wODA4LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9nc20wODA4LmMKZGlmZiAtLWdpdCBhL3NyYy9nc200OC5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbTQ4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9nc200OC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvZ3NtNDguYwpkaWZmIC0tZ2l0IGEvc3JjL2dzbTQ4X2llLmMgYi9saWJvc21vY29yZS9zcmMvZ3NtNDhfaWUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2dzbTQ4X2llLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9nc200OF9pZS5jCmRpZmYgLS1naXQgYS9zcmMvZ3NtX3V0aWxzLmMgYi9saWJvc21vY29yZS9zcmMvZ3NtX3V0aWxzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9nc21fdXRpbHMuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2dzbV91dGlscy5jCmRpZmYgLS1naXQgYS9zcmMvbG9nZ2luZy5jIGIvbGlib3Ntb2NvcmUvc3JjL2xvZ2dpbmcuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2xvZ2dpbmcuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2xvZ2dpbmcuYwpkaWZmIC0tZ2l0IGEvc3JjL21zZ2IuYyBiL2xpYm9zbW9jb3JlL3NyYy9tc2diLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9tc2diLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9tc2diLmMKZGlmZiAtLWdpdCBhL3NyYy9yc2wuYyBiL2xpYm9zbW9jb3JlL3NyYy9yc2wuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3JzbC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvcnNsLmMKZGlmZiAtLWdpdCBhL3NyYy9yeGxldl9zdGF0LmMgYi9saWJvc21vY29yZS9zcmMvcnhsZXZfc3RhdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvcnhsZXZfc3RhdC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvcnhsZXZfc3RhdC5jCmRpZmYgLS1naXQgYS9zcmMvc2VsZWN0LmMgYi9saWJvc21vY29yZS9zcmMvc2VsZWN0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9zZWxlY3QuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3NlbGVjdC5jCmRpZmYgLS1naXQgYS9zcmMvc2lnbmFsLmMgYi9saWJvc21vY29yZS9zcmMvc2lnbmFsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9zaWduYWwuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3NpZ25hbC5jCmRpZmYgLS1naXQgYS9zcmMvc3RhdGlzdGljcy5jIGIvbGlib3Ntb2NvcmUvc3JjL3N0YXRpc3RpY3MuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3N0YXRpc3RpY3MuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3N0YXRpc3RpY3MuYwpkaWZmIC0tZ2l0IGEvc3JjL3RhbGxvYy5jIGIvbGlib3Ntb2NvcmUvc3JjL3RhbGxvYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGFsbG9jLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy90YWxsb2MuYwpkaWZmIC0tZ2l0IGEvc3JjL3RpbWVyLmMgYi9saWJvc21vY29yZS9zcmMvdGltZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RpbWVyLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy90aW1lci5jCmRpZmYgLS1naXQgYS9zcmMvdGx2X3BhcnNlci5jIGIvbGlib3Ntb2NvcmUvc3JjL3Rsdl9wYXJzZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3Rsdl9wYXJzZXIuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3Rsdl9wYXJzZXIuYwpkaWZmIC0tZ2l0IGEvc3JjL3V0aWxzLmMgYi9saWJvc21vY29yZS9zcmMvdXRpbHMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3V0aWxzLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy91dGlscy5jCmRpZmYgLS1naXQgYS9zcmMvd3JpdGVfcXVldWUuYyBiL2xpYm9zbW9jb3JlL3NyYy93cml0ZV9xdWV1ZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvd3JpdGVfcXVldWUuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3dyaXRlX3F1ZXVlLmMKZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL01ha2VmaWxlLmFtCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdHMvc21zL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvc21zL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9zbXMvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdHMvc21zL3Ntc190ZXN0LmMgYi9saWJvc21vY29yZS90ZXN0cy9zbXMvc21zX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvc21zL3Ntc190ZXN0LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9zbXNfdGVzdC5jCmRpZmYgLS1naXQgYS90ZXN0cy90aW1lci9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy90aW1lci9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvdGVzdHMvdGltZXIvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYyBiL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvdGltZXIvdGltZXJfdGVzdC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy90aW1lci90aW1lcl90ZXN0LmMKZGlmZiAtLWdpdCBhL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMjcuNC1taXNkbi1hYmlzLmRpZmYgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjI3LjQtbWlzZG4tYWJpcy5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTFlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjI3LjQtbWlzZG4tYWJpcy5kaWZmCkBAIC0wLDAgKzEsMTQ0IEBACitkaWZmIC1OcnUgLS1leGNsdWRlLWZyb20gL3N1bmJlYW0vaG9tZS9sYWZvcmdlL3NjcmlwdHMvZG9udGRpZmYgbGludXgtMi42LjI3LjQtY2xlYW4vZHJpdmVycy9pc2RuL21JU0ROL2xheWVyMi5jIGxpbnV4LTIuNi4yNy40L2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYworLS0tIGxpbnV4LTIuNi4yNy40LWNsZWFuL2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYwkyMDA4LTEwLTI2IDAwOjA1OjA3LjAwMDAwMDAwMCArMDIwMAorKysrIGxpbnV4LTIuNi4yNy40L2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYwkyMDA4LTEyLTIzIDE2OjE2OjI5LjAwMDAwMDAwMCArMDEwMAorQEAgLTk0LDggKzk0LDEwIEBACisgCXN0cnVjdCBsYXllcjIgKmwyID0gZmktPnVzZXJkYXRhOworIAl2YV9saXN0IHZhOworIAorKyNpZiAwCisgCWlmICghKCpkZWJ1ZyAmIERFQlVHX0wyX0ZTTSkpCisgCQlyZXR1cm47CisrI2VuZGlmCisgCXZhX3N0YXJ0KHZhLCBmbXQpOworIAlwcmludGsoS0VSTl9ERUJVRyAibDIgKHRlaSAlZCk6ICIsIGwyLT50ZWkpOworIAl2cHJpbnRrKGZtdCwgdmEpOworQEAgLTg4Miw2ICs4ODQsOCBAQAorIAlsMi0+dmEgPSAwOworIAlsMi0+dnIgPSAwOworIAlsMi0+c293ID0gMDsKKysJbDItPnNhcGkgPSBza2ItPmRhdGFbMF0gPj4gMjsKKysJc2V0X2NoYW5uZWxfYWRkcmVzcygmbDItPmNoLCBsMi0+c2FwaSwgbDItPnRlaSk7CisgCWNsZWFyX2V4Y2VwdGlvbihsMik7CisgCXNlbmRfdWZyYW1lKGwyLCBOVUxMLCBVQSB8IGdldF9Qb2xsRmxhZyhsMiwgc2tiKSwgUlNQKTsKKyAJbUlTRE5fRnNtQ2hhbmdlU3RhdGUoZmksIFNUX0wyXzcpOworQEAgLTg5OCw2ICs5MDIsNyBAQAorIAlzdHJ1Y3QgbGF5ZXIyICpsMiA9IGZpLT51c2VyZGF0YTsKKyAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFyZzsKKyAKKysJcHJpbnRrKEtFUk5fREVCVUcgImwyX3NlbmRfVUEoKVxuIik7CisgCXNlbmRfdWZyYW1lKGwyLCBza2IsIFVBIHwgZ2V0X1BvbGxGbGFnKGwyLCBza2IpLCBSU1ApOworIH0KKyAKK0BAIC05MzEsNiArOTM2LDggQEAKKyAJbDItPnZhID0gMDsKKyAJbDItPnZyID0gMDsKKyAJbDItPnNvdyA9IDA7CisrCWwyLT5zYXBpID0gc2tiLT5kYXRhWzBdID4+IDI7CisrCXNldF9jaGFubmVsX2FkZHJlc3MoJmwyLT5jaCwgbDItPnNhcGksIGwyLT50ZWkpOworIAltSVNETl9Gc21DaGFuZ2VTdGF0ZShmaSwgU1RfTDJfNyk7CisgCXN0b3BfdDIwMChsMiwgMyk7CisgCW1JU0ROX0ZzbVJlc3RhcnRUaW1lcigmbDItPnQyMDMsIGwyLT5UMjAzLCBFVl9MMl9UMjAzLCBOVUxMLCAzKTsKK0BAIC05ODIsNiArOTg5LDggQEAKKyAJfSBlbHNlIGlmIChsMi0+dnMgIT0gbDItPnZhKSB7CisgCQlza2JfcXVldWVfcHVyZ2UoJmwyLT5pX3F1ZXVlKTsKKyAJCXByID0gRExfRVNUQUJMSVNIX0lORDsKKysJCS8vbDItPnNhcGkgPSBza2ItPmRhdGFbMF0gPj4gMjsKKysJCS8vc2V0X2NoYW5uZWxfYWRkcmVzcygmbDItPmNoLCBsMi0+c2FwaSwgbDItPnRlaSk7CisgCX0KKyAJc3RvcF90MjAwKGwyLCA1KTsKKyAJbDItPnZyID0gMDsKK0BAIC0xODQxLDExICsxODUwLDE0IEBACisgCXVfaW50CWw7CisgCWludAljID0gMDsKKyAKKysJcHJpbnRrKEtFUk5fREVCVUcgInBoX2RhdGFfaW5kaWNhdGlvbiAweCV4IDB4JXggMHgleFxuIiwgZGF0YXBbMF0sIGRhdGFwWzFdLCBkYXRhcFsyXSk7CisrCisgCWwgPSBsMmFkZHJzaXplKGwyKTsKKyAJaWYgKHNrYi0+bGVuIDw9IGwpIHsKKyAJCW1JU0ROX0ZzbUV2ZW50KCZsMi0+bDJtLCBFVl9MMl9GUkFNRV9FUlJPUiwgKHZvaWQgKikgJ04nKTsKKyAJCXJldHVybiByZXQ7CisgCX0KKysjaWYgMAorIAlpZiAodGVzdF9iaXQoRkxHX0xBUEQsICZsMi0+ZmxhZykpIHsgLyogTWF5YmUgbm90IG5lZWRlZCAqLworIAkJcHNhcGkgPSAqZGF0YXArKzsKKyAJCXB0ZWkgPSAqZGF0YXArKzsKK0BAIC0xODc1LDYgKzE4ODcsNyBAQAorIAkJCXJldHVybiAwOworIAkJfQorIAl9IGVsc2UKKysjZW5kaWYKKyAJCWRhdGFwICs9IGw7CisgCWlmICghKCpkYXRhcCAmIDEpKSB7CS8qIEktRnJhbWUgKi8KKyAJCWMgPSBpZnJhbWVfZXJyb3IobDIsIHNrYik7CitAQCAtMTg5MCw2ICsxOTAzLDcgQEAKKyAJCQlyZXQgPSBtSVNETl9Gc21FdmVudCgmbDItPmwybSwgRVZfTDJfVUksIHNrYik7CisgCX0gZWxzZSBpZiAoSXNTQUJNRShkYXRhcCwgbDIpKSB7CisgCQljID0gdW5udW1fZXJyb3IobDIsIHNrYiwgQ01EKTsKKysJCXByaW50ayhLRVJOX0RFQlVHICJJc1NBQk1FKCkgcmV0dXJuZWQgdHJ1ZSwgdW5udW1fZXJyb3I9JWRcbiIsIGMpOworIAkJaWYgKCFjKQorIAkJCXJldCA9IG1JU0ROX0ZzbUV2ZW50KCZsMi0+bDJtLCBFVl9MMl9TQUJNRSwgc2tiKTsKKyAJfSBlbHNlIGlmIChJc1VBKGRhdGFwKSkgeworQEAgLTIwODcsNyArMjEwMSw3IEBACisgCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19MQVBELCAmbDItPmZsYWcpOworIAkJdGVzdF9hbmRfc2V0X2JpdChGTEdfTEFQRF9ORVQsICZsMi0+ZmxhZyk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19NT0QxMjgsICZsMi0+ZmxhZyk7CistCQlsMi0+c2FwaSA9IDA7CisrCQlsMi0+c2FwaSA9IDYyOworIAkJbDItPm1heGxlbiA9IE1BWF9ERlJBTUVfTEVOOworIAkJaWYgKHRlc3RfYml0KE9QVElPTl9MMl9QTVgsICZvcHRpb25zKSkKKyAJCQlsMi0+d2luZG93ID0gNzsKK2RpZmYgLU5ydSAtLWV4Y2x1ZGUtZnJvbSAvc3VuYmVhbS9ob21lL2xhZm9yZ2Uvc2NyaXB0cy9kb250ZGlmZiBsaW51eC0yLjYuMjcuNC1jbGVhbi9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMgbGludXgtMi42LjI3LjQvZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCistLS0gbGludXgtMi42LjI3LjQtY2xlYW4vZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCTIwMDgtMTAtMjYgMDA6MDU6MDcuMDAwMDAwMDAwICswMjAwCisrKysgbGludXgtMi42LjI3LjQvZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCTIwMDgtMTItMjMgMTY6MzI6NTkuMDAwMDAwMDAwICswMTAwCitAQCAtODMwLDE4ICs4MzAsMjkgQEAKKyAJaW50CQl0ZWksIHJpOworIAlzdHJ1Y3QgbGF5ZXIyCSpsMjsKKyAKKysJcHJpbnRrKEtFUk5fREVCVUcgIm5ldyB0ZWkgcmVxdWVzdDogdGVpPSVkXG4iLCBkcFszXSA+PiAxKTsKKysKKyAJcmkgPSBkcFswXSA8PCA4OworIAlyaSArPSBkcFsxXTsKKy0JaWYgKCFtZ3ItPnVwKQorLQkJZ290byBkZW5pZWQ7CistCXRlaSA9IGdldF9mcmVlX3RlaShtZ3IpOworLQlpZiAodGVpIDwgMCkgeworLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6Tm8gZnJlZSB0ZWlcbiIsIF9fZnVuY19fKTsKKysJaWYgKCFtZ3ItPnVwKSB7CisrCQlwcmludGsoS0VSTl9ERUJVRyAibWdyLT51cCA9PSBOVUxMXG4iKTsKKyAJCWdvdG8gZGVuaWVkOworIAl9CisrCWlmIChkcFszXSAhPSAweGZmKSB7CisrCQkvKiBUaGlzIGlzIGEgVEVJIHJlcXVlc3QgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMDguNTYgNi4xLjExLjIgKi8KKysJCXRlaSA9IGRwWzNdID4+IDE7CisrCX0gZWxzZSB7CisrCQl0ZWkgPSBnZXRfZnJlZV90ZWkobWdyKTsKKysJCWlmICh0ZWkgPCAwKSB7CisrCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6Tm8gZnJlZSB0ZWlcbiIsIF9fZnVuY19fKTsKKysJCQlnb3RvIGRlbmllZDsKKysJCX0KKysJfQorIAlsMiA9IGNyZWF0ZV9uZXdfdGVpKG1nciwgdGVpKTsKKy0JaWYgKCFsMikKKysJaWYgKCFsMikgeworKwkJcHJpbnRrKEtFUk5fREVCVUcgImNyZWF0ZV9uZXdfdGVpID09IE5VTExcbiIpOworIAkJZ290byBkZW5pZWQ7CisrCX0KKyAJZWxzZQorIAkJbUlTRE5fRnNtRXZlbnQoJmwyLT50bS0+dGVpX20sIEVWX0FTU0lHTl9SRVEsIGRwKTsKKyAJcmV0dXJuOworQEAgLTExNTksMTIgKzExNzAsMTQgQEAKKyAJCXJldHVybiAtRU5PVENPTk47CisgCWlmIChza2ItPmxlbiAhPSAzKQorIAkJcmV0dXJuIC1FTk9UQ09OTjsKKysjaWYgMAorIAlpZiAoc2tiLT5kYXRhWzBdICE9IDApCisgCQkvKiBvbmx5IFNBUEkgMCBjb21tYW5kICovCisgCQlyZXR1cm4gLUVOT1RDT05OOworKyNlbmRpZgorIAlpZiAoIShza2ItPmRhdGFbMV0gJiAxKSkgLyogaW52YWxpZCBFQTEgKi8KKyAJCXJldHVybiAtRUlOVkFMOworLQl0ZWkgPSBza2ItPmRhdGFbMV0gPj4gMDsKKysJdGVpID0gc2tiLT5kYXRhWzFdID4+IDE7CisgCWlmICh0ZWkgPiA2MykgLyogbm90IGEgZml4ZWQgdGVpICovCisgCQlyZXR1cm4gLUVOT1RDT05OOworIAlpZiAoKHNrYi0+ZGF0YVsyXSAmIH4weDEwKSAhPSBTQUJNRSkKZGlmZiAtLWdpdCBhL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMzAtaGZjbXVsdGktbXVsdGlidHMucGF0Y2ggYi9saW51eC1rZXJuZWwvbGludXgtMi42LjMwLWhmY211bHRpLW11bHRpYnRzLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTRkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjMwLWhmY211bHRpLW11bHRpYnRzLnBhdGNoCkBAIC0wLDAgKzEsNDg2IEBACitUaGlzIGV4cGVyaW1lbnRhbCBwYXRjaCBzcGxpdHMgb25lIEUxIGNhcmQgaW50byB0aHJlZSB2aXJ0dWFsIGNhcmRzLAorCitUUyAxLDIsMyw0LDUgaXMgY2FyZCAwCitUUyA2LDcsOCw5LDEwIGlzIGNhcmQgMQorVFMgMTEsMTIsMTMsMTQgaXMgY2FyZCAyCisKK1RoaXMgYWxsb3dzIHlvdSB0byBydW4gb25lIEwyIFRFSSBoYW5kbGVyIG9uIGVhY2ggb2YgdGhlIHZpcnR1YWwgY2FyZHMsCit3aGljaCBpcyByZXF1aXJlZCBpZiB5b3Ugd2FudCB0byBydW4gbXVsdGlwbGUgQlRTIG9uIGEgc2luZ2xlIEUxIGxpbmsuCisKK1RoYW5rcyB0byBBbmRyZWFzIEV2ZXJzYmVyZyBmb3IgdGhpcyBwYXRjaC4KKworZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaCBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaAoraW5kZXggMGM3NzM4Ni4uMDJkZDRhMSAxMDA2NDQKKy0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaAorKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19tdWx0aS5oCitAQCAtMjA5LDE0ICsyMDksMTcgQEAgc3RydWN0IGhmY19tdWx0aSB7CisgCXVfbG9uZwkJbGVkc3RhdGU7IC8qIHNhdmUgbGFzdCBzdGF0ZSBvZiBsZWRzICovCisgCWludAkJb3B0aWNhbHN1cHBvcnQ7IC8qIGhhcyB0aGUgZTEgYm9hcmQgKi8KKyAJCQkJCS8qIGFuIG9wdGljYWwgSW50ZXJmYWNlICovCistCWludAkJZHNsb3Q7CS8qIGNoYW5uZWwgIyBvZiBkLWNoYW5uZWwgKEUxKSBkZWZhdWx0IDE2ICovCisrCisrCXVfaW50CQlibWFza1szMl07IC8qIGJpdG1hc2sgb2YgYmNoYW5uZWxzIGZvciBwb3J0ICovCisrCXVfY2hhcgkJZG51bVszMl07IC8qIGFycmF5IG9mIHVzZWQgZGNoYW5uZWwgbnVtYmVycyBmb3IgcG9ydCAqLworKwl1X2NoYXIJCWNyZWF0ZWRbMzJdOyAvKiB3aGF0IHBvcnQgaXMgY3JlYXRlZCAqLworKwl1X2ludAkJYWN0aXZpdHlbMzJdOyAJLyogaWYgdGhlcmUgaXMgYW55IGFjdGlvbiBvbiB0aGlzICovCisrCQkJCQkvKiBwb3J0ICh3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgKi8KKysJCQkJCS8qIHNob3dpbmcgbGVkLXN0YXRlcykgKi8KKyAKKyAJdV9sb25nCQl3ZGNvdW50OyAJLyogZXZlcnkgNTAwIG1zIHdlIG5lZWQgdG8gKi8KKyAJCQkJCS8qIHNlbmQgdGhlIHdhdGNoZG9nIGEgc2lnbmFsICovCisgCXVfY2hhcgkJd2RieXRlOyAvKiB3YXRjaGRvZyB0b2dnbGUgYnl0ZSAqLworLQl1X2ludAkJYWN0aXZpdHlbOF07IAkvKiBpZiB0aGVyZSBpcyBhbnkgYWN0aW9uIG9uIHRoaXMgKi8KKy0JCQkJCS8qIHBvcnQgKHdpbGwgYmUgY2xlYXJlZCBhZnRlciAqLworLQkJCQkJLyogc2hvd2luZyBsZWQtc3RhdGVzKSAqLworIAlpbnQJCWUxX3N0YXRlOyAvKiBrZWVwIHRyYWNrIG9mIGxhc3Qgc3RhdGUgKi8KKyAJaW50CQllMV9nZXRjbG9jazsgLyogaWYgc3luYyBpcyByZXRyaWV2ZWQgZnJvbSBpbnRlcmZhY2UgKi8KKyAJaW50CQlzeW5jcm9uaXplZDsgLyoga2VlcCB0cmFjayBvZiBleGlzdGluZyBzeW5jIGludGVyZmFjZSAqLworQEAgLTIzMyw3ICsyMzYsNiBAQCBzdHJ1Y3QgaGZjX211bHRpIHsKKyAJICogdGhlIGJjaC0+Y2hhbm5lbCBpcyBlcXV2YWxlbnQgdG8gdGhlIGhmYy1jaGFubmVsCisgCSAqLworIAlzdHJ1Y3QgaGZjX2NoYW4JY2hhblszMl07CistCXVfY2hhcgkJY3JlYXRlZFs4XTsgLyogd2hhdCBwb3J0IGlzIGNyZWF0ZWQgKi8KKyAJc2lnbmVkIGNoYXIJc2xvdF9vd25lclsyNTZdOyAvKiBvd25lciBjaGFubmVsIG9mIHNsb3QgKi8KKyB9OworIAorZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKK2luZGV4IGUxZGFiMzAuLjRmZTJkMjcgMTAwNjQ0CistLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYworKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKK0BAIC0xNjE5LDggKzE2MTksOCBAQCBoZmNtdWx0aV9sZWRzKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJICogbGVmdCByZWQ6ICAgICAgIGZyYW1lIHN5bmMsIGJ1dCBubyBMMQorIAkJICogcmlnaHQgZ3JlZW46ICAgIEwyIGFjdGl2ZQorIAkJICovCistCQlpZiAoaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jICE9IDIpIHsgLyogbm8gZnJhbWUgc3luYyAqLworLQkJCWlmIChoYy0+Y2hhbltoYy0+ZHNsb3RdLmRjaC0+ZGV2LkQucHJvdG9jb2wKKysJCWlmIChoYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyAhPSAyKSB7IC8qIG5vIGZyYW1lIHN5bmMgKi8KKysJCQlpZiAoaGMtPmNoYW5baGMtPmRudW1bMF1dLmRjaC0+ZGV2LkQucHJvdG9jb2wKKyAJCQkJIT0gSVNETl9QX05UX0UxKSB7CisgCQkJCWxlZFswXSA9IDE7CisgCQkJCWxlZFsxXSA9IDE7CitAQCAtMjQyOCw1NSArMjQyOCw1NiBAQCBoYW5kbGVfdGltZXJfaXJxKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJCX0KKyAJCX0KKyAJaWYgKGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSAmJiBoYy0+Y3JlYXRlZFswXSkgeworLQkJZGNoID0gaGMtPmNoYW5baGMtPmRzbG90XS5kY2g7CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrI3dhcm5pbmcgdG9kbzogcHV0IGludGVyZmFjZSBwYXJhbWV0ZXJzIHRvIGhjCisrCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVswXV0uZGNoOworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX0xPUywgJmhjLT5jaGFuW2hjLT5kbnVtWzBdXS5jZmcpKSB7CisgCQkJLyogTE9TICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TWU5DX1NUQSkgJiBWX1NJR19MT1M7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0ubG9zKQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0ubG9zKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfTE9TX09OLAorIAkJCQkgICAgIkxPUyBkZXRlY3RlZCIpOworLQkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZHNsb3RdLmxvcykKKysJCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRudW1bMF1dLmxvcykKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX0xPU19PRkYsCisgCQkJCSAgICAiTE9TIGdvbmUiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmxvcyA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLmxvcyA9IHRlbXA7CisgCQl9CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfQUlTLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfQUlTLCAmaGMtPmNoYW5baGMtPmRudW1bMF1dLmNmZykpIHsKKyAJCQkvKiBBSVMgKi8KKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NZTkNfU1RBKSAmIFZfQUlTOworLQkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZHNsb3RdLmFpcykKKysJCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRudW1bMF1dLmFpcykKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX0FJU19PTiwKKyAJCQkJICAgICJBSVMgZGV0ZWN0ZWQiKTsKKy0JCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRzbG90XS5haXMpCisrCQkJaWYgKHRlbXAgJiYgIWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5haXMpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9BSVNfT0ZGLAorIAkJCQkgICAgIkFJUyBnb25lIik7CistCQkJaGMtPmNoYW5baGMtPmRzbG90XS5haXMgPSB0ZW1wOworKwkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5haXMgPSB0ZW1wOworIAkJfQorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1NMSVAsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9TTElQLCAmaGMtPmNoYW5baGMtPmRudW1bMF1dLmNmZykpIHsKKyAJCQkvKiBTTElQICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TTElQKSAmIFZfRk9TTElQX1JYOworLQkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZHNsb3RdLnNsaXBfcngpCisrCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zbGlwX3J4KQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfU0xJUF9SWCwKKyAJCQkJICAgICIgYml0IFNMSVAgZGV0ZWN0ZWQgUlgiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnNsaXBfcnggPSB0ZW1wOworKwkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zbGlwX3J4ID0gdGVtcDsKKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NMSVApICYgVl9GT1NMSVBfVFg7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0uc2xpcF90eCkKKysJCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRudW1bMF1dLnNsaXBfdHgpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9TTElQX1RYLAorIAkJCQkgICAgIiBiaXQgU0xJUCBkZXRlY3RlZCBUWCIpOworLQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc2xpcF90eCA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnNsaXBfdHggPSB0ZW1wOworIAkJfQorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1JESSwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkgeworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1JESSwgJmhjLT5jaGFuW2hjLT5kbnVtWzBdXS5jZmcpKSB7CisgCQkJLyogUkRJICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9SWF9TTDBfMCkgJiBWX0E7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0ucmRpKQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0ucmRpKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfUkRJX09OLAorIAkJCQkgICAgIlJESSBkZXRlY3RlZCIpOworLQkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZHNsb3RdLnJkaSkKKysJCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRudW1bMF1dLnJkaSkKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX1JESV9PRkYsCisgCQkJCSAgICAiUkRJIGdvbmUiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnJkaSA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnJkaSA9IHRlbXA7CisgCQl9CisgCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX0pBVFRfRElSKTsKKy0JCXN3aXRjaCAoaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jKSB7CisrCQlzd2l0Y2ggKGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jKSB7CisgCQljYXNlIDA6CisgCQkJaWYgKCh0ZW1wICYgMHg2MCkgPT0gMHg2MCkgeworIAkJCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9TWU5DKQorQEAgLTI0ODUsMTAgKzI0ODYsMTAgQEAgaGFuZGxlX3RpbWVyX2lycShzdHJ1Y3QgaGZjX211bHRpICpoYykKKyAJCQkJCSAgICAiaW4gY2xvY2sgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKyAJCQkJSEZDX291dGIoaGMsIFJfUlhfT0ZGLAorLQkJCQkgICAgaGMtPmNoYW5baGMtPmRzbG90XS5qaXR0ZXIgfCBWX1JYX0lOSVQpOworKwkJCQkgICAgaGMtPmNoYW5baGMtPmRudW1bMF1dLmppdHRlciB8IFZfUlhfSU5JVCk7CisgCQkJCUhGQ19vdXRiKGhjLCBSX1RYX09GRiwKKy0JCQkJICAgIGhjLT5jaGFuW2hjLT5kc2xvdF0uaml0dGVyIHwgVl9SWF9JTklUKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMTsKKysJCQkJICAgIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5qaXR0ZXIgfCBWX1JYX0lOSVQpOworKwkJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyA9IDE7CisgCQkJCWdvdG8gY2hlY2tfZnJhbWVzeW5jOworIAkJCX0KKyAJCQlicmVhazsKK0BAIC0yNDk5LDcgKzI1MDAsNyBAQCBoYW5kbGVfdGltZXJfaXJxKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJCQkJICAgICIlczogKGlkPSVkKSBFMSAiCisgCQkJCQkgICAgImxvc3QgY2xvY2sgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMDsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAwOworIAkJCQlicmVhazsKKyAJCQl9CisgY2hlY2tfZnJhbWVzeW5jOgorQEAgLTI1MTAsNyArMjUxMSw3IEBAIGNoZWNrX2ZyYW1lc3luYzoKKyAJCQkJCSAgICAiJXM6IChpZD0lZCkgRTEgIgorIAkJCQkJICAgICJub3cgaW4gZnJhbWUgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMjsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAyOworIAkJCX0KKyAJCQlicmVhazsKKyAJCWNhc2UgMjoKK0BAIC0yNTIwLDcgKzI1MjEsNyBAQCBjaGVja19mcmFtZXN5bmM6CisgCQkJCQkgICAgIiVzOiAoaWQ9JWQpIEUxIGxvc3QgIgorIAkJCQkJICAgICJjbG9jayAmIGZyYW1lIHN5bmNcbiIsCisgCQkJCQkgICAgX19mdW5jX18sIGhjLT5pZCk7CistCQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYyA9IDA7CisrCQkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jID0gMDsKKyAJCQkJYnJlYWs7CisgCQkJfQorIAkJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfU1lOQ19TVEEpOworQEAgLTI1MzAsNyArMjUzMSw3IEBAIGNoZWNrX2ZyYW1lc3luYzoKKyAJCQkJCSAgICAiJXM6IChpZD0lZCkgRTEgIgorIAkJCQkJICAgICJsb3N0IGZyYW1lIHN5bmNcbiIsCisgCQkJCQkgICAgX19mdW5jX18sIGhjLT5pZCk7CistCQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYyA9IDE7CisrCQkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jID0gMTsKKyAJCQl9CisgCQkJYnJlYWs7CisgCQl9CitAQCAtMjc0Niw3ICsyNzQ3LDggQEAgaGZjbXVsdGlfaW50ZXJydXB0KGludCBpbnRubywgdm9pZCAqZGV2X2lkKQorIAkJaWYgKHJfaXJxX21pc2MgJiBWX1NUQV9JUlEpIHsKKyAJCQlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CisgCQkJCS8qIHN0YXRlIG1hY2hpbmUgKi8KKy0JCQkJZGNoID0gaGMtPmNoYW5baGMtPmRzbG90XS5kY2g7CisrI3dhcm5pbmcgdG9kbworKwkJCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVswXV0uZGNoOworIAkJCQllMV9zeW5jc3RhID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NZTkNfU1RBKTsKKyAJCQkJaWYgKHRlc3RfYml0KEhGQ19DSElQX1BMWFNELCAmaGMtPmNoaXApCisgCQkJCSAmJiBoYy0+ZTFfZ2V0Y2xvY2spIHsKK0BAIC0yNzY4LDcgKzI3NzAsMTUgQEAgaGZjbXVsdGlfaW50ZXJydXB0KGludCBpbnRubywgdm9pZCAqZGV2X2lkKQorIAkJCQl9CisgCQkJCWRjaC0+c3RhdGUgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfRTFfUkRfU1RBKQorIAkJCQkJJiAweDc7CisrI3dhcm5pbmcgdG9kbyBoYWNrISEhIGJyb2FkY2FzdCBzdGF0ZSBjaGFuZ2UhISEKKysJCQkJZGNoID0gaGMtPmNoYW5baGMtPmRudW1bMF1dLmRjaDsKKyAJCQkJc2NoZWR1bGVfZXZlbnQoZGNoLCBGTEdfUEhDSEFOR0UpOworKwkJCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVsxXV0uZGNoOworKwkJCQlkY2gtPnN0YXRlID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX0UxX1JEX1NUQSkKKysJCQkJCSYgMHg3OworKwkJCQlzY2hlZHVsZV9ldmVudChkY2gsIEZMR19QSENIQU5HRSk7CisrCisrCisgCQkJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX1NUQVRFKQorIAkJCQkJcHJpbnRrKEtFUk5fREVCVUcKKyAJCQkJCSAgICAiJXM6IEUxIChpZD0lZCkgbmV3c3RhdGUgJXhcbiIsCitAQCAtMzg1MSwzMSArMzg2MSwzNSBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKKyAJCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50ZXJlZFxuIiwgX19mdW5jX18pOworIAorKwlpID0gZGNoLT5zbG90OworKwlwdCA9IGhjLT5jaGFuW2ldLnBvcnQ7CisgCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpIHsKKy0JCWhjLT5jaGFuW2hjLT5kc2xvdF0uc2xvdF90eCA9IC0xOworLQkJaGMtPmNoYW5baGMtPmRzbG90XS5zbG90X3J4ID0gLTE7CistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmNvbmYgPSAtMTsKKy0JCWlmIChoYy0+ZHNsb3QpIHsKKy0JCQltb2RlX2hmY211bHRpKGhjLCBoYy0+ZHNsb3QsIGRjaC0+ZGV2LkQucHJvdG9jb2wsCisrCQkvKiBFMSAqLworKyN3YXJuaW5nIHRvZG86IGRvbicndCBkbyBpdCBpZiBkbnVtID09IDAKKysJCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uc2xvdF90eCA9IC0xOworKwkJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5zbG90X3J4ID0gLTE7CisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNvbmYgPSAtMTsKKysJCWlmIChoYy0+ZG51bVtwdF0pIHsKKysJCQltb2RlX2hmY211bHRpKGhjLCBkY2gtPnNsb3QsIGRjaC0+ZGV2LkQucHJvdG9jb2wsCisgCQkJCS0xLCAwLCAtMSwgMCk7CisgCQkJZGNoLT50aW1lci5mdW5jdGlvbiA9ICh2b2lkICopIGhmY211bHRpX2RidXN5X3RpbWVyOworIAkJCWRjaC0+dGltZXIuZGF0YSA9IChsb25nKSBkY2g7CisgCQkJaW5pdF90aW1lcigmZGNoLT50aW1lcik7CisgCQl9CisgCQlmb3IgKGkgPSAxOyBpIDw9IDMxOyBpKyspIHsKKy0JCQlpZiAoaSA9PSBoYy0+ZHNsb3QpCisrCQkJaWYgKCEoKDEgPDwgaSkgJiBoYy0+Ym1hc2tbcHRdKSkgLyogc2tpcCB1bnVzZWQgY2hhbm5lbCAqLworIAkJCQljb250aW51ZTsKKyAJCQloYy0+Y2hhbltpXS5zbG90X3R4ID0gLTE7CisgCQkJaGMtPmNoYW5baV0uc2xvdF9yeCA9IC0xOworIAkJCWhjLT5jaGFuW2ldLmNvbmYgPSAtMTsKKyAJCQltb2RlX2hmY211bHRpKGhjLCBpLCBJU0ROX1BfTk9ORSwgLTEsIDAsIC0xLCAwKTsKKyAJCX0KKy0JCS8qIEUxICovCistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrI3dhcm5pbmcgdG9kbyAoZ2xvYmFsKQorKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX0xPUywgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKSkgeworIAkJCUhGQ19vdXRiKGhjLCBSX0xPUzAsIDI1NSk7IC8qIDIgbXMgKi8KKyAJCQlIRkNfb3V0YihoYywgUl9MT1MxLCAyNTUpOyAvKiA1MTIgbXMgKi8KKyAJCX0KKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX09QVElDQUwsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX09QVElDQUwsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpIHsKKyAJCQlIRkNfb3V0YihoYywgUl9SWDAsIDApOworIAkJCWhjLT5ody5yX3R4MCA9IDAgfCBWX09VVF9FTjsKKyAJCX0gZWxzZSB7CitAQCAtMzg4OCwxMiArMzkwMiwxMiBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJCUhGQ19vdXRiKGhjLCBSX1RYX0ZSMCwgMHgwMCk7CisgCQlIRkNfb3V0YihoYywgUl9UWF9GUjEsIDB4ZjgpOworIAorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfQ1JDNCwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX0NSQzQsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpCisgCQkJSEZDX291dGIoaGMsIFJfVFhfRlIyLCBWX1RYX01GIHwgVl9UWF9FIHwgVl9ORUdfRSk7CisgCisgCQlIRkNfb3V0YihoYywgUl9SWF9GUjAsIFZfQVVUT19SRVNZTkMgfCBWX0FVVE9fUkVDTyB8IDApOworIAorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfQ1JDNCwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX0NSQzQsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpCisgCQkJSEZDX291dGIoaGMsIFJfUlhfRlIxLCBWX1JYX01GIHwgVl9SWF9NRl9TWU5DKTsKKyAKKyAJCWlmIChkY2gtPmRldi5ELnByb3RvY29sID09IElTRE5fUF9OVF9FMSkgeworQEAgLTM5NTcsNyArMzk3MSw3IEBAIGhmY211bHRpX2luaXRtb2RlKHN0cnVjdCBkY2hhbm5lbCAqZGNoKQorIAkJCXBseHNkX2NoZWNrc3luYyhoYywgMCk7CisgCQl9CisgCX0gZWxzZSB7CistCQlpID0gZGNoLT5zbG90OworKwkJLyogU1QgKi8KKyAJCWhjLT5jaGFuW2ldLnNsb3RfdHggPSAtMTsKKyAJCWhjLT5jaGFuW2ldLnNsb3RfcnggPSAtMTsKKyAJCWhjLT5jaGFuW2ldLmNvbmYgPSAtMTsKK0BAIC0zOTczLDggKzM5ODcsNiBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJCWhjLT5jaGFuW2kgLSAxXS5zbG90X3J4ID0gLTE7CisgCQloYy0+Y2hhbltpIC0gMV0uY29uZiA9IC0xOworIAkJbW9kZV9oZmNtdWx0aShoYywgaSAtIDEsIElTRE5fUF9OT05FLCAtMSwgMCwgLTEsIDApOworLQkJLyogU1QgKi8KKy0JCXB0ID0gaGMtPmNoYW5baV0ucG9ydDsKKyAJCS8qIHNlbGVjdCBpbnRlcmZhY2UgKi8KKyAJCUhGQ19vdXRiKGhjLCBSX1NUX1NFTCwgcHQpOworIAkJLyogdW5kb2N1bWVudGVkOiBkZWxheSBhZnRlciBSX1NUX1NFTCAqLworQEAgLTQ1NTcsNiArNDU2OSw4IEBAIHJlbGVhc2VfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGRjaGFubmVsICpkY2gpCisgCQl9CisgCQkvKiBmcmVlIGNoYW5uZWxzICovCisgCQlmb3IgKGkgPSAwOyBpIDw9IDMxOyBpKyspIHsKKysJCQlpZiAoISgoMSA8PCBpKSAmIGhjLT5ibWFza1twdF0pKSAvKiBza2lwIHVudXNlZCBjaGFubmVsICovCisrCQkJCWNvbnRpbnVlOworIAkJCWlmIChoYy0+Y2hhbltpXS5iY2gpIHsKKyAJCQkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKKyAJCQkJCXByaW50ayhLRVJOX0RFQlVHCitAQCAtNDY4MCwxMiArNDY5NCwxMyBAQCByZWxlYXNlX2NhcmQoc3RydWN0IGhmY19tdWx0aSAqaGMpCisgfQorIAorIHN0YXRpYyBpbnQKKy1pbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisraW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptLCBpbnQgcHQpCisgeworIAlzdHJ1Y3QgZGNoYW5uZWwJKmRjaDsKKyAJc3RydWN0IGJjaGFubmVsCSpiY2g7CisgCWludAkJY2gsIHJldCA9IDA7CisgCWNoYXIJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsKKysJaW50CQliY291bnQgPSAwOworIAorIAlkY2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGNoYW5uZWwpLCBHRlBfS0VSTkVMKTsKKyAJaWYgKCFkY2gpCitAQCAtNDY5OCwxMyArNDcxMywxMiBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCSAgICAoMSA8PCAoSVNETl9QX0JfSERMQyAmIElTRE5fUF9CX01BU0spKTsKKyAJZGNoLT5kZXYuRC5zZW5kID0gaGFuZGxlX2Rtc2c7CisgCWRjaC0+ZGV2LkQuY3RybCA9IGhmY21fZGN0cmw7CistCWRjaC0+ZGV2Lm5yYmNoYW4gPSAoaGMtPmRzbG90KSA/IDMwIDogMzE7CistCWRjaC0+c2xvdCA9IGhjLT5kc2xvdDsKKy0JaGMtPmNoYW5baGMtPmRzbG90XS5kY2ggPSBkY2g7CistCWhjLT5jaGFuW2hjLT5kc2xvdF0ucG9ydCA9IDA7CistCWhjLT5jaGFuW2hjLT5kc2xvdF0ubnRfdGltZXIgPSAtMTsKKysJZGNoLT5zbG90ID0gaGMtPmRudW1bcHRdOworKwloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmRjaCA9IGRjaDsKKysJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5wb3J0ID0gcHQ7CisrCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0ubnRfdGltZXIgPSAtMTsKKyAJZm9yIChjaCA9IDE7IGNoIDw9IDMxOyBjaCsrKSB7CistCQlpZiAoY2ggPT0gaGMtPmRzbG90KSAvKiBza2lwIGRjaGFubmVsICovCisrCQlpZiAoISgoMSA8PCBjaCkgJiBoYy0+Ym1hc2tbcHRdKSkgLyogc2tpcCB1bnVzZWQgY2hhbm5lbCAqLworIAkJCWNvbnRpbnVlOworIAkJYmNoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJjaGFubmVsKSwgR0ZQX0tFUk5FTCk7CisgCQlpZiAoIWJjaCkgeworQEAgLTQ3MzMsNyArNDc0NywxMCBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQloYy0+Y2hhbltjaF0uYmNoID0gYmNoOworIAkJaGMtPmNoYW5bY2hdLnBvcnQgPSAwOworIAkJc2V0X2NoYW5uZWxtYXAoYmNoLT5uciwgZGNoLT5kZXYuY2hhbm5lbG1hcCk7CisrCQliY291bnQrKzsKKyAJfQorKwlkY2gtPmRldi5ucmJjaGFuID0gYmNvdW50OworKyN3YXJuaW5nIHRvZG86IG11c3QgYmUgc2V0IGdsb2JhbGx5LCBhbmQgbXVzdCBiZSBhIHNlcGVyYXRlIGZ1bmN0aW9uCisgCS8qIHNldCBvcHRpY2FsIGxpbmUgdHlwZSAqLworIAlpZiAocG9ydFtQb3J0X2NudF0gJiAweDAwMSkgeworIAkJaWYgKCFtLT5vcHRpY2Fsc3VwcG9ydCkgIHsKK0BAIC00NzQ5LDcgKzQ3NjYsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJCSAgICBfX2Z1bmNfXywKKyAJCQkJICAgIEhGQ19jbnQgKyAxLCAxKTsKKyAJCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfT1BUSUNBTCwKKy0JCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCQkgICAgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKTsKKyAJCX0KKyAJfQorIAkvKiBzZXQgTE9TIHJlcG9ydCAqLworQEAgLTQ3NTksNyArNDc3Niw3IEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCQkgICAgIkxPUyByZXBvcnQ6IGNhcmQoJWQpIHBvcnQoJWQpXG4iLAorIAkJCSAgICBfX2Z1bmNfXywgSEZDX2NudCArIDEsIDEpOworIAkJdGVzdF9hbmRfc2V0X2JpdChIRkNfQ0ZHX1JFUE9SVF9MT1MsCistCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAl9CisgCS8qIHNldCBBSVMgcmVwb3J0ICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDA4KSB7CitAQCAtNDc2OCw3ICs0Nzg1LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiQUlTIHJlcG9ydDogY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX0FJUywKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0KKyAJLyogc2V0IFNMSVAgcmVwb3J0ICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDEwKSB7CitAQCAtNDc3OCw3ICs0Nzk1LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX1NMSVAsCistCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAl9CisgCS8qIHNldCBSREkgcmVwb3J0ICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDIwKSB7CitAQCAtNDc4OCw3ICs0ODA1LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX1JESSwKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0KKyAJLyogc2V0IENSQy00IE1vZGUgKi8KKyAJaWYgKCEocG9ydFtQb3J0X2NudF0gJiAweDEwMCkpIHsKK0BAIC00Nzk3LDcgKzQ4MTQsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJCSIgY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJCV9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfQ1JDNCwKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0gZWxzZSB7CisgCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9JTklUKQorIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUE9SVCB0dXJuIG9mZiBDUkM0IgorQEAgLTQ4MjksMjAgKzQ4NDYsMjMgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAl9CisgCS8qIHNldCBlbGFzdGljIGppdHRlciBidWZmZXIgKi8KKyAJaWYgKHBvcnRbUG9ydF9jbnRdICYgMHgzMDAwKSB7CistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciA9IChwb3J0W1BvcnRfY250XT4+MTIpICYgMHgzOworKwkJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5qaXR0ZXIgPSAocG9ydFtQb3J0X2NudF0+PjEyKSAmIDB4MzsKKyAJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCisgCQkJcHJpbnRrKEtFUk5fREVCVUcKKyAJCQkgICAgIiVzOiBQT1JUIHNldCBlbGFzdGljICIKKyAJCQkgICAgImJ1ZmZlciB0byAlZDogY2FyZCglZCkgcG9ydCglZClcbiIsCistCQkJICAgIF9fZnVuY19fLCBoYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciwKKysJCQkgICAgX19mdW5jX18sIGhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uaml0dGVyLAorIAkJCSAgICBIRkNfY250ICsgMSwgMSk7CisgCX0gZWxzZQorLQkJaGMtPmNoYW5baGMtPmRzbG90XS5qaXR0ZXIgPSAyOyAvKiBkZWZhdWx0ICovCistCXNucHJpbnRmKG5hbWUsIE1JU0ROX01BWF9JRExFTiAtIDEsICJoZmMtZTEuJWQiLCBIRkNfY250ICsgMSk7CisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmppdHRlciA9IDI7IC8qIGRlZmF1bHQgKi8KKysJaWYgKGhjLT5wb3J0cyA+IDEpCisrCQlzbnByaW50ZihuYW1lLCBNSVNETl9NQVhfSURMRU4gLSAxLCAiaGZjLWUxLiVkLSVkIiwgSEZDX2NudCArIDEsIHB0KzEpOworKwllbHNlCisrCQlzbnByaW50ZihuYW1lLCBNSVNETl9NQVhfSURMRU4gLSAxLCAiaGZjLWUxLiVkIiwgSEZDX2NudCArIDEpOworIAlyZXQgPSBtSVNETl9yZWdpc3Rlcl9kZXZpY2UoJmRjaC0+ZGV2LCAmaGMtPnBjaV9kZXYtPmRldiwgbmFtZSk7CisgCWlmIChyZXQpCisgCQlnb3RvIGZyZWVfY2hhbjsKKy0JaGMtPmNyZWF0ZWRbMF0gPSAxOworKwloYy0+Y3JlYXRlZFtwdF0gPSAxOworIAlyZXR1cm4gcmV0OworIGZyZWVfY2hhbjoKKyAJcmVsZWFzZV9wb3J0KGhjLCBkY2gpOworQEAgLTUwMDksMTggKzUwMjksMzAgQEAgaGZjbXVsdGlfaW5pdChzdHJ1Y3QgaG1fbWFwICptLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKyAJaGMtPmlkID0gSEZDX2NudDsKKyAJaGMtPnBjbSA9IHBjbVtIRkNfY250XTsKKyAJaGMtPmlvX21vZGUgPSBpb21vZGVbSEZDX2NudF07CisrI3dhcm5pbmcgdG9kbzogcmV3b3JrIG1vZHVsZSBwYXJhbWV0ZXJzIGZvciBjdXN0b21pemluZyBlMSBmcmFnbWVudHMuLi4uIHllYSwgbGV0JydzIGNhbGwgaXQ6IGZyYWdtZW50cworIAlpZiAoZHNsb3RbSEZDX2NudF0gPCAwICYmIGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSkgeworLQkJaGMtPmRzbG90ID0gMDsKKysJCWhjLT5kbnVtWzBdID0gMDsKKyAJCXByaW50ayhLRVJOX0lORk8gIkhGQy1FMSBjYXJkIGhhcyBkaXNhYmxlZCBELWNoYW5uZWwsIGJ1dCAiCisgCQkJIjMxIEItY2hhbm5lbHNcbiIpOworIAl9CisgCWlmIChkc2xvdFtIRkNfY250XSA+IDAgJiYgZHNsb3RbSEZDX2NudF0gPCAzMgorIAkgICAgJiYgaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CistCQloYy0+ZHNsb3QgPSBkc2xvdFtIRkNfY250XTsKKysJCWhjLT5kbnVtWzBdID0gZHNsb3RbSEZDX2NudF07CisgCQlwcmludGsoS0VSTl9JTkZPICJIRkMtRTEgY2FyZCBoYXMgYWx0ZXJuYXRpbmcgRC1jaGFubmVsIG9uICIKKyAJCQkidGltZSBzbG90ICVkXG4iLCBkc2xvdFtIRkNfY250XSk7CisgCX0gZWxzZQorLQkJaGMtPmRzbG90ID0gMTY7CisrCQloYy0+ZG51bVswXSA9IDE2OworKworKyN3YXJuaW5nIHRvZG8gSEFDSyEhISBqdXN0IGEgc21hbGwgbWFwIG9mIHR3byAiZnJhZ21lbnRzIgorKwlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CisrCQloYy0+ZG51bVswXSA9IDE7CisrCQloYy0+Ym1hc2tbMF0gPSAweDAwMDAwMDNjOworKwkJaGMtPmRudW1bMV0gPSA2OworKwkJaGMtPmJtYXNrWzFdID0gMHgwMDAwMDc4MDsKKysJCWhjLT5kbnVtWzJdID0gMTE7CisrCQloYy0+Ym1hc2tbMl0gPSAweDAwMDA3ODAwOworKwkJaGMtPnBvcnRzID0gMzsKKysJfQorIAorIAkvKiBzZXQgY2hpcCBzcGVjaWZpYyBmZWF0dXJlcyAqLworIAloYy0+bWFzdGVyY2xrID0gLTE7CitAQCAtNTEwMyw3ICs1MTM1LDcgQEAgaGZjbXVsdGlfaW5pdChzdHJ1Y3QgaG1fbWFwICptLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKyAJCQlnb3RvIGZyZWVfY2FyZDsKKyAJCX0KKyAJCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpCistCQkJcmV0X2VyciA9IGluaXRfZTFfcG9ydChoYywgbSk7CisrCQkJcmV0X2VyciA9IGluaXRfZTFfcG9ydChoYywgbSwgcHQpOworIAkJZWxzZQorIAkJCXJldF9lcnIgPSBpbml0X211bHRpX3BvcnQoaGMsIHB0KTsKKyAJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCitAQCAtNTExNSwxMCArNTE0NywxNCBAQCBoZmNtdWx0aV9pbml0KHN0cnVjdCBobV9tYXAgKm0sIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorIAkJaWYgKHJldF9lcnIpIHsKKyAJCQl3aGlsZSAocHQpIHsgLyogcmVsZWFzZSBhbHJlYWR5IHJlZ2lzdGVyZWQgcG9ydHMgKi8KKyAJCQkJcHQtLTsKKy0JCQkJcmVsZWFzZV9wb3J0KGhjLCBoYy0+Y2hhblsocHQgPDwgMikgKyAyXS5kY2gpOworKwkJCQlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKQorKwkJCQkJcmVsZWFzZV9wb3J0KGhjLCBoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmRjaCk7CisrCQkJCWVsc2UKKysJCQkJCXJlbGVhc2VfcG9ydChoYywgaGMtPmNoYW5bKHB0IDw8IDIpICsgMl0uZGNoKTsKKyAJCQl9CisgCQkJZ290byBmcmVlX2NhcmQ7CisgCQl9CisrI3dhcm5pbmcgdG9kbzogY291bnQgaXQgcmlnaHQsIGFkZCBhZGRpdGlvbmFsICJmcmFnbWVudCIgY291bnRlci4uLgorIAkJUG9ydF9jbnQrKzsKKyAJfQorIApkaWZmIC0tZ2l0IGEvb3BlbmJzYy8uZ2l0aWdub3JlIGIvb3BlbmJzYy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjgxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0OCBAQAorKi5vCisqLmEKKy5kZXBzCitNYWtlZmlsZQorTWFrZWZpbGUuaW4KK2JzY2NvbmZpZy5oCitic2Njb25maWcuaC5pbgorb3BlbmJzYy5wYworYnNjX2hhY2sKK2JzY19tc2NfaXAKK2JzY19tZ2NwCisqLip+CisqLnN3PworCisjY29uZmlndXJlCithY2xvY2FsLm00CithdXRvbTR0ZS5jYWNoZS8KK2NvbmZpZy5sb2cKK2NvbmZpZy5zdGF0dXMKK2NvbmZpZ3VyZQorZGVwY29tcAoraW5zdGFsbC1zaAorbWlzc2luZworc3RhbXAtaDEKKworIyBnaXQtdmVyc2lvbi1nZW4gbWFnaWMKKy50YXJiYWxsLXZlcnNpb24KKy52ZXJzaW9uCisKKworIyBhcHBzIGFuZCBhcHAgZGF0YQoraGxyLnNxbGl0ZTMKK2JzMTFfY29uZmlnCitpcGFjY2Vzcy1jb25maWcKK2lwYWNjZXNzLWZpbmQKK2lwYWNjZXNzLWZpcm13YXJlCitpcGFjY2Vzcy1wcm94eQoraXNkbnN5bmMKKworI3Rlc3RzCit0ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdAordGVzdHMvZGIvZGJfdGVzdAordGVzdHMvZGVidWcvZGVidWdfdGVzdAordGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QKK3Rlc3RzL3NjY3Avc2NjcF90ZXN0Cit0ZXN0cy9zbXMvc21zX3Rlc3QKK3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9BVVRIT1JTIGIvb3BlbmJzYy9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjYwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL0FVVEhPUlMKQEAgLTAsMCArMSw3IEBACitIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorSG9sZ2VyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KK0phbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KK1N0ZWZhbiBTY2htaWR0IDxzdGVmYW5AZGF0ZW5mcmVpaGFmZW4ub3JnPgorRGFuaWVsIFdpbGxtYW5uIDxkYW5pZWxAdG90YWx1ZWJlcndhY2h1bmcuZGU+CitBbmRyZWFzIEV2ZXJzYmVyZyA8QW5kcmVhcy5FdmVyc2JlcmdAdmVyc2F0ZWwuZGU+CitTeWx2YWluIE11bmF1dCA8MjQ2dG50QGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9vcGVuYnNjL0NPUFlJTkcKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBDT1BZSU5HCmNvcHkgdG8gb3BlbmJzYy9DT1BZSU5HCmRpZmYgLS1naXQgYS9vcGVuYnNjL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2UxMWNlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEzIEBACitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbiBkaXN0LWJ6aXAyIDEuNgorCitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorU1VCRElSUyA9IGluY2x1ZGUgc3JjIHRlc3RzCisKK3BrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKK3BrZ2NvbmZpZ19EQVRBID0gb3BlbmJzYy5wYyBsaWJzY2NwLnBjCisKK0JVSUxUX1NPVVJDRVMgPSAkKHRvcF9zcmNkaXIpLy52ZXJzaW9uCiskKHRvcF9zcmNkaXIpLy52ZXJzaW9uOgorCWVjaG8gJChWRVJTSU9OKSA+ICRALXQgJiYgbXYgJEAtdCAkQAorZGlzdC1ob29rOgorCWVjaG8gJChWRVJTSU9OKSA+ICQoZGlzdGRpcikvLnRhcmJhbGwtdmVyc2lvbgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9SRUFETUUgYi9vcGVuYnNjL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTgwN2JiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9SRUFETUUKQEAgLTAsMCArMSwzMCBAQAorQWJvdXQgT3BlbkJTQworPT09PT09PT09PT09PQorCitPcGVuQlNDIGlzIGEgbWluaW1hbGlzdGljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBHU00gTmV0d29yaywgd2l0aAorcGFydGljdWxhciBlbXBoYXNpcyBvbiB0aGUgZnVuY3Rpb25hbGl0eSB0eXBpY2FsbHkgcHJvdmlkZWQgYnkgdGhlIEJTQywKK01TQywgSExSLCBWTFIgYW5kIFNNU0MuCisKK0l0cyBjdXJyZW50bHkgc3VwcG9ydGVkIGludGVyZmFjZXMgdG93YXJkcyB0aGUgQlRTIGFyZToKKworICogQ2xhc3NpYyBBLWJpcyBvdmVyIEUxIHVzaW5nIGEgbUlTRE4gYmFzZWQgRTEgaW50ZXJmYWNlLiBJbiBvdGhlcgorICAgd29yZHMsIHlvdSBjYW4gY29ubmVjdCBleGlzdGluZyBHU00gQmFzZSBUcmFuc2NlaXZlciBTdGF0aW9uIChCVFMpCisgICB0aHJvdWdoIEUxIHRvIE9wZW5CU0MuICBTbyBmYXIsIHdlIGhhdmUgb25seSB0ZXN0ZWQgdGhlIFNpZW1lbnMgQlMtMTEKKyAgIFRlc3QgcmVwb3J0cyB3aXRoIG90aGVyIEJUUyBhcmUgbXVjaCBhcHByZWNpYXRlZCEKKworICogQS1iaXMgb3ZlciBJUCBhcyB1c2VkIGJ5IHRoZSBpcC5hY2Nlc3MgbmFub0JUUyBwcm9kdWN0IGZhbWlseQorCitUaGlzIHByb2plY3QgaXMgc3RpbGwgaW4gaXRzIGVhcmx5IGRheXMsIGFuZCB0aGVyZSBhcmUgbG90cyBvZiBhcmVhcyB3aGVyZSBpdAorZG9lc24ndCBiZWhhdmUgYXMgcGVyIEdTTSBzcGVjLgorCisJSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKworCitsaWJvc21vY29yZQorPT09PT09PT09PT0KKworUGxlYXNlIG5vdGUgdGhhdCBhcyBvZiBNYXJjaCAyMDEwLCBPcGVuQlNDIGhhcyBhIGRlcGVuZGVuY3kgdG8gYSBsaWJyYXJ5CitjYWxsZWQgImxpYm9zbW9jb3JlIi4gIFlvdSBjYW4gb2J0YWluIHRoYXQgbGlicmFyeSBmcm9tCisKKwlnaXQ6Ly9naXQub3Ntb2NvbS5vcmcvbGlib3Ntb2NvcmUuZ2l0CisKZGlmZiAtLWdpdCBhL29wZW5ic2MvY29uZmlndXJlLmluIGIvb3BlbmJzYy9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1ZTU5ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsNTcgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0CitBQ19JTklUKFtvcGVuYnNjXSwKKwltNF9lc3lzY21kKFsuL2dpdC12ZXJzaW9uLWdlbiAudGFyYmFsbC12ZXJzaW9uXSksCisJW29wZW5ic2MtZGV2ZWxAbGlzdHMub3BlbmJzYy5vcmddKQorCitBTV9JTklUX0FVVE9NQUtFKFtkaXN0LWJ6aXAyXSkKKworZG5sIGtlcm5lbCBzdHlsZSBjb21waWxlIG1lc3NhZ2VzCittNF9pZmRlZihbQU1fU0lMRU5UX1JVTEVTXSwgW0FNX1NJTEVOVF9SVUxFUyhbeWVzXSldKQorCitkbmwgY2hlY2tzIGZvciBwcm9ncmFtcworQUNfUFJPR19NQUtFX1NFVAorQUNfUFJPR19DQworQUNfUFJPR19JTlNUQUxMCitBQ19QUk9HX1JBTkxJQgorCitkbmwgY2hlY2tzIGZvciBsaWJyYXJpZXMKK0FDX1NFQVJDSF9MSUJTKGNyeXB0LCBjcnlwdCwKKyAgICBbTElCQ1JZUFQ9Ii1sY3J5cHQiOyBBQ19ERUZJTkUoW1ZUWV9DUllQVF9QV10sIFtdLCBbVXNlIGNyeXB0IGZ1bmN0aW9uYWxpdHkgb2YgdnR5Ll0pXSkKKworUEtHX0NIRUNLX01PRFVMRVMoTElCT1NNT0NPUkUsIGxpYm9zbW9jb3JlID49IDAuMS4zKQorCitkbmwgY2hlY2tzIGZvciBoZWFkZXIgZmlsZXMKK0FDX0hFQURFUl9TVERDCisKK2RubCBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3MKKworIyBUaGUgZm9sbG93aW5nIHRlc3QgaXMgdGFrZW4gZnJvbSBXZWJLaXQncyB3ZWJraXQubTQKK3NhdmVkX0NGTEFHUz0iJENGTEFHUyIKK0NGTEFHUz0iJENGTEFHUyAtZnZpc2liaWxpdHk9aGlkZGVuICIKK0FDX01TR19DSEVDS0lORyhbaWYgJHtDQ30gc3VwcG9ydHMgLWZ2aXNpYmlsaXR5PWhpZGRlbl0pCitBQ19DT01QSUxFX0lGRUxTRShbY2hhciBmb287XSwKKyAgICAgIFsgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgU1lNQk9MX1ZJU0lCSUxJVFk9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iXSwKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKSkKK0NGTEFHUz0iJHNhdmVkX0NGTEFHUyIKK0FDX1NVQlNUKFNZTUJPTF9WSVNJQklMSVRZKQorCisKK2RubCBHZW5lcmF0ZSB0aGUgb3V0cHV0CitBTV9DT05GSUdfSEVBREVSKGJzY2NvbmZpZy5oKQorCitBQ19PVVRQVVQoCisgICAgb3BlbmJzYy5wYworICAgIGxpYnNjY3AucGMKKyAgICBpbmNsdWRlL29wZW5ic2MvTWFrZWZpbGUKKyAgICBpbmNsdWRlL3Z0eS9NYWtlZmlsZQorICAgIGluY2x1ZGUvc2NjcC9NYWtlZmlsZQorICAgIGluY2x1ZGUvTWFrZWZpbGUKKyAgICBzcmMvTWFrZWZpbGUKKyAgICB0ZXN0cy9NYWtlZmlsZQorICAgIHRlc3RzL2RlYnVnL01ha2VmaWxlCisgICAgdGVzdHMvZ3NtMDQwOC9NYWtlZmlsZQorICAgIHRlc3RzL2RiL01ha2VmaWxlCisgICAgdGVzdHMvY2hhbm5lbC9NYWtlZmlsZQorICAgIHRlc3RzL3NjY3AvTWFrZWZpbGUKKyAgICBNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL29wZW5ic2MvY29udHJpYi9idC5weSBiL29wZW5ic2MvY29udHJpYi9idC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYjExMWVmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9jb250cmliL2J0LnB5CkBAIC0wLDAgKzEsMzMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgb3MKKworZiA9IG9wZW4oInVuYmFsYW5jZWQiKQorbGluZXMgPSBbXQorZm9yIGxpbmUgaW4gZjoKKyAgICBsaW5lcy5hcHBlbmQobGluZSkKKworZmlsZW5hbWVzID0ge30KKworb3V0cHV0ID0gW10KK2ZvciBsaW5lIGluIGxpbmVzOgorICAgIGlmICJbMHgiIGluIGxpbmU6CisgICAgICAgIHN0YXJ0ID0gbGluZS5maW5kKCJbIikKKyAgICAgICAgZW5kID0gbGluZS5maW5kKCJdIikKKyAgICAgICAgYWRkciA9IGxpbmVbc3RhcnQrMTplbmRdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGUgPSBmaWxlbmFtZXNbYWRkcl0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgciA9IG9zLnBvcGVuKCJhZGRyMmxpbmUgLWZzIC1lIC4vYnNjX2hhY2sgJXMiICUgYWRkcikKKyAgICAgICAgICAgIGFsbCA9IHIucmVhZCgpLnJlcGxhY2UoIlxuIiwgIiwiKQorICAgICAgICAgICAgZmlsZSA9IGFsbAorICAgICAgICAgICAgZmlsZW5hbWVzW2FkZHJdID0gZmlsZQorCisgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoYWRkciwgZmlsZSkKKyAgICBvdXRwdXQuYXBwZW5kKGxpbmUpCisKK2cgPSBvcGVuKCJ1bmJhbGFuY2VkLjIiLCAidyIpCitnLndyaXRlKCIiLmpvaW4ob3V0cHV0KSkKKworCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvY29udHJpYi9jb252ZXJ0X3RvX2VudW0ucHkgYi9vcGVuYnNjL2NvbnRyaWIvY29udmVydF90b19lbnVtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjZDZmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2NvbnRyaWIvY29udmVydF90b19lbnVtLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjCisjIENvbnZlcnQgRVRTSSBkb2N1bWVudHMgdG8gYW4gZW51bQorIworCitpbXBvcnQgcmUsIHN5cworCitkZWYgY29udmVydChzdHJpbmcpOgorICAgIHN0cmluZyA9IHN0cmluZy5zdHJpcCgpLnJlcGxhY2UoIiAiLCAiIikucmp1c3QoOCwgIjAiKQorICAgIHZhciA9IDAKKyAgICBvZmZzZXQgPSA3CisgICAgZm9yIGNoYXIgaW4gc3RyaW5nOgorICAgICAgICBhc3NlcnQgb2Zmc2V0ID49IDAKKyAgICAgICAgdmFyID0gdmFyIHwgKGludChjaGFyKSA8PCBvZmZzZXQpCisgICAgICAgIG9mZnNldCA9IG9mZnNldCAtIDEKKworICAgIHJldHVybiB2YXIKKworZGVmIHN0cmluZyhuYW1lKToKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCIgIiwgIl8iKQorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJyInLCAiIikKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcvJywgJ18nKQorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJygnLCAnXycpCisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnKScsICdfJykKKyAgICByZXR1cm4gIiVzXyVzIiAlIChzeXMuYXJndlsyXSwgbmFtZS51cHBlcigpKQorCitmaWxlID0gb3BlbihzeXMuYXJndlsxXSkKKworCitmb3IgbGluZSBpbiBmaWxlOgorICAgIG0gPSByZS5tYXRjaChyIlsgXHRdKig/UDx2YWx1ZT5bMDEgXSspWyBdKyg/UDxuYW1lPlthLXpBLVogLzAtOSgpXSspIiwgbGluZVs6LTFdKQorCisgICAgaWYgbToKKyAgICAgICAgcHJpbnQgIlx0JXNcdFx0PSAlZCwiICUgKHN0cmluZyhtLmdyb3VwZGljdCgpWyJuYW1lIl0pLCBjb252ZXJ0KG0uZ3JvdXBkaWN0KClbInZhbHVlIl0pKQorICAgIGVsc2U6CisgICAgICAgIHByaW50IGxpbmVbOi0xXQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb250cmliL21nY3Bfc2VydmVyLnB5IGIvb3BlbmJzYy9jb250cmliL21nY3Bfc2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1YzQ4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2NvbnRyaWIvbWdjcF9zZXJ2ZXIucHkKQEAgLTAsMCArMSw2MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIFNpbXBsZSBzZXJ2ZXIgZm9yIG1nY3AuLi4gc2VuZCBhdWRpdCwgcmVjZWl2ZSByZXNwb25zZS4uCisKK2ltcG9ydCBzb2NrZXQsIHRpbWUKKworTUdDUF9HQVRFV0FZX1BPUlQgPSAyNDI3CitNR0NQX0NBTExBR0VOVF9QT1JUID0gMjcyNworCityc2lwX3Jlc3AgPSAiIiIyMDAgMzIxMzIxMzMyXHJcbiIiIgorYXVkaXRfcGFja2V0ID0gIiIiQVVFUCAlZCAxM0BtZ3cgTUdDUCAxLjBcclxuIiIiCitjcmN4X3BhY2tldCA9ICIiIkNSQ1ggJWQgMTRAbWd3IE1HQ1AgMS4wXHJcbkM6IDRhODRhZDVkMjVmXHJcbkw6IHA6MjAsIGE6R1NNLUVGUiwgbnQ6SU5cclxuTTogcmVjdm9ubHlcclxuIiIiCitkbGN4X3BhY2tldCA9ICIiIkRMQ1ggJWQgMTRAbWd3IE1HQ1AgMS4wXHJcbkM6IDRhODRhZDVkMjVmXHJcbkk6ICVkXHJcbiIiIgorbWRjeF9wYWNrZXQgPSAiIiJNRENYICVkIDE0QG1ndyBNR0NQIDEuMFxyXG5DOiA0YTg0YWQ1ZDI1ZlxyXG5JOiAlZFxyXG5MOiBwOjIwLCBhOkdTTS1FRlIsIG50OklOXHJcbk06IHJlY3Zvbmx5XHJcblxyXG52PTBcclxubz0tIDI1ODY5NjQ3NyAwIElOIElQNCAxNzIuMTYuMS4xMDdcclxucz0tXHJcbmM9SU4gSVA0IDE3Mi4xNi4xLjEwN1xyXG50PTAgMFxyXG5tPWF1ZGlvIDY2NjYgUlRQL0FWUCAxMjdcclxuYT1ydHBtYXA6MTI3IEdTTS1FRlIvODAwMC8xXHJcbmE9cHRpbWU6MjBcclxuYT1yZWN2b25seVxyXG5tPWltYWdlIDQ0MDIgdWRwdGwgdDM4XHJcbmE9VDM4RmF4VmVyc2lvbjowXHJcbmE9VDM4TWF4Qml0UmF0ZToxNDQwMFxyXG4iIiIKKworZGVmIGhleGR1bXAoc3JjLCBsZW5ndGg9OCk6CisgICAgIiIiUmVjaXBlIGlzIGZyb20gaHR0cDovL2NvZGUuYWN0aXZlc3RhdGUuY29tL3JlY2lwZXMvMTQyODEyLyIiIgorICAgIHJlc3VsdCA9IFtdCisgICAgZGlnaXRzID0gNCBpZiBpc2luc3RhbmNlKHNyYywgdW5pY29kZSkgZWxzZSAyCisgICAgZm9yIGkgaW4geHJhbmdlKDAsIGxlbihzcmMpLCBsZW5ndGgpOgorICAgICAgIHMgPSBzcmNbaTppK2xlbmd0aF0KKyAgICAgICBoZXhhID0gYicgJy5qb2luKFsiJTAqWCIgJSAoZGlnaXRzLCBvcmQoeCkpICBmb3IgeCBpbiBzXSkKKyAgICAgICB0ZXh0ID0gYicnLmpvaW4oW3ggaWYgMHgyMCA8PSBvcmQoeCkgPCAweDdGIGVsc2UgYicuJyAgZm9yIHggaW4gc10pCisgICAgICAgcmVzdWx0LmFwcGVuZCggYiIlMDRYICAgJS0qcyAgICVzIiAlIChpLCBsZW5ndGgqKGRpZ2l0cyArIDEpLCBoZXhhLCB0ZXh0KSApCisgICAgcmV0dXJuIGInXG4nLmpvaW4ocmVzdWx0KQorCitzZXJ2ZXJfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCitzZXJ2ZXJfc29ja2V0LmJpbmQoKCIxMjcuMC4wLjEiLCBNR0NQX0NBTExBR0VOVF9QT1JUKSkKK3NlcnZlcl9zb2NrZXQuc2V0YmxvY2tpbmcoMSkKKworbGFzdF9jaSA9IDEKK2RlZiBzZW5kX2FuZF9yZWNlaXZlKHBhY2tldCk6CisgICAgZ2xvYmFsIGxhc3RfY2kKKyAgICBzZXJ2ZXJfc29ja2V0LnNlbmR0byhwYWNrZXQsICgiMTI3LjAuMC4xIiwgTUdDUF9HQVRFV0FZX1BPUlQpKQorICAgIHRyeToKKyAgICAgICAgZGF0YSwgYWRkciA9IHNlcnZlcl9zb2NrZXQucmVjdmZyb20oNDA5NikKKworICAgICAgICAjIGF0dGVtcHQgdG8gc3RvcmUgdGhlIENJIG9mIHRoZSByZXNwb25zZQorICAgICAgICBsaXN0ID0gZGF0YS5zcGxpdCgiXG4iKQorICAgICAgICBmb3IgaXRlbSBpbiBsaXN0OgorICAgICAgICAgICBpZiBpdGVtLnN0YXJ0c3dpdGgoIkk6ICIpOgorICAgICAgICAgICAgICAgbGFzdF9jaSA9IGludChpdGVtWzM6XSkKKworICAgICAgICBwcmludCBoZXhkdW1wKGRhdGEpLCBhZGRyCisgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKKyAgICAgICAgcHJpbnQgZQorICAgICAgICBwYXNzCisKK2RlZiBnZW5lcmF0ZV90aWQoKToKKyAgICBpbXBvcnQgcmFuZG9tCisgICAgcmV0dXJuIHJhbmRvbS5yYW5kaW50KDAsIDY1MTIzKQorCisKKword2hpbGUgVHJ1ZToKKyAgICBzZW5kX2FuZF9yZWNlaXZlKGF1ZGl0X3BhY2tldCAlIGdlbmVyYXRlX3RpZCgpKQorICAgIHNlbmRfYW5kX3JlY2VpdmUoY3JjeF9wYWNrZXQgJSBnZW5lcmF0ZV90aWQoKSApCisgICAgc2VuZF9hbmRfcmVjZWl2ZShtZGN4X3BhY2tldCAlIChnZW5lcmF0ZV90aWQoKSwgbGFzdF9jaSkpCisgICAgc2VuZF9hbmRfcmVjZWl2ZShkbGN4X3BhY2tldCAlIChnZW5lcmF0ZV90aWQoKSwgbGFzdF9jaSkpCisKKyAgICB0aW1lLnNsZWVwKDMpCmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9CUzExLU9NTC50eHQgYi9vcGVuYnNjL2RvYy9CUzExLU9NTC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjMzI5OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL0JTMTEtT01MLnR4dApAQCAtMCwwICsxLDMxIEBACitUaGUgU2llbWVucyBCUy0xMSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgR1NNIDEyLjIxIE9NTCBvcGVyYXRpb25zOgorCisKK0NSRUFURSBPQkpFQ1QKKworYWJpc19vbV9mb21faGRyLm9ial9jbGFzcyBjYW4gYmUgCitBMzoKK0E1OiBBTENPLCBCQlNJRywgQ0NMSywgR1BTVSwgTEksIFBBCitBODogRW52YUJUU0UKK0E5OiBCUE9SVAorCit0aGUgYWJpc19vbV9vYmpfaW5zdC50cnhfbnIgZmllbGQgaW5kaWNhdGVzIHRoZSBpbmRleCBvZiBvYmplY3QsIHdoZXJlYXMgdGhlCithYmlzX29tX2ZvbV9oZHIuYnRzX25yIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCitlbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHsKKwlCUzExX09CSl9BTENPCQk9IDB4MDEsCisJQlMxMV9PQkpfQkJTSUcJCT0gMHgwMiwJLyogb2JqX2NsYXNzOiAwLDEgKi8KKwlCUzExX09CSl9UUlgxCQk9IDB4MDMsCS8qIG9ubHkgREVBQ1RJVkFURSBUUlgxICovCisJQlMxMV9PQkpfQ0NMSwkJPSAweDA0LAorCUJTMTFfT0JKX0dQU1UJCT0gMHgwNiwKKwlCUzExX09CSl9MSQkJPSAweDA3LAorCUJTMTFfT0JKX1BBCQk9IDB4MDksCS8qIG9ial9jbGFzczogMCwgMSovCit9OworCitJbiBjYXNlIG9mIENSRUFURSBFTlZBQlRTRSwgdGhlIGFiaXNfb21fb2JqX2luc3QudHJ4X25yIGluZGljYXRlcyB0aGUgRW52YUJUU0V4CitudW1iZXIuCisKK0luIGNhc2Ugb2YgQTkgKENSRUFFVEUgQlBPUlQpLCB0aGUgYWJpc19vbV9vYmpfaW5zdC5idHNfbnIgaW5kaWNhdGVzIHdoaWNoIEJQT1JUCitzaGFsbCBiZSB1c2VkLgorCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL2NhbGwtcm91dGluZy50eHQgYi9vcGVuYnNjL2RvYy9jYWxsLXJvdXRpbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDJmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9jYWxsLXJvdXRpbmcudHh0CkBAIC0wLDAgKzEsMjUgQEAKK0NhbGwgcm91dGluZyBpbiBPcGVuQlNDCisKK0Zsb3cgb2YgZXZlbnRzOgorCisgIyBNTyBjYWxsIGluaXRpYXRlZCBieSBNUywgQ0hBTk5FTCBSUUQsIElNTUVESUFURSBBU1NJR04KKyAjIE1TIHNlbmRzIENDIFNFVFVQIG1lc3NhZ2UsIHdlIGFzc3VtZSBhbHJlYWR5IG9uIFRDSC9IIEZBQ0NICisgIyBPcGVuQlNDIGRvZXMgYSBzdWJzY3JpYmVyIGxvb2t1cCBiYXNlZCBvbiB0aGUgdGFyZ2V0IGV4dGVuc2lvbgorICAqIElmIGEgc3Vic2NyaWJlciBpcyBmb3VuZDoKKyAgICMgc2VuZCBDQUxMIFBST0NFRURJTkcgbWVzc2FnZSB0byBNTworICAgIyBwYWdlIHRoZSBNVCBzdWJzY3JpYmVyIGFuZCBhc2sgaXRJIHRvIGFzayBmb3IgVENIL0gKKyAgICMgb25jZSBwYWdpbmcgY29tcGxldGVzLCB3ZSBoYXZlIHRoZSBUQ0gvSCBmb3IgdGhlIE1UIGVuZAorICAgIyBzZW5kIFNFVFVQIHRvIE1UCisgICAjIHJlY2VpdmUgQ0FMTCBDT05GSVJNRUQgZnJvbSBNVAorICAgIyBzZXQtdXAgdGhlIFRSQVUgbXV4IG1hcHBpbmcgYmV0d2VlbiB0aGUgRTEgc3Vic2xvdHMgZm9yIGJvdGggVENIL0gKKyAgICMgcmVjZWl2ZSBBTEVSVElORyBmcm9tIE1ULCByb3V0ZSBBTEVSVElORyB0byBNTworICAgIyByZWNlaXZlIENPTk5FQ1QgZnJvbSBNVCwgY29uZmlybSB0byBNVCB3aXRoIENPTk5FQ1RfQUNLCisgICAjIHNlbmQgYSBDT05ORUNUIG1lc3NhZ2UgdG8gTU8sIHJlY2VpdmUgQ09OTkVDVF9BQ0sgZnJvbSBNTworICogSWYgc3Vic2NyaWJlciBpcyBub3QgZm91bmQ6CisgICMgc2VuZCBSRUxFQVNFIENPTVBMRVRFIHdpdGggYXByb3ByaWF0ZSBjYXVzZSB0byBNTyAoMTogdW5hbGxvYWNhdGVkIDM6IG5vIHJvdXRlKQorICAKKworCitUaG91Z2h0cyBhYm91dCBSUi9NTToKKworKiB3ZSBhbGxvY2F0ZSBSUi9NTSBlbnRpdGllcyBvbiBkZW1hbmQsIHdoZW4gd2UgbmVlZCB0aGVtCmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9jaGFubmVsX3JlbGVhc2UudHh0IGIvb3BlbmJzYy9kb2MvY2hhbm5lbF9yZWxlYXNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWNmMDljCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvY2hhbm5lbF9yZWxlYXNlLnR4dApAQCAtMCwwICsxLDc0IEBACisKK0dTTSAwNC4wOCA3LjEuNyAvIDkuMS43CQlSUiBDSEFOTkVMIFJFTEVTRQorCitSU0wgMDguNTggMy40IC8gPwkJUkxMIExpbmsgUmVsZWFzZSBSZXF1ZXN0CisKK1JTTCAwOC41OCA0LjYgLyA4LjQuNQkJREVBQ1RpdmF0ZSBTQUNDSAorCSogRGVhY3RpdmF0ZSBTQUNDSCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBSZWxlYXNlIFByb2MgMDQuMDgKKwkqIHRvIGJlIHNlbnQgYWZ0ZXIgUlIgQ0hBTk5FTCBSRUxFQVNFIGlzIHNlbnQgdG8gTVMKKworUlNMIDA4LjU4IDQuNyAvIDguNC4xNAkJUkYgQ0hBTm5lbCBSRUxlYXNlCisJKiB0ZWxscyB0aGUgQlRTIHRvIHJlbGVhc2UgYSByYWRpbyBjaGFubmVsCisJKiAid2hlbiBhbiBhY3RpdmF0ZWQgcmFkaW8gY2hhbm5lbCBpcyBubyBsb25nZXIgbmVlZGVkIgorCSogQlRTIHJlc3BvbmRzIHdpdGggUkYgQ0hBTm5lbCBSRUxlYXNlIEFDS25vd2xlZGdlCisKKworR1NNIDA0LjA4IDMuNC4xMzogUlIgY29ubmVjdGlvbiByZWxlYXNlIHByb2NlZHVyZQorCisqIG5ldHdvcmsgc2VuZHMgUlIgQ0hBTk5FTCBSRUxFQVNFIHRvIE1TIG9uIHRoZSBEQ0NICisgICogc3RhcnQgVDMxMDkKKyAgKiBkZWFjdGl2YXRlIFNBQ0NICisqIE1TIGRpc2Nvbm5lY3RzIG1haW4gc2lnbmFsbGluZyBsaW5rIChieSBzZW5kaW5nIERJU0MpCisgICogYWxsIG90aGVyIGRhdGEgbGlua3MgYXJlIGRpc2Nvbm5lY3RlZCBieSBsb2NhbCBlbmQgbGluayByZWxlYXNlCisqIG5ldHdvcmsgcmVjZWl2ZXMgRElTQyAoQlRTIHNlbmRzIFJMTCBSRUwgSU5EIHRvIEJTQykKKyAgKiBzdG9wIFQzMTA5CisgICogc3RhcnQgVDMxMTEgCisqIHdoZW4gVDMxMTEgdGltZXMgb3V0LCB0aGUgbmV0d29yayBjYW4gcmV1c2UgdGhlIGNoYW5ubHMKKyogaWYgVDMxMDkgdGltZXMgb3V0LCB0aGUgbmV0d29yayBkZWFjdGl2YXRlcyB0aGUgY2hhbm5lbHMgCisgIGFuZCBjYW4gcmV1c2UgdGhlbQorICAqIHRoaXMgcHJvYmFibHkgbWVhbnMgc2ltcGx5IFJGIENIQU5uZWwgUkVMZWFzZQorCisKKz09IEltcGxlbWVudGF0aW9uIGluIE9wZW5CU0MgPT0KKworY2hhbl9hbGxvYy5jOmxjaGFuX2F1dG9fcmVsZWFzZSgpCisJKiBjaGVja3MgaWYgdXNlIGNvdW50IHN0aWxsID4gMCAoYWJvcnQpCisJKiBjYWxscyBnc200OF9zZW5kX3JyX3JlbGVhc2UoKQorCQkqIHdoaWNoIGNhbGxzIHJzbF9kZWFjdF9zYWNjaCgpCisJKiBjYWxscyByc2xfcmVsZWFzZV9yZXF1ZXN0KCkKKwkJKiB3aGljaCBzZW5kcyBSTEwgTGluayBSZWxlYXNlIHJlcXVlc3QKKwkKK1JYIG9mIFJFTGVhc2UgSU5EaWNhdGlvbjoKKwkqIGNhbGwgcnNsX3JmX2NoYW5fcmVsZWFzZSgpIChzZW5kIFJGX0NIQU5fUkVMKQorCitSWCBvZiBSRUxlYXNlIENPTkZpbWVtOgorCSogY2FsbCByc2xfcmZfY2hhbl9yZWxlYXNlKCkgKHNlbmQgUkZfQ0hBTl9SRUwpCisKKyogUlggb2YgUkZfQ0hBTl9SRUxfQUNLCisJKiBjYWxsIGxjaGFuX2ZyZWUoKQorCQkqIHN1YnNjcl9wdXQoKQorCQkqIGRlbGV0ZSByZWxlYXNlX3RpbWVyCisKKworPT09IEludGVncmF0aW9uIHdpdGggU01TID09PQorCisqIFJYIG9mIENQX0VSUk9SIG9yIHVuaW1wbGVtZW50ZWQgTVQKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKworKiBDUCBUQzEqIGV4cGlyZWQgd2hpbGUgd2FpdGluZyBmb3IgQ1AtQUNLCisJKiB0cmlnZ2VyIHRyYW5zX2ZyZWUoKSB3aGljaCB3aWxsIGxjaGFuX2F1dG9fcmVsZWFzZSgpCisKKyogUlggb2YgUlBfRVJST1IKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKwkKKyogVFggb2YgQ1AtQUNLIGluIE1UIERFTElWRVIKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKworKiBSWCBvZiBDUC1BQ0sgaW4gTU8gU1VCTUlUCisJKiB0cmlnZ2VyIHRyYW5zX2ZyZWUoKSB3aGljaCB3aWxsIGxjaGFuX2F1dG9fcmVsZWFzZSgpCisJCisqIFJYIG9mIFJQLUFDSyBpbiBNVCBERUxJVkVSIChhbmQgbm8gbW9yZSBtZXNzYWdlcykKKwkqIHRyaWdnZXIgcnNsX3JlbGVhc2VfcmVxdWVzdCgpIGZvciBTQVBJMworCisqIFJYIG9mIFJQLVNNTUEgaW4gTVQgREVMSVZFUiAoYW5kIG5vIG1vcmUgbWVzc2FnZXMpCisJKiB0cmlnZ2VyIHJzbF9yZWxlYXNlX3JlcXVlc3QoKSBmb3IgU0FQSTMKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL2UxLWRhdGEtbW9kZWwudHh0IGIvb3BlbmJzYy9kb2MvZTEtZGF0YS1tb2RlbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5NGZlNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2UxLWRhdGEtbW9kZWwudHh0CkBAIC0wLDAgKzEsMTcyIEBACitFMSByZWxhdGVkIGRhdGEgbW9kZWwKKworVGhpcyBkYXRhIG1vZGVsIGRlc2NyaWJlcyB0aGUgcGh5c2ljYWwgcmVsYXRpb25zaGlwIG9mIHRoZSBpbmRpdmlkdWFsCitwYXJ0cyBpbiB0aGUgbmV0d29yaywgaXQgaXMgbm90IHRoZSBsb2dpY2FsL3Byb3RvY29sIHNpZGUgb2YgdGhlIEdTTQorbmV0d29yay4KKworQSBCVFMgaXMgY29ubmVjdGVkIHRvIHRoZSBCU0MgYnkgc29tZSBwaHlzaWNhbCBsaW5rLiAgSXQgY291bGQgYmUgYW4gYWN0dWFsCitFMSBsaW5rLCBidXQgaXQgY291bGQgYWxzbyBiZSBhYmlzLW92ZXItSVAgd2l0aCBhIG1peHR1cmUgb2YgVENQIGFuZCBSVFAvVURQLgorCitUbyBmdXJ0aGVyIGNvbXBsaWNhdGUgdGhlIGZhY3QsIG11bHRpcGxlIEJUUyBjYW4gc2hhcmUgb25lIHN1Y2ggcHlzaWNhbAorbGluay4gIE9uIGEgc2luZ2xlIEUxIGxpbmUsIHdlIGNhbiBlYXNpbHkgYWNjb21vZGF0ZSB1cCB0byB0aHJlZSBCVFMgd2l0aAordHdvIFRSWCBlYWNoLgorCitUaHVzLCBpdCBpcyBiZXN0IGZvciBPcGVuQlNDIHRvIGhhdmUgc29tZSBraW5kIG9mIGFic3RyYWN0aW9uIGxheWVyLiAgVGhlIEJTQydzCit2aWV3IG9mIGEgQlRTIGNvbm5lY3RlZCB0byBpdC4gIFdlIGNhbGwgdGhpcyAnYnRzX2xpbmsnLiAgQSBidHNfbGluayBjYW4gYmUKKyogYWxsIHRoZSBUQ1AgYW5kIFVEUCBzdHJlYW1zIG9mIGEgQWJpcy1vdmVyLUlQIEJUUworKiBhIHNldCBvZiBFMSB0aW1lc2xvdHMgZm9yIE9NTCwgUlNMIGFuZCBUUkFVIGNvbm5lY3Rpb25zIG9uIGEgRTEgbGluaworKiBhIHNlcmlhbCBsaW5lIGV4Y2x1c2l2ZWx5IHVzZWQgZm9yIE9NTCBtZXNzYWdlcyAoVC1MaW5rKQorCitBIGJ0c19saW5rIGNhbiBiZSByZWdpc3RlcmVkIHdpdGggdGhlIE9wZW5CU0MgY29yZSBhdCBydW50aW1lLgorCitzdHJ1Y3QgdHJ4X2xpbmsgeworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworfTsKKworc3RydWN0IGJ0c19saW5rIHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCB0cnhfbGluayB0cnhfbGlua3NbTlVNX1RSWF07Cit9OworCitJbnRlcmZhY2UgZnJvbSBzdGFjayB0byBpbnB1dCBjb3JlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoraW50IGFiaXNfcnNsX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZyk7CisJc2VuZCBhIG1lc3NhZ2UgdGhyb3VnaCBhIFJTTCBsaW5rIHRvIHRoZSBUUlggc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIgaW4KKwltc2ctPnRyeC4KKworaW50IGFiaXNfcnNsX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlyZWNlaXZlIGEgbWVzc2FnZSBmcm9tIGEgUlNMIGxpbmsgZnJvbSB0aGUgVFJYIHNwZWNpZmllZCBieSB0aGUKKwljYWxsZXIgaW4gbXNnLT50cnguCisKK2ludCBhYmlzX25tX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZyk7CisJc2VuZCBhIG1lc3NhZ2UgdGhyb3VnaCBhIE9NTCBsaW5rIHRvIHRoZSBCVFMgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIgaW4KKwltc2ctPnRyeC0+YnRzLiAgVGhlIGNhbGxlciBjYW4ganVzdCB1c2UgYnRzLT5jMCB0byBnZXQgdGhlIGZpcnN0IFRSWAorCWluIGEgQlRTLiAoT01MIG1lc3NhZ2VzIGFyZSBub3QgcmVhbGx5IHNlbnQgdG8gYSBUUlggYnV0IHRvIHRoZSBCVFMpCisKK2ludCBhYmlzX25tX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlyZWNlaXZlIGEgbWVzc2FnZSBmcm9tIGEgT01MIGxpbmsgZnJvbSB0aGUgQlRTIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyCisJaW4gbXNnLT50cngtPmJ0cy4gIFRoZSBjYWxsZXIgY2FuIGp1c3QgdXNlIGJ0cy0+YzAgdG8gZ2V0IHRoZSBmaXJzdAorCVRSWCBpbiBhIEJUUy4KKworaW50IGFiaXNfbGlua19ldmVudChpbnQgZXZlbnQsIHZvaWQgKmRhdGEpOworCXNpZ25hbCBzb21lIGV2ZW50IChzdWNoIGFzIGxheWVyIDEgY29ubmVjdC9kaXNjb25uZWN0KSBmcm9tIHRoZQorCWlucHV0IGNvcmUgdG8gdGhlIHN0YWNrLgorCitpbnQgc3ViY2hfZGVtdXhfaW4obXgsIGNvbnN0IHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKKwlyZWNlaXZlICdsZW4nIGJ5dGVzIGZyb20gYSBnaXZlbiBFMSB0aW1lc2xvdCAoVFJBVSBmcmFtZXMpCisKK2ludCBzdWJjaGFuX211eF9vdXQobXgsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKKwlvYnRhaW4gJ2xlbicgYnl0ZXMgb2Ygb3V0cHV0IGRhdGEgdG8gYmUgc2VudCBvbiBFMSB0aW1lc2xvdAorCitJbnRyZmFjZSBieSBJbnB1dCBDb3JlIGZvciBJbnB1dCBQbHVnaW5zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2ludCBidHNsaW5rX3JlZ2lzdGVyX3BsdWdpbigpOworCisKK0NvbmZpZ3VyYXRpb24gZm9yIHRoZSBFMSBpbnB1dCBtb2R1bGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQlRTCisJQlRTIG51bWJlcgorCW51bWJlciBvZiBUUlgKKwlPTUwgbGluaworCQlFMSBsaW5lIG51bWJlcgorCQl0aW1lc2xvdCBudW1iZXIKKwkJW3N1YnNsb3QgbnVtYmVyXQorCQlTQVBJCisJCVRFSQorCWZvciBlYWNoIFRSWAorCQlSU0wgbGluaworCQkJRTEgbGluZSBudW1iZXIKKwkJCXRpbWVzbG90IG51bWJlcgorCQkJW3N1YnNsb3QgbnVtYmVyXQorCQkJU0FQSQorCQkJVEVJCisJCWZvciBlYWNoIFRTCisJCQlFMSBsaW5lIG51bWJlcgorCQkJdGltZXNsb3QgbnVtYmVyCisJCQlzdWJzbG90IG51bWJlcgorCisKK0UxIGlucHV0IG1vZHVsZSBkYXRhIG1vZGVsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworZW51bSBlMWlucF9zaWduX3R5cGUgeworCUUxSU5QX1NJR05fTk9ORSwKKwlFMUlOUF9TSUdOX09NTCwKKwlFMUlOUF9TSUdOX1JTTCwKK307CisKK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgeworCS8qIGxpc3Qgb2Ygc2lnbmFsbGluZyBsaW5rcyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwllbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlOworCisJLyogdHJ4IGZvciBtc2ctPnRyeCBvZiByZWNlaXZlZCBtc2dzICovCQorCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJLyogbXNnYiBxdWV1ZSBvZiB0by1iZS10cmFuc21pdHRlZCBtc2dzICovCisJc3RydWN0IGxsaXN0X2hlYWQgdHhfbGlzdDsKKworCS8qIFNBUEkgYW5kIFRFSSBvbiB0aGUgRTEgVFMgKi8KKwl1X2ludDhfdCBzYXBpOworCXVfaW50OF90IHRlaTsKK30KKworZW51bSBlMWlucF90c190eXBlIHsKKwlFMUlOUF9UU19UWVBFX05PTkUsCisJRTFJTlBfVFNfVFlQRV9TSUdOLAorCUUxSU5QX1RTX1RZUEVfVFJBVSwKK307CisKKy8qIEEgdGltZXNsb3QgaW4gdGhlIEUxIGludGVyZmFjZSAqLworc3RydWN0IGUxaW5wX3RzIHsKKwllbnVtIGUxaW5wX3RzX3R5cGUgdHlwZTsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgbGxpc3RfaGVhZCBzaWduX2xpbmtzOworCQl9IHNpZ247CisJCXN0cnVjdCB7CisJCQkvKiBzdWJjaGFubmVsIGRlbXV4ZXIgZm9yIGZyYW1lcyBmcm9tIEUxICovCisJCQlzdHJ1Y3Qgc3ViY2hfZGVtdXggZGVtdXg7CisJCQkvKiBzdWJjaGFubmVsIG11eGVyIGZvciBmcmFtZXMgdG8gRTEgKi8KKwkJCXN0cnVjdCBzdWJjaF9tdXggbXV4OworCQl9IHRyYXU7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKiBtSVNETiBkcml2ZXIgaGFzIG9uZSBmZCBmb3IgZWFjaCB0cyAqLworCQkJc3RydWN0IGJzY19mZDsKKwkJfSBtaXNkbjsKKwl9IGRyaXZlcjsKK307CisKK3N0cnVjdCBlMWlucF9saW5lIHsKKwl1bnNpZ25lZCBpbnQgbnVtOworCWNoYXIgKm5hbWU7CisKKwlzdHJ1Y3QgZTFpbnBfdHMgdHNbTlJfRTFfVFNdOworCisJY2hhciAqZTFpbnBfZHJpdmVyOworCXZvaWQgKmRyaXZlcl9kYXRhOworfTsKKworLyogQ2FsbCBmcm9tIHRoZSBTdGFjazogY29uZmlndXJhdGlvbiBvZiB0aGlzIFRTIGhhcyBjaGFuZ2VkICovCitpbnQgZTFpbnBfdXBkYXRlX3RzKHN0cnVjdCBlMWlucF90cyAqdHMpOworCisvKiBSZWNlaXZlIGEgcGFja2V0IGZyb20gdGhlIEUxIGRyaXZlciAqLworaW50IGUxaW5wX3J4X3RzKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBtc2diICptc2csCisJCXVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIFNlbmQgYSBwYWNrZXQsIGNhbGxiYWNrIGZ1bmN0aW9uIGluIHRoZSBkcml2ZXIgKi8KK2ludCBlMWRyaXZlcl90eF90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgbXNnYiAqbXNnKQorCisKK3N0cnVjdCBlMWlucF9kcml2ZXIgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqd2FudF93cml0ZSkoc3RydWN0IGUxaW5wX3RzICp0cyk7Cit9OwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvZ3NtLWhvcHBpbmcudHh0IGIvb3BlbmJzYy9kb2MvZ3NtLWhvcHBpbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTA5MzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9nc20taG9wcGluZy50eHQKQEAgLTAsMCArMSw1NCBAQAorYWNjb3JkaW5nIHRvIEdTTSAwNS4wMjoKKworZ2VuZXJhbCBwYXJhbWV0ZXJzIGZyb20gQ0NDSDoKKyogQ0EgY2VsbCBhbGxvY2F0aW9uIG9mIEFSRkNOJ3MgKFN5c3RlbSBJbmZvcm1hdGlvbiAvIEJDQ0gpCisqIEZOOiBURE1BIGZyYW1lIG51bWJlciAodDEsdDIsdDMnKSBpbiBTQ0gKKworc3BlY2lmaWMgcGFyYW1ldGVycyBmcm9tIGNoYW5uZWwgYXNzaWdubWVudDoKKyogTUE6IG1vYmlsZSBhbGxvY2F0aW9uLCBkZWZpbmVzIHNldCBvZiBBUkZDTidzLCB1cCB0byA2NAorKiBNQUlPOiBpbmRleAorKiBIU046IGhvcHBpbmcgc2VxdWVuY2UgZ2VuZXJhdG9yIG51bWJlciAoMC4uNjQpCisKKworaG9wcGluZyBzZXF1ZW5jZSBnZW5lcmF0aW9uICg2LjIuMyk6CisKK3VfaW50OF90IHJudGFibGVbMTE0XSA9IHsKKwkgNDgsICA5OCwgIDYzLCAgIDEsICAzNiwgIDk1LCAgNzgsIDEwMiwgIDk0LCAgNzMsCisJICAwLCAgNjQsICAyNSwgIDgxLCAgNzYsICA1OSwgMTI0LCAgMjMsIDEwNCwgMTAwLAorCTEwMSwgIDQ3LCAxMTgsICA4NSwgIDE4LCAgNTYsICA5NiwgIDg2LCAgNTQsICAgMiwKKwkgODAsICAzNCwgMTI3LCAgMTMsICAgNiwgIDg5LCAgNTcsIDEwMywgIDEyLCAgNzQsCisJIDU1LCAxMTEsICA3NSwgIDM4LCAxMDksICA3MSwgMTEyLCAgMjksICAxMSwgIDg4LAorCSA4NywgIDE5LCAgIDMsICA2OCwgMTEwLCAgMjYsICAzMywgIDMxLCAgIDgsICA0NSwKKwkgODIsICA1OCwgIDQwLCAxMDcsICAzMiwgICA1LCAxMDYsICA5MiwgIDYyLCAgNjcsCisJIDc3LCAxMDgsIDEyMiwgIDM3LCAgNjAsICA2NiwgMTIxLCAgNDIsICA1MSwgMTI2LAorCTExNywgMTE0LCAgIDQsICA5MCwgIDQzLCAgNTIsICA1MywgMTEzLCAxMjAsICA3MiwKKwkgMTYsICA0OSwgICA3LCAgNzksIDExOSwgIDYxLCAgMjIsICA4NCwgICA5LCAgOTcsCisJMTI1LCAgOTksICAxNywgMTIzCit9OworCisvKiBtYWk9MCByZXByZXNlbnRzIGxvd2VzdCBBUkZDTiBpbiB0aGUgTUEgKi8KKworCit1X2ludDhfdCBob3BwaW5nX21haSh1X2ludDhfdCBoc24sIHVfaW50MzJfdCBmbiwgdV9pbnQ4X3QgbWFpbywKKwkJICAgICB1X2ludDhfdCB0MSwgdV9pbnQ4X3QgdDIsIHVfaW50OF90IHQzXykKK3sKKwl1X2ludDhfdCBtYWk7CisKKwlpZiAoaHNuID09IDApIC8qIGN5Y2xpYyBob3BwaW5nICovCisJCW1haSA9IChmbiArIG1haW8pICUgbjsKKwllbHNlIHsKKwkJdV9pbnQzMl90IG0sIG1fLCB0XywgczsKKworCQltID0gdDIgKyBybnRhYmxlWyhoc24geG9yICh0MSAlIDY0KSkgKyB0M107CisJCW1fID0gbSAlICgyXk5CSU4pOworCQl0XyA9IHQzICUgKDJeTkJJTik7CisJCWlmIChtXyA8IG4gdGhlbikKKwkJCXMgPSBtXzsKKwkJZWxzZQorCQkJcyA9IChtXyArIHRfKSAlIG47CisJCW1haSA9IChzICsgbWFpbykgJSBuOworCX0KKworCXJldHVybiBtYWk7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL2hhbmRvdmVyLnR4dCBiL29wZW5ic2MvZG9jL2hhbmRvdmVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE5ZTg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvaGFuZG92ZXIudHh0CkBAIC0wLDAgKzEsODkgQEAKK0lkZWFzIGFib3V0IGEgaGFuZG92ZXIgYWxnb3JpdGhtCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgaXMgbW9zdGx5IGJhc2VkIG9uIHRoZSByZXN1bHRzIHByZXNlbnRlZCBpbiBDaGFwdGVyIDggb2YgIlBlcmZvcm1hbmNlCitFbmhhbmNlbWVudHMgaW4gYSBGcmVxdWVuY3kgSG9wcGluZyBHU00gTmV0d29yayIgYnkgVGhvbWFzIFRvZnRlZ2FhcmQgTmllbHNlbgorYW5kIEpvZXJvZW4gV2lnYXJkLiAKKworCis9PT0gUmVhc29ucyBmb3IgcGVyZm9ybWluZyBoYW5kb3ZlciA9PT0KKworU2VjdGlvbiAyLjEuMTogSGFuZG92ZXIgdXNlZCBpbiB0aGVpciBDQVBBQ0lUWSBzaW11bGF0aW9uOgorCisxKSBJbnRlcmZlcmVuY2UgSGFuZG92ZXIKKworQXZlcmFnZSBSWExFViBpcyBzYXRpc2ZhY3RvcnkgaGlnaCwgYnV0IGF2ZXJhZ2UgUlhRVUFMIHRvbyBsb3cgaW5kaWNhdGVzCitpbnRlcmZlcmVuY2UgdG8gdGhlIGNoYW5uZWwuICBIYW5kb3ZlciBzaG91bGQgYmUgbWFkZS4KKworMikgQmFkIFF1YWxpdHkKKworQXZlcmFnZWQgUlhRVUFMIGlzIGxvd2VyIHRoYW4gYSB0aHJlc2hvbGQKKworMykgTG93IExldmVsIC8gU2lnbmFsIFN0cmVuZ3RoCisKK0F2ZXJhZ2UgUlhMRVYgaXMgbG93ZXIgdGhhbiBhIHRocmVzaG9sZAorCis0KSBEaXN0YW5jZSBIYW5kb3ZlcgorCitNUyBpcyB0b28gZmFyIGF3YXkgZnJvbSBhIGNlbGwgKG1lYXN1cmVkIGJ5IFRBKQorCis1KSBQb3dlciBidWRnZXQgLyBCZXR0ZXIgQ2VsbAorCitSWCBMZXZlbCBvZiBuZWlnaGJvciBjZWxsIGlzIGF0IGxlYXN0ICJITyBNYXJnaW4gZEIiIGRCIGJldHRlciB0aGFuIHRoZQorY3VycmVudCBzZXJ2aW5nIGNlbGwuCisKKz09PSBJZGVhbCBwYXJhbWV0ZXJzIGZvciBITyBhbGdvcml0aG0gPT09CisKK0NoYXB0ZXIgOCwgU2VjdGlvbiAyLjIsIFRhYmxlIDI0OgorCitXaW5kb3cgUlhMRVYgYXZlcmFnaW5nOgkJMTAgU0FDQ0ggZnJhbWVzIChubyB3ZWlnaHRpbmcpCitXaW5kb3cgUlhRVUFMIGF2ZXJhZ2luZzoJMSBTQUNDSCBmcmFtZSAobm8gYXZlcmFnaW5nKQorTGV2ZWwgVGhyZWFzaG9sZDoJCTEgb2YgdGhlIGxhc3QgMSBBVi1SWExFViB2YWx1ZXMgPCAtMTEwZEJtCitRdWFsaXR5IFRocmVzaG9sZDoJCTMgb2YgdGhlIGxhc3QgNCBBVi1SWFFVQUwgdmFsdWVzID49IDUKK0ludGVyZmVyZW5jZSBUaHJlc2hvbGQ6CQkxIG9mIHRoZSBsYXN0IEFWLVJYTEVWID4gLTg1IGRCbSAmCisJCQkJMyBvZiB0aGUgbGFzdCA0IEFWLVJYUVVBTCB2YWx1ZXMgPj0gNQorUG93ZXIgQnVkZ2V0OgkJCUxldmVsIG9mIG5laWdoYm9yIGNlbGwgPiAzIGRCIGJldHRlcgorUG93ZXIgQnVkZ2V0IEludGVydmFsOgkJRXZlcnkgNiBTQUNDSCBmcmFtZXMgKDYgc2Vjb25kcyA/IT8pCitEaXN0YW5jZSBIYW5kb3ZlcjoJCURpc2FibGVkCitFdmFsdWF0aW9uIHJ1bGUgMToJCVJYTEVWIG9mIHRoZSBjYW5kaWRhdGUgY2VsbCBhIHRsZWFzdCAtMTA0IGRCbQorRXZhbHVhdGlvbiBydWxlIDI6CQlMZXZlbCBvZiBjYW5kaWRhdGUgY2VsbCA+IDNkQiBiZXR0ZXIgb3duIGNlbGwKK1RpbWVyIFN1Y2Nlc3NmdWwgSE86CQk1IFNBQ0NIIGZyYW1lcworVGltZXIgVW5zdWNjZXNzZnVsIEhPOgkJMSBTQUNDSCBmcmFtZQorCitJbiBhIG5vbi1mcmVxdWVuY3kgaG9wcGluZyBjYXNlLCBSWFFVQUwgdGhyZXNob2xkIGNhbiBiZSBkZWNyZWFzZWQgdG8KK1JYTEVWID49IDQKKworV2hlbiBmcmVxdWVuY3kgaG9wcGluZyBpcyBlbmFibGVkLCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcGFyYW1ldGVycworc2hvdWxkIGJlIGludHJvZHVjZWQ6CisKKyogTm8gaW50cmEtY2VsbCBoYW5kb3ZlcgorKiBVc2UgYSBITyBNYXJnaW4gb2YgMmRCCisKKz09PSBIYW5kb3ZlciBDaGFubmVsIFJlc2VydmF0aW9uID09PQorCitJbiBsb2FkZWQgbmV0d29yaywgZWFjaCBjZWxsIHNob3VsZCByZXNlcnZlIHNvbWUgY2hhbm5lbHMgZm9yIGhhbmRvdmVycywKK3JhdGhlciB0aGFuIHVzaW5nIGFsbCBvZiB0aGVtIGZvciBuZXcgY2FsbCBlc3RhYmxpc2htZW50LiAgVGhpcyByZWR1Y2VzIHRoZQorbmVlZCB0byBkcm9wIGNhbGxzIGR1ZSB0byBmYWlsaW5nIGhhbmRvdmVycywgYXQgdGhlIGV4cGVuc2Ugb2YgZmFpbGluZyBuZXcgY2FsbAorYXR0ZW1wdHMuCisKKz09PSBEeW5hbWljIEhPIE1hcmdpbiA9PT0KKworVGhlIGhhbmRvdmVyIG1hcmdpbiAoaHlzdGVyZXNpcykgc2hvdWxkIGRlcGVuZCBvbiB0aGUgUlhRVUFMLiBPcHRpbWFsIHJlc3VsdHMKK3dlcmUgYWNoaWV2ZWQgd2l0aCB0aGUgZm9sbG93aW5nIHNldHRpbmdzOgorKiBSWFFVQUwgPD0gNDogOSBkQgorKiBSWFFVQUwgPT0gNTogNiBkQgorKiBSWFFVQUwgPj0gNjogMSBkQgorCisKKworPT0gQWN0dWFsIEhhbmRvdmVyIG9uIGEgcHJvdG9jb2wgbGV2ZWwgPT0KKworQWZ0ZXIgdGhlIEJTQyBoYXMgZGVjaWRlZCBhIGhhbmRvdmVyIHNoYWxsIGJlIGRvbmUsIGl0IGhhcyB0bworCisjIGFsbG9jYXRlIGEgY2hhbm5lbCBhdCB0aGUgbmV3IEJUUworIyBhbGxvY2F0ZSBhIGhhbmRvdmVyIHJlZmVyZW5jZQorIyBhY3RpdmF0ZSB0aGUgY2hhbm5lbCBvbiB0aGUgQlRTIHNpZGUgdXNpbmcgUlNMIENIQU5ORUwgQUNUSVZBVElPTiwKKyAgaW5kaWNhdGluZyB0aGUgSE8gcmVmZXJlbmNlCisjIEJUUyByZXNwb25kcyB3aXRoIENIQU4gQUNUIEFDSywgaW5jbHVkaW5nIEdTTSBmcmFtZSBudW1iZXIKKyMgQlNDIHNlbmRzIDA0LjA4IEhPIENNRCB0byBNUyB1c2luZyBvbGQgQlRTCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL29tbC1pbnRlcmZhY2UudHh0IGIvb3BlbmJzYy9kb2Mvb21sLWludGVyZmFjZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkY2ZlYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL29tbC1pbnRlcmZhY2UudHh0CkBAIC0wLDAgKzEsMjEgQEAKK29tbCBpbnRlcmZhY2UgZGVzaWduIG5vdGVzCisKK3Byb2JsZW1zOgorCisqIHRoZXJlIGlzIG5vIHdheSBob3cgdG8gdGFnIGEgY29tbWFuZCBzZW50IHRvIHRoZSBCVFMsIHdpdGggdGhlIHJlc3BvbnNlCisgIGhhdmluZyB0aGUgc2FtZSB0YWcgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIGNvbW1hbmQKKyogdGhlcmVmb3JlLCB3ZSBjYW4gaGF2ZSBlLmcuIGJvdGggdGhlIEJTQyBhbmQgdGhlIE9NTCBpbnRlcmZhY2Ugc2VuZCBhCisgIFNFVCBBVFRSSUJVVEUgbWVzc2FnZSwgd2hlcmUgdGhlIHJlc3BvbnNlcyB3b3VsZCBlbmQgdXAgYXQgdGhlIHdyb25nCisgIHF1ZXJ5LgorCit0aGUgb25seSBwb3NzaWJsZSBzb2x1dGlvbnMgaSBjYW4gaW1hZ2luZToKKyogaGF2ZSBzb21lIGtpbmQgb2YgZXhjbHVzaXZlIGxvY2tpbmcsIHdoZXJlIHRoZSBPTUwgaW50ZXJmYWNlIGdldHMgYmxvY2tlZAorICBmcm9tIHRoZSBCU0MgYW5kIGlzIGV4Y2x1c2l2ZWx5IGFzc2lnbmVkIHRvIHRoZSBPTUwgY29uc29sZSB1bnRpbCBhbGwgY29tbWFuZHMKKyAgb2YgdGhlIE9NTCBjb25zb2xlIGhhdmUgdGVybWluYXRlZC4gIFRoaXMgY2FuIGVpdGhlciBiZSBkb25lIGV4cGxpY2l0bHkKKyAgZHluYW1pY2FsbHkgb3Igb24gZGVtYW5kCisKKyogdXNlIHRoZSBPTUwgaW50ZXJmYWNlIHN5bmNocm9ub3VzbHksIGkuZS4gYWx3YXlzIHdhaXQgZm9yIHRoZSByZXNwb25zZSBmcm9tCisgIHRoZSBCVFMgYmVmb3JlCisKKyogdW5pbGF0ZXJhbCAvIHVuc29saWNpdGVkIG1lc3NhZ2VzIG5lZWQgdG8gYmUgYnJvYWRjYXN0ZWQgdG8gYm90aCB0aGUgQlNDIGFuZAorICB0aGUgT01MIGNvbnNvbGUKZGlmZiAtLWdpdCBhL29wZW5ic2MvZ2l0LXZlcnNpb24tZ2VuIGIvb3BlbmJzYy9naXQtdmVyc2lvbi1nZW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjJhZDRhNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZ2l0LXZlcnNpb24tZ2VuCkBAIC0wLDAgKzEsMTUxIEBACisjIS9iaW4vc2gKKyMgUHJpbnQgYSB2ZXJzaW9uIHN0cmluZy4KK3NjcmlwdHZlcnNpb249MjAxMC0wMS0yOC4wMQorCisjIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworIyBUaGlzIHNjcmlwdCBpcyBkZXJpdmVkIGZyb20gR0lULVZFUlNJT04tR0VOIGZyb20gR0lUOiBodHRwOi8vZ2l0Lm9yLmN6Ly4KKyMgSXQgbWF5IGJlIHJ1biB0d28gd2F5czoKKyMgLSBmcm9tIGEgZ2l0IHJlcG9zaXRvcnkgaW4gd2hpY2ggdGhlICJnaXQgZGVzY3JpYmUiIGNvbW1hbmQgYmVsb3cKKyMgICBwcm9kdWNlcyB1c2VmdWwgb3V0cHV0ICh0aHVzIHJlcXVpcmluZyBhdCBsZWFzdCBvbmUgc2lnbmVkIHRhZykKKyMgLSBmcm9tIGEgbm9uLWdpdC1yZXBvIGRpcmVjdG9yeSBjb250YWluaW5nIGEgLnRhcmJhbGwtdmVyc2lvbiBmaWxlLCB3aGljaAorIyAgIHByZXN1bWVzIHRoaXMgc2NyaXB0IGlzIGludm9rZWQgbGlrZSAiLi9naXQtdmVyc2lvbi1nZW4gLnRhcmJhbGwtdmVyc2lvbiIuCisKKyMgSW4gb3JkZXIgdG8gdXNlIGludHJhLXZlcnNpb24gc3RyaW5ncyBpbiB5b3VyIHByb2plY3QsIHlvdSB3aWxsIG5lZWQgdHdvCisjIHNlcGFyYXRlIGdlbmVyYXRlZCB2ZXJzaW9uIHN0cmluZyBmaWxlczoKKyMKKyMgLnRhcmJhbGwtdmVyc2lvbiAtIHByZXNlbnQgb25seSBpbiBhIGRpc3RyaWJ1dGlvbiB0YXJiYWxsLCBhbmQgbm90IGluCisjICAgYSBjaGVja2VkLW91dCByZXBvc2l0b3J5LiAgQ3JlYXRlZCB3aXRoIGNvbnRlbnRzIHRoYXQgd2VyZSBsZWFybmVkIGF0CisjICAgdGhlIGxhc3QgdGltZSBhdXRvY29uZiB3YXMgcnVuLCBhbmQgdXNlZCBieSBnaXQtdmVyc2lvbi1nZW4uICBNdXN0IG5vdAorIyAgIGJlIHByZXNlbnQgaW4gZWl0aGVyICQoc3JjZGlyKSBvciAkKGJ1aWxkZGlyKSBmb3IgZ2l0LXZlcnNpb24tZ2VuIHRvCisjICAgZ2l2ZSBhY2N1cmF0ZSBhbnN3ZXJzIGR1cmluZyBub3JtYWwgZGV2ZWxvcG1lbnQgd2l0aCBhIGNoZWNrZWQgb3V0IHRyZWUsCisjICAgYnV0IG11c3QgYmUgcHJlc2VudCBpbiBhIHRhcmJhbGwgd2hlbiB0aGVyZSBpcyBubyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtLgorIyAgIFRoZXJlZm9yZSwgaXQgY2Fubm90IGJlIHVzZWQgaW4gYW55IGRlcGVuZGVuY2llcy4gIEdOVW1ha2VmaWxlIGhhcworIyAgIGhvb2tzIHRvIGZvcmNlIGEgcmVjb25maWd1cmUgYXQgZGlzdHJpYnV0aW9uIHRpbWUgdG8gZ2V0IHRoZSB2YWx1ZQorIyAgIGNvcnJlY3QsIHdpdGhvdXQgcGVuYWxpemluZyBub3JtYWwgZGV2ZWxvcG1lbnQgd2l0aCBleHRyYSByZWNvbmZpZ3VyZXMuCisjCisjIC52ZXJzaW9uIC0gcHJlc2VudCBpbiBhIGNoZWNrZWQtb3V0IHJlcG9zaXRvcnkgYW5kIGluIGEgZGlzdHJpYnV0aW9uCisjICAgdGFyYmFsbC4gIFVzYWJsZSBpbiBkZXBlbmRlbmNpZXMsIHBhcnRpY3VsYXJseSBmb3IgZmlsZXMgdGhhdCBkb24ndAorIyAgIHdhbnQgdG8gZGVwZW5kIG9uIGNvbmZpZy5oIGJ1dCBkbyB3YW50IHRvIHRyYWNrIHZlcnNpb24gY2hhbmdlcy4KKyMgICBEZWxldGUgdGhpcyBmaWxlIHByaW9yIHRvIGFueSBhdXRvY29uZiBydW4gd2hlcmUgeW91IHdhbnQgdG8gcmVidWlsZAorIyAgIGZpbGVzIHRvIHBpY2sgdXAgYSB2ZXJzaW9uIHN0cmluZyBjaGFuZ2U7IGFuZCBsZWF2ZSBpdCBzdGFsZSB0bworIyAgIG1pbmltaXplIHJlYnVpbGQgdGltZSBhZnRlciB1bnJlbGF0ZWQgY2hhbmdlcyB0byBjb25maWd1cmUgc291cmNlcy4KKyMKKyMgSXQgaXMgcHJvYmFibHkgd2lzZSB0byBhZGQgdGhlc2UgdHdvIGZpbGVzIHRvIC5naXRpZ25vcmUsIHNvIHRoYXQgeW91CisjIGRvbid0IGFjY2lkZW50YWxseSBjb21taXQgZWl0aGVyIGdlbmVyYXRlZCBmaWxlLgorIworIyBVc2UgdGhlIGZvbGxvd2luZyBsaW5lIGluIHlvdXIgY29uZmlndXJlLmFjLCBzbyB0aGF0ICQoVkVSU0lPTikgd2lsbAorIyBhdXRvbWF0aWNhbGx5IGJlIHVwLXRvLWRhdGUgZWFjaCB0aW1lIGNvbmZpZ3VyZSBpcyBydW4gKGFuZCBub3RlIHRoYXQKKyMgc2luY2UgY29uZmlndXJlLmFjIG5vIGxvbmdlciBpbmNsdWRlcyBhIHZlcnNpb24gc3RyaW5nLCBNYWtlZmlsZSBydWxlcworIyBzaG91bGQgbm90IGRlcGVuZCBvbiBjb25maWd1cmUuYWMgZm9yIHZlcnNpb24gdXBkYXRlcykuCisjCisjIEFDX0lOSVQoW0dOVSBwcm9qZWN0XSwKKyMgICAgICAgICBtNF9lc3lzY21kKFtidWlsZC1hdXgvZ2l0LXZlcnNpb24tZ2VuIC50YXJiYWxsLXZlcnNpb25dKSwKKyMgICAgICAgICBbYnVnLXByb2plY3RAZXhhbXBsZV0pCisjCisjIFRoZW4gdXNlIHRoZSBmb2xsb3dpbmcgbGluZXMgaW4geW91ciBNYWtlZmlsZS5hbSwgc28gdGhhdCAudmVyc2lvbgorIyB3aWxsIGJlIHByZXNlbnQgZm9yIGRlcGVuZGVuY2llcywgYW5kIHNvIHRoYXQgLnRhcmJhbGwtdmVyc2lvbiB3aWxsCisjIGV4aXN0IGluIGRpc3RyaWJ1dGlvbiB0YXJiYWxscy4KKyMKKyMgQlVJTFRfU09VUkNFUyA9ICQodG9wX3NyY2RpcikvLnZlcnNpb24KKyMgJCh0b3Bfc3JjZGlyKS8udmVyc2lvbjoKKyMJZWNobyAkKFZFUlNJT04pID4gJEAtdCAmJiBtdiAkQC10ICRACisjIGRpc3QtaG9vazoKKyMJZWNobyAkKFZFUlNJT04pID4gJChkaXN0ZGlyKS8udGFyYmFsbC12ZXJzaW9uCisKK2Nhc2UgJCMgaW4KKyAgICAxKSA7OworICAgICopIGVjaG8gMT4mMiAiVXNhZ2U6ICQwIFwkc3JjZGlyLy50YXJiYWxsLXZlcnNpb24iOyBleGl0IDE7OworZXNhYworCit0YXJiYWxsX3ZlcnNpb25fZmlsZT0kMQorbmw9JworJworCisjIEZpcnN0IHNlZSBpZiB0aGVyZSBpcyBhIHRhcmJhbGwtb25seSB2ZXJzaW9uIGZpbGUuCisjIHRoZW4gdHJ5ICJnaXQgZGVzY3JpYmUiLCB0aGVuIGRlZmF1bHQuCitpZiB0ZXN0IC1mICR0YXJiYWxsX3ZlcnNpb25fZmlsZQordGhlbgorICAgIHY9YGNhdCAkdGFyYmFsbF92ZXJzaW9uX2ZpbGVgIHx8IGV4aXQgMQorICAgIGNhc2UgJHYgaW4KKwkqJG5sKikgdj0gOzsgIyByZWplY3QgbXVsdGktbGluZSBvdXRwdXQKKwlbMC05XSopIDs7CisJKikgdj0gOzsKKyAgICBlc2FjCisgICAgdGVzdCAteiAiJHYiIFwKKwkmJiBlY2hvICIkMDogV0FSTklORzogJHRhcmJhbGxfdmVyc2lvbl9maWxlIHNlZW1zIHRvIGJlIGRhbWFnZWQiIDE+JjIKK2ZpCisKK2lmIHRlc3QgLW4gIiR2IgordGhlbgorICAgIDogIyB1c2UgJHYKK2VsaWYgdGVzdCAtZCAuLy4uLy5naXQgXAorICAgICYmIHY9YGdpdCBkZXNjcmliZSAtLWFiYnJldj00IC0tbWF0Y2g9J3YqJyBIRUFEIDI+L2Rldi9udWxsIFwKKwkgIHx8IGdpdCBkZXNjcmliZSAtLWFiYnJldj00IEhFQUQgMj4vZGV2L251bGxgIFwKKyAgICAmJiBjYXNlICR2IGluCisJIFswLTldKikgOzsKKwkgdlswLTldKikgOzsKKwkgKikgKGV4aXQgMSkgOzsKKyAgICAgICBlc2FjCit0aGVuCisgICAgIyBJcyB0aGlzIGEgbmV3IGdpdCB0aGF0IGxpc3RzIG51bWJlciBvZiBjb21taXRzIHNpbmNlIHRoZSBsYXN0CisgICAgIyB0YWcgb3IgdGhlIHByZXZpb3VzIG9sZGVyIHZlcnNpb24gdGhhdCBkaWQgbm90PworICAgICMgICBOZXdlcjogdjYuMTAtNzctZzBmOGZhZWIKKyAgICAjICAgT2xkZXI6IHY2LjEwLWcwZjhmYWViCisgICAgY2FzZSAkdiBpbgorCSotKi0qKSA6IGdpdCBkZXNjcmliZSBpcyBva2F5IHRocmVlIHBhcnQgZmxhdm9yIDs7CisJKi0qKQorCSAgICA6IGdpdCBkZXNjcmliZSBpcyBvbGRlciB0d28gcGFydCBmbGF2b3IKKwkgICAgIyBSZWNyZWF0ZSB0aGUgbnVtYmVyIG9mIGNvbW1pdHMgYW5kIHJld3JpdGUgc3VjaCB0aGF0IHRoZQorCSAgICAjIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyBpZiB3ZSB3ZXJlIHVzaW5nIHRoZSBuZXdlciB2ZXJzaW9uCisJICAgICMgb2YgZ2l0IGRlc2NyaWJlLgorCSAgICB2dGFnPWBlY2hvICIkdiIgfCBzZWQgJ3MvLS4qLy8nYAorCSAgICBudW1jb21taXRzPWBnaXQgcmV2LWxpc3QgIiR2dGFnIi4uSEVBRCB8IHdjIC1sYAorCSAgICB2PWBlY2hvICIkdiIgfCBzZWQgInMvXCguKlwpLVwoLipcKS9cMS0kbnVtY29tbWl0cy1cMi8iYDsKKwkgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIENoYW5nZSB0aGUgZmlyc3QgJy0nIHRvIGEgJy4nLCBzbyB2ZXJzaW9uLWNvbXBhcmluZyB0b29scyB3b3JrIHByb3Blcmx5LgorICAgICMgUmVtb3ZlIHRoZSAiZyIgaW4gZ2l0IGRlc2NyaWJlJ3Mgb3V0cHV0IHN0cmluZywgdG8gc2F2ZSBhIGJ5dGUuCisgICAgdj1gZWNobyAiJHYiIHwgc2VkICdzLy0vLi87cy9cKC4qXCktZy9cMS0vJ2A7CitlbHNlCisgICAgdj1VTktOT1dOCitmaQorCit2PWBlY2hvICIkdiIgfHNlZCAncy9edi8vJ2AKKworIyBEb24ndCBkZWNsYXJlIGEgdmVyc2lvbiAiZGlydHkiIG1lcmVseSBiZWNhdXNlIGEgdGltZSBzdGFtcCBoYXMgY2hhbmdlZC4KK2dpdCBzdGF0dXMgPiAvZGV2L251bGwgMj4mMQorCitkaXJ0eT1gc2ggLWMgJ2dpdCBkaWZmLWluZGV4IC0tbmFtZS1vbmx5IEhFQUQnIDI+L2Rldi9udWxsYCB8fCBkaXJ0eT0KK2Nhc2UgIiRkaXJ0eSIgaW4KKyAgICAnJykgOzsKKyAgICAqKSAjIEFwcGVuZCB0aGUgc3VmZml4IG9ubHkgaWYgdGhlcmUgaXNuJ3Qgb25lIGFscmVhZHkuCisJY2FzZSAkdiBpbgorCSAgKi1kaXJ0eSkgOzsKKwkgICopIHY9IiR2LWRpcnR5IiA7OworCWVzYWMgOzsKK2VzYWMKKworIyBPbWl0IHRoZSB0cmFpbGluZyBuZXdsaW5lLCBzbyB0aGF0IG00X2VzeXNjbWQgY2FuIHVzZSB0aGUgcmVzdWx0IGRpcmVjdGx5LgorZWNobyAiJHYiIHwgdHIgLWQgJ1wwMTInCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtZW5kOiAiJCIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9pbmNsdWRlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjJhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzIEBACitTVUJESVJTID0gb3BlbmJzYyB2dHkgc2NjcAorCitub2luc3RfSEVBREVSUyA9IG1JU0ROaWYuaCBjb21wYXRfYWZfaXNkbi5oCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvY29tcGF0X2FmX2lzZG4uaCBiL29wZW5ic2MvaW5jbHVkZS9jb21wYXRfYWZfaXNkbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Y2JmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvY29tcGF0X2FmX2lzZG4uaApAQCAtMCwwICsxLDM5IEBACisjaWZkZWYgTUlTRE5fT0xEX0FGX0NPTVBBVElCSUxJVFkKKyN1bmRlZiBBRl9JU0ROCisjdW5kZWYgUEZfSVNETgorCitleHRlcm4JaW50CUFGX0lTRE47CisjZGVmaW5lIFBGX0lTRE4JQUZfSVNETgorCitpbnQJQUZfSVNETjsKKworI2VuZGlmCisKK2V4dGVybiB2b2lkIGluaXRfYWZfaXNkbih2b2lkKTsKKworI2lmZGVmIEFGX0NPTVBBVElCSUxJVFlfRlVOQworI2lmZGVmIE1JU0ROX09MRF9BRl9DT01QQVRJQklMSVRZCit2b2lkIGluaXRfYWZfaXNkbih2b2lkKQoreworCWludAlzOworCisJLyogdGVzdCBmb3IgbmV3IHZhbHVlICovCisJQUZfSVNETiA9IDM0OworCXMgPSBzb2NrZXQoQUZfSVNETiwgU09DS19SQVcsIElTRE5fUF9CQVNFKTsKKwlpZiAocyA+PSAwKSB7CisJCWNsb3NlKHMpOworCQlyZXR1cm47CisJfQorCUFGX0lTRE4gPSAyNzsKKwlzID0gc29ja2V0KEFGX0lTRE4sIFNPQ0tfUkFXLCBJU0ROX1BfQkFTRSk7CisJaWYgKHMgPj0gMCkgeworCQljbG9zZShzKTsKKwkJcmV0dXJuOworCX0KK30KKyNlbHNlCit2b2lkIGluaXRfYWZfaXNkbih2b2lkKQoreworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9tSVNETmlmLmggYi9vcGVuYnNjL2luY2x1ZGUvbUlTRE5pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDY1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvbUlTRE5pZi5oCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICoKKyAqIEF1dGhvcglLYXJzdGVuIEtlaWwgPGtrZWlsQG5vdmVsbC5jb20+CisgKgorICogQ29weXJpZ2h0IDIwMDggIGJ5IEthcnN0ZW4gS2VpbCA8a2tlaWxAbm92ZWxsLmNvbT4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAqIHZlcnNpb24gMi4xIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIG1JU0ROSUZfSAorI2RlZmluZSBtSVNETklGX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmZGVmIGxpbnV4CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKworLyoKKyAqIEFCSSBWZXJzaW9uIDMyIGJpdAorICoKKyAqIDw4IGJpdD4gTWFqb3IgdmVyc2lvbgorICoJCS0gY2hhbmdlZCBpZiBhbnkgaW50ZXJmYWNlIGJlY29tZSBiYWNrd2FyZHMgaW5jb21wYXRpYmxlCisgKgorICogPDggYml0PiBNaW5vciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgLSBjaGFuZ2VkIGlmIGFueSBpbnRlcmZhY2UgaXMgZXh0ZW5kZWQgYnV0IGJhY2t3YXJkcyBjb21wYXRpYmxlCisgKgorICogPDE2IGJpdD4gUmVsZWFzZSBudW1iZXIKKyAqICAgICAgICAgICAgICAtIHNob3VsZCBiZSBpbmNyZW1lbnRlZCBvbiBldmVyeSBjaGVja2luCisgKi8KKyNkZWZpbmUJTUlTRE5fTUFKT1JfVkVSU0lPTgkxCisjZGVmaW5lCU1JU0ROX01JTk9SX1ZFUlNJT04JMQorI2RlZmluZSBNSVNETl9SRUxFQVNFCQkyMAorCisvKiBwcmltaXRpdmVzIGZvciBpbmZvcm1hdGlvbiBleGNoYW5nZQorICogZ2VuZXJlbGwgZm9ybWF0CisgKiA8MTYgIGJpdCAgMCA+CisgKiA8OCAgYml0IGNvbW1hbmQ+CisgKiAgICBCSVQgOCA9IDEgTEFZRVIgcHJpdmF0ZQorICogICAgQklUIDcgPSAxIGFuc3dlcgorICogICAgQklUIDYgPSAxIERBVEEKKyAqIDw4ICBiaXQgdGFyZ2V0IGxheWVyIG1hc2s+CisgKgorICogTGF5ZXIgPSAwMCBpcyByZXNlcnZlZCBmb3IgZ2VuZXJhbCBjb21tYW5kcworICAgTGF5ZXIgPSAwMSAgTDIgLT4gSFcKKyAgIExheWVyID0gMDIgIEhXIC0+IEwyCisgICBMYXllciA9IDA0ICBMMyAtPiBMMgorICAgTGF5ZXIgPSAwOCAgTDIgLT4gTDMKKyAqIExheWVyID0gRkYgaXMgcmVzZXJ2ZWQgZm9yIGJyb2FkY2FzdCBjb21tYW5kcworICovCisKKyNkZWZpbmUgTUlTRE5fQ01ETUFTSwkJMHhmZjAwCisjZGVmaW5lIE1JU0ROX0xBWUVSTUFTSwkJMHgwMGZmCisKKy8qIGdlbmVyZWxsIGNvbW1hbmRzICovCisjZGVmaW5lIE9QRU5fQ0hBTk5FTAkJMHgwMTAwCisjZGVmaW5lIENMT1NFX0NIQU5ORUwJCTB4MDIwMAorI2RlZmluZSBDT05UUk9MX0NIQU5ORUwJCTB4MDMwMAorI2RlZmluZSBDSEVDS19EQVRBCQkweDA0MDAKKworLyogbGF5ZXIgMiAtPiBsYXllciAxICovCisjZGVmaW5lIFBIX0FDVElWQVRFX1JFUQkJMHgwMTAxCisjZGVmaW5lIFBIX0RFQUNUSVZBVEVfUkVRCTB4MDIwMQorI2RlZmluZSBQSF9EQVRBX1JFUQkJMHgyMDAxCisjZGVmaW5lIE1QSF9BQ1RJVkFURV9SRVEJMHgwNTAxCisjZGVmaW5lIE1QSF9ERUFDVElWQVRFX1JFUQkweDA2MDEKKyNkZWZpbmUgTVBIX0lORk9STUFUSU9OX1JFUQkweDA3MDEKKyNkZWZpbmUgUEhfQ09OVFJPTF9SRVEJCTB4MDgwMQorCisvKiBsYXllciAxIC0+IGxheWVyIDIgKi8KKyNkZWZpbmUgUEhfQUNUSVZBVEVfSU5ECQkweDAxMDIKKyNkZWZpbmUgUEhfQUNUSVZBVEVfQ05GCQkweDQxMDIKKyNkZWZpbmUgUEhfREVBQ1RJVkFURV9JTkQJMHgwMjAyCisjZGVmaW5lIFBIX0RFQUNUSVZBVEVfQ05GCTB4NDIwMgorI2RlZmluZSBQSF9EQVRBX0lORAkJMHgyMDAyCisjZGVmaW5lIFBIX0RBVEFfRV9JTkQJCTB4MzAwMgorI2RlZmluZSBNUEhfQUNUSVZBVEVfSU5ECTB4MDUwMgorI2RlZmluZSBNUEhfREVBQ1RJVkFURV9JTkQJMHgwNjAyCisjZGVmaW5lIE1QSF9JTkZPUk1BVElPTl9JTkQJMHgwNzAyCisjZGVmaW5lIFBIX0RBVEFfQ05GCQkweDYwMDIKKyNkZWZpbmUgUEhfQ09OVFJPTF9JTkQJCTB4MDgwMgorI2RlZmluZSBQSF9DT05UUk9MX0NORgkJMHg0ODAyCisKKy8qIGxheWVyIDMgLT4gbGF5ZXIgMiAqLworI2RlZmluZSBETF9FU1RBQkxJU0hfUkVRCTB4MTAwNAorI2RlZmluZSBETF9SRUxFQVNFX1JFUQkJMHgxMTA0CisjZGVmaW5lIERMX0RBVEFfUkVRCQkweDMwMDQKKyNkZWZpbmUgRExfVU5JVERBVEFfUkVRCQkweDMxMDQKKyNkZWZpbmUgRExfSU5GT1JNQVRJT05fUkVRCTB4MDAwNAorCisvKiBsYXllciAyIC0+IGxheWVyIDMgKi8KKyNkZWZpbmUgRExfRVNUQUJMSVNIX0lORAkweDEwMDgKKyNkZWZpbmUgRExfRVNUQUJMSVNIX0NORgkweDUwMDgKKyNkZWZpbmUgRExfUkVMRUFTRV9JTkQJCTB4MTEwOAorI2RlZmluZSBETF9SRUxFQVNFX0NORgkJMHg1MTA4CisjZGVmaW5lIERMX0RBVEFfSU5ECQkweDMwMDgKKyNkZWZpbmUgRExfVU5JVERBVEFfSU5ECQkweDMxMDgKKyNkZWZpbmUgRExfSU5GT1JNQVRJT05fSU5ECTB4MDAwOAorCisvKiBpbnRlcm4gbGF5ZXIgMiBtYW5hZ21lbnQgKi8KKyNkZWZpbmUgTURMX0FTU0lHTl9SRVEJCTB4MTgwNAorI2RlZmluZSBNRExfQVNTSUdOX0lORAkJMHgxOTA0CisjZGVmaW5lIE1ETF9SRU1PVkVfUkVRCQkweDFBMDQKKyNkZWZpbmUgTURMX1JFTU9WRV9JTkQJCTB4MUIwNAorI2RlZmluZSBNRExfU1RBVFVTX1VQX0lORAkweDFDMDQKKyNkZWZpbmUgTURMX1NUQVRVU19ET1dOX0lORAkweDFEMDQKKyNkZWZpbmUgTURMX1NUQVRVU19VSV9JTkQJMHgxRTA0CisjZGVmaW5lIE1ETF9FUlJPUl9JTkQJCTB4MUYwNAorI2RlZmluZSBNRExfRVJST1JfUlNQCQkweDVGMDQKKworLyogRExfSU5GT1JNQVRJT05fSU5EIHR5cGVzICovCisjZGVmaW5lIERMX0lORk9fTDJfQ09OTkVDVAkweDAwMDEKKyNkZWZpbmUgRExfSU5GT19MMl9SRU1PVkVECTB4MDAwMgorCisvKiBQSF9DT05UUk9MIHR5cGVzICovCisvKiBUT1VDSCBUT05FIElTIDB4MjBYWCAgWFggIjAiLi4uIjkiLCAiQSIsIkIiLCJDIiwiRCIsIioiLCIjIiAqLworI2RlZmluZSBEVE1GX1RPTkVfVkFMCQkweDIwMDAKKyNkZWZpbmUgRFRNRl9UT05FX01BU0sJCTB4MDA3RgorI2RlZmluZSBEVE1GX1RPTkVfU1RBUlQJCTB4MjEwMAorI2RlZmluZSBEVE1GX1RPTkVfU1RPUAkJMHgyMjAwCisjZGVmaW5lIERUTUZfSEZDX0NPRUYJCTB4NDAwMAorI2RlZmluZSBEU1BfQ09ORl9KT0lOCQkweDI0MDMKKyNkZWZpbmUgRFNQX0NPTkZfU1BMSVQJCTB4MjQwNAorI2RlZmluZSBEU1BfUkVDRUlWRV9PRkYJCTB4MjQwNQorI2RlZmluZSBEU1BfUkVDRUlWRV9PTgkJMHgyNDA2CisjZGVmaW5lIERTUF9FQ0hPX09OCQkweDI0MDcKKyNkZWZpbmUgRFNQX0VDSE9fT0ZGCQkweDI0MDgKKyNkZWZpbmUgRFNQX01JWF9PTgkJMHgyNDA5CisjZGVmaW5lIERTUF9NSVhfT0ZGCQkweDI0MGEKKyNkZWZpbmUgRFNQX0RFTEFZCQkweDI0MGIKKyNkZWZpbmUgRFNQX0pJVFRFUgkJMHgyNDBjCisjZGVmaW5lIERTUF9UWERBVEFfT04JCTB4MjQwZAorI2RlZmluZSBEU1BfVFhEQVRBX09GRgkJMHgyNDBlCisjZGVmaW5lIERTUF9UWF9ERUpJVFRFUgkJMHgyNDBmCisjZGVmaW5lIERTUF9UWF9ERUpfT0ZGCQkweDI0MTAKKyNkZWZpbmUgRFNQX1RPTkVfUEFUVF9PTgkweDI0MTEKKyNkZWZpbmUgRFNQX1RPTkVfUEFUVF9PRkYJMHgyNDEyCisjZGVmaW5lIERTUF9WT0xfQ0hBTkdFX1RYCTB4MjQxMworI2RlZmluZSBEU1BfVk9MX0NIQU5HRV9SWAkweDI0MTQKKyNkZWZpbmUgRFNQX0JGX0VOQUJMRV9LRVkJMHgyNDE1CisjZGVmaW5lIERTUF9CRl9ESVNBQkxFCQkweDI0MTYKKyNkZWZpbmUgRFNQX0JGX0FDQ0VQVAkJMHgyNDE2CisjZGVmaW5lIERTUF9CRl9SRUpFQ1QJCTB4MjQxNworI2RlZmluZSBEU1BfUElQRUxJTkVfQ0ZHCTB4MjQxOAorI2RlZmluZSBIRkNfVk9MX0NIQU5HRV9UWAkweDI2MDEKKyNkZWZpbmUgSEZDX1ZPTF9DSEFOR0VfUlgJMHgyNjAyCisjZGVmaW5lIEhGQ19TUExfTE9PUF9PTgkJMHgyNjAzCisjZGVmaW5lIEhGQ19TUExfTE9PUF9PRkYJMHgyNjA0CisKKy8qIERTUF9UT05FX1BBVFRfT04gcGFyYW1ldGVyICovCisjZGVmaW5lIFRPTkVfT0ZGCQkJMHgwMDAwCisjZGVmaW5lIFRPTkVfR0VSTUFOX0RJQUxUT05FCQkweDAwMDEKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xERElBTFRPTkUJCTB4MDAwMgorI2RlZmluZSBUT05FX0FNRVJJQ0FOX0RJQUxUT05FCQkweDAwMDMKKyNkZWZpbmUgVE9ORV9HRVJNQU5fRElBTFBCWAkJMHgwMDA0CisjZGVmaW5lIFRPTkVfR0VSTUFOX09MRERJQUxQQlgJCTB4MDAwNQorI2RlZmluZSBUT05FX0FNRVJJQ0FOX0RJQUxQQlgJCTB4MDAwNgorI2RlZmluZSBUT05FX0dFUk1BTl9SSU5HSU5HCQkweDAwMDcKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xEUklOR0lORwkJMHgwMDA4CisjZGVmaW5lIFRPTkVfQU1FUklDQU5fUklOR1BCWAkJMHgwMDBiCisjZGVmaW5lIFRPTkVfR0VSTUFOX1JJTkdQQlgJCTB4MDAwYworI2RlZmluZSBUT05FX0dFUk1BTl9PTERSSU5HUEJYCQkweDAwMGQKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9SSU5HSU5HCQkweDAwMGUKKyNkZWZpbmUgVE9ORV9HRVJNQU5fQlVTWQkJMHgwMDBmCisjZGVmaW5lIFRPTkVfR0VSTUFOX09MREJVU1kJCTB4MDAxMAorI2RlZmluZSBUT05FX0FNRVJJQ0FOX0JVU1kJCTB4MDAxMQorI2RlZmluZSBUT05FX0dFUk1BTl9IQU5HVVAJCTB4MDAxMgorI2RlZmluZSBUT05FX0dFUk1BTl9PTERIQU5HVVAJCTB4MDAxMworI2RlZmluZSBUT05FX0FNRVJJQ0FOX0hBTkdVUAkJMHgwMDE0CisjZGVmaW5lIFRPTkVfU1BFQ0lBTF9JTkZPCQkweDAwMTUKKyNkZWZpbmUgVE9ORV9HRVJNQU5fR0FTU0VOQkVTRVRaVAkweDAwMTYKKyNkZWZpbmUgVE9ORV9HRVJNQU5fQVVGU0NIQUxUVE9OCTB4MDAxNgorCisvKiBNUEhfSU5GT1JNQVRJT05fSU5EICovCisjZGVmaW5lIEwxX1NJR05BTF9MT1NfT0ZGCTB4MDAxMAorI2RlZmluZSBMMV9TSUdOQUxfTE9TX09OCTB4MDAxMQorI2RlZmluZSBMMV9TSUdOQUxfQUlTX09GRgkweDAwMTIKKyNkZWZpbmUgTDFfU0lHTkFMX0FJU19PTgkweDAwMTMKKyNkZWZpbmUgTDFfU0lHTkFMX1JESV9PRkYJMHgwMDE0CisjZGVmaW5lIEwxX1NJR05BTF9SRElfT04JMHgwMDE1CisjZGVmaW5lIEwxX1NJR05BTF9TTElQX1JYCTB4MDAyMAorI2RlZmluZSBMMV9TSUdOQUxfU0xJUF9UWAkweDAwMjEKKworLyoKKyAqIHByb3RvY29sIGlkcworICogRCBjaGFubmVsIDEtMzEKKyAqIEIgY2hhbm5lbCAzMyAtIDYzCisgKi8KKworI2RlZmluZSBJU0ROX1BfTk9ORQkJMAorI2RlZmluZSBJU0ROX1BfQkFTRQkJMAorI2RlZmluZSBJU0ROX1BfVEVfUzAJCTB4MDEKKyNkZWZpbmUgSVNETl9QX05UX1MwICAJCTB4MDIKKyNkZWZpbmUgSVNETl9QX1RFX0UxCQkweDAzCisjZGVmaW5lIElTRE5fUF9OVF9FMSAgCQkweDA0CisjZGVmaW5lIElTRE5fUF9URV9VUDAJCTB4MDUKKyNkZWZpbmUgSVNETl9QX05UX1VQMAkJMHgwNgorCisjZGVmaW5lIElTX0lTRE5fUF9URShwKSAoKHAgPT0gSVNETl9QX1RFX1MwKSB8fCAocCA9PSBJU0ROX1BfVEVfRTEpIHx8IFwKKwkJCQkocCA9PSBJU0ROX1BfVEVfVVAwKSB8fCAocCA9PSBJU0ROX1BfTEFQRF9URSkpCisjZGVmaW5lIElTX0lTRE5fUF9OVChwKSAoKHAgPT0gSVNETl9QX05UX1MwKSB8fCAocCA9PSBJU0ROX1BfTlRfRTEpIHx8IFwKKwkJCQkocCA9PSBJU0ROX1BfTlRfVVAwKSB8fCAocCA9PSBJU0ROX1BfTEFQRF9OVCkpCisjZGVmaW5lIElTX0lTRE5fUF9TMChwKSAoKHAgPT0gSVNETl9QX1RFX1MwKSB8fCAocCA9PSBJU0ROX1BfTlRfUzApKQorI2RlZmluZSBJU19JU0ROX1BfRTEocCkgKChwID09IElTRE5fUF9URV9FMSkgfHwgKHAgPT0gSVNETl9QX05UX0UxKSkKKyNkZWZpbmUgSVNfSVNETl9QX1VQMChwKSAoKHAgPT0gSVNETl9QX1RFX1VQMCkgfHwgKHAgPT0gSVNETl9QX05UX1VQMCkpCisKKworI2RlZmluZSBJU0ROX1BfTEFQRF9URQkJMHgxMAorI2RlZmluZQlJU0ROX1BfTEFQRF9OVAkJMHgxMQorCisjZGVmaW5lIElTRE5fUF9CX01BU0sJCTB4MWYKKyNkZWZpbmUgSVNETl9QX0JfU1RBUlQJCTB4MjAKKworI2RlZmluZSBJU0ROX1BfQl9SQVcJCTB4MjEKKyNkZWZpbmUgSVNETl9QX0JfSERMQwkJMHgyMgorI2RlZmluZSBJU0ROX1BfQl9YNzVTTFAJCTB4MjMKKyNkZWZpbmUgSVNETl9QX0JfTDJEVE1GCQkweDI0CisjZGVmaW5lIElTRE5fUF9CX0wyRFNQCQkweDI1CisjZGVmaW5lIElTRE5fUF9CX0wyRFNQSERMQwkweDI2CisKKyNkZWZpbmUgT1BUSU9OX0wyX1BNWAkJMQorI2RlZmluZSBPUFRJT05fTDJfUFRQCQkyCisjZGVmaW5lIE9QVElPTl9MMl9GSVhFRFRFSQkzCisjZGVmaW5lIE9QVElPTl9MMl9DTEVBTlVQCTQKKworLyogc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBsaW51eC9rb2JqZWN0Lmg6S09CSl9OQU1FX0xFTiAqLworI2RlZmluZSBNSVNETl9NQVhfSURMRU4JCTIwCisKK3N0cnVjdCBtSVNETmhlYWQgeworCXVuc2lnbmVkIGludAlwcmltOworCXVuc2lnbmVkIGludAlpZDsKK30gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIE1JU0ROX0hFQURFUl9MRU4Jc2l6ZW9mKHN0cnVjdCBtSVNETmhlYWQpCisjZGVmaW5lIE1BWF9EQVRBX1NJWkUJCTIwNDgKKyNkZWZpbmUgTUFYX0RBVEFfTUVNCQkoTUFYX0RBVEFfU0laRSArIE1JU0ROX0hFQURFUl9MRU4pCisjZGVmaW5lIE1BWF9ERlJBTUVfTEVOCQkyNjAKKworI2RlZmluZSBNSVNETl9JRF9BRERSX01BU0sJMHhGRkZGCisjZGVmaW5lIE1JU0ROX0lEX1RFSV9NQVNLCTB4RkYwMAorI2RlZmluZSBNSVNETl9JRF9TQVBJX01BU0sJMHgwMEZGCisjZGVmaW5lIE1JU0ROX0lEX1RFSV9BTlkJMHg3RjAwCisKKyNkZWZpbmUgTUlTRE5fSURfQU5ZCQkweEZGRkYKKyNkZWZpbmUgTUlTRE5fSURfTk9ORQkJMHhGRkZFCisKKyNkZWZpbmUgR1JPVVBfVEVJCQkxMjcKKyNkZWZpbmUgVEVJX1NBUEkJCTYzCisjZGVmaW5lIENUUkxfU0FQSQkJMAorCisjZGVmaW5lIE1JU0ROX01BWF9DSEFOTkVMCTEyNworI2RlZmluZSBNSVNETl9DSE1BUF9TSVpFCSgoTUlTRE5fTUFYX0NIQU5ORUwgKyAxKSA+PiAzKQorCisjZGVmaW5lIFNPTF9NSVNETgkwCisKK3N0cnVjdCBzb2NrYWRkcl9tSVNETiB7CisJc2FfZmFtaWx5X3QgICAgZmFtaWx5OworCXVuc2lnbmVkIGNoYXIJZGV2OworCXVuc2lnbmVkIGNoYXIJY2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyCXNhcGk7CisJdW5zaWduZWQgY2hhcgl0ZWk7Cit9OworCitzdHJ1Y3QgbUlTRE52ZXJzaW9uIHsKKwl1bnNpZ25lZCBjaGFyCW1ham9yOworCXVuc2lnbmVkIGNoYXIJbWlub3I7CisJdW5zaWduZWQgc2hvcnQJcmVsZWFzZTsKK307CisKKyNkZWZpbmUgTUFYX0RFVklDRV9JRCA2MworCitzdHJ1Y3QgbUlTRE5fZGV2aW5mbyB7CisJdV9pbnQJCQlpZDsKKwl1X2ludAkJCURwcm90b2NvbHM7CisJdV9pbnQJCQlCcHJvdG9jb2xzOworCXVfaW50CQkJcHJvdG9jb2w7CisJdV9jaGFyCQkJY2hhbm5lbG1hcFtNSVNETl9DSE1BUF9TSVpFXTsKKwl1X2ludAkJCW5yYmNoYW47CisJY2hhcgkJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsKK307CisKK3N0cnVjdCBtSVNETl9kZXZyZW5hbWUgeworCXVfaW50CQkJaWQ7CisJY2hhcgkJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsKK307CisKK3N0cnVjdCBwaF9pbmZvX2NoIHsKKwlpbnQzMl90IAkJcHJvdG9jb2w7CisJaW50NjRfdAkJCUZsYWdzOworfTsKKworc3RydWN0IHBoX2luZm9fZGNoIHsKKwlzdHJ1Y3QgcGhfaW5mb19jaAljaDsKKwlpbnQxNl90CQkJc3RhdGU7CisJaW50MTZfdAkJCW51bV9iY2g7Cit9OworCitzdHJ1Y3QgcGhfaW5mbyB7CisJc3RydWN0IHBoX2luZm9fZGNoCWRjaDsKKwlzdHJ1Y3QgcGhfaW5mb19jaCAJYmNoW107Cit9OworCisvKiB0aW1lciBkZXZpY2UgaW9jdGwgKi8KKyNkZWZpbmUgSU1BRERUSU1FUglfSU9SKCdJJywgNjQsIGludCkKKyNkZWZpbmUgSU1ERUxUSU1FUglfSU9SKCdJJywgNjUsIGludCkKKy8qIHNvY2tldCBpb2N0bHMgKi8KKyNkZWZpbmUJSU1HRVRWRVJTSU9OCV9JT1IoJ0knLCA2NiwgaW50KQorI2RlZmluZQlJTUdFVENPVU5UCV9JT1IoJ0knLCA2NywgaW50KQorI2RlZmluZSBJTUdFVERFVklORk8JX0lPUignSScsIDY4LCBpbnQpCisjZGVmaW5lIElNQ1RSTFJFUQlfSU9SKCdJJywgNjksIGludCkKKyNkZWZpbmUgSU1DTEVBUl9MMglfSU9SKCdJJywgNzAsIGludCkKKyNkZWZpbmUgSU1TRVRERVZOQU1FCV9JT1IoJ0knLCA3MSwgc3RydWN0IG1JU0ROX2RldnJlbmFtZSkKKworc3RhdGljIGlubGluZSBpbnQKK3Rlc3RfY2hhbm5lbG1hcCh1X2ludCBuciwgdV9jaGFyICptYXApCit7CisJaWYgKG5yIDw9IE1JU0ROX01BWF9DSEFOTkVMKQorCQlyZXR1cm4gbWFwW25yID4+IDNdICYgKDEgPDwgKG5yICYgNykpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0X2NoYW5uZWxtYXAodV9pbnQgbnIsIHVfY2hhciAqbWFwKQoreworCW1hcFtuciA+PiAzXSB8PSAoMSA8PCAobnIgJiA3KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2xlYXJfY2hhbm5lbG1hcCh1X2ludCBuciwgdV9jaGFyICptYXApCit7CisJbWFwW25yID4+IDNdICY9IH4oMSA8PCAobnIgJiA3KSk7Cit9CisKKy8qIENPTlRST0xfQ0hBTk5FTCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1JU0ROX0NUUkxfR0VUT1AJCTB4MDAwMAorI2RlZmluZSBNSVNETl9DVFJMX0xPT1AJCQkweDAwMDEKKyNkZWZpbmUgTUlTRE5fQ1RSTF9DT05ORUNUCQkweDAwMDIKKyNkZWZpbmUgTUlTRE5fQ1RSTF9ESVNDT05ORUNUCQkweDAwMDQKKyNkZWZpbmUgTUlTRE5fQ1RSTF9QQ01DT05ORUNUCQkweDAwMTAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9QQ01ESVNDT05ORUNUCTB4MDAyMAorI2RlZmluZSBNSVNETl9DVFJMX1NFVFBFRVIJCTB4MDA0MAorI2RlZmluZSBNSVNETl9DVFJMX1VOU0VUUEVFUgkJMHgwMDgwCisjZGVmaW5lIE1JU0ROX0NUUkxfUlhfT0ZGCQkweDAxMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9GSUxMX0VNUFRZCQkweDAyMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9HRVRQRUVSCQkweDA0MDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IV19GRUFUVVJFU19PUAkweDIwMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IV19GRUFUVVJFUwkJMHgyMDAxCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX09QCQkweDQwMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfUENNX0NPTk4JCTB4NDAwMQorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19QQ01fRElTQwkJMHg0MDAyCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX0NPTkZfSk9JTgkweDQwMDMKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfQ09ORl9TUExJVAkweDQwMDQKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfUkVDRUlWRV9PRkYJMHg0MDA1CisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX1JFQ0VJVkVfT04JMHg0MDA2CisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX0VDSE9DQU5fT04gCTB4NDAwNworI2RlZmluZSBNSVNETl9DVFJMX0hGQ19FQ0hPQ0FOX09GRiAJMHg0MDA4CisKKworLyogc29ja2V0IG9wdGlvbnMgKi8KKyNkZWZpbmUgTUlTRE5fVElNRV9TVEFNUAkJMHgwMDAxCisKK3N0cnVjdCBtSVNETl9jdHJsX3JlcSB7CisJaW50CQlvcDsKKwlpbnQJCWNoYW5uZWw7CisJaW50CQlwMTsKKwlpbnQJCXAyOworfTsKKworLyogbXV4ZXIgb3B0aW9ucyAqLworI2RlZmluZSBNSVNETl9PUFRfQUxMCQkxCisjZGVmaW5lIE1JU0ROX09QVF9URUlNR1IJMgorCisjZW5kaWYgLyogbUlTRE5JRl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZS5hbSBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OWU2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEyIEBACitub2luc3RfSEVBREVSUyA9IGFiaXNfbm0uaCBhYmlzX3JzbC5oIGRiLmggZ3NtXzA0XzA4LmggZ3NtX2RhdGEuaCBcCisJCSBnc21fc3Vic2NyaWJlci5oIGdzbV8wNF8xMS5oIGRlYnVnLmggc2lnbmFsLmggXAorCQkgbWlzZG4uaCBjaGFuX2FsbG9jLmggdGVsbmV0X2ludGVyZmFjZS5oIHBhZ2luZy5oIFwKKwkJIHN1YmNoYW5fZGVtdXguaCB0cmF1X2ZyYW1lLmggZTFfaW5wdXQuaCB0cmF1X211eC5oIFwKKwkJIGlwYWNjZXNzLmggcnMyMzIuaCBvcGVuYnNjZGVmaW5lcy5oIHJ0cF9wcm94eS5oIFwKKwkJIGJzY19ybGwuaCBtbmNjLmggdHJhbnNhY3Rpb24uaCB1c3NkLmggZ3NtXzA0XzgwLmggXAorCQkgc2lsZW50X2NhbGwuaCBtZ2NwLmggbWVhc19yZXAuaCByZXN0X29jdGV0cy5oIFwKKwkJIHN5c3RlbV9pbmZvcm1hdGlvbi5oIGhhbmRvdmVyLmggbWdjcF9pbnRlcm5hbC5oIFwKKwkJIHZ0eS5oCisKK29wZW5ic2NfSEVBREVSUyA9IGdzbV8wNF8wOC5oIG1lYXNfcmVwLmggYnNjX2FwaS5oCitvcGVuYnNjZGlyID0gJChpbmNsdWRlZGlyKS9vcGVuYnNjCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX25tLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX25tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzMDdlMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfbm0uaApAQCAtMCwwICsxLDE3MiBAQAorLyogR1NNIE5ldHdvcmsgTWFuYWdlbWVudCBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlIAorICogM0dQUCBUUyAxMi4yMSB2ZXJzaW9uIDguMC4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDYyMyBWOC4wLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX05NX0gKKyNkZWZpbmUgX05NX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oPgorCitzdHJ1Y3QgY2VsbF9nbG9iYWxfaWQgeworCXVfaW50MTZfdCBtY2M7CisJdV9pbnQxNl90IG1uYzsKKwl1X2ludDE2X3QgbGFjOworCXVfaW50MTZfdCBjaTsKK307CisKKy8qIFRoZSBCQ0NIIGluZm8gZnJvbSBhbiBpcC5hY2Nlc3MgdGVzdCwgaW4gaG9zdCBieXRlIG9yZGVyCisgKiBhbmQgYWxyZWFkeSBwYXJzZWQuLi4gKi8KK3N0cnVjdCBpcGFjX2JjY2hfaW5mbyB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXVfaW50MTZfdCBpbmZvX3R5cGU7CisJdV9pbnQ4X3QgZnJlcV9xdWFsOworCXVfaW50MTZfdCBhcmZjbjsKKwl1X2ludDhfdCByeF9sZXY7CisJdV9pbnQ4X3QgcnhfcXVhbDsKKwlpbnQxNl90IGZyZXFfZXJyOworCXVfaW50MTZfdCBmcmFtZV9vZmZzZXQ7CisJdV9pbnQzMl90IGZyYW1lX25yX29mZnNldDsKKwl1X2ludDhfdCBic2ljOworCXN0cnVjdCBjZWxsX2dsb2JhbF9pZCBjZ2k7CisJdV9pbnQ4X3QgYmFfbGlzdF9zaTJbMTZdOworCXVfaW50OF90IGJhX2xpc3Rfc2kyYmlzWzE2XTsKKwl1X2ludDhfdCBiYV9saXN0X3NpMnRlclsxNl07CisJdV9pbnQ4X3QgY2FfbGlzdF9zaTFbMTZdOworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmOworCisvKiBQVUJMSUMgKi8KKworc3RydWN0IG1zZ2I7CisKK3N0cnVjdCBhYmlzX25tX2NmZyB7CisJLyogY2FsbGJhY2sgZm9yIHVuaWRpcmVjdGlvbmFsIHJlcG9ydHMgKi8KKwlpbnQgKCpyZXBvcnRfY2IpKHN0cnVjdCBtc2diICosCisJCQkgc3RydWN0IGFiaXNfb21fZm9tX2hkciAqKTsKKwkvKiBjYWxsYmFjayBmb3Igc29mdHdhcmUgYWN0aXZhdGUgcmVxdWVzdHMgZnJvbSBCVFMgKi8KKwlpbnQgKCpzd19hY3RfcmVxKShzdHJ1Y3QgbXNnYiAqKTsKK307CisKK2V4dGVybiBpbnQgYWJpc19ubV9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZyk7CisKK2ludCBhYmlzX25tX3Rsdl9wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqdHAsIHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IHVfaW50OF90ICpidWYsIGludCBsZW4pOworaW50IGFiaXNfbm1fcngoc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgYWJpc19ubV9vcHN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgaTAsIHVfaW50OF90IGkxLCB1X2ludDhfdCBpMik7CitpbnQgYWJpc19ubV9jaGdfYWRtX3N0YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgaTAsCisJCQkgIHVfaW50OF90IGkxLCB1X2ludDhfdCBpMiwgZW51bSBhYmlzX25tX2FkbV9zdGF0ZSBhZG1fc3RhdGUpOworaW50IGFiaXNfbm1fZXN0YWJsaXNoX3RlaShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCB0cnhfbnIsCisJCQkgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90LAorCQkJICB1X2ludDhfdCB0ZWkpOworaW50IGFiaXNfbm1fY29ubl90ZXJyX3NpZ24oc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsCisJCQkgICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCk7CitpbnQgYWJpc19ubV9jb25uX3RlcnJfdHJhZihzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLAorCQkJICAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsCisJCQkgICB1X2ludDhfdCBlMV9zdWJzbG90KTsKK2ludCBhYmlzX25tX3NldF9idHNfYXR0cihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCAqYXR0ciwgaW50IGF0dHJfbGVuKTsKK2ludCBhYmlzX25tX3NldF9yYWRpb19hdHRyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCAqYXR0ciwgaW50IGF0dHJfbGVuKTsKK2ludCBhYmlzX25tX3NldF9jaGFubmVsX2F0dHIoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgY2hhbl9jb21iKTsKK2ludCBhYmlzX25tX3N3X2FjdF9yZXFfYWNrKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgaTEsCisJCQl1X2ludDhfdCBpMiwgdV9pbnQ4X3QgaTMsIGludCBuYWNrLCB1X2ludDhfdCAqYXR0ciwgaW50IGF0dF9sZW4pOworaW50IGFiaXNfbm1fcmF3X21zZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbGVuLCB1X2ludDhfdCAqbXNnKTsKK2ludCBhYmlzX25tX2V2ZW50X3JlcG9ydHMoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKTsKK2ludCBhYmlzX25tX3Jlc2V0X3Jlc291cmNlKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fc29mdHdhcmVfbG9hZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCSAgdV9pbnQ4X3Qgd2luX3NpemUsIGludCBmb3JjZWQsCisJCQkgIGdzbV9jYmZuICpjYmZuLCB2b2lkICpjYl9kYXRhKTsKK2ludCBhYmlzX25tX3NvZnR3YXJlX2xvYWRfc3RhdHVzKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fc29mdHdhcmVfYWN0aXZhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgICAgICBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqY2JfZGF0YSk7CisKK2ludCBhYmlzX25tX2Nvbm5fbWRyb3BfbGluayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBlMV9wb3J0MCwgdV9pbnQ4X3QgdHMwLAorCQkJICAgIHVfaW50OF90IGUxX3BvcnQxLCB1X2ludDhfdCB0czEpOworCitpbnQgYWJpc19ubV9wZXJmb3JtX3Rlc3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkJIHVfaW50OF90IGJ0c19uciwgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKKwkJCSB1X2ludDhfdCB0ZXN0X25yLCB1X2ludDhfdCBhdXRvbl9yZXBvcnQsCisJCQkgdV9pbnQ4X3QgKnBoeXNfY29uZmlnLCB1X2ludDE2X3QgcGh5c19jb25maWdfbGVuKTsKKworaW50IGFiaXNfbm1fY2hjb21iNHBjaGFuKGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pOworCisvKiBTaWVtZW5zIC8gQlMtMTEgc3BlY2lmaWMgKi8KK2ludCBhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2Uoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgYmVnaW4pOworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gYWJpc19iczExX29ianR5cGUgdHlwZSwKKwkJCSAgdV9pbnQ4X3QgaWR4LCB1X2ludDhfdCBhdHRyX2xlbiwgY29uc3QgdV9pbnQ4X3QgKmF0dHIpOworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfZW52YUJUU0Uoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KTsKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX2Jwb3J0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCk7CitpbnQgYWJpc19ubV9iczExX2RlbGV0ZV9vYmplY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQllbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHR5cGUsIHVfaW50OF90IGlkeCk7CitpbnQgYWJpc19ubV9iczExX2RlbGV0ZV9icG9ydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpOworaW50IGFiaXNfbm1fYnMxMV9jb25uX29tbF90ZWkoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgZTFfcG9ydCwKKwkJCSAgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsIHVfaW50OF90IHRlaSk7CitpbnQgYWJpc19ubV9iczExX2dldF9vbWxfdGVpX3RzKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfc2Vybm8oc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX3NldF90cnhfcG93ZXIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IGxldmVsKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCk7CitpbnQgYWJpc19ubV9iczExX2xvZ29uKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGxldmVsLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgb24pOworaW50IGFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBvbik7CitpbnQgYWJpc19ubV9iczExX2luZmllbGRfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X3RyeDFfcHcoc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqcGFzc3dvcmQpOworaW50IGFiaXNfbm1fYnMxMV9zZXRfcGxsX2xvY2tlZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbG9ja2VkKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3BsbF9tb2RlKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9zZXRfcGxsKHN0cnVjdCBnc21fYnRzICpidHMsIGludCB2YWx1ZSk7CitpbnQgYWJpc19ubV9iczExX2dldF9jY2xrKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfc3RhdGUoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX2xvYWRfc3dsKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICB1X2ludDhfdCB3aW5fc2l6ZSwgaW50IGZvcmNlZCwgZ3NtX2NiZm4gKmNiZm4pOworaW50IGFiaXNfbm1fYnMxMV9zZXRfZXh0X3RpbWUoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX3NldF9icG9ydF9saW5lX2NmZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBicG9ydCwgZW51bSBhYmlzX2JzMTFfbGluZV9jZmcgbGluZV9jZmcpOworaW50IGFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgcmVjb25uZWN0KTsKK2ludCBhYmlzX25tX2JzMTFfcmVzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworLyogaXAuYWNjZXNzIG5hbm9CVFMgc3BlY2lmaWMgY29tbWFuZHMgKi8KK2ludCBhYmlzX25tX2lwYWNjZXNzX21zZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBtc2dfdHlwZSwKKwkJCSB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGJ0c19uciwKKwkJCSB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgKmF0dHIsCisJCQkJaW50IGF0dHJfbGVuKTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkJdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJCXVfaW50OF90ICphdHRyLCB1X2ludDhfdCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9pcGFjY2Vzc19yc2xfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgCisJCQkJIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQsIHVfaW50OF90IHN0cmVhbSk7Cit2b2lkIGFiaXNfbm1faXBhY2Nlc3NfY2dpKHVfaW50OF90ICpidWYsIHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGlwYWNfcGFyc2VfYmNjaF9pbmZvKHN0cnVjdCBpcGFjX2JjY2hfaW5mbyAqYmluZiwgdV9pbnQ4X3QgKmJ1Zik7Citjb25zdCBjaGFyICppcGFjY190ZXN0cmVzX25hbWUodV9pbnQ4X3QgcmVzKTsKKworLyogRnVuY3Rpb25zIGNhbGxpbmcgaW50byBvdGhlciBjb2RlIHBhcnRzICovCitlbnVtIG5tX2V2dCB7CisJRVZUX1NUQVRFQ0hHX09QRVIsCisJRVZUX1NUQVRFQ0hHX0FETSwKK307CitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpOyAKKworY29uc3QgY2hhciAqbm1fb3BzdGF0ZV9uYW1lKHVfaW50OF90IG9zKTsKK2NvbnN0IGNoYXIgKm5tX2F2YWlsX25hbWUodV9pbnQ4X3QgYXZhaWwpOworaW50IG5tX2lzX3J1bm5pbmcoc3RydWN0IGdzbV9ubV9zdGF0ZSAqcyk7CisjZW5kaWYgLyogX05NX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfcnNsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX3JzbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjc3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX3JzbC5oCkBAIC0wLDAgKzEsODggQEAKKy8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDguNTggdmVyc2lvbiA4LjYuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA1OTYgVjguNi4wICovCisKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfUlNMX0gKKyNkZWZpbmUgX1JTTF9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKworaW50IHJzbF9iY2NoX2luZm8oc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHR5cGUsCisJCSAgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworaW50IHJzbF9zYWNjaF9maWxsaW5nKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0eXBlLCAKKwkJICAgICAgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworaW50IHJzbF9jaGFuX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCBjaGFuX25yLAorCQkgICAgICB1X2ludDhfdCBhY3RfdHlwZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgKmNoYW5fbW9kZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX2lkZW50ICpjaGFuX2lkZW50LAorCQkgICAgICB1X2ludDhfdCBic19wb3dlciwgdV9pbnQ4X3QgbXNfcG93ZXIsCisJCSAgICAgIHVfaW50OF90IHRhKTsKK2ludCByc2xfY2hhbl9hY3RpdmF0ZV9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgYWN0X3R5cGUsIAorCQkJICAgIHVfaW50OF90IHRhLCB1X2ludDhfdCBob19yZWYpOworaW50IHJzbF9jaGFuX21vZGVfbW9kaWZ5X3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICp0cyk7CitpbnQgcnNsX2VuY3J5cHRpb25fY21kKHN0cnVjdCBtc2diICptc2cpOworaW50IHJzbF9wYWdpbmdfY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHBhZ2luZ19ncm91cCwgdV9pbnQ4X3QgbGVuLAorCQkgICB1X2ludDhfdCAqbXNfaWRlbnQsIHVfaW50OF90IGNoYW5fbmVlZGVkKTsKK2ludCByc2xfcGFnaW5nX2NtZF9zdWJzY3Ioc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgY2hhbl9uZWVkZWQsCisJCQkgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IHJzbF9pbW1fYXNzaWduX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBsZW4sIHVfaW50OF90ICp2YWwpOworCitpbnQgcnNsX2RhdGFfcmVxdWVzdChzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKTsKK2ludCByc2xfZXN0YWJsaXNoX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpOworaW50IHJzbF9yZWxhc2VfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCk7CisKKy8qIFNpZW1lbnMgdmVuZG9yLXNwZWNpZmljIFJTTCBleHRlbnNpb25zICovCitpbnQgcnNsX3NpZW1lbnNfbXJwY2koc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCByc2xfbXJwY2kgKm1ycGNpKTsKKworLyogaXAuYWNjZXNzIHNwZWNmaWMgUlNMIGV4dGVuc2lvbnMgKi8KK2ludCByc2xfaXBhY2NfY3JjeChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgcnNsX2lwYWNjX21kY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBpcCwKKwkJICAgdV9pbnQxNl90IHBvcnQsIHVfaW50OF90IHJ0cF9wYXlsb2FkMik7CitpbnQgcnNsX2lwYWNjX21kY3hfdG9fcnRwc29jayhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgcnNsX2lwYWNjX3BkY2hfYWN0aXZhdGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIGludCBhY3QpOworCitpbnQgYWJpc19yc2xfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCit1bnNpZ25lZCBpbnQgZ2V0X3BhZ2luZ19ncm91cCh1X2ludDY0X3QgaW1zaSwgdW5zaWduZWQgaW50IGJzX2NjX2NoYW5zLAorCQkJICAgICAgaW50IG5fcGFnX2Jsb2Nrcyk7Cit1bnNpZ25lZCBpbnQgbl9wYWdfYmxvY2tzKGludCBic19jY2NoX3NkY2NoX2NvbWIsIHVuc2lnbmVkIGludCBic19hZ19ibGtzX3Jlcyk7Cit1X2ludDY0X3Qgc3RyX3RvX2ltc2koY29uc3QgY2hhciAqaW1zaV9zdHIpOwordV9pbnQ4X3QgbGNoYW4yY2hhbl9ucihjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgcnNsX3JlbGVhc2VfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCk7CisKK2ludCByc2xfbGNoYW5fc2V0X3N0YXRlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQpOworCisvKiB0byBiZSBwcm92aWRlZCBieSBleHRlcm5hbCBjb2RlICovCitpbnQgYWJpc19yc2xfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCByc2xfZGVhY3Rfc2FjY2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCisvKiBCQ0NIIHJlbGF0ZWQgY29kZSAqLworaW50IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NfY2hhbnMoaW50IGNjY2hfY29uZik7CitpbnQgcnNsX2NjY2hfY29uZl90b19ic19jY2NoX3NkY2NoX2NvbWIoaW50IGNjY2hfY29uZik7CitpbnQgcnNsX251bWJlcl9vZl9wYWdpbmdfc3ViY2hhbm5lbHMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKK2ludCByc2xfY2hhbl9ic19wb3dlcl9jdHJsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1bnNpZ25lZCBpbnQgZnBjLCBpbnQgZGIpOworaW50IHJzbF9jaGFuX21zX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYm0pOworCisjZW5kaWYgLyogUlNMX01UX0ggKi8KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX2FwaS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTM0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ic2NfYXBpLmgKQEAgLTAsMCArMSw2IEBACisvKiBHU00gMDguMDggbGlrZSBBUEkgZm9yIE9wZW5CU0MgKi8KKworI2luY2x1ZGUgImdzbV9kYXRhLmgiCisKKworaW50IGdzbTA4MDhfc3VibWl0X2R0YXAoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2csIGludCBsaW5rX2lkKTsKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19ybGwuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19ybGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjg5OGQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX3JsbC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0JTQ19STExfSAorI2RlZmluZSBfQlNDX1JMTF9ICisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKK2VudW0gYnNjX3JsbHJfaW5kIHsKKwlCU0NfUkxMUl9JTkRfRVNUX0NPTkYsCisJQlNDX1JMTFJfSU5EX1JFTF9JTkQsCisJQlNDX1JMTFJfSU5EX0VSUl9JTkQsCisJQlNDX1JMTFJfSU5EX1RJTUVPVVQsCit9OworCitpbnQgcmxsX2VzdGFibGlzaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwKKwkJICB2b2lkICgqY2IpKHN0cnVjdCBnc21fbGNoYW4gKiwgdV9pbnQ4X3QsIHZvaWQgKiwKKwkJCSAgICAgZW51bSBic2Nfcmxscl9pbmQpLAorCQkgIHZvaWQgKmRhdGEpOwordm9pZCBybGxfaW5kaWNhdGlvbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwgdV9pbnQ4X3QgdHlwZSk7CisKKyNlbmRpZiAvKiBfQlNDX1JMTF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jaGFuX2FsbG9jLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jaGFuX2FsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmNTg1OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NoYW5fYWxsb2MuaApAQCAtMCwwICsxLDY3IEBACisvKiBNYW5hZ2VtZW50IGZ1bmN0aW9ucyB0byBhbGxvY2F0ZS9yZWxlYXNlIHN0cnVjdCBnc21fbGNoYW4gKi8KKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgX0NIQU5fQUxMT0NfSAorI2RlZmluZSBfQ0hBTl9BTExPQ19ICisKKyNpbmNsdWRlICJnc21fc3Vic2NyaWJlci5oIgorCisvKiBTcGVjaWFsIGFsbG9jYXRvciBmb3IgQzAgb2YgQlRTICovCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2MwX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJICAgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbik7CisKKy8qIFJlZ3VsYXIgcGh5c2ljYWwgY2hhbm5lbCBhbGxvY2F0b3IgKi8KK3N0cnVjdCBnc21fYnRzX3RyeF90cyAqdHNfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQllbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKTsKKworLyogUmVndWxhciBwaHlzaWNhbCBjaGFubmVsIChUUykgKi8KK3ZvaWQgdHNfZnJlZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKTsKKworLyogRmluZCBhbiBhbGxvY2F0ZWQgY2hhbm5lbCAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fZmluZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CisKKy8qIEZpbmQgYW4gYWxsb2NhdGVkIGNoYW5uZWwgZm9yIGEgc3BlY2lmaWVkIHN1YnNjcmliZXIgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCisvKiBBbGxvY2F0ZSBhIGxvZ2ljYWwgY2hhbm5lbCAoU0RDQ0gsIFRDSCwgLi4uKSAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBnc21fY2hhbl90IHR5cGUpOworCisvKiBGcmVlIGEgbG9naWNhbCBjaGFubmVsIChTRENDSCwgVENILCAuLi4pICovCit2b2lkIGxjaGFuX2ZyZWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOwordm9pZCBsY2hhbl9yZXNldChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKKy8qIENvbnNpZGVyIHJlbGVhc2luZyB0aGUgY2hhbm5lbCAqLworaW50IGxjaGFuX2F1dG9fcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKK3N0cnVjdCBsb2FkX2NvdW50ZXIgeworCXVuc2lnbmVkIGludCB0b3RhbDsKKwl1bnNpZ25lZCBpbnQgdXNlZDsKK307CisKK3N0cnVjdCBwY2hhbl9sb2FkIHsKKwlzdHJ1Y3QgbG9hZF9jb3VudGVyIHBjaGFuW0dTTV9QQ0hBTl9VTktOT1dOXTsKK307CisKK3ZvaWQgYnRzX2NoYW5fbG9hZChzdHJ1Y3QgcGNoYW5fbG9hZCAqY2wsIGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMpOwordm9pZCBuZXR3b3JrX2NoYW5fbG9hZChzdHJ1Y3QgcGNoYW5fbG9hZCAqcGwsIHN0cnVjdCBnc21fbmV0d29yayAqbmV0KTsKKworaW50IHRyeF9pc191c2FibGUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworCisjZW5kaWYgLyogX0NIQU5fQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGIuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhMTI3OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RiLmgKQEAgLTAsMCArMSw3MSBAQAorLyogKEMpIDIwMDggYnkgSmFuIEx1ZWJiZSA8amx1ZWJiZUBkZWJpYW4ub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX0RCX0gKKyNkZWZpbmUgX0RCX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorCisvKiBvbmUgdGltZSBpbml0aWFsaXNhdGlvbiAqLworaW50IGRiX2luaXQoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZGJfcHJlcGFyZSgpOworaW50IGRiX2ZpbmkoKTsKKworLyogc3Vic2NyaWJlciBtYW5hZ2VtZW50ICovCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIGRiX2NyZWF0ZV9zdWJzY3JpYmVyKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgICAgY2hhciAqaW1zaSk7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIGRiX2dldF9zdWJzY3JpYmVyKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgZW51bSBnc21fc3Vic2NyaWJlcl9maWVsZCBmaWVsZCwKKwkJCQkJIGNvbnN0IGNoYXIgKnN1YnNjcik7CitpbnQgZGJfc3luY19zdWJzY3JpYmVyKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlcik7CitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlcik7CitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY19leHRlbihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIpOworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfdG9rZW4oc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyLCB1X2ludDMyX3QqIHRva2VuKTsKK2ludCBkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkoc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyLCBjaGFyICppbWVpKTsKK2ludCBkYl9zeW5jX2VxdWlwbWVudChzdHJ1Y3QgZ3NtX2VxdWlwbWVudCAqZXF1aXApOworCisvKiBhdXRoIGluZm8gKi8KK2ludCBnZXRfYXV0aGluZm9fYnlfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2ludCBzZXRfYXV0aGluZm9fZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyAqYWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IGdldF9hdXRodHVwbGVfYnlfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2ludCBzZXRfYXV0aHR1cGxlX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKKworLyogU01TIHN0b3JlLWFuZC1mb3J3YXJkICovCitpbnQgZGJfc21zX3N0b3JlKHN0cnVjdCBnc21fc21zICpzbXMpOworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1bnNpZ25lZCBsb25nIGxvbmcgbWluX2lkKTsKK3N0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudF9ieV9zdWJzY3Ioc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVuc2lnbmVkIGxvbmcgbG9uZyBtaW5fc3Vic2NyX2lkKTsKK3N0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2ludCBkYl9zbXNfbWFya19zZW50KHN0cnVjdCBnc21fc21zICpzbXMpOworCisvKiBBUERVIGJsb2Igc3RvcmFnZSAqLworaW50IGRiX2FwZHVfYmxvYl9zdG9yZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwgCisJCQl1X2ludDhfdCBhcGR1X2lkX2ZsYWdzLCB1X2ludDhfdCBsZW4sCisJCQl1X2ludDhfdCAqYXBkdSk7CisKKy8qIFN0YXRpc3RpY3MgY291bnRlciBzdG9yYWdlICovCitpbnQgZGJfc3RvcmVfY291bnRlcihzdHJ1Y3QgY291bnRlciAqY3RyKTsKKworI2VuZGlmIC8qIF9EQl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kZWJ1Zy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWM1YTY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGVidWcuaApAQCAtMCwwICsxLDUyIEBACisjaWZuZGVmIF9ERUJVR19ICisjZGVmaW5lIF9ERUJVR19ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8b3Ntb2NvcmUvbG9nZ2luZy5oPgorCisvKiBEZWJ1ZyBBcmVhcyBvZiB0aGUgY29kZSAqLworZW51bSB7CisJRFJMTCwKKwlEQ0MsCisJRE1NLAorCURSUiwKKwlEUlNMLAorCUROTSwKKwlETU5DQywKKwlEU01TLAorCURQQUcsCisJRE1FQVMsCisJRE1JLAorCURNSUIsCisJRE1VWCwKKwlESU5QLAorCURTQ0NQLAorCURNU0MsCisJRE1HQ1AsCisJREhPLAorCUREQiwKKwlEUkVGLAorCURlYnVnX0xhc3RFbnRyeSwKK307CisKKy8qIGNvbnRleHQgKi8KKyNkZWZpbmUgQlNDX0NUWF9MQ0hBTgkwCisjZGVmaW5lIEJTQ19DVFhfU1VCU0NSCTEKKyNkZWZpbmUgQlNDX0NUWF9CVFMJMgorI2RlZmluZSBCU0NfQ1RYX1NDQ1AJMworCisvKiB0YXJnZXQgKi8KKworZW51bSB7CisJLy9ERUJVR19GSUxURVJfQUxMID0gMSA8PCAwLAorCUxPR19GSUxURVJfSU1TSSA9IDEgPDwgMSwKK307CisKK3ZvaWQgbG9nX3NldF9pbXNpX2ZpbHRlcihzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICppbXNpKTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsb2dfaW5mbyBsb2dfaW5mbzsKKworI2VuZGlmIC8qIF9ERUJVR19IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9lMV9pbnB1dC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZTFfaW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTNkOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZTFfaW5wdXQuaApAQCAtMCwwICsxLDE2OCBAQAorI2lmbmRlZiBfRTFfSU5QVVRfSAorI2RlZmluZSBfRTFfSU5QVVRfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKworI2RlZmluZSBOVU1fRTFfVFMgICAzMgorCitlbnVtIGUxaW5wX3NpZ25fdHlwZSB7CisJRTFJTlBfU0lHTl9OT05FLAorCUUxSU5QX1NJR05fT01MLAorCUUxSU5QX1NJR05fUlNMLAorfTsKK2NvbnN0IGNoYXIgKmUxaW5wX3NpZ250eXBlX25hbWUoZW51bSBlMWlucF9zaWduX3R5cGUgdHApOworCitzdHJ1Y3QgZTFpbnBfdHM7CisKK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgeworCS8qIGxpc3Qgb2Ygc2lnbmFsbGluZyBsaW5rcyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiB0byB3aGljaCB0aW1lc2xvdCBkbyB3ZSBiZWxvbmc/ICovCisJc3RydWN0IGUxaW5wX3RzICp0czsKKworCWVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGU7CisKKwkvKiB0cnggZm9yIG1zZy0+dHJ4IG9mIHJlY2VpdmVkIG1zZ3MgKi8JCisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwkvKiBtc2diIHF1ZXVlIG9mIHRvLWJlLXRyYW5zbWl0dGVkIG1zZ3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9saXN0OworCisJLyogU0FQSSBhbmQgVEVJIG9uIHRoZSBFMSBUUyAqLworCXVfaW50OF90IHNhcGk7CisJdV9pbnQ4X3QgdGVpOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQ4X3QgY2hhbm5lbDsKKwkJfSBtaXNkbjsKKwl9IGRyaXZlcjsKK307CisKK2VudW0gZTFpbnBfdHNfdHlwZSB7CisJRTFJTlBfVFNfVFlQRV9OT05FLAorCUUxSU5QX1RTX1RZUEVfU0lHTiwKKwlFMUlOUF9UU19UWVBFX1RSQVUsCit9OworY29uc3QgY2hhciAqZTFpbnBfdHN0eXBlX25hbWUoZW51bSBlMWlucF90c190eXBlIHRwKTsKKworLyogQSB0aW1lc2xvdCBpbiB0aGUgRTEgaW50ZXJmYWNlICovCitzdHJ1Y3QgZTFpbnBfdHMgeworCWVudW0gZTFpbnBfdHNfdHlwZSB0eXBlOworCWludCBudW07CisKKwkvKiB0byB3aGljaCBsaW5lIGRvIHdlIGJlbG9uZyA/ICovCisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKiBsaXN0IG9mIGFsbCBzaWduYWxsaW5nIGxpbmtzIG9uIHRoaXMgVFMgKi8KKwkJCXN0cnVjdCBsbGlzdF9oZWFkIHNpZ25fbGlua3M7CisJCQkvKiB0aW1lciB3aGVuIHRvIGRlcXVldWUgbmV4dCBmcmFtZSAqLworCQkJc3RydWN0IHRpbWVyX2xpc3QgdHhfdGltZXI7CisJCX0gc2lnbjsKKwkJc3RydWN0IHsKKwkJCS8qIHN1YmNoYW5uZWwgZGVtdXhlciBmb3IgZnJhbWVzIGZyb20gRTEgKi8KKwkJCXN0cnVjdCBzdWJjaF9kZW11eCBkZW11eDsKKwkJCS8qIHN1YmNoYW5uZWwgbXV4ZXIgZm9yIGZyYW1lcyB0byBFMSAqLworCQkJc3RydWN0IHN1YmNoX211eCBtdXg7CisJCX0gdHJhdTsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIG1JU0ROIGRyaXZlciBoYXMgb25lIGZkIGZvciBlYWNoIHRzICovCisJCQlzdHJ1Y3QgYnNjX2ZkIGZkOworCQl9IG1pc2RuOworCQlzdHJ1Y3QgeworCQkJLyogaXAuYWNjZXNzIGRyaXZlciBoYXMgb25lIGZkIGZvciBlYWNoIHRzICovCisJCQlzdHJ1Y3QgYnNjX2ZkIGZkOworCQl9IGlwYWNjZXNzOworCisJfSBkcml2ZXI7Cit9OworCitzdHJ1Y3QgZTFpbnBfZHJpdmVyIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqd2FudF93cml0ZSkoc3RydWN0IGUxaW5wX3RzICp0cyk7Cit9OwkKKworc3RydWN0IGUxaW5wX2xpbmUgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgaW50IG51bTsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogYXJyYXkgb2YgdGltZXN0bG90cyAqLworCXN0cnVjdCBlMWlucF90cyB0c1tOVU1fRTFfVFNdOworCisJc3RydWN0IGUxaW5wX2RyaXZlciAqZHJpdmVyOworCXZvaWQgKmRyaXZlcl9kYXRhOworfTsKKworLyogcmVnaXN0ZXIgYSBkcml2ZXIgd2l0aCB0aGUgRTEgY29yZSAqLworaW50IGUxaW5wX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcnYpOworCisvKiByZWdpc3RlciBhIGxpbmUgd2l0aCB0aGUgRTEgY29yZSAqLworaW50IGUxaW5wX2xpbmVfcmVnaXN0ZXIoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpOworCisvKiBlbnN1cmUgYSBjZXJ0YWluIGxpbmUgZXhpc3RzLCByZXR1cm4gcG9pbnRlciB0byBpdCAqLworc3RydWN0IGUxaW5wX2xpbmUgKmUxaW5wX2xpbmVfZ2V0X2NyZWF0ZSh1X2ludDhfdCBlMV9ucik7CisKKy8qIGZpbmQgYSBzaWduX2xpbmsgZm9yIGdpdmVuIFRFSSBhbmQgU0FQSSBpbiBhIFRTICovCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoKK2UxaW5wX2xvb2t1cF9zaWduX2xpbmsoc3RydWN0IGUxaW5wX3RzICp0cywgdV9pbnQ4X3QgdGVpLAorCQkJdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIGNyZWF0ZSBhIG5ldyBzaWduYWxsaW5nIGxpbmsgaW4gYSBFMSB0aW1lc2xvdCAqLworc3RydWN0IGUxaW5wX3NpZ25fbGluayAqCitlMWlucF9zaWduX2xpbmtfY3JlYXRlKHN0cnVjdCBlMWlucF90cyAqdHMsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdGVpLAorCQkJdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIGNvbmZpZ3VyZSBhbmQgaW5pdGlhbGl6ZSBvbmUgZTFpbnBfdHMgKi8KK2ludCBlMWlucF90c19jb25maWcoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsCisJCSAgICBlbnVtIGUxaW5wX3RzX3R5cGUgdHlwZSk7CisKKy8qIENhbGwgZnJvbSB0aGUgU3RhY2s6IGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBUUyBoYXMgY2hhbmdlZCAqLworaW50IGUxaW5wX3VwZGF0ZV90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzKTsKKworLyogUmVjZWl2ZSBhIHBhY2tldCBmcm9tIHRoZSBFMSBkcml2ZXIgKi8KK2ludCBlMWlucF9yeF90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQl1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpOworCisvKiBjYWxsZWQgYnkgZHJpdmVyIGlmIGl0IHdhbnRzIHRvIHRyYW5zbWl0IG9uIGEgZ2l2ZW4gVFMgKi8KK3N0cnVjdCBtc2diICplMWlucF90eF90cyhzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cywKKwkJCSBzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoqc2lnbl9saW5rKTsKKworLyogY2FsbGVkIGJ5IGRyaXZlciBpbiBjYXNlIHNvbWUga2luZCBvZiBsaW5rIHN0YXRlIGV2ZW50ICovCitpbnQgZTFpbnBfZXZlbnQoc3RydWN0IGUxaW5wX3RzICp0cywgaW50IGV2dCwgdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKTsKKworLyogV3JpdGUgTEFQRCBmcmFtZXMgdG8gdGhlIGZkLiAqLwordm9pZCBlMV9zZXRfcGNhcF9mZChpbnQgZmQpOworCisvKiBjYWxsZWQgYnkgVFJBVSBtdXhlciB0byBvYnRhaW4gdGhlIGRlc3RpbmF0aW9uIG11eCBlbnRpdHkgKi8KK3N0cnVjdCBzdWJjaF9tdXggKmUxaW5wX2dldF9tdXgodV9pbnQ4X3QgZTFfbnIsIHVfaW50OF90IHRzX25yKTsKKwordm9pZCBlMWlucF9zaWduX2xpbmtfZGVzdHJveShzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rKTsKK2ludCBlMWlucF9saW5lX3VwZGF0ZShzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSk7CisKKy8qIGUxX2NvbmZpZy5jICovCitpbnQgZTFfcmVjb25maWdfdHMoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyk7CitpbnQgZTFfcmVjb25maWdfdHJ4KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKK2ludCBlMV9yZWNvbmZpZ19idHMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKK2ludCBpYV9jb25maWdfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbik7CitpbnQgaXBhY2Nlc3Nfc2V0dXAoc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQpOworCitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgZTFpbnBfZHJpdmVyX2xpc3Q7CitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgZTFpbnBfbGluZV9saXN0OworCisjZW5kaWYgLyogX0UxX0lOUFVUX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzA4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmM2JkNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOC5oCkBAIC0wLDAgKzEsNTUgQEAKKyNpZm5kZWYgX0dTTV8wNF8wOF9ICisjZGVmaW5lIF9HU01fMDRfMDhfSAorCisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDguaD4KKworc3RydWN0IG1zZ2I7CitzdHJ1Y3QgZ3NtX2J0czsKK3N0cnVjdCBnc21fc3Vic2NyaWJlcjsKK3N0cnVjdCBnc21fbmV0d29yazsKK3N0cnVjdCBnc21fdHJhbnM7CisKKy8qIGNvbmZpZyBvcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGxvd2VyIGxldmVzICovCit2b2lkIGdzbTA0MDhfYWxsb3dfZXZlcnlvbmUoaW50IGFsbG93KTsKKworaW50IGdzbTA0MDhfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpOworZW51bSBnc21fY2hhbl90IGdldF9jdHlwZV9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpOworZW51bSBnc21fY2hyZXFfcmVhc29uX3QgZ2V0X3JlYXNvbl9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpOworCitpbnQgZ3NtNDhfdHhfbW1faW5mbyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90ICpyYW5kLCBpbnQga2V5X3NlcSk7CitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZWooc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworc3RydWN0IG1zZ2IgKmdzbTQ4X21zZ2JfYWxsb2Modm9pZCk7CitpbnQgZ3NtNDhfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucyk7CisKK2ludCBnc200OF9zZW5kX3JyX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IGdzbTQ4X3NlbmRfcnJfY2lwaF9tb2RlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgd2FudF9pbWVpc3YpOworaW50IGdzbTQ4X3NlbmRfcnJfYXBwX2luZm8oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFwZHVfaWQsCisJCQkgICB1X2ludDhfdCBhcGR1X2xlbiwgY29uc3QgdV9pbnQ4X3QgKmFwZHUpOworaW50IGdzbTQ4X3NlbmRfcnJfYXNzX2NtZChzdHJ1Y3QgZ3NtX2xjaGFuICpkZXN0X2xjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgcG93ZXJfY2xhc3MpOworaW50IGdzbTQ4X3NlbmRfaG9fY21kKHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbiwgc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuLAorCQkgICAgICB1X2ludDhfdCBwb3dlcl9jb21tYW5kLCB1X2ludDhfdCBob19yZWYpOworCitpbnQgYnNjX3VwcXVldWUoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitpbnQgbW5jY19zZW5kKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbXNnX3R5cGUsIHZvaWQgKmFyZyk7CisKKy8qIGNvbnZlcnQgYSBBU0NJSSBwaG9uZSBudW1iZXIgdG8gY2FsbC1jb250cm9sIEJDRCAqLworaW50IGVuY29kZV9iY2RfbnVtYmVyKHVfaW50OF90ICpiY2RfbHYsIHVfaW50OF90IG1heF9sZW4sCisJCSAgICAgIGludCBoX2xlbiwgY29uc3QgY2hhciAqaW5wdXQpOworaW50IGRlY29kZV9iY2RfbnVtYmVyKGNoYXIgKm91dHB1dCwgaW50IG91dHB1dF9sZW4sIGNvbnN0IHVfaW50OF90ICpiY2RfbHYsCisJCSAgICAgIGludCBoX2xlbik7CisKK2ludCBzZW5kX3NpZW1lbnNfbXJwY2koc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90ICpjbGFzc21hcmsyX2x2KTsKK2ludCBnc200OF9wYWdpbmdfZXh0cmFjdF9taShzdHJ1Y3QgbXNnYiAqbXNnLCBjaGFyICptaV9zdHJpbmcsIHVfaW50OF90ICptaV90eXBlKTsKK2ludCBnc200OF9oYW5kbGVfcGFnaW5nX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCitpbnQgZ3NtNDhfbGNoYW5fbW9kaWZ5KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsY2hhbl9tb2RlKTsKK2ludCBnc200OF9yeF9ycl9tb2RpZl9hY2soc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgZ3NtNDhfcGFyc2VfbWVhc19yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqcmVwLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8xMS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyN2FmMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8xMS5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX0dTTV8wNF8xMV9ICisjZGVmaW5lIF9HU01fMDRfMTFfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzExLmg+CisKKy8qIFNNUyBkZWxpdmVyIFBEVSAqLworc3RydWN0IHNtc19kZWxpdmVyIHsKKwl1X2ludDhfdCBtdGk6MjsJCS8qIG1lc3NhZ2UgdHlwZSBpbmRpY2F0b3IgKi8KKwl1X2ludDhfdCBtbXM6MTsJCS8qIG1vcmUgbWVzc2FnZXMgdG8gc2VuZCAqLworCXVfaW50OF90IHJwOjE7CQkvKiByZXBseSBwYXRoICovCisJdV9pbnQ4X3QgdWRoaToxOwkvKiB1c2VyIGRhdGEgaGVhZGVyIGluZGljYXRvciAqLworCXVfaW50OF90IHNyaToxOwkJLyogc3RhdHVzIHJlcG9ydCBpbmRpY2F0aW9uICovCisJdV9pbnQ4X3QgKm9yaWdfYWRkcjsJLyogb3JpZ2luYXRpbmcgYWRkcmVzcyAqLworCXVfaW50OF90IHBpZDsJCS8qIHByb3RvY29sIGlkZW50aWZpZXIgKi8KKwl1X2ludDhfdCBkY3M7CQkvKiBkYXRhIGNvZGluZyBzY2hlbWUgKi8KKwkJCQkvKiBzZXJ2aWNlIGNlbnRyZSB0aW1lIHN0YW1wICovCisJdV9pbnQ4X3QgdWRfbGVuOwkvKiB1c2VyIGRhdGEgbGVuZ3RoICovCisJdV9pbnQ4X3QgKnVzZXJfZGF0YTsJLyogdXNlciBkYXRhICovCisKKwl1X2ludDhfdCBtc2dfcmVmOwkvKiBtZXNzYWdlIHJlZmVyZW5jZSAqLworCXVfaW50OF90ICpzbXNjOworfTsKKworc3RydWN0IG1zZ2I7CisKK2ludCBnc20wNDExX3Jjdl9zbXMoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCk7CisKK2ludCBnc200MTFfc2VuZF9zbXNfbGNoYW4oc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBnc21fc21zICpzbXMpOworCitzdHJ1Y3QgZ3NtX3NtcyAqc21zX2FsbG9jKHZvaWQpOwordm9pZCBzbXNfZnJlZShzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKKwordm9pZCBfZ3NtNDExX3Ntc190cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKTsKK2ludCBnc200MTFfc2VuZF9zbXNfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICAgc3RydWN0IGdzbV9zbXMgKnNtcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF84MC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhYjFjNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF84MC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX0dTTV8wNF84MF9ICisjZGVmaW5lIF9HU01fMDRfODBfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oPgorCisjZGVmaW5lIE1BWF9MRU5fVVNTRF9TVFJJTkcJMzEKKworc3RydWN0IHVzc2RfcmVxdWVzdCB7CisJCQljaGFyIHRleHRbTUFYX0xFTl9VU1NEX1NUUklORyArIDFdOworCQkJdV9pbnQ4X3QgdHJhbnNhY3Rpb25faWQ7CisJCQl1X2ludDhfdCBpbnZva2VfaWQ7Cit9OworCitpbnQgZ3NtMDQ4MF9kZWNvZGVfdXNzZF9yZXF1ZXN0KGNvbnN0IHN0cnVjdCBtc2diICptc2csIAorCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcXVlc3QpOyAKK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZXNwb25zZShjb25zdCBzdHJ1Y3QgbXNnYiAqaW5fbXNnLCBjb25zdCBjaGFyKiByZXNwb25zZV90ZXh0LCAKKwkJCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitpbnQgZ3NtMDQ4MF9zZW5kX3Vzc2RfcmVqZWN0KGNvbnN0IHN0cnVjdCBtc2diICptc2csIAorCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcXVlc3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9kYXRhLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZjVjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fZGF0YS5oCkBAIC0wLDAgKzEsNzM5IEBACisjaWZuZGVmIF9HU01fREFUQV9ICisjZGVmaW5lIF9HU01fREFUQV9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyB7CisJR1NNX1BDSEFOX05PTkUsCisJR1NNX1BDSEFOX0NDQ0gsCisJR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0LAorCUdTTV9QQ0hBTl9UQ0hfRiwKKwlHU01fUENIQU5fVENIX0gsCisJR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDLAorCUdTTV9QQ0hBTl9QRENILAkJLyogR1BSUyBQRENIICovCisJR1NNX1BDSEFOX1RDSF9GX1BEQ0gsCS8qIFRDSC9GIGlmIHVzZWQsIFBEQ0ggb3RoZXJ3aXNlICovCisJR1NNX1BDSEFOX1VOS05PV04sCit9OworCitlbnVtIGdzbV9jaGFuX3QgeworCUdTTV9MQ0hBTl9OT05FLAorCUdTTV9MQ0hBTl9TRENDSCwKKwlHU01fTENIQU5fVENIX0YsCisJR1NNX0xDSEFOX1RDSF9ILAorCUdTTV9MQ0hBTl9VTktOT1dOLAorfTsKKworLyogUlJMUCBtb2RlIG9mIG9wZXJhdGlvbiAqLworZW51bSBycmxwX21vZGUgeworCVJSTFBfTU9ERV9OT05FLAorCVJSTFBfTU9ERV9NU19CQVNFRCwKKwlSUkxQX01PREVfTVNfUFJFRiwKKwlSUkxQX01PREVfQVNTX1BSRUYsCit9OworCisvKiBDaGFubmVsIFJlcXVlc3QgcmVhc29uICovCitlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCB7CisJR1NNX0NIUkVRX1JFQVNPTl9FTUVSRywKKwlHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlHU01fQ0hSRVFfUkVBU09OX0NBTEwsCisJR1NNX0NIUkVRX1JFQVNPTl9MT0NBVElPTl9VUEQsCisJR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKK307CisKKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbW5jYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2JpdHZlYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3N0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorCisjZGVmaW5lIFRSWF9OUl9UUwk4CisjZGVmaW5lIFRTX01BWF9MQ0hBTgk4CisKKyNkZWZpbmUgSEFSRENPREVEX0FSRkNOIDEyMworI2RlZmluZSBIQVJEQ09ERURfVFNDCTcKKyNkZWZpbmUgSEFSRENPREVEX0JTSUMJMHgzZgkvKiBOQ0MgPSA3IC8gQkNDID0gNyAqLworCisvKiBmb3IgbXVsdGktZHJvcCBjb25maWcgKi8KKyNkZWZpbmUgSEFSRENPREVEX0JUUzBfVFMJMQorI2RlZmluZSBIQVJEQ09ERURfQlRTMV9UUwk2CisjZGVmaW5lIEhBUkRDT0RFRF9CVFMyX1RTCTExCisKK2VudW0gZ3NtX2hvb2tzIHsKKwlHU01fSE9PS19OTV9TV0xPQUQsCisJR1NNX0hPT0tfUlJfUEFHSU5HLAorfTsKKworZW51bSBnc21fcGFnaW5nX2V2ZW50IHsKKwlHU01fUEFHSU5HX1NVQ0NFRURFRCwKKwlHU01fUEFHSU5HX0VYUElSRUQsCisJR1NNX1BBR0lOR19PT00sCit9OworCitlbnVtIGJ0c19ncHJzX21vZGUgeworCUJUU19HUFJTX05PTkUgPSAwLAorCUJUU19HUFJTX0dQUlMgPSAxLAorCUJUU19HUFJTX0VHUFJTID0gMiwKK307CisKKy8qIHRoZSBkYXRhIHN0cnVjdHVyZSBzdG9yZWQgaW4gbXNnYi0+Y2IgZm9yIG9wZW5ic2MgYXBwcyAqLworc3RydWN0IG9wZW5ic2NfbXNnYl9jYiB7CisJdW5zaWduZWQgY2hhciAqZ21taDsKKwl1X2ludDMyX3QgdGxsaTsKK307CisjZGVmaW5lIE9CU0NfTVNHQl9DQihfX21zZ2IpCSgoc3RydWN0IG9wZW5ic2NfbXNnYl9jYiAqKSYoKF9fbXNnYiktPmNiWzBdKSkKKworc3RydWN0IG1zZ2I7Cit0eXBlZGVmIGludCBnc21fY2Jmbih1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJICAgICB1bnNpZ25lZCBpbnQgZXZlbnQsCisJCSAgICAgc3RydWN0IG1zZ2IgKm1zZywKKwkJICAgICB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSk7CisKKy8qCisgKiBVc2UgdGhlIGNoYW5uZWwuIEFzIHNpZGUgZWZmZWN0IHRoZSBsY2hhbm5lbCByZWN5Y2xlIHRpbWVyCisgKiB3aWxsIGJlIHN0YXJ0ZWQuCisgKi8KKyNkZWZpbmUgTENIQU5fUkVMRUFTRV9USU1FT1VUIDIwLCAwCisjZGVmaW5lIHVzZV9zdWJzY3JfY29uKGNvbikgXAorCWRvIHsJKGNvbiktPnVzZV9jb3VudCsrOyBcCisJCURFQlVHUChEUkVGLCAibGNoYW4gKGJ0cz0lZCx0cng9JWQsdHM9JWQsY2g9JWQpIGluY3JlYXNlcyB1c2FnZSB0bzogJWRcbiIsIFwKKwkJCShjb24pLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgKGNvbiktPmxjaGFuLT50cy0+dHJ4LT5uciwgKGNvbiktPmxjaGFuLT50cy0+bnIsIFwKKwkJCShjb24pLT5sY2hhbi0+bnIsIChjb24pLT51c2VfY291bnQpOyBcCisJCWJzY19zY2hlZHVsZV90aW1lcigmKGNvbiktPnJlbGVhc2VfdGltZXIsIExDSEFOX1JFTEVBU0VfVElNRU9VVCk7IH0gd2hpbGUoMCk7CisKKyNkZWZpbmUgcHV0X3N1YnNjcl9jb24oY29uKSBcCisJZG8geyAoY29uKS0+dXNlX2NvdW50LS07IFwKKwkJREVCVUdQKERSRUYsICJsY2hhbiAoYnRzPSVkLHRyeD0lZCx0cz0lZCxjaD0lZCkgZGVjcmVhc2VzIHVzYWdlIHRvOiAlZFxuIiwgXAorCQkJKGNvbiktPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCAoY29uKS0+bGNoYW4tPnRzLT50cngtPm5yLCAoY29uKS0+bGNoYW4tPnRzLT5uciwgXAorCQkJKGNvbiktPmxjaGFuLT5uciwgKGNvbiktPnVzZV9jb3VudCk7IFwKKwl9IHdoaWxlKDApOworCisKKy8qIFJlYWwgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gY29udGFpbmluZyBLaSAqLworZW51bSBnc21fYXV0aF9hbGdvIHsKKwlBVVRIX0FMR09fTk9ORSwKKwlBVVRIX0FMR09fWE9SLAorCUFVVEhfQUxHT19DT01QMTI4djEsCit9OworCitzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyB7CisJZW51bSBnc21fYXV0aF9hbGdvIGF1dGhfYWxnbzsKKwl1bnNpZ25lZCBpbnQgYTNhOF9raV9sZW47CisJdV9pbnQ4X3QgYTNhOF9raVsxNl07Cit9OworCitzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgeworCWludCB1c2VfY291bnQ7CisJaW50IGtleV9zZXE7CisJdV9pbnQ4X3QgcmFuZFsxNl07CisJdV9pbnQ4X3Qgc3Jlc1s0XTsKKwl1X2ludDhfdCBrY1s4XTsKK307CisKKworc3RydWN0IGdzbV9sY2hhbjsKK3N0cnVjdCBnc21fc3Vic2NyaWJlcjsKK3N0cnVjdCBnc21fbW5jYzsKK3N0cnVjdCBydHBfc29ja2V0OworCisvKiBOZXR3b3JrIE1hbmFnZW1lbnQgU3RhdGUgKi8KK3N0cnVjdCBnc21fbm1fc3RhdGUgeworCXVfaW50OF90IG9wZXJhdGlvbmFsOworCXVfaW50OF90IGFkbWluaXN0cmF0aXZlOworCXVfaW50OF90IGF2YWlsYWJpbGl0eTsKK307CisKKy8qCisgKiBMT0NBVElPTiBVUERBVElORyBSRVFVRVNUIHN0YXRlCisgKgorICogT3VyIGN1cnJlbnQgb3BlcmF0aW9uIGlzOgorICoJLSBHZXQgaW1laS90bXNpCisgKgktIEFjY2VwdC9SZWplY3QgYWNjb3JkaW5nIHRvIGdsb2JhbCBwb2xpY3kKKyAqLworc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uIHsKKyAgICAgICAgc3RydWN0IHRpbWVyX2xpc3QgdXBkYXRpbmdfdGltZXI7CisJdW5zaWduZWQgaW50IHdhaXRpbmdfZm9yX2ltc2kgOiAxOworCXVuc2lnbmVkIGludCB3YWl0aW5nX2Zvcl9pbWVpIDogMTsKK307CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG5laWdoYm9yIGNlbGxzIHdob3NlIGF2ZXJhZ2Ugd2UgdHJhY2sgKi8KKyNkZWZpbmUgTUFYX05FSUdIX01FQVMJCTEwCisvKiBNYXhpbXVtIHNpemUgb2YgdGhlIGF2ZXJhZ2luZyB3aW5kb3cgZm9yIG5laWdoYm9yIGNlbGxzICovCisjZGVmaW5lIE1BWF9XSU5fTkVJR0hfQVZHCTEwCisKKy8qIHByb2Nlc3NlZCBuZWlnaGJvciBtZWFzdXJlbWVudHMgZm9yIG9uZSBjZWxsICovCitzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jIHsKKwl1X2ludDE2X3QgYXJmY247CisJdV9pbnQ4X3QgYnNpYzsKKwl1X2ludDhfdCByeGxldltNQVhfV0lOX05FSUdIX0FWR107CisJdW5zaWduZWQgaW50IHJ4bGV2X2NudDsKKwl1X2ludDhfdCBsYXN0X3NlZW5fbnI7Cit9OworCisjZGVmaW5lIE1BWF9BNV9LRVlfTEVOCSgxMjgvOCkKKyNkZWZpbmUgUlNMX0VOQ19BTEdfQTUoeCkJKHgrMSkKKworLyogaXMgdGhlIGRhdGEgbGluayBlc3RhYmxpc2hlZD8gd2hvIGVzdGFibGlzaGVkIGl0PyAqLworI2RlZmluZSBMQ0hBTl9TQVBJX1VOVVNFRAkwCisjZGVmaW5lIExDSEFOX1NBUElfTVMJCTEKKyNkZWZpbmUgTENIQU5fU0FQSV9ORVQJCTIKKworLyogc3RhdGUgb2YgYSBsb2dpY2FsIGNoYW5uZWwgKi8KK2VudW0gZ3NtX2xjaGFuX3N0YXRlIHsKKwlMQ0hBTl9TX05PTkUsCQkvKiBjaGFubmVsIGlzIG5vdCBhY3RpdmUgKi8KKwlMQ0hBTl9TX0FDVF9SRVEsCS8qIGNoYW5uZWwgYWN0aXZhdGluIHJlcXVlc3RlZCAqLworCUxDSEFOX1NfQUNUSVZFLAkJLyogY2hhbm5lbCBpcyBhY3RpdmUgYW5kIG9wZXJhdGlvbmFsICovCisJTENIQU5fU19SRUxfUkVRLAkvKiBjaGFubmVsIHJlbGVhc2UgaGFzIGJlZW4gcmVxdWVzdGVkICovCisJTENIQU5fU19JTkFDVElWRSwJLyogY2hhbm5lbCBpcyBzZXQgaW5hY3RpdmUgKi8KK307CisKKy8qIHRoZSBwZXIgc3Vic2NyaWJlciBkYXRhIGZvciBsY2hhbiAqLworc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24geworCS8qIFRvIHdob20gd2UgYXJlIGFsbG9jYXRlZCBhdCB0aGUgbW9tZW50ICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiBUaW1lciBzdGFydGVkIHRvIHJlbGVhc2UgdGhlIGNoYW5uZWwgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCByZWxlYXNlX3RpbWVyOworCisJLyoKKwkgKiBPcGVyYXRpb25zIHRoYXQgaGF2ZSBhIHN0YXRlIGFuZCBtaWdodCBiZSBwZW5kaW5nCisJICovCisJc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uICpsb2Nfb3BlcmF0aW9uOworCisJLyogdXNlIGNvdW50LiBob3cgbWFueSB1c2VycyB1c2UgdGhpcyBjaGFubmVsICovCisJdW5zaWduZWQgaW50IHVzZV9jb3VudDsKKworCS8qIEFyZSB3ZSBwYXJ0IG9mIGEgc3BlY2lhbCAic2lsZW50IiBjYWxsICovCisJaW50IHNpbGVudF9jYWxsOworCisJLyogYmFjayBwb2ludGVycyAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXN0cnVjdCBnc21fYnRzICpidHM7Cit9OworCitzdHJ1Y3QgZ3NtX2xjaGFuIHsKKwkvKiBUaGUgVFMgdGhhdCB3ZSdyZSBwYXJ0IG9mICovCisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKwkvKiBUaGUgbG9naWNhbCBzdWJzbG90IG51bWJlciBpbiB0aGUgVFMgKi8KKwl1X2ludDhfdCBucjsKKwkvKiBUaGUgbG9naWNhbCBjaGFubmVsIHR5cGUgKi8KKwllbnVtIGdzbV9jaGFuX3QgdHlwZTsKKwkvKiBSU0wgY2hhbm5lbCBtb2RlICovCisJZW51bSByc2xfY21vZF9zcGQgcnNsX2Ntb2RlOworCS8qIElmIFRDSCwgdHJhZmZpYyBjaGFubmVsIG1vZGUgKi8KKwllbnVtIGdzbTQ4X2NoYW5fbW9kZSB0Y2hfbW9kZTsKKwkvKiBTdGF0ZSAqLworCWVudW0gZ3NtX2xjaGFuX3N0YXRlIHN0YXRlOworCS8qIFBvd2VyIGxldmVscyBmb3IgTVMgYW5kIEJUUyAqLworCXVfaW50OF90IGJzX3Bvd2VyOworCXVfaW50OF90IG1zX3Bvd2VyOworCS8qIEVuY3J5cHRpb24gaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgeworCQl1X2ludDhfdCBhbGdfaWQ7CisJCXVfaW50OF90IGtleV9sZW47CisJCXVfaW50OF90IGtleVtNQVhfQTVfS0VZX0xFTl07CisJfSBlbmNyOworCisJc3RydWN0IHRpbWVyX2xpc3QgVDMxMDE7CisKKwkvKiBBTVIgYml0cyAqLworCXN0cnVjdCBnc200OF9tdWx0aV9yYXRlX2NvbmYgbXJfY29uZjsKKwkKKwkvKiBFc3RhYmxpc2hlZCBkYXRhIGxpbmsgbGF5ZXIgc2VydmljZXMgKi8KKwl1X2ludDhfdCBzYXBpc1s4XTsKKworCS8qIGNhY2hlIG9mIGxhc3QgbWVhc3VyZW1lbnQgcmVwb3J0cyBvbiB0aGlzIGxjaGFuICovCisJc3RydWN0IGdzbV9tZWFzX3JlcCBtZWFzX3JlcFs2XTsKKwlpbnQgbWVhc19yZXBfaWR4OworCisJLyogdGFibGUgb2YgbmVpZ2hib3IgY2VsbCBtZWFzdXJlbWVudHMgKi8KKwlzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jIG5laWdoX21lYXNbTUFYX05FSUdIX01FQVNdOworCisJc3RydWN0IHsKKwkJdV9pbnQzMl90IGJvdW5kX2lwOworCQl1X2ludDMyX3QgY29ubmVjdF9pcDsKKwkJdV9pbnQxNl90IGJvdW5kX3BvcnQ7CisJCXVfaW50MTZfdCBjb25uZWN0X3BvcnQ7CisJCXVfaW50MTZfdCBjb25uX2lkOworCQl1X2ludDhfdCBydHBfcGF5bG9hZDsKKwkJdV9pbnQ4X3QgcnRwX3BheWxvYWQyOworCQl1X2ludDhfdCBzcGVlY2hfbW9kZTsKKwkJc3RydWN0IHJ0cF9zb2NrZXQgKnJ0cF9zb2NrZXQ7CisJfSBhYmlzX2lwOworCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gY29ubjsKK307CisKK3N0cnVjdCBnc21fZTFfc3Vic2xvdCB7CisJLyogTnVtYmVyIG9mIEUxIGxpbmsgKi8KKwl1X2ludDhfdAllMV9ucjsKKwkvKiBOdW1iZXIgb2YgRTEgVFMgaW5zaWRlIEUxIGxpbmsgKi8KKwl1X2ludDhfdAllMV90czsKKwkvKiBTdWItc2xvdCB3aXRoaW4gdGhlIEUxIFRTLCAweGZmIGlmIGZ1bGwgVFMgKi8KKwl1X2ludDhfdAllMV90c19zczsKK307CisKKyNkZWZpbmUgVFNfRl9QRENIX01PREUJMHgxMDAwCisvKiBPbmUgVGltZXNsb3QgaW4gYSBUUlggKi8KK3N0cnVjdCBnc21fYnRzX3RyeF90cyB7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJLyogbnVtYmVyIG9mIHRoaXMgdGltZXNsb3QgYXQgdGhlIFRSWCAqLworCXVfaW50OF90IG5yOworCisJZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbjsKKworCXVuc2lnbmVkIGludCBmbGFnczsKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCXN0cnVjdCB0bHZfcGFyc2VkIG5tX2F0dHI7CisJdV9pbnQ4X3Qgbm1fY2hhbl9jb21iOworCisJLyogVG8gd2hpY2ggRTEgc3Vic2xvdCBhcmUgd2UgY29ubmVjdGVkICovCisJc3RydWN0IGdzbV9lMV9zdWJzbG90IGUxX2xpbms7CisKKwlzdHJ1Y3QgZ3NtX2xjaGFuIGxjaGFuW1RTX01BWF9MQ0hBTl07Cit9OworCisvKiBPbmUgVFJYIGluIGEgQlRTICovCitzdHJ1Y3QgZ3NtX2J0c190cnggeworCS8qIGxpc3QgaGVhZGVyIGluIGJ0cy0+dHJ4X2xpc3QgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwkvKiBudW1iZXIgb2YgdGhpcyBUUlggaW4gdGhlIEJUUyAqLworCXVfaW50OF90IG5yOworCS8qIGhvdyBkbyB3ZSB0YWxrIFJTTCB3aXRoIHRoaXMgVFJYPyAqLworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCByc2xfZTFfbGluazsKKwl1X2ludDhfdCByc2xfdGVpOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnJzbF9saW5rOworCisJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCBubV9hdHRyOworCXN0cnVjdCB7CisJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJfSBiYl90cmFuc2M7CisKKwl1X2ludDE2X3QgYXJmY247CisJaW50IG5vbWluYWxfcG93ZXI7CQkvKiBpbiBkQm0gKi8KKwl1bnNpZ25lZCBpbnQgbWF4X3Bvd2VyX3JlZDsJLyogaW4gYWN0dWFsIGRCICovCisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJCQl9IGJic2lnOworCQkJc3RydWN0IHsKKwkJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJfSBwYTsKKwkJfSBiczExOworCX07CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzIHRzW1RSWF9OUl9UU107Cit9OworCitlbnVtIGdzbV9idHNfdHlwZSB7CisJR1NNX0JUU19UWVBFX1VOS05PV04sCisJR1NNX0JUU19UWVBFX0JTMTEsCisJR1NNX0JUU19UWVBFX05BTk9CVFMsCit9OworCitzdHJ1Y3QgZ3NtX2J0c19tb2RlbCB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCWVudW0gZ3NtX2J0c190eXBlIHR5cGU7CisJY29uc3QgY2hhciAqbmFtZTsKKworCXN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmOworfTsKKworLyoqCisgKiBBIHBlbmRpbmcgcGFnaW5nIHJlcXVlc3QgCisgKi8KK3N0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgeworCS8qIGxpc3RfaGVhZCBmb3IgbGlzdCBvZiBhbGwgcGFnaW5nIHJlcXVlc3RzICovCisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisJLyogdGhlIHN1YnNjcmliZXIgd2hpY2ggd2UncmUgcGFnaW5nLiBMYXRlciBnc21fcGFnaW5nX3JlcXVlc3QKKwkgKiBzaG91bGQgcHJvYmFibHkgYmVjb21lIGEgcGFydCBvZiB0aGUgZ3NtX3N1YnNjcmliZXIgc3RydWN0PyAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCS8qIGJhY2stcG9pbnRlciB0byB0aGUgQlRTIG9uIHdoaWNoIHdlIGFyZSBwYWdpbmcgKi8KKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCS8qIHdoYXQga2luZCBvZiBjaGFubmVsIHR5cGUgZG8gd2UgYXNrIHRoZSBNUyB0byBlc3RhYmxpc2ggKi8KKwlpbnQgY2hhbl90eXBlOworCisJLyogVGltZXIgMzExMzogaG93IGxvbmcgZG8gd2UgdHJ5IHRvIHBhZ2U/ICovCisJc3RydWN0IHRpbWVyX2xpc3QgVDMxMTM7CisKKwkvKiBjYWxsYmFjayB0byBiZSBjYWxsZWQgaW4gY2FzZSBwYWdpbmcgY29tcGxldGVzICovCisJZ3NtX2NiZm4gKmNiZm47CisJdm9pZCAqY2Jmbl9wYXJhbTsKK307CisKKy8qCisgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBwYWdpbmcgc3RhdHVzIG9mIG9uZSBCVFMuIEl0CisgKiBpbmNsdWRlcyBhIG51bWJlciBvZiBwZW5kaW5nIHJlcXVlc3RzLCBhIGJhY2sgcG9pbnRlcgorICogdG8gdGhlIGdzbV9idHMsIGEgdGltZXIgYW5kIHNvbWUgbW9yZSBzdGF0ZS4KKyAqLworc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlIHsKKwkvKiBwZW5kaW5nIHJlcXVlc3RzICovCisJc3RydWN0IGxsaXN0X2hlYWQgcGVuZGluZ19yZXF1ZXN0czsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJc3RydWN0IHRpbWVyX2xpc3Qgd29ya190aW1lcjsKKworCS8qIGxvYWQgKi8KKwl1X2ludDE2X3QgYXZhaWxhYmxlX3Nsb3RzOworfTsKKworc3RydWN0IGdzbV9lbnZhYnRzZSB7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKK307CisKK3N0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgaWQ7CisJdV9pbnQxNl90IG5zdmNpOworCXVfaW50MTZfdCBsb2NhbF9wb3J0OworCXVfaW50MTZfdCByZW1vdGVfcG9ydDsKKwl1X2ludDMyX3QgcmVtb3RlX2lwOworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7Cit9OworCisvKiBPbmUgQlRTICovCitzdHJ1Y3QgZ3NtX2J0cyB7CisJLyogbGlzdCBoZWFkZXIgaW4gbmV0LT5idHNfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcms7CisJLyogbnVtYmVyIG9mIHRocyBCVFMgaW4gbmV0d29yayAqLworCXVfaW50OF90IG5yOworCS8qIENlbGwgSWRlbnRpdHkgKi8KKwl1X2ludDE2X3QgY2VsbF9pZGVudGl0eTsKKwkvKiBsb2NhdGlvbiBhcmVhIGNvZGUgb2YgdGhpcyBCVFMgKi8KKwl1X2ludDE2X3QgbG9jYXRpb25fYXJlYV9jb2RlOworCS8qIFRyYWluaW5nIFNlcXVlbmNlIENvZGUgKi8KKwl1X2ludDhfdCB0c2M7CisJLyogQmFzZSBTdGF0aW9uIElkZW50aWZpY2F0aW9uIENvZGUgKEJTSUMpICovCisJdV9pbnQ4X3QgYnNpYzsKKwkvKiB0eXBlIG9mIEJUUyAqLworCWVudW0gZ3NtX2J0c190eXBlIHR5cGU7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsOworCWVudW0gZ3NtX2JhbmQgYmFuZDsKKwkvKiBzaG91bGQgdGhlIGNoYW5uZWwgYWxsb2NhdG9yIGFsbG9jYXRlIGNoYW5uZWxzIGZyb20gaGlnaCBUUlggdG8gVFJYMCwKKwkgKiByYXRoZXIgdGhhbiBzdGFydGluZyBmcm9tIFRSWDAgYW5kIGdvIHVwd2FyZHM/ICovCisJaW50IGNoYW5fYWxsb2NfcmV2ZXJzZTsKKwkvKiBtYXhpbXVtIFR4IHBvd2VyIHRoYXQgdGhlIE1TIGlzIHBlcm1pdHRlZCB0byB1c2UgaW4gdGhpcyBjZWxsICovCisJaW50IG1zX21heF9wb3dlcjsKKworCS8qIGhvdyBkbyB3ZSB0YWxrIE9NTCB3aXRoIHRoaXMgVFJYPyAqLworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBvbWxfZTFfbGluazsKKwl1X2ludDhfdCBvbWxfdGVpOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKm9tbF9saW5rOworCisJLyogQWJpcyBuZXR3b3JrIG1hbmFnZW1lbnQgTyZNIGhhbmRsZSAqLworCXN0cnVjdCBhYmlzX25tX2ggKm5taDsKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCXN0cnVjdCB0bHZfcGFyc2VkIG5tX2F0dHI7CisKKwkvKiBudW1iZXIgb2YgdGhpcyBCVFMgb24gZ2l2ZW4gRTEgbGluayAqLworCXVfaW50OF90IGJ0c19ucjsKKworCS8qIHBhZ2luZyBzdGF0ZSBhbmQgY29udHJvbCAqLworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSBwYWdpbmc7CisKKwkvKiBDQ0NIIGlzIG9uIEMwICovCisJc3RydWN0IGdzbV9idHNfdHJ4ICpjMDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJfSBzaXRlX21ncjsKKworCS8qIHBhcmFtZXRlcnMgZnJvbSB3aGljaCB3ZSBidWlsZCBTWVNURU0gSU5GT1JNQVRJT04gKi8KKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sIHJhY2hfY29udHJvbDsKKwkJdV9pbnQ4X3QgbmNjX3Blcm1pdHRlZDsKKwkJc3RydWN0IGdzbTQ4X2NlbGxfc2VsX3BhciBjZWxsX3NlbF9wYXI7CisJCXN0cnVjdCBnc200OF9jZWxsX29wdGlvbnMgY2VsbF9vcHRpb25zOworCQlzdHJ1Y3QgZ3NtNDhfY29udHJvbF9jaGFubmVsX2Rlc2NyIGNoYW5fZGVzYzsKKwkJc3RydWN0IGJpdHZlYyBuZWlnaF9saXN0OworCQlzdHJ1Y3QgYml0dmVjIGNlbGxfYWxsb2M7CisJCXN0cnVjdCB7CisJCQkvKiBiaXRtYXNrIGxhcmdlIGVub3VnaCBmb3IgYWxsIHBvc3NpYmxlIEFSRkNOJ3MgKi8KKwkJCXVfaW50OF90IG5laWdoX2xpc3RbMTAyNC84XTsKKwkJCXVfaW50OF90IGNlbGxfYWxsb2NbMTAyNC84XTsKKwkJfSBkYXRhOworCX0gc2lfY29tbW9uOworCisJLyogaXAuYWNjZXNzcyBVbml0IElEJ3MgaGF2ZSBTaXRlL0JUUy9UUlggbGF5b3V0ICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQxNl90IHNpdGVfaWQ7CisJCQl1X2ludDE2X3QgYnRzX2lkOworCQkJdV9pbnQzMl90IGZsYWdzOworCQl9IGlwX2FjY2VzczsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gY2NsazsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gcmFjazsKKwkJCXN0cnVjdCBnc21fZW52YWJ0c2UgZW52YWJ0c2VbNF07CisJCX0gYnMxMTsKKwl9OworCisJLyogTm90IGVudGlyZWx5IHN1cmUgaG93IGlwLmFjY2VzcyBzcGVjaWZpYyB0aGlzIGlzICovCisJc3RydWN0IHsKKwkJZW51bSBidHNfZ3Byc19tb2RlIG1vZGU7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJdV9pbnQxNl90IG5zZWk7CisJCX0gbnNlOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCXVfaW50MTZfdCBidmNpOworCQl9IGNlbGw7CisJCXN0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyBuc3ZjWzJdOworCQl1X2ludDhfdCByYWM7CisJfSBncHJzOworCisJLyogUkFDSCBOTSB2YWx1ZXMgKi8KKwlpbnQgcmFjaF9iX3RocmVzaDsKKwlpbnQgcmFjaF9sZGF2Z19zbG90czsKKwkKKwkvKiB0cmFuc2NlaXZlcnMgKi8KKwlpbnQgbnVtX3RyeDsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0cnhfbGlzdDsKK307CisKKy8qIFNvbWUgc3RhdGlzdGljcyBvZiBvdXIgbmV0d29yayAqLworc3RydWN0IGdzbW5ldF9zdGF0cyB7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKnRvdGFsOworCQlzdHJ1Y3QgY291bnRlciAqbm9fY2hhbm5lbDsKKwl9IGNocmVxOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICphdHRlbXB0ZWQ7CisJCXN0cnVjdCBjb3VudGVyICpub19jaGFubmVsOwkvKiBubyBjaGFubmVsIGF2YWlsYWJsZSAqLworCQlzdHJ1Y3QgY291bnRlciAqdGltZW91dDsJCS8qIFQzMTAzIHRpbWVvdXQgKi8KKwkJc3RydWN0IGNvdW50ZXIgKmNvbXBsZXRlZDsJLyogSE8gQ09NUEwgcmVjZWl2ZWQgKi8KKwkJc3RydWN0IGNvdW50ZXIgKmZhaWxlZDsJCS8qIEhPIEZBSUwgcmVjZWl2ZWQgKi8KKwl9IGhhbmRvdmVyOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICphdHRhY2g7CisJCXN0cnVjdCBjb3VudGVyICpub3JtYWw7CisJCXN0cnVjdCBjb3VudGVyICpwZXJpb2RpYzsKKwkJc3RydWN0IGNvdW50ZXIgKmRldGFjaDsKKwl9IGxvY191cGRfdHlwZTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqcmVqZWN0OworCQlzdHJ1Y3QgY291bnRlciAqYWNjZXB0OworCX0gbG9jX3VwZF9yZXNwOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICphdHRlbXB0ZWQ7CisJCXN0cnVjdCBjb3VudGVyICpkZXRhY2hlZDsKKwkJc3RydWN0IGNvdW50ZXIgKmNvbXBsZXRlZDsKKwkJc3RydWN0IGNvdW50ZXIgKmV4cGlyZWQ7CisJfSBwYWdpbmc7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKnN1Ym1pdHRlZDsgLyogTU8gU01TIHN1Ym1pc3Npb25zICovCisJCXN0cnVjdCBjb3VudGVyICpub19yZWNlaXZlcjsKKwkJc3RydWN0IGNvdW50ZXIgKmRlbGl2ZXJlZDsgLyogTVQgU01TIGRlbGl2ZXJpZXMgKi8KKwkJc3RydWN0IGNvdW50ZXIgKnJwX2Vycl9tZW07CisJCXN0cnVjdCBjb3VudGVyICpycF9lcnJfb3RoZXI7CisJfSBzbXM7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKmRpYWxsZWQ7CS8qIHRvdGFsIG51bWJlciBvZiBkaWFsbGVkIGNhbGxzICovCisJCXN0cnVjdCBjb3VudGVyICphbGVydGVkOwkvKiB3ZSBhbGVydGVkIHRoZSBvdGhlciBlbmQgKi8KKwkJc3RydWN0IGNvdW50ZXIgKmNvbm5lY3RlZDsvKiBob3cgbWFueSBjYWxscyB3ZXJlIGFjY2VwdGVkICovCisJfSBjYWxsOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpyZl9mYWlsOworCQlzdHJ1Y3QgY291bnRlciAqcmxsX2VycjsKKwl9IGNoYW47CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKm9tbF9mYWlsOworCQlzdHJ1Y3QgY291bnRlciAqcnNsX2ZhaWw7CisJfSBidHM7Cit9OworCitlbnVtIGdzbV9hdXRoX3BvbGljeSB7CisJR1NNX0FVVEhfUE9MSUNZX0NMT1NFRCwgLyogb25seSBzdWJzY3JpYmVycyBhdXRob3JpemVkIGluIERCICovCisJR1NNX0FVVEhfUE9MSUNZX0FDQ0VQVF9BTEwsIC8qIGFjY2VwdCBldmVyeW9uZSwgZXZlbiBpZiBub3QgYXV0aG9yaXplZCBpbiBEQiAqLworCUdTTV9BVVRIX1BPTElDWV9UT0tFTiwgLyogYWNjZXB0IGZpcnN0LCBzZW5kIHRva2VuIHBlciBzbXMsIHRoZW4gcmV2b2tlIGF1dGhvcml6YXRpb24gKi8KK307CisKKyNkZWZpbmUgR1NNX1QzMTAxX0RFRkFVTFQgMTAKKyNkZWZpbmUgR1NNX1QzMTEzX0RFRkFVTFQgNjAKKworc3RydWN0IGdzbV9uZXR3b3JrIHsKKwkvKiBnbG9iYWwgcGFyYW1ldGVycyAqLworCXVfaW50MTZfdCBjb3VudHJ5X2NvZGU7CisJdV9pbnQxNl90IG5ldHdvcmtfY29kZTsKKwljaGFyICpuYW1lX2xvbmc7CisJY2hhciAqbmFtZV9zaG9ydDsKKwllbnVtIGdzbV9hdXRoX3BvbGljeSBhdXRoX3BvbGljeTsKKwllbnVtIGdzbTQ4X3JlamVjdF92YWx1ZSByZWplY3RfY2F1c2U7CisJaW50IGE1X2VuY3J5cHRpb247CisJaW50IG5lY2k7CisJaW50IHNlbmRfbW1faW5mbzsKKwlzdHJ1Y3QgeworCQlpbnQgYWN0aXZlOworCQkvKiBXaW5kb3cgUlhMRVYgYXZlcmFnaW5nICovCisJCXVuc2lnbmVkIGludCB3aW5fcnhsZXZfYXZnOwkvKiBudW1iZXIgb2YgU0FDQ0ggZnJhbWVzICovCisJCS8qIFdpbmRvdyBSWFFVQUwgYXZlcmFnaW5nICovCisJCXVuc2lnbmVkIGludCB3aW5fcnhxdWFsX2F2ZzsJLyogbnVtYmVyIG9mIFNBQ0NIIGZyYW1lcyAqLworCQkvKiBXaW5kb3cgUlhMRVYgbmVpZ2hib3VyaW5nIGNlbGxzIGF2ZXJhZ2luZyAqLworCQl1bnNpZ25lZCBpbnQgd2luX3J4bGV2X2F2Z19uZWlnaDsgLyogbnVtYmVyIG9mIFNBQ0NIIGZyYW1lcyAqLworCisJCS8qIGhvdyBvZnRlbiBzaG91bGQgd2UgY2hlY2sgZm9yIHBvd2VyIGJ1ZGdldCBITyAqLworCQl1bnNpZ25lZCBpbnQgcHdyX2ludGVydmFsOwkvKiBTQUNDSCBmcmFtZXMgKi8KKwkJLyogaG93IG11Y2ggYmV0dGVyIGRvZXMgYSBuZWlnaGJvciBjZWxsIGhhdmUgdG8gYmUgPyAqLworCQl1bnNpZ25lZCBpbnQgcHdyX2h5c3RlcmVzaXM7CS8qIGRCbSAqLworCQkvKiBtYXhpbXVtIGRpc3RhY25lIGJlZm9yZSB3ZSB0cnkgYSBoYW5kb3ZlciAqLworCQl1bnNpZ25lZCBpbnQgbWF4X2Rpc3RhbmNlOwkvKiBUQSB2YWx1ZXMgKi8KKwl9IGhhbmRvdmVyOworCisJc3RydWN0IGdzbW5ldF9zdGF0cyBzdGF0czsKKworCS8qIGxheWVyIDQgKi8KKwlpbnQgKCptbmNjX3JlY3YpIChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1zZ190eXBlLCB2b2lkICphcmcpOworCXN0cnVjdCBsbGlzdF9oZWFkIHVwcXVldWU7CisJc3RydWN0IGxsaXN0X2hlYWQgdHJhbnNfbGlzdDsKKworCXVuc2lnbmVkIGludCBudW1fYnRzOworCXN0cnVjdCBsbGlzdF9oZWFkIGJ0c19saXN0OworCisJLyogdGltZXIgdmFsdWVzICovCisJaW50IFQzMTAxOworCWludCBUMzEwMzsKKwlpbnQgVDMxMDU7CisJaW50IFQzMTA3OworCWludCBUMzEwOTsKKwlpbnQgVDMxMTE7CisJaW50IFQzMTEzOworCWludCBUMzExNTsKKwlpbnQgVDMxMTc7CisJaW50IFQzMTE5OworCWludCBUMzE0MTsKKworCS8qIFJhZGlvIFJlc291cmNlIExvY2F0aW9uIFByb3RvY29sIChUUyAwNC4zMSkgKi8KKwlzdHJ1Y3QgeworCQllbnVtIHJybHBfbW9kZSBtb2RlOworCX0gcnJscDsKK307CisKKyNkZWZpbmUgU01TX0hEUl9TSVpFCTEyOAorI2RlZmluZSBTTVNfVEVYVF9TSVpFCTI1Ngorc3RydWN0IGdzbV9zbXMgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBpZDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnNlbmRlcjsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnJlY2VpdmVyOworCisJdW5zaWduZWQgbG9uZyB2YWxpZGl0eV9taW51dGVzOworCXVfaW50OF90IHJlcGx5X3BhdGhfcmVxOworCXVfaW50OF90IHN0YXR1c19yZXBfcmVxOworCXVfaW50OF90IHVkX2hkcl9pbmQ7CisJdV9pbnQ4X3QgcHJvdG9jb2xfaWQ7CisJdV9pbnQ4X3QgZGF0YV9jb2Rpbmdfc2NoZW1lOworCXVfaW50OF90IG1zZ19yZWY7CisJY2hhciBkZXN0X2FkZHJbMjArMV07CS8qIERBIExWIGlzIDEyIGJ5dGVzIG1heCwgaS5lLiAxMCBieXRlcworCQkJCSAqIEJDRCA9PSAyMCBieXRlcyBzdHJpbmcgKi8KKwl1X2ludDhfdCB1c2VyX2RhdGFfbGVuOworCXVfaW50OF90IHVzZXJfZGF0YVtTTVNfVEVYVF9TSVpFXTsKKworCWNoYXIgdGV4dFtTTVNfVEVYVF9TSVpFXTsKK307CisKKworc3RydWN0IGdzbV9uZXR3b3JrICpnc21fbmV0d29ya19pbml0KHVfaW50MTZfdCBjb3VudHJ5X2NvZGUsIHVfaW50MTZfdCBuZXR3b3JrX2NvZGUsCisJCQkJICAgICBpbnQgKCptbmNjX3JlY3YpKHN0cnVjdCBnc21fbmV0d29yayAqLCBpbnQsIHZvaWQgKikpOworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfYWxsb2Moc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUsCisJCQkgICAgICB1X2ludDhfdCB0c2MsIHVfaW50OF90IGJzaWMpOworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBnc21fc2V0X2J0c190eXBlKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUpOworCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19udW0oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBudW0pOworCisvKiBHZXQgcmVmZXJlbmNlIHRvIGEgbmVpZ2hib3IgY2VsbCBvbiBhIGdpdmVuIEJDQ0ggQVJGQ04gKi8KK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX25laWdoYm9yKGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJIHVfaW50MTZfdCBhcmZjbiwgdV9pbnQ4X3QgYnNpYyk7CisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfbnVtKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBudW0pOworCitjb25zdCBjaGFyICpnc21fcGNoYW5fbmFtZShlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIGMpOworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBnc21fcGNoYW5fcGFyc2UoY29uc3QgY2hhciAqbmFtZSk7Citjb25zdCBjaGFyICpnc21fbGNoYW50X25hbWUoZW51bSBnc21fY2hhbl90IGMpOworY29uc3QgY2hhciAqZ3NtX2NocmVxX25hbWUoZW51bSBnc21fY2hyZXFfcmVhc29uX3QgYyk7CitjaGFyICpnc21fdHJ4X25hbWUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworY2hhciAqZ3NtX3RzX25hbWUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyk7CitjaGFyICpnc21fbGNoYW5fbmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7Citjb25zdCBjaGFyICpnc21fbGNoYW5zX25hbWUoZW51bSBnc21fbGNoYW5fc3RhdGUgcyk7CisKK2VudW0gZ3NtX2UxX2V2ZW50IHsKKwlFVlRfRTFfTk9ORSwKKwlFVlRfRTFfVEVJX1VQLAorCUVWVF9FMV9URUlfRE4sCit9OworCit2b2lkIHNldF90c19lMWxpbmsoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgZTFfbnIsCisJCSAgIHVfaW50OF90IGUxX3RzLCB1X2ludDhfdCBlMV90c19zcyk7CitlbnVtIGdzbV9idHNfdHlwZSBwYXJzZV9idHN0eXBlKGNvbnN0IGNoYXIgKmFyZyk7Citjb25zdCBjaGFyICpidHN0eXBlMnN0cihlbnVtIGdzbV9idHNfdHlwZSB0eXBlKTsKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYnlfbnIoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG5yKTsKK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX2J5X2xhYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgaW50IGxhYywKKwkJCQlzdHJ1Y3QgZ3NtX2J0cyAqc3RhcnRfYnRzKTsKKworZXh0ZXJuIHZvaWQgKnRhbGxfYnNjX2N0eDsKK2V4dGVybiBpbnQgaXBhY2NfcnRwX2RpcmVjdDsKKworc3RhdGljIGlubGluZSBpbnQgaXNfaXBhY2Nlc3NfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NpZW1lbnNfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitlbnVtIGdzbV9hdXRoX3BvbGljeSBnc21fYXV0aF9wb2xpY3lfcGFyc2UoY29uc3QgY2hhciAqYXJnKTsKK2NvbnN0IGNoYXIgKmdzbV9hdXRoX3BvbGljeV9uYW1lKGVudW0gZ3NtX2F1dGhfcG9saWN5IHBvbGljeSk7CisKK2VudW0gcnJscF9tb2RlIHJybHBfbW9kZV9wYXJzZShjb25zdCBjaGFyICphcmcpOworY29uc3QgY2hhciAqcnJscF9tb2RlX25hbWUoZW51bSBycmxwX21vZGUgbW9kZSk7CisKK2VudW0gYnRzX2dwcnNfbW9kZSBidHNfZ3Byc19tb2RlX3BhcnNlKGNvbnN0IGNoYXIgKmFyZyk7Citjb25zdCBjaGFyICpidHNfZ3Byc19tb2RlX25hbWUoZW51bSBidHNfZ3Byc19tb2RlIG1vZGUpOworCit2b2lkIGdzbV90cnhfbG9ja19yZihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgaW50IGxvY2tlZCk7CisKKy8qIEEgcGFyc2VkIEdQUlMgcm91dGluZyBhcmVhICovCitzdHJ1Y3QgZ3Byc19yYV9pZCB7CisJdV9pbnQxNl90CW1uYzsKKwl1X2ludDE2X3QJbWNjOworCXVfaW50MTZfdAlsYWM7CisJdV9pbnQ4X3QJcmFjOworfTsKKworaW50IGdzbTQ4X3JhX2lkX2J5X2J0cyh1X2ludDhfdCAqYnVmLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK3ZvaWQgZ3Byc19yYV9pZF9ieV9idHMoc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQsIHN0cnVjdCBnc21fYnRzICpidHMpOworc3RydWN0IGdzbV9tZWFzX3JlcCAqbGNoYW5fbmV4dF9tZWFzX3JlcChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKK2ludCBnc21fYnRzX21vZGVsX3JlZ2lzdGVyKHN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1Mzk5NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmgKQEAgLTAsMCArMSw5NSBAQAorI2lmbmRlZiBfR1NNX1NVQlNDUl9ICisjZGVmaW5lIF9HU01fU1VCU0NSX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgImdzbV9kYXRhLmgiCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisKKyNkZWZpbmUgR1NNX0lNRUlfTEVOR1RIIDE3CisjZGVmaW5lIEdTTV9JTVNJX0xFTkdUSCAxNworI2RlZmluZSBHU01fTkFNRV9MRU5HVEggMTI4CisKKyNkZWZpbmUgR1NNX0VYVEVOU0lPTl9MRU5HVEggMTUgLyogTVNJU0ROIGNhbiBvbmx5IGJlIDE1IGRpZ2l0cyBsZW5ndGggKi8KKyNkZWZpbmUgR1NNX01JTl9FWFRFTiAyMDAwMAorI2RlZmluZSBHU01fTUFYX0VYVEVOIDQ5OTk5CisKKy8qIHJlc2VydmVkIGFjY29yZGluZyB0byBHU00gMDMuMDMgwqcgMi40ICovCisjZGVmaW5lIEdTTV9SRVNFUlZFRF9UTVNJICAgMHhGRkZGRkZGRgorCisKKyNkZWZpbmUgR1NNX1NVQlNDUklCRVJfRklSU1RfQ09OVEFDVAkweDAwMDAwMDAxCisjZGVmaW5lIHRtc2lfZnJvbV9zdHJpbmcoc3RyKSBzdHJ0b3VsKHN0ciwgTlVMTCwgMTApCisKK3N0cnVjdCBnc21fZXF1aXBtZW50IHsKKwlsb25nIGxvbmcgdW5zaWduZWQgaW50IGlkOworCWNoYXIgaW1laVtHU01fSU1FSV9MRU5HVEhdOworCWNoYXIgbmFtZVtHU01fTkFNRV9MRU5HVEhdOworCisJc3RydWN0IGdzbTQ4X2NsYXNzbWFyazEgY2xhc3NtYXJrMTsKKwl1X2ludDhfdCBjbGFzc21hcmsyX2xlbjsKKwl1X2ludDhfdCBjbGFzc21hcmsyWzNdOworCXVfaW50OF90IGNsYXNzbWFyazNfbGVuOworCXVfaW50OF90IGNsYXNzbWFyazNbMTRdOworfTsKKworc3RydWN0IGdzbV9zdWJzY3JpYmVyIHsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKwlsb25nIGxvbmcgdW5zaWduZWQgaW50IGlkOworCWNoYXIgaW1zaVtHU01fSU1TSV9MRU5HVEhdOworCXVfaW50MzJfdCB0bXNpOworCXVfaW50MTZfdCBsYWM7CisJY2hhciBuYW1lW0dTTV9OQU1FX0xFTkdUSF07CisJY2hhciBleHRlbnNpb25bR1NNX0VYVEVOU0lPTl9MRU5HVEhdOworCWludCBhdXRob3JpemVkOworCisJLyogVGVtcG9yYXJ5IGZpZWxkIHdoaWNoIGlzIG5vdCBzdG9yZWQgaW4gdGhlIERCL0hMUiAqLworCXVfaW50MzJfdCBmbGFnczsKKworCS8qIEV2ZXJ5IHVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgZXF1aXBtZW50IGluIHVzZSBhdCBhbnkgZ2l2ZW4KKwkgKiBwb2ludCBpbiB0aW1lICovCisJc3RydWN0IGdzbV9lcXVpcG1lbnQgZXF1aXBtZW50OworCisJLyogZm9yIGludGVybmFsIG1hbmFnZW1lbnQgKi8KKwlpbnQgdXNlX2NvdW50OworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJLyogcGVuZGluZyByZXF1ZXN0cyAqLworCWludCBpbl9jYWxsYmFjazsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCByZXF1ZXN0czsKK307CisKK2VudW0gZ3NtX3N1YnNjcmliZXJfZmllbGQgeworCUdTTV9TVUJTQ1JJQkVSX0lNU0ksCisJR1NNX1NVQlNDUklCRVJfVE1TSSwKKwlHU01fU1VCU0NSSUJFUl9FWFRFTlNJT04sCisJR1NNX1NVQlNDUklCRVJfSUQsCit9OworCitlbnVtIGdzbV9zdWJzY3JpYmVyX3VwZGF0ZV9yZWFzb24geworCUdTTV9TVUJTQ1JJQkVSX1VQREFURV9BVFRBQ0hFRCwKKwlHU01fU1VCU0NSSUJFUl9VUERBVEVfREVUQUNIRUQsCisJR1NNX1NVQlNDUklCRVJfVVBEQVRFX0VRVUlQTUVOVCwKK307CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9wdXQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X3Rtc2koc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgdV9pbnQzMl90IHRtc2kpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2ltc2koc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgY29uc3QgY2hhciAqaW1zaSk7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfZXh0ZW5zaW9uKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqZXh0KTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9pZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJdW5zaWduZWQgbG9uZyBsb25nIGlkKTsKK2ludCBzdWJzY3JfdXBkYXRlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqcywgc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHJlYXNvbik7Cit2b2lkIHN1YnNjcl9wdXRfY2hhbm5lbChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7Cit2b2lkIHN1YnNjcl9nZXRfY2hhbm5lbChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqcGFyYW0pOworCitjaGFyICpzdWJzY3JfbmFtZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CisKKy8qIGludGVybmFsICovCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9hbGxvYyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCBhY3RpdmVfc3Vic2NyaWJlcnM7CisKKyNlbmRpZiAvKiBfR1NNX1NVQlNDUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9oYW5kb3Zlci5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaGFuZG92ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWIxYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaGFuZG92ZXIuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX0hBTkRPVkVSX0gKKyNkZWZpbmUgX0hBTkRPVkVSX0gKKy8qIEhhbmQgb3ZlciB0aGUgc3BlY2lmaWVkIGxvZ2ljYWwgY2hhbm5lbCB0byB0aGUgc3BlY2lmaWVkIG5ldyBCVFMuCisgKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgYWN0dWFsIGhhbmRvdmVyIGFsZ29yaXRobSwKKyAqIGFmdGVyIGl0IGhhcyBkZWNpZGVkIGl0IHdhbnRzIHRvIGluaXRpYXRlIEhPIHRvIGEgc3BlY2lmaWMgQlRTICovCitpbnQgYnNjX2hhbmRvdmVyX3N0YXJ0KHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbiwgc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKKyNlbmRpZiAvKiBfSEFORE9WRVJfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaXBhY2Nlc3MuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2lwYWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkZGZkNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2lwYWNjZXNzLmgKQEAgLTAsMCArMSwxMDkgQEAKKyNpZm5kZWYgX0lQQUNDRVNTX0gKKyNkZWZpbmUgX0lQQUNDRVNTX0gKKworI2luY2x1ZGUgImUxX2lucHV0LmgiCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisKKyNkZWZpbmUgSVBBX1RDUF9QT1JUX09NTAkzMDAyCisjZGVmaW5lIElQQV9UQ1BfUE9SVF9SU0wJMzAwMworCitzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCB7CisJdV9pbnQxNl90IGxlbjsJLyogbmV0d29yayBieXRlIG9yZGVyICovCisJdV9pbnQ4X3QgcHJvdG87CisJdV9pbnQ4X3QgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitlbnVtIGlwYWNjZXNzX3Byb3RvIHsKKwlJUEFDX1BST1RPX1JTTAkJPSAweDAwLAorCUlQQUNfUFJPVE9fSVBBQ0NFU1MJPSAweGZlLAorCUlQQUNfUFJPVE9fU0NDUAkJPSAweGZkLAorCUlQQUNfUFJPVE9fT01MCQk9IDB4ZmYsCit9OworCitlbnVtIGlwYWNjZXNzX21zZ3R5cGUgeworCUlQQUNfTVNHVF9QSU5HCQk9IDB4MDAsCisJSVBBQ19NU0dUX1BPTkcJCT0gMHgwMSwKKwlJUEFDX01TR1RfSURfR0VUCT0gMHgwNCwKKwlJUEFDX01TR1RfSURfUkVTUAk9IDB4MDUsCisJSVBBQ19NU0dUX0lEX0FDSwk9IDB4MDYsCit9OworCitlbnVtIGlwYWNjZXNzX2lkX3RhZ3MgeworCUlQQUNfSURUQUdfU0VSTlIJCT0gMHgwMCwKKwlJUEFDX0lEVEFHX1VOSVROQU1FCQk9IDB4MDEsCisJSVBBQ19JRFRBR19MT0NBVElPTjEJCT0gMHgwMiwKKwlJUEFDX0lEVEFHX0xPQ0FUSU9OMgkJPSAweDAzLAorCUlQQUNfSURUQUdfRVFVSVBWRVJTCQk9IDB4MDQsCisJSVBBQ19JRFRBR19TV1ZFUlNJT04JCT0gMHgwNSwKKwlJUEFDX0lEVEFHX0lQQUREUgkJPSAweDA2LAorCUlQQUNfSURUQUdfTUFDQUREUgkJPSAweDA3LAorCUlQQUNfSURUQUdfVU5JVAkJCT0gMHgwOCwKK307CisKK2ludCBpcGFjY2Vzc19jb25uZWN0KHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhKTsKKworLyoKKyAqIG1ldGhvZHMgZm9yIHBhcnNpbmcgYW5kIHNlbmRpbmcgYSBtZXNzYWdlCisgKi8KK2ludCBpcGFjY2Vzc19yY3Ztc2dfYmFzZShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgYnNjX2ZkICpiZmQpOworc3RydWN0IG1zZ2IgKmlwYWNjZXNzX3JlYWRfbXNnKHN0cnVjdCBic2NfZmQgKmJmZCwgaW50ICplcnJvcik7Cit2b2lkIGlwYWNjZXNzX3ByZXBlbmRfaGVhZGVyKHN0cnVjdCBtc2diICptc2csIGludCBwcm90byk7CitpbnQgaXBhY2Nlc3Nfc2VuZF9pZF9hY2soaW50IGZkKTsKK2ludCBpcGFjY2Vzc19zZW5kX2lkX3JlcShpbnQgZmQpOworCitpbnQgaXBhY2Nlc3NfaWR0YWdfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKmRlYywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKTsKKworaW50IGlwYWNjZXNzX2Ryb3Bfb21sKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGlwYWNjZXNzX2Ryb3BfcnNsKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKKworLyoKKyAqIEZpcm13YXJlIHNwZWNpZmljIGhlYWRlcgorICovCitzdHJ1Y3Qgc2RwX2Zpcm13YXJlIHsKKwljaGFyIG1hZ2ljWzRdOworCWNoYXIgbW9yZV9tYWdpY1syXTsKKwl1X2ludDE2X3QgbW9yZV9tb3JlX21hZ2ljOworCXVfaW50MzJfdCBoZWFkZXJfbGVuZ3RoOworCXVfaW50MzJfdCBmaWxlX2xlbmd0aDsKKwljaGFyIHN3X3BhcnRbMjBdOworCWNoYXIgdGV4dDFbNjRdOworCWNoYXIgdGltZVsxMl07CisJY2hhciBkYXRlWzE0XTsKKwljaGFyIHRleHQyWzEwXTsKKwljaGFyIHZlcnNpb25bMjBdOworCXVfaW50MTZfdCB0YWJsZV9vZmZzZXQ7CisJLyogc3R1ZmYgaSBkb24ndCBrbm93ICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2RwX2hlYWRlcl9lbnRyeSB7CisJdV9pbnQxNl90IHNvbWV0aGluZzE7CisJY2hhciB0ZXh0MVs2NF07CisJY2hhciB0aW1lWzEyXTsKKwljaGFyIGRhdGVbMTRdOworCWNoYXIgdGV4dDJbMTBdOworCWNoYXIgdmVyc2lvblsyMF07CisJdV9pbnQzMl90IGxlbmd0aDsKKwl1X2ludDMyX3QgYWRkcjE7CisJdV9pbnQzMl90IGFkZHIyOworCXVfaW50MzJfdCBzdGFydDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzZHBfaGVhZGVyX2l0ZW0geworCXN0cnVjdCBzZHBfaGVhZGVyX2VudHJ5IGhlYWRlcl9lbnRyeTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwlvZmZfdCBhYnNvbHV0ZV9vZmZzZXQ7Cit9OworCitzdHJ1Y3Qgc2RwX2hlYWRlciB7CisJc3RydWN0IHNkcF9maXJtd2FyZSBmaXJtd2FyZV9pbmZvOworCisJLyogZm9yIG1vcmVfbWFnaWMgYSBsaXN0IG9mIHNkcF9oZWFkZXJfZW50cnlfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGhlYWRlcl9saXN0OworCisJLyogdGhlIGVudHJ5IG9mIHRoZSBzZHBfaGVhZGVyICovCisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7Cit9OworCitpbnQgaXBhY2Nlc3NfYW5hbHl6ZV9maWxlKGludCBmZCwgY29uc3QgdW5zaWduZWQgaW50IHN0X3NpemUsIGNvbnN0IHVuc2lnbmVkIGJhc2Vfb2Zmc2V0LCBzdHJ1Y3QgbGxpc3RfaGVhZCAqbGlzdCk7CisKKyNlbmRpZiAvKiBfSVBBQ0NFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWVhc19yZXAuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21lYXNfcmVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyYzhkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21lYXNfcmVwLmgKQEAgLTAsMCArMSw4NSBAQAorI2lmbmRlZiBfTUVBU19SRVBfSAorI2RlZmluZSBfTUVBU19SRVBfSAorCisjZGVmaW5lIE1SQ19GX1BST0NFU1NFRAkweDAwMDEKKworLyogZXh0cmFjdGVkIGZyb20gYSBMMyBtZWFzdXJlbWVudCByZXBvcnQgSUUgKi8KK3N0cnVjdCBnc21fbWVhc19yZXBfY2VsbCB7CisJdV9pbnQ4X3QgcnhsZXY7CisJdV9pbnQ4X3QgYnNpYzsKKwl1X2ludDhfdCBuZWlnaF9pZHg7CisJdV9pbnQxNl90IGFyZmNuOworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKKy8qIFJYIExldmVsIGFuZCBSWCBRdWFsaXR5ICovCitzdHJ1Y3QgZ3NtX3J4X2xldl9xdWFsIHsKKwl1X2ludDhfdCByeF9sZXY7CisJdV9pbnQ4X3QgcnhfcXVhbDsKK307CisKKy8qIHVuaWRpcmVjdGlvbmFsIG1lYXN1bXJlbWVudCByZXBvcnQgKi8KK3N0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyIHsKKwlzdHJ1Y3QgZ3NtX3J4X2xldl9xdWFsIGZ1bGw7CisJc3RydWN0IGdzbV9yeF9sZXZfcXVhbCBzdWI7Cit9OworCisjZGVmaW5lIE1FQVNfUkVQX0ZfVUxfRFRYCTB4MDEKKyNkZWZpbmUgTUVBU19SRVBfRl9ETF9WQUxJRAkweDAyCisjZGVmaW5lIE1FQVNfUkVQX0ZfQkExCQkweDA0CisjZGVmaW5lIE1FQVNfUkVQX0ZfRExfRFRYCTB4MDgKKyNkZWZpbmUgTUVBU19SRVBfRl9NU19UTwkweDEwCisjZGVmaW5lIE1FQVNfUkVQX0ZfTVNfTDEJMHgyMAorI2RlZmluZSBNRUFTX1JFUF9GX0ZQQwkJMHg0MAorCisvKiBwYXJzZWQgdXBsaW5rIGFuZCBkb3dubGluayBtZWFzdXJlbWVudCByZXN1bHQgKi8KK3N0cnVjdCBnc21fbWVhc19yZXAgeworCS8qIGJhY2stcG9pbnRlciB0byB0aGUgbG9naWNhbCBjaGFubmVsICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisKKwkvKiBudW1iZXIgb2YgdGhlIG1lYXN1cmVtZW50IHJlcG9ydCAqLworCXVfaW50OF90IG5yOworCS8qIGZsYWdzLCBzZWUgTUVBU19SRVBfRl8qICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCisJLyogdXBsaW5rIGFuZCBkb3dubGluayByeGxldiwgcnhxdWFsOyBmdWxsIGFuZCBzdWIgKi8KKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwX3VuaWRpciB1bDsKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwX3VuaWRpciBkbDsKKworCXVfaW50OF90IGJzX3Bvd2VyOworCXVfaW50OF90IG1zX3RpbWluZ19vZmZzZXQ7CisJc3RydWN0IHsKKwkJaW50OF90IHB3cjsJLyogTVMgcG93ZXIgaW4gZEJtICovCisJCXVfaW50OF90IHRhOwkvKiBNUyB0aW1pbmcgYWR2YW5jZSAqLworCX0gbXNfbDE7CisKKwkvKiBuZWlnaGJvciBtZWFzdXJlbWVudCByZXBvcnRzIGZvciB1cCB0byA2IGNlbGxzICovCisJaW50IG51bV9jZWxsOworCXN0cnVjdCBnc21fbWVhc19yZXBfY2VsbCBjZWxsWzZdOworfTsKKworZW51bSBtZWFzX3JlcF9maWVsZCB7CisJTUVBU19SRVBfRExfUlhMRVZfRlVMTCwKKwlNRUFTX1JFUF9ETF9SWExFVl9TVUIsCisJTUVBU19SRVBfRExfUlhRVUFMX0ZVTEwsCisJTUVBU19SRVBfRExfUlhRVUFMX1NVQiwKKwlNRUFTX1JFUF9VTF9SWExFVl9GVUxMLAorCU1FQVNfUkVQX1VMX1JYTEVWX1NVQiwKKwlNRUFTX1JFUF9VTF9SWFFVQUxfRlVMTCwKKwlNRUFTX1JFUF9VTF9SWFFVQUxfU1VCLAorfTsKKworLyogb2J0YWluIGFuIGF2ZXJhZ2Ugb3ZlciB0aGUgbGFzdCAnbnVtJyBmaWVsZHMgaW4gdGhlIG1lYXMgcmVwcyAqLworaW50IGdldF9tZWFzX3JlcF9hdmcoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCSAgICAgZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCwgdW5zaWduZWQgaW50IG51bSk7CisKKy8qIENoZWNrIGlmIE4gb3V0IG9mIE0gbGFzdCB2YWx1ZXMgZm9yIEZJRUxEIGFyZSA+PSBiZCAqLworaW50IG1lYXNfcmVwX25fb3V0X29mX21fYmUoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQllbnVtIG1lYXNfcmVwX2ZpZWxkIGZpZWxkLAorCQkJdW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCBtLCBpbnQgYmUpOworCit1bnNpZ25lZCBpbnQgY2FsY19pbml0aWFsX2lkeCh1bnNpZ25lZCBpbnQgYXJyYXlfc2l6ZSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBtZWFzX3JlcF9pZHgsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX3ZhbHVlcyk7CisKKyNlbmRpZiAvKiBfTUVBU19SRVBfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjdmYzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisKKy8qCisgKiAoQykgMjAwOS0yMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LTIwMTAgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIE9QRU5CU0NfTUdDUF9ICisjZGVmaW5lIE9QRU5CU0NfTUdDUF9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2RlZmluZSBSVFBfUE9SVF9ERUZBVUxUIDQwMDAKKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIFJUUCBhdWRpbyBwb3J0IGZvciB0aGUgZ2l2ZW4gbXVsdGlwbGV4CisgKiBhbmQgdGhlIGRpcmVjdGlvbi4gVGhpcyBhbGxvd3MgYSBzZW1pIHN0YXRpYyBlbmRwb2ludAorICogdG8gcG9ydCBjYWxjdWxhdGlvbiByZW1vdmluZyB0aGUgbmVlZCBmb3IgdGhlIEJTQworICogYW5kIHRoZSBNZWRpYUdhdGV3YXkgdG8gY29tbXVuaWNhdGUuCisgKgorICogUG9ydCB1c2FnZSBleHBsYWluZWQ6CisgKiAgICAgICBiYXNlICsgKG11bHRpcGxleCAqIDIpICsgMCA9PSBsb2NhbCBwb3J0IHRvIHdhaXQgZm9yIG5ldHdvcmsgcGFja2V0cworICogICAgICAgYmFzZSArIChtdWx0aXBsZXggKiAyKSArIDEgPT0gbG9jYWwgcG9ydCBmb3IgcnRjcAorICoKKyAqIFRoZSBhYm92ZSBwb3J0IHdpbGwgcmVjZWl2ZSBwYWNrZXRzIGZyb20gdGhlIEJUUyB0aGF0IG5lZWQKKyAqIHRvIGJlIHBhdGNoZWQgYW5kIGZvcndhcmRlZCB0byB0aGUgbmV0d29yay4KKyAqIFRoZSBhYm92ZSBwb3J0IHdpbGwgcmVjZWl2ZSBwYWNrZXRzIGZyb20gdGhlIG5ldHdvcmsgdGhhdAorICogbmVlZCB0byBiZSBwYXRjaGVkIGFuZCBmb3J3YXJkZWQgdG8gdGhlIEJUUy4KKyAqCisgKiBXZSBhc3N1bWUgdG8gaGF2ZSBhIHN0YXRpYyBCVFMgSVAgYWRkcmVzcyBzbyB3ZSBjYW4gZGlmZmVyZW50aWF0ZQorICogbmV0d29yayBhbmQgQlRTLgorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgcnRwX2NhbGN1bGF0ZV9wb3J0KGludCBtdWx0aXBsZXgsIGludCBiYXNlKQoreworCXJldHVybiBiYXNlICsgKG11bHRpcGxleCAqIDIpOworfQorCisKKy8qCisgKiBIYW5kbGluZyBvZiBNR0NQIEVuZHBvaW50cyBhbmQgdGhlIE1HQ1AgQ29uZmlnCisgKi8KK3N0cnVjdCBtZ2NwX2VuZHBvaW50Oworc3RydWN0IG1nY3BfY29uZmlnOworCisjZGVmaW5lIE1HQ1BfRU5EUF9DUkNYIDEKKyNkZWZpbmUgTUdDUF9FTkRQX0RMQ1ggMgorI2RlZmluZSBNR0NQX0VORFBfTURDWCAzCisKKy8qCisgKiB3aGF0IHRvIGRvIHdpdGggdGhlIG1zZz8KKyAqCS0gY29udGludWUgYXMgdXN1YWw/CisgKgktIHJlamVjdCBhbmQgc2VuZCBhIGZhaWx1cmUgY29kZT8KKyAqCS0gZGVmZXI/IGRvIG5vdCBzZW5kIGFueXRoaW5nCisgKi8KKyNkZWZpbmUgTUdDUF9QT0xJQ1lfQ09OVAk0CisjZGVmaW5lIE1HQ1BfUE9MSUNZX1JFSkVDVAk1CisjZGVmaW5lIE1HQ1BfUE9MSUNZX0RFRkVSCTYKKwordHlwZWRlZiBpbnQgKCptZ2NwX2NoYW5nZSkoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIGludCBlbmRwb2ludCwgaW50IHN0YXRlLCBpbnQgbG9jYWxfcnRwKTsKK3R5cGVkZWYgaW50ICgqbWdjcF9wb2xpY3kpKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBpbnQgZW5kcG9pbnQsIGludCBzdGF0ZSwgY29uc3QgY2hhciAqdHJhbnNhY3Rpb19pZCk7Cit0eXBlZGVmIGludCAoKm1nY3BfcmVzZXQpKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKTsKKworc3RydWN0IG1nY3BfY29uZmlnIHsKKwlpbnQgc291cmNlX3BvcnQ7CisJY2hhciAqbG9jYWxfaXA7CisJY2hhciAqc291cmNlX2FkZHI7CisJdW5zaWduZWQgaW50IG51bWJlcl9lbmRwb2ludHM7CisJY2hhciAqYnRzX2lwOworCWNoYXIgKmNhbGxfYWdlbnRfYWRkcjsKKworCXN0cnVjdCBpbl9hZGRyIGJ0c19pbjsKKwljaGFyICphdWRpb19uYW1lOworCWludCBhdWRpb19wYXlsb2FkOworCWludCBhdWRpb19sb29wOworCWludCBlYXJseV9iaW5kOworCWludCBydHBfYmFzZV9wb3J0OworCisJY2hhciAqZm9yd2FyZF9pcDsKKwlpbnQgZm9yd2FyZF9wb3J0OworCisJLyogc3BlYyBoYW5kbGluZyAqLworCWludCBmb3JjZV9yZWFsbG9jOworCisJbWdjcF9jaGFuZ2UgY2hhbmdlX2NiOworCW1nY3BfcG9saWN5IHBvbGljeV9jYjsKKwltZ2NwX3Jlc2V0IHJlc2V0X2NiOworCXZvaWQgKmRhdGE7CisKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcG9pbnRzOworCXVuc2lnbmVkIGludCBsYXN0X2NhbGxfaWQ7Cit9OworCisvKiBjb25maWcgbWFuYWdlbWVudCAqLworc3RydWN0IG1nY3BfY29uZmlnICptZ2NwX2NvbmZpZ19hbGxvYyh2b2lkKTsKK2ludCBtZ2NwX3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICpjb25maWdfZmlsZSwgc3RydWN0IG1nY3BfY29uZmlnICpjZmcpOworaW50IG1nY3BfdnR5X2luaXQodm9pZCk7CitpbnQgbWdjcF9lbmRwb2ludHNfYWxsb2NhdGUoc3RydWN0IG1nY3BfY29uZmlnICpjZmcpOworaW50IG1nY3BfYmluZF9ydHBfcG9ydChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCwgaW50IHJ0cF9wb3J0KTsKK3ZvaWQgbWdjcF9mcmVlX2VuZHAoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHApOworCisvKgorICogZm9ybWF0IGhlbHBlciBmdW5jdGlvbnMKKyAqLworc3RydWN0IG1zZ2IgKm1nY3BfaGFuZGxlX21lc3NhZ2Uoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworc3RydWN0IG1zZ2IgKm1nY3BfY3JlYXRlX3Jlc3BvbnNlX3dpdGhfZGF0YShpbnQgY29kZSwgY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICp0cmFucywgY29uc3QgY2hhciAqZGF0YSk7CisKKy8qIGFkYyBoZWxwZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG1nY3BfdGltZXNsb3RfdG9fZW5kcG9pbnQoaW50IG11bHRpcGxleCwgaW50IHRpbWVzbG90KQoreworCWlmICh0aW1lc2xvdCA9PSAwKQorCQl0aW1lc2xvdCA9IDE7CisJcmV0dXJuIHRpbWVzbG90ICsgKDMxICogbXVsdGlwbGV4KTsKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3BfaW50ZXJuYWwuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3BfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWFlYzMwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcF9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIE1HQ1AgUHJpdmF0ZSBEYXRhICovCisKKy8qCisgKiAoQykgMjAwOS0yMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LTIwMTAgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIE9QRU5CU0NfTUdDUF9EQVRBX0gKKyNkZWZpbmUgT1BFTkJTQ19NR0NQX0RBVEFfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisKKyNkZWZpbmUgQ0lfVU5VU0VEIDAKKworc3RydWN0IG1nY3BfZW5kcG9pbnQgeworCWludCBjaTsKKwljaGFyICpjYWxsaWQ7CisJY2hhciAqbG9jYWxfb3B0aW9uczsKKwlpbnQgY29ubl9tb2RlOworCisJaW50IGJ0c19wYXlsb2FkX3R5cGU7CisJaW50IG5ldF9wYXlsb2FkX3R5cGU7CisKKwkvKiB0aGUgbG9jYWwgcnRwIHBvcnQgd2UgYXJlIGJpbmRpbmcgdG8gKi8KKwlpbnQgcnRwX3BvcnQ7CisKKwkvKgorCSAqIFJUUCBtYW5nbGluZzoKKwkgKiAgLSB3ZSBnZXQgUlRQIGFuZCBSVENQIHRvIHVzIGFuZCBuZWVkIHRvIGZvcndhcmQgdG8gdGhlIEJUUworCSAqICAtIHdlIGdldCBSVFAgYW5kIFJUQ1AgZnJvbSB0aGUgQlRTIGFuZCBmb3J3YXJkIHRvIHRoZSBuZXR3b3JrCisJICovCisJc3RydWN0IGJzY19mZCBsb2NhbF9ydHA7CisJc3RydWN0IGJzY19mZCBsb2NhbF9ydGNwOworCisJc3RydWN0IGluX2FkZHIgcmVtb3RlOworCXN0cnVjdCBpbl9hZGRyIGJ0czsKKworCS8qIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCWludCBuZXRfcnRwLCBuZXRfcnRjcDsKKwlpbnQgYnRzX3J0cCwgYnRzX3J0Y3A7CisKKwkvKiBiYWNrcG9pbnRlciAqLworCXN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnOworCisJLyogc3RhdGlzdGljcyAqLworCXVuc2lnbmVkIGludCBpbl9idHM7CisJdW5zaWduZWQgaW50IGluX3JlbW90ZTsKK307CisKKyNkZWZpbmUgRU5EUE9JTlRfTlVNQkVSKGVuZHApIGFicyhlbmRwIC0gZW5kcC0+Y2ZnLT5lbmRwb2ludHMpCisKK3N0cnVjdCBtZ2NwX21zZ19wdHIgeworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworfTsKKworaW50IG1nY3BfYW5hbHl6ZV9oZWFkZXIoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2csCisJCQlzdHJ1Y3QgbWdjcF9tc2dfcHRyICpwdHIsIGludCBzaXplLAorCQkJY29uc3QgY2hhciAqKnRyYW5zYWN0aW9uX2lkLCBzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqKmVuZHApOworaW50IG1nY3Bfc2VuZF9kdW1teShzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWlzZG4uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21pc2RuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzOGRlNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21pc2RuLmgKQEAgLTAsMCArMSwyOSBAQAorLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIE1JU0ROX0gKKyNkZWZpbmUgTUlTRE5fSAorCisjaW5jbHVkZSAiZTFfaW5wdXQuaCIKKworaW50IG1pX3NldHVwKGludCBjYXJkbnIsICBzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgaW50IHJlbGVhc2VfbDIpOworaW50IF9hYmlzX25tX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgbWlfZTFfbGluZV91cGRhdGUoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21uY2MuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21uY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjgzMzlhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbW5jYy5oCkBAIC0wLDAgKzEsMTU5IEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfTU5DQ19ICisjZGVmaW5lIF9NTkNDX0gKKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21uY2MuaD4KKworLyogT25lIGVuZCBvZiBhIGNhbGwgKi8KK3N0cnVjdCBnc21fY2FsbCB7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisKKwkvKiBuZXR3b3JrIGhhbmRsZSAqLworCXZvaWQgKm5ldDsKKworCS8qIHRoZSAnbG9jYWwnIHRyYW5zYWN0aW9uICovCisJdV9pbnQzMl90IGNhbGxyZWY7CisJLyogdGhlICdyZW1vdGUnIHRyYW5zYWN0aW9uICovCisJdV9pbnQzMl90IHJlbW90ZV9yZWY7Cit9OworCisjZGVmaW5lIE1OQ0NfU0VUVVBfUkVRCQkweDAxMDEKKyNkZWZpbmUgTU5DQ19TRVRVUF9JTkQJCTB4MDEwMgorI2RlZmluZSBNTkNDX1NFVFVQX1JTUAkJMHgwMTAzCisjZGVmaW5lIE1OQ0NfU0VUVVBfQ05GCQkweDAxMDQKKyNkZWZpbmUgTU5DQ19TRVRVUF9DT01QTF9SRVEJMHgwMTA1CisjZGVmaW5lIE1OQ0NfU0VUVVBfQ09NUExfSU5ECTB4MDEwNgorLyogTU5DQ19SRUpfKiBpcyBwZXJmb21lZCB2aWEgTU5DQ19SRUxfKiAqLworI2RlZmluZSBNTkNDX0NBTExfQ09ORl9JTkQJMHgwMTA3CisjZGVmaW5lIE1OQ0NfQ0FMTF9QUk9DX1JFUQkweDAxMDgKKyNkZWZpbmUgTU5DQ19QUk9HUkVTU19SRVEJMHgwMTA5CisjZGVmaW5lIE1OQ0NfQUxFUlRfUkVRCQkweDAxMGEKKyNkZWZpbmUgTU5DQ19BTEVSVF9JTkQJCTB4MDEwYgorI2RlZmluZSBNTkNDX05PVElGWV9SRVEJCTB4MDEwYworI2RlZmluZSBNTkNDX05PVElGWV9JTkQJCTB4MDEwZAorI2RlZmluZSBNTkNDX0RJU0NfUkVRCQkweDAxMGUKKyNkZWZpbmUgTU5DQ19ESVNDX0lORAkJMHgwMTBmCisjZGVmaW5lIE1OQ0NfUkVMX1JFUQkJMHgwMTEwCisjZGVmaW5lIE1OQ0NfUkVMX0lORAkJMHgwMTExCisjZGVmaW5lIE1OQ0NfUkVMX0NORgkJMHgwMTEyCisjZGVmaW5lIE1OQ0NfRkFDSUxJVFlfUkVRCTB4MDExMworI2RlZmluZSBNTkNDX0ZBQ0lMSVRZX0lORAkweDAxMTQKKyNkZWZpbmUgTU5DQ19TVEFSVF9EVE1GX0lORAkweDAxMTUKKyNkZWZpbmUgTU5DQ19TVEFSVF9EVE1GX1JTUAkweDAxMTYKKyNkZWZpbmUgTU5DQ19TVEFSVF9EVE1GX1JFSgkweDAxMTcKKyNkZWZpbmUgTU5DQ19TVE9QX0RUTUZfSU5ECTB4MDExOAorI2RlZmluZSBNTkNDX1NUT1BfRFRNRl9SU1AJMHgwMTE5CisjZGVmaW5lIE1OQ0NfTU9ESUZZX1JFUQkJMHgwMTFhCisjZGVmaW5lIE1OQ0NfTU9ESUZZX0lORAkJMHgwMTFiCisjZGVmaW5lIE1OQ0NfTU9ESUZZX1JTUAkJMHgwMTFjCisjZGVmaW5lIE1OQ0NfTU9ESUZZX0NORgkJMHgwMTFkCisjZGVmaW5lIE1OQ0NfTU9ESUZZX1JFSgkJMHgwMTFlCisjZGVmaW5lIE1OQ0NfSE9MRF9JTkQJCTB4MDExZgorI2RlZmluZSBNTkNDX0hPTERfQ05GCQkweDAxMjAKKyNkZWZpbmUgTU5DQ19IT0xEX1JFSgkJMHgwMTIxCisjZGVmaW5lIE1OQ0NfUkVUUklFVkVfSU5ECTB4MDEyMgorI2RlZmluZSBNTkNDX1JFVFJJRVZFX0NORgkweDAxMjMKKyNkZWZpbmUgTU5DQ19SRVRSSUVWRV9SRUoJMHgwMTI0CisjZGVmaW5lIE1OQ0NfVVNFUklORk9fUkVRCTB4MDEyNQorI2RlZmluZSBNTkNDX1VTRVJJTkZPX0lORAkweDAxMjYKKyNkZWZpbmUgTU5DQ19SRUpfUkVRCQkweDAxMjcKKyNkZWZpbmUgTU5DQ19SRUpfSU5ECQkweDAxMjgKKworI2RlZmluZSBNTkNDX0JSSURHRQkJMHgwMjAwCisjZGVmaW5lIE1OQ0NfRlJBTUVfUkVDVgkJMHgwMjAxCisjZGVmaW5lIE1OQ0NfRlJBTUVfRFJPUAkJMHgwMjAyCisjZGVmaW5lIE1OQ0NfTENIQU5fTU9ESUZZCTB4MDIwMworCisjZGVmaW5lIEdTTV9UQ0hGX0ZSQU1FCQkweDAzMDAKKyNkZWZpbmUgR1NNX1RDSEZfRlJBTUVfRUZSCTB4MDMwMQorCisjZGVmaW5lIEdTTV9NQVhfRkFDSUxJVFkJMTI4CisjZGVmaW5lIEdTTV9NQVhfU1NWRVJTSU9OCTEyOAorI2RlZmluZSBHU01fTUFYX1VTRVJVU0VSCTEyOAorCisjZGVmaW5lCU1OQ0NfRl9CRUFSRVJfQ0FQCTB4MDAwMQorI2RlZmluZSBNTkNDX0ZfQ0FMTEVECQkweDAwMDIKKyNkZWZpbmUgTU5DQ19GX0NBTExJTkcJCTB4MDAwNAorI2RlZmluZSBNTkNDX0ZfUkVESVJFQ1RJTkcJMHgwMDA4CisjZGVmaW5lIE1OQ0NfRl9DT05ORUNURUQJMHgwMDEwCisjZGVmaW5lIE1OQ0NfRl9DQVVTRQkJMHgwMDIwCisjZGVmaW5lIE1OQ0NfRl9VU0VSVVNFUgkJMHgwMDQwCisjZGVmaW5lIE1OQ0NfRl9QUk9HUkVTUwkJMHgwMDgwCisjZGVmaW5lIE1OQ0NfRl9FTUVSR0VOQ1kJMHgwMTAwCisjZGVmaW5lIE1OQ0NfRl9GQUNJTElUWQkJMHgwMjAwCisjZGVmaW5lIE1OQ0NfRl9TU1ZFUlNJT04JMHgwNDAwCisjZGVmaW5lIE1OQ0NfRl9DQ0NBUAkJMHgwODAwCisjZGVmaW5lIE1OQ0NfRl9LRVlQQUQJCTB4MTAwMAorI2RlZmluZSBNTkNDX0ZfU0lHTkFMCQkweDIwMDAKKworc3RydWN0IGdzbV9tbmNjIHsKKwkvKiBjb250ZXh0IGJhc2VkIGluZm9ybWF0aW9uICovCisJdV9pbnQzMl90CW1zZ190eXBlOworCXVfaW50MzJfdAljYWxscmVmOworCisJLyogd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50ICovCisJdV9pbnQzMl90CWZpZWxkczsKKworCS8qIGRhdGEgZGVyaXZlZCBpbmZvcm1hdGlvbnMgKE1OQ0NfRl8gYmFzZWQpICovCisJc3RydWN0IGdzbV9tbmNjX2JlYXJlcl9jYXAJYmVhcmVyX2NhcDsKKwlzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyCQljYWxsZWQ7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJY2FsbGluZzsKKwlzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyCQlyZWRpcmVjdGluZzsKKwlzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyCQljb25uZWN0ZWQ7CisJc3RydWN0IGdzbV9tbmNjX2NhdXNlCQljYXVzZTsKKwlzdHJ1Y3QgZ3NtX21uY2NfcHJvZ3Jlc3MJcHJvZ3Jlc3M7CisJc3RydWN0IGdzbV9tbmNjX3VzZXJ1c2VyCXVzZXJ1c2VyOworCXN0cnVjdCBnc21fbW5jY19mYWNpbGl0eQlmYWNpbGl0eTsKKwlzdHJ1Y3QgZ3NtX21uY2NfY2NjYXAJCWNjY2FwOworCXN0cnVjdCBnc21fbW5jY19zc3ZlcnNpb24Jc3N2ZXJzaW9uOworCXN0cnVjdAl7CisJCWludAkJc3VwOworCQlpbnQJCWludjsKKwl9IGNsaXI7CisJaW50CQlzaWduYWw7CisKKwkvKiBkYXRhIGRlcml2ZWQgaW5mb3JtYXRpb24sIG5vdCBNTkNDX0YgYmFzZWQgKi8KKwlpbnQJCWtleXBhZDsKKwlpbnQJCW1vcmU7CisJaW50CQlub3RpZnk7IC8qIDAuLjEyNyAqLworCWludAkJZW1lcmdlbmN5OworCWNoYXIJCWltc2lbMTZdOworCisJdW5zaWduZWQgY2hhcglsY2hhbl9tb2RlOworfTsKKworc3RydWN0IGdzbV9kYXRhX2ZyYW1lIHsKKwl1X2ludDMyX3QJbXNnX3R5cGU7CisJdV9pbnQzMl90CWNhbGxyZWY7CisJdW5zaWduZWQgY2hhcglkYXRhWzBdOworfTsKKworY2hhciAqZ2V0X21uY2NfbmFtZShpbnQgdmFsdWUpOworaW50IG1uY2NfcmVjdihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1zZ190eXBlLCB2b2lkICphcmcpOwordm9pZCBtbmNjX3NldF9jYXVzZShzdHJ1Y3QgZ3NtX21uY2MgKmRhdGEsIGludCBsb2MsIGludCB2YWwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL29wZW5ic2NkZWZpbmVzLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9vcGVuYnNjZGVmaW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MmU1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9vcGVuYnNjZGVmaW5lcy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIAorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIE9QRU5CU0NERUZJTkVTX0gKKyNkZWZpbmUgT1BFTkJTQ0RFRklORVNfSAorCisjaWZkZWYgQlVJTERJTkdfT05fV0lORE9XUworICAgICNpZmRlZiBCVUlMRElOR19PUEVOQlNDCisgICAgICAgICNkZWZpbmUgQlNDX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIEJTQ19BUEkgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisgICAgI2VuZGlmCisjZWxzZQorICAgICNkZWZpbmUgQlNDX0FQSSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcGFnaW5nLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9wYWdpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2JkY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcGFnaW5nLmgKQEAgLTAsMCArMSw0NiBAQAorLyogUGFnaW5nIGhlbHBlciBhbmQgbWFuYWdlci4uLi4gKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFBBR0lOR19ICisjZGVmaW5lIFBBR0lOR19ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgImdzbV9kYXRhLmgiCisjaW5jbHVkZSAiZ3NtX3N1YnNjcmliZXIuaCIKKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorCisvKiBjYWxsIG9uY2UgZm9yIGV2ZXJ5IGdzbV9idHMuLi4gKi8KK3ZvaWQgcGFnaW5nX2luaXQoc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKKy8qIHNjaGVkdWxlIHBhZ2luZyByZXF1ZXN0ICovCitpbnQgcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpkYXRhKTsKKworLyogc3RvcCBwYWdpbmcgcmVxdWVzdHMgKi8KK3ZvaWQgcGFnaW5nX3JlcXVlc3Rfc3RvcChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKKy8qIHVwZGF0ZSBwYWdpbmcgbG9hZCAqLwordm9pZCBwYWdpbmdfdXBkYXRlX2J1ZmZlcl9zcGFjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDE2X3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Jlc3Rfb2N0ZXRzLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yZXN0X29jdGV0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTAxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yZXN0X29jdGV0cy5oCkBAIC0wLDAgKzEsMTMzIEBACisjaWZuZGVmIF9SRVNUX09DVEVUU19ICisjZGVmaW5lIF9SRVNUX09DVEVUU19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorCisvKiBnZW5lcmF0ZSBTSTEgcmVzdCBvY3RldHMgKi8KK2ludCByZXN0X29jdGV0c19zaTEodV9pbnQ4X3QgKmRhdGEsIHVfaW50OF90ICpuY2hfcG9zKTsKKworc3RydWN0IGdzbTQ4X3NpX3NlbGVjdGlvbl9wYXJhbXMgeworCXVfaW50MTZfdCBwZW5hbHR5X3RpbWU6NSwKKwkJICB0ZW1wX29mZnM6MywKKwkJICBjZWxsX3Jlc2VsX29mZjo2LAorCQkgIGNicToxLAorCQkgIHByZXNlbnQ6MTsKK307CisKK3N0cnVjdCBnc200OF9zaV9wb3dlcl9vZmZzZXQgeworCXVfaW50OF90IHBvd2VyX29mZnNldDoyLAorCQkgcHJlc2VudDoxOworfTsKKworc3RydWN0IGdzbTQ4X3NpM19ncHJzX2luZCB7CisJdV9pbnQ4X3Qgc2kxM19wb3NpdGlvbjoxLAorCQkgcmFfY29sb3VyOjMsCisJCSBwcmVzZW50OjE7Cit9OworCitzdHJ1Y3QgZ3NtNDhfbHNhX3BhcmFtcyB7CisJdV9pbnQzMl90IHByaW9fdGhyOjMsCisJCSBsc2Ffb2Zmc2V0OjMsCisJCSBtY2M6MTIsCisJCSBtbmM6MTI7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7Cit9OworCitzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyB7CisJc3RydWN0IGdzbTQ4X3NpX3NlbGVjdGlvbl9wYXJhbXMgc2VsZWN0aW9uX3BhcmFtczsKKwlzdHJ1Y3QgZ3NtNDhfc2lfcG93ZXJfb2Zmc2V0IHBvd2VyX29mZnNldDsKKwl1X2ludDhfdCBzaTJ0ZXJfaW5kaWNhdG9yOworCXVfaW50OF90IGVhcmx5X2NtX2N0cmw7CisJc3RydWN0IHsKKwkJdV9pbnQ4X3Qgd2hlcmU6MywKKwkJCSBwcmVzZW50OjE7CisJfSBzY2hlZHVsaW5nOworCXN0cnVjdCBnc200OF9zaTNfZ3Byc19pbmQgZ3Byc19pbmQ7CisKKwkvKiBTSSA0IHNwZWNpZmljICovCisJc3RydWN0IGdzbTQ4X2xzYV9wYXJhbXMgbHNhX3BhcmFtczsKKwl1X2ludDE2X3QgY2VsbF9pZDsKKwl1X2ludDhfdCBicmVha19pbmQ7CS8qIGRvIHdlIGhhdmUgU0k3ICsgU0k4ID8gKi8KK307CisKKworLyogR2VuZXJhdGUgU0kzIFJlc3QgT2N0ZXN0cyAoQ2hhcHRlciAxMC41LjIuMzQgLyBUYWJsZSAxMC40LjcyKSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMyh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8gKnNpMyk7CisKKy8qIEdlbmVyYXRlIFNJNCBSZXN0IE9jdGV0cyAoQ2hhcHRlciAxMC41LjIuMzUpICovCitpbnQgcmVzdF9vY3RldHNfc2k0KHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyAqc2k0KTsKKworZW51bSBwYmNjaF9jYXJyaWVyX3R5cGUgeworCVBCQ0NIX0JDQ0gsCisJUEJDQ0hfQVJGQ04sCisJUEJDQ0hfTUFJTworfTsKKworLyogVFMgMDMuNjAgQ2hhcHRlciA2LjMuMy4xOiBOZXR3b3JrIE1vZGUgb2YgT3BlcmF0aW9uICovCitlbnVtIGdwcnNfbm1vIHsKKwlHUFJTX05NT19JCT0gMCwJLyogQ1MgcGFnaW4gb24gR1BSUyBwYWdpbmcgb3IgdHJhZmZpYyBjaGFubmVsICovCisJR1BSU19OTU9fSUkJPSAxLAkvKiBhbGwgcGFnaW5nIG9uIENDQ0ggKi8KKwlHUFJTX05NT19JSUkJPSAyLAkvKiBubyBwYWdpbmcgY29vcmRpbmF0aW9uICovCit9OworCisvKiBUUyAwNC42MCAxMi4yNCAqLworc3RydWN0IGdwcnNfY2VsbF9vcHRpb25zIHsKKwllbnVtIGdwcnNfbm1vIG5tbzsKKwkvKiBUMzE2ODogd2FpdCBmb3IgcGFja2V0IHVwbGluayBhc3NpZ25tZW50IG1lc3NhZ2UgKi8KKwl1X2ludDMyX3QgdDMxNjg7CS8qIGluIG1pbGxpc2Vjb25kcyAqLworCS8qIFQzMTkyOiB3YWl0IGZvciByZWxlYXNlIG9mIHRoZSBUQkYgYWZ0ZXIgcmVjZXB0aW9uIG9mIHRoZSBmaW5hbCBibG9jayAqLworCXVfaW50MzJfdCB0MzE5MjsJLyogaW4gbWlsbGlzZWNvbmRzICovCisJdV9pbnQzMl90IGRyeF90aW1lcl9tYXg7LyogaW4gc2Vjb25kcyAqLworCXVfaW50MzJfdCBic19jdl9tYXg7CisKKwl1X2ludDhfdCBleHRfaW5mb19wcmVzZW50OworCXN0cnVjdCB7CisJCXVfaW50OF90IGVncHJzX3N1cHBvcnRlZDsKKwkJCXVfaW50OF90IHVzZV9lZ3Byc19wX2NoX3JlcTsKKwkJCXVfaW50OF90IGJlcF9wZXJpb2Q7CisJCXVfaW50OF90IHBmY19zdXBwb3J0ZWQ7CisJCXVfaW50OF90IGR0bV9zdXBwb3J0ZWQ7CisJCXVfaW50OF90IGJzc19wYWdpbmdfY29vcmRpbmF0aW9uOworCX0gZXh0X2luZm87Cit9OworCisvKiBUUyAwNC42MCBUYWJsZSAxMi45LjIgKi8KK3N0cnVjdCBncHJzX3Bvd2VyX2N0cmxfcGFycyB7CisJdV9pbnQ4X3QgYWxwaGE7CisJdV9pbnQ4X3QgdF9hdmdfdzsKKwl1X2ludDhfdCB0X2F2Z190OworCXVfaW50OF90IHBjX21lYXNfY2hhbjsKKwl1X2ludDhfdCBuX2F2Z19pOworfTsKKworc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyB7CisJc3RydWN0IGdwcnNfY2VsbF9vcHRpb25zIGNlbGxfb3B0czsKKwlzdHJ1Y3QgZ3Byc19wb3dlcl9jdHJsX3BhcnMgcHdyX2N0cmxfcGFyczsKKwl1X2ludDhfdCBiY2NoX2NoYW5nZV9tYXJrOworCXVfaW50OF90IHNpX2NoYW5nZV9maWVsZDsKKwl1X2ludDhfdCBwYmNjaF9wcmVzZW50OworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQ4X3QgcmFjOworCQkJdV9pbnQ4X3Qgc3BnY19jY2NoX3N1cDsKKwkJCXVfaW50OF90IG5ldF9jdHJsX29yZDsKKwkJCXVfaW50OF90IHByaW9fYWNjX3RocjsKKwkJfSBub19wYmNjaDsKKwkJc3RydWN0IHsKKwkJCXVfaW50OF90IHBzaTFfcmVwX3BlcjsKKwkJCXVfaW50OF90IHBiOworCQkJdV9pbnQ4X3QgdHNjOworCQkJdV9pbnQ4X3QgdG47CisJCQllbnVtIHBiY2NoX2NhcnJpZXJfdHlwZSBjYXJyaWVyX3R5cGU7CisJCQl1X2ludDE2X3QgYXJmY247CisJCQl1X2ludDhfdCBtYWlvOworCQl9IHBiY2NoOworCX07Cit9OworCisvKiBHZW5lcmF0ZSBTSTEzIFJlc3QgT2N0ZXN0cyAoQ2hhcHRlciAxMC41LjIuMzdiKSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaTEzX2luZm8gKnNpMTMpOworCisjZW5kaWYgLyogX1JFU1RfT0NURVRTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3JzMjMyLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yczIzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTg3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yczIzMi5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfUlMyMzJfSAorI2RlZmluZSBfUlMyMzJfSAorCitpbnQgcnMyMzJfc2V0dXAoY29uc3QgY2hhciAqc2VyaWFsX3BvcnQsIHVuc2lnbmVkIGludCBkZWxheV9tcywKKwkJc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKK2ludCBoYW5kbGVfc2VyaWFsX21zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKworI2VuZGlmIC8qIF9SUzIzMl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ydHBfcHJveHkuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3J0cF9wcm94eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YjFhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ydHBfcHJveHkuaApAQCAtMCwwICsxLDkxIEBACisjaWZuZGVmIF9SVFBfUFJPWFlfSAorI2RlZmluZSBfUlRQX1BST1hZX0gKKworLyogUlRQIHByb3h5IGhhbmRsaW5nIGZvciBpcC5hY2Nlc3MgbmFub0JUUyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCisjZGVmaW5lIFJUUF9QVF9HU01fRlVMTCAzCisjZGVmaW5lIFJUUF9QVF9HU01fSEFMRiA5NgorI2RlZmluZSBSVFBfUFRfR1NNX0VGUiA5NworI2RlZmluZSBSVFBfUFRfQU1SX0ZVTEwgOTgKKyNkZWZpbmUgUlRQX1BUX0FNUl9IQUxGIDk5CisKK2VudW0gcnRwX3J4X2FjdGlvbiB7CisJUlRQX05PTkUsCisJUlRQX1BST1hZLAorCVJUUF9SRUNWX1VQU1RSRUFNLAorfTsKKworZW51bSBydHBfdHhfYWN0aW9uIHsKKwlSVFBfU0VORF9OT05FLAorCVJUUF9TRU5EX0RPV05TVFJFQU0sCit9OworCitzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgeworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW5fbG9jYWw7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbl9yZW1vdGU7CisKKwlzdHJ1Y3QgYnNjX2ZkIGJmZDsKKwkvKiBsaW5rZWQgbGlzdCBvZiB0by1iZS10cmFuc21pdHRlZCBtc2diJ3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9xdWV1ZTsKK307CisKK3N0cnVjdCBydHBfc29ja2V0IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IHJ0cF9zdWJfc29ja2V0IHJ0cDsKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgcnRjcDsKKworCS8qIHdoYXQgc2hvdWxkIHdlIGRvIG9uIHJlY2VpdmU/ICovCisJZW51bSBydHBfcnhfYWN0aW9uIHJ4X2FjdGlvbjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgcnRwX3NvY2tldCAqb3RoZXJfc29jazsKKwkJfSBwcm94eTsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCQkJdV9pbnQzMl90IGNhbGxyZWY7CisJCX0gcmVjZWl2ZTsKKwl9OworCWVudW0gcnRwX3R4X2FjdGlvbiB0eF9hY3Rpb247CisJc3RydWN0IHsKKwkJdV9pbnQxNl90IHNlcXVlbmNlOworCQl1X2ludDMyX3QgdGltZXN0YW1wOworCQl1X2ludDMyX3Qgc3NyYzsKKwkJc3RydWN0IHRpbWV2YWwgbGFzdF90djsKKwl9IHRyYW5zbWl0OworfTsKKworc3RydWN0IHJ0cF9zb2NrZXQgKnJ0cF9zb2NrZXRfY3JlYXRlKHZvaWQpOworaW50IHJ0cF9zb2NrZXRfYmluZChzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHVfaW50MzJfdCBpcCk7CitpbnQgcnRwX3NvY2tldF9jb25uZWN0KHN0cnVjdCBydHBfc29ja2V0ICpycywgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCk7CitpbnQgcnRwX3NvY2tldF9wcm94eShzdHJ1Y3QgcnRwX3NvY2tldCAqdGhpcywgc3RydWN0IHJ0cF9zb2NrZXQgKm90aGVyKTsKK2ludCBydHBfc29ja2V0X3Vwc3RyZWFtKHN0cnVjdCBydHBfc29ja2V0ICp0aGlzLCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdV9pbnQzMl90IGNhbGxyZWYpOworaW50IHJ0cF9zb2NrZXRfZnJlZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMpOworaW50IHJ0cF9zZW5kX2ZyYW1lKHN0cnVjdCBydHBfc29ja2V0ICpycywgc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZSk7CisKKyNlbmRpZiAvKiBfUlRQX1BST1hZX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpZ25hbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5NzRlMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpZ25hbC5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKiBHZW5lcmljIHNpZ25hbGxpbmcvbm90aWZpY2F0aW9uIGluZnJhc3RydWN0dXJlICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgT1BFTkJTQ19TSUdOQUxfSAorI2RlZmluZSBPUEVOQlNDX1NJR05BTF9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3NpZ25hbC5oPgorCisvKgorICogU2lnbmFsbGluZyBzdWJzeXN0ZW1zCisgKi8KK2VudW0gc2lnbmFsX3N1YnN5c3RlbXMgeworCVNTX1BBR0lORywKKwlTU19TTVMsCisJU1NfQUJJU0lQLAorCVNTX05NLAorCVNTX0xDSEFOLAorCVNTX1NVQlNDUiwKKwlTU19TQ0FMTCwKKwlTU19HTE9CQUwsCisJU1NfQ0hBTExPQywKK307CisKKy8qIFNTX1BBR0lORyBzaWduYWxzICovCitlbnVtIHNpZ25hbF9wYWdpbmcgeworCVNfUEFHSU5HX1NVQ0NFRURFRCwKKwlTX1BBR0lOR19FWFBJUkVELAorfTsKKworLyogU1NfU01TIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX3NtcyB7CisJU19TTVNfU1VCTUlUVEVELAkvKiBBIFNNUyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHVzICovCisJU19TTVNfREVMSVZFUkVELAkvKiBBIFNNUyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsaXZlcmVkIHRvIGEgTVMgKi8KKwlTX1NNU19TTU1BLAkJLyogQSBNUyB0ZWxscyB1cyBpdCBoYXMgbW9yZSBzcGFjZSBhdmFpbGFibGUgKi8KKwlTX1NNU19NRU1fRVhDRUVERUQsCS8qIEEgTVMgdGVsbHMgdXMgaXQgaGFzIG5vIG1vcmUgc3BhY2UgYXZhaWxhYmxlICovCit9OworCisvKiBTU19BQklTSVAgc2lnbmFscyAqLworZW51bSBzaWduYWxfYWJpc2lwIHsKKwlTX0FCSVNJUF9DUkNYX0FDSywKKwlTX0FCSVNJUF9NRENYX0FDSywKKwlTX0FCSVNJUF9ETENYX0lORCwKK307CisKKy8qIFNTX05NIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX25tIHsKKwlTX05NX1NXX0FDVElWX1JFUCwJLyogR1NNIDEyLjIxIHNvZnR3YXJlIGFjdGl2YXRlZCByZXBvcnQgKi8KKwlTX05NX0ZBSUxfUkVQLAkJLyogR1NNIDEyLjIxIGZhaWx1cmUgZXZlbnQgcmVwb3J0ICovCisJU19OTV9OQUNLLAkJLyogR1NNIDEyLjIxIHZhcmlvdXMgTk1fTVRfKl9OQUNLIGhhcHBlbmVkICovCisJU19OTV9JUEFDQ19OQUNLLAkvKiBHU00gMTIuMjEgbmFub0JUUyBleHRlbnNpb25zIE5NX01UX0lQQUNDXypfKl9OQUNLIGhhcHBlbmVkICovCisJU19OTV9JUEFDQ19BQ0ssCQkvKiBHU00gMTIuMjEgbmFub0JUUyBleHRlbnNpb25zIE5NX01UX0lQQUNDXypfKl9BQ0sgaGFwcGVuZWQgKi8KKwlTX05NX0lQQUNDX1JFU1RBUlRfQUNLLCAvKiBuYW5vQlRTIGhhcyBzZW5kIGEgcmVzdGFydCBhY2sgKi8KKwlTX05NX0lQQUNDX1JFU1RBUlRfTkFDSywvKiBuYW5vQlRTIGhhcyBzZW5kIGEgcmVzdGFydCBhY2sgKi8KKwlTX05NX1RFU1RfUkVQLAkJLyogR1NNIDEyLjIxIFRlc3QgUmVwb3J0ICovCit9OworCisvKiBTU19MQ0hBTiBzaWduYWxzICovCitlbnVtIHNpZ25hbF9sY2hhbiB7CisJLyoKKwkgKiBUaGUgbGNoYW4gZ290IGZyZWVkIHdpdGggYW4gdXNlX2NvdW50ICE9IDAgYW5kIGVycm9yCisJICogcmVjb3ZlcnkgbmVlZHMgdG8gYmUgY2FycmllZCBvdXQgZnJvbSB3aXRoaW4gdGhlCisJICogc2lnbmFsIGhhbmRsZXIuCisJICovCisJU19MQ0hBTl9VTkVYUEVDVEVEX1JFTEVBU0UsCisJU19MQ0hBTl9BQ1RJVkFURV9BQ0ssCQkvKiAwOC41OCBDaGFubmVsIEFjdGl2YXRlIEFDSyAqLworCVNfTENIQU5fQUNUSVZBVEVfTkFDSywJCS8qIDA4LjU4IENoYW5uZWwgQWN0aXZhdGUgTkFDSyAqLworCVNfTENIQU5fSEFORE9WRVJfQ09NUEwsCQkvKiAwNC4wOCBIYW5kb3ZlciBDb21wbGV0ZWQgKi8KKwlTX0xDSEFOX0hBTkRPVkVSX0ZBSUwsCQkvKiAwNC4wOCBIYW5kb3ZlciBGYWlsZWQgKi8KKwlTX0xDSEFOX0hBTkRPVkVSX0RFVEVDVCwJLyogMDguNTggSGFuZG92ZXIgRGV0ZWN0ICovCisJU19MQ0hBTl9NRUFTX1JFUCwJCS8qIDA4LjU4IE1lYXN1cmVtZW50IFJlcG9ydCAqLworfTsKKworLyogU1NfQ0hBTExPQyBzaWduYWxzICovCitlbnVtIHNpZ25hbF9jaGFsbG9jIHsKKwlTX0NIQUxMT0NfQUxMT0NfRkFJTCwJLyogYWxsb2NhdGlvbiBvZiBsY2hhbiBoYXMgZmFpbGVkICovCisJU19DSEFMTE9DX0ZSRUVELAkvKiBsY2hhbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZnJlZWQgKi8KK307CisKKy8qIFNTX1NVQlNDUiBzaWduYWxzICovCitlbnVtIHNpZ25hbF9zdWJzY3IgeworCVNfU1VCU0NSX0FUVEFDSEVELAorCVNfU1VCU0NSX0RFVEFDSEVELAorCVNfU1VCU0NSX0lERU5USVRZLAkJLyogd2UndmUgcmVjZWl2ZWQgc29tZSBpZGVudGl0eSBpbmZvcm1hdGlvbiAqLworfTsKKworLyogU1NfU0NBTEwgc2lnbmFscyAqLworZW51bSBzaWduYWxfc2NhbGwgeworCVNfU0NBTExfU1VDQ0VTUywKKwlTX1NDQUxMX0VYUElSRUQsCisJU19TQ0FMTF9ERVRBQ0hFRCwKK307CisKK2VudW0gc2lnbmFsX2dsb2JhbCB7CisJU19HTE9CQUxfU0hVVERPV04sCit9OworCitzdHJ1Y3QgcGFnaW5nX3NpZ25hbF9kYXRhIHsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJLyogTlVMTCBpbiBjYXNlIHRoZSBwYWdpbmcgZGlkbid0IHdvcmsgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKK307CisKK3N0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSB7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJdm9pZCAqZGF0YTsKK307CisKK3N0cnVjdCBpcGFjY19hY2tfc2lnbmFsX2RhdGEgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJdV9pbnQ4X3QgbXNnX3R5cGU7CQorfTsKKworc3RydWN0IGNoYWxsb2Nfc2lnbmFsX2RhdGEgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJZW51bSBnc21fY2hhbl90IHR5cGU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpbGVudF9jYWxsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWxlbnRfY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmM1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWxlbnRfY2FsbC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX1NJTEVOVF9DQUxMX0gKKyNkZWZpbmUgX1NJTEVOVF9DQUxMX0gKKworZXh0ZXJuIGludCBnc21fc2lsZW50X2NhbGxfc3RhcnQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgdHlwZSk7CitleHRlcm4gaW50IGdzbV9zaWxlbnRfY2FsbF9zdG9wKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2V4dGVybiBpbnQgc2lsZW50X2NhbGxfcngoc3RydWN0IG1zZ2IgKm1zZyk7CitleHRlcm4gaW50IHNpbGVudF9jYWxsX3Jlcm91dGUoc3RydWN0IG1zZ2IgKm1zZyk7CisKKyNlbmRpZiAvKiBfU0lMRU5UX0NBTExfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3ViY2hhbl9kZW11eC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3ViY2hhbl9kZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZmEwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zdWJjaGFuX2RlbXV4LmgKQEAgLTAsMCArMSwxMDIgQEAKKyNpZm5kZWYgX1NVQkNIX0RFTVVYX0gKKyNkZWZpbmUgX1NVQkNIX0RFTVVYX0gKKy8qIEEgRTEgc3ViLWNoYW5uZWwgKGRlKW11bHRpcGxleGVyIHdpdGggVFJBVSBmcmFtZSBzeW5jICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorCisjZGVmaW5lIE5SX1NVQkNICTQKKyNkZWZpbmUgVFJBVV9GUkFNRV9TSVpFCTQwCisjZGVmaW5lIFRSQVVfRlJBTUVfQklUUwkoVFJBVV9GUkFNRV9TSVpFKjgpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERFTVVMVElQTEVYRVIgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGRlbXV4X3N1YmNoIHsKKwl1X2ludDhfdCBvdXRfYml0YnVmW1RSQVVfRlJBTUVfQklUU107CisJdV9pbnQxNl90IG91dF9pZHg7IC8qIG5leHQgYml0IHRvIGJlIHdyaXR0ZW4gaW4gb3V0X2JpdGJ1ZiAqLworCS8qIG51bWJlciBvZiBjb25zZWN1dGl2ZSB6ZXJvcyB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgKGZvciBzeW5jKSAqLworCXVuc2lnbmVkIGludCBjb25zZWN1dGl2ZV96ZXJvczsKKwkvKiBhcmUgd2UgaW4gVFJBVSBmcmFtZSBzeW5jIG9yIG5vdD8gKi8KKwl1bnNpZ25lZCBpbnQgaW5fc3luYzsKK307CisKK3N0cnVjdCBzdWJjaF9kZW11eCB7CisJLyogYml0bWFzayBvZiBjdXJyZW50bHkgYWN0aXZlIHN1YmNoYW5uZWxzICovCisJdV9pbnQ4X3QgY2hhbl9hY3RpdjsKKwkvKiBvbmUgZGVtdXhfc3ViY2ggc3RydWN0IGZvciBldmVyeSBzdWJjaGFubmVsICovCisJc3RydWN0IGRlbXV4X3N1YmNoIHN1YmNoW05SX1NVQkNIXTsKKwkvKiBjYWxsYmFjayB0byBiZSBjYWxsZWQgb25jZSB3ZSBoYXZlIHJlY2VpdmVkIGEgY29tcGxldGUKKwkgKiBmcmFtZSBvbiBhIGdpdmVuIHN1YmNoYW5uZWwgKi8KKwlpbnQgKCpvdXRfY2IpKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgY2gsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuLAorCQkgICAgICB2b2lkICopOworCS8qIHVzZXItcHJvdmlkZWQgZGF0YSwgdHJhbnNwYXJlbnRseSBwYXNzZWQgdG8gb3V0X2NiKCkgKi8KKwl2b2lkICpkYXRhOworfTsKKworLyogaW5pdGlhbGl6ZSBvbmUgZGVtdWx0aXBsZXhlciBpbnN0YW5jZSAqLworaW50IHN1YmNoX2RlbXV4X2luaXQoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgpOworCisvKiBmZWVkICdsZW4nIG51bWJlciBvZiBtdXhlZCBieXRlcyBpbnRvIHRoZSBkZW11bHRpcGxleGVyICovCitpbnQgc3ViY2hfZGVtdXhfaW4oc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKKworLyogYWN0aXZhdGUgZGVjb2RpbmcvcHJvY2Vzc2luZyBmb3Igb25lIHN1YmNoYW5uZWwgKi8KK2ludCBzdWJjaF9kZW11eF9hY3RpdmF0ZShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IHN1YmNoKTsKKworLyogZGVhY3RpdmF0ZSBkZWNvZGluZy9wcm9jZXNzaW5nIGZvciBvbmUgc3ViY2hhbm5lbCAqLworaW50IHN1YmNoX2RlbXV4X2RlYWN0aXZhdGUoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIGludCBzdWJjaCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1VTFRJUExFWEVSICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIG9uZSBlbGVtZW50IGluIHRoZSB0eF9xdWV1ZSBvZiBhIG11eGVyIHN1Yi1jaGFubmVsICovCitzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJdW5zaWduZWQgaW50IGJpdF9sZW47CS8qIHRvdGFsIG51bWJlciBvZiBiaXRzIGluICdiaXRzJyAqLworCXVuc2lnbmVkIGludCBuZXh0X2JpdDsJLyogbmV4dCBiaXQgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKworCXVfaW50OF90IGJpdHNbMF07CS8qIG9uZSBiaXQgcGVyIGJ5dGUgKi8KK307CisKK3N0cnVjdCBtdXhfc3ViY2ggeworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X3F1ZXVlOworfTsKKworLyogc3RydWN0dXJlIHJlcHJlc2VudGluZyBvbmUgaW5zdGFuY2Ugb2YgdGhlIHN1YmNoYW5uZWwgbXV4ZXIgKi8KK3N0cnVjdCBzdWJjaF9tdXggeworCXN0cnVjdCBtdXhfc3ViY2ggc3ViY2hbTlJfU1VCQ0hdOworfTsKKworLyogaW5pdGlhbGl6ZSBhIHN1YmNoYW5uZWwgbXV4ZXIgaW5zdGFuY2UgKi8KK2ludCBzdWJjaGFuX211eF9pbml0KHN0cnVjdCBzdWJjaF9tdXggKm14KTsKKworLyogcmVxdWVzdCB0aGUgb3V0cHV0IG9mICdsZW4nIG11bHRpcGxleGVkIGJ5dGVzICovCitpbnQgc3ViY2hhbl9tdXhfb3V0KHN0cnVjdCBzdWJjaF9tdXggKm14LCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CisKKy8qIGVucXVldWUgc29tZSBkYXRhIGludG8gb25lIHN1Yi1jaGFubmVsIG9mIHRoZSBtdXhlciAqLworaW50IHN1YmNoYW5fbXV4X2VucXVldWUoc3RydWN0IHN1YmNoX211eCAqbXgsIGludCBzX25yLCBjb25zdCB1X2ludDhfdCAqZGF0YSwKKwkJCWludCBsZW4pOworCisjZW5kaWYgLyogX1NVQkNIX0RFTVVYX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N5c3RlbV9pbmZvcm1hdGlvbi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyYTlhYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N5c3RlbV9pbmZvcm1hdGlvbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfU1lTVEVNX0lORk9fSAorI2RlZmluZSBfU1lTVEVNX0lORk9fSAorCitpbnQgZ3NtX2dlbmVyYXRlX3NpKHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMsIGludCB0eXBlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjMzZiNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDQzIEBACisvKiBtaW5pbWFsaXN0aWMgdGVsbmV0L25ldHdvcmsgaW50ZXJmYWNlIGl0IG1pZ2h0IHR1cm4gaW50byBhIHdpcmUgaW50ZXJmYWNlICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBURUxORVRfSU5URVJGQUNFX0gKKyNkZWZpbmUgVEVMTkVUX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlICJnc21fZGF0YS5oIgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcms7CisJc3RydWN0IGJzY19mZCBmZDsKKwlzdHJ1Y3QgdnR5ICp2dHk7CisJc3RydWN0IGxvZ190YXJnZXQgKmRiZzsKK307CisKKwordm9pZCB0ZWxuZXRfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcmssIGludCBwb3J0KTsKKworaW50IGJzY192dHlfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhbnNhY3Rpb24uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYW5zYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhMDA4YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYW5zYWN0aW9uLmgKQEAgLTAsMCArMSw3NiBAQAorI2lmbmRlZiBfVFJBTlNBQ1RfSAorI2RlZmluZSBfVFJBTlNBQ1RfSAorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorCisvKiBPbmUgdHJhbnNhY3Rpb24gKi8KK3N0cnVjdCBnc21fdHJhbnMgeworCS8qIEVudHJ5IGluIGxpc3Qgb2YgYWxsIHRyYW5zYWN0aW9ucyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJLyogVGhlIHByb3RvY29sIHdpdGhpbiB3aGljaCB3ZSBsaXZlICovCisJdV9pbnQ4X3QgcHJvdG9jb2w7CisKKwkvKiBUaGUgY3VycmVudCB0cmFuc2FjdGlvbiBJRCAqLworCXVfaW50OF90IHRyYW5zYWN0aW9uX2lkOworCQorCS8qIFRvIHdob20gd2UgYmVsb25nLCB1bmlxdWUgaWRlbnRpZmllciBvZiByZW1vdGUgTU0gZW50aXR5ICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiBUaGUgYXNzb2NpYXRlZCBjb25uZWN0aW9uIHdlIGFyZSB1c2luZyB0byB0cmFuc21pdCBtZXNzYWdlcyAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCisJLyogcmVmZXJlbmNlIGZyb20gTU5DQyBvciBvdGhlciBhcHBsaWNhdGlvbiAqLworCXVfaW50MzJfdCBjYWxscmVmOworCisJLyogaWYgdHJhZmZpYyBjaGFubmVsIHJlY2VpdmUgd2FzIHJlcXVlc3RlZCAqLworCWludCB0Y2hfcmVjdjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKworCQkJLyogY3VycmVudCBjYWxsIHN0YXRlICovCisJCQlpbnQgc3RhdGU7CisKKwkJCS8qIGN1cnJlbnQgdGltZXIgYW5kIG1lc3NhZ2UgcXVldWUgKi8KKwkJCWludCBUY3VycmVudDsJCS8qIGN1cnJlbnQgQ0MgdGltZXIgKi8KKwkJCWludCBUMzA4X3NlY29uZDsJLyogdXNlZCB0byBzZW5kIHJlbGVhc2UgYWdhaW4gKi8KKwkJCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCQkJc3RydWN0IGdzbV9tbmNjIG1zZzsJLyogc3RvcmVzIHNldHVwL2Rpc2Nvbm5lY3QvcmVsZWFzZSBtZXNzYWdlICovCisJCX0gY2M7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCBsaW5rX2lkOwkvKiBSU0wgTGluayBJRCB0byBiZSB1c2VkIGZvciB0aGlzIHRyYW5zICovCisJCQlpbnQgaXNfbXQ7CS8qIGlzIHRoaXMgYSBNTyAoMCkgb3IgTVQgKDEpIHRyYW5zZmVyICovCisJCQllbnVtIGdzbTQxMV9jcF9zdGF0ZSBjcF9zdGF0ZTsKKwkJCXN0cnVjdCB0aW1lcl9saXN0IGNwX3RpbWVyOworCisJCQllbnVtIGdzbTQxMV9ycF9zdGF0ZSBycF9zdGF0ZTsKKworCQkJc3RydWN0IGdzbV9zbXMgKnNtczsKKwkJfSBzbXM7CisJfTsKK307CisKKworCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSAgIHVfaW50OF90IHByb3RvLCB1X2ludDhfdCB0cmFuc19pZCk7CitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2NhbGxyZWYoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVfaW50MzJfdCBjYWxscmVmKTsKKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfYWxsb2Moc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdHJhbnNfaWQsCisJCQkgICAgICB1X2ludDMyX3QgY2FsbHJlZik7Cit2b2lkIHRyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworCitpbnQgdHJhbnNfYXNzaWduX3RyYW5zX2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdGlfZmxhZyk7CisKKy8qIHVwZGF0ZSBhbGwgdHJhbnNhY3Rpb25zIHRvIHVzZSBhIGRpZmZlcmVudCBMQ0hBTiwgZS5nLgorICogYWZ0ZXIgaGFuZG92ZXIgaGFzIHN1Y2NlZWRlZCAqLworaW50IHRyYW5zX2xjaGFuX2NoYW5nZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubl9vbGQsCisJCSAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubl9uZXcpOworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X2ZyYW1lLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X2ZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyM2Q0YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfZnJhbWUuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIF9UUkFVX0ZSQU1FX0gKKyNkZWZpbmUgX1RSQVVfRlJBTUVfSAorLyogVFJBVSBmcmFtZSBoYW5kbGluZyBhY2NvcmRpbmcgdG8gR1NNIFRTIDA4LjYwICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiAyMSBmb3IgRlIvRUZSLCAyNSBmb3IgQU1SLCAxNSBmb3IgT00sIDE1IGZvciBkYXRhLCAxMyBmb3IgRS1kYXRhLCAyMSBpZGxlICovCisjZGVmaW5lIE1BWF9DX0JJVFMJMjUKKy8qIDI2MCBmb3IgRlIvRUZSLCAyNTYgZm9yIEFNUiwgMjY0IGZvciBPTSwgMjg4IGZvciBFLWRhdGEgKi8KKyNkZWZpbmUgTUFYX0RfQklUUwkyODgKKy8qIGZvciBhbGwgc3BlZWNoIGZyYW1lcyAqLworI2RlZmluZSBNQVhfVF9CSVRTCTQKKy8qIGZvciBPTSAqLworI2RlZmluZSBNQVhfU19CSVRTCTYKKy8qIGZvciBFLWRhdGEgKi8KKyNkZWZpbmUgTUFYX01fQklUUwkyCisKK3N0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgeworCXVfaW50OF90IGNfYml0c1tNQVhfQ19CSVRTXTsKKwl1X2ludDhfdCBkX2JpdHNbTUFYX0RfQklUU107CisJdV9pbnQ4X3QgdF9iaXRzW01BWF9UX0JJVFNdOworCXVfaW50OF90IHNfYml0c1tNQVhfU19CSVRTXTsKKwl1X2ludDhfdCBtX2JpdHNbTUFYX01fQklUU107Cit9OworCisjZGVmaW5lIFRSQVVfRlRfRlJfVVAJCTB4MDIJLyogMCAwIDAgMSAwIC0gMy41LjEuMS4xICovCisjZGVmaW5lIFRSQVVfRlRfRlJfRE9XTgkJMHgxYwkvKiAxIDEgMSAwIDAgLSAzLjUuMS4xLjEgKi8KKyNkZWZpbmUgVFJBVV9GVF9FRlIJCTB4MWEJLyogMSAxIDAgMSAwIC0gMy41LjEuMS4xICovCisjZGVmaW5lIFRSQVVfRlRfQU1SCQkweDA2CS8qIDAgMCAxIDEgMCAtIDMuNS4xLjIgKi8KKyNkZWZpbmUgVFJBVV9GVF9PTV9VUAkJMHgwNwkvKiAwIDAgMSAwIDEgLSAzLjUuMiAqLworI2RlZmluZSBUUkFVX0ZUX09NX0RPV04JCTB4MWIJLyogMSAxIDAgMSAxIC0gMy41LjIgKi8KKyNkZWZpbmUgVFJBVV9GVF9EQVRBX1VQCQkweDA4CS8qIDAgMSAwIDAgMCAtIDMuNS4zICovCisjZGVmaW5lIFRSQVVfRlRfREFUQV9ET1dOCTB4MTYJLyogMSAwIDEgMSAwIC0gMy41LjMgKi8KKyNkZWZpbmUgVFJBVV9GVF9EMTQ1X1NZTkMJMHgxNAkvKiAxIDAgMSAwIDAgLSAzLjUuMyAqLworI2RlZmluZSBUUkFVX0ZUX0VEQVRBCQkweDFmCS8qIDEgMSAxIDEgMSAtIDMuNS40ICovCisjZGVmaW5lIFRSQVVfRlRfSURMRV9VUAkJMHgxMAkvKiAxIDAgMCAwIDAgLSAzLjUuNSAqLworI2RlZmluZSBUUkFVX0ZUX0lETEVfRE9XTgkweDBlCS8qIDAgMSAxIDEgMCAtIDMuNS41ICovCisKKworaW50IGRlY29kZV90cmF1X2ZyYW1lKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyLCBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzKTsKK2ludCBlbmNvZGVfdHJhdV9mcmFtZSh1X2ludDhfdCAqdHJhdV9iaXRzLCBjb25zdCBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmcik7CitpbnQgdHJhdV9mcmFtZV91cDJkb3duKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKTsKK3VfaW50OF90ICp0cmF1X2lkbGVfZnJhbWUodm9pZCk7CisKKworI2VuZGlmIC8qIF9UUkFVX0ZSQU1FX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfbXV4LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X211eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWI3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X211eC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIFNpbXBsZSBUUkFVIGZyYW1lIHJlZmxlY3RvciB0byByb3V0ZSB2b2ljZSBjYWxscyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qIFRoZSAiVFJBVSBtdXggbWFwIiBkZWZpbmVzIHdoaWNoIHBhcnRpY3VsYXIgMTZrYml0IHN1Yi1zbG90IChpbiB3aGljaCBFMQorICogdGltZXNsb3Qgb24gd2hpY2ggRTEgaW50ZXJmYWNlKSBzaG91bGQgYmUgZGlyZWN0bHkgbXV4ZWQgdG8gd2hpY2ggb3RoZXIgCisgKiBzdWItc2xvdC4gIEVudHJpZXMgaW4gdGhlIG11eCBtYXAgYXJlIGFsd2F5cyBiaS1kaXJlY3Rpb25hbC4gCisgKgorICogVGhlIGlkZWEgb2YgYWxsIHRoaXMgaXMgdG8gZGlyZWN0bHkgc3dpdGNoIHZvaWNlIGNoYW5uZWxzIGluIHRoZSBCU0MKKyAqIGZyb20gb25lIHBob25lIHRvIGFub3RoZXIuICBXZSBkbyB0aGlzIHJpZ2h0IG5vdyBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0CisgKiBhbnkgZXh0ZXJuYWwgaW50ZXJmYWNlIGZvciB2b2ljZSBjaGFubmVscywgYW5kIGluIHRoZSBmdXR1cmUgYXMgYW4KKyAqIG9wdGltaXphdGlvbiB0byByb3V0aW5nIHRoZW0gZXh0ZXJuYWxseS4KKyAqLworCisvKiBtYXAgYSBUUkFVIG11eCBtYXAgZW50cnkgKi8KK2ludCB0cmF1X211eF9tYXAoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmMsCisJCSBjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmRzdCk7CitpbnQgdHJhdV9tdXhfbWFwX2xjaGFuKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKnNyYywJCisJCQljb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpkc3QpOworCisvKiB1bm1hcCBhIFRSQVUgbXV4IG1hcCBlbnRyeSAqLworaW50IHRyYXVfbXV4X3VubWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3MsIHVfaW50MzJfdCBjYWxscmVmKTsKKworLyogd2UgZ2V0IGNhbGxlZCBieSBzdWJjaGFuX2RlbXV4ICovCitpbnQgdHJhdV9tdXhfaW5wdXQoc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfZTFfc3MsCisJCSAgIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMsIGludCBudW1fYml0cyk7CisKKy8qIGFkZCBhIHRyYXUgcmVjZWl2ZXIgKi8KK2ludCB0cmF1X3JlY3ZfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBjYWxscmVmKTsKKworLyogc2VuZCB0cmF1IGZyb20gYXBwbGljYXRpb24gKi8KK2ludCB0cmF1X3NlbmRfZnJhbWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpOwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdXNzZC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdXNzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZWEzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy91c3NkLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfVVNTRF9ICisjZGVmaW5lIF9VU1NEX0gKKworLyogSGFuZGxlciBmdW5jdGlvbiBmb3IgbW9iaWxlLW9yaWdpbmF0ZWQgVVNTRCBtZXNzYWdlcyAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCitpbnQgaGFuZGxlX3Jjdl91c3NkKHN0cnVjdCBtc2diICptc2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Z0eS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdnR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiMTE0OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Z0eS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgT1BFTkJTQ19WVFlfSAorI2RlZmluZSBPUEVOQlNDX1ZUWV9ICisKK3N0cnVjdCBnc21fbmV0d29yazsKK3N0cnVjdCB2dHk7CisKK3ZvaWQgb3BlbmJzY192dHlfYWRkX2NtZHModm9pZCk7Cit2b2lkIG9wZW5ic2NfdnR5X3ByaW50X3N0YXRpc3RpY3Moc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhhNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyIEBACitzY2NwX0hFQURFUlMgPSBzY2NwX3R5cGVzLmggc2NjcC5oCitzY2NwZGlyID0gJChpbmNsdWRlZGlyKS9zY2NwCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmggYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0YTJhYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3AuaApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIFNDQ1AgbWFuYWdlbWVudCBjb2RlCisgKgorICogKEMpIDIwMDksIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFNDQ1BfSAorI2RlZmluZSBTQ0NQX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAic2NjcF90eXBlcy5oIgorCitzdHJ1Y3QgbXNnYjsKK3N0cnVjdCBzY2NwX3N5c3RlbTsKKworZW51bSB7CisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX05PTkUsCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFUVVFU1QsCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0sCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVELAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VELAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9TRVRVUF9FUlJPUiwKK307CisKK3N0cnVjdCBzb2NrYWRkcl9zY2NwIHsKKwlzYV9mYW1pbHlfdAlzY2NwX2ZhbWlseTsJCS8qIEFGX1NDQ1AgaW4gdGhlIGZ1dHVyZT8/PyAqLworCXVfaW50OF90CXNjY3Bfc3NuOwkJLyogc3Vic3N5c3RlbSBudW1iZXIgZm9yIHJvdXRpbmcgKi8KKworCS8qIFRPRE8gZmlsbCBpbiBhZGRyZXNzIGluZGljYXRvci4uLiBpZiB0aGF0IGlzIGV2ZXIgbmVlZGVkICovCisKKwkvKiBub3Qgc3VyZSBhYm91dCB0aGVzZSAqLworCS8qIHVfaW50OF90ICAgIHNjY3BfY2xhc3M7ICovCit9OworCisvKgorICogcGFyc2VkIHN0cnVjdHVyZSBvZiBhbiBhZGRyZXNzCisgKi8KK3N0cnVjdCBzY2NwX2FkZHJlc3MgeworCXN0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzICAgIGFkZHJlc3M7CisJdV9pbnQ4X3QJCQkgICAgc3NuOworCXVfaW50OF90CQkJICAgIHBvaVsyXTsKK307CisKK3N0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgeworCXVfaW50OF90CQkJICAgIGRhdGFfbGVuOworCXVfaW50OF90CQkJICAgIGRhdGFfc3RhcnQ7Cit9OworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uIHsKKwkvKiBwdWJsaWMgKi8KKwl2b2lkICpkYXRhX2N0eDsKKwl2b2lkICgqZGF0YV9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZywgdW5zaWduZWQgaW50IGxlbik7CisKKwl2b2lkICpzdGF0ZV9jdHg7CisJdm9pZCAoKnN0YXRlX2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICosIGludCBvbGRfc3RhdGUpOworCisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJaW50IGNvbm5lY3Rpb25fc3RhdGU7CisKKwkvKiBwcml2YXRlICovCisJLyogbGlzdCBvZiBhY3RpdmUgY29ubmVjdGlvbnMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBzY2NwX3N5c3RlbSAqc3lzdGVtOworCWludCBpbmNvbWluZzsKK307CisKKy8qKgorICogc3lzdGVtIGZ1bmN0aW9uYWxpdHkgdG8gaW1wbGVtZW50IG9uIHRvcCBvZiBhbnkgb3RoZXIgdHJhbnNwb3J0IGxheWVyOgorICogICBjYWxsIHNjY3Bfc3lzdGVtX2luY29taW5nIGZvciBpbmNvbWluZyBkYXRhIChmcm9tIHRoZSBuZXR3b3JrKQorICogICBzY2NwIHdpbGwgY2FsbCBvdXRnb2luZyB3aGVuZXZlciBvdXRnb2luZyBkYXRhIGV4aXN0cworICovCitpbnQgc2NjcF9zeXN0ZW1faW5pdCh2b2lkICgqb3V0Z29pbmcpKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjdHgpLCB2b2lkICpjb250ZXh0KTsKK2ludCBzY2NwX3N5c3RlbV9pbmNvbWluZyhzdHJ1Y3QgbXNnYiAqZGF0YSk7CisKKy8qKgorICogU2VuZCBkYXRhIG9uIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24KKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl93cml0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbXNnYiAqZGF0YSk7CitpbnQgc2NjcF9jb25uZWN0aW9uX3NlbmRfaXQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitpbnQgc2NjcF9jb25uZWN0aW9uX2Nsb3NlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCBjYXVzZSk7CitpbnQgc2NjcF9jb25uZWN0aW9uX2ZyZWUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKy8qKgorICogaW50ZXJuYWwuLiAKKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9mb3JjZV9mcmVlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4pOworCisvKioKKyAqIENyZWF0ZSBhIG5ldyBzb2NrZXQuIFNldCB5b3VyIGNhbGxiYWNrcyBhbmQgdGhlbiBjYWxsIGJpbmQgdG8gb3BlbgorICogdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKnNjY3BfY29ubmVjdGlvbl9zb2NrZXQodm9pZCk7CisKKy8qKgorICogT3BlbiB0aGUgY29ubmVjdGlvbiBhbmQgc2VuZCBhZGRpdGlvbmFsIGRhdGEKKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9jb25uZWN0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNjY3BfY2FsbGVkLAorCQkJICAgIHN0cnVjdCBtc2diICpkYXRhKTsKKworLyoqCisgKiBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4gU2V0IHRoZSBhY2NlcHQgY2FsbGJhY2suCisgKiBUT0RPOiBhZGQgdHJ1ZSByb3V0aW5nIGluZm9ybWF0aW9uLi4uIGluIGFuYWxvZ3kgdG8gc29ja2V0LCBiaW5kLCBhY2NlcHQKKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2ssCisJCQkJIGludCAoKmFjY2VwdF9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdm9pZCAqZGF0YSksCisJCQkJIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qKgorICogU2VuZCBkYXRhIGluIHRlcm1zIG9mIHVuaXQgZGF0YS4gQSBmaXhlZCBhZGRyZXNzIGluZGljYXRvciB3aWxsIGJlIHVzZWQuCisgKi8KK2ludCBzY2NwX3dyaXRlKHN0cnVjdCBtc2diICpkYXRhLAorCSAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29ja19zZW5kZXIsCisJICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrX3RhcmdldCwgaW50IGNsYXNzKTsKK2ludCBzY2NwX3NldF9yZWFkKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrLAorCQkgIGludCAoKnJlYWRfY2IpKHN0cnVjdCBtc2diICptc2diLCB1bnNpZ25lZCBpbnQsIHZvaWQgKnVzZXJfZGF0YSksCisJCSAgdm9pZCAqdXNlcl9kYXRhKTsKKworLyogZ2VuZXJpYyBzb2NrIGFkZHJlc3NlcyAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwIHNjY3Bfc3NuX2Jzc2FwOworCisvKiBoZWxwZXJzICovCit1X2ludDMyX3Qgc2NjcF9zcmNfcmVmX3RvX2ludChzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpyZWYpOworc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzY2NwX3NyY19yZWZfZnJvbV9pbnQodV9pbnQzMl90KTsKKworLyoqCisgKiBCZWxvdyB0aGlzIGFyZSBoZWxwZXIgZnVuY3Rpb25zIGFuZCBzdHJ1Y3RzIGZvciBwYXJzaW5nIFNDQ1AgbWVzc2FnZXMKKyAqLworc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHsKKwlzdHJ1Y3Qgc2NjcF9hZGRyZXNzIGNhbGxlZDsKKwlzdHJ1Y3Qgc2NjcF9hZGRyZXNzIGNhbGxpbmc7CisKKwkvKiBwb2ludCB0byB0aGUgbXNnIHBhY2tldCAqLworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJLyogZGF0YSBwb2ludGVyICovCisJaW50IGRhdGFfbGVuOworfTsKKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBuYXQgY29kZQorICovCitpbnQgc2NjcF9kZXRlcm1pbmVfbXNnX3R5cGUoc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgc2NjcF9wYXJzZV9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3BfdHlwZXMuaCBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3BfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJkNzBmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3Avc2NjcF90eXBlcy5oCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogSVRVIFEuNzEzIGRlZmluZWQgdHlwZXMgZm9yIFNDQ1AKKyAqCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgU0NDUF9UWVBFU19ICisjZGVmaW5lIFNDQ1BfVFlQRVNfSAorCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKKy8qIFRhYmxlIDEvUS43MTMgLSBTQ0NQIG1lc3NhZ2UgdHlwZXMgKi8KK2VudW0gc2NjcF9tZXNzYWdlX3R5cGVzIHsKKwlTQ0NQX01TR19UWVBFX0NSCT0gMSwKKwlTQ0NQX01TR19UWVBFX0NDCT0gMiwKKwlTQ0NQX01TR19UWVBFX0NSRUYJPSAzLAorCVNDQ1BfTVNHX1RZUEVfUkxTRAk9IDQsCisJU0NDUF9NU0dfVFlQRV9STEMJPSA1LAorCVNDQ1BfTVNHX1RZUEVfRFQxCT0gNiwKKwlTQ0NQX01TR19UWVBFX0RUMgk9IDcsCisJU0NDUF9NU0dfVFlQRV9BSwk9IDgsCisJU0NDUF9NU0dfVFlQRV9VRFQJPSA5LAorCVNDQ1BfTVNHX1RZUEVfVURUUwk9IDEwLAorCVNDQ1BfTVNHX1RZUEVfRUQJPSAxMSwKKwlTQ0NQX01TR19UWVBFX0VBCT0gMTIsCisJU0NDUF9NU0dfVFlQRV9SU1IJPSAxMywKKwlTQ0NQX01TR19UWVBFX1JTQwk9IDE0LAorCVNDQ1BfTVNHX1RZUEVfRVJSCT0gMTUsCisJU0NDUF9NU0dfVFlQRV9JVAk9IDE2LAorCVNDQ1BfTVNHX1RZUEVfWFVEVAk9IDE3LAorCVNDQ1BfTVNHX1RZUEVfWFVEVFMJPSAxOCwKKwlTQ0NQX01TR19UWVBFX0xVRFQJPSAxOSwKKwlTQ0NQX01TR19UWVBFX0xVRFRTCT0gMjAKK307CisKKy8qIFRhYmxlIDIvUS43MTMgLSBTQ0NQIHBhcmFtZXRlciBuYW1lIGNvZGVzICovCitlbnVtIHNjY3BfcGFyYW1ldGVyX25hbWVfY29kZXMgeworCVNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTAkJPSAwLAorCVNDQ1BfUE5DX0RFU1RJTkFUSU9OX0xPQ0FMX1JFRkVSRU5DRQk9IDEsCisJU0NDUF9QTkNfU09VUkNFX0xPQ0FMX1JFRkVSRU5DRQkJPSAyLAorCVNDQ1BfUE5DX0NBTExFRF9QQVJUWV9BRERSRVNTCQk9IDMsCisJU0NDUF9QTkNfQ0FMTElOR19QQVJUWV9BRERSRVNTCQk9IDQsCisJU0NDUF9QTkNfUFJPVE9DT0xfQ0xBU1MJCQk9IDUsCisJU0NDUF9QTkNfU0VHTUVOVElORwkJCT0gNiwKKwlTQ0NQX1BOQ19SRUNFSVZFX1NFUV9OVU1CRVIJCT0gNywKKwlTQ0NQX1BOQ19TRVFVRU5DSU5HCQkJPSA4LAorCVNDQ1BfUE5DX0NSRURJVAkJCQk9IDksCisJU0NDUF9QTkNfUkVMRUFTRV9DQVVTRQkJCT0gMTAsCisJU0NDUF9QTkNfUkVUVVJOX0NBVVNFCQkJPSAxMSwKKwlTQ0NQX1BOQ19SRVNFVF9DQVVTRQkJCT0gMTIsCisJU0NDUF9QTkNfRVJST1JfQ0FVU0UJCQk9IDEzLAorCVNDQ1BfUE5DX1JFRlVTQUxfQ0FVU0UJCQk9IDE0LAorCVNDQ1BfUE5DX0RBVEEJCQkJPSAxNSwKKwlTQ0NQX1BOQ19TRUdNRU5UQVRJT04JCQk9IDE2LAorCVNDQ1BfUE5DX0hPUF9DT1VOVEVSCQkJPSAxNywKKwlTQ0NQX1BOQ19JTVBPUlRBTkNFCQkJPSAxOCwKKwlTQ0NQX1BOQ19MT05HX0RBVEEJCQk9IDE5LAorfTsKKworLyogRmlndXJlIDMvUS43MTMgQ2FsbGVkL2NhbGxpbmcgcGFydHkgYWRkcmVzcyAqLworZW51bSB7CisJU0NDUF9USVRMRV9JTkRfTk9ORQkJCT0gMCwKKwlTQ0NQX1RJVExFX0lORF9OQVRVUkVfT05MWQkJPSAxLAorCVNDQ1BfVElUTEVfSU5EX1RSQU5TTEFUSU9OX09OTFkJCT0gMiwKKwlTQ0NQX1RJVExFX0lORF9UUkFOU19OVU1fRU5DCQk9IDMsCisJU0NDUF9USVRMRV9JTkRfVFJBTlNfTlVNX0VOQ19OQVRVUkUJPSA0LAorfTsKKworZW51bSB7CisJU0NDUF9DQUxMX1JPVVRFX09OX1NTTgkJCT0gMSwKKwlTQ0NQX0NBTExfUk9VVEVfT05fR1QJCQk9IDAsCit9OworCitzdHJ1Y3Qgc2NjcF9jYWxsZWRfcGFydHlfYWRkcmVzcyB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVfaW50OF90CXBvaW50X2NvZGVfaW5kaWNhdG9yIDogMSwKKwkJCXNzbl9pbmRpY2F0b3IJICAgICA6IDEsCisJCQlnbG9iYWxfdGl0bGVfaW5kaWNhdG9yIDogNCwKKwkJCXJvdXRpbmdfaW5kaWNhdG9yICAgIDogMSwKKwkJCXJlc2VydmVkCSAgICAgOiAxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90CXJlc2VydmVkCSAgICAgOiAxLAorCQkJcm91dGluZ19pbmRpY2F0b3IgICAgOiAxLAorCQkJZ2xvYmFsX3RpdGxlX2luZGljYXRvciA6IDQsCisJCQlzc25faW5kaWNhdG9yCSAgICAgOiAxLAorCQkJcG9pbnRfY29kZV9pbmRpY2F0b3IgOiAxOworI2VuZGlmCisJdV9pbnQ4X3QJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIGluZGljYXRvciBpbmRpY2F0ZXMgcHJlc2VuY2UgaW4gdGhlIGFib3ZlIG9yZGVyICovCisKKy8qIEZpZ3VyZSA2L1EuNzEzICovCitzdHJ1Y3Qgc2NjcF9zaWduYWxsaW5nX3BvaW50X2NvZGUgeworCXVfaW50OF90CWxzYjsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QJbXNiIDogNiwKKwkJCXJlc2VydmVkIDogMjsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdAlyZXNlcnZlZCA6IDIsCisJCQltc2IgOiA2OworI2VuZGlmCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTU04gPT0gc3Vic3lzdGVtIG51bWJlciAqLworZW51bSBzY2NwX3N1YnN5c3RlbV9udW1iZXIgeworCVNDQ1BfU1NOX05PVF9LTk9XTl9PUl9VU0VECSAgICA9IDAsCisJU0NDUF9TU05fTUFOQUdFTUVOVAkJICAgID0gMSwKKwlTQ0NQX1NTTl9SRVNFUlZFRF9JVFUJCSAgICA9IDIsCisJU0NDUF9TU05fSVNETl9VU0VSX1BBUlQJCSAgICA9IDMsCisJU0NDUF9TU05fT01BUAkJCSAgICA9IDQsIC8qIG9wZXJhdGlvbiwgbWFpbnQgYW5kIGFkbWluaXN0cmF0aW9uIHBhcnQgKi8KKwlTQ0NQX1NTTl9NQVAJCQkgICAgPSA1LCAvKiBtb2JpbGUgYXBwbGljYXRpb24gcGFydCAqLworCVNDQ1BfU1NOX0hMUgkJCSAgICA9IDYsCisJU0NDUF9TU05fVkxSCQkJICAgID0gNywKKwlTQ0NQX1NTTl9NU0MJCQkgICAgPSA4LAorCVNDQ1BfU1NOX0VJQwkJCSAgICA9IDksIC8qIGVxdWlwZW50IGlkZW50aWZpZXIgY2VudHJlICovCisJU0NDUF9TU05fQVVDCQkJICAgID0gMTAsIC8qIGF1dGhlbnRpY2F0aW9uIGNlbnRyZSAqLworCVNDQ1BfU1NOX0lTRE5fU1VQUExfU0VSVklDRVMJICAgID0gMTEsCisJU0NDUF9TU05fUkVTRVJWRURfSU5UTAkJICAgID0gMTIsCisJU0NDUF9TU05fSVNETl9FREdFX1RPX0VER0UJICAgID0gMTMsCisJU0NDUF9TU05fVENfVEVTVF9SRVNQT05ERVIJICAgID0gMTQsCisKKwkvKiBGcm9tIEdTTSAwMy4wMyA4LjIgKi8KKwlTQ0NQX1NTTl9CU1NBUAkJCSAgICA9IDI1NCwKKwlTQ0NQX1NTTl9CU1NPTQkJCSAgICA9IDI1MywKK307CisKKy8qIFEuNzEzLCAzLjQuMi4zICovCitlbnVtIHsKKwlTQ0NQX05BSV9VTktOT1dOCQkgICAgPSAwLAorCVNDQ1BfTkFJX1NVQlNDUklCRVJfTlVNQkVSCSAgICA9IDEsCisJU0NDUF9OQUlfUkVTRVJWRURfTkFUSU9OQUwJICAgID0gMiwKKwlTQ0NQX05BSV9OQVRJT05BTF9TSUdOSUZJQ0FOVAkgICAgPSAzLAorCVNDQ1BfTkFJX0lOVEVSTkFUSU9OQUwJCSAgICA9IDQsCit9OworCitzdHJ1Y3Qgc2NjcF9nbG9iYWxfdGl0bGUgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1X2ludDhfdAluYXR1cmVfb2ZfYWRkcl9pbmQgOiA3LAorCQkJb2RkX2V2ZW4gOiAxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90CW9kZF9ldmVuIDogMSwKKwkJCW5hdHVyZV9vZl9hZGRyX2luZCA6IDc7CisjZW5kaWYKKwl1X2ludDhfdAlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogUS43MTMsIDMuMyAqLworc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSB7CisJdV9pbnQ4X3QgICAgb2N0ZXQxOworCXVfaW50OF90ICAgIG9jdGV0MjsKKwl1X2ludDhfdCAgICBvY3RldDM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBRLjcxNCwgMy42ICovCitlbnVtIHNjY3BfcHJvdG9jb2xfY2xhc3MgeworCVNDQ1BfUFJPVE9DT0xfQ0xBU1NfMAkJICAgID0gMCwKKwlTQ0NQX1BST1RPQ09MX0NMQVNTXzEJCSAgICA9IDEsCisJU0NDUF9QUk9UT0NPTF9DTEFTU18yCQkgICAgPSAyLAorCVNDQ1BfUFJPVE9DT0xfQ0xBU1NfMwkJICAgID0gMywKK307CisKKy8qIGJpdHMgNS04IHdoZW4gY2xhc3MwLCBjbGFzczEgaXMgdXNlZCAqLworZW51bSBzY2NwX3Byb3RvY29sX29wdGlvbnMgeworCVNDQ1BfUFJPVE9DT0xfTk9fU1BFQ0lBTAkgICAgPSAwLAorCVNDQ1BfUFJPVE9DT0xfUkVUVVJOX01FU1NBR0UJICAgID0gOCwKK307CisKK2VudW0gc2NjcF9yZWxlYXNlX2NhdXNlIHsKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfRU5EX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAwLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9FTkRfVVNFUl9DT05HRVNUSU9OCSAgICA9IDEsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VORF9VU0VSX0ZBSUxVUkUJICAgID0gMiwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU0NDUF9VU0VSX09SSUdJTkFURUQJICAgID0gMywKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfUkVNT1RFX1BST0NFRFVSRV9FUlJPUiAgID0gNCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfSU5DT05TSVNURU5UX0NPTk5fREFUQSAgID0gNSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfQUNDRVNTX0ZBSUxVUkUJICAgID0gNiwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfQUNDRVNTX0NPTkdFU1RJT04JICAgID0gNywKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU1VCU1lTVEVNX0ZBSUxVUkUJICAgID0gOCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU1VCU1lTVEVNX0NPTkdFU1RJT04JICAgID0gOSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfTVRQX0ZBSUxVUkUJCSAgICA9IDEwLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9ORVRXT1JLX0NPTkdFU1RJT04JICAgID0gMTEsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VYUElSQVRJT05fUkVTRVQJICAgID0gMTIsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VYUElSQVRJT05fSU5BQ1RJVkUJICAgID0gMTMsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1JFU0VSVkVECQkgICAgPSAxNCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfVU5RVUFMSUZJRUQJCSAgICA9IDE1LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9TQ0NQX0ZBSUxVUkUJCSAgICA9IDE2LAorfTsKKworZW51bSBzY2NwX3JldHVybl9jYXVzZSB7CisJU0NDUF9SRVRVUk5fQ0FVU0VfTk9fVFJBTlNMQVRJT05fTkFUVVJFCSAgICA9IDAsCisJU0NDUF9SRVRVUk5fQ0FVU0VfTk9fVFJBTlNMQVRJT04JICAgID0gMSwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9TVUJTWVNURU1fQ09OR0VTVElPTgkgICAgPSAyLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NVQlNZU1RFTV9GQUlMVVJFCSAgICA9IDMsCisJU0NDUF9SRVRVUk5fQ0FVU0VfVU5FUVVJUFBFRF9VU0VSCSAgICA9IDQsCisJU0NDUF9SRVRVUk5fQ0FVU0VfTVRQX0ZBSUxVUkUJCSAgICA9IDUsCisJU0NDUF9SRVRVUk5fQ0FVU0VfTkVUV09SS19DT05HRVNUSU9OCSAgICA9IDYsCisJU0NDUF9SRVRVUk5fQ0FVU0VfVU5RVUFMSUZJRUQJCSAgICA9IDcsCisJU0NDUF9SRVRVUk5fQ0FVU0VfRVJST1JfSU5fTVNHX1RSQU5TUE9SVCAgICA9IDgsCisJU0NDUF9SRVRVUk5fQ0FVU0VfRVJST1JfSU5fTE9DQUxfUFJPQ0VTU0lORyA9IDksCisJU0NDUF9SRVRVUk5fQ0FVU0VfREVTVF9DQU5OT1RfUEVSRk9STV9SRUFTU0VNQkxZID0gMTAsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU0NDUF9GQUlMVVJFCQkgICAgPSAxMSwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9IT1BfQ09VTlRFUl9WSU9MQVRJT04JICAgID0gMTIsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU0VHTUVOVEFUSU9OX05PVF9TVVBQT1JURUQ9IDEzLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NFR01FTlRBVElPTl9GQU9MVVJFCSAgICA9IDE0Cit9OworCitlbnVtIHNjY3BfcmVzZXRfY2F1c2UgeworCVNDQ1BfUkVTRVRfQ0FVU0VfRU5EX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAwLAorCVNDQ1BfUkVTRVRfQ0FVU0VfU0NDUF9VU0VSX09SSUdJTkFURUQJICAgID0gMSwKKwlTQ0NQX1JFU0VUX0NBVVNFX01TR19PVVRfT0ZfT1JERVJfUFMJICAgID0gMiwKKwlTQ0NQX1JFU0VUX0NBVVNFX01TR19PVVRfT0ZfT1JERVJfUFIJICAgID0gMywKKwlTQ0NQX1JFU0VUX0NBVVNFX1JQQ19PVVRfT0ZfV0lORE9XCSAgICA9IDQsCisJU0NDUF9SRVNFVF9DQVVTRV9SUENfSU5DT1JSRUNUX1BTCSAgICA9IDUsCisJU0NDUF9SRVNFVF9DQVVTRV9SUENfR0VORVJBTAkJICAgID0gNiwKKwlTQ0NQX1JFU0VUX0NBVVNFX1JFTU9URV9FTkRfVVNFUl9PUEVSQVRJT05BTD0gNywKKwlTQ0NQX1JFU0VUX0NBVVNFX05FVFdPUktfT1BFUkFUSU9OQUwJICAgID0gOCwKKwlTQ0NQX1JFU0VUX0NBVVNFX0FDQ0VTU19PUEVSQVRJT05BTAkgICAgPSA5LAorCVNDQ1BfUkVTRVRfQ0FVU0VfTkVUV09SS19DT05HRVNUSU9OCSAgICA9IDEwLAorCVNDQ1BfUkVTRVRfQ0FVU0VfUkVTRVJWRUQJCSAgICA9IDExLAorfTsKKworZW51bSBzY2NwX2Vycm9yX2NhdXNlIHsKKwlTQ0NQX0VSUk9SX0xSTl9NSVNNQVRDSF9VTkFTU0lHTkVECSAgICA9IDAsIC8qIGxvY2FsIHJlZmVyZW5jZSBudW1iZXIgKi8KKwlTQ0NQX0VSUk9SX0xSTl9NSVNNQVRDSF9JTkNPTlNJU1RFTlQJICAgID0gMSwKKwlTQ0NQX0VSUk9SX1BPSU5UX0NPREVfTUlTTUFUQ0gJCSAgICA9IDIsCisJU0NDUF9FUlJPUl9TRVJWSUNFX0NMQVNTX01JU01BVENICSAgICA9IDMsCisJU0NDUF9FUlJPUl9VTlFVQUxJRklFRAkJCSAgICA9IDQsCit9OworCitlbnVtIHNjY3BfcmVmdXNhbF9jYXVzZSB7CisJU0NDUF9SRUZVU0FMX0VORF9VU0VSX09SSUdJTkFURUQJICAgID0gMCwKKwlTQ0NQX1JFRlVTQUxfRU5EX1VTRVJfQ09OR0VTVElPTgkgICAgPSAxLAorCVNDQ1BfUkVGVVNBTF9FTkRfVVNFUl9GQUlMVVJFCQkgICAgPSAyLAorCVNDQ1BfUkVGVVNBTF9TQ0NQX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAzLAorCVNDQ1BfUkVGVVNBTF9ERVNUSU5BVElPTl9BRERSRVNTX1VLTk9XTgkgICAgPSA0LAorCVNDQ1BfUkVGVVNBTF9ERVNUSU5BVElPTl9JTkFDQ0VTU0lCTEUJICAgID0gNSwKKwlTQ0NQX1JFRlVTQUxfTkVUX1FPU19OT05fVFJBTlNJRU5UCSAgICA9IDYsCisJU0NDUF9SRUZVU0FMX05FVF9RT1NfVFJBTlNJRU5UCQkgICAgPSA3LAorCVNDQ1BfUkVGVVNBTF9BQ0NFU1NfRkFJTFVSRQkJICAgID0gOCwKKwlTQ0NQX1JFRlVTQUxfQUNDRVNTX0NPTkdFU1RJT04JCSAgICA9IDksCisJU0NDUF9SRUZVU0FMX1NVQlNZU1RFTV9GQUlMVVJFCQkgICAgPSAxMCwKKwlTQ0NQX1JFRlVTQUxfU1VCU1lURU1fQ09OR0VTVElPTgkgICAgPSAxMSwKKwlTQ0NQX1JFRlVTQUxfRVhQSVJBVElPTgkJCSAgICA9IDEyLAorCVNDQ1BfUkVGVVNBTF9JTkNPTVBBVElCTEVfVVNFUl9EQVRBCSAgICA9IDEzLAorCVNDQ1BfUkVGVVNBTF9SRVNFUlZFRAkJCSAgICA9IDE0LAorCVNDQ1BfUkVGVVNBTF9VTlFVQUxJRklFRAkJICAgID0gMTUsCisJU0NDUF9SRUZVU0FMX0hPUF9DT1VOVEVSX1ZJT0xBVElPTgkgICAgPSAxNiwKKwlTQ0NQX1JFRlVTQUxfU0NDUF9GQUlMVVJFCQkgICAgPSAxNywKKwlTQ0NQX1JFRlVTQUxfVU5FUVVJUFBFRF9VU0VSCQkgICAgPSAxOCwKK307CisKKy8qCisgKiBtZXNzYWdlcy4uLiBhcyBvZiBRLjcxMyBDaGFwdGVyIDQKKyAqLworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0IHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXByb3RvX2NsYXNzOworCisKKwkvKiB2YXJpYWJsZSAqLworCXVfaW50OF90CQkJdmFyaWFibGVfY2FsbGVkOworI2lmIFZBUklBQkxFCisJY2FsbGVkX3BhcnR5X2FkZHJlc3MKKyNlbmRpZgorCisJLyogb3B0aW9uYWwgKi8KKwl1X2ludDhfdAkJCW9wdGlvbmFsX3N0YXJ0OworCisjaWYgT1BUSU9OQUwKKwljcmVkaXQgMworCWNhbGxpbmdwYXJ0eSB2YXIgNC1uCisJZGF0YSAgICAgICAgICAgIDMtMTMwCisJaG9wX2NvdW50ZXIgICAgIDMKKwlpbXBvcnRhbmNlICAgICAgMworCWVuZF9vZl9vcHRpb25hbCAxCisjZW5kaWYKKworCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlwcm90b19jbGFzczsKKworCS8qIG9wdGlvbmFsICovCisJdV9pbnQ4X3QJCQlvcHRpb25hbF9zdGFydDsKKworCS8qIG9wdGlvbmFsICovCisjaWYgT1BUSU9OQUwKKwljcmVkaXQgMworCWNhbGxlZCBwYXJ0eSA0CisJZGF0YSAgICAgICAgICAgIDMtMTMwCisJaW1wb3J0YW5jZSAgICAgIDMKKwllbmRfb2Zfb3B0aW9uYWwgMQorI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQljYXVzZTsKKworCS8qIG9wdGlvbmFsICovCisJdV9pbnQ4X3QJCQlvcHRpb25hbF9zdGFydDsKKworCS8qIG9wdGlvbmFsICovCisjaWYgT1BUSU9OQUwKKwljYWxsZWQgcGFydHkgNAorCWRhdGEgICAgICAgICAgICAzLTEzMAorCWltcG9ydGFuY2UgICAgICAzCisJZW5kX29mX29wdGlvbmFsIDEKKyNlbmRpZgorCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlyZWxlYXNlX2NhdXNlOworCisKKwkvKiBvcHRpb25hbCAqLworCXVfaW50OF90CQkJb3B0aW9uYWxfc3RhcnQ7CisKKyNpZiBPUFRJT05BTAorCWRhdGEgICAgICAgICAgICAzLTEzMAorCWltcG9ydGFuY2UgICAgICAzCisJZW5kX29mX29wdGlvbmFsIDEKKyNlbmRpZgorCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSB7CisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2RhdGFfZm9ybTEgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlzZWdtZW50aW5nOworCisJLyogdmFyaWFibGUgKi8KKwl1X2ludDhfdAkJCXZhcmlhYmxlX3N0YXJ0OworCisjaWYgVkFSSUFCTEUKKwlkYXRhIDItMjU2OworI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK3N0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJdV9pbnQ4X3QJCQlwcm90b19jbGFzczsKKworCisJLyogdmFyaWFibGUgKi8KKwl1X2ludDhfdAkJCXZhcmlhYmxlX2NhbGxlZDsKKwl1X2ludDhfdAkJCXZhcmlhYmxlX2NhbGxpbmc7CisJdV9pbnQ4X3QJCQl2YXJpYWJsZV9kYXRhOworCisjaWYgVkFSSUFCTEUKKwljYWxsZWQgcGFydHkgYWRkcmVzcworCWNhbGxpbmcgcGFydHkgYWRkcmVzcworI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9kYXRhX2l0IHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXByb3RvX2NsYXNzOworCisJdV9pbnQ4X3QJCQlzZXF1ZW5jaW5nWzJdOworCXVfaW50OF90CQkJY3JlZGl0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfcHJvdG9fZXJyIHsKKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQllcnJvcl9jYXVzZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9NYWtlZmlsZS5hbSBiL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3NDc2NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSBAQAorbm9pbnN0X0hFQURFUlMgPSBidWZmZXIuaCBjb21tYW5kLmggIHZlY3Rvci5oIHZ0eS5oCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L2J1ZmZlci5oIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQ2N2E5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIEJ1ZmZlcmluZyB0byBvdXRwdXQgYW5kIGlucHV0LgorICogQ29weXJpZ2h0IChDKSAxOTk4IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfWkVCUkFfQlVGRkVSX0gKKyNkZWZpbmUgX1pFQlJBX0JVRkZFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogQ3JlYXRlIGEgbmV3IGJ1ZmZlci4gIE1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZCBpbiBjaHVua3Mgb2YgdGhlIGdpdmVuCisgICBzaXplLiAgSWYgdGhlIGFyZ3VtZW50IGlzIDAsIHRoZSBsaWJyYXJ5IHdpbGwgc3VwcGx5IGEgcmVhc29uYWJsZQorICAgZGVmYXVsdCBzaXplIHN1aXRhYmxlIGZvciBidWZmZXJpbmcgc29ja2V0IEkvTy4gKi8KK3N0cnVjdCBidWZmZXIgKmJ1ZmZlcl9uZXcodm9pZCAqY3R4LCBzaXplX3QpOworCisvKiBGcmVlIGFsbCBkYXRhIGluIHRoZSBidWZmZXIuICovCit2b2lkIGJ1ZmZlcl9yZXNldChzdHJ1Y3QgYnVmZmVyICopOworCisvKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNhbGxzIGJ1ZmZlcl9yZXNldCB0byByZWxlYXNlIGFsbCBidWZmZXJlZCBkYXRhLgorICAgVGhlbiBpdCBmcmVlcyB0aGUgc3RydWN0IGJ1ZmZlciBpdHNlbGYuICovCit2b2lkIGJ1ZmZlcl9mcmVlKHN0cnVjdCBidWZmZXIgKik7CisKKy8qIEFkZCB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCitleHRlcm4gdm9pZCBidWZmZXJfcHV0KHN0cnVjdCBidWZmZXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworLyogQWRkIGEgc2luZ2xlIGNoYXJhY3RlciB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCitleHRlcm4gdm9pZCBidWZmZXJfcHV0YyhzdHJ1Y3QgYnVmZmVyICosIHVfY2hhcik7CisvKiBBZGQgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLworZXh0ZXJuIHZvaWQgYnVmZmVyX3B1dHN0cihzdHJ1Y3QgYnVmZmVyICosIGNvbnN0IGNoYXIgKik7CisKKy8qIENvbWJpbmUgYWxsIGFjY3VtdWxhdGVkIChhbmQgdW5mbHVzaGVkKSBkYXRhIGluc2lkZSB0aGUgYnVmZmVyIGludG8gYQorICAgc2luZ2xlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBhbGxvY2F0ZWQgdXNpbmcgWE1BTExPQyhNVFlQRV9UTVApLiAgTm90ZQorICAgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsdGVyIHRoZSBzdGF0ZSBvZiB0aGUgYnVmZmVyLCBzbyB0aGUgZGF0YQorICAgaXMgc3RpbGwgaW5zaWRlIHdhaXRpbmcgdG8gYmUgZmx1c2hlZC4gKi8KK2NoYXIgKmJ1ZmZlcl9nZXRzdHIoc3RydWN0IGJ1ZmZlciAqKTsKKworLyogUmV0dXJucyAxIGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcgZGF0YSBpbiB0aGUgYnVmZmVyLiAgT3RoZXJ3aXNlIHJldHVybnMgMC4gKi8KK2ludCBidWZmZXJfZW1wdHkoc3RydWN0IGJ1ZmZlciAqKTsKKwordHlwZWRlZiBlbnVtIHsKKwkvKiBBbiBJL08gZXJyb3Igb2NjdXJyZWQuICBUaGUgYnVmZmVyIHNob3VsZCBiZSBkZXN0cm95ZWQgYW5kIHRoZQorCSAgIGZpbGUgZGVzY3JpcHRvciBzaG91bGQgYmUgY2xvc2VkLiAqLworCUJVRkZFUl9FUlJPUiA9IC0xLAorCisJLyogVGhlIGRhdGEgd2FzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LCBhbmQgdGhlIGJ1ZmZlciBpcyBub3cgZW1wdHkKKwkgICAodGhlcmUgaXMgbm8gcGVuZGluZyBkYXRhIHdhaXRpbmcgdG8gYmUgZmx1c2hlZCkuICovCisJQlVGRkVSX0VNUFRZID0gMCwKKworCS8qIFRoZXJlIGlzIHBlbmRpbmcgZGF0YSBpbiB0aGUgYnVmZmVyIHdhaXRpbmcgdG8gYmUgZmx1c2hlZC4gIFBsZWFzZQorCSAgIHRyeSBmbHVzaGluZyB0aGUgYnVmZmVyIHdoZW4gc2VsZWN0IGluZGljYXRlcyB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IKKwkgICBpcyB3cml0ZWFibGUuICovCisJQlVGRkVSX1BFTkRJTkcgPSAxCit9IGJ1ZmZlcl9zdGF0dXNfdDsKKworLyogVHJ5IHRvIHdyaXRlIHRoaXMgZGF0YSB0byB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgQW55IGRhdGEgdGhhdCBjYW5ub3QKKyAgIGJlIHdyaXR0ZW4gaW1tZWRpYXRlbHkgaXMgYWRkZWQgdG8gdGhlIGJ1ZmZlciBxdWV1ZS4gKi8KK2V4dGVybiBidWZmZXJfc3RhdHVzX3QgYnVmZmVyX3dyaXRlKHN0cnVjdCBidWZmZXIgKiwgaW50IGZkLAorCQkJCSAgICBjb25zdCB2b2lkICosIHNpemVfdCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gZmx1c2ggc29tZSAoYnV0IHBlcmhhcHMgbm90IGFsbCkgb2YKKyAgIHRoZSBxdWV1ZWQgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiAqLworZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfYXZhaWxhYmxlKHN0cnVjdCBidWZmZXIgKiwgaW50IGZkKTsKKworLyogVGhlIGZvbGxvd2luZyAyIGZ1bmN0aW9ucyAoYnVmZmVyX2ZsdXNoX2FsbCBhbmQgYnVmZmVyX2ZsdXNoX3dpbmRvdykKKyAgIGFyZSBmb3IgdXNlIGluIGxpYi92dHkuYyBvbmx5LiAgVGhleSBzaG91bGQgbm90IGJlIHVzZWQgZWxzZXdoZXJlLiAqLworCisvKiBDYWxsIGJ1ZmZlcl9mbHVzaF9hdmFpbGFibGUgcmVwZWF0ZWRseSB1bnRpbCBlaXRoZXIgYWxsIGRhdGEgaGFzIGJlZW4KKyAgIGZsdXNoZWQsIG9yIGFuIEkvTyBlcnJvciBoYXMgYmVlbiBlbmNvdW50ZXJlZCwgb3IgdGhlIG9wZXJhdGlvbiB3b3VsZAorICAgYmxvY2suICovCitleHRlcm4gYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl9mbHVzaF9hbGwoc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQpOworCisvKiBBdHRlbXB0IHRvIHdyaXRlIGVub3VnaCBkYXRhIHRvIHRoZSBnaXZlbiBmZCB0byBmaWxsIGEgd2luZG93IG9mIHRoZQorICAgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodCAoYW5kIHJlbW92ZSB0aGUgZGF0YSB3cml0dGVuIGZyb20gdGhlIGJ1ZmZlcikuCisKKyAgIElmICFub19tb3JlLCB0aGVuIGEgbWVzc2FnZSBzYXlpbmcgIiAtLU1vcmUtLSAiIGlzIGFwcGVuZGVkLgorICAgSWYgZXJhc2UgaXMgdHJ1ZSwgdGhlbiBmaXJzdCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzICIgLS1Nb3JlLS0gIiBtZXNzYWdlCisgICB3aXRoIHNwYWNlcy4KKworICAgQW55IHdyaXRlIGVycm9yIChpbmNsdWRpbmcgRUFHQUlOIG9yIEVJTlRSKSB3aWxsIGNhdXNlIHRoaXMgZnVuY3Rpb24KKyAgIHRvIHJldHVybiAtMSAoYmVjYXVzZSB0aGUgbG9naWMgZm9yIGhhbmRsaW5nIHRoZSBlcmFzZSBhbmQgbW9yZSBmZWF0dXJlcworICAgaXMgdG9vIGNvbXBsaWNhdGVkIHRvIHJldHJ5IHRoZSB3cml0ZSBsYXRlcikuCisqLworZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfd2luZG93KHN0cnVjdCBidWZmZXIgKiwgaW50IGZkLCBpbnQgd2lkdGgsCisJCQkJCSAgIGludCBoZWlnaHQsIGludCBlcmFzZSwgaW50IG5vX21vcmUpOworCisjZW5kaWYJCQkJLyogX1pFQlJBX0JVRkZFUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L2NvbW1hbmQuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvY29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOGNjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvdnR5L2NvbW1hbmQuaApAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIFplYnJhIGNvbmZpZ3VyYXRpb24gY29tbWFuZCBpbnRlcmZhY2Ugcm91dGluZQorICogQ29weXJpZ2h0IChDKSAxOTk3LCA5OCBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX1pFQlJBX0NPTU1BTkRfSAorI2RlZmluZSBfWkVCUkFfQ09NTUFORF9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgInZlY3Rvci5oIgorI2luY2x1ZGUgInZ0eS5oIgorCisvKiBIb3N0IGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgKi8KK3N0cnVjdCBob3N0IHsKKwkvKiBIb3N0IG5hbWUgb2YgdGhpcyByb3V0ZXIuICovCisJY2hhciAqbmFtZTsKKworCS8qIFBhc3N3b3JkIGZvciB2dHkgaW50ZXJmYWNlLiAqLworCWNoYXIgKnBhc3N3b3JkOworCWNoYXIgKnBhc3N3b3JkX2VuY3J5cHQ7CisKKwkvKiBFbmFibGUgcGFzc3dvcmQgKi8KKwljaGFyICplbmFibGU7CisJY2hhciAqZW5hYmxlX2VuY3J5cHQ7CisKKwkvKiBTeXN0ZW0gd2lkZSB0ZXJtaW5hbCBsaW5lcy4gKi8KKwlpbnQgbGluZXM7CisKKwkvKiBMb2cgZmlsZW5hbWUuICovCisJY2hhciAqbG9nZmlsZTsKKworCS8qIGNvbmZpZyBmaWxlIG5hbWUgb2YgdGhpcyBob3N0ICovCisJY2hhciAqY29uZmlnOworCisJLyogRmxhZ3MgZm9yIHNlcnZpY2VzICovCisJaW50IGFkdmFuY2VkOworCWludCBlbmNyeXB0OworCisJLyogQmFubmVyIGNvbmZpZ3VyYXRpb24uICovCisJY29uc3QgY2hhciAqbW90ZDsKKwljaGFyICptb3RkZmlsZTsKK307CisKKy8qIFRoZXJlIGFyZSBzb21lIGNvbW1hbmQgbGV2ZWxzIHdoaWNoIGNhbGxlZCBmcm9tIGNvbW1hbmQgbm9kZS4gKi8KK2VudW0gbm9kZV90eXBlIHsKKwlBVVRIX05PREUsCQkvKiBBdXRoZW50aWNhdGlvbiBtb2RlIG9mIHZ0eSBpbnRlcmZhY2UuICovCisJVklFV19OT0RFLAkJLyogVmlldyBub2RlLiBEZWZhdWx0IG1vZGUgb2YgdnR5IGludGVyZmFjZS4gKi8KKwlBVVRIX0VOQUJMRV9OT0RFLAkvKiBBdXRoZW50aWNhdGlvbiBtb2RlIGZvciBjaGFuZ2UgZW5hYmxlLiAqLworCUVOQUJMRV9OT0RFLAkJLyogRW5hYmxlIG5vZGUuICovCisJQ09ORklHX05PREUsCQkvKiBDb25maWcgbm9kZS4gRGVmYXVsdCBtb2RlIG9mIGNvbmZpZyBmaWxlLiAqLworCVNFUlZJQ0VfTk9ERSwJCS8qIFNlcnZpY2Ugbm9kZS4gKi8KKwlERUJVR19OT0RFLAkJLyogRGVidWcgbm9kZS4gKi8KKyNpZiAwCisJQUFBX05PREUsCQkvKiBBQUEgbm9kZS4gKi8KKwlLRVlDSEFJTl9OT0RFLAkJLyogS2V5LWNoYWluIG5vZGUuICovCisJS0VZQ0hBSU5fS0VZX05PREUsCS8qIEtleS1jaGFpbiBrZXkgbm9kZS4gKi8KKwlJTlRFUkZBQ0VfTk9ERSwJCS8qIEludGVyZmFjZSBtb2RlIG5vZGUuICovCisJWkVCUkFfTk9ERSwJCS8qIHplYnJhIGNvbm5lY3Rpb24gbm9kZS4gKi8KKwlUQUJMRV9OT0RFLAkJLyogcnRtX3RhYmxlIHNlbGVjdGlvbiBub2RlLiAqLworCVJJUF9OT0RFLAkJLyogUklQIHByb3RvY29sIG1vZGUgbm9kZS4gKi8KKwlSSVBOR19OT0RFLAkJLyogUklQbmcgcHJvdG9jb2wgbW9kZSBub2RlLiAqLworCUJHUF9OT0RFLAkJLyogQkdQIHByb3RvY29sIG1vZGUgd2hpY2ggaW5jbHVkZXMgQkdQNCsgKi8KKwlCR1BfVlBOVjRfTk9ERSwJCS8qIEJHUCBNUExTLVZQTiBQRSBleGNoYW5nZS4gKi8KKwlCR1BfSVBWNF9OT0RFLAkJLyogQkdQIElQdjQgdW5pY2FzdCBhZGRyZXNzIGZhbWlseS4gICovCisJQkdQX0lQVjRNX05PREUsCQkvKiBCR1AgSVB2NCBtdWx0aWNhc3QgYWRkcmVzcyBmYW1pbHkuICAqLworCUJHUF9JUFY2X05PREUsCQkvKiBCR1AgSVB2NiBhZGRyZXNzIGZhbWlseSAqLworCU9TUEZfTk9ERSwJCS8qIE9TUEYgcHJvdG9jb2wgbW9kZSAqLworCU9TUEY2X05PREUsCQkvKiBPU1BGIHByb3RvY29sIGZvciBJUHY2IG1vZGUgKi8KKwlJU0lTX05PREUsCQkvKiBJU0lTIHByb3RvY29sIG1vZGUgKi8KKwlNQVNDX05PREUsCQkvKiBNQVNDIGZvciBtdWx0aWNhc3QuICAqLworCUlSRFBfTk9ERSwJCS8qIElDTVAgUm91dGVyIERpc2NvdmVyeSBQcm90b2NvbCBtb2RlLiAqLworCUlQX05PREUsCQkvKiBTdGF0aWMgaXAgcm91dGUgbm9kZS4gKi8KKwlBQ0NFU1NfTk9ERSwJCS8qIEFjY2VzcyBsaXN0IG5vZGUuICovCisJUFJFRklYX05PREUsCQkvKiBQcmVmaXggbGlzdCBub2RlLiAqLworCUFDQ0VTU19JUFY2X05PREUsCS8qIEFjY2VzcyBsaXN0IG5vZGUuICovCisJUFJFRklYX0lQVjZfTk9ERSwJLyogUHJlZml4IGxpc3Qgbm9kZS4gKi8KKwlBU19MSVNUX05PREUsCQkvKiBBUyBsaXN0IG5vZGUuICovCisJQ09NTVVOSVRZX0xJU1RfTk9ERSwJLyogQ29tbXVuaXR5IGxpc3Qgbm9kZS4gKi8KKwlSTUFQX05PREUsCQkvKiBSb3V0ZSBtYXAgbm9kZS4gKi8KKwlTTVVYX05PREUsCQkvKiBTTk1QIGNvbmZpZ3VyYXRpb24gbm9kZS4gKi8KKwlEVU1QX05PREUsCQkvKiBQYWNrZXQgZHVtcCBub2RlLiAqLworCUZPUldBUkRJTkdfTk9ERSwJLyogSVAgZm9yd2FyZGluZyBub2RlLiAqLworI2VuZGlmCisJVlRZX05PREUsCQkvKiBWdHkgbm9kZS4gKi8KKworCUdTTU5FVF9OT0RFLAorCUJUU19OT0RFLAorCVRSWF9OT0RFLAorCVRTX05PREUsCisJU1VCU0NSX05PREUsCisJTUdDUF9OT0RFLAorfTsKKworLyogTm9kZSB3aGljaCBoYXMgc29tZSBjb21tYW5kcyBhbmQgcHJvbXB0IHN0cmluZyBhbmQgY29uZmlndXJhdGlvbgorICAgZnVuY3Rpb24gcG9pbnRlciAuICovCitzdHJ1Y3QgY21kX25vZGUgeworCS8qIE5vZGUgaW5kZXguICovCisJZW51bSBub2RlX3R5cGUgbm9kZTsKKworCS8qIFByb21wdCBjaGFyYWN0ZXIgYXQgdnR5IGludGVyZmFjZS4gKi8KKwljb25zdCBjaGFyICpwcm9tcHQ7CisKKwkvKiBJcyB0aGlzIG5vZGUncyBjb25maWd1cmF0aW9uIGdvZXMgdG8gdnR5c2ggPyAqLworCWludCB2dHlzaDsKKworCS8qIE5vZGUncyBjb25maWd1cmF0aW9uIHdyaXRlIGZ1bmN0aW9uICovCisJaW50ICgqZnVuYykgKHN0cnVjdCB2dHkgKik7CisKKwkvKiBWZWN0b3Igb2YgdGhpcyBub2RlJ3MgY29tbWFuZCBsaXN0LiAqLworCXZlY3RvciBjbWRfdmVjdG9yOworfTsKKworZW51bSB7CisJQ01EX0FUVFJfREVQUkVDQVRFRCA9IDEsCisJQ01EX0FUVFJfSElEREVOLAorfTsKKworLyogU3RydWN0dXJlIG9mIGNvbW1hbmQgZWxlbWVudC4gKi8KK3N0cnVjdCBjbWRfZWxlbWVudCB7CisJY29uc3QgY2hhciAqc3RyaW5nOwkvKiBDb21tYW5kIHNwZWNpZmljYXRpb24gYnkgc3RyaW5nLiAqLworCWludCAoKmZ1bmMpIChzdHJ1Y3QgY21kX2VsZW1lbnQgKiwgc3RydWN0IHZ0eSAqLCBpbnQsIGNvbnN0IGNoYXIgKltdKTsKKwljb25zdCBjaGFyICpkb2M7CS8qIERvY3VtZW50YXRpb24gb2YgdGhpcyBjb21tYW5kLiAqLworCWludCBkYWVtb247CQkvKiBEYWVtb24gdG8gd2hpY2ggdGhpcyBjb21tYW5kIGJlbG9uZy4gKi8KKwl2ZWN0b3Igc3RydmVjOwkJLyogUG9pbnRpbmcgb3V0IGVhY2ggZGVzY3JpcHRpb24gdmVjdG9yLiAqLworCXVuc2lnbmVkIGludCBjbWRzaXplOwkvKiBDb21tYW5kIGluZGV4IGNvdW50LiAqLworCWNoYXIgKmNvbmZpZzsJCS8qIENvbmZpZ3VyYXRpb24gc3RyaW5nICovCisJdmVjdG9yIHN1YmNvbmZpZzsJLyogU3ViIGNvbmZpZ3VyYXRpb24gc3RyaW5nICovCisJdV9jaGFyIGF0dHI7CQkvKiBDb21tYW5kIGF0dHJpYnV0ZXMgKi8KK307CisKKy8qIENvbW1hbmQgZGVzY3JpcHRpb24gc3RydWN0dXJlLiAqLworc3RydWN0IGRlc2MgeworCWNvbnN0IGNoYXIgKmNtZDsJLyogQ29tbWFuZCBzdHJpbmcuICovCisJY29uc3QgY2hhciAqc3RyOwkvKiBDb21tYW5kJ3MgZGVzY3JpcHRpb24uICovCit9OworCisvKiBSZXR1cm4gdmFsdWUgb2YgdGhlIGNvbW1hbmRzLiAqLworI2RlZmluZSBDTURfU1VDQ0VTUyAgICAgICAgICAgICAgMAorI2RlZmluZSBDTURfV0FSTklORyAgICAgICAgICAgICAgMQorI2RlZmluZSBDTURfRVJSX05PX01BVENIICAgICAgICAgMgorI2RlZmluZSBDTURfRVJSX0FNQklHVU9VUyAgICAgICAgMworI2RlZmluZSBDTURfRVJSX0lOQ09NUExFVEUgICAgICAgNAorI2RlZmluZSBDTURfRVJSX0VYRUVEX0FSR0NfTUFYICAgNQorI2RlZmluZSBDTURfRVJSX05PVEhJTkdfVE9ETyAgICAgNgorI2RlZmluZSBDTURfQ09NUExFVEVfRlVMTF9NQVRDSCAgNworI2RlZmluZSBDTURfQ09NUExFVEVfTUFUQ0ggICAgICAgOAorI2RlZmluZSBDTURfQ09NUExFVEVfTElTVF9NQVRDSCAgOQorI2RlZmluZSBDTURfU1VDQ0VTU19EQUVNT04gICAgICAxMAorCisvKiBBcmdjIG1heCBjb3VudHMuICovCisjZGVmaW5lIENNRF9BUkdDX01BWCAgIDI1CisKKy8qIFR1cm4gb2ZmIHRoZXNlIG1hY3JvcyB3aGVuIHVpc25nIGNwcCB3aXRoIGV4dHJhY3QucGwgKi8KKyNpZm5kZWYgVlRZU0hfRVhUUkFDVF9QTAorCisvKiBoZWxwZXIgZGVmaW5lcyBmb3IgZW5kLXVzZXIgREVGVU4qIG1hY3JvcyAqLworI2RlZmluZSBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRycywgZG51bSkgXAorICBzdGF0aWMgc3RydWN0IGNtZF9lbGVtZW50IGNtZG5hbWUgPSBcCisgIHsgXAorICAgIC5zdHJpbmcgPSBjbWRzdHIsIFwKKyAgICAuZnVuYyA9IGZ1bmNuYW1lLCBcCisgICAgLmRvYyA9IGhlbHBzdHIsIFwKKyAgICAuYXR0ciA9IGF0dHJzLCBcCisgICAgLmRhZW1vbiA9IGRudW0sIFwKKyAgfTsKKworLyogZ2xvYmFsIChub24gc3RhdGljKSBjbWRfZWxlbWVudCAqLworI2RlZmluZSBnREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cnMsIGRudW0pIFwKKyAgc3RydWN0IGNtZF9lbGVtZW50IGNtZG5hbWUgPSBcCisgIHsgXAorICAgIC5zdHJpbmcgPSBjbWRzdHIsIFwKKyAgICAuZnVuYyA9IGZ1bmNuYW1lLCBcCisgICAgLmRvYyA9IGhlbHBzdHIsIFwKKyAgICAuYXR0ciA9IGF0dHJzLCBcCisgICAgLmRhZW1vbiA9IGRudW0sIFwKKyAgfTsKKworI2RlZmluZSBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIHN0YXRpYyBpbnQgZnVuY25hbWUgKHN0cnVjdCBjbWRfZWxlbWVudCAqLCBzdHJ1Y3QgdnR5ICosIGludCwgY29uc3QgY2hhciAqW10pOyBcCisKKyNkZWZpbmUgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkgXAorICBzdGF0aWMgaW50IGZ1bmNuYW1lIFwKKyAgICAoc3RydWN0IGNtZF9lbGVtZW50ICpzZWxmLCBzdHJ1Y3QgdnR5ICp2dHksIGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCisKKy8qIERFRlVOIGZvciB2dHkgY29tbWFuZCBpbnRlcmFmY2UuIExpdHRsZSBiaXQgaGFja3kgOy0pLiAqLworI2RlZmluZSBERUZVTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgMCkgXAorICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQorCisvKiBnbG9iYWwgKG5vbiBzdGF0aWMpIGNtZF9lbGVtZW50ICovCisjZGVmaW5lIGdERUZVTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKKyAgZ0RFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIDApIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworI2RlZmluZSBERUZVTl9BVFRSKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIpIFwKKyAgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyLCAwKSBcCisgIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpCisKKyNkZWZpbmUgREVGVU5fSElEREVOKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQVRUUiAoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfSElEREVOKQorCisjZGVmaW5lIERFRlVOX0RFUFJFQ0FURUQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9BVFRSIChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ERVBSRUNBVEVEKSBcCisKKy8qIERFRlVOX05PU0ggZm9yIGNvbW1hbmRzIHRoYXQgdnR5c2ggc2hvdWxkIGlnbm9yZSAqLworI2RlZmluZSBERUZVTl9OT1NIKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikKKworLyogREVGU0ggZm9yIHZ0eXNoLiAqLworI2RlZmluZSBERUZTSChkYWVtb24sIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChOVUxMLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIGRhZW1vbikgXAorCisvKiBERUZVTiArIERFRlNIICovCisjZGVmaW5lIERFRlVOU0goZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgZGFlbW9uKSBcCisgIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpCisKKy8qIERFRlVOICsgREVGU0ggd2l0aCBhdHRyaWJ1dGVzICovCisjZGVmaW5lIERFRlVOU0hfQVRUUihkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIpIFwKKyAgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyLCBkYWVtb24pIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworI2RlZmluZSBERUZVTlNIX0hJRERFTihkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5TSF9BVFRSIChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0hJRERFTikKKworI2RlZmluZSBERUZVTlNIX0RFUFJFQ0FURUQoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOU0hfQVRUUiAoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ERVBSRUNBVEVEKQorCisvKiBBTElBUyBtYWNybyB3aGljaCBkZWZpbmUgZXhpc3RpbmcgY29tbWFuZCdzIGFsaWFzLiAqLworI2RlZmluZSBBTElBUyhmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIDApCisKKy8qIGdsb2JhbCAobm9uIHN0YXRpYykgY21kX2VsZW1lbnQgKi8KKyNkZWZpbmUgZ0FMSUFTKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgZ0RFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIDApCisKKyNkZWZpbmUgQUxJQVNfQVRUUihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIsIDApCisKKyNkZWZpbmUgQUxJQVNfSElEREVOKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfSElEREVOLCAwKQorCisjZGVmaW5lIEFMSUFTX0RFUFJFQ0FURUQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ERVBSRUNBVEVELCAwKQorCisjZGVmaW5lIEFMSUFTX1NIKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCBkYWVtb24pCisKKyNkZWZpbmUgQUxJQVNfU0hfSElEREVOKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4sIGRhZW1vbikKKworI2RlZmluZSBBTElBU19TSF9ERVBSRUNBVEVEKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ERVBSRUNBVEVELCBkYWVtb24pCisKKyNlbmRpZgkJCQkvKiBWVFlTSF9FWFRSQUNUX1BMICovCisKKy8qIFNvbWUgbWFjcm9lcyAqLworI2RlZmluZSBDTURfT1BUSU9OKFMpICAgKChTWzBdKSA9PSAnWycpCisjZGVmaW5lIENNRF9WQVJJQUJMRShTKSAoKChTWzBdKSA+PSAnQScgJiYgKFNbMF0pIDw9ICdaJykgfHwgKChTWzBdKSA9PSAnPCcpKQorI2RlZmluZSBDTURfVkFSQVJHKFMpICAgKChTWzBdKSA9PSAnLicpCisjZGVmaW5lIENNRF9SQU5HRShTKQkoKFNbMF0gPT0gJzwnKSkKKworI2RlZmluZSBDTURfSVBWNChTKQkgICAoKHN0cmNtcCAoKFMpLCAiQS5CLkMuRCIpID09IDApKQorI2RlZmluZSBDTURfSVBWNF9QUkVGSVgoUykgKChzdHJjbXAgKChTKSwgIkEuQi5DLkQvTSIpID09IDApKQorI2RlZmluZSBDTURfSVBWNihTKSAgICAgICAgKChzdHJjbXAgKChTKSwgIlg6WDo6WDpYIikgPT0gMCkpCisjZGVmaW5lIENNRF9JUFY2X1BSRUZJWChTKSAoKHN0cmNtcCAoKFMpLCAiWDpYOjpYOlgvTSIpID09IDApKQorCisvKiBDb21tb24gZGVzY3JpcHRpb25zLiAqLworI2RlZmluZSBTSE9XX1NUUiAiU2hvdyBydW5uaW5nIHN5c3RlbSBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBJUF9TVFIgIklQIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIElQVjZfU1RSICJJUHY2IGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE5PX1NUUiAiTmVnYXRlIGEgY29tbWFuZCBvciBzZXQgaXRzIGRlZmF1bHRzXG4iCisjZGVmaW5lIENMRUFSX1NUUiAiUmVzZXQgZnVuY3Rpb25zXG4iCisjZGVmaW5lIFJJUF9TVFIgIlJJUCBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBCR1BfU1RSICJCR1AgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgT1NQRl9TVFIgIk9TUEYgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgTkVJR0hCT1JfU1RSICJTcGVjaWZ5IG5laWdoYm9yIHJvdXRlclxuIgorI2RlZmluZSBERUJVR19TVFIgIkRlYnVnZ2luZyBmdW5jdGlvbnMgKHNlZSBhbHNvICd1bmRlYnVnJylcbiIKKyNkZWZpbmUgVU5ERUJVR19TVFIgIkRpc2FibGUgZGVidWdnaW5nIGZ1bmN0aW9ucyAoc2VlIGFsc28gJ2RlYnVnJylcbiIKKyNkZWZpbmUgUk9VVEVSX1NUUiAiRW5hYmxlIGEgcm91dGluZyBwcm9jZXNzXG4iCisjZGVmaW5lIEFTX1NUUiAiQVMgbnVtYmVyXG4iCisjZGVmaW5lIE1CR1BfU1RSICJNQkdQIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE1BVENIX1NUUiAiTWF0Y2ggdmFsdWVzIGZyb20gcm91dGluZyB0YWJsZVxuIgorI2RlZmluZSBTRVRfU1RSICJTZXQgdmFsdWVzIGluIGRlc3RpbmF0aW9uIHJvdXRpbmcgcHJvdG9jb2xcbiIKKyNkZWZpbmUgT1VUX1NUUiAiRmlsdGVyIG91dGdvaW5nIHJvdXRpbmcgdXBkYXRlc1xuIgorI2RlZmluZSBJTl9TVFIgICJGaWx0ZXIgaW5jb21pbmcgcm91dGluZyB1cGRhdGVzXG4iCisjZGVmaW5lIFY0Tk9UQVRJT05fU1RSICJzcGVjaWZ5IGJ5IElQdjQgYWRkcmVzcyBub3RhdGlvbihlLmcuIDAuMC4wLjApXG4iCisjZGVmaW5lIE9TUEY2X05VTUJFUl9TVFIgIlNwZWNpZnkgYnkgbnVtYmVyXG4iCisjZGVmaW5lIElOVEVSRkFDRV9TVFIgIkludGVyZmFjZSBpbmZvbWF0aW9uXG4iCisjZGVmaW5lIElGTkFNRV9TVFIgIkludGVyZmFjZSBuYW1lKGUuZy4gZXAwKVxuIgorI2RlZmluZSBJUDZfU1RSICJJUHY2IEluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE9TUEY2X1NUUiAiT3BlbiBTaG9ydGVzdCBQYXRoIEZpcnN0IChPU1BGKSBmb3IgSVB2NlxuIgorI2RlZmluZSBPU1BGNl9ST1VURVJfU1RSICJFbmFibGUgYSByb3V0aW5nIHByb2Nlc3NcbiIKKyNkZWZpbmUgT1NQRjZfSU5TVEFOQ0VfU1RSICI8MS02NTUzNT4gSW5zdGFuY2UgSURcbiIKKyNkZWZpbmUgU0VDT05EU19TVFIgIjwxLTY1NTM1PiBTZWNvbmRzXG4iCisjZGVmaW5lIFJPVVRFX1NUUiAiUm91dGluZyBUYWJsZVxuIgorI2RlZmluZSBQUkVGSVhfTElTVF9TVFIgIkJ1aWxkIGEgcHJlZml4IGxpc3RcbiIKKyNkZWZpbmUgT1NQRjZfRFVNUF9UWVBFX0xJU1QgXAorIihuZWlnaGJvcnxpbnRlcmZhY2V8YXJlYXxsc2F8emVicmF8Y29uZmlnfGRiZXh8c3BmfHJvdXRlfGxzZGJ8cmVkaXN0cmlidXRlfGhvb2t8YXNicnxwcmVmaXh8YWJyKSIKKyNkZWZpbmUgSVNJU19TVFIgIklTLUlTIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIEFSRUFfVEFHX1NUUiAiW2FyZWEgdGFnXVxuIgorCisjZGVmaW5lIENPTkZfQkFDS1VQX0VYVCAiLnNhdiIKKworLyogSVB2NCBvbmx5IG1hY2hpbmUgc2hvdWxkIG5vdCBhY2NlcHQgSVB2NiBhZGRyZXNzIGZvciBwZWVyJ3MgSVAKKyAgIGFkZHJlc3MuICBTbyB3ZSByZXBsYWNlIFZUWSBjb21tYW5kIHN0cmluZyBsaWtlIGJlbG93LiAqLworI2lmZGVmIEhBVkVfSVBWNgorI2RlZmluZSBORUlHSEJPUl9DTUQgICAgICAgIm5laWdoYm9yIChBLkIuQy5EfFg6WDo6WDpYKSAiCisjZGVmaW5lIE5PX05FSUdIQk9SX0NNRCAgICAibm8gbmVpZ2hib3IgKEEuQi5DLkR8WDpYOjpYOlgpICIKKyNkZWZpbmUgTkVJR0hCT1JfQUREUl9TVFIgICJOZWlnaGJvciBhZGRyZXNzXG5JUHY2IGFkZHJlc3NcbiIKKyNkZWZpbmUgTkVJR0hCT1JfQ01EMiAgICAgICJuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WHxXT1JEKSAiCisjZGVmaW5lIE5PX05FSUdIQk9SX0NNRDIgICAibm8gbmVpZ2hib3IgKEEuQi5DLkR8WDpYOjpYOlh8V09SRCkgIgorI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUjIgIk5laWdoYm9yIGFkZHJlc3Ncbk5laWdoYm9yIElQdjYgYWRkcmVzc1xuTmVpZ2hib3IgdGFnXG4iCisjZWxzZQorI2RlZmluZSBORUlHSEJPUl9DTUQgICAgICAgIm5laWdoYm9yIEEuQi5DLkQgIgorI2RlZmluZSBOT19ORUlHSEJPUl9DTUQgICAgIm5vIG5laWdoYm9yIEEuQi5DLkQgIgorI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUiAgIk5laWdoYm9yIGFkZHJlc3NcbiIKKyNkZWZpbmUgTkVJR0hCT1JfQ01EMiAgICAgICJuZWlnaGJvciAoQS5CLkMuRHxXT1JEKSAiCisjZGVmaW5lIE5PX05FSUdIQk9SX0NNRDIgICAibm8gbmVpZ2hib3IgKEEuQi5DLkR8V09SRCkgIgorI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUjIgIk5laWdoYm9yIGFkZHJlc3Ncbk5laWdoYm9yIHRhZ1xuIgorI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAqLworCisvKiBQcm90b3R5cGVzLiAqLwordm9pZCBpbnN0YWxsX25vZGUoc3RydWN0IGNtZF9ub2RlICosIGludCAoKikoc3RydWN0IHZ0eSAqKSk7Cit2b2lkIGluc3RhbGxfZGVmYXVsdChlbnVtIG5vZGVfdHlwZSk7Cit2b2lkIGluc3RhbGxfZWxlbWVudChlbnVtIG5vZGVfdHlwZSwgc3RydWN0IGNtZF9lbGVtZW50ICopOwordm9pZCBzb3J0X25vZGUoKTsKKworLyogQ29uY2F0ZW5hdGVzIGFyZ3Zbc2hpZnRdIHRocm91Z2ggYXJndlthcmdjLTFdIGludG8gYSBzaW5nbGUgTlVMLXRlcm1pbmF0ZWQKKyAgIHN0cmluZyB3aXRoIGEgc3BhY2UgYmV0d2VlbiBlYWNoIGVsZW1lbnQgKGFsbG9jYXRlZCB1c2luZworICAgWE1BTExPQyhNVFlQRV9UTVApKS4gIFJldHVybnMgTlVMTCBpZiBzaGlmdCA+PSBhcmdjLiAqLworY2hhciAqYXJndl9jb25jYXQoY29uc3QgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBpbnQgc2hpZnQpOworCit2ZWN0b3IgY21kX21ha2Vfc3RydmVjKGNvbnN0IGNoYXIgKik7Cit2b2lkIGNtZF9mcmVlX3N0cnZlYyh2ZWN0b3IpOwordmVjdG9yIGNtZF9kZXNjcmliZV9jb21tYW5kKCk7CitjaGFyICoqY21kX2NvbXBsZXRlX2NvbW1hbmQoKTsKK2NvbnN0IGNoYXIgKmNtZF9wcm9tcHQoZW51bSBub2RlX3R5cGUpOworaW50IGNvbmZpZ19mcm9tX2ZpbGUoc3RydWN0IHZ0eSAqLCBGSUxFICopOworZW51bSBub2RlX3R5cGUgbm9kZV9wYXJlbnQoZW51bSBub2RlX3R5cGUpOworaW50IGNtZF9leGVjdXRlX2NvbW1hbmQodmVjdG9yLCBzdHJ1Y3QgdnR5ICosIHN0cnVjdCBjbWRfZWxlbWVudCAqKiwgaW50KTsKK2ludCBjbWRfZXhlY3V0ZV9jb21tYW5kX3N0cmljdCh2ZWN0b3IsIHN0cnVjdCB2dHkgKiwgc3RydWN0IGNtZF9lbGVtZW50ICoqKTsKK3ZvaWQgY29uZmlnX3JlcGxhY2Vfc3RyaW5nKHN0cnVjdCBjbWRfZWxlbWVudCAqLCBjaGFyICosIC4uLik7Cit2b2lkIGNtZF9pbml0KGludCk7CisKKy8qIEV4cG9ydCB0eXBpY2FsIGZ1bmN0aW9ucy4gKi8KK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2VuZF9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19leGl0X2NtZDsKK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX3F1aXRfY21kOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfaGVscF9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19saXN0X2NtZDsKK2NoYXIgKmhvc3RfY29uZmlnX2ZpbGUoKTsKK3ZvaWQgaG9zdF9jb25maWdfc2V0KGNvbnN0IGNoYXIgKik7CisKK3ZvaWQgcHJpbnRfdmVyc2lvbihjb25zdCBjaGFyICopOworCitleHRlcm4gdm9pZCAqdGFsbF92dHlfY21kX2N0eDsKKworI2VuZGlmCQkJCS8qIF9aRUJSQV9DT01NQU5EX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS92dHkvdmVjdG9yLmggYi9vcGVuYnNjL2luY2x1ZGUvdnR5L3ZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYTE4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvdnR5L3ZlY3Rvci5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBHZW5lcmljIHZlY3RvciBpbnRlcmZhY2UgaGVhZGVyLgorICogQ29weXJpZ2h0IChDKSAxOTk3LCA5OCBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICogMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX1pFQlJBX1ZFQ1RPUl9ICisjZGVmaW5lIF9aRUJSQV9WRUNUT1JfSAorCisvKiBzdHJ1Y3QgZm9yIHZlY3RvciAqLworc3RydWN0IF92ZWN0b3IgeworCXVuc2lnbmVkIGludCBhY3RpdmU7CS8qIG51bWJlciBvZiBhY3RpdmUgc2xvdHMgKi8KKwl1bnNpZ25lZCBpbnQgYWxsb2NlZDsJLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBzbG90ICovCisJdm9pZCAqKmluZGV4OwkJLyogaW5kZXggdG8gZGF0YSAqLworfTsKK3R5cGVkZWYgc3RydWN0IF92ZWN0b3IgKnZlY3RvcjsKKworI2RlZmluZSBWRUNUT1JfTUlOX1NJWkUgMQorCisvKiAoU29tZXRpbWVzKSB1c2VmdWxsIG1hY3Jvcy4gIFRoaXMgbWFjcm8gY29udmVydCBpbmRleCBleHByZXNzaW9uIHRvCisgYXJyYXkgZXhwcmVzc2lvbi4gKi8KKy8qIFJlZmVyZW5jZSBzbG90IGF0IGdpdmVuIGluZGV4LCBjYWxsZXIgbXVzdCBlbnN1cmUgc2xvdCBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgdmVjdG9yX3Nsb3QoVixJKSAgKChWKS0+aW5kZXhbKEkpXSkKKy8qIE51bWJlciBvZiBhY3RpdmUgc2xvdHMuCisgKiBOb3RlIHRoYXQgdGhpcyBkaWZmZXJzIGZyb20gdmVjdG9yX2NvdW50KCkgYXMgaXQgdGhlIGNvdW50IHJldHVybmVkCisgKiB3aWxsIGluY2x1ZGUgYW55IGVtcHR5IHNsb3RzCisgKi8KKyNkZWZpbmUgdmVjdG9yX2FjdGl2ZShWKSAoKFYpLT5hY3RpdmUpCisKKy8qIFByb3RvdHlwZXMuICovCit2ZWN0b3IgdmVjdG9yX2luaXQodW5zaWduZWQgaW50IHNpemUpOwordm9pZCB2ZWN0b3JfZW5zdXJlKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgbnVtKTsKK2ludCB2ZWN0b3JfZW1wdHlfc2xvdCh2ZWN0b3Igdik7CitpbnQgdmVjdG9yX3NldCh2ZWN0b3Igdiwgdm9pZCAqdmFsKTsKK2ludCB2ZWN0b3Jfc2V0X2luZGV4KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSwgdm9pZCAqdmFsKTsKK3ZvaWQgdmVjdG9yX3Vuc2V0KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSk7Cit1bnNpZ25lZCBpbnQgdmVjdG9yX2NvdW50KHZlY3RvciB2KTsKK3ZvaWQgdmVjdG9yX29ubHlfd3JhcHBlcl9mcmVlKHZlY3RvciB2KTsKK3ZvaWQgdmVjdG9yX29ubHlfaW5kZXhfZnJlZSh2b2lkICppbmRleCk7Cit2b2lkIHZlY3Rvcl9mcmVlKHZlY3RvciB2KTsKK3ZlY3RvciB2ZWN0b3JfY29weSh2ZWN0b3Igdik7CisKK3ZvaWQgKnZlY3Rvcl9sb29rdXAodmVjdG9yLCB1bnNpZ25lZCBpbnQpOwordm9pZCAqdmVjdG9yX2xvb2t1cF9lbnN1cmUodmVjdG9yLCB1bnNpZ25lZCBpbnQpOworCitleHRlcm4gdm9pZCAqdGFsbF92dHlfdmVjX2N0eDsKKworI2VuZGlmCQkJCS8qIF9aRUJSQV9WRUNUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS92dHkuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvdnR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0MWZjNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvdnR5LmgKQEAgLTAsMCArMSwxNTEgQEAKKyNpZm5kZWYgX1ZUWV9ICisjZGVmaW5lIF9WVFlfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogR0NDIGhhdmUgcHJpbnRmIHR5cGUgYXR0cmlidXRlIGNoZWNrLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBWVFlfUFJJTlRGX0FUVFJJQlVURShhLGIpIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCBhLCBiKSkpCisjZWxzZQorI2RlZmluZSBWVFlfUFJJTlRGX0FUVFJJQlVURShhLGIpCisjZW5kaWYJCQkJLyogX19HTlVDX18gKi8KKworLyogRG9lcyB0aGUgSS9PIGVycm9yIGluZGljYXRlIHRoYXQgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcmV0cmllZCBsYXRlcj8gKi8KKyNkZWZpbmUgRVJSTk9fSU9fUkVUUlkoRU4pIFwKKwkoKChFTikgPT0gRUFHQUlOKSB8fCAoKEVOKSA9PSBFV09VTERCTE9DSykgfHwgKChFTikgPT0gRUlOVFIpKQorCisvKiBWdHkgcmVhZCBidWZmZXIgc2l6ZS4gKi8KKyNkZWZpbmUgVlRZX1JFQURfQlVGU0laIDUxMgorCisjZGVmaW5lIFZUWV9CVUZTSVogNTEyCisjZGVmaW5lIFZUWV9NQVhISVNUIDIwCisKKy8qIFZ0eSBldmVudHMgKi8KK2VudW0gZXZlbnQgeworCVZUWV9TRVJWLAorCVZUWV9SRUFELAorCVZUWV9XUklURSwKKwlWVFlfQ0xPU0VELAorCVZUWV9USU1FT1VUX1JFU0VULAorI2lmZGVmIFZUWVNICisJVlRZU0hfU0VSViwKKwlWVFlTSF9SRUFELAorCVZUWVNIX1dSSVRFCisjZW5kaWYJCQkJLyogVlRZU0ggKi8KK307CisKK3N0cnVjdCB2dHkgeworCUZJTEUgKmZpbGU7CisKKwkvKiBwcml2YXRlIGRhdGEsIHNwZWNpZmllZCBieSBjcmVhdG9yICovCisJdm9pZCAqcHJpdjsKKworCS8qIEZpbGUgZGVzY3JpcHRlciBvZiB0aGlzIHZ0eS4gKi8KKwlpbnQgZmQ7CisKKwkvKiBJcyB0aGlzIHZ0eSBjb25uZWN0IHRvIGZpbGUgb3Igbm90ICovCisJZW51bSB7IFZUWV9URVJNLCBWVFlfRklMRSwgVlRZX1NIRUxMLCBWVFlfU0hFTExfU0VSViB9IHR5cGU7CisKKwkvKiBOb2RlIHN0YXR1cyBvZiB0aGlzIHZ0eSAqLworCWludCBub2RlOworCisJLyogRmFpbHVyZSBjb3VudCAqLworCWludCBmYWlsOworCisJLyogT3V0cHV0IGJ1ZmZlci4gKi8KKwlzdHJ1Y3QgYnVmZmVyICpvYnVmOworCisJLyogQ29tbWFuZCBpbnB1dCBidWZmZXIgKi8KKwljaGFyICpidWY7CisKKwkvKiBDb21tYW5kIGN1cnNvciBwb2ludCAqLworCWludCBjcDsKKworCS8qIENvbW1hbmQgbGVuZ3RoICovCisJaW50IGxlbmd0aDsKKworCS8qIENvbW1hbmQgbWF4IGxlbmd0aC4gKi8KKwlpbnQgbWF4OworCisJLyogSGlzdHJ5IG9mIGNvbW1hbmQgKi8KKwljaGFyICpoaXN0W1ZUWV9NQVhISVNUXTsKKworCS8qIEhpc3RvcnkgbG9va3VwIGN1cnJlbnQgcG9pbnQgKi8KKwlpbnQgaHA7CisKKwkvKiBIaXN0b3J5IGluc2VydCBlbmQgcG9pbnQgKi8KKwlpbnQgaGluZGV4OworCisJLyogRm9yIGN1cnJlbnQgcmVmZXJlbmNpbmcgcG9pbnQgb2YgaW50ZXJmYWNlLCByb3V0ZS1tYXAsCisJICAgYWNjZXNzLWxpc3QgZXRjLi4uICovCisJdm9pZCAqaW5kZXg7CisKKwkvKiBGb3IgbXVsdGlwbGUgbGV2ZWwgaW5kZXggdHJlYXRtZW50IHN1Y2ggYXMga2V5IGNoYWluIGFuZCBrZXkuICovCisJdm9pZCAqaW5kZXhfc3ViOworCisJLyogRm9yIGVzY2FwZSBjaGFyYWN0ZXIuICovCisJdW5zaWduZWQgY2hhciBlc2NhcGU7CisKKwkvKiBDdXJyZW50IHZ0eSBzdGF0dXMuICovCisJZW51bSB7IFZUWV9OT1JNQUwsIFZUWV9DTE9TRSwgVlRZX01PUkUsIFZUWV9NT1JFTElORSB9IHN0YXR1czsKKworCS8qIElBQyBoYW5kbGluZzogd2FzIHRoZSBsYXN0IGNoYXJhY3RlciByZWNlaXZlZCB0aGUgSUFDCisJICogKGludGVycHJldC1hcy1jb21tYW5kKSBlc2NhcGUgY2hhcmFjdGVyIChhbmQgdGhlcmVmb3JlIHRoZSBuZXh0CisJICogY2hhcmFjdGVyIHdpbGwgYmUgdGhlIGNvbW1hbmQgY29kZSk/ICBSZWZlciB0byBUZWxuZXQgUkZDIDg1NC4gKi8KKwl1bnNpZ25lZCBjaGFyIGlhYzsKKworCS8qIElBQyBTQiAob3B0aW9uIHN1Ym5lZ290aWF0aW9uKSBoYW5kbGluZyAqLworCXVuc2lnbmVkIGNoYXIgaWFjX3NiX2luX3Byb2dyZXNzOworCS8qIEF0IHRoZSBtb21lbnQsIHdlIGNhcmUgb25seSBhYm91dCB0aGUgTkFXUyAod2luZG93IHNpemUpIG5lZ290aWF0aW9uLAorCSAqIGFuZCB0aGF0IHJlcXVpcmVzIGp1c3QgYSA1LWNoYXJhY3RlciBidWZmZXIgKFJGQyAxMDczKToKKwkgKiA8TkFXUyBjaGFyPiA8MTYtYml0IHdpZHRoPiA8MTYtYml0IGhlaWdodD4gKi8KKyNkZWZpbmUgVEVMTkVUX05BV1NfU0JfTEVOIDUKKwl1bnNpZ25lZCBjaGFyIHNiX2J1ZltURUxORVRfTkFXU19TQl9MRU5dOworCS8qIEhvdyBtYW55IHN1Ym5lZ290aWF0aW9uIGNoYXJhY3RlcnMgaGF2ZSB3ZSByZWNlaXZlZD8gIFdlIGp1c3QgZHJvcAorCSAqIHRob3NlIHRoYXQgZG8gbm90IGZpdCBpbiB0aGUgYnVmZmVyLiAqLworCXNpemVfdCBzYl9sZW47CisKKwkvKiBXaW5kb3cgd2lkdGgvaGVpZ2h0LiAqLworCWludCB3aWR0aDsKKwlpbnQgaGVpZ2h0OworCisJLyogQ29uZmlndXJlIGxpbmVzLiAqLworCWludCBsaW5lczsKKworCWludCBtb25pdG9yOworCisJLyogSW4gY29uZmlndXJlIG1vZGUuICovCisJaW50IGNvbmZpZzsKK307CisKKy8qIFNtYWxsIG1hY3JvIHRvIGRldGVybWluZSBuZXdsaW5lIGlzIG5ld2xpbmUgb25seSBvciBsaW5lZmVlZCBuZWVkZWQuICovCisjZGVmaW5lIFZUWV9ORVdMSU5FICAoKHZ0eS0+dHlwZSA9PSBWVFlfVEVSTSkgPyAiXHJcbiIgOiAiXG4iKQorCitzdGF0aWMgaW5saW5lIGNoYXIgKnZ0eV9uZXdsaW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlyZXR1cm4gVlRZX05FV0xJTkU7Cit9CisKKy8qIFByb3RvdHlwZXMuICovCit2b2lkIHZ0eV9pbml0ICh2b2lkKTsKK2ludCB2dHlfcmVhZF9jb25maWdfZmlsZShjb25zdCBjaGFyICpmaWxlX25hbWUpOwordm9pZCB2dHlfaW5pdF92dHlzaCAodm9pZCk7Cit2b2lkIHZ0eV9yZXNldCAodm9pZCk7CitzdHJ1Y3QgdnR5ICp2dHlfbmV3ICh2b2lkKTsKK3N0cnVjdCB2dHkgKnZ0eV9jcmVhdGUgKGludCB2dHlfc29jaywgdm9pZCAqcHJpdik7CitpbnQgdnR5X291dCAoc3RydWN0IHZ0eSAqLCBjb25zdCBjaGFyICosIC4uLikgVlRZX1BSSU5URl9BVFRSSUJVVEUoMiwgMyk7CitpbnQgdnR5X291dF9uZXdsaW5lKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X3JlYWQoc3RydWN0IHZ0eSAqdnR5KTsKKy8vdm9pZCB2dHlfdGltZV9wcmludCAoc3RydWN0IHZ0eSAqLCBpbnQpOwordm9pZCB2dHlfY2xvc2UgKHN0cnVjdCB2dHkgKik7CitjaGFyICp2dHlfZ2V0X2N3ZCAodm9pZCk7Cit2b2lkIHZ0eV9sb2cgKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpwcm90bywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0KTsKK2ludCB2dHlfY29uZmlnX2xvY2sgKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X2NvbmZpZ191bmxvY2sgKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X3NoZWxsIChzdHJ1Y3QgdnR5ICopOworaW50IHZ0eV9zaGVsbF9zZXJ2IChzdHJ1Y3QgdnR5ICopOwordm9pZCB2dHlfaGVsbG8gKHN0cnVjdCB2dHkgKik7CisKK3ZvaWQgKnRhbGxfdnR5X2N0eDsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9saWJzY2NwLnBjLmluIGIvb3BlbmJzYy9saWJzY2NwLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYThkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2xpYnNjY3AucGMuaW4KQEAgLTAsMCArMSwxMCBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IE9wZW5CU0MgU0NDUCBMaWIKK0Rlc2NyaXB0aW9uOiBPcGVuQlNDIFNDQ1AgTGliCitWZXJzaW9uOiBAVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sc2NjcAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vCmRpZmYgLS1naXQgYS9vcGVuYnNjL29wZW5ic2MucGMuaW4gYi9vcGVuYnNjL29wZW5ic2MucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhMDdlMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvb3BlbmJzYy5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAvCisKK05hbWU6IE9wZW5CU0MKK0Rlc2NyaXB0aW9uOiBPcGVuQlNDIGJhc2Ugc3RhdGlvbiBjb250cm9sbGVyCitSZXF1aXJlczoKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxvcGVuYnNjCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzFkMzdhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0OCBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUgLUkkKHRvcF9idWlsZGRpcikKK0FNX0NGTEFHUz0tV2FsbCAkKExJQk9TTU9DT1JFX0NGTEFHUykKK0FNX0xERkxBR1MgPSAkKExJQk9TTU9DT1JFX0xJQlMpCisKK3NiaW5fUFJPR1JBTVMgPSBic2NfaGFjayBiczExX2NvbmZpZyBpcGFjY2Vzcy1maW5kIGlwYWNjZXNzLWNvbmZpZyBcCisgICAgICAgICAgICAgICAgaXNkbnN5bmMgYnNjX21nY3AgaXBhY2Nlc3MtcHJveHkKK25vaW5zdF9MSUJSQVJJRVMgPSBsaWJic2MuYSBsaWJtc2MuYSBsaWJ2dHkuYQorbm9pbnN0X0hFQURFUlMgPSB2dHkvY2FyZHNoZWxsLmgKKworYnNjZGlyID0gJChsaWJkaXIpCitic2NfTElCUkFSSUVTID0gbGlic2NjcC5hCisKK2xpYmJzY19hX1NPVVJDRVMgPSBhYmlzX3JzbC5jIGFiaXNfbm0uYyBnc21fZGF0YS5jIGdzbV8wNF8wOF91dGlscy5jIFwKKwkJY2hhbl9hbGxvYy5jIGRlYnVnLmMgXAorCQlnc21fc3Vic2NyaWJlcl9iYXNlLmMgc3ViY2hhbl9kZW11eC5jIGJzY19ybGwuYyB0cmFuc2FjdGlvbi5jIFwKKwkJdHJhdV9mcmFtZS5jIHRyYXVfbXV4LmMgcGFnaW5nLmMgZTFfY29uZmlnLmMgZTFfaW5wdXQuYyBcCisJCWlucHV0L21pc2RuLmMgaW5wdXQvaXBhY2Nlc3MuYyBcCisJCXRhbGxvY19jdHguYyBzeXN0ZW1faW5mb3JtYXRpb24uYyByZXN0X29jdGV0cy5jIFwKKwkJcnRwX3Byb3h5LmMgYnRzX3NpZW1lbnNfYnMxMS5jIGJ0c19pcGFjY2Vzc19uYW5vYnRzLmMgXAorCQlidHNfdW5rbm93bi5jIGJzY192ZXJzaW9uLmMgYnNjX2FwaS5jIHZ0eV9pbnRlcmZhY2VfY21kcy5jCisKK2xpYm1zY19hX1NPVVJDRVMgPSBnc21fc3Vic2NyaWJlci5jIGRiLmMgdGVsbmV0X2ludGVyZmFjZS5jIFwKKwkJbW5jYy5jIGdzbV8wNF8wOC5jIGdzbV8wNF8xMS5jIHRyYW5zYWN0aW9uLmMgXAorCQl0b2tlbl9hdXRoLmMgcnJscC5jIGdzbV8wNF84MC5jIHVzc2QuYyBzaWxlbnRfY2FsbC5jIFwKKwkJaGFuZG92ZXJfbG9naWMuYyBoYW5kb3Zlcl9kZWNpc2lvbi5jIG1lYXNfcmVwLmMKKworbGlidnR5X2FfU09VUkNFUyA9IHZ0eS9idWZmZXIuYyB2dHkvY29tbWFuZC5jIHZ0eS92ZWN0b3IuYyB2dHkvdnR5LmMKKworbGlic2NjcF9hX1NPVVJDRVMgPSBzY2NwL3NjY3AuYworCitic2NfaGFja19TT1VSQ0VTID0gYnNjX2hhY2suYyBic2NfaW5pdC5jIHZ0eV9pbnRlcmZhY2UuYyB2dHlfaW50ZXJmYWNlX2xheWVyMy5jCitic2NfaGFja19MREFERCA9IGxpYm1zYy5hIGxpYmJzYy5hIGxpYm1zYy5hIGxpYnZ0eS5hIC1sZGwgLWxkYmkgJChMSUJDUllQVCkKKworYnMxMV9jb25maWdfU09VUkNFUyA9IGJzMTFfY29uZmlnLmMgYWJpc19ubS5jIGdzbV9kYXRhLmMgZGVidWcuYyBcCisJCSAgICAgIHJzMjMyLmMgYnRzX3NpZW1lbnNfYnMxMS5jCisKK2lwYWNjZXNzX2ZpbmRfU09VUkNFUyA9IGlwYWNjZXNzL2lwYWNjZXNzLWZpbmQuYworCitpcGFjY2Vzc19jb25maWdfU09VUkNFUyA9IGlwYWNjZXNzL2lwYWNjZXNzLWNvbmZpZy5jIGlwYWNjZXNzL2lwYWNjZXNzLWZpcm13YXJlLmMKK2lwYWNjZXNzX2NvbmZpZ19MREFERCA9IGxpYmJzYy5hIGxpYm1zYy5hIGxpYmJzYy5hIGxpYnZ0eS5hIC1sZGwgLWxkYmkgJChMSUJDUllQVCkKKworaXNkbnN5bmNfU09VUkNFUyA9IGlzZG5zeW5jLmMKKworYnNjX21nY3BfU09VUkNFUyA9IG1nY3AvbWdjcF9tYWluLmMgbWdjcC9tZ2NwX3Byb3RvY29sLmMgbWdjcC9tZ2NwX25ldHdvcmsuYyBtZ2NwL21nY3BfdnR5LmMgXAorCQkgICBkZWJ1Zy5jIHRlbG5ldF9pbnRlcmZhY2UuYyB2dHlfaW50ZXJmYWNlX2NtZHMuYworYnNjX21nY3BfTERBREQgPSBsaWJ2dHkuYQorCitpcGFjY2Vzc19wcm94eV9TT1VSQ0VTID0gaXBhY2Nlc3MvaXBhY2Nlc3MtcHJveHkuYyBkZWJ1Zy5jCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9hYmlzX25tLmMgYi9vcGVuYnNjL3NyYy9hYmlzX25tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4ZWU1NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2FiaXNfbm0uYwpAQCAtMCwwICsxLDMwMDYgQEAKKy8qIEdTTSBOZXR3b3JrIE1hbmFnZW1lbnQgKE9NTCkgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorICogM0dQUCBUUyAxMi4yMSB2ZXJzaW9uIDguMC4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDYyMyBWOC4wLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaWJnZW4uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWlzZG4uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCisjZGVmaW5lIE9NX0FMTE9DX1NJWkUJCTEwMjQKKyNkZWZpbmUgT01fSEVBRFJPT01fU0laRQkxMjgKKyNkZWZpbmUgSVBBQ0NfU0VHTUVOVF9TSVpFCTI0NQorCisvKiB1bmlkaXJlY3Rpb25hbCBtZXNzYWdlcyBmcm9tIEJUUyB0byBCU0MgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fbXNndHlwZSByZXBvcnRzW10gPSB7CisJTk1fTVRfU1dfQUNUSVZBVEVEX1JFUCwKKwlOTV9NVF9URVNUX1JFUCwKKwlOTV9NVF9TVEFURUNIR19FVkVOVF9SRVAsCisJTk1fTVRfRkFJTFVSRV9FVkVOVF9SRVAsCit9OworCisvKiBtZXNzYWdlcyB3aXRob3V0IEFDSy9OQUNLICovCitzdGF0aWMgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgbm9fYWNrX25hY2tbXSA9IHsKKwlOTV9NVF9NRUFTX1JFU19SRVEsCisJTk1fTVRfU1RPUF9NRUFTLAorCU5NX01UX1NUQVJUX01FQVMsCit9OworCisvKiBNZXNzYWdlcyByZWxhdGVkIHRvIHNvZnR3YXJlIGxvYWQgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fbXNndHlwZSBzd19sb2FkX21zZ3NbXSA9IHsKKwlOTV9NVF9MT0FEX0lOSVRfQUNLLAorCU5NX01UX0xPQURfSU5JVF9OQUNLLAorCU5NX01UX0xPQURfU0VHX0FDSywKKwlOTV9NVF9MT0FEX0FCT1JULAorCU5NX01UX0xPQURfRU5EX0FDSywKKwlOTV9NVF9MT0FEX0VORF9OQUNLLAorCS8vTk1fTVRfU1dfQUNUX1JFUSwKKwlOTV9NVF9BQ1RJVkFURV9TV19BQ0ssCisJTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywKKwlOTV9NVF9TV19BQ1RJVkFURURfUkVQLAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9tc2d0eXBlIG5hY2tzW10gPSB7CisJTk1fTVRfTE9BRF9JTklUX05BQ0ssCisJTk1fTVRfTE9BRF9FTkRfTkFDSywKKwlOTV9NVF9TV19BQ1RfUkVRX05BQ0ssCisJTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywKKwlOTV9NVF9FU1RBQkxJU0hfVEVJX05BQ0ssCisJTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywKKwlOTV9NVF9ESVNDX1RFUlJfU0lHTl9OQUNLLAorCU5NX01UX0NPTk5fVEVSUl9UUkFGX05BQ0ssCisJTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywKKwlOTV9NVF9DT05OX01EUk9QX0xJTktfTkFDSywKKwlOTV9NVF9ESVNDX01EUk9QX0xJTktfTkFDSywKKwlOTV9NVF9TRVRfQlRTX0FUVFJfTkFDSywKKwlOTV9NVF9TRVRfUkFESU9fQVRUUl9OQUNLLAorCU5NX01UX1NFVF9DSEFOX0FUVFJfTkFDSywKKwlOTV9NVF9QRVJGX1RFU1RfTkFDSywKKwlOTV9NVF9TRU5EX1RFU1RfUkVQX05BQ0ssCisJTk1fTVRfU1RPUF9URVNUX05BQ0ssCisJTk1fTVRfU1RPUF9FVkVOVF9SRVBfTkFDSywKKwlOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAorCU5NX01UX0NIR19BRE1fU1RBVEVfTkFDSywKKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAorCU5NX01UX1JFUF9PVVRTVF9BTEFSTVNfTkFDSywKKwlOTV9NVF9DSEFOR0VPVkVSX05BQ0ssCisJTk1fTVRfT1BTVEFSVF9OQUNLLAorCU5NX01UX1JFSU5JVF9OQUNLLAorCU5NX01UX1NFVF9TSVRFX09VVF9OQUNLLAorCU5NX01UX0NIR19IV19DT05GX05BQ0ssCisJTk1fTVRfR0VUX0FUVFJfTkFDSywKKwlOTV9NVF9TRVRfQUxBUk1fVEhSRVNfTkFDSywKKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCisJTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywKKwlOTV9NVF9CUzExX0NSRUFURV9PQkpfTkFDSywKKwlOTV9NVF9CUzExX0RFTEVURV9PQkpfTkFDSywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIG5hY2tfbmFtZXNbXSA9IHsKKwl7IE5NX01UX0xPQURfSU5JVF9OQUNLLAkJIlNPRlRXQVJFIExPQUQgSU5JVCIgfSwKKwl7IE5NX01UX0xPQURfRU5EX05BQ0ssCQkiU09GVFdBUkUgTE9BRCBFTkQiIH0sCisJeyBOTV9NVF9TV19BQ1RfUkVRX05BQ0ssCSJTT0ZUV0FSRSBBQ1RJVkFURSBSRVFVRVNUIiB9LAorCXsgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywJIkFDVElWQVRFIFNPRlRXQVJFIiB9LAorCXsgTk1fTVRfRVNUQUJMSVNIX1RFSV9OQUNLLAkiRVNUQUJMSVNIIFRFSSIgfSwKKwl7IE5NX01UX0NPTk5fVEVSUl9TSUdOX05BQ0ssCSJDT05ORUNUIFRFUlJFU1RSSUFMIFNJR05BTExJTkciIH0sCisJeyBOTV9NVF9ESVNDX1RFUlJfU0lHTl9OQUNLLAkiRElTQ09OTkVDVCBURVJSRVNUUklBTCBTSUdOQUxMSU5HIiB9LAorCXsgTk1fTVRfQ09OTl9URVJSX1RSQUZfTkFDSywJIkNPTk5FQ1QgVEVSUkVTVFJJQUwgVFJBRkZJQyIgfSwKKwl7IE5NX01UX0RJU0NfVEVSUl9UUkFGX05BQ0ssCSJESVNDT05ORUNUIFRFUlJFU1RSSUFMIFRSQUZGSUMiIH0sCisJeyBOTV9NVF9DT05OX01EUk9QX0xJTktfTkFDSywJIkNPTk5FQ1QgTVVMVEktRFJPUCBMSU5LIiB9LAorCXsgTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCSJESVNDT05ORUNUIE1VTFRJLURST1AgTElOSyIgfSwKKwl7IE5NX01UX1NFVF9CVFNfQVRUUl9OQUNLLAkiU0VUIEJUUyBBVFRSSUJVVEUiIH0sCisJeyBOTV9NVF9TRVRfUkFESU9fQVRUUl9OQUNLLAkiU0VUIFJBRElPIEFUVFJJQlVURSIgfSwKKwl7IE5NX01UX1NFVF9DSEFOX0FUVFJfTkFDSywJIlNFVCBDSEFOTkVMIEFUVFJJQlVURSIgfSwKKwl7IE5NX01UX1BFUkZfVEVTVF9OQUNLLAkJIlBFUkZPUk0gVEVTVCIgfSwKKwl7IE5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywJIlNFTkQgVEVTVCBSRVBPUlQiIH0sCisJeyBOTV9NVF9TVE9QX1RFU1RfTkFDSywJCSJTVE9QIFRFU1QiIH0sCisJeyBOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAkiU1RPUCBFVkVOVCBSRVBPUlQiIH0sCisJeyBOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAkiUkVTRVQgRVZFTlQgUkVQT1JUIiB9LAorCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAkiQ0hBTkdFIEFETUlOSVNUUkFUSVZFIFNUQVRFIiB9LAorCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfTkFDSywKKwkJCQkiQ0hBTkdFIEFETUlOSVNUUkFUSVZFIFNUQVRFIFJFUVVFU1QiIH0sCisJeyBOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCSJSRVBPUlQgT1VUU1RBTkRJTkcgQUxBUk1TIiB9LAorCXsgTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLLAkiQ0hBTkdFT1ZFUiIgfSwKKwl7IE5NX01UX09QU1RBUlRfTkFDSywJCSJPUFNUQVJUIiB9LAorCXsgTk1fTVRfUkVJTklUX05BQ0ssCQkiUkVJTklUIiB9LAorCXsgTk1fTVRfU0VUX1NJVEVfT1VUX05BQ0ssCSJTRVQgU0lURSBPVVRQVVQiIH0sCisJeyBOTV9NVF9DSEdfSFdfQ09ORl9OQUNLLAkiQ0hBTkdFIEhBUkRXQVJFIENPTkZJR1VSQVRJT04iIH0sCisJeyBOTV9NVF9HRVRfQVRUUl9OQUNLLAkJIkdFVCBBVFRSSUJVVEUiIH0sCisJeyBOTV9NVF9TRVRfQUxBUk1fVEhSRVNfTkFDSywJIlNFVCBBTEFSTSBUSFJFU0hPTEQiIH0sCisJeyBOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCSJCUzExIEJFR0lOIERBVEFCQVNFIFRSQU5TTUlTU0lPTiIgfSwKKwl7IE5NX01UX0JTMTFfRU5EX0RCX1RYX05BQ0ssCSJCUzExIEVORCBEQVRBQkFTRSBUUkFOU01JU1NJT04iIH0sCisJeyBOTV9NVF9CUzExX0NSRUFURV9PQkpfTkFDSywJIkJTMTEgQ1JFQVRFIE9CSkVDVCIgfSwKKwl7IE5NX01UX0JTMTFfREVMRVRFX09CSl9OQUNLLAkiQlMxMSBERUxFVEUgT0JKRUNUIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCisvKiBDaGFwdGVyIDkuNC4zNiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbmFja19jYXVzZV9uYW1lc1tdID0geworCS8qIEdlbmVyYWwgTmFjayBDYXVzZXMgKi8KKwl7IE5NX05BQ0tfSU5DT1JSX1NUUlVDVCwJIkluY29ycmVjdCBtZXNzYWdlIHN0cnVjdHVyZSIgfSwKKwl7IE5NX05BQ0tfTVNHVFlQRV9JTlZBTCwJIkludmFsaWQgbWVzc2FnZSB0eXBlIHZhbHVlIiB9LAorCXsgTk1fTkFDS19PQkpDTEFTU19JTlZBTCwJIkludmFsaWQgT2JqZWN0IGNsYXNzIHZhbHVlIiB9LAorCXsgTk1fTkFDS19PQkpDTEFTU19OT1RTVVBQLAkiT2JqZWN0IGNsYXNzIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBOTV9OQUNLX0JUU05SX1VOS04sCQkiQlRTIG5vLiB1bmtub3duIiB9LAorCXsgTk1fTkFDS19UUlhOUl9VTktOLAkJIkJhc2ViYW5kIFRyYW5zY2VpdmVyIG5vLiB1bmtub3duIiB9LAorCXsgTk1fTkFDS19PQkpJTlNUX1VOS04sCQkiT2JqZWN0IEluc3RhbmNlIHVua25vd24iIH0sCisJeyBOTV9OQUNLX0FUVFJJRF9JTlZBTCwJCSJJbnZhbGlkIGF0dHJpYnV0ZSBpZGVudGlmaWVyIHZhbHVlIiB9LAorCXsgTk1fTkFDS19BVFRSSURfTk9UU1VQUCwJIkF0dHJpYnV0ZSBpZGVudGlmaWVyIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBOTV9OQUNLX1BBUkFNX1JBTkdFLAkJIlBhcmFtZXRlciB2YWx1ZSBvdXRzaWRlIHBlcm1pdHRlZCByYW5nZSIgfSwKKwl7IE5NX05BQ0tfQVRUUkxJU1RfSU5DT05TSVNURU5ULCJJbmNvbnNpc3RlbmN5IGluIGF0dHJpYnV0ZSBsaXN0IiB9LAorCXsgTk1fTkFDS19TUEVDX0lNUExfTk9UU1VQUCwJIlNwZWNpZmllZCBpbXBsZW1lbnRhdGlvbiBub3Qgc3VwcG9ydGVkIiB9LAorCXsgTk1fTkFDS19DQU5UX1BFUkZPUk0sCQkiTWVzc2FnZSBjYW5ub3QgYmUgcGVyZm9ybWVkIiB9LAorCS8qIFNwZWNpZmljIE5hY2sgQ2F1c2VzICovCisJeyBOTV9OQUNLX1JFU19OT1RJTVBMLAkJIlJlc291cmNlIG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IE5NX05BQ0tfUkVTX05PVEFWQUlMLAkJIlJlc291cmNlIG5vdCBhdmFpbGFibGUiIH0sCisJeyBOTV9OQUNLX0ZSRVFfTk9UQVZBSUwsCSJGcmVxdWVuY3kgbm90IGF2YWlsYWJsZSIgfSwKKwl7IE5NX05BQ0tfVEVTVF9OT1RTVVBQLAkJIlRlc3Qgbm90IHN1cHBvcnRlZCIgfSwKKwl7IE5NX05BQ0tfQ0FQQUNJVFlfUkVTVFIsCSJDYXBhY2l0eSByZXN0cmljdGlvbnMiIH0sCisJeyBOTV9OQUNLX1BIWVNDRkdfTk9UUEVSRk9STSwJIlBoeXNpY2FsIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCIgfSwKKwl7IE5NX05BQ0tfVEVTVF9OT1RJTklULAkJIlRlc3Qgbm90IGluaXRpYXRlZCIgfSwKKwl7IE5NX05BQ0tfUEhZU0NGR19OT1RSRVNUT1JFLAkiUGh5c2ljYWwgY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgcmVzdG9yZWQiIH0sCisJeyBOTV9OQUNLX1RFU1RfTk9TVUNILAkJIk5vIHN1Y2ggdGVzdCIgfSwKKwl7IE5NX05BQ0tfVEVTVF9OT1NUT1AsCQkiVGVzdCBjYW5ub3QgYmUgc3RvcHBlZCIgfSwKKwl7IE5NX05BQ0tfTVNHSU5DT05TSVNUX1BIWVNDRkcsCSJNZXNzYWdlIGluY29uc2lzdGVudCB3aXRoIHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24iIH0sCisJeyBOTV9OQUNLX0ZJTEVfSU5DT01QTEVURSwJIkNvbXBsZXRlIGZpbGUgbm90cmVjZWl2ZWQiIH0sCisJeyBOTV9OQUNLX0ZJTEVfTk9UQVZBSUwsCSJGaWxlIG5vdCBhdmFpbGFibGUgYXQgZGVzdGluYXRpb24iIH0sCisJeyBOTV9OQUNLX0ZJTEVfTk9UQUNUSVZBVEUsCSJGaWxlIGNhbm5vdCBiZSBhY3RpdmF0ZSIgfSwKKwl7IE5NX05BQ0tfUkVRX05PVF9HUkFOVCwJIlJlcXVlc3Qgbm90IGdyYW50ZWQiIH0sCisJeyBOTV9OQUNLX1dBSVQsCQkJIldhaXQiIH0sCisJeyBOTV9OQUNLX05PVEhfUkVQT1JUX0VYSVNULAkiTm90aGluZyByZXBvcnRhYmxlIGV4aXN0aW5nIiB9LAorCXsgTk1fTkFDS19NRUFTX05PVFNVUFAsCQkiTWVhc3VyZW1lbnQgbm90IHN1cHBvcnRlZCIgfSwKKwl7IE5NX05BQ0tfTUVBU19OT1RTVEFSVCwJIk1lYXN1cmVtZW50IG5vdCBzdGFydGVkIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbmFja19jYXVzZV9uYW1lKHVfaW50OF90IGNhdXNlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKG5hY2tfY2F1c2VfbmFtZXMsIGNhdXNlKTsKK30KKworLyogQ2hhcHRlciA5LjQuMTY6IEV2ZW50IFR5cGUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGV2ZW50X3R5cGVfbmFtZXNbXSA9IHsKKwl7IE5NX0VWVF9DT01NX0ZBSUwsCQkiY29tbXVuaWNhdGlvbiBmYWlsdXJlIiB9LAorCXsgTk1fRVZUX1FPU19GQUlMLAkJInF1YWxpdHkgb2Ygc2VydmljZSBmYWlsdXJlIiB9LAorCXsgTk1fRVZUX1BST0NfRkFJTCwJCSJwcm9jZXNzaW5nIGZhaWx1cmUiIH0sCisJeyBOTV9FVlRfRVFVSVBfRkFJTCwJCSJlcXVpcG1lbnQgZmFpbHVyZSIgfSwKKwl7IE5NX0VWVF9FTlZfRkFJTCwJCSJlbnZpcm9ubWVudCBmYWlsdXJlIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZXZlbnRfdHlwZV9uYW1lKHVfaW50OF90IGNhdXNlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGV2ZW50X3R5cGVfbmFtZXMsIGNhdXNlKTsKK30KKworLyogQ2hhcHRlciA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgc2V2ZXJpdHlfbmFtZXNbXSA9IHsKKwl7IE5NX1NFVkVSX0NFQVNFRCwJCSJmYWlsdXJlIGNlYXNlZCIgfSwKKwl7IE5NX1NFVkVSX0NSSVRJQ0FMLAkJImNyaXRpY2FsIGZhaWx1cmUiIH0sCisJeyBOTV9TRVZFUl9NQUpPUiwJCSJtYWpvciBmYWlsdXJlIiB9LAorCXsgTk1fU0VWRVJfTUlOT1IsCQkibWlub3IgZmFpbHVyZSIgfSwKKwl7IE5NX1NFVkVSX1dBUk5JTkcsCQkid2FybmluZyBsZXZlbCBmYWlsdXJlIiB9LAorCXsgTk1fU0VWRVJfSU5ERVRFUk1JTkFURSwJImluZGV0ZXJtaW5hdGUgZmFpbHVyZSIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnNldmVyaXR5X25hbWUodV9pbnQ4X3QgY2F1c2UpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoc2V2ZXJpdHlfbmFtZXMsIGNhdXNlKTsKK30KKworLyogQXR0cmlidXRlcyB0aGF0IHRoZSBCU0MgY2FuIHNldCwgbm90IG9ubHkgZ2V0LCBhY2NvcmRpbmcgdG8gU2VjdGlvbiA5LjQgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fYXR0ciBubV9hdHRfc2V0dGFibGVbXSA9IHsKKwlOTV9BVFRfQUREX0lORk8sCisJTk1fQVRUX0FERF9URVhULAorCU5NX0FUVF9ERVNULAorCU5NX0FUVF9FVkVOVF9UWVBFLAorCU5NX0FUVF9GSUxFX0RBVEEsCisJTk1fQVRUX0dFVF9BUkksCisJTk1fQVRUX0hXX0NPTkZfQ0hHLAorCU5NX0FUVF9MSVNUX1JFUV9BVFRSLAorCU5NX0FUVF9NRFJPUF9MSU5LLAorCU5NX0FUVF9NRFJPUF9ORVhULAorCU5NX0FUVF9OQUNLX0NBVVNFUywKKwlOTV9BVFRfT1VUU1RfQUxBUk0sCisJTk1fQVRUX1BIWVNfQ09ORiwKKwlOTV9BVFRfUFJPQl9DQVVTRSwKKwlOTV9BVFRfUkFEX1NVQkMsCisJTk1fQVRUX1NPVVJDRSwKKwlOTV9BVFRfU1BFQ19QUk9CLAorCU5NX0FUVF9TVEFSVF9USU1FLAorCU5NX0FUVF9URVNUX0RVUiwKKwlOTV9BVFRfVEVTVF9OTywKKwlOTV9BVFRfVEVTVF9SRVBPUlQsCisJTk1fQVRUX1dJTkRPV19TSVpFLAorCU5NX0FUVF9TRVZFUklUWSwKKwlOTV9BVFRfTUVBU19SRVMsCisJTk1fQVRUX01FQVNfVFlQRSwKK307CisKK2NvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmID0geworCS5kZWYgPSB7CisJCVtOTV9BVFRfQUJJU19DSEFOTkVMXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisJCVtOTV9BVFRfQUREX0lORk9dID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9BRERfVEVYVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0FETV9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0FSRkNOX0xJU1RdPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0FVVE9OX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0FWQUlMX1NUQVRVU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0JDQ0hfQVJGQ05dID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9CU0lDXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0JUU19BSVJfVElNRVJdID0JeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NDQ0hfTF9JX1BdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9DQ0NIX0xfVF0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NIQU5fQ09NQl0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NPTk5fRkFJTF9DUklUXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9ERVNUXSA9CQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0VWRU5UX1RZUEVdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9GSUxFX0RBVEFdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9GSUxFX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfRklMRV9WRVJTSU9OXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfR1NNX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9IU05dID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfSFdfQ09ORklHXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfSFdfREVTQ10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0lOVEFWRV9QQVJBTV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0lOVEVSRl9CT1VORF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorCQlbTk1fQVRUX0xJU1RfUkVRX0FUVFJdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX01BSU9dID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfTUFOVUZfU1RBVEVdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9NQU5VRl9USFJFU0hdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9NQU5VRl9JRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX01BWF9UQV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX01EUk9QX0xJTktdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9NRFJPUF9ORVhUXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfTkFDS19DQVVTRVNdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9OWTFdID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfT1BFUl9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX09WRVJMX1BFUklPRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1BIWVNfQ09ORl0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1BPV0VSX0NMQVNTXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfUE9XRVJfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisJCVtOTV9BVFRfUFJPQl9DQVVTRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorCQlbTk1fQVRUX1JBQ0hfQl9USFJFU0hdID0JeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0xEQVZHX1NMT1RTXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfUkFEX1NVQkNdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9SRl9NQVhQT1dSX1JdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9TSVRFX0lOUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NJVEVfT1VUUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NPVVJDRV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NQRUNfUFJPQl0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1NUQVJUX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9UMjAwXSA9CQkJeyBUTFZfVFlQRV9GSVhFRCwgNyB9LAorCQlbTk1fQVRUX1RFSV0gPQkJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9URVNUX0RVUl0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX1RFU1RfTk9dID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9URVNUX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1ZTV1JfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfV0lORE9XX1NJWkVdID0gCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfVFNDXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1NXX0NPTkZJR10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NFVkVSSVRZXSA9IAkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0dFVF9BUkldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9IV19DT05GX0NIR10gPSAJCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9PVVRTVF9BTEFSTV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX01FQVNfUkVTXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fY2hhbl9jb21iIGNoY29tYjRwY2hhbltdID0geworCVtHU01fUENIQU5fQ0NDSF0JPSBOTV9DSEFOQ19tYWluQkNDSCwKKwlbR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0XQk9IE5NX0NIQU5DX0JDQ0hDb21iLAorCVtHU01fUENIQU5fVENIX0ZdCT0gTk1fQ0hBTkNfVENIRnVsbCwKKwlbR1NNX1BDSEFOX1RDSF9IXQk9IE5NX0NIQU5DX1RDSEhhbGYsCisJW0dTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4Q10gPSBOTV9DSEFOQ19TRENDSCwKKwlbR1NNX1BDSEFOX1BEQ0hdCT0gTk1fQ0hBTkNfSVBBQ19QRENILAorCVtHU01fUENIQU5fVENIX0ZfUERDSF0JPSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfUERDSCwKKwkvKiBGSVhNRTogYm91bmRzIGNoZWNrICovCit9OworCitpbnQgYWJpc19ubV9jaGNvbWI0cGNoYW4oZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlpZiAocGNoYW4gPCBBUlJBWV9TSVpFKGNoY29tYjRwY2hhbikpCisJCXJldHVybiBjaGNvbWI0cGNoYW5bcGNoYW5dOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBhYmlzX25tX3Rsdl9wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqdHAsIHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IHVfaW50OF90ICpidWYsIGludCBsZW4pCit7CisJaWYgKCFidHMtPm1vZGVsKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gdGx2X3BhcnNlKHRwLCAmYnRzLT5tb2RlbC0+bm1fYXR0X3RsdmRlZiwgYnVmLCBsZW4sIDAsIDApOworfQorCitzdGF0aWMgaW50IGlzX2luX2FycihlbnVtIGFiaXNfbm1fbXNndHlwZSBtdCwgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgKmFyciwgaW50IHNpemUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmIChhcnJbaV0gPT0gbXQpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKKy8qIGlzIHRoaXMgbXNndHlwZSB0aGUgdXN1YWwgQUNLL05BQ0sgdHlwZSA/ICovCitzdGF0aWMgaW50IGlzX2Fja19uYWNrKGVudW0gYWJpc19ubV9tc2d0eXBlIG10KQoreworCXJldHVybiAhaXNfaW5fYXJyKG10LCBub19hY2tfbmFjaywgQVJSQVlfU0laRShub19hY2tfbmFjaykpOworfQorI2VuZGlmCisKKy8qIGlzIHRoaXMgbXNndHlwZSBhIHJlcG9ydCA/ICovCitzdGF0aWMgaW50IGlzX3JlcG9ydChlbnVtIGFiaXNfbm1fbXNndHlwZSBtdCkKK3sKKwlyZXR1cm4gaXNfaW5fYXJyKG10LCByZXBvcnRzLCBBUlJBWV9TSVpFKHJlcG9ydHMpKTsKK30KKworI2RlZmluZSBNVF9BQ0soeCkJKHgrMSkKKyNkZWZpbmUgTVRfTkFDSyh4KQkoeCsyKQorCitzdGF0aWMgdm9pZCBmaWxsX29tX2hkcihzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oLCB1X2ludDhfdCBsZW4pCit7CisJb2gtPm1kaXNjID0gQUJJU19PTV9NRElTQ19GT007CisJb2gtPnBsYWNlbWVudCA9IEFCSVNfT01fUExBQ0VNRU5UX09OTFk7CisJb2gtPnNlcXVlbmNlID0gMDsKKwlvaC0+bGVuZ3RoID0gbGVuOworfQorCitzdGF0aWMgdm9pZCBmaWxsX29tX2ZvbV9oZHIoc3RydWN0IGFiaXNfb21faGRyICpvaCwgdV9pbnQ4X3QgbGVuLAorCQkJICAgIHVfaW50OF90IG1zZ190eXBlLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgICAgdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9CisJCQkoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqKSBvaC0+ZGF0YTsKKworCWZpbGxfb21faGRyKG9oLCBsZW4rc2l6ZW9mKCpmb2gpKTsKKwlmb2gtPm1zZ190eXBlID0gbXNnX3R5cGU7CisJZm9oLT5vYmpfY2xhc3MgPSBvYmpfY2xhc3M7CisJZm9oLT5vYmpfaW5zdC5idHNfbnIgPSBidHNfbnI7CisJZm9oLT5vYmpfaW5zdC50cnhfbnIgPSB0cnhfbnI7CisJZm9oLT5vYmpfaW5zdC50c19uciA9IHRzX25yOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKm5tX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbShPTV9BTExPQ19TSVpFLCBPTV9IRUFEUk9PTV9TSVpFLAorCQkJCSAgICJPTUwiKTsKK30KKworLyogU2VuZCBhIE9NTCBOTSBNZXNzYWdlIGZyb20gQlNDIHRvIEJUUyAqLworaW50IGFiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCW1zZy0+dHJ4ID0gYnRzLT5jMDsKKworCXJldHVybiBfYWJpc19ubV9zZW5kbXNnKG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfc3coc3RydWN0IG1zZ2IgKm1iKTsKKworc3RhdGljIHN0cnVjdCB2YWx1ZV9zdHJpbmcgb2JqX2NsYXNzX25hbWVzW10gPSB7CisJeyBOTV9PQ19TSVRFX01BTkFHRVIsCSJTSVRFIE1BTkFHRVIiIH0sCisJeyBOTV9PQ19CVFMsCQkiQlRTIiB9LAorCXsgTk1fT0NfUkFESU9fQ0FSUklFUiwJIlJBRElPIENBUlJJRVIiIH0sCisJeyBOTV9PQ19CQVNFQl9UUkFOU0MsCSJCQVNFQkFORCBUUkFOU0NFSVZFUiIgfSwKKwl7IE5NX09DX0NIQU5ORUwsCSJDSEFOTkVMIiB9LAorCXsgTk1fT0NfQlMxMV9BREpDLAkiQURKQyIgfSwKKwl7IE5NX09DX0JTMTFfSEFORE9WRVIsCSJIQU5ET1ZFUiIgfSwKKwl7IE5NX09DX0JTMTFfUFdSX0NUUkwsCSJQT1dFUiBDT05UUk9MIiB9LAorCXsgTk1fT0NfQlMxMV9CVFNFLAkiQlRTRSIgfSwKKwl7IE5NX09DX0JTMTFfUkFDSywJIlJBQ0siIH0sCisJeyBOTV9PQ19CUzExX1RFU1QsCSJURVNUIiB9LAorCXsgTk1fT0NfQlMxMV9FTlZBQlRTRSwJIkVOVkFCVFNFIiB9LAorCXsgTk1fT0NfQlMxMV9CUE9SVCwJIkJQT1JUIiB9LAorCXsgTk1fT0NfR1BSU19OU0UsCSJHUFJTIE5TRSIgfSwKKwl7IE5NX09DX0dQUlNfQ0VMTCwJIkdQUlMgQ0VMTCIgfSwKKwl7IE5NX09DX0dQUlNfTlNWQywJIkdQUlMgTlNWQyIgfSwKKwl7IE5NX09DX0JTMTEsCQkiU0lFTUVOU0hXIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpvYmpfY2xhc3NfbmFtZSh1X2ludDhfdCBvYykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhvYmpfY2xhc3NfbmFtZXMsIG9jKTsKK30KKworY29uc3QgY2hhciAqbm1fb3BzdGF0ZV9uYW1lKHVfaW50OF90IG9zKQoreworCXN3aXRjaCAob3MpIHsKKwljYXNlIE5NX09QU1RBVEVfRElTQUJMRUQ6CisJCXJldHVybiAiRGlzYWJsZWQiOworCWNhc2UgTk1fT1BTVEFURV9FTkFCTEVEOgorCQlyZXR1cm4gIkVuYWJsZWQiOworCWNhc2UgTk1fT1BTVEFURV9OVUxMOgorCQlyZXR1cm4gIk5VTEwiOworCWRlZmF1bHQ6CisJCXJldHVybiAiUkZVIjsKKwl9Cit9CisKKy8qIENoYXB0ZXIgOS40LjcgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGF2YWlsX25hbWVzW10gPSB7CisJeyAwLCAJIkluIHRlc3QiIH0sCisJeyAxLAkiRmFpbGVkIiB9LAorCXsgMiwJIlBvd2VyIG9mZiIgfSwKKwl7IDMsCSJPZmYgbGluZSIgfSwKKwkvKiBOb3QgdXNlZCAqLworCXsgNSwJIkRlcGVuZGVuY3kiIH0sCisJeyA2LAkiRGVncmFkZWQiIH0sCisJeyA3LAkiTm90IGluc3RhbGxlZCIgfSwKKwl7IDB4ZmYsICJPSyIgfSwKKwl7IDAsCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqbm1fYXZhaWxfbmFtZSh1X2ludDhfdCBhdmFpbCkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhhdmFpbF9uYW1lcywgYXZhaWwpOworfQorCitzdGF0aWMgc3RydWN0IHZhbHVlX3N0cmluZyB0ZXN0X25hbWVzW10gPSB7CisJLyogRklYTUU6IHN0YW5kYXJkIHRlc3QgbmFtZXMgKi8KKwl7IE5NX0lQQUNDX1RFU1ROT19DSEFOX1VTQUdFLCAiQ2hhbm5lbCBVc2FnZSIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0NIQU5fVVNBR0UsICJCQ0NIIENoYW5uZWwgVXNhZ2UiIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fRlJFUV9TWU5DLCAiRnJlcXVlbmN5IFN5bmNocm9uaXphdGlvbiIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0lORk8sICJCQ0NIIEluZm8iIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OLCAiVHJhbnNtaXQgQmVhY29uIiB9LAorCXsgTk1fSVBBQ0NfVEVTVE5PX1NZU0lORk9fTU9OSVRPUiwgIlN5c3RlbSBJbmZvIE1vbml0b3IiIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fQkNDQ0hfTU9OSVRPUiwgIkJDQ0ggTW9uaXRvciIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworY29uc3QgY2hhciAqbm1fYWRtX25hbWUodV9pbnQ4X3QgYWRtKQoreworCXN3aXRjaCAoYWRtKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gIkxvY2tlZCI7CisJY2FzZSAyOgorCQlyZXR1cm4gIlVubG9ja2VkIjsKKwljYXNlIDM6CisJCXJldHVybiAiU2h1dGRvd24iOworCWRlZmF1bHQ6CisJCXJldHVybiAiPG5vdCB1c2VkPiI7CisJfQorfQorCitpbnQgbm1faXNfcnVubmluZyhzdHJ1Y3QgZ3NtX25tX3N0YXRlICpzKSB7CisJcmV0dXJuIChzLT5vcGVyYXRpb25hbCA9PSBOTV9PUFNUQVRFX0VOQUJMRUQpICYmICgKKwkJKHMtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09LKSB8fAorCQkocy0+YXZhaWxhYmlsaXR5ID09IDB4ZmYpCisJKTsKK30KKworc3RhdGljIHZvaWQgZGVidWdwX2ZvaChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2gpCit7CisJREVCVUdQKEROTSwgIk9DPSVzKCUwMngpIElOU1Q9KCUwMngsJTAyeCwlMDJ4KSAiLAorCQlvYmpfY2xhc3NfbmFtZShmb2gtPm9ial9jbGFzcyksIGZvaC0+b2JqX2NsYXNzLAorCQlmb2gtPm9ial9pbnN0LmJ0c19uciwgZm9oLT5vYmpfaW5zdC50cnhfbnIsCisJCWZvaC0+b2JqX2luc3QudHNfbnIpOworfQorCisvKiBvYnRhaW4gdGhlIGdzbV9ubV9zdGF0ZSBkYXRhIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBvYmplY3QgaW5zdGFuY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3NtX25tX3N0YXRlICoKK29iamNsYXNzMm5tc3RhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKm9ial9pbnN0KQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fbm1fc3RhdGUgKm5tX3N0YXRlID0gTlVMTDsKKworCXN3aXRjaCAob2JqX2NsYXNzKSB7CisJY2FzZSBOTV9PQ19CVFM6CisJCW5tX3N0YXRlID0gJmJ0cy0+bm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfUkFESU9fQ0FSUklFUjoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlubV9zdGF0ZSA9ICZ0cngtPm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0JBU0VCX1RSQU5TQzoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlubV9zdGF0ZSA9ICZ0cngtPmJiX3RyYW5zYy5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19DSEFOTkVMOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCURFQlVHUEMoRE5NLCAiVFJYICV1IGRvZXMgbm90IGV4aXN0ICIsIG9ial9pbnN0LT50cnhfbnIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCWlmIChvYmpfaW5zdC0+dHNfbnIgPj0gVFJYX05SX1RTKQorCQkJcmV0dXJuIE5VTEw7CisJCW5tX3N0YXRlID0gJnRyeC0+dHNbb2JqX2luc3QtPnRzX25yXS5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19TSVRFX01BTkFHRVI6CisJCW5tX3N0YXRlID0gJmJ0cy0+c2l0ZV9tZ3Iubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQlMxMToKKwkJc3dpdGNoIChvYmpfaW5zdC0+YnRzX25yKSB7CisJCWNhc2UgQlMxMV9PQkpfQ0NMSzoKKwkJCW5tX3N0YXRlID0gJmJ0cy0+YnMxMS5jY2xrLm5tX3N0YXRlOworCQkJYnJlYWs7CisJCWNhc2UgQlMxMV9PQkpfQkJTSUc6CisJCQlpZiAob2JqX2luc3QtPnRzX25yID4gYnRzLT5udW1fdHJ4KQorCQkJCXJldHVybiBOVUxMOworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCQlubV9zdGF0ZSA9ICZ0cngtPmJzMTEuYmJzaWcubm1fc3RhdGU7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9QQToKKwkJCWlmIChvYmpfaW5zdC0+dHNfbnIgPiBidHMtPm51bV90cngpCisJCQkJcmV0dXJuIE5VTEw7CisJCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCW5tX3N0YXRlID0gJnRyeC0+YnMxMS5wYS5ubV9zdGF0ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwljYXNlIE5NX09DX0JTMTFfUkFDSzoKKwkJbm1fc3RhdGUgPSAmYnRzLT5iczExLnJhY2subm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQlMxMV9FTlZBQlRTRToKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gQVJSQVlfU0laRShidHMtPmJzMTEuZW52YWJ0c2UpKQorCQkJcmV0dXJuIE5VTEw7CisJCW5tX3N0YXRlID0gJmJ0cy0+YnMxMS5lbnZhYnRzZVtvYmpfaW5zdC0+dHJ4X25yXS5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TRToKKwkJbm1fc3RhdGUgPSAmYnRzLT5ncHJzLm5zZS5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX0NFTEw6CisJCW5tX3N0YXRlID0gJmJ0cy0+Z3Bycy5jZWxsLm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNWQzoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gQVJSQVlfU0laRShidHMtPmdwcnMubnN2YykpCisJCQlyZXR1cm4gTlVMTDsKKwkJbm1fc3RhdGUgPSAmYnRzLT5ncHJzLm5zdmNbb2JqX2luc3QtPnRyeF9ucl0ubm1fc3RhdGU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbm1fc3RhdGU7Cit9CisKKy8qIG9idGFpbiB0aGUgaW4tbWVtb3J5IGRhdGEgc3RydWN0dXJlIG9mIGEgZ2l2ZW4gb2JqZWN0IGluc3RhbmNlICovCitzdGF0aWMgdm9pZCAqCitvYmpjbGFzczJvYmooc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCSAgICAgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKm9ial9pbnN0KQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXZvaWQgKm9iaiA9IE5VTEw7CisKKwlzd2l0Y2ggKG9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQlRTOgorCQlvYmogPSBidHM7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfUkFESU9fQ0FSUklFUjoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlvYmogPSB0cng7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQkFTRUJfVFJBTlNDOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCURFQlVHUEMoRE5NLCAiVFJYICV1IGRvZXMgbm90IGV4aXN0ICIsIG9ial9pbnN0LT50cnhfbnIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCW9iaiA9ICZ0cngtPmJiX3RyYW5zYzsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19DSEFOTkVMOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCURFQlVHUEMoRE5NLCAiVFJYICV1IGRvZXMgbm90IGV4aXN0ICIsIG9ial9pbnN0LT50cnhfbnIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCWlmIChvYmpfaW5zdC0+dHNfbnIgPj0gVFJYX05SX1RTKQorCQkJcmV0dXJuIE5VTEw7CisJCW9iaiA9ICZ0cngtPnRzW29ial9pbnN0LT50c19ucl07CisJCWJyZWFrOworCWNhc2UgTk1fT0NfU0lURV9NQU5BR0VSOgorCQlvYmogPSAmYnRzLT5zaXRlX21ncjsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TRToKKwkJb2JqID0gJmJ0cy0+Z3Bycy5uc2U7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19DRUxMOgorCQlvYmogPSAmYnRzLT5ncHJzLmNlbGw7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19OU1ZDOgorCQlpZiAob2JqX2luc3QtPnRyeF9uciA+PSBBUlJBWV9TSVpFKGJ0cy0+Z3Bycy5uc3ZjKSkKKwkJCXJldHVybiBOVUxMOworCQlvYmogPSAmYnRzLT5ncHJzLm5zdmNbb2JqX2luc3QtPnRyeF9ucl07CisJCWJyZWFrOworCX0KKwlyZXR1cm4gb2JqOworfQorCisvKiBVcGRhdGUgdGhlIGFkbWluaXN0cmF0aXZlIHN0YXRlIG9mIGEgZ2l2ZW4gb2JqZWN0IGluIG91ciBpbi1tZW1vcnkgZGF0YQorICogc3RydWN0dXJlcyBhbmQgc2VuZCBhbiBldmVudCB0byB0aGUgaGlnaGVyIGxheWVyICovCitzdGF0aWMgaW50IHVwZGF0ZV9hZG1zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgICBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqb2JqX2luc3QsIHVfaW50OF90IGFkbV9zdGF0ZSkKK3sKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlICpubV9zdGF0ZSwgbmV3X3N0YXRlOworCXZvaWQgKm9iajsKKwlpbnQgcmM7CisKKwlvYmogPSBvYmpjbGFzczJvYmooYnRzLCBvYmpfY2xhc3MsIG9ial9pbnN0KTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbm1fc3RhdGUgPSBvYmpjbGFzczJubXN0YXRlKGJ0cywgb2JqX2NsYXNzLCBvYmpfaW5zdCk7CisJaWYgKCFubV9zdGF0ZSkKKwkJcmV0dXJuIC0xOworCisJbmV3X3N0YXRlID0gKm5tX3N0YXRlOworCW5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSA9IGFkbV9zdGF0ZTsKKworCXJjID0gbm1fc3RhdGVfZXZlbnQoRVZUX1NUQVRFQ0hHX0FETSwgb2JqX2NsYXNzLCBvYmosIG5tX3N0YXRlLCAmbmV3X3N0YXRlKTsKKworCW5tX3N0YXRlLT5hZG1pbmlzdHJhdGl2ZSA9IGFkbV9zdGF0ZTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhYmlzX25tX3J4X3N0YXRlY2hnX3JlcChzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobWIpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtYi0+dHJ4LT5idHM7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSAqbm1fc3RhdGUsIG5ld19zdGF0ZTsKKwlpbnQgcmM7CisKKwlERUJVR1BDKEROTSwgIlNUQVRFIENIRzogIik7CisKKwltZW1zZXQoJm5ld19zdGF0ZSwgMCwgc2l6ZW9mKG5ld19zdGF0ZSkpOworCisJbm1fc3RhdGUgPSBvYmpjbGFzczJubXN0YXRlKGJ0cywgZm9oLT5vYmpfY2xhc3MsICZmb2gtPm9ial9pbnN0KTsKKwlpZiAoIW5tX3N0YXRlKSB7CisJCURFQlVHUEMoRE5NLCAidW5rbm93biBvYmplY3QgY2xhc3NcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwluZXdfc3RhdGUgPSAqbm1fc3RhdGU7CisJCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBidHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfT1BFUl9TVEFURSkpIHsKKwkJbmV3X3N0YXRlLm9wZXJhdGlvbmFsID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX09QRVJfU1RBVEUpOworCQlERUJVR1BDKEROTSwgIk9QX1NUQVRFPSVzICIsIG5tX29wc3RhdGVfbmFtZShuZXdfc3RhdGUub3BlcmF0aW9uYWwpKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9BVkFJTF9TVEFUVVMpKSB7CisJCWlmIChUTFZQX0xFTigmdHAsIE5NX0FUVF9BVkFJTF9TVEFUVVMpID09IDApCisJCQluZXdfc3RhdGUuYXZhaWxhYmlsaXR5ID0gMHhmZjsKKwkJZWxzZQorCQkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9BVkFJTF9TVEFUVVMpOworCQlERUJVR1BDKEROTSwgIkFWQUlMPSVzKCUwMngpICIsIG5tX2F2YWlsX25hbWUobmV3X3N0YXRlLmF2YWlsYWJpbGl0eSksCisJCQluZXdfc3RhdGUuYXZhaWxhYmlsaXR5KTsKKwl9IGVsc2UKKwkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSA9IDB4ZmY7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9BRE1fU1RBVEUpKSB7CisJCW5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9BRE1fU1RBVEUpOworCQlERUJVR1BDKEROTSwgIkFETT0lMnMgIiwgbm1fYWRtX25hbWUobmV3X3N0YXRlLmFkbWluaXN0cmF0aXZlKSk7CisJfQorCURFQlVHUEMoRE5NLCAiXG4iKTsKKworCWlmICgobmV3X3N0YXRlLmFkbWluaXN0cmF0aXZlICE9IDAgJiYgbm1fc3RhdGUtPmFkbWluaXN0cmF0aXZlID09IDApIHx8CisJICAgIG5ld19zdGF0ZS5vcGVyYXRpb25hbCAhPSBubV9zdGF0ZS0+b3BlcmF0aW9uYWwgfHwKKwkgICAgbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSAhPSBubV9zdGF0ZS0+YXZhaWxhYmlsaXR5KSB7CisJCS8qIFVwZGF0ZSB0aGUgb3BlcmF0aW9uYWwgc3RhdGUgb2YgYSBnaXZlbiBvYmplY3QgaW4gb3VyIGluLW1lbW9yeSBkYXRhCisgCQkqIHN0cnVjdHVyZXMgYW5kIHNlbmQgYW4gZXZlbnQgdG8gdGhlIGhpZ2hlciBsYXllciAqLworCQl2b2lkICpvYmogPSBvYmpjbGFzczJvYmooYnRzLCBmb2gtPm9ial9jbGFzcywgJmZvaC0+b2JqX2luc3QpOworCQlyYyA9IG5tX3N0YXRlX2V2ZW50KEVWVF9TVEFURUNIR19PUEVSLCBmb2gtPm9ial9jbGFzcywgb2JqLCBubV9zdGF0ZSwgJm5ld19zdGF0ZSk7CisJCW5tX3N0YXRlLT5vcGVyYXRpb25hbCA9IG5ld19zdGF0ZS5vcGVyYXRpb25hbDsKKwkJbm1fc3RhdGUtPmF2YWlsYWJpbGl0eSA9IG5ld19zdGF0ZS5hdmFpbGFiaWxpdHk7CisJCWlmIChubV9zdGF0ZS0+YWRtaW5pc3RyYXRpdmUgPT0gMCkKKwkJCW5tX3N0YXRlLT5hZG1pbmlzdHJhdGl2ZSA9IG5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZTsKKwl9CisjaWYgMAorCWlmIChvcF9zdGF0ZSA9PSAxKSB7CisJCS8qIHRyeSB0byBlbmFibGUgb2JqZWN0cyB0aGF0IGFyZSBkaXNhYmxlZCAqLworCQlhYmlzX25tX29wc3RhcnQoYnRzLCBmb2gtPm9ial9jbGFzcywKKwkJCQlmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCQlmb2gtPm9ial9pbnN0LnRyeF9uciwKKwkJCQlmb2gtPm9ial9pbnN0LnRzX25yKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByeF9mYWlsX2V2dF9yZXAoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCURFQlVHUEMoRE5NLCAiRmFpbHVyZSBFdmVudCBSZXBvcnQgIik7CisJCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9FVkVOVF9UWVBFKSkKKwkJREVCVUdQQyhETk0sICJUeXBlPSVzICIsIGV2ZW50X3R5cGVfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfRVZFTlRfVFlQRSkpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX1NFVkVSSVRZKSkKKwkJREVCVUdQQyhETk0sICJTZXZlcml0eT0lcyAiLCBzZXZlcml0eV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9TRVZFUklUWSkpKTsKKworCURFQlVHUEMoRE5NLCAiXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcmN2bXNnX3JlcG9ydChzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJdV9pbnQ4X3QgbXQgPSBmb2gtPm1zZ190eXBlOworCisJZGVidWdwX2ZvaChmb2gpOworCisJLy9ubWgtPmNmZy0+cmVwb3J0X2NiKG1iLCBmb2gpOworCisJc3dpdGNoIChtdCkgeworCWNhc2UgTk1fTVRfU1RBVEVDSEdfRVZFTlRfUkVQOgorCQlyZXR1cm4gYWJpc19ubV9yeF9zdGF0ZWNoZ19yZXAobWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX1NXX0FDVElWQVRFRF9SRVA6CisJCURFQlVHUEMoRE5NLCAiU29mdHdhcmUgQWN0aXZhdGVkIFJlcG9ydFxuIik7CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9TV19BQ1RJVl9SRVAsIG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9GQUlMVVJFX0VWRU5UX1JFUDoKKwkJcnhfZmFpbF9ldnRfcmVwKG1iKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0ZBSUxfUkVQLCBtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfVEVTVF9SRVA6CisJCURFQlVHUEMoRE5NLCAiVGVzdCBSZXBvcnRcbiIpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fVEVTVF9SRVAsIG1iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQQyhETk0sICJyZXBvcnRpbmcgTk0gTVQgMHglMDJ4XG4iLCBtdCk7CisJCWJyZWFrOworCQkKKwl9OworCisJcmV0dXJuIDA7Cit9CisKKy8qIEFjdGl2YXRlIHRoZSBzcGVjaWZpZWQgc29mdHdhcmUgaW50byB0aGUgQlRTICovCitzdGF0aWMgaW50IGlwYWNjX3N3X2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgaTAsIHVfaW50OF90IGkxLAorCQkJICAgICB1X2ludDhfdCBpMiwgY29uc3QgdV9pbnQ4X3QgKnN3X2Rlc2MsIHVfaW50OF90IHN3ZGVzY19sZW4pCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGxlbiA9IHN3ZGVzY19sZW47CisJdV9pbnQ4X3QgKnRyYWlsZXI7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0FDVElWQVRFX1NXLCBvYmpfY2xhc3MsIGkwLCBpMSwgaTIpOworCisJdHJhaWxlciA9IG1zZ2JfcHV0KG1zZywgc3dkZXNjX2xlbik7CisJbWVtY3B5KHRyYWlsZXIsIHN3X2Rlc2MsIHN3ZGVzY19sZW4pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9wYXJzZV9zd19kZXNjcihjb25zdCB1X2ludDhfdCAqc3dfZGVzY3IsIGludCBzd19kZXNjcl9sZW4pCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBzd19kZXNjcl9kZWYgPSB7CisJCS5kZWYgPSB7CisJCQlbTk1fQVRUX0ZJTEVfSURdID0JCXsgVExWX1RZUEVfVEwxNlYsIH0sCisJCQlbTk1fQVRUX0ZJTEVfVkVSU0lPTl0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgfSwKKwkJfSwKKwl9OworCisJdV9pbnQ4X3QgdGFnOworCXVfaW50MTZfdCB0YWdfbGVuOworCWNvbnN0IHVfaW50OF90ICp2YWw7CisJaW50IG9mcyA9IDAsIGxlbjsKKworCS8qIENsYXNzaWMgVExWIHBhcnNpbmcgZG9lc24ndCB3b3JrIHdlbGwgd2l0aCBTV19ERVNDUiBiZWNhdXNlIG9mIGl0J3MKKwkgKiBuZXN0ZWQgbmF0dXJlIGFuZCB0aGUgZmFjdCB5b3UgaGF2ZSB0byBhc3N1bWUgaXQgY29udGFpbnMgb25seSB0d28gc3ViCisJICogdGFncyBOTV9BVFRfRklMRV9WRVJTSU9OICYgTk1fQVRUX0ZJTEVfSUQgdG8gcGFyc2UgaXQgKi8KKworCWlmIChzd19kZXNjclswXSAhPSBOTV9BVFRfU1dfREVTQ1IpIHsKKwkJREVCVUdQKEROTSwgIlNXX0RFU0NSIGF0dHJpYnV0ZSBpZGVudGlmaWVyIG5vdCBmb3VuZCFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCW9mcyArPSAxOworCisJbGVuID0gdGx2X3BhcnNlX29uZSgmdGFnLCAmdGFnX2xlbiwgJnZhbCwKKwkJJnN3X2Rlc2NyX2RlZiwgJnN3X2Rlc2NyW29mc10sIHN3X2Rlc2NyX2xlbi1vZnMpOworCWlmIChsZW4gPCAwIHx8ICh0YWcgIT0gTk1fQVRUX0ZJTEVfSUQpKSB7CisJCURFQlVHUChETk0sICJGSUxFX0lEIGF0dHJpYnV0ZSBpZGVudGlmaWVyIG5vdCBmb3VuZCFcbiIpOworCQlyZXR1cm4gLTI7CisJfQorCW9mcyArPSBsZW47CisKKwlsZW4gPSB0bHZfcGFyc2Vfb25lKCZ0YWcsICZ0YWdfbGVuLCAmdmFsLAorCQkmc3dfZGVzY3JfZGVmLCAmc3dfZGVzY3Jbb2ZzXSwgc3dfZGVzY3JfbGVuLW9mcyk7CisJaWYgKGxlbiA8IDAgfHwgKHRhZyAhPSBOTV9BVFRfRklMRV9WRVJTSU9OKSkgeworCQlERUJVR1AoRE5NLCAiRklMRV9WRVJTSU9OIGF0dHJpYnV0ZSBpZGVudGlmaWVyIG5vdCBmb3VuZCFcbiIpOworCQlyZXR1cm4gLTM7CisJfQorCW9mcyArPSBsZW47CisKKwlyZXR1cm4gb2ZzOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfc3dfYWN0X3JlcShzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobWIpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCWNvbnN0IHVfaW50OF90ICpzd19jb25maWc7CisJaW50IHJldCwgc3dfY29uZmlnX2xlbiwgc3dfZGVzY3JfbGVuOworCisJZGVidWdwX2ZvaChmb2gpOworCisJREVCVUdQQyhETk0sICJTVyBBY3RpdmF0ZSBSZXF1ZXN0OiAiKTsKKworCURFQlVHUChETk0sICJTb2Z0d2FyZSBBY3RpdmF0ZSBSZXF1ZXN0LCBBQ0tpbmcgYW5kIEFjdGl2YXRpbmdcbiIpOworCisJcmV0ID0gYWJpc19ubV9zd19hY3RfcmVxX2FjayhtYi0+dHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLAorCQkJCSAgICAgIGZvaC0+b2JqX2luc3QuYnRzX25yLAorCQkJCSAgICAgIGZvaC0+b2JqX2luc3QudHJ4X25yLAorCQkJCSAgICAgIGZvaC0+b2JqX2luc3QudHNfbnIsIDAsCisJCQkJICAgICAgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisKKwlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1iLT50cngtPmJ0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJc3dfY29uZmlnID0gVExWUF9WQUwoJnRwLCBOTV9BVFRfU1dfQ09ORklHKTsKKwlzd19jb25maWdfbGVuID0gVExWUF9MRU4oJnRwLCBOTV9BVFRfU1dfQ09ORklHKTsKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9TV19DT05GSUcpKSB7CisJCURFQlVHUChETk0sICJTVyBjb25maWcgbm90IGZvdW5kISBDYW4ndCBjb250aW51ZS5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlERUJVR1AoRE5NLCAiRm91bmQgU1cgY29uZmlnOiAlc1xuIiwgaGV4ZHVtcChzd19jb25maWcsIHN3X2NvbmZpZ19sZW4pKTsKKwl9CisKKwkJLyogVXNlIHRoZSBmaXJzdCBTV19ERVNDUiBwcmVzZW50IGluIFNXIGNvbmZpZyAqLworCXN3X2Rlc2NyX2xlbiA9IGFiaXNfbm1fcGFyc2Vfc3dfZGVzY3Ioc3dfY29uZmlnLCBzd19jb25maWdfbGVuKTsKKwlpZiAoc3dfZGVzY3JfbGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaXBhY2Nfc3dfYWN0aXZhdGUobWItPnRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywKKwkJCQkgZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQkJIGZvaC0+b2JqX2luc3QudHJ4X25yLAorCQkJCSBmb2gtPm9ial9pbnN0LnRzX25yLAorCQkJCSBzd19jb25maWcsIHN3X2Rlc2NyX2xlbik7Cit9CisKKy8qIFJlY2VpdmUgYSBDSEFOR0VfQURNX1NUQVRFX0FDSywgcGFyc2UgdGhlIFRMViBhbmQgdXBkYXRlIGxvY2FsIHN0YXRlICovCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfY2hnX2FkbV9zdGF0ZV9hY2soc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwl1X2ludDhfdCBhZG1fc3RhdGU7CisKKwlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1iLT50cngtPmJ0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQURNX1NUQVRFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZG1fc3RhdGUgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQURNX1NUQVRFKTsKKworCXJldHVybiB1cGRhdGVfYWRtc3RhdGUobWItPnRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywgJmZvaC0+b2JqX2luc3QsIGFkbV9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yeF9sbXRfZXZlbnQoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCURFQlVHUChETk0sICJMTVQgRXZlbnQgIik7CisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTikgJiYKKwkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTikgPj0gMSkgeworCQl1X2ludDhfdCBvbm9mZiA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OKTsKKwkJREVCVUdQQyhETk0sICJMT0clcyAiLCBvbm9mZiA/ICJPTiIgOiAiT0ZGIik7CisJfQorCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWKSAmJgorCSAgICBUTFZQX0xFTigmdHAsIE5NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVYpID49IDEpIHsKKwkJdV9pbnQ4X3QgbGV2ZWwgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWKTsKKwkJREVCVUdQQyhETk0sICJMZXZlbD0ldSAiLCBsZXZlbCk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FKSAmJgorCSAgICBUTFZQX0xFTigmdHAsIE5NX0FUVF9CUzExX0xNVF9VU0VSX05BTUUpID49IDEpIHsKKwkJY2hhciAqbmFtZSA9IChjaGFyICopIFRMVlBfVkFMKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSk7CisJCURFQlVHUEMoRE5NLCAiVXNlcm5hbWU9JXMgIiwgbmFtZSk7CisJfQorCURFQlVHUEMoRE5NLCAiXG4iKTsKKwkvKiBGSVhNRTogcGFyc2UgTE1UIExPR09OIFRJTUUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogUmVjZWl2ZSBhIE9NTCBOTSBNZXNzYWdlIGZyb20gQlRTICovCitzdGF0aWMgaW50IGFiaXNfbm1fcmN2bXNnX2ZvbShzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobWIpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXVfaW50OF90IG10ID0gZm9oLT5tc2dfdHlwZTsKKworCS8qIGNoZWNrIGZvciB1bnNvbGljaXRlZCBtZXNzYWdlICovCisJaWYgKGlzX3JlcG9ydChtdCkpCisJCXJldHVybiBhYmlzX25tX3Jjdm1zZ19yZXBvcnQobWIpOworCisJaWYgKGlzX2luX2FycihtdCwgc3dfbG9hZF9tc2dzLCBBUlJBWV9TSVpFKHN3X2xvYWRfbXNncykpKQorCQlyZXR1cm4gYWJpc19ubV9yY3Ztc2dfc3cobWIpOworCisJaWYgKGlzX2luX2FycihtdCwgbmFja3MsIEFSUkFZX1NJWkUobmFja3MpKSkgeworCQlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCQlkZWJ1Z3BfZm9oKGZvaCk7CisKKwkJREVCVUdQQyhETk0sICIlcyBOQUNLICIsIGdldF92YWx1ZV9zdHJpbmcobmFja19uYW1lcywgbXQpKTsKKworCQlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1iLT50cngtPmJ0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJREVCVUdQQyhETk0sICJDQVVTRT0lc1xuIiwKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlERUJVR1BDKEROTSwgIlxuIik7CisKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX05BQ0ssICh2b2lkKikgJm10KTsKKwkJcmV0dXJuIDA7CisJfQorI2lmIDAKKwkvKiBjaGVjayBpZiBsYXN0IG1lc3NhZ2UgaXMgdG8gYmUgYWNrZWQgKi8KKwlpZiAoaXNfYWNrX25hY2sobm1oLT5sYXN0X21zZ3R5cGUpKSB7CisJCWlmIChtdCA9PSBNVF9BQ0sobm1oLT5sYXN0X21zZ3R5cGUpKSB7CisJCQlERUJVR1AoRE5NLCAicmVjZWl2ZWQgQUNLICgweCV4KVxuIiwgZm9oLT5tc2dfdHlwZSk7CisJCQkvKiB3ZSBnb3Qgb3VyIEFDSywgY29udGludWUgc2VuZGluZyB0aGUgbmV4dCBtc2cgKi8KKwkJfSBlbHNlIGlmIChtdCA9PSBNVF9OQUNLKG5taC0+bGFzdF9tc2d0eXBlKSkgeworCQkJLyogd2UgZ290IGEgTkFDSywgc2lnbmFsIHRoaXMgdG8gdGhlIGNhbGxlciAqLworCQkJREVCVUdQKEROTSwgInJlY2VpdmVkIE5BQ0sgKDB4JXgpXG4iLCBmb2gtPm1zZ190eXBlKTsKKwkJCS8qIEZJWE1FOiBzb21laG93IHNpZ25hbCB0aGlzIHRvIHRoZSBjYWxsZXIgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIHJlYWxseSBzdHJhbmdlIHRoaW5ncyBoYXBwZW4gKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorI2VuZGlmCisKKwlzd2l0Y2ggKG10KSB7CisJY2FzZSBOTV9NVF9DSEdfQURNX1NUQVRFX0FDSzoKKwkJcmV0dXJuIGFiaXNfbm1fcnhfY2hnX2FkbV9zdGF0ZV9hY2sobWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX1NXX0FDVF9SRVE6CisJCXJldHVybiBhYmlzX25tX3J4X3N3X2FjdF9yZXEobWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0JTMTFfTE1UX1NFU1NJT046CisJCXJldHVybiBhYmlzX25tX3J4X2xtdF9ldmVudChtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQ09OTl9NRFJPUF9MSU5LX0FDSzoKKwkJREVCVUdQKEROTSwgIkNPTk4gTURST1AgTElOSyBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1JFU1RBUlRfQUNLOgorCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fSVBBQ0NfUkVTVEFSVF9BQ0ssIE5VTEwpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1JFU1RBUlRfTkFDSzoKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX1JFU1RBUlRfTkFDSywgTlVMTCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfaXBhY2Moc3RydWN0IG1zZ2IgKm1iKTsKKworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19tYW51ZihzdHJ1Y3QgbXNnYiAqbWIpCit7CisJaW50IHJjOworCWludCBidHNfdHlwZSA9IG1iLT50cngtPmJ0cy0+dHlwZTsKKworCXN3aXRjaCAoYnRzX3R5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlyYyA9IGFiaXNfbm1fcnhfaXBhY2MobWIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgImRvbid0IGtub3cgaG93IHRvIHBhcnNlIE9NTCBmb3IgdGhpcyAiCisJCSAgICAgIkJUUyB0eXBlICgldSlcbiIsIGJ0c190eXBlKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIEhpZ2gtTGV2ZWwgQVBJICovCisvKiBFbnRyeS1wb2ludCB3aGVyZSBMMiBPTUwgZnJvbSBCVFMgZW50ZXJzIHRoZSBOTSBjb2RlICovCitpbnQgYWJpc19ubV9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtc2cpOworCWludCByYyA9IDA7CisKKwkvKiBWYXJpb3VzIGNvbnNpc3RlbmN5IGNoZWNrcyAqLworCWlmIChvaC0+cGxhY2VtZW50ICE9IEFCSVNfT01fUExBQ0VNRU5UX09OTFkpIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJBQklTIE9NTCBwbGFjZW1lbnQgMHgleCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJb2gtPnBsYWNlbWVudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAob2gtPnNlcXVlbmNlICE9IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJBQklTIE9NTCBzZXF1ZW5jZSAweCV4ICE9IDB4MDBcbiIsCisJCQlvaC0+c2VxdWVuY2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisjaWYgMAorCXVuc2lnbmVkIGludCBsMl9sZW4gPSBtc2ctPnRhaWwgLSAodV9pbnQ4X3QgKiltc2diX2wyKG1zZyk7CisJdW5zaWduZWQgaW50IGhsZW4gPSBzaXplb2YoKm9oKSArIHNpemVvZihzdHJ1Y3QgYWJpc19vbV9mb21faGRyKTsKKwlpZiAob2gtPmxlbmd0aCArIGhsZW4gPiBsMl9sZW4pIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJBQklTIE9NTCB0cnVuY2F0ZWQgbWVzc2FnZSAoJXUgPiAldSlcbiIsCisJCQlvaC0+bGVuZ3RoICsgc2l6ZW9mKCpvaCksIGwyX2xlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAob2gtPmxlbmd0aCArIGhsZW4gPCBsMl9sZW4pCisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgbWVzc2FnZSB3aXRoIGV4dHJhIHRyYWlsZXI/IT8gKG9oLT5sZW49JWQsIHNpemVvZl9vaD0lZCBsMl9sZW49JWRcbiIsIG9oLT5sZW5ndGgsIHNpemVvZigqb2gpLCBsMl9sZW4pOworI2VuZGlmCisJbXNnLT5sM2ggPSAodW5zaWduZWQgY2hhciAqKW9oICsgc2l6ZW9mKCpvaCk7CisKKwlzd2l0Y2ggKG9oLT5tZGlzYykgeworCWNhc2UgQUJJU19PTV9NRElTQ19GT006CisJCXJjID0gYWJpc19ubV9yY3Ztc2dfZm9tKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQUJJU19PTV9NRElTQ19NQU5VRjoKKwkJcmMgPSBhYmlzX25tX3Jjdm1zZ19tYW51Zihtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfT01fTURJU0NfTU1JOgorCWNhc2UgQUJJU19PTV9NRElTQ19UUkFVOgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgInVuaW1wbGVtZW50ZWQgQUJJUyBPTUwgbWVzc2FnZSBkaXNjcmltaW5hdG9yIDB4JXhcbiIsCisJCQlvaC0+bWRpc2MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgInVua25vd24gQUJJUyBPTUwgbWVzc2FnZSBkaXNjcmltaW5hdG9yIDB4JXhcbiIsCisJCQlvaC0+bWRpc2MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2diX2ZyZWUobXNnKTsKKwlyZXR1cm4gcmM7Cit9CisKKyNpZiAwCisvKiBpbml0aWFsaXplZCBhbGwgcmVzb3VyY2VzICovCitzdHJ1Y3QgYWJpc19ubV9oICphYmlzX25tX2luaXQoc3RydWN0IGFiaXNfbm1fY2ZnICpjZmcpCit7CisJc3RydWN0IGFiaXNfbm1faCAqbm1oOworCisJbm1oID0gbWFsbG9jKHNpemVvZigqbm1oKSk7CisJaWYgKCFubWgpCisJCXJldHVybiBOVUxMOworCisJbm1oLT5jZmcgPSBjZmc7CisKKwlyZXR1cm4gbm1oOworfQorCisvKiBmcmVlIGFsbCByZXNvdXJjZXMgKi8KK3ZvaWQgYWJpc19ubV9maW5pKHN0cnVjdCBhYmlzX25tX2ggKm5taCkKK3sKKwlmcmVlKG5taCk7Cit9CisjZW5kaWYKKworLyogSGVyZSB3ZSBhcmUgdHJ5aW5nIHRvIGRlZmluZSBhIGhpZ2gtbGV2ZWwgQVBJIHRoYXQgY2FuIGJlIHVzZWQgYnkKKyAqIHRoZSBhY3R1YWwgQlNDIGltcGxlbWVudGF0aW9uLiAgSG93ZXZlciwgdGhlIGFyY2hpdGVjdHVyZSBpcyBjdXJyZW50bHkKKyAqIHN0aWxsIHVuZGVyIGRlc2lnbi4gIElkZWFsbHkgdGhlIGNhbGxzIHRvIHRoaXMgQVBJIHdvdWxkIGJlIHN5bmNocm9ub3VzLAorICogd2hpbGUgdGhlIHVuZGVybHlpbmcgc3RhY2sgYmVoaW5kIHRoZSBBUGkgcnVucyBpbiBhIHRyYWRpdGlvbmFsIHNlbGVjdAorICogYmFzZWQgc3RhdGUgbWFjaGluZS4KKyAqLworCisvKiA2LjIgU29mdHdhcmUgTG9hZDogKi8KK2VudW0gc3dfc3RhdGUgeworCVNXX1NUQVRFX05PTkUsCisJU1dfU1RBVEVfV0FJVF9JTklUQUNLLAorCVNXX1NUQVRFX1dBSVRfU0VHQUNLLAorCVNXX1NUQVRFX1dBSVRfRU5EQUNLLAorCVNXX1NUQVRFX1dBSVRfQUNUQUNLLAorCVNXX1NUQVRFX0VSUk9SLAorfTsKKworc3RydWN0IGFiaXNfbm1fc3cgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJZ3NtX2NiZm4gKmNiZm47CisJdm9pZCAqY2JfZGF0YTsKKwlpbnQgZm9yY2VkOworCisJLyogdGhpcyB3aWxsIGJlY29tZSBwYXJ0IG9mIHRoZSBTVyBMT0FEIElOSVRJQVRFICovCisJdV9pbnQ4X3Qgb2JqX2NsYXNzOworCXVfaW50OF90IG9ial9pbnN0YW5jZVszXTsKKworCXVfaW50OF90IGZpbGVfaWRbMjU1XTsKKwl1X2ludDhfdCBmaWxlX2lkX2xlbjsKKworCXVfaW50OF90IGZpbGVfdmVyc2lvblsyNTVdOworCXVfaW50OF90IGZpbGVfdmVyc2lvbl9sZW47CisKKwl1X2ludDhfdCB3aW5kb3dfc2l6ZTsKKwl1X2ludDhfdCBzZWdfaW5fd2luZG93OworCisJaW50IGZkOworCUZJTEUgKnN0cmVhbTsKKwllbnVtIHN3X3N0YXRlIHN0YXRlOworCWludCBsYXN0X3NlZzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWJpc19ubV9zdyBnX3N3OworCitzdGF0aWMgdm9pZCBzd19hZGRfZmlsZV9pZF9hbmRfdmVyKHN0cnVjdCBhYmlzX25tX3N3ICpzdywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpZiAoc3ctPmJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfTkFOT0JUUykgeworCQltc2diX3ZfcHV0KG1zZywgTk1fQVRUX1NXX0RFU0NSKTsKKwkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3ctPmZpbGVfaWRfbGVuLCBzdy0+ZmlsZV9pZCk7CisJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3ctPmZpbGVfdmVyc2lvbl9sZW4sCisJCQkgICAgICAgc3ctPmZpbGVfdmVyc2lvbik7CisJfSBlbHNlIGlmIChzdy0+YnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKSB7CisJCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9GSUxFX0lELCBzdy0+ZmlsZV9pZF9sZW4sIHN3LT5maWxlX2lkKTsKKwkJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3ctPmZpbGVfdmVyc2lvbl9sZW4sCisJCQkgICAgIHN3LT5maWxlX3ZlcnNpb24pOworCX0gZWxzZSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiUGxlYXNlIGltcGxlbWVudCB0aGlzIGZvciB0aGUgQlRTLlxuIik7CisJfQorfQorCisvKiA2LjIuMSAvIDguMy4xOiBMb2FkIERhdGEgSW5pdGlhdGUgKi8KK3N0YXRpYyBpbnQgc3dfbG9hZF9pbml0KHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMyoyICsgc3ctPmZpbGVfaWRfbGVuICsgc3ctPmZpbGVfdmVyc2lvbl9sZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0xPQURfSU5JVCwgc3ctPm9ial9jbGFzcywKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMF0sIHN3LT5vYmpfaW5zdGFuY2VbMV0sCisJCQlzdy0+b2JqX2luc3RhbmNlWzJdKTsKKworCXN3X2FkZF9maWxlX2lkX2FuZF92ZXIoc3csIG1zZyk7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfV0lORE9XX1NJWkUsIHN3LT53aW5kb3dfc2l6ZSk7CisJCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhzdy0+YnRzLCBtc2cpOworfQorCitzdGF0aWMgaW50IGlzX2xhc3RfbGluZShGSUxFICpzdHJlYW0pCit7CisJY2hhciBuZXh0X3NlZ19idWZbMjU2XTsKKwlsb25nIHBvczsKKworCS8qIGNoZWNrIGlmIHdlJ3JlIHNlbmRpbmcgdGhlIGxhc3QgbGluZSAqLworCXBvcyA9IGZ0ZWxsKHN0cmVhbSk7CisJaWYgKCFmZ2V0cyhuZXh0X3NlZ19idWYsIHNpemVvZihuZXh0X3NlZ19idWYpLTIsIHN0cmVhbSkpIHsKKwkJZnNlZWsoc3RyZWFtLCBwb3MsIFNFRUtfU0VUKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZnNlZWsoc3RyZWFtLCBwb3MsIFNFRUtfU0VUKTsKKwlyZXR1cm4gMDsKK30KKworLyogNi4yLjIgLyA4LjMuMiBMb2FkIERhdGEgU2VnbWVudCAqLworc3RhdGljIGludCBzd19sb2FkX3NlZ21lbnQoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwljaGFyIHNlZ19idWZbMjU2XTsKKwljaGFyICpsaW5lX2J1ZiA9IHNlZ19idWYrMjsKKwl1bnNpZ25lZCBjaGFyICp0bHY7CisJdV9pbnQ4X3QgbGVuOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCisJc3dpdGNoIChzdy0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJaWYgKGZnZXRzKGxpbmVfYnVmLCBzaXplb2Yoc2VnX2J1ZiktMiwgc3ctPnN0cmVhbSkgPT0gTlVMTCkgeworCQkJcGVycm9yKCJmZ2V0cyByZWFkaW5nIHNlZ21lbnQiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXNlZ19idWZbMF0gPSAweDAwOworCisJCS8qIGNoZWNrIGlmIHdlJ3JlIHNlbmRpbmcgdGhlIGxhc3QgbGluZSAqLworCQlzdy0+bGFzdF9zZWcgPSBpc19sYXN0X2xpbmUoc3ctPnN0cmVhbSk7CisJCWlmIChzdy0+bGFzdF9zZWcpCisJCQlzZWdfYnVmWzFdID0gMDsKKwkJZWxzZQorCQkJc2VnX2J1ZlsxXSA9IDEgKyBzdy0+c2VnX2luX3dpbmRvdysrOworCisJCWxlbiA9IHN0cmxlbihsaW5lX2J1ZikgKyAyOworCQl0bHYgPSBtc2diX3B1dChtc2csIFRMVl9HUk9TU19MRU4obGVuKSk7CisJCXRsdl9wdXQodGx2LCBOTV9BVFRfQlMxMV9GSUxFX0RBVEEsIGxlbiwgKHVfaW50OF90ICopc2VnX2J1Zik7CisJCS8qIEJTMTEgd2FudHMgQ1IgKyBMRiBpbiBleGNlc3Mgb2YgdGhlIFRMViBsZW5ndGggIT8hICovCisJCXRsdlsxXSAtPSAyOworCisJCS8qIHdlIG9ubHkgbm93IGtub3cgdGhlIGV4YWN0IGxlbmd0aCBmb3IgdGhlIE9NIGhkciAqLworCQlsZW4gPSBzdHJsZW4obGluZV9idWYpKzI7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6IHsKKwkJc3RhdGljX2Fzc2VydChzaXplb2Yoc2VnX2J1ZikgPj0gSVBBQ0NfU0VHTUVOVF9TSVpFLCBidWZmZXJfYmlnX2Vub3VnaCk7CisJCWxlbiA9IHJlYWQoc3ctPmZkLCAmc2VnX2J1ZiwgSVBBQ0NfU0VHTUVOVF9TSVpFKTsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCXBlcnJvcigicmVhZCBmYWlsZWQiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGxlbiAhPSBJUEFDQ19TRUdNRU5UX1NJWkUpCisJCQlzdy0+bGFzdF9zZWcgPSAxOworCisJCSsrc3ctPnNlZ19pbl93aW5kb3c7CisJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0lQQUNDX0ZJTEVfREFUQSwgbGVuLCAoY29uc3QgdV9pbnQ4X3QgKikgc2VnX2J1Zik7CisJCWxlbiArPSAzOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJzd19sb2FkX3NlZ21lbnQgbmVlZHMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBCVFMuXG4iKTsKKwkJLyogRklYTUU6IE90aGVyIEJUUyB0eXBlcyAqLworCQlyZXR1cm4gLTE7CisJfQorCisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0xPQURfU0VHLCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhzdy0+YnRzLCBtc2cpOworfQorCisvKiA2LjIuNCAvIDguMy40IExvYWQgRGF0YSBFbmQgKi8KK3N0YXRpYyBpbnQgc3dfbG9hZF9lbmQoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBsZW4gPSAyKjIgKyBzdy0+ZmlsZV9pZF9sZW4gKyBzdy0+ZmlsZV92ZXJzaW9uX2xlbjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfTE9BRF9FTkQsIHN3LT5vYmpfY2xhc3MsCisJCQlzdy0+b2JqX2luc3RhbmNlWzBdLCBzdy0+b2JqX2luc3RhbmNlWzFdLAorCQkJc3ctPm9ial9pbnN0YW5jZVsyXSk7CisKKwlzd19hZGRfZmlsZV9pZF9hbmRfdmVyKHN3LCBtc2cpOworCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworLyogQWN0aXZhdGUgdGhlIHNwZWNpZmllZCBzb2Z0d2FyZSBpbnRvIHRoZSBCVFMgKi8KK3N0YXRpYyBpbnQgc3dfYWN0aXZhdGUoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBsZW4gPSAyKjIgKyBzdy0+ZmlsZV9pZF9sZW4gKyBzdy0+ZmlsZV92ZXJzaW9uX2xlbjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfQUNUSVZBVEVfU1csIHN3LT5vYmpfY2xhc3MsCisJCQlzdy0+b2JqX2luc3RhbmNlWzBdLCBzdy0+b2JqX2luc3RhbmNlWzFdLAorCQkJc3ctPm9ial9pbnN0YW5jZVsyXSk7CisKKwkvKiBGSVhNRTogdGhpcyBpcyBCUzExIHNwZWNpZmljIGZvcm1hdCAqLworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9GSUxFX0lELCBzdy0+ZmlsZV9pZF9sZW4sIHN3LT5maWxlX2lkKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9WRVJTSU9OLCBzdy0+ZmlsZV92ZXJzaW9uX2xlbiwKKwkJICAgICBzdy0+ZmlsZV92ZXJzaW9uKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworc3RydWN0IHNkcF9maXJtd2FyZSB7CisJY2hhciBtYWdpY1s0XTsKKwljaGFyIG1vcmVfbWFnaWNbNF07CisJdW5zaWduZWQgaW50IGhlYWRlcl9sZW5ndGg7CisJdW5zaWduZWQgaW50IGZpbGVfbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBpbnQgcGFyc2Vfc2RwX2hlYWRlcihzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJc3RydWN0IHNkcF9maXJtd2FyZSBmaXJtd2FyZV9oZWFkZXI7CisJaW50IHJjOworCXN0cnVjdCBzdGF0IHN0YXQ7CisKKwlyYyA9IHJlYWQoc3ctPmZkLCAmZmlybXdhcmVfaGVhZGVyLCBzaXplb2YoZmlybXdhcmVfaGVhZGVyKSk7CisJaWYgKHJjICE9IHNpemVvZihmaXJtd2FyZV9oZWFkZXIpKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQ291bGQgbm90IHJlYWQgU0RQIGZpbGUgaGVhZGVyLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc3RybmNtcChmaXJtd2FyZV9oZWFkZXIubWFnaWMsICIgU0RQIiwgNCkgIT0gMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRoZSBtYWdpYyBudW1iZXIxIGlzIHdyb25nLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZmlybXdhcmVfaGVhZGVyLm1vcmVfbWFnaWNbMF0gIT0gMHgxMCB8fAorCSAgICBmaXJtd2FyZV9oZWFkZXIubW9yZV9tYWdpY1sxXSAhPSAweDAyIHx8CisJICAgIGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzJdICE9IDB4MDAgfHwKKwkgICAgZmlybXdhcmVfaGVhZGVyLm1vcmVfbWFnaWNbM10gIT0gMHgwMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRoZSBtb3JlIG1hZ2ljIG51bWJlciBpcyB3cm9uZy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwlpZiAoZnN0YXQoc3ctPmZkLCAmc3RhdCkgPT0gLTEpIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJDb3VsZCBub3Qgc3RhdCB0aGUgZmlsZS5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG50b2hsKGZpcm13YXJlX2hlYWRlci5maWxlX2xlbmd0aCkgIT0gc3RhdC5zdF9zaXplKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVGhlIGZpbGVzaXplcyBkbyBub3QgbWF0Y2guXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGdvIGJhY2sgdG8gdGhlIHN0YXJ0IGFzIHdlIGNoZWNrZWQgdGhlIHdob2xlIGZpbGVzaXplLi4gKi8KKwlsc2Vlayhzdy0+ZmQsIDBsLCBTRUVLX1NFVCk7CisJTE9HUChETk0sIExPR0xfTk9USUNFLCAiVGhlIGlwYWNjZXNzIFNEUCBoZWFkZXIgaXMgbm90IGZ1bGx5IHVuZGVyc3Rvb2QuXG4iCisJCQkgICAgICAgIlRoZXJlIG1pZ2h0IGJlIGNoZWNrc3VtcyBpbiB0aGUgZmlsZSB0aGF0IGFyZSBub3RcbiIKKwkJCSAgICAgICAidmVyaWZpZWQgYW5kIGluY29tcGxldGUgZmlybXdhcmUgbWlnaHQgYmUgZmxhc2hlZC5cbiIKKwkJCSAgICAgICAiVGhlcmUgaXMgYWJzb2x1dGVseSBubyBXQVJSQU5UWSB0aGF0IGZsYXNoaW5nIHdpbGxcbiIKKwkJCSAgICAgICAid29yay5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN3X29wZW5fZmlsZShzdHJ1Y3QgYWJpc19ubV9zdyAqc3csIGNvbnN0IGNoYXIgKmZuYW1lKQoreworCWNoYXIgZmlsZV9pZFsxMisxXTsKKwljaGFyIGZpbGVfdmVyc2lvbls4MCsxXTsKKwlpbnQgcmM7CisKKwlzdy0+ZmQgPSBvcGVuKGZuYW1lLCBPX1JET05MWSk7CisJaWYgKHN3LT5mZCA8IDApCisJCXJldHVybiBzdy0+ZmQ7CisKKwlzd2l0Y2ggKHN3LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlzdy0+c3RyZWFtID0gZmRvcGVuKHN3LT5mZCwgInIiKTsKKwkJaWYgKCFzdy0+c3RyZWFtKSB7CisJCQlwZXJyb3IoImZkb3BlbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCS8qIHJlYWQgZmlyc3QgbGluZSBhbmQgcGFyc2UgZmlsZSBJRCBhbmQgVkVSU0lPTiAqLworCQlyYyA9IGZzY2FuZihzdy0+c3RyZWFtLCAiQCgjKSUxMnM6JTgwc1xyXG4iLAorCQkJICAgIGZpbGVfaWQsIGZpbGVfdmVyc2lvbik7CisJCWlmIChyYyAhPSAyKSB7CisJCQlwZXJyb3IoInBhcnNpbmcgaGVhZGVyIGxpbmUgb2Ygc29mdHdhcmUgZmlsZSIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXN0cmNweSgoY2hhciAqKXN3LT5maWxlX2lkLCBmaWxlX2lkKTsKKwkJc3ctPmZpbGVfaWRfbGVuID0gc3RybGVuKGZpbGVfaWQpOworCQlzdHJjcHkoKGNoYXIgKilzdy0+ZmlsZV92ZXJzaW9uLCBmaWxlX3ZlcnNpb24pOworCQlzdy0+ZmlsZV92ZXJzaW9uX2xlbiA9IHN0cmxlbihmaWxlX3ZlcnNpb24pOworCQkvKiByZXdpbmQgdG8gc3RhcnQgb2YgZmlsZSAqLworCQlyZXdpbmQoc3ctPnN0cmVhbSk7CisJCWJyZWFrOwkKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQkvKiBUT0RPOiBleHRyYWN0IHRoYXQgZnJvbSB0aGUgZmlsZW5hbWUgb3IgY29udGVudCAqLworCQlyYyA9IHBhcnNlX3NkcF9oZWFkZXIoc3cpOworCQlpZiAocmMgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBwYXJzZSB0aGUgaXBhY2Nlc3MgU0RQIGhlYWRlclxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzdHJjcHkoKGNoYXIgKilzdy0+ZmlsZV9pZCwgImlkIik7CisJCXN3LT5maWxlX2lkX2xlbiA9IDM7CisJCXN0cmNweSgoY2hhciAqKXN3LT5maWxlX3ZlcnNpb24sICJ2ZXJzaW9uIik7CisJCXN3LT5maWxlX3ZlcnNpb25fbGVuID0gODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogV2UgZG9uJ3Qga25vdyBob3cgdG8gdHJlYXQgdGhlbSB5ZXQgKi8KKwkJY2xvc2Uoc3ctPmZkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisJCitzdGF0aWMgdm9pZCBzd19jbG9zZV9maWxlKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzd2l0Y2ggKHN3LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlmY2xvc2Uoc3ctPnN0cmVhbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNsb3NlKHN3LT5mZCk7CisJCWJyZWFrOworCX0KK30KKworLyogRmlsbCB0aGUgd2luZG93ICovCitzdGF0aWMgaW50IHN3X2ZpbGxfd2luZG93KHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlpbnQgcmM7CisKKwl3aGlsZSAoc3ctPnNlZ19pbl93aW5kb3cgPCBzdy0+d2luZG93X3NpemUpIHsKKwkJcmMgPSBzd19sb2FkX3NlZ21lbnQoc3cpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQlpZiAoc3ctPmxhc3Rfc2VnKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKiBjYWxsYmFjayBmdW5jdGlvbiBmcm9tIGFiaXNfbm1fcmN2bXNnKCkgaGFuZGxlciAqLworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19zdyhzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJaW50IHJjID0gLTE7CisJc3RydWN0IGFiaXNfbm1fc3cgKnN3ID0gJmdfc3c7CisJZW51bSBzd19zdGF0ZSBvbGRfc3RhdGUgPSBzdy0+c3RhdGU7CisJCisJLy9ERUJVR1AoRE5NLCAic3RhdGUgJXUsIE5NIE1UIDB4JTAyeFxuIiwgc3ctPnN0YXRlLCBmb2gtPm1zZ190eXBlKTsKKworCXN3aXRjaCAoc3ctPnN0YXRlKSB7CisJY2FzZSBTV19TVEFURV9XQUlUX0lOSVRBQ0s6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJCQkvKiBmaWxsIHdpbmRvdyB3aXRoIHNlZ21lbnRzICovCisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfTE9BRF9JTklUX0FDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlyYyA9IHN3X2ZpbGxfd2luZG93KHN3KTsKKwkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfU0VHQUNLOworCQkJYnJlYWs7CisJCWNhc2UgTk1fTVRfTE9BRF9JTklUX05BQ0s6CisJCQlpZiAoc3ctPmZvcmNlZCkgeworCQkJCURFQlVHUChETk0sICJGT1JDRUQ6IElnbm9yaW5nIFNvZnR3YXJlIExvYWQgIgorCQkJCQkiSW5pdCBOQUNLXG4iKTsKKwkJCQlpZiAoc3ctPmNiZm4pCisJCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJCSBOTV9NVF9MT0FEX0lOSVRfQUNLLCBtYiwKKwkJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQkJcmMgPSBzd19maWxsX3dpbmRvdyhzdyk7CisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9TRUdBQ0s7CisJCQl9IGVsc2UgeworCQkJCURFQlVHUChETk0sICJTb2Z0d2FyZSBMb2FkIEluaXQgTkFDS1xuIik7CisJCQkJLyogRklYTUU6IGNhdXNlICovCisJCQkJaWYgKHN3LT5jYmZuKQorCQkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCQkgTk1fTVRfTE9BRF9JTklUX05BQ0ssIG1iLAorCQkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9FUlJPUjsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgU1dfU1RBVEVfV0FJVF9TRUdBQ0s6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9MT0FEX1NFR19BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJc3ctPnNlZ19pbl93aW5kb3cgPSAwOworCQkJaWYgKCFzdy0+bGFzdF9zZWcpIHsKKwkJCQkvKiBmaWxsIHdpbmRvdyB3aXRoIG1vcmUgc2VnbWVudHMgKi8KKwkJCQlyYyA9IHN3X2ZpbGxfd2luZG93KHN3KTsKKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX1NFR0FDSzsKKwkJCX0gZWxzZSB7CisJCQkJLyogZW5kIHRoZSB0cmFuc2ZlciAqLworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfRU5EQUNLOworCQkJCXJjID0gc3dfbG9hZF9lbmQoc3cpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTk1fTVRfTE9BRF9BQk9SVDoKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9MT0FEX0FCT1JULCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgU1dfU1RBVEVfV0FJVF9FTkRBQ0s6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJCXN3X2Nsb3NlX2ZpbGUoc3cpOworCQkJREVCVUdQKEROTSwgIlNvZnR3YXJlIExvYWQgRW5kIChCVFMgJXUpXG4iLAorCQkJCXN3LT5idHMtPm5yKTsKKwkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfTE9BRF9FTkRfQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJCQlpZiAoc3ctPmZvcmNlZCkgeworCQkJCURFQlVHUChETk0sICJGT1JDRUQ6IElnbm9yaW5nIFNvZnR3YXJlIExvYWQiCisJCQkJCSJFbmQgTkFDS1xuIik7CisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJCQlpZiAoc3ctPmNiZm4pCisJCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJCSBOTV9NVF9MT0FEX0VORF9BQ0ssIG1iLAorCQkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUdQKEROTSwgIlNvZnR3YXJlIExvYWQgRW5kIE5BQ0tcbiIpOworCQkJCS8qIEZJWE1FOiBjYXVzZSAqLworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX0VSUk9SOworCQkJCWlmIChzdy0+Y2JmbikKKwkJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkJIE5NX01UX0xPQURfRU5EX05BQ0ssIG1iLAorCQkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJY2FzZSBTV19TVEFURV9XQUlUX0FDVEFDSzoKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCQkJLyogd2UncmUgZG9uZSAqLworCQkJREVCVUdQKEROTSwgIkFjdGl2YXRlIFNvZnR3YXJlIERPTkUhXG4iKTsKKwkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCQlyYyA9IDA7CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfQUNUSVZBVEVfU1dfQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJCQlERUJVR1AoRE5NLCAiQWN0aXZhdGUgU29mdHdhcmUgTkFDS1xuIik7CisJCQkvKiBGSVhNRTogY2F1c2UgKi8KKwkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX0VSUk9SOworCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0FDVElWQVRFX1NXX05BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIFNXX1NUQVRFX05PTkU6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0FDVElWQVRFX1NXX0FDSzoKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgU1dfU1RBVEVfRVJST1I6CisJCWJyZWFrOworCX0KKworCWlmIChyYykKKwkJREVCVUdQKEROTSwgInVuZXhwZWN0ZWQgTk0gTVQgMHglMDJ4IGluIHN0YXRlICV1IC0+ICV1XG4iLAorCQkJZm9oLT5tc2dfdHlwZSwgb2xkX3N0YXRlLCBzdy0+c3RhdGUpOworCisJcmV0dXJuIHJjOworfQorCisvKiBMb2FkIHRoZSBzcGVjaWZpZWQgc29mdHdhcmUgaW50byB0aGUgQlRTICovCitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICB1X2ludDhfdCB3aW5fc2l6ZSwgaW50IGZvcmNlZCwKKwkJCSAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGFiaXNfbm1fc3cgKnN3ID0gJmdfc3c7CisJaW50IHJjOworCisJREVCVUdQKEROTSwgIlNvZnR3YXJlIExvYWQgKEJUUyAldSwgRmlsZSBcIiVzXCIpXG4iLAorCQlidHMtPm5yLCBmbmFtZSk7CisKKwlpZiAoc3ctPnN0YXRlICE9IFNXX1NUQVRFX05PTkUpCisJCXJldHVybiAtRUJVU1k7CisKKwlzdy0+YnRzID0gYnRzOworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlzdy0+b2JqX2NsYXNzID0gTk1fT0NfU0lURV9NQU5BR0VSOworCQlzdy0+b2JqX2luc3RhbmNlWzBdID0gMHhmZjsKKwkJc3ctPm9ial9pbnN0YW5jZVsxXSA9IDB4ZmY7CisJCXN3LT5vYmpfaW5zdGFuY2VbMl0gPSAweGZmOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlzdy0+b2JqX2NsYXNzID0gTk1fT0NfQkFTRUJfVFJBTlNDOworCQlzdy0+b2JqX2luc3RhbmNlWzBdID0gMHgwMDsKKwkJc3ctPm9ial9pbnN0YW5jZVsxXSA9IDB4MDA7CisJCXN3LT5vYmpfaW5zdGFuY2VbMl0gPSAweGZmOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9VTktOT1dOOgorCWRlZmF1bHQ6CisJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlNvZnR3YXJlIExvYWQgbm90IHByb3Blcmx5IGltcGxlbWVudGVkLlxuIik7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJfQorCXN3LT53aW5kb3dfc2l6ZSA9IHdpbl9zaXplOworCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfSU5JVEFDSzsKKwlzdy0+Y2JmbiA9IGNiZm47CisJc3ctPmNiX2RhdGEgPSBjYl9kYXRhOworCXN3LT5mb3JjZWQgPSBmb3JjZWQ7CisKKwlyYyA9IHN3X29wZW5fZmlsZShzdywgZm5hbWUpOworCWlmIChyYyA8IDApIHsKKwkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiBzd19sb2FkX2luaXQoc3cpOworfQorCitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkX3N0YXR1cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX25tX3N3ICpzdyA9ICZnX3N3OworCXN0cnVjdCBzdGF0IHN0OworCWludCByYywgcGVyY2VudDsKKworCXJjID0gZnN0YXQoc3ctPmZkLCAmc3QpOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJFUlJPUiBkdXJpbmcgc3RhdCIpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKHN3LT5zdHJlYW0pCisJCXBlcmNlbnQgPSAoZnRlbGwoc3ctPnN0cmVhbSkgKiAxMDApIC8gc3Quc3Rfc2l6ZTsKKwllbHNlCisJCXBlcmNlbnQgPSAobHNlZWsoc3ctPmZkLCAwLCBTRUVLX0NVUikgKiAxMDApIC8gc3Quc3Rfc2l6ZTsKKwlyZXR1cm4gcGVyY2VudDsKK30KKworLyogQWN0aXZhdGUgdGhlIHNwZWNpZmllZCBzb2Z0d2FyZSBpbnRvIHRoZSBCVFMgKi8KK2ludCBhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICAgICAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGFiaXNfbm1fc3cgKnN3ID0gJmdfc3c7CisJaW50IHJjOworCisJREVCVUdQKEROTSwgIkFjdGl2YXRpbmcgU29mdHdhcmUgKEJUUyAldSwgRmlsZSBcIiVzXCIpXG4iLAorCQlidHMtPm5yLCBmbmFtZSk7CisKKwlpZiAoc3ctPnN0YXRlICE9IFNXX1NUQVRFX05PTkUpCisJCXJldHVybiAtRUJVU1k7CisKKwlzdy0+YnRzID0gYnRzOworCXN3LT5vYmpfY2xhc3MgPSBOTV9PQ19TSVRFX01BTkFHRVI7CisJc3ctPm9ial9pbnN0YW5jZVswXSA9IDB4ZmY7CisJc3ctPm9ial9pbnN0YW5jZVsxXSA9IDB4ZmY7CisJc3ctPm9ial9pbnN0YW5jZVsyXSA9IDB4ZmY7CisJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9BQ1RBQ0s7CisJc3ctPmNiZm4gPSBjYmZuOworCXN3LT5jYl9kYXRhID0gY2JfZGF0YTsKKworCS8qIE9wZW4gdGhlIGZpbGUgaW4gb3JkZXIgdG8gZmlsbCBzb21lIHN3IHN0cnVjdCBtZW1iZXJzICovCisJcmMgPSBzd19vcGVuX2ZpbGUoc3csIGZuYW1lKTsKKwlpZiAocmMgPCAwKSB7CisJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCXJldHVybiByYzsKKwl9CisJc3dfY2xvc2VfZmlsZShzdyk7CisKKwlyZXR1cm4gc3dfYWN0aXZhdGUoc3cpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX25tX2NoYW5uZWwoc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqY2gsIHVfaW50OF90IGJ0c19wb3J0LAorCQkgICAgICAgdV9pbnQ4X3QgdHNfbnIsIHVfaW50OF90IHN1YnNsb3RfbnIpCit7CisJY2gtPmF0dHJpYiA9IE5NX0FUVF9BQklTX0NIQU5ORUw7CisJY2gtPmJ0c19wb3J0ID0gYnRzX3BvcnQ7CisJY2gtPnRpbWVzbG90ID0gdHNfbnI7CisJY2gtPnN1YnNsb3QgPSBzdWJzbG90X25yOwkKK30KKworaW50IGFiaXNfbm1fZXN0YWJsaXNoX3RlaShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCB0cnhfbnIsCisJCQkgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90LAorCQkJICB1X2ludDhfdCB0ZWkpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaDsKKwl1X2ludDhfdCBsZW4gPSBzaXplb2YoKmNoKSArIDI7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfRVNUQUJMSVNIX1RFSSwgTk1fT0NfUkFESU9fQ0FSUklFUiwKKwkJCWJ0cy0+YnRzX25yLCB0cnhfbnIsIDB4ZmYpOworCQorCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1RFSSwgdGVpKTsKKworCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogY29ubmVjdCBzaWduYWxsaW5nIG9mIG9uZSAoQlRTLFRSWCkgdG8gYSBwYXJ0aWN1bGFyIHRpbWVzbG90IG9uIHRoZSBFMSAqLworaW50IGFiaXNfbm1fY29ubl90ZXJyX3NpZ24oc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsCisJCQkgICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdHJ4LT5idHM7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgc2l6ZW9mKCpjaCksIE5NX01UX0NPTk5fVEVSUl9TSUdOLAorCQkJTk1fT0NfUkFESU9fQ0FSUklFUiwgYnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYpOworCQorCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworI2lmIDAKK2ludCBhYmlzX25tX2Rpc2NfdGVycl9zaWduKHN0cnVjdCBhYmlzX25tX2ggKmgsIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICppbnN0LAorCQkJICAgc3RydWN0IGFiaXNfbm1fYWJpc19jaGFubmVsICpjaGFuKQoreworfQorI2VuZGlmCisKK2ludCBhYmlzX25tX2Nvbm5fdGVycl90cmFmKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsCisJCQkgICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwKKwkJCSAgIHVfaW50OF90IGUxX3N1YnNsb3QpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBzaXplb2YoKmNoKSwgTk1fTVRfQ09OTl9URVJSX1RSQUYsCisJCQlOTV9PQ19DSEFOTkVMLCBidHMtPmJ0c19uciwgdHMtPnRyeC0+bnIsIHRzLT5ucik7CisKKwljaCA9IChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjaCkpOworCWZpbGxfbm1fY2hhbm5lbChjaCwgZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCisJREVCVUdQKEROTSwgIkNPTk5FQ1QgVEVSUiBUUkFGIFVtPSVzIEUxPSgldSwldSwldSlcbiIsCisJCWdzbV90c19uYW1lKHRzKSwKKwkJZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKyNpZiAwCitpbnQgYWJpc19ubV9kaXNjX3RlcnJfdHJhZihzdHJ1Y3QgYWJpc19ubV9oICpoLCBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqaW5zdCwKKwkJCSAgIHN0cnVjdCBhYmlzX25tX2FiaXNfY2hhbm5lbCAqY2hhbiwKKwkJCSAgIHVfaW50OF90IHN1YmNoYW4pCit7Cit9CisjZW5kaWYKKworLyogQ2hhcHRlciA4LjYuMSAqLworaW50IGFiaXNfbm1fc2V0X2J0c19hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90ICpjdXI7CisKKwlERUJVR1AoRE5NLCAiU2V0IEJUUyBBdHRyIChidHM9JWQpXG4iLCBidHMtPm5yKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGF0dHJfbGVuLCBOTV9NVF9TRVRfQlRTX0FUVFIsIE5NX09DX0JUUywgYnRzLT5idHNfbnIsIDB4ZmYsIDB4ZmYpOworCWN1ciA9IG1zZ2JfcHV0KG1zZywgYXR0cl9sZW4pOworCW1lbWNweShjdXIsIGF0dHIsIGF0dHJfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDguNi4yICovCitpbnQgYWJpc19ubV9zZXRfcmFkaW9fYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmN1cjsKKworCURFQlVHUChETk0sICJTZXQgVFJYIEF0dHIgKGJ0cz0lZCx0cng9JWQpXG4iLCB0cngtPmJ0cy0+bnIsIHRyeC0+bnIpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgYXR0cl9sZW4sIE5NX01UX1NFVF9SQURJT19BVFRSLCBOTV9PQ19SQURJT19DQVJSSUVSLAorCQkJdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZik7CisJY3VyID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJbWVtY3B5KGN1ciwgYXR0ciwgYXR0cl9sZW4pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyh0cngtPmJ0cywgbXNnKTsKK30KKworc3RhdGljIGludCB2ZXJpZnlfY2hhbl9jb21iKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsIHVfaW50OF90IGNoYW5fY29tYikKK3sKKwlpbnQgaTsKKworCS8qIEFzIGl0IHR1cm5zIG91dCwgdGhlIEJTLTExIGhhcyBzb21lIHZlcnkgcGVjdWxpYXIgcmVzdHJpY3Rpb25zCisJICogb24gdGhlIGNoYW5uZWwgY29tYmluYXRpb25zIGl0IGFsbG93cyAqLworCXN3aXRjaCAodHMtPnRyeC0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQljYXNlIE5NX0NIQU5DX1RDSEhhbGYyOgorCQkJLyogbm90IHN1cHBvcnRlZCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgTk1fQ0hBTkNfU0RDQ0g6CisJCQkvKiBvbmx5IG9uZSBTRENDSC84IHBlciBUUlggKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBUUlhfTlJfVFM7IGkrKykgeworCQkJCWlmIChpID09IHRzLT5ucikKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHRzLT50cngtPnRzW2ldLm5tX2NoYW5fY29tYiA9PQorCQkJCSAgICBOTV9DSEFOQ19TRENDSCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQkvKiBub3QgYWxsb3dlZCBmb3IgVFMwIG9mIEJDQ0gtVFJYICovCisJCQlpZiAodHMtPnRyeCA9PSB0cy0+dHJ4LT5idHMtPmMwICYmCisJCQkgICAgdHMtPm5yID09IDApCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJLyogbm90IG9uIHRoZSBzYW1lIFRSWCB0aGF0IGhhcyBhIEJDQ0grU0RDQ0g0CisJCQkgKiBjb21iaW5hdGlvbiAqLworCQkJaWYgKHRzLT50cnggPT0gdHMtPnRyeC0+YnRzLT5jMCAmJgorCQkJICAgICh0cy0+dHJ4LT50c1swXS5ubV9jaGFuX2NvbWIgPT0gNSB8fAorCQkJICAgICB0cy0+dHJ4LT50c1swXS5ubV9jaGFuX2NvbWIgPT0gOCkpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgTk1fQ0hBTkNfbWFpbkJDQ0g6CisJCWNhc2UgTk1fQ0hBTkNfQkNDSENvbWI6CisJCQkvKiBhbGxvd2VkIG9ubHkgZm9yIFRTMCBvZiBDMCAqLworCQkJaWYgKHRzLT50cnggIT0gdHMtPnRyeC0+YnRzLT5jMCB8fAorCQkJICAgIHRzLT5uciAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgTk1fQ0hBTkNfQkNDSDoKKwkJCS8qIGFsbG93ZWQgb25seSBmb3IgVFMgMi80LzYgb2YgQzAgKi8KKwkJCWlmICh0cy0+dHJ4ICE9IHRzLT50cngtPmJ0cy0+YzApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAodHMtPm5yICE9IDIgJiYgdHMtPm5yICE9IDQgJiYKKwkJCSAgICB0cy0+bnIgIT0gNikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIDg6IC8qIHRoaXMgaXMgbm90IGxpa2UgMDguNTgsIGJ1dCBpbiBmYWN0CisJCQkgKiBGQ0NIK1NDSCtCQ0NIK0NDQ0grU0RDQ0gvNCtTQUNDSC9DNCtDQkNIICovCisJCQkvKiBGSVhNRTogb25seSBvbmUgQ0JDSCBhbGxvd2VkIHBlciBjZWxsICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlzd2l0Y2ggKHRzLT5ucikgeworCQljYXNlIDA6CisJCQlpZiAodHMtPnRyeC0+bnIgPT0gMCkgeworCQkJCS8qIG9ubHkgb24gVFJYMCAqLworCQkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQkJY2FzZSBOTV9DSEFOQ19CQ0NIOgorCQkJCWNhc2UgTk1fQ0hBTkNfbWFpbkJDQ0g6CisJCQkJY2FzZSBOTV9DSEFOQ19CQ0NIQ29tYjoKKwkJCQkJcmV0dXJuIDA7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEZ1bGw6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGY6CisJCQkJCXJldHVybiAwOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAodHMtPnRyeC0+bnIgPT0gMCkgeworCQkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQkJY2FzZSBOTV9DSEFOQ19TRENDSF9DQkNIOgorCQkJCQlpZiAodHMtPnRyeC0+dHNbMF0ubm1fY2hhbl9jb21iID09CisJCQkJCSAgICBOTV9DSEFOQ19tYWluQkNDSCkKKwkJCQkJCXJldHVybiAwOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQljYXNlIE5NX0NIQU5DX1NEQ0NIOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENIRnVsbDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfVENISGFsZjoKKwkJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9QRENIOgorCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQkJY2FzZSBOTV9DSEFOQ19TRENDSDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEZ1bGw6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGY6CisJCQkJCXJldHVybiAwOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCWNhc2UgMzoKKwkJY2FzZSA0OgorCQljYXNlIDU6CisJCWNhc2UgNjoKKwkJY2FzZSA3OgorCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCWNhc2UgTk1fQ0hBTkNfVENIRnVsbDoKKwkJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjoKKwkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGY6CisJCQkJcmV0dXJuIDA7CisJCQljYXNlIE5NX0NIQU5DX0lQQUNfUERDSDoKKwkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1BEQ0g6CisJCQkJaWYgKHRzLT50cngtPm5yID09IDApCisJCQkJCXJldHVybiAwOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZWZhdWx0OgorCQkvKiB1bmtub3duIEJUUyB0eXBlICovCisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA4LjYuMyAqLworaW50IGFiaXNfbm1fc2V0X2NoYW5uZWxfYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBjaGFuX2NvbWIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXVfaW50MTZfdCBhcmZjbiA9IGh0b25zKHRzLT50cngtPmFyZmNuKTsKKwl1X2ludDhfdCB6ZXJvID0gMHgwMDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGxlbiA9IDIgKyAyOworCisJaWYgKGJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkKKwkJbGVuICs9IDQgKyAyICsgMiArIDM7CisKKwlERUJVR1AoRE5NLCAiU2V0IENoYW4gQXR0ciAlc1xuIiwgZ3NtX3RzX25hbWUodHMpKTsKKwlpZiAodmVyaWZ5X2NoYW5fY29tYih0cywgY2hhbl9jb21iKSA8IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCURFQlVHUChETk0sICJJbnZhbGlkIENoYW5uZWwgQ29tYmluYXRpb24hISFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdHMtPm5tX2NoYW5fY29tYiA9IGNoYW5fY29tYjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfU0VUX0NIQU5fQVRUUiwKKwkJCU5NX09DX0NIQU5ORUwsIGJ0cy0+YnRzX25yLAorCQkJdHMtPnRyeC0+bnIsIHRzLT5ucik7CisJLyogRklYTUU6IGRvbid0IHNlbmQgQVJGQ04gbGlzdCwgaG9wcGluZyBzZXF1ZW5jZSwgbUFJTywgLi4uKi8KKwlpZiAoYnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKQorCQltc2diX3RsdjE2X3B1dChtc2csIE5NX0FUVF9BUkZDTl9MSVNULCAxLCAmYXJmY24pOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX0NIQU5fQ09NQiwgY2hhbl9jb21iKTsKKwlpZiAoYnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKSB7CisJCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX0hTTiwgMHgwMCk7CisJCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX01BSU8sIDB4MDApOworCX0KKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9UU0MsIGJ0cy0+dHNjKTsJLyogdHJhaW5pbmcgc2VxdWVuY2UgKi8KKwlpZiAoYnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKQorCQltc2diX3Rsdl9wdXQobXNnLCAweDU5LCAxLCAmemVybyk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fc3dfYWN0X3JlcV9hY2soc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMSwKKwkJCXVfaW50OF90IGkyLCB1X2ludDhfdCBpMywgaW50IG5hY2ssIHVfaW50OF90ICphdHRyLCBpbnQgYXR0X2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbXNndHlwZSA9IE5NX01UX1NXX0FDVF9SRVFfQUNLOworCXVfaW50OF90IGxlbiA9IGF0dF9sZW47CisKKwlpZiAobmFjaykgeworCQlsZW4gKz0gMjsKKwkJbXNndHlwZSA9IE5NX01UX1NXX0FDVF9SRVFfTkFDSzsKKwl9CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBhdHRfbGVuLCBtc2d0eXBlLCBvYmpfY2xhc3MsIGkxLCBpMiwgaTMpOworCisJaWYgKGF0dHIpIHsKKwkJdV9pbnQ4X3QgKnB0ciA9IG1zZ2JfcHV0KG1zZywgYXR0X2xlbik7CisJCW1lbWNweShwdHIsIGF0dHIsIGF0dF9sZW4pOworCX0KKwlpZiAobmFjaykKKwkJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfTkFDS19DQVVTRVMsIE5NX05BQ0tfT0JKQ0xBU1NfTk9UU1VQUCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fcmF3X21zZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbGVuLCB1X2ludDhfdCAqcmF3bXNnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwl1X2ludDhfdCAqZGF0YTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqb2gpKTsKKwlmaWxsX29tX2hkcihvaCwgbGVuKTsKKwlkYXRhID0gbXNnYl9wdXQobXNnLCBsZW4pOworCW1lbWNweShkYXRhLCByYXdtc2csIGxlbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogU2llbWVucyBzcGVjaWZpYyBjb21tYW5kcyAqLworc3RhdGljIGludCBfX3NpbXBsZV9jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgbXNnX3R5cGUsIE5NX09DX1NJVEVfTUFOQUdFUiwKKwkJCTB4ZmYsIDB4ZmYsIDB4ZmYpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC45LjIgKi8KK2ludCBhYmlzX25tX29wc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX09QU1RBUlQsIG9ial9jbGFzcywgaTAsIGkxLCBpMik7CisKKwlkZWJ1Z3BfZm9oKChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIG9oLT5kYXRhKTsKKwlERUJVR1BDKEROTSwgIlNlbmRpbmcgT1BTVEFSVFxuIik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogQ2hhcHRlciA4LjguNSAqLworaW50IGFiaXNfbm1fY2hnX2FkbV9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLAorCQkJICB1X2ludDhfdCBpMSwgdV9pbnQ4X3QgaTIsIGVudW0gYWJpc19ubV9hZG1fc3RhdGUgYWRtX3N0YXRlKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIsIE5NX01UX0NIR19BRE1fU1RBVEUsIG9ial9jbGFzcywgaTAsIGkxLCBpMik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQURNX1NUQVRFLCBhZG1fc3RhdGUpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2Nvbm5fbWRyb3BfbGluayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBlMV9wb3J0MCwgdV9pbnQ4X3QgdHMwLAorCQkJICAgIHVfaW50OF90IGUxX3BvcnQxLCB1X2ludDhfdCB0czEpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90ICphdHRyOworCisJREVCVUdQKEROTSwgIkNPTk5FQ1QgTURST1AgTElOSyBFMT0oJXUsJXUpIC0+IEUxPSgldSwgJXUpXG4iLAorCQllMV9wb3J0MCwgdHMwLCBlMV9wb3J0MSwgdHMxKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDYsIE5NX01UX0NPTk5fTURST1BfTElOSywKKwkJCU5NX09DX1NJVEVfTUFOQUdFUiwgMHgwMCwgMHgwMCwgMHgwMCk7CisKKwlhdHRyID0gbXNnYl9wdXQobXNnLCAzKTsKKwlhdHRyWzBdID0gTk1fQVRUX01EUk9QX0xJTks7CisJYXR0clsxXSA9IGUxX3BvcnQwOworCWF0dHJbMl0gPSB0czA7CisKKwlhdHRyID0gbXNnYl9wdXQobXNnLCAzKTsKKwlhdHRyWzBdID0gTk1fQVRUX01EUk9QX05FWFQ7CisJYXR0clsxXSA9IGUxX3BvcnQxOworCWF0dHJbMl0gPSB0czE7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogQ2hhcHRlciA4LjcuMSAqLworaW50IGFiaXNfbm1fcGVyZm9ybV90ZXN0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCSB1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgdGVzdF9uciwgdV9pbnQ4X3QgYXV0b25fcmVwb3J0LAorCQkJIHVfaW50OF90ICpwaHlzX2NvbmZpZywgdV9pbnQxNl90IHBoeXNfY29uZmlnX2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJaW50IGxlbiA9IDQ7IC8qIDIgVFYgYXR0cmlidXRlcyAqLworCisJREVCVUdQKEROTSwgIlBFRk9STSBURVNUXG4iKTsKKwkKKwlpZiAocGh5c19jb25maWdfbGVuKQorCQlsZW4gKz0gMyArIHBoeXNfY29uZmlnX2xlbjsKKwkKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX1BFUkZfVEVTVCwKKwkJCW9ial9jbGFzcywgYnRzX25yLCB0cnhfbnIsIHRzX25yKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9URVNUX05PLCB0ZXN0X25yKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9BVVRPTl9SRVBPUlQsIGF1dG9uX3JlcG9ydCk7CisJaWYgKHBoeXNfY29uZmlnX2xlbikKKwkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfUEhZU19DT05GLCBwaHlzX2NvbmZpZ19sZW4sCisJCQkJcGh5c19jb25maWcpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2V2ZW50X3JlcG9ydHMoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKQoreworCWlmIChvbiA9PSAwKQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfU1RPUF9FVkVOVF9SRVApOworCWVsc2UKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX1JFU1RfRVZFTlRfUkVQKTsKK30KKworLyogU2llbWVucyAob3IgQlMtMTEpIHNwZWNpZmljIGNvbW1hbmRzICovCisKK2ludCBhYmlzX25tX2JzMTFfYnNjX2Rpc2Nvbm5lY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHJlY29ubmVjdCkKK3sKKwlpZiAocmVjb25uZWN0ID09IDApCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX0RJU0NPTk5FQ1QpOworCWVsc2UKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfUkVDT05ORUNUKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9yZXN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfUkVTVEFSVCk7Cit9CisKKworc3RydWN0IGJzMTFfZGF0ZV90aW1lIHsKKwl1X2ludDE2X3QJeWVhcjsKKwl1X2ludDhfdAltb250aDsKKwl1X2ludDhfdAlkYXk7CisJdV9pbnQ4X3QJaG91cjsKKwl1X2ludDhfdAltaW47CisJdV9pbnQ4X3QJc2VjOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCit2b2lkIGdldF9iczExX2RhdGVfdGltZShzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgKmFldCkKK3sKKwl0aW1lX3QgdDsKKwlzdHJ1Y3QgdG0gKnRtOworCisJdCA9IHRpbWUoTlVMTCk7CisJdG0gPSBsb2NhbHRpbWUoJnQpOworCWFldC0+c2VjID0gdG0tPnRtX3NlYzsKKwlhZXQtPm1pbiA9IHRtLT50bV9taW47CisJYWV0LT5ob3VyID0gdG0tPnRtX2hvdXI7CisJYWV0LT5kYXkgPSB0bS0+dG1fbWRheTsKKwlhZXQtPm1vbnRoID0gdG0tPnRtX21vbjsKKwlhZXQtPnllYXIgPSBodG9ucygxOTAwICsgdG0tPnRtX3llYXIpOworfQorCitpbnQgYWJpc19ubV9iczExX3Jlc2V0X3Jlc291cmNlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfUkVTRVRfUkVTT1VSQ0UpOworfQorCitpbnQgYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgYmVnaW4pCit7CisJaWYgKGJlZ2luKQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9CRUdJTl9EQl9UWCk7CisJZWxzZQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9FTkRfREJfVFgpOworfQorCitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQllbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHR5cGUsIHVfaW50OF90IGlkeCwKKwkJCQl1X2ludDhfdCBhdHRyX2xlbiwgY29uc3QgdV9pbnQ4X3QgKmF0dHIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90ICpjdXI7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBhdHRyX2xlbiwgTk1fTVRfQlMxMV9DUkVBVEVfT0JKLAorCQkJTk1fT0NfQlMxMSwgdHlwZSwgMCwgaWR4KTsKKwljdXIgPSBtc2diX3B1dChtc2csIGF0dHJfbGVuKTsKKwltZW1jcHkoY3VyLCBhdHRyLCBhdHRyX2xlbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB0eXBlLCB1X2ludDhfdCBpZHgpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9ERUxFVEVfT0JKLAorCQkJTk1fT0NfQlMxMSwgdHlwZSwgMCwgaWR4KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IHplcm8gPSAweDAwOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9DUkVBVEVfT0JKLAorCQkJTk1fT0NfQlMxMV9FTlZBQlRTRSwgMCwgaWR4LCAweGZmKTsKKwltc2diX3Rsdl9wdXQobXNnLCAweDk5LCAxLCAmemVybyk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX0JTMTFfQ1JFQVRFX09CSiwgTk1fT0NfQlMxMV9CUE9SVCwKKwkJCWlkeCwgMHhmZiwgMHhmZik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9kZWxldGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX0JTMTFfREVMRVRFX09CSiwgTk1fT0NfQlMxMV9CUE9SVCwKKwkJCWlkeCwgMHhmZiwgMHhmZik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworc3RhdGljIGNvbnN0IHVfaW50OF90IHNtX2F0dHJbXSA9IHsgTk1fQVRUX1RFSSwgTk1fQVRUX0FCSVNfQ0hBTk5FTCB9OworaW50IGFiaXNfbm1fYnMxMV9nZXRfb21sX3RlaV90cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKHNtX2F0dHIpLCBOTV9NVF9HRVRfQVRUUiwgTk1fT0NfU0lURV9NQU5BR0VSLAorCQkJMHhmZiwgMHhmZiwgMHhmZik7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0xJU1RfUkVRX0FUVFIsIHNpemVvZihzbV9hdHRyKSwgc21fYXR0cik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogbGlrZSBhYmlzX25tX2Nvbm5fdGVycl90cmFmICsgc2V0X3RlaSAqLworaW50IGFiaXNfbm1fYnMxMV9jb25uX29tbF90ZWkoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgZTFfcG9ydCwKKwkJCSAgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsCisJCQkgIHVfaW50OF90IHRlaSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBzaXplb2YoKmNoKSsyLCBOTV9NVF9CUzExX1NFVF9BVFRSLAorCQkJTk1fT0NfU0lURV9NQU5BR0VSLCAweGZmLCAweGZmLCAweGZmKTsKKworCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfVEVJLCB0ZWkpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgbGV2ZWwpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX1BBLCAweDAwLCB0cngtPm5yKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9UWFBXUiwgMSwgJmxldmVsKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgYXR0ciA9IE5NX0FUVF9CUzExX1RYUFdSOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzaXplb2YoYXR0ciksIE5NX01UX0dFVF9BVFRSLAorCQkJTk1fT0NfQlMxMSwgQlMxMV9PQkpfUEEsIDB4MDAsIHRyeC0+bnIpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2YoYXR0ciksICZhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3BsbF9tb2RlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHJbXSA9IHsgTk1fQVRUX0JTMTFfUExMX01PREUgfTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX0xJLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKGF0dHIpLCBhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF9jY2xrKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHJbXSA9IHsgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSwKKwkJCSAgICBOTV9BVFRfQlMxMV9DQ0xLX1RZUEUgfTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX0NDTEssIDB4MDAsIDB4MDApOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2YoYXR0ciksIGF0dHIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7CisKK30KKworLy9zdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnMxMV9sb2dvbl9jN1tdID0geyAweDA3LCAweGQ5LCAweDAxLCAweDExLCAweDBkLCAweDEwLCAweDIwIH07CisKK2ludCBhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pCit7CisJcmV0dXJuIGFiaXNfbm1fYnMxMV9sb2dvbihidHMsIDB4MDIsICJGQUNUT1JZIiwgb24pOworfQorCitpbnQgYWJpc19ubV9iczExX2luZmllbGRfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKQoreworCXJldHVybiBhYmlzX25tX2JzMTFfbG9nb24oYnRzLCAweDAzLCAiRklFTEQgICIsIG9uKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBsZXZlbCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG9uKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgYmR0OworCisJZ2V0X2JzMTFfZGF0ZV90aW1lKCZiZHQpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWlmIChvbikgeworCQl1X2ludDhfdCBsZW4gPSAzKjIgKyBzaXplb2YoYmR0KQorCQkJCSsgMSArIHN0cmxlbihuYW1lKTsKKwkJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0JTMTFfTE1UX0xPR09OLAorCQkJCU5NX09DX0JTMTFfQlRTRSwgMHhmZiwgMHhmZiwgMHhmZik7CisJCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FLAorCQkJICAgICBzaXplb2YoYmR0KSwgKHVfaW50OF90ICopICZiZHQpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWLAorCQkJICAgICAxLCAmbGV2ZWwpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FLAorCQkJICAgICBzdHJsZW4obmFtZSksICh1X2ludDhfdCAqKW5hbWUpOworCX0gZWxzZSB7CisJCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9MTVRfTE9HT0ZGLAorCQkJCU5NX09DX0JTMTFfQlRTRSwgMHhmZiwgMHhmZiwgMHhmZik7CisJfQorCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX3NldF90cngxX3B3KHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCWlmIChzdHJsZW4ocGFzc3dvcmQpICE9IDEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworIAltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzdHJsZW4ocGFzc3dvcmQpLCBOTV9NVF9CUzExX1NFVF9BVFRSLAorCQkJTk1fT0NfQlMxMSwgQlMxMV9PQkpfVFJYMSwgMHgwMCwgMHgwMCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUEFTU1dPUkQsIDEwLCAoY29uc3QgdV9pbnQ4X3QgKilwYXNzd29yZCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogY2hhbmdlIHRoZSBCUy0xMSBQTEwgTW9kZSB0byBlaXRoZXIgbG9ja2VkIChFMSBkZXJpdmVkKSBvciBzdGFuZGFsb25lICovCitpbnQgYWJpc19ubV9iczExX3NldF9wbGxfbG9ja2VkKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsb2NrZWQpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHRsdl92YWx1ZTsKKwkKKwltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMSwKKwkJCUJTMTFfT0JKX0xJLCAweDAwLCAweDAwKTsKKworCWlmIChsb2NrZWQpCisJCXRsdl92YWx1ZSA9IEJTMTFfTElfUExMX0xPQ0tFRDsKKwllbHNlCisJCXRsdl92YWx1ZSA9IEJTMTFfTElfUExMX1NUQU5EQUxPTkU7CisJCisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUExMX01PREUsIDEsICZ0bHZfdmFsdWUpOworCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBTZXQgdGhlIGNhbGlicmF0aW9uIHZhbHVlIG9mIHRoZSBQTEwgKHdvcmsgdmFsdWUvc2V0IHZhbHVlKQorICogSXQgZGVwZW5kcyBvbiB0aGUgbG9naW4gd2hpY2ggb25lIGlzIGNoYW5nZWQgKi8KK2ludCBhYmlzX25tX2JzMTFfc2V0X3BsbChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHRsdl92YWx1ZVsyXTsKKworCW1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAzLCBOTV9NVF9CUzExX1NFVF9BVFRSLCBOTV9PQ19CUzExLAorCQkJQlMxMV9PQkpfVFJYMSwgMHgwMCwgMHgwMCk7CisKKwl0bHZfdmFsdWVbMF0gPSB2YWx1ZT4+ODsKKwl0bHZfdmFsdWVbMV0gPSB2YWx1ZSYweGZmOworCisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUExMLCAyLCB0bHZfdmFsdWUpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfR0VUX1NUQVRFKTsKK30KKworLyogQlMxMSBTV0wgKi8KKwordm9pZCAqdGFsbF9mbGVfY3R4OworCitzdHJ1Y3QgYWJpc19ubV9iczExX3N3IHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWNoYXIgc3dsX2ZuYW1lW1BBVEhfTUFYXTsKKwl1X2ludDhfdCB3aW5fc2l6ZTsKKwlpbnQgZm9yY2VkOworCXN0cnVjdCBsbGlzdF9oZWFkIGZpbGVfbGlzdDsKKwlnc21fY2JmbiAqdXNlcl9jYjsJLyogc3BlY2lmaWVkIGJ5IHRoZSB1c2VyICovCit9Oworc3RhdGljIHN0cnVjdCBhYmlzX25tX2JzMTFfc3cgX2dfYnMxMV9zdywgKmdfYnMxMV9zdyA9ICZfZ19iczExX3N3OworCitzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCWNoYXIgZm5hbWVbUEFUSF9NQVhdOworfTsKKworc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxfZGVxdWV1ZShzdHJ1Y3QgbGxpc3RfaGVhZCAqcXVldWUpCit7CisJc3RydWN0IGxsaXN0X2hlYWQgKmxoOworCisJaWYgKGxsaXN0X2VtcHR5KHF1ZXVlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaCA9IHF1ZXVlLT5uZXh0OworCWxsaXN0X2RlbChsaCk7CisJCisJcmV0dXJuIGxsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5LCBsaXN0KTsKK30KKworc3RhdGljIGludCBiczExX3JlYWRfc3dsX2ZpbGUoc3RydWN0IGFiaXNfbm1fYnMxMV9zdyAqYnMxMV9zdykKK3sKKwljaGFyIGxpbmVidWZbMjU1XTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqbGgsICpsaDI7CisJRklMRSAqc3dsOworCWludCByYyA9IDA7CisKKwlzd2wgPSBmb3BlbihiczExX3N3LT5zd2xfZm5hbWUsICJyIik7CisJaWYgKCFzd2wpCisJCXJldHVybiAtRU5PREVWOworCisJLyogemVybyB0aGUgc3RhbGUgZmlsZSBsaXN0LCBpZiBhbnkgKi8KKwlsbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaDIsICZiczExX3N3LT5maWxlX2xpc3QpIHsKKwkJbGxpc3RfZGVsKGxoKTsKKwkJdGFsbG9jX2ZyZWUobGgpOworCX0KKworCXdoaWxlIChmZ2V0cyhsaW5lYnVmLCBzaXplb2YobGluZWJ1ZiksIHN3bCkpIHsKKwkJY2hhciBmaWxlX2lkWzEyKzFdOworCQljaGFyIGZpbGVfdmVyc2lvbls4MCsxXTsKKwkJc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxlOworCQlzdGF0aWMgY2hhciBkaXJbUEFUSF9NQVhdOworCisJCWlmIChzdHJsZW4obGluZWJ1ZikgPCA0KQorCQkJY29udGludWU7CisJCisJCXJjID0gc3NjYW5mKGxpbmVidWYrNCwgIiUxMnM6JTgwc1xyXG4iLCBmaWxlX2lkLCBmaWxlX3ZlcnNpb24pOworCQlpZiAocmMgPCAwKSB7CisJCQlwZXJyb3IoIkVSUiBwYXJzaW5nIFNXTCBmaWxlIik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAocmMgPCAyKQorCQkJY29udGludWU7CisKKwkJZmxlID0gdGFsbG9jX3plcm8odGFsbF9mbGVfY3R4LCBzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5KTsKKwkJaWYgKCFmbGUpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogY29uc3RydWN0IG5ldyBmaWxlbmFtZSAqLworCQlzdHJuY3B5KGRpciwgYnMxMV9zdy0+c3dsX2ZuYW1lLCBzaXplb2YoZGlyKSk7CisJCXN0cm5jYXQoZmxlLT5mbmFtZSwgZGlybmFtZShkaXIpLCBzaXplb2YoZmxlLT5mbmFtZSkgLSAxKTsKKwkJc3RyY2F0KGZsZS0+Zm5hbWUsICIvIik7CisJCXN0cm5jYXQoZmxlLT5mbmFtZSwgZmlsZV9pZCwgc2l6ZW9mKGZsZS0+Zm5hbWUpIC0gMSAtc3RybGVuKGZsZS0+Zm5hbWUpKTsKKwkJCisJCWxsaXN0X2FkZF90YWlsKCZmbGUtPmxpc3QsICZiczExX3N3LT5maWxlX2xpc3QpOworCX0KKworb3V0OgorCWZjbG9zZShzd2wpOworCXJldHVybiByYzsKK30KKworLyogYnMxMSBzd2xvYWQgc3BlY2lmaWMgY2FsbGJhY2ssIHBhc3NlZCB0byBhYmlzX25tIGNvcmUgc3dsb2FkICovCitzdGF0aWMgaW50IGJzMTFfc3dsb2FkX2NiZm4odW5zaWduZWQgaW50IGhvb2ssIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgYWJpc19ubV9iczExX3N3ICpiczExX3N3ID0gZGF0YTsKKwlzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5ICpmbGU7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJZmxlID0gZmxfZGVxdWV1ZSgmYnMxMV9zdy0+ZmlsZV9saXN0KTsKKwkJaWYgKGZsZSkgeworCQkJLyogc3RhcnQgZG93bmxvYWQgdGhlIG5leHQgZmlsZSBvZiBvdXIgZmlsZSBsaXN0ICovCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChiczExX3N3LT5idHMsIGZsZS0+Zm5hbWUsCisJCQkJCQkgICBiczExX3N3LT53aW5fc2l6ZSwKKwkJCQkJCSAgIGJzMTFfc3ctPmZvcmNlZCwKKwkJCQkJCSAgICZiczExX3N3bG9hZF9jYmZuLCBiczExX3N3KTsKKwkJCXRhbGxvY19mcmVlKGZsZSk7CisJCX0gZWxzZSB7CisJCQkvKiBhY3RpdmF0ZSB0aGUgU1dMICovCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfYWN0aXZhdGUoYnMxMV9zdy0+YnRzLAorCQkJCQkJCWJzMTFfc3ctPnN3bF9mbmFtZSwKKwkJCQkJCQliczExX3N3bG9hZF9jYmZuLAorCQkJCQkJCWJzMTFfc3cpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9TRUdfQUNLOgorCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKKwljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfTkFDSzoKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJZGVmYXVsdDoKKwkJLyogZmFsbHRocm91Z2ggdG8gdGhlIHVzZXIgY2FsbGJhY2sgKi8KKwkJaWYgKGJzMTFfc3ctPnVzZXJfY2IpCisJCQlyYyA9IGJzMTFfc3ctPnVzZXJfY2IoaG9vaywgZXZlbnQsIG1zZywgTlVMTCwgTlVMTCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogU2llbWVucyBwcm92aWRlcyBhIFNXTCBmaWxlIHRoYXQgaXMgYSBtZXJlIGxpc3Rpbmcgb2YgYWxsIHRoZSBvdGhlcgorICogZmlsZXMgdGhhdCBhcmUgcGFydCBvZiBhIHNvZnR3YXJlIHJlbGVhc2UuICBXZSBuZWVkIHRvIHVwbG9hZCBmaXJzdAorICogdGhlIGxpc3QgZmlsZSwgYW5kIHRoZW4gZWFjaCBmaWxlIHRoYXQgaXMgbGlzdGVkIGluIHRoZSBsaXN0IGZpbGUgKi8KK2ludCBhYmlzX25tX2JzMTFfbG9hZF9zd2woc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLCBnc21fY2JmbiAqY2JmbikKK3sKKwlzdHJ1Y3QgYWJpc19ubV9iczExX3N3ICpiczExX3N3ID0gZ19iczExX3N3OworCXN0cnVjdCBmaWxlX2xpc3RfZW50cnkgKmZsZTsKKwlpbnQgcmMgPSAwOworCisJSU5JVF9MTElTVF9IRUFEKCZiczExX3N3LT5maWxlX2xpc3QpOworCWJzMTFfc3ctPmJ0cyA9IGJ0czsKKwliczExX3N3LT53aW5fc2l6ZSA9IHdpbl9zaXplOworCWJzMTFfc3ctPnVzZXJfY2IgPSBjYmZuOworCWJzMTFfc3ctPmZvcmNlZCA9IGZvcmNlZDsKKworCXN0cm5jcHkoYnMxMV9zdy0+c3dsX2ZuYW1lLCBmbmFtZSwgc2l6ZW9mKGJzMTFfc3ctPnN3bF9mbmFtZSkpOworCXJjID0gYnMxMV9yZWFkX3N3bF9maWxlKGJzMTFfc3cpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIGRlcXVldWUgbmV4dCBpdGVtIGluIGZpbGUgbGlzdCAqLworCWZsZSA9IGZsX2RlcXVldWUoJmJzMTFfc3ctPmZpbGVfbGlzdCk7CisJaWYgKCFmbGUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc3RhcnQgZG93bmxvYWQgdGhlIG5leHQgZmlsZSBvZiBvdXIgZmlsZSBsaXN0ICovCisJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQoYnRzLCBmbGUtPmZuYW1lLCB3aW5fc2l6ZSwgZm9yY2VkLAorCQkJCSAgIGJzMTFfc3dsb2FkX2NiZm4sIGJzMTFfc3cpOworCXRhbGxvY19mcmVlKGZsZSk7CisJcmV0dXJuIHJjOworfQorCisjaWYgMAorc3RhdGljIHVfaW50OF90IHJlcV9hdHRyX2J0c2VbXSA9IHsKKwlOTV9BVFRfQURNX1NUQVRFLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTiwKKwlOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRSwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFViwKKwlOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FLAorCisJMHhhZiwgTk1fQVRUX0JTMTFfUlhfT0ZGU0VULCBOTV9BVFRfQlMxMV9WRU5ET1JfTkFNRSwKKworCU5NX0FUVF9CUzExX1NXX0xPQURfSU5URU5ERUQsIE5NX0FUVF9CUzExX1NXX0xPQURfU0FGRVRZLAorCisJTk1fQVRUX0JTMTFfU1dfTE9BRF9TVE9SRUQgfTsKKworc3RhdGljIHVfaW50OF90IHJlcV9hdHRyX2J0c21bXSA9IHsKKwlOTV9BVFRfQUJJU19DSEFOTkVMLCBOTV9BVFRfVEVJLCBOTV9BVFRfQlMxMV9BQklTX0VYVF9USU1FLAorCU5NX0FUVF9BRE1fU1RBVEUsIE5NX0FUVF9BVkFJTF9TVEFUVVMsIDB4Y2UsIE5NX0FUVF9GSUxFX0lELAorCU5NX0FUVF9GSUxFX1ZFUlNJT04sIE5NX0FUVF9PUEVSX1NUQVRFLCAweGU4LCBOTV9BVFRfQlMxMV9BTExfVEVTVF9DQVRHLAorCU5NX0FUVF9TV19ERVNDUiwgTk1fQVRUX0dFVF9BUkkgfTsKKyNlbmRpZgorCQorc3RhdGljIHVfaW50OF90IHJlcV9hdHRyW10gPSB7CisJTk1fQVRUX0FETV9TVEFURSwgTk1fQVRUX0FWQUlMX1NUQVRVUywgMHhhOCwgTk1fQVRUX09QRVJfU1RBVEUsCisJMHhkNSwgMHhhMSwgTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8sIE5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PLAorCTB4NDIsIE5NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMLCBOTV9BVFRfQlMxMV9QTEwgfTsKKworaW50IGFiaXNfbm1fYnMxMV9nZXRfc2Vybm8oc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJLyogU2llbWVuc0hXIENDVFJMIG9iamVjdCAqLworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzaXplb2YocmVxX2F0dHIpLCBOTV9NVF9HRVRfQVRUUiwgTk1fT0NfQlMxMSwKKwkJCTB4MDMsIDB4MDAsIDB4MDApOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2YocmVxX2F0dHIpLCByZXFfYXR0cik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9zZXRfZXh0X3RpbWUoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzMTFfZGF0ZV90aW1lIGFldDsKKworCWdldF9iczExX2RhdGVfdGltZSgmYWV0KTsKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJLyogU2llbWVuc0hXIENDVFJMIG9iamVjdCAqLworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzaXplb2YoYWV0KSwgTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfU0lURV9NQU5BR0VSLAorCQkJMHhmZiwgMHhmZiwgMHhmZik7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRSwgc2l6ZW9mKGFldCksICh1X2ludDhfdCAqKSAmYWV0KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX3NldF9icG9ydF9saW5lX2NmZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBicG9ydCwgZW51bSBhYmlzX2JzMTFfbGluZV9jZmcgbGluZV9jZmcpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBiczExX2RhdGVfdGltZSBhZXQ7CisKKwlnZXRfYnMxMV9kYXRlX3RpbWUoJmFldCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMiwgTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9CUE9SVCwKKwkJCWJwb3J0LCAweGZmLCAweDAyKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9CUzExX0xJTkVfQ0ZHLCBsaW5lX2NmZyk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogaXAuYWNjZXNzIG5hbm9CVFMgc3BlY2lmaWMgY29tbWFuZHMgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGlwYWNjZXNzX21hZ2ljW10gPSAiY29tLmlwYWNjZXNzIjsKKworCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfaXBhY2Moc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaDsKKwl1X2ludDhfdCBpZHN0cmxlbiA9IG9oLT5kYXRhWzBdOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBpcGFjY19hY2tfc2lnbmFsX2RhdGEgc2lnbmFsOworCisJaWYgKHN0cm5jbXAoKGNoYXIgKikmb2gtPmRhdGFbMV0sIGlwYWNjZXNzX21hZ2ljLCBpZHN0cmxlbikpIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJpZCBzdHJpbmcgaXMgbm90IGNvbS5pcGFjY2VzcyAhPyFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb2ggPSAoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqKSAob2gtPmRhdGEgKyAxICsgaWRzdHJsZW4pOworCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbXNnLT50cngtPmJ0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisKKwlkZWJ1Z3BfZm9oKGZvaCk7CisKKwlERUJVR1BDKEROTSwgIklQQUNDRVNTKDB4JTAyeCk6ICIsIGZvaC0+bXNnX3R5cGUpOworCisJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJY2FzZSBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9BQ0s6CisJCURFQlVHUEMoRE5NLCAiUlNMIENPTk5FQ1QgQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUCkpCisJCQlERUJVR1BDKEROTSwgIklQPSVzICIsCisJCQkJaW5ldF9udG9hKCooKHN0cnVjdCBpbl9hZGRyICopCisJCQkJCVRMVlBfVkFMKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUCkpKSk7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlQpKQorCQkJREVCVUdQQyhETk0sICJQT1JUPSV1ICIsCisJCQkJbnRvaHMoKigodV9pbnQxNl90ICopCisJCQkJCVRMVlBfVkFMKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUKSkpKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQpKQorCQkJREVCVUdQQyhETk0sICJTVFJFQU09MHglMDJ4ICIsCisJCQkJCSpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQpKTsKKwkJREVCVUdQQyhETk0sICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0s6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiUlNMIENPTk5FQ1QgTkFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpCisJCQlERUJVR1BDKEROTSwgIiBDQVVTRT0lc1xuIiwKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlERUJVR1BDKEROTSwgIlxuIik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9BQ0s6CisJCURFQlVHUEMoRE5NLCAiU0VUIE5WQVRUUiBBQ0tcbiIpOworCQkvKiBGSVhNRTogZGVjb2RlIGFuZCBzaG93IHRoZSBhY3R1YWwgYXR0cmlidXRlcyAqLworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfTkFDSzoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJTRVQgTlZBVFRSIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiIENBVVNFPSVzXG4iLAorCQkJCW5hY2tfY2F1c2VfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKSk7CisJCWVsc2UKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlxuIik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9BQ0s6CisJCURFQlVHUEMoRE5NLCAiR0VUIE5WQVRUUiBBQ0tcbiIpOworCQkvKiBGSVhNRTogZGVjb2RlIGFuZCBzaG93IHRoZSBhY3R1YWwgYXR0cmlidXRlcyAqLworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSzoKKwkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiR0VUIE5WQVRUUiBOQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIiBDQVVTRT0lc1xuIiwKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSzoKKwkJREVCVUdQQyhETk0sICJTRVQgQVRUUiBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9BVFRSX05BQ0s6CisJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlNFVCBBVFRSIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiIENBVVNFPSVzXG4iLAorCQkJCW5hY2tfY2F1c2VfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKSk7CisJCWVsc2UKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE5NLCAidW5rbm93blxuIik7CisJCWJyZWFrOworCX0KKworCS8qIHNpZ25hbCBoYW5kbGluZyAqLworCXN3aXRjaCAgKGZvaC0+bXNnX3R5cGUpIHsKKwljYXNlIE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0s6CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0s6CisJY2FzZSBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX05BQ0s6CisJCXNpZ25hbC5idHMgPSBtc2ctPnRyeC0+YnRzOworCQlzaWduYWwubXNnX3R5cGUgPSBmb2gtPm1zZ190eXBlOworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fSVBBQ0NfTkFDSywgJnNpZ25hbCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9BQ0s6CisJCXNpZ25hbC5idHMgPSBtc2ctPnRyeC0+YnRzOworCQlzaWduYWwubXNnX3R5cGUgPSBmb2gtPm1zZ190eXBlOworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fSVBBQ0NfQUNLLCAmc2lnbmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHNlbmQgYW4gaXAtYWNjZXNzIG1hbnVmYWN0dXJlciBzcGVjaWZpYyBtZXNzYWdlICovCitpbnQgYWJpc19ubV9pcGFjY2Vzc19tc2coc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbXNnX3R5cGUsCisJCQkgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBidHNfbnIsCisJCQkgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKKwkJCSB1X2ludDhfdCAqYXR0ciwgaW50IGF0dHJfbGVuKQoreworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2g7CisJdV9pbnQ4X3QgKmRhdGE7CisKKwkvKiBjb25zdHJ1Y3QgdGhlIDEyLjIxIE9NIGhlYWRlciwgb2JzZXJ2ZSB0aGUgZXJyb25lb3VzIGxlbmd0aCAqLworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqb2gpKTsKKwlmaWxsX29tX2hkcihvaCwgc2l6ZW9mKCpmb2gpICsgYXR0cl9sZW4pOworCW9oLT5tZGlzYyA9IEFCSVNfT01fTURJU0NfTUFOVUY7CisKKwkvKiBhZGQgdGhlIGlwLmFjY2VzcyBtYWdpYyAqLworCWRhdGEgPSBtc2diX3B1dChtc2csIHNpemVvZihpcGFjY2Vzc19tYWdpYykrMSk7CisJKmRhdGErKyA9IHNpemVvZihpcGFjY2Vzc19tYWdpYyk7CisJbWVtY3B5KGRhdGEsIGlwYWNjZXNzX21hZ2ljLCBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpKTsKKworCS8qIGZpbGwgdGhlIDEyLjIxIEZPTSBoZWFkZXIgKi8KKwlmb2ggPSAoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZm9oKSk7CisJZm9oLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCWZvaC0+b2JqX2NsYXNzID0gb2JqX2NsYXNzOworCWZvaC0+b2JqX2luc3QuYnRzX25yID0gYnRzX25yOworCWZvaC0+b2JqX2luc3QudHJ4X25yID0gdHJ4X25yOworCWZvaC0+b2JqX2luc3QudHNfbnIgPSB0c19ucjsKKworCWlmIChhdHRyICYmIGF0dHJfbGVuKSB7CisJCWRhdGEgPSBtc2diX3B1dChtc2csIGF0dHJfbGVuKTsKKwkJbWVtY3B5KGRhdGEsIGF0dHIsIGF0dHJfbGVuKTsKKwl9CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogc2V0IHNvbWUgYXR0cmlidXRlcyBpbiBOVlJBTSAqLworaW50IGFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgKmF0dHIsCisJCQkJaW50IGF0dHJfbGVuKQoreworCXJldHVybiBhYmlzX25tX2lwYWNjZXNzX21zZyh0cngtPmJ0cywgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUiwKKwkJCQkgICAgTk1fT0NfQkFTRUJfVFJBTlNDLCAwLCB0cngtPm5yLCAweGZmLCBhdHRyLAorCQkJCSAgICBhdHRyX2xlbik7Cit9CisKK2ludCBhYmlzX25tX2lwYWNjZXNzX3JzbF9jb25uZWN0KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LAorCQkJCSB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0LCB1X2ludDhfdCBzdHJlYW0pCit7CisJc3RydWN0IGluX2FkZHIgaWE7CisJdV9pbnQ4X3QgYXR0cltdID0geyBOTV9BVFRfSVBBQ0NfU1RSRUFNX0lELCAwLAorCQkJICAgIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVCwgMCwgMCwKKwkJCSAgICBOTV9BVFRfSVBBQ0NfRFNUX0lQLCAwLCAwLCAwLCAwIH07CisKKwlpbnQgYXR0cl9sZW4gPSBzaXplb2YoYXR0cik7CisKKwlpYS5zX2FkZHIgPSBodG9ubChpcCk7CisJYXR0clsxXSA9IHN0cmVhbTsKKwlhdHRyWzNdID0gcG9ydCA+PiA4OworCWF0dHJbNF0gPSBwb3J0ICYgMHhmZjsKKwkqKHVfaW50MzJfdCAqKShhdHRyKzYpID0gaWEuc19hZGRyOworCisJLyogaWYgaXAgPT0gMCwgd2UgdXNlIHRoZSBkZWZhdWx0IElQICovCisJaWYgKGlwID09IDApCisJCWF0dHJfbGVuIC09IDU7CisKKwlERUJVR1AoRE5NLCAiaXAuYWNjZXNzIFJTTCBDT05ORUNUIElQPSVzIFBPUlQ9JXUgU1RSRUFNPTB4JTAyeFxuIiwKKwkJaW5ldF9udG9hKGlhKSwgcG9ydCwgc3RyZWFtKTsKKworCXJldHVybiBhYmlzX25tX2lwYWNjZXNzX21zZyh0cngtPmJ0cywgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1QsCisJCQkJICAgIE5NX09DX0JBU0VCX1RSQU5TQywgdHJ4LT5idHMtPmJ0c19uciwKKwkJCQkgICAgdHJ4LT5uciwgMHhmZiwgYXR0ciwgYXR0cl9sZW4pOworfQorCisvKiByZXN0YXJ0IC8gcmVib290IGFuIGlwLmFjY2VzcyBuYW5vQlRTICovCitpbnQgYWJpc19ubV9pcGFjY2Vzc19yZXN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0lQQUNDX1JFU1RBUlQpOworfQorCitpbnQgYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkJdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJCXVfaW50OF90ICphdHRyLCB1X2ludDhfdCBhdHRyX2xlbikKK3sKKwlyZXR1cm4gYWJpc19ubV9pcGFjY2Vzc19tc2coYnRzLCBOTV9NVF9JUEFDQ19TRVRfQVRUUiwKKwkJCQkgICAgb2JqX2NsYXNzLCBidHNfbnIsIHRyeF9uciwgdHNfbnIsCisJCQkJICAgICBhdHRyLCBhdHRyX2xlbik7Cit9CisKK3ZvaWQgYWJpc19ubV9pcGFjY2Vzc19jZ2kodV9pbnQ4X3QgKmJ1Ziwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwkvKiB3ZSBzaW1wbHkgcmV1c2UgdGhlIEdTTTQ4IGZ1bmN0aW9uIGFuZCBvdmVyd3JpdGUgdGhlIFJBQworCSAqIHdpdGggdGhlIENlbGwgSUQgKi8KKwlnc200OF9yYV9pZF9ieV9idHMoYnVmLCBidHMpOworCSooKHVfaW50MTZfdCAqKShidWYgKyA1KSkgPSBodG9ucyhidHMtPmNlbGxfaWRlbnRpdHkpOworfQorCit2b2lkIGdzbV90cnhfbG9ja19yZihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgaW50IGxvY2tlZCkKK3sKKwlpbnQgbmV3X3N0YXRlID0gbG9ja2VkID8gTk1fU1RBVEVfTE9DS0VEIDogTk1fU1RBVEVfVU5MT0NLRUQ7CisKKwl0cngtPm5tX3N0YXRlLmFkbWluaXN0cmF0aXZlID0gbmV3X3N0YXRlOworCWlmICghdHJ4LT5idHMgfHwgIXRyeC0+YnRzLT5vbWxfbGluaykKKwkJcmV0dXJuOworCisJYWJpc19ubV9jaGdfYWRtX3N0YXRlKHRyeC0+YnRzLCBOTV9PQ19SQURJT19DQVJSSUVSLAorCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZiwKKwkJCSAgICAgIG5ld19zdGF0ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGlwYWNjX3Rlc3RyZXNfbmFtZXNbXSA9IHsKKwl7IE5NX0lQQUNDX1RFU1RSRVNfU1VDQ0VTUywJIlNVQ0NFU1MiIH0sCisJeyBOTV9JUEFDQ19URVNUUkVTX1RJTUVPVVQsCSJUSU1FT1VUIiB9LAorCXsgTk1fSVBBQ0NfVEVTVFJFU19OT19DSEFOUywJIk5PIENIQU5ORUxTIiB9LAorCXsgTk1fSVBBQ0NfVEVTVFJFU19QQVJUSUFMLAkiUEFSVElBTCIgfSwKKwl7IE5NX0lQQUNDX1RFU1RSRVNfU1RPUFBFRCwJIlNUT1BQRUQiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKmlwYWNjX3Rlc3RyZXNfbmFtZSh1X2ludDhfdCByZXMpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoaXBhY2NfdGVzdHJlc19uYW1lcywgcmVzKTsKK30KKwordm9pZCBpcGFjX3BhcnNlX2NnaShzdHJ1Y3QgY2VsbF9nbG9iYWxfaWQgKmNpZCwgY29uc3QgdV9pbnQ4X3QgKmJ1ZikKK3sKKwljaWQtPm1jYyA9IChidWZbMF0gJiAweGYpICogMTAwOworCWNpZC0+bWNjICs9IChidWZbMF0gPj4gNCkgKiAgMTA7CisJY2lkLT5tY2MgKz0gKGJ1ZlsxXSAmIDB4ZikgKiAgMTsKKworCWlmIChidWZbMV0gPj4gNCA9PSAweGYpIHsKKwkJY2lkLT5tbmMgPSAoYnVmWzJdICYgMHhmKSAqIDEwOworCQljaWQtPm1uYyArPSAoYnVmWzJdID4+IDQpICogIDE7CisJfSBlbHNlIHsKKwkJY2lkLT5tbmMgPSAoYnVmWzJdICYgMHhmKSAqIDEwMDsKKwkJY2lkLT5tbmMgKz0gKGJ1ZlsyXSA+PiA0KSAqICAxMDsKKwkJY2lkLT5tbmMgKz0gKGJ1ZlsxXSA+PiA0KSAqICAgMTsKKwl9CisKKwljaWQtPmxhYyA9IG50b2hzKCooKHVfaW50MTZfdCAqKSZidWZbM10pKTsKKwljaWQtPmNpID0gbnRvaHMoKigodV9pbnQxNl90ICopJmJ1Zls1XSkpOworfQorCisvKiBwYXJzZSBCQ0NIIGluZm9ybWF0aW9uIElFSSBmcm9tIHdpcmUgZm9ybWF0IHRvIHN0cnVjdCBpcGFjX2JjY2hfaW5mbyAqLworaW50IGlwYWNfcGFyc2VfYmNjaF9pbmZvKHN0cnVjdCBpcGFjX2JjY2hfaW5mbyAqYmluZiwgdV9pbnQ4X3QgKmJ1ZikKK3sKKwl1X2ludDhfdCAqY3VyID0gYnVmOworCXVfaW50MTZfdCBsZW47CisKKwltZW1zZXQoYmluZiwgMCwgc2l6ZW9mKGJpbmYpKTsKKworCWlmIChjdXJbMF0gIT0gTk1fSVBBQ19FSUVfQkNDSF9JTkZPKQorCQlyZXR1cm4gLUVJTlZBTDsKKwljdXIrKzsKKworCWxlbiA9IG50b2hzKCoodV9pbnQxNl90ICopY3VyKTsKKwljdXIgKz0gMjsKKworCWJpbmYtPmluZm9fdHlwZSA9IG50b2hzKCoodV9pbnQxNl90ICopY3VyKTsKKwljdXIgKz0gMjsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfRlJFUV9FUlJfUVVBTCkKKwkJYmluZi0+ZnJlcV9xdWFsID0gKmN1ciA+PiAyOworCisJYmluZi0+YXJmY24gPSAqY3VyKysgJiAzIDw8IDg7CisJYmluZi0+YXJmY24gfD0gKmN1cisrOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9SWExFVikKKwkJYmluZi0+cnhfbGV2ID0gKmN1ciAmIDB4M2Y7CisJY3VyKys7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX1JYUVVBTCkKKwkJYmluZi0+cnhfcXVhbCA9ICpjdXIgJiAweDc7CisJY3VyKys7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX0ZSRVFfRVJSX1FVQUwpCisJCWJpbmYtPmZyZXFfZXJyID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9GUkFNRV9PRkZTRVQpCisJCWJpbmYtPmZyYW1lX29mZnNldCA9IG50b2hzKCoodV9pbnQxNl90ICopY3VyKTsKKwljdXIgKz0gMjsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfRlJBTUVfTlJfT0ZGU0VUKQorCQliaW5mLT5mcmFtZV9ucl9vZmZzZXQgPSBudG9obCgqKHVfaW50MzJfdCAqKWN1cik7CisJY3VyICs9IDQ7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX0JTSUMpCisJCWJpbmYtPmJzaWMgPSAqY3VyICYgMHgzZjsKKwljdXIrKzsKKworCWlwYWNfcGFyc2VfY2dpKCZiaW5mLT5jZ2ksIGN1cik7CisJY3VyICs9IDc7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX05FSUdIX0JBX1NJMikgeworCQltZW1jcHkoYmluZi0+YmFfbGlzdF9zaTIsIGN1ciwgc2l6ZW9mKGJpbmYtPmJhX2xpc3Rfc2kyKSk7CisJCWN1ciArPSBzaXplb2YoYmluZi0+YmFfbGlzdF9zaTIpOworCX0KKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfTkVJR0hfQkFfU0kyYmlzKSB7CisJCW1lbWNweShiaW5mLT5iYV9saXN0X3NpMmJpcywgY3VyLAorCQkJc2l6ZW9mKGJpbmYtPmJhX2xpc3Rfc2kyYmlzKSk7CisJCWN1ciArPSBzaXplb2YoYmluZi0+YmFfbGlzdF9zaTJiaXMpOworCX0KKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfTkVJR0hfQkFfU0kydGVyKSB7CisJCW1lbWNweShiaW5mLT5iYV9saXN0X3NpMnRlciwgY3VyLAorCQkJc2l6ZW9mKGJpbmYtPmJhX2xpc3Rfc2kydGVyKSk7CisJCWN1ciArPSBzaXplb2YoYmluZi0+YmFfbGlzdF9zaTJ0ZXIpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYWJpc19yc2wuYyBiL29wZW5ic2Mvc3JjL2FiaXNfcnNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiMjk4MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2FiaXNfcnNsLmMKQEAgLTAsMCArMSwxNzY1IEBACisvKiBHU00gUmFkaW8gU2lnbmFsbGluZyBMaW5rIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDguNTggdmVyc2lvbiA4LjYuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA1OTYgVjguNi4wICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ic2NfcmxsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21lYXNfcmVwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yc2wuaD4KKworI2RlZmluZSBSU0xfQUxMT0NfU0laRQkJMTAyNAorI2RlZmluZSBSU0xfQUxMT0NfSEVBRFJPT00JMTI4CisKKyNkZWZpbmUgTUFYKGEsIGIpIChhKSA+PSAoYikgPyAoYSkgOiAoYikKKworc3RhdGljIHVfaW50OF90IG1kaXNjX2J5X21zZ3R5cGUodV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJLyogbWFzayBvZmYgdGhlIHRyYW5zcGFyZW50IGJpdCA/ICovCisJbXNnX3R5cGUgJj0gMHhmZTsKKworCWlmICgobXNnX3R5cGUgJiAweGYwKSA9PSAweDAwKQorCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfUkxMOworCWlmICgobXNnX3R5cGUgJiAweGYwKSA9PSAweDEwKSB7CisJCWlmIChtc2dfdHlwZSA+PSAweDE5ICYmIG1zZ190eXBlIDw9IDB4MjIpCisJCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfVFJYOworCQllbHNlCisJCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfQ09NX0NIQU47CisJfQorCWlmICgobXNnX3R5cGUgJiAweGUwKSA9PSAweDIwKQorCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfREVEX0NIQU47CisJCisJcmV0dXJuIEFCSVNfUlNMX01ESVNDX0xPQzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfZGNoYW5faGRyKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoLAorCQkJCSAgdV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJZGgtPmMubXNnX2Rpc2NyID0gbWRpc2NfYnlfbXNndHlwZShtc2dfdHlwZSk7CisJZGgtPmMubXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlkaC0+aWVfY2hhbiA9IFJTTF9JRV9DSEFOX05SOworfQorCisvKiBkZXRlcm1pbmUgbG9naWNhbCBjaGFubmVsIGJhc2VkIG9uIFRSWCBhbmQgY2hhbm5lbCBudW1iZXIgSUUgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2xvb2t1cChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgY2hhbl9ucikKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCB0c19uciA9IGNoYW5fbnIgJiAweDA3OworCXVfaW50OF90IGNiaXRzID0gY2hhbl9uciA+PiAzOworCXVfaW50OF90IGxjaF9pZHg7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW3RzX25yXTsKKworCWlmIChjYml0cyA9PSAweDAxKSB7CisJCWxjaF9pZHggPSAwOwkvKiBUQ0gvRiAqLwkKKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fVENIX0YgJiYKKwkJICAgIHRzLT5wY2hhbiAhPSBHU01fUENIQU5fUERDSCAmJgorCQkgICAgdHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9UQ0hfRl9QRENIKQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJfSBlbHNlIGlmICgoY2JpdHMgJiAweDFlKSA9PSAweDAyKSB7CisJCWxjaF9pZHggPSBjYml0cyAmIDB4MTsJLyogVENIL0ggKi8KKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fVENIX0gpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwl9IGVsc2UgaWYgKChjYml0cyAmIDB4MWMpID09IDB4MDQpIHsKKwkJbGNoX2lkeCA9IGNiaXRzICYgMHgzOwkvKiBTRENDSC80ICovCisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJfSBlbHNlIGlmICgoY2JpdHMgJiAweDE4KSA9PSAweDA4KSB7CisJCWxjaF9pZHggPSBjYml0cyAmIDB4NzsJLyogU0RDQ0gvOCAqLworCQlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QykKKwkJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNoYW5fbnI9MHglMDJ4IGJ1dCBwY2hhbj0ldVxuIiwKKwkJCQljaGFuX25yLCB0cy0+cGNoYW4pOworCX0gZWxzZSBpZiAoY2JpdHMgPT0gMHgxMCB8fCBjYml0cyA9PSAweDExIHx8IGNiaXRzID09IDB4MTIpIHsKKwkJbGNoX2lkeCA9IDA7CisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0ggJiYKKwkJICAgIHRzLT5wY2hhbiAhPSBHU01fUENIQU5fQ0NDSF9TRENDSDQpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwkJLyogRklYTUU6IHdlIHNob3VsZCBub3QgcmV0dXJuIGZpcnN0IHNkY2NoNCAhISEgKi8KKwl9IGVsc2UgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJ1bmtub3duIGNoYW5fbnI9MHglMDJ4XG4iLCBjaGFuX25yKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGNoYW4gPSAmdHMtPmxjaGFuW2xjaF9pZHhdOworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX0xDSEFOLCBsY2hhbik7CisJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfU1VCU0NSLCBsY2hhbi0+Y29ubi5zdWJzY3IpOworCisJcmV0dXJuIGxjaGFuOworfQorCisvKiBTZWUgVGFibGUgMTAuNS4yNSBvZiBHU00wNC4wOCAqLwordV9pbnQ4X3QgbGNoYW4yY2hhbl9ucihjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gbGNoYW4tPnRzOworCXVfaW50OF90IGNiaXRzLCBjaGFuX25yOworCisJc3dpdGNoICh0cy0+cGNoYW4pIHsKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfRjoKKwljYXNlIEdTTV9QQ0hBTl9QRENIOgorCWNhc2UgR1NNX1BDSEFOX1RDSF9GX1BEQ0g6CisJCWNiaXRzID0gMHgwMTsKKwkJYnJlYWs7CisJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCWNiaXRzID0gMHgwMjsKKwkJY2JpdHMgKz0gbGNoYW4tPm5yOworCQlicmVhazsKKwljYXNlIEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINDoKKwkJY2JpdHMgPSAweDA0OworCQljYml0cyArPSBsY2hhbi0+bnI7CisJCWJyZWFrOworCWNhc2UgR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOgorCQljYml0cyA9IDB4MDg7CisJCWNiaXRzICs9IGxjaGFuLT5ucjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwljYXNlIEdTTV9QQ0hBTl9DQ0NIOgorCQljYml0cyA9IDB4MTA7CisJCWJyZWFrOworCX0KKworCWNoYW5fbnIgPSAoY2JpdHMgPDwgMykgfCAodHMtPm5yICYgMHg3KTsKKworCXJldHVybiBjaGFuX25yOworfQorCisvKiBBcyBwZXIgVFMgMDMuMDMgU2VjdGlvbiAyLjIsIHRoZSBJTVNJIGhhcyAnbm90IG1vcmUgdGhhbiAxNSBkaWdpdHMnICovCit1X2ludDY0X3Qgc3RyX3RvX2ltc2koY29uc3QgY2hhciAqaW1zaV9zdHIpCit7CisJdV9pbnQ2NF90IHJldDsKKworCXJldCA9IHN0cnRvdWxsKGltc2lfc3RyLCBOVUxMLCAxMCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBUYWJsZSA1IENsYXVzZSA3IFRTIDA1LjAyICovCit1bnNpZ25lZCBpbnQgbl9wYWdfYmxvY2tzKGludCBic19jY2NoX3NkY2NoX2NvbWIsIHVuc2lnbmVkIGludCBic19hZ19ibGtzX3JlcykKK3sKKwlpZiAoIWJzX2NjY2hfc2RjY2hfY29tYikKKwkJcmV0dXJuIDkgLSBic19hZ19ibGtzX3JlczsKKwllbHNlCisJCXJldHVybiAzIC0gYnNfYWdfYmxrc19yZXM7Cit9CisKKy8qIENoYXB0ZXIgNi41LjIgb2YgVFMgMDUuMDIgKi8KK3Vuc2lnbmVkIGludCBnZXRfY2NjaF9ncm91cCh1X2ludDY0X3QgaW1zaSwgdW5zaWduZWQgaW50IGJzX2NjX2NoYW5zLAorCQkJICAgIHVuc2lnbmVkIGludCBuX3BhZ19ibG9ja3MpCit7CisJcmV0dXJuIChpbXNpICUgMTAwMCkgJSAoYnNfY2NfY2hhbnMgKiBuX3BhZ19ibG9ja3MpIC8gbl9wYWdfYmxvY2tzOworfQorCisvKiBDaGFwdGVyIDYuNS4yIG9mIFRTIDA1LjAyICovCit1bnNpZ25lZCBpbnQgZ2V0X3BhZ2luZ19ncm91cCh1X2ludDY0X3QgaW1zaSwgdW5zaWduZWQgaW50IGJzX2NjX2NoYW5zLAorCQkJICAgICAgaW50IG5fcGFnX2Jsb2NrcykKK3sKKwlyZXR1cm4gKGltc2kgJSAxMDAwKSAlIChic19jY19jaGFucyAqIG5fcGFnX2Jsb2NrcykgJSBuX3BhZ19ibG9ja3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqcnNsX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbShSU0xfQUxMT0NfU0laRSwgUlNMX0FMTE9DX0hFQURST09NLAorCQkJCSAgICJSU0wiKTsKK30KKworI2RlZmluZSBNQUNCTE9DS19TSVpFCTIzCitzdGF0aWMgdm9pZCBwYWRfbWFjYmxvY2sodV9pbnQ4X3QgKm91dCwgY29uc3QgdV9pbnQ4X3QgKmluLCBpbnQgbGVuKQoreworCW1lbWNweShvdXQsIGluLCBsZW4pOworCisJaWYgKGxlbiA8IE1BQ0JMT0NLX1NJWkUpCisJCW1lbXNldChvdXQrbGVuLCAweDJiLCBNQUNCTE9DS19TSVpFLWxlbik7Cit9CisKKy8qIENoYXB0ZXIgOS4zLjc6IEVuY3J5cHRpb24gSW5mb3JtYXRpb24gKi8KK3N0YXRpYyBpbnQgYnVpbGRfZW5jcl9pbmZvKHVfaW50OF90ICpvdXQsIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCSpvdXQrKyA9IGxjaGFuLT5lbmNyLmFsZ19pZCAmIDB4ZmY7CisJaWYgKGxjaGFuLT5lbmNyLmtleV9sZW4pCisJCW1lbWNweShvdXQsIGxjaGFuLT5lbmNyLmtleSwgbGNoYW4tPmVuY3Iua2V5X2xlbik7CisJcmV0dXJuIGxjaGFuLT5lbmNyLmtleV9sZW4gKyAxOworfQorCitzdGF0aWMgdm9pZCBwcmludF9yc2xfY2F1c2UoaW50IGx2bCwgY29uc3QgdV9pbnQ4X3QgKmNhdXNlX3YsIHVfaW50OF90IGNhdXNlX2xlbikKK3sKKwlpbnQgaTsKKworCUxPR1BDKERSU0wsIGx2bCwgIkNBVVNFPTB4JTAyeCglcykgIiwKKwkJY2F1c2VfdlswXSwgcnNsX2Vycl9uYW1lKGNhdXNlX3ZbMF0pKTsKKwlmb3IgKGkgPSAxOyBpIDwgY2F1c2VfbGVuLTE7IGkrKykKKwkJTE9HUEMoRFJTTCwgbHZsLCAiJTAyeCAiLCBjYXVzZV92W2ldKTsKK30KKworLyogU2VuZCBhIEJDQ0hfSU5GTyBtZXNzYWdlIGFzIHBlciBDaGFwdGVyIDguNS4xICovCitpbnQgcnNsX2JjY2hfaW5mbyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwKKwkJICBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YqZGgpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQkNDSF9JTkZPKTsKKwlkaC0+Y2hhbl9uciA9IFJTTF9DSEFOX0JDQ0g7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9TWVNJTkZPX1RZUEUsIHR5cGUpOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9GVUxMX0JDQ0hfSU5GTywgbGVuLCBkYXRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9zYWNjaF9maWxsaW5nKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0eXBlLAorCQkgICAgICBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciAqY2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwljaCA9IChzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqY2gpKTsKKwljaC0+bXNnX2Rpc2NyID0gQUJJU19SU0xfTURJU0NfVFJYOworCWNoLT5tc2dfdHlwZSA9IFJTTF9NVF9TQUNDSF9GSUxMOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfU1lTSU5GT19UWVBFLCB0eXBlKTsKKwltc2diX3RsMTZ2X3B1dChtc2csIFJTTF9JRV9MM19JTkZPLCBsZW4sIGRhdGEpOworCisJbXNnLT50cnggPSB0cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX2NoYW5fYnNfcG93ZXJfY3RybChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdW5zaWduZWQgaW50IGZwYywgaW50IGRiKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2c7CisJdV9pbnQ4X3QgY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJZGIgPSBhYnMoZGIpOworCWlmIChkYiA+IDMwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwlsY2hhbi0+YnNfcG93ZXIgPSBkYi8yOworCWlmIChmcGMpCisJCWxjaGFuLT5ic19wb3dlciB8PSAweDEwOworCQorCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9CU19QT1dFUl9DT05UUk9MKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9CU19QT1dFUiwgbGNoYW4tPmJzX3Bvd2VyKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX2NoYW5fbXNfcG93ZXJfY3RybChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdW5zaWduZWQgaW50IGZwYywgaW50IGRibSkKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwlpbnQgY3RsX2x2bDsKKworCWN0bF9sdmwgPSBtc19wd3JfY3RsX2x2bChsY2hhbi0+dHMtPnRyeC0+YnRzLT5iYW5kLCBkYm0pOworCWlmIChjdGxfbHZsIDwgMCkKKwkJcmV0dXJuIGN0bF9sdmw7CisKKwltc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJbGNoYW4tPm1zX3Bvd2VyID0gY3RsX2x2bDsKKworCWlmIChmcGMpCisJCWxjaGFuLT5tc19wb3dlciB8PSAweDIwOworCQorCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9NU19QT1dFUl9DT05UUk9MKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9NU19QT1dFUiwgbGNoYW4tPm1zX3Bvd2VyKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitzdGF0aWMgaW50IGNoYW5uZWxfbW9kZV9mcm9tX2xjaGFuKHN0cnVjdCByc2xfaWVfY2hhbl9tb2RlICpjbSwKKwkJCQkgICBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwltZW1zZXQoY20sIDAsIHNpemVvZihjbSkpOworCisJLyogRklYTUU6IHdoYXQgdG8gZG8gd2l0aCBkYXRhIGNhbGxzID8gKi8KKwljbS0+ZHR4X2R0dSA9IDB4MDA7CisKKwkvKiBzZXQgVENIIFNwZWVjaC9EYXRhICovCisJY20tPnNwZF9pbmQgPSBsY2hhbi0+cnNsX2Ntb2RlOworCisJaWYgKGxjaGFuLT5yc2xfY21vZGUgPT0gUlNMX0NNT0RfU1BEX1NJR04gJiYKKwkgICAgbGNoYW4tPnRjaF9tb2RlICE9IEdTTTQ4X0NNT0RFX1NJR04pCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgInVuc3VwcG9ydGVkOiByc2xfbW9kZSA9PSBzaWduYWxsaW5nLCAiCisJCQkiYnV0IHRjaF9tb2RlICE9IHNpZ25hbGxpbmdcbiIpOworCisJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCWNhc2UgR1NNX0xDSEFOX1NEQ0NIOgorCQljbS0+Y2hhbl9ydCA9IFJTTF9DTU9EX0NSVF9TRENDSDsKKwkJYnJlYWs7CisJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCWNtLT5jaGFuX3J0ID0gUlNMX0NNT0RfQ1JUX1RDSF9CbTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCWNtLT5jaGFuX3J0ID0gUlNMX0NNT0RfQ1JUX1RDSF9MbTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTENIQU5fTk9ORToKKwljYXNlIEdTTV9MQ0hBTl9VTktOT1dOOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAobGNoYW4tPnRjaF9tb2RlKSB7CisJY2FzZSBHU000OF9DTU9ERV9TSUdOOgorCQljbS0+Y2hhbl9yYXRlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfVjE6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9HU00xOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9HU00yOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVI6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9HU00zOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfMTRrNToKKwkJY20tPmNoYW5fcmF0ZSA9IFJTTF9DTU9EX1NQX05UXzE0azU7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfREFUQV8xMmswOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfTlRfMTJrMDsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzZrMDoKKwkJY20tPmNoYW5fcmF0ZSA9IFJTTF9DTU9EX1NQX05UXzZrMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjEgKi8KKyNpZiAwCitpbnQgcnNsX2NoYW5fYWN0aXZhdGUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IGNoYW5fbnIsCisJCSAgICAgIHVfaW50OF90IGFjdF90eXBlLAorCQkgICAgICBzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSAqY2hhbl9tb2RlLAorCQkgICAgICBzdHJ1Y3QgcnNsX2llX2NoYW5faWRlbnQgKmNoYW5faWRlbnQsCisJCSAgICAgIHVfaW50OF90IGJzX3Bvd2VyLCB1X2ludDhfdCBtc19wb3dlciwKKwkJICAgICAgdV9pbnQ4X3QgdGEpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQ0hBTl9BQ1RJVik7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQUNUX1RZUEUsIGFjdF90eXBlKTsKKwkvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFBoYXNlIDEgKi8KKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9NT0RFLCBzaXplb2YoKmNoYW5fbW9kZSksCisJCSAgICAgKHVfaW50OF90ICopIGNoYW5fbW9kZSk7CisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fSURFTlQsIDQsCisJCSAgICAgKHVfaW50OF90ICopIGNoYW5faWRlbnQpOworI2lmIDAKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRU5DUl9JTkZPLCAxLAorCQkgICAgICh1X2ludDhfdCAqKSAmZW5jcl9pbmZvKTsKKyNlbmRpZgorCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0JTX1BPV0VSLCBic19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfTVNfUE9XRVIsIG1zX3Bvd2VyKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9USU1JTkdfQURWQU5DRSwgdGEpOworCisJbXNnLT50cnggPSB0cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorI2VuZGlmCisKK2ludCByc2xfY2hhbl9hY3RpdmF0ZV9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgYWN0X3R5cGUsCisJCQkgICAgdV9pbnQ4X3QgdGEsIHVfaW50OF90IGhvX3JlZikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCByYzsKKworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwl1X2ludDE2X3QgYXJmY24gPSBsY2hhbi0+dHMtPnRyeC0+YXJmY247CisJc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgY207CisJc3RydWN0IHJzbF9pZV9jaGFuX2lkZW50IGNpOworCisJcmMgPSBjaGFubmVsX21vZGVfZnJvbV9sY2hhbigmY20sIGxjaGFuKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwltZW1zZXQoJmNpLCAwLCBzaXplb2YoY2kpKTsKKwljaS5jaGFuX2Rlc2MuaWVpID0gMHg2NDsKKwljaS5jaGFuX2Rlc2MuY2hhbl9uciA9IGNoYW5fbnI7CisJY2kuY2hhbl9kZXNjLm9jdDMgPSAobGNoYW4tPnRzLT50cngtPmJ0cy0+dHNjIDw8IDUpIHwgKChhcmZjbiAmIDB4M2ZmKSA+PiA4KTsKKwljaS5jaGFuX2Rlc2Mub2N0NCA9IGFyZmNuICYgMHhmZjsKKworCW1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0NIQU5fQUNUSVYpOworCWRoLT5jaGFuX25yID0gY2hhbl9ucjsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0FDVF9UWVBFLCBhY3RfdHlwZSk7CisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTU9ERSwgc2l6ZW9mKGNtKSwKKwkJICAgICAodV9pbnQ4X3QgKikgJmNtKTsKKwkvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFBoYXNlIDEgKi8KKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9JREVOVCwgNCwKKwkJICAgICAodV9pbnQ4X3QgKikgJmNpKTsKKworCWlmIChsY2hhbi0+ZW5jci5hbGdfaWQgPiBSU0xfRU5DX0FMR19BNSgwKSkgeworCQl1X2ludDhfdCBlbmNyX2luZm9bTUFYX0E1X0tFWV9MRU4rMl07CisJCXJjID0gYnVpbGRfZW5jcl9pbmZvKGVuY3JfaW5mbywgbGNoYW4pOworCQlpZiAocmMgPiAwKQorCQkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgcmMsIGVuY3JfaW5mbyk7CisJfQorCisJc3dpdGNoIChhY3RfdHlwZSkgeworCWNhc2UgUlNMX0FDVF9JTlRFUl9BU1lOQzoKKwljYXNlIFJTTF9BQ1RfSU5URVJfU1lOQzoKKwkJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSEFORE9fUkVGLCBob19yZWYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9CU19QT1dFUiwgbGNoYW4tPmJzX3Bvd2VyKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9NU19QT1dFUiwgbGNoYW4tPm1zX3Bvd2VyKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9USU1JTkdfQURWQU5DRSwgdGEpOworCisJaWYgKGxjaGFuLT50Y2hfbW9kZSA9PSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SKQorCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfTVJfQ09ORklHLCBzaXplb2YobGNoYW4tPm1yX2NvbmYpLAorCQkJICAgICAodV9pbnQ4X3QgKikgJmxjaGFuLT5tcl9jb25mKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguNC45OiBNb2RpZnkgY2hhbm5lbCBtb2RlIG9uIEJUUyBzaWRlICovCitpbnQgcnNsX2NoYW5fbW9kZV9tb2RpZnlfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHJjOworCisJdV9pbnQ4X3QgY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCXN0cnVjdCByc2xfaWVfY2hhbl9tb2RlIGNtOworCisJcmMgPSBjaGFubmVsX21vZGVfZnJvbV9sY2hhbigmY20sIGxjaGFuKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwltc2cgPSByc2xfbXNnYl9hbGxvYygpOworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9NT0RFX01PRElGWV9SRVEpOworCWRoLT5jaGFuX25yID0gY2hhbl9ucjsKKworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX01PREUsIHNpemVvZihjbSksCisJCSAgICAgKHVfaW50OF90ICopICZjbSk7CisKKwlpZiAobGNoYW4tPmVuY3IuYWxnX2lkID4gUlNMX0VOQ19BTEdfQTUoMCkpIHsKKwkJdV9pbnQ4X3QgZW5jcl9pbmZvW01BWF9BNV9LRVlfTEVOKzJdOworCQlyYyA9IGJ1aWxkX2VuY3JfaW5mbyhlbmNyX2luZm8sIGxjaGFuKTsKKwkJaWYgKHJjID4gMCkKKwkJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9FTkNSX0lORk8sIHJjLCBlbmNyX2luZm8pOworCX0KKworCWlmIChsY2hhbi0+dGNoX21vZGUgPT0gR1NNNDhfQ01PREVfU1BFRUNIX0FNUikgeworCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfTVJfQ09ORklHLCBzaXplb2YobGNoYW4tPm1yX2NvbmYpLAorCQkJICAgICAodV9pbnQ4X3QgKikgJmxjaGFuLT5tcl9jb25mKTsKKwl9CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjQuNjogU2VuZCB0aGUgZW5jcnlwdGlvbiBjb21tYW5kIHdpdGggZ2l2ZW4gTDMgaW5mbyAqLworaW50IHJzbF9lbmNyeXB0aW9uX2NtZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gbXNnLT5sY2hhbjsKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJdV9pbnQ4X3QgZW5jcl9pbmZvW01BWF9BNV9LRVlfTEVOKzJdOworCXVfaW50OF90IGwzX2xlbiA9IG1zZy0+bGVuOworCWludCByYzsKKworCS8qIEZpcnN0IHB1c2ggdGhlIEwzIElFIHRhZyBhbmQgbGVuZ3RoICovCisJbXNnYl90djE2X3B1c2gobXNnLCBSU0xfSUVfTDNfSU5GTywgbDNfbGVuKTsKKworCS8qIHRoZW4gdGhlIGxpbmsgaWRlbnRpZmllciAoU0FQSTAsIG1haW4gc2lnbiBsaW5rKSAqLworCW1zZ2JfdHZfcHVzaChtc2csIFJTTF9JRV9MSU5LX0lERU5ULCAwKTsKKworCS8qIHRoZW4gZW5jcnlwdGlvbiBpbmZvcm1hdGlvbiAqLworCXJjID0gYnVpbGRfZW5jcl9pbmZvKGVuY3JfaW5mbywgbGNoYW4pOworCWlmIChyYyA8PSAwKQorCQlyZXR1cm4gcmM7CisJbXNnYl90bHZfcHVzaChtc2csIFJTTF9JRV9FTkNSX0lORk8sIHJjLCBlbmNyX2luZm8pOworCisJLyogYW5kIGZpbmFsbHkgdGhlIERDSEFOIGhlYWRlciAqLworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfRU5DUl9DTUQpOworCWRoLT5jaGFuX25yID0gY2hhbl9ucjsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguNC41IC8gNC42OiBEZWFjdGl2YXRlIHRoZSBTQUNDSCBhZnRlciAwNC4wOCBSUiBDSEFOIFJFTEVBU0UgKi8KK2ludCByc2xfZGVhY3Rfc2FjY2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfREVBQ1RJVkFURV9TQUNDSCk7CisJZGgtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJREVCVUdQKERSU0wsICIlcyBERUFDVGl2YXRlIFNBQ0NIIENNRFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pKTsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40LjE0IC8gNC43OiBUZWxsIEJUUyB0byByZWxlYXNlIHRoZSByYWRpbyBjaGFubmVsICovCitpbnQgcnNsX3JmX2NoYW5fcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9SRl9DSEFOX1JFTCk7CisJZGgtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJREVCVUdQKERSU0wsICIlcyBSRiBDaGFubmVsIFJlbGVhc2UgQ01EXG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbikpOworCisJLyogQlRTIHdpbGwgcmVzcG9uZCBieSBSRiBDSEFOIFJFTCBBQ0sgKi8KKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX3BhZ2luZ19jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgcGFnaW5nX2dyb3VwLCB1X2ludDhfdCBsZW4sCisJCSAgIHVfaW50OF90ICptc19pZGVudCwgdV9pbnQ4X3QgY2hhbl9uZWVkZWQpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfUEFHSU5HX0NNRCk7CisJZGgtPmNoYW5fbnIgPSBSU0xfQ0hBTl9QQ0hfQUdDSDsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1BBR0lOR19HUk9VUCwgcGFnaW5nX2dyb3VwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfTVNfSURFTlRJVFksIGxlbi0yLCBtc19pZGVudCsyKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9DSEFOX05FRURFRCwgY2hhbl9uZWVkZWQpOworCisJbXNnLT50cnggPSBidHMtPmMwOworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9wYWdpbmdfY21kX3N1YnNjcihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBjaGFuX25lZWQsCisJCQkgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworI2lmIDAKKwl1X2ludDhfdCBtaVsxMjhdOworCXVuc2lnbmVkIGludCBtaV9sZW47CisJdV9pbnQ4X3QgcGFnaW5nX2dyb3VwOworI2VuZGlmCisKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBpbXNpX3N0cjJiY2QodV9pbnQ4X3QgKmJjZF9vdXQsIGNvbnN0IGNoYXIgKnN0cl9pbikKK3sKKwlpbnQgaSwgbGVuID0gc3RybGVuKHN0cl9pbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaW50IG51bSA9IHN0cl9pbltpXSAtIDB4MzA7CisJCWlmIChudW0gPCAwIHx8IG51bSA+IDkpCisJCQlyZXR1cm4gLTE7CisJCWlmIChpICUgMiA9PSAwKQorCQkJYmNkX291dFtpLzJdID0gbnVtOworCQllbHNlCisJCQliY2Rfb3V0W2kvMl0gfD0gKG51bSA8PCA0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA4LjUuNiAqLworaW50IHJzbF9pbW1fYXNzaWduX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBsZW4sIHVfaW50OF90ICp2YWwpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJdV9pbnQ4X3QgYnVmW01BQ0JMT0NLX1NJWkVdOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0lNTUVESUFURV9BU1NJR05fQ01EKTsKKwlkaC0+Y2hhbl9uciA9IFJTTF9DSEFOX1BDSF9BR0NIOworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfSU1NX0FTU19JTkZPLCBsZW4sIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIElmIHBoYXNlIDIsIGNvbnN0cnVjdCBhIEZVTExfSU1NX0FTU19JTkZPICovCisJCXBhZF9tYWNibG9jayhidWYsIHZhbCwgbGVuKTsKKwkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0ZVTExfSU1NX0FTU19JTkZPLCBNQUNCTE9DS19TSVpFLCBidWYpOworCQlicmVhazsKKwl9CisKKwltc2ctPnRyeCA9IGJ0cy0+YzA7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBTZW5kIFNpZW1lbnMgc3BlY2lmaWMgTVMgUkYgUG93ZXIgQ2FwYWJpbGl0eSBJbmRpY2F0aW9uICovCitpbnQgcnNsX3NpZW1lbnNfbXJwY2koc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCByc2xfbXJwY2kgKm1ycGNpKQoreworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX1NJRU1FTlNfTVJQQ0kpOworCWRoLT5jLm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX0RFRF9DSEFOOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfU0lFTUVOU19NUlBDSSwgKih1X2ludDhfdCAqKW1ycGNpKTsKKworCURFQlVHUChEUlNMLCAiJXMgVFggU2llbWVucyBNUlBDSSAweCUwMnhcbiIsCisJCWdzbV9sY2hhbl9uYW1lKGxjaGFuKSwgKih1X2ludDhfdCAqKW1ycGNpKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisKKy8qIFNlbmQgIkRBVEEgUkVRVUVTVCIgbWVzc2FnZSB3aXRoIGdpdmVuIEwzIEluZm8gcGF5bG9hZCAqLworLyogQ2hhcHRlciA4LjMuMSAqLworaW50IHJzbF9kYXRhX3JlcXVlc3Qoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCkKK3sKKwlpZiAobXNnLT5sY2hhbiA9PSBOVUxMKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNhbm5vdCBzZW5kIERBVEEgUkVRVUVTVCB0byB1bmtub3duIGxjaGFuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcnNsX3JsbF9wdXNoX2wzKG1zZywgUlNMX01UX0RBVEFfUkVRLCBsY2hhbjJjaGFuX25yKG1zZy0+bGNoYW4pLAorCQkJbGlua19pZCwgMSk7CisKKwltc2ctPnRyeCA9IG1zZy0+bGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBTZW5kICJFU1RBQkxJU0ggUkVRVUVTVCIgbWVzc2FnZSB3aXRoIGdpdmVuIEwzIEluZm8gcGF5bG9hZCAqLworLyogQ2hhcHRlciA4LjMuMSAqLworaW50IHJzbF9lc3RhYmxpc2hfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCisJbXNnID0gcnNsX3JsbF9zaW1wbGUoUlNMX01UX0VTVF9SRVEsIGxjaGFuMmNoYW5fbnIobGNoYW4pLAorCQkJICAgICBsaW5rX2lkLCAwKTsKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjMuNyBSZXF1ZXN0IHRoZSByZWxlYXNlIG9mIG11bHRpZnJhbWUgbW9kZSBvZiBSTEwgY29ubmVjdGlvbi4KKyAgIFRoaXMgaXMgd2hhdCBoaWdoZXIgbGF5ZXJzIHNob3VsZCBjYWxsLiAgVGhlIEJUUyB0aGVuIHJlc3BvbmRzIHdpdGgKKyAgIFJFTEVBU0UgQ09ORklSTSwgd2hpY2ggd2UgaW4gdHVybiB1c2UgdG8gdHJpZ2dlciBSU0wgQ0hBTk5FTCBSRUxFQVNFLAorICAgd2hpY2ggaW4gdHVybiBpcyBhY2tub3dsZWRnZWQgYnkgUlNMIENIQU5ORUwgUkVMRUFTRSBBQ0ssIHdoaWNoIGNhbGxzCisgICBsY2hhbl9mcmVlKCkgKi8KK2ludCByc2xfcmVsZWFzZV9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKQoreworCisJc3RydWN0IG1zZ2IgKm1zZzsKKworCW1zZyA9IHJzbF9ybGxfc2ltcGxlKFJTTF9NVF9SRUxfUkVRLCBsY2hhbjJjaGFuX25yKGxjaGFuKSwKKwkJCSAgICAgbGlua19pZCwgMCk7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfUkVMRUFTRV9NT0RFLCAwKTsJLyogbm9ybWFsIHJlbGVhc2UgKi8KKworCS8qIEZJWE1FOiBzdGFydCBzb21lIHRpbWVyIGluIGNhc2Ugd2UgZG9uJ3QgcmVjZWl2ZSBhIFJFTCBBQ0sgPyAqLworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfbGNoYW5fc2V0X3N0YXRlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgc3RhdGUpCit7CisJbGNoYW4tPnN0YXRlID0gc3RhdGU7CisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjI6IENoYW5uZWwgQWN0aXZhdGUgQWNrbm93bGVkZ2UgKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fYWN0X2FjayhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisKKwkvKiBCVFMgaGFzIGNvbmZpcm1lZCBjaGFubmVsIGFjdGl2YXRpb24sIHdlIG5vdyBuZWVkCisJICogdG8gYXNzaWduIHRoZSBhY3RpdmF0ZWQgY2hhbm5lbCB0byB0aGUgTVMgKi8KKwlpZiAocnNsaC0+aWVfY2hhbiAhPSBSU0xfSUVfQ0hBTl9OUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobXNnLT5sY2hhbi0+c3RhdGUgIT0gTENIQU5fU19BQ1RfUkVRKQorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgQ0hBTiBBQ1QgQUNLLCBidXQgc3RhdGUgJXNcbiIsCisJCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSwKKwkJCWdzbV9sY2hhbnNfbmFtZShtc2ctPmxjaGFuLT5zdGF0ZSkpOworCXJzbF9sY2hhbl9zZXRfc3RhdGUobXNnLT5sY2hhbiwgTENIQU5fU19BQ1RJVkUpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX0FDVElWQVRFX0FDSywgbXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA4LjQuMzogQ2hhbm5lbCBBY3RpdmF0ZSBOQUNLICovCitzdGF0aWMgaW50IHJzbF9yeF9jaGFuX2FjdF9uYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBDSEFOTkVMIEFDVElWQVRFIE5BQ0siLAorCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSk7CisKKwkvKiBCVFMgaGFzIHJlamVjdGVkIGNoYW5uZWwgYWN0aXZhdGlvbiA/IT8gKi8KKwlpZiAoZGgtPmllX2NoYW4gIT0gUlNMX0lFX0NIQU5fTlIpCisJCXJldHVybiAtRUlOVkFMOworCisJcnNsX3Rsdl9wYXJzZSgmdHAsIGRoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpkaCkpOworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfQ0FVU0UpKSB7CisJCWNvbnN0IHVfaW50OF90ICpjYXVzZSA9IFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0NBVVNFKTsKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfRVJST1IsIGNhdXNlLAorCQkJCVRMVlBfTEVOKCZ0cCwgUlNMX0lFX0NBVVNFKSk7CisJCWlmICgqY2F1c2UgIT0gUlNMX0VSUl9SQ0hfQUxSX0FDVFZfQUxMT0MpCisJCQlyc2xfbGNoYW5fc2V0X3N0YXRlKG1zZy0+bGNoYW4sIExDSEFOX1NfTk9ORSk7CisJfSBlbHNlCisJCXJzbF9sY2hhbl9zZXRfc3RhdGUobXNnLT5sY2hhbiwgTENIQU5fU19OT05FKTsKKworCUxPR1BDKERSU0wsIExPR0xfRVJST1IsICJcbiIpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX0FDVElWQVRFX05BQ0ssIG1zZy0+bGNoYW4pOworCisJbGNoYW5fZnJlZShtc2ctPmxjaGFuKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA4LjQuNDogQ29ubmVjdGlvbiBGYWlsdXJlIEluZGljYXRpb24gKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2Nvbm5fZmFpbChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJLyogRklYTUU6IHByaW50IHdoaWNoIGNoYW5uZWwgKi8KKwlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgQ09OTkVDVElPTiBGQUlMOiBSRUxFQVNJTkcgIiwKKwkgICAgIGdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pKTsKKworCXJzbF90bHZfcGFyc2UoJnRwLCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfQ0FVU0UpKQorCQlwcmludF9yc2xfY2F1c2UoTE9HTF9OT1RJQ0UsIFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0NBVVNFKSwKKwkJCQlUTFZQX0xFTigmdHAsIFJTTF9JRV9DQVVTRSkpOworCisJTE9HUEMoRFJTTCwgTE9HTF9OT1RJQ0UsICJcbiIpOworCS8qIEZJWE1FOiBvbmx5IGZyZWUgaXQgYWZ0ZXIgY2hhbm5lbCByZWxlYXNlIEFDSyAqLworCWNvdW50ZXJfaW5jKG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yay0+c3RhdHMuY2hhbi5yZl9mYWlsKTsKKwlyZXR1cm4gcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbWVhc19yZXBfdW5pKHN0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyICptcnUsCisJCQkJY29uc3QgY2hhciAqcHJlZml4KQoreworCURFQlVHUEMoRE1FQVMsICJSWEwtRlVMTC0lcz0lM2RkQm0gUlhMLVNVQi0lcz0lM2RkQm0gIiwKKwkJcHJlZml4LCByeGxldjJkYm0obXJ1LT5mdWxsLnJ4X2xldiksCisJCXByZWZpeCwgcnhsZXYyZGJtKG1ydS0+c3ViLnJ4X2xldikpOworCURFQlVHUEMoRE1FQVMsICJSWFEtRlVMTC0lcz0lZCBSWFEtU1VCLSVzPSVkICIsCisJCXByZWZpeCwgbXJ1LT5mdWxsLnJ4X3F1YWwsIHByZWZpeCwgbXJ1LT5zdWIucnhfcXVhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21lYXNfcmVwKHN0cnVjdCBnc21fbWVhc19yZXAgKm1yKQoreworCWludCBpOworCisJREVCVUdQKERNRUFTLCAiTUVBU1VSRU1FTlQgUkVTVUxUIE5SPSVkICIsIG1yLT5ucik7CisKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9ETF9EVFgpCisJCURFQlVHUEMoRE1FQVMsICJEVFhkICIpOworCisJcHJpbnRfbWVhc19yZXBfdW5pKCZtci0+dWwsICJ1bCIpOworCURFQlVHUEMoRE1FQVMsICJCU19QT1dFUj0lZCAiLCBtci0+YnNfcG93ZXIpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX01TX1RPKQorCQlERUJVR1BDKERNRUFTLCAiTVNfVE89JWQgIiwgbXItPm1zX3RpbWluZ19vZmZzZXQpOworCisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfTVNfTDEpIHsKKwkJREVCVUdQQyhETUVBUywgIkwxX01TX1BXUj0lM2RkQm0gIiwgbXItPm1zX2wxLnB3cik7CisJCURFQlVHUEMoRE1FQVMsICJMMV9GUEM9JXUgIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRlBDID8gMSA6IDApOworCQlERUJVR1BDKERNRUFTLCAiTDFfVEE9JXUgIiwgbXItPm1zX2wxLnRhKTsKKwl9CisKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9VTF9EVFgpCisJCURFQlVHUEMoRE1FQVMsICJEVFh1ICIpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0JBMSkKKwkJREVCVUdQQyhETUVBUywgIkJBMSAiKTsKKwlpZiAoIShtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX1ZBTElEKSkKKwkJREVCVUdQQyhETUVBUywgIk5PVCBWQUxJRCAiKTsKKwllbHNlCisJCXByaW50X21lYXNfcmVwX3VuaSgmbXItPmRsLCAiZGwiKTsKKworCURFQlVHUEMoRE1FQVMsICJOVU1fTkVJR0g9JXVcbiIsIG1yLT5udW1fY2VsbCk7CisJaWYgKG1yLT5udW1fY2VsbCA9PSA3KQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IG1yLT5udW1fY2VsbDsgaSsrKSB7CisJCXN0cnVjdCBnc21fbWVhc19yZXBfY2VsbCAqbXJjID0gJm1yLT5jZWxsW2ldOworCQlERUJVR1AoRE1FQVMsICJJRFg9JXUgQVJGQ049JXUgQlNJQz0ldSA9PiAlZCBkQm1cbiIsCisJCQltcmMtPm5laWdoX2lkeCwgbXJjLT5hcmZjbiwgbXJjLT5ic2ljLCByeGxldjJkYm0obXJjLT5yeGxldikpOworCX0KK30KKworc3RhdGljIGludCByc2xfcnhfbWVhc19yZXMoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwICptciA9IGxjaGFuX25leHRfbWVhc19yZXAobXNnLT5sY2hhbik7CisJdV9pbnQ4X3QgbGVuOworCWNvbnN0IHVfaW50OF90ICp2YWw7CisJaW50IHJjOworCisJLyogY2hlY2sgaWYgdGhpcyBjaGFubmVsIGlzIGFjdHVhbGx5IGFjdGl2ZSAqLworCS8qIEZJWE1FOiBtYXliZSB0aGlzIGNoZWNrIHNob3VsZCBiZSB3YXkgbW9yZSBnZW5lcmljL2NlbnRyYWxpemVkICovCisJaWYgKG1zZy0+bGNoYW4tPnN0YXRlICE9IExDSEFOX1NfQUNUSVZFKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlczogTUVBUyBSRVMgZm9yIGluYWN0aXZlIGNoYW5uZWxcbiIsCisJCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSk7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldChtciwgMCwgc2l6ZW9mKCptcikpOworCW1yLT5sY2hhbiA9IG1zZy0+bGNoYW47CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9NRUFTX1JFU19OUikgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9VUExJTktfTUVBUykgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9CU19QT1dFUikpCisJCXJldHVybiAtRUlPOworCisJLyogTWFuZGF0b3J5IFBhcnRzICovCisJbXItPm5yID0gKlRMVlBfVkFMKCZ0cCwgUlNMX0lFX01FQVNfUkVTX05SKTsKKworCWxlbiA9IFRMVlBfTEVOKCZ0cCwgUlNMX0lFX1VQTElOS19NRUFTKTsKKwl2YWwgPSBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9VUExJTktfTUVBUyk7CisJaWYgKGxlbiA+PSAzKSB7CisJCWlmICh2YWxbMF0gJiAweDQwKQorCQkJbXItPmZsYWdzIHw9IE1FQVNfUkVQX0ZfRExfRFRYOworCQltci0+dWwuZnVsbC5yeF9sZXYgPSB2YWxbMF0gJiAweDNmOworCQltci0+dWwuc3ViLnJ4X2xldiA9IHZhbFsxXSAmIDB4M2Y7CisJCW1yLT51bC5mdWxsLnJ4X3F1YWwgPSB2YWxbMl0+PjMgJiAweDc7CisJCW1yLT51bC5zdWIucnhfcXVhbCA9IHZhbFsyXSAmIDB4NzsKKwl9CisKKwltci0+YnNfcG93ZXIgPSAqVExWUF9WQUwoJnRwLCBSU0xfSUVfQlNfUE9XRVIpOworCisJLyogT3B0aW9uYWwgUGFydHMgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX01TX1RJTUlOR19PRkZTRVQpKQorCQltci0+bXNfdGltaW5nX29mZnNldCA9CisJCQkqVExWUF9WQUwoJnRwLCBSU0xfSUVfTVNfVElNSU5HX09GRlNFVCk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0wxX0lORk8pKSB7CisJCXZhbCA9IFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0wxX0lORk8pOworCQltci0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9NU19MMTsKKwkJbXItPm1zX2wxLnB3ciA9IG1zX3B3cl9kYm0obXNnLT50cngtPmJ0cy0+YmFuZCwgdmFsWzBdID4+IDMpOworCQlpZiAodmFsWzBdICYgMHgwNCkKKwkJCW1yLT5mbGFncyB8PSBNRUFTX1JFUF9GX0ZQQzsKKwkJbXItPm1zX2wxLnRhID0gdmFsWzFdOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0wzX0lORk8pKSB7CisJCW1zZy0+bDNoID0gKHVfaW50OF90ICopIFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0wzX0lORk8pOworCQlyYyA9IGdzbTQ4X3BhcnNlX21lYXNfcmVwKG1yLCBtc2cpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0KKworCXByaW50X21lYXNfcmVwKG1yKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9NRUFTX1JFUCwgbXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjcgKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2hhbmRvX2RldChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJREVCVUdQKERSU0wsICIlcyBIQU5ET1ZFUiBERVRFQ1QgIiwgZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbikpOworCisJcnNsX3Rsdl9wYXJzZSgmdHAsIGRoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpkaCkpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9BQ0NFU1NfREVMQVkpKQorCQlERUJVR1BDKERSU0wsICJhY2Nlc3MgZGVsYXkgPSAldVxuIiwKKwkJCSpUTFZQX1ZBTCgmdHAsIFJTTF9JRV9BQ0NFU1NfREVMQVkpKTsKKwllbHNlCisJCURFQlVHUEMoRFJTTCwgIlxuIik7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fSEFORE9WRVJfREVURUNULCBtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2RjaGFuKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCWNoYXIgKnRzX25hbWU7CisKKwltc2ctPmxjaGFuID0gbGNoYW5fbG9va3VwKG1zZy0+dHJ4LCByc2xoLT5jaGFuX25yKTsKKwl0c19uYW1lID0gZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbik7CisKKwlzd2l0Y2ggKHJzbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9DSEFOX0FDVElWX0FDSzoKKwkJREVCVUdQKERSU0wsICIlcyBDSEFOTkVMIEFDVElWQVRFIEFDS1xuIiwgdHNfbmFtZSk7CisJCXJjID0gcnNsX3J4X2NoYW5fYWN0X2Fjayhtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9DSEFOX0FDVElWX05BQ0s6CisJCXJjID0gcnNsX3J4X2NoYW5fYWN0X25hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfQ09OTl9GQUlMOgorCQlyYyA9IHJzbF9yeF9jb25uX2ZhaWwobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfTUVBU19SRVM6CisJCXJjID0gcnNsX3J4X21lYXNfcmVzKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0hBTkRPX0RFVDoKKwkJcmMgPSByc2xfcnhfaGFuZG9fZGV0KG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1JGX0NIQU5fUkVMX0FDSzoKKwkJREVCVUdQKERSU0wsICIlcyBSRiBDSEFOTkVMIFJFTEVBU0UgQUNLXG4iLCB0c19uYW1lKTsKKwkJaWYgKG1zZy0+bGNoYW4tPnN0YXRlICE9IExDSEFOX1NfUkVMX1JFUSkKKwkJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBDSEFOIFJFTCBBQ0sgYnV0IHN0YXRlICVzXG4iLAorCQkJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pLAorCQkJCWdzbV9sY2hhbnNfbmFtZShtc2ctPmxjaGFuLT5zdGF0ZSkpOworCQlyc2xfbGNoYW5fc2V0X3N0YXRlKG1zZy0+bGNoYW4sIExDSEFOX1NfTk9ORSk7CisJCWxjaGFuX2ZyZWUobXNnLT5sY2hhbik7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX01PREVfTU9ESUZZX0FDSzoKKwkJREVCVUdQKERSU0wsICIlcyBDSEFOTkVMIE1PREUgTU9ESUZZIEFDS1xuIiwgdHNfbmFtZSk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX01PREVfTU9ESUZZX05BQ0s6CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIENIQU5ORUwgTU9ERSBNT0RJRlkgTkFDS1xuIiwgdHNfbmFtZSk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfUERDSF9BQ1RfQUNLOgorCQlERUJVR1BDKERSU0wsICIlcyBJUEFDIFBEQ0ggQUNUIEFDS1xuIiwgdHNfbmFtZSk7CisJCW1zZy0+bGNoYW4tPnRzLT5mbGFncyB8PSBUU19GX1BEQ0hfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0FDVF9OQUNLOgorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBJUEFDIFBEQ0ggQUNUIE5BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfREVBQ1RfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIElQQUMgUERDSCBERUFDVCBBQ0tcbiIsIHRzX25hbWUpOworCQltc2ctPmxjaGFuLT50cy0+ZmxhZ3MgJj0gflRTX0ZfUERDSF9NT0RFOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfREVBQ1RfTkFDSzoKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgSVBBQyBQRENIIERFQUNUIE5BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9QSFlfQ09OVEVYVF9DT05GOgorCWNhc2UgUlNMX01UX1BSRVBST0NfTUVBU19SRVM6CisJY2FzZSBSU0xfTVRfVEFMS0VSX0RFVDoKKwljYXNlIFJTTF9NVF9MSVNURU5FUl9ERVQ6CisJY2FzZSBSU0xfTVRfUkVNT1RFX0NPREVDX0NPTkZfUkVQOgorCWNhc2UgUlNMX01UX01SX0NPREVDX01PRF9BQ0s6CisJY2FzZSBSU0xfTVRfTVJfQ09ERUNfTU9EX05BQ0s6CisJY2FzZSBSU0xfTVRfTVJfQ09ERUNfTU9EX1BFUjoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIFVuaW1wbGVtZW50ZWQgQWJpcyBSU0wgRENoYW4gIgorCQkJIm1zZyAweCUwMnhcbiIsIHRzX25hbWUsIHJzbGgtPmMubXNnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgdW5rbm93biBBYmlzIFJTTCBEQ2hhbiBtc2cgMHglMDJ4XG4iLAorCQkJdHNfbmFtZSwgcnNsaC0+Yy5tc2dfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCByc2xfcnhfZXJyb3JfcmVwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBFUlJPUiBSRVBPUlQgIiwgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSk7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgcnNsaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqcnNsaCkpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9DQVVTRSkpCisJCXByaW50X3JzbF9jYXVzZShMT0dMX0VSUk9SLCBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9DQVVTRSksCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKworCUxPR1BDKERSU0wsIExPR0xfRVJST1IsICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfdHJ4KHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAocnNsaC0+bXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9FUlJPUl9SRVBPUlQ6CisJCXJjID0gcnNsX3J4X2Vycm9yX3JlcChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9SRl9SRVNfSU5EOgorCQkvKiBpbnRlcmZlcmVuY2Ugb24gaWRsZSBjaGFubmVscyBvZiBUUlggKi8KKwkJLy9ERUJVR1AoRFJTTCwgIiVzIFJGIFJlc291cmNlIEluZGljYXRpb25cbiIsIGdzbV90cnhfbmFtZShtc2ctPnRyeCkpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9PVkVSTE9BRDoKKwkJLyogaW5kaWNhdGUgQ0NDSCAvIEFDQ0ggLyBwcm9jZXNzb3Igb3ZlcmxvYWQgKi8KKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgQ0NDSC9BQ0NIL0NQVSBPdmVybG9hZFxuIiwKKwkJICAgICBnc21fdHJ4X25hbWUobXNnLT50cngpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIFVua25vd24gQWJpcyBSU0wgVFJYIG1lc3NhZ2UgIgorCQkJInR5cGUgMHglMDJ4XG4iLCBnc21fdHJ4X25hbWUobXNnLT50cngpLCByc2xoLT5tc2dfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qIElmIFQzMTAxIGV4cGlyZXMsIHdlIG5ldmVyIHJlY2VpdmVkIGEgcmVzcG9uc2UgdG8gSU1NRURJQVRFIEFTU0lHTiAqLworc3RhdGljIHZvaWQgdDMxMDFfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gZGF0YTsKKworCXJzbF9yZl9jaGFuX3JlbGVhc2UobGNoYW4pOworfQorCisvKiBNUyBoYXMgcmVxdWVzdGVkIGEgY2hhbm5lbCBvbiB0aGUgUkFDSCAqLworc3RhdGljIGludCByc2xfcnhfY2hhbl9ycWQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT50cngtPmJ0czsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpycWRfaGRyID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCBnc200OF9yZXFfcmVmICpycWRfcmVmOworCXN0cnVjdCBnc200OF9pbW1fYXNzIGlhOworCWVudW0gZ3NtX2NoYW5fdCBsY3R5cGU7CisJZW51bSBnc21fY2hyZXFfcmVhc29uX3QgY2hyZXFfcmVhc29uOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXVfaW50OF90IHJxZF90YTsKKwlpbnQgcmV0OworCisJdV9pbnQxNl90IGFyZmNuOworCXVfaW50OF90IHRzX251bWJlciwgc3ViY2g7CisKKwkvKiBwYXJzZSByZXF1ZXN0IHJlZmVyZW5jZSB0byBiZSB1c2VkIGluIGltbWVkaWF0ZSBhc3NpZ24gKi8KKwlpZiAocnFkX2hkci0+ZGF0YVswXSAhPSBSU0xfSUVfUkVRX1JFRkVSRU5DRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycWRfcmVmID0gKHN0cnVjdCBnc200OF9yZXFfcmVmICopICZycWRfaGRyLT5kYXRhWzFdOworCisJLyogcGFyc2UgYWNjZXNzIGRlbGF5IGFuZCB1c2UgYXMgVEEgKi8KKwlpZiAocnFkX2hkci0+ZGF0YVtzaXplb2Yoc3RydWN0IGdzbTQ4X3JlcV9yZWYpKzFdICE9IFJTTF9JRV9BQ0NFU1NfREVMQVkpCisJCXJldHVybiAtRUlOVkFMOworCXJxZF90YSA9IHJxZF9oZHItPmRhdGFbc2l6ZW9mKHN0cnVjdCBnc200OF9yZXFfcmVmKSsyXTsKKworCS8qIGRldGVybWluZSBjaGFubmVsIHR5cGUgKFNEQ0NIL1RDSF9GL1RDSF9IKSBiYXNlZCBvbgorCSAqIHJlcXVlc3QgcmVmZXJlbmNlIFJBICovCisJbGN0eXBlID0gZ2V0X2N0eXBlX2J5X2NocmVxKGJ0cywgcnFkX3JlZi0+cmEsIGJ0cy0+bmV0d29yay0+bmVjaSk7CisJY2hyZXFfcmVhc29uID0gZ2V0X3JlYXNvbl9ieV9jaHJlcShidHMsIHJxZF9yZWYtPnJhLCBidHMtPm5ldHdvcmstPm5lY2kpOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5jaHJlcS50b3RhbCk7CisKKwkvKiBjaGVjayBhdmFpbGFiaWxpdHkgLyBhbGxvY2F0ZSBjaGFubmVsICovCisJbGNoYW4gPSBsY2hhbl9hbGxvYyhidHMsIGxjdHlwZSk7CisJaWYgKCFsY2hhbikgeworCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiQlRTICVkIENIQU4gUlFEOiBubyByZXNvdXJjZXMgZm9yICVzIDB4JXhcbiIsCisJCSAgICAgbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgZ3NtX2xjaGFudF9uYW1lKGxjdHlwZSksIHJxZF9yZWYtPnJhKTsKKwkJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5jaHJlcS5ub19jaGFubmVsKTsKKwkJLyogRklYTUU6IHNlbmQgc29tZSBraW5kIG9mIHJlamVjdCA/IT8gKi8KKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGxjaGFuLT5zdGF0ZSAhPSBMQ0hBTl9TX05PTkUpCisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBsY2hhbl9hbGxvYygpIHJldHVybmVkIGNoYW5uZWwgIgorCQkgICAgICJpbiBzdGF0ZSAlc1xuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pLAorCQkgICAgIGdzbV9sY2hhbnNfbmFtZShsY2hhbi0+c3RhdGUpKTsKKwlyc2xfbGNoYW5fc2V0X3N0YXRlKGxjaGFuLCBMQ0hBTl9TX0FDVF9SRVEpOworCisJdHNfbnVtYmVyID0gbGNoYW4tPnRzLT5ucjsKKwlhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbjsKKwlzdWJjaCA9IGxjaGFuLT5ucjsKKwkKKwlsY2hhbi0+ZW5jci5hbGdfaWQgPSBSU0xfRU5DX0FMR19BNSgwKTsJLyogbm8gZW5jcnlwdGlvbiAqLworCWxjaGFuLT5tc19wb3dlciA9IG1zX3B3cl9jdGxfbHZsKGJ0cy0+YmFuZCwgYnRzLT5tc19tYXhfcG93ZXIpOworCWxjaGFuLT5ic19wb3dlciA9IDA7IC8qIDBkQiByZWR1Y3Rpb24sIG91dHB1dCBwb3dlciA9IFBuICovCisJbGNoYW4tPnJzbF9jbW9kZSA9IFJTTF9DTU9EX1NQRF9TSUdOOworCWxjaGFuLT50Y2hfbW9kZSA9IEdTTTQ4X0NNT0RFX1NJR047CisJcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4obGNoYW4sIDB4MDAsIHJxZF90YSwgMCk7CisKKwkvKiBjcmVhdGUgSU1NRURJQVRFIEFTU0lHTiAwNC4wOCBtZXNzZ2UgKi8KKwltZW1zZXQoJmlhLCAwLCBzaXplb2YoaWEpKTsKKwlpYS5sMl9wbGVuID0gMHgyZDsKKwlpYS5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWlhLm1zZ190eXBlID0gR1NNNDhfTVRfUlJfSU1NX0FTUzsKKwlpYS5wYWdlX21vZGUgPSBHU000OF9QTV9TQU1FOworCWlhLmNoYW5fZGVzYy5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJaWEuY2hhbl9kZXNjLmgwLmggPSAwOworCWlhLmNoYW5fZGVzYy5oMC5hcmZjbl9oaWdoID0gYXJmY24gPj4gODsKKwlpYS5jaGFuX2Rlc2MuaDAuYXJmY25fbG93ID0gYXJmY24gJiAweGZmOworCWlhLmNoYW5fZGVzYy5oMC50c2MgPSBidHMtPnRzYzsKKwkvKiB1c2UgcmVxdWVzdCByZWZlcmVuY2UgZXh0cmFjdGVkIGZyb20gQ0hBTl9SUUQgKi8KKwltZW1jcHkoJmlhLnJlcV9yZWYsIHJxZF9yZWYsIHNpemVvZihpYS5yZXFfcmVmKSk7CisJaWEudGltaW5nX2FkdmFuY2UgPSBycWRfdGE7CisJaWEubW9iX2FsbG9jX2xlbiA9IDA7CisKKwlERUJVR1AoRFJTTCwgIiVzIEFjdGl2YXRpbmcgQVJGQ04oJXUpIFNTKCV1KSBsY3R5cGUgJXMgIgorCQkicj0lcyByYT0weCUwMnhcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwgYXJmY24sIHN1YmNoLAorCQlnc21fbGNoYW50X25hbWUobGNoYW4tPnR5cGUpLCBnc21fY2hyZXFfbmFtZShjaHJlcV9yZWFzb24pLAorCQlycWRfcmVmLT5yYSk7CisKKwkvKiBTdGFydCB0aW1lciBUMzEwMSB0byB3YWl0IGZvciBHU000OF9NVF9SUl9QQUdfUkVTUCAqLworCWxjaGFuLT5UMzEwMS5jYiA9IHQzMTAxX2V4cGlyZWQ7CisJbGNoYW4tPlQzMTAxLmRhdGEgPSBsY2hhbjsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5UMzEwMSwgYnRzLT5uZXR3b3JrLT5UMzEwMSwgMCk7CisKKwkvKiBzZW5kIElNTUVESUFURSBBU1NJR04gQ01EIG9uIFJTTCB0byBCVFMgKHRvIHNlbmQgb24gQ0NDSCB0byBNUykgKi8KKwlyZXQgPSByc2xfaW1tX2Fzc2lnbl9jbWQoYnRzLCBzaXplb2YoaWEpLCAodV9pbnQ4X3QgKikgJmlhKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIE1TIGhhcyByZXF1ZXN0ZWQgYSBjaGFubmVsIG9uIHRoZSBSQUNIICovCitzdGF0aWMgaW50IHJzbF9yeF9jY2NoX2xvYWQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCXVfaW50MTZfdCBwZ19idWZfc3BhY2U7CisJdV9pbnQxNl90IHJhY2hfc2xvdF9jb3VudCA9IC0xOworCXVfaW50MTZfdCByYWNoX2J1c3lfY291bnQgPSAtMTsKKwl1X2ludDE2X3QgcmFjaF9hY2Nlc3NfY291bnQgPSAtMTsKKworCXN3aXRjaCAocnNsaC0+ZGF0YVswXSkgeworCWNhc2UgUlNMX0lFX1BBR0lOR19MT0FEOgorCQlwZ19idWZfc3BhY2UgPSByc2xoLT5kYXRhWzFdIDw8IDggfCByc2xoLT5kYXRhWzJdOworCQlpZiAoaXNfaXBhY2Nlc3NfYnRzKG1zZy0+dHJ4LT5idHMpICYmIHBnX2J1Zl9zcGFjZSA9PSAweGZmZmYpIHsKKwkJCS8qIHBhZ2luZyBsb2FkIGJlbG93IGNvbmZpZ3VyZWQgdGhyZXNob2xkLCB1c2UgNTAgYXMgZGVmYXVsdCAqLworCQkJcGdfYnVmX3NwYWNlID0gNTA7CisJCX0KKwkJcGFnaW5nX3VwZGF0ZV9idWZmZXJfc3BhY2UobXNnLT50cngtPmJ0cywgcGdfYnVmX3NwYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfSUVfUkFDSF9MT0FEOgorCQlpZiAobXNnLT5kYXRhX2xlbiA+PSA3KSB7CisJCQlyYWNoX3Nsb3RfY291bnQgPSByc2xoLT5kYXRhWzJdIDw8IDggfCByc2xoLT5kYXRhWzNdOworCQkJcmFjaF9idXN5X2NvdW50ID0gcnNsaC0+ZGF0YVs0XSA8PCA4IHwgcnNsaC0+ZGF0YVs1XTsKKwkJCXJhY2hfYWNjZXNzX2NvdW50ID0gcnNsaC0+ZGF0YVs2XSA8PCA4IHwgcnNsaC0+ZGF0YVs3XTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9jY2hhbihzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJzbGgtPmNoYW5fbnIpOworCisJc3dpdGNoIChyc2xoLT5jLm1zZ190eXBlKSB7CisJY2FzZSBSU0xfTVRfQ0hBTl9SUUQ6CisJCS8qIE1TIGhhcyByZXF1ZXN0ZWQgYSBjaGFubmVsIG9uIHRoZSBSQUNIICovCisJCXJjID0gcnNsX3J4X2NoYW5fcnFkKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0NDQ0hfTE9BRF9JTkQ6CisJCS8qIGN1cnJlbnQgbG9hZCBvbiB0aGUgQ0NDSCAqLworCQlyYyA9IHJzbF9yeF9jY2NoX2xvYWQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfREVMRVRFX0lORDoKKwkJLyogQ0NDSCBvdmVybG9hZGVkLCBJTU1fQVNTSUdOIHdhcyBkcm9wcGVkICovCisJY2FzZSBSU0xfTVRfQ0JDSF9MT0FEX0lORDoKKwkJLyogY3VycmVudCBsb2FkIG9uIHRoZSBDQkNIICovCisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJVbmltcGxlbWVudGVkIEFiaXMgUlNMIFRSWCBtZXNzYWdlICIKKwkJCSJ0eXBlIDB4JTAyeFxuIiwgcnNsaC0+Yy5tc2dfdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJVbmtub3duIEFiaXMgUlNMIFRSWCBtZXNzYWdlIHR5cGUgIgorCQkJIjB4JTAyeFxuIiwgcnNsaC0+Yy5tc2dfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCByc2xfcnhfcmxsX2Vycl9pbmQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfcmxsX2hkciAqcmxsaCA9IG1zZ2JfbDIobXNnKTsKKwl1X2ludDhfdCAqcmxtX2NhdXNlID0gcmxsaC0+ZGF0YTsKKworCUxPR1AoRFJMTCwgTE9HTF9FUlJPUiwgIiVzIEVSUk9SIElORElDQVRJT04gY2F1c2U9JXNcbiIsCisJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pLAorCQlyc2xfcmxtX2NhdXNlX25hbWUocmxtX2NhdXNlWzFdKSk7CisKKwlybGxfaW5kaWNhdGlvbihtc2ctPmxjaGFuLCBybGxoLT5saW5rX2lkLCBCU0NfUkxMUl9JTkRfRVJSX0lORCk7CisKKwlpZiAocmxtX2NhdXNlWzFdID09IFJMTF9DQVVTRV9UMjAwX0VYUElSRUQpIHsKKwkJY291bnRlcl9pbmMobXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrLT5zdGF0cy5jaGFuLnJsbF9lcnIpOworCQlyZXR1cm4gcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoJRVNUQUJMSVNIIElORElDQVRJT04sIExPQ0FUSU9OIEFSRUEgVVBEQVRFIFJFUVVFU1QKKwkweDAyLCAweDA2LAorCTB4MDEsIDB4MjAsCisJMHgwMiwgMHgwMCwKKwkweDBiLCAweDAwLCAweDBmLCAweDA1LCAweDA4LCAuLi4gKi8KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9ybGwoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfcmxsX2hkciAqcmxsaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCWNoYXIgKnRzX25hbWU7CisJdV9pbnQ4X3Qgc2FwaSA9IHJsbGgtPmxpbmtfaWQgJiA3OworCisJbXNnLT5sY2hhbiA9IGxjaGFuX2xvb2t1cChtc2ctPnRyeCwgcmxsaC0+Y2hhbl9ucik7CisJdHNfbmFtZSA9IGdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pOworCURFQlVHUChEUkxMLCAiJXMgU0FQST0ldSAiLCB0c19uYW1lLCBzYXBpKTsKKwkKKwlzd2l0Y2ggKHJsbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9EQVRBX0lORDoKKwkJREVCVUdQQyhEUkxMLCAiREFUQSBJTkRJQ0FUSU9OXG4iKTsKKwkJaWYgKG1zZ2JfbDJsZW4obXNnKSA+CisJCSAgICBzaXplb2Yoc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIpICsgc2l6ZW9mKCpybGxoKSAmJgorCQkgICAgcmxsaC0+ZGF0YVswXSA9PSBSU0xfSUVfTDNfSU5GTykgeworCQkJbXNnLT5sM2ggPSAmcmxsaC0+ZGF0YVszXTsKKwkJCXJldHVybiBnc20wNDA4X3Jjdm1zZyhtc2csIHJsbGgtPmxpbmtfaWQpOworCQl9CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0VTVF9JTkQ6CisJCURFQlVHUEMoRFJMTCwgIkVTVEFCTElTSCBJTkRJQ0FUSU9OXG4iKTsKKwkJLyogbGNoYW4gaXMgZXN0YWJsaXNoZWQsIHN0b3AgVDMxMDEgKi8KKwkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX01TOworCQlic2NfZGVsX3RpbWVyKCZtc2ctPmxjaGFuLT5UMzEwMSk7CisJCWlmIChtc2diX2wybGVuKG1zZykgPgorCQkgICAgc2l6ZW9mKHN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyKSArIHNpemVvZigqcmxsaCkgJiYKKwkJICAgIHJsbGgtPmRhdGFbMF0gPT0gUlNMX0lFX0wzX0lORk8pIHsKKwkJCW1zZy0+bDNoID0gJnJsbGgtPmRhdGFbM107CisJCQlyZXR1cm4gZ3NtMDQwOF9yY3Ztc2cobXNnLCBybGxoLT5saW5rX2lkKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJTTF9NVF9FU1RfQ09ORjoKKwkJREVCVUdQQyhEUkxMLCAiRVNUQUJMSVNIIENPTkZJUk1cbiIpOworCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfTkVUOworCQlybGxfaW5kaWNhdGlvbihtc2ctPmxjaGFuLCBybGxoLT5saW5rX2lkLAorCQkJCSAgQlNDX1JMTFJfSU5EX0VTVF9DT05GKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUkVMX0lORDoKKwkJLyogQlRTIGluZm9ybXMgdXMgb2YgaGF2aW5nIHJlY2VpdmVkICBESVNDIGZyb20gTVMgKi8KKwkJREVCVUdQQyhEUkxMLCAiUkVMRUFTRSBJTkRJQ0FUSU9OXG4iKTsKKwkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX1VOVVNFRDsKKwkJcmxsX2luZGljYXRpb24obXNnLT5sY2hhbiwgcmxsaC0+bGlua19pZCwKKwkJCQkgIEJTQ19STExSX0lORF9SRUxfSU5EKTsKKwkJLyogd2UgY2FuIG5vdyByZWxlYWUgdGhlIGNoYW5uZWwgb24gdGhlIEJUUy9BYmlzIHNpZGUgKi8KKwkJLyogRklYTUU6IG9mZmljaWFsbHkgd2UgbmVlZCB0byBzdGFydCBUMzExMSBhbmQgd2FpdCBmb3IKKwkJICogc29tZSBncmFjZSBwZXJpb2QgKi8KKwkJcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUkVMX0NPTkY6CisJCS8qIEJUUyBpbmZvcm1zIHVzIG9mIGhhdmluZyByZWNlaXZlZCBVQSBmcm9tIE1TLAorCQkgKiBpbiByZXNwb25zZSB0byBESVNDIHRoYXQgd2UndmUgc2VudCBlYXJsaWVyICovCisJCURFQlVHUEMoRFJMTCwgIlJFTEVBU0UgQ09ORklSTUFUSU9OXG4iKTsKKwkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX1VOVVNFRDsKKwkJLyogd2UgY2FuIG5vdyByZWxlYWUgdGhlIGNoYW5uZWwgb24gdGhlIEJUUy9BYmlzIHNpZGUgKi8KKwkJLyogRklYTUU6IG9mZmljaWFsbHkgd2UgbmVlZCB0byBzdGFydCBUMzExMSBhbmQgd2FpdCBmb3IKKwkJICogc29tZSBncmFjZSBwZXJpb2QgKi8KKwkJcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfRVJST1JfSU5EOgorCQlyYyA9IHJzbF9yeF9ybGxfZXJyX2luZChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9VTklUX0RBVEFfSU5EOgorCQlMT0dQKERSTEwsIExPR0xfTk9USUNFLCAidW5pbXBsZW1lbnRlZCBBYmlzIFJMTCBtZXNzYWdlICIKKwkJCSJ0eXBlIDB4JTAyeFxuIiwgcmxsaC0+Yy5tc2dfdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJMTCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIEFiaXMgUkxMIG1lc3NhZ2UgIgorCQkJInR5cGUgMHglMDJ4XG4iLCBybGxoLT5jLm1zZ190eXBlKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdV9pbnQ4X3QgaXBhX3Ntb2Rfc19mb3JfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3dpdGNoIChsY2hhbi0+dGNoX21vZGUpIHsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9WMToKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiAweDAwOworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJCXJldHVybiAweDAzOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gMHgwMTsKKwkJLyogdGhlcmUncyBubyBoYWxmLXJhdGUgRUZSICovCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0FNUjoKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiAweDAyOworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJCXJldHVybiAweDA1OworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiQ2Fubm90IGRldGVybWluZSBpcC5hY2Nlc3Mgc3BlZWNoIG1vZGUgZm9yICIKKwkJInRjaF9tb2RlID09IDB4JTAyeFxuIiwgbGNoYW4tPnRjaF9tb2RlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVfaW50OF90IGlwYV9ydHBfcHRfZm9yX2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN3aXRjaCAobGNoYW4tPnRjaF9tb2RlKSB7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfVjE6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gUlRQX1BUX0dTTV9GVUxMOworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJCXJldHVybiBSVFBfUFRfR1NNX0hBTEY7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0VGUjoKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiBSVFBfUFRfR1NNX0VGUjsKKwkJLyogdGhlcmUncyBubyBoYWxmLXJhdGUgRUZSICovCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0FNUjoKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiBSVFBfUFRfQU1SX0ZVTEw7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQkJcmV0dXJuIFJUUF9QVF9BTVJfSEFMRjsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIkNhbm5vdCBkZXRlcm1pbmUgaXAuYWNjZXNzIHJ0cCBwYXlsb2FkIHR5cGUgZm9yICIKKwkJInRjaF9tb2RlID09IDB4JTAyeFxuICYgbGNoYW5fdHlwZSA9PSAlZCIsCisJCWxjaGFuLT50Y2hfbW9kZSwgbGNoYW4tPnR5cGUpOworCXJldHVybiAwOworfQorCisvKiBpcC5hY2Nlc3Mgc3BlY2lmaWMgUlNMIGV4dGVuc2lvbnMgKi8KK3N0YXRpYyB2b2lkIGlwYWNfcGFyc2VfcnRwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHYpCit7CisJc3RydWN0IGluX2FkZHIgaXA7CisJdV9pbnQxNl90IHBvcnQsIGNvbm5faWQ7CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9JUCkpIHsKKwkJaXAuc19hZGRyID0gKigodV9pbnQzMl90ICopIFRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9JUCkpOworCQlERUJVR1BDKERSU0wsICJMT0NBTF9JUD0lcyAiLCBpbmV0X250b2EoaXApKTsKKwkJbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAgPSBudG9obChpcC5zX2FkZHIpOworCX0KKworCWlmIChUTFZQX1BSRVNFTlQodHYsIFJTTF9JRV9JUEFDX0xPQ0FMX1BPUlQpKSB7CisJCXBvcnQgPSAqKCh1X2ludDE2X3QgKikgVExWUF9WQUwodHYsIFJTTF9JRV9JUEFDX0xPQ0FMX1BPUlQpKTsKKwkJcG9ydCA9IG50b2hzKHBvcnQpOworCQlERUJVR1BDKERSU0wsICJMT0NBTF9QT1JUPSV1ICIsIHBvcnQpOworCQlsY2hhbi0+YWJpc19pcC5ib3VuZF9wb3J0ID0gcG9ydDsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19DT05OX0lEKSkgeworCQljb25uX2lkID0gKigodV9pbnQxNl90ICopIFRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19DT05OX0lEKSk7CisJCWNvbm5faWQgPSBudG9ocyhjb25uX2lkKTsKKwkJREVCVUdQQyhEUlNMLCAiQ09OX0lEPSV1ICIsIGNvbm5faWQpOworCQlsY2hhbi0+YWJpc19pcC5jb25uX2lkID0gY29ubl9pZDsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDIpKSB7CisJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMiA9CisJCQkJKlRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDIpOworCQlERUJVR1BDKERSU0wsICJSVFBfUEFZTE9BRDI9MHglMDJ4ICIsCisJCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIpOworCX0KKworCWlmIChUTFZQX1BSRVNFTlQodHYsIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFKSkgeworCQlsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSA9CisJCQkJKlRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERSk7CisJCURFQlVHUEMoRFJTTCwgInNwZWVjaF9tb2RlPTB4JTAyeCAiLAorCQkJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUpOworCX0KKworCWlmIChUTFZQX1BSRVNFTlQodHYsIFJTTF9JRV9JUEFDX1JFTU9URV9JUCkpIHsKKwkJaXAuc19hZGRyID0gKigodV9pbnQzMl90ICopIFRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19SRU1PVEVfSVApKTsKKwkJREVCVUdQQyhEUlNMLCAiUkVNT1RFX0lQPSVzICIsIGluZXRfbnRvYShpcCkpOworCQlsY2hhbi0+YWJpc19pcC5jb25uZWN0X2lwID0gbnRvaGwoaXAuc19hZGRyKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19SRU1PVEVfUE9SVCkpIHsKKwkJcG9ydCA9ICooKHVfaW50MTZfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQpKTsKKwkJcG9ydCA9IG50b2hzKHBvcnQpOworCQlERUJVR1BDKERSU0wsICJSRU1PVEVfUE9SVD0ldSAiLCBwb3J0KTsKKwkJbGNoYW4tPmFiaXNfaXAuY29ubmVjdF9wb3J0ID0gcG9ydDsKKwl9Cit9CisKK2ludCByc2xfaXBhY2NfY3JjeChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9JUEFDX0NSQ1gpOworCWRoLT5jLm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX0lQQUNDRVNTOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwkvKiAweDEtID09IHJlY2VpdmUtb25seSwgMHgtMSA9PSBFRlIgY29kZWMgKi8KKwlsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSA9IDB4MTAgfCBpcGFfc21vZF9zX2Zvcl9sY2hhbihsY2hhbik7CisJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQgPSBpcGFfcnRwX3B0X2Zvcl9sY2hhbihsY2hhbik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERSwgbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQsIGxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkKTsKKworCURFQlVHUChEUlNMLCAiJXMgSVBBQ19CSU5EIHNwZWVjaF9tb2RlPTB4JTAyeCBSVFBfUEFZTE9BRD0lZFxuIiwKKwkJZ3NtX2xjaGFuX25hbWUobGNoYW4pLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSwKKwkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfaXBhY2NfbWRjeChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCwKKwkJICAgdV9pbnQ4X3QgcnRwX3BheWxvYWQyKQoreworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXVfaW50MzJfdCAqYXR0X2lwOworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0lQQUNfTURDWCk7CisJZGgtPmMubXNnX2Rpc2NyID0gQUJJU19SU0xfTURJU0NfSVBBQ0NFU1M7CisJZGgtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCS8qIHdlIG5lZWQgdG8gc3RvcmUgdGhlc2Ugbm93IGFzIE1EQ1hfQUNLIGRvZXMgbm90IHJldHVybiB0aGVtIDooICovCisJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyID0gcnRwX3BheWxvYWQyOworCWxjaGFuLT5hYmlzX2lwLmNvbm5lY3RfcG9ydCA9IHBvcnQ7CisJbGNoYW4tPmFiaXNfaXAuY29ubmVjdF9pcCA9IGlwOworCisJLyogMHgwLSA9PSBib3RoIGRpcmVjdGlvbnMsIDB4LTEgPT0gRUZSIGNvZGVjICovCisJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUgPSAweDAwIHwgaXBhX3Ntb2Rfc19mb3JfbGNoYW4obGNoYW4pOworCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkID0gaXBhX3J0cF9wdF9mb3JfbGNoYW4obGNoYW4pOworCisJaWEuc19hZGRyID0gaHRvbmwoaXApOworCURFQlVHUChEUlNMLCAiJXMgSVBBQ19NRENYIElQPSVzIFBPUlQ9JWQgUlRQX1BBWUxPQUQ9JWQgUlRQX1BBWUxPQUQyPSVkICIKKwkJIkNPTk5fSUQ9JWQgc3BlZWNoX21vZGU9MHglMDJ4XG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbiksCisJCWluZXRfbnRvYShpYSksIHBvcnQsIGxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkLCBydHBfcGF5bG9hZDIsCisJCWxjaGFuLT5hYmlzX2lwLmNvbm5faWQsIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKworCW1zZ2JfdHYxNl9wdXQobXNnLCBSU0xfSUVfSVBBQ19DT05OX0lELCBsY2hhbi0+YWJpc19pcC5jb25uX2lkKTsKKwltc2diX3ZfcHV0KG1zZywgUlNMX0lFX0lQQUNfUkVNT1RFX0lQKTsKKwlhdHRfaXAgPSAodV9pbnQzMl90ICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKGlwKSk7CisJKmF0dF9pcCA9IGlhLnNfYWRkcjsKKwltc2diX3R2MTZfcHV0KG1zZywgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQsIHBvcnQpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUsIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FELCBsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZCk7CisJaWYgKHJ0cF9wYXlsb2FkMikKKwkJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDIsIHJ0cF9wYXlsb2FkMik7CisJCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIHRlbGwgQlRTIHRvIGNvbm5lY3QgUlRQIHN0cmVhbSB0byBvdXIgbG9jYWwgUlRQIHNvY2tldCAqLworaW50IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2soc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IHJ0cF9zb2NrZXQgKnJzID0gbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldDsKKwlpbnQgcmM7CisKKwlyYyA9IHJzbF9pcGFjY19tZGN4KGxjaGFuLCBudG9obChycy0+cnRwLnNpbl9sb2NhbC5zaW5fYWRkci5zX2FkZHIpLAorCQkJCW50b2hzKHJzLT5ydHAuc2luX2xvY2FsLnNpbl9wb3J0KSwKKwkJCS8qIEZJWE1FOiB1c2UgUlRQIHBheWxvYWQgb2YgYm91bmQgc29ja2V0LCBub3QgQlRTKi8KKwkJCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcnNsX2lwYWNjX3BkY2hfYWN0aXZhdGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIGludCBhY3QpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJdV9pbnQ4X3QgbXNnX3R5cGU7CisKKwlpZiAoYWN0KQorCQltc2dfdHlwZSA9IFJTTF9NVF9JUEFDX1BEQ0hfQUNUOworCWVsc2UKKwkJbXNnX3R5cGUgPSBSU0xfTVRfSVBBQ19QRENIX0RFQUNUOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgbXNnX3R5cGUpOworCWRoLT5jLm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX0RFRF9DSEFOOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwlERUJVR1AoRFJTTCwgIiVzIElQQUNfUERDSF8lc0FDVFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pLAorCQlhY3QgPyAiIiA6ICJERSIpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfaXBhY2NfY3JjeF9hY2soc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0djsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisKKwkvKiB0aGUgQlRTIGhhcyBhY2tub3dsZWRnZWQgYSBsb2NhbCBiaW5kLCBpdCBub3cgdGVsbHMgdXMgdGhlIElQCisJKiBhZGRyZXNzIGFuZCBwb3J0IG51bWJlciB0byB3aGljaCBpdCBoYXMgYm91bmQgdGhlIGdpdmVuIGxvZ2ljYWwKKwkqIGNoYW5uZWwgKi8KKworCXJzbF90bHZfcGFyc2UoJnR2LCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHYsIFJTTF9JRV9JUEFDX0xPQ0FMX1BPUlQpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfSVBBQ19MT0NBTF9JUCkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHYsIFJTTF9JRV9JUEFDX0NPTk5fSUQpKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJtYW5kYXRvcnkgSUUgbWlzc2luZyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpcGFjX3BhcnNlX3J0cChsY2hhbiwgJnR2KTsKKworCS8qIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIGRpcmVjdCBCVFMtdG8tQlRTIFJUUCAqLworCWlmICghaXBhY2NfcnRwX2RpcmVjdCkgeworCQlpbnQgcmM7CisJCS8qIHRoZSBCVFMgaGFzIHN1Y2Nlc3NmdWxseSBib3VuZCBhIFRDSCB0byBhIGxvY2FsIGlwL3BvcnQsCisJCSAqIHdoaWNoIG1lYW5zIHdlIGNhbiBjb25uZWN0IG91ciBVRFAgc29ja2V0IHRvIGl0ICovCisJCWlmIChsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KSB7CisJCQlydHBfc29ja2V0X2ZyZWUobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCk7CisJCQlsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0ID0gTlVMTDsKKwkJfQorCisJCWxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQgPSBydHBfc29ja2V0X2NyZWF0ZSgpOworCQlpZiAoIWxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpCisJCQlnb3RvIG91dF9lcnI7CisKKwkJcmMgPSBydHBfc29ja2V0X2Nvbm5lY3QobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwKKwkJCQkgICBsY2hhbi0+YWJpc19pcC5ib3VuZF9pcCwKKwkJCQkgICBsY2hhbi0+YWJpc19pcC5ib3VuZF9wb3J0KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfQUJJU0lQLCBTX0FCSVNJUF9DUkNYX0FDSywgbXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfaXBhY2NfbWRjeF9hY2soc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0djsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisKKwkvKiB0aGUgQlRTIGhhcyBhY2tub3dsZWRnZWQgYSByZW1vdGUgY29ubmVjdCByZXF1ZXN0IGFuZAorCSAqIGl0IG5vdyB0ZWxscyB1cyB0aGUgSVAgYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIgdG8gd2hpY2ggaXQgaGFzCisJICogY29ubmVjdGVkIHRoZSBnaXZlbiBsb2dpY2FsIGNoYW5uZWwgKi8KKworCXJzbF90bHZfcGFyc2UoJnR2LCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKwlpcGFjX3BhcnNlX3J0cChsY2hhbiwgJnR2KTsKKwlkaXNwYXRjaF9zaWduYWwoU1NfQUJJU0lQLCBTX0FCSVNJUF9NRENYX0FDSywgbXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9pcGFjY19kbGN4X2luZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHR2OworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gbXNnLT5sY2hhbjsKKworCXJzbF90bHZfcGFyc2UoJnR2LCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfQ0FVU0UpKQorCQlwcmludF9yc2xfY2F1c2UoTE9HTF9ERUJVRywgVExWUF9WQUwoJnR2LCBSU0xfSUVfQ0FVU0UpLAorCQkJCVRMVlBfTEVOKCZ0diwgUlNMX0lFX0NBVVNFKSk7CisKKwkvKiB0aGUgQlRTIHRlbGxzIHVzIGEgUlRQIHN0cmVhbSBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgKi8KKwlpZiAobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkgeworCQlydHBfc29ja2V0X2ZyZWUobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCk7CisJCWxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQgPSBOVUxMOworCX0KKworCWRpc3BhdGNoX3NpZ25hbChTU19BQklTSVAsIFNfQUJJU0lQX0RMQ1hfSU5ELCBtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKnJsbGggPSBtc2diX2wyKG1zZyk7CisJY2hhciAqdHNfbmFtZTsKKwlpbnQgcmMgPSAwOworCisJbXNnLT5sY2hhbiA9IGxjaGFuX2xvb2t1cChtc2ctPnRyeCwgcmxsaC0+Y2hhbl9ucik7CisJdHNfbmFtZSA9IGdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pOworCQorCXN3aXRjaCAocmxsaC0+Yy5tc2dfdHlwZSkgeworCWNhc2UgUlNMX01UX0lQQUNfQ1JDWF9BQ0s6CisJCURFQlVHUChEUlNMLCAiJXMgSVBBQ19DUkNYX0FDSyAiLCB0c19uYW1lKTsKKwkJcmMgPSBhYmlzX3JzbF9yeF9pcGFjY19jcmN4X2Fjayhtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX0NSQ1hfTkFDSzoKKwkJLyogc29tZWhvdyB0aGUgQlRTIHdhcyB1bmFibGUgdG8gYmluZCB0aGUgbGNoYW4gdG8gaXRzIGxvY2FsCisJCSAqIHBvcnQ/IT8gKi8KKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgSVBBQ19DUkNYX05BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX01EQ1hfQUNLOgorCQkvKiB0aGUgQlRTIHRlbGxzIHVzIHRoYXQgYSBjb25uZWN0IG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCAqLworCQlERUJVR1AoRFJTTCwgIiVzIElQQUNfTURDWF9BQ0sgIiwgdHNfbmFtZSk7CisJCXJjID0gYWJpc19yc2xfcnhfaXBhY2NfbWRjeF9hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19NRENYX05BQ0s6CisJCS8qIHNvbWVob3cgdGhlIEJUUyB3YXMgdW5hYmxlIHRvIGNvbm5lY3QgdGhlIGxjaGFuIHRvIGEgcmVtb3RlCisJCSAqIHBvcnQgKi8KKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgSVBBQ19NRENYX05BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX0RMQ1hfSU5EOgorCQlERUJVR1AoRFJTTCwgIiVzIElQQUNfRExDWF9JTkQgIiwgdHNfbmFtZSk7CisJCXJjID0gYWJpc19yc2xfcnhfaXBhY2NfZGxjeF9pbmQobXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIlVua25vd24gaXAuYWNjZXNzIG1zZ190eXBlIDB4JTAyeFxuIiwKKwkJCXJsbGgtPmMubXNnX3R5cGUpOworCQlicmVhazsKKwl9CisJREVCVUdQQyhEUlNMLCAiXG4iKTsKKworCXJldHVybiByYzsKK30KKworCisvKiBFbnRyeS1wb2ludCB3aGVyZSBMMiBSU0wgZnJvbSBCVFMgZW50ZXJzICovCitpbnQgYWJpc19yc2xfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKnJzbGg7CisJaW50IHJjID0gMDsKKworCWlmICghbXNnKSB7CisJCURFQlVHUChEUlNMLCAiRW1wdHkgUlNMIG1zZz8uLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobXNnYl9sMmxlbihtc2cpIDwgc2l6ZW9mKCpyc2xoKSkgeworCQlERUJVR1AoRFJTTCwgIlRydW5jYXRlZCBSU0wgbWVzc2FnZSB3aXRoIGwybGVuOiAldVxuIiwgbXNnYl9sMmxlbihtc2cpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJzbGggPSBtc2diX2wyKG1zZyk7CisKKwlzd2l0Y2ggKHJzbGgtPm1zZ19kaXNjciAmIDB4ZmUpIHsKKwljYXNlIEFCSVNfUlNMX01ESVNDX1JMTDoKKwkJcmMgPSBhYmlzX3JzbF9yeF9ybGwobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19ERURfQ0hBTjoKKwkJcmMgPSBhYmlzX3JzbF9yeF9kY2hhbihtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX0NPTV9DSEFOOgorCQlyYyA9IGFiaXNfcnNsX3J4X2NjaGFuKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQUJJU19SU0xfTURJU0NfVFJYOgorCQlyYyA9IGFiaXNfcnNsX3J4X3RyeChtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX0xPQzoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgInVuaW1wbGVtZW50ZWQgUlNMIG1zZyBkaXNjIDB4JTAyeFxuIiwKKwkJCXJzbGgtPm1zZ19kaXNjcik7CisJCWJyZWFrOworCWNhc2UgQUJJU19SU0xfTURJU0NfSVBBQ0NFU1M6CisJCXJjID0gYWJpc19yc2xfcnhfaXBhY2MobXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgInVua25vd24gUlNMIG1lc3NhZ2UgZGlzY3JpbWluYXRvciAiCisJCQkiMHglMDJ4XG4iLCByc2xoLT5tc2dfZGlzY3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXNnYl9mcmVlKG1zZyk7CisJcmV0dXJuIHJjOworfQorCisvKiBGcm9tIFRhYmxlIDEwLjUuMzMgb2YgR1NNIDA0LjA4ICovCitpbnQgcnNsX251bWJlcl9vZl9wYWdpbmdfc3ViY2hhbm5lbHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpZiAoYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZiA9PSBSU0xfQkNDSF9DQ0NIX0NPTkZfMV9DKSB7CisJCXJldHVybiBNQVgoMSwgKDMgLSBidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuYnNfYWdfYmxrc19yZXMpKQorCQkJKiAoYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX3BhX21mcm1zICsgMik7CisJfSBlbHNlIHsKKwkJcmV0dXJuICg5IC0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX2FnX2Jsa3NfcmVzKQorCQkJKiAoYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX3BhX21mcm1zICsgMik7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnMxMV9jb25maWcuYyBiL29wZW5ic2Mvc3JjL2JzMTFfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0OTNiNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzMTFfY29uZmlnLmMKQEAgLTAsMCArMSw4NzIgQEAKKy8qIFNpZW1lbnMgQlMtMTEgbWljcm9CVFMgY29uZmlndXJhdGlvbiB0b29sICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBiYXNlZCBvbiBpZGVhcyAoYnV0IG5vdCBjb2RlKSBvZiBCUzExQ29uZmlnCisgKiAoQykgMjAwOSBieSBEaWV0ZXIgU3BhYXIgPHNwYWFyQG1pcmlkZXIuYXVndXN0YS5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9yczIzMi5oPgorCisvKiBzdGF0ZSBvZiBvdXIgYnMxMV9jb25maWcgYXBwbGljYXRpb24gKi8KK2VudW0gYnMxMWNmZ19zdGF0ZSB7CisJU1RBVEVfTk9ORSwKKwlTVEFURV9MT0dPTl9XQUlULAorCVNUQVRFX0xPR09OX0FDSywKKwlTVEFURV9TV0xPQUQsCisJU1RBVEVfUVVFUlksCit9Oworc3RhdGljIGVudW0gYnMxMWNmZ19zdGF0ZSBiczExY2ZnX3N0YXRlID0gU1RBVEVfTk9ORTsKK3N0YXRpYyBjaGFyICpjb21tYW5kLCAqdmFsdWU7CitzdHJ1Y3QgdGltZXJfbGlzdCBzdGF0dXNfdGltZXI7CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBvYmpfbGlfYXR0cltdID0geworCU5NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0gsIDB4MDksIDB4MDAsCisJTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFLCAweDAwLAorCU5NX0FUVF9CUzExX0xJTkVfQ0ZHLCAweDAwLAorfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBvYmpfYmJzaWcwX2F0dHJbXSA9IHsKKwlOTV9BVFRfQlMxMV9SU1NJX09GRlMsIDB4MDIsIDB4MDAsIDB4MDAsCisJTk1fQVRUX0JTMTFfRElWRVJTSVRZLCAweDAxLCAweDAwLAorfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBvYmpfcGEwX2F0dHJbXSA9IHsKKwlOTV9BVFRfQlMxMV9UWFBXUiwgMHgwMSwgQlMxMV9UUlhfUE9XRVJfR1NNXzMwbVcsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKnRyeDFfcGFzc3dvcmQgPSAiMTExMTExMTExMSI7CisjZGVmaW5lIFRFSV9PTUwJMjUKKworc3RhdGljIGNvbnN0IHVfaW50OF90IHRvb19mYXN0W10gPSB7IDB4MTIsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIgfTsKKworc3RhdGljIHN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisvKiBkdW1teSBmdW5jdGlvbiB0byBrZWVwIGdzbV9kYXRhLmMgaGFwcHkgKi8KK3N0cnVjdCBjb3VudGVyICpjb3VudGVyX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBoYW5kbGVfc2VyaWFsX21zZyhzdHJ1Y3QgbXNnYiAqcnhfbXNnKTsKKworLyogY3JlYXRlIGFsbCBvYmplY3RzIGZvciBhbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBpbnQgY3JlYXRlX29iamVjdHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlmcHJpbnRmKHN0ZG91dCwgIkNyYXRpbmcgT2JqZWN0cyBmb3IgbWluaW1hbCBjb25maWdcbiIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfTEksIDAsIHNpemVvZihvYmpfbGlfYXR0ciksCisJCQkJICAgb2JqX2xpX2F0dHIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfR1BTVSwgMCwgMCwgTlVMTCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9BTENPLCAwLCAwLCBOVUxMKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0NDTEssIDAsIDAsIE5VTEwpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfQkJTSUcsIDAsCisJCQkJICAgc2l6ZW9mKG9ial9iYnNpZzBfYXR0ciksIG9ial9iYnNpZzBfYXR0cik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9QQSwgMCwKKwkJCQkgICBzaXplb2Yob2JqX3BhMF9hdHRyKSwgb2JqX3BhMF9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShidHMsIDEpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfZW52YUJUU0UoYnRzLCAyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMyk7CisKKwlhYmlzX25tX2JzMTFfY29ubl9vbWxfdGVpKGJ0cywgMCwgMSwgMHhmZiwgVEVJX09NTCk7CisKKwlhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihidHMtPmMwLCBCUzExX1RSWF9QT1dFUl9HU01fMzBtVyk7CisJCisJc2xlZXAoMSk7CisKKwlhYmlzX25tX2JzMTFfc2V0X3RyeDFfcHcoYnRzLCB0cngxX3Bhc3N3b3JkKTsKKworCXNsZWVwKDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX3RyeDEoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwl1X2ludDhfdCBiYnNpZzFfYXR0cltzaXplb2Yob2JqX2Jic2lnMF9hdHRyKSsxMl07CisJdV9pbnQ4X3QgKmN1ciA9IGJic2lnMV9hdHRyOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgMSk7CisKKwlpZiAoIXRyeCkKKwkJdHJ4ID0gZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKworCWZwcmludGYoc3Rkb3V0LCAiQ3JhdGluZyBPYmplY3RzIGZvciBUUlgxXG4iKTsKKworCWFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhidHMsIHRyeDFfcGFzc3dvcmQpOworCisJc2xlZXAoMSk7CisKKwljdXIgPSB0bHZfcHV0KGN1ciwgTk1fQVRUX0JTMTFfUEFTU1dPUkQsIDEwLAorCQkgICAgICAodV9pbnQ4X3QgKil0cngxX3Bhc3N3b3JkKTsKKwltZW1jcHkoY3VyLCBvYmpfYmJzaWcwX2F0dHIsIHNpemVvZihvYmpfYmJzaWcwX2F0dHIpKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0JCU0lHLCAxLAorCQkJCSAgIHNpemVvZihiYnNpZzFfYXR0ciksIGJic2lnMV9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX1BBLCAxLAorCQkJCSAgIHNpemVvZihvYmpfcGEwX2F0dHIpLCBvYmpfcGEwX2F0dHIpOworCWFiaXNfbm1fYnMxMV9zZXRfdHJ4X3Bvd2VyKHRyeCwgQlMxMV9UUlhfUE9XRVJfR1NNXzMwbVcpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqc2VyaWFsX3BvcnQgPSAiL2Rldi90dHlVU0IwIjsKK3N0YXRpYyBjaGFyICpmbmFtZV9zYWZldHkgPSAiQlRTQk1DNzYuU1dJIjsKK3N0YXRpYyBjaGFyICpmbmFtZV9zb2Z0d2FyZSA9ICJIUzAxMTEwNi5TV0wiOworc3RhdGljIGludCBkZWxheV9tcyA9IDA7CitzdGF0aWMgaW50IHdpbl9zaXplID0gODsKK3N0YXRpYyBpbnQgcGFyYW1fZGlzY29ubmVjdCA9IDA7CitzdGF0aWMgaW50IHBhcmFtX3Jlc3RhcnQgPSAwOworc3RhdGljIGludCBwYXJhbV9mb3JjZWQgPSAwOworc3RhdGljIHN0cnVjdCBnc21fYnRzICpnX2J0czsKKworc3RhdGljIGludCBmaWxlX2lzX3JlYWRhYmxlKGNvbnN0IGNoYXIgKmZuYW1lKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCXJjID0gc3RhdChmbmFtZSwgJnN0KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmIChTX0lTUkVHKHN0LnN0X21vZGUpICYmIChzdC5zdF9tb2RlICYgU19JUlVTUikpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGVyY2VudDsKK3N0YXRpYyBpbnQgcGVyY2VudF9vbGQ7CisKKy8qIGNhbGxiYWNrIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgQUJJUyBPTUwgY29kZSAqLworc3RhdGljIGludCBzd2xvYWRfY2Jmbih1bnNpZ25lZCBpbnQgaG9vaywgdW5zaWduZWQgaW50IGV2ZW50LCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkgICAgICAgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJaWYgKGhvb2sgIT0gR1NNX0hPT0tfTk1fU1dMT0FEKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJCWZwcmludGYoc3Rkb3V0LCAiU29mdHdhcmUgTG9hZCBJbml0aWF0ZSBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBTb2Z0d2FyZSBMb2FkIEluaXRpYXRlIE5BQ0tcbiIpOworCQlleGl0KDUpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJaWYgKGRhdGEpIHsKKwkJCS8qIHdlIGRpZCBhIHNhZmV0eSBsb2FkIGFuZCBtdXN0IGFjdGl2YXRlIGl0ICovCisJCQlhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKGdfYnRzLCBmbmFtZV9zYWZldHksCisJCQkJCQkgIHN3bG9hZF9jYmZuLCBnX2J0cyk7CisJCQlzbGVlcCg1KTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IFNvZnR3YXJlIExvYWQgRW5kIE5BQ0tcbiIpOworCQlleGl0KDMpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IEFjdGl2YXRlIFNvZnR3YXJlIE5BQ0tcbiIpOworCQlleGl0KDQpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX0FDSzoKKwkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX05PTkU7CisJCQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwkJcGVyY2VudCA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoZ19idHMpOworCQlpZiAocGVyY2VudCA+IHBlcmNlbnRfb2xkKQorCQkJcHJpbnRmKCJTb2Z0d2FyZSBEb3dubG9hZCBQcm9ncmVzczogJWQlJVxuIiwgcGVyY2VudCk7CisJCXBlcmNlbnRfb2xkID0gcGVyY2VudDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnMxMV9saW5rX3N0YXRlW10gPSB7CisJWzB4MDBdCT0gIkRvd24iLAorCVsweDAxXQk9ICJVcCIsCisJWzB4MDJdCT0gIlJlc3RvcmluZyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbGlua3N0YXRlX25hbWUodV9pbnQ4X3QgbGlua3N0YXRlKQoreworCWlmIChsaW5rc3RhdGUgPiBBUlJBWV9TSVpFKGJzMTFfbGlua19zdGF0ZSkpCisJCXJldHVybiAiVW5rbm93biI7CisKKwlyZXR1cm4gYnMxMV9saW5rX3N0YXRlW2xpbmtzdGF0ZV07Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptYmNjdV9sb2FkW10gPSB7CisJWzBdCT0gIk5vIExvYWQiLAorCVsxXQk9ICJMb2FkIEJUU0NBQyIsCisJWzJdCT0gIkxvYWQgQlRTRFJYIiwKKwlbM10JPSAiTG9hZCBCVFNCQlgiLAorCVs0XQk9ICJMb2FkIEJUU0FSQyIsCisJWzVdCT0gIkxvYWQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm1iY2N1X2xvYWRfbmFtZSh1X2ludDhfdCBsaW5rc3RhdGUpCit7CisJaWYgKGxpbmtzdGF0ZSA+IEFSUkFZX1NJWkUobWJjY3VfbG9hZCkpCisJCXJldHVybiAiVW5rbm93biI7CisKKwlyZXR1cm4gbWJjY3VfbG9hZFtsaW5rc3RhdGVdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnRzX3BoYXNlX25hbWUodV9pbnQ4X3QgcGhhc2UpCit7CisJc3dpdGNoIChwaGFzZSkgeworCWNhc2UgQlMxMV9TVEFURV9XQVJNX1VQOgorCWNhc2UgQlMxMV9TVEFURV9XQVJNX1VQXzI6CisJCXJldHVybiAiV2FybSBVcCI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9TQUZFVFk6CisJCXJldHVybiAiTG9hZCBTTVUgU2FmZXR5IjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0xPQURfU01VX0lOVEVOREVEOgorCQlyZXR1cm4gIkxvYWQgU01VIEludGVuZGVkIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0xPQURfTUJDQ1U6CisJCXJldHVybiAiTG9hZCBNQkNDVSI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9TT0ZUV0FSRV9SUUQ6CisJCXJldHVybiAiU29mdHdhcmUgcmVxdWlyZWQiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHOgorCWNhc2UgQlMxMV9TVEFURV9XQUlUX01JTl9DRkdfMjoKKwkJcmV0dXJuICJXYWl0IG1pbmltYWwgY29uZmlnIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX01BSU5URU5BTkNFOgorCQlyZXR1cm4gIk1haW50ZW5hbmNlIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX05PUk1BTDoKKwkJcmV0dXJuICJOb3JtYWwiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfQUJJU19MT0FEOgorCQlyZXR1cm4gIkFiaXMgbG9hZCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAiVW5rbm93biI7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRyeF9wb3dlcl9uYW1lKHVfaW50OF90IHB3cikKK3sKKwlzd2l0Y2ggKHB3cikgeworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzJXOgkKKwkJcmV0dXJuICIyVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9HU01fMjUwbVc6CisJCXJldHVybiAiMjUwbVcgKEdTTSkiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzgwbVc6CisJCXJldHVybiAiODBtVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9HU01fMzBtVzoKKwkJcmV0dXJuICIzMG1XIChHU00pIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU18zVzoKKwkJcmV0dXJuICIzVyAoRENTKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9EQ1NfMVc2OgorCQlyZXR1cm4gIjEuNlcgKERDUykiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfRENTXzUwMG1XOgorCQlyZXR1cm4gIjUwMG1XIChEQ1MpIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU18xNjBtVzoKKwkJcmV0dXJuICIxNjBtVyAoRENTKSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIHZhbHVlIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwbGxfbW9kZV9uYW1lKHVfaW50OF90IG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBCUzExX0xJX1BMTF9MT0NLRUQ6CisJCXJldHVybiAiRTEgTG9ja2VkIjsKKwljYXNlIEJTMTFfTElfUExMX1NUQU5EQUxPTkU6CisJCXJldHVybiAiU3RhbmRhbG9uZSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjY2xrX2FjY19uYW1lKHVfaW50OF90IGFjYykKK3sKKwlzd2l0Y2ggKGFjYykgeworCWNhc2UgMDoKKwkJLyogT3V0IG9mIHRoZSBkZW1hbmRlZCArLy0gMC4wNXBwbSAqLworCQlyZXR1cm4gIk1lZGl1bSI7CisJY2FzZSAxOgorCQkvKiBTeW5jaHJvbml6ZWQgd2l0aCBBYmlzLCB3aXRoaW4gZGVtYW5kZWQgdG9sZXJhbmNlICsvLSAwLjA1cHBtICovCisJCXJldHVybiAiSGlnaCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpvYmpfbmFtZShzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2gpCit7CisJc3RhdGljIGNoYXIgcmV0YnVmWzI1Nl07CisKKwlyZXRidWZbMF0gPSAwOworCisJc3dpdGNoIChmb2gtPm9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQlMxMToKKwkJc3RyY2F0KHJldGJ1ZiwgIkJTMTEgIik7CisJCXN3aXRjaCAoZm9oLT5vYmpfaW5zdC5idHNfbnIpIHsKKwkJY2FzZSBCUzExX09CSl9QQToKKwkJCXNwcmludGYocmV0YnVmK3N0cmxlbihyZXRidWYpLCAiUG93ZXIgQW1wbGlmaWVyICVkICIsCisJCQkJZm9oLT5vYmpfaW5zdC50c19ucik7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9MSToKKwkJCXNwcmludGYocmV0YnVmK3N0cmxlbihyZXRidWYpLCAiTGluZSBJbnRlcmZhY2UgIik7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9DQ0xLOgorCQkJc3ByaW50ZihyZXRidWYrc3RybGVuKHJldGJ1ZiksICJDQ0xLICIpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19TSVRFX01BTkFHRVI6CisJCXN0cmNhdChyZXRidWYsICJTSVRFIE1BTkFHRVIgIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0YnVmOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0ZShzdHJ1Y3QgdGx2X3BhcnNlZCAqdHApCit7CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSkgeworCQl1X2ludDhfdCBwaGFzZSwgbWJjY3U7CisJCWlmIChUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSA+PSAxKSB7CisJCQlwaGFzZSA9ICpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKTsKKwkJCXByaW50ZigiUEhBU0U6ICV1ICUtMjBzICIsIHBoYXNlICYgMHhmLAorCQkJCWJ0c19waGFzZV9uYW1lKHBoYXNlKSk7CisJCX0KKwkJaWYgKFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpID49IDIpIHsKKwkJCW1iY2N1ID0gKihUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSsxKTsKKwkJCXByaW50ZigiTUJDQ1UwOiAlLTExcyBNQkNDVTE6ICUtMTFzICIsCisJCQkJbWJjY3VfbG9hZF9uYW1lKG1iY2N1ICYgMHhmKSwgbWJjY3VfbG9hZF9uYW1lKG1iY2N1ID4+IDQpKTsKKwkJfQorCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9FMV9TVEFURSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX0UxX1NUQVRFKSA+PSAxKSB7CisJCXVfaW50OF90IGUxX3N0YXRlID0gKlRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9FMV9TVEFURSk7CisJCXByaW50ZigiQWJpcy1saW5rOiAlLTlzICIsIGxpbmtzdGF0ZV9uYW1lKGUxX3N0YXRlICYgMHhmKSk7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIGludCBwcmludF9hdHRyKHN0cnVjdCB0bHZfcGFyc2VkICp0cCkKK3sKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCkpIHsKKwkJcHJpbnRmKCJcdEJTLTExIEVTTiBQQ0IgU2VyaWFsIE51bWJlcjogJXNcbiIsCisJCQlUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwpKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8pKSB7CisJCXByaW50ZigiXHRCUy0xMSBFU04gSGFyZHdhcmUgQ29kZSBOdW1iZXI6ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PKSs2KTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8pKSB7CisJCXByaW50ZigiXHRCUy0xMSBFU04gRmlybXdhcmUgQ29kZSBOdW1iZXI6ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PKSs2KTsKKwl9CisjaWYgMAorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUykpIHsKKwkJcHJpbnRmKCJCUy0xMSBCb290IFNvZnR3YXJlIFZlcnNpb246ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUykrNik7CisJfQorI2VuZGlmCisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0FCSVNfQ0hBTk5FTCkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9BQklTX0NIQU5ORUwpID49IDMpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKmNoYW4gPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0FCSVNfQ0hBTk5FTCk7CisJCXByaW50ZigiXHRFMSBDaGFubmVsOiBQb3J0PSV1IFRpbWVzbG90PSV1ICIsCisJCQljaGFuWzBdLCBjaGFuWzFdKTsKKwkJaWYgKGNoYW5bMl0gPT0gMHhmZikKKwkJCXByaW50ZigiKEZ1bGwgU2xvdClcbiIpOworCQllbHNlCisJCQlwcmludGYoIlN1YnNsb3Q9JXVcbiIsIGNoYW5bMl0pOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfVEVJKSkKKwkJcHJpbnRmKCJcdFRFSTogJWRcbiIsICpUTFZQX1ZBTCh0cCwgTk1fQVRUX1RFSSkpOworCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX1RYUFdSKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfVFhQV1IpID49IDEpIHsKKwkJcHJpbnRmKCJcdFRSWCBQb3dlcjogJXNcbiIsCisJCQl0cnhfcG93ZXJfbmFtZSgqVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX1RYUFdSKSkpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9QTExfTU9ERSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX1BMTF9NT0RFKSA+PSAxKSB7CisJCXByaW50ZigiXHRQTEwgTW9kZTogJXNcbiIsCisJCQlwbGxfbW9kZV9uYW1lKCpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfUExMX01PREUpKSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX1BMTCkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX1BMTCkgPj0gNCkgeworCQljb25zdCB1X2ludDhfdCAqdnAgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfUExMKTsKKwkJcHJpbnRmKCJcdFBMTCBTZXQgVmFsdWU9JWQsIFdvcmsgVmFsdWU9JWRcbiIsCisJCQl2cFswXSA8PCA4IHwgdnBbMV0sIHZwWzJdIDw8IDggfCB2cFszXSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1kpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZKSA+PSAxKSB7CisJCWNvbnN0IHVfaW50OF90ICphY2MgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSk7CisJCXByaW50ZigiXHRDQ0xLIEFjY3VyYWN5OiAlcyAoJWQpXG4iLCBjY2xrX2FjY19uYW1lKCphY2MpLCAqYWNjKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKSA+PSAxKSB7CisJCWNvbnN0IHVfaW50OF90ICphY2MgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKTsKKwkJcHJpbnRmKCJcdENDTEsgVHlwZT0lZFxuIiwgKmFjYyk7CisJfQorCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY21kX3F1ZXJ5KHZvaWQpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBnX2J0cy0+YzA7CisKKwliczExY2ZnX3N0YXRlID0gU1RBVEVfUVVFUlk7CisJYWJpc19ubV9iczExX2dldF9zZXJubyhnX2J0cyk7CisJYWJpc19ubV9iczExX2dldF9vbWxfdGVpX3RzKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X3BsbF9tb2RlKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X2NjbGsoZ19idHMpOworCWFiaXNfbm1fYnMxMV9nZXRfdHJ4X3Bvd2VyKHRyeCk7CisJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGdfYnRzLCAxKTsKKwlpZiAodHJ4KQorCQlhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcih0cngpOworCXNsZWVwKDEpOworCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwljb21tYW5kID0gTlVMTDsKK30KKworLyogaGFuZGxlIGEgcmVzcG9uc2UgZnJvbSB0aGUgQlRTIHRvIGEgR0VUIFNUQVRFIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3N0YXRlX3Jlc3AoZW51bSBhYmlzX2JzMTFfcGhhc2Ugc3RhdGUpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEJTMTFfU1RBVEVfV0FSTV9VUDoKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZOgorCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9JTlRFTkRFRDoKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9NQkNDVToKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1NPRlRXQVJFX1JRRDoKKwkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX1NXTE9BRDsKKwkJLyogc2VuZCBzYWZldHkgbG9hZC4gVXNlIGdfYnRzIGFzIHByaXZhdGUgJ3BhcmFtJworCQkgKiBhcmd1bWVudCwgc28gb3VyIHN3bG9hZF9jYmZuIGNhbiBkaXN0aW5ndWlzaAorCQkgKiBhIHNhZmV0eSBsb2FkIGZyb20gYSByZWd1bGFyIHNvZnR3YXJlICovCisJCWlmIChmaWxlX2lzX3JlYWRhYmxlKGZuYW1lX3NhZmV0eSkpCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChnX2J0cywgZm5hbWVfc2FmZXR5LAorCQkJCQkJICAgd2luX3NpemUsIHBhcmFtX2ZvcmNlZCwKKwkJCQkJCSAgIHN3bG9hZF9jYmZuLCBnX2J0cyk7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiTm8gdmFsaWQgU2FmZXR5IExvYWQgZmlsZSBcIiVzXCJcbiIsCisJCQkJZm5hbWVfc2FmZXR5KTsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1dBSVRfTUlOX0NGRzoKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHXzI6CisJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9TV0xPQUQ7CisJCXJjID0gY3JlYXRlX29iamVjdHMoZ19idHMpOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfTUFJTlRFTkFOQ0U6CisJCWlmIChjb21tYW5kKSB7CisJCQlpZiAoIXN0cmNtcChjb21tYW5kLCAiZGlzY29ubmVjdCIpKQorCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInJlY29ubmVjdCIpKQorCQkJCXJjID0gYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KGdfYnRzLCAxKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInNvZnR3YXJlIikKKwkJCSAgICAmJiBiczExY2ZnX3N0YXRlICE9IFNUQVRFX1NXTE9BRCkgeworCQkJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9TV0xPQUQ7CisJCQkJLyogc2VuZCBzb2Z0d2FyZSAoRklYTUU6IG92ZXIgQS1iaXM/KSAqLworCQkJCWlmIChmaWxlX2lzX3JlYWRhYmxlKGZuYW1lX3NvZnR3YXJlKSkKKwkJCQkJcmMgPSBhYmlzX25tX2JzMTFfbG9hZF9zd2woZ19idHMsIGZuYW1lX3NvZnR3YXJlLAorCQkJCQkJCQkgICB3aW5fc2l6ZSwgcGFyYW1fZm9yY2VkLAorCQkJCQkJCQkgICBzd2xvYWRfY2Jmbik7CisJCQkJZWxzZQorCQkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHZhbGlkIFNvZnR3YXJlIGZpbGUgXCIlc1wiXG4iLAorCQkJCQkJZm5hbWVfc29mdHdhcmUpOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkZWxldGUtdHJ4MSIpKSB7CisJCQkJcHJpbnRmKCJMb2NpbmcgQkJTSUcgYW5kIFBBIG9iamVjdHMgb2YgVFJYMVxuIik7CisJCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGdfYnRzLCBOTV9PQ19CUzExLAorCQkJCQkJICAgICAgQlMxMV9PQkpfQkJTSUcsIDAsIDEsCisJCQkJCQkgICAgICBOTV9TVEFURV9MT0NLRUQpOworCQkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShnX2J0cywgTk1fT0NfQlMxMSwKKwkJCQkJCSAgICAgIEJTMTFfT0JKX1BBLCAwLCAxLAorCQkJCQkJICAgICAgTk1fU1RBVEVfTE9DS0VEKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlwcmludGYoIkRlbGV0aW5nIEJCU0lHIGFuZCBQQSBvYmplY3RzIG9mIFRSWDFcbiIpOworCQkJCWFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KGdfYnRzLCBCUzExX09CSl9CQlNJRywgMSk7CisJCQkJYWJpc19ubV9iczExX2RlbGV0ZV9vYmplY3QoZ19idHMsIEJTMTFfT0JKX1BBLCAxKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImNyZWF0ZS10cngxIikpIHsKKwkJCQljcmVhdGVfdHJ4MShnX2J0cyk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtZTEtbG9ja2VkIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X3BsbF9sb2NrZWQoZ19idHMsIDEpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicGxsLXN0YW5kYWxvbmUiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsX2xvY2tlZChnX2J0cywgMCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtc2V0dmFsdWUiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsKGdfYnRzLCBhdG9pKHZhbHVlKSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtd29ya3ZhbHVlIikpIHsKKwkJCQkvKiBUbyBzZXQgdGhlIHdvcmsgdmFsdWUgd2UgbmVlZCB0byBsb2dpbiBhcyBGSUVMRCAqLworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX3NldF9wbGwoZ19idHMsIGF0b2kodmFsdWUpKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgIm9tbC10ZWkiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9jb25uX29tbF90ZWkoZ19idHMsIDAsIDEsIDB4ZmYsIFRFSV9PTUwpOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJyZXN0YXJ0IikpIHsKKwkJCQlhYmlzX25tX2JzMTFfcmVzdGFydChnX2J0cyk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInF1ZXJ5IikpIHsKKwkJCQljbWRfcXVlcnkoKTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiY3JlYXRlLWJwb3J0MSIpKSB7CisJCQkJYWJpc19ubV9iczExX2NyZWF0ZV9icG9ydChnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkZWxldGUtYnBvcnQxIikpIHsKKwkJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoZ19idHMsIE5NX09DX0JTMTFfQlBPUlQsIDEsIDB4ZmYsIDB4ZmYsIE5NX1NUQVRFX0xPQ0tFRCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2RlbGV0ZV9icG9ydChnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJicG9ydDAtc3RhciIpKSB7CisJCQkJYWJpc19ubV9iczExX3NldF9icG9ydF9saW5lX2NmZyhnX2J0cywgMCwgQlMxMV9MSU5FX0NGR19TVEFSKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImJwb3J0MC1tdWx0aWRyb3AiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoZ19idHMsIDAsIEJTMTFfTElORV9DRkdfTVVMVElEUk9QKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX05PUk1BTDoKKwkJaWYgKGNvbW1hbmQpIHsKKwkJCWlmICghc3RyY21wKGNvbW1hbmQsICJyZWNvbm5lY3QiKSkKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQllbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkaXNjb25uZWN0IikpCisJCQkJYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KGdfYnRzLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInF1ZXJ5IikpIHsKKwkJCQljbWRfcXVlcnkoKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChwYXJhbV9kaXNjb25uZWN0KSB7CisJCQlwYXJhbV9kaXNjb25uZWN0ID0gMDsKKwkJCWFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChnX2J0cywgMCk7CisJCQlpZiAocGFyYW1fcmVzdGFydCkgeworCQkJCXBhcmFtX3Jlc3RhcnQgPSAwOworCQkJCWFiaXNfbm1fYnMxMV9yZXN0YXJ0KGdfYnRzKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBoYW5kbGUgYSBmdWxseS1yZWNlaXZlZCBtZXNzYWdlL3BhY2tldCBmcm9tIHRoZSBSUzIzMiBwb3J0ICovCitpbnQgaGFuZGxlX3NlcmlhbF9tc2coc3RydWN0IG1zZ2IgKnJ4X21zZykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaDsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlpbnQgcmMgPSAtMTsKKworI2lmIDAKKwlpZiAocnhfbXNnLT5sZW4gPCBMQVBEX0hEUl9MRU4KKwkJCSAgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21fZm9tX2hkcikKKwkJCSAgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21faGRyKSkgeworCQlpZiAoIW1lbWNtcChyeF9tc2ctPmRhdGEgKyAyLCB0b29fZmFzdCwKKwkJCSAgICBzaXplb2YodG9vX2Zhc3QpKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJCUzExIHRlbGxzIHVzIHdlJ3JlIHRvbyAiCisJCQkJImZhc3QsIHRyeSAtLWRlbGF5IGJpZ2dlciB0aGFuICV1XG4iLAorCQkJCWRlbGF5X21zKTsKKwkJCXJldHVybiAtRTJCSUc7CisJCX0gZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJ1bmtub3duIEJTMTEgbWVzc2FnZVxuIik7CisJfQorI2VuZGlmCisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9sMihyeF9tc2cpOworCWZvaCA9IChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIG9oLT5kYXRhOworCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCWNhc2UgTk1fTVRfQlMxMV9MTVRfTE9HT05fQUNLOgorCQlwcmludGYoIkxNVCBMT0dPTjogQUNLXG5cbiIpOworCQlpZiAoYnMxMWNmZ19zdGF0ZSA9PSBTVEFURV9OT05FKQorCQkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX0xPR09OX0FDSzsKKwkJcmMgPSBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKGdfYnRzKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX0xNVF9MT0dPRkZfQUNLOgorCQlwcmludGYoIkxNVCBMT0dPRkY6IEFDS1xuIik7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLOgorCQlyYyA9IGFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgZ19idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCQlwcmludF9zdGF0ZSgmdHApOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSAmJgorCQkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpID49IDEpCisJCQlyYyA9IGhhbmRsZV9zdGF0ZV9yZXNwKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkpOworCQlicmVhazsKKwljYXNlIE5NX01UX0dFVF9BVFRSX1JFU1A6CisJCXByaW50ZigiXG4lc0FUVFJJQlVURVM6XG4iLCBvYmpfbmFtZShmb2gpKTsKKwkJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBnX2J0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCXJjID0gcHJpbnRfYXR0cigmdHApOworCQkvL2hleGR1bXAoZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9TRVRfQVRUUl9BQ0s6CisJCXByaW50ZigiU0VUIEFUVFJJQlVURSBPYmpDbGFzcz0weCUwMnggT2JqSW5zdD0oJWQsJWQsJWQpIEFDS1xuIiwKKwkJCWZvaC0+b2JqX2NsYXNzLCBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCWZvaC0+b2JqX2luc3QudHJ4X25yLCBmb2gtPm9ial9pbnN0LnRzX25yKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwljYXNlIE5NX01UX0JTMTFfU0VUX0FUVFJfTkFDSzoKKwkJcHJpbnRmKCJTRVQgQVRUUklCVVRFIE9iakNsYXNzPTB4JTAyeCBPYmpJbnN0PSglZCwlZCwlZCkgTkFDS1xuIiwKKwkJCWZvaC0+b2JqX2NsYXNzLCBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCWZvaC0+b2JqX2luc3QudHJ4X25yLCBmb2gtPm9ial9pbnN0LnRzX25yKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSBhYmlzX25tX3Jjdm1zZyhyeF9tc2cpOworCX0KKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiRVJST1IgaW4gbWFpbiBsb29wIik7CisJCS8vYnJlYWs7CisJfQorCWlmIChyYyA9PSAxKQorCQlyZXR1cm4gcmM7CisKKwlzd2l0Y2ggKGJzMTFjZmdfc3RhdGUpIHsKKwljYXNlIFNUQVRFX05PTkU6CisJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFURV9MT0dPTl9BQ0s6CisJCWJzY19zY2hlZHVsZV90aW1lcigmc3RhdHVzX3RpbWVyLCA1LCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3RhdHVzX3RpbWVyX2NiKHZvaWQgKmRhdGEpCit7CisJYWJpc19ubV9iczExX2dldF9zdGF0ZShnX2J0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2Jhbm5lcih2b2lkKQoreworCXByaW50ZigiYnMxMV9jb25maWcgKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIGFuZCBEaWV0ZXIgU3BhYXJcbiIpOworCXByaW50ZigiVGhpcyBpcyBGUkVFIFNPRlRXQVJFIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWVxuXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCh2b2lkKQoreworCXByaW50ZigiYnMxMV9jb25maWcgW29wdGlvbnNdIFtjb21tYW5kXVxuIik7CisJcHJpbnRmKCJcblN1cHBvcnRlZCBvcHRpb25zOlxuIik7CisJcHJpbnRmKCJcdC1oIC0taGVscFx0XHRcdFByaW50IHRoaXMgaGVscCB0ZXh0XG4iKTsKKwlwcmludGYoIlx0LXAgLS1wb3J0IDwvZGV2L3R0eVhYWD5cdFx0U3BlY2lmeSBzZXJpYWwgcG9ydFxuIik7CisJcHJpbnRmKCJcdC1zIC0tc29mdHdhcmUgPGZpbGU+XHRcdFNwZWNpZnkgU29mdHdhcmUgZmlsZVxuIik7CisJcHJpbnRmKCJcdC1TIC0tc2FmZXR5IDxmaWxlPlx0XHRTcGVjaWZ5IFNhZmV0eSBMb2FkIGZpbGVcbiIpOworCXByaW50ZigiXHQtZCAtLWRlbGF5IDxtcz5cdFx0XHRTcGVjaWZ5IGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuIik7CisJcHJpbnRmKCJcdC1EIC0tZGlzY29ubmVjdFx0XHRcdERpc2Nvbm5lY3QgQlRTIGZyb20gQlNDXG4iKTsKKwlwcmludGYoIlx0LXcgLS13aW4tc2l6ZSA8bnVtPlx0XHRTcGVjaWZ5IFdpbmRvdyBTaXplXG4iKTsKKwlwcmludGYoIlx0LWYgLS1mb3JjZWRcdFx0XHRGb3JjZSBTb2Z0d2FyZSBMb2FkXG4iKTsKKwlwcmludGYoIlxuU3VwcG9ydGVkIGNvbW1hbmRzOlxuIik7CisJcHJpbnRmKCJcdHF1ZXJ5XHRcdFx0UXVlcnkgdGhlIEJTLTExIGFib3V0IHNlcmlhbCBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb25cbiIpOworCXByaW50ZigiXHRkaXNjb25uZWN0XHRcdERpc2Nvbm5lY3QgQS1iaXMgbGluayAoZ28gaW50byBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRyZXNjb25uZWN0XHRcdFJlY29ubmVjdCBBLWJpcyBsaW5rIChnbyBpbnRvIG5vcm1hbCBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRyZXN0YXJ0XHRcdFx0UmVzdGFydCB0aGUgQlRTXG4iKTsKKwlwcmludGYoIlx0c29mdHdhcmVcdFx0RG93bmxvYWQgU29mdHdhcmUgKG9ubHkgaW4gYWRtaW5pc3RyYXRpdmUgc3RhdGUpXG4iKTsKKwlwcmludGYoIlx0Y3JlYXRlLXRyeDFcdFx0Q3JlYXRlIG9iamVjdHMgZm9yIFRSWDEgKERhbmdlcjogWW91ciBCUy0xMSBtaWdodCBvdmVyaGVhdClcbiIpOworCXByaW50ZigiXHRkZWxldGUtdHJ4MVx0XHREZWxldGUgb2JqZWN0cyBmb3IgVFJYMVxuIik7CisJcHJpbnRmKCJcdHBsbC1lMS1sb2NrZWRcdFx0U2V0IHRoZSBQTEwgdG8gYmUgbG9ja2VkIHRvIEUxIGNsb2NrXG4iKTsKKwlwcmludGYoIlx0cGxsLXN0YW5kYWxvbmVcdFx0U2V0IHRoZSBQTEwgdG8gYmUgaW4gc3RhbmRhbG9uZSBtb2RlXG4iKTsKKwlwcmludGYoIlx0cGxsLXNldHZhbHVlIDx2YWx1ZT5cdFNldCB0aGUgUExMIHNldCB2YWx1ZVxuIik7CisJcHJpbnRmKCJcdHBsbC13b3JrdmFsdWUgPHZhbHVlPlx0U2V0IHRoZSBQTEwgd29yayB2YWx1ZVxuIik7CisJcHJpbnRmKCJcdG9tbC10ZWlcdFx0XHRTZXQgT01MIEUxIFRTIGFuZCBURUlcbiIpOworCXByaW50ZigiXHRicG9ydDAtc3Rhclx0XHRTZXQgQlBPUlQwIGxpbmUgY29uZmlnIHRvIHN0YXJcbiIpOworCXByaW50ZigiXHRicG9ydDAtbXVsdGlwb3J0XHRTZXQgQlBPUlQwIGxpbmUgY29uZmlnIHRvIG11bHRpcG9ydFxuIik7CisJcHJpbnRmKCJcdGNyZWF0ZS1icG9ydDFcdFx0Q3JlYXRlIEJQT1JUMSBvYmplY3RcbiIpOworCXByaW50ZigiXHRkZWxldGUtYnBvcnQxXHRcdERlbGV0ZSBCUE9SVDEgb2JqZWN0XG4iKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBvcHRpb25faW5kZXggPSAwOworCXByaW50X2Jhbm5lcigpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IGM7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyAiaGVscCIsIDAsIDAsICdoJyB9LAorCQkJeyAicG9ydCIsIDEsIDAsICdwJyB9LAorCQkJeyAic29mdHdhcmUiLCAxLCAwLCAncycgfSwKKwkJCXsgInNhZmV0eSIsIDEsIDAsICdTJyB9LAorCQkJeyAiZGVsYXkiLCAxLCAwLCAnZCcgfSwKKwkJCXsgImRpc2Nvbm5lY3QiLCAwLCAwLCAnRCcgfSwKKwkJCXsgIndpbi1zaXplIiwgMSwgMCwgJ3cnIH0sCisJCQl7ICJmb3JjZWQiLCAwLCAwLCAnZicgfSwKKwkJCXsgInJlc3RhcnQiLCAwLCAwLCAncicgfSwKKwkJCXsgImRlYnVnIiwgMSwgMCwgJ2InfSwKKwkJfTsKKworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhwOnM6Uzp0ZDpEdzpmcmE6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJY2FzZSAncCc6CisJCQlzZXJpYWxfcG9ydCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlmbmFtZV9zb2Z0d2FyZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCWZuYW1lX3NhZmV0eSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWRlbGF5X21zID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJd2luX3NpemUgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnRCc6CisJCQlwYXJhbV9kaXNjb25uZWN0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCXBhcmFtX2ZvcmNlZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlwYXJhbV9kaXNjb25uZWN0ID0gMTsKKwkJCXBhcmFtX3Jlc3RhcnQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAob3B0aW5kIDwgYXJnYykKKwkJY29tbWFuZCA9IGFyZ3Zbb3B0aW5kXTsKKwkgICAgICAgIGlmIChvcHRpbmQrMSA8IGFyZ2MpCisJCQl2YWx1ZSA9IGFyZ3Zbb3B0aW5kKzFdOworCit9CisKK3N0YXRpYyBpbnQgbnVtX3NpZ2ludDsKKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKwlmcHJpbnRmKHN0ZG91dCwgIlxuc2lnbmFsICV1IHJlY2VpdmVkXG4iLCBzaWduYWwpOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNJR0lOVDoKKwkJbnVtX3NpZ2ludCsrOworCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCWlmIChudW1fc2lnaW50ID49IDMpCisJCQlleGl0KDApOworCQlicmVhazsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldDsKKwlpbnQgcmM7CisKKwlsb2dfaW5pdCgmbG9nX2luZm8pOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisJaGFuZGxlX29wdGlvbnMoYXJnYywgYXJndik7CisJYnRzX21vZGVsX2JzMTFfaW5pdCgpOworCisJZ3NtbmV0ID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBOVUxMKTsKKwlpZiAoIWdzbW5ldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBhbGxvY2F0ZSBnc20gbmV0d29ya1xuIik7CisJCWV4aXQoMSk7CisJfQorCWdfYnRzID0gZ3NtX2J0c19hbGxvYyhnc21uZXQsIEdTTV9CVFNfVFlQRV9CUzExLCBIQVJEQ09ERURfVFNDLAorCQkJCUhBUkRDT0RFRF9CU0lDKTsKKworCXJjID0gcnMyMzJfc2V0dXAoc2VyaWFsX3BvcnQsIGRlbGF5X21zLCBnX2J0cyk7CisJaWYgKHJjIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlByb2JsZW0gc2V0dGluZyB1cCBzZXJpYWwgcG9ydFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJc2lnbmFsKFNJR0lOVCwgJnNpZ25hbF9oYW5kbGVyKTsKKworCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAxKTsKKwkvL2FiaXNfbm1fYnMxMV9nZXRfc2Vybm8oZ19idHMpOworCisJc3RhdHVzX3RpbWVyLmNiID0gc3RhdHVzX3RpbWVyX2NiOworCisJd2hpbGUgKDEpIHsKKwkJYnNjX3NlbGVjdF9tYWluKDApOworCX0KKworCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfYXBpLmMgYi9vcGVuYnNjL3NyYy9ic2NfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwNDc1MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY19hcGkuYwpAQCAtMCwwICsxLDMzIEBACisvKiBHU00gMDguMDggbGlrZSBBUEkgZm9yIE9wZW5CU0MuIFRoZSBicmlkZ2UgZnJvbSBNU0MgdG8gQlNDICovCisKKy8qIChDKSAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19hcGkuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisKKworaW50IGdzbTA4MDhfc3VibWl0X2R0YXAoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQlzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbGlua19pZCkKK3sKKwltc2ctPmxjaGFuID0gY29ubi0+bGNoYW47CisJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCXJldHVybiByc2xfZGF0YV9yZXF1ZXN0KG1zZywgbGlua19pZCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfaGFjay5jIGIvb3BlbmJzYy9zcmMvYnNjX2hhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTBkNGFiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX2hhY2suYwpAQCAtMCwwICsxLDI2OCBAQAorLyogQSBoYWNraXNoIG1pbmltYWwgQlNDICgrTVNDICtITFIpIGltcGxlbWVudGF0aW9uICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCisvKiBNQ0MgYW5kIE1OQyBmb3IgdGhlIExvY2F0aW9uIEFyZWEgSWRlbnRpZmllciAqLworc3RhdGljIHN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0Oworc3RydWN0IGdzbV9uZXR3b3JrICpic2NfZ3NtbmV0ID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpkYXRhYmFzZV9uYW1lID0gImhsci5zcWxpdGUzIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25maWdfZmlsZSA9ICJvcGVuYnNjLmNmZyI7CitleHRlcm4gY29uc3QgY2hhciAqb3BlbmJzY192ZXJzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKm9wZW5ic2NfY29weXJpZ2h0OworCisvKiB0aW1lciB0byBzdG9yZSBzdGF0aXN0aWNzICovCisjZGVmaW5lIERCX1NZTkNfSU5URVJWQUwJNjAsIDAKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkYl9zeW5jX3RpbWVyOworCitleHRlcm4gaW50IGJzY19ib290c3RyYXBfbmV0d29yayhpbnQgKCptbWNfcmV2KShzdHJ1Y3QgZ3NtX25ldHdvcmsgKiwgaW50LCB2b2lkICopLAorCQkJCSBjb25zdCBjaGFyICpjZmdfZmlsZSk7CitleHRlcm4gaW50IGJzY19zaHV0ZG93bl9uZXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitzdGF0aWMgdm9pZCBjcmVhdGVfcGNhcF9maWxlKGNoYXIgKmZpbGUpCit7CisJbW9kZV90IG1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIOworCWludCBmZCA9IG9wZW4oZmlsZSwgT19XUk9OTFl8T19UUlVOQ3xPX0NSRUFULCBtb2RlKTsKKworCWlmIChmZCA8IDApIHsKKwkJcGVycm9yKCJGYWlsZWQgdG8gb3BlbiBmaWxlIGZvciBwY2FwIik7CisJCXJldHVybjsKKwl9CisKKwllMV9zZXRfcGNhcF9mZChmZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKCkKK3sKKwlwcmludGYoIlVzYWdlOiBic2NfaGFja1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigiICBTb21lIHVzZWZ1bCBoZWxwLi4uXG4iKTsKKwlwcmludGYoIiAgLWggLS1oZWxwIHRoaXMgdGV4dFxuIik7CisJcHJpbnRmKCIgIC1kIG9wdGlvbiAtLWRlYnVnPURSTEw6RENDOkRNTTpEUlI6RFJTTDpETk0gZW5hYmxlIGRlYnVnZ2luZ1xuIik7CisJcHJpbnRmKCIgIC1jIC0tY29uZmlnLWZpbGUgZmlsZW5hbWUgVGhlIGNvbmZpZyBmaWxlIHRvIHVzZS5cbiIpOworCXByaW50ZigiICAtcyAtLWRpc2FibGUtY29sb3JcbiIpOworCXByaW50ZigiICAtbCAtLWRhdGFiYXNlIGRiLW5hbWUgVGhlIGRhdGFiYXNlIHRvIHVzZVxuIik7CisJcHJpbnRmKCIgIC1hIC0tYXV0aG9yaXplLWV2ZXJ5b25lLiBBdXRob3JpemUgZXZlcnkgbmV3IHN1YnNjcmliZXIuIERhbmdlcm91cyEuXG4iKTsKKwlwcmludGYoIiAgLXAgLS1wY2FwIGZpbGUgIFRoZSBmaWxlbmFtZSBvZiB0aGUgcGNhcCBmaWxlXG4iKTsKKwlwcmludGYoIiAgLVQgLS10aW1lc3RhbXAgUHJlZml4IGV2ZXJ5IGxvZyBsaW5lIHdpdGggYSB0aW1lc3RhbXBcbiIpOworCXByaW50ZigiICAtViAtLXZlcnNpb24uIFByaW50IHRoZSB2ZXJzaW9uIG9mIE9wZW5CU0MuXG4iKTsKKwlwcmludGYoIiAgLVAgLS1ydHAtcHJveHkgRW5hYmxlIHRoZSBSVFAgUHJveHkgY29kZSBpbnNpZGUgT3BlbkJTQ1xuIik7CisJcHJpbnRmKCIgIC1lIC0tbG9nLWxldmVsIG51bWJlci4gU2V0IGEgZ2xvYmFsIGxvZ2xldmVsLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3ZlcnNpb24oKQoreworCXByaW50ZigiJXNcbiIsIG9wZW5ic2NfdmVyc2lvbik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2NvcHlyaWdodCgpCit7CisJcHV0cyhvcGVuYnNjX2NvcHlyaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9vcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgb3B0aW9uX2luZGV4ID0gMCwgYzsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ImhlbHAiLCAwLCAwLCAnaCd9LAorCQkJeyJkZWJ1ZyIsIDEsIDAsICdkJ30sCisJCQl7ImNvbmZpZy1maWxlIiwgMSwgMCwgJ2MnfSwKKwkJCXsiZGlzYWJsZS1jb2xvciIsIDAsIDAsICdzJ30sCisJCQl7ImRhdGFiYXNlIiwgMSwgMCwgJ2wnfSwKKwkJCXsiYXV0aG9yaXplLWV2ZXJ5b25lIiwgMCwgMCwgJ2EnfSwKKwkJCXsicGNhcCIsIDEsIDAsICdwJ30sCisJCQl7InRpbWVzdGFtcCIsIDAsIDAsICdUJ30sCisJCQl7InZlcnNpb24iLCAwLCAwLCAnVicgfSwKKwkJCXsicnRwLXByb3h5IiwgMCwgMCwgJ1AnfSwKKwkJCXsibG9nLWxldmVsIiwgMSwgMCwgJ2UnfSwKKwkJCXswLCAwLCAwLCAwfQorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaGQ6c2w6YXI6cDpUUFZjOmU6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCXByaW50X3VzYWdlKCk7CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KDApOworCQljYXNlICdzJzoKKwkJCWxvZ19zZXRfdXNlX2NvbG9yKHN0ZGVycl90YXJnZXQsIDApOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWRhdGFiYXNlX25hbWUgPSBzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWNvbmZpZ19maWxlID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQljcmVhdGVfcGNhcF9maWxlKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnVCc6CisJCQlsb2dfc2V0X3ByaW50X3RpbWVzdGFtcChzdGRlcnJfdGFyZ2V0LCAxKTsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCWlwYWNjX3J0cF9kaXJlY3QgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJbG9nX3NldF9sb2dfbGV2ZWwoc3RkZXJyX3RhcmdldCwgYXRvaShvcHRhcmcpKTsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCXByaW50X3ZlcnNpb24oKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJCXByaW50X2NvcHlyaWdodCgpOworCQkJZXhpdCgwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogaWdub3JlICovCisJCQlicmVhazsKKwkJfQorCX0KK30KKworZXh0ZXJuIHZvaWQgKnRhbGxfdnR5X2N0eDsKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWduYWwpCit7CisJZnByaW50ZihzdGRvdXQsICJzaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHSU5UOgorCQlic2Nfc2h1dGRvd25fbmV0KGJzY19nc21uZXQpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfR0xPQkFMLCBTX0dMT0JBTF9TSFVURE9XTiwgTlVMTCk7CisJCXNsZWVwKDMpOworCQlleGl0KDApOworCQlicmVhazsKKwljYXNlIFNJR0FCUlQ6CisJCS8qIGluIGNhc2Ugb2YgYWJvcnQsIHdlIHdhbnQgdG8gb2J0YWluIGEgdGFsbG9jIHJlcG9ydAorCQkgKiBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MgKi8KKwljYXNlIFNJR1VTUjE6CisJCXRhbGxvY19yZXBvcnQodGFsbF92dHlfY3R4LCBzdGRlcnIpOworCQl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF9ic2NfY3R4LCBzdGRlcnIpOworCQlicmVhazsKKwljYXNlIFNJR1VTUjI6CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX3Z0eV9jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyogdGltZXIgaGFuZGxpbmcgKi8KK3N0YXRpYyBpbnQgX2RiX3N0b3JlX2NvdW50ZXIoc3RydWN0IGNvdW50ZXIgKmNvdW50ZXIsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGRiX3N0b3JlX2NvdW50ZXIoY291bnRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGRiX3N5bmNfdGltZXJfY2Iodm9pZCAqZGF0YSkKK3sKKwkvKiBzdG9yZSBjb3VudGVycyB0byBkYXRhYmFzZSBhbmQgcmUtc2NoZWR1bGUgKi8KKwljb3VudGVyc19mb3JfZWFjaChfZGJfc3RvcmVfY291bnRlciwgTlVMTCk7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZkYl9zeW5jX3RpbWVyLCBEQl9TWU5DX0lOVEVSVkFMKTsKK30KKworZXh0ZXJuIGludCBidHNfbW9kZWxfdW5rbm93bl9pbml0KHZvaWQpOworZXh0ZXJuIGludCBidHNfbW9kZWxfYnMxMV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBidHNfbW9kZWxfbmFub2J0c19pbml0KHZvaWQpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJjOworCisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwl0YWxsX2JzY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgIm9wZW5ic2MiKTsKKwl0YWxsb2NfY3R4X2luaXQoKTsKKwlvbl9kc29fbG9hZF90b2tlbigpOworCW9uX2Rzb19sb2FkX3JybHAoKTsKKwlvbl9kc29fbG9hZF9ob19kZWMoKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisKKwlidHNfbW9kZWxfdW5rbm93bl9pbml0KCk7CisJYnRzX21vZGVsX2JzMTFfaW5pdCgpOworCWJ0c19tb2RlbF9uYW5vYnRzX2luaXQoKTsKKworCS8qIGVuYWJsZSBmaWx0ZXJzICovCisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCisJLyogcGFyc2Ugb3B0aW9ucyAqLworCWhhbmRsZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCisJLyogc2VlZCB0aGUgUFJORyAqLworCXNyYW5kKHRpbWUoTlVMTCkpOworCisJaWYgKGRiX2luaXQoZGF0YWJhc2VfbmFtZSkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIGluaXQgZGF0YWJhc2UuIFBsZWFzZSBjaGVjayB0aGUgb3B0aW9uIHNldHRpbmdzLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRmKCJEQjogRGF0YWJhc2UgaW5pdGlhbGl6ZWQuXG4iKTsKKworCWlmIChkYl9wcmVwYXJlKCkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIHByZXBhcmUgZGF0YWJhc2UuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwcmludGYoIkRCOiBEYXRhYmFzZSBwcmVwYXJlZC5cbiIpOworCisJLyogc2V0dXAgdGhlIHRpbWVyICovCisJZGJfc3luY190aW1lci5jYiA9IGRiX3N5bmNfdGltZXJfY2I7CisJZGJfc3luY190aW1lci5kYXRhID0gTlVMTDsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmRiX3N5bmNfdGltZXIsIERCX1NZTkNfSU5URVJWQUwpOworCisJcmMgPSBic2NfYm9vdHN0cmFwX25ldHdvcmsobW5jY19yZWN2LCBjb25maWdfZmlsZSk7CisJaWYgKHJjIDwgMCkKKwkJZXhpdCgxKTsKKworCXNpZ25hbChTSUdJTlQsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR0FCUlQsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjEsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjIsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJd2hpbGUgKDEpIHsKKwkJYnNjX3VwcXVldWUoYnNjX2dzbW5ldCk7CisJCWxvZ19yZXNldF9jb250ZXh0KCk7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfaW5pdC5jIGIvb3BlbmJzYy9zcmMvYnNjX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmMwMmM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX2luaXQuYwpAQCAtMCwwICsxLDEwOTMgQEAKKy8qIEEgaGFja2lzaCBtaW5pbWFsIEJTQyAoK01TQyArSExSKSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9taXNkbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisvKiBnbG9iYWwgcG9pbnRlciB0byB0aGUgZ3NtIG5ldHdvcmsgZGF0YSBzdHJ1Y3R1cmUgKi8KK2V4dGVybiBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmJzY19nc21uZXQ7CisKK3N0YXRpYyB2b2lkIHBhdGNoX25tX3RhYmxlcyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgZm9yIE9NIGFuZCBOTSBwYWNrZXRzIHRoYXQgd2UgY2Fubm90IHlldAorICogZ2VuZXJhdGUgYnkgY29kZSBidXQgd2UganVzdCBwYXNzIG9uICovCisKKy8vIEJUUyBTaXRlIE1hbmFnZXIsIFNFVCBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogQlRTIFNpdGUgTWFuYWdlcgorICBJbnN0YW5jZSAxOiBGRgorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgc0FiaXNFeHRlcm5hbFRpbWU6IDIwMDcvMDkvMDggICAxNDozNjoxMQorICBvbUxBUERSZWxUaW1lcjogMzBzZWMKKyAgc2hvcnRMQVBESW50VGltZXI6IDVzZWMKKyAgZW1lcmdlbmN5VGltZXIxOiAxMCBtaW51dGVzCisgIGVtZXJnZW5jeVRpbWVyMjogMCBtaW51dGVzCisqLworCit1bnNpZ25lZCBjaGFyIG1zZ18xW10gPQoreworCU5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkJTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRSwgMHgwNywKKwkJCTB4RDcsIDB4MDksIDB4MDgsIDB4MEUsIDB4MjQsIDB4MEIsIDB4Q0UsCisJCTB4MDIsCisJCQkweDAwLCAweDFFLAorCQlOTV9BVFRfQlMxMV9TSF9MQVBEX0lOVF9USU1FUiwKKwkJCTB4MDEsIDB4MDUsCisJCTB4NDIsIDB4MDIsIDB4MDAsIDB4MEEsCisJCTB4NDQsIDB4MDIsIDB4MDAsIDB4MDAKK307CisKKy8vIEJUUywgU0VUIEJUUyBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogQlRTCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIEluc3RhbmNlIDI6IEZGCisgIEluc3RhbmNlIDM6IEZGCitTRVQgQlRTIEFUVFJJQlVURVMKKyAgYnNJZGVudGl0eUNvZGUgLyBCU0lDOgorICAgIFBMTU5fY29sb3VyX2NvZGU6IDdoCisgICAgQlNfY29sb3VyX2NvZGU6ICAgN2gKKyAgQlRTIEFpciBUaW1lciBUMzEwNTogNCAgLHVuaXQgMTAgbXMKKyAgYnRzSXNIb3BwaW5nOiBGQUxTRQorICBwZXJpb2RDQ0NITG9hZEluZGljYXRpb246IDFzZWMKKyAgdGhyZXNob2xkQ0NDSExvYWRJbmRpY2F0aW9uOiAwJQorICBjZWxsQWxsb2NhdGlvbk51bWJlcjogMDBoID0gR1NNIDkwMAorICBlbmFibGVJbnRlcmZlcmVuY2VDbGFzczogMDBoID0gIERpc2FibGVkCisgIGZBQ0NIUXVhbDogNiAoRkFDQ0ggc3RlYWxpbmcgZmxhZ3MgbWludXMgMSkKKyAgaW50YXZlUGFyYW1ldGVyOiAzMSBTQUNDSCBtdWx0aWZyYW1lcworICBpbnRlcmZlcmVuY2VMZXZlbEJvdW5kYXJpZXM6CisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDE6IDBBaAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSAyOiAwRmgKKyAgICBJbnRlcmZlcmVuY2UgQm91bmRhcnkgMzogMTRoCisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDQ6IDE5aAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSA1OiAxRWgKKyAgbVNUeFB3ck1heDogMTEKKyAgICAgIEdTTSByYW5nZTogICAgIDI9MzlkQm0sIDE1PTEzZEJtLCBzdGVwc2l6ZSAyIGRCbQorICAgICAgRENTMTgwMCByYW5nZTogMD0zMGRCbSwgMTU9MGRCbSwgc3RlcHNpemUgMiBkQm0KKyAgICAgIFBDUzE5MDAgcmFuZ2U6IDA9MzBkQm0sIDE1PTBkQm0sIHN0ZXBzaXplIDIgZEJtCisgICAgICAgICAgICAgICAgICAgIDMwPTMzZEJtLCAzMT0zMmRCbQorICBueTE6CisgICAgTWF4aW11bSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgZm9yIFBIWVNJQ0FMIElORk9STUFUSU9OIG1lc3NhZ2UgKEdTTSAwNC4wOCk6IDIwCisgIHBvd2VyT3V0cHV0VGhyZXNob2xkczoKKyAgICBPdXQgUG93ZXIgRmF1bHQgVGhyZXNob2xkOiAgICAgLTEwIGRCCisgICAgUmVkIE91dCBQb3dlciBUaHJlc2hvbGQ6ICAgICAgIC0gNiBkQgorICAgIEV4Y2Vzc2l2ZSBPdXQgUG93ZXIgVGhyZXNob2xkOiAgIDUgZEIKKyAgckFDSEJ1c3lUaHJlc2hvbGQ6IC0xMjcgZEJtCisgIHJBQ0hMb2FkQXZlcmFnaW5nU2xvdHM6IDI1MCAsbnVtYmVyIG9mIFJBQ0ggYnVyc3QgcGVyaW9kcworICByZlJlc291cmNlSW5kaWNhdGlvblBlcmlvZDogMTI1ICBTQUNDSCBtdWx0aWZyYW1lcworICBUMjAwOgorICAgIFNEQ0NIOiAgICAgICAgICAgICAgICAwNDQgaW4gIDUgbXMKKyAgICBGQUNDSC9GdWxsIHJhdGU6ICAgICAgMDMxIGluICA1IG1zCisgICAgRkFDQ0gvSGFsZiByYXRlOiAgICAgIDA0MSBpbiAgNSBtcworICAgIFNBQ0NIIHdpdGggVENIIFNBUEkwOiAwOTAgaW4gMTAgbXMKKyAgICBTQUNDSCB3aXRoIFNEQ0NIOiAgICAgMDkwIGluIDEwIG1zCisgICAgU0RDQ0ggd2l0aCBTQVBJMzogICAgIDA5MCBpbiAgNSBtcworICAgIFNBQ0NIIHdpdGggVENIIFNBUEkzOiAxMzUgaW4gMTAgbXMKKyAgdFN5bmM6IDkwMDAgdW5pdHMgb2YgMTAgbXNlYworICB0VHJhdTogOTAwMCB1bml0cyBvZiAxMCBtc2VjCisgIGVuYWJsZVVtTG9vcFRlc3Q6IDAwaCA9ICBkaXNhYmxlZAorICBlbmFibGVFeGNlc3NpdmVEaXN0YW5jZTogMDBoID0gIERpc2FibGVkCisgIGV4Y2Vzc2l2ZURpc3RhbmNlOiA2NGttCisgIGhvcHBpbmdNb2RlOiAwMGggPSBiYXNlYmFuZCBob3BwaW5nCisgIGNlbGxUeXBlOiAwMGggPSAgU3RhbmRhcmQgQ2VsbAorICBCQ0NIIEFSRkNOIC8gYkNDSEZyZXF1ZW5jeTogMQorKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnMxMV9hdHRyX2J0c1tdID0KK3sKKwkJTk1fQVRUX0JTSUMsIEhBUkRDT0RFRF9CU0lDLAorCQlOTV9BVFRfQlRTX0FJUl9USU1FUiwgMHgwNCwKKwkJTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywgMHgwMCwKKwkJTk1fQVRUX0NDQ0hfTF9JX1AsIDB4MDEsCisJCU5NX0FUVF9DQ0NIX0xfVCwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfQ0VMTF9BTExPQ19OUiwgTk1fQlMxMV9DQU5SX0dTTSwKKwkJTk1fQVRUX0JTMTFfRU5BX0lOVEVSRl9DTEFTUywgMHgwMSwKKwkJTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTCwgMHgwNiwKKwkJLyogaW50ZXJmZXJlbmNlIGF2Zy4gcGVyaW9kIGluIG51bWJlcnMgb2YgU0FDQ0ggbXVsdGlmciAqLworCQlOTV9BVFRfSU5UQVZFX1BBUkFNLCAweDFGLAorCQlOTV9BVFRfSU5URVJGX0JPVU5ELCAweDBBLCAweDBGLCAweDE0LCAweDE5LCAweDFFLCAweDdCLAorCQlOTV9BVFRfQ0NDSF9MX1QsIDB4MjMsCisJCU5NX0FUVF9HU01fVElNRSwgMHgyOCwgMHgwMCwKKwkJTk1fQVRUX0FETV9TVEFURSwgMHgwMywKKwkJTk1fQVRUX1JBQ0hfQl9USFJFU0gsIDB4N0YsCisJCU5NX0FUVF9MREFWR19TTE9UUywgMHgwMCwgMHhGQSwKKwkJTk1fQVRUX0JTMTFfUkZfUkVTX0lORF9QRVIsIDB4N0QsCisJCU5NX0FUVF9UMjAwLCAweDJDLCAweDFGLCAweDI5LCAweDVBLCAweDVBLCAweDVBLCAweDg3LAorCQlOTV9BVFRfQlMxMV9UU1lOQywgMHgyMywgMHgyOCwKKwkJTk1fQVRUX0JTMTFfVFRSQVUsIDB4MjMsIDB4MjgsCisJCU5NX0FUVF9URVNUX0RVUiwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX09VVFNUX0FMQVJNLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UsIDB4MDEsIDB4NDAsCisJCU5NX0FUVF9CUzExX0hPUFBJTkdfTU9ERSwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfUExMLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQkNDSF9BUkZDTiwgMHgwMCwgSEFSRENPREVEX0FSRkNOLyoweDAxKi8sCit9OworCisvLyBIYW5kb3ZlciBSZWNvZ25pdGlvbiwgU0VUIEFUVFJJQlVURVMKKworLyoKK0lsbGVnYWwgQ29udGVudHMgR1NNIEZvcm1hdHRlZCBPJk0gTXNnCisgIE9iamVjdCBDbGFzczogSGFuZG92ZXIgUmVjb2duaXRpb24KKyAgQlRTIHJlbGF0LiBOdW1iZXI6IDAKKyAgSW5zdGFuY2UgMjogRkYKKyAgSW5zdGFuY2UgMzogRkYKK1NFVCBBVFRSSUJVVEVTCisgIGVuYWJsZURlbGF5UG93ZXJCdWRnZXRITzogMDBoID0gRGlzYWJsZWQKKyAgZW5hYmxlRGlzdGFuY2VITzogMDBoID0gIERpc2FibGVkCisgIGVuYWJsZUludGVybmFsSW50ZXJDZWxsSGFuZG92ZXI6IDAwaCA9IERpc2FibGVkCisgIGVuYWJsZUludGVybmFsSW50cmFDZWxsSGFuZG92ZXI6IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVQb3dlckJ1ZGdldEhPOiAwMGggPSBEaXNhYmxlZAorICBlbmFibGVSWExFVkhPOiAwMGggPSAgRGlzYWJsZWQKKyAgZW5hYmxlUlhRVUFMSE86IDAwaCA9ICBEaXNhYmxlZAorICBob0F2ZXJhZ2luZ0Rpc3RhbmNlOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ0xldjoKKyAgICBBX0xFVl9ITzogOCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgICBXX0xFVl9ITzogMSAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9BdmVyYWdpbmdQb3dlckJ1ZGdldDogIDE2ICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ1F1YWw6CisgICAgQV9RVUFMX0hPOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICAgIFdfUVVBTF9ITzogMiAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9Mb3dlclRocmVzaG9sZExldkRMOiAoMTAgLSAxMTApIGRCbQorICBob0xvd2VyVGhyZXNob2xkTGV2VUw6ICg1IC0gMTEwKSBkQm0KKyAgaG9Mb3dlclRocmVzaG9sZFF1YWxETDogMDZoID0gICA2LjQlIDwgQkVSIDwgMTIuOCUKKyAgaG9Mb3dlclRocmVzaG9sZFF1YWxVTDogMDZoID0gICA2LjQlIDwgQkVSIDwgMTIuOCUKKyAgaG9UaHJlc2hvbGRMZXZETGludHJhIDogKDIwIC0gMTEwKSBkQm0KKyAgaG9UaHJlc2hvbGRMZXZVTGludHJhOiAoMjAgLSAxMTApIGRCbQorICBob1RocmVzaG9sZE1zUmFuZ2VNYXg6IDIwIGttCisgIG5DZWxsOiAwNmgKKyAgdGltZXJIT1JlcXVlc3Q6IDMgICx1bml0IDIgU0FDQ0ggbXVsdGlmcmFtZXMKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzNbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9IQU5ET1ZFUiwgMHgwMCwgMHhGRiwgMHhGRiwKKwkJMHhEMCwgMHgwMCwJCS8qIGVuYWJsZURlbGF5UG93ZXJCdWRnZXRITyAqLworCQkweDY0LCAweDAwLAkJLyogZW5hYmxlRGlzdGFuY2VITyAqLworCQkweDY3LCAweDAwLAkJLyogZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlciAqLworCQkweDY4LCAweDAwLAkJLyogZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlciAqLworCQkweDZBLCAweDAwLAkJLyogZW5hYmxlUG93ZXJCdWRnZXRITyAqLworCQkweDZDLCAweDAwLAkJLyogZW5hYmxlUlhMRVZITyAqLworCQkweDZELCAweDAwLAkJLyogZW5hYmxlUlhRVUFMSE8gKi8KKwkJMHg2RiwgMHgwOCwJCS8qIGhvQXZlcmFnaW5nRGlzdGFuY2UgKi8KKwkJMHg3MCwgMHgwOCwgMHgwMSwJLyogaG9BdmVyYWdpbmdMZXYgKi8KKwkJMHg3MSwgMHgxMCwgMHgxMCwgMHgxMCwKKwkJMHg3MiwgMHgwOCwgMHgwMiwJLyogaG9BdmVyYWdpbmdRdWFsICovCisJCTB4NzMsIDB4MEEsCQkvKiBob0xvd2VyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg3NCwgMHgwNSwJCS8qIGhvTG93ZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDc1LCAweDA2LAkJLyogaG9Mb3dlclRocmVzaG9sZFF1YWxETCAqLworCQkweDc2LCAweDA2LAkJLyogaG9Mb3dlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDc4LCAweDE0LAkJLyogaG9UaHJlc2hvbGRMZXZETGludHJhICovCisJCTB4NzksIDB4MTQsCQkvKiBob1RocmVzaG9sZExldlVMaW50cmEgKi8KKwkJMHg3QSwgMHgxNCwJCS8qIGhvVGhyZXNob2xkTXNSYW5nZU1heCAqLworCQkweDdELCAweDA2LAkJLyogbkNlbGwgKi8KKwkJTk1fQVRUX0JTMTFfVElNRVJfSE9fUkVRVUVTVCwgMHgwMywKKwkJMHgyMCwgMHgwMSwgMHgwMCwKKwkJMHg0NSwgMHgwMSwgMHgwMCwKKwkJMHg0OCwgMHgwMSwgMHgwMCwKKwkJMHg1QSwgMHgwMSwgMHgwMCwKKwkJMHg1QiwgMHgwMSwgMHgwNSwKKwkJMHg1RSwgMHgwMSwgMHgxQSwKKwkJMHg1RiwgMHgwMSwgMHgyMCwKKwkJMHg5RCwgMHgwMSwgMHgwMCwKKwkJMHg0NywgMHgwMSwgMHgwMCwKKwkJMHg1QywgMHgwMSwgMHg2NCwKKwkJMHg1RCwgMHgwMSwgMHgxRSwKKwkJMHg5NywgMHgwMSwgMHgyMCwKKwkJMHhGNywgMHgwMSwgMHgzQywKK307CisKKy8vIFBvd2VyIENvbnRyb2wsIFNFVCBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogUG93ZXIgQ29udHJvbAorICBCVFMgcmVsYXQuIE51bWJlcjogMAorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgZW5hYmxlTXNQb3dlckNvbnRyb2w6IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVQb3dlckNvbnRyb2xSTEZXOiAwMGggPSAgRGlzYWJsZWQKKyAgcGNBdmVyYWdpbmdMZXY6CisgICAgQV9MRVZfUEM6IDQgIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19MRVZfUEM6IDEgIFNBQ0NIIG11bHRpZnJhbWVzCisgIHBjQXZlcmFnaW5nUXVhbDoKKyAgICBBX1FVQUxfUEM6IDQgIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19RVUFMX1BDOiAyICBTQUNDSCBtdWx0aWZyYW1lcworICBwY0xvd2VyVGhyZXNob2xkTGV2REw6IDBGaAorICBwY0xvd2VyVGhyZXNob2xkTGV2VUw6IDBBaAorICBwY0xvd2VyVGhyZXNob2xkUXVhbERMOiAwNWggPSAgIDMuMiUgPCBCRVIgPCAgNi40JQorICBwY0xvd2VyVGhyZXNob2xkUXVhbFVMOiAwNWggPSAgIDMuMiUgPCBCRVIgPCAgNi40JQorICBwY1JMRlRocmVzaG9sZDogMENoCisgIHBjVXBwZXJUaHJlc2hvbGRMZXZETDogMTRoCisgIHBjVXBwZXJUaHJlc2hvbGRMZXZVTDogMEZoCisgIHBjVXBwZXJUaHJlc2hvbGRRdWFsREw6IDA0aCA9ICAgMS42JSA8IEJFUiA8ICAzLjIlCisgIHBjVXBwZXJUaHJlc2hvbGRRdWFsVUw6IDA0aCA9ICAgMS42JSA8IEJFUiA8ICAzLjIlCisgIHBvd2VyQ29uZmlybTogMiAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworICBwb3dlckNvbnRyb2xJbnRlcnZhbDogMiAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworICBwb3dlckluY3JTdGVwU2l6ZTogMDJoID0gNCBkQgorICBwb3dlclJlZFN0ZXBTaXplOiAwMWggPSAyIGRCCisgIHJhZGlvTGlua1RpbWVvdXRCczogNjQgIFNBQ0NIIG11bHRpZnJhbWVzCisgIGVuYWJsZUJTUG93ZXJDb250cm9sOiAwMGggPSAgZGlzYWJsZWQKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzRbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9QV1JfQ1RSTCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkJTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMLCAweDAwLAorCQlOTV9BVFRfQlMxMV9FTkFfUFdSX0NUUkxfUkxGVywgMHgwMCwKKwkJMHg3RSwgMHgwNCwgMHgwMSwJLyogcGNBdmVyYWdpbmdMZXYgKi8KKwkJMHg3RiwgMHgwNCwgMHgwMiwJLyogcGNBdmVyYWdpbmdRdWFsICovCisJCTB4ODAsIDB4MEYsCQkvKiBwY0xvd2VyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg4MSwgMHgwQSwJCS8qIHBjTG93ZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDgyLCAweDA1LAkJLyogcGNMb3dlclRocmVzaG9sZFF1YWxETCAqLworCQkweDgzLCAweDA1LAkJLyogcGNMb3dlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDg0LCAweDBDLCAJCS8qIHBjUkxGVGhyZXNob2xkICovCisJCTB4ODUsIDB4MTQsIAkJLyogcGNVcHBlclRocmVzaG9sZExldkRMICovCisJCTB4ODYsIDB4MEYsIAkJLyogcGNVcHBlclRocmVzaG9sZExldlVMICovCisJCTB4ODcsIDB4MDQsCQkvKiBwY1VwcGVyVGhyZXNob2xkUXVhbERMICovCisJCTB4ODgsIDB4MDQsCQkvKiBwY1VwcGVyVGhyZXNob2xkUXVhbFVMICovCisJCTB4ODksIDB4MDIsCQkvKiBwb3dlckNvbmZpcm0gKi8KKwkJMHg4QSwgMHgwMiwJCS8qIHBvd2VyQ29uZmlybUludGVydmFsICovCisJCTB4OEIsIDB4MDIsCQkvKiBwb3dlckluY3JTdGVwU2l6ZSAqLworCQkweDhDLCAweDAxLAkJLyogcG93ZXJSZWRTdGVwU2l6ZSAqLworCQkweDhELCAweDQwLAkJLyogcmFkaW9MaW5rVGltZW91dEJzICovCisJCTB4NjUsIDB4MDEsIDB4MDAgLy8gc2V0IHRvIDB4MDEgdG8gZW5hYmxlIEJTUG93ZXJDb250cm9sCit9OworCisKKy8vIFRyYW5zY2VpdmVyLCBTRVQgVFJYIEFUVFJJQlVURVMgKFRSWCAwKQorCisvKgorICBPYmplY3QgQ2xhc3M6IFRyYW5zY2VpdmVyCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIFRyYW5jZWl2ZXIgbnVtYmVyOiAwCisgIEluc3RhbmNlIDM6IEZGCitTRVQgVFJYIEFUVFJJQlVURVMKKyAgYVJGQ05MaXN0IChIRVgpOiAgMDAwMQorICB0eFB3ck1heFJlZHVjdGlvbjogMDBoID0gICAzMGRCCisgIHJhZGlvTWVhc0dyYW46IDI1NCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgcmFkaW9NZWFzUmVwOiAwMWggPSAgZW5hYmxlZAorICBtZW1iZXJPZkVtZXJnZW5jeUNvbmZpZzogMDFoID0gIFRSVUUKKyAgdHJ4QXJlYTogMDBoID0gVFJYIGRvZXNuJ3QgYmVsb25nIHRvIGEgY29uY2VudHJpYyBjZWxsCisqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBiczExX2F0dHJfcmFkaW9bXSA9Cit7CisJCU5NX0FUVF9BUkZDTl9MSVNULCAweDAxLCAweDAwLCBIQVJEQ09ERURfQVJGQ04gLyoweDAxKi8sCisJCU5NX0FUVF9SRl9NQVhQT1dSX1IsIDB4MDAsCisJCU5NX0FUVF9CUzExX1JBRElPX01FQVNfR1JBTiwgMHgwMSwgMHgwNSwKKwkJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19SRVAsIDB4MDEsIDB4MDEsCisJCU5NX0FUVF9CUzExX0VNUkdfQ0ZHX01FTUJFUiwgMHgwMSwgMHgwMSwKKwkJTk1fQVRUX0JTMTFfVFJYX0FSRUEsIDB4MDEsIDB4MDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfYnRzW10gPSB7CisJTk1fQVRUX0lOVEVSRl9CT1VORCwgMHg1NSwgMHg1YiwgMHg2MSwgMHg2NywgMHg2ZCwgMHg3MywKKwkvKiBpbnRlcmZlcmVuY2UgYXZnLiBwZXJpb2QgaW4gbnVtYmVycyBvZiBTQUNDSCBtdWx0aWZyICovCisJTk1fQVRUX0lOVEFWRV9QQVJBTSwgMHgwNiwKKwkvKiBjb25uIGZhaWwgYmFzZWQgb24gU0FDQ0ggZXJyb3IgcmF0ZSAqLworCU5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgxMCwKKwlOTV9BVFRfVDIwMCwgMHgxZSwgMHgyNCwgMHgyNCwgMHhhOCwgMHgzNCwgMHgyMSwgMHhhOCwKKwlOTV9BVFRfTUFYX1RBLCAweDNmLAorCU5NX0FUVF9PVkVSTF9QRVJJT0QsIDB4MDAsIDB4MDEsIDEwLCAvKiBzZWNvbmRzICovCisJTk1fQVRUX0NDQ0hfTF9ULCAxMCwgLyogcGVyY2VudCAqLworCU5NX0FUVF9DQ0NIX0xfSV9QLCAxLCAvKiBzZWNvbmRzICovCisJTk1fQVRUX1JBQ0hfQl9USFJFU0gsIDEwLCAvKiBidXN5IHRocmVzaG9sZCBpbiAtIGRCbSAqLworCU5NX0FUVF9MREFWR19TTE9UUywgMHgwMywgMHhlOCwgLyogcmFjaCBsb2FkIGF2ZXJhZ2luZyAxMDAwIHNsb3RzICovCisJTk1fQVRUX0JUU19BSVJfVElNRVIsIDEyOCwgLyogbWlsaXNlY29uZHMgKi8KKwlOTV9BVFRfTlkxLCAxMCwgLyogMTAgcmV0cmFuc21pc3Npb25zIG9mIHBoeXNpY2FsIGNvbmZpZyAqLworCU5NX0FUVF9CQ0NIX0FSRkNOLCBIQVJEQ09ERURfQVJGQ04gPj4gOCwgSEFSRENPREVEX0FSRkNOICYgMHhmZiwKKwlOTV9BVFRfQlNJQywgSEFSRENPREVEX0JTSUMsCisJTk1fQVRUX0lQQUNDX0NHSSwgMCwgNywgIDB4MDAsIDB4ZjEsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfcmFkaW9bXSA9IHsKKwlOTV9BVFRfUkZfTUFYUE9XUl9SLCAweDBjLCAvKiBudW1iZXIgb2YgLTJkQiByZWR1Y3Rpb24gc3RlcHMgLyBQbiAqLworCU5NX0FUVF9BUkZDTl9MSVNULCAweDAwLCAweDAyLCBIQVJEQ09ERURfQVJGQ04gPj4gOCwgSEFSRENPREVEX0FSRkNOICYgMHhmZiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9uc2VbXSA9IHsKKwlOTV9BVFRfSVBBQ0NfTlNFSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIE5TRUkgOTI1ICovCisJTk1fQVRUX0lQQUNDX05TX0NGRywgMCwgNywgIDMsICAvKiAodW4pYmxvY2tpbmcgdGltZXIgKFRucy1ibG9jaykgKi8KKwkJCQkgICAgMywgIC8qICh1bilibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiByZXNldCB0aW1lciAoVG5zLXJlc2V0KSAqLworCQkJCSAgICAzLCAgLyogcmVzZXQgcmV0cmllcyAqLworCQkJCSAgICAzMCwgIC8qIHRlc3QgdGltZXIgKFRucy10ZXN0KSAqLworCQkJCSAgICAzLCAgLyogYWxpdmUgdGltZXIgKFRucy1hbGl2ZSkgKi8KKwkJCQkgICAgMTAsIC8qIGFsaXZlIHJldHJpcmVzICovCisJTk1fQVRUX0lQQUNDX0JTU0dQX0NGRywgMCwgMTEsCisJCQkJICAgIDMsICAvKiBibG9ja2ltZyB0aW1lciAoVDEpICovCisJCQkJICAgIDMsICAvKiBibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiB1bmJsb2NraW5nIHJldHJpZXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc2V0IHRpbWVyICovCisJCQkJICAgIDMsICAvKiByZXNldCByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiBzdXNwZW5kIHRpbWVyIChUMykgaW4gMTAwbXMgKi8KKwkJCQkgICAgMywgIC8qIHN1c3BlbmQgcmV0cmllcyAqLworCQkJCSAgICAxMCwgLyogcmVzdW1lIHRpbWVyIChUNCkgaW4gMTAwbXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc3VtZSByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiBjYXBhYmlsaXR5IHVwZGF0ZSB0aW1lciAoVDUpICovCisJCQkJICAgIDMsICAvKiBjYXBhYmlsaXR5IHVwZGF0ZSByZXRyaWVzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfY2VsbFtdID0geworCU5NX0FUVF9JUEFDQ19SQUMsIDAsIDEsICAxLCAvKiByb3V0aW5nIGFyZWEgY29kZSAqLworCU5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcsIDAsIDIsCisJCTUsCS8qIHJlcGVhdCB0aW1lICg1MG1zKSAqLworCQkzLAkvKiByZXBlYXQgY291bnQgKi8KKwlOTV9BVFRfSVBBQ0NfQlZDSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIEJWQ0kgOTI1ICovCisJTk1fQVRUX0lQQUNDX1JMQ19DRkcsIDAsIDksCisJCTIwLCAJLyogVDMxNDIgKi8KKwkJNSwgCS8qIFQzMTY5ICovCisJCTUsCS8qIFQzMTkxICovCisJCTIwMCwJLyogVDMxOTMgKi8KKwkJNSwJLyogVDMxOTUgKi8KKwkJMTAsCS8qIE4zMTAxICovCisJCTQsCS8qIE4zMTAzICovCisJCTgsCS8qIE4zMTA1ICovCisJCTE1LAkvKiBSTEMgQ1YgY291bnRkb3duICovCisJTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTLCAwLCAyLCAgMHgwZiwgMHgwMCwJLyogQ1MxLi5DUzQgKi8KKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18yLCAwLCA1LAorCQkweDAwLCAyNTAsCS8qIFQgZG93bmxpbmsgVEJGIGV4dGVuc2lvbiAoMC4uNTAwKSAqLworCQkweDAwLCAyNTAsCS8qIFQgdXBsaW5rIFRCRiBleHRlbnNpb24gKDAuLjUwMCkgKi8KKwkJMiwJLyogQ1MyICovCisjaWYgMAorCS8qIEVER0UgbW9kZWwgb25seSwgYnJlYWtzIG9sZGVyIG1vZGVscy4KKwkgKiBTaG91bGQgaW5xdWlyZSB0aGUgQlRTIGNhcGFiaWxpdGllcyAqLworCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzMsIDAsIDEsCisJCTIsCS8qIE1DUzIgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbmFub2J0c19hdHRyX25zdmMwW10gPSB7CisJTk1fQVRUX0lQQUNDX05TVkNJLCAwLCAyLCAgMHgwMywgMHg5ZCwgLyogOTI1ICovCisJTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHLCAwLCA4LAorCQkweDU5LCAweGQ4LCAvKiByZW1vdGUgdWRwIHBvcnQgKDIzMDAwKSAqLworCQkxOTIsIDE2OCwgMTAwLCAxMSwgLyogcmVtb3RlIGlwIGFkZHJlc3MgKi8KKwkJMHg1OSwgMHhkOCwgLyogbG9jYWwgdWRwIHBvcnQgKDIzMDAwKSAqLworfTsKKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHdlIGdldCBhIEdTTSAxMi4yMSBzdGF0ZSBjaGFuZ2UgZXZlbnQgKi8KK2ludCBubV9zdGF0ZV9ldmVudChlbnVtIG5tX2V2dCBldnQsIHVfaW50OF90IG9ial9jbGFzcywgdm9pZCAqb2JqLAorCQkgICBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpvbGRfc3RhdGUsIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5ld19zdGF0ZSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJc3RydWN0IGdzbV9idHNfZ3Byc19uc3ZjICpuc3ZjOworCisJLyogVGhpcyBldmVudC1kcml2ZW4gQlRTIHNldHVwIGlzIGN1cnJlbnRseSBvbmx5IHJlcXVpcmVkIG9uIG5hbm9CVFMgKi8KKworCS8qIEVWVF9TVEFURUNIR19BRE0gaXMgY2FsbGVkIGFmdGVyIHdlIGNhbGwgY2hnX2FkbV9zdGF0ZSgpIGFuZCB3b3VsZCBjcmVhdGUKKwkgKiBlbmRsZXNzIGxvb3AgKi8KKwlpZiAoZXZ0ICE9IEVWVF9TVEFURUNIR19PUEVSKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAob2JqX2NsYXNzKSB7CisJY2FzZSBOTV9PQ19TSVRFX01BTkFHRVI6CisJCWJ0cyA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBnc21fYnRzLCBzaXRlX21ncik7CisJCWlmICgobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSAyICYmCisJCSAgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PSykgfHwKKwkJICAgIChuZXdfc3RhdGUtPm9wZXJhdGlvbmFsID09IDEgJiYKKwkJICAgICBuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09GRl9MSU5FKSkKKwkJCWFiaXNfbm1fb3BzdGFydChidHMsIG9ial9jbGFzcywgMHhmZiwgMHhmZiwgMHhmZik7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQlRTOgorCQlidHMgPSBvYmo7CisJCWlmIChuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX0RFUEVOREVOQ1kpIHsKKwkJCXBhdGNoX25tX3RhYmxlcyhidHMpOworCQkJYWJpc19ubV9zZXRfYnRzX2F0dHIoYnRzLCBuYW5vYnRzX2F0dHJfYnRzLAorCQkJCQkgICAgIHNpemVvZihuYW5vYnRzX2F0dHJfYnRzKSk7CisJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoYnRzLCBvYmpfY2xhc3MsCisJCQkJCSAgICAgIGJ0cy0+YnRzX25yLCAweGZmLCAweGZmLAorCQkJCQkgICAgICBOTV9TVEFURV9VTkxPQ0tFRCk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsCisJCQkJCWJ0cy0+YnRzX25yLCAweGZmLCAweGZmKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX0NIQU5ORUw6CisJCXRzID0gb2JqOworCQl0cnggPSB0cy0+dHJ4OworCQlpZiAobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSAxICYmCisJCSAgICBuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX0RFUEVOREVOQ1kpIHsKKwkJCXBhdGNoX25tX3RhYmxlcyh0cngtPmJ0cyk7CisJCQllbnVtIGFiaXNfbm1fY2hhbl9jb21iIGNjb21iID0KKwkJCQkJCWFiaXNfbm1fY2hjb21iNHBjaGFuKHRzLT5wY2hhbik7CisJCQlhYmlzX25tX3NldF9jaGFubmVsX2F0dHIodHMsIGNjb21iKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZSh0cngtPmJ0cywgb2JqX2NsYXNzLAorCQkJCQkgICAgICB0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCB0cy0+bnIsCisJCQkJCSAgICAgIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgb2JqX2NsYXNzLAorCQkJCQl0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCB0cy0+bnIpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fT0NfUkFESU9fQ0FSUklFUjoKKwkJdHJ4ID0gb2JqOworCQlpZiAobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSAxICYmCisJCSAgICBuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09LKQorCQkJYWJpc19ubV9vcHN0YXJ0KHRyeC0+YnRzLCBvYmpfY2xhc3MsIHRyeC0+YnRzLT5idHNfbnIsCisJCQkJCXRyeC0+bnIsIDB4ZmYpOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNFOgorCQlidHMgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZ3NtX2J0cywgZ3Bycy5uc2UpOworCQlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkKKwkJCWJyZWFrOworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gNSkgeworCQkJYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCQkgIDB4ZmYsIDB4ZmYsIG5hbm9idHNfYXR0cl9uc2UsCisJCQkJCQkgIHNpemVvZihuYW5vYnRzX2F0dHJfbnNlKSk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkweGZmLCAweGZmKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCSAgICAgIDB4ZmYsIDB4ZmYsIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfQ0VMTDoKKwkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIGdwcnMuY2VsbCk7CisJCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKQorCQkJYnJlYWs7CisJCWlmIChuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSA1KSB7CisJCQlhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJCSAgMCwgMHhmZiwgbmFub2J0c19hdHRyX2NlbGwsCisJCQkJCQkgIHNpemVvZihuYW5vYnRzX2F0dHJfY2VsbCkpOworCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJMCwgMHhmZik7CisJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkgICAgICAwLCAweGZmLCBOTV9TVEFURV9VTkxPQ0tFRCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TVkM6CisJCW5zdmMgPSBvYmo7CisJCWJ0cyA9IG5zdmMtPmJ0czsKKwkJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpCisJCQlicmVhazsKKwkJLyogV2Ugc2tpcCBOU1ZDMSBzaW5jZSB3ZSBvbmx5IHVzZSBOU1ZDMCAqLworCQlpZiAobnN2Yy0+aWQgPT0gMSkKKwkJCWJyZWFrOworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PRkZfTElORSkgeworCQkJYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCQkgIG5zdmMtPmlkLCAweGZmLAorCQkJCQkJICBuYW5vYnRzX2F0dHJfbnN2YzAsCisJCQkJCQkgIHNpemVvZihuYW5vYnRzX2F0dHJfbnN2YzApKTsKKwkJCWFiaXNfbm1fb3BzdGFydChidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCW5zdmMtPmlkLCAweGZmKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCSAgICAgIG5zdmMtPmlkLCAweGZmLAorCQkJCQkgICAgICBOTV9TVEFURV9VTkxPQ0tFRCk7CisJCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBldmVyeSB0aW1lIHdlIHJlY2VpdmUgYSAxMi4yMSBTVyBhY3RpdmF0ZWQgcmVwb3J0ICovCitzdGF0aWMgaW50IHN3X2FjdGl2X3JlcChzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1iLT50cngtPmJ0czsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIGZvaC0+b2JqX2luc3QudHJ4X25yKTsKKworCWlmICghdHJ4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZm9oLT5vYmpfY2xhc3MpIHsKKwljYXNlIE5NX09DX0JBU0VCX1RSQU5TQzoKKwkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKHRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywKKwkJCQkgICAgICB0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmLAorCQkJCSAgICAgIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJYWJpc19ubV9vcHN0YXJ0KHRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywKKwkJCQl0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmKTsKKwkJLyogVFJYIHNvZnR3YXJlIGlzIGFjdGl2ZSwgdGVsbCBpdCB0byBpbml0aWF0ZSBSU0wgTGluayAqLworCQlhYmlzX25tX2lwYWNjZXNzX3JzbF9jb25uZWN0KHRyeCwgMCwgMzAwMywgdHJ4LT5yc2xfdGVpKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19SQURJT19DQVJSSUVSOiB7CisJCS8qCisJCSAqIExvY2tpbmcgdGhlIHJhZGlvIGNhcnJpZXIgd2lsbCBtYWtlIGl0IGdvCisJCSAqIG9mZmxpbmUgYWdhaW4gYW5kIHdlIHdvdWxkIGNvbWUgaGVyZS4gVGhlCisJCSAqIGZyYW1ld29yayBzaG91bGQgZGV0ZXJtaW5lIHRoYXQgdGhlcmUgd2FzCisJCSAqIG5vIGNoYW5nZSBhbmQgYXZvaWQgcmVjdXJzaW9uLgorCQkgKgorCQkgKiBUaGlzIGNvZGUgaXMgaGVyZSB0byBtYWtlIHN1cmUgdGhhdCBvbiBzdGFydAorCQkgKiBhIFRSWCByZW1haW5zIGxvY2tlZC4KKwkJICovCisJCWludCByY19zdGF0ZSA9IHRyeC0+bm1fc3RhdGUuYWRtaW5pc3RyYXRpdmU7CisJCS8qIFBhdGNoIEFSRkNOIGludG8gcmFkaW8gYXR0cmlidXRlICovCisJCW5hbm9idHNfYXR0cl9yYWRpb1s1XSAmPSAweGYwOworCQluYW5vYnRzX2F0dHJfcmFkaW9bNV0gfD0gdHJ4LT5hcmZjbiA+PiA4OworCQluYW5vYnRzX2F0dHJfcmFkaW9bNl0gPSB0cngtPmFyZmNuICYgMHhmZjsKKwkJYWJpc19ubV9zZXRfcmFkaW9fYXR0cih0cngsIG5hbm9idHNfYXR0cl9yYWRpbywKKwkJCQkgICAgICAgc2l6ZW9mKG5hbm9idHNfYXR0cl9yYWRpbykpOworCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLAorCQkJCSAgICAgIHRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYsCisJCQkJICAgICAgcmNfc3RhdGUpOworCQlhYmlzX25tX29wc3RhcnQodHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLCB0cngtPmJ0cy0+YnRzX25yLAorCQkJCXRyeC0+bnIsIDB4ZmYpOworCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIE5BQ0sgb24gdGhlIE9NTCBOTSAqLworc3RhdGljIGludCBvbWxfbXNnX25hY2sodV9pbnQ4X3QgbXQpCit7CisJaWYgKG10ID09IE5NX01UX1NFVF9CVFNfQVRUUl9OQUNLKSB7CisJCUxPR1AoRE5NLCBMT0dMX0ZBVEFMLCAiRmFpbGVkIHRvIHNldCBCVFMgYXR0cmlidXRlcy4gVGhhdCBpcyBmYXRhbC4gIgorCQkJCSJXYXMgdGhlIGJ0cyB0eXBlIGFuZCBmcmVxdWVuY3kgcHJvcGVybHkgc3BlY2lmaWVkP1xuIik7CisJCWV4aXQoLTEpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZXZlcnkgdGltZSB3ZSByZWNlaXZlIGEgc2lnbmFsIGZyb20gTk0gKi8KK3N0YXRpYyBpbnQgbm1fc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCSAgICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwl1X2ludDhfdCAqbXNnX3R5cGU7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19OTV9TV19BQ1RJVl9SRVA6CisJCXJldHVybiBzd19hY3Rpdl9yZXAoc2lnbmFsX2RhdGEpOworCWNhc2UgU19OTV9OQUNLOgorCQltc2dfdHlwZSA9IHNpZ25hbF9kYXRhOworCQlyZXR1cm4gb21sX21zZ19uYWNrKCptc2dfdHlwZSk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBib290c3RyYXBfb21fbmFub2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCS8qIFdlIGRvbid0IGRvIGNhbGxiYWNrIGJhc2VkIGJvb3RzdHJhcHBpbmcsIGJ1dCBldmVudCBkcml2ZW4gKHNlZSBhYm92ZSkgKi8KK30KKworc3RhdGljIHZvaWQgbm1fcmVjb25maWdfdHMoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwllbnVtIGFiaXNfbm1fY2hhbl9jb21iIGNjb21iID0gYWJpc19ubV9jaGNvbWI0cGNoYW4odHMtPnBjaGFuKTsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxbCA9ICZ0cy0+ZTFfbGluazsKKworCWFiaXNfbm1fc2V0X2NoYW5uZWxfYXR0cih0cywgY2NvbWIpOworCisJaWYgKGlzX2lwYWNjZXNzX2J0cyh0cy0+dHJ4LT5idHMpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHRzLT5wY2hhbikgeworCWNhc2UgR1NNX1BDSEFOX1RDSF9GOgorCWNhc2UgR1NNX1BDSEFOX1RDSF9IOgorCQlhYmlzX25tX2Nvbm5fdGVycl90cmFmKHRzLCBlMWwtPmUxX25yLCBlMWwtPmUxX3RzLAorCQkJCQllMWwtPmUxX3RzX3NzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBubV9yZWNvbmZpZ190cngoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMWwgPSAmdHJ4LT5yc2xfZTFfbGluazsKKwlpbnQgaTsKKworCXBhdGNoX25tX3RhYmxlcyh0cngtPmJ0cyk7CisKKwlzd2l0Y2ggKHRyeC0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJLyogRklYTUU6IGRpc2NvdmVyIHRoaXMgYnkgZmV0Y2hpbmcgYW4gYXR0cmlidXRlICovCisjaWYgMAorCQl0cngtPm5vbWluYWxfcG93ZXIgPSAxNTsgLyogMTVkQm0gPT0gMzBtVyBQQSBjb25maWd1cmF0aW9uICovCisjZWxzZQorCQl0cngtPm5vbWluYWxfcG93ZXIgPSAyNDsgLyogMjRkQm0gPT0gMjUwbVcgUEEgY29uZmlndXJhdGlvbiAqLworI2VuZGlmCisJCWFiaXNfbm1fY29ubl90ZXJyX3NpZ24odHJ4LCBlMWwtPmUxX25yLCBlMWwtPmUxX3RzLAorCQkJCQllMWwtPmUxX3RzX3NzKTsKKwkJYWJpc19ubV9lc3RhYmxpc2hfdGVpKHRyeC0+YnRzLCB0cngtPm5yLCBlMWwtPmUxX25yLAorCQkJCSAgICAgIGUxbC0+ZTFfdHMsIGUxbC0+ZTFfdHNfc3MsIHRyeC0+cnNsX3RlaSk7CisKKwkJLyogU2V0IFJhZGlvIEF0dHJpYnV0ZXMgKi8KKwkJaWYgKHRyeCA9PSB0cngtPmJ0cy0+YzApCisJCQlhYmlzX25tX3NldF9yYWRpb19hdHRyKHRyeCwgYnMxMV9hdHRyX3JhZGlvLAorCQkJCQkgICAgICAgc2l6ZW9mKGJzMTFfYXR0cl9yYWRpbykpOworCQllbHNlIHsKKwkJCXVfaW50OF90IHRyeDFfYXR0cl9yYWRpb1tzaXplb2YoYnMxMV9hdHRyX3JhZGlvKV07CisJCQl1X2ludDhfdCBhcmZjbl9sb3cgPSB0cngtPmFyZmNuICYgMHhmZjsKKwkJCXVfaW50OF90IGFyZmNuX2hpZ2ggPSAodHJ4LT5hcmZjbiA+PiA4KSAmIDB4MGY7CisJCQltZW1jcHkodHJ4MV9hdHRyX3JhZGlvLCBiczExX2F0dHJfcmFkaW8sCisJCQkJc2l6ZW9mKHRyeDFfYXR0cl9yYWRpbykpOworCisJCQkvKiBwYXRjaCBBUkZDTiBpbnRvIFRSWCBBdHRyaWJ1dGVzICovCisJCQl0cngxX2F0dHJfcmFkaW9bMl0gJj0gMHhmMDsKKwkJCXRyeDFfYXR0cl9yYWRpb1syXSB8PSBhcmZjbl9oaWdoOworCQkJdHJ4MV9hdHRyX3JhZGlvWzNdID0gYXJmY25fbG93OworCisJCQlhYmlzX25tX3NldF9yYWRpb19hdHRyKHRyeCwgdHJ4MV9hdHRyX3JhZGlvLAorCQkJCQkgICAgICAgc2l6ZW9mKHRyeDFfYXR0cl9yYWRpbykpOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCXN3aXRjaCAodHJ4LT5idHMtPmJhbmQpIHsKKwkJY2FzZSBHU01fQkFORF84NTA6CisJCWNhc2UgR1NNX0JBTkRfOTAwOgorCQkJdHJ4LT5ub21pbmFsX3Bvd2VyID0gMjA7CisJCQlicmVhazsKKwkJY2FzZSBHU01fQkFORF8xODAwOgorCQljYXNlIEdTTV9CQU5EXzE5MDA6CisJCQl0cngtPm5vbWluYWxfcG93ZXIgPSAyMzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJTE9HUChETk0sIExPR0xfRVJST1IsICJVbnN1cHBvcnRlZCBuYW5vQlRTIEdTTSBiYW5kICVzXG4iLAorCQkJCWdzbV9iYW5kX25hbWUodHJ4LT5idHMtPmJhbmQpKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBUUlhfTlJfVFM7IGkrKykKKwkJbm1fcmVjb25maWdfdHMoJnRyeC0+dHNbaV0pOworfQorCitzdGF0aWMgdm9pZCBubV9yZWNvbmZpZ19idHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJcGF0Y2hfbm1fdGFibGVzKGJ0cyk7CisJCWFiaXNfbm1fcmF3X21zZyhidHMsIHNpemVvZihtc2dfMSksIG1zZ18xKTsgLyogc2V0IEJUUyBTaXRlTWdyIGF0dHIqLworCQlhYmlzX25tX3NldF9idHNfYXR0cihidHMsIGJzMTFfYXR0cl9idHMsIHNpemVvZihiczExX2F0dHJfYnRzKSk7CisJCWFiaXNfbm1fcmF3X21zZyhidHMsIHNpemVvZihtc2dfMyksIG1zZ18zKTsgLyogc2V0IEJUUyBoYW5kb3ZlciBhdHRyICovCisJCWFiaXNfbm1fcmF3X21zZyhidHMsIHNpemVvZihtc2dfNCksIG1zZ180KTsgLyogc2V0IEJUUyBwb3dlciBjb250cm9sIGF0dHIgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkKKwkJbm1fcmVjb25maWdfdHJ4KHRyeCk7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbV9iczExKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJLyogc3RvcCBzZW5kaW5nIGV2ZW50IHJlcG9ydHMgKi8KKwlhYmlzX25tX2V2ZW50X3JlcG9ydHMoYnRzLCAwKTsKKworCS8qIGJlZ2luIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAxKTsKKworCS8qIGVuZCBEQiB0cmFuc21pc3Npb24gKi8KKwlhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKGJ0cywgMCk7CisKKwkvKiBSZXNldCBCVFMgU2l0ZSBtYW5hZ2VyIHJlc291cmNlICovCisJYWJpc19ubV9iczExX3Jlc2V0X3Jlc291cmNlKGJ0cyk7CisKKwkvKiBiZWdpbiBEQiB0cmFuc21pc3Npb24gKi8KKwlhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKGJ0cywgMSk7CisKKwkvKiByZWNvbmZpZ3VyZSBCVFMgd2l0aCBhbGwgVFJYIGFuZCBhbGwgVFMgKi8KKwlubV9yZWNvbmZpZ19idHMoYnRzKTsKKworCS8qIGVuZCBEQiB0cmFuc21pc3Npb24gKi8KKwlhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKGJ0cywgMCk7CisKKwkvKiBSZXNldCBCVFMgU2l0ZSBtYW5hZ2VyIHJlc291cmNlICovCisJYWJpc19ubV9iczExX3Jlc2V0X3Jlc291cmNlKGJ0cyk7CisKKwkvKiByZXN0YXJ0IHNlbmRpbmcgZXZlbnQgcmVwb3J0cyAqLworCWFiaXNfbm1fZXZlbnRfcmVwb3J0cyhidHMsIDEpOworfQorCitzdGF0aWMgdm9pZCBib290c3RyYXBfb20oc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlMT0dQKEROTSwgTE9HTF9OT1RJQ0UsICJib290c3RyYXBwaW5nIE9NTCBmb3IgQlRTICV1XG4iLCBidHMtPm5yKTsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJYm9vdHN0cmFwX29tX2JzMTEoYnRzKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJYm9vdHN0cmFwX29tX25hbm9idHMoYnRzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJVbmFibGUgdG8gYm9vdHN0cmFwIE9NTDogVW5rbm93biBCVFMgdHlwZSAlZFxuIiwgYnRzLT50eXBlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2h1dGRvd25fb20oc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlMT0dQKEROTSwgTE9HTF9OT1RJQ0UsICJzaHV0dGluZyBkb3duIE9NTCBmb3IgQlRTICV1XG4iLCBidHMtPm5yKTsKKworCS8qIHN0b3Agc2VuZGluZyBldmVudCByZXBvcnRzICovCisJYWJpc19ubV9ldmVudF9yZXBvcnRzKGJ0cywgMCk7CisKKwkvKiBiZWdpbiBEQiB0cmFuc21pc3Npb24gKi8KKwlhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKGJ0cywgMSk7CisKKwkvKiBlbmQgREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDApOworCisJLyogUmVzZXQgQlRTIFNpdGUgbWFuYWdlciByZXNvdXJjZSAqLworCWFiaXNfbm1fYnMxMV9yZXNldF9yZXNvdXJjZShidHMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBic2Nfc2h1dGRvd25fbmV0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZuZXQtPmJ0c19saXN0LCBsaXN0KSB7CisJCWludCByYzsKKwkJcmMgPSBzaHV0ZG93bl9vbShidHMpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzZXQgYWxsIHN5c3RlbSBpbmZvcm1hdGlvbiB0eXBlcyAqLworc3RhdGljIGludCBzZXRfc3lzdGVtX2luZm9zKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCWludCBpLCByYzsKKwl1X2ludDhfdCBzaV90bXBbMjNdOworCXN0cnVjdCBnc21fYnRzICpidHMgPSB0cngtPmJ0czsKKworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5tc190eHB3cl9tYXhfY2NjaCA9CisJCQltc19wd3JfY3RsX2x2bChidHMtPmJhbmQsIGJ0cy0+bXNfbWF4X3Bvd2VyKTsKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIubmVjaSA9IGJ0cy0+bmV0d29yay0+bmVjaTsKKworCWlmICh0cnggPT0gdHJ4LT5idHMtPmMwKSB7CisJCWZvciAoaSA9IDE7IGkgPD0gNDsgaSsrKSB7CisJCQlyYyA9IGdzbV9nZW5lcmF0ZV9zaShzaV90bXAsIHRyeC0+YnRzLCBpKTsKKwkJCWlmIChyYyA8IDApCisJCQkJZ290byBlcnJfb3V0OworCQkJREVCVUdQKERSUiwgIlNJJTJ1OiAlc1xuIiwgaSwgaGV4ZHVtcChzaV90bXAsIHJjKSk7CisJCQlyc2xfYmNjaF9pbmZvKHRyeCwgaSwgc2lfdG1wLCBzaXplb2Yoc2lfdG1wKSk7CisJCX0KKwkJaWYgKGJ0cy0+Z3Bycy5tb2RlICE9IEJUU19HUFJTX05PTkUpIHsKKwkJCWkgPSAxMzsKKwkJCXJjID0gZ3NtX2dlbmVyYXRlX3NpKHNpX3RtcCwgdHJ4LT5idHMsIFJTTF9TWVNURU1fSU5GT18xMyk7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gZXJyX291dDsKKwkJCURFQlVHUChEUlIsICJTSSUydTogJXNcbiIsIGksIGhleGR1bXAoc2lfdG1wLCByYykpOworCQkJcnNsX2JjY2hfaW5mbyh0cngsIFJTTF9TWVNURU1fSU5GT18xMywgc2lfdG1wLCByYyk7CisJCX0KKwl9CisKKwlpID0gNTsKKwlyYyA9IGdzbV9nZW5lcmF0ZV9zaShzaV90bXAsIHRyeC0+YnRzLCBSU0xfU1lTVEVNX0lORk9fNSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnJfb3V0OworCURFQlVHUChEUlIsICJTSSUydTogJXNcbiIsIGksIGhleGR1bXAoc2lfdG1wLCByYykpOworCXJzbF9zYWNjaF9maWxsaW5nKHRyeCwgUlNMX1NZU1RFTV9JTkZPXzUsIHNpX3RtcCwgcmMpOworCisJaSA9IDY7CisJcmMgPSBnc21fZ2VuZXJhdGVfc2koc2lfdG1wLCB0cngtPmJ0cywgUlNMX1NZU1RFTV9JTkZPXzYpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyX291dDsKKwlERUJVR1AoRFJSLCAiU0klMnU6ICVzXG4iLCBpLCBoZXhkdW1wKHNpX3RtcCwgcmMpKTsKKwlyc2xfc2FjY2hfZmlsbGluZyh0cngsIFJTTF9TWVNURU1fSU5GT182LCBzaV90bXAsIHJjKTsKKworCXJldHVybiAwOworZXJyX291dDoKKwlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkNhbm5vdCBnZW5lcmF0ZSBTSSAldSBmb3IgQlRTICV1LCBtb3N0IGxpa2VseSAiCisJCSJhIHByb2JsZW0gd2l0aCBuZWlnaGJvciBjZWxsIGxpc3QgZ2VuZXJhdGlvblxuIiwKKwkJaSwgdHJ4LT5idHMtPm5yKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBQYXRjaCB0aGUgdmFyaW91cyBTWVNURU0gSU5GT1JNQVRJT04gdGFibGVzIHRvIHVwZGF0ZQorICogdGhlIExBSQorICovCitzdGF0aWMgdm9pZCBwYXRjaF9ubV90YWJsZXMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwl1X2ludDhfdCBhcmZjbl9sb3cgPSBidHMtPmMwLT5hcmZjbiAmIDB4ZmY7CisJdV9pbnQ4X3QgYXJmY25faGlnaCA9IChidHMtPmMwLT5hcmZjbiA+PiA4KSAmIDB4MGY7CisKKwkvKiBwYXRjaCBBUkZDTiBpbnRvIEJUUyBBdHRyaWJ1dGVzICovCisJYnMxMV9hdHRyX2J0c1s2OV0gJj0gMHhmMDsKKwliczExX2F0dHJfYnRzWzY5XSB8PSBhcmZjbl9oaWdoOworCWJzMTFfYXR0cl9idHNbNzBdID0gYXJmY25fbG93OworCW5hbm9idHNfYXR0cl9idHNbNDJdICY9IDB4ZjA7CisJbmFub2J0c19hdHRyX2J0c1s0Ml0gfD0gYXJmY25faGlnaDsKKwluYW5vYnRzX2F0dHJfYnRzWzQzXSA9IGFyZmNuX2xvdzsKKworCS8qIHBhdGNoIEFSRkNOIGludG8gVFJYIEF0dHJpYnV0ZXMgKi8KKwliczExX2F0dHJfcmFkaW9bMl0gJj0gMHhmMDsKKwliczExX2F0dHJfcmFkaW9bMl0gfD0gYXJmY25faGlnaDsKKwliczExX2F0dHJfcmFkaW9bM10gPSBhcmZjbl9sb3c7CisKKwkvKiBwYXRjaCB0aGUgUkFDSCBhdHRyaWJ1dGVzICovCisJaWYgKGJ0cy0+cmFjaF9iX3RocmVzaCAhPSAtMSkgeworCQluYW5vYnRzX2F0dHJfYnRzWzMzXSA9IGJ0cy0+cmFjaF9iX3RocmVzaCAmIDB4ZmY7CisJCWJzMTFfYXR0cl9idHNbMzNdID0gYnRzLT5yYWNoX2JfdGhyZXNoICYgMHhmZjsKKwl9CisKKwlpZiAoYnRzLT5yYWNoX2xkYXZnX3Nsb3RzICE9IC0xKSB7CisJCXVfaW50OF90IGF2Z19oaWdoID0gYnRzLT5yYWNoX2xkYXZnX3Nsb3RzICYgMHhmZjsKKwkJdV9pbnQ4X3QgYXZnX2xvdyA9IChidHMtPnJhY2hfbGRhdmdfc2xvdHMgPj4gOCkgJiAweDBmOworCisJCW5hbm9idHNfYXR0cl9idHNbMzVdID0gYXZnX2hpZ2g7CisJCW5hbm9idHNfYXR0cl9idHNbMzZdID0gYXZnX2xvdzsKKwkJYnMxMV9hdHRyX2J0c1szNV0gPSBhdmdfaGlnaDsKKwkJYnMxMV9hdHRyX2J0c1szNl0gPSBhdmdfbG93OworCX0KKworCS8qIHBhdGNoIEJTSUMgKi8KKwliczExX2F0dHJfYnRzWzFdID0gYnRzLT5ic2ljOworCW5hbm9idHNfYXR0cl9idHNbc2l6ZW9mKG5hbm9idHNfYXR0cl9idHMpLTExXSA9IGJ0cy0+YnNpYzsKKworCS8qIHBhdGNoIENHSSAqLworCWFiaXNfbm1faXBhY2Nlc3NfY2dpKG5hbm9idHNfYXR0cl9idHMrc2l6ZW9mKG5hbm9idHNfYXR0cl9idHMpLTcsIGJ0cyk7CisKKwkvKiBwYXRjaCB0aGUgcG93ZXIgcmVkdWN0aW9uICovCisJYnMxMV9hdHRyX3JhZGlvWzVdID0gYnRzLT5jMC0+bWF4X3Bvd2VyX3JlZCAvIDI7CisJbmFub2J0c19hdHRyX3JhZGlvWzFdID0gYnRzLT5jMC0+bWF4X3Bvd2VyX3JlZCAvIDI7CisKKwkvKiBwYXRjaCBOU0VJICovCisJbmFub2J0c19hdHRyX25zZVszXSA9IGJ0cy0+Z3Bycy5uc2UubnNlaSA+PiA4OworCW5hbm9idHNfYXR0cl9uc2VbNF0gPSBidHMtPmdwcnMubnNlLm5zZWkgJiAweGZmOworCisJLyogcGF0Y2ggTlNWQ0kgKi8KKwluYW5vYnRzX2F0dHJfbnN2YzBbM10gPSBidHMtPmdwcnMubnN2Y1swXS5uc3ZjaSA+PiA4OworCW5hbm9idHNfYXR0cl9uc3ZjMFs0XSA9IGJ0cy0+Z3Bycy5uc3ZjWzBdLm5zdmNpICYgMHhmZjsKKworCS8qIHBhdGNoIElQIGFkZHJlc3MgYXMgU0dTTiBJUCAqLworCSoodV9pbnQxNl90ICopKG5hbm9idHNfYXR0cl9uc3ZjMCs4KSA9CisJCQkJaHRvbnMoYnRzLT5ncHJzLm5zdmNbMF0ucmVtb3RlX3BvcnQpOworCSoodV9pbnQzMl90ICopKG5hbm9idHNfYXR0cl9uc3ZjMCsxMCkgPQorCQkJCWh0b25sKGJ0cy0+Z3Bycy5uc3ZjWzBdLnJlbW90ZV9pcCk7CisJKih1X2ludDE2X3QgKikobmFub2J0c19hdHRyX25zdmMwKzE0KSA9CisJCQkJaHRvbnMoYnRzLT5ncHJzLm5zdmNbMF0ubG9jYWxfcG9ydCk7CisKKwkvKiBwYXRjaCBCVkNJICovCisJbmFub2J0c19hdHRyX2NlbGxbMTJdID0gYnRzLT5ncHJzLmNlbGwuYnZjaSA+PiA4OworCW5hbm9idHNfYXR0cl9jZWxsWzEzXSA9IGJ0cy0+Z3Bycy5jZWxsLmJ2Y2kgJiAweGZmOworCS8qIHBhdGNoIFJBQyAqLworCW5hbm9idHNfYXR0cl9jZWxsWzNdID0gYnRzLT5ncHJzLnJhYzsKKworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19FR1BSUykgeworCQkvKiBwYXRjaCBFR1BSUyBjb2Rpbmcgc2NoZW1lcyBNQ1MgMS4uOSAqLworCQluYW5vYnRzX2F0dHJfY2VsbFsyOV0gPSAweDhmOworCQluYW5vYnRzX2F0dHJfY2VsbFszMF0gPSAweGZmOworCX0KK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX3JzbChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiYm9vdHN0cmFwcGluZyBSU0wgZm9yIEJUUy9UUlggKCV1LyV1KSAiCisJCSJvbiBBUkZDTiAldSB1c2luZyBNQ0M9JXUgTU5DPSV1IExBQz0ldSBDSUQ9JXUgQlNJQz0ldSBUU0M9JXVcbiIsCisJCXRyeC0+YnRzLT5uciwgdHJ4LT5uciwgdHJ4LT5hcmZjbiwgYnNjX2dzbW5ldC0+Y291bnRyeV9jb2RlLAorCQlic2NfZ3NtbmV0LT5uZXR3b3JrX2NvZGUsIHRyeC0+YnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUsCisJCXRyeC0+YnRzLT5jZWxsX2lkZW50aXR5LCB0cngtPmJ0cy0+YnNpYywgdHJ4LT5idHMtPnRzYyk7CisJc2V0X3N5c3RlbV9pbmZvcyh0cngpOworfQorCit2b2lkIGlucHV0X2V2ZW50KGludCBldmVudCwgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJaW50IHRzX25vLCBsY2hhbl9ubzsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEVWVF9FMV9URUlfVVA6CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIEUxSU5QX1NJR05fT01MOgorCQkJYm9vdHN0cmFwX29tKHRyeC0+YnRzKTsKKwkJCWJyZWFrOworCQljYXNlIEUxSU5QX1NJR05fUlNMOgorCQkJYm9vdHN0cmFwX3JzbCh0cngpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEVWVF9FMV9URUlfRE46CisJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAiTG9zdCBzb21lIEUxIFRFSSBsaW5rOiAlZCAlcFxuIiwgdHlwZSwgdHJ4KTsKKworCQlpZiAodHlwZSA9PSBFMUlOUF9TSUdOX09NTCkKKwkJCWNvdW50ZXJfaW5jKHRyeC0+YnRzLT5uZXR3b3JrLT5zdGF0cy5idHMub21sX2ZhaWwpOworCQllbHNlIGlmICh0eXBlID09IEUxSU5QX1NJR05fUlNMKQorCQkJY291bnRlcl9pbmModHJ4LT5idHMtPm5ldHdvcmstPnN0YXRzLmJ0cy5yc2xfZmFpbCk7CisKKwkJLyoKKwkJICogZnJlZSBhbGwgYWxsb2NhdGVkIGNoYW5uZWxzLiBjaGFuZ2UgdGhlIG5tX3N0YXRlIHNvIHRoZQorCQkgKiB0cnggYW5kIHRyeF90cyBiZWNvbWVzIHVudXNhYmxlIGFuZCBjaGFuX2FsbG9jLmMgY2FuIG5vdAorCQkgKiBhbGxvY2F0ZSBmcm9tIGl0LgorCQkgKi8KKwkJZm9yICh0c19ubyA9IDA7IHRzX25vIDwgQVJSQVlfU0laRSh0cngtPnRzKTsgKyt0c19ubykgeworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW3RzX25vXTsKKworCQkJZm9yIChsY2hhbl9ubyA9IDA7IGxjaGFuX25vIDwgQVJSQVlfU0laRSh0cy0+bGNoYW4pOyArK2xjaGFuX25vKSB7CisJCQkJaWYgKHRzLT5sY2hhbltsY2hhbl9ub10uc3RhdGUgIT0gR1NNX0xDSEFOX05PTkUpCisJCQkJCWxjaGFuX2ZyZWUoJnRzLT5sY2hhbltsY2hhbl9ub10pOworCQkJCWxjaGFuX3Jlc2V0KCZ0cy0+bGNoYW5bbGNoYW5fbm9dKTsKKwkJCX0KKworCQkJdHMtPm5tX3N0YXRlLm9wZXJhdGlvbmFsID0gMDsKKwkJCXRzLT5ubV9zdGF0ZS5hdmFpbGFiaWxpdHkgPSAwOworCQl9CisKKwkJdHJ4LT5ubV9zdGF0ZS5vcGVyYXRpb25hbCA9IDA7CisJCXRyeC0+bm1fc3RhdGUuYXZhaWxhYmlsaXR5ID0gMDsKKwkJdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGUub3BlcmF0aW9uYWwgPSAwOworCQl0cngtPmJiX3RyYW5zYy5ubV9zdGF0ZS5hdmFpbGFiaWxpdHkgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYm9vdHN0cmFwX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCBpLCBuOworCisJc3dpdGNoIChidHMtPmJhbmQpIHsKKwljYXNlIEdTTV9CQU5EXzE4MDA6CisJCWlmIChidHMtPmMwLT5hcmZjbiA8IDUxMiB8fCBidHMtPmMwLT5hcmZjbiA+IDg4NSkgeworCQkJTE9HUChETk0sIExPR0xfRVJST1IsICJHU00xODAwIGNoYW5uZWwgbXVzdCBiZSBiZXR3ZWVuIDUxMi04ODUuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX0JBTkRfMTkwMDoKKwkJaWYgKGJ0cy0+YzAtPmFyZmNuIDwgNTEyIHx8IGJ0cy0+YzAtPmFyZmNuID4gODEwKSB7CisJCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkdTTTE5MDAgY2hhbm5lbCBtdXN0IGJlIGJldHdlZW4gNTEyLTgxMC5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQkFORF85MDA6CisJCWlmIChidHMtPmMwLT5hcmZjbiA8IDEgfHwKKwkJICAgKGJ0cy0+YzAtPmFyZmNuID4gMTI0ICYmIGJ0cy0+YzAtPmFyZmNuIDwgOTU1KSB8fAorCQkgICAgYnRzLT5jMC0+YXJmY24gPiAxMDIzKSAgeworCQkJTE9HUChETk0sIExPR0xfRVJST1IsICJHU005MDAgY2hhbm5lbCBtdXN0IGJlIGJldHdlZW4gMS0xMjQsIDk1NS0xMDIzLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuc3VwcG9ydGVkIGZyZXF1ZW5jeSBiYW5kLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChidHMtPm5ldHdvcmstPmF1dGhfcG9saWN5ID09IEdTTV9BVVRIX1BPTElDWV9BQ0NFUFRfQUxMICYmCisJICAgICFidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wuY2VsbF9iYXIpCisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiXG5XQVJOSU5HOiBZb3UgYXJlIHJ1bm5pbmcgYW4gJ2FjY2VwdC1hbGwnICIKKwkJCSJuZXR3b3JrIG9uIGEgQlRTIHRoYXQgaXMgbm90IGJhcnJlZC4gIFRoaXMgIgorCQkJImNvbmZpZ3VyYXRpb24gaXMgbGlrZWx5IHRvIGludGVyZmVyZSB3aXRoIHByb2R1Y3Rpb24gIgorCQkJIkdTTSBuZXR3b3JrcyBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBhIFJGICIKKwkJCSJzaGllbGRlZCBlbnZpcm9ubWVudCBzdWNoIGFzIGEgZmFyYWRheSBjYWdlIVxuXG4iKTsKKworCS8qIENvbnRyb2wgQ2hhbm5lbCBEZXNjcmlwdGlvbiAqLworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5hdHQgPSAxOworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyA9IFJTTF9CU19QQV9NRlJNU181OworCS8qIFQzMjEyIGlzIHNldCBmcm9tIHZ0eS9jb25maWcgKi8KKworCS8qIFNldCBjY2NoIGNvbmZpZyBieSBsb29raW5nIGF0IHRzIGNvbmZpZyAqLworCWZvciAobj0wLCBpPTA7IGk8ODsgaSsrKQorCQluICs9IGJ0cy0+YzAtPnRzW2ldLnBjaGFuID09IEdTTV9QQ0hBTl9DQ0NIID8gMSA6IDA7CisKKwlzd2l0Y2ggKG4pIHsKKwljYXNlIDA6CisJCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPSBSU0xfQkNDSF9DQ0NIX0NPTkZfMV9DOworCQlicmVhazsKKwljYXNlIDE6CisJCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPSBSU0xfQkNDSF9DQ0NIX0NPTkZfMV9OQzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuY2NjaF9jb25mID0gUlNMX0JDQ0hfQ0NDSF9DT05GXzJfTkM7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZiA9IFJTTF9CQ0NIX0NDQ0hfQ09ORl8zX05DOworCQlicmVhazsKKwljYXNlIDQ6CisJCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPSBSU0xfQkNDSF9DQ0NIX0NPTkZfNF9OQzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJVbnN1cHBvcnRlZCBDQ0NIIHRpbWVzbG90IGNvbmZpZ3VyYXRpb25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBzb21lIGRlZmF1bHRzIGZvciBvdXIgc3lzdGVtIGluZm9ybWF0aW9uICovCisJYnRzLT5zaV9jb21tb24uY2VsbF9vcHRpb25zLnJhZGlvX2xpbmtfdGltZW91dCA9IDI7IC8qIDEyICovCisJYnRzLT5zaV9jb21tb24uY2VsbF9vcHRpb25zLmR0eCA9IDI7IC8qIE1TIHNoYWxsIG5vdCB1c2UgdXBwbGluayBEVFggKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnMucHdyYyA9IDA7IC8qIFBXUkMgbm90IHNldCAqLworCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLmFjcyA9IDA7CisKKwlidHMtPnNpX2NvbW1vbi5uY2NfcGVybWl0dGVkID0gMHhmZjsKKworCXBhZ2luZ19pbml0KGJ0cyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGJzY19ib290c3RyYXBfbmV0d29yayhpbnQgKCptbmNjX3JlY3YpKHN0cnVjdCBnc21fbmV0d29yayAqLCBpbnQsIHZvaWQgKiksCisJCQkgIGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlKQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisJaW50IHJjOworCisJLyogaW5pdGlhbGl6ZSBvdXIgZGF0YSBzdHJ1Y3R1cmVzICovCisJYnNjX2dzbW5ldCA9IGdzbV9uZXR3b3JrX2luaXQoMSwgMSwgbW5jY19yZWN2KTsKKwlpZiAoIWJzY19nc21uZXQpCisJCXJldHVybiAtRU5PTUVNOworCisJYnNjX2dzbW5ldC0+bmFtZV9sb25nID0gdGFsbG9jX3N0cmR1cChic2NfZ3NtbmV0LCAiT3BlbkJTQyIpOworCWJzY19nc21uZXQtPm5hbWVfc2hvcnQgPSB0YWxsb2Nfc3RyZHVwKGJzY19nc21uZXQsICJPcGVuQlNDIik7CisKKwl0ZWxuZXRfaW5pdChic2NfZ3NtbmV0LCA0MjQyKTsKKwlyYyA9IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbmZpZ19maWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0ZBVEFMLCAiRmFpbGVkIHRvIHBhcnNlIHRoZSBjb25maWcgZmlsZTogJyVzJ1xuIiwgY29uZmlnX2ZpbGUpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTk0sIG5tX3NpZ19jYiwgTlVMTCk7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZic2NfZ3NtbmV0LT5idHNfbGlzdCwgbGlzdCkgeworCQlib290c3RyYXBfYnRzKGJ0cyk7CisJCWlmICghaXNfaXBhY2Nlc3NfYnRzKGJ0cykpCisJCQlyYyA9IGUxX3JlY29uZmlnX2J0cyhidHMpOworCisJCWlmIChyYyA8IDApCisJCQlleGl0ICgxKTsKKwl9CisKKwkvKiBpbml0aWFsaXplIG5hbm9CVFMgc3VwcG9ydCBvbWNlICovCisJcmMgPSBpcGFjY2Vzc19zZXR1cChic2NfZ3NtbmV0KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnNjX3JsbC5jIGIvb3BlbmJzYy9zcmMvYnNjX3JsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNGY1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ic2NfcmxsLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qIEdTTSBCU0MgUmFkaW8gTGluayBMYXllciBBUEkKKyAqIDNHUFAgVFMgMDguNTggdmVyc2lvbiA4LjYuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA1OTYgVjguNi4wICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ic2NfcmxsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKworc3RydWN0IGJzY19ybGxfcmVxIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJdV9pbnQ4X3QgbGlua19pZDsKKworCXZvaWQgKCpjYikoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsCisJCSAgIHZvaWQgKmRhdGEsIGVudW0gYnNjX3JsbHJfaW5kKTsKKwl2b2lkICpkYXRhOworfTsKKworLyogd2Ugb25seSBjb21wYXJlIEMxLCBDMiBhbmQgU0FQSSAqLworI2RlZmluZSBMSU5LSURfTUFTSwkweEM3CisKK3N0YXRpYyBMTElTVF9IRUFEKGJzY19ybGxfcmVxcyk7CisKK3N0YXRpYyB2b2lkIGNvbXBsZXRlX3JsbHIoc3RydWN0IGJzY19ybGxfcmVxICpybGxyLCBlbnVtIGJzY19ybGxyX2luZCB0eXBlKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9ICZybGxyLT5sY2hhbi0+Y29ubjsKKwlsbGlzdF9kZWwoJnJsbHItPmxpc3QpOworCXB1dF9zdWJzY3JfY29uKGNvbm4pOworCXJsbHItPmNiKHJsbHItPmxjaGFuLCBybGxyLT5saW5rX2lkLCBybGxyLT5kYXRhLCB0eXBlKTsKKwl0YWxsb2NfZnJlZShybGxyKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfY2Iodm9pZCAqX3JsbHIpCit7CisJc3RydWN0IGJzY19ybGxfcmVxICpybGxyID0gX3JsbHI7CisKKwljb21wbGV0ZV9ybGxyKHJsbHIsIEJTQ19STExSX0lORF9USU1FT1VUKTsKK30KKworLyogZXN0YWJsaXNoIGEgUkxMIGNvbm5lY3Rpb24gd2l0aCBnaXZlbiBTQVBJIC8gcHJpb3JpdHkgKi8KK2ludCBybGxfZXN0YWJsaXNoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBzYXBpLAorCQkgIHZvaWQgKCpjYikoc3RydWN0IGdzbV9sY2hhbiAqLCB1X2ludDhfdCwgdm9pZCAqLAorCQkJICAgICBlbnVtIGJzY19ybGxyX2luZCksCisJCSAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBic2NfcmxsX3JlcSk7CisJdV9pbnQ4X3QgbGlua19pZDsKKwlpZiAoIXJsbHIpCisJCXJldHVybiAtRU5PTUVNOworCisJbGlua19pZCA9IHNhcGk7CisKKwkvKiBJZiB3ZSBhcmUgYSBUQ0ggYW5kIG5vdCBpbiBzaWduYWxsaW5nIG1vZGUsIHdlIG5lZWQgdG8KKwkgKiBpbmRpY2F0ZSB0aGF0IHRoZSBuZXcgUkxMIGNvbm5lY3Rpb24gaXMgdG8gYmUgbWFkZSBvbiB0aGUgU0FDQ0ggKi8KKwlpZiAoKGxjaGFuLT50eXBlID09IEdTTV9MQ0hBTl9UQ0hfRiB8fAorCSAgICAgbGNoYW4tPnR5cGUgPT0gR1NNX0xDSEFOX1RDSF9IKSAmJiBzYXBpICE9IDApCisJCWxpbmtfaWQgfD0gMHg0MDsKKworCWNvbm4gPSAmbGNoYW4tPmNvbm47CisJdXNlX3N1YnNjcl9jb24oY29ubik7CisJcmxsci0+bGNoYW4gPSBsY2hhbjsKKwlybGxyLT5saW5rX2lkID0gbGlua19pZDsKKwlybGxyLT5jYiA9IGNiOworCXJsbHItPmRhdGEgPSBkYXRhOworCisJbGxpc3RfYWRkKCZybGxyLT5saXN0LCAmYnNjX3JsbF9yZXFzKTsKKworCXJsbHItPnRpbWVyLmNiID0gJnRpbWVyX2NiOworCXJsbHItPnRpbWVyLmRhdGEgPSBybGxyOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZybGxyLT50aW1lciwgMTAsIDApOworCisJLyogc2VuZCB0aGUgUlNMIFJMTCBFU1RhYmxpc2ggUkVRdWVzdCAqLworCXJldHVybiByc2xfZXN0YWJsaXNoX3JlcXVlc3Qocmxsci0+bGNoYW4sIHJsbHItPmxpbmtfaWQpOworfQorCisvKiBDYWxsZWQgZnJvbSBSU0wgY29kZSBpbiBjYXNlIHdlIGhhdmUgcmVjZWl2ZWQgYW4gaW5kaWNhdGlvbiByZWdhcmRpbmcKKyAqIGFueSBSTEwgbGluayAqLwordm9pZCBybGxfaW5kaWNhdGlvbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwgdV9pbnQ4X3QgdHlwZSkKK3sKKwlzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIsICpybGxyMjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmxsciwgcmxscjIsICZic2NfcmxsX3JlcXMsIGxpc3QpIHsKKwkJaWYgKHJsbHItPmxjaGFuID09IGxjaGFuICYmCisJCSAgICAocmxsci0+bGlua19pZCAmIExJTktJRF9NQVNLKSA9PSAobGlua19pZCAmIExJTktJRF9NQVNLKSkgeworCQkJYnNjX2RlbF90aW1lcigmcmxsci0+dGltZXIpOworCQkJY29tcGxldGVfcmxscihybGxyLCB0eXBlKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY192ZXJzaW9uLmMgYi9vcGVuYnNjL3NyYy9ic2NfdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNjYxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ic2NfdmVyc2lvbi5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qIEhvbGQgdGhlIGNvcHlyaWdodCBhbmQgdmVyc2lvbiBzdHJpbmcgKi8KKy8qIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImJzY2NvbmZpZy5oIgorCitjb25zdCBjaGFyICpvcGVuYnNjX3ZlcnNpb24gPSAiT3BlbkJTQyAiIFBBQ0tBR0VfVkVSU0lPTjsKK2NvbnN0IGNoYXIgKm9wZW5ic2NfY29weXJpZ2h0ID0KKwkiQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgSGFyYWxkIFdlbHRlLCBIb2xnZXIgRnJleXRoZXJcbiIKKwkiQ29udHJpYnV0aW9ucyBieSBEYW5pZWwgV2lsbG1hbm4sIEphbiBMw7xiYmUsU3RlZmFuIFNjaG1pZHRcbiIKKwkiRGlldGVyIFNwYWFyLCBBbmRyZWFzIEV2ZXJzYmVyZ1xuXG4iCisJIkxpY2Vuc2UgR1BMdjIrOiBHTlUgR1BMIHZlcnNpb24gMiBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+XG4iCisJIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmlidXRlIGl0LlxuIgorCSJUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LlxuIjsKKworCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9idHNfaXBhY2Nlc3NfbmFub2J0cy5jIGIvb3BlbmJzYy9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQ4ZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYwpAQCAtMCwwICsxLDg0IEBACisvKiBpcC5hY2Nlc3MgbmFub0JUUyBzcGVjaWZpYyBjb2RlICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgbW9kZWxfbmFub2J0cyA9IHsKKwkudHlwZSA9IEdTTV9CVFNfVFlQRV9OQU5PQlRTLAorCS5ubV9hdHRfdGx2ZGVmID0geworCQkuZGVmID0geworCQkJLyogaXAuYWNjZXNzIHNwZWNpZmljcyAqLworCQkJW05NX0FUVF9JUEFDQ19EU1RfSVBdID0JCXsgVExWX1RZUEVfRklYRUQsIDQgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlRdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9JUEFDQ19TVFJFQU1fSURdID0JeyBUTFZfVFlQRV9UViwgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMXSA9CXsgVExWX1RZUEVfVFYsIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NFQ19PTUxfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSVBfSUZfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDggfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDEyIH0sCisJCQlbTk1fQVRUX0lQQUNDX0lOX1NFUlZfVElNRV0gPQl7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisJCQlbTk1fQVRUX0lQQUNDX0xPQ0FUSU9OXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0lQQUNDX1VOSVRfSURdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19VTklUX05BTUVdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19TTk1QX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNUXSA9IHsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlZfRkxBR1NdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19GUkVRX0NUUkxdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9JUEFDQ19QUklNX09NTF9GQl9UT1VUXSA9IHsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1RJTUlOR19CVVNdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19DR0ldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkFDXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX09CSl9WRVJTSU9OXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHXT0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OU0VJXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0JWQ0ldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlNWQ0ldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlNfQ0ZHXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0JTU0dQX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0FMTV9USFJFU0hfTElTVF09CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1RdID0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19USUJfQ09OVFJPTF0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVNdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfMl0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0hFQVJUQl9UT1VUXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfVVBUSU1FXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkdfM10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NTTF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEVdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19JTUxfU1NMX1NUQVRFXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkVWT0NfREFURV0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCX0sCisJfSwKK307CisKK2ludCBidHNfbW9kZWxfbmFub2J0c19pbml0KHZvaWQpCit7CisJcmV0dXJuIGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoJm1vZGVsX25hbm9idHMpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jIGIvb3BlbmJzYy9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjY4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9idHNfc2llbWVuc19iczExLmMKQEAgLTAsMCArMSw2NiBAQAorLyogU2llbWVucyBCUy0xMSBzcGVjaWZpYyBjb2RlICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgbW9kZWxfYnMxMSA9IHsKKwkudHlwZSA9IEdTTV9CVFNfVFlQRV9CUzExLAorCS5ubV9hdHRfdGx2ZGVmID0geworCQkuZGVmID0geworCQkJW05NX0FUVF9BVkFJTF9TVEFUVVNdID0JCXsgVExWX1RZUEVfVExWIH0sCisJCQkvKiBCUzExIHNwZWNpZmljcyAqLworCQkJW05NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTF0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0JPT1RfU1dfVkVSU10gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJWzB4ZDVdID0JCQl7IFRMVl9UWVBFX1RMViB9LAorCQkJWzB4YThdID0JCQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX1BBU1NXT1JEXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfVFhQV1JdID0JCXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUlNTSV9PRkZTXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTElORV9DRkddID0gCXsgVExWX1RZUEVfVFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9MMV9QUk9UX1RZUEVdID0JeyBUTFZfVFlQRV9UViB9LAorCQkJW05NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0hdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQkJW05NX0FUVF9CUzExX0RJVkVSU0lUWV0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OXT17IFRMVl9UWVBFX1RMViB9LAkKKwkJCVtOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRV0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVZdID17IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0xNVF9VU0VSX05BTUVdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9CVFNfU1RBVEVdCT0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9FMV9TVEFURV0JPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX1BMTF9NT0RFXQk9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUExMXQk9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWV0gPQl7IFRMVl9UWVBFX1RWIH0sCisJCQlbTk1fQVRUX0JTMTFfQ0NMS19UWVBFXSA9CXsgVExWX1RZUEVfVFYgfSwKKwkJCVsweDk1XSA9CQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQl9LAorCX0sCit9OworCitpbnQgYnRzX21vZGVsX2JzMTFfaW5pdCh2b2lkKQoreworCXJldHVybiBnc21fYnRzX21vZGVsX3JlZ2lzdGVyKCZtb2RlbF9iczExKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2J0c191bmtub3duLmMgYi9vcGVuYnNjL3NyYy9idHNfdW5rbm93bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYzVkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9idHNfdW5rbm93bi5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIEdlbmVyaWMgQlRTIC0gVlRZIGNvZGUgdHJpZXMgdG8gYWxsb2NhdGUgdGhpcyBCVFMgYmVmb3JlIHR5cGUgaXMga25vd24gKi8KKworLyogKEMpIDIwMTAgYnkgRGFuaWVsIFdpbGxtYW5uIDxkYW5pZWxAdG90YWx1ZWJlcndhY2h1bmcuZGU+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKworc3RhdGljIHN0cnVjdCBnc21fYnRzX21vZGVsIG1vZGVsX3Vua25vd24gPSB7CisJLnR5cGUgPSBHU01fQlRTX1RZUEVfVU5LTk9XTiwKKwkubm1fYXR0X3RsdmRlZiA9IHsKKwkJLmRlZiA9IHsKKwkJfSwKKwl9LAorfTsKKworaW50IGJ0c19tb2RlbF91bmtub3duX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZ3NtX2J0c19tb2RlbF9yZWdpc3RlcigmbW9kZWxfdW5rbm93bik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9jaGFuX2FsbG9jLmMgYi9vcGVuYnNjL3NyYy9jaGFuX2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3YWJkYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2NoYW5fYWxsb2MuYwpAQCAtMCwwICsxLDQ1OCBAQAorLyogR1NNIENoYW5uZWwgYWxsb2NhdGlvbiByb3V0aW5lcworICoKKyAqIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCitzdGF0aWMgdm9pZCBhdXRvX3JlbGVhc2VfY2hhbm5lbCh2b2lkICpfbGNoYW4pOworCitzdGF0aWMgaW50IHRzX2lzX3VzYWJsZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCS8qIEZJWE1FOiBIb3cgZG9lcyB0aGlzIGJlaGF2ZSBmb3IgQlMtMTEgPyAqLworCWlmIChpc19pcGFjY2Vzc19idHModHMtPnRyeC0+YnRzKSkgeworCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRzLT5ubV9zdGF0ZSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IHRyeF9pc191c2FibGUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJLyogRklYTUU6IEhvdyBkb2VzIHRoaXMgYmVoYXZlIGZvciBCUy0xMSA/ICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyh0cngtPmJ0cykpIHsKKwkJaWYgKCFubV9pc19ydW5uaW5nKCZ0cngtPm5tX3N0YXRlKSB8fAorCQkgICAgIW5tX2lzX3J1bm5pbmcoJnRyeC0+YmJfdHJhbnNjLm5tX3N0YXRlKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2MwX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJICAgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGJ0cy0+YzA7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzWzBdOworCisJaWYgKHBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIICYmCisJICAgIHBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9OT05FKQorCQlyZXR1cm4gTlVMTDsKKworCXRzLT5wY2hhbiA9IHBjaGFuOworCisJcmV0dXJuIHRzOworfQorCisvKiBBbGxvY2F0ZSBhIHBoeXNpY2FsIGNoYW5uZWwgKFRTKSAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0c19hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pCit7CisJaW50IGo7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWludCBmcm9tLCB0bzsKKworCQlpZiAoIXRyeF9pc191c2FibGUodHJ4KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgYXJlIHB1cmUgcG9saWN5LAorCQkgKiBubyByZXF1aXJlbWVudCB0byBwdXQgdGhpcyByZXN0cmljdGlvbiBpbiBwbGFjZSAqLworCQlpZiAodHJ4ID09IGJ0cy0+YzApIHsKKwkJCS8qIE9uIHRoZSBmaXJzdCBUUlggd2UgcnVuIG9uZSBDQ0NIIGFuZCBvbmUgU0RDQ0g4ICovCisJCQlzd2l0Y2ggKHBjaGFuKSB7CisJCQljYXNlIEdTTV9QQ0hBTl9DQ0NIOgorCQkJY2FzZSBHU01fUENIQU5fQ0NDSF9TRENDSDQ6CisJCQkJZnJvbSA9IDA7IHRvID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgR1NNX1BDSEFOX1RDSF9GOgorCQkJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCQkJZnJvbSA9IDE7IHRvID0gNzsKKwkJCQlicmVhazsKKwkJCWNhc2UgR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOgorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEV2ZXJ5IHNlY29uZGFyeSBUUlggaXMgY29uZmlndXJlZCBmb3IgVENIL0YKKwkJCSAqIGFuZCBUQ0gvSCBvbmx5ICovCisJCQlzd2l0Y2ggKHBjaGFuKSB7CisJCQljYXNlIEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzoKKwkJCQlmcm9tID0gMTsgdG8gPSAxOworCQkJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJCQljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJCQlmcm9tID0gMTsgdG8gPSA3OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJCWZvciAoaiA9IGZyb207IGogPD0gdG87IGorKykgeworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW2pdOworCisJCQlpZiAoIXRzX2lzX3VzYWJsZSh0cykpCisJCQkJY29udGludWU7CisKKwkJCWlmICh0cy0+cGNoYW4gPT0gR1NNX1BDSEFOX05PTkUpIHsKKwkJCQl0cy0+cGNoYW4gPSBwY2hhbjsKKwkJCQkvKiBzZXQgY2hhbm5lbCBhdHRyaWJ1dGUgb24gT01MICovCisJCQkJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBhYmlzX25tX2NoY29tYjRwY2hhbihwY2hhbikpOworCQkJCXJldHVybiB0czsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogRnJlZSBhIHBoeXNpY2FsIGNoYW5uZWwgKFRTKSAqLwordm9pZCB0c19mcmVlKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJdHMtPnBjaGFuID0gR1NNX1BDSEFOX05PTkU7Cit9CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBzdWJzbG90c19wZXJfcGNoYW5bXSA9IHsKKwlbR1NNX1BDSEFOX05PTkVdID0gMCwKKwlbR1NNX1BDSEFOX0NDQ0hdID0gMCwKKwlbR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0XSA9IDQsCisJW0dTTV9QQ0hBTl9UQ0hfRl0gPSAxLAorCVtHU01fUENIQU5fVENIX0hdID0gMiwKKwlbR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDXSA9IDgsCisJLyogRklYTUU6IHdoYXQgYWJvdXQgZHluYW1pYyBUQ0hfRl9UQ0hfSCA/ICovCisJW0dTTV9QQ0hBTl9UQ0hfRl9QRENIXSA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGdzbV9sY2hhbiAqCitfbGNfZmluZF90cngoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKwlpbnQgaiwgc3M7CisKKwlpZiAoIXRyeF9pc191c2FibGUodHJ4KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCXRzID0gJnRyeC0+dHNbal07CisJCWlmICghdHNfaXNfdXNhYmxlKHRzKSkKKwkJCWNvbnRpbnVlOworCQkvKiBpcC5hY2Nlc3MgZHluYW1pYyBUQ0gvRiArIFBEQ0ggY29tYmluYXRpb24gKi8KKwkJaWYgKHRzLT5wY2hhbiA9PSBHU01fUENIQU5fVENIX0ZfUERDSCAmJgorCQkgICAgcGNoYW4gPT0gR1NNX1BDSEFOX1RDSF9GKSB7CisJCQkvKiB3ZSBjYW4gb25seSBjb25zaWRlciBzdWNoIGEgZHluYW1pYyBjaGFubmVsCisJCQkgKiBpZiB0aGUgUERDSCBpcyBjdXJyZW50bHkgaW5hY3RpdmUgKi8KKwkJCWlmICh0cy0+ZmxhZ3MgJiBUU19GX1BEQ0hfTU9ERSkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmICh0cy0+cGNoYW4gIT0gcGNoYW4pCisJCQljb250aW51ZTsKKwkJLyogY2hlY2sgaWYgYWxsIHN1Yi1zbG90cyBhcmUgYWxsb2NhdGVkIHlldCAqLworCQlmb3IgKHNzID0gMDsgc3MgPCBzdWJzbG90c19wZXJfcGNoYW5bcGNoYW5dOyBzcysrKSB7CisJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsYyA9ICZ0cy0+bGNoYW5bc3NdOworCQkJaWYgKGxjLT50eXBlID09IEdTTV9MQ0hBTl9OT05FICYmCisJCQkgICAgbGMtPnN0YXRlID09IExDSEFOX1NfTk9ORSkKKwkJCQlyZXR1cm4gbGM7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBnc21fbGNoYW4gKgorX2xjX2ZpbmRfYnRzKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsYzsKKworCWlmIChidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSkgeworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJCWxjID0gX2xjX2ZpbmRfdHJ4KHRyeCwgcGNoYW4pOworCQkJaWYgKGxjKQorCQkJCXJldHVybiBsYzsKKwkJfQorCX0gZWxzZSB7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJCWxjID0gX2xjX2ZpbmRfdHJ4KHRyeCwgcGNoYW4pOworCQkJaWYgKGxjKQorCQkJCXJldHVybiBsYzsKKwkJfQorCX0KKworCS8qIHdlIGNhbm5vdCBhbGxvY2F0ZSBtb3JlIG9mIHRoZXNlICovCisJaWYgKHBjaGFuID09IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBpZiB3ZSd2ZSByZWFjaGVkIGhlcmUsIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgcGh5c2ljYWwKKwkgKiBjaGFubmVsIGZvciB0aGUgbG9naWNhbCBjaGFubmVsIHR5cGUgcmVxdWVzdGVkICovCisJdHMgPSB0c19hbGxvYyhidHMsIHBjaGFuKTsKKwlpZiAoIXRzKSB7CisJCS8qIG5vIG1vcmUgcmFkaW8gcmVzb3VyY2VzICovCisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gJnRzLT5sY2hhblswXTsKK30KKworLyogQWxsb2NhdGUgYSBsb2dpY2FsIGNoYW5uZWwgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX2NoYW5fdCB0eXBlKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gTlVMTDsKKwllbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIGZpcnN0LCBzZWNvbmQ7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdTTV9MQ0hBTl9TRENDSDoKKwkJaWYgKGJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlKSB7CisJCQlmaXJzdCA9IEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzsKKwkJCXNlY29uZCA9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINDsKKwkJfSBlbHNlIHsKKwkJCWZpcnN0ID0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0OworCQkJc2Vjb25kID0gR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOworCQl9CisKKwkJbGNoYW4gPSBfbGNfZmluZF9idHMoYnRzLCBmaXJzdCk7CisJCWlmIChsY2hhbiA9PSBOVUxMKQorCQkJbGNoYW4gPSBfbGNfZmluZF9idHMoYnRzLCBzZWNvbmQpOworCQlicmVhazsKKwljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJbGNoYW4gPSBfbGNfZmluZF9idHMoYnRzLCBHU01fUENIQU5fVENIX0YpOworCQlicmVhazsKKwljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJbGNoYW4gPV9sY19maW5kX2J0cyhidHMsIEdTTV9QQ0hBTl9UQ0hfSCk7CisJCS8qIElmIHdlIGRvbid0IGhhdmUgVENIL0ggYXZhaWxhYmxlLCBmYWxsLWJhY2sgdG8gVENIL0YgKi8KKwkJaWYgKCFsY2hhbikgeworCQkJbGNoYW4gPSBfbGNfZmluZF9idHMoYnRzLCBHU01fUENIQU5fVENIX0YpOworCQkJdHlwZSA9IEdTTV9MQ0hBTl9UQ0hfRjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSTEwsIExPR0xfRVJST1IsICJVbmtub3duIGdzbV9jaGFuX3QgJXVcbiIsIHR5cGUpOworCX0KKworCWlmIChsY2hhbikgeworCQlsY2hhbi0+dHlwZSA9IHR5cGU7CisKKwkJLyogY2xlYXIgc2FwaXMgKi8KKwkJbWVtc2V0KGxjaGFuLT5zYXBpcywgMCwgQVJSQVlfU0laRShsY2hhbi0+c2FwaXMpKTsKKworCQkvKiBjbGVhciBtdWx0aSByYXRlIGNvbmZpZyAqLworCQltZW1zZXQoJmxjaGFuLT5tcl9jb25mLCAwLCBzaXplb2YobGNoYW4tPm1yX2NvbmYpKTsKKworCQkvKiBjbGVhciBwZXIgTVNDL0JTQyBkYXRhICovCisJCW1lbXNldCgmbGNoYW4tPmNvbm4sIDAsIHNpemVvZihsY2hhbi0+Y29ubikpOworCisJCS8qIENvbmZpZ3VyZSB0aGUgdGltZSBhbmQgc3RhcnQgaXQgc28gaXQgd2lsbCBiZSBjbG9zZWQgKi8KKwkJbGNoYW4tPmNvbm4ubGNoYW4gPSBsY2hhbjsKKwkJbGNoYW4tPmNvbm4uYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwkJbGNoYW4tPmNvbm4ucmVsZWFzZV90aW1lci5jYiA9IGF1dG9fcmVsZWFzZV9jaGFubmVsOworCQlsY2hhbi0+Y29ubi5yZWxlYXNlX3RpbWVyLmRhdGEgPSBsY2hhbjsKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+Y29ubi5yZWxlYXNlX3RpbWVyLCBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQpOworCisJfSBlbHNlIHsKKwkJc3RydWN0IGNoYWxsb2Nfc2lnbmFsX2RhdGEgc2lnOworCQlzaWcuYnRzID0gYnRzOworCQlzaWcudHlwZSA9IHR5cGU7CisJCWRpc3BhdGNoX3NpZ25hbChTU19DSEFMTE9DLCBTX0NIQUxMT0NfQUxMT0NfRkFJTCwgJnNpZyk7CisJfQorCisJcmV0dXJuIGxjaGFuOworfQorCisvKiBGcmVlIGEgbG9naWNhbCBjaGFubmVsICovCit2b2lkIGxjaGFuX2ZyZWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGNoYWxsb2Nfc2lnbmFsX2RhdGEgc2lnOworCWludCBpOworCisJc2lnLnR5cGUgPSBsY2hhbi0+dHlwZTsKKwlsY2hhbi0+dHlwZSA9IEdTTV9MQ0hBTl9OT05FOworCWlmIChsY2hhbi0+Y29ubi5zdWJzY3IpIHsKKwkJc3Vic2NyX3B1dChsY2hhbi0+Y29ubi5zdWJzY3IpOworCQlsY2hhbi0+Y29ubi5zdWJzY3IgPSBOVUxMOworCX0KKworCS8qIFdlIG1pZ2h0IGtpbGwgYW4gYWN0aXZlIGNoYW5uZWwuLi4gKi8KKwlpZiAobGNoYW4tPmNvbm4udXNlX2NvdW50ICE9IDApIHsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX1VORVhQRUNURURfUkVMRUFTRSwgbGNoYW4pOworCQlsY2hhbi0+Y29ubi51c2VfY291bnQgPSAwOworCX0KKworCS8qIHN0b3AgdGhlIHRpbWVyICovCisJYnNjX2RlbF90aW1lcigmbGNoYW4tPmNvbm4ucmVsZWFzZV90aW1lcik7CisJYnNjX2RlbF90aW1lcigmbGNoYW4tPlQzMTAxKTsKKworCS8qIGNsZWFyIGNhY2hlZCBtZWFzdWVtZW50IHJlcG9ydHMgKi8KKwlsY2hhbi0+bWVhc19yZXBfaWR4ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApOyBpKyspIHsKKwkJbGNoYW4tPm1lYXNfcmVwW2ldLmZsYWdzID0gMDsKKwkJbGNoYW4tPm1lYXNfcmVwW2ldLm5yID0gMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGNoYW4tPm5laWdoX21lYXMpOyBpKyspCisJCWxjaGFuLT5uZWlnaF9tZWFzW2ldLmFyZmNuID0gMDsKKworCWxjaGFuLT5jb25uLnNpbGVudF9jYWxsID0gMDsKKworCXNpZy5sY2hhbiA9IGxjaGFuOworCXNpZy5idHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCWRpc3BhdGNoX3NpZ25hbChTU19DSEFMTE9DLCBTX0NIQUxMT0NfRlJFRUQsICZzaWcpOworCisJLyogRklYTUU6IHRzX2ZyZWUoKSB0aGUgdGltZXNsb3QsIGlmIHdlJ3JlIHRoZSBsYXN0IGxvZ2ljYWwKKwkgKiBjaGFubmVsIHVzaW5nIGl0ICovCit9CisKKy8qCisgKiBUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgVFJYIGFuZCB3ZSBuZWVkIHRvIGZvcmdldAorICogYW55IHN0YXRlIHNvIHRoYXQgYSBsY2hhbiBjYW4gYmUgYWxsb2NhdGVkIGFnYWluIGFmdGVyCisgKiB0aGUgdHJ4IGlzIGZ1bGx5IHVzYWJsZS4KKyAqLwordm9pZCBsY2hhbl9yZXNldChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlic2NfZGVsX3RpbWVyKCZsY2hhbi0+VDMxMDEpOworCisJbGNoYW4tPnR5cGUgPSBHU01fTENIQU5fTk9ORTsKKwlsY2hhbi0+c3RhdGUgPSBMQ0hBTl9TX05PTkU7Cit9CisKKworLyogQ29uc2lkZXIgcmVsZWFzaW5nIHRoZSBjaGFubmVsIG5vdyAqLworaW50IGxjaGFuX2F1dG9fcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlpZiAobGNoYW4tPmNvbm4udXNlX2NvdW50ID4gMCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBc3N1bWUgd2UgaGF2ZSBHU00wNC4wOCBydW5uaW5nIGFuZCBzZW5kIGEgcmVsZWFzZSAqLworCWlmIChsY2hhbi0+Y29ubi5zdWJzY3IpIHsKKwkJZ3NtNDhfc2VuZF9ycl9yZWxlYXNlKGxjaGFuKTsKKwl9CisKKwkvKiBzcG9vZmVkPyBtZXNzYWdlICovCisJaWYgKGxjaGFuLT5jb25uLnVzZV9jb3VudCA8IDApCisJCUxPR1AoRFJMTCwgTE9HTF9FUlJPUiwgIkNoYW5uZWwgY291bnQgaXMgbmVnYXRpdmU6ICVkXG4iLAorCQkJbGNoYW4tPmNvbm4udXNlX2NvdW50KTsKKworCURFQlVHUChEUkxMLCAiJXMgUmVjeWNsaW5nIENoYW5uZWxcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisJcnNsX2xjaGFuX3NldF9zdGF0ZShsY2hhbiwgTENIQU5fU19SRUxfUkVRKTsKKwlyc2xfcmVsZWFzZV9yZXF1ZXN0KGxjaGFuLCAwKTsKKwlyZXR1cm4gMTsKK30KKworLyogQXV0byByZWxlYXNlIHRoZSBjaGFubmVsIHdoZW4gdGhlIHVzZSBjb3VudCBpcyB6ZXJvICovCitzdGF0aWMgdm9pZCBhdXRvX3JlbGVhc2VfY2hhbm5lbCh2b2lkICpfbGNoYW4pCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBfbGNoYW47CisKKwlpZiAoIWxjaGFuX2F1dG9fcmVsZWFzZShsY2hhbikpCisJCWJzY19zY2hlZHVsZV90aW1lcigmbGNoYW4tPmNvbm4ucmVsZWFzZV90aW1lciwgTENIQU5fUkVMRUFTRV9USU1FT1VUKTsKK30KKworc3RydWN0IGdzbV9sY2hhbiogbGNoYW5fZmluZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikgeworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCWludCB0c19ubywgbGNoYW5fbm87CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWZvciAodHNfbm8gPSAwOyB0c19ubyA8IDg7ICsrdHNfbm8pIHsKKwkJCWZvciAobGNoYW5fbm8gPSAwOyBsY2hhbl9ubyA8IFRTX01BWF9MQ0hBTjsgKytsY2hhbl9ubykgeworCQkJCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0KKwkJCQkJJnRyeC0+dHNbdHNfbm9dLmxjaGFuW2xjaGFuX25vXTsKKwkJCQlpZiAoc3Vic2NyID09IGxjaGFuLT5jb25uLnN1YnNjcikKKwkJCQkJcmV0dXJuIGxjaGFuOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHN1YnNjci0+bmV0OworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkgeworCQlsY2hhbiA9IGxjaGFuX2ZpbmQoYnRzLCBzdWJzY3IpOworCQlpZiAobGNoYW4pCisJCQlyZXR1cm4gbGNoYW47CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgYnRzX2NoYW5fbG9hZChzdHJ1Y3QgcGNoYW5fbG9hZCAqY2wsIGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWludCBpOworCisJCS8qIHNraXAgYWRtaW5pc3RyYXRpdmVseSBkZWFjdGl2YXRlZCB0cmFueHNjZWl2ZXJzICovCisJCWlmICghbm1faXNfcnVubmluZygmdHJ4LT5ubV9zdGF0ZSkgfHwKKwkJICAgICFubV9pc19ydW5uaW5nKCZ0cngtPmJiX3RyYW5zYy5ubV9zdGF0ZSkpCisJCQljb250aW51ZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0cngtPnRzKTsgaSsrKSB7CisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNbaV07CisJCQlzdHJ1Y3QgbG9hZF9jb3VudGVyICpwbCA9ICZjbC0+cGNoYW5bdHMtPnBjaGFuXTsKKwkJCWludCBqOworCisJCQkvKiBza2lwIGFkbWluaXN0cmF0aXZlbHkgZGVhY3RpdmF0ZWQgdGltZXNsb3RzICovCisJCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRzLT5ubV9zdGF0ZSkpCisJCQkJY29udGludWU7CisKKwkJCWZvciAoaiA9IDA7IGogPCBzdWJzbG90c19wZXJfcGNoYW5bdHMtPnBjaGFuXTsgaisrKSB7CisJCQkJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSAmdHMtPmxjaGFuW2pdOworCisJCQkJcGwtPnRvdGFsKys7CisKKwkJCQlzd2l0Y2ggKGxjaGFuLT5zdGF0ZSkgeworCQkJCWNhc2UgTENIQU5fU19OT05FOgorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlwbC0+dXNlZCsrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgbmV0d29ya19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKnBsLCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJbWVtc2V0KHBsLCAwLCBzaXplb2YoKnBsKSk7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZuZXQtPmJ0c19saXN0LCBsaXN0KQorCQlidHNfY2hhbl9sb2FkKHBsLCBidHMpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZGIuYyBiL29wZW5ic2Mvc3JjL2RiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmNDdhYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2RiLmMKQEAgLTAsMCArMSwxMTgyIEBACisvKiBTaW1wbGUgSExSL1ZMUiBkYXRhYmFzZSBiYWNrZW5kIHVzaW5nIGRiaSAqLworLyogKEMpIDIwMDggYnkgSmFuIEx1ZWJiZSA8amx1ZWJiZUBkZWJpYW4ub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zdGF0aXN0aWNzLmg+CisKKyNpbmNsdWRlIDxsaWJnZW4uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZGJpL2RiaS5oPgorCitzdGF0aWMgY2hhciAqZGJfYmFzZW5hbWUgPSBOVUxMOworc3RhdGljIGNoYXIgKmRiX2Rpcm5hbWUgPSBOVUxMOworc3RhdGljIGRiaV9jb25uIGNvbm47CisKK3N0YXRpYyBjaGFyICpjcmVhdGVfc3RtdHNbXSA9IHsKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgTWV0YSAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJrZXkgVEVYVCBVTklRVUUgTk9UIE5VTEwsICIKKwkJInZhbHVlIFRFWFQgTk9UIE5VTEwiCisJCSIpIiwKKwkiSU5TRVJUIE9SIElHTk9SRSBJTlRPIE1ldGEgIgorCQkiKGtleSwgdmFsdWUpICIKKwkJIlZBTFVFUyAiCisJCSIoJ3JldmlzaW9uJywgJzInKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFN1YnNjcmliZXIgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInVwZGF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJpbXNpIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJuYW1lIFRFWFQsICIKKwkJImV4dGVuc2lvbiBURVhUIFVOSVFVRSwgIgorCQkiYXV0aG9yaXplZCBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwgIgorCQkidG1zaSBURVhUIFVOSVFVRSwgIgorCQkibGFjIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEF1dGhUb2tlbiAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJzdWJzY3JpYmVyX2lkIElOVEVHRVIgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidG9rZW4gVEVYVCBVTklRVUUgTk9UIE5VTEwiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgRXF1aXBtZW50ICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1cGRhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhULCAiCisJCSJjbGFzc21hcmsxIE5VTUVSSUMsICIKKwkJImNsYXNzbWFyazIgQkxPQiwgIgorCQkiY2xhc3NtYXJrMyBCTE9CLCAiCisJCSJpbWVpIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEVxdWlwbWVudFdhdGNoICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1cGRhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkic3Vic2NyaWJlcl9pZCBOVU1FUklDIE5PVCBOVUxMLCAiCisJCSJlcXVpcG1lbnRfaWQgTlVNRVJJQyBOT1QgTlVMTCwgIgorCQkiVU5JUVVFIChzdWJzY3JpYmVyX2lkLCBlcXVpcG1lbnRfaWQpICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBTTVMgKCIKKwkJLyogbWV0YWRhdGEsIG5vdCBwYXJ0IG9mIHNtcyAqLworCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkic2VudCBUSU1FU1RBTVAsICIKKwkJInNlbmRlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJyZWNlaXZlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJkZWxpdmVyX2F0dGVtcHRzIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLCAiCisJCS8qIGRhdGEgZGlyZWN0bHkgY29waWVkL2Rlcml2ZWQgZnJvbSBTTVMgKi8KKwkJInZhbGlkX3VudGlsIFRJTUVTVEFNUCwgIgorCQkicmVwbHlfcGF0aF9yZXEgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkic3RhdHVzX3JlcF9yZXEgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkicHJvdG9jb2xfaWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiZGF0YV9jb2Rpbmdfc2NoZW1lIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInVkX2hkcl9pbmQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiZGVzdF9hZGRyIFRFWFQsICIKKwkJInVzZXJfZGF0YSBCTE9CLCAiCS8qIFRQLVVEICovCisJCS8qIGFkZGl0aW9uYWwgZGF0YSwgaW50ZXJwcmV0ZWQgZnJvbSBTTVMgKi8KKwkJImhlYWRlciBCTE9CLCAiCQkvKiBVRCBIZWFkZXIgKi8KKwkJInRleHQgVEVYVCAiCQkvKiBkZWNvZGVkIFVEIGFmdGVyIFVESCAqLworCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFZMUiAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidXBkYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInN1YnNjcmliZXJfaWQgTlVNRVJJQyBVTklRVUUgTk9UIE5VTEwsICIKKwkJImxhc3RfYnRzIE5VTUVSSUMgTk9UIE5VTEwgIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEFwZHVCbG9icyAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkiYXBkdV9pZF9mbGFncyBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJzdWJzY3JpYmVyX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImFwZHUgQkxPQiAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQ291bnRlcnMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkidGltZXN0YW1wIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidmFsdWUgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhUIE5PVCBOVUxMICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBdXRoS2V5cyAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJzdWJzY3JpYmVyX2lkIElOVEVHRVIgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJhbGdvcml0aG1faWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiYTNhOF9raSBCTE9CICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBdXRoVHVwbGVzICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJInN1YnNjcmliZXJfaWQgTlVNRVJJQyBVTklRVUUgTk9UIE5VTEwsICIKKwkJImlzc3VlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInVzZV9jb3VudCBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwgIgorCQkia2V5X3NlcSBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJyYW5kIEJMT0IgTk9UIE5VTEwsICIKKwkJInNyZXMgQkxPQiBOT1QgTlVMTCwgIgorCQkia2MgQkxPQiBOT1QgTlVMTCAiCisJCSIpIiwKK307CisKK3ZvaWQgZGJfZXJyb3JfZnVuYyhkYmlfY29ubiBjb25uLCB2b2lkICpkYXRhKQoreworCWNvbnN0IGNoYXIgKm1zZzsKKwlkYmlfY29ubl9lcnJvcihjb25uLCAmbXNnKTsKKwlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkRCSTogJXNcbiIsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZGJfcmV2aXNpb24odm9pZCkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljb25zdCBjaGFyICpyZXY7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeShjb25uLAorCQkJCSJTRUxFQ1QgdmFsdWUgRlJPTSBNZXRhIFdIRVJFIGtleT0ncmV2aXNpb24nIik7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXYgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAidmFsdWUiKTsKKwlpZiAoIXJldiB8fCBhdG9pKHJldikgIT0gMikgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9pbml0KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJZGJpX2luaXRpYWxpemUoTlVMTCk7CisKKwljb25uID0gZGJpX2Nvbm5fbmV3KCJzcWxpdGUzIik7CisJaWYgKGNvbm4gPT0gTlVMTCkgeworCQlMT0dQKEREQiwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byBjcmVhdGUgY29ubmVjdGlvbi5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkYmlfY29ubl9lcnJvcl9oYW5kbGVyKCBjb25uLCBkYl9lcnJvcl9mdW5jLCBOVUxMICk7CisKKwkvKiBNeVNRTAorCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImhvc3QiLCAibG9jYWxob3N0Iik7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAidXNlcm5hbWUiLCAieW91cl9uYW1lIik7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAicGFzc3dvcmQiLCAieW91cl9wYXNzd29yZCIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImRibmFtZSIsICJ5b3VyX2RibmFtZSIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImVuY29kaW5nIiwgIlVURi04Iik7CisJKi8KKworCS8qIFNxTGl0ZSAzICovCisJZGJfYmFzZW5hbWUgPSBzdHJkdXAobmFtZSk7CisJZGJfZGlybmFtZSA9IHN0cmR1cChuYW1lKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJzcWxpdGUzX2RiZGlyIiwgZGlybmFtZShkYl9kaXJuYW1lKSk7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAiZGJuYW1lIiwgYmFzZW5hbWUoZGJfYmFzZW5hbWUpKTsKKworCWlmIChkYmlfY29ubl9jb25uZWN0KGNvbm4pIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJZnJlZShkYl9kaXJuYW1lKTsKKwlmcmVlKGRiX2Jhc2VuYW1lKTsKKwlkYl9kaXJuYW1lID0gZGJfYmFzZW5hbWUgPSBOVUxMOworCXJldHVybiAtMTsKK30KKworCitpbnQgZGJfcHJlcGFyZSgpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcmVhdGVfc3RtdHMpOyBpKyspIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnkoY29ubiwgY3JlYXRlX3N0bXRzW2ldKTsKKwkJaWYgKCFyZXN1bHQpIHsKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLAorCQkJICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBzb21lIHRhYmxlLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisKKwlpZiAoY2hlY2tfZGJfcmV2aXNpb24oKSA8IDApIHsKKwkJTE9HUChEREIsIExPR0xfRkFUQUwsICJEYXRhYmFzZSBzY2hlbWEgcmV2aXNpb24gaW52YWxpZCwgIgorCQkJInBsZWFzZSB1cGRhdGUgeW91ciBkYXRhYmFzZSBzY2hlbWFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRiX2ZpbmkoKQoreworCWRiaV9jb25uX2Nsb3NlKGNvbm4pOworCWRiaV9zaHV0ZG93bigpOworCisJaWYgKGRiX2Rpcm5hbWUpCisJICAgIGZyZWUoZGJfZGlybmFtZSk7CisJaWYgKGRiX2Jhc2VuYW1lKQorCSAgICBmcmVlKGRiX2Jhc2VuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpkYl9jcmVhdGVfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgY2hhciAqaW1zaSkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCS8qIElzIHRoaXMgc3Vic2NyaWJlciBrbm93biBpbiB0aGUgZGI/ICovCisJc3Vic2NyID0gZGJfZ2V0X3N1YnNjcmliZXIobmV0LCBHU01fU1VCU0NSSUJFUl9JTVNJLCBpbXNpKTsKKwlpZiAoc3Vic2NyKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICJVUERBVEUgU3Vic2NyaWJlciBzZXQgdXBkYXRlZCA9IGRhdGV0aW1lKCdub3cnKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIGltc2kgPSAlcyAiICwgaW1zaSk7CisJCWlmICghcmVzdWx0KQorCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJmYWlsZWQgdG8gdXBkYXRlIHRpbWVzdGFtcFxuIik7CisJCWVsc2UKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gc3Vic2NyOworCX0KKworCXN1YnNjciA9IHN1YnNjcl9hbGxvYygpOworCXN1YnNjci0+ZmxhZ3MgfD0gR1NNX1NVQlNDUklCRVJfRklSU1RfQ09OVEFDVDsKKwlpZiAoIXN1YnNjcikKKwkJcmV0dXJuIE5VTEw7CisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBTdWJzY3JpYmVyICIKKwkJIihpbXNpLCBjcmVhdGVkLCB1cGRhdGVkKSAiCisJCSJWQUxVRVMgIgorCQkiKCVzLCBkYXRldGltZSgnbm93JyksIGRhdGV0aW1lKCdub3cnKSkgIiwKKwkJaW1zaQorCSk7CisJaWYgKCFyZXN1bHQpCisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBTdWJzY3JpYmVyIGJ5IElNU0kuXG4iKTsKKwlzdWJzY3ItPm5ldCA9IG5ldDsKKwlzdWJzY3ItPmlkID0gZGJpX2Nvbm5fc2VxdWVuY2VfbGFzdChjb25uLCBOVUxMKTsKKwlzdHJuY3B5KHN1YnNjci0+aW1zaSwgaW1zaSwgR1NNX0lNU0lfTEVOR1RILTEpOworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCUxPR1AoRERCLCBMT0dMX0lORk8sICJOZXcgU3Vic2NyaWJlcjogSUQgJWxsdSwgSU1TSSAlc1xuIiwgc3Vic2NyLT5pZCwgc3Vic2NyLT5pbXNpKTsKKwlkYl9zdWJzY3JpYmVyX2FsbG9jX2V4dGVuKHN1YnNjcik7CisJcmV0dXJuIHN1YnNjcjsKK30KKworc3RhdGljX2Fzc2VydChzaXplb2YodW5zaWduZWQgY2hhcikgPT0gc2l6ZW9mKHN0cnVjdCBnc200OF9jbGFzc21hcmsxKSwgY2xhc3NtYXJrMV9zaXplKTsKKworc3RhdGljIGludCBnZXRfZXF1aXBtZW50X2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljb25zdCBjaGFyICpzdHJpbmc7CisJdW5zaWduZWQgY2hhciBjbTE7CisJY29uc3QgdW5zaWduZWQgY2hhciAqY20yLCAqY20zOworCXN0cnVjdCBnc21fZXF1aXBtZW50ICplcXVpcCA9ICZzdWJzY3ItPmVxdWlwbWVudDsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJTRUxFQ1QgZXF1aXBtZW50LiogRlJPTSBFcXVpcG1lbnQsRXF1aXBtZW50V2F0Y2ggIgorCQkJCSJXSEVSRSBFcXVpcG1lbnRXYXRjaC5lcXVpcG1lbnRfaWQ9RXF1aXBtZW50LmlkICIKKwkJCQkiQU5EIEVxdWlwbWVudFdhdGNoLnN1YnNjcmliZXJfaWQgPSAlbGx1ICIKKwkJCQkiT1JERVIgQlkgdXBkYXRlZCBERVNDIiwgc3Vic2NyLT5pZCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWVxdWlwLT5pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJpZCIpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgImltZWkiKTsKKwlpZiAoc3RyaW5nKQorCQlzdHJuY3B5KGVxdWlwLT5pbWVpLCBzdHJpbmcsIHNpemVvZihlcXVpcC0+aW1laSkpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgImNsYXNzbWFyazEiKTsKKwlpZiAoc3RyaW5nKSB7CisJCWNtMSA9IGF0b2koc3RyaW5nKSAmIDB4ZmY7CisJCW1lbWNweSgmZXF1aXAtPmNsYXNzbWFyazEsICZjbTEsIHNpemVvZihlcXVpcC0+Y2xhc3NtYXJrMSkpOworCX0KKworCWVxdWlwLT5jbGFzc21hcmsyX2xlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJjbGFzc21hcmsyIik7CisJY20yID0gZGJpX3Jlc3VsdF9nZXRfYmluYXJ5KHJlc3VsdCwgImNsYXNzbWFyazIiKTsKKwlpZiAoZXF1aXAtPmNsYXNzbWFyazJfbGVuID4gc2l6ZW9mKGVxdWlwLT5jbGFzc21hcmsyKSkKKwkJZXF1aXAtPmNsYXNzbWFyazJfbGVuID0gc2l6ZW9mKGVxdWlwLT5jbGFzc21hcmsyKTsKKwltZW1jcHkoZXF1aXAtPmNsYXNzbWFyazIsIGNtMiwgZXF1aXAtPmNsYXNzbWFyazJfbGVuKTsKKworCWVxdWlwLT5jbGFzc21hcmszX2xlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJjbGFzc21hcmszIik7CisJY20zID0gZGJpX3Jlc3VsdF9nZXRfYmluYXJ5KHJlc3VsdCwgImNsYXNzbWFyazMiKTsKKwlpZiAoZXF1aXAtPmNsYXNzbWFyazNfbGVuID4gc2l6ZW9mKGVxdWlwLT5jbGFzc21hcmszKSkKKwkJZXF1aXAtPmNsYXNzbWFyazNfbGVuID0gc2l6ZW9mKGVxdWlwLT5jbGFzc21hcmszKTsKKwltZW1jcHkoZXF1aXAtPmNsYXNzbWFyazMsIGNtMywgZXF1aXAtPmNsYXNzbWFyazNfbGVuKTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfYXV0aGluZm9fYnlfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywKKwkJCSAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmEzYThfa2k7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIEF1dGhLZXlzIFdIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJIHN1YnNjci0+aWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlhaW5mby0+YXV0aF9hbGdvID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImFsZ29yaXRobV9pZCIpOworCWFpbmZvLT5hM2E4X2tpX2xlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJhM2E4X2tpIik7CisJYTNhOF9raSA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJhM2E4X2tpIik7CisJaWYgKGFpbmZvLT5hM2E4X2tpX2xlbiA+IHNpemVvZihhaW5mby0+YTNhOF9raSkpCisJCWFpbmZvLT5hM2E4X2tpX2xlbiA9IHNpemVvZihhaW5mby0+YTNhOF9raV9sZW4pOworCW1lbWNweShhaW5mby0+YTNhOF9raSwgYTNhOF9raSwgYWluZm8tPmEzYThfa2lfbGVuKTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzZXRfYXV0aGluZm9fZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyAqYWluZm8sCisJCQkgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9hdXRoX2luZm8gYWluZm9fb2xkOworCWludCByYywgdXBkOworCXVuc2lnbmVkIGNoYXIgKmtpX3N0cjsKKworCS8qIERlbGV0aW9uID8gKi8KKwlpZiAoYWluZm8gPT0gTlVMTCkgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJERUxFVEUgRlJPTSBBdXRoS2V5cyBXSEVSRSBzdWJzY3JpYmVyX2lkPSV1IiwKKwkJCXN1YnNjci0+aWQpOworCisJCWlmICghcmVzdWx0KQorCQkJcmV0dXJuIC1FSU87CisKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgaWYgYWxyZWFkeSBleGlzdGluZyAqLworCXJjID0gZ2V0X2F1dGhpbmZvX2J5X3N1YnNjcigmYWluZm9fb2xkLCBzdWJzY3IpOworCWlmIChyYyAmJiByYyAhPSAtRU5PRU5UKQorCQlyZXR1cm4gcmM7CisJdXBkID0gcmMgPyAwIDogMTsKKworCS8qIFVwZGF0ZSAvIEluc2VydCAqLworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sCisJCWFpbmZvLT5hM2E4X2tpLCBhaW5mby0+YTNhOF9raV9sZW4sICZraV9zdHIpOworCisJaWYgKCF1cGQpIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkJIklOU0VSVCBJTlRPIEF1dGhLZXlzICIKKwkJCQkiKHN1YnNjcmliZXJfaWQsIGFsZ29yaXRobV9pZCwgYTNhOF9raSkgIgorCQkJCSJWQUxVRVMgKCV1LCAldSwgJXMpIiwKKwkJCQlzdWJzY3ItPmlkLCBhaW5mby0+YXV0aF9hbGdvLCBraV9zdHIpOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJVUERBVEUgQXV0aEtleXMgIgorCQkJCSJTRVQgYWxnb3JpdGhtX2lkPSV1LCBhM2E4X2tpPSVzICIKKwkJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCisJCQkJYWluZm8tPmF1dGhfYWxnbywga2lfc3RyLCBzdWJzY3ItPmlkKTsKKwl9CisKKwlmcmVlKGtpX3N0cik7CisKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZ2V0X2F1dGh0dXBsZV9ieV9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisJCQkgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJaW50IGxlbjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpibG9iOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiU0VMRUNUICogRlJPTSBBdXRoVHVwbGVzIFdIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJc3Vic2NyLT5pZCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCW1lbXNldChhdHVwbGUsIDAsIHNpemVvZihhdHVwbGUpKTsKKworCWF0dXBsZS0+dXNlX2NvdW50ID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgInVzZV9jb3VudCIpOworCWF0dXBsZS0+a2V5X3NlcSA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJrZXlfc2VxIik7CisKKwlsZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAicmFuZCIpOworCWlmIChsZW4gIT0gc2l6ZW9mKGF0dXBsZS0+cmFuZCkpCisJCWdvdG8gZXJyX3NpemU7CisKKwlibG9iID0gZGJpX3Jlc3VsdF9nZXRfYmluYXJ5KHJlc3VsdCwgInJhbmQiKTsKKwltZW1jcHkoYXR1cGxlLT5yYW5kLCBibG9iLCBsZW4pOworCisJbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgInNyZXMiKTsKKwlpZiAobGVuICE9IHNpemVvZihhdHVwbGUtPnNyZXMpKQorCQlnb3RvIGVycl9zaXplOworCisJYmxvYiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJzcmVzIik7CisJbWVtY3B5KGF0dXBsZS0+c3JlcywgYmxvYiwgbGVuKTsKKworCWxlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJrYyIpOworCWlmIChsZW4gIT0gc2l6ZW9mKGF0dXBsZS0+a2MpKQorCQlnb3RvIGVycl9zaXplOworCisJYmxvYiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJrYyIpOworCW1lbWNweShhdHVwbGUtPmtjLCBibG9iLCBsZW4pOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3NpemU6CisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIC1FSU87Cit9CisKK2ludCBzZXRfYXV0aHR1cGxlX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisJCQkgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWludCByYywgdXBkOworCXN0cnVjdCBnc21fYXV0aF90dXBsZSBhdHVwbGVfb2xkOworCXVuc2lnbmVkIGNoYXIgKnJhbmRfc3RyLCAqc3Jlc19zdHIsICprY19zdHI7CisKKwkvKiBEZWxldGlvbiA/ICovCisJaWYgKGF0dXBsZSA9PSBOVUxMKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIkRFTEVURSBGUk9NIEF1dGhUdXBsZXMgV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCisJCQlzdWJzY3ItPmlkKTsKKworCQlpZiAoIXJlc3VsdCkKKwkJCXJldHVybiAtRUlPOworCisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIGlmIGFscmVhZHkgZXhpc3RpbmcgKi8KKwlyYyA9IGdldF9hdXRodHVwbGVfYnlfc3Vic2NyKCZhdHVwbGVfb2xkLCBzdWJzY3IpOworCWlmIChyYyAmJiByYyAhPSAtRU5PRU5UKQorCQlyZXR1cm4gcmM7CisJdXBkID0gcmMgPyAwIDogMTsKKworCS8qIFVwZGF0ZSAvIEluc2VydCAqLworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sCisJCWF0dXBsZS0+cmFuZCwgc2l6ZW9mKGF0dXBsZS0+cmFuZCksICZyYW5kX3N0cik7CisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwKKwkJYXR1cGxlLT5zcmVzLCBzaXplb2YoYXR1cGxlLT5zcmVzKSwgJnNyZXNfc3RyKTsKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLAorCQlhdHVwbGUtPmtjLCBzaXplb2YoYXR1cGxlLT5rYyksICZrY19zdHIpOworCisJaWYgKCF1cGQpIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkJIklOU0VSVCBJTlRPIEF1dGhUdXBsZXMgIgorCQkJCSIoc3Vic2NyaWJlcl9pZCwgaXNzdWVkLCB1c2VfY291bnQsICIKKwkJCQkgImtleV9zZXEsIHJhbmQsIHNyZXMsIGtjKSAiCisJCQkJIlZBTFVFUyAoJXUsIGRhdGV0aW1lKCdub3cnKSwgJXUsICIKKwkJCQkgIiV1LCAlcywgJXMsICVzICkgIiwKKwkJCQlzdWJzY3ItPmlkLCBhdHVwbGUtPnVzZV9jb3VudCwgYXR1cGxlLT5rZXlfc2VxLAorCQkJCXJhbmRfc3RyLCBzcmVzX3N0ciwga2Nfc3RyKTsKKwl9IGVsc2UgeworCQljaGFyICppc3N1ZWQgPSBhdHVwbGUtPmtleV9zZXEgPT0gYXR1cGxlX29sZC5rZXlfc2VxID8KKwkJCQkJImlzc3VlZCIgOiAiZGF0ZXRpbWUoJ25vdycpIjsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkJIlVQREFURSBBdXRoS2V5cyAiCisJCQkJIlNFVCBpc3N1ZWQ9JXMsIHVzZV9jb3VudD0ldSwgIgorCQkJCSAia2V5X3NlcT0ldSwgcmFuZD0lcywgc3Jlcz0lcywga2M9JXMgIgorCQkJCSJXSEVSRSBzdWJzY3JpYmVyX2lkID0gJXUiLAorCQkJCWlzc3VlZCwgYXR1cGxlLT51c2VfY291bnQsIGF0dXBsZS0+a2V5X3NlcSwKKwkJCQlyYW5kX3N0ciwgc3Jlc19zdHIsIGtjX3N0ciwgc3Vic2NyLT5pZCk7CisJfQorCisJZnJlZShyYW5kX3N0cik7CisJZnJlZShzcmVzX3N0cik7CisJZnJlZShrY19zdHIpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBCQVNFX1FVRVJZICJTRUxFQ1QgKiBGUk9NIFN1YnNjcmliZXIgIgorc3RydWN0IGdzbV9zdWJzY3JpYmVyICpkYl9nZXRfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJIGVudW0gZ3NtX3N1YnNjcmliZXJfZmllbGQgZmllbGQsCisJCQkJCSBjb25zdCBjaGFyICppZCkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljb25zdCBjaGFyICpzdHJpbmc7CisJY2hhciAqcXVvdGVkOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJc3dpdGNoIChmaWVsZCkgeworCWNhc2UgR1NNX1NVQlNDUklCRVJfSU1TSToKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgaWQsICZxdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCUJBU0VfUVVFUlkKKwkJCSJXSEVSRSBpbXNpID0gJXMgIiwKKwkJCXF1b3RlZAorCQkpOworCQlmcmVlKHF1b3RlZCk7CisJCWJyZWFrOworCWNhc2UgR1NNX1NVQlNDUklCRVJfVE1TSToKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgaWQsICZxdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCUJBU0VfUVVFUlkKKwkJCSJXSEVSRSB0bXNpID0gJXMgIiwKKwkJCXF1b3RlZAorCQkpOworCQlmcmVlKHF1b3RlZCk7CisJCWJyZWFrOworCWNhc2UgR1NNX1NVQlNDUklCRVJfRVhURU5TSU9OOgorCQlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCBpZCwgJnF1b3RlZCk7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJQkFTRV9RVUVSWQorCQkJIldIRVJFIGV4dGVuc2lvbiA9ICVzICIsCisJCQlxdW90ZWQKKwkJKTsKKwkJZnJlZShxdW90ZWQpOworCQlicmVhazsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX0lEOgorCQlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCBpZCwgJnF1b3RlZCk7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJQkFTRV9RVUVSWQorCQkJIldIRVJFIGlkID0gJXMgIiwgcXVvdGVkKTsKKwkJZnJlZShxdW90ZWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEREQiwgTE9HTF9OT1RJQ0UsICJVbmtub3duIHF1ZXJ5IHNlbGVjdG9yIGZvciBTdWJzY3JpYmVyLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBTdWJzY3JpYmVyLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlERUJVR1AoRERCLCAiRmFpbGVkIHRvIGZpbmQgdGhlIFN1YnNjcmliZXIuICcldScgJyVzJ1xuIiwKKwkJCWZpZWxkLCBpZCk7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzdWJzY3IgPSBzdWJzY3JfYWxsb2MoKTsKKwlzdWJzY3ItPm5ldCA9IG5ldDsKKwlzdWJzY3ItPmlkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImlkIik7CisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgImltc2kiKTsKKwlpZiAoc3RyaW5nKQorCQlzdHJuY3B5KHN1YnNjci0+aW1zaSwgc3RyaW5nLCBHU01fSU1TSV9MRU5HVEgpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgInRtc2kiKTsKKwlpZiAoc3RyaW5nKQorCQlzdWJzY3ItPnRtc2kgPSB0bXNpX2Zyb21fc3RyaW5nKHN0cmluZyk7CisKKwlzdHJpbmcgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAibmFtZSIpOworCWlmIChzdHJpbmcpCisJCXN0cm5jcHkoc3Vic2NyLT5uYW1lLCBzdHJpbmcsIEdTTV9OQU1FX0xFTkdUSCk7CisKKwlzdHJpbmcgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAiZXh0ZW5zaW9uIik7CisJaWYgKHN0cmluZykKKwkJc3RybmNweShzdWJzY3ItPmV4dGVuc2lvbiwgc3RyaW5nLCBHU01fRVhURU5TSU9OX0xFTkdUSCk7CisKKwlzdWJzY3ItPmxhYyA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAibGFjIik7CisJc3Vic2NyLT5hdXRob3JpemVkID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJhdXRob3JpemVkIik7CisJREVCVUdQKEREQiwgIkZvdW5kIFN1YnNjcmliZXI6IElEICVsbHUsIElNU0kgJXMsIE5BTUUgJyVzJywgVE1TSSAldSwgRVhURU4gJyVzJywgTEFDICVodSwgQVVUSCAldVxuIiwKKwkJc3Vic2NyLT5pZCwgc3Vic2NyLT5pbXNpLCBzdWJzY3ItPm5hbWUsIHN1YnNjci0+dG1zaSwgc3Vic2NyLT5leHRlbnNpb24sCisJCXN1YnNjci0+bGFjLCBzdWJzY3ItPmF1dGhvcml6ZWQpOworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJZ2V0X2VxdWlwbWVudF9ieV9zdWJzY3Ioc3Vic2NyKTsKKworCXJldHVybiBzdWJzY3I7Cit9CisKK2ludCBkYl9zeW5jX3N1YnNjcmliZXIoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNoYXIgdG1zaVsxNF07CisJY2hhciAqcV90bXNpOworCisJaWYgKHN1YnNjcmliZXItPnRtc2kgIT0gR1NNX1JFU0VSVkVEX1RNU0kpIHsKKwkJc3ByaW50Zih0bXNpLCAiJXUiLCBzdWJzY3JpYmVyLT50bXNpKTsKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwKKwkJCQkgICB0bXNpLAorCQkJCSAgICZxX3Rtc2kpOworCX0gZWxzZQorCQlxX3Rtc2kgPSBzdHJkdXAoIk5VTEwiKTsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiVVBEQVRFIFN1YnNjcmliZXIgIgorCQkiU0VUIHVwZGF0ZWQgPSBkYXRldGltZSgnbm93JyksICIKKwkJIm5hbWUgPSAnJXMnLCAiCisJCSJleHRlbnNpb24gPSAnJXMnLCAiCisJCSJhdXRob3JpemVkID0gJWksICIKKwkJInRtc2kgPSAlcywgIgorCQkibGFjID0gJWkgIgorCQkiV0hFUkUgaW1zaSA9ICVzICIsCisJCXN1YnNjcmliZXItPm5hbWUsCisJCXN1YnNjcmliZXItPmV4dGVuc2lvbiwKKwkJc3Vic2NyaWJlci0+YXV0aG9yaXplZCwKKwkJcV90bXNpLAorCQlzdWJzY3JpYmVyLT5sYWMsCisJCXN1YnNjcmliZXItPmltc2kpOworCisJZnJlZShxX3Rtc2kpOworCisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gdXBkYXRlIFN1YnNjcmliZXIgKGJ5IElNU0kpLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zeW5jX2VxdWlwbWVudChzdHJ1Y3QgZ3NtX2VxdWlwbWVudCAqZXF1aXApCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJdW5zaWduZWQgY2hhciAqY20yLCAqY20zOworCXVfaW50OF90IGNsYXNzbWFyazE7CisKKwltZW1jcHkoJmNsYXNzbWFyazEsICZlcXVpcC0+Y2xhc3NtYXJrMSwgc2l6ZW9mKGNsYXNzbWFyazEpKTsKKwlERUJVR1AoRERCLCAiU3luYyBFcXVpcG1lbnQgSU1FST0lcywgY2xhc3NtYXJrMT0lMDJ4IiwKKwkJZXF1aXAtPmltZWksIGNsYXNzbWFyazEpOworCWlmIChlcXVpcC0+Y2xhc3NtYXJrMl9sZW4pCisJCURFQlVHUEMoRERCLCAiLCBjbGFzc21hcmsyPSVzIiwKKwkJCWhleGR1bXAoZXF1aXAtPmNsYXNzbWFyazIsIGVxdWlwLT5jbGFzc21hcmsyX2xlbikpOworCWlmIChlcXVpcC0+Y2xhc3NtYXJrM19sZW4pCisJCURFQlVHUEMoRERCLCAiLCBjbGFzc21hcmszPSVzIiwKKwkJCWhleGR1bXAoZXF1aXAtPmNsYXNzbWFyazMsIGVxdWlwLT5jbGFzc21hcmszX2xlbikpOworCURFQlVHUEMoRERCLCAiXG4iKTsKKworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sIGVxdWlwLT5jbGFzc21hcmsyLAorCQkJCSAgIGVxdWlwLT5jbGFzc21hcmsyX2xlbiwgJmNtMik7CisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwgZXF1aXAtPmNsYXNzbWFyazMsCisJCQkJICAgZXF1aXAtPmNsYXNzbWFyazNfbGVuLCAmY20zKTsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiVVBEQVRFIEVxdWlwbWVudCBTRVQgIgorCQkJInVwZGF0ZWQgPSBkYXRldGltZSgnbm93JyksICIKKwkJCSJjbGFzc21hcmsxID0gJXUsICIKKwkJCSJjbGFzc21hcmsyID0gJXMsICIKKwkJCSJjbGFzc21hcmszID0gJXMgIgorCQkiV0hFUkUgaW1laSA9ICclcycgIiwKKwkJY2xhc3NtYXJrMSwgY20yLCBjbTMsIGVxdWlwLT5pbWVpKTsKKworCWZyZWUoY20yKTsKKwlmcmVlKGNtMyk7CisKKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byB1cGRhdGUgRXF1aXBtZW50XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0ID0gTlVMTDsKKwljaGFyIHRtc2lbMTRdOworCWNoYXIqIHRtc2lfcXVvdGVkOworCisJZm9yICg7OykgeworCQlzdWJzY3JpYmVyLT50bXNpID0gcmFuZCgpOworCQlpZiAoc3Vic2NyaWJlci0+dG1zaSA9PSBHU01fUkVTRVJWRURfVE1TSSkKKwkJCWNvbnRpbnVlOworCisJCXNwcmludGYodG1zaSwgIiV1Iiwgc3Vic2NyaWJlci0+dG1zaSk7CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIHRtc2ksICZ0bXNpX3F1b3RlZCk7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCAqIEZST00gU3Vic2NyaWJlciAiCisJCQkiV0hFUkUgdG1zaSA9ICVzICIsCisJCQl0bXNpX3F1b3RlZCk7CisKKwkJZnJlZSh0bXNpX3F1b3RlZCk7CisKKwkJaWYgKCFyZXN1bHQpIHsKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IFN1YnNjcmliZXIgIgorCQkJCSJ3aGlsZSBhbGxvY2F0aW5nIG5ldyBUTVNJLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoZGJpX3Jlc3VsdF9nZXRfbnVtcm93cyhyZXN1bHQpKSB7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCURFQlVHUChEREIsICJBbGxvY2F0ZWQgVE1TSSAldSBmb3IgSU1TSSAlcy5cbiIsCisJCQkJc3Vic2NyaWJlci0+dG1zaSwgc3Vic2NyaWJlci0+aW1zaSk7CisJCQlyZXR1cm4gZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcmliZXIpOworCQl9CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfZXh0ZW4oc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0ID0gTlVMTDsKKwl1X2ludDMyX3QgdHJ5OworCisJZm9yICg7OykgeworCQl0cnkgPSAocmFuZCgpJShHU01fTUFYX0VYVEVOLUdTTV9NSU5fRVhURU4rMSkrR1NNX01JTl9FWFRFTik7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCAqIEZST00gU3Vic2NyaWJlciAiCisJCQkiV0hFUkUgZXh0ZW5zaW9uID0gJWkiLAorCQkJdHJ5CisJCSk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBTdWJzY3JpYmVyICIKKwkJCQkid2hpbGUgYWxsb2NhdGluZyBuZXcgZXh0ZW5zaW9uLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoZGJpX3Jlc3VsdF9nZXRfbnVtcm93cyhyZXN1bHQpKXsKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQkJYnJlYWs7CisJCX0KKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJfQorCXNwcmludGYoc3Vic2NyaWJlci0+ZXh0ZW5zaW9uLCAiJWkiLCB0cnkpOworCURFQlVHUChEREIsICJBbGxvY2F0ZWQgZXh0ZW5zaW9uICVpIGZvciBJTVNJICVzLlxuIiwgdHJ5LCBzdWJzY3JpYmVyLT5pbXNpKTsKKwlyZXR1cm4gZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcmliZXIpOworfQorLyoKKyAqIHRyeSB0byBhbGxvY2F0ZSBhIG5ldyB1bmlxdWUgdG9rZW4gZm9yIHRoaXMgc3Vic2NyaWJlciBhbmQgcmV0dXJuIGl0CisgKiB2aWEgYSBwYXJhbWV0ZXIuIGlmIHRoZSBzdWJzY3JpYmVyIGFscmVhZHkgaGFzIGEgdG9rZW4sIHJldHVybgorICogYW4gZXJyb3IuCisgKi8KKworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfdG9rZW4oc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyLCB1X2ludDMyX3QgKnRva2VuKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXVfaW50MzJfdCB0cnk7CisKKwlmb3IgKDs7KSB7CisJCXRyeSA9IHJhbmQoKTsKKwkJaWYgKCF0cnkpIC8qIDAgaXMgYW4gaW52YWxpZCB0b2tlbiAqLworCQkJY29udGludWU7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCAqIEZST00gQXV0aFRva2VuICIKKwkJCSJXSEVSRSBzdWJzY3JpYmVyX2lkID0gJWxsdSBPUiB0b2tlbiA9IFwiJTA4WFwiICIsCisJCQlzdWJzY3JpYmVyLT5pZCwgdHJ5KTsKKwkJaWYgKCFyZXN1bHQpIHsKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IEF1dGhUb2tlbiAiCisJCQkJIndoaWxlIGFsbG9jYXRpbmcgbmV3IHRva2VuLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoZGJpX3Jlc3VsdF9nZXRfbnVtcm93cyhyZXN1bHQpKSB7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWJyZWFrOworCQl9CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIEF1dGhUb2tlbiAiCisJCSIoc3Vic2NyaWJlcl9pZCwgY3JlYXRlZCwgdG9rZW4pICIKKwkJIlZBTFVFUyAiCisJCSIoJWxsdSwgZGF0ZXRpbWUoJ25vdycpLCBcIiUwOFhcIikgIiwKKwkJc3Vic2NyaWJlci0+aWQsIHRyeSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIHRva2VuICUwOFggZm9yICIKKwkJCSJJTVNJICVzLlxuIiwgdHJ5LCBzdWJzY3JpYmVyLT5pbXNpKTsKKwkJcmV0dXJuIDE7CisJfQorCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCSp0b2tlbiA9IHRyeTsKKwlERUJVR1AoRERCLCAiQWxsb2NhdGVkIHRva2VuICUwOFggZm9yIElNU0kgJXMuXG4iLCB0cnksIHN1YnNjcmliZXItPmltc2kpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyLCBjaGFyIGltZWlbR1NNX0lNRUlfTEVOR1RIXSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgZXF1aXBtZW50X2lkLCB3YXRjaF9pZDsKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKworCXN0cm5jcHkoc3Vic2NyaWJlci0+ZXF1aXBtZW50LmltZWksIGltZWksCisJCXNpemVvZihzdWJzY3JpYmVyLT5lcXVpcG1lbnQuaW1laSktMSksCisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBPUiBJR05PUkUgSU5UTyBFcXVpcG1lbnQgIgorCQkiKGltZWksIGNyZWF0ZWQsIHVwZGF0ZWQpICIKKwkJIlZBTFVFUyAiCisJCSIoJXMsIGRhdGV0aW1lKCdub3cnKSwgZGF0ZXRpbWUoJ25vdycpKSAiLAorCQlpbWVpKTsKKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgRXF1aXBtZW50IGJ5IElNRUkuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZXF1aXBtZW50X2lkID0gMDsKKwlpZiAoZGJpX3Jlc3VsdF9nZXRfbnVtcm93c19hZmZlY3RlZChyZXN1bHQpKSB7CisJCWVxdWlwbWVudF9pZCA9IGRiaV9jb25uX3NlcXVlbmNlX2xhc3QoY29ubiwgTlVMTCk7CisJfQorCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJaWYgKGVxdWlwbWVudF9pZCkKKwkJREVCVUdQKEREQiwgIk5ldyBFcXVpcG1lbnQ6IElEICVsbHUsIElNRUkgJXNcbiIsIGVxdWlwbWVudF9pZCwgaW1laSk7CisJZWxzZSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCBpZCBGUk9NIEVxdWlwbWVudCAiCisJCQkiV0hFUkUgaW1laSA9ICVzICIsCisJCQlpbWVpCisJCSk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBFcXVpcG1lbnQgYnkgSU1FSS5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGZpbmQgdGhlIEVxdWlwbWVudC5cbiIpOworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQllcXVpcG1lbnRfaWQgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAiaWQiKTsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJfQorCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgT1IgSUdOT1JFIElOVE8gRXF1aXBtZW50V2F0Y2ggIgorCQkiKHN1YnNjcmliZXJfaWQsIGVxdWlwbWVudF9pZCwgY3JlYXRlZCwgdXBkYXRlZCkgIgorCQkiVkFMVUVTICIKKwkJIiglbGx1LCAlbGx1LCBkYXRldGltZSgnbm93JyksIGRhdGV0aW1lKCdub3cnKSkgIiwKKwkJc3Vic2NyaWJlci0+aWQsIGVxdWlwbWVudF9pZCk7CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIEVxdWlwbWVudFdhdGNoLlxuIik7CisJCXJldHVybiAxOworCX0KKworCXdhdGNoX2lkID0gMDsKKwlpZiAoZGJpX3Jlc3VsdF9nZXRfbnVtcm93c19hZmZlY3RlZChyZXN1bHQpKQorCQl3YXRjaF9pZCA9IGRiaV9jb25uX3NlcXVlbmNlX2xhc3QoY29ubiwgTlVMTCk7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlpZiAod2F0Y2hfaWQpCisJCURFQlVHUChEREIsICJOZXcgRXF1aXBtZW50V2F0Y2g6IElEICVsbHUsIElNU0kgJXMsIElNRUkgJXNcbiIsCisJCQllcXVpcG1lbnRfaWQsIHN1YnNjcmliZXItPmltc2ksIGltZWkpOworCWVsc2UgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJVUERBVEUgRXF1aXBtZW50V2F0Y2ggIgorCQkJIlNFVCB1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpICIKKwkJCSJXSEVSRSBzdWJzY3JpYmVyX2lkID0gJWxsdSBBTkQgZXF1aXBtZW50X2lkID0gJWxsdSAiLAorCQkJc3Vic2NyaWJlci0+aWQsIGVxdWlwbWVudF9pZCk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byB1cGRhdGUgRXF1aXBtZW50V2F0Y2guXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlERUJVR1AoRERCLCAiVXBkYXRlZCBFcXVpcG1lbnRXYXRjaDogSUQgJWxsdSwgSU1TSSAlcywgSU1FSSAlc1xuIiwKKwkJCWVxdWlwbWVudF9pZCwgc3Vic2NyaWJlci0+aW1zaSwgaW1laSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHN0b3JlIGFuIFt1bnNlbnRdIFNNUyB0byB0aGUgZGF0YWJhc2UgKi8KK2ludCBkYl9zbXNfc3RvcmUoc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljaGFyICpxX3RleHQsICpxX2RhZGRyOworCXVuc2lnbmVkIGNoYXIgKnFfdWRhdGE7CisJY2hhciAqdmFsaWRpdHlfdGltZXN0YW1wID0gIjIyMjItMi0yIjsKKworCS8qIEZJWE1FOiBnZW5lcmF0ZSB2YWxpZGl0eSB0aW1lc3RhbXAgYmFzZWQgb24gdmFsaWRpdHlfbWludXRlcyAqLworCisJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgKGNoYXIgKilzbXMtPnRleHQsICZxX3RleHQpOworCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIChjaGFyICopc21zLT5kZXN0X2FkZHIsICZxX2RhZGRyKTsKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLCBzbXMtPnVzZXJfZGF0YSwgc21zLT51c2VyX2RhdGFfbGVuLAorCQkJCSAgICZxX3VkYXRhKTsKKwkvKiBGSVhNRTogY29ycmVjdCB2YWxpZGl0eSBwZXJpb2QgKi8KKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIFNNUyAiCisJCSIoY3JlYXRlZCwgc2VuZGVyX2lkLCByZWNlaXZlcl9pZCwgdmFsaWRfdW50aWwsICIKKwkJICJyZXBseV9wYXRoX3JlcSwgc3RhdHVzX3JlcF9yZXEsIHByb3RvY29sX2lkLCAiCisJCSAiZGF0YV9jb2Rpbmdfc2NoZW1lLCB1ZF9oZHJfaW5kLCBkZXN0X2FkZHIsICIKKwkJICJ1c2VyX2RhdGEsIHRleHQpIFZBTFVFUyAiCisJCSIoZGF0ZXRpbWUoJ25vdycpLCAlbGx1LCAlbGx1LCAldSwgIgorCQkgIiV1LCAldSwgJXUsICV1LCAldSwgJXMsICVzLCAlcykiLAorCQlzbXMtPnNlbmRlci0+aWQsCisJCXNtcy0+cmVjZWl2ZXIgPyBzbXMtPnJlY2VpdmVyLT5pZCA6IDAsIHZhbGlkaXR5X3RpbWVzdGFtcCwKKwkJc21zLT5yZXBseV9wYXRoX3JlcSwgc21zLT5zdGF0dXNfcmVwX3JlcSwgc21zLT5wcm90b2NvbF9pZCwKKwkJc21zLT5kYXRhX2NvZGluZ19zY2hlbWUsIHNtcy0+dWRfaGRyX2luZCwKKwkJcV9kYWRkciwgcV91ZGF0YSwgcV90ZXh0KTsKKwlmcmVlKHFfdGV4dCk7CisJZnJlZShxX2RhZGRyKTsKKwlmcmVlKHFfdWRhdGEpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX3NtcyAqc21zX2Zyb21fcmVzdWx0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBkYmlfcmVzdWx0IHJlc3VsdCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gc21zX2FsbG9jKCk7CisJbG9uZyBsb25nIHVuc2lnbmVkIGludCBzZW5kZXJfaWQsIHJlY2VpdmVyX2lkOworCWNvbnN0IGNoYXIgKnRleHQsICpkYWRkcjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyX2RhdGE7CisKKwlpZiAoIXNtcykKKwkJcmV0dXJuIE5VTEw7CisKKwlzbXMtPmlkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImlkIik7CisKKwlzZW5kZXJfaWQgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAic2VuZGVyX2lkIik7CisJc21zLT5zZW5kZXIgPSBzdWJzY3JfZ2V0X2J5X2lkKG5ldCwgc2VuZGVyX2lkKTsKKworCXJlY2VpdmVyX2lkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgInJlY2VpdmVyX2lkIik7CisJc21zLT5yZWNlaXZlciA9IHN1YnNjcl9nZXRfYnlfaWQobmV0LCByZWNlaXZlcl9pZCk7CisKKwkvKiBGSVhNRTogdmFsaWRpdHkgKi8KKwkvKiBGSVhNRTogdGhvc2Ugc2hvdWxkIGFsbCBiZSBnZXRfdWNoYXIsIGJ1dCBzcWxpdGUzIGlzIGJyYWluZGVhZCAqLworCXNtcy0+cmVwbHlfcGF0aF9yZXEgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgInJlcGx5X3BhdGhfcmVxIik7CisJc21zLT5zdGF0dXNfcmVwX3JlcSA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAic3RhdHVzX3JlcF9yZXEiKTsKKwlzbXMtPnVkX2hkcl9pbmQgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgInVkX2hkcl9pbmQiKTsKKwlzbXMtPnByb3RvY29sX2lkID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJwcm90b2NvbF9pZCIpOworCXNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsCisJCQkJCQkgICJkYXRhX2NvZGluZ19zY2hlbWUiKTsKKwkvKiBzbXMtPm1zZ19yZWYgaXMgdGVtcG9yYXJ5IGFuZCBub3Qgc3RvcmVkIGluIERCICovCisKKwlkYWRkciA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJkZXN0X2FkZHIiKTsKKwlpZiAoZGFkZHIpIHsKKwkJc3RybmNweShzbXMtPmRlc3RfYWRkciwgZGFkZHIsIHNpemVvZihzbXMtPmRlc3RfYWRkcikpOworCQlzbXMtPmRlc3RfYWRkcltzaXplb2Yoc21zLT5kZXN0X2FkZHIpLTFdID0gJ1wwJzsKKwl9CisKKwlzbXMtPnVzZXJfZGF0YV9sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAidXNlcl9kYXRhIik7CisJdXNlcl9kYXRhID0gZGJpX3Jlc3VsdF9nZXRfYmluYXJ5KHJlc3VsdCwgInVzZXJfZGF0YSIpOworCWlmIChzbXMtPnVzZXJfZGF0YV9sZW4gPiBzaXplb2Yoc21zLT51c2VyX2RhdGEpKQorCQlzbXMtPnVzZXJfZGF0YV9sZW4gPSAodV9pbnQ4X3QpIHNpemVvZihzbXMtPnVzZXJfZGF0YSk7CisJbWVtY3B5KHNtcy0+dXNlcl9kYXRhLCB1c2VyX2RhdGEsIHNtcy0+dXNlcl9kYXRhX2xlbik7CisKKwl0ZXh0ID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgInRleHQiKTsKKwlpZiAodGV4dCkgeworCQlzdHJuY3B5KHNtcy0+dGV4dCwgdGV4dCwgc2l6ZW9mKHNtcy0+dGV4dCkpOworCQlzbXMtPnRleHRbc2l6ZW9mKHNtcy0+dGV4dCktMV0gPSAnXDAnOworCX0KKwlyZXR1cm4gc21zOworfQorCisvKiByZXRyaWV2ZSB0aGUgbmV4dCB1bnNlbnQgU01TIHdpdGggSUQgPj0gbWluX2lkICovCitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVuc2lnbmVkIGxvbmcgbG9uZyBtaW5faWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiU0VMRUNUICogRlJPTSBTTVMsU3Vic2NyaWJlciAiCisJCSJXSEVSRSBzbXMuaWQgPj0gJWxsdSBBTkQgc21zLnNlbnQgaXMgTlVMTCAiCisJCQkiQU5EIHNtcy5yZWNlaXZlcl9pZCA9IHN1YnNjcmliZXIuaWQgIgorCQkJIkFORCBzdWJzY3JpYmVyLmxhYyA+IDAgIgorCQkiT1JERVIgQlkgc21zLmlkIExJTUlUIDEiLAorCQltaW5faWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzbXMgPSBzbXNfZnJvbV9yZXN1bHQobmV0LCByZXN1bHQpOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gc21zOworfQorCitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnRfYnlfc3Vic2NyKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1bnNpZ25lZCBsb25nIGxvbmcgbWluX3N1YnNjcl9pZCkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJTRUxFQ1QgKiBGUk9NIFNNUyxTdWJzY3JpYmVyICIKKwkJIldIRVJFIHNtcy5yZWNlaXZlcl9pZCA+PSAlbGx1IEFORCBzbXMuc2VudCBpcyBOVUxMICIKKwkJCSJBTkQgc21zLnJlY2VpdmVyX2lkID0gc3Vic2NyaWJlci5pZCAiCisJCQkiQU5EIHN1YnNjcmliZXIubGFjID4gMCAiCisJCSJPUkRFUiBCWSBzbXMucmVjZWl2ZXJfaWQsIGlkIExJTUlUIDEiLAorCQltaW5fc3Vic2NyX2lkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21zID0gc21zX2Zyb21fcmVzdWx0KG5ldCwgcmVzdWx0KTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIHNtczsKK30KKworLyogcmV0cmlldmUgdGhlIG5leHQgdW5zZW50IFNNUyBmb3IgYSBnaXZlbiBzdWJzY3JpYmVyICovCitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnRfZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJTRUxFQ1QgKiBGUk9NIFNNUyxTdWJzY3JpYmVyICIKKwkJIldIRVJFIHNtcy5yZWNlaXZlcl9pZCA9ICVsbHUgQU5EIHNtcy5zZW50IGlzIE5VTEwgIgorCQkJIkFORCBzbXMucmVjZWl2ZXJfaWQgPSBzdWJzY3JpYmVyLmlkICIKKwkJCSJBTkQgc3Vic2NyaWJlci5sYWMgPiAwICIKKwkJIk9SREVSIEJZIHNtcy5pZCBMSU1JVCAxIiwKKwkJc3Vic2NyLT5pZCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNtcyA9IHNtc19mcm9tX3Jlc3VsdChzdWJzY3ItPm5ldCwgcmVzdWx0KTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIHNtczsKK30KKworLyogbWFyayBhIGdpdmVuIFNNUyBhcyByZWFkICovCitpbnQgZGJfc21zX21hcmtfc2VudChzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJVUERBVEUgU01TICIKKwkJIlNFVCBzZW50ID0gZGF0ZXRpbWUoJ25vdycpICIKKwkJIldIRVJFIGlkID0gJWxsdSIsIHNtcy0+aWQpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIG1hcmsgU01TICVsbHUgYXMgc2VudC5cbiIsIHNtcy0+aWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworLyogaW5jcmVhc2UgdGhlIG51bWJlciBvZiBhdHRlbXB0ZWQgZGVsaXZlcmllcyAqLworaW50IGRiX3Ntc19pbmNfZGVsaXZlcl9hdHRlbXB0cyhzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJVUERBVEUgU01TICIKKwkJIlNFVCBkZWxpdmVyX2F0dGVtcHRzID0gZGVsaXZlcl9hdHRlbXB0cyArIDEgIgorCQkiV0hFUkUgaWQgPSAlbGx1Iiwgc21zLT5pZCk7CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gaW5jIGRlbGl2ZXIgYXR0ZW1wdHMgZm9yICIKKwkJCSJTTVMgJWxsdS5cbiIsIHNtcy0+aWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRiX2FwZHVfYmxvYl9zdG9yZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCXVfaW50OF90IGFwZHVfaWRfZmxhZ3MsIHVfaW50OF90IGxlbiwKKwkJCXVfaW50OF90ICphcGR1KQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgKnFfYXBkdTsKKworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sIGFwZHUsIGxlbiwgJnFfYXBkdSk7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIEFwZHVCbG9icyAiCisJCSIoY3JlYXRlZCxzdWJzY3JpYmVyX2lkLGFwZHVfaWRfZmxhZ3MsYXBkdSkgVkFMVUVTICIKKwkJIihkYXRldGltZSgnbm93JyksJWxsdSwldSwlcykiLAorCQlzdWJzY3ItPmlkLCBhcGR1X2lkX2ZsYWdzLCBxX2FwZHUpOworCisJZnJlZShxX2FwZHUpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdG9yZV9jb3VudGVyKHN0cnVjdCBjb3VudGVyICpjdHIpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY2hhciAqcV9uYW1lOworCisJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgY3RyLT5uYW1lLCAmcV9uYW1lKTsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIElOVE8gQ291bnRlcnMgIgorCQkiKHRpbWVzdGFtcCxuYW1lLHZhbHVlKSBWQUxVRVMgIgorCQkiKGRhdGV0aW1lKCdub3cnKSwlcywlbHUpIiwgcV9uYW1lLCBjdHItPnZhbHVlKTsKKworCWZyZWUocV9uYW1lKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZGVidWcuYyBiL29wZW5ic2Mvc3JjL2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1ZDc5MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2RlYnVnLmMKQEAgLTAsMCArMSwxODggQEAKKy8qIE9wZW5CU0MgRGVidWdnaW5nL0xvZ2dpbmcgc3VwcG9ydCBjb2RlICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworLyogZGVmYXVsdCBjYXRlZ29yaWVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGxvZ19pbmZvX2NhdCBkZWZhdWx0X2NhdGVnb3JpZXNbXSA9IHsKKwlbRFJMTF0gPSB7CisJCS5uYW1lID0gIkRSTEwiLAorCQkuZGVzY3JpcHRpb24gPSAiUmFkaW8gTGluayBMYXllciIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzFtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEQ0NdID0geworCQkubmFtZSA9ICJEQ0MiLAorCQkuZGVzY3JpcHRpb24gPSAiQ2FsbCBDb250cm9sIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszMm0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RNTV0gPSB7CisJCS5uYW1lID0gIkRNTSIsCisJCS5kZXNjcmlwdGlvbiA9ICJNb2JpbGl0eSBNYW5hZ2VtZW50IiwKKwkJLmNvbG9yID0gIlwwMzNbMTszM20iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RSUl0gPSB7CisJCS5uYW1lID0gIkRSUiIsCisJCS5kZXNjcmlwdGlvbiA9ICJSYWRpbyBSZXNvdXJjZSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzRtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEUlNMXSA9IHsKKwkJLm5hbWUgPSAiRFJTTCIsCisJCS5kZXNjcmlwdGlvbiA9ICJSYWRpbyBTaWdhbmxsaW5nIExpbmsiLAorCQkuY29sb3IgPSAiXDAzM1sxOzM1bSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE5NXSA9CXsKKwkJLm5hbWUgPSAiRE5NIiwKKwkJLmRlc2NyaXB0aW9uID0gIk5ldHdvcmsgTWFuYWdlbWVudCAoT01MKSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzZtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX0lORk8sCisJfSwKKwlbRE1OQ0NdID0geworCQkubmFtZSA9ICJETU5DQyIsCisJCS5kZXNjcmlwdGlvbiA9ICJCU0M8LT5NU0MgaW50ZXJmYWNlIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszOW0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RTTVNdID0geworCQkubmFtZSA9ICJEU01TIiwKKwkJLmRlc2NyaXB0aW9uID0gIlNob3J0IE1lc3NhZ2UgU2VydmljZSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzdtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEUEFHXQk9IHsKKwkJLm5hbWUgPSAiRFBBRyIsCisJCS5kZXNjcmlwdGlvbiA9ICJQYWdpbmciLAorCQkuY29sb3IgPSAiXDAzM1sxOzM4bSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1FQVNdID0geworCQkubmFtZSA9ICJETUVBUyIsCisJCS5kZXNjcmlwdGlvbiA9ICJNZWFzdXJlbWVudCBQcm9jZXNzaW5nIiwKKwkJLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETUldID0geworCQkubmFtZSA9ICJETUkiLAorCQkuZGVzY3JpcHRpb24gPSAibUlTRE4gSW5wdXQgRHJpdmVyIiwKKwkJLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETUlCXSA9IHsKKwkJLm5hbWUgPSAiRE1JQiIsCisJCS5kZXNjcmlwdGlvbiA9ICJtSVNETiBCLUNoYW5uZWxzIiwKKwkJLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETVVYXSA9IHsKKwkJLm5hbWUgPSAiRE1VWCIsCisJCS5kZXNjcmlwdGlvbiA9ICJUUkFVIEZyYW1lIE11bHRpcGxleCIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRElOUF0gPSB7CisJCS5uYW1lID0gIkRJTlAiLAorCQkuZGVzY3JpcHRpb24gPSAiSW5wdXQgRHJpdmVyIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEU0NDUF0gPSB7CisJCS5uYW1lID0gIkRTQ0NQIiwKKwkJLmRlc2NyaXB0aW9uID0gIlNDQ1AgUHJvdG9jb2wiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RNU0NdID0geworCQkubmFtZSA9ICJETVNDIiwKKwkJLmRlc2NyaXB0aW9uID0gIk1vYmlsZSBTd2l0Y2hpbmcgQ2VudGVyIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETUdDUF0gPSB7CisJCS5uYW1lID0gIkRNR0NQIiwKKwkJLmRlc2NyaXB0aW9uID0gIk1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbREhPXSA9IHsKKwkJLm5hbWUgPSAiREhPIiwKKwkJLmRlc2NyaXB0aW9uID0gIkhhbmQtT3ZlciIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRERCXSA9IHsKKwkJLm5hbWUgPSAiRERCIiwKKwkJLmRlc2NyaXB0aW9uID0gIkRhdGFiYXNlIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEUkVGXSA9IHsKKwkJLm5hbWUgPSAiRFJFRiIsCisJCS5kZXNjcmlwdGlvbiA9ICJSZWZlcmVuY2UgQ291bnRpbmciLAorCQkuZW5hYmxlZCA9IDAsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCit9OworCitlbnVtIGxvZ19jdHh0IHsKKwlDVFhfU1VCU0NSSUJFUiwKK307CisKK2VudW0gbG9nX2ZpbHRlciB7CisJX0ZMVF9BTEwgPSBMT0dfRklMVEVSX0FMTCwJLyogbGlib3Ntb2NvcmUgKi8KKwlGTFRfSU1TSSA9IDEsCit9OworCitzdGF0aWMgaW50IGZpbHRlcl9mbihjb25zdCBzdHJ1Y3QgbG9nX2NvbnRleHQgKmN0eCwKKwkJICAgICBzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gY3R4LT5jdHhbQ1RYX1NVQlNDUklCRVJdOworCisJaWYgKCh0YXItPmZpbHRlcl9tYXAgJiAoMSA8PCBGTFRfSU1TSSkpICE9IDAKKwkgICAgJiYgc3Vic2NyICYmIHN0cmNtcChzdWJzY3ItPmltc2ksIHRhci0+ZmlsdGVyX2RhdGFbRkxUX0lNU0ldKSA9PSAwKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgbG9nX2luZm8gbG9nX2luZm8gPSB7CisJLmZpbHRlcl9mbiA9IGZpbHRlcl9mbiwKKwkuY2F0ID0gZGVmYXVsdF9jYXRlZ29yaWVzLAorCS5udW1fY2F0ID0gQVJSQVlfU0laRShkZWZhdWx0X2NhdGVnb3JpZXMpLAorfTsKKwordm9pZCBsb2dfc2V0X2ltc2lfZmlsdGVyKHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKmltc2kpCit7CisJaWYgKGltc2kpIHsKKwkJdGFyZ2V0LT5maWx0ZXJfbWFwIHw9ICgxIDw8IEZMVF9JTVNJKTsKKwkJdGFyZ2V0LT5maWx0ZXJfZGF0YVtGTFRfSU1TSV0gPSB0YWxsb2Nfc3RyZHVwKHRhcmdldCwgaW1zaSk7CisJfSBlbHNlIGlmICh0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9JTVNJXSkgeworCQl0YXJnZXQtPmZpbHRlcl9tYXAgJj0gfigxIDw8IEZMVF9JTVNJKTsKKwkJdGFsbG9jX2ZyZWUodGFyZ2V0LT5maWx0ZXJfZGF0YVtGTFRfSU1TSV0pOworCQl0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9JTVNJXSA9IE5VTEw7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZTFfY29uZmlnLmMgYi9vcGVuYnNjL3NyYy9lMV9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGZiY2VjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZTFfY29uZmlnLmMKQEAgLTAsMCArMSwyMzYgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9taXNkbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvaXBhY2Nlc3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKyNkZWZpbmUgU0FQSV9MMk1MCTAKKyNkZWZpbmUgU0FQSV9PTUwJNjIKKyNkZWZpbmUgU0FQSV9SU0wJMAkvKiA2MyA/ICovCisKKy8qIFRoZSBlMV9yZWNvbmZpZ18qKCkgZnVuY3Rpb25zIGJlbG93IHRhbGUgdGhlIGNvbmZpZ3VyYXRpb24gcHJlc2VudCBpbiB0aGUKKyAqIGJ0cy90cngvdHMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBlbnN1cmUgdGhlIEUxIGNvbmZpZ3VyYXRpb24gcmVmbGVjdHMgdGhlCisgKiB0aW1lc2xvdC9zdWJzbG90L1RFSSBjb25maWd1cmF0aW9uICovCisKK2ludCBlMV9yZWNvbmZpZ190cyhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFfbGluayA9ICZ0cy0+ZTFfbGluazsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxX3RzOworCisJREVCVUdQKERNSSwgImUxX3JlY29uZmlnX3RzKCV1LCV1LCV1KVxuIiwgdHMtPnRyeC0+YnRzLT5uciwgdHMtPnRyeC0+bnIsIHRzLT5ucik7CisKKwlpZiAoIWUxX2xpbmstPmUxX3RzKQorCQlyZXR1cm4gMDsKKworCWxpbmUgPSBlMWlucF9saW5lX2dldF9jcmVhdGUoZTFfbGluay0+ZTFfbnIpOworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzd2l0Y2ggKHRzLT5wY2hhbikgeworCWNhc2UgR1NNX1BDSEFOX1RDSF9GOgorCWNhc2UgR1NNX1BDSEFOX1RDSF9IOgorCQllMV90cyA9ICZsaW5lLT50c1tlMV9saW5rLT5lMV90cy0xXTsKKwkJZTFpbnBfdHNfY29uZmlnKGUxX3RzLCBsaW5lLCBFMUlOUF9UU19UWVBFX1RSQVUpOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmZTFfdHMtPnRyYXUuZGVtdXgsIGUxX2xpbmstPmUxX3RzX3NzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBlMV9yZWNvbmZpZ190cngoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rID0gJnRyeC0+cnNsX2UxX2xpbms7CisJc3RydWN0IGUxaW5wX3RzICpzaWduX3RzOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnJzbF9saW5rOworCWludCBpOworCisJaWYgKCFlMV9saW5rLT5lMV90cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBSU0wgTGluayAqLworCWxpbmUgPSBlMWlucF9saW5lX2dldF9jcmVhdGUoZTFfbGluay0+ZTFfbnIpOworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2lnbl90cyA9ICZsaW5lLT50c1tlMV9saW5rLT5lMV90cy0xXTsKKwllMWlucF90c19jb25maWcoc2lnbl90cywgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKwlyc2xfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9SU0wsCisJCQkJCSAgdHJ4LCB0cngtPnJzbF90ZWksIFNBUElfUlNMKTsKKwlpZiAoIXJzbF9saW5rKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAodHJ4LT5yc2xfbGluaykKKwkJZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3kodHJ4LT5yc2xfbGluayk7CisJdHJ4LT5yc2xfbGluayA9IHJzbF9saW5rOworCisJZm9yIChpID0gMDsgaSA8IFRSWF9OUl9UUzsgaSsrKQorCQllMV9yZWNvbmZpZ190cygmdHJ4LT50c1tpXSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGUxX3JlY29uZmlnX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFfbGluayA9ICZidHMtPm9tbF9lMV9saW5rOworCXN0cnVjdCBlMWlucF90cyAqc2lnbl90czsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpvbWxfbGluazsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCURFQlVHUChETUksICJlMV9yZWNvbmZpZ19idHMoJXUpXG4iLCBidHMtPm5yKTsKKworCWlmICghZTFfbGluay0+ZTFfdHMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogT01MIGxpbmsgKi8KKwlsaW5lID0gZTFpbnBfbGluZV9nZXRfY3JlYXRlKGUxX2xpbmstPmUxX25yKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCXNpZ25fdHMgPSAmbGluZS0+dHNbZTFfbGluay0+ZTFfdHMtMV07CisJZTFpbnBfdHNfY29uZmlnKHNpZ25fdHMsIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisJb21sX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fT01MLAorCQkJCQkgIGJ0cy0+YzAsIGJ0cy0+b21sX3RlaSwgU0FQSV9PTUwpOworCWlmICghb21sX2xpbmspCisJCXJldHVybiAtRU5PTUVNOworCWlmIChidHMtPm9tbF9saW5rKQorCQllMWlucF9zaWduX2xpbmtfZGVzdHJveShidHMtPm9tbF9saW5rKTsKKwlidHMtPm9tbF9saW5rID0gb21sX2xpbms7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KQorCQllMV9yZWNvbmZpZ190cngodHJ4KTsKKworCS8qIG5vdGlmeSBFMSBpbnB1dCBzb21ldGhpbmcgaGFzIGNoYW5nZWQgKi8KKwlyZXR1cm4gZTFpbnBfbGluZV91cGRhdGUobGluZSk7Cit9CisKKyNpZiAwCisvKiBkbyBzb21lIGNvbXBpbGVkLWluIGNvbmZpZ3VyYXRpb24gZm9yIG91ciBCVFMvRTEgc2V0dXAgKi8KK2ludCBlMV9jb25maWcoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGNhcmRuciwgaW50IHJlbGVhc2VfbDIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3RzICpzaWduX3RzOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKm9tbF9saW5rLCAqcnNsX2xpbms7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBidHMtPmMwOworCWludCBiYXNlX3RzOworCisJc3dpdGNoIChidHMtPm5yKSB7CisJY2FzZSAwOgorCQkvKiBGaXJzdCBCVFMgdXNlcyBFMSBUUyAwMSwwMiwwMywwNCwwNSAqLworCQliYXNlX3RzID0gSEFSRENPREVEX0JUUzBfVFMgLSAxOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIFNlY29uZCBCVFMgdXNlcyBFMSBUUyAwNiwwNywwOCwwOSwxMCAqLworCQliYXNlX3RzID0gSEFSRENPREVEX0JUUzFfVFMgLSAxOworCQlicmVhazsKKwljYXNlIDI6CisJCS8qIFRoaXJkIEJUUyB1c2VzIEUxIFRTIDExLDEyLDEzLDE0LDE1ICovCisJCWJhc2VfdHMgPSBIQVJEQ09ERURfQlRTMl9UUyAtIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGluZSA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGUxaW5wX2xpbmUpOworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBjcmVhdGUgRTEgdGltZXNsb3RzIGZvciBzaWduYWxsaW5nIGFuZCBUUkFVIGZyYW1lcyAqLworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbYmFzZV90cysxLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbYmFzZV90cysyLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1RSQVUpOworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbYmFzZV90cyszLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1RSQVUpOworCisJLyogY3JlYXRlIHNpZ25hbGxpbmcgbGlua3MgZm9yIFRTMSAqLworCXNpZ25fdHMgPSAmbGluZS0+dHNbYmFzZV90cysxLTFdOworCW9tbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX09NTCwKKwkJCQkJICB0cngsIFRFSV9PTUwsIFNBUElfT01MKTsKKwlyc2xfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9SU0wsCisJCQkJCSAgdHJ4LCBURUlfUlNMLCBTQVBJX1JTTCk7CisKKwkvKiBjcmVhdGUgYmFjay1saW5rcyBmcm9tIGJ0cy90cnggKi8KKwlidHMtPm9tbF9saW5rID0gb21sX2xpbms7CisJdHJ4LT5yc2xfbGluayA9IHJzbF9saW5rOworCisJLyogZW5hYmxlIHN1YmNoYW5uZWwgZGVtdXhlciBvbiBUUzIgKi8KKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cysyLTFdLnRyYXUuZGVtdXgsIDEpOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzItMV0udHJhdS5kZW11eCwgMik7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMi0xXS50cmF1LmRlbXV4LCAzKTsKKworCS8qIGVuYWJsZSBzdWJjaGFubmVsIGRlbXV4ZXIgb24gVFMzICovCisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXS50cmF1LmRlbXV4LCAwKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cyszLTFdLnRyYXUuZGVtdXgsIDEpOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0udHJhdS5kZW11eCwgMik7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXS50cmF1LmRlbXV4LCAzKTsKKworCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIDEpOworCWlmICh0cngpIHsKKwkJLyogY3JlYXRlIEUxIHRpbWVzbG90cyBmb3IgVFJBVSBmcmFtZXMgb2YgVFJYMSAqLworCQllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrNC0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKwkJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisKKwkJLyogY3JlYXRlIFJTTCBzaWduYWxsaW5nIGxpbmsgZm9yIFRSWDEgKi8KKwkJc2lnbl90cyA9ICZsaW5lLT50c1tiYXNlX3RzKzEtMV07CisJCXJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX1JTTCwKKwkJCQkJICB0cngsIFRFSV9SU0wrMSwgU0FQSV9SU0wpOworCQkvKiBjcmVhdGUgYmFjay1saW5rcyBmcm9tIHRyeCAqLworCQl0cngtPnJzbF9saW5rID0gcnNsX2xpbms7CisKKwkJLyogZW5hYmxlIHN1YmNoYW5uZWwgZGVtdXhlciBvbiBUUzIgKi8KKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNC0xXS50cmF1LmRlbXV4LCAwKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNC0xXS50cmF1LmRlbXV4LCAxKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNC0xXS50cmF1LmRlbXV4LCAyKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNC0xXS50cmF1LmRlbXV4LCAzKTsKKworCQkvKiBlbmFibGUgc3ViY2hhbm5lbCBkZW11eGVyIG9uIFRTMyAqLworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys1LTFdLnRyYXUuZGVtdXgsIDApOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys1LTFdLnRyYXUuZGVtdXgsIDEpOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys1LTFdLnRyYXUuZGVtdXgsIDIpOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys1LTFdLnRyYXUuZGVtdXgsIDMpOworCX0KKworCXJldHVybiBtaV9zZXR1cChjYXJkbnIsIGxpbmUsIHJlbGVhc2VfbDIpOworfQorI2VuZGlmCisKKy8qIGNvbmZpZ3VyZSBwc2V1ZG8gRTEgbGluZSBpbiBpcC5hY2Nlc3Mgc3R5bGUgYW5kIGNvbm5lY3QgdG8gQlRTICovCitpbnQgaWFfY29uZmlnX2Nvbm5lY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IHNvY2thZGRyX2luICpzaW4pCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3RzICpzaWduX3RzLCAqcnNsX3RzOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKm9tbF9saW5rLCAqcnNsX2xpbms7CisKKwlsaW5lID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZTFpbnBfbGluZSk7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGNyZWF0ZSBFMSB0aW1lc2xvdHMgZm9yIHNpZ25hbGxpbmcgYW5kIFRSQVUgZnJhbWVzICovCisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1sxLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbMi0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKworCS8qIGNyZWF0ZSBzaWduYWxsaW5nIGxpbmtzIGZvciBUUzEgKi8KKwlzaWduX3RzID0gJmxpbmUtPnRzWzEtMV07CisJcnNsX3RzID0gJmxpbmUtPnRzWzItMV07CisJb21sX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fT01MLAorCQkJCQkgIGJ0cy0+YzAsIDB4ZmYsIDApOworCXJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShyc2xfdHMsIEUxSU5QX1NJR05fUlNMLAorCQkJCQkgIGJ0cy0+YzAsIDAsIDApOworCisJLyogY3JlYXRlIGJhY2stbGlua3MgZnJvbSBidHMvdHJ4ICovCisJYnRzLT5vbWxfbGluayA9IG9tbF9saW5rOworCWJ0cy0+YzAtPnJzbF9saW5rID0gcnNsX2xpbms7CisKKwkvKiBkZWZhdWx0IHBvcnQgYXQgQlRTIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyBpcyAzMDA2ICovCisJaWYgKHNpbi0+c2luX3BvcnQgPT0gMCkKKwkJc2luLT5zaW5fcG9ydCA9IGh0b25zKDMwMDYpOworCisJcmV0dXJuIGlwYWNjZXNzX2Nvbm5lY3QobGluZSwgc2luKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2UxX2lucHV0LmMgYi9vcGVuYnNjL3NyYy9lMV9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGZlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9lMV9pbnB1dC5jCkBAIC0wLDAgKzEsNTY1IEBACisvKiBPcGVuQlNDIEFiaXMgaW50ZXJmYWNlIHRvIEUxICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG1JU0ROaWYuaD4KKworLy8jZGVmaW5lIEFGX0NPTVBBVElCSUxJVFlfRlVOQworLy8jaW5jbHVkZSA8Y29tcGF0X2FmX2lzZG4uaD4KKyNpZm5kZWYgQUZfSVNETgorI2RlZmluZSBBRl9JU0ROIDM0CisjZGVmaW5lIFBGX0lTRE4gQUZfSVNETgorI2VuZGlmCisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9mcmFtZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9tdXguaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWlzZG4uaD4KKworI2RlZmluZSBOVU1fRTFfVFMJMzIKKworLyogbGlzdCBvZiBhbGwgRTEgZHJpdmVycyAqLworTExJU1RfSEVBRChlMWlucF9kcml2ZXJfbGlzdCk7CisKKy8qIGxpc3Qgb2YgYWxsIEUxIGxpbmVzICovCitMTElTVF9IRUFEKGUxaW5wX2xpbmVfbGlzdCk7CisKK3N0YXRpYyB2b2lkICp0YWxsX3NpZ2xfY3R4OworCisvKiB0byBiZSBpbXBsZW1lbnRlZCwgZS5nLiBieSBic2NfaGFjay5jICovCit2b2lkIGlucHV0X2V2ZW50KGludCBldmVudCwgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworCisvKgorICogcGNhcCB3cml0aW5nIG9mIHRoZSBtaXNkbiBsb2FkCisgKiBwY2FwIGZvcm1hdCBpcyBmcm9tIGh0dHA6Ly93aWtpLndpcmVzaGFyay5vcmcvRGV2ZWxvcG1lbnQvTGlicGNhcEZpbGVGb3JtYXQKKyAqLworI2RlZmluZSBETFRfTElOVVhfTEFQRAkJMTc3CisjZGVmaW5lIFBDQVBfSU5QVVQJCTAKKyNkZWZpbmUgUENBUF9PVVRQVVQJCTEKKworc3RydWN0IHBjYXBfaGRyIHsKKwl1X2ludDMyX3QgbWFnaWNfbnVtYmVyOworCXVfaW50MTZfdCB2ZXJzaW9uX21ham9yOworCXVfaW50MTZfdCB2ZXJzaW9uX21pbm9yOworCWludDMyX3QgIHRoaXN6b25lOworCXVfaW50MzJfdCBzaWdmaWdzOworCXVfaW50MzJfdCBzbmFwbGVuOworCXVfaW50MzJfdCBuZXR3b3JrOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHBjYXByZWNfaGRyIHsKKwl1X2ludDMyX3QgdHNfc2VjOworCXVfaW50MzJfdCB0c191c2VjOworCXVfaW50MzJfdCBpbmNsX2xlbjsKKwl1X2ludDMyX3Qgb3JpZ19sZW47Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciB7CisgICAgICAgIHVfaW50MTZfdCBwa3R0eXBlOworCXVfaW50MTZfdCBoYXR5cGU7CisJdV9pbnQxNl90IGhhbGVuOworCXVfaW50NjRfdCBhZGRyOworCWludDE2X3QgcHJvdG9jb2w7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbGFwZF9oZWFkZXIgeworCXVfaW50OF90IGVhMSA6IDE7CisJdV9pbnQ4X3QgY3IgOiAxOworCXVfaW50OF90IHNhcGkgOiA2OworCXVfaW50OF90IGVhMiA6IDE7CisJdV9pbnQ4X3QgdGVpIDogNzsKKwl1X2ludDhfdCBjb250cm9sX2ZvbzsgLyogZmFrZSBVTSdzIC4uLiAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RhdGljX2Fzc2VydCgoaW50KSYoKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKilOVUxMKS0+aGF0eXBlID09IDIsCWhhdHlwZV9vZmZzZXQpOworc3RhdGljX2Fzc2VydCgoaW50KSYoKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKilOVUxMKS0+aGFsZW4gPT0gNCwJCWhhbGVuX29mZnNldCk7CitzdGF0aWNfYXNzZXJ0KChpbnQpJigoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIqKU5VTEwpLT5hZGRyID09IDYsCQlhZGRyX29mZnNldCk7CitzdGF0aWNfYXNzZXJ0KChpbnQpJigoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIqKU5VTEwpLT5wcm90b2NvbCA9PSAxNCwJcHJvdG9fb2Zmc2V0KTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKSA9PSAxNiwJCQlsYXBkX2hlYWRlcl9zaXplKTsKKworCitzdGF0aWMgaW50IHBjYXBfZmQgPSAtMTsKKwordm9pZCBlMV9zZXRfcGNhcF9mZChpbnQgZmQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcGNhcF9oZHIgaGVhZGVyID0geworCQkubWFnaWNfbnVtYmVyCT0gMHhhMWIyYzNkNCwKKwkJLnZlcnNpb25fbWFqb3IJPSAyLAorCQkudmVyc2lvbl9taW5vcgk9IDQsCisJCS50aGlzem9uZQk9IDAsCisJCS5zaWdmaWdzCT0gMCwKKwkJLnNuYXBsZW4JPSA2NTUzNSwKKwkJLm5ldHdvcmsJPSBETFRfTElOVVhfTEFQRCwKKwl9OworCisJcGNhcF9mZCA9IGZkOworCXJldCA9IHdyaXRlKHBjYXBfZmQsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKK30KKworLyogVGhpcyBjdXJyZW50bHkgb25seSB3b3JrcyBmb3IgdGhlIEQtQ2hhbm5lbCAqLworc3RhdGljIHZvaWQgd3JpdGVfcGNhcF9wYWNrZXQoaW50IGRpcmVjdGlvbiwgaW50IHNhcGksIGludCB0ZWksCisJCQkgICAgICBzdHJ1Y3QgbXNnYiAqbXNnKSB7CisJaWYgKHBjYXBfZmQgPCAwKQorCQlyZXR1cm47CisKKwlpbnQgcmV0OworCXRpbWVfdCBjdXJfdGltZTsKKwlzdHJ1Y3QgdG0gKnRtOworCWludCBtaV9oZWFkID0gKGRpcmVjdGlvbj09UENBUF9JTlBVVCkgPyBNSVNETl9IRUFERVJfTEVOIDogMDsKKworCXN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyIGhlYWRlciA9IHsKKwkJLnBrdHR5cGUJPSA0LAorCQkuaGF0eXBlCQk9IDAsCisJCS5oYWxlbgkJPSAwLAorCQkuYWRkcgkJPSBkaXJlY3Rpb24gPT0gUENBUF9PVVRQVVQgPyAweDAgOiAweDEsCisJCS5wcm90b2NvbAk9IG50b2hzKDQ4KSwKKwl9OworCisJc3RydWN0IGxhcGRfaGVhZGVyIGxhcGRfaGVhZGVyID0geworCQkuZWExCQk9IDAsCisJCS5jcgkJPSBkaXJlY3Rpb24gPT0gUENBUF9PVVRQVVQgPyAxIDogMCwKKwkJLnNhcGkJCT0gc2FwaSAmIDB4M0YsCisJCS5lYTIJCT0gMSwKKwkJLnRlaQkJPSB0ZWkgJiAweDdGLAorCQkuY29udHJvbF9mb28JPSAweDAzIC8qIFVJICovLAorCX07CQorCisJc3RydWN0IHBjYXByZWNfaGRyIHBheWxvYWRfaGVhZGVyID0geworCQkudHNfc2VjCSAgICA9IDAsCisJCS50c191c2VjICAgID0gMCwKKwkJLmluY2xfbGVuICAgPSBtc2ctPmxlbiArIHNpemVvZihzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlcikKKwkJCQkrIHNpemVvZihzdHJ1Y3QgbGFwZF9oZWFkZXIpCisJCQkJLSBtaV9oZWFkLAorCQkub3JpZ19sZW4gICA9IG1zZy0+bGVuICsgc2l6ZW9mKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKQorCQkJCSsgc2l6ZW9mKHN0cnVjdCBsYXBkX2hlYWRlcikKKwkJCQktIG1pX2hlYWQsCisJfTsKKworCisJY3VyX3RpbWUgPSB0aW1lKE5VTEwpOworCXRtID0gbG9jYWx0aW1lKCZjdXJfdGltZSk7CisJcGF5bG9hZF9oZWFkZXIudHNfc2VjID0gbWt0aW1lKHRtKTsKKworCXJldCA9IHdyaXRlKHBjYXBfZmQsICZwYXlsb2FkX2hlYWRlciwgc2l6ZW9mKHBheWxvYWRfaGVhZGVyKSk7CisJcmV0ID0gd3JpdGUocGNhcF9mZCwgJmhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOworCXJldCA9IHdyaXRlKHBjYXBfZmQsICZsYXBkX2hlYWRlciwgc2l6ZW9mKGxhcGRfaGVhZGVyKSk7CisJcmV0ID0gd3JpdGUocGNhcF9mZCwgbXNnLT5kYXRhICsgbWlfaGVhZCwKKwkJCW1zZy0+bGVuIC0gbWlfaGVhZCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzaWduX3R5cGVzW10gPSB7CisJW0UxSU5QX1NJR05fTk9ORV0JPSAiTm9uZSIsCisJW0UxSU5QX1NJR05fT01MXQk9ICJPTUwiLAorCVtFMUlOUF9TSUdOX1JTTF0JPSAiUlNMIiwKK307Citjb25zdCBjaGFyICplMWlucF9zaWdudHlwZV9uYW1lKGVudW0gZTFpbnBfc2lnbl90eXBlIHRwKQoreworCWlmICh0cCA+PSBBUlJBWV9TSVpFKHNpZ25fdHlwZXMpKQorCQlyZXR1cm4gInVuZGVmaW5lZCI7CisJcmV0dXJuIHNpZ25fdHlwZXNbdHBdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdHNfdHlwZXNbXSA9IHsKKwlbRTFJTlBfVFNfVFlQRV9OT05FXQk9ICJOb25lIiwKKwlbRTFJTlBfVFNfVFlQRV9TSUdOXQk9ICJTaWduYWxsaW5nIiwKKwlbRTFJTlBfVFNfVFlQRV9UUkFVXQk9ICJUUkFVIiwKK307CisKK2NvbnN0IGNoYXIgKmUxaW5wX3RzdHlwZV9uYW1lKGVudW0gZTFpbnBfdHNfdHlwZSB0cCkKK3sKKwlpZiAodHAgPj0gQVJSQVlfU0laRSh0c190eXBlcykpCisJCXJldHVybiAidW5kZWZpbmVkIjsKKwlyZXR1cm4gdHNfdHlwZXNbdHBdOworfQorCisvKiBjYWxsYmFjayB3aGVuIGEgVFJBVSBmcmFtZSB3YXMgcmVjZWl2ZWQgKi8KK3N0YXRpYyBpbnQgc3ViY2hfY2Ioc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIGludCBjaCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4sCisJCSAgICB2b2lkICpfcHJpdikKK3sKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9IF9wcml2OworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBzcmNfc3M7CisKKwlzcmNfc3MuZTFfbnIgPSBlMWlfdHMtPmxpbmUtPm51bTsKKwlzcmNfc3MuZTFfdHMgPSBlMWlfdHMtPm51bTsKKwlzcmNfc3MuZTFfdHNfc3MgPSBjaDsKKworCXJldHVybiB0cmF1X211eF9pbnB1dCgmc3JjX3NzLCBkYXRhLCBsZW4pOworfQorCitpbnQgYWJpc19yc2xfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnNpZ25fbGluazsKKwlzdHJ1Y3QgZTFpbnBfZHJpdmVyICplMWlucF9kcml2ZXI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHM7CisKKwltc2ctPmwyaCA9IG1zZy0+ZGF0YTsKKworCWlmICghbXNnLT50cngpIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAicnNsX3NlbmRtc2c6IG1zZy0+dHJ4ID09IE5VTEw6ICVzXG4iLAorCQkJaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisJCXRhbGxvY19mcmVlKG1zZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoIW1zZy0+dHJ4LT5yc2xfbGluaykgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJyc2xfc2VuZG1zZzogbXNnLT50cngtPnJzbF9saW5rID09IE5VTEw6ICVzXG4iLAorCQkJaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisJCXRhbGxvY19mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXNpZ25fbGluayA9IG1zZy0+dHJ4LT5yc2xfbGluazsKKwllMWlfdHMgPSBzaWduX2xpbmstPnRzOworCWlmICghYnNjX3RpbWVyX3BlbmRpbmcoJmUxaV90cy0+c2lnbi50eF90aW1lcikpIHsKKwkJLyogbm90aWZ5IHRoZSBkcml2ZXIgd2UgaGF2ZSBzb21ldGhpbmcgdG8gd3JpdGUgKi8KKwkJZTFpbnBfZHJpdmVyID0gc2lnbl9saW5rLT50cy0+bGluZS0+ZHJpdmVyOworCQllMWlucF9kcml2ZXItPndhbnRfd3JpdGUoZTFpX3RzKTsKKwl9CisJbXNnYl9lbnF1ZXVlKCZzaWduX2xpbmstPnR4X2xpc3QsIG1zZyk7CisKKwkvKiBkdW1wIGl0ICovCisJd3JpdGVfcGNhcF9wYWNrZXQoUENBUF9PVVRQVVQsIHNpZ25fbGluay0+c2FwaSwgc2lnbl9saW5rLT50ZWksIG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9hYmlzX25tX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpzaWduX2xpbms7CisJc3RydWN0IGUxaW5wX2RyaXZlciAqZTFpbnBfZHJpdmVyOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzOworCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisKKwlpZiAoIW1zZy0+dHJ4IHx8ICFtc2ctPnRyeC0+YnRzIHx8ICFtc2ctPnRyeC0+YnRzLT5vbWxfbGluaykgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJubV9zZW5kbXNnOiBtc2ctPnRyeCA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2lnbl9saW5rID0gbXNnLT50cngtPmJ0cy0+b21sX2xpbms7CisJZTFpX3RzID0gc2lnbl9saW5rLT50czsKKwlpZiAoIWJzY190aW1lcl9wZW5kaW5nKCZlMWlfdHMtPnNpZ24udHhfdGltZXIpKSB7CisJCS8qIG5vdGlmeSB0aGUgZHJpdmVyIHdlIGhhdmUgc29tZXRoaW5nIHRvIHdyaXRlICovCisJCWUxaW5wX2RyaXZlciA9IHNpZ25fbGluay0+dHMtPmxpbmUtPmRyaXZlcjsKKwkJZTFpbnBfZHJpdmVyLT53YW50X3dyaXRlKGUxaV90cyk7CisJfQorCW1zZ2JfZW5xdWV1ZSgmc2lnbl9saW5rLT50eF9saXN0LCBtc2cpOworCisJLyogZHVtcCBpdCAqLworCXdyaXRlX3BjYXBfcGFja2V0KFBDQVBfT1VUUFVULCBzaWduX2xpbmstPnNhcGksIHNpZ25fbGluay0+dGVpLCBtc2cpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRpbWVzbG90ICovCisKKy8qIGNvbmZpZ3VyZSBhbmQgaW5pdGlhbGl6ZSBvbmUgZTFpbnBfdHMgKi8KK2ludCBlMWlucF90c19jb25maWcoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsCisJCSAgICBlbnVtIGUxaW5wX3RzX3R5cGUgdHlwZSkKK3sKKwlpZiAodHMtPnR5cGUgPT0gdHlwZSAmJiB0cy0+bGluZSAmJiBsaW5lKQorCQlyZXR1cm4gMDsKKworCXRzLT50eXBlID0gdHlwZTsKKwl0cy0+bGluZSA9IGxpbmU7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJSU5JVF9MTElTVF9IRUFEKCZ0cy0+c2lnbi5zaWduX2xpbmtzKTsKKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCXN1YmNoYW5fbXV4X2luaXQoJnRzLT50cmF1Lm11eCk7CisJCXRzLT50cmF1LmRlbXV4Lm91dF9jYiA9IHN1YmNoX2NiOworCQl0cy0+dHJhdS5kZW11eC5kYXRhID0gdHM7CisJCXN1YmNoX2RlbXV4X2luaXQoJnRzLT50cmF1LmRlbXV4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETUksIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZCBFMSB0aW1lc2xvdCB0eXBlICV1XG4iLAorCQkJdHMtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZTFpbnBfbGluZSAqZTFpbnBfbGluZV9nZXQodV9pbnQ4X3QgZTFfbnIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmUxaV9saW5lOworCisJLyogaXRlcmF0ZSBvdmVyIGdsb2JhbCBsaXN0IG9mIGUxIGxpbmVzICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoZTFpX2xpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGUxaV9saW5lLT5udW0gPT0gZTFfbnIpCisJCQlyZXR1cm4gZTFpX2xpbmU7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZTFpbnBfbGluZSAqZTFpbnBfbGluZV9nZXRfY3JlYXRlKHVfaW50OF90IGUxX25yKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCWludCBpOworCisJbGluZSA9IGUxaW5wX2xpbmVfZ2V0KGUxX25yKTsKKwlpZiAobGluZSkKKwkJcmV0dXJuIGxpbmU7CisKKwlsaW5lID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZTFpbnBfbGluZSk7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gTlVMTDsKKworCWxpbmUtPm51bSA9IGUxX25yOworCWZvciAoaSA9IDA7IGkgPCBOVU1fRTFfVFM7IGkrKykgeworCQlsaW5lLT50c1tpXS5udW0gPSBpKzE7CisJCWxpbmUtPnRzW2ldLmxpbmUgPSBsaW5lOworCX0KKwlsbGlzdF9hZGRfdGFpbCgmbGluZS0+bGlzdCwgJmUxaW5wX2xpbmVfbGlzdCk7CisKKwlyZXR1cm4gbGluZTsKK30KKworc3RhdGljIHN0cnVjdCBlMWlucF90cyAqZTFpbnBfdHNfZ2V0KHVfaW50OF90IGUxX25yLCB1X2ludDhfdCB0c19ucikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqZTFpX2xpbmU7CisKKwllMWlfbGluZSA9IGUxaW5wX2xpbmVfZ2V0KGUxX25yKTsKKwlpZiAoIWUxaV9saW5lKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmZTFpX2xpbmUtPnRzW3RzX25yLTFdOworfQorCitzdHJ1Y3Qgc3ViY2hfbXV4ICplMWlucF9nZXRfbXV4KHVfaW50OF90IGUxX25yLCB1X2ludDhfdCB0c19ucikKK3sKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9IGUxaW5wX3RzX2dldChlMV9uciwgdHNfbnIpOworCisJaWYgKCFlMWlfdHMpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZlMWlfdHMtPnRyYXUubXV4OworfQorCisvKiBTaWduYWxsaW5nIExpbmsgKi8KKworc3RydWN0IGUxaW5wX3NpZ25fbGluayAqZTFpbnBfbG9va3VwX3NpZ25fbGluayhzdHJ1Y3QgZTFpbnBfdHMgKmUxaSwKKwkJCQkJIAl1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmssICZlMWktPnNpZ24uc2lnbl9saW5rcywgbGlzdCkgeworCQlpZiAobGluay0+c2FwaSA9PSBzYXBpICYmIGxpbmstPnRlaSA9PSB0ZWkpCisJCQlyZXR1cm4gbGluazsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogY3JlYXRlIGEgbmV3IHNpZ25hbGxpbmcgbGluayBpbiBhIEUxIHRpbWVzbG90ICovCisKK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgKgorZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBlbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlLAorCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHRlaSwKKwkJCXVfaW50OF90IHNhcGkpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKworCWlmICh0cy0+dHlwZSAhPSBFMUlOUF9UU19UWVBFX1NJR04pCisJCXJldHVybiBOVUxMOworCisJbGluayA9IHRhbGxvY196ZXJvKHRhbGxfc2lnbF9jdHgsIHN0cnVjdCBlMWlucF9zaWduX2xpbmspOworCWlmICghbGluaykKKwkJcmV0dXJuIE5VTEw7CisKKwlsaW5rLT50cyA9IHRzOworCWxpbmstPnR5cGUgPSB0eXBlOworCUlOSVRfTExJU1RfSEVBRCgmbGluay0+dHhfbGlzdCk7CisJbGluay0+dHJ4ID0gdHJ4OworCWxpbmstPnRlaSA9IHRlaTsKKwlsaW5rLT5zYXBpID0gc2FwaTsKKworCWxsaXN0X2FkZF90YWlsKCZsaW5rLT5saXN0LCAmdHMtPnNpZ24uc2lnbl9saW5rcyk7CisKKwlyZXR1cm4gbGluazsKK30KKwordm9pZCBlMWlucF9zaWduX2xpbmtfZGVzdHJveShzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rKQoreworCXN0cnVjdCBtc2diICptc2c7CisKKwlsbGlzdF9kZWwoJmxpbmstPmxpc3QpOworCXdoaWxlICghbGxpc3RfZW1wdHkoJmxpbmstPnR4X2xpc3QpKSB7CisJCW1zZyA9IG1zZ2JfZGVxdWV1ZSgmbGluay0+dHhfbGlzdCk7CisJCW1zZ2JfZnJlZShtc2cpOworCX0KKworCWlmIChsaW5rLT50cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX1NJR04pCisJCWJzY19kZWxfdGltZXIoJmxpbmstPnRzLT5zaWduLnR4X3RpbWVyKTsKKworCXRhbGxvY19mcmVlKGxpbmspOworfQorCisvKiB0aGUgRTEgZHJpdmVyIHRlbGxzIHVzIGhlIGhhcyByZWNlaXZlZCBzb21ldGhpbmcgb24gYSBUUyAqLworaW50IGUxaW5wX3J4X3RzKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBtc2diICptc2csCisJCXVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHRzLT50eXBlKSB7CisJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCS8qIGNvbnN1bHQgdGhlIGxpc3Qgb2Ygc2lnbmFsbGluZyBsaW5rcyAqLworCQl3cml0ZV9wY2FwX3BhY2tldChQQ0FQX0lOUFVULCBzYXBpLCB0ZWksIG1zZyk7CisJCWxpbmsgPSBlMWlucF9sb29rdXBfc2lnbl9saW5rKHRzLCB0ZWksIHNhcGkpOworCQlpZiAoIWxpbmspIHsKKwkJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAiZGlkbid0IGZpbmQgc2lnbmFsbGluZyBsaW5rIGZvciAiCisJCQkJInRlaSAlZCwgc2FwaSAlZFxuIiwgdGVpLCBzYXBpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfQlRTLCBsaW5rLT50cngtPmJ0cyk7CisJCXN3aXRjaCAobGluay0+dHlwZSkgeworCQljYXNlIEUxSU5QX1NJR05fT01MOgorCQkJbXNnLT50cnggPSBsaW5rLT50cng7CisJCQlyZXQgPSBhYmlzX25tX3Jjdm1zZyhtc2cpOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCQltc2ctPnRyeCA9IGxpbmstPnRyeDsKKwkJCXJldCA9IGFiaXNfcnNsX3Jjdm1zZyhtc2cpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJTE9HUChETUksIExPR0xfRVJST1IsICJ1bmtub3duIGxpbmsgdHlwZSAldVxuIiwgbGluay0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJcmV0ID0gc3ViY2hfZGVtdXhfaW4oJnRzLT50cmF1LmRlbXV4LCBtc2ctPmwyaCwgbXNnYl9sMmxlbihtc2cpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJTE9HUChETUksIExPR0xfRVJST1IsICJ1bmtub3duIFRTIHR5cGUgJXVcbiIsIHRzLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBUU1hfQUxMT0NfU0laRSA0MDk2CisKKy8qIGNhbGxlZCBieSBkcml2ZXIgaWYgaXQgd2FudHMgdG8gdHJhbnNtaXQgb24gYSBnaXZlbiBUUyAqLworc3RydWN0IG1zZ2IgKmUxaW5wX3R4X3RzKHN0cnVjdCBlMWlucF90cyAqZTFpX3RzLAorCQkJIHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKipzaWduX2xpbmspCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gTlVMTDsKKwlpbnQgbGVuOworCisJc3dpdGNoIChlMWlfdHMtPnR5cGUpIHsKKwljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJLyogRklYTUU6IGltcGxlbWVudCB0aGlzIHJvdW5kIHJvYmluICovCisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmssICZlMWlfdHMtPnNpZ24uc2lnbl9saW5rcywgbGlzdCkgeworCQkJbXNnID0gbXNnYl9kZXF1ZXVlKCZsaW5rLT50eF9saXN0KTsKKwkJCWlmIChtc2cpIHsKKwkJCQlpZiAoc2lnbl9saW5rKQorCQkJCQkqc2lnbl9saW5rID0gbGluazsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJbXNnID0gbXNnYl9hbGxvYyhUU1hfQUxMT0NfU0laRSwgIlRSQVVfVFgiKTsKKwkJaWYgKCFtc2cpCisJCQlyZXR1cm4gTlVMTDsKKwkJbGVuID0gc3ViY2hhbl9tdXhfb3V0KCZlMWlfdHMtPnRyYXUubXV4LCBtc2ctPmRhdGEsIDQwKTsKKwkJbXNnYl9wdXQobXNnLCA0MCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAidW5zdXBwb3J0ZWQgRTEgVFMgdHlwZSAldVxuIiwgZTFpX3RzLT50eXBlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBtc2c7Cit9CisKKy8qIGNhbGxlZCBieSBkcml2ZXIgaW4gY2FzZSBzb21lIGtpbmQgb2YgbGluayBzdGF0ZSBldmVudCAqLworaW50IGUxaW5wX2V2ZW50KHN0cnVjdCBlMWlucF90cyAqdHMsIGludCBldnQsIHVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCisJbGluayA9IGUxaW5wX2xvb2t1cF9zaWduX2xpbmsodHMsIHRlaSwgc2FwaSk7CisJaWYgKCFsaW5rKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZJWE1FOiByZXBvcnQgZnVydGhlciB1cHdhcmRzICovCisJaW5wdXRfZXZlbnQoZXZ0LCBsaW5rLT50eXBlLCBsaW5rLT50cngpOworCXJldHVybiAwOworfQorCisvKiByZWdpc3RlciBhIGRyaXZlciB3aXRoIHRoZSBFMSBjb3JlICovCitpbnQgZTFpbnBfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBlMWlucF9kcml2ZXIgKmRydikKK3sKKwlsbGlzdF9hZGRfdGFpbCgmZHJ2LT5saXN0LCAmZTFpbnBfZHJpdmVyX2xpc3QpOworCXJldHVybiAwOworfQorCitpbnQgZTFpbnBfbGluZV91cGRhdGUoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpCit7CisJcmV0dXJuIG1pX2UxX2xpbmVfdXBkYXRlKGxpbmUpOworfQorCitzdGF0aWMgaW50IGUxaV9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICAgICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlpZiAoc3Vic3lzICE9IFNTX0dMT0JBTCB8fAorCSAgICBzaWduYWwgIT0gU19HTE9CQUxfU0hVVERPV04pCisJCXJldHVybiAwOworCisJaWYgKHBjYXBfZmQpIHsKKwkJY2xvc2UocGNhcF9mZCk7CisJCXBjYXBfZmQgPSAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF9lMV9pbnAodm9pZCkKK3sKKwl0YWxsX3NpZ2xfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMSwKKwkJCQkJICAgImUxaW5wX3NpZ25fbGluayIpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX0dMT0JBTCwgZTFpX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfMDguYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTU1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDguYwpAQCAtMCwwICsxLDI5MzYgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9iaXR2ZWMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc200OC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Vzc2QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpbGVudF9jYWxsLmg+CisKK3ZvaWQgKnRhbGxfbG9jb3BfY3R4OworCitpbnQgZ3NtMDQwOF9sb2NfdXBkX2FjYyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IHRtc2kpOworc3RhdGljIGludCBnc200OF90eF9zaW1wbGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQkgICB1X2ludDhfdCBwZGlzYywgdV9pbnQ4X3QgbXNnX3R5cGUpOworc3RhdGljIHZvaWQgc2NoZWR1bGVfcmVqZWN0KHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uKTsKKworc3RydWN0IGdzbV9sYWkgeworCXVfaW50MTZfdCBtY2M7CisJdV9pbnQxNl90IG1uYzsKKwl1X2ludDE2X3QgbGFjOworfTsKKworc3RhdGljIHVfaW50MzJfdCBuZXdfY2FsbHJlZiA9IDB4ODAwMDAwMDE7CisKK3N0YXRpYyBpbnQgYXV0aG9yaXplX3N1YnNjcmliZXIoc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uICpsb2MsCisJCQkJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQoreworCWlmICghc3Vic2NyaWJlcikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIERvIG5vdCBzZW5kIGFjY2VwdCB5ZXQgYXMgbW9yZSBpbmZvcm1hdGlvbiBzaG91bGQgYXJyaXZlLiBTb21lCisJICogcGhvbmVzIHdpbGwgbm90IHNlbmQgdXMgdGhlIGluZm9ybWF0aW9uIGFuZCB3ZSB3aWxsIGhhdmUgdG8gY2hlY2sKKwkgKiB3aGF0IHdlIHdhbnQgdG8gZG8gd2l0aCB0aGF0LgorCSAqLworCWlmIChsb2MgJiYgKGxvYy0+d2FpdGluZ19mb3JfaW1zaSB8fCBsb2MtPndhaXRpbmdfZm9yX2ltZWkpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc3Vic2NyaWJlci0+bmV0LT5hdXRoX3BvbGljeSkgeworCWNhc2UgR1NNX0FVVEhfUE9MSUNZX0NMT1NFRDoKKwkJcmV0dXJuIHN1YnNjcmliZXItPmF1dGhvcml6ZWQ7CisJY2FzZSBHU01fQVVUSF9QT0xJQ1lfVE9LRU46CisJCWlmIChzdWJzY3JpYmVyLT5hdXRob3JpemVkKQorCQkJcmV0dXJuIHN1YnNjcmliZXItPmF1dGhvcml6ZWQ7CisJCXJldHVybiAoc3Vic2NyaWJlci0+ZmxhZ3MgJiBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUKTsKKwljYXNlIEdTTV9BVVRIX1BPTElDWV9BQ0NFUFRfQUxMOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubikKK3sKKwlpZiAoIWNvbm4tPmxvY19vcGVyYXRpb24pCisJCXJldHVybjsKKworCWJzY19kZWxfdGltZXIoJmNvbm4tPmxvY19vcGVyYXRpb24tPnVwZGF0aW5nX3RpbWVyKTsKKwl0YWxsb2NfZnJlZShjb25uLT5sb2Nfb3BlcmF0aW9uKTsKKwljb25uLT5sb2Nfb3BlcmF0aW9uID0gMDsKKwlwdXRfc3Vic2NyX2Nvbihjb25uKTsKK30KKworc3RhdGljIHZvaWQgYWxsb2NhdGVfbG9jX3VwZGF0aW5nX3JlcShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubikKK3sKKwl1c2Vfc3Vic2NyX2Nvbihjb25uKQorCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShjb25uKTsKKworCWNvbm4tPmxvY19vcGVyYXRpb24gPSB0YWxsb2NfemVybyh0YWxsX2xvY29wX2N0eCwKKwkJCQkJICAgc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uKTsKK30KKworc3RhdGljIGludCBnc20wNDA4X2F1dGhvcml6ZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpZiAoYXV0aG9yaXplX3N1YnNjcmliZXIoY29ubi0+bG9jX29wZXJhdGlvbiwgY29ubi0+c3Vic2NyKSkgeworCQlpbnQgcmM7CisKKwkJZGJfc3Vic2NyaWJlcl9hbGxvY190bXNpKGNvbm4tPnN1YnNjcik7CisJCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShjb25uKTsKKwkJcmMgPSBnc20wNDA4X2xvY191cGRfYWNjKG1zZy0+bGNoYW4sIGNvbm4tPnN1YnNjci0+dG1zaSk7CisJCWlmIChtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcmstPnNlbmRfbW1faW5mbykgeworCQkJLyogc2VuZCBNTSBJTkZPIHdpdGggbmV0d29yayBuYW1lICovCisJCQlyYyA9IGdzbTQ4X3R4X21tX2luZm8obXNnLT5sY2hhbik7CisJCX0KKworCQkvKiBjYWxsIHN1YnNjcl91cGRhdGUgYWZ0ZXIgcHV0dGluZyB0aGUgbG9jX3VwZF9hY2MKKwkJICogaW4gdGhlIHRyYW5zbWl0IHF1ZXVlLCBzaW5jZSBTX1NVQlNDUl9BVFRBQ0hFRCBtaWdodAorCQkgKiB0cmlnZ2VyIGZ1cnRoZXIgYWN0aW9uIGxpa2UgU01TIGRlbGl2ZXJ5ICovCisJCXN1YnNjcl91cGRhdGUoY29ubi0+c3Vic2NyLCBtc2ctPnRyeC0+YnRzLAorCQkJICAgICAgR1NNX1NVQlNDUklCRVJfVVBEQVRFX0FUVEFDSEVEKTsKKworCQkvKiB0cnkgdG8gY2xvc2UgY2hhbm5lbCBBU0FQICovCisJCWxjaGFuX2F1dG9fcmVsZWFzZShjb25uLT5sY2hhbik7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc20wNDA4X2hhbmRsZV9sY2hhbl9zaWduYWwodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCQkJdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgKnRlbXA7CisKKwlpZiAoc3Vic3lzICE9IFNTX0xDSEFOIHx8IHNpZ25hbCAhPSBTX0xDSEFOX1VORVhQRUNURURfUkVMRUFTRSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIENhbmNlbCBhbnkgb3V0c3RhbmRpbmcgbG9jYXRpb24gdXBkYXRpbmcgcmVxdWVzdAorCSAqIG9wZXJhdGlvbiB0YWtpbmcgcGxhY2Ugb24gdGhlIGxjaGFuLgorCSAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gKHN0cnVjdCBnc21fbGNoYW4gKilzaWduYWxfZGF0YTsKKwlpZiAoIWxjaGFuKQorCQlyZXR1cm4gMDsKKworCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcSgmbGNoYW4tPmNvbm4pOworCisJLyogRnJlZSBhbGwgdHJhbnNhY3Rpb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsZWFzZWQgbGNoYW4gKi8KKwkvKiBGSVhNRTogdGhpcyBpcyBub3QgbmVjY2Vzc2FyaWx5IHRoZSByaWdodCB0aGluZyB0byBkbywgd2Ugc2hvdWxkCisJICogb25seSBzZXQgdHJhbnMtPmxjaGFuIHRvIE5VTEwgYW5kIHdhaXQgZm9yIGFub3RoZXIgbGNoYW4gdG8gYmUKKwkgKiBlc3RhYmxpc2hlZCB0byB0aGUgc2FtZSBNTSBlbnRpdHkgKHBob25lL3N1YnNjcmliZXIpICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cmFucywgdGVtcCwgJmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcmstPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+Y29ubiAmJiB0cmFucy0+Y29ubi0+bGNoYW4gPT0gbGNoYW4pCisJCQl0cmFuc19mcmVlKHRyYW5zKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA5LjIuMTQgOiBTZW5kIExPQ0FUSU9OIFVQREFUSU5HIFJFSkVDVCAqLworaW50IGdzbTA0MDhfbG9jX3VwZF9yZWooc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGNhdXNlKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCWNvbm4gPSAmbGNoYW4tPmNvbm47CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9MT0NfVVBEX1JFSkVDVDsKKwlnaC0+ZGF0YVswXSA9IGNhdXNlOworCisJTE9HUChETU0sIExPR0xfSU5GTywgIlN1YnNjcmliZXIgJXM6IExPQ0FUSU9OIFVQREFUSU5HIFJFSkVDVCAiCisJICAgICAiTEFDPSV1IEJUUz0ldVxuIiwgY29ubi0+c3Vic2NyID8KKwkgICAgIAkJCXN1YnNjcl9uYW1lKGNvbm4tPnN1YnNjcikgOiAidW5rbm93biIsCisJICAgICBsY2hhbi0+dHMtPnRyeC0+YnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUsIGxjaGFuLT50cy0+dHJ4LT5idHMtPm5yKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF9yZXNwLnJlamVjdCk7CisJCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogQ2hhcHRlciA5LjIuMTMgOiBTZW5kIExPQ0FUSU9OIFVQREFURSBBQ0NFUFQgKi8KK2ludCBnc20wNDA4X2xvY191cGRfYWNjKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgdG1zaSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCAqbGFpOworCXVfaW50OF90ICptaWQ7CisJCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9MT0NfVVBEX0FDQ0VQVDsKKworCWxhaSA9IChzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmxhaSkpOworCWdzbTQ4X2dlbmVyYXRlX2xhaShsYWksIGJ0cy0+bmV0d29yay0+Y291bnRyeV9jb2RlLAorCQkgICAgIGJ0cy0+bmV0d29yay0+bmV0d29ya19jb2RlLCBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSk7CisKKwltaWQgPSBtc2diX3B1dChtc2csIEdTTTQ4X01JRF9UTVNJX0xFTik7CisJZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21fdG1zaShtaWQsIHRtc2kpOworCisJREVCVUdQKERNTSwgIi0+IExPQ0FUSU9OIFVQREFURSBBQ0NFUFRcbiIpOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3Jlc3AuYWNjZXB0KTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIFRyYW5zbWl0IENoYXB0ZXIgOS4yLjEwIElkZW50aXR5IFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgbW1fdHhfaWRlbnRpdHlfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBpZF90eXBlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9JRF9SRVE7CisJZ2gtPmRhdGFbMF0gPSBpZF90eXBlOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworCisvKiBQYXJzZSBDaGFwdGVyIDkuMi4xMSBJZGVudGl0eSBSZXNwb25zZSAqLworc3RhdGljIGludCBtbV9yeF9pZF9yZXNwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gYnRzLT5uZXR3b3JrOworCXVfaW50OF90IG1pX3R5cGUgPSBnaC0+ZGF0YVsxXSAmIEdTTV9NSV9UWVBFX01BU0s7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisKKwlnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBzaXplb2YobWlfc3RyaW5nKSwgJmdoLT5kYXRhWzFdLCBnaC0+ZGF0YVswXSk7CisJREVCVUdQKERNTSwgIklERU5USVRZIFJFU1BPTlNFOiBtaV90eXBlPTB4JTAyeCBNSSglcylcbiIsCisJCW1pX3R5cGUsIG1pX3N0cmluZyk7CisKKwljb25uID0gJmxjaGFuLT5jb25uOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NVQlNDUiwgU19TVUJTQ1JfSURFTlRJVFksIGdoLT5kYXRhKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJLyogbG9vayB1cCBzdWJzY3JpYmVyIGJhc2VkIG9uIElNU0ksIGNyZWF0ZSBpZiBub3QgZm91bmQgKi8KKwkJaWYgKCFjb25uLT5zdWJzY3IpIHsKKwkJCWNvbm4tPnN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShuZXQsIG1pX3N0cmluZyk7CisJCQlpZiAoIWNvbm4tPnN1YnNjcikKKwkJCQljb25uLT5zdWJzY3IgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihuZXQsIG1pX3N0cmluZyk7CisJCX0KKwkJaWYgKGNvbm4tPmxvY19vcGVyYXRpb24pCisJCQljb25uLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbXNpID0gMDsKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJOgorCWNhc2UgR1NNX01JX1RZUEVfSU1FSVNWOgorCQkvKiB1cGRhdGUgc3Vic2NyaWJlIDwtPiBJTUVJIG1hcHBpbmcgKi8KKwkJaWYgKGNvbm4tPnN1YnNjcikgeworCQkJZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKGNvbm4tPnN1YnNjciwgbWlfc3RyaW5nKTsKKwkJCWRiX3N5bmNfZXF1aXBtZW50KCZjb25uLT5zdWJzY3ItPmVxdWlwbWVudCk7CisJCX0KKwkJaWYgKGNvbm4tPmxvY19vcGVyYXRpb24pCisJCQljb25uLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbWVpID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgY2FuIGxldCB0aGUgbW9iaWxlIHN0YXRpb24gZW50ZXIgKi8KKwlyZXR1cm4gZ3NtMDQwOF9hdXRob3JpemUoY29ubiwgbXNnKTsKK30KKworCitzdGF0aWMgdm9pZCBsb2NfdXBkX3Jlal9jYih2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uID0gZGF0YTsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGNvbm4tPmxjaGFuOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCisJcmVsZWFzZV9sb2NfdXBkYXRpbmdfcmVxKGNvbm4pOworCWdzbTA0MDhfbG9jX3VwZF9yZWoobGNoYW4sIGJ0cy0+bmV0d29yay0+cmVqZWN0X2NhdXNlKTsKKwlsY2hhbl9hdXRvX3JlbGVhc2UobGNoYW4pOworfQorCitzdGF0aWMgdm9pZCBzY2hlZHVsZV9yZWplY3Qoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJY29ubi0+bG9jX29wZXJhdGlvbi0+dXBkYXRpbmdfdGltZXIuY2IgPSBsb2NfdXBkX3Jlal9jYjsKKwljb25uLT5sb2Nfb3BlcmF0aW9uLT51cGRhdGluZ190aW1lci5kYXRhID0gY29ubjsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmNvbm4tPmxvY19vcGVyYXRpb24tPnVwZGF0aW5nX3RpbWVyLCA1LCAwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmx1cGRfbmFtZSh1X2ludDhfdCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR1NNNDhfTFVQRF9OT1JNQUw6CisJCXJldHVybiAiTk9STUFMIjsKKwljYXNlIEdTTTQ4X0xVUERfUEVSSU9ESUM6CisJCXJldHVybiAiUEVST0lET0MiOworCWNhc2UgR1NNNDhfTFVQRF9JTVNJX0FUVDoKKwkJcmV0dXJuICJJTVNJIEFUVEFDSCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVTktOT1dOIjsKKwl9Cit9CisKKy8qIENoYXB0ZXIgOS4yLjE1OiBSZWNlaXZlIExvY2F0aW9uIFVwZGF0aW5nIFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgbW1fcnhfbG9jX3VwZF9yZXEoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfbG9jX3VwZF9yZXEgKmx1OworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJdV9pbnQ4X3QgbWlfdHlwZTsKKwljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKKwlpbnQgcmM7CisKKyAJbHUgPSAoc3RydWN0IGdzbTQ4X2xvY191cGRfcmVxICopIGdoLT5kYXRhOworCWNvbm4gPSAmbGNoYW4tPmNvbm47CisKKwltaV90eXBlID0gbHUtPm1pWzBdICYgR1NNX01JX1RZUEVfTUFTSzsKKworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9zdHJpbmcsIHNpemVvZihtaV9zdHJpbmcpLCBsdS0+bWksIGx1LT5taV9sZW4pOworCisJREVCVUdQQyhETU0sICJtaV90eXBlPTB4JTAyeCBNSSglcykgdHlwZT0lcyAiLCBtaV90eXBlLCBtaV9zdHJpbmcsCisJCWx1cGRfbmFtZShsdS0+dHlwZSkpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NVQlNDUiwgU19TVUJTQ1JfSURFTlRJVFksICZsdS0+bWlfbGVuKTsKKworCXN3aXRjaCAobHUtPnR5cGUpIHsKKwljYXNlIEdTTTQ4X0xVUERfTk9STUFMOgorCQljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmxvY191cGRfdHlwZS5ub3JtYWwpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0xVUERfSU1TSV9BVFQ6CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF90eXBlLmF0dGFjaCk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTFVQRF9QRVJJT0RJQzoKKwkJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3R5cGUucGVyaW9kaWMpOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFBzZXVkbyBTcG9vZiBkZXRlY3Rpb246IEp1c3QgZHJvcCBhIHNlY29uZC9jb25jdXJyZW50CisJICogbG9jYXRpb24gdXBkYXRpbmcgcmVxdWVzdC4KKwkgKi8KKwlpZiAoY29ubi0+bG9jX29wZXJhdGlvbikgeworCQlERUJVR1BDKERNTSwgImlnbm9yaW5nIHJlcXVlc3QgZHVlIGFuIGV4aXN0aW5nIG9uZTogJXAuXG4iLAorCQkJY29ubi0+bG9jX29wZXJhdGlvbik7CisJCWdzbTA0MDhfbG9jX3VwZF9yZWoobGNoYW4sIEdTTTQ4X1JFSkVDVF9QUk9UT0NPTF9FUlJPUik7CisJCXJldHVybiAwOworCX0KKworCWFsbG9jYXRlX2xvY191cGRhdGluZ19yZXEoJmxjaGFuLT5jb25uKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJREVCVUdQQyhETU0sICJcbiIpOworCQkvKiB3ZSBhbHdheXMgd2FudCB0aGUgSU1FSSwgdG9vICovCisJCXJjID0gbW1fdHhfaWRlbnRpdHlfcmVxKGxjaGFuLCBHU01fTUlfVFlQRV9JTUVJKTsKKwkJY29ubi0+bG9jX29wZXJhdGlvbi0+d2FpdGluZ19mb3JfaW1laSA9IDE7CisKKwkJLyogbG9vayB1cCBzdWJzY3JpYmVyIGJhc2VkIG9uIElNU0ksIGNyZWF0ZSBpZiBub3QgZm91bmQgKi8KKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKGJ0cy0+bmV0d29yaywgbWlfc3RyaW5nKTsKKwkJaWYgKCFzdWJzY3IpIHsKKwkJCXN1YnNjciA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKGJ0cy0+bmV0d29yaywgbWlfc3RyaW5nKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CisJCURFQlVHUEMoRE1NLCAiXG4iKTsKKwkJLyogd2UgYWx3YXlzIHdhbnQgdGhlIElNRUksIHRvbyAqLworCQlyYyA9IG1tX3R4X2lkZW50aXR5X3JlcShsY2hhbiwgR1NNX01JX1RZUEVfSU1FSSk7CisJCWNvbm4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltZWkgPSAxOworCisJCS8qIGxvb2sgdXAgdGhlIHN1YnNjcmliZXIgYmFzZWQgb24gVE1TSSwgcmVxdWVzdCBJTVNJIGlmIGl0IGZhaWxzICovCisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfdG1zaShidHMtPm5ldHdvcmssCisJCQkJCSAgICB0bXNpX2Zyb21fc3RyaW5nKG1pX3N0cmluZykpOworCQlpZiAoIXN1YnNjcikgeworCQkJLyogc2VuZCBJREVOVElUWSBSRVFVRVNUIG1lc3NhZ2UgdG8gZ2V0IElNU0kgKi8KKwkJCXJjID0gbW1fdHhfaWRlbnRpdHlfcmVxKGxjaGFuLCBHU01fTUlfVFlQRV9JTVNJKTsKKwkJCWNvbm4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltc2kgPSAxOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1FSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUlTVjoKKwkJLyogbm8gc2ltIGNhcmQuLi4gRklYTUU6IHdoYXQgdG8gZG8gPyAqLworCQlERUJVR1BDKERNTSwgInVuaW1wbGVtZW50ZWQgbW9iaWxlIGlkZW50aXR5IHR5cGVcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgkKKwkJREVCVUdQQyhETU0sICJ1bmtub3duIG1vYmlsZSBpZGVudGl0eSB0eXBlXG4iKTsKKwkJYnJlYWs7CisJfQorCisJLyogc2NoZWR1bGUgdGhlIHJlamVjdCB0aW1lciAqLworCXNjaGVkdWxlX3JlamVjdChjb25uKTsKKworCWlmICghc3Vic2NyKSB7CisJCURFQlVHUEMoRFJSLCAiPC0gQ2FuJ3QgZmluZCBhbnkgc3Vic2NyaWJlciBmb3IgdGhpcyBJRFxuIik7CisJCS8qIEZJWE1FOiByZXF1ZXN0IGlkPyBjbG9zZSBjaGFubmVsPyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljb25uLT5zdWJzY3IgPSBzdWJzY3I7CisJY29ubi0+c3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMSA9IGx1LT5jbGFzc21hcmsxOworCisJLyogY2hlY2sgaWYgd2UgY2FuIGxldCB0aGUgc3Vic2NyaWJlciBpbnRvIG91ciBuZXR3b3JrIGltbWVkaWF0ZWx5CisJICogb3IgaWYgd2UgbmVlZCB0byB3YWl0IGZvciBpZGVudGl0eSByZXNwb25zZXMuICovCisJcmV0dXJuIGdzbTA0MDhfYXV0aG9yaXplKGNvbm4sIG1zZyk7Cit9CisKKyNpZiAwCitzdGF0aWMgdV9pbnQ4X3QgdG9fYmNkOCh1X2ludDhfdCB2YWwpCit7CisgICAgICAgcmV0dXJuICgodmFsIC8gMTApIDw8IDQpIHwgKHZhbCAlIDEwKTsKK30KKyNlbmRpZgorCisvKiBTZWN0aW9uIDkuMi4xNWEgKi8KK2ludCBnc200OF90eF9tbV9pbmZvKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXVfaW50OF90ICpwdHI4OworCWludCBuYW1lX2xlbiwgbmFtZV9wYWQ7CisjaWYgMAorCXRpbWVfdCBjdXJfdDsKKwlzdHJ1Y3QgdG0qIGN1cl90aW1lOworCWludCB0ejE1bWluOworI2VuZGlmCisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX01NX0lORk87CisKKwlpZiAobmV0LT5uYW1lX2xvbmcpIHsKKyNpZiAwCisJCW5hbWVfbGVuID0gc3RybGVuKG5ldC0+bmFtZV9sb25nKTsKKwkJLyogMTAuNS4zLjVhICovCisJCXB0cjggPSBtc2diX3B1dChtc2csIDMpOworCQlwdHI4WzBdID0gR1NNNDhfSUVfTkFNRV9MT05HOworCQlwdHI4WzFdID0gbmFtZV9sZW4qMiArMTsKKwkJcHRyOFsyXSA9IDB4OTA7IC8qIFVDUzIsIG5vIHNwYXJlIGJpdHMsIG5vIENJICovCisKKwkJcHRyMTYgPSAodV9pbnQxNl90ICopIG1zZ2JfcHV0KG1zZywgbmFtZV9sZW4qMik7CisJCWZvciAoaSA9IDA7IGkgPCBuYW1lX2xlbjsgaSsrKQorCQkJcHRyMTZbaV0gPSBodG9ucyhuZXQtPm5hbWVfbG9uZ1tpXSk7CisKKwkJLyogRklYTUU6IFVzZSBDZWxsIEJyb2FkY2FzdCwgbm90IFVDUy0yLCBzaW5jZQorCQkgKiBVQ1MtMiBpcyBvbmx5IHN1cHBvcnRlZCBieSBsYXRlciByZXZpc2lvbnMgb2YgdGhlIHNwZWMgKi8KKyNlbmRpZgorCQluYW1lX2xlbiA9IChzdHJsZW4obmV0LT5uYW1lX2xvbmcpKjcpLzg7CisJCW5hbWVfcGFkID0gKDggLSBzdHJsZW4obmV0LT5uYW1lX2xvbmcpKjcpJTg7CisJCWlmIChuYW1lX3BhZCA+IDApCisJCQluYW1lX2xlbisrOworCQkvKiAxMC41LjMuNWEgKi8KKwkJcHRyOCA9IG1zZ2JfcHV0KG1zZywgMyk7CisJCXB0cjhbMF0gPSBHU000OF9JRV9OQU1FX0xPTkc7CisJCXB0cjhbMV0gPSBuYW1lX2xlbiArMTsKKwkJcHRyOFsyXSA9IDB4ODAgfCBuYW1lX3BhZDsgLyogQ2VsbCBCcm9hZGNhc3QgRENTLCBubyBDSSAqLworCisJCXB0cjggPSBtc2diX3B1dChtc2csIG5hbWVfbGVuKTsKKwkJZ3NtXzdiaXRfZW5jb2RlKHB0cjgsIG5ldC0+bmFtZV9sb25nKTsKKworCX0KKworCWlmIChuZXQtPm5hbWVfc2hvcnQpIHsKKyNpZiAwCisJCW5hbWVfbGVuID0gc3RybGVuKG5ldC0+bmFtZV9zaG9ydCk7CisJCS8qIDEwLjUuMy41YSAqLworCQlwdHI4ID0gKHVfaW50OF90ICopIG1zZ2JfcHV0KG1zZywgMyk7CisJCXB0cjhbMF0gPSBHU000OF9JRV9OQU1FX1NIT1JUOworCQlwdHI4WzFdID0gbmFtZV9sZW4qMiArIDE7CisJCXB0cjhbMl0gPSAweDkwOyAvKiBVQ1MyLCBubyBzcGFyZSBiaXRzLCBubyBDSSAqLworCisJCXB0cjE2ID0gKHVfaW50MTZfdCAqKSBtc2diX3B1dChtc2csIG5hbWVfbGVuKjIpOworCQlmb3IgKGkgPSAwOyBpIDwgbmFtZV9sZW47IGkrKykKKwkJCXB0cjE2W2ldID0gaHRvbnMobmV0LT5uYW1lX3Nob3J0W2ldKTsKKyNlbmRpZgorCQluYW1lX2xlbiA9IChzdHJsZW4obmV0LT5uYW1lX3Nob3J0KSo3KS84OworCQluYW1lX3BhZCA9ICg4IC0gc3RybGVuKG5ldC0+bmFtZV9zaG9ydCkqNyklODsKKwkJaWYgKG5hbWVfcGFkID4gMCkKKwkJCW5hbWVfbGVuKys7CisJCS8qIDEwLjUuMy41YSAqLworCQlwdHI4ID0gKHVfaW50OF90ICopIG1zZ2JfcHV0KG1zZywgMyk7CisJCXB0cjhbMF0gPSBHU000OF9JRV9OQU1FX1NIT1JUOworCQlwdHI4WzFdID0gbmFtZV9sZW4gKzE7CisJCXB0cjhbMl0gPSAweDgwIHwgbmFtZV9wYWQ7IC8qIENlbGwgQnJvYWRjYXN0IERDUywgbm8gQ0kgKi8KKworCQlwdHI4ID0gbXNnYl9wdXQobXNnLCBuYW1lX2xlbik7CisJCWdzbV83Yml0X2VuY29kZShwdHI4LCBuZXQtPm5hbWVfc2hvcnQpOworCisJfQorCisjaWYgMAorCS8qIFNlY3Rpb24gMTAuNS4zLjkgKi8KKwljdXJfdCA9IHRpbWUoTlVMTCk7CisJY3VyX3RpbWUgPSBnbXRpbWUoJmN1cl90KTsKKwlwdHI4ID0gbXNnYl9wdXQobXNnLCA4KTsKKwlwdHI4WzBdID0gR1NNNDhfSUVfTkVUX1RJTUVfVFo7CisJcHRyOFsxXSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX3llYXIgJSAxMDApOworCXB0cjhbMl0gPSB0b19iY2Q4KGN1cl90aW1lLT50bV9tb24pOworCXB0cjhbM10gPSB0b19iY2Q4KGN1cl90aW1lLT50bV9tZGF5KTsKKwlwdHI4WzRdID0gdG9fYmNkOChjdXJfdGltZS0+dG1faG91cik7CisJcHRyOFs1XSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX21pbik7CisJcHRyOFs2XSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX3NlYyk7CisJLyogMDIuNDI6IGNvZGVkIGFzIEJDRCBlbmNvZGVkIHNpZ25lZCB2YWx1ZSBpbiB1bml0cyBvZiAxNSBtaW51dGVzICovCisJdHoxNW1pbiA9IChjdXJfdGltZS0+dG1fZ210b2ZmKS8oNjAqMTUpOworCXB0cjhbN10gPSB0b19iY2Q4KHR6MTVtaW4pOworCWlmICh0ejE1bWluIDwgMCkKKwkJcHRyOFs3XSB8PSAweDgwOworI2VuZGlmCisKKwlERUJVR1AoRE1NLCAiLT4gTU0gSU5GT1xuIik7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiBTZWN0aW9uIDkuMi4yICovCitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90ICpyYW5kLCBpbnQga2V5X3NlcSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJc3RydWN0IGdzbTQ4X2F1dGhfcmVxICphciA9IChzdHJ1Y3QgZ3NtNDhfYXV0aF9yZXEgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmFyKSk7CisKKwlERUJVR1AoRE1NLCAiLT4gQVVUSCBSRVEgKHJhbmQgPSAlcylcbiIsIGhleGR1bXAocmFuZCwgMTYpKTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9BVVRIX1JFUTsKKworCWFyLT5rZXlfc2VxID0ga2V5X3NlcTsKKworCS8qIDE2IGJ5dGVzIFJBTkQgcGFyYW1ldGVycyAqLworCWlmIChyYW5kKQorCQltZW1jcHkoYXItPnJhbmQsIHJhbmQsIDE2KTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIFNlY3Rpb24gOS4yLjEgKi8KK2ludCBnc200OF90eF9tbV9hdXRoX3JlaihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlERUJVR1AoRE1NLCAiLT4gQVVUSCBSRUpFQ1RcbiIpOworCXJldHVybiBnc200OF90eF9zaW1wbGUobGNoYW4sIEdTTTQ4X1BESVNDX01NLCBHU000OF9NVF9NTV9BVVRIX1JFSik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfdHhfbW1fc2Vydl9hY2soc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJREVCVUdQKERNTSwgIi0+IENNIFNFUlZJQ0UgQUNLXG4iKTsKKwlyZXR1cm4gZ3NtNDhfdHhfc2ltcGxlKGxjaGFuLCBHU000OF9QRElTQ19NTSwgR1NNNDhfTVRfTU1fQ01fU0VSVl9BQ0MpOworfQorCisvKiA5LjIuNiBDTSBzZXJ2aWNlIHJlamVjdCAqLworc3RhdGljIGludCBnc200OF90eF9tbV9zZXJ2X3JlaihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwKKwkJCQllbnVtIGdzbTQ4X3JlamVjdF92YWx1ZSB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMSk7CisKKwltc2ctPmxjaGFuID0gY29ubi0+bGNoYW47CisJdXNlX3N1YnNjcl9jb24oY29ubik7CisKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9DTV9TRVJWX1JFSjsKKwlnaC0+ZGF0YVswXSA9IHZhbHVlOworCURFQlVHUChETU0sICItPiBDTSBTRVJWSUNFIFJlamVjdCBjYXVzZTogJWRcbiIsIHZhbHVlKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qCisgKiBIYW5kbGUgQ00gU2VydmljZSBSZXF1ZXN0cworICogYSkgVmVyaWZ5IHRoYXQgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBjb250YWluIHRoZSBpbmZvcm1hdGlvbgorICogICAgd2UgcmVxdWlyZSBvdGhlcndzaWUgcmVqZWN0IHdpdGggSU5DT1JSRUNUX01FU1NBR0UKKyAqIGIpIFRyeSB0byBwYXJzZSB0aGUgVE1TSS4gSWYgd2UgZG8gbm90IGhhdmUgb25lIHJlamVjdAorICogYykgQ2hlY2sgdGhhdCB3ZSBrbm93IHRoZSBzdWJzY3JpYmVyIHdpdGggdGhlIFRNU0kgb3RoZXJ3aXNlIHJlamVjdAorICogICAgd2l0aCBhIEhMUiBjYXVzZQorICogZCkgU2V0IHRoZSBzdWJzY3JpYmVyIG9uIHRoZSBnc21fbGNoYW4gYW5kIGFjY2VwdAorICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X21tX3NlcnZfcmVxKHN0cnVjdCBtc2diICptc2cpCit7CisJdV9pbnQ4X3QgbWlfdHlwZTsKKwljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKKworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbTQ4X3NlcnZpY2VfcmVxdWVzdCAqcmVxID0KKwkJCShzdHJ1Y3QgZ3NtNDhfc2VydmljZV9yZXF1ZXN0ICopZ2gtPmRhdGE7CisJLyogdW5mb3J0dW5hdGVseSBpbiBQaGFzZTEgdGhlIGNsYXNzbWFyMiBsZW5ndGggaXMgdmFyaWFibGUgKi8KKwl1X2ludDhfdCBjbGFzc21hcmsyX2xlbiA9IGdoLT5kYXRhWzFdOworCXVfaW50OF90ICpjbGFzc21hcmsyID0gZ2gtPmRhdGErMjsKKwl1X2ludDhfdCBtaV9sZW4gPSAqKGNsYXNzbWFyazIgKyBjbGFzc21hcmsyX2xlbik7CisJdV9pbnQ4X3QgKm1pID0gKGNsYXNzbWFyazIgKyBjbGFzc21hcmsyX2xlbiArIDEpOworCisJREVCVUdQKERNTSwgIjwtIENNIFNFUlZJQ0UgUkVRVUVTVCAiKTsKKwlpZiAobXNnLT5kYXRhX2xlbiA8IHNpemVvZihzdHJ1Y3QgZ3NtNDhfc2VydmljZV9yZXF1ZXN0KikpIHsKKwkJREVCVUdQQyhETU0sICJ3cm9uZyBzaXplZCBtZXNzYWdlXG4iKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKCZtc2ctPmxjaGFuLT5jb25uLAorCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lOQ09SUkVDVF9NRVNTQUdFKTsKKwl9CisKKwlpZiAobXNnLT5kYXRhX2xlbiA8IHJlcS0+bWlfbGVuICsgNikgeworCQlERUJVR1BDKERNTSwgImRvZXMgbm90IGZpdCBpbiBwYWNrZXRcbiIpOworCQlyZXR1cm4gZ3NtNDhfdHhfbW1fc2Vydl9yZWooJm1zZy0+bGNoYW4tPmNvbm4sCisJCQkJCSAgICBHU000OF9SRUpFQ1RfSU5DT1JSRUNUX01FU1NBR0UpOworCX0KKworCW1pX3R5cGUgPSBtaVswXSAmIEdTTV9NSV9UWVBFX01BU0s7CisJaWYgKG1pX3R5cGUgIT0gR1NNX01JX1RZUEVfVE1TSSkgeworCQlERUJVR1BDKERNTSwgIm1pX3R5cGUgaXMgbm90IFRNU0k6ICVkXG4iLCBtaV90eXBlKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKCZtc2ctPmxjaGFuLT5jb25uLAorCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lOQ09SUkVDVF9NRVNTQUdFKTsKKwl9CisKKwlnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBzaXplb2YobWlfc3RyaW5nKSwgbWksIG1pX2xlbik7CisJREVCVUdQQyhETU0sICJzZXJ2X3R5cGU9MHglMDJ4IG1pX3R5cGU9MHglMDJ4IE0oJXMpXG4iLAorCQlyZXEtPmNtX3NlcnZpY2VfdHlwZSwgbWlfdHlwZSwgbWlfc3RyaW5nKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19TVUJTQ1IsIFNfU1VCU0NSX0lERU5USVRZLCAoY2xhc3NtYXJrMiArIGNsYXNzbWFyazJfbGVuKSk7CisKKwlpZiAoaXNfc2llbWVuc19idHMoYnRzKSkKKwkJc2VuZF9zaWVtZW5zX21ycGNpKG1zZy0+bGNoYW4sIGNsYXNzbWFyazItMSk7CisKKwlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X3Rtc2koYnRzLT5uZXR3b3JrLAorCQkJCSAgICB0bXNpX2Zyb21fc3RyaW5nKG1pX3N0cmluZykpOworCisJLyogRklYTUU6IGlmIHdlIGRvbid0IGtub3cgdGhlIFRNU0ksIGlucXVpcmUgYWJpdCBJTVNJIGFuZCBhbGxvY2F0ZSBuZXcgVE1TSSAqLworCWlmICghc3Vic2NyKQorCQlyZXR1cm4gZ3NtNDhfdHhfbW1fc2Vydl9yZWooJm1zZy0+bGNoYW4tPmNvbm4sCisJCQkJCSAgICBHU000OF9SRUpFQ1RfSU1TSV9VTktOT1dOX0lOX0hMUik7CisKKwlpZiAoIW1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyKQorCQltc2ctPmxjaGFuLT5jb25uLnN1YnNjciA9IHN1YnNjcjsKKwllbHNlIGlmIChtc2ctPmxjaGFuLT5jb25uLnN1YnNjciA9PSBzdWJzY3IpCisJCXN1YnNjcl9wdXQoc3Vic2NyKTsgLyogbGNoYW4gYWxyZWFkeSBoYXMgYSByZWYsIGRvbid0IG5lZWQgYW5vdGhlciBvbmUgKi8KKwllbHNlIHsKKwkJREVCVUdQKERNTSwgIjwtIENNIENoYW5uZWwgYWxyZWFkeSBvd25lZCBieSBzb21lb25lIGVsc2U/XG4iKTsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCX0KKworCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazJfbGVuID0gY2xhc3NtYXJrMl9sZW47CisJbWVtY3B5KHN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazIsIGNsYXNzbWFyazIsIGNsYXNzbWFyazJfbGVuKTsKKwlkYl9zeW5jX2VxdWlwbWVudCgmc3Vic2NyLT5lcXVpcG1lbnQpOworCisJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfYWNrKG1zZy0+bGNoYW4pOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X21tX2ltc2lfZGV0YWNoX2luZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbTQ4X2ltc2lfZGV0YWNoX2luZCAqaWRpID0KKwkJCQkoc3RydWN0IGdzbTQ4X2ltc2lfZGV0YWNoX2luZCAqKSBnaC0+ZGF0YTsKKwl1X2ludDhfdCBtaV90eXBlID0gaWRpLT5taVswXSAmIEdTTV9NSV9UWVBFX01BU0s7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBOVUxMOworCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksIGlkaS0+bWksIGlkaS0+bWlfbGVuKTsKKwlERUJVR1AoRE1NLCAiSU1TSSBERVRBQ0ggSU5ESUNBVElPTjogbWlfdHlwZT0weCUwMnggTUkoJXMpOiAiLAorCQltaV90eXBlLCBtaV9zdHJpbmcpOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3R5cGUuZGV0YWNoKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfVE1TSToKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV90bXNpKGJ0cy0+bmV0d29yaywKKwkJCQkJICAgIHRtc2lfZnJvbV9zdHJpbmcobWlfc3RyaW5nKSk7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKGJ0cy0+bmV0d29yaywgbWlfc3RyaW5nKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJOgorCWNhc2UgR1NNX01JX1RZUEVfSU1FSVNWOgorCQkvKiBubyBzaW0gY2FyZC4uLiBGSVhNRTogd2hhdCB0byBkbyA/ICovCisJCURFQlVHUEMoRE1NLCAidW5pbXBsZW1lbnRlZCBtb2JpbGUgaWRlbnRpdHkgdHlwZVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CQorCQlERUJVR1BDKERNTSwgInVua25vd24gbW9iaWxlIGlkZW50aXR5IHR5cGVcbiIpOworCQlicmVhazsKKwl9CisKKwlpZiAoc3Vic2NyKSB7CisJCXN1YnNjcl91cGRhdGUoc3Vic2NyLCBtc2ctPnRyeC0+YnRzLAorCQkJCUdTTV9TVUJTQ1JJQkVSX1VQREFURV9ERVRBQ0hFRCk7CisJCURFQlVHUChETU0sICJTdWJzY3JpYmVyOiAlc1xuIiwgc3Vic2NyX25hbWUoc3Vic2NyKSk7CisKKwkJc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMSA9IGlkaS0+Y2xhc3NtYXJrMTsKKwkJZGJfc3luY19lcXVpcG1lbnQoJnN1YnNjci0+ZXF1aXBtZW50KTsKKworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJfSBlbHNlCisJCURFQlVHUChETU0sICJVbmtub3duIFN1YnNjcmliZXIgPyE/XG4iKTsKKworCS8qIEZJWE1FOiBpdGVyYXRlIG92ZXIgYWxsIHRyYW5zYWN0aW9ucyBhbmQgcmVsZWFzZSB0aGVtLAorCSAqIGltYWdpbmUgYW4gSU1TSSBERVRBQ0ggaGFwcGVuaW5nIGR1cmluZyBhbiBhY3RpdmUgY2FsbCEgKi8KKworCS8qIHN1YnNjcmliZXIgaXMgZGV0YWNoZWQ6IHNob3VsZCB3ZSByZWxlYXNlIGxjaGFuPyAqLworCWxjaGFuX2F1dG9fcmVsZWFzZShtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X21tX3N0YXR1cyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERNTSwgIk1NIFNUQVRVUyAocmVqZWN0IGNhdXNlIDB4JTAyeClcbiIsIGdoLT5kYXRhWzBdKTsKKworCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIGEgR1NNIDA0LjA4IE1vYmlsaXR5IE1hbmFnZW1lbnQgKE1NKSBtZXNzYWdlICovCitzdGF0aWMgaW50IGdzbTA0MDhfcmN2X21tKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZ2gtPm1zZ190eXBlICYgMHhiZikgeworCWNhc2UgR1NNNDhfTVRfTU1fTE9DX1VQRF9SRVFVRVNUOgorCQlERUJVR1AoRE1NLCAiTE9DQVRJT04gVVBEQVRJTkcgUkVRVUVTVDogIik7CisJCXJjID0gbW1fcnhfbG9jX3VwZF9yZXEobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9JRF9SRVNQOgorCQlyYyA9IG1tX3J4X2lkX3Jlc3AobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9DTV9TRVJWX1JFUToKKwkJcmMgPSBnc200OF9yeF9tbV9zZXJ2X3JlcShtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX01NX1NUQVRVUzoKKwkJcmMgPSBnc200OF9yeF9tbV9zdGF0dXMobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9UTVNJX1JFQUxMX0NPTVBMOgorCQlERUJVR1AoRE1NLCAiVE1TSSBSZWFsbG9jYXRpb24gQ29tcGxldGVkLiBTdWJzY3JpYmVyOiAlc1xuIiwKKwkJICAgICAgIG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyID8KKwkJCQlzdWJzY3JfbmFtZShtc2ctPmxjaGFuLT5jb25uLnN1YnNjcikgOgorCQkJCSJ1bmtub3duIHN1YnNjcmliZXIiKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9JTVNJX0RFVEFDSF9JTkQ6CisJCXJjID0gZ3NtNDhfcnhfbW1faW1zaV9kZXRhY2hfaW5kKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fQ01fUkVFU1RfUkVROgorCQlERUJVR1AoRE1NLCAiQ00gUkVFU1RBQkxJU0ggUkVRVUVTVDogTm90IGltcGxlbWVudGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9BVVRIX1JFU1A6CisJCURFQlVHUChETU0sICJBVVRIRU5USUNBVElPTiBSRVNQT05TRTogTm90IGltcGxlbWVudGVkXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETU0sIExPR0xfTk9USUNFLCAiVW5rbm93biBHU00gMDQuMDggTU0gbXNnIHR5cGUgMHglMDJ4XG4iLAorCQkJZ2gtPm1zZ190eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBSZWNlaXZlIGEgUEFHSU5HIFJFU1BPTlNFIG1lc3NhZ2UgZnJvbSB0aGUgTVMgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfcGFnX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90ICpjbGFzc21hcmsyX2x2ID0gZ2gtPmRhdGEgKyAxOworCXVfaW50OF90IG1pX3R5cGU7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBOVUxMOworCWludCByYyA9IDA7CisKKwlnc200OF9wYWdpbmdfZXh0cmFjdF9taShtc2csIG1pX3N0cmluZywgJm1pX3R5cGUpOworCURFQlVHUChEUlIsICJQQUdJTkcgUkVTUE9OU0U6IG1pX3R5cGU9MHglMDJ4IE1JKCVzKVxuIiwKKwkJbWlfdHlwZSwgbWlfc3RyaW5nKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfVE1TSToKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV90bXNpKGJ0cy0+bmV0d29yaywKKwkJCQkJICAgIHRtc2lfZnJvbV9zdHJpbmcobWlfc3RyaW5nKSk7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKGJ0cy0+bmV0d29yaywgbWlfc3RyaW5nKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFzdWJzY3IpIHsKKwkJREVCVUdQKERSUiwgIjwtIENhbid0IGZpbmQgYW55IHN1YnNjcmliZXIgZm9yIHRoaXMgSURcbiIpOworCQkvKiBGSVhNRTogcmVxdWVzdCBpZD8gY2xvc2UgY2hhbm5lbD8gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCURFQlVHUChEUlIsICI8LSBDaGFubmVsIHdhcyByZXF1ZXN0ZWQgYnkgJXNcbiIsCisJCXN1YnNjci0+bmFtZSAmJiBzdHJsZW4oc3Vic2NyLT5uYW1lKSA/IHN1YnNjci0+bmFtZSA6IHN1YnNjci0+aW1zaSk7CisKKwlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyX2xlbiA9ICpjbGFzc21hcmsyX2x2OworCW1lbWNweShzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyLCBjbGFzc21hcmsyX2x2KzEsICpjbGFzc21hcmsyX2x2KTsKKwlkYl9zeW5jX2VxdWlwbWVudCgmc3Vic2NyLT5lcXVpcG1lbnQpOworCisJcmMgPSBnc200OF9oYW5kbGVfcGFnaW5nX3Jlc3AobXNnLCBzdWJzY3IpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnc200OF9yeF9ycl9jbGFzc21hcmsoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXVfaW50OF90IGNtMl9sZW4sIGNtM19sZW4gPSAwOworCXVfaW50OF90ICpjbTIsICpjbTMgPSBOVUxMOworCisJREVCVUdQKERSUiwgIkNMQVNTTUFSSyBDSEFOR0UgIik7CisKKwkvKiBjbGFzc21hcmsgMiAqLworCWNtMl9sZW4gPSBnaC0+ZGF0YVswXTsKKwljbTIgPSAmZ2gtPmRhdGFbMV07CisJREVCVUdQQyhEUlIsICJDTTIobGVuPSV1KSAiLCBjbTJfbGVuKTsKKworCWlmIChwYXlsb2FkX2xlbiA+IGNtMl9sZW4gKyAxKSB7CisJCS8qIHdlIG11c3QgaGF2ZSBhIGNsYXNzbWFyazMgKi8KKwkJaWYgKGdoLT5kYXRhW2NtMl9sZW4rMV0gIT0gMHgyMCkgeworCQkJREVCVUdQQyhEUlIsICJFUlIgQ00zIFRBR1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY20yX2xlbiA+IDMpIHsKKwkJCURFQlVHUEMoRFJSLCAiQ00yIHRvbyBsb25nIVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkKKwkJY20zX2xlbiA9IGdoLT5kYXRhW2NtMl9sZW4rMl07CisJCWNtMyA9ICZnaC0+ZGF0YVtjbTJfbGVuKzNdOworCQlpZiAoY20zX2xlbiA+IDE0KSB7CisJCQlERUJVR1BDKERSUiwgIkNNMyBsZW4gJXUgdG9vIGxvbmchXG4iLCBjbTNfbGVuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCURFQlVHUEMoRFJSLCAiQ00zKGxlbj0ldSlcbiIsIGNtM19sZW4pOworCX0KKwlpZiAoc3Vic2NyKSB7CisJCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazJfbGVuID0gY20yX2xlbjsKKwkJbWVtY3B5KHN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazIsIGNtMiwgY20yX2xlbik7CisJCWlmIChjbTMpIHsKKwkJCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazNfbGVuID0gY20zX2xlbjsKKwkJCW1lbWNweShzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmszLCBjbTMsIGNtM19sZW4pOworCQl9CisJCWRiX3N5bmNfZXF1aXBtZW50KCZzdWJzY3ItPmVxdWlwbWVudCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfc3RhdHVzKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisKKwlERUJVR1AoRFJSLCAiU1RBVFVTIHJyX2NhdXNlID0gJXNcbiIsCisJCXJyX2NhdXNlX25hbWUoZ2gtPmRhdGFbMF0pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX21lYXNfcmVwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tZWFzX3JlcCAqbWVhc19yZXAgPSBsY2hhbl9uZXh0X21lYXNfcmVwKG1zZy0+bGNoYW4pOworCisJLyogVGhpcyBzaG91bGRuJ3QgYWN0dWFsbHkgZW5kIHVwIGhlcmUsIGFzIFJTTCB0cmVhdHMKKwkgKiBMMyBJbmZvIG9mIDA4LjU4IE1FQVNVUkVNRU5UIFJFUE9SVCBkaWZmZXJlbnQgYnkgY2FsbGluZworCSAqIGRpcmVjdGx5IGludG8gZ3NtNDhfcGFyc2VfbWVhc19yZXAgKi8KKwlERUJVR1AoRE1FQVMsICJESVJFQ1QgR1NNNDggTUVBU1VSRU1FTlQgUkVQT1JUID8hPyAiKTsKKwlnc200OF9wYXJzZV9tZWFzX3JlcChtZWFzX3JlcCwgbXNnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX2FwcF9pbmZvKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgYXBkdV9pZF9mbGFnczsKKwl1X2ludDhfdCBhcGR1X2xlbjsKKwl1X2ludDhfdCAqYXBkdV9kYXRhOworCisJYXBkdV9pZF9mbGFncyA9IGdoLT5kYXRhWzBdOworCWFwZHVfbGVuID0gZ2gtPmRhdGFbMV07CisJYXBkdV9kYXRhID0gZ2gtPmRhdGErMjsKKwkKKwlERUJVR1AoRE5NLCAiUlggQVBQTElDQVRJT04gSU5GTyBpZC9mbGFncz0weCUwMnggYXBkdV9sZW49JXUgYXBkdT0lcyIsCisJCWFwZHVfaWRfZmxhZ3MsIGFwZHVfbGVuLCBoZXhkdW1wKGFwZHVfZGF0YSwgYXBkdV9sZW4pKTsKKworCXJldHVybiBkYl9hcGR1X2Jsb2Jfc3RvcmUobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IsIGFwZHVfaWRfZmxhZ3MsIGFwZHVfbGVuLCBhcGR1X2RhdGEpOworfQorCisvKiBDaGFwdGVyIDkuMS4xNiBIYW5kb3ZlciBjb21wbGV0ZSAqLworc3RhdGljIGludCBnc200OF9yeF9ycl9ob19jb21wbChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERSUiwgIkhBTkRPVkVSIENPTVBMRVRFIGNhdXNlID0gJXNcbiIsCisJCXJyX2NhdXNlX25hbWUoZ2gtPmRhdGFbMF0pKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9IQU5ET1ZFUl9DT01QTCwgbXNnLT5sY2hhbik7CisJLyogRklYTUU6IHJlbGVhc2Ugb2xkIGNoYW5uZWwgKi8KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDkuMS4xNyBIYW5kb3ZlciBGYWlsdXJlICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX2hvX2ZhaWwoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKworCURFQlVHUChEUlIsICJIQU5ET1ZFUiBGQUlMRUQgY2F1c2UgPSAlc1xuIiwKKwkJcnJfY2F1c2VfbmFtZShnaC0+ZGF0YVswXSkpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX0hBTkRPVkVSX0ZBSUwsIG1zZy0+bGNoYW4pOworCS8qIEZJWE1FOiByZWxlYXNlIGFsbG9jYXRlZCBuZXcgY2hhbm5lbCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlY2VpdmUgYSBHU00gMDQuMDggUmFkaW8gUmVzb3VyY2UgKFJSKSBtZXNzYWdlICovCitzdGF0aWMgaW50IGdzbTA0MDhfcmN2X3JyKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZ2gtPm1zZ190eXBlKSB7CisJY2FzZSBHU000OF9NVF9SUl9DTFNNX0NIRzoKKwkJcmMgPSBnc200OF9yeF9ycl9jbGFzc21hcmsobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9HUFJTX1NVU1BfUkVROgorCQlERUJVR1AoRFJSLCAiR1JQUyBTVVNQRU5EIFJFUVVFU1RcbiIpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX1BBR19SRVNQOgorCQlyYyA9IGdzbTQ4X3J4X3JyX3BhZ19yZXNwKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfQ0hBTl9NT0RFX01PRElGX0FDSzoKKwkJcmMgPSBnc200OF9yeF9ycl9tb2RpZl9hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9TVEFUVVM6CisJCXJjID0gZ3NtNDhfcnhfcnJfc3RhdHVzKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfTUVBU19SRVA6CisJCXJjID0gZ3NtNDhfcnhfcnJfbWVhc19yZXAobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9BUFBfSU5GTzoKKwkJcmMgPSBnc200OF9yeF9ycl9hcHBfaW5mbyhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0NJUEhfTV9DT01QTDoKKwkJREVCVUdQKERSUiwgIkNJUEhFUklORyBNT0RFIENPTVBMRVRFXG4iKTsKKwkJLyogRklYTUU6IGNoZWNrIGZvciBNSSAoaWYgYW55KSAqLworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0hBTkRPX0NPTVBMOgorCQlyYyA9IGdzbTQ4X3J4X3JyX2hvX2NvbXBsKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfSEFORE9fRkFJTDoKKwkJcmMgPSBnc200OF9yeF9ycl9ob19mYWlsKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJSLCBMT0dMX05PVElDRSwgIlVuaW1wbGVtZW50ZWQgIgorCQkJIkdTTSAwNC4wOCBSUiBtc2cgdHlwZSAweCUwMnhcbiIsIGdoLT5tc2dfdHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IGdzbTQ4X3NlbmRfcnJfYXBwX2luZm8oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFwZHVfaWQsCisJCQkgICB1X2ludDhfdCBhcGR1X2xlbiwgY29uc3QgdV9pbnQ4X3QgKmFwZHUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwkKKwlERUJVR1AoRFJSLCAiVFggQVBQTElDQVRJT04gSU5GTyBpZD0weCUwMngsIGxlbj0ldVxuIiwKKwkJYXBkdV9pZCwgYXBkdV9sZW4pOworCQorCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDIgKyBhcGR1X2xlbik7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfUlJfQVBQX0lORk87CisJZ2gtPmRhdGFbMF0gPSBhcGR1X2lkOworCWdoLT5kYXRhWzFdID0gYXBkdV9sZW47CisJbWVtY3B5KGdoLT5kYXRhKzIsIGFwZHUsIGFwZHVfbGVuKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIENhbGwgQ29udHJvbCAqLworCisvKiBUaGUgZW50aXJlIGNhbGwgY29udHJvbCBjb2RlIGlzIHdyaXR0ZW4gaW4gYWNjb3JkYW5jZSB3aXRoIEZpZ3VyZSA3LjEwYworICogZm9yICd2ZXJ5IGVhcmx5IGFzc2lnbm1lbnQnLCBpLmUuIHdlIGFsbG9jYXRlIGEgVENIL0YgZHVyaW5nIElNTUVESUFURQorICogQVNTSUdOLCB0aGVuIGZpcnN0IHVzZSB0aGF0IFRDSC9GIGZvciBzaWduYWxsaW5nIGFuZCBsYXRlciBNT0RFIE1PRElGWQorICogaXQgZm9yIHZvaWNlICovCisKK3N0YXRpYyB2b2lkIG5ld19jY19zdGF0ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgaW50IHN0YXRlKQoreworCWlmIChzdGF0ZSA+IDMxIHx8IHN0YXRlIDwgMCkKKwkJcmV0dXJuOworCisJREVCVUdQKERDQywgIm5ldyBzdGF0ZSAlcyAtPiAlc1xuIiwKKwkJZ3NtNDhfY2Nfc3RhdGVfbmFtZSh0cmFucy0+Y2Muc3RhdGUpLAorCQlnc200OF9jY19zdGF0ZV9uYW1lKHN0YXRlKSk7CisKKwl0cmFucy0+Y2Muc3RhdGUgPSBzdGF0ZTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zdGF0dXMoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJdV9pbnQ4X3QgKmNhdXNlLCAqY2FsbF9zdGF0ZTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NUQVRVUzsKKworCWNhdXNlID0gbXNnYl9wdXQobXNnLCAzKTsKKwljYXVzZVswXSA9IDI7CisJY2F1c2VbMV0gPSBHU000OF9DQVVTRV9DU19HU00gfCBHU000OF9DQVVTRV9MT0NfVVNFUjsKKwljYXVzZVsyXSA9IDB4ODAgfCAzMDsJLyogcmVzcG9uc2UgdG8gc3RhdHVzIGlucXVpcnkgKi8KKworCWNhbGxfc3RhdGUgPSBtc2diX3B1dChtc2csIDEpOworCWNhbGxfc3RhdGVbMF0gPSAweGMwIHwgMHgwMDsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3R4X3NpbXBsZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJCSAgIHVfaW50OF90IHBkaXNjLCB1X2ludDhfdCBtc2dfdHlwZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlnaC0+cHJvdG9fZGlzY3IgPSBwZGlzYzsKKwlnaC0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGdzbTQ4X3N0b3BfY2NfdGltZXIoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJaWYgKGJzY190aW1lcl9wZW5kaW5nKCZ0cmFucy0+Y2MudGltZXIpKSB7CisJCURFQlVHUChEQ0MsICJzdG9wcGluZyBwZW5kaW5nIHRpbWVyIFQleFxuIiwgdHJhbnMtPmNjLlRjdXJyZW50KTsKKwkJYnNjX2RlbF90aW1lcigmdHJhbnMtPmNjLnRpbWVyKTsKKwkJdHJhbnMtPmNjLlRjdXJyZW50ID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbW5jY19yZWN2bXNnKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCWludCBtc2dfdHlwZSwgc3RydWN0IGdzbV9tbmNjICptbmNjKQoreworCXN0cnVjdCBtc2diICptc2c7CisKKwlpZiAodHJhbnMpCisJCWlmICh0cmFucy0+Y29ubikKKwkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAleCBzdWIgJXMpICIKKwkJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLAorCQkJCXRyYW5zLT5jb25uLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwKKwkJCQl0cmFucy0+Y29ubi0+bGNoYW4tPnRzLT50cngtPm5yLAorCQkJCXRyYW5zLT5jb25uLT5sY2hhbi0+dHMtPm5yLCB0cmFucy0+dHJhbnNhY3Rpb25faWQsCisJCQkJKHRyYW5zLT5zdWJzY3IpPyh0cmFucy0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCWVsc2UKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLAorCQkJCSh0cmFucy0+c3Vic2NyKT8odHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCWVsc2UKKwkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAtKSAiCisJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLCBnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisKKwltbmNjLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCQorCW1zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBnc21fbW5jYyksICJNTkNDIik7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShtc2ctPmRhdGEsIG1uY2MsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltc2diX2VucXVldWUoJm5ldC0+dXBxdWV1ZSwgbXNnKTsKKworCXJldHVybiAwOworfQorCitpbnQgbW5jY19yZWxlYXNlX2luZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCSAgICAgdV9pbnQzMl90IGNhbGxyZWYsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCXN0cnVjdCBnc21fbW5jYyByZWw7CisKKwltZW1zZXQoJnJlbCwgMCwgc2l6ZW9mKHJlbCkpOworCXJlbC5jYWxscmVmID0gY2FsbHJlZjsKKwltbmNjX3NldF9jYXVzZSgmcmVsLCBsb2NhdGlvbiwgdmFsdWUpOworCXJldHVybiBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfSU5ELCAmcmVsKTsKK30KKworLyogQ2FsbCBDb250cm9sIFNwZWNpZmljIHRyYW5zYWN0aW9uIHJlbGVhc2UuCisgKiBnZXRzIGNhbGxlZCBieSB0cmFuc19mcmVlLCBETyBOT1QgQ0FMTCBZT1VSU0VMRiEgKi8KK3ZvaWQgX2dzbTQ4X2NjX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwkvKiBzZW5kIHJlbGVhc2UgdG8gTDQsIGlmIGNhbGxyZWYgc3RpbGwgZXhpc3RzICovCisJaWYgKHRyYW5zLT5jYWxscmVmKSB7CisJCS8qIFJlc3NvdXJjZSB1bmF2YWlsYWJsZSAqLworCQltbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJIEdTTTQ4X0NDX0NBVVNFX1JFU09VUkNFX1VOQVZBSUwpOworCX0KKwlpZiAodHJhbnMtPmNjLnN0YXRlICE9IEdTTV9DU1RBVEVfTlVMTCkKKwkJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX05VTEwpOworCWlmICh0cmFucy0+Y29ubikKKwkJdHJhdV9tdXhfdW5tYXAoJnRyYW5zLT5jb25uLT5sY2hhbi0+dHMtPmUxX2xpbmssIHRyYW5zLT5jYWxscmVmKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zZXR1cChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKTsKKworLyogY2FsbC1iYWNrIGZyb20gcGFnaW5nIHRoZSBCLWVuZCBvZiB0aGUgY29ubmVjdGlvbiAqLworc3RhdGljIGludCBzZXR1cF90cmlnX3BhZ19ldnQodW5zaWduZWQgaW50IGhvb2tudW0sIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICAgIHN0cnVjdCBtc2diICptc2csIHZvaWQgKl9sY2hhbiwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBfbGNoYW47CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBwYXJhbTsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc3QsICp0bXA7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQ7CisKKwlpZiAoaG9va251bSAhPSBHU01fSE9PS19SUl9QQUdJTkcpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzdWJzY3IpCisJCXJldHVybiAtRUlOVkFMOworCW5ldCA9IHN1YnNjci0+bmV0OworCWlmICghbmV0KSB7CisJCURFQlVHUChEQ0MsICJFcnJvciBOZXR3b3JrIG5vdCBzZXQhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2hlY2sgYWxsIHRyYW5hY3Rpb25zICh3aXRob3V0IGxjaGFuKSBmb3Igc3Vic2NyaWJlciAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHJhbnN0LCB0bXAsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFuc3QtPnN1YnNjciAhPSBzdWJzY3IgfHwgdHJhbnN0LT5jb25uKQorCQkJY29udGludWU7CisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBHU01fUEFHSU5HX1NVQ0NFRURFRDoKKwkJCWlmICghbGNoYW4pIC8vIHBhcmFub2lkCisJCQkJYnJlYWs7CisJCQlERUJVR1AoRENDLCAiUGFnaW5nIHN1YnNjciAlcyBzdWNjZWVkZWQhXG4iLAorCQkJCXN1YnNjci0+ZXh0ZW5zaW9uKTsKKwkJCS8qIEFzc2lnbiBsY2hhbiAqLworCQkJaWYgKCF0cmFuc3QtPmNvbm4pIHsKKwkJCQl0cmFuc3QtPmNvbm4gPSAmbGNoYW4tPmNvbm47CisJCQkJdXNlX3N1YnNjcl9jb24odHJhbnN0LT5jb25uKTsKKwkJCX0KKwkJCS8qIHNlbmQgU0VUVVAgcmVxdWVzdCB0byBjYWxsZWQgcGFydHkgKi8KKwkJCWdzbTQ4X2NjX3R4X3NldHVwKHRyYW5zdCwgJnRyYW5zdC0+Y2MubXNnKTsKKwkJCWJyZWFrOworCQljYXNlIEdTTV9QQUdJTkdfRVhQSVJFRDoKKwkJCURFQlVHUChEQ0MsICJQYWdpbmcgc3Vic2NyICVzIGV4cGlyZWQhXG4iLAorCQkJCXN1YnNjci0+ZXh0ZW5zaW9uKTsKKwkJCS8qIFRlbXBvcmFyaWx5IG91dCBvZiBvcmRlciAqLworCQkJbW5jY19yZWxlYXNlX2luZCh0cmFuc3QtPnN1YnNjci0+bmV0LCB0cmFuc3QsCisJCQkJCSB0cmFuc3QtPmNhbGxyZWYsCisJCQkJCSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCSBHU000OF9DQ19DQVVTRV9ERVNUX09PTyk7CisJCQl0cmFuc3QtPmNhbGxyZWYgPSAwOworCQkJdHJhbnNfZnJlZSh0cmFuc3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGNoX3JlY3ZfbW5jYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdV9pbnQzMl90IGNhbGxyZWYsIGludCBlbmFibGUpOworCisvKiBzb21lIG90aGVyIHBhcnQgb2YgdGhlIGNvZGUgc2VuZHMgdXMgYSBzaWduYWwgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX2FiaXNpcF9zaWduYWwodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCQkgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IHNpZ25hbF9kYXRhOworCWludCByYzsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKworCWlmIChzdWJzeXMgIT0gU1NfQUJJU0lQKQorCQlyZXR1cm4gMDsKKworCS8qIGluIGNhc2Ugd2UgdXNlIGRpcmVjdCBCVFMtdG8tQlRTIFJUUCAqLworCWlmIChpcGFjY19ydHBfZGlyZWN0KQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX0FCSVNJUF9DUkNYX0FDSzoKKwkJLyogY2hlY2sgaWYgYW55IHRyYW5zYWN0aW9ucyBvbiB0aGlzIGxjaGFuIHN0aWxsIGhhdmUKKwkJICogYSB0Y2hfcmVjdl9tbmNjIHJlcXVlc3QgcGVuZGluZyAqLworCQluZXQgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJCWlmICh0cmFucy0+Y29ubiAmJiB0cmFucy0+Y29ubi0+bGNoYW4gPT0gbGNoYW4gJiYgdHJhbnMtPnRjaF9yZWN2KSB7CisJCQkJREVCVUdQKERDQywgInBlbmRpbmcgdGNoX3JlY3ZfbW5jYyByZXF1ZXN0XG4iKTsKKwkJCQl0Y2hfcmVjdl9tbmNjKG5ldCwgdHJhbnMtPmNhbGxyZWYsIDEpOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBtYXAgdHdvIGlwYWNjZXNzIFJUUCBzdHJlYW1zIG9udG8gZWFjaCBvdGhlciAqLworc3RhdGljIGludCB0Y2hfbWFwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpyZW1vdGVfbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbV9idHMgKnJlbW90ZV9idHMgPSByZW1vdGVfbGNoYW4tPnRzLT50cngtPmJ0czsKKwlpbnQgcmM7CisKKwlERUJVR1AoRENDLCAiU2V0dGluZyB1cCBUQ0ggbWFwIGJldHdlZW4gKGJ0cz0ldSx0cng9JXUsdHM9JXUpIGFuZCAoYnRzPSV1LHRyeD0ldSx0cz0ldSlcbiIsCisJCWJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKKwkJcmVtb3RlX2J0cy0+bnIsIHJlbW90ZV9sY2hhbi0+dHMtPnRyeC0+bnIsIHJlbW90ZV9sY2hhbi0+dHMtPm5yKTsKKworCWlmIChidHMtPnR5cGUgIT0gcmVtb3RlX2J0cy0+dHlwZSkgeworCQlERUJVR1AoRENDLCAiQ2Fubm90IHN3aXRjaCBjYWxscyBiZXR3ZWVuIGRpZmZlcmVudCBCVFMgdHlwZXMgeWV0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLy8gdG9kbzogbWFwIGJldHdlZW4gZGlmZmVyZW50IGJ0cyB0eXBlcworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJaWYgKCFpcGFjY19ydHBfZGlyZWN0KSB7CisJCQkvKiBjb25uZWN0IHRoZSBUQ0gncyB0byBvdXIgUlRQIHByb3h5ICovCisJCQlyYyA9IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2sobGNoYW4pOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCQlyYyA9IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2socmVtb3RlX2xjaGFuKTsKKyN3YXJuaW5nIGRvIHdlIG5lZWQgYSBjaGVjayBvZiByYyBoZXJlPworCisJCQkvKiBjb25uZWN0IHRoZW0gd2l0aCBlYWNoIG90aGVyICovCisJCQlydHBfc29ja2V0X3Byb3h5KGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJCSByZW1vdGVfbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCk7CisJCX0gZWxzZSB7CisJCQkvKiBkaXJlY3RseSBjb25uZWN0IFRDSCBSVFAgc3RyZWFtcyB0byBlYWNoIG90aGVyICovCisJCQlyYyA9IHJzbF9pcGFjY19tZGN4KGxjaGFuLCByZW1vdGVfbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJCQlyZW1vdGVfbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCwKKwkJCQkJCXJlbW90ZV9sY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCQlyYyA9IHJzbF9pcGFjY19tZGN4KHJlbW90ZV9sY2hhbiwgbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJCQlsY2hhbi0+YWJpc19pcC5ib3VuZF9wb3J0LAorCQkJCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQl0cmF1X211eF9tYXBfbGNoYW4obGNoYW4sIHJlbW90ZV9sY2hhbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChEQ0MsICJVbmtub3duIEJUUyB0eXBlICV1XG4iLCBidHMtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogYnJpZGdlIGNoYW5uZWxzIG9mIHR3byB0cmFuc2FjdGlvbnMgKi8KK3N0YXRpYyBpbnQgdGNoX2JyaWRnZShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdV9pbnQzMl90ICpyZWZzKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zMSA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIHJlZnNbMF0pOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zMiA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIHJlZnNbMV0pOworCisJaWYgKCF0cmFuczEgfHwgIXRyYW5zMikKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIXRyYW5zMS0+Y29ubiB8fCAhdHJhbnMyLT5jb25uKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHRocm91Z2gtY29ubmVjdCBjaGFubmVsICovCisJcmV0dXJuIHRjaF9tYXAodHJhbnMxLT5jb25uLT5sY2hhbiwgdHJhbnMyLT5jb25uLT5sY2hhbik7Cit9CisKKy8qIGVuYWJsZSByZWNlaXZlIG9mIGNoYW5uZWxzIHRvIE1OQ0MgdXBxdWV1ZSAqLworc3RhdGljIGludCB0Y2hfcmVjdl9tbmNjKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1X2ludDMyX3QgY2FsbHJlZiwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWludCByYzsKKworCS8qIEZpbmQgY2FsbHJlZiAqLworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9jYWxscmVmKG5ldCwgY2FsbHJlZik7CisJaWYgKCF0cmFucykKKwkJcmV0dXJuIC1FSU87CisJaWYgKCF0cmFucy0+Y29ubikKKwkJcmV0dXJuIDA7CisJbGNoYW4gPSB0cmFucy0+Y29ubi0+bGNoYW47CisJYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJaWYgKGlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJCURFQlVHUChEQ0MsICJFcnJvcjogUlRQIHByb3h5IGlzIGRpc2FibGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIGluIGNhc2UsIHdlIGRvbid0IGhhdmUgYSBSVFAgc29ja2V0IHlldCwgd2Ugbm90ZSB0aGlzCisJCSAqIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgdHJ5IGxhdGVyICovCisJCWlmICghbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkgeworCQkJdHJhbnMtPnRjaF9yZWN2ID0gZW5hYmxlOworCQkJREVCVUdQKERDQywgInF1ZXVlIHRjaF9yZWN2X21uY2MgcmVxdWVzdCAoJWQpXG4iLCBlbmFibGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGVuYWJsZSkgeworCQkJLyogY29ubmVjdCB0aGUgVENIJ3MgdG8gb3VyIFJUUCBwcm94eSAqLworCQkJcmMgPSByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKGxjaGFuKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQkJLyogYXNzaWduIHNvY2tldCB0byBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgKi8KKwkJCXJ0cF9zb2NrZXRfdXBzdHJlYW0obGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwKKwkJCQluZXQsIGNhbGxyZWYpOworCQl9IGVsc2UKKwkJCXJ0cF9zb2NrZXRfdXBzdHJlYW0obGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwKKwkJCQluZXQsIDApOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlpZiAoZW5hYmxlKQorCQkJcmV0dXJuIHRyYXVfcmVjdl9sY2hhbihsY2hhbiwgY2FsbHJlZik7CisJCXJldHVybiB0cmF1X211eF91bm1hcChOVUxMLCBjYWxscmVmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERDQywgIlVua25vd24gQlRTIHR5cGUgJXVcbiIsIGJ0cy0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3N0YXR1c19lbnEoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJREVCVUdQKERDQywgIi0+IFNUQVRVUyBFTlFcbiIpOworCXJldHVybiBnc200OF9jY190eF9zdGF0dXModHJhbnMsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcmVsZWFzZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKTsKKworc3RhdGljIHZvaWQgZ3NtNDhfY2NfdGltZW91dCh2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnMgPSBhcmc7CisJaW50IGRpc2Nvbm5lY3QgPSAwLCByZWxlYXNlID0gMDsKKwlpbnQgbW9fY2F1c2UgPSBHU000OF9DQ19DQVVTRV9SRUNPVkVSWV9USU1FUjsKKwlpbnQgbW9fbG9jYXRpb24gPSBHU000OF9DQVVTRV9MT0NfVVNFUjsKKwlpbnQgbDRfY2F1c2UgPSBHU000OF9DQ19DQVVTRV9OT1JNQUxfVU5TUEVDOworCWludCBsNF9sb2NhdGlvbiA9IEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVTsKKwlzdHJ1Y3QgZ3NtX21uY2MgbW9fcmVsLCBsNF9yZWw7CisKKwltZW1zZXQoJm1vX3JlbCwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vX3JlbC5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJbWVtc2V0KCZsNF9yZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlsNF9yZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCisJc3dpdGNoKHRyYW5zLT5jYy5UY3VycmVudCkgeworCWNhc2UgMHgzMDM6CisJCXJlbGVhc2UgPSAxOworCQlsNF9jYXVzZSA9IEdTTTQ4X0NDX0NBVVNFX1VTRVJfTk9UUkVTUE9ORDsKKwkJYnJlYWs7CisJY2FzZSAweDMxMDoKKwkJZGlzY29ubmVjdCA9IDE7CisJCWw0X2NhdXNlID0gR1NNNDhfQ0NfQ0FVU0VfVVNFUl9OT1RSRVNQT05EOworCQlicmVhazsKKwljYXNlIDB4MzEzOgorCQlkaXNjb25uZWN0ID0gMTsKKwkJLyogdW5rbm93biwgZGlkIG5vdCBmaW5kIGl0IGluIHRoZSBzcGVjcyAqLworCQlicmVhazsKKwljYXNlIDB4MzAxOgorCQlkaXNjb25uZWN0ID0gMTsKKwkJbDRfY2F1c2UgPSBHU000OF9DQ19DQVVTRV9VU0VSX05PVFJFU1BPTkQ7CisJCWJyZWFrOworCWNhc2UgMHgzMDg6CisJCWlmICghdHJhbnMtPmNjLlQzMDhfc2Vjb25kKSB7CisJCQkvKiByZXN0YXJ0IFQzMDggYSBzZWNvbmQgdGltZSAqLworCQkJZ3NtNDhfY2NfdHhfcmVsZWFzZSh0cmFucywgJnRyYW5zLT5jYy5tc2cpOworCQkJdHJhbnMtPmNjLlQzMDhfc2Vjb25kID0gMTsKKwkJCWJyZWFrOyAvKiBzdGF5IGluIHJlbGVhc2Ugc3RhdGUgKi8KKwkJfQorCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuOworLy8JCXJlbGVhc2UgPSAxOworLy8JCWw0X2NhdXNlID0gMTQ7CisvLwkJYnJlYWs7CisJY2FzZSAweDMwNjoKKwkJcmVsZWFzZSA9IDE7CisJCW1vX2NhdXNlID0gdHJhbnMtPmNjLm1zZy5jYXVzZS52YWx1ZTsKKwkJbW9fbG9jYXRpb24gPSB0cmFucy0+Y2MubXNnLmNhdXNlLmxvY2F0aW9uOworCQlicmVhazsKKwljYXNlIDB4MzIzOgorCQlkaXNjb25uZWN0ID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVsZWFzZSA9IDE7CisJfQorCisJaWYgKHJlbGVhc2UgJiYgdHJhbnMtPmNhbGxyZWYpIHsKKwkJLyogcHJvY2VzcyByZWxlYXNlIHRvd2FyZHMgbGF5ZXIgNCAqLworCQltbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSBsNF9sb2NhdGlvbiwgbDRfY2F1c2UpOworCQl0cmFucy0+Y2FsbHJlZiA9IDA7CisJfQorCisJaWYgKGRpc2Nvbm5lY3QgJiYgdHJhbnMtPmNhbGxyZWYpIHsKKwkJLyogcHJvY2VzcyBkaXNjb25uZWN0IHRvd2FyZHMgbGF5ZXIgNCAqLworCQltbmNjX3NldF9jYXVzZSgmbDRfcmVsLCBsNF9sb2NhdGlvbiwgbDRfY2F1c2UpOworCQltbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19ESVNDX0lORCwgJmw0X3JlbCk7CisJfQorCisJLyogcHJvY2VzcyBkaXNjb25uZWN0IHRvd2FyZHMgbW9iaWxlIHN0YXRpb24gKi8KKwlpZiAoZGlzY29ubmVjdCB8fCByZWxlYXNlKSB7CisJCW1uY2Nfc2V0X2NhdXNlKCZtb19yZWwsIG1vX2xvY2F0aW9uLCBtb19jYXVzZSk7CisJCW1vX3JlbC5jYXVzZS5kaWFnWzBdID0gKCh0cmFucy0+Y2MuVGN1cnJlbnQgJiAweGYwMCkgPj4gOCkgKyAnMCc7CisJCW1vX3JlbC5jYXVzZS5kaWFnWzFdID0gKCh0cmFucy0+Y2MuVGN1cnJlbnQgJiAweDBmMCkgPj4gNCkgKyAnMCc7CisJCW1vX3JlbC5jYXVzZS5kaWFnWzJdID0gKHRyYW5zLT5jYy5UY3VycmVudCAmIDB4MDBmKSArICcwJzsKKwkJbW9fcmVsLmNhdXNlLmRpYWdfbGVuID0gMzsKKworCQlpZiAoZGlzY29ubmVjdCkKKwkJCWdzbTQ4X2NjX3R4X2Rpc2Nvbm5lY3QodHJhbnMsICZtb19yZWwpOworCQlpZiAocmVsZWFzZSkKKwkJCWdzbTQ4X2NjX3R4X3JlbGVhc2UodHJhbnMsICZtb19yZWwpOworCX0KKworfQorCitzdGF0aWMgdm9pZCBnc200OF9zdGFydF9jY190aW1lcihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgaW50IGN1cnJlbnQsCisJCQkJIGludCBzZWMsIGludCBtaWNybykKK3sKKwlERUJVR1AoRENDLCAic3RhcnRpbmcgdGltZXIgVCV4IHdpdGggJWQgc2Vjb25kc1xuIiwgY3VycmVudCwgc2VjKTsKKwl0cmFucy0+Y2MudGltZXIuY2IgPSBnc200OF9jY190aW1lb3V0OworCXRyYW5zLT5jYy50aW1lci5kYXRhID0gdHJhbnM7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZ0cmFucy0+Y2MudGltZXIsIHNlYywgbWljcm8pOworCXRyYW5zLT5jYy5UY3VycmVudCA9IGN1cnJlbnQ7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2Nfcnhfc2V0dXAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSBnaC0+bXNnX3R5cGUgJiAweGJmOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBzZXR1cDsKKworCW1lbXNldCgmc2V0dXAsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlzZXR1cC5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgMCwgMCk7CisJLyogZW1lcmdlbmN5IHNldHVwIGlzIGlkZW50aWZpZWQgYnkgbXNnX3R5cGUgKi8KKwlpZiAobXNnX3R5cGUgPT0gR1NNNDhfTVRfQ0NfRU1FUkdfU0VUVVApCisJCXNldHVwLmVtZXJnZW5jeSA9IDE7CisKKwkvKiB1c2Ugc3Vic2NyaWJlciBhcyBjYWxsaW5nIHBhcnR5IG51bWJlciAqLworCWlmICh0cmFucy0+c3Vic2NyKSB7CisJCXNldHVwLmZpZWxkcyB8PSBNTkNDX0ZfQ0FMTElORzsKKwkJc3RybmNweShzZXR1cC5jYWxsaW5nLm51bWJlciwgdHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJc2l6ZW9mKHNldHVwLmNhbGxpbmcubnVtYmVyKS0xKTsKKwkJc3RybmNweShzZXR1cC5pbXNpLCB0cmFucy0+c3Vic2NyLT5pbXNpLAorCQkJc2l6ZW9mKHNldHVwLmltc2kpLTEpOworCX0KKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0JFQVJFUl9DQVA7CisJCWdzbTQ4X2RlY29kZV9iZWFyZXJfY2FwKCZzZXR1cC5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisJLyogZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpKSB7CisJCXNldHVwLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmc2V0dXAuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCS8qIGNhbGxlZCBwYXJ0eSBiY2QgbnVtYmVyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBTExFRF9CQ0QpKSB7CisJCXNldHVwLmZpZWxkcyB8PSBNTkNDX0ZfQ0FMTEVEOworCQlnc200OF9kZWNvZGVfY2FsbGVkKCZzZXR1cC5jYWxsZWQsCisJCQkgICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0NBTExFRF9CQ0QpLTEpOworCX0KKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX1VTRVJVU0VSOworCQlnc200OF9kZWNvZGVfdXNlcnVzZXIoJnNldHVwLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmc2V0dXAuc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKwkvKiBDTElSIHN1cHByZXNzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NMSVJfU1VQUCkpCisJCXNldHVwLmNsaXIuc3VwID0gMTsKKwkvKiBDTElSIGludm9jYXRpb24gKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0xJUl9JTlZPQykpCisJCXNldHVwLmNsaXIuaW52ID0gMTsKKwkvKiBjYyBjYXAgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0NfQ0FQKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0NDQ0FQOworCQlnc200OF9kZWNvZGVfY2NjYXAoJnNldHVwLmNjY2FwLAorCQkJICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0NDX0NBUCktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0lOSVRJQVRFRCk7CisKKwlMT0dQKERDQywgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlcyAoJXMpIHNlbmRzIFNFVFVQIHRvICVzXG4iLAorCSAgICAgc3Vic2NyX25hbWUodHJhbnMtPnN1YnNjciksIHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbiwKKwkgICAgIHNldHVwLmNhbGxlZC5udW1iZXIpOworCisJLyogaW5kaWNhdGUgc2V0dXAgdG8gTU5DQyAqLworCW1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1NFVFVQX0lORCwgJnNldHVwKTsKKworCS8qIE1OQ0MgY29kZSB3aWxsIG1vZGlmeSB0aGUgY2hhbm5lbCBhc3luY2hyb25vdXNseSwgd2Ugc2hvdWxkCisJICogaXBhY2Nlc3MtYmluZCBvbmx5IGFmdGVyIHRoZSBtb2RpZmljYXRpb24gaGFzIGJlZW4gbWFkZSB0byB0aGUKKwkgKiBsY2hhbi0+dGNoX21vZGUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zZXR1cChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJc3RydWN0IGdzbV9tbmNjICpzZXR1cCA9IGFyZzsKKwlpbnQgcmMsIHRyYW5zX2lkOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCS8qIHRyYW5zYWN0aW9uIGlkIG11c3Qgbm90IGJlIGFzc2lnbmVkICovCisJaWYgKHRyYW5zLT50cmFuc2FjdGlvbl9pZCAhPSAweGZmKSB7IC8qIHVuYXNzc2lnbmVkICovCisJCURFQlVHUChEQ0MsICJUWCBTZXR1cCB3aXRoIGFzc2lnbmVkIHRyYW5zYWN0aW9uLiAiCisJCQkiVGhpcyBpcyBub3QgYWxsb3dlZCFcbiIpOworCQkvKiBUZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIgKi8KKwkJcmMgPSBtbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSAgICAgIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkgICAgICBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuIHJjOworCX0KKwkKKwkvKiBHZXQgZnJlZSB0cmFuc2FjdGlvbl9pZCAqLworCXRyYW5zX2lkID0gdHJhbnNfYXNzaWduX3RyYW5zX2lkKHRyYW5zLT5zdWJzY3IsIEdTTTQ4X1BESVNDX0NDLCAwKTsKKwlpZiAodHJhbnNfaWQgPCAwKSB7CisJCS8qIG5vIGZyZWUgdHJhbnNhY3Rpb24gSUQgKi8KKwkJcmMgPSBtbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSAgICAgIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkgICAgICBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuIHJjOworCX0KKwl0cmFucy0+dHJhbnNhY3Rpb25faWQgPSB0cmFuc19pZDsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NFVFVQOworCisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzAzLCBHU000OF9UMzAzKTsKKworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfQkVBUkVSX0NBUCkKKwkJZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAobXNnLCAwLCAmc2V0dXAtPmJlYXJlcl9jYXApOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfRkFDSUxJVFkpCisJCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDAsICZzZXR1cC0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZzZXR1cC0+cHJvZ3Jlc3MpOworCS8qIGNhbGxpbmcgcGFydHkgQkNEIG51bWJlciAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX0NBTExJTkcpCisJCWdzbTQ4X2VuY29kZV9jYWxsaW5nKG1zZywgJnNldHVwLT5jYWxsaW5nKTsKKwkvKiBjYWxsZWQgcGFydHkgQkNEIG51bWJlciAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX0NBTExFRCkKKwkJZ3NtNDhfZW5jb2RlX2NhbGxlZChtc2csICZzZXR1cC0+Y2FsbGVkKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJnNldHVwLT51c2VydXNlcik7CisJLyogcmVkaXJlY3RpbmcgcGFydHkgQkNEIG51bWJlciAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX1JFRElSRUNUSU5HKQorCQlnc200OF9lbmNvZGVfcmVkaXJlY3RpbmcobXNnLCAmc2V0dXAtPnJlZGlyZWN0aW5nKTsKKwkvKiBzaWduYWwgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9TSUdOQUwpCisJCWdzbTQ4X2VuY29kZV9zaWduYWwobXNnLCBzZXR1cC0+c2lnbmFsKTsKKwkKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2NhbGxfY29uZihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgY2FsbF9jb25mOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzEwLCBHU000OF9UMzEwKTsKKworCW1lbXNldCgmY2FsbF9jb25mLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJY2FsbF9jb25mLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKyNpZiAwCisJLyogcmVwZWF0ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1JFUEVBVF9DSVIpKQorCQljYWxsX2NvbmYucmVwZWF0ID0gMTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfUkVQRUFUX1NFUSkpCisJCWNhbGxfY29uZi5yZXBlYXQgPSAyOworI2VuZGlmCisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCkpIHsKKwkJY2FsbF9jb25mLmZpZWxkcyB8PSBNTkNDX0ZfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJmNhbGxfY29uZi5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisJLyogY2F1c2UgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpKSB7CisJCWNhbGxfY29uZi5maWVsZHMgfD0gTU5DQ19GX0NBVVNFOworCQlnc200OF9kZWNvZGVfY2F1c2UoJmNhbGxfY29uZi5jYXVzZSwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQVVTRSktMSk7CisJfQorCS8qIGNjIGNhcCAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DQ19DQVApKSB7CisJCWNhbGxfY29uZi5maWVsZHMgfD0gTU5DQ19GX0NDQ0FQOworCQlnc200OF9kZWNvZGVfY2NjYXAoJmNhbGxfY29uZi5jY2NhcCwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQ19DQVApLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORik7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfQ0FMTF9DT05GX0lORCwKKwkJCSAgICAmY2FsbF9jb25mKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9jYWxsX3Byb2Moc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnByb2NlZWRpbmcgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfQ0FMTF9QUk9DOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX01PX0NBTExfUFJPQyk7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChwcm9jZWVkaW5nLT5maWVsZHMgJiBNTkNDX0ZfQkVBUkVSX0NBUCkKKwkJZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAobXNnLCAwLCAmcHJvY2VlZGluZy0+YmVhcmVyX2NhcCk7CisJLyogZmFjaWxpdHkgKi8KKwlpZiAocHJvY2VlZGluZy0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmcHJvY2VlZGluZy0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKHByb2NlZWRpbmctPmZpZWxkcyAmIE1OQ0NfRl9QUk9HUkVTUykKKwkJZ3NtNDhfZW5jb2RlX3Byb2dyZXNzKG1zZywgMCwgJnByb2NlZWRpbmctPnByb2dyZXNzKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2FsZXJ0aW5nKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBhbGVydGluZzsKKwkKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKwlnc200OF9zdGFydF9jY190aW1lcih0cmFucywgMHgzMDEsIEdTTTQ4X1QzMDEpOworCisJbWVtc2V0KCZhbGVydGluZywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWFsZXJ0aW5nLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJYWxlcnRpbmcuZmllbGRzIHw9IE1OQ0NfRl9GQUNJTElUWTsKKwkJZ3NtNDhfZGVjb2RlX2ZhY2lsaXR5KCZhbGVydGluZy5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisKKwkvKiBwcm9ncmVzcyAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9QUk9HUl9JTkQpKSB7CisJCWFsZXJ0aW5nLmZpZWxkcyB8PSBNTkNDX0ZfUFJPR1JFU1M7CisJCWdzbTQ4X2RlY29kZV9wcm9ncmVzcygmYWxlcnRpbmcucHJvZ3Jlc3MsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9QUk9HUl9JTkQpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWFsZXJ0aW5nLmZpZWxkcyB8PSBNTkNDX0ZfU1NWRVJTSU9OOworCQlnc200OF9kZWNvZGVfc3N2ZXJzaW9uKCZhbGVydGluZy5zc3ZlcnNpb24sCisJCQkJIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUyktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0NBTExfUkVDRUlWRUQpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX0FMRVJUX0lORCwKKwkJCSAgICAmYWxlcnRpbmcpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2FsZXJ0aW5nKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICphbGVydGluZyA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19BTEVSVElORzsKKworCS8qIGZhY2lsaXR5ICovCisJaWYgKGFsZXJ0aW5nLT5maWVsZHMgJiBNTkNDX0ZfRkFDSUxJVFkpCisJCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDAsICZhbGVydGluZy0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKGFsZXJ0aW5nLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZhbGVydGluZy0+cHJvZ3Jlc3MpOworCS8qIHVzZXItdXNlciAqLworCWlmIChhbGVydGluZy0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmYWxlcnRpbmctPnVzZXJ1c2VyKTsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9DQUxMX0RFTElWRVJFRCk7CisJCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcHJvZ3Jlc3Moc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnByb2dyZXNzID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1BST0dSRVNTOworCisJLyogcHJvZ3Jlc3MgKi8KKwlnc200OF9lbmNvZGVfcHJvZ3Jlc3MobXNnLCAxLCAmcHJvZ3Jlc3MtPnByb2dyZXNzKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAocHJvZ3Jlc3MtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJnByb2dyZXNzLT51c2VydXNlcik7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9jb25uZWN0KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpjb25uZWN0ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0NPTk5FQ1Q7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKwlnc200OF9zdGFydF9jY190aW1lcih0cmFucywgMHgzMTMsIEdTTTQ4X1QzMTMpOworCisJLyogZmFjaWxpdHkgKi8KKwlpZiAoY29ubmVjdC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmY29ubmVjdC0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKGNvbm5lY3QtPmZpZWxkcyAmIE1OQ0NfRl9QUk9HUkVTUykKKwkJZ3NtNDhfZW5jb2RlX3Byb2dyZXNzKG1zZywgMCwgJmNvbm5lY3QtPnByb2dyZXNzKTsKKwkvKiBjb25uZWN0ZWQgbnVtYmVyICovCisJaWYgKGNvbm5lY3QtPmZpZWxkcyAmIE1OQ0NfRl9DT05ORUNURUQpCisJCWdzbTQ4X2VuY29kZV9jb25uZWN0ZWQobXNnLCAmY29ubmVjdC0+Y29ubmVjdGVkKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoY29ubmVjdC0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmY29ubmVjdC0+dXNlcnVzZXIpOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0NPTk5FQ1RfSU5EKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2Nvbm5lY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIGNvbm5lY3Q7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKworCW1lbXNldCgmY29ubmVjdCwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWNvbm5lY3QuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIHVzZSBzdWJzY3JpYmVyIGFzIGNvbm5lY3RlZCBwYXJ0eSBudW1iZXIgKi8KKwlpZiAodHJhbnMtPnN1YnNjcikgeworCQljb25uZWN0LmZpZWxkcyB8PSBNTkNDX0ZfQ09OTkVDVEVEOworCQlzdHJuY3B5KGNvbm5lY3QuY29ubmVjdGVkLm51bWJlciwgdHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJc2l6ZW9mKGNvbm5lY3QuY29ubmVjdGVkLm51bWJlciktMSk7CisJCXN0cm5jcHkoY29ubmVjdC5pbXNpLCB0cmFucy0+c3Vic2NyLT5pbXNpLAorCQkJc2l6ZW9mKGNvbm5lY3QuaW1zaSktMSk7CisJfQorCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQljb25uZWN0LmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmY29ubmVjdC5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJY29ubmVjdC5maWVsZHMgfD0gTU5DQ19GX1VTRVJVU0VSOworCQlnc200OF9kZWNvZGVfdXNlcnVzZXIoJmNvbm5lY3QudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWNvbm5lY3QuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJmNvbm5lY3Quc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9DT05ORUNUX1JFUVVFU1QpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1NFVFVQX0NORiwgJmNvbm5lY3QpOworfQorCisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfY29ubmVjdF9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIGNvbm5lY3RfYWNrOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKKwkKKwltZW1zZXQoJmNvbm5lY3RfYWNrLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJY29ubmVjdF9hY2suY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19TRVRVUF9DT01QTF9JTkQsCisJCQkgICAgJmNvbm5lY3RfYWNrKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9jb25uZWN0X2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0NPTk5FQ1RfQUNLOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9kaXNjb25uZWN0KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBkaXNjOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfRElTQ09OTkVDVF9SRVEpOworCisJbWVtc2V0KCZkaXNjLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJZGlzYy5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQ0FVU0UsIDApOworCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQlkaXNjLmZpZWxkcyB8PSBNTkNDX0ZfQ0FVU0U7CisJCWdzbTQ4X2RlY29kZV9jYXVzZSgmZGlzYy5jYXVzZSwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQVVTRSktMSk7CisJfQorCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQlkaXNjLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmZGlzYy5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJZGlzYy5maWVsZHMgfD0gTU5DQ19GX1VTRVJVU0VSOworCQlnc200OF9kZWNvZGVfdXNlcnVzZXIoJmRpc2MudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWRpc2MuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJmRpc2Muc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19ESVNDX0lORCwgJmRpc2MpOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX21uY2NfY2F1c2UgZGVmYXVsdF9jYXVzZSA9IHsKKwkubG9jYXRpb24JPSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJLmNvZGluZwkJPSAwLAorCS5yZWMJCT0gMCwKKwkucmVjX3ZhbAk9IDAsCisJLnZhbHVlCQk9IEdTTTQ4X0NDX0NBVVNFX05PUk1BTF9VTlNQRUMsCisJLmRpYWdfbGVuCT0gMCwKKwkuZGlhZwkJPSB7IDAgfSwKK307CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZGlzYyA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19ESVNDT05ORUNUOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzA2LCBHU000OF9UMzA2KTsKKworCS8qIGNhdXNlICovCisJaWYgKGRpc2MtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmRpc2MtPmNhdXNlKTsKKwllbHNlCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkZWZhdWx0X2NhdXNlKTsKKworCS8qIGZhY2lsaXR5ICovCisJaWYgKGRpc2MtPmZpZWxkcyAmIE1OQ0NfRl9GQUNJTElUWSkKKwkJZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KG1zZywgMCwgJmRpc2MtPmZhY2lsaXR5KTsKKwkvKiBwcm9ncmVzcyAqLworCWlmIChkaXNjLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZkaXNjLT5wcm9ncmVzcyk7CisJLyogdXNlci11c2VyICovCisJaWYgKGRpc2MtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJmRpc2MtPnVzZXJ1c2VyKTsKKworCS8qIHN0b3JlIGRpc2Nvbm5lY3QgY2F1c2UgZm9yIFQzMDYgZXhwaXJ5ICovCisJbWVtY3B5KCZ0cmFucy0+Y2MubXNnLCBkaXNjLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfRElTQ09OTkVDVF9JTkQpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfcmVsZWFzZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgcmVsOworCWludCByYzsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlyZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwkJZ3NtNDhfZGVjb2RlX2NhdXNlKCZyZWwuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmcmVsLmZhY2lsaXR5LAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpLTEpOworCX0KKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZyZWwudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCXJlbC5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmcmVsLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwlpZiAodHJhbnMtPmNjLnN0YXRlID09IEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpIHsKKwkJLyogcmVsZWFzZSBjb2xsaXNpb24gNS40LjUgKi8KKwkJcmMgPSBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19SRUxfQ05GLCAmcmVsKTsKKwl9IGVsc2UgeworCQlyYyA9IGdzbTQ4X3R4X3NpbXBsZShtc2ctPmxjaGFuLAorCQkJCSAgICAgR1NNNDhfUERJU0NfQ0MgfCAodHJhbnMtPnRyYW5zYWN0aW9uX2lkIDw8IDQpLAorCQkJCSAgICAgR1NNNDhfTVRfQ0NfUkVMRUFTRV9DT01QTCk7CisJCXJjID0gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfUkVMX0lORCwgJnJlbCk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX05VTEwpOworCisJdHJhbnMtPmNhbGxyZWYgPSAwOworCXRyYW5zX2ZyZWUodHJhbnMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JlbGVhc2Uoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnJlbCA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRUxFQVNFOworCisJdHJhbnMtPmNhbGxyZWYgPSAwOworCQorCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMwOCwgR1NNNDhfVDMwOCk7CisKKwkvKiBjYXVzZSAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMCwgJnJlbC0+Y2F1c2UpOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmcmVsLT5mYWNpbGl0eSk7CisJLyogdXNlci11c2VyICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmcmVsLT51c2VydXNlcik7CisKKwl0cmFucy0+Y2MuVDMwOF9zZWNvbmQgPSAwOworCW1lbWNweSgmdHJhbnMtPmNjLm1zZywgcmVsLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisKKwlpZiAodHJhbnMtPmNjLnN0YXRlICE9IEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpCisJCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9SRUxFQVNFX1JFUSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9yZWxlYXNlX2NvbXBsKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyByZWw7CisJaW50IHJjID0gMDsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlyZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwkJZ3NtNDhfZGVjb2RlX2NhdXNlKCZyZWwuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmcmVsLmZhY2lsaXR5LAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpLTEpOworCX0KKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZyZWwudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCXJlbC5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmcmVsLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwlpZiAodHJhbnMtPmNhbGxyZWYpIHsKKwkJc3dpdGNoICh0cmFucy0+Y2Muc3RhdGUpIHsKKwkJY2FzZSBHU01fQ1NUQVRFX0NBTExfUFJFU0VOVDoKKwkJCXJjID0gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsCisJCQkJCSAgTU5DQ19SRUpfSU5ELCAmcmVsKTsKKwkJCWJyZWFrOworCQljYXNlIEdTTV9DU1RBVEVfUkVMRUFTRV9SRVE6CisJCQlyYyA9IG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLAorCQkJCQkgIE1OQ0NfUkVMX0NORiwgJnJlbCk7CisJCQkvKiBGSVhNRTogaW4gY2FzZSBvZiBtdWx0aXBsZSBjYWxscywgd2UgY2FuJ3Qgc2ltcGx5CisJCQkgKiBoYW5nIHVwIGhlcmUgISAqLworCQkJbGNoYW5fYXV0b19yZWxlYXNlKG1zZy0+bGNoYW4pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyYyA9IG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLAorCQkJCQkgIE1OQ0NfUkVMX0lORCwgJnJlbCk7CisJCX0KKwl9CisKKwl0cmFucy0+Y2FsbHJlZiA9IDA7CisJdHJhbnNfZnJlZSh0cmFucyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcmVsZWFzZV9jb21wbChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqcmVsID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1JFTEVBU0VfQ09NUEw7CisKKwl0cmFucy0+Y2FsbHJlZiA9IDA7CisJCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwkvKiBjYXVzZSAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMCwgJnJlbC0+Y2F1c2UpOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmcmVsLT5mYWNpbGl0eSk7CisJLyogdXNlci11c2VyICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmcmVsLT51c2VydXNlcik7CisKKwl0cmFuc19mcmVlKHRyYW5zKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2ZhY2lsaXR5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBmYWM7CisKKwltZW1zZXQoJmZhYywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWZhYy5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfRkFDSUxJVFksIDApOworCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQlmYWMuZmllbGRzIHw9IE1OQ0NfRl9GQUNJTElUWTsKKwkJZ3NtNDhfZGVjb2RlX2ZhY2lsaXR5KCZmYWMuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCS8qIHNzLXZlcnNpb24gKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUykpIHsKKwkJZmFjLmZpZWxkcyB8PSBNTkNDX0ZfU1NWRVJTSU9OOworCQlnc200OF9kZWNvZGVfc3N2ZXJzaW9uKCZmYWMuc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19GQUNJTElUWV9JTkQsICZmYWMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2ZhY2lsaXR5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpmYWMgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfRkFDSUxJVFk7CisKKwkvKiBmYWNpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDEsICZmYWMtPmZhY2lsaXR5KTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2hvbGQoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIGhvbGQ7CisKKwltZW1zZXQoJmhvbGQsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlob2xkLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfSE9MRF9JTkQsICZob2xkKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9ob2xkX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0hPTERfQUNLOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfaG9sZF9yZWooc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKmhvbGRfcmVqID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0hPTERfUkVKOworCisJLyogY2F1c2UgKi8KKwlpZiAoaG9sZF9yZWotPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmhvbGRfcmVqLT5jYXVzZSk7CisJZWxzZQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZGVmYXVsdF9jYXVzZSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9yZXRyaWV2ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgcmV0cmlldmU7CisKKwltZW1zZXQoJnJldHJpZXZlLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJcmV0cmlldmUuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19SRVRSSUVWRV9JTkQsCisJCQkgICAgJnJldHJpZXZlKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9yZXRyaWV2ZV9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRVRSX0FDSzsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JldHJpZXZlX3JlaihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqcmV0cmlldmVfcmVqID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1JFVFJfUkVKOworCisJLyogY2F1c2UgKi8KKwlpZiAocmV0cmlldmVfcmVqLT5maWVsZHMgJiBNTkNDX0ZfQ0FVU0UpCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZyZXRyaWV2ZV9yZWotPmNhdXNlKTsKKwllbHNlCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkZWZhdWx0X2NhdXNlKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3N0YXJ0X2R0bWYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIGR0bWY7CisKKwltZW1zZXQoJmR0bWYsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlkdG1mLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiBrZXlwYWQgZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZKSkgeworCQlkdG1mLmZpZWxkcyB8PSBNTkNDX0ZfS0VZUEFEOworCQlnc200OF9kZWNvZGVfa2V5cGFkKCZkdG1mLmtleXBhZCwKKwkJCSAgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZKS0xKTsKKwl9CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfU1RBUlRfRFRNRl9JTkQsICZkdG1mKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zdGFydF9kdG1mX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZHRtZiA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TVEFSVF9EVE1GX0FDSzsKKworCS8qIGtleXBhZCAqLworCWlmIChkdG1mLT5maWVsZHMgJiBNTkNDX0ZfS0VZUEFEKQorCQlnc200OF9lbmNvZGVfa2V5cGFkKG1zZywgZHRtZi0+a2V5cGFkKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3N0YXJ0X2R0bWZfcmVqKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpkdG1mID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NUQVJUX0RUTUZfUkVKOworCisJLyogY2F1c2UgKi8KKwlpZiAoZHRtZi0+ZmllbGRzICYgTU5DQ19GX0NBVVNFKQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZHRtZi0+Y2F1c2UpOworCWVsc2UKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmRlZmF1bHRfY2F1c2UpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc3RvcF9kdG1mX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NUT1BfRFRNRl9BQ0s7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9zdG9wX2R0bWYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIGR0bWY7CisKKwltZW1zZXQoJmR0bWYsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlkdG1mLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19TVE9QX0RUTUZfSU5ELCAmZHRtZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfbW9kaWZ5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBtb2RpZnk7CisKKwltZW1zZXQoJm1vZGlmeSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vZGlmeS5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQkVBUkVSX0NBUCwgMCk7CisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCkpIHsKKwkJbW9kaWZ5LmZpZWxkcyB8PSBNTkNDX0ZfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJm1vZGlmeS5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfTU9fT1JJR19NT0RJRlkpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX01PRElGWV9JTkQsICZtb2RpZnkpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X21vZGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kaWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX01PRElGWTsKKworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMyMywgR1NNNDhfVDMyMyk7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMSwgJm1vZGlmeS0+YmVhcmVyX2NhcCk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfTU9fVEVSTV9NT0RJRlkpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfbW9kaWZ5X2NvbXBsZXRlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBtb2RpZnk7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKworCW1lbXNldCgmbW9kaWZ5LCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbW9kaWZ5LmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCBHU000OF9JRV9CRUFSRVJfQ0FQLCAwKTsKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKSkgeworCQltb2RpZnkuZmllbGRzIHw9IE1OQ0NfRl9CRUFSRVJfQ0FQOworCQlnc200OF9kZWNvZGVfYmVhcmVyX2NhcCgmbW9kaWZ5LmJlYXJlcl9jYXAsCisJCQkJICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0JFQVJFUl9DQVApLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX01PRElGWV9DTkYsICZtb2RpZnkpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X21vZGlmeV9jb21wbGV0ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kaWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX01PRElGWV9DT01QTDsKKworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAobXNnLCAxLCAmbW9kaWZ5LT5iZWFyZXJfY2FwKTsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfbW9kaWZ5X3JlamVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgbW9kaWZ5OworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwltZW1zZXQoJm1vZGlmeSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vZGlmeS5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQkVBUkVSX0NBUCwgR1NNNDhfSUVfQ0FVU0UpOworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0JFQVJFUl9DQVApKSB7CisJCW1vZGlmeS5maWVsZHMgfD0gR1NNNDhfSUVfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJm1vZGlmeS5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisJLyogY2F1c2UgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpKSB7CisJCW1vZGlmeS5maWVsZHMgfD0gTU5DQ19GX0NBVVNFOworCQlnc200OF9kZWNvZGVfY2F1c2UoJm1vZGlmeS5jYXVzZSwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQVVTRSktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfTU9ESUZZX1JFSiwgJm1vZGlmeSk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfbW9kaWZ5X3JlamVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kaWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX01PRElGWV9SRUpFQ1Q7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMSwgJm1vZGlmeS0+YmVhcmVyX2NhcCk7CisJLyogY2F1c2UgKi8KKwlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmbW9kaWZ5LT5jYXVzZSk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X25vdGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbm90aWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX05PVElGWTsKKworCS8qIG5vdGlmeSAqLworCWdzbTQ4X2VuY29kZV9ub3RpZnkobXNnLCBub3RpZnktPm5vdGlmeSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9ub3RpZnkoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisvLwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2Mgbm90aWZ5OworCisJbWVtc2V0KCZub3RpZnksIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlub3RpZnkuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworLy8JdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbik7CisJaWYgKHBheWxvYWRfbGVuID49IDEpCisJCWdzbTQ4X2RlY29kZV9ub3RpZnkoJm5vdGlmeS5ub3RpZnksIGdoLT5kYXRhKTsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19OT1RJRllfSU5ELCAmbm90aWZ5KTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF91c2VyaW5mbyhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqdXNlciA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19VU0VSX0lORk87CisKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAodXNlci0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAxLCAmdXNlci0+dXNlcnVzZXIpOworCS8qIG1vcmUgZGF0YSAqLworCWlmICh1c2VyLT5tb3JlKQorCQlnc200OF9lbmNvZGVfbW9yZShtc2cpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfdXNlcmluZm8oc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIHVzZXI7CisKKwltZW1zZXQoJnVzZXIsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwl1c2VyLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCBHU000OF9JRV9VU0VSX1VTRVIsIDApOworCS8qIHVzZXItdXNlciAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpKSB7CisJCXVzZXIuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZ1c2VyLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogbW9yZSBkYXRhICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX01PUkVfREFUQSkpCisJCXVzZXIubW9yZSA9IDE7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfVVNFUklORk9fSU5ELCAmdXNlcik7Cit9CisKK3N0YXRpYyBpbnQgX2dzbTQ4X2xjaGFuX21vZGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kZSA9IGFyZzsKKworCXJldHVybiBnc200OF9sY2hhbl9tb2RpZnkodHJhbnMtPmNvbm4tPmxjaGFuLCBtb2RlLT5sY2hhbl9tb2RlKTsKK30KKworc3RhdGljIHN0cnVjdCBkb3duc3RhdGUgeworCXVfaW50MzJfdAlzdGF0ZXM7CisJaW50CQl0eXBlOworCWludAkJKCpyb3V0KSAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZyk7Cit9IGRvd25zdGF0ZWxpc3RbXSA9IHsKKwkvKiBtb2JpbGUgb3JpZ2luYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9JTklUSUFURUQpLCAvKiA1LjIuMS4yICovCisJIE1OQ0NfQ0FMTF9QUk9DX1JFUSwgZ3NtNDhfY2NfdHhfY2FsbF9wcm9jfSwKKwl7U0JJVChHU01fQ1NUQVRFX0lOSVRJQVRFRCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fQ0FMTF9QUk9DKSwgLyogNS4yLjEuMiB8IDUuMi4xLjUgKi8KKwkgTU5DQ19BTEVSVF9SRVEsIGdzbTQ4X2NjX3R4X2FsZXJ0aW5nfSwKKwl7U0JJVChHU01fQ1NUQVRFX0lOSVRJQVRFRCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fQ0FMTF9QUk9DKSB8IFNCSVQoR1NNX0NTVEFURV9DQUxMX0RFTElWRVJFRCksIC8qIDUuMi4xLjIgfCA1LjIuMS42IHwgNS4yLjEuNiAqLworCSBNTkNDX1NFVFVQX1JTUCwgZ3NtNDhfY2NfdHhfY29ubmVjdH0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19DQUxMX1BST0MpLCAvKiA1LjIuMS40LjIgKi8KKwkgTU5DQ19QUk9HUkVTU19SRVEsIGdzbTQ4X2NjX3R4X3Byb2dyZXNzfSwKKwkvKiBtb2JpbGUgdGVybWluYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9OVUxMKSwgLyogNS4yLjIuMSAqLworCSBNTkNDX1NFVFVQX1JFUSwgZ3NtNDhfY2NfdHhfc2V0dXB9LAorCXtTQklUKEdTTV9DU1RBVEVfQ09OTkVDVF9SRVFVRVNUKSwKKwkgTU5DQ19TRVRVUF9DT01QTF9SRVEsIGdzbTQ4X2NjX3R4X2Nvbm5lY3RfYWNrfSwKKwkgLyogc2lnbmFsbGluZyBkdXJpbmcgY2FsbCAqLworCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19OT1RJRllfUkVRLCBnc200OF9jY190eF9ub3RpZnl9LAorCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpIC0gU0JJVChHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKSwKKwkgTU5DQ19GQUNJTElUWV9SRVEsIGdzbTQ4X2NjX3R4X2ZhY2lsaXR5fSwKKwl7QUxMX1NUQVRFUywKKwkgTU5DQ19TVEFSVF9EVE1GX1JTUCwgZ3NtNDhfY2NfdHhfc3RhcnRfZHRtZl9hY2t9LAorCXtBTExfU1RBVEVTLAorCSBNTkNDX1NUQVJUX0RUTUZfUkVKLCBnc200OF9jY190eF9zdGFydF9kdG1mX3Jlan0sCisJe0FMTF9TVEFURVMsCisJIE1OQ0NfU1RPUF9EVE1GX1JTUCwgZ3NtNDhfY2NfdHhfc3RvcF9kdG1mX2Fja30sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX0hPTERfQ05GLCBnc200OF9jY190eF9ob2xkX2Fja30sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX0hPTERfUkVKLCBnc200OF9jY190eF9ob2xkX3Jlan0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX1JFVFJJRVZFX0NORiwgZ3NtNDhfY2NfdHhfcmV0cmlldmVfYWNrfSwKKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIE1OQ0NfUkVUUklFVkVfUkVKLCBnc200OF9jY190eF9yZXRyaWV2ZV9yZWp9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19NT0RJRllfUkVRLCBnc200OF9jY190eF9tb2RpZnl9LAorCXtTQklUKEdTTV9DU1RBVEVfTU9fT1JJR19NT0RJRlkpLAorCSBNTkNDX01PRElGWV9SU1AsIGdzbTQ4X2NjX3R4X21vZGlmeV9jb21wbGV0ZX0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19PUklHX01PRElGWSksCisJIE1OQ0NfTU9ESUZZX1JFSiwgZ3NtNDhfY2NfdHhfbW9kaWZ5X3JlamVjdH0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX1VTRVJJTkZPX1JFUSwgZ3NtNDhfY2NfdHhfdXNlcmluZm99LAorCS8qIGNsZWFyaW5nICovCisJe1NCSVQoR1NNX0NTVEFURV9JTklUSUFURUQpLAorCSBNTkNDX1JFSl9SRVEsIGdzbTQ4X2NjX3R4X3JlbGVhc2VfY29tcGx9LAorCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpIC0gU0JJVChHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfSU5EKSAtIFNCSVQoR1NNX0NTVEFURV9SRUxFQVNFX1JFUSkgLSBTQklUKEdTTV9DU1RBVEVfRElTQ09OTkVDVF9SRVEpLCAvKiA1LjQuNCAqLworCSBNTkNDX0RJU0NfUkVRLCBnc200OF9jY190eF9kaXNjb25uZWN0fSwKKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSAtIFNCSVQoR1NNX0NTVEFURV9SRUxFQVNFX1JFUSksIC8qIDUuNC4zLjIgKi8KKwkgTU5DQ19SRUxfUkVRLCBnc200OF9jY190eF9yZWxlYXNlfSwKKwkvKiBzcGVjaWFsICovCisJe0FMTF9TVEFURVMsCisJIE1OQ0NfTENIQU5fTU9ESUZZLCBfZ3NtNDhfbGNoYW5fbW9kaWZ5fSwKK307CisKKyNkZWZpbmUgRE9XTlNMTEVOIFwKKwkoc2l6ZW9mKGRvd25zdGF0ZWxpc3QpIC8gc2l6ZW9mKHN0cnVjdCBkb3duc3RhdGUpKQorCisKK2ludCBtbmNjX3NlbmQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKQoreworCWludCBpLCByYyA9IDA7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnMgPSBOVUxMLCAqdHJhbnN0OworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX21uY2MgKmRhdGEgPSBhcmcsIHJlbDsKKworCS8qIGhhbmRsZSBzcGVjaWFsIG1lc3NhZ2VzICovCisJc3dpdGNoKG1zZ190eXBlKSB7CisJY2FzZSBNTkNDX0JSSURHRToKKwkJcmV0dXJuIHRjaF9icmlkZ2UobmV0LCBhcmcpOworCWNhc2UgTU5DQ19GUkFNRV9EUk9QOgorCQlyZXR1cm4gdGNoX3JlY3ZfbW5jYyhuZXQsIGRhdGEtPmNhbGxyZWYsIDApOworCWNhc2UgTU5DQ19GUkFNRV9SRUNWOgorCQlyZXR1cm4gdGNoX3JlY3ZfbW5jYyhuZXQsIGRhdGEtPmNhbGxyZWYsIDEpOworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJCS8qIEZpbmQgY2FsbHJlZiAqLworCQl0cmFucyA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIGRhdGEtPmNhbGxyZWYpOworCQlpZiAoIXRyYW5zKQorCQkJcmV0dXJuIC1FSU87CisJCWlmICghdHJhbnMtPmNvbm4pCisJCQlyZXR1cm4gMDsKKwkJaWYgKHRyYW5zLT5jb25uLT5sY2hhbi0+dHlwZSAhPSBHU01fTENIQU5fVENIX0YpCisJCQlyZXR1cm4gMDsKKwkJYnRzID0gdHJhbnMtPmNvbm4tPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCQlpZiAoIXRyYW5zLT5jb25uLT5sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIHJ0cF9zZW5kX2ZyYW1lKHRyYW5zLT5jb25uLT5sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0LCBhcmcpOworCQljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQkJcmV0dXJuIHRyYXVfc2VuZF9mcmFtZSh0cmFucy0+Y29ubi0+bGNoYW4sIGFyZyk7CisJCWRlZmF1bHQ6CisJCQlERUJVR1AoRENDLCAiVW5rbm93biBCVFMgdHlwZSAldVxuIiwgYnRzLT50eXBlKTsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1zZXQoJnJlbCwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCXJlbC5jYWxscmVmID0gZGF0YS0+Y2FsbHJlZjsKKworCS8qIEZpbmQgY2FsbHJlZiAqLworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9jYWxscmVmKG5ldCwgZGF0YS0+Y2FsbHJlZik7CisKKwkvKiBDYWxscmVmIHVua25vd24gKi8KKwlpZiAoIXRyYW5zKSB7CisJCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJCWlmIChtc2dfdHlwZSAhPSBNTkNDX1NFVFVQX1JFUSkgeworCQkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJCSJSZWNlaXZlZCAnJXMnIGZyb20gTU5DQyB3aXRoICIKKwkJCQkidW5rbm93biBjYWxscmVmICVkXG4iLCBkYXRhLT5jYWxsZWQubnVtYmVyLAorCQkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpLCBkYXRhLT5jYWxscmVmKTsKKwkJCS8qIEludmFsaWQgY2FsbCByZWZlcmVuY2UgKi8KKwkJCXJldHVybiBtbmNjX3JlbGVhc2VfaW5kKG5ldCwgTlVMTCwgZGF0YS0+Y2FsbHJlZiwKKwkJCQkJCUdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkJCUdTTTQ4X0NDX0NBVVNFX0lOVkFMX1RSQU5TX0lEKTsKKwkJfQorCQlpZiAoIWRhdGEtPmNhbGxlZC5udW1iZXJbMF0gJiYgIWRhdGEtPmltc2lbMF0pIHsKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSkgIgorCQkJCSJSZWNlaXZlZCAnJXMnIGZyb20gTU5DQyB3aXRoICIKKwkJCQkibm8gbnVtYmVyIG9yIElNU0lcbiIsIGdldF9tbmNjX25hbWUobXNnX3R5cGUpKTsKKwkJCS8qIEludmFsaWQgbnVtYmVyICovCisJCQlyZXR1cm4gbW5jY19yZWxlYXNlX2luZChuZXQsIE5VTEwsIGRhdGEtPmNhbGxyZWYsCisJCQkJCQlHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCQlHU000OF9DQ19DQVVTRV9JTlZfTlJfRk9STUFUKTsKKwkJfQorCQkvKiBOZXcgdHJhbnNhY3Rpb24gZHVlIHRvIHNldHVwLCBmaW5kIHN1YnNjcmliZXIgKi8KKwkJaWYgKGRhdGEtPmNhbGxlZC5udW1iZXJbMF0pCisJCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2V4dGVuc2lvbihuZXQsCisJCQkJCQkJZGF0YS0+Y2FsbGVkLm51bWJlcik7CisJCWVsc2UKKwkJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShuZXQsIGRhdGEtPmltc2kpOworCQkvKiBJZiBzdWJzY3JpYmVyIGlzIG5vdCBmb3VuZCAqLworCQlpZiAoIXN1YnNjcikgeworCQkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJCSJSZWNlaXZlZCAnJXMnIGZyb20gTU5DQyB3aXRoICIKKwkJCQkidW5rbm93biBzdWJzY3JpYmVyICVzXG4iLCBkYXRhLT5jYWxsZWQubnVtYmVyLAorCQkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpLCBkYXRhLT5jYWxsZWQubnVtYmVyKTsKKwkJCS8qIFVua25vd24gc3Vic2NyaWJlciAqLworCQkJcmV0dXJuIG1uY2NfcmVsZWFzZV9pbmQobmV0LCBOVUxMLCBkYXRhLT5jYWxscmVmLAorCQkJCQkJR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCQkJR1NNNDhfQ0NfQ0FVU0VfVU5BU1NJR05FRF9OUik7CisJCX0KKwkJLyogSWYgc3Vic2NyaWJlciBpcyBub3QgImF0dGFjaGVkIiAqLworCQlpZiAoIXN1YnNjci0+bGFjKSB7CisJCQlERUJVR1AoRENDLCAiKGJ0cyAtIHRyeCAtIHRzIC0gdGkgLS0gc3ViICVzKSAiCisJCQkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIHdpdGggIgorCQkJCSJkZXRhY2hlZCBzdWJzY3JpYmVyICVzXG4iLCBkYXRhLT5jYWxsZWQubnVtYmVyLAorCQkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpLCBkYXRhLT5jYWxsZWQubnVtYmVyKTsKKwkJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJCS8qIFRlbXBvcmFyaWx5IG91dCBvZiBvcmRlciAqLworCQkJcmV0dXJuIG1uY2NfcmVsZWFzZV9pbmQobmV0LCBOVUxMLCBkYXRhLT5jYWxscmVmLAorCQkJCQkJR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCQkJR1NNNDhfQ0NfQ0FVU0VfREVTVF9PT08pOworCQl9CisJCS8qIENyZWF0ZSB0cmFuc2FjdGlvbiAqLworCQl0cmFucyA9IHRyYW5zX2FsbG9jKHN1YnNjciwgR1NNNDhfUERJU0NfQ0MsIDB4ZmYsIGRhdGEtPmNhbGxyZWYpOworCQlpZiAoIXRyYW5zKSB7CisJCQlERUJVR1AoRENDLCAiTm8gbWVtb3J5IGZvciB0cmFucy5cbiIpOworCQkJc3Vic2NyX3B1dChzdWJzY3IpOworCQkJLyogUmVzc291cmNlIHVuYXZhaWxhYmxlICovCisJCQltbmNjX3JlbGVhc2VfaW5kKG5ldCwgTlVMTCwgZGF0YS0+Y2FsbHJlZiwKKwkJCQkJIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkJIEdTTTQ4X0NDX0NBVVNFX1JFU09VUkNFX1VOQVZBSUwpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJLyogRmluZCBsY2hhbiAqLworCQlsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKworCQkvKiBJZiBzdWJzY3JpYmVyIGhhcyBubyBsY2hhbiAqLworCQlpZiAoIWxjaGFuKSB7CisJCQkvKiBmaW5kIHRyYW5zYWN0aW9uIHdpdGggdGhpcyBzdWJzY3JpYmVyIGFscmVhZHkgcGFnaW5nICovCisJCQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFuc3QsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCQkJLyogVHJhbnNhY3Rpb24gb2Ygb3VyIGxjaGFuPyAqLworCQkJCWlmICh0cmFuc3QgPT0gdHJhbnMgfHwKKwkJCQkgICAgdHJhbnN0LT5zdWJzY3IgIT0gc3Vic2NyKQorCQkJCQljb250aW51ZTsKKwkJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJCSJ1bmFsbG9jYXRlZCBjaGFubmVsLCBwYWdpbmcgYWxyZWFkeSAiCisJCQkJCSJzdGFydGVkLlxuIiwgYnRzLT5uciwKKwkJCQkJZGF0YS0+Y2FsbGVkLm51bWJlciwKKwkJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCQkJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCS8qIHN0b3JlIHNldHVwIGluZm9ybWF0aW9ucyB1bnRpbCBwYWdpbmcgd2FzIHN1Y2Nlc3NmdWxsICovCisJCQltZW1jcHkoJnRyYW5zLT5jYy5tc2csIGRhdGEsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwkJCS8qIFRyaWdnZXIgcGFnaW5nICovCisJCQlwYWdpbmdfcmVxdWVzdChuZXQsIHN1YnNjciwgUlNMX0NIQU5ORUVEX1RDSF9GLAorCQkJCQlzZXR1cF90cmlnX3BhZ19ldnQsIHN1YnNjcik7CisJCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBBc3NpZ24gbGNoYW4gKi8KKwkJdHJhbnMtPmNvbm4gPSAmbGNoYW4tPmNvbm47CisJCXVzZV9zdWJzY3JfY29uKHRyYW5zLT5jb25uKTsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCX0KKworCWlmICh0cmFucy0+Y29ubikKKwkJbGNoYW4gPSB0cmFucy0+Y29ubi0+bGNoYW47CisKKwkvKiBpZiBwYWdpbmcgZGlkIG5vdCByZXNwb25kIHlldCAqLworCWlmICghbGNoYW4pIHsKKwkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIGluIHBhZ2luZyBzdGF0ZVxuIiwKKwkJCSh0cmFucy0+c3Vic2NyKT8odHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCW1uY2Nfc2V0X2NhdXNlKCZyZWwsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9OT1JNX0NBTExfQ0xFQVIpOworCQlpZiAobXNnX3R5cGUgPT0gTU5DQ19SRUxfUkVRKQorCQkJcmMgPSBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfQ05GLCAmcmVsKTsKKwkJZWxzZQorCQkJcmMgPSBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfSU5ELCAmcmVsKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuIHJjOworCX0KKworCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAlMDJ4IHN1YiAlcykgIgorCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0MgaW4gc3RhdGUgJWQgKCVzKVxuIiwKKwkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKKwkJdHJhbnMtPnRyYW5zYWN0aW9uX2lkLAorCQkodHJhbnMtPmNvbm4tPnN1YnNjcik/KHRyYW5zLT5jb25uLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgdHJhbnMtPmNjLnN0YXRlLAorCQlnc200OF9jY19zdGF0ZV9uYW1lKHRyYW5zLT5jYy5zdGF0ZSkpOworCisJLyogRmluZCBmdW5jdGlvbiBmb3IgY3VycmVudCBzdGF0ZSBhbmQgbWVzc2FnZSAqLworCWZvciAoaSA9IDA7IGkgPCBET1dOU0xMRU47IGkrKykKKwkJaWYgKChtc2dfdHlwZSA9PSBkb3duc3RhdGVsaXN0W2ldLnR5cGUpCisJCSAmJiAoKDEgPDwgdHJhbnMtPmNjLnN0YXRlKSAmIGRvd25zdGF0ZWxpc3RbaV0uc3RhdGVzKSkKKwkJCWJyZWFrOworCWlmIChpID09IERPV05TTExFTikgeworCQlERUJVR1AoRENDLCAiTWVzc2FnZSB1bmhhbmRsZWQgYXQgdGhpcyBzdGF0ZS5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IGRvd25zdGF0ZWxpc3RbaV0ucm91dCh0cmFucywgYXJnKTsKKworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgc3RydWN0IGRhdGFzdGF0ZSB7CisJdV9pbnQzMl90CXN0YXRlczsKKwlpbnQJCXR5cGU7CisJaW50CQkoKnJvdXQpIChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZyk7Cit9IGRhdGFzdGF0ZWxpc3RbXSA9IHsKKwkvKiBtb2JpbGUgb3JpZ2luYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9OVUxMKSwgLyogNS4yLjEuMiAqLworCSBHU000OF9NVF9DQ19TRVRVUCwgZ3NtNDhfY2Nfcnhfc2V0dXB9LAorCXtTQklUKEdTTV9DU1RBVEVfTlVMTCksIC8qIDUuMi4xLjIgKi8KKwkgR1NNNDhfTVRfQ0NfRU1FUkdfU0VUVVAsIGdzbTQ4X2NjX3J4X3NldHVwfSwKKwl7U0JJVChHU01fQ1NUQVRFX0NPTk5FQ1RfSU5EKSwgLyogNS4yLjEuMiAqLworCSBHU000OF9NVF9DQ19DT05ORUNUX0FDSywgZ3NtNDhfY2NfcnhfY29ubmVjdF9hY2t9LAorCS8qIG1vYmlsZSB0ZXJtaW5hdGluZyBjYWxsIGVzdGFibGlzaG1lbnQgKi8KKwl7U0JJVChHU01fQ1NUQVRFX0NBTExfUFJFU0VOVCksIC8qIDUuMi4yLjMuMiAqLworCSBHU000OF9NVF9DQ19DQUxMX0NPTkYsIGdzbTQ4X2NjX3J4X2NhbGxfY29uZn0sCisJe1NCSVQoR1NNX0NTVEFURV9DQUxMX1BSRVNFTlQpIHwgU0JJVChHU01fQ1NUQVRFX01PX1RFUk1fQ0FMTF9DT05GKSwgLyogPz8/PyB8IDUuMi4yLjMuMiAqLworCSBHU000OF9NVF9DQ19BTEVSVElORywgZ3NtNDhfY2NfcnhfYWxlcnRpbmd9LAorCXtTQklUKEdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UKSB8IFNCSVQoR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORikgfCBTQklUKEdTTV9DU1RBVEVfQ0FMTF9SRUNFSVZFRCksIC8qICg1LjIuMi42KSB8IDUuMi4yLjYgfCA1LjIuMi42ICovCisJIEdTTTQ4X01UX0NDX0NPTk5FQ1QsIGdzbTQ4X2NjX3J4X2Nvbm5lY3R9LAorCSAvKiBzaWduYWxsaW5nIGR1cmluZyBjYWxsICovCisJe0FMTF9TVEFURVMgLSBTQklUKEdTTV9DU1RBVEVfTlVMTCksCisJIEdTTTQ4X01UX0NDX0ZBQ0lMSVRZLCBnc200OF9jY19yeF9mYWNpbGl0eX0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19OT1RJRlksIGdzbTQ4X2NjX3J4X25vdGlmeX0sCisJe0FMTF9TVEFURVMsCisJIEdTTTQ4X01UX0NDX1NUQVJUX0RUTUYsIGdzbTQ4X2NjX3J4X3N0YXJ0X2R0bWZ9LAorCXtBTExfU1RBVEVTLAorCSBHU000OF9NVF9DQ19TVE9QX0RUTUYsIGdzbTQ4X2NjX3J4X3N0b3BfZHRtZn0sCisJe0FMTF9TVEFURVMsCisJIEdTTTQ4X01UX0NDX1NUQVRVU19FTlEsIGdzbTQ4X2NjX3J4X3N0YXR1c19lbnF9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgR1NNNDhfTVRfQ0NfSE9MRCwgZ3NtNDhfY2NfcnhfaG9sZH0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19SRVRSLCBnc200OF9jY19yeF9yZXRyaWV2ZX0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19NT0RJRlksIGdzbTQ4X2NjX3J4X21vZGlmeX0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19URVJNX01PRElGWSksCisJIEdTTTQ4X01UX0NDX01PRElGWV9DT01QTCwgZ3NtNDhfY2NfcnhfbW9kaWZ5X2NvbXBsZXRlfSwKKwl7U0JJVChHU01fQ1NUQVRFX01PX1RFUk1fTU9ESUZZKSwKKwkgR1NNNDhfTVRfQ0NfTU9ESUZZX1JFSkVDVCwgZ3NtNDhfY2NfcnhfbW9kaWZ5X3JlamVjdH0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19VU0VSX0lORk8sIGdzbTQ4X2NjX3J4X3VzZXJpbmZvfSwKKwkvKiBjbGVhcmluZyAqLworCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpIC0gU0JJVChHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKSwgLyogNS40LjMuMiAqLworCSBHU000OF9NVF9DQ19ESVNDT05ORUNULCBnc200OF9jY19yeF9kaXNjb25uZWN0fSwKKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSwgLyogNS40LjQuMS4yLjIgKi8KKwkgR1NNNDhfTVRfQ0NfUkVMRUFTRSwgZ3NtNDhfY2NfcnhfcmVsZWFzZX0sCisJe0FMTF9TVEFURVMsIC8qIDUuNC4zLjQgKi8KKwkgR1NNNDhfTVRfQ0NfUkVMRUFTRV9DT01QTCwgZ3NtNDhfY2NfcnhfcmVsZWFzZV9jb21wbH0sCit9OworCisjZGVmaW5lIERBVEFTTExFTiBcCisJKHNpemVvZihkYXRhc3RhdGVsaXN0KSAvIHNpemVvZihzdHJ1Y3QgZGF0YXN0YXRlKSkKKworc3RhdGljIGludCBnc20wNDA4X3Jjdl9jYyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IG1zZ190eXBlID0gZ2gtPm1zZ190eXBlICYgMHhiZjsKKwl1X2ludDhfdCB0cmFuc2FjdGlvbl9pZCA9ICgoZ2gtPnByb3RvX2Rpc2NyICYgMHhmMCkgXiAweDgwKSA+PiA0OyAvKiBmbGlwICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zID0gTlVMTDsKKwlpbnQgaSwgcmMgPSAwOworCisJaWYgKG1zZ190eXBlICYgMHg4MCkgeworCQlERUJVR1AoRENDLCAiTVNHIDB4JTJ4IG5vdCBkZWZpbmVkIGZvciBQRCBlcnJvclxuIiwgbXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljb25uID0gJmxjaGFuLT5jb25uOworCisJLyogRmluZCB0cmFuc2FjdGlvbiAqLworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChjb25uLT5zdWJzY3IsIEdTTTQ4X1BESVNDX0NDLCB0cmFuc2FjdGlvbl9pZCk7CisKKwlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJXggc3ViICVzKSAiCisJCSJSZWNlaXZlZCAnJXMnIGZyb20gTVMgaW4gc3RhdGUgJWQgKCVzKVxuIiwKKwkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKKwkJdHJhbnNhY3Rpb25faWQsIChjb25uLT5zdWJzY3IpPyhjb25uLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQlnc200OF9jY19tc2dfbmFtZShtc2dfdHlwZSksIHRyYW5zPyh0cmFucy0+Y2Muc3RhdGUpOjAsCisJCWdzbTQ4X2NjX3N0YXRlX25hbWUodHJhbnM/KHRyYW5zLT5jYy5zdGF0ZSk6MCkpOworCisJLyogQ3JlYXRlIHRyYW5zYWN0aW9uICovCisJaWYgKCF0cmFucykgeworCQlERUJVR1AoRENDLCAiVW5rbm93biB0cmFuc2FjdGlvbiBJRCAleCwgIgorCQkJImNyZWF0aW5nIG5ldyB0cmFucy5cbiIsIHRyYW5zYWN0aW9uX2lkKTsKKwkJLyogQ3JlYXRlIHRyYW5zYWN0aW9uICovCisJCXRyYW5zID0gdHJhbnNfYWxsb2MoY29ubi0+c3Vic2NyLCBHU000OF9QRElTQ19DQywKKwkJCQkgICAgdHJhbnNhY3Rpb25faWQsIG5ld19jYWxscmVmKyspOworCQlpZiAoIXRyYW5zKSB7CisJCQlERUJVR1AoRENDLCAiTm8gbWVtb3J5IGZvciB0cmFucy5cbiIpOworCQkJcmMgPSBnc200OF90eF9zaW1wbGUobXNnLT5sY2hhbiwKKwkJCQkJICAgICBHU000OF9QRElTQ19DQyB8ICh0cmFuc2FjdGlvbl9pZCA8PCA0KSwKKwkJCQkJICAgICBHU000OF9NVF9DQ19SRUxFQVNFX0NPTVBMKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCS8qIEFzc2lnbiB0cmFuc2FjdGlvbiAqLworCQl0cmFucy0+Y29ubiA9ICZsY2hhbi0+Y29ubjsKKwkJdXNlX3N1YnNjcl9jb24odHJhbnMtPmNvbm4pOworCX0KKworCS8qIGZpbmQgZnVuY3Rpb24gZm9yIGN1cnJlbnQgc3RhdGUgYW5kIG1lc3NhZ2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgREFUQVNMTEVOOyBpKyspCisJCWlmICgobXNnX3R5cGUgPT0gZGF0YXN0YXRlbGlzdFtpXS50eXBlKQorCQkgJiYgKCgxIDw8IHRyYW5zLT5jYy5zdGF0ZSkgJiBkYXRhc3RhdGVsaXN0W2ldLnN0YXRlcykpCisJCQlicmVhazsKKwlpZiAoaSA9PSBEQVRBU0xMRU4pIHsKKwkJREVCVUdQKERDQywgIk1lc3NhZ2UgdW5oYW5kbGVkIGF0IHRoaXMgc3RhdGUuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBkYXRhc3RhdGVsaXN0W2ldLnJvdXQodHJhbnMsIG1zZyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGhlcmUgd2UgcGFzcyBpbiBhIG1zZ2IgZnJvbSB0aGUgUlNMLT5STEwuICBXZSBleHBlY3QgdGhlIGwzIHBvaW50ZXIgdG8gYmUgc2V0ICovCitpbnQgZ3NtMDQwOF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCkKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCBwZGlzYyA9IGdoLT5wcm90b19kaXNjciAmIDB4MGY7CisJaW50IHJjID0gMDsKKworCWlmIChzaWxlbnRfY2FsbF9yZXJvdXRlKG1zZykpCisJCXJldHVybiBzaWxlbnRfY2FsbF9yeChtc2cpOworCQorCXN3aXRjaCAocGRpc2MpIHsKKwljYXNlIEdTTTQ4X1BESVNDX0NDOgorCQlyYyA9IGdzbTA0MDhfcmN2X2NjKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfUERJU0NfTU06CisJCXJjID0gZ3NtMDQwOF9yY3ZfbW0obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19SUjoKKwkJcmMgPSBnc20wNDA4X3Jjdl9ycihtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX1NNUzoKKwkJcmMgPSBnc20wNDExX3Jjdl9zbXMobXNnLCBsaW5rX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19NTV9HUFJTOgorCWNhc2UgR1NNNDhfUERJU0NfU01fR1BSUzoKKwkJTE9HUChEUkxMLCBMT0dMX05PVElDRSwgIlVuaW1wbGVtZW50ZWQgIgorCQkJIkdTTSAwNC4wOCBkaXNjcmltaW5hdG9yIDB4JTAyeFxuIiwgcGRpc2MpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX05DX1NTOgorCQlyYyA9IGhhbmRsZV9yY3ZfdXNzZChtc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSTEwsIExPR0xfTk9USUNFLCAiVW5rbm93biAiCisJCQkiR1NNIDA0LjA4IGRpc2NyaW1pbmF0b3IgMHglMDJ4XG4iLCBwZGlzYyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogZGVxdWV1ZSBtZXNzYWdlcyB0byBsYXllciA0ICovCitpbnQgYnNjX3VwcXVldWUoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IGdzbV9tbmNjICptbmNjOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHdvcmsgPSAwOworCisJaWYgKG5ldCkKKwkJd2hpbGUgKChtc2cgPSBtc2diX2RlcXVldWUoJm5ldC0+dXBxdWV1ZSkpKSB7CisJCQltbmNjID0gKHN0cnVjdCBnc21fbW5jYyAqKW1zZy0+ZGF0YTsKKwkJCWlmIChuZXQtPm1uY2NfcmVjdikKKwkJCQluZXQtPm1uY2NfcmVjdihuZXQsIG1uY2MtPm1zZ190eXBlLCBtbmNjKTsKKwkJCXdvcmsgPSAxOyAvKiB3b3JrIGRvbmUgKi8KKwkJCXRhbGxvY19mcmVlKG1zZyk7CisJCX0KKworCXJldHVybiB3b3JrOworfQorCisvKgorICogVGhpcyB3aWxsIGJlIHJhbiBieSB0aGUgbGlua2VyIHdoZW4gbG9hZGluZyB0aGUgRFNPLiBXZSB1c2UgaXQgdG8KKyAqIGRvIHN5c3RlbSBpbml0aWFsaXphdGlvbiwgZS5nLiByZWdpc3RyYXRpb24gb2Ygc2lnbmFsIGhhbmRsZXJzLgorICovCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkXzA0MDgodm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19MQ0hBTiwgZ3NtMDQwOF9oYW5kbGVfbGNoYW5fc2lnbmFsLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19BQklTSVAsIGhhbmRsZV9hYmlzaXBfc2lnbmFsLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV8wNF8wOF91dGlscy5jIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4X3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3MGI1MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOF91dGlscy5jCkBAIC0wLDAgKzEsNTg0IEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAKKyAqIHV0aWxpdHkgZnVuY3Rpb25zCisgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCisjZGVmaW5lIEdTTTQ4X0FMTE9DX1NJWkUJMTAyNAorI2RlZmluZSBHU000OF9BTExPQ19IRUFEUk9PTQkxMjgKKworLyogc2hvdWxkIGlwLmFjY2VzcyBCVFMgdXNlIGRpcmVjdCBSVFAgc3RyZWFtcyBiZXR3ZWVuIGVhY2ggb3RoZXIgKDEpLAorICogb3Igc2hvdWxkIE9wZW5CU0MgYWx3YXlzIGFjdCBhcyBSVFAgcmVsYXkvcHJveHkgaW4gYmV0d2VlbiAoMCkgPyAqLworaW50IGlwYWNjX3J0cF9kaXJlY3QgPSAxOworCitzdHJ1Y3QgbXNnYiAqZ3NtNDhfbXNnYl9hbGxvYyh2b2lkKQoreworCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKEdTTTQ4X0FMTE9DX1NJWkUsIEdTTTQ4X0FMTE9DX0hFQURST09NLAorCQkJCSAgICJHU00gMDQuMDgiKTsKK30KKworaW50IGdzbTQ4X3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2ctPmRhdGE7CisKKwkvKiBpZiB3ZSBnZXQgcGFzc2VkIGEgdHJhbnNhY3Rpb24gcmVmZXJlbmNlLCBkbyBzb21lIGNvbW1vbgorCSAqIHdvcmsgdGhhdCB0aGUgY2FsbGVyIG5vIGxvbmdlciBoYXMgdG8gZG8gKi8KKwlpZiAodHJhbnMpIHsKKwkJZ2gtPnByb3RvX2Rpc2NyID0gdHJhbnMtPnByb3RvY29sIHwgKHRyYW5zLT50cmFuc2FjdGlvbl9pZCA8PCA0KTsKKwkJbXNnLT5sY2hhbiA9IHRyYW5zLT5jb25uLT5sY2hhbjsKKwl9CisKKwlpZiAobXNnLT5sY2hhbikgeworCQltc2ctPnRyeCA9IG1zZy0+bGNoYW4tPnRzLT50cng7CisKKwkJaWYgKChnaC0+cHJvdG9fZGlzY3IgJiBHU000OF9QRElTQ19NQVNLKSA9PSBHU000OF9QRElTQ19DQykKKwkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAlMDJ4KSAiCisJCQkJIlNlbmRpbmcgJyVzJyB0byBNUy5cbiIsIG1zZy0+dHJ4LT5idHMtPm5yLAorCQkJCW1zZy0+dHJ4LT5uciwgbXNnLT5sY2hhbi0+dHMtPm5yLAorCQkJCWdoLT5wcm90b19kaXNjciAmIDB4ZjAsCisJCQkJZ3NtNDhfY2NfbXNnX25hbWUoZ2gtPm1zZ190eXBlKSk7CisJCWVsc2UKKwkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCBwZCAlMDJ4KSAiCisJCQkJIlNlbmRpbmcgMHglMDJ4IHRvIE1TLlxuIiwgbXNnLT50cngtPmJ0cy0+bnIsCisJCQkJbXNnLT50cngtPm5yLCBtc2ctPmxjaGFuLT50cy0+bnIsCisJCQkJZ2gtPnByb3RvX2Rpc2NyLCBnaC0+bXNnX3R5cGUpOworCX0KKworCW1zZy0+bDNoID0gbXNnLT5kYXRhOworCisJcmV0dXJuIHJzbF9kYXRhX3JlcXVlc3QobXNnLCAwKTsKK30KKworLyogU2VjdGlvbiA5LjEuOCAvIFRhYmxlIDkuOSAqLworc3RydWN0IGNocmVxIHsKKwl1X2ludDhfdCB2YWw7CisJdV9pbnQ4X3QgbWFzazsKKwllbnVtIGNocmVxX3R5cGUgdHlwZTsKK307CisKKy8qIElmIFNZU1RFTSBJTkZPUk1BVElPTiBUWVBFIDQgTkVDSSBiaXQgPT0gMSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjaHJlcSBjaHJlcV90eXBlX25lY2kxW10gPSB7CisJeyAweGEwLCAweGUwLCBDSFJFUV9UX0VNRVJHX0NBTEwgfSwKKwl7IDB4YzAsIDB4ZTAsIENIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfRiB9LAorCXsgMHg2OCwgMHhmYywgQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IIH0sCisJeyAweDZjLCAweGZjLCBDSFJFUV9UX0NBTExfUkVFU1RfVENIX0hfREJMIH0sCisJeyAweGUwLCAweGUwLCBDSFJFUV9UX1NEQ0NIIH0sCisJeyAweDQwLCAweGYwLCBDSFJFUV9UX1ZPSUNFX0NBTExfVENIX0ggfSwKKwl7IDB4NTAsIDB4ZjAsIENIUkVRX1RfREFUQV9DQUxMX1RDSF9IIH0sCisJeyAweDAwLCAweGYwLCBDSFJFUV9UX0xPQ0FUSU9OX1VQRCB9LAorCXsgMHgxMCwgMHhmMCwgQ0hSRVFfVF9TRENDSCB9LAorCXsgMHg4MCwgMHhlMCwgQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTEgfSwKKwl7IDB4MjAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0YgfSwKKwl7IDB4MzAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0ZIIH0sCisJeyAweDY3LCAweGZmLCBDSFJFUV9UX0xNVSB9LAorCXsgMHg2MCwgMHhmOSwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MSwgMHhmYiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MywJMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg3ZiwgMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkUgfSwKK307CisKKy8qIElmIFNZU1RFTSBJTkZPUk1BVElPTiBUWVBFIDQgTkVDSSBiaXQgPT0gMCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjaHJlcSBjaHJlcV90eXBlX25lY2kwW10gPSB7CisJeyAweGEwLCAweGUwLCBDSFJFUV9UX0VNRVJHX0NBTEwgfSwKKwl7IDB4YzAsIDB4ZTAsIENIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSCB9LAorCXsgMHhlMCwgMHhlMCwgQ0hSRVFfVF9UQ0hfRiB9LAorCXsgMHg1MCwgMHhmMCwgQ0hSRVFfVF9EQVRBX0NBTExfVENIX0ggfSwKKwl7IDB4MDAsIDB4ZTAsIENIUkVRX1RfTE9DQVRJT05fVVBEIH0sCisJeyAweDgwLCAweGUwLCBDSFJFUV9UX1BBR19SX0FOWV9ORUNJMCB9LAorCXsgMHgyMCwgMHhmMCwgQ0hSRVFfVF9QQUdfUl9UQ0hfRiB9LAorCXsgMHgzMCwgMHhmMCwgQ0hSRVFfVF9QQUdfUl9UQ0hfRkggfSwKKwl7IDB4NjcsIDB4ZmYsIENIUkVRX1RfTE1VIH0sCisJeyAweDYwLCAweGY5LCBDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIIH0sCisJeyAweDYxLCAweGZiLCBDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIIH0sCisJeyAweDYzLAkweGZmLCBDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIIH0sCisJeyAweDdmLCAweGZmLCBDSFJFUV9UX1JFU0VSVkVEX0lHTk9SRSB9LAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gZ3NtX2NoYW5fdCBjdHlwZV9ieV9jaHJlcVtdID0geworCVtDSFJFUV9UX0VNRVJHX0NBTExdCQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9GXQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IXQk9IEdTTV9MQ0hBTl9UQ0hfSCwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IX0RCTF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfU0RDQ0hdCQkJPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfVENIX0ZdCQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfVk9JQ0VfQ0FMTF9UQ0hfSF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfREFUQV9DQUxMX1RDSF9IXQk9IEdTTV9MQ0hBTl9UQ0hfSCwKKwlbQ0hSRVFfVF9MT0NBVElPTl9VUERdCQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTFdCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1BBR19SX0FOWV9ORUNJMF0JPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZdCQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9QQUdfUl9UQ0hfRkhdCQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9MTVVdCQkJPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfUkVTRVJWRURfU0RDQ0hdCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1JFU0VSVkVEX0lHTk9SRV0JPSBHU01fTENIQU5fVU5LTk9XTiwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCByZWFzb25fYnlfY2hyZXFbXSA9IHsKKwlbQ0hSRVFfVF9FTUVSR19DQUxMXQkJPSBHU01fQ0hSRVFfUkVBU09OX0VNRVJHLAorCVtDSFJFUV9UX0NBTExfUkVFU1RfVENIX0ZdCT0gR1NNX0NIUkVRX1JFQVNPTl9DQUxMLAorCVtDSFJFUV9UX0NBTExfUkVFU1RfVENIX0hdCT0gR1NNX0NIUkVRX1JFQVNPTl9DQUxMLAorCVtDSFJFUV9UX0NBTExfUkVFU1RfVENIX0hfREJMXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9TRENDSF0JCQk9IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCisJW0NIUkVRX1RfVENIX0ZdCQkJPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1ZPSUNFX0NBTExfVENIX0hdCT0gR1NNX0NIUkVRX1JFQVNPTl9DQUxMLAorCVtDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSF0JPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX0xPQ0FUSU9OX1VQRF0JCT0gR1NNX0NIUkVRX1JFQVNPTl9MT0NBVElPTl9VUEQsCisJW0NIUkVRX1RfUEFHX1JfQU5ZX05FQ0kxXQk9IEdTTV9DSFJFUV9SRUFTT05fUEFHLAorCVtDSFJFUV9UX1BBR19SX0FOWV9ORUNJMF0JPSBHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlbQ0hSRVFfVF9QQUdfUl9UQ0hfRl0JCT0gR1NNX0NIUkVRX1JFQVNPTl9QQUcsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZIXQkJPSBHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlbQ0hSRVFfVF9MTVVdCQkJPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIXQk9IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCisJW0NIUkVRX1RfUkVTRVJWRURfSUdOT1JFXQk9IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCit9OworCitlbnVtIGdzbV9jaGFuX3QgZ2V0X2N0eXBlX2J5X2NocmVxKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHJhLCBpbnQgbmVjaSkKK3sKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCWNvbnN0IHN0cnVjdCBjaHJlcSAqY2hyZXE7CisKKwlpZiAobmVjaSkgeworCQljaHJlcSA9IGNocmVxX3R5cGVfbmVjaTE7CisJCWxlbmd0aCA9IEFSUkFZX1NJWkUoY2hyZXFfdHlwZV9uZWNpMSk7CisJfSBlbHNlIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kwOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTApOworCX0KKworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBjaHJlcSAqY2hyID0gJmNocmVxW2ldOworCQlpZiAoKHJhICYgY2hyLT5tYXNrKSA9PSBjaHItPnZhbCkKKwkJCXJldHVybiBjdHlwZV9ieV9jaHJlcVtjaHItPnR5cGVdOworCX0KKwlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIlVua25vd24gQ0hBTk5FTCBSRVFVRVNUIFJRRCAweCUwMnhcbiIsIHJhKTsKKwlyZXR1cm4gR1NNX0xDSEFOX1NEQ0NIOworfQorCitlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCBnZXRfcmVhc29uX2J5X2NocmVxKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHJhLCBpbnQgbmVjaSkKK3sKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCWNvbnN0IHN0cnVjdCBjaHJlcSAqY2hyZXE7CisKKwlpZiAobmVjaSkgeworCQljaHJlcSA9IGNocmVxX3R5cGVfbmVjaTE7CisJCWxlbmd0aCA9IEFSUkFZX1NJWkUoY2hyZXFfdHlwZV9uZWNpMSk7CisJfSBlbHNlIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kwOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTApOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgY2hyZXEgKmNociA9ICZjaHJlcVtpXTsKKwkJaWYgKChyYSAmIGNoci0+bWFzaykgPT0gY2hyLT52YWwpCisJCQlyZXR1cm4gcmVhc29uX2J5X2NocmVxW2Noci0+dHlwZV07CisJfQorCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiVW5rbm93biBDSEFOTkVMIFJFUVVFU1QgUkVBU09OIDB4JTAyeFxuIiwgcmEpOworCXJldHVybiBHU01fQ0hSRVFfUkVBU09OX09USEVSOworfQorCisvKiA3LjEuNyBhbmQgOS4xLjc6IFJSIENIQU5uZWwgUkVMZWFzZSAqLworaW50IGdzbTQ4X3NlbmRfcnJfcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJdV9pbnQ4X3QgKmNhdXNlOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0NIQU5fUkVMOworCisJY2F1c2UgPSBtc2diX3B1dChtc2csIDEpOworCWNhdXNlWzBdID0gR1NNNDhfUlJfQ0FVU0VfTk9STUFMOworCisJREVCVUdQKERSUiwgIlNlbmRpbmcgQ2hhbm5lbCBSZWxlYXNlOiBDaGFuOiBOdW1iZXI6ICVkIFR5cGU6ICVkXG4iLAorCQlsY2hhbi0+bnIsIGxjaGFuLT50eXBlKTsKKworCS8qIFNlbmQgYWN0dWFsIHJlbGVhc2UgcmVxdWVzdCB0byBNUyAqLworCWdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKKwkvKiBGSVhNRTogU3RhcnQgVGltZXIgVDMxMDkgKi8KKworCS8qIERlYWN0aXZhdGUgdGhlIFNBQ0NIIG9uIHRoZSBCVFMgc2lkZSAqLworCXJldHVybiByc2xfZGVhY3Rfc2FjY2gobGNoYW4pOworfQorCitpbnQgc2VuZF9zaWVtZW5zX21ycGNpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkgICAgICAgdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYpCit7CisJc3RydWN0IHJzbF9tcnBjaSBtcnBjaTsKKworCWlmIChjbGFzc21hcmsyX2x2WzBdIDwgMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltcnBjaS5wb3dlcl9jbGFzcyA9IGNsYXNzbWFyazJfbHZbMV0gJiAweDc7CisJbXJwY2kudmdjc19jYXBhYmxlID0gY2xhc3NtYXJrMl9sdlsyXSAmICgxIDw8IDEpOworCW1ycGNpLnZic19jYXBhYmxlID0gY2xhc3NtYXJrMl9sdlsyXSAmICgxIDw8Mik7CisJbXJwY2kuZ3NtX3BoYXNlID0gKGNsYXNzbWFyazJfbHZbMV0pID4+IDUgJiAweDM7CisKKwlyZXR1cm4gcnNsX3NpZW1lbnNfbXJwY2kobGNoYW4sICZtcnBjaSk7Cit9CisKK2ludCBnc200OF9wYWdpbmdfZXh0cmFjdF9taShzdHJ1Y3QgbXNnYiAqbXNnLCBjaGFyICptaV9zdHJpbmcsIHVfaW50OF90ICptaV90eXBlKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90ICpjbGFzc21hcmsyX2x2ID0gZ2gtPmRhdGEgKyAxOworCXVfaW50OF90ICptaV9sdiA9IGdoLT5kYXRhICsgMiArICpjbGFzc21hcmsyX2x2OworCSptaV90eXBlID0gbWlfbHZbMV0gJiBHU01fTUlfVFlQRV9NQVNLOworCisJcmV0dXJuIGdzbTQ4X21pX3RvX3N0cmluZyhtaV9zdHJpbmcsIEdTTTQ4X01JX1NJWkUsIG1pX2x2KzEsICptaV9sdik7Cit9CisKK2ludCBnc200OF9oYW5kbGVfcGFnaW5nX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMl9sdiA9IGdoLT5kYXRhICsgMTsKKwlzdHJ1Y3QgcGFnaW5nX3NpZ25hbF9kYXRhIHNpZ19kYXRhOworCisJaWYgKGlzX3NpZW1lbnNfYnRzKGJ0cykpCisJCXNlbmRfc2llbWVuc19tcnBjaShtc2ctPmxjaGFuLCBjbGFzc21hcmsyX2x2KTsKKworCWlmICghbXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IpIHsKKwkJbXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgPSBzdWJzY3I7CisJfSBlbHNlIGlmIChtc2ctPmxjaGFuLT5jb25uLnN1YnNjciAhPSBzdWJzY3IpIHsKKwkJTE9HUChEUlIsIExPR0xfRVJST1IsICI8LSBDaGFubmVsIGFscmVhZHkgb3duZWQgYnkgc29tZW9uZSBlbHNlP1xuIik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJREVCVUdQKERSUiwgIjwtIENoYW5uZWwgYWxyZWFkeSBvd25lZCBieSB1c1xuIik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJc3Vic2NyID0gbXNnLT5sY2hhbi0+Y29ubi5zdWJzY3I7CisJfQorCisJc2lnX2RhdGEuc3Vic2NyID0gc3Vic2NyOworCXNpZ19kYXRhLmJ0cwk9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwlzaWdfZGF0YS5sY2hhbgk9IG1zZy0+bGNoYW47CisKKwlidHMtPm5ldHdvcmstPnN0YXRzLnBhZ2luZy5jb21wbGV0ZWQrKzsKKworCWRpc3BhdGNoX3NpZ25hbChTU19QQUdJTkcsIFNfUEFHSU5HX1NVQ0NFRURFRCwgJnNpZ19kYXRhKTsKKworCS8qIFN0b3AgcGFnaW5nIG9uIHRoZSBidHMgd2UgcmVjZWl2ZWQgdGhlIHBhZ2luZyByZXNwb25zZSAqLworCXBhZ2luZ19yZXF1ZXN0X3N0b3AobXNnLT50cngtPmJ0cywgc3Vic2NyLCBtc2ctPmxjaGFuKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA5LjEuOTogQ2lwaGVyaW5nIE1vZGUgQ29tbWFuZCAqLworaW50IGdzbTQ4X3NlbmRfcnJfY2lwaF9tb2RlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgd2FudF9pbWVpc3YpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwl1X2ludDhfdCBjaXBoX21vZF9zZXQ7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlERUJVR1AoRFJSLCAiVFggQ0lQSEVSSU5HIE1PREUgQ01EXG4iKTsKKworCWlmIChsY2hhbi0+ZW5jci5hbGdfaWQgPD0gUlNMX0VOQ19BTEdfQTUoMCkpCisJCWNpcGhfbW9kX3NldCA9IDA7CisJZWxzZQorCQljaXBoX21vZF9zZXQgPSAobGNoYW4tPmVuY3IuYWxnX2lkLTIpPDwxIHwgMTsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDEpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0NJUEhfTV9DTUQ7CisJZ2gtPmRhdGFbMF0gPSAod2FudF9pbWVpc3YgJiAweDEpIDw8IDQgfCAoY2lwaF9tb2Rfc2V0ICYgMHhmKTsKKworCXJldHVybiByc2xfZW5jcnlwdGlvbl9jbWQobXNnKTsKK30KKworc3RhdGljIHZvaWQgZ3NtNDhfY2VsbF9kZXNjKHN0cnVjdCBnc200OF9jZWxsX2Rlc2MgKmNkLAorCQkJICAgIGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJY2QtPm5jYyA9IChidHMtPmJzaWMgPj4gMyAmIDB4Nyk7CisJY2QtPmJjYyA9IChidHMtPmJzaWMgJiAweDcpOworCWNkLT5hcmZjbl9oaSA9IGJ0cy0+YzAtPmFyZmNuID4+IDg7CisJY2QtPmFyZmNuX2xvID0gYnRzLT5jMC0+YXJmY24gJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBnc200OF9jaGFuX2Rlc2Moc3RydWN0IGdzbTQ4X2NoYW5fZGVzYyAqY2QsCisJCQkgICAgY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJdV9pbnQxNl90IGFyZmNuID0gbGNoYW4tPnRzLT50cngtPmFyZmNuICYgMHgzZmY7CisKKwljZC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCWNkLT5oMC50c2MgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT50c2M7CisJY2QtPmgwLmggPSAwOworCWNkLT5oMC5hcmZjbl9oaWdoID0gYXJmY24gPj4gODsKKwljZC0+aDAuYXJmY25fbG93ID0gYXJmY24gJiAweGZmOworfQorCisvKiBDaGFwdGVyIDkuMS4xNTogSGFuZG92ZXIgQ29tbWFuZCAqLworaW50IGdzbTQ4X3NlbmRfaG9fY21kKHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbiwgc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuLAorCQkgICAgICB1X2ludDhfdCBwb3dlcl9jb21tYW5kLCB1X2ludDhfdCBob19yZWYpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXN0cnVjdCBnc200OF9ob19jbWQgKmhvID0KKwkJKHN0cnVjdCBnc200OF9ob19jbWQgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmhvKSk7CisKKwltc2ctPmxjaGFuID0gb2xkX2xjaGFuOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0hBTkRPX0NNRDsKKworCS8qIG1hbmRhdG9yeSBiaXRzICovCisJZ3NtNDhfY2VsbF9kZXNjKCZoby0+Y2VsbF9kZXNjLCBuZXdfbGNoYW4tPnRzLT50cngtPmJ0cyk7CisJZ3NtNDhfY2hhbl9kZXNjKCZoby0+Y2hhbl9kZXNjLCBuZXdfbGNoYW4pOworCWhvLT5ob19yZWYgPSBob19yZWY7CisJaG8tPnBvd2VyX2NvbW1hbmQgPSBwb3dlcl9jb21tYW5kOworCisJLyogRklYTUU6IG9wdGlvbmFsIGJpdHMgZm9yIHR5cGUgb2Ygc3luY2hyb25pemF0aW9uPyAqLworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogQ2hhcHRlciA5LjEuMjogQXNzaWdubWVudCBDb21tYW5kICovCitpbnQgZ3NtNDhfc2VuZF9ycl9hc3NfY21kKHN0cnVjdCBnc21fbGNoYW4gKmRlc3RfbGNoYW4sIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBwb3dlcl9jb21tYW5kKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlzdHJ1Y3QgZ3NtNDhfYXNzX2NtZCAqYXNzID0KKwkJKHN0cnVjdCBnc200OF9hc3NfY21kICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCphc3MpKTsKKworCURFQlVHUChEUlIsICItPiBBU1NJR05NRU5UIENPTU1BTkQgdGNoX21vZGU9MHglMDJ4XG4iLCBsY2hhbi0+dGNoX21vZGUpOworCisJbXNnLT5sY2hhbiA9IGRlc3RfbGNoYW47CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfUlJfQVNTX0NNRDsKKworCS8qCisJICogZmlsbCB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBlbGVtZW50LCB0aGlzIGNvZGUKKwkgKiBzaG91bGQgcHJvYmFibHkgYmUgc2hhcmVkIHdpdGggcnNsX3J4X2NoYW5fcnFkKCksCisJICogZ3NtNDhfdHhfY2hhbl9tb2RlX21vZGlmeS4gQnV0IGJld2FyZSB0aGF0IDEwLjUuMi41CisJICogMTAuNS4yLjUuYSBoYXZlIHNsaWdodGx5IGRpZmZlcmVudCBzZW1hbnRpYyBmb3IKKwkgKiB0aGUgY2hhbl9kZXNjLiBCdXQgYXMgbG9uZyBhcyBtdWx0aS1zbG90IGNvbmZpZ3VyYXRpb25zCisJICogYXJlIG5vdCB1c2VkIHdlIHNlZW0gdG8gYmUgZmluZS4KKwkgKi8KKwlnc200OF9jaGFuX2Rlc2MoJmFzcy0+Y2hhbl9kZXNjLCBsY2hhbik7CisJYXNzLT5wb3dlcl9jb21tYW5kID0gcG93ZXJfY29tbWFuZDsKKworCW1zZ2JfdHZfcHV0KG1zZywgR1NNNDhfSUVfQ0hBTk1PREVfMSwgbGNoYW4tPnRjaF9tb2RlKTsKKworCS8qIGluIGNhc2Ugb2YgbXVsdGkgcmF0ZSB3ZSBuZWVkIHRvIGF0dGFjaCBhIGNvbmZpZyAqLworCWlmIChsY2hhbi0+dGNoX21vZGUgPT0gR1NNNDhfQ01PREVfU1BFRUNIX0FNUikgeworCQlpZiAobGNoYW4tPm1yX2NvbmYudmVyID09IDApIHsKKwkJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiQlVHOiBVc2luZyBtdWx0aXJhdGUgY29kZWMgIgorCQkJCSJ3aXRob3V0IG11bHRpcmF0ZSBjb25maWcuXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXVfaW50OF90ICpkYXRhID0gbXNnYl9wdXQobXNnLCA0KTsKKwkJCWRhdGFbMF0gPSBHU000OF9JRV9NVUxfUkFURV9DRkc7CisJCQlkYXRhWzFdID0gMHgyOworCQkJbWVtY3B5KCZkYXRhWzJdLCAmbGNoYW4tPm1yX2NvbmYsIDIpOworCQl9CisJfQorCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogOS4xLjUgQ2hhbm5lbCBtb2RlIG1vZGlmeTogTW9kaWZ5IHRoZSBtb2RlIG9uIHRoZSBNUyBzaWRlICovCitpbnQgZ3NtNDhfdHhfY2hhbl9tb2RlX21vZGlmeShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbW9kZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJc3RydWN0IGdzbTQ4X2NoYW5fbW9kZV9tb2RpZnkgKmNtbSA9CisJCShzdHJ1Y3QgZ3NtNDhfY2hhbl9tb2RlX21vZGlmeSAqKSBtc2diX3B1dChtc2csIHNpemVvZigqY21tKSk7CisJdV9pbnQxNl90IGFyZmNuID0gbGNoYW4tPnRzLT50cngtPmFyZmNuICYgMHgzZmY7CisKKwlERUJVR1AoRFJSLCAiLT4gQ0hBTk5FTCBNT0RFIE1PRElGWSBtb2RlPTB4JTAyeFxuIiwgbW9kZSk7CisKKwlsY2hhbi0+dGNoX21vZGUgPSBtb2RlOworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9DSEFOX01PREVfTU9ESUY7CisKKwkvKiBmaWxsIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uIGVsZW1lbnQsIHRoaXMgY29kZQorCSAqIHNob3VsZCBwcm9iYWJseSBiZSBzaGFyZWQgd2l0aCByc2xfcnhfY2hhbl9ycWQoKSAqLworCWNtbS0+Y2hhbl9kZXNjLmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwljbW0tPmNoYW5fZGVzYy5oMC50c2MgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT50c2M7CisJY21tLT5jaGFuX2Rlc2MuaDAuaCA9IDA7CisJY21tLT5jaGFuX2Rlc2MuaDAuYXJmY25faGlnaCA9IGFyZmNuID4+IDg7CisJY21tLT5jaGFuX2Rlc2MuaDAuYXJmY25fbG93ID0gYXJmY24gJiAweGZmOworCWNtbS0+bW9kZSA9IG1vZGU7CisKKwkvKiBpbiBjYXNlIG9mIG11bHRpIHJhdGUgd2UgbmVlZCB0byBhdHRhY2ggYSBjb25maWcgKi8KKwlpZiAobGNoYW4tPnRjaF9tb2RlID09IEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIpIHsKKwkJaWYgKGxjaGFuLT5tcl9jb25mLnZlciA9PSAwKSB7CisJCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkJVRzogVXNpbmcgbXVsdGlyYXRlIGNvZGVjICIKKwkJCQkid2l0aG91dCBtdWx0aXJhdGUgY29uZmlnLlxuIik7CisJCX0gZWxzZSB7CisJCQl1X2ludDhfdCAqZGF0YSA9IG1zZ2JfcHV0KG1zZywgNCk7CisJCQlkYXRhWzBdID0gR1NNNDhfSUVfTVVMX1JBVEVfQ0ZHOworCQkJZGF0YVsxXSA9IDB4MjsKKwkJCW1lbWNweSgmZGF0YVsyXSwgJmxjaGFuLT5tcl9jb25mLCAyKTsKKwkJfQorCX0KKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKK2ludCBnc200OF9sY2hhbl9tb2RpZnkoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxjaGFuX21vZGUpCit7CisJaW50IHJjOworCisJcmMgPSBnc200OF90eF9jaGFuX21vZGVfbW9kaWZ5KGxjaGFuLCBsY2hhbl9tb2RlKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBnc200OF9yeF9ycl9tb2RpZl9hY2soc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbTQ4X2NoYW5fbW9kZV9tb2RpZnkgKm1vZCA9CisJCQkJKHN0cnVjdCBnc200OF9jaGFuX21vZGVfbW9kaWZ5ICopIGdoLT5kYXRhOworCisJREVCVUdQKERSUiwgIkNIQU5ORUwgTU9ERSBNT0RJRlkgQUNLXG4iKTsKKworCWlmIChtb2QtPm1vZGUgIT0gbXNnLT5sY2hhbi0+dGNoX21vZGUpIHsKKwkJTE9HUChEUlIsIExPR0xfRVJST1IsICJDSEFOTkVMIE1PREUgY2hhbmdlIGZhaWxlZC4gV2FudGVkOiAlZCBHb3Q6ICVkXG4iLAorCQkJbXNnLT5sY2hhbi0+dGNoX21vZGUsIG1vZC0+bW9kZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB1cGRhdGUgdGhlIGNoYW5uZWwgdHlwZSAqLworCXN3aXRjaCAobW9kLT5tb2RlKSB7CisJY2FzZSBHU000OF9DTU9ERV9TSUdOOgorCQltc2ctPmxjaGFuLT5yc2xfY21vZGUgPSBSU0xfQ01PRF9TUERfU0lHTjsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfVjE6CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOgorCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0FNUjoKKwkJbXNnLT5sY2hhbi0+cnNsX2Ntb2RlID0gUlNMX0NNT0RfU1BEX1NQRUVDSDsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzE0azU6CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzEyazA6CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzZrMDoKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfM2s2OgorCQltc2ctPmxjaGFuLT5yc2xfY21vZGUgPSBSU0xfQ01PRF9TUERfREFUQTsKKwkJYnJlYWs7CisJfQorCisJLyogV2UndmUgc3VjY2Vzc2Z1bGx5IG1vZGlmaWVkIHRoZSBNUyBzaWRlIG9mIHRoZSBjaGFubmVsLAorCSAqIG5vdyBnbyBvbiB0byBtb2RpZnkgdGhlIEJUUyBzaWRlIG9mIHRoZSBjaGFubmVsICovCisJcmMgPSByc2xfY2hhbl9tb2RlX21vZGlmeV9yZXEobXNnLT5sY2hhbik7CisKKwkvKiBGSVhNRTogd2Ugbm90IG9ubHkgbmVlZCB0byBkbyB0aGlzIGFmdGVyIG1vZGUgbW9kaWZ5LCBidXQKKwkgKiBhbHNvIGFmdGVyIGNoYW5uZWwgYWN0aXZhdGlvbiAqLworCWlmIChpc19pcGFjY2Vzc19idHMobXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzKSAmJiBtb2QtPm1vZGUgIT0gR1NNNDhfQ01PREVfU0lHTikKKwkJcnNsX2lwYWNjX2NyY3gobXNnLT5sY2hhbik7CisJcmV0dXJuIHJjOworfQorCitpbnQgZ3NtNDhfcGFyc2VfbWVhc19yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqcmVwLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXVfaW50OF90ICpkYXRhID0gZ2gtPmRhdGE7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgYml0dmVjICpuYnYgPSAmYnRzLT5zaV9jb21tb24ubmVpZ2hfbGlzdDsKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgKm1yYzsKKworCWlmIChnaC0+bXNnX3R5cGUgIT0gR1NNNDhfTVRfUlJfTUVBU19SRVApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRhdGFbMF0gJiAweDgwKQorCQlyZXAtPmZsYWdzIHw9IE1FQVNfUkVQX0ZfQkExOworCWlmIChkYXRhWzBdICYgMHg0MCkKKwkJcmVwLT5mbGFncyB8PSBNRUFTX1JFUF9GX1VMX0RUWDsKKwlpZiAoKGRhdGFbMV0gJiAweDQwKSA9PSAweDAwKQorCQlyZXAtPmZsYWdzIHw9IE1FQVNfUkVQX0ZfRExfVkFMSUQ7CisKKwlyZXAtPmRsLmZ1bGwucnhfbGV2ID0gZGF0YVswXSAmIDB4M2Y7CisJcmVwLT5kbC5zdWIucnhfbGV2ID0gZGF0YVsxXSAmIDB4M2Y7CisJcmVwLT5kbC5mdWxsLnJ4X3F1YWwgPSAoZGF0YVszXSA+PiA0KSAmIDB4NzsKKwlyZXAtPmRsLnN1Yi5yeF9xdWFsID0gKGRhdGFbM10gPj4gMSkgJiAweDc7CisKKwlyZXAtPm51bV9jZWxsID0gKChkYXRhWzNdID4+IDYpICYgMHgzKSB8ICgoZGF0YVsyXSAmIDB4MDEpIDw8IDIpOworCWlmIChyZXAtPm51bV9jZWxsIDwgMSB8fCByZXAtPm51bV9jZWxsID4gNikKKwkJcmV0dXJuIDA7CisKKwkvKiBhbiBlbmNvZGluZyBuaWdodG1hcmUgaW4gcGVyZmVjdGlvbiAqLworCW1yYyA9ICZyZXAtPmNlbGxbMF07CisJbXJjLT5yeGxldiA9IGRhdGFbM10gJiAweDNmOworCW1yYy0+bmVpZ2hfaWR4ID0gZGF0YVs0XSA+PiAzOworCW1yYy0+YXJmY24gPSBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KG5idiwgbXJjLT5uZWlnaF9pZHggKyAxKTsKKwltcmMtPmJzaWMgPSAoKGRhdGFbNF0gJiAweDA3KSA8PCAzKSB8IChkYXRhWzVdID4+IDUpOworCWlmIChyZXAtPm51bV9jZWxsIDwgMikKKwkJcmV0dXJuIDA7CisKKwltcmMgPSAmcmVwLT5jZWxsWzFdOworCW1yYy0+cnhsZXYgPSAoKGRhdGFbNV0gJiAweDFmKSA8PCAxKSB8IChkYXRhWzZdID4+IDcpOworCW1yYy0+bmVpZ2hfaWR4ID0gKGRhdGFbNl0gPj4gMikgJiAweDFmOworCW1yYy0+YXJmY24gPSBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KG5idiwgbXJjLT5uZWlnaF9pZHggKyAxKTsKKwltcmMtPmJzaWMgPSAoKGRhdGFbNl0gJiAweDAzKSA8PCA0KSB8IChkYXRhWzddID4+IDQpOworCWlmIChyZXAtPm51bV9jZWxsIDwgMykKKwkJcmV0dXJuIDA7CisKKwltcmMgPSAmcmVwLT5jZWxsWzJdOworCW1yYy0+cnhsZXYgPSAoKGRhdGFbN10gJiAweDBmKSA8PCAyKSB8IChkYXRhWzhdID4+IDYpOworCW1yYy0+bmVpZ2hfaWR4ID0gKGRhdGFbOF0gPj4gMSkgJiAweDFmOworCW1yYy0+YXJmY24gPSBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KG5idiwgbXJjLT5uZWlnaF9pZHggKyAxKTsKKwltcmMtPmJzaWMgPSAoKGRhdGFbOF0gJiAweDAxKSA8PCA1KSB8IChkYXRhWzldID4+IDMpOworCWlmIChyZXAtPm51bV9jZWxsIDwgNCkKKwkJcmV0dXJuIDA7CisKKwltcmMgPSAmcmVwLT5jZWxsWzNdOworCW1yYy0+cnhsZXYgPSAoKGRhdGFbOV0gJiAweDA3KSA8PCAzKSB8IChkYXRhWzEwXSA+PiA1KTsKKwltcmMtPm5laWdoX2lkeCA9IGRhdGFbMTBdICYgMHgxZjsKKwltcmMtPmFyZmNuID0gYml0dmVjX2dldF9udGhfc2V0X2JpdChuYnYsIG1yYy0+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gZGF0YVsxMV0gPj4gMjsKKwlpZiAocmVwLT5udW1fY2VsbCA8IDUpCisJCXJldHVybiAwOworCisJbXJjID0gJnJlcC0+Y2VsbFs0XTsKKwltcmMtPnJ4bGV2ID0gKChkYXRhWzExXSAmIDB4MDMpIDw8IDQpIHwgKGRhdGFbMTJdID4+IDQpOworCW1yYy0+bmVpZ2hfaWR4ID0gKChkYXRhWzEyXSAmIDB4ZikgPDwgMSkgfCAoZGF0YVsxM10gPj4gNyk7CisJbXJjLT5hcmZjbiA9IGJpdHZlY19nZXRfbnRoX3NldF9iaXQobmJ2LCBtcmMtPm5laWdoX2lkeCArIDEpOworCW1yYy0+YnNpYyA9IChkYXRhWzEzXSA+PiAxKSAmIDB4M2Y7CisJaWYgKHJlcC0+bnVtX2NlbGwgPCA2KQorCQlyZXR1cm4gMDsKKworCW1yYyA9ICZyZXAtPmNlbGxbNV07CisJbXJjLT5yeGxldiA9ICgoZGF0YVsxM10gJiAweDAxKSA8PCA1KSB8IChkYXRhWzE0XSA+PiAzKTsKKwltcmMtPm5laWdoX2lkeCA9ICgoZGF0YVsxNF0gJiAweDA3KSA8PCAyKSB8IChkYXRhWzE1XSA+PiA2KTsKKwltcmMtPmFyZmNuID0gYml0dmVjX2dldF9udGhfc2V0X2JpdChuYnYsIG1yYy0+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gZGF0YVsxNV0gJiAweDNmOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfMTEuYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8xMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTJmMWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMTEuYwpAQCAtMCwwICsxLDEyMzggQEAKKy8qIFBvaW50LXRvLVBvaW50IChQUCkgU2hvcnQgTWVzc2FnZSBTZXJ2aWNlIChTTVMpCisgKiBTdXBwb3J0IG9uIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDQuMTEgdmVyc2lvbiA3LjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDIgVjcuMS4wICovCisKKy8qIChDKSAyMDA4IGJ5IERhbmllbCBXaWxsbWFubiA8ZGFuaWVsQHRvdGFsdWViZXJ3YWNodW5nLmRlPgorICogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19ybGwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKworI2RlZmluZSBHU000MTFfQUxMT0NfU0laRQkxMDI0CisjZGVmaW5lIEdTTTQxMV9BTExPQ19IRUFEUk9PTQkxMjgKKworI2RlZmluZSBVTV9TQVBJX1NNUyAzCS8qIFNlZSBHU00gMDQuMDUvMDQuMDYgKi8KKwordm9pZCAqdGFsbF9nc21zX2N0eDsKK3N0YXRpYyB1X2ludDMyX3QgbmV3X2NhbGxyZWYgPSAweDQwMDAwMDAxOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBjcF9jYXVzZV9zdHJzW10gPSB7CisJeyBHU000MTFfQ1BfQ0FVU0VfTkVUX0ZBSUwsCSJOZXR3b3JrIEZhaWx1cmUiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfQ09OR0VTVElPTiwJIkNvbmdlc3Rpb24iIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfSU5WX1RSQU5TX0lELAkiSW52YWxpZCBUcmFuc2FjdGlvbiBJRCIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9TRU1BTlRfSU5DX01TRywgIlNlbWFudGljYWxseSBJbmNvcnJlY3QgTWVzc2FnZSIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9JTlZfTUFORF9JTkYsCSJJbnZhbGlkIE1hbmRhdG9yeSBJbmZvcm1hdGlvbiIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9NU0dUWVBFX05PVEVYSVNULCAiTWVzc2FnZSBUeXBlIGRvZXNuJ3QgZXhpc3QiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURSwKKwkJCQkiTWVzc2FnZSBpbmNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9JRV9OT1RFWElTVCwJIklFIGRvZXMgbm90IGV4aXN0IiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX1BST1RPQ09MX0VSUiwJIlByb3RvY29sIEVycm9yIiB9LAorCXsgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBycF9jYXVzZV9zdHJzW10gPSB7CisJeyBHU000MTFfUlBfQ0FVU0VfTU9fTlVNX1VOQVNTSUdORUQsICIoTU8pIE51bWJlciBub3QgYXNzaWduZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fT1BfREVUX0JBUlIsICIoTU8pIE9wZXJhdG9yIGRldGVybWluZWQgYmFycmluZyIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19DQUxMX0JBUlJFRCwgIihNTykgQ2FsbCBiYXJyZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fU01TX1JFSkVDVEVELCAiKE1PKSBTTVMgcmVqZWN0ZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fREVTVF9PVVRfT0ZfT1JERVIsICIoTU8pIERlc3RpbmF0aW9uIG91dCBvZiBvcmRlciIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19VTklERU5USUZJRURfU1VCU0NSLCAiKE1PKSBVbmlkZW50aWZpZWQgc3Vic2NyaWJlciIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19GQUNJTElUWV9SRUosICIoTU8pIEZhY2lsaXR5IHJlamVjdCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19VTktOT1dOX1NVQlNDUiwgIihNTykgVW5rbm93biBzdWJzY3JpYmVyIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX05FVF9PVVRfT0ZfT1JERVIsICIoTU8pIE5ldHdvcmsgb3V0IG9mIG9yZGVyIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1RFTVBfRkFJTCwgIihNTykgVGVtcG9yYXJ5IGZhaWx1cmUiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fQ09OR0VTVElPTiwgIihNTykgQ29uZ2VzdGlvbiIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19SRVNfVU5BVkFJTCwgIihNTykgUmVzb3VyY2UgdW5hdmFpbGFibGUiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fUkVRX0ZBQ19OT1RTVUJTQ1IsICIoTU8pIFJlcXVlc3RlZCBmYWNpbGl0eSBub3Qgc3Vic2NyaWJlZCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19SRVFfRkFDX05PVElNUEwsICIoTU8pIFJlcXVlc3RlZCBmYWNpbGl0eSBub3QgaW1wbGVtZW50ZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fSU5URVJXT1JLSU5HLCAiKE1PKSBJbnRlcndvcmtpbmciIH0sCisJLyogdmFsaWQgb25seSBmb3IgTVQgKi8KKwl7IEdTTTQxMV9SUF9DQVVTRV9NVF9NRU1fRVhDRUVERUQsICIoTVQpIE1lbW9yeSBFeGNlZWRlZCIgfSwKKwkvKiB2YWxpZCBmb3IgYm90aCBkaXJlY3Rpb25zICovCisJeyBHU000MTFfUlBfQ0FVU0VfSU5WX1RSQU5TX1JFRiwgIkludmFsaWQgVHJhbnNhY3Rpb24gUmVmZXJlbmNlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX1NFTUFOVF9JTkNfTVNHLCAiU2VtYW50aWNhbGx5IEluY29ycmVjdCBNZXNzYWdlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX0lOVl9NQU5EX0lORiwgIkludmFsaWQgTWFuZGF0b3J5IEluZm9ybWF0aW9uIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01TR1RZUEVfTk9URVhJU1QsICJNZXNzYWdlIFR5cGUgbm9uLWV4aXN0YW50IiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUsICJNZXNzYWdlIGluY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX0lFX05PVEVYSVNULCAiSW5mb3JtYXRpb24gRWxlbWVudCBub3QgZXhpc3RpbmciIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfUFJPVE9DT0xfRVJSLCAiUHJvdG9jb2wgRXJyb3IiIH0sCisJeyAwLCBOVUxMIH0KK307CisKK3N0cnVjdCBnc21fc21zICpzbXNfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gdGFsbG9jX3plcm8odGFsbF9nc21zX2N0eCwgc3RydWN0IGdzbV9zbXMpOworfQorCit2b2lkIHNtc19mcmVlKHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJLyogZHJvcCByZWZlcmVuY2VzIHRvIHN1YnNjcmliZXIgc3RydWN0dXJlICovCisJaWYgKHNtcy0+c2VuZGVyKQorCQlzdWJzY3JfcHV0KHNtcy0+c2VuZGVyKTsKKwlpZiAoc21zLT5yZWNlaXZlcikKKwkJc3Vic2NyX3B1dChzbXMtPnJlY2VpdmVyKTsKKworCXRhbGxvY19mcmVlKHNtcyk7Cit9CisKK3N0cnVjdCBtc2diICpnc200MTFfbXNnYl9hbGxvYyh2b2lkKQoreworCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKEdTTTQxMV9BTExPQ19TSVpFLCBHU000MTFfQUxMT0NfSEVBRFJPT00sCisJCQkJICAgIkdTTSAwNC4xMSIpOworfQorCitzdGF0aWMgaW50IGdzbTQxMV9zZW5kbXNnKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQoreworCURFQlVHUChEU01TLCAiR1NNNC4xMSBUWCAlc1xuIiwgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisJbXNnLT5sM2ggPSBtc2ctPmRhdGE7CisJcmV0dXJuIGdzbTA4MDhfc3VibWl0X2R0YXAoY29ubiwgbXNnLCBsaW5rX2lkKTsKK30KKworLyogU01DIFRDMSogaXMgZXhwaXJlZCAqLworc3RhdGljIHZvaWQgY3BfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zID0gZGF0YTsKKworCURFQlVHUChEU01TLCAiU01DIFRpbWVyIFRDMSogaXMgZXhwaXJlZCwgY2FsbGluZyB0cmFuc19mcmVlKClcbiIpOworCS8qIEZJWE1FOiB3ZSBuZWVkIHRvIHJlLXRyYW5zbWl0IHRoZSBsYXN0IENQLURBVEEgMS4uMyB0aW1lcyAqLworCXRyYW5zX2ZyZWUodHJhbnMpOworfQorCisvKiBQcmVmaXggbXNnIHdpdGggYSAwNC4wOC8wNC4xMSBDUCBoZWFkZXIgKi8KK3N0YXRpYyBpbnQgZ3NtNDExX2NwX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgIHVfaW50OF90IG1zZ190eXBlKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmdoKSk7CisJLyogT3V0Z29pbmcgbmVlZHMgdGhlIGhpZ2hlc3QgYml0IHNldCAqLworCWdoLT5wcm90b19kaXNjciA9IHRyYW5zLT5wcm90b2NvbCB8ICh0cmFucy0+dHJhbnNhY3Rpb25faWQ8PDQpOworCWdoLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCisJLyogbW9iaWxlIG9yaWdpbmF0aW5nICovCisJc3dpdGNoIChnaC0+bXNnX3R5cGUpIHsKKwljYXNlIEdTTTQxMV9NVF9DUF9EQVRBOgorCQkvKiA1LjIuMy4xLjI6IGVudGVyIE1PLXdhaXQgZm9yIENQLWFjayAqLworCQkvKiA1LjIuMy4yLjM6IGVudGVyIE1ULXdhaXQgZm9yIENQLUFDSyAqLworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19XQUlUX0NQX0FDSzsKKwkJdHJhbnMtPnNtcy5jcF90aW1lci5kYXRhID0gdHJhbnM7CisJCXRyYW5zLT5zbXMuY3BfdGltZXIuY2IgPSBjcF90aW1lcl9leHBpcmVkOworCQkvKiA1LjMuMi4xOiBTZXQgVGltZXIgVEMxQSAqLworCQlic2Nfc2NoZWR1bGVfdGltZXIoJnRyYW5zLT5zbXMuY3BfdGltZXIsIEdTTTQxMV9UTVJfVEMxQSk7CisJCURFQlVHUChEU01TLCAiVFg6IENQLURBVEEgIik7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX0NQX0FDSzoKKwkJREVCVUdQKERTTVMsICJUWDogQ1AtQUNLICIpOworCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9DUF9FUlJPUjoKKwkJREVCVUdQKERTTVMsICJUWDogQ1AtRVJST1IgIik7CisJCWJyZWFrOworCX0KKworCURFQlVHUEMoRFNNUywgInRyYW5zPSV4XG4iLCB0cmFucy0+dHJhbnNhY3Rpb25faWQpOworCisJcmV0dXJuIGdzbTQxMV9zZW5kbXNnKHRyYW5zLT5jb25uLCBtc2csIHRyYW5zLT5zbXMubGlua19pZCk7Cit9CisKKy8qIFByZWZpeCBtc2cgd2l0aCBhIFJQLURBVEEgaGVhZGVyIGFuZCBzZW5kIGFzIENQLURBVEEgKi8KK3N0YXRpYyBpbnQgZ3NtNDExX3JwX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgIHVfaW50OF90IHJwX21zZ190eXBlLCB1X2ludDhfdCBycF9tc2dfcmVmKQoreworCXN0cnVjdCBnc200MTFfcnBfaGRyICpycDsKKwl1X2ludDhfdCBsZW4gPSBtc2ctPmxlbjsKKworCS8qIEdTTSAwNC4xMSBSUC1EQVRBIGhlYWRlciAqLworCXJwID0gKHN0cnVjdCBnc200MTFfcnBfaGRyICopbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpycCkpOworCXJwLT5sZW4gPSBsZW4gKyAyOworCXJwLT5tc2dfdHlwZSA9IHJwX21zZ190eXBlOworCXJwLT5tc2dfcmVmID0gcnBfbXNnX3JlZjsgLyogRklYTUU6IENob29zZSByYW5kb21seSAqLworCisJcmV0dXJuIGdzbTQxMV9jcF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9DUF9EQVRBKTsKK30KKworLyogVHVybiBpbnQgaW50byBzZW1pLW9jdGV0IHJlcHJlc2VudGF0aW9uOiA5OCA9PiAweDg5ICovCitzdGF0aWMgdV9pbnQ4X3QgYmNkaWZ5KHVfaW50OF90IHZhbHVlKQoreworCXVfaW50OF90IHJldDsKKworCXJldCA9IHZhbHVlIC8gMTA7CisJcmV0IHw9ICh2YWx1ZSAlIDEwKSA8PCA0OworCisJcmV0dXJuIHJldDsKK30KKworLyogVHVybiBzZW1pLW9jdGV0IHJlcHJlc2VudGF0aW9uIGludG8gaW50OiAweDg5ID0+IDk4ICovCitzdGF0aWMgdV9pbnQ4X3QgdW5iY2RpZnkodV9pbnQ4X3QgdmFsdWUpCit7CisJdV9pbnQ4X3QgcmV0OworCisJaWYgKCh2YWx1ZSAmIDB4MEYpID4gOSB8fCAodmFsdWUgPj4gNCkgPiA5KQorCQlMT0dQKERTTVMsIExPR0xfRVJST1IsCisJCSAgICAgInVuYmNkaWZ5IGdvdCB0b28gYmlnIG5pYmJsZTogMHglMDJYXG4iLCB2YWx1ZSk7CisKKwlyZXQgPSAodmFsdWUmMHgwRikqMTA7CisJcmV0ICs9IHZhbHVlPj40OworCisJcmV0dXJuIHJldDsKK30KKworLyogR2VuZXJhdGUgMDMuNDAgVFAtU0NUUyAqLworc3RhdGljIHZvaWQgZ3NtMzQwX2dlbl9zY3RzKHVfaW50OF90ICpzY3RzLCB0aW1lX3QgdGltZSkKK3sKKwlzdHJ1Y3QgdG0gKnRtID0gbG9jYWx0aW1lKCZ0aW1lKTsKKworCSpzY3RzKysgPSBiY2RpZnkodG0tPnRtX3llYXIgJSAxMDApOworCSpzY3RzKysgPSBiY2RpZnkodG0tPnRtX21vbiArIDEpOworCSpzY3RzKysgPSBiY2RpZnkodG0tPnRtX21kYXkpOworCSpzY3RzKysgPSBiY2RpZnkodG0tPnRtX2hvdXIpOworCSpzY3RzKysgPSBiY2RpZnkodG0tPnRtX21pbik7CisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1fc2VjKTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9nbXRvZmYvKDYwKjE1KSk7Cit9CisKKy8qIERlY29kZSAwMy40MCBUUC1TQ1RTIChpbnRvIHV0Yy9nbXQgdGltZXN0YW1wKSAqLworc3RhdGljIHRpbWVfdCBnc20zNDBfc2N0cyh1X2ludDhfdCAqc2N0cykKK3sKKwlzdHJ1Y3QgdG0gdG07CisKKwl1X2ludDhfdCB5ciA9IHVuYmNkaWZ5KCpzY3RzKyspOworCisJaWYgKHlyIDw9IDgwKQorCQl0bS50bV95ZWFyID0gMTAwICsgeXI7CisJZWxzZQorCQl0bS50bV95ZWFyID0geXI7CisJdG0udG1fbW9uICA9IHVuYmNkaWZ5KCpzY3RzKyspIC0gMTsKKwl0bS50bV9tZGF5ID0gdW5iY2RpZnkoKnNjdHMrKyk7CisJdG0udG1faG91ciA9IHVuYmNkaWZ5KCpzY3RzKyspOworCXRtLnRtX21pbiAgPSB1bmJjZGlmeSgqc2N0cysrKTsKKwl0bS50bV9zZWMgID0gdW5iY2RpZnkoKnNjdHMrKyk7CisJLyogYWNjb3JkaW5nIHRvIGdzbSAwMy40MCB0aW1lIHpvbmUgaXMKKwkgICAiZXhwcmVzc2VkIGluIHF1YXJ0ZXJzIG9mIGFuIGhvdXIiICovCisJdG0udG1fZ210b2ZmID0gdW5iY2RpZnkoKnNjdHMrKykgKiAxNSo2MDsKKworCXJldHVybiBta3RpbWUoJnRtKTsKK30KKworLyogUmV0dXJuIHRoZSBkZWZhdWx0IHZhbGlkaXR5IHBlcmlvZCBpbiBtaW51dGVzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdnBfZGVmYXVsdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbWludXRlczsKKwkvKiBEZWZhdWx0IHZhbGlkaXR5OiB0d28gZGF5cyAqLworCW1pbnV0ZXMgPSAyNCAqIDYwICogMjsKKwlyZXR1cm4gbWludXRlczsKK30KKworLyogRGVjb2RlIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXQgJ3JlbGF0aXZlJyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3NtMzQwX3ZwX3JlbGF0aXZlKHVfaW50OF90ICpzbXNfdnApCit7CisJLyogQ2hhcHRlciA5LjIuMy4xMi4xICovCisJdV9pbnQ4X3QgdnA7CisJdW5zaWduZWQgbG9uZyBtaW51dGVzOworCisJdnAgPSAqKHNtc192cCk7CisJaWYgKHZwIDw9IDE0MykKKwkJbWludXRlcyA9IHZwICsgMSAqIDU7CisJZWxzZSBpZiAodnAgPD0gMTY3KQorCQltaW51dGVzID0gMTIqNjAgKyAodnAtMTQzKSAqIDMwOworCWVsc2UgaWYgKHZwIDw9IDE5NikKKwkJbWludXRlcyA9IHZwLTE2NiAqIDYwICogMjQ7CisJZWxzZQorCQltaW51dGVzID0gdnAtMTkyICogNjAgKiAyNCAqIDc7CisJcmV0dXJuIG1pbnV0ZXM7Cit9CisKKy8qIERlY29kZSB2YWxpZGl0eSBwZXJpb2QgZm9ybWF0ICdhYnNvbHV0ZScgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdzbTM0MF92cF9hYnNvbHV0ZSh1X2ludDhfdCAqc21zX3ZwKQoreworCS8qIENoYXB0ZXIgOS4yLjMuMTIuMiAqLworCXRpbWVfdCBleHBpcmVzLCBub3c7CisJdW5zaWduZWQgbG9uZyBtaW51dGVzOworCisJZXhwaXJlcyA9IGdzbTM0MF9zY3RzKHNtc192cCk7CisJbm93ID0gbWt0aW1lKGdtdGltZShOVUxMKSk7CisJaWYgKGV4cGlyZXMgPD0gbm93KQorCQltaW51dGVzID0gMDsKKwllbHNlCisJCW1pbnV0ZXMgPSAoZXhwaXJlcy1ub3cpLzYwOworCXJldHVybiBtaW51dGVzOworfQorCisvKiBEZWNvZGUgdmFsaWRpdHkgcGVyaW9kIGZvcm1hdCAncmVsYXRpdmUgaW4gaW50ZWdlciByZXByZXNlbnRhdGlvbicgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdzbTM0MF92cF9yZWxhdGl2ZV9pbnRlZ2VyKHVfaW50OF90ICpzbXNfdnApCit7CisJdV9pbnQ4X3QgdnA7CisJdW5zaWduZWQgbG9uZyBtaW51dGVzOworCXZwID0gKihzbXNfdnApOworCWlmICh2cCA9PSAwKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwKKwkJICAgICAicmVzZXJ2ZWQgcmVsYXRpdmVfaW50ZWdlciB2YWxpZGl0eSBwZXJpb2RcbiIpOworCQlyZXR1cm4gZ3NtMzQwX3ZwX2RlZmF1bHQoKTsKKwl9CisJbWludXRlcyA9IHZwLzYwOworCXJldHVybiBtaW51dGVzOworfQorCisvKiBEZWNvZGUgdmFsaWRpdHkgcGVyaW9kIGZvcm1hdCAncmVsYXRpdmUgaW4gc2VtaS1vY3RldCByZXByZXNlbnRhdGlvbicgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdzbTM0MF92cF9yZWxhdGl2ZV9zZW1pb2N0ZXQodV9pbnQ4X3QgKnNtc192cCkKK3sKKwl1bnNpZ25lZCBsb25nIG1pbnV0ZXM7CisJbWludXRlcyA9IHVuYmNkaWZ5KCpzbXNfdnArKykqNjA7ICAvKiBob3VycyAqLworCW1pbnV0ZXMgKz0gdW5iY2RpZnkoKnNtc192cCsrKTsgICAgLyogbWludXRlcyAqLworCW1pbnV0ZXMgKz0gdW5iY2RpZnkoKnNtc192cCsrKS82MDsgLyogc2Vjb25kcyAqLworCXJldHVybiBtaW51dGVzOworfQorCisvKiBkZWNvZGUgdmFsaWRpdHkgcGVyaW9kLiByZXR1cm4gbWludXRlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3NtMzQwX3ZhbGlkaXR5X3BlcmlvZCh1X2ludDhfdCBzbXNfdnBmLCB1X2ludDhfdCAqc21zX3ZwKQoreworCXVfaW50OF90IGZpOyAvKiBmdW5jdGlvbmFsaXR5IGluZGljYXRvciAqLworCisJc3dpdGNoIChzbXNfdnBmKSB7CisJY2FzZSBHU00zNDBfVFBfVlBGX1JFTEFUSVZFOgorCQlyZXR1cm4gZ3NtMzQwX3ZwX3JlbGF0aXZlKHNtc192cCk7CisJY2FzZSBHU00zNDBfVFBfVlBGX0FCU09MVVRFOgorCQlyZXR1cm4gZ3NtMzQwX3ZwX2Fic29sdXRlKHNtc192cCk7CisJY2FzZSBHU00zNDBfVFBfVlBGX0VOSEFOQ0VEOgorCQkvKiBDaGFwdGVyIDkuMi4zLjEyLjMgKi8KKwkJZmkgPSAqc21zX3ZwKys7CisJCS8qIGlnbm9yZSBhZGRpdGlvbmFsIGZpICovCisJCWlmIChmaSAmICgxPDw3KSkgc21zX3ZwKys7CisJCS8qIHJlYWQgdmFsaWRpdHkgcGVyaW9kIGZvcm1hdCAqLworCQlzd2l0Y2ggKGZpICYgMGIxMTEpIHsKKwkJY2FzZSAwYjAwMDoKKwkJCXJldHVybiBnc20zNDBfdnBfZGVmYXVsdCgpOyAvKiBubyB2cGYgc3BlY2lmaWVkICovCisJCWNhc2UgMGIwMDE6CisJCQlyZXR1cm4gZ3NtMzQwX3ZwX3JlbGF0aXZlKHNtc192cCk7CisJCWNhc2UgMGIwMTA6CisJCQlyZXR1cm4gZ3NtMzQwX3ZwX3JlbGF0aXZlX2ludGVnZXIoc21zX3ZwKTsKKwkJY2FzZSAwYjAxMToKKwkJCXJldHVybiBnc20zNDBfdnBfcmVsYXRpdmVfc2VtaW9jdGV0KHNtc192cCk7CisJCWRlZmF1bHQ6CisJCQkvKiBUaGUgR1NNIHNwZWMgc2F5cyB0aGF0IHRoZSBTQyBzaG91bGQgcmVqZWN0IGFueQorCQkJICAgdW5zdXBwb3J0ZWQgYW5kL29yIHVuZGVmaW5lZCB2YWx1ZXMuIEZJWE1FICovCisJCQlMT0dQKERTTVMsIExPR0xfRVJST1IsCisJCQkgICAgICJSZXNlcnZlZCBlbmhhbmNlZCB2YWxpZGl0eSBwZXJpb2QgZm9ybWF0XG4iKTsKKwkJCXJldHVybiBnc20zNDBfdnBfZGVmYXVsdCgpOworCQl9CisJY2FzZSBHU00zNDBfVFBfVlBGX05PTkU6CisJZGVmYXVsdDoKKwkJcmV0dXJuIGdzbTM0MF92cF9kZWZhdWx0KCk7CisJfQorfQorCisvKiBkZXRlcm1pbmUgY29kaW5nIGFscGhhYmV0IGRlcGVuZGVudCBvbiBHU00gMDMuMzggU2VjdGlvbiA0IERDUyAqLworZW51bSBzbXNfYWxwaGFiZXQgZ3NtMzM4X2dldF9zbXNfYWxwaGFiZXQodV9pbnQ4X3QgZGNzKQoreworCXVfaW50OF90IGNnYml0cyA9IGRjcyA+PiA0OworCWVudW0gc21zX2FscGhhYmV0IGFscGhhID0gRENTX05PTkU7CisKKwlpZiAoKGNnYml0cyAmIDB4YykgPT0gMCkgeworCQlpZiAoY2diaXRzICYgMikKKwkJCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsCisJCQkgICAgICJDb21wcmVzc2VkIFNNUyBub3Qgc3VwcG9ydGVkIHlldFxuIik7CisKKwkJc3dpdGNoICgoZGNzID4+IDIpJjB4MDMpIHsKKwkJY2FzZSAwOgorCQkJYWxwaGEgPSBEQ1NfN0JJVF9ERUZBVUxUOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWFscGhhID0gRENTXzhCSVRfREFUQTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlhbHBoYSA9IERDU19VQ1MyOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKGNnYml0cyA9PSAweGMgfHwgY2diaXRzID09IDB4ZCkKKwkJYWxwaGEgPSBEQ1NfN0JJVF9ERUZBVUxUOworCWVsc2UgaWYgKGNnYml0cyA9PSAweGUpCisJCWFscGhhID0gRENTX1VDUzI7CisJZWxzZSBpZiAoY2diaXRzID09IDB4ZikgeworCQlpZiAoZGNzICYgNCkKKwkJCWFscGhhID0gRENTXzhCSVRfREFUQTsKKwkJZWxzZQorCQkJYWxwaGEgPSBEQ1NfN0JJVF9ERUZBVUxUOworCX0KKworCXJldHVybiBhbHBoYTsKK30KKworc3RhdGljIGludCBnc20zNDBfcnhfc21zX3N1Ym1pdChzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3NtcyAqZ3NtcykKK3sKKwlpZiAoZGJfc21zX3N0b3JlKGdzbXMpICE9IDApIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHN0b3JlIFNNUyBpbiBEYXRhYmFzZVxuIik7CisJCXJldHVybiBHU000MTFfUlBfQ0FVU0VfTU9fTkVUX09VVF9PRl9PUkRFUjsKKwl9CisJLyogZGlzcGF0Y2ggYSBzaWduYWwgdG8gdGVsbCBoaWdoZXIgbGV2ZWwgYWJvdXQgaXQgKi8KKwlkaXNwYXRjaF9zaWduYWwoU1NfU01TLCBTX1NNU19TVUJNSVRURUQsIGdzbXMpOworCS8qIHRyeSBkZWxpdmVyaW5nIHRoZSBTTVMgcmlnaHQgbm93ICovCisJLy9nc200MTFfc2VuZF9zbXNfc3Vic2NyKGdzbXMtPnJlY2VpdmVyLCBnc21zKTsKKworCXJldHVybiAwOworfQorCisvKiBnZW5lcmF0ZSBhIFRQRFUgYWRkcmVzcyBmaWVsZCBjb21wbGlhbnQgd2l0aCAwMy40MCBzZWMuIDkuMS4yLjUgKi8KK3N0YXRpYyBpbnQgZ3NtMzQwX2dlbl9vYSh1X2ludDhfdCAqb2EsIHVuc2lnbmVkIGludCBvYV9sZW4sCisJCQkgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJaW50IGxlbl9pbl9ieXRlczsKKworCW9hWzFdID0gMHhiOTsgLyogbmV0d29ya3Mtc3BlY2lmaWMgbnVtYmVyLCBwcml2YXRlIG51bWJlcmluZyBwbGFuICovCisKKwlsZW5faW5fYnl0ZXMgPSBnc200OF9lbmNvZGVfYmNkX251bWJlcihvYSwgb2FfbGVuLCAxLCBzdWJzY3ItPmV4dGVuc2lvbik7CisKKwkvKiBHU00gMDMuNDAgdGVsbHMgdXMgdGhlIGxlbmd0aCBpcyBpbiAndXNlZnVsIHNlbWktb2N0ZXRzJyAqLworCW9hWzBdID0gc3RybGVuKHN1YnNjci0+ZXh0ZW5zaW9uKSAmIDB4ZmY7CisKKwlyZXR1cm4gbGVuX2luX2J5dGVzOworfQorCisvKiBnZW5lcmF0ZSBhIG1zZ2IgY29udGFpbmluZyBhIFRQRFUgZGVyaXZlZCBmcm9tIHN0cnVjdCBnc21fc21zLAorICogcmV0dXJucyB0b3RhbCBzaXplIG9mIFRQRFUgKi8KK3N0YXRpYyBpbnQgZ3NtMzQwX2dlbl90cGR1KHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJdV9pbnQ4X3QgKnNtc3A7CisJdV9pbnQ4X3Qgb2FbMTJdOwkvKiBtYXggbGVuIHBlciAwMy40MCAqLworCXVfaW50OF90IG9hX2xlbiA9IDA7CisJdV9pbnQ4X3Qgb2N0ZXRfbGVuOworCXVuc2lnbmVkIGludCBvbGRfbXNnX2xlbiA9IG1zZy0+bGVuOworCisJLyogZ2VuZXJhdGUgZmlyc3Qgb2N0ZXQgd2l0aCBtYXNrZWQgYml0cyAqLworCXNtc3AgPSBtc2diX3B1dChtc2csIDEpOworCS8qIFRQLU1USSAobWVzc2FnZSB0eXBlIGluZGljYXRvcikgKi8KKwkqc21zcCA9IEdTTTM0MF9TTVNfREVMSVZFUl9TQzJNUzsKKwkvKiBUUC1NTVMgKG1vcmUgbWVzc2FnZXMgdG8gc2VuZCkgKi8KKwlpZiAoMCAvKiBGSVhNRSAqLykKKwkJKnNtc3AgfD0gMHgwNDsKKwkvKiBUUC1TUkkoZGVsaXZlcikvU1JSKHN1Ym1pdCkgKi8KKwlpZiAoc21zLT5zdGF0dXNfcmVwX3JlcSkKKwkJKnNtc3AgfD0gMHgyMDsKKwkvKiBUUC1VREhJIChpbmRpY2F0aW5nIFRQLVVEIGNvbnRhaW5zIGEgaGVhZGVyKSAqLworCWlmIChzbXMtPnVkX2hkcl9pbmQpCisJCSpzbXNwIHw9IDB4NDA7CisjaWYgMAorCS8qIFRQLVJQIChpbmRpY2F0aW5nIHRoYXQgYSByZXBseSBwYXRoIGV4aXN0cykgKi8KKwlpZiAoc21zLT4KKwkJKnNtc3AgfD0gMHg4MDsKKyNlbmRpZgorCQorCS8qIGdlbmVyYXRlIG9yaWdpbmF0b3IgYWRkcmVzcyAqLworCW9hX2xlbiA9IGdzbTM0MF9nZW5fb2Eob2EsIHNpemVvZihvYSksIHNtcy0+c2VuZGVyKTsKKwlzbXNwID0gbXNnYl9wdXQobXNnLCBvYV9sZW4pOworCW1lbWNweShzbXNwLCBvYSwgb2FfbGVuKTsKKworCS8qIGdlbmVyYXRlIFRQLVBJRCAqLworCXNtc3AgPSBtc2diX3B1dChtc2csIDEpOworCSpzbXNwID0gc21zLT5wcm90b2NvbF9pZDsKKworCS8qIGdlbmVyYXRlIFRQLURDUyAqLworCXNtc3AgPSBtc2diX3B1dChtc2csIDEpOworCSpzbXNwID0gc21zLT5kYXRhX2NvZGluZ19zY2hlbWU7CisKKwkvKiBnZW5lcmF0ZSBUUC1TQ1RTICovCisJc21zcCA9IG1zZ2JfcHV0KG1zZywgNyk7CisJZ3NtMzQwX2dlbl9zY3RzKHNtc3AsIHRpbWUoTlVMTCkpOworCisJLyogZ2VuZXJhdGUgVFAtVURMICovCisJc21zcCA9IG1zZ2JfcHV0KG1zZywgMSk7CisJKnNtc3AgPSBzbXMtPnVzZXJfZGF0YV9sZW47CisKKwkvKiBnZW5lcmF0ZSBUUC1VRCAqLworCXN3aXRjaCAoZ3NtMzM4X2dldF9zbXNfYWxwaGFiZXQoc21zLT5kYXRhX2NvZGluZ19zY2hlbWUpKSB7CisJY2FzZSBEQ1NfN0JJVF9ERUZBVUxUOgorCQlvY3RldF9sZW4gPSBzbXMtPnVzZXJfZGF0YV9sZW4qNy84OworCQlpZiAoc21zLT51c2VyX2RhdGFfbGVuKjclOCAhPSAwKQorCQkJb2N0ZXRfbGVuKys7CisJCS8qIFdhcm5pbmcsIHVzZXJfZGF0YV9sZW4gaW5kaWNhdGVzIHRoZSBhbW91bnQgb2Ygc2VwdGV0cworCQkgKiAoY2hhcmFjdGVycyksIHdlIG5lZWQgYW1vdW50IG9mIG9jdGV0cyBvY2N1cGllZCAqLworCQlzbXNwID0gbXNnYl9wdXQobXNnLCBvY3RldF9sZW4pOworCQltZW1jcHkoc21zcCwgc21zLT51c2VyX2RhdGEsIG9jdGV0X2xlbik7CisJCWJyZWFrOworCWNhc2UgRENTX1VDUzI6CisJY2FzZSBEQ1NfOEJJVF9EQVRBOgorCQlzbXNwID0gbXNnYl9wdXQobXNnLCBzbXMtPnVzZXJfZGF0YV9sZW4pOworCQltZW1jcHkoc21zcCwgc21zLT51c2VyX2RhdGEsIHNtcy0+dXNlcl9kYXRhX2xlbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsICJVbmhhbmRsZWQgRGF0YSBDb2RpbmcgU2NoZW1lOiAweCUwMlhcbiIsCisJCSAgICAgc21zLT5kYXRhX2NvZGluZ19zY2hlbWUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gbXNnLT5sZW4gLSBvbGRfbXNnX2xlbjsKK30KKworLyogcHJvY2VzcyBhbiBpbmNvbWluZyBUUERVIChjYWxsZWQgZnJvbSBSUC1EQVRBKQorICogcmV0dXJuIHZhbHVlID4gMDogUlAgQ0FVU0UgZm9yIEVSUk9SOyA8IDA6IHNpbGVudCBlcnJvcjsgMCA9IHN1Y2Nlc3MgKi8KK3N0YXRpYyBpbnQgZ3NtMzQwX3J4X3RwZHUoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2cpCit7CisJdV9pbnQ4X3QgKnNtc3AgPSBtc2diX3Ntcyhtc2cpOworCXN0cnVjdCBnc21fc21zICpnc21zOworCXVfaW50OF90IHNtc19tdGksIHNtc19tbXMsIHNtc192cGYsIHNtc19hbHBoYWJldCwgc21zX3JwOworCXVfaW50OF90ICpzbXNfdnA7CisJdV9pbnQ4X3QgZGFfbGVuX2J5dGVzOworCXVfaW50OF90IGFkZHJlc3NfbHZbMTJdOyAvKiBhY2NvcmRpbmcgdG8gMDMuNDAgLyA5LjEuMi41ICovCisJaW50IHJjID0gMDsKKworCWNvdW50ZXJfaW5jKGNvbm4tPmJ0cy0+bmV0d29yay0+c3RhdHMuc21zLnN1Ym1pdHRlZCk7CisKKwlnc21zID0gc21zX2FsbG9jKCk7CisJaWYgKCFnc21zKQorCQlyZXR1cm4gR1NNNDExX1JQX0NBVVNFX01PX05FVF9PVVRfT0ZfT1JERVI7CisKKwkvKiBpbnZlcnQgdGhvc2UgZmllbGRzIHdoZXJlIDAgbWVhbnMgYWN0aXZlL3ByZXNlbnQgKi8KKwlzbXNfbXRpID0gKnNtc3AgJiAweDAzOworCXNtc19tbXMgPSAhISgqc21zcCAmIDB4MDQpOworCXNtc192cGYgPSAoKnNtc3AgJiAweDE4KSA+PiAzOworCWdzbXMtPnN0YXR1c19yZXBfcmVxID0gKCpzbXNwICYgMHgyMCk7CisJZ3Ntcy0+dWRfaGRyX2luZCA9ICgqc21zcCAmIDB4NDApOworCXNtc19ycCAgPSAoKnNtc3AgJiAweDgwKTsKKworCXNtc3ArKzsKKwlnc21zLT5tc2dfcmVmID0gKnNtc3ArKzsKKworCS8qIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCWRhX2xlbl9ieXRlcyA9IDIgKyAqc21zcC8yICsgKnNtc3AlMjsKKwlpZiAoZGFfbGVuX2J5dGVzID4gMTIpIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLCAiRGVzdGluYXRpb24gQWRkcmVzcyA+IDEyIGJ5dGVzID8hP1xuIik7CisJCXJjID0gR1NNNDExX1JQX0NBVVNFX1NFTUFOVF9JTkNfTVNHOworCQlnb3RvIG91dDsKKwl9CisJbWVtc2V0KGFkZHJlc3NfbHYsIDAsIHNpemVvZihhZGRyZXNzX2x2KSk7CisJbWVtY3B5KGFkZHJlc3NfbHYsIHNtc3AsIGRhX2xlbl9ieXRlcyk7CisJLyogbWFuZ2xlIGZpcnN0IGJ5dGUgdG8gcmVmbGVjdCBsZW5ndGggaW4gYnl0ZXMsIG5vdCBkaWdpdHMgKi8KKwlhZGRyZXNzX2x2WzBdID0gZGFfbGVuX2J5dGVzIC0gMTsKKwkvKiBjb252ZXJ0IHRvIHJlYWwgbnVtYmVyICovCisJZ3NtNDhfZGVjb2RlX2JjZF9udW1iZXIoZ3Ntcy0+ZGVzdF9hZGRyLCBzaXplb2YoZ3Ntcy0+ZGVzdF9hZGRyKSwgYWRkcmVzc19sdiwgMSk7CisJc21zcCArPSBkYV9sZW5fYnl0ZXM7CisKKwlnc21zLT5wcm90b2NvbF9pZCA9ICpzbXNwKys7CisJZ3Ntcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lID0gKnNtc3ArKzsKKworCXNtc19hbHBoYWJldCA9IGdzbTMzOF9nZXRfc21zX2FscGhhYmV0KGdzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSk7CisKKwlzd2l0Y2ggKHNtc192cGYpIHsKKwljYXNlIEdTTTM0MF9UUF9WUEZfUkVMQVRJVkU6CisJCXNtc192cCA9IHNtc3ArKzsKKwkJYnJlYWs7CisJY2FzZSBHU00zNDBfVFBfVlBGX0FCU09MVVRFOgorCWNhc2UgR1NNMzQwX1RQX1ZQRl9FTkhBTkNFRDoKKwkJc21zX3ZwID0gc21zcDsKKwkJLyogdGhlIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBpbmRpY2F0b3IuLi4gKi8KKwkJaWYgKHNtc192cGYgPT0gR1NNMzQwX1RQX1ZQRl9FTkhBTkNFRCAmJiAqc21zcCAmICgxPDw3KSkKKwkJCXNtc3ArKzsKKwkJc21zcCArPSA3OworCQlicmVhazsKKwljYXNlIEdTTTM0MF9UUF9WUEZfTk9ORToKKwkJc21zX3ZwID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwKKwkJICAgICAiU01TIFZhbGlkaXR5IHBlcmlvZCBub3QgaW1wbGVtZW50ZWQ6IDB4JTAyeFxuIiwgc21zX3ZwZik7CisJCXJldHVybiBHU000MTFfUlBfQ0FVU0VfTU9fTkVUX09VVF9PRl9PUkRFUjsKKwl9CisJZ3Ntcy0+dXNlcl9kYXRhX2xlbiA9ICpzbXNwKys7CisJaWYgKGdzbXMtPnVzZXJfZGF0YV9sZW4pIHsKKwkJbWVtY3B5KGdzbXMtPnVzZXJfZGF0YSwgc21zcCwgZ3Ntcy0+dXNlcl9kYXRhX2xlbik7CisKKwkJc3dpdGNoIChzbXNfYWxwaGFiZXQpIHsKKwkJY2FzZSBEQ1NfN0JJVF9ERUZBVUxUOgorCQkJZ3NtXzdiaXRfZGVjb2RlKGdzbXMtPnRleHQsIHNtc3AsIGdzbXMtPnVzZXJfZGF0YV9sZW4pOworCQkJYnJlYWs7CisJCWNhc2UgRENTXzhCSVRfREFUQToKKwkJY2FzZSBEQ1NfVUNTMjoKKwkJY2FzZSBEQ1NfTk9ORToKKwkJCWJyZWFrOworCQl9CisJfQorCisJZ3Ntcy0+c2VuZGVyID0gc3Vic2NyX2dldChtc2ctPmxjaGFuLT5jb25uLnN1YnNjcik7CisKKwlMT0dQKERTTVMsIExPR0xfSU5GTywgIlJYIFNNUzogU2VuZGVyOiAlcywgTVRJOiAweCUwMngsIFZQRjogMHglMDJ4LCAiCisJICAgICAiTVI6IDB4JTAyeCBQSUQ6IDB4JTAyeCwgRENTOiAweCUwMngsIERBOiAlcywgIgorCSAgICAgIlVzZXJEYXRhTGVuZ3RoOiAweCUwMngsIFVzZXJEYXRhOiBcIiVzXCJcbiIsCisJICAgICBzdWJzY3JfbmFtZShnc21zLT5zZW5kZXIpLCBzbXNfbXRpLCBzbXNfdnBmLCBnc21zLT5tc2dfcmVmLAorCSAgICAgZ3Ntcy0+cHJvdG9jb2xfaWQsIGdzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSwgZ3Ntcy0+ZGVzdF9hZGRyLAorCSAgICAgZ3Ntcy0+dXNlcl9kYXRhX2xlbiwKKwkJCXNtc19hbHBoYWJldCA9PSBEQ1NfN0JJVF9ERUZBVUxUID8gZ3Ntcy0+dGV4dCA6CisJCQkJaGV4ZHVtcChnc21zLT51c2VyX2RhdGEsIGdzbXMtPnVzZXJfZGF0YV9sZW4pKTsKKworCWdzbXMtPnZhbGlkaXR5X21pbnV0ZXMgPSBnc20zNDBfdmFsaWRpdHlfcGVyaW9kKHNtc192cGYsIHNtc192cCk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfU01TLCAwLCBnc21zKTsKKworCS8qIGRldGVybWluZSBnc21zLT5yZWNlaXZlciBiYXNlZCBvbiBkaWFsbGVkIG51bWJlciAqLworCWdzbXMtPnJlY2VpdmVyID0gc3Vic2NyX2dldF9ieV9leHRlbnNpb24oY29ubi0+YnRzLT5uZXR3b3JrLCBnc21zLT5kZXN0X2FkZHIpOworCWlmICghZ3Ntcy0+cmVjZWl2ZXIpIHsKKwkJcmMgPSAxOyAvKiBjYXVzZSAxOiB1bmtub3duIHN1YnNjcmliZXIgKi8KKwkJY291bnRlcl9pbmMoY29ubi0+YnRzLT5uZXR3b3JrLT5zdGF0cy5zbXMubm9fcmVjZWl2ZXIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKHNtc19tdGkpIHsKKwljYXNlIEdTTTM0MF9TTVNfU1VCTUlUX01TMlNDOgorCQkvKiBNUyBpcyBzdWJtaXR0aW5nIGEgU01TICovCisJCXJjID0gZ3NtMzQwX3J4X3Ntc19zdWJtaXQobXNnLCBnc21zKTsKKwkJYnJlYWs7CisJY2FzZSBHU00zNDBfU01TX0NPTU1BTkRfTVMyU0M6CisJY2FzZSBHU00zNDBfU01TX0RFTElWRVJfUkVQX01TMlNDOgorCQlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVW5pbXBsZW1lbnRlZCBNVEkgMHglMDJ4XG4iLCBzbXNfbXRpKTsKKwkJcmMgPSBHU000MTFfUlBfQ0FVU0VfSUVfTk9URVhJU1Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsICJVbmRlZmluZWQgTVRJIDB4JTAyeFxuIiwgc21zX210aSk7CisJCXJjID0gR1NNNDExX1JQX0NBVVNFX0lFX05PVEVYSVNUOworCQlicmVhazsKKwl9CisKKwlpZiAoIXJjICYmICFnc21zLT5yZWNlaXZlcikKKwkJcmMgPSBHU000MTFfUlBfQ0FVU0VfTU9fTlVNX1VOQVNTSUdORUQ7CisKK291dDoKKwlzbXNfZnJlZShnc21zKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnc200MTFfc2VuZF9ycF9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHVfaW50OF90IG1zZ19yZWYpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQxMV9tc2diX2FsbG9jKCk7CisKKwlERUJVR1AoRFNNUywgIlRYOiBTTVMgUlAgQUNLXG4iKTsKKworCXJldHVybiBnc200MTFfcnBfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfUlBfQUNLX01ULCBtc2dfcmVmKTsKK30KKworc3RhdGljIGludCBnc200MTFfc2VuZF9ycF9lcnJvcihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCQl1X2ludDhfdCBtc2dfcmVmLCB1X2ludDhfdCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDExX21zZ2JfYWxsb2MoKTsKKworCW1zZ2JfdHZfcHV0KG1zZywgMSwgY2F1c2UpOworCisJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIlRYOiBTTVMgUlAgRVJST1IsIGNhdXNlICVkICglcylcbiIsIGNhdXNlLAorCQlnZXRfdmFsdWVfc3RyaW5nKHJwX2NhdXNlX3N0cnMsIGNhdXNlKSk7CisKKwlyZXR1cm4gZ3NtNDExX3JwX3NlbmRtc2cobXNnLCB0cmFucywgR1NNNDExX01UX1JQX0VSUk9SX01ULCBtc2dfcmVmKTsKK30KKworLyogUmVjZWl2ZSBhIDA0LjExIFRQRFUgaW5zaWRlIFJQLURBVEEgLyB1c2VyIGRhdGEgKi8KK3N0YXRpYyBpbnQgZ3NtNDExX3J4X3JwX3VkKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJICBzdHJ1Y3QgZ3NtNDExX3JwX2hkciAqcnBoLAorCQkJICB1X2ludDhfdCBzcmNfbGVuLCB1X2ludDhfdCAqc3JjLAorCQkJICB1X2ludDhfdCBkc3RfbGVuLCB1X2ludDhfdCAqZHN0LAorCQkJICB1X2ludDhfdCB0cGR1X2xlbiwgdV9pbnQ4X3QgKnRwZHUpCit7CisJaW50IHJjID0gMDsKKworCWlmIChzcmNfbGVuICYmIHNyYykKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLCAiUlAtREFUQSAoTU8pIHdpdGggU1JDID8hP1xuIik7CisKKwlpZiAoIWRzdF9sZW4gfHwgIWRzdCB8fCAhdHBkdV9sZW4gfHwgIXRwZHUpIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLAorCQkJIlJQLURBVEEgKE1PKSB3aXRob3V0IERTVCBvciBUUERVID8hP1xuIik7CisJCWdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsCisJCQkJICAgICBHU000MTFfUlBfQ0FVU0VfSU5WX01BTkRfSU5GKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW1zZy0+bDRoID0gdHBkdTsKKworCURFQlVHUChEU01TLCAiRFNUKCV1LCVzKVxuIiwgZHN0X2xlbiwgaGV4ZHVtcChkc3QsIGRzdF9sZW4pKTsKKworCXJjID0gZ3NtMzQwX3J4X3RwZHUodHJhbnMtPmNvbm4sIG1zZyk7CisJaWYgKHJjID09IDApCisJCXJldHVybiBnc200MTFfc2VuZF9ycF9hY2sodHJhbnMsIHJwaC0+bXNnX3JlZik7CisJZWxzZSBpZiAocmMgPiAwKQorCQlyZXR1cm4gZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwaC0+bXNnX3JlZiwgcmMpOworCWVsc2UKKwkJcmV0dXJuIHJjOworfQorCisvKiBSZWNlaXZlIGEgMDQuMTEgUlAtREFUQSBtZXNzYWdlIGluIGFjY29yZGFuY2Ugd2l0aCBTZWN0aW9uIDcuMy4xLjIgKi8KK3N0YXRpYyBpbnQgZ3NtNDExX3J4X3JwX2RhdGEoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgpCit7CisJdV9pbnQ4X3Qgc3JjX2xlbiwgZHN0X2xlbiwgcnB1ZF9sZW47CisJdV9pbnQ4X3QgKnNyYyA9IE5VTEwsICpkc3QgPSBOVUxMICwgKnJwX3VkID0gTlVMTDsKKworCS8qIGluIHRoZSBNTyBjYXNlLCB0aGlzIHNob3VsZCBhbHdheXMgYmUgemVybyBsZW5ndGggKi8KKwlzcmNfbGVuID0gcnBoLT5kYXRhWzBdOworCWlmIChzcmNfbGVuKQorCQlzcmMgPSAmcnBoLT5kYXRhWzFdOworCisJZHN0X2xlbiA9IHJwaC0+ZGF0YVsxK3NyY19sZW5dOworCWlmIChkc3RfbGVuKQorCQlkc3QgPSAmcnBoLT5kYXRhWzErc3JjX2xlbisxXTsKKworCXJwdWRfbGVuID0gcnBoLT5kYXRhWzErc3JjX2xlbisxK2RzdF9sZW5dOworCWlmIChycHVkX2xlbikKKwkJcnBfdWQgPSAmcnBoLT5kYXRhWzErc3JjX2xlbisxK2RzdF9sZW4rMV07CisKKwlERUJVR1AoRFNNUywgIlJYX1JQLURBVEE6IHNyY19sZW49JXUsIGRzdF9sZW49JXUgdWRfbGVuPSV1XG4iLAorCQlzcmNfbGVuLCBkc3RfbGVuLCBycHVkX2xlbik7CisJcmV0dXJuIGdzbTQxMV9yeF9ycF91ZChtc2csIHRyYW5zLCBycGgsIHNyY19sZW4sIHNyYywgZHN0X2xlbiwgZHN0LAorCQkJCXJwdWRfbGVuLCBycF91ZCk7Cit9CisKKy8qIFJlY2VpdmUgYSAwNC4xMSBSUC1BQ0sgbWVzc2FnZSAocmVzcG9uc2UgdG8gUlAtREFUQSBmcm9tIHVzKSAqLworc3RhdGljIGludCBnc200MTFfcnhfcnBfYWNrKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJICAgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHRyYW5zLT5zbXMuc21zOworCisJLyogQWNua293bGVkZ2VtZW50IHRvIE1UIFJQX0RBVEEsIGkuZS4gdGhlIE1TIGNvbmZpcm1zIGl0CisJICogc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGEgU01TLiAgV2UgY2FuIG5vdyBzYWZlbHkgbWFyayBpdCBhcworCSAqIHRyYW5zbWl0dGVkICovCisKKwlpZiAoIXRyYW5zLT5zbXMuaXNfbXQpIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLCAiUlggUlAtQUNLIG9uIGEgTU8gdHJhbnNmZXIgP1xuIik7CisJCXJldHVybiBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBoLT5tc2dfcmVmLAorCQkJCQkgICAgR1NNNDExX1JQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUpOworCX0KKworCWlmICghc21zKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIlJYIFJQLUFDSyBidXQgbm8gc21zIGluIHRyYW5zYWN0aW9uPyE/XG4iKTsKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsCisJCQkJCSAgICBHU000MTFfUlBfQ0FVU0VfUFJPVE9DT0xfRVJSKTsKKwl9CisKKwkvKiBtYXJrIHRoaXMgU01TIGFzIHNlbnQgaW4gZGF0YWJhc2UgKi8KKwlkYl9zbXNfbWFya19zZW50KHNtcyk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfU01TLCBTX1NNU19ERUxJVkVSRUQsIHNtcyk7CisKKwlzbXNfZnJlZShzbXMpOworCXRyYW5zLT5zbXMuc21zID0gTlVMTDsKKworCS8qIGNoZWNrIGZvciBtb3JlIG1lc3NhZ2VzIGZvciB0aGlzIHN1YnNjcmliZXIgKi8KKwlhc3NlcnQobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgPT0gdHJhbnMtPnN1YnNjcik7CisKKwlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKHRyYW5zLT5zdWJzY3IpOworCWlmIChzbXMpCisJCWdzbTQxMV9zZW5kX3Ntc19sY2hhbih0cmFucy0+Y29ubiwgc21zKTsKKworCS8qIGZyZWUgdGhlIHRyYW5zYWN0aW9uIGhlcmUgKi8KKwl0cmFuc19mcmVlKHRyYW5zKTsKKworCS8qIHJlbGVhc2UgY2hhbm5lbCBpZiBkb25lICovCisjd2FybmluZyAiQlJPS0VOLiBUaGUgU0FQSSB3aWxsIGJlIHJlbGVhc2VkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIEJTQyIKKwlpZiAoIXNtcykKKwkJcnNsX3JlbGVhc2VfcmVxdWVzdChtc2ctPmxjaGFuLCB0cmFucy0+c21zLmxpbmtfaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3J4X3JwX2Vycm9yKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJICAgICAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCkKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHRyYW5zLT5jb25uLT5idHMtPm5ldHdvcms7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHRyYW5zLT5zbXMuc21zOworCXVfaW50OF90IGNhdXNlX2xlbiA9IHJwaC0+ZGF0YVswXTsKKwl1X2ludDhfdCBjYXVzZSA9IHJwaC0+ZGF0YVsxXTsKKworCS8qIEVycm9yIGluIHJlc3BvbnNlIHRvIE1UIFJQX0RBVEEsIGkuZS4gdGhlIE1TIGRpZCBub3QKKwkgKiBzdWNjZXNzZnVsbHkgcmVjZWl2ZSB0aGUgU01TLiAgV2UgbmVlZCB0byBpbnZlc3RpZ2F0ZQorCSAqIHRoZSBjYXVzZSBhbmQgdGFrZSBhY3Rpb24gZGVwZW5kaW5nIG9uIGl0ICovCisKKwlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiJXM6IFJYIFNNUyBSUC1FUlJPUiwgY2F1c2UgJWQ6JWQgKCVzKVxuIiwKKwkgICAgIHN1YnNjcl9uYW1lKHRyYW5zLT5jb25uLT5zdWJzY3IpLCBjYXVzZV9sZW4sIGNhdXNlLAorCSAgICAgZ2V0X3ZhbHVlX3N0cmluZyhycF9jYXVzZV9zdHJzLCBjYXVzZSkpOworCisJaWYgKCF0cmFucy0+c21zLmlzX210KSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIlJYIFJQLUVSUiBvbiBhIE1PIHRyYW5zZmVyID9cbiIpOworI2lmIDAKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsCisJCQkJCSAgICBHU000MTFfUlBfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURSk7CisjZW5kaWYKKwl9CisKKwlpZiAoIXNtcykgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsCisJCQkiUlggUlAtRVJSLCBidXQgbm8gc21zIGluIHRyYW5zYWN0aW9uPyE/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisjaWYgMAorCQlyZXR1cm4gZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwaC0+bXNnX3JlZiwKKwkJCQkJICAgIEdTTTQxMV9SUF9DQVVTRV9QUk9UT0NPTF9FUlIpOworI2VuZGlmCisJfQorCisJaWYgKGNhdXNlID09IEdTTTQxMV9SUF9DQVVTRV9NVF9NRU1fRVhDRUVERUQpIHsKKwkJLyogTVMgaGFzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHN0b3JlIHRoZSBtZXNzYWdlLiAgV2UgbmVlZAorCQkgKiB0byBzdG9yZSB0aGlzIGluIG91ciBkYXRhYmFzZSBhbmQgd2F0aSBmb3IgYSBTTU1BIG1lc3NhZ2UgKi8KKwkJLyogRklYTUUgKi8KKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX1NNUywgU19TTVNfTUVNX0VYQ0VFREVELCB0cmFucy0+c3Vic2NyKTsKKwkJY291bnRlcl9pbmMobmV0LT5zdGF0cy5zbXMucnBfZXJyX21lbSk7CisJfSBlbHNlCisJCWNvdW50ZXJfaW5jKG5ldC0+c3RhdHMuc21zLnJwX2Vycl9vdGhlcik7CisKKwlzbXNfZnJlZShzbXMpOworCXRyYW5zLT5zbXMuc21zID0gTlVMTDsKKworCS8vdHJhbnNfZnJlZSh0cmFucyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200MTFfcnhfcnBfc21tYShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgICAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCWludCByYzsKKworCXJjID0gZ3NtNDExX3NlbmRfcnBfYWNrKHRyYW5zLCBycGgtPm1zZ19yZWYpOworCXRyYW5zLT5zbXMucnBfc3RhdGUgPSBHU000MTFfUlBTX0lETEU7CisKKwkvKiBNUyB0ZWxscyB1cyB0aGF0IGl0IGhhcyBtZW1vcnkgZm9yIG1vcmUgU01TLCB3ZSBuZWVkCisJICogdG8gY2hlY2sgaWYgd2UgaGF2ZSBhbnkgcGVuZGluZyBtZXNzYWdlcyBmb3IgaXQgYW5kIHRoZW4KKwkgKiB0cmFuc2ZlciB0aG9zZSAqLworCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIFNfU01TX1NNTUEsIHRyYW5zLT5zdWJzY3IpOworCisJLyogY2hlY2sgZm9yIG1vcmUgbWVzc2FnZXMgZm9yIHRoaXMgc3Vic2NyaWJlciAqLworCWFzc2VydChtc2ctPmxjaGFuLT5jb25uLnN1YnNjciA9PSB0cmFucy0+c3Vic2NyKTsKKwlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKHRyYW5zLT5zdWJzY3IpOworCWlmIChzbXMpCisJCWdzbTQxMV9zZW5kX3Ntc19sY2hhbih0cmFucy0+Y29ubiwgc21zKTsKKwllbHNlCisJCXJzbF9yZWxlYXNlX3JlcXVlc3QobXNnLT5sY2hhbiwgdHJhbnMtPnNtcy5saW5rX2lkKTsKKyN3YXJuaW5nICJCUk9LRU46IFRoZSBTQVBJPTMgd2lsbCBiZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBCU0MiCisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3J4X2NwX2RhdGEoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbTQ4X2hkciAqZ2gsCisJCQkgICAgIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBnc200MTFfcnBfaGRyICpycF9kYXRhID0gKHN0cnVjdCBnc200MTFfcnBfaGRyKikmZ2gtPmRhdGE7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSAgcnBfZGF0YS0+bXNnX3R5cGUgJiAweDA3OworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBHU000MTFfTVRfUlBfREFUQV9NTzoKKwkJREVCVUdQKERTTVMsICJSWCBTTVMgUlAtREFUQSAoTU8pXG4iKTsKKwkJLyogc3RhcnQgVFIyTiBhbmQgZW50ZXIgJ3dhaXQgdG8gc2VuZCBSUC1BQ0sgc3RhdGUnICovCisJCXRyYW5zLT5zbXMucnBfc3RhdGUgPSBHU000MTFfUlBTX1dBSVRfVE9fVFhfUlBfQUNLOworCQlyYyA9IGdzbTQxMV9yeF9ycF9kYXRhKG1zZywgdHJhbnMsIHJwX2RhdGEpOworCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9SUF9BQ0tfTU86CisJCURFQlVHUChEU01TLCJSWCBTTVMgUlAtQUNLIChNTylcbiIpOworCQlyYyA9IGdzbTQxMV9yeF9ycF9hY2sobXNnLCB0cmFucywgcnBfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX1JQX1NNTUFfTU86CisJCURFQlVHUChEU01TLCAiUlggU01TIFJQLVNNTUFcbiIpOworCQkvKiBzdGFydCBUUjJOIGFuZCBlbnRlciAnd2FpdCB0byBzZW5kIFJQLUFDSyBzdGF0ZScgKi8KKwkJdHJhbnMtPnNtcy5ycF9zdGF0ZSA9IEdTTTQxMV9SUFNfV0FJVF9UT19UWF9SUF9BQ0s7CisJCXJjID0gZ3NtNDExX3J4X3JwX3NtbWEobXNnLCB0cmFucywgcnBfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX1JQX0VSUk9SX01POgorCQlyYyA9IGdzbTQxMV9yeF9ycF9lcnJvcihtc2csIHRyYW5zLCBycF9kYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIkludmFsaWQgUlAgdHlwZSAweCUwMnhcbiIsIG1zZ190eXBlKTsKKwkJcmMgPSBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBfZGF0YS0+bXNnX3JlZiwKKwkJCQkJICBHU000MTFfUlBfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogc2VuZCBDUC1BQ0sgdG8gZ2l2ZW4gdHJhbnNhY3Rpb24gKi8KK3N0YXRpYyBpbnQgZ3NtNDExX3R4X2NwX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDExX21zZ2JfYWxsb2MoKTsKKwlpbnQgcmM7CisKKwlyYyA9IGdzbTQxMV9jcF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9DUF9BQ0spOworCisJaWYgKHRyYW5zLT5zbXMuaXNfbXQpIHsKKwkJLyogSWYgdGhpcyBpcyBhIE1UIFNNUyBERUxJVkVSLCB3ZSBjYW4gY2xlYXIgdHJhbnNhY3Rpb24gaGVyZSAqLworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQkvL3RyYW5zX2ZyZWUodHJhbnMpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnc200MTFfdHhfY3BfZXJyb3Ioc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHVfaW50OF90IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOworCXVfaW50OF90ICpjYXVzZXA7CisKKwlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVFggQ1AtRVJST1IsIGNhdXNlICVkICglcylcbiIsIGNhdXNlLAorCQlnZXRfdmFsdWVfc3RyaW5nKGNwX2NhdXNlX3N0cnMsIGNhdXNlKSk7CisKKwljYXVzZXAgPSBtc2diX3B1dChtc2csIDEpOworCSpjYXVzZXAgPSBjYXVzZTsKKworCXJldHVybiBnc200MTFfY3Bfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfQ1BfRVJST1IpOworfQorCisvKiBFbnRyeSBwb2ludCBmb3IgaW5jb21pbmcgR1NNNDhfUERJU0NfU01TIGZyb20gYWJpc19yc2wuYyAqLworaW50IGdzbTA0MTFfcmN2X3NtcyhzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IG1zZ190eXBlID0gZ2gtPm1zZ190eXBlOworCXVfaW50OF90IHRyYW5zYWN0aW9uX2lkID0gKChnaC0+cHJvdG9fZGlzY3IgPj4gNCkgXiAweDgpOyAvKiBmbGlwICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCWludCByYyA9IDA7CisKKwlpZiAoIWxjaGFuLT5jb25uLnN1YnNjcikKKwkJcmV0dXJuIC1FSU87CisJCS8qIEZJWE1FOiBzZW5kIHNvbWUgZXJyb3IgbWVzc2FnZSAqLworCisJREVCVUdQKERTTVMsICJ0cmFuc19pZD0leCAiLCB0cmFuc2FjdGlvbl9pZCk7CisJdHJhbnMgPSB0cmFuc19maW5kX2J5X2lkKGxjaGFuLT5jb25uLnN1YnNjciwgR1NNNDhfUERJU0NfU01TLAorCQkJCSB0cmFuc2FjdGlvbl9pZCk7CisJaWYgKCF0cmFucykgeworCQlERUJVR1BDKERTTVMsICIobmV3KSAiKTsKKwkJdHJhbnMgPSB0cmFuc19hbGxvYyhsY2hhbi0+Y29ubi5zdWJzY3IsIEdTTTQ4X1BESVNDX1NNUywKKwkJCQkgICAgdHJhbnNhY3Rpb25faWQsIG5ld19jYWxscmVmKyspOworCQlpZiAoIXRyYW5zKSB7CisJCQlERUJVR1BDKERTTVMsICJObyBtZW1vcnkgZm9yIHRyYW5zXG4iKTsKKwkJCS8qIEZJWE1FOiBzZW5kIHNvbWUgZXJyb3IgbWVzc2FnZSAqLworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJdHJhbnMtPnNtcy5ycF9zdGF0ZSA9IEdTTTQxMV9SUFNfSURMRTsKKwkJdHJhbnMtPnNtcy5pc19tdCA9IDA7CisJCXRyYW5zLT5zbXMubGlua19pZCA9IGxpbmtfaWQ7CisKKwkJdHJhbnMtPmNvbm4gPSAmbGNoYW4tPmNvbm47CisJCXVzZV9zdWJzY3JfY29uKHRyYW5zLT5jb25uKTsKKwl9CisKKwlzd2l0Y2gobXNnX3R5cGUpIHsKKwljYXNlIEdTTTQxMV9NVF9DUF9EQVRBOgorCQlERUJVR1BDKERTTVMsICJSWCBTTVMgQ1AtREFUQVxuIik7CisKKwkJLyogNS40OiBGb3IgTU8sIGlmIGEgQ1AtREFUQSBpcyByZWNlaXZlZCBmb3IgYSBuZXcKKwkJICogdHJhbnNhY3Rpb24sIGVxdWFscyByZWNlcHRpb24gb2YgYW4gaW1wbGljaXQKKwkJICogbGFzdCBDUC1BQ0sgZm9yIHByZXZpb3VzIHRyYW5zYWN0aW9uICovCisJCWlmICh0cmFucy0+c21zLmNwX3N0YXRlID09IEdTTTQxMV9DUFNfSURMRSkgeworCQkJaW50IGk7CisJCQlzdHJ1Y3QgZ3NtX3RyYW5zICpwdHJhbnM7CisKKwkJCS8qIFNjYW4gdGhyb3VnaCBhbGwgcmVtb3RlIGluaXRpYXRlZCB0cmFuc2FjdGlvbnMgKi8KKwkJCWZvciAoaT04OyBpPDE1OyBpKyspIHsKKwkJCQlpZiAoaSA9PSB0cmFuc2FjdGlvbl9pZCkKKwkJCQkJY29udGludWU7CisKKwkJCQlwdHJhbnMgPSB0cmFuc19maW5kX2J5X2lkKGxjaGFuLT5jb25uLnN1YnNjciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIEdTTTQ4X1BESVNDX1NNUywgaSk7CisJCQkJaWYgKCFwdHJhbnMpCisJCQkJCWNvbnRpbnVlOworCisJCQkJREVCVUdQKERTTVMsICJJbXBsaWNpdCBDUC1BQ0sgZm9yIHRyYW5zX2lkPSV4XG4iLCBpKTsKKworCQkJCS8qIEZpbmlzaCBpdCBmb3IgZ29vZCAqLworCQkJCWJzY19kZWxfdGltZXIoJnB0cmFucy0+c21zLmNwX3RpbWVyKTsKKwkJCQlwdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJCQl0cmFuc19mcmVlKHB0cmFucyk7CisJCQl9CisJCX0KKworCQkvKiA1LjIuMy4xLjM6IE1PIHN0YXRlIGV4aXN0cyB3aGVuIFNNQyBoYXMgcmVjZWl2ZWQKKwkJICogQ1AtREFUQSwgaW5jbHVkaW5nIHNlbmRpbmcgb2YgdGhlIGFzc29jLiBDUC1BQ0sgKi8KKwkJLyogNS4yLjMuMi40OiBNVCBzdGF0ZSBleGlzdHMgd2hlbiBTTUMgaGFzIHJlY2VpdmVkCisJCSAqIENQLURBVEEsIGluY2x1ZGluZyBzZW5kaW5nIG9mIHRoZSBhc3NvYy4gQ1AtQUNLICovCisJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX01NX0VTVEFCTElTSEVEOworCisJCS8qIFNNQyBpbnN0YW5jZSBhY2tub3dsZWRnZXMgdGhlIENQLURBVEEgZnJhbWUgKi8KKwkJZ3NtNDExX3R4X2NwX2Fjayh0cmFucyk7CisJCQorCQlyYyA9IGdzbTQxMV9yeF9jcF9kYXRhKG1zZywgZ2gsIHRyYW5zKTsKKyNpZiAwCisJCS8qIFNlbmQgQ1AtQUNLIG9yIENQLUVST1JSIGluIHJlc3BvbnNlICovCisJCWlmIChyYyA8IDApIHsKKwkJCXJjID0gZ3NtNDExX3R4X2NwX2Vycm9yKHRyYW5zLCBHU000MTFfQ1BfQ0FVU0VfTkVUX0ZBSUwpOworCQl9IGVsc2UKKwkJCXJjID0gZ3NtNDExX3R4X2NwX2Fjayh0cmFucyk7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBHU000MTFfTVRfQ1BfQUNLOgorCQkvKiBwcmV2aW91cyBDUC1EQVRBIGluIHRoaXMgdHJhbnNhY3Rpb24gd2FzIGNvbmZpcm1lZCAqLworCQlERUJVR1BDKERTTVMsICJSWCBTTVMgQ1AtQUNLXG4iKTsKKwkJLyogNS4yLjMuMS4zOiBNTyBzdGF0ZSBleGlzdHMgd2hlbiBTTUMgaGFzIHJlY2VpdmVkIENQLUFDSyAqLworCQkvKiA1LjIuMy4yLjQ6IE1UIHN0YXRlIGV4aXN0cyB3aGVuIFNNQyBoYXMgcmVjZWl2ZWQgQ1AtQUNLICovCisJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX01NX0VTVEFCTElTSEVEOworCQkvKiBTdG9wIFRDMSogYWZ0ZXIgQ1AtQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCisJCWJzY19kZWxfdGltZXIoJnRyYW5zLT5zbXMuY3BfdGltZXIpOworCisJCWlmICghdHJhbnMtPnNtcy5pc19tdCkgeworCQkJLyogRklYTUU6IHdlIGhhdmUgc29udCBvbmUgQ1AtREFUQSwgd2hpY2ggd2FzIG5vdworCQkJICogYWNrbm93bGVkZ2VkLiAgQ2hlY2sgaWYgd2Ugd2FudCB0byB0cmFuc2ZlciBtb3JlLAorCQkJICogaS5lLiBtdWx0aS1wYXJ0IG1lc3NhZ2UgKi8KKwkJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9DUF9FUlJPUjoKKwkJREVCVUdQQyhEU01TLCAiUlggU01TIENQLUVSUk9SLCBjYXVzZSAlZCAoJXMpXG4iLCBnaC0+ZGF0YVswXSwKKwkJCWdldF92YWx1ZV9zdHJpbmcoY3BfY2F1c2Vfc3RycywgZ2gtPmRhdGFbMF0pKTsKKwkJYnNjX2RlbF90aW1lcigmdHJhbnMtPnNtcy5jcF90aW1lcik7CisJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJCXRyYW5zX2ZyZWUodHJhbnMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKERTTVMsICJSWCBVbmltcGxlbWVudGVkIENQIG1zZ190eXBlOiAweCUwMnhcbiIsIG1zZ190eXBlKTsKKwkJcmMgPSBnc200MTFfdHhfY3BfZXJyb3IodHJhbnMsIEdTTTQxMV9DUF9DQVVTRV9NU0dUWVBFX05PVEVYSVNUKTsKKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworI2lmIDAKKy8qIFRlc3QgVFBEVSAtIEFMTCBZT1VSICovCitzdGF0aWMgdV9pbnQ4X3QgdHBkdV90ZXN0W10gPSB7CisJMHgwNCwgMHgwNCwgMHg4MSwgMHgzMiwgMHgyNCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgyMSwgMHgwMywgMHg0MSwgMHgyNCwKKwkweDMyLCAweDQwLCAweDFGLCAweDQxLCAweDI2LCAweDEzLCAweDk0LCAweDdELCAweDU2LCAweEE1LCAweDIwLCAweDI4LAorCTB4RjIsIDB4RTksIDB4MkMsIDB4ODIsIDB4ODIsIDB4RDIsIDB4MjIsIDB4NDgsIDB4NTgsIDB4NjQsIDB4M0UsIDB4OUQsCisJMHg0NywgMHgxMCwgMHhGNSwgMHgwOSwgMHhBQSwgMHg0RSwgMHgwMQorfTsKKyNlbmRpZgorCisvKiBUYWtlIGEgU01TIGluIGdzbV9zbXMgc3RydWN0dXJlIGFuZCBzZW5kIGl0IHRocm91Z2ggYW4gYWxyZWFkeQorICogZXhpc3RpbmcgbGNoYW4uIFdlIGFsc28gYXNzdW1lIHRoYXQgdGhlIGNhbGxlciBlbnN1cmVkIHRoaXMgbGNoYW4gYWxyZWFkeQorICogaGFzIGEgU0FQSTMgUkxMIGNvbm5lY3Rpb24hICovCitpbnQgZ3NtNDExX3NlbmRfc21zX2xjaGFuKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCXVfaW50OF90ICpkYXRhLCAqcnBfdWRfbGVuOworCXVfaW50OF90IG1zZ19yZWYgPSA0MjsKKwlpbnQgdHJhbnNhY3Rpb25faWQ7CisJaW50IHJjOworCisJdHJhbnNhY3Rpb25faWQgPSB0cmFuc19hc3NpZ25fdHJhbnNfaWQoY29ubi0+c3Vic2NyLCBHU000OF9QRElTQ19TTVMsIDApOworCWlmICh0cmFuc2FjdGlvbl9pZCA9PSAtMSkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJObyBhdmFpbGFibGUgdHJhbnNhY3Rpb24gaWRzXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlERUJVR1AoRFNNUywgInNlbmRfc21zX2xjaGFuKClcbiIpOworCisJLyogRklYTUU6IGFsbG9jYXRlIHRyYW5zYWN0aW9uIHdpdGggbWVzc2FnZSByZWZlcmVuY2UgKi8KKwl0cmFucyA9IHRyYW5zX2FsbG9jKGNvbm4tPnN1YnNjciwgR1NNNDhfUERJU0NfU01TLAorCQkJICAgIHRyYW5zYWN0aW9uX2lkLCBuZXdfY2FsbHJlZisrKTsKKwlpZiAoIXRyYW5zKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIk5vIG1lbW9yeSBmb3IgdHJhbnNcbiIpOworCQkvKiBGSVhNRTogc2VuZCBzb21lIGVycm9yIG1lc3NhZ2UgKi8KKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJdHJhbnMtPnNtcy5ycF9zdGF0ZSA9IEdTTTQxMV9SUFNfSURMRTsKKwl0cmFucy0+c21zLmlzX210ID0gMTsKKwl0cmFucy0+c21zLnNtcyA9IHNtczsKKwl0cmFucy0+c21zLmxpbmtfaWQgPSBVTV9TQVBJX1NNUzsJLyogRklYTUU6IG1haW4gb3IgU0FDQ0ggPyAqLworCisJdHJhbnMtPmNvbm4gPSBjb25uOworCXVzZV9zdWJzY3JfY29uKHRyYW5zLT5jb25uKTsKKworCS8qIEhhcmRjb2RlIFNNU0MgT3JpZ2luYXRpbmcgQWRkcmVzcyBmb3Igbm93ICovCisJZGF0YSA9ICh1X2ludDhfdCAqKW1zZ2JfcHV0KG1zZywgOCk7CisJZGF0YVswXSA9IDB4MDc7CS8qIG9yaWdpbmF0b3IgbGVuZ3RoID09IDcgKi8KKwlkYXRhWzFdID0gMHg5MTsgLyogdHlwZSBvZiBudW1iZXI6IGludGVybmF0aW9uYWwsIElTRE4gKi8KKwlkYXRhWzJdID0gMHg0NDsgLyogNDQ3Nzg1MDE2MDA1ICovCisJZGF0YVszXSA9IDB4Nzc7CisJZGF0YVs0XSA9IDB4NTg7CisJZGF0YVs1XSA9IDB4MTA7CisJZGF0YVs2XSA9IDB4MDY7CisJZGF0YVs3XSA9IDB4NTA7CisKKwkvKiBIYXJkY29kZWQgRGVzdGluYXRpb24gQWRkcmVzcyAqLworCWRhdGEgPSAodV9pbnQ4X3QgKiltc2diX3B1dChtc2csIDEpOworCWRhdGFbMF0gPSAwOwkvKiBkZXN0aW5hdGlvbiBsZW5ndGggPT0gMCAqLworCisJLyogb2J0YWluIGEgcG9pbnRlciBmb3IgdGhlIHJwX3VkX2xlbiwgc28gd2UgY2FuIGZpbGwgaXQgbGF0ZXIgKi8KKwlycF91ZF9sZW4gPSAodV9pbnQ4X3QgKiltc2diX3B1dChtc2csIDEpOworCisjaWYgMQorCS8qIGdlbmVyYXRlIHRoZSAwMy40MCBUUERVICovCisJcmMgPSBnc20zNDBfZ2VuX3RwZHUobXNnLCBzbXMpOworCWlmIChyYyA8IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiByYzsKKwl9CisKKwkqcnBfdWRfbGVuID0gcmM7CisjZWxzZQorCWRhdGEgPSBtc2diX3B1dChtc2csIHNpemVvZih0cGR1X3Rlc3QpKTsKKwltZW1jcHkoZGF0YSwgdHBkdV90ZXN0LCBzaXplb2YodHBkdV90ZXN0KSk7CisJKnJwX3VkX2xlbiA9IHNpemVvZih0cGR1X3Rlc3QpOworI2VuZGlmCisKKwlERUJVR1AoRFNNUywgIlRYOiBTTVMgREVMSVZFUlxuIik7CisKKwljb3VudGVyX2luYyhjb25uLT5idHMtPm5ldHdvcmstPnN0YXRzLnNtcy5kZWxpdmVyZWQpOworCisJcmV0dXJuIGdzbTQxMV9ycF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9SUF9EQVRBX01ULCBtc2dfcmVmKTsKKwkvKiBGSVhNRTogZW50ZXIgJ3dhaXQgZm9yIFJQLUFDSycgc3RhdGUsIHN0YXJ0IFRSMU4gKi8KK30KKworLyogUkxMIFNBUEkzIGVzdGFibGlzaCBjYWxsYmFjay4gTm93IHdlIGhhdmUgYSBSTEwgY29ubmVjdGlvbiBhbmQKKyAqIGNhbiBkZWxpdmVyIHRoZSBhY3R1YWwgbWVzc2FnZSAqLworc3RhdGljIHZvaWQgcmxsX2luZF9jYihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwKKwkJCXZvaWQgKl9zbXMsIGVudW0gYnNjX3JsbHJfaW5kIHR5cGUpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IF9zbXM7CisKKwlERUJVR1AoRFNNUywgInJsbF9pbmRfY2IobGNoYW49JXAsIGxpbmtfaWQ9JXUsIHNtcz0lcCwgdHlwZT0ldVxuIiwKKwkJbGNoYW4sIGxpbmtfaWQsIHNtcywgdHlwZSk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEJTQ19STExSX0lORF9FU1RfQ09ORjoKKyN3YXJuaW5nICJCUk9LRU46IFRoZSBCU0Mgd2lsbCBlc3RhYmxpc2ggdGhpcyB0cmFuc3BhcmVudGx5IgorCQlnc200MTFfc2VuZF9zbXNfbGNoYW4oJmxjaGFuLT5jb25uLCBzbXMpOworCQlicmVhazsKKwljYXNlIEJTQ19STExSX0lORF9SRUxfSU5EOgorCWNhc2UgQlNDX1JMTFJfSU5EX0VSUl9JTkQ6CisJY2FzZSBCU0NfUkxMUl9JTkRfVElNRU9VVDoKKyN3YXJuaW5nICJCUk9LRU46IFdlIHdpbGwgbmVlZCB0byBoYW5kbGUgU0FQSSBuIFJlamVjdCIKKwkJc21zX2ZyZWUoc21zKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBwYWdpbmcgY2FsbGJhY2suIEhlcmUgd2UgZ2V0IGNhbGxlZCBpZiBwYWdpbmcgYSBzdWJzY3JpYmVyIGhhcworICogc3VjY2VlZGVkIG9yIGZhaWxlZC4gKi8KK3N0YXRpYyBpbnQgcGFnaW5nX2NiX3NlbmRfc21zKHVuc2lnbmVkIGludCBob29rbnVtLCB1bnNpZ25lZCBpbnQgZXZlbnQsCisJCQkgICAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpfbGNoYW4sIHZvaWQgKl9zbXMpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBfbGNoYW47CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IF9zbXM7CisJaW50IHJjOworCisJREVCVUdQKERTTVMsICJwYWdpbmdfY2Jfc2VuZF9zbXMoaG9va251bT0ldSwgZXZlbnQ9JXUsIG1zZz0lcCwiCisJCSJsY2hhbj0lcCwgc21zPSVwKVxuIiwgaG9va251bSwgZXZlbnQsIG1zZywgbGNoYW4sIHNtcyk7CisKKwlpZiAoaG9va251bSAhPSBHU01fSE9PS19SUl9QQUdJTkcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgR1NNX1BBR0lOR19TVUNDRUVERUQ6CisJCS8qIFBhZ2luZyBhYm9ydGVkIHdpdGhvdXQgbGNoYW4gPyE/ICovCisJCWlmICghbGNoYW4pIHsKKwkJCXNtc19mcmVlKHNtcyk7CisJCQlyYyA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQkvKiBFc3RhYmxpc2ggYSBTQVBJMyBSTEwgY29ubmVjdGlvbiBmb3IgU01TICovCisJCXJjID0gcmxsX2VzdGFibGlzaChsY2hhbiwgVU1fU0FQSV9TTVMsIHJsbF9pbmRfY2IsIHNtcyk7CisJCWJyZWFrOworCWNhc2UgR1NNX1BBR0lOR19FWFBJUkVEOgorCQlzbXNfZnJlZShzbXMpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBoaWdoLWxldmVsIGZ1bmN0aW9uIHRvIHNlbmQgYSBTTVMgdG8gYSBnaXZlbiBzdWJzY3JpYmVyLiBUaGUgZnVuY3Rpb24KKyAqIHdpbGwgdGFrZSBjYXJlIG9mIHBhZ2luZyB0aGUgc3Vic2NyaWJlciwgZXN0YWJsaXNoaW5nIHRoZSBSTEwgU0FQSTMKKyAqIGNvbm5lY3Rpb24sIGV0Yy4gKi8KK2ludCBnc200MTFfc2VuZF9zbXNfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICAgc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlpbnQgcmM7CisKKwkvKiBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gb3BlbiBsY2hhbiB0byB0aGUgc3Vic2NyaWJlci4KKwkgKiBpZiB5ZXMsIHNlbmQgdGhlIFNNUyB0aGlzIHdheSAqLworCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzdWJzY3IpOworCWlmIChsY2hhbikKKwkJcmV0dXJuIHJsbF9lc3RhYmxpc2gobGNoYW4sIFVNX1NBUElfU01TLAorCQkJCSAgICAgcmxsX2luZF9jYiwgc21zKTsKKworCS8qIGlmIG5vdCwgd2UgaGF2ZSB0byBzdGFydCBwYWdpbmcgKi8KKwlyYyA9IHBhZ2luZ19yZXF1ZXN0KHN1YnNjci0+bmV0LCBzdWJzY3IsIFJTTF9DSEFOTkVFRF9TRENDSCwKKwkJCSAgICBwYWdpbmdfY2Jfc2VuZF9zbXMsIHNtcyk7CisJaWYgKHJjIDw9IDApCisJCXNtc19mcmVlKHNtcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJzY3Jfc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfU1VCU0NSX0FUVEFDSEVEOgorCQkvKiBBIHN1YnNjcmliZXIgaGFzIGF0dGFjaGVkLiBDaGVjayBpZiB0aGVyZSBhcmUKKwkJICogYW55IHBlbmRpbmcgU01TIGZvciBoaW0gdG8gYmUgZGVsaXZlcmVkICovCisJCXN1YnNjciA9IHNpZ25hbF9kYXRhOworCQlsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwkJaWYgKCFsY2hhbikKKwkJCWJyZWFrOworCQlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKHN1YnNjcik7CisJCWlmICghc21zKQorCQkJYnJlYWs7CisJCS8qIEVzdGFibGlzaCBhIFNBUEkzIFJMTCBjb25uZWN0aW9uIGZvciBTTVMgKi8KKwkJcmxsX2VzdGFibGlzaChsY2hhbiwgVU1fU0FQSV9TTVMsIHJsbF9pbmRfY2IsIHNtcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBfZ3NtNDExX3Ntc190cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCWJzY19kZWxfdGltZXIoJnRyYW5zLT5zbXMuY3BfdGltZXIpOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX3Ntcyh2b2lkKQoreworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NVQlNDUiwgc3Vic2NyX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfODAuYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF84MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTBiMTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfODAuYwpAQCAtMCwwICsxLDMyOCBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IE1pa2UgSGFiZW4gPG1pY2hhZWwuaGFiZW5AYnRpbnRlcm5ldC5jb20+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfODAuaD4KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgcGFyc2VfdXNzZCh1X2ludDhfdCAqdXNzZCwgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKK3N0YXRpYyBpbnQgcGFyc2VfdXNzZF9pbmZvX2VsZW1lbnRzKHVfaW50OF90ICp1c3NkX2llLAorCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpOworc3RhdGljIGludCBwYXJzZV9mYWNpbGl0eV9pZSh1X2ludDhfdCAqZmFjaWxpdHlfaWUsIHVfaW50OF90IGxlbmd0aCwKKwkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKK3N0YXRpYyBpbnQgcGFyc2Vfc3NfaW52b2tlKHVfaW50OF90ICppbnZva2VfZGF0YSwgdV9pbnQ4X3QgbGVuZ3RoLAorCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpOworc3RhdGljIGludCBwYXJzZV9wcm9jZXNzX3Vzc19yZXEodV9pbnQ4X3QgKnVzc19yZXFfZGF0YSwgdV9pbnQ4X3QgbGVuZ3RoLAorCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKm1zZ2Jfd3JhcF93aXRoX1RMKHN0cnVjdCBtc2diICptc2diLCB1X2ludDhfdCB0YWcpCit7CisJbXNnYi0+ZGF0YSAtPSAyOworCW1zZ2ItPmRhdGFbMF0gPSB0YWc7CisJbXNnYi0+ZGF0YVsxXSA9IG1zZ2ItPmxlbjsKKwltc2diLT5sZW4gKz0gMjsKKwlyZXR1cm4gbXNnYi0+ZGF0YTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICptc2diX3B1c2hfVExWMShzdHJ1Y3QgbXNnYiAqbXNnYiwgdV9pbnQ4X3QgdGFnLAorCQkJCQkgICAgdV9pbnQ4X3QgdmFsdWUpCit7CisJbXNnYi0+ZGF0YSAtPSAzOworCW1zZ2ItPmxlbiArPSAzOworCW1zZ2ItPmRhdGFbMF0gPSB0YWc7CisJbXNnYi0+ZGF0YVsxXSA9IDE7CisJbXNnYi0+ZGF0YVsyXSA9IHZhbHVlOworCXJldHVybiBtc2diLT5kYXRhOworfQorCisKKy8qIERlY29kZSBhIG1vYmlsZS1vcmlnaW5hdGVkIFVTU0QtcmVxdWVzdCBtZXNzYWdlICovCitpbnQgZ3NtMDQ4MF9kZWNvZGVfdXNzZF9yZXF1ZXN0KGNvbnN0IHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmMgPSAwOworCXVfaW50OF90ICpwYXJzZV9wdHIgPSBtc2diX2wzKG1zZyk7CisKKwlpZiAoKCpwYXJzZV9wdHIgJiAweDBGKSA9PSBHU000OF9QRElTQ19OQ19TUykgeworCQlyZXEtPnRyYW5zYWN0aW9uX2lkID0gKnBhcnNlX3B0ciAmIDB4NzA7CisJCXJjID0gcGFyc2VfdXNzZChwYXJzZV9wdHIrMSwgcmVxKTsKKwl9CisKKwlpZiAoIXJjKQorCQlERUJVR1AoRE1NLCAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyByZWNlaXZlZCBVU1NEIVxuIik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdXNzZCh1X2ludDhfdCAqdXNzZCwgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWludCByYyA9IDE7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSB1c3NkWzBdICYgMHhCRjsgIC8qIG1lc3NhZ2UtdHlwZSAtIHNlY3Rpb24gMy40ICovCisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBHU00wNDgwX01UWVBFX1JFTEVBU0VfQ09NUExFVEU6CisJCURFQlVHUChETU0sICJVU1MgUmVsZWFzZSBDb21wbGV0ZVxuIik7CisJCS8qIGNvdWxkIGFsc28gcGFyc2Ugb3V0IHRoZSBvcHRpb25hbCBDYXVzZS9GYWNpbGl0eSBkYXRhICovCisJCXJlcS0+dGV4dFswXSA9IDB4RkY7CisJCWJyZWFrOworCWNhc2UgR1NNMDQ4MF9NVFlQRV9SRUdJU1RFUjoKKwljYXNlIEdTTTA0ODBfTVRZUEVfRkFDSUxJVFk6CisJCXJjICY9IHBhcnNlX3Vzc2RfaW5mb19lbGVtZW50cyh1c3NkKzEsIHJlcSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBHU00gMDQuODAgbWVzc2FnZS10eXBlIGZpZWxkIDB4JTAyeFxuIiwKKwkJCXVzc2RbMF0pOworCQlyYyA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwYXJzZV91c3NkX2luZm9fZWxlbWVudHModV9pbnQ4X3QgKnVzc2RfaWUsIHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmM7CisJLyogSW5mb3JtYXRpb24gRWxlbWVudCBJZGVudGlmaWVyIC0gdGFibGUgMy4yICYgR1NNIDA0LjA4IHNlY3Rpb24gMTAuNSAqLworCXVfaW50OF90IGllaSA9IHVzc2RfaWVbMF07CisJdV9pbnQ4X3QgaWVpX2xlbmd0aCA9IHVzc2RfaWVbMV07CisKKwlzd2l0Y2ggKGllaSkgeworCWNhc2UgR1NNNDhfSUVfQ0FVU0U6CisJCWJyZWFrOworCWNhc2UgR1NNMDQ4MF9JRV9GQUNJTElUWToKKwkJcmMgPSBwYXJzZV9mYWNpbGl0eV9pZSh1c3NkX2llKzIsIGllaV9sZW5ndGgsIHJlcSk7CisJCWJyZWFrOworCWNhc2UgR1NNMDQ4MF9JRV9TU19WRVJTSU9OOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgIlVuaGFuZGxlZCBHU00gMDQuMDggb3IgMDQuODAgSUVJIDB4JTAyeFxuIiwKKwkJCWllaSk7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBhcnNlX2ZhY2lsaXR5X2llKHVfaW50OF90ICpmYWNpbGl0eV9pZSwgdV9pbnQ4X3QgbGVuZ3RoLAorCQkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWludCByYyA9IDE7CisJdV9pbnQ4X3Qgb2Zmc2V0ID0gMDsKKworCWRvIHsKKwkJLyogQ29tcG9uZW50IFR5cGUgdGFnIC0gdGFibGUgMy43ICovCisJCXVfaW50OF90IGNvbXBvbmVudF90eXBlID0gZmFjaWxpdHlfaWVbb2Zmc2V0XTsKKwkJdV9pbnQ4X3QgY29tcG9uZW50X2xlbmd0aCA9IGZhY2lsaXR5X2llW29mZnNldCsxXTsKKworCQlzd2l0Y2ggKGNvbXBvbmVudF90eXBlKSB7CisJCWNhc2UgR1NNMDQ4MF9DVFlQRV9JTlZPS0U6CisJCQlyYyAmPSBwYXJzZV9zc19pbnZva2UoZmFjaWxpdHlfaWUrMiwKKwkJCQkJCWNvbXBvbmVudF9sZW5ndGgsCisJCQkJCQlyZXEpOworCQkJYnJlYWs7CisJCWNhc2UgR1NNMDQ4MF9DVFlQRV9SRVRVUk5fUkVTVUxUOgorCQkJYnJlYWs7CisJCWNhc2UgR1NNMDQ4MF9DVFlQRV9SRVRVUk5fRVJST1I6CisJCQlicmVhazsKKwkJY2FzZSBHU00wNDgwX0NUWVBFX1JFSkVDVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIEdTTSAwNC44MCBGYWNpbGl0eSAiCisJCQkJIkNvbXBvbmVudCBUeXBlIDB4JTAyeFxuIiwgY29tcG9uZW50X3R5cGUpOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJb2Zmc2V0ICs9IChjb21wb25lbnRfbGVuZ3RoKzIpOworCX0gd2hpbGUgKG9mZnNldCA8IGxlbmd0aCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFBhcnNlIGFuIEludm9rZSBjb21wb25lbnQgLSBzZWUgdGFibGUgMy4zICovCitzdGF0aWMgaW50IHBhcnNlX3NzX2ludm9rZSh1X2ludDhfdCAqaW52b2tlX2RhdGEsIHVfaW50OF90IGxlbmd0aCwKKwkJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmMgPSAxOworCXVfaW50OF90IG9mZnNldDsKKworCS8qIG1hbmRhdG9yeSBwYXJ0ICovCisJaWYgKGludm9rZV9kYXRhWzBdICE9IEdTTTA0ODBfQ09NUElEVEFHX0lOVk9LRV9JRCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuZXhwZWN0ZWQgR1NNIDA0LjgwIENvbXBvbmVudC1JRCB0YWcgIgorCQkJIjB4JTAyeCAoZXhwZWN0aW5nIEludm9rZSBJRCB0YWcpXG4iLCBpbnZva2VfZGF0YVswXSk7CisJfQorCisJb2Zmc2V0ID0gaW52b2tlX2RhdGFbMV0gKyAyOworCXJlcS0+aW52b2tlX2lkID0gaW52b2tlX2RhdGFbMl07CisKKwkvKiBvcHRpb25hbCBwYXJ0ICovCisJaWYgKGludm9rZV9kYXRhW29mZnNldF0gPT0gR1NNMDQ4MF9DT01QSURUQUdfTElOS0VEX0lEKQorCQlvZmZzZXQgKz0gaW52b2tlX2RhdGFbb2Zmc2V0KzFdICsgMjsgIC8qIHNraXAgb3ZlciBpdCAqLworCisJLyogbWFuZGF0b3J5IHBhcnQgKi8KKwlpZiAoaW52b2tlX2RhdGFbb2Zmc2V0XSA9PSBHU00wNDgwX09QRVJBVElPTl9DT0RFKSB7CisJCXVfaW50OF90IG9wZXJhdGlvbl9jb2RlID0gaW52b2tlX2RhdGFbb2Zmc2V0KzJdOworCQlzd2l0Y2ggKG9wZXJhdGlvbl9jb2RlKSB7CisJCWNhc2UgR1NNMDQ4MF9PUF9DT0RFX1BST0NFU1NfVVNTX1JFUToKKwkJCXJjID0gcGFyc2VfcHJvY2Vzc191c3NfcmVxKGludm9rZV9kYXRhICsgb2Zmc2V0ICsgMywKKwkJCQkJCSAgIGxlbmd0aCAtIG9mZnNldCAtIDMsCisJCQkJCQkgICByZXEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgIkdTTSAwNC44MCBvcGVyYXRpb24gY29kZSAweCUwMnggIgorCQkJCSJpcyBub3QgeWV0IGhhbmRsZWRcbiIsIG9wZXJhdGlvbl9jb2RlKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIEdTTSAwNC44MCBDb21wb25lbnQtSUQgdGFnIDB4JTAyeCAiCisJCQkiKGV4cGVjdGluZyBPcGVyYXRpb24gQ29kZSB0YWcpXG4iLAorCQkJaW52b2tlX2RhdGFbMF0pOworCQlyYyA9IDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBQYXJzZSB0aGUgcGFyYW1ldGVycyBvZiBhIFByb2Nlc3MgVW5zdHJ1Y3R1cmVkU1MgUmVxdWVzdCAqLworc3RhdGljIGludCBwYXJzZV9wcm9jZXNzX3Vzc19yZXEodV9pbnQ4X3QgKnVzc19yZXFfZGF0YSwgdV9pbnQ4X3QgbGVuZ3RoLAorCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJjID0gMDsKKwlpbnQgbnVtX2NoYXJzOworCXVfaW50OF90IGRjczsKKworCWlmICh1c3NfcmVxX2RhdGFbMF0gPT0gR1NNXzA0ODBfU0VRVUVOQ0VfVEFHKSB7CisJCWlmICh1c3NfcmVxX2RhdGFbMl0gPT0gQVNOMV9PQ1RFVF9TVFJJTkdfVEFHKSB7CisJCQlkY3MgPSB1c3NfcmVxX2RhdGFbNF07CisJCQlpZiAoKGRjcyA9PSAweDBGKSAmJgorCQkJICAgICh1c3NfcmVxX2RhdGFbNV0gPT0gQVNOMV9PQ1RFVF9TVFJJTkdfVEFHKSkgeworCQkJCW51bV9jaGFycyA9ICh1c3NfcmVxX2RhdGFbNl0gKiA4KSAvIDc7CisJCQkJLyogUHJldmVudCBhIG1vYmlsZS1vcmlnaW5hdGVkIGJ1ZmZlci1vdmVycnVuISAqLworCQkJCWlmIChudW1fY2hhcnMgPiBNQVhfTEVOX1VTU0RfU1RSSU5HKQorCQkJCQludW1fY2hhcnMgPSBNQVhfTEVOX1VTU0RfU1RSSU5HOworCQkJCWdzbV83Yml0X2RlY29kZShyZXEtPnRleHQsCisJCQkJCQkmKHVzc19yZXFfZGF0YVs3XSksIG51bV9jaGFycyk7CisJCQkJLyogYXBwZW5kIG51bGwtdGVybWluYXRvciAqLworCQkJCXJlcS0+dGV4dFtudW1fY2hhcnMrMV0gPSAwOworCQkJCXJjID0gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qIFNlbmQgcmVzcG9uc2UgdG8gYSBtb2JpbGUtb3JpZ2luYXRlZCBQcm9jZXNzVW5zdHJ1Y3R1cmVkU1MtUmVxdWVzdCAqLworaW50IGdzbTA0ODBfc2VuZF91c3NkX3Jlc3BvbnNlKGNvbnN0IHN0cnVjdCBtc2diICppbl9tc2csIGNvbnN0IGNoYXIgKnJlc3BvbnNlX3RleHQsCisJCQkJCQljb25zdCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwl1X2ludDhfdCAqcHRyODsKKwlpbnQgcmVzcG9uc2VfbGVuOworCisJcmVzcG9uc2VfbGVuID0gKHN0cmxlbihyZXNwb25zZV90ZXh0KSAqIDcpIC8gODsKKwlpZiAoKChzdHJsZW4ocmVzcG9uc2VfdGV4dCkgKiA3KSAlIDgpICE9IDApCisJCXJlc3BvbnNlX2xlbiArPSAxOworCisJbXNnLT5sY2hhbiA9IGluX21zZy0+bGNoYW47CisKKwkvKiBGaXJzdCBwdXQgdGhlIHBheWxvYWQgdGV4dCBpbnRvIHRoZSBtZXNzYWdlICovCisJcHRyOCA9IG1zZ2JfcHV0KG1zZywgcmVzcG9uc2VfbGVuKTsKKwlnc21fN2JpdF9lbmNvZGUocHRyOCwgcmVzcG9uc2VfdGV4dCk7CisKKwkvKiBUaGVuIHdyYXAgaXQgYXMgYW4gT2N0ZXQgU3RyaW5nICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBBU04xX09DVEVUX1NUUklOR19UQUcpOworCisJLyogUHJlLXBlbmQgdGhlIERDUyBvY3RldCBzdHJpbmcgKi8KKwltc2diX3B1c2hfVExWMShtc2csIEFTTjFfT0NURVRfU1RSSU5HX1RBRywgMHgwRik7CisKKwkvKiBUaGVuIHdyYXAgdGhlc2UgYXMgYSBTZXF1ZW5jZSAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgR1NNXzA0ODBfU0VRVUVOQ0VfVEFHKTsKKworCS8qIFByZS1wZW5kIHRoZSBvcGVyYXRpb24gY29kZSAqLworCW1zZ2JfcHVzaF9UTFYxKG1zZywgR1NNMDQ4MF9PUEVSQVRJT05fQ09ERSwKKwkJCUdTTTA0ODBfT1BfQ09ERV9QUk9DRVNTX1VTU19SRVEpOworCisJLyogV3JhcCB0aGUgb3BlcmF0aW9uIGNvZGUgYW5kIElBNSBzdHJpbmcgYXMgYSBzZXF1ZW5jZSAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgR1NNXzA0ODBfU0VRVUVOQ0VfVEFHKTsKKworCS8qIFByZS1wZW5kIHRoZSBpbnZva2UgSUQgKi8KKwltc2diX3B1c2hfVExWMShtc2csIEdTTTA0ODBfQ09NUElEVEFHX0lOVk9LRV9JRCwgcmVxLT5pbnZva2VfaWQpOworCisJLyogV3JhcCB0aGlzIHVwIGFzIGEgUmV0dXJuIFJlc3VsdCBjb21wb25lbnQgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTTA0ODBfQ1RZUEVfUkVUVVJOX1JFU1VMVCk7CisKKwkvKiBXcmFwIHRoZSBjb21wb25lbnQgaW4gYSBGYWNpbGl0eSBtZXNzYWdlICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU00wNDgwX0lFX0ZBQ0lMSVRZKTsKKworCS8qIEFuZCBmaW5hbGx5IHByZS1wZW5kIHRoZSBMMyBoZWFkZXIgKi8KKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19OQ19TUyB8IHJlcS0+dHJhbnNhY3Rpb25faWQKKwkJCQkJfCAoMTw8Nyk7ICAvKiBUSSBkaXJlY3Rpb24gPSAxICovCisJZ2gtPm1zZ190eXBlID0gR1NNMDQ4MF9NVFlQRV9SRUxFQVNFX0NPTVBMRVRFOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworaW50IGdzbTA0ODBfc2VuZF91c3NkX3JlamVjdChjb25zdCBzdHJ1Y3QgbXNnYiAqaW5fbXNnLAorCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJbXNnLT5sY2hhbiA9IGluX21zZy0+bGNoYW47CisKKwkvKiBGaXJzdCBpbnNlcnQgdGhlIHByb2JsZW0gY29kZSAqLworCW1zZ2JfcHVzaF9UTFYxKG1zZywgR1NNXzA0ODBfUFJPQkxFTV9DT0RFX1RBR19HRU5FUkFMLAorCQkJR1NNXzA0ODBfR0VOX1BST0JfQ09ERV9VTlJFQ09HTklTRUQpOworCisJLyogQmVmb3JlIGl0IGluc2VydCB0aGUgaW52b2tlIElEICovCisJbXNnYl9wdXNoX1RMVjEobXNnLCBHU00wNDgwX0NPTVBJRFRBR19JTlZPS0VfSUQsIHJlcS0+aW52b2tlX2lkKTsKKworCS8qIFdyYXAgdGhpcyB1cCBhcyBhIFJlamVjdCBjb21wb25lbnQgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTTA0ODBfQ1RZUEVfUkVKRUNUKTsKKworCS8qIFdyYXAgdGhlIGNvbXBvbmVudCBpbiBhIEZhY2lsaXR5IG1lc3NhZ2UgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTTA0ODBfSUVfRkFDSUxJVFkpOworCisJLyogQW5kIGZpbmFsbHkgcHJlLXBlbmQgdGhlIEwzIGhlYWRlciAqLworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX05DX1NTOworCWdoLT5wcm90b19kaXNjciB8PSByZXEtPnRyYW5zYWN0aW9uX2lkIHwgKDE8PDcpOyAgLyogVEkgZGlyZWN0aW9uID0gMSAqLworCWdoLT5tc2dfdHlwZSA9IEdTTTA0ODBfTVRZUEVfUkVMRUFTRV9DT01QTEVURTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fZGF0YS5jIGIvb3BlbmJzYy9zcmMvZ3NtX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2I1NjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtX2RhdGEuYwpAQCAtMCwwICsxLDU1OSBAQAorLyogKEMpIDIwMDgtMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zdGF0aXN0aWNzLmg+CisKK3ZvaWQgKnRhbGxfYnNjX2N0eDsKKworc3RhdGljIExMSVNUX0hFQUQoYnRzX21vZGVscyk7CisKK3ZvaWQgc2V0X3RzX2UxbGluayhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBlMV9uciwKKwkJICAgdV9pbnQ4X3QgZTFfdHMsIHVfaW50OF90IGUxX3RzX3NzKQoreworCXRzLT5lMV9saW5rLmUxX25yID0gZTFfbnI7CisJdHMtPmUxX2xpbmsuZTFfdHMgPSBlMV90czsKKwl0cy0+ZTFfbGluay5lMV90c19zcyA9IGUxX3RzX3NzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBwY2hhbl9uYW1lc1tdID0geworCXsgR1NNX1BDSEFOX05PTkUsCSJOT05FIiB9LAorCXsgR1NNX1BDSEFOX0NDQ0gsCSJDQ0NIIiB9LAorCXsgR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0LCJDQ0NIK1NEQ0NINCIgfSwKKwl7IEdTTV9QQ0hBTl9UQ0hfRiwJIlRDSC9GIiB9LAorCXsgR1NNX1BDSEFOX1RDSF9ILAkiVENIL0giIH0sCisJeyBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEMsICJTRENDSDgiIH0sCisJeyBHU01fUENIQU5fUERDSCwJIlBEQ0giIH0sCisJeyBHU01fUENIQU5fVENIX0ZfUERDSCwJIlRDSC9GX1BEQ0giIH0sCisJeyBHU01fUENIQU5fVU5LTk9XTiwJIlVOS05PV04iIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqZ3NtX3BjaGFuX25hbWUoZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBjKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKHBjaGFuX25hbWVzLCBjKTsKK30KKworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBnc21fcGNoYW5fcGFyc2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gZ2V0X3N0cmluZ192YWx1ZShwY2hhbl9uYW1lcywgbmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGxjaGFudF9uYW1lc1tdID0geworCXsgR1NNX0xDSEFOX05PTkUsCSJOT05FIiB9LAorCXsgR1NNX0xDSEFOX1NEQ0NILAkiU0RDQ0giIH0sCisJeyBHU01fTENIQU5fVENIX0YsCSJUQ0gvRiIgfSwKKwl7IEdTTV9MQ0hBTl9UQ0hfSCwJIlRDSC9IIiB9LAorCXsgR1NNX0xDSEFOX1VOS05PV04sCSJVTktOT1dOIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKmdzbV9sY2hhbnRfbmFtZShlbnVtIGdzbV9jaGFuX3QgYykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhsY2hhbnRfbmFtZXMsIGMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBsY2hhbl9zX25hbWVzW10gPSB7CisJeyBMQ0hBTl9TX05PTkUsCQkiTk9ORSIgfSwKKwl7IExDSEFOX1NfQUNUX1JFUSwJIkFDVElWQVRJT04gUkVRVUVTVEVEIiB9LAorCXsgTENIQU5fU19BQ1RJVkUsCSJBQ1RJVkUiIH0sCisJeyBMQ0hBTl9TX0lOQUNUSVZFLAkiSU5BQ1RJVkUiIH0sCisJeyBMQ0hBTl9TX1JFTF9SRVEsCSJSRUxFQVNFIFJFUVVFU1RFRCIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpnc21fbGNoYW5zX25hbWUoZW51bSBnc21fbGNoYW5fc3RhdGUgcykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhsY2hhbl9zX25hbWVzLCBzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgY2hyZXFfbmFtZXNbXSA9IHsKKwl7IEdTTV9DSFJFUV9SRUFTT05fRU1FUkcsCSJFTUVSR0VOQ1kiIH0sCisJeyBHU01fQ0hSRVFfUkVBU09OX1BBRywJCSJQQUdJTkciIH0sCisJeyBHU01fQ0hSRVFfUkVBU09OX0NBTEwsCSJDQUxMIiB9LAorCXsgR1NNX0NIUkVRX1JFQVNPTl9MT0NBVElPTl9VUEQsIkxPQ0FUSU9OX1VQREFURSIgfSwKKwl7IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCSJPVEhFUiIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqZ3NtX2NocmVxX25hbWUoZW51bSBnc21fY2hyZXFfcmVhc29uX3QgYykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhjaHJlcV9uYW1lcywgYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqYnRzX21vZGVsX2ZpbmQoZW51bSBnc21fYnRzX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqbW9kZWw7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlbCwgJmJ0c19tb2RlbHMsIGxpc3QpIHsKKwkJaWYgKG1vZGVsLT50eXBlID09IHR5cGUpCisJCQlyZXR1cm4gbW9kZWw7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBnc21fYnRzX21vZGVsX3JlZ2lzdGVyKHN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbCkKK3sKKwlpZiAoYnRzX21vZGVsX2ZpbmQobW9kZWwtPnR5cGUpKQorCQlyZXR1cm4gLUVFWElTVDsKKworCXRsdl9kZWZfcGF0Y2goJm1vZGVsLT5ubV9hdHRfdGx2ZGVmLCAmbm1fYXR0X3RsdmRlZik7CisJbGxpc3RfYWRkX3RhaWwoJm1vZGVsLT5saXN0LCAmYnRzX21vZGVscyk7CisJcmV0dXJuIDA7Cit9CisKKworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdGFsbG9jX3plcm8oYnRzLCBzdHJ1Y3QgZ3NtX2J0c190cngpOworCWludCBrOworCisJaWYgKCF0cngpCisJCXJldHVybiBOVUxMOworCisJdHJ4LT5idHMgPSBidHM7CisJdHJ4LT5uciA9IGJ0cy0+bnVtX3RyeCsrOworCXRyeC0+bm1fc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSBOTV9TVEFURV9VTkxPQ0tFRDsKKworCWZvciAoayA9IDA7IGsgPCBUUlhfTlJfVFM7IGsrKykgeworCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNba107CisJCWludCBsOworCQkKKwkJdHMtPnRyeCA9IHRyeDsKKwkJdHMtPm5yID0gazsKKwkJdHMtPnBjaGFuID0gR1NNX1BDSEFOX05PTkU7CisKKwkJZm9yIChsID0gMDsgbCA8IFRTX01BWF9MQ0hBTjsgbCsrKSB7CisJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwkJCWxjaGFuID0gJnRzLT5sY2hhbltsXTsKKworCQkJbGNoYW4tPnRzID0gdHM7CisJCQlsY2hhbi0+bnIgPSBsOworCQkJbGNoYW4tPnR5cGUgPSBHU01fTENIQU5fTk9ORTsKKwkJfQorCX0KKworCWlmICh0cngtPm5yICE9IDApCisJCXRyeC0+bm9taW5hbF9wb3dlciA9IGJ0cy0+YzAtPm5vbWluYWxfcG93ZXI7CisKKwlsbGlzdF9hZGRfdGFpbCgmdHJ4LT5saXN0LCAmYnRzLT50cnhfbGlzdCk7CisKKwlyZXR1cm4gdHJ4OworfQorCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19hbGxvYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgZW51bSBnc21fYnRzX3R5cGUgdHlwZSwKKwkJCSAgICAgIHVfaW50OF90IHRzYywgdV9pbnQ4X3QgYnNpYykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdGFsbG9jX3plcm8obmV0LCBzdHJ1Y3QgZ3NtX2J0cyk7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsID0gYnRzX21vZGVsX2ZpbmQodHlwZSk7CisJaW50IGk7CisKKwlpZiAoIWJ0cykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIW1vZGVsICYmIHR5cGUgIT0gR1NNX0JUU19UWVBFX1VOS05PV04pIHsKKwkJdGFsbG9jX2ZyZWUoYnRzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYnRzLT5uZXR3b3JrID0gbmV0OworCWJ0cy0+bnIgPSBuZXQtPm51bV9idHMrKzsKKwlidHMtPnR5cGUgPSB0eXBlOworCWJ0cy0+bW9kZWwgPSBtb2RlbDsKKwlidHMtPnRzYyA9IHRzYzsKKwlidHMtPmJzaWMgPSBic2ljOworCWJ0cy0+bnVtX3RyeCA9IDA7CisJSU5JVF9MTElTVF9IRUFEKCZidHMtPnRyeF9saXN0KTsKKwlidHMtPm1zX21heF9wb3dlciA9IDE1OwkvKiBkQm0gKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0ID0gMjsgLyogNCBkQiAqLworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5yeGxldl9hY2NfbWluID0gMDsKKwlidHMtPnNpX2NvbW1vbi5uZWlnaF9saXN0LmRhdGEgPSBidHMtPnNpX2NvbW1vbi5kYXRhLm5laWdoX2xpc3Q7CisJYnRzLT5zaV9jb21tb24ubmVpZ2hfbGlzdC5kYXRhX2xlbiA9CisJCQkJc2l6ZW9mKGJ0cy0+c2lfY29tbW9uLmRhdGEubmVpZ2hfbGlzdCk7CisJYnRzLT5zaV9jb21tb24uY2VsbF9hbGxvYy5kYXRhID0gYnRzLT5zaV9jb21tb24uZGF0YS5jZWxsX2FsbG9jOworCWJ0cy0+c2lfY29tbW9uLmNlbGxfYWxsb2MuZGF0YV9sZW4gPQorCQkJCXNpemVvZihidHMtPnNpX2NvbW1vbi5kYXRhLmNlbGxfYWxsb2MpOworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5yZSA9IDE7IC8qIG5vIHJlLWVzdGFibGlzaG1lbnQgKi8KKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudHhfaW50ZWdlciA9IDk7ICAvKiAxMiBzbG90cyBzcHJlYWQgLSAyMTcvMTE1IHNsb3RzIGRlbGF5ICovCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyA9IDM7IC8qIDcgcmV0cmFuc21pc3Npb25zICovCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnQyID0gNDsgLyogbm8gZW1lcmdlbmN5IGNhbGxzICovCisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidHMtPmdwcnMubnN2Yyk7IGkrKykgeworCQlidHMtPmdwcnMubnN2Y1tpXS5idHMgPSBidHM7CisJCWJ0cy0+Z3Bycy5uc3ZjW2ldLmlkID0gaTsKKwl9CisKKwkvKiBjcmVhdGUgb3VyIHByaW1hcnkgVFJYICovCisJYnRzLT5jMCA9IGdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisJaWYgKCFidHMtPmMwKSB7CisJCXRhbGxvY19mcmVlKGJ0cyk7CisJCXJldHVybiBOVUxMOworCX0KKwlidHMtPmMwLT50c1swXS5wY2hhbiA9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINDsKKworCWJ0cy0+cmFjaF9iX3RocmVzaCA9IC0xOworCWJ0cy0+cmFjaF9sZGF2Z19zbG90cyA9IC0xOworCWxsaXN0X2FkZF90YWlsKCZidHMtPmxpc3QsICZuZXQtPmJ0c19saXN0KTsKKworCXJldHVybiBidHM7Cit9CisKK3N0cnVjdCBnc21fbmV0d29yayAqZ3NtX25ldHdvcmtfaW5pdCh1X2ludDE2X3QgY291bnRyeV9jb2RlLCB1X2ludDE2X3QgbmV0d29ya19jb2RlLAorCQkJCSAgICAgaW50ICgqbW5jY19yZWN2KShzdHJ1Y3QgZ3NtX25ldHdvcmsgKiwgaW50LCB2b2lkICopKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCisJbmV0ID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZ3NtX25ldHdvcmspOworCWlmICghbmV0KQorCQlyZXR1cm4gTlVMTDsKKworCW5ldC0+Y291bnRyeV9jb2RlID0gY291bnRyeV9jb2RlOworCW5ldC0+bmV0d29ya19jb2RlID0gbmV0d29ya19jb2RlOworCW5ldC0+bnVtX2J0cyA9IDA7CisJbmV0LT5yZWplY3RfY2F1c2UgPSBHU000OF9SRUpFQ1RfUk9BTUlOR19OT1RfQUxMT1dFRDsKKwluZXQtPlQzMTAxID0gR1NNX1QzMTAxX0RFRkFVTFQ7CisJbmV0LT5UMzExMyA9IEdTTV9UMzExM19ERUZBVUxUOworCS8qIEZJWE1FOiBpbml0aWFsaXplIGFsbCBvdGhlciB0aW1lcnMhICovCisKKwkvKiBkZWZhdWx0IHNldCBvZiBoYW5kb3ZlciBwYXJhbWV0ZXJzICovCisJbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnID0gMTA7CisJbmV0LT5oYW5kb3Zlci53aW5fcnhxdWFsX2F2ZyA9IDE7CisJbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnX25laWdoID0gMTA7CisJbmV0LT5oYW5kb3Zlci5wd3JfaW50ZXJ2YWwgPSA2OworCW5ldC0+aGFuZG92ZXIucHdyX2h5c3RlcmVzaXMgPSAzOworCW5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlID0gOTk5OTsKKworCUlOSVRfTExJU1RfSEVBRCgmbmV0LT50cmFuc19saXN0KTsKKwlJTklUX0xMSVNUX0hFQUQoJm5ldC0+dXBxdWV1ZSk7CisJSU5JVF9MTElTVF9IRUFEKCZuZXQtPmJ0c19saXN0KTsKKworCW5ldC0+c3RhdHMuY2hyZXEudG90YWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuY2hyZXEudG90YWwiKTsKKwluZXQtPnN0YXRzLmNocmVxLm5vX2NoYW5uZWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuY2hyZXEubm9fY2hhbm5lbCIpOworCW5ldC0+c3RhdHMuaGFuZG92ZXIuYXR0ZW1wdGVkID0gY291bnRlcl9hbGxvYygibmV0LmhhbmRvdmVyLmF0dGVtcHRlZCIpOworCW5ldC0+c3RhdHMuaGFuZG92ZXIubm9fY2hhbm5lbCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5oYW5kb3Zlci5ub19jaGFubmVsIik7CisJbmV0LT5zdGF0cy5oYW5kb3Zlci50aW1lb3V0ID0gY291bnRlcl9hbGxvYygibmV0LmhhbmRvdmVyLnRpbWVvdXQiKTsKKwluZXQtPnN0YXRzLmhhbmRvdmVyLmNvbXBsZXRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5oYW5kb3Zlci5jb21wbGV0ZWQiKTsKKwluZXQtPnN0YXRzLmhhbmRvdmVyLmZhaWxlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5oYW5kb3Zlci5mYWlsZWQiKTsKKwluZXQtPnN0YXRzLmxvY191cGRfdHlwZS5hdHRhY2ggPSBjb3VudGVyX2FsbG9jKCJuZXQubG9jX3VwZF90eXBlLmF0dGFjaCIpOworCW5ldC0+c3RhdHMubG9jX3VwZF90eXBlLm5vcm1hbCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5sb2NfdXBkX3R5cGUubm9ybWFsIik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUucGVyaW9kaWMgPSBjb3VudGVyX2FsbG9jKCJuZXQubG9jX3VwZF90eXBlLnBlcmlvZGljIik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuZGV0YWNoID0gY291bnRlcl9hbGxvYygibmV0Lmltc2lfZGV0YWNoLmNvdW50Iik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3Jlc3AucmVqZWN0ID0gY291bnRlcl9hbGxvYygibmV0LmxvY191cGRfcmVzcC5yZWplY3QiKTsKKwluZXQtPnN0YXRzLmxvY191cGRfcmVzcC5hY2NlcHQgPSBjb3VudGVyX2FsbG9jKCJuZXQubG9jX3VwZF9yZXNwLmFjY2VwdCIpOworCW5ldC0+c3RhdHMucGFnaW5nLmF0dGVtcHRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5wYWdpbmcuYXR0ZW1wdGVkIik7CisJbmV0LT5zdGF0cy5wYWdpbmcuZGV0YWNoZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQucGFnaW5nLmRldGFjaGVkIik7CisJbmV0LT5zdGF0cy5wYWdpbmcuY29tcGxldGVkID0gY291bnRlcl9hbGxvYygibmV0LnBhZ2luZy5jb21wbGV0ZWQiKTsKKwluZXQtPnN0YXRzLnBhZ2luZy5leHBpcmVkID0gY291bnRlcl9hbGxvYygibmV0LnBhZ2luZy5leHBpcmVkIik7CisJbmV0LT5zdGF0cy5zbXMuc3VibWl0dGVkID0gY291bnRlcl9hbGxvYygibmV0LnNtcy5zdWJtaXR0ZWQiKTsKKwluZXQtPnN0YXRzLnNtcy5ub19yZWNlaXZlciA9IGNvdW50ZXJfYWxsb2MoIm5ldC5zbXMubm9fcmVjZWl2ZXIiKTsKKwluZXQtPnN0YXRzLnNtcy5kZWxpdmVyZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuc21zLmRlbGl2ZXJlZCIpOworCW5ldC0+c3RhdHMuc21zLnJwX2Vycl9tZW0gPSBjb3VudGVyX2FsbG9jKCJuZXQuc21zLnJwX2Vycl9tZW0iKTsKKwluZXQtPnN0YXRzLnNtcy5ycF9lcnJfb3RoZXIgPSBjb3VudGVyX2FsbG9jKCJuZXQuc21zLnJwX2Vycl9vdGhlciIpOworCW5ldC0+c3RhdHMuY2FsbC5kaWFsbGVkID0gY291bnRlcl9hbGxvYygibmV0LmNhbGwuZGlhbGxlZCIpOworCW5ldC0+c3RhdHMuY2FsbC5hbGVydGVkID0gY291bnRlcl9hbGxvYygibmV0LmNhbGwuYWxlcnRlZCIpOworCW5ldC0+c3RhdHMuY2FsbC5jb25uZWN0ZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuY2FsbC5jb25uZWN0ZWQiKTsKKwluZXQtPnN0YXRzLmNoYW4ucmZfZmFpbCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jaGFuLnJmX2ZhaWwiKTsKKwluZXQtPnN0YXRzLmNoYW4ucmxsX2VyciA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jaGFuLnJsbF9lcnIiKTsKKwluZXQtPnN0YXRzLmJ0cy5vbWxfZmFpbCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5idHMub21sX2ZhaWwiKTsKKwluZXQtPnN0YXRzLmJ0cy5yc2xfZmFpbCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5idHMucnNsX2ZhaWwiKTsKKworCW5ldC0+bW5jY19yZWN2ID0gbW5jY19yZWN2OworCisJcmV0dXJuIG5ldDsKK30KKworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfbnVtKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbnVtKQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlpZiAobnVtID49IG5ldC0+bnVtX2J0cykKKwkJcmV0dXJuIE5VTEw7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZuZXQtPmJ0c19saXN0LCBsaXN0KSB7CisJCWlmIChidHMtPm5yID09IG51bSkKKwkJCXJldHVybiBidHM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEdldCByZWZlcmVuY2UgdG8gYSBuZWlnaGJvciBjZWxsIG9uIGEgZ2l2ZW4gQkNDSCBBUkZDTiAqLworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfbmVpZ2hib3IoY29uc3Qgc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQkgdV9pbnQxNl90IGFyZmNuLCB1X2ludDhfdCBic2ljKQoreworCXN0cnVjdCBnc21fYnRzICpuZWlnaDsKKwkvKiBGSVhNRTogdXNlIHNvbWUgYmV0dGVyIGhldXJpc3RpY3MgaGVyZSB0byBkZXRlcm1pbmUgd2hpY2ggY2VsbAorCSAqIHVzaW5nIHRoaXMgQVJGQ04gcmVhbGx5IGlzIGNsb3Nlc3QgdG8gdGhlIHRhcmdldCBjZWxsLiAgRm9yCisJICogbm93IHdlIHNpbXBseSBhc3N1bWUgdGhhdCBlYWNoIEFSRkNOIHdpbGwgb25seSBiZSB1c2VkIGJ5IG9uZQorCSAqIGNlbGwgKi8KKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KG5laWdoLCAmYnRzLT5uZXR3b3JrLT5idHNfbGlzdCwgbGlzdCkgeworCQlpZiAobmVpZ2gtPmMwLT5hcmZjbiA9PSBhcmZjbiAmJgorCQkgICAgbmVpZ2gtPmJzaWMgPT0gYnNpYykKKwkJCXJldHVybiBuZWlnaDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9udW0oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCWlmIChudW0gPj0gYnRzLT5udW1fdHJ4KQorCQlyZXR1cm4gTlVMTDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRyeC0+bnIgPT0gbnVtKQorCQkJcmV0dXJuIHRyeDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgdHMyc3RyWzI1NV07CisKK2NoYXIgKmdzbV90cnhfbmFtZShzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzbnByaW50Zih0czJzdHIsIHNpemVvZih0czJzdHIpLCAiKGJ0cz0lZCx0cng9JWQpIiwKKwkJIHRyeC0+YnRzLT5uciwgdHJ4LT5ucik7CisKKwlyZXR1cm4gdHMyc3RyOworfQorCisKK2NoYXIgKmdzbV90c19uYW1lKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJc25wcmludGYodHMyc3RyLCBzaXplb2YodHMyc3RyKSwgIihidHM9JWQsdHJ4PSVkLHRzPSVkKSIsCisJCSB0cy0+dHJ4LT5idHMtPm5yLCB0cy0+dHJ4LT5uciwgdHMtPm5yKTsKKworCXJldHVybiB0czJzdHI7Cit9CisKK2NoYXIgKmdzbV9sY2hhbl9uYW1lKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSBsY2hhbi0+dHM7CisKKwlzbnByaW50Zih0czJzdHIsIHNpemVvZih0czJzdHIpLCAiKGJ0cz0lZCx0cng9JWQsdHM9JWQsc3M9JWQpIiwKKwkJIHRzLT50cngtPmJ0cy0+bnIsIHRzLT50cngtPm5yLCB0cy0+bnIsIGxjaGFuLT5ucik7CisKKwlyZXR1cm4gdHMyc3RyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBidHNfdHlwZXNbXSA9IHsKKwl7IEdTTV9CVFNfVFlQRV9VTktOT1dOLAkidW5rbm93biIgfSwKKwl7IEdTTV9CVFNfVFlQRV9CUzExLAkiYnMxMSIgfSwKKwl7IEdTTV9CVFNfVFlQRV9OQU5PQlRTLAkibmFub2J0cyIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitlbnVtIGdzbV9idHNfdHlwZSBwYXJzZV9idHN0eXBlKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlyZXR1cm4gZ2V0X3N0cmluZ192YWx1ZShidHNfdHlwZXMsIGFyZyk7Cit9CisKK2NvbnN0IGNoYXIgKmJ0c3R5cGUyc3RyKGVudW0gZ3NtX2J0c190eXBlIHR5cGUpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoYnRzX3R5cGVzLCB0eXBlKTsKK30KKworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9ieV9ucihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbnIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWlmICh0cngtPm5yID09IG5yKQorCQkJcmV0dXJuIHRyeDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNlYXJjaCBmb3IgYSBCVFMgaW4gdGhlIGdpdmVuIExvY2F0aW9uIEFyZWE7IG9wdGlvbmFsbHkgc3RhcnQgc2VhcmNoaW5nCisgKiB3aXRoIHN0YXJ0X2J0cyAoZm9yIGNvbnRpbnVpbmcgdG8gc2VhcmNoIGFmdGVyIHRoZSBmaXJzdCByZXN1bHQpICovCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19ieV9sYWMoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVuc2lnbmVkIGludCBsYWMsCisJCQkJc3RydWN0IGdzbV9idHMgKnN0YXJ0X2J0cykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWludCBza2lwID0gMDsKKworCWlmIChzdGFydF9idHMpCisJCXNraXAgPSAxOworCisJZm9yIChpID0gMDsgaSA8IG5ldC0+bnVtX2J0czsgaSsrKSB7CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgaSk7CisKKwkJaWYgKHNraXApIHsKKwkJCWlmIChzdGFydF9idHMgPT0gYnRzKQorCQkJCXNraXAgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobGFjID09IEdTTV9MQUNfUkVTRVJWRURfQUxMX0JUUyB8fCBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSA9PSBsYWMpCisJCQlyZXR1cm4gYnRzOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgYXV0aF9wb2xpY3lfbmFtZXNbXSA9IHsKKwl7IEdTTV9BVVRIX1BPTElDWV9DTE9TRUQsCSJjbG9zZWQiIH0sCisJeyBHU01fQVVUSF9QT0xJQ1lfQUNDRVBUX0FMTCwJImFjY2VwdC1hbGwiIH0sCisJeyBHU01fQVVUSF9QT0xJQ1lfVE9LRU4sCSJ0b2tlbiIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworZW51bSBnc21fYXV0aF9wb2xpY3kgZ3NtX2F1dGhfcG9saWN5X3BhcnNlKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlyZXR1cm4gZ2V0X3N0cmluZ192YWx1ZShhdXRoX3BvbGljeV9uYW1lcywgYXJnKTsKK30KKworY29uc3QgY2hhciAqZ3NtX2F1dGhfcG9saWN5X25hbWUoZW51bSBnc21fYXV0aF9wb2xpY3kgcG9saWN5KQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGF1dGhfcG9saWN5X25hbWVzLCBwb2xpY3kpOworfQorCisvKiB0aGlzIHNob3VsZCBub3QgYmUgaGVyZSBidXQgaW4gZ3NtXzA0XzA4Li4uIGJ1dCB0aGF0IGNyZWF0ZXMKKyAgIGluIHR1cm4gYSBkZXBlbmRlbmN5IG5pZ2h0bWFyZSAoYWJpc19ubSBkZXBlbmRpbmcgb24gMDRfMDgsIC4uLikgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfY29uc3RydWN0X3JhKHVfaW50OF90ICpidWYsIGNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkKQoreworCXVfaW50MTZfdCBtY2MgPSByYWlkLT5tY2M7CisJdV9pbnQxNl90IG1uYyA9IHJhaWQtPm1uYzsKKworCWJ1ZlswXSA9ICgobWNjIC8gMTAwKSAlIDEwKSB8ICgoKG1jYyAvIDEwKSAlIDEwKSA8PCA0KTsKKwlidWZbMV0gPSAobWNjICUgMTApOworCisJLyogSSB3b25kZXIgd2hvIGNhbWUgdXAgd2l0aCB0aGUgc3R1cGlkaXR5IG9mIGVuY29kaW5nIHRoZSBNTkMKKwkgKiBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGlnaXRzIGl0cyBkZWNpbWFsIG51bWJlciBoYXMhICovCisJaWYgKG1uYyA8IDEwMCkgeworCQlidWZbMV0gfD0gMHhmMDsKKwkJYnVmWzJdID0gKChtbmMgLyAxMCkgJSAxMCkgfCAoKG1uYyAlIDEwKSA8PCA0KTsKKwl9IGVsc2UgeworCQlidWZbMV0gfD0gKG1uYyAlIDEwKSA8PCA0OworCQlidWZbMl0gPSAoKG1uYyAvIDEwMCkgJSAxMCkgfCAoKChtY2MgLyAxMCkgJSAxMCkgPDwgNCk7CisJfQorCisJKih1X2ludDE2X3QgKikoYnVmKzMpID0gaHRvbnMocmFpZC0+bGFjKTsKKworCWJ1Zls1XSA9IHJhaWQtPnJhYzsKKworCXJldHVybiA2OworfQorCit2b2lkIGdwcnNfcmFfaWRfYnlfYnRzKHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXJhaWQtPm1jYyA9IGJ0cy0+bmV0d29yay0+Y291bnRyeV9jb2RlOworCXJhaWQtPm1uYyA9IGJ0cy0+bmV0d29yay0+bmV0d29ya19jb2RlOworCXJhaWQtPmxhYyA9IGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlOworCXJhaWQtPnJhYyA9IGJ0cy0+Z3Bycy5yYWM7Cit9CisKK2ludCBnc200OF9yYV9pZF9ieV9idHModV9pbnQ4X3QgKmJ1Ziwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3Byc19yYV9pZCByYWlkOworCisJZ3Byc19yYV9pZF9ieV9idHMoJnJhaWQsIGJ0cyk7CisKKwlyZXR1cm4gZ3NtNDhfY29uc3RydWN0X3JhKGJ1ZiwgJnJhaWQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBycmxwX21vZGVfbmFtZXNbXSA9IHsKKwl7IFJSTFBfTU9ERV9OT05FLAkibm9uZSIgfSwKKwl7IFJSTFBfTU9ERV9NU19CQVNFRCwJIm1zLWJhc2VkIiB9LAorCXsgUlJMUF9NT0RFX01TX1BSRUYsCSJtcy1wcmVmZXJyZWQiIH0sCisJeyBSUkxQX01PREVfQVNTX1BSRUYsCSJhc3MtcHJlZmVycmVkIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK2VudW0gcnJscF9tb2RlIHJybHBfbW9kZV9wYXJzZShjb25zdCBjaGFyICphcmcpCit7CisJcmV0dXJuIGdldF9zdHJpbmdfdmFsdWUocnJscF9tb2RlX25hbWVzLCBhcmcpOworfQorCitjb25zdCBjaGFyICpycmxwX21vZGVfbmFtZShlbnVtIHJybHBfbW9kZSBtb2RlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKHJybHBfbW9kZV9uYW1lcywgbW9kZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGJ0c19ncHJzX21vZGVfbmFtZXNbXSA9IHsKKwl7IEJUU19HUFJTX05PTkUsCSJub25lIiB9LAorCXsgQlRTX0dQUlNfR1BSUywJImdwcnMiIH0sCisJeyBCVFNfR1BSU19FR1BSUywJImVncHJzIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK2VudW0gYnRzX2dwcnNfbW9kZSBidHNfZ3Byc19tb2RlX3BhcnNlKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlyZXR1cm4gZ2V0X3N0cmluZ192YWx1ZShidHNfZ3Byc19tb2RlX25hbWVzLCBhcmcpOworfQorCitjb25zdCBjaGFyICpidHNfZ3Byc19tb2RlX25hbWUoZW51bSBidHNfZ3Byc19tb2RlIG1vZGUpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoYnRzX2dwcnNfbW9kZV9uYW1lcywgbW9kZSk7Cit9CisKK3N0cnVjdCBnc21fbWVhc19yZXAgKmxjaGFuX25leHRfbWVhc19yZXAoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9tZWFzX3JlcCAqbWVhc19yZXA7CisKKwltZWFzX3JlcCA9ICZsY2hhbi0+bWVhc19yZXBbbGNoYW4tPm1lYXNfcmVwX2lkeF07CisJbWVtc2V0KG1lYXNfcmVwLCAwLCBzaXplb2YoKm1lYXNfcmVwKSk7CisJbWVhc19yZXAtPmxjaGFuID0gbGNoYW47CisJbGNoYW4tPm1lYXNfcmVwX2lkeCA9IChsY2hhbi0+bWVhc19yZXBfaWR4ICsgMSkKKwkJCQkJJSBBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCk7CisKKwlyZXR1cm4gbWVhc19yZXA7Cit9CisKK2ludCBnc21fc2V0X2J0c190eXBlKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUpCit7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsOworCisJbW9kZWwgPSBidHNfbW9kZWxfZmluZCh0eXBlKTsKKwlpZiAoIW1vZGVsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ0cy0+dHlwZSA9IHR5cGU7CisJYnRzLT5tb2RlbCA9IG1vZGVsOworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQkvKiBTZXQgdGhlIGRlZmF1bHQgT01MIFN0cmVhbSBJRCB0byAweGZmICovCisJCWJ0cy0+b21sX3RlaSA9IDB4ZmY7CisJCWJ0cy0+YzAtPm5vbWluYWxfcG93ZXIgPSAyMzsKKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlci5jIGIvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTI1MDg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXIuYwpAQCAtMCwwICsxLDEzMCBAQAorLyogVGhlIGNvbmNlcHQgb2YgYSBzdWJzY3JpYmVyIGZvciB0aGUgTVNDLCByb3VnaGx5IEhMUi9WTFIgZnVuY3Rpb25hbGl0eSAqLworCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCAqc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcih2b2lkKTsKKworY2hhciAqc3Vic2NyX25hbWUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJaWYgKHN0cmxlbihzdWJzY3ItPm5hbWUpKQorCQlyZXR1cm4gc3Vic2NyLT5uYW1lOworCisJcmV0dXJuIHN1YnNjci0+aW1zaTsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X3Rtc2koc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgdV9pbnQzMl90IHRtc2kpCit7CisJY2hhciB0bXNpX3N0cmluZ1sxNF07CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiB3ZSBtaWdodCBoYXZlIGEgcmVjb3JkIGluIG1lbW9yeSBhbHJlYWR5ICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic2NyLCBzdWJzY3JfYnNjX2FjdGl2ZV9zdWJzY3JpYmVyKCksIGVudHJ5KSB7CisJCWlmICh0bXNpID09IHN1YnNjci0+dG1zaSkKKwkJCXJldHVybiBzdWJzY3JfZ2V0KHN1YnNjcik7CisJfQorCisJc3ByaW50Zih0bXNpX3N0cmluZywgIiV1IiwgdG1zaSk7CisJcmV0dXJuIGRiX2dldF9zdWJzY3JpYmVyKG5ldCwgR1NNX1NVQlNDUklCRVJfVE1TSSwgdG1zaV9zdHJpbmcpOworfQorCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfaW1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICBjb25zdCBjaGFyICppbXNpKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic2NyLCBzdWJzY3JfYnNjX2FjdGl2ZV9zdWJzY3JpYmVyKCksIGVudHJ5KSB7CisJCWlmIChzdHJjbXAoc3Vic2NyLT5pbXNpLCBpbXNpKSA9PSAwKQorCQkJcmV0dXJuIHN1YnNjcl9nZXQoc3Vic2NyKTsKKwl9CisKKwlyZXR1cm4gZGJfZ2V0X3N1YnNjcmliZXIobmV0LCBHU01fU1VCU0NSSUJFUl9JTVNJLCBpbXNpKTsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2V4dGVuc2lvbihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmV4dCkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnNjciwgc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcigpLCBlbnRyeSkgeworCQlpZiAoc3RyY21wKHN1YnNjci0+ZXh0ZW5zaW9uLCBleHQpID09IDApCisJCQlyZXR1cm4gc3Vic2NyX2dldChzdWJzY3IpOworCX0KKworCXJldHVybiBkYl9nZXRfc3Vic2NyaWJlcihuZXQsIEdTTV9TVUJTQ1JJQkVSX0VYVEVOU0lPTiwgZXh0KTsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2lkKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgaWQpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJY2hhciBidWZbMzJdOworCXNwcmludGYoYnVmLCAiJWxsdSIsIGlkKTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnNjciwgc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcigpLCBlbnRyeSkgeworCQlpZiAoc3Vic2NyLT5pZCA9PSBpZCkKKwkJCXJldHVybiBzdWJzY3JfZ2V0KHN1YnNjcik7CisJfQorCisJcmV0dXJuIGRiX2dldF9zdWJzY3JpYmVyKG5ldCwgR1NNX1NVQlNDUklCRVJfSUQsIGJ1Zik7Cit9CisKKworaW50IHN1YnNjcl91cGRhdGUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgcmVhc29uKQoreworCS8qIEZJWE1FOiBNaWdyYXRlIHBlbmRpbmcgcmVxdWVzdHMgZnJvbSBvbmUgQlNDIHRvIGFub3RoZXIgKi8KKwlzd2l0Y2ggKHJlYXNvbikgeworCWNhc2UgR1NNX1NVQlNDUklCRVJfVVBEQVRFX0FUVEFDSEVEOgorCQlzLT5uZXQgPSBidHMtPm5ldHdvcms7CisJCS8qIEluZGljYXRlICJhdHRhY2hlZCB0byBMQUMiICovCisJCXMtPmxhYyA9IGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlOworCQlMT0dQKERNTSwgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlcyBBVFRBQ0hFRCBMQUM9JXVcbiIsCisJCQlzdWJzY3JfbmFtZShzKSwgcy0+bGFjKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX1NVQlNDUiwgU19TVUJTQ1JfQVRUQUNIRUQsIHMpOworCQlicmVhazsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX1VQREFURV9ERVRBQ0hFRDoKKwkJLyogT25seSBkZXRhY2ggaWYgd2UgYXJlIGN1cnJlbnRseSBpbiB0aGlzIGFyZWEgKi8KKwkJaWYgKGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlID09IHMtPmxhYykKKwkJCXMtPmxhYyA9IEdTTV9MQUNfUkVTRVJWRURfREVUQUNIRUQ7CisJCUxPR1AoRE1NLCBMT0dMX0lORk8sICJTdWJzY3JpYmVyICVzIERFVEFDSEVEXG4iLCBzdWJzY3JfbmFtZShzKSk7CisJCWRpc3BhdGNoX3NpZ25hbChTU19TVUJTQ1IsIFNfU1VCU0NSX0RFVEFDSEVELCBzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJzdWJzY3JfdXBkYXRlIHdpdGggdW5rbm93biByZWFzb246ICVkXG4iLAorCQkJcmVhc29uKTsKKwkJYnJlYWs7CisJfTsKKwlyZXR1cm4gZGJfc3luY19zdWJzY3JpYmVyKHMpOworfQorCisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyX2Jhc2UuYyBiL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyX2Jhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGMzYmJkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXJfYmFzZS5jCkBAIC0wLDAgKzEsMjE0IEBACisvKiBUaGUgY29uY2VwdCBvZiBhIHN1YnNjcmliZXIgYXMgc2VlbiBieSB0aGUgQlNDICovCisKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCitMTElTVF9IRUFEKGFjdGl2ZV9zdWJzY3JpYmVycyk7Cit2b2lkICp0YWxsX3N1YnNjcl9jdHg7Cit2b2lkICp0YWxsX3N1Yl9yZXFfY3R4OworCisvKiBmb3IgdGhlIGdzbV9zdWJzY3JpYmVyLmMgKi8KK3N0cnVjdCBsbGlzdF9oZWFkICpzdWJzY3JfYnNjX2FjdGl2ZV9zdWJzY3JpYmVyKHZvaWQpCit7CisJcmV0dXJuICZhY3RpdmVfc3Vic2NyaWJlcnM7Cit9CisKKy8qCisgKiBTdHJ1Y3QgZm9yIHBlbmRpbmcgY2hhbm5lbCByZXF1ZXN0cy4gVGhpcyBpcyBtYW5hZ2VkIGluIHRoZQorICogbGxpc3RfaGVhZCByZXF1ZXN0cyBvZiBlYWNoIHN1YnNjcmliZXIuIFRoZSByZWZlcmVuY2UgY291bnRpbmcKKyAqIHNob3VsZCB3b3JrIGluIHN1Y2ggYSB3YXkgdGhhdCBhIHN1YnNjcmliZXIgd2l0aCBhIHBlbmRpbmcgcmVxdWVzdAorICogcmVtYWlucyBpbiBtZW1vcnkuCisgKi8KK3N0cnVjdCBzdWJzY3JfcmVxdWVzdCB7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisKKwkvKiBiYWNrIHJlZmVyZW5jZSAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJLyogdGhlIHJlcXVlc3RlZCBjaGFubmVsIHR5cGUgKi8KKwlpbnQgY2hhbm5lbF90eXBlOworCisJLyogdGhlIGNhbGxiYWNrIGRhdGEgKi8KKwlnc21fY2JmbiAqY2JmbjsKKwl2b2lkICpwYXJhbTsKK307CisKKy8qCisgKiBXZSBnb3QgdGhlIGNoYW5uZWwgYXNzaWduZWQgYW5kIGNhbiBub3cgaGFuZCB0aGlzIGNoYW5uZWwKKyAqIG92ZXIgdG8gb25lIG9mIG91ciBjYWxsYmFja3MuCisgKi8KK3N0YXRpYyBpbnQgc3Vic2NyX3BhZ2luZ19jYih1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50IGV2ZW50LAorCQkJICAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSAoc3RydWN0IGdzbV9zdWJzY3JpYmVyICopcGFyYW07CisKKwkvKiBUaGVyZSBpcyBubyByZXF1ZXN0IGFueW1vcmUuLi4gKi8KKwlpZiAobGxpc3RfZW1wdHkoJnN1YnNjci0+cmVxdWVzdHMpKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIEZJWE1FOiBXaGF0IHRvIGRvIHdpdGggcGFnaW5nIHJlcXVlc3RzIGNvbWluZyBkdXJpbmcKKwkgKiB0aGlzIGNhbGxiYWNrPyBXZSBtdXN0IGJlIHN1cmUgdG8gbm90IHN0YXJ0IHBhZ2luZyB3aGVuCisJICogd2UgaGF2ZSBhbiBhY3RpdmUgY29ubmVjdGlvbiB0byBhIHN1YnNjcmliZXIgYW5kIHRvIG1ha2UKKwkgKiB0aGUgc3Vic2NyX3B1dF9jaGFubmVsIHdvcmsgYXMgcmVxdWlyZWQuLi4KKwkgKi8KKwlyZXF1ZXN0ID0gKHN0cnVjdCBzdWJzY3JfcmVxdWVzdCAqKXN1YnNjci0+cmVxdWVzdHMubmV4dDsKKwlsbGlzdF9kZWwoJnJlcXVlc3QtPmVudHJ5KTsKKwlzdWJzY3ItPmluX2NhbGxiYWNrID0gMTsKKwlyZXF1ZXN0LT5jYmZuKGhvb2tudW0sIGV2ZW50LCBtc2csIGRhdGEsIHJlcXVlc3QtPnBhcmFtKTsKKwlzdWJzY3ItPmluX2NhbGxiYWNrID0gMDsKKworCXRhbGxvY19mcmVlKHJlcXVlc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdWJzY3Jfc2VuZF9wYWdpbmdfcmVxdWVzdChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgKnJlcXVlc3Q7CisJaW50IHJjOworCisJYXNzZXJ0KCFsbGlzdF9lbXB0eSgmc3Vic2NyLT5yZXF1ZXN0cykpOworCisJcmVxdWVzdCA9IChzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgKilzdWJzY3ItPnJlcXVlc3RzLm5leHQ7CisJcmMgPSBwYWdpbmdfcmVxdWVzdChzdWJzY3ItPm5ldCwgc3Vic2NyLCByZXF1ZXN0LT5jaGFubmVsX3R5cGUsCisJCQkgICAgc3Vic2NyX3BhZ2luZ19jYiwgc3Vic2NyKTsKKworCS8qIHBhZ2luZyBmYWlsZWQsIHF1aXQgbm93ICovCisJaWYgKHJjIDw9IDApIHsKKwkJc3Vic2NyX3BhZ2luZ19jYihHU01fSE9PS19SUl9QQUdJTkcsIEdTTV9QQUdJTkdfRVhQSVJFRCwKKwkJCQkgTlVMTCwgTlVMTCwgcmVxdWVzdC0+cGFyYW0pOworCX0KK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnM7CisKKwlzID0gdGFsbG9jX3plcm8odGFsbF9zdWJzY3JfY3R4LCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIpOworCWlmICghcykKKwkJcmV0dXJuIE5VTEw7CisKKwlsbGlzdF9hZGRfdGFpbCgmcy0+ZW50cnksICZhY3RpdmVfc3Vic2NyaWJlcnMpOworCXMtPnVzZV9jb3VudCA9IDE7CisJcy0+dG1zaSA9IEdTTV9SRVNFUlZFRF9UTVNJOworCisJSU5JVF9MTElTVF9IRUFEKCZzLT5yZXF1ZXN0cyk7CisKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQgc3Vic2NyX2ZyZWUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJbGxpc3RfZGVsKCZzdWJzY3ItPmVudHJ5KTsKKwl0YWxsb2NfZnJlZShzdWJzY3IpOworfQorCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3Vic2NyLT51c2VfY291bnQrKzsKKwlERUJVR1AoRFJFRiwgInN1YnNjciAlcyB1c2FnZSBpbmNyZWFzZXMgdXNhZ2UgdG86ICVkXG4iLAorCQkJc3Vic2NyLT5leHRlbnNpb24sIHN1YnNjci0+dXNlX2NvdW50KTsKKwlyZXR1cm4gc3Vic2NyOworfQorCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9wdXQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3Vic2NyLT51c2VfY291bnQtLTsKKwlERUJVR1AoRFJFRiwgInN1YnNjciAlcyB1c2FnZSBkZWNyZWFzZWQgdXNhZ2UgdG86ICVkXG4iLAorCQkJc3Vic2NyLT5leHRlbnNpb24sIHN1YnNjci0+dXNlX2NvdW50KTsKKwlpZiAoc3Vic2NyLT51c2VfY291bnQgPD0gMCkKKwkJc3Vic2NyX2ZyZWUoc3Vic2NyKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBzdWJzY3JfZ2V0X2NoYW5uZWwoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQlpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBzdWJzY3JfcmVxdWVzdCAqcmVxdWVzdDsKKworCXJlcXVlc3QgPSB0YWxsb2ModGFsbF9zdWJfcmVxX2N0eCwgc3RydWN0IHN1YnNjcl9yZXF1ZXN0KTsKKwlpZiAoIXJlcXVlc3QpIHsKKwkJaWYgKGNiZm4pCisJCQljYmZuKEdTTV9IT09LX1JSX1BBR0lORywgR1NNX1BBR0lOR19PT00sCisJCQkJTlVMTCwgTlVMTCwgcGFyYW0pOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KHJlcXVlc3QsIDAsIHNpemVvZigqcmVxdWVzdCkpOworCXJlcXVlc3QtPnN1YnNjciA9IHN1YnNjcjsKKwlyZXF1ZXN0LT5jaGFubmVsX3R5cGUgPSB0eXBlOworCXJlcXVlc3QtPmNiZm4gPSBjYmZuOworCXJlcXVlc3QtPnBhcmFtID0gcGFyYW07CisKKwkvKgorCSAqIEZJWE1FOiBXZSBtaWdodCBiZSBhYmxlIHRvIGFzc2lnbiBtb3JlIHRoYW4gb25lCisJICogY2hhbm5lbCwgZS5nLiB2b2ljZSBhbmQgU01TIHN1Ym1pdCBhdCB0aGUgc2FtZQorCSAqIHRpbWUuCisJICovCisJaWYgKCFzdWJzY3ItPmluX2NhbGxiYWNrICYmIGxsaXN0X2VtcHR5KCZzdWJzY3ItPnJlcXVlc3RzKSkgeworCQkvKiBhZGQgdG8gdGhlIGxpc3QsIHNlbmQgYSByZXF1ZXN0ICovCisJCWxsaXN0X2FkZF90YWlsKCZyZXF1ZXN0LT5lbnRyeSwgJnN1YnNjci0+cmVxdWVzdHMpOworCQlzdWJzY3Jfc2VuZF9wYWdpbmdfcmVxdWVzdChzdWJzY3IpOworCX0gZWxzZSB7CisJCS8qIHRoaXMgd2lsbCBiZSBwaWNrZWQgdXAgbGF0ZXIsIGZyb20gc3Vic2NyX3B1dF9jaGFubmVsICovCisJCWxsaXN0X2FkZF90YWlsKCZyZXF1ZXN0LT5lbnRyeSwgJnN1YnNjci0+cmVxdWVzdHMpOworCX0KK30KKwordm9pZCBzdWJzY3JfcHV0X2NoYW5uZWwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4gPSAmbGNoYW4tPmNvbm47CisJLyoKKwkgKiBGSVhNRTogQ29udGludWUgd2l0aCBvdGhlciByZXF1ZXN0cyBub3cuLi4gYnkgY2hlY2tpbmcKKwkgKiB0aGUgZ3NtX3N1YnNjcmliZXIgaW5zaWRlIHRoZSBnc21fbGNoYW4uIERyb3AgdGhlIHJlZiBjb3VudAorCSAqIG9mIHRoZSBsY2hhbiBhZnRlciBoYXZpbmcgYXNrZWQgdGhlIG5leHQgcmVxdWVzdGVlIHRvIGhhbmRsZQorCSAqIHRoZSBjaGFubmVsLgorCSAqLworCS8qCisJICogRklYTUU6IGlzIHRoZSBsY2hhbiBpcyBvZiBhIGRpZmZlcmVudCB0eXBlIHdlIGNvdWxkIHN0aWxsCisJICogaXNzdWUgYW4gaW1tZWRpYXRlIGFzc2lnbm1lbnQgZm9yIGFub3RoZXIgY2hhbm5lbCBhbmQgdGhlbgorCSAqIGNsb3NlIHRoaXMgb25lLgorCSAqLworCS8qCisJICogQ3VycmVudGx5IHdlIHdpbGwgZHJvcCB0aGUgbGFzdCByZWYgb2YgdGhlIGxjaGFuIHdoaWNoCisJICogd2lsbCByZXN1bHQgaW4gYSBjaGFubmVsIHJlbGVhc2Ugb24gUlNMIGFuZCB3ZSB3aWxsIHN0YXJ0CisJICogdGhlIHBhZ2luZy4gVGhpcyBzaG91bGQgd29yayBtb3N0IG9mIHRoZSB0aW1lIGFzIHRoZSBNUworCSAqIHdpbGwgbGlzdGVuIHRvIHRoZSBwYWdpbmcgcmVxdWVzdHMgYmVmb3JlIHdlIHRpbWVvdXQKKwkgKi8KKworCXB1dF9zdWJzY3JfY29uKGNvbm4pOworCisJaWYgKGxjaGFuLT5jb25uLnN1YnNjciAmJiAhbGxpc3RfZW1wdHkoJmxjaGFuLT5jb25uLnN1YnNjci0+cmVxdWVzdHMpKQorCQlzdWJzY3Jfc2VuZF9wYWdpbmdfcmVxdWVzdChsY2hhbi0+Y29ubi5zdWJzY3IpOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9kZWNpc2lvbi5jIGIvb3BlbmJzYy9zcmMvaGFuZG92ZXJfZGVjaXNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmFmY2E2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaGFuZG92ZXJfZGVjaXNpb24uYwpAQCAtMCwwICsxLDI5OCBAQAorLyogSGFuZG92ZXIgRGVjaXNpb24gbWFraW5nIGZvciBJbnRlci1CVFMgKEludHJhLUJTQykgSGFuZG92ZXIuICBUaGlzCisgKiBvbmx5IGltcGxlbWVudHMgdGhlIGhhbmRvdmVyIGFsZ29yaXRobS9kZWNpc2lvbiwgYnV0IG5vdCBleGVjdXRpb24KKyAqIG9mIGl0ICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9oYW5kb3Zlci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorCisvKiBpc3N1ZSBoYW5kb3ZlciB0byBhIGNlbGwgaWRlbnRpZmllZCBieSBBUkZDTiBhbmQgQlNJQyAqLworc3RhdGljIGludCBoYW5kb3Zlcl90b19hcmZjbl9ic2ljKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJCSAgdV9pbnQxNl90IGFyZmNuLCB1X2ludDhfdCBic2ljKQoreworCXN0cnVjdCBnc21fYnRzICpuZXdfYnRzOworCisJLyogcmVzb2x2ZSB0aGUgZ3NtX2J0cyBzdHJ1Y3R1cmUgZm9yIHRoZSBiZXN0IG5laWdoYm9yICovCisJbmV3X2J0cyA9IGdzbV9idHNfbmVpZ2hib3IobGNoYW4tPnRzLT50cngtPmJ0cywgYXJmY24sIGJzaWMpOworCWlmICghbmV3X2J0cykgeworCQlMT0dQKERITywgTE9HTF9OT1RJQ0UsICJ1bmFibGUgdG8gZGV0ZXJtaW5lIG5laWdoYm9yIEJUUyAiCisJCSAgICAgImZvciBBUkZDTiAldSBCU0lDICV1ID8hP1xuIiwgYXJmY24sIGJzaWMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBhbmQgYWN0dWFsbHkgdHJ5IHRvIGhhbmRvdmVyIHRvIHRoYXQgY2VsbCAqLworCXJldHVybiBic2NfaGFuZG92ZXJfc3RhcnQobGNoYW4sIG5ld19idHMpOworfQorCisvKiBkaWQgd2UgZ2V0IGEgUlhMRVYgZm9yIGEgZ2l2ZW4gY2VsbCBpbiB0aGUgZ2l2ZW4gcmVwb3J0PyAqLworc3RhdGljIGludCByeGxldl9mb3JfY2VsbF9pbl9yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIsCisJCQkJIHVfaW50MTZfdCBhcmZjbiwgdV9pbnQ4X3QgYnNpYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtci0+bnVtX2NlbGw7IGkrKykgeworCQlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgKm1yYyA9ICZtci0+Y2VsbFtpXTsKKworCQkvKiBzZWFyY2ggZm9yIG1hdGNoaW5nIHJlcG9ydCAqLworCQlpZiAoIShtcmMtPmFyZmNuID09IGFyZmNuICYmIG1yYy0+YnNpYyA9PSBic2ljKSkKKwkJCWNvbnRpbnVlOworCisJCW1yYy0+ZmxhZ3MgfD0gTVJDX0ZfUFJPQ0VTU0VEOworCQlyZXR1cm4gbXJjLT5yeGxldjsKKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIG9idGFpbiBhdmVyYWdlZCByeGxldiBmb3IgZ2l2ZW4gbmVpZ2hib3IgKi8KK3N0YXRpYyBpbnQgbmVpZ2hfbWVhc19hdmcoc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wLCBpbnQgd2luZG93KQoreworCXVuc2lnbmVkIGludCBpLCBpZHg7CisJaW50IGF2ZyA9IDA7CisKKwlpZHggPSBjYWxjX2luaXRpYWxfaWR4KEFSUkFZX1NJWkUobm1wLT5yeGxldiksCisJCQkJbm1wLT5yeGxldl9jbnQgJSBBUlJBWV9TSVpFKG5tcC0+cnhsZXYpLAorCQkJCXdpbmRvdyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgd2luZG93OyBpKyspIHsKKwkJaW50IGogPSAoaWR4K2kpICUgQVJSQVlfU0laRShubXAtPnJ4bGV2KTsKKworCQlhdmcgKz0gbm1wLT5yeGxldltqXTsKKwl9CisKKwlyZXR1cm4gYXZnIC8gd2luZG93OworfQorCisvKiBmaW5kIGVtcHR5IG9yIGV2aWN0IGJhZCBuZWlnaGJvciAqLworc3RhdGljIHN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKmZpbmRfZXZpY3RfbmVpZ2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJaW50IGosIHdvcnN0ID0gOTk5OTk5OworCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcF93b3JzdDsKKworCS8qIGZpcnN0IHRyeSB0byBmaW5kIGFuIGVtcHR5L3VudXNlZCBzbG90ICovCisJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUobGNoYW4tPm5laWdoX21lYXMpOyBqKyspIHsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wID0gJmxjaGFuLT5uZWlnaF9tZWFzW2pdOworCQlpZiAoIW5tcC0+YXJmY24pCisJCQlyZXR1cm4gbm1wOworCX0KKworCS8qIG5vIGVtcHR5IHNsb3QgZm91bmQuIGV2aWN0IHdvcnN0IG5laWdoYm9yIGZyb20gbGlzdCAqLworCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKGxjaGFuLT5uZWlnaF9tZWFzKTsgaisrKSB7CisJCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcCA9ICZsY2hhbi0+bmVpZ2hfbWVhc1tqXTsKKwkJaW50IGF2ZyA9IG5laWdoX21lYXNfYXZnKG5tcCwgTUFYX1dJTl9ORUlHSF9BVkcpOworCQlpZiAoYXZnIDwgd29yc3QpIHsKKwkJCXdvcnN0ID0gYXZnOworCQkJbm1wX3dvcnN0ID0gbm1wOworCQl9CisJfQorCisJcmV0dXJuIG5tcF93b3JzdDsKK30KKworLyogcHJvY2VzcyBuZWlnaGJvciBjZWxsIG1lYXN1cmVtZW50IHJlcG9ydHMgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfbWVhc19uZWlnaChzdHJ1Y3QgZ3NtX21lYXNfcmVwICptcikKK3sKKwlpbnQgaSwgaiwgaWR4OworCisJLyogZm9yIGVhY2ggcmVwb3J0ZWQgY2VsbCwgdHJ5IHRvIHVwZGF0ZSBnbG9iYWwgc3RhdGUgKi8KKwlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShtci0+bGNoYW4tPm5laWdoX21lYXMpOyBqKyspIHsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wID0gJm1yLT5sY2hhbi0+bmVpZ2hfbWVhc1tqXTsKKwkJdW5zaWduZWQgaW50IGlkeDsKKwkJaW50IHJ4bGV2OworCisJCS8qIHNraXAgdW51c2VkIGVudHJpZXMgKi8KKwkJaWYgKCFubXAtPmFyZmNuKQorCQkJY29udGludWU7CisKKwkJcnhsZXYgPSByeGxldl9mb3JfY2VsbF9pbl9yZXAobXIsIG5tcC0+YXJmY24sIG5tcC0+YnNpYyk7CisJCWlkeCA9IG5tcC0+cnhsZXZfY250ICUgQVJSQVlfU0laRShubXAtPnJ4bGV2KTsKKwkJaWYgKHJ4bGV2ID49IDApIHsKKwkJCW5tcC0+cnhsZXZbaWR4XSA9IHJ4bGV2OworCQkJbm1wLT5sYXN0X3NlZW5fbnIgPSBtci0+bnI7CisJCX0gZWxzZQorCQkJbm1wLT5yeGxldltpZHhdID0gMDsKKwkJbm1wLT5yeGxldl9jbnQrKzsKKwl9CisKKwkvKiBpdGVyYXRlIG92ZXIgbGlzdCBvZiByZXBvcnRlZCBjZWxscywgY2hlY2sgaWYgd2UgZGlkIG5vdAorCSAqIHByb2Nlc3MgYWxsIG9mIHRoZW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbXItPm51bV9jZWxsOyBpKyspIHsKKwkJc3RydWN0IGdzbV9tZWFzX3JlcF9jZWxsICptcmMgPSAmbXItPmNlbGxbaV07CisJCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKm5tcDsKKworCQlpZiAobXJjLT5mbGFncyAmIE1SQ19GX1BST0NFU1NFRCkKKwkJCWNvbnRpbnVlOworCisJCW5tcCA9IGZpbmRfZXZpY3RfbmVpZ2gobXItPmxjaGFuKTsKKworCQlubXAtPmFyZmNuID0gbXJjLT5hcmZjbjsKKwkJbm1wLT5ic2ljID0gbXJjLT5ic2ljOworCisJCWlkeCA9IG5tcC0+cnhsZXZfY250ICUgQVJSQVlfU0laRShubXAtPnJ4bGV2KTsKKwkJbm1wLT5yeGxldltpZHhdID0gbXJjLT5yeGxldjsKKwkJbm1wLT5yeGxldl9jbnQrKzsKKwkJbm1wLT5sYXN0X3NlZW5fbnIgPSBtci0+bnI7CisKKwkJbXJjLT5mbGFncyB8PSBNUkNfRl9QUk9DRVNTRUQ7CisJfQorfQorCisvKiBhdHRlbXB0IHRvIGRvIGEgaGFuZG92ZXIgKi8KK3N0YXRpYyBpbnQgYXR0ZW1wdF9oYW5kb3ZlcihzdHJ1Y3QgZ3NtX21lYXNfcmVwICptcikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IG1yLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgKmJlc3RfY2VsbCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGJlc3RfYmV0dGVyX2RiID0gMDsKKwlpbnQgaSwgcmM7CisKKwkvKiBmaW5kIHRoZSBiZXN0IGNlbGwgaW4gdGhpcyByZXBvcnQgdGhhdCBpcyBhdCBsZWFzdCBSWExFVl9IWVNUCisJICogYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQgc2VydmluZyBjZWxsICovCisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtci0+bGNoYW4tPm5laWdoX21lYXMpOyBpKyspIHsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wID0gJm1yLT5sY2hhbi0+bmVpZ2hfbWVhc1tpXTsKKwkJaW50IGF2ZywgYmV0dGVyOworCisJCS8qIHNraXAgZW1wdHkgc2xvdHMgKi8KKwkJaWYgKG5tcC0+YXJmY24gPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGNhY3VsYXRlIGF2ZXJhZ2UgcnhsZXYgZm9yIHRoaXMgY2VsbCBvdmVyIHRoZSB3aW5kb3cgKi8KKwkJYXZnID0gbmVpZ2hfbWVhc19hdmcobm1wLCBuZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmdfbmVpZ2gpOworCisJCS8qIGNoZWNrIGlmIGh5c3RlcmVzaXMgaXMgZnVsZmlsbGVkICovCisJCWlmIChhdmcgPCBtci0+ZGwuZnVsbC5yeF9sZXYgKyBuZXQtPmhhbmRvdmVyLnB3cl9oeXN0ZXJlc2lzKQorCQkJY29udGludWU7CisKKwkJYmV0dGVyID0gYXZnIC0gbXItPmRsLmZ1bGwucnhfbGV2OworCQlpZiAoYmV0dGVyID4gYmVzdF9iZXR0ZXJfZGIpIHsKKwkJCWJlc3RfY2VsbCA9IG5tcDsKKwkJCWJlc3RfYmV0dGVyX2RiID0gYmV0dGVyOworCQl9CisJfQorCisJaWYgKCFiZXN0X2NlbGwpCisJCXJldHVybiAwOworCisJTE9HUChESE8sIExPR0xfSU5GTywgIiVzOiBDZWxsIG9uIEFSRkNOICV1IGlzIGJldHRlcjogIiwKKwkJZ3NtX3RzX25hbWUobXItPmxjaGFuLT50cyksIGJlc3RfY2VsbC0+YXJmY24pOworCWlmICghbmV0LT5oYW5kb3Zlci5hY3RpdmUpIHsKKwkJTE9HUEMoREhPLCBMT0dMX0lORk8sICJTa2lwcGluZywgSGFuZG92ZXIgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IGhhbmRvdmVyX3RvX2FyZmNuX2JzaWMobXItPmxjaGFuLCBiZXN0X2NlbGwtPmFyZmNuLCBiZXN0X2NlbGwtPmJzaWMpOworCXN3aXRjaCAocmMpIHsKKwljYXNlIDA6CisJCUxPR1BDKERITywgTE9HTF9JTkZPLCAiU3RhcnRpbmcgaGFuZG92ZXJcbiIpOworCQlicmVhazsKKwljYXNlIC1FTk9TUEM6CisJCUxPR1BDKERITywgTE9HTF9JTkZPLCAiTm8gY2hhbm5lbCBhdmFpbGFibGVcbiIpOworCQlicmVhazsKKwljYXNlIC1FQlVTWToKKwkJTE9HUEMoREhPLCBMT0dMX0lORk8sICJIYW5kb3ZlciBhbHJlYWR5IGFjdGl2ZVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1BDKERITywgTE9HTF9FUlJPUiwgIlVua25vd24gZXJyb3JcbiIpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qIHByb2Nlc3MgYW4gYWxyZWFkeSBwYXJzZWQgbWVhc3VyZW1lbnQgcmVwb3J0IGFuZCBkZWNpZGUgaWYgd2Ugd2FudCB0bworICogYXR0ZW1wdCBhIGhhbmRvdmVyICovCitzdGF0aWMgaW50IHByb2Nlc3NfbWVhc19yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBtci0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlpbnQgYXZfcnhsZXY7CisKKwkvKiB3ZSBjdXJyZW50bHkgb25seSBkbyBoYW5kb3ZlciBmb3IgVENIIGNoYW5uZWxzICovCisJc3dpdGNoIChtci0+bGNoYW4tPnR5cGUpIHsKKwljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJLyogcGFyc2UgYWN0dWFsIG5laWdoYm9yIGNlbGwgaW5mbyAqLworCWlmIChtci0+bnVtX2NlbGwgPiAwICYmIG1yLT5udW1fY2VsbCA8IDcpCisJCXByb2Nlc3NfbWVhc19uZWlnaChtcik7CisKKwlhdl9yeGxldiA9IGdldF9tZWFzX3JlcF9hdmcobXItPmxjaGFuLCBNRUFTX1JFUF9ETF9SWExFVl9GVUxMLAorCQkJCSAgICBuZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmcpOworCisJLyogSW50ZXJmZXJlbmNlIEhPICovCisJaWYgKHJ4bGV2MmRibShhdl9yeGxldikgPiAtODUgJiYKKwkgICAgbWVhc19yZXBfbl9vdXRfb2ZfbV9iZShtci0+bGNoYW4sIE1FQVNfUkVQX0RMX1JYUVVBTF9GVUxMLAorCQkJCSAgIDMsIDQsIDUpKQorCQlyZXR1cm4gYXR0ZW1wdF9oYW5kb3Zlcihtcik7CisKKwkvKiBCYWQgUXVhbGl0eSAqLworCWlmIChtZWFzX3JlcF9uX291dF9vZl9tX2JlKG1yLT5sY2hhbiwgTUVBU19SRVBfRExfUlhRVUFMX0ZVTEwsCisJCQkJICAgMywgNCwgNSkpCisJCXJldHVybiBhdHRlbXB0X2hhbmRvdmVyKG1yKTsKKworCS8qIExvdyBMZXZlbCAqLworCWlmIChyeGxldjJkYm0oYXZfcnhsZXYpIDw9IC0xMTApCisJCXJldHVybiBhdHRlbXB0X2hhbmRvdmVyKG1yKTsKKworCS8qIERpc3RhbmNlICovCisJaWYgKG1yLT5tc19sMS50YSA+IG5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlKQorCQlyZXR1cm4gYXR0ZW1wdF9oYW5kb3Zlcihtcik7CisKKwkvKiBQb3dlciBCdWRnZXQgQUtBIEJldHRlciBDZWxsICovCisJaWYgKChtci0+bnIgJSBuZXQtPmhhbmRvdmVyLnB3cl9pbnRlcnZhbCkgPT0gMCkKKwkJcmV0dXJuIGF0dGVtcHRfaGFuZG92ZXIobXIpOworCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBob19kZWNfc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBnc21fbWVhc19yZXAgKm1yOworCisJaWYgKHN1YnN5cyAhPSBTU19MQ0hBTikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19MQ0hBTl9NRUFTX1JFUDoKKwkJbXIgPSBzaWduYWxfZGF0YTsKKwkJcHJvY2Vzc19tZWFzX3JlcChtcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIG9uX2Rzb19sb2FkX2hvX2RlYyh2b2lkKQoreworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX0xDSEFOLCBob19kZWNfc2lnX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2hhbmRvdmVyX2xvZ2ljLmMgYi9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9sb2dpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZmZlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9sb2dpYy5jCkBAIC0wLDAgKzEsMzc5IEBACisvKiBIYW5kb3ZlciBMb2dpYyBmb3IgSW50ZXItQlRTIChJbnRyYS1CU0MpIEhhbmRvdmVyLiAgVGhpcyBkb2VzIG5vdAorICogYWN0dWFsbHkgaW1wbGVtZW50IHRoZSBoYW5kb3ZlciBhbGdvcml0aG0vZGVjaXNpb24sIGJ1dCBleGVjdXRlcyBhCisgKiBoYW5kb3ZlciBkZWNpc2lvbiAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKworc3RydWN0IGJzY19oYW5kb3ZlciB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW47CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBUMzEwMzsKKworCXVfaW50OF90IGhvX3JlZjsKK307CisKK3N0YXRpYyBMTElTVF9IRUFEKGJzY19oYW5kb3ZlcnMpOworCitzdGF0aWMgc3RydWN0IGJzY19oYW5kb3ZlciAqYnNjX2hvX2J5X25ld19sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShobywgJmJzY19oYW5kb3ZlcnMsIGxpc3QpIHsKKwkJaWYgKGhvLT5uZXdfbGNoYW4gPT0gbmV3X2xjaGFuKQorCQkJcmV0dXJuIGhvOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGJzY19oYW5kb3ZlciAqYnNjX2hvX2J5X29sZF9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShobywgJmJzY19oYW5kb3ZlcnMsIGxpc3QpIHsKKwkJaWYgKGhvLT5vbGRfbGNoYW4gPT0gb2xkX2xjaGFuKQorCQkJcmV0dXJuIGhvOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBIYW5kIG92ZXIgdGhlIHNwZWNpZmllZCBsb2dpY2FsIGNoYW5uZWwgdG8gdGhlIHNwZWNpZmllZCBuZXcgQlRTLgorICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIGFjdHVhbCBoYW5kb3ZlciBhbGdvcml0aG0sCisgKiBhZnRlciBpdCBoYXMgZGVjaWRlZCBpdCB3YW50cyB0byBpbml0aWF0ZSBITyB0byBhIHNwZWNpZmljIEJUUyAqLworaW50IGJzY19oYW5kb3Zlcl9zdGFydChzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4sIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuOworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCXN0YXRpYyB1X2ludDhfdCBob19yZWY7CisJaW50IHJjOworCisJLyogZG9uJ3QgYXR0ZW1wdCBtdWx0aXBsZSBoYW5kb3ZlcnMgZm9yIHRoZSBzYW1lIGxjaGFuIGF0CisJICogdGhlIHNhbWUgdGltZSAqLworCWlmIChic2NfaG9fYnlfb2xkX2xjaGFuKG9sZF9sY2hhbikpCisJCXJldHVybiAtRUJVU1k7CisKKwlERUJVR1AoREhPLCAiKG9sZF9sY2hhbiBvbiBCVFMgJXUsIG5ldyBCVFMgJXUpXG4iLAorCQlvbGRfbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGJ0cy0+bnIpOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5oYW5kb3Zlci5hdHRlbXB0ZWQpOworCisJbmV3X2xjaGFuID0gbGNoYW5fYWxsb2MoYnRzLCBvbGRfbGNoYW4tPnR5cGUpOworCWlmICghbmV3X2xjaGFuKSB7CisJCUxPR1AoREhPLCBMT0dMX05PVElDRSwgIk5vIGZyZWUgY2hhbm5lbFxuIik7CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuaGFuZG92ZXIubm9fY2hhbm5lbCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWhvID0gdGFsbG9jX3plcm8oTlVMTCwgc3RydWN0IGJzY19oYW5kb3Zlcik7CisJaWYgKCFobykgeworCQlMT0dQKERITywgTE9HTF9GQVRBTCwgIk91dCBvZiBNZW1vcnlcbiIpOworCQlsY2hhbl9mcmVlKG5ld19sY2hhbik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwloby0+b2xkX2xjaGFuID0gb2xkX2xjaGFuOworCWhvLT5uZXdfbGNoYW4gPSBuZXdfbGNoYW47CisJaG8tPmhvX3JlZiA9IGhvX3JlZisrOworCisJLyogY29weSBzb21lIHBhcmFtZXRlcnMgZnJvbSBvbGQgbGNoYW4gKi8KKwltZW1jcHkoJm5ld19sY2hhbi0+ZW5jciwgJm9sZF9sY2hhbi0+ZW5jciwgc2l6ZW9mKG5ld19sY2hhbi0+ZW5jcikpOworCW5ld19sY2hhbi0+bXNfcG93ZXIgPSBvbGRfbGNoYW4tPm1zX3Bvd2VyOworCW5ld19sY2hhbi0+YnNfcG93ZXIgPSBvbGRfbGNoYW4tPmJzX3Bvd2VyOworCW5ld19sY2hhbi0+cnNsX2Ntb2RlID0gb2xkX2xjaGFuLT5yc2xfY21vZGU7CisJbmV3X2xjaGFuLT50Y2hfbW9kZSA9IG9sZF9sY2hhbi0+dGNoX21vZGU7CisJbmV3X2xjaGFuLT5jb25uLnN1YnNjciA9IHN1YnNjcl9nZXQob2xkX2xjaGFuLT5jb25uLnN1YnNjcik7CisKKwkvKiBGSVhNRTogZG8gd2UgaGF2ZSBhIGJldHRlciBpZGVhIG9mIHRoZSB0aW1pbmcgYWR2YW5jZT8gKi8KKwlyYyA9IHJzbF9jaGFuX2FjdGl2YXRlX2xjaGFuKG5ld19sY2hhbiwgUlNMX0FDVF9JTlRFUl9BU1lOQywgMCwKKwkJCQkgICAgIGhvLT5ob19yZWYpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJjb3VsZCBub3QgYWN0aXZhdGUgY2hhbm5lbFxuIik7CisJCXRhbGxvY19mcmVlKGhvKTsKKwkJbGNoYW5fZnJlZShuZXdfbGNoYW4pOworCQlyZXR1cm4gcmM7CisJfQorCisJcnNsX2xjaGFuX3NldF9zdGF0ZShuZXdfbGNoYW4sIExDSEFOX1NfQUNUX1JFUSk7CisJbGxpc3RfYWRkKCZoby0+bGlzdCwgJmJzY19oYW5kb3ZlcnMpOworCS8qIHdlIGNvbnRpbnVlIGluIHRoZSBTU19MQ0hBTiBoYW5kbGVyIC8gaG9fY2hhbl9hY3Rpdl9hY2sgKi8KKworCXJldHVybiAwOworfQorCisvKiBUMzEwMyBleHBpcmVkOiBIYW5kb3ZlciBoYXMgZmFpbGVkIHdpdGhvdXQgSE8gQ09NUExFVEUgb3IgSE8gRkFJTCAqLworc3RhdGljIHZvaWQgaG9fVDMxMDNfY2Iodm9pZCAqX2hvKQoreworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvID0gX2hvOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gaG8tPm5ld19sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCisJREVCVUdQKERITywgIkhPIFQzMTAzIGV4cGlyZWRcbiIpOworCWNvdW50ZXJfaW5jKG5ldC0+c3RhdHMuaGFuZG92ZXIudGltZW91dCk7CisKKwlsY2hhbl9mcmVlKGhvLT5uZXdfbGNoYW4pOworCWxsaXN0X2RlbCgmaG8tPmxpc3QpOworCXRhbGxvY19mcmVlKGhvKTsKK30KKworLyogUlNMIGhhcyBhY2tub3dsZWRnZWQgYWN0aXZhdGlvbiBvZiB0aGUgbmV3IGxjaGFuICovCitzdGF0aWMgaW50IGhvX2NoYW5fYWN0aXZfYWNrKHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKwlpbnQgcmM7CisKKwkvKiB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgY2hhbm5lbCBhY3RpdmF0aW9uIGlzIHJlbGF0ZWQgdG8KKwkgKiBhIGhhbmRvdmVyIGF0IGFsbCAoYW5kIGlmLCB3aGljaCBwYXJ0aWN1bGFyIGhhbmRvdmVyKSAqLworCWhvID0gYnNjX2hvX2J5X25ld19sY2hhbihuZXdfbGNoYW4pOworCWlmICghaG8pCisJCXJldHVybiAtRU5PREVWOworCisJREVCVUdQKERITywgImhhbmRvdmVyIGFjdGl2YXRlIGFjaywgc2VuZCBITyBDb21tYW5kXG4iKTsKKworCS8qIHdlIGNhbiBub3cgc2VuZCB0aGUgMDQuMDggSEFORE9WRVIgQ09NTUFORCB0byB0aGUgTVMKKwkgKiB1c2luZyB0aGUgb2xkIGxjaGFuICovCisKKwlyYyA9IGdzbTQ4X3NlbmRfaG9fY21kKGhvLT5vbGRfbGNoYW4sIG5ld19sY2hhbiwgMCwgaG8tPmhvX3JlZik7CisKKwkvKiBzdGFydCBUMzEwMy4gIFdlIGNhbiBjb250aW51ZSBlaXRoZXIgd2l0aCBUMzEwMyBleHBpcmF0aW9uLAorCSAqIDA0LjA4IEhBTkRPVkVSIENPTVBMRVRFIG9yIDA0LjA4IEhBTkRPVkVSIEZBSUwgKi8KKwloby0+VDMxMDMuY2IgPSBob19UMzEwM19jYjsKKwloby0+VDMxMDMuZGF0YSA9IGhvOworCWJzY19zY2hlZHVsZV90aW1lcigmaG8tPlQzMTAzLCAxMCwgMCk7CisKKwkvKiBjcmVhdGUgYSBSVFAgY29ubmVjdGlvbiAqLworCWlmIChpc19pcGFjY2Vzc19idHMobmV3X2xjaGFuLT50cy0+dHJ4LT5idHMpKQorCQlyc2xfaXBhY2NfY3JjeChuZXdfbGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJTTCBoYXMgbm90IGFja25vd2xlZGdlZCBhY3RpdmF0aW9uIG9mIHRoZSBuZXcgbGNoYW4gKi8KK3N0YXRpYyBpbnQgaG9fY2hhbl9hY3Rpdl9uYWNrKHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKworCWhvID0gYnNjX2hvX2J5X25ld19sY2hhbihuZXdfbGNoYW4pOworCWlmICghaG8pIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJ1bmFibGUgdG8gZmluZCBITyByZWNvcmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlsbGlzdF9kZWwoJmhvLT5saXN0KTsKKwl0YWxsb2NfZnJlZShobyk7CisKKwkvKiBGSVhNRTogbWF5YmUgd2Ugc2hvdWxkIHRyeSB0byBhbGxvY2F0ZSBhIG5ldyBMQ0hBTiBoZXJlPyAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdTTSAwNC4wOCBIQU5ET1ZFUiBDT01QTEVURSBoYXMgYmVlbiByZWNlaXZlZCBvbiBuZXcgY2hhbm5lbCAqLworc3RhdGljIGludCBob19nc200OF9ob19jb21wbChzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4pCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBuZXdfbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKworCWhvID0gYnNjX2hvX2J5X25ld19sY2hhbihuZXdfbGNoYW4pOworCWlmICghaG8pIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJ1bmFibGUgdG8gZmluZCBITyByZWNvcmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlMT0dQKERITywgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlcyBITyBmcm9tIEJUUyAldS0+JXUgb24gQVJGQ04gIgorCSAgICAgIiV1LT4ldVxuIiwgc3Vic2NyX25hbWUoaG8tPm9sZF9sY2hhbi0+Y29ubi5zdWJzY3IpLAorCSAgICAgaG8tPm9sZF9sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgbmV3X2xjaGFuLT50cy0+dHJ4LT5idHMtPm5yLAorCSAgICAgaG8tPm9sZF9sY2hhbi0+dHMtPnRyeC0+YXJmY24sIG5ld19sY2hhbi0+dHMtPnRyeC0+YXJmY24pOworCisJY291bnRlcl9pbmMobmV0LT5zdGF0cy5oYW5kb3Zlci5jb21wbGV0ZWQpOworCisJYnNjX2RlbF90aW1lcigmaG8tPlQzMTAzKTsKKworCS8qIHVwZGF0ZSBsY2hhbiBwb2ludGVyIG9mIHRyYW5zYWN0aW9uICovCisJdHJhbnNfbGNoYW5fY2hhbmdlKCZoby0+b2xkX2xjaGFuLT5jb25uLCAmbmV3X2xjaGFuLT5jb25uKTsKKworCXJzbF9sY2hhbl9zZXRfc3RhdGUoaG8tPm9sZF9sY2hhbiwgTENIQU5fU19JTkFDVElWRSk7CisJbGNoYW5fYXV0b19yZWxlYXNlKGhvLT5vbGRfbGNoYW4pOworCisJLyogZG8gc29tZXRoaW5nIHRvIHJlLXJvdXRlIHRoZSBhY3R1YWwgc3BlZWNoIGZyYW1lcyAhICovCisKKwlsbGlzdF9kZWwoJmhvLT5saXN0KTsKKwl0YWxsb2NfZnJlZShobyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR1NNIDA0LjA4IEhBTkRPVkVSIEZBSUwgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KK3N0YXRpYyBpbnQgaG9fZ3NtNDhfaG9fZmFpbChzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4pCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBvbGRfbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKworCWhvID0gYnNjX2hvX2J5X29sZF9sY2hhbihvbGRfbGNoYW4pOworCWlmICghaG8pIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJ1bmFibGUgdG8gZmluZCBITyByZWNvcmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljb3VudGVyX2luYyhuZXQtPnN0YXRzLmhhbmRvdmVyLmZhaWxlZCk7CisKKwlic2NfZGVsX3RpbWVyKCZoby0+VDMxMDMpOworCWxsaXN0X2RlbCgmaG8tPmxpc3QpOworCWNvbm4gPSAmaG8tPm5ld19sY2hhbi0+Y29ubjsKKwlwdXRfc3Vic2NyX2Nvbihjb25uKTsKKwl0YWxsb2NfZnJlZShobyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR1NNIDA4LjU4IEhBTkRPVkVSIERFVEVDVCBoYXMgYmVlbiByZWNlaXZlZCAqLworc3RhdGljIGludCBob19yc2xfZGV0ZWN0KHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKworCWhvID0gYnNjX2hvX2J5X25ld19sY2hhbihuZXdfbGNoYW4pOworCWlmICghaG8pIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJ1bmFibGUgdG8gZmluZCBITyByZWNvcmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBGSVhNRTogZG8gd2UgYWN0dWFsbHkgd2FudCB0byBkbyBzb21ldGhpbmcgaGVyZSA/ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBob19pcGFjX2NyY3hfYWNrKHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKwlzdHJ1Y3QgcnRwX3NvY2tldCAqb2xkX3JzLCAqbmV3X3JzLCAqb3RoZXJfcnM7CisKKwlobyA9IGJzY19ob19ieV9uZXdfbGNoYW4obmV3X2xjaGFuKTsKKwlpZiAoIWhvKSB7CisJCS8qIGl0IGlzIHBlcmZlY3RseSBub3JtYWwsIHdlIGhhdmUgQ1JDWCBldmVuIGluIG5vbi1ITyBjYXNlcyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaXBhY2NfcnRwX2RpcmVjdCkgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgInVuYWJsZSB0byBoYW5kb3ZlciBpbiBkaXJlY3QgUlRQIG1vZGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSVFAgUHJveHkgbW9kZSAqLworCW5ld19ycyA9IG5ld19sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0OworCW9sZF9ycyA9IGhvLT5vbGRfbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldDsKKworCWlmICghbmV3X3JzKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAibm8gUlRQIHNvY2tldCBmb3IgbmV3X2xjaGFuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcnNsX2lwYWNjX21kY3hfdG9fcnRwc29jayhuZXdfbGNoYW4pOworCisJaWYgKCFvbGRfcnMpIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJubyBSVFAgc29jZWt0IGZvciBvbGRfbGNoYW5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBjb3B5IHJ4X2FjdGlvbiBhbmQgcmVmZXJlbmNlIHRvIG90aGVyIHNvY2sgKi8KKwluZXdfcnMtPnJ4X2FjdGlvbiA9IG9sZF9ycy0+cnhfYWN0aW9uOworCW5ld19ycy0+dHhfYWN0aW9uID0gb2xkX3JzLT50eF9hY3Rpb247CisJbmV3X3JzLT50cmFuc21pdCA9IG9sZF9ycy0+dHJhbnNtaXQ7CisKKwlzd2l0Y2ggKGhvLT5vbGRfbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldC0+cnhfYWN0aW9uKSB7CisJY2FzZSBSVFBfUFJPWFk6CisJCW90aGVyX3JzID0gb2xkX3JzLT5wcm94eS5vdGhlcl9zb2NrOworCQlydHBfc29ja2V0X3Byb3h5KG5ld19ycywgb3RoZXJfcnMpOworCQkvKiBkZWxldGUgcmVmZXJlbmNlIHRvIG90aGVyIGVuZCBzb2NrZXQgdG8gcHJldmVudAorCQkgKiBydHBfc29ja2V0X2ZyZWUoKSBmcm9tIHJlbW92aW5nIHRoZSBpbnZlcnNlIHJlZmVyZW5jZSAqLworCQlvbGRfcnMtPnByb3h5Lm90aGVyX3NvY2sgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFJUUF9SRUNWX1VQU1RSRUFNOgorCQluZXdfcnMtPnJlY2VpdmUgPSBvbGRfcnMtPnJlY2VpdmU7CisJCWJyZWFrOworCWNhc2UgUlRQX05PTkU6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhvX2xvZ2ljX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCXN3aXRjaCAoc3Vic3lzKSB7CisJY2FzZSBTU19MQ0hBTjoKKwkJbGNoYW4gPSBzaWduYWxfZGF0YTsKKwkJc3dpdGNoIChzaWduYWwpIHsKKwkJY2FzZSBTX0xDSEFOX0FDVElWQVRFX0FDSzoKKwkJCXJldHVybiBob19jaGFuX2FjdGl2X2FjayhsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9BQ1RJVkFURV9OQUNLOgorCQkJcmV0dXJuIGhvX2NoYW5fYWN0aXZfbmFjayhsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9ERVRFQ1Q6CisJCQlyZXR1cm4gaG9fcnNsX2RldGVjdChsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9DT01QTDoKKwkJCXJldHVybiBob19nc200OF9ob19jb21wbChsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9GQUlMOgorCQkJcmV0dXJuIGhvX2dzbTQ4X2hvX2ZhaWwobGNoYW4pOworCQl9CisJCWJyZWFrOworCWNhc2UgU1NfQUJJU0lQOgorCQlsY2hhbiA9IHNpZ25hbF9kYXRhOworCQlzd2l0Y2ggKHNpZ25hbCkgeworCQljYXNlIFNfQUJJU0lQX0NSQ1hfQUNLOgorCQkJcmV0dXJuIGhvX2lwYWNfY3JjeF9hY2sobGNoYW4pOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfaG9fbG9naWModm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19MQ0hBTiwgaG9fbG9naWNfc2lnX2NiLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19BQklTSVAsIGhvX2xvZ2ljX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pbnB1dC9pcGFjY2Vzcy5jIGIvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YThhMTk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYwpAQCAtMCwwICsxLDgyMiBAQAorLyogT3BlbkJTQyBBYmlzIGlucHV0IGRyaXZlciBmb3IgaXAuYWNjZXNzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICogKEMpIDIwMTAgYnkgT24tV2F2ZXMKKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNkZWZpbmUgUFJJVl9PTUwgMQorI2RlZmluZSBQUklWX1JTTCAyCisKKy8qIGRhdGEgc3RydWN0dXJlIGZvciBvbmUgRTEgaW50ZXJmYWNlIHdpdGggQS1iaXMgKi8KK3N0cnVjdCBpYV9lMV9oYW5kbGUgeworCXN0cnVjdCBic2NfZmQgbGlzdGVuX2ZkOworCXN0cnVjdCBic2NfZmQgcnNsX2xpc3Rlbl9mZDsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWFfZTFfaGFuZGxlICplMWg7CisKKworI2RlZmluZSBUUzFfQUxMT0NfU0laRQk5MDAKKworc3RhdGljIGNvbnN0IHVfaW50OF90IHBvbmdbXSA9IHsgMCwgMSwgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX1BPTkcgfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBpZF9hY2tbXSA9IHsgMCwgMSwgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX0lEX0FDSyB9Oworc3RhdGljIGNvbnN0IHVfaW50OF90IGlkX3JlcVtdID0geyAwLCAxNywgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX0lEX0dFVCwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklULAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX01BQ0FERFIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04xLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19FUVVJUFZFUlMsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU1dWRVJTSU9OLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVROQU1FLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NFUk5SLAorCQkJCX07CisKK3N0YXRpYyBjb25zdCBjaGFyICppZHRhZ19uYW1lc1tdID0geworCVtJUEFDX0lEVEFHX1NFUk5SXQk9ICJTZXJpYWxfTnVtYmVyIiwKKwlbSVBBQ19JRFRBR19VTklUTkFNRV0JPSAiVW5pdF9OYW1lIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjFdCT0gIkxvY2F0aW9uXzEiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMl0JPSAiTG9jYXRpb25fMiIsCisJW0lQQUNfSURUQUdfRVFVSVBWRVJTXQk9ICJFcXVpcG1lbnRfVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfU1dWRVJTSU9OXQk9ICJTb2Z0d2FyZV9WZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19JUEFERFJdCT0gIklQX0FkZHJlc3MiLAorCVtJUEFDX0lEVEFHX01BQ0FERFJdCT0gIk1BQ19BZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19VTklUXQk9ICJVbml0X0lEIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppcGFjX2lkdGFnX25hbWUoaW50IHRhZykKK3sKKwlpZiAodGFnID49IEFSUkFZX1NJWkUoaWR0YWdfbmFtZXMpKQorCQlyZXR1cm4gInVua25vd24iOworCisJcmV0dXJuIGlkdGFnX25hbWVzW3RhZ107Cit9CisKK2ludCBpcGFjY2Vzc19pZHRhZ19wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqZGVjLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJdV9pbnQ4X3QgdF9sZW47CisJdV9pbnQ4X3QgdF90YWc7CisJdV9pbnQ4X3QgKmN1ciA9IGJ1ZjsKKworCXdoaWxlIChjdXIgPCBidWYgKyBsZW4pIHsKKwkJdF9sZW4gPSAqY3VyKys7CisJCXRfdGFnID0gKmN1cisrOworCisJCURFQlVHUEMoRE1JLCAiJXM9JyVzJyAiLCBpcGFjX2lkdGFnX25hbWUodF90YWcpLCBjdXIpOworCisJCWRlYy0+bHZbdF90YWddLmxlbiA9IHRfbGVuOworCQlkZWMtPmx2W3RfdGFnXS52YWwgPSBjdXI7CisKKwkJY3VyICs9IHRfbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGdzbV9idHMgKmZpbmRfYnRzX2J5X3VuaXRpZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkgICB1X2ludDE2X3Qgc2l0ZV9pZCwgdV9pbnQxNl90IGJ0c19pZCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkgeworCisJCWlmICghaXNfaXBhY2Nlc3NfYnRzKGJ0cykpCisJCQljb250aW51ZTsKKworCQlpZiAoYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCA9PSBzaXRlX2lkICYmCisJCSAgICBidHMtPmlwX2FjY2Vzcy5idHNfaWQgPT0gYnRzX2lkKQorCQkJcmV0dXJuIGJ0czsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBwYXJzZV91bml0aWQoY29uc3QgY2hhciAqc3RyLCB1X2ludDE2X3QgKnNpdGVfaWQsIHVfaW50MTZfdCAqYnRzX2lkLAorCQkJdV9pbnQxNl90ICp0cnhfaWQpCit7CisJdW5zaWduZWQgbG9uZyB1bDsKKwljaGFyICplbmRwdHI7CisJY29uc3QgY2hhciAqbnB0cjsKKworCW5wdHIgPSBzdHI7CisJdWwgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyIDw9IG5wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzaXRlX2lkKQorCQkqc2l0ZV9pZCA9IHVsICYgMHhmZmZmOworCisJaWYgKCplbmRwdHIrKyAhPSAnLycpCisJCXJldHVybiAtRUlOVkFMOworCisJbnB0ciA9IGVuZHB0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGJ0c19pZCkKKwkJKmJ0c19pZCA9IHVsICYgMHhmZmZmOworCisJaWYgKCplbmRwdHIrKyAhPSAnLycpCisJCXJldHVybiAtRUlOVkFMOworCQorCW5wdHIgPSBlbmRwdHI7CisJdWwgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyIDw9IG5wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0cnhfaWQpCisJCSp0cnhfaWQgPSB1bCAmIDB4ZmZmZjsKKworCXJldHVybiAwOworfQorCisvKiBzZW5kIHRoZSBpZCBhY2sgKi8KK2ludCBpcGFjY2Vzc19zZW5kX2lkX2FjayhpbnQgZmQpCit7CisJcmV0dXJuIHdyaXRlKGZkLCBpZF9hY2ssIHNpemVvZihpZF9hY2spKTsKK30KKworaW50IGlwYWNjZXNzX3NlbmRfaWRfcmVxKGludCBmZCkKK3sKKwlyZXR1cm4gd3JpdGUoZmQsIGlkX3JlcSwgc2l6ZW9mKGlkX3JlcSkpOworfQorCisvKiBiYXNlIGhhbmRsaW5nIG9mIHRoZSBpcC5hY2Nlc3MgcHJvdG9jb2wgKi8KK2ludCBpcGFjY2Vzc19yY3Ztc2dfYmFzZShzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJIHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwl1X2ludDhfdCBtc2dfdHlwZSA9ICoobXNnLT5sMmgpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgSVBBQ19NU0dUX1BJTkc6CisJCXJldCA9IHdyaXRlKGJmZC0+ZmQsIHBvbmcsIHNpemVvZihwb25nKSk7CisJCWJyZWFrOworCWNhc2UgSVBBQ19NU0dUX1BPTkc6CisJCURFQlVHUChETUksICJQT05HIVxuIik7CisJCWJyZWFrOworCWNhc2UgSVBBQ19NU0dUX0lEX0FDSzoKKwkJREVCVUdQKERNSSwgIklEX0FDSz8gLT4gQUNLIVxuIik7CisJCXJldCA9IGlwYWNjZXNzX3NlbmRfaWRfYWNrKGJmZC0+ZmQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBhY2Nlc3NfcmN2bXNnKHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJICAgc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCB0bHZfcGFyc2VkIHRsdnA7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSAqKG1zZy0+bDJoKTsKKwl1X2ludDE2X3Qgc2l0ZV9pZCA9IDAsIGJ0c19pZCA9IDAsIHRyeF9pZCA9IDA7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCS8qIGhhbmRsZSBiYXNlIG1lc3NhZ2VzICovCisJaXBhY2Nlc3NfcmN2bXNnX2Jhc2UobXNnLCBiZmQpOworCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgSVBBQ19NU0dUX0lEX1JFU1A6CisJCURFQlVHUChETUksICJJRF9SRVNQICIpOworCQkvKiBwYXJzZSB0YWdzLCBzZWFyY2ggZm9yIFVuaXQgSUQgKi8KKwkJaXBhY2Nlc3NfaWR0YWdfcGFyc2UoJnRsdnAsICh1X2ludDhfdCAqKW1zZy0+bDJoICsgMiwKKwkJCQkgbXNnYl9sMmxlbihtc2cpLTIpOworCQlERUJVR1AoRE1JLCAiXG4iKTsKKworCQlpZiAoIVRMVlBfUFJFU0VOVCgmdGx2cCwgSVBBQ19JRFRBR19VTklUKSkKKwkJCWJyZWFrOworCisJCS8qIGxvb2t1cCBCVFMsIGNyZWF0ZSBzaWduX2xpbmssIC4uLiAqLworCQlwYXJzZV91bml0aWQoKGNoYXIgKilUTFZQX1ZBTCgmdGx2cCwgSVBBQ19JRFRBR19VTklUKSwKKwkJCSAgICAgJnNpdGVfaWQsICZidHNfaWQsICZ0cnhfaWQpOworCQlidHMgPSBmaW5kX2J0c19ieV91bml0aWQoZTFoLT5nc21uZXQsIHNpdGVfaWQsIGJ0c19pZCk7CisJCWlmICghYnRzKSB7CisJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJVbmFibGUgdG8gZmluZCBCVFMgY29uZmlndXJhdGlvbiBmb3IgIgorCQkJICAgICAgICIgJXUvJXUvJXUsIGRpc2Nvbm5lY3RpbmdcbiIsIHNpdGVfaWQsIGJ0c19pZCwKKwkJCQl0cnhfaWQpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJREVCVUdQKERJTlAsICJJZGVudGlmaWVkIEJUUyAldS8ldS8ldVxuIiwgc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQpOworCQlpZiAoYmZkLT5wcml2X25yID09IFBSSVZfT01MKSB7CisJCQkvKiBkcm9wIGFueSBvbGQgb21sIGNvbm5lY3Rpb24gKi8KKwkJCWlwYWNjZXNzX2Ryb3Bfb21sKGJ0cyk7CisJCQlidHMtPm9tbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZSgmbGluZS0+dHNbUFJJVl9PTUwgLSAxXSwKKwkJCQkJCSAgRTFJTlBfU0lHTl9PTUwsIGJ0cy0+YzAsCisJCQkJCQkgIGJ0cy0+b21sX3RlaSwgMCk7CisJCX0gZWxzZSBpZiAoYmZkLT5wcml2X25yID09IFBSSVZfUlNMKSB7CisJCQlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKwkJCXN0cnVjdCBic2NfZmQgKm5ld2JmZDsKKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X2lkKTsKKworCQkJLyogZHJvcCBhbnkgb2xkIHJzbCBjb25uZWN0aW9uICovCisJCQlpcGFjY2Vzc19kcm9wX3JzbCh0cngpOworCisJCQlpZiAoIWJ0cy0+b21sX2xpbmspIHsKKwkJCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCQkJCWNsb3NlKGJmZC0+ZmQpOworCQkJCWJmZC0+ZmQgPSAtMTsKKwkJCQl0YWxsb2NfZnJlZShiZmQpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQliZmQtPmRhdGEgPSBsaW5lID0gYnRzLT5vbWxfbGluay0+dHMtPmxpbmU7CisJCQllMWlfdHMgPSAmbGluZS0+dHNbUFJJVl9SU0wgKyB0cnhfaWQgLSAxXTsKKwkJCW5ld2JmZCA9ICZlMWlfdHMtPmRyaXZlci5pcGFjY2Vzcy5mZDsKKwkJCWUxaW5wX3RzX2NvbmZpZyhlMWlfdHMsIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisKKwkJCXRyeC0+cnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKGUxaV90cywKKwkJCQkJCQlFMUlOUF9TSUdOX1JTTCwgdHJ4LAorCQkJCQkJCXRyeC0+cnNsX3RlaSwgMCk7CisKKwkJCS8qIGdldCByaWQgb2Ygb3VyIG9sZCB0ZW1wb3JhcnkgYmZkICovCisJCQltZW1jcHkobmV3YmZkLCBiZmQsIHNpemVvZigqbmV3YmZkKSk7CisJCQluZXdiZmQtPnByaXZfbnIgPSBQUklWX1JTTCArIHRyeF9pZDsKKwkJCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJCQliZmQtPmZkID0gLTE7CisJCQl0YWxsb2NfZnJlZShiZmQpOworCQkJYnNjX3JlZ2lzdGVyX2ZkKG5ld2JmZCk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIE9NTF9VUAkJMHgwMDAxCisjZGVmaW5lIFJTTF9VUAkJMHgwMDAyCisKKy8qCisgKiByZWFkIG9uZSBpcGEgbWVzc2FnZSBmcm9tIHRoZSBzb2NrZXQKKyAqIHJldHVybiBOVUxMIGluIGNhc2Ugb2YgZXJyb3IKKyAqLworc3RydWN0IG1zZ2IgKmlwYWNjZXNzX3JlYWRfbXNnKHN0cnVjdCBic2NfZmQgKmJmZCwgaW50ICplcnJvcikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhUUzFfQUxMT0NfU0laRSwgIkFiaXMvSVAiKTsKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisJaW50IGxlbiwgcmV0ID0gMDsKKworCWlmICghbXNnKSB7CisJCSplcnJvciA9IC1FTk9NRU07CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGZpcnN0IHJlYWQgb3VyIDMtYnl0ZSBoZWFkZXIgKi8KKwloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2ctPmRhdGE7CisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmRhdGEsIHNpemVvZigqaGgpLCAwKTsKKwlpZiAocmV0ID09IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IHJldDsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmIChyZXQgIT0gc2l6ZW9mKCpoaCkpIHsKKwkJaWYgKGVycm5vICE9IEVBR0FJTikKKwkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInJlY3YgZXJyb3IgJWQgJXNcbiIsIHJldCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IHJldDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbXNnYl9wdXQobXNnLCByZXQpOworCisJLyogdGhlbiByZWFkIHRlIGxlbmd0aCBhcyBzcGVjaWZpZWQgaW4gaGVhZGVyICovCisJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBzaXplb2YoKmhoKTsKKwlsZW4gPSBudG9ocyhoaC0+bGVuKTsKKworCWlmIChsZW4gPCAwIHx8IFRTMV9BTExPQ19TSVpFIDwgbGVuICsgc2l6ZW9mKCpoaCkpIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiQ2FuIG5vdCByZWFkIHRoaXMgcGFja2V0LiAlZCBhdmFpbFxuIiwgbGVuKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IC1FSU87CisJCXJldHVybiBOVUxMOworCX0KKworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5sMmgsIGxlbiwgMCk7CisJaWYgKHJldCA8IGxlbikgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJzaG9ydCByZWFkISBHb3QgJWQgZnJvbSAlZFxuIiwgcmV0LCBsZW4pOworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gLUVJTzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCXJldHVybiBtc2c7Cit9CisKK2ludCBpcGFjY2Vzc19kcm9wX29tbChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBlMWlucF90cyAqdHM7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGJzY19mZCAqYmZkOworCisJaWYgKCFidHMgfHwgIWJ0cy0+b21sX2xpbmspCisJCXJldHVybiAtMTsKKworCS8qIHNlbmQgT01MIGRvd24gKi8KKwl0cyA9IGJ0cy0+b21sX2xpbmstPnRzOworCWxpbmUgPSB0cy0+bGluZTsKKwllMWlucF9ldmVudCh0cywgRVZUX0UxX1RFSV9ETiwgYnRzLT5vbWxfbGluay0+dGVpLCBidHMtPm9tbF9saW5rLT5zYXBpKTsKKworCWJmZCA9ICZ0cy0+ZHJpdmVyLmlwYWNjZXNzLmZkOworCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJY2xvc2UoYmZkLT5mZCk7CisJYmZkLT5mZCA9IC0xOworCisJLyogY2xlYW4gdXAgT01MIGFuZCBSU0wgKi8KKwllMWlucF9zaWduX2xpbmtfZGVzdHJveShidHMtPm9tbF9saW5rKTsKKwlidHMtPm9tbF9saW5rID0gTlVMTDsKKwlidHMtPmlwX2FjY2Vzcy5mbGFncyA9IDA7CisKKwkvKiBkcm9wIGFsbCBSU0wgY29ubmVjdGlvbnMgdG9vICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkKKwkJaXBhY2Nlc3NfZHJvcF9yc2wodHJ4KTsKKworCS8qIGtpbGwgdGhlIEUxIGxpbmUgbm93Li4uIGFzIHdlIGhhdmUgbm8gb25lIGxlZnQgdG8gdXNlIGl0ICovCisJdGFsbG9jX2ZyZWUobGluZSk7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaXBhY2Nlc3NfZHJvcChzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKwlpbnQgYnRzX25yOworCisJaWYgKCF0cykgeworCQkvKgorCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgVFMgdGhpcyBtZWFucyB0aGF0IHRoaXMgaXMgYSBSU0wKKwkJICogY29ubmVjdGlvbiBidXQgd2UgYXJlIG5vdCBwYXN0IHRoZSBhdXRoZW50aWNhdGlvbgorCQkgKiBoYW5kbGluZyB5ZXQuIFNvIHdlIGNhbiBzYWZlbHkgZGVsZXRlIHRoaXMgYmZkIGFuZAorCQkgKiB3YWl0IGZvciBhIHJlY29ubmVjdC4KKwkJICovCisJCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJCWNsb3NlKGJmZC0+ZmQpOworCQliZmQtPmZkID0gLTE7CisJCXRhbGxvY19mcmVlKGJmZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhdHRlbXB0IHRvIGZpbmQgYSBzaWduYWxsaW5nIGxpbmsgKi8KKwlpZiAodHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9TSUdOKSB7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmssICZ0cy0+c2lnbi5zaWduX2xpbmtzLCBsaXN0KSB7CisJCQlidHNfbnIgPSBsaW5rLT50cngtPmJ0cy0+YnRzX25yOworCQkJLyogd2UgaGF2ZSBpc3N1ZXMganVzdCByZWNvbm5lY3RpbmcgUkxTIHNvIHdlIGRyb3AgT01MICovCisJCQlpcGFjY2Vzc19kcm9wX29tbChsaW5rLT50cngtPmJ0cyk7CisJCQlyZXR1cm4gYnRzX25yOworCQl9CisJfQorCisJLyogZXJyb3IgY2FzZSAqLworCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBmaW5kIGEgc2lnbmFsbGluZyBsaW5rIGZvciB0czogJXBcbiIsIHRzKTsKKwlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCWNsb3NlKGJmZC0+ZmQpOworCWJmZC0+ZmQgPSAtMTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBpcGFjY2Vzc19kcm9wX3JzbChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisJc3RydWN0IGUxaW5wX3RzICp0czsKKworCWlmICghdHJ4IHx8ICF0cngtPnJzbF9saW5rKQorCQlyZXR1cm4gLTE7CisKKwkvKiBzZW5kIFJTTCBkb3duICovCisJdHMgPSB0cngtPnJzbF9saW5rLT50czsKKwllMWlucF9ldmVudCh0cywgRVZUX0UxX1RFSV9ETiwgdHJ4LT5yc2xfbGluay0+dGVpLCB0cngtPnJzbF9saW5rLT5zYXBpKTsKKworCS8qIGNsb3NlIHRoZSBzb2NrZXQgKi8KKwliZmQgPSAmdHMtPmRyaXZlci5pcGFjY2Vzcy5mZDsKKwlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCWNsb3NlKGJmZC0+ZmQpOworCWJmZC0+ZmQgPSAtMTsKKworCS8qIGRlc3Ryb3kgKi8KKwllMWlucF9zaWduX2xpbmtfZGVzdHJveSh0cngtPnJzbF9saW5rKTsKKwl0cngtPnJzbF9saW5rID0gTlVMTDsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBoYW5kbGVfdHMxX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCWludCByZXQgPSAwLCBlcnJvcjsKKworCW1zZyA9IGlwYWNjZXNzX3JlYWRfbXNnKGJmZCwgJmVycm9yKTsKKwlpZiAoIW1zZykgeworCQlpZiAoZXJyb3IgPT0gMCkgeworCQkJaW50IHJldCA9IGlwYWNjZXNzX2Ryb3AoZTFpX3RzLCBiZmQpOworCQkJaWYgKHJldCA+PSAwKQorCQkJCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICJCVFMgJXUgZGlzYXBwZWFyZWQsIGRlYWQgc29ja2V0XG4iLAorCQkJCQlyZXQpOworCQkJZWxzZQorCQkJCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIEJUUyBkaXNhcHBlYXJlZCwgZGVhZCBzb2NrZXRcbiIpOworCQl9CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlERUJVR1AoRE1JLCAiUlggJXU6ICVzXG4iLCB0c19uciwgaGV4ZHVtcChtc2diX2wyKG1zZyksIG1zZ2JfbDJsZW4obXNnKSkpOworCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnLT5kYXRhOworCWlmIChoaC0+cHJvdG8gPT0gSVBBQ19QUk9UT19JUEFDQ0VTUykgeworCQlyZXQgPSBpcGFjY2Vzc19yY3Ztc2cobGluZSwgbXNnLCBiZmQpOworCQlpZiAocmV0IDwgMCkKKwkJCWlwYWNjZXNzX2Ryb3AoZTFpX3RzLCBiZmQpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogQklHIEZBVCBXQVJOSU5HOiBiZmQgbWlnaHQgbm8gbG9uZ2VyIGV4aXN0IGhlcmUsIHNpbmNlIGlwYWNjZXNzX3Jjdm1zZygpCisJICogbWlnaHQgaGF2ZSBmcmVlJ2QgaXQgISEhICovCisKKwlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayhlMWlfdHMsIGhoLT5wcm90bywgMCk7CisJaWYgKCFsaW5rKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIm5vIG1hdGNoaW5nIHNpZ25hbGxpbmcgbGluayBmb3IgIgorCQkJImhoLT5wcm90bz0weCUwMnhcbiIsIGhoLT5wcm90byk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXNnLT50cnggPSBsaW5rLT50cng7CisKKwlzd2l0Y2ggKGxpbmstPnR5cGUpIHsKKwljYXNlIEUxSU5QX1NJR05fUlNMOgorCQlpZiAoIShtc2ctPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgJiAoUlNMX1VQIDw8IG1zZy0+dHJ4LT5ucikpKSB7CisJCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfVVAsIGxpbmstPnRlaSwgbGluay0+c2FwaSk7CisJCQltc2ctPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgfD0gKFJTTF9VUCA8PCBtc2ctPnRyeC0+bnIpOworCQl9CisJCXJldCA9IGFiaXNfcnNsX3Jjdm1zZyhtc2cpOworCQlicmVhazsKKwljYXNlIEUxSU5QX1NJR05fT01MOgorCQlpZiAoIShtc2ctPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgJiBPTUxfVVApKSB7CisJCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfVVAsIGxpbmstPnRlaSwgbGluay0+c2FwaSk7CisJCQltc2ctPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgfD0gT01MX1VQOworCQl9CisJCXJldCA9IGFiaXNfbm1fcmN2bXNnKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICJVbmtub3duIElQLmFjY2VzcyBwcm90b2NvbCBwcm90bz0weCUwMnhcbiIsIGhoLT5wcm90byk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpcGFjY2Vzc19wcmVwZW5kX2hlYWRlcihzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgcHJvdG8pCit7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCisJLyogcHJlcGVuZCB0aGUgaXAuYWNjZXNzIGhlYWRlciAqLworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqaGgpKTsKKwloaC0+bGVuID0gaHRvbnMobXNnLT5sZW4gLSBzaXplb2YoKmhoKSk7CisJaGgtPnByb3RvID0gcHJvdG87Cit9CisKK3N0YXRpYyBpbnQgdHNfd2FudF93cml0ZShzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cykKK3sKKwllMWlfdHMtPmRyaXZlci5pcGFjY2Vzcy5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0aW1lb3V0X3RzMV93cml0ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gKHN0cnVjdCBlMWlucF90cyAqKWRhdGE7CisKKwkvKiB0cmlnZ2VyIHdyaXRlIG9mIHRzMSwgZHVlIHRvIHR4IGRlbGF5IHRpbWVyICovCisJdHNfd2FudF93cml0ZShlMWlfdHMpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90czFfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpzaWduX2xpbms7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCBwcm90bzsKKwlpbnQgcmV0OworCisJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisKKwkvKiBnZXQgdGhlIG5leHQgbXNnIGZvciB0aGlzIHRpbWVzbG90ICovCisJbXNnID0gZTFpbnBfdHhfdHMoZTFpX3RzLCAmc2lnbl9saW5rKTsKKwlpZiAoIW1zZykgeworCQkvKiBubyBtZXNzYWdlIGFmdGVyIHR4IGRlbGF5IHRpbWVyICovCisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoc2lnbl9saW5rLT50eXBlKSB7CisJY2FzZSBFMUlOUF9TSUdOX09NTDoKKwkJcHJvdG8gPSBJUEFDX1BST1RPX09NTDsKKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9TSUdOX1JTTDoKKwkJcHJvdG8gPSBJUEFDX1BST1RPX1JTTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXNnYl9mcmVlKG1zZyk7CisJCWJmZC0+d2hlbiB8PSBCU0NfRkRfV1JJVEU7IC8qIGNvbWUgYmFjayBmb3IgbW9yZSBtc2cgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisJaXBhY2Nlc3NfcHJlcGVuZF9oZWFkZXIobXNnLCBzaWduX2xpbmstPnRlaSk7CisKKwlERUJVR1AoRE1JLCAiVFggJXU6ICVzXG4iLCB0c19uciwgaGV4ZHVtcChtc2ctPmwyaCwgbXNnYl9sMmxlbihtc2cpKSk7CisKKwlyZXQgPSBzZW5kKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4sIDApOworCW1zZ2JfZnJlZShtc2cpOworCisJLyogc2V0IHR4IGRlbGF5IHRpbWVyIGZvciBuZXh0IGV2ZW50ICovCisJZTFpX3RzLT5zaWduLnR4X3RpbWVyLmNiID0gdGltZW91dF90czFfd3JpdGU7CisJZTFpX3RzLT5zaWduLnR4X3RpbWVyLmRhdGEgPSBlMWlfdHM7CisKKwkvKiBSZWR1Y2luZyB0aGlzIG1pZ2h0IGJyZWFrIHRoZSBuYW5vQlRTIDkwMCBpbml0LiAqLworCWJzY19zY2hlZHVsZV90aW1lcigmZTFpX3RzLT5zaWduLnR4X3RpbWVyLCAwLCAxMDAwMDApOworCisJcmV0dXJuIHJldDsKK30KKworLyogY2FsbGJhY2sgZnJvbSBzZWxlY3QuYyBpbiBjYXNlIG9uZSBvZiB0aGUgZmQncyBjYW4gYmUgcmVhZC93cml0dGVuICovCitzdGF0aWMgaW50IGlwYWNjZXNzX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXVuc2lnbmVkIGludCBpZHggPSB0c19uci0xOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzOworCWludCByYyA9IDA7CisKKwkvKiBJbiBjYXNlIG9mIGVhcmx5IFJTTCB3ZSBtaWdodCBub3QgeWV0IGhhdmUgYSBsaW5lICovCisKKwlpZiAobGluZSkKKyAJCWUxaV90cyA9ICZsaW5lLT50c1tpZHhdOworCisJaWYgKCFsaW5lIHx8IGUxaV90cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX1NJR04pIHsKKwkJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJCXJjID0gaGFuZGxlX3RzMV9yZWFkKGJmZCk7CisJCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQkJcmMgPSBoYW5kbGVfdHMxX3dyaXRlKGJmZCk7CisJfSBlbHNlCisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInVua25vd24gRTEgVFMgdHlwZSAldVxuIiwgZTFpX3RzLT50eXBlKTsKKworCXJldHVybiByYzsKK30KKworCitzdHJ1Y3QgZTFpbnBfZHJpdmVyIGlwYWNjZXNzX2RyaXZlciA9IHsKKwkubmFtZSA9ICJpcC5hY2Nlc3MiLAorCS53YW50X3dyaXRlID0gdHNfd2FudF93cml0ZSwKK307CisKKy8qIGNhbGxiYWNrIG9mIHRoZSBPTUwgbGlzdGVuaW5nIGZpbGVkZXNjcmlwdG9yICovCitzdGF0aWMgaW50IGxpc3Rlbl9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpsaXN0ZW5fYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmV0OworCWludCBpZHggPSAwOworCWludCBpOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzOworCXN0cnVjdCBic2NfZmQgKmJmZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJc29ja2xlbl90IHNhX2xlbiA9IHNpemVvZihzYSk7CisKKwlpZiAoISh3aGF0ICYgQlNDX0ZEX1JFQUQpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGFjY2VwdChsaXN0ZW5fYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2EsICZzYV9sZW4pOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigiYWNjZXB0Iik7CisJCXJldHVybiByZXQ7CisJfQorCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICJhY2NlcHQoKWVkIG5ldyBPTUwgbGluayBmcm9tICVzXG4iLAorCQlpbmV0X250b2Eoc2Euc2luX2FkZHIpKTsKKworCWxpbmUgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBlMWlucF9saW5lKTsKKwlpZiAoIWxpbmUpIHsKKwkJY2xvc2UocmV0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWxpbmUtPmRyaXZlciA9ICZpcGFjY2Vzc19kcml2ZXI7CisJLy9saW5lLT5kcml2ZXJfZGF0YSA9IGUxaDsKKwkvKiBjcmVhdGUgdmlycnR1YWwgRTEgdGltZXNsb3RzIGZvciBzaWduYWxsaW5nICovCisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1sxLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCisJLyogaW5pdGlhbGl6ZSB0aGUgZmRzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGluZS0+dHMpOyArK2kpCisJCWxpbmUtPnRzW2ldLmRyaXZlci5pcGFjY2Vzcy5mZC5mZCA9IC0xOworCisJZTFpX3RzID0gJmxpbmUtPnRzW2lkeF07CisKKwliZmQgPSAmZTFpX3RzLT5kcml2ZXIuaXBhY2Nlc3MuZmQ7CisJYmZkLT5mZCA9IHJldDsKKwliZmQtPmRhdGEgPSBsaW5lOworCWJmZC0+cHJpdl9uciA9IFBSSVZfT01MOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJdGFsbG9jX2ZyZWUobGluZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogUmVxdWVzdCBJRC4gRklYTUU6IHJlcXVlc3QgTE9DQVRJT04sIEhXL1NXIFZFcnNpb24sIFVuaXQgTmFtZSwgU2Vybm8gKi8KKwlyZXQgPSBpcGFjY2Vzc19zZW5kX2lkX3JlcShiZmQtPmZkKTsKKworICAgICAgICByZXR1cm4gcmV0OworCS8vcmV0dXJuIGUxaW5wX2xpbmVfcmVnaXN0ZXIobGluZSk7Cit9CisKK3N0YXRpYyBpbnQgcnNsX2xpc3Rlbl9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpsaXN0ZW5fYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJc29ja2xlbl90IHNhX2xlbiA9IHNpemVvZihzYSk7CisJc3RydWN0IGJzY19mZCAqYmZkOworCWludCByZXQ7CisKKwlpZiAoISh3aGF0ICYgQlNDX0ZEX1JFQUQpKQorCQlyZXR1cm4gMDsKKworCWJmZCA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGJzY19mZCk7CisJaWYgKCFiZmQpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogU29tZSBCVFMgaGFzIGNvbm5lY3RlZCB0byB1cywgYnV0IHdlIGRvbid0IGtub3cgeWV0IHdoaWNoIGxpbmUKKwkgKiAoYXMgY3JlYXRlZCBieSB0aGUgT01MIGxpbmspIHRvIGFzc29jaWF0ZSBpdCB3aXRoLiAgVGh1cywgd2UKKwkgKiBhbGxvY2F0ZSBhIHRlbXBvcmFyeSBiZmQgdW50aWwgd2UgaGF2ZSByZWNlaXZlZCBJRCBmcm9tIEJUUyAqLworCisJYmZkLT5mZCA9IGFjY2VwdChsaXN0ZW5fYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2EsICZzYV9sZW4pOworCWlmIChiZmQtPmZkIDwgMCkgeworCQlwZXJyb3IoImFjY2VwdCIpOworCQlyZXR1cm4gYmZkLT5mZDsKKwl9CisJTE9HUChESU5QLCBMT0dMX05PVElDRSwgImFjY2VwdCgpZWQgbmV3IFJTTCBsaW5rIGZyb20gJXNcbiIsIGluZXRfbnRvYShzYS5zaW5fYWRkcikpOworCWJmZC0+cHJpdl9uciA9IFBSSVZfUlNMOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJdGFsbG9jX2ZyZWUoYmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogUmVxdWVzdCBJRC4gRklYTUU6IHJlcXVlc3QgTE9DQVRJT04sIEhXL1NXIFZFcnNpb24sIFVuaXQgTmFtZSwgU2Vybm8gKi8KKwlyZXQgPSB3cml0ZShiZmQtPmZkLCBpZF9yZXEsIHNpemVvZihpZF9yZXEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1ha2Vfc29jayhzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVfaW50MTZfdCBwb3J0LAorCQkgICAgIGludCAoKmNiKShzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCByZXQsIG9uID0gMTsKKwkKKwliZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisJYmZkLT5jYiA9IGNiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCS8vYmZkLT5kYXRhID0gbGluZTsKKworCWlmIChiZmQtPmZkIDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY3JlYXRlIFRDUCBzb2NrZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBiaW5kIGwyIHNvY2tldCAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBsaXN0ZW4oYmZkLT5mZCwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJsaXN0ZW4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiByZXQ7CisJfQorCQorCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigicmVnaXN0ZXJfbGlzdGVuX2ZkIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQWN0aXZlbHkgY29ubmVjdCB0byBhIEJUUy4gIEN1cnJlbnRseSB1c2VkIGJ5IGlwYWNjZXNzLWNvbmZpZy5jICovCitpbnQgaXBhY2Nlc3NfY29ubmVjdChzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgc3RydWN0IHNvY2thZGRyX2luICpzYSkKK3sKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1swXTsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSAmZTFpX3RzLT5kcml2ZXIuaXBhY2Nlc3MuZmQ7CisJaW50IHJldCwgb24gPSAxOworCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRCB8IEJTQ19GRF9XUklURTsKKwliZmQtPmRhdGEgPSBsaW5lOworCWJmZC0+cHJpdl9uciA9IFBSSVZfT01MOworCisJaWYgKGJmZC0+ZmQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBjcmVhdGUgVENQIHNvY2tldC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzZXRzb2Nrb3B0KGJmZC0+ZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKworCXJldCA9IGNvbm5lY3QoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSBzYSwgc2l6ZW9mKCpzYSkpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBjb25uZWN0IHNvY2tldFxuIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwkKKwlsaW5lLT5kcml2ZXIgPSAmaXBhY2Nlc3NfZHJpdmVyOworCisgICAgICAgIHJldHVybiByZXQ7CisJLy9yZXR1cm4gZTFpbnBfbGluZV9yZWdpc3RlcihsaW5lKTsKK30KKworaW50IGlwYWNjZXNzX3NldHVwKHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0KQoreworCWludCByZXQ7CisKKwkvKiByZWdpc3RlciB0aGUgZHJpdmVyIHdpdGggdGhlIGNvcmUgKi8KKwkvKiBGSVhNRTogZG8gdGhpcyBpbiB0aGUgcGx1Z2luIGluaXRpYWxpemVyIGZ1bmN0aW9uICovCisJcmV0ID0gZTFpbnBfZHJpdmVyX3JlZ2lzdGVyKCZpcGFjY2Vzc19kcml2ZXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwllMWggPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBpYV9lMV9oYW5kbGUpOworCWlmICghZTFoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWUxaC0+Z3NtbmV0ID0gZ3NtbmV0OworCisJLyogTGlzdGVuIGZvciBPTUwgY29ubmVjdGlvbnMgKi8KKwlyZXQgPSBtYWtlX3NvY2soJmUxaC0+bGlzdGVuX2ZkLCBJUEFfVENQX1BPUlRfT01MLCBsaXN0ZW5fZmRfY2IpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogTGlzdGVuIGZvciBSU0wgY29ubmVjdGlvbnMgKi8KKwlyZXQgPSBtYWtlX3NvY2soJmUxaC0+cnNsX2xpc3Rlbl9mZCwgSVBBX1RDUF9QT1JUX1JTTCwgcnNsX2xpc3Rlbl9mZF9jYik7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaW5wdXQvbWlzZG4uYyBiL29wZW5ic2Mvc3JjL2lucHV0L21pc2RuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiMDFmMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lucHV0L21pc2RuLmMKQEAgLTAsMCArMSw1MzYgQEAKKy8qIE9wZW5CU0MgQWJpcyBpbnB1dCBkcml2ZXIgZm9yIG1JU0ROdXNlciAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxtSVNETmlmLmg+CisKKy8vI2RlZmluZSBBRl9DT01QQVRJQklMSVRZX0ZVTkMKKy8vI2luY2x1ZGUgPGNvbXBhdF9hZl9pc2RuLmg+CisjaWZuZGVmIEFGX0lTRE4KKyNkZWZpbmUgQUZfSVNETiAzNAorI2RlZmluZSBQRl9JU0ROIEFGX0lTRE4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2RlZmluZSBUUzFfQUxMT0NfU0laRQkzMDAKKworc3RydWN0IHByaW1fbmFtZSB7CisJdW5zaWduZWQgaW50IHByaW07CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK2NvbnN0IHN0cnVjdCBwcmltX25hbWUgcHJpbV9uYW1lc1tdID0geworCXsgUEhfQ09OVFJPTF9JTkQsICJQSF9DT05UUk9MX0lORCIgfSwKKwl7IFBIX0RBVEFfSU5ELCAiUEhfREFUQV9JTkQiIH0sCisJeyBQSF9EQVRBX0NORiwgIlBIX0RBVEFfQ05GIiB9LAorCXsgUEhfQUNUSVZBVEVfSU5ELCAiUEhfQUNUSVZBVEVfSU5EIiB9LAorCXsgRExfRVNUQUJMSVNIX0lORCwgIkRMX0VTVEFCTElTSF9JTkQiIH0sCisJeyBETF9FU1RBQkxJU0hfQ05GLCAiRExfRVNUQUJMSVNIX0NORiIgfSwKKwl7IERMX1JFTEVBU0VfSU5ELCAiRExfUkVMRUFTRV9JTkQiIH0sCisJeyBETF9SRUxFQVNFX0NORiwgIkRMX1JFTEVBU0VfQ05GIiB9LAorCXsgRExfREFUQV9JTkQsICJETF9EQVRBX0lORCIgfSwKKwl7IERMX1VOSVREQVRBX0lORCwgIkRMX1VOSVREQVRBX0lORCIgfSwKKwl7IERMX0lORk9STUFUSU9OX0lORCwgIkRMX0lORk9STUFUSU9OX0lORCIgfSwKKwl7IE1QSF9BQ1RJVkFURV9JTkQsICJNUEhfQUNUSVZBVEVfSU5EIiB9LAorCXsgTVBIX0RFQUNUSVZBVEVfSU5ELCAiTVBIX0RFQUNUSVZBVEVfSU5EIiB9LAorfTsKKworY29uc3QgY2hhciAqZ2V0X3ByaW1fbmFtZSh1bnNpZ25lZCBpbnQgcHJpbSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByaW1fbmFtZXMpOyBpKyspIHsKKwkJaWYgKHByaW1fbmFtZXNbaV0ucHJpbSA9PSBwcmltKQorCQkJcmV0dXJuIHByaW1fbmFtZXNbaV0ubmFtZTsKKwl9CisKKwlyZXR1cm4gIlVOS05PV04iOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90czFfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoVFMxX0FMTE9DX1NJWkUsICJtSVNETiBUUzEiKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4gbDJhZGRyOworCXN0cnVjdCBtSVNETmhlYWQgKmhoOworCXNvY2tsZW5fdCBhbGVuOworCWludCByZXQ7CisKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloaCA9IChzdHJ1Y3QgbUlTRE5oZWFkICopIG1zZy0+ZGF0YTsKKworCWFsZW4gPSBzaXplb2YobDJhZGRyKTsKKwlyZXQgPSByZWN2ZnJvbShiZmQtPmZkLCBtc2ctPmRhdGEsIDMwMCwgMCwKKwkJICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmwyYWRkciwgJmFsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAicmVjdmZyb20gZXJyb3IgICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChhbGVuICE9IHNpemVvZihsMmFkZHIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgZXJyb3IgbGVuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCURFQlVHUChETUksICJhbGVuID0lZCwgZGV2KCVkKSBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlhbGVuLCBsMmFkZHIuZGV2LCBsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCisJREVCVUdQKERNSSwgIjw9IGxlbiA9ICVkLCBwcmltKDB4JXgpIGlkKDB4JXgpOiAlc1xuIiwKKwkJcmV0LCBoaC0+cHJpbSwgaGgtPmlkLCBnZXRfcHJpbV9uYW1lKGhoLT5wcmltKSk7CisKKwlzd2l0Y2ggKGhoLT5wcmltKSB7CisJY2FzZSBETF9JTkZPUk1BVElPTl9JTkQ6CisJCS8qIG1JU0ROIHRlbGxzIHVzIHdoaWNoIGNoYW5uZWwgbnVtYmVyIGlzIGFsbG9jYXRlZCBmb3IgdGhpcworCQkgKiB0dXBsZSBvZiAoU0FQSSwgVEVJKS4gKi8KKwkJREVCVUdQKERNSSwgIkRMX0lORk9STUFUSU9OX0lORDogdXNlIGNoYW5uZWwoJWQpIHNhcGkoJWQpIHRlaSglZCkgZm9yIG5vd1xuIiwKKwkJCWwyYWRkci5jaGFubmVsLCBsMmFkZHIuc2FwaSwgbDJhZGRyLnRlaSk7CisJCWxpbmsgPSBlMWlucF9sb29rdXBfc2lnbl9saW5rKGUxaV90cywgbDJhZGRyLnRlaSwgbDJhZGRyLnNhcGkpOworCQlpZiAoIWxpbmspIHsKKwkJCURFQlVHUEMoRE1JLCAibUlTRE4gbWVzc2FnZSBmb3IgdW5rbm93biBzaWduX2xpbmtcbiIpOworCQkJbXNnYl9mcmVlKG1zZyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBzYXZlIHRoZSBjaGFubmVsIG51bWJlciBpbiB0aGUgZHJpdmVyIHByaXZhdGUgc3RydWN0ICovCisJCWxpbmstPmRyaXZlci5taXNkbi5jaGFubmVsID0gbDJhZGRyLmNoYW5uZWw7CisJCWJyZWFrOworCWNhc2UgRExfRVNUQUJMSVNIX0lORDoKKwkJREVCVUdQKERNSSwgIkRMX0VTVEFCTElTSF9JTkQ6IGNoYW5uZWwoJWQpIHNhcGkoJWQpIHRlaSglZClcbiIsCisJCWwyYWRkci5jaGFubmVsLCBsMmFkZHIuc2FwaSwgbDJhZGRyLnRlaSk7CisJCXJldCA9IGUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9VUCwgbDJhZGRyLnRlaSwgbDJhZGRyLnNhcGkpOworCQlicmVhazsKKwljYXNlIERMX1JFTEVBU0VfSU5EOgorCQlERUJVR1AoRE1JLCAiRExfUkVMRUFTRV9JTkQ6IGNoYW5uZWwoJWQpIHNhcGkoJWQpIHRlaSglZClcbiIsCisJCWwyYWRkci5jaGFubmVsLCBsMmFkZHIuc2FwaSwgbDJhZGRyLnRlaSk7CisJCXJldCA9IGUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9ETiwgbDJhZGRyLnRlaSwgbDJhZGRyLnNhcGkpOworCQlicmVhazsKKwljYXNlIERMX0RBVEFfSU5EOgorCWNhc2UgRExfVU5JVERBVEFfSU5EOgorCQltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIE1JU0ROX0hFQURFUl9MRU47CisJCURFQlVHUChETUksICJSWDogJXNcbiIsIGhleGR1bXAobXNnYl9sMihtc2cpLCByZXQgLSBNSVNETl9IRUFERVJfTEVOKSk7CisJCXJldCA9IGUxaW5wX3J4X3RzKGUxaV90cywgbXNnLCBsMmFkZHIudGVpLCBsMmFkZHIuc2FwaSk7CisJCWJyZWFrOworCWNhc2UgUEhfQUNUSVZBVEVfSU5EOgorCQlERUJVR1AoRE1JLCAiUEhfQUNUSVZBVEVfSU5EOiBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlicmVhazsKKwljYXNlIFBIX0RFQUNUSVZBVEVfSU5EOgorCQlERUJVR1AoRE1JLCAiUEhfREVBQ1RJVkFURV9JTkQ6IGNoYW5uZWwoJWQpIHNhcGkoJWQpIHRlaSglZClcbiIsCisJCWwyYWRkci5jaGFubmVsLCBsMmFkZHIuc2FwaSwgbDJhZGRyLnRlaSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRzX3dhbnRfd3JpdGUoc3RydWN0IGUxaW5wX3RzICplMWlfdHMpCit7CisJLyogV2UgbmV2ZXIgaW5jbHVkZSB0aGUgbUlTRE4gQi1DaGFubmVsIEZEIGludG8gdGhlCisJICogd3JpdGVzZXQsIHNpbmNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBwb2xsKCkgYmFzZWQKKwkgKiB3cml0ZSBmbG93IGNvbnRyb2wgKi8JCQorCWlmIChlMWlfdHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9UUkFVKQorCQlyZXR1cm4gMDsKKworCWUxaV90cy0+ZHJpdmVyLm1pc2RuLmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfdHMxX3dyaXRlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAoc3RydWN0IGUxaW5wX3RzICopZGF0YTsKKworCS8qIHRyaWdnZXIgd3JpdGUgb2YgdHMxLCBkdWUgdG8gdHggZGVsYXkgdGltZXIgKi8KKwl0c193YW50X3dyaXRlKGUxaV90cyk7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3RzMV93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnNpZ25fbGluazsKKwlzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4gc2E7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaDsKKwl1X2ludDhfdCAqbDJfZGF0YTsKKwlpbnQgcmV0OworCisJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisKKwkvKiBnZXQgdGhlIG5leHQgbXNnIGZvciB0aGlzIHRpbWVzbG90ICovCisJbXNnID0gZTFpbnBfdHhfdHMoZTFpX3RzLCAmc2lnbl9saW5rKTsKKwlpZiAoIW1zZykgeworCQkvKiBubyBtZXNzYWdlIGFmdGVyIHR4IGRlbGF5IHRpbWVyICovCisJCXJldHVybiAwOworCX0KKworCWwyX2RhdGEgPSBtc2ctPmRhdGE7CisKKwkvKiBwcmVwZW5kIHRoZSBtSVNETmhlYWQgKi8KKwloaCA9IChzdHJ1Y3QgbUlTRE5oZWFkICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqaGgpKTsKKwloaC0+cHJpbSA9IERMX0RBVEFfUkVROworCisJREVCVUdQKERNSSwgIlRYIFRFSSglZCkgU0FQSSglZCk6ICVzXG4iLCBzaWduX2xpbmstPnRlaSwKKwkJc2lnbl9saW5rLT5zYXBpLCBoZXhkdW1wKGwyX2RhdGEsIG1zZy0+bGVuIC0gTUlTRE5fSEVBREVSX0xFTikpOworCisJLyogY29uc3RydWN0IHRoZSBzb2NrYWRkciAqLworCXNhLmZhbWlseSA9IEFGX0lTRE47CisJc2Euc2FwaSA9IHNpZ25fbGluay0+c2FwaTsKKwlzYS5kZXYgPSBzaWduX2xpbmstPnRlaTsKKwlzYS5jaGFubmVsID0gc2lnbl9saW5rLT5kcml2ZXIubWlzZG4uY2hhbm5lbDsKKworCXJldCA9IHNlbmR0byhiZmQtPmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuLCAwLAorCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZihzYSkpOworCWlmIChyZXQgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzIHNlbmR0byBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCW1zZ2JfZnJlZShtc2cpOworCisJLyogc2V0IHR4IGRlbGF5IHRpbWVyIGZvciBuZXh0IGV2ZW50ICovCisJZTFpX3RzLT5zaWduLnR4X3RpbWVyLmNiID0gdGltZW91dF90czFfd3JpdGU7CisJZTFpX3RzLT5zaWduLnR4X3RpbWVyLmRhdGEgPSBlMWlfdHM7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZlMWlfdHMtPnNpZ24udHhfdGltZXIsIDAsIDUwMDAwKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgQkNIQU5fVFhfR1JBTgkxNjAKKy8qIHdyaXRlIHRvIGEgQiBjaGFubmVsIFRTICovCitzdGF0aWMgaW50IGhhbmRsZV90c1hfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaDsKKwl1X2ludDhfdCB0eF9idWZbQkNIQU5fVFhfR1JBTiArIHNpemVvZigqaGgpXTsKKwlzdHJ1Y3Qgc3ViY2hfbXV4ICpteCA9ICZlMWlfdHMtPnRyYXUubXV4OworCWludCByZXQ7CisKKwloaCA9IChzdHJ1Y3QgbUlTRE5oZWFkICopIHR4X2J1ZjsKKwloaC0+cHJpbSA9IFBIX0RBVEFfUkVROworCisJc3ViY2hhbl9tdXhfb3V0KG14LCB0eF9idWYrc2l6ZW9mKCpoaCksIEJDSEFOX1RYX0dSQU4pOworCisJREVCVUdQKERNSUIsICJCQ0hBTiBUWDogJXNcbiIsCisJCWhleGR1bXAodHhfYnVmK3NpemVvZigqaGgpLCBCQ0hBTl9UWF9HUkFOKSk7CisKKwlyZXQgPSBzZW5kKGJmZC0+ZmQsIHR4X2J1Ziwgc2l6ZW9mKCpoaCkgKyBCQ0hBTl9UWF9HUkFOLCAwKTsKKwlpZiAocmV0IDwgc2l6ZW9mKCpoaCkgKyBCQ0hBTl9UWF9HUkFOKQorCQlERUJVR1AoRE1JQiwgInNlbmQgcmV0dXJucyAlZCBpbnN0ZWFkIG9mICV6dVxuIiwgcmV0LAorCQkJc2l6ZW9mKCpoaCkgKyBCQ0hBTl9UWF9HUkFOKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgVFNYX0FMTE9DX1NJWkUgNDA5NgorLyogRklYTUU6IHJlYWQgZnJvbSBhIEIgY2hhbm5lbCBUUyAqLworc3RhdGljIGludCBoYW5kbGVfdHNYX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhUU1hfQUxMT0NfU0laRSwgIm1JU0ROIFRTeCIpOworCXN0cnVjdCBtSVNETmhlYWQgKmhoOworCWludCByZXQ7CisKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloaCA9IChzdHJ1Y3QgbUlTRE5oZWFkICopIG1zZy0+ZGF0YTsKKworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5kYXRhLCBUU1hfQUxMT0NfU0laRSwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJyZWN2ZnJvbSBlcnJvciAgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJbXNnYl9wdXQobXNnLCByZXQpOworCisJaWYgKGhoLT5wcmltICE9IFBIX0NPTlRST0xfSU5EKQorCQlERUJVR1AoRE1JQiwgIjw9IEJDSEFOIGxlbiA9ICVkLCBwcmltKDB4JXgpIGlkKDB4JXgpOiAlc1xuIiwKKwkJCXJldCwgaGgtPnByaW0sIGhoLT5pZCwgZ2V0X3ByaW1fbmFtZShoaC0+cHJpbSkpOworCisJc3dpdGNoIChoaC0+cHJpbSkgeworCWNhc2UgUEhfREFUQV9JTkQ6CisJCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgTUlTRE5fSEVBREVSX0xFTjsKKwkJREVCVUdQKERNSUIsICJCQ0hBTiBSWDogJXNcbiIsCisJCQloZXhkdW1wKG1zZ2JfbDIobXNnKSwgcmV0IC0gTUlTRE5fSEVBREVSX0xFTikpOworCQlyZXQgPSBlMWlucF9yeF90cyhlMWlfdHMsIG1zZywgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgUEhfQUNUSVZBVEVfSU5EOgorCWNhc2UgUEhfREFUQV9DTkY6CisJCS8qIHBoeXNpY2FsIGxheWVyIGluZGljYXRlcyB0aGF0IGRhdGEgaGFzIGJlZW4gc2VudCwKKwkJICogd2UgdGh1cyBjYW4gc2VuZCBzb21lIG1vcmUgZGF0YSAqLworCQlyZXQgPSBoYW5kbGVfdHNYX3dyaXRlKGJmZCk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCS8qIEZJWE1FOiB3aHkgZG8gd2UgZnJlZSBzaWduYWxsaW5nIG1zZ3MgaW4gdGhlIGNhbGxlciwgYW5kIHRyYXUgbm90PyAqLworCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIHJldDsKK30KKworLyogY2FsbGJhY2sgZnJvbSBzZWxlY3QuYyBpbiBjYXNlIG9uZSBvZiB0aGUgZmQncyBjYW4gYmUgcmVhZC93cml0dGVuICovCitzdGF0aWMgaW50IG1pc2RuX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXVuc2lnbmVkIGludCBpZHggPSB0c19uci0xOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW2lkeF07CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZTFpX3RzLT50eXBlKSB7CisJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCQlyYyA9IGhhbmRsZV90czFfcmVhZChiZmQpOworCQlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJCXJjID0gaGFuZGxlX3RzMV93cml0ZShiZmQpOworCQlicmVhazsKKwljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJCXJjID0gaGFuZGxlX3RzWF9yZWFkKGJmZCk7CisJCS8qIFdlIG5ldmVyIGluY2x1ZGUgdGhlIG1JU0ROIEItQ2hhbm5lbCBGRCBpbnRvIHRoZQorCQkgKiB3cml0ZXNldCwgc2luY2UgaXQgZG9lc24ndCBzdXBwb3J0IHBvbGwoKSBiYXNlZAorCQkgKiB3cml0ZSBmbG93IGNvbnRyb2wgKi8JCQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgInVua25vd24gRTEgVFMgdHlwZSAldVxuIiwgZTFpX3RzLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGFjdGl2YXRlX2JjaGFuKHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBpbnQgdHMsIGludCBhY3QpCit7CisJc3RydWN0IG1JU0ROaGVhZCBoaDsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpZHggPSB0cy0xOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW2lkeF07CisJc3RydWN0IGJzY19mZCAqYmZkID0gJmUxaV90cy0+ZHJpdmVyLm1pc2RuLmZkOworCisJZnByaW50ZihzdGRvdXQsICJhY3RpdmF0ZSBiY2hhblxuIik7CisJaWYgKGFjdCkKKwkJaGgucHJpbSA9IFBIX0FDVElWQVRFX1JFUTsKKwllbHNlCisJCWhoLnByaW0gPSBQSF9ERUFDVElWQVRFX1JFUTsKKworCWhoLmlkID0gTUlTRE5fSURfQU5ZOworCXJldCA9IHNlbmR0byhiZmQtPmZkLCAmaGgsIHNpemVvZihoaCksIDAsIE5VTEwsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3Rkb3V0LCAiY291bGQgbm90IHNlbmQgQUNUSVZBVEVfUlEgJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBlMWlucF9kcml2ZXIgbWlzZG5fZHJpdmVyID0geworCS5uYW1lID0gIm1JU0ROdXNlciIsCisJLndhbnRfd3JpdGUgPSB0c193YW50X3dyaXRlLAorfTsKKworc3RhdGljIGludCBtaV9lMV9zZXR1cChzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgaW50IHJlbGVhc2VfbDIpCit7CisJaW50IHRzLCByZXQ7CisKKwkvKiBUUzAgaXMgQ1JDNCwgZG9uJ3QgbmVlZCBhbnkgZmQgZm9yIGl0ICovCisJZm9yICh0cyA9IDE7IHRzIDwgTlVNX0UxX1RTOyB0cysrKSB7CisJCXVuc2lnbmVkIGludCBpZHggPSB0cy0xOworCQlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1tpZHhdOworCQlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSAmZTFpX3RzLT5kcml2ZXIubWlzZG4uZmQ7CisJCXN0cnVjdCBzb2NrYWRkcl9tSVNETiBhZGRyOworCisJCWJmZC0+ZGF0YSA9IGxpbmU7CisJCWJmZC0+cHJpdl9uciA9IHRzOworCQliZmQtPmNiID0gbWlzZG5fZmRfY2I7CisKKwkJc3dpdGNoIChlMWlfdHMtPnR5cGUpIHsKKwkJY2FzZSBFMUlOUF9UU19UWVBFX05PTkU6CisJCQljb250aW51ZTsKKwkJCWJyZWFrOworCQljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJCWJmZC0+ZmQgPSBzb2NrZXQoUEZfSVNETiwgU09DS19ER1JBTSwgSVNETl9QX0xBUERfTlQpOworCQkJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCQliZmQtPmZkID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfREdSQU0sIElTRE5fUF9CX1JBVyk7CisJCQkvKiBXZSBuZXZlciBpbmNsdWRlIHRoZSBtSVNETiBCLUNoYW5uZWwgRkQgaW50byB0aGUKKwkgCQkqIHdyaXRlc2V0LCBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgcG9sbCgpIGJhc2VkCisJIAkJKiB3cml0ZSBmbG93IGNvbnRyb2wgKi8JCQorCQkJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChiZmQtPmZkIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICIlcyBjb3VsZCBub3Qgb3BlbiBzb2NrZXQgJXNcbiIsCisJCQkJX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gYmZkLT5mZDsKKwkJfQorCisJCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwkJYWRkci5mYW1pbHkgPSBBRl9JU0ROOworCQlhZGRyLmRldiA9IGxpbmUtPm51bTsKKwkJc3dpdGNoIChlMWlfdHMtPnR5cGUpIHsKKwkJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCQlhZGRyLmNoYW5uZWwgPSAwOworCQkJLyogU0FQSSBub3Qgc3VwcG9ydGVkIHlldCBpbiBrZXJuZWwgKi8KKwkJCS8vYWRkci5zYXBpID0gZTFpbnBfdHMtPnNpZ24uc2FwaTsKKwkJCWFkZHIuc2FwaSA9IDA7CisJCQlhZGRyLnRlaSA9IEdST1VQX1RFSTsKKwkJCWJyZWFrOworCQljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJCWFkZHIuY2hhbm5lbCA9IHRzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlERUJVR1AoRE1JLCAidW5zdXBwb3J0ZWQgRTEgVFMgdHlwZTogJXVcbiIsCisJCQkJZTFpX3RzLT50eXBlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCQlpZiAocmV0IDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgYmluZCBsMiBzb2NrZXQgJXNcbiIsCisJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJaWYgKGUxaV90cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX1NJR04pIHsKKwkJCXJldCA9IGlvY3RsKGJmZC0+ZmQsIElNQ0xFQVJfTDIsICZyZWxlYXNlX2wyKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3Qgc2VuZCBJT0NUTCBJTUNMRUFOX0wyICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisKKwkJLyogRklYTUU6IG9ubHkgYWN0aXZhdGUgQi1DaGFubmVscyBvbmNlIHdlIHN0YXJ0IHRvCisJCSAqIHVzZSB0aGVtIHRvIGNvbnNlcnZlIENQVSBwb3dlciAqLworCQlpZiAoZTFpX3RzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfVFJBVSkKKwkJCWFjdGl2YXRlX2JjaGFuKGxpbmUsIHRzLCAxKTsKKworCQlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEOiAlc1xuIiwKKwkJCQlzdHJlcnJvcihyZXQpKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1pX2UxX2xpbmVfdXBkYXRlKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKQoreworCXN0cnVjdCBtSVNETl9kZXZpbmZvIGRldmluZm87CisJaW50IHNrLCByZXQsIGNudDsKKworCWlmICghbGluZS0+ZHJpdmVyKSB7CisJCS8qIHRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgdXBkYXRlICovCisJCWxpbmUtPmRyaXZlciA9ICZtaXNkbl9kcml2ZXI7CisJfSBlbHNlIHsKKwkJLyogdGhpcyBpcyBhIHN1YnNlcXVlbnQgdXBkYXRlICovCisJCS8qIEZJWE1FOiBmaXJzdCBjbG9zZSBhbGwgc29ja2V0cyAqLworCQlmcHJpbnRmKHN0ZGVyciwgImluY3JlbWVudGFsIGxpbmUgdXBkYXRlcyBub3Qgc3VwcG9ydGVkIHlldFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChsaW5lLT5kcml2ZXIgIT0gJm1pc2RuX2RyaXZlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBvcGVuIHRoZSBJU0ROIGNhcmQgZGV2aWNlICovCisJc2sgPSBzb2NrZXQoUEZfSVNETiwgU09DS19SQVcsIElTRE5fUF9CQVNFKTsKKwlpZiAoc2sgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgY291bGQgbm90IG9wZW4gc29ja2V0ICVzXG4iLAorCQkJX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBzazsKKwl9CisKKwlyZXQgPSBpb2N0bChzaywgSU1HRVRDT1VOVCwgJmNudCk7CisJaWYgKHJldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGVycm9yIGdldHRpbmcgaW50ZXJmIGNvdW50OiAlc1xuIiwKKwkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShzayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvL0RFQlVHUChETUksIiVkIGRldmljZSVzIGZvdW5kXG4iLCBjbnQsIChjbnQ9PTEpPyIiOiJzIik7CisJcHJpbnRmKCIlZCBkZXZpY2UlcyBmb3VuZFxuIiwgY250LCAoY250PT0xKT8iIjoicyIpOworI2lmIDEKKwlkZXZpbmZvLmlkID0gbGluZS0+bnVtOworCXJldCA9IGlvY3RsKHNrLCBJTUdFVERFVklORk8sICZkZXZpbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZG91dCwgImVycm9yIGdldHRpbmcgaW5mbyBmb3IgZGV2aWNlICVkOiAlc1xuIiwKKwkJCWxpbmUtPm51bSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBpZDogICAgICAgICAgICAgJWRcbiIsIGRldmluZm8uaWQpOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBEcHJvdG9jb2xzOiAgICAgJTA4eFxuIiwgZGV2aW5mby5EcHJvdG9jb2xzKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgQnByb3RvY29sczogICAgICUwOHhcbiIsIGRldmluZm8uQnByb3RvY29scyk7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIHByb3RvY29sOiAgICAgICAlZFxuIiwgZGV2aW5mby5wcm90b2NvbCk7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIG5yYmNoYW46ICAgICAgICAlZFxuIiwgZGV2aW5mby5ucmJjaGFuKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgbmFtZTogICAgICAgICAgICVzXG4iLCBkZXZpbmZvLm5hbWUpOworI2VuZGlmCisKKwlpZiAoIShkZXZpbmZvLkRwcm90b2NvbHMgJiAoMSA8PCBJU0ROX1BfTlRfRTEpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBjYXJkIGlzIG5vdCBvZiB0eXBlIEUxIChOVC1tb2RlKVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IG1pX2UxX3NldHVwKGxpbmUsIDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF9zbXModm9pZCkKK3sKKwkvKiByZWdpc3RlciB0aGUgZHJpdmVyIHdpdGggdGhlIGNvcmUgKi8KKwllMWlucF9kcml2ZXJfcmVnaXN0ZXIoJm1pc2RuX2RyaXZlcik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1jb25maWcuYyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MGUzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1jb25maWcuYwpAQCAtMCwwICsxLDczNSBAQAorLyogaXAuYWNjZXNzIG5hbm9CVFMgY29uZmlndXJhdGlvbiB0b29sICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICogKEMpIDIwMDkgYnkgT24gV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvaXBhY2Nlc3MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQ7CisKK3N0YXRpYyBpbnQgbmV0X2xpc3Rlbl90ZXN0bnI7CitzdGF0aWMgaW50IHJlc3RhcnQ7CitzdGF0aWMgY2hhciAqcHJpbV9vbWxfaXA7CitzdGF0aWMgY2hhciAqdW5pdF9pZDsKK3N0YXRpYyB1X2ludDE2X3QgbnZfZmxhZ3M7CitzdGF0aWMgdV9pbnQxNl90IG52X21hc2s7CitzdGF0aWMgY2hhciAqc29mdHdhcmUgPSBOVUxMOworc3RhdGljIGludCBzd19sb2FkX3N0YXRlID0gMDsKK3N0YXRpYyBpbnQgb21sX3N0YXRlID0gMDsKK3N0YXRpYyBpbnQgZHVtcF9maWxlcyA9IDA7CitzdGF0aWMgY2hhciAqZmlybXdhcmVfYW5hbHlzaXMgPSBOVUxMOworCitzdHJ1Y3Qgc3dfbG9hZCB7CisJdV9pbnQ4X3QgZmlsZV9pZFsyNTVdOworCXVfaW50OF90IGZpbGVfaWRfbGVuOworCisJdV9pbnQ4X3QgZmlsZV92ZXJzaW9uWzI1NV07CisJdV9pbnQ4X3QgZmlsZV92ZXJzaW9uX2xlbjsKK307CisKK3N0YXRpYyB2b2lkICp0YWxsX2N0eF9jb25maWcgPSBOVUxMOworc3RhdGljIHN0cnVjdCBzd19sb2FkICpzd19sb2FkMSA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHN3X2xvYWQgKnN3X2xvYWQyID0gTlVMTDsKKworLyoKK3N0YXRpYyB1X2ludDhfdCBwcmltX29tbF9hdHRyW10gPSB7IDB4OTUsIDB4MDAsIDcsIDB4ODgsIDE5MiwgMTY4LCAxMDAsIDExLCAweDAwLCAweDAwIH07CitzdGF0aWMgdV9pbnQ4X3QgdW5pdF9pZF9hdHRyW10gPSB7IDB4OTEsIDB4MDAsIDksICcyJywgJzMnLCAnNCcsICcyJywgJy8nICwgJzAnLCAnLycsICcwJywgMHgwMCB9OworKi8KKworLyoKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBOQUNLIG9uIHRoZSBPTUwgTk0KKyAqCisgKiBDdXJyZW50bHkgd2Ugc2VuZCB0aGUgY29uZmlnIHJlcXVlc3RzIGJ1dCBkb24ndCBjaGVjayB0aGUKKyAqIHJlc3VsdC4gVGhlIG5hbm9CVFMgd2lsbCBzZW5kIHVzIGEgTkFDSyB3aGVuIHdlIGRpZCBzb21ldGhpbmcgdGhlCisgKiBCVFMgZGlkbid0IGxpa2UuCisgKi8KK3N0YXRpYyBpbnQgaXBhY2NfbXNnX25hY2sodV9pbnQ4X3QgbXQpCit7CisJZnByaW50ZihzdGRlcnIsICJGYWlsdXJlIHRvIHNldCBhdHRyaWJ1dGUuIFRoaXMgc2VlbXMgZmF0YWxcbiIpOworCWV4aXQoLTEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwYWNjX21zZ19hY2sodV9pbnQ4X3QgbXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaWYgKHN3X2xvYWRfc3RhdGUgPT0gMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSBuZXcgc29mdHdhcmUgaXMgYWN0aXZhZWQuXG4iKTsKKworCQlpZiAocmVzdGFydCkgeworCQkJYWJpc19ubV9pcGFjY2Vzc19yZXN0YXJ0KGJ0cyk7CisJCX0gZWxzZSB7CisJCQlleGl0KDApOworCQl9CisJfSBlbHNlIGlmIChvbWxfc3RhdGUgPT0gMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlNldCB0aGUgcHJpbWFyeSBPTUwgSVAuXG4iKTsKKwkJaWYgKHJlc3RhcnQpIHsKKwkJCWFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChidHMpOworCQl9IGVsc2UgeworCQkJZXhpdCgwKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgaXBhY2NfZmVycl9lbGVtIHsKKwlpbnQxNl90IGZyZXFfZXJyOworCXVfaW50OF90IGZyZXFfcXVhbDsKKwl1X2ludDhfdCBhcmZjbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpcGFjY19jdXNhZ2VfZWxlbSB7CisJdV9pbnQxNl90IGFyZmNuOjEwLAorCQkgIHJ4bGV2OjY7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIGludCB0ZXN0X3JlcCh2b2lkICpfbXNnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBfbXNnOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDE2X3QgdGVzdF9yZXBfbGVuLCBmZXJyX2xpc3RfbGVuOworCXN0cnVjdCBpcGFjY19mZXJyX2VsZW0gKmlmZTsKKwlzdHJ1Y3QgaXBhY19iY2NoX2luZm8gYmluZm87CisJaW50IGksIHJjOworCisJREVCVUdQKEROTSwgIlRFU1QgUkVQT1JUOiAiKTsKKworCWlmIChmb2gtPmRhdGFbMF0gIT0gTk1fQVRUX1RFU1RfTk8gfHwKKwkgICAgZm9oLT5kYXRhWzJdICE9IE5NX0FUVF9URVNUX1JFUE9SVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlERUJVR1BDKEROTSwgInRlc3Rfbm89MHglMDJ4ICIsIGZvaC0+ZGF0YVsxXSk7CisJLyogZGF0YVsyXSA9PSBOTV9BVFRfVEVTVF9SRVBPUlQgKi8KKwkvKiBkYXRhWzMuLjRdOiB0ZXN0X3JlcF9sZW4gKi8KKwl0ZXN0X3JlcF9sZW4gPSBudG9ocygqKHVfaW50MTZfdCAqKSAmZm9oLT5kYXRhWzNdKTsKKwkvKiBkYXRhWzVdOiBpcC5hY2Nlc3MgdGVzdCByZXN1bHQgKi8KKwlERUJVR1BDKEROTSwgInRlc3RfcmVzPSVzXG4iLCBpcGFjY190ZXN0cmVzX25hbWUoZm9oLT5kYXRhWzVdKSk7CisKKwkvKiBkYXRhWzZdOiBpcC5hY2Nlc3MgbmVzdGVkIElFLiAzID09IGZyZXFfZXJyX2xpc3QgKi8KKwlzd2l0Y2ggKGZvaC0+ZGF0YVs2XSkgeworCWNhc2UgTk1fSVBBQ19FSUVfRlJFUV9FUlJfTElTVDoKKwkJLyogZGF0YVs3Li44XTogbGVuZ3RoIG9mIGZlcnJfbGlzdCAqLworCQlmZXJyX2xpc3RfbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKikgJmZvaC0+ZGF0YVs3XSk7CisKKwkJLyogZGF0YVs5Li4uXTogZnJlcXVlbmN5IGVycm9yIGxpc3QgZWxlbWVudHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGZlcnJfbGlzdF9sZW47IGkrPSBzaXplb2YoKmlmZSkpIHsKKwkJCWlmZSA9IChzdHJ1Y3QgaXBhY2NfZmVycl9lbGVtICopIChmb2gtPmRhdGEgKyA5ICsgaSk7CisJCQlERUJVR1AoRE5NLCAiPT0+IEFSRkNOICU0dSwgRnJlcXVlbmN5IEVycm9yICU2aGRcbiIsCisJCQlpZmUtPmFyZmNuLCBudG9ocyhpZmUtPmZyZXFfZXJyKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9JUEFDX0VJRV9DSEFOX1VTRV9MSVNUOgorCQkvKiBkYXRhWzcuLjhdOiBsZW5ndGggb2YgZmVycl9saXN0ICovCisJCWZlcnJfbGlzdF9sZW4gPSBudG9ocygqKHVfaW50MTZfdCAqKSAmZm9oLT5kYXRhWzddKTsKKworCQkvKiBkYXRhWzkuLi5dOiBjaGFubmVsIHVzYWdlIGxpc3QgZWxlbWVudHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGZlcnJfbGlzdF9sZW47IGkrPSAyKSB7CisJCQl1X2ludDE2X3QgKmN1X3B0ciA9ICh1X2ludDE2X3QgKikoZm9oLT5kYXRhICsgOSArIGkpOworCQkJdV9pbnQxNl90IGN1ID0gbnRvaHMoKmN1X3B0cik7CisJCQlERUJVR1AoRE5NLCAiPT0+IEFSRkNOICU0dSwgUnhMZXYgJTJ1XG4iLAorCQkJCWN1ICYgMHgzZmYsIGN1ID4+IDEwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX0lQQUNfRUlFX0JDQ0hfSU5GT19UWVBFOgorCQlicmVhazsKKwljYXNlIE5NX0lQQUNfRUlFX0JDQ0hfSU5GTzoKKwkJcmMgPSBpcGFjX3BhcnNlX2JjY2hfaW5mbygmYmluZm8sIGZvaC0+ZGF0YSs2KTsKKwkJaWYgKHJjIDwgMCkgeworCQkJREVCVUdQKEROTSwgIkJDQ0ggSW5mbyBwYXJzaW5nIGZhaWxlZFxuIik7CisJCQlicmVhazsKKwkJfQorCQlERUJVR1AoRE5NLCAiPT0+IEFSRkNOICV1LCBSeExldiAlMnUsIFJ4UXVhbCAlMnU6ICUzZC0lZCwgTEFDICVkIENJICVkXG4iLAorCQkJYmluZm8uYXJmY24sIGJpbmZvLnJ4X2xldiwgYmluZm8ucnhfcXVhbCwKKwkJCWJpbmZvLmNnaS5tY2MsIGJpbmZvLmNnaS5tbmMsCisJCQliaW5mby5jZ2kubGFjLCBiaW5mby5jZ2kuY2kpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBubV9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICAgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBpcGFjY19hY2tfc2lnbmFsX2RhdGEgKmlwYWNjX2RhdGE7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19OTV9JUEFDQ19OQUNLOgorCQlpcGFjY19kYXRhID0gc2lnbmFsX2RhdGE7CisJCXJldHVybiBpcGFjY19tc2dfbmFjayhpcGFjY19kYXRhLT5tc2dfdHlwZSk7CisJY2FzZSBTX05NX0lQQUNDX0FDSzoKKwkJaXBhY2NfZGF0YSA9IHNpZ25hbF9kYXRhOworCQlyZXR1cm4gaXBhY2NfbXNnX2FjayhpcGFjY19kYXRhLT5tc2dfdHlwZSwgaXBhY2NfZGF0YS0+YnRzKTsKKwljYXNlIFNfTk1fVEVTVF9SRVA6CisJCXJldHVybiB0ZXN0X3JlcChzaWduYWxfZGF0YSk7CisJY2FzZSBTX05NX0lQQUNDX1JFU1RBUlRfQUNLOgorCQlwcmludGYoIlRoZSBCVFMgaGFzIGFja2VkIHRoZSByZXN0YXJ0LiBFeGl0aW5nLlxuIik7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgU19OTV9JUEFDQ19SRVNUQVJUX05BQ0s6CisJCXByaW50ZigiVGhlIEJUUyBoYXMgbmFja2VkIHRoZSByZXN0YXJ0LiBFeGl0aW5nLlxuIik7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBjYWxsYmFjayBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIEFCSVMgT01MIGNvZGUgKi8KK3N0YXRpYyBpbnQgcGVyY2VudDsKK3N0YXRpYyBpbnQgcGVyY2VudF9vbGQ7CitzdGF0aWMgaW50IHN3bG9hZF9jYmZuKHVuc2lnbmVkIGludCBob29rLCB1bnNpZ25lZCBpbnQgZXZlbnQsIHN0cnVjdCBtc2diICpfbXNnLAorCQkgICAgICAgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJaWYgKGhvb2sgIT0gR1NNX0hPT0tfTk1fU1dMT0FEKQorCQlyZXR1cm4gMDsKKworCWJ0cyA9IChzdHJ1Y3QgZ3NtX2J0cyAqKSBkYXRhOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTk1fTVRfTE9BRF9JTklUX0FDSzoKKwkJZnByaW50ZihzdGRvdXQsICJTb2Z0d2FyZSBMb2FkIEluaXRpYXRlIEFDS1xuIik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9JTklUX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IFNvZnR3YXJlIExvYWQgSW5pdGlhdGUgTkFDS1xuIik7CisJCWV4aXQoNSk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9FTkRfQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkxPQUQgRU5EIEFDSy4uLiIpOworCQkvKiBub3cgbWFrZSBpdCB0aGUgZGVmYXVsdCAqLworCQlzd19sb2FkX3N0YXRlID0gMTsKKworCQltc2cgPSBtc2diX2FsbG9jKDEwMjQsICJzdzogbnZhdHRyIik7CisJCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCAzKTsKKwkJbXNnLT5sM2ggPSAmbXNnLT5sMmhbM107CisKKwkJLyogYWN0aXZhdGUgc29mdHdhcmUgKi8KKwkJaWYgKHN3X2xvYWQxKSB7CisJCQltc2diX3ZfcHV0KG1zZywgTk1fQVRUX1NXX0RFU0NSKTsKKwkJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfSUQsIHN3X2xvYWQxLT5maWxlX2lkX2xlbiwgc3dfbG9hZDEtPmZpbGVfaWQpOworCQkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9WRVJTSU9OLCBzd19sb2FkMS0+ZmlsZV92ZXJzaW9uX2xlbiwKKwkJCQkJc3dfbG9hZDEtPmZpbGVfdmVyc2lvbik7CisJCX0KKworCQlpZiAoc3dfbG9hZDIpIHsKKwkJCW1zZ2Jfdl9wdXQobXNnLCBOTV9BVFRfU1dfREVTQ1IpOworCQkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3dfbG9hZDItPmZpbGVfaWRfbGVuLCBzd19sb2FkMi0+ZmlsZV9pZCk7CisJCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3X2xvYWQyLT5maWxlX3ZlcnNpb25fbGVuLAorCQkJCQlzd19sb2FkMi0+ZmlsZV92ZXJzaW9uKTsKKwkJfQorCisJCS8qIGZpbGwgaW4gdGhlIGRhdGEgKi8KKwkJbXNnLT5sMmhbMF0gPSBOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGRzsKKwkJbXNnLT5sMmhbMV0gPSBtc2diX2wzbGVuKG1zZykgPj4gODsKKwkJbXNnLT5sMmhbMl0gPSBtc2diX2wzbGVuKG1zZykgJiAweGZmOworCQlwcmludGYoIkZvbyBsMmg6ICVwIGwzaDogJXAuLi4gbGVuZ3RoIGwyOiAldSAgbDM6ICV1XG4iLCBtc2ctPmwyaCwgbXNnLT5sM2gsIG1zZ2JfbDJsZW4obXNnKSwgbXNnYl9sM2xlbihtc2cpKTsKKwkJYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKGJ0cy0+YzAsIG1zZy0+bDJoLCBtc2diX2wybGVuKG1zZykpOworCQltc2diX2ZyZWUobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0VORF9OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBTb2Z0d2FyZSBMb2FkIEVuZCBOQUNLXG4iKTsKKwkJZXhpdCgzKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBBY3RpdmF0ZSBTb2Z0d2FyZSBOQUNLXG4iKTsKKwkJZXhpdCg0KTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9TRUdfQUNLOgorCQlwZXJjZW50ID0gYWJpc19ubV9zb2Z0d2FyZV9sb2FkX3N0YXR1cyhidHMpOworCQlpZiAocGVyY2VudCA+IHBlcmNlbnRfb2xkKQorCQkJcHJpbnRmKCJTb2Z0d2FyZSBEb3dubG9hZCBQcm9ncmVzczogJWQlJVxuIiwgcGVyY2VudCk7CisJCXBlcmNlbnRfb2xkID0gcGVyY2VudDsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0FCT1JUOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMb2FkIGFib3J0ZWQgYnkgdGhlIEJUUy5cbiIpOworCQlleGl0KDYpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCBsZW47CisJc3RhdGljIHVfaW50OF90IGJ1ZlsxMDI0XTsKKwl1X2ludDhfdCAqY3VyID0gYnVmOworCisJcHJpbnRmKCJPTUwgbGluayBlc3RhYmxpc2hlZFxuIik7CisKKwlpZiAodW5pdF9pZCkgeworCQlsZW4gPSBzdHJsZW4odW5pdF9pZCk7CisJCWlmIChsZW4gPiBzaXplb2YoYnVmKS0xMCkKKwkJCXJldHVybjsKKwkJYnVmWzBdID0gTk1fQVRUX0lQQUNDX1VOSVRfSUQ7CisJCWJ1ZlsxXSA9IChsZW4rMSkgPj4gODsKKwkJYnVmWzJdID0gKGxlbisxKSAmIDB4ZmY7CisJCW1lbWNweShidWYrMywgdW5pdF9pZCwgbGVuKTsKKwkJYnVmWzMrbGVuXSA9IDA7CisJCXByaW50Zigic2V0dGluZyBVbml0IElEIHRvICclcydcbiIsIHVuaXRfaWQpOworCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoYnRzLT5jMCwgYnVmLCAzK2xlbisxKTsKKwl9CisJaWYgKHByaW1fb21sX2lwKSB7CisJCXN0cnVjdCBpbl9hZGRyIGlhOworCisJCWlmICghaW5ldF9hdG9uKHByaW1fb21sX2lwLCAmaWEpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgSVAgYWRkcmVzczogJXNcbiIsCisJCQkJcHJpbV9vbWxfaXApOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogMHg4OCArIElQICsgcG9ydCAqLworCQlsZW4gPSAxICsgc2l6ZW9mKGlhKSArIDI7CisKKwkJKmN1cisrID0gTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNUOworCQkqY3VyKysgPSAobGVuKSA+PiA4OworCQkqY3VyKysgPSAobGVuKSAmIDB4ZmY7CisJCSpjdXIrKyA9IDB4ODg7CisJCW1lbWNweShjdXIsICZpYSwgc2l6ZW9mKGlhKSk7CisJCWN1ciArPSBzaXplb2YoaWEpOworCQkqY3VyKysgPSAwOworCQkqY3VyKysgPSAwOworCQlwcmludGYoInNldHRpbmcgcHJpbWFyeSBPTUwgbGluayBJUCB0byAnJXMnXG4iLCBpbmV0X250b2EoaWEpKTsKKwkJb21sX3N0YXRlID0gMTsKKwkJYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKGJ0cy0+YzAsIGJ1ZiwgMytsZW4pOworCX0KKwlpZiAobnZfbWFzaykgeworCQlsZW4gPSA0OworCisJCSpjdXIrKyA9IE5NX0FUVF9JUEFDQ19OVl9GTEFHUzsKKwkJKmN1cisrID0gKGxlbikgPj4gODsKKwkJKmN1cisrID0gKGxlbikgJiAweGZmOworCQkqY3VyKysgPSBudl9mbGFncyAmIDB4ZmY7CisJCSpjdXIrKyA9IG52X21hc2sgJiAweGZmOworCQkqY3VyKysgPSBudl9mbGFncyA+PiA4OworCQkqY3VyKysgPSBudl9tYXNrID4+IDg7CisJCXByaW50Zigic2V0dGluZyBOViBGbGFncy9NYXNrIHRvIDB4JTA0eC8weCUwNHhcbiIsCisJCQludl9mbGFncywgbnZfbWFzayk7CisJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cihidHMtPmMwLCBidWYsIDMrbGVuKTsKKwl9CisKKwlpZiAocmVzdGFydCAmJiAhcHJpbV9vbWxfaXAgJiYgIXNvZnR3YXJlKSB7CisJCXByaW50ZigicmVzdGFydGluZyBCVFNcbiIpOworCQlhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoYnRzKTsKKwl9CisKK30KKwordm9pZCBpbnB1dF9ldmVudChpbnQgZXZlbnQsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsIHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEVWVF9FMV9URUlfVVA6CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIEUxSU5QX1NJR05fT01MOgorCQkJYm9vdHN0cmFwX29tKHRyeC0+YnRzKTsKKwkJCWJyZWFrOworCQljYXNlIEUxSU5QX1NJR05fUlNMOgorCQkJLyogRklYTUUgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFVlRfRTFfVEVJX0ROOgorCQlmcHJpbnRmKHN0ZGVyciwgIkxvc3Qgc29tZSBFMSBURUkgbGlua1xuIik7CisJCS8qIEZJWE1FOiBkZWFsIHdpdGggVEVJIG9yIEwxIGxpbmsgbG9zcyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK2ludCBubV9zdGF0ZV9ldmVudChlbnVtIG5tX2V2dCBldnQsIHVfaW50OF90IG9ial9jbGFzcywgdm9pZCAqb2JqLAorCQkgICBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpvbGRfc3RhdGUsIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5ld19zdGF0ZSkKK3sKKwlpZiAoZXZ0ID09IEVWVF9TVEFURUNIR19PUEVSICYmCisJICAgIG9ial9jbGFzcyA9PSBOTV9PQ19SQURJT19DQVJSSUVSICYmCisJICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IDMpIHsKKwkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBvYmo7CisKKwkJaWYgKG5ldF9saXN0ZW5fdGVzdG5yKSB7CisJCQl1X2ludDhfdCBwaHlzX2NvbmZpZ1tdID0geyAweDAyLCAweDBhLCAweDAwLCAweDAxLCAweDAyIH07CisJCQlhYmlzX25tX3BlcmZvcm1fdGVzdCh0cngtPmJ0cywgMiwgMCwgMCwgMHhmZiwKKwkJCQkJICAgICBuZXRfbGlzdGVuX3Rlc3RuciwgMSwKKwkJCQkJICAgICBwaHlzX2NvbmZpZywgc2l6ZW9mKHBoeXNfY29uZmlnKSk7CisJCX0gZWxzZSBpZiAoc29mdHdhcmUpIHsKKwkJCWludCByYzsKKwkJCXByaW50ZigiQXR0ZW1wdGluZyBzb2Z0d2FyZSB1cGxvYWQgd2l0aCAnJXMnXG4iLCBzb2Z0d2FyZSk7CisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZCh0cngtPmJ0cywgc29mdHdhcmUsIDE5LCAwLCBzd2xvYWRfY2JmbiwgdHJ4LT5idHMpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHN0YXJ0IHNvZnR3YXJlIGxvYWRcbiIpOworCQkJCWV4aXQoLTMpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN3X2xvYWQgKmNyZWF0ZV9zd2xvYWQoc3RydWN0IHNkcF9oZWFkZXIgKmhlYWRlcikKK3sKKwlzdHJ1Y3Qgc3dfbG9hZCAqbG9hZDsKKworCWxvYWQgPSB0YWxsb2NfemVybyh0YWxsX2N0eF9jb25maWcsIHN0cnVjdCBzd19sb2FkKTsKKworCXN0cm5jcHkoKGNoYXIgKilsb2FkLT5maWxlX2lkLCBoZWFkZXItPmZpcm13YXJlX2luZm8uc3dfcGFydCwgMjApOworCWxvYWQtPmZpbGVfaWRfbGVuID0gc3RybGVuKGhlYWRlci0+ZmlybXdhcmVfaW5mby5zd19wYXJ0KSArIDE7CisKKwlzdHJuY3B5KChjaGFyICopbG9hZC0+ZmlsZV92ZXJzaW9uLCBoZWFkZXItPmZpcm13YXJlX2luZm8udmVyc2lvbiwgMjApOworCWxvYWQtPmZpbGVfdmVyc2lvbl9sZW4gPSBzdHJsZW4oaGVhZGVyLT5maXJtd2FyZV9pbmZvLnZlcnNpb24pICsgMTsKKworCXJldHVybiBsb2FkOworfQorCitzdGF0aWMgaW50IGZpbmRfc3dfbG9hZF9wYXJhbXMoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHN0YXQgc3RhdDsKKwlzdHJ1Y3Qgc2RwX2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBsbGlzdF9oZWFkICplbnRyeTsKKwlpbnQgZmQ7CisJdm9pZCAqdGFsbF9maXJtX2N0eCA9IDA7CisKKwllbnRyeSA9IHRhbGxvY196ZXJvKHRhbGxfZmlybV9jdHgsIHN0cnVjdCBsbGlzdF9oZWFkKTsKKwlJTklUX0xMSVNUX0hFQUQoZW50cnkpOworCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKCFmZCkgeworCQlwZXJyb3IoIm5hZGEiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHZlcmlmeSB0aGUgZmlsZSAqLworCWlmIChmc3RhdChmZCwgJnN0YXQpID09IC0xKSB7CisJCXBlcnJvcigiQ2FuIG5vdCBzdGF0IHRoZSBmaWxlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpcGFjY2Vzc19hbmFseXplX2ZpbGUoZmQsIHN0YXQuc3Rfc2l6ZSwgMCwgZW50cnkpOworCWlmIChjbG9zZShmZCkgIT0gMCkgeworCQlwZXJyb3IoIkNsb3NlIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogdHJ5IHRvIGZpbmQgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShoZWFkZXIsIGVudHJ5LCBlbnRyeSkgeworCQlpZiAobnRvaHMoaGVhZGVyLT5maXJtd2FyZV9pbmZvLm1vcmVfbW9yZV9tYWdpYykgPT0gMHgxMDAwKSB7CisJCQlzd19sb2FkMSA9IGNyZWF0ZV9zd2xvYWQoaGVhZGVyKTsKKwkJfSBlbHNlIGlmIChudG9ocyhoZWFkZXItPmZpcm13YXJlX2luZm8ubW9yZV9tb3JlX21hZ2ljKSA9PSAweDIwMDEpIHsKKwkJCXN3X2xvYWQyID0gY3JlYXRlX3N3bG9hZChoZWFkZXIpOworCQl9CisJfQorCisJaWYgKCFzd19sb2FkMSB8fCAhc3dfbG9hZDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJEaWQgbm90IGZpbmQgZGF0YS5cbiIpOworCQl0YWxsb2NfZnJlZSh0YWxsX2Zpcm1fY3R4KTsKKwkJcmV0dXJuIC0xOworICAgICAgICB9CisKKwl0YWxsb2NfZnJlZSh0YWxsX2Zpcm1fY3R4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHVtcF9lbnRyeShzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtICpzdWJfZW50cnksIGludCBwYXJ0LCBpbnQgZmQpCit7CisJaW50IG91dF9mZDsKKwlpbnQgY29waWVkOworCWNoYXIgZmlsZW5hbWVbNDA5Nl07CisJb2ZmX3QgdGFyZ2V0OworCisJaWYgKCFkdW1wX2ZpbGVzKQorCQlyZXR1cm47CisKKwlpZiAoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuc29tZXRoaW5nMSA9PSAwKQorCQlyZXR1cm47CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgInBhcnQuJWQiLCBwYXJ0KyspOworCW91dF9mZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCwgMDY2MCk7CisJaWYgKG91dF9mZCA8IDApIHsKKwkJcGVycm9yKCJDYW4gbm90IGR1bXAgZmlybXdhcmUiKTsKKwkJcmV0dXJuOworCX0KKworCXRhcmdldCA9IHN1Yl9lbnRyeS0+YWJzb2x1dGVfb2Zmc2V0ICsgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuc3RhcnQpICsgNDsKKwlpZiAobHNlZWsoZmQsIHRhcmdldCwgU0VFS19TRVQpICE9IHRhcmdldCkgeworCQlwZXJyb3IoInNlZWsgZmFpbGVkIik7CisJCWNsb3NlKG91dF9mZCk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGNvcGllZCA9IDA7IGNvcGllZCA8IG50b2hsKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5Lmxlbmd0aCk7ICsrY29waWVkKSB7CisJCWNoYXIgYzsKKwkJaWYgKHJlYWQoZmQsICZjLCBzaXplb2YoYykpICE9IHNpemVvZihjKSkgeworCQkJcGVycm9yKCJjb3B5IGZhaWxlZCIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAod3JpdGUob3V0X2ZkLCAmYywgc2l6ZW9mKGMpKSAhPSBzaXplb2YoYykpIHsKKwkJCXBlcnJvcigid3JpdGUgZmFpbGVkIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWNsb3NlKG91dF9mZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuYWx5emVfZmlybXdhcmUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHN0YXQgc3RhdDsKKwlzdHJ1Y3Qgc2RwX2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBzZHBfaGVhZGVyX2l0ZW0gKnN1Yl9lbnRyeTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqZW50cnk7CisJaW50IGZkOworCXZvaWQgKnRhbGxfZmlybV9jdHggPSAwOworCWludCBwYXJ0ID0gMDsKKworCWVudHJ5ID0gdGFsbG9jX3plcm8odGFsbF9maXJtX2N0eCwgc3RydWN0IGxsaXN0X2hlYWQpOworCUlOSVRfTExJU1RfSEVBRChlbnRyeSk7CisKKwlwcmludGYoIk9wZW5pbmcgcG9zc2libGUgZmlybXdhcmUgJyVzJ1xuIiwgZmlsZW5hbWUpOworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmICghZmQpIHsKKwkJcGVycm9yKCJuYWRhIik7CisJCXJldHVybjsKKwl9CisKKwkvKiB2ZXJpZnkgdGhlIGZpbGUgKi8KKwlpZiAoZnN0YXQoZmQsICZzdGF0KSA9PSAtMSkgeworCQlwZXJyb3IoIkNhbiBub3Qgc3RhdCB0aGUgZmlsZSIpOworCQlyZXR1cm47CisJfQorCisJaXBhY2Nlc3NfYW5hbHl6ZV9maWxlKGZkLCBzdGF0LnN0X3NpemUsIDAsIGVudHJ5KTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGhlYWRlciwgZW50cnksIGVudHJ5KSB7CisJCXByaW50ZigiUHJpbnRpbmcgaGVhZGVyIGluZm9ybWF0aW9uOlxuIik7CisJCXByaW50ZigibW9yZV9tb3JlX21hZ2ljOiAweCV4XG4iLCBudG9ocyhoZWFkZXItPmZpcm13YXJlX2luZm8ubW9yZV9tb3JlX21hZ2ljKSk7CisJCXByaW50ZigiaGVhZGVyX2xlbmd0aDogJXVcbiIsIG50b2hsKGhlYWRlci0+ZmlybXdhcmVfaW5mby5oZWFkZXJfbGVuZ3RoKSk7CisJCXByaW50ZigiZmlsZV9sZW5ndGg6ICV1XG4iLCBudG9obChoZWFkZXItPmZpcm13YXJlX2luZm8uZmlsZV9sZW5ndGgpKTsKKwkJcHJpbnRmKCJzd19wYXJ0OiAlLjIwc1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnN3X3BhcnQpOworCQlwcmludGYoInRleHQxOiAlLjY0c1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnRleHQxKTsKKwkJcHJpbnRmKCJ0aW1lOiAlLjEyc1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnRpbWUpOworCQlwcmludGYoImRhdGU6ICUuMTRzXG4iLCBoZWFkZXItPmZpcm13YXJlX2luZm8uZGF0ZSk7CisJCXByaW50ZigidGV4dDI6ICUuMTBzXG4iLCBoZWFkZXItPmZpcm13YXJlX2luZm8udGV4dDIpOworCQlwcmludGYoInZlcnNpb246ICUuMjBzXG4iLCBoZWFkZXItPmZpcm13YXJlX2luZm8udmVyc2lvbik7CisJCXByaW50Zigic3ViaXRlbXMuLi5cbiIpOworCisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1Yl9lbnRyeSwgJmhlYWRlci0+aGVhZGVyX2xpc3QsIGVudHJ5KSB7CisJCQlwcmludGYoIlx0c29tZXRoaW5nMTogJXVcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnNvbWV0aGluZzEpOworCQkJcHJpbnRmKCJcdHRleHQxOiAlLjY0c1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkudGV4dDEpOworCQkJcHJpbnRmKCJcdHRpbWU6ICUuMTJzXG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS50aW1lKTsKKwkJCXByaW50ZigiXHRkYXRlOiAlLjE0c1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuZGF0ZSk7CisJCQlwcmludGYoIlx0dGV4dDI6ICUuMTBzXG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS50ZXh0Mik7CisJCQlwcmludGYoIlx0dmVyc2lvbjogJS4yMHNcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnZlcnNpb24pOworCQkJcHJpbnRmKCJcdGxlbmd0aDogJXVcbiIsIG50b2hsKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5Lmxlbmd0aCkpOworCQkJcHJpbnRmKCJcdGFkZHIxOiAweCV4XG4iLCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5hZGRyMSkpOworCQkJcHJpbnRmKCJcdGFkZHIyOiAweCV4XG4iLCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5hZGRyMikpOworCQkJcHJpbnRmKCJcdHN0YXJ0OiAweCV4XG4iLCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5zdGFydCkpOworCQkJcHJpbnRmKCJcdGFicy4gb2Zmc2V0OiAweCVseFxuIiwgc3ViX2VudHJ5LT5hYnNvbHV0ZV9vZmZzZXQpOworCQkJcHJpbnRmKCJcblxuIik7CisKKwkJCWR1bXBfZW50cnkoc3ViX2VudHJ5LCBwYXJ0KyssIGZkKTsKKwkJfQorCQlwcmludGYoIlxuXG4iKTsKKwl9CisKKwlpZiAoY2xvc2UoZmQpICE9IDApIHsKKwkJcGVycm9yKCJDbG9zZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXRhbGxvY19mcmVlKHRhbGxfZmlybV9jdHgpOworfQorCitzdGF0aWMgdm9pZCBwcmludF91c2FnZSh2b2lkKQoreworCXByaW50ZigiVXNhZ2U6IGlwYWNjZXNzLWNvbmZpZ1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAodm9pZCkKK3sKKwlwcmludGYoIiAgLXUgLS11bml0LWlkIFVOSVRfSURcbiIpOworCXByaW50ZigiICAtbyAtLW9tbC1pcCBpcFxuIik7CisJcHJpbnRmKCIgIC1yIC0tcmVzdGFydFxuIik7CisJcHJpbnRmKCIgIC1uIGZsYWdzL21hc2tcdFNldCBOVlJBTSBhdHRyaWJ1dGVzLlxuIik7CisJcHJpbnRmKCIgIC1sIC0tbGlzdGVuIHRlc3RuciBcdFBlcmZvcm0gc3BlY2lmaWVkIHRlc3QgbnVtYmVyXG4iKTsKKwlwcmludGYoIiAgLWggLS1oZWxwIHRoaXMgdGV4dFxuIik7CisJcHJpbnRmKCIgIC1zIC0tc3RyZWFtLWlkIElEXG4iKTsKKwlwcmludGYoIiAgLWQgLS1zb2Z0d2FyZSBmaXJtd2FyZVxuIik7CisJcHJpbnRmKCIgIC1mIC0tZmlybXdhcmUgZmlybXdhcmUgUHJvdmlkZSBmaXJtd2FyZSBpbmZvcm1hdGlvblxuIik7CisJcHJpbnRmKCIgIC13IC0td3JpdGUtZmlybXdhcmUuIFRoaXMgd2lsbCBkdW1wIHRoZSBmaXJtd2FyZSBwYXJ0cyB0byB0aGUgZmlsZXN5c3RlbS4gVXNlIHdpdGggLWYuXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwlpbnQgcmMsIG9wdGlvbl9pbmRleCA9IDAsIHN0cmVhbV9pZCA9IDB4ZmY7CisJc3RydWN0IGxvZ190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisKKwlsb2dfaW5pdCgmbG9nX2luZm8pOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisJbG9nX3NldF9sb2dfbGV2ZWwoc3RkZXJyX3RhcmdldCwgMCk7CisJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkROTSwwIik7CisJYnRzX21vZGVsX25hbm9idHNfaW5pdCgpOworCisJcHJpbnRmKCJpcGFjY2Vzcy1jb25maWcgKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlXG4iKTsKKwlwcmludGYoIlRoaXMgaXMgRlJFRSBTT0ZUV0FSRSB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFlcblxuIik7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgYzsKKwkJdW5zaWduZWQgbG9uZyB1bDsKKwkJY2hhciAqc2xhc2g7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyAidW5pdC1pZCIsIDEsIDAsICd1JyB9LAorCQkJeyAib21sLWlwIiwgMSwgMCwgJ28nIH0sCisJCQl7ICJyZXN0YXJ0IiwgMCwgMCwgJ3InIH0sCisJCQl7ICJoZWxwIiwgMCwgMCwgJ2gnIH0sCisJCQl7ICJsaXN0ZW4iLCAxLCAwLCAnbCcgfSwKKwkJCXsgInN0cmVhbS1pZCIsIDEsIDAsICdzJyB9LAorCQkJeyAic29mdHdhcmUiLCAxLCAwLCAnZCcgfSwKKwkJCXsgImZpcm13YXJlIiwgMSwgMCwgJ2YnIH0sCisJCQl7ICJ3cml0ZS1maXJtd2FyZSIsIDAsIDAsICd3JyB9LAorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAidTpvOnJuOmw6aHM6ZDpmOnciLCBsb25nX29wdGlvbnMsCisJCQkJJm9wdGlvbl9pbmRleCk7CisKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAndSc6CisJCQl1bml0X2lkID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJcHJpbV9vbWxfaXAgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZXN0YXJ0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCXNsYXNoID0gc3RyY2hyKG9wdGFyZywgJy8nKTsKKwkJCWlmICghc2xhc2gpCisJCQkJZXhpdCgyKTsKKwkJCXVsID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDE2KTsKKwkJCW52X2ZsYWdzID0gdWwgJiAweGZmZmY7CisJCQl1bCA9IHN0cnRvdWwoc2xhc2grMSwgTlVMTCwgMTYpOworCQkJbnZfbWFzayA9IHVsICYgMHhmZmZmOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJbmV0X2xpc3Rlbl90ZXN0bnIgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzdHJlYW1faWQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlzb2Z0d2FyZSA9IHN0cmR1cChvcHRhcmcpOworCQkJaWYgKGZpbmRfc3dfbG9hZF9wYXJhbXMob3B0YXJnKSAhPSAwKQorCQkJCWV4aXQoMCk7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlmaXJtd2FyZV9hbmFseXNpcyA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCWR1bXBfZmlsZXMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfdXNhZ2UoKTsKKwkJCXByaW50X2hlbHAoKTsKKwkJCWV4aXQoMCk7CisJCX0KKwl9OworCisJaWYgKGZpcm13YXJlX2FuYWx5c2lzKQorCQlhbmFseXplX2Zpcm13YXJlKGZpcm13YXJlX2FuYWx5c2lzKTsKKworCWlmIChvcHRpbmQgPj0gYXJnYykgeworCQkvKiBvbmx5IHdhcm4gaWYgd2UgaGF2ZSBub3QgZG9uZSBhbnl0aGluZyBlbHNlICovCisJCWlmICghZmlybXdhcmVfYW5hbHlzaXMpCisJCQlmcHJpbnRmKHN0ZGVyciwgInlvdSBoYXZlIHRvIHNwZWNpZnkgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIEJUUy4gVXNlIC0taGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvblxuIik7CisJCWV4aXQoMik7CisJfQorCisJZ3NtbmV0ID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBOVUxMKTsKKwlpZiAoIWdzbW5ldCkKKwkJZXhpdCgxKTsKKworCWJ0cyA9IGdzbV9idHNfYWxsb2MoZ3NtbmV0LCBHU01fQlRTX1RZUEVfTkFOT0JUUywgSEFSRENPREVEX1RTQywKKwkJCQlIQVJEQ09ERURfQlNJQyk7CisJLyogaXAuYWNjZXNzIHN1cHBvcnRzIHVwIHRvIDQgY2hhaW5lZCBUUlggKi8KKwlnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCWdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisJZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKwlidHMtPm9tbF90ZWkgPSBzdHJlYW1faWQ7CisJCisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTk0sIG5tX3NpZ19jYiwgTlVMTCk7CisJcHJpbnRmKCJUcnlpbmcgdG8gY29ubmVjdCB0byBpcC5hY2Nlc3MgQlRTIC4uLlxuIik7CisKKwltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlpbmV0X2F0b24oYXJndltvcHRpbmRdLCAmc2luLnNpbl9hZGRyKTsKKwlyYyA9IGlhX2NvbmZpZ19jb25uZWN0KGJ0cywgJnNpbik7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoIkVycm9yIGNvbm5lY3RpbmcgdG8gdGhlIEJUUyIpOworCQlleGl0KDEpOworCX0KKwkKKwl3aGlsZSAoMSkgeworCQlyYyA9IGJzY19zZWxlY3RfbWFpbigwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQoMyk7CisJfQorCisJZXhpdCgwKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmluZC5jIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmluZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNGEwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maW5kLmMKQEAgLTAsMCArMSwyMDggQEAKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorCitzdGF0aWMgY29uc3QgY2hhciAqaWR0YWdfbmFtZXNbXSA9IHsKKwlbSVBBQ19JRFRBR19TRVJOUl0JPSAiU2VyaWFsIE51bWJlciIsCisJW0lQQUNfSURUQUdfVU5JVE5BTUVdCT0gIlVuaXQgTmFtZSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04xXQk9ICJMb2NhdGlvbiAxIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjJdCT0gIkxvY2F0aW9uIDIiLAorCVtJUEFDX0lEVEFHX0VRVUlQVkVSU10JPSAiRXF1aXBtZW50IFZlcnNpb24iLAorCVtJUEFDX0lEVEFHX1NXVkVSU0lPTl0JPSAiU29mdHdhcmUgVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfSVBBRERSXQk9ICJJUCBBZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19NQUNBRERSXQk9ICJNQUMgQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfVU5JVF0JPSAiVW5pdCBJRCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaXBhY19pZHRhZ19uYW1lKGludCB0YWcpCit7CisJaWYgKHRhZyA+PSBBUlJBWV9TSVpFKGlkdGFnX25hbWVzKSkKKwkJcmV0dXJuICJ1bmtub3duIjsKKworCXJldHVybiBpZHRhZ19uYW1lc1t0YWddOworfQorCitzdGF0aWMgaW50IHVkcF9zb2NrKGNvbnN0IGNoYXIgKmlmbmFtZSkKK3sKKwlpbnQgZmQsIHJjLCBiYyA9IDE7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCisJZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCWlmIChmZCA8IDApCisJCXJldHVybiBmZDsKKworCWlmIChpZm5hbWUpIHsKKwkJcmMgPSBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsIGlmbmFtZSwKKwkJCQlzdHJsZW4oaWZuYW1lKSk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGVycjsKKwl9CisKKwlzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzYS5zaW5fcG9ydCA9IGh0b25zKDMwMDYpOworCXNhLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisKKwlyYyA9IGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZihzYSkpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisJcmMgPSBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19CUk9BRENBU1QsICZiYywgc2l6ZW9mKGJjKSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisKKyNpZiAwCisJLyogd2UgY2Fubm90IGJpbmQsIHNpbmNlIHRoZSByZXNwb25zZSBwYWNrZXRzIGRvbid0IGNvbWUgZnJvbQorCSAqIHRoZSBicm9hZGNhc3QgYWRkcmVzcyAqLworCXNhLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNhLnNpbl9wb3J0ID0gaHRvbnMoMzAwNik7CisJaW5ldF9hdG9uKCIyNTUuMjU1LjI1NS4yNTUiLCAmc2Euc2luX2FkZHIpOworCisJcmMgPSBjb25uZWN0KGZkLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCBzaXplb2Yoc2EpKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKyNlbmRpZgorCXJldHVybiBmZDsKKworZXJyOgorCWNsb3NlKGZkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgZmluZF9wa3RbXSA9IHsgMHgwMCwgMHgwYis4LCBJUEFDX1BST1RPX0lQQUNDRVNTLCAweDAwLAorCQkJCUlQQUNfTVNHVF9JRF9HRVQsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTUFDQUREUiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19JUEFERFIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVCwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjEsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04yLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0VRVUlQVkVSUywKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TV1ZFUlNJT04sCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVE5BTUUsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU0VSTlIsCisJCQkJfTsKKworCitzdGF0aWMgaW50IGJjYXN0X2ZpbmQoaW50IGZkKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKworCXNhLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNhLnNpbl9wb3J0ID0gaHRvbnMoMzAwNik7CisJaW5ldF9hdG9uKCIyNTUuMjU1LjI1NS4yNTUiLCAmc2Euc2luX2FkZHIpOworCisJcmV0dXJuIHNlbmR0byhmZCwgZmluZF9wa3QsIHNpemVvZihmaW5kX3BrdCksIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhLCBzaXplb2Yoc2EpKTsKK30KKworc3RhdGljIGludCBwYXJzZV9yZXNwb25zZSh1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJdV9pbnQ4X3QgdF9sZW47CisJdV9pbnQ4X3QgdF90YWc7CisJdV9pbnQ4X3QgKmN1ciA9IGJ1ZjsKKworCXdoaWxlIChjdXIgPCBidWYgKyBsZW4pIHsKKwkJdF9sZW4gPSAqY3VyKys7CisJCXRfdGFnID0gKmN1cisrOworCQkKKwkJcHJpbnRmKCIlcz0nJXMnICAiLCBpcGFjX2lkdGFnX25hbWUodF90YWcpLCBjdXIpOworCisJCWN1ciArPSB0X2xlbjsKKwl9CisJcHJpbnRmKCJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfcmVzcG9uc2UoaW50IGZkKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzI1NV07CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCWludCBsZW47CisJc29ja2xlbl90IHNhX2xlbiA9IHNpemVvZihzYSk7CisKKwlsZW4gPSByZWN2ZnJvbShmZCwgYnVmLCBzaXplb2YoYnVmKSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgJnNhX2xlbik7CisJaWYgKGxlbiA8IDApCisJCXJldHVybiBsZW47CisKKwkvKiAyIGJ5dGVzIGxlbmd0aCwgMSBieXRlIHByb3RvY29sICgweGZlKSAqLworCWlmIChidWZbMl0gIT0gMHhmZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYnVmWzRdICE9IElQQUNfTVNHVF9JRF9SRVNQKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBwYXJzZV9yZXNwb25zZShidWYrNiwgbGVuLTYpOworfQorCitzdGF0aWMgaW50IGJmZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBCU0NfRkRfUkVBRCkKKwkJcmV0dXJuIHJlYWRfcmVzcG9uc2UoYmZkLT5mZCk7CisJaWYgKGZsYWdzICYgQlNDX0ZEX1dSSVRFKSB7CisJCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCQlyZXR1cm4gYmNhc3RfZmluZChiZmQtPmZkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworc3RhdGljIHZvaWQgdGltZXJfY2Iodm9pZCAqX2RhdGEpCit7CisJc3RydWN0IGJzY19mZCAqYmZkID0gX2RhdGE7CisKKwliZmQtPndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZ0aW1lciwgNSwgMCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgYnNjX2ZkIGJmZDsKKwljaGFyICppZm5hbWU7CisJaW50IHJjOworCisJcHJpbnRmKCJpcGFjY2Vzcy1maW5kIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZVxuIik7CisJcHJpbnRmKCJUaGlzIGlzIEZSRUUgU09GVFdBUkUgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZXG5cbiIpOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCWZwcmludGYoc3Rkb3V0LCAieW91IG1pZ2h0IG5lZWQgdG8gc3BlY2lmeSB0aGUgb3V0Z29pbmdcbiIKKwkJCSIgbmV0d29yayBpbnRlcmZhY2UsIGUuZy4gYGAlcyBldGgwJydcbiIsIGFyZ3ZbMF0pOworCX0KKworCWlmbmFtZSA9IGFyZ3ZbMV07CisJYmZkLmNiID0gYmZkX2NiOworCWJmZC53aGVuID0gQlNDX0ZEX1JFQUQgfCBCU0NfRkRfV1JJVEU7CisJYmZkLmZkID0gdWRwX3NvY2soaWZuYW1lKTsKKwlpZiAoYmZkLmZkIDwgMCkgeworCQlwZXJyb3IoIkNhbm5vdCBjcmVhdGUgbG9jYWwgc29ja2V0IGZvciBicm9hZGNhc3QgdWRwIik7CisJCWV4aXQoMSk7CisJfQorCisJYnNjX3JlZ2lzdGVyX2ZkKCZiZmQpOworCisJdGltZXIuY2IgPSB0aW1lcl9jYjsKKwl0aW1lci5kYXRhID0gJmJmZDsKKworCWJzY19zY2hlZHVsZV90aW1lcigmdGltZXIsIDUsIDApOworCisJcHJpbnRmKCJUcnlpbmcgdG8gZmluZCBpcC5hY2Nlc3MgQlRTIGJ5IGJyb2FkY2FzdCBVRFAuLi5cbiIpOworCisJd2hpbGUgKDEpIHsKKwkJcmMgPSBic2Nfc2VsZWN0X21haW4oMCk7CisJCWlmIChyYyA8IDApCisJCQlleGl0KDMpOworCX0KKworCWV4aXQoMCk7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpcm13YXJlLmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maXJtd2FyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDBjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maXJtd2FyZS5jCkBAIC0wLDAgKzEsMTM2IEBACisvKiBSb3V0aW5lcyBmb3IgcGFyc2luZyBhbiBpcGFjY2VzIFNEUCBmaXJtd2FyZSBmaWxlICovCisKKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvaXBhY2Nlc3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgUEFSVF9MRU5HVEggMTM4CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBzZHBfaGVhZGVyX2VudHJ5KSA9PSAxMzgsIHJpZ2h0X2VudHJ5KTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBzZHBfZmlybXdhcmUpID09IDE1OCwgX3JpZ2h0X2hlYWRlcl9sZW5ndGgpOworCisvKiBtb3JlIG1hZ2ljLCB0aGUgc2Vjb25kICJpbnQiIGluIHRoZSBoZWFkZXIgKi8KK3N0YXRpYyBjaGFyIG1vcmVfbWFnaWNbXSA9IHsgMHgxMCwgMHgwMiB9OworCitpbnQgaXBhY2Nlc3NfYW5hbHl6ZV9maWxlKGludCBmZCwgY29uc3QgdW5zaWduZWQgaW50IHN0X3NpemUsIGNvbnN0IHVuc2lnbmVkIGludCBiYXNlX29mZnNldCwgc3RydWN0IGxsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IHNkcF9maXJtd2FyZSAqZmlybXdhcmVfaGVhZGVyID0gMDsKKwlzdHJ1Y3Qgc2RwX2hlYWRlciAqaGVhZGVyOworCWNoYXIgYnVmWzQwOTZdOworCWludCByYywgaTsKKwl1X2ludDE2X3QgdGFibGVfc2l6ZTsKKwl1X2ludDE2X3QgdGFibGVfb2Zmc2V0OworCW9mZl90IHRhYmxlX3N0YXJ0OworCisKKwlyYyA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKCpmaXJtd2FyZV9oZWFkZXIpKTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiQ2FuIG5vdCByZWFkIGhlYWRlciBzdGFydC4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZpcm13YXJlX2hlYWRlciA9IChzdHJ1Y3Qgc2RwX2Zpcm13YXJlICopICZidWZbMF07CisJaWYgKHN0cm5jbXAoZmlybXdhcmVfaGVhZGVyLT5tYWdpYywgIiBTRFAiLCA0KSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgbWFnaWMuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChtZW1jbXAoZmlybXdhcmVfaGVhZGVyLT5tb3JlX21hZ2ljLCBtb3JlX21hZ2ljLCAyKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV3JvbmcgbW9yZSBtYWdpYy4gR290OiAweCV4ICV4ICV4ICV4XG4iLAorCQkJZmlybXdhcmVfaGVhZGVyLT5tb3JlX21hZ2ljWzBdICYgMHhmZiwgZmlybXdhcmVfaGVhZGVyLT5tb3JlX21hZ2ljWzFdICYgMHhmZiwKKwkJCWZpcm13YXJlX2hlYWRlci0+bW9yZV9tYWdpY1syXSAmIDB4ZmYsIGZpcm13YXJlX2hlYWRlci0+bW9yZV9tYWdpY1szXSAmIDB4ZmYpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwlpZiAobnRvaGwoZmlybXdhcmVfaGVhZGVyLT5maWxlX2xlbmd0aCkgIT0gc3Rfc2l6ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSBmaWxlc2l6ZSBhbmQgdGhlIGhlYWRlciBkbyBub3QgbWF0Y2guXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGFkZCB0aGUgZmlybXdhcmUgKi8KKwloZWFkZXIgPSB0YWxsb2NfemVybyhsaXN0LCBzdHJ1Y3Qgc2RwX2hlYWRlcik7CisJaGVhZGVyLT5maXJtd2FyZV9pbmZvID0gKmZpcm13YXJlX2hlYWRlcjsKKwlJTklUX0xMSVNUX0hFQUQoJmhlYWRlci0+aGVhZGVyX2xpc3QpOworCWxsaXN0X2FkZCgmaGVhZGVyLT5lbnRyeSwgbGlzdCk7CisKKwl0YWJsZV9vZmZzZXQgPSBudG9ocyhmaXJtd2FyZV9oZWFkZXItPnRhYmxlX29mZnNldCk7CisJdGFibGVfc3RhcnQgPSBsc2VlayhmZCwgdGFibGVfb2Zmc2V0LCBTRUVLX0NVUik7CisJaWYgKHRhYmxlX3N0YXJ0ID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHNlZWsgdG8gdGhlIHJlbCBwb3NpdGlvbjogMHgleFxuIiwgdGFibGVfb2Zmc2V0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChyZWFkKGZkLCAmdGFibGVfc2l6ZSwgc2l6ZW9mKHRhYmxlX3NpemUpKSAhPSBzaXplb2YodGFibGVfc2l6ZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJUaGUgdGFibGUgc2l6ZSBjb3VsZCBub3QgYmUgcmVhZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJdGFibGVfc2l6ZSA9IG50b2hzKHRhYmxlX3NpemUpOworCisJaWYgKHRhYmxlX3NpemUgJSBQQVJUX0xFTkdUSCAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlIHBhcnQgbGVuZ3RoIHNlZW1zIHRvIGJlIHdyb25nOiAweCV4XG4iLCB0YWJsZV9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGxvb2sgaW50byBlYWNoIGZpcm13YXJlIG5vdyAqLworCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9zaXplIC8gUEFSVF9MRU5HVEg7ICsraSkgeworCQlzdHJ1Y3Qgc2RwX2hlYWRlcl9lbnRyeSBlbnRyeTsKKwkJc3RydWN0IHNkcF9oZWFkZXJfaXRlbSAqaGVhZGVyX2VudHJ5OworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gdGFibGVfc3RhcnQgKyAyOworCQlvZmZzZXQgKz0gaSAqIDEzODsKKworCQlpZiAobHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW4gbm90IHNlZWsgdG8gdGhlIG9mZnNldDogJXUuXG4iLCBvZmZzZXQpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcmMgPSByZWFkKGZkLCAmZW50cnksIHNpemVvZihlbnRyeSkpOworCQlpZiAocmMgIT0gc2l6ZW9mKGVudHJ5KSkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW4gbm90IHJlYWQgdGhlIGhlYWRlciBlbnRyeS5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaGVhZGVyX2VudHJ5ID0gdGFsbG9jX3plcm8oaGVhZGVyLCAgc3RydWN0IHNkcF9oZWFkZXJfaXRlbSk7CisJCWhlYWRlcl9lbnRyeS0+aGVhZGVyX2VudHJ5ID0gZW50cnk7CisJCWhlYWRlcl9lbnRyeS0+YWJzb2x1dGVfb2Zmc2V0ID0gYmFzZV9vZmZzZXQ7CisJCWxsaXN0X2FkZCgmaGVhZGVyX2VudHJ5LT5lbnRyeSwgJmhlYWRlci0+aGVhZGVyX2xpc3QpOworCisJCS8qIG5vdyB3ZSBuZWVkIHRvIGZpbmQgdGhlIFNEUCBmaWxlLi4uICovCisJCW9mZnNldCA9IG50b2hsKGVudHJ5LnN0YXJ0KSArIDQgKyBiYXNlX29mZnNldDsKKwkJaWYgKGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSBvZmZzZXQpIHsKKwkJCXBlcnJvcigiY2FuJ3Qgc2VlayB0byBzZHAiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisKKwkJaXBhY2Nlc3NfYW5hbHl6ZV9maWxlKGZkLCBudG9obChlbnRyeS5sZW5ndGgpLCBvZmZzZXQsIGxpc3QpOworCX0KKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1wcm94eS5jIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtcHJveHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODYwODEzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtcHJveHkuYwpAQCAtMCwwICsxLDExMjggQEAKKy8qIE9wZW5CU0MgQWJpcy9JUCBwcm94eSBpcC5hY2Nlc3MgbmFub0JUUyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCitzdGF0aWMgc3RydWN0IGxvZ190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisKKy8qIG9uZSBpbnN0YW5jZSBvZiBhbiBpcC5hY2Nlc3MgcHJvdG9jb2wgcHJveHkgKi8KK3N0cnVjdCBpcGFfcHJveHkgeworCS8qIHNvY2tldCB3aGVyZSB3ZSBsaXN0ZW4gZm9yIGluY29taW5nIE9NTCBmcm9tIEJUUyAqLworCXN0cnVjdCBic2NfZmQgb21sX2xpc3Rlbl9mZDsKKwkvKiBzb2NrZXQgd2hlcmUgd2UgbGlzdGVuIGZvciBpbmNvbWluZyBSU0wgZnJvbSBCVFMgKi8KKwlzdHJ1Y3QgYnNjX2ZkIHJzbF9saXN0ZW5fZmQ7CisJLyogbGlzdCBvZiBCVFMncyAoc3RydWN0IGlwYV9idHNfY29ubiAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGJ0c19saXN0OworCS8qIHRoZSBCU0MgcmVjb25uZWN0IHRpbWVyICovCisJc3RydWN0IHRpbWVyX2xpc3QgcmVjb25uX3RpbWVyOworfTsKKworLyogZ2xvYmFsIHBvaW50ZXIgdG8gdGhlIHByb3h5IHN0cnVjdHVyZSAqLworc3RhdGljIHN0cnVjdCBpcGFfcHJveHkgKmlwcDsKKworc3RydWN0IGlwYV9wcm94eV9jb25uIHsKKwlzdHJ1Y3QgYnNjX2ZkIGZkOworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X3F1ZXVlOworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmJ0c19jb25uOworfTsKKworI2RlZmluZSBNQVhfVFJYIDQKKworLyogcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgQlRTIGluIG91ciBwcm94eSAqLworc3RydWN0IGlwYV9idHNfY29ubiB7CisJLyogbGlzdCBvZiBCVFMncyAoaXBhX3Byb3h5LT5idHNfbGlzdCkgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCS8qIGJhY2sgcG9pbnRlciB0byB0aGUgcHJveHkgd2hpY2ggd2UgYmVsb25nIHRvICovCisJc3RydWN0IGlwYV9wcm94eSAqaXBwOworCS8qIHRoZSB1bml0IElEIGFzIGRldGVybWluZWQgYnkgQ0NNICovCisJc3RydWN0IHsKKwkJdV9pbnQxNl90IHNpdGVfaWQ7CisJCXVfaW50MTZfdCBidHNfaWQ7CisJfSB1bml0X2lkOworCisJLyogaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbSBCVFMgKi8KKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKm9tbF9jb25uOworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqcnNsX2Nvbm5bTUFYX1RSWF07CisKKwkvKiBvdXRnb2luZyBjb25uZWN0aW9ucyB0byBCU0MgKi8KKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmJzY19vbWxfY29ubjsKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmJzY19yc2xfY29ubltNQVhfVFJYXTsKKworCS8qIFVEUCBzb2NrZXRzIGZvciBCVFMgYW5kIEJTQyBpbmplY3Rpb24gKi8KKwlzdHJ1Y3QgYnNjX2ZkIHVkcF9idHNfZmQ7CisJc3RydWN0IGJzY19mZCB1ZHBfYnNjX2ZkOworCisJY2hhciAqaWRfdGFnc1sweGZmXTsKKwl1X2ludDhfdCAqaWRfcmVzcDsKKwl1bnNpZ25lZCBpbnQgaWRfcmVzcF9sZW47Cit9OworCitlbnVtIGlwcF9mZF90eXBlIHsKKwlPTUxfRlJPTV9CVFMgPSAxLAorCVJTTF9GUk9NX0JUUyA9IDIsCisJT01MX1RPX0JTQyA9IDMsCisJUlNMX1RPX0JTQyA9IDQsCisJVURQX1RPX0JUUyA9IDUsCisJVURQX1RPX0JTQyA9IDYsCit9OworCisvKiBzb21lIG9mIHRoZSBjb2RlIGFnYWluc3Qgd2UgbGluayBmcm9tIE9wZW5CU0MgbmVlZHMgdGhpcyAqLwordm9pZCAqdGFsbF9ic2NfY3R4OworCitzdGF0aWMgY2hhciAqbGlzdGVuX2lwYWRkcjsKK3N0YXRpYyBjaGFyICpic2NfaXBhZGRyOworCisjZGVmaW5lIFBST1hZX0FMTE9DX1NJWkUJMzAwCisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBwb25nW10gPSB7IDAsIDEsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9QT05HIH07CitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaWRfYWNrW10gPSB7IDAsIDEsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9JRF9BQ0sgfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBpZF9yZXFbXSA9IHsgMCwgMTcsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9JRF9HRVQsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVCwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19NQUNBRERSLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfRVFVSVBWRVJTLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NXVkVSU0lPTiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklUTkFNRSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TRVJOUiwKKwkJCQl9OworCitzdGF0aWMgY29uc3QgY2hhciAqaWR0YWdfbmFtZXNbXSA9IHsKKwlbSVBBQ19JRFRBR19TRVJOUl0JPSAiU2VyaWFsX051bWJlciIsCisJW0lQQUNfSURUQUdfVU5JVE5BTUVdCT0gIlVuaXRfTmFtZSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04xXQk9ICJMb2NhdGlvbl8xIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjJdCT0gIkxvY2F0aW9uXzIiLAorCVtJUEFDX0lEVEFHX0VRVUlQVkVSU10JPSAiRXF1aXBtZW50X1ZlcnNpb24iLAorCVtJUEFDX0lEVEFHX1NXVkVSU0lPTl0JPSAiU29mdHdhcmVfVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfSVBBRERSXQk9ICJJUF9BZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19NQUNBRERSXQk9ICJNQUNfQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfVU5JVF0JPSAiVW5pdF9JRCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaXBhY19pZHRhZ19uYW1lKGludCB0YWcpCit7CisJaWYgKHRhZyA+PSBBUlJBWV9TSVpFKGlkdGFnX25hbWVzKSkKKwkJcmV0dXJuICJ1bmtub3duIjsKKworCXJldHVybiBpZHRhZ19uYW1lc1t0YWddOworfQorCitzdGF0aWMgaW50IGlwYWNfaWR0YWdfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKmRlYywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXVfaW50OF90IHRfbGVuOworCXVfaW50OF90IHRfdGFnOworCXVfaW50OF90ICpjdXIgPSBidWY7CisKKwl3aGlsZSAoY3VyIDwgYnVmICsgbGVuKSB7CisJCXRfbGVuID0gKmN1cisrOworCQl0X3RhZyA9ICpjdXIrKzsKKworCQlERUJVR1BDKERNSSwgIiVzPSclcycgIiwgaXBhY19pZHRhZ19uYW1lKHRfdGFnKSwgY3VyKTsKKworCQlkZWMtPmx2W3RfdGFnXS5sZW4gPSB0X2xlbjsKKwkJZGVjLT5sdlt0X3RhZ10udmFsID0gY3VyOworCisJCWN1ciArPSB0X2xlbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdW5pdGlkKGNvbnN0IGNoYXIgKnN0ciwgdV9pbnQxNl90ICpzaXRlX2lkLCB1X2ludDE2X3QgKmJ0c19pZCwKKwkJCXVfaW50MTZfdCAqdHJ4X2lkKQoreworCXVuc2lnbmVkIGxvbmcgdWw7CisJY2hhciAqZW5kcHRyOworCWNvbnN0IGNoYXIgKm5wdHI7CisKKwlucHRyID0gc3RyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc2l0ZV9pZCkKKwkJKnNpdGVfaWQgPSB1bCAmIDB4ZmZmZjsKKworCWlmICgqZW5kcHRyKysgIT0gJy8nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5wdHIgPSBlbmRwdHI7CisJdWwgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyIDw9IG5wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChidHNfaWQpCisJCSpidHNfaWQgPSB1bCAmIDB4ZmZmZjsKKworCWlmICgqZW5kcHRyKysgIT0gJy8nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5wdHIgPSBlbmRwdHI7CisJdWwgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyIDw9IG5wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0cnhfaWQpCisJCSp0cnhfaWQgPSB1bCAmIDB4ZmZmZjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlwYV9idHNfY29ubiAqZmluZF9idHNfYnlfdW5pdGlkKHN0cnVjdCBpcGFfcHJveHkgKmlwcCwKKwkJCQkJCXVfaW50MTZfdCBzaXRlX2lkLAorCQkJCQkJdV9pbnQxNl90IGJ0c19pZCkKK3sKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoaXBiYywgJmlwcC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGlwYmMtPnVuaXRfaWQuc2l0ZV9pZCA9PSBzaXRlX2lkICYmCisJCSAgICBpcGJjLT51bml0X2lkLmJ0c19pZCA9PSBidHNfaWQpCisJCQlyZXR1cm4gaXBiYzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGlwYV9wcm94eV9jb25uICphbGxvY19jb25uKHZvaWQpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGM7CisKKwlpcGMgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBpcGFfcHJveHlfY29ubik7CisJaWYgKCFpcGMpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MTElTVF9IRUFEKCZpcGMtPnR4X3F1ZXVlKTsKKworCXJldHVybiBpcGM7Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfaWR0YWdzKHN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMsIHN0cnVjdCB0bHZfcGFyc2VkICp0bHZwKQoreworCXVuc2lnbmVkIGludCBpLCBsZW47CisKKwlmb3IgKGkgPSAwOyBpIDw9IDB4ZmY7IGkrKykgeworCQlpZiAoIVRMVlBfUFJFU0VOVCh0bHZwLCBpKSkKKwkJCWNvbnRpbnVlOworCisJCWxlbiA9IFRMVlBfTEVOKHRsdnAsIGkpOworI2lmIDAKKwkJaWYgKCFpcGJjLT5pZF90YWdzW2ldKQorCQkJaXBiYy0+aWRfdGFnc1tpXSA9IHRhbGxvY19zaXplKHRhbGxfYnNjX2N0eCwgbGVuKTsKKwkJZWxzZQorI2VuZGlmCisJCQlpcGJjLT5pZF90YWdzW2ldID0gdGFsbG9jX3JlYWxsb2Nfc2l6ZShpcGJjLAorCQkJCQkJCSAgaXBiYy0+aWRfdGFnc1tpXSwgbGVuKTsKKwkJaWYgKCFpcGJjLT5pZF90YWdzW2ldKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtc2V0KGlwYmMtPmlkX3RhZ3NbaV0sIDAsIGxlbik7CisJCS8vbWVtY3B5KGlwYmMtPmlkX3RhZ3NbaV0sIFRMVlBfVkFMKHRsdnAsIGkpLCBsZW4pOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGlwYV9wcm94eV9jb25uICpjb25uZWN0X2JzYyhzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhLCBpbnQgcHJpdl9uciwgdm9pZCAqZGF0YSk7CisKKyNkZWZpbmUgbG9ncF9pcGJjX3VpZChzcywgbHZsLCBpcGJjLCB0cnhfaWQpIF9sb2dwX2lwYmNfdWlkKHNzLCBsdmwsIF9fRklMRV9fLCBfX0xJTkVfXywgaXBiYywgdHJ4X2lkKQorCitzdGF0aWMgdm9pZCBfbG9ncF9pcGJjX3VpZCh1bnNpZ25lZCBpbnQgc3MsIHVuc2lnbmVkIGludCBsdmwsIGNoYXIgKmZpbGUsIGludCBsaW5lLAorCQkJICAgc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYywgdV9pbnQ4X3QgdHJ4X2lkKQoreworCWlmIChpcGJjKQorCQlsb2dwMihzcywgbHZsLCBmaWxlLCBsaW5lLCAwLCAiKCV1LyV1LyV1KSAiLCBpcGJjLT51bml0X2lkLnNpdGVfaWQsCisJCSAgICAgaXBiYy0+dW5pdF9pZC5idHNfaWQsIHRyeF9pZCk7CisJZWxzZQorCQlsb2dwMihzcywgbHZsLCBmaWxlLCBsaW5lLCAwLCAidW5rbm93biAiKTsKK30KKworLyogVURQIHNvY2tldCBoYW5kbGluZyAqLworCitzdGF0aWMgaW50IG1ha2Vfc29jayhzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVfaW50MTZfdCBwb3J0LCBpbnQgcHJvdG8sIGludCBwcml2X25yLAorCQkgICAgIGludCAoKmNiKShzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpLAorCQkgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IHJldCwgb24gPSAxOworCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBwcm90byk7CisJYmZkLT5jYiA9IGNiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCWJmZC0+ZGF0YSA9IGRhdGE7CisJYmZkLT5wcml2X25yID0gcHJpdl9ucjsKKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisKKwlzZXRzb2Nrb3B0KGJmZC0+ZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKworCXJldCA9IGJpbmQoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgYmluZCBzb2NrZXQ6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJyZWdpc3RlciBVRFAgZmQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3VkcF9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjID0gYmZkLT5kYXRhOworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqb3RoZXJfY29ubiA9IE5VTEw7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoUFJPWFlfQUxMT0NfU0laRSwgIkFiaXMvSVAgVURQIik7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCWludCByZXQ7CisKKwkvKiB3aXRoIFVEUCBzb2NrZXRzLCB3ZSBjYW5ub3QgcmVhZCBwYXJ0aWFsIHBhY2tldHMgYnV0IGhhdmUgdG8gcmVhZAorCSAqIGFsbCBvZiBpdCBpbiBvbmUgZ28gKi8KKwloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2ctPmRhdGE7CisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmRhdGEsIG1zZy0+ZGF0YV9sZW4sIDApOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFQUdBSU4pCisJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJyZWN2IGVycm9yICAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChyZXQgPT0gMCkgeworCQlERUJVR1AoRElOUCwgIlVEUCBwZWVyIGRpc2FwcGVhcmVkLCBkZWFkIHNvY2tldFxuIik7CisJCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJCWNsb3NlKGJmZC0+ZmQpOworCQliZmQtPmZkID0gLTE7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKHJldCA8IHNpemVvZigqaGgpKSB7CisJCURFQlVHUChESU5QLCAiY291bGQgbm90IGV2ZW4gcmVhZCBoZWFkZXIhPyFcbiIpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW1zZ2JfcHV0KG1zZywgcmV0KTsKKwltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIHNpemVvZigqaGgpOworCURFQlVHUChETUksICJVRFAgUlg6ICVzXG4iLCBoZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKworCWlmIChoaC0+bGVuICE9IG1zZy0+bGVuIC0gc2l6ZW9mKCpoaCkpIHsKKwkJREVCVUdQKERJTlAsICJsZW5ndGggKCV1LyV1KSBkaXNhZ3JlZXMgd2l0aCBoZWFkZXIoJXUpXG4iLAorCQkJbXNnLT5sZW4sIG1zZy0+bGVuIC0gMywgaGgtPmxlbik7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2ggKGJmZC0+cHJpdl9uciAmIDB4ZmYpIHsKKwljYXNlIFVEUF9UT19CVFM6CisJCS8qIGluamVjdGlvbiB0b3dhcmRzIEJUUyAqLworCQlzd2l0Y2ggKGhoLT5wcm90bykgeworCQljYXNlIElQQUNfUFJPVE9fUlNMOgorCQkJLyogRklYTUU6IHdoYXQgdG8gZG8gYWJvdXQgVFJYID4gMCAqLworCQkJb3RoZXJfY29ubiA9IGlwYmMtPnJzbF9jb25uWzBdOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlERUJVR1AoRElOUCwgIlVua25vd24gcHJvdG9jb2wgMHglMDJ4LCBzZW5kaW5nIHRvICIKKwkJCQkiT01MIEZEXG4iLCBoaC0+cHJvdG8pOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgSVBBQ19QUk9UT19JUEFDQ0VTUzoKKwkJY2FzZSBJUEFDX1BST1RPX09NTDoKKwkJCW90aGVyX2Nvbm4gPSBpcGJjLT5vbWxfY29ubjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgVURQX1RPX0JTQzoKKwkJLyogaW5qZWN0aW9uIHRvd2FyZHMgQlNDICovCisJCXN3aXRjaCAoaGgtPnByb3RvKSB7CisJCWNhc2UgSVBBQ19QUk9UT19SU0w6CisJCQkvKiBGSVhNRTogd2hhdCB0byBkbyBhYm91dCBUUlggPiAwICovCisJCQlvdGhlcl9jb25uID0gaXBiYy0+YnNjX3JzbF9jb25uWzBdOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlERUJVR1AoRElOUCwgIlVua25vd24gcHJvdG9jb2wgMHglMDJ4LCBzZW5kaW5nIHRvICIKKwkJCQkiT01MIEZEXG4iLCBoaC0+cHJvdG8pOworCQljYXNlIElQQUNfUFJPVE9fSVBBQ0NFU1M6CisJCWNhc2UgSVBBQ19QUk9UT19PTUw6CisJCQlvdGhlcl9jb25uID0gaXBiYy0+YnNjX29tbF9jb25uOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERJTlAsICJVbmtub3duIGZpbGVkZXNjcmlwdG9yIHByaXZfbnI9JTA0eFxuIiwgYmZkLT5wcml2X25yKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKG90aGVyX2Nvbm4pIHsKKwkJLyogZW5xdWV1ZSB0aGUgbWVzc2FnZSBmb3IgVFggb24gdGhlIHJlc3BlY3RpdmUgRkQgKi8KKwkJbXNnYl9lbnF1ZXVlKCZvdGhlcl9jb25uLT50eF9xdWV1ZSwgbXNnKTsKKwkJb3RoZXJfY29ubi0+ZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisJfSBlbHNlCisJCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3VkcF93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJLyogbm90IGltcGxlbWVudGVkIHlldCAqLworCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCisJcmV0dXJuIC1FSU87Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gc2VsZWN0LmMgaW4gY2FzZSBvbmUgb2YgdGhlIGZkJ3MgY2FuIGJlIHJlYWQvd3JpdHRlbiAqLworc3RhdGljIGludCB1ZHBfZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJcmMgPSBoYW5kbGVfdWRwX3JlYWQoYmZkKTsKKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJcmMgPSBoYW5kbGVfdWRwX3dyaXRlKGJmZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBpcGJjX2FsbG9jX2Nvbm5lY3Qoc3RydWN0IGlwYV9wcm94eV9jb25uICppcGMsIHN0cnVjdCBic2NfZmQgKmJmZCwKKwkJCSAgICAgIHVfaW50MTZfdCBzaXRlX2lkLCB1X2ludDE2X3QgYnRzX2lkLAorCQkJICAgICAgdV9pbnQxNl90IHRyeF9pZCwgc3RydWN0IHRsdl9wYXJzZWQgKnRsdnAsCisJCQkgICAgICBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmM7CisJdV9pbnQxNl90IHVkcF9wb3J0OworCWludCByZXQgPSAwOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisKKwltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlpbmV0X2F0b24oYnNjX2lwYWRkciwgJnNpbi5zaW5fYWRkcik7CisKKwlERUJVR1AoRElOUCwgIigldS8ldS8ldSkgTmV3IEJUUyBjb25uZWN0aW9uOiAiLAorCQlzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCk7CisKKwkvKiBPTUwgbmVlZHMgdG8gYmUgZXN0YWJsaXNoZWQgYmVmb3JlIFJTTCAqLworCWlmICgoYmZkLT5wcml2X25yICYgMHhmZikgIT0gT01MX0ZST01fQlRTKSB7CisJCURFQlVHUEMoRElOUCwgIk5vdCBhIE9NTCBjb25uZWN0aW9uID8hP1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGFsbG9jYXRlIG5ldyBCVFMgY29ubmVjdGlvbiBkYXRhIHN0cnVjdHVyZSAqLworCWlwYmMgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBpcGFfYnRzX2Nvbm4pOworCWlmICghaXBiYykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJREVCVUdQQyhESU5QLCAiQ3JlYXRlZCBCVFMgQ29ubiBkYXRhIHN0cnVjdHVyZVxuIik7CisJaXBiYy0+aXBwID0gaXBwOworCWlwYmMtPnVuaXRfaWQuc2l0ZV9pZCA9IHNpdGVfaWQ7CisJaXBiYy0+dW5pdF9pZC5idHNfaWQgPSBidHNfaWQ7CisJaXBiYy0+b21sX2Nvbm4gPSBpcGM7CisJaXBjLT5idHNfY29ubiA9IGlwYmM7CisKKwkvKiBzdG9yZSB0aGUgY29udGVudCBvZiB0aGUgSUQgVEFHUyBmb3IgbGF0ZXIgcmVmZXJlbmNlICovCisJc3RvcmVfaWR0YWdzKGlwYmMsIHRsdnApOworCWlwYmMtPmlkX3Jlc3BfbGVuID0gbXNnLT5sZW47CisJaXBiYy0+aWRfcmVzcCA9IHRhbGxvY19zaXplKHRhbGxfYnNjX2N0eCwgaXBiYy0+aWRfcmVzcF9sZW4pOworCW1lbWNweShpcGJjLT5pZF9yZXNwLCBtc2ctPmRhdGEsIGlwYmMtPmlkX3Jlc3BfbGVuKTsKKworCS8qIENyZWF0ZSBPTUwgVENQIGNvbm5lY3Rpb24gdG93YXJkcyBCU0MgKi8KKwlzaW4uc2luX3BvcnQgPSBodG9ucyhJUEFfVENQX1BPUlRfT01MKTsKKwlpcGJjLT5ic2Nfb21sX2Nvbm4gPSBjb25uZWN0X2JzYygmc2luLCBPTUxfVE9fQlNDLCBpcGJjKTsKKwlpZiAoIWlwYmMtPmJzY19vbWxfY29ubikgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9ic2NfY29ubjsKKwl9CisKKwlERUJVR1AoRElOUCwgIigldS8ldS8ldSkgT01MIENvbm5lY3RlZCB0byBCU0NcbiIsCisJCXNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkKTsKKworCS8qIENyZWF0ZSBVRFAgc29ja2V0IGZvciBCVFMgcGFja2V0IGluamVjdGlvbiAqLworCXVkcF9wb3J0ID0gMTAwMDAgKyAoc2l0ZV9pZCAlIDEwMDApKjEwMCArIChidHNfaWQgJSAxMDApOworCXJldCA9IG1ha2Vfc29jaygmaXBiYy0+dWRwX2J0c19mZCwgdWRwX3BvcnQsIElQUFJPVE9fVURQLAorCQkJVURQX1RPX0JUUywgdWRwX2ZkX2NiLCBpcGJjKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfdWRwX2J0czsKKwlERUJVR1AoRElOUCwgIigldS8ldS8ldSkgQ3JlYXRlZCBVRFAgc29ja2V0IGZvciBpbmplY3Rpb24gIgorCQkidG93YXJkcyBCVFMgYXQgcG9ydCAldVxuIiwgc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQsIHVkcF9wb3J0KTsKKworCS8qIENyZWF0ZSBVRFAgc29ja2V0IGZvciBCU0MgcGFja2V0IGluamVjdGlvbiAqLworCXVkcF9wb3J0ID0gMjAwMDAgKyAoc2l0ZV9pZCAlIDEwMDApKjEwMCArIChidHNfaWQgJSAxMDApOworCXJldCA9IG1ha2Vfc29jaygmaXBiYy0+dWRwX2JzY19mZCwgdWRwX3BvcnQsIElQUFJPVE9fVURQLAorCQkJVURQX1RPX0JTQywgdWRwX2ZkX2NiLCBpcGJjKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfdWRwX2JzYzsKKwlERUJVR1AoRElOUCwgIigldS8ldS8ldSkgQ3JlYXRlZCBVRFAgc29ja2V0IGZvciBpbmplY3Rpb24gIgorCQkidG93YXJkcyBCU0MgYXQgcG9ydCAldVxuIiwgc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQsIHVkcF9wb3J0KTsKKwlsbGlzdF9hZGQoJmlwYmMtPmxpc3QsICZpcHAtPmJ0c19saXN0KTsKKworCXJldHVybiAwOworCitlcnJfdWRwX2JzYzoKKwlic2NfdW5yZWdpc3Rlcl9mZCgmaXBiYy0+dWRwX2J0c19mZCk7CitlcnJfdWRwX2J0czoKKwlic2NfdW5yZWdpc3Rlcl9mZCgmaXBiYy0+YnNjX29tbF9jb25uLT5mZCk7CisJY2xvc2UoaXBiYy0+YnNjX29tbF9jb25uLT5mZC5mZCk7CisJdGFsbG9jX2ZyZWUoaXBiYy0+YnNjX29tbF9jb25uKTsKKwlpcGJjLT5ic2Nfb21sX2Nvbm4gPSBOVUxMOworZXJyX2JzY19jb25uOgorCXRhbGxvY19mcmVlKGlwYmMtPmlkX3Jlc3ApOworCXRhbGxvY19mcmVlKGlwYmMpOworI2lmIDAKKwlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCWNsb3NlKGJmZC0+ZmQpOworCXRhbGxvY19mcmVlKGJmZCk7CisjZW5kaWYKK2Vycl9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpcGFjY2Vzc19yY3Ztc2coc3RydWN0IGlwYV9wcm94eV9jb25uICppcGMsIHN0cnVjdCBtc2diICptc2csCisJCQkgICBzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IHRsdl9wYXJzZWQgdGx2cDsKKwl1X2ludDhfdCBtc2dfdHlwZSA9ICoobXNnLT5sMmgpOworCXVfaW50MTZfdCBzaXRlX2lkLCBidHNfaWQsIHRyeF9pZDsKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgSVBBQ19NU0dUX1BJTkc6CisJCXJldCA9IHdyaXRlKGJmZC0+ZmQsIHBvbmcsIHNpemVvZihwb25nKSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJldCA8IHNpemVvZihwb25nKSkgeworCQkJREVCVUdQKERJTlAsICJzaG9ydCB3cml0ZVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlicmVhazsKKwljYXNlIElQQUNfTVNHVF9QT05HOgorCQlERUJVR1AoRE1JLCAiUE9ORyFcbiIpOworCQlicmVhazsKKwljYXNlIElQQUNfTVNHVF9JRF9SRVNQOgorCQlERUJVR1AoRE1JLCAiSURfUkVTUCAiKTsKKwkJLyogcGFyc2UgdGFncywgc2VhcmNoIGZvciBVbml0IElEICovCisJCWlwYWNfaWR0YWdfcGFyc2UoJnRsdnAsICh1X2ludDhfdCAqKW1zZy0+bDJoICsgMiwKKwkJCQkgbXNnYl9sMmxlbihtc2cpLTIpOworCQlERUJVR1AoRE1JLCAiXG4iKTsKKworCQlpZiAoIVRMVlBfUFJFU0VOVCgmdGx2cCwgSVBBQ19JRFRBR19VTklUKSkgeworCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiTm8gVW5pdCBJRCBpbiBJRCBSRVNQT05TRSAhPyFcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQkvKiBsb29rdXAgQlRTLCBjcmVhdGUgc2lnbl9saW5rLCAuLi4gKi8KKwkJc2l0ZV9pZCA9IGJ0c19pZCA9IHRyeF9pZCA9IDA7CisJCXBhcnNlX3VuaXRpZCgoY2hhciAqKVRMVlBfVkFMKCZ0bHZwLCBJUEFDX0lEVEFHX1VOSVQpLAorCQkJICAgICAmc2l0ZV9pZCwgJmJ0c19pZCwgJnRyeF9pZCk7CisJCWlwYmMgPSBmaW5kX2J0c19ieV91bml0aWQoaXBwLCBzaXRlX2lkLCBidHNfaWQpOworCQlpZiAoIWlwYmMpIHsKKwkJCS8qIFdlIGhhdmUgbm90IGZvdW5kIGFuIGlwYmMgKHBlci1idHMgcHJveHkgaW5zdGFuY2UpCisJCQkgKiBmb3IgdGhpcyBCVFMgeWV0LiAgVGhlIGZpcnN0IGNvbm5lY3Rpb24gb2YgYSBuZXcgQlRTIG11c3QKKwkJCSAqIGJlIGEgT01MIGNvbm5lY3Rpb24uICBXZSBhbGxvY2F0ZSB0aGUgYXNzb2NpYXRlZCBkYXRhIHN0cnVjdHVyZXMsCisJCQkgKiBhbmQgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBlbmQgKi8KKworCQkJcmV0dXJuIGlwYmNfYWxsb2NfY29ubmVjdChpcGMsIGJmZCwgc2l0ZV9pZCwgYnRzX2lkLAorCQkJCQkJICB0cnhfaWQsICZ0bHZwLCBtc2cpOworCQkJLyogaWYgdGhpcyBmYWlscywgdGhlIGNhbGxlciB3aWxsIGNsZWFuIHVwIGJmZCAqLworCQl9IGVsc2UgeworCQkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwkJCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisJCQlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQlpbmV0X2F0b24oYnNjX2lwYWRkciwgJnNpbi5zaW5fYWRkcik7CisKKwkJCURFQlVHUChESU5QLCAiSWRlbnRpZmllZCBCVFMgJXUvJXUvJXVcbiIsCisJCQkJc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQpOworCisJCQlpZiAoKGJmZC0+cHJpdl9uciAmIDB4ZmYpICE9IFJTTF9GUk9NX0JUUykgeworCQkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIlNlY29uZCBPTUwgY29ubmVjdGlvbiBmcm9tICIKKwkJCQkgICAgICJzYW1lIEJUUyA/IT9cbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpZiAodHJ4X2lkID4gTUFYX1RSWCkgeworCQkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIldlIGRvbid0IHN1cHBvcnQgbW9yZSAiCisJCQkJICAgICAidGhhbiAldSBUUlhcbiIsIE1BWF9UUlgpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlpcGMtPmJ0c19jb25uID0gaXBiYzsKKwkJCS8qIHN0b3JlIFRSWCBudW1iZXIgaW4gaGlnaGVyIDggYml0IG9mIHRoZSBiZmQgcHJpdmF0ZSBudW1iZXIgKi8KKwkJCWJmZC0+cHJpdl9uciB8PSB0cnhfaWQgPDwgODsKKwkJCWlwYmMtPnJzbF9jb25uW3RyeF9pZF0gPSBpcGM7CisKKwkJCS8qIENyZWF0ZSBSU0wgVENQIGNvbm5lY3Rpb24gdG93YXJkcyBCU0MgKi8KKwkJCXNpbi5zaW5fcG9ydCA9IGh0b25zKElQQV9UQ1BfUE9SVF9SU0wpOworCQkJaXBiYy0+YnNjX3JzbF9jb25uW3RyeF9pZF0gPQorCQkJCWNvbm5lY3RfYnNjKCZzaW4sIFJTTF9UT19CU0MgfCAodHJ4X2lkIDw8IDgpLCBpcGJjKTsKKwkJCWlmICghaXBiYy0+YnNjX29tbF9jb25uKQorCQkJCXJldHVybiAtRUlPOworCQkJREVCVUdQKERJTlAsICIoJXUvJXUvJXUpIENvbm5lY3RlZCBSU0wgdG8gQlNDXG4iLAorCQkJCXNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElQQUNfTVNHVF9JRF9HRVQ6CisJCURFQlVHUChETUksICJJRF9HRVRcbiIpOworCQlpZiAoKGJmZC0+cHJpdl9uciAmIDB4ZmYpICE9IE9NTF9UT19CU0MgJiYKKwkJICAgIChiZmQtPnByaXZfbnIgJiAweGZmKSAhPSBSU0xfVE9fQlNDKSB7CisJCQlERUJVR1AoRElOUCwgIklEZW50aXR5IFJFUXVlc3QgZnJvbSBCVFMgPyE/XG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlwYmMgPSBpcGMtPmJ0c19jb25uOworCQlpZiAoIWlwYmMpIHsKKwkJCURFQlVHUChESU5QLCAiSURfR0VUIGZyb20gQlNDIGJlZm9yZSB3ZSBoYXZlIElEX1JFU1AgZnJvbSBCVFNcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJcmV0ID0gd3JpdGUoYmZkLT5mZCwgaXBiYy0+aWRfcmVzcCwgaXBiYy0+aWRfcmVzcF9sZW4pOworCQlicmVhazsKKwljYXNlIElQQUNfTVNHVF9JRF9BQ0s6CisJCURFQlVHUChETUksICJJRF9BQ0s/IC0+IEFDSyFcbiIpOworCQlyZXQgPSB3cml0ZShiZmQtPmZkLCBpZF9hY2ssIHNpemVvZihpZF9hY2spKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgbXNnYiAqaXBhY2Nlc3NfcmVhZF9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFBST1hZX0FMTE9DX1NJWkUsICJBYmlzL0lQIik7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCWludCBsZW4sIHJldCA9IDA7CisKKwlpZiAoIW1zZykgeworCQkqZXJyb3IgPSAtRU5PTUVNOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBmaXJzdCByZWFkIG91ciAzLWJ5dGUgaGVhZGVyICovCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnLT5kYXRhOworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5kYXRhLCAzLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAoZXJybm8gIT0gRUFHQUlOKQorCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAicmVjdiBlcnJvcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IHJldDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbXNnYl9wdXQobXNnLCByZXQpOworCisJLyogdGhlbiByZWFkIHRlIGxlbmd0aCBhcyBzcGVjaWZpZWQgaW4gaGVhZGVyICovCisJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBzaXplb2YoKmhoKTsKKwlsZW4gPSBudG9ocyhoaC0+bGVuKTsKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+bDJoLCBsZW4sIDApOworCWlmIChyZXQgPCBsZW4pIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAic2hvcnQgcmVhZCFcbiIpOworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gLUVJTzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCXJldHVybiBtc2c7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwY19ieV9wcml2X25yKHN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHByaXZfbnIpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICpic2NfY29ubjsKKwl1bnNpZ25lZCBpbnQgdHJ4X2lkID0gcHJpdl9uciA+PiA4OworCisJc3dpdGNoIChwcml2X25yICYgMHhmZikgeworCWNhc2UgT01MX0ZST01fQlRTOiAvKiBpbmNvbWluZyBPTUwgZGF0YSBmcm9tIEJUUywgZm9yd2FyZCB0byBCU0MgT01MICovCisJCWJzY19jb25uID0gaXBiYy0+YnNjX29tbF9jb25uOworCQlicmVhazsKKwljYXNlIFJTTF9GUk9NX0JUUzogLyogaW5jb21pbmcgUlNMIGRhdGEgZnJvbSBCVFMsIGZvcndhcmQgdG8gQlNDIFJTTCAqLworCQlic2NfY29ubiA9IGlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdOworCQlicmVhazsKKwljYXNlIE9NTF9UT19CU0M6IC8qIGluY29taW5nIE9NTCBkYXRhIGZyb20gQlNDLCBmb3J3YXJkIHRvIEJUUyBPTUwgKi8KKwkJYnNjX2Nvbm4gPSBpcGJjLT5vbWxfY29ubjsKKwkJYnJlYWs7CisJY2FzZSBSU0xfVE9fQlNDOiAvKiBpbmNvbWluZyBSU0wgZGF0YSBmcm9tIEJTQywgZm9yd2FyZCB0byBCVFMgUlNMICovCisJCWJzY19jb25uID0gaXBiYy0+cnNsX2Nvbm5bdHJ4X2lkXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnNjX2Nvbm4gPSBOVUxMOworCQlicmVhazsKKwl9CisJcmV0dXJuIGJzY19jb25uOworfQorCitzdGF0aWMgdm9pZCByZWNvbm5fdG1yX2NiKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlwYV9wcm94eSAqaXBwID0gZGF0YTsKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJaW50IGk7CisKKwlERUJVR1AoRElOUCwgIlJ1bm5pbmcgcmVjb25uZWN0IHRpbWVyXG4iKTsKKworCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWluZXRfYXRvbihic2NfaXBhZGRyLCAmc2luLnNpbl9hZGRyKTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGlwYmMsICZpcHAtPmJ0c19saXN0LCBsaXN0KSB7CisJCS8qIGlmIE9NTCB0byBCU0MgaXMgZGVhZCwgdHJ5IHRvIHJlc3RvcmUgaXQgKi8KKwkJaWYgKGlwYmMtPm9tbF9jb25uICYmICFpcGJjLT5ic2Nfb21sX2Nvbm4pIHsKKwkJCXNpbi5zaW5fcG9ydCA9IGh0b25zKElQQV9UQ1BfUE9SVF9PTUwpOworCQkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgMCk7CisJCQlMT0dQQyhESU5QLCBMT0dMX05PVElDRSwgIk9NTCBUcnlpbmcgdG8gcmVjb25uZWN0XG4iKTsKKwkJCWlwYmMtPmJzY19vbWxfY29ubiA9IGNvbm5lY3RfYnNjKCZzaW4sIE9NTF9UT19CU0MsIGlwYmMpOworCQkJaWYgKCFpcGJjLT5ic2Nfb21sX2Nvbm4pCisJCQkJZ290byByZXNjaGVkdWxlOworCQkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgMCk7CisJCQlMT0dQQyhESU5QLCBMT0dMX05PVElDRSwgIk9NTCBSZWNvbm5lY3RlZFxuIik7CisJCX0KKwkJLyogaWYgd2UgKHN0aWxsKSBkb24ndCBoYXZlIGEgT01MIGNvbm5lY3Rpb24sIHNraXAgUlNMICovCisJCWlmICghaXBiYy0+b21sX2Nvbm4gfHwgIWlwYmMtPmJzY19vbWxfY29ubikKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlwYmMtPnJzbF9jb25uKTsgaSsrKSB7CisJCQl1bnNpZ25lZCBpbnQgcHJpdl9ucjsKKwkJCS8qIGRvbid0IGVzdGFibGlzaCBSU0wgbGlua3Mgd2hpY2ggd2UgZG9uJ3QgaGF2ZSAqLworCQkJaWYgKCFpcGJjLT5yc2xfY29ubltpXSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChpcGJjLT5ic2NfcnNsX2Nvbm5baV0pCisJCQkJY29udGludWU7CisJCQlwcml2X25yID0gaXBiYy0+cnNsX2Nvbm5baV0tPmZkLnByaXZfbnI7CisJCQlwcml2X25yICY9IH4weGZmOworCQkJcHJpdl9uciB8PSBSU0xfVE9fQlNDOworCQkJc2luLnNpbl9wb3J0ID0gaHRvbnMoSVBBX1RDUF9QT1JUX1JTTCk7CisJCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCBwcml2X25yID4+IDgpOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICJSU0wgVHJ5aW5nIHRvIHJlY29ubmVjdFxuIik7CisJCQlpcGJjLT5ic2NfcnNsX2Nvbm5baV0gPSBjb25uZWN0X2JzYygmc2luLCBwcml2X25yLCBpcGJjKTsKKwkJCWlmICghaXBiYy0+YnNjX3JzbF9jb25uKQorCQkJCWdvdG8gcmVzY2hlZHVsZTsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIHByaXZfbnIgPj4gOCk7CisJCQlMT0dQQyhESU5QLCBMT0dMX05PVElDRSwgIlJTTCBSZWNvbm5lY3RlZFxuIik7CisJCX0KKwl9CisJcmV0dXJuOworCityZXNjaGVkdWxlOgorCWJzY19zY2hlZHVsZV90aW1lcigmaXBwLT5yZWNvbm5fdGltZXIsIDUsIDApOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfZGVhZF9zb2NrZXQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjID0gYmZkLT5kYXRhOwkJLyogbG9jYWwgY29ubiAqLworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqYnNjX2Nvbm47CQkvKiByZW1vdGUgY29ubiAqLworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMgPSBpcGMtPmJ0c19jb25uOworCXVuc2lnbmVkIGludCB0cnhfaWQgPSBiZmQtPnByaXZfbnIgPj4gODsKKwlzdHJ1Y3QgbXNnYiAqbXNnLCAqbXNnMjsKKworCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJY2xvc2UoYmZkLT5mZCk7CisJYmZkLT5mZCA9IC0xOworCisJLyogRklYTUU6IGNsZWFyIHR4X3F1ZXVlLCByZW1vdmUgYWxsIHJlZmVyZW5jZXMsIGV0Yy4gKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgJmlwYy0+dHhfcXVldWUsIGxpc3QpCisJCW1zZ2JfZnJlZShtc2cpOworCisJc3dpdGNoIChiZmQtPnByaXZfbnIgJiAweGZmKSB7CisJY2FzZSBPTUxfRlJPTV9CVFM6IC8qIGluY29taW5nIE9NTCBkYXRhIGZyb20gQlRTLCBmb3J3YXJkIHRvIEJTQyBPTUwgKi8KKwkJaXBiYy0+b21sX2Nvbm4gPSBOVUxMOworCQlic2NfY29ubiA9IGlwYmMtPmJzY19vbWxfY29ubjsKKwkJLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEJTQyAqLworCQlic2NfdW5yZWdpc3Rlcl9mZCgmYnNjX2Nvbm4tPmZkKTsKKwkJY2xvc2UoYnNjX2Nvbm4tPmZkLmZkKTsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIG1zZzIsICZic2NfY29ubi0+dHhfcXVldWUsIGxpc3QpCisJCQltc2diX2ZyZWUobXNnKTsKKwkJdGFsbG9jX2ZyZWUoYnNjX2Nvbm4pOworCQlpcGJjLT5ic2Nfb21sX2Nvbm4gPSBOVUxMOworCQkvKiBGSVhNRTogZG8gd2UgbmVlZCB0byBkZWxldGUgdGhlIGVudGlyZSBpcGJjID8gKi8KKwkJYnJlYWs7CisJY2FzZSBSU0xfRlJPTV9CVFM6IC8qIGluY29taW5nIFJTTCBkYXRhIGZyb20gQlRTLCBmb3J3YXJkIHRvIEJTQyBSU0wgKi8KKwkJaXBiYy0+cnNsX2Nvbm5bdHJ4X2lkXSA9IE5VTEw7CisJCWJzY19jb25uID0gaXBiYy0+YnNjX3JzbF9jb25uW3RyeF9pZF07CisJCS8qIGNsb3NlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBCU0MgKi8KKwkJYnNjX3VucmVnaXN0ZXJfZmQoJmJzY19jb25uLT5mZCk7CisJCWNsb3NlKGJzY19jb25uLT5mZC5mZCk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCBtc2cyLCAmYnNjX2Nvbm4tPnR4X3F1ZXVlLCBsaXN0KQorCQkJbXNnYl9mcmVlKG1zZyk7CisJCXRhbGxvY19mcmVlKGJzY19jb25uKTsKKwkJaXBiYy0+YnNjX3JzbF9jb25uW3RyeF9pZF0gPSBOVUxMOworCQlicmVhazsKKwljYXNlIE9NTF9UT19CU0M6IC8qIGluY29taW5nIE9NTCBkYXRhIGZyb20gQlNDLCBmb3J3YXJkIHRvIEJUUyBPTUwgKi8KKwkJaXBiYy0+YnNjX29tbF9jb25uID0gTlVMTDsKKwkJYnNjX2Nvbm4gPSBpcGJjLT5vbWxfY29ubjsKKwkJLyogc3RhcnQgcmVjb25uZWN0IHRpbWVyICovCisJCWJzY19zY2hlZHVsZV90aW1lcigmaXBwLT5yZWNvbm5fdGltZXIsIDUsIDApOworCQlicmVhazsKKwljYXNlIFJTTF9UT19CU0M6IC8qIGluY29taW5nIFJTTCBkYXRhIGZyb20gQlNDLCBmb3J3YXJkIHRvIEJUUyBSU0wgKi8KKwkJaXBiYy0+YnNjX3JzbF9jb25uW3RyeF9pZF0gPSBOVUxMOworCQlic2NfY29ubiA9IGlwYmMtPnJzbF9jb25uW3RyeF9pZF07CisJCS8qIHN0YXJ0IHJlY29ubmVjdCB0aW1lciAqLworCQlic2Nfc2NoZWR1bGVfdGltZXIoJmlwcC0+cmVjb25uX3RpbWVyLCA1LCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnNjX2Nvbm4gPSBOVUxMOworCQlicmVhazsKKwl9CisKKwl0YWxsb2NfZnJlZShpcGMpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90Y3BfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGMgPSBiZmQtPmRhdGE7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYyA9IGlwYy0+YnRzX2Nvbm47CisJc3RydWN0IGlwYV9wcm94eV9jb25uICpic2NfY29ubjsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBpcGFjY2Vzc19oZWFkICpoaDsKKwlpbnQgcmV0ID0gMDsKKwljaGFyICpidHNic2M7CisKKwlpZiAoKGJmZC0+cHJpdl9uciAmIDB4ZmYpIDw9IDIpCisJCWJ0c2JzYyA9ICJCVFMiOworCWVsc2UKKwkJYnRzYnNjID0gIkJTQyI7CisKKwltc2cgPSBpcGFjY2Vzc19yZWFkX21zZyhiZmQsICZyZXQpOworCWlmICghbXNnKSB7CisJCWlmIChyZXQgPT0gMCkgeworCQkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgYmZkLT5wcml2X25yID4+IDgpOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICIlcyBkaXNhcHBlYXJlZCwgIgorCQkJICAgICAiZGVhZCBzb2NrZXRcbiIsIGJ0c2JzYyk7CisJCQloYW5kbGVfZGVhZF9zb2NrZXQoYmZkKTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKwlsb2dwX2lwYmNfdWlkKERNSSwgTE9HTF9ERUJVRywgaXBiYywgYmZkLT5wcml2X25yID4+IDgpOworCURFQlVHUEMoRE1JLCAiUlg8LSVzOiAlc1xuIiwgYnRzYnNjLCBoZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZy0+ZGF0YTsKKwlpZiAoaGgtPnByb3RvID09IElQQUNfUFJPVE9fSVBBQ0NFU1MpIHsKKwkJcmV0ID0gaXBhY2Nlc3NfcmN2bXNnKGlwYywgbXNnLCBiZmQpOworCQlpZiAocmV0IDwgMCkgeworCQkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJCWNsb3NlKGJmZC0+ZmQpOworCQkJYmZkLT5mZCA9IC0xOworCQkJdGFsbG9jX2ZyZWUoYmZkKTsKKwkJfQorCQkvKiB3ZSBkbyBub3QgZm9yd2FyZCB0aGUgQ0NNIHByb3RvY29sIHRocm91Z2ggdGhlCisJCSAqIHByb3h5IGJ1dCByYXRoZXIgdGVybWluYXRlIGl0IG91cnNlbHZlcyAqLworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWlwYmMpIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLAorCQkgICAgICJyZWNlaXZlZCAlcyBwYWNrZXQgYnV0IG5vIGlwYy0+YnRzX2Nvbm4/IT9cbiIsIGJ0c2JzYyk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlic2NfY29ubiA9IGlwY19ieV9wcml2X25yKGlwYmMsIGJmZC0+cHJpdl9ucik7CisJaWYgKGJzY19jb25uKSB7CisJCS8qIGVucXVldWUgcGFja2V0IHRvd2FyZHMgQlNDICovCisJCW1zZ2JfZW5xdWV1ZSgmYnNjX2Nvbm4tPnR4X3F1ZXVlLCBtc2cpOworCQkvKiBtYXJrIHJlc3BlY3RpdmUgZmlsZWRlc2NyaXB0b3IgYXMgJ3dlIHdhbnQgdG8gd3JpdGUnICovCisJCWJzY19jb25uLT5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKwl9IGVsc2UgeworCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfSU5GTywgaXBiYywgYmZkLT5wcml2X25yID4+IDgpOworCQlMT0dQQyhESU5QLCBMT0dMX0lORk8sICJEcm9wcGluZyBwYWNrZXQgZnJvbSAlcywgIgorCQkgICAgICJzaW5jZSByZW1vdGUgY29ubmVjdGlvbiBpcyBkZWFkXG4iLCBidHNic2MpOworCQltc2diX2ZyZWUobXNnKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBhIFRDUCBzb2NrZXQgaXMgcmVhZHkgdG8gYmUgd3JpdHRlbiB0byAqLworc3RhdGljIGludCBoYW5kbGVfdGNwX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYyA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjID0gaXBjLT5idHNfY29ubjsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqbGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwljaGFyICpidHNic2M7CisJaW50IHJldDsKKworCWlmICgoYmZkLT5wcml2X25yICYgMHhmZikgPD0gMikKKwkJYnRzYnNjID0gIkJUUyI7CisJZWxzZQorCQlidHNic2MgPSAiQlNDIjsKKworCisJLyogZ2V0IHRoZSBuZXh0IG1zZyBmb3IgdGhpcyB0aW1lc2xvdCAqLworCWlmIChsbGlzdF9lbXB0eSgmaXBjLT50eF9xdWV1ZSkpIHsKKwkJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisJCXJldHVybiAwOworCX0KKwlsaCA9IGlwYy0+dHhfcXVldWUubmV4dDsKKwlsbGlzdF9kZWwobGgpOworCW1zZyA9IGxsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgbXNnYiwgbGlzdCk7CisKKwlsb2dwX2lwYmNfdWlkKERNSSwgTE9HTF9ERUJVRywgaXBiYywgYmZkLT5wcml2X25yID4+IDgpOworCURFQlVHUEMoRE1JLCAiVFggJTA0eDogJXNcbiIsIGJmZC0+cHJpdl9uciwKKwkJaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisKKwlyZXQgPSBzZW5kKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4sIDApOworCW1zZ2JfZnJlZShtc2cpOworCisJaWYgKHJldCA9PSAwKSB7CisJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwkJTE9HUChESU5QLCBMT0dMX05PVElDRSwgIiVzIGRpc2FwcGVhcmVkLCBkZWFkIHNvY2tldFxuIiwgYnRzYnNjKTsKKwkJaGFuZGxlX2RlYWRfc29ja2V0KGJmZCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogY2FsbGJhY2sgZnJvbSBzZWxlY3QuYyBpbiBjYXNlIG9uZSBvZiB0aGUgZmQncyBjYW4gYmUgcmVhZC93cml0dGVuICovCitzdGF0aWMgaW50IGlwYWNjZXNzX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJjID0gMDsKKworCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpIHsKKwkJcmMgPSBoYW5kbGVfdGNwX3JlYWQoYmZkKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9CisJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCXJjID0gaGFuZGxlX3RjcF93cml0ZShiZmQpOworCisJcmV0dXJuIHJjOworfQorCisvKiBjYWxsYmFjayBvZiB0aGUgbGlzdGVuaW5nIGZpbGVkZXNjcmlwdG9yICovCitzdGF0aWMgaW50IGxpc3Rlbl9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpsaXN0ZW5fYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjOworCXN0cnVjdCBic2NfZmQgKmJmZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJc29ja2xlbl90IHNhX2xlbiA9IHNpemVvZihzYSk7CisKKwlpZiAoISh3aGF0ICYgQlNDX0ZEX1JFQUQpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGFjY2VwdChsaXN0ZW5fYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2EsICZzYV9sZW4pOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigiYWNjZXB0Iik7CisJCXJldHVybiByZXQ7CisJfQorCURFQlVHUChESU5QLCAiYWNjZXB0KCllZCBuZXcgJXMgbGluayBmcm9tICVzXG4iLAorCQkobGlzdGVuX2JmZC0+cHJpdl9uciAmIDB4ZmYpID09IE9NTF9GUk9NX0JUUyA/ICJPTUwiIDogIlJTTCIsCisJCWluZXRfbnRvYShzYS5zaW5fYWRkcikpOworCisJaXBjID0gYWxsb2NfY29ubigpOworCWlmICghaXBjKSB7CisJCWNsb3NlKHJldCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJmZCA9ICZpcGMtPmZkOworCWJmZC0+ZmQgPSByZXQ7CisJYmZkLT5kYXRhID0gaXBjOworCWJmZC0+cHJpdl9uciA9IGxpc3Rlbl9iZmQtPnByaXZfbnI7CisJYmZkLT5jYiA9IGlwYWNjZXNzX2ZkX2NiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCByZWdpc3RlciBGRFxuIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShpcGMpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFJlcXVlc3QgSUQuIEZJWE1FOiByZXF1ZXN0IExPQ0FUSU9OLCBIVy9TVyBWRXJzaW9uLCBVbml0IE5hbWUsIFNlcm5vICovCisJcmV0ID0gd3JpdGUoYmZkLT5mZCwgaWRfcmVxLCBzaXplb2YoaWRfcmVxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWtlX2xpc3Rlbl9zb2NrKHN0cnVjdCBic2NfZmQgKmJmZCwgdV9pbnQxNl90IHBvcnQsIGludCBwcml2X25yLAorCQkgICAgIGludCAoKmNiKShzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCByZXQsIG9uID0gMTsKKworCWJmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKwliZmQtPmNiID0gY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJYmZkLT5wcml2X25yID0gcHJpdl9ucjsKKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlpZiAoIWxpc3Rlbl9pcGFkZHIpCisJCWFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKwllbHNlCisJCWluZXRfYXRvbihsaXN0ZW5faXBhZGRyLCAmYWRkci5zaW5fYWRkcik7CisKKwlzZXRzb2Nrb3B0KGJmZC0+ZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKworCXJldCA9IGJpbmQoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgYmluZCBsaXN0ZW4gc29ja2V0ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gbGlzdGVuKGJmZC0+ZmQsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigibGlzdGVuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJyZWdpc3Rlcl9saXN0ZW5fZmQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEFjdGl2ZWx5IGNvbm5lY3QgdG8gYSBCU0MuICAqLworc3RhdGljIHN0cnVjdCBpcGFfcHJveHlfY29ubiAqY29ubmVjdF9ic2Moc3RydWN0IHNvY2thZGRyX2luICpzYSwgaW50IHByaXZfbnIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGM7CisJc3RydWN0IGJzY19mZCAqYmZkOworCWludCByZXQsIG9uID0gMTsKKworCWlwYyA9IGFsbG9jX2Nvbm4oKTsKKwlpZiAoIWlwYykKKwkJcmV0dXJuIE5VTEw7CisKKwlpcGMtPmJ0c19jb25uID0gZGF0YTsKKworCWJmZCA9ICZpcGMtPmZkOworCWJmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKwliZmQtPmNiID0gaXBhY2Nlc3NfZmRfY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQgfCBCU0NfRkRfV1JJVEU7CisJYmZkLT5kYXRhID0gaXBjOworCWJmZC0+cHJpdl9uciA9IHByaXZfbnI7CisKKwlzZXRzb2Nrb3B0KGJmZC0+ZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKworCXJldCA9IGNvbm5lY3QoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSBzYSwgc2l6ZW9mKCpzYSkpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBjb25uZWN0IHNvY2tldFxuIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShpcGMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBwcmUtZmlsbCB0eF9xdWV1ZSB3aXRoIGlkZW50aXR5IHJlcXVlc3QgKi8KKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQljbG9zZShiZmQtPmZkKTsKKwkJdGFsbG9jX2ZyZWUoaXBjKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGlwYzsKK30KKworc3RhdGljIGludCBpcGFjY2Vzc19wcm94eV9zZXR1cCh2b2lkKQoreworCWludCByZXQ7CisKKwlpcHAgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBpcGFfcHJveHkpOworCWlmICghaXBwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlJTklUX0xMSVNUX0hFQUQoJmlwcC0+YnRzX2xpc3QpOworCWlwcC0+cmVjb25uX3RpbWVyLmNiID0gcmVjb25uX3Rtcl9jYjsKKwlpcHAtPnJlY29ubl90aW1lci5kYXRhID0gaXBwOworCisJLyogTGlzdGVuIGZvciBPTUwgY29ubmVjdGlvbnMgKi8KKwlyZXQgPSBtYWtlX2xpc3Rlbl9zb2NrKCZpcHAtPm9tbF9saXN0ZW5fZmQsIElQQV9UQ1BfUE9SVF9PTUwsCisJCQkJT01MX0ZST01fQlRTLCBsaXN0ZW5fZmRfY2IpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogTGlzdGVuIGZvciBSU0wgY29ubmVjdGlvbnMgKi8KKwlyZXQgPSBtYWtlX2xpc3Rlbl9zb2NrKCZpcHAtPnJzbF9saXN0ZW5fZmQsIElQQV9UQ1BfUE9SVF9SU0wsCisJCQkJUlNMX0ZST01fQlRTLCBsaXN0ZW5fZmRfY2IpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKwlmcHJpbnRmKHN0ZG91dCwgInNpZ25hbCAldSByZWNlaXZlZFxuIiwgc2lnbmFsKTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTSUdBQlJUOgorCQkvKiBpbiBjYXNlIG9mIGFib3J0LCB3ZSB3YW50IHRvIG9idGFpbiBhIHRhbGxvYyByZXBvcnQKKwkJICogYW5kIHRoZW4gcmV0dXJuIHRvIHRoZSBjYWxsZXIsIHdobyB3aWxsIGFib3J0IHRoZSBwcm9jZXNzICovCisJY2FzZSBTSUdVU1IxOgorCQl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF9ic2NfY3R4LCBzdGRlcnIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmM7CisKKwlsaXN0ZW5faXBhZGRyID0gIjE5Mi4xNjguMTAwLjExIjsKKwlic2NfaXBhZGRyID0gIjE5Mi4xNjguMTAwLjIzOSI7CisKKwl0YWxsX2JzY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgImlwYWNjZXNzLXByb3h5Iik7CisKKwlsb2dfaW5pdCgmbG9nX2luZm8pOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkRJTlA6RE1JIik7CisKKwlyYyA9IGlwYWNjZXNzX3Byb3h5X3NldHVwKCk7CisJaWYgKHJjIDwgMCkKKwkJZXhpdCgxKTsKKworCXNpZ25hbChTSUdVU1IxLCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdBQlJULCAmc2lnbmFsX2hhbmRsZXIpOworCisJd2hpbGUgKDEpIHsKKwkJYnNjX3NlbGVjdF9tYWluKDApOworCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lzZG5zeW5jLmMgYi9vcGVuYnNjL3NyYy9pc2Ruc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ODE5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pc2Ruc3luYy5jCkBAIC0wLDAgKzEsMTkyIEBACisvKiBpc2Ruc3luYy5jCisgKgorICogQXV0aG9yICAgICAgIEFuZHJlYXMgRXZlcnNiZXJnIDxqb2xseUBldmVyc2JlcmcuZXU+CisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSAibUlTRE5pZi5oIgorI2RlZmluZSBNSVNETl9PTERfQUZfQ09NUEFUSUJJTElUWQorI2RlZmluZSBBRl9DT01QQVRJQklMSVRZX0ZVTkMKKyNpbmNsdWRlICJjb21wYXRfYWZfaXNkbi5oIgorCitpbnQgY2FyZCA9IDA7CitpbnQgc29jayA9IC0xOworCitpbnQgbUlTRE5fb3Blbih2b2lkKQoreworCWludAkJCWZkLCByZXQ7CisJc3RydWN0IG1JU0ROX2RldmluZm8JZGV2aW5mbzsKKwlzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4JbDJhZGRyOworCisJZmQgPSBzb2NrZXQoUEZfSVNETiwgU09DS19SQVcsIElTRE5fUF9CQVNFKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IG9wZW4gc29ja2V0ICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBmZDsKKwl9CisJZGV2aW5mby5pZCA9IGNhcmQ7CisJcmV0ID0gaW9jdGwoZmQsIElNR0VUREVWSU5GTywgJmRldmluZm8pOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCJjb3VsZCBub3Qgc2VuZCBJT0NUTCBJTUdFVENPVU5UICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJY2xvc2UoZmQpOworCWlmICghKGRldmluZm8uRHByb3RvY29scyAmICgxIDw8IElTRE5fUF9URV9TMCkpCisJICYmICEoZGV2aW5mby5EcHJvdG9jb2xzICYgKDEgPDwgSVNETl9QX1RFX0UxKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsIkludGVyZmFjZSBkb2VzIG5vdCBzdXBwb3J0IFRFIG1vZGUgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwlmZCA9IHNvY2tldChQRl9JU0ROLCBTT0NLX0RHUkFNLCBJU0ROX1BfTEFQRF9URSk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwiY291bGQgbm90IG9wZW4gSVNETl9QX0xBUERfVEUgc29ja2V0ICglcylcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBmZDsKKwl9CisJbDJhZGRyLmZhbWlseSA9IEFGX0lTRE47CisJbDJhZGRyLmRldiA9IGNhcmQ7CisJbDJhZGRyLmNoYW5uZWwgPSAwOworCWwyYWRkci5zYXBpID0gMDsKKwlsMmFkZHIudGVpID0gMDsKKwlyZXQgPSBiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJmwyYWRkciwgc2l6ZW9mKGwyYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCJjb3VsZCBub3QgYmluZCBzb2NrZXQgZm9yIGNhcmQgJWQgKCVzKVxuIiwgY2FyZCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwlzb2NrID0gZmQ7CisKKwlyZXR1cm4gc29jazsKK30KKworCit2b2lkIG1JU0ROX2hhbmRsZSh2b2lkKQoreworCWludCByZXQ7CisJZmRfc2V0IHJmZDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4gYWRkcjsKKwlzb2NrbGVuX3QgYWxlbjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyMDQ4XTsKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaCA9IChzdHJ1Y3QgbUlTRE5oZWFkICopYnVmZmVyOworCWludCBsMSA9IDAsIGwyID0gMCwgdGVpID0gMDsKKworCXdoaWxlKDEpIHsKK2FnYWluOgorCQlGRF9aRVJPKCZyZmQpOworCQlGRF9TRVQoc29jaywgJnJmZCk7CisJCXR2LnR2X3NlYyA9IDI7CisJCXR2LnR2X3VzZWMgPSAwOworCQlyZXQgPSBzZWxlY3Qoc29jaysxLCAmcmZkLCBOVUxMLCBOVUxMLCAmdHYpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJZnByaW50ZihzdGRlcnIsICIlcyBhYm9ydGVkOiAlc1xuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKEZEX0lTU0VUKHNvY2ssICZyZmQpKSB7CisJCQlhbGVuID0gc2l6ZW9mKGFkZHIpOworCQkJcmV0ID0gcmVjdmZyb20oc29jaywgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgJmFsZW4pOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIHJlYWQgc29ja2V0IGVycm9yICVzXG4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisJCQl9IGVsc2UgaWYgKHJldCA8IE1JU0ROX0hFQURFUl9MRU4pIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICIlcyByZWFkIHNvY2tldCBzaG9yIGZyYW1lXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJfSBlbHNlIHsKKwkJCQlzd2l0Y2goaGgtPnByaW0pIHsKKwkJCQkJY2FzZSBNUEhfQUNUSVZBVEVfSU5EOgorCQkJCQljYXNlIFBIX0FDVElWQVRFX0lORDoKKwkJCQkJCWlmICghbDEpIHsKKwkJCQkJCQlwcmludGYoIlBIX0FDVElWQVRFXG4iKTsKKwkJCQkJCQlwcmludGYoIioqKiBTeW5jIGF2YWlsYWJsZSBmcm9tIGludGVyZmFjZSA6LSlcbiIpOworCQkJCQkJCWwxID0gMTsKKwkJCQkJCX0KKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCWJyZWFrOworCQkJCQljYXNlIE1QSF9ERUFDVElWQVRFX0lORDoKKwkJCQkJY2FzZSBQSF9ERUFDVElWQVRFX0lORDoKKwkJCQkJCWlmIChsMSkgeworCQkJCQkJCXByaW50ZigiUEhfREVBQ1RJVkFURVxuIik7CisJCQkJCQkJcHJpbnRmKCIqKiogTG9zdCBzeW5jIG9uIGludGVyZmFjZSAgICAgICAgOi0oXG4iKTsKKwkJCQkJCQlsMSA9IDA7CisJCQkJCQl9CisJCQkJCQlnb3RvIGFnYWluOworCQkJCQlicmVhazsKKwkJCQkJY2FzZSBETF9FU1RBQkxJU0hfSU5EOgorCQkJCQljYXNlIERMX0VTVEFCTElTSF9DTkY6CisJCQkJCQlwcmludGYoIkRMX0VTVEFCTElTSFxuIik7CisJCQkJCQlsMiA9IDE7CisJCQkJCQlnb3RvIGFnYWluOworCQkJCQlicmVhazsKKwkJCQkJY2FzZSBETF9SRUxFQVNFX0lORDoKKwkJCQkJY2FzZSBETF9SRUxFQVNFX0NORjoKKwkJCQkJCXByaW50ZigiRExfUkVMRUFTRVxuIik7CisJCQkJCQlsMiA9IDA7CisJCQkJCQlnb3RvIGFnYWluOworCQkJCQlicmVhazsKKwkJCQkJY2FzZSBETF9JTkZPUk1BVElPTl9JTkQ6CisJCQkJCQlwcmludGYoIkRMX0lORk9STUFUSU9OICh0ZWkgJWQgc2FwaSAlZClcbiIsIGFkZHIudGVpLCBhZGRyLnNhcGkpOworCQkJCQkJdGVpID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisvLwkJCQkJCXByaW50ZigicHJpbSAleFxuIiwgaGgtPnByaW0pOworCQkJCQkJZ290byBhZ2FpbjsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHRlaSAmJiAhbDIpIHsKKwkJCWhoLT5wcmltID0gRExfRVNUQUJMSVNIX1JFUTsKKwkJCXByaW50ZigiLT4gYWN0aXZhdGluZyBsYXllciAyXG4iKTsKKwkJCXNlbmR0byhzb2NrLCBidWZmZXIsIE1JU0ROX0hFQURFUl9MRU4sIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIGFsZW4pOworCQl9CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCByZXQ7CisKKwlpZiAoYXJnYyA8PSAxKQorCXsKKwkJcHJpbnRmKCJVc2FnZTogJXMgPGNhcmQ+XG5cbiIsIGFyZ3ZbMF0pOworCQlwcmludGYoIk9wZW5zIGdpdmVuIGNhcmQgbnVtYmVyIGluIFRFLW1vZGUgUFRQIGFuZCB0cmllcyB0byBrZWVwIGxheWVyIDIgZXN0YWJsaXNoZWQuXG4iKTsKKwkJcHJpbnRmKCJUaGlzIGtlZXBzIGxheWVyIDEgYWN0aXZhdGVkIHRvIHJldHJpZXZlIGEgc3RlYWR5IHN5bmMgc2lnbmFsIGZyb20gbmV0d29yay5cbiIpOworCQlyZXR1cm4oMCk7CisJfQorCisJY2FyZCA9IGF0b2koYXJndlsxXSk7CisKKwlpbml0X2FmX2lzZG4oKTsKKworCWlmICgocmV0ID0gbUlTRE5fb3BlbigpIDwgMCkpCisJCXJldHVybihyZXQpOworCisJbUlTRE5faGFuZGxlKCk7CisKKwljbG9zZShzb2NrKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWVhc19yZXAuYyBiL29wZW5ic2Mvc3JjL21lYXNfcmVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5Y2MxYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21lYXNfcmVwLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIE1lYXN1cmVtZW50IFJlcG9ydCBQcm9jZXNzaW5nICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21lYXNfcmVwLmg+CisKK3N0YXRpYyBpbnQgZ2V0X2ZpZWxkKGNvbnN0IHN0cnVjdCBnc21fbWVhc19yZXAgKnJlcCwKKwkJICAgICBlbnVtIG1lYXNfcmVwX2ZpZWxkIGZpZWxkKQoreworCXN3aXRjaCAoZmllbGQpIHsKKwljYXNlIE1FQVNfUkVQX0RMX1JYTEVWX0ZVTEw6CisJCXJldHVybiByZXAtPmRsLmZ1bGwucnhfbGV2OworCWNhc2UgTUVBU19SRVBfRExfUlhMRVZfU1VCOgorCQlyZXR1cm4gcmVwLT5kbC5zdWIucnhfbGV2OworCWNhc2UgTUVBU19SRVBfRExfUlhRVUFMX0ZVTEw6CisJCXJldHVybiByZXAtPmRsLmZ1bGwucnhfcXVhbDsKKwljYXNlIE1FQVNfUkVQX0RMX1JYUVVBTF9TVUI6CisJCXJldHVybiByZXAtPmRsLnN1Yi5yeF9xdWFsOworCWNhc2UgTUVBU19SRVBfVUxfUlhMRVZfRlVMTDoKKwkJcmV0dXJuIHJlcC0+dWwuZnVsbC5yeF9sZXY7CisJY2FzZSBNRUFTX1JFUF9VTF9SWExFVl9TVUI6CisJCXJldHVybiByZXAtPnVsLnN1Yi5yeF9sZXY7CisJY2FzZSBNRUFTX1JFUF9VTF9SWFFVQUxfRlVMTDoKKwkJcmV0dXJuIHJlcC0+dWwuZnVsbC5yeF9xdWFsOworCWNhc2UgTUVBU19SRVBfVUxfUlhRVUFMX1NVQjoKKwkJcmV0dXJuIHJlcC0+dWwuc3ViLnJ4X3F1YWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwordW5zaWduZWQgaW50IGNhbGNfaW5pdGlhbF9pZHgodW5zaWduZWQgaW50IGFycmF5X3NpemUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbWVhc19yZXBfaWR4LAorCQkJICAgICAgdW5zaWduZWQgaW50IG51bV92YWx1ZXMpCit7CisJaW50IG9mZnMsIGlkeDsKKworCS8qIGZyb20gd2hpY2ggZWxlbWVudCBkbyB3ZSBuZWVkIHRvIHN0YXJ0IGlmIHdlJ3JlIGludGVyZXN0ZWQKKwkgKiBpbiBhbiBhdmVyYWdlIG9mICdudW0nIGVsZW1lbnRzICovCisJb2ZmcyA9IG1lYXNfcmVwX2lkeCAtIG51bV92YWx1ZXM7CisKKwlpZiAob2ZmcyA8IDApCisJCWlkeCA9IGFycmF5X3NpemUgKyBvZmZzOworCWVsc2UKKwkJaWR4ID0gb2ZmczsKKworCXJldHVybiBpZHg7Cit9CisKKy8qIG9idGFpbiBhbiBhdmVyYWdlIG92ZXIgdGhlIGxhc3QgJ251bScgZmllbGRzIGluIHRoZSBtZWFzIHJlcHMgKi8KK2ludCBnZXRfbWVhc19yZXBfYXZnKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkgICAgIGVudW0gbWVhc19yZXBfZmllbGQgZmllbGQsIHVuc2lnbmVkIGludCBudW0pCit7CisJdW5zaWduZWQgaW50IGksIGlkeDsKKwlpbnQgYXZnID0gMDsKKworCWlkeCA9IGNhbGNfaW5pdGlhbF9pZHgoQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApLAorCQkJCWxjaGFuLT5tZWFzX3JlcF9pZHgsIG51bSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaW50IGogPSAoaWR4K2kpICUgQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApOworCisJCWF2ZyArPSBnZXRfZmllbGQoJmxjaGFuLT5tZWFzX3JlcFtqXSwgZmllbGQpOworCX0KKworCXJldHVybiBhdmcgLyBudW07Cit9CisKKy8qIENoZWNrIGlmIE4gb3V0IG9mIE0gbGFzdCB2YWx1ZXMgZm9yIEZJRUxEIGFyZSA+PSBiZCAqLworaW50IG1lYXNfcmVwX25fb3V0X29mX21fYmUoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQllbnVtIG1lYXNfcmVwX2ZpZWxkIGZpZWxkLAorCQkJdW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCBtLCBpbnQgYmUpCit7CisJdW5zaWduZWQgaW50IGksIGlkeDsKKwlpbnQgY291bnQgPSAwOworCisJaWR4ID0gY2FsY19pbml0aWFsX2lkeChBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCksCisJCQkJbGNoYW4tPm1lYXNfcmVwX2lkeCwgbSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7CisJCWludCBqID0gKGlkeCArIGkpICUgQVJSQVlfU0laRShsY2hhbi0+bWVhc19yZXApOworCQlpbnQgdmFsID0gZ2V0X2ZpZWxkKCZsY2hhbi0+bWVhc19yZXBbal0sIGZpZWxkKTsKKworCQlpZiAodmFsID49IGJlKQorCQkJY291bnQrKzsKKworCQlpZiAoY291bnQgPj0gbikKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC5jZmcgYi9vcGVuYnNjL3NyYy9tZ2NwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzhmNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWdjcC5jZmcKQEAgLTAsMCArMSwxOSBAQAorIQorISBNR0NQIGNvbmZpZ3VyYXRpb24gaGFuZCBlZGl0ZWQKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK21nY3AKKyEgIGxvY2FsIGlwIDIxMy4xNjcuMTM0LjE0CisgIGJ0cyBpcCAxNzIuMTYuMjUyLjQzCisgIGJpbmQgaXAgMjEzLjE2Ny4xMzQuMTQxCisgIGJpbmQgcG9ydCAyNDI3CisgIGJpbmQgZWFybHkgMQorICBydHAgYmFzZSA0MDAwCisgIHNkcCBhdWRpbyBwYXlsb2FkIG51bWJlciA5OAorICBzZHAgYXVkaW8gcGF5bG9hZCBuYW1lIEFNUi84MDAwCisgIG51bWJlciBlbmRwb2ludHMgMzEKKyAgbG9vcCAxCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbWFpbi5jIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2YxZjgwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX21haW4uYwpAQCAtMCwwICsxLDI3MyBAQAorLyogQSBNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wgTWVkaWEgR2F0ZXdheTogUkZDIDM0MzUgKi8KKy8qIFRoZSBtYWluIG1ldGhvZCB0byBkcml2ZSBpdCBhcyBhIHN0YW5kYWxvbmUgcHJvY2VzcyAgICAgICovCisKKy8qCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwX2ludGVybmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKworI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisKKyNpbmNsdWRlICIuLi8uLi9ic2Njb25maWcuaCIKKworLyogdGhpcyBpcyBoZXJlIGZvciB0aGUgdnR5Li4uIGl0IHdpbGwgbmV2ZXIgYmUgY2FsbGVkICovCit2b2lkIHN1YnNjcl9wdXQoKSB7IGFib3J0KCk7IH0KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjd2FybmluZyAiTWFrZSB1c2Ugb2YgdGhlIHJ0cCBwcm94eSBjb2RlIgorCitzdGF0aWMgc3RydWN0IGJzY19mZCBiZmQ7CitzdGF0aWMgc3RydWN0IG1nY3BfY29uZmlnICpjZmc7CitzdGF0aWMgaW50IHJlc2V0X2VuZHBvaW50cyA9IDA7CisKK2NvbnN0IGNoYXIgKm9wZW5ic2NfdmVyc2lvbiA9ICJPcGVuQlNDIE1HQ1AgIiBQQUNLQUdFX1ZFUlNJT047Citjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodCA9CisJIkNvcHlyaWdodCAoQykgMjAwOS0yMDEwIEhvbGdlciBGcmV5dGhlciBhbmQgT24tV2F2ZXNcbiIKKwkiQ29udHJpYnV0aW9ucyBieSBEYW5pZWwgV2lsbG1hbm4sIEphbiBMw7xiYmUsU3RlZmFuIFNjaG1pZHRcbiIKKwkiRGlldGVyIFNwYWFyLCBBbmRyZWFzIEV2ZXJzYmVyZywgSGFyYWxkIFdlbHRlXG5cbiIKKwkiTGljZW5zZSBHUEx2Mis6IEdOVSBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyIDxodHRwOi8vZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbD5cbiIKKwkiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgYXJlIGZyZWUgdG8gY2hhbmdlIGFuZCByZWRpc3RyaWJ1dGUgaXQuXG4iCisJIlRoZXJlIGlzIE5PIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuXG4iOworCitzdGF0aWMgY2hhciAqY29uZmlnX2ZpbGUgPSAibWdjcC5jZmciOworCisvKiB1c2VkIGJ5IG1zZ2IgYW5kIG1nY3AgKi8KK3ZvaWQgKnRhbGxfYnNjX2N0eCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigiU29tZSB1c2VmdWwgaGVscC4uLlxuIik7CisJcHJpbnRmKCIgLWggLS1oZWxwIGlzIHByaW50aW5nIHRoaXMgdGV4dC5cbiIpOworCXByaW50ZigiIC1jIC0tY29uZmlnLWZpbGUgZmlsZW5hbWUgVGhlIGNvbmZpZyBmaWxlIHRvIHVzZS5cbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9tZ2NwX3ZlcnNpb24oKQoreworCXByaW50ZigiJXNcblxuIiwgb3BlbmJzY192ZXJzaW9uKTsKKwlwcmludGYoIiVzIiwgb3BlbmJzY19jb3B5cmlnaHQpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfb3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJd2hpbGUgKDEpIHsKKwkJaW50IG9wdGlvbl9pbmRleCA9IDAsIGM7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyJoZWxwIiwgMCwgMCwgJ2gnfSwKKwkJCXsiY29uZmlnLWZpbGUiLCAxLCAwLCAnYyd9LAorCQkJeyJ2ZXJzaW9uIiwgMCwgMCwgJ1YnfSwKKwkJCXswLCAwLCAwLCAwfSwKKwkJfTsKKworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhjOlYiLCBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoKGMpIHsKKwkJY2FzZSAnaCc6CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KDApOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJY29uZmlnX2ZpbGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfYnNjX2N0eCwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCXByaW50X21nY3BfdmVyc2lvbigpOworCQkJZXhpdCgwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogaWdub3JlICovCisJCQlicmVhazsKKwkJfTsKKwl9Cit9CisKKy8qIHNpbXBseSByZW1lbWJlciB0aGlzICovCitzdGF0aWMgaW50IG1nY3BfcnNpcF9jYihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZykKK3sKKwlyZXNldF9lbmRwb2ludHMgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWdjcF9jaGFuZ2VfY2Ioc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIGludCBlbmRwb2ludCwgaW50IHN0YXRlLCBpbnQgbG9jYWxfcnRwKQoreworCWlmIChzdGF0ZSAhPSBNR0NQX0VORFBfTURDWCkKKwkJcmV0dXJuIDA7CisKKwltZ2NwX3NlbmRfZHVtbXkoJmNmZy0+ZW5kcG9pbnRzW2VuZHBvaW50XSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9jYWxsX2FnZW50KHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlzb2NrbGVuX3Qgc2xlbiA9IHNpemVvZihhZGRyKTsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBtc2diICpyZXNwOworCWludCBpOworCisJbXNnID0gKHN0cnVjdCBtc2diICopIGZkLT5kYXRhOworCisJLyogcmVhZCBvbmUgbGVzcyBzbyB3ZSBjYW4gdXNlIGl0IGFzIGEgXDAgKi8KKwlpbnQgcmMgPSByZWN2ZnJvbShiZmQuZmQsIG1zZy0+ZGF0YSwgbXNnLT5kYXRhX2xlbiAtIDEsIDAsCisJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsICZzbGVuKTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiR2F0ZXdheSBmYWlsZWQgdG8gcmVhZCIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmIChzbGVuID4gc2l6ZW9mKGFkZHIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiR2F0ZXdheSByZWNlaXZlZCBtZXNzYWdlIGZyb20gb3V0ZXJzcGFjZTogJWQgJWRcbiIsCisJCQlzbGVuLCBzaXplb2YoYWRkcikpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogaGFuZGxlIG1lc3NhZ2Ugbm93ICovCisJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIHJjKTsKKwlyZXNwID0gbWdjcF9oYW5kbGVfbWVzc2FnZShjZmcsIG1zZyk7CisJbXNnYl9yZXNldChtc2cpOworCisJaWYgKHJlc3ApIHsKKwkJc2VuZHRvKGJmZC5mZCwgcmVzcC0+bDJoLCBtc2diX2wybGVuKHJlc3ApLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCQltc2diX2ZyZWUocmVzcCk7CisJfQorCisJaWYgKHJlc2V0X2VuZHBvaW50cykgeworCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkFza2VkIHRvIHJlc2V0IGVuZHBvaW50cy5cbiIpOworCQlyZXNldF9lbmRwb2ludHMgPSAwOworCisJCS8qIGlzIGNoZWNraW5nIGluX2FkZHIuc19hZGRyID09IElOQUREUl9MT09QQkFDSyBtYWtpbmcgaXQgbW9yZSBzZWN1cmU/ICovCisJCWZvciAoaSA9IDE7IGkgPCBjZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkKKwkJCW1nY3BfZnJlZV9lbmRwKCZjZmctPmVuZHBvaW50c1tpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXN0cnVjdCBnc21fbmV0d29yayBkdW1teV9uZXR3b3JrOworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCBvbiA9IDEsIHJjOworCXN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisJdGFsbF9ic2NfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDEsICJtZ2NwLWNhbGxhZ2VudCIpOworCisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCisJY2ZnID0gbWdjcF9jb25maWdfYWxsb2MoKTsKKwlpZiAoIWNmZykKKwkJcmV0dXJuIC0xOworCisJaGFuZGxlX29wdGlvbnMoYXJnYywgYXJndik7CisKKwl0ZWxuZXRfaW5pdCgmZHVtbXlfbmV0d29yaywgNDI0Myk7CisgICAgICAgIHJjID0gbWdjcF9wYXJzZV9jb25maWcoY29uZmlnX2ZpbGUsIGNmZyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogc2V0IHNvbWUgY2FsbGJhY2tzICovCisJY2ZnLT5yZXNldF9jYiA9IG1nY3BfcnNpcF9jYjsKKwljZmctPmNoYW5nZV9jYiA9IG1nY3BfY2hhbmdlX2NiOworCisgICAgICAgIC8qIHdlIG5lZWQgdG8gYmluZCBhIHNvY2tldCAqLworICAgICAgICBpZiAocmMgPT0gMCkgeworCQliZmQud2hlbiA9IEJTQ19GRF9SRUFEOworCQliZmQuY2IgPSByZWFkX2NhbGxfYWdlbnQ7CisJCWJmZC5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwkJaWYgKGJmZC5mZCA8IDApIHsKKwkJCXBlcnJvcigiR2F0ZXdheSBmYWlsZWQgdG8gbGlzdGVuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzZXRzb2Nrb3B0KGJmZC5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwkJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJYWRkci5zaW5fcG9ydCA9IGh0b25zKGNmZy0+c291cmNlX3BvcnQpOworCQlpbmV0X2F0b24oY2ZnLT5zb3VyY2VfYWRkciwgJmFkZHIuc2luX2FkZHIpOworCisJCWlmIChiaW5kKGJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKKwkJCXBlcnJvcigiR2F0ZXdheSBmYWlsZWQgdG8gYmluZCIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJYmZkLmRhdGEgPSBtc2diX2FsbG9jKDQwOTYsICJtZ2NwLW1zZyIpOworCQlpZiAoIWJmZC5kYXRhKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkdhdGV3YXkgbWVtb3J5IGVycm9yLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCisJCWlmIChic2NfcmVnaXN0ZXJfZmQoJmJmZCkgIT0gMCkgeworCQkJTE9HUChETUdDUCwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byByZWdpc3RlciB0aGUgZmRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJDb25maWd1cmVkIGZvciBNR0NQLlxuIik7CisJfQorCisJLyogaW5pdGlhbGlzYXRpb24gKi8KKwlzcmFuZCh0aW1lKE5VTEwpKTsKKworCS8qIG1haW4gbG9vcCAqLworCXdoaWxlICgxKSB7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9CisKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZ3NtX25ldHdvcms7CitpbnQgYnNjX3Z0eV9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqZHVtbXkpCit7CisJY21kX2luaXQoMSk7CisJdnR5X2luaXQoKTsKKworCW9wZW5ic2NfdnR5X2FkZF9jbWRzKCk7CisgICAgICAgIG1nY3BfdnR5X2luaXQoKTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX25ldHdvcmsuYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9uZXR3b3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3NDVhNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9uZXR3b3JrLmMKQEAgLTAsMCArMSwyODQgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisvKiBUaGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcF9pbnRlcm5hbC5oPgorCisjd2FybmluZyAiTWFrZSB1c2Ugb2YgdGhlIHJ0cCBwcm94eSBjb2RlIgorCisvKiBhY2NvcmRpbmcgdG8gcnRwX3Byb3h5LmMgUkZDIDM1NTAgKi8KK3N0cnVjdCBydHBfaGRyIHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QgIGNzcmNfY291bnQ6NCwKKwkJICBleHRlbnNpb246MSwKKwkJICBwYWRkaW5nOjEsCisJCSAgdmVyc2lvbjoyOworCXVfaW50OF90ICBwYXlsb2FkX3R5cGU6NywKKwkJICBtYXJrZXI6MTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdCAgdmVyc2lvbjoyLAorCQkgIHBhZGRpbmc6MSwKKwkJICBleHRlbnNpb246MSwKKwkJICBjc3JjX2NvdW50OjQ7CisJdV9pbnQ4X3QgIG1hcmtlcjoxLAorCQkgIHBheWxvYWRfdHlwZTo3OworI2VuZGlmCisJdV9pbnQxNl90IHNlcXVlbmNlOworCXVfaW50MzJfdCB0aW1lc3RhbXA7CisJdV9pbnQzMl90IHNzcmM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0geworCURFU1RfTkVUV09SSyA9IDAsCisJREVTVF9CVFMgPSAxLAorfTsKKworZW51bSB7CisJUFJPVE9fUlRQLAorCVBST1RPX1JUQ1AsCit9OworCisjZGVmaW5lIERVTU1ZX0xPQUQgMHgyMworCisKK3N0YXRpYyBpbnQgdWRwX3NlbmQoaW50IGZkLCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwgaW50IHBvcnQsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gb3V0OworCW91dC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlvdXQuc2luX3BvcnQgPSBwb3J0OworCW1lbWNweSgmb3V0LnNpbl9hZGRyLCBhZGRyLCBzaXplb2YoKmFkZHIpKTsKKworCXJldHVybiBzZW5kdG8oZmQsIGJ1ZiwgbGVuLCAwLCAoc3RydWN0IHNvY2thZGRyICopJm91dCwgc2l6ZW9mKG91dCkpOworfQorCitpbnQgbWdjcF9zZW5kX2R1bW15KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKQoreworCXN0YXRpYyBjaGFyIGJ1ZltdID0geyBEVU1NWV9MT0FEIH07CisKKwlyZXR1cm4gdWRwX3NlbmQoZW5kcC0+bG9jYWxfcnRwLmZkLCAmZW5kcC0+cmVtb3RlLAorCQkJZW5kcC0+bmV0X3J0cCwgYnVmLCAxKTsKK30KKworc3RhdGljIHZvaWQgcGF0Y2hfcGF5bG9hZChpbnQgcGF5bG9hZCwgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcnRwX2hkciAqcnRwX2hkcjsKKworCWlmIChsZW4gPCBzaXplb2YoKnJ0cF9oZHIpKQorCQlyZXR1cm47CisKKwlpZiAocGF5bG9hZCA8IDApCisJCXJldHVybjsKKworCXJ0cF9oZHIgPSAoc3RydWN0IHJ0cF9oZHIgKikgZGF0YTsKKwlydHBfaGRyLT5wYXlsb2FkX3R5cGUgPSBwYXlsb2FkOworfQorCisvKgorICogVGhlcmUgaXMgZGF0YSBjb21pbmcuIFdlIHdpbGwgaGF2ZSB0byBmaWd1cmUgb3V0IGlmIGl0CisgKiBjYW1lIGZyb20gdGhlIEJUUyBvciB0aGUgTWVkaWFHYXRld2F5IG9mIHRoZSBNU0MuIE9uIHRvcAorICogb2YgdGhhdCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgaXQgd2FzIFJUUCBvciBSVENQLgorICoKKyAqIEN1cnJlbnRseSB3ZSBkbyBub3QgY29tbXVuaWNhdGUgd2l0aCB0aGUgQlNDIHNvIHdlIGhhdmUKKyAqIG5vIGlkZWEgd2hlcmUgdGhlIEJUUyBpcyBsaXN0ZW5pbmcgZm9yIFJUUCBhbmQgbmVlZCB0bworICogZG8gdGhlIGNsYXNzaWMgcm91dGluZyB0cmljay4gV2FpdCBmb3IgdGhlIGZpcnN0IHBhY2tldAorICogZnJvbSB0aGUgQlRTIGFuZCB0aGVuIGdvIGFoZWFkLgorICovCitzdGF0aWMgaW50IHJ0cF9kYXRhX2NiKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwljaGFyIGJ1Zls0MDk2XTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlzb2NrbGVuX3Qgc2xlbiA9IHNpemVvZihhZGRyKTsKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKKwlzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZzsKKwlpbnQgcmMsIGRlc3QsIHByb3RvOworCisJZW5kcCA9IChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqKSBmZC0+ZGF0YTsKKwljZmcgPSBlbmRwLT5jZmc7CisKKwlyYyA9IHJlY3Zmcm9tKGZkLT5mZCwgJmJ1Ziwgc2l6ZW9mKGJ1ZiksIDAsCisJCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgJnNsZW4pOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byByZWNlaXZlIG1lc3NhZ2Ugb246IDB4JXggZXJybm86ICVkLyVzXG4iLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGRvIG5vdCBmb3J3YXJkIGF5bnRoaW5nLi4uIG1heWJlIHRoZXJlIGlzIGEgcGFja2V0IGZyb20gdGhlIGJ0cyAqLworCWlmIChlbmRwLT5jaSA9PSBDSV9VTlVTRUQpCisJCXJldHVybiAtMTsKKworCS8qCisJICogRmlndXJlIG91dCB3aGVyZSB0byBmb3J3YXJkIGl0IHRvLiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHdlCisJICogaGF2ZSByZWNlaXZlZCB0aGUgQ29ubmVjdGlvbiBNb2RpZnkgYW5kIGtub3cgd2hvIGlzIGEgbGVnaXRpbWF0ZQorCSAqIHBhcnRuZXIuIEFjY29yZGluZyB0byB0aGUgc3BlYyB3ZSBjb3VsZCBhdHRlbXB0IHRvIGZvcndhcmQgZXZlbgorCSAqIGFmdGVyIHRoZSBDcmVhdGUgQ29ubmVjdGlvbiBidXQgd2Ugd2lsbCBub3QgYXMgd2UgYXJlIG5vdCByZWFsbHkKKwkgKiBhYmxlIHRvIHRlbGwgaWYgdGhpcyBpcyBsZWdpdGltYXRlLgorCSAqLworCSN3YXJuaW5nICJTbGlnaHQgc3BlYyB2aW9sYXRpb24uIFdpdGggY29ubmVjdGlvbiBtb2RlIHJlY3Zvbmx5IHdlIHNob3VsZCBhdHRlbXB0IHRvIGZvcndhcmQuIgorCWRlc3QgPSBtZW1jbXAoJmFkZHIuc2luX2FkZHIsICZlbmRwLT5yZW1vdGUsIHNpemVvZihhZGRyLnNpbl9hZGRyKSkgPT0gMCAmJgorCQkgICAgKGVuZHAtPm5ldF9ydHAgPT0gYWRkci5zaW5fcG9ydCB8fCBlbmRwLT5uZXRfcnRjcCA9PSBhZGRyLnNpbl9wb3J0KQorCQkJPyBERVNUX0JUUyA6IERFU1RfTkVUV09SSzsKKwlwcm90byA9IGZkID09ICZlbmRwLT5sb2NhbF9ydHAgPyBQUk9UT19SVFAgOiBQUk9UT19SVENQOworCisJLyogV2UgaGF2ZSBubyBpZGVhIHdobyBjYWxsZWQgdXMsIG1heWJlIGl0IGlzIHRoZSBCVFMuICovCisJaWYgKGRlc3QgPT0gREVTVF9ORVRXT1JLICYmIChlbmRwLT5idHNfcnRwID09IDAgfHwgY2ZnLT5mb3J3YXJkX2lwKSkgeworCQkvKiBpdCB3YXMgdGhlIEJUUy4uLiAqLworCQlpZiAoIWNmZy0+YnRzX2lwCisJCSAgICB8fCBtZW1jbXAoJmFkZHIuc2luX2FkZHIsICZjZmctPmJ0c19pbiwgc2l6ZW9mKGNmZy0+YnRzX2luKSkgPT0gMAorCQkgICAgfHwgbWVtY21wKCZhZGRyLnNpbl9hZGRyLCAmZW5kcC0+YnRzLCBzaXplb2YoZW5kcC0+YnRzKSkgPT0gMCkgeworCQkJaWYgKGZkID09ICZlbmRwLT5sb2NhbF9ydHApIHsKKwkJCQllbmRwLT5idHNfcnRwID0gYWRkci5zaW5fcG9ydDsKKwkJCX0gZWxzZSB7CisJCQkJZW5kcC0+YnRzX3J0Y3AgPSBhZGRyLnNpbl9wb3J0OworCQkJfQorCisJCQllbmRwLT5idHMgPSBhZGRyLnNpbl9hZGRyOworCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJGb3VuZCBCVFMgZm9yIGVuZHBvaW50OiAweCV4IG9uIHBvcnQ6ICVkLyVkIG9mICVzXG4iLAorCQkJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgbnRvaHMoZW5kcC0+YnRzX3J0cCksIG50b2hzKGVuZHAtPmJ0c19ydGNwKSwKKwkJCQlpbmV0X250b2EoYWRkci5zaW5fYWRkcikpOworCisJCX0KKwl9CisKKwkvKiB0aHJvdyBhd2F5IGR1bW15IG1lc3NhZ2UgKi8KKwlpZiAocmMgPT0gMSAmJiBidWZbMF0gPT0gRFVNTVlfTE9BRCkgeworCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkZpbHRlcmVkIGR1bW15IG9uIDB4JXhcbiIsCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkbyB0aGlzIGJlZm9yZSB0aGUgbG9vcCBoYW5kbGluZyAqLworCWlmIChkZXN0ID09IERFU1RfTkVUV09SSykKKwkJKytlbmRwLT5pbl9idHM7CisJZWxzZQorCQkrK2VuZHAtPmluX3JlbW90ZTsKKworCS8qIGRpc3BhdGNoICovCisJaWYgKGNmZy0+YXVkaW9fbG9vcCkKKwkJZGVzdCA9ICFkZXN0OworCisJaWYgKGRlc3QgPT0gREVTVF9ORVRXT1JLKSB7CisJCXBhdGNoX3BheWxvYWQoZW5kcC0+bmV0X3BheWxvYWRfdHlwZSwgYnVmLCByYyk7CisJCXJldHVybiB1ZHBfc2VuZChmZC0+ZmQsICZlbmRwLT5yZW1vdGUsCisJCQkgICAgIHByb3RvID09IFBST1RPX1JUUCA/IGVuZHAtPm5ldF9ydHAgOiBlbmRwLT5uZXRfcnRjcCwKKwkJCSAgICAgYnVmLCByYyk7CisJfSBlbHNlIHsKKwkJcGF0Y2hfcGF5bG9hZChlbmRwLT5idHNfcGF5bG9hZF90eXBlLCBidWYsIHJjKTsKKwkJcmV0dXJuIHVkcF9zZW5kKGZkLT5mZCwgJmVuZHAtPmJ0cywKKwkJCSAgICAgcHJvdG8gPT0gUFJPVE9fUlRQID8gZW5kcC0+YnRzX3J0cCA6IGVuZHAtPmJ0c19ydGNwLAorCQkJICAgICBidWYsIHJjKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2JpbmQoY29uc3QgY2hhciAqc291cmNlX2FkZHIsIHN0cnVjdCBic2NfZmQgKmZkLCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgb24gPSAxOworCisJZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChmZC0+ZmQgPCAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIFVEUCBwb3J0LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzZXRzb2Nrb3B0KGZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlpbmV0X2F0b24oc291cmNlX2FkZHIsICZhZGRyLnNpbl9hZGRyKTsKKworCWlmIChiaW5kKGZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJpbmRfcnRwKHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKQoreworCXN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnID0gZW5kcC0+Y2ZnOworCisJaWYgKGNyZWF0ZV9iaW5kKGNmZy0+c291cmNlX2FkZHIsICZlbmRwLT5sb2NhbF9ydHAsIGVuZHAtPnJ0cF9wb3J0KSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIFJUUCBwb3J0OiAlczolZCBvbiAweCV4XG4iLAorCQkgICAgICAgY2ZnLT5zb3VyY2VfYWRkciwgZW5kcC0+cnRwX3BvcnQsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWdvdG8gY2xlYW51cDA7CisJfQorCisJaWYgKGNyZWF0ZV9iaW5kKGNmZy0+c291cmNlX2FkZHIsICZlbmRwLT5sb2NhbF9ydGNwLCBlbmRwLT5ydHBfcG9ydCArIDEpICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgUlRDUCBwb3J0OiAlczolZCBvbiAweCV4XG4iLAorCQkgICAgICAgY2ZnLT5zb3VyY2VfYWRkciwgZW5kcC0+cnRwX3BvcnQgKyAxLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlnb3RvIGNsZWFudXAxOworCX0KKworCWVuZHAtPmxvY2FsX3J0cC5jYiA9IHJ0cF9kYXRhX2NiOworCWVuZHAtPmxvY2FsX3J0cC5kYXRhID0gZW5kcDsKKwllbmRwLT5sb2NhbF9ydHAud2hlbiA9IEJTQ19GRF9SRUFEOworCWlmIChic2NfcmVnaXN0ZXJfZmQoJmVuZHAtPmxvY2FsX3J0cCkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFJUUCBwb3J0ICVkIG9uIDB4JXhcbiIsCisJCQllbmRwLT5ydHBfcG9ydCwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJZ290byBjbGVhbnVwMjsKKwl9CisKKwllbmRwLT5sb2NhbF9ydGNwLmNiID0gcnRwX2RhdGFfY2I7CisJZW5kcC0+bG9jYWxfcnRjcC5kYXRhID0gZW5kcDsKKwllbmRwLT5sb2NhbF9ydGNwLndoZW4gPSBCU0NfRkRfUkVBRDsKKwlpZiAoYnNjX3JlZ2lzdGVyX2ZkKCZlbmRwLT5sb2NhbF9ydGNwKSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcmVnaXN0ZXIgUlRDUCBwb3J0ICVkIG9uIDB4JXhcbiIsCisJCQllbmRwLT5ydHBfcG9ydCArIDEsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWdvdG8gY2xlYW51cDM7CisJfQorCisJcmV0dXJuIDA7CisKK2NsZWFudXAzOgorCWJzY191bnJlZ2lzdGVyX2ZkKCZlbmRwLT5sb2NhbF9ydHApOworY2xlYW51cDI6CisJY2xvc2UoZW5kcC0+bG9jYWxfcnRjcC5mZCk7CisJZW5kcC0+bG9jYWxfcnRjcC5mZCA9IC0xOworY2xlYW51cDE6CisJY2xvc2UoZW5kcC0+bG9jYWxfcnRwLmZkKTsKKwllbmRwLT5sb2NhbF9ydHAuZmQgPSAtMTsKK2NsZWFudXAwOgorCXJldHVybiAtMTsKK30KKworaW50IG1nY3BfYmluZF9ydHBfcG9ydChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCwgaW50IHJ0cF9wb3J0KQoreworCWVuZHAtPnJ0cF9wb3J0ID0gcnRwX3BvcnQ7CisJcmV0dXJuIGJpbmRfcnRwKGVuZHApOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Byb3RvY29sLmMgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODJiZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Byb3RvY29sLmMKQEAgLTAsMCArMSw3NjcgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisvKiBUaGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwX2ludGVybmFsLmg+CisKK2VudW0gbWdjcF9jb25uZWN0aW9uX21vZGUgeworCU1HQ1BfQ09OTl9OT05FID0gMCwKKwlNR0NQX0NPTk5fUkVDVl9PTkxZID0gMSwKKwlNR0NQX0NPTk5fU0VORF9PTkxZID0gMiwKKwlNR0NQX0NPTk5fUkVDVl9TRU5EID0gTUdDUF9DT05OX1JFQ1ZfT05MWSB8IE1HQ1BfQ09OTl9TRU5EX09OTFksCit9OworCisvKioKKyAqIE1hY3JvIGZvciB0b2tlbml6aW5nIE1HQ1AgbWVzc2FnZXMgYW5kIFNEUCBpbiBvbmUgZ28uCisgKgorICovCisjZGVmaW5lIE1TR19UT0tFTklaRV9TVEFSVCBcCisJbGluZV9zdGFydCA9IDA7CQkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCBtc2diX2wzbGVuKG1zZyk7ICsraSkgewkJCVwKKwkJLyogd2UgaGF2ZSBhIGxpbmUgZW5kICovCQkJXAorCQlpZiAobXNnLT5sM2hbaV0gPT0gJ1xuJykgewkJCVwKKwkJCS8qIHNraXAgdGhlIGZpcnN0IGxpbmUgKi8JCVwKKwkJCWlmIChsaW5lX3N0YXJ0ID09IDApIHsJCQlcCisJCQkJbGluZV9zdGFydCA9IGkgKyAxOwkJXAorCQkJCWNvbnRpbnVlOwkJCVwKKwkJCX0JCQkJCVwKKwkJCQkJCQkJXAorCQkJLyogY2hlY2sgaWYgd2UgaGF2ZSBhIHByb3BlciBwYXJhbSAqLwlcCisJCQlpZiAoaSAtIGxpbmVfc3RhcnQgPT0gMSAmJiBtc2ctPmwzaFtsaW5lX3N0YXJ0XSA9PSAnXHInKSB7IFwKKwkJCX0gZWxzZSBpZiAoaSAtIGxpbmVfc3RhcnQgPiAyCQlcCisJCQkgICAgJiYgaXNsb3dlcihtc2ctPmwzaFtsaW5lX3N0YXJ0XSkJXAorCQkJICAgICYmIG1zZy0+bDNoW2xpbmVfc3RhcnQgKyAxXSA9PSAnPScpIHsgXAorCQkJfSBlbHNlIGlmIChpIC0gbGluZV9zdGFydCA8IDMJCVwKKwkJCSAgICB8fCBtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgMV0gIT0gJzonCVwKKwkJCSAgICB8fCBtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgMl0gIT0gJyAnKQlcCisJCQkJZ290byBlcnJvcjsJCQlcCisJCQkJCQkJCVwKKwkJCW1zZy0+bDNoW2ldID0gJ1wwJzsJCQlcCisJCQlpZiAobXNnLT5sM2hbaS0xXSA9PSAnXHInKQkJXAorCQkJCW1zZy0+bDNoW2ktMV0gPSAnXDAnOworCisjZGVmaW5lIE1TR19UT0tFTklaRV9FTkQgXAorCQkJbGluZV9zdGFydCA9IGkgKyAxOyBcCisJCX0JCQkgICAgXAorCX0KKworCitzdHJ1Y3QgbWdjcF9yZXF1ZXN0IHsKKwljaGFyICpuYW1lOworCXN0cnVjdCBtc2diICooKmhhbmRsZV9yZXF1ZXN0KSAoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworCWNoYXIgKmRlYnVnX25hbWU7Cit9OworCisjZGVmaW5lIE1HQ1BfUkVRVUVTVChOQU1FLCBSRVEsIERFQlVHX05BTUUpIFwKKwl7IC5uYW1lID0gTkFNRSwgLmhhbmRsZV9yZXF1ZXN0ID0gUkVRLCAuZGVidWdfbmFtZSA9IERFQlVHX05BTUUgfSwKKworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfYXVkaXRfZW5kcG9pbnQoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfY3JlYXRlX2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9kZWxldGVfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX21vZGlmeV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfcnNpcChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfY2FsbF9pZChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZykKK3sKKwlpbnQgaTsKKworCS8qIHVzZSB0aGUgY2FsbCBpZCAqLworCSsrY2ZnLT5sYXN0X2NhbGxfaWQ7CisKKwkvKiBoYW5kbGUgd3JhcCBhcm91bmQgKi8KKwlpZiAoY2ZnLT5sYXN0X2NhbGxfaWQgPT0gQ0lfVU5VU0VEKQorCQkrK2NmZy0+bGFzdF9jYWxsX2lkOworCisJLyogY2FsbHN0YWNrIGNhbiBvbmx5IGJlIG9mIHNpemUgbnVtYmVyX29mX2VuZHBvaW50cyAqLworCS8qIHZlcmlmeSB0aGF0IHRoZSBjYWxsIGlkIGlzIGZyZWUsIGUuZy4gaW4gY2FzZSBvZiBvdmVycnVuICovCisJZm9yIChpID0gMTsgaSA8IGNmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKQorCQlpZiAoY2ZnLT5lbmRwb2ludHNbaV0uY2kgPT0gY2ZnLT5sYXN0X2NhbGxfaWQpCisJCQlyZXR1cm4gZ2VuZXJhdGVfY2FsbF9pZChjZmcpOworCisJcmV0dXJuIGNmZy0+bGFzdF9jYWxsX2lkOworfQorCisvKgorICogYXJyYXkgb2YgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIGhhbmRsaW5nIHZhcmlvdXMKKyAqIG1lc3NhZ2VzLiBJbiB0aGUgZnV0dXJlIHRoaXMgbWlnaHQgYmUgYmluYXJ5IHNvcnRlZAorICogZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWdjcF9yZXF1ZXN0IG1nY3BfcmVxdWVzdHMgW10gPSB7CisJTUdDUF9SRVFVRVNUKCJBVUVQIiwgaGFuZGxlX2F1ZGl0X2VuZHBvaW50LCAiQXVkaXRFbmRwb2ludCIpCisJTUdDUF9SRVFVRVNUKCJDUkNYIiwgaGFuZGxlX2NyZWF0ZV9jb24sICJDcmVhdGVDb25uZWN0aW9uIikKKwlNR0NQX1JFUVVFU1QoIkRMQ1giLCBoYW5kbGVfZGVsZXRlX2NvbiwgIkRlbGV0ZUNvbm5lY3Rpb24iKQorCU1HQ1BfUkVRVUVTVCgiTURDWCIsIGhhbmRsZV9tb2RpZnlfY29uLCAiTW9kaWZpeUNvbm5lY3Rpb24iKQorCisJLyogU1BFQyBleHRlbnNpb24gKi8KKwlNR0NQX1JFUVVFU1QoIlJTSVAiLCBoYW5kbGVfcnNpcCwgIlJlU2V0SW5Qcm9ncmVzcyIpCit9OworCitzdGF0aWMgc3RydWN0IG1zZ2IgKm1nY3BfbXNnYl9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBtc2diICptc2c7CisJbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbSg0MDk2LCAxMjgsICJNR0NQIG1zZyIpOworCWlmICghbXNnKQorCSAgICBMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIG1zZ2IgZm9yIE1HQ1AgZGF0YS5cbiIpOworCisJcmV0dXJuIG1zZzsKK30KKworc3RydWN0IG1zZ2IgKm1nY3BfY3JlYXRlX3Jlc3BvbnNlX3dpdGhfZGF0YShpbnQgY29kZSwgY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICp0cmFucywKKwkJCQkgICAgY29uc3QgY2hhciAqZGF0YSkKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBtc2diICpyZXM7CisKKwlyZXMgPSBtZ2NwX21zZ2JfYWxsb2MoKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZGF0YSkgeworCQlsZW4gPSBzbnByaW50ZigoY2hhciAqKSByZXMtPmRhdGEsIDIwNDgsICIlZCAlc1xuJXMiLCBjb2RlLCB0cmFucywgZGF0YSk7CisJfSBlbHNlIHsKKwkJbGVuID0gc25wcmludGYoKGNoYXIgKikgcmVzLT5kYXRhLCAyMDQ4LCAiJWQgJXNcbiIsIGNvZGUsIHRyYW5zKTsKKwl9CisKKwlyZXMtPmwyaCA9IG1zZ2JfcHV0KHJlcywgbGVuKTsKKwlMT0dQKERNR0NQLCBMT0dMX0RFQlVHLCAiU2VuZGluZyByZXNwb25zZTogY29kZTogJWQgZm9yICclcydcbiIsIGNvZGUsIHJlcy0+bDJoKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmNyZWF0ZV9yZXNwb25zZShpbnQgY29kZSwgY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICp0cmFucykKK3sKKwlyZXR1cm4gbWdjcF9jcmVhdGVfcmVzcG9uc2Vfd2l0aF9kYXRhKGNvZGUsIG1zZywgdHJhbnMsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmNyZWF0ZV9yZXNwb25zZV93aXRoX3NkcChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCwKKwkJCQkJICAgICBjb25zdCBjaGFyICptc2csIGNvbnN0IGNoYXIgKnRyYW5zX2lkKQoreworCWNvbnN0IGNoYXIgKmFkZHIgPSBlbmRwLT5jZmctPmxvY2FsX2lwOworCWNoYXIgc2RwX3JlY29yZFs0MDk2XTsKKworCWlmICghYWRkcikKKwkJYWRkciA9IGVuZHAtPmNmZy0+c291cmNlX2FkZHI7CisKKwlzbnByaW50ZihzZHBfcmVjb3JkLCBzaXplb2Yoc2RwX3JlY29yZCkgLSAxLAorCQkJIkk6ICVkXG5cbiIKKwkJCSJ2PTBcclxuIgorCQkJImM9SU4gSVA0ICVzXHJcbiIKKwkJCSJtPWF1ZGlvICVkIFJUUC9BVlAgJWRcclxuIgorCQkJImE9cnRwbWFwOiVkICVzXHJcbiIsCisJCQllbmRwLT5jaSwgYWRkciwgZW5kcC0+cnRwX3BvcnQsCisJCQllbmRwLT5idHNfcGF5bG9hZF90eXBlLCBlbmRwLT5idHNfcGF5bG9hZF90eXBlLAorCQkgICAgICAgIGVuZHAtPmNmZy0+YXVkaW9fbmFtZSk7CisJcmV0dXJuIG1nY3BfY3JlYXRlX3Jlc3BvbnNlX3dpdGhfZGF0YSgyMDAsIG1zZywgdHJhbnNfaWQsIHNkcF9yZWNvcmQpOworfQorCisvKgorICogaGFuZGxlIGluY29taW5nIG1lc3NhZ2VzOgorICogICAtIHRoaXMgY2FuIGJlIGEgY29tbWFuZCAoZm91ciBsZXR0ZXJzLCBzcGFjZSwgdHJhbnNhY3Rpb24gaWQpCisgKiAgIC0gb3IgYSByZXNwb25zZSAodGhyZWUgbnVtYmVycywgc3BhY2UsIHRyYW5zYWN0aW9uIGlkKQorICovCitzdHJ1Y3QgbXNnYiAqbWdjcF9oYW5kbGVfbWVzc2FnZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKyAgICAgICAgaW50IGNvZGU7CisJc3RydWN0IG1zZ2IgKnJlc3AgPSBOVUxMOworCisJaWYgKG1zZ2JfbDJsZW4obXNnKSA8IDQpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIm1ncyB0b28gc2hvcnQ6ICVkXG4iLCBtc2ctPmxlbik7CisJCXJldHVybiBOVUxMOworCX0KKworICAgICAgICAvKiBhdHRlbXB0IHRvIHRyZWF0IGl0IGFzIGEgcmVzcG9uc2UgKi8KKyAgICAgICAgaWYgKHNzY2FuZigoY29uc3QgY2hhciAqKSZtc2ctPmwyaFswXSwgIiUzZCAlKnMiLCAmY29kZSkgPT0gMSkgeworCQlMT0dQKERNR0NQLCBMT0dMX0RFQlVHLCAiUmVzcG9uc2U6IENvZGU6ICVkXG4iLCBjb2RlKTsKKwl9IGVsc2UgeworCQlpbnQgaSwgaGFuZGxlZCA9IDA7CisJCW1zZy0+bDNoID0gJm1zZy0+bDJoWzRdOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtZ2NwX3JlcXVlc3RzKTsgKytpKQorCQkJaWYgKHN0cm5jbXAobWdjcF9yZXF1ZXN0c1tpXS5uYW1lLCAoY29uc3QgY2hhciAqKSAmbXNnLT5sMmhbMF0sIDQpID09IDApIHsKKwkJCQloYW5kbGVkID0gMTsKKwkJCQlyZXNwID0gbWdjcF9yZXF1ZXN0c1tpXS5oYW5kbGVfcmVxdWVzdChjZmcsIG1zZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCWlmICghaGFuZGxlZCkgeworCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJNU0cgd2l0aCB0eXBlOiAnJS40cycgbm90IGhhbmRsZWRcbiIsICZtc2ctPmwyaFswXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzcDsKK30KKworLyogc3RyaW5nIHRva2VuaXplciBmb3IgdGhlIHBvb3IgKi8KK3N0YXRpYyBpbnQgZmluZF9tc2dfcG9pbnRlcnMoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IG1nY3BfbXNnX3B0ciAqcHRycywgaW50IHB0cnNfbGVuZ3RoKQoreworCWludCBpLCBmb3VuZCA9IDA7CisKKwlpbnQgd2hpdGVzcGFjZSA9IDE7CisJZm9yIChpID0gMDsgaSA8IG1zZ2JfbDNsZW4obXNnKSAmJiBwdHJzX2xlbmd0aCA+IDA7ICsraSkgeworCQkvKiBpZiB3ZSBoYXZlIGEgc3BhY2Ugd2UgZm91bmQgYW4gZW5kICovCisJCWlmIChtc2ctPmwzaFtpXQk9PSAnICcgfHwgbXNnLT5sM2hbaV0gPT0gJ1xyJyB8fCBtc2ctPmwzaFtpXSA9PSAnXG4nKSB7CisJCQlpZiAoIXdoaXRlc3BhY2UpIHsKKwkJCQkrK2ZvdW5kOworCQkJCXdoaXRlc3BhY2UgPSAxOworCQkJCXB0cnMtPmxlbmd0aCA9IGkgLSBwdHJzLT5zdGFydCAtIDE7CisJCQkJKytwdHJzOworCQkJCS0tcHRyc19sZW5ndGg7CisJCQl9IGVsc2UgeworCQkJICAgIC8qIHNraXAgYW55IG51bWJlciBvZiB3aGl0ZXNwYWNlICovCisJCQl9CisKKwkJCS8qIGxpbmUgZW5kLi4uIHN0b3AgKi8KKwkJCWlmIChtc2ctPmwzaFtpXSA9PSAnXHInIHx8IG1zZy0+bDNoW2ldID09ICdcbicpCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAobXNnLT5sM2hbaV0gPT0gJ1xyJyB8fCBtc2ctPmwzaFtpXSA9PSAnXG4nKSB7CisJCQkvKiBsaW5lIGVuZCwgYmUgZG9uZSAqLworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAod2hpdGVzcGFjZSkgeworCQkJd2hpdGVzcGFjZSA9IDA7CisJCQlwdHJzLT5zdGFydCA9IGk7CisJCX0KKwl9CisKKwlpZiAocHRyc19sZW5ndGggPT0gMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIHN0cnVjdCBtZ2NwX2VuZHBvaW50ICpmaW5kX2VuZHBvaW50KHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBjb25zdCBjaGFyICptZ2NwKQoreworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisJdW5zaWduZWQgaW50IGd3ID0gSU5UX01BWDsKKworCWd3ID0gc3RydG91bChtZ2NwLCAmZW5kcHRyLCAxNik7CisJaWYgKGd3ID09IDAgfHwgZ3cgPj0gY2ZnLT5udW1iZXJfZW5kcG9pbnRzIHx8IHN0cmNtcChlbmRwdHIsICJAbWd3IikgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiTm90IGFibGUgdG8gZmluZCBlbmRwb2ludDogJyVzJ1xuIiwgbWdjcCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAmY2ZnLT5lbmRwb2ludHNbZ3ddOworfQorCitpbnQgbWdjcF9hbmFseXplX2hlYWRlcihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZywKKwkJCXN0cnVjdCBtZ2NwX21zZ19wdHIgKnB0ciwgaW50IHNpemUsCisJCQljb25zdCBjaGFyICoqdHJhbnNhY3Rpb25faWQsIHN0cnVjdCBtZ2NwX2VuZHBvaW50ICoqZW5kcCkKK3sKKwlpbnQgZm91bmQ7CisKKwkqdHJhbnNhY3Rpb25faWQgPSAiMDAwMDAwIjsKKworCWlmIChzaXplIDwgMykgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiTm90IGVub3VnaCBzcGFjZSBpbiBwdHJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm91bmQgPSBmaW5kX21zZ19wb2ludGVycyhtc2csIHB0ciwgc2l6ZSk7CisKKwlpZiAoZm91bmQgPD0gMykgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiR2F0ZXdheTogTm90IGVub3VnaCBwYXJhbXMuIEZvdW5kOiAlZFxuIiwgZm91bmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiByZXBsYWNlIHRoZSBzcGFjZSB3aXRoIFwwLiB0aGUgbWFpbiBtZXRob2QgZ3VyYW50ZXNzIHRoYXQKKwkgKiB3ZSBzdGlsbCBoYXZlICsgMSBmb3IgbnVsbCB0ZXJtaW5hdGlvbgorCSAqLworCW1zZy0+bDNoW3B0clszXS5zdGFydCArIHB0clszXS5sZW5ndGggKyAxXSA9ICdcMCc7CisJbXNnLT5sM2hbcHRyWzJdLnN0YXJ0ICsgcHRyWzJdLmxlbmd0aCArIDFdID0gJ1wwJzsKKwltc2ctPmwzaFtwdHJbMV0uc3RhcnQgKyBwdHJbMV0ubGVuZ3RoICsgMV0gPSAnXDAnOworCW1zZy0+bDNoW3B0clswXS5zdGFydCArIHB0clswXS5sZW5ndGggKyAxXSA9ICdcMCc7CisKKwlpZiAoc3RybmNtcCgiMS4wIiwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzNdLnN0YXJ0XSwgMykgIT0gMAorCSAgICB8fCBzdHJuY21wKCJNR0NQIiwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzJdLnN0YXJ0XSwgNCkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiV3JvbmcgTUdDUCB2ZXJzaW9uLiBOb3QgaGFuZGxpbmc6ICclcycgJyVzJ1xuIiwKKwkJCShjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clszXS5zdGFydF0sCisJCQkoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbMl0uc3RhcnRdKTsKKwkJcmV0dXJuIC0xOworCX0KKworCSp0cmFuc2FjdGlvbl9pZCA9IChjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clswXS5zdGFydF07CisJaWYgKGVuZHApIHsKKwkJKmVuZHAgPSBmaW5kX2VuZHBvaW50KGNmZywgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzFdLnN0YXJ0XSk7CisJCXJldHVybiAqZW5kcCA9PSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfY2FsbF9pZChjb25zdCBzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCwKKwkJCSAgY29uc3QgY2hhciAqY2FsbGlkKQoreworCWlmIChzdHJjbXAoZW5kcC0+Y2FsbGlkLCBjYWxsaWQpICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkNhbGxJRHMgZG9lcyBub3QgbWF0Y2ggb24gMHgleC4gJyVzJyAhPSAnJXMnXG4iLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBlbmRwLT5jYWxsaWQsIGNhbGxpZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfY2koY29uc3Qgc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAsCisJCSAgICAgY29uc3QgY2hhciAqY2kpCit7CisJaWYgKGF0b2koY2kpICE9IGVuZHAtPmNpKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJDb25uZWN0aW9uSWRlbnRpZmllcnMgZG8gbm90IG1hdGNoIG9uIDB4JXguICVkICE9ICVzXG4iLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBlbmRwLT5jaSwgY2kpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2F1ZGl0X2VuZHBvaW50KHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBtZ2NwX21zZ19wdHIgZGF0YV9wdHJzWzZdOworCWludCBmb3VuZCwgcmVzcG9uc2U7CisJY29uc3QgY2hhciAqdHJhbnNfaWQ7CisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHA7CisKKwlmb3VuZCA9IG1nY3BfYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKKwlpZiAoZm91bmQgIT0gMCkKKwkgICAgcmVzcG9uc2UgPSA1MDA7CisJZWxzZQorCSAgICByZXNwb25zZSA9IDIwMDsKKworCXJldHVybiBjcmVhdGVfcmVzcG9uc2UocmVzcG9uc2UsICJBVUVQIiwgdHJhbnNfaWQpOworfQorCitzdGF0aWMgaW50IHBhcnNlX2Nvbm5fbW9kZShjb25zdCBjaGFyKiBtc2csIGludCAqY29ubl9tb2RlKQoreworCWludCByZXQgPSAwOworCWlmIChzdHJjbXAobXNnLCAicmVjdm9ubHkiKSA9PSAwKQorCQkqY29ubl9tb2RlID0gTUdDUF9DT05OX1JFQ1ZfT05MWTsKKwllbHNlIGlmIChzdHJjbXAobXNnLCAic2VuZHJlY3YiKSA9PSAwKQorCQkqY29ubl9tb2RlID0gTUdDUF9DT05OX1JFQ1ZfU0VORDsKKwllbHNlIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIlVua25vd24gY29ubmVjdGlvbiBtb2RlOiAnJXMnXG4iLCBtc2cpOworCQlyZXQgPSAtMTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9jcmVhdGVfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBtZ2NwX21zZ19wdHIgZGF0YV9wdHJzWzZdOworCWludCBmb3VuZCwgaSwgbGluZV9zdGFydDsKKwljb25zdCBjaGFyICp0cmFuc19pZDsKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKKwlpbnQgZXJyb3JfY29kZSA9IDUwMDsKKwlpbnQgcG9ydDsKKworCWZvdW5kID0gbWdjcF9hbmFseXplX2hlYWRlcihjZmcsIG1zZywgZGF0YV9wdHJzLCBBUlJBWV9TSVpFKGRhdGFfcHRycyksICZ0cmFuc19pZCwgJmVuZHApOworCWlmIChmb3VuZCAhPSAwKQorCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDUwMCwgIkNSQ1giLCB0cmFuc19pZCk7CisKKwlpZiAoZW5kcC0+Y2kgIT0gQ0lfVU5VU0VEKSB7CisJCWlmIChjZmctPmZvcmNlX3JlYWxsb2MpIHsKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRW5kcG9pbnQgMHgleCBhbHJlYWR5IGFsbG9jYXRlZC4gRm9yY2luZyByZWFsbG9jLlxuIiwKKwkJCSAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQkJbWdjcF9mcmVlX2VuZHAoZW5kcCk7CisJCX0gZWxzZSB7CisJCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRW5kcG9pbnQgaXMgYWxyZWFkeSB1c2VkLiAweCV4XG4iLAorCQkJICAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJDUkNYIiwgdHJhbnNfaWQpOworCQl9CisJfQorCisJLyogcGFyc2UgQ2FsbElEIEM6IGFuZCBMb2NhbFBhcmFtZXRlcnMgTDogKi8KKwlNU0dfVE9LRU5JWkVfU1RBUlQKKwlzd2l0Y2ggKG1zZy0+bDNoW2xpbmVfc3RhcnRdKSB7CisJY2FzZSAnTCc6CisJCWVuZHAtPmxvY2FsX29wdGlvbnMgPSB0YWxsb2Nfc3RyZHVwKGNmZy0+ZW5kcG9pbnRzLAorCQkJKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKTsKKwkJYnJlYWs7CisJY2FzZSAnQyc6CisJCWVuZHAtPmNhbGxpZCA9IHRhbGxvY19zdHJkdXAoY2ZnLT5lbmRwb2ludHMsCisJCQkoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pOworCQlicmVhazsKKwljYXNlICdNJzoKKwkJaWYgKHBhcnNlX2Nvbm5fbW9kZSgoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10sCisJCQkgICAgJmVuZHAtPmNvbm5fbW9kZSkgIT0gMCkgeworCQkgICAgZXJyb3JfY29kZSA9IDUxNzsKKwkJICAgIGdvdG8gZXJyb3IyOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiVW5oYW5kbGVkIG9wdGlvbjogJyVjJy8lZCBvbiAweCV4XG4iLAorCQkJbXNnLT5sM2hbbGluZV9zdGFydF0sIG1zZy0+bDNoW2xpbmVfc3RhcnRdLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJYnJlYWs7CisJfQorCU1TR19UT0tFTklaRV9FTkQKKworCS8qIGluaXRpYWxpemUgKi8KKwllbmRwLT5uZXRfcnRwID0gZW5kcC0+bmV0X3J0Y3AgPSBlbmRwLT5idHNfcnRwID0gZW5kcC0+YnRzX3J0Y3AgPSAwOworCisJLyogc2V0IHRvIHplcm8gdW50aWwgd2UgZ2V0IHRoZSBpbmZvICovCisJbWVtc2V0KCZlbmRwLT5yZW1vdGUsIDAsIHNpemVvZihlbmRwLT5yZW1vdGUpKTsKKworCS8qIGJpbmQgdG8gdGhlIHBvcnQgbm93ICovCisJcG9ydCA9IHJ0cF9jYWxjdWxhdGVfcG9ydChFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGNmZy0+cnRwX2Jhc2VfcG9ydCk7CisJaWYgKGNmZy0+ZWFybHlfYmluZCkKKwkJZW5kcC0+cnRwX3BvcnQgPSBwb3J0OworCWVsc2UgaWYgKG1nY3BfYmluZF9ydHBfcG9ydChlbmRwLCBwb3J0KSAhPSAwKQorCQlnb3RvIGVycm9yMjsKKworCS8qIGFzc2lnbiBhIGxvY2FsIGNhbGwgaWRlbnRpZmllciBvciBmYWlsICovCisJZW5kcC0+Y2kgPSBnZW5lcmF0ZV9jYWxsX2lkKGNmZyk7CisJaWYgKGVuZHAtPmNpID09IENJX1VOVVNFRCkKKwkJZ290byBlcnJvcjI7CisKKwllbmRwLT5idHNfcGF5bG9hZF90eXBlID0gY2ZnLT5hdWRpb19wYXlsb2FkOworCisJLyogcG9saWN5IENCICovCisJaWYgKGNmZy0+cG9saWN5X2NiKSB7CisJCXN3aXRjaCAoY2ZnLT5wb2xpY3lfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9DUkNYLCB0cmFuc19pZCkpIHsKKwkJY2FzZSBNR0NQX1BPTElDWV9SRUpFQ1Q6CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkNSQ1ggcmVqZWN0ZWQgYnkgcG9saWN5IG9uIDB4JXhcbiIsCisJCQkgICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCQltZ2NwX2ZyZWVfZW5kcChlbmRwKTsKKwkJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiQ1JDWCIsIHRyYW5zX2lkKTsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0RFRkVSOgorCQkJLyogc3RvcCBwcm9jZXNzaW5nICovCisJCQlyZXR1cm4gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0NPTlQ6CisJCQkvKiBqdXN0IGNvbnRpbnVlICovCisJCQlicmVhazsKKwkJfQorCX0KKworCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiQ3JlYXRpbmcgZW5kcG9pbnQgb246IDB4JXggQ0k6ICV1IHBvcnQ6ICV1XG4iLAorCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGVuZHAtPmNpLCBlbmRwLT5ydHBfcG9ydCk7CisJaWYgKGNmZy0+Y2hhbmdlX2NiKQorCQljZmctPmNoYW5nZV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX0NSQ1gsIGVuZHAtPnJ0cF9wb3J0KTsKKworCXJldHVybiBjcmVhdGVfcmVzcG9uc2Vfd2l0aF9zZHAoZW5kcCwgIkNSQ1giLCB0cmFuc19pZCk7CitlcnJvcjoKKwlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiTWFsZm9ybWVkIGxpbmU6ICVzIG9uIDB4JXggd2l0aDogbGluZV9zdGFydDogJWQgJWRcbiIsCisJCSAgICBoZXhkdW1wKG1zZy0+bDNoLCBtc2diX2wzbGVuKG1zZykpLAorCQkgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBsaW5lX3N0YXJ0LCBpKTsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJDUkNYIiwgdHJhbnNfaWQpOworCitlcnJvcjI6CisJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJSZXNvdXJjZSBlcnJvciBvbiAweCV4XG4iLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkNSQ1giLCB0cmFuc19pZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX21vZGlmeV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IG1nY3BfbXNnX3B0ciBkYXRhX3B0cnNbNl07CisJaW50IGZvdW5kLCBpLCBsaW5lX3N0YXJ0OworCWNvbnN0IGNoYXIgKnRyYW5zX2lkOworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwOworCWludCBlcnJvcl9jb2RlID0gNTAwOworCWludCBzaWxlbnQgPSAwOworCisJZm91bmQgPSBtZ2NwX2FuYWx5emVfaGVhZGVyKGNmZywgbXNnLCBkYXRhX3B0cnMsIEFSUkFZX1NJWkUoZGF0YV9wdHJzKSwgJnRyYW5zX2lkLCAmZW5kcCk7CisJaWYgKGZvdW5kICE9IDApCisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIk1EQ1giLCB0cmFuc19pZCk7CisKKwlpZiAoZW5kcC0+Y2kgPT0gQ0lfVU5VU0VEKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJFbmRwb2ludCBpcyBub3QgaG9sZGluZyBhIGNvbm5lY3Rpb24uIDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIk1EQ1giLCB0cmFuc19pZCk7CisJfQorCisJTVNHX1RPS0VOSVpFX1NUQVJUCisJc3dpdGNoIChtc2ctPmwzaFtsaW5lX3N0YXJ0XSkgeworCWNhc2UgJ0MnOiB7CisJCWlmICh2ZXJpZnlfY2FsbF9pZChlbmRwLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pICE9IDApCisJCQlnb3RvIGVycm9yMzsKKwkJYnJlYWs7CisJfQorCWNhc2UgJ0knOiB7CisJCWlmICh2ZXJpZnlfY2koZW5kcCwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSAhPSAwKQorCQkJZ290byBlcnJvcjM7CisJCWJyZWFrOworCX0KKwljYXNlICdMJzoKKwkJLyogc2tpcCAqLworCQlicmVhazsKKwljYXNlICdNJzoKKwkJaWYgKHBhcnNlX2Nvbm5fbW9kZSgoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10sCisJCQkgICAgJmVuZHAtPmNvbm5fbW9kZSkgIT0gMCkgeworCQkgICAgZXJyb3JfY29kZSA9IDUxNzsKKwkJICAgIGdvdG8gZXJyb3IzOworCQl9CisJCWJyZWFrOworCWNhc2UgJ1onOgorCQlzaWxlbnQgPSBzdHJjbXAoIm5vYW5zd2VyIiwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSA9PSAwOworCQlicmVhazsKKwljYXNlICdcMCc6CisJCS8qIFNEUCBmaWxlIGJlZ2lucyAqLworCQlicmVhazsKKwljYXNlICdhJzoKKwljYXNlICdvJzoKKwljYXNlICdzJzoKKwljYXNlICd0JzoKKwljYXNlICd2JzoKKwkJLyogc2tpcCB0aGVzZSBTRFAgYXR0cmlidXRlcyAqLworCQlicmVhazsKKwljYXNlICdtJzogeworCQlpbnQgcG9ydDsKKwkJaW50IHBheWxvYWQ7CisJCWNvbnN0IGNoYXIgKnBhcmFtID0gKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydF07CisKKwkJaWYgKHNzY2FuZihwYXJhbSwgIm09YXVkaW8gJWQgUlRQL0FWUCAlZCIsICZwb3J0LCAmcGF5bG9hZCkgPT0gMikgeworCQkJZW5kcC0+bmV0X3J0cCA9IGh0b25zKHBvcnQpOworCQkJZW5kcC0+bmV0X3J0Y3AgPSBodG9ucyhwb3J0ICsgMSk7CisJCQllbmRwLT5uZXRfcGF5bG9hZF90eXBlID0gcGF5bG9hZDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSAnYyc6IHsKKwkJY2hhciBpcHY0WzE2XTsKKwkJY29uc3QgY2hhciAqcGFyYW0gPSAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0XTsKKworCQlpZiAoc3NjYW5mKHBhcmFtLCAiYz1JTiBJUDQgJTE1cyIsIGlwdjQpID09IDEpIHsKKwkJCWluZXRfYXRvbihpcHY0LCAmZW5kcC0+cmVtb3RlKTsKKwkJfQorCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJVbmhhbmRsZWQgb3B0aW9uOiAnJWMnLyVkIG9uIDB4JXhcbiIsCisJCQltc2ctPmwzaFtsaW5lX3N0YXJ0XSwgbXNnLT5sM2hbbGluZV9zdGFydF0sCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlicmVhazsKKwl9CisJTVNHX1RPS0VOSVpFX0VORAorCisJLyogcG9saWN5IENCICovCisJaWYgKGNmZy0+cG9saWN5X2NiKSB7CisJCXN3aXRjaCAoY2ZnLT5wb2xpY3lfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9NRENYLCB0cmFuc19pZCkpIHsKKwkJY2FzZSBNR0NQX1BPTElDWV9SRUpFQ1Q6CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIk1EQ1ggcmVqZWN0ZWQgYnkgcG9saWN5IG9uIDB4JXhcbiIsCisJCQkgICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCQlpZiAoc2lsZW50KQorCQkJCWdvdG8gb3V0X3NpbGVudDsKKwkJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiTURDWCIsIHRyYW5zX2lkKTsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0RFRkVSOgorCQkJLyogc3RvcCBwcm9jZXNzaW5nICovCisJCQlyZXR1cm4gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0NPTlQ6CisJCQkvKiBqdXN0IGNvbnRpbnVlICovCisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIG1vZGlmeSAqLworCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiTW9kaWZpZWQgZW5kcG9pbnQgb246IDB4JXggU2VydmVyOiAlczoldVxuIiwKKwkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBpbmV0X250b2EoZW5kcC0+cmVtb3RlKSwgbnRvaHMoZW5kcC0+bmV0X3J0cCkpOworCWlmIChjZmctPmNoYW5nZV9jYikKKwkJY2ZnLT5jaGFuZ2VfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9NRENYLCBlbmRwLT5ydHBfcG9ydCk7CisJaWYgKHNpbGVudCkKKwkJZ290byBvdXRfc2lsZW50OworCisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZV93aXRoX3NkcChlbmRwLCAiTURDWCIsIHRyYW5zX2lkKTsKKworZXJyb3I6CisJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIk1hbGZvcm1lZCBsaW5lOiAlcyBvbiAweCV4IHdpdGg6IGxpbmVfc3RhcnQ6ICVkICVkICVkXG4iLAorCQkgICAgaGV4ZHVtcChtc2ctPmwzaCwgbXNnYl9sM2xlbihtc2cpKSwKKwkJICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSwgbGluZV9zdGFydCwgaSwgbXNnLT5sM2hbbGluZV9zdGFydF0pOworCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIk1EQ1giLCB0cmFuc19pZCk7CisKK2Vycm9yMzoKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJNRENYIiwgdHJhbnNfaWQpOworCisKK291dF9zaWxlbnQ6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2RlbGV0ZV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IG1nY3BfbXNnX3B0ciBkYXRhX3B0cnNbNl07CisJaW50IGZvdW5kLCBpLCBsaW5lX3N0YXJ0OworCWNvbnN0IGNoYXIgKnRyYW5zX2lkOworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwOworCWludCBlcnJvcl9jb2RlID0gNTAwOworCWludCBzaWxlbnQgPSAwOworCisJZm91bmQgPSBtZ2NwX2FuYWx5emVfaGVhZGVyKGNmZywgbXNnLCBkYXRhX3B0cnMsIEFSUkFZX1NJWkUoZGF0YV9wdHJzKSwgJnRyYW5zX2lkLCAmZW5kcCk7CisJaWYgKGZvdW5kICE9IDApCisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkRMQ1giLCB0cmFuc19pZCk7CisKKwlpZiAoZW5kcC0+Y2kgPT0gQ0lfVU5VU0VEKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJFbmRwb2ludCBpcyBub3QgdXNlZC4gMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiRExDWCIsIHRyYW5zX2lkKTsKKwl9CisKKwlNU0dfVE9LRU5JWkVfU1RBUlQKKwlzd2l0Y2ggKG1zZy0+bDNoW2xpbmVfc3RhcnRdKSB7CisJY2FzZSAnQyc6IHsKKwkJaWYgKHZlcmlmeV9jYWxsX2lkKGVuZHAsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSkgIT0gMCkKKwkJCWdvdG8gZXJyb3IzOworCQlicmVhazsKKwl9CisJY2FzZSAnSSc6IHsKKwkJaWYgKHZlcmlmeV9jaShlbmRwLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pICE9IDApCisJCQlnb3RvIGVycm9yMzsKKwkJYnJlYWs7CisJY2FzZSAnWic6CisJCXNpbGVudCA9IHN0cmNtcCgibm9hbnN3ZXIiLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pID09IDA7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIlVuaGFuZGxlZCBvcHRpb246ICclYycvJWQgb24gMHgleFxuIiwKKwkJCW1zZy0+bDNoW2xpbmVfc3RhcnRdLCBtc2ctPmwzaFtsaW5lX3N0YXJ0XSwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWJyZWFrOworCX0KKwlNU0dfVE9LRU5JWkVfRU5ECisKKwkvKiBwb2xpY3kgQ0IgKi8KKwlpZiAoY2ZnLT5wb2xpY3lfY2IpIHsKKwkJc3dpdGNoIChjZmctPnBvbGljeV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX0RMQ1gsIHRyYW5zX2lkKSkgeworCQljYXNlIE1HQ1BfUE9MSUNZX1JFSkVDVDoKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRExDWCByZWplY3RlZCBieSBwb2xpY3kgb24gMHgleFxuIiwKKwkJCSAgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJCWlmIChzaWxlbnQpCisJCQkJZ290byBvdXRfc2lsZW50OworCQkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJETENYIiwgdHJhbnNfaWQpOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfREVGRVI6CisJCQkvKiBzdG9wIHByb2Nlc3NpbmcgKi8KKwkJCXJldHVybiBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfQ09OVDoKKwkJCS8qIGp1c3QgY29udGludWUgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogZnJlZSB0aGUgY29ubmVjdGlvbiAqLworCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRGVsZXRlZCBlbmRwb2ludCBvbjogMHgleCBTZXJ2ZXI6ICVzOiV1XG4iLAorCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGluZXRfbnRvYShlbmRwLT5yZW1vdGUpLCBudG9ocyhlbmRwLT5uZXRfcnRwKSk7CisJbWdjcF9mcmVlX2VuZHAoZW5kcCk7CisJaWYgKGNmZy0+Y2hhbmdlX2NiKQorCQljZmctPmNoYW5nZV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX0RMQ1gsIGVuZHAtPnJ0cF9wb3J0KTsKKworCWlmIChzaWxlbnQpCisJCWdvdG8gb3V0X3NpbGVudDsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDI1MCwgIkRMQ1giLCB0cmFuc19pZCk7CisKK2Vycm9yOgorCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJNYWxmb3JtZWQgbGluZTogJXMgb24gMHgleCB3aXRoOiBsaW5lX3N0YXJ0OiAlZCAlZFxuIiwKKwkJICAgIGhleGR1bXAobXNnLT5sM2gsIG1zZ2JfbDNsZW4obXNnKSksCisJCSAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGxpbmVfc3RhcnQsIGkpOworCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkRMQ1giLCB0cmFuc19pZCk7CisKK2Vycm9yMzoKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJETENYIiwgdHJhbnNfaWQpOworCitvdXRfc2lsZW50OgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9yc2lwKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWlmIChjZmctPnJlc2V0X2NiKQorCQljZmctPnJlc2V0X2NiKGNmZyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBtZ2NwX2NvbmZpZyAqbWdjcF9jb25maWdfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZzsKKworCWNmZyA9IHRhbGxvY196ZXJvKE5VTEwsIHN0cnVjdCBtZ2NwX2NvbmZpZyk7CisJaWYgKCFjZmcpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjb25maWcuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY2ZnLT5zb3VyY2VfcG9ydCA9IDI0Mjc7CisJY2ZnLT5zb3VyY2VfYWRkciA9IHRhbGxvY19zdHJkdXAoY2ZnLCAiMC4wLjAuMCIpOworCWNmZy0+YXVkaW9fbmFtZSA9IHRhbGxvY19zdHJkdXAoY2ZnLCAiR1NNLUVGUi84MDAwIik7CisJY2ZnLT5hdWRpb19wYXlsb2FkID0gOTc7CisJY2ZnLT5ydHBfYmFzZV9wb3J0ID0gUlRQX1BPUlRfREVGQVVMVDsKKworCXJldHVybiBjZmc7Cit9CisKK2ludCBtZ2NwX2VuZHBvaW50c19hbGxvY2F0ZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZykKK3sKKwlpbnQgaTsKKworCS8qIEluaXRpYWxpemUgYWxsIGVuZHBvaW50cyAqLworCWNmZy0+ZW5kcG9pbnRzID0gX3RhbGxvY196ZXJvX2FycmF5KGNmZywKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtZ2NwX2VuZHBvaW50KSwKKwkJCQkgICAgICAgY2ZnLT5udW1iZXJfZW5kcG9pbnRzLCAiZW5kcG9pbnRzIik7CisJaWYgKCFjZmctPmVuZHBvaW50cykKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKSB7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLmxvY2FsX3J0cC5mZCA9IC0xOworCQljZmctPmVuZHBvaW50c1tpXS5sb2NhbF9ydGNwLmZkID0gLTE7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLmNpID0gQ0lfVU5VU0VEOworCQljZmctPmVuZHBvaW50c1tpXS5jZmcgPSBjZmc7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLm5ldF9wYXlsb2FkX3R5cGUgPSAtMTsKKwkJY2ZnLT5lbmRwb2ludHNbaV0uYnRzX3BheWxvYWRfdHlwZSA9IC0xOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIG1nY3BfZnJlZV9lbmRwKHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKQoreworCUxPR1AoRE1HQ1AsIExPR0xfREVCVUcsICJEZWxldGluZyBlbmRwb2ludCBvbjogMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwllbmRwLT5jaT0gQ0lfVU5VU0VEOworCisJaWYgKGVuZHAtPmNhbGxpZCkgeworCQl0YWxsb2NfZnJlZShlbmRwLT5jYWxsaWQpOworCQllbmRwLT5jYWxsaWQgPSBOVUxMOworCX0KKworCWlmIChlbmRwLT5sb2NhbF9vcHRpb25zKSB7CisJCXRhbGxvY19mcmVlKGVuZHAtPmxvY2FsX29wdGlvbnMpOworCQllbmRwLT5sb2NhbF9vcHRpb25zID0gTlVMTDsKKwl9CisKKwlpZiAoIWVuZHAtPmNmZy0+ZWFybHlfYmluZCkgeworCQlic2NfdW5yZWdpc3Rlcl9mZCgmZW5kcC0+bG9jYWxfcnRwKTsKKwkJYnNjX3VucmVnaXN0ZXJfZmQoJmVuZHAtPmxvY2FsX3J0Y3ApOworCX0KKworCWVuZHAtPm5ldF9ydHAgPSBlbmRwLT5uZXRfcnRjcCA9IGVuZHAtPmJ0c19ydHAgPSBlbmRwLT5idHNfcnRjcCA9IDA7CisJZW5kcC0+bmV0X3BheWxvYWRfdHlwZSA9IGVuZHAtPmJ0c19wYXlsb2FkX3R5cGUgPSAtMTsKKwllbmRwLT5pbl9idHMgPSBlbmRwLT5pbl9yZW1vdGUgPSAwOworCW1lbXNldCgmZW5kcC0+cmVtb3RlLCAwLCBzaXplb2YoZW5kcC0+cmVtb3RlKSk7CisJbWVtc2V0KCZlbmRwLT5idHMsIDAsIHNpemVvZihlbmRwLT5idHMpKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21nY3AvbWdjcF92dHkuYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF92dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjkwZDUyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Z0eS5jCkBAIC0wLDAgKzEsMzU0IEBACisvKiBBIE1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCBNZWRpYSBHYXRld2F5OiBSRkMgMzQzNSAqLworLyogVGhlIHByb3RvY29sIGltcGxlbWVudGF0aW9uICovCisKKy8qCisgKiAoQykgMjAwOS0yMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LTIwMTAgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3BfaW50ZXJuYWwuaD4KKworI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBzdHJ1Y3QgbWdjcF9jb25maWcgKmdfY2ZnID0gTlVMTDsKKworLyoKKyAqIHZ0eSBjb2RlIGZvciBtZ2NwIGJlbG93CisgKi8KK3N0cnVjdCBjbWRfbm9kZSBtZ2NwX25vZGUgPSB7CisJTUdDUF9OT0RFLAorCSIlcyhtZ2NwKSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9tZ2NwKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgIm1nY3AlcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmxvY2FsX2lwKQorCQl2dHlfb3V0KHZ0eSwgIiAgbG9jYWwgaXAgJXMlcyIsIGdfY2ZnLT5sb2NhbF9pcCwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+YnRzX2lwICYmIHN0cmxlbihnX2NmZy0+YnRzX2lwKSAhPSAwKQorCQl2dHlfb3V0KHZ0eSwgIiAgYnRzIGlwICVzJXMiLCBnX2NmZy0+YnRzX2lwLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJpbmQgaXAgJXMlcyIsIGdfY2ZnLT5zb3VyY2VfYWRkciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiaW5kIHBvcnQgJXUlcyIsIGdfY2ZnLT5zb3VyY2VfcG9ydCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiaW5kIGVhcmx5ICV1JXMiLCAhIWdfY2ZnLT5lYXJseV9iaW5kLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHJ0cCBiYXNlICV1JXMiLCBnX2NmZy0+cnRwX2Jhc2VfcG9ydCwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+YXVkaW9fcGF5bG9hZCAhPSAtMSkKKwkJdnR5X291dCh2dHksICIgIHNkcCBhdWRpbyBwYXlsb2FkIG51bWJlciAlZCVzIiwgZ19jZmctPmF1ZGlvX3BheWxvYWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmF1ZGlvX25hbWUpCisJCXZ0eV9vdXQodnR5LCAiICBzZHAgYXVkaW8gcGF5bG9hZCBuYW1lICVzJXMiLCBnX2NmZy0+YXVkaW9fbmFtZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBsb29wICV1JXMiLCAhIWdfY2ZnLT5hdWRpb19sb29wLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIG51bWJlciBlbmRwb2ludHMgJXUlcyIsIGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzIC0gMSwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+Zm9yd2FyZF9pcCkKKwkJdnR5X291dCh2dHksICIgIGZvcndhcmQgYXVkaW8gaXAgJXMlcyIsIGdfY2ZnLT5mb3J3YXJkX2lwLCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5mb3J3YXJkX3BvcnQgIT0gMCkKKwkJdnR5X291dCh2dHksICIgIGZvcndhcmQgYXVkaW8gcG9ydCAlZCVzIiwgZ19jZmctPmZvcndhcmRfcG9ydCwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+Y2FsbF9hZ2VudF9hZGRyKQorCQl2dHlfb3V0KHZ0eSwgIiAgY2FsbCBhZ2VudCBpcCAlcyVzIiwgZ19jZmctPmNhbGxfYWdlbnRfYWRkciwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X21jZ3AsIHNob3dfbWdjcF9jbWQsICJzaG93IG1nY3AiLAorICAgICAgU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE1HQ1AgTWVkaWEgR2F0ZXdheSIpCit7CisJaW50IGk7CisKKwl2dHlfb3V0KHZ0eSwgIk1HQ1AgaXMgdXAgYW5kIHJ1bm5pbmcgd2l0aCAldSBlbmRwb2ludHM6JXMiLCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50cyAtIDEsIFZUWV9ORVdMSU5FKTsKKwlmb3IgKGkgPSAxOyBpIDwgZ19jZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkgeworCQlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCA9ICZnX2NmZy0+ZW5kcG9pbnRzW2ldOworCQl2dHlfb3V0KHZ0eSwgIiBFbmRwb2ludCAweCUuMng6IENJOiAlZCBuZXQ6ICV1LyV1IGJ0czogJXUvJXUgb24gJXMgdHJhZmZpYyByZWNlaXZlZCBidHM6ICV1ICByZW1vdGU6ICV1JXMiLAorCQkJaSwgZW5kcC0+Y2ksCisJCQludG9ocyhlbmRwLT5uZXRfcnRwKSwgbnRvaHMoZW5kcC0+bmV0X3J0Y3ApLAorCQkJbnRvaHMoZW5kcC0+YnRzX3J0cCksIG50b2hzKGVuZHAtPmJ0c19ydGNwKSwKKwkJCWluZXRfbnRvYShlbmRwLT5idHMpLCBlbmRwLT5pbl9idHMsIGVuZHAtPmluX3JlbW90ZSwKKwkJCVZUWV9ORVdMSU5FKTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwLAorICAgICAgY2ZnX21nY3BfY21kLAorICAgICAgIm1nY3AiLAorICAgICAgIkNvbmZpZ3VyZSB0aGUgTUdDUCIpCit7CisJdnR5LT5ub2RlID0gTUdDUF9OT0RFOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfbG9jYWxfaXAsCisgICAgICBjZmdfbWdjcF9sb2NhbF9pcF9jbWQsCisgICAgICAibG9jYWwgaXAgSVAiLAorICAgICAgIlNldCB0aGUgSVAgdG8gYmUgdXNlZCBpbiBTRFAgcmVjb3JkcyIpCit7CisJaWYgKGdfY2ZnLT5sb2NhbF9pcCkKKwkJdGFsbG9jX2ZyZWUoZ19jZmctPmxvY2FsX2lwKTsKKwlnX2NmZy0+bG9jYWxfaXAgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2J0c19pcCwKKyAgICAgIGNmZ19tZ2NwX2J0c19pcF9jbWQsCisgICAgICAiYnRzIGlwIElQIiwKKyAgICAgICJTZXQgdGhlIElQIG9mIHRoZSBCVFMgZm9yIFJUUCBmb3J3YXJkaW5nIikKK3sKKwlpZiAoZ19jZmctPmJ0c19pcCkKKwkJdGFsbG9jX2ZyZWUoZ19jZmctPmJ0c19pcCk7CisJZ19jZmctPmJ0c19pcCA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCWluZXRfYXRvbihnX2NmZy0+YnRzX2lwLCAmZ19jZmctPmJ0c19pbik7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9iaW5kX2lwLAorICAgICAgY2ZnX21nY3BfYmluZF9pcF9jbWQsCisgICAgICAiYmluZCBpcCBJUCIsCisgICAgICAiQmluZCB0aGUgTUdDUCB0byB0aGlzIGxvY2FsIGFkZHIiKQoreworCWlmIChnX2NmZy0+c291cmNlX2FkZHIpCisJCXRhbGxvY19mcmVlKGdfY2ZnLT5zb3VyY2VfYWRkcik7CisJZ19jZmctPnNvdXJjZV9hZGRyID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9iaW5kX3BvcnQsCisgICAgICBjZmdfbWdjcF9iaW5kX3BvcnRfY21kLAorICAgICAgImJpbmQgcG9ydCA8MC02NTUzND4iLAorICAgICAgIkJpbmQgdGhlIE1HQ1AgdG8gdGhpcyBwb3J0IikKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IGF0b2koYXJndlswXSk7CisJaWYgKHBvcnQgPiA2NTUzNCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIHdyb25nIGJpbmQgcG9ydCAnJXMnJXMiLCBhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlnX2NmZy0+c291cmNlX3BvcnQgPSBwb3J0OworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfYmluZF9lYXJseSwKKyAgICAgIGNmZ19tZ2NwX2JpbmRfZWFybHlfY21kLAorICAgICAgImJpbmQgZWFybHkgKDB8MSkiLAorICAgICAgIkJpbmQgYWxsIFJUUCBwb3J0cyBlYXJseSIpCit7CisJdW5zaWduZWQgaW50IGJpbmQgPSBhdG9pKGFyZ3ZbMF0pOworCWlmIChiaW5kICE9IDAgJiYgYmluZCAhPSAxKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgcGFyYW0gbXVzdCBiZSAwIG9yIDEuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlnX2NmZy0+ZWFybHlfYmluZCA9IGJpbmQgPT0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX3J0cF9iYXNlX3BvcnQsCisgICAgICBjZmdfbWdjcF9ydHBfYmFzZV9wb3J0X2NtZCwKKyAgICAgICJydHAgYmFzZSA8MC02NTUzND4iLAorICAgICAgIkJhc2UgcG9ydCB0byB1c2UiKQoreworCXVuc2lnbmVkIGludCBwb3J0ID0gYXRvaShhcmd2WzBdKTsKKwlpZiAocG9ydCA+IDY1NTM0KSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgd3JvbmcgYmFzZSBwb3J0ICclcyclcyIsIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWdfY2ZnLT5ydHBfYmFzZV9wb3J0ID0gcG9ydDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX3NkcF9wYXlsb2FkX251bWJlciwKKyAgICAgIGNmZ19tZ2NwX3NkcF9wYXlsb2FkX251bWJlcl9jbWQsCisgICAgICAic2RwIGF1ZGlvIHBheWxvYWQgbnVtYmVyIDwxLTI1NT4iLAorICAgICAgIlNldCB0aGUgYXVkaW8gY29kZWMgdG8gdXNlIikKK3sKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZCA9IGF0b2koYXJndlswXSk7CisJaWYgKHBheWxvYWQgPiAyNTUpIHsKKwkJdnR5X291dCh2dHksICIlJSB3cm9uZyBwYXlsb2FkIG51bWJlciAnJXMnJXMiLCBhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlnX2NmZy0+YXVkaW9fcGF5bG9hZCA9IHBheWxvYWQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9zZHBfcGF5bG9hZF9uYW1lLAorICAgICAgY2ZnX21nY3Bfc2RwX3BheWxvYWRfbmFtZV9jbWQsCisgICAgICAic2RwIGF1ZGlvIHBheWxvYWQgbmFtZSBOQU1FIiwKKyAgICAgICJTZXQgdGhlIGF1ZGlvIG5hbWUgdG8gdXNlIikKK3sKKwlpZiAoZ19jZmctPmF1ZGlvX25hbWUpCisJCXRhbGxvY19mcmVlKGdfY2ZnLT5hdWRpb19uYW1lKTsKKwlnX2NmZy0+YXVkaW9fbmFtZSA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfbG9vcCwKKyAgICAgIGNmZ19tZ2NwX2xvb3BfY21kLAorICAgICAgImxvb3AgKDB8MSkiLAorICAgICAgIkxvb3AgdGhlIGF1ZGlvIikKK3sKKwlnX2NmZy0+YXVkaW9fbG9vcCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9udW1iZXJfZW5kcCwKKyAgICAgIGNmZ19tZ2NwX251bWJlcl9lbmRwX2NtZCwKKyAgICAgICJudW1iZXIgZW5kcG9pbnRzIDwwLTY1NTM0PiIsCisgICAgICAiVGhlIG51bWJlciBvZiBlbmRwb2ludHMgdG8gYWxsb2NhdGUuIFRoaXMgaXMgbm90IGR5bmFtaWMuIikKK3sKKwkvKiArIDEgYXMgd2Ugc3RhcnQgY291bnRpbmcgYXQgb25lICovCisJZ19jZmctPm51bWJlcl9lbmRwb2ludHMgPSBhdG9pKGFyZ3ZbMF0pICsgMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2ZvcndhcmRfaXAsCisgICAgICBjZmdfbWdjcF9mb3J3YXJkX2lwX2NtZCwKKyAgICAgICJmb3J3YXJkIGF1ZGlvIGlwIElQIiwKKyAgICAgICJGb3J3YXJkIHBhY2tldHMgZnJvbSBhbmQgdG8gdGhlIElQLiBUaGlzIGRpc2FibGVzIG1vc3Qgb2YgdGhlIE1HQ1AgZmVhdHVyZS4iKQoreworCWlmIChnX2NmZy0+Zm9yd2FyZF9pcCkKKwkJdGFsbG9jX2ZyZWUoZ19jZmctPmZvcndhcmRfaXApOworCWdfY2ZnLT5mb3J3YXJkX2lwID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9mb3J3YXJkX3BvcnQsCisgICAgICBjZmdfbWdjcF9mb3J3YXJkX3BvcnRfY21kLAorICAgICAgImZvcndhcmQgYXVkaW8gcG9ydCA8MS0xNTAwMD4iLAorICAgICAgIkZvcndhcmQgcGFja2V0cyBmcm9tIGFuZCB0byB0aGUgcG9ydC4gVGhpcyBkaXNhYmxlcyBtb3N0IG9mIHRoZSBNR0NQIGZlYXR1cmUuIikKK3sKKwlnX2NmZy0+Zm9yd2FyZF9wb3J0ID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2FnZW50X2FkZHIsCisgICAgICBjZmdfbWdjcF9hZ2VudF9hZGRyX2NtZCwKKyAgICAgICJjYWxsIGFnZW50IGlwIElQIiwKKyAgICAgICJTZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGwgYWdlbnQuIikKK3sKKwlpZiAoZ19jZmctPmNhbGxfYWdlbnRfYWRkcikKKwkJdGFsbG9jX2ZyZWUoZ19jZmctPmNhbGxfYWdlbnRfYWRkcik7CisJZ19jZmctPmNhbGxfYWdlbnRfYWRkciA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworaW50IG1nY3BfdnR5X2luaXQodm9pZCkKK3sKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19tZ2NwX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfbWdjcF9jbWQpOworCWluc3RhbGxfbm9kZSgmbWdjcF9ub2RlLCBjb25maWdfd3JpdGVfbWdjcCk7CisJaW5zdGFsbF9kZWZhdWx0KE1HQ1BfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2xvY2FsX2lwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2J0c19pcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9iaW5kX2lwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2JpbmRfcG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9iaW5kX2Vhcmx5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX3J0cF9iYXNlX3BvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3Bfc2RwX3BheWxvYWRfbnVtYmVyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX3NkcF9wYXlsb2FkX25hbWVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfbG9vcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9udW1iZXJfZW5kcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9mb3J3YXJkX2lwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2ZvcndhcmRfcG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9hZ2VudF9hZGRyX2NtZCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtZ2NwX3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICpjb25maWdfZmlsZSwgc3RydWN0IG1nY3BfY29uZmlnICpjZmcpCit7CisJaW50IGksIHJjOworCisJZ19jZmcgPSBjZmc7CisJcmMgPSB2dHlfcmVhZF9jb25maWdfZmlsZShjb25maWdfZmlsZSk7CisJaWYgKHJjIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSB0aGUgY29uZmlnIGZpbGU6ICclcydcbiIsIGNvbmZpZ19maWxlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCisJaWYgKCFnX2NmZy0+YnRzX2lwKQorCQlmcHJpbnRmKHN0ZGVyciwgIk5vIEJUUyBpcCBhZGRyZXNzIHNwZWNpZmllZC4gVGhpcyB3aWxsIGFsbG93IGV2ZXJ5b25lIHRvIGNvbm5lY3QuXG4iKTsKKworCWlmICghZ19jZmctPnNvdXJjZV9hZGRyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiWW91IG5lZWQgdG8gc3BlY2lmeSBhIGJpbmQgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG1nY3BfZW5kcG9pbnRzX2FsbG9jYXRlKGdfY2ZnKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGVuZHBvaW50czogJWQuIFF1aXR0aW5nLlxuIiwgZ19jZmctPm51bWJlcl9lbmRwb2ludHMpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBUaGlzIGFwcGxpY2F0aW9uIHN1cHBvcnRzIHR3byBtb2Rlcy4KKwkgKiAgICAxLikgYSB0cnVlIE1HQ1AgZ2F0ZXdheSB3aXRoIHN1cHBvcnQgZm9yIEFVRVAsIENSQ1gsIE1EQ1gsIERMQ1gKKwkgKiAgICAyLikgcGxhaW4gZm9yd2FyZGluZyBvZiBSVFAgcGFja2V0cyBvbiB0aGUgZW5kcG9pbnRzLgorCSAqIGJvdGggbW9kZXMgYXJlIG11dHVhbCBleGNsdXNpdmUKKwkgKi8KKwlpZiAoZ19jZmctPmZvcndhcmRfaXApIHsKKwkJaW50IHBvcnQgPSBnX2NmZy0+cnRwX2Jhc2VfcG9ydDsKKwkJaWYgKGdfY2ZnLT5mb3J3YXJkX3BvcnQgIT0gMCkKKwkJCXBvcnQgPSBnX2NmZy0+Zm9yd2FyZF9wb3J0OworCisJCWlmICghZ19jZmctPmVhcmx5X2JpbmQpIHsKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRm9yd2FyZGluZyByZXF1aXJlcyBlYXJseSBiaW5kLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKgorCQkgKiBTdG9yZSB0aGUgZm9yd2FyZCBJUCBhbmQgYXNzaWduIGEgY2kuIEZvciBlYXJseSBiaW5kCisJCSAqIHRoZSBzb2NrZXRzIHdpbGwgYmUgY3JlYXRlZCBhZnRlciB0aGlzLgorCQkgKi8KKwkJZm9yIChpID0gMTsgaSA8IGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpIHsKKwkJCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwID0gJmdfY2ZnLT5lbmRwb2ludHNbaV07CisJCQlpbmV0X2F0b24oZ19jZmctPmZvcndhcmRfaXAsICZlbmRwLT5yZW1vdGUpOworCQkJZW5kcC0+Y2kgPSBDSV9VTlVTRUQgKyAyMzsKKwkJCWVuZHAtPm5ldF9ydHAgPSBodG9ucyhydHBfY2FsY3VsYXRlX3BvcnQoRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBwb3J0KSk7CisJCQllbmRwLT5uZXRfcnRjcCA9IGh0b25zKHJ0cF9jYWxjdWxhdGVfcG9ydChFTkRQT0lOVF9OVU1CRVIoZW5kcCksIHBvcnQpICsgMSk7CisJCX0KKworCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkNvbmZpZ3VyZWQgZm9yIEF1ZGlvIEZvcndhcmRpbmcuXG4iKTsKKwl9CisKKwkvKiBlYXJseSBiaW5kICovCisJaWYgKGdfY2ZnLT5lYXJseV9iaW5kKSB7CisJCWZvciAoaSA9IDE7IGkgPCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKSB7CisJCQlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCA9ICZnX2NmZy0+ZW5kcG9pbnRzW2ldOworCQkJaW50IHJ0cF9wb3J0OworCisJCQlydHBfcG9ydCA9IHJ0cF9jYWxjdWxhdGVfcG9ydChFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGdfY2ZnLT5ydHBfYmFzZV9wb3J0KTsKKwkJCWlmIChtZ2NwX2JpbmRfcnRwX3BvcnQoZW5kcCwgcnRwX3BvcnQpICE9IDApIHsKKwkJCQlMT0dQKERNR0NQLCBMT0dMX0ZBVEFMLCAiRmFpbGVkIHRvIGJpbmQ6ICVkXG4iLCBydHBfcG9ydCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuICEhZ19jZmctPmZvcndhcmRfaXA7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21uY2MuYyBiL29wZW5ic2Mvc3JjL21uY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmQ1MzY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbW5jYy5jCkBAIC0wLDAgKzEsNDY4IEBACisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBBbmRyZWFzIEV2ZXJzYmVyZyA8QW5kcmVhcy5FdmVyc2JlcmdAdmVyc2F0ZWwuZGU+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tbmNjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3J0cF9wcm94eS5oPgorCit2b2lkICp0YWxsX2NhbGxfY3R4OworCitzdGF0aWMgc3RydWN0IG1uY2NfbmFtZXMgeworCWNoYXIgKm5hbWU7CisJaW50IHZhbHVlOworfSBtbmNjX25hbWVzW10gPSB7CisJeyJNTkNDX1NFVFVQX1JFUSIsCTB4MDEwMX0sCisJeyJNTkNDX1NFVFVQX0lORCIsCTB4MDEwMn0sCisJeyJNTkNDX1NFVFVQX1JTUCIsCTB4MDEwM30sCisJeyJNTkNDX1NFVFVQX0NORiIsCTB4MDEwNH0sCisJeyJNTkNDX1NFVFVQX0NPTVBMX1JFUSIsMHgwMTA1fSwKKwl7Ik1OQ0NfU0VUVVBfQ09NUExfSU5EIiwweDAxMDZ9LAorCXsiTU5DQ19DQUxMX0NPTkZfSU5EIiwJMHgwMTA3fSwKKwl7Ik1OQ0NfQ0FMTF9QUk9DX1JFUSIsCTB4MDEwOH0sCisJeyJNTkNDX1BST0dSRVNTX1JFUSIsCTB4MDEwOX0sCisJeyJNTkNDX0FMRVJUX1JFUSIsCTB4MDEwYX0sCisJeyJNTkNDX0FMRVJUX0lORCIsCTB4MDEwYn0sCisJeyJNTkNDX05PVElGWV9SRVEiLAkweDAxMGN9LAorCXsiTU5DQ19OT1RJRllfSU5EIiwJMHgwMTBkfSwKKwl7Ik1OQ0NfRElTQ19SRVEiLAkweDAxMGV9LAorCXsiTU5DQ19ESVNDX0lORCIsCTB4MDEwZn0sCisJeyJNTkNDX1JFTF9SRVEiLAkweDAxMTB9LAorCXsiTU5DQ19SRUxfSU5EIiwJMHgwMTExfSwKKwl7Ik1OQ0NfUkVMX0NORiIsCTB4MDExMn0sCisJeyJNTkNDX0ZBQ0lMSVRZX1JFUSIsCTB4MDExM30sCisJeyJNTkNDX0ZBQ0lMSVRZX0lORCIsCTB4MDExNH0sCisJeyJNTkNDX1NUQVJUX0RUTUZfSU5EIiwJMHgwMTE1fSwKKwl7Ik1OQ0NfU1RBUlRfRFRNRl9SU1AiLAkweDAxMTZ9LAorCXsiTU5DQ19TVEFSVF9EVE1GX1JFSiIsCTB4MDExN30sCisJeyJNTkNDX1NUT1BfRFRNRl9JTkQiLAkweDAxMTh9LAorCXsiTU5DQ19TVE9QX0RUTUZfUlNQIiwJMHgwMTE5fSwKKwl7Ik1OQ0NfTU9ESUZZX1JFUSIsCTB4MDExYX0sCisJeyJNTkNDX01PRElGWV9JTkQiLAkweDAxMWJ9LAorCXsiTU5DQ19NT0RJRllfUlNQIiwJMHgwMTFjfSwKKwl7Ik1OQ0NfTU9ESUZZX0NORiIsCTB4MDExZH0sCisJeyJNTkNDX01PRElGWV9SRUoiLAkweDAxMWV9LAorCXsiTU5DQ19IT0xEX0lORCIsCTB4MDExZn0sCisJeyJNTkNDX0hPTERfQ05GIiwJMHgwMTIwfSwKKwl7Ik1OQ0NfSE9MRF9SRUoiLAkweDAxMjF9LAorCXsiTU5DQ19SRVRSSUVWRV9JTkQiLAkweDAxMjJ9LAorCXsiTU5DQ19SRVRSSUVWRV9DTkYiLAkweDAxMjN9LAorCXsiTU5DQ19SRVRSSUVWRV9SRUoiLAkweDAxMjR9LAorCXsiTU5DQ19VU0VSSU5GT19SRVEiLAkweDAxMjV9LAorCXsiTU5DQ19VU0VSSU5GT19JTkQiLAkweDAxMjZ9LAorCXsiTU5DQ19SRUpfUkVRIiwJMHgwMTI3fSwKKwl7Ik1OQ0NfUkVKX0lORCIsCTB4MDEyOH0sCisKKwl7Ik1OQ0NfQlJJREdFIiwJCTB4MDIwMH0sCisJeyJNTkNDX0ZSQU1FX1JFQ1YiLAkweDAyMDF9LAorCXsiTU5DQ19GUkFNRV9EUk9QIiwJMHgwMjAyfSwKKwl7Ik1OQ0NfTENIQU5fTU9ESUZZIiwJMHgwMjAzfSwKKworCXsiR1NNX1RDSF9GUkFNRSIsCTB4MDMwMH0sCisKKwl7TlVMTCwgMH0gfTsKKworc3RhdGljIExMSVNUX0hFQUQoY2FsbF9saXN0KTsKKworc3RhdGljIHVfaW50MzJfdCBuZXdfY2FsbHJlZiA9IDB4MDAwMDAwMDE7CisKK2NoYXIgKmdldF9tbmNjX25hbWUoaW50IHZhbHVlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgbW5jY19uYW1lc1tpXS5uYW1lOyBpKyspIHsKKwkJaWYgKG1uY2NfbmFtZXNbaV0udmFsdWUgPT0gdmFsdWUpCisJCQlyZXR1cm4gbW5jY19uYW1lc1tpXS5uYW1lOworCX0KKworCXJldHVybiAiTU5DQ19Vbmtub3duIjsKK30KKworc3RhdGljIHZvaWQgZnJlZV9jYWxsKHN0cnVjdCBnc21fY2FsbCAqY2FsbCkKK3sKKwlsbGlzdF9kZWwoJmNhbGwtPmVudHJ5KTsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgQ2FsbCByZW1vdmVkLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJdGFsbG9jX2ZyZWUoY2FsbCk7Cit9CisKKworc3RydWN0IGdzbV9jYWxsICpnZXRfY2FsbF9yZWYodV9pbnQzMl90IGNhbGxyZWYpCit7CisJc3RydWN0IGdzbV9jYWxsICpjYWxsdDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGx0LCAmY2FsbF9saXN0LCBlbnRyeSkgeworCQlpZiAoY2FsbHQtPmNhbGxyZWYgPT0gY2FsbHJlZikKKwkJCXJldHVybiBjYWxsdDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgbW5jY19zZXRfY2F1c2Uoc3RydWN0IGdzbV9tbmNjICpkYXRhLCBpbnQgbG9jLCBpbnQgdmFsKQoreworCWRhdGEtPmZpZWxkcyB8PSBNTkNDX0ZfQ0FVU0U7CisJZGF0YS0+Y2F1c2UubG9jYXRpb24gPSBsb2M7CisJZGF0YS0+Y2F1c2UudmFsdWUgPSB2YWw7Cit9CisKKy8qIG9uIGluY29taW5nIGNhbGwsIGxvb2sgdXAgZGF0YWJhc2UgYW5kIHNlbmQgc2V0dXAgdG8gcmVtb3RlIHN1YnNjci4gKi8KK3N0YXRpYyBpbnQgbW5jY19zZXR1cF9pbmQoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsCisJCQkgIHN0cnVjdCBnc21fbW5jYyAqc2V0dXApCit7CisJc3RydWN0IGdzbV9tbmNjIG1uY2M7CisJc3RydWN0IGdzbV9jYWxsICpyZW1vdGU7CisKKwltZW1zZXQoJm1uY2MsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltbmNjLmNhbGxyZWYgPSBjYWxsLT5jYWxscmVmOworCisJLyogYWxyZWFkeSBoYXZlIHJlbW90ZSBjYWxsICovCisJaWYgKGNhbGwtPnJlbW90ZV9yZWYpCisJCXJldHVybiAwOworCQorCS8qIHRyYW5zZmVyIG1vZGUgMSB3b3VsZCBiZSBwYWNrZXQgbW9kZSwgd2hpY2ggd2FzIG5ldmVyIHNwZWNpZmllZCAqLworCWlmIChzZXR1cC0+YmVhcmVyX2NhcC5tb2RlICE9IDApIHsKKwkJTE9HUChETU5DQywgTE9HTF9OT1RJQ0UsICIoY2FsbCAleCkgV2UgZG9uJ3Qgc3VwcG9ydCAiCisJCQkicGFja2V0IG1vZGVcbiIsIGNhbGwtPmNhbGxyZWYpOworCQltbmNjX3NldF9jYXVzZSgmbW5jYywgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX0JFQVJFUl9DQV9VTkFWQUlMKTsKKwkJZ290byBvdXRfcmVqZWN0OworCX0KKworCS8qIHdlIGN1cnJlbnRseSBvbmx5IGRvIHNwZWVjaCAqLworCWlmIChzZXR1cC0+YmVhcmVyX2NhcC50cmFuc2ZlciAhPSBHU01fTU5DQ19CQ0FQX1NQRUVDSCkgeworCQlMT0dQKERNTkNDLCBMT0dMX05PVElDRSwgIihjYWxsICV4KSBXZSBvbmx5IHN1cHBvcnQgIgorCQkJInZvaWNlIGNhbGxzXG4iLCBjYWxsLT5jYWxscmVmKTsKKwkJbW5jY19zZXRfY2F1c2UoJm1uY2MsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9CRUFSRVJfQ0FfVU5BVkFJTCk7CisJCWdvdG8gb3V0X3JlamVjdDsKKwl9CisKKwkvKiBjcmVhdGUgcmVtb3RlIGNhbGwgKi8KKwlpZiAoIShyZW1vdGUgPSB0YWxsb2ModGFsbF9jYWxsX2N0eCwgc3RydWN0IGdzbV9jYWxsKSkpIHsKKwkJbW5jY19zZXRfY2F1c2UoJm1uY2MsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJZ290byBvdXRfcmVqZWN0OworCX0KKwlsbGlzdF9hZGRfdGFpbCgmcmVtb3RlLT5lbnRyeSwgJmNhbGxfbGlzdCk7CisJcmVtb3RlLT5uZXQgPSBjYWxsLT5uZXQ7CisJcmVtb3RlLT5jYWxscmVmID0gbmV3X2NhbGxyZWYrKzsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgQ3JlYXRpbmcgbmV3IHJlbW90ZSBpbnN0YW5jZSAleC5cbiIsCisJCWNhbGwtPmNhbGxyZWYsIHJlbW90ZS0+Y2FsbHJlZik7CisKKwkvKiBsaW5rIHJlbW90ZSBjYWxsICovCisJY2FsbC0+cmVtb3RlX3JlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlyZW1vdGUtPnJlbW90ZV9yZWYgPSBjYWxsLT5jYWxscmVmOworCisJLyogbW9kaWZ5IG1vZGUgKi8KKwltZW1zZXQoJm1uY2MsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltbmNjLmNhbGxyZWYgPSBjYWxsLT5jYWxscmVmOworCW1uY2MubGNoYW5fbW9kZSA9IEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIE1vZGlmeSBjaGFubmVsIG1vZGUuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0xDSEFOX01PRElGWSwgJm1uY2MpOworCisJLyogc2VuZCBjYWxsIHByb2NlZWRpbmcgKi8KKwltZW1zZXQoJm1uY2MsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltbmNjLmNhbGxyZWYgPSBjYWxsLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBBY2NlcHRpbmcgY2FsbC5cbiIsIGNhbGwtPmNhbGxyZWYpOworCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfQ0FMTF9QUk9DX1JFUSwgJm1uY2MpOworCisJLyogc2VuZCBzZXR1cCB0byByZW1vdGUgKi8KKy8vCXNldHVwLT5maWVsZHMgfD0gTU5DQ19GX1NJR05BTDsKKy8vCXNldHVwLT5zaWduYWwgPSBHU000OF9TSUdOQUxfRElBTFRPTkU7CisJc2V0dXAtPmNhbGxyZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIEZvcndhcmRpbmcgU0VUVVAgdG8gcmVtb3RlLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJcmV0dXJuIG1uY2Nfc2VuZChyZW1vdGUtPm5ldCwgTU5DQ19TRVRVUF9SRVEsIHNldHVwKTsKKworb3V0X3JlamVjdDoKKwltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX1JFSl9SRVEsICZtbmNjKTsKKwlmcmVlX2NhbGwoY2FsbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW5jY19hbGVydF9pbmQoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsCisJCQkgIHN0cnVjdCBnc21fbW5jYyAqYWxlcnQpCit7CisJc3RydWN0IGdzbV9jYWxsICpyZW1vdGU7CisKKwkvKiBzZW5kIGFsZXJ0aW5nIHRvIHJlbW90ZSAqLworCWlmICghKHJlbW90ZSA9IGdldF9jYWxsX3JlZihjYWxsLT5yZW1vdGVfcmVmKSkpCisJCXJldHVybiAwOworCWFsZXJ0LT5jYWxscmVmID0gcmVtb3RlLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBGb3J3YXJkaW5nIEFMRVJUIHRvIHJlbW90ZS5cbiIsIGNhbGwtPmNhbGxyZWYpOworCXJldHVybiBtbmNjX3NlbmQocmVtb3RlLT5uZXQsIE1OQ0NfQUxFUlRfUkVRLCBhbGVydCk7Cit9CisKK3N0YXRpYyBpbnQgbW5jY19ub3RpZnlfaW5kKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLAorCQkJICAgc3RydWN0IGdzbV9tbmNjICpub3RpZnkpCit7CisJc3RydWN0IGdzbV9jYWxsICpyZW1vdGU7CisKKwkvKiBzZW5kIG5vdGlmeSB0byByZW1vdGUgKi8KKwlpZiAoIShyZW1vdGUgPSBnZXRfY2FsbF9yZWYoY2FsbC0+cmVtb3RlX3JlZikpKQorCQlyZXR1cm4gMDsKKwlub3RpZnktPmNhbGxyZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIEZvcndhcmRpbmcgTk9USUYgdG8gcmVtb3RlLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJcmV0dXJuIG1uY2Nfc2VuZChyZW1vdGUtPm5ldCwgTU5DQ19OT1RJRllfUkVRLCBub3RpZnkpOworfQorCitzdGF0aWMgaW50IG1uY2Nfc2V0dXBfY25mKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLAorCQkJICBzdHJ1Y3QgZ3NtX21uY2MgKmNvbm5lY3QpCit7CisJc3RydWN0IGdzbV9tbmNjIGNvbm5lY3RfYWNrLCBmcmFtZV9yZWN2OworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gY2FsbC0+bmV0OworCXN0cnVjdCBnc21fY2FsbCAqcmVtb3RlOworCXVfaW50MzJfdCByZWZzWzJdOworCisJLyogYWNrbm93bGVkZ2UgY29ubmVjdCAqLworCW1lbXNldCgmY29ubmVjdF9hY2ssIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwljb25uZWN0X2Fjay5jYWxscmVmID0gY2FsbC0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgQWNrbm93bGVkZ2UgU0VUVVAuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX1NFVFVQX0NPTVBMX1JFUSwgJmNvbm5lY3RfYWNrKTsKKworCS8qIHNlbmQgY29ubmVjdCBtZXNzYWdlIHRvIHJlbW90ZSAqLworCWlmICghKHJlbW90ZSA9IGdldF9jYWxsX3JlZihjYWxsLT5yZW1vdGVfcmVmKSkpCisJCXJldHVybiAwOworCWNvbm5lY3QtPmNhbGxyZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFNlbmRpbmcgQ09OTkVDVCB0byByZW1vdGUuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwltbmNjX3NlbmQocmVtb3RlLT5uZXQsIE1OQ0NfU0VUVVBfUlNQLCBjb25uZWN0KTsKKworCS8qIGJyaWRnZSB0Y2ggKi8KKwlyZWZzWzBdID0gY2FsbC0+Y2FsbHJlZjsKKwlyZWZzWzFdID0gY2FsbC0+cmVtb3RlX3JlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgQnJpZGdpbmcgd2l0aCByZW1vdGUuXG4iLCBjYWxsLT5jYWxscmVmKTsKKworCS8qIGluIGRpcmVjdCBtb2RlLCB3ZSBhbHdheXMgaGF2ZSB0byBicmlkZ2UgdGhlIGNoYW5uZWxzICovCisJaWYgKGlwYWNjX3J0cF9kaXJlY3QpCisJCXJldHVybiBtbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0JSSURHRSwgcmVmcyk7CisKKwkvKiBwcm94eSBtb2RlICovCisJaWYgKCFuZXQtPmhhbmRvdmVyLmFjdGl2ZSkgeworCQkvKiBpbiB0aGUgbm8taGFuZG92ZXIgY2FzZSwgd2UgY2FuIGJyaWRnZSwgaS5lLiB1c2UKKwkJICogdGhlIG9sZCBSVFAgcHJveHkgY29kZSAqLworCQlyZXR1cm4gbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19CUklER0UsIHJlZnMpOworCX0gZWxzZSB7CisJCS8qIGluIGNhc2Ugb2YgaGFuZG92ZXIsIHdlIG5lZWQgdG8gcmUtd3JpdGUgdGhlIFJUUAorCQkgKiBTU1JDLCBzZXF1ZW5jZSBhbmQgdGltZXN0YW1wIHZhbHVlcyBhbmQgdGh1cworCQkgKiBuZWVkIHRvIGVuYWJsZSBSVFAgcmVjZWl2ZSBmb3IgYm90aCBkaXJlY3Rpb25zICovCisJCW1lbXNldCgmZnJhbWVfcmVjdiwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCQlmcmFtZV9yZWN2LmNhbGxyZWYgPSBjYWxsLT5jYWxscmVmOworCQltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0ZSQU1FX1JFQ1YsICZmcmFtZV9yZWN2KTsKKwkJZnJhbWVfcmVjdi5jYWxscmVmID0gY2FsbC0+cmVtb3RlX3JlZjsKKwkJcmV0dXJuIG1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfRlJBTUVfUkVDViwgJmZyYW1lX3JlY3YpOworCX0KK30KKworc3RhdGljIGludCBtbmNjX2Rpc2NfaW5kKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLAorCQkJIHN0cnVjdCBnc21fbW5jYyAqZGlzYykKK3sKKwlzdHJ1Y3QgZ3NtX2NhbGwgKnJlbW90ZTsKKworCS8qIHNlbmQgcmVsZWFzZSAqLworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWxlYXNpbmcgY2FsbCB3aXRoIGNhdXNlICVkXG4iLAorCQljYWxsLT5jYWxscmVmLCBkaXNjLT5jYXVzZS52YWx1ZSk7CisJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19SRUxfUkVRLCBkaXNjKTsKKworCS8qIHNlbmQgZGlzYyB0byByZW1vdGUgKi8KKwlpZiAoIShyZW1vdGUgPSBnZXRfY2FsbF9yZWYoY2FsbC0+cmVtb3RlX3JlZikpKSB7CisJCXJldHVybiAwOworCX0KKwlkaXNjLT5jYWxscmVmID0gcmVtb3RlLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBEaXNjb25uZWN0aW5nIHJlbW90ZSB3aXRoIGNhdXNlICVkXG4iLAorCQlyZW1vdGUtPmNhbGxyZWYsIGRpc2MtPmNhdXNlLnZhbHVlKTsKKwlyZXR1cm4gbW5jY19zZW5kKHJlbW90ZS0+bmV0LCBNTkNDX0RJU0NfUkVRLCBkaXNjKTsKK30KKworc3RhdGljIGludCBtbmNjX3JlbF9pbmQoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsIHN0cnVjdCBnc21fbW5jYyAqcmVsKQoreworCXN0cnVjdCBnc21fY2FsbCAqcmVtb3RlOworCisJLyogc2VuZCByZWxlYXNlIHRvIHJlbW90ZSAqLworCWlmICghKHJlbW90ZSA9IGdldF9jYWxsX3JlZihjYWxsLT5yZW1vdGVfcmVmKSkpIHsKKwkJZnJlZV9jYWxsKGNhbGwpOworCQlyZXR1cm4gMDsKKwl9CisJcmVsLT5jYWxscmVmID0gcmVtb3RlLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWxlYXNpbmcgcmVtb3RlIHdpdGggY2F1c2UgJWRcbiIsCisJCWNhbGwtPmNhbGxyZWYsIHJlbC0+Y2F1c2UudmFsdWUpOworCW1uY2Nfc2VuZChyZW1vdGUtPm5ldCwgTU5DQ19SRUxfUkVRLCByZWwpOworCisJZnJlZV9jYWxsKGNhbGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW5jY19yZWxfY25mKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLCBzdHJ1Y3QgZ3NtX21uY2MgKnJlbCkKK3sKKwlmcmVlX2NhbGwoY2FsbCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlY2VpdmluZyBhIFRDSC9GIGZyYW1lIGZyb20gdGhlIEJTQyBjb2RlICovCitzdGF0aWMgaW50IG1uY2NfcmN2X3RjaGYoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsCisJCQkgc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpkZnIpCit7CisJc3RydWN0IGdzbV90cmFucyAqcmVtb3RlX3RyYW5zOworCisJcmVtb3RlX3RyYW5zID0gdHJhbnNfZmluZF9ieV9jYWxscmVmKGNhbGwtPm5ldCwgY2FsbC0+cmVtb3RlX3JlZik7CisKKwkvKiB0aGlzIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuICovCisJaWYgKCFyZW1vdGVfdHJhbnMgfHwgIXJlbW90ZV90cmFucy0+Y29ubikgeworCQlMT0dQKERNTkNDLCBMT0dMX0VSUk9SLCAiTm8gdHJhbnNhY3Rpb24gb3IgdHJhbnNhY3Rpb24gd2l0aG91dCBsY2hhbj8hP1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFJUUCBzb2NrZXQgb2YgcmVtb3RlIGVuZCBoYXMgbWVhbndoaWxlIGRpZWQgKi8KKwlpZiAoIXJlbW90ZV90cmFucy0+Y29ubi0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcnRwX3NlbmRfZnJhbWUocmVtb3RlX3RyYW5zLT5jb25uLT5sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0LCBkZnIpOworfQorCisKK2ludCBtbmNjX3JlY3Yoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZGF0YSA9IGFyZzsKKwlpbnQgY2FsbHJlZjsKKwlzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwgPSBOVUxMLCAqY2FsbHQ7CisJaW50IHJjID0gMDsKKworCS8qIFNwZWNpYWwgbWVzc2FnZXMgKi8KKwlzd2l0Y2gobXNnX3R5cGUpIHsKKwl9CisJCisJLyogZmluZCBjYWxscmVmICovCisJY2FsbHJlZiA9IGRhdGEtPmNhbGxyZWY7CisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbHQsICZjYWxsX2xpc3QsIGVudHJ5KSB7CisJCWlmIChjYWxsdC0+Y2FsbHJlZiA9PSBjYWxscmVmKSB7CisJCQljYWxsID0gY2FsbHQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGNyZWF0ZSBjYWxscmVmLCBpZiBzZXR1cCBpcyByZWNlaXZlZCAqLworCWlmICghY2FsbCkgeworCQlpZiAobXNnX3R5cGUgIT0gTU5DQ19TRVRVUF9JTkQpCisJCQlyZXR1cm4gMDsgLyogZHJvcCAqLworCQkvKiBjcmVhdGUgY2FsbCAqLworCQlpZiAoIShjYWxsID0gdGFsbG9jX3plcm8odGFsbF9jYWxsX2N0eCwgc3RydWN0IGdzbV9jYWxsKSkpIHsKKwkJCXN0cnVjdCBnc21fbW5jYyByZWw7CisJCQkKKwkJCW1lbXNldCgmcmVsLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJCQlyZWwuY2FsbHJlZiA9IGNhbGxyZWY7CisJCQltbmNjX3NldF9jYXVzZSgmcmVsLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJICAgICAgIEdTTTQ4X0NDX0NBVVNFX1JFU09VUkNFX1VOQVZBSUwpOworCQkJbW5jY19zZW5kKG5ldCwgTU5DQ19SRUxfUkVRLCAmcmVsKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxsaXN0X2FkZF90YWlsKCZjYWxsLT5lbnRyeSwgJmNhbGxfbGlzdCk7CisJCWNhbGwtPm5ldCA9IG5ldDsKKwkJY2FsbC0+Y2FsbHJlZiA9IGNhbGxyZWY7CisJCURFQlVHUChETU5DQywgIihjYWxsICV4KSBDYWxsIGNyZWF0ZWQuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwl9CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBHU01fVENIRl9GUkFNRToKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FX0VGUjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlY2VpdmVkIG1lc3NhZ2UgJXNcbiIsIGNhbGwtPmNhbGxyZWYsCisJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCWJyZWFrOworCX0KKworCXN3aXRjaChtc2dfdHlwZSkgeworCWNhc2UgTU5DQ19TRVRVUF9JTkQ6CisJCXJjID0gbW5jY19zZXR1cF9pbmQoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19TRVRVUF9DTkY6CisJCXJjID0gbW5jY19zZXR1cF9jbmYoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19TRVRVUF9DT01QTF9JTkQ6CisJCWJyZWFrOworCWNhc2UgTU5DQ19DQUxMX0NPTkZfSU5EOgorCQkvKiB3ZSBub3cgbmVlZCB0byBNT0RJRlkgdGhlIGNoYW5uZWwgKi8KKwkJZGF0YS0+bGNoYW5fbW9kZSA9IEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI7CisJCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfTENIQU5fTU9ESUZZLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX0FMRVJUX0lORDoKKwkJcmMgPSBtbmNjX2FsZXJ0X2luZChjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX05PVElGWV9JTkQ6CisJCXJjID0gbW5jY19ub3RpZnlfaW5kKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfRElTQ19JTkQ6CisJCXJjID0gbW5jY19kaXNjX2luZChjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1JFTF9JTkQ6CisJY2FzZSBNTkNDX1JFSl9JTkQ6CisJCXJjID0gbW5jY19yZWxfaW5kKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfUkVMX0NORjoKKwkJcmMgPSBtbmNjX3JlbF9jbmYoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19GQUNJTElUWV9JTkQ6CisJCWJyZWFrOworCWNhc2UgTU5DQ19TVEFSVF9EVE1GX0lORDoKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1NUT1BfRFRNRl9JTkQ6CisJCWJyZWFrOworCWNhc2UgTU5DQ19NT0RJRllfSU5EOgorCQltbmNjX3NldF9jYXVzZShkYXRhLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfU0VSVl9PUFRfVU5JTVBMKTsKKwkJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlamVjdGluZyBNT0RJRlkgd2l0aCBjYXVzZSAlZFxuIiwKKwkJCWNhbGwtPmNhbGxyZWYsIGRhdGEtPmNhdXNlLnZhbHVlKTsKKwkJcmMgPSBtbmNjX3NlbmQobmV0LCBNTkNDX01PRElGWV9SRUosIGRhdGEpOworCQlicmVhazsKKwljYXNlIE1OQ0NfTU9ESUZZX0NORjoKKwkJYnJlYWs7CisJY2FzZSBNTkNDX0hPTERfSU5EOgorCQltbmNjX3NldF9jYXVzZShkYXRhLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfU0VSVl9PUFRfVU5JTVBMKTsKKwkJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlamVjdGluZyBIT0xEIHdpdGggY2F1c2UgJWRcbiIsCisJCQljYWxsLT5jYWxscmVmLCBkYXRhLT5jYXVzZS52YWx1ZSk7CisJCXJjID0gbW5jY19zZW5kKG5ldCwgTU5DQ19IT0xEX1JFSiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19SRVRSSUVWRV9JTkQ6CisJCW1uY2Nfc2V0X2NhdXNlKGRhdGEsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9TRVJWX09QVF9VTklNUEwpOworCQlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVqZWN0aW5nIFJFVFJJRVZFIHdpdGggY2F1c2UgJWRcbiIsCisJCQljYWxsLT5jYWxscmVmLCBkYXRhLT5jYXVzZS52YWx1ZSk7CisJCXJjID0gbW5jY19zZW5kKG5ldCwgTU5DQ19SRVRSSUVWRV9SRUosIGRhdGEpOworCQlicmVhazsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCWNhc2UgR1NNX1RDSEZfRlJBTUVfRUZSOgorCQlyYyA9IG1uY2NfcmN2X3RjaGYoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1OQ0MsIExPR0xfTk9USUNFLCAiKGNhbGwgJXgpIE1lc3NhZ2UgdW5oYW5kbGVkXG4iLCBjYWxscmVmKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0xIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTgwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTEKQEAgLTAsMCArMSw1NCBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTEzIDYwCisgYnRzIDAKKyAgdHlwZSBiczExCisgIGJhbmQgR1NNOTAwCisgIGNlbGxfaWRlbnRpdHkgMQorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgb21sIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgb21sIGUxIHRlaSAyNQorICB0cnggMAorICAgYXJmY24gMTIxCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDEKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAzCisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMiBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQ1MGM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0yCkBAIC0wLDAgKzEsODIgQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCituZXR3b3JrCisgbmV0d29yayBjb3VudHJ5IGNvZGUgMQorIG1vYmlsZSBuZXR3b3JrIGNvZGUgMQorIHNob3J0IG5hbWUgT3BlbkJTQworIGxvbmcgbmFtZSBPcGVuQlNDCisgdGltZXIgdDMxMDEgMTAKKyB0aW1lciB0MzExMyA2MAorIGJ0cyAwCisgIHR5cGUgYnMxMQorICBiYW5kIEdTTTkwMAorICBjZWxsX2lkZW50aXR5IDEKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG9tbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgIG9tbCBlMSB0ZWkgMjUKKyAgdHJ4IDAKKyAgIGFyZmNuIDEyMQorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAxCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDMKKyAgdHJ4IDEKKyAgIGFyZmNuIDEyMworICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAyCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMi0yIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMi0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTgwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4yLTIKQEAgLTAsMCArMSwxNDggQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCituZXR3b3JrCisgbmV0d29yayBjb3VudHJ5IGNvZGUgMQorIG1vYmlsZSBuZXR3b3JrIGNvZGUgMQorIHNob3J0IG5hbWUgT3BlbkJTQworIGxvbmcgbmFtZSBPcGVuQlNDCisgdGltZXIgdDMxMDEgMTAKKyB0aW1lciB0MzExMyA2MAorIGJ0cyAwCisgIHR5cGUgYnMxMQorICBiYW5kIEdTTTkwMAorICBjZWxsX2lkZW50aXR5IDEKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG9tbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgIG9tbCBlMSB0ZWkgMjUKKyAgdHJ4IDAKKyAgIGFyZmNuIDEyMQorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAxCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMworICB0cnggMQorICAgYXJmY24gMTIzCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDIKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAzCisgYnRzIDEKKyAgdHlwZSBiczExCisgIGJhbmQgR1NNOTAwCisgIGxvY2F0aW9uX2FyZWFfY29kZSAyCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICBvbWwgZTEgbGluZSAxIHRpbWVzbG90IDYgc3ViLXNsb3QgZnVsbAorICBvbWwgZTEgdGVpIDI1CisgIHRyeCAwCisgICBhcmZjbiAxMjIKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMSB0aW1lc2xvdCA2IHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMQorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgNyBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFNEQ0NIOAorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgNyBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA3IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDcgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOCBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA4IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDggc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOCBzdWItc2xvdCAzCisgIHRyeCAxCisgICBhcmZjbiAxMjQKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMSB0aW1lc2xvdCA2IHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMgorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOSBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA5IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDkgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOSBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCAxMCBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCAxMCBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCAxMCBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCAxMCBzdWItc2xvdCAzCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTBiYTc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cwpAQCAtMCwwICsxLDc1IEBACishCishIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eQorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbmV0d29yaworIG5ldHdvcmsgY291bnRyeSBjb2RlIDEKKyBtb2JpbGUgbmV0d29yayBjb2RlIDEKKyBzaG9ydCBuYW1lIE9wZW5CU0MKKyBsb25nIG5hbWUgT3BlbkJTQworIGF1dGggcG9saWN5IGNsb3NlZAorIGxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdCBjYXVzZSAxMworIGVuY3J5cHRpb24gYTUgMAorIG5lY2kgMAorIHJybHAgbW9kZSBub25lCisgbW0gaW5mbyAxCisgaGFuZG92ZXIgMAorIGhhbmRvdmVyIHdpbmRvdyByeGxldiBhdmVyYWdpbmcgMTAKKyBoYW5kb3ZlciB3aW5kb3cgcnhxdWFsIGF2ZXJhZ2luZyAxCisgaGFuZG92ZXIgd2luZG93IHJ4bGV2IG5laWdoYm9yIGF2ZXJhZ2luZyAxMAorIGhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBpbnRlcnZhbCA2CisgaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGh5c3RlcmVzaXMgMworIGhhbmRvdmVyIG1heGltdW0gZGlzdGFuY2UgOTk5OQorIHRpbWVyIHQzMTAxIDEwCisgdGltZXIgdDMxMDMgMAorIHRpbWVyIHQzMTA1IDAKKyB0aW1lciB0MzEwNyAwCisgdGltZXIgdDMxMDkgMAorIHRpbWVyIHQzMTExIDAKKyB0aW1lciB0MzExMyA2MAorIHRpbWVyIHQzMTE1IDAKKyB0aW1lciB0MzExNyAwCisgdGltZXIgdDMxMTkgMAorIHRpbWVyIHQzMTQxIDAKKyBidHMgMAorICB0eXBlIG5hbm9idHMKKyAgYmFuZCBEQ1MxODAwCisgIGNlbGxfaWRlbnRpdHkgMAorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgbXMgbWF4IHBvd2VyIDE1CisgIGNlbGwgcmVzZWxlY3Rpb24gaHlzdGVyZXNpcyA0CisgIHJ4bGV2IGFjY2VzcyBtaW4gMAorICBjaGFubmVsIGFsbG9jYXRvciBhc2NlbmRpbmcKKyAgcmFjaCB0eCBpbnRlZ2VyIDkKKyAgcmFjaCBtYXggdHJhbnNtaXNzaW9uIDcKKyAgaXAuYWNjZXNzIHVuaXRfaWQgMTgwMSAwCisgIG9tbCBpcC5hY2Nlc3Mgc3RyZWFtX2lkIDI1NQorICBncHJzIG1vZGUgbm9uZQorICB0cnggMAorICAgcmZfbG9ja2VkIDAKKyAgIGFyZmNuIDUxNAorICAgbm9taW5hbCBwb3dlciAyMworICAgbWF4X3Bvd2VyX3JlZCAyMAorICAgcnNsIGUxIHRlaSAwCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFNEQ0NIOAorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cy5tdWx0aXRyeCBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMubXVsdGl0cngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmYjU0YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMubXVsdGl0cngKQEAgLTAsMCArMSw5NyBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyBhdXRoIHBvbGljeSBjbG9zZWQKKyBsb2NhdGlvbiB1cGRhdGluZyByZWplY3QgY2F1c2UgMTMKKyBlbmNyeXB0aW9uIGE1IDAKKyBuZWNpIDAKKyBycmxwIG1vZGUgbm9uZQorIG1tIGluZm8gMAorIGhhbmRvdmVyIDAKKyBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgYXZlcmFnaW5nIDEwCisgaGFuZG92ZXIgd2luZG93IHJ4cXVhbCBhdmVyYWdpbmcgMQorIGhhbmRvdmVyIHdpbmRvdyByeGxldiBuZWlnaGJvciBhdmVyYWdpbmcgMTAKKyBoYW5kb3ZlciBwb3dlciBidWRnZXQgaW50ZXJ2YWwgNgorIGhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBoeXN0ZXJlc2lzIDMKKyBoYW5kb3ZlciBtYXhpbXVtIGRpc3RhbmNlIDk5OTkKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTAzIDAKKyB0aW1lciB0MzEwNSAwCisgdGltZXIgdDMxMDcgMAorIHRpbWVyIHQzMTA5IDAKKyB0aW1lciB0MzExMSAwCisgdGltZXIgdDMxMTMgNjAKKyB0aW1lciB0MzExNSAwCisgdGltZXIgdDMxMTcgMAorIHRpbWVyIHQzMTE5IDAKKyB0aW1lciB0MzE0MSAwCisgYnRzIDAKKyAgdHlwZSBuYW5vYnRzCisgIGJhbmQgRENTMTgwMAorICBjZWxsX2lkZW50aXR5IDAKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG1zIG1heCBwb3dlciAxNQorICBjZWxsIHJlc2VsZWN0aW9uIGh5c3RlcmVzaXMgNAorICByeGxldiBhY2Nlc3MgbWluIDAKKyAgY2hhbm5lbCBhbGxvY2F0b3IgYXNjZW5kaW5nCisgIHJhY2ggdHggaW50ZWdlciA5CisgIHJhY2ggbWF4IHRyYW5zbWlzc2lvbiA3CisgIGlwLmFjY2VzcyB1bml0X2lkIDE4MDAgMAorICBvbWwgaXAuYWNjZXNzIHN0cmVhbV9pZCAyNTUKKyAgZ3BycyBtb2RlIG5vbmUKKyAgdHJ4IDAKKyAgIHJmX2xvY2tlZCAwCisgICBhcmZjbiA4NzEKKyAgIG5vbWluYWwgcG93ZXIgMjMKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIHRlaSAwCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFNEQ0NIOAorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICB0cnggMQorICAgcmZfbG9ja2VkIDAKKyAgIGFyZmNuIDg3MworICAgbm9taW5hbCBwb3dlciAyMworICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgdGVpIDAKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9wYWdpbmcuYyBiL29wZW5ic2Mvc3JjL3BhZ2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZWQ5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9wYWdpbmcuYwpAQCAtMCwwICsxLDMyOSBAQAorLyogUGFnaW5nIGhlbHBlciBhbmQgbWFuYWdlci4uLi4gKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisvKgorICogUmVsZXZhbnQgc3BlY3M6CisgKiAgICAgMTIuMjE6CisgKiAgICAgICAtIDkuNC4xMiBmb3IgQ0NDSCBMb2NhbCBUaHJlc2hvbGQKKyAqCisgKiAgICAgMDUuNTg6CisgKiAgICAgICAtIDguNS4yIENDQ0ggTG9hZCBpbmRpY2F0aW9uCisgKiAgICAgICAtIDkuMy4xNSBQYWdpbmcgTG9hZAorICoKKyAqIEFwcHJvYWNoOgorICogICAgICAgLSBTZW5kIHBhZ2luZyBjb21tYW5kIHRvIHN1YnNjcmliZXIKKyAqICAgICAgIC0gT24gQ2hhbm5lbCBSZXF1ZXN0IHdlIHdpbGwgcmVtZW1iZXIgdGhlIHJlYXNvbgorICogICAgICAgLSBBZnRlciB0aGUgQUNLIHdlIHdpbGwgcmVxdWVzdCB0aGUgaWRlbnRpdHkKKyAqCSAtIFRoZW4gd2Ugd2lsbCBzZW5kIGFzc2lnbiB0aGUgZ3NtX3N1YnNjcmliZXIgYW5kCisgKgkgLSBhbmQgY2FsbCBhIGNhbGxiYWNrCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisKK3ZvaWQgKnRhbGxfcGFnaW5nX2N0eDsKKworc3RhdGljIHVuc2lnbmVkIGludCBjYWxjdWxhdGVfZ3JvdXAoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJaW50IGNjY2hfY29uZjsKKwlpbnQgYnNfY2NfY2hhbnM7CisJaW50IGJsb2NrczsKKwl1bnNpZ25lZCBpbnQgZ3JvdXA7CisJCisJY2NjaF9jb25mID0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZjsKKwlic19jY19jaGFucyA9IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NfY2hhbnMoY2NjaF9jb25mKTsKKwkvKiBjb2RlIHdvcmQgKyAyLCBhcyAyIGNoYW5uZWxzIGVxdWFscyAweDAgKi8KKwlibG9ja3MgPSByc2xfbnVtYmVyX29mX3BhZ2luZ19zdWJjaGFubmVscyhidHMpOworCWdyb3VwID0gZ2V0X3BhZ2luZ19ncm91cChzdHJfdG9faW1zaShzdWJzY3ItPmltc2kpLAorCQkJCQlic19jY19jaGFucywgYmxvY2tzKTsKKwlyZXR1cm4gZ3JvdXA7Cit9CisKKy8qCisgKiBLaWxsIG9uZSBwYWdpbmcgcmVxdWVzdCB1cGRhdGUgdGhlIGludGVybmFsIGxpc3QuLi4KKyAqLworc3RhdGljIHZvaWQgcGFnaW5nX3JlbW92ZV9yZXF1ZXN0KHN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqcGFnaW5nX2J0cywKKwkJCQlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICp0b19iZV9kZWxldGVkKQoreworCWJzY19kZWxfdGltZXIoJnRvX2JlX2RlbGV0ZWQtPlQzMTEzKTsKKwlsbGlzdF9kZWwoJnRvX2JlX2RlbGV0ZWQtPmVudHJ5KTsKKwlzdWJzY3JfcHV0KHRvX2JlX2RlbGV0ZWQtPnN1YnNjcik7CisJdGFsbG9jX2ZyZWUodG9fYmVfZGVsZXRlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHBhZ2VfbXMoc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwl1X2ludDhfdCBtaVsxMjhdOworCXVuc2lnbmVkIGludCBtaV9sZW47CisJdW5zaWduZWQgaW50IHBhZ2VfZ3JvdXA7CisKKwlMT0dQKERQQUcsIExPR0xfSU5GTywgIkdvaW5nIHRvIHNlbmQgcGFnaW5nIGNvbW1hbmRzOiBpbXNpOiAnJXMnIHRtc2k6ICcweCV4J1xuIiwKKwkJcmVxdWVzdC0+c3Vic2NyLT5pbXNpLCByZXF1ZXN0LT5zdWJzY3ItPnRtc2kpOworCisJaWYgKHJlcXVlc3QtPnN1YnNjci0+dG1zaSA9PSBHU01fUkVTRVJWRURfVE1TSSkKKwkJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21faW1zaShtaSwgcmVxdWVzdC0+c3Vic2NyLT5pbXNpKTsKKwllbHNlCisJCW1pX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX3Rtc2kobWksIHJlcXVlc3QtPnN1YnNjci0+dG1zaSk7CisKKwlwYWdlX2dyb3VwID0gY2FsY3VsYXRlX2dyb3VwKHJlcXVlc3QtPmJ0cywgcmVxdWVzdC0+c3Vic2NyKTsKKwlyc2xfcGFnaW5nX2NtZChyZXF1ZXN0LT5idHMsIHBhZ2VfZ3JvdXAsIG1pX2xlbiwgbWksCisJCQlyZXF1ZXN0LT5jaGFuX3R5cGUpOworfQorCisvKgorICogVGhpcyBpcyBraWNrZWQgYnkgdGhlIHBlcmlvZGljIFBBR0lORyBMT0FEIEluZGljYXRvcgorICogY29taW5nIGZyb20gYWJpc19yc2wuYworICoKKyAqIFdlIGF0dGVtcHQgdG8gaXRlcmF0ZSBvbmNlIG92ZXIgdGhlIGxpc3Qgb2YgaXRlbXMgYnV0CisgKiBvbmx5IHVwdG8gYXZhaWxhYmxlX3Nsb3RzLgorICovCitzdGF0aWMgdm9pZCBwYWdpbmdfaGFuZGxlX3BlbmRpbmdfcmVxdWVzdHMoc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpwYWdpbmdfYnRzKQoreworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKmluaXRpYWxfcmVxdWVzdCA9IE5VTEw7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqY3VycmVudF9yZXF1ZXN0ID0gTlVMTDsKKworCS8qCisJICogRGV0ZXJtaW5lIGlmIHRoZSBwZW5kaW5nX3JlcXVlc3RzIGxpc3QgaXMgZW1wdHkgYW5kCisJICogcmV0dXJuIHRoZW4uCisJICovCisJaWYgKGxsaXN0X2VtcHR5KCZwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzKSkgeworCQkvKiBzaW5jZSB0aGUgbGlzdCBpcyBlbXB0eSwgbm8gbmVlZCB0byByZXNjaGVkdWxlIHRoZSB0aW1lciAqLworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJbiBjYXNlIHRoZSBCVFMgZG9lcyBub3QgcHJvdmlkZSB1cyB3aXRoIGxvYWQgaW5kaWNhdGlvbiBqdXN0IGZpbGwKKwkgKiB1cCBvdXIgc2xvdHMgZm9yIHRoaXMgcm91bmQuIFdlIHNob3VsZCBiZSBhYmxlIHRvIHBhZ2UgMjAgc3Vic2NyaWJlcnMKKwkgKiBldmVyeSB0d28gc2Vjb25kcy4gU28gd2Ugd2lsbCBqdXN0IGdpdmUgdGhlIEJUUyBzb21lIGV4dHJhIGNyZWRpdC4KKwkgKiBXZSB3aWxsIGhhdmUgdG8gc2VlIGhvdyBvZnRlbiB3ZSBydW4gb3V0IG9mIHRoaXMgY3JlZGl0LCBzbyB3ZSBtaWdodAorCSAqIG5lZWQgYSBsb3cgd2F0ZXJtYXJrIGFuZCB0aGVuIGFkZCBjcmVkaXQgb3IgZ2l2ZSAyMCBldmVyeSBydW4gd2hlbgorCSAqIHRoZSBidHMgc2V0cyBhbiBvcHRpb24gZm9yIHRoYXQuCisJICovCisJaWYgKHBhZ2luZ19idHMtPmF2YWlsYWJsZV9zbG90cyA9PSAwKSB7CisJCUxPR1AoRFBBRywgTE9HTF9OT1RJQ0UsICJObyBzbG90cyBhdmFpbGFibGUgb24gYnRzIG5yICVkXG4iLAorCQkgICAgIHBhZ2luZ19idHMtPmJ0cy0+bnIpOworCQlwYWdpbmdfYnRzLT5hdmFpbGFibGVfc2xvdHMgPSAyMDsKKwl9CisKKwlpbml0aWFsX3JlcXVlc3QgPSBsbGlzdF9lbnRyeShwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzLm5leHQsCisJCQkJICAgICAgc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCwgZW50cnkpOworCWN1cnJlbnRfcmVxdWVzdCA9IGluaXRpYWxfcmVxdWVzdDsKKworCWRvIHsKKwkJLyogaGFuZGxlIHRoZSBwYWdpbmcgcmVxdWVzdCBub3cgKi8KKwkJcGFnZV9tcyhjdXJyZW50X3JlcXVlc3QpOworCQlwYWdpbmdfYnRzLT5hdmFpbGFibGVfc2xvdHMtLTsKKworCQkvKiB0YWtlIHRoZSBjdXJyZW50IGFuZCBhZGQgaXQgdG8gdGhlIGJhY2sgKi8KKwkJbGxpc3RfZGVsKCZjdXJyZW50X3JlcXVlc3QtPmVudHJ5KTsKKwkJbGxpc3RfYWRkX3RhaWwoJmN1cnJlbnRfcmVxdWVzdC0+ZW50cnksICZwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzKTsKKworCQkvKiB0YWtlIHRoZSBuZXh0IHJlcXVlc3QgKi8KKwkJY3VycmVudF9yZXF1ZXN0ID0gbGxpc3RfZW50cnkocGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cy5uZXh0LAorCQkJCQkgICAgICBzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0LCBlbnRyeSk7CisJfSB3aGlsZSAocGFnaW5nX2J0cy0+YXZhaWxhYmxlX3Nsb3RzID4gMAorCQkgICAgJiYgIGluaXRpYWxfcmVxdWVzdCAhPSBjdXJyZW50X3JlcXVlc3QpOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZwYWdpbmdfYnRzLT53b3JrX3RpbWVyLCAyLCAwKTsKK30KKworc3RhdGljIHZvaWQgcGFnaW5nX3dvcmtlcih2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqcGFnaW5nX2J0cyA9IGRhdGE7CisKKwlwYWdpbmdfaGFuZGxlX3BlbmRpbmdfcmVxdWVzdHMocGFnaW5nX2J0cyk7Cit9CisKK3ZvaWQgcGFnaW5nX2luaXQoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlidHMtPnBhZ2luZy5idHMgPSBidHM7CisJSU5JVF9MTElTVF9IRUFEKCZidHMtPnBhZ2luZy5wZW5kaW5nX3JlcXVlc3RzKTsKKwlidHMtPnBhZ2luZy53b3JrX3RpbWVyLmNiID0gcGFnaW5nX3dvcmtlcjsKKwlidHMtPnBhZ2luZy53b3JrX3RpbWVyLmRhdGEgPSAmYnRzLT5wYWdpbmc7CisKKwkvKiBMYXJnZSBudW1iZXIsIHVudGlsIHdlIGdldCBhIHByb3BlciBtZXNzYWdlICovCisJYnRzLT5wYWdpbmcuYXZhaWxhYmxlX3Nsb3RzID0gMjA7Cit9CisKK3N0YXRpYyBpbnQgcGFnaW5nX3BlbmRpbmdfcmVxdWVzdChzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKmJ0cywKKwkJCQlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikgeworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnJlcTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJmJ0cy0+cGVuZGluZ19yZXF1ZXN0cywgZW50cnkpIHsKKwkJaWYgKHN1YnNjciA9PSByZXEtPnN1YnNjcikKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOwkKK30KKworc3RhdGljIHZvaWQgcGFnaW5nX1QzMTEzX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqKWRhdGE7CisJc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSBzaWdfZGF0YTsKKwl2b2lkICpjYmZuX3BhcmFtOworCWdzbV9jYmZuICpjYmZuOworCisJTE9HUChEUEFHLCBMT0dMX0lORk8sICJUMzExMyBleHBpcmVkIGZvciByZXF1ZXN0ICVwICglcylcbiIsCisJCXJlcSwgcmVxLT5zdWJzY3ItPmltc2kpOworCQorCXNpZ19kYXRhLnN1YnNjciA9IHJlcS0+c3Vic2NyOworCXNpZ19kYXRhLmJ0cwk9IHJlcS0+YnRzOworCXNpZ19kYXRhLmxjaGFuCT0gTlVMTDsKKworCS8qIG11c3QgYmUgZGVzdHJveWVkIGJlZm9yZSBjYWxsaW5nIGNiZm4sIHRvIHByZXZlbnQgZG91YmxlIGZyZWUgKi8KKwljb3VudGVyX2luYyhyZXEtPmJ0cy0+bmV0d29yay0+c3RhdHMucGFnaW5nLmV4cGlyZWQpOworCWNiZm5fcGFyYW0gPSByZXEtPmNiZm5fcGFyYW07CisJY2JmbiA9IHJlcS0+Y2JmbjsKKwlwYWdpbmdfcmVtb3ZlX3JlcXVlc3QoJnJlcS0+YnRzLT5wYWdpbmcsIHJlcSk7CisKKworCWRpc3BhdGNoX3NpZ25hbChTU19QQUdJTkcsIFNfUEFHSU5HX0VYUElSRUQsICZzaWdfZGF0YSk7CisJaWYgKGNiZm4pCisJCWNiZm4oR1NNX0hPT0tfUlJfUEFHSU5HLCBHU01fUEFHSU5HX0VYUElSRUQsIE5VTEwsIE5VTEwsCisJCQkgIGNiZm5fcGFyYW0pOworfQorCitzdGF0aWMgaW50IF9wYWdpbmdfcmVxdWVzdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSAgICBpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpidHNfZW50cnkgPSAmYnRzLT5wYWdpbmc7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcmVxOworCisJaWYgKHBhZ2luZ19wZW5kaW5nX3JlcXVlc3QoYnRzX2VudHJ5LCBzdWJzY3IpKSB7CisJCUxPR1AoRFBBRywgTE9HTF9JTkZPLCAiUGFnaW5nIHJlcXVlc3QgYWxyZWFkeSBwZW5kaW5nIGZvciAlc1xuIiwgc3Vic2NyLT5pbXNpKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJTE9HUChEUEFHLCBMT0dMX0RFQlVHLCAiU3RhcnQgcGFnaW5nIG9mIHN1YnNjcmliZXIgJWxsdSBvbiBidHMgJWQuXG4iLAorCQlzdWJzY3ItPmlkLCBidHMtPm5yKTsKKwlyZXEgPSB0YWxsb2NfemVybyh0YWxsX3BhZ2luZ19jdHgsIHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QpOworCXJlcS0+c3Vic2NyID0gc3Vic2NyX2dldChzdWJzY3IpOworCXJlcS0+YnRzID0gYnRzOworCXJlcS0+Y2hhbl90eXBlID0gdHlwZTsKKwlyZXEtPmNiZm4gPSBjYmZuOworCXJlcS0+Y2Jmbl9wYXJhbSA9IGRhdGE7CisJcmVxLT5UMzExMy5jYiA9IHBhZ2luZ19UMzExM19leHBpcmVkOworCXJlcS0+VDMxMTMuZGF0YSA9IHJlcTsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnJlcS0+VDMxMTMsIGJ0cy0+bmV0d29yay0+VDMxMTMsIDApOworCWxsaXN0X2FkZF90YWlsKCZyZXEtPmVudHJ5LCAmYnRzX2VudHJ5LT5wZW5kaW5nX3JlcXVlc3RzKTsKKworCWlmICghYnNjX3RpbWVyX3BlbmRpbmcoJmJ0c19lbnRyeS0+d29ya190aW1lcikpCisJCWJzY19zY2hlZHVsZV90aW1lcigmYnRzX2VudHJ5LT53b3JrX3RpbWVyLCAyLCAwKTsKKworCXJldHVybiAwOworfQorCitpbnQgcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBOVUxMOworCWludCBudW1fcGFnZXMgPSAwOworCisJY291bnRlcl9pbmMobmV0d29yay0+c3RhdHMucGFnaW5nLmF0dGVtcHRlZCk7CisKKwkvKiBzdGFydCBwYWdpbmcgc3Vic2NyaWJlciBvbiBhbGwgQlRTIHdpdGhpbiBMb2NhdGlvbiBBcmVhICovCisJZG8geworCQlpbnQgcmM7CisKKwkJYnRzID0gZ3NtX2J0c19ieV9sYWMobmV0d29yaywgc3Vic2NyLT5sYWMsIGJ0cyk7CisJCWlmICghYnRzKQorCQkJYnJlYWs7CisKKwkJLyogc2tpcCBhbGwgY3VycmVudGx5IGluYWN0aXZlIFRSWCAqLworCQlpZiAoIXRyeF9pc191c2FibGUoYnRzLT5jMCkpCisJCQljb250aW51ZTsKKworCQludW1fcGFnZXMrKzsKKworCQkvKiBUcmlnZ2VyIHBhZ2luZywgcGFzcyBhbnkgZXJyb3IgdG8gY2FsbGVyICovCisJCXJjID0gX3BhZ2luZ19yZXF1ZXN0KGJ0cywgc3Vic2NyLCB0eXBlLCBjYmZuLCBkYXRhKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9IHdoaWxlICgxKTsKKworCWlmIChudW1fcGFnZXMgPT0gMCkKKwkJY291bnRlcl9pbmMobmV0d29yay0+c3RhdHMucGFnaW5nLmRldGFjaGVkKTsKKworCXJldHVybiBudW1fcGFnZXM7Cit9CisKKworLyogd2UgY29uc2Npb3VzbHkgaWdub3JlIHRoZSB0eXBlIG9mIHRoZSByZXF1ZXN0IGhlcmUgKi8KK3N0YXRpYyB2b2lkIF9wYWdpbmdfcmVxdWVzdF9zdG9wKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKmJ0c19lbnRyeSA9ICZidHMtPnBhZ2luZzsKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXEsICpyZXEyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHJlcTIsICZidHNfZW50cnktPnBlbmRpbmdfcmVxdWVzdHMsCisJCQkJIGVudHJ5KSB7CisJCWlmIChyZXEtPnN1YnNjciA9PSBzdWJzY3IpIHsKKwkJCWlmIChsY2hhbiAmJiByZXEtPmNiZm4pIHsKKwkJCQlMT0dQKERQQUcsIExPR0xfREVCVUcsICJTdG9wIHBhZ2luZyBvbiBidHMgJWQsIGNhbGxpbmcgY2Jmbi5cbiIsIGJ0cy0+bnIpOworCQkJCXJlcS0+Y2JmbihHU01fSE9PS19SUl9QQUdJTkcsIEdTTV9QQUdJTkdfU1VDQ0VFREVELAorCQkJCQkgIE5VTEwsIGxjaGFuLCByZXEtPmNiZm5fcGFyYW0pOworCQkJfSBlbHNlCisJCQkJTE9HUChEUEFHLCBMT0dMX0RFQlVHLCAiU3RvcCBwYWdpbmcgb24gYnRzICVkIHNpbGVudGx5LlxuIiwgYnRzLT5ucik7CisJCQlwYWdpbmdfcmVtb3ZlX3JlcXVlc3QoJmJ0cy0+cGFnaW5nLCByZXEpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qIFN0b3AgcGFnaW5nIG9uIGFsbCBvdGhlciBidHMnICovCit2b2lkIHBhZ2luZ19yZXF1ZXN0X3N0b3Aoc3RydWN0IGdzbV9idHMgKl9idHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBOVUxMOworCisJaWYgKF9idHMpCisJCV9wYWdpbmdfcmVxdWVzdF9zdG9wKF9idHMsIHN1YnNjciwgbGNoYW4pOworCisJZG8geworCQkvKgorCQkgKiBGSVhNRTogRG9uJ3QgdXNlIHRoZSBsYWMgb2YgdGhlIHN1YnNjcmliZXIuLi4KKwkJICogYXMgaXQgbWlnaHQgaGF2ZSBtYWdpY2FsbHkgY2hhbmdlZCB0aGUgbGFjLi4gdXNlIHRoZQorCQkgKiBsb2NhdGlvbiBhcmVhIG9mIHRoZSBfYnRzIGFzIHJlY29uZmlndXJhdGlvbiBvZiB0aGUKKwkJICogbmV0d29yayBpcyBwcm9iYWJseSBoYXBwZW5pbmcgbGVzcyBvZnRlbi4KKwkJICovCisJCWJ0cyA9IGdzbV9idHNfYnlfbGFjKHN1YnNjci0+bmV0LCBzdWJzY3ItPmxhYywgYnRzKTsKKwkJaWYgKCFidHMpCisJCQlicmVhazsKKworCQkvKiBTdG9wIHBhZ2luZyAqLworCQlpZiAoYnRzICE9IF9idHMpCisJCQlfcGFnaW5nX3JlcXVlc3Rfc3RvcChidHMsIHN1YnNjciwgTlVMTCk7CisJfSB3aGlsZSAoMSk7Cit9CisKK3ZvaWQgcGFnaW5nX3VwZGF0ZV9idWZmZXJfc3BhY2Uoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQxNl90IGZyZWVfc2xvdHMpCit7CisJYnRzLT5wYWdpbmcuYXZhaWxhYmxlX3Nsb3RzID0gZnJlZV9zbG90czsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Jlc3Rfb2N0ZXRzLmMgYi9vcGVuYnNjL3NyYy9yZXN0X29jdGV0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOWQyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9yZXN0X29jdGV0cy5jCkBAIC0wLDAgKzEsNDI1IEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UsCisgKiByZXN0IG9jdGV0IGhhbmRsaW5nIGFjY29yZGluZyB0bworICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9iaXR2ZWMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Jlc3Rfb2N0ZXRzLmg+CisKKy8qIGdlbmVyYXRlIFNJMSByZXN0IG9jdGV0cyAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMSh1X2ludDhfdCAqZGF0YSwgdV9pbnQ4X3QgKm5jaF9wb3MpCit7CisJc3RydWN0IGJpdHZlYyBidjsKKworCW1lbXNldCgmYnYsIDAsIHNpemVvZihidikpOworCWJ2LmRhdGEgPSBkYXRhOworCWJ2LmRhdGFfbGVuID0gMTsKKworCWlmIChuY2hfcG9zKSB7CisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCWJpdHZlY19zZXRfdWludCgmYnYsICpuY2hfcG9zLCA1KTsKKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCWJpdHZlY19zcGFyZV9wYWRkaW5nKCZidiwgNyk7CisJcmV0dXJuIGJ2LmRhdGFfbGVuOworfQorCisvKiBBcHBlbmQgc2VsZWN0aW9uIHBhcmFtZXRlcnMgdG8gYml0dmVjICovCitzdGF0aWMgdm9pZCBhcHBlbmRfc2VsZWN0aW9uX3BhcmFtcyhzdHJ1Y3QgYml0dmVjICpidiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3NlbGVjdGlvbl9wYXJhbXMgKnNwKQoreworCWlmIChzcC0+cHJlc2VudCkgeworCQliaXR2ZWNfc2V0X2JpdChidiwgSCk7CisJCWJpdHZlY19zZXRfYml0KGJ2LCBzcC0+Y2JxKTsKKwkJYml0dmVjX3NldF91aW50KGJ2LCBzcC0+Y2VsbF9yZXNlbF9vZmYsIDYpOworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIHNwLT50ZW1wX29mZnMsIDMpOworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIHNwLT5wZW5hbHR5X3RpbWUsIDUpOworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdChidiwgTCk7Cit9CisKKy8qIEFwcGVuZCBwb3dlciBvZmZzZXQgdG8gYml0dmVjICovCitzdGF0aWMgdm9pZCBhcHBlbmRfcG93ZXJfb2Zmc2V0KHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJCWNvbnN0IHN0cnVjdCBnc200OF9zaV9wb3dlcl9vZmZzZXQgKnBvKQoreworCWlmIChwby0+cHJlc2VudCkgeworCQliaXR2ZWNfc2V0X2JpdChidiwgSCk7CisJCWJpdHZlY19zZXRfdWludChidiwgcG8tPnBvd2VyX29mZnNldCwgMik7CisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KGJ2LCBMKTsKK30KKworLyogQXBwZW5kIEdQUlMgaW5kaWNhdG9yIHRvIGJpdHZlYyAqLworc3RhdGljIHZvaWQgYXBwZW5kX2dwcnNfaW5kKHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJICAgIGNvbnN0IHN0cnVjdCBnc200OF9zaTNfZ3Byc19pbmQgKmdpKQoreworCWlmIChnaS0+cHJlc2VudCkgeworCQliaXR2ZWNfc2V0X2JpdChidiwgSCk7CisJCWJpdHZlY19zZXRfdWludChidiwgZ2ktPnJhX2NvbG91ciwgMyk7CisJCS8qIDAgPT0gU0kxMyBpbiBCQ0NIIE5vcm0sIDEgPT0gU0kxMyBzZW50IG9uIEJDQ0ggRXh0ICovCisJCWJpdHZlY19zZXRfYml0KGJ2LCBnaS0+c2kxM19wb3NpdGlvbik7CisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KGJ2LCBMKTsKK30KKworCisvKiBHZW5lcmF0ZSBTSTMgUmVzdCBPY3Rlc3RzIChDaGFwdGVyIDEwLjUuMi4zNCAvIFRhYmxlIDEwLjQuNzIpICovCitpbnQgcmVzdF9vY3RldHNfc2kzKHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyAqc2kzKQoreworCXN0cnVjdCBiaXR2ZWMgYnY7CisKKwltZW1zZXQoJmJ2LCAwLCBzaXplb2YoYnYpKTsKKwlidi5kYXRhID0gZGF0YTsKKwlidi5kYXRhX2xlbiA9IDQ7CisKKwkvKiBPcHRpb25hbCBTZWxlY3Rpb24gUGFyYW1ldGVycyAqLworCWFwcGVuZF9zZWxlY3Rpb25fcGFyYW1zKCZidiwgJnNpMy0+c2VsZWN0aW9uX3BhcmFtcyk7CisKKwkvKiBPcHRpb25hbCBQb3dlciBPZmZzZXQgKi8KKwlhcHBlbmRfcG93ZXJfb2Zmc2V0KCZidiwgJnNpMy0+cG93ZXJfb2Zmc2V0KTsKKworCS8qIERvIHdlIGhhdmUgYSBTSTJ0ZXIgb24gdGhlIEJDQ0g/ICovCisJaWYgKHNpMy0+c2kydGVyX2luZGljYXRvcikKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwllbHNlCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwkvKiBFYXJseSBDbGFzc21hcmsgU2VuZGluZyBDb250cm9sICovCisJaWYgKHNpMy0+ZWFybHlfY21fY3RybCkKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwllbHNlCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwkvKiBEbyB3ZSBoYXZlIGEgU0kgVHlwZSA5IG9uIHRoZSBCQ0NIPyAqLworCWlmIChzaTMtPnNjaGVkdWxpbmcucHJlc2VudCkgeworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTMtPnNjaGVkdWxpbmcud2hlcmUsIDMpOworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJLyogR1BSUyBJbmRpY2F0b3IgKi8KKwlhcHBlbmRfZ3Byc19pbmQoJmJ2LCAmc2kzLT5ncHJzX2luZCk7CisKKwliaXR2ZWNfc3BhcmVfcGFkZGluZygmYnYsIChidi5kYXRhX2xlbio4KS0xKTsKKwlyZXR1cm4gYnYuZGF0YV9sZW47Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX2xzYV9wYXJhbXMoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBnc200OF9sc2FfcGFyYW1zICpsc2FfcGFyYW1zKQoreworCS8qIEZJWE1FICovCisJcmV0dXJuIC0xOworfQorCisvKiBHZW5lcmF0ZSBTSTQgUmVzdCBPY3RldHMgKENoYXB0ZXIgMTAuNS4yLjM1KSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpNCh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8gKnNpNCkKK3sKKwlzdHJ1Y3QgYml0dmVjIGJ2OworCisJbWVtc2V0KCZidiwgMCwgc2l6ZW9mKGJ2KSk7CisJYnYuZGF0YSA9IGRhdGE7CisJYnYuZGF0YV9sZW4gPSAxMDsgLyogRklYTUU6IHVwIHRvID8gKi8KKworCS8qIFNJNCBSZXN0IE9jdGV0cyBPICovCisJYXBwZW5kX3NlbGVjdGlvbl9wYXJhbXMoJmJ2LCAmc2k0LT5zZWxlY3Rpb25fcGFyYW1zKTsKKwlhcHBlbmRfcG93ZXJfb2Zmc2V0KCZidiwgJnNpNC0+cG93ZXJfb2Zmc2V0KTsKKwlhcHBlbmRfZ3Byc19pbmQoJmJ2LCAmc2k0LT5ncHJzX2luZCk7CisKKwlpZiAoMCAvKiBGSVhNRSAqLykgeworCQkvKiBIIGFuZCBTSTQgUmVzdCBPY3RldHMgUyAqLworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCisJCS8qIExTQSBQYXJhbWV0ZXJzICovCisJCWlmIChzaTQtPmxzYV9wYXJhbXMucHJlc2VudCkgeworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJCWFwcGVuZF9sc2FfcGFyYW1zKCZidiwgJnNpNC0+bHNhX3BhcmFtcyk7CisJCX0gZWxzZQorCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCQkvKiBDZWxsIElkZW50aXR5ICovCisJCWlmICgxKSB7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2k0LT5jZWxsX2lkLCAxNik7CisJCX0gZWxzZQorCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCQkvKiBMU0EgSUQgSW5mb3JtYXRpb24gKi8KKwkJaWYgKDApIHsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCQkvKiBGSVhNRSAqLworCQl9IGVsc2UKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisJfSBlbHNlIHsKKwkJLyogTCBhbmQgYnJlYWsgaW5kaWNhdG9yICovCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisJCWJpdHZlY19zZXRfYml0KCZidiwgc2k0LT5icmVha19pbmQgPyBIIDogTCk7CisJfQorCisJcmV0dXJuIGJ2LmRhdGFfbGVuOworfQorCisvKiBHUFJTIE1vYmlsZSBBbGxvY2F0aW9uIGFzIHBlciBUUyAwNC42MCBDaGFwdGVyIDEyLjEwYToKKyAgIDwgR1BSUyBNb2JpbGUgQWxsb2NhdGlvbiBJRSA+IDo6PQorICAgICA8IEhTTiA6IGJpdCAoNikgPgorICAgICB7IDAgfCAxIDwgUkZMIG51bWJlciBsaXN0IDogPCBSRkwgbnVtYmVyIGxpc3Qgc3RydWN0ID4gPiB9CisgICAgIHsgMCA8IE1BX0xFTkdUSCA6IGJpdCAoNikgPgorICAgICAgICAgPCBNQV9CSVRNQVA6IGJpdCAodmFsKE1BX0xFTkdUSCkgKyAxKSA+CisgICAgIHwgMSB7IDAgfCAxIDxBUkZDTiBpbmRleCBsaXN0IDogPCBBUkZDTiBpbmRleCBsaXN0IHN0cnVjdCA+ID4gfSB9IDsKKworICAgICA8IFJGTCBudW1iZXIgbGlzdCBzdHJ1Y3QgPiA6OiA9CisgICAgICAgPCBSRkxfTlVNQkVSIDogYml0ICg0KSA+CisgICAgICAgeyAwIHwgMSA8IFJGTCBudW1iZXIgbGlzdCBzdHJ1Y3QgPiB9IDsKKyAgICAgPCBBUkZDTiBpbmRleCBsaXN0IHN0cnVjdCA+IDo6PQorICAgICAgIDwgQVJGQ05fSU5ERVggOiBiaXQoNikgPgorICAgICAgIHsgMCB8IDEgPCBBUkZDTiBpbmRleCBsaXN0IHN0cnVjdCA+IH0gOworICovCitzdGF0aWMgaW50IGFwcGVuZF9ncHJzX21vYmlsZV9hbGxvYyhzdHJ1Y3QgYml0dmVjICpidikKK3sKKwkvKiBIb3BwaW5nIFNlcXVlbmNlIE51bWJlciAqLworCWJpdHZlY19zZXRfdWludChidiwgMCwgNik7CisKKwlpZiAoMCkgeworCQkvKiBXZSB3YW50IHRvIHVzZSBhIFJGTCBudW1iZXIgbGlzdCAqLworCQliaXR2ZWNfc2V0X2JpdChidiwgMSk7CisJCS8qIEZJWE1FOiBSRkwgbnVtYmVyIGxpc3QgKi8KKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoYnYsIDApOworCisJaWYgKDApIHsKKwkJLyogV2Ugd2FudCB0byB1c2UgYSBNQV9CSVRNQVAgKi8KKwkJYml0dmVjX3NldF9iaXQoYnYsIDApOworCQkvKiBGSVhNRTogTUFfTEVOR1RILCBNQV9CSVRNQVAsIC4uLiAqLworCX0gZWxzZSB7CisJCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwkJaWYgKDApIHsKKwkJCS8qIFdlIHdhbnQgdG8gcHJvdmlkZSBhbiBBUkZDTiBpbmRleCBsaXN0ICovCisJCQliaXR2ZWNfc2V0X2JpdChidiwgMSk7CisJCQkvKiBGSVhNRSAqLworCQl9IGVsc2UKKwkJCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3QzMTkyKHVuc2lnbmVkIGludCB0MzE5MikKK3sKKwlpZiAodDMxOTIgPT0gMCkKKwkJcmV0dXJuIDM7CisJZWxzZSBpZiAodDMxOTIgPD0gODApCisJCXJldHVybiA0OworCWVsc2UgaWYgKHQzMTkyIDw9IDEyMCkKKwkJcmV0dXJuIDU7CisJZWxzZSBpZiAodDMxOTIgPD0gMTYwKQorCQlyZXR1cm4gNjsKKwllbHNlIGlmICh0MzE5MiA8PSAyMDApCisJCXJldHVybiA3OworCWVsc2UgaWYgKHQzMTkyIDw9IDUwMCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAodDMxOTIgPD0gMTAwMCkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAodDMxOTIgPD0gMTUwMCkKKwkJcmV0dXJuIDI7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBlbmNvZGVfZHJ4X3RpbWVyKHVuc2lnbmVkIGludCBkcngpCit7CisJaWYgKGRyeCA9PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChkcnggPT0gMSkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoZHJ4ID09IDIpCisJCXJldHVybiAyOworCWVsc2UgaWYgKGRyeCA8PSA0KQorCQlyZXR1cm4gMzsKKwllbHNlIGlmIChkcnggPD0gOCkKKwkJcmV0dXJuIDQ7CisJZWxzZSBpZiAoZHJ4IDw9IDE2KQorCQlyZXR1cm4gNTsKKwllbHNlIGlmIChkcnggPD0gMzIpCisJCXJldHVybiA2OworCWVsc2UgaWYgKGRyeCA8PSA2NCkKKwkJcmV0dXJuIDc7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogR1BSUyBDZWxsIE9wdGlvbnMgYXMgcGVyIFRTIDA0LjYwIENoYXB0ZXIgMTIuMjQKKwk8IEdQUlMgQ2VsbCBPcHRpb25zIElFID4gOjo9CisJCTwgTk1PIDogYml0KDIpID4KKwkJPCBUMzE2OCA6IGJpdCgzKSA+CisJCTwgVDMxOTIgOiBiaXQoMykgPgorCQk8IERSWF9USU1FUl9NQVg6IGJpdCgzKSA+CisJCTwgQUNDRVNTX0JVUlNUX1RZUEU6IGJpdCA+CisJCTwgQ09OVFJPTF9BQ0tfVFlQRSA6IGJpdCA+CisJCTwgQlNfQ1ZfTUFYOiBiaXQoNCkgPgorCQl7IDAgfCAxIDwgUEFOX0RFQyA6IGJpdCgzKSA+CisJCQk8IFBBTl9JTkMgOiBiaXQoMykgPgorCQkJPCBQQU5fTUFYIDogYml0KDMpID4KKwkJeyAwIHwgMSA8IEV4dGVuc2lvbiBMZW5ndGggOiBiaXQoNikgPgorCQkJPCBiaXQgKHZhbChFeHRlbnNpb24gTGVuZ3RoKSArIDEKKwkJCSYgeyA8IEV4dGVuc2lvbiBJbmZvcm1hdGlvbiA+ICEgeyBiaXQgKiogPSA8bm8gc3RyaW5nPiB9IH0gOworCTwgRXh0ZW5zaW9uIEluZm9ybWF0aW9uID4gOjo9CisJCXsgMCB8IDEgPCBFR1BSU19QQUNLRVRfQ0hBTk5FTF9SRVFVRVNUIDogYml0ID4KKwkJCTwgQkVQX1BFUklPRCA6IGJpdCg0KSA+IH0KKwkJPCBQRkNfRkVBVFVSRV9NT0RFIDogYml0ID4KKwkJPCBEVE1fU1VQUE9SVCA6IGJpdCA+CisJCTxCU1NfUEFHSU5HX0NPT1JESU5BVElPTjogYml0ID4KKwkJPHNwYXJlIGJpdCA+ICoqIDsKKyAqLworc3RhdGljIGludCBhcHBlbmRfZ3Byc19jZWxsX29wdChzdHJ1Y3QgYml0dmVjICpidiwKKwkJCQljb25zdCBzdHJ1Y3QgZ3Byc19jZWxsX29wdGlvbnMgKmdjbykKK3sKKwlpbnQgdDMxOTIsIGRyeF90aW1lcl9tYXg7CisKKwl0MzE5MiA9IGVuY29kZV90MzE5MihnY28tPnQzMTkyKTsKKwlpZiAodDMxOTIgPCAwKQorCQlyZXR1cm4gdDMxOTI7CisKKwlkcnhfdGltZXJfbWF4ID0gZW5jb2RlX2RyeF90aW1lcihnY28tPmRyeF90aW1lcl9tYXgpOworCWlmIChkcnhfdGltZXJfbWF4IDwgMCkKKwkJcmV0dXJuIGRyeF90aW1lcl9tYXg7CisKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIGdjby0+bm1vLCAyKTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIGdjby0+dDMxNjggLyA1MDAsIDMpOworCWJpdHZlY19zZXRfdWludChidiwgdDMxOTIsIDMpOworCWJpdHZlY19zZXRfdWludChidiwgZHJ4X3RpbWVyX21heCwgMyk7CisJLyogQUNDRVNTX0JVUlNUX1RZUEU6IEhhcmQtY29kZSA4Yml0ICovCisJYml0dmVjX3NldF9iaXQoYnYsIDApOworCS8qIENPTlRST0xfQUNLX1RZUEU6IEhhcmQtY29kZSB0byBSTEMvTUFDIGNvbnRyb2wgYmxvY2sgKi8KKwliaXR2ZWNfc2V0X2JpdChidiwgMSk7CisJYml0dmVjX3NldF91aW50KGJ2LCBnY28tPmJzX2N2X21heCwgNCk7CisKKwkvKiBoYXJkLWNvZGUgbm8gUEFOX3tERUMsSU5DLE1BWH0gKi8KKwliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisKKwlpZiAoIWdjby0+ZXh0X2luZm9fcHJlc2VudCkgeworCQkvKiBubyBleHRlbnNpb24gaW5mb3JtYXRpb24gKi8KKwkJYml0dmVjX3NldF9iaXQoYnYsIDApOworCX0gZWxzZSB7CisJCS8qIGV4dGVuc2lvbiBpbmZvcm1hdGlvbiAqLworCQliaXR2ZWNfc2V0X2JpdChidiwgMSk7CisJCWlmICghZ2NvLT5leHRfaW5mby5lZ3Byc19zdXBwb3J0ZWQpIHsKKwkJCS8qIDZiaXQgbGVuZ3RoIG9mIGV4dGVuc2lvbiAqLworCQkJYml0dmVjX3NldF91aW50KGJ2LCAoMSArIDMpLTEsIDYpOworCQkJLyogRUdQUlMgc3VwcG9ydGVkIGluIHRoZSBjZWxsICovCisJCQliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisJCX0gZWxzZSB7CisJCQkvKiA2Yml0IGxlbmd0aCBvZiBleHRlbnNpb24gKi8KKwkJCWJpdHZlY19zZXRfdWludChidiwgKDEgKyA1ICsgMyktMSwgNik7CisJCQkvKiBFR1BSUyBzdXBwb3J0ZWQgaW4gdGhlIGNlbGwgKi8KKwkJCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwkJCS8qIDFiaXQgRUdQUlMgUEFDS0VUIENIQU5ORUwgUkVRVUVTVCAqLworCQkJYml0dmVjX3NldF9iaXQoYnYsIGdjby0+ZXh0X2luZm8udXNlX2VncHJzX3BfY2hfcmVxKTsKKwkJCS8qIDRiaXQgQkVQIFBFUklPRCAqLworCQkJYml0dmVjX3NldF91aW50KGJ2LCBnY28tPmV4dF9pbmZvLmJlcF9wZXJpb2QsIDQpOworCQl9CisJCWJpdHZlY19zZXRfYml0KGJ2LCBnY28tPmV4dF9pbmZvLnBmY19zdXBwb3J0ZWQpOworCQliaXR2ZWNfc2V0X2JpdChidiwgZ2NvLT5leHRfaW5mby5kdG1fc3VwcG9ydGVkKTsKKwkJYml0dmVjX3NldF9iaXQoYnYsIGdjby0+ZXh0X2luZm8uYnNzX3BhZ2luZ19jb29yZGluYXRpb24pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRfZ3Byc19wd3JfY3RybF9wYXJzKHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBncHJzX3Bvd2VyX2N0cmxfcGFycyAqcGNwKQoreworCWJpdHZlY19zZXRfdWludChidiwgcGNwLT5hbHBoYSwgNCk7CisJYml0dmVjX3NldF91aW50KGJ2LCBwY3AtPnRfYXZnX3csIDUpOworCWJpdHZlY19zZXRfdWludChidiwgcGNwLT50X2F2Z190LCA1KTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHBjcC0+cGNfbWVhc19jaGFuLCAxKTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHBjcC0+bl9hdmdfaSwgNCk7Cit9CisKKy8qIEdlbmVyYXRlIFNJMTMgUmVzdCBPY3Rlc3RzICgwNC4wOCBDaGFwdGVyIDEwLjUuMi4zN2IpICovCitpbnQgcmVzdF9vY3RldHNfc2kxMyh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyAqc2kxMykKK3sKKwlzdHJ1Y3QgYml0dmVjIGJ2OworCisJbWVtc2V0KCZidiwgMCwgc2l6ZW9mKGJ2KSk7CisJYnYuZGF0YSA9IGRhdGE7CisJYnYuZGF0YV9sZW4gPSAyMDsKKworCWlmICgwKSB7CisJCS8qIE5vIHJlc3Qgb2N0ZXRzICovCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisJfSBlbHNlIHsKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+YmNjaF9jaGFuZ2VfbWFyaywgMyk7CisJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnNpX2NoYW5nZV9maWVsZCwgNCk7CisJCWlmICgxKSB7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDApOworCQl9IGVsc2UgeworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAxKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPmJjY2hfY2hhbmdlX21hcmssIDIpOworCQkJYXBwZW5kX2dwcnNfbW9iaWxlX2FsbG9jKCZidik7CisJCX0KKwkJaWYgKCFzaTEzLT5wYmNjaF9wcmVzZW50KSB7CisJCQkvKiBQQkNDSCBub3QgcHJlc2VudCBpbiBjZWxsICovCisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDApOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+bm9fcGJjY2gucmFjLCA4KTsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgc2kxMy0+bm9fcGJjY2guc3BnY19jY2NoX3N1cCk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5ub19wYmNjaC5wcmlvX2FjY190aHIsIDMpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+bm9fcGJjY2gubmV0X2N0cmxfb3JkLCAyKTsKKwkJCWFwcGVuZF9ncHJzX2NlbGxfb3B0KCZidiwgJnNpMTMtPmNlbGxfb3B0cyk7CisJCQlhcHBlbmRfZ3Byc19wd3JfY3RybF9wYXJzKCZidiwgJnNpMTMtPnB3cl9jdHJsX3BhcnMpOworCQl9IGVsc2UgeworCQkJLyogUEJDQ0ggcHJlc2VudCBpbiBjZWxsICovCisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDEpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2gucHNpMV9yZXBfcGVyLCA0KTsKKwkJCS8qIFBCQ0NIIERlc2NyaXBpdG9uICovCisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5wYmNjaC5wYiwgNCk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5wYmNjaC50c2MsIDMpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2gudG4sIDMpOworCQkJc3dpdGNoIChzaTEzLT5wYmNjaC5jYXJyaWVyX3R5cGUpIHsKKwkJCWNhc2UgUEJDQ0hfQkNDSDoKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDApOworCQkJCWJpdHZlY19zZXRfYml0KCZidiwgMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFBCQ0NIX0FSRkNOOgorCQkJCWJpdHZlY19zZXRfYml0KCZidiwgMCk7CisJCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAxKTsKKwkJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5wYmNjaC5hcmZjbiwgMTApOworCQkJCWJyZWFrOworCQkJY2FzZSBQQkNDSF9NQUlPOgorCQkJCWJpdHZlY19zZXRfYml0KCZidiwgMSk7CisJCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2gubWFpbywgNik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogM0dQUCBUUyA0NC4wMTggUmVsZWFzZSA2IC8gMTAuNS4yLjM3YiAqLworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOwkvKiBhZGRlZCBSZWxlYXNlIDk5ICovCisJCS8qIGNsYWltIG91ciBTR1NOIGlzIGNvbXBhdGlibGUgd2l0aCBSZWxlYXNlIDk5LCBhcyBFREdFIGFuZCBFR1BSUworCQkgKiB3YXMgb25seSBhZGRlZCBpbiB0aGlzIFJlbGVhc2UgKi8KKwkJYml0dmVjX3NldF9iaXQoJmJ2LCAxKTsKKwl9CisJYml0dmVjX3NwYXJlX3BhZGRpbmcoJmJ2LCAoYnYuZGF0YV9sZW4qOCktMSk7CisJcmV0dXJuIGJ2LmRhdGFfbGVuOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvcnJscC5jIGIvb3BlbmJzYy9zcmMvcnJscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDQ0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ycmxwLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIFJhZGlvIFJlc291cmNlIExDUyAoTG9jYXRpb24pIFByb3RvY29sLCBHTVMgVFMgMDQuMzEgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorCisvKiBSUkxQIG1zUG9zaXRpb25SZXEsIG5zQmFzZWQsCisgKglBY2N1cmFjeT02MCwgTWV0aG9kPWdwcywgUmVzcG9uc2VUaW1lPTIsIG9uZVNldCAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IG1zX2Jhc2VkX3Bvc19yZXFbXSA9IHsgMHg0MCwgMHgwMSwgMHg3OCwgMHhhOCB9OworCisvKiBSUkxQIG1zUG9zaXRpb25SZXEsIG1zQmFzZWRQcmVmLAorCUFjY3VyYWN5PTYwLCBNZXRob2Q9Z3BzT3JFT1RELCBSZXNwb25zZVRpbWU9NSwgbXVsdGlwbGVTZXRzICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgbXNfcHJlZl9wb3NfcmVxW10gID0geyAweDQwLCAweDAyLCAweDc5LCAweDUwIH07CisKKy8qIFJSTFAgbXNQb3NpdGlvblJlcSwgbXNBc3Npc3RlZFByZWYsCisJQWNjdXJhY3k9NjAsIE1ldGhvZD1ncHNPckVPVEQsIFJlc3BvbnNlVGltZT01LCBtdWx0aXBsZVNldHMgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBhc3NfcHJlZl9wb3NfcmVxW10gPSB7IDB4NDAsIDB4MDMsIDB4NzksIDB4NTAgfTsKKworc3RhdGljIGludCBzZW5kX3JybHBfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwljb25zdCB1X2ludDhfdCAqcmVxOworCisJc3dpdGNoIChuZXQtPnJybHAubW9kZSkgeworCWNhc2UgUlJMUF9NT0RFX01TX0JBU0VEOgorCQlyZXEgPSBtc19iYXNlZF9wb3NfcmVxOworCQlicmVhazsKKwljYXNlIFJSTFBfTU9ERV9NU19QUkVGOgorCQlyZXEgPSBtc19wcmVmX3Bvc19yZXE7CisJCWJyZWFrOworCWNhc2UgUlJMUF9NT0RFX0FTU19QUkVGOgorCQlyZXEgPSBhc3NfcHJlZl9wb3NfcmVxOworCQlicmVhazsKKwljYXNlIFJSTFBfTU9ERV9OT05FOgorCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBnc200OF9zZW5kX3JyX2FwcF9pbmZvKGxjaGFuLCAweDAwLAorCQkJCSAgICAgIHNpemVvZihtc19iYXNlZF9wb3NfcmVxKSwgcmVxKTsKK30KKworc3RhdGljIGludCBzdWJzY3Jfc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX1NVQlNDUl9BVFRBQ0hFRDoKKwkJLyogQSBzdWJzY3JpYmVyIGhhcyBhdHRhY2hlZC4gKi8KKwkJc3Vic2NyID0gc2lnbmFsX2RhdGE7CisJCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzdWJzY3IpOworCQlpZiAoIWxjaGFuKQorCQkJYnJlYWs7CisJCXNlbmRfcnJscF9yZXEobGNoYW4pOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFnaW5nX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSAqcHNpZ19kYXRhID0gc2lnbmFsX2RhdGE7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19QQUdJTkdfU1VDQ0VFREVEOgorCQkvKiBBIHN1YnNjcmliZXIgaGFzIGF0dGFjaGVkLiAqLworCQlzZW5kX3JybHBfcmVxKHBzaWdfZGF0YS0+bGNoYW4pOworCQlicmVhazsKKwljYXNlIFNfUEFHSU5HX0VYUElSRUQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBvbl9kc29fbG9hZF9ycmxwKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfU1VCU0NSLCBzdWJzY3Jfc2lnX2NiLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19QQUdJTkcsIHBhZ2luZ19zaWdfY2IsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvcnMyMzIuYyBiL29wZW5ic2Mvc3JjL3JzMjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhZGY1NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3JzMjMyLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qIE9wZW5CU0MgQlMtMTEgVC1MaW5rIGludGVyZmFjZSB1c2luZyBQT1NJWCBzZXJpYWwgcG9ydCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3JzMjMyLmg+CisKKy8qIGFkYXB0aW9uIGxheWVyIGZyb20gR1NNIDA4LjU5ICsgMTIuMjEgdG8gUlMyMzIgKi8KKworc3RydWN0IHNlcmlhbF9oYW5kbGUgeworCXN0cnVjdCBic2NfZmQgZmQ7CisJc3RydWN0IGxsaXN0X2hlYWQgdHhfcXVldWU7CisKKwlzdHJ1Y3QgbXNnYiAqcnhfbXNnOworCXVuc2lnbmVkIGludCByeG1zZ19ieXRlc19taXNzaW5nOworCisJdW5zaWduZWQgaW50IGRlbGF5X21zOworCXN0cnVjdCBnc21fYnRzICpidHM7Cit9OworCisvKiBGSVhNRTogdGhpcyBuZWVkcyB0byBnbyAqLworc3RhdGljIHN0cnVjdCBzZXJpYWxfaGFuZGxlIF9zZXJfaGFuZGxlLCAqc2VyX2hhbmRsZSA9ICZfc2VyX2hhbmRsZTsKKworI2RlZmluZSBMQVBEX0hEUl9MRU4JMTAKKworc3RhdGljIGludCBoYW5kbGVfc2VyX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCk7CisKKy8qIGNhbGxiYWNrIGZyb20gYWJpc19ubSAqLworaW50IF9hYmlzX25tX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX2hhbmRsZSAqc2ggPSBzZXJfaGFuZGxlOworCXVfaW50OF90ICpsYXBkOworCXVuc2lnbmVkIGludCBsZW47CisKKwltc2ctPmwyaCA9IG1zZy0+ZGF0YTsKKworCS8qIHByZXBlbmQgTEFQRCBoZWFkZXIgKi8KKwlsYXBkID0gbXNnYl9wdXNoKG1zZywgTEFQRF9IRFJfTEVOKTsKKworCWxlbiA9IG1zZy0+bGVuIC0gMjsKKworCWxhcGRbMF0gPSAobGVuID4+IDgpICYgMHhmZjsKKwlsYXBkWzFdID0gbGVuICYgMHhmZjsgLyogbGVuZ3RoIG9mIGJ5dGVzIHN0YXJ0aWduIGF0IGxhcGRbMl0gKi8KKwlsYXBkWzJdID0gMHgwMDsKKwlsYXBkWzNdID0gMHgwNzsKKwlsYXBkWzRdID0gMHgwMTsKKwlsYXBkWzVdID0gMHgzZTsKKwlsYXBkWzZdID0gMHgwMDsKKwlsYXBkWzddID0gMHgwMDsKKwlsYXBkWzhdID0gbXNnLT5sZW4gLSAxMDsgLyogbGVuZ3RoIG9mIGJ5dGVzIHN0YXJ0aW5nIGF0IGxhcGRbMTBdICovCisJbGFwZFs5XSA9IGxhcGRbOF0gXiAweDM4OworCisJbXNnYl9lbnF1ZXVlKCZzaC0+dHhfcXVldWUsIG1zZyk7CisJc2gtPmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCisJLyogd2UgdHJ5IHRvIGltbWVkaWF0ZWx5IHNlbmQgKi8KKwloYW5kbGVfc2VyX3dyaXRlKCZzaC0+ZmQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHNlbGVjdC5jIGNhbGxiYWNrIGluIGNhc2Ugd2UgY2FuIHdyaXRlIHRvIHRoZSBSUzIzMiAqLworc3RhdGljIGludCBoYW5kbGVfc2VyX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX2hhbmRsZSAqc2ggPSBiZmQtPmRhdGE7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgd3JpdHRlbjsKKworCW1zZyA9IG1zZ2JfZGVxdWV1ZSgmc2gtPnR4X3F1ZXVlKTsKKwlpZiAoIW1zZykgeworCQliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKwkJcmV0dXJuIDA7CisJfQorCisJREVCVUdQKERNSSwgIlJTMjMyIFRYOiAlc1xuIiwgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisKKwkvKiBzZW5kIG92ZXIgc2VyaWFsIGxpbmUgKi8KKwl3cml0dGVuID0gd3JpdGUoYmZkLT5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbik7CisJaWYgKHdyaXR0ZW4gPCBtc2ctPmxlbikgeworCQlwZXJyb3IoInNob3J0IHdyaXRlOiIpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1zZ2JfZnJlZShtc2cpOworCXVzbGVlcChzaC0+ZGVsYXlfbXMqMTAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBTRVJJQUxfQUxMT0NfU0laRQkzMDAKKworLyogc2VsZWN0LmMgY2FsbGJhY2sgaW4gY2FzZSB3ZSBjYW4gcmVhZCBmcm9tIHRoZSBSUzIzMiAqLworc3RhdGljIGludCBoYW5kbGVfc2VyX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBzZXJpYWxfaGFuZGxlICpzaCA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCByYyA9IDA7CisKKwlpZiAoIXNoLT5yeF9tc2cpIHsKKwkJc2gtPnJ4X21zZyA9IG1zZ2JfYWxsb2MoU0VSSUFMX0FMTE9DX1NJWkUsICJSUzIzMiBSeCIpOworCQlzaC0+cnhfbXNnLT5sMmggPSBOVUxMOworCQlzaC0+cnhfbXNnLT50cnggPSBzaC0+YnRzLT5jMDsKKwl9CisJbXNnID0gc2gtPnJ4X21zZzsKKworCS8qIGZpcnN0IHJlYWQgdHdvIGJ5ZXMgdG8gb2J0YWluIGxlbmd0aCAqLworCWlmIChtc2ctPmxlbiA8IDIpIHsKKwkJcmMgPSByZWFkKHNoLT5mZC5mZCwgbXNnLT50YWlsLCAyIC0gbXNnLT5sZW4pOworCQlpZiAocmMgPCAwKSB7CisJCQlwZXJyb3IoIkVSUk9SIHJlYWRpbmcgZnJvbSBzZXJpYWwgcG9ydCIpOworCQkJbXNnYl9mcmVlKG1zZyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJbXNnYl9wdXQobXNnLCByYyk7CisKKwkJaWYgKG1zZy0+bGVuID49IDIpIHsKKwkJCS8qIHBhcnNlIExBUEQgcGF5bG9hZCBsZW5ndGggKi8KKwkJCWlmIChtc2ctPmRhdGFbMF0gIT0gMCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlN1c3BpY2lvdXMgaGVhZGVyIGJ5dGUgMDogMHglMDJ4XG4iLAorCQkJCQltc2ctPmRhdGFbMF0pOworCisJCQlzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyA9IG1zZy0+ZGF0YVswXSA8PCA4OworCQkJc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcgKz0gbXNnLT5kYXRhWzFdOworCisJCQlpZiAoc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcgPCBMQVBEX0hEUl9MRU4gLTIpCisJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGxlbmd0aCBpbiBoZHI6ICV1XG4iLAorCQkJCQlzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyk7CisJCX0KKwl9IGVsc2UgeworCQkvKiB0cnkgdG8gcmVhZCBhcyBtYW55IG9mIHRoZSBtaXNzaW5nIGJ5dGVzIGFzIGFyZSBhdmFpbGFibGUgKi8KKwkJcmMgPSByZWFkKHNoLT5mZC5mZCwgbXNnLT50YWlsLCBzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyk7CisJCWlmIChyYyA8IDApIHsKKwkJCXBlcnJvcigiRVJST1IgcmVhZGluZyBmcm9tIHNlcmlhbCBwb3J0Iik7CisJCQltc2diX2ZyZWUobXNnKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQltc2diX3B1dChtc2csIHJjKTsKKwkJc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcgLT0gcmM7CisKKwkJaWYgKHNoLT5yeG1zZ19ieXRlc19taXNzaW5nID09IDApIHsKKwkJCS8qIHdlIGhhdmUgb25lIGNvbXBsZXRlIG1lc3NhZ2Ugbm93ICovCisJCQlzaC0+cnhfbXNnID0gTlVMTDsKKworCQkJaWYgKG1zZy0+bGVuID4gTEFQRF9IRFJfTEVOKQorCQkJCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgTEFQRF9IRFJfTEVOOworCisJCQlERUJVR1AoRE1JLCAiUlMyMzIgUlg6ICVzXG4iLCBoZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKwkJCXJjID0gaGFuZGxlX3NlcmlhbF9tc2cobXNnKTsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworLyogc2VsZWN0LmMgY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQgc2VyaWFsX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJjID0gMDsKKworCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCXJjID0gaGFuZGxlX3Nlcl9yZWFkKGJmZCk7CisKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJcmMgPSBoYW5kbGVfc2VyX3dyaXRlKGJmZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCByczIzMl9zZXR1cChjb25zdCBjaGFyICpzZXJpYWxfcG9ydCwgdW5zaWduZWQgaW50IGRlbGF5X21zLAorCQlzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYywgc2VyaWFsX2ZkOworCXN0cnVjdCB0ZXJtaW9zIHRpbzsKKworCXNlcmlhbF9mZCA9IG9wZW4oc2VyaWFsX3BvcnQsIE9fUkRXUik7CisJaWYgKHNlcmlhbF9mZCA8IDApIHsKKwkJcGVycm9yKCJjYW5ub3Qgb3BlbiBzZXJpYWwgcG9ydDoiKTsKKwkJcmV0dXJuIHNlcmlhbF9mZDsKKwl9CisKKwkvKiBzZXQgYmF1ZHJhdGUgKi8KKwlyYyA9IHRjZ2V0YXR0cihzZXJpYWxfZmQsICZ0aW8pOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJ0Y2dldGF0dHIoKSIpOworCQlyZXR1cm4gcmM7CisJfQorCWNmc2V0aXNwZWVkKCZ0aW8sIEIxOTIwMCk7CisJY2ZzZXRvc3BlZWQoJnRpbywgQjE5MjAwKTsKKwl0aW8uY19jZmxhZyB8PSAgKENSRUFEIHwgQ0xPQ0FMIHwgQ1M4KTsKKwl0aW8uY19jZmxhZyAmPSB+KFBBUkVOQiB8IENTVE9QQiB8IENTSVpFIHwgQ1JUU0NUUyk7CisJdGlvLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPIHwgRUNIT0UgfCBJU0lHKTsKKwl0aW8uY19pZmxhZyB8PSAgKElOUENLIHwgSVNUUklQKTsKKwl0aW8uY19pZmxhZyAmPSB+KElTVFJJUCB8IElYT04gfCBJWE9GRiB8IElHTkJSSyB8IElOTENSIHwgSUNSTkwgfCBJR05DUik7CisJdGlvLmNfb2ZsYWcgJj0gfihPUE9TVCk7CisJcmMgPSB0Y3NldGF0dHIoc2VyaWFsX2ZkLCBUQ1NBRFJBSU4sICZ0aW8pOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJ0Y3NldGF0dHIoKSIpOworCQlyZXR1cm4gcmM7CisJfQorCisJSU5JVF9MTElTVF9IRUFEKCZzZXJfaGFuZGxlLT50eF9xdWV1ZSk7CisJc2VyX2hhbmRsZS0+ZmQuZmQgPSBzZXJpYWxfZmQ7CisJc2VyX2hhbmRsZS0+ZmQud2hlbiA9IEJTQ19GRF9SRUFEOworCXNlcl9oYW5kbGUtPmZkLmNiID0gc2VyaWFsX2ZkX2NiOworCXNlcl9oYW5kbGUtPmZkLmRhdGEgPSBzZXJfaGFuZGxlOworCXNlcl9oYW5kbGUtPmRlbGF5X21zID0gZGVsYXlfbXM7CisJc2VyX2hhbmRsZS0+YnRzID0gYnRzOworCXJjID0gYnNjX3JlZ2lzdGVyX2ZkKCZzZXJfaGFuZGxlLT5mZCk7CisJaWYgKHJjIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCByZWdpc3RlciBGRDogJXNcbiIsCisJCQlzdHJlcnJvcihyYykpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ydHBfcHJveHkuYyBiL29wZW5ic2Mvc3JjL3J0cF9wcm94eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDE3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ydHBfcHJveHkuYwpAQCAtMCwwICsxLDcyMSBAQAorLyogUlRQIHByb3h5IGhhbmRsaW5nIGZvciBpcC5hY2Nlc3MgbmFub0JUUyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4gICAgLyogZ2V0dGltZW9mZGF5KCkgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAvKiBnZXQuLigpICovCisjaW5jbHVkZSA8dGltZS5oPiAgICAgICAgLyogY2xvY2soKSAqLworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+IC8qIHVuYW1lKCkgKi8KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnRwX3Byb3h5Lmg+CisKK3N0YXRpYyBMTElTVF9IRUFEKHJ0cF9zb2NrZXRzKTsKKworLyogc2hvdWxkIHdlIG1hbmdsZSB0aGUgQ05BTUUgaW5zaWRlIFNERVMgb2YgUlRDUCBwYWNrZXRzPyBXZSBkaXNhYmxlCisgKiB0aGlzIGJ5IGRlZmF1bHQsIGFzIGl0IHNlZW1zIHRvIGJlIG5vdCBuZWVkZWQgKi8KK3N0YXRpYyBpbnQgbWFuZ2xlX3J0Y3BfY25hbWUgPSAwOworCitlbnVtIHJ0cF9iZmRfcHJpdiB7CisJUlRQX1BSSVZfTk9ORSwKKwlSVFBfUFJJVl9SVFAsCisJUlRQX1BSSVZfUlRDUAorfTsKKworI2RlZmluZSBSVFBfQUxMT0NfU0laRQkxNTAwCisKKy8qIGFjY29yZGluZyB0byBSRkMgMTg4OSAqLworc3RydWN0IHJ0Y3BfaGRyIHsKKwl1X2ludDhfdCBieXRlMDsKKwl1X2ludDhfdCB0eXBlOworCXVfaW50MTZfdCBsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFJUQ1BfVFlQRV9TREVTCTIwMgorCQorI2RlZmluZSBSVENQX0lFX0NOQU1FCTEKKworLyogYWNjb3JkaW5nIHRvIFJGQyAzNTUwICovCitzdHJ1Y3QgcnRwX2hkciB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVfaW50OF90ICBjc3JjX2NvdW50OjQsCisJCSAgZXh0ZW5zaW9uOjEsCisJCSAgcGFkZGluZzoxLAorCQkgIHZlcnNpb246MjsKKwl1X2ludDhfdCAgcGF5bG9hZF90eXBlOjcsCisJCSAgbWFya2VyOjE7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdV9pbnQ4X3QgIHZlcnNpb246MiwKKwkJICBwYWRkaW5nOjEsCisJCSAgZXh0ZW5zaW9uOjEsCisJCSAgY3NyY19jb3VudDo0OworCXVfaW50OF90ICBtYXJrZXI6MSwKKwkJICBwYXlsb2FkX3R5cGU6NzsKKyNlbmRpZgorCXVfaW50MTZfdCBzZXF1ZW5jZTsKKwl1X2ludDMyX3QgdGltZXN0YW1wOworCXVfaW50MzJfdCBzc3JjOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJ0cF94X2hkciB7CisJdV9pbnQxNl90IGJ5X3Byb2ZpbGU7CisJdV9pbnQxNl90IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgUlRQX1ZFUlNJT04JMgorCisvKiBkZWNvZGUgYW4gcnRwIGZyYW1lIGFuZCBjcmVhdGUgYSBuZXcgYnVmZmVyIHdpdGggcGF5bG9hZCAqLworc3RhdGljIGludCBydHBfZGVjb2RlKHN0cnVjdCBtc2diICptc2csIHVfaW50MzJfdCBjYWxscmVmLCBzdHJ1Y3QgbXNnYiAqKmRhdGEpCit7CisJc3RydWN0IG1zZ2IgKm5ld19tc2c7CisJc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZTsKKwlzdHJ1Y3QgcnRwX2hkciAqcnRwaCA9IChzdHJ1Y3QgcnRwX2hkciAqKW1zZy0+ZGF0YTsKKwlzdHJ1Y3QgcnRwX3hfaGRyICpydHB4aDsKKwl1X2ludDhfdCAqcGF5bG9hZDsKKwlpbnQgcGF5bG9hZF9sZW47CisJaW50IG1zZ190eXBlOworCWludCB4X2xlbjsKKworCWlmIChtc2ctPmxlbiA8IDEyKSB7CisJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB0b28gc2hvcnQgKGxlbiA9ICVkKVxuIiwKKwkJCW1zZy0+bGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChydHBoLT52ZXJzaW9uICE9IFJUUF9WRVJTSU9OKSB7CisJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCB2ZXJzaW9uICVkIG5vdCBzdXBwb3J0ZWQuXG4iLAorCQkJcnRwaC0+dmVyc2lvbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYXlsb2FkID0gbXNnLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBydHBfaGRyKSArIChydHBoLT5jc3JjX2NvdW50IDw8IDIpOworCXBheWxvYWRfbGVuID0gbXNnLT5sZW4gLSBzaXplb2Yoc3RydWN0IHJ0cF9oZHIpIC0gKHJ0cGgtPmNzcmNfY291bnQgPDwgMik7CisJaWYgKHBheWxvYWRfbGVuIDwgMCkgeworCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgdG9vIHNob3J0IChsZW4gPSAlZCwgIgorCQkJImNzcmMgY291bnQgPSAlZClcbiIsIG1zZy0+bGVuLCBydHBoLT5jc3JjX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChydHBoLT5leHRlbnNpb24pIHsKKwkJaWYgKHBheWxvYWRfbGVuIDwgc2l6ZW9mKHN0cnVjdCBydHBfeF9oZHIpKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgdG9vIHNob3J0IGZvciAiCisJCQkJImV4dGVuc2lvbiBoZWFkZXJcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcnRweGggPSAoc3RydWN0IHJ0cF94X2hkciAqKXBheWxvYWQ7CisJCXhfbGVuID0gbnRvaHMocnRweGgtPmxlbmd0aCkgKiA0ICsgc2l6ZW9mKHN0cnVjdCBydHBfeF9oZHIpOworCQlwYXlsb2FkICs9IHhfbGVuOworCQlwYXlsb2FkX2xlbiAtPSB4X2xlbjsKKwkJaWYgKHBheWxvYWRfbGVuIDwgMCkgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHRvbyBzaG9ydCwgIgorCQkJCSJleHRlbnNpb24gaGVhZGVyIGV4Y2VlZHMgZnJhbWUgbGVuZ3RoXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCWlmIChydHBoLT5wYWRkaW5nKSB7CisJCWlmIChwYXlsb2FkX2xlbiA8IDApIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB0b28gc2hvcnQgZm9yICIKKwkJCQkicGFkZGluZyBsZW5ndGhcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcGF5bG9hZF9sZW4gLT0gcGF5bG9hZFtwYXlsb2FkX2xlbiAtIDFdOworCQlpZiAocGF5bG9hZF9sZW4gPCAwKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgd2l0aCBwYWRkaW5nICIKKwkJCQkiZ3JlYXRlciB0aGFuIHBheWxvYWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlzd2l0Y2ggKHJ0cGgtPnBheWxvYWRfdHlwZSkgeworCWNhc2UgUlRQX1BUX0dTTV9GVUxMOgorCQltc2dfdHlwZSA9IEdTTV9UQ0hGX0ZSQU1FOworCQlpZiAocGF5bG9hZF9sZW4gIT0gMzMpIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmdWxsIHJhdGUgZnJhbWUgd2l0aCAiCisJCQkJInBheWxvYWQgbGVuZ3RoICE9IDMyIChsZW4gPSAlZClcbiIsCisJCQkJcGF5bG9hZF9sZW4pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSVFBfUFRfR1NNX0VGUjoKKwkJbXNnX3R5cGUgPSBHU01fVENIRl9GUkFNRV9FRlI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB3aXRoIHVua25vd24gcGF5bG9hZCAiCisJCQkidHlwZSAlZFxuIiwgcnRwaC0+cGF5bG9hZF90eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbmV3X21zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBnc21fZGF0YV9mcmFtZSkgKyBwYXlsb2FkX2xlbiwKKwkJCQkiR1NNLURBVEEiKTsKKwlpZiAoIW5ld19tc2cpCisJCXJldHVybiAtRU5PTUVNOworCWZyYW1lID0gKHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqKShuZXdfbXNnLT5kYXRhKTsKKwlmcmFtZS0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlmcmFtZS0+Y2FsbHJlZiA9IGNhbGxyZWY7CisJbWVtY3B5KGZyYW1lLT5kYXRhLCBwYXlsb2FkLCBwYXlsb2FkX2xlbik7CisJbXNnYl9wdXQobmV3X21zZywgc2l6ZW9mKHN0cnVjdCBnc21fZGF0YV9mcmFtZSkgKyBwYXlsb2FkX2xlbik7CisKKwkqZGF0YSA9IG5ld19tc2c7CisJcmV0dXJuIDA7Cit9CisKKy8qICJ0byAtIGZyb20iICovCitzdGF0aWMgdm9pZCB0dl9kaWZmZXJlbmNlKHN0cnVjdCB0aW1ldmFsICpkaWZmLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqZnJvbSwKKwkJCSAgY29uc3Qgc3RydWN0IHRpbWV2YWwgKl9fdG8pCit7CisJc3RydWN0IHRpbWV2YWwgX3RvID0gKl9fdG8sICp0byA9ICZfdG87CisKKwlpZiAodG8tPnR2X3VzZWMgPCBmcm9tLT50dl91c2VjKSB7CisJCXRvLT50dl9zZWMgLT0gMTsKKwkJdG8tPnR2X3VzZWMgKz0gMTAwMDAwMDsKKwl9CisKKwlkaWZmLT50dl91c2VjID0gdG8tPnR2X3VzZWMgLSBmcm9tLT50dl91c2VjOworCWRpZmYtPnR2X3NlYyA9IHRvLT50dl9zZWMgLSBmcm9tLT50dl9zZWM7Cit9CisKKy8qIGVuY29kZSBhbmQgc2VuZCBhIHJ0cCBmcmFtZSAqLworaW50IHJ0cF9zZW5kX2ZyYW1lKHN0cnVjdCBydHBfc29ja2V0ICpycywgc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZSkKK3sKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcyA9ICZycy0+cnRwOworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IHJ0cF9oZHIgKnJ0cGg7CisJaW50IHBheWxvYWRfdHlwZTsKKwlpbnQgcGF5bG9hZF9sZW47CisJaW50IGR1cmF0aW9uOyAvKiBpbiBzYW1wbGVzICovCisKKwlpZiAocnMtPnR4X2FjdGlvbiAhPSBSVFBfU0VORF9ET1dOU1RSRUFNKSB7CisJCS8qIGluaXRpYWxpemUgc2VxdWVuY2VzICovCisJCXJzLT50eF9hY3Rpb24gPSBSVFBfU0VORF9ET1dOU1RSRUFNOworCQlycy0+dHJhbnNtaXQuc3NyYyA9IHJhbmQoKTsKKwkJcnMtPnRyYW5zbWl0LnNlcXVlbmNlID0gcmFuZG9tKCk7CisJCXJzLT50cmFuc21pdC50aW1lc3RhbXAgPSByYW5kb20oKTsKKwl9CisKKwlzd2l0Y2ggKGZyYW1lLT5tc2dfdHlwZSkgeworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJCXBheWxvYWRfdHlwZSA9IFJUUF9QVF9HU01fRlVMTDsKKwkJcGF5bG9hZF9sZW4gPSAzMzsKKwkJZHVyYXRpb24gPSAxNjA7CisJCWJyZWFrOworCWNhc2UgR1NNX1RDSEZfRlJBTUVfRUZSOgorCQlwYXlsb2FkX3R5cGUgPSBSVFBfUFRfR1NNX0VGUjsKKwkJcGF5bG9hZF9sZW4gPSAzMTsKKwkJZHVyYXRpb24gPSAxNjA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE1VWCwgInVuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZSAlZFxuIiwKKwkJCWZyYW1lLT5tc2dfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXsKKwkJc3RydWN0IHRpbWV2YWwgdHYsIHR2X2RpZmY7CisJCWxvbmcgaW50IHVzZWNfZGlmZiwgZnJhbWVfZGlmZjsKKworCQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwkJdHZfZGlmZmVyZW5jZSgmdHZfZGlmZiwgJnJzLT50cmFuc21pdC5sYXN0X3R2LCAmdHYpOworCQlycy0+dHJhbnNtaXQubGFzdF90diA9IHR2OworCisJCXVzZWNfZGlmZiA9IHR2X2RpZmYudHZfc2VjICogMTAwMDAwMCArIHR2X2RpZmYudHZfdXNlYzsKKwkJZnJhbWVfZGlmZiA9ICh1c2VjX2RpZmYgLyAyMDAwMCk7CisKKwkJaWYgKGFicyhmcmFtZV9kaWZmKSA+IDEpIHsKKwkJCWxvbmcgaW50IGZyYW1lX2RpZmZfZXhjZXNzID0gZnJhbWVfZGlmZiAtIDE7CisKKwkJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsCisJCQkJIkNvcnJlY3RpbmcgZnJhbWUgZGlmZmVyZW5jZSBvZiAlbGQgZnJhbWVzXG4iLCBmcmFtZV9kaWZmX2V4Y2Vzcyk7CisJCQlycy0+dHJhbnNtaXQuc2VxdWVuY2UgKz0gZnJhbWVfZGlmZl9leGNlc3M7CisJCQlycy0+dHJhbnNtaXQudGltZXN0YW1wICs9IGZyYW1lX2RpZmZfZXhjZXNzICogZHVyYXRpb247CisJCX0KKwl9CisKKwltc2cgPSBtc2diX2FsbG9jKHNpemVvZihzdHJ1Y3QgcnRwX2hkcikgKyBwYXlsb2FkX2xlbiwgIlJUUC1HU00tRlVMTCIpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKwlydHBoID0gKHN0cnVjdCBydHBfaGRyICopbXNnLT5kYXRhOworCXJ0cGgtPnZlcnNpb24gPSBSVFBfVkVSU0lPTjsKKwlydHBoLT5wYWRkaW5nID0gMDsKKwlydHBoLT5leHRlbnNpb24gPSAwOworCXJ0cGgtPmNzcmNfY291bnQgPSAwOworCXJ0cGgtPm1hcmtlciA9IDA7CisJcnRwaC0+cGF5bG9hZF90eXBlID0gcGF5bG9hZF90eXBlOworCXJ0cGgtPnNlcXVlbmNlID0gaHRvbnMocnMtPnRyYW5zbWl0LnNlcXVlbmNlKyspOworCXJ0cGgtPnRpbWVzdGFtcCA9IGh0b25sKHJzLT50cmFuc21pdC50aW1lc3RhbXApOworCXJzLT50cmFuc21pdC50aW1lc3RhbXAgKz0gZHVyYXRpb247CisJcnRwaC0+c3NyYyA9IGh0b25sKHJzLT50cmFuc21pdC5zc3JjKTsKKwltZW1jcHkobXNnLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBydHBfaGRyKSwgZnJhbWUtPmRhdGEsIHBheWxvYWRfbGVuKTsKKwltc2diX3B1dChtc2csIHNpemVvZihzdHJ1Y3QgcnRwX2hkcikgKyBwYXlsb2FkX2xlbik7CisJbXNnYl9lbnF1ZXVlKCZyc3MtPnR4X3F1ZXVlLCBtc2cpOworCXJzcy0+YmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGl0ZXJhdGUgb3ZlciBhbGwgY2h1bmtzIGluIG9uZSBSVENQIG1lc3NhZ2UsIGxvb2sgZm9yIENOQU1FIElFcyBhbmQKKyAqIHJlcGxhY2UgYWxsIG9mIHRob3NlIHdpdGggJ25ld19jbmFtZScgKi8KK3N0YXRpYyBpbnQgcnRjcF9zZGVzX2NuYW1lX21hbmdsZShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgcnRjcF9oZHIgKnJoLAorCQkJCSAgdV9pbnQxNl90ICpydGNwX2xlbiwgY29uc3QgY2hhciAqbmV3X2NuYW1lKQoreworCXVfaW50OF90ICpydGNwX2VuZDsKKwl1X2ludDhfdCAqY3VyID0gKHVfaW50OF90ICopIHJoOworCXVfaW50OF90IHRhZywgbGVuID0gMDsKKworCXJ0Y3BfZW5kID0gY3VyICsgKnJ0Y3BfbGVuOworCS8qIG1vdmUgY3VyIHRvIGVuZCBvZiBSVFAgaGVhZGVyICovCisJY3VyICs9IHNpemVvZigqcmgpOworCisJLyogaXRlcmF0ZSBvdmVyIENodW5rcyAqLworCXdoaWxlIChjdXIrNCA8IHJ0Y3BfZW5kKSB7CisJCS8qIHNraXAgZm91ciBieXRlcyBTU1JDL0NTUkMgKi8KKwkJY3VyICs9IDQ7CisJCisJCS8qIGl0ZXJhdGUgb3ZlciBJRSdzIGluc2lkZSB0aGUgY2h1bmsgKi8KKwkJd2hpbGUgKGN1cisxIDwgcnRjcF9lbmQpIHsKKwkJCXRhZyA9ICpjdXIrKzsKKwkJCWlmICh0YWcgPT0gMCkgeworCQkJCS8qIGVuZCBvZiBjaHVuaywgc2tpcCBhZGRpdGlvbmFsIHplcm8gKi8KKwkJCQl3aGlsZSAoKmN1cisrID09IDApIHsgfQorCQkJCWJyZWFrOworCQkJfQorCQkJbGVuID0gKmN1cisrOworCQorCQkJaWYgKHRhZyA9PSBSVENQX0lFX0NOQU1FKSB7CisJCQkJLyogd2UndmUgZm91bmQgdGhlIENOQU1FLCBsZXRzIG1hbmdsZSBpdCAqLworCQkJCWlmIChsZW4gPCBzdHJsZW4obmV3X2NuYW1lKSkgeworCQkJCQkvKiB3ZSBuZWVkIHRvIG1ha2UgbW9yZSBzcGFjZSAqLworCQkJCQlpbnQgaW5jcmVhc2UgPSBzdHJsZW4obmV3X2NuYW1lKSAtIGxlbjsKKworCQkJCQltc2diX3B1c2gobXNnLCBpbmNyZWFzZSk7CisJCQkJCW1lbW1vdmUoY3VyK2xlbitpbmNyZWFzZSwgY3VyK2xlbiwKKwkJCQkJCXJ0Y3BfZW5kIC0gKGN1citsZW4pKTsKKwkJCQkJLyogRklYTUU6IHdlIGhhdmUgdG8gcmVzcGVjdCBSVENQCisJCQkJCSAqIHBhZGRpbmcvYWxpZ25tZW50IHJ1bGVzISAqLworCQkJCQlsZW4gKz0gaW5jcmVhc2U7CisJCQkJCSooY3VyLTEpICs9IGluY3JlYXNlOworCQkJCQlydGNwX2VuZCArPSBpbmNyZWFzZTsKKwkJCQkJKnJ0Y3BfbGVuICs9IGluY3JlYXNlOworCQkJCX0KKwkJCQkvKiBjb3B5IG5ldyBDTkFNRSBpbnRvIG1lc3NhZ2UgKi8KKwkJCQltZW1jcHkoY3VyLCBuZXdfY25hbWUsIHN0cmxlbihuZXdfY25hbWUpKTsKKwkJCQkvKiBGSVhNRTogemVybyB0aGUgcGFkZGluZyBpbiBjYXNlIG5ldyBDTkFNRQorCQkJCSAqIGlzIHNtYWxsZXIgdGhhbiBvbGQgb25lICEhISAqLworCQkJfQorCQkJY3VyICs9IGxlbjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Y3BfbWFuZ2xlKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBydHBfc29ja2V0ICpycykKK3sKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcyA9ICZycy0+cnRjcDsKKwlzdHJ1Y3QgcnRjcF9oZHIgKnJ0cGg7CisJdV9pbnQxNl90IG9sZF9sZW47CisJaW50IHJjOworCisJaWYgKCFtYW5nbGVfcnRjcF9jbmFtZSkKKwkJcmV0dXJuIDA7CisKKwlwcmludGYoIlJUQ1BcbiIpOworCS8qIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIFJUQ1AgbWVzc2FnZXMgKi8KKwlydHBoID0gKHN0cnVjdCBydGNwX2hkciAqKW1zZy0+ZGF0YTsKKwl3aGlsZSAoKHZvaWQgKilydHBoICsgc2l6ZW9mKCpydHBoKSA8PSAodm9pZCAqKW1zZy0+ZGF0YSArIG1zZy0+bGVuKSB7CisJCW9sZF9sZW4gPSAobnRvaHMocnRwaC0+bGVuZ3RoKSArIDEpICogNDsKKwkJaWYgKCh2b2lkICopcnRwaCArIG9sZF9sZW4gPiAodm9pZCAqKW1zZy0+ZGF0YSArIG1zZy0+bGVuKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVENQIHBhY2tldCB0b28gc2hvcnQgZm9yICIKKwkJCQkibGVuZ3RoIGVsZW1lbnRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHJ0cGgtPnR5cGUgPT0gUlRDUF9UWVBFX1NERVMpIHsKKwkJCWNoYXIgbmV3X2NuYW1lWzI1NV07CisJCQlzdHJuY3B5KG5ld19jbmFtZSwgaW5ldF9udG9hKHJzcy0+c2luX2xvY2FsLnNpbl9hZGRyKSwKKwkJCQlzaXplb2YobmV3X2NuYW1lKSk7CisJCQluZXdfY25hbWVbc2l6ZW9mKG5ld19jbmFtZSktMV0gPSAnXDAnOworCQkJcmMgPSBydGNwX3NkZXNfY25hbWVfbWFuZ2xlKG1zZywgcnRwaCwgJm9sZF9sZW4sCisJCQkJCQkgICAgbmV3X2NuYW1lKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQl9CisJCXJ0cGggPSAodm9pZCAqKXJ0cGggKyBvbGRfbGVuOworCX0KKworCXJldHVybiAwOworfQorCisvKiByZWFkIGZyb20gaW5jb21pbmcgUlRQL1JUQ1Agc29ja2V0ICovCitzdGF0aWMgaW50IHJ0cF9zb2NrZXRfcmVhZChzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzKQoreworCWludCByYzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhSVFBfQUxMT0NfU0laRSwgIlJUUC9SVENQIik7CisJc3RydWN0IG1zZ2IgKm5ld19tc2c7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpvdGhlcl9yc3M7CisKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyYyA9IHJlYWQocnNzLT5iZmQuZmQsIG1zZy0+ZGF0YSwgUlRQX0FMTE9DX1NJWkUpOworCWlmIChyYyA8PSAwKSB7CisJCXJzcy0+YmZkLndoZW4gJj0gfkJTQ19GRF9SRUFEOworCQlyZXR1cm4gcmM7CisJfQorCisJbXNnYl9wdXQobXNnLCByYyk7CisKKwlzd2l0Y2ggKHJzLT5yeF9hY3Rpb24pIHsKKwljYXNlIFJUUF9QUk9YWToKKwkJaWYgKCFycy0+cHJveHkub3RoZXJfc29jaykgeworCQkJcmMgPSAtRUlPOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlpZiAocnNzLT5iZmQucHJpdl9uciA9PSBSVFBfUFJJVl9SVFApCisJCQlvdGhlcl9yc3MgPSAmcnMtPnByb3h5Lm90aGVyX3NvY2stPnJ0cDsKKwkJZWxzZSBpZiAocnNzLT5iZmQucHJpdl9uciA9PSBSVFBfUFJJVl9SVENQKSB7CisJCQlvdGhlcl9yc3MgPSAmcnMtPnByb3h5Lm90aGVyX3NvY2stPnJ0Y3A7CisJCQkvKiBtb2RpZnkgUlRDUCBTREVTIENOQU1FICovCisJCQlyYyA9IHJ0Y3BfbWFuZ2xlKG1zZywgcnMpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlnb3RvIG91dF9mcmVlOworCQl9IGVsc2UgeworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQltc2diX2VucXVldWUoJm90aGVyX3Jzcy0+dHhfcXVldWUsIG1zZyk7CisJCW90aGVyX3Jzcy0+YmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCQlicmVhazsKKworCWNhc2UgUlRQX1JFQ1ZfVVBTVFJFQU06CisJCWlmICghcnMtPnJlY2VpdmUuY2FsbHJlZiB8fCAhcnMtPnJlY2VpdmUubmV0KSB7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCWlmIChyc3MtPmJmZC5wcml2X25yID09IFJUUF9QUklWX1JUQ1ApIHsKKwkJCWlmICghbWFuZ2xlX3J0Y3BfY25hbWUpIHsKKwkJCQltc2diX2ZyZWUobXNnKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIG1vZGlmeSBSVENQIFNERVMgQ05BTUUgKi8KKwkJCXJjID0gcnRjcF9tYW5nbGUobXNnLCBycyk7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQltc2diX2VucXVldWUoJnJzcy0+dHhfcXVldWUsIG1zZyk7CisJCQlyc3MtPmJmZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyc3MtPmJmZC5wcml2X25yICE9IFJUUF9QUklWX1JUUCkgeworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlyYyA9IHJ0cF9kZWNvZGUobXNnLCBycy0+cmVjZWl2ZS5jYWxscmVmLCAmbmV3X21zZyk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dF9mcmVlOworCQltc2diX2ZyZWUobXNnKTsKKwkJbXNnYl9lbnF1ZXVlKCZycy0+cmVjZWl2ZS5uZXQtPnVwcXVldWUsIG5ld19tc2cpOworCQlicmVhazsKKworCWNhc2UgUlRQX05PTkU6IC8qIGlmIHNvY2tldCBleGlzdHMsIGJ1dCBkaXNhYmxlZCBieSBhcHAgKi8KKwkJbXNnYl9mcmVlKG1zZyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworCitvdXRfZnJlZToKKwltc2diX2ZyZWUobXNnKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHdyaXRlIGZyb20gdHhfcXVldWUgdG8gUlRQL1JUQ1Agc29ja2V0ICovCitzdGF0aWMgaW50IHJ0cF9zb2NrZXRfd3JpdGUoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCBzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCB3cml0dGVuOworCisJbXNnID0gbXNnYl9kZXF1ZXVlKCZyc3MtPnR4X3F1ZXVlKTsKKwlpZiAoIW1zZykgeworCQlyc3MtPmJmZC53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisJCXJldHVybiAwOworCX0KKworCXdyaXR0ZW4gPSB3cml0ZShyc3MtPmJmZC5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbik7CisJaWYgKHdyaXR0ZW4gPCBtc2ctPmxlbikgeworCQlMT0dQKERNSUIsIExPR0xfRVJST1IsICJzaG9ydCB3cml0ZSIpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbXNnYl9mcmVlKG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBjYWxsYmFjayBmb3IgdGhlIHNlbGVjdC5jOmJmZF8qIGxheWVyICovCitzdGF0aWMgaW50IHJ0cF9iZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHJ0cF9zb2NrZXQgKnJzID0gYmZkLT5kYXRhOworCXN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzOworCisJc3dpdGNoIChiZmQtPnByaXZfbnIpIHsKKwljYXNlIFJUUF9QUklWX1JUUDoKKwkJcnNzID0gJnJzLT5ydHA7CisJCWJyZWFrOworCWNhc2UgUlRQX1BSSVZfUlRDUDoKKwkJcnNzID0gJnJzLT5ydGNwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZmxhZ3MgJiBCU0NfRkRfUkVBRCkKKwkJcnRwX3NvY2tldF9yZWFkKHJzLCByc3MpOworCisJaWYgKGZsYWdzICYgQlNDX0ZEX1dSSVRFKQorCQlydHBfc29ja2V0X3dyaXRlKHJzLCByc3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcnNzKHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzLAorCQkgICAgIHN0cnVjdCBydHBfc29ja2V0ICpycywgaW50IGZkLCBpbnQgcHJpdl9ucikKK3sKKwkvKiBpbml0aWFsaXplIGJmZCAqLworCXJzcy0+YmZkLmZkID0gZmQ7CisJcnNzLT5iZmQuZGF0YSA9IHJzOworCXJzcy0+YmZkLnByaXZfbnIgPSBwcml2X25yOworCXJzcy0+YmZkLmNiID0gcnRwX2JmZF9jYjsKK30KKworc3RydWN0IHJ0cF9zb2NrZXQgKnJ0cF9zb2NrZXRfY3JlYXRlKHZvaWQpCit7CisJaW50IHJjOworCXN0cnVjdCBydHBfc29ja2V0ICpyczsKKworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9jcmVhdGUoKTogIik7CisKKwlycyA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IHJ0cF9zb2NrZXQpOworCWlmICghcnMpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MTElTVF9IRUFEKCZycy0+cnRwLnR4X3F1ZXVlKTsKKwlJTklUX0xMSVNUX0hFQUQoJnJzLT5ydGNwLnR4X3F1ZXVlKTsKKworCXJjID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJaW5pdF9yc3MoJnJzLT5ydHAsIHJzLCByYywgUlRQX1BSSVZfUlRQKTsKKwlyYyA9IGJzY19yZWdpc3Rlcl9mZCgmcnMtPnJ0cC5iZmQpOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X3J0cF9zb2NrZXQ7CisKKwlyYyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfcnRwX2JmZDsKKworCWluaXRfcnNzKCZycy0+cnRjcCwgcnMsIHJjLCBSVFBfUFJJVl9SVENQKTsKKwlyYyA9IGJzY19yZWdpc3Rlcl9mZCgmcnMtPnJ0Y3AuYmZkKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9ydGNwX3NvY2tldDsKKworCURFQlVHUEMoRE1VWCwgInN1Y2Nlc3NcbiIpOworCisJcmMgPSBydHBfc29ja2V0X2JpbmQocnMsIElOQUREUl9BTlkpOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X3J0Y3BfYmZkOworCisJcmV0dXJuIHJzOworCitvdXRfcnRjcF9iZmQ6CisJYnNjX3VucmVnaXN0ZXJfZmQoJnJzLT5ydGNwLmJmZCk7CitvdXRfcnRjcF9zb2NrZXQ6CisJY2xvc2UocnMtPnJ0Y3AuYmZkLmZkKTsKK291dF9ydHBfYmZkOgorCWJzY191bnJlZ2lzdGVyX2ZkKCZycy0+cnRwLmJmZCk7CitvdXRfcnRwX3NvY2tldDoKKwljbG9zZShycy0+cnRwLmJmZC5mZCk7CitvdXRfZnJlZToKKwl0YWxsb2NfZnJlZShycyk7CisJREVCVUdQQyhETVVYLCAiZmFpbGVkXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBydHBfc3ViX3NvY2tldF9iaW5kKHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzLCB1X2ludDMyX3QgaXAsCisJCQkJdV9pbnQxNl90IHBvcnQpCit7CisJaW50IHJjOworCXNvY2tsZW5fdCBhbGVuID0gc2l6ZW9mKHJzcy0+c2luX2xvY2FsKTsKKworCXJzcy0+c2luX2xvY2FsLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXJzcy0+c2luX2xvY2FsLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGlwKTsKKwlyc3MtPnNpbl9sb2NhbC5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCXJzcy0+YmZkLndoZW4gfD0gQlNDX0ZEX1JFQUQ7CisKKwlyYyA9IGJpbmQocnNzLT5iZmQuZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcnNzLT5zaW5fbG9jYWwsCisJCSAgc2l6ZW9mKHJzcy0+c2luX2xvY2FsKSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogcmV0cmlldmUgdGhlIGFkZHJlc3Mgd2UgYWN0dWFsbHkgYm91bmQgdG8sIGluIGNhc2Ugd2UKKwkgKiBwYXNzZWQgSU5BRERSX0FOWSBhcyBJUCBhZGRyZXNzICovCisJcmV0dXJuIGdldHNvY2tuYW1lKHJzcy0+YmZkLmZkLCAoc3RydWN0IHNvY2thZGRyICopJnJzcy0+c2luX2xvY2FsLAorCQkJICAgJmFsZW4pOworfQorCisjZGVmaW5lIFJUUF9QT1JUX0JBU0UJMzAwMDAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV4dF91ZHBfcG9ydCA9IFJUUF9QT1JUX0JBU0U7CisKKy8qIGJpbmQgYSBSVFAgc29ja2V0IHRvIGEgbG9jYWwgYWRkcmVzcyAqLworaW50IHJ0cF9zb2NrZXRfYmluZChzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHVfaW50MzJfdCBpcCkKK3sKKwlpbnQgcmMgPSAtRUlPOworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaWEuc19hZGRyID0gaHRvbmwoaXApOworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9iaW5kKHJzPSVwLCBJUD0lcyk6ICIsIHJzLAorCQlpbmV0X250b2EoaWEpKTsKKworCS8qIHRyeSB0byBiaW5kIHRvIGEgY29uc2VjdXRpdmUgcGFpciBvZiBwb3J0cyAqLworCWZvciAobmV4dF91ZHBfcG9ydCA9IG5leHRfdWRwX3BvcnQgJSAweGZmZmY7CisJICAgICBuZXh0X3VkcF9wb3J0IDwgMHhmZmZmOyBuZXh0X3VkcF9wb3J0ICs9IDIpIHsKKwkJcmMgPSBydHBfc3ViX3NvY2tldF9iaW5kKCZycy0+cnRwLCBpcCwgbmV4dF91ZHBfcG9ydCk7CisJCWlmIChyYyAhPSAwKQorCQkJY29udGludWU7CisKKwkJcmMgPSBydHBfc3ViX3NvY2tldF9iaW5kKCZycy0+cnRjcCwgaXAsIG5leHRfdWRwX3BvcnQrMSk7CisJCWlmIChyYyA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChyYyA8IDApIHsKKwkJREVCVUdQQyhETVVYLCAiZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlhLnNfYWRkciA9IHJzLT5ydHAuc2luX2xvY2FsLnNpbl9hZGRyLnNfYWRkcjsKKwlERUJVR1BDKERNVVgsICJCT1VORF9JUD0lcywgQk9VTkRfUE9SVD0ldVxuIiwKKwkJaW5ldF9udG9hKGlhKSwgbnRvaHMocnMtPnJ0cC5zaW5fbG9jYWwuc2luX3BvcnQpKTsKKwlyZXR1cm4gbnRvaHMocnMtPnJ0cC5zaW5fbG9jYWwuc2luX3BvcnQpOworfQorCitzdGF0aWMgaW50IHJ0cF9zdWJfc29ja2V0X2Nvbm5lY3Qoc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MsCisJCQkJICB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0KQoreworCWludCByYzsKKwlzb2NrbGVuX3QgYWxlbiA9IHNpemVvZihyc3MtPnNpbl9sb2NhbCk7CisKKwlyc3MtPnNpbl9yZW1vdGUuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJcnNzLT5zaW5fcmVtb3RlLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGlwKTsKKwlyc3MtPnNpbl9yZW1vdGUuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKworCXJjID0gY29ubmVjdChyc3MtPmJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmcnNzLT5zaW5fcmVtb3RlLAorCQkgICAgIHNpemVvZihyc3MtPnNpbl9yZW1vdGUpKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gZ2V0c29ja25hbWUocnNzLT5iZmQuZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcnNzLT5zaW5fbG9jYWwsCisJCQkgICAmYWxlbik7Cit9CisKKy8qICdjb25uZWN0JyBhIFJUUCBzb2NrZXQgdG8gYSByZW1vdGUgcGVlciAqLworaW50IHJ0cF9zb2NrZXRfY29ubmVjdChzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQpCit7CisJaW50IHJjOworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaWEuc19hZGRyID0gaHRvbmwoaXApOworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9jb25uZWN0KHJzPSVwLCBpcD0lcywgcG9ydD0ldSlcbiIsCisJCXJzLCBpbmV0X250b2EoaWEpLCBwb3J0KTsKKworCXJjID0gcnRwX3N1Yl9zb2NrZXRfY29ubmVjdCgmcnMtPnJ0cCwgaXAsIHBvcnQpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBydHBfc3ViX3NvY2tldF9jb25uZWN0KCZycy0+cnRjcCwgaXAsIHBvcnQrMSk7Cit9CisKKy8qIGJpbmQgdHdvIFJUUC9SVENQIHNvY2tldHMgdG9nZXRoZXIgKi8KK2ludCBydHBfc29ja2V0X3Byb3h5KHN0cnVjdCBydHBfc29ja2V0ICp0aGlzLCBzdHJ1Y3QgcnRwX3NvY2tldCAqb3RoZXIpCit7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X3Byb3h5KHRoaXM9JXAsIG90aGVyPSVwKVxuIiwKKwkJdGhpcywgb3RoZXIpOworCisJdGhpcy0+cnhfYWN0aW9uID0gUlRQX1BST1hZOworCXRoaXMtPnByb3h5Lm90aGVyX3NvY2sgPSBvdGhlcjsKKworCW90aGVyLT5yeF9hY3Rpb24gPSBSVFBfUFJPWFk7CisJb3RoZXItPnByb3h5Lm90aGVyX3NvY2sgPSB0aGlzOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGJpbmQgUlRQL1JUQ1Agc29ja2V0IHRvIGFwcGxpY2F0aW9uICovCitpbnQgcnRwX3NvY2tldF91cHN0cmVhbShzdHJ1Y3QgcnRwX3NvY2tldCAqdGhpcywgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQl1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfcHJveHkodGhpcz0lcCwgY2FsbHJlZj0ldSlcbiIsCisJCXRoaXMsIGNhbGxyZWYpOworCisJaWYgKGNhbGxyZWYpIHsKKwkJdGhpcy0+cnhfYWN0aW9uID0gUlRQX1JFQ1ZfVVBTVFJFQU07CisJCXRoaXMtPnJlY2VpdmUubmV0ID0gbmV0OworCQl0aGlzLT5yZWNlaXZlLmNhbGxyZWYgPSBjYWxscmVmOworCX0gZWxzZQorCQl0aGlzLT5yeF9hY3Rpb24gPSBSVFBfTk9ORTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3R4X3F1ZXVlKHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzKQoreworCXN0cnVjdCBtc2diICptc2c7CisJCisJd2hpbGUgKChtc2cgPSBtc2diX2RlcXVldWUoJnJzcy0+dHhfcXVldWUpKSkKKwkJbXNnYl9mcmVlKG1zZyk7Cit9CisKK2ludCBydHBfc29ja2V0X2ZyZWUoc3RydWN0IHJ0cF9zb2NrZXQgKnJzKQoreworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9mcmVlKHJzPSVwKVxuIiwgcnMpOworCisJLyogbWFrZSBzdXJlIHdlIGRvbid0IGxlYXZlIHJlZmVyZW5jZXMgZGFuZ2xpbmcgdG8gdXMgKi8KKwlpZiAocnMtPnJ4X2FjdGlvbiA9PSBSVFBfUFJPWFkgJiYKKwkgICAgcnMtPnByb3h5Lm90aGVyX3NvY2spCisJCXJzLT5wcm94eS5vdGhlcl9zb2NrLT5wcm94eS5vdGhlcl9zb2NrID0gTlVMTDsKKworCWJzY191bnJlZ2lzdGVyX2ZkKCZycy0+cnRwLmJmZCk7CisJY2xvc2UocnMtPnJ0cC5iZmQuZmQpOworCWZyZWVfdHhfcXVldWUoJnJzLT5ydHApOworCisJYnNjX3VucmVnaXN0ZXJfZmQoJnJzLT5ydGNwLmJmZCk7CisJY2xvc2UocnMtPnJ0Y3AuYmZkLmZkKTsKKwlmcmVlX3R4X3F1ZXVlKCZycy0+cnRjcCk7CisKKwl0YWxsb2NfZnJlZShycyk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3NjY3Avc2NjcC5jIGIvb3BlbmJzYy9zcmMvc2NjcC9zY2NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxODYxNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3NjY3Avc2NjcC5jCkBAIC0wLDAgKzEsMTM1NyBAQAorLyoKKyAqIFNDQ1AgbWFuYWdlbWVudCBjb2RlCisgKgorICogKEMpIDIwMDksIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDksIDIwMTAgYnkgT24tV2F2ZXMKKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPHNjY3Avc2NjcC5oPgorCisKK3N0YXRpYyB2b2lkICp0YWxsX3NjY3BfY3R4Oworc3RhdGljIExMSVNUX0hFQUQoc2NjcF9jb25uZWN0aW9ucyk7CisKKyNkZWZpbmUgU0NDUF9NU0dfU0laRSA0MDk2CisjZGVmaW5lIFNDQ1BfTVNHX0hFQURST09NIDEyOAorCisvKiBnbG9iYWwgZGF0YSAqLworY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3Agc2NjcF9zc25fYnNzYXAgPSB7CisJLnNjY3BfZmFtaWx5CT0gMCwKKwkuc2NjcF9zc24JPSBTQ0NQX1NTTl9CU1NBUCwKK307CisKK3N0cnVjdCBzY2NwX3N5c3RlbSB7CisJLyogbGF5ZXIzIC0+IGxheWVyMiAqLworCXZvaWQgKCp3cml0ZV9kYXRhKShzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY29udGV4dCk7CisJdm9pZCAqd3JpdGVfY29udGV4dDsKK307CisKKworc3RhdGljIHN0cnVjdCBzY2NwX3N5c3RlbSBzY2NwX3N5c3RlbSA9IHsKKwkud3JpdGVfZGF0YSA9IE5VTEwsCit9OworCitzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrIHsKKwkvKiBjb25uZWN0aW9uIGJhc2VkICovCisJaW50ICgqYWNjZXB0X2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICosIHZvaWQgKik7CisJdm9pZCAqYWNjZXB0X2NvbnRleHQ7CisKKwkvKiBjb25uZWN0aW9uIGxlc3MgKi8KKwlpbnQgKCpyZWFkX2NiKShzdHJ1Y3QgbXNnYiAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgKik7CisJdm9pZCAqcmVhZF9jb250ZXh0OworCisJdV9pbnQ4X3Qgc3NuOworCXN0cnVjdCBsbGlzdF9oZWFkIGNhbGxiYWNrOworfTsKKworc3RhdGljIExMSVNUX0hFQUQoc2NjcF9jYWxsYmFja3MpOworCitzdGF0aWMgc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqX2ZpbmRfc3NuKHVfaW50OF90IHNzbikKK3sKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpjYjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNiLCAmc2NjcF9jYWxsYmFja3MsIGNhbGxiYWNrKSB7CisJCWlmIChjYi0+c3NuID09IHNzbikKKwkJCXJldHVybiBjYjsKKwl9CisKKwkvKiBuZWVkIHRvIGFkZCBvbmUgKi8KKwljYiA9IHRhbGxvY196ZXJvKHRhbGxfc2NjcF9jdHgsIHN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2spOworCWlmICghY2IpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzY2NwIGNhbGxiYWNrLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWNiLT5zc24gPSBzc247CisJbGxpc3RfYWRkX3RhaWwoJmNiLT5jYWxsYmFjaywgJnNjY3BfY2FsbGJhY2tzKTsKKwlyZXR1cm4gY2I7Cit9CisKKworc3RhdGljIHZvaWQgX3NlbmRfbXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc2NjcF9zeXN0ZW0ud3JpdGVfZGF0YShtc2csIHNjY3Bfc3lzdGVtLndyaXRlX2NvbnRleHQpOworfQorCisvKgorICogcGFyc2luZyByb3V0aW5lcworICovCitzdGF0aWMgaW50IGNvcHlfYWRkcmVzcyhzdHJ1Y3Qgc2NjcF9hZGRyZXNzICphZGRyLCB1X2ludDhfdCBvZmZzZXQsIHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzICpwYXJ0eTsKKworCWludCByb29tID0gbXNnYl9sMmxlbihtc2diKSAtIG9mZnNldDsKKwl1X2ludDhfdCByZWFkID0gMDsKKwl1X2ludDhfdCBsZW5ndGg7CisKKwlpZiAocm9vbSA8PSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJOb3QgZW5vdWdoIHJvb20gZm9yIGFuIGFkZHJlc3M6ICV1XG4iLCByb29tKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWxlbmd0aCA9IG1zZ2ItPmwyaFtvZmZzZXRdOworCWlmIChyb29tIDw9IGxlbmd0aCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiTm90IGVub3VnaCByb29tIGZvciBvcHRpb25hbCBkYXRhICV1ICV1XG4iLCByb29tLCBsZW5ndGgpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwlwYXJ0eSA9IChzdHJ1Y3Qgc2NjcF9jYWxsZWRfcGFydHlfYWRkcmVzcyAqKShtc2diLT5sMmggKyBvZmZzZXQgKyAxKTsKKwlpZiAocGFydHktPnBvaW50X2NvZGVfaW5kaWNhdG9yKSB7CisJCWlmIChsZW5ndGggPD0gcmVhZCArIDIpIHsKKwkJICAgIExPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJQT0kgZG9lcyBub3QgZml0ICV1XG4iLCBsZW5ndGgpOworCQkgICAgcmV0dXJuIC0xOworCQl9CisKKworCQltZW1jcHkoJmFkZHItPnBvaSwgJnBhcnR5LT5kYXRhW3JlYWRdLCAyKTsKKwkJcmVhZCArPSAyOworCX0KKworCWlmIChwYXJ0eS0+c3NuX2luZGljYXRvcikgeworCQlpZiAobGVuZ3RoIDw9IHJlYWQgKyAxKSB7CisJCSAgICBMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiU1NOIGRvZXMgbm90IGZpdCAldVxuIiwgbGVuZ3RoKTsKKwkJICAgIHJldHVybiAtMTsKKwkJfQorCisJCWFkZHItPnNzbiA9IHBhcnR5LT5kYXRhW3JlYWRdOworCQlyZWFkICs9IDE7CisJfQorCisJaWYgKHBhcnR5LT5nbG9iYWxfdGl0bGVfaW5kaWNhdG9yKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJHVEkgbm90IHN1cHBvcnRlZCAldVxuIiwgKih1X2ludDhfdCAqKXBhcnR5KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWFkZHItPmFkZHJlc3MgPSAqcGFydHk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYWRkcmVzcyhzdHJ1Y3Qgc2NjcF9hZGRyZXNzICphZGRyKQoreworCS8qIGlnbm9yZSBwb2ludF9jb2RlX2luZGljYXRvci4uLiBpdCBzaG91bGQgYmUgemVyby4uLiBidXQgKi8KKwlpZiAoYWRkci0+YWRkcmVzcy5zc25faW5kaWNhdG9yICE9IDEKKwkgICAgfHwgYWRkci0+YWRkcmVzcy5nbG9iYWxfdGl0bGVfaW5kaWNhdG9yID09IDEKKwkgICAgfHwgYWRkci0+YWRkcmVzcy5yb3V0aW5nX2luZGljYXRvciAhPSAxKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsCisJCQkiSW52YWxpZCBjYWxsZWQgYWRkcmVzcyBhY2NvcmRpbmcgdG8gMDguMDY6IDB4JXggMHgleFxuIiwKKwkJCSoodV9pbnQ4X3QgKikmYWRkci0+YWRkcmVzcywgYWRkci0+c3NuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX3BhcnNlX29wdGlvbmFsX2RhdGEoY29uc3QgaW50IG9mZnNldCwKKwkJCQkgICAgIHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhICpkYXRhKQoreworCXVfaW50MTZfdCByb29tID0gbXNnYl9sMmxlbihtc2diKSAtIG9mZnNldDsKKwl1X2ludDE2X3QgcmVhZCA9IDA7CisKKwl3aGlsZSAocm9vbSA+IHJlYWQpIHsKKwkJdV9pbnQ4X3QgdHlwZSA9IG1zZ2ItPmwyaFtvZmZzZXQgKyByZWFkXTsKKwkJaWYgKHR5cGUgPT0gU0NDUF9QTkNfRU5EX09GX09QVElPTkFMKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHJlYWQgKyAxID49IHJvb20pIHsKKwkJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJubyBwbGFjZSBmb3IgbGVuZ3RoXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdV9pbnQ4X3QgbGVuZ3RoID0gbXNnYi0+bDJoW29mZnNldCArIHJlYWQgKyAxXTsKKwkJcmVhZCArPSAyICsgbGVuZ3RoOworCisKKwkJaWYgKHJvb20gPD0gcmVhZCkgeworCQkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwKKwkJCSAgICAgICAibm8gc3BhY2UgZm9yIHRoZSBkYXRhOiB0eXBlOiAlZCByZWFkOiAlZCByb29tOiAlZCBsMjogJWRcbiIsCisJCQkgICAgICAgdHlwZSwgcmVhZCwgcm9vbSwgbXNnYl9sMmxlbihtc2diKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICh0eXBlID09IFNDQ1BfUE5DX0RBVEEpIHsKKwkJCWRhdGEtPmRhdGFfbGVuID0gbGVuZ3RoOworCQkJZGF0YS0+ZGF0YV9zdGFydCA9IG9mZnNldCArIHJlYWQgLSBsZW5ndGg7CisJCX0KKworCX0KKworCXJldHVybiAtMTsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVxdWVzdChzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBoZWFkZXJfc2l6ZSA9CisJCQlzaXplb2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0KTsKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IG9wdGlvbmFsX29mZnNldCA9CisJCQlvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QsIG9wdGlvbmFsX3N0YXJ0KTsKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGNhbGxlZF9vZmZzZXQgPQorCQkJb2Zmc2V0b2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0LCB2YXJpYWJsZV9jYWxsZWQpOworCisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0ICopbXNnYi0+bDJoOworCXN0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgb3B0aW9uYWxfZGF0YTsKKworCS8qIGhlYWRlciBjaGVjayAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjb3B5IG91dCB0aGUgY2FsbGluZyBhbmQgY2FsbGVkIGFkZHJlc3MuIEFkZCB0aGUgb2Zmc2V0ICovCisJaWYgKGNvcHlfYWRkcmVzcygmcmVzdWx0LT5jYWxsZWQsIGNhbGxlZF9vZmZzZXQgKyByZXEtPnZhcmlhYmxlX2NhbGxlZCwgbXNnYikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGNoZWNrX2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGVkKSAhPSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJJbnZhbGlkIGNhbGxlZCBhZGRyZXNzIGFjY29yZGluZyB0byAwOC4wNjogMHgleCAweCV4XG4iLAorCQkJKih1X2ludDhfdCAqKSZyZXN1bHQtPmNhbGxlZC5hZGRyZXNzLCByZXN1bHQtPmNhbGxlZC5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzdWx0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gJnJlcS0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKworCS8qCisJICogcGFyc2Ugb3B0aW9uYWwgZGF0YS4KKwkgKi8KKwltZW1zZXQoJm9wdGlvbmFsX2RhdGEsIDAsIHNpemVvZihvcHRpb25hbF9kYXRhKSk7CisJaWYgKF9zY2NwX3BhcnNlX29wdGlvbmFsX2RhdGEob3B0aW9uYWxfb2Zmc2V0ICsgcmVxLT5vcHRpb25hbF9zdGFydCwgbXNnYiwgJm9wdGlvbmFsX2RhdGEpICE9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgInBhcnNpbmcgb2Ygb3B0aW9uYWwgZGF0YSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChvcHRpb25hbF9kYXRhLmRhdGFfbGVuICE9IDApIHsKKwkJbXNnYi0+bDNoID0gJm1zZ2ItPmwyaFtvcHRpb25hbF9kYXRhLmRhdGFfc3RhcnRdOworCQlyZXN1bHQtPmRhdGFfbGVuID0gb3B0aW9uYWxfZGF0YS5kYXRhX2xlbjsKKwl9IGVsc2UgeworCQlyZXN1bHQtPmRhdGFfbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZWQoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBpbnQgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCk7CisJc3RhdGljIGludCBvcHRpb25hbF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkLCBvcHRpb25hbF9zdGFydCk7CisKKwlzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhIG9wdGlvbmFsX2RhdGE7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCAqcmxzID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQgKikgbXNnYi0+bDJoOworCisJLyogd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggc2l6ZSBmb3IgdGhlIHN0cnVjdCAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIm1zZ2IgPiBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoJm9wdGlvbmFsX2RhdGEsIDAsIHNpemVvZihvcHRpb25hbF9kYXRhKSk7CisJaWYgKF9zY2NwX3BhcnNlX29wdGlvbmFsX2RhdGEob3B0aW9uYWxfb2Zmc2V0ICsgcmxzLT5vcHRpb25hbF9zdGFydCwgbXNnYiwgJm9wdGlvbmFsX2RhdGEpICE9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgInBhcnNpbmcgb2Ygb3B0aW9uYWwgZGF0YSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlc3VsdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9ICZybHMtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmcmxzLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisKKwlpZiAob3B0aW9uYWxfZGF0YS5kYXRhX2xlbiAhPSAwKSB7CisJCW1zZ2ItPmwzaCA9ICZtc2diLT5sMmhbb3B0aW9uYWxfZGF0YS5kYXRhX3N0YXJ0XTsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IG9wdGlvbmFsX2RhdGEuZGF0YV9sZW47CisJfSBlbHNlIHsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlZnVzZWQoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgaGVhZGVyX3NpemUgPQorCQkJc2l6ZW9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCk7CisJc3RhdGljIGludCBvcHRpb25hbF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQsIG9wdGlvbmFsX3N0YXJ0KTsKKworCXN0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgb3B0aW9uYWxfZGF0YTsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgKnJlZjsKKworCS8qIGhlYWRlciBjaGVjayAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZWYgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkICopIG1zZ2ItPmwyaDsKKworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJnJlZi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJbWVtc2V0KCZvcHRpb25hbF9kYXRhLCAwLCBzaXplb2Yob3B0aW9uYWxfZGF0YSkpOworCWlmIChfc2NjcF9wYXJzZV9vcHRpb25hbF9kYXRhKG9wdGlvbmFsX29mZnNldCArIHJlZi0+b3B0aW9uYWxfc3RhcnQsIG1zZ2IsICZvcHRpb25hbF9kYXRhKSAhPSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJwYXJzaW5nIG9mIG9wdGlvbmFsIGRhdGEgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBvcHRpb25hbCBkYXRhICovCisJaWYgKG9wdGlvbmFsX2RhdGEuZGF0YV9sZW4gIT0gMCkgeworCQltc2diLT5sM2ggPSAmbXNnYi0+bDJoW29wdGlvbmFsX2RhdGEuZGF0YV9zdGFydF07CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSBvcHRpb25hbF9kYXRhLmRhdGFfbGVuOworCX0gZWxzZSB7CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9jb25maXJtKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgdV9pbnQzMl90IGhlYWRlcl9zaXplID0KKwkJICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0pOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3Qgb3B0aW9uYWxfb2Zmc2V0ID0KKwkJCW9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSwgb3B0aW9uYWxfc3RhcnQpOworCisJc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSBvcHRpb25hbF9kYXRhOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSAqY29uOworCisJLyogaGVhZGVyIGNoZWNrICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNvbiA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0gKikgbXNnYi0+bDJoOworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJmNvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXJlc3VsdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9ICZjb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisKKwltZW1zZXQoJm9wdGlvbmFsX2RhdGEsIDAsIHNpemVvZihvcHRpb25hbF9kYXRhKSk7CisJaWYgKF9zY2NwX3BhcnNlX29wdGlvbmFsX2RhdGEob3B0aW9uYWxfb2Zmc2V0ICsgY29uLT5vcHRpb25hbF9zdGFydCwgbXNnYiwgJm9wdGlvbmFsX2RhdGEpICE9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgInBhcnNpbmcgb2Ygb3B0aW9uYWwgZGF0YSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChvcHRpb25hbF9kYXRhLmRhdGFfbGVuICE9IDApIHsKKwkJbXNnYi0+bDNoID0gJm1zZ2ItPmwyaFtvcHRpb25hbF9kYXRhLmRhdGFfc3RhcnRdOworCQlyZXN1bHQtPmRhdGFfbGVuID0gb3B0aW9uYWxfZGF0YS5kYXRhX2xlbjsKKwl9IGVsc2UgeworCQlyZXN1bHQtPmRhdGFfbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGludCBoZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUpOworCisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlICpjbXBsOworCisJLyogaGVhZGVyIGNoZWNrICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNtcGwgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlICopIG1zZ2ItPmwyaDsKKwlyZXN1bHQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSAmY21wbC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZjbXBsLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fZHQxKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgaW50IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2RhdGFfZm9ybTEpOworCXN0YXRpYyBpbnQgdmFyaWFibGVfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfZGF0YV9mb3JtMSwgdmFyaWFibGVfc3RhcnQpOworCisJc3RydWN0IHNjY3BfZGF0YV9mb3JtMSAqZHQxID0gKHN0cnVjdCBzY2NwX2RhdGFfZm9ybTEgKiltc2diLT5sMmg7CisKKwkvKiB3ZSBkb24ndCBoYXZlIGVub3VnaCBzaXplIGZvciB0aGUgc3RydWN0ICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAibXNnYiA+IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChkdDEtPnNlZ21lbnRpbmcgIT0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiVGhpcyBwYWNrZXQgaGFzIHNlZ21lbnRpbmcsIG5vdCBzdXBwb3J0ZWQ6ICVkXG4iLCBkdDEtPnNlZ21lbnRpbmcpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmZHQxLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisKKwkvKiBzb21lIG1vcmUgIHNpemUgY2hlY2tzIGluIGhlcmUgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IHZhcmlhYmxlX29mZnNldCArIGR0MS0+dmFyaWFibGVfc3RhcnQgKyAxKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJOb3QgZW5vdWdoIHNwYWNlIGZvciB2YXJpYWJsZSBzdGFydDogJXUgJXVcbiIsCisJCQltc2diX2wybGVuKG1zZ2IpLCBkdDEtPnZhcmlhYmxlX3N0YXJ0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlc3VsdC0+ZGF0YV9sZW4gPSBtc2diLT5sMmhbdmFyaWFibGVfb2Zmc2V0ICsgZHQxLT52YXJpYWJsZV9zdGFydF07CisJbXNnYi0+bDNoID0gJm1zZ2ItPmwyaFtkdDEtPnZhcmlhYmxlX3N0YXJ0ICsgdmFyaWFibGVfb2Zmc2V0ICsgMV07CisKKwlpZiAobXNnYl9sM2xlbihtc2diKSA8IHJlc3VsdC0+ZGF0YV9sZW4pIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIk5vdCBlbm91Z2ggcm9vbSBmb3IgdGhlIHBheWxvYWQ6ICV1ICV1XG4iLAorCQkJbXNnYl9sM2xlbihtc2diKSwgcmVzdWx0LT5kYXRhX2xlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX3VkdChzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBoZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhKTsKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGNhbGxlZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhLCB2YXJpYWJsZV9jYWxsZWQpOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgY2FsbGluZ19vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhLCB2YXJpYWJsZV9jYWxsaW5nKTsKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSwgdmFyaWFibGVfZGF0YSk7CisKKwlzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhICp1ZHQgPSAoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSAqKW1zZ2ItPmwyaDsKKworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjb3B5IG91dCB0aGUgY2FsbGluZyBhbmQgY2FsbGVkIGFkZHJlc3MuIEFkZCB0aGUgb2ZmICovCisJaWYgKGNvcHlfYWRkcmVzcygmcmVzdWx0LT5jYWxsZWQsIGNhbGxlZF9vZmZzZXQgKyB1ZHQtPnZhcmlhYmxlX2NhbGxlZCwgbXNnYikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGNoZWNrX2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGVkKSAhPSAwKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJJbnZhbGlkIGNhbGxlZCBhZGRyZXNzIGFjY29yZGluZyB0byAwOC4wNjogMHgleCAweCV4XG4iLAorCQkJKih1X2ludDhfdCAqKSZyZXN1bHQtPmNhbGxlZC5hZGRyZXNzLCByZXN1bHQtPmNhbGxlZC5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNvcHlfYWRkcmVzcygmcmVzdWx0LT5jYWxsaW5nLCBjYWxsaW5nX29mZnNldCArIHVkdC0+dmFyaWFibGVfY2FsbGluZywgbXNnYikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGNoZWNrX2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGluZykgIT0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiSW52YWxpZCBjYWxsZWQgYWRkcmVzcyBhY2NvcmRpbmcgdG8gMDguMDY6IDB4JXggMHgleFxuIiwKKwkJCSoodV9pbnQ4X3QgKikmcmVzdWx0LT5jYWxsZWQuYWRkcmVzcywgcmVzdWx0LT5jYWxsZWQuc3NuKTsKKwl9CisKKwkvKiB3ZSBkb24ndCBoYXZlIGVub3VnaCBzaXplIGZvciB0aGUgZGF0YSAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgZGF0YV9vZmZzZXQgKyB1ZHQtPnZhcmlhYmxlX2RhdGEgKyAxKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJtc2diIDwgaGVhZGVyICsgb2Zmc2V0ICV1ICV1ICV1XG4iLAorCQkJbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUsIHVkdC0+dmFyaWFibGVfZGF0YSk7CisJCXJldHVybiAtMTsKKwl9CisKKworCW1zZ2ItPmwzaCA9ICZ1ZHQtPmRhdGFbdWR0LT52YXJpYWJsZV9kYXRhXTsKKwlyZXN1bHQtPmRhdGFfbGVuID0gbXNnYl9sM2xlbihtc2diKTsKKworCWlmIChtc2diX2wzbGVuKG1zZ2IpICE9ICBtc2diLT5sM2hbLTFdKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJtc2diIGlzIHRydW5jYXRlZCBpczogJXUgc2hvdWxkOiAldVxuIiwKKwkJCW1zZ2JfbDNsZW4obXNnYiksIG1zZ2ItPmwzaFstMV0pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfcGFyc2VfaXQoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfZGF0YV9pdCk7CisKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2l0ICppdDsKKworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpdCA9IChzdHJ1Y3Qgc2NjcF9kYXRhX2l0ICopIG1zZ2ItPmwyaDsKKwlyZXN1bHQtPmRhdGFfbGVuID0gMDsKKwlyZXN1bHQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSAmaXQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmaXQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9wYXJzZV9lcnIoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfcHJvdG9fZXJyKTsKKworCXN0cnVjdCBzY2NwX3Byb3RvX2VyciAqZXJyOworCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVyciA9IChzdHJ1Y3Qgc2NjcF9wcm90b19lcnIgKikgbXNnYi0+bDJoOworCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJmVyci0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXJldHVybiAwOworfQorCisvKgorICogU2VuZCBVRFQuIEN1cnJlbnRseSB3ZSBoYXZlIGEgZml4ZWQgYWRkcmVzcy4uLgorICovCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfZGF0YShpbnQgY2xhc3MsIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICppbiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpvdXQsIHN0cnVjdCBtc2diICpwYXlsb2FkKQoreworCXN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgKnVkdDsKKwl1X2ludDhfdCAqZGF0YTsKKworCWlmIChtc2diX2wzbGVuKHBheWxvYWQpID4gMjU2KSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJUaGUgcGF5bG9hZCBpcyB0b28gYmlnIGZvciBvbmUgdWR0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJCSAgICAgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3A6IHVkdCIpOworCW1zZy0+bDJoID0gJm1zZy0+ZGF0YVswXTsKKwl1ZHQgPSAoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSAqKW1zZ2JfcHV0KG1zZywgc2l6ZW9mKCp1ZHQpKTsKKworCXVkdC0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfVURUOworCXVkdC0+cHJvdG9fY2xhc3MgPSBjbGFzczsKKwl1ZHQtPnZhcmlhYmxlX2NhbGxlZCA9IDM7CisJdWR0LT52YXJpYWJsZV9jYWxsaW5nID0gNTsKKwl1ZHQtPnZhcmlhYmxlX2RhdGEgPSA3OworCisJLyogZm9yIHZhcmlhYmxlIGRhdGEgd2Ugc3RhcnQgd2l0aCBhIHNpemUgYW5kIHRoZSBkYXRhICovCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMSArIDIpOworCWRhdGFbMF0gPSAyOworCWRhdGFbMV0gPSAweDQyOworCWRhdGFbMl0gPSBvdXQtPnNjY3Bfc3NuOworCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMSArIDIpOworCWRhdGFbMF0gPSAyOworCWRhdGFbMV0gPSAweDQyOworCWRhdGFbMl0gPSBpbi0+c2NjcF9zc247CisKKwkvKiBjb3B5IHRoZSBwYXlsb2FkICovCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMSArIG1zZ2JfbDNsZW4ocGF5bG9hZCkpOworCWRhdGFbMF0gPSBtc2diX2wzbGVuKHBheWxvYWQpOworCW1lbWNweSgmZGF0YVsxXSwgcGF5bG9hZC0+bDNoLCBtc2diX2wzbGVuKHBheWxvYWQpKTsKKworCV9zZW5kX21zZyhtc2cpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9yZWFkKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKmNiOworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisKKwlpZiAoX3NjY3BfcGFyc2VfdWR0KG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCWNiID0gX2ZpbmRfc3NuKHJlc3VsdC5jYWxsZWQuc3NuKTsKKwlpZiAoIWNiIHx8ICFjYi0+cmVhZF9jYikgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiTm8gcm91dGluZyBmb3IgVURUIGZvciBjYWxsZWQgU1NOOiAldVxuIiwgcmVzdWx0LmNhbGxlZC5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogc2FuaXR5IGNoZWNrICovCisJcmV0dXJuIGNiLT5yZWFkX2NiKG1zZ2IsIG1zZ2JfbDNsZW4obXNnYiksIGNiLT5yZWFkX2NvbnRleHQpOworfQorCisvKgorICogaGFuZGxlIGNvbm5lY3Rpb24gb3JpZW50YXRlZCBtZXRob2RzCisgKi8KK3N0YXRpYyBpbnQgc291cmNlX2xvY2FsX3JlZmVyZW5jZV9pc19mcmVlKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnJlZmVyZW5jZSkKK3sKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdGlvbiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKG1lbWNtcChyZWZlcmVuY2UsICZjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCBzaXplb2YoKnJlZmVyZW5jZSkpID09IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlX2lzX2ZyZWUoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqcmVmZXJlbmNlKQoreworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0aW9uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAobWVtY21wKHJlZmVyZW5jZSwgJmNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgc2l6ZW9mKCpyZWZlcmVuY2UpKSA9PSAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzc2lnbl9zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RhdGljIHVfaW50MzJfdCBsYXN0X3JlZiA9IDB4MzAwMDA7CisJaW50IHdyYXBwZWQgPSAwOworCisJZG8geworCQlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHJlZmVyZW5jZTsKKwkJcmVmZXJlbmNlLm9jdGV0MSA9IChsYXN0X3JlZiA+PiAgMCkgJiAweGZmOworCQlyZWZlcmVuY2Uub2N0ZXQyID0gKGxhc3RfcmVmID4+ICA4KSAmIDB4ZmY7CisJCXJlZmVyZW5jZS5vY3RldDMgPSAobGFzdF9yZWYgPj4gMTYpICYgMHhmZjsKKworCQkrK2xhc3RfcmVmOworCQkvKiBkbyBub3QgdXNlIHRoZSByZXZlcnNlZCB3b3JkIGFuZCB3cmFwIGFyb3VuZCAqLworCQlpZiAoKGxhc3RfcmVmICYgMHgwMEZGRkZGRikgPT0gMHgwMEZGRkZGRikgeworCQkJTE9HUChEU0NDUCwgTE9HTF9ERUJVRywgIldyYXBwZWQgc2VhcmNoaW5nIGZvciBhIGZyZWUgY29kZVxuIik7CisJCQlsYXN0X3JlZiA9IDA7CisJCQkrK3dyYXBwZWQ7CisJCX0KKworCQlpZiAoc291cmNlX2xvY2FsX3JlZmVyZW5jZV9pc19mcmVlKCZyZWZlcmVuY2UpID09IDApIHsKKwkJCWNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSByZWZlcmVuY2U7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gd2hpbGUgKHdyYXBwZWQgIT0gMik7CisKKwlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiRmluZGluZyBhIGZyZWUgcmVmZXJlbmNlIGZhaWxlZFxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBpbnQgbmV3X3N0YXRlKQoreworCWludCBvbGRfc3RhdGUgPSBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlOworCisJY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA9IG5ld19zdGF0ZTsKKwlpZiAoY29ubmVjdGlvbi0+c3RhdGVfY2IpCisJCWNvbm5lY3Rpb24tPnN0YXRlX2NiKGNvbm5lY3Rpb24sIG9sZF9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9yZWZ1c2Uoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqc3JjX3JlZiwgaW50IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2diOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCAqcmVmOworCXVfaW50OF90ICpkYXRhOworCisJbXNnYiA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgcmVmIik7CisJbXNnYi0+bDJoID0gJm1zZ2ItPmRhdGFbMF07CisKKwlyZWYgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkICopIG1zZ2JfcHV0KG1zZ2IsIHNpemVvZigqcmVmKSk7CisJcmVmLT50eXBlID0gU0NDUF9NU0dfVFlQRV9DUkVGOworCW1lbWNweSgmcmVmLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsIHNyY19yZWYsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisJcmVmLT5jYXVzZSA9IGNhdXNlOworCXJlZi0+b3B0aW9uYWxfc3RhcnQgPSAxOworCisJZGF0YSA9IG1zZ2JfcHV0KG1zZ2IsIDEpOworCWRhdGFbMF0gPSBTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUw7CisKKwlfc2VuZF9tc2cobXNnYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2NvbmZpcm0oc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgbXNnYiAqcmVzcG9uc2U7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtICpjb25maXJtOworCXVfaW50OF90ICpvcHRpb25hbF9kYXRhOworCisJaWYgKGFzc2lnbl9zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKGNvbm5lY3Rpb24pICE9IDApCisJCXJldHVybiAtMTsKKworCXJlc3BvbnNlID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgICAgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgY29uZmlybSIpOworCXJlc3BvbnNlLT5sMmggPSAmcmVzcG9uc2UtPmRhdGFbMF07CisKKwljb25maXJtID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSAqKSBtc2diX3B1dChyZXNwb25zZSwgc2l6ZW9mKCpjb25maXJtKSk7CisKKwljb25maXJtLT50eXBlID0gU0NDUF9NU0dfVFlQRV9DQzsKKwltZW1jcHkoJmNvbmZpcm0tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgJmNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKGNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSkpOworCW1lbWNweSgmY29uZmlybS0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgJmNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSk7CisJY29uZmlybS0+cHJvdG9fY2xhc3MgPSAyOworCWNvbmZpcm0tPm9wdGlvbmFsX3N0YXJ0ID0gMTsKKworCW9wdGlvbmFsX2RhdGEgPSAodV9pbnQ4X3QgKikgbXNnYl9wdXQocmVzcG9uc2UsIDEpOworCW9wdGlvbmFsX2RhdGFbMF0gPSBTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUw7CisKKwlfc2VuZF9tc2cocmVzcG9uc2UpOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlcXVlc3Qoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpjYWxsZWQsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IG1zZ2IgKnJlcXVlc3Q7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0ICpyZXE7CisJdV9pbnQ4X3QgKmRhdGE7CisJdV9pbnQ4X3QgZXh0cmFfc2l6ZSA9IDMgKyAxOworCisKKwlpZiAobXNnICYmIChtc2diX2wzbGVuKG1zZykgPCAzIHx8IG1zZ2JfbDNsZW4obXNnKSA+IDEzMCkpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIkludmFsaWQgYW1vdW50IG9mIGRhdGEuLi4gJWRcbiIsIG1zZ2JfbDNsZW4obXNnKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB0cnkgdG8gZmluZCBhIGlkICovCisJaWYgKGFzc2lnbl9zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKGNvbm5lY3Rpb24pICE9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIkFzc2lnbmluZyBhIGxvY2FsIHJlZmVyZW5jZSBmYWlsZWQuXG4iKTsKKwkJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGlvbiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1NFVFVQX0VSUk9SKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJaWYgKG1zZykKKwkJZXh0cmFfc2l6ZSArPSAyICsgbXNnYl9sM2xlbihtc2cpOworCXJlcXVlc3QgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIGNvbm5lY3Rpb24gcmVxdWVzdCIpOworCXJlcXVlc3QtPmwyaCA9ICZyZXF1ZXN0LT5kYXRhWzBdOworCXJlcSA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QgKikgbXNnYl9wdXQocmVxdWVzdCwgc2l6ZW9mKCpyZXEpKTsKKworCXJlcS0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfQ1I7CisJbWVtY3B5KCZyZXEtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsICZjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2YoY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpOworCXJlcS0+cHJvdG9fY2xhc3MgPSAyOworCXJlcS0+dmFyaWFibGVfY2FsbGVkID0gMjsKKwlyZXEtPm9wdGlvbmFsX3N0YXJ0ID0gNDsKKworCS8qIHdyaXRlIHRoZSBjYWxsZWQgcGFydHkgYWRkcmVzcyAqLworCWRhdGEgPSBtc2diX3B1dChyZXF1ZXN0LCAxICsgMik7CisJZGF0YVswXSA9IDI7CisJZGF0YVsxXSA9IDB4NDI7CisJZGF0YVsyXSA9IGNhbGxlZC0+c2NjcF9zc247CisKKwkvKiB3cml0ZSB0aGUgcGF5bG9hZCAqLworCWlmIChtc2cpIHsKKwkgICAgZGF0YSA9IG1zZ2JfcHV0KHJlcXVlc3QsIDIgKyBtc2diX2wzbGVuKG1zZykpOworCSAgICBkYXRhWzBdID0gU0NDUF9QTkNfREFUQTsKKwkgICAgZGF0YVsxXSA9IG1zZ2JfbDNsZW4obXNnKTsKKwkgICAgbWVtY3B5KCZkYXRhWzJdLCBtc2ctPmwzaCwgbXNnYl9sM2xlbihtc2cpKTsKKwl9CisKKwlkYXRhID0gbXNnYl9wdXQocmVxdWVzdCwgMSk7CisJZGF0YVswXSA9IFNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTDsKKworCWxsaXN0X2FkZF90YWlsKCZjb25uZWN0aW9uLT5saXN0LCAmc2NjcF9jb25uZWN0aW9ucyk7CisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGlvbiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFUVVFU1QpOworCisJX3NlbmRfbXNnKHJlcXVlc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfY29ubmVjdGlvbl9kYXRhKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICpfZGF0YSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnYjsKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xICpkdDE7CisJdV9pbnQ4X3QgKmRhdGE7CisJaW50IGV4dHJhX3NpemU7CisKKwlpZiAobXNnYl9sM2xlbihfZGF0YSkgPCAyIHx8IG1zZ2JfbDNsZW4oX2RhdGEpID4gMjU2KSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJkYXRhIHNpemUgdG9vIGJpZywgc2VnbWVudGluZyB1bmltcGxlbWVudGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlleHRyYV9zaXplID0gMSArIG1zZ2JfbDNsZW4oX2RhdGEpOworCW1zZ2IgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIGR0MSIpOworCW1zZ2ItPmwyaCA9ICZtc2diLT5kYXRhWzBdOworCisJZHQxID0gKHN0cnVjdCBzY2NwX2RhdGFfZm9ybTEgKikgbXNnYl9wdXQobXNnYiwgc2l6ZW9mKCpkdDEpKTsKKwlkdDEtPnR5cGUgPSBTQ0NQX01TR19UWVBFX0RUMTsKKwltZW1jcHkoJmR0MS0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCAmY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCWR0MS0+c2VnbWVudGluZyA9IDA7CisKKwkvKiBjb3B5IHRoZSBkYXRhICovCisJZHQxLT52YXJpYWJsZV9zdGFydCA9IDE7CisJZGF0YSA9IG1zZ2JfcHV0KG1zZ2IsIGV4dHJhX3NpemUpOworCWRhdGFbMF0gPSBleHRyYV9zaXplIC0gMTsKKwltZW1jcHkoJmRhdGFbMV0sIF9kYXRhLT5sM2gsIGV4dHJhX3NpemUgLSAxKTsKKworCV9zZW5kX21zZyhtc2diKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25faXQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnYjsKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2l0ICppdDsKKworCW1zZ2IgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIGl0Iik7CisJbXNnYi0+bDJoID0gJm1zZ2ItPmRhdGFbMF07CisJaXQgPSAoc3RydWN0IHNjY3BfZGF0YV9pdCAqKSBtc2diX3B1dChtc2diLCBzaXplb2YoKml0KSk7CisJaXQtPnR5cGUgPSBTQ0NQX01TR19UWVBFX0lUOworCW1lbWNweSgmaXQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKwltZW1jcHkoJml0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCAmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKworCWl0LT5wcm90b19jbGFzcyA9IDB4MjsKKwlpdC0+c2VxdWVuY2luZ1swXSA9IGl0LT5zZXF1ZW5jaW5nWzFdID0gMDsKKwlpdC0+Y3JlZGl0ID0gMDsKKworCV9zZW5kX21zZyhtc2diKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVsZWFzZWQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgaW50IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCAqcmVsOworCXVfaW50OF90ICpkYXRhOworCisJbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLCBTQ0NQX01TR19IRUFEUk9PTSwKKwkJCQkgICJzY2NwOiBjb25uZWN0aW9uIHJlbGVhc2VkIik7CisJbXNnLT5sMmggPSAmbXNnLT5kYXRhWzBdOworCXJlbCA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpyZWwpKTsKKwlyZWwtPnR5cGUgPSBTQ0NQX01TR19UWVBFX1JMU0Q7CisJcmVsLT5yZWxlYXNlX2NhdXNlID0gY2F1c2U7CisKKwkvKiBjb3B5IHRoZSBzb3VyY2UgcmVmZXJlbmNlcyAqLworCW1lbWNweSgmcmVsLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsICZjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisJbWVtY3B5KCZyZWwtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsICZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMSk7CisJZGF0YVswXSA9IFNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTDsKKworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm4sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFKTsKKwlfc2VuZF9tc2cobXNnKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE9wZW4gYSBjb25uZWN0aW9uLiBUaGUgZm9sbG93aW5nIGlzIGdvaW5nIHRvIGhhcHBlbjoKKyAqCisgKgktIFZlcmlmeSB0aGUgcGFja2V0LCBlLmcuIHRoYXQgd2UgaGF2ZSBubyBvdGhlciBjb25uZWN0aW9uCisgKgkgIHRoYXQgaWQuCisgKiAgICAgIC0gQXNrIHRoZSB1c2VyIGlmIGhlIHdhbnRzIHRvIGFjY2VwdCB0aGUgY29ubmVjdGlvbgorICogICAgICAtIFRyeSB0byBvcGVuIHRoZSBjb25uZWN0aW9uIGJ5IGFzc2lnbmluZyBhIHNvdXJjZSBsb2NhbCByZWZlcmVuY2UKKyAqICAgICAgICBhbmQgc2VuZGluZyB0aGUgcGFja2V0CisgKi8KK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVxdWVzdChzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlcXVlc3QobXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJY2IgPSBfZmluZF9zc24ocmVzdWx0LmNhbGxlZC5zc24pOworCWlmICghY2IgfHwgIWNiLT5hY2NlcHRfY2IpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIk5vIHJvdXRpbmcgZm9yIENSIGZvciBjYWxsZWQgU1NOOiAldVxuIiwgcmVzdWx0LmNhbGxlZC5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY2hlY2sgaWYgdGhlIHN5c3RlbSB3YW50cyB0aGlzIGNvbm5lY3Rpb24gKi8KKwljb25uZWN0aW9uID0gdGFsbG9jX3plcm8odGFsbF9zY2NwX2N0eCwgc3RydWN0IHNjY3BfY29ubmVjdGlvbik7CisJaWYgKCFjb25uZWN0aW9uKSB7CisJCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJBbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIHNhbml0eSBjaGVja3M6CisJICoJLSBJcyB0aGUgc291cmNlX2xvY2FsX3JlZmVyZW5jZSBpbiBhbnkgb3RoZXIgY29ubmVjdGlvbj8KKwkgKiB0aGVuIHdpbGwgY2FsbCBhY2NlcHQsIGFzc2lnbiBhICJkZXN0aW5hdGlvbiIgbG9jYWwgcmVmZXJlbmNlCisJICogYW5kIHNlbmQgYSBjb25uZWN0aW9uIGNvbmZpcm0sIG90aGVyd2lzZSB3ZSB3aWxsIHNlbmQgYSByZWZ1c2VlZAorCSAqIG9uZS4uLi4KKwkgKi8KKwlpZiAoZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlX2lzX2ZyZWUocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpICE9IDApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIk5lZWQgdG8gcmVqZWN0IGNvbm5lY3Rpb24gd2l0aCBleGlzdGluZyByZWZlcmVuY2VcbiIpOworCQlfc2NjcF9zZW5kX3JlZnVzZShyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwgU0NDUF9SRUZVU0FMX1NDQ1BfRkFJTFVSRSk7CisJCXRhbGxvY19mcmVlKGNvbm5lY3Rpb24pOworCQlyZXR1cm4gLTE7CisJfQorCisJY29ubmVjdGlvbi0+aW5jb21pbmcgPSAxOworCWNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICpyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKworCWlmIChjYi0+YWNjZXB0X2NiKGNvbm5lY3Rpb24sIGNiLT5hY2NlcHRfY29udGV4dCkgIT0gMCkgeworCQlfc2NjcF9zZW5kX3JlZnVzZShyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwgU0NDUF9SRUZVU0FMX0VORF9VU0VSX09SSUdJTkFURUQpOworCQlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVGVVNFRCk7CisJCXRhbGxvY19mcmVlKGNvbm5lY3Rpb24pOworCQlyZXR1cm4gMDsKKwl9CisKKworCWxsaXN0X2FkZF90YWlsKCZjb25uZWN0aW9uLT5saXN0LCAmc2NjcF9jb25uZWN0aW9ucyk7CisKKwlpZiAoX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2NvbmZpcm0oY29ubmVjdGlvbikgIT0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiU2VuZGluZyBjb25maXJtIGZhaWxlZC4uLiBubyBhdmFpbGFibGUgc291cmNlIHJlZmVyZW5jZT9cbiIpOworCisJCV9zY2NwX3NlbmRfcmVmdXNlKHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCBTQ0NQX1JFRlVTQUxfU0NDUF9GQUlMVVJFKTsKKwkJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGlvbiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFRlVTRUQpOworCQlsbGlzdF9kZWwoJmNvbm5lY3Rpb24tPmxpc3QpOworCQl0YWxsb2NfZnJlZShjb25uZWN0aW9uKTsKKworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGRhdGEgbGV0IHVzIGZvcndhcmQgdGhpbmdzLgorCSAqLworCWlmIChyZXN1bHQuZGF0YV9sZW4gIT0gMCAmJiBjb25uZWN0aW9uLT5kYXRhX2NiKSB7CisJCWNvbm5lY3Rpb24tPmRhdGFfY2IoY29ubmVjdGlvbiwgbXNnYiwgcmVzdWx0LmRhdGFfbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSGFuZGxlIHRoZSByZWxlYXNlIGNvbmZpcm1lZCAqLworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUobXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJLyogZmluZCB0aGUgY29ubmVjdGlvbiAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChjb25uLT5kYXRhX2NiCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSkpID09IDApIHsKKwkJICAgIGdvdG8gZm91bmQ7CisJCX0KKwl9CisKKworCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJSZWxlYXNlIGNvbXBsZXRlIG9mIHVua25vd24gY29ubmVjdGlvblxuIik7CisJcmV0dXJuIC0xOworCitmb3VuZDoKKwlsbGlzdF9kZWwoJmNvbm4tPmxpc3QpOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm4sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKTsKKwlyZXR1cm4gMDsKK30KKworLyogSGFuZGxlIHRoZSBEYXRhIEZvcm0gMSBtZXNzYWdlICovCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX2R0MShzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlpZiAoX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9kdDEobXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJLyogbG9va3VwIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIHJlZmVyZW5jZSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChjb25uLT5kYXRhX2NiCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwKSB7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCisJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIk5vIGNvbm5lY3Rpb24gZm91bmQgZm9yIGR0MSBkYXRhXG4iKTsKKwlyZXR1cm4gLTE7CisKK2ZvdW5kOgorCWNvbm4tPmRhdGFfY2IoY29ubiwgbXNnYiwgcmVzdWx0LmRhdGFfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyogY29uZmlybSBhIGNvbm5lY3Rpb24gcmVsZWFzZSAqLworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBtc2diICptc2diOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSAqcmxjOworCisJbXNnYiA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgcmxjIik7CisJbXNnYi0+bDJoID0gJm1zZ2ItPmRhdGFbMF07CisKKwlybGMgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlICopIG1zZ2JfcHV0KG1zZ2IsIHNpemVvZigqcmxjKSk7CisJcmxjLT50eXBlID0gU0NDUF9NU0dfVFlQRV9STEM7CisJbWVtY3B5KCZybGMtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgJmNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKwltZW1jcHkoJnJsYy0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgJmNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisKKwlfc2VuZF9tc2cobXNnYik7CisKKwkvKgorCSAqIFJlbW92ZSBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBjb25uZWN0aW9ucyBhbmQgc2V0IHRoZSBzdGF0ZS4gVXNlciBjb2RlCisJICogc2hvdWxkIG5vdyBmcmVlIHRoZSBlbnRyeS4KKwkgKi8KKwlsbGlzdF9kZWwoJmNvbm5lY3Rpb24tPmxpc3QpOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKTsKKwlyZXR1cm4gMDsKK30KKworLyogY29ubmVjdGlvbiByZWxlYXNlZCwgc2VuZCBhIHJlbGVhc2VkIGNvbmZpcm0gKi8KK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVsZWFzZWQoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZWQobXNnYiwgJnJlc3VsdCkgPT0gLTEpCisJCXJldHVybiAtMTsKKworCS8qIGxvb2t1cCBpZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiByZWZlcmVuY2UgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAoY29ubi0+ZGF0YV9jYgorCQkgICAgJiYgbWVtY21wKCZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSkgPT0gMAorCQkgICAgJiYgbWVtY21wKCZjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwKSB7CisJCSAgICBnb3RvIGZvdW5kOworCQl9CisJfQorCisKKwlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiVW5rbm93biBjb25uZWN0aW9uIHdhcyByZWxlYXNlZC5cbiIpOworCXJldHVybiAtMTsKKworCS8qIHdlIGhhdmUgZm91bmQgYSBjb25uZWN0aW9uICovCitmb3VuZDoKKwkvKiBvcHRpb25hbCBkYXRhICovCisJaWYgKHJlc3VsdC5kYXRhX2xlbiAhPSAwICYmIGNvbm4tPmRhdGFfY2IpIHsKKwkJY29ubi0+ZGF0YV9jYihjb25uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCX0KKworCS8qIGdlbmVyYXRlIGEgcmVzcG9uc2UgKi8KKwlpZiAoX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUoY29ubikgIT0gMCkgeworCQlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiU2VuZGluZyByZWxlYXNlIGNvbmZpcm1lZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVmdXNlZChzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlpZiAoX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWZ1c2VkKG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCS8qIGxvb2t1cCBpZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiByZWZlcmVuY2UgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAoY29ubi0+aW5jb21pbmcgPT0gMCAmJiBjb25uLT5kYXRhX2NiCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwKSB7CisJCSAgICBnb3RvIGZvdW5kOworCQl9CisJfQorCisJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlJlZnVzZWQgYnV0IG5vIGNvbm5lY3Rpb24gZm91bmRcbiIpOworCXJldHVybiAtMTsKKworZm91bmQ6CisJLyogb3B0aW9uYWwgZGF0YSAqLworCWlmIChyZXN1bHQuZGF0YV9sZW4gIT0gMCAmJiBjb25uLT5kYXRhX2NiKSB7CisJCWNvbm4tPmRhdGFfY2IoY29ubiwgbXNnYiwgcmVzdWx0LmRhdGFfbGVuKTsKKwl9CisKKworCWxsaXN0X2RlbCgmY29ubi0+bGlzdCk7CisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFRlVTRUQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX2NvbmZpcm0oc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fY29uZmlybShtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBsb29rdXAgaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmVmZXJlbmNlICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGNvbm4tPmluY29taW5nID09IDAgJiYgY29ubi0+ZGF0YV9jYgorCQkgICAgJiYgbWVtY21wKCZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkgICAgZ290byBmb3VuZDsKKwkJfQorCX0KKworCUxPR1AoRFNDQ1AsIExPR0xfRVJST1IsICJDb25maXJtZWQgYnV0IG5vIGNvbm5lY3Rpb24gZm91bmRcbiIpOworCXJldHVybiAtMTsKKworZm91bmQ6CisJLyogY29weSB0aGUgYWRkcmVzc2VzIG9mIHRoZSBjb25uZWN0aW9uICovCisJY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gKnJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm4sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCk7CisKKwkvKiBvcHRpb25hbCBkYXRhICovCisJaWYgKHJlc3VsdC5kYXRhX2xlbiAhPSAwICYmIGNvbm4tPmRhdGFfY2IpIHsKKwkJY29ubi0+ZGF0YV9jYihjb25uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCX0KKworCXJldHVybiAwOworfQorCisKK2ludCBzY2NwX3N5c3RlbV9pbml0KHZvaWQgKCpvdXRnb2luZykoc3RydWN0IG1zZ2IgKmRhdGEsIHZvaWQgKmN0eCksIHZvaWQgKmN0eCkKK3sKKwlzY2NwX3N5c3RlbS53cml0ZV9kYXRhID0gb3V0Z29pbmc7CisJc2NjcF9zeXN0ZW0ud3JpdGVfY29udGV4dCA9IGN0eDsKKworCXJldHVybiAwOworfQorCisvKiBvaCBteSBnb2QgYSByZWFsIFNDQ1AgcGFja2V0LiBuZWVkIHRvIGRpc3BhdGNoIGl0IG5vdyAqLworaW50IHNjY3Bfc3lzdGVtX2luY29taW5nKHN0cnVjdCBtc2diICptc2diKQoreworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgMSApIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlRvbyBzaG9ydCBwYWNrZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaW50IHR5cGUgPSBtc2diLT5sMmhbMF07CisKKwlzd2l0Y2godHlwZSkgeworCWNhc2UgU0NDUF9NU0dfVFlQRV9DUjoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlcXVlc3QobXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9STFNEOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVsZWFzZWQobXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9DUkVGOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVmdXNlZChtc2diKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0NDOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fY29uZmlybShtc2diKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX1JMQzoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUobXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9EVDE6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9kdDEobXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9VRFQ6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfcmVhZChtc2diKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgInVuaW1wbGVtZW50ZWQgbXNnIHR5cGU6ICVkXG4iLCB0eXBlKTsKKwl9OworCisJcmV0dXJuIC0xOworfQorCisvKiBjcmVhdGUgYSBwYWNrZXQgZnJvbSB0aGUgZGF0YSAqLworaW50IHNjY3BfY29ubmVjdGlvbl93cml0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbXNnYiAqZGF0YSkKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA8IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9DT05GSVJNCisJICAgIHx8IGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPiBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfRVNUQUJMSVNIRUQpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgInNjY3BfY29ubmVjdGlvbl93cml0ZTogV3JvbmcgY29ubmVjdGlvbiBzdGF0ZTogJXAgJWRcbiIsCisJCSAgICAgICBjb25uZWN0aW9uLCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fZGF0YShjb25uZWN0aW9uLCBkYXRhKTsKK30KKworLyoKKyAqIFNlbmQgYSBJbmFjdGl2aXR5IFRlc3QgbWVzc2FnZS4gVGhlIG93bmVyIG9mIHRoZSBjb25uZWN0aW9uCisgKiBzaG91bGQgc3RhcnQgYSB0aW1lciBhbmQgY2FsbCB0aGlzIG1ldGhvZCByZWd1bGFyaWx5LiBDYWxsaW5nCisgKiB0aGlzIGV2ZXJ5IDYwIHNlY29uZHMgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLgorICovCitpbnQgc2NjcF9jb25uZWN0aW9uX3NlbmRfaXQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA8IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9DT05GSVJNCisJICAgIHx8IGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPiBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfRVNUQUJMSVNIRUQpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgInNjY3BfY29ubmVjdGlvbl93cml0ZTogV3JvbmcgY29ubmVjdGlvbiBzdGF0ZTogJXAgJWRcbiIsCisJCSAgICAgICBjb25uZWN0aW9uLCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25faXQoY29ubmVjdGlvbik7Cit9CisKKy8qIHNlbmQgYSBjb25uZWN0aW9uIHJlbGVhc2UgYW5kIHdhaXQgZm9yIHRoZSBjb25uZWN0aW9uIHJlbGVhc2VkICovCitpbnQgc2NjcF9jb25uZWN0aW9uX2Nsb3NlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCBjYXVzZSkKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA8IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9DT05GSVJNCisJICAgIHx8IGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPiBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfRVNUQUJMSVNIRUQpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIkNhbiBub3QgY2xvc2UgdGhlIGNvbm5lY3Rpb24uIEl0IHdhcyBuZXZlciBvcGVuZWQ6ICVwICVkXG4iLAorCQkJY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlbGVhc2VkKGNvbm5lY3Rpb24sIGNhdXNlKTsKK30KKworaW50IHNjY3BfY29ubmVjdGlvbl9mcmVlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJaWYgKGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPiBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfTk9ORQorCSAgICAmJiBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlIDwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpIHsKKwkJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlRoZSBjb25uZWN0aW9uIG5lZWRzIHRvIGJlIHJlbGVhc2VkIGJlZm9yZSBpdCBpcyBmcmVlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJdGFsbG9jX2ZyZWUoY29ubmVjdGlvbik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzY2NwX2Nvbm5lY3Rpb25fZm9yY2VfZnJlZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb24pCit7CisJaWYgKGNvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9OT05FICYmCisJICAgIGNvbi0+Y29ubmVjdGlvbl9zdGF0ZSA8IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKQorCQlsbGlzdF9kZWwoJmNvbi0+bGlzdCk7CisKKwljb24tPmNvbm5lY3Rpb25fc3RhdGUgPSBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVGVVNFRDsKKwlzY2NwX2Nvbm5lY3Rpb25fZnJlZShjb24pOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqc2NjcF9jb25uZWN0aW9uX3NvY2tldCh2b2lkKQoreworCXJldHVybiB0YWxsb2NfemVybyh0YWxsX3NjY3BfY3R4LCBzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uKTsKK30KKworaW50IHNjY3BfY29ubmVjdGlvbl9jb25uZWN0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKmxvY2FsLAorCQkJICAgIHN0cnVjdCBtc2diICpkYXRhKQoreworCXJldHVybiBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVxdWVzdChjb25uLCBsb2NhbCwgZGF0YSk7Cit9CisKK2ludCBzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrLAorCQkJCSBpbnQgKCphY2NlcHRfY2IpKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKiwgdm9pZCAqKSwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpjYjsKKworCWlmICghc29jaykKKwkJcmV0dXJuIC0yOworCisJY2IgPSBfZmluZF9zc24oc29jay0+c2NjcF9zc24pOworCWlmICghY2IpCisJCXJldHVybiAtMTsKKworCWNiLT5hY2NlcHRfY2IgPSBhY2NlcHRfY2I7CisJY2ItPmFjY2VwdF9jb250ZXh0ID0gY29udGV4dDsKKwlyZXR1cm4gMDsKK30KKworaW50IHNjY3Bfd3JpdGUoc3RydWN0IG1zZ2IgKmRhdGEsIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICppbiwKKwkgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKm91dCwgaW50IGNsYXNzKQoreworCXJldHVybiBfc2NjcF9zZW5kX2RhdGEoY2xhc3MsIGluLCBvdXQsIGRhdGEpOworfQorCitpbnQgc2NjcF9zZXRfcmVhZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29jaywKKwkJICBpbnQgKCpyZWFkX2NiKShzdHJ1Y3QgbXNnYiAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgKiksIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisKKwlpZiAoIXNvY2spCisJCXJldHVybiAtMjsKKworCWNiICA9IF9maW5kX3Nzbihzb2NrLT5zY2NwX3Nzbik7CisJaWYgKCFjYikKKwkJcmV0dXJuIC0xOworCisJY2ItPnJlYWRfY2IgPSByZWFkX2NiOworCWNiLT5yZWFkX2NvbnRleHQgPSBjb250ZXh0OworCXJldHVybiAwOworfQorCitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSA8PSBzaXplb2YodV9pbnQzMl90KSwgZW5vdWdoX3NwYWNlKTsKKwordV9pbnQzMl90IHNjY3Bfc3JjX3JlZl90b19pbnQoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqcmVmKQoreworCXVfaW50MzJfdCBzcmNfcmVmID0gMDsKKwltZW1jcHkoJnNyY19yZWYsIHJlZiwgc2l6ZW9mKCpyZWYpKTsKKwlyZXR1cm4gc3JjX3JlZjsKK30KKworc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzY2NwX3NyY19yZWZfZnJvbV9pbnQodV9pbnQzMl90IGludF9yZWYpCit7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSByZWY7CisJbWVtY3B5KCZyZWYsICZpbnRfcmVmLCBzaXplb2YocmVmKSk7CisJcmV0dXJuIHJlZjsKK30KKworaW50IHNjY3BfZGV0ZXJtaW5lX21zZ190eXBlKHN0cnVjdCBtc2diICptc2cpCit7CisJaWYgKG1zZ2JfbDJsZW4obXNnKSA8IDEpCisJCXJldHVybiAtMTsKKworCXJldHVybiBtc2ctPmwyaFswXTsKK30KKworaW50IHNjY3BfcGFyc2VfaGVhZGVyKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCWludCB0eXBlOworCisJaWYgKG1zZ2JfbDJsZW4obXNnKSA8IDEpCisJCXJldHVybiAtMTsKKworCXR5cGUgPSBtc2ctPmwyaFswXTsKKwlzd2l0Y2godHlwZSkgeworCWNhc2UgU0NDUF9NU0dfVFlQRV9DUjoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVxdWVzdChtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9STFNEOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWxlYXNlZChtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9DUkVGOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWZ1c2VkKG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0NDOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9jb25maXJtKG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX1JMQzoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9EVDE6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2R0MShtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9VRFQ6CisJCXJldHVybiBfc2NjcF9wYXJzZV91ZHQobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfSVQ6CisJCXJldHVybiBfc2NjcF9wYXJzZV9pdChtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9FUlI6CisJCXJldHVybiBfc2NjcF9wYXJzZV9lcnIobXNnLCByZXN1bHQpOworCQlicmVhazsKKwl9OworCisJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlVuaW1wbGVtZW50ZWQgTVNHIFR5cGU6IDB4JXhcbiIsIHR5cGUpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZCh2b2lkKQoreworCXRhbGxfc2NjcF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgInNjY3AiKTsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKSB2b2lkIG9uX2Rzb191bmxvYWQodm9pZCkKK3sKKwl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF9zY2NwX2N0eCwgc3RkZXJyKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3NpbGVudF9jYWxsLmMgYi9vcGVuYnNjL3NyYy9zaWxlbnRfY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDUzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9zaWxlbnRfY2FsbC5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKiBHU00gc2lsZW50IGNhbGwgZmVhdHVyZSAqLworCisvKgorICogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKworLyogcGFnaW5nIG9mIHRoZSByZXF1ZXN0ZWQgc3Vic2NyaWJlciBoYXMgY29tcGxldGVkICovCitzdGF0aWMgaW50IHBhZ2luZ19jYl9zaWxlbnQodW5zaWduZWQgaW50IGhvb2tudW0sIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpfbGNoYW4sIHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gX2xjaGFuOworCXN0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSBzaWdkYXRhOworCWludCByYzsKKworCWlmIChob29rbnVtICE9IEdTTV9IT09LX1JSX1BBR0lORykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlERUJVR1AoRFNNUywgInBhZ2luZ19jYl9zaWxlbnQ6ICIpOworCisJY29ubiA9ICZsY2hhbi0+Y29ubjsKKworCXNpZ2RhdGEubGNoYW4gPSBsY2hhbjsKKwlzaWdkYXRhLmRhdGEgPSBfZGF0YTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEdTTV9QQUdJTkdfU1VDQ0VFREVEOgorCQlERUJVR1BDKERTTVMsICJzdWNjZXNzLCB1c2luZyBUaW1lc2xvdCAldSBvbiBBUkZDTiAldVxuIiwKKwkJCWxjaGFuLT50cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5hcmZjbik7CisJCWNvbm4tPnNpbGVudF9jYWxsID0gMTsKKwkJLyogaW5jcmVtZW50IGxjaGFuIHJlZmVyZW5jZSBjb3VudCAqLworCQlkaXNwYXRjaF9zaWduYWwoU1NfU0NBTEwsIFNfU0NBTExfU1VDQ0VTUywgJnNpZ2RhdGEpOworCQl1c2Vfc3Vic2NyX2Nvbihjb25uKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fUEFHSU5HX0VYUElSRUQ6CisJCURFQlVHUChEU01TLCAiZXhwaXJlZFxuIik7CisJCWRpc3BhdGNoX3NpZ25hbChTU19TQ0FMTCwgU19TQ0FMTF9FWFBJUkVELCAmc2lnZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiByZWNlaXZlIGEgbGF5ZXIgMyBtZXNzYWdlIGZyb20gYSBzaWxlbnQgY2FsbCAqLworaW50IHNpbGVudF9jYWxsX3J4KHN0cnVjdCBtc2diICptc2cpCit7CisJLyogRklYTUU6IGRvIHNvbWV0aGluZyBsaWtlIHNlbmRpbmcgaXQgdGhyb3VnaCBhIFVEUCBwb3J0ICovCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBtc2dfbWF0Y2ggeworCXVfaW50OF90IHBkaXNjOworCXVfaW50OF90IG1zZ190eXBlOworfTsKKworLyogbGlzdCBvZiBtZXNzYWdlcyB0aGF0IGFyZSBoYW5kbGVkIGluc2lkZSBPcGVuQlNDLCBldmVuIGluIGEgc2lsZW50IGNhbGwgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXNnX21hdGNoIHNpbGVudF9jYWxsX2FjY2VwdFtdID0geworCXsgR1NNNDhfUERJU0NfTU0sIEdTTTQ4X01UX01NX0xPQ19VUERfUkVRVUVTVCB9LAorCXsgR1NNNDhfUERJU0NfTU0sIEdTTTQ4X01UX01NX0NNX1NFUlZfUkVRIH0sCit9OworCisvKiBkZWNpZGUgaWYgd2UgbmVlZCB0byByZXJvdXRlIGEgbWVzc2FnZSBhcyBwYXJ0IG9mIGEgc2lsZW50IGNhbGwgKi8KK2ludCBzaWxlbnRfY2FsbF9yZXJvdXRlKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgcGRpc2MgPSBnaC0+cHJvdG9fZGlzY3IgJiAweDBmOworCWludCBpOworCisJLyogaWYgd2UncmUgbm90IHBhcnQgb2YgYSBzaWxlbnQgY2FsbCwgbmV2ZXIgcmVyb3V0ZSAqLworCWlmICghbXNnLT5sY2hhbi0+Y29ubi5zaWxlbnRfY2FsbCkKKwkJcmV0dXJuIDA7CisKKwkvKiBjaGVjayBpZiB3ZSBhcmUgYSBzcGVjaWFsIG1lc3NhZ2UgdGhhdCBpcyBoYW5kbGVkIGluIG9wZW5ic2MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzaWxlbnRfY2FsbF9hY2NlcHQpOyBpKyspIHsKKwkJaWYgKHNpbGVudF9jYWxsX2FjY2VwdFtpXS5wZGlzYyA9PSBwZGlzYyAmJgorCQkgICAgc2lsZW50X2NhbGxfYWNjZXB0W2ldLm1zZ190eXBlID09IGdoLT5tc2dfdHlwZSkKKwkJCXJldHVybiAwOworCX0KKworCS8qIG90aGVyd2lzZSwgcmVyb3V0ZSAqLworCXJldHVybiAxOworfQorCisKKy8qIGluaXRpYXRlIGEgc2lsZW50IGNhbGwgd2l0aCBhIGdpdmVuIHN1YnNjcmliZXIgKi8KK2ludCBnc21fc2lsZW50X2NhbGxfc3RhcnQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsIHZvaWQgKmRhdGEsIGludCB0eXBlKQoreworCWludCByYzsKKworCXJjID0gcGFnaW5nX3JlcXVlc3Qoc3Vic2NyLT5uZXQsIHN1YnNjciwgdHlwZSwKKwkJCSAgICBwYWdpbmdfY2Jfc2lsZW50LCBkYXRhKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGVuZCBhIHNpbGVudCBjYWxsIHdpdGggYSBnaXZlbiBzdWJzY3JpYmVyICovCitpbnQgZ3NtX3NpbGVudF9jYWxsX3N0b3Aoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwlpZiAoIWxjaGFuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGRpZCB3ZSBhY3R1YWxseSBlc3RhYmxpc2ggYSBzaWxlbnQgY2FsbCBmb3IgdGhpcyBndXk/ICovCisJY29ubiA9ICZsY2hhbi0+Y29ubjsKKwlpZiAoIWNvbm4tPnNpbGVudF9jYWxsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB1dF9zdWJzY3JfY29uKGNvbm4pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9zdWJjaGFuX2RlbXV4LmMgYi9vcGVuYnNjL3NyYy9zdWJjaGFuX2RlbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2YzFmZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3N1YmNoYW5fZGVtdXguYwpAQCAtMCwwICsxLDMyMiBAQAorLyogQSBFMSBzdWItY2hhbm5lbCAoZGUpbXVsdGlwbGV4ZXIgd2l0aCBUUkFVIGZyYW1lIHN5bmMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKwordm9pZCAqdGFsbF90cWVfY3R4OworCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kX2JpdChzdHJ1Y3QgZGVtdXhfc3ViY2ggKnNjaCwgdV9pbnQ4X3QgYml0KQoreworCXNjaC0+b3V0X2JpdGJ1ZltzY2gtPm91dF9pZHgrK10gPSBiaXQ7Cit9CisKKyNkZWZpbmUgU1lOQ19IRFJfQklUUwkxNgorc3RhdGljIGNvbnN0IHVfaW50OF90IG51bGxieXRlc1tTWU5DX0hEUl9CSVRTXTsKKworLyogY2hlY2sgaWYgd2UgaGF2ZSBqdXN0IGNvbXBsZXRlZCB0aGUgMTYgYml0IHplcm8gc3luYyBoZWFkZXIsCisgKiBpbiBhY2NvcmRhbmNlIHdpdGggR1NNIFRTIDA4LjYwIENoYXB0ZXIgNC44LjEgKi8KK3N0YXRpYyBpbnQgc3luY19oZHJfY29tcGxldGUoc3RydWN0IGRlbXV4X3N1YmNoICpzY2gsIHVfaW50OF90IGJpdCkKK3sKKwlpZiAoYml0ID09IDApCisJCXNjaC0+Y29uc2VjdXRpdmVfemVyb3MrKzsKKwllbHNlCisJCXNjaC0+Y29uc2VjdXRpdmVfemVyb3MgPSAwOworCisJaWYgKHNjaC0+Y29uc2VjdXRpdmVfemVyb3MgPj0gU1lOQ19IRFJfQklUUykgeworCQlzY2gtPmNvbnNlY3V0aXZlX3plcm9zID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlc3luY2hyb25pemUgdG8gY3VycmVudCBsb2NhdGlvbiAqLworc3RhdGljIHZvaWQgcmVzeW5jX3RvX2hlcmUoc3RydWN0IGRlbXV4X3N1YmNoICpzY2gpCit7CisJbWVtc2V0KHNjaC0+b3V0X2JpdGJ1ZiwgMCwgU1lOQ19IRFJfQklUUyk7CisKKwkvKiBzZXQgaW5kZXggaW4gYSB3YXkgdGhhdCB3ZSBjYW4gY29udGludWUgcmVjZWl2aW5nIGJpdHMgYWZ0ZXIKKwkgKiB0aGUgZW5kIG9mIHRoZSBTWU5DIGhlYWRlciAqLworCXNjaC0+b3V0X2lkeCA9IFNZTkNfSERSX0JJVFM7CisJc2NoLT5pbl9zeW5jID0gMTsKK30KKworaW50IHN1YmNoX2RlbXV4X2luaXQoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgpCit7CisJaW50IGk7CisKKwlkbXgtPmNoYW5fYWN0aXYgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOUl9TVUJDSDsgaSsrKSB7CisJCXN0cnVjdCBkZW11eF9zdWJjaCAqc2NoID0gJmRteC0+c3ViY2hbaV07CisJCXNjaC0+b3V0X2lkeCA9IDA7CisJCW1lbXNldChzY2gtPm91dF9iaXRidWYsIDB4ZmYsIHNpemVvZihzY2gtPm91dF9iaXRidWYpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGlucHV0IHNvbWUgYXJiaXRyYXJ5IChtb2R1bG8gNCkgbnVtYmVyIG9mIGJ5dGVzIG9mIGEgNjRrIEUxIGNoYW5uZWwsCisgKiBzcGxpdCBpdCBpbnRvIHRoZSAxNmsgc3ViY2hhbm5lbHMgKi8KK2ludCBzdWJjaF9kZW11eF9pbihzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGksIGM7CisKKwkvKiB3ZSBhdm9pZCBwYXJ0aWFsbHkgZmlsbGVkIGJ5dGVzIGluIG91dGJ1ZiAqLworCWlmIChsZW4gJSA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl1X2ludDhfdCBpbmJ5dGUgPSBkYXRhW2ldOworCisJCWZvciAoYyA9IDA7IGMgPCBOUl9TVUJDSDsgYysrKSB7CisJCQlzdHJ1Y3QgZGVtdXhfc3ViY2ggKnNjaCA9ICZkbXgtPnN1YmNoW2NdOworCQkJdV9pbnQ4X3QgaW5iaXRzOworCQkJdV9pbnQ4X3QgYml0OworCisJCQkvKiBpZ25vcmUgaW5hY3RpdmUgc3ViY2hhbm5lbHMgKi8KKwkJCWlmICghKGRteC0+Y2hhbl9hY3RpdiAmICgxIDw8IGMpKSkKKwkJCQljb250aW51ZTsKKworCQkJaW5iaXRzID0gaW5ieXRlID4+IChjIDw8IDEpOworCisJCQkvKiB0d28gYml0cyBmb3IgZWFjaCBzdWJjaGFubmVsICovCisJCQlpZiAoaW5iaXRzICYgMHgwMSkKKwkJCQliaXQgPSAxOworCQkJZWxzZQorCQkJCWJpdCA9IDA7CisJCQlhcHBlbmRfYml0KHNjaCwgYml0KTsKKworCQkJaWYgKHN5bmNfaGRyX2NvbXBsZXRlKHNjaCwgYml0KSkKKwkJCQlyZXN5bmNfdG9faGVyZShzY2gpOworCisJCQlpZiAoaW5iaXRzICYgMHgwMikKKwkJCQliaXQgPSAxOworCQkJZWxzZQorCQkJCWJpdCA9IDA7CisJCQlhcHBlbmRfYml0KHNjaCwgYml0KTsKKworCQkJaWYgKHN5bmNfaGRyX2NvbXBsZXRlKHNjaCwgYml0KSkKKwkJCQlyZXN5bmNfdG9faGVyZShzY2gpOworCisJCQkvKiBGSVhNRTogdmVyaWZ5IHRoZSBmaXJzdCBiaXQgaW4gb2N0ZXQgMiwgNCwgNiwgLi4uCisJCQkgKiBhY2NvcmRpbmcgdG8gVFMgMDguNjAgNC44LjEgKi8KKworCQkJLyogb25jZSB3ZSBoYXZlIHJlYWNoZWQgVFJBVV9GUkFNRV9CSVRTLCBjYWxsCisJCQkgKiB0aGUgVFJBVSBmcmFtZSBoYW5kbGVyIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJCQlpZiAoc2NoLT5vdXRfaWR4ID49IFRSQVVfRlJBTUVfQklUUykgeworCQkJCWlmIChzY2gtPmluX3N5bmMpIHsKKwkJCQkJZG14LT5vdXRfY2IoZG14LCBjLCBzY2gtPm91dF9iaXRidWYsCisJCQkJCSAgICBzY2gtPm91dF9pZHgsIGRteC0+ZGF0YSk7CisJCQkJCXNjaC0+aW5fc3luYyA9IDA7CisJCQkJfQorCQkJCXNjaC0+b3V0X2lkeCA9IDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGk7Cit9CisKK2ludCBzdWJjaF9kZW11eF9hY3RpdmF0ZShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IHN1YmNoKQoreworCWlmIChzdWJjaCA+PSBOUl9TVUJDSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbXgtPmNoYW5fYWN0aXYgfD0gKDEgPDwgc3ViY2gpOworCXJldHVybiAwOworfQorCitpbnQgc3ViY2hfZGVtdXhfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IHN1YmNoKQoreworCWlmIChzdWJjaCA+PSBOUl9TVUJDSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbXgtPmNoYW5fYWN0aXYgJj0gfigxIDw8IHN1YmNoKTsKKwlyZXR1cm4gMDsKK30KKworLyogTVVMVElQTEVYRVIgKi8KKworc3RhdGljIGludCBhbGxvY19hZGRfaWRsZV9mcmFtZShzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgaW50IHNjaF9ucikKK3sKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB3aXRoIGlkbGUgcGF0dGVybiAqLworCXJldHVybiBzdWJjaGFuX211eF9lbnF1ZXVlKG14LCBzY2hfbnIsIHRyYXVfaWRsZV9mcmFtZSgpLAorCQkJCSAgIFRSQVVfRlJBTUVfQklUUyk7Cit9CisKKy8qIHJldHVybiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBiaXRzIGZyb20gdGhlIHNwZWNpZmllZCBzdWJjaGFubmVsICovCitzdGF0aWMgaW50IGdldF9zdWJjaF9iaXRzKHN0cnVjdCBzdWJjaF9tdXggKm14LCBpbnQgc3ViY2gsCisJCQkgIHVfaW50OF90ICpiaXRzLCBpbnQgbnVtX3JlcXVlc3RlZCkKK3sKKwlzdHJ1Y3QgbXV4X3N1YmNoICpzY2ggPSAmbXgtPnN1YmNoW3N1YmNoXTsKKwlpbnQgbnVtX2JpdHMgPSAwOworCisJd2hpbGUgKG51bV9iaXRzIDwgbnVtX3JlcXVlc3RlZCkgeworCQlzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5ICp0eGU7CisJCWludCBudW1fYml0c19sZWZ0OworCQlpbnQgbnVtX2JpdHNfdGhpc3RpbWU7CisKKwkJLyogbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBlbnRyeSBhdCB0b3Agb2YgdHggcXVldWUuCisJCSAqIGlmIG5vdCwgYWRkIGFuIGlkbGUgZnJhbWUgKi8KKwkJaWYgKGxsaXN0X2VtcHR5KCZzY2gtPnR4X3F1ZXVlKSkKKwkJCWFsbG9jX2FkZF9pZGxlX2ZyYW1lKG14LCBzdWJjaCk7CisJCisJCWlmIChsbGlzdF9lbXB0eSgmc2NoLT50eF9xdWV1ZSkpCisJCQlyZXR1cm4gLUVJTzsKKworCQl0eGUgPSBsbGlzdF9lbnRyeShzY2gtPnR4X3F1ZXVlLm5leHQsIHN0cnVjdCBzdWJjaF90eHFfZW50cnksIGxpc3QpOworCQludW1fYml0c19sZWZ0ID0gdHhlLT5iaXRfbGVuIC0gdHhlLT5uZXh0X2JpdDsKKworCQlpZiAobnVtX2JpdHNfbGVmdCA8IG51bV9yZXF1ZXN0ZWQpCisJCQludW1fYml0c190aGlzdGltZSA9IG51bV9iaXRzX2xlZnQ7CisJCWVsc2UKKwkJCW51bV9iaXRzX3RoaXN0aW1lID0gbnVtX3JlcXVlc3RlZDsKKworCQkvKiBwdWxsIHRoZSBiaXRzIGZyb20gdGhlIHR4ZSAqLworCQltZW1jcHkoYml0cyArIG51bV9iaXRzLCB0eGUtPmJpdHMgKyB0eGUtPm5leHRfYml0LCBudW1fYml0c190aGlzdGltZSk7CisJCXR4ZS0+bmV4dF9iaXQgKz0gbnVtX2JpdHNfdGhpc3RpbWU7CisKKwkJLyogZnJlZSB0aGUgdHhfcXVldWUgZW50cnkgaWYgaXQgaXMgZnVsbHkgY29uc3VtZWQgKi8KKwkJaWYgKHR4ZS0+bmV4dF9iaXQgPj0gdHhlLT5iaXRfbGVuKSB7CisJCQlsbGlzdF9kZWwoJnR4ZS0+bGlzdCk7CisJCQl0YWxsb2NfZnJlZSh0eGUpOworCQl9CisKKwkJLyogaW5jcmVtZW50IGdsb2JhbCBudW1iZXIgb2YgYml0cyBkZXF1ZXVlZCAqLworCQludW1fYml0cyArPSBudW1fYml0c190aGlzdGltZTsKKwl9CisKKwlyZXR1cm4gbnVtX3JlcXVlc3RlZDsKK30KKworLyogY29tcGFjdCBhbiBhcnJheSBvZiA4IHNpbmdsZS1iaXQgYnl0ZXMgaW50byBvbmUgYnl0ZSBvZiA4IGJpdHMgKi8KK3N0YXRpYyB1X2ludDhfdCBjb21wYWN0X2JpdHMoY29uc3QgdV9pbnQ4X3QgKmJpdHMpCit7CisJdV9pbnQ4X3QgcmV0ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXJldCB8PSAoYml0c1tpXSA/IDEgOiAwKSA8PCBpOworCisJcmV0dXJuIHJldDsKK30KKworLyogb2J0YWluIGEgc2luZ2xlIG91dHB1dCBieXRlIGZyb20gdGhlIHN1YmNoYW5uZWwgbXV4ZXIgKi8KK3N0YXRpYyBpbnQgbXV4X291dHB1dF9ieXRlKHN0cnVjdCBzdWJjaF9tdXggKm14LCB1X2ludDhfdCAqYnl0ZSkKK3sKKwl1X2ludDhfdCBiaXRzWzhdOworCWludCByYzsKKworCS8qIGNvbWJpbmUgdHdvIGJpdHMgb2YgZXZlcnkgc3ViY2hhbiAqLworCXJjID0gZ2V0X3N1YmNoX2JpdHMobXgsIDAsICZiaXRzWzBdLCAyKTsKKwlyYyA9IGdldF9zdWJjaF9iaXRzKG14LCAxLCAmYml0c1syXSwgMik7CisJcmMgPSBnZXRfc3ViY2hfYml0cyhteCwgMiwgJmJpdHNbNF0sIDIpOworCXJjID0gZ2V0X3N1YmNoX2JpdHMobXgsIDMsICZiaXRzWzZdLCAyKTsKKworCSpieXRlID0gY29tcGFjdF9iaXRzKGJpdHMpOworCisJcmV0dXJuIHJjOworfQorCisvKiBSZXF1ZXN0IHRoZSBvdXRwdXQgb2Ygc29tZSBtdXhlZCBieXRlcyBmcm9tIHRoZSBzdWJjaGFuIG11eGVyICovCitpbnQgc3ViY2hhbl9tdXhfb3V0KHN0cnVjdCBzdWJjaF9tdXggKm14LCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpbnQgcmM7CisJCXJjID0gbXV4X291dHB1dF9ieXRlKG14LCAmZGF0YVtpXSk7CisJCWlmIChyYyA8IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgbGxpc3RfbGVuKHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsbGlzdF9oZWFkICplbnRyeTsKKwlpbnQgaSA9IDA7CisKKwlsbGlzdF9mb3JfZWFjaChlbnRyeSwgaGVhZCkKKwkJaSsrOworCisJcmV0dXJuIGk7Cit9CisKKy8qIGV2aWN0IHRoZSAnbnVtX2V2aWN0JyBudW1iZXIgb2Ygb2xkZXN0IGVudHJpZXMgaW4gdGhlIHF1ZXVlICovCitzdGF0aWMgdm9pZCB0eF9xdWV1ZV9ldmljdChzdHJ1Y3QgbXV4X3N1YmNoICpzY2gsIGludCBudW1fZXZpY3QpCit7CisJc3RydWN0IHN1YmNoX3R4cV9lbnRyeSAqdHFlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9ldmljdDsgaSsrKSB7CisJCWlmIChsbGlzdF9lbXB0eSgmc2NoLT50eF9xdWV1ZSkpCisJCQlyZXR1cm47CisKKwkJdHFlID0gbGxpc3RfZW50cnkoc2NoLT50eF9xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5LCBsaXN0KTsKKwkJbGxpc3RfZGVsKCZ0cWUtPmxpc3QpOworCQl0YWxsb2NfZnJlZSh0cWUpOworCX0KK30KKworLyogZW5xdWV1ZSBzb21lIGRhdGEgaW50byB0aGUgdHhfcXVldWUgb2YgYSBnaXZlbiBzdWJjaGFubmVsICovCitpbnQgc3ViY2hhbl9tdXhfZW5xdWV1ZShzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgaW50IHNfbnIsIGNvbnN0IHVfaW50OF90ICpkYXRhLAorCQkJaW50IGxlbikKK3sKKwlzdHJ1Y3QgbXV4X3N1YmNoICpzY2ggPSAmbXgtPnN1YmNoW3NfbnJdOworCWludCBsaXN0X2xlbiA9IGxsaXN0X2xlbigmc2NoLT50eF9xdWV1ZSk7CisJc3RydWN0IHN1YmNoX3R4cV9lbnRyeSAqdHFlID0gdGFsbG9jX3plcm9fc2l6ZSh0YWxsX3RxZV9jdHgsCisJCQkJCQkJc2l6ZW9mKCp0cWUpICsgbGVuKTsKKwlpZiAoIXRxZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0cWUtPmJpdF9sZW4gPSBsZW47CisJbWVtY3B5KHRxZS0+Yml0cywgZGF0YSwgbGVuKTsKKworCWlmIChsaXN0X2xlbiA+IDIpCisJCXR4X3F1ZXVlX2V2aWN0KHNjaCwgbGlzdF9sZW4tMik7CisKKwlsbGlzdF9hZGRfdGFpbCgmdHFlLT5saXN0LCAmc2NoLT50eF9xdWV1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogaW5pdGlhbGl6ZSBvbmUgc3ViY2hhbm5lbCBtdXhlciBpbnN0YW5jZSAqLworaW50IHN1YmNoYW5fbXV4X2luaXQoc3RydWN0IHN1YmNoX211eCAqbXgpCit7CisJaW50IGk7CisKKwltZW1zZXQobXgsIDAsIHNpemVvZigqbXgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfU1VCQ0g7IGkrKykgeworCQlzdHJ1Y3QgbXV4X3N1YmNoICpzY2ggPSAmbXgtPnN1YmNoW2ldOworCQlJTklUX0xMSVNUX0hFQUQoJnNjaC0+dHhfcXVldWUpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvc3lzdGVtX2luZm9ybWF0aW9uLmMgYi9vcGVuYnNjL3NyYy9zeXN0ZW1faW5mb3JtYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmQ4MzNhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvc3lzdGVtX2luZm9ybWF0aW9uLmMKQEAgLTAsMCArMSw0OTQgQEAKKy8qIEdTTSAwNC4wOCBTeXN0ZW0gSW5mb3JtYXRpb24gKFNJKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Jlc3Rfb2N0ZXRzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisjZGVmaW5lIEdTTTQ4X0NFTExfQ0hBTl9ERVNDX1NJWkUJMTYKKyNkZWZpbmUgR1NNX01BQ0JMT0NLX0xFTiAJCTIzCisjZGVmaW5lIEdTTV9NQUNCTE9DS19QQURESU5HCQkweDJiCisKKy8qIHZlcmlmeSB0aGUgc2l6ZXMgb2YgdGhlIHN5c3RlbSBpbmZvcm1hdGlvbiB0eXBlIHN0cnVjdHMgKi8KKworLyogcmVzdCBvY3RldHMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzdHJ1Y3QgKi8KK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV9oZWFkZXIpID09IDMsIF9zaV9oZWFkZXJfc2l6ZSk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sKSA9PSAzLCBfc2lfcmFjaF9jb250cm9sKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xKSA9PSAyMiwgX3NpMV9zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8yKSA9PSAyMywgX3NpMl9zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8zKSA9PSAxOSwgX3NpM19zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV80KSA9PSAxMywgX3NpNF9zaXplKTsKKworLyogYnMxMSBmb3Jnb3QgdGhlIGwyIGxlbiwgMC02IHJlc3Qgb2N0ZXRzICovCitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNSkgPT0gMTgsIF9zaTVfc2l6ZSk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNikgPT0gMTEsIF9zaTZfc2l6ZSk7CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xMykgPT0gMywgX3NpMTNfc2l6ZSk7CisKKy8qIEZyZXF1ZW5jeSBMaXN0cyBhcyBwZXIgVFMgMDQuMDggMTAuNS4yLjEzICovCisKKy8qIDEwLjUuMi4xMy4yOiBCaXQgbWFwIDAgZm9ybWF0ICovCitzdGF0aWMgaW50IGZyZXFfbGlzdF9ibTBfc2V0X2FyZmNuKHVfaW50OF90ICpjaGFuX2xpc3QsIHVuc2lnbmVkIGludCBhcmZjbikKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZSwgYml0OworCisJaWYgKGFyZmNuID4gMTI0IHx8IGFyZmNuIDwgMSkgeworCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkJpdG1hcCAwIG9ubHkgc3VwcG9ydHMgQVJGQ04gMS4uLjEyNFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHRoZSBiaXRtYXNrIGlzIGZyb20gMS4uMTI0LCBub3QgZnJvbSAwLi4xMjMgKi8KKwlhcmZjbi0tOworCisJYnl0ZSA9IGFyZmNuIC8gODsKKwliaXQgPSBhcmZjbiAlIDg7CisKKwljaGFuX2xpc3RbR1NNNDhfQ0VMTF9DSEFOX0RFU0NfU0laRS0xLWJ5dGVdIHw9ICgxIDw8IGJpdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogMTAuNS4yLjEzLjc6IFZhcmlhYmxlIGJpdCBtYXAgZm9ybWF0ICovCitzdGF0aWMgaW50IGZyZXFfbGlzdF9ibXJlbF9zZXRfYXJmY24odV9pbnQ4X3QgKmNoYW5fbGlzdCwgdW5zaWduZWQgaW50IGFyZmNuKQoreworCXVuc2lnbmVkIGludCBieXRlLCBiaXQ7CisJdW5zaWduZWQgaW50IG1pbl9hcmZjbjsKKwl1bnNpZ25lZCBpbnQgYml0bm87CisKKwltaW5fYXJmY24gPSAoY2hhbl9saXN0WzBdICYgMSkgPDwgOTsKKwltaW5fYXJmY24gfD0gY2hhbl9saXN0WzFdIDw8IDE7CisJbWluX2FyZmNuIHw9IChjaGFuX2xpc3RbMl0gPj4gNykgJiAxOworCisJLyogVGhlIGxvd2VyIGVuZCBvZiBvdXIgYml0bWFrcyBpcyBhbHdheXMgaW1wbGljaXRseSBpbmNsdWRlZCAqLworCWlmIChhcmZjbiA9PSBtaW5fYXJmY24pCisJCXJldHVybiAwOworCisJaWYgKGFyZmNuIDwgbWluX2FyZmNuKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiYXJmY24oJXUpIDwgbWluKCV1KVxuIiwgYXJmY24sIG1pbl9hcmZjbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYXJmY24gPiBtaW5fYXJmY24gKyAxMTEpIHsKKwkJTE9HUChEUlIsIExPR0xfRVJST1IsICJhcmZjbigldSkgPiBtaW4oJXUpICsgMTExXG4iLCBhcmZjbiwgbWluX2FyZmNuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYml0bm8gPSAoYXJmY24gLSBtaW5fYXJmY24pOworCWJ5dGUgPSBiaXRubyAvIDg7CisJYml0ID0gYml0bm8gJSA4OworCisJY2hhbl9saXN0WzIgKyBieXRlXSB8PSAxIDw8ICg3IC0gYml0KTsKKworCXJldHVybiAwOworfQorCisvKiBnZW5lcmF0ZSBhIGNlbGwgY2hhbm5lbCBsaXN0IGFzIHBlciBTZWN0aW9uIDEwLjUuMi4xYiBvZiAwNC4wOCAqLworc3RhdGljIGludCBiaXR2ZWMyZnJlcV9saXN0KHVfaW50OF90ICpjaGFuX2xpc3QsIHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJICAgIGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IGksIHJjLCBtaW4gPSAxMDI0LCBtYXggPSAtMTsKKworCW1lbXNldChjaGFuX2xpc3QsIDAsIDE2KTsKKworCS8qIEdTTTkwMC1vbmx5IGhhbmRzZXRzIG9ubHkgc3VwcG9ydCAnYml0IG1hcCAwIGZvcm1hdCcgKi8KKwlpZiAoYnRzLT5iYW5kID09IEdTTV9CQU5EXzkwMCkgeworCQljaGFuX2xpc3RbMF0gPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBidi0+ZGF0YV9sZW4qODsgaSsrKSB7CisJCQlpZiAoYml0dmVjX2dldF9iaXRfcG9zKGJ2LCBpKSkgeworCQkJCXJjID0gZnJlcV9saXN0X2JtMF9zZXRfYXJmY24oY2hhbl9saXN0LCBpKTsKKwkJCQlpZiAocmMgPCAwKQorCQkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgJ1ZhcmlhYmxlIGJpdG1hcCBmb3JtYXQnICovCisJY2hhbl9saXN0WzBdID0gMHg4ZTsKKworCWZvciAoaSA9IDA7IGkgPCBidi0+ZGF0YV9sZW4qODsgaSsrKSB7CisJCWlmIChiaXR2ZWNfZ2V0X2JpdF9wb3MoYnYsIGkpKSB7CisJCQlpZiAoaSA8IG1pbikKKwkJCQltaW4gPSBpOworCQkJaWYgKGkgPiBtYXgpCisJCQkJbWF4ID0gaTsKKwkJfQorCX0KKworCWlmIChtYXggPT0gLTEpIHsKKwkJLyogRW1wdHkgc2V0LCB1c2UgJ2JpdCBtYXAgMCBmb3JtYXQnICovCisJCWNoYW5fbGlzdFswXSA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmICgobWF4IC0gbWluKSA+IDExMSkgeworCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIm1pbl9hcmZjbj0ldSwgbWF4X2FyZmNuPSV1LCAiCisJCQkiZGlzdGFuY2UgPiAxMTFcbiIsIG1pbiwgbWF4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2hhbl9saXN0WzBdIHw9IChtaW4gPj4gOSkgJiAxOworCWNoYW5fbGlzdFsxXSA9IChtaW4gPj4gMSk7CisJY2hhbl9saXN0WzJdID0gKG1pbiAmIDEpIDw8IDc7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnYtPmRhdGFfbGVuKjg7IGkrKykgeworCQlpZiAoYml0dmVjX2dldF9iaXRfcG9zKGJ2LCBpKSkgeworCQkJcmMgPSBmcmVxX2xpc3RfYm1yZWxfc2V0X2FyZmNuKGNoYW5fbGlzdCwgaSk7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBnZW5lcmF0ZSBhIGNlbGwgY2hhbm5lbCBsaXN0IGFzIHBlciBTZWN0aW9uIDEwLjUuMi4xYiBvZiAwNC4wOCAqLworc3RhdGljIGludCBnZW5lcmF0ZV9jZWxsX2NoYW5fbGlzdCh1X2ludDhfdCAqY2hhbl9saXN0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBiaXR2ZWMgKmJ2ID0gJmJ0cy0+c2lfY29tbW9uLmNlbGxfYWxsb2M7CisKKwkvKiBmaXJzdCB3ZSBnZW5lcmF0ZSBhIGJpdHZlYyBvZiBhbGwgVFJYIEFSRkNOJ3MgaW4gb3VyIEJUUyAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpCisJCWJpdHZlY19zZXRfYml0X3BvcyhidiwgdHJ4LT5hcmZjbiwgMSk7CisKKwkvKiB0aGVuIHdlIGdlbmVyYXRlIGEgR1NNIDA0LjA4IGZyZXF1ZW5jeSBsaXN0IGZyb20gdGhlIGJpdHZlYyAqLworCXJldHVybiBiaXR2ZWMyZnJlcV9saXN0KGNoYW5fbGlzdCwgYnYsIGJ0cyk7Cit9CisKKy8qIGdlbmVyYXRlIGEgY2VsbCBjaGFubmVsIGxpc3QgYXMgcGVyIFNlY3Rpb24gMTAuNS4yLjFiIG9mIDA0LjA4ICovCitzdGF0aWMgaW50IGdlbmVyYXRlX2JjY2hfY2hhbl9saXN0KHVfaW50OF90ICpjaGFuX2xpc3QsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHMgKmN1cl9idHM7CisJc3RydWN0IGJpdHZlYyAqYnYgPSAmYnRzLT5zaV9jb21tb24ubmVpZ2hfbGlzdDsKKworCS8qIGZpcnN0IHdlIGdlbmVyYXRlIGEgYml0dmVjIG9mIHRoZSBCQ0NIIEFSRkNOJ3MgaW4gb3VyIEJTQyAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1cl9idHMsICZidHMtPm5ldHdvcmstPmJ0c19saXN0LCBsaXN0KSB7CisJCWlmIChjdXJfYnRzID09IGJ0cykKKwkJCWNvbnRpbnVlOworCQliaXR2ZWNfc2V0X2JpdF9wb3MoYnYsIGN1cl9idHMtPmMwLT5hcmZjbiwgMSk7CisJfQorCisJLyogdGhlbiB3ZSBnZW5lcmF0ZSBhIEdTTSAwNC4wOCBmcmVxdWVuY3kgbGlzdCBmcm9tIHRoZSBiaXR2ZWMgKi8KKwlyZXR1cm4gYml0dmVjMmZyZXFfbGlzdChjaGFuX2xpc3QsIGJ2LCBidHMpOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpMSh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMSAqc2kxID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xICopIG91dHB1dDsKKworCW1lbXNldChzaTEsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpMS0+aGVhZGVyLmwyX3BsZW4gPSAoMjEgPDwgMikgfCAxOworCXNpMS0+aGVhZGVyLnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTEtPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2kxLT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT18xOworCisJcmMgPSBnZW5lcmF0ZV9jZWxsX2NoYW5fbGlzdChzaTEtPmNlbGxfY2hhbm5lbF9kZXNjcmlwdGlvbiwgYnRzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlzaTEtPnJhY2hfY29udHJvbCA9IGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbDsKKworCS8qIFNJMSBSZXN0IE9jdGV0cyAoMTAuNS4yLjMyKSwgY29udGFpbnMgTkNIIHBvc2l0aW9uICovCisJcmMgPSByZXN0X29jdGV0c19zaTEoc2kxLT5yZXN0X29jdGV0cywgTlVMTCk7CisJcmV0dXJuIHNpemVvZigqc2kxKSArIHJjOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpMih1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMiAqc2kyID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8yICopIG91dHB1dDsKKworCW1lbXNldChzaTIsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpMi0+aGVhZGVyLmwyX3BsZW4gPSAoMjIgPDwgMikgfCAxOworCXNpMi0+aGVhZGVyLnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTItPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2kyLT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT18yOworCisJcmMgPSBnZW5lcmF0ZV9iY2NoX2NoYW5fbGlzdChzaTItPmJjY2hfZnJlcXVlbmN5X2xpc3QsIGJ0cyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJc2kyLT5uY2NfcGVybWl0dGVkID0gYnRzLT5zaV9jb21tb24ubmNjX3Blcm1pdHRlZDsKKwlzaTItPnJhY2hfY29udHJvbCA9IGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbDsKKworCXJldHVybiBzaXplb2YoKnNpMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyBzaV9pbmZvID0geworCS5zZWxlY3Rpb25fcGFyYW1zID0geworCQkucHJlc2VudCA9IDAsCisJfSwKKwkucG93ZXJfb2Zmc2V0ID0geworCQkucHJlc2VudCA9IDAsCisJfSwKKwkuc2kydGVyX2luZGljYXRvciA9IDAsCisJLmVhcmx5X2NtX2N0cmwgPSAxLAorCS5zY2hlZHVsaW5nID0geworCQkucHJlc2VudCA9IDAsCisJfSwKKwkuZ3Byc19pbmQgPSB7CisJCS5zaTEzX3Bvc2l0aW9uID0gMCwKKwkJLnJhX2NvbG91ciA9IDAsCisJCS5wcmVzZW50ID0gMSwKKwl9LAorCS5sc2FfcGFyYW1zID0geworCQkucHJlc2VudCA9IDAsCisJfSwKKwkuY2VsbF9pZCA9IDAsCS8qIEZJWE1FOiBkb2Vzbid0IHRoZSBidHMgaGF2ZSB0aGlzPyAqLworCS5icmVha19pbmQgPSAwLAorfTsKKworc3RhdGljIGludCBnZW5lcmF0ZV9zaTModV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzMgKnNpMyA9CisJCShzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMyAqKSBvdXRwdXQ7CisKKwltZW1zZXQoc2kzLCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwlzaTMtPmhlYWRlci5sMl9wbGVuID0gKDE4IDw8IDIpIHwgMTsKKwlzaTMtPmhlYWRlci5ycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yID0gR1NNNDhfUERJU0NfUlI7CisJc2kzLT5oZWFkZXIuc2tpcF9pbmRpY2F0b3IgPSAwOworCXNpMy0+aGVhZGVyLnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fMzsKKworCXNpMy0+Y2VsbF9pZGVudGl0eSA9IGh0b25zKGJ0cy0+Y2VsbF9pZGVudGl0eSk7CisJZ3NtNDhfZ2VuZXJhdGVfbGFpKCZzaTMtPmxhaSwgYnRzLT5uZXR3b3JrLT5jb3VudHJ5X2NvZGUsCisJCQkgICBidHMtPm5ldHdvcmstPm5ldHdvcmtfY29kZSwKKwkJCSAgIGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlKTsKKwlzaTMtPmNvbnRyb2xfY2hhbm5lbF9kZXNjID0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjOworCXNpMy0+Y2VsbF9vcHRpb25zID0gYnRzLT5zaV9jb21tb24uY2VsbF9vcHRpb25zOworCXNpMy0+Y2VsbF9zZWxfcGFyID0gYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyOworCXNpMy0+cmFjaF9jb250cm9sID0gYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sOworCisJLyogU0kzIFJlc3QgT2N0ZXRzICgxMC41LjIuMzQpLCBjb250YWluaW5nCisJCUNCUSwgQ0VMTF9SRVNFTEVDVF9PRkZTRVQsIFRFTVBPUkFSWV9PRkZTRVQsIFBFTkFMVFlfVElNRQorCQlQb3dlciBPZmZzZXQsIDJ0ZXIgSW5kaWNhdG9yLCBFYXJseSBDbGFzc21hcmsgU2VuZGluZywKKwkJU2NoZWR1bGluZyBpZiBhbmQgV0hFUkUsIEdQUlMgSW5kaWNhdG9yLCBTSTEzIHBvc2l0aW9uICovCisJcmMgPSByZXN0X29jdGV0c19zaTMoc2kzLT5yZXN0X29jdGV0cywgJnNpX2luZm8pOworCisJcmV0dXJuIHNpemVvZigqc2kzKSArIHJjOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpNCh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNCAqc2k0ID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV80ICopIG91dHB1dDsKKworCS8qIGxlbmd0aCBvZiBhbGwgSUVzIHByZXNlbnQgZXhjZXB0IFNJNCByZXN0IG9jdGV0cyBhbmQgbDJfcGxlbiAqLworCWludCBsMl9wbGVuID0gc2l6ZW9mKCpzaTQpIC0gMTsKKworCW1lbXNldChzaTQsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpNC0+aGVhZGVyLnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTQtPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2k0LT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT180OworCisJZ3NtNDhfZ2VuZXJhdGVfbGFpKCZzaTQtPmxhaSwgYnRzLT5uZXR3b3JrLT5jb3VudHJ5X2NvZGUsCisJCQkgICBidHMtPm5ldHdvcmstPm5ldHdvcmtfY29kZSwKKwkJCSAgIGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlKTsKKwlzaTQtPmNlbGxfc2VsX3BhciA9IGJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3BhcjsKKwlzaTQtPnJhY2hfY29udHJvbCA9IGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbDsKKworCS8qIE9wdGlvbmFsOiBDQkNIIENoYW5uZWwgRGVzY3JpcHRpb24gKyBDQkNIIE1vYmlsZSBBbGxvY2F0aW9uICovCisKKwlzaTQtPmhlYWRlci5sMl9wbGVuID0gKGwyX3BsZW4gPDwgMikgfCAxOworCisJLyogU0k0IFJlc3QgT2N0ZXRzICgxMC41LjIuMzUpLCBjb250YWluaW5nCisJCU9wdGlvbmFsIFBvd2VyIG9mZnNldCwgR1BSUyBJbmRpY2F0b3IsCisJCUNlbGwgSWRlbnRpdHksIExTQSBJRCwgU2VsZWN0aW9uIFBhcmFtZXRlciAqLworCXJjID0gcmVzdF9vY3RldHNfc2k0KHNpNC0+ZGF0YSwgJnNpX2luZm8pOworCisJcmV0dXJuIHNpemVvZigqc2k0KSArIHJjOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpNSh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV81ICpzaTU7CisJaW50IHJjLCBsMl9wbGVuID0gMTg7CisKKwltZW1zZXQob3V0cHV0LCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwkvKiBpcC5hY2Nlc3MgbmFub0JUUyBuZWVkcyBsMl9wbGVuISEgKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJKm91dHB1dCsrID0gKGwyX3BsZW4gPDwgMikgfCAxOworCQlsMl9wbGVuKys7CisJfQorCisJc2k1ID0gKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV81ICopIG91dHB1dDsKKworCS8qIGwyIHBzZXVkbyBsZW5ndGgsIG5vdCBwYXJ0IG9mIG1zZzogMTggKi8KKwlzaTUtPnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTUtPnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTUtPnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fNTsKKwlyYyA9IGdlbmVyYXRlX2JjY2hfY2hhbl9saXN0KHNpNS0+YmNjaF9mcmVxdWVuY3lfbGlzdCwgYnRzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiAwNC4wOCA5LjEuMzc6IEwyIFBzZXVkbyBMZW5ndGggb2YgMTggKi8KKwlyZXR1cm4gbDJfcGxlbjsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9zaTYodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNiAqc2k2OworCWludCBsMl9wbGVuID0gMTE7CisKKwltZW1zZXQob3V0cHV0LCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwkvKiBpcC5hY2Nlc3MgbmFub0JUUyBuZWVkcyBsMl9wbGVuISEgKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJKm91dHB1dCsrID0gKGwyX3BsZW4gPDwgMikgfCAxOworCQlsMl9wbGVuKys7CisJfQorCisJc2k2ID0gKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV82ICopIG91dHB1dDsKKworCS8qIGwyIHBzZXVkbyBsZW5ndGgsIG5vdCBwYXJ0IG9mIG1zZzogMTEgKi8KKwlzaTYtPnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTYtPnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTYtPnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fNjsKKwlzaTYtPmNlbGxfaWRlbnRpdHkgPSBodG9ucyhidHMtPmNlbGxfaWRlbnRpdHkpOworCWdzbTQ4X2dlbmVyYXRlX2xhaSgmc2k2LT5sYWksIGJ0cy0+bmV0d29yay0+Y291bnRyeV9jb2RlLAorCQkJICAgYnRzLT5uZXR3b3JrLT5uZXR3b3JrX2NvZGUsCisJCQkgICBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSk7CisJc2k2LT5jZWxsX29wdGlvbnMgPSBidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnM7CisJc2k2LT5uY2NfcGVybWl0dGVkID0gYnRzLT5zaV9jb21tb24ubmNjX3Blcm1pdHRlZDsKKworCS8qIFNJNiBSZXN0IE9jdGV0czogMTAuNS4yLjM1YTogUENIIC8gTkNIIGluZm8sIFZCUy9WR0NTIG9wdGlvbnMgKi8KKworCXJldHVybiBsMl9wbGVuOworfQorCitzdGF0aWMgc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyBzaTEzX2RlZmF1bHQgPSB7CisJLmNlbGxfb3B0cyA9IHsKKwkJLm5tbyAJCT0gR1BSU19OTU9fSUlJLAorCQkudDMxNjgJCT0gMTUwMCwKKwkJLnQzMTkyCQk9IDUwMCwKKwkJLmRyeF90aW1lcl9tYXgJPSAzLAorCQkuYnNfY3ZfbWF4CT0gMTUsCisJCS5leHRfaW5mb19wcmVzZW50ID0gMCwKKwkJLmV4dF9pbmZvID0geworCQkJLyogVGhlIHZhbHVlcyBiZWxvdyBhcmUganVzdCBndWVzc2VzICEgKi8KKwkJCS5lZ3Byc19zdXBwb3J0ZWQgPSAwLAorCQkJLnVzZV9lZ3Byc19wX2NoX3JlcSA9IDEsCisJCQkuYmVwX3BlcmlvZCA9IDQsCisJCQkucGZjX3N1cHBvcnRlZCA9IDAsCisJCQkuZHRtX3N1cHBvcnRlZCA9IDAsCisJCQkuYnNzX3BhZ2luZ19jb29yZGluYXRpb24gPSAwLAorCQl9LAorCX0sCisJLnB3cl9jdHJsX3BhcnMgPSB7CisJCS5hbHBoYQkJPSAxMCwJLyogYSA9IDEuMCAqLworCQkudF9hdmdfdwk9IDI1LAorCQkudF9hdmdfdAk9IDI1LAorCQkucGNfbWVhc19jaGFuCT0gMCwgCS8qIGRvd25saW5nIG1lYXN1cmVkIG9uIENDQ0ggKi8KKwkJLm5fYXZnX2kJPSAxNSwKKwl9LAorCS5iY2NoX2NoYW5nZV9tYXJrCT0gMSwKKwkuc2lfY2hhbmdlX2ZpZWxkCT0gMCwKKwkucGJjY2hfcHJlc2VudAkJPSAwLAorCXsKKwkJLm5vX3BiY2NoID0geworCQkJLnJhYwkJPSAwLAkvKiBuZWVkcyB0byBiZSBwYXRjaGVkICovCisJCQkuc3BnY19jY2NoX3N1cCAJPSAwLAorCQkJLm5ldF9jdHJsX29yZAk9IDAsCisJCQkucHJpb19hY2NfdGhyCT0gNiwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGludCBnZW5lcmF0ZV9zaTEzKHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEzICpzaTEzID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xMyAqKSBvdXRwdXQ7CisJaW50IHJldDsKKworCW1lbXNldChzaTEzLCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwlzaTEzLT5oZWFkZXIucnJfcHJvdG9jb2xfZGlzY3JpbWluYXRvciA9IEdTTTQ4X1BESVNDX1JSOworCXNpMTMtPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2kxMy0+aGVhZGVyLnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fMTM7CisKKwlzaTEzX2RlZmF1bHQubm9fcGJjY2gucmFjID0gYnRzLT5ncHJzLnJhYzsKKworCXJldCA9IHJlc3Rfb2N0ZXRzX3NpMTMoc2kxMy0+cmVzdF9vY3RldHMsICZzaTEzX2RlZmF1bHQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc2kxMy0+aGVhZGVyLmwyX3BsZW4gPSByZXQgJiAweGZmOworCisJcmV0dXJuIHNpemVvZiAoKnNpMTMpICsgcmV0OworfQorCitpbnQgZ3NtX2dlbmVyYXRlX3NpKHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMsIGludCB0eXBlKQoreworCXN3aXRjaCAoYnRzLT5ncHJzLm1vZGUpIHsKKwljYXNlIEJUU19HUFJTX0VHUFJTOgorCQlzaTEzX2RlZmF1bHQuY2VsbF9vcHRzLmV4dF9pbmZvX3ByZXNlbnQgPSAxOworCQlzaTEzX2RlZmF1bHQuY2VsbF9vcHRzLmV4dF9pbmZvLmVncHJzX3N1cHBvcnRlZCA9IDE7CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBCVFNfR1BSU19HUFJTOgorCQlzaV9pbmZvLmdwcnNfaW5kLnByZXNlbnQgPSAxOworCQlicmVhazsKKwljYXNlIEJUU19HUFJTX05PTkU6CisJCXNpX2luZm8uZ3Byc19pbmQucHJlc2VudCA9IDA7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzE6CisJCXJldHVybiBnZW5lcmF0ZV9zaTEob3V0cHV0LCBidHMpOworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzI6CisJCXJldHVybiBnZW5lcmF0ZV9zaTIob3V0cHV0LCBidHMpOworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzM6CisJCXJldHVybiBnZW5lcmF0ZV9zaTMob3V0cHV0LCBidHMpOworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzQ6CisJCXJldHVybiBnZW5lcmF0ZV9zaTQob3V0cHV0LCBidHMpOworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzU6CisJCXJldHVybiBnZW5lcmF0ZV9zaTUob3V0cHV0LCBidHMpOworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzY6CisJCXJldHVybiBnZW5lcmF0ZV9zaTYob3V0cHV0LCBidHMpOworCWNhc2UgUlNMX1NZU1RFTV9JTkZPXzEzOgorCQlyZXR1cm4gZ2VuZXJhdGVfc2kxMyhvdXRwdXQsIGJ0cyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90YWxsb2NfY3R4LmMgYi9vcGVuYnNjL3NyYy90YWxsb2NfY3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzNzNiNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3RhbGxvY19jdHguYwpAQCAtMCwwICsxLDM2IEBACisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorCitleHRlcm4gdm9pZCAqdGFsbF9tc2diX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX2ZsZV9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9sb2NvcF9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9nc21zX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3N1YnNjcl9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9zdWJfcmVxX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX2NhbGxfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfcGFnaW5nX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3NpZ2hfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfdHFlX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3RyYW5zX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX21hcF9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF91cHFfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfY3RyX2N0eDsKKwordm9pZCB0YWxsb2NfY3R4X2luaXQodm9pZCkKK3sKKwl0YWxsX21zZ2JfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgIm1zZ2IiKTsKKwl0YWxsX2ZsZV9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLAorCQkJCQkgICJiczExX2ZpbGVfbGlzdF9lbnRyeSIpOworCXRhbGxfbG9jb3BfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgImxvY191cGRhdGluZ19vcGVyIik7CisJdGFsbF9nc21zX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzbXMiKTsKKwl0YWxsX3N1YnNjcl9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAic3Vic2NyaWJlciIpOworCXRhbGxfc3ViX3JlcV9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAic3Vic2NyX3JlcXVlc3QiKTsKKwl0YWxsX2NhbGxfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgImdzbV9jYWxsIik7CisJdGFsbF9wYWdpbmdfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInBhZ2luZ19yZXF1ZXN0Iik7CisJdGFsbF9zaWdoX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzaWduYWxfaGFuZGxlciIpOworCXRhbGxfdHFlX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzdWJjaF90eHFfZW50cnkiKTsKKwl0YWxsX3RyYW5zX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJ0cmFuc2FjdGlvbiIpOworCXRhbGxfbWFwX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJ0cmF1X21hcF9lbnRyeSIpOworCXRhbGxfdXBxX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJ0cmF1X3VwcV9lbnRyeSIpOworCXRhbGxfY3RyX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJjb3VudGVyIik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90ZWxuZXRfaW50ZXJmYWNlLmMgYi9vcGVuYnNjL3NyYy90ZWxuZXRfaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZTAyNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3RlbG5ldF9pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDIwOSBAQAorLyogbWluaW1hbGlzdGljIHRlbG5ldC9uZXR3b3JrIGludGVyZmFjZSBpdCBtaWdodCB0dXJuIGludG8gYSB3aXJlIGludGVyZmFjZSAqLworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KKworI2RlZmluZSBXUklURV9DT05ORUNUSU9OKGZkLCBtc2cuLi4pIFwKKwlpbnQgcmV0OyBcCisJY2hhciBidWZbNDA5Nl07IFwKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBtc2cpOyBcCisJcmV0ID0gd3JpdGUoZmQsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCisKKy8qIHBlciBjb25uZWN0aW9uIGRhdGEgKi8KK0xMSVNUX0hFQUQoYWN0aXZlX2Nvbm5lY3Rpb25zKTsKKworc3RhdGljIHZvaWQgKnRhbGxfdGVsbmV0X2N0eDsKKworLyogcGVyIG5ldHdvcmsgZGF0YSAqLworc3RhdGljIGludCB0ZWxuZXRfbmV3X2Nvbm5lY3Rpb24oc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KTsKKworc3RhdGljIHN0cnVjdCBic2NfZmQgc2VydmVyX3NvY2tldCA9IHsKKwkud2hlbgkgICAgPSBCU0NfRkRfUkVBRCwKKwkuY2IJICAgID0gdGVsbmV0X25ld19jb25uZWN0aW9uLAorCS5wcml2X25yICAgID0gMCwKK307CisKK3ZvaWQgdGVsbmV0X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrLCBpbnQgcG9ydCkgeworCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrX2FkZHI7CisJaW50IGZkLCBvbiA9IDE7CisKKwl0YWxsX3RlbG5ldF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAxLAorCQkJCQkgICAgICJ0ZWxuZXRfY29ubmVjdGlvbiIpOworCisJYnNjX3Z0eV9pbml0KG5ldHdvcmspOworCisJZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKworCWlmIChmZCA8IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUZWxuZXQgaW50ZXJmYWNlIHNvY2tldCBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJbWVtc2V0KCZzb2NrX2FkZHIsIDAsIHNpemVvZihzb2NrX2FkZHIpKTsKKwlzb2NrX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc29ja19hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJc29ja19hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7CisKKwlpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvY2tfYWRkciwgc2l6ZW9mKHNvY2tfYWRkcikpIDwgMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRlbG5ldCBpbnRlcmZhY2UgZmFpbGVkIHRvIGJpbmRcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGxpc3RlbihmZCwgMCkgPCAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVGVsbmV0IGludGVyZmFjZSBmYWlsZWQgdG8gbGlzdGVuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNlcnZlcl9zb2NrZXQuZGF0YSA9IG5ldHdvcms7CisJc2VydmVyX3NvY2tldC5mZCA9IGZkOworCWJzY19yZWdpc3Rlcl9mZCgmc2VydmVyX3NvY2tldCk7Cit9CisKK2V4dGVybiBjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodDsKK2V4dGVybiBjb25zdCBjaGFyICpvcGVuYnNjX3ZlcnNpb247CisKK3N0YXRpYyB2b2lkIHByaW50X3dlbGNvbWUoaW50IGZkKSB7CisJaW50IHJldDsKKwlzdGF0aWMgY2hhciAqbXNnID0KKwkJIldlbGNvbWUgdG8gdGhlIE9wZW5CU0MgQ29udHJvbCBpbnRlcmZhY2VcbiI7CisKKwlyZXQgPSB3cml0ZShmZCwgbXNnLCBzdHJsZW4obXNnKSk7CisJcmV0ID0gd3JpdGUoZmQsIG9wZW5ic2NfY29weXJpZ2h0LCBzdHJsZW4ob3BlbmJzY19jb3B5cmlnaHQpKTsKK30KKworaW50IHRlbG5ldF9jbG9zZV9jbGllbnQoc3RydWN0IGJzY19mZCAqZmQpIHsKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uKilmZC0+ZGF0YTsKKworCWNsb3NlKGZkLT5mZCk7CisJYnNjX3VucmVnaXN0ZXJfZmQoZmQpOworCisJaWYgKGNvbm4tPmRiZykgeworCQlsb2dfZGVsX3RhcmdldChjb25uLT5kYmcpOworCQl0YWxsb2NfZnJlZShjb25uLT5kYmcpOworCX0KKworCWxsaXN0X2RlbCgmY29ubi0+ZW50cnkpOworCXRhbGxvY19mcmVlKGNvbm4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsaWVudF9kYXRhKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm4gPSBmZC0+ZGF0YTsKKwlpbnQgcmMgPSAwOworCisJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkgeworCQljb25uLT5mZC53aGVuICY9IH5CU0NfRkRfUkVBRDsKKwkJcmMgPSB2dHlfcmVhZChjb25uLT52dHkpOworCX0KKworCS8qIHZ0eSBtaWdodCBoYXZlIGJlZW4gY2xvc2VkIGZyb20gdml0aGluIHZ0eV9yZWFkKCkgKi8KKwlpZiAoIWNvbm4tPnZ0eSkKKwkJcmV0dXJuIHJjOworCisJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpIHsKKwkJcmMgPSBidWZmZXJfZmx1c2hfYWxsKGNvbm4tPnZ0eS0+b2J1ZiwgZmQtPmZkKTsKKwkJaWYgKHJjID09IEJVRkZFUl9FTVBUWSkKKwkJCWNvbm4tPmZkLndoZW4gJj0gfkJTQ19GRF9XUklURTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdGVsbmV0X25ld19jb25uZWN0aW9uKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkgeworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja2FkZHI7CisJc29ja2xlbl90IGxlbiA9IHNpemVvZihzb2NrYWRkcik7CisJaW50IG5ld19jb25uZWN0aW9uID0gYWNjZXB0KGZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvY2thZGRyLCAmbGVuKTsKKworCWlmIChuZXdfY29ubmVjdGlvbiA8IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJ0ZWxuZXQgYWNjZXB0IGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKworCWNvbm5lY3Rpb24gPSB0YWxsb2NfemVybyh0YWxsX3RlbG5ldF9jdHgsIHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbik7CisJY29ubmVjdGlvbi0+bmV0d29yayA9IChzdHJ1Y3QgZ3NtX25ldHdvcmsqKWZkLT5kYXRhOworCWNvbm5lY3Rpb24tPmZkLmRhdGEgPSBjb25uZWN0aW9uOworCWNvbm5lY3Rpb24tPmZkLmZkID0gbmV3X2Nvbm5lY3Rpb247CisJY29ubmVjdGlvbi0+ZmQud2hlbiA9IEJTQ19GRF9SRUFEOworCWNvbm5lY3Rpb24tPmZkLmNiID0gY2xpZW50X2RhdGE7CisJYnNjX3JlZ2lzdGVyX2ZkKCZjb25uZWN0aW9uLT5mZCk7CisJbGxpc3RfYWRkX3RhaWwoJmNvbm5lY3Rpb24tPmVudHJ5LCAmYWN0aXZlX2Nvbm5lY3Rpb25zKTsKKworCXByaW50X3dlbGNvbWUobmV3X2Nvbm5lY3Rpb24pOworCisJY29ubmVjdGlvbi0+dnR5ID0gdnR5X2NyZWF0ZShuZXdfY29ubmVjdGlvbiwgY29ubmVjdGlvbik7CisJaWYgKCFjb25uZWN0aW9uLT52dHkpIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJjb3VsZG4ndCBjcmVhdGUgVlRZXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKiBjYWxsYmFjayBmcm9tIFZUWSBjb2RlICovCit2b2lkIHZ0eV9ldmVudChlbnVtIGV2ZW50IGV2ZW50LCBpbnQgc29jaywgc3RydWN0IHZ0eSAqdnR5KQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHZ0eS0+cHJpdjsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSAmY29ubmVjdGlvbi0+ZmQ7CisKKwlpZiAodnR5LT50eXBlICE9IFZUWV9URVJNKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBWVFlfUkVBRDoKKwkJYmZkLT53aGVuIHw9IEJTQ19GRF9SRUFEOworCQlicmVhazsKKwljYXNlIFZUWV9XUklURToKKwkJYmZkLT53aGVuIHw9IEJTQ19GRF9XUklURTsKKwkJYnJlYWs7CisJY2FzZSBWVFlfQ0xPU0VEOgorCQkvKiB2dHkgbGF5ZXIgaXMgYWJvdXQgdG8gZnJlZSgpIHZ0eSAqLworCQljb25uZWN0aW9uLT52dHkgPSBOVUxMOworCQl0ZWxuZXRfY2xvc2VfY2xpZW50KGJmZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdG9rZW5fYXV0aC5jIGIvb3BlbmJzYy9zcmMvdG9rZW5fYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZWZlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy90b2tlbl9hdXRoLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qIFNNUyBiYXNlZCB0b2tlbiBhdXRoZW50aWNhdGlvbiBmb3IgYWQtaG9jIEdTTSBuZXR3b3JrcyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKworI2RlZmluZSBUT0tFTl9TTVNfVEVYVCAiSEFSIDIwMDkgR1NNLiAgUmVnaXN0ZXIgYXQgaHR0cDovL2hhcjIwMDkuZ251bW9ua3Mub3JnLyAiIFwKKwkJCSJZb3VyIElNU0kgaXMgJXMsIGF1dGggdG9rZW4gaXMgJTA4WCwgcGhvbmUgbm8gaXMgJXMuIgorCitleHRlcm4gc3RydWN0IGdzbV9zbXMgKnNtc19mcm9tX3RleHQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnRleHQpOworCitzdGF0aWMgY2hhciAqYnVpbGRfc21zX3N0cmluZyhzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwgdV9pbnQzMl90IHRva2VuKQoreworCWNoYXIgKnNtc19zdHI7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWxlbiA9IHN0cmxlbihzdWJzY3ItPmltc2kpICsgOCArIHN0cmxlbihUT0tFTl9TTVNfVEVYVCk7CisJc21zX3N0ciA9IHRhbGxvY19zaXplKHRhbGxfYnNjX2N0eCwgbGVuKTsKKwlpZiAoIXNtc19zdHIpCisJCXJldHVybiBOVUxMOworCisJc25wcmludGYoc21zX3N0ciwgbGVuLCBUT0tFTl9TTVNfVEVYVCwgc3Vic2NyLT5pbXNpLCB0b2tlbiwKKwkJIHN1YnNjci0+ZXh0ZW5zaW9uKTsKKwlzbXNfc3RyW2xlbi0xXSA9ICdcMCc7CisKKwlyZXR1cm4gc21zX3N0cjsKK30KKworc3RhdGljIGludCB0b2tlbl9zdWJzY3JfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCXZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBzaWduYWxfZGF0YTsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCWludCByYyA9IDA7CisKKwlpZiAoc2lnbmFsICE9IFNfU1VCU0NSX0FUVEFDSEVEKQorCQlyZXR1cm4gMDsKKworCWlmIChzdWJzY3ItPm5ldC0+YXV0aF9wb2xpY3kgIT0gR1NNX0FVVEhfUE9MSUNZX1RPS0VOKQorCQlyZXR1cm4gMDsKKworCWlmIChzdWJzY3ItPmZsYWdzICYgR1NNX1NVQlNDUklCRVJfRklSU1RfQ09OVEFDVCkgeworCQl1X2ludDMyX3QgdG9rZW47CisJCWNoYXIgKnNtc19zdHI7CisKKwkJLyogd2UndmUgc2VlbiB0aGlzIHN1YnNjcmliZXIgZm9yIHRoZSBmaXJzdCB0aW1lLiAqLworCQlyYyA9IGRiX3N1YnNjcmliZXJfYWxsb2NfdG9rZW4oc3Vic2NyLCAmdG9rZW4pOworCQlpZiAocmMgIT0gMCkgeworCQkJcmMgPSAtRUlPOworCQkJZ290byB1bmF1dGg7CisJCX0KKworCQlzbXNfc3RyID0gYnVpbGRfc21zX3N0cmluZyhzdWJzY3IsIHRva2VuKTsKKwkJaWYgKCFzbXNfc3RyKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIHVuYXV0aDsKKwkJfQorCisJCXNtcyA9IHNtc19mcm9tX3RleHQoc3Vic2NyLCBzbXNfc3RyKTsKKwkJdGFsbG9jX2ZyZWUoc21zX3N0cik7CisJCWlmICghc21zKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIHVuYXV0aDsKKwkJfQorCisJCXJjID0gZ3NtNDExX3NlbmRfc21zX3N1YnNjcihzdWJzY3IsIHNtcyk7CisKKwkJLyogRklYTUU6IGVsc2UsIGRlbGV0ZSB0aGUgc3Vic2NpcmJlciBmcm9tIGRhdGFiYXNlICovCit1bmF1dGg6CisKKwkJLyogbWFrZSBzdXJlIHdlIGRvbid0IGFsbG93IGhpbSBpbiBhZ2FpbiB1bmxlc3MgaGUgY2xpY2tzIHRoZSB3ZWIgVUkgKi8KKwkJc3Vic2NyLT5hdXRob3JpemVkID0gMDsKKwkJZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcik7CisJCWlmIChyYykgeworCQkJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisJCQlpZiAobGNoYW4pIHsKKwkJCQl1X2ludDhfdCBhdXRoX3JhbmRbMTZdOworCQkJCS8qIGtpY2sgdGhlIHN1YnNjcmliZXIgb2ZmIHRoZSBuZXR3b3JrICovCisJCQkJZ3NtNDhfdHhfbW1fYXV0aF9yZXEobGNoYW4sIGF1dGhfcmFuZCwgMCk7CisJCQkJZ3NtNDhfdHhfbW1fYXV0aF9yZWoobGNoYW4pOworCQkJCS8qIEZJWE1FOiBjbG9zZSB0aGUgY2hhbm5lbCBlYXJseSA/Ki8KKwkJCQkvL2dzbTQ4X3NlbmRfcnJfUmVsZWFzZShsY2hhbik7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdG9rZW5fc21zX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQl2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBnc21fc21zICpzbXMgPSBzaWduYWxfZGF0YTsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCBhdXRoX3JhbmRbMTZdOworCisKKwlpZiAoc2lnbmFsICE9IFNfU01TX0RFTElWRVJFRCkKKwkJcmV0dXJuIDA7CisKKworCS8qIHRoZXNlIGFyZSBub3QgdGhlIGRyb2lkcyB3ZSd2ZSBiZWVuIGxvb2tpbmcgZm9yICovCisJaWYgKCFzbXMtPnJlY2VpdmVyIHx8CisJICAgICEoc21zLT5yZWNlaXZlci0+ZmxhZ3MgJiBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUKSkKKwkJcmV0dXJuIDA7CisKKworCWlmIChzbXMtPnJlY2VpdmVyLT5uZXQtPmF1dGhfcG9saWN5ICE9IEdTTV9BVVRIX1BPTElDWV9UT0tFTikKKwkJcmV0dXJuIDA7CisKKworCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzbXMtPnJlY2VpdmVyKTsKKwlpZiAobGNoYW4pIHsKKwkJLyoga2ljayB0aGUgc3Vic2NyaWJlciBvZmYgdGhlIG5ldHdvcmsgKi8KKwkJZ3NtNDhfdHhfbW1fYXV0aF9yZXEobGNoYW4sIGF1dGhfcmFuZCwgMCk7CisJCWdzbTQ4X3R4X21tX2F1dGhfcmVqKGxjaGFuKTsKKwkJLyogRklYTUU6IGNsb3NlIHRoZSBjaGFubmVsIGVhcmx5ID8qLworCQkvL2dzbTQ4X3NlbmRfcnJfUmVsZWFzZShsY2hhbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8vc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF90b2tlbih2b2lkKQordm9pZCBvbl9kc29fbG9hZF90b2tlbih2b2lkKQoreworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NVQlNDUiwgdG9rZW5fc3Vic2NyX2NiLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19TTVMsIHRva2VuX3Ntc19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90cmFuc2FjdGlvbi5jIGIvb3BlbmJzYy9zcmMvdHJhbnNhY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTBkNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdHJhbnNhY3Rpb24uYwpAQCAtMCwwICsxLDE3MiBAQAorLyogR1NNIDA0LjA3IFRyYW5zYWN0aW9uIGhhbmRsaW5nICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tbmNjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbW5jYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisKK3ZvaWQgKnRhbGxfdHJhbnNfY3R4OworCit2b2lkIF9nc200OF9jY190cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKTsKKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfZmluZF9ieV9pZChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCQkgICB1X2ludDhfdCBwcm90bywgdV9pbnQ4X3QgdHJhbnNfaWQpCit7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBzdWJzY3ItPm5ldDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zLCAmbmV0LT50cmFuc19saXN0LCBlbnRyeSkgeworCQlpZiAodHJhbnMtPnN1YnNjciA9PSBzdWJzY3IgJiYKKwkJICAgIHRyYW5zLT5wcm90b2NvbCA9PSBwcm90byAmJgorCQkgICAgdHJhbnMtPnRyYW5zYWN0aW9uX2lkID09IHRyYW5zX2lkKQorCQkJcmV0dXJuIHRyYW5zOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfZmluZF9ieV9jYWxscmVmKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQl1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zLCAmbmV0LT50cmFuc19saXN0LCBlbnRyeSkgeworCQlpZiAodHJhbnMtPmNhbGxyZWYgPT0gY2FsbHJlZikKKwkJCXJldHVybiB0cmFuczsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBnc21fdHJhbnMgKnRyYW5zX2FsbG9jKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICAgICAgdV9pbnQ4X3QgcHJvdG9jb2wsIHVfaW50OF90IHRyYW5zX2lkLAorCQkJICAgICAgdV9pbnQzMl90IGNhbGxyZWYpCit7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisKKwlERUJVR1AoRENDLCAic3Vic2NyPSVwLCBzdWJzY3ItPm5ldD0lcFxuIiwgc3Vic2NyLCBzdWJzY3ItPm5ldCk7CisKKwl0cmFucyA9IHRhbGxvY196ZXJvKHRhbGxfdHJhbnNfY3R4LCBzdHJ1Y3QgZ3NtX3RyYW5zKTsKKwlpZiAoIXRyYW5zKQorCQlyZXR1cm4gTlVMTDsKKworCXRyYW5zLT5zdWJzY3IgPSBzdWJzY3I7CisJc3Vic2NyX2dldCh0cmFucy0+c3Vic2NyKTsKKworCXRyYW5zLT5wcm90b2NvbCA9IHByb3RvY29sOworCXRyYW5zLT50cmFuc2FjdGlvbl9pZCA9IHRyYW5zX2lkOworCXRyYW5zLT5jYWxscmVmID0gY2FsbHJlZjsKKworCWxsaXN0X2FkZF90YWlsKCZ0cmFucy0+ZW50cnksICZzdWJzY3ItPm5ldC0+dHJhbnNfbGlzdCk7CisKKwlyZXR1cm4gdHJhbnM7Cit9CisKK3ZvaWQgdHJhbnNfZnJlZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlzd2l0Y2ggKHRyYW5zLT5wcm90b2NvbCkgeworCWNhc2UgR1NNNDhfUERJU0NfQ0M6CisJCV9nc200OF9jY190cmFuc19mcmVlKHRyYW5zKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19TTVM6CisJCV9nc200MTFfc21zX3RyYW5zX2ZyZWUodHJhbnMpOworCQlicmVhazsKKwl9CisKKwlpZiAodHJhbnMtPmNvbm4pCisJCXB1dF9zdWJzY3JfY29uKHRyYW5zLT5jb25uKTsKKworCWlmICghdHJhbnMtPmNvbm4gJiYgdHJhbnMtPnN1YnNjciAmJiB0cmFucy0+c3Vic2NyLT5uZXQpIHsKKwkJLyogU3RvcCBwYWdpbmcgb24gYWxsIGJ0cycgKi8KKwkJcGFnaW5nX3JlcXVlc3Rfc3RvcChOVUxMLCB0cmFucy0+c3Vic2NyLCBOVUxMKTsKKwl9CisKKwlpZiAodHJhbnMtPnN1YnNjcikKKwkJc3Vic2NyX3B1dCh0cmFucy0+c3Vic2NyKTsKKworCWxsaXN0X2RlbCgmdHJhbnMtPmVudHJ5KTsKKworCXRhbGxvY19mcmVlKHRyYW5zKTsKK30KKworLyogYWxsb2NhdGUgYW4gdW51c2VkIHRyYW5zYWN0aW9uIElEIGZvciB0aGUgZ2l2ZW4gc3Vic2NyaWJlcgorICogaW4gdGhlIGdpdmVuIHByb3RvY29sIHVzaW5nIHRoZSB0aV9mbGFnIHNwZWNpZmllZCAqLworaW50IHRyYW5zX2Fzc2lnbl90cmFuc19pZChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSAgdV9pbnQ4X3QgcHJvdG9jb2wsIHVfaW50OF90IHRpX2ZsYWcpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBzdWJzY3ItPm5ldDsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwl1bnNpZ25lZCBpbnQgdXNlZF90aWRfYml0bWFzayA9IDA7CisJaW50IGksIGosIGg7CisKKwlpZiAodGlfZmxhZykKKwkJdGlfZmxhZyA9IDB4ODsKKworCS8qIGdlbmVyYXRlIGJpdG1hc2sgb2YgYWxyZWFkeS11c2VkIFRJRHMgZm9yIHRoaXMgKHN1YnNjcixwcm90bykgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJaWYgKHRyYW5zLT5zdWJzY3IgIT0gc3Vic2NyIHx8CisJCSAgICB0cmFucy0+cHJvdG9jb2wgIT0gcHJvdG9jb2wgfHwKKwkJICAgIHRyYW5zLT50cmFuc2FjdGlvbl9pZCA9PSAweGZmKQorCQkJY29udGludWU7CisJCXVzZWRfdGlkX2JpdG1hc2sgfD0gKDEgPDwgdHJhbnMtPnRyYW5zYWN0aW9uX2lkKTsKKwl9CisKKwkvKiBmaW5kIGEgbmV3IG9uZSwgdHJ5aW5nIHRvIGdvIGluIGEgJ2NpcmN1bGFyJyBwYXR0ZXJuICovCisJZm9yIChoID0gNjsgaCA+IDA7IGgtLSkKKwkJaWYgKHVzZWRfdGlkX2JpdG1hc2sgJiAoMSA8PCAoaCB8IHRpX2ZsYWcpKSkKKwkJCWJyZWFrOworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJaiA9ICgoaCArIGkpICUgNykgfCB0aV9mbGFnOworCQlpZiAoKHVzZWRfdGlkX2JpdG1hc2sgJiAoMSA8PCBqKSkgPT0gMCkKKwkJCXJldHVybiBqOworCX0KKworCXJldHVybiAtMTsKK30KKworLyogdXBkYXRlIGFsbCB0cmFuc2FjdGlvbnMgdG8gdXNlIGEgZGlmZmVyZW50IExDSEFOLCBlLmcuCisgKiBhZnRlciBoYW5kb3ZlciBoYXMgc3VjY2VlZGVkICovCitpbnQgdHJhbnNfbGNoYW5fY2hhbmdlKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uX29sZCwKKwkJICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uX25ldykKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGNvbm5fb2xkLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCWludCBudW0gPSAwOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+Y29ubiA9PSBjb25uX29sZCkgeworCisJCQkvKiBkcm9wIG9sZCBjaGFubmVsIHVzZSBjb3VudCAqLworCQkJcHV0X3N1YnNjcl9jb24oY29ubl9vbGQpOworCQkJLyogYXNzaWduIG5ldyBjaGFubmVsICovCisJCQl0cmFucy0+Y29ubiA9IGNvbm5fbmV3OworCQkJLyogYnVtcCBuZXcgY2hhbm5lbCB1c2UgY291bnQgKi8KKwkJCXVzZV9zdWJzY3JfY29uKGNvbm5fbmV3KTsKKwkJCW51bSsrOworCQl9CisJfQorCisJcmV0dXJuIG51bTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RyYXVfZnJhbWUuYyBiL29wZW5ic2Mvc3JjL3RyYXVfZnJhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmM2MWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdHJhdV9mcmFtZS5jCkBAIC0wLDAgKzEsMjYxIEBACisvKiBUUkFVIGZyYW1lIGhhbmRsaW5nIGFjY29yZGluZyB0byBHU00gVFMgMDguNjAgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCitzdGF0aWMgdV9pbnQzMl90IGdldF9iaXRzKGNvbnN0IHVfaW50OF90ICpiaXRidWYsIGludCBvZmZzZXQsIGludCBudW0pCit7CisJaW50IGk7CisJdV9pbnQzMl90IHJldCA9IDA7CisKKwlmb3IgKGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyBudW07IGkrKykgeworCQlyZXQgPSByZXQgPDwgMTsKKwkJaWYgKGJpdGJ1ZltpXSkKKwkJCXJldCB8PSAxOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBEZWNvZGUgYWNjb3JkaW5nIHRvIDMuMS4xICovCitzdGF0aWMgdm9pZCBkZWNvZGVfZnIoc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIsIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMpCit7CisJaW50IGk7CisJaW50IGRfaWR4ID0gMDsKKworCS8qIEMxIC4uIEMxNSAqLworCW1lbWNweShmci0+Y19iaXRzKzAsIHRyYXVfYml0cysxNywgMTUpOworCS8qIEMxNiAuLiBDMjEgKi8KKwltZW1jcHkoZnItPmNfYml0cysxNSwgdHJhdV9iaXRzKzMxMCwgNik7CisJLyogVDEgLi4gVDQgKi8KKwltZW1jcHkoZnItPnRfYml0cyswLCB0cmF1X2JpdHMrMzE2LCA0KTsKKwkvKiBEMSAuLiBEMjU1ICovCisJZm9yIChpID0gMzI7IGkgPCAzMDQ7IGkrPSAxNikgeworCQltZW1jcHkoZnItPmRfYml0cyArIGRfaWR4LCB0cmF1X2JpdHMraSsxLCAxNSk7CisJCWRfaWR4ICs9IDE1OworCX0KKwkvKiBEMjU2IC4uIEQyNjAgKi8KKwltZW1jcHkoZnItPmRfYml0cyArIGRfaWR4LCB0cmF1X2JpdHMgKyAzMDUsIDUpOworfQorCisvKiBEZWNvZGUgYWNjb3JkaW5nIHRvIDMuMS4yICovCitzdGF0aWMgdm9pZCBkZWNvZGVfYW1yKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyLCBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzKQoreworCWludCBpOworCWludCBkX2lkeCA9IDA7CisKKwkvKiBDMSAuLiBDMTUgKi8KKwltZW1jcHkoZnItPmNfYml0cyswLCB0cmF1X2JpdHMrMTcsIDE1KTsKKwkvKiBDMTYgLi4gQzI1ICovCisJbWVtY3B5KGZyLT5jX2JpdHMrMTUsIHRyYXVfYml0cyszMywgMTApOworCS8qIFQxIC4uIFQ0ICovCisJbWVtY3B5KGZyLT50X2JpdHMrMCwgdHJhdV9iaXRzKzMxNiwgNCk7CisJLyogRDEgLi4gRDUgKi8KKwltZW1jcHkoZnItPmRfYml0cywgdHJhdV9iaXRzKzQzLCA1KTsKKwkvKiBENiAuLiBEMjQ1ICovCisJZm9yIChpID0gNDg7IGkgPCAzMDQ7IGkgKz0gMTYpIHsKKwkJbWVtY3B5KGZyLT5kX2JpdHMgKyBkX2lkeCwgdHJhdV9iaXRzK2krMSwgMTUpOworCQlkX2lkeCArPSAxNTsKKwl9CisJLyogRDI0NiAuLiBEMjU2ICovCisJbWVtY3B5KGZyLT5kX2JpdHMgKyBkX2lkeCwgdHJhdV9iaXRzICsgMzA1LCAxMSk7Cit9CisKK2ludCBkZWNvZGVfdHJhdV9mcmFtZShzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmciwgY29uc3QgdV9pbnQ4X3QgKnRyYXVfYml0cykKK3sKKwl1X2ludDhfdCBjYml0czUgPSBnZXRfYml0cyh0cmF1X2JpdHMsIDE3LCA1KTsKKworCXN3aXRjaCAoY2JpdHM1KSB7CisJY2FzZSBUUkFVX0ZUX0ZSX1VQOgorCWNhc2UgVFJBVV9GVF9GUl9ET1dOOgorCWNhc2UgVFJBVV9GVF9JRExFX1VQOgorCWNhc2UgVFJBVV9GVF9JRExFX0RPV046CisJY2FzZSBUUkFVX0ZUX0VGUjoKKwkJZGVjb2RlX2ZyKGZyLCB0cmF1X2JpdHMpOworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfQU1SOgorCQlkZWNvZGVfYW1yKGZyLCB0cmF1X2JpdHMpOworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfT01fVVA6CisJY2FzZSBUUkFVX0ZUX09NX0RPV046CisJY2FzZSBUUkFVX0ZUX0RBVEFfVVA6CisJY2FzZSBUUkFVX0ZUX0RBVEFfRE9XTjoKKwljYXNlIFRSQVVfRlRfRDE0NV9TWU5DOgorCWNhc2UgVFJBVV9GVF9FREFUQToKKwkJTE9HUChETVVYLCBMT0dMX05PVElDRSwgImNhbid0IGRlY29kZSB1bmltcGxlbWVudGVkIFRSQVUgIgorCQkJIkZyYW1lIFR5cGUgMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJjYW4ndCBkZWNvZGUgdW5rbm93biBUUkFVICIKKwkJCSJGcmFtZSBUeXBlIDB4JTAyeFxuIiwgY2JpdHM1KTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworY29uc3QgdV9pbnQ4X3QgZnRfZnJfZG93bl9iaXRzW10gPSB7IDEsIDEsIDEsIDAsIDAgfTsKK2NvbnN0IHVfaW50OF90IGZ0X2lkbGVfZG93bl9iaXRzW10gPSB7IDAsIDEsIDEsIDEsIDAgfTsKKworLyogbW9kaWZ5IGFuIHVwbGluayBUUkFVIGZyYW1lIHNvIHdlIGNhbiBzZW5kIGl0IGRvd25saW5rICovCitpbnQgdHJhdV9mcmFtZV91cDJkb3duKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKQoreworCXVfaW50OF90IGNiaXRzNSA9IGdldF9iaXRzKGZyLT5jX2JpdHMsIDAsIDUpOworCisJc3dpdGNoIChjYml0czUpIHsKKwljYXNlIFRSQVVfRlRfRlJfVVA6CisJCW1lbWNweShmci0+Y19iaXRzLCBmdF9mcl9kb3duX2JpdHMsIDUpOworCQkvKiBjbGVhciB0aW1lIGFsaWdubWVudCAqLworCQltZW1zZXQoZnItPmNfYml0cys1LCAwLCA2KTsKKwkJLyogRklYTUU6IFNQIC8gQkZJIGluIGNhc2Ugb2YgRFR4ICovCisJCS8qIEMxMiAuLiBDMjEgYXJlIHNwYXJlIGFuZCBjb2RlZCBhcyAnMScgKi8KKwkJbWVtc2V0KGZyLT5jX2JpdHMrMTEsIDB4MDEsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0VGUjoKKwkJLyogY2xlYXIgdGltZSBhbGlnbm1lbnQgKi8KKwkJbWVtc2V0KGZyLT5jX2JpdHMrNSwgMCwgNik7CisJCS8qIEZJWE1FOiBzZXQgVUZFIGFwcHJvcHJpYXRlbHkgKi8KKwkJLyogRklYTUU6IFNQIC8gQkZJIGluIGNhc2Ugb2YgRFR4ICovCisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9JRExFX1VQOgorCQltZW1jcHkoZnItPmNfYml0cywgZnRfaWRsZV9kb3duX2JpdHMsIDUpOworCQkvKiBjbGVhciB0aW1lIGFsaWdubWVudCAqLworCQltZW1zZXQoZnItPmNfYml0cys1LCAwLCA2KTsKKwkJLyogRklYTUU6IFNQIC8gQkZJIGluIGNhc2Ugb2YgRFR4ICovCisJCS8qIEMxMiAuLiBDMjEgYXJlIHNwYXJlIGFuZCBjb2RlZCBhcyAnMScgKi8KKwkJbWVtc2V0KGZyLT5jX2JpdHMrMTEsIDB4MDEsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0ZSX0RPV046CisJY2FzZSBUUkFVX0ZUX0lETEVfRE9XTjoKKwljYXNlIFRSQVVfRlRfT01fRE9XTjoKKwljYXNlIFRSQVVfRlRfREFUQV9ET1dOOgorCQkvKiB3ZSBjYW5ub3QgY29udmVydCBhIGRvd25saW5rIHRvIGEgZG93bmxpbmsgZnJhbWUgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9BTVI6CisJY2FzZSBUUkFVX0ZUX09NX1VQOgorCWNhc2UgVFJBVV9GVF9EQVRBX1VQOgorCWNhc2UgVFJBVV9GVF9EMTQ1X1NZTkM6CisJY2FzZSBUUkFVX0ZUX0VEQVRBOgorCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLCAidW5pbXBsZW1lbnRlZCBUUkFVIEZyYW1lIFR5cGUgIgorCQkJIjB4JTAyeFxuIiwgY2JpdHM1KTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLCAidW5rbm93biBUUkFVIEZyYW1lIFR5cGUgIgorCQkJIjB4JTAyeFxuIiwgY2JpdHM1KTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfZnIodV9pbnQ4X3QgKnRyYXVfYml0cywgY29uc3Qgc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIpCit7CisJaW50IGk7CisJaW50IGRfaWR4ID0gMDsKKworCXRyYXVfYml0c1sxNl0gPSAxOworCS8qIEMxIC4uIEMxNSAqLworCW1lbWNweSh0cmF1X2JpdHMrMTcsIGZyLT5jX2JpdHMrMCwgMTUpOworCS8qIEQxIC4uIEQyNTUgKi8KKwlmb3IgKGkgPSAzMjsgaSA8IDMwNDsgaSs9IDE2KSB7CisJCXRyYXVfYml0c1tpXSA9IDE7CisJCW1lbWNweSh0cmF1X2JpdHMraSsxLCBmci0+ZF9iaXRzICsgZF9pZHgsIDE1KTsKKwkJZF9pZHggKz0gMTU7CisJfQorCS8qIEQyNTYgLi4gRDI2MCAqLworCXRyYXVfYml0c1szMDRdID0gMTsKKwltZW1jcHkodHJhdV9iaXRzICsgMzA1LCBmci0+ZF9iaXRzICsgZF9pZHgsIDUpOworCS8qIEMxNiAuLiBDMjEgKi8KKwltZW1jcHkodHJhdV9iaXRzKzMxMCwgZnItPmNfYml0cysxNSwgNik7CisKKwkvKiBGSVhNRTogaGFuZGxlIHRpbWluZyBhZGp1c3RtZW50ICovCisKKwkvKiBUMSAuLiBUNCAqLworCW1lbWNweSh0cmF1X2JpdHMrMzE2LCBmci0+dF9iaXRzKzAsIDQpOworfQorCisKK2ludCBlbmNvZGVfdHJhdV9mcmFtZSh1X2ludDhfdCAqdHJhdV9iaXRzLCBjb25zdCBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmcikKK3sKKwl1X2ludDhfdCBjYml0czUgPSBnZXRfYml0cyhmci0+Y19iaXRzLCAwLCA1KTsKKwkKKwkvKiAxNiBiaXRzIG9mIHN5bmMgaGVhZGVyICovCisJbWVtc2V0KHRyYXVfYml0cywgMCwgMTYpOworCisJc3dpdGNoIChjYml0czUpIHsKKwljYXNlIFRSQVVfRlRfRlJfVVA6CisJY2FzZSBUUkFVX0ZUX0ZSX0RPV046CisJY2FzZSBUUkFVX0ZUX0lETEVfVVA6CisJY2FzZSBUUkFVX0ZUX0lETEVfRE9XTjoKKwljYXNlIFRSQVVfRlRfRUZSOgorCQllbmNvZGVfZnIodHJhdV9iaXRzLCBmcik7CisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9BTVI6CisJY2FzZSBUUkFVX0ZUX09NX1VQOgorCWNhc2UgVFJBVV9GVF9PTV9ET1dOOgorCWNhc2UgVFJBVV9GVF9EQVRBX1VQOgorCWNhc2UgVFJBVV9GVF9EQVRBX0RPV046CisJY2FzZSBUUkFVX0ZUX0QxNDVfU1lOQzoKKwljYXNlIFRSQVVfRlRfRURBVEE6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJ1bmltcGxlbWVudGVkIFRSQVUgRnJhbWUgVHlwZSAiCisJCQkiMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIFRSQVUgRnJhbWUgVHlwZSAiCisJCQkiMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSBmcl9pZGxlX2ZyYW1lID0geworCS5jX2JpdHMgPSB7IDAsIDEsIDEsIDEsIDAgfSwJLyogSURMRSBET1dOTElOSyAzLjUuNSAqLworCS50X2JpdHMgPSB7IDEsIDEsIDEsIDEgfSwKK307CitzdGF0aWMgdV9pbnQ4X3QgZW5jb2RlZF9pZGxlX2ZyYW1lW1RSQVVfRlJBTUVfQklUU107CitzdGF0aWMgaW50IGRiaXRzX2luaXR0ZWQ7CisKK3VfaW50OF90ICp0cmF1X2lkbGVfZnJhbWUodm9pZCkKK3sKKwkvKiBvbmx5IGluaXRpYWxpemUgZHVyaW5nIHRoZSBmaXJzdCBjYWxsICovCisJaWYgKCFkYml0c19pbml0dGVkKSB7CisJCS8qIHNldCBhbGwgRC1iaXRzIHRvIDEgKi8KKwkJbWVtc2V0KCZmcl9pZGxlX2ZyYW1lLmRfYml0cywgMHgwMSwgMjYwKTsKKwkJZW5jb2RlX2ZyKGVuY29kZWRfaWRsZV9mcmFtZSwgJmZyX2lkbGVfZnJhbWUpOworCX0KKwlyZXR1cm4gZW5jb2RlZF9pZGxlX2ZyYW1lOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdHJhdV9tdXguYyBiL29wZW5ic2Mvc3JjL3RyYXVfbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmYTVjMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3RyYXVfbXV4LmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qIFNpbXBsZSBUUkFVIGZyYW1lIHJlZmxlY3RvciB0byByb3V0ZSB2b2ljZSBjYWxscyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9mcmFtZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9tdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCit1X2ludDhfdCBnc21fZnJfbWFwW10gPSB7CisJNiwgNiwgNSwgNSwgNCwgNCwgMywgMywKKwk3LCAyLCAyLCA2LCAzLCAzLCAzLCAzLAorCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisJMywgNywgMiwgMiwgNiwgMywgMywgMywKKwkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorCTMsIDMsIDcsIDIsIDIsIDYsIDMsIDMsCisJMywgMywgMywgMywgMywgMywgMywgMywKKwkzLCAzLCAzLCA3LCAyLCAyLCA2LCAzLAorCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisJMywgMywgMywgMworfTsKKworc3RydWN0IG1hcF9lbnRyeSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3Qgc3JjLCBkc3Q7Cit9OworCitzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3Qgc3JjOworCXVfaW50MzJfdCBjYWxscmVmOworfTsKKworc3RhdGljIExMSVNUX0hFQUQoc3NfbWFwKTsKK3N0YXRpYyBMTElTVF9IRUFEKHNzX3VwcXVldWUpOworCit2b2lkICp0YWxsX21hcF9jdHgsICp0YWxsX3VwcV9jdHg7CisKKy8qIG1hcCBvbmUgcGFydGljdWxhciBzdWJzbG90IHRvIGFub3RoZXIgc3Vic2xvdCAqLworaW50IHRyYXVfbXV4X21hcChjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyYywKKwkJIGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZHN0KQoreworCXN0cnVjdCBtYXBfZW50cnkgKm1lOworCisJbWUgPSB0YWxsb2ModGFsbF9tYXBfY3R4LCBzdHJ1Y3QgbWFwX2VudHJ5KTsKKwlpZiAoIW1lKSB7CisJCUxPR1AoRE1JQiwgTE9HTF9GQVRBTCwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlERUJVR1AoRENDLCAiU2V0dGluZyB1cCBUUkFVIG11eCBtYXAgYmV0d2VlbiAoZTE9JXUsdHM9JXUsc3M9JXUpICIKKwkJImFuZCAoZTE9JXUsdHM9JXUsc3M9JXUpXG4iLAorCQlzcmMtPmUxX25yLCBzcmMtPmUxX3RzLCBzcmMtPmUxX3RzX3NzLAorCQlkc3QtPmUxX25yLCBkc3QtPmUxX3RzLCBkc3QtPmUxX3RzX3NzKTsKKworCS8qIG1ha2Ugc3VyZSB0byBnZXQgcmlkIG9mIGFueSBzdGFsZSBvbGQgbWFwcGluZ3MgKi8KKwl0cmF1X211eF91bm1hcChzcmMsIDApOworCXRyYXVfbXV4X3VubWFwKGRzdCwgMCk7CisKKwltZW1jcHkoJm1lLT5zcmMsIHNyYywgc2l6ZW9mKG1lLT5zcmMpKTsKKwltZW1jcHkoJm1lLT5kc3QsIGRzdCwgc2l6ZW9mKG1lLT5kc3QpKTsKKwlsbGlzdF9hZGQoJm1lLT5saXN0LCAmc3NfbWFwKTsKKworCXJldHVybiAwOworfQorCitpbnQgdHJhdV9tdXhfbWFwX2xjaGFuKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKnNyYywJCisJCQljb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpkc3QpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfc3MsICpkc3Rfc3M7CisKKwlzcmNfc3MgPSAmc3JjLT50cy0+ZTFfbGluazsKKwlkc3Rfc3MgPSAmZHN0LT50cy0+ZTFfbGluazsKKworCXJldHVybiB0cmF1X211eF9tYXAoc3JjX3NzLCBkc3Rfc3MpOworfQorCisKKy8qIHVubWFwIG9uZSBwYXJ0aWN1bGFyIHN1YnNsb3QgZnJvbSBhbm90aGVyIHN1YnNsb3QgKi8KK2ludCB0cmF1X211eF91bm1hcChjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNzLCB1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgbWFwX2VudHJ5ICptZSwgKm1lMjsKKwlzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSAqdWUsICp1ZTI7CisKKwlpZiAoc3MpCisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWUsIG1lMiwgJnNzX21hcCwgbGlzdCkgeworCQkJaWYgKCFtZW1jbXAoJm1lLT5zcmMsIHNzLCBzaXplb2YoKnNzKSkgfHwKKwkJCSAgICAhbWVtY21wKCZtZS0+ZHN0LCBzcywgc2l6ZW9mKCpzcykpKSB7CisJCQkJbGxpc3RfZGVsKCZtZS0+bGlzdCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVlLCB1ZTIsICZzc191cHF1ZXVlLCBsaXN0KSB7CisJCWlmICh1ZS0+Y2FsbHJlZiA9PSBjYWxscmVmKSB7CisJCQlsbGlzdF9kZWwoJnVlLT5saXN0KTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzcyAmJiAhbWVtY21wKCZ1ZS0+c3JjLCBzcywgc2l6ZW9mKCpzcykpKSB7CisJCQlsbGlzdF9kZWwoJnVlLT5saXN0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCisvKiBsb29rLXVwIGFuIGVudHkgaW4gdGhlIFRSQVUgbXV4IG1hcCAqLworc3RhdGljIHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqCitsb29rdXBfdHJhdV9tdXhfbWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjKQoreworCXN0cnVjdCBtYXBfZW50cnkgKm1lOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobWUsICZzc19tYXAsIGxpc3QpIHsKKwkJaWYgKCFtZW1jbXAoJm1lLT5zcmMsIHNyYywgc2l6ZW9mKCpzcmMpKSkKKwkJCXJldHVybiAmbWUtPmRzdDsKKwkJaWYgKCFtZW1jbXAoJm1lLT5kc3QsIHNyYywgc2l6ZW9mKCpzcmMpKSkKKwkJCXJldHVybiAmbWUtPnNyYzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGxvb2stdXAgYW4gZW50eSBpbiB0aGUgVFJBVSB1cHF1ZXVlICovCitzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSAqCitsb29rdXBfdHJhdV91cHF1ZXVlKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjKQoreworCXN0cnVjdCB1cHF1ZXVlX2VudHJ5ICp1ZTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHVlLCAmc3NfdXBxdWV1ZSwgbGlzdCkgeworCQlpZiAoIW1lbWNtcCgmdWUtPnNyYywgc3JjLCBzaXplb2YoKnNyYykpKQorCQkJcmV0dXJuIHVlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHVfaW50OF90IGNfYml0c19jaGVja1tdID0geyAwLCAwLCAwLCAxLCAwIH07CisKKy8qIHdlIGdldCBjYWxsZWQgYnkgc3ViY2hhbl9kZW11eCAqLworaW50IHRyYXVfbXV4X2lucHV0KHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjX2UxX3NzLAorCQkgICBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzLCBpbnQgbnVtX2JpdHMpCit7CisJc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSB0ZjsKKwl1X2ludDhfdCB0cmF1X2JpdHNfb3V0W1RSQVVfRlJBTUVfQklUU107CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICpkc3RfZTFfc3MgPSBsb29rdXBfdHJhdV9tdXhfbWFwKHNyY19lMV9zcyk7CisJc3RydWN0IHN1YmNoX211eCAqbXg7CisJc3RydWN0IHVwcXVldWVfZW50cnkgKnVlOworCWludCByYzsKKworCS8qIGRlY29kZSBUUkFVLCBjaGFuZ2UgaXQgdG8gZG93bmxpbmssIHJlLWVuY29kZSAqLworCXJjID0gZGVjb2RlX3RyYXVfZnJhbWUoJnRmLCB0cmF1X2JpdHMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKCFkc3RfZTFfc3MpIHsKKwkJc3RydWN0IG1zZ2IgKm1zZzsKKwkJc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZTsKKwkJdW5zaWduZWQgY2hhciAqZGF0YTsKKwkJaW50IGksIGosIGssIGwsIG87CisJCS8qIGZyYW1lIHNoYWxsIGJlIHNlbnQgdG8gdXBxdWV1ZSAqLworCQlpZiAoISh1ZSA9IGxvb2t1cF90cmF1X3VwcXVldWUoc3JjX2UxX3NzKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCF1ZS0+Y2FsbHJlZikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobWVtY21wKHRmLmNfYml0cywgY19iaXRzX2NoZWNrLCBzaXplb2YoY19iaXRzX2NoZWNrKSkpCisJCQlERUJVR1BDKERNVVgsICJpbGxlZ2FsIHRyYXUgKEMxLUM1KSAlc1xuIiwKKwkJCQloZXhkdW1wKHRmLmNfYml0cywgc2l6ZW9mKGNfYml0c19jaGVjaykpKTsKKwkJbXNnID0gbXNnYl9hbGxvYyhzaXplb2Yoc3RydWN0IGdzbV9kYXRhX2ZyYW1lKSArIDMzLAorCQkJCSAiR1NNLURBVEEiKTsKKwkJaWYgKCFtc2cpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlmcmFtZSA9IChzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKiltc2ctPmRhdGE7CisJCW1lbXNldChmcmFtZSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fZGF0YV9mcmFtZSkpOworCQlkYXRhID0gZnJhbWUtPmRhdGE7CisJCWRhdGFbMF0gPSAweGQgPDwgNDsKKwkJLyogcmVhc3NlbWJsZSBkLWJpdHMgKi8KKwkJaSA9IDA7IC8qIGNvdW50cyBiaXRzICovCisJCWogPSA0OyAvKiBjb3VudHMgb3V0cHV0IGJpdHMgKi8KKwkJayA9IGdzbV9mcl9tYXBbMF0tMTsgLyogY3VycmVudCBudW1iZXIgYml0IGluIGVsZW1lbnQgKi8KKwkJbCA9IDA7IC8qIGNvdW50cyBlbGVtZW50IGJpdHMgKi8KKwkJbyA9IDA7IC8qIG9mZnNldCBpbnB1dCBiaXRzICovCisJCXdoaWxlIChpIDwgMjYwKSB7CisJCQlkYXRhW2ovOF0gfD0gKHRmLmRfYml0c1trK29dIDw8ICg3LShqJTgpKSk7CisJCQlpZiAoLS1rIDwgMCkgeworCQkJCW8gKz0gZ3NtX2ZyX21hcFtsXTsKKwkJCQlrID0gZ3NtX2ZyX21hcFsrK2xdLTE7CisJCQl9CisJCQlpKys7CisJCQlqKys7CisJCX0KKwkJZnJhbWUtPm1zZ190eXBlID0gR1NNX1RDSEZfRlJBTUU7CisJCWZyYW1lLT5jYWxscmVmID0gdWUtPmNhbGxyZWY7CisJCW1zZ2JfZW5xdWV1ZSgmdWUtPm5ldC0+dXBxdWV1ZSwgbXNnKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlteCA9IGUxaW5wX2dldF9tdXgoZHN0X2UxX3NzLT5lMV9uciwgZHN0X2UxX3NzLT5lMV90cyk7CisJaWYgKCFteCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0cmF1X2ZyYW1lX3VwMmRvd24oJnRmKTsKKwllbmNvZGVfdHJhdV9mcmFtZSh0cmF1X2JpdHNfb3V0LCAmdGYpOworCisJLyogYW5kIHNlbmQgaXQgdG8gdGhlIG11eGVyICovCisJcmV0dXJuIHN1YmNoYW5fbXV4X2VucXVldWUobXgsIGRzdF9lMV9zcy0+ZTFfdHNfc3MsIHRyYXVfYml0c19vdXQsCisJCQkJICAgVFJBVV9GUkFNRV9CSVRTKTsKK30KKworLyogYWRkIHJlY2VpdmVyIGluc3RhbmNlIGZvciBsY2hhbiBhbmQgY2FsbHJlZiAqLworaW50IHRyYXVfcmVjdl9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IGNhbGxyZWYpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfc3M7CisJc3RydWN0IHVwcXVldWVfZW50cnkgKnVlOworCisJdWUgPSB0YWxsb2ModGFsbF91cHFfY3R4LCBzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSk7CisJaWYgKCF1ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcmNfc3MgPSAmbGNoYW4tPnRzLT5lMV9saW5rOworCisJREVCVUdQKERDQywgIlNldHRpbmcgdXAgVFJBVSByZWNlaXZlciAoZTE9JXUsdHM9JXUsc3M9JXUpICIKKwkJImFuZCAoY2FsbHJlZiAweCV4KVxuIiwKKwkJc3JjX3NzLT5lMV9uciwgc3JjX3NzLT5lMV90cywgc3JjX3NzLT5lMV90c19zcywKKwkJY2FsbHJlZik7CisKKwkvKiBtYWtlIHN1cmUgdG8gZ2V0IHJpZCBvZiBhbnkgc3RhbGUgb2xkIG1hcHBpbmdzICovCisJdHJhdV9tdXhfdW5tYXAoc3JjX3NzLCBjYWxscmVmKTsKKworCW1lbWNweSgmdWUtPnNyYywgc3JjX3NzLCBzaXplb2YodWUtPnNyYykpOworCXVlLT5uZXQgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXVlLT5jYWxscmVmID0gY2FsbHJlZjsKKwlsbGlzdF9hZGQoJnVlLT5saXN0LCAmc3NfdXBxdWV1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRyYXVfc2VuZF9mcmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZSkKK3sKKwl1X2ludDhfdCB0cmF1X2JpdHNfb3V0W1RSQVVfRlJBTUVfQklUU107CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICpkc3RfZTFfc3MgPSAmbGNoYW4tPnRzLT5lMV9saW5rOworCXN0cnVjdCBzdWJjaF9tdXggKm14OworCWludCBpLCBqLCBrLCBsLCBvOworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBmcmFtZS0+ZGF0YTsKKwlzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lIHRmOworCisJbXggPSBlMWlucF9nZXRfbXV4KGRzdF9lMV9zcy0+ZTFfbnIsIGRzdF9lMV9zcy0+ZTFfdHMpOworCWlmICghbXgpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChmcmFtZS0+bXNnX3R5cGUpIHsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCQkvKiBzZXQgYy1iaXRzIGFuZCB0LWJpdHMgKi8KKwkJdGYuY19iaXRzWzBdID0gMTsKKwkJdGYuY19iaXRzWzFdID0gMTsKKwkJdGYuY19iaXRzWzJdID0gMTsKKwkJdGYuY19iaXRzWzNdID0gMDsKKwkJdGYuY19iaXRzWzRdID0gMDsKKwkJbWVtc2V0KCZ0Zi5jX2JpdHNbNV0sIDAsIDYpOworCQltZW1zZXQoJnRmLmNfYml0c1sxMV0sIDEsIDEwKTsKKwkJbWVtc2V0KCZ0Zi50X2JpdHNbMF0sIDEsIDQpOworCQkvKiByZWFzc2VtYmxlIGQtYml0cyAqLworCQlpID0gMDsgLyogY291bnRzIGJpdHMgKi8KKwkJaiA9IDQ7IC8qIGNvdW50cyBpbnB1dCBiaXRzICovCisJCWsgPSBnc21fZnJfbWFwWzBdLTE7IC8qIGN1cnJlbnQgbnVtYmVyIGJpdCBpbiBlbGVtZW50ICovCisJCWwgPSAwOyAvKiBjb3VudHMgZWxlbWVudCBiaXRzICovCisJCW8gPSAwOyAvKiBvZmZzZXQgb3V0cHV0IGJpdHMgKi8KKwkJd2hpbGUgKGkgPCAyNjApIHsKKwkJCXRmLmRfYml0c1trK29dID0gKGRhdGFbai84XSA+PiAoNy0oaiU4KSkpICYgMTsKKwkJCWlmICgtLWsgPCAwKSB7CisJCQkJbyArPSBnc21fZnJfbWFwW2xdOworCQkJCWsgPSBnc21fZnJfbWFwWysrbF0tMTsKKwkJCX0KKwkJCWkrKzsKKwkJCWorKzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKERNVVgsICJ1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgJWRcbiIsCisJCQlmcmFtZS0+bXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllbmNvZGVfdHJhdV9mcmFtZSh0cmF1X2JpdHNfb3V0LCAmdGYpOworCisJLyogYW5kIHNlbmQgaXQgdG8gdGhlIG11eGVyICovCisJcmV0dXJuIHN1YmNoYW5fbXV4X2VucXVldWUobXgsIGRzdF9lMV9zcy0+ZTFfdHNfc3MsIHRyYXVfYml0c19vdXQsCisJCQkJICAgVFJBVV9GUkFNRV9CSVRTKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Vzc2QuYyBiL29wZW5ic2Mvc3JjL3Vzc2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDc2OTE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdXNzZC5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qIE5ldHdvcmstc3BlY2lmaWMgaGFuZGxpbmcgb2YgbW9iaWxlLW9yaWdpbmF0ZWQgVVNTRHMuICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IE1pa2UgSGFiZW4gPG1pY2hhZWwuaGFiZW5AYnRpbnRlcm5ldC5jb20+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIG5ldHdvcmstc3BlY2lmaWMgaGFuZGxpbmcgb2YgbW9iaWxlLW9yaWdpbmF0ZWQKKyAgIFVTU0QgbWVzc2FnZXMuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF84MC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKy8qIERlY2xhcmF0aW9ucyBvZiBVU1NEIHN0cmluZ3MgdG8gYmUgcmVjb2duaXNlZCAqLworY29uc3QgY2hhciBVU1NEX1RFWFRfT1dOX05VTUJFUltdID0gIiojMTAwIyI7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIG5ldHdvcmstc3BlY2lmaWMgaGFuZGxlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgc2VuZF9vd25fbnVtYmVyKGNvbnN0IHN0cnVjdCBtc2diICptc2csIGNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CisKKworLyogRW50cnlwb2ludCAtIGhhbmRsZXIgZnVuY3Rpb24gY29tbW9uIHRvIGFsbCBtb2JpbGUtb3JpZ2luYXRlZCBVU1NEcyAqLworaW50IGhhbmRsZV9yY3ZfdXNzZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCB1c3NkX3JlcXVlc3QgcmVxOworCisJZ3NtMDQ4MF9kZWNvZGVfdXNzZF9yZXF1ZXN0KG1zZywgJnJlcSk7CisJaWYgKHJlcS50ZXh0WzBdID09IDB4RkYpICAvKiBSZWxlYXNlLUNvbXBsZXRlICovCisJCXJldHVybiAwOworCisJaWYgKHN0cnN0cihVU1NEX1RFWFRfT1dOX05VTUJFUiwgcmVxLnRleHQpICE9IE5VTEwpIHsKKwkJREVCVUdQKERNTSwgIlVTU0Q6IE93biBudW1iZXIgcmVxdWVzdGVkXG4iKTsKKwkJcmV0dXJuIHNlbmRfb3duX251bWJlcihtc2csICZyZXEpOworCX0gZWxzZSB7CisJCURFQlVHUChETU0sICJVbmhhbmRsZWQgVVNTRCAlc1xuIiwgcmVxLnRleHQpOworCQlyZXR1cm4gZ3NtMDQ4MF9zZW5kX3Vzc2RfcmVqZWN0KG1zZywgJnJlcSk7CisJfQorfQorCisvKiBBIG5ldHdvcmstc3BlY2lmaWMgaGFuZGxlciBmdW5jdGlvbiAqLworc3RhdGljIGludCBzZW5kX293bl9udW1iZXIoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWNoYXIgKm93bl9udW1iZXIgPSBtc2ctPmxjaGFuLT5jb25uLnN1YnNjci0+ZXh0ZW5zaW9uOworCWNoYXIgcmVzcG9uc2Vfc3RyaW5nW0dTTV9FWFRFTlNJT05fTEVOR1RIICsgMjBdOworCisJLyogTmVlZCB0cmFpbGluZyBDUiBhcyBFT1QgY2hhcmFjdGVyICovCisJc25wcmludGYocmVzcG9uc2Vfc3RyaW5nLCBzaXplb2YocmVzcG9uc2Vfc3RyaW5nKSwgIllvdXIgZXh0ZW5zaW9uIGlzICVzXHIiLCBvd25fbnVtYmVyKTsKKwlyZXR1cm4gZ3NtMDQ4MF9zZW5kX3Vzc2RfcmVzcG9uc2UobXNnLCByZXNwb25zZV9zdHJpbmcsIHJlcSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvYnVmZmVyLmMgYi9vcGVuYnNjL3NyYy92dHkvYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjMTc2MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eS9idWZmZXIuYwpAQCAtMCwwICsxLDQ2MyBAQAorLyoKKyAqIEJ1ZmZlcmluZyBvZiBvdXRwdXQgYW5kIGlucHV0LgorICogQ29weXJpZ2h0IChDKSAxOTk4IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDx2dHkvYnVmZmVyLmg+CisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorCisvKiBCdWZmZXIgbWFzdGVyLiAqLworc3RydWN0IGJ1ZmZlciB7CisJLyogRGF0YSBsaXN0LiAqLworCXN0cnVjdCBidWZmZXJfZGF0YSAqaGVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKnRhaWw7CisKKwkvKiBTaXplIG9mIGVhY2ggYnVmZmVyX2RhdGEgY2h1bmsuICovCisJc2l6ZV90IHNpemU7Cit9OworCisvKiBEYXRhIGNvbnRhaW5lci4gKi8KK3N0cnVjdCBidWZmZXJfZGF0YSB7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpuZXh0OworCisJLyogTG9jYXRpb24gdG8gYWRkIG5ldyBkYXRhLiAqLworCXNpemVfdCBjcDsKKworCS8qIFBvaW50ZXIgdG8gZGF0YSBub3QgeWV0IGZsdXNoZWQuICovCisJc2l6ZV90IHNwOworCisJLyogQWN0dWFsIGRhdGEgc3RyZWFtICh2YXJpYWJsZSBsZW5ndGgpLiAqLworCXVuc2lnbmVkIGNoYXIgZGF0YVswXTsJLyogcmVhbCBkaW1lbnNpb24gaXMgYnVmZmVyLT5zaXplICovCit9OworCisvKiBJdCBzaG91bGQgYWx3YXlzIGJlIHRydWUgdGhhdDogMCA8PSBzcCA8PSBjcCA8PSBzaXplICovCisKKy8qIERlZmF1bHQgYnVmZmVyIHNpemUgKHVzZWQgaWYgbm9uZSBzcGVjaWZpZWQpLiAgSXQgaXMgcm91bmRlZCB1cCB0byB0aGUKKyAgIG5leHQgcGFnZSBib3VuZGVyeS4gKi8KKyNkZWZpbmUgQlVGRkVSX1NJWkVfREVGQVVMVAkJNDA5NgorCisjZGVmaW5lIEJVRkZFUl9EQVRBX0ZSRUUoRCkgdGFsbG9jX2ZyZWUoKEQpKQorCisvKiBNYWtlIG5ldyBidWZmZXIuICovCitzdHJ1Y3QgYnVmZmVyICpidWZmZXJfbmV3KHZvaWQgKmN0eCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGJ1ZmZlciAqYjsKKworCWIgPSB0YWxsb2NfemVybyhjdHgsIHN0cnVjdCBidWZmZXIpOworCisJaWYgKHNpemUpCisJCWItPnNpemUgPSBzaXplOworCWVsc2UgeworCQlzdGF0aWMgc2l6ZV90IGRlZmF1bHRfc2l6ZTsKKwkJaWYgKCFkZWZhdWx0X3NpemUpIHsKKwkJCWxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKKwkJCWRlZmF1bHRfc2l6ZSA9CisJCQkgICAgKCgoKEJVRkZFUl9TSVpFX0RFRkFVTFQgLSAxKSAvIHBnc3opICsgMSkgKiBwZ3N6KTsKKwkJfQorCQliLT5zaXplID0gZGVmYXVsdF9zaXplOworCX0KKworCXJldHVybiBiOworfQorCisvKiBGcmVlIGJ1ZmZlci4gKi8KK3ZvaWQgYnVmZmVyX2ZyZWUoc3RydWN0IGJ1ZmZlciAqYikKK3sKKwlidWZmZXJfcmVzZXQoYik7CisJdGFsbG9jX2ZyZWUoYik7Cit9CisKKy8qIE1ha2Ugc3RyaW5nIGNsb25lLiAqLworY2hhciAqYnVmZmVyX2dldHN0cihzdHJ1Y3QgYnVmZmVyICpiKQoreworCXNpemVfdCB0b3RsZW4gPSAwOworCXN0cnVjdCBidWZmZXJfZGF0YSAqZGF0YTsKKwljaGFyICpzOworCWNoYXIgKnA7CisKKwlmb3IgKGRhdGEgPSBiLT5oZWFkOyBkYXRhOyBkYXRhID0gZGF0YS0+bmV4dCkKKwkJdG90bGVuICs9IGRhdGEtPmNwIC0gZGF0YS0+c3A7CisJaWYgKCEocyA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsICh0b3RsZW4gKyAxKSwgImJ1ZmZlcl9nZXRzdHIiKSkpCisJCXJldHVybiBOVUxMOworCXAgPSBzOworCWZvciAoZGF0YSA9IGItPmhlYWQ7IGRhdGE7IGRhdGEgPSBkYXRhLT5uZXh0KSB7CisJCW1lbWNweShwLCBkYXRhLT5kYXRhICsgZGF0YS0+c3AsIGRhdGEtPmNwIC0gZGF0YS0+c3ApOworCQlwICs9IGRhdGEtPmNwIC0gZGF0YS0+c3A7CisJfQorCSpwID0gJ1wwJzsKKwlyZXR1cm4gczsKK30KKworLyogUmV0dXJuIDEgaWYgYnVmZmVyIGlzIGVtcHR5LiAqLworaW50IGJ1ZmZlcl9lbXB0eShzdHJ1Y3QgYnVmZmVyICpiKQoreworCXJldHVybiAoYi0+aGVhZCA9PSBOVUxMKTsKK30KKworLyogQ2xlYXIgYW5kIGZyZWUgYWxsIGFsbG9jYXRlZCBkYXRhLiAqLwordm9pZCBidWZmZXJfcmVzZXQoc3RydWN0IGJ1ZmZlciAqYikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmRhdGE7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpuZXh0OworCisJZm9yIChkYXRhID0gYi0+aGVhZDsgZGF0YTsgZGF0YSA9IG5leHQpIHsKKwkJbmV4dCA9IGRhdGEtPm5leHQ7CisJCUJVRkZFUl9EQVRBX0ZSRUUoZGF0YSk7CisJfQorCWItPmhlYWQgPSBiLT50YWlsID0gTlVMTDsKK30KKworLyogQWRkIGJ1ZmZlcl9kYXRhIHRvIHRoZSBlbmQgb2YgYnVmZmVyLiAqLworc3RhdGljIHN0cnVjdCBidWZmZXJfZGF0YSAqYnVmZmVyX2FkZChzdHJ1Y3QgYnVmZmVyICpiKQoreworCXN0cnVjdCBidWZmZXJfZGF0YSAqZDsKKworCWQgPSBfdGFsbG9jX3plcm8oYiwKKwkJCSBvZmZzZXRvZihzdHJ1Y3QgYnVmZmVyX2RhdGEsIGRhdGFbYi0+c2l6ZV0pLAorCQkJICJidWZmZXJfYWRkIik7CisJaWYgKCFkKQorCQlyZXR1cm4gTlVMTDsKKwlkLT5jcCA9IGQtPnNwID0gMDsKKwlkLT5uZXh0ID0gTlVMTDsKKworCWlmIChiLT50YWlsKQorCQliLT50YWlsLT5uZXh0ID0gZDsKKwllbHNlCisJCWItPmhlYWQgPSBkOworCWItPnRhaWwgPSBkOworCisJcmV0dXJuIGQ7Cit9CisKKy8qIFdyaXRlIGRhdGEgdG8gYnVmZmVyLiAqLwordm9pZCBidWZmZXJfcHV0KHN0cnVjdCBidWZmZXIgKmIsIGNvbnN0IHZvaWQgKnAsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBidWZmZXJfZGF0YSAqZGF0YSA9IGItPnRhaWw7CisJY29uc3QgY2hhciAqcHRyID0gcDsKKworCS8qIFdlIHVzZSBldmVuIGxhc3Qgb25lIGJ5dGUgb2YgZGF0YSBidWZmZXIuICovCisJd2hpbGUgKHNpemUpIHsKKwkJc2l6ZV90IGNodW5rOworCisJCS8qIElmIHRoZXJlIGlzIG5vIGRhdGEgYnVmZmVyIGFkZCBpdC4gKi8KKwkJaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhLT5jcCA9PSBiLT5zaXplKQorCQkJZGF0YSA9IGJ1ZmZlcl9hZGQoYik7CisKKwkJY2h1bmsgPQorCQkgICAgKChzaXplIDw9CisJCSAgICAgIChiLT5zaXplIC0gZGF0YS0+Y3ApKSA/IHNpemUgOiAoYi0+c2l6ZSAtIGRhdGEtPmNwKSk7CisJCW1lbWNweSgoZGF0YS0+ZGF0YSArIGRhdGEtPmNwKSwgcHRyLCBjaHVuayk7CisJCXNpemUgLT0gY2h1bms7CisJCXB0ciArPSBjaHVuazsKKwkJZGF0YS0+Y3AgKz0gY2h1bms7CisJfQorfQorCisvKiBJbnNlcnQgY2hhcmFjdGVyIGludG8gdGhlIGJ1ZmZlci4gKi8KK3ZvaWQgYnVmZmVyX3B1dGMoc3RydWN0IGJ1ZmZlciAqYiwgdV9jaGFyIGMpCit7CisJYnVmZmVyX3B1dChiLCAmYywgMSk7Cit9CisKKy8qIFB1dCBzdHJpbmcgdG8gdGhlIGJ1ZmZlci4gKi8KK3ZvaWQgYnVmZmVyX3B1dHN0cihzdHJ1Y3QgYnVmZmVyICpiLCBjb25zdCBjaGFyICpjKQoreworCWJ1ZmZlcl9wdXQoYiwgYywgc3RybGVuKGMpKTsKK30KKworLyogS2VlcCBmbHVzaGluZyBkYXRhIHRvIHRoZSBmZCB1bnRpbCB0aGUgYnVmZmVyIGlzIGVtcHR5IG9yIGFuIGVycm9yIGlzCisgICBlbmNvdW50ZXJlZCBvciB0aGUgb3BlcmF0aW9uIHdvdWxkIGJsb2NrLiAqLworYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl9mbHVzaF9hbGwoc3RydWN0IGJ1ZmZlciAqYiwgaW50IGZkKQoreworCWJ1ZmZlcl9zdGF0dXNfdCByZXQ7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpoZWFkOworCXNpemVfdCBoZWFkX3NwOworCisJaWYgKCFiLT5oZWFkKQorCQlyZXR1cm4gQlVGRkVSX0VNUFRZOworCWhlYWRfc3AgPSAoaGVhZCA9IGItPmhlYWQpLT5zcDsKKwkvKiBGbHVzaCBhbGwgZGF0YS4gKi8KKwl3aGlsZSAoKHJldCA9IGJ1ZmZlcl9mbHVzaF9hdmFpbGFibGUoYiwgZmQpKSA9PSBCVUZGRVJfUEVORElORykgeworCQlpZiAoKGItPmhlYWQgPT0gaGVhZCkgJiYgKGhlYWRfc3AgPT0gaGVhZC0+c3ApCisJCSAgICAmJiAoZXJybm8gIT0gRUlOVFIpKQorCQkJLyogTm8gZGF0YSB3YXMgZmx1c2hlZCwgc28ga2VybmVsIGJ1ZmZlciBtdXN0IGJlIGZ1bGwuICovCisJCQlyZXR1cm4gcmV0OworCQloZWFkX3NwID0gKGhlYWQgPSBiLT5oZWFkKS0+c3A7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmIDAKKy8qIEZsdXNoIGVub3VnaCBkYXRhIHRvIGZpbGwgYSB0ZXJtaW5hbCB3aW5kb3cgb2YgdGhlIGdpdmVuIHNjZW5lICh1c2VkIG9ubHkKKyAgIGJ5IHZ0eSB0ZWxuZXQgaW50ZXJmYWNlKS4gKi8KK2J1ZmZlcl9zdGF0dXNfdAorYnVmZmVyX2ZsdXNoX3dpbmRvdyhzdHJ1Y3QgYnVmZmVyICogYiwgaW50IGZkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCSAgICBpbnQgZXJhc2VfZmxhZywgaW50IG5vX21vcmVfZmxhZykKK3sKKwlpbnQgbmJ5dGVzOworCWludCBpb3ZfYWxsb2M7CisJaW50IGlvdl9pbmRleDsKKwlzdHJ1Y3QgaW92ZWMgKmlvdjsKKwlzdHJ1Y3QgaW92ZWMgc21hbGxfaW92WzNdOworCWNoYXIgbW9yZVtdID0gIiAtLU1vcmUtLSAiOworCWNoYXIgZXJhc2VbXSA9CisJICAgIHsgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwKKwkJJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLAorCQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4CisJfTsKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmRhdGE7CisJaW50IGNvbHVtbjsKKworCWlmICghYi0+aGVhZCkKKwkJcmV0dXJuIEJVRkZFUl9FTVBUWTsKKworCWlmIChoZWlnaHQgPCAxKSB7CisJCXpsb2dfd2FybgorCQkgICAgKCIlcyBjYWxsZWQgd2l0aCBub24tcG9zaXRpdmUgd2luZG93IGhlaWdodCAlZCwgZm9yY2luZyB0byAxIiwKKwkJICAgICBfX2Z1bmNfXywgaGVpZ2h0KTsKKwkJaGVpZ2h0ID0gMTsKKwl9IGVsc2UgaWYgKGhlaWdodCA+PSAyKQorCQloZWlnaHQtLTsKKwlpZiAod2lkdGggPCAxKSB7CisJCXpsb2dfd2FybgorCQkgICAgKCIlcyBjYWxsZWQgd2l0aCBub24tcG9zaXRpdmUgd2luZG93IHdpZHRoICVkLCBmb3JjaW5nIHRvIDEiLAorCQkgICAgIF9fZnVuY19fLCB3aWR0aCk7CisJCXdpZHRoID0gMTsKKwl9CisKKwkvKiBGb3IgZXJhc2UgYW5kIG1vcmUgZGF0YSBhZGQgdHdvIHRvIGIncyBidWZmZXJfZGF0YSBjb3VudC4gKi8KKwlpZiAoYi0+aGVhZC0+bmV4dCA9PSBOVUxMKSB7CisJCWlvdl9hbGxvYyA9IHNpemVvZihzbWFsbF9pb3YpIC8gc2l6ZW9mKHNtYWxsX2lvdlswXSk7CisJCWlvdiA9IHNtYWxsX2lvdjsKKwl9IGVsc2UgeworCQlpb3ZfYWxsb2MgPSAoKGhlaWdodCAqICh3aWR0aCArIDIpKSAvIGItPnNpemUpICsgMTA7CisJCWlvdiA9IFhNQUxMT0MoTVRZUEVfVE1QLCBpb3ZfYWxsb2MgKiBzaXplb2YoKmlvdikpOworCX0KKwlpb3ZfaW5kZXggPSAwOworCisJLyogUHJldmlvdXNseSBwcmludCBvdXQgaXMgcGVyZm9ybWVkLiAqLworCWlmIChlcmFzZV9mbGFnKSB7CisJCWlvdltpb3ZfaW5kZXhdLmlvdl9iYXNlID0gZXJhc2U7CisJCWlvdltpb3ZfaW5kZXhdLmlvdl9sZW4gPSBzaXplb2YgZXJhc2U7CisJCWlvdl9pbmRleCsrOworCX0KKworCS8qIE91dHB1dCBkYXRhLiAqLworCWNvbHVtbiA9IDE7CQkvKiBDb2x1bW4gcG9zaXRpb24gb2YgbmV4dCBjaGFyYWN0ZXIgZGlzcGxheWVkLiAqLworCWZvciAoZGF0YSA9IGItPmhlYWQ7IGRhdGEgJiYgKGhlaWdodCA+IDApOyBkYXRhID0gZGF0YS0+bmV4dCkgeworCQlzaXplX3QgY3A7CisKKwkJY3AgPSBkYXRhLT5zcDsKKwkJd2hpbGUgKChjcCA8IGRhdGEtPmNwKSAmJiAoaGVpZ2h0ID4gMCkpIHsKKwkJCS8qIENhbGN1bGF0ZSBsaW5lcyByZW1haW5pbmcgYW5kIGNvbHVtbiBwb3NpdGlvbiBhZnRlciBkaXNwbGF5aW5nCisJCQkgICB0aGlzIGNoYXJhY3Rlci4gKi8KKwkJCWlmIChkYXRhLT5kYXRhW2NwXSA9PSAnXHInKQorCQkJCWNvbHVtbiA9IDE7CisJCQllbHNlIGlmICgoZGF0YS0+ZGF0YVtjcF0gPT0gJ1xuJykgfHwgKGNvbHVtbiA9PSB3aWR0aCkpIHsKKwkJCQljb2x1bW4gPSAxOworCQkJCWhlaWdodC0tOworCQkJfSBlbHNlCisJCQkJY29sdW1uKys7CisJCQljcCsrOworCQl9CisJCWlvdltpb3ZfaW5kZXhdLmlvdl9iYXNlID0gKGNoYXIgKikoZGF0YS0+ZGF0YSArIGRhdGEtPnNwKTsKKwkJaW92W2lvdl9pbmRleCsrXS5pb3ZfbGVuID0gY3AgLSBkYXRhLT5zcDsKKwkJZGF0YS0+c3AgPSBjcDsKKworCQlpZiAoaW92X2luZGV4ID09IGlvdl9hbGxvYykKKwkJCS8qIFRoaXMgc2hvdWxkIG5vdCBvcmRpbmFyaWx5IGhhcHBlbi4gKi8KKwkJeworCQkJaW92X2FsbG9jICo9IDI7CisJCQlpZiAoaW92ICE9IHNtYWxsX2lvdikgeworCQkJCXpsb2dfd2FybigiJXM6IGdyb3dpbmcgaW92IGFycmF5IHRvICVkOyAiCisJCQkJCSAgIndpZHRoICVkLCBoZWlnaHQgJWQsIHNpemUgJWx1IiwKKwkJCQkJICBfX2Z1bmNfXywgaW92X2FsbG9jLCB3aWR0aCwgaGVpZ2h0LAorCQkJCQkgICh1X2xvbmcpIGItPnNpemUpOworCQkJCWlvdiA9CisJCQkJICAgIFhSRUFMTE9DKE1UWVBFX1RNUCwgaW92LAorCQkJCQkgICAgIGlvdl9hbGxvYyAqIHNpemVvZigqaW92KSk7CisJCQl9IGVsc2UgeworCQkJCS8qIFRoaXMgc2hvdWxkIGFic29sdXRlbHkgbmV2ZXIgb2NjdXIuICovCisJCQkJemxvZ19lcnIKKwkJCQkgICAgKCIlczogY29ycnVwdGlvbiBkZXRlY3RlZDogaW92X3NtYWxsIG92ZXJmbG93ZWQ7ICIKKwkJCQkgICAgICJoZWFkICVwLCB0YWlsICVwLCBoZWFkLT5uZXh0ICVwIiwKKwkJCQkgICAgIF9fZnVuY19fLCBiLT5oZWFkLCBiLT50YWlsLCBiLT5oZWFkLT5uZXh0KTsKKwkJCQlpb3YgPQorCQkJCSAgICBYTUFMTE9DKE1UWVBFX1RNUCwKKwkJCQkJICAgIGlvdl9hbGxvYyAqIHNpemVvZigqaW92KSk7CisJCQkJbWVtY3B5KGlvdiwgc21hbGxfaW92LCBzaXplb2Yoc21hbGxfaW92KSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBJbiBjYXNlIG9mIGBtb3JlJyBkaXNwbGF5IG5lZWQuICovCisJaWYgKGItPnRhaWwgJiYgKGItPnRhaWwtPnNwIDwgYi0+dGFpbC0+Y3ApICYmICFub19tb3JlX2ZsYWcpIHsKKwkJaW92W2lvdl9pbmRleF0uaW92X2Jhc2UgPSBtb3JlOworCQlpb3ZbaW92X2luZGV4XS5pb3ZfbGVuID0gc2l6ZW9mIG1vcmU7CisJCWlvdl9pbmRleCsrOworCX0KKyNpZmRlZiBJT1ZfTUFYCisJLyogSU9WX01BWCBhcmUgbm9ybWFsbHkgZGVmaW5lZCBpbiA8c3lzL3Vpby5oPiAsIFBvc2l4LjFnLgorCSAgIGV4YW1wbGU6IFNvbGFyaXMyLjYgYXJlIGRlZmluZWQgSU9WX01BWCBzaXplIGF0IDE2LiAgICAgKi8KKwl7CisJCXN0cnVjdCBpb3ZlYyAqY19pb3YgPSBpb3Y7CisJCW5ieXRlcyA9IDA7CS8qIE1ha2Ugc3VyZSBpdCdzIGluaXRpYWxpemVkLiAqLworCisJCXdoaWxlIChpb3ZfaW5kZXggPiAwKSB7CisJCQlpbnQgaW92X3NpemU7CisKKwkJCWlvdl9zaXplID0KKwkJCSAgICAoKGlvdl9pbmRleCA+IElPVl9NQVgpID8gSU9WX01BWCA6IGlvdl9pbmRleCk7CisJCQlpZiAoKG5ieXRlcyA9IHdyaXRldihmZCwgY19pb3YsIGlvdl9zaXplKSkgPCAwKSB7CisJCQkJemxvZ193YXJuKCIlczogd3JpdGV2IHRvIGZkICVkIGZhaWxlZDogJXMiLAorCQkJCQkgIF9fZnVuY19fLCBmZCwgc2FmZV9zdHJlcnJvcihlcnJubykpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBtb3ZlIHBvaW50ZXIgaW8tdmVjdG9yICovCisJCQljX2lvdiArPSBpb3Zfc2l6ZTsKKwkJCWlvdl9pbmRleCAtPSBpb3Zfc2l6ZTsKKwkJfQorCX0KKyNlbHNlCQkJCS8qIElPVl9NQVggKi8KKwlpZiAoKG5ieXRlcyA9IHdyaXRldihmZCwgaW92LCBpb3ZfaW5kZXgpKSA8IDApCisJCXpsb2dfd2FybigiJXM6IHdyaXRldiB0byBmZCAlZCBmYWlsZWQ6ICVzIiwKKwkJCSAgX19mdW5jX18sIGZkLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7CisjZW5kaWYJCQkJLyogSU9WX01BWCAqLworCisJLyogRnJlZSBwcmludGVkIGJ1ZmZlciBkYXRhLiAqLworCXdoaWxlIChiLT5oZWFkICYmIChiLT5oZWFkLT5zcCA9PSBiLT5oZWFkLT5jcCkpIHsKKwkJc3RydWN0IGJ1ZmZlcl9kYXRhICpkZWw7CisJCWlmICghKGItPmhlYWQgPSAoZGVsID0gYi0+aGVhZCktPm5leHQpKQorCQkJYi0+dGFpbCA9IE5VTEw7CisJCUJVRkZFUl9EQVRBX0ZSRUUoZGVsKTsKKwl9CisKKwlpZiAoaW92ICE9IHNtYWxsX2lvdikKKwkJWEZSRUUoTVRZUEVfVE1QLCBpb3YpOworCisJcmV0dXJuIChuYnl0ZXMgPCAwKSA/IEJVRkZFUl9FUlJPUiA6CisJICAgIChiLT5oZWFkID8gQlVGRkVSX1BFTkRJTkcgOiBCVUZGRVJfRU1QVFkpOworfQorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gKHVubGlrZSBvdGhlciBidWZmZXJfZmx1c2gqIGZ1bmN0aW9ucyBhYm92ZSkgaXMgZGVzaWduZWQKK3RvIHdvcmsgd2l0aCBub24tYmxvY2tpbmcgc29ja2V0cy4gIEl0IGRvZXMgbm90IGF0dGVtcHQgdG8gd3JpdGUgb3V0CithbGwgb2YgdGhlIHF1ZXVlZCBkYXRhLCBqdXN0IGEgImJpZyIgY2h1bmsuICBJdCByZXR1cm5zIDAgaWYgaXQgd2FzCithYmxlIHRvIGVtcHR5IG91dCB0aGUgYnVmZmVycyBjb21wbGV0ZWx5LCAxIGlmIG1vcmUgZmx1c2hpbmcgaXMKK3JlcXVpcmVkIGxhdGVyLCBvciAtMSBvbiBhIGZhdGFsIHdyaXRlIGVycm9yLiAqLworYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl9mbHVzaF9hdmFpbGFibGUoc3RydWN0IGJ1ZmZlciAqIGIsIGludCBmZCkKK3sKKworLyogVGhlc2UgYXJlIGp1c3QgcmVhc29uYWJsZSB2YWx1ZXMgdG8gbWFrZSBzdXJlIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mCitkYXRhIGlzIHdyaXR0ZW4uICBUaGVyZSdzIG5vIG5lZWQgdG8gZ28gY3JhenkgYW5kIHRyeSB0byB3cml0ZSBpdCBhbGwKK2luIG9uZSBzaG90LiAqLworI2lmZGVmIElPVl9NQVgKKyNkZWZpbmUgTUFYX0NIVU5LUyAoKElPVl9NQVggPj0gMTYpID8gMTYgOiBJT1ZfTUFYKQorI2Vsc2UKKyNkZWZpbmUgTUFYX0NIVU5LUyAxNgorI2VuZGlmCisjZGVmaW5lIE1BWF9GTFVTSCAxMzEwNzIKKworCXN0cnVjdCBidWZmZXJfZGF0YSAqZDsKKwlzaXplX3Qgd3JpdHRlbjsKKwlzdHJ1Y3QgaW92ZWMgaW92W01BWF9DSFVOS1NdOworCXNpemVfdCBpb3ZjbnQgPSAwOworCXNpemVfdCBuYnl0ZSA9IDA7CisKKwlmb3IgKGQgPSBiLT5oZWFkOyBkICYmIChpb3ZjbnQgPCBNQVhfQ0hVTktTKSAmJiAobmJ5dGUgPCBNQVhfRkxVU0gpOworCSAgICAgZCA9IGQtPm5leHQsIGlvdmNudCsrKSB7CisJCWlvdltpb3ZjbnRdLmlvdl9iYXNlID0gZC0+ZGF0YSArIGQtPnNwOworCQluYnl0ZSArPSAoaW92W2lvdmNudF0uaW92X2xlbiA9IGQtPmNwIC0gZC0+c3ApOworCX0KKworCWlmICghbmJ5dGUpCisJCS8qIE5vIGRhdGEgdG8gZmx1c2g6IHNob3VsZCB3ZSBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZT8gKi8KKwkJcmV0dXJuIEJVRkZFUl9FTVBUWTsKKworCS8qIG9ubHkgcGxhY2Ugd2hlcmUgd3JpdHRlbiBzaG91bGQgYmUgc2lnbiBjb21wYXJlZCAqLworCWlmICgoc3NpemVfdCkgKHdyaXR0ZW4gPSB3cml0ZXYoZmQsIGlvdiwgaW92Y250KSkgPCAwKSB7CisJCWlmIChFUlJOT19JT19SRVRSWShlcnJubykpCisJCQkvKiBDYWxsaW5nIGNvZGUgc2hvdWxkIHRyeSBhZ2FpbiBsYXRlci4gKi8KKwkJCXJldHVybiBCVUZGRVJfUEVORElORzsKKwkJcmV0dXJuIEJVRkZFUl9FUlJPUjsKKwl9CisKKwkvKiBGcmVlIHByaW50ZWQgYnVmZmVyIGRhdGEuICovCisJd2hpbGUgKHdyaXR0ZW4gPiAwKSB7CisJCXN0cnVjdCBidWZmZXJfZGF0YSAqZDsKKwkJaWYgKCEoZCA9IGItPmhlYWQpKQorCQkJYnJlYWs7CisJCWlmICh3cml0dGVuIDwgZC0+Y3AgLSBkLT5zcCkgeworCQkJZC0+c3AgKz0gd3JpdHRlbjsKKwkJCXJldHVybiBCVUZGRVJfUEVORElORzsKKwkJfQorCisJCXdyaXR0ZW4gLT0gKGQtPmNwIC0gZC0+c3ApOworCQlpZiAoIShiLT5oZWFkID0gZC0+bmV4dCkpCisJCQliLT50YWlsID0gTlVMTDsKKwkJQlVGRkVSX0RBVEFfRlJFRShkKTsKKwl9CisKKwlyZXR1cm4gYi0+aGVhZCA/IEJVRkZFUl9QRU5ESU5HIDogQlVGRkVSX0VNUFRZOworCisjdW5kZWYgTUFYX0NIVU5LUworI3VuZGVmIE1BWF9GTFVTSAorfQorCitidWZmZXJfc3RhdHVzX3QKK2J1ZmZlcl93cml0ZShzdHJ1Y3QgYnVmZmVyICogYiwgaW50IGZkLCBjb25zdCB2b2lkICpwLCBzaXplX3Qgc2l6ZSkKK3sKKwlzc2l6ZV90IG5ieXRlczsKKworI2lmIDAKKwkvKiBTaG91bGQgd2UgYXR0ZW1wdCB0byBkcmFpbiBhbnkgcHJldmlvdXNseSBidWZmZXJlZCBkYXRhPyAgVGhpcyBjb3VsZCBoZWxwIHJlZHVjZSBsYXRlbmN5IGluIHB1c2hpbmcgb3V0IHRoZSBkYXRhIGlmIHdlIGFyZSBzdHVjayBpbiBhIGxvbmctcnVubmluZyB0aHJlYWQgdGhhdCBpcyBwcmV2ZW50aW5nIHRoZSBtYWluIHNlbGVjdCBsb29wIGZyb20gY2FsbGluZyB0aGUgZmx1c2ggdGhyZWFkLi4uICovCisKKwlpZiAoYi0+aGVhZCAmJiAoYnVmZmVyX2ZsdXNoX2F2YWlsYWJsZShiLCBmZCkgPT0gQlVGRkVSX0VSUk9SKSkKKwkJcmV0dXJuIEJVRkZFUl9FUlJPUjsKKyNlbmRpZgorCWlmIChiLT5oZWFkKQorCQkvKiBCdWZmZXIgaXMgbm90IGVtcHR5LCBzbyBkbyBub3QgYXR0ZW1wdCB0byB3cml0ZSB0aGUgbmV3IGRhdGEuICovCisJCW5ieXRlcyA9IDA7CisJZWxzZSBpZiAoKG5ieXRlcyA9IHdyaXRlKGZkLCBwLCBzaXplKSkgPCAwKSB7CisJCWlmIChFUlJOT19JT19SRVRSWShlcnJubykpCisJCQluYnl0ZXMgPSAwOworCQllbHNlCisJCQlyZXR1cm4gQlVGRkVSX0VSUk9SOworCX0KKwkvKiBBZGQgYW55IHJlbWFpbmluZyBkYXRhIHRvIHRoZSBidWZmZXIuICovCisJeworCQlzaXplX3Qgd3JpdHRlbiA9IG5ieXRlczsKKwkJaWYgKHdyaXR0ZW4gPCBzaXplKQorCQkJYnVmZmVyX3B1dChiLCAoKGNvbnN0IGNoYXIgKilwKSArIHdyaXR0ZW4sCisJCQkJICAgc2l6ZSAtIHdyaXR0ZW4pOworCX0KKwlyZXR1cm4gYi0+aGVhZCA/IEJVRkZFUl9QRU5ESU5HIDogQlVGRkVSX0VNUFRZOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5L2NhcmRzaGVsbC5oIGIvb3BlbmJzYy9zcmMvdnR5L2NhcmRzaGVsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MTY0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHkvY2FyZHNoZWxsLmgKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSAiLi4vLi4vYnNjY29uZmlnLmgiCisjZGVmaW5lIFFVQUdHQV9QUk9HTkFNRQlQQUNLQUdFX05BTUUKKyNkZWZpbmUgUVVBR0dBX1ZFUlNJT04JUEFDS0FHRV9WRVJTSU9OCisjZGVmaW5lIFFVQUdHQV9DT1BZUklHSFQgIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+IgorI2RlZmluZSBDT05GSUdGSUxFX01BU0sgMDIyCisjZGVmaW5lIFNZU0NPTkZESVIgIi91c3IvbG9jYWwvZXRjIgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5L2NvbW1hbmQuYyBiL29wZW5ic2Mvc3JjL3Z0eS9jb21tYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4ZDk4MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eS9jb21tYW5kLmMKQEAgLTAsMCArMSwzNDE0IEBACisvKgorICAgJElkOiBjb21tYW5kLmMsdiAxLjQ3IDIwMDUvMDQvMjUgMTY6MjY6NDIgcGF1bCBFeHAgJAorCisgICBDb21tYW5kIGludGVycHJldGVyIHJvdXRpbmUgZm9yIHZpcnR1YWwgdGVybWluYWwgW2FrYSBUZWxldFlwZV0KKyAgIENvcHlyaWdodCAoQykgMTk5NywgOTgsIDk5IEt1bmloaXJvIElzaGlndXJvCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKworR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCitieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgorb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImNhcmRzaGVsbC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2RlZmluZSBfWE9QRU5fU09VUkNFCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisvLyNpbmNsdWRlICJtZW1vcnkuaCIKKy8vI2luY2x1ZGUgImxvZy5oIgorLy8jaW5jbHVkZSA8bGliL3ZlcnNpb24uaD4KKy8vI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgPHZ0eS92ZWN0b3IuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKy8vI2luY2x1ZGUgIndvcmtxdWV1ZS5oIgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKwordm9pZCAqdGFsbF92dHlfY21kX2N0eDsKKworLyogQ29tbWFuZCB2ZWN0b3Igd2hpY2ggaW5jbHVkZXMgc29tZSBsZXZlbCBvZiBjb21tYW5kIGxpc3RzLiBOb3JtYWxseQorICAgZWFjaCBkYWVtb24gbWFpbnRhaW5zIGVhY2ggb3duIGNtZHZlYy4gKi8KK3ZlY3RvciBjbWR2ZWM7CisKKy8qIEhvc3QgaW5mb3JtYXRpb24gc3RydWN0dXJlLiAqLworc3RydWN0IGhvc3QgaG9zdDsKKworLyogU3RhbmRhcmQgY29tbWFuZCBub2RlIHN0cnVjdHVyZXMuICovCitzdHJ1Y3QgY21kX25vZGUgYXV0aF9ub2RlID0geworCUFVVEhfTk9ERSwKKwkiUGFzc3dvcmQ6ICIsCit9OworCitzdHJ1Y3QgY21kX25vZGUgdmlld19ub2RlID0geworCVZJRVdfTk9ERSwKKwkiJXM+ICIsCit9OworCitzdHJ1Y3QgY21kX25vZGUgYXV0aF9lbmFibGVfbm9kZSA9IHsKKwlBVVRIX0VOQUJMRV9OT0RFLAorCSJQYXNzd29yZDogIiwKK307CisKK3N0cnVjdCBjbWRfbm9kZSBlbmFibGVfbm9kZSA9IHsKKwlFTkFCTEVfTk9ERSwKKwkiJXMjICIsCit9OworCitzdHJ1Y3QgY21kX25vZGUgY29uZmlnX25vZGUgPSB7CisJQ09ORklHX05PREUsCisJIiVzKGNvbmZpZykjICIsCisJMQorfTsKKworLyogRGVmYXVsdCBtb3RkIHN0cmluZy4gKi8KK2NvbnN0IGNoYXIgKmRlZmF1bHRfbW90ZCA9ICJcclxuXAorSGVsbG8sIHRoaXMgaXMgIiBRVUFHR0FfUFJPR05BTUUgIiAodmVyc2lvbiAiIFFVQUdHQV9WRVJTSU9OICIpLlxyXG5cCisiIFFVQUdHQV9DT1BZUklHSFQgIlxyXG5cCitcclxuIjsKKworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgZmFjaWxpdHlfbWFwIHsKKwlpbnQgZmFjaWxpdHk7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzaXplX3QgbWF0Y2g7Cit9IHN5c2xvZ19mYWNpbGl0aWVzW10gPSB7CisJeworCUxPR19LRVJOLCAia2VybiIsIDF9LCB7CisJTE9HX1VTRVIsICJ1c2VyIiwgMn0sIHsKKwlMT0dfTUFJTCwgIm1haWwiLCAxfSwgeworCUxPR19EQUVNT04sICJkYWVtb24iLCAxfSwgeworCUxPR19BVVRILCAiYXV0aCIsIDF9LCB7CisJTE9HX1NZU0xPRywgInN5c2xvZyIsIDF9LCB7CisJTE9HX0xQUiwgImxwciIsIDJ9LCB7CisJTE9HX05FV1MsICJuZXdzIiwgMX0sIHsKKwlMT0dfVVVDUCwgInV1Y3AiLCAyfSwgeworCUxPR19DUk9OLCAiY3JvbiIsIDF9LAorI2lmZGVmIExPR19GVFAKKwl7CisJTE9HX0ZUUCwgImZ0cCIsIDF9LAorI2VuZGlmCisJeworCUxPR19MT0NBTDAsICJsb2NhbDAiLCA2fSwgeworCUxPR19MT0NBTDEsICJsb2NhbDEiLCA2fSwgeworCUxPR19MT0NBTDIsICJsb2NhbDIiLCA2fSwgeworCUxPR19MT0NBTDMsICJsb2NhbDMiLCA2fSwgeworCUxPR19MT0NBTDQsICJsb2NhbDQiLCA2fSwgeworCUxPR19MT0NBTDUsICJsb2NhbDUiLCA2fSwgeworCUxPR19MT0NBTDYsICJsb2NhbDYiLCA2fSwgeworCUxPR19MT0NBTDcsICJsb2NhbDciLCA2fSwgeworMCwgTlVMTCwgMH0sfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmZhY2lsaXR5X25hbWUoaW50IGZhY2lsaXR5KQoreworCXN0cnVjdCBmYWNpbGl0eV9tYXAgKmZtOworCisJZm9yIChmbSA9IHN5c2xvZ19mYWNpbGl0aWVzOyBmbS0+bmFtZTsgZm0rKykKKwkJaWYgKGZtLT5mYWNpbGl0eSA9PSBmYWNpbGl0eSkKKwkJCXJldHVybiBmbS0+bmFtZTsKKwlyZXR1cm4gIiI7Cit9CisKK3N0YXRpYyBpbnQgZmFjaWxpdHlfbWF0Y2goY29uc3QgY2hhciAqc3RyKQoreworCXN0cnVjdCBmYWNpbGl0eV9tYXAgKmZtOworCisJZm9yIChmbSA9IHN5c2xvZ19mYWNpbGl0aWVzOyBmbS0+bmFtZTsgZm0rKykKKwkJaWYgKCFzdHJuY21wKHN0ciwgZm0tPm5hbWUsIGZtLT5tYXRjaCkpCisJCQlyZXR1cm4gZm0tPmZhY2lsaXR5OworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBsZXZlbF9tYXRjaChjb25zdCBjaGFyICpzKQoreworCWludCBsZXZlbDsKKworCWZvciAobGV2ZWwgPSAwOyB6bG9nX3ByaW9yaXR5W2xldmVsXSAhPSBOVUxMOyBsZXZlbCsrKQorCQlpZiAoIXN0cm5jbXAocywgemxvZ19wcmlvcml0eVtsZXZlbF0sIDIpKQorCQkJcmV0dXJuIGxldmVsOworCXJldHVybiBaTE9HX0RJU0FCTEVEOworfQorI2VuZGlmCisKKy8qIFRoaXMgaXMgY2FsbGVkIGZyb20gbWFpbiB3aGVuIGEgZGFlbW9uIGlzIGludm9rZWQgd2l0aCAtdiBvciAtLXZlcnNpb24uICovCit2b2lkIHByaW50X3ZlcnNpb24oY29uc3QgY2hhciAqcHJvZ25hbWUpCit7CisJcHJpbnRmKCIlcyB2ZXJzaW9uICVzXG4iLCBwcm9nbmFtZSwgUVVBR0dBX1ZFUlNJT04pOworCXByaW50ZigiJXNcbiIsIFFVQUdHQV9DT1BZUklHSFQpOworfQorDAorLyogVXRpbGl0eSBmdW5jdGlvbiB0byBjb25jYXRlbmF0ZSBhcmd2IGFyZ3VtZW50IGludG8gYSBzaW5nbGUgc3RyaW5nCisgICB3aXRoIGluc2VydGluZyAnICcgY2hhcmFjdGVyIGJldHdlZW4gZWFjaCBhcmd1bWVudC4gICovCitjaGFyICphcmd2X2NvbmNhdChjb25zdCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGludCBzaGlmdCkKK3sKKwlpbnQgaTsKKwlzaXplX3QgbGVuOworCWNoYXIgKnN0cjsKKwljaGFyICpwOworCisJbGVuID0gMDsKKwlmb3IgKGkgPSBzaGlmdDsgaSA8IGFyZ2M7IGkrKykKKwkJbGVuICs9IHN0cmxlbihhcmd2W2ldKSArIDE7CisJaWYgKCFsZW4pCisJCXJldHVybiBOVUxMOworCXAgPSBzdHIgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgbGVuLCAiYXJ2Z19jb25jYXQiKTsKKwlmb3IgKGkgPSBzaGlmdDsgaSA8IGFyZ2M7IGkrKykgeworCQlzaXplX3QgYXJnbGVuOworCQltZW1jcHkocCwgYXJndltpXSwgKGFyZ2xlbiA9IHN0cmxlbihhcmd2W2ldKSkpOworCQlwICs9IGFyZ2xlbjsKKwkJKnArKyA9ICcgJzsKKwl9CisJKihwIC0gMSkgPSAnXDAnOworCXJldHVybiBzdHI7Cit9CisKKy8qIEluc3RhbGwgdG9wIG5vZGUgb2YgY29tbWFuZCB2ZWN0b3IuICovCit2b2lkIGluc3RhbGxfbm9kZShzdHJ1Y3QgY21kX25vZGUgKm5vZGUsIGludCAoKmZ1bmMpIChzdHJ1Y3QgdnR5ICopKQoreworCXZlY3Rvcl9zZXRfaW5kZXgoY21kdmVjLCBub2RlLT5ub2RlLCBub2RlKTsKKwlub2RlLT5mdW5jID0gZnVuYzsKKwlub2RlLT5jbWRfdmVjdG9yID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKK30KKworLyogQ29tcGFyZSB0d28gY29tbWFuZCdzIHN0cmluZy4gIFVzZWQgaW4gc29ydF9ub2RlICgpLiAqLworc3RhdGljIGludCBjbXBfbm9kZShjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICpxKQoreworCXN0cnVjdCBjbWRfZWxlbWVudCAqYSA9ICooc3RydWN0IGNtZF9lbGVtZW50ICoqKXA7CisJc3RydWN0IGNtZF9lbGVtZW50ICpiID0gKihzdHJ1Y3QgY21kX2VsZW1lbnQgKiopcTsKKworCXJldHVybiBzdHJjbXAoYS0+c3RyaW5nLCBiLT5zdHJpbmcpOworfQorCitzdGF0aWMgaW50IGNtcF9kZXNjKGNvbnN0IHZvaWQgKnAsIGNvbnN0IHZvaWQgKnEpCit7CisJc3RydWN0IGRlc2MgKmEgPSAqKHN0cnVjdCBkZXNjICoqKXA7CisJc3RydWN0IGRlc2MgKmIgPSAqKHN0cnVjdCBkZXNjICoqKXE7CisKKwlyZXR1cm4gc3RyY21wKGEtPmNtZCwgYi0+Y21kKTsKK30KKworLyogU29ydCBlYWNoIG5vZGUncyBjb21tYW5kIGVsZW1lbnQgYWNjb3JkaW5nIHRvIGNvbW1hbmQgc3RyaW5nLiAqLwordm9pZCBzb3J0X25vZGUoKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCXN0cnVjdCBjbWRfbm9kZSAqY25vZGU7CisJdmVjdG9yIGRlc2N2ZWM7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZHZlYyk7IGkrKykKKwkJaWYgKChjbm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgaSkpICE9IE5VTEwpIHsKKwkJCXZlY3RvciBjbWRfdmVjdG9yID0gY25vZGUtPmNtZF92ZWN0b3I7CisJCQlxc29ydChjbWRfdmVjdG9yLT5pbmRleCwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKSwKKwkJCSAgICAgIHNpemVvZih2b2lkICopLCBjbXBfbm9kZSk7CisKKwkJCWZvciAoaiA9IDA7IGogPCB2ZWN0b3JfYWN0aXZlKGNtZF92ZWN0b3IpOyBqKyspCisJCQkJaWYgKChjbWRfZWxlbWVudCA9CisJCQkJICAgICB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBqKSkgIT0gTlVMTAorCQkJCSAgICAmJiB2ZWN0b3JfYWN0aXZlKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKSB7CisJCQkJCWRlc2N2ZWMgPQorCQkJCQkgICAgdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPnN0cnZlYywKKwkJCQkJCQl2ZWN0b3JfYWN0aXZlCisJCQkJCQkJKGNtZF9lbGVtZW50LT5zdHJ2ZWMpIC0KKwkJCQkJCQkxKTsKKwkJCQkJcXNvcnQoZGVzY3ZlYy0+aW5kZXgsCisJCQkJCSAgICAgIHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYyksCisJCQkJCSAgICAgIHNpemVvZih2b2lkICopLCBjbXBfZGVzYyk7CisJCQkJfQorCQl9Cit9CisKKy8qIEJyZWFraW5nIHVwIHN0cmluZyBpbnRvIGVhY2ggY29tbWFuZCBwaWVjZS4gSSBhc3N1bWUgZ2l2ZW4KKyAgIGNoYXJhY3RlciBpcyBzZXBhcmF0ZWQgYnkgYSBzcGFjZSBjaGFyYWN0ZXIuIFJldHVybiB2YWx1ZSBpcyBhCisgICB2ZWN0b3Igd2hpY2ggaW5jbHVkZXMgY2hhciAqKiBkYXRhIGVsZW1lbnQuICovCit2ZWN0b3IgY21kX21ha2Vfc3RydmVjKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwljb25zdCBjaGFyICpjcCwgKnN0YXJ0OworCWNoYXIgKnRva2VuOworCWludCBzdHJsZW47CisJdmVjdG9yIHN0cnZlYzsKKworCWlmIChzdHJpbmcgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwljcCA9IHN0cmluZzsKKworCS8qIFNraXAgd2hpdGUgc3BhY2VzLiAqLworCXdoaWxlIChpc3NwYWNlKChpbnQpKmNwKSAmJiAqY3AgIT0gJ1wwJykKKwkJY3ArKzsKKworCS8qIFJldHVybiBpZiB0aGVyZSBpcyBvbmx5IHdoaXRlIHNwYWNlcyAqLworCWlmICgqY3AgPT0gJ1wwJykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKmNwID09ICchJyB8fCAqY3AgPT0gJyMnKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFByZXBhcmUgcmV0dXJuIHZlY3Rvci4gKi8KKwlzdHJ2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworCisJLyogQ29weSBlYWNoIGNvbW1hbmQgcGllY2UgYW5kIHNldCBpbnRvIHZlY3Rvci4gKi8KKwl3aGlsZSAoMSkgeworCQlzdGFydCA9IGNwOworCQl3aGlsZSAoIShpc3NwYWNlKChpbnQpKmNwKSB8fCAqY3AgPT0gJ1xyJyB8fCAqY3AgPT0gJ1xuJykgJiYKKwkJICAgICAgICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKwkJc3RybGVuID0gY3AgLSBzdGFydDsKKwkJdG9rZW4gPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgc3RybGVuICsgMSwgIm1ha2Vfc3RydmVjIik7CisJCW1lbWNweSh0b2tlbiwgc3RhcnQsIHN0cmxlbik7CisJCSoodG9rZW4gKyBzdHJsZW4pID0gJ1wwJzsKKwkJdmVjdG9yX3NldChzdHJ2ZWMsIHRva2VuKTsKKworCQl3aGlsZSAoKGlzc3BhY2UoKGludCkqY3ApIHx8ICpjcCA9PSAnXG4nIHx8ICpjcCA9PSAnXHInKSAmJgorCQkgICAgICAgKmNwICE9ICdcMCcpCisJCQljcCsrOworCisJCWlmICgqY3AgPT0gJ1wwJykKKwkJCXJldHVybiBzdHJ2ZWM7CisJfQorfQorCisvKiBGcmVlIGFsbG9jYXRlZCBzdHJpbmcgdmVjdG9yLiAqLwordm9pZCBjbWRfZnJlZV9zdHJ2ZWModmVjdG9yIHYpCit7CisJdW5zaWduZWQgaW50IGk7CisJY2hhciAqY3A7CisKKwlpZiAoIXYpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHYpOyBpKyspCisJCWlmICgoY3AgPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkKKwkJCXRhbGxvY19mcmVlKGNwKTsKKworCXZlY3Rvcl9mcmVlKHYpOworfQorCisvKiBGZXRjaCBuZXh0IGRlc2NyaXB0aW9uLiAgVXNlZCBpbiBjbWRfbWFrZV9kZXNjdmVjKCkuICovCitzdGF0aWMgY2hhciAqY21kX2Rlc2Nfc3RyKGNvbnN0IGNoYXIgKipzdHJpbmcpCit7CisJY29uc3QgY2hhciAqY3AsICpzdGFydDsKKwljaGFyICp0b2tlbjsKKwlpbnQgc3RybGVuOworCisJY3AgPSAqc3RyaW5nOworCisJaWYgKGNwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogU2tpcCB3aGl0ZSBzcGFjZXMuICovCisJd2hpbGUgKGlzc3BhY2UoKGludCkqY3ApICYmICpjcCAhPSAnXDAnKQorCQljcCsrOworCisJLyogUmV0dXJuIGlmIHRoZXJlIGlzIG9ubHkgd2hpdGUgc3BhY2VzICovCisJaWYgKCpjcCA9PSAnXDAnKQorCQlyZXR1cm4gTlVMTDsKKworCXN0YXJ0ID0gY3A7CisKKwl3aGlsZSAoISgqY3AgPT0gJ1xyJyB8fCAqY3AgPT0gJ1xuJykgJiYgKmNwICE9ICdcMCcpCisJCWNwKys7CisKKwlzdHJsZW4gPSBjcCAtIHN0YXJ0OworCXRva2VuID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIHN0cmxlbiArIDEsICJjbWRfZGVzY19zdHIiKTsKKwltZW1jcHkodG9rZW4sIHN0YXJ0LCBzdHJsZW4pOworCSoodG9rZW4gKyBzdHJsZW4pID0gJ1wwJzsKKworCSpzdHJpbmcgPSBjcDsKKworCXJldHVybiB0b2tlbjsKK30KKworLyogTmV3IHN0cmluZyB2ZWN0b3IuICovCitzdGF0aWMgdmVjdG9yIGNtZF9tYWtlX2Rlc2N2ZWMoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpkZXNjc3RyKQoreworCWludCBtdWx0aXBsZSA9IDA7CisJY29uc3QgY2hhciAqc3A7CisJY2hhciAqdG9rZW47CisJaW50IGxlbjsKKwljb25zdCBjaGFyICpjcDsKKwljb25zdCBjaGFyICpkcDsKKwl2ZWN0b3IgYWxsdmVjOworCXZlY3RvciBzdHJ2ZWMgPSBOVUxMOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJY3AgPSBzdHJpbmc7CisJZHAgPSBkZXNjc3RyOworCisJaWYgKGNwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJYWxsdmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKworCXdoaWxlICgxKSB7CisJCXdoaWxlIChpc3NwYWNlKChpbnQpKmNwKSAmJiAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisKKwkJaWYgKCpjcCA9PSAnKCcpIHsKKwkJCW11bHRpcGxlID0gMTsKKwkJCWNwKys7CisJCX0KKwkJaWYgKCpjcCA9PSAnKScpIHsKKwkJCW11bHRpcGxlID0gMDsKKwkJCWNwKys7CisJCX0KKwkJaWYgKCpjcCA9PSAnfCcpIHsKKwkJCWlmICghbXVsdGlwbGUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgcGFyc2UgZXJyb3IhOiAlc1xuIiwKKwkJCQkJc3RyaW5nKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJY3ArKzsKKwkJfQorCisJCXdoaWxlIChpc3NwYWNlKChpbnQpKmNwKSAmJiAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisKKwkJaWYgKCpjcCA9PSAnKCcpIHsKKwkJCW11bHRpcGxlID0gMTsKKwkJCWNwKys7CisJCX0KKworCQlpZiAoKmNwID09ICdcMCcpCisJCQlyZXR1cm4gYWxsdmVjOworCisJCXNwID0gY3A7CisKKwkJd2hpbGUgKCEKKwkJICAgICAgIChpc3NwYWNlKChpbnQpKmNwKSB8fCAqY3AgPT0gJ1xyJyB8fCAqY3AgPT0gJ1xuJworCQkJfHwgKmNwID09ICcpJyB8fCAqY3AgPT0gJ3wnKSAmJiAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisKKwkJbGVuID0gY3AgLSBzcDsKKworCQl0b2tlbiA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBsZW4gKyAxLCAiY21kX21ha2VfZGVzY3ZlYyIpOworCQltZW1jcHkodG9rZW4sIHNwLCBsZW4pOworCQkqKHRva2VuICsgbGVuKSA9ICdcMCc7CisKKwkJZGVzYyA9IHRhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIHN0cnVjdCBkZXNjKTsKKwkJZGVzYy0+Y21kID0gdG9rZW47CisJCWRlc2MtPnN0ciA9IGNtZF9kZXNjX3N0cigmZHApOworCisJCWlmIChtdWx0aXBsZSkgeworCQkJaWYgKG11bHRpcGxlID09IDEpIHsKKwkJCQlzdHJ2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworCQkJCXZlY3Rvcl9zZXQoYWxsdmVjLCBzdHJ2ZWMpOworCQkJfQorCQkJbXVsdGlwbGUrKzsKKwkJfSBlbHNlIHsKKwkJCXN0cnZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisJCQl2ZWN0b3Jfc2V0KGFsbHZlYywgc3RydmVjKTsKKwkJfQorCQl2ZWN0b3Jfc2V0KHN0cnZlYywgZGVzYyk7CisJfQorfQorCisvKiBDb3VudCBtYW5kYW50b3J5IHN0cmluZyB2ZWN0b3Igc2l6ZS4gIFRoaXMgaXMgdG8gZGV0ZXJtaW5lIGlucHV0ZWQKKyAgIGNvbW1hbmQgaGFzIGVub3VnaCBjb21tYW5kIGxlbmd0aC4gKi8KK3N0YXRpYyBpbnQgY21kX2NtZHNpemUodmVjdG9yIHN0cnZlYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgc2l6ZSA9IDA7CisJdmVjdG9yIGRlc2N2ZWM7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShzdHJ2ZWMpOyBpKyspCisJCWlmICgoZGVzY3ZlYyA9IHZlY3Rvcl9zbG90KHN0cnZlYywgaSkpICE9IE5VTEwpIHsKKwkJCWlmICgodmVjdG9yX2FjdGl2ZShkZXNjdmVjKSkgPT0gMQorCQkJICAgICYmIChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3ZlYywgMCkpICE9IE5VTEwpIHsKKwkJCQlpZiAoZGVzYy0+Y21kID09IE5VTEwgfHwgQ01EX09QVElPTihkZXNjLT5jbWQpKQorCQkJCQlyZXR1cm4gc2l6ZTsKKwkJCQllbHNlCisJCQkJCXNpemUrKzsKKwkJCX0gZWxzZQorCQkJCXNpemUrKzsKKwkJfQorCXJldHVybiBzaXplOworfQorCisvKiBSZXR1cm4gcHJvbXB0IGNoYXJhY3RlciBvZiBzcGVjaWZpZWQgbm9kZS4gKi8KK2NvbnN0IGNoYXIgKmNtZF9wcm9tcHQoZW51bSBub2RlX3R5cGUgbm9kZSkKK3sKKwlzdHJ1Y3QgY21kX25vZGUgKmNub2RlOworCisJY25vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIG5vZGUpOworCXJldHVybiBjbm9kZS0+cHJvbXB0OworfQorCisvKiBJbnN0YWxsIGEgY29tbWFuZCBpbnRvIGEgbm9kZS4gKi8KK3ZvaWQgaW5zdGFsbF9lbGVtZW50KGVudW0gbm9kZV90eXBlIG50eXBlLCBzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZCkKK3sKKwlzdHJ1Y3QgY21kX25vZGUgKmNub2RlOworCisJY25vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIG50eXBlKTsKKworCWlmIChjbm9kZSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkNvbW1hbmQgbm9kZSAlZCBkb2Vzbid0IGV4aXN0LCBwbGVhc2UgY2hlY2sgaXRcbiIsCisJCQludHlwZSk7CisJCWV4aXQoMSk7CisJfQorCisJdmVjdG9yX3NldChjbm9kZS0+Y21kX3ZlY3RvciwgY21kKTsKKworCWNtZC0+c3RydmVjID0gY21kX21ha2VfZGVzY3ZlYyhjbWQtPnN0cmluZywgY21kLT5kb2MpOworCWNtZC0+Y21kc2l6ZSA9IGNtZF9jbWRzaXplKGNtZC0+c3RydmVjKTsKK30KKworI2lmZGVmIFZUWV9DUllQVF9QVworc3RhdGljIHVuc2lnbmVkIGNoYXIgaXRvYTY0W10gPQorICAgICIuLzAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKworc3RhdGljIHZvaWQgdG82NChjaGFyICpzLCBsb25nIHYsIGludCBuKQoreworCXdoaWxlICgtLW4gPj0gMCkgeworCQkqcysrID0gaXRvYTY0W3YgJiAweDNmXTsKKwkJdiA+Pj0gNjsKKwl9Cit9CisKK3N0YXRpYyBjaGFyICp6ZW5jcnlwdChjb25zdCBjaGFyICpwYXNzd2QpCit7CisJY2hhciBzYWx0WzZdOworCXN0cnVjdCB0aW1ldmFsIHR2OworCWNoYXIgKmNyeXB0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworCWdldHRpbWVvZmRheSgmdHYsIDApOworCisJdG82NCgmc2FsdFswXSwgcmFuZG9tKCksIDMpOworCXRvNjQoJnNhbHRbM10sIHR2LnR2X3VzZWMsIDMpOworCXNhbHRbNV0gPSAnXDAnOworCisJcmV0dXJuIGNyeXB0KHBhc3N3ZCwgc2FsdCk7Cit9CisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiB3cml0ZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgaG9zdC4gKi8KK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX2hvc3Qoc3RydWN0IHZ0eSAqdnR5KQoreworCWlmIChob3N0Lm5hbWUpCisJCXZ0eV9vdXQodnR5LCAiaG9zdG5hbWUgJXMlcyIsIGhvc3QubmFtZSwgVlRZX05FV0xJTkUpOworCisJaWYgKGhvc3QuZW5jcnlwdCkgeworCQlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQorCQkJdnR5X291dCh2dHksICJwYXNzd29yZCA4ICVzJXMiLCBob3N0LnBhc3N3b3JkX2VuY3J5cHQsCisJCQkJVlRZX05FV0xJTkUpOworCQlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJCXZ0eV9vdXQodnR5LCAiZW5hYmxlIHBhc3N3b3JkIDggJXMlcyIsCisJCQkJaG9zdC5lbmFibGVfZW5jcnlwdCwgVlRZX05FV0xJTkUpOworCX0gZWxzZSB7CisJCWlmIChob3N0LnBhc3N3b3JkKQorCQkJdnR5X291dCh2dHksICJwYXNzd29yZCAlcyVzIiwgaG9zdC5wYXNzd29yZCwKKwkJCQlWVFlfTkVXTElORSk7CisJCWlmIChob3N0LmVuYWJsZSkKKwkJCXZ0eV9vdXQodnR5LCAiZW5hYmxlIHBhc3N3b3JkICVzJXMiLCBob3N0LmVuYWJsZSwKKwkJCQlWVFlfTkVXTElORSk7CisJfQorCisjaWYgMAorCWlmICh6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsICE9IExPR19ERUJVRykgeworCQl2dHlfb3V0KHZ0eSwgIiEgTi5CLiBUaGUgJ2xvZyB0cmFwJyBjb21tYW5kIGlzIGRlcHJlY2F0ZWQuJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgImxvZyB0cmFwICVzJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsXSwgVlRZX05FV0xJTkUpOworCX0KKworCWlmIChob3N0LmxvZ2ZpbGUKKwkgICAgJiYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9GSUxFXSAhPSBaTE9HX0RJU0FCTEVEKSkgeworCQl2dHlfb3V0KHZ0eSwgImxvZyBmaWxlICVzIiwgaG9zdC5sb2dmaWxlKTsKKwkJaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9GSUxFXSAhPQorCQkgICAgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCkKKwkJCXZ0eV9vdXQodnR5LCAiICVzIiwKKwkJCQl6bG9nX3ByaW9yaXR5W3psb2dfZGVmYXVsdC0+CisJCQkJCSAgICAgIG1heGx2bFtaTE9HX0RFU1RfRklMRV1dKTsKKwkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX1NURE9VVF0gIT0gWkxPR19ESVNBQkxFRCkgeworCQl2dHlfb3V0KHZ0eSwgImxvZyBzdGRvdXQiKTsKKwkJaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9TVERPVVRdICE9CisJCSAgICB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKQorCQkJdnR5X291dCh2dHksICIgJXMiLAorCQkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT4KKwkJCQkJICAgICAgbWF4bHZsW1pMT0dfREVTVF9TVERPVVRdXSk7CisJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJfQorCisJaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXSA9PSBaTE9HX0RJU0FCTEVEKQorCQl2dHlfb3V0KHZ0eSwgIm5vIGxvZyBtb25pdG9yJXMiLCBWVFlfTkVXTElORSk7CisJZWxzZSBpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX01PTklUT1JdICE9CisJCSB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKQorCQl2dHlfb3V0KHZ0eSwgImxvZyBtb25pdG9yICVzJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl1dLAorCQkJVlRZX05FV0xJTkUpOworCisJaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9TWVNMT0ddICE9IFpMT0dfRElTQUJMRUQpIHsKKwkJdnR5X291dCh2dHksICJsb2cgc3lzbG9nIik7CisJCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfU1lTTE9HXSAhPQorCQkgICAgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCkKKwkJCXZ0eV9vdXQodnR5LCAiICVzIiwKKwkJCQl6bG9nX3ByaW9yaXR5W3psb2dfZGVmYXVsdC0+CisJCQkJCSAgICAgIG1heGx2bFtaTE9HX0RFU1RfU1lTTE9HXV0pOworCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCX0KKworCWlmICh6bG9nX2RlZmF1bHQtPmZhY2lsaXR5ICE9IExPR19EQUVNT04pCisJCXZ0eV9vdXQodnR5LCAibG9nIGZhY2lsaXR5ICVzJXMiLAorCQkJZmFjaWxpdHlfbmFtZSh6bG9nX2RlZmF1bHQtPmZhY2lsaXR5KSwgVlRZX05FV0xJTkUpOworCisJaWYgKHpsb2dfZGVmYXVsdC0+cmVjb3JkX3ByaW9yaXR5ID09IDEpCisJCXZ0eV9vdXQodnR5LCAibG9nIHJlY29yZC1wcmlvcml0eSVzIiwgVlRZX05FV0xJTkUpOworI2VuZGlmCisJaWYgKGhvc3QuYWR2YW5jZWQpCisJCXZ0eV9vdXQodnR5LCAic2VydmljZSBhZHZhbmNlZC12dHklcyIsIFZUWV9ORVdMSU5FKTsKKworCWlmIChob3N0LmVuY3J5cHQpCisJCXZ0eV9vdXQodnR5LCAic2VydmljZSBwYXNzd29yZC1lbmNyeXB0aW9uJXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoaG9zdC5saW5lcyA+PSAwKQorCQl2dHlfb3V0KHZ0eSwgInNlcnZpY2UgdGVybWluYWwtbGVuZ3RoICVkJXMiLCBob3N0LmxpbmVzLAorCQkJVlRZX05FV0xJTkUpOworCisJaWYgKGhvc3QubW90ZGZpbGUpCisJCXZ0eV9vdXQodnR5LCAiYmFubmVyIG1vdGQgZmlsZSAlcyVzIiwgaG9zdC5tb3RkZmlsZSwKKwkJCVZUWV9ORVdMSU5FKTsKKwllbHNlIGlmICghaG9zdC5tb3RkKQorCQl2dHlfb3V0KHZ0eSwgIm5vIGJhbm5lciBtb3RkJXMiLCBWVFlfTkVXTElORSk7CisKKwlyZXR1cm4gMTsKK30KKworLyogVXRpbGl0eSBmdW5jdGlvbiBmb3IgZ2V0dGluZyBjb21tYW5kIHZlY3Rvci4gKi8KK3N0YXRpYyB2ZWN0b3IgY21kX25vZGVfdmVjdG9yKHZlY3RvciB2LCBlbnVtIG5vZGVfdHlwZSBudHlwZSkKK3sKKwlzdHJ1Y3QgY21kX25vZGUgKmNub2RlID0gdmVjdG9yX3Nsb3QodiwgbnR5cGUpOworCXJldHVybiBjbm9kZS0+Y21kX3ZlY3RvcjsKK30KKworI2lmIDAKKy8qIEZpbHRlciBjb21tYW5kIHZlY3RvciBieSBzeW1ib2wuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhY3R1YWxseSB1c2VkOworICogc2hvdWxkIGl0IGJlIGRlbGV0ZWQ/ICovCitzdGF0aWMgaW50IGNtZF9maWx0ZXJfYnlfc3ltYm9sKGNoYXIgKmNvbW1hbmQsIGNoYXIgKnN5bWJvbCkKK3sKKwlpbnQgaSwgbGltOworCisJaWYgKHN0cmNtcChzeW1ib2wsICJJUFY0X0FERFJFU1MiKSA9PSAwKSB7CisJCWkgPSAwOworCQlsaW0gPSBzdHJsZW4oY29tbWFuZCk7CisJCXdoaWxlIChpIDwgbGltKSB7CisJCQlpZiAoIQorCQkJICAgIChpc2RpZ2l0KChpbnQpY29tbWFuZFtpXSkgfHwgY29tbWFuZFtpXSA9PSAnLicKKwkJCSAgICAgfHwgY29tbWFuZFtpXSA9PSAnLycpKQorCQkJCXJldHVybiAxOworCQkJaSsrOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAoc3RyY21wKHN5bWJvbCwgIlNUUklORyIpID09IDApIHsKKwkJaSA9IDA7CisJCWxpbSA9IHN0cmxlbihjb21tYW5kKTsKKwkJd2hpbGUgKGkgPCBsaW0pIHsKKwkJCWlmICghCisJCQkgICAgKGlzYWxwaGEoKGludCljb21tYW5kW2ldKSB8fCBjb21tYW5kW2ldID09ICdfJworCQkJICAgICB8fCBjb21tYW5kW2ldID09ICctJykpCisJCQkJcmV0dXJuIDE7CisJCQlpKys7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWlmIChzdHJjbXAoc3ltYm9sLCAiSUZOQU1FIikgPT0gMCkgeworCQlpID0gMDsKKwkJbGltID0gc3RybGVuKGNvbW1hbmQpOworCQl3aGlsZSAoaSA8IGxpbSkgeworCQkJaWYgKCFpc2FsbnVtKChpbnQpY29tbWFuZFtpXSkpCisJCQkJcmV0dXJuIDE7CisJCQlpKys7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qIENvbXBsZXRpb24gbWF0Y2ggdHlwZXMuICovCitlbnVtIG1hdGNoX3R5cGUgeworCW5vX21hdGNoLAorCWV4dGVuZF9tYXRjaCwKKwlpcHY0X3ByZWZpeF9tYXRjaCwKKwlpcHY0X21hdGNoLAorCWlwdjZfcHJlZml4X21hdGNoLAorCWlwdjZfbWF0Y2gsCisJcmFuZ2VfbWF0Y2gsCisJdmFyYXJnX21hdGNoLAorCXBhcnRseV9tYXRjaCwKKwlleGFjdF9tYXRjaAorfTsKKworc3RhdGljIGVudW0gbWF0Y2hfdHlwZSBjbWRfaXB2NF9tYXRjaChjb25zdCBjaGFyICpzdHIpCit7CisJY29uc3QgY2hhciAqc3A7CisJaW50IGRvdHMgPSAwLCBudW1zID0gMDsKKwljaGFyIGJ1Zls0XTsKKworCWlmIChzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCWZvciAoOzspIHsKKwkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCQlzcCA9IHN0cjsKKwkJd2hpbGUgKCpzdHIgIT0gJ1wwJykgeworCQkJaWYgKCpzdHIgPT0gJy4nKSB7CisJCQkJaWYgKGRvdHMgPj0gMykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJy4nKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnXDAnKQorCQkJCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJCQkJZG90cysrOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFpc2RpZ2l0KChpbnQpKnN0cikpCisJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQlzdHIrKzsKKwkJfQorCisJCWlmIChzdHIgLSBzcCA+IDMpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJc3RybmNweShidWYsIHNwLCBzdHIgLSBzcCk7CisJCWlmIChhdG9pKGJ1ZikgPiAyNTUpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJbnVtcysrOworCisJCWlmICgqc3RyID09ICdcMCcpCisJCQlicmVhazsKKworCQlzdHIrKzsKKwl9CisKKwlpZiAobnVtcyA8IDQpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwlyZXR1cm4gZXhhY3RfbWF0Y2g7Cit9CisKK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUgY21kX2lwdjRfcHJlZml4X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljb25zdCBjaGFyICpzcDsKKwlpbnQgZG90cyA9IDA7CisJY2hhciBidWZbNF07CisKKwlpZiAoc3RyID09IE5VTEwpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwlmb3IgKDs7KSB7CisJCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwkJc3AgPSBzdHI7CisJCXdoaWxlICgqc3RyICE9ICdcMCcgJiYgKnN0ciAhPSAnLycpIHsKKwkJCWlmICgqc3RyID09ICcuJykgeworCQkJCWlmIChkb3RzID09IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICcuJyB8fCAqKHN0ciArIDEpID09ICcvJykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJ1wwJykKKwkJCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCQkJCWRvdHMrKzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCFpc2RpZ2l0KChpbnQpKnN0cikpCisJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQlzdHIrKzsKKwkJfQorCisJCWlmIChzdHIgLSBzcCA+IDMpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJc3RybmNweShidWYsIHNwLCBzdHIgLSBzcCk7CisJCWlmIChhdG9pKGJ1ZikgPiAyNTUpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJaWYgKGRvdHMgPT0gMykgeworCQkJaWYgKCpzdHIgPT0gJy8nKSB7CisJCQkJaWYgKCooc3RyICsgMSkgPT0gJ1wwJykKKwkJCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCQkJCXN0cisrOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmICgqc3RyID09ICdcMCcpCisJCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKwkJfQorCisJCWlmICgqc3RyID09ICdcMCcpCisJCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJCXN0cisrOworCX0KKworCXNwID0gc3RyOworCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKKwkJaWYgKCFpc2RpZ2l0KChpbnQpKnN0cikpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJc3RyKys7CisJfQorCisJaWYgKGF0b2koc3ApID4gMzIpCisJCXJldHVybiBub19tYXRjaDsKKworCXJldHVybiBleGFjdF9tYXRjaDsKK30KKworI2RlZmluZSBJUFY2X0FERFJfU1RSCQkiMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRjouJSIKKyNkZWZpbmUgSVBWNl9QUkVGSVhfU1RSCQkiMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRjouJS8iCisjZGVmaW5lIFNUQVRFX1NUQVJUCQkxCisjZGVmaW5lIFNUQVRFX0NPTE9OCQkyCisjZGVmaW5lIFNUQVRFX0RPVUJMRQkJMworI2RlZmluZSBTVEFURV9BRERSCQk0CisjZGVmaW5lIFNUQVRFX0RPVCAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgU1RBVEVfU0xBU0gJCTYKKyNkZWZpbmUgU1RBVEVfTUFTSwkJNworCisjaWZkZWYgSEFWRV9JUFY2CisKK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUgY21kX2lwdjZfbWF0Y2goY29uc3QgY2hhciAqc3RyKQoreworCWludCBzdGF0ZSA9IFNUQVRFX1NUQVJUOworCWludCBjb2xvbnMgPSAwLCBudW1zID0gMCwgZG91YmxlX2NvbG9uID0gMDsKKwljb25zdCBjaGFyICpzcCA9IE5VTEw7CisJc3RydWN0IHNvY2thZGRyX2luNiBzaW42X2R1bW15OworCWludCByZXQ7CisKKwlpZiAoc3RyID09IE5VTEwpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwlpZiAoc3Ryc3BuKHN0ciwgSVBWNl9BRERSX1NUUikgIT0gc3RybGVuKHN0cikpCisJCXJldHVybiBub19tYXRjaDsKKworCS8qIHVzZSBpbmV0X3B0b24gdGhhdCBoYXMgYSBiZXR0ZXIgc3VwcG9ydCwKKwkgKiBmb3IgZXhhbXBsZSBpbmV0X3B0b24gY2FuIHN1cHBvcnQgdGhlIGF1dG9tYXRpYyBhZGRyZXNzZXM6CisJICogIDo6MS4yLjMuNAorCSAqLworCXJldCA9IGluZXRfcHRvbihBRl9JTkVUNiwgc3RyLCAmc2luNl9kdW1teS5zaW42X2FkZHIpOworCisJaWYgKHJldCA9PSAxKQorCQlyZXR1cm4gZXhhY3RfbWF0Y2g7CisKKwl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBTVEFURV9TVEFSVDoKKwkJCWlmICgqc3RyID09ICc6JykgeworCQkJCWlmICgqKHN0ciArIDEpICE9ICc6JyAmJiAqKHN0ciArIDEpICE9ICdcMCcpCisJCQkJCXJldHVybiBub19tYXRjaDsKKwkJCQljb2xvbnMtLTsKKwkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJfSBlbHNlIHsKKwkJCQlzcCA9IHN0cjsKKwkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisKKwkJCWNvbnRpbnVlOworCQljYXNlIFNUQVRFX0NPTE9OOgorCQkJY29sb25zKys7CisJCQlpZiAoKihzdHIgKyAxKSA9PSAnOicpCisJCQkJc3RhdGUgPSBTVEFURV9ET1VCTEU7CisJCQllbHNlIHsKKwkJCQlzcCA9IHN0ciArIDE7CisJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfRE9VQkxFOgorCQkJaWYgKGRvdWJsZV9jb2xvbikKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JykKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisJCQllbHNlIHsKKwkJCQlpZiAoKihzdHIgKyAxKSAhPSAnXDAnKQorCQkJCQljb2xvbnMrKzsKKwkJCQlzcCA9IHN0ciArIDE7CisJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCisJCQlkb3VibGVfY29sb24rKzsKKwkJCW51bXMrKzsKKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0FERFI6CisJCQlpZiAoKihzdHIgKyAxKSA9PSAnOicgfHwgKihzdHIgKyAxKSA9PSAnXDAnKSB7CisJCQkJaWYgKHN0ciAtIHNwID4gMykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJbnVtcysrOworCQkJCXN0YXRlID0gU1RBVEVfQ09MT047CisJCQl9CisJCQlpZiAoKihzdHIgKyAxKSA9PSAnLicpCisJCQkJc3RhdGUgPSBTVEFURV9ET1Q7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9ET1Q6CisJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG51bXMgPiA4KQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCWlmIChjb2xvbnMgPiA3KQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cisrOworCX0KKworI2lmIDAKKwlpZiAobnVtcyA8IDExKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworI2VuZGlmCQkJCS8qIDAgKi8KKworCXJldHVybiBleGFjdF9tYXRjaDsKK30KKworc3RhdGljIGVudW0gbWF0Y2hfdHlwZSBjbWRfaXB2Nl9wcmVmaXhfbWF0Y2goY29uc3QgY2hhciAqc3RyKQoreworCWludCBzdGF0ZSA9IFNUQVRFX1NUQVJUOworCWludCBjb2xvbnMgPSAwLCBudW1zID0gMCwgZG91YmxlX2NvbG9uID0gMDsKKwlpbnQgbWFzazsKKwljb25zdCBjaGFyICpzcCA9IE5VTEw7CisJY2hhciAqZW5kcHRyID0gTlVMTDsKKworCWlmIChzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCWlmIChzdHJzcG4oc3RyLCBJUFY2X1BSRUZJWF9TVFIpICE9IHN0cmxlbihzdHIpKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwl3aGlsZSAoKnN0ciAhPSAnXDAnICYmIHN0YXRlICE9IFNUQVRFX01BU0spIHsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFNUQVRFX1NUQVJUOgorCQkJaWYgKCpzdHIgPT0gJzonKSB7CisJCQkJaWYgKCooc3RyICsgMSkgIT0gJzonICYmICooc3RyICsgMSkgIT0gJ1wwJykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJCWNvbG9ucy0tOworCQkJCXN0YXRlID0gU1RBVEVfQ09MT047CisJCQl9IGVsc2UgeworCQkJCXNwID0gc3RyOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKworCQkJY29udGludWU7CisJCWNhc2UgU1RBVEVfQ09MT046CisJCQljb2xvbnMrKzsKKwkJCWlmICgqKHN0ciArIDEpID09ICcvJykKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisJCQllbHNlIGlmICgqKHN0ciArIDEpID09ICc6JykKKwkJCQlzdGF0ZSA9IFNUQVRFX0RPVUJMRTsKKwkJCWVsc2UgeworCQkJCXNwID0gc3RyICsgMTsKKwkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9ET1VCTEU6CisJCQlpZiAoZG91YmxlX2NvbG9uKQorCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCXJldHVybiBub19tYXRjaDsKKwkJCWVsc2UgeworCQkJCWlmICgqKHN0ciArIDEpICE9ICdcMCcgJiYgKihzdHIgKyAxKSAhPSAnLycpCisJCQkJCWNvbG9ucysrOworCQkJCXNwID0gc3RyICsgMTsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICcvJykKKwkJCQkJc3RhdGUgPSBTVEFURV9TTEFTSDsKKwkJCQllbHNlCisJCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKworCQkJZG91YmxlX2NvbG9uKys7CisJCQludW1zICs9IDE7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9BRERSOgorCQkJaWYgKCooc3RyICsgMSkgPT0gJzonIHx8ICooc3RyICsgMSkgPT0gJy4nCisJCQkgICAgfHwgKihzdHIgKyAxKSA9PSAnXDAnIHx8ICooc3RyICsgMSkgPT0gJy8nKSB7CisJCQkJaWYgKHN0ciAtIHNwID4gMykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJZm9yICg7IHNwIDw9IHN0cjsgc3ArKykKKwkJCQkJaWYgKCpzcCA9PSAnLycpCisJCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQludW1zKys7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnOicpCisJCQkJCXN0YXRlID0gU1RBVEVfQ09MT047CisJCQkJZWxzZSBpZiAoKihzdHIgKyAxKSA9PSAnLicpCisJCQkJCXN0YXRlID0gU1RBVEVfRE9UOworCQkJCWVsc2UgaWYgKCooc3RyICsgMSkgPT0gJy8nKQorCQkJCQlzdGF0ZSA9IFNUQVRFX1NMQVNIOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfRE9UOgorCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfU0xBU0g6CisJCQlpZiAoKihzdHIgKyAxKSA9PSAnXDAnKQorCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJCXN0YXRlID0gU1RBVEVfTUFTSzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAobnVtcyA+IDExKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCWlmIChjb2xvbnMgPiA3KQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cisrOworCX0KKworCWlmIChzdGF0ZSA8IFNUQVRFX01BU0spCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwltYXNrID0gc3RydG9sKHN0ciwgJmVuZHB0ciwgMTApOworCWlmICgqZW5kcHRyICE9ICdcMCcpCisJCXJldHVybiBub19tYXRjaDsKKworCWlmIChtYXNrIDwgMCB8fCBtYXNrID4gMTI4KQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKy8qIEkgZG9uJ3Qga25vdyB3aHkgbWFzayA8IDEzIG1ha2VzIGNvbW1hbmQgbWF0Y2ggcGFydGx5LgorICAgRm9yZ2l2ZSBtZSB0byBtYWtlIHRoaXMgY29tbWVudHMuIEkgV2FudCB0byBzZXQgc3RhdGljIGRlZmF1bHQgcm91dGUKKyAgIGJlY2F1c2Ugb2YgbGFjayBvZiBmdW5jdGlvbiB0byBvcmlnaW5hdGUgZGVmYXVsdCBpbiBvc3BmNmQ7IHNvcnJ5CisgICAgICAgeWFzdQorICBpZiAobWFzayA8IDEzKQorICAgIHJldHVybiBwYXJ0bHlfbWF0Y2g7CisqLworCisJcmV0dXJuIGV4YWN0X21hdGNoOworfQorCisjZW5kaWYJCQkJLyogSEFWRV9JUFY2ICAqLworCisjZGVmaW5lIERFQ0lNQUxfU1RSTEVOX01BWCAxMAorCitzdGF0aWMgaW50IGNtZF9yYW5nZV9tYXRjaChjb25zdCBjaGFyICpyYW5nZSwgY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgKnA7CisJY2hhciBidWZbREVDSU1BTF9TVFJMRU5fTUFYICsgMV07CisJY2hhciAqZW5kcHRyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIG1pbiwgbWF4LCB2YWw7CisKKwlpZiAoc3RyID09IE5VTEwpCisJCXJldHVybiAxOworCisJdmFsID0gc3RydG91bChzdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoKmVuZHB0ciAhPSAnXDAnKQorCQlyZXR1cm4gMDsKKworCXJhbmdlKys7CisJcCA9IHN0cmNocihyYW5nZSwgJy0nKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAocCAtIHJhbmdlID4gREVDSU1BTF9TVFJMRU5fTUFYKQorCQlyZXR1cm4gMDsKKwlzdHJuY3B5KGJ1ZiwgcmFuZ2UsIHAgLSByYW5nZSk7CisJYnVmW3AgLSByYW5nZV0gPSAnXDAnOworCW1pbiA9IHN0cnRvdWwoYnVmLCAmZW5kcHRyLCAxMCk7CisJaWYgKCplbmRwdHIgIT0gJ1wwJykKKwkJcmV0dXJuIDA7CisKKwlyYW5nZSA9IHAgKyAxOworCXAgPSBzdHJjaHIocmFuZ2UsICc+Jyk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKHAgLSByYW5nZSA+IERFQ0lNQUxfU1RSTEVOX01BWCkKKwkJcmV0dXJuIDA7CisJc3RybmNweShidWYsIHJhbmdlLCBwIC0gcmFuZ2UpOworCWJ1ZltwIC0gcmFuZ2VdID0gJ1wwJzsKKwltYXggPSBzdHJ0b3VsKGJ1ZiwgJmVuZHB0ciwgMTApOworCWlmICgqZW5kcHRyICE9ICdcMCcpCisJCXJldHVybiAwOworCisJaWYgKHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qIE1ha2UgY29tcGxldGlvbiBtYXRjaCBhbmQgcmV0dXJuIG1hdGNoIHR5cGUgZmxhZy4gKi8KK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUKK2NtZF9maWx0ZXJfYnlfY29tcGxldGlvbihjaGFyICpjb21tYW5kLCB2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGluZGV4KQoreworCXVuc2lnbmVkIGludCBpOworCWNvbnN0IGNoYXIgKnN0cjsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCWVudW0gbWF0Y2hfdHlwZSBtYXRjaF90eXBlOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJbWF0Y2hfdHlwZSA9IG5vX21hdGNoOworCisJLyogSWYgY29tbWFuZCBhbmQgY21kX2VsZW1lbnQgc3RyaW5nIGRvZXMgbm90IG1hdGNoIHNldCBOVUxMIHRvIHZlY3RvciAqLworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHYpOyBpKyspCisJCWlmICgoY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkgeworCQkJaWYgKGluZGV4ID49IHZlY3Rvcl9hY3RpdmUoY21kX2VsZW1lbnQtPnN0cnZlYykpCisJCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOworCQkJZWxzZSB7CisJCQkJdW5zaWduZWQgaW50IGo7CisJCQkJaW50IG1hdGNoZWQgPSAwOworCisJCQkJZGVzY3ZlYyA9CisJCQkJICAgIHZlY3Rvcl9zbG90KGNtZF9lbGVtZW50LT5zdHJ2ZWMsIGluZGV4KTsKKworCQkJCWZvciAoaiA9IDA7IGogPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOyBqKyspCisJCQkJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgeworCQkJCQkJc3RyID0gZGVzYy0+Y21kOworCisJCQkJCQlpZiAoQ01EX1ZBUkFSRyhzdHIpKSB7CisJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCSAgICB2YXJhcmdfbWF0Y2gpCisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgdmFyYXJnX21hdGNoOworCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCX0gZWxzZSBpZiAoQ01EX1JBTkdFKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX3JhbmdlX21hdGNoCisJCQkJCQkJICAgIChzdHIsIGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIHJhbmdlX21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICByYW5nZV9tYXRjaDsKKworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorI2lmZGVmIEhBVkVfSVBWNgorCQkJCQkJZWxzZSBpZiAoQ01EX0lQVjYoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2Nl9tYXRjaAorCQkJCQkJCSAgICAoY29tbWFuZCkpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2Nl9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2Nl9tYXRjaDsKKworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChDTURfSVBWNl9QUkVGSVgoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2Nl9wcmVmaXhfbWF0Y2goY29tbWFuZCkpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2Nl9wcmVmaXhfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoOworCisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9CisjZW5kaWYJCQkJLyogSEFWRV9JUFY2ICAqLworCQkJCQkJZWxzZSBpZiAoQ01EX0lQVjQoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2NF9tYXRjaAorCQkJCQkJCSAgICAoY29tbWFuZCkpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2NF9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2NF9tYXRjaDsKKworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChDTURfSVBWNF9QUkVGSVgoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2NF9wcmVmaXhfbWF0Y2goY29tbWFuZCkpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2NF9wcmVmaXhfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjRfcHJlZml4X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlCisJCQkJCQkJLyogQ2hlY2sgaXMgdGhpcyBwb2ludCdzIGFyZ3VtZW50IG9wdGlvbmFsID8gKi8KKwkJCQkJCWlmIChDTURfT1BUSU9OKHN0cikKKwkJCQkJCQkgICAgfHwKKwkJCQkJCQkgICAgQ01EX1ZBUklBQkxFKHN0cikpIHsKKwkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJICAgIGV4dGVuZF9tYXRjaCkKKwkJCQkJCQkJbWF0Y2hfdHlwZSA9CisJCQkJCQkJCSAgICBleHRlbmRfbWF0Y2g7CisJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJfSBlbHNlCisJCQkJCQkgICAgaWYgKHN0cm5jbXAKKwkJCQkJCQkoY29tbWFuZCwgc3RyLAorCQkJCQkJCSBzdHJsZW4oY29tbWFuZCkpID09CisJCQkJCQkJMCkgeworCQkJCQkJCWlmIChzdHJjbXAoY29tbWFuZCwgc3RyKQorCQkJCQkJCSAgICA9PSAwKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIGV4YWN0X21hdGNoOworCQkJCQkJCWVsc2UgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBwYXJ0bHlfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIHBhcnRseV9tYXRjaDsKKwkJCQkJCQl9CisJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJfQorCQkJCQl9CisJCQkJaWYgKCFtYXRjaGVkKQorCQkJCQl2ZWN0b3Jfc2xvdCh2LCBpKSA9IE5VTEw7CisJCQl9CisJCX0KKwlyZXR1cm4gbWF0Y2hfdHlwZTsKK30KKworLyogRmlsdGVyIHZlY3RvciBieSBjb21tYW5kIGNoYXJhY3RlciB3aXRoIGluZGV4LiAqLworc3RhdGljIGVudW0gbWF0Y2hfdHlwZQorY21kX2ZpbHRlcl9ieV9zdHJpbmcoY2hhciAqY29tbWFuZCwgdmVjdG9yIHYsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyICpzdHI7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2hfdHlwZTsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCW1hdGNoX3R5cGUgPSBub19tYXRjaDsKKworCS8qIElmIGNvbW1hbmQgYW5kIGNtZF9lbGVtZW50IHN0cmluZyBkb2VzIG5vdCBtYXRjaCBzZXQgTlVMTCB0byB2ZWN0b3IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpIHsKKwkJCS8qIElmIGdpdmVuIGluZGV4IGlzIGJpZ2dlciB0aGFuIG1heCBzdHJpbmcgdmVjdG9yIG9mIGNvbW1hbmQsCisJCQkgICBzZXQgTlVMTCAqLworCQkJaWYgKGluZGV4ID49IHZlY3Rvcl9hY3RpdmUoY21kX2VsZW1lbnQtPnN0cnZlYykpCisJCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOworCQkJZWxzZSB7CisJCQkJdW5zaWduZWQgaW50IGo7CisJCQkJaW50IG1hdGNoZWQgPSAwOworCisJCQkJZGVzY3ZlYyA9CisJCQkJICAgIHZlY3Rvcl9zbG90KGNtZF9lbGVtZW50LT5zdHJ2ZWMsIGluZGV4KTsKKworCQkJCWZvciAoaiA9IDA7IGogPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOyBqKyspCisJCQkJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgeworCQkJCQkJc3RyID0gZGVzYy0+Y21kOworCisJCQkJCQlpZiAoQ01EX1ZBUkFSRyhzdHIpKSB7CisJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCSAgICB2YXJhcmdfbWF0Y2gpCisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgdmFyYXJnX21hdGNoOworCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCX0gZWxzZSBpZiAoQ01EX1JBTkdFKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX3JhbmdlX21hdGNoCisJCQkJCQkJICAgIChzdHIsIGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIHJhbmdlX21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICByYW5nZV9tYXRjaDsKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0KKyNpZmRlZiBIQVZFX0lQVjYKKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY2KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjZfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpID09CisJCQkJCQkJICAgIGV4YWN0X21hdGNoKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjZfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjZfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9JUFY2X1BSRUZJWChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY2X3ByZWZpeF9tYXRjaChjb21tYW5kKSA9PSBleGFjdF9tYXRjaCkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY2X3ByZWZpeF9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2Nl9wcmVmaXhfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9CisjZW5kaWYJCQkJLyogSEFWRV9JUFY2ICAqLworCQkJCQkJZWxzZSBpZiAoQ01EX0lQVjQoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2NF9tYXRjaAorCQkJCQkJCSAgICAoY29tbWFuZCkgPT0KKwkJCQkJCQkgICAgZXhhY3RfbWF0Y2gpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2NF9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2NF9tYXRjaDsKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjRfUFJFRklYKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfcHJlZml4X21hdGNoKGNvbW1hbmQpID09IGV4YWN0X21hdGNoKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfcHJlZml4X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaDsKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoQ01EX09QVElPTihzdHIpCisJCQkJCQkJICAgfHwgQ01EX1ZBUklBQkxFKHN0cikpCisJCQkJCQl7CisJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCSAgICBleHRlbmRfbWF0Y2gpCisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgZXh0ZW5kX21hdGNoOworCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKHN0cmNtcChjb21tYW5kLCBzdHIpCisJCQkJCQkJICAgID09IDApIHsKKwkJCQkJCQkJbWF0Y2hfdHlwZSA9CisJCQkJCQkJCSAgICBleGFjdF9tYXRjaDsKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCWlmICghbWF0Y2hlZCkKKwkJCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOworCQkJfQorCQl9CisJcmV0dXJuIG1hdGNoX3R5cGU7Cit9CisKKy8qIENoZWNrIGFtYmlndW91cyBtYXRjaCAqLworc3RhdGljIGludAoraXNfY21kX2FtYmlndW91cyhjaGFyICpjb21tYW5kLCB2ZWN0b3IgdiwgaW50IGluZGV4LCBlbnVtIG1hdGNoX3R5cGUgdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgajsKKwljb25zdCBjaGFyICpzdHIgPSBOVUxMOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJY29uc3QgY2hhciAqbWF0Y2hlZCA9IE5VTEw7CisJdmVjdG9yIGRlc2N2ZWM7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpIHsKKwkJCWludCBtYXRjaCA9IDA7CisKKwkJCWRlc2N2ZWMgPSB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLCBpbmRleCk7CisKKwkJCWZvciAoaiA9IDA7IGogPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOyBqKyspCisJCQkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3ZlYywgaikpKSB7CisJCQkJCWVudW0gbWF0Y2hfdHlwZSByZXQ7CisKKwkJCQkJc3RyID0gZGVzYy0+Y21kOworCisJCQkJCXN3aXRjaCAodHlwZSkgeworCQkJCQljYXNlIGV4YWN0X21hdGNoOgorCQkJCQkJaWYgKCEKKwkJCQkJCSAgICAoQ01EX09QVElPTihzdHIpCisJCQkJCQkgICAgIHx8IENNRF9WQVJJQUJMRShzdHIpKQorJiYgc3RyY21wKGNvbW1hbmQsIHN0cikgPT0gMCkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgcGFydGx5X21hdGNoOgorCQkJCQkJaWYgKCEKKwkJCQkJCSAgICAoQ01EX09QVElPTihzdHIpCisJCQkJCQkgICAgIHx8IENNRF9WQVJJQUJMRShzdHIpKQorJiYgc3RybmNtcChjb21tYW5kLCBzdHIsIHN0cmxlbihjb21tYW5kKSkgPT0gMCkgeworCQkJCQkJCWlmIChtYXRjaGVkCisJCQkJCQkJICAgICYmIHN0cmNtcChtYXRjaGVkLAorCQkJCQkJCQkgICAgICBzdHIpICE9IDApCisJCQkJCQkJCXJldHVybiAxOwkvKiBUaGVyZSBpcyBhbWJpZ3VvdXMgbWF0Y2guICovCisJCQkJCQkJZWxzZQorCQkJCQkJCQltYXRjaGVkID0gc3RyOworCQkJCQkJCW1hdGNoKys7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSByYW5nZV9tYXRjaDoKKwkJCQkJCWlmIChjbWRfcmFuZ2VfbWF0Y2gKKwkJCQkJCSAgICAoc3RyLCBjb21tYW5kKSkgeworCQkJCQkJCWlmIChtYXRjaGVkCisJCQkJCQkJICAgICYmIHN0cmNtcChtYXRjaGVkLAorCQkJCQkJCQkgICAgICBzdHIpICE9IDApCisJCQkJCQkJCXJldHVybiAxOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJbWF0Y2hlZCA9IHN0cjsKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisjaWZkZWYgSEFWRV9JUFY2CisJCQkJCWNhc2UgaXB2Nl9tYXRjaDoKKwkJCQkJCWlmIChDTURfSVBWNihzdHIpKQorCQkJCQkJCW1hdGNoKys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBpcHY2X3ByZWZpeF9tYXRjaDoKKwkJCQkJCWlmICgocmV0ID0KKwkJCQkJCSAgICAgY21kX2lwdjZfcHJlZml4X21hdGNoCisJCQkJCQkgICAgIChjb21tYW5kKSkgIT0gbm9fbWF0Y2gpIHsKKwkJCQkJCQlpZiAocmV0ID09IHBhcnRseV9tYXRjaCkKKwkJCQkJCQkJcmV0dXJuIDI7CS8qIFRoZXJlIGlzIGluY29tcGxldGUgbWF0Y2guICovCisKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisjZW5kaWYJCQkJLyogSEFWRV9JUFY2ICovCisJCQkJCWNhc2UgaXB2NF9tYXRjaDoKKwkJCQkJCWlmIChDTURfSVBWNChzdHIpKQorCQkJCQkJCW1hdGNoKys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBpcHY0X3ByZWZpeF9tYXRjaDoKKwkJCQkJCWlmICgocmV0ID0KKwkJCQkJCSAgICAgY21kX2lwdjRfcHJlZml4X21hdGNoCisJCQkJCQkgICAgIChjb21tYW5kKSkgIT0gbm9fbWF0Y2gpIHsKKwkJCQkJCQlpZiAocmV0ID09IHBhcnRseV9tYXRjaCkKKwkJCQkJCQkJcmV0dXJuIDI7CS8qIFRoZXJlIGlzIGluY29tcGxldGUgbWF0Y2guICovCisKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgZXh0ZW5kX21hdGNoOgorCQkJCQkJaWYgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJICAgIHx8IENNRF9WQVJJQUJMRShzdHIpKQorCQkJCQkJCW1hdGNoKys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBub19tYXRjaDoKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJaWYgKCFtYXRjaCkKKwkJCQl2ZWN0b3Jfc2xvdCh2LCBpKSA9IE5VTEw7CisJCX0KKwlyZXR1cm4gMDsKK30KKworLyogSWYgc3JjIG1hdGNoZXMgZHN0IHJldHVybiBkc3Qgc3RyaW5nLCBvdGhlcndpc2UgcmV0dXJuIE5VTEwgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjbWRfZW50cnlfZnVuY3Rpb24oY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICpkc3QpCit7CisJLyogU2tpcCB2YXJpYWJsZSBhcmd1bWVudHMuICovCisJaWYgKENNRF9PUFRJT04oZHN0KSB8fCBDTURfVkFSSUFCTEUoZHN0KSB8fCBDTURfVkFSQVJHKGRzdCkgfHwKKwkgICAgQ01EX0lQVjQoZHN0KSB8fCBDTURfSVBWNF9QUkVGSVgoZHN0KSB8fCBDTURfUkFOR0UoZHN0KSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBJbiBjYXNlIG9mICdjb21tYW5kIFx0JywgZ2l2ZW4gc3JjIGlzIE5VTEwgc3RyaW5nLiAqLworCWlmIChzcmMgPT0gTlVMTCkKKwkJcmV0dXJuIGRzdDsKKworCS8qIE1hdGNoZWQgd2l0aCBpbnB1dCBzdHJpbmcuICovCisJaWYgKHN0cm5jbXAoc3JjLCBkc3QsIHN0cmxlbihzcmMpKSA9PSAwKQorCQlyZXR1cm4gZHN0OworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIElmIHNyYyBtYXRjaGVzIGRzdCByZXR1cm4gZHN0IHN0cmluZywgb3RoZXJ3aXNlIHJldHVybiBOVUxMICovCisvKiBUaGlzIHZlcnNpb24gd2lsbCByZXR1cm4gdGhlIGRzdCBzdHJpbmcgYWx3YXlzIGlmIGl0IGlzCisgICBDTURfVkFSSUFCTEUgZm9yICc/JyBrZXkgcHJvY2Vzc2luZyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9lbnRyeV9mdW5jdGlvbl9kZXNjKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZHN0KQoreworCWlmIChDTURfVkFSQVJHKGRzdCkpCisJCXJldHVybiBkc3Q7CisKKwlpZiAoQ01EX1JBTkdFKGRzdCkpIHsKKwkJaWYgKGNtZF9yYW5nZV9tYXRjaChkc3QsIHNyYykpCisJCQlyZXR1cm4gZHN0OworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9CisjaWZkZWYgSEFWRV9JUFY2CisJaWYgKENNRF9JUFY2KGRzdCkpIHsKKwkJaWYgKGNtZF9pcHY2X21hdGNoKHNyYykpCisJCQlyZXR1cm4gZHN0OworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoQ01EX0lQVjZfUFJFRklYKGRzdCkpIHsKKwkJaWYgKGNtZF9pcHY2X3ByZWZpeF9tYXRjaChzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAqLworCisJaWYgKENNRF9JUFY0KGRzdCkpIHsKKwkJaWYgKGNtZF9pcHY0X21hdGNoKHNyYykpCisJCQlyZXR1cm4gZHN0OworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoQ01EX0lQVjRfUFJFRklYKGRzdCkpIHsKKwkJaWYgKGNtZF9pcHY0X3ByZWZpeF9tYXRjaChzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogT3B0aW9uYWwgb3IgdmFyaWFibGUgY29tbWFuZHMgYWx3YXlzIG1hdGNoIG9uICc/JyAqLworCWlmIChDTURfT1BUSU9OKGRzdCkgfHwgQ01EX1ZBUklBQkxFKGRzdCkpCisJCXJldHVybiBkc3Q7CisKKwkvKiBJbiBjYXNlIG9mICdjb21tYW5kIFx0JywgZ2l2ZW4gc3JjIGlzIE5VTEwgc3RyaW5nLiAqLworCWlmIChzcmMgPT0gTlVMTCkKKwkJcmV0dXJuIGRzdDsKKworCWlmIChzdHJuY21wKHNyYywgZHN0LCBzdHJsZW4oc3JjKSkgPT0gMCkKKwkJcmV0dXJuIGRzdDsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCisvKiBDaGVjayBzYW1lIHN0cmluZyBlbGVtZW50IGV4aXN0ZW5jZS4gIElmIGl0IGlzbid0IHRoZXJlIHJldHVybgorICAgIDEuICovCitzdGF0aWMgaW50IGNtZF91bmlxdWVfc3RyaW5nKHZlY3RvciB2LCBjb25zdCBjaGFyICpzdHIpCit7CisJdW5zaWduZWQgaW50IGk7CisJY2hhciAqbWF0Y2g7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKG1hdGNoID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpCisJCQlpZiAoc3RyY21wKG1hdGNoLCBzdHIpID09IDApCisJCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qIENvbXBhcmUgc3RyaW5nIHRvIGRlc2NyaXB0aW9uIHZlY3Rvci4gIElmIHRoZXJlIGlzIHNhbWUgc3RyaW5nCisgICByZXR1cm4gMSBlbHNlIHJldHVybiAwLiAqLworc3RhdGljIGludCBkZXNjX3VuaXF1ZV9zdHJpbmcodmVjdG9yIHYsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHYpOyBpKyspCisJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKQorCQkJaWYgKHN0cmNtcChkZXNjLT5jbWQsIHN0cikgPT0gMCkKKwkJCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbWRfdHJ5X2RvX3Nob3J0Y3V0KGVudW0gbm9kZV90eXBlIG5vZGUsIGNoYXIgKmZpcnN0X3dvcmQpCit7CisJaWYgKGZpcnN0X3dvcmQgIT0gTlVMTCAmJgorCSAgICBub2RlICE9IEFVVEhfTk9ERSAmJgorCSAgICBub2RlICE9IFZJRVdfTk9ERSAmJgorCSAgICBub2RlICE9IEFVVEhfRU5BQkxFX05PREUgJiYKKwkgICAgbm9kZSAhPSBFTkFCTEVfTk9ERSAmJiAwID09IHN0cmNtcCgiZG8iLCBmaXJzdF93b3JkKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qICc/JyBkZXNjcmliZSBjb21tYW5kIHN1cHBvcnQuICovCitzdGF0aWMgdmVjdG9yCitjbWRfZGVzY3JpYmVfY29tbWFuZF9yZWFsKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LCBpbnQgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl2ZWN0b3IgY21kX3ZlY3RvcjsKKyNkZWZpbmUgSU5JVF9NQVRDSFZFQ19TSVpFIDEwCisJdmVjdG9yIG1hdGNodmVjOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJdW5zaWduZWQgaW50IGluZGV4OworCWludCByZXQ7CisJZW51bSBtYXRjaF90eXBlIG1hdGNoOworCWNoYXIgKmNvbW1hbmQ7CisJc3RhdGljIHN0cnVjdCBkZXNjIGRlc2NfY3IgPSB7ICI8Y3I+IiwgIiIgfTsKKworCS8qIFNldCBpbmRleC4gKi8KKwlpZiAodmVjdG9yX2FjdGl2ZSh2bGluZSkgPT0gMCkgeworCQkqc3RhdHVzID0gQ01EX0VSUl9OT19NQVRDSDsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlCisJCWluZGV4ID0gdmVjdG9yX2FjdGl2ZSh2bGluZSkgLSAxOworCisJLyogTWFrZSBjb3B5IHZlY3RvciBvZiBjdXJyZW50IG5vZGUncyBjb21tYW5kIHZlY3Rvci4gKi8KKwljbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisKKwkvKiBQcmVwYXJlIG1hdGNoIHZlY3RvciAqLworCW1hdGNodmVjID0gdmVjdG9yX2luaXQoSU5JVF9NQVRDSFZFQ19TSVpFKTsKKworCS8qIEZpbHRlciBjb21tYW5kcy4gKi8KKwkvKiBPbmx5IHdvcmRzIHByZWNlZGVzIGN1cnJlbnQgd29yZCB3aWxsIGJlIGNoZWNrZWQgaW4gdGhpcyBsb29wLiAqLworCWZvciAoaSA9IDA7IGkgPCBpbmRleDsgaSsrKQorCQlpZiAoKGNvbW1hbmQgPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSkpKSB7CisJCQltYXRjaCA9CisJCQkgICAgY21kX2ZpbHRlcl9ieV9jb21wbGV0aW9uKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGkpOworCisJCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoKSB7CisJCQkJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwkJCQl2ZWN0b3IgZGVzY3ZlYzsKKwkJCQl1bnNpZ25lZCBpbnQgaiwgazsKKworCQkJCWZvciAoaiA9IDA7IGogPCB2ZWN0b3JfYWN0aXZlKGNtZF92ZWN0b3IpOyBqKyspCisJCQkJCWlmICgoY21kX2VsZW1lbnQgPQorCQkJCQkgICAgIHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGopKSAhPSBOVUxMCisJCQkJCSAgICAmJgorCQkJCQkgICAgKHZlY3Rvcl9hY3RpdmUKKwkJCQkJICAgICAoY21kX2VsZW1lbnQtPnN0cnZlYykpKSB7CisJCQkJCQlkZXNjdmVjID0KKwkJCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+CisJCQkJCQkJCXN0cnZlYywKKwkJCQkJCQkJdmVjdG9yX2FjdGl2ZQorCQkJCQkJCQkoY21kX2VsZW1lbnQtPgorCQkJCQkJCQkgc3RydmVjKSAtIDEpOworCQkJCQkJZm9yIChrID0gMDsKKwkJCQkJCSAgICAgayA8IHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYyk7CisJCQkJCQkgICAgIGsrKykgeworCQkJCQkJCXN0cnVjdCBkZXNjICpkZXNjID0KKwkJCQkJCQkgICAgdmVjdG9yX3Nsb3QoZGVzY3ZlYywKKwkJCQkJCQkJCWspOworCQkJCQkJCXZlY3Rvcl9zZXQobWF0Y2h2ZWMsCisJCQkJCQkJCSAgIGRlc2MpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLCAmZGVzY19jcik7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisKKwkJCQlyZXR1cm4gbWF0Y2h2ZWM7CisJCQl9CisKKwkJCWlmICgocmV0ID0KKwkJCSAgICAgaXNfY21kX2FtYmlndW91cyhjb21tYW5kLCBjbWRfdmVjdG9yLCBpLAorCQkJCQkgICAgICBtYXRjaCkpID09IDEpIHsKKwkJCQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKwkJCQkqc3RhdHVzID0gQ01EX0VSUl9BTUJJR1VPVVM7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9IGVsc2UgaWYgKHJldCA9PSAyKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKworCS8qIFByZXBhcmUgbWF0Y2ggdmVjdG9yICovCisJLyogIG1hdGNodmVjID0gdmVjdG9yX2luaXQgKElOSVRfTUFUQ0hWRUNfU0laRSk7ICovCisKKwkvKiBNYWtlIHN1cmUgdGhhdCBjbWRfdmVjdG9yIGlzIGZpbHRlcmVkIGJhc2VkIG9uIGN1cnJlbnQgd29yZCAqLworCWNvbW1hbmQgPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpOworCWlmIChjb21tYW5kKQorCQltYXRjaCA9IGNtZF9maWx0ZXJfYnlfY29tcGxldGlvbihjb21tYW5kLCBjbWRfdmVjdG9yLCBpbmRleCk7CisKKwkvKiBNYWtlIGRlc2NyaXB0aW9uIHZlY3Rvci4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkpICE9IE5VTEwpIHsKKwkJCWNvbnN0IGNoYXIgKnN0cmluZyA9IE5VTEw7CisJCQl2ZWN0b3Igc3RydmVjID0gY21kX2VsZW1lbnQtPnN0cnZlYzsKKworCQkJLyogaWYgY29tbWFuZCBpcyBOVUxMLCBpbmRleCBtYXkgYmUgZXF1YWwgdG8gdmVjdG9yX2FjdGl2ZSAqLworCQkJaWYgKGNvbW1hbmQgJiYgaW5kZXggPj0gdmVjdG9yX2FjdGl2ZShzdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCS8qIENoZWNrIGlmIGNvbW1hbmQgaXMgY29tcGxldGVkLiAqLworCQkJCWlmIChjb21tYW5kID09IE5VTEwKKwkJCQkgICAgJiYgaW5kZXggPT0gdmVjdG9yX2FjdGl2ZShzdHJ2ZWMpKSB7CisJCQkJCXN0cmluZyA9ICI8Y3I+IjsKKwkJCQkJaWYgKCFkZXNjX3VuaXF1ZV9zdHJpbmcKKwkJCQkJICAgIChtYXRjaHZlYywgc3RyaW5nKSkKKwkJCQkJCXZlY3Rvcl9zZXQobWF0Y2h2ZWMsICZkZXNjX2NyKTsKKwkJCQl9IGVsc2UgeworCQkJCQl1bnNpZ25lZCBpbnQgajsKKwkJCQkJdmVjdG9yIGRlc2N2ZWMgPQorCQkJCQkgICAgdmVjdG9yX3Nsb3Qoc3RydmVjLCBpbmRleCk7CisJCQkJCXN0cnVjdCBkZXNjICpkZXNjOworCisJCQkJCWZvciAoaiA9IDA7IGogPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOworCQkJCQkgICAgIGorKykKKwkJCQkJCWlmICgoZGVzYyA9CisJCQkJCQkgICAgIHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgeworCQkJCQkJCXN0cmluZyA9CisJCQkJCQkJICAgIGNtZF9lbnRyeV9mdW5jdGlvbl9kZXNjCisJCQkJCQkJICAgIChjb21tYW5kLAorCQkJCQkJCSAgICAgZGVzYy0+Y21kKTsKKwkJCQkJCQlpZiAoc3RyaW5nKSB7CisJCQkJCQkJCS8qIFVuaXF1ZW5lc3MgY2hlY2sgKi8KKwkJCQkJCQkJaWYgKCFkZXNjX3VuaXF1ZV9zdHJpbmcobWF0Y2h2ZWMsIHN0cmluZykpCisJCQkJCQkJCQl2ZWN0b3Jfc2V0CisJCQkJCQkJCQkgICAgKG1hdGNodmVjLAorCQkJCQkJCQkJICAgICBkZXNjKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisKKwlpZiAodmVjdG9yX3Nsb3QobWF0Y2h2ZWMsIDApID09IE5VTEwpIHsKKwkJdmVjdG9yX2ZyZWUobWF0Y2h2ZWMpOworCQkqc3RhdHVzID0gQ01EX0VSUl9OT19NQVRDSDsKKwl9IGVsc2UKKwkJKnN0YXR1cyA9IENNRF9TVUNDRVNTOworCisJcmV0dXJuIG1hdGNodmVjOworfQorCit2ZWN0b3IgY21kX2Rlc2NyaWJlX2NvbW1hbmQodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICogdnR5LCBpbnQgKnN0YXR1cykKK3sKKwl2ZWN0b3IgcmV0OworCisJaWYgKGNtZF90cnlfZG9fc2hvcnRjdXQodnR5LT5ub2RlLCB2ZWN0b3Jfc2xvdCh2bGluZSwgMCkpKSB7CisJCWVudW0gbm9kZV90eXBlIG9ub2RlOworCQl2ZWN0b3Igc2hpZnRlZF92bGluZTsKKwkJdW5zaWduZWQgaW50IGluZGV4OworCisJCW9ub2RlID0gdnR5LT5ub2RlOworCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJLyogV2UgY2FuIHRyeSBpdCBvbiBlbmFibGUgbm9kZSwgY29zJyB0aGUgdnR5IGlzIGF1dGhlbnRpY2F0ZWQgKi8KKworCQlzaGlmdGVkX3ZsaW5lID0gdmVjdG9yX2luaXQodmVjdG9yX2NvdW50KHZsaW5lKSk7CisJCS8qIHVzZSBtZW1jcHk/ICovCisJCWZvciAoaW5kZXggPSAxOyBpbmRleCA8IHZlY3Rvcl9hY3RpdmUodmxpbmUpOyBpbmRleCsrKSB7CisJCQl2ZWN0b3Jfc2V0X2luZGV4KHNoaWZ0ZWRfdmxpbmUsIGluZGV4IC0gMSwKKwkJCQkJIHZlY3Rvcl9sb29rdXAodmxpbmUsIGluZGV4KSk7CisJCX0KKworCQlyZXQgPSBjbWRfZGVzY3JpYmVfY29tbWFuZF9yZWFsKHNoaWZ0ZWRfdmxpbmUsIHZ0eSwgc3RhdHVzKTsKKworCQl2ZWN0b3JfZnJlZShzaGlmdGVkX3ZsaW5lKTsKKwkJdnR5LT5ub2RlID0gb25vZGU7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIGNtZF9kZXNjcmliZV9jb21tYW5kX3JlYWwodmxpbmUsIHZ0eSwgc3RhdHVzKTsKK30KKworLyogQ2hlY2sgTENEIG9mIG1hdGNoZWQgY29tbWFuZC4gKi8KK3N0YXRpYyBpbnQgY21kX2xjZChjaGFyICoqbWF0Y2hlZCkKK3sKKwlpbnQgaTsKKwlpbnQgajsKKwlpbnQgbGNkID0gLTE7CisJY2hhciAqczEsICpzMjsKKwljaGFyIGMxLCBjMjsKKworCWlmIChtYXRjaGVkWzBdID09IE5VTEwgfHwgbWF0Y2hlZFsxXSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDE7IG1hdGNoZWRbaV0gIT0gTlVMTDsgaSsrKSB7CisJCXMxID0gbWF0Y2hlZFtpIC0gMV07CisJCXMyID0gbWF0Y2hlZFtpXTsKKworCQlmb3IgKGogPSAwOyAoYzEgPSBzMVtqXSkgJiYgKGMyID0gczJbal0pOyBqKyspCisJCQlpZiAoYzEgIT0gYzIpCisJCQkJYnJlYWs7CisKKwkJaWYgKGxjZCA8IDApCisJCQlsY2QgPSBqOworCQllbHNlIHsKKwkJCWlmIChsY2QgPiBqKQorCQkJCWxjZCA9IGo7CisJCX0KKwl9CisJcmV0dXJuIGxjZDsKK30KKworLyogQ29tbWFuZCBsaW5lIGNvbXBsZXRpb24gc3VwcG9ydC4gKi8KK3N0YXRpYyBjaGFyICoqY21kX2NvbXBsZXRlX2NvbW1hbmRfcmVhbCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwKKwkJCQkJaW50ICpzdGF0dXMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdmVjdG9yIGNtZF92ZWN0b3IgPSB2ZWN0b3JfY29weShjbWRfbm9kZV92ZWN0b3IoY21kdmVjLCB2dHktPm5vZGUpKTsKKyNkZWZpbmUgSU5JVF9NQVRDSFZFQ19TSVpFIDEwCisJdmVjdG9yIG1hdGNodmVjOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJdW5zaWduZWQgaW50IGluZGV4OworCWNoYXIgKiptYXRjaF9zdHI7CisJc3RydWN0IGRlc2MgKmRlc2M7CisJdmVjdG9yIGRlc2N2ZWM7CisJY2hhciAqY29tbWFuZDsKKwlpbnQgbGNkOworCisJaWYgKHZlY3Rvcl9hY3RpdmUodmxpbmUpID09IDApIHsKKwkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJCXJldHVybiBOVUxMOworCX0gZWxzZQorCQlpbmRleCA9IHZlY3Rvcl9hY3RpdmUodmxpbmUpIC0gMTsKKworCS8qIEZpcnN0LCBmaWx0ZXIgYnkgcHJlY2VlZGluZyBjb21tYW5kIHN0cmluZyAqLworCWZvciAoaSA9IDA7IGkgPCBpbmRleDsgaSsrKQorCQlpZiAoKGNvbW1hbmQgPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSkpKSB7CisJCQllbnVtIG1hdGNoX3R5cGUgbWF0Y2g7CisJCQlpbnQgcmV0OworCisJCQkvKiBGaXJzdCB0cnkgY29tcGxldGlvbiBtYXRjaCwgaWYgdGhlcmUgaXMgZXhhY3RseSBtYXRjaCByZXR1cm4gMSAqLworCQkJbWF0Y2ggPQorCQkJICAgIGNtZF9maWx0ZXJfYnlfY29tcGxldGlvbihjb21tYW5kLCBjbWRfdmVjdG9yLCBpKTsKKworCQkJLyogSWYgdGhlcmUgaXMgZXhhY3QgbWF0Y2ggdGhlbiBmaWx0ZXIgYW1iaWd1b3VzIG1hdGNoIGVsc2UgY2hlY2sKKwkJCSAgIGFtYmlndW91c25lc3MuICovCisJCQlpZiAoKHJldCA9CisJCQkgICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaSwKKwkJCQkJICAgICAgbWF0Y2gpKSA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJKnN0YXR1cyA9IENNRF9FUlJfQU1CSUdVT1VTOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJLyoKKwkJCSAgIGVsc2UgaWYgKHJldCA9PSAyKQorCQkJICAgeworCQkJICAgdmVjdG9yX2ZyZWUgKGNtZF92ZWN0b3IpOworCQkJICAgKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJCQkgICByZXR1cm4gTlVMTDsKKwkJCSAgIH0KKwkJCSAqLworCQl9CisKKwkvKiBQcmVwYXJlIG1hdGNoIHZlY3Rvci4gKi8KKwltYXRjaHZlYyA9IHZlY3Rvcl9pbml0KElOSVRfTUFUQ0hWRUNfU0laRSk7CisKKwkvKiBOb3cgd2UgZ290IGludG8gY29tcGxldGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZF92ZWN0b3IpOyBpKyspCisJCWlmICgoY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKSkpIHsKKwkJCWNvbnN0IGNoYXIgKnN0cmluZzsKKwkJCXZlY3RvciBzdHJ2ZWMgPSBjbWRfZWxlbWVudC0+c3RydmVjOworCisJCQkvKiBDaGVjayBmaWVsZCBsZW5ndGggKi8KKwkJCWlmIChpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKHN0cnZlYykpCisJCQkJdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkgPSBOVUxMOworCQkJZWxzZSB7CisJCQkJdW5zaWduZWQgaW50IGo7CisKKwkJCQlkZXNjdmVjID0gdmVjdG9yX3Nsb3Qoc3RydmVjLCBpbmRleCk7CisJCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYyk7IGorKykKKwkJCQkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3ZlYywgaikpKSB7CisJCQkJCQlpZiAoKHN0cmluZyA9IGNtZF9lbnRyeV9mdW5jdGlvbih2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpLCBkZXNjLT5jbWQpKSkKKwkJCQkJCQlpZiAoY21kX3VuaXF1ZV9zdHJpbmcgKG1hdGNodmVjLCBzdHJpbmcpKQorCQkJCQkJCQl2ZWN0b3Jfc2V0IChtYXRjaHZlYywgdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJpbmcpKTsKKwkJCQkJfQorCQkJfQorCQl9CisKKwkvKiBXZSBkb24ndCBuZWVkIGNtZF92ZWN0b3IgYW55IG1vcmUuICovCisJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisKKwkvKiBObyBtYXRjaGVkIGNvbW1hbmQgKi8KKwlpZiAodmVjdG9yX3Nsb3QobWF0Y2h2ZWMsIDApID09IE5VTEwpIHsKKwkJdmVjdG9yX2ZyZWUobWF0Y2h2ZWMpOworCisJCS8qIEluIGNhc2Ugb2YgJ2NvbW1hbmQgXHQnIHBhdHRlcm4uICBEbyB5b3UgbmVlZCAnPycgY29tbWFuZCBhdAorCQkgICB0aGUgZW5kIG9mIHRoZSBsaW5lLiAqLworCQlpZiAodmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSA9PSAnXDAnKQorCQkJKnN0YXR1cyA9IENNRF9FUlJfTk9USElOR19UT0RPOworCQllbHNlCisJCQkqc3RhdHVzID0gQ01EX0VSUl9OT19NQVRDSDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogT25seSBvbmUgbWF0Y2hlZCAqLworCWlmICh2ZWN0b3Jfc2xvdChtYXRjaHZlYywgMSkgPT0gTlVMTCkgeworCQltYXRjaF9zdHIgPSAoY2hhciAqKiltYXRjaHZlYy0+aW5kZXg7CisJCXZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZShtYXRjaHZlYyk7CisJCSpzdGF0dXMgPSBDTURfQ09NUExFVEVfRlVMTF9NQVRDSDsKKwkJcmV0dXJuIG1hdGNoX3N0cjsKKwl9CisJLyogTWFrZSBpdCBzdXJlIGxhc3QgZWxlbWVudCBpcyBOVUxMLiAqLworCXZlY3Rvcl9zZXQobWF0Y2h2ZWMsIE5VTEwpOworCisJLyogQ2hlY2sgTENEIG9mIG1hdGNoZWQgc3RyaW5ncy4gKi8KKwlpZiAodmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSAhPSBOVUxMKSB7CisJCWxjZCA9IGNtZF9sY2QoKGNoYXIgKiopbWF0Y2h2ZWMtPmluZGV4KTsKKworCQlpZiAobGNkKSB7CisJCQlpbnQgbGVuID0gc3RybGVuKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkpOworCisJCQlpZiAobGVuIDwgbGNkKSB7CisJCQkJY2hhciAqbGNkc3RyOworCisJCQkJbGNkc3RyID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIGxjZCArIDEsCisJCQkJCQkgICAgICAiY29tcGxldGUtbGNkc3RyIik7CisJCQkJbWVtY3B5KGxjZHN0ciwgbWF0Y2h2ZWMtPmluZGV4WzBdLCBsY2QpOworCQkJCWxjZHN0cltsY2RdID0gJ1wwJzsKKworCQkJCS8qIG1hdGNoX3N0ciA9IChjaGFyICoqKSAmbGNkc3RyOyAqLworCisJCQkJLyogRnJlZSBtYXRjaHZlYy4gKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShtYXRjaHZlYyk7IGkrKykgeworCQkJCQlpZiAodmVjdG9yX3Nsb3QobWF0Y2h2ZWMsIGkpKQorCQkJCQkJdGFsbG9jX2ZyZWUodmVjdG9yX3Nsb3QobWF0Y2h2ZWMsIGkpKTsKKwkJCQl9CisJCQkJdmVjdG9yX2ZyZWUobWF0Y2h2ZWMpOworCisJCQkJLyogTWFrZSBuZXcgbWF0Y2h2ZWMuICovCisJCQkJbWF0Y2h2ZWMgPSB2ZWN0b3JfaW5pdChJTklUX01BVENIVkVDX1NJWkUpOworCQkJCXZlY3Rvcl9zZXQobWF0Y2h2ZWMsIGxjZHN0cik7CisJCQkJbWF0Y2hfc3RyID0gKGNoYXIgKiopbWF0Y2h2ZWMtPmluZGV4OworCQkJCXZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZShtYXRjaHZlYyk7CisKKwkJCQkqc3RhdHVzID0gQ01EX0NPTVBMRVRFX01BVENIOworCQkJCXJldHVybiBtYXRjaF9zdHI7CisJCQl9CisJCX0KKwl9CisKKwltYXRjaF9zdHIgPSAoY2hhciAqKiltYXRjaHZlYy0+aW5kZXg7CisJdmVjdG9yX29ubHlfd3JhcHBlcl9mcmVlKG1hdGNodmVjKTsKKwkqc3RhdHVzID0gQ01EX0NPTVBMRVRFX0xJU1RfTUFUQ0g7CisJcmV0dXJuIG1hdGNoX3N0cjsKK30KKworY2hhciAqKmNtZF9jb21wbGV0ZV9jb21tYW5kKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LCBpbnQgKnN0YXR1cykKK3sKKwljaGFyICoqcmV0OworCisJaWYgKGNtZF90cnlfZG9fc2hvcnRjdXQodnR5LT5ub2RlLCB2ZWN0b3Jfc2xvdCh2bGluZSwgMCkpKSB7CisJCWVudW0gbm9kZV90eXBlIG9ub2RlOworCQl2ZWN0b3Igc2hpZnRlZF92bGluZTsKKwkJdW5zaWduZWQgaW50IGluZGV4OworCisJCW9ub2RlID0gdnR5LT5ub2RlOworCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJLyogV2UgY2FuIHRyeSBpdCBvbiBlbmFibGUgbm9kZSwgY29zJyB0aGUgdnR5IGlzIGF1dGhlbnRpY2F0ZWQgKi8KKworCQlzaGlmdGVkX3ZsaW5lID0gdmVjdG9yX2luaXQodmVjdG9yX2NvdW50KHZsaW5lKSk7CisJCS8qIHVzZSBtZW1jcHk/ICovCisJCWZvciAoaW5kZXggPSAxOyBpbmRleCA8IHZlY3Rvcl9hY3RpdmUodmxpbmUpOyBpbmRleCsrKSB7CisJCQl2ZWN0b3Jfc2V0X2luZGV4KHNoaWZ0ZWRfdmxpbmUsIGluZGV4IC0gMSwKKwkJCQkJIHZlY3Rvcl9sb29rdXAodmxpbmUsIGluZGV4KSk7CisJCX0KKworCQlyZXQgPSBjbWRfY29tcGxldGVfY29tbWFuZF9yZWFsKHNoaWZ0ZWRfdmxpbmUsIHZ0eSwgc3RhdHVzKTsKKworCQl2ZWN0b3JfZnJlZShzaGlmdGVkX3ZsaW5lKTsKKwkJdnR5LT5ub2RlID0gb25vZGU7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIGNtZF9jb21wbGV0ZV9jb21tYW5kX3JlYWwodmxpbmUsIHZ0eSwgc3RhdHVzKTsKK30KKworLyogcmV0dXJuIHBhcmVudCBub2RlICovCisvKiBNVVNUIGV2ZW50dWFsbHkgY29udmVyZ2Ugb24gQ09ORklHX05PREUgKi8KK2VudW0gbm9kZV90eXBlIHZ0eV9nb19wYXJlbnQoc3RydWN0IHZ0eSAqdnR5KQoreworCWFzc2VydCh2dHktPm5vZGUgPiBDT05GSUdfTk9ERSk7CisKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgR1NNTkVUX05PREU6CisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCQl2dHktPmluZGV4ID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBCVFNfTk9ERToKKwkJdnR5LT5ub2RlID0gR1NNTkVUX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSBidHMtPm5ldHdvcms7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUUlhfTk9ERToKKwkJdnR5LT5ub2RlID0gQlRTX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gdHJ4LT5idHM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUU19OT0RFOgorCQl2dHktPm5vZGUgPSBUUlhfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IHRzLT50cng7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTVUJTQ1JfTk9ERToKKwkJdnR5LT5ub2RlID0gVklFV19OT0RFOworCQlzdWJzY3JfcHV0KHZ0eS0+aW5kZXgpOworCQl2dHktPmluZGV4ID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJfQorCisJcmV0dXJuIHZ0eS0+bm9kZTsKK30KKworLyogRXhlY3V0ZSBjb21tYW5kIGJ5IGFyZ3VtZW50IHZsaW5lIHZlY3Rvci4gKi8KK3N0YXRpYyBpbnQKK2NtZF9leGVjdXRlX2NvbW1hbmRfcmVhbCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwKKwkJCSBzdHJ1Y3QgY21kX2VsZW1lbnQgKipjbWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGluZGV4OworCXZlY3RvciBjbWRfdmVjdG9yOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJc3RydWN0IGNtZF9lbGVtZW50ICptYXRjaGVkX2VsZW1lbnQ7CisJdW5zaWduZWQgaW50IG1hdGNoZWRfY291bnQsIGluY29tcGxldGVfY291bnQ7CisJaW50IGFyZ2M7CisJY29uc3QgY2hhciAqYXJndltDTURfQVJHQ19NQVhdOworCWVudW0gbWF0Y2hfdHlwZSBtYXRjaCA9IDA7CisJaW50IHZhcmZsYWc7CisJY2hhciAqY29tbWFuZDsKKworCS8qIE1ha2UgY29weSBvZiBjb21tYW5kIGVsZW1lbnRzLiAqLworCWNtZF92ZWN0b3IgPSB2ZWN0b3JfY29weShjbWRfbm9kZV92ZWN0b3IoY21kdmVjLCB2dHktPm5vZGUpKTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHZlY3Rvcl9hY3RpdmUodmxpbmUpOyBpbmRleCsrKQorCQlpZiAoKGNvbW1hbmQgPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpKSkgeworCQkJaW50IHJldDsKKworCQkJbWF0Y2ggPQorCQkJICAgIGNtZF9maWx0ZXJfYnlfY29tcGxldGlvbihjb21tYW5kLCBjbWRfdmVjdG9yLAorCQkJCQkJICAgICBpbmRleCk7CisKKwkJCWlmIChtYXRjaCA9PSB2YXJhcmdfbWF0Y2gpCisJCQkJYnJlYWs7CisKKwkJCXJldCA9CisJCQkgICAgaXNfY21kX2FtYmlndW91cyhjb21tYW5kLCBjbWRfdmVjdG9yLCBpbmRleCwgbWF0Y2gpOworCisJCQlpZiAocmV0ID09IDEpIHsKKwkJCQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKwkJCQlyZXR1cm4gQ01EX0VSUl9BTUJJR1VPVVM7CisJCQl9IGVsc2UgaWYgKHJldCA9PSAyKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJCQl9CisJCX0KKworCS8qIENoZWNrIG1hdGNoZWQgY291bnQuICovCisJbWF0Y2hlZF9lbGVtZW50ID0gTlVMTDsKKwltYXRjaGVkX2NvdW50ID0gMDsKKwlpbmNvbXBsZXRlX2NvdW50ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZF92ZWN0b3IpOyBpKyspCisJCWlmICgoY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKSkpIHsKKwkJCWlmIChtYXRjaCA9PSB2YXJhcmdfbWF0Y2gKKwkJCSAgICB8fCBpbmRleCA+PSBjbWRfZWxlbWVudC0+Y21kc2l6ZSkgeworCQkJCW1hdGNoZWRfZWxlbWVudCA9IGNtZF9lbGVtZW50OworI2lmIDAKKwkJCQlwcmludGYoIkRFQlVHOiAlc1xuIiwgY21kX2VsZW1lbnQtPnN0cmluZyk7CisjZW5kaWYKKwkJCQltYXRjaGVkX2NvdW50Kys7CisJCQl9IGVsc2UgeworCQkJCWluY29tcGxldGVfY291bnQrKzsKKwkJCX0KKwkJfQorCisJLyogRmluaXNoIG9mIHVzaW5nIGNtZF92ZWN0b3IuICovCisJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisKKwkvKiBUbyBleGVjdXRlIGNvbW1hbmQsIG1hdGNoZWRfY291bnQgbXVzdCBiZSAxLiAqLworCWlmIChtYXRjaGVkX2NvdW50ID09IDApIHsKKwkJaWYgKGluY29tcGxldGVfY291bnQpCisJCQlyZXR1cm4gQ01EX0VSUl9JTkNPTVBMRVRFOworCQllbHNlCisJCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl9CisKKwlpZiAobWF0Y2hlZF9jb3VudCA+IDEpCisJCXJldHVybiBDTURfRVJSX0FNQklHVU9VUzsKKworCS8qIEFyZ3VtZW50IHRyZWF0bWVudCAqLworCXZhcmZsYWcgPSAwOworCWFyZ2MgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodmxpbmUpOyBpKyspIHsKKwkJaWYgKHZhcmZsYWcpCisJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCWVsc2UgeworCQkJdmVjdG9yIGRlc2N2ZWMgPQorCQkJICAgIHZlY3Rvcl9zbG90KG1hdGNoZWRfZWxlbWVudC0+c3RydmVjLCBpKTsKKworCQkJaWYgKHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYykgPT0gMSkgeworCQkJCXN0cnVjdCBkZXNjICpkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3ZlYywgMCk7CisKKwkJCQlpZiAoQ01EX1ZBUkFSRyhkZXNjLT5jbWQpKQorCQkJCQl2YXJmbGFnID0gMTsKKworCQkJCWlmICh2YXJmbGFnIHx8IENNRF9WQVJJQUJMRShkZXNjLT5jbWQpCisJCQkJICAgIHx8IENNRF9PUFRJT04oZGVzYy0+Y21kKSkKKwkJCQkJYXJndlthcmdjKytdID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpOworCQkJfSBlbHNlCisJCQkJYXJndlthcmdjKytdID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpOworCQl9CisKKwkJaWYgKGFyZ2MgPj0gQ01EX0FSR0NfTUFYKQorCQkJcmV0dXJuIENNRF9FUlJfRVhFRURfQVJHQ19NQVg7CisJfQorCisJLyogRm9yIHZ0eXNoIGV4ZWN1dGlvbi4gKi8KKwlpZiAoY21kKQorCQkqY21kID0gbWF0Y2hlZF9lbGVtZW50OworCisJaWYgKG1hdGNoZWRfZWxlbWVudC0+ZGFlbW9uKQorCQlyZXR1cm4gQ01EX1NVQ0NFU1NfREFFTU9OOworCisJLyogRXhlY3V0ZSBtYXRjaGVkIGNvbW1hbmQuICovCisJcmV0dXJuICgqbWF0Y2hlZF9lbGVtZW50LT5mdW5jKSAobWF0Y2hlZF9lbGVtZW50LCB2dHksIGFyZ2MsIGFyZ3YpOworfQorCitpbnQKK2NtZF9leGVjdXRlX2NvbW1hbmQodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBjbWRfZWxlbWVudCAqKmNtZCwKKwkJICAgIGludCB2dHlzaCkKK3sKKwlpbnQgcmV0LCBzYXZlZF9yZXQsIHRyaWVkID0gMDsKKwllbnVtIG5vZGVfdHlwZSBvbm9kZTsKKwl2b2lkICpvaW5kZXg7CisKKwlvbm9kZSA9IHZ0eS0+bm9kZTsKKwlvaW5kZXggPSB2dHktPmluZGV4OworCisJaWYgKGNtZF90cnlfZG9fc2hvcnRjdXQodnR5LT5ub2RlLCB2ZWN0b3Jfc2xvdCh2bGluZSwgMCkpKSB7CisJCXZlY3RvciBzaGlmdGVkX3ZsaW5lOworCQl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCS8qIFdlIGNhbiB0cnkgaXQgb24gZW5hYmxlIG5vZGUsIGNvcycgdGhlIHZ0eSBpcyBhdXRoZW50aWNhdGVkICovCisKKwkJc2hpZnRlZF92bGluZSA9IHZlY3Rvcl9pbml0KHZlY3Rvcl9jb3VudCh2bGluZSkpOworCQkvKiB1c2UgbWVtY3B5PyAqLworCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykgeworCQkJdmVjdG9yX3NldF9pbmRleChzaGlmdGVkX3ZsaW5lLCBpbmRleCAtIDEsCisJCQkJCSB2ZWN0b3JfbG9va3VwKHZsaW5lLCBpbmRleCkpOworCQl9CisKKwkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9yZWFsKHNoaWZ0ZWRfdmxpbmUsIHZ0eSwgY21kKTsKKworCQl2ZWN0b3JfZnJlZShzaGlmdGVkX3ZsaW5lKTsKKwkJdnR5LT5ub2RlID0gb25vZGU7CisJCXJldHVybiByZXQ7CisJfQorCisJc2F2ZWRfcmV0ID0gcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIGNtZCk7CisKKwlpZiAodnR5c2gpCisJCXJldHVybiBzYXZlZF9yZXQ7CisKKwkvKiBUaGlzIGFzc3VtZXMgYWxsIG5vZGVzIGFib3ZlIENPTkZJR19OT0RFIGFyZSBjaGlsZHMgb2YgQ09ORklHX05PREUgKi8KKwl3aGlsZSAocmV0ICE9IENNRF9TVUNDRVNTICYmIHJldCAhPSBDTURfV0FSTklORworCSAgICAgICAmJiB2dHktPm5vZGUgPiBDT05GSUdfTk9ERSkgeworCQl2dHlfZ29fcGFyZW50KHZ0eSk7CisJCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfcmVhbCh2bGluZSwgdnR5LCBjbWQpOworCQl0cmllZCA9IDE7CisJCWlmIChyZXQgPT0gQ01EX1NVQ0NFU1MgfHwgcmV0ID09IENNRF9XQVJOSU5HKSB7CisJCQkvKiBzdWNjZXNmdWxsIGNvbW1hbmQsIGxlYXZlIHRoZSBub2RlIGFzIGlzICovCisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCS8qIG5vIGNvbW1hbmQgc3VjY2VlZGVkLCByZXNldCB0aGUgdnR5IHRvIHRoZSBvcmlnaW5hbCBub2RlIGFuZAorCSAgIHJldHVybiB0aGUgZXJyb3IgZm9yIHRoaXMgbm9kZSAqLworCWlmICh0cmllZCkgeworCQl2dHktPm5vZGUgPSBvbm9kZTsKKwkJdnR5LT5pbmRleCA9IG9pbmRleDsKKwl9CisJcmV0dXJuIHNhdmVkX3JldDsKK30KKworLyogRXhlY3V0ZSBjb21tYW5kIGJ5IGFyZ3VtZW50IHJlYWRsaW5lLiAqLworaW50CitjbWRfZXhlY3V0ZV9jb21tYW5kX3N0cmljdCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwKKwkJCSAgIHN0cnVjdCBjbWRfZWxlbWVudCAqKmNtZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdmVjdG9yIGNtZF92ZWN0b3I7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKm1hdGNoZWRfZWxlbWVudDsKKwl1bnNpZ25lZCBpbnQgbWF0Y2hlZF9jb3VudCwgaW5jb21wbGV0ZV9jb3VudDsKKwlpbnQgYXJnYzsKKwljb25zdCBjaGFyICphcmd2W0NNRF9BUkdDX01BWF07CisJaW50IHZhcmZsYWc7CisJZW51bSBtYXRjaF90eXBlIG1hdGNoID0gMDsKKwljaGFyICpjb21tYW5kOworCisJLyogTWFrZSBjb3B5IG9mIGNvbW1hbmQgZWxlbWVudCAqLworCWNtZF92ZWN0b3IgPSB2ZWN0b3JfY29weShjbWRfbm9kZV92ZWN0b3IoY21kdmVjLCB2dHktPm5vZGUpKTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHZlY3Rvcl9hY3RpdmUodmxpbmUpOyBpbmRleCsrKQorCQlpZiAoKGNvbW1hbmQgPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpKSkgeworCQkJaW50IHJldDsKKworCQkJbWF0Y2ggPSBjbWRfZmlsdGVyX2J5X3N0cmluZyh2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpLAorCQkJCQkJICAgICBjbWRfdmVjdG9yLCBpbmRleCk7CisKKwkJCS8qIElmIGNvbW1hbmQgbWVldHMgJy5WQVJBUkcnIHRoZW4gZmluaXNoIG1hdGNoaW5nLiAqLworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaCkKKwkJCQlicmVhazsKKworCQkJcmV0ID0KKwkJCSAgICBpc19jbWRfYW1iaWd1b3VzKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGluZGV4LCBtYXRjaCk7CisJCQlpZiAocmV0ID09IDEpIHsKKwkJCQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKwkJCQlyZXR1cm4gQ01EX0VSUl9BTUJJR1VPVVM7CisJCQl9CisJCQlpZiAocmV0ID09IDIpIHsKKwkJCQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKwkJCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwkJCX0KKwkJfQorCisJLyogQ2hlY2sgbWF0Y2hlZCBjb3VudC4gKi8KKwltYXRjaGVkX2VsZW1lbnQgPSBOVUxMOworCW1hdGNoZWRfY291bnQgPSAwOworCWluY29tcGxldGVfY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZF92ZWN0b3IpOyBpKyspCisJCWlmICh2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKSAhPSBOVUxMKSB7CisJCQljbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpOworCisJCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoCisJCQkgICAgfHwgaW5kZXggPj0gY21kX2VsZW1lbnQtPmNtZHNpemUpIHsKKwkJCQltYXRjaGVkX2VsZW1lbnQgPSBjbWRfZWxlbWVudDsKKwkJCQltYXRjaGVkX2NvdW50Kys7CisJCQl9IGVsc2UKKwkJCQlpbmNvbXBsZXRlX2NvdW50Kys7CisJCX0KKworCS8qIEZpbmlzaCBvZiB1c2luZyBjbWRfdmVjdG9yLiAqLworCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJLyogVG8gZXhlY3V0ZSBjb21tYW5kLCBtYXRjaGVkX2NvdW50IG11c3QgYmUgMS4gKi8KKwlpZiAobWF0Y2hlZF9jb3VudCA9PSAwKSB7CisJCWlmIChpbmNvbXBsZXRlX2NvdW50KQorCQkJcmV0dXJuIENNRF9FUlJfSU5DT01QTEVURTsKKwkJZWxzZQorCQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJfQorCisJaWYgKG1hdGNoZWRfY291bnQgPiAxKQorCQlyZXR1cm4gQ01EX0VSUl9BTUJJR1VPVVM7CisKKwkvKiBBcmd1bWVudCB0cmVhdG1lbnQgKi8KKwl2YXJmbGFnID0gMDsKKwlhcmdjID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaSsrKSB7CisJCWlmICh2YXJmbGFnKQorCQkJYXJndlthcmdjKytdID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpOworCQllbHNlIHsKKwkJCXZlY3RvciBkZXNjdmVjID0KKwkJCSAgICB2ZWN0b3Jfc2xvdChtYXRjaGVkX2VsZW1lbnQtPnN0cnZlYywgaSk7CisKKwkJCWlmICh2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpID09IDEpIHsKKwkJCQlzdHJ1Y3QgZGVzYyAqZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIDApOworCisJCQkJaWYgKENNRF9WQVJBUkcoZGVzYy0+Y21kKSkKKwkJCQkJdmFyZmxhZyA9IDE7CisKKwkJCQlpZiAodmFyZmxhZyB8fCBDTURfVkFSSUFCTEUoZGVzYy0+Y21kKQorCQkJCSAgICB8fCBDTURfT1BUSU9OKGRlc2MtPmNtZCkpCisJCQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJCX0gZWxzZQorCQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJfQorCisJCWlmIChhcmdjID49IENNRF9BUkdDX01BWCkKKwkJCXJldHVybiBDTURfRVJSX0VYRUVEX0FSR0NfTUFYOworCX0KKworCS8qIEZvciB2dHlzaCBleGVjdXRpb24uICovCisJaWYgKGNtZCkKKwkJKmNtZCA9IG1hdGNoZWRfZWxlbWVudDsKKworCWlmIChtYXRjaGVkX2VsZW1lbnQtPmRhZW1vbikKKwkJcmV0dXJuIENNRF9TVUNDRVNTX0RBRU1PTjsKKworCS8qIE5vdyBleGVjdXRlIG1hdGNoZWQgY29tbWFuZCAqLworCXJldHVybiAoKm1hdGNoZWRfZWxlbWVudC0+ZnVuYykgKG1hdGNoZWRfZWxlbWVudCwgdnR5LCBhcmdjLCBhcmd2KTsKK30KKworLyogQ29uZmlncmF0aW9uIG1ha2UgZnJvbSBmaWxlLiAqLworaW50IGNvbmZpZ19mcm9tX2ZpbGUoc3RydWN0IHZ0eSAqdnR5LCBGSUxFICogZnApCit7CisJaW50IHJldDsKKwl2ZWN0b3IgdmxpbmU7CisKKwl3aGlsZSAoZmdldHModnR5LT5idWYsIFZUWV9CVUZTSVosIGZwKSkgeworCQl2bGluZSA9IGNtZF9tYWtlX3N0cnZlYyh2dHktPmJ1Zik7CisKKwkJLyogSW4gY2FzZSBvZiBjb21tZW50IGxpbmUgKi8KKwkJaWYgKHZsaW5lID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJLyogRXhlY3V0ZSBjb25maWd1cmF0aW9uIGNvbW1hbmQgOiB0aGlzIGlzIHN0cmljdCBtYXRjaCAqLworCQlyZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kX3N0cmljdCh2bGluZSwgdnR5LCBOVUxMKTsKKworCQkvKiBUcnkgYWdhaW4gd2l0aCBzZXR0aW5nIG5vZGUgdG8gQ09ORklHX05PREUgKi8KKwkJd2hpbGUgKHJldCAhPSBDTURfU1VDQ0VTUyAmJiByZXQgIT0gQ01EX1dBUk5JTkcKKwkJICAgICAgICYmIHJldCAhPSBDTURfRVJSX05PVEhJTkdfVE9ETworCQkgICAgICAgJiYgdnR5LT5ub2RlICE9IENPTkZJR19OT0RFKSB7CisJCQl2dHlfZ29fcGFyZW50KHZ0eSk7CisJCQlyZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kX3N0cmljdCh2bGluZSwgdnR5LCBOVUxMKTsKKwkJfQorCisJCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisKKwkJaWYgKHJldCAhPSBDTURfU1VDQ0VTUyAmJiByZXQgIT0gQ01EX1dBUk5JTkcKKwkJICAgICYmIHJldCAhPSBDTURfRVJSX05PVEhJTkdfVE9ETykKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogQ29uZmlncmF0aW9uIGZyb20gdGVybWluYWwgKi8KK0RFRlVOKGNvbmZpZ190ZXJtaW5hbCwKKyAgICAgIGNvbmZpZ190ZXJtaW5hbF9jbWQsCisgICAgICAiY29uZmlndXJlIHRlcm1pbmFsIiwKKyAgICAgICJDb25maWd1cmF0aW9uIGZyb20gdnR5IGludGVyZmFjZVxuIiAiQ29uZmlndXJhdGlvbiB0ZXJtaW5hbFxuIikKK3sKKwlpZiAodnR5X2NvbmZpZ19sb2NrKHZ0eSkpCisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCWVsc2UgeworCQl2dHlfb3V0KHZ0eSwgIlZUWSBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCBieSBvdGhlciBWVFklcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBFbmFibGUgY29tbWFuZCAqLworREVGVU4oZW5hYmxlLCBjb25maWdfZW5hYmxlX2NtZCwgImVuYWJsZSIsICJUdXJuIG9uIHByaXZpbGVnZWQgbW9kZSBjb21tYW5kXG4iKQoreworCS8qIElmIGVuYWJsZSBwYXNzd29yZCBpcyBOVUxMLCBjaGFuZ2UgdG8gRU5BQkxFX05PREUgKi8KKwlpZiAoKGhvc3QuZW5hYmxlID09IE5VTEwgJiYgaG9zdC5lbmFibGVfZW5jcnlwdCA9PSBOVUxMKSB8fAorCSAgICB2dHktPnR5cGUgPT0gVlRZX1NIRUxMX1NFUlYpCisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCWVsc2UKKwkJdnR5LT5ub2RlID0gQVVUSF9FTkFCTEVfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRGlzYWJsZSBjb21tYW5kICovCitERUZVTihkaXNhYmxlLAorICAgICAgY29uZmlnX2Rpc2FibGVfY21kLCAiZGlzYWJsZSIsICJUdXJuIG9mZiBwcml2aWxlZ2VkIG1vZGUgY29tbWFuZFxuIikKK3sKKwlpZiAodnR5LT5ub2RlID09IEVOQUJMRV9OT0RFKQorCQl2dHktPm5vZGUgPSBWSUVXX05PREU7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBEb3duIHZ0eSBub2RlIGxldmVsLiAqLworZ0RFRlVOKGNvbmZpZ19leGl0LAorICAgICAgY29uZmlnX2V4aXRfY21kLCAiZXhpdCIsICJFeGl0IGN1cnJlbnQgbW9kZSBhbmQgZG93biB0byBwcmV2aW91cyBtb2RlXG4iKQoreworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBHU01ORVRfTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwljYXNlIEJUU19OT0RFOgorCQl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IGJ0cy0+bmV0d29yazsKKwkJfQorCQlicmVhazsKKwljYXNlIFRSWF9OT0RFOgorCQl2dHktPm5vZGUgPSBCVFNfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cngtPmJ0czsKKwkJfQorCQlicmVhazsKKwljYXNlIFRTX05PREU6CisJCXZ0eS0+bm9kZSA9IFRSWF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gdHMtPnRyeDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNVQlNDUl9OT0RFOgorCQl2dHktPm5vZGUgPSBWSUVXX05PREU7CisJCXN1YnNjcl9wdXQodnR5LT5pbmRleCk7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQlpZiAoMCkJCS8vdnR5X3NoZWxsICh2dHkpKQorCQkJZXhpdCgwKTsKKwkJZWxzZQorCQkJdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJCWJyZWFrOworCWNhc2UgQ09ORklHX05PREU6CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCQlicmVhazsKKwljYXNlIFZUWV9OT0RFOgorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwkJYnJlYWs7CisJY2FzZSBNR0NQX05PREU6CisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCQl2dHktPmluZGV4ID0gTlVMTDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBxdWl0IGlzIGFsaWFzIG9mIGV4aXQuICovCitnQUxJQVMoY29uZmlnX2V4aXQsCisgICAgICBjb25maWdfcXVpdF9jbWQsICJxdWl0IiwgIkV4aXQgY3VycmVudCBtb2RlIGFuZCBkb3duIHRvIHByZXZpb3VzIG1vZGVcbiIpCisKKy8qIEVuZCBvZiBjb25maWd1cmF0aW9uLiAqLworICAgIGdERUZVTihjb25maWdfZW5kLAorICAgICAgY29uZmlnX2VuZF9jbWQsICJlbmQiLCAiRW5kIGN1cnJlbnQgbW9kZSBhbmQgY2hhbmdlIHRvIGVuYWJsZSBtb2RlLiIpCit7CisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQkvKiBOb3RoaW5nIHRvIGRvLiAqLworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCWNhc2UgVlRZX05PREU6CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBTaG93IHZlcnNpb24uICovCitERUZVTihzaG93X3ZlcnNpb24sCisgICAgICBzaG93X3ZlcnNpb25fY21kLCAic2hvdyB2ZXJzaW9uIiwgU0hPV19TVFIgIkRpc3BsYXlzIHByb2dyYW0gdmVyc2lvblxuIikKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzICVzICglcykuJXMiLCBRVUFHR0FfUFJPR05BTUUsIFFVQUdHQV9WRVJTSU9OLAorCQlob3N0Lm5hbWUgPyBob3N0Lm5hbWUgOiAiIiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiJXMlcyIsIFFVQUdHQV9DT1BZUklHSFQsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogSGVscCBkaXNwbGF5IGZ1bmN0aW9uIGZvciBhbGwgbm9kZS4gKi8KK2dERUZVTihjb25maWdfaGVscCwKKyAgICAgIGNvbmZpZ19oZWxwX2NtZCwgImhlbHAiLCAiRGVzY3JpcHRpb24gb2YgdGhlIGludGVyYWN0aXZlIGhlbHAgc3lzdGVtXG4iKQoreworCXZ0eV9vdXQodnR5LAorCQkiVGhpcyBWVFkgcHJvdmlkZXMgYWR2YW5jZWQgaGVscCBmZWF0dXJlcy4gIFdoZW4geW91IG5lZWQgaGVscCwlc1wKK2FueXRpbWUgYXQgdGhlIGNvbW1hbmQgbGluZSBwbGVhc2UgcHJlc3MgJz8nLiVzXAorJXNcCitJZiBub3RoaW5nIG1hdGNoZXMsIHRoZSBoZWxwIGxpc3Qgd2lsbCBiZSBlbXB0eSBhbmQgeW91IG11c3QgYmFja3VwJXNcCisgdW50aWwgZW50ZXJpbmcgYSAnPycgc2hvd3MgdGhlIGF2YWlsYWJsZSBvcHRpb25zLiVzXAorVHdvIHN0eWxlcyBvZiBoZWxwIGFyZSBwcm92aWRlZDolc1wKKzEuIEZ1bGwgaGVscCBpcyBhdmFpbGFibGUgd2hlbiB5b3UgYXJlIHJlYWR5IHRvIGVudGVyIGElc1wKK2NvbW1hbmQgYXJndW1lbnQgKGUuZy4gJ3Nob3cgPycpIGFuZCBkZXNjcmliZXMgZWFjaCBwb3NzaWJsZSVzXAorYXJndW1lbnQuJXNcCisyLiBQYXJ0aWFsIGhlbHAgaXMgcHJvdmlkZWQgd2hlbiBhbiBhYmJyZXZpYXRlZCBhcmd1bWVudCBpcyBlbnRlcmVkJXNcCisgICBhbmQgeW91IHdhbnQgdG8ga25vdyB3aGF0IGFyZ3VtZW50cyBtYXRjaCB0aGUgaW5wdXQlc1wKKyAgIChlLmcuICdzaG93IG1lPycuKSVzJXMiLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLAorCQlWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBIZWxwIGRpc3BsYXkgZnVuY3Rpb24gZm9yIGFsbCBub2RlLiAqLworZ0RFRlVOKGNvbmZpZ19saXN0LCBjb25maWdfbGlzdF9jbWQsICJsaXN0IiwgIlByaW50IGNvbW1hbmQgbGlzdFxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgY21kX25vZGUgKmNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCB2dHktPm5vZGUpOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY25vZGUtPmNtZF92ZWN0b3IpOyBpKyspCisJCWlmICgoY21kID0gdmVjdG9yX3Nsb3QoY25vZGUtPmNtZF92ZWN0b3IsIGkpKSAhPSBOVUxMCisJCSAgICAmJiAhKGNtZC0+YXR0ciA9PSBDTURfQVRUUl9ERVBSRUNBVEVECisJCQkgfHwgY21kLT5hdHRyID09IENNRF9BVFRSX0hJRERFTikpCisJCQl2dHlfb3V0KHZ0eSwgIiAgJXMlcyIsIGNtZC0+c3RyaW5nLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBXcml0ZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaW50byBmaWxlLiAqLworREVGVU4oY29uZmlnX3dyaXRlX2ZpbGUsCisgICAgICBjb25maWdfd3JpdGVfZmlsZV9jbWQsCisgICAgICAid3JpdGUgZmlsZSIsCisgICAgICAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIKKyAgICAgICJXcml0ZSB0byBjb25maWd1cmF0aW9uIGZpbGVcbiIpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGZkOworCXN0cnVjdCBjbWRfbm9kZSAqbm9kZTsKKwljaGFyICpjb25maWdfZmlsZTsKKwljaGFyICpjb25maWdfZmlsZV90bXAgPSBOVUxMOworCWNoYXIgKmNvbmZpZ19maWxlX3NhdiA9IE5VTEw7CisJc3RydWN0IHZ0eSAqZmlsZV92dHk7CisKKwkvKiBDaGVjayBhbmQgc2VlIGlmIHdlIGFyZSBvcGVyYXRpbmcgdW5kZXIgdnR5c2ggY29uZmlndXJhdGlvbiAqLworCWlmIChob3N0LmNvbmZpZyA9PSBOVUxMKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgc2F2ZSB0byBjb25maWd1cmF0aW9uIGZpbGUsIHVzaW5nIHZ0eXNoLiVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIEdldCBmaWxlbmFtZS4gKi8KKwljb25maWdfZmlsZSA9IGhvc3QuY29uZmlnOworCisJY29uZmlnX2ZpbGVfc2F2ID0KKwkgICAgX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsCisJCQkgc3RybGVuKGNvbmZpZ19maWxlKSArIHN0cmxlbihDT05GX0JBQ0tVUF9FWFQpICsgMSwKKwkJCSAiY29uZmlnX2ZpbGVfc2F2Iik7CisJc3RyY3B5KGNvbmZpZ19maWxlX3NhdiwgY29uZmlnX2ZpbGUpOworCXN0cmNhdChjb25maWdfZmlsZV9zYXYsIENPTkZfQkFDS1VQX0VYVCk7CisKKwljb25maWdfZmlsZV90bXAgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgc3RybGVuKGNvbmZpZ19maWxlKSArIDgsCisJCQkJCSJjb25maWdfZmlsZV90bXAiKTsKKwlzcHJpbnRmKGNvbmZpZ19maWxlX3RtcCwgIiVzLlhYWFhYWCIsIGNvbmZpZ19maWxlKTsKKworCS8qIE9wZW4gZmlsZSB0byBjb25maWd1cmF0aW9uIHdyaXRlLiAqLworCWZkID0gbWtzdGVtcChjb25maWdfZmlsZV90bXApOworCWlmIChmZCA8IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBvcGVuIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCisJCQljb25maWdfZmlsZV90bXAsIFZUWV9ORVdMSU5FKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIE1ha2UgdnR5IGZvciBjb25maWd1cmF0aW9uIGZpbGUuICovCisJZmlsZV92dHkgPSB2dHlfbmV3KCk7CisJZmlsZV92dHktPmZkID0gZmQ7CisJZmlsZV92dHktPnR5cGUgPSBWVFlfRklMRTsKKworCS8qIENvbmZpZyBmaWxlIGhlYWRlciBwcmludC4gKi8KKwl2dHlfb3V0KGZpbGVfdnR5LCAiIVxuISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHlcbiEgICAiKTsKKwkvL3Z0eV90aW1lX3ByaW50IChmaWxlX3Z0eSwgMSk7CisJdnR5X291dChmaWxlX3Z0eSwgIiFcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kdmVjKTsgaSsrKQorCQlpZiAoKG5vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAmJiBub2RlLT5mdW5jKSB7CisJCQlpZiAoKCpub2RlLT5mdW5jKSAoZmlsZV92dHkpKQorCQkJCXZ0eV9vdXQoZmlsZV92dHksICIhXG4iKTsKKwkJfQorCXZ0eV9jbG9zZShmaWxlX3Z0eSk7CisKKwlpZiAodW5saW5rKGNvbmZpZ19maWxlX3NhdikgIT0gMCkKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJdnR5X291dCh2dHksCisJCQkJIkNhbid0IHVubGluayBiYWNrdXAgY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwKKwkJCQljb25maWdfZmlsZV9zYXYsIFZUWV9ORVdMSU5FKTsKKwkJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwlpZiAobGluayhjb25maWdfZmlsZSwgY29uZmlnX2ZpbGVfc2F2KSAhPSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3QgYmFja3VwIG9sZCBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLAorCQkJY29uZmlnX2ZpbGVfc2F2LCBWVFlfTkVXTElORSk7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCXVubGluayhjb25maWdfZmlsZV90bXApOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXN5bmMoKTsKKwlpZiAodW5saW5rKGNvbmZpZ19maWxlKSAhPSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3QgdW5saW5rIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCisJCQljb25maWdfZmlsZSwgVlRZX05FV0xJTkUpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlpZiAobGluayhjb25maWdfZmlsZV90bXAsIGNvbmZpZ19maWxlKSAhPSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgc2F2ZSBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLCBjb25maWdfZmlsZSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJc3luYygpOworCisJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCisJaWYgKGNobW9kKGNvbmZpZ19maWxlLCAwNjY2ICYgfkNPTkZJR0ZJTEVfTUFTSykgIT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IGNobW9kIGNvbmZpZ3VyYXRpb24gZmlsZSAlczogJXMgKCVkKS4lcyIsCisJCQljb25maWdfZmlsZSwgc3RyZXJyb3IoZXJybm8pLCBlcnJubywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdnR5X291dCh2dHksICJDb25maWd1cmF0aW9uIHNhdmVkIHRvICVzJXMiLCBjb25maWdfZmlsZSwgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMoY29uZmlnX3dyaXRlX2ZpbGUsCisgICAgICBjb25maWdfd3JpdGVfY21kLAorICAgICAgIndyaXRlIiwgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iKQorCisgICAgQUxJQVMoY29uZmlnX3dyaXRlX2ZpbGUsCisgICAgICBjb25maWdfd3JpdGVfbWVtb3J5X2NtZCwKKyAgICAgICJ3cml0ZSBtZW1vcnkiLAorICAgICAgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iCisgICAgICAiV3JpdGUgY29uZmlndXJhdGlvbiB0byB0aGUgZmlsZSAoc2FtZSBhcyB3cml0ZSBmaWxlKVxuIikKKworICAgIEFMSUFTKGNvbmZpZ193cml0ZV9maWxlLAorICAgICAgY29weV9ydW5uaW5nY29uZmlnX3N0YXJ0dXBjb25maWdfY21kLAorICAgICAgImNvcHkgcnVubmluZy1jb25maWcgc3RhcnR1cC1jb25maWciLAorICAgICAgIkNvcHkgY29uZmlndXJhdGlvblxuIgorICAgICAgIkNvcHkgcnVubmluZyBjb25maWcgdG8uLi4gXG4iCisgICAgICAiQ29weSBydW5uaW5nIGNvbmZpZyB0byBzdGFydHVwIGNvbmZpZyAoc2FtZSBhcyB3cml0ZSBmaWxlKVxuIikKKworLyogV3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uIGludG8gdGhlIHRlcm1pbmFsLiAqLworICAgIERFRlVOKGNvbmZpZ193cml0ZV90ZXJtaW5hbCwKKyAgICAgIGNvbmZpZ193cml0ZV90ZXJtaW5hbF9jbWQsCisgICAgICAid3JpdGUgdGVybWluYWwiLAorICAgICAgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iCisgICAgICAiV3JpdGUgdG8gdGVybWluYWxcbiIpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGNtZF9ub2RlICpub2RlOworCisJaWYgKHZ0eS0+dHlwZSA9PSBWVFlfU0hFTExfU0VSVikgeworCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCisJCQlpZiAoKG5vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAmJiBub2RlLT5mdW5jCisJCQkgICAgJiYgbm9kZS0+dnR5c2gpIHsKKwkJCQlpZiAoKCpub2RlLT5mdW5jKSAodnR5KSkKKwkJCQkJdnR5X291dCh2dHksICIhJXMiLCBWVFlfTkVXTElORSk7CisJCQl9CisJfSBlbHNlIHsKKwkJdnR5X291dCh2dHksICIlc0N1cnJlbnQgY29uZmlndXJhdGlvbjolcyIsIFZUWV9ORVdMSU5FLAorCQkJVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCisJCQlpZiAoKG5vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAmJiBub2RlLT5mdW5jKSB7CisJCQkJaWYgKCgqbm9kZS0+ZnVuYykgKHZ0eSkpCisJCQkJCXZ0eV9vdXQodnR5LCAiISVzIiwgVlRZX05FV0xJTkUpOworCQkJfQorCQl2dHlfb3V0KHZ0eSwgImVuZCVzIiwgVlRZX05FV0xJTkUpOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFdyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpbnRvIHRoZSB0ZXJtaW5hbC4gKi8KK0FMSUFTKGNvbmZpZ193cml0ZV90ZXJtaW5hbCwKKyAgICAgIHNob3dfcnVubmluZ19jb25maWdfY21kLAorICAgICAgInNob3cgcnVubmluZy1jb25maWciLCBTSE9XX1NUUiAicnVubmluZyBjb25maWd1cmF0aW9uXG4iKQorCisvKiBXcml0ZSBzdGFydHVwIGNvbmZpZ3VyYXRpb24gaW50byB0aGUgdGVybWluYWwuICovCisgICAgREVGVU4oc2hvd19zdGFydHVwX2NvbmZpZywKKyAgICAgIHNob3dfc3RhcnR1cF9jb25maWdfY21kLAorICAgICAgInNob3cgc3RhcnR1cC1jb25maWciLCBTSE9XX1NUUiAiQ29udGVudGVzIG9mIHN0YXJ0dXAgY29uZmlndXJhdGlvblxuIikKK3sKKwljaGFyIGJ1ZltCVUZTSVpdOworCUZJTEUgKmNvbmZwOworCisJY29uZnAgPSBmb3Blbihob3N0LmNvbmZpZywgInIiKTsKKwlpZiAoY29uZnAgPT0gTlVMTCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IG9wZW4gY29uZmlndXJhdGlvbiBmaWxlIFslc10lcyIsCisJCQlob3N0LmNvbmZpZywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJd2hpbGUgKGZnZXRzKGJ1ZiwgQlVGU0laLCBjb25mcCkpIHsKKwkJY2hhciAqY3AgPSBidWY7CisKKwkJd2hpbGUgKCpjcCAhPSAnXHInICYmICpjcCAhPSAnXG4nICYmICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKwkJKmNwID0gJ1wwJzsKKworCQl2dHlfb3V0KHZ0eSwgIiVzJXMiLCBidWYsIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlmY2xvc2UoY29uZnApOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBIb3N0bmFtZSBjb25maWd1cmF0aW9uICovCitERUZVTihjb25maWdfaG9zdG5hbWUsCisgICAgICBob3N0bmFtZV9jbWQsCisgICAgICAiaG9zdG5hbWUgV09SRCIsCisgICAgICAiU2V0IHN5c3RlbSdzIG5ldHdvcmsgbmFtZVxuIiAiVGhpcyBzeXN0ZW0ncyBuZXR3b3JrIG5hbWVcbiIpCit7CisJaWYgKCFpc2FscGhhKChpbnQpKmFyZ3ZbMF0pKSB7CisJCXZ0eV9vdXQodnR5LCAiUGxlYXNlIHNwZWNpZnkgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYWxwaGFiZXQlcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaG9zdC5uYW1lKQorCQl0YWxsb2NfZnJlZShob3N0Lm5hbWUpOworCisJaG9zdC5uYW1lID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19ub19ob3N0bmFtZSwKKyAgICAgIG5vX2hvc3RuYW1lX2NtZCwKKyAgICAgICJubyBob3N0bmFtZSBbSE9TVE5BTUVdIiwKKyAgICAgIE5PX1NUUiAiUmVzZXQgc3lzdGVtJ3MgbmV0d29yayBuYW1lXG4iICJIb3N0IG5hbWUgb2YgdGhpcyByb3V0ZXJcbiIpCit7CisJaWYgKGhvc3QubmFtZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5uYW1lKTsKKwlob3N0Lm5hbWUgPSBOVUxMOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogVlRZIGludGVyZmFjZSBwYXNzd29yZCBzZXQuICovCitERUZVTihjb25maWdfcGFzc3dvcmQsIHBhc3N3b3JkX2NtZCwKKyAgICAgICJwYXNzd29yZCAoOHwpIFdPUkQiLAorICAgICAgIkFzc2lnbiB0aGUgdGVybWluYWwgY29ubmVjdGlvbiBwYXNzd29yZFxuIgorICAgICAgIlNwZWNpZmllcyBhIEhJRERFTiBwYXNzd29yZCB3aWxsIGZvbGxvd1xuIgorICAgICAgImR1bW15IHN0cmluZyBcbiIgIlRoZSBISURERU4gbGluZSBwYXNzd29yZCBzdHJpbmdcbiIpCit7CisJLyogQXJndW1lbnQgY2hlY2suICovCisJaWYgKGFyZ2MgPT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIlBsZWFzZSBzcGVjaWZ5IHBhc3N3b3JkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGFyZ2MgPT0gMikgeworCQlpZiAoKmFyZ3ZbMF0gPT0gJzgnKSB7CisJCQlpZiAoaG9zdC5wYXNzd29yZCkKKwkJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkKTsKKwkJCWhvc3QucGFzc3dvcmQgPSBOVUxMOworCQkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOworCQkJaG9zdC5wYXNzd29yZF9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzFdKTsKKwkJCXJldHVybiBDTURfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCXZ0eV9vdXQodnR5LCAiVW5rbm93biBlbmNyeXB0aW9uIHR5cGUuJXMiLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwl9CisKKwlpZiAoIWlzYWxudW0oKGludCkqYXJndlswXSkpIHsKKwkJdnR5X291dCh2dHksCisJCQkiUGxlYXNlIHNwZWNpZnkgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYWxwaGFudW1lcmljJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGhvc3QucGFzc3dvcmQpCisJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmQpOworCWhvc3QucGFzc3dvcmQgPSBOVUxMOworCisjaWZkZWYgVlRZX0NSWVBUX1BXCisJaWYgKGhvc3QuZW5jcnlwdCkgeworCQlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQorCQkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZF9lbmNyeXB0KTsKKwkJaG9zdC5wYXNzd29yZF9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCB6ZW5jcnlwdChhcmd2WzBdKSk7CisJfSBlbHNlCisjZW5kaWYKKwkJaG9zdC5wYXNzd29yZCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0FMSUFTKGNvbmZpZ19wYXNzd29yZCwgcGFzc3dvcmRfdGV4dF9jbWQsCisgICAgICAicGFzc3dvcmQgTElORSIsCisgICAgICAiQXNzaWduIHRoZSB0ZXJtaW5hbCBjb25uZWN0aW9uIHBhc3N3b3JkXG4iCisgICAgICAiVGhlIFVORU5DUllQVEVEIChjbGVhcnRleHQpIGxpbmUgcGFzc3dvcmRcbiIpCisKKy8qIFZUWSBlbmFibGUgcGFzc3dvcmQgc2V0LiAqLworICAgIERFRlVOKGNvbmZpZ19lbmFibGVfcGFzc3dvcmQsIGVuYWJsZV9wYXNzd29yZF9jbWQsCisgICAgICAiZW5hYmxlIHBhc3N3b3JkICg4fCkgV09SRCIsCisgICAgICAiTW9kaWZ5IGVuYWJsZSBwYXNzd29yZCBwYXJhbWV0ZXJzXG4iCisgICAgICAiQXNzaWduIHRoZSBwcml2aWxlZ2VkIGxldmVsIHBhc3N3b3JkXG4iCisgICAgICAiU3BlY2lmaWVzIGEgSElEREVOIHBhc3N3b3JkIHdpbGwgZm9sbG93XG4iCisgICAgICAiZHVtbXkgc3RyaW5nIFxuIiAiVGhlIEhJRERFTiAnZW5hYmxlJyBwYXNzd29yZCBzdHJpbmdcbiIpCit7CisJLyogQXJndW1lbnQgY2hlY2suICovCisJaWYgKGFyZ2MgPT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIlBsZWFzZSBzcGVjaWZ5IHBhc3N3b3JkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJLyogQ3J5cHQgdHlwZSBpcyBzcGVjaWZpZWQuICovCisJaWYgKGFyZ2MgPT0gMikgeworCQlpZiAoKmFyZ3ZbMF0gPT0gJzgnKSB7CisJCQlpZiAoaG9zdC5lbmFibGUpCisJCQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGUpOworCQkJaG9zdC5lbmFibGUgPSBOVUxMOworCisJCQlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwkJCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMV0pOworCisJCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQl2dHlfb3V0KHZ0eSwgIlVua25vd24gZW5jcnlwdGlvbiB0eXBlLiVzIiwgVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJfQorCisJaWYgKCFpc2FsbnVtKChpbnQpKmFyZ3ZbMF0pKSB7CisJCXZ0eV9vdXQodnR5LAorCQkJIlBsZWFzZSBzcGVjaWZ5IHN0cmluZyBzdGFydGluZyB3aXRoIGFscGhhbnVtZXJpYyVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChob3N0LmVuYWJsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGUpOworCWhvc3QuZW5hYmxlID0gTlVMTDsKKworCS8qIFBsYWluIHBhc3N3b3JkIGlucHV0LiAqLworI2lmZGVmIFZUWV9DUllQVF9QVworCWlmIChob3N0LmVuY3J5cHQpIHsKKwkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwkJaG9zdC5lbmFibGVfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgemVuY3J5cHQoYXJndlswXSkpOworCX0gZWxzZQorI2VuZGlmCisJCWhvc3QuZW5hYmxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMoY29uZmlnX2VuYWJsZV9wYXNzd29yZCwKKyAgICAgIGVuYWJsZV9wYXNzd29yZF90ZXh0X2NtZCwKKyAgICAgICJlbmFibGUgcGFzc3dvcmQgTElORSIsCisgICAgICAiTW9kaWZ5IGVuYWJsZSBwYXNzd29yZCBwYXJhbWV0ZXJzXG4iCisgICAgICAiQXNzaWduIHRoZSBwcml2aWxlZ2VkIGxldmVsIHBhc3N3b3JkXG4iCisgICAgICAiVGhlIFVORU5DUllQVEVEIChjbGVhcnRleHQpICdlbmFibGUnIHBhc3N3b3JkXG4iKQorCisvKiBWVFkgZW5hYmxlIHBhc3N3b3JkIGRlbGV0ZS4gKi8KKyAgICBERUZVTihub19jb25maWdfZW5hYmxlX3Bhc3N3b3JkLCBub19lbmFibGVfcGFzc3dvcmRfY21kLAorICAgICAgIm5vIGVuYWJsZSBwYXNzd29yZCIsCisgICAgICBOT19TVFIKKyAgICAgICJNb2RpZnkgZW5hYmxlIHBhc3N3b3JkIHBhcmFtZXRlcnNcbiIKKyAgICAgICJBc3NpZ24gdGhlIHByaXZpbGVnZWQgbGV2ZWwgcGFzc3dvcmRcbiIpCit7CisJaWYgKGhvc3QuZW5hYmxlKQorCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZSk7CisJaG9zdC5lbmFibGUgPSBOVUxMOworCisJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSBOVUxMOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjaWZkZWYgVlRZX0NSWVBUX1BXCitERUZVTihzZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHQsCisgICAgICBzZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kLAorICAgICAgInNlcnZpY2UgcGFzc3dvcmQtZW5jcnlwdGlvbiIsCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGVuY3J5cHRlZCBwYXNzd29yZHNcbiIpCit7CisJaWYgKGhvc3QuZW5jcnlwdCkKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCisJaG9zdC5lbmNyeXB0ID0gMTsKKworCWlmIChob3N0LnBhc3N3b3JkKSB7CisJCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOworCQlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGhvc3QucGFzc3dvcmQpKTsKKwl9CisJaWYgKGhvc3QuZW5hYmxlKSB7CisJCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGhvc3QuZW5hYmxlKSk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19zZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHQsCisgICAgICBub19zZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kLAorICAgICAgIm5vIHNlcnZpY2UgcGFzc3dvcmQtZW5jcnlwdGlvbiIsCisgICAgICBOT19TVFIgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIgIkVuYWJsZSBlbmNyeXB0ZWQgcGFzc3dvcmRzXG4iKQoreworCWlmICghaG9zdC5lbmNyeXB0KQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisKKwlob3N0LmVuY3J5cHQgPSAwOworCisJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZF9lbmNyeXB0KTsKKwlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSBOVUxMOworCisJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSBOVUxMOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorI2VuZGlmCisKK0RFRlVOKGNvbmZpZ190ZXJtaW5hbF9sZW5ndGgsIGNvbmZpZ190ZXJtaW5hbF9sZW5ndGhfY21kLAorICAgICAgInRlcm1pbmFsIGxlbmd0aCA8MC01MTI+IiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICAiU2V0IG51bWJlciBvZiBsaW5lcyBvbiBhIHNjcmVlblxuIgorICAgICAgIk51bWJlciBvZiBsaW5lcyBvbiBzY3JlZW4gKDAgZm9yIG5vIHBhdXNpbmcpXG4iKQoreworCWludCBsaW5lczsKKwljaGFyICplbmRwdHIgPSBOVUxMOworCisJbGluZXMgPSBzdHJ0b2woYXJndlswXSwgJmVuZHB0ciwgMTApOworCWlmIChsaW5lcyA8IDAgfHwgbGluZXMgPiA1MTIgfHwgKmVuZHB0ciAhPSAnXDAnKSB7CisJCXZ0eV9vdXQodnR5LCAibGVuZ3RoIGlzIG1hbGZvcm1lZCVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXZ0eS0+bGluZXMgPSBsaW5lczsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aCwgY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aF9jbWQsCisgICAgICAidGVybWluYWwgbm8gbGVuZ3RoIiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICBOT19TVFIgIlNldCBudW1iZXIgb2YgbGluZXMgb24gYSBzY3JlZW5cbiIpCit7CisJdnR5LT5saW5lcyA9IC0xOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2VydmljZV90ZXJtaW5hbF9sZW5ndGgsIHNlcnZpY2VfdGVybWluYWxfbGVuZ3RoX2NtZCwKKyAgICAgICJzZXJ2aWNlIHRlcm1pbmFsLWxlbmd0aCA8MC01MTI+IiwKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iCisgICAgICAiU3lzdGVtIHdpZGUgdGVybWluYWwgbGVuZ3RoIGNvbmZpZ3VyYXRpb25cbiIKKyAgICAgICJOdW1iZXIgb2YgbGluZXMgb2YgVlRZICgwIG1lYW5zIG5vIGxpbmUgY29udHJvbClcbiIpCit7CisJaW50IGxpbmVzOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisKKwlsaW5lcyA9IHN0cnRvbChhcmd2WzBdLCAmZW5kcHRyLCAxMCk7CisJaWYgKGxpbmVzIDwgMCB8fCBsaW5lcyA+IDUxMiB8fCAqZW5kcHRyICE9ICdcMCcpIHsKKwkJdnR5X291dCh2dHksICJsZW5ndGggaXMgbWFsZm9ybWVkJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJaG9zdC5saW5lcyA9IGxpbmVzOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19zZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aCwgbm9fc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kLAorICAgICAgIm5vIHNlcnZpY2UgdGVybWluYWwtbGVuZ3RoIFs8MC01MTI+XSIsCisgICAgICBOT19TVFIKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iCisgICAgICAiU3lzdGVtIHdpZGUgdGVybWluYWwgbGVuZ3RoIGNvbmZpZ3VyYXRpb25cbiIKKyAgICAgICJOdW1iZXIgb2YgbGluZXMgb2YgVlRZICgwIG1lYW5zIG5vIGxpbmUgY29udHJvbClcbiIpCit7CisJaG9zdC5saW5lcyA9IC0xOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU5fSElEREVOKGRvX2VjaG8sCisJICAgICBlY2hvX2NtZCwKKwkgICAgICJlY2hvIC5NRVNTQUdFIiwKKwkgICAgICJFY2hvIGEgbWVzc2FnZSBiYWNrIHRvIHRoZSB2dHlcbiIgIlRoZSBtZXNzYWdlIHRvIGVjaG9cbiIpCit7CisJY2hhciAqbWVzc2FnZTsKKworCXZ0eV9vdXQodnR5LCAiJXMlcyIsCisJCSgobWVzc2FnZSA9CisJCSAgYXJndl9jb25jYXQoYXJndiwgYXJnYywgMCkpID8gbWVzc2FnZSA6ICIiKSwgVlRZX05FV0xJTkUpOworCWlmIChtZXNzYWdlKQorCQl0YWxsb2NfZnJlZShtZXNzYWdlKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNpZiAwCitERUZVTihjb25maWdfbG9nbXNnLAorICAgICAgY29uZmlnX2xvZ21zZ19jbWQsCisgICAgICAibG9nbXNnICIgTE9HX0xFVkVMUyAiIC5NRVNTQUdFIiwKKyAgICAgICJTZW5kIGEgbWVzc2FnZSB0byBlbmFibGVkIGxvZ2dpbmcgZGVzdGluYXRpb25zXG4iCisgICAgICBMT0dfTEVWRUxfREVTQyAiVGhlIG1lc3NhZ2UgdG8gc2VuZFxuIikKK3sKKwlpbnQgbGV2ZWw7CisJY2hhciAqbWVzc2FnZTsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisKKwl6bG9nKE5VTEwsIGxldmVsLAorCSAgICAgKChtZXNzYWdlID0gYXJndl9jb25jYXQoYXJndiwgYXJnYywgMSkpID8gbWVzc2FnZSA6ICIiKSk7CisJaWYgKG1lc3NhZ2UpCisJCXRhbGxvY19mcmVlKG1lc3NhZ2UpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19sb2dnaW5nLAorICAgICAgc2hvd19sb2dnaW5nX2NtZCwKKyAgICAgICJzaG93IGxvZ2dpbmciLCBTSE9XX1NUUiAiU2hvdyBjdXJyZW50IGxvZ2dpbmcgY29uZmlndXJhdGlvblxuIikKK3sKKwlzdHJ1Y3QgemxvZyAqemwgPSB6bG9nX2RlZmF1bHQ7CisKKwl2dHlfb3V0KHZ0eSwgIlN5c2xvZyBsb2dnaW5nOiAiKTsKKwlpZiAoemwtPm1heGx2bFtaTE9HX0RFU1RfU1lTTE9HXSA9PSBaTE9HX0RJU0FCTEVEKQorCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzLCBmYWNpbGl0eSAlcywgaWRlbnQgJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9TWVNMT0ddXSwKKwkJCWZhY2lsaXR5X25hbWUoemwtPmZhY2lsaXR5KSwgemwtPmlkZW50KTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICJTdGRvdXQgbG9nZ2luZzogIik7CisJaWYgKHpsLT5tYXhsdmxbWkxPR19ERVNUX1NURE9VVF0gPT0gWkxPR19ESVNBQkxFRCkKKwkJdnR5X291dCh2dHksICJkaXNhYmxlZCIpOworCWVsc2UKKwkJdnR5X291dCh2dHksICJsZXZlbCAlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psLT5tYXhsdmxbWkxPR19ERVNUX1NURE9VVF1dKTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICJNb25pdG9yIGxvZ2dpbmc6ICIpOworCWlmICh6bC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXSA9PSBaTE9HX0RJU0FCTEVEKQorCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemwtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl1dKTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICJGaWxlIGxvZ2dpbmc6ICIpOworCWlmICgoemwtPm1heGx2bFtaTE9HX0RFU1RfRklMRV0gPT0gWkxPR19ESVNBQkxFRCkgfHwgIXpsLT5mcCkKKwkJdnR5X291dCh2dHksICJkaXNhYmxlZCIpOworCWVsc2UKKwkJdnR5X291dCh2dHksICJsZXZlbCAlcywgZmlsZW5hbWUgJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9GSUxFXV0sCisJCQl6bC0+ZmlsZW5hbWUpOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIlByb3RvY29sIG5hbWU6ICVzJXMiLAorCQl6bG9nX3Byb3RvX25hbWVzW3psLT5wcm90b2NvbF0sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlJlY29yZCBwcmlvcml0eTogJXMlcyIsCisJCSh6bC0+cmVjb3JkX3ByaW9yaXR5ID8gImVuYWJsZWQiIDogImRpc2FibGVkIiksIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19zdGRvdXQsCisgICAgICBjb25maWdfbG9nX3N0ZG91dF9jbWQsCisgICAgICAibG9nIHN0ZG91dCIsICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzdGRvdXQgbG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1RET1VULCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfc3Rkb3V0X2xldmVsLAorICAgICAgY29uZmlnX2xvZ19zdGRvdXRfbGV2ZWxfY21kLAorICAgICAgImxvZyBzdGRvdXQgIiBMT0dfTEVWRUxTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHN0ZG91dCBsb2dnaW5nIGxldmVsXG4iIExPR19MRVZFTF9ERVNDKQoreworCWludCBsZXZlbDsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NURE9VVCwgbGV2ZWwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19zdGRvdXQsCisgICAgICBub19jb25maWdfbG9nX3N0ZG91dF9jbWQsCisgICAgICAibm8gbG9nIHN0ZG91dCBbTEVWRUxdIiwKKyAgICAgIE5PX1NUUiAiTG9nZ2luZyBjb250cm9sXG4iICJDYW5jZWwgbG9nZ2luZyB0byBzdGRvdXRcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NURE9VVCwgWkxPR19ESVNBQkxFRCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX21vbml0b3IsCisgICAgICBjb25maWdfbG9nX21vbml0b3JfY21kLAorICAgICAgImxvZyBtb25pdG9yIiwKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCB0ZXJtaW5hbCBsaW5lIChtb25pdG9yKSBsb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9NT05JVE9SLCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfbW9uaXRvcl9sZXZlbCwKKyAgICAgIGNvbmZpZ19sb2dfbW9uaXRvcl9sZXZlbF9jbWQsCisgICAgICAibG9nIG1vbml0b3IgIiBMT0dfTEVWRUxTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIChtb25pdG9yKSBsb2dnaW5nIGxldmVsXG4iIExPR19MRVZFTF9ERVNDKQoreworCWludCBsZXZlbDsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX01PTklUT1IsIGxldmVsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfbW9uaXRvciwKKyAgICAgIG5vX2NvbmZpZ19sb2dfbW9uaXRvcl9jbWQsCisgICAgICAibm8gbG9nIG1vbml0b3IgW0xFVkVMXSIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJEaXNhYmxlIHRlcm1pbmFsIGxpbmUgKG1vbml0b3IpIGxvZ2dpbmdcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX01PTklUT1IsIFpMT0dfRElTQUJMRUQpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzZXRfbG9nX2ZpbGUoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpmbmFtZSwgaW50IGxvZ2xldmVsKQoreworCWludCByZXQ7CisJY2hhciAqcCA9IE5VTEw7CisJY29uc3QgY2hhciAqZnVsbHBhdGg7CisKKwkvKiBQYXRoIGRldGVjdGlvbi4gKi8KKwlpZiAoIUlTX0RJUkVDVE9SWV9TRVAoKmZuYW1lKSkgeworCQljaGFyIGN3ZFtNQVhQQVRITEVOICsgMV07CisJCWN3ZFtNQVhQQVRITEVOXSA9ICdcMCc7CisKKwkJaWYgKGdldGN3ZChjd2QsIE1BWFBBVEhMRU4pID09IE5VTEwpIHsKKwkJCXpsb2dfZXJyKCJjb25maWdfbG9nX2ZpbGU6IFVuYWJsZSB0byBhbGxvYyBtZW0hIik7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKworCQlpZiAoKHAgPSBfdGFsbG9jX3plcm8odGFsbF92Y21kX2N0eCwKKwkJCQkgICAgICBzdHJsZW4oY3dkKSArIHN0cmxlbihmbmFtZSkgKyAyKSwKKwkJCQkgICAgICAic2V0X2xvZ19maWxlIikKKwkJICAgID09IE5VTEwpIHsKKwkJCXpsb2dfZXJyKCJjb25maWdfbG9nX2ZpbGU6IFVuYWJsZSB0byBhbGxvYyBtZW0hIik7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJc3ByaW50ZihwLCAiJXMvJXMiLCBjd2QsIGZuYW1lKTsKKwkJZnVsbHBhdGggPSBwOworCX0gZWxzZQorCQlmdWxscGF0aCA9IGZuYW1lOworCisJcmV0ID0gemxvZ19zZXRfZmlsZShOVUxMLCBmdWxscGF0aCwgbG9nbGV2ZWwpOworCisJaWYgKHApCisJCXRhbGxvY19mcmVlKHApOworCisJaWYgKCFyZXQpIHsKKwkJdnR5X291dCh2dHksICJjYW4ndCBvcGVuIGxvZ2ZpbGUgJXNcbiIsIGZuYW1lKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChob3N0LmxvZ2ZpbGUpCisJCXRhbGxvY19mcmVlKGhvc3QubG9nZmlsZSk7CisKKwlob3N0LmxvZ2ZpbGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGZuYW1lKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19maWxlLAorICAgICAgY29uZmlnX2xvZ19maWxlX2NtZCwKKyAgICAgICJsb2cgZmlsZSBGSUxFTkFNRSIsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJMb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZW5hbWVcbiIpCit7CisJcmV0dXJuIHNldF9sb2dfZmlsZSh2dHksIGFyZ3ZbMF0sIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworfQorCitERUZVTihjb25maWdfbG9nX2ZpbGVfbGV2ZWwsCisgICAgICBjb25maWdfbG9nX2ZpbGVfbGV2ZWxfY21kLAorICAgICAgImxvZyBmaWxlIEZJTEVOQU1FICIgTE9HX0xFVkVMUywKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJMb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZW5hbWVcbiIgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IGxldmVsOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMV0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwlyZXR1cm4gc2V0X2xvZ19maWxlKHZ0eSwgYXJndlswXSwgbGV2ZWwpOworfQorCitERUZVTihub19jb25maWdfbG9nX2ZpbGUsCisgICAgICBub19jb25maWdfbG9nX2ZpbGVfY21kLAorICAgICAgIm5vIGxvZyBmaWxlIFtGSUxFTkFNRV0iLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJDYW5jZWwgbG9nZ2luZyB0byBmaWxlXG4iICJMb2dnaW5nIGZpbGUgbmFtZVxuIikKK3sKKwl6bG9nX3Jlc2V0X2ZpbGUoTlVMTCk7CisKKwlpZiAoaG9zdC5sb2dmaWxlKQorCQl0YWxsb2NfZnJlZShob3N0LmxvZ2ZpbGUpOworCisJaG9zdC5sb2dmaWxlID0gTlVMTDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMobm9fY29uZmlnX2xvZ19maWxlLAorICAgICAgbm9fY29uZmlnX2xvZ19maWxlX2xldmVsX2NtZCwKKyAgICAgICJubyBsb2cgZmlsZSBGSUxFTkFNRSBMRVZFTCIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJDYW5jZWwgbG9nZ2luZyB0byBmaWxlXG4iICJMb2dnaW5nIGZpbGUgbmFtZVxuIiAiTG9nZ2luZyBsZXZlbFxuIikKKworICAgIERFRlVOKGNvbmZpZ19sb2dfc3lzbG9nLAorICAgICAgY29uZmlnX2xvZ19zeXNsb2dfY21kLAorICAgICAgImxvZyBzeXNsb2ciLCAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgc3lzbG9nIGxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX3N5c2xvZ19sZXZlbCwKKyAgICAgIGNvbmZpZ19sb2dfc3lzbG9nX2xldmVsX2NtZCwKKyAgICAgICJsb2cgc3lzbG9nICIgTE9HX0xFVkVMUywKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzeXNsb2cgbG9nZ2luZyBsZXZlbFxuIiBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlswXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIGxldmVsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOX0RFUFJFQ0FURUQoY29uZmlnX2xvZ19zeXNsb2dfZmFjaWxpdHksCisJCSBjb25maWdfbG9nX3N5c2xvZ19mYWNpbGl0eV9jbWQsCisJCSAibG9nIHN5c2xvZyBmYWNpbGl0eSAiIExPR19GQUNJTElUSUVTLAorCQkgIkxvZ2dpbmcgY29udHJvbFxuIgorCQkgIkxvZ2dpbmcgZ29lcyB0byBzeXNsb2dcbiIKKwkJICIoRGVwcmVjYXRlZCkgRmFjaWxpdHkgcGFyYW1ldGVyIGZvciBzeXNsb2cgbWVzc2FnZXNcbiIKKwkJIExPR19GQUNJTElUWV9ERVNDKQoreworCWludCBmYWNpbGl0eTsKKworCWlmICgoZmFjaWxpdHkgPSBmYWNpbGl0eV9tYXRjaChhcmd2WzBdKSkgPCAwKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworCXpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkgPSBmYWNpbGl0eTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfc3lzbG9nLAorICAgICAgbm9fY29uZmlnX2xvZ19zeXNsb2dfY21kLAorICAgICAgIm5vIGxvZyBzeXNsb2cgW0xFVkVMXSIsCisgICAgICBOT19TVFIgIkxvZ2dpbmcgY29udHJvbFxuIiAiQ2FuY2VsIGxvZ2dpbmcgdG8gc3lzbG9nXG4iICJMb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIFpMT0dfRElTQUJMRUQpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMobm9fY29uZmlnX2xvZ19zeXNsb2csCisgICAgICBub19jb25maWdfbG9nX3N5c2xvZ19mYWNpbGl0eV9jbWQsCisgICAgICAibm8gbG9nIHN5c2xvZyBmYWNpbGl0eSAiIExPR19GQUNJTElUSUVTLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiTG9nZ2luZyBnb2VzIHRvIHN5c2xvZ1xuIgorICAgICAgIkZhY2lsaXR5IHBhcmFtZXRlciBmb3Igc3lzbG9nIG1lc3NhZ2VzXG4iIExPR19GQUNJTElUWV9ERVNDKQorCisgICAgREVGVU4oY29uZmlnX2xvZ19mYWNpbGl0eSwKKyAgICAgIGNvbmZpZ19sb2dfZmFjaWxpdHlfY21kLAorICAgICAgImxvZyBmYWNpbGl0eSAiIExPR19GQUNJTElUSUVTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkZhY2lsaXR5IHBhcmFtZXRlciBmb3Igc3lzbG9nIG1lc3NhZ2VzXG4iIExPR19GQUNJTElUWV9ERVNDKQoreworCWludCBmYWNpbGl0eTsKKworCWlmICgoZmFjaWxpdHkgPSBmYWNpbGl0eV9tYXRjaChhcmd2WzBdKSkgPCAwKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl6bG9nX2RlZmF1bHQtPmZhY2lsaXR5ID0gZmFjaWxpdHk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX2ZhY2lsaXR5LAorICAgICAgbm9fY29uZmlnX2xvZ19mYWNpbGl0eV9jbWQsCisgICAgICAibm8gbG9nIGZhY2lsaXR5IFtGQUNJTElUWV0iLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiUmVzZXQgc3lzbG9nIGZhY2lsaXR5IHRvIGRlZmF1bHQgKGRhZW1vbilcbiIgIlN5c2xvZyBmYWNpbGl0eVxuIikKK3sKKwl6bG9nX2RlZmF1bHQtPmZhY2lsaXR5ID0gTE9HX0RBRU1PTjsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOX0RFUFJFQ0FURUQoY29uZmlnX2xvZ190cmFwLAorCQkgY29uZmlnX2xvZ190cmFwX2NtZCwKKwkJICJsb2cgdHJhcCAiIExPR19MRVZFTFMsCisJCSAiTG9nZ2luZyBjb250cm9sXG4iCisJCSAiKERlcHJlY2F0ZWQpIFNldCBsb2dnaW5nIGxldmVsIGFuZCBkZWZhdWx0IGZvciBhbGwgZGVzdGluYXRpb25zXG4iCisJCSBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbmV3X2xldmVsOworCWludCBpOworCisJaWYgKChuZXdfbGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisKKwl6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsID0gbmV3X2xldmVsOworCWZvciAoaSA9IDA7IGkgPCBaTE9HX05VTV9ERVNUUzsgaSsrKQorCQlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbaV0gIT0gWkxPR19ESVNBQkxFRCkKKwkJCXpsb2dfZGVmYXVsdC0+bWF4bHZsW2ldID0gbmV3X2xldmVsOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU5fREVQUkVDQVRFRChub19jb25maWdfbG9nX3RyYXAsCisJCSBub19jb25maWdfbG9nX3RyYXBfY21kLAorCQkgIm5vIGxvZyB0cmFwIFtMRVZFTF0iLAorCQkgTk9fU1RSCisJCSAiTG9nZ2luZyBjb250cm9sXG4iCisJCSAiUGVybWl0IGFsbCBsb2dnaW5nIGluZm9ybWF0aW9uXG4iICJMb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwgPSBMT0dfREVCVUc7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX3JlY29yZF9wcmlvcml0eSwKKyAgICAgIGNvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5X2NtZCwKKyAgICAgICJsb2cgcmVjb3JkLXByaW9yaXR5IiwKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJMb2cgdGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgbWVzc2FnZVxuIikKK3sKKwl6bG9nX2RlZmF1bHQtPnJlY29yZF9wcmlvcml0eSA9IDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX3JlY29yZF9wcmlvcml0eSwKKyAgICAgIG5vX2NvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5X2NtZCwKKyAgICAgICJubyBsb2cgcmVjb3JkLXByaW9yaXR5IiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkRvIG5vdCBsb2cgdGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgbWVzc2FnZVxuIikKK3sKKwl6bG9nX2RlZmF1bHQtPnJlY29yZF9wcmlvcml0eSA9IDA7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorI2VuZGlmCisKK0RFRlVOKGJhbm5lcl9tb3RkX2ZpbGUsCisgICAgICBiYW5uZXJfbW90ZF9maWxlX2NtZCwKKyAgICAgICJiYW5uZXIgbW90ZCBmaWxlIFtGSUxFXSIsCisgICAgICAiU2V0IGJhbm5lclxuIiAiQmFubmVyIGZvciBtb3RkXG4iICJCYW5uZXIgZnJvbSBhIGZpbGVcbiIgIkZpbGVuYW1lXG4iKQoreworCWlmIChob3N0Lm1vdGRmaWxlKQorCQl0YWxsb2NfZnJlZShob3N0Lm1vdGRmaWxlKTsKKwlob3N0Lm1vdGRmaWxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oYmFubmVyX21vdGRfZGVmYXVsdCwKKyAgICAgIGJhbm5lcl9tb3RkX2RlZmF1bHRfY21kLAorICAgICAgImJhbm5lciBtb3RkIGRlZmF1bHQiLAorICAgICAgIlNldCBiYW5uZXIgc3RyaW5nXG4iICJTdHJpbmdzIGZvciBtb3RkXG4iICJEZWZhdWx0IHN0cmluZ1xuIikKK3sKKwlob3N0Lm1vdGQgPSBkZWZhdWx0X21vdGQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19iYW5uZXJfbW90ZCwKKyAgICAgIG5vX2Jhbm5lcl9tb3RkX2NtZCwKKyAgICAgICJubyBiYW5uZXIgbW90ZCIsIE5PX1NUUiAiU2V0IGJhbm5lciBzdHJpbmdcbiIgIlN0cmluZ3MgZm9yIG1vdGRcbiIpCit7CisJaG9zdC5tb3RkID0gTlVMTDsKKwlpZiAoaG9zdC5tb3RkZmlsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5tb3RkZmlsZSk7CisJaG9zdC5tb3RkZmlsZSA9IE5VTEw7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBTZXQgY29uZmlnIGZpbGVuYW1lLiAgQ2FsbGVkIGZyb20gdnR5LmMgKi8KK3ZvaWQgaG9zdF9jb25maWdfc2V0KGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWhvc3QuY29uZmlnID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBmaWxlbmFtZSk7Cit9CisKK3ZvaWQgaW5zdGFsbF9kZWZhdWx0KGVudW0gbm9kZV90eXBlIG5vZGUpCit7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfZXhpdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX3F1aXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19lbmRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19oZWxwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfbGlzdF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfdGVybWluYWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ193cml0ZV9maWxlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfbWVtb3J5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJnNob3dfcnVubmluZ19jb25maWdfY21kKTsKK30KKworLyogSW5pdGlhbGl6ZSBjb21tYW5kIGludGVyZmFjZS4gSW5zdGFsbCBiYXNpYyBub2RlcyBhbmQgY29tbWFuZHMuICovCit2b2lkIGNtZF9pbml0KGludCB0ZXJtaW5hbCkKK3sKKwkvKiBBbGxvY2F0ZSBpbml0aWFsIHRvcCB2ZWN0b3Igb2YgY29tbWFuZHMuICovCisJY21kdmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKworCS8qIERlZmF1bHQgaG9zdCB2YWx1ZSBzZXR0aW5ncy4gKi8KKwlob3N0Lm5hbWUgPSBOVUxMOworCWhvc3QucGFzc3dvcmQgPSBOVUxMOworCWhvc3QuZW5hYmxlID0gTlVMTDsKKwlob3N0LmxvZ2ZpbGUgPSBOVUxMOworCWhvc3QuY29uZmlnID0gTlVMTDsKKwlob3N0LmxpbmVzID0gLTE7CisJaG9zdC5tb3RkID0gZGVmYXVsdF9tb3RkOworCWhvc3QubW90ZGZpbGUgPSBOVUxMOworCisJLyogSW5zdGFsbCB0b3Agbm9kZXMuICovCisJaW5zdGFsbF9ub2RlKCZ2aWV3X25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmZW5hYmxlX25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmYXV0aF9ub2RlLCBOVUxMKTsKKwlpbnN0YWxsX25vZGUoJmF1dGhfZW5hYmxlX25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmY29uZmlnX25vZGUsIGNvbmZpZ193cml0ZV9ob3N0KTsKKworCS8qIEVhY2ggbm9kZSdzIGJhc2ljIGNvbW1hbmRzLiAqLworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3ZlcnNpb25fY21kKTsKKwlpZiAodGVybWluYWwpIHsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19saXN0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfZXhpdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX3F1aXRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19oZWxwX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfZW5hYmxlX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfdGVybWluYWxfbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfdGVybWluYWxfbm9fbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZlY2hvX2NtZCk7CisJfQorCisJaWYgKHRlcm1pbmFsKSB7CisJCWluc3RhbGxfZGVmYXVsdChFTkFCTEVfTk9ERSk7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ19kaXNhYmxlX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQgKEVOQUJMRV9OT0RFLCAmY29weV9ydW5uaW5nY29uZmlnX3N0YXJ0dXBjb25maWdfY21kKTsKKwl9CisJaW5zdGFsbF9lbGVtZW50IChFTkFCTEVfTk9ERSwgJnNob3dfc3RhcnR1cF9jb25maWdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZzaG93X3ZlcnNpb25fY21kKTsKKworCWlmICh0ZXJtaW5hbCkgeworCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZjb25maWdfdGVybWluYWxfbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9ub19sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmZWNob19jbWQpOworCisJCWluc3RhbGxfZGVmYXVsdChDT05GSUdfTk9ERSk7CisJfQorCisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmaG9zdG5hbWVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19ob3N0bmFtZV9jbWQpOworCisJaWYgKHRlcm1pbmFsKSB7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnBhc3N3b3JkX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnBhc3N3b3JkX3RleHRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmZW5hYmxlX3Bhc3N3b3JkX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmVuYWJsZV9wYXNzd29yZF90ZXh0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX2VuYWJsZV9wYXNzd29yZF9jbWQpOworCisjaWZkZWYgVlRZX0NSWVBUX1BXCisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnNlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19zZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kKTsKKyNlbmRpZgorCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZiYW5uZXJfbW90ZF9kZWZhdWx0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmJhbm5lcl9tb3RkX2ZpbGVfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fYmFubmVyX21vdGRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kKTsKKworCX0KKwlzcmFuZCh0aW1lKE5VTEwpKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS92ZWN0b3IuYyBiL29wZW5ic2Mvc3JjL3Z0eS92ZWN0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjQ3YWU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L3ZlY3Rvci5jCkBAIC0wLDAgKzEsMTkyIEBACisvKiBHZW5lcmljIHZlY3RvciBpbnRlcmZhY2Ugcm91dGluZQorICogQ29weXJpZ2h0IChDKSAxOTk3IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgKiAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dnR5L3ZlY3Rvci5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKwordm9pZCAqdGFsbF92dHlfdmVjX2N0eDsKKworLyogSW5pdGlhbGl6ZSB2ZWN0b3IgOiBhbGxvY2F0ZSBtZW1vcnkgYW5kIHJldHVybiB2ZWN0b3IuICovCit2ZWN0b3IgdmVjdG9yX2luaXQodW5zaWduZWQgaW50IHNpemUpCit7CisJdmVjdG9yIHYgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzdHJ1Y3QgX3ZlY3Rvcik7CisJaWYgKCF2KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGFsbG9jYXRlIGF0IGxlYXN0IG9uZSBzbG90ICovCisJaWYgKHNpemUgPT0gMCkKKwkJc2l6ZSA9IDE7CisKKwl2LT5hbGxvY2VkID0gc2l6ZTsKKwl2LT5hY3RpdmUgPSAwOworCXYtPmluZGV4ID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X3ZlY19jdHgsIHNpemVvZih2b2lkICopICogc2l6ZSwKKwkJCQkidmVjdG9yX2luaXQ6aW5kZXgiKTsKKwlpZiAoIXYtPmluZGV4KSB7CisJCXRhbGxvY19mcmVlKHYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHY7Cit9CisKK3ZvaWQgdmVjdG9yX29ubHlfd3JhcHBlcl9mcmVlKHZlY3RvciB2KQoreworCXRhbGxvY19mcmVlKHYpOworfQorCit2b2lkIHZlY3Rvcl9vbmx5X2luZGV4X2ZyZWUodm9pZCAqaW5kZXgpCit7CisJdGFsbG9jX2ZyZWUoaW5kZXgpOworfQorCit2b2lkIHZlY3Rvcl9mcmVlKHZlY3RvciB2KQoreworCXRhbGxvY19mcmVlKHYtPmluZGV4KTsKKwl0YWxsb2NfZnJlZSh2KTsKK30KKwordmVjdG9yIHZlY3Rvcl9jb3B5KHZlY3RvciB2KQoreworCXVuc2lnbmVkIGludCBzaXplOworCXZlY3RvciBuZXcgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzdHJ1Y3QgX3ZlY3Rvcik7CisJaWYgKCFuZXcpCisJCXJldHVybiBOVUxMOworCisJbmV3LT5hY3RpdmUgPSB2LT5hY3RpdmU7CisJbmV3LT5hbGxvY2VkID0gdi0+YWxsb2NlZDsKKworCXNpemUgPSBzaXplb2Yodm9pZCAqKSAqICh2LT5hbGxvY2VkKTsKKwluZXctPmluZGV4ID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X3ZlY19jdHgsIHNpemUsICJ2ZWN0b3JfY29weTppbmRleCIpOworCWlmICghbmV3LT5pbmRleCkgeworCQl0YWxsb2NfZnJlZShuZXcpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtY3B5KG5ldy0+aW5kZXgsIHYtPmluZGV4LCBzaXplKTsKKworCXJldHVybiBuZXc7Cit9CisKKy8qIENoZWNrIGFzc2lnbmVkIGluZGV4LCBhbmQgaWYgaXQgcnVucyBzaG9ydCBkb3VibGUgaW5kZXggcG9pbnRlciAqLwordm9pZCB2ZWN0b3JfZW5zdXJlKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgbnVtKQoreworCWlmICh2LT5hbGxvY2VkID4gbnVtKQorCQlyZXR1cm47CisKKwl2LT5pbmRleCA9IHRhbGxvY19yZWFsbG9jX3NpemUodGFsbF92dHlfdmVjX2N0eCwgdi0+aW5kZXgsCisJCQkJICAgICAgIHNpemVvZih2b2lkICopICogKHYtPmFsbG9jZWQgKiAyKSk7CisJbWVtc2V0KCZ2LT5pbmRleFt2LT5hbGxvY2VkXSwgMCwgc2l6ZW9mKHZvaWQgKikgKiB2LT5hbGxvY2VkKTsKKwl2LT5hbGxvY2VkICo9IDI7CisKKwlpZiAodi0+YWxsb2NlZCA8PSBudW0pCisJCXZlY3Rvcl9lbnN1cmUodiwgbnVtKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBvbmx5IHJldHVybnMgbmV4dCBlbXB0eSBzbG90IGluZGV4LiAgSXQgZG9zZSBub3QgbWVhbgorICAgdGhlIHNsb3QncyBpbmRleCBtZW1vcnkgaXMgYXNzaWduZWQsIHBsZWFzZSBjYWxsIHZlY3Rvcl9lbnN1cmUoKQorICAgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAqLworaW50IHZlY3Rvcl9lbXB0eV9zbG90KHZlY3RvciB2KQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKHYtPmFjdGl2ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCB2LT5hY3RpdmU7IGkrKykKKwkJaWYgKHYtPmluZGV4W2ldID09IDApCisJCQlyZXR1cm4gaTsKKworCXJldHVybiBpOworfQorCisvKiBTZXQgdmFsdWUgdG8gdGhlIHNtYWxsZXN0IGVtcHR5IHNsb3QuICovCitpbnQgdmVjdG9yX3NldCh2ZWN0b3Igdiwgdm9pZCAqdmFsKQoreworCXVuc2lnbmVkIGludCBpOworCisJaSA9IHZlY3Rvcl9lbXB0eV9zbG90KHYpOworCXZlY3Rvcl9lbnN1cmUodiwgaSk7CisKKwl2LT5pbmRleFtpXSA9IHZhbDsKKworCWlmICh2LT5hY3RpdmUgPD0gaSkKKwkJdi0+YWN0aXZlID0gaSArIDE7CisKKwlyZXR1cm4gaTsKK30KKworLyogU2V0IHZhbHVlIHRvIHNwZWNpZmllZCBpbmRleCBzbG90LiAqLworaW50IHZlY3Rvcl9zZXRfaW5kZXgodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpLCB2b2lkICp2YWwpCit7CisJdmVjdG9yX2Vuc3VyZSh2LCBpKTsKKworCXYtPmluZGV4W2ldID0gdmFsOworCisJaWYgKHYtPmFjdGl2ZSA8PSBpKQorCQl2LT5hY3RpdmUgPSBpICsgMTsKKworCXJldHVybiBpOworfQorCisvKiBMb29rIHVwIHZlY3Rvci4gICovCit2b2lkICp2ZWN0b3JfbG9va3VwKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSA+PSB2LT5hY3RpdmUpCisJCXJldHVybiBOVUxMOworCXJldHVybiB2LT5pbmRleFtpXTsKK30KKworLyogTG9va3VwIHZlY3RvciwgZW5zdXJlIGl0LiAqLwordm9pZCAqdmVjdG9yX2xvb2t1cF9lbnN1cmUodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpKQoreworCXZlY3Rvcl9lbnN1cmUodiwgaSk7CisJcmV0dXJuIHYtPmluZGV4W2ldOworfQorCisvKiBVbnNldCB2YWx1ZSBhdCBzcGVjaWZpZWQgaW5kZXggc2xvdC4gKi8KK3ZvaWQgdmVjdG9yX3Vuc2V0KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSA+PSB2LT5hbGxvY2VkKQorCQlyZXR1cm47CisKKwl2LT5pbmRleFtpXSA9IE5VTEw7CisKKwlpZiAoaSArIDEgPT0gdi0+YWN0aXZlKSB7CisJCXYtPmFjdGl2ZS0tOworCQl3aGlsZSAoaSAmJiB2LT5pbmRleFstLWldID09IE5VTEwgJiYgdi0+YWN0aXZlLS0pIDsJLyogSXMgdGhpcyB1Z2x5ID8gKi8KKwl9Cit9CisKKy8qIENvdW50IHRoZSBudW1iZXIgb2Ygbm90IGVtcGx0eSBzbG90LiAqLwordW5zaWduZWQgaW50IHZlY3Rvcl9jb3VudCh2ZWN0b3IgdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBjb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdi0+YWN0aXZlOyBpKyspCisJCWlmICh2LT5pbmRleFtpXSAhPSBOVUxMKQorCQkJY291bnQrKzsKKworCXJldHVybiBjb3VudDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS92dHkuYyBiL29wZW5ic2Mvc3JjL3Z0eS92dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODA2ODU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L3Z0eS5jCkBAIC0wLDAgKzEsMTY3NSBAQAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPGFycGEvdGVsbmV0Lmg+CisKKyNpbmNsdWRlICJjYXJkc2hlbGwuaCIKKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx2dHkvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKy8qIG91ciBjYWxsYmFjaywgbG9jYXRlZCBpbiB0ZWxuZXRfaW50ZXJmYWNlLmMgKi8KK3ZvaWQgdnR5X2V2ZW50KGVudW0gZXZlbnQgZXZlbnQsIGludCBzb2NrLCBzdHJ1Y3QgdnR5ICp2dHkpOworCitleHRlcm4gc3RydWN0IGhvc3QgaG9zdDsKKworLyogVmVjdG9yIHdoaWNoIHN0b3JlIGVhY2ggdnR5IHN0cnVjdHVyZS4gKi8KK3N0YXRpYyB2ZWN0b3IgdnR5dmVjOworCit2ZWN0b3IgVnZ0eV9zZXJ2X3RocmVhZDsKKworY2hhciAqdnR5X2N3ZCA9IE5VTEw7CisKKy8qIENvbmZpZ3VyZSBsb2NrLiAqLworc3RhdGljIGludCB2dHlfY29uZmlnOworCitzdGF0aWMgaW50IG5vX3Bhc3N3b3JkX2NoZWNrID0gMTsKKwordm9pZCAqdGFsbF92dHlfY3R4OworCitzdGF0aWMgdm9pZCB2dHlfY2xlYXJfYnVmKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwltZW1zZXQodnR5LT5idWYsIDAsIHZ0eS0+bWF4KTsKK30KKworLyogQWxsb2NhdGUgbmV3IHZ0eSBzdHJ1Y3QuICovCitzdHJ1Y3QgdnR5ICp2dHlfbmV3KCkKK3sKKwlzdHJ1Y3QgdnR5ICpuZXcgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsIHN0cnVjdCB2dHkpOworCisJaWYgKCFuZXcpCisJCWdvdG8gb3V0OworCisJbmV3LT5vYnVmID0gYnVmZmVyX25ldyhuZXcsIDApOwkvKiBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZS4gKi8KKwlpZiAoIW5ldy0+b2J1ZikKKwkJZ290byBvdXRfbmV3OworCW5ldy0+YnVmID0gX3RhbGxvY196ZXJvKG5ldywgVlRZX0JVRlNJWiwgInZ0eV9uZXctPmJ1ZiIpOworCWlmICghbmV3LT5idWYpCisJCWdvdG8gb3V0X29idWY7CisKKwluZXctPm1heCA9IFZUWV9CVUZTSVo7CisKKwlyZXR1cm4gbmV3OworCitvdXRfb2J1ZjoKKwlidWZmZXJfZnJlZShuZXctPm9idWYpOworb3V0X25ldzoKKwl0YWxsb2NfZnJlZShuZXcpOworCW5ldyA9IE5VTEw7CitvdXQ6CisJcmV0dXJuIG5ldzsKK30KKworLyogQXV0aGVudGljYXRpb24gb2YgdnR5ICovCitzdGF0aWMgdm9pZCB2dHlfYXV0aChzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgKmJ1ZikKK3sKKwljaGFyICpwYXNzd2QgPSBOVUxMOworCWVudW0gbm9kZV90eXBlIG5leHRfbm9kZSA9IDA7CisJaW50IGZhaWw7CisJY2hhciAqY3J5cHQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIEFVVEhfTk9ERToKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwkJaWYgKGhvc3QuZW5jcnlwdCkKKwkJCXBhc3N3ZCA9IGhvc3QucGFzc3dvcmRfZW5jcnlwdDsKKwkJZWxzZQorI2VuZGlmCisJCQlwYXNzd2QgPSBob3N0LnBhc3N3b3JkOworCQlpZiAoaG9zdC5hZHZhbmNlZCkKKwkJCW5leHRfbm9kZSA9IGhvc3QuZW5hYmxlID8gVklFV19OT0RFIDogRU5BQkxFX05PREU7CisJCWVsc2UKKwkJCW5leHRfbm9kZSA9IFZJRVdfTk9ERTsKKwkJYnJlYWs7CisJY2FzZSBBVVRIX0VOQUJMRV9OT0RFOgorI2lmZGVmIFZUWV9DUllQVF9QVworCQlpZiAoaG9zdC5lbmNyeXB0KQorCQkJcGFzc3dkID0gaG9zdC5lbmFibGVfZW5jcnlwdDsKKwkJZWxzZQorI2VuZGlmCisJCQlwYXNzd2QgPSBob3N0LmVuYWJsZTsKKwkJbmV4dF9ub2RlID0gRU5BQkxFX05PREU7CisJCWJyZWFrOworCX0KKworCWlmIChwYXNzd2QpIHsKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwkJaWYgKGhvc3QuZW5jcnlwdCkKKwkJCWZhaWwgPSBzdHJjbXAoY3J5cHQoYnVmLCBwYXNzd2QpLCBwYXNzd2QpOworCQllbHNlCisjZW5kaWYKKwkJCWZhaWwgPSBzdHJjbXAoYnVmLCBwYXNzd2QpOworCX0gZWxzZQorCQlmYWlsID0gMTsKKworCWlmICghZmFpbCkgeworCQl2dHktPmZhaWwgPSAwOworCQl2dHktPm5vZGUgPSBuZXh0X25vZGU7CS8qIFN1Y2Nlc3MgISAqLworCX0gZWxzZSB7CisJCXZ0eS0+ZmFpbCsrOworCQlpZiAodnR5LT5mYWlsID49IDMpIHsKKwkJCWlmICh2dHktPm5vZGUgPT0gQVVUSF9OT0RFKSB7CisJCQkJdnR5X291dCh2dHksCisJCQkJCSIlJSBCYWQgcGFzc3dvcmRzLCB0b28gbWFueSBmYWlsdXJlcyElcyIsCisJCQkJCVZUWV9ORVdMSU5FKTsKKwkJCQl2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKKwkJCX0gZWxzZSB7CisJCQkJLyogQVVUSF9FTkFCTEVfTk9ERSAqLworCQkJCXZ0eS0+ZmFpbCA9IDA7CisJCQkJdnR5X291dCh2dHksCisJCQkJCSIlJSBCYWQgZW5hYmxlIHBhc3N3b3JkcywgdG9vIG1hbnkgZmFpbHVyZXMhJXMiLAorCQkJCQlWVFlfTkVXTElORSk7CisJCQkJdnR5LT5ub2RlID0gVklFV19OT0RFOworCQkJfQorCQl9CisJfQorfQorCisvKiBDbG9zZSB2dHkgaW50ZXJmYWNlLiAqLwordm9pZCB2dHlfY2xvc2Uoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCBpOworCisJaWYgKHZ0eS0+b2J1ZikgIHsKKwkJLyogRmx1c2ggYnVmZmVyLiAqLworCQlidWZmZXJfZmx1c2hfYWxsKHZ0eS0+b2J1ZiwgdnR5LT5mZCk7CisKKwkJLyogRnJlZSBpbnB1dCBidWZmZXIuICovCisJCWJ1ZmZlcl9mcmVlKHZ0eS0+b2J1Zik7CisJCXZ0eS0+b2J1ZiA9IE5VTEw7CisJfQorCisJLyogRnJlZSBjb21tYW5kIGhpc3RvcnkuICovCisJZm9yIChpID0gMDsgaSA8IFZUWV9NQVhISVNUOyBpKyspCisJCWlmICh2dHktPmhpc3RbaV0pCisJCQl0YWxsb2NfZnJlZSh2dHktPmhpc3RbaV0pOworCisJLyogVW5zZXQgdmVjdG9yLiAqLworCXZlY3Rvcl91bnNldCh2dHl2ZWMsIHZ0eS0+ZmQpOworCisJLyogQ2xvc2Ugc29ja2V0LiAqLworCWlmICh2dHktPmZkID4gMCkKKwkJY2xvc2UodnR5LT5mZCk7CisKKwlpZiAodnR5LT5idWYpIHsKKwkJdGFsbG9jX2ZyZWUodnR5LT5idWYpOworCQl2dHktPmJ1ZiA9IE5VTEw7CisJfQorCisJLyogQ2hlY2sgY29uZmlndXJlLiAqLworCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisKKwkvKiBWVFlfQ0xPU0VEIGlzIGhhbmRsZWQgYnkgdGhlIHRlbG5ldF9pbnRlcmZhY2UgKi8KKwl2dHlfZXZlbnQoVlRZX0NMT1NFRCwgdnR5LT5mZCwgdnR5KTsKKworCS8qIE9LIGZyZWUgdnR5LiAqLworCXRhbGxvY19mcmVlKHZ0eSk7Cit9CisKK2ludCB2dHlfc2hlbGwoc3RydWN0IHZ0eSAqdnR5KQoreworCXJldHVybiB2dHktPnR5cGUgPT0gVlRZX1NIRUxMID8gMSA6IDA7Cit9CisKKworLyogVlRZIHN0YW5kYXJkIG91dHB1dCBmdW5jdGlvbi4gKi8KK2ludCB2dHlfb3V0KHN0cnVjdCB2dHkgKnZ0eSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBsZW4gPSAwOworCWludCBzaXplID0gMTAyNDsKKwljaGFyIGJ1ZlsxMDI0XTsKKwljaGFyICpwID0gTlVMTDsKKworCWlmICh2dHlfc2hlbGwodnR5KSkgeworCQl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCQl2cHJpbnRmKGZvcm1hdCwgYXJncyk7CisJCXZhX2VuZChhcmdzKTsKKwl9IGVsc2UgeworCQkvKiBUcnkgdG8gd3JpdGUgdG8gaW5pdGlhbCBidWZmZXIuICAqLworCQl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCQlsZW4gPSB2c25wcmludGYoYnVmLCBzaXplb2YgYnVmLCBmb3JtYXQsIGFyZ3MpOworCQl2YV9lbmQoYXJncyk7CisKKwkJLyogSW5pdGlhbCBidWZmZXIgaXMgbm90IGVub3VnaC4gICovCisJCWlmIChsZW4gPCAwIHx8IGxlbiA+PSBzaXplKSB7CisJCQl3aGlsZSAoMSkgeworCQkJCWlmIChsZW4gPiAtMSkKKwkJCQkJc2l6ZSA9IGxlbiArIDE7CisJCQkJZWxzZQorCQkJCQlzaXplID0gc2l6ZSAqIDI7CisKKwkJCQlwID0gdGFsbG9jX3JlYWxsb2Nfc2l6ZSh2dHksIHAsIHNpemUpOworCQkJCWlmICghcCkKKwkJCQkJcmV0dXJuIC0xOworCisJCQkJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwkJCQlsZW4gPSB2c25wcmludGYocCwgc2l6ZSwgZm9ybWF0LCBhcmdzKTsKKwkJCQl2YV9lbmQoYXJncyk7CisKKwkJCQlpZiAobGVuID4gLTEgJiYgbGVuIDwgc2l6ZSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBXaGVuIGluaXRpYWwgYnVmZmVyIGlzIGVub3VnaCB0byBzdG9yZSBhbGwgb3V0cHV0LiAgKi8KKwkJaWYgKCFwKQorCQkJcCA9IGJ1ZjsKKworCQkvKiBQb2ludGVyIHAgbXVzdCBwb2ludCBvdXQgYnVmZmVyLiAqLworCQlidWZmZXJfcHV0KHZ0eS0+b2J1ZiwgKHVfY2hhciAqKSBwLCBsZW4pOworCisJCS8qIElmIHAgaXMgbm90IGRpZmZlcmVudCB3aXRoIGJ1ZiwgaXQgaXMgYWxsb2NhdGVkIGJ1ZmZlci4gICovCisJCWlmIChwICE9IGJ1ZikKKwkJCXRhbGxvY19mcmVlKHApOworCX0KKworCXZ0eV9ldmVudChWVFlfV1JJVEUsIHZ0eS0+ZmQsIHZ0eSk7CisKKwlyZXR1cm4gbGVuOworfQorCitpbnQgdnR5X291dF9uZXdsaW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwljaGFyICpwID0gdnR5X25ld2xpbmUodnR5KTsKKwlidWZmZXJfcHV0KHZ0eS0+b2J1ZiwgcCwgc3RybGVuKHApKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHZ0eV9jb25maWdfbG9jayhzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKHZ0eV9jb25maWcgPT0gMCkgeworCQl2dHktPmNvbmZpZyA9IDE7CisJCXZ0eV9jb25maWcgPSAxOworCX0KKwlyZXR1cm4gdnR5LT5jb25maWc7Cit9CisKK2ludCB2dHlfY29uZmlnX3VubG9jayhzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKHZ0eV9jb25maWcgPT0gMSAmJiB2dHktPmNvbmZpZyA9PSAxKSB7CisJCXZ0eS0+Y29uZmlnID0gMDsKKwkJdnR5X2NvbmZpZyA9IDA7CisJfQorCXJldHVybiB2dHktPmNvbmZpZzsKK30KKworLyogU2F5IGhlbGxvIHRvIHZ0eSBpbnRlcmZhY2UuICovCit2b2lkIHZ0eV9oZWxsbyhzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKGhvc3QubW90ZGZpbGUpIHsKKwkJRklMRSAqZjsKKwkJY2hhciBidWZbNDA5Nl07CisKKwkJZiA9IGZvcGVuKGhvc3QubW90ZGZpbGUsICJyIik7CisJCWlmIChmKSB7CisJCQl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpIHsKKwkJCQljaGFyICpzOworCQkJCS8qIHdvcmsgYmFja3dhcmRzIHRvIGlnbm9yZSB0cmFpbGxpbmcgaXNzcGFjZSgpICovCisJCQkJZm9yIChzID0gYnVmICsgc3RybGVuKGJ1Zik7CisJCQkJICAgICAocyA+IGJ1ZikgJiYgaXNzcGFjZSgqKHMgLSAxKSk7IHMtLSkgOworCQkJCSpzID0gJ1wwJzsKKwkJCQl2dHlfb3V0KHZ0eSwgIiVzJXMiLCBidWYsIFZUWV9ORVdMSU5FKTsKKwkJCX0KKwkJCWZjbG9zZShmKTsKKwkJfSBlbHNlCisJCQl2dHlfb3V0KHZ0eSwgIk1PVEQgZmlsZSBub3QgZm91bmQlcyIsIFZUWV9ORVdMSU5FKTsKKwl9IGVsc2UgaWYgKGhvc3QubW90ZCkKKwkJdnR5X291dCh2dHksICIlcyIsIGhvc3QubW90ZCk7Cit9CisKKy8qIFB1dCBvdXQgcHJvbXB0IGFuZCB3YWl0IGlucHV0IGZyb20gdXNlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9wcm9tcHQoc3RydWN0IHZ0eSAqdnR5KQoreworCXN0cnVjdCB1dHNuYW1lIG5hbWVzOworCWNvbnN0IGNoYXIgKmhvc3RuYW1lOworCisJaWYgKHZ0eS0+dHlwZSA9PSBWVFlfVEVSTSkgeworCQlob3N0bmFtZSA9IGhvc3QubmFtZTsKKwkJaWYgKCFob3N0bmFtZSkgeworCQkJdW5hbWUoJm5hbWVzKTsKKwkJCWhvc3RuYW1lID0gbmFtZXMubm9kZW5hbWU7CisJCX0KKwkJdnR5X291dCh2dHksIGNtZF9wcm9tcHQodnR5LT5ub2RlKSwgaG9zdG5hbWUpOworCX0KK30KKworLyogQ29tbWFuZCBleGVjdXRpb24gb3ZlciB0aGUgdnR5IGludGVyZmFjZS4gKi8KK3N0YXRpYyBpbnQgdnR5X2NvbW1hbmQoc3RydWN0IHZ0eSAqdnR5LCBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwl2ZWN0b3IgdmxpbmU7CisKKwkvKiBTcGxpdCByZWFkbGluZSBzdHJpbmcgdXAgaW50byB0aGUgdmVjdG9yICovCisJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWMoYnVmKTsKKworCWlmICh2bGluZSA9PSBOVUxMKQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisKKwlyZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kKHZsaW5lLCB2dHksIE5VTEwsIDApOworCWlmIChyZXQgIT0gQ01EX1NVQ0NFU1MpCisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgQ01EX1dBUk5JTkc6CisJCQlpZiAodnR5LT50eXBlID09IFZUWV9GSUxFKQorCQkJCXZ0eV9vdXQodnR5LCAiV2FybmluZy4uLiVzIiwgVlRZX05FV0xJTkUpOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX0VSUl9BTUJJR1VPVVM6CisJCQl2dHlfb3V0KHZ0eSwgIiUlIEFtYmlndW91cyBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX0VSUl9OT19NQVRDSDoKKwkJCXZ0eV9vdXQodnR5LCAiJSUgVW5rbm93biBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX0VSUl9JTkNPTVBMRVRFOgorCQkJdnR5X291dCh2dHksICIlJSBDb21tYW5kIGluY29tcGxldGUuJXMiLCBWVFlfTkVXTElORSk7CisJCQlicmVhazsKKwkJfQorCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciB0ZWxuZXRfYmFja3dhcmRfY2hhciA9IDB4MDg7CitzdGF0aWMgY29uc3QgY2hhciB0ZWxuZXRfc3BhY2VfY2hhciA9ICcgJzsKKworLyogQmFzaWMgZnVuY3Rpb24gdG8gd3JpdGUgYnVmZmVyIHRvIHZ0eS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV93cml0ZShzdHJ1Y3QgdnR5ICp2dHksIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcykKK3sKKwlpZiAoKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUpIHx8ICh2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkpCisJCXJldHVybjsKKworCS8qIFNob3VsZCB3ZSBkbyBidWZmZXJpbmcgaGVyZSA/ICBBbmQgbWFrZSB2dHlfZmx1c2ggKHZ0eSkgPyAqLworCWJ1ZmZlcl9wdXQodnR5LT5vYnVmLCBidWYsIG5ieXRlcyk7Cit9CisKKy8qIEVuc3VyZSBsZW5ndGggb2YgaW5wdXQgYnVmZmVyLiAgSXMgYnVmZmVyIGlzIHNob3J0LCBkb3VibGUgaXQuICovCitzdGF0aWMgdm9pZCB2dHlfZW5zdXJlKHN0cnVjdCB2dHkgKnZ0eSwgaW50IGxlbmd0aCkKK3sKKwlpZiAodnR5LT5tYXggPD0gbGVuZ3RoKSB7CisJCXZ0eS0+bWF4ICo9IDI7CisJCXZ0eS0+YnVmID0gdGFsbG9jX3JlYWxsb2Nfc2l6ZSh2dHksIHZ0eS0+YnVmLCB2dHktPm1heCk7CisJCS8vIEZJWE1FOiBjaGVjayByZXR1cm4KKwl9Cit9CisKKy8qIEJhc2ljIGZ1bmN0aW9uIHRvIGluc2VydCBjaGFyYWN0ZXIgaW50byB2dHkuICovCitzdGF0aWMgdm9pZCB2dHlfc2VsZl9pbnNlcnQoc3RydWN0IHZ0eSAqdnR5LCBjaGFyIGMpCit7CisJaW50IGk7CisJaW50IGxlbmd0aDsKKworCXZ0eV9lbnN1cmUodnR5LCB2dHktPmxlbmd0aCArIDEpOworCWxlbmd0aCA9IHZ0eS0+bGVuZ3RoIC0gdnR5LT5jcDsKKwltZW1tb3ZlKCZ2dHktPmJ1Zlt2dHktPmNwICsgMV0sICZ2dHktPmJ1Zlt2dHktPmNwXSwgbGVuZ3RoKTsKKwl2dHktPmJ1Zlt2dHktPmNwXSA9IGM7CisKKwl2dHlfd3JpdGUodnR5LCAmdnR5LT5idWZbdnR5LT5jcF0sIGxlbmd0aCArIDEpOworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9iYWNrd2FyZF9jaGFyLCAxKTsKKworCXZ0eS0+Y3ArKzsKKwl2dHktPmxlbmd0aCsrOworfQorCisvKiBTZWxmIGluc2VydCBjaGFyYWN0ZXIgJ2MnIGluIG92ZXJ3cml0ZSBtb2RlLiAqLworc3RhdGljIHZvaWQgdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZShzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgYykKK3sKKwl2dHlfZW5zdXJlKHZ0eSwgdnR5LT5sZW5ndGggKyAxKTsKKwl2dHktPmJ1Zlt2dHktPmNwKytdID0gYzsKKworCWlmICh2dHktPmNwID4gdnR5LT5sZW5ndGgpCisJCXZ0eS0+bGVuZ3RoKys7CisKKwlpZiAoKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUpIHx8ICh2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkpCisJCXJldHVybjsKKworCXZ0eV93cml0ZSh2dHksICZjLCAxKTsKK30KKworLyogSW5zZXJ0IGEgd29yZCBpbnRvIHZ0eSBpbnRlcmZhY2Ugd2l0aCBvdmVyd3JpdGUgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9pbnNlcnRfd29yZF9vdmVyd3JpdGUoc3RydWN0IHZ0eSAqdnR5LCBjaGFyICpzdHIpCit7CisJaW50IGxlbiA9IHN0cmxlbihzdHIpOworCXZ0eV93cml0ZSh2dHksIHN0ciwgbGVuKTsKKwlzdHJjcHkoJnZ0eS0+YnVmW3Z0eS0+Y3BdLCBzdHIpOworCXZ0eS0+Y3AgKz0gbGVuOworCXZ0eS0+bGVuZ3RoID0gdnR5LT5jcDsKK30KKworLyogRm9yd2FyZCBjaGFyYWN0ZXIuICovCitzdGF0aWMgdm9pZCB2dHlfZm9yd2FyZF9jaGFyKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAodnR5LT5jcCA8IHZ0eS0+bGVuZ3RoKSB7CisJCXZ0eV93cml0ZSh2dHksICZ2dHktPmJ1Zlt2dHktPmNwXSwgMSk7CisJCXZ0eS0+Y3ArKzsKKwl9Cit9CisKKy8qIEJhY2t3YXJkIGNoYXJhY3Rlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9iYWNrd2FyZF9jaGFyKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAodnR5LT5jcCA+IDApIHsKKwkJdnR5LT5jcC0tOworCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X2JhY2t3YXJkX2NoYXIsIDEpOworCX0KK30KKworLyogTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLiAqLworc3RhdGljIHZvaWQgdnR5X2JlZ2lubmluZ19vZl9saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl3aGlsZSAodnR5LT5jcCkKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKK30KKworLyogTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLiAqLworc3RhdGljIHZvaWQgdnR5X2VuZF9vZl9saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl3aGlsZSAodnR5LT5jcCA8IHZ0eS0+bGVuZ3RoKQorCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIEFkZCBjdXJyZW50IGNvbW1hbmQgbGluZSB0byB0aGUgaGlzdG9yeSBidWZmZXIuICovCitzdGF0aWMgdm9pZCB2dHlfaGlzdF9hZGQoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCBpbmRleDsKKworCWlmICh2dHktPmxlbmd0aCA9PSAwKQorCQlyZXR1cm47CisKKwlpbmRleCA9IHZ0eS0+aGluZGV4ID8gdnR5LT5oaW5kZXggLSAxIDogVlRZX01BWEhJU1QgLSAxOworCisJLyogSWdub3JlIHRoZSBzYW1lIHN0cmluZyBhcyBwcmV2aW91cyBvbmUuICovCisJaWYgKHZ0eS0+aGlzdFtpbmRleF0pCisJCWlmIChzdHJjbXAodnR5LT5idWYsIHZ0eS0+aGlzdFtpbmRleF0pID09IDApIHsKKwkJCXZ0eS0+aHAgPSB2dHktPmhpbmRleDsKKwkJCXJldHVybjsKKwkJfQorCisJLyogSW5zZXJ0IGhpc3RvcnkgZW50cnkuICovCisJaWYgKHZ0eS0+aGlzdFt2dHktPmhpbmRleF0pCisJCXRhbGxvY19mcmVlKHZ0eS0+aGlzdFt2dHktPmhpbmRleF0pOworCXZ0eS0+aGlzdFt2dHktPmhpbmRleF0gPSB0YWxsb2Nfc3RyZHVwKHZ0eSwgdnR5LT5idWYpOworCisJLyogSGlzdG9yeSBpbmRleCByb3RhdGlvbi4gKi8KKwl2dHktPmhpbmRleCsrOworCWlmICh2dHktPmhpbmRleCA9PSBWVFlfTUFYSElTVCkKKwkJdnR5LT5oaW5kZXggPSAwOworCisJdnR5LT5ocCA9IHZ0eS0+aGluZGV4OworfQorCisvKiBHZXQgdGVsbmV0IHdpbmRvdyBzaXplLiAqLworc3RhdGljIGludAordnR5X3RlbG5ldF9vcHRpb24gKHN0cnVjdCB2dHkgKnZ0eSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQoreworI2lmZGVmIFRFTE5FVF9PUFRJT05fREVCVUcKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5ieXRlczsgaSsrKQorICAgIHsKKyAgICAgIHN3aXRjaCAoYnVmW2ldKQorCXsKKwljYXNlIElBQzoKKwkgIHZ0eV9vdXQgKHZ0eSwgIklBQyAiKTsKKwkgIGJyZWFrOworCWNhc2UgV0lMTDoKKwkgIHZ0eV9vdXQgKHZ0eSwgIldJTEwgIik7CisJICBicmVhazsKKwljYXNlIFdPTlQ6CisJICB2dHlfb3V0ICh2dHksICJXT05UICIpOworCSAgYnJlYWs7CisJY2FzZSBETzoKKwkgIHZ0eV9vdXQgKHZ0eSwgIkRPICIpOworCSAgYnJlYWs7CisJY2FzZSBET05UOgorCSAgdnR5X291dCAodnR5LCAiRE9OVCAiKTsKKwkgIGJyZWFrOworCWNhc2UgU0I6CisJICB2dHlfb3V0ICh2dHksICJTQiAiKTsKKwkgIGJyZWFrOworCWNhc2UgU0U6CisJICB2dHlfb3V0ICh2dHksICJTRSAiKTsKKwkgIGJyZWFrOworCWNhc2UgVEVMT1BUX0VDSE86CisJICB2dHlfb3V0ICh2dHksICJURUxPUFRfRUNITyAlcyIsIFZUWV9ORVdMSU5FKTsKKwkgIGJyZWFrOworCWNhc2UgVEVMT1BUX1NHQToKKwkgIHZ0eV9vdXQgKHZ0eSwgIlRFTE9QVF9TR0EgJXMiLCBWVFlfTkVXTElORSk7CisJICBicmVhazsKKwljYXNlIFRFTE9QVF9OQVdTOgorCSAgdnR5X291dCAodnR5LCAiVEVMT1BUX05BV1MgJXMiLCBWVFlfTkVXTElORSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgdnR5X291dCAodnR5LCAiJXggIiwgYnVmW2ldKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIHZ0eV9vdXQgKHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisjZW5kaWYgLyogVEVMTkVUX09QVElPTl9ERUJVRyAqLworCisgIHN3aXRjaCAoYnVmWzBdKQorICAgIHsKKyAgICBjYXNlIFNCOgorICAgICAgdnR5LT5zYl9sZW4gPSAwOworICAgICAgdnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MgPSAxOworICAgICAgcmV0dXJuIDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNFOgorICAgICAgeworCWlmICghdnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MpCisJICByZXR1cm4gMDsKKworCWlmICgodnR5LT5zYl9sZW4gPT0gMCkgfHwgKHZ0eS0+c2JfYnVmWzBdID09ICdcMCcpKQorCSAgeworCSAgICB2dHktPmlhY19zYl9pbl9wcm9ncmVzcyA9IDA7CisJICAgIHJldHVybiAwOworCSAgfQorCXN3aXRjaCAodnR5LT5zYl9idWZbMF0pCisJICB7CisJICBjYXNlIFRFTE9QVF9OQVdTOgorCSAgICBpZiAodnR5LT5zYl9sZW4gIT0gVEVMTkVUX05BV1NfU0JfTEVOKQorCSAgICAgIHZ0eV9vdXQodnR5LCJSRkMgMTA3MyB2aW9sYXRpb24gZGV0ZWN0ZWQ6IHRlbG5ldCBOQVdTIG9wdGlvbiAiCisJCQkic2hvdWxkIHNlbmQgJWQgY2hhcmFjdGVycywgYnV0IHdlIHJlY2VpdmVkICVsdSIsCisJCQlURUxORVRfTkFXU19TQl9MRU4sICh1X2xvbmcpdnR5LT5zYl9sZW4pOworCSAgICBlbHNlIGlmIChzaXplb2YodnR5LT5zYl9idWYpIDwgVEVMTkVUX05BV1NfU0JfTEVOKQorCSAgICAgIHZ0eV9vdXQodnR5LCAiQnVnIGRldGVjdGVkOiBzaXplb2YodnR5LT5zYl9idWYpICVsdSA8ICVkLCAiCisJCSAgICAgICAidG9vIHNtYWxsIHRvIGhhbmRsZSB0aGUgdGVsbmV0IE5BV1Mgb3B0aW9uIiwKKwkJICAgICAgICh1X2xvbmcpc2l6ZW9mKHZ0eS0+c2JfYnVmKSwgVEVMTkVUX05BV1NfU0JfTEVOKTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJdnR5LT53aWR0aCA9ICgodnR5LT5zYl9idWZbMV0gPDwgOCl8dnR5LT5zYl9idWZbMl0pOworCQl2dHktPmhlaWdodCA9ICgodnR5LT5zYl9idWZbM10gPDwgOCl8dnR5LT5zYl9idWZbNF0pOworI2lmZGVmIFRFTE5FVF9PUFRJT05fREVCVUcKKwkJdnR5X291dCh2dHksICJURUxORVQgTkFXUyB3aW5kb3cgc2l6ZSBuZWdvdGlhdGlvbiBjb21wbGV0ZWQ6ICIKKwkJCSAgICAgICJ3aWR0aCAlZCwgaGVpZ2h0ICVkJXMiLAorCQkJdnR5LT53aWR0aCwgdnR5LT5oZWlnaHQsIFZUWV9ORVdMSU5FKTsKKyNlbmRpZgorCSAgICAgIH0KKwkgICAgYnJlYWs7CisJICB9CisJdnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MgPSAwOworCXJldHVybiAwOworCWJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAxOworfQorCisvKiBFeGVjdXRlIGN1cnJlbnQgY29tbWFuZCBsaW5lLiAqLworc3RhdGljIGludCB2dHlfZXhlY3V0ZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IHJldDsKKworCXJldCA9IENNRF9TVUNDRVNTOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIEFVVEhfTk9ERToKKwljYXNlIEFVVEhfRU5BQkxFX05PREU6CisJCXZ0eV9hdXRoKHZ0eSwgdnR5LT5idWYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSB2dHlfY29tbWFuZCh2dHksIHZ0eS0+YnVmKTsKKwkJaWYgKHZ0eS0+dHlwZSA9PSBWVFlfVEVSTSkKKwkJCXZ0eV9oaXN0X2FkZCh2dHkpOworCQlicmVhazsKKwl9CisKKwkvKiBDbGVhciBjb21tYW5kIGxpbmUgYnVmZmVyLiAqLworCXZ0eS0+Y3AgPSB2dHktPmxlbmd0aCA9IDA7CisJdnR5X2NsZWFyX2J1Zih2dHkpOworCisJaWYgKHZ0eS0+c3RhdHVzICE9IFZUWV9DTE9TRSkKKwkJdnR5X3Byb21wdCh2dHkpOworCisJcmV0dXJuIHJldDsKK30KKworLyogU2VuZCBXSUxMIFRFTE9QVF9FQ0hPIHRvIHJlbW90ZSBzZXJ2ZXIuICovCitzdGF0aWMgdm9pZAordnR5X3dpbGxfZWNobyAoc3RydWN0IHZ0eSAqdnR5KQoreworCXVuc2lnbmVkIGNoYXIgY21kW10gPSB7IElBQywgV0lMTCwgVEVMT1BUX0VDSE8sICdcMCcgfTsKKwl2dHlfb3V0ICh2dHksICIlcyIsIGNtZCk7Cit9CisKKy8qIE1ha2Ugc3VwcHJlc3MgR28tQWhlYWQgdGVsbmV0IG9wdGlvbi4gKi8KK3N0YXRpYyB2b2lkCit2dHlfd2lsbF9zdXBwcmVzc19nb19haGVhZCAoc3RydWN0IHZ0eSAqdnR5KQoreworCXVuc2lnbmVkIGNoYXIgY21kW10gPSB7IElBQywgV0lMTCwgVEVMT1BUX1NHQSwgJ1wwJyB9OworCXZ0eV9vdXQgKHZ0eSwgIiVzIiwgY21kKTsKK30KKworLyogTWFrZSBkb24ndCB1c2UgbGluZW1vZGUgb3ZlciB0ZWxuZXQuICovCitzdGF0aWMgdm9pZAordnR5X2RvbnRfbGluZW1vZGUgKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNtZFtdID0geyBJQUMsIERPTlQsIFRFTE9QVF9MSU5FTU9ERSwgJ1wwJyB9OworCXZ0eV9vdXQgKHZ0eSwgIiVzIiwgY21kKTsKK30KKworLyogVXNlIHdpbmRvdyBzaXplLiAqLworc3RhdGljIHZvaWQKK3Z0eV9kb193aW5kb3dfc2l6ZSAoc3RydWN0IHZ0eSAqdnR5KQoreworCXVuc2lnbmVkIGNoYXIgY21kW10gPSB7IElBQywgRE8sIFRFTE9QVF9OQVdTLCAnXDAnIH07CisJdnR5X291dCAodnR5LCAiJXMiLCBjbWQpOworfQorCitzdGF0aWMgdm9pZCB2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHN0cnVjdCB2dHkgKik7CitzdGF0aWMgdm9pZCB2dHlfcmVkcmF3X2xpbmUoc3RydWN0IHZ0eSAqKTsKKworLyogUHJpbnQgY29tbWFuZCBsaW5lIGhpc3RvcnkuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tCisgICB2dHlfbmV4dF9saW5lIGFuZCB2dHlfcHJldmlvdXNfbGluZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9oaXN0b3J5X3ByaW50KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgbGVuZ3RoOworCisJdnR5X2tpbGxfbGluZV9mcm9tX2JlZ2lubmluZyh2dHkpOworCisJLyogR2V0IHByZXZpb3VzIGxpbmUgZnJvbSBoaXN0b3J5IGJ1ZmZlciAqLworCWxlbmd0aCA9IHN0cmxlbih2dHktPmhpc3RbdnR5LT5ocF0pOworCW1lbWNweSh2dHktPmJ1ZiwgdnR5LT5oaXN0W3Z0eS0+aHBdLCBsZW5ndGgpOworCXZ0eS0+Y3AgPSB2dHktPmxlbmd0aCA9IGxlbmd0aDsKKworCS8qIFJlZHJhdyBjdXJyZW50IGxpbmUgKi8KKwl2dHlfcmVkcmF3X2xpbmUodnR5KTsKK30KKworLyogU2hvdyBuZXh0IGNvbW1hbmQgbGluZSBoaXN0b3J5LiAqLworc3RhdGljIHZvaWQgdnR5X25leHRfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IHRyeV9pbmRleDsKKworCWlmICh2dHktPmhwID09IHZ0eS0+aGluZGV4KQorCQlyZXR1cm47CisKKwkvKiBUcnkgaXMgdGhlcmUgaGlzdG9yeSBleGlzdCBvciBub3QuICovCisJdHJ5X2luZGV4ID0gdnR5LT5ocDsKKwlpZiAodHJ5X2luZGV4ID09IChWVFlfTUFYSElTVCAtIDEpKQorCQl0cnlfaW5kZXggPSAwOworCWVsc2UKKwkJdHJ5X2luZGV4Kys7CisKKwkvKiBJZiB0aGVyZSBpcyBub3QgaGlzdG9yeSByZXR1cm4uICovCisJaWYgKHZ0eS0+aGlzdFt0cnlfaW5kZXhdID09IE5VTEwpCisJCXJldHVybjsKKwllbHNlCisJCXZ0eS0+aHAgPSB0cnlfaW5kZXg7CisKKwl2dHlfaGlzdG9yeV9wcmludCh2dHkpOworfQorCisvKiBTaG93IHByZXZpb3VzIGNvbW1hbmQgbGluZSBoaXN0b3J5LiAqLworc3RhdGljIHZvaWQgdnR5X3ByZXZpb3VzX2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCB0cnlfaW5kZXg7CisKKwl0cnlfaW5kZXggPSB2dHktPmhwOworCWlmICh0cnlfaW5kZXggPT0gMCkKKwkJdHJ5X2luZGV4ID0gVlRZX01BWEhJU1QgLSAxOworCWVsc2UKKwkJdHJ5X2luZGV4LS07CisKKwlpZiAodnR5LT5oaXN0W3RyeV9pbmRleF0gPT0gTlVMTCkKKwkJcmV0dXJuOworCWVsc2UKKwkJdnR5LT5ocCA9IHRyeV9pbmRleDsKKworCXZ0eV9oaXN0b3J5X3ByaW50KHZ0eSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmVkcmF3IGFsbCBvZiB0aGUgY29tbWFuZCBsaW5lIGNoYXJhY3Rlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9yZWRyYXdfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X3dyaXRlKHZ0eSwgdnR5LT5idWYsIHZ0eS0+bGVuZ3RoKTsKKwl2dHktPmNwID0gdnR5LT5sZW5ndGg7Cit9CisKKy8qIEZvcndhcmQgd29yZC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9mb3J3YXJkX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwICE9IHZ0eS0+bGVuZ3RoICYmIHZ0eS0+YnVmW3Z0eS0+Y3BdICE9ICcgJykKKwkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOworCisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gPT0gJyAnKQorCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIEJhY2t3YXJkIHdvcmQgd2l0aG91dCBza2lwcGluZyB0cmFpbmluZyBzcGFjZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9iYWNrd2FyZF9wdXJlX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gIT0gJyAnKQorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworfQorCisvKiBCYWNrd2FyZCB3b3JkLiAqLworc3RhdGljIHZvaWQgdnR5X2JhY2t3YXJkX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gPT0gJyAnKQorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSAhPSAnICcpCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIFdoZW4gJ15EJyBpcyB0eXBlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIHdlIG1vdmUgdG8gdGhlIGRvd24KKyAgIGxldmVsLiAqLworc3RhdGljIHZvaWQgdnR5X2Rvd25fbGV2ZWwoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJKCpjb25maWdfZXhpdF9jbWQuZnVuYykgKE5VTEwsIHZ0eSwgMCwgTlVMTCk7CisJdnR5X3Byb21wdCh2dHkpOworCXZ0eS0+Y3AgPSAwOworfQorCisvKiBXaGVuICdeWicgaXMgcmVjZWl2ZWQgZnJvbSB2dHksIG1vdmUgZG93biB0byB0aGUgZW5hYmxlIG1vZGUuICovCitzdGF0aWMgdm9pZCB2dHlfZW5kX2NvbmZpZyhzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBWSUVXX05PREU6CisJY2FzZSBFTkFCTEVfTk9ERToKKwkJLyogTm90aGluZyB0byBkby4gKi8KKwkJYnJlYWs7CisJY2FzZSBDT05GSUdfTk9ERToKKwljYXNlIFZUWV9OT0RFOgorCQl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93biBub2RlLCB3ZSBoYXZlIHRvIGlnbm9yZSBpdC4gKi8KKwkJYnJlYWs7CisJfQorCisJdnR5X3Byb21wdCh2dHkpOworCXZ0eS0+Y3AgPSAwOworfQorCisvKiBEZWxldGUgYSBjaGFyY3RlciBhdCB0aGUgY3VycmVudCBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9kZWxldGVfY2hhcihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisJaW50IHNpemU7CisKKwlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERSB8fCB2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkKKwkJcmV0dXJuOworCisJaWYgKHZ0eS0+bGVuZ3RoID09IDApIHsKKwkJdnR5X2Rvd25fbGV2ZWwodnR5KTsKKwkJcmV0dXJuOworCX0KKworCWlmICh2dHktPmNwID09IHZ0eS0+bGVuZ3RoKQorCQlyZXR1cm47CQkvKiBjb21wbGV0aW9uIG5lZWQgaGVyZT8gKi8KKworCXNpemUgPSB2dHktPmxlbmd0aCAtIHZ0eS0+Y3A7CisKKwl2dHktPmxlbmd0aC0tOworCW1lbW1vdmUoJnZ0eS0+YnVmW3Z0eS0+Y3BdLCAmdnR5LT5idWZbdnR5LT5jcCArIDFdLCBzaXplIC0gMSk7CisJdnR5LT5idWZbdnR5LT5sZW5ndGhdID0gJ1wwJzsKKworCXZ0eV93cml0ZSh2dHksICZ2dHktPmJ1Zlt2dHktPmNwXSwgc2l6ZSAtIDEpOworCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfc3BhY2VfY2hhciwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X2JhY2t3YXJkX2NoYXIsIDEpOworfQorCisvKiBEZWxldGUgYSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKHZ0eS0+Y3AgPT0gMCkKKwkJcmV0dXJuOworCisJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwl2dHlfZGVsZXRlX2NoYXIodnR5KTsKK30KKworLyogS2lsbCByZXN0IG9mIGxpbmUgZnJvbSBjdXJyZW50IHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2tpbGxfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisJaW50IHNpemU7CisKKwlzaXplID0gdnR5LT5sZW5ndGggLSB2dHktPmNwOworCisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9zcGFjZV9jaGFyLCAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X2JhY2t3YXJkX2NoYXIsIDEpOworCisJbWVtc2V0KCZ2dHktPmJ1Zlt2dHktPmNwXSwgMCwgc2l6ZSk7CisJdnR5LT5sZW5ndGggPSB2dHktPmNwOworfQorCisvKiBLaWxsIGxpbmUgZnJvbSB0aGUgYmVnaW5uaW5nLiAqLworc3RhdGljIHZvaWQgdnR5X2tpbGxfbGluZV9mcm9tX2JlZ2lubmluZyhzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X2JlZ2lubmluZ19vZl9saW5lKHZ0eSk7CisJdnR5X2tpbGxfbGluZSh2dHkpOworfQorCisvKiBEZWxldGUgYSB3b3JkIGJlZm9yZSB0aGUgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfZm9yd2FyZF9raWxsX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwICE9IHZ0eS0+bGVuZ3RoICYmIHZ0eS0+YnVmW3Z0eS0+Y3BdID09ICcgJykKKwkJdnR5X2RlbGV0ZV9jaGFyKHZ0eSk7CisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gIT0gJyAnKQorCQl2dHlfZGVsZXRlX2NoYXIodnR5KTsKK30KKworLyogRGVsZXRlIGEgd29yZCBiZWZvcmUgdGhlIHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2JhY2t3YXJkX2tpbGxfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSA9PSAnICcpCisJCXZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcih2dHkpOworCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gIT0gJyAnKQorCQl2dHlfZGVsZXRlX2JhY2t3YXJkX2NoYXIodnR5KTsKK30KKworLyogVHJhbnNwb3NlIGNoYXJzIGJlZm9yZSBvciBhdCB0aGUgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfdHJhbnNwb3NlX2NoYXJzKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwljaGFyIGMxLCBjMjsKKworCS8qIElmIGxlbmd0aCBpcyBzaG9ydCBvciBwb2ludCBpcyBuZWFyIGJ5IHRoZSBiZWdpbm5pbmcgb2YgbGluZSB0aGVuCisJICAgcmV0dXJuLiAqLworCWlmICh2dHktPmxlbmd0aCA8IDIgfHwgdnR5LT5jcCA8IDEpCisJCXJldHVybjsKKworCS8qIEluIGNhc2Ugb2YgcG9pbnQgaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiAqLworCWlmICh2dHktPmNwID09IHZ0eS0+bGVuZ3RoKSB7CisJCWMxID0gdnR5LT5idWZbdnR5LT5jcCAtIDFdOworCQljMiA9IHZ0eS0+YnVmW3Z0eS0+Y3AgLSAyXTsKKworCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQl2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHZ0eSwgYzEpOworCQl2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHZ0eSwgYzIpOworCX0gZWxzZSB7CisJCWMxID0gdnR5LT5idWZbdnR5LT5jcF07CisJCWMyID0gdnR5LT5idWZbdnR5LT5jcCAtIDFdOworCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMik7CisJfQorfQorCisvKiBEbyBjb21wbGV0aW9uIGF0IHZ0eSBpbnRlcmZhY2UuICovCitzdGF0aWMgdm9pZCB2dHlfY29tcGxldGVfY29tbWFuZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisJaW50IHJldDsKKwljaGFyICoqbWF0Y2hlZCA9IE5VTEw7CisJdmVjdG9yIHZsaW5lOworCisJaWYgKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUgfHwgdnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpCisJCXJldHVybjsKKworCXZsaW5lID0gY21kX21ha2Vfc3RydmVjKHZ0eS0+YnVmKTsKKwlpZiAodmxpbmUgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogSW4gY2FzZSBvZiAnaGVscCBcdCcuICovCisJaWYgKGlzc3BhY2UoKGludCl2dHktPmJ1Zlt2dHktPmxlbmd0aCAtIDFdKSkKKwkJdmVjdG9yX3NldCh2bGluZSwgJ1wwJyk7CisKKwltYXRjaGVkID0gY21kX2NvbXBsZXRlX2NvbW1hbmQodmxpbmUsIHZ0eSwgJnJldCk7CisKKwljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgQ01EX0VSUl9BTUJJR1VPVVM6CisJCXZ0eV9vdXQodnR5LCAiJSUgQW1iaWd1b3VzIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0VSUl9OT19NQVRDSDoKKwkJLyogdnR5X291dCAodnR5LCAiJSUgVGhlcmUgaXMgbm8gbWF0Y2hlZCBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOyAqLworCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlicmVhazsKKwljYXNlIENNRF9DT01QTEVURV9GVUxMX01BVENIOgorCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQl2dHlfYmFja3dhcmRfcHVyZV93b3JkKHZ0eSk7CisJCXZ0eV9pbnNlcnRfd29yZF9vdmVyd3JpdGUodnR5LCBtYXRjaGVkWzBdKTsKKwkJdnR5X3NlbGZfaW5zZXJ0KHZ0eSwgJyAnKTsKKwkJdGFsbG9jX2ZyZWUobWF0Y2hlZFswXSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0NPTVBMRVRFX01BVENIOgorCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQl2dHlfYmFja3dhcmRfcHVyZV93b3JkKHZ0eSk7CisJCXZ0eV9pbnNlcnRfd29yZF9vdmVyd3JpdGUodnR5LCBtYXRjaGVkWzBdKTsKKwkJdGFsbG9jX2ZyZWUobWF0Y2hlZFswXSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0NPTVBMRVRFX0xJU1RfTUFUQ0g6CisJCWZvciAoaSA9IDA7IG1hdGNoZWRbaV0gIT0gTlVMTDsgaSsrKSB7CisJCQlpZiAoaSAhPSAwICYmICgoaSAlIDYpID09IDApKQorCQkJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJCQl2dHlfb3V0KHZ0eSwgIiUtMTBzICIsIG1hdGNoZWRbaV0pOworCQkJdGFsbG9jX2ZyZWUobWF0Y2hlZFtpXSk7CisJCX0KKwkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlicmVhazsKKwljYXNlIENNRF9FUlJfTk9USElOR19UT0RPOgorCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJaWYgKG1hdGNoZWQpCisJCXZlY3Rvcl9vbmx5X2luZGV4X2ZyZWUobWF0Y2hlZCk7Cit9CisKK3N0YXRpYyB2b2lkCit2dHlfZGVzY3JpYmVfZm9sZChzdHJ1Y3QgdnR5ICp2dHksIGludCBjbWRfd2lkdGgsCisJCSAgdW5zaWduZWQgaW50IGRlc2Nfd2lkdGgsIHN0cnVjdCBkZXNjICpkZXNjKQoreworCWNoYXIgKmJ1ZjsKKwljb25zdCBjaGFyICpjbWQsICpwOworCWludCBwb3M7CisKKwljbWQgPSBkZXNjLT5jbWRbMF0gPT0gJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZDsKKworCWlmIChkZXNjX3dpZHRoIDw9IDApIHsKKwkJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCBjbWRfd2lkdGgsIGNtZCwgZGVzYy0+c3RyLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm47CisJfQorCisJYnVmID0gX3RhbGxvY196ZXJvKHZ0eSwgc3RybGVuKGRlc2MtPnN0cikgKyAxLCAiZGVzY3JpYmVfZm9sZCIpOworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwlmb3IgKHAgPSBkZXNjLT5zdHI7IHN0cmxlbihwKSA+IGRlc2Nfd2lkdGg7IHAgKz0gcG9zICsgMSkgeworCQlmb3IgKHBvcyA9IGRlc2Nfd2lkdGg7IHBvcyA+IDA7IHBvcy0tKQorCQkJaWYgKCoocCArIHBvcykgPT0gJyAnKQorCQkJCWJyZWFrOworCisJCWlmIChwb3MgPT0gMCkKKwkJCWJyZWFrOworCisJCXN0cm5jcHkoYnVmLCBwLCBwb3MpOworCQlidWZbcG9zXSA9ICdcMCc7CisJCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgY21kX3dpZHRoLCBjbWQsIGJ1ZiwgVlRZX05FV0xJTkUpOworCisJCWNtZCA9ICIiOworCX0KKworCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgY21kX3dpZHRoLCBjbWQsIHAsIFZUWV9ORVdMSU5FKTsKKworCXRhbGxvY19mcmVlKGJ1Zik7Cit9CisKKy8qIERlc2NyaWJlIG1hdGNoZWQgY29tbWFuZCBmdW5jdGlvbi4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9kZXNjcmliZV9jb21tYW5kKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgcmV0OworCXZlY3RvciB2bGluZTsKKwl2ZWN0b3IgZGVzY3JpYmU7CisJdW5zaWduZWQgaW50IGksIHdpZHRoLCBkZXNjX3dpZHRoOworCXN0cnVjdCBkZXNjICpkZXNjLCAqZGVzY19jciA9IE5VTEw7CisKKwl2bGluZSA9IGNtZF9tYWtlX3N0cnZlYyh2dHktPmJ1Zik7CisKKwkvKiBJbiBjYXNlIG9mICc+ID8nLiAqLworCWlmICh2bGluZSA9PSBOVUxMKSB7CisJCXZsaW5lID0gdmVjdG9yX2luaXQoMSk7CisJCXZlY3Rvcl9zZXQodmxpbmUsICdcMCcpOworCX0gZWxzZSBpZiAoaXNzcGFjZSgoaW50KXZ0eS0+YnVmW3Z0eS0+bGVuZ3RoIC0gMV0pKQorCQl2ZWN0b3Jfc2V0KHZsaW5lLCAnXDAnKTsKKworCWRlc2NyaWJlID0gY21kX2Rlc2NyaWJlX2NvbW1hbmQodmxpbmUsIHZ0eSwgJnJldCk7CisKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJLyogQW1iaWd1b3VzIGVycm9yLiAqLworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBDTURfRVJSX0FNQklHVU9VUzoKKwkJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKwkJdnR5X291dCh2dHksICIlJSBBbWJpZ3VvdXMgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJcmV0dXJuOworCQlicmVhazsKKwljYXNlIENNRF9FUlJfTk9fTUFUQ0g6CisJCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisJCXZ0eV9vdXQodnR5LCAiJSUgVGhlcmUgaXMgbm8gbWF0Y2hlZCBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOworCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlyZXR1cm47CisJCWJyZWFrOworCX0KKworCS8qIEdldCB3aWR0aCBvZiBjb21tYW5kIHN0cmluZy4gKi8KKwl3aWR0aCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoZGVzY3JpYmUpOyBpKyspCisJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2NyaWJlLCBpKSkgIT0gTlVMTCkgeworCQkJdW5zaWduZWQgaW50IGxlbjsKKworCQkJaWYgKGRlc2MtPmNtZFswXSA9PSAnXDAnKQorCQkJCWNvbnRpbnVlOworCisJCQlsZW4gPSBzdHJsZW4oZGVzYy0+Y21kKTsKKwkJCWlmIChkZXNjLT5jbWRbMF0gPT0gJy4nKQorCQkJCWxlbi0tOworCisJCQlpZiAod2lkdGggPCBsZW4pCisJCQkJd2lkdGggPSBsZW47CisJCX0KKworCS8qIEdldCB3aWR0aCBvZiBkZXNjcmlwdGlvbiBzdHJpbmcuICovCisJZGVzY193aWR0aCA9IHZ0eS0+d2lkdGggLSAod2lkdGggKyA2KTsKKworCS8qIFByaW50IG91dCBkZXNjcmlwdGlvbi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShkZXNjcmliZSk7IGkrKykKKwkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3JpYmUsIGkpKSAhPSBOVUxMKSB7CisJCQlpZiAoZGVzYy0+Y21kWzBdID09ICdcMCcpCisJCQkJY29udGludWU7CisKKwkJCWlmIChzdHJjbXAoZGVzYy0+Y21kLCAiPGNyPiIpID09IDApIHsKKwkJCQlkZXNjX2NyID0gZGVzYzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFkZXNjLT5zdHIpCisJCQkJdnR5X291dCh2dHksICIgICUtcyVzIiwKKwkJCQkJZGVzYy0+Y21kWzBdID09CisJCQkJCScuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJCVZUWV9ORVdMSU5FKTsKKwkJCWVsc2UgaWYgKGRlc2Nfd2lkdGggPj0gc3RybGVuKGRlc2MtPnN0cikpCisJCQkJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCB3aWR0aCwKKwkJCQkJZGVzYy0+Y21kWzBdID09CisJCQkJCScuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJCWRlc2MtPnN0ciwgVlRZX05FV0xJTkUpOworCQkJZWxzZQorCQkJCXZ0eV9kZXNjcmliZV9mb2xkKHZ0eSwgd2lkdGgsIGRlc2Nfd2lkdGgsIGRlc2MpOworCisjaWYgMAorCQkJdnR5X291dCh2dHksICIgICUtKnMgJXMlcyIsIHdpZHRoCisJCQkJZGVzYy0+Y21kWzBdID09ICcuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJZGVzYy0+c3RyID8gZGVzYy0+c3RyIDogIiIsIFZUWV9ORVdMSU5FKTsKKyNlbmRpZgkJCQkvKiAwICovCisJCX0KKworCWlmICgoZGVzYyA9IGRlc2NfY3IpKSB7CisJCWlmICghZGVzYy0+c3RyKQorCQkJdnR5X291dCh2dHksICIgICUtcyVzIiwKKwkJCQlkZXNjLT5jbWRbMF0gPT0gJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKKwkJCQlWVFlfTkVXTElORSk7CisJCWVsc2UgaWYgKGRlc2Nfd2lkdGggPj0gc3RybGVuKGRlc2MtPnN0cikpCisJCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIHdpZHRoLAorCQkJCWRlc2MtPmNtZFswXSA9PSAnLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCWRlc2MtPnN0ciwgVlRZX05FV0xJTkUpOworCQllbHNlCisJCQl2dHlfZGVzY3JpYmVfZm9sZCh2dHksIHdpZHRoLCBkZXNjX3dpZHRoLCBkZXNjKTsKKwl9CisKKwljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCXZlY3Rvcl9mcmVlKGRlc2NyaWJlKTsKKworCXZ0eV9wcm9tcHQodnR5KTsKKwl2dHlfcmVkcmF3X2xpbmUodnR5KTsKK30KKworLyogXkMgc3RvcCBjdXJyZW50IGlucHV0IGFuZCBkbyBub3QgYWRkIGNvbW1hbmQgbGluZSB0byB0aGUgaGlzdG9yeS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9zdG9wX2lucHV0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHktPmNwID0gdnR5LT5sZW5ndGggPSAwOworCXZ0eV9jbGVhcl9idWYodnR5KTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQkvKiBOb3RoaW5nIHRvIGRvLiAqLworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCWNhc2UgVlRZX05PREU6CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIG5vZGUsIHdlIGhhdmUgdG8gaWdub3JlIGl0LiAqLworCQlicmVhazsKKwl9CisJdnR5X3Byb21wdCh2dHkpOworCisJLyogU2V0IGhpc3RvcnkgcG9pbnRlciB0byB0aGUgbGF0ZXN0IG9uZS4gKi8KKwl2dHktPmhwID0gdnR5LT5oaW5kZXg7Cit9CisKKyNkZWZpbmUgQ09OVFJPTChYKSAgKChYKSAtICdAJykKKyNkZWZpbmUgVlRZX05PUk1BTCAgICAgMAorI2RlZmluZSBWVFlfUFJFX0VTQ0FQRSAxCisjZGVmaW5lIFZUWV9FU0NBUEUgICAgIDIKKworLyogRXNjYXBlIGNoYXJhY3RlciBjb21tYW5kIG1hcC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9lc2NhcGVfbWFwKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IHZ0eSAqdnR5KQoreworCXN3aXRjaCAoYykgeworCWNhc2UgKCdBJyk6CisJCXZ0eV9wcmV2aW91c19saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgKCdCJyk6CisJCXZ0eV9uZXh0X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSAoJ0MnKToKKwkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOworCQlicmVhazsKKwljYXNlICgnRCcpOgorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlLiAqLworCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKK30KKworLyogUXVpdCBwcmludCBvdXQgdG8gdGhlIGJ1ZmZlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9idWZmZXJfcmVzZXQoc3RydWN0IHZ0eSAqdnR5KQoreworCWJ1ZmZlcl9yZXNldCh2dHktPm9idWYpOworCXZ0eV9wcm9tcHQodnR5KTsKKwl2dHlfcmVkcmF3X2xpbmUodnR5KTsKK30KKworLyogUmVhZCBkYXRhIHZpYSB2dHkgc29ja2V0LiAqLworaW50IHZ0eV9yZWFkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgbmJ5dGVzOworCXVuc2lnbmVkIGNoYXIgYnVmW1ZUWV9SRUFEX0JVRlNJWl07CisKKwlpbnQgdnR5X3NvY2sgPSB2dHktPmZkOworCisJLyogUmVhZCByYXcgZGF0YSBmcm9tIHNvY2tldCAqLworCWlmICgobmJ5dGVzID0gcmVhZCh2dHktPmZkLCBidWYsIFZUWV9SRUFEX0JVRlNJWikpIDw9IDApIHsKKwkJaWYgKG5ieXRlcyA8IDApIHsKKwkJCWlmIChFUlJOT19JT19SRVRSWShlcnJubykpIHsKKwkJCQl2dHlfZXZlbnQoVlRZX1JFQUQsIHZ0eV9zb2NrLCB2dHkpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWJ1ZmZlcl9yZXNldCh2dHktPm9idWYpOworCQl2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspIHsKKwkJaWYgKGJ1ZltpXSA9PSBJQUMpIHsKKwkJCWlmICghdnR5LT5pYWMpIHsKKwkJCQl2dHktPmlhYyA9IDE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCXZ0eS0+aWFjID0gMDsKKwkJCX0KKwkJfQorCisJCWlmICh2dHktPmlhY19zYl9pbl9wcm9ncmVzcyAmJiAhdnR5LT5pYWMpIHsKKwkJCWlmICh2dHktPnNiX2xlbiA8IHNpemVvZih2dHktPnNiX2J1ZikpCisJCQkJdnR5LT5zYl9idWZbdnR5LT5zYl9sZW5dID0gYnVmW2ldOworCQkJdnR5LT5zYl9sZW4rKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZ0eS0+aWFjKSB7CisJCQkvKiBJbiBjYXNlIG9mIHRlbG5ldCBjb21tYW5kICovCisJCQlpbnQgcmV0ID0gMDsKKwkJCXJldCA9IHZ0eV90ZWxuZXRfb3B0aW9uKHZ0eSwgYnVmICsgaSwgbmJ5dGVzIC0gaSk7CisJCQl2dHktPmlhYyA9IDA7CisJCQlpICs9IHJldDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZ0eS0+c3RhdHVzID09IFZUWV9NT1JFKSB7CisJCQlzd2l0Y2ggKGJ1ZltpXSkgeworCQkJY2FzZSBDT05UUk9MKCdDJyk6CisJCQljYXNlICdxJzoKKwkJCWNhc2UgJ1EnOgorCQkJCXZ0eV9idWZmZXJfcmVzZXQodnR5KTsKKwkJCQlicmVhazsKKyNpZiAwCQkJCS8qIE1vcmUgbGluZSBkb2VzIG5vdCB3b3JrIGZvciAic2hvdyBpcCBiZ3AiLiAgKi8KKwkJCWNhc2UgJ1xuJzoKKwkJCWNhc2UgJ1xyJzoKKwkJCQl2dHktPnN0YXR1cyA9IFZUWV9NT1JFTElORTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRXNjYXBlIGNoYXJhY3Rlci4gKi8KKwkJaWYgKHZ0eS0+ZXNjYXBlID09IFZUWV9FU0NBUEUpIHsKKwkJCXZ0eV9lc2NhcGVfbWFwKGJ1ZltpXSwgdnR5KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUHJlLWVzY2FwZSBzdGF0dXMuICovCisJCWlmICh2dHktPmVzY2FwZSA9PSBWVFlfUFJFX0VTQ0FQRSkgeworCQkJc3dpdGNoIChidWZbaV0pIHsKKwkJCWNhc2UgJ1snOgorCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX0VTQ0FQRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2InOgorCQkJCXZ0eV9iYWNrd2FyZF93b3JkKHZ0eSk7CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworCQkJCWJyZWFrOworCQkJY2FzZSAnZic6CisJCQkJdnR5X2ZvcndhcmRfd29yZCh2dHkpOworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2QnOgorCQkJCXZ0eV9mb3J3YXJkX2tpbGxfd29yZCh2dHkpOworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ09OVFJPTCgnSCcpOgorCQkJY2FzZSAweDdmOgorCQkJCXZ0eV9iYWNrd2FyZF9raWxsX3dvcmQodnR5KTsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChidWZbaV0pIHsKKwkJY2FzZSBDT05UUk9MKCdBJyk6CisJCQl2dHlfYmVnaW5uaW5nX29mX2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0InKToKKwkJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdDJyk6CisJCQl2dHlfc3RvcF9pbnB1dCh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnRCcpOgorCQkJdnR5X2RlbGV0ZV9jaGFyKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdFJyk6CisJCQl2dHlfZW5kX29mX2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0YnKToKKwkJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0gnKToKKwkJY2FzZSAweDdmOgorCQkJdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdLJyk6CisJCQl2dHlfa2lsbF9saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdOJyk6CisJCQl2dHlfbmV4dF9saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdQJyk6CisJCQl2dHlfcHJldmlvdXNfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnVCcpOgorCQkJdnR5X3RyYW5zcG9zZV9jaGFycyh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnVScpOgorCQkJdnR5X2tpbGxfbGluZV9mcm9tX2JlZ2lubmluZyh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnVycpOgorCQkJdnR5X2JhY2t3YXJkX2tpbGxfd29yZCh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnWicpOgorCQkJdnR5X2VuZF9jb25maWcodnR5KTsKKwkJCWJyZWFrOworCQljYXNlICdcbic6CisJCWNhc2UgJ1xyJzoKKwkJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJCQl2dHlfZXhlY3V0ZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgJ1x0JzoKKwkJCXZ0eV9jb21wbGV0ZV9jb21tYW5kKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERQorCQkJICAgIHx8IHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKQorCQkJCXZ0eV9zZWxmX2luc2VydCh2dHksIGJ1ZltpXSk7CisJCQllbHNlCisJCQkJdnR5X2Rlc2NyaWJlX2NvbW1hbmQodnR5KTsKKwkJCWJyZWFrOworCQljYXNlICdcMDMzJzoKKwkJCWlmIChpICsgMSA8IG5ieXRlcyAmJiBidWZbaSArIDFdID09ICdbJykgeworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX0VTQ0FQRTsKKwkJCQlpKys7CisJCQl9IGVsc2UKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9QUkVfRVNDQVBFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoYnVmW2ldID4gMzEgJiYgYnVmW2ldIDwgMTI3KQorCQkJCXZ0eV9zZWxmX2luc2VydCh2dHksIGJ1ZltpXSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIENoZWNrIHN0YXR1cy4gKi8KKwlpZiAodnR5LT5zdGF0dXMgPT0gVlRZX0NMT1NFKQorCQl2dHlfY2xvc2UodnR5KTsKKwllbHNlIHsKKwkJdnR5X2V2ZW50KFZUWV9XUklURSwgdnR5X3NvY2ssIHZ0eSk7CisJCXZ0eV9ldmVudChWVFlfUkVBRCwgdnR5X3NvY2ssIHZ0eSk7CisJfQorCXJldHVybiAwOworfQorCisvKiBSZWFkIHVwIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworc3RhdGljIGludAordnR5X3JlYWRfZmlsZShGSUxFICpjb25mcCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB2dHkgKnZ0eTsKKworCXZ0eSA9IHZ0eV9uZXcoKTsKKwl2dHktPmZkID0gMDsKKwl2dHktPnR5cGUgPSBWVFlfRklMRTsKKwl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKworCXJldCA9IGNvbmZpZ19mcm9tX2ZpbGUodnR5LCBjb25mcCk7CisKKwlpZiAocmV0ICE9IENNRF9TVUNDRVNTKSB7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgQ01EX0VSUl9BTUJJR1VPVVM6CisJCQlmcHJpbnRmKHN0ZGVyciwgIkFtYmlndW91cyBjb21tYW5kLlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQkJZnByaW50ZihzdGRlcnIsICJUaGVyZSBpcyBubyBzdWNoIGNvbW1hbmQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHJlYWRpbmcgYmVsb3cgIgorCQkJImxpbmU6XG4lc1xuIiwgdnR5LT5idWYpOworCQl2dHlfY2xvc2UodnR5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdnR5X2Nsb3NlKHZ0eSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBuZXcgdnR5IHN0cnVjdHVyZS4gKi8KK3N0cnVjdCB2dHkgKgordnR5X2NyZWF0ZSAoaW50IHZ0eV9zb2NrLCB2b2lkICpwcml2KQoreworICBzdHJ1Y3QgdnR5ICp2dHk7CisKKwlzdHJ1Y3QgdGVybWlvcyB0OworCisJdGNnZXRhdHRyKHZ0eV9zb2NrLCAmdCk7CisJY2ZtYWtlcmF3KCZ0KTsKKwl0Y3NldGF0dHIodnR5X3NvY2ssIFRDU0FOT1csICZ0KTsKKworICAvKiBBbGxvY2F0ZSBuZXcgdnR5IHN0cnVjdHVyZSBhbmQgc2V0IHVwIGRlZmF1bHQgdmFsdWVzLiAqLworICB2dHkgPSB2dHlfbmV3ICgpOworICB2dHktPmZkID0gdnR5X3NvY2s7CisgIHZ0eS0+cHJpdiA9IHByaXY7CisgIHZ0eS0+dHlwZSA9IFZUWV9URVJNOworICBpZiAobm9fcGFzc3dvcmRfY2hlY2spCisgICAgeworICAgICAgaWYgKGhvc3QuYWR2YW5jZWQpCisJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisgICAgICBlbHNlCisJdnR5LT5ub2RlID0gVklFV19OT0RFOworICAgIH0KKyAgZWxzZQorICAgIHZ0eS0+bm9kZSA9IEFVVEhfTk9ERTsKKyAgdnR5LT5mYWlsID0gMDsKKyAgdnR5LT5jcCA9IDA7CisgIHZ0eV9jbGVhcl9idWYgKHZ0eSk7CisgIHZ0eS0+bGVuZ3RoID0gMDsKKyAgbWVtc2V0ICh2dHktPmhpc3QsIDAsIHNpemVvZiAodnR5LT5oaXN0KSk7CisgIHZ0eS0+aHAgPSAwOworICB2dHktPmhpbmRleCA9IDA7CisgIHZlY3Rvcl9zZXRfaW5kZXggKHZ0eXZlYywgdnR5X3NvY2ssIHZ0eSk7CisgIHZ0eS0+c3RhdHVzID0gVlRZX05PUk1BTDsKKyAgaWYgKGhvc3QubGluZXMgPj0gMCkKKyAgICB2dHktPmxpbmVzID0gaG9zdC5saW5lczsKKyAgZWxzZQorICAgIHZ0eS0+bGluZXMgPSAtMTsKKworICBpZiAoISBub19wYXNzd29yZF9jaGVjaykKKyAgICB7CisgICAgICAvKiBWdHkgaXMgbm90IGF2YWlsYWJsZSBpZiBwYXNzd29yZCBpc24ndCBzZXQuICovCisgICAgICBpZiAoaG9zdC5wYXNzd29yZCA9PSBOVUxMICYmIGhvc3QucGFzc3dvcmRfZW5jcnlwdCA9PSBOVUxMKQorCXsKKwkgIHZ0eV9vdXQgKHZ0eSwgIlZ0eSBwYXNzd29yZCBpcyBub3Qgc2V0LiVzIiwgVlRZX05FV0xJTkUpOworCSAgdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJICB2dHlfY2xvc2UgKHZ0eSk7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorCisgIC8qIFNheSBoZWxsbyB0byB0aGUgd29ybGQuICovCisgIHZ0eV9oZWxsbyAodnR5KTsKKyAgaWYgKCEgbm9fcGFzc3dvcmRfY2hlY2spCisgICAgdnR5X291dCAodnR5LCAiJXNVc2VyIEFjY2VzcyBWZXJpZmljYXRpb24lcyVzIiwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSk7CisKKyAgLyogU2V0dGluZyB1cCB0ZXJtaW5hbC4gKi8KKyAgdnR5X3dpbGxfZWNobyAodnR5KTsKKyAgdnR5X3dpbGxfc3VwcHJlc3NfZ29fYWhlYWQgKHZ0eSk7CisKKyAgdnR5X2RvbnRfbGluZW1vZGUgKHZ0eSk7CisgIHZ0eV9kb193aW5kb3dfc2l6ZSAodnR5KTsKKyAgLyogdnR5X2RvbnRfbGZsb3dfYWhlYWQgKHZ0eSk7ICovCisKKyAgdnR5X3Byb21wdCAodnR5KTsKKworICAvKiBBZGQgcmVhZC93cml0ZSB0aHJlYWQuICovCisgIHZ0eV9ldmVudCAoVlRZX1dSSVRFLCB2dHlfc29jaywgdnR5KTsKKyAgdnR5X2V2ZW50IChWVFlfUkVBRCwgdnR5X3NvY2ssIHZ0eSk7CisKKyAgcmV0dXJuIHZ0eTsKK30KKworREVGVU4oY29uZmlnX3dobywgY29uZmlnX3dob19jbWQsICJ3aG8iLCAiRGlzcGxheSB3aG8gaXMgb24gdnR5XG4iKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB2dHkgKnY7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2dHl2ZWMpOyBpKyspCisJCWlmICgodiA9IHZlY3Rvcl9zbG90KHZ0eXZlYywgaSkpICE9IE5VTEwpCisJCQl2dHlfb3V0KHZ0eSwgIiVzdnR5WyVkXSAlcyIsCisJCQkJdi0+Y29uZmlnID8gIioiIDogIiAiLCBpLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBNb3ZlIHRvIHZ0eSBjb25maWd1cmF0aW9uIG1vZGUuICovCitERUZVTihsaW5lX3Z0eSwKKyAgICAgIGxpbmVfdnR5X2NtZCwKKyAgICAgICJsaW5lIHZ0eSIsICJDb25maWd1cmUgYSB0ZXJtaW5hbCBsaW5lXG4iICJWaXJ0dWFsIHRlcm1pbmFsXG4iKQoreworCXZ0eS0+bm9kZSA9IFZUWV9OT0RFOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogdnR5IGxvZ2luLiAqLworREVGVU4odnR5X2xvZ2luLCB2dHlfbG9naW5fY21kLCAibG9naW4iLCAiRW5hYmxlIHBhc3N3b3JkIGNoZWNraW5nXG4iKQoreworCW5vX3Bhc3N3b3JkX2NoZWNrID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3Z0eV9sb2dpbiwKKyAgICAgIG5vX3Z0eV9sb2dpbl9jbWQsICJubyBsb2dpbiIsIE5PX1NUUiAiRW5hYmxlIHBhc3N3b3JkIGNoZWNraW5nXG4iKQoreworCW5vX3Bhc3N3b3JkX2NoZWNrID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNlcnZpY2VfYWR2YW5jZWRfdnR5LAorICAgICAgc2VydmljZV9hZHZhbmNlZF92dHlfY21kLAorICAgICAgInNlcnZpY2UgYWR2YW5jZWQtdnR5IiwKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iICJFbmFibGUgYWR2YW5jZWQgbW9kZSB2dHkgaW50ZXJmYWNlXG4iKQoreworCWhvc3QuYWR2YW5jZWQgPSAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fc2VydmljZV9hZHZhbmNlZF92dHksCisgICAgICBub19zZXJ2aWNlX2FkdmFuY2VkX3Z0eV9jbWQsCisgICAgICAibm8gc2VydmljZSBhZHZhbmNlZC12dHkiLAorICAgICAgTk9fU1RSCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGFkdmFuY2VkIG1vZGUgdnR5IGludGVyZmFjZVxuIikKK3sKKwlob3N0LmFkdmFuY2VkID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHRlcm1pbmFsX21vbml0b3IsCisgICAgICB0ZXJtaW5hbF9tb25pdG9yX2NtZCwKKyAgICAgICJ0ZXJtaW5hbCBtb25pdG9yIiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICAiQ29weSBkZWJ1ZyBvdXRwdXQgdG8gdGhlIGN1cnJlbnQgdGVybWluYWwgbGluZVxuIikKK3sKKwl2dHktPm1vbml0b3IgPSAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4odGVybWluYWxfbm9fbW9uaXRvciwKKyAgICAgIHRlcm1pbmFsX25vX21vbml0b3JfY21kLAorICAgICAgInRlcm1pbmFsIG5vIG1vbml0b3IiLAorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIHBhcmFtZXRlcnNcbiIKKyAgICAgIE5PX1NUUiAiQ29weSBkZWJ1ZyBvdXRwdXQgdG8gdGhlIGN1cnJlbnQgdGVybWluYWwgbGluZVxuIikKK3sKKwl2dHktPm1vbml0b3IgPSAwOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19oaXN0b3J5LAorICAgICAgc2hvd19oaXN0b3J5X2NtZCwKKyAgICAgICJzaG93IGhpc3RvcnkiLCBTSE9XX1NUUiAiRGlzcGxheSB0aGUgc2Vzc2lvbiBjb21tYW5kIGhpc3RvcnlcbiIpCit7CisJaW50IGluZGV4OworCisJZm9yIChpbmRleCA9IHZ0eS0+aGluZGV4ICsgMTsgaW5kZXggIT0gdnR5LT5oaW5kZXg7KSB7CisJCWlmIChpbmRleCA9PSBWVFlfTUFYSElTVCkgeworCQkJaW5kZXggPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodnR5LT5oaXN0W2luZGV4XSAhPSBOVUxMKQorCQkJdnR5X291dCh2dHksICIgICVzJXMiLCB2dHktPmhpc3RbaW5kZXhdLCBWVFlfTkVXTElORSk7CisKKwkJaW5kZXgrKzsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIERpc3BsYXkgY3VycmVudCBjb25maWd1cmF0aW9uLiAqLworc3RhdGljIGludCB2dHlfY29uZmlnX3dyaXRlKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgImxpbmUgdnR5JXMiLCBWVFlfTkVXTElORSk7CisKKwkvKiBsb2dpbiAqLworCWlmIChub19wYXNzd29yZF9jaGVjaykKKwkJdnR5X291dCh2dHksICIgbm8gbG9naW4lcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiISVzIiwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdHJ1Y3QgY21kX25vZGUgdnR5X25vZGUgPSB7CisJVlRZX05PREUsCisJIiVzKGNvbmZpZy1saW5lKSMgIiwKKwkxLAorfTsKKworLyogUmVzZXQgYWxsIFZUWSBzdGF0dXMuICovCit2b2lkIHZ0eV9yZXNldCgpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHZ0eSAqdnR5OworCXN0cnVjdCB0aHJlYWQgKnZ0eV9zZXJ2X3RocmVhZDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHZ0eXZlYyk7IGkrKykKKwkJaWYgKCh2dHkgPSB2ZWN0b3Jfc2xvdCh2dHl2ZWMsIGkpKSAhPSBOVUxMKSB7CisJCQlidWZmZXJfcmVzZXQodnR5LT5vYnVmKTsKKwkJCXZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCQkJdnR5X2Nsb3NlKHZ0eSk7CisJCX0KKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKFZ2dHlfc2Vydl90aHJlYWQpOyBpKyspCisJCWlmICgodnR5X3NlcnZfdGhyZWFkID0KKwkJICAgICB2ZWN0b3Jfc2xvdChWdnR5X3NlcnZfdGhyZWFkLCBpKSkgIT0gTlVMTCkgeworCQkJLy90aHJlYWRfY2FuY2VsICh2dHlfc2Vydl90aHJlYWQpOworCQkJdmVjdG9yX3Nsb3QoVnZ0eV9zZXJ2X3RocmVhZCwgaSkgPSBOVUxMOworCQkJY2xvc2UoaSk7CisJCX0KK30KKworc3RhdGljIHZvaWQgdnR5X3NhdmVfY3dkKHZvaWQpCit7CisJY2hhciBjd2RbTUFYUEFUSExFTl07CisJY2hhciAqYyA7CisKKwljID0gZ2V0Y3dkKGN3ZCwgTUFYUEFUSExFTik7CisKKwlpZiAoIWMpIHsKKwkJaWYgKGNoZGlyKFNZU0NPTkZESVIpICE9IDApCisJCSAgICBwZXJyb3IoImNoZGlyIGZhaWxlZCIpOworCQlpZiAoZ2V0Y3dkKGN3ZCwgTUFYUEFUSExFTikgPT0gTlVMTCkKKwkJICAgIHBlcnJvcigiZ2V0Y3dkIGZhaWxlZCIpOworCX0KKworCXZ0eV9jd2QgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY3R4LCBzdHJsZW4oY3dkKSArIDEsICJzYXZlX2N3ZCIpOworCXN0cmNweSh2dHlfY3dkLCBjd2QpOworfQorCitjaGFyICp2dHlfZ2V0X2N3ZCgpCit7CisJcmV0dXJuIHZ0eV9jd2Q7Cit9CisKK2ludCB2dHlfc2hlbGxfc2VydihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJcmV0dXJuIHZ0eS0+dHlwZSA9PSBWVFlfU0hFTExfU0VSViA/IDEgOiAwOworfQorCit2b2lkIHZ0eV9pbml0X3Z0eXNoKCkKK3sKKwl2dHl2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworfQorCitleHRlcm4gdm9pZCAqdGFsbF9ic2NfY3R4OworLyogSW5zdGFsbCB2dHkncyBvd24gY29tbWFuZHMgbGlrZSBgd2hvJyBjb21tYW5kLiAqLwordm9pZCB2dHlfaW5pdCgpCit7CisJdGFsbF92dHlfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDAsICJ2dHkiKTsKKwl0YWxsX3Z0eV92ZWNfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfdnR5X2N0eCwgMCwgInZ0eV92ZWN0b3IiKTsKKwl0YWxsX3Z0eV9jbWRfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfdnR5X2N0eCwgMCwgInZ0eV9jb21tYW5kIik7CisKKwkvKiBGb3IgZnVydGhlciBjb25maWd1cmF0aW9uIHJlYWQsIHByZXNlcnZlIGN1cnJlbnQgZGlyZWN0b3J5LiAqLworCXZ0eV9zYXZlX2N3ZCgpOworCisJdnR5dmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKworCS8qIEluc3RhbGwgYmdwIHRvcCBub2RlLiAqLworCWluc3RhbGxfbm9kZSgmdnR5X25vZGUsIHZ0eV9jb25maWdfd3JpdGUpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ193aG9fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19oaXN0b3J5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX3dob19jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmxpbmVfdnR5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2VydmljZV9hZHZhbmNlZF92dHlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19zZXJ2aWNlX2FkdmFuY2VkX3Z0eV9jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnNob3dfaGlzdG9yeV9jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJnRlcm1pbmFsX21vbml0b3JfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZ0ZXJtaW5hbF9ub19tb25pdG9yX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmc2hvd19oaXN0b3J5X2NtZCk7CisKKwlpbnN0YWxsX2RlZmF1bHQoVlRZX05PREUpOworCWluc3RhbGxfZWxlbWVudChWVFlfTk9ERSwgJnZ0eV9sb2dpbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChWVFlfTk9ERSwgJm5vX3Z0eV9sb2dpbl9jbWQpOworfQorCitpbnQgdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uc3QgY2hhciAqZmlsZV9uYW1lKQoreworCUZJTEUgKmNmaWxlOworCWludCByYzsKKworCWNmaWxlID0gZm9wZW4oZmlsZV9uYW1lLCAiciIpOworCWlmICghY2ZpbGUpCisJCXJldHVybiAtRU5PRU5UOworCisJcmMgPSB2dHlfcmVhZF9maWxlKGNmaWxlKTsKKwlmY2xvc2UoY2ZpbGUpOworCisJaG9zdF9jb25maWdfc2V0KGZpbGVfbmFtZSk7CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlLmMgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxYTYwMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDE4MzYgQEAKKy8qIE9wZW5CU0MgaW50ZXJmYWNlIHRvIHF1YWdnYSBWVFkgKi8KKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Z0eS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQ7CisKK3N0cnVjdCBjbWRfbm9kZSBuZXRfbm9kZSA9IHsKKwlHU01ORVRfTk9ERSwKKwkiJXMobmV0d29yaykjIiwKKwkxLAorfTsKKworc3RydWN0IGNtZF9ub2RlIGJ0c19ub2RlID0geworCUJUU19OT0RFLAorCSIlcyhidHMpIyIsCisJMSwKK307CisKK3N0cnVjdCBjbWRfbm9kZSB0cnhfbm9kZSA9IHsKKwlUUlhfTk9ERSwKKwkiJXModHJ4KSMiLAorCTEsCit9OworCitzdHJ1Y3QgY21kX25vZGUgdHNfbm9kZSA9IHsKKwlUU19OT0RFLAorCSIlcyh0cykjIiwKKwkxLAorfTsKKworc3RhdGljIGludCBkdW1teV9jb25maWdfd3JpdGUoc3RydWN0IHZ0eSAqdikKK3sKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9kdW1wX25tc3RhdGUoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpubXMpCit7CisJdnR5X291dCh2dHksIk9wZXIgJyVzJywgQWRtaW4gJXUsIEF2YWlsICclcyclcyIsCisJCW5tX29wc3RhdGVfbmFtZShubXMtPm9wZXJhdGlvbmFsKSwgbm1zLT5hZG1pbmlzdHJhdGl2ZSwKKwkJbm1fYXZhaWxfbmFtZShubXMtPmF2YWlsYWJpbGl0eSksIFZUWV9ORVdMSU5FKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9wY2hhbl9sb2FkX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgKnByZWZpeCwKKwkJCQljb25zdCBzdHJ1Y3QgcGNoYW5fbG9hZCAqcGwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwbC0+cGNoYW4pOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGxvYWRfY291bnRlciAqbGMgPSAmcGwtPnBjaGFuW2ldOworCQl1bnNpZ25lZCBpbnQgcGVyY2VudDsKKworCQlpZiAobGMtPnRvdGFsID09IDApCisJCQljb250aW51ZTsKKworCQlwZXJjZW50ID0gKGxjLT51c2VkICogMTAwKSAvIGxjLT50b3RhbDsKKworCQl2dHlfb3V0KHZ0eSwgIiVzJTIwczogJTN1JSUgKCV1LyV1KSVzIiwgcHJlZml4LAorCQkJZ3NtX3BjaGFuX25hbWUoaSksIHBlcmNlbnQsIGxjLT51c2VkLCBsYy0+dG90YWwsCisJCQlWVFlfTkVXTElORSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBuZXRfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCkKK3sKKwlzdHJ1Y3QgcGNoYW5fbG9hZCBwbDsKKworCXZ0eV9vdXQodnR5LCAiQlNDIGlzIG9uIENvdW50cnkgQ29kZSAldSwgTmV0d29yayBDb2RlICV1ICIKKwkJImFuZCBoYXMgJXUgQlRTJXMiLCBuZXQtPmNvdW50cnlfY29kZSwgbmV0LT5uZXR3b3JrX2NvZGUsCisJCW5ldC0+bnVtX2J0cywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBMb25nIG5ldHdvcmsgbmFtZTogJyVzJyVzIiwKKwkJbmV0LT5uYW1lX2xvbmcsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgU2hvcnQgbmV0d29yayBuYW1lOiAnJXMnJXMiLAorCQluZXQtPm5hbWVfc2hvcnQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgQXV0aGVudGljYXRpb24gcG9saWN5OiAlcyVzIiwKKwkJZ3NtX2F1dGhfcG9saWN5X25hbWUobmV0LT5hdXRoX3BvbGljeSksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTG9jYXRpb24gdXBkYXRpbmcgcmVqZWN0IGNhdXNlOiAldSVzIiwKKwkJbmV0LT5yZWplY3RfY2F1c2UsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgRW5jcnlwdGlvbjogQTUvJXUlcyIsIG5ldC0+YTVfZW5jcnlwdGlvbiwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBORUNJIChUQ0gvSCk6ICV1JXMiLCBuZXQtPm5lY2ksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgUlJMUCBNb2RlOiAlcyVzIiwgcnJscF9tb2RlX25hbWUobmV0LT5ycmxwLm1vZGUpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE1NIEluZm86ICVzJXMiLCBuZXQtPnNlbmRfbW1faW5mbyA/ICJPbiIgOiAiT2ZmIiwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBIYW5kb3ZlcjogJXMlcyIsIG5ldC0+aGFuZG92ZXIuYWN0aXZlID8gIk9uIiA6ICJPZmYiLAorCQlWVFlfTkVXTElORSk7CisJbmV0d29ya19jaGFuX2xvYWQoJnBsLCBuZXQpOworCXZ0eV9vdXQodnR5LCAiICBDdXJyZW50IENoYW5uZWwgTG9hZDolcyIsIFZUWV9ORVdMSU5FKTsKKwlkdW1wX3BjaGFuX2xvYWRfdnR5KHZ0eSwgIiAgICAiLCAmcGwpOworfQorCitERUZVTihzaG93X25ldCwgc2hvd19uZXRfY21kLCAic2hvdyBuZXR3b3JrIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIEdTTSBORVRXT1JLXG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCW5ldF9kdW1wX3Z0eSh2dHksIG5ldCk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGUxaXNsX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGUxaW5wX3NpZ25fbGluayAqZTFsKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCisJaWYgKCFlMWwpIHsKKwkJdnR5X291dCh2dHksICIgICBOb25lJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybjsKKwl9CisKKwlsaW5lID0gZTFsLT50cy0+bGluZTsKKworCXZ0eV9vdXQodnR5LCAiICAgIEUxIExpbmUgJXUsIFR5cGUgJXM6IFRpbWVzbG90ICV1LCBNb2RlICVzJXMiLAorCQlsaW5lLT5udW0sIGxpbmUtPmRyaXZlci0+bmFtZSwgZTFsLT50cy0+bnVtLAorCQllMWlucF9zaWdudHlwZV9uYW1lKGUxbC0+dHlwZSksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgICBFMSBURUkgJXUsIFNBUEkgJXUlcyIsCisJCWUxbC0+dGVpLCBlMWwtPnNhcGksIFZUWV9ORVdMSU5FKTsKK30KKworc3RhdGljIHZvaWQgYnRzX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgcGNoYW5fbG9hZCBwbDsKKworCXZ0eV9vdXQodnR5LCAiQlRTICV1IGlzIG9mICVzIHR5cGUgaW4gYmFuZCAlcywgaGFzIENJICV1IExBQyAldSwgIgorCQkiQlNJQyAldSwgVFNDICV1IGFuZCAldSBUUlglcyIsCisJCWJ0cy0+bnIsIGJ0c3R5cGUyc3RyKGJ0cy0+dHlwZSksIGdzbV9iYW5kX25hbWUoYnRzLT5iYW5kKSwKKwkJYnRzLT5jZWxsX2lkZW50aXR5LAorCQlidHMtPmxvY2F0aW9uX2FyZWFfY29kZSwgYnRzLT5ic2ljLCBidHMtPnRzYywKKwkJYnRzLT5udW1fdHJ4LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJNUyBNYXggcG93ZXI6ICV1IGRCbSVzIiwgYnRzLT5tc19tYXhfcG93ZXIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIk1pbmltdW0gUnggTGV2ZWwgZm9yIEFjY2VzczogJWkgZEJtJXMiLAorCQlyeGxldjJkYm0oYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4pLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJDZWxsIFJlc2VsZWN0aW9uIEh5c3RlcmVzaXM6ICV1IGRCbSVzIiwKKwkJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLmNlbGxfcmVzZWxfaHlzdCoyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJSQUNIIFRYLUludGVnZXI6ICV1JXMiLCBidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudHhfaW50ZWdlciwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiUkFDSCBNYXggdHJhbnNtaXNzaW9uczogJXUlcyIsCisJCXJhY2hfbWF4X3RyYW5zX3JhdzJ2YWwoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyksCisJCVZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyKQorCQl2dHlfb3V0KHZ0eSwgIiAgQ0VMTCBJUyBCQVJSRUQlcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpCisJCXZ0eV9vdXQodnR5LCAiICBVbml0IElEOiAldS8ldS8wLCBPTUwgU3RyZWFtIElEIDB4JTAyeCVzIiwKKwkJCWJ0cy0+aXBfYWNjZXNzLnNpdGVfaWQsIGJ0cy0+aXBfYWNjZXNzLmJ0c19pZCwKKwkJCWJ0cy0+b21sX3RlaSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZidHMtPm5tX3N0YXRlKTsKKwl2dHlfb3V0KHZ0eSwgIiAgU2l0ZSBNZ3IgTk0gU3RhdGU6ICIpOworCW5ldF9kdW1wX25tc3RhdGUodnR5LCAmYnRzLT5zaXRlX21nci5ubV9zdGF0ZSk7CisJdnR5X291dCh2dHksICIgIFBhZ2luZzogRklYTUUgcGVuZGluZyByZXF1ZXN0cywgJXUgZnJlZSBzbG90cyVzIiwKKwkJYnRzLT5wYWdpbmcuYXZhaWxhYmxlX3Nsb3RzLCBWVFlfTkVXTElORSk7CisJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgRTEgU2lnbmFsbGluZyBMaW5rOiVzIiwgVlRZX05FV0xJTkUpOworCQllMWlzbF9kdW1wX3Z0eSh2dHksIGJ0cy0+b21sX2xpbmspOworCX0KKwkvKiBGSVhNRTogb21sX2xpbmssIGNoYW5fZGVzYyAqLworCW1lbXNldCgmcGwsIDAsIHNpemVvZihwbCkpOworCWJ0c19jaGFuX2xvYWQoJnBsLCBidHMpOworCXZ0eV9vdXQodnR5LCAiICBDdXJyZW50IENoYW5uZWwgTG9hZDolcyIsIFZUWV9ORVdMSU5FKTsKKwlkdW1wX3BjaGFuX2xvYWRfdnR5KHZ0eSwgIiAgICAiLCAmcGwpOworfQorCitERUZVTihzaG93X2J0cywgc2hvd19idHNfY21kLCAic2hvdyBidHMgW251bWJlcl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgQlRTXG4iCisJCSJCVFMgbnVtYmVyIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlpbnQgYnRzX25yOworCisJaWYgKGFyZ2MgIT0gMCkgeworCQkvKiB1c2UgdGhlIEJUUyBudW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkICovCisJCWJ0c19uciA9IGF0b2koYXJndlswXSk7CisJCWlmIChidHNfbnIgPiBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJyVzJyVzIiwgYXJndlswXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJYnRzX2R1bXBfdnR5KHZ0eSwgZ3NtX2J0c19udW0obmV0LCBidHNfbnIpKTsKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwkvKiBwcmludCBhbGwgQlRTJ3MgKi8KKwlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspCisJCWJ0c19kdW1wX3Z0eSh2dHksIGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHV0aWxpdHkgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBwYXJzZV9lMV9saW5rKHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFfbGluaywgY29uc3QgY2hhciAqbGluZSwKKwkJCSAgY29uc3QgY2hhciAqdHMsIGNvbnN0IGNoYXIgKnNzKQoreworCWUxX2xpbmstPmUxX25yID0gYXRvaShsaW5lKTsKKwllMV9saW5rLT5lMV90cyA9IGF0b2kodHMpOworCWlmICghc3RyY21wKHNzLCAiZnVsbCIpKQorCQllMV9saW5rLT5lMV90c19zcyA9IDI1NTsKKwllbHNlCisJCWUxX2xpbmstPmUxX3RzX3NzID0gYXRvaShzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV9lMV9saW5rKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rLAorCQkJCSBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaWYgKCFlMV9saW5rLT5lMV90cykKKwkJcmV0dXJuOworCisJaWYgKGUxX2xpbmstPmUxX3RzX3NzID09IDI1NSkKKwkJdnR5X291dCh2dHksICIlc2UxIGxpbmUgJXUgdGltZXNsb3QgJXUgc3ViLXNsb3QgZnVsbCVzIiwKKwkJCXByZWZpeCwgZTFfbGluay0+ZTFfbnIsIGUxX2xpbmstPmUxX3RzLCBWVFlfTkVXTElORSk7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgIiVzZTEgbGluZSAldSB0aW1lc2xvdCAldSBzdWItc2xvdCAldSVzIiwKKwkJCXByZWZpeCwgZTFfbGluay0+ZTFfbnIsIGUxX2xpbmstPmUxX3RzLAorCQkJZTFfbGluay0+ZTFfdHNfc3MsIFZUWV9ORVdMSU5FKTsKK30KKworCitzdGF0aWMgdm9pZCBjb25maWdfd3JpdGVfdHNfc2luZ2xlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwl2dHlfb3V0KHZ0eSwgIiAgICB0aW1lc2xvdCAldSVzIiwgdHMtPm5yLCBWVFlfTkVXTElORSk7CisJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fTk9ORSkKKwkJdnR5X291dCh2dHksICIgICAgIHBoeXNfY2hhbl9jb25maWcgJXMlcyIsCisJCQlnc21fcGNoYW5fbmFtZSh0cy0+cGNoYW4pLCBWVFlfTkVXTElORSk7CisJY29uZmlnX3dyaXRlX2UxX2xpbmsodnR5LCAmdHMtPmUxX2xpbmssICIgICAgICIpOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfd3JpdGVfdHJ4X3NpbmdsZShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCWludCBpOworCisJdnR5X291dCh2dHksICIgIHRyeCAldSVzIiwgdHJ4LT5uciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgcmZfbG9ja2VkICV1JXMiLAorCQl0cngtPm5tX3N0YXRlLmFkbWluaXN0cmF0aXZlID09IE5NX1NUQVRFX0xPQ0tFRCA/IDEgOiAwLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICBhcmZjbiAldSVzIiwgdHJ4LT5hcmZjbiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgbm9taW5hbCBwb3dlciAldSVzIiwgdHJ4LT5ub21pbmFsX3Bvd2VyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICBtYXhfcG93ZXJfcmVkICV1JXMiLCB0cngtPm1heF9wb3dlcl9yZWQsIFZUWV9ORVdMSU5FKTsKKwljb25maWdfd3JpdGVfZTFfbGluayh2dHksICZ0cngtPnJzbF9lMV9saW5rLCAiICAgcnNsICIpOworCXZ0eV9vdXQodnR5LCAiICAgcnNsIGUxIHRlaSAldSVzIiwgdHJ4LT5yc2xfdGVpLCBWVFlfTkVXTElORSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFJYX05SX1RTOyBpKyspCisJCWNvbmZpZ193cml0ZV90c19zaW5nbGUodnR5LCAmdHJ4LT50c1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV9idHNfc2luZ2xlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlpbnQgaTsKKworCXZ0eV9vdXQodnR5LCAiIGJ0cyAldSVzIiwgYnRzLT5uciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICB0eXBlICVzJXMiLCBidHN0eXBlMnN0cihidHMtPnR5cGUpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJhbmQgJXMlcyIsIGdzbV9iYW5kX25hbWUoYnRzLT5iYW5kKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBjZWxsX2lkZW50aXR5ICV1JXMiLCBidHMtPmNlbGxfaWRlbnRpdHksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbG9jYXRpb25fYXJlYV9jb2RlICV1JXMiLCBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlICV1JXMiLCBidHMtPnRzYywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiYXNlX3N0YXRpb25faWRfY29kZSAldSVzIiwgYnRzLT5ic2ljLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIG1zIG1heCBwb3dlciAldSVzIiwgYnRzLT5tc19tYXhfcG93ZXIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgY2VsbCByZXNlbGVjdGlvbiBoeXN0ZXJlc2lzICV1JXMiLAorCQlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0KjIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcnhsZXYgYWNjZXNzIG1pbiAldSVzIiwKKwkJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4sIFZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyKQorCQl2dHlfb3V0KHZ0eSwgIiAgcGVyaW9kaWMgbG9jYXRpb24gdXBkYXRlICV1JXMiLAorCQkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyICogMTAsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgY2hhbm5lbCBhbGxvY2F0b3IgJXMlcyIsCisJCWJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlID8gImRlc2NlbmRpbmciIDogImFzY2VuZGluZyIsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcmFjaCB0eCBpbnRlZ2VyICV1JXMiLAorCQlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudHhfaW50ZWdlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICByYWNoIG1heCB0cmFuc21pc3Npb24gJXUlcyIsCisJCXJhY2hfbWF4X3RyYW5zX3JhdzJ2YWwoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyksCisJCVZUWV9ORVdMSU5FKTsKKworCWlmIChidHMtPnJhY2hfYl90aHJlc2ggIT0gLTEpCisJCXZ0eV9vdXQodnR5LCAiICByYWNoIG5tIGJ1c3kgdGhyZXNob2xkICV1JXMiLAorCQkJYnRzLT5yYWNoX2JfdGhyZXNoLCBWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+cmFjaF9sZGF2Z19zbG90cyAhPSAtMSkKKwkJdnR5X291dCh2dHksICIgIHJhY2ggbm0gbG9hZCBhdmVyYWdlICV1JXMiLAorCQkJYnRzLT5yYWNoX2xkYXZnX3Nsb3RzLCBWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5jZWxsX2JhcikKKwkJdnR5X291dCh2dHksICIgIGNlbGwgYmFycmVkIDElcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJdnR5X291dCh2dHksICIgIGlwLmFjY2VzcyB1bml0X2lkICV1ICV1JXMiLAorCQkJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCwgYnRzLT5pcF9hY2Nlc3MuYnRzX2lkLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICBvbWwgaXAuYWNjZXNzIHN0cmVhbV9pZCAldSVzIiwgYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJfSBlbHNlIHsKKwkJY29uZmlnX3dyaXRlX2UxX2xpbmsodnR5LCAmYnRzLT5vbWxfZTFfbGluaywgIiAgb21sICIpOworCQl2dHlfb3V0KHZ0eSwgIiAgb21sIGUxIHRlaSAldSVzIiwgYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJfQorCXZ0eV9vdXQodnR5LCAiICBncHJzIG1vZGUgJXMlcyIsIGJ0c19ncHJzX21vZGVfbmFtZShidHMtPmdwcnMubW9kZSksCisJCVZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5ncHJzLm1vZGUgIT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyByb3V0aW5nIGFyZWEgJXUlcyIsIGJ0cy0+Z3Bycy5yYWMsCisJCQlWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICBncHJzIGNlbGwgYnZjaSAldSVzIiwgYnRzLT5ncHJzLmNlbGwuYnZjaSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgIGdwcnMgbnNlaSAldSVzIiwgYnRzLT5ncHJzLm5zZS5uc2VpLAorCQkJVlRZX05FV0xJTkUpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidHMtPmdwcnMubnN2Yyk7IGkrKykgeworCQkJc3RydWN0IGdzbV9idHNfZ3Byc19uc3ZjICpuc3ZjID0KKwkJCQkJCSZidHMtPmdwcnMubnN2Y1tpXTsKKwkJCXN0cnVjdCBpbl9hZGRyIGlhOworCisJCQlpYS5zX2FkZHIgPSBodG9ubChuc3ZjLT5yZW1vdGVfaXApOworCQkJdnR5X291dCh2dHksICIgIGdwcnMgbnN2YyAldSBuc3ZjaSAldSVzIiwgaSwKKwkJCQluc3ZjLT5uc3ZjaSwgVlRZX05FV0xJTkUpOworCQkJdnR5X291dCh2dHksICIgIGdwcnMgbnN2YyAldSBsb2NhbCB1ZHAgcG9ydCAldSVzIiwgaSwKKwkJCQluc3ZjLT5sb2NhbF9wb3J0LCBWVFlfTkVXTElORSk7CisJCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IHJlbW90ZSB1ZHAgcG9ydCAldSVzIiwgaSwKKwkJCQluc3ZjLT5yZW1vdGVfcG9ydCwgVlRZX05FV0xJTkUpOworCQkJdnR5X291dCh2dHksICIgIGdwcnMgbnN2YyAldSByZW1vdGUgaXAgJXMlcyIsIGksCisJCQkJaW5ldF9udG9hKGlhKSwgVlRZX05FV0xJTkUpOworCQl9CisJfQorCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkKKwkJY29uZmlnX3dyaXRlX3RyeF9zaW5nbGUodnR5LCB0cngpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9idHMoc3RydWN0IHZ0eSAqdikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmZ3NtbmV0LT5idHNfbGlzdCwgbGlzdCkKKwkJY29uZmlnX3dyaXRlX2J0c19zaW5nbGUodiwgYnRzKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBjb25maWdfd3JpdGVfbmV0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgIm5ldHdvcmslcyIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBuZXR3b3JrIGNvdW50cnkgY29kZSAldSVzIiwgZ3NtbmV0LT5jb3VudHJ5X2NvZGUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBtb2JpbGUgbmV0d29yayBjb2RlICV1JXMiLCBnc21uZXQtPm5ldHdvcmtfY29kZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHNob3J0IG5hbWUgJXMlcyIsIGdzbW5ldC0+bmFtZV9zaG9ydCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGxvbmcgbmFtZSAlcyVzIiwgZ3NtbmV0LT5uYW1lX2xvbmcsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBhdXRoIHBvbGljeSAlcyVzIiwgZ3NtX2F1dGhfcG9saWN5X25hbWUoZ3NtbmV0LT5hdXRoX3BvbGljeSksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBsb2NhdGlvbiB1cGRhdGluZyByZWplY3QgY2F1c2UgJXUlcyIsCisJCWdzbW5ldC0+cmVqZWN0X2NhdXNlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgZW5jcnlwdGlvbiBhNSAldSVzIiwgZ3NtbmV0LT5hNV9lbmNyeXB0aW9uLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbmVjaSAldSVzIiwgZ3NtbmV0LT5uZWNpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgcnJscCBtb2RlICVzJXMiLCBycmxwX21vZGVfbmFtZShnc21uZXQtPnJybHAubW9kZSksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBtbSBpbmZvICV1JXMiLCBnc21uZXQtPnNlbmRfbW1faW5mbywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyICV1JXMiLCBnc21uZXQtPmhhbmRvdmVyLmFjdGl2ZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyIHdpbmRvdyByeGxldiBhdmVyYWdpbmcgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2ZywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyIHdpbmRvdyByeHF1YWwgYXZlcmFnaW5nICV1JXMiLAorCQlnc21uZXQtPmhhbmRvdmVyLndpbl9yeHF1YWxfYXZnLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgd2luZG93IHJ4bGV2IG5laWdoYm9yIGF2ZXJhZ2luZyAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnX25laWdoLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGludGVydmFsICV1JXMiLAorCQlnc21uZXQtPmhhbmRvdmVyLnB3cl9pbnRlcnZhbCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBoeXN0ZXJlc2lzICV1JXMiLAorCQlnc21uZXQtPmhhbmRvdmVyLnB3cl9oeXN0ZXJlc2lzLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgbWF4aW11bSBkaXN0YW5jZSAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci5tYXhfZGlzdGFuY2UsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzEwMSAldSVzIiwgZ3NtbmV0LT5UMzEwMSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTAzICV1JXMiLCBnc21uZXQtPlQzMTAzLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDUgJXUlcyIsIGdzbW5ldC0+VDMxMDUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzEwNyAldSVzIiwgZ3NtbmV0LT5UMzEwNywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTA5ICV1JXMiLCBnc21uZXQtPlQzMTA5LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMTEgJXUlcyIsIGdzbW5ldC0+VDMxMTEsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzExMyAldSVzIiwgZ3NtbmV0LT5UMzExMywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTE1ICV1JXMiLCBnc21uZXQtPlQzMTE1LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMTcgJXUlcyIsIGdzbW5ldC0+VDMxMTcsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzExOSAldSVzIiwgZ3NtbmV0LT5UMzExOSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTQxICV1JXMiLCBnc21uZXQtPlQzMTQxLCBWVFlfTkVXTElORSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHRyeF9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCXZ0eV9vdXQodnR5LCAiVFJYICV1IG9mIEJUUyAldSBpcyBvbiBBUkZDTiAldSVzIiwKKwkJdHJ4LT5uciwgdHJ4LT5idHMtPm5yLCB0cngtPmFyZmNuLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIFJGIE5vbWluYWwgUG93ZXI6ICVkIGRCbSwgcmVkdWNlZCBieSAldSBkQiwgIgorCQkicmVzdWx0aW5nIEJTIHBvd2VyOiAlZCBkQm0lcyIsCisJCXRyeC0+bm9taW5hbF9wb3dlciwgdHJ4LT5tYXhfcG93ZXJfcmVkLAorCQl0cngtPm5vbWluYWxfcG93ZXIgLSB0cngtPm1heF9wb3dlcl9yZWQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTk0gU3RhdGU6ICIpOworCW5ldF9kdW1wX25tc3RhdGUodnR5LCAmdHJ4LT5ubV9zdGF0ZSk7CisJdnR5X291dCh2dHksICIgIEJhc2ViYW5kIFRyYW5zY2VpdmVyIE5NIFN0YXRlOiAiKTsKKwluZXRfZHVtcF9ubXN0YXRlKHZ0eSwgJnRyeC0+YmJfdHJhbnNjLm5tX3N0YXRlKTsKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKHRyeC0+YnRzKSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgaXAuYWNjZXNzIHN0cmVhbSBJRDogMHglMDJ4JXMiLAorCQkJdHJ4LT5yc2xfdGVpLCBWVFlfTkVXTElORSk7CisJfSBlbHNlIHsKKwkJdnR5X291dCh2dHksICIgIEUxIFNpZ25hbGxpbmcgTGluazolcyIsIFZUWV9ORVdMSU5FKTsKKwkJZTFpc2xfZHVtcF92dHkodnR5LCB0cngtPnJzbF9saW5rKTsKKwl9Cit9CisKK0RFRlVOKHNob3dfdHJ4LAorICAgICAgc2hvd190cnhfY21kLAorICAgICAgInNob3cgdHJ4IFtidHNfbnJdIFt0cnhfbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIFRSWFxuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlpbnQgYnRzX25yLCB0cnhfbnI7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+PSBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJyVzJyVzIiwgYXJndlswXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCX0KKwlpZiAoYXJnYyA+PSAyKSB7CisJCXRyeF9uciA9IGF0b2koYXJndlsxXSk7CisJCWlmICh0cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgVFJYICclcyclcyIsIGFyZ3ZbMV0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCXRyeF9kdW1wX3Z0eSh2dHksIHRyeCk7CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJaWYgKGJ0cykgeworCQkvKiBwcmludCBhbGwgVFJYIGluIHRoaXMgQlRTICovCisJCWZvciAodHJ4X25yID0gMDsgdHJ4X25yIDwgYnRzLT5udW1fdHJ4OyB0cnhfbnIrKykgeworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJCXRyeF9kdW1wX3Z0eSh2dHksIHRyeCk7CisJCX0KKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKworCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWZvciAodHJ4X25yID0gMDsgdHJ4X25yIDwgYnRzLT5udW1fdHJ4OyB0cnhfbnIrKykgeworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJCXRyeF9kdW1wX3Z0eSh2dHksIHRyeCk7CisJCX0KKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIHZvaWQgdHNfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXZ0eV9vdXQodnR5LCAiVGltZXNsb3QgJXUgb2YgVFJYICV1IGluIEJUUyAldSwgcGh5cyBjZmcgJXMlcyIsCisJCXRzLT5uciwgdHMtPnRyeC0+bnIsIHRzLT50cngtPmJ0cy0+bnIsCisJCWdzbV9wY2hhbl9uYW1lKHRzLT5wY2hhbiksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTk0gU3RhdGU6ICIpOworCW5ldF9kdW1wX25tc3RhdGUodnR5LCAmdHMtPm5tX3N0YXRlKTsKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyh0cy0+dHJ4LT5idHMpKQorCQl2dHlfb3V0KHZ0eSwgIiAgRTEgTGluZSAldSwgVGltZXNsb3QgJXUsIFN1YnNsb3QgJXUlcyIsCisJCQl0cy0+ZTFfbGluay5lMV9uciwgdHMtPmUxX2xpbmsuZTFfdHMsCisJCQl0cy0+ZTFfbGluay5lMV90c19zcywgVlRZX05FV0xJTkUpOworfQorCitERUZVTihzaG93X3RzLAorICAgICAgc2hvd190c19jbWQsCisgICAgICAic2hvdyB0aW1lc2xvdCBbYnRzX25yXSBbdHJ4X25yXSBbdHNfbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIFRTXG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKwlpbnQgYnRzX25yLCB0cnhfbnIsIHRzX25yOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQkvKiB1c2UgdGhlIEJUUyBudW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkICovCisJCWJ0c19uciA9IGF0b2koYXJndlswXSk7CisJCWlmIChidHNfbnIgPj0gbmV0LT5udW1fYnRzKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgQlRTICclcyclcyIsIGFyZ3ZbMF0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMikgeworCQl0cnhfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIFRSWCAnJXMnJXMiLCBhcmd2WzFdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCX0KKwlpZiAoYXJnYyA+PSAzKSB7CisJCXRzX25yID0gYXRvaShhcmd2WzJdKTsKKwkJaWYgKHRzX25yID49IFRSWF9OUl9UUykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIFRTICclcyclcyIsIGFyZ3ZbMl0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRzID0gJnRyeC0+dHNbdHNfbnJdOworCQl0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspIHsKKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCQlmb3IgKHRyeF9uciA9IDA7IHRyeF9uciA8IGJ0cy0+bnVtX3RyeDsgdHJ4X25yKyspIHsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCQlmb3IgKHRzX25yID0gMDsgdHNfbnIgPCBUUlhfTlJfVFM7IHRzX25yKyspIHsKKwkJCQl0cyA9ICZ0cngtPnRzW3RzX25yXTsKKwkJCQl0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgc3Vic2NyX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJdnR5X291dCh2dHksICIgICAgSUQ6ICVsbHUsIEF1dGhvcml6ZWQ6ICVkJXMiLCBzdWJzY3ItPmlkLAorCQlzdWJzY3ItPmF1dGhvcml6ZWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5uYW1lKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBOYW1lOiAnJXMnJXMiLCBzdWJzY3ItPm5hbWUsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5leHRlbnNpb24pCisJCXZ0eV9vdXQodnR5LCAiICAgIEV4dGVuc2lvbjogJXMlcyIsIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChzdWJzY3ItPmltc2kpCisJCXZ0eV9vdXQodnR5LCAiICAgIElNU0k6ICVzJXMiLCBzdWJzY3ItPmltc2ksIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBUTVNJOiAlMDhYJXMiLCBzdWJzY3ItPnRtc2ksCisJCQlWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIiAgICBVc2UgY291bnQ6ICV1JXMiLCBzdWJzY3ItPnVzZV9jb3VudCwgVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBtZWFzX3JlcF9kdW1wX3VuaV92dHkoc3RydWN0IHZ0eSAqdnR5LAorCQkJCSAgc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgKm1ydSwKKwkJCQkgIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJCQkgIGNvbnN0IGNoYXIgKmRpcikKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzICBSWEwtRlVMTC0lczogJTRkIGRCbSwgUlhMLVNVQi0lczogJTRkIGRCbSAiLAorCQlwcmVmaXgsIGRpciwgcnhsZXYyZGJtKG1ydS0+ZnVsbC5yeF9sZXYpLAorCQkJZGlyLCByeGxldjJkYm0obXJ1LT5zdWIucnhfbGV2KSk7CisJdnR5X291dCh2dHksICJSWFEtRlVMTC0lczogJWQsIFJYUS1TVUItJXM6ICVkJXMiLAorCQlkaXIsIG1ydS0+ZnVsbC5yeF9xdWFsLCBkaXIsIG1ydS0+c3ViLnJ4X3F1YWwsCisJCVZUWV9ORVdMSU5FKTsKK30KKworc3RhdGljIHZvaWQgbWVhc19yZXBfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX21lYXNfcmVwICptciwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzTWVhc3VyZW1lbnQgUmVwb3J0OiVzIiwgcHJlZml4LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIlcyAgRmxhZ3M6ICVzJXMlcyVzJXMiLCBwcmVmaXgsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX1VMX0RUWCA/ICJEVFh1ICIgOiAiIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfRFRYID8gIkRUWGQgIiA6ICIiLAorCQkJbXItPmZsYWdzICYgTUVBU19SRVBfRl9GUEMgPyAiRlBDICIgOiAiIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfVkFMSUQgPyAiICIgOiAiRExpbnZhbCAiLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX01TX1RPKQorCQl2dHlfb3V0KHZ0eSwgIiVzICBNUyBUaW1pbmcgT2Zmc2V0OiAldSVzIiwgcHJlZml4LAorCQkJbXItPm1zX3RpbWluZ19vZmZzZXQsIFZUWV9ORVdMSU5FKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9NU19MMSkKKwkJdnR5X291dCh2dHksICIlcyAgTDEgTVMgUG93ZXI6ICV1IGRCbSwgVGltaW5nIEFkdmFuY2U6ICV1JXMiLAorCQkJcHJlZml4LCBtci0+bXNfbDEucHdyLCBtci0+bXNfbDEudGEsIFZUWV9ORVdMSU5FKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9ETF9WQUxJRCkKKwkJbWVhc19yZXBfZHVtcF91bmlfdnR5KHZ0eSwgJm1yLT5kbCwgcHJlZml4LCAiZGwiKTsKKwltZWFzX3JlcF9kdW1wX3VuaV92dHkodnR5LCAmbXItPnVsLCBwcmVmaXgsICJ1bCIpOworfQorCitzdGF0aWMgdm9pZCBsY2hhbl9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCWludCBpZHg7CisKKwl2dHlfb3V0KHZ0eSwgIkxjaGFuICV1IGluIFRpbWVzbG90ICV1IG9mIFRSWCAldSBpbiBCVFMgJXUsIFR5cGUgJXMlcyIsCisJCWxjaGFuLT5uciwgbGNoYW4tPnRzLT5uciwgbGNoYW4tPnRzLT50cngtPm5yLAorCQlsY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgZ3NtX2xjaGFudF9uYW1lKGxjaGFuLT50eXBlKSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBVc2UgQ291bnQ6ICV1LCBTdGF0ZTogJXMlcyIsIGxjaGFuLT5jb25uLnVzZV9jb3VudCwKKwkJZ3NtX2xjaGFuc19uYW1lKGxjaGFuLT5zdGF0ZSksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgQlMgUG93ZXI6ICV1IGRCbSwgTVMgUG93ZXI6ICV1IGRCbSVzIiwKKwkJbGNoYW4tPnRzLT50cngtPm5vbWluYWxfcG93ZXIgLSBsY2hhbi0+dHMtPnRyeC0+bWF4X3Bvd2VyX3JlZAorCQktIGxjaGFuLT5ic19wb3dlcioyLAorCQltc19wd3JfZGJtKGxjaGFuLT50cy0+dHJ4LT5idHMtPmJhbmQsIGxjaGFuLT5tc19wb3dlciksCisJCVZUWV9ORVdMSU5FKTsKKwlpZiAobGNoYW4tPmNvbm4uc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiICBTdWJzY3JpYmVyOiVzIiwgVlRZX05FV0xJTkUpOworCQlzdWJzY3JfZHVtcF92dHkodnR5LCBsY2hhbi0+Y29ubi5zdWJzY3IpOworCX0gZWxzZQorCQl2dHlfb3V0KHZ0eSwgIiAgTm8gU3Vic2NyaWJlciVzIiwgVlRZX05FV0xJTkUpOworCWlmIChpc19pcGFjY2Vzc19idHMobGNoYW4tPnRzLT50cngtPmJ0cykpIHsKKwkJc3RydWN0IGluX2FkZHIgaWE7CisJCWlhLnNfYWRkciA9IGh0b25sKGxjaGFuLT5hYmlzX2lwLmJvdW5kX2lwKTsKKwkJdnR5X291dCh2dHksICIgIEJvdW5kIElQOiAlcyBQb3J0ICV1IFJUUF9UWVBFMj0ldSBDT05OX0lEPSV1JXMiLAorCQkJaW5ldF9udG9hKGlhKSwgbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCwKKwkJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMiwgbGNoYW4tPmFiaXNfaXAuY29ubl9pZCwKKwkJCVZUWV9ORVdMSU5FKTsKKwl9CisKKwkvKiB3ZSB3YW50IHRvIHJlcG9ydCB0aGUgbGFzdCBtZWFzdXJlbWVudCByZXBvcnQgKi8KKwlpZHggPSBjYWxjX2luaXRpYWxfaWR4KEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKSwKKwkJCSAgICAgICBsY2hhbi0+bWVhc19yZXBfaWR4LCAxKTsKKwltZWFzX3JlcF9kdW1wX3Z0eSh2dHksICZsY2hhbi0+bWVhc19yZXBbaWR4XSwgIiAgIik7Cit9CisKKyNpZiAwCitUT0RPOiBjYWxscmVmIGFuZCByZW1vdGUgY2FsbHJlZiBvZiBjYWxsIG11c3QgYmUgcmVzb2x2ZWQgdG8gZ2V0IGdzbV90cmFucyBvYmplY3QKK3N0YXRpYyB2b2lkIGNhbGxfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwpCit7CisJdnR5X291dCh2dHksICJDYWxsIFR5cGUgJXUsIFN0YXRlICV1LCBUcmFuc2FjdGlvbiBJRCAldSVzIiwKKwkJY2FsbC0+dHlwZSwgY2FsbC0+c3RhdGUsIGNhbGwtPnRyYW5zYWN0aW9uX2lkLCBWVFlfTkVXTElORSk7CisKKwlpZiAoY2FsbC0+bG9jYWxfbGNoYW4pIHsKKwkJdnR5X291dCh2dHksICJDYWxsIExvY2FsIENoYW5uZWw6JXMiLCBWVFlfTkVXTElORSk7CisJCWxjaGFuX2R1bXBfdnR5KHZ0eSwgY2FsbC0+bG9jYWxfbGNoYW4pOworCX0gZWxzZQorCQl2dHlfb3V0KHZ0eSwgIkNhbGwgaGFzIG5vIExvY2FsIENoYW5uZWwlcyIsIFZUWV9ORVdMSU5FKTsKKworCWlmIChjYWxsLT5yZW1vdGVfbGNoYW4pIHsKKwkJdnR5X291dCh2dHksICJDYWxsIFJlbW90ZSBDaGFubmVsOiVzIiwgVlRZX05FV0xJTkUpOworCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGNhbGwtPnJlbW90ZV9sY2hhbik7CisJfSBlbHNlCisJCXZ0eV9vdXQodnR5LCAiQ2FsbCBoYXMgbm8gUmVtb3RlIENoYW5uZWwlcyIsIFZUWV9ORVdMSU5FKTsKKworCWlmIChjYWxsLT5jYWxsZWRfc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FsbGVkIFN1YnNjcmliZXI6JXMiLCBWVFlfTkVXTElORSk7CisJCXN1YnNjcl9kdW1wX3Z0eSh2dHksIGNhbGwtPmNhbGxlZF9zdWJzY3IpOworCX0gZWxzZQorCQl2dHlfb3V0KHZ0eSwgIkNhbGwgaGFzIG5vIENhbGxlZCBTdWJzY3JpYmVyJXMiLCBWVFlfTkVXTElORSk7Cit9CisjZW5kaWYKKworREVGVU4oc2hvd19sY2hhbiwKKyAgICAgIHNob3dfbGNoYW5fY21kLAorICAgICAgInNob3cgbGNoYW4gW2J0c19ucl0gW3RyeF9ucl0gW3RzX25yXSBbbGNoYW5fbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIGxvZ2ljYWwgY2hhbm5lbFxuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJaW50IGJ0c19uciwgdHJ4X25yLCB0c19uciwgbGNoYW5fbnI7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+PSBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJXMlcyIsIGFyZ3ZbMF0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMikgeworCQl0cnhfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIFRSWCAlcyVzIiwgYXJndlsxXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMykgeworCQl0c19uciA9IGF0b2koYXJndlsyXSk7CisJCWlmICh0c19uciA+PSBUUlhfTlJfVFMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUyAlcyVzIiwgYXJndlsyXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHMgPSAmdHJ4LT50c1t0c19ucl07CisJfQorCWlmIChhcmdjID49IDQpIHsKKwkJbGNoYW5fbnIgPSBhdG9pKGFyZ3ZbM10pOworCQlpZiAobGNoYW5fbnIgPj0gVFNfTUFYX0xDSEFOKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgTENIQU4gJXMlcyIsIGFyZ3ZbM10sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWxjaGFuID0gJnRzLT5sY2hhbltsY2hhbl9ucl07CisJCWxjaGFuX2R1bXBfdnR5KHZ0eSwgbGNoYW4pOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWZvciAodHJ4X25yID0gMDsgdHJ4X25yIDwgYnRzLT5udW1fdHJ4OyB0cnhfbnIrKykgeworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJCWZvciAodHNfbnIgPSAwOyB0c19uciA8IFRSWF9OUl9UUzsgdHNfbnIrKykgeworCQkJCXRzID0gJnRyeC0+dHNbdHNfbnJdOworCQkJCWZvciAobGNoYW5fbnIgPSAwOyBsY2hhbl9uciA8IFRTX01BWF9MQ0hBTjsKKwkJCQkgICAgIGxjaGFuX25yKyspIHsKKwkJCQkJbGNoYW4gPSAmdHMtPmxjaGFuW2xjaGFuX25yXTsKKwkJCQkJaWYgKGxjaGFuLT50eXBlID09IEdTTV9MQ0hBTl9OT05FKQorCQkJCQkJY29udGludWU7CisJCQkJCWxjaGFuX2R1bXBfdnR5KHZ0eSwgbGNoYW4pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgZTFkcnZfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcnYpCit7CisJdnR5X291dCh2dHksICJFMSBJbnB1dCBEcml2ZXIgJXMlcyIsIGRydi0+bmFtZSwgVlRZX05FV0xJTkUpOworfQorCitERUZVTihzaG93X2UxZHJ2LAorICAgICAgc2hvd19lMWRydl9jbWQsCisgICAgICAic2hvdyBlMV9kcml2ZXIiLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBFMSBkcml2ZXJzXG4iKQoreworCXN0cnVjdCBlMWlucF9kcml2ZXIgKmRydjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGRydiwgJmUxaW5wX2RyaXZlcl9saXN0LCBsaXN0KQorCQllMWRydl9kdW1wX3Z0eSh2dHksIGRydik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGUxbGluZV9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBlMWlucF9saW5lICpsaW5lKQoreworCXZ0eV9vdXQodnR5LCAiRTEgTGluZSBOdW1iZXIgJXUsIE5hbWUgJXMsIERyaXZlciAlcyVzIiwKKwkJbGluZS0+bnVtLCBsaW5lLT5uYW1lID8gbGluZS0+bmFtZSA6ICIiLAorCQlsaW5lLT5kcml2ZXItPm5hbWUsIFZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd19lMWxpbmUsCisgICAgICBzaG93X2UxbGluZV9jbWQsCisgICAgICAic2hvdyBlMV9saW5lIFtsaW5lX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBFMSBsaW5lXG4iKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQlpbnQgbnVtID0gYXRvaShhcmd2WzBdKTsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluZSwgJmUxaW5wX2xpbmVfbGlzdCwgbGlzdCkgeworCQkJaWYgKGxpbmUtPm51bSA9PSBudW0pIHsKKwkJCQllMWxpbmVfZHVtcF92dHkodnR5LCBsaW5lKTsKKwkJCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJCQl9CisJCX0KKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0JCisJCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluZSwgJmUxaW5wX2xpbmVfbGlzdCwgbGlzdCkKKwkJZTFsaW5lX2R1bXBfdnR5KHZ0eSwgbGluZSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGUxdHNfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfdHMgKnRzKQoreworCWlmICh0cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX05PTkUpCisJCXJldHVybjsKKwl2dHlfb3V0KHZ0eSwgIkUxIFRpbWVzbG90ICUydSBvZiBMaW5lICV1IGlzIFR5cGUgJXMlcyIsCisJCXRzLT5udW0sIHRzLT5saW5lLT5udW0sIGUxaW5wX3RzdHlwZV9uYW1lKHRzLT50eXBlKSwKKwkJVlRZX05FV0xJTkUpOworfQorCitERUZVTihzaG93X2UxdHMsCisgICAgICBzaG93X2UxdHNfY21kLAorICAgICAgInNob3cgZTFfdGltZXNsb3QgW2xpbmVfbnJdIFt0c19ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgRTEgdGltZXNsb3RcbiIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBOVUxMOworCXN0cnVjdCBlMWlucF90cyAqdHM7CisJaW50IHRzX25yOworCisJaWYgKGFyZ2MgPT0gMCkgeworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5lLCAmZTFpbnBfbGluZV9saXN0LCBsaXN0KSB7CisJCQlmb3IgKHRzX25yID0gMDsgdHNfbnIgPCBOVU1fRTFfVFM7IHRzX25yKyspIHsKKwkJCQl0cyA9ICZsaW5lLT50c1t0c19ucl07CisJCQkJZTF0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWlmIChhcmdjID49IDEpIHsKKwkJaW50IG51bSA9IGF0b2koYXJndlswXSk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChsaW5lLT5udW0gPT0gbnVtKQorCQkJCWJyZWFrOworCQl9CisJCWlmICghbGluZSB8fCBsaW5lLT5udW0gIT0gbnVtKSB7CisJCQl2dHlfb3V0KHZ0eSwgIkUxIGxpbmUgJXMgaXMgaW52YWxpZCVzIiwKKwkJCQlhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwl9CQorCWlmIChhcmdjID49IDIpIHsKKwkJdHNfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHNfbnIgPiBOVU1fRTFfVFMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiRTEgdGltZXNsb3QgJXMgaXMgaW52YWxpZCVzIiwKKwkJCQlhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHMgPSAmbGluZS0+dHNbdHNfbnJdOworCQllMXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkJZm9yICh0c19uciA9IDA7IHRzX25yIDwgTlVNX0UxX1RTOyB0c19ucisrKSB7CisJCQl0cyA9ICZsaW5lLT50c1t0c19ucl07CisJCQllMXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQl9CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBwYWdpbmdfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpwYWcpCit7CisJdnR5X291dCh2dHksICJQYWdpbmcgb24gQlRTICV1JXMiLCBwYWctPmJ0cy0+bnIsIFZUWV9ORVdMSU5FKTsKKwlzdWJzY3JfZHVtcF92dHkodnR5LCBwYWctPnN1YnNjcik7Cit9CisKK3N0YXRpYyB2b2lkIGJ0c19wYWdpbmdfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnBhZzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZywgJmJ0cy0+cGFnaW5nLnBlbmRpbmdfcmVxdWVzdHMsIGVudHJ5KQorCQlwYWdpbmdfZHVtcF92dHkodnR5LCBwYWcpOworfQorCitERUZVTihzaG93X3BhZ2luZywKKyAgICAgIHNob3dfcGFnaW5nX2NtZCwKKyAgICAgICJzaG93IHBhZ2luZyBbYnRzX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgcGFnaW5nIHJldXFlc3RzIG9mIGEgQlRTXG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCXN0cnVjdCBnc21fYnRzICpidHM7CisJaW50IGJ0c19ucjsKKworCWlmIChhcmdjID49IDEpIHsKKwkJLyogdXNlIHRoZSBCVFMgbnVtYmVyIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAqLworCQlidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCQlpZiAoYnRzX25yID49IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAlcyVzIiwgYXJndlswXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCQlidHNfcGFnaW5nX2R1bXBfdnR5KHZ0eSwgYnRzKTsKKwkJCisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJZm9yIChidHNfbnIgPSAwOyBidHNfbnIgPCBuZXQtPm51bV9idHM7IGJ0c19ucisrKSB7CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJYnRzX3BhZ2luZ19kdW1wX3Z0eSh2dHksIGJ0cyk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0LAorICAgICAgY2ZnX25ldF9jbWQsCisgICAgICAibmV0d29yayIsCisgICAgICAiQ29uZmlndXJlIHRoZSBHU00gbmV0d29yayIpCit7CisJdnR5LT5pbmRleCA9IGdzbW5ldDsKKwl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfbmV0X25jYywKKyAgICAgIGNmZ19uZXRfbmNjX2NtZCwKKyAgICAgICJuZXR3b3JrIGNvdW50cnkgY29kZSA8MS05OTk+IiwKKyAgICAgICJTZXQgdGhlIEdTTSBuZXR3b3JrIGNvdW50cnkgY29kZSIpCit7CisJZ3NtbmV0LT5jb3VudHJ5X2NvZGUgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X21uYywKKyAgICAgIGNmZ19uZXRfbW5jX2NtZCwKKyAgICAgICJtb2JpbGUgbmV0d29yayBjb2RlIDwxLTk5OT4iLAorICAgICAgIlNldCB0aGUgR1NNIG1vYmlsZSBuZXR3b3JrIGNvZGUiKQoreworCWdzbW5ldC0+bmV0d29ya19jb2RlID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9uYW1lX3Nob3J0LAorICAgICAgY2ZnX25ldF9uYW1lX3Nob3J0X2NtZCwKKyAgICAgICJzaG9ydCBuYW1lIE5BTUUiLAorICAgICAgIlNldCB0aGUgc2hvcnQgR1NNIG5ldHdvcmsgbmFtZSIpCit7CisJaWYgKGdzbW5ldC0+bmFtZV9zaG9ydCkKKwkJdGFsbG9jX2ZyZWUoZ3NtbmV0LT5uYW1lX3Nob3J0KTsKKworCWdzbW5ldC0+bmFtZV9zaG9ydCA9IHRhbGxvY19zdHJkdXAoZ3NtbmV0LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9uYW1lX2xvbmcsCisgICAgICBjZmdfbmV0X25hbWVfbG9uZ19jbWQsCisgICAgICAibG9uZyBuYW1lIE5BTUUiLAorICAgICAgIlNldCB0aGUgbG9uZyBHU00gbmV0d29yayBuYW1lIikKK3sKKwlpZiAoZ3NtbmV0LT5uYW1lX2xvbmcpCisJCXRhbGxvY19mcmVlKGdzbW5ldC0+bmFtZV9sb25nKTsKKworCWdzbW5ldC0+bmFtZV9sb25nID0gdGFsbG9jX3N0cmR1cChnc21uZXQsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2F1dGhfcG9saWN5LAorICAgICAgY2ZnX25ldF9hdXRoX3BvbGljeV9jbWQsCisgICAgICAiYXV0aCBwb2xpY3kgKGNsb3NlZHxhY2NlcHQtYWxsfHRva2VuKSIsCisgICAgICAiU2V0IHRoZSBHU00gbmV0d29yayBhdXRoZW50aWNhdGlvbiBwb2xpY3lcbiIpCit7CisJZW51bSBnc21fYXV0aF9wb2xpY3kgcG9saWN5ID0gZ3NtX2F1dGhfcG9saWN5X3BhcnNlKGFyZ3ZbMF0pOworCisJZ3NtbmV0LT5hdXRoX3BvbGljeSA9IHBvbGljeTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9yZWplY3RfY2F1c2UsCisgICAgICBjZmdfbmV0X3JlamVjdF9jYXVzZV9jbWQsCisgICAgICAibG9jYXRpb24gdXBkYXRpbmcgcmVqZWN0IGNhdXNlIDwyLTExMT4iLAorICAgICAgIlNldCB0aGUgcmVqZWN0IGNhdXNlIG9mIGxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdFxuIikKK3sKKwlnc21uZXQtPnJlamVjdF9jYXVzZSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfZW5jcnlwdGlvbiwKKyAgICAgIGNmZ19uZXRfZW5jcnlwdGlvbl9jbWQsCisgICAgICAiZW5jcnlwdGlvbiBhNSAoMHwxfDIpIiwKKyAgICAgICJFbmFibGUgb3IgZGlzYWJsZSBlbmNyeXB0aW9uIChBNSkgZm9yIHRoaXMgbmV0d29ya1xuIikKK3sKKwlnc21uZXQtPmE1X2VuY3J5cHRpb249IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfbmVjaSwKKyAgICAgIGNmZ19uZXRfbmVjaV9jbWQsCisgICAgICAibmVjaSAoMHwxKSIsCisgICAgICAiU2V0IGlmIE5FQ0kgb2YgY2VsbCBzZWxlY3Rpb24gaXMgdG8gYmUgc2V0IikKK3sKKwlnc21uZXQtPm5lY2kgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9ycmxwX21vZGUsIGNmZ19uZXRfcnJscF9tb2RlX2NtZCwKKyAgICAgICJycmxwIG1vZGUgKG5vbmV8bXMtYmFzZWR8bXMtcHJlZmVycmVkfGFzcy1wcmVmZXJyZWQpIiwKKwkiU2V0IHRoZSBSYWRpbyBSZXNvdXJjZSBMb2NhdGlvbiBQcm90b2NvbCBNb2RlIikKK3sKKwlnc21uZXQtPnJybHAubW9kZSA9IHJybHBfbW9kZV9wYXJzZShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9tbV9pbmZvLCBjZmdfbmV0X21tX2luZm9fY21kLAorICAgICAgIm1tIGluZm8gKDB8MSkiLAorCSJXaGV0aGVyIHRvIHNlbmQgTU0gSU5GTyBhZnRlciBMT0MgVVBEIEFDQ0VQVCIpCit7CisJZ3NtbmV0LT5zZW5kX21tX2luZm8gPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hhbmRvdmVyLCBjZmdfbmV0X2hhbmRvdmVyX2NtZCwKKyAgICAgICJoYW5kb3ZlciAoMHwxKSIsCisJIldoZXRoZXIgb3Igbm90IHRvIHVzZSBpbi1jYWxsIGhhbmRvdmVyIikKK3sKKwlpbnQgZW5hYmxlID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChlbmFibGUgJiYgaXBhY2NfcnRwX2RpcmVjdCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIENhbm5vdCBlbmFibGUgaGFuZG92ZXIgdW5sZXNzIFJUUCBQcm94eSBtb2RlICIKKwkJCSJpcyBlbmFibGVkIGJ5IHVzaW5nIHRoZSAtUCBjb21tYW5kIGxpbmUgb3B0aW9uJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWdzbW5ldC0+aGFuZG92ZXIuYWN0aXZlID0gZW5hYmxlOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmcsIGNmZ19uZXRfaG9fd2luX3J4bGV2X2F2Z19jbWQsCisgICAgICAiaGFuZG92ZXIgd2luZG93IHJ4bGV2IGF2ZXJhZ2luZyA8MS0xMD4iLAorCSJIb3cgbWFueSBSeExldiBtZWFzdXJlbWVudHMgYXJlIHVzZWQgZm9yIGF2ZXJhZ2luZyIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fd2luX3J4cXVhbF9hdmcsIGNmZ19uZXRfaG9fd2luX3J4cXVhbF9hdmdfY21kLAorICAgICAgImhhbmRvdmVyIHdpbmRvdyByeHF1YWwgYXZlcmFnaW5nIDwxLTEwPiIsCisJIkhvdyBtYW55IFJ4UXVhbCBtZWFzdXJlbWVudHMgYXJlIHVzZWQgZm9yIGF2ZXJhZ2luZyIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhxdWFsX2F2ZyA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3dpbl9yeGxldl9uZWlnaF9hdmcsIGNmZ19uZXRfaG9fd2luX3J4bGV2X2F2Z19uZWlnaF9jbWQsCisgICAgICAiaGFuZG92ZXIgd2luZG93IHJ4bGV2IG5laWdoYm9yIGF2ZXJhZ2luZyA8MS0xMD4iLAorCSJIb3cgbWFueSBSeFF1YWwgbWVhc3VyZW1lbnRzIGFyZSB1c2VkIGZvciBhdmVyYWdpbmciKQoreworCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3B3cl9pbnRlcnZhbCwgY2ZnX25ldF9ob19wd3JfaW50ZXJ2YWxfY21kLAorICAgICAgImhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBpbnRlcnZhbCA8MS05OT4iLAorCSJIb3cgb2Z0ZW4gdG8gY2hlY2sgaWYgd2UgaGF2ZSBhIGJldHRlciBjZWxsIChTQUNDSCBmcmFtZXMpIikKK3sKKwlnc21uZXQtPmhhbmRvdmVyLnB3cl9pbnRlcnZhbCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzLCBjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzX2NtZCwKKyAgICAgICJoYW5kb3ZlciBwb3dlciBidWRnZXQgaHlzdGVyZXNpcyA8MC05OTk+IiwKKwkiSG93IG1hbnkgZEIgZG9lcyBhIG5laWdoYm9yIHRvIGJlIHN0cm9uZ2VyIHRvIGJlY29tZSBhIEhPIGNhbmRpZGF0ZSIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci5wd3JfaHlzdGVyZXNpcyA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX21heF9kaXN0YW5jZSwgY2ZnX25ldF9ob19tYXhfZGlzdGFuY2VfY21kLAorICAgICAgImhhbmRvdmVyIG1heGltdW0gZGlzdGFuY2UgPDAtOTk5OT4iLAorCSJIb3cgYmlnIGlzIHRoZSBtYXhpbXVtIHRpbWluZyBhZHZhbmNlIGJlZm9yZSBITyBpcyBmb3JjZWQiKQoreworCWdzbW5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgREVDTEFSRV9USU1FUihudW1iZXIsIGRvYykgXAorICAgIERFRlVOKGNmZ19uZXRfVCMjbnVtYmVyLAkJCQkJXAorICAgICAgY2ZnX25ldF9UIyNudW1iZXIjI19jbWQsCQkJCQlcCisgICAgICAidGltZXIgdCIgI251bWJlciAgIiA8MC02NTUzNT4iLAkJCQlcCisgICAgICBkb2MpCQkJCQkJCVwKK3sJCQkJCQkJCVwKKwlpbnQgdmFsdWUgPSBhdG9pKGFyZ3ZbMF0pOwkJCQlcCisJCQkJCQkJCVwKKwlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNjU1MzUpIHsJCQlcCisJCXZ0eV9vdXQodnR5LCAiVGltZXIgdmFsdWUgJXMgb3V0IG9mIHJhbmdlLiVzIiwJXAorCQkgICAgICAgIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsJCQlcCisJCXJldHVybiBDTURfV0FSTklORzsJCQkJXAorCX0JCQkJCQkJXAorCQkJCQkJCQlcCisJZ3NtbmV0LT5UIyNudW1iZXIgPSB2YWx1ZTsJCQkJXAorCXJldHVybiBDTURfU1VDQ0VTUzsJCQkJCVwKK30KKworREVDTEFSRV9USU1FUigzMTAxLCAiU2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBJTU1FRElBVEUgQVNTSUdOTUVOVC4iKQorREVDTEFSRV9USU1FUigzMTAzLCAiU2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBIQU5ET1ZFUi4iKQorREVDTEFSRV9USU1FUigzMTA1LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMDcsICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzEwOSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTExLCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTMsICJTZXQgdGhlIHRpbWUgdG8gdHJ5IHBhZ2luZyBhIHN1YnNjcmliZXIuIikKK0RFQ0xBUkVfVElNRVIoMzExNSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTE3LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTksICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzE0MSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorCisKKy8qIHBlci1CVFMgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX2J0cywKKyAgICAgIGNmZ19idHNfY21kLAorICAgICAgImJ0cyBCVFNfTlIiLAorICAgICAgIlNlbGVjdCBhIEJUUyB0byBjb25maWd1cmVcbiIpCit7CisJaW50IGJ0c19uciA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWlmIChidHNfbnIgPiBnc21uZXQtPm51bV9idHMpIHsKKwkJdnR5X291dCh2dHksICIlJSBUaGUgbmV4dCB1bnVzZWQgQlRTIG51bWJlciBpcyAldSVzIiwKKwkJCWdzbW5ldC0+bnVtX2J0cywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfSBlbHNlIGlmIChidHNfbnIgPT0gZ3NtbmV0LT5udW1fYnRzKSB7CisJCS8qIGFsbG9jYXRlIGEgbmV3IG9uZSAqLworCQlidHMgPSBnc21fYnRzX2FsbG9jKGdzbW5ldCwgR1NNX0JUU19UWVBFX1VOS05PV04sCisJCQkJICAgIEhBUkRDT0RFRF9UU0MsIEhBUkRDT0RFRF9CU0lDKTsKKwl9IGVsc2UKKwkJYnRzID0gZ3NtX2J0c19udW0oZ3NtbmV0LCBidHNfbnIpOworCisJaWYgKCFidHMpIHsKKwkJdnR5X291dCh2dHksICIlJSBVbmFibGUgdG8gYWxsb2NhdGUgQlRTICV1JXMiLAorCQkJZ3NtbmV0LT5udW1fYnRzLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwl2dHktPmluZGV4ID0gYnRzOworCXZ0eS0+bm9kZSA9IEJUU19OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3R5cGUsCisgICAgICBjZmdfYnRzX3R5cGVfY21kLAorICAgICAgInR5cGUgVFlQRSIsCisgICAgICAiU2V0IHRoZSBCVFMgdHlwZVxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgcmM7CisKKwlyYyA9IGdzbV9zZXRfYnRzX3R5cGUoYnRzLCBwYXJzZV9idHN0eXBlKGFyZ3ZbMF0pKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfYmFuZCwKKyAgICAgIGNmZ19idHNfYmFuZF9jbWQsCisgICAgICAiYmFuZCBCQU5EIiwKKyAgICAgICJTZXQgdGhlIGZyZXF1ZW5jeSBiYW5kIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBiYW5kID0gZ3NtX2JhbmRfcGFyc2UoYXJndlswXSk7CisKKwlpZiAoYmFuZCA8IDApIHsKKwkJdnR5X291dCh2dHksICIlJSBCQU5EICVkIGlzIG5vdCBhIHZhbGlkIEdTTSBiYW5kJXMiLAorCQkJYmFuZCwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5iYW5kID0gYmFuZDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19jaSwKKyAgICAgIGNmZ19idHNfY2lfY21kLAorICAgICAgImNlbGxfaWRlbnRpdHkgPDAtNjU1MzU+IiwKKyAgICAgICJTZXQgdGhlIENlbGwgaWRlbnRpdHkgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGNpID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChjaSA8IDAgfHwgY2kgPiAweGZmZmYpIHsKKwkJdnR5X291dCh2dHksICIlJSBDSSAlZCBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlICgwLTY1NTM1KSVzIiwKKwkJCWNpLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJYnRzLT5jZWxsX2lkZW50aXR5ID0gY2k7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfbGFjLAorICAgICAgY2ZnX2J0c19sYWNfY21kLAorICAgICAgImxvY2F0aW9uX2FyZWFfY29kZSA8MC02NTUzNT4iLAorICAgICAgIlNldCB0aGUgTG9jYXRpb24gQXJlYSBDb2RlIChMQUMpIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBsYWMgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGxhYyA8IDAgfHwgbGFjID4gMHhmZmZmKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTEFDICVkIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtNjU1MzUpJXMiLAorCQkJbGFjLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAobGFjID09IEdTTV9MQUNfUkVTRVJWRURfREVUQUNIRUQgfHwgbGFjID09IEdTTV9MQUNfUkVTRVJWRURfQUxMX0JUUykgeworCQl2dHlfb3V0KHZ0eSwgIiUlIExBQyAlZCBpcyByZXNlcnZlZCBieSBHU00gMDQuMDglcyIsCisJCQlsYWMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlID0gbGFjOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfdHNjLAorICAgICAgY2ZnX2J0c190c2NfY21kLAorICAgICAgInRyYWluaW5nX3NlcXVlbmNlX2NvZGUgPDAtMjU1PiIsCisgICAgICAiU2V0IHRoZSBUcmFpbmluZyBTZXF1ZW5jZSBDb2RlIChUU0MpIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCB0c2MgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKHRzYyA8IDAgfHwgdHNjID4gMHhmZikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFRTQyAlZCBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlICgwLTI1NSklcyIsCisJCQl0c2MsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlidHMtPnRzYyA9IHRzYzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ic2ljLAorICAgICAgY2ZnX2J0c19ic2ljX2NtZCwKKyAgICAgICJiYXNlX3N0YXRpb25faWRfY29kZSA8MC02Mz4iLAorICAgICAgIlNldCB0aGUgQmFzZSBTdGF0aW9uIElkZW50aXR5IENvZGUgKEJTSUMpIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBic2ljID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChic2ljIDwgMCB8fCBic2ljID4gMHgzZikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEJTSUMgJWQgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSAoMC0yNTUpJXMiLAorCQkJYnNpYywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWJ0cy0+YnNpYyA9IGJzaWM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX2J0c191bml0X2lkLAorICAgICAgY2ZnX2J0c191bml0X2lkX2NtZCwKKyAgICAgICJpcC5hY2Nlc3MgdW5pdF9pZCA8MC02NTUzND4gPDAtMjU1PiIsCisgICAgICAiU2V0IHRoZSBpcC5hY2Nlc3MgQlRTIFVuaXQgSUQgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHNpdGVfaWQgPSBhdG9pKGFyZ3ZbMF0pOworCWludCBidHNfaWQgPSBhdG9pKGFyZ3ZbMV0pOworCisJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEJUUyBpcyBub3Qgb2YgaXAuYWNjZXNzIHR5cGUlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+aXBfYWNjZXNzLnNpdGVfaWQgPSBzaXRlX2lkOworCWJ0cy0+aXBfYWNjZXNzLmJ0c19pZCA9IGJ0c19pZDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19zdHJlYW1faWQsCisgICAgICBjZmdfYnRzX3N0cmVhbV9pZF9jbWQsCisgICAgICAib21sIGlwLmFjY2VzcyBzdHJlYW1faWQgPDAtMjU1PiIsCisgICAgICAiU2V0IHRoZSBpcC5hY2Nlc3MgU3RyZWFtIElEIG9mIHRoZSBPTUwgbGluayBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgc3RyZWFtX2lkID0gYXRvaShhcmd2WzBdKTsKKworCWlmICghaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJdnR5X291dCh2dHksICIlJSBCVFMgaXMgbm90IG9mIGlwLmFjY2VzcyB0eXBlJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPm9tbF90ZWkgPSBzdHJlYW1faWQ7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX2J0c19vbWxfZTEsCisgICAgICBjZmdfYnRzX29tbF9lMV9jbWQsCisgICAgICAib21sIGUxIGxpbmUgRTFfTElORSB0aW1lc2xvdCA8MS0zMT4gc3ViLXNsb3QgKDB8MXwyfDN8ZnVsbCkiLAorICAgICAgIkUxIGludGVyZmFjZSB0byBiZSB1c2VkIGZvciBPTUxcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlwYXJzZV9lMV9saW5rKCZidHMtPm9tbF9lMV9saW5rLCBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfYnRzX29tbF9lMV90ZWksCisgICAgICBjZmdfYnRzX29tbF9lMV90ZWlfY21kLAorICAgICAgIm9tbCBlMSB0ZWkgPDAtNjM+IiwKKyAgICAgICJTZXQgdGhlIFRFSSB0byBiZSB1c2VkIGZvciBPTUwiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5vbWxfdGVpID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19jaGFsbG9jLCBjZmdfYnRzX2NoYWxsb2NfY21kLAorICAgICAgImNoYW5uZWwgYWxsb2NhdG9yIChhc2NlbmRpbmd8ZGVzY2VuZGluZykiLAorICAgICAgIlNob3VsZCB0aGUgY2hhbm5lbCBhbGxvY2F0b3IgYWxsb2NhdGUgaW4gcmV2ZXJzZSBUUlggb3JkZXI/IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWlmICghc3RyY21wKGFyZ3ZbMF0sICJhc2NlbmRpbmciKSkKKwkJYnRzLT5jaGFuX2FsbG9jX3JldmVyc2UgPSAwOworCWVsc2UKKwkJYnRzLT5jaGFuX2FsbG9jX3JldmVyc2UgPSAxOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3JhY2hfdHhfaW50ZWdlciwKKyAgICAgIGNmZ19idHNfcmFjaF90eF9pbnRlZ2VyX2NtZCwKKyAgICAgICJyYWNoIHR4IGludGVnZXIgPDAtMTU+IiwKKyAgICAgICJTZXQgdGhlIHJhdyB0eCBpbnRlZ2VyIHZhbHVlIGluIFJBQ0ggQ29udHJvbCBwYXJhbWV0ZXJzIElFIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudHhfaW50ZWdlciA9IGF0b2koYXJndlswXSkgJiAweGY7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3JhY2hfbWF4X3RyYW5zLAorICAgICAgY2ZnX2J0c19yYWNoX21heF90cmFuc19jbWQsCisgICAgICAicmFjaCBtYXggdHJhbnNtaXNzaW9uICgxfDJ8NHw3KSIsCisgICAgICAiU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBSQUNIIGJ1cnN0IHRyYW5zbWlzc2lvbnMiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5tYXhfdHJhbnMgPSByYWNoX21heF90cmFuc192YWwycmF3KGF0b2koYXJndlswXSkpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19yYWNoX25tX2JfdGhyZXNoLAorICAgICAgY2ZnX2J0c19yYWNoX25tX2JfdGhyZXNoX2NtZCwKKyAgICAgICJyYWNoIG5tIGJ1c3kgdGhyZXNob2xkIDwwLTI1NT4iLAorICAgICAgIlNldCB0aGUgTk0gQnVzeSBUaHJlc2hvbGQgaW4gREIiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWJ0cy0+cmFjaF9iX3RocmVzaCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3JhY2hfbm1fbGRhdmcsCisgICAgICBjZmdfYnRzX3JhY2hfbm1fbGRhdmdfY21kLAorICAgICAgInJhY2ggbm0gbG9hZCBhdmVyYWdlIDwwLTY1NTM1PiIsCisgICAgICAiU2V0IHRoZSBOTSBMb2FkYXZlciBTbG90cyB2YWx1ZSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJYnRzLT5yYWNoX2xkYXZnX3Nsb3RzID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2VsbF9iYXJyZWQsIGNmZ19idHNfY2VsbF9iYXJyZWRfY21kLAorICAgICAgImNlbGwgYmFycmVkICgwfDEpIiwKKyAgICAgICJTaG91bGQgdGhpcyBjZWxsIGJlIGJhcnJlZCBmcm9tIGFjY2Vzcz8iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19tc19tYXhfcG93ZXIsIGNmZ19idHNfbXNfbWF4X3Bvd2VyX2NtZCwKKyAgICAgICJtcyBtYXggcG93ZXIgPDAtNDA+IiwKKyAgICAgICJNYXhpbXVtIHRyYW5zbWl0IHBvd2VyIG9mIHRoZSBNUyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPm1zX21heF9wb3dlciA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2VsbF9yZXNlbF9oeXN0LCBjZmdfYnRzX2NlbGxfcmVzZWxfaHlzdF9jbWQsCisgICAgICAiY2VsbCByZXNlbGVjdGlvbiBoeXN0ZXJlc2lzIDwwLTE0PiIsCisgICAgICAiQ2VsbCBSZS1TZWxlY3Rpb24gSHlzdGVyZXNpcyBpbiBkQiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0ID0gYXRvaShhcmd2WzBdKS8yOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3J4bGV2X2FjY19taW4sIGNmZ19idHNfcnhsZXZfYWNjX21pbl9jbWQsCisgICAgICAicnhsZXYgYWNjZXNzIG1pbiA8MC02Mz4iLAorICAgICAgIk1pbmltdW0gUnhMZXYgbmVlZGVkIGZvciBjZWxsIGFjY2VzcyAoYmV0dGVyIHRoYW4gLTExMGRCbSkiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4gPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3Blcl9sb2NfdXBkLCBjZmdfYnRzX3Blcl9sb2NfdXBkX2NtZCwKKyAgICAgICJwZXJpb2RpYyBsb2NhdGlvbiB1cGRhdGUgPDAtMTUzMD4iLAorICAgICAgIlBlcmlvZGljIExvY2F0aW9uIFVwZGF0aW5nIEludGVydmFsIGluIE1pbnV0ZXMiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyID0gYXRvaShhcmd2WzBdKSAvIDEwOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3Byc19idmNpLCBjZmdfYnRzX2dwcnNfYnZjaV9jbWQsCisJImdwcnMgY2VsbCBidmNpIDwyLTY1NTM1PiIsCisJIkdQUlMgQlNTR1AgVkMgSWRlbnRpZmllciIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+Z3Bycy5jZWxsLmJ2Y2kgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfbnNlaSwgY2ZnX2J0c19ncHJzX25zZWlfY21kLAorCSJncHJzIG5zZWkgPDAtNjU1MzU+IiwKKwkiR1BSUyBOUyBFbnRpdHkgSWRlbnRpZmllciIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+Z3Bycy5uc2UubnNlaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX2J0c19ncHJzX25zdmNpLCBjZmdfYnRzX2dwcnNfbnN2Y2lfY21kLAorCSJncHJzIG5zdmMgPDAtMT4gbnN2Y2kgPDAtNjU1MzU+IiwKKwkiR1BSUyBOUyBWQyBJZGVudGlmaWVyIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zdmNbaWR4XS5uc3ZjaSA9IGF0b2koYXJndlsxXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjX2xwb3J0LCBjZmdfYnRzX2dwcnNfbnN2Y19scG9ydF9jbWQsCisJImdwcnMgbnN2YyA8MC0xPiBsb2NhbCB1ZHAgcG9ydCA8MC02NTUzNT4iLAorCSJHUFJTIE5TIExvY2FsIFVEUCBQb3J0IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zdmNbaWR4XS5sb2NhbF9wb3J0ID0gYXRvaShhcmd2WzFdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ncHJzX25zdmNfcnBvcnQsIGNmZ19idHNfZ3Byc19uc3ZjX3Jwb3J0X2NtZCwKKwkiZ3BycyBuc3ZjIDwwLTE+IHJlbW90ZSB1ZHAgcG9ydCA8MC02NTUzNT4iLAorCSJHUFJTIE5TIFJlbW90ZSBVRFAgUG9ydCIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGlkeCA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+Z3Bycy5uc3ZjW2lkeF0ucmVtb3RlX3BvcnQgPSBhdG9pKGFyZ3ZbMV0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfbnN2Y19yaXAsIGNmZ19idHNfZ3Byc19uc3ZjX3JpcF9jbWQsCisJImdwcnMgbnN2YyA8MC0xPiByZW1vdGUgaXAgQS5CLkMuRCIsCisJIkdQUlMgTlMgUmVtb3RlIElQIEFkZHJlc3MiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBpZHggPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpbmV0X2F0b24oYXJndlsxXSwgJmlhKTsKKwlidHMtPmdwcnMubnN2Y1tpZHhdLnJlbW90ZV9pcCA9IG50b2hsKGlhLnNfYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19yYWMsIGNmZ19idHNfZ3Byc19yYWNfY21kLAorCSJncHJzIHJvdXRpbmcgYXJlYSA8MC0yNTU+IiwKKwkiR1BSUyBSb3V0aW5nIEFyZWEgQ29kZSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+Z3Bycy5yYWMgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfbW9kZSwgY2ZnX2J0c19ncHJzX21vZGVfY21kLAorCSJncHJzIG1vZGUgKG5vbmV8Z3Byc3xlZ3BycykiLAorCSJHUFJTIE1vZGUgZm9yIHRoaXMgQlRTIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+Z3Bycy5tb2RlID0gYnRzX2dwcnNfbW9kZV9wYXJzZShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCisvKiBwZXIgVFJYIGNvbmZpZ3VyYXRpb24gKi8KK0RFRlVOKGNmZ190cngsCisgICAgICBjZmdfdHJ4X2NtZCwKKyAgICAgICJ0cnggVFJYX05SIiwKKyAgICAgICJTZWxlY3QgYSBUUlggdG8gY29uZmlndXJlIikKK3sKKwlpbnQgdHJ4X25yID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCWlmICh0cnhfbnIgPiBidHMtPm51bV90cngpIHsKKwkJdnR5X291dCh2dHksICIlJSBUaGUgbmV4dCB1bnVzZWQgVFJYIG51bWJlciBpbiB0aGlzIEJUUyBpcyAldSVzIiwKKwkJCWJ0cy0+bnVtX3RyeCwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfSBlbHNlIGlmICh0cnhfbnIgPT0gYnRzLT5udW1fdHJ4KSB7CisJCS8qIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgb25lICovCisJCXRyeCA9IGdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisJfSBlbHNlCisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisKKwlpZiAoIXRyeCkKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJdnR5LT5pbmRleCA9IHRyeDsKKwl2dHktPm5vZGUgPSBUUlhfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9hcmZjbiwKKyAgICAgIGNmZ190cnhfYXJmY25fY21kLAorICAgICAgImFyZmNuIDwxLTEwMjQ+IiwKKyAgICAgICJTZXQgdGhlIEFSRkNOIGZvciB0aGlzIFRSWFxuIikKK3sKKwlpbnQgYXJmY24gPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCS8qIEZJWE1FOiBjaGVjayBpZiB0aGlzIEFSRkNOIGlzIHN1cHBvcnRlZCBieSB0aGlzIFRSWCAqLworCisJdHJ4LT5hcmZjbiA9IGFyZmNuOworCisJLyogRklYTUU6IHBhdGNoIEFSRkNOIGludG8gU1lTVEVNIElORk9STUFUSU9OICovCisJLyogRklYTUU6IHVzZSBPTUwgbGF5ZXIgdG8gdXBkYXRlIHRoZSBBUkZDTiAqLworCS8qIEZJWE1FOiB1c2UgUlNMIGxheWVyIHRvIHVwZGF0ZSBTWVNURU0gSU5GT1JNQVRJT04gKi8KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9ub21pbmFsX3Bvd2VyLAorICAgICAgY2ZnX3RyeF9ub21pbmFsX3Bvd2VyX2NtZCwKKyAgICAgICJub21pbmFsIHBvd2VyIDwwLTEwMD4iLAorICAgICAgIk5vbWluYWwgVFJYIFJGIFBvd2VyIGluIGRCXG4iKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCXRyeC0+bm9taW5hbF9wb3dlciA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfbWF4X3Bvd2VyX3JlZCwKKyAgICAgIGNmZ190cnhfbWF4X3Bvd2VyX3JlZF9jbWQsCisgICAgICAibWF4X3Bvd2VyX3JlZCA8MC0xMDA+IiwKKyAgICAgICJSZWR1Y3Rpb24gb2YgbWF4aW11bSBCUyBSRiBQb3dlciBpbiBkQlxuIikKK3sKKwlpbnQgbWF4cHdyX3IgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwlpbnQgdXBwZXJfbGltaXQgPSAyNDsJLyogZGVmYXVsdCAxMi4yMSBtYXggcG93ZXIgcmVkLiAqLworCisJLyogRklYTUU6IGNoZWNrIGlmIG91ciBCVFMgdHlwZSBzdXBwb3J0cyBtb3JlIHRoYW4gMTIgKi8KKwlpZiAobWF4cHdyX3IgPCAwIHx8IG1heHB3cl9yID4gdXBwZXJfbGltaXQpIHsKKwkJdnR5X291dCh2dHksICIlJSBQb3dlciAlZCBkQiBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlJXMiLAorCQkJbWF4cHdyX3IsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlpZiAobWF4cHdyX3IgJiAxKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgUG93ZXIgJWQgZEIgaXMgbm90IGFuIGV2ZW4gdmFsdWUlcyIsCisJCQltYXhwd3JfciwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdHJ4LT5tYXhfcG93ZXJfcmVkID0gbWF4cHdyX3I7CisKKwkvKiBGSVhNRTogbWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGlzIHVzaW5nIE9NTCAqLworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X3JzbF9lMSwKKyAgICAgIGNmZ190cnhfcnNsX2UxX2NtZCwKKyAgICAgICJyc2wgZTEgbGluZSBFMV9MSU5FIHRpbWVzbG90IDwxLTMxPiBzdWItc2xvdCAoMHwxfDJ8M3xmdWxsKSIsCisgICAgICAiRTEgaW50ZXJmYWNlIHRvIGJlIHVzZWQgZm9yIFJTTFxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwlwYXJzZV9lMV9saW5rKCZ0cngtPnJzbF9lMV9saW5rLCBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9yc2xfZTFfdGVpLAorICAgICAgY2ZnX3RyeF9yc2xfZTFfdGVpX2NtZCwKKyAgICAgICJyc2wgZTEgdGVpIDwwLTYzPiIsCisgICAgICAiU2V0IHRoZSBURUkgdG8gYmUgdXNlZCBmb3IgUlNMIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwl0cngtPnJzbF90ZWkgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X3JmX2xvY2tlZCwKKyAgICAgIGNmZ190cnhfcmZfbG9ja2VkX2NtZCwKKyAgICAgICJyZl9sb2NrZWQgKDB8MSkiLAorICAgICAgIlR1cm4gb2ZmIFJGIG9mIHRoZSBUUlguXG4iKQoreworCWludCBsb2NrZWQgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCWdzbV90cnhfbG9ja19yZih0cngsIGxvY2tlZCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBwZXIgVFMgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX3RzLAorICAgICAgY2ZnX3RzX2NtZCwKKyAgICAgICJ0aW1lc2xvdCA8MC03PiIsCisgICAgICAiU2VsZWN0IGEgVGltZXNsb3QgdG8gY29uZmlndXJlIikKK3sKKwlpbnQgdHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCisJaWYgKHRzX25yID49IFRSWF9OUl9UUykgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEEgR1NNIFRSWCBvbmx5IGhhcyAldSBUaW1lc2xvdHMgcGVyIFRSWCVzIiwKKwkJCVRSWF9OUl9UUywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdHMgPSAmdHJ4LT50c1t0c19ucl07CisKKwl2dHktPmluZGV4ID0gdHM7CisJdnR5LT5ub2RlID0gVFNfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RzX3BjaGFuLAorICAgICAgY2ZnX3RzX3BjaGFuX2NtZCwKKyAgICAgICJwaHlzX2NoYW5fY29uZmlnIFBDSEFOIiwKKyAgICAgICJQaHlzaWNhbCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKFRDSC9TRENDSC8uLi4pIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKKwlpbnQgcGNoYW5jOworCisJcGNoYW5jID0gZ3NtX3BjaGFuX3BhcnNlKGFyZ3ZbMF0pOworCWlmIChwY2hhbmMgPCAwKQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwl0cy0+cGNoYW4gPSBwY2hhbmM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190c19lMV9zdWJzbG90LAorICAgICAgY2ZnX3RzX2UxX3N1YnNsb3RfY21kLAorICAgICAgImUxIGxpbmUgRTFfTElORSB0aW1lc2xvdCA8MS0zMT4gc3ViLXNsb3QgKDB8MXwyfDN8ZnVsbCkiLAorICAgICAgIkUxIHN1Yi1zbG90IGNvbm5lY3RlZCB0byB0aGlzIG9uLWFpciB0aW1lc2xvdCIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisKKwlwYXJzZV9lMV9saW5rKCZ0cy0+ZTFfbGluaywgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK2V4dGVybiBpbnQgYnNjX3Z0eV9pbml0X2V4dHJhKHN0cnVjdCBnc21fbmV0d29yayAqbmV0KTsKKworaW50IGJzY192dHlfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCkKK3sKKwlnc21uZXQgPSBuZXQ7CisKKwljbWRfaW5pdCgxKTsKKwl2dHlfaW5pdCgpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfbmV0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfYnRzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfdHJ4X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfdHNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19sY2hhbl9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfZTFkcnZfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19lMWxpbmVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19lMXRzX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19wYWdpbmdfY21kKTsKKworCW9wZW5ic2NfdnR5X2FkZF9jbWRzKCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfbmV0X2NtZCk7CisJaW5zdGFsbF9ub2RlKCZuZXRfbm9kZSwgY29uZmlnX3dyaXRlX25ldCk7CisJaW5zdGFsbF9kZWZhdWx0KEdTTU5FVF9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25jY19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbW5jX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uYW1lX3Nob3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uYW1lX2xvbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2F1dGhfcG9saWN5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9yZWplY3RfY2F1c2VfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2VuY3J5cHRpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25lY2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X3JybHBfbW9kZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbW1faW5mb19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaGFuZG92ZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3dpbl9yeHF1YWxfYXZnX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnX25laWdoX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob19wd3JfaW50ZXJ2YWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob19tYXhfZGlzdGFuY2VfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTAxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwM19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMDVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTA3X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwOV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTFfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTEzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzExNV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTE5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzE0MV9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX2J0c19jbWQpOworCWluc3RhbGxfbm9kZSgmYnRzX25vZGUsIGNvbmZpZ193cml0ZV9idHMpOworCWluc3RhbGxfZGVmYXVsdChCVFNfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c190eXBlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19iYW5kX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfbGFjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c190c2NfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2JzaWNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3VuaXRfaWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3N0cmVhbV9pZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfb21sX2UxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19vbWxfZTFfdGVpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jaGFsbG9jX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yYWNoX3R4X2ludGVnZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfbWF4X3RyYW5zX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yYWNoX25tX2JfdGhyZXNoX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yYWNoX25tX2xkYXZnX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jZWxsX2JhcnJlZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfbXNfbWF4X3Bvd2VyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19wZXJfbG9jX3VwZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfY2VsbF9yZXNlbF9oeXN0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yeGxldl9hY2NfbWluX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX21vZGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfcmFjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX2J2Y2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnNlaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjX2xwb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zdmNfcnBvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnN2Y19yaXBfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ190cnhfY21kKTsKKwlpbnN0YWxsX25vZGUoJnRyeF9ub2RlLCBkdW1teV9jb25maWdfd3JpdGUpOworCWluc3RhbGxfZGVmYXVsdChUUlhfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9hcmZjbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfbm9taW5hbF9wb3dlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfbWF4X3Bvd2VyX3JlZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfcnNsX2UxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9yc2xfZTFfdGVpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9yZl9sb2NrZWRfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190c19jbWQpOworCWluc3RhbGxfbm9kZSgmdHNfbm9kZSwgZHVtbXlfY29uZmlnX3dyaXRlKTsKKwlpbnN0YWxsX2RlZmF1bHQoVFNfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFRTX05PREUsICZjZmdfdHNfcGNoYW5fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFNfTk9ERSwgJmNmZ190c19lMV9zdWJzbG90X2NtZCk7CisKKwlic2NfdnR5X2luaXRfZXh0cmEobmV0KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZV9jbWRzLmMgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2NtZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzEzNTFlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZV9jbWRzLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qIE9wZW5CU0MgbG9nZ2luZyBoZWxwZXIgZm9yIHRoZSBWVFkgKi8KKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx2dHkvYnVmZmVyLmg+CisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyB2b2lkIF92dHlfb3V0cHV0KHN0cnVjdCBsb2dfdGFyZ2V0ICp0Z3QsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisJc3RydWN0IHZ0eSAqdnR5ID0gdGd0LT50Z3RfdnR5LnZ0eTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgbGluZSk7CisJLyogVGhpcyBpcyBhbiB1Z2x5IGhhY2ssIGJ1dCB0aGVyZSBpcyBubyBlYXN5IHdheS4uLiAqLworCWlmIChzdHJjaHIobGluZSwgJ1xuJykpCisJCXZ0eV9vdXQodnR5LCAiXHIiKTsKK30KKworc3RydWN0IGxvZ190YXJnZXQgKmxvZ190YXJnZXRfY3JlYXRlX3Z0eShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldDsKKworCXRhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlKCk7CisJaWYgKCF0YXJnZXQpCisJCXJldHVybiBOVUxMOworCisJdGFyZ2V0LT50Z3RfdnR5LnZ0eSA9IHZ0eTsKKwl0YXJnZXQtPm91dHB1dCA9IF92dHlfb3V0cHV0OworCXJldHVybiB0YXJnZXQ7Cit9CisKK0RFRlVOKGVuYWJsZV9sb2dnaW5nLAorICAgICAgZW5hYmxlX2xvZ2dpbmdfY21kLAorICAgICAgImxvZ2dpbmcgZW5hYmxlIiwKKyAgICAgICJFbmFibGVzIGxvZ2dpbmcgdG8gdGhpcyB2dHlcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmIChjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIGFscmVhZHkgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWNvbm4tPmRiZyA9IGxvZ190YXJnZXRfY3JlYXRlX3Z0eSh2dHkpOworCWlmICghY29ubi0+ZGJnKQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwlsb2dfYWRkX3RhcmdldChjb25uLT5kYmcpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19mbHRyX2ltc2ksCisgICAgICBsb2dnaW5nX2ZsdHJfaW1zaV9jbWQsCisgICAgICAibG9nZ2luZyBmaWx0ZXIgaW1zaSBJTVNJIiwKKyAgICAgICJQcmludCBhbGwgbWVzc2FnZXMgcmVsYXRlZCB0byBhIElNU0lcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfc2V0X2ltc2lfZmlsdGVyKGNvbm4tPmRiZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX2ZsdHJfYWxsLAorICAgICAgbG9nZ2luZ19mbHRyX2FsbF9jbWQsCisgICAgICAibG9nZ2luZyBmaWx0ZXIgYWxsIDwwLTE+IiwKKyAgICAgICJQcmludCBhbGwgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGVcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfc2V0X2FsbF9maWx0ZXIoY29ubi0+ZGJnLCBhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfdXNlX2NsciwKKyAgICAgIGxvZ2dpbmdfdXNlX2Nscl9jbWQsCisgICAgICAibG9nZ2luZyBjb2xvciA8MC0xPiIsCisgICAgICAiVXNlIGNvbG9yIGZvciBwcmludGluZyBtZXNzYWdlc1xuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWxvZ19zZXRfdXNlX2NvbG9yKGNvbm4tPmRiZywgYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX3BybnRfdGltZXN0YW1wLAorICAgICAgbG9nZ2luZ19wcm50X3RpbWVzdGFtcF9jbWQsCisgICAgICAibG9nZ2luZyB0aW1lc3RhbXAgPDAtMT4iLAorICAgICAgIlByaW50IHRoZSB0aW1lc3RhbXAgb2YgZWFjaCBtZXNzYWdlXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJbG9nX3NldF9wcmludF90aW1lc3RhbXAoY29ubi0+ZGJnLCBhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIEZJWE1FOiB0aG9zZSBoYXZlIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBsb2cgbGV2ZWxzIGFuZCBjYXRlZ29yaWVzICovCisjZGVmaW5lIFZUWV9ERUJVR19DQVRFR09SSUVTICIocmxsfGNjfG1tfHJyfHJzbHxubXxzbXN8cGFnfG1uY2N8aW5wfG1pfG1pYnxtdXh8bWVhc3xzY2NwfG1zY3xtZ2NwfGhvfGRifHJlZikiCisjZGVmaW5lIFZUWV9ERUJVR19MRVZFTFMgIihldmVyeXRoaW5nfGRlYnVnfGluZm98bm90aWNlfGVycm9yfGZhdGFsKSIKK0RFRlVOKGxvZ2dpbmdfbGV2ZWwsCisgICAgICBsb2dnaW5nX2xldmVsX2NtZCwKKyAgICAgICJsb2dnaW5nIGxldmVsICIgVlRZX0RFQlVHX0NBVEVHT1JJRVMgIiAiIFZUWV9ERUJVR19MRVZFTFMsCisgICAgICAiU2V0IHRoZSBsb2cgbGV2ZWwgZm9yIGEgc3BlY2lmaWVkIGNhdGVnb3J5XG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKwlpbnQgY2F0ZWdvcnkgPSBsb2dfcGFyc2VfY2F0ZWdvcnkoYXJndlswXSk7CisJaW50IGxldmVsID0gbG9nX3BhcnNlX2xldmVsKGFyZ3ZbMV0pOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoY2F0ZWdvcnkgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiSW52YWxpZCBjYXRlZ29yeSBgJXMnJXMiLCBhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAobGV2ZWwgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiSW52YWxpZCBsZXZlbCBgJXMnJXMiLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwljb25uLT5kYmctPmNhdGVnb3JpZXNbY2F0ZWdvcnldLmVuYWJsZWQgPSAxOworCWNvbm4tPmRiZy0+Y2F0ZWdvcmllc1tjYXRlZ29yeV0ubG9nbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19zZXRfY2F0ZWdvcnlfbWFzaywKKyAgICAgIGxvZ2dpbmdfc2V0X2NhdGVnb3J5X21hc2tfY21kLAorICAgICAgImxvZ2dpbmcgc2V0IGxvZyBtYXNrIE1BU0siLAorICAgICAgIkRlY2lkZSB3aGljaCBjYXRlZ29yaWVzIHRvIG91dHB1dC5cbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfcGFyc2VfY2F0ZWdvcnlfbWFzayhjb25uLT5kYmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19zZXRfbG9nX2xldmVsLAorICAgICAgbG9nZ2luZ19zZXRfbG9nX2xldmVsX2NtZCwKKyAgICAgICJsb2dnaW5nIHNldCBsb2cgbGV2ZWwgPDAtOD4iLAorICAgICAgIlNldCB0aGUgZ2xvYmFsIGxvZyBsZXZlbC4gVGhlIHZhbHVlIDAgaW1wbGllcyBubyBmaWx0ZXJpbmcuXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJbG9nX3NldF9sb2dfbGV2ZWwoY29ubi0+ZGJnLCBhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGRpYWJsZV9sb2dnaW5nLAorICAgICAgZGlzYWJsZV9sb2dnaW5nX2NtZCwKKyAgICAgICJsb2dnaW5nIGRpc2FibGUiLAorICAgICAgIkRpc2FibGVzIGxvZ2dpbmcgdG8gdGhpcyB2dHlcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfZGVsX3RhcmdldChjb25uLT5kYmcpOworCXRhbGxvY19mcmVlKGNvbm4tPmRiZyk7CisJY29ubi0+ZGJnID0gTlVMTDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3ZvaWQgb3BlbmJzY192dHlfcHJpbnRfc3RhdGlzdGljcyhzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCXZ0eV9vdXQodnR5LCAiQ2hhbm5lbCBSZXF1ZXN0cyAgICAgICAgOiAlbHUgdG90YWwsICVsdSBubyBjaGFubmVsJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmNocmVxLnRvdGFsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5jaHJlcS5ub19jaGFubmVsKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiQ2hhbm5lbCBGYWlsdXJlcyAgICAgICAgOiAlbHUgcmZfZmFpbHVyZXMsICVsdSBybGwgZmFpbHVyZXMlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuY2hhbi5yZl9mYWlsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5jaGFuLnJsbF9lcnIpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJQYWdpbmcgICAgICAgICAgICAgICAgICA6ICVsdSBhdHRlbXB0ZWQsICVsdSBjb21wbGV0ZSwgJWx1IGV4cGlyZWQlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmF0dGVtcHRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmNvbXBsZXRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmV4cGlyZWQpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJCVFMgZmFpbHVyZXMgICAgICAgICAgICA6ICVsdSBPTUwsICVsdSBSU0wlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuYnRzLm9tbF9mYWlsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5idHMucnNsX2ZhaWwpLCBWVFlfTkVXTElORSk7Cit9CisKK3ZvaWQgb3BlbmJzY192dHlfYWRkX2NtZHMoKQoreworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZlbmFibGVfbG9nZ2luZ19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZkaXNhYmxlX2xvZ2dpbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19mbHRyX2ltc2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19mbHRyX2FsbF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZsb2dnaW5nX3VzZV9jbHJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19wcm50X3RpbWVzdGFtcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZsb2dnaW5nX3NldF9jYXRlZ29yeV9tYXNrX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfbGV2ZWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19zZXRfbG9nX2xldmVsX2NtZCk7CisKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfbGF5ZXIzLmMgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2xheWVyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTViYWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2xheWVyMy5jCkBAIC0wLDAgKzEsNTY4IEBACisvKiBPcGVuQlNDIGludGVyZmFjZSB0byBxdWFnZ2EgVlRZICovCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWxlbnRfY2FsbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Z0eS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQ7CisKK3N0cnVjdCBjbWRfbm9kZSBzdWJzY3Jfbm9kZSA9IHsKKwlTVUJTQ1JfTk9ERSwKKwkiJXMoc3Vic2NyaWJlcikjIiwKKwkxLAorfTsKKworc3RhdGljIGludCBkdW1teV9jb25maWdfd3JpdGUoc3RydWN0IHZ0eSAqdikKK3sKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyICphcmd2X3RvX2J1ZmZlcihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdLCBpbnQgYmFzZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyICpiID0gYnVmZmVyX25ldyhOVUxMLCAxMDI0KTsKKwlpbnQgaTsKKworCWlmICghYikKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSBiYXNlOyBpIDwgYXJnYzsgaSsrKSB7CisJCWJ1ZmZlcl9wdXRzdHIoYiwgYXJndltpXSk7CisJCWJ1ZmZlcl9wdXRjKGIsICcgJyk7CisJfQorCWJ1ZmZlcl9wdXRjKGIsICdcMCcpOworCisJcmV0dXJuIGI7Cit9CisKK3N0YXRpYyBpbnQgaGV4cGFyc2UoY29uc3QgY2hhciAqc3RyLCB1X2ludDhfdCAqYiwgaW50IG1heF9sZW4pCisKK3sKKwlpbnQgaSwgbCwgdjsKKworCWwgPSBzdHJsZW4oc3RyKTsKKwlpZiAoKGwmMSkgfHwgKChsPj4xKSA+IG1heF9sZW4pKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoYiwgMHgwMCwgbWF4X2xlbik7CisKKwlmb3IgKGk9MDsgaTxsOyBpKyspIHsKKwkJY2hhciBjID0gc3RyW2ldOworCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJCQl2ID0gYyAtICcwJzsKKwkJZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJCQl2ID0gMTAgKyAoYyAtICdhJyk7CisJCWVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorCQkJdiA9IDEwICsgKGMgLSAnYScpOworCQllbHNlCisJCQlyZXR1cm4gLTE7CisJCWJbaT4+MV0gfD0gdiA8PCAoaSYxID8gMCA6IDQpOworCX0KKworCXJldHVybiBpPj4xOworfQorCisvKiBwZXItc3Vic2NyaWJlciBjb25maWd1cmF0aW9uICovCitERUZVTihjZmdfc3Vic2NyLAorICAgICAgY2ZnX3N1YnNjcl9jbWQsCisgICAgICAic3Vic2NyaWJlciBJTVNJIiwKKyAgICAgICJTZWxlY3QgYSBTdWJzY3JpYmVyIHRvIGNvbmZpZ3VyZVxuIikKK3sKKwljb25zdCBjaGFyICppbXNpID0gYXJndlswXTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShnc21uZXQsIGltc2kpOworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3IgSU1TSSAlcyVzIiwKKwkJCWltc2ksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIHZ0eV9nb19wYXJlbnQgc2hvdWxkIHB1dCB0aGlzIHN1YnNjcmliZXIgKi8KKwl2dHktPmluZGV4ID0gc3Vic2NyOworCXZ0eS0+bm9kZSA9IFNVQlNDUl9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzdWJzY3JfZHVtcF9mdWxsX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgYXR1cGxlOworCisJdnR5X291dCh2dHksICIgICAgSUQ6ICVsbHUsIEF1dGhvcml6ZWQ6ICVkJXMiLCBzdWJzY3ItPmlkLAorCQlzdWJzY3ItPmF1dGhvcml6ZWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5uYW1lKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBOYW1lOiAnJXMnJXMiLCBzdWJzY3ItPm5hbWUsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5leHRlbnNpb24pCisJCXZ0eV9vdXQodnR5LCAiICAgIEV4dGVuc2lvbjogJXMlcyIsIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChzdWJzY3ItPmltc2kpCisJCXZ0eV9vdXQodnR5LCAiICAgIElNU0k6ICVzJXMiLCBzdWJzY3ItPmltc2ksIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBUTVNJOiAlMDhYJXMiLCBzdWJzY3ItPnRtc2ksCisJCQlWVFlfTkVXTElORSk7CisKKwlyYyA9IGdldF9hdXRoaW5mb19ieV9zdWJzY3IoJmFpbmZvLCBzdWJzY3IpOworCWlmICghcmMpIHsKKwkJdnR5X291dCh2dHksICIgICAgQTNBOCBhbGdvcml0aG0gaWQ6ICVkJXMiLAorCQkJYWluZm8uYXV0aF9hbGdvLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgIEEzQTggS2k6ICVzJXMiLAorCQkJaGV4ZHVtcChhaW5mby5hM2E4X2tpLCBhaW5mby5hM2E4X2tpX2xlbiksCisJCQlWVFlfTkVXTElORSk7CisJfQorCisJcmMgPSBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcigmYXR1cGxlLCBzdWJzY3IpOworCWlmICghcmMpIHsKKwkJdnR5X291dCh2dHksICIgICAgQTNBOCBsYXN0IHR1cGxlICh1c2VkICVkIHRpbWVzKTolcyIsCisJCQlhdHVwbGUudXNlX2NvdW50LCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgICBzZXEgIyA6ICVkJXMiLAorCQkJYXR1cGxlLmtleV9zZXEsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIFJBTkQgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5yYW5kLCBzaXplb2YoYXR1cGxlLnJhbmQpKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIFNSRVMgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5zcmVzLCBzaXplb2YoYXR1cGxlLnNyZXMpKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIEtjICAgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5rYywgc2l6ZW9mKGF0dXBsZS5rYykpLAorCQkJVlRZX05FV0xJTkUpOworCX0KKworCXZ0eV9vdXQodnR5LCAiICAgIFVzZSBjb3VudDogJXUlcyIsIHN1YnNjci0+dXNlX2NvdW50LCBWVFlfTkVXTElORSk7Cit9CisKKworLyogU3Vic2NyaWJlciAqLworREVGVU4oc2hvd19zdWJzY3IsCisgICAgICBzaG93X3N1YnNjcl9jbWQsCisgICAgICAic2hvdyBzdWJzY3JpYmVyIFtJTVNJXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBzdWJzY3JpYmVyXG4iKQoreworCWNvbnN0IGNoYXIgKmltc2k7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCWltc2kgPSBhcmd2WzBdOworCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2koZ3NtbmV0LCBpbXNpKTsKKwkJaWYgKCFzdWJzY3IpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgdW5rbm93biBzdWJzY3JpYmVyJXMiLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlzdWJzY3JfZHVtcF9mdWxsX3Z0eSh2dHksIHN1YnNjcik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCisJLyogRklYTUU6IGl0ZXJhdGUgb3ZlciBhbGwgc3Vic2NyaWJlcnMgPyAqLworCXJldHVybiBDTURfV0FSTklORzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19zdWJzY3JfY2FjaGUsCisgICAgICBzaG93X3N1YnNjcl9jYWNoZV9jbWQsCisgICAgICAic2hvdyBzdWJzY3JpYmVyIGNhY2hlIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBjb250ZW50cyBvZiBzdWJzY3JpYmVyIGNhY2hlXG4iKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic2NyLCAmYWN0aXZlX3N1YnNjcmliZXJzLCBlbnRyeSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgU3Vic2NyaWJlcjolcyIsIFZUWV9ORVdMSU5FKTsKKwkJc3Vic2NyX2R1bXBfZnVsbF92dHkodnR5LCBzdWJzY3IpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc21zX3NlbmRfcGVuZCwKKyAgICAgIHNtc19zZW5kX3BlbmRfY21kLAorICAgICAgInNtcyBzZW5kIHBlbmRpbmciLAorICAgICAgIlNlbmQgYWxsIHBlbmRpbmcgU01TIikKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCWludCBpZCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9ieV9zdWJzY3IoZ3NtbmV0LCBpZCk7CisJCWlmICghc21zKQorCQkJYnJlYWs7CisKKwkJZ3NtNDExX3NlbmRfc21zX3N1YnNjcihzbXMtPnJlY2VpdmVyLCBzbXMpOworCisJCWlkID0gc21zLT5yZWNlaXZlci0+aWQgKyAxOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RydWN0IGdzbV9zbXMgKnNtc19mcm9tX3RleHQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlciwgY29uc3QgY2hhciAqdGV4dCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gc21zX2FsbG9jKCk7CisKKwlpZiAoIXNtcykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXJlY2VpdmVyLT5sYWMpIHsKKwkJLyogc3Vic2NyaWJlciBjdXJyZW50bHkgbm90IGF0dGFjaGVkLCBzdG9yZSBpbiBkYXRhYmFzZT8gKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21zLT5yZWNlaXZlciA9IHN1YnNjcl9nZXQocmVjZWl2ZXIpOworCXN0cm5jcHkoc21zLT50ZXh0LCB0ZXh0LCBzaXplb2Yoc21zLT50ZXh0KS0xKTsKKworCS8qIEZJWE1FOiBkb24ndCB1c2UgSUQgMSBzdGF0aWMgKi8KKwlzbXMtPnNlbmRlciA9IHN1YnNjcl9nZXRfYnlfaWQoZ3NtbmV0LCAxKTsKKwlzbXMtPnJlcGx5X3BhdGhfcmVxID0gMDsKKwlzbXMtPnN0YXR1c19yZXBfcmVxID0gMDsKKwlzbXMtPnVkX2hkcl9pbmQgPSAwOworCXNtcy0+cHJvdG9jb2xfaWQgPSAwOyAvKiBpbXBsaWNpdCAqLworCXNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lID0gMDsgLyogZGVmYXVsdCA3Yml0ICovCisJc3RybmNweShzbXMtPmRlc3RfYWRkciwgcmVjZWl2ZXItPmV4dGVuc2lvbiwgc2l6ZW9mKHNtcy0+ZGVzdF9hZGRyKS0xKTsKKwkvKiBHZW5lcmF0ZSB1c2VyX2RhdGEgKi8KKwlzbXMtPnVzZXJfZGF0YV9sZW4gPSBnc21fN2JpdF9lbmNvZGUoc21zLT51c2VyX2RhdGEsIHNtcy0+dGV4dCk7CisKKwlyZXR1cm4gc21zOworfQorCitzdGF0aWMgaW50IF9zZW5kX3Ntc19idWZmZXIoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlciwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlciAqYiwgdV9pbnQ4X3QgdHBfcGlkKQoreworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlzbXMgPSBzbXNfZnJvbV90ZXh0KHJlY2VpdmVyLCBidWZmZXJfZ2V0c3RyKGIpKTsKKwlzbXMtPnByb3RvY29sX2lkID0gdHBfcGlkOworCWdzbTQxMV9zZW5kX3Ntc19zdWJzY3IocmVjZWl2ZXIsIHNtcyk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmdldF9zdWJzY3JfYnlfYXJndihjb25zdCBjaGFyICp0eXBlLAorCQkJCQkJIGNvbnN0IGNoYXIgKmlkKQoreworCWlmICghc3RyY21wKHR5cGUsICJleHRlbnNpb24iKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfZXh0ZW5zaW9uKGdzbW5ldCwgaWQpOworCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgImltc2kiKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfaW1zaShnc21uZXQsIGlkKTsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsICJ0bXNpIikpCisJCXJldHVybiBzdWJzY3JfZ2V0X2J5X3Rtc2koZ3NtbmV0LCBhdG9pKGlkKSk7CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiaWQiKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfaWQoZ3NtbmV0LCBhdG9pKGlkKSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKyNkZWZpbmUgU1VCU0NSX1RZUEVTICIoZXh0ZW5zaW9ufGltc2l8dG1zaXxpZCkiCisKK0RFRlVOKHN1YnNjcmliZXJfc2VuZF9zbXMsCisgICAgICBzdWJzY3JpYmVyX3NlbmRfc21zX2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc21zIHNlbmQgLkxJTkUiLAorICAgICAgIlNlbGVjdCBzdWJzY3JpYmVyIGJhc2VkIG9uIGV4dGVuc2lvbiIpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBnZXRfc3Vic2NyX2J5X2FyZ3YoYXJndlswXSwgYXJndlsxXSk7CisJc3RydWN0IGJ1ZmZlciAqYjsKKwlpbnQgcmM7CisKKwlpZiAoIXN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm91bmQgZm9yICVzICVzJXMiLAorCQkJYXJndlswXSwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWIgPSBhcmd2X3RvX2J1ZmZlcihhcmdjLCBhcmd2LCAyKTsKKwlyYyA9IF9zZW5kX3Ntc19idWZmZXIoc3Vic2NyLCBiLCAwKTsKKwlidWZmZXJfZnJlZShiKTsKKworCXN1YnNjcl9wdXQoc3Vic2NyKTsKKworCXJldHVybiByYzsKK30KKworREVGVU4oc3Vic2NyaWJlcl9zaWxlbnRfc21zLAorICAgICAgc3Vic2NyaWJlcl9zaWxlbnRfc21zX2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc2lsZW50IHNtcyBzZW5kIC5MSU5FIiwKKyAgICAgICJTZWxlY3Qgc3Vic2NyaWJlciBiYXNlZCBvbiBleHRlbnNpb24iKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCXN0cnVjdCBidWZmZXIgKmI7CisJaW50IHJjOworCisJaWYgKCFzdWJzY3IpIHsKKwkJdnR5X291dCh2dHksICIlJSBObyBzdWJzY3JpYmVyIGZvdW5kIGZvciAlcyAlcyVzIiwKKwkJCWFyZ3ZbMF0sIGFyZ3ZbMV0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWIgPSBhcmd2X3RvX2J1ZmZlcihhcmdjLCBhcmd2LCAyKTsKKwlyYyA9IF9zZW5kX3Ntc19idWZmZXIoc3Vic2NyLCBiLCA2NCk7CisJYnVmZmVyX2ZyZWUoYik7CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gcmM7Cit9CisKK0RFRlVOKHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RhcnQsCisgICAgICBzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0YXJ0X2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc2lsZW50IGNhbGwgc3RhcnQgKGFueXx0Y2gvZnx0Y2gvYW55fHNkY2NoKSIsCisgICAgICAiU3RhcnQgYSBzaWxlbnQgY2FsbCB0byBhIHN1YnNjcmliZXIiKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWludCByYywgdHlwZTsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoIXN0cmNtcChhcmd2WzJdLCAidGNoL2YiKSkKKwkJdHlwZSA9IFJTTF9DSEFOTkVFRF9UQ0hfRjsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0Y2gvYW55IikpCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfVENIX0Zvckg7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAic2RjY2giKSkKKwkJdHlwZSA9IFJTTF9DSEFOTkVFRF9TRENDSDsKKwllbHNlCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfQU5ZOwkvKiBEZWZhdWx0cyB0byBBTlkgKi8KKworCXJjID0gZ3NtX3NpbGVudF9jYWxsX3N0YXJ0KHN1YnNjciwgdnR5LCB0eXBlKTsKKwlpZiAocmMgPD0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFN1YnNjcmliZXIgbm90IGF0dGFjaGVkJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcCwKKyAgICAgIHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcF9jbWQsCisgICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIEVYVEVOIHNpbGVudCBjYWxsIHN0b3AiLAorICAgICAgIlN0b3AgYSBzaWxlbnQgY2FsbCB0byBhIHN1YnNjcmliZXIiKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWludCByYzsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlyYyA9IGdzbV9zaWxlbnRfY2FsbF9zdG9wKHN1YnNjcik7CisJaWYgKHJjIDwgMCkgeworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zdWJzY3JfbmFtZSwKKyAgICAgIGNmZ19zdWJzY3JfbmFtZV9jbWQsCisgICAgICAibmFtZSBOQU1FIiwKKyAgICAgICJTZXQgdGhlIG5hbWUgb2YgdGhlIHN1YnNjcmliZXIiKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2WzBdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCXN0cm5jcHkoc3Vic2NyLT5uYW1lLCBuYW1lLCBzaXplb2Yoc3Vic2NyLT5uYW1lKSk7CisKKwlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3N1YnNjcl9leHRlbnNpb24sCisgICAgICBjZmdfc3Vic2NyX2V4dGVuc2lvbl9jbWQsCisgICAgICAiZXh0ZW5zaW9uIEVYVEVOU0lPTiIsCisgICAgICAiU2V0IHRoZSBleHRlbnNpb24gb2YgdGhlIHN1YnNjcmliZXIiKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2WzBdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCXN0cm5jcHkoc3Vic2NyLT5leHRlbnNpb24sIG5hbWUsIHNpemVvZihzdWJzY3ItPmV4dGVuc2lvbikpOworCisJZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zdWJzY3JfYXV0aG9yaXplZCwKKyAgICAgIGNmZ19zdWJzY3JfYXV0aG9yaXplZF9jbWQsCisgICAgICAiYXV0aCA8MC0xPiIsCisgICAgICAiU2V0IHRoZSBhdXRob3JpemF0aW9uIHN0YXR1cyBvZiB0aGUgc3Vic2NyaWJlciIpCit7CisJaW50IGF1dGggPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCWlmIChhdXRoKQorCQlzdWJzY3ItPmF1dGhvcml6ZWQgPSAxOworCWVsc2UKKwkJc3Vic2NyLT5hdXRob3JpemVkID0gMDsKKworCWRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3IpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIEEzQThfQUxHX1RZUEVTICIobm9uZXxjb21wMTI4djEpIgorCitERUZVTihjZmdfc3Vic2NyX2EzYTgsCisgICAgICBjZmdfc3Vic2NyX2EzYThfY21kLAorICAgICAgImEzYTggIiBBM0E4X0FMR19UWVBFUyAiIFtLSV0iLAorICAgICAgIlNldCBhM2E4IHBhcmFtZXRlcnMgZm9yIHRoZSBzdWJzY3JpYmVyIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHZ0eS0+aW5kZXg7CisJY29uc3QgY2hhciAqYWxnX3N0ciA9IGFyZ3ZbMF07CisJY29uc3QgY2hhciAqa2lfc3RyID0gYXJndlsxXTsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlpbnQgcmM7CisKKwlpZiAoIXN0cmNhc2VjbXAoYWxnX3N0ciwgIm5vbmUiKSkgeworCQkvKiBKdXN0IGVyYXNlICovCisJCXJjID0gc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3IoTlVMTCwgc3Vic2NyKTsKKwl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFsZ19zdHIsICJjb21wMTI4djEiKSkgeworCQkvKiBQYXJzZSBoZXggc3RyaW5nIEtpICovCisJCXJjID0gaGV4cGFyc2Uoa2lfc3RyLCBhaW5mby5hM2E4X2tpLCBzaXplb2YoYWluZm8uYTNhOF9raSkpOworCQlpZiAocmMgIT0gMTYpCisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwkJLyogU2V0IHRoZSBpbmZvcyAqLworCQlhaW5mby5hdXRoX2FsZ28gPSBBVVRIX0FMR09fQ09NUDEyOHYxOworCQlhaW5mby5hM2E4X2tpX2xlbiA9IHJjOworCQlyYyA9IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKCZhaW5mbywgc3Vic2NyKTsKKwl9IGVsc2UgeworCQkvKiBVbmtub3duIG1ldGhvZCAqLworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJcmV0dXJuIHJjID8gQ01EX1dBUk5JTkcgOiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzY2FsbF9jYmZuKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQl2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSAqc2lnZGF0YSA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCB2dHkgKnZ0eSA9IHNpZ2RhdGEtPmRhdGE7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19TQ0FMTF9TVUNDRVNTOgorCQl2dHlfb3V0KHZ0eSwgIiUlIHNpbGVudCBjYWxsIG9uIEFSRkNOICV1IHRpbWVzbG90ICV1JXMiLAorCQkJc2lnZGF0YS0+bGNoYW4tPnRzLT50cngtPmFyZmNuLCBzaWdkYXRhLT5sY2hhbi0+dHMtPm5yLAorCQkJVlRZX05FV0xJTkUpOworCQlicmVhazsKKwljYXNlIFNfU0NBTExfRVhQSVJFRDoKKwkJdnR5X291dCh2dHksICIlJSBzaWxlbnQgY2FsbCBleHBpcmVkIHBhZ2luZyVzIiwgVlRZX05FV0xJTkUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0RFRlVOKHNob3dfc3RhdHMsCisgICAgICBzaG93X3N0YXRzX2NtZCwKKyAgICAgICJzaG93IHN0YXRpc3RpY3MiLAorCVNIT1dfU1RSICJEaXNwbGF5IG5ldHdvcmsgc3RhdGlzdGljc1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKworCW9wZW5ic2NfdnR5X3ByaW50X3N0YXRpc3RpY3ModnR5LCBuZXQpOworCXZ0eV9vdXQodnR5LCAiTG9jYXRpb24gVXBkYXRlICAgICAgICAgOiAlbHUgYXR0YWNoLCAlbHUgbm9ybWFsLCAlbHUgcGVyaW9kaWMlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF90eXBlLmF0dGFjaCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF90eXBlLm5vcm1hbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF90eXBlLnBlcmlvZGljKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiSU1TSSBEZXRhY2ggSW5kaWNhdGlvbnMgOiAlbHUlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMubG9jX3VwZF90eXBlLmRldGFjaCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkxvY2F0aW9uIFVwZGF0ZSBSZXNwb25zZTogJWx1IGFjY2VwdCwgJWx1IHJlamVjdCVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3Jlc3AuYWNjZXB0KSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3Jlc3AucmVqZWN0KSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiSGFuZG92ZXIgICAgICAgICAgICAgICAgOiAlbHUgYXR0ZW1wdGVkLCAlbHUgbm9fY2hhbm5lbCwgJWx1IHRpbWVvdXQsICIKKwkJIiVsdSBjb21wbGV0ZWQsICVsdSBmYWlsZWQlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIuYXR0ZW1wdGVkKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5ub19jaGFubmVsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci50aW1lb3V0KSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5jb21wbGV0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLmZhaWxlZCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlNNUyBNTyAgICAgICAgICAgICAgICAgIDogJWx1IHN1Ym1pdHRlZCwgJWx1IG5vIHJlY2VpdmVyJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5zdWJtaXR0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5ub19yZWNlaXZlciksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlNNUyBNVCAgICAgICAgICAgICAgICAgIDogJWx1IGRlbGl2ZXJlZCwgJWx1IG5vIG1lbW9yeSwgJWx1IG90aGVyIGVycm9yJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5kZWxpdmVyZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5ycF9lcnJfbWVtKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5zbXMucnBfZXJyX290aGVyKSwgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitpbnQgYnNjX3Z0eV9pbml0X2V4dHJhKHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCWdzbW5ldCA9IG5ldDsKKworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NDQUxMLCBzY2FsbF9jYmZuLCBOVUxMKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3N1YnNjcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3N1YnNjcl9jYWNoZV9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNtc19zZW5kX3BlbmRfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzdWJzY3JpYmVyX3NlbmRfc21zX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnN1YnNjcmliZXJfc2lsZW50X3Ntc19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0YXJ0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3N0YXRzX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfc3Vic2NyX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZzdWJzY3Jfbm9kZSwgZHVtbXlfY29uZmlnX3dyaXRlKTsKKworCWluc3RhbGxfZGVmYXVsdChTVUJTQ1JfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9uYW1lX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9leHRlbnNpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoU1VCU0NSX05PREUsICZjZmdfc3Vic2NyX2F1dGhvcml6ZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoU1VCU0NSX05PREUsICZjZmdfc3Vic2NyX2EzYThfY21kKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxYjkzMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSBAQAorU1VCRElSUyA9IGRlYnVnIGdzbTA0MDggZGIgY2hhbm5lbCBzY2NwCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyOTY1OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsIC1nZ2RiMyAkKExJQk9TTU9DT1JFX0NGTEFHUykKKworbm9pbnN0X1BST0dSQU1TID0gY2hhbm5lbF90ZXN0CisKK2NoYW5uZWxfdGVzdF9TT1VSQ0VTID0gY2hhbm5lbF90ZXN0LmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2RiLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2dzbV9zdWJzY3JpYmVyX2Jhc2UuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZ3NtX3N1YnNjcmliZXIuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZGVidWcuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZ3NtX2RhdGEuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jCitjaGFubmVsX3Rlc3RfTERBREQgPSAtbGRsIC1sZGJpICQoTElCT1NNT0NPUkVfTElCUykKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTAwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvY2hhbm5lbF90ZXN0LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKworLyogb3VyIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgc3Vic2NyX2NiKHVuc2lnbmVkIGludCBob29rLCB1bnNpZ25lZCBpbnQgZXZlbnQsIHN0cnVjdCBtc2diICptc2csIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKQoreworCWFzc2VydChob29rID09IDEwMSk7CisJYXNzZXJ0KGV2ZW50ID09IDIwMCk7CisJYXNzZXJ0KG1zZyA9PSAodm9pZCopMHgxMzIzTCk7CisJYXNzZXJ0KGRhdGEgPT0gKHZvaWQqKTB4NDI0MkwpOworCWFzc2VydChwYXJhbSA9PSAodm9pZCopMHgyMzQyTCk7CisJcHJpbnRmKCJSZWFjaGVkLCBkaWRuJ3QgY3Jhc2gsIHRlc3QgcGFzc2VkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogbW9jayBvYmplY3QgZm9yIHRlc3RpbmcsIGRpcmVjdGx5IGludm9rZSB0aGUgY2IuLi4gbWF5YmUgbGF0ZXIgdGhyb3VnaCB0aGUgdGltZXIgKi8KK3ZvaWQgcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyLCBpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpCit7CisJY2JmbigxMDEsIDIwMCwgKHZvaWQqKTB4MTMyM0wsICh2b2lkKikweDQyNDJMLCBkYXRhKTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrOworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlwcmludGYoIlRlc3RpbmcgdGhlIGdzbV9zdWJzY3JpYmVyIGNoYW4gbG9naWNcbiIpOworCisJLyogQ3JlYXRlIGEgZHVtbXkgbmV0d29yayAqLworCW5ldHdvcmsgPSBnc21fbmV0d29ya19pbml0KDEsIDEsIE5VTEwpOworCWlmICghbmV0d29yaykKKwkJZXhpdCgxKTsKKwlidHMgPSBnc21fYnRzX2FsbG9jKG5ldHdvcmssIEdTTV9CVFNfVFlQRV9CUzExLCAwLCAwKTsKKwlidHMtPmxvY2F0aW9uX2FyZWFfY29kZSA9IDIzOworCisJLyogQ3JlYXRlIGEgZHVtbXkgc3Vic2NyaWJlciAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gc3Vic2NyX2FsbG9jKCk7CisJc3Vic2NyLT5sYWMgPSAyMzsKKwlzdWJzY3ItPm5ldCA9IG5ldHdvcms7CisKKwkvKiBBc2sgZm9yIGEgY2hhbm5lbC4uLiAqLworCXN1YnNjcl9nZXRfY2hhbm5lbChzdWJzY3IsIFJTTF9DSEFOTkVFRF9UQ0hfRiwgc3Vic2NyX2NiLCAodm9pZCopMHgyMzQyTCk7CisKKwl3aGlsZSAoMSkgeworCQlic2Nfc2VsZWN0X21haW4oMCk7CisJfQorfQorCit2b2lkIG5tX3N0YXRlX2V2ZW50KCkge30KK3ZvaWQgaW5wdXRfZXZlbnQoKSB7fQordm9pZCBzbXNfYWxsb2MoKSB7fQorCitzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZjsKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kYi9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvZGIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViOTE4MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsIC1nZ2RiMyAkKExJQk9TTU9DT1JFX0NGTEFHUykKKworbm9pbnN0X1BST0dSQU1TID0gZGJfdGVzdAorCitkYl90ZXN0X1NPVVJDRVMgPSBkYl90ZXN0LmMKK2RiX3Rlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGlibXNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKExJQk9TTU9DT1JFX0xJQlMpIC1sZGwgLWxkYmkKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kYi9kYl90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL2RiL2RiX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY4YWNiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9kYi9kYl90ZXN0LmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIChDKSAyMDA4IGJ5IEphbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBDT01QQVJFKG9yaWdpbmFsLCBjb3B5KSBcCisJaWYgKG9yaWdpbmFsLT5pZCAhPSBjb3B5LT5pZCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIklkcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJWxsdSAlbGx1XG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+aWQsIGNvcHktPmlkKTsgXAorCWlmIChvcmlnaW5hbC0+bGFjICE9IGNvcHktPmxhYykgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkxBQyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJWQgJWRcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5sYWMsIGNvcHktPmxhYyk7IFwKKwlpZiAob3JpZ2luYWwtPmF1dGhvcml6ZWQgIT0gY29weS0+YXV0aG9yaXplZCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkF1dGhvcml6ZSBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJWQgJWRcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5hdXRob3JpemVkLCBcCisJCQljb3B5LT5hdXRob3JpemVkKTsgXAorCWlmIChzdHJjbXAob3JpZ2luYWwtPmltc2ksIGNvcHktPmltc2kpICE9IDApIFwKKwkJZnByaW50ZihzdGRlcnIsICJJTVNJcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyVzJyAnJXMnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+aW1zaSwgY29weS0+aW1zaSk7IFwKKwlpZiAob3JpZ2luYWwtPnRtc2kgIT0gY29weS0+dG1zaSkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIlRNU0lzIGRvIG5vdCBtYXRjaCBpbiAlczolZCAnJXUnICcldSdcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT50bXNpLCBjb3B5LT50bXNpKTsgXAorCWlmIChzdHJjbXAob3JpZ2luYWwtPm5hbWUsIGNvcHktPm5hbWUpICE9IDApIFwKKwkJZnByaW50ZihzdGRlcnIsICJuYW1lcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyVzJyAnJXMnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+bmFtZSwgY29weS0+bmFtZSk7IFwKKwlpZiAoc3RyY21wKG9yaWdpbmFsLT5leHRlbnNpb24sIGNvcHktPmV4dGVuc2lvbikgIT0gMCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIm5hbWVzIGRvIG5vdCBtYXRjaCBpbiAlczolZCAnJXMnICclcydcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5leHRlbnNpb24sIGNvcHktPmV4dGVuc2lvbik7IFwKKworaW50IG1haW4oKSB7CisKKwlpZiAoZGJfaW5pdCgiaGxyLnNxbGl0ZTMiKSkgeworCQlwcmludGYoIkRCOiBGYWlsZWQgdG8gaW5pdCBkYXRhYmFzZS4gUGxlYXNlIGNoZWNrIHRoZSBvcHRpb24gc2V0dGluZ3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQkgCisJcHJpbnRmKCJEQjogRGF0YWJhc2UgaW5pdGlhbGl6ZWQuXG4iKTsKKworCWlmIChkYl9wcmVwYXJlKCkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIHByZXBhcmUgZGF0YWJhc2UuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXByaW50ZigiREI6IERhdGFiYXNlIHByZXBhcmVkLlxuIik7CisKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmFsaWNlID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmFsaWNlX2RiOworCisJY2hhciAqYWxpY2VfaW1zaSA9ICIzMjQzMjQ1NDMyMzQ1IjsKKwlhbGljZSA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKE5VTEwsIGFsaWNlX2ltc2kpOworCWRiX3N5bmNfc3Vic2NyaWJlcihhbGljZSk7CisJYWxpY2VfZGIgPSBkYl9nZXRfc3Vic2NyaWJlcihOVUxMLCBHU01fU1VCU0NSSUJFUl9JTVNJLCBhbGljZS0+aW1zaSk7CisJQ09NUEFSRShhbGljZSwgYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2UpOworCisJYWxpY2VfaW1zaSA9ICIzNjkzMjQ1NDIzNDQ1IjsKKwlhbGljZSA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKE5VTEwsIGFsaWNlX2ltc2kpOworCWRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShhbGljZSwgIjEyMzQ1Njc4OTAiKTsKKwlkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koYWxpY2UpOworCWFsaWNlLT5sYWM9NDI7CisJZGJfc3luY19zdWJzY3JpYmVyKGFsaWNlKTsKKwlhbGljZV9kYiA9IGRiX2dldF9zdWJzY3JpYmVyKE5VTEwsIEdTTV9TVUJTQ1JJQkVSX0lNU0ksIGFsaWNlX2ltc2kpOworCUNPTVBBUkUoYWxpY2UsIGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlKTsKKwlzdWJzY3JfcHV0KGFsaWNlX2RiKTsKKworCWFsaWNlX2ltc2kgPSAiOTk5MzI0NTQyMzQ0NSI7CisJYWxpY2UgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihOVUxMLCBhbGljZV9pbXNpKTsKKwlkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koYWxpY2UpOworCWFsaWNlLT5sYWM9NDI7CisJZGJfc3luY19zdWJzY3JpYmVyKGFsaWNlKTsKKwlkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkoYWxpY2UsICIxMjM0NTY3ODkwIik7CisJZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKGFsaWNlLCAiNjU0MzU2MDkyMCIpOworCWFsaWNlX2RiID0gZGJfZ2V0X3N1YnNjcmliZXIoTlVMTCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgYWxpY2VfaW1zaSk7CisJQ09NUEFSRShhbGljZSwgYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2UpOworCXN1YnNjcl9wdXQoYWxpY2VfZGIpOworCisJZGJfZmluaSgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHN0dWJzICovCit2b2lkIGlucHV0X2V2ZW50KHZvaWQpIHt9Cit2b2lkIG5tX3N0YXRlX2V2ZW50KHZvaWQpIHt9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2RlYnVnL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDIzZmQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDYgQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitBTV9DRkxBR1M9LVdhbGwgJChMSUJPU01PQ09SRV9DRkxBR1MpCitub2luc3RfUFJPR1JBTVMgPSBkZWJ1Z190ZXN0CisKK2RlYnVnX3Rlc3RfU09VUkNFUyA9IGRlYnVnX3Rlc3QuYyAkKHRvcF9zcmNkaXIpL3NyYy9kZWJ1Zy5jIAorZGVidWdfdGVzdF9MREFERCA9ICQoTElCT1NNT0NPUkVfTElCUykKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZGVidWcvZGVidWdfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9kZWJ1Z190ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlNDgzNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGVidWcvZGVidWdfdGVzdC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIHNpbXBsZSB0ZXN0IGZvciB0aGUgZGVidWcgaW50ZXJmYWNlICovCisvKgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCisJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkRSTEwiKTsKKwlERUJVR1AoRENDLCAiWW91IHNob3VsZCBub3Qgc2VlIHRoaXNcbiIpOworCisJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkRSTEw6RENDIik7CisJREVCVUdQKERSTEwsICJZb3Ugc2hvdWxkIHNlZSB0aGlzXG4iKTsKKwlERUJVR1AoRENDLCAiWW91IHNob3VsZCBzZWUgdGhpc1xuIik7CisJREVCVUdQKERNTSwgIllvdSBzaG91bGQgbm90IHNlZSB0aGlzXG4iKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9nc20wNDA4L01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9nc20wNDA4L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OGM2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorbm9pbnN0X1BST0dSQU1TID0gZ3NtMDQwOF90ZXN0CisKK2dzbTA0MDhfdGVzdF9TT1VSQ0VTID0gZ3NtMDQwOF90ZXN0LmMKK2dzbTA0MDhfdGVzdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJtc2MuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQoTElCT1NNT0NPUkVfTElCUykgLWxkYmkKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODdkNGVlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9nc20wNDA4L2dzbTA0MDhfdGVzdC5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiBzaW1wbGUgdGVzdCBmb3IgdGhlIGdzbTA0MDggZm9ybWF0dGluZyBmdW5jdGlvbnMgKi8KKy8qCisgKiAoQykgMjAwOCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworI2RlZmluZSBDT01QQVJFKHJlc3VsdCwgb3AsIHZhbHVlKSBcCisgICAgaWYgKCEoKHJlc3VsdCkgb3AgKHZhbHVlKSkpIHtcCisJZnByaW50ZihzdGRlcnIsICJDb21wYXJlIGZhaWxlZC4gV2FzICV4IHNob3VsZCBiZSAleCBpbiAlczolZFxuIixyZXN1bHQsIHZhbHVlLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisJZXhpdCgtMSk7IFwKKyAgICB9CisKKyNkZWZpbmUgQ09NUEFSRV9TVFIocmVzdWx0LCB2YWx1ZSkgXAorCWlmIChzdHJjbXAocmVzdWx0LCB2YWx1ZSkgIT0gMCkgeyBcCisJCWZwcmludGYoc3RkZXJyLCAiQ29tcGFyZSBmYWlsZWQuIFdhcyAlcyBzaG91bGQgYmUgJXMgaW4gJXM6JWRcbiIscmVzdWx0LCB2YWx1ZSwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCQlleGl0KC0xKTsgXAorCX0KKworLyoKKyAqIFRlc3QgTG9jYXRpb24gQXJlYSBJZGVudGlmaWVyIGZvcm1hdHRpbmcuIFRhYmxlIDEwLjUuMyBvZiAwNC4wOAorICovCitzdGF0aWMgdm9pZCB0ZXN0X2xvY2F0aW9uX2FyZWFfaWRlbnRpZmllcih2b2lkKQoreworICAgIHN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCBsYWk0ODsKKworICAgIHByaW50ZigiVGVzdGluZyB0ZXN0IGxvY2F0aW9uIGFyZWEgaWRlbnRpZmllclxuIik7CisKKyAgICAvKgorICAgICAqIFRlc3QgdGhlIGRlZmF1bHQvdGVzdCBzZXR1cC4gQ29taW5nIGZyb20KKyAgICAgKiBic2NfaGFjay5jIGR1bXBzCisgICAgICovCisgICAgZ3NtNDhfZ2VuZXJhdGVfbGFpKCZsYWk0OCwgMSwgMSwgMSk7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMF0sID09LCAweDAwKTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1sxXSwgPT0sIDB4RjEpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzJdLCA9PSwgMHgxMCk7CisgICAgQ09NUEFSRShsYWk0OC5sYWMsID09LCBodG9ucygweDAwMDEpKTsKKworICAgIGdzbTQ4X2dlbmVyYXRlX2xhaSgmbGFpNDgsIDYwMiwgMSwgMTUpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzBdLCA9PSwgMHgwNik7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMV0sID09LCAweEYyKTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1syXSwgPT0sIDB4MTApOworICAgIENPTVBBUkUobGFpNDgubGFjLCA9PSwgaHRvbnMoMHgwMDBmKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfbWlfZnVuY3Rpb25hbGl0eSh2b2lkKQoreworCWNvbnN0IGNoYXIgKmltc2lfb2RkICA9ICI5ODc2NTQzMjEwOTg3NjMiOworCWNvbnN0IGNoYXIgKmltc2lfZXZlbiA9ICI5ODc2NTQzMjEwOTg3NjU0IjsKKwljb25zdCB1X2ludDMyX3QgdG1zaSA9IDB4ZmFiZWFjZDA7CisJdV9pbnQ4X3QgbWlbMTI4XTsKKwl1bnNpZ25lZCBpbnQgbWlfbGVuOworCWNoYXIgbWlfcGFyc2VkW0dTTTQ4X01JX1NJWkVdOworCisJcHJpbnRmKCJUZXN0aW5nIHBhcnNpbmcgYW5kIGdlbmVyYXRpbmcgVE1TSS9JTVNJXG4iKTsKKworCS8qIHRtc2kgY29kZSAqLworCW1pX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX3Rtc2kobWksIHRtc2kpOworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9wYXJzZWQsIHNpemVvZihtaV9wYXJzZWQpLCBtaSArIDIsIG1pX2xlbiAtIDIpOworCUNPTVBBUkUoKHVfaW50MzJfdClzdHJ0b3VsKG1pX3BhcnNlZCwgTlVMTCwgMTApLCA9PSwgdG1zaSk7CisKKwkvKiBpbXNpIGNvZGUgKi8KKwltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV9pbXNpKG1pLCBpbXNpX29kZCk7CisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3BhcnNlZCwgc2l6ZW9mKG1pX3BhcnNlZCksIG1pICsgMiwgbWlfbGVuIC0yKTsKKwlwcmludGYoImhleDogJXNcbiIsIGhleGR1bXAobWksIG1pX2xlbikpOworCUNPTVBBUkVfU1RSKG1pX3BhcnNlZCwgaW1zaV9vZGQpOworCisJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21faW1zaShtaSwgaW1zaV9ldmVuKTsKKwlnc200OF9taV90b19zdHJpbmcobWlfcGFyc2VkLCBzaXplb2YobWlfcGFyc2VkKSwgbWkgKyAyLCBtaV9sZW4gLTIpOworCXByaW50ZigiaGV4OiAlc1xuIiwgaGV4ZHVtcChtaSwgbWlfbGVuKSk7CisJQ09NUEFSRV9TVFIobWlfcGFyc2VkLCBpbXNpX2V2ZW4pOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJdGVzdF9sb2NhdGlvbl9hcmVhX2lkZW50aWZpZXIoKTsKKwl0ZXN0X21pX2Z1bmN0aW9uYWxpdHkoKTsKKworCWV4aXQoMCk7Cit9CisKKworCisvKgorICogU3R1YnMgdG8gY29tcGlsZSBhbmQgbGluaworICovCit2b2lkIGlucHV0X2V2ZW50KHZvaWQpIHt9Cit2b2lkIG5tX3N0YXRlX2V2ZW50KHZvaWQpIHt9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL3NjY3AvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL3NjY3AvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1NjkzZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvc2NjcC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDggQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitBTV9DRkxBR1M9LVdhbGwgLWdnZGIzICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorCitub2luc3RfUFJPR1JBTVMgPSBzY2NwX3Rlc3QKKworc2NjcF90ZXN0X1NPVVJDRVMgPSBzY2NwX3Rlc3QuYworc2NjcF90ZXN0X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJzY2NwLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKExJQk9TTU9DT1JFX0xJQlMpCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvc2NjcC9zY2NwX3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvc2NjcC9zY2NwX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWViNDdmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9zY2NwL3NjY3BfdGVzdC5jCkBAIC0wLDAgKzEsODUxIEBACisvKgorICogU0NDUCB0ZXN0aW5nIGNvZGUKKyAqCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBPbi1XYXZlcworICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKKyNpbmNsdWRlIDxzY2NwL3NjY3AuaD4KKworI2RlZmluZSBNSU4oeCwgeSkgKCh4KSA8ICh5KSA/ICh4KSA6ICh5KSkKKworLyogQlNDIC0+IE1TQyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9yZXNldFtdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDUsIDB4MDcsIDB4MDIsIDB4NDIsIDB4ZmUsCisJMHgwMiwgMHg0MiwgMHhmZSwgMHgwNiwgMHgwMCwgMHgwNCwgMHgzMCwgMHgwNCwKKwkweDAxLCAweDIwLAorfTsKKworLyogTVNDIC0+IEJTQyByZXNldCBhY2sgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcmVzZXRfYWNrW10gPSB7CisJMHgwOSwgMHgwMCwgMHgwMywgMHgwNywgMHgwYiwgMHgwNCwgMHg0MywgMHgwMSwKKwkweDAwLCAweGZlLCAweDA0LCAweDQzLCAweDVjLCAweDAwLCAweGZlLCAweDAzLAorCTB4MDAsIDB4MDEsIDB4MzEsCit9OworCisvKiBNU0MgLT4gQlNDIHBhZ2luZywgY29ubmVjdGlvbiBsZXNzICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3BhZ2luZ1tdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDcsIDB4MGIsIDB4MDQsIDB4NDMsIDB4MDEsCisJMHgwMCwgMHhmZSwgMHgwNCwgMHg0MywgMHg1YywgMHgwMCwgMHhmZSwgMHgxMCwKKwkweDAwLCAweDBlLCAweDUyLCAweDA4LCAweDA4LCAweDI5LCAweDQ3LCAweDEwLAorCTB4MDIsIDB4MDEsIDB4MzEsIDB4OTcsIDB4NjEsIDB4MWEsIDB4MDEsIDB4MDYsCit9OworCisvKiBNU0MgLT4gQlNDIHBhZ2luZywgVURUIHdpdGhvdXQgUEMgICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3VkdFtdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDUsIDB4MDcsIDB4MDIsIDB4NDIsIDB4ZmUsCisJMHgwMiwgMHg0MiwgMHhmZSwgMHgxMCwgMHgwMCwgMHgwZSwgMHg1MiwgMHgwOCwKKwkweDA4LCAweDI5LCAweDQ3LCAweDEwLCAweDAyLCAweDAxLCAweDMxLCAweDk3LAorCTB4NjEsIDB4MWEsIDB4MDEsIDB4MDYsCit9OworCisvKiBCU0MgLT4gTVNDIGNvbm5lY3Rpb24gb3BlbiAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9jcltdID0geworCTB4MDEsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDQsIDB4MDIsCisJMHg0MiwgMHhmZSwgMHgwZiwgMHgxZiwgMHgwMCwgMHgxZCwgMHg1NywgMHgwNSwKKwkweDA4LCAweDAwLCAweDcyLCAweGY0LCAweDgwLCAweDIwLCAweDEyLCAweGMzLAorCTB4NTAsIDB4MTcsIDB4MTAsIDB4MDUsIDB4MjQsIDB4MTEsIDB4MDMsIDB4MzMsCisJMHgxOSwgMHhhMiwgMHgwOCwgMHgyOSwgMHg0NywgMHgxMCwgMHgwMiwgMHgwMSwKKwkweDMxLCAweDk3LCAweDYxLCAweDAwCit9OworCisvKiBNU0MgLT4gQlNDIGNvbm5lY3Rpb24gY29uZmlybSAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9jY1tdID0geworCTB4MDIsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDIsIDB4MDEsIDB4MDAsCit9OworCisvKiBNU0MgLT4gQlNDIERUQVAKKyAqCisgKiB3ZSBmYWtlIGEgYml0IGFuZCBtYWtlIGl0IEJTQyAtPiBNU0MuLi4gc28gdGhlCisgKiBwYXlsb2FkIGRvZXMgbm90IG1ha2UgYW55IHNlbnNlLi4KKyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9kdGFwW10gPSB7CisJMHgwNiwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMSwgMHgwZiwgMHgwMSwgMHgwMCwgMHgwYywKKwkweDAzLCAweDA1LCAweDVjLCAweDA4LCAweDExLCAweDgxLCAweDMzLCAweDY2LCAweDAyLCAweDEzLAorCTB4NDUsIDB4ZjQsCit9OworCisvKiBNU0MgLT4gQlNDIGNsZWFyIGNvbW1hbmQgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfY2xlYXJbXSA9IHsKKwkweDA2LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAxLCAweDA2LCAweDAwLCAweDA0LCAweDIwLAorCTB4MDQsIDB4MDEsIDB4MDksCit9OworCisvKiBNU0MgLT4gQlNDIHJlbGVhc2VkICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3JlbGVhc2VkW10gPSB7CisJMHgwNCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwMSwgMHgwZiwKKwkweDAyLCAweDIzLCAweDQyLCAweDAwLAorfTsKKworLyogQlNDIC0+IE1TQyByZWxlYXNlZCAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9yZWxlYXNlX2NvbXBsZXRlW10gPSB7CisJMHgwNSwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMworfTsKKworc3RydWN0IHRlc3RfZGF0YSB7CisJaW50IGxlbmd0aDsKKwljb25zdCB1X2ludDhfdCAqZGF0YTsKKwlpbnQgcGF5bG9hZF9zdGFydDsKKwlpbnQgcGF5bG9hZF9sZW5ndGg7CisJdV9pbnQ4X3QgZmlyc3RfYnl0ZTsKKworICAgICAgICAvKiBpbiBjYXNlIGl0IHNob3VsZCB0cmlnZ2VyIGEgc2NjcCByZXNwb25zZSAqLworCWludCB3cml0ZTsKKwljb25zdCB1X2ludDhfdCAgKnJlc3BvbnNlOworCWludCByZXNwb25zZV9sZW5ndGg7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRlc3RfZGF0YSB0ZXN0X2RhdGFbXSA9IHsKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcmVzZXQpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3Jlc2V0WzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDEyLAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldCkgLSAxMiwKKwkJLmZpcnN0X2J5dGUJPSAweDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcmVzZXRfYWNrKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9yZXNldF9hY2tbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTYsCisJCS5wYXlsb2FkX2xlbmd0aCA9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0X2FjaykgLSAxNiwKKwkJLmZpcnN0X2J5dGUJPSAweDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcGFnaW5nKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9wYWdpbmdbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTYsCisJCS5wYXlsb2FkX2xlbmd0aCA9IEFSUkFZX1NJWkUoYnNzbWFwX3BhZ2luZykgLSAxNiwKKwkJLmZpcnN0X2J5dGUJPSAweDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfY3IpLAorCQkuZGF0YQkJPSAmYnNzbWFwX2NyWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDEyLAorCQkvKiAweDAwIGlzIGVuZCBvZiBvcHRpb25hbCBkYXRhLCBzdWJ0cmFjdCB0aGlzIGJ5dGUgKi8KKwkJLnBheWxvYWRfbGVuZ3RoID0gMzEsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCisJCS8qIHRoZSBjb25uZWN0aW9uIHJlcXVlc3Qgc2hvdWxkIHRyaWdnZXIgYSBjb25uZWN0aW9uIGNvbmZpcm0gKi8KKwkJLndyaXRlCQk9IDEsCisJCS5yZXNwb25zZQk9ICZic3NtYXBfY2NbMF0sCisJCS5yZXNwb25zZV9sZW5ndGg9IEFSUkFZX1NJWkUoYnNzbWFwX2NjKSwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9kdGFwKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9kdGFwWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDcsCisJCS5wYXlsb2FkX2xlbmd0aCA9IDE1LAorCQkuZmlyc3RfYnl0ZQk9IDB4MDEsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfY2xlYXIpLAorCQkuZGF0YQkJPSAmYnNzbWFwX2NsZWFyWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDcsCisJCS5wYXlsb2FkX2xlbmd0aCA9IDYsCisJCS5maXJzdF9ieXRlCT0gMHgwMCwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9yZWxlYXNlZCksCisJCS5kYXRhCQk9ICZic3NtYXBfcmVsZWFzZWRbMF0sCisJCS5wYXlsb2FkX2xlbmd0aCA9IDIsCisJCS5wYXlsb2FkX3N0YXJ0ICA9IDExLAorCQkuZmlyc3RfYnl0ZQk9IDB4MjMsCisKKwkJLndyaXRlCQk9IDEsCisJCS5yZXNwb25zZQk9ICZic3NtYXBfcmVsZWFzZV9jb21wbGV0ZVswXSwKKwkJLnJlc3BvbnNlX2xlbmd0aD0gQVJSQVlfU0laRShic3NtYXBfcmVsZWFzZV9jb21wbGV0ZSksCisJfSwKK307CisKKy8qIHdlIHdpbGwgc2VuZCBVRFRzIGFuZCB2ZXJpZnkgdGhleSBsb29rIGxpa2UgdGhpcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X2RhdGEgc2VuZF9kYXRhW10gPSB7CisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3VkdCksCisJCS5kYXRhCQk9ICZic3NtYXBfdWR0WzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDEyLAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF91ZHQpIC0gMTIsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0KSwKKwkJLmRhdGEJCT0gJmJzc21hcF9yZXNldFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfcmVzZXQpIC0gMTIsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCit9OworCitzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0IHsKKwkvKiBzaG91bGQgdGhlIGNvbm5lY3Rpb24gYmUgcmVmdXNlZD8gKi8KKwlpbnQgcmVmdXNlOworCisJaW50IHdpdGhfZGF0YTsKKworCS8qIG9uIHdoaWNoIHNpZGUgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24/ICovCisJaW50IGNsb3NlX3NpZGU7CisJaW50IGNsb3NlX2NhdXNlOworfTsKKworLyogc2NjcCBjb25uZWN0aW9uIGhhbmRsaW5nIHdlIHdhbnQgdG8gdGVzdCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25uZWN0aW9uX3Rlc3QgY29ubmVjdGlvbl90ZXN0c1tdID0geworCXsKKwkJLnJlZnVzZQk9IDEsCisJfSwKKwl7CisJCS5yZWZ1c2UJPSAxLAorCQkud2l0aF9kYXRhID0gMSwKKwl9LAorCXsKKwkJLnJlZnVzZSA9IDAsCisJCS5jbG9zZV9zaWRlID0gMCwKKwkJLmNsb3NlX2NhdXNlID0gNSwKKwl9LAorCXsKKwkJLnJlZnVzZSA9IDAsCisJCS5jbG9zZV9zaWRlID0gMCwKKwkJLmNsb3NlX2NhdXNlID0gNSwKKwkJLndpdGhfZGF0YSA9IDEsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDEsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDEsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJCS53aXRoX2RhdGEgPSAxLAorCX0sCit9OworCitzdHJ1Y3Qgc2NjcF9wYXJzZV9oZWFkZXJfcmVzdWx0IHsKKwkvKiByZXN1bHRzICovCisJaW50IG1zZ190eXBlOworCWludCB3YW50ZWRfbGVuOworCWludCBzcmNfc3NuOworCWludCBkc3Rfc3NuOworCisJaW50IGhhc19zcmNfcmVmLCBoYXNfZHN0X3JlZjsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHNyY19yZWY7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBkc3RfcmVmOworCisJLyogdGhlIGlucHV0ICovCisJY29uc3QgdV9pbnQ4X3QgKmlucHV0OworCWludCBpbnB1dF9sZW47Cit9OworCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaXRfdGVzdFtdID0geworMHgxMCwgMHgwMSwgMHgwNywgCisweDk0LCAweDAxLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwIH07CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBwcm90b19lcnJbXSA9IHsKKzB4MGYsIDB4MGMsIDB4MDQsIDB4MDAsIDB4MDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjY3BfcGFyc2VfaGVhZGVyX3Jlc3VsdCBwYXJzZV9yZXN1bHRbXSA9IHsKKwl7CisJCS5tc2dfdHlwZQk9IFNDQ1BfTVNHX1RZUEVfSVQsCisJCS53YW50ZWRfbGVuCT0gMCwKKwkJLnNyY19zc24JPSAtMSwKKwkJLmRzdF9zc24JPSAtMSwKKwkJLmhhc19zcmNfcmVmCT0gMSwKKwkJLmhhc19kc3RfcmVmCT0gMSwKKworCQkuc3JjX3JlZgk9IHsKKwkJCS5vY3RldDEgPSAweDAxLAorCQkJLm9jdGV0MiA9IDB4MDQsCisJCQkub2N0ZXQzID0gMHgwMAorCQl9LAorCQkuZHN0X3JlZgk9IHsKKwkJCS5vY3RldDEgPSAweDAxLAorCQkJLm9jdGV0MiA9IDB4MDcsCisJCQkub2N0ZXQzID0gMHg5NCwKKwkJfSwKKworCQkuaW5wdXQJCT0gaXRfdGVzdCwKKwkJLmlucHV0X2xlbgk9IHNpemVvZihpdF90ZXN0KSwKKwl9LAorCXsKKwkJLm1zZ190eXBlCT0gU0NDUF9NU0dfVFlQRV9FUlIsCisJCS53YW50ZWRfbGVuCT0gMCwKKwkJLnNyY19zc24JPSAtMSwKKwkJLmRzdF9zc24JPSAtMSwKKwkJLmhhc19zcmNfcmVmCT0gMCwKKwkJLmhhc19kc3RfcmVmCT0gMSwKKwkJLmRzdF9yZWYJPSB7CisJCQkub2N0ZXQxID0gMHgwYywKKwkJCS5vY3RldDIgPSAweDA0LAorCQkJLm9jdGV0MyA9IDB4MDAsCisJCX0sCisJCS5pbnB1dAkJPSBwcm90b19lcnIsCisJCS5pbnB1dF9sZW4JPSBzaXplb2YocHJvdG9fZXJyKSwKKwl9LAorfTsKKworCisvKiB0ZXN0aW5nIHByb2NlZHVyZToKKyAqCS0gd2Ugd2lsbCB1c2Ugc2NjcF93cml0ZSBhbmQgc2VlIHdoYXQgd2lsbCBiZSBzZXQgaW4gdGhlCisgKgkgIG91dGdvaW5nIGNhbGxiYWNrCisgKgktIHdlIHdpbGwgY2FsbCBzY2NwX3N5c3RlbV9pbmNvbWluZyBhbmQgc2VlIHdoaWNoIGNhbGxzCisgKgkgIGFyZSBtYWRlLiBBbmQgdGhlbiBjb21wYXJlIGl0IHRvIHRoZSBvbmVzIHdlIGV4cGVjdC4gV2UKKyAqCSAgd2FudCB0aGUgcGF5bG9hZCB0byBhcnJpdmUsIG9yIGNhbGxiYWNrcyB0byBiZSBjYWxsZWQuCisgKgktIHdlIHdpbGwgdXNlIHNjY3BfY29ubmVjdGlvbl9zb2NrZXQgYW5kIHNjY3BfY29ubmVjdGlvbl93cml0ZQorICoJICBhbmQgdmVyaWZ5IHN0YXRlIGhhbmRsaW5nIG9mIGNvbm5lY3Rpb25zCisgKi8KKworc3RhdGljIGludCBjdXJyZW50X3Rlc3Q7CisKKy8qCisgKiB0ZXN0IHN0YXRlLi4uCisgKi8KK3N0YXRpYyBpbnQgY2FsbGVkICA9IDA7CitzdGF0aWMgaW50IG1hdGNoZWQgPSAwOworc3RhdGljIGludCB3cml0ZV9jYWxsZWQgPSAwOworCisjZGVmaW5lIEZBSUwoeCwgYXJncy4uLikgcHJpbnRmKCJGQUlMVVJFIGluICVzOiVkOiAiIHgsIF9fRklMRV9fLCBfX0xJTkVfXywgIyMgYXJncykKKworLyoKKyAqIHdyaXRpbmcgdGhlc2UgcGFja2V0cyBhbmQgZXhwZWN0aW5nIGEgcmVzdWx0CisgKi8KK2ludCBzY2NwX3JlYWRfY2Ioc3RydWN0IG1zZ2IgKmRhdGEsIHVuc2lnbmVkIGxlbiwgdm9pZCAqY29udGV4dCkKK3sKKwl1X2ludDE2X3QgcGF5bG9hZF9sZW5ndGggPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5wYXlsb2FkX2xlbmd0aDsKKwljb25zdCB1X2ludDhfdCAqZ290LCAqd2FudGVkOworCWludCBpOworCisJY2FsbGVkID0gMTsKKworCWlmIChtc2diX2wzbGVuKGRhdGEpIDwgbGVuKSB7CisJCS8qIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQgKi8KKwkJRkFJTCgiU29tZXRoaW5nIGhvcnJpYmxlIGhhcHBlbmVkLi4gaW52YWxpZCBwYWNrZXQuLlxuIik7CisJCWV4aXQoLTEpOworCX0KKworCWlmIChsZW4gPT0gMCB8fCBsZW4gIT0gcGF5bG9hZF9sZW5ndGgpIHsKKwkJRkFJTCgibGVuZ3RoIG1pc21hdGNoOiBnb3Q6ICVkIHdhbnRlZDogJWRcbiIsIG1zZ2JfbDNsZW4oZGF0YSksIHBheWxvYWRfbGVuZ3RoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChkYXRhLT5sM2hbMF0gIT0gIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmZpcnN0X2J5dGUpIHsKKwkJRkFJTCgiVGhlIGZpcnN0IGJ5dGVzIG9mIGwzIGRvIG5vdCBtYXRjaDogMHgleCAweCV4XG4iLAorCQkJZGF0YS0+bDNoWzBdLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5maXJzdF9ieXRlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWdvdCA9ICZkYXRhLT5sM2hbMF07CisJd2FudGVkID0gdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZGF0YSArIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnBheWxvYWRfc3RhcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJaWYgKGdvdFtpXSAhPSB3YW50ZWRbaV0pIHsKKwkJCUZBSUwoIkZhaWxlZCB0byBjb21wYXJlIGJ5dGUuIEdvdDogMHgleCBXYW50ZWQ6IDB4JXggYXQgJWRcbiIsCisJCQkgICAgIGdvdFtpXSwgd2FudGVkW2ldLCBpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCW1hdGNoZWQgPSAxOworCXJldHVybiAwOworfQorCit2b2lkIHNjY3Bfd3JpdGVfY2Ioc3RydWN0IG1zZ2IgKmRhdGEsIHZvaWQgKmN0eCkKK3sKKwlpbnQgaSA9IDA7CisJY29uc3QgdV9pbnQ4X3QgKmdvdCwgKndhbnRlZDsKKworCWlmICh0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5yZXNwb25zZSA9PSBOVUxMKSB7CisJCUZBSUwoIkRpZG4ndCBleHBlY3Qgd3JpdGUgY2FsbGJhY2tcbiIpOworCQlnb3RvIGV4aXQ7CisJfSBlbHNlIGlmICh0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5yZXNwb25zZV9sZW5ndGggIT0gbXNnYl9sMmxlbihkYXRhKSkgeworCQlGQUlMKCJTaXplIGRvZXMgbm90IG1hdGNoLiBHb3Q6ICVkIFdhbnRlZDogJWRcbiIsCisJCSAgICAgbXNnYl9sMmxlbihkYXRhKSwgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucmVzcG9uc2VfbGVuZ3RoKTsKKwl9CisKKwlnb3QgPSAmZGF0YS0+bDJoWzBdOworCXdhbnRlZCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnJlc3BvbnNlOworCisJZm9yIChpID0gMDsgaSA8IG1zZ2JfbDJsZW4oZGF0YSk7ICsraSkgeworCQlpZiAoZ290W2ldICE9IHdhbnRlZFtpXSkgeworCQkJRkFJTCgiRmFpbGVkIHRvIGNvbXBhcmUgYnl0ZS4gR290OiAweCV4IFdhbnRlZDogMHgleCBhdCAlZFxuIiwKKwkJCSAgICAgZ290W2ldLCB3YW50ZWRbaV0sIGkpOworCQkJZ290byBleGl0OworCQl9CisJfQorCisJd3JpdGVfY2FsbGVkID0gMTsKKworZXhpdDoKKwltc2diX2ZyZWUoZGF0YSk7Cit9CisKK3ZvaWQgc2NjcF9jX3JlYWQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IG1zZ2IgKm1zZ2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc2NjcF9yZWFkX2NiKG1zZ2IsIGxlbiwgY29ubmVjdGlvbi0+ZGF0YV9jdHgpOworfQorCit2b2lkIHNjY3BfY19zdGF0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBpbnQgb2xkX3N0YXRlKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID49IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKQorCQlzY2NwX2Nvbm5lY3Rpb25fZnJlZShjb25uZWN0aW9uKTsKK30KKworaW50IHNjY3BfYWNjZXB0X2NiKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHZvaWQgKnVzZXJfZGF0YSkKK3sKKwljYWxsZWQgPSAxOworCXVuc2lnbmVkIGludCByZWYgPSAwOworCXJlZiB8PSBjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2Uub2N0ZXQxIDw8IDI0OworCXJlZiB8PSBjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2Uub2N0ZXQyIDw8IDE2OworCXJlZiB8PSBjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2Uub2N0ZXQzIDw8ICA4OworCXJlZiA9IG50b2hsKHJlZik7CisKKwljb25uZWN0aW9uLT5kYXRhX2NiID0gc2NjcF9jX3JlYWQ7CisJY29ubmVjdGlvbi0+c3RhdGVfY2IgPSBzY2NwX2Nfc3RhdGU7CisKKwkvKiBhY2NlcHQgdGhpcyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzY2NwX3VkdF93cml0ZV9jYihzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY29udGV4dCkKK3sKKwljb25zdCB1X2ludDhfdCAqZ290LCAqd2FudGVkOworCWludCBpOworCisJd3JpdGVfY2FsbGVkID0gMTsKKworCWlmIChzZW5kX2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGggIT0gbXNnYl9sMmxlbihkYXRhKSkgeworCQlGQUlMKCJTaXplIGRvZXMgbm90IG1hdGNoLiBHb3Q6ICVkIFdhbnRlZDogJWRcbiIsCisJCSAgICAgbXNnYl9sMmxlbihkYXRhKSwgc2VuZF9kYXRhW2N1cnJlbnRfdGVzdF0ubGVuZ3RoKTsKKwkJZ290byBleGl0OworCX0KKworCWdvdCA9ICZkYXRhLT5sMmhbMF07CisJd2FudGVkID0gc2VuZF9kYXRhW2N1cnJlbnRfdGVzdF0uZGF0YTsKKworCWZvciAoaSA9IDA7IGkgPCBtc2diX2wybGVuKGRhdGEpOyArK2kpIHsKKwkJaWYgKGdvdFtpXSAhPSB3YW50ZWRbaV0pIHsKKwkJCUZBSUwoIkZhaWxlZCB0byBjb21wYXJlIGJ5dGUuIEdvdDogMHgleCBXYW50ZWQ6IDB4JXggYXQgJWRcbiIsCisJCQkgICAgIGdvdFtpXSwgd2FudGVkW2ldLCBpKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCW1hdGNoZWQgPSAxOworCitleGl0OgorCW1zZ2JfZnJlZShkYXRhKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3N5c3RlbSh2b2lkKQoreworCXNjY3Bfc3lzdGVtX2luaXQoc2NjcF93cml0ZV9jYiwgTlVMTCk7CisJc2NjcF9zZXRfcmVhZCgmc2NjcF9zc25fYnNzYXAsIHNjY3BfcmVhZF9jYiwgTlVMTCk7CisJc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZygmc2NjcF9zc25fYnNzYXAsIHNjY3BfYWNjZXB0X2NiLCBOVUxMKTsKKworCWZvciAoY3VycmVudF90ZXN0ID0gMDsgY3VycmVudF90ZXN0IDwgQVJSQVlfU0laRSh0ZXN0X2RhdGEpOyArK2N1cnJlbnRfdGVzdCkgeworCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ubGVuZ3RoOworCQlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShsZW5ndGggKyAyLCAyLCBfX2Z1bmNfXyk7CisJCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBsZW5ndGgpOworCQltZW1jcHkobXNnLT5sMmgsIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmRhdGEsIGxlbmd0aCk7CisKKwkJY2FsbGVkID0gbWF0Y2hlZCA9IHdyaXRlX2NhbGxlZCA9IDA7CisJCXByaW50ZigiVGVzdGluZyBwYWNrZXQ6ICVkXG4iLCBjdXJyZW50X3Rlc3QpOworCQlzY2NwX3N5c3RlbV9pbmNvbWluZyhtc2cpOworCisJCWlmICghY2FsbGVkIHx8ICFtYXRjaGVkIHx8ICh0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS53cml0ZSAhPSB3cml0ZV9jYWxsZWQpKQorCQkJRkFJTCgiY3VycmVudCB0ZXN0OiAlZCBjYWxsZWQ6ICVkIG1hdGNoZWQ6ICVkIHdyaXRlOiAlZFxuIiwKKwkJCSAgICAgY3VycmVudF90ZXN0LCBjYWxsZWQsIG1hdGNoZWQsIHdyaXRlX2NhbGxlZCk7CisKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorfQorCisvKiB0ZXN0IHNlbmRpbmcgb2YgdWR0ICovCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3Bfc2VuZF91ZHQodm9pZCkKK3sKKwlzY2NwX3N5c3RlbV9pbml0KHNjY3BfdWR0X3dyaXRlX2NiLCBOVUxMKTsKKwlzY2NwX3NldF9yZWFkKE5VTEwsIE5VTEwsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoTlVMTCwgTlVMTCwgTlVMTCk7CisKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUoc2VuZF9kYXRhKTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJY29uc3Qgc3RydWN0IHRlc3RfZGF0YSAqdGVzdCA9ICZzZW5kX2RhdGFbY3VycmVudF90ZXN0XTsKKworCQlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyh0ZXN0LT5wYXlsb2FkX2xlbmd0aCwgX19mdW5jX18pOworCQltc2ctPmwzaCA9IG1zZ2JfcHV0KG1zZywgdGVzdC0+cGF5bG9hZF9sZW5ndGgpOworCQltZW1jcHkobXNnLT5sM2gsIHRlc3QtPmRhdGEgKyB0ZXN0LT5wYXlsb2FkX3N0YXJ0LCB0ZXN0LT5wYXlsb2FkX2xlbmd0aCk7CisKKwkJbWF0Y2hlZCA9IHdyaXRlX2NhbGxlZCA9IDA7CisJCXByaW50ZigiVGVzdGluZyBwYWNrZXQ6ICVkXG4iLCBjdXJyZW50X3Rlc3QpOworCQlzY2NwX3dyaXRlKG1zZywgJnNjY3Bfc3NuX2Jzc2FwLCAmc2NjcF9zc25fYnNzYXAsIDApOworCisJCWlmICghbWF0Y2hlZCB8fCAhd3JpdGVfY2FsbGVkKQorCQkJRkFJTCgiY3VycmVudCB0ZXN0OiAlZCBtYXRjaGVkOiAlZCB3cml0ZTogJWRcbiIsCisJCQkgICAgIGN1cnJlbnRfdGVzdCwgbWF0Y2hlZCwgd3JpdGVfY2FsbGVkKTsKKworCQltc2diX2ZyZWUobXNnKTsKKwl9Cit9CisKKy8qIHNlbmQgdWR0IGZyb20gb25lIGVuZCB0byBhbm90aGVyICovCitzdGF0aWMgdW5zaWduZWQgaW50IHRlc3RfdmFsdWUgPSAweDI0NDI7CitzdGF0aWMgaW50IHNjY3BfdWR0X3JlYWQoc3RydWN0IG1zZ2IgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIHZvaWQgKmNvbnRleHQpCit7CisJdW5zaWduZWQgaW50ICp2YWw7CisKKwlpZiAobGVuICE9IDQpIHsKKwkJRkFJTCgiV3Jvbmcgc2l6ZTogJWRcbiIsIG1zZ2JfbDNsZW4oZGF0YSkpOworCQlyZXR1cm4gLTE7CisJfQorCisJdmFsID0gKHVuc2lnbmVkIGludCopZGF0YS0+bDNoOworCW1hdGNoZWQgPSB0ZXN0X3ZhbHVlID09ICp2YWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2NjcF93cml0ZV9sb29wKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjb250ZXh0KQoreworCS8qIHNlbmQgaXQgYmFjayB0byB1cyAqLworCXNjY3Bfc3lzdGVtX2luY29taW5nKGRhdGEpOworCW1zZ2JfZnJlZShkYXRhKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3VkdF9jb21tdW5pY2F0aW9uKHZvaWQpCit7CisJc3RydWN0IG1zZ2IgKmRhdGE7CisJdW5zaWduZWQgaW50ICp2YWw7CisKKwlzY2NwX3N5c3RlbV9pbml0KHNjY3Bfd3JpdGVfbG9vcCwgTlVMTCk7CisJc2NjcF9zZXRfcmVhZCgmc2NjcF9zc25fYnNzYXAsIHNjY3BfdWR0X3JlYWQsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoTlVMTCwgTlVMTCwgTlVMTCk7CisKKworCWRhdGEgPSBtc2diX2FsbG9jKDQsICJ0ZXN0IGRhdGEiKTsKKwlkYXRhLT5sM2ggPSAmZGF0YS0+ZGF0YVswXTsKKwl2YWwgPSAodW5zaWduZWQgaW50ICopbXNnYl9wdXQoZGF0YSwgNCk7CisJKnZhbCA9IHRlc3RfdmFsdWU7CisKKwltYXRjaGVkID0gMDsKKwlzY2NwX3dyaXRlKGRhdGEsICZzY2NwX3Nzbl9ic3NhcCwgJnNjY3Bfc3NuX2Jzc2FwLCAwKTsKKworCWlmICghbWF0Y2hlZCkKKwkgICAgRkFJTCgiVGFsa2luZyB3aXRoIHVzIGRpZG4ndCB3b3JrXG4iKTsKKworCW1zZ2JfZnJlZShkYXRhKTsKK30KKworCisvKiBjb25uZWN0aW9uIHRlc3RpbmcuLi4gb3Blbiwgc2VuZCwgY2xvc2UgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0ICpjdXJyZW50X2Nvbl90ZXN0Oworc3RhdGljIHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKm91dGdvaW5nX2NvbjsKK3N0YXRpYyBzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICppbmNvbWluZ19jb247CitzdGF0aWMgaW50IG91dGdvaW5nX2RhdGEsIGluY29taW5nX2RhdGEsIGluY29taW5nX3N0YXRlLCBvdXRnb2luZ19zdGF0ZTsKKworc3RhdGljIHN0cnVjdCBtc2diICp0ZXN0X2RhdGExLCAqdGVzdF9kYXRhMiwgKnRlc3RfZGF0YTM7CisKK3N0YXRpYyB2b2lkIHNjY3BfY29ubl9pbl9zdGF0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBpbnQgb2xkX3N0YXRlKQoreworCXByaW50ZigiXHRpbmNvbWU6ICVkIC0+ICVkXG4iLCBvbGRfc3RhdGUsIGNvbm4tPmNvbm5lY3Rpb25fc3RhdGUpOworCWlmIChjb25uLT5jb25uZWN0aW9uX3N0YXRlID49IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKSB7CisJCWlmIChjb25uID09IGluY29taW5nX2NvbikgeworCQkJc2NjcF9jb25uZWN0aW9uX2ZyZWUoY29ubik7CisJCQlpbmNvbWluZ19jb24gPSBOVUxMOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2NwX2Nvbm5faW5fZGF0YShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCS8qIGNvbXBhcmUgdGhlIGRhdGEgKi8KKwkrK2luY29taW5nX2RhdGE7CisJcHJpbnRmKCJcdGluY29taW5nIGRhdGE6ICVkXG4iLCBsZW4pOworCisJLyogY29tcGFyZSB0aGUgZGF0YSAqLworCWlmIChsZW4gIT0gNCkgeworCQlGQUlMKCJMZW5ndGggb2YgcGFja2V0IGlzIHdyb25nOiAldSAldVxuIiwgbXNnYl9sM2xlbihtc2cpLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJaWYgKGluY29taW5nX2RhdGEgPT0gMSkgeworCQlpZiAobWVtY21wKG1zZy0+bDNoLCB0ZXN0X2RhdGExLT5sM2gsIGxlbikgIT0gMCkgeworCQkJRkFJTCgiQ29tcGFyaW5nIHRoZSBkYXRhIGZhaWxlZDogJWRcbiIsIGluY29taW5nX2RhdGEpOworCQkJaW5jb21pbmdfc3RhdGUgPSAwOworCQkJcHJpbnRmKCJHb3Q6ICAgICVzXG4iLCBoZXhkdW1wKG1zZy0+bDNoLCBsZW4pKTsKKwkJCXByaW50ZigiV2FudGVkOiAlc1xuIiwgaGV4ZHVtcCh0ZXN0X2RhdGExLT5sM2gsIGxlbikpOworCisJCX0KKwl9IGVsc2UgaWYgKGluY29taW5nX2RhdGEgPT0gMikgeworCQlpZiAobWVtY21wKG1zZy0+bDNoLCB0ZXN0X2RhdGEyLT5sM2gsIGxlbikgIT0gMCkgeworCQkJRkFJTCgiQ29tcGFyaW5nIHRoZSBkYXRhIGZhaWxlZDogJWRcbiIsIGluY29taW5nX2RhdGEpOworCQkJaW5jb21pbmdfc3RhdGUgPSAwOworCQkJcHJpbnRmKCJHb3Q6ICAgICVzXG4iLCBoZXhkdW1wKG1zZy0+bDNoLCBsZW4pKTsKKwkJCXByaW50ZigiV2FudGVkOiAlc1xuIiwgaGV4ZHVtcCh0ZXN0X2RhdGEyLT5sM2gsIGxlbikpOworCQl9CisJfQorCisJLyogc2VuZGluZyBvdXQgZGF0YSAqLworCWlmIChpbmNvbWluZ19kYXRhID09IDIpIHsKKwkJcHJpbnRmKCJcdFJldHVybmluZyBkYXRhM1xuIik7CisJCXNjY3BfY29ubmVjdGlvbl93cml0ZShjb25uLCB0ZXN0X2RhdGEzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2NjcF9jb25uX2FjY2VwdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCB2b2lkICpjdHgpCit7CisJcHJpbnRmKCJcdGFjY2VwdDogJXBcbiIsIGNvbm4pOworCWNvbm4tPnN0YXRlX2NiID0gc2NjcF9jb25uX2luX3N0YXRlOworCWNvbm4tPmRhdGFfY2IgPSBzY2NwX2Nvbm5faW5fZGF0YTsKKworCWlmIChjdXJyZW50X2Nvbl90ZXN0LT5yZWZ1c2UpCisJCXJldHVybiAtMTsKKworCWluY29taW5nX2NvbiA9IGNvbm47CisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrcyBmb3IgdGhlIG91dGdvaW5nIHNpZGUgKi8KK3N0YXRpYyB2b2lkIHNjY3BfY29ubl9vdXRfc3RhdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgaW50IG9sZF9zdGF0ZSkKK3sKKwlwcmludGYoIlx0b3V0Z29pbmc6ICVwICVkIC0+ICVkXG4iLCBjb25uLCBvbGRfc3RhdGUsIGNvbm4tPmNvbm5lY3Rpb25fc3RhdGUpOworCisJaWYgKGNvbm4tPmNvbm5lY3Rpb25fc3RhdGUgPj0gU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpIHsKKwkJaWYgKGNvbm4gPT0gb3V0Z29pbmdfY29uKSB7CisJCQlzY2NwX2Nvbm5lY3Rpb25fZnJlZShjb25uKTsKKwkJCW91dGdvaW5nX2NvbiA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjY3BfY29ubl9vdXRfZGF0YShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCSsrb3V0Z29pbmdfZGF0YTsKKwlwcmludGYoIlx0b3V0Z29pbmcgZGF0YTogJXAgJWRcbiIsIGNvbm4sIGxlbik7CisKKwlpZiAobGVuICE9IDQpCisJCUZBSUwoIkxlbmd0aCBvZiBwYWNrZXQgaXMgd3Jvbmc6ICV1ICV1XG4iLCBtc2diX2wzbGVuKG1zZyksIGxlbik7CisKKwlpZiAob3V0Z29pbmdfZGF0YSA9PSAxKSB7CisJCWlmIChtZW1jbXAobXNnLT5sM2gsIHRlc3RfZGF0YTMtPmwzaCwgbGVuKSAhPSAwKSB7CisJCQlGQUlMKCJDb21wYXJpbmcgdGhlIGRhdGEgZmFpbGVkXG4iKTsKKwkJCW91dGdvaW5nX3N0YXRlID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZG9fdGVzdF9zY2NwX2Nvbm5lY3Rpb24oY29uc3Qgc3RydWN0IGNvbm5lY3Rpb25fdGVzdCAqdGVzdCkKK3sKKwlpbnQgcmV0OworCisJY3VycmVudF9jb25fdGVzdCA9IHRlc3Q7CisJb3V0Z29pbmdfY29uID0gaW5jb21pbmdfY29uID0gMDsKKworCW91dGdvaW5nX2NvbiA9IHNjY3BfY29ubmVjdGlvbl9zb2NrZXQoKTsKKwlpZiAoIW91dGdvaW5nX2NvbikgeworCQlGQUlMKCJDb25uZWN0aW9uIGlzIE5VTExcbiIpOworCQlyZXR1cm47CisJfQorCisJb3V0Z29pbmdfY29uLT5zdGF0ZV9jYiA9IHNjY3BfY29ubl9vdXRfc3RhdGU7CisJb3V0Z29pbmdfY29uLT5kYXRhX2NiID0gc2NjcF9jb25uX291dF9kYXRhOworCW91dGdvaW5nX2RhdGEgPSBpbmNvbWluZ19kYXRhID0gMDsKKwlpbmNvbWluZ19zdGF0ZSA9IG91dGdvaW5nX3N0YXRlID0gMTsKKworCS8qIHN0YXJ0IHRlc3RpbmcgKi8KKwlpZiAodGVzdC0+d2l0aF9kYXRhKSB7CisJCWlmIChzY2NwX2Nvbm5lY3Rpb25fY29ubmVjdChvdXRnb2luZ19jb24sICZzY2NwX3Nzbl9ic3NhcCwgdGVzdF9kYXRhMSkgIT0gMCkKKwkJCUZBSUwoIkJpbmRpbmcgZmFpbGVkXG4iKTsKKwl9IGVsc2UgeworCQkrK2luY29taW5nX2RhdGE7CisJCWlmIChzY2NwX2Nvbm5lY3Rpb25fY29ubmVjdChvdXRnb2luZ19jb24sICZzY2NwX3Nzbl9ic3NhcCwgTlVMTCkgIT0gMCkKKwkJCUZBSUwoIkJpbmRpbmcgZmFpbGVkXG4iKTsKKwl9CisKKwlpZiAodGVzdC0+cmVmdXNlKSB7CisJCWlmIChvdXRnb2luZ19jb24pCisJCQlGQUlMKCJPdXRnb2luZyBjb25uZWN0aW9uIHNob3VsZCBoYXZlIGJlZW4gcmVmdXNlZC5cbiIpOworCX0gZWxzZSB7CisJCWlmICghaW5jb21pbmdfY29uKQorCQkJRkFJTCgiQ3JlYXRpbmcgaW5jb21pbmcgZGlkbid0IHdvcmsuXG4iKTsKKworCQlwcmludGYoIlx0V3JpdGluZyB0ZXN0IGRhdGEyXG4iKTsKKwkJc2NjcF9jb25uZWN0aW9uX3dyaXRlKG91dGdvaW5nX2NvbiwgdGVzdF9kYXRhMik7CisJCXNjY3BfY29ubmVjdGlvbl9zZW5kX2l0KG91dGdvaW5nX2Nvbik7CisKKwkJLyogY2xvc2luZyBjb25uZWN0aW9uICovCisJCWlmICh0ZXN0LT5jbG9zZV9zaWRlID09IDApCisJCQlyZXQgPSBzY2NwX2Nvbm5lY3Rpb25fY2xvc2Uob3V0Z29pbmdfY29uLCAwKTsKKwkJZWxzZQorCQkJcmV0ID0gc2NjcF9jb25uZWN0aW9uX2Nsb3NlKGluY29taW5nX2NvbiwgMCk7CisKKwkJaWYgKHJldCAhPSAwKQorCQkJRkFJTCgiQ2xvc2luZyB0aGUgY29ubmVjdGlvbiBmYWlsZWRcbiIpOworCX0KKworCS8qIG91dGdvaW5nIHNob3VsZCBiZSBnb25lIG5vdyAqLworCWlmIChvdXRnb2luZ19jb24pCisJCUZBSUwoIk91dGdvaW5nIGNvbm5lY3Rpb24gd2FzIG5vdCBwcm9wZXJseSBjbG9zZWRcbiIpOworCisJaWYgKGluY29taW5nX2NvbikKKwkJRkFJTCgiSW5jb21pbmcgY29ubmVjdGlvbiB3YXMgbm90IHByb3BlcnkgY2xvc2VkLlxuIik7CisKKwlpZiAodGVzdC0+cmVmdXNlID09IDApIHsKKwkJaWYgKG91dGdvaW5nX2RhdGEgIT0gMSB8fCBpbmNvbWluZ19kYXRhICE9IDIpIHsKKwkJCUZBSUwoIkRhdGEgc2VuZGluZyBmYWlsZWQ6ICVkLyVkICVkLyVkXG4iLAorCQkJICAgICBvdXRnb2luZ19kYXRhLCAxLAorCQkJICAgICBpbmNvbWluZ19kYXRhLCAyKTsKKwkJfQorCX0KKworCWlmICghaW5jb21pbmdfc3RhdGUgfHwgIW91dGdvaW5nX3N0YXRlKQorCQlGQUlMKCJGYWlsdXJlIHdpdGggdGhlIHN0YXRlIHRyYW5zaXRpb24uICVkICVkXG4iLAorCQkgICAgIG91dGdvaW5nX3N0YXRlLCBpbmNvbWluZ19zdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9jb25uZWN0aW9uKHZvaWQpCit7CisJc2NjcF9zeXN0ZW1faW5pdChzY2NwX3dyaXRlX2xvb3AsIE5VTEwpOworCXNjY3Bfc2V0X3JlYWQoTlVMTCwgTlVMTCwgTlVMTCk7CisJc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZygmc2NjcF9zc25fYnNzYXAsIHNjY3BfY29ubl9hY2NlcHQsIE5VTEwpOworCisJdGVzdF9kYXRhMSA9IG1zZ2JfYWxsb2MoNCwgImRhdGExIik7CisJdGVzdF9kYXRhMS0+bDNoID0gbXNnYl9wdXQodGVzdF9kYXRhMSwgNCk7CisJKigodW5zaWduZWQgaW50Kil0ZXN0X2RhdGExLT5sM2gpID0gMHgyMzQyMTEyMjsKKworCXRlc3RfZGF0YTIgPSBtc2diX2FsbG9jKDQsICJkYXRhMiIpOworCXRlc3RfZGF0YTItPmwzaCA9IG1zZ2JfcHV0KHRlc3RfZGF0YTIsIDQpOworCSooKHVuc2lnbmVkIGludCopdGVzdF9kYXRhMi0+bDNoKSA9IDB4NDIyMzIyMTE7CisKKwl0ZXN0X2RhdGEzID0gbXNnYl9hbGxvYyg0LCAiZGF0YTMiKTsKKwl0ZXN0X2RhdGEzLT5sM2ggPSBtc2diX3B1dCh0ZXN0X2RhdGEzLCA0KTsKKwkqKCh1bnNpZ25lZCBpbnQqKXRlc3RfZGF0YTMtPmwzaCkgPSAweDIzMjNmZjU1OworCisKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUoY29ubmVjdGlvbl90ZXN0cyk7ICsrY3VycmVudF90ZXN0KSB7CisJCXByaW50ZigiVGVzdGluZyAlZCByZWZ1c2U6ICVkIHdpdGhfZGF0YTogJWRcbiIsCisJCQljdXJyZW50X3Rlc3QsIGNvbm5lY3Rpb25fdGVzdHNbY3VycmVudF90ZXN0XS5yZWZ1c2UsCisJCQljb25uZWN0aW9uX3Rlc3RzW2N1cnJlbnRfdGVzdF0ud2l0aF9kYXRhKTsKKwkJZG9fdGVzdF9zY2NwX2Nvbm5lY3Rpb24oJmNvbm5lY3Rpb25fdGVzdHNbY3VycmVudF90ZXN0XSk7CisJfQorCisJbXNnYl9mcmVlKHRlc3RfZGF0YTEpOworCW1zZ2JfZnJlZSh0ZXN0X2RhdGEyKTsKKwltc2diX2ZyZWUodGVzdF9kYXRhMyk7Cit9CisKKy8qIGludmFsaWQgaW5wdXQgKi8KK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9zeXN0ZW1fY3Jhc2godm9pZCkKK3sKKwlwcmludGYoInRyeWluZyB0byBwcm92b2tlIGEgY3Jhc2ggd2l0aCBpbnZhbGlkIGlucHV0XG4iKTsKKwlzY2NwX3NldF9yZWFkKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9yZWFkX2NiLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9hY2NlcHRfY2IsIE5VTEwpOworCisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHRlc3RfZGF0YSk7ICsrY3VycmVudF90ZXN0KSB7CisJCWludCBvcmlnaW5hbF9sZW5ndGggPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGg7CisJCWludCBsZW5ndGggPSBvcmlnaW5hbF9sZW5ndGggKyAyOworCQlpbnQgaTsKKworCQlwcmludGYoIlRlc3RpbmcgcGFja2V0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKworCQlmb3IgKGkgPSBsZW5ndGg7IGkgPj0gMDsgLS1pKSB7CisJCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gTUlOKHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aCwgaSk7CisJCQlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShsZW5ndGggKyAyLCAyLCBfX2Z1bmNfXyk7CisJCQltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgbGVuZ3RoKTsKKwkJCW1lbWNweShtc2ctPmwyaCwgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZGF0YSwgbGVuZ3RoKTsKKwkJCXNjY3Bfc3lzdGVtX2luY29taW5nKG1zZyk7CisJCQltc2diX2ZyZWUobXNnKTsKKwkJfQorCX0KKworCXByaW50Zigic3Vydml2ZWRcbiIpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3BfcGFyc2luZyh2b2lkKQoreworCWZvciAoY3VycmVudF90ZXN0ID0gMDsgY3VycmVudF90ZXN0IDwgQVJSQVlfU0laRShwYXJzZV9yZXN1bHQpOyArK2N1cnJlbnRfdGVzdCkgeworCQlzdHJ1Y3QgbXNnYiAqbXNnOworCQlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCisJCW1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oMTAyNCwgMTI4LCAicGFyc2UtdGVzdCIpOworCQltc2diX3B1dChtc2csIDEpOworCQltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgcGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uaW5wdXRfbGVuKTsKKwkJbWVtY3B5KG1zZy0+bDJoLCBwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5pbnB1dCwgbXNnYl9sMmxlbihtc2cpKTsKKworCQltZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKHJlc3VsdCkpOworCQlpZiAoc2NjcF9wYXJzZV9oZWFkZXIobXNnLCAmcmVzdWx0KSAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBzY2NwIHBhcnNlIHRlc3Q6ICVkXG4iLCBjdXJyZW50X3Rlc3QpOworCQl9IGVsc2UgeworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLndhbnRlZF9sZW4gIT0gcmVzdWx0LmRhdGFfbGVuKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIGRhdGEgbGVuZ3RoLlxuIik7CisJCQkJYWJvcnQoKTsKKwkJCX0KKworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmhhc19zcmNfcmVmKSB7CisJCQkJaWYgKG1lbWNtcChyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCQkJICAgJnBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLnNyY19yZWYsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSkgIT0gMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlNSQyBSRUYgZGlkIG5vdCBtYXRjaFxuIik7CisJCQkJCWFib3J0KCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAocGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uaGFzX2RzdF9yZWYpIHsKKwkJCQlpZiAobWVtY21wKHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkJCSAgICZwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5kc3RfcmVmLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpICE9IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJEU1QgUkVGIGRpZCBub3QgbWF0Y2hcbiIpOworCQkJCQlhYm9ydCgpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLnNyY19zc24gIT0gLTEpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBpbXBsZW1lbnRlZC5cbiIpOworCQkJCWFib3J0KCk7CisJCQl9CisKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5kc3Rfc3NuICE9IC0xKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJOb3QgaW1wbGVtZW50ZWQuXG4iKTsKKwkJCQlhYm9ydCgpOworCQkJfQorCQl9CisKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl0ZXN0X3NjY3Bfc3lzdGVtKCk7CisJdGVzdF9zY2NwX3NlbmRfdWR0KCk7CisJdGVzdF9zY2NwX3VkdF9jb21tdW5pY2F0aW9uKCk7CisJdGVzdF9zY2NwX2Nvbm5lY3Rpb24oKTsKKwl0ZXN0X3NjY3Bfc3lzdGVtX2NyYXNoKCk7CisJdGVzdF9zY2NwX3BhcnNpbmcoKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkYl9zdG9yZV9jb3VudGVyKCkge30KZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvc21zLnR4dCBiL29wZW5ic2MvdGVzdHMvc21zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmM4ODViCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9zbXMudHh0CkBAIC0wLDAgKzEsNTAgQEAKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDFkIDM5IDAxIDFhIDAwIDAxIDAwIDA3IDkxIDU1IDExIDE4IDMxIDI4IDAwIDBlIDMxIDIwIDA0IDgxIDIxIDQzIDAwIDAwIGZmIDA0IGQ0IGYyIDljIDBlCisKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDFkIC0KKzM5IC0gVHJhbnNhY3Rpb25JRCAzLCBTTVMgbWVzc2FnZXMJOjogZ2gtPnByb3RvX2Rpc2NyCiswMSAtIENQLURBVEEJCQkJOjogZ2gtPm1zZ190eXBlCisxYSAtIExlbmd0aDogMjYJCQkJOjogZ2gtPmRhdGFbMF0KKzAwIC0gTVRJIDAgUlAtREFUQSAobXMtPm4pCiswMSAtIE1SIDEKKzAwIC0gUlAtT0EKKzA3IC0gUlAtREEgKFNNU0MgTGVuZ3RoKQorOTEgLSBJbnRlcm5hdGlvbmFsIE5vLCBOdW1iZXJpbmcgUGxhbgorNTUgMTEgMTggMzEgMjggMDAgLSA1NTExODExMzgyMDAKKzBlIC0gUlAtVUQgbGVuICgxNCkKKworVFBEVSAoMTQgYnl0ZSk6CiszMSAtIE1USSgwMSksIFZQRigyOnJlbGF0aXZlKSwgTU1TKDApLCBTUkkoMSksIFVESEkoMCksIFJQKDApCisyMCAtIE1lc3NhZ2UgUmVmZXJlbmNlCiswNCAtIERBIGxlbmd0aAorODEgLSBOdW1iZXJpbmcgUGxhbiwgTmF0aW9uYWwgbnVtYmVyCisyMSA0MyAtIERBIDEyMzQKKzAwIC0gUElECiswMCAtIERDUworZmYgLSBWYWxpZGl0eSBwZXJpb2QKKzA0IC0gVXNlciBEYXRhIGxlbmd0aCAoMDQpCitkNCBmMiA5YyAwZSAtIGdzbV9kZWZhdWx0IDdiaXQgZW5jb2RlZCAiVGVzdCIgKDQgYnl0ZSkKKworMDMgMDIgMDEgMGEgMDIgNDMgMGIgMDAgOWYgMDkgMDEgOWMgMDAgZGEgMDAgMDcgOTEgODggOTYgMTMgMDAgMDAgOTkgOTAgMTEgN2IgMDQgODEgMjIgMjIgMDAgMDggZmYgODYgNmMgMzggOGMgNTAgOTIgODAgODggNGMgMDAgNGQgMDAgNGQgMDAgNDEgNmEgMTkgNjcgMDMgNzQgMDYgOGMgYTEgN2QgYjIgMDAgMjAgMDAgMjAgNTEgNjggNzQgMDMgOTkgOTYgNTIgNzUgN2QgYjIgOGQgZWYgNmEgMTkgNjcgMDMgZmYgMGMgNmEgMTkgNjcgMDMgOTYgZjYgOTggYTggOTYgYWEgZmYgMDEgOGIgOTMgNjAgYTggODAgNzAgNjYgMGUgNTEgMzIgODQgYzQgZmYgMGMgOTcgNDggNmQgM2IgNjIgOTUgOGMgYzcgZmYgMDEgNzMgZmUgNTcgMjggNTIgYTAgNTEgNjUgOTAgMDEgOTYgNTAgOTEgY2YgNTkgMjcgODAgNmYgNzYgZGYgNmQgMGIgNTcgZmEgOTYgOGEgOTEgNzcgNWUgNjMgNTMgNjEgZmYgMGMgOGEgY2IgNGUgMGEgN2QgYjIgNjQgMWMgNWMgMGIgMzAgMGMgNmEgMTkgNjcgMDMgMzAgMGQKKworMDMgMDIgMDEgMGEgMDIgNDMgMGIgMDAgOWYgLSBsb3dlciBsZXZlbHMKKzA5IC0gVHJhbnNhY3Rpb25JRCAwLCBTTVMgbWVzc2FnZXMKKzAxIC0gQ1AtREFUQQorOWMgLSBMZW5ndGg6ICgxNTYpCiswMCAtIE1USSAwIFJQLURBVEEgKG1zLT5uKQorZGEgLSBNUiAoPykKKzAwIC0gUlAtT0EKKzA3IC0gUlAtREEgKFNNU0MgTGVuZ3RoKQorOTEgLSBJbnRlcm5hdGlvbmFsIE5vLgorODggOTYgMTMgMDAgMDAgOTkKKzkwIC0gUlAtVUQgbGVuICgxNDQpCisxMSAtCis3YiAtIE1lc3NhZ2UgUmVmZXJlbmNlCiswNCAtIERBIGxlbmd0aAorODEgLSBOdW1iZXJpbmcgUGxhbgorMjIgMjIgLSBBZGRyZXNzIDIyMjIKKzAwIC0gUElECiswOCAtIERDUyAoVUNTMiBjaGFyc2V0KQorZmYgLSBWYWxpZGl0eSBwZXJpb2QKKzg2IC0gVXNlciBEYXRhIGxlbmd0aCAoMTM0KQorNmMgMzggOGMgNTAgOTIgODAgODggNGMgMDAgNGQgMDAgNGQgMDAgNDEgNmEgMTkgNjcgMDMgNzQgMDYgOGMgYTEgN2QgYjIgMDAgMjAgMDAgMjAgNTEgNjggNzQgMDMgOTkgOTYgNTIgNzUgN2QgYjIgOGQgZWYgNmEgMTkgNjcgMDMgZmYgMGMgNmEgMTkgNjcgMDMgOTYgZjYgOTggYTggOTYgYWEgZmYgMDEgOGIgOTMgNjAgYTggODAgNzAgNjYgMGUgNTEgMzIgODQgYzQgZmYgMGMgOTcgNDggNmQgM2IgNjIgOTUgOGMgYzcgZmYgMDEgNzMgZmUgNTcgMjggNTIgYTAgNTEgNjUgOTAgMDEgOTYgNTAgOTEgY2YgNTkgMjcgODAgNmYgNzYgZGYgNmQgMGIgNTcgZmEgOTYgOGEgOTEgNzcgNWUgNjMgNTMgNjEgZmYgMGMgOGEgY2IgNGUgMGEgN2QgYjIgNjQgMWMgNWMgMGIgMzAgMGMgNmEgMTkgNjcgMDMgMzAgMGQKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90b29scy9obHJzdGF0LnBsIGIvb3BlbmJzYy90b29scy9obHJzdGF0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY2OGZjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rvb2xzL2hscnN0YXQucGwKQEAgLTAsMCArMSw3MyBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3VzZSBzdHJpY3Q7Cit1c2UgREJJOworbXkgJGRiaCA9IERCSS0+Y29ubmVjdCgiZGJpOlNRTGl0ZTpkYm5hbWU9aGxyLnNxbGl0ZTMiLCIiLCIiKTsKKworCitteSAlbWNjX25hbWVzOworbXkgJW1jY19tbmNfbmFtZXM7CisKK3N1YiBnZXRfbWNjX21uY19uYW1lKCQpCit7CisJbXkgJG1jY19tbmMgPSBzaGlmdDsKKwlteSAkcmV0ID0gJG1jY19tbmM7CisKKwlpZiAoJG1jY19tbmNfbmFtZXN7JG1jY19tbmN9IG5lICcnKSB7CisJCSRyZXQgPSAkbWNjX21uY19uYW1lc3skbWNjX21uY307CisJfQorCisJcmV0dXJuICRyZXQ7Cit9CisKK3N1YiByZWFkX25ldHdvcmtzKCQpCit7CisJbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisJbXkgJGN1cl9uYW1lOworCisJb3BlbihJTkZJTEUsICRmaWxlbmFtZSk7CisJd2hpbGUgKG15ICRsID0gPElORklMRT4pIHsKKwkJY2hvbXAoJGwpOworCQlpZiAoJGwgPX4gL14jLykgeworCQkJbmV4dDsKKwkJfQorCQlpZiAoJGwgPX4gL15cdC8pIHsKKwkJCW15ICgkbWNjLCAkbW5jLCAkYnJhbmQsICRyKSA9IHNwbGl0KCcgJywgJGwsIDQpOworCQkJI3ByaW50ZigiJXN8JXN8JXNcbiIsICRtY2MsICRtbmMsICRicmFuZCk7CisJCQkkbWNjX21uY19uYW1lc3siJG1jYy0kbW5jIn0gPSAkYnJhbmQ7CisJCQkkbWNjX25hbWVzeyRtY2N9ID0gJGN1cl9uYW1lOworCQl9IGVsc2lmICgkbCA9fiAvXihcd1x3KVx0KC4qKS8pIHsKKwkJCSNwcmludGYoIiVzfCVzXG4iLCAkMSwgJDIpOworCQkJJGN1cl9uYW1lID0gJDI7CisJCX0KKwl9CisJY2xvc2UoSU5GSUxFKTsKK30KKworcmVhZF9uZXR3b3JrcygibmV0d29ya3MudGFiIik7CisKK215ICVvcGVyX2NvdW50OworbXkgJWNvdW50cnlfY291bnQ7CisKKyNteSAkc3RoID0gJGRiaC0+cHJlcGFyZSgiU0VMRUNUIGltc2kgRlJPTSBzdWJzY3JpYmVyIHdoZXJlIGF1dGhvcml6ZWQ9MSIpOworbXkgJHN0aCA9ICRkYmgtPnByZXBhcmUoIlNFTEVDVCBpbXNpIEZST00gc3Vic2NyaWJlciIpOworCiskc3RoLT5leGVjdXRlKCk7CisKK3doaWxlIChteSAkaHJlZiA9ICRzdGgtPmZldGNocm93X2hhc2hyZWYpIHsKKwlteSAoJG1jYywgJG1uYykgPSAkJGhyZWZ7aW1zaX0gPX4gLyhcZHszfSkoXGR7Mn0pLiovOworCSNwcmludGYoIiVzICVzLSVzIFxuIiwgJCRocmVme2ltc2l9LCAkbWNjLCAkbW5jKTsKKwkkb3Blcl9jb3VudHsiJG1jYy0kbW5jIn0rKzsKKwkkY291bnRyeV9jb3VudHskbWNjfSsrOworfQorCisKK2ZvcmVhY2ggbXkgJGMgKHNvcnR7JGNvdW50cnlfY291bnR7JGJ9IDw9PiAkY291bnRyeV9jb3VudHskYX19IGtleXMgJWNvdW50cnlfY291bnQpIHsKKwlwcmludGYoIiVzOiAlZFxuIiwgJG1jY19uYW1lc3skY30sICRjb3VudHJ5X2NvdW50eyRjfSk7CisKKwlmb3JlYWNoIG15ICRrIChzb3J0eyRvcGVyX2NvdW50eyRifSA8PT4gJG9wZXJfY291bnR7JGF9fSBrZXlzICVvcGVyX2NvdW50KSB7CisJCWlmICgkayA9fiAvXiRjLS8pIHsKKwkJCXByaW50ZigiXHQlczogJWRcbiIsIGdldF9tY2NfbW5jX25hbWUoJGspLCAkb3Blcl9jb3VudHska30pOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvLmdpdGlnbm9yZSBiL3JybHAtZXBoZW1lcmlzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiNDVlNAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0IEBACithc24xX2dlbi8qCisqLm8KKyouYQorcnJscC10ZXN0CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9DT1BZSU5HIGIvcnJscC1lcGhlbWVyaXMvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDcwODhlCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvQ09QWUlORwpAQCAtMCwwICsxLDIgQEAKK1NlZSB0aGUgaW5jbHVkZWQgZ3BsLTIuMC50eHQgb3IgZ3BsLTMuMC50eHQgZGVwZW5kaW5nIG9uIHlvdXIKK3ByZWZlcmVuY2VzLgpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvTWFrZWZpbGUgYi9ycmxwLWVwaGVtZXJpcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDJjYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvTWFrZWZpbGUKQEAgLTAsMCArMSw0NCBAQAorCitBU04xQz0uLi8uLi8uLi90bXAvcnJscC9hc24xYy9hc24xYy9hc24xYworQVNOMV9JTkNMVURFPS9ob21lL3RudC90bXAvcnJscC9hc24xYy9za2VsZXRvbnMKK0NDPWdjYworQ0ZMQUdTPS1JJChBU04xX0lOQ0xVREUpIC1JYXNuMV9nZW4gLU8zIC1XYWxsCisKK0FTTjFfRklMRVM9JCh3aWxkY2FyZCBhc24xLyouYXNuKQorCisKK2FsbDogcnJscC10ZXN0CisKKworcnJscC10ZXN0OiBsaWJnc20tYXNuMS5hIGdwcy5vIHVieC5vIHVieC1wYXJzZS5vIHJybHAubyBtYWluLm8KKwkkKENDKSAtbyAkQCBncHMubyB1YngubyB1YngtcGFyc2UubyBycmxwLm8gbWFpbi5vIC1MLiAtbGdzbS1hc24xIC1sbQorCisKKyMKKyMgQVNOMSBmaWxlIGF1dG9nZW5lcmF0aW9uIChuZWVkIHJlY3Vyc2l2ZSBtYWtlZmlsZSBjYWxsKQorIworCitBU04xX1NPVVJDRVMgPSAkKHdpbGRjYXJkIGFzbjFfZ2VuLyouYykKK0FTTjFfT0JKRUNUUyA9ICQoQVNOMV9TT1VSQ0VTOi5jPS5vKQorCitsaWJnc20tYXNuMS5hOiAkKEFTTjFfRklMRVMpCisJbWtkaXIgLXAgYXNuMV9nZW4gJiYgXAorCWNkIGFzbjFfZ2VuICYmIFwKKwkkKEFTTjFDKSAtZnNrZWxldG9ucy1jb3B5IC1mbmF0aXZlLXR5cGVzIC1nZW4tUEVSICQoYWRkcHJlZml4IC4uLywkXikKKwlAcm0gYXNuMV9nZW4vY29udmVydGVyLXNhbXBsZS5jIGFzbjFfZ2VuL01ha2VmaWxlLmFtLnNhbXBsZQorCUAkKE1BS0UpIGxpYmdzbS1hc24xLmEuc3VibWFrZQorCitsaWJnc20tYXNuMS5hLnN1Ym1ha2U6ICQoQVNOMV9PQkpFQ1RTKQorCSQoQVIpIHJjcyBsaWJnc20tYXNuMS5hICReCisKKy5QSE9OWTogbGliZ3NtLWFzbjEuYS5zdWJtYWtlCisKKworIworIyBDbGVhbgorIworCitjbGVhbjoKKwlybSAtUmYgYXNuMV9nZW4KKwlybSAtZiBsaWJnc20tYXNuMS5hICoubyBycmxwLXRlc3QKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQlMtQ29kZS5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1CUy1Db2RlLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI1MzY2Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQlMtQ29kZS5hc24KQEAgLTAsMCArMSwxMzEgQEAKKy0tICRJZDogTUFQLUJTLUNvZGUuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpIAorLS0gMTcuNy4xMAlCZWFyZXIgU2VydmljZSBDb2RlcworIAorTUFQLUJTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQlMtQ29kZSAoMjApIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCis6Oj0KKworQkVHSU4KKworQmVhcmVyU2VydmljZUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gYmVhcmVyIHNlcnZpY2UsIGEgZ3JvdXAgb2YgYmVhcmVyIHNlcnZpY2VzLCBvciBhbGwgYmVhcmVyCisJLS0gc2VydmljZXMuIFRoZSBzZXJ2aWNlcyBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAwMiBbM10uCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0KKwktLSBwbG1uLXNwZWNpZmljIGJlYXJlciBzZXJ2aWNlczoKKwktLSBiaXRzIDg3NjU0MzIxOiBkZWZpbmVkIGJ5IHRoZSBIUExNTiBvcGVyYXRvcgorCisJLS0gcmVzdCBvZiBiZWFyZXIgc2VydmljZXM6CisJLS0gYml0IDg6IDAgKHVudXNlZCkKKwktLSBiaXRzIDc2NTQzMjE6IGdyb3VwIChiaXRzIDc2NTQpLCBhbmQgcmF0ZSwgaWYgYXBwbGljYWJsZQorCS0tIChiaXRzIDMyMSkKKworRXh0LUJlYXJlclNlcnZpY2VDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQorCS0tIGJlYXJlciBzZXJ2aWNlLCBhIGdyb3VwIG9mIGJlYXJlciBzZXJ2aWNlcywgb3IgYWxsIGJlYXJlcgorCS0tIHNlcnZpY2VzLiBUaGUgc2VydmljZXMgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMDIgWzNdLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tCisJLS0gT0NURVQgMToKKwktLSBwbG1uLXNwZWNpZmljIGJlYXJlciBzZXJ2aWNlczoKKwktLSBiaXRzIDg3NjU0MzIxOiBkZWZpbmVkIGJ5IHRoZSBIUExNTiBvcGVyYXRvcgorCS0tCisJLS0gcmVzdCBvZiBiZWFyZXIgc2VydmljZXM6CisJLS0gYml0IDg6IDAgKHVudXNlZCkKKwktLSBiaXRzIDc2NTQzMjE6IGdyb3VwIChiaXRzIDc2NTQpLCBhbmQgcmF0ZSwgaWYgYXBwbGljYWJsZQorCS0tIChiaXRzIDMyMSkKKworCS0tIE9DVEVUUyAyLTU6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBJZiByZWNlaXZlZCB0aGUKKyAgICAtLSBFeHQtVGVsZXNlcnZpY2VDb2RlIHNoYWxsIGJlCisJLS0gdHJlYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBkZWZpbmVkIGZvciB0aGUKKwktLSBvcGVyYXRpb24gdGhhdCB1c2VzIHRoaXMgdHlwZS4gCisKKworCS0tIEV4dC1CZWFyZXJTZXJ2aWNlQ29kZSBpbmNsdWRlcyBhbGwgdmFsdWVzIGRlZmluZWQgZm9yIEJlYXJlclNlcnZpY2VDb2RlLgorCithbGxCZWFyZXJTZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDAwMDAwJ0IKKworYWxsRGF0YUNEQS1TZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDAwJ0IKK2RhdGFDREEtMzAwYnBzCQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDAxJ0IKK2RhdGFDREEtMTIwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDEwJ0IKK2RhdGFDREEtMTIwMC03NWJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDExJ0IKK2RhdGFDREEtMjQwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMTAwJ0IKK2RhdGFDREEtNDgwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMTAxJ0IKK2RhdGFDREEtOTYwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMTEwJ0IKK2dlbmVyYWwtZGF0YUNEQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMTExJ0IKKworYWxsRGF0YUNEUy1TZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMDAwJ0IKK2RhdGFDRFMtMTIwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMDEwJ0IKK2RhdGFDRFMtMjQwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMTAwJ0IKK2RhdGFDRFMtNDgwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMTAxJ0IKK2RhdGFDRFMtOTYwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMTEwJ0IKK2dlbmVyYWwtZGF0YUNEUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMTExJ0IKKworYWxsUGFkQWNjZXNzQ0EtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDAwMCdCCitwYWRBY2Nlc3NDQS0zMDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDAwMSdCCitwYWRBY2Nlc3NDQS0xMjAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMTAnQgorcGFkQWNjZXNzQ0EtMTIwMC03NWJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDExJ0IKK3BhZEFjY2Vzc0NBLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDEwMCdCCitwYWRBY2Nlc3NDQS00ODAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAxMDEnQgorcGFkQWNjZXNzQ0EtOTYwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMTEwJ0IKK2dlbmVyYWwtcGFkQWNjZXNzQ0EJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDExMSdCCisKK2FsbERhdGFQRFMtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTAwMCdCCitkYXRhUERTLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTEwMCdCCitkYXRhUERTLTQ4MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTEwMSdCCitkYXRhUERTLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTExMCdCCitnZW5lcmFsLWRhdGFQRFMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTExMSdCCisKK2FsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RBCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMTAwMDAnQgorCithbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTExMDAwJ0IKKworYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDREEJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTAwMDAwMCdCCisKK2FsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RTCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDEwMDEwMDAnQgorCistLSBUaGUgZm9sbG93aW5nIG5vbi1oaWVyYXJjaGljYWwgQ29tcG91bmQgQmVhcmVyIFNlcnZpY2UKKy0tIEdyb3VwcyBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAzMDoKK2FsbERhdGFDaXJjdWl0QXN5bmNocm9ub3VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDEwMTAwMDAnQgorCS0tIGNvdmVycyAiYWxsRGF0YUNEQS1TZXJ2aWNlcyIsICJhbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEQSIgYW5kCisJLS0gImFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RBIgorYWxsQXN5bmNocm9ub3VzU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTEwMDAwMCdCCisJLS0gY292ZXJzICJhbGxEYXRhQ0RBLVNlcnZpY2VzIiwgImFsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RBIiwKKwktLSAiYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDREEiIGFuZCAiYWxsUGFkQWNjZXNzQ0RBLVNlcnZpY2VzIgorYWxsRGF0YUNpcmN1aXRTeW5jaHJvbm91cwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMDExMDAwJ0IKKwktLSBjb3ZlcnMgImFsbERhdGFDRFMtU2VydmljZXMiLCAiYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDRFMiIGFuZAorCS0tICJhbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEUyIKK2FsbFN5bmNocm9ub3VzU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTEwMTAwMCdCCisJLS0gY292ZXJzICJhbGxEYXRhQ0RTLVNlcnZpY2VzIiwgImFsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RTIiwKKwktLSAiYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDRFMiIGFuZCAiYWxsRGF0YVBEUy1TZXJ2aWNlcyIKKy0tCistLSBDb21wb3VuZCBCZWFyZXIgU2VydmljZSBHcm91cCBDb2RlcyBhcmUgb25seSB1c2VkIGluIGNhbGwKKy0tIGluZGVwZW5kZW50IHN1cHBsZW1lbnRhcnkgc2VydmljZSBvcGVyYXRpb25zLCBpLmUuIHRoZXkKKy0tIGFyZSBub3QgdXNlZCBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSBvciBpbgorLS0gRGVsZXRlU3Vic2NyaWJlckRhdGEgbWVzc2FnZXMuCisKK2FsbFBMTU4tc3BlY2lmaWNCUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAwJ0IKK3BsbW4tc3BlY2lmaWNCUy0xCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMDEnQgorcGxtbi1zcGVjaWZpY0JTLTIJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMCdCCitwbG1uLXNwZWNpZmljQlMtMwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDExJ0IKK3BsbW4tc3BlY2lmaWNCUy00CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMDAnQgorcGxtbi1zcGVjaWZpY0JTLTUJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDEwMSdCCitwbG1uLXNwZWNpZmljQlMtNglCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTEwJ0IKK3BsbW4tc3BlY2lmaWNCUy03CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMTEnQgorcGxtbi1zcGVjaWZpY0JTLTgJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMCdCCitwbG1uLXNwZWNpZmljQlMtOQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDAxJ0IKK3BsbW4tc3BlY2lmaWNCUy1BCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMTAnQgorcGxtbi1zcGVjaWZpY0JTLUIJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTAxMSdCCitwbG1uLXNwZWNpZmljQlMtQwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAwJ0IKK3BsbW4tc3BlY2lmaWNCUy1ECUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMDEnQgorcGxtbi1zcGVjaWZpY0JTLUUJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTExMCdCCitwbG1uLXNwZWNpZmljQlMtRglCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTExJ0IKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUNvbW1vbkRhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1Db21tb25EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZDIwMmUKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1Db21tb25EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsNjMzIEBACistLSAkSWQ6IE1BUC1Db21tb25EYXRhVHlwZXMuYXNuIDMwNDcwIDIwMDktMTAtMTAgMTI6Mzc6NTZaIGtyaiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpCistLSAxNy43LjgJQ29tbW9uIGRhdGEgdHlwZXMKKworTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCisJLS0gZ2VuZXJhbCBkYXRhIHR5cGVzIGFuZCB2YWx1ZXMKKwlBZGRyZXNzU3RyaW5nLAorCUlTRE4tQWRkcmVzc1N0cmluZywKKwltYXhJU0ROLUFkZHJlc3NMZW5ndGgsCisJRlROLUFkZHJlc3NTdHJpbmcsCisJSVNETi1TdWJhZGRyZXNzU3RyaW5nLAorCUV4dGVybmFsU2lnbmFsSW5mbywgCisJRXh0LUV4dGVybmFsU2lnbmFsSW5mbywgCitBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlTaWduYWxJbmZvLAorCW1heFNpZ25hbEluZm9MZW5ndGgsCisJQWxlcnRpbmdQYXR0ZXJuLAorCVRCQ0QtU1RSSU5HLAorCisJLS0gZGF0YSB0eXBlcyBmb3IgbnVtYmVyaW5nIGFuZCBpZGVudGlmaWNhdGlvbgorCUlNU0ksCisJVE1TSSwgCisJSWRlbnRpdHksCisJU3Vic2NyaWJlcklkLAorCUlNRUksCisJSExSLUxpc3QsCisJTE1TSSwKKwlHbG9iYWxDZWxsSWQsCisJTmV0d29ya1Jlc291cmNlLAorCUFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UsCisJTkFFQS1QcmVmZXJyZWRDSSwgCisJTkFFQS1DSUMsIAorCUFTQ0ktQ2FsbFJlZmVyZW5jZSwKKwlTdWJzY3JpYmVySWRlbnRpdHksCisJUExNTi1JZCwKKworCS0tIGRhdGEgdHlwZXMgZm9yIENBTUVMCisJQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUksIAorCUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZEZpeGVkTGVuZ3RoLAorCUxBSUZpeGVkTGVuZ3RoLAorCisJLS0gZGF0YSB0eXBlcyBmb3Igc3Vic2NyaWJlciBtYW5hZ2VtZW50CisJQmFzaWNTZXJ2aWNlQ29kZSwKKwlFeHQtQmFzaWNTZXJ2aWNlQ29kZSwKKwlFTUxQUC1JbmZvLAorCUVNTFBQLVByaW9yaXR5LCAKKwlNQy1TUy1JbmZvLAorCU1heE1DLUJlYXJlcnMsCisJTUMtQmVhcmVycywKKwlFeHQtU1MtU3RhdHVzLAorCisJLS0gZGF0YSB0eXBlcyBmb3IgZ2VvZ3JhcGhpYyBsb2NhdGlvbgorCUFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbiwKKwlMQ1NDbGllbnRFeHRlcm5hbElELAorCUxDU0NsaWVudEludGVybmFsSUQsCisJTENTU2VydmljZVR5cGVJRCwKKy0tLSBXUyBhZGRlZCBleHBvcnRzIG5lZWRlZCBieSBnc21fbWFwLmFzbiAoZXh0cmEgYXNuMSBmaWxlIHRvIGhhbmRsZSBvbGRlciBwcm90LiB2ZXIuKQorCVByb3RvY29sSWQsCisJTENTU2VydmljZVR5cGVJRAkKKzsKKworSU1QT1JUUworCVRlbGVzZXJ2aWNlQ29kZSwKKwlFeHQtVGVsZXNlcnZpY2VDb2RlCitGUk9NIE1BUC1UUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVRTLUNvZGUgKDE5KSB2ZXJzaW9uMTEgKDExKX0KKworCUJlYXJlclNlcnZpY2VDb2RlLAorCUV4dC1CZWFyZXJTZXJ2aWNlQ29kZQorRlJPTSBNQVAtQlMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1CUy1Db2RlICgyMCkgdmVyc2lvbjExICgxMSl9CisKKwlTUy1Db2RlCitGUk9NIE1BUC1TUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLUNvZGUgKDE1KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorOworCisKKy0tIGdlbmVyYWwgZGF0YSB0eXBlcworCitUQkNELVNUUklORyA6Oj0gT0NURVQgU1RSSU5HCisJLS0gVGhpcyB0eXBlIChUZWxlcGhvbnkgQmluYXJ5IENvZGVkIERlY2ltYWwgU3RyaW5nKSBpcyB1c2VkIHRvCisJLS0gcmVwcmVzZW50IHNldmVyYWwgZGlnaXRzIGZyb20gMCB0aHJvdWdoIDksICosICMsIGEsIGIsIGMsIHR3bworCS0tIGRpZ2l0cyBwZXIgb2N0ZXQsIGVhY2ggZGlnaXQgZW5jb2RlZCAwMDAwIHRvIDEwMDEgKDAgdG8gOSksCisJLS0gMTAxMCAoKiksIDEwMTEgKCMpLCAxMTAwIChhKSwgMTEwMSAoYikgb3IgMTExMCAoYyk7IDExMTEgdXNlZAorCS0tIGFzIGZpbGxlciB3aGVuIHRoZXJlIGlzIGFuIG9kZCBudW1iZXIgb2YgZGlnaXRzLgorCisJLS0gYml0cyA4NzY1IG9mIG9jdGV0IG4gZW5jb2RpbmcgZGlnaXQgMm4KKwktLSBiaXRzIDQzMjEgb2Ygb2N0ZXQgbiBlbmNvZGluZyBkaWdpdCAyKG4tMSkgKzEKKworQWRkcmVzc1N0cmluZyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhBZGRyZXNzTGVuZ3RoKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgYSBudW1iZXIgZm9yIGFkZHJlc3NpbmcKKwktLSBwdXJwb3Nlcy4gSXQgaXMgY29tcG9zZWQgb2YKKwktLQlhKQlvbmUgb2N0ZXQgZm9yIG5hdHVyZSBvZiBhZGRyZXNzLCBhbmQgbnVtYmVyaW5nIHBsYW4KKwktLQkJaW5kaWNhdG9yLgorCS0tCWIpCWRpZ2l0cyBvZiBhbiBhZGRyZXNzIGVuY29kZWQgYXMgVEJDRC1TdHJpbmcuCisKKwktLSBhKQlUaGUgZmlyc3Qgb2N0ZXQgaW5jbHVkZXMgYSBvbmUgYml0IGV4dGVuc2lvbiBpbmRpY2F0b3IsIGEKKwktLQkJMyBiaXRzIG5hdHVyZSBvZiBhZGRyZXNzIGluZGljYXRvciBhbmQgYSA0IGJpdHMgbnVtYmVyaW5nCisJLS0JCXBsYW4gaW5kaWNhdG9yLCBlbmNvZGVkIGFzIGZvbGxvd3M6CisKKwktLSBiaXQgODogMSAgKG5vIGV4dGVuc2lvbikKKworCS0tIGJpdHMgNzY1OiBuYXR1cmUgb2YgYWRkcmVzcyBpbmRpY2F0b3IKKwktLQkwMDAgIHVua25vd24KKwktLQkwMDEgIGludGVybmF0aW9uYWwgbnVtYmVyCisJLS0JMDEwICBuYXRpb25hbCBzaWduaWZpY2FudCBudW1iZXIKKwktLQkwMTEgIG5ldHdvcmsgc3BlY2lmaWMgbnVtYmVyCisJLS0JMTAwICBzdWJzY3JpYmVyIG51bWJlcgorCS0tCTEwMSAgcmVzZXJ2ZWQKKwktLQkxMTAgIGFiYnJldmlhdGVkIG51bWJlcgorCS0tCTExMSAgcmVzZXJ2ZWQgZm9yIGV4dGVuc2lvbgorCisJLS0gYml0cyA0MzIxOiBudW1iZXJpbmcgcGxhbiBpbmRpY2F0b3IKKwktLQkwMDAwICB1bmtub3duCisJLS0JMDAwMSAgSVNETi9UZWxlcGhvbnkgTnVtYmVyaW5nIFBsYW4gKFJlYyBJVFUtVCBFLjE2NCkKKwktLQkwMDEwICBzcGFyZQorCS0tCTAwMTEgIGRhdGEgbnVtYmVyaW5nIHBsYW4gKElUVS1UIFJlYyBYLjEyMSkKKwktLQkwMTAwICB0ZWxleCBudW1iZXJpbmcgcGxhbiAoSVRVLVQgUmVjIEYuNjkpCisJLS0JMDEwMSAgc3BhcmUKKwktLQkwMTEwICBsYW5kIG1vYmlsZSBudW1iZXJpbmcgcGxhbiAoSVRVLVQgUmVjIEUuMjEyKQorCS0tCTAxMTEgIHNwYXJlCisJLS0JMTAwMCAgbmF0aW9uYWwgbnVtYmVyaW5nIHBsYW4KKwktLQkxMDAxICBwcml2YXRlIG51bWJlcmluZyBwbGFuCisJLS0JMTExMSAgcmVzZXJ2ZWQgZm9yIGV4dGVuc2lvbgorCisJLS0JYWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQuCisKKwktLSBiKQlUaGUgZm9sbG93aW5nIG9jdGV0cyByZXByZXNlbnRpbmcgZGlnaXRzIG9mIGFuIGFkZHJlc3MKKwktLQkJZW5jb2RlZCBhcyBhIFRCQ0QtU1RSSU5HLgorCittYXhBZGRyZXNzTGVuZ3RoICBJTlRFR0VSIDo6PSAyMAorCitJU0ROLUFkZHJlc3NTdHJpbmcgOjo9IAorCQkJQWRkcmVzc1N0cmluZyAoU0laRSAoMS4ubWF4SVNETi1BZGRyZXNzTGVuZ3RoKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgSVNETiBudW1iZXJzLgorCittYXhJU0ROLUFkZHJlc3NMZW5ndGggIElOVEVHRVIgOjo9IDkKKworRlROLUFkZHJlc3NTdHJpbmcgOjo9IAorCQkJQWRkcmVzc1N0cmluZyAoU0laRSAoMS4ubWF4RlROLUFkZHJlc3NMZW5ndGgpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBmb3J3YXJkZWQtdG8gbnVtYmVycy4gCisJLS0gSWYgTkFJID0gaW50ZXJuYXRpb25hbCB0aGUgZmlyc3QgZGlnaXRzIHJlcHJlc2VudCB0aGUgY291bnRyeSBjb2RlIChDQykKKwktLSBhbmQgdGhlIG5ldHdvcmsgZGVzdGluYXRpb24gY29kZSAoTkRDKSBhcyBmb3IgRS4xNjQuCisKK21heEZUTi1BZGRyZXNzTGVuZ3RoICBJTlRFR0VSIDo6PSAxNQorCitJU0ROLVN1YmFkZHJlc3NTdHJpbmcgOjo9IAorCQkJT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhJU0ROLVN1YmFkZHJlc3NMZW5ndGgpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBJU0ROIHN1YmFkZHJlc3Nlcy4KKwktLSBJdCBpcyBjb21wb3NlZCBvZgorCS0tCWEpCW9uZSBvY3RldCBmb3IgdHlwZSBvZiBzdWJhZGRyZXNzIGFuZCBvZGQvZXZlbiBpbmRpY2F0b3IuCisJLS0JYikJMjAgb2N0ZXRzIGZvciBzdWJhZGRyZXNzIGluZm9ybWF0aW9uLgorCisJLS0JYSkJVGhlIGZpcnN0IG9jdGV0IGluY2x1ZGVzIGEgb25lIGJpdCBleHRlbnNpb24gaW5kaWNhdG9yLCBhCisJLS0JCTMgYml0cyB0eXBlIG9mIHN1YmFkZHJlc3MgYW5kIGEgb25lIGJpdCBvZGQvZXZlbiBpbmRpY2F0b3IsCisJLS0JCWVuY29kZWQgYXMgZm9sbG93czoKKworCS0tCWJpdCA4OiAxICAobm8gZXh0ZW5zaW9uKQorCisJLS0JYml0cyA3NjU6IHR5cGUgb2Ygc3ViYWRkcmVzcworCS0tCQkwMDAgIE5TQVAgKFguMjEzL0lTTyA4MzQ4IEFEMikKKwktLQkJMDEwICBVc2VyIFNwZWNpZmllZAorCS0tCQlBbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZAorCisJLS0JYml0IDQ6IG9kZC9ldmVuIGluZGljYXRvcgorCS0tCQkwICBldmVuIG51bWJlciBvZiBhZGRyZXNzIHNpZ25hbHMKKwktLQkJMSAgb2RkIG51bWJlciBvZiBhZGRyZXNzIHNpZ25hbHMKKwktLQkJVGhlIG9kZC9ldmVuIGluZGljYXRvciBpcyB1c2VkIHdoZW4gdGhlIHR5cGUgb2Ygc3ViYWRkcmVzcworCS0tCQlpcyAidXNlciBzcGVjaWZpZWQiIGFuZCB0aGUgY29kaW5nIGlzIEJDRC4KKworCS0tCWJpdHMgMzIxOiAwMDAgKHVudXNlZCkKKworCS0tCWIpIFN1YmFkZHJlc3MgaW5mb3JtYXRpb24uCisJLS0JVGhlIE5TQVAgWC4yMTMvSVNPODM0OEFEMiBhZGRyZXNzIHNoYWxsIGJlIGZvcm1hdHRlZCBhcyBzcGVjaWZpZWQKKwktLQlieSBvY3RldCA0IHdoaWNoIGNvbnRhaW5zIHRoZSBBdXRob3JpdHkgYW5kIEZvcm1hdCBJZGVudGlmaWVyCisJLS0JKEFGSSkuIFRoZSBlbmNvZGluZyBpcyBtYWRlIGFjY29yZGluZyB0byB0aGUgInByZWZlcnJlZCBiaW5hcnkKKwktLQllbmNvZGluZyIgYXMgZGVmaW5lZCBpbiBYLjIxMy9JU084MzRBRDIuIEZvciB0aGUgZGVmaW5pdGlvbgorCS0tCW9mIHRoaXMgdHlwZSBvZiBzdWJhZGRyZXNzLCBzZWUgSVRVLVQgUmVjIEkuMzM0LgorCisJLS0JRm9yIFVzZXItc3BlY2lmaWMgc3ViYWRkcmVzcywgdGhpcyBmaWVsZCBpcyBlbmNvZGVkIGFjY29yZGluZworCS0tCXRvIHRoZSB1c2VyIHNwZWNpZmljYXRpb24sIHN1YmplY3QgdG8gYSBtYXhpbXVtIGxlbmd0aCBvZiAyMAorCS0tCW9jdGV0cy4gV2hlbiBpbnRlcndvcmtpbmcgd2l0aCBYLjI1IG5ldHdvcmtzIEJDRCBjb2Rpbmcgc2hvdWxkCisJLS0JYmUgYXBwbGllZC4KKworbWF4SVNETi1TdWJhZGRyZXNzTGVuZ3RoICBJTlRFR0VSIDo6PSAyMQorCitFeHRlcm5hbFNpZ25hbEluZm8gOjo9IFNFUVVFTkNFIHsKKwlwcm90b2NvbElkCVByb3RvY29sSWQsCisJc2lnbmFsSW5mbwlTaWduYWxJbmZvLAorCS0tIEluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZ2l2ZW4gaW4KKwktLSBjbGF1c2UgNy42LjkuCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwktLSBleHRlbnNpb25Db250YWluZXIgbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDIKKwkuLi59CisKK1NpZ25hbEluZm8gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4U2lnbmFsSW5mb0xlbmd0aCkpCisKK21heFNpZ25hbEluZm9MZW5ndGggIElOVEVHRVIgOjo9IDIwMAorCS0tIFRoaXMgTmFtZWRWYWx1ZSByZXByZXNlbnRzIHRoZSB0aGVvcmV0aWNhbCBtYXhpbXVtIG51bWJlciBvZiBvY3RldHMgd2hpY2ggaXMKKwktLSBhdmFpbGFibGUgdG8gY2FycnkgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIFNpZ25hbEluZm8gZGF0YSB0eXBlLAorCS0tIHdpdGhvdXQgcmVxdWlyaW5nIHNlZ21lbnRhdGlvbiB0byBjb3BlIHdpdGggdGhlIG5ldHdvcmsgbGF5ZXIgc2VydmljZS4KKwktLSBIb3dldmVyLCB0aGUgYWN0dWFsIG1heGltdW0gc2l6ZSBhdmFpbGFibGUgZm9yIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhCisJLS0gdHlwZSBtYXkgYmUgbG93ZXIsIGVzcGVjaWFsbHkgd2hlbiBvdGhlciBpbmZvcm1hdGlvbiBlbGVtZW50cworCS0tIGhhdmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHNhbWUgY29tcG9uZW50LgorCitQcm90b2NvbElkIDo6PSBFTlVNRVJBVEVEIHsKKwlnc20tMDQwOCAgKDEpLAorCWdzbS0wODA2ICAoMiksCisJZ3NtLUJTU01BUCAgKDMpLAorCS0tIFZhbHVlIDMgaXMgcmVzZXJ2ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQKKwlldHMtMzAwMTAyLTEgICg0KX0KKworRXh0LUV4dGVybmFsU2lnbmFsSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWV4dC1Qcm90b2NvbElkCUV4dC1Qcm90b2NvbElkLAorCXNpZ25hbEluZm8JU2lnbmFsSW5mbywKKwktLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGdpdmVuIGluCisJLS0gY2xhdXNlIDcuNi45LjEwCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0V4dC1Qcm90b2NvbElkIDo6PSBFTlVNRVJBVEVEIHsKKwlldHMtMzAwMzU2ICAoMSksCisJLi4uIAorCSB9CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBGb3IgRXh0LUV4dGVybmFsU2lnbmFsSW5mbyBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCistLSBFeHQtRXh0ZXJuYWxTaWduYWxJbmZvIHNlcXVlbmNlLgorCitBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWFjY2Vzc05ldHdvcmtQcm90b2NvbElkCUFjY2Vzc05ldHdvcmtQcm90b2NvbElkLAorCXNpZ25hbEluZm8JTG9uZ1NpZ25hbEluZm8sCisJLS0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBnaXZlbiBpbiBjbGF1c2UgNy42LjkuMQorCQorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitMb25nU2lnbmFsSW5mbyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhMb25nU2lnbmFsSW5mb0xlbmd0aCkpCisKK21heExvbmdTaWduYWxJbmZvTGVuZ3RoICBJTlRFR0VSIDo6PSAyNTYwCisJLS0gVGhpcyBOYW1lZCBWYWx1ZSByZXByZXNlbnRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvY3RldHMgd2hpY2ggaXMgYXZhaWxhYmxlCisJLS0gdG8gY2FycnkgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIExvbmdTaWduYWxJbmZvIGRhdGEgdHlwZSB1c2luZworCS0tIFdoaXRlIEJvb2sgU0NDUCB3aXRoIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWdtZW50cy4KKwktLSBJdCB0YWtlcyBhY2NvdW50IG9mIHRoZSBvY3RldHMgdXNlZCBieSB0aGUgbG93ZXIgbGF5ZXJzIG9mIHRoZSBwcm90b2NvbCwgYW5kCisJLS0gb3RoZXIgaW5mb3JtYXRpb24gZWxlbWVudHMgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIGluIHRoZSBzYW1lIGNvbXBvbmVudC4KKworQWNjZXNzTmV0d29ya1Byb3RvY29sSWQgOjo9IEVOVU1FUkFURUQgeworCXRzM0ctNDgwMDYgICAoMSksCisJdHMzRy0yNTQxMyAoMiksCisJLi4ufQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBGb3IgQWNjZXNzTmV0d29ya1NpZ25hbEluZm8gc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKwktLSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSB3aG9sZSAKKwktLSBBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbyBzZXF1ZW5jZS4KKworQWxlcnRpbmdQYXR0ZXJuIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpICkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgQWxlcnRpbmcgUGF0dGVybgorCisJLS0JYml0cyA4NzY1IDogMDAwMCAodW51c2VkKQorCisJLS0JYml0cyA0MyA6IHR5cGUgb2YgUGF0dGVybgorCS0tCQkwMCBsZXZlbAorCS0tCQkwMSBjYXRlZ29yeQorCS0tCQkxMCBjYXRlZ29yeQorCS0tCQlhbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZC4KKworCS0tCWJpdHMgMjEgOiB0eXBlIG9mIGFsZXJ0aW5nCisKK2FsZXJ0aW5nTGV2ZWwtMCAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMDAwJ0IKK2FsZXJ0aW5nTGV2ZWwtMSAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMDAxJ0IKK2FsZXJ0aW5nTGV2ZWwtMiAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMDEwJ0IKKwktLSBhbGwgb3RoZXIgdmFsdWVzIG9mIEFsZXJ0aW5nIGxldmVsIGFyZSByZXNlcnZlZAorCS0tIEFsZXJ0aW5nIExldmVscyBhcmUgZGVmaW5lZCBpbiBHU00gMDIuMDcKKwkKK2FsZXJ0aW5nQ2F0ZWdvcnktMSAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMTAwJ0IKK2FsZXJ0aW5nQ2F0ZWdvcnktMiAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMTAxJ0IKK2FsZXJ0aW5nQ2F0ZWdvcnktMyAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMTEwJ0IKK2FsZXJ0aW5nQ2F0ZWdvcnktNCAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMTExJ0IKK2FsZXJ0aW5nQ2F0ZWdvcnktNSAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAxMDAwJ0IKKwktLSBhbGwgb3RoZXIgdmFsdWVzIG9mIEFsZXJ0aW5nIENhdGVnb3J5IGFyZSByZXNlcnZlZAorCS0tIEFsZXJ0aW5nIGNhdGVnb3JpZXMgYXJlIGRlZmluZWQgaW4gR1NNIDAyLjA3CisKKy0tIGRhdGEgdHlwZXMgZm9yIG51bWJlcmluZyBhbmQgaWRlbnRpZmljYXRpb24KKworSU1TSSA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDMuLjgpKQorCS0tIGRpZ2l0cyBvZiBNQ0MsIE1OQywgTVNJTiBhcmUgY29uY2F0ZW5hdGVkIGluIHRoaXMgb3JkZXIuCisKK0lkZW50aXR5IDo6PSBDSE9JQ0UgeworCWltc2kJCQlJTVNJLAorCWltc2ktV2l0aExNU0kJSU1TSS1XaXRoTE1TSX0KKworSU1TSS1XaXRoTE1TSSA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCWxtc2kJCQlMTVNJLAorCS0tIGEgc3BlY2lhbCB2YWx1ZSAwMDAwMDAwMCBpbmRpY2F0ZXMgdGhhdCB0aGUgTE1TSSBpcyBub3QgaW4gdXNlCisJLi4ufQorCitBU0NJLUNhbGxSZWZlcmVuY2UgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICgxLi44KSkKKwktLSBkaWdpdHMgb2YgVkdDUy9WQlMtYXJlYSxHcm91cC1JRCBhcmUgY29uY2F0ZW5hdGVkIGluIHRoaXMgb3JkZXIgaWYgdGhlcmUgaXMgYQorCS0tIFZHQ1MvVkJTLWFyZWEuCisKK1RNU0kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNCkpCisKK1N1YnNjcmliZXJJZCA6Oj0gQ0hPSUNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJdG1zaQkJCVsxXSBUTVNJfQorCitJTUVJIDo6PSBUQkNELVNUUklORyAoU0laRSAoOCkpCisJLS0JUmVmZXJzIHRvIEludGVybmF0aW9uYWwgTW9iaWxlIFN0YXRpb24gRXF1aXBtZW50IElkZW50aXR5CisJLS0JYW5kIFNvZnR3YXJlIFZlcnNpb24gTnVtYmVyIChTVk4pIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XS4KKwktLQlJZiB0aGUgU1ZOIGlzIG5vdCBwcmVzZW50IHRoZSBsYXN0IG9jdGV0IHNoYWxsIGNvbnRhaW4gdGhlCisJLS0JZGlnaXQgMCBhbmQgYSBmaWxsZXIuCisJLS0JSWYgcHJlc2VudCB0aGUgU1ZOIHNoYWxsIGJlIGluY2x1ZGVkIGluIHRoZSBsYXN0IG9jdGV0LgorCitITFItSWQgOjo9IElNU0kKKwktLSBsZWFkaW5nIGRpZ2l0cyBvZiBJTVNJLCBpLmUuIChNQ0MsIE1OQywgbGVhZGluZyBkaWdpdHMgb2YKKwktLSBNU0lOKSBmb3JtaW5nIEhMUiBJZCBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10uCisKK0hMUi1MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkhMUi1JZCkgT0YKKwkJCQlITFItSWQKKworbWF4TnVtT2ZITFItSWQgIElOVEVHRVIgOjo9IDUwCisKK0xNU0kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCisKK0dsb2JhbENlbGxJZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg1Li43KSkKKwktLSBSZWZlcnMgdG8gQ2VsbCBHbG9iYWwgSWRlbnRpZmljYXRpb24gZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAwMyBbMTddLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI0LjAwOCBbMzVdCisJLS0gb2N0ZXRzIDYgYW5kIDcJQ2VsbCBJZGVudGl0eSAoQ0kpIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI0LjAwOCBbMzVdCisKK05ldHdvcmtSZXNvdXJjZSA6Oj0gRU5VTUVSQVRFRCB7CisJcGxtbiAgKDApLAorCWhsciAgKDEpLAorCXZsciAgKDIpLAorCXB2bHIgICgzKSwKKwljb250cm9sbGluZ01TQyAgKDQpLAorCXZtc2MgICg1KSwKKwllaXIgICg2KSwKKwlyc3MgICg3KX0KKworQWRkaXRpb25hbE5ldHdvcmtSZXNvdXJjZSA6Oj0gRU5VTUVSQVRFRCB7CisJc2dzbiAoMCksCisJZ2dzbiAoMSksCisJZ21sYyAoMiksCisJZ3NtU0NGICgzKSwKKwlucGxyICg0KSwKKwlhdWMgKDUpLAorCS4uLiAsCisJdWUgKDYpLAorCW1tZSAoNyl9CisJLS0gaWYgdW5rbm93biB2YWx1ZSBpcyByZWNlaXZlZCBpbiBBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlCisJLS0gaXQgc2hhbGwgYmUgaWdub3JlZC4KKworCitOQUVBLVByZWZlcnJlZENJIDo6PSBTRVFVRU5DRSB7CisJbmFlYS1QcmVmZXJyZWRDSUMJWzBdIE5BRUEtQ0lDLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTkFFQS1DSUMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMykpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGJ5IHRoZSBDYXJyaWVyIElkZW50aWZpY2F0aW9uCisJLS0gcGFyYW1ldGVyIGluIEFOU0kgVDEuMTEzLjMuIENhcnJpZXIgY29kZXMgYmV0d2VlbiAiMDAwIiBhbmQgIjk5OSIgbWF5CisJLS0gYmUgZW5jb2RlZCBhcyAzIGRpZ2l0cyB1c2luZyAiMDAwIiB0byAiOTk5IiBvciBhcyA0IGRpZ2l0cyB1c2luZyAKKwktLSAiMDAwMCIgdG8gIjA5OTkiLiBDYXJyaWVyIGNvZGVzIGJldHdlZW4gIjEwMDAiIGFuZCAiOTk5OSIgYXJlIGVuY29kZWQKKwktLSB1c2luZyA0IGRpZ2l0cy4KKworU3Vic2NyaWJlcklkZW50aXR5IDo6PSBDSE9JQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwltc2lzZG4JCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcKKwl9CisKK0xDU0NsaWVudEV4dGVybmFsSUQgOjo9IFNFUVVFTkNFIHsKKwlleHRlcm5hbEFkZHJlc3MJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitMQ1NDbGllbnRJbnRlcm5hbElEIDo6PSBFTlVNRVJBVEVEIHsKKwlicm9hZGNhc3RTZXJ2aWNlCSgwKSwKKwlvLWFuZE0tSFBMTU4JKDEpLAorCW8tYW5kTS1WUExNTgkoMiksCisJYW5vbnltb3VzTG9jYXRpb24JKDMpLAorCXRhcmdldE1Tc3Vic2NyaWJlZFNlcnZpY2UJKDQpLAorCS4uLiB9CistLSBmb3IgYSBDQU1FTCBwaGFzZSAzIFBMTU4gb3BlcmF0b3IgY2xpZW50LCB0aGUgdmFsdWUgdGFyZ2V0TVNzdWJzY3JpYmVkU2VydmljZSBzaGFsbCBiZSB1c2VkCisKK0xDU1NlcnZpY2VUeXBlSUQgOjo9IElOVEVHRVIgKDAuLjEyNykKKwktLSB0aGUgaW50ZWdlciB2YWx1ZXMgMC02MyBhcmUgcmVzZXJ2ZWQgZm9yIFN0YW5kYXJkIExDUyBzZXJ2aWNlIHR5cGVzCisJLS0gdGhlIGludGVnZXIgdmFsdWVzIDY0LTEyNyBhcmUgcmVzZXJ2ZWQgZm9yIE5vbiBTdGFuZGFyZCBMQ1Mgc2VydmljZSB0eXBlcworCistLSBTdGFuZGFyZCBMQ1MgU2VydmljZSBUeXBlcworZW1lcmdlbmN5U2VydmljZXMJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDAKK2VtZXJnZW5jeUFsZXJ0U2VydmljZXMJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEKK3BlcnNvblRyYWNraW5nCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMgorZmxlZXRNYW5hZ2VtZW50CQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAzCithc3NldE1hbmFnZW1lbnQJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDQKK3RyYWZmaWNDb25nZXN0aW9uUmVwb3J0aW5nCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA1Cityb2Fkc2lkZUFzc2lzdGFuY2UJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDYKK3JvdXRpbmdUb05lYXJlc3RDb21tZXJjaWFsRW50ZXJwcmlzZQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNworbmF2aWdhdGlvbgkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgKKwktLXRoaXMgc2VydmljZSB0eXBlIGlzIHJlc2VydmVkIGZvciB1c2UgaW4gcHJldmlvdXMgcmVsZWFzZXMKK2NpdHlTaWdodHNlZWluZwkJTENTU2VydmljZVR5cGVJRCA6Oj0gOQorbG9jYWxpemVkQWR2ZXJ0aXNpbmcJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwCittb2JpbGVZZWxsb3dQYWdlcwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTEgCit0cmFmZmljQW5kUHVibGljVHJhbnNwb3J0YXRpb25JbmZvCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMgord2VhdGhlcgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMworYXNzZXRBbmRTZXJ2aWNlRmluZGluZwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTQKK2dhbWluZwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxNQorZmluZFlvdXJGcmllbmQJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxNgorZGF0aW5nCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE3CitjaGF0dGluZwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxOAorcm91dGVGaW5kaW5nCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTkKK3doZXJlQW1JCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDIwCisKKy0tIFRoZSB2YWx1ZXMgb2YgTENTU2VydmljZVR5cGVJRCBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMi4wNzEuCisKKy0tIE5vbiBTdGFuZGFyZCBMQ1MgU2VydmljZSBUeXBlcworc2VydjY0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY0CitzZXJ2NjUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjUKK3NlcnY2NgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2Ngorc2VydjY3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY3CitzZXJ2NjgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjgKK3NlcnY2OQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2OQorc2VydjcwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDcwCitzZXJ2NzEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzEKK3NlcnY3MgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3Mgorc2VydjczCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDczCitzZXJ2NzQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzQKK3NlcnY3NQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3NQorc2Vydjc2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc2CitzZXJ2NzcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzcKK3NlcnY3OAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3OAorc2Vydjc5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc5CitzZXJ2ODAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODAKK3NlcnY4MQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4MQorc2VydjgyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgyCitzZXJ2ODMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODMKK3NlcnY4NAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4NAorc2Vydjg1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg1CitzZXJ2ODYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODYKK3NlcnY4NwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4Nworc2Vydjg4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg4CitzZXJ2ODkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODkKK3NlcnY5MAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5MAorc2VydjkxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkxCitzZXJ2OTIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTIKK3NlcnY5MwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Mworc2Vydjk0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk0CitzZXJ2OTUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTUKK3NlcnY5NgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Ngorc2Vydjk3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk3CitzZXJ2OTgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTgKK3NlcnY5OQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5OQorc2VydjEwMAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDAKK3NlcnYxMDEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAxCitzZXJ2MTAyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwMgorc2VydjEwMwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDMKK3NlcnYxMDQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA0CitzZXJ2MTA1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwNQorc2VydjEwNgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDYKK3NlcnYxMDcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA3CitzZXJ2MTA4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwOAorc2VydjEwOQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDkKK3NlcnYxMTAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTEwCitzZXJ2MTExCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExMQorc2VydjExMgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTIKK3NlcnYxMTMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTEzCitzZXJ2MTE0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExNAorc2VydjExNQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTUKK3NlcnYxMTYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE2CitzZXJ2MTE3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExNworc2VydjExOAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTgKK3NlcnYxMTkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE5CitzZXJ2MTIwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyMAorc2VydjEyMQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjEKK3NlcnYxMjIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIyCitzZXJ2MTIzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyMworc2VydjEyNAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjQKK3NlcnYxMjUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTI1CitzZXJ2MTI2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyNgorc2VydjEyNwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjcKKworUExNTi1JZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdAorCS0tCQkJb3IgZmlsbGVyICgxMTExKSBmb3IgMiBkaWdpdCBNTkNzCisJLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAorCistLSBkYXRhIHR5cGVzIGZvciBDQU1FTAorCitDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSA6Oj0gQ0hPSUNFIHsKKwljZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRGaXhlZExlbmd0aAlbMF0gQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkRml4ZWRMZW5ndGgsCisJbGFpRml4ZWRMZW5ndGgJWzFdIExBSUZpeGVkTGVuZ3RofQorCitDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRGaXhlZExlbmd0aCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg3KSkKKwktLSBSZWZlcnMgdG8gQ2VsbCBHbG9iYWwgSWRlbnRpZmljYXRpb24gb3IgU2VydmljZSBBcmUgSWRlbnRpZmljYXRpb24KKwktLSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDAzLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOAorCS0tIG9jdGV0cyA2IGFuZCA3CUNlbGwgSWRlbnRpdHkgKENJKSB2YWx1ZSBvciAKKwktLSAJCQlTZXJ2aWNlIEFyZWEgQ29kZSAoU0FDKSB2YWx1ZSAKKwktLQkJCWFjY29yZGluZyB0byAzR1BQIFRTIDIzLjAwMworCitMQUlGaXhlZExlbmd0aCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg1KSkKKwktLSBSZWZlcnMgdG8gTG9jYXRpb24gQXJlYSBJZGVudGlmaWNhdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDAzIFsxN10uCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcworCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0KKworLS0gZGF0YSB0eXBlcyBmb3Igc3Vic2NyaWJlciBtYW5hZ2VtZW50CisKK0Jhc2ljU2VydmljZUNvZGUgOjo9IENIT0lDRSB7CisJYmVhcmVyU2VydmljZQlbMl0gQmVhcmVyU2VydmljZUNvZGUsCisJdGVsZXNlcnZpY2UJWzNdIFRlbGVzZXJ2aWNlQ29kZX0KKworRXh0LUJhc2ljU2VydmljZUNvZGUgOjo9IENIT0lDRSB7CisJZXh0LUJlYXJlclNlcnZpY2UJWzJdIEV4dC1CZWFyZXJTZXJ2aWNlQ29kZSwKKwlleHQtVGVsZXNlcnZpY2UJWzNdIEV4dC1UZWxlc2VydmljZUNvZGV9CisKK0VNTFBQLUluZm8gOjo9IFNFUVVFTkNFIHsKKwltYXhpbXVtZW50aXRsZWRQcmlvcml0eQlFTUxQUC1Qcmlvcml0eSwKKwlkZWZhdWx0UHJpb3JpdHkJRU1MUFAtUHJpb3JpdHksCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0VNTFBQLVByaW9yaXR5IDo6PSBJTlRFR0VSICgwLi4xNSkKKwktLSBUaGUgbWFwcGluZyBmcm9tIHRoZSB2YWx1ZXMgQSxCLDAsMSwyLDMsNCB0byB0aGUgaW50ZWdlci12YWx1ZSBpcworCS0tIHNwZWNpZmllZCBhcyBmb2xsb3dzIHdoZXJlIEEgaXMgdGhlIGhpZ2hlc3QgYW5kIDQgaXMgdGhlIGxvd2VzdAorCS0tIHByaW9yaXR5IGxldmVsCisJLS0gdGhlIGludGVnZXIgdmFsdWVzIDctMTUgYXJlIHNwYXJlIGFuZCBzaGFsbCBiZSBtYXBwZWQgdG8gdmFsdWUgNAorCitwcmlvcml0eUxldmVsQQkJRU1MUFAtUHJpb3JpdHkgOjo9IDYKK3ByaW9yaXR5TGV2ZWxCCQlFTUxQUC1Qcmlvcml0eSA6Oj0gNQorcHJpb3JpdHlMZXZlbDAJCUVNTFBQLVByaW9yaXR5IDo6PSAwCitwcmlvcml0eUxldmVsMQkJRU1MUFAtUHJpb3JpdHkgOjo9IDEKK3ByaW9yaXR5TGV2ZWwyCQlFTUxQUC1Qcmlvcml0eSA6Oj0gMgorcHJpb3JpdHlMZXZlbDMJCUVNTFBQLVByaW9yaXR5IDo6PSAzCitwcmlvcml0eUxldmVsNAkJRU1MUFAtUHJpb3JpdHkgOjo9IDQKKworTUMtU1MtSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXSBTUy1Db2RlLAorCXNzLVN0YXR1cwkJWzFdIEV4dC1TUy1TdGF0dXMsCisJbmJyU0IJCVsyXSBNYXhNQy1CZWFyZXJzLAorCW5iclVzZXIJCVszXSBNQy1CZWFyZXJzLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTWF4TUMtQmVhcmVycyA6Oj0gSU5URUdFUiAoMi4ubWF4TnVtT2ZNQy1CZWFyZXJzKQorCitNQy1CZWFyZXJzIDo6PSBJTlRFR0VSICgxLi5tYXhOdW1PZk1DLUJlYXJlcnMpCisKK21heE51bU9mTUMtQmVhcmVycyAgSU5URUdFUiA6Oj0gNworCitFeHQtU1MtU3RhdHVzIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUpKQorCisJLS0gT0NURVQgMToKKwktLQorCS0tIGJpdHMgODc2NTogMDAwMCAodW51c2VkKQorCS0tIGJpdHMgNDMyMTogVXNlZCB0byBjb252ZXkgdGhlICJQIGJpdCIsIlIgYml0IiwiQSBiaXQiIGFuZCAiUSBiaXQiLAorCS0tCQkgICAgcmVwcmVzZW50aW5nIHN1cHBsZW1lbnRhcnkgc2VydmljZSBzdGF0ZSBpbmZvcm1hdGlvbgorCS0tCQkgICAgYXMgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAxMSBbMjJdCisKKwktLSBiaXQgNDogIlEgYml0IgorCisJLS0gYml0IDM6ICJQIGJpdCIKKworCS0tIGJpdCAyOiAiUiBiaXQiCisKKwktLSBiaXQgMTogIkEgYml0IgorCisJLS0gT0NURVRTIDItNTogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIFRoZXkgc2hhbGwgYmUgZGlzY2FyZGVkIGlmCisJLS0gcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kLgorCisKKwktLSBkYXRhIHR5cGVzIGZvciBnZW9ncmFwaGljIGxvY2F0aW9uCisKK0FnZU9mTG9jYXRpb25JbmZvcm1hdGlvbiA6Oj0gSU5URUdFUiAoMC4uMzI3NjcpCistLSB0aGUgdmFsdWUgcmVwcmVzZW50cyB0aGUgZWxhcHNlZCB0aW1lIGluIG1pbnV0ZXMgc2luY2UgdGhlIGxhc3QKKy0tIG5ldHdvcmsgY29udGFjdCBvZiB0aGUgbW9iaWxlIHN0YXRpb24gKGkuZS4gdGhlIGFjdHVhbGl0eSBvZiB0aGUKKy0tIGxvY2F0aW9uIGluZm9ybWF0aW9uKS4KKy0tIHZhbHVlICIwIiBpbmRpY2F0ZXMgdGhhdCB0aGUgTVMgaXMgY3VycmVudGx5IGluIGNvbnRhY3Qgd2l0aCB0aGUKKy0tICAgICAgICAgICBuZXR3b3JrCistLSB2YWx1ZSAiMzI3NjciIGluZGljYXRlcyB0aGF0IHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpcyBhdCBsZWFzdAorLS0gICAgICAgICAgICAgICAzMjc2NyBtaW51dGVzIG9sZAorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRVItRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUVSLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiOTBmYwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUVSLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSw0MTUgQEAKKy0tICRJZDogTUFQLUVSLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgCistLSAxNy43LjcJRXJyb3IgZGF0YSB0eXBlcworCitNQVAtRVItRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUVSLURhdGFUeXBlcyAoMTcpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisJUm9hbWluZ05vdEFsbG93ZWRQYXJhbSwKKwlDYWxsQmFycmVkUGFyYW0sCisJQ1VHLVJlamVjdFBhcmFtLAorCVNTLUluY29tcGF0aWJpbGl0eUNhdXNlLAorCVBXLVJlZ2lzdHJhdGlvbkZhaWx1cmVDYXVzZSwKKwlTTS1EZWxpdmVyeUZhaWx1cmVDYXVzZSwKKwlTeXN0ZW1GYWlsdXJlUGFyYW0sCisJRGF0YU1pc3NpbmdQYXJhbSwKKwlVbmV4cGVjdGVkRGF0YVBhcmFtLAorCUZhY2lsaXR5Tm90U3VwUGFyYW0sCisJT1ItTm90QWxsb3dlZFBhcmFtLAorCVVua25vd25TdWJzY3JpYmVyUGFyYW0sCisJTnVtYmVyQ2hhbmdlZFBhcmFtLAorCVVuaWRlbnRpZmllZFN1YlBhcmFtLAorCUlsbGVnYWxTdWJzY3JpYmVyUGFyYW0sCisJSWxsZWdhbEVxdWlwbWVudFBhcmFtLAorCUJlYXJlclNlcnZOb3RQcm92UGFyYW0sCisJVGVsZXNlcnZOb3RQcm92UGFyYW0sCisJVHJhY2luZ0J1ZmZlckZ1bGxQYXJhbSwKKwlOb1JvYW1pbmdOYlBhcmFtLAorCUFic2VudFN1YnNjcmliZXJQYXJhbSwKKwlCdXN5U3Vic2NyaWJlclBhcmFtLAorCU5vU3Vic2NyaWJlclJlcGx5UGFyYW0sCisJRm9yd2FyZGluZ1Zpb2xhdGlvblBhcmFtLAorCUZvcndhcmRpbmdGYWlsZWRQYXJhbSwgCisJQVRJLU5vdEFsbG93ZWRQYXJhbSwKKwlTdWJCdXN5Rm9yTVQtU01TLVBhcmFtLAorCU1lc3NhZ2VXYWl0TGlzdEZ1bGxQYXJhbSwKKwlBYnNlbnRTdWJzY3JpYmVyU00tUGFyYW0sCisJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSwKKwlSZXNvdXJjZUxpbWl0YXRpb25QYXJhbSwKKwlOb0dyb3VwQ2FsbE5iUGFyYW0sCisJSW5jb21wYXRpYmxlVGVybWluYWxQYXJhbSwKKwlTaG9ydFRlcm1EZW5pYWxQYXJhbSwKKwlMb25nVGVybURlbmlhbFBhcmFtLAorCVVuYXV0aG9yaXplZFJlcXVlc3RpbmdOZXR3b3JrLVBhcmFtLAorCVVuYXV0aG9yaXplZExDU0NsaWVudC1QYXJhbSwKKwlQb3NpdGlvbk1ldGhvZEZhaWx1cmUtUGFyYW0sCitVbmtub3duT3JVbnJlYWNoYWJsZUxDU0NsaWVudC1QYXJhbSwKKwlNTS1FdmVudE5vdFN1cHBvcnRlZC1QYXJhbSwKK0FUU0ktTm90QWxsb3dlZFBhcmFtLAorQVRNLU5vdEFsbG93ZWRQYXJhbSwKK0lsbGVnYWxTUy1PcGVyYXRpb25QYXJhbSwKK1NTLU5vdEF2YWlsYWJsZVBhcmFtLAorU1MtU3Vic2NyaXB0aW9uVmlvbGF0aW9uUGFyYW0sCitJbmZvcm1hdGlvbk5vdEF2YWlsYWJsZVBhcmFtLAorVGFyZ2V0Q2VsbE91dHNpZGVHQ0EtUGFyYW0sCitPbmdvaW5nR3JvdXBDYWxsUGFyYW0KKworOworCitJTVBPUlRTCisJU1MtU3RhdHVzCitGUk9NIE1BUC1TUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9CisKKwlTaWduYWxJbmZvLAorCUJhc2ljU2VydmljZUNvZGUsCisJTmV0d29ya1Jlc291cmNlLAorCUFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UKK0ZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworCisJU1MtQ29kZQorRlJPTSBNQVAtU1MtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1Db2RlICgxNSkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKzsKKworUm9hbWluZ05vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCXJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UJUm9hbWluZ05vdEFsbG93ZWRDYXVzZSwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsUm9hbWluZ05vdEFsbG93ZWRDYXVzZQlbMF0gQWRkaXRpb25hbFJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UgT1BUSU9OQUwgfQorCistLQlpZiB0aGUgYWRkaXRpb25hbFJvYW1pbmdOb3RhbGxvd2VkQ2F1c2UgaXMgcmVjZWl2ZWQgYnkgdGhlIE1TQy9WTFIgb3IgU0dTTiB0aGVuIHRoZSAKKy0tCXJvYW1pbmdOb3RBbGxvd2VkQ2F1c2Ugc2hhbGwgYmUgZGlzY2FyZGVkLgorCitBZGRpdGlvbmFsUm9hbWluZ05vdEFsbG93ZWRDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJc3VwcG9ydGVkUkFULVR5cGVzTm90QWxsb3dlZCAoMCksCisJLi4ufQorCitSb2FtaW5nTm90QWxsb3dlZENhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwlwbG1uUm9hbWluZ05vdEFsbG93ZWQgICgwKSwKKwlvcGVyYXRvckRldGVybWluZWRCYXJyaW5nICAoMyl9CisKK0NhbGxCYXJyZWRQYXJhbSA6Oj0gQ0hPSUNFIHsKKwljYWxsQmFycmluZ0NhdXNlCUNhbGxCYXJyaW5nQ2F1c2UsCisJLS0gY2FsbCBCYXJyaW5nQ2F1c2UgbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDMgYW5kIGhpZ2hlcgorCWV4dGVuc2libGVDYWxsQmFycmVkUGFyYW0JRXh0ZW5zaWJsZUNhbGxCYXJyZWRQYXJhbQorCS0tIGV4dGVuc2libGVDYWxsQmFycmVkUGFyYW0gbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDwzCisJfQorCitDYWxsQmFycmluZ0NhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwliYXJyaW5nU2VydmljZUFjdGl2ZSAgKDApLAorCW9wZXJhdG9yQmFycmluZyAgKDEpfQorCitFeHRlbnNpYmxlQ2FsbEJhcnJlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJY2FsbEJhcnJpbmdDYXVzZQlDYWxsQmFycmluZ0NhdXNlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwl1bmF1dGhvcmlzZWRNZXNzYWdlT3JpZ2luYXRvcglbMV0gTlVMTAkJT1BUSU9OQUwgfQorCitDVUctUmVqZWN0UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwljdWctUmVqZWN0Q2F1c2UJQ1VHLVJlamVjdENhdXNlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDVUctUmVqZWN0Q2F1c2UgOjo9IEVOVU1FUkFURUQgeworCWluY29taW5nQ2FsbHNCYXJyZWRXaXRoaW5DVUcgICgwKSwKKwlzdWJzY3JpYmVyTm90TWVtYmVyT2ZDVUcgICgxKSwKKwlyZXF1ZXN0ZWRCYXNpY1NlcnZpY2VWaW9sYXRlc0NVRy1Db25zdHJhaW50cyAgKDUpLAorCWNhbGxlZFBhcnR5U1MtSW50ZXJhY3Rpb25WaW9sYXRpb24gICg3KX0KKworU1MtSW5jb21wYXRpYmlsaXR5Q2F1c2UgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMV0gU1MtQ29kZQlPUFRJT05BTCwKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBTUy1TdGF0dXMJT1BUSU9OQUwsCisJLi4ufQorCitQVy1SZWdpc3RyYXRpb25GYWlsdXJlQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCXVuZGV0ZXJtaW5lZCAgKDApLAorCWludmFsaWRGb3JtYXQgICgxKSwKKwluZXdQYXNzd29yZHNNaXNtYXRjaCAgKDIpfQorCitTTS1FbnVtZXJhdGVkRGVsaXZlcnlGYWlsdXJlQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCW1lbW9yeUNhcGFjaXR5RXhjZWVkZWQgICgwKSwKKwllcXVpcG1lbnRQcm90b2NvbEVycm9yICAoMSksCisJZXF1aXBtZW50Tm90U00tRXF1aXBwZWQgICgyKSwKKwl1bmtub3duU2VydmljZUNlbnRyZSAgKDMpLAorCXNjLUNvbmdlc3Rpb24gICg0KSwKKwlpbnZhbGlkU01FLUFkZHJlc3MgICg1KSwKKwlzdWJzY3JpYmVyTm90U0MtU3Vic2NyaWJlciAgKDYpfQorCitTTS1EZWxpdmVyeUZhaWx1cmVDYXVzZSA6Oj0gU0VRVUVOQ0UgeworCXNtLUVudW1lcmF0ZWREZWxpdmVyeUZhaWx1cmVDYXVzZQlTTS1FbnVtZXJhdGVkRGVsaXZlcnlGYWlsdXJlQ2F1c2UsCisJZGlhZ25vc3RpY0luZm8JU2lnbmFsSW5mbwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQWJzZW50U3Vic2NyaWJlclNNLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCU9QVElPTkFMLAorCS0tIEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gY2FuIGJlIGVpdGhlciBmb3Igbm9uLUdQUlMgCisJLS0gb3IgZm9yIEdQUlMKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAgCVswXSAJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCB9CisJLS0gaWYgcmVjZWl2ZWQsIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIAorCS0tIGlzIGZvciBHUFJTIGFuZCBhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIAorCS0tIGZvciBub24tR1BSUworCitBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIDo6PSBJTlRFR0VSICgwLi4yNTUpCisJLS0gQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wNDAKKworU3lzdGVtRmFpbHVyZVBhcmFtIDo6PSBDSE9JQ0UgeworCW5ldHdvcmtSZXNvdXJjZQlOZXR3b3JrUmVzb3VyY2UsCisJLS0gbmV0d29ya1Jlc291cmNlIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiAzCisJZXh0ZW5zaWJsZVN5c3RlbUZhaWx1cmVQYXJhbQlFeHRlbnNpYmxlU3lzdGVtRmFpbHVyZVBhcmFtCisJLS0gZXh0ZW5zaWJsZVN5c3RlbUZhaWx1cmVQYXJhbSBtdXN0IG5vdCBiZSB1c2VkIGluIHZlcnNpb24gPDMKKwl9CisKK0V4dGVuc2libGVTeXN0ZW1GYWlsdXJlUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwluZXR3b3JrUmVzb3VyY2UJTmV0d29ya1Jlc291cmNlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UJWzBdIEFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UJT1BUSU9OQUwsCisJZmFpbHVyZUNhdXNlUGFyYW0JWzFdIEZhaWx1cmVDYXVzZVBhcmFtCU9QVElPTkFMIH0KKworRmFpbHVyZUNhdXNlUGFyYW0gOjo9IEVOVU1FUkFURUQgeworCWxpbWl0UmVhY2hlZE9uTnVtYmVyT2ZDb25jdXJyZW50TG9jYXRpb25SZXF1ZXN0cyAoMCksCisJLi4uIH0KKwktLSBpZiB1bmtub3duIHZhbHVlIGlzIHJlY2VpdmVkIGluIEZhaWx1cmVDYXVzZVBhcmFtIGl0IHNoYWxsIGJlIGlnbm9yZWQKKworCitEYXRhTWlzc2luZ1BhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1VuZXhwZWN0ZWREYXRhUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRmFjaWxpdHlOb3RTdXBQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkIFswXQlOVUxMCQlPUFRJT05BTCwKKwluZWVkZWRMY3NDYXBhYmlsaXR5Tm90U3VwcG9ydGVkSW5TZXJ2aW5nTm9kZSBbMV0gTlVMTAlPUFRJT05BTCB9CisKK09SLU5vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitVbmtub3duU3Vic2NyaWJlclBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdW5rbm93blN1YnNjcmliZXJEaWFnbm9zdGljCVVua25vd25TdWJzY3JpYmVyRGlhZ25vc3RpYwlPUFRJT05BTH0KKworVW5rbm93blN1YnNjcmliZXJEaWFnbm9zdGljIDo6PSBFTlVNRVJBVEVEIHsKKwlpbXNpVW5rbm93biAgKDApLAorCWdwcnMtZXBzLVN1YnNjcmlwdGlvblVua25vd24gICgxKSwKKwkuLi4sCisJbnBkYk1pc21hdGNoICAoMil9CisJLS0gaWYgdW5rbm93biB2YWx1ZXMgYXJlIHJlY2VpdmVkIGluIAkKKwktLSBVbmtub3duU3Vic2NyaWJlckRpYWdub3N0aWMgdGhleSBzaGFsbCBiZSBkaXNjYXJkZWQKKworTnVtYmVyQ2hhbmdlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1VuaWRlbnRpZmllZFN1YlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0lsbGVnYWxTdWJzY3JpYmVyUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworSWxsZWdhbEVxdWlwbWVudFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0JlYXJlclNlcnZOb3RQcm92UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVGVsZXNlcnZOb3RQcm92UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVHJhY2luZ0J1ZmZlckZ1bGxQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitOb1JvYW1pbmdOYlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0Fic2VudFN1YnNjcmliZXJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFic2VudFN1YnNjcmliZXJSZWFzb24JWzBdIEFic2VudFN1YnNjcmliZXJSZWFzb24JT1BUSU9OQUx9CisKK0Fic2VudFN1YnNjcmliZXJSZWFzb24gOjo9IEVOVU1FUkFURUQgeworCWltc2lEZXRhY2ggKDApLAorCXJlc3RyaWN0ZWRBcmVhICgxKSwKKwlub1BhZ2VSZXNwb25zZSAoMiksCisJLi4uICwKKwlwdXJnZWRNUyAoMyl9CistLSBleGNlcHRpb24gaGFuZGxpbmc6IGF0IHJlY2VwdGlvbiBvZiBvdGhlciB2YWx1ZXMgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIAorLS0gQWJzZW50U3Vic2NyaWJlclJlYXNvbiBzaGFsbCBiZSBpZ25vcmVkLiAKKy0tIFRoZSBBYnNlbnRTdWJzY3JpYmVyUmVhc29uOiBwdXJnZWRNUyBpcyBkZWZpbmVkIGZvciB0aGUgU3VwZXItQ2hhcmdlciBmZWF0dXJlIAorLS0gKHNlZSBUUyAyMy4xMTYpLiBJZiB0aGlzIHZhbHVlIGlzIHJlY2VpdmVkIGluIGEgUHJvdmlkZSBSb2FtaW5nIE51bWJlciByZXNwb25zZQorLS0gaXQgc2hhbGwgYmUgbWFwcGVkIHRvIHRoZSBBYnNlbnRTdWJzY3JpYmVyUmVhc29uOiBpbXNpRGV0YWNoIGluIHRoZSBTZW5kIFJvdXRlaW5nCistLSBJbmZvcm1hdGlvbiByZXNwb25zZQorCitCdXN5U3Vic2NyaWJlclBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJY2Nicy1Qb3NzaWJsZQlbMF0gTlVMTAkJT1BUSU9OQUwsCisJY2Nicy1CdXN5CQlbMV0gTlVMTAkJT1BUSU9OQUx9CisKK05vU3Vic2NyaWJlclJlcGx5UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRm9yd2FyZGluZ1Zpb2xhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZvcndhcmRpbmdGYWlsZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBVEktTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FUU0ktTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FUTS1Ob3RBbGxvd2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworSWxsZWdhbFNTLU9wZXJhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1NTLU5vdEF2YWlsYWJsZVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1NTLVN1YnNjcmlwdGlvblZpb2xhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0luZm9ybWF0aW9uTm90QXZhaWxhYmxlUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU3ViQnVzeUZvck1ULVNNUy1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlncHJzQ29ubmVjdGlvblN1c3BlbmRlZAlOVUxMCQkJT1BUSU9OQUwgfQorCS0tIElmIEdwcnNDb25uZWN0aW9uU3VzcGVuZGVkIGlzIG5vdCB1bmRlcnN0b29kIGl0IHNoYWxsIAorCS0tIGJlIGRpc2NhcmRlZAorCitNZXNzYWdlV2FpdExpc3RGdWxsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUmVzb3VyY2VMaW1pdGF0aW9uUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTm9Hcm91cENhbGxOYlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0luY29tcGF0aWJsZVRlcm1pbmFsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU2hvcnRUZXJtRGVuaWFsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwkuLi59CisKK0xvbmdUZXJtRGVuaWFsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwkuLi59CisKK1VuYXV0aG9yaXplZFJlcXVlc3RpbmdOZXR3b3JrLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1VuYXV0aG9yaXplZExDU0NsaWVudC1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCXVuYXV0aG9yaXplZExDU0NsaWVudC1EaWFnbm9zdGljCVswXSBVbmF1dGhvcml6ZWRMQ1NDbGllbnQtRGlhZ25vc3RpYwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcgkJCU9QVElPTkFMLAorCS4uLiB9CisKK1VuYXV0aG9yaXplZExDU0NsaWVudC1EaWFnbm9zdGljIDo6PSBFTlVNRVJBVEVEIHsKKwlub0FkZGl0aW9uYWxJbmZvcm1hdGlvbiAoMCksCisJY2xpZW50Tm90SW5NU1ByaXZhY3lFeGNlcHRpb25MaXN0ICgxKSwKKwljYWxsVG9DbGllbnROb3RTZXR1cCAoMiksCisJcHJpdmFjeU92ZXJyaWRlTm90QXBwbGljYWJsZSAoMyksCisJZGlzYWxsb3dlZEJ5TG9jYWxSZWd1bGF0b3J5UmVxdWlyZW1lbnRzICg0KSwKKwkuLi4sCisJdW5hdXRob3JpemVkUHJpdmFjeUNsYXNzICg1KSwKKwl1bmF1dGhvcml6ZWRDYWxsU2Vzc2lvblVucmVsYXRlZEV4dGVybmFsQ2xpZW50ICg2KSwKKwl1bmF1dGhvcml6ZWRDYWxsU2Vzc2lvblJlbGF0ZWRFeHRlcm5hbENsaWVudCAoNykgfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYW55IHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSBpZ25vcmVkCisKK1Bvc2l0aW9uTWV0aG9kRmFpbHVyZS1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCXBvc2l0aW9uTWV0aG9kRmFpbHVyZS1EaWFnbm9zdGljCVswXSBQb3NpdGlvbk1ldGhvZEZhaWx1cmUtRGlhZ25vc3RpYwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcgkJCU9QVElPTkFMLAorCS4uLiB9CisKK1Bvc2l0aW9uTWV0aG9kRmFpbHVyZS1EaWFnbm9zdGljIDo6PSBFTlVNRVJBVEVEIHsKKwljb25nZXN0aW9uICAoMCksCisJaW5zdWZmaWNpZW50UmVzb3VyY2VzICAoMSksCisJaW5zdWZmaWNpZW50TWVhc3VyZW1lbnREYXRhICAoMiksCisJaW5jb25zaXN0ZW50TWVhc3VyZW1lbnREYXRhICAoMyksCisJbG9jYXRpb25Qcm9jZWR1cmVOb3RDb21wbGV0ZWQgICg0KSwKKwlsb2NhdGlvblByb2NlZHVyZU5vdFN1cHBvcnRlZEJ5VGFyZ2V0TVMgICg1KSwKKwlxb1NOb3RBdHRhaW5hYmxlICAoNiksCisJcG9zaXRpb25NZXRob2ROb3RBdmFpbGFibGVJbk5ldHdvcmsJKDcpLAorCXBvc2l0aW9uTWV0aG9kTm90QXZhaWxhYmxlSW5Mb2NhdGlvbkFyZWEJKDgpLAorCS4uLiB9CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlhbnkgdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIGlnbm9yZWQKKworVW5rbm93bk9yVW5yZWFjaGFibGVMQ1NDbGllbnQtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTU0tRXZlbnROb3RTdXBwb3J0ZWQtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVGFyZ2V0Q2VsbE91dHNpZGVHQ0EtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworT25nb2luZ0dyb3VwQ2FsbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUV4dGVuc2lvbkRhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NGMwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsNzQgQEAKKy0tICRJZDogTUFQLUV4dGVuc2lvbkRhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuCistLQorLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpCistLQorLS0gMTcuNy4xMSBFeHRlbnNpb24gZGF0YSB0eXBlcworLS0KKworTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCisJUHJpdmF0ZUV4dGVuc2lvbiwKKwlFeHRlbnNpb25Db250YWluZXIsCisJU0xSLUFyZ0V4dGVuc2lvbkNvbnRhaW5lcjsKKworCistLSBJT0MgZm9yIHByaXZhdGUgTUFQIGV4dGVuc2lvbnMKKworCitNQVAtRVhURU5TSU9OICA6Oj0gQ0xBU1MgeworCSZFeHRlbnNpb25UeXBlCQkJCU9QVElPTkFMLAorCSZleHRlbnNpb25JZCAJT0JKRUNUIElERU5USUZJRVIgfQorCS0tIFRoZSBsZW5ndGggb2YgdGhlIE9iamVjdCBJZGVudGlmaWVyIHNoYWxsIG5vdCBleGNlZWQgMTYgb2N0ZXRzIGFuZCB0aGUKKwktLSBudW1iZXIgb2YgY29tcG9uZW50cyBvZiB0aGUgT2JqZWN0IElkZW50aWZpZXIgc2hhbGwgbm90IGV4Y2VlZCAxNgorCistLSBkYXRhIHR5cGVzCisKK0V4dGVuc2lvbkNvbnRhaW5lciA6Oj0gU0VRVUVOQ0UgeworCXByaXZhdGVFeHRlbnNpb25MaXN0CVswXVByaXZhdGVFeHRlbnNpb25MaXN0CU9QVElPTkFMLCAKKwlwY3MtRXh0ZW5zaW9ucwlbMV1QQ1MtRXh0ZW5zaW9ucwlPUFRJT05BTCwKKwkuLi59CisKK1NMUi1BcmdFeHRlbnNpb25Db250YWluZXIgOjo9IFNFUVVFTkNFIHsKKwlwcml2YXRlRXh0ZW5zaW9uTGlzdAlbMF1Qcml2YXRlRXh0ZW5zaW9uTGlzdAlPUFRJT05BTCwgCisJc2xyLUFyZy1QQ1MtRXh0ZW5zaW9ucwlbMV1TTFItQXJnLVBDUy1FeHRlbnNpb25zCU9QVElPTkFMLAorCS4uLn0KKworUHJpdmF0ZUV4dGVuc2lvbkxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUHJpdmF0ZUV4dGVuc2lvbnMpIE9GCisJCQkJUHJpdmF0ZUV4dGVuc2lvbgorCitQcml2YXRlRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisJZXh0SWQJCU1BUC1FWFRFTlNJT04uJmV4dGVuc2lvbklkCisJCQkJKHtFeHRlbnNpb25TZXR9KSwKKwlleHRUeXBlCQlNQVAtRVhURU5TSU9OLiZFeHRlbnNpb25UeXBlCisJCQkJKHtFeHRlbnNpb25TZXR9e0BleHRJZH0pCU9QVElPTkFMfQorCittYXhOdW1PZlByaXZhdGVFeHRlbnNpb25zICBJTlRFR0VSIDo6PSAxMAorCitFeHRlbnNpb25TZXQJCU1BUC1FWFRFTlNJT04gOjo9CisJCXsuLi4KKwkJIC0tIEV4dGVuc2lvblNldCBpcyB0aGUgc2V0IG9mIGFsbCBkZWZpbmVkIHByaXZhdGUgZXh0ZW5zaW9ucworCX0KKwktLSBVbnN1cHBvcnRlZCBwcml2YXRlIGV4dGVuc2lvbnMgc2hhbGwgYmUgZGlzY2FyZGVkIGlmIHJlY2VpdmVkLgorCitQQ1MtRXh0ZW5zaW9ucyA6Oj0gU0VRVUVOQ0UgeworCS4uLn0KKworU0xSLUFyZy1QQ1MtRXh0ZW5zaW9ucyA6Oj0gU0VRVUVOQ0UgeworCS4uLiwKKwluYS1FU1JLLVJlcXVlc3QJWzBdCU5VTEwJCU9QVElPTkFMIH0KKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUxDUy1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTENTLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzNGI4OQotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUxDUy1EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsNjU3IEBACistLSAkSWQ6IE1BUC1MQ1MtRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gTUFQLUxDUy1EYXRhVHlwZXMuYXNuCistLQorLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDI5LjAwMiAgVjguOS4wICgyMDA5LTA0KQorLS0KKy0tIDE3LjcuMTMgTG9jYXRpb24gc2VydmljZSBkYXRhIHR5cGVzCistLQorCitNQVAtTENTLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1MQ1MtRGF0YVR5cGVzICgyNSkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCitJTVBMSUNJVCBUQUdTCis6Oj0KK0JFR0lOCisKK0VYUE9SVFMKKwlSb3V0aW5nSW5mb0ZvckxDUy1BcmcsCisJUm91dGluZ0luZm9Gb3JMQ1MtUmVzLAorCVByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnLAorCVByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tUmVzLAorCVN1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1BcmcsCisJU3Vic2NyaWJlckxvY2F0aW9uUmVwb3J0LVJlcywKK0xvY2F0aW9uVHlwZSwgCitEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlLAorTENTQ2xpZW50TmFtZSwKK0xDUy1Rb1MsCitIb3Jpem9udGFsLUFjY3VyYWN5LAorUmVzcG9uc2VUaW1lLAorRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLCAKK1ZlbG9jaXR5RXN0aW1hdGUsCitTdXBwb3J0ZWRHQURTaGFwZXMsCitBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sCitMQ1NSZXF1ZXN0b3JJRCwgCitMQ1MtUmVmZXJlbmNlTnVtYmVyLAorTENTQ29kZXdvcmQsCitBcmVhRXZlbnRJbmZvLAorUmVwb3J0aW5nUExNTkxpc3QsCitQZXJpb2RpY0xEUkluZm8sCitTZXF1ZW5jZU51bWJlcgorOworCitJTVBPUlRTCisJQWRkcmVzc1N0cmluZywKKwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJSU1FSSwKKwlJTVNJLAorCUxNU0ksCisJU3Vic2NyaWJlcklkZW50aXR5LAorCUFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbiwKKwlMQ1NDbGllbnRFeHRlcm5hbElELAorCUxDU0NsaWVudEludGVybmFsSUQsCitMQ1NTZXJ2aWNlVHlwZUlELAorQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUksCitQTE1OLUlkCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIsCisJU0xSLUFyZ0V4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorCisJVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorVVNTRC1TdHJpbmcKK0ZST00gTUFQLVNTLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKSBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykKKyAgIG1hcC1TUy1EYXRhVHlwZXMgKDE0KSB2ZXJzaW9uMTEgKDExKX0KKworCUFQTiwKKwlHU04tQWRkcmVzcywKKwlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMKK0ZST00gTUFQLU1TLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1NUy1EYXRhVHlwZXMgKDExKSB2ZXJzaW9uMTEgKDExKX0KKworCUFkZGl0aW9uYWwtTnVtYmVyCitGUk9NIE1BUC1TTS1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU00tRGF0YVR5cGVzICgxNikgdmVyc2lvbjExICgxMSl9Cis7CisKKworUm91dGluZ0luZm9Gb3JMQ1MtQXJnIDo6PSBTRVFVRU5DRSB7CisJbWxjTnVtYmVyCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXRhcmdldE1TCQlbMV0gU3Vic2NyaWJlcklkZW50aXR5LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUm91dGluZ0luZm9Gb3JMQ1MtUmVzIDo6PSBTRVFVRU5DRSB7CisJdGFyZ2V0TVMJCVswXSBTdWJzY3JpYmVySWRlbnRpdHksCisJbGNzTG9jYXRpb25JbmZvCVsxXSBMQ1NMb2NhdGlvbkluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXYtZ21sYy1BZGRyZXNzCVszXQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwloLWdtbGMtQWRkcmVzcwlbNF0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJcHByLUFkZHJlc3MJWzVdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWFkZGl0aW9uYWwtdi1nbWxjLUFkZHJlc3MJWzZdCUdTTi1BZGRyZXNzCU9QVElPTkFMIH0KKworTENTTG9jYXRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJbmV0d29ya05vZGUtTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwktLSBOZXR3b3JrTm9kZS1udW1iZXIgY2FuIGJlIGVpdGhlciBtc2MtbnVtYmVyIG9yIHNnc24tbnVtYmVyCisJbG1zaQkJCVswXSBMTVNJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWdwcnNOb2RlSW5kaWNhdG9yIAlbMl0gTlVMTAkJT1BUSU9OQUwsCisJLS0gZ3Byc05vZGVJbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlIFNHU04gbnVtYmVyIGlzIHNlbnQgYXMgdGhlIE5ldHdvcmsgTm9kZSBOdW1iZXIKKwlhZGRpdGlvbmFsLU51bWJlcglbM10gQWRkaXRpb25hbC1OdW1iZXIJT1BUSU9OQUwsCisJc3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCVs0XQlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJT1BUSU9OQUwsCisJYWRkaXRpb25hbC1MQ1MtQ2FwYWJpbGl0eVNldHMJWzVdCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlPUFRJT05BTAorCX0KKworUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcgOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvblR5cGUJTG9jYXRpb25UeXBlLAorCW1sYy1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWxjcy1DbGllbnRJRAlbMF0gTENTLUNsaWVudElECU9QVElPTkFMLAorCXByaXZhY3lPdmVycmlkZQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJaW1zaQkJCVsyXSBJTVNJCQlPUFRJT05BTCwKKwltc2lzZG4JCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbG1zaQkJCVs0XSBMTVNJCQlPUFRJT05BTCwKKwlpbWVpCQkJWzVdIElNRUkJCU9QVElPTkFMLAorCWxjcy1Qcmlvcml0eQlbNl0gTENTLVByaW9yaXR5CU9QVElPTkFMLAorCWxjcy1Rb1MJCVs3XSBMQ1MtUW9TCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbOF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJc3VwcG9ydGVkR0FEU2hhcGVzCVs5XQlTdXBwb3J0ZWRHQURTaGFwZXMJT1BUSU9OQUwsCisJbGNzLVJlZmVyZW5jZU51bWJlcglbMTBdCUxDUy1SZWZlcmVuY2VOdW1iZXIJT1BUSU9OQUwsCisJbGNzU2VydmljZVR5cGVJRAlbMTFdCUxDU1NlcnZpY2VUeXBlSUQJT1BUSU9OQUwsCisJbGNzQ29kZXdvcmQJWzEyXQlMQ1NDb2Rld29yZAlPUFRJT05BTCwKKwlsY3MtUHJpdmFjeUNoZWNrCVsxM10JTENTLVByaXZhY3lDaGVjawlPUFRJT05BTCwKKwlhcmVhRXZlbnRJbmZvCVsxNF0JQXJlYUV2ZW50SW5mbwlPUFRJT05BTCwKKwloLWdtbGMtQWRkcmVzcwlbMTVdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCW1vLWxyU2hvcnRDaXJjdWl0SW5kaWNhdG9yCVsxNl0gTlVMTAkJT1BUSU9OQUwsCisJcGVyaW9kaWNMRFJJbmZvCVsxN10gUGVyaW9kaWNMRFJJbmZvCU9QVElPTkFMLAorCXJlcG9ydGluZ1BMTU5MaXN0CVsxOF0gUmVwb3J0aW5nUExNTkxpc3QJT1BUSU9OQUwgfQorCisJLS0gb25lIG9mIGltc2kgb3IgbXNpc2RuIGlzIG1hbmRhdG9yeQorCS0tIElmIGEgbG9jYXRpb24gZXN0aW1hdGUgdHlwZSBpbmRpY2F0ZXMgYWN0aXZhdGUgZGVmZXJyZWQgbG9jYXRpb24gb3IgY2FuY2VsIGRlZmVycmVkIAorCS0tIGxvY2F0aW9uLCBhIGxjcy1SZWZlcmVuY2UgbnVtYmVyIHNoYWxsIGJlIGluY2x1ZGVkLgorCitMb2NhdGlvblR5cGUgOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvbkVzdGltYXRlVHlwZQlbMF0gTG9jYXRpb25Fc3RpbWF0ZVR5cGUsCisJLi4uLAorCWRlZmVycmVkTG9jYXRpb25FdmVudFR5cGUJWzFdIERlZmVycmVkTG9jYXRpb25FdmVudFR5cGUJT1BUSU9OQUwgfQorCitMb2NhdGlvbkVzdGltYXRlVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJY3VycmVudExvY2F0aW9uCSgwKSwKKwljdXJyZW50T3JMYXN0S25vd25Mb2NhdGlvbgkoMSksCisJaW5pdGlhbExvY2F0aW9uCSgyKSwKKwkuLi4sCisJYWN0aXZhdGVEZWZlcnJlZExvY2F0aW9uCSgzKSwKKwljYW5jZWxEZWZlcnJlZExvY2F0aW9uCSg0KSAsCisJbm90aWZpY2F0aW9uVmVyaWZpY2F0aW9uT25seQkoNSkgfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZyBjb250YWluaW5nIGFuIHVucmVjb2duaXplZCBMb2NhdGlvbkVzdGltYXRlVHlwZQorLS0Jc2hhbGwgYmUgcmVqZWN0ZWQgYnkgdGhlIHJlY2VpdmVyIHdpdGggYSByZXR1cm4gZXJyb3IgY2F1c2Ugb2YgdW5leHBlY3RlZCBkYXRhIHZhbHVlCisKK0RlZmVycmVkTG9jYXRpb25FdmVudFR5cGUgOjo9IEJJVCBTVFJJTkcgeworCW1zQXZhaWxhYmxlCSgwKSAsCisJZW50ZXJpbmdJbnRvQXJlYQkoMSksCisJbGVhdmluZ0Zyb21BcmVhCSgyKSwKKwliZWluZ0luc2lkZUFyZWEJKDMpICwKKwlwZXJpb2RpY0xEUgkoNCkgIH0gKFNJWkUgKDEuLjE2KSkgCistLSBiZWluZ0luc2lkZUFyZWEgaXMgYWx3YXlzIHRyZWF0ZWQgYXMgb25lVGltZUV2ZW50IHJlZ2FyZGxlc3Mgb2YgdGhlIHBvc3NpYmxlIHZhbHVlCistLSBvZiBvY2N1cnJlbmNlSW5mbyBpbnNpZGUgYXJlYUV2ZW50SW5mby4KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIGEgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcgY29udGFpbmluZyBvdGhlciB2YWx1ZXMgdGhhbiBsaXN0ZWQgYWJvdmUgaW4gCistLSBEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlIHNoYWxsIGJlIHJlamVjdGVkIGJ5IHRoZSByZWNlaXZlciB3aXRoIGEgcmV0dXJuIGVycm9yIGNhdXNlIG9mIAorLS0gdW5leHBlY3RlZCBkYXRhIHZhbHVlLgorCitMQ1MtQ2xpZW50SUQgOjo9IFNFUVVFTkNFIHsKKwlsY3NDbGllbnRUeXBlCVswXSBMQ1NDbGllbnRUeXBlLAorCWxjc0NsaWVudEV4dGVybmFsSUQJWzFdIExDU0NsaWVudEV4dGVybmFsSUQJT1BUSU9OQUwsCisJbGNzQ2xpZW50RGlhbGVkQnlNUwlbMl0gQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlsY3NDbGllbnRJbnRlcm5hbElECVszXSBMQ1NDbGllbnRJbnRlcm5hbElECU9QVElPTkFMLAorCWxjc0NsaWVudE5hbWUJWzRdIExDU0NsaWVudE5hbWUJT1BUSU9OQUwsCisJLi4uLAorCWxjc0FQTgkJWzVdIEFQTgkJT1BUSU9OQUwsCisJbGNzUmVxdWVzdG9ySUQJWzZdIExDU1JlcXVlc3RvcklECU9QVElPTkFMIH0KKworTENTQ2xpZW50VHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJZW1lcmdlbmN5U2VydmljZXMJKDApLAorCXZhbHVlQWRkZWRTZXJ2aWNlcwkoMSksCisJcGxtbk9wZXJhdG9yU2VydmljZXMJKDIpLAorCWxhd2Z1bEludGVyY2VwdFNlcnZpY2VzCSgzKSwKKwkuLi4gfQorCS0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLQl1bnJlY29nbml6ZWQgdmFsdWVzIG1heSBiZSBpZ25vcmVkIGlmIHRoZSBMQ1MgY2xpZW50IHVzZXMgdGhlIHByaXZhY3kgb3ZlcnJpZGUKKwktLQlvdGhlcndpc2UsIGFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIGFzIHVuZXhwZWN0ZWQgZGF0YSBieSBhIHJlY2VpdmVyCisJLS0JYSByZXR1cm4gZXJyb3Igc2hhbGwgdGhlbiBiZSByZXR1cm5lZCBpZiByZWNlaXZlZCBpbiBhIE1BUCBpbnZva2UgCisKK0xDU0NsaWVudE5hbWUgOjo9IFNFUVVFTkNFIHsKKwlkYXRhQ29kaW5nU2NoZW1lCVswXSBVU1NELURhdGFDb2RpbmdTY2hlbWUsCisJbmFtZVN0cmluZwlbMl0gTmFtZVN0cmluZywKKwkuLi4sCisJbGNzLUZvcm1hdEluZGljYXRvcglbM10gTENTLUZvcm1hdEluZGljYXRvcglPUFRJT05BTCB9CisKKy0tIFRoZSBVU1NELURhdGFDb2RpbmdTY2hlbWUgc2hhbGwgaW5kaWNhdGUgdXNlIG9mIHRoZSBkZWZhdWx0IGFscGhhYmV0IHRocm91Z2ggdGhlCistLSBmb2xsb3dpbmcgZW5jb2RpbmcKKy0tCWJpdAk3IDYgNSA0IDMgMiAxIDAKKy0tCQkwIDAgMCAwIDEgMSAxIDEKKworTmFtZVN0cmluZyA6Oj0gVVNTRC1TdHJpbmcgKFNJWkUgKDEuLm1heE5hbWVTdHJpbmdMZW5ndGgpKQorCittYXhOYW1lU3RyaW5nTGVuZ3RoICBJTlRFR0VSIDo6PSA2MworCitMQ1NSZXF1ZXN0b3JJRCA6Oj0gU0VRVUVOQ0UgeworCWRhdGFDb2RpbmdTY2hlbWUJWzBdIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwlyZXF1ZXN0b3JJRFN0cmluZwlbMV0gUmVxdWVzdG9ySURTdHJpbmcsCisJLi4uLAorCWxjcy1Gb3JtYXRJbmRpY2F0b3IJWzJdIExDUy1Gb3JtYXRJbmRpY2F0b3IJT1BUSU9OQUwgfQorCitSZXF1ZXN0b3JJRFN0cmluZyA6Oj0gVVNTRC1TdHJpbmcgKFNJWkUgKDEuLm1heFJlcXVlc3RvcklEU3RyaW5nTGVuZ3RoKSkKKworbWF4UmVxdWVzdG9ySURTdHJpbmdMZW5ndGggIElOVEVHRVIgOjo9IDYzCisKK0xDUy1Gb3JtYXRJbmRpY2F0b3IgOjo9IEVOVU1FUkFURUQgeworCWxvZ2ljYWxOYW1lCSgwKSwKKwllLW1haWxBZGRyZXNzCSgxKSwKKwltc2lzZG4JCSgyKSwKKwl1cmwJCQkoMyksCisJc2lwVXJsCQkoNCksCisJLi4uIH0KKworTENTLVByaW9yaXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIDAgPSBoaWdoZXN0IHByaW9yaXR5CisJLS0gMSA9IG5vcm1hbCBwcmlvcml0eQorCS0tIGFsbCBvdGhlciB2YWx1ZXMgdHJlYXRlZCBhcyAxIAorCitMQ1MtUW9TIDo6PSBTRVFVRU5DRSB7CisJaG9yaXpvbnRhbC1hY2N1cmFjeQlbMF0gSG9yaXpvbnRhbC1BY2N1cmFjeQlPUFRJT05BTCwKKwl2ZXJ0aWNhbENvb3JkaW5hdGVSZXF1ZXN0CVsxXSBOVUxMCQlPUFRJT05BTCwKKwl2ZXJ0aWNhbC1hY2N1cmFjeQlbMl0gVmVydGljYWwtQWNjdXJhY3kJT1BUSU9OQUwsCXJlc3BvbnNlVGltZQlbM10gUmVzcG9uc2VUaW1lCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl2ZWxvY2l0eVJlcXVlc3QJWzVdIE5VTEwJCU9QVElPTkFMCit9CisKK0hvcml6b250YWwtQWNjdXJhY3kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gYml0IDggPSAwCisJLS0gYml0cyA3LTEgPSA3IGJpdCBVbmNlcnRhaW50eSBDb2RlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuIFRoZSBob3Jpem9udGFsIGxvY2F0aW9uIAorCS0tIGVycm9yIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIGVycm9yIGluZGljYXRlZCBieSB0aGUgdW5jZXJ0YWludHkgY29kZSB3aXRoIDY3JQorCS0tIGNvbmZpZGVuY2UuCisKK1ZlcnRpY2FsLUFjY3VyYWN5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIGJpdCA4ID0gMAorCS0tIGJpdHMgNy0xID0gNyBiaXQgVmVydGljYWwgVW5jZXJ0YWludHkgQ29kZSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLiAKKwktLSBUaGUgdmVydGljYWwgbG9jYXRpb24gZXJyb3Igc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgZXJyb3IgaW5kaWNhdGVkIAorCS0tIGJ5IHRoZSB1bmNlcnRhaW50eSBjb2RlIHdpdGggNjclIGNvbmZpZGVuY2UuCisKK1Jlc3BvbnNlVGltZSA6Oj0gU0VRVUVOQ0UgeworCXJlc3BvbnNlVGltZUNhdGVnb3J5CVJlc3BvbnNlVGltZUNhdGVnb3J5LAorCS4uLn0KKy0tCW5vdGU6IGFuIGV4cGFuZGFibGUgU0VRVUVOQ0Ugc2ltcGxpZmllcyBsYXRlciBhZGRpdGlvbiBvZiBhIG51bWVyaWMgcmVzcG9uc2UgdGltZS4KKworUmVzcG9uc2VUaW1lQ2F0ZWdvcnkgOjo9IEVOVU1FUkFURUQgeworCWxvd2RlbGF5ICAoMCksCisJZGVsYXl0b2xlcmFudCAgKDEpLAorCS4uLiB9CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyB2YWx1ZSAxIChkZWxheXRvbGVyYW50KQorCitTdXBwb3J0ZWRHQURTaGFwZXMgOjo9IEJJVCBTVFJJTkcgeworCWVsbGlwc29pZFBvaW50ICAoMCksCisJZWxsaXBzb2lkUG9pbnRXaXRoVW5jZXJ0YWludHlDaXJjbGUgKDEpLAorCWVsbGlwc29pZFBvaW50V2l0aFVuY2VydGFpbnR5RWxsaXBzZSAoMiksCisJcG9seWdvbiAoMyksCisJZWxsaXBzb2lkUG9pbnRXaXRoQWx0aXR1ZGUgKDQpLAorCWVsbGlwc29pZFBvaW50V2l0aEFsdGl0dWRlQW5kVW5jZXJ0YWludHlFbGlwc29pZCAoNSksCisJZWxsaXBzb2lkQXJjICAoNikgfSAoU0laRSAoNy4uMTYpKQorLS0gQSBub2RlIHNoYWxsIG1hcmsgaW4gdGhlIEJJVCBTVFJJTkcgYWxsIFNoYXBlcyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyIGl0IHN1cHBvcnRzLgorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiBiaXRzIDcgdG8gMTUgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZC4KKworTENTLVJlZmVyZW5jZU51bWJlcjo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUoMSkpCisKK0xDU0NvZGV3b3JkIDo6PSBTRVFVRU5DRSB7CisJZGF0YUNvZGluZ1NjaGVtZQlbMF0gVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCWxjc0NvZGV3b3JkU3RyaW5nCVsxXSBMQ1NDb2Rld29yZFN0cmluZywKKwkuLi59CisKK0xDU0NvZGV3b3JkU3RyaW5nIDo6PSBVU1NELVN0cmluZyAoU0laRSAoMS4ubWF4TENTQ29kZXdvcmRTdHJpbmdMZW5ndGgpKQorCittYXhMQ1NDb2Rld29yZFN0cmluZ0xlbmd0aCAgSU5URUdFUiA6Oj0gMjAKKworTENTLVByaXZhY3lDaGVjayA6Oj0gU0VRVUVOQ0UgeworCWNhbGxTZXNzaW9uVW5yZWxhdGVkCVswXSBQcml2YWN5Q2hlY2tSZWxhdGVkQWN0aW9uLAorCWNhbGxTZXNzaW9uUmVsYXRlZAlbMV0gUHJpdmFjeUNoZWNrUmVsYXRlZEFjdGlvbglPUFRJT05BTCwKKwkuLi59CisKK1ByaXZhY3lDaGVja1JlbGF0ZWRBY3Rpb24gOjo9IEVOVU1FUkFURUQgeworCWFsbG93ZWRXaXRob3V0Tm90aWZpY2F0aW9uICgwKSwKKwlhbGxvd2VkV2l0aE5vdGlmaWNhdGlvbiAoMSksCisJYWxsb3dlZElmTm9SZXNwb25zZSAoMiksCisJcmVzdHJpY3RlZElmTm9SZXNwb25zZSAoMyksCisJbm90QWxsb3dlZCAoNCksCisJLi4ufQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZyBjb250YWluaW5nIGFuIHVucmVjb2duaXplZCBQcml2YWN5Q2hlY2tSZWxhdGVkQWN0aW9uCistLQlzaGFsbCBiZSByZWplY3RlZCBieSB0aGUgcmVjZWl2ZXIgd2l0aCBhIHJldHVybiBlcnJvciBjYXVzZSBvZiB1bmV4cGVjdGVkIGRhdGEgdmFsdWUKKworQXJlYUV2ZW50SW5mbyA6Oj0gU0VRVUVOQ0UgeworCWFyZWFEZWZpbml0aW9uCVswXQlBcmVhRGVmaW5pdGlvbiwKKwlvY2N1cnJlbmNlSW5mbwlbMV0JT2NjdXJyZW5jZUluZm8JT1BUSU9OQUwsCisJaW50ZXJ2YWxUaW1lCVsyXQlJbnRlcnZhbFRpbWUJT1BUSU9OQUwsCisJLi4ufQorCitBcmVhRGVmaW5pdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWFyZWFMaXN0CQlbMF0JQXJlYUxpc3QsCisJLi4ufQorCitBcmVhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZBcmVhcykgT0YgQXJlYQorCittYXhOdW1PZkFyZWFzICBJTlRFR0VSIDo6PSAxMAorCitBcmVhIDo6PSBTRVFVRU5DRSB7CisJYXJlYVR5cGUJCVswXQlBcmVhVHlwZSwKKwlhcmVhSWRlbnRpZmljYXRpb24JWzFdCUFyZWFJZGVudGlmaWNhdGlvbiwKKwkuLi59CisKK0FyZWFUeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwljb3VudHJ5Q29kZQkoMCksCisJcGxtbklkCQkoMSksCisJbG9jYXRpb25BcmVhSWQJKDIpLAorCXJvdXRpbmdBcmVhSWQJKDMpLAorCWNlbGxHbG9iYWxJZAkoNCksCisJLi4uLAorCXV0cmFuQ2VsbElkCSg1KSB9CisKK0FyZWFJZGVudGlmaWNhdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyLi43KSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdCBpZiAzIGRpZ2l0IE1OQyBpbmNsdWRlZAorCS0tCQkJb3IgZmlsbGVyICgxMTExKQorCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgKExBQykgZm9yIExvY2FsIEFyZWEgSWQsCisJLS0JCQlSb3V0aW5nIEFyZWEgSWQgYW5kIENlbGwgR2xvYmFsIElkCisJLS0gb2N0ZXQgNglSb3V0aW5nIEFyZWEgQ29kZSAoUkFDKSBmb3IgUm91dGluZyBBcmVhIElkCisJLS0gb2N0ZXRzIDYgYW5kIDcJQ2VsbCBJZGVudGl0eSAoQ0kpIGZvciBDZWxsIEdsb2JhbCBJZAorCS0tIG9jdGV0cyA0IHVudGlsIDcJVXRyYW4gQ2VsbCBJZGVudGl0eSAoVUMtSWQpIGZvciBVdHJhbiBDZWxsIElkCisKK09jY3VycmVuY2VJbmZvIDo6PSBFTlVNRVJBVEVEIHsKKwlvbmVUaW1lRXZlbnQJKDApLAorCW11bHRpcGxlVGltZUV2ZW50CSgxKSwKKwkuLi59CisKK0ludGVydmFsVGltZSA6Oj0gSU5URUdFUiAoMS4uMzI3NjcpCisJLS0gbWluaW11bSBpbnRlcnZhbCB0aW1lIGJldHdlZW4gYXJlYSByZXBvcnRzIGluIHNlY29uZHMKKworUGVyaW9kaWNMRFJJbmZvIDo6PSBTRVFVRU5DRSB7CisJcmVwb3J0aW5nQW1vdW50CQlSZXBvcnRpbmdBbW91bnQsCisJcmVwb3J0aW5nSW50ZXJ2YWwJUmVwb3J0aW5nSW50ZXJ2YWwsCisJLi4ufQorLS0gcmVwb3J0aW5nSW50ZXJ2YWwgeCByZXBvcnRpbmdBbW91bnQgc2hhbGwgbm90IGV4Y2VlZCA4NjM5OTk5ICg5OSBkYXlzLCAyMyBob3VycywKKy0tIDU5IG1pbnV0ZXMgYW5kIDU5IHNlY29uZHMpIGZvciBjb21wYXRpYmlsaXR5IHdpdGggT01BIE1MUCBhbmQgUkxQCisKK1JlcG9ydGluZ0Ftb3VudCA6Oj0gSU5URUdFUiAoMS4ubWF4UmVwb3J0aW5nQW1vdW50KQorCittYXhSZXBvcnRpbmdBbW91bnQgSU5URUdFUiA6Oj0gODYzOTk5OQorCitSZXBvcnRpbmdJbnRlcnZhbCA6Oj0gSU5URUdFUiAoMS4ubWF4UmVwb3J0aW5nSW50ZXJ2YWwpCistLSBSZXBvcnRpbmdJbnRlcnZhbCBpcyBpbiBzZWNvbmRzCisKK21heFJlcG9ydGluZ0ludGVydmFsIElOVEVHRVIgOjo9IDg2Mzk5OTkKKworUmVwb3J0aW5nUExNTkxpc3Q6Oj0gU0VRVUVOQ0UgeworCXBsbW4tTGlzdFByaW9yaXRpemVkCQkJWzBdIE5VTEwJCQkJCU9QVElPTkFMLAorCXBsbW4tTGlzdCAJCQkJCQlbMV0gUExNTkxpc3QsCisJLi4ufQorCitQTE1OTGlzdDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlJlcG9ydGluZ1BMTU4pIE9GCisJCQkJUmVwb3J0aW5nUExNTgorCittYXhOdW1PZlJlcG9ydGluZ1BMTU4gSU5URUdFUiA6Oj0gMjAKKworUmVwb3J0aW5nUExNTjo6PSBTRVFVRU5DRSB7CisJcGxtbi1JZCAJCQkJCQlbMF0gUExNTi1JZCwKKwlyYW4tVGVjaG5vbG9neSAJCQkJCVsxXSBSQU4tVGVjaG5vbG9neQkJCU9QVElPTkFMLAorCXJhbi1QZXJpb2RpY0xvY2F0aW9uU3VwcG9ydAkJWzJdIE5VTEwJCQkJCU9QVElPTkFMLAorCS4uLn0KKworUkFOLVRlY2hub2xvZ3kgOjo9IEVOVU1FUkFURUQgeworCWdzbQkJCSgwKSwKKwl1bXRzCQkoMSksCisJLi4ufQorCitQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWxvY2F0aW9uRXN0aW1hdGUJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLAorCWFnZU9mTG9jYXRpb25Fc3RpbWF0ZQlbMF0gQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJYWRkLUxvY2F0aW9uRXN0aW1hdGUJWzJdIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiAJT1BUSU9OQUwsCisJZGVmZXJyZWRtdC1sclJlc3BvbnNlSW5kaWNhdG9yCVszXSBOVUxMCQlPUFRJT05BTCwKKwlnZXJhblBvc2l0aW9uaW5nRGF0YQlbNF0gUG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdXRyYW5Qb3NpdGlvbmluZ0RhdGEJWzVdIFV0cmFuUG9zaXRpb25pbmdEYXRhSW5mbwlPUFRJT05BTCwKKwljZWxsSWRPclNhaQlbNl0gQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkJT1BUSU9OQUwsCisJc2FpLVByZXNlbnQJWzddIE5VTEwJCU9QVElPTkFMLAorCWFjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvcglbOF0gQWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yCQlPUFRJT05BTCwKKwl2ZWxvY2l0eUVzdGltYXRlCVs5XSBWZWxvY2l0eUVzdGltYXRlCU9QVElPTkFMLAorCW1vLWxyU2hvcnRDaXJjdWl0SW5kaWNhdG9yCVsxMF0gTlVMTAkJT1BUSU9OQUwgfQorCistLQlpZiBkZWZlcnJlZG10LWxyUmVzcG9uc2VJbmRpY2F0b3IgaXMgc2V0LCBsb2NhdGlvbkVzdGltYXRlIGlzIGlnbm9yZWQuCisKKy0tIHRoZSBhZGQtTG9jYXRpb25Fc3RpbWF0ZSBwYXJhbWV0ZXIgc2hhbGwgbm90IGJlIHNlbnQgdG8gYSBub2RlIHRoYXQgZGlkIG5vdCBpbmRpY2F0ZSB0aGUKKy0tIGdlb2dyYXBoaWMgc2hhcGVzIHN1cHBvcnRlZCBpbiB0aGUgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcKKy0tIFRoZSBsb2NhdGlvbkVzdGltYXRlIGFuZCB0aGUgYWRkLWxvY2F0aW9uRXN0aW1hdGUgcGFyYW1ldGVycyBzaGFsbCBub3QgYmUgc2VudCBpZgorLS0gdGhlIHN1cHBvcnRlZEdBRFNoYXBlcyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcKKy0tIGFuZCB0aGUgc2hhcGUgZW5jb2RlZCBpbiBsb2NhdGlvbkVzdGltYXRlIG9yIGFkZC1Mb2NhdGlvbkVzdGltYXRlIGlzIG5vdCBtYXJrZWQKKy0tIGFzIHN1cHBvcnRlZCBpbiBzdXBwb3J0ZWRHQURTaGFwZXMuIEluIHN1Y2ggYSBjYXNlIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24KKy0tIHNoYWxsIGJlIHJlamVjdGVkIHdpdGggZXJyb3IgRmFjaWxpdHlOb3RTdXBwb3J0ZWQgd2l0aCBhZGRpdGlvbmFsIGluZGljYXRpb24KKy0tIHNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkLgorLS0gc2FpLVByZXNlbnQgaW5kaWNhdGVzIHRoYXQgdGhlIGNlbGxJZE9yU2FpIHBhcmFtZXRlciBjb250YWlucyBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KKworQWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yIDo6PSBFTlVNRVJBVEVEIHsKKwlyZXF1ZXN0ZWRBY2N1cmFjeUZ1bGZpbGxlZCAgKDApLAorCXJlcXVlc3RlZEFjY3VyYWN5Tm90RnVsZmlsbGVkICAoMSksCisJLi4uCX0KKworRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbikpCisJLS0gUmVmZXJzIHRvIGdlb2dyYXBoaWNhbCBJbmZvcm1hdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgMSBvciBtb3JlIG9jdGV0cyB3aXRoIGFuIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8KKwktLSAzR1BQIFRTIDIzLjAzMgorCS0tIE9jdGV0IDE6IFR5cGUgb2Ygc2hhcGUsIG9ubHkgdGhlIGZvbGxvd2luZyBzaGFwZXMgaW4gM0dQUCBUUyAyMy4wMzIgYXJlIGFsbG93ZWQ6CisJLS0JCShhKSBFbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKwktLQkJKGIpIEVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGVsbGlwc2UKKwktLQkJKGMpIEVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKKwktLQkJKGQpIEVsbGlwc29pZCBBcmMKKwktLQkJKGUpIEVsbGlwc29pZCBQb2ludAorCS0tIEFueSBvdGhlciB2YWx1ZSBpbiBvY3RldCAxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgaW52YWxpZAorCS0tIE9jdGV0cyAyIHRvIDggZm9yIGNhc2UgKGEpIJYgRWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCisJLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJVW5jZXJ0YWludHkgY29kZQkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gMTEgZm9yIGNhc2UgKGIpIJYgRWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgZWxsaXBzZToKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlVbmNlcnRhaW50eSBzZW1pLW1ham9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlVbmNlcnRhaW50eSBzZW1pLW1pbm9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlBbmdsZSBvZiBtYWpvciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJQ29uZmlkZW5jZQkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gMTQgZm9yIGNhc2UgKGMpIJYgRWxsaXBzb2lkIHBvaW50IHdpdGggYWx0aXR1ZGUgYW5kIHVuY2VydGFpbnR5IGVsbGlwc29pZAorCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCUFsdGl0dWRlCQkJCTIgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IHNlbWktbWFqb3IgYXhpcwkJCQkxIG9jdGV0CisJLS0JCVVuY2VydGFpbnR5IHNlbWktbWlub3IgYXhpcwkJCQkxIG9jdGV0CisJLS0JCUFuZ2xlIG9mIG1ham9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlVbmNlcnRhaW50eSBhbHRpdHVkZQkJCQkxIG9jdGV0CisJLS0JCUNvbmZpZGVuY2UJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDEzIGZvciBjYXNlIChkKSCWIEVsbGlwc29pZCBBcmMKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlJbm5lciByYWRpdXMJCQkJMiBvY3RldHMKKwktLQkJVW5jZXJ0YWludHkgcmFkaXVzCQkJCTEgb2N0ZXQKKwktLQkJT2Zmc2V0IGFuZ2xlCQkJCTEgb2N0ZXQKKwktLQkJSW5jbHVkZWQgYW5nbGUJCQkJMSBvY3RldAorCS0tCQlDb25maWRlbmNlCQkJCTEgb2N0ZXQKKwktLSBPY3RldHMgMiB0byA3IGZvciBjYXNlIChlKSCWIEVsbGlwc29pZCBQb2ludAorCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCisKKwktLQorCS0tIEFuIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgY29tcHJpc2luZyBtb3JlIHRoYW4gb25lIG9jdGV0IGFuZAorCS0tIGNvbnRhaW5pbmcgYW55IG90aGVyIHNoYXBlIG9yIGFuIGluY29ycmVjdCBudW1iZXIgb2Ygb2N0ZXRzIG9yIGNvZGluZyBhY2NvcmRpbmcKKwktLSB0byAzR1BQIFRTIDIzLjAzMiBzaGFsbCBiZSB0cmVhdGVkIGFzIGludmFsaWQgZGF0YSBieSBhIHJlY2VpdmVyLgorCS0tCisJLS0gQW4gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBjb21wcmlzaW5nIG9uZSBvY3RldCBzaGFsbCBiZSBkaXNjYXJkZWQKKwktLSBieSB0aGUgcmVjZWl2ZXIgaWYgYW4gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBpcyByZWNlaXZlZCAKKwktLSBpbiB0aGUgc2FtZSBtZXNzYWdlLgorCS0tCisJLS0gQW4gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBjb21wcmlzaW5nIG9uZSBvY3RldCBzaGFsbCBiZSB0cmVhdGVkIGFzCisJLS0gaW52YWxpZCBkYXRhIGJ5IHRoZSByZWNlaXZlciBpZiBhbiBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGlzIG5vdAorCS0tIHJlY2VpdmVkIGluIHRoZSBzYW1lIG1lc3NhZ2UuCisKK21heEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiAgSU5URUdFUiA6Oj0gMjAKKwktLSB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dzIGZvciBmdXJ0aGVyIHNoYXBlcyBpbiAzR1BQIFRTIDIzLjAzMiB0byBiZSBpbmNsdWRlZCBpbiBsYXRlciAKKwktLSB2ZXJzaW9ucyBvZiAzR1BQIFRTIDI5LjAwMgorCitWZWxvY2l0eUVzdGltYXRlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQuLjcpKQorCS0tIFJlZmVycyB0byBWZWxvY2l0eSBkZXNjcmlwdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgNCBvciBtb3JlIG9jdGV0cyB3aXRoIGFuIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8KKwktLSAzR1BQIFRTIDIzLjAzMgorCS0tIE9jdGV0IDE6IFR5cGUgb2YgdmVsb2NpdHksIG9ubHkgdGhlIGZvbGxvd2luZyB0eXBlcyBpbiAzR1BQIFRTIDIzLjAzMiBhcmUgYWxsb3dlZDoKKwktLQkJKGEpIEhvcml6b250YWwgVmVsb2NpdHkKKwktLQkJKGIpIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eQorCS0tCQkoYykgSG9yaXpvbnRhbCBWZWxvY2l0eSB3aXRoIFVuY2VydGFpbnR5CisJLS0JCShkKSBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkgYW5kIFVuY2VydGFpbnR5CisJLS0gRm9yIHR5cGVzIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eSBhbmQgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5CisJLS0gYW5kIFVuY2VydGFpbnR5LCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBWZXJ0aWNhbCBTcGVlZCBpcyBhbHNvIGluY2x1ZGVkIGluIE9jdGV0IDEKKwktLSBBbnkgb3RoZXIgdmFsdWUgaW4gb2N0ZXQgMSBzaGFsbCBiZSB0cmVhdGVkIGFzIGludmFsaWQKKwktLSBPY3RldHMgMiB0byA0IGZvciBjYXNlIChhKSBIb3Jpem9udGFsIHZlbG9jaXR5OgorCS0tCQlCZWFyaW5nCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBTcGVlZAkJCQkyIG9jdGV0cworCS0tIE9jdGV0cyAyIHRvIDUgZm9yIGNhc2UgKGIpIJYgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5OgorCS0tCQlCZWFyaW5nCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBTcGVlZAkJCQkyIG9jdGV0cworCS0tCQlWZXJ0aWNhbCBTcGVlZAkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gNSBmb3IgY2FzZSAoYykgliBIb3Jpem9udGFsIHZlbG9jaXR5IHdpdGggVW5jZXJ0YWludHk6CisJLS0JCUJlYXJpbmcJCQkJMSBvY3RldAorCS0tCQlIb3Jpem9udGFsIFNwZWVkCQkJCTIgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IFNwZWVkCQkJCTEgb2N0ZXQKKwktLSBPY3RldHMgMiB0byA3IGZvciBjYXNlIChkKSCWIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eSBhbmQgVW5jZXJ0YWludHk6CisJLS0JCUJlYXJpbmcJCQkJMSBvY3RldAorCS0tCQlIb3Jpem9udGFsIFNwZWVkCQkJCTIgb2N0ZXRzCisJLS0JCVZlcnRpY2FsIFNwZWVkCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBVbmNlcnRhaW50eSBTcGVlZAkJCTEgb2N0ZXQKKwktLQkJVmVydGljYWwgVW5jZXJ0YWludHkgU3BlZWQJCQkJMSBvY3RldAorCitQb3NpdGlvbmluZ0RhdGFJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyLi5tYXhQb3NpdGlvbmluZ0RhdGFJbmZvcm1hdGlvbikpCisJLS0gUmVmZXJzIHRvIHRoZSBQb3NpdGlvbmluZyBEYXRhIGRlZmluZWQgaW4gM0dQUCBUUyA0OS4wMzEuCisJLS0gVGhpcyBpcyBjb21wb3NlZCBvZiAyIG9yIG1vcmUgb2N0ZXRzIHdpdGggYW4gaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0bworCS0tIDNHUFAgVFMgNDkuMDMxLiAKKworbWF4UG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24gSU5URUdFUiA6Oj0gMTAKKwktLSAKKworVXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMuLm1heFV0cmFuUG9zaXRpb25pbmdEYXRhSW5mbykpCisJLS0gUmVmZXJzIHRvIHRoZSBQb3NpdGlvbiBEYXRhIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMuCisJLS0gVGhpcyBpcyBjb21wb3NlZCBvZiB0aGUgcG9zaXRpb25pbmdEYXRhRGlzY3JpbWluYXRvciBhbmQgdGhlIHBvc2l0aW9uaW5nRGF0YVNldAorCS0tIGluY2x1ZGVkIGluIHBvc2l0aW9uRGF0YSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLgorCittYXhVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8gSU5URUdFUiA6Oj0gMTEKKwktLSAKKworQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbikpCisJLS0gUmVmZXJzIHRvIGdlb2dyYXBoaWNhbCBJbmZvcm1hdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgMSBvciBtb3JlIG9jdGV0cyB3aXRoIGFuIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gCisJLS0gM0dQUCBUUyAyMy4wMzIKKwktLSBPY3RldCAxOiBUeXBlIG9mIHNoYXBlLCBhbGwgdGhlIHNoYXBlcyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyIGFyZSBhbGxvd2VkOgorCS0tIE9jdGV0cyAyIHRvIG4gKHdoZXJlIG4gaXMgdGhlIHRvdGFsIG51bWJlciBvZiBvY3RldHMgbmVjZXNzYXJ5IHRvIGVuY29kZSB0aGUgc2hhcGUKKwktLSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMy4wMzIpIGFyZSB1c2VkIHRvIGVuY29kZSB0aGUgc2hhcGUgaXRzZWxmIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKwktLSBlbmNvZGluZyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyCisJLS0KKwktLSBBbiBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyLCB3aGV0aGVyIHZhbGlkIG9yIGludmFsaWQsIHJlY2VpdmVkIAorCS0tIHRvZ2V0aGVyIHdpdGggYSB2YWxpZCBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGluIHRoZSBzYW1lIG1lc3NhZ2UgCisJLS0gc2hhbGwgYmUgZGlzY2FyZGVkLgorCS0tCisJLS0gQW4gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBjb250YWluaW5nIGFueSBzaGFwZSBub3QgZGVmaW5lZCBpbiAKKwktLSAzR1BQIFRTIDIzLjAzMiBvciBhbiBpbmNvcnJlY3QgbnVtYmVyIG9mIG9jdGV0cyBvciBjb2RpbmcgYWNjb3JkaW5nIHRvIAorCS0tIDNHUFAgVFMgMjMuMDMyIHNoYWxsIGJlIHRyZWF0ZWQgYXMgaW52YWxpZCBkYXRhIGJ5IGEgcmVjZWl2ZXIgaWYgbm90IHJlY2VpdmVkIAorCS0tIHRvZ2V0aGVyIHdpdGggYSB2YWxpZCBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGluIHRoZSBzYW1lIG1lc3NhZ2UuCisKK21heEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiAgSU5URUdFUiA6Oj0gOTEKKwktLSB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dzIHN1cHBvcnQgZm9yIGFsbCB0aGUgc2hhcGVzIGN1cnJlbnRseSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyCisKK1N1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1BcmcgOjo9IFNFUVVFTkNFIHsKKwlsY3MtRXZlbnQJCUxDUy1FdmVudCwKKwlsY3MtQ2xpZW50SUQJTENTLUNsaWVudElELCAKKwlsY3NMb2NhdGlvbkluZm8JTENTTG9jYXRpb25JbmZvLAorCW1zaXNkbgkJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlpbXNpCQkJWzFdIElNU0kJCU9QVElPTkFMLAorCWltZWkJCQlbMl0gSU1FSQkJT1BUSU9OQUwsCisJbmEtRVNSRAkJWzNdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwluYS1FU1JLCQlbNF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWxvY2F0aW9uRXN0aW1hdGUJWzVdIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlhZ2VPZkxvY2F0aW9uRXN0aW1hdGUJWzZdIEFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCwKKwlzbHItQXJnRXh0ZW5zaW9uQ29udGFpbmVyCVs3XSBTTFItQXJnRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJYWRkLUxvY2F0aW9uRXN0aW1hdGUJWzhdIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlkZWZlcnJlZG10LWxyRGF0YQlbOV0gRGVmZXJyZWRtdC1sckRhdGEJT1BUSU9OQUwsIAorCWxjcy1SZWZlcmVuY2VOdW1iZXIJWzEwXSBMQ1MtUmVmZXJlbmNlTnVtYmVyCU9QVElPTkFMLAorCWdlcmFuUG9zaXRpb25pbmdEYXRhCVsxMV0gUG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdXRyYW5Qb3NpdGlvbmluZ0RhdGEJWzEyXSBVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8JT1BUSU9OQUwsCisJY2VsbElkT3JTYWkJWzEzXQlDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSQlPUFRJT05BTCwKKwloLWdtbGMtQWRkcmVzcwlbMTRdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWxjc1NlcnZpY2VUeXBlSUQJWzE1XQlMQ1NTZXJ2aWNlVHlwZUlECU9QVElPTkFMLAorCXNhaS1QcmVzZW50CVsxN10gTlVMTAkJT1BUSU9OQUwsCisJcHNldWRvbnltSW5kaWNhdG9yCVsxOF0gTlVMTAkJT1BUSU9OQUwsCisJYWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yCVsxOV0gQWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yCU9QVElPTkFMLAorCXZlbG9jaXR5RXN0aW1hdGUJWzIwXSBWZWxvY2l0eUVzdGltYXRlCU9QVElPTkFMLAorCXNlcXVlbmNlTnVtYmVyCVsyMV0gU2VxdWVuY2VOdW1iZXIJT1BUSU9OQUwsCisJcGVyaW9kaWNMRFJJbmZvCVsyMl0gUGVyaW9kaWNMRFJJbmZvCU9QVElPTkFMLAorCW1vLWxyU2hvcnRDaXJjdWl0SW5kaWNhdG9yCVsyM10gTlVMTAkJT1BUSU9OQUwgfQorCisJLS0gb25lIG9mIG1zaXNkbiBvciBpbXNpIGlzIG1hbmRhdG9yeQorCS0tIGEgbG9jYXRpb24gZXN0aW1hdGUgdGhhdCBpcyB2YWxpZCBmb3IgdGhlIGxvY2F0aW9uRXN0aW1hdGUgcGFyYW1ldGVyIHNob3VsZCAKKwktLSBiZSB0cmFuc2ZlcnJlZCBpbiB0aGlzIHBhcmFtZXRlciBpbiBwcmVmZXJlbmNlIHRvIHRoZSBhZGQtTG9jYXRpb25Fc3RpbWF0ZS4KKwktLSB0aGUgZGVmZXJyZWRtdC1sckRhdGEgcGFyYW1ldGVyIHNoYWxsIGJlIGluY2x1ZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSBsY3MtRXZlbnQKKwktLSBpbmRpY2F0ZXMgYSBkZWZlcnJlZG10LWxyUmVzcG9uc2UuCisJLS0gaWYgdGhlIGxjcy1FdmVudCBpbmRpY2F0ZXMgYSBkZWZlcnJlZG10LWxyUmVzcG9uc2UgdGhlbiB0aGUgbG9jYXRpb25Fc3RpbWF0ZSAKKwktLSBhbmQgdGhlIGFkZC1sb2NhdGlvbkVzdGltYXRlIHBhcmFtZXRlcnMgc2hhbGwgbm90IGJlIHNlbnQgaWYgdGhlIAorCS0tIHN1cHBvcnRlZEdBRFNoYXBlcyBwYXJhbWV0ZXIgaGFkIGJlZW4gcmVjZWl2ZWQgaW4gUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcKKwktLSBhbmQgdGhlIHNoYXBlIGVuY29kZWQgaW4gbG9jYXRpb25Fc3RpbWF0ZSBvciBhZGQtTG9jYXRpb25Fc3RpbWF0ZSB3YXMgbm90IG1hcmtlZAorCS0tIGFzIHN1cHBvcnRlZCBpbiBzdXBwb3J0ZWRHQURTaGFwZXMuIEluIHN1Y2ggYSBjYXNlIHRlcm1pbmF0aW9uQ2F1c2UgCisJLS0gaW4gZGVmZXJyZWRtdC1sckRhdGEgc2hhbGwgYmUgcHJlc2VudCB3aXRoIHZhbHVlIAorCS0tIHNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkLiAKKwktLSBJZiBhIGxjcyBldmVudCBpbmRpY2F0ZXMgZGVmZXJyZWQgbXQtbHIgcmVzcG9uc2UsIHRoZSBsY3MtUmVmZXJlbmNlIG51bWJlciBzaGFsbCBiZSAKKwktLSBpbmNsdWRlZC4gCisJLS0gc2FpLVByZXNlbnQgaW5kaWNhdGVzIHRoYXQgdGhlIGNlbGxJZE9yU2FpIHBhcmFtZXRlciBjb250YWlucyBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KKworRGVmZXJyZWRtdC1sckRhdGEgOjo9IFNFUVVFTkNFIHsKKwlkZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlCURlZmVycmVkTG9jYXRpb25FdmVudFR5cGUsCisJdGVybWluYXRpb25DYXVzZQlbMF0gVGVybWluYXRpb25DYXVzZQlPUFRJT05BTCwKKwlsY3NMb2NhdGlvbkluZm8JWzFdIExDU0xvY2F0aW9uSW5mbwlPUFRJT05BTCwKKwkuLi59CisJLS0gbGNzTG9jYXRpb25JbmZvIG1heSBiZSBpbmNsdWRlZCBvbmx5IGlmIGEgdGVybWluYXRpb25DYXVzZSBpcyBwcmVzZW50IAorCS0tIGluZGljYXRpbmcgbXQtbHJSZXN0YXJ0LgorCitMQ1MtRXZlbnQgOjo9IEVOVU1FUkFURUQgeworCWVtZXJnZW5jeUNhbGxPcmlnaW5hdGlvbiAgKDApLAorCWVtZXJnZW5jeUNhbGxSZWxlYXNlICAoMSksIAorCW1vLWxyICAoMiksCisJLi4uLAorCWRlZmVycmVkbXQtbHJSZXNwb25zZSAgKDMpICwKKwlkZWZlcnJlZG1vLWxyVFRUUEluaXRpYXRpb24gICg0KSAgfQorCS0tCWRlZmVycmVkbXQtbHJSZXNwb25zZSBpcyBhcHBsaWNhYmxlIHRvIHRoZSBkZWxpdmVyeSBvZiBhIGxvY2F0aW9uIGVzdGltYXRlIAorCS0tCWZvciBhbiBMRFIgaW5pdGlhdGVkIGVhcmxpZXIgYnkgZWl0aGVyIHRoZSBuZXR3b3JrICh2aWEgYW4gTVQtTFIgYWN0aXZhdGUgZGVmZXJyZWQgCisJLS0JbG9jYXRpb24pIG9yIHRoZSBVRSAodmlhIGEgZGVmZXJyZWQgTU8tTFIgVFRUUCBpbml0aWF0aW9uKQorCS0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLQlhIFN1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1BcmcgY29udGFpbmluZyBhbiB1bnJlY29nbml6ZWQgTENTLUV2ZW50CisJLS0Jc2hhbGwgYmUgcmVqZWN0ZWQgYnkgYSByZWNlaXZlciB3aXRoIGEgcmV0dXJuIGVycm9yIGNhdXNlIG9mIHVuZXhwZWN0ZWQgZGF0YSB2YWx1ZQorCitUZXJtaW5hdGlvbkNhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwlub3JtYWwgICgwKSwKKwllcnJvcnVuZGVmaW5lZCAgKDEpLAorCWludGVybmFsVGltZW91dCAgKDIpLAorCWNvbmdlc3Rpb24gICgzKSwKKwltdC1sclJlc3RhcnQgICg0KSwKKwlwcml2YWN5VmlvbGF0aW9uICAoNSksCisJLi4uLAorCXNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkICg2KSAsCisJc3Vic2NyaWJlclRlcm1pbmF0aW9uICg3KSwKKwl1RVRlcm1pbmF0aW9uICg4KSwKKwluZXR3b3JrVGVybWluYXRpb24gKDkpICB9IAorLS0gbXQtbHJSZXN0YXJ0IHNoYWxsIGJlIHVzZWQgdG8gdHJpZ2dlciB0aGUgR01MQyB0byByZXN0YXJ0IHRoZSBsb2NhdGlvbiBwcm9jZWR1cmUsIAorLS0gZWl0aGVyIGJlY2F1c2UgdGhlIHNlbmRpbmcgbm9kZSBrbm93cyB0aGF0IHRoZSB0ZXJtaW5hbCBoYXMgbW92ZWQgdW5kZXIgY292ZXJhZ2UgCistLSBvZiBhbm90aGVyIE1TQyBvciBTR1NOIChlLmcuIFNlbmQgSWRlbnRpZmljYXRpb24gcmVjZWl2ZWQpLCBvciBiZWNhdXNlIHRoZSBzdWJzY3JpYmVyCistLSBoYXMgYmVlbiBkZXJlZ2lzdGVyZWQgZHVlIHRvIGEgQ2FuY2VsIExvY2F0aW9uIHJlY2VpdmVkIGZyb20gSExSLgorLS0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZworLS0gYW4gdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdmFsdWUgMSAoZXJyb3J1bmRlZmluZWQpIAorCitTZXF1ZW5jZU51bWJlciA6Oj0gSU5URUdFUiAoMS4ubWF4UmVwb3J0aW5nQW1vdW50KQorCitTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwgCisJLi4uLCAKKwluYS1FU1JLCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW5hLUVTUkQJCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJaC1nbWxjLUFkZHJlc3MJWzJdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCW1vLWxyU2hvcnRDaXJjdWl0SW5kaWNhdG9yCVszXSBOVUxMCQlPUFRJT05BTCwKKwlyZXBvcnRpbmdQTE1OTGlzdAlbNF0gUmVwb3J0aW5nUExNTkxpc3QJT1BUSU9OQUwsCisJbGNzLVJlZmVyZW5jZU51bWJlcglbNV0JTENTLVJlZmVyZW5jZU51bWJlcglPUFRJT05BTCB9CisKKy0tIG5hLUVTUksgYW5kIG5hLUVTUkQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZQorLS0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZworLS0gcmVjZWlwdCBvZiBib3RoIG5hLUVTUksgYW5kIG5hLUVTUkQgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBhIHJldHVybiBlcnJvcgorCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1NUy1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTVMtRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzEyYTAyCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTVMtRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDI3ODAgQEAKKy0tICRJZDogTUFQLU1TLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgCistLSAxNy43LjEJTW9iaWxlIFNlcnZpY2UgZGF0YSB0eXBlcworCitNQVAtTVMtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLU1TLURhdGFUeXBlcyAoMTEpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisKKwktLSBsb2NhdGlvbiByZWdpc3RyYXRpb24gdHlwZXMKKwlVcGRhdGVMb2NhdGlvbkFyZywKKwlVcGRhdGVMb2NhdGlvblJlcywKKwlDYW5jZWxMb2NhdGlvbkFyZywKKwlDYW5jZWxMb2NhdGlvblJlcywgCisJUHVyZ2VNUy1BcmcsIAorCVB1cmdlTVMtUmVzLAorCVNlbmRJZGVudGlmaWNhdGlvbkFyZywKKwlTZW5kSWRlbnRpZmljYXRpb25SZXMsIAorCVVwZGF0ZUdwcnNMb2NhdGlvbkFyZywKKwlVcGRhdGVHcHJzTG9jYXRpb25SZXMsCisJSVNULVN1cHBvcnRJbmRpY2F0b3IsIAorCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cywKKworCS0tIGdwcnMgbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCisJR1NOLUFkZHJlc3MsCisKKwktLSBoYW5kb3ZlciB0eXBlcworCUZvcndhcmRBY2Nlc3NTaWduYWxsaW5nLUFyZywKKwlQcmVwYXJlSE8tQXJnLAorCVByZXBhcmVITy1SZXMsCisJUHJlcGFyZVN1YnNlcXVlbnRITy1BcmcsIAorCVByZXBhcmVTdWJzZXF1ZW50SE8tUmVzLAorCVByb2Nlc3NBY2Nlc3NTaWduYWxsaW5nLUFyZywKKwlTZW5kRW5kU2lnbmFsLUFyZywKKwlTZW5kRW5kU2lnbmFsLVJlcywKKworCS0tIGF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgdHlwZXMKKwlTZW5kQXV0aGVudGljYXRpb25JbmZvQXJnLAorCVNlbmRBdXRoZW50aWNhdGlvbkluZm9SZXMsIAorCUF1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydEFyZywKK0F1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydFJlcywKKworCS0tIHNlY3VyaXR5IG1hbmFnZW1lbnQgdHlwZXMKKwlLYywgCisJQ2tzbiwKKworCS0tIGVxdWlwbWVudCBtYW5hZ2VtZW50IHR5cGVzCisJQ2hlY2tJTUVJLUFyZywKKwlDaGVja0lNRUktUmVzLAorCisJLS0gc3Vic2NyaWJlciBtYW5hZ2VtZW50IHR5cGVzCisJSW5zZXJ0U3Vic2NyaWJlckRhdGFBcmcsCisJSW5zZXJ0U3Vic2NyaWJlckRhdGFSZXMsIAorCUxTQUlkZW50aXR5LAorCURlbGV0ZVN1YnNjcmliZXJEYXRhQXJnLAorCURlbGV0ZVN1YnNjcmliZXJEYXRhUmVzLAorCUV4dC1Rb1MtU3Vic2NyaWJlZCwKKwlFeHQyLVFvUy1TdWJzY3JpYmVkLCAKKwlFeHQzLVFvUy1TdWJzY3JpYmVkLAorCVN1YnNjcmliZXJEYXRhLAorCU9EQi1EYXRhLAorCVN1YnNjcmliZXJTdGF0dXMsCisJWm9uZUNvZGVMaXN0LAorCW1heE51bU9mWm9uZUNvZGVzLCAKKwlPLUNTSSwgCitELUNTSSwKKwlPLUJjc21DYW1lbFREUENyaXRlcmlhTGlzdCwgCisJVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QsCisJU1MtQ1NJLAorCVNlcnZpY2VLZXksCisJRGVmYXVsdENhbGxIYW5kbGluZywKKwlDYW1lbENhcGFiaWxpdHlIYW5kbGluZywKKwlCYXNpY1NlcnZpY2VDcml0ZXJpYSwKKwlTdXBwb3J0ZWRDYW1lbFBoYXNlcywKKwlPZmZlcmVkQ2FtZWw0Q1NJcywKKwlPZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzLAorCW1heE51bU9mQ2FtZWxURFBEYXRhLAorCUNVRy1JbmRleCwgCisJQ1VHLUluZm8sCisJQ1VHLUludGVybG9jaywKKwlJbnRlckNVRy1SZXN0cmljdGlvbnMsCisJSW50cmFDVUctT3B0aW9ucywKKwlOb3RpZmljYXRpb25Ub01TVXNlciwgCisJUW9TLVN1YnNjcmliZWQsCitJU1QtQWxlcnRUaW1lclZhbHVlLAorCVQtQ1NJLAorCVQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKK0FQTiwKK0FkZGl0aW9uYWxJbmZvLAorCisJLS0gZmF1bHQgcmVjb3ZlcnkgdHlwZXMKKwlSZXNldEFyZywKKwlSZXN0b3JlRGF0YUFyZywKKwlSZXN0b3JlRGF0YVJlcywKKworLS0gcHJvdmlkZSBzdWJzY3JpYmVyIGluZm8gdHlwZXMgCitHZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgCitNUy1DbGFzc21hcmsyLAorR1BSU01TQ2xhc3MsCisKKwktLSBzdWJzY3JpYmVyIGluZm9ybWF0aW9uIGVucXVpcnkgdHlwZXMKKwlQcm92aWRlU3Vic2NyaWJlckluZm9BcmcsCisJUHJvdmlkZVN1YnNjcmliZXJJbmZvUmVzLAorCVN1YnNjcmliZXJJbmZvLAorCUxvY2F0aW9uSW5mb3JtYXRpb24sCisJTG9jYXRpb25JbmZvcm1hdGlvbkdQUlMsCisJUkFJZGVudGl0eSwKKwlTdWJzY3JpYmVyU3RhdGUsCisJR1BSU0NoYXJnaW5nSUQsIAorTU5QSW5mb1JlcywKKwlSb3V0ZWluZ051bWJlciwKKworCS0tIGFueSB0aW1lIGluZm9ybWF0aW9uIGVucXVpcnkgdHlwZXMKKwlBbnlUaW1lSW50ZXJyb2dhdGlvbkFyZywKKwlBbnlUaW1lSW50ZXJyb2dhdGlvblJlcywKKworCS0tIGFueSB0aW1lIGluZm9ybWF0aW9uIGhhbmRsaW5nIHR5cGVzCisJQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25BcmcsCisJQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25SZXMsCisJQW55VGltZU1vZGlmaWNhdGlvbkFyZywKKwlBbnlUaW1lTW9kaWZpY2F0aW9uUmVzLAorCisJLS0gc3Vic2NyaWJlciBkYXRhIG1vZGlmaWNhdGlvbiBub3RpZmljYXRpb24gdHlwZXMKKwlOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZEFyZywKKwlOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZFJlcywKKworCS0tIGdwcnMgbG9jYXRpb24gaW5mb3JtYXRpb24gcmV0cmlldmFsIHR5cGVzCisJU2VuZFJvdXRpbmdJbmZvRm9yR3Byc0FyZywKKwlTZW5kUm91dGluZ0luZm9Gb3JHcHJzUmVzLAorCisJLS0gZmFpbHVyZSByZXBvcnRpbmcgdHlwZXMKKwlGYWlsdXJlUmVwb3J0QXJnLAorCUZhaWx1cmVSZXBvcnRSZXMsCisKKwktLSBncHJzIG5vdGlmaWNhdGlvbiB0eXBlcworCU5vdGVNc1ByZXNlbnRGb3JHcHJzQXJnLAorCU5vdGVNc1ByZXNlbnRGb3JHcHJzUmVzLAorCisJLS0gTW9iaWxpdHkgTWFuYWdlbWVudCB0eXBlcworTm90ZU1NLUV2ZW50QXJnLAorCU5vdGVNTS1FdmVudFJlcywKKwlOdW1iZXJQb3J0YWJpbGl0eVN0YXR1cywKKwlQYWdpbmdBcmVhLAorCisJLS0gVkdDUyAvIFZCUyB0eXBlcyB0eXBlcworR3JvdXBJZCwgCitMb25nLUdyb3VwSWQsCitBZGRpdGlvbmFsU3Vic2NyaXB0aW9ucworCis7CisKK0lNUE9SVFMKKwltYXhOdW1PZlNTLAorCVNTLVN1YnNjcmlwdGlvbk9wdGlvbiwKKwlTUy1MaXN0LAorCVNTLUZvckJTLUNvZGUsCisJUGFzc3dvcmQKK0ZST00gTUFQLVNTLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1EYXRhVHlwZXMgKDE0KSB2ZXJzaW9uMTEgKDExKX0KKworCVNTLUNvZGUKK0ZST00gTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0LUJlYXJlclNlcnZpY2VDb2RlCitGUk9NIE1BUC1CUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUJTLUNvZGUgKDIwKSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dC1UZWxlc2VydmljZUNvZGUKK0ZST00gTUFQLVRTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtVFMtQ29kZSAoMTkpIHZlcnNpb24xMSAoMTEpfQorCisJQWRkcmVzc1N0cmluZywKK0lTRE4tQWRkcmVzc1N0cmluZywgCisJSVNETi1TdWJhZGRyZXNzU3RyaW5nLCAKKwlGVE4tQWRkcmVzc1N0cmluZywKKwlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlJTVNJLCAKKwlJTUVJLAorCVRNU0ksCisJSExSLUxpc3QsCisJTE1TSSwKKwlJZGVudGl0eSwKKwlHbG9iYWxDZWxsSWQsCisJQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUksCisJRXh0LUJhc2ljU2VydmljZUNvZGUsCisJTkFFQS1QcmVmZXJyZWRDSSwKKwlFTUxQUC1JbmZvLCAKKwlNQy1TUy1JbmZvLAorCVN1YnNjcmliZXJJZGVudGl0eSwKKwlBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24sCisJTENTQ2xpZW50RXh0ZXJuYWxJRCwKKwlMQ1NDbGllbnRJbnRlcm5hbElELAorCUV4dC1TUy1TdGF0dXMsCisJTENTU2VydmljZVR5cGVJRCwKKwlBU0NJLUNhbGxSZWZlcmVuY2UsCisJVEJDRC1TVFJJTkcsCisJTEFJRml4ZWRMZW5ndGgsCisJUExNTi1JZCwKK0VNTFBQLVByaW9yaXR5CitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00KK0ZST00gTUFQLUVSLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FUi1EYXRhVHlwZXMgKDE3KSB2ZXJzaW9uMTEgKDExKX0KKworCVRyYWNlUHJvcGFnYXRpb25MaXN0CitGUk9NIE1BUC1PTS1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtT00tRGF0YVR5cGVzICgxMikgdmVyc2lvbjExICgxMSl9CisKKzsKKworLS0gbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCisKK1VwZGF0ZUxvY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJbXNjLU51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXZsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWxtc2kJCQlbMTBdIExNU0kJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwl2bHItQ2FwYWJpbGl0eQlbNl0gVkxSLUNhcGFiaWxpdHkJT1BUSU9OQUwsCisJaW5mb3JtUHJldmlvdXNOZXR3b3JrRW50aXR5CVsxMV0JTlVMTAkJT1BUSU9OQUwsCisJY3MtTENTLU5vdFN1cHBvcnRlZEJ5VUUJWzEyXQlOVUxMCQlPUFRJT05BTCwKKwl2LWdtbGMtQWRkcmVzcwlbMl0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJYWRkLWluZm8JCVsxM10gQURELUluZm8JT1BUSU9OQUwsCisJcGFnaW5nQXJlYQlbMTRdIFBhZ2luZ0FyZWEJT1BUSU9OQUwsCisJc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlCVsxNV0gTlVMTAkJT1BUSU9OQUwgCisJLS0gVGhlIHNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIFVwZGF0ZUxvY2F0aW9uQXJnIGFuZCB0aGUgQURELUluZm8KKwktLSBzdHJ1Y3R1cmVzIGNhcnJ5IHRoZSBzYW1lIHNlbWFudGljLgorCSB9CisKK1ZMUi1DYXBhYmlsaXR5IDo6PSBTRVFVRU5DRXsKKwlzdXBwb3J0ZWRDYW1lbFBoYXNlcyAgCVswXSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJc29sc2FTdXBwb3J0SW5kaWNhdG9yCVsyXSBOVUxMCQlPUFRJT05BTCwKKwlpc3RTdXBwb3J0SW5kaWNhdG9yCVsxXSBJU1QtU3VwcG9ydEluZGljYXRvcglPUFRJT05BTCwKKwlzdXBlckNoYXJnZXJTdXBwb3J0ZWRJblNlcnZpbmdOZXR3b3JrRW50aXR5CVszXSBTdXBlckNoYXJnZXJJbmZvCU9QVElPTkFMLAorCWxvbmdGVE4tU3VwcG9ydGVkCVs0XQlOVUxMCQlPUFRJT05BTCwKKwlzdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJWzVdCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlPUFRJT05BTCwKKwlvZmZlcmVkQ2FtZWw0Q1NJcwlbNl0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkUkFULVR5cGVzSW5kaWNhdG9yCVs3XQlTdXBwb3J0ZWRSQVQtVHlwZXMJT1BUSU9OQUwsCisJbG9uZ0dyb3VwSUQtU3VwcG9ydGVkCVs4XQlOVUxMCQlPUFRJT05BTCB9CisKK1N1cHBvcnRlZFJBVC1UeXBlczo6PSBCSVQgU1RSSU5HIHsKKwl1dHJhbiAgKDApLAorCWdlcmFuICAoMSksCisJZ2FuICAgICgyKSwKKwlpLWhzcGEtZXZvbHV0aW9uICgzKSwKKwllLXV0cmFuCSg0KX0gKFNJWkUgKDIuLjgpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogYml0cyA1IHRvIDcgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKwkgCisKKworU3VwZXJDaGFyZ2VySW5mbyA6Oj0gQ0hPSUNFIHsKKwlzZW5kU3Vic2NyaWJlckRhdGEJWzBdIE5VTEwsCisJc3Vic2NyaWJlckRhdGFTdG9yZWQJWzFdIEFnZUluZGljYXRvciB9CisKK0FnZUluZGljYXRvciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi42KSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIHRoaXMgcGFyYW1ldGVyIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLgorCitJU1QtU3VwcG9ydEluZGljYXRvciA6Oj0gIEVOVU1FUkFURUQgeworCWJhc2ljSVNUU3VwcG9ydGVkCSgwKSwKKwlpc3RDb21tYW5kU3VwcG9ydGVkCSgxKSwKKwkuLi59CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSByZWNlcHRpb24gb2YgdmFsdWVzID4gMSBzaGFsbCBiZSBtYXBwZWQgdG8gJyBpc3RDb21tYW5kU3VwcG9ydGVkICcKKworU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzIDo6PSBCSVQgU1RSSU5HIHsKKwlsY3NDYXBhYmlsaXR5U2V0MSAoMCksCisJbGNzQ2FwYWJpbGl0eVNldDIgKDEpLAorCWxjc0NhcGFiaWxpdHlTZXQzICgyKSwKKwlsY3NDYXBhYmlsaXR5U2V0NCAoMykgLAorCWxjc0NhcGFiaWxpdHlTZXQ1ICg0KSB9IChTSVpFICgyLi4xNikpIAorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQxIGluZGljYXRlcyBMQ1MgUmVsZWFzZTk4IG9yIFJlbGVhc2U5OSB2ZXJzaW9uLgorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQyIGluZGljYXRlcyBMQ1MgUmVsZWFzZTQuCistLSBDb3JlIG5ldHdvcmsgc2lnbmFsbGluZyBjYXBhYmlsaXR5IHNldDMgaW5kaWNhdGVzIExDUyBSZWxlYXNlNS4KKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0NCBpbmRpY2F0ZXMgTENTIFJlbGVhc2U2LgorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQ1IGluZGljYXRlcyBMQ1MgUmVsZWFzZTcgb3IgbGF0ZXIgdmVyc2lvbi4KKy0tIEEgbm9kZSBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBMQ1MgY2FwYWJpbGl0eSBzZXRzIGl0IHN1cHBvcnRzLiAKKy0tIElmIG5vIGJpdCBpcyBzZXQgdGhlbiB0aGUgc2VuZGluZyBub2RlIGRvZXMgbm90IHN1cHBvcnQgTENTLgorLS0gSWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2VudCBieSBhbiBWTFIgdGhlbiB0aGUgVkxSIG1heSBzdXBwb3J0IGF0IG1vc3QgY2FwYWJpbGl0eSBzZXQxLgorLS0gSWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2VudCBieSBhbiBTR1NOIHRoZW4gbm8gc3VwcG9ydCBmb3IgTENTIGlzIGFzc3VtZWQuCistLSBBbiBTR1NOIGlzIG5vdCBhbGxvd2VkIHRvIGluZGljYXRlIHN1cHBvcnQgb2YgY2FwYWJpbGl0eSBzZXQxLgorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1VwZGF0ZUxvY2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJaGxyLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkLUNhcGFiaWxpdHkJTlVMTAkJCU9QVElPTkFMLAorCXBhZ2luZ0FyZWEtQ2FwYWJpbGl0eQlbMF1OVUxMCQkJT1BUSU9OQUwgfQorCitBREQtSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWltZWlzdgkJWzBdIElNRUksCisJc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlCVsxXSBOVUxMCQlPUFRJT05BTCwKKwktLSBUaGUgc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlIHBhcmFtZXRlciBpbiB0aGUgVXBkYXRlTG9jYXRpb25BcmcgYW5kIHRoZSBBREQtSW5mbworCS0tIHN0cnVjdHVyZXMgY2FycnkgdGhlIHNhbWUgc2VtYW50aWMuCisJLi4ufQorCisKK1BhZ2luZ0FyZWEgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUpIE9GIExvY2F0aW9uQXJlYSAKKworCitMb2NhdGlvbkFyZWEgOjo9IENIT0lDRSB7CisJbGFpRml4ZWRMZW5ndGgJWzBdIExBSUZpeGVkTGVuZ3RoLAorCWxhYwkJCVsxXSBMQUN9CisKKworTEFDIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIpKQorCS0tIFJlZmVycyB0byBMb2NhdGlvbiBBcmVhIENvZGUgb2YgdGhlIExvY2F0aW9uIEFyZWEgSWRlbnRpZmljYXRpb24gZGVmaW5lZCBpbiAKKyAgICAgLS0gM0dQUCBUUyAyMy4wMDMgWzE3XS4KKwktLSBMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0KKworQ2FuY2VsTG9jYXRpb25BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJaWRlbnRpdHkJCUlkZW50aXR5LAorCWNhbmNlbGxhdGlvblR5cGUJQ2FuY2VsbGF0aW9uVHlwZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl0eXBlT2ZVcGRhdGUJWzBdIFR5cGVPZlVwZGF0ZQlPUFRJT05BTCB9CisKK1R5cGVPZlVwZGF0ZSA6Oj0gRU5VTUVSQVRFRCB7CisJc2dzbi1jaGFuZ2UgKDApLAorCW1tZS1jaGFuZ2UgKDEpLAorCS4uLn0KKwktLSBUeXBlT2ZVcGRhdGUgc2hhbGwgYmUgYWJzZW50IGlmIENhbmNlbGxhdGlvblR5cGUgaXMgZGlmZmVyZW50IGZyb20gdXBkYXRlUHJvY2VkdXJlCisKK0NhbmNlbGxhdGlvblR5cGUgOjo9IEVOVU1FUkFURUQgeworCXVwZGF0ZVByb2NlZHVyZQkoMCksCisJc3Vic2NyaXB0aW9uV2l0aGRyYXcJKDEpLAorCS4uLn0KKwktLSBUaGUgSExSIHNoYWxsIG5vdCBzZW5kIHZhbHVlcyBvdGhlciB0aGFuIGxpc3RlZCBhYm92ZQorCitDYW5jZWxMb2NhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitQdXJnZU1TLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwl2bHItTnVtYmVyCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJc2dzbi1OdW1iZXIJWzFdCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUHVyZ2VNUy1SZXMgOjo9IFNFUVVFTkNFIHsKKwlmcmVlemVUTVNJCVswXQlOVUxMCQlPUFRJT05BTCwKKwlmcmVlemVQLVRNU0kJWzFdCU5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWZyZWV6ZU0tVE1TSQlbMl0JTlVMTAkJT1BUSU9OQUwgfQorCitTZW5kSWRlbnRpZmljYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwl0bXNpCQkJVE1TSSwKKwludW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMJTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzIAlPUFRJT05BTCwKKwktLSB3aXRoaW4gYSBkaWFsb2d1ZSBudW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMgc2hhbGwgYmUgcHJlc2VudCBpbiAKKwktLSB0aGUgZmlyc3Qgc2VydmljZSByZXF1ZXN0IGFuZCBzaGFsbCBub3QgYmUgcHJlc2VudCBpbiBzdWJzZXF1ZW50IHNlcnZpY2UgcmVxdWVzdHMuIAorCS0tIElmIHJlY2VpdmVkIGluIGEgc3Vic2VxdWVudCBzZXJ2aWNlIHJlcXVlc3QgaXQgc2hhbGwgYmUgZGlzY2FyZGVkLiAKKwlzZWdtZW50YXRpb25Qcm9oaWJpdGVkCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwltc2MtTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZyAJT1BUSU9OQUwsCisJcHJldmlvdXMtTEFJCVswXSBMQUlGaXhlZExlbmd0aAlPUFRJT05BTCwKKwlob3BDb3VudGVyCVsxXSBIb3BDb3VudGVyCU9QVElPTkFMIH0KKworSG9wQ291bnRlciA6Oj0gSU5URUdFUiAoMC4uMykKKworU2VuZElkZW50aWZpY2F0aW9uUmVzIDo6PSBbM10gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJCQkJT1BUSU9OQUwsCisJLS0gSU1TSSBzaGFsbCBiZSBwcmVzZW50IGluIHRoZSBmaXJzdCAob3Igb25seSkgc2VydmljZSByZXNwb25zZSBvZiBhIGRpYWxvZ3VlLgorCS0tIElmIG11bHRpcGxlIHNlcnZpY2UgcmVxdWVzdHMgYXJlIHByZXNlbnQgaW4gYSBkaWFsb2d1ZSB0aGVuIElNU0kKKwktLSBzaGFsbCBub3QgYmUgcHJlc2VudCBpbiBhbnkgc2VydmljZSByZXNwb25zZSBvdGhlciB0aGFuIHRoZSBmaXJzdCBvbmUuCisJYXV0aGVudGljYXRpb25TZXRMaXN0CUF1dGhlbnRpY2F0aW9uU2V0TGlzdAlPUFRJT05BTCwKKwljdXJyZW50U2VjdXJpdHlDb250ZXh0CVsyXUN1cnJlbnRTZWN1cml0eUNvbnRleHQJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50IHR5cGVzCisKK0F1dGhlbnRpY2F0aW9uU2V0TGlzdCA6Oj0gQ0hPSUNFIHsKKwl0cmlwbGV0TGlzdAlbMF0gVHJpcGxldExpc3QsCisJcXVpbnR1cGxldExpc3QJWzFdIFF1aW50dXBsZXRMaXN0IH0KKworVHJpcGxldExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUpIE9GCisJCQkJQXV0aGVudGljYXRpb25UcmlwbGV0CisKK1F1aW50dXBsZXRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi41KSBPRgorCQkJCUF1dGhlbnRpY2F0aW9uUXVpbnR1cGxldAorCitBdXRoZW50aWNhdGlvblRyaXBsZXQgOjo9IFNFUVVFTkNFIHsKKwlyYW5kCQkJUkFORCwKKwlzcmVzCQkJU1JFUywKKwlrYwkJCUtjLAorCS4uLn0KKworQXV0aGVudGljYXRpb25RdWludHVwbGV0IDo6PSBTRVFVRU5DRSB7CisJcmFuZAkJCVJBTkQsCisJeHJlcwkJCVhSRVMsCisJY2sJCQlDSywKKwlpawkJCUlLLAorCWF1dG4JCQlBVVROLAorCS4uLn0KKworQ3VycmVudFNlY3VyaXR5Q29udGV4dCA6Oj0gQ0hPSUNFIHsKKwlnc20tU2VjdXJpdHlDb250ZXh0RGF0YQlbMF0gR1NNLVNlY3VyaXR5Q29udGV4dERhdGEsCisJdW10cy1TZWN1cml0eUNvbnRleHREYXRhCVsxXSBVTVRTLVNlY3VyaXR5Q29udGV4dERhdGEgfQorCitHU00tU2VjdXJpdHlDb250ZXh0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWtjCQkJS2MsCisJY2tzbgkJCUNrc24sCisJLi4uIH0KKworVU1UUy1TZWN1cml0eUNvbnRleHREYXRhIDo6PSBTRVFVRU5DRSB7CisJY2sJCQlDSywKKwlpawkJCUlLLAorCWtzaQkJCUtTSSwKKwkuLi4gfQorCitSQU5EIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE2KSkKKworU1JFUyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKworS2MgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoOCkpCisKK1hSRVMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNC4uMTYpKQorCitDSyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK0lLIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE2KSkKKworQVVUTiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK0FVVFMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTQpKQorCitDa3NuIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI0LjAwOAorCitLU0kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIDNHUFAgVFMgMjQuMDA4CisKK0F1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydEFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCWZhaWx1cmVDYXVzZQlGYWlsdXJlQ2F1c2UsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXJlLWF0dGVtcHQJQk9PTEVBTgkJT1BUSU9OQUwsCisJYWNjZXNzVHlwZQlBY2Nlc3NUeXBlCU9QVElPTkFMLAorCXJhbmQJCQlSQU5ECQkJT1BUSU9OQUwsCisJdmxyLU51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCXNnc24tTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQorCitBY2Nlc3NUeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwljYWxsICgwKSwKKwllbWVyZ2VuY3lDYWxsICgxKSwKKwlsb2NhdGlvblVwZGF0aW5nICgyKSwKKwlzdXBwbGVtZW50YXJ5U2VydmljZSAoMyksCisJc2hvcnRNZXNzYWdlICg0KSwKKwlncHJzQXR0YWNoICg1KSwKKwlyb3V0aW5nQXJlYVVwZGF0aW5nICg2KSwKKwlzZXJ2aWNlUmVxdWVzdCAoNyksCisJcGRwQ29udGV4dEFjdGl2YXRpb24gKDgpLAorCXBkcENvbnRleHREZWFjdGl2YXRpb24gKDkpLAorCS4uLiwKKwlncHJzRGV0YWNoICgxMCl9CisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIHJlY2VpdmVkIHZhbHVlcyBncmVhdGVyIHRoYW4gMTAgc2hhbGwgYmUgaWdub3JlZC4KKworQXV0aGVudGljYXRpb25GYWlsdXJlUmVwb3J0UmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZhaWx1cmVDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJd3JvbmdVc2VyUmVzcG9uc2UgICgwKSwKKwl3cm9uZ05ldHdvcmtTaWduYXR1cmUgICgxKX0KKworLS0gZ3BycyBsb2NhdGlvbiByZWdpc3RyYXRpb24gdHlwZXMKKworVXBkYXRlR3Byc0xvY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJc2dzbi1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAkKKwlzZ3NuLUFkZHJlc3MJR1NOLUFkZHJlc3MsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXNnc24tQ2FwYWJpbGl0eQlbMF0gU0dTTi1DYXBhYmlsaXR5CU9QVElPTkFMLAorCWluZm9ybVByZXZpb3VzTmV0d29ya0VudGl0eQlbMV0JTlVMTAkJT1BUSU9OQUwsCisJcHMtTENTLU5vdFN1cHBvcnRlZEJ5VUUJWzJdCU5VTEwJCU9QVElPTkFMLAorCXYtZ21sYy1BZGRyZXNzCVszXQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlhZGQtaW5mbwkJWzRdICBBREQtSW5mbwlPUFRJT05BTCwKKwllcHMtaW5mbwkJWzVdCUVQUy1JbmZvCU9QVElPTkFMLAorCXNlcnZpbmdOb2RlVHlwZUluZGljYXRvcglbNl0JTlVMTAkJT1BUSU9OQUwsCisJc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlCVs3XSBOVUxMCQlPUFRJT05BTCwKKwl1c2VkUkFULVR5cGUJWzhdIFVzZWQtUkFULVR5cGUJT1BUSU9OQUwgCisJIH0KKworVXNlZC1SQVQtVHlwZTo6PSBFTlVNRVJBVEVEIHsKKwl1dHJhbiAgKDApLAorCWdlcmFuICAoMSksCisJZ2FuICAgICgyKSwKKwlpLWhzcGEtZXZvbHV0aW9uICgzKSwKKwllLXV0cmFuCSg0KSwKKwkuLi59CisKK0VQUy1JbmZvIDo6PSBDSE9JQ0V7CisJcGRuLWd3LXVwZGF0ZQlbMF0gUEROLUdXLVVwZGF0ZSwKKwlpc3ItSW5mb3JtYXRpb24JWzFdIElTUi1JbmZvcm1hdGlvbiB9CisKK1BETi1HVy1VcGRhdGUgOjo9IFNFUVVFTkNFeworCWFwbgkJCVswXSBBUE4JCU9QVElPTkFMLAorCXBkbi1ndy1JZGVudGl0eQlbMV0gUEROLUdXLUlkZW50aXR5CU9QVElPTkFMLAorCWNvbnRleHRJZAkJWzJdIENvbnRleHRJZCAgICAgICAgICAgICAgICAgICAgIE9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0lTUi1JbmZvcm1hdGlvbjo6PSBCSVQgU1RSSU5HIHsKKwl1cGRhdGVNTUUgICgwKSwKKwljYW5jZWxTR1NOICAoMSl9IChTSVpFICgyLi44KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6IHJlY2VwdGlvbiBvZiB1bmtub3duIGJpdCBhc3NpZ25tZW50cyBpbiB0aGUKKwktLSBJU1ItSW5mb3JtYXRpb24gZGF0YSB0eXBlIHNoYWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgcmVjZWl2ZXIgCisKK1NHU04tQ2FwYWJpbGl0eSA6Oj0gU0VRVUVOQ0V7CisJc29sc2FTdXBwb3J0SW5kaWNhdG9yCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXN1cGVyQ2hhcmdlclN1cHBvcnRlZEluU2VydmluZ05ldHdvcmtFbnRpdHkJWzJdIFN1cGVyQ2hhcmdlckluZm8JT1BUSU9OQUwgLAorCWdwcnNFbmhhbmNlbWVudHNTdXBwb3J0SW5kaWNhdG9yIAlbM10gTlVMTAkJT1BUSU9OQUwsCisJc3VwcG9ydGVkQ2FtZWxQaGFzZXMgIAlbNF0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCVs1XSAgU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCU9QVElPTkFMLAorCW9mZmVyZWRDYW1lbDRDU0lzCVs2XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKKwlzbXNDYWxsQmFycmluZ1N1cHBvcnRJbmRpY2F0b3IJWzddCU5VTEwJCU9QVElPTkFMLAlzdXBwb3J0ZWRSQVQtVHlwZXNJbmRpY2F0b3IJWzhdCVN1cHBvcnRlZFJBVC1UeXBlcwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRGZWF0dXJlcwlbOV0gU3VwcG9ydGVkRmVhdHVyZXMJT1BUSU9OQUwgfQorCitTdXBwb3J0ZWRGZWF0dXJlczo6PSBCSVQgU1RSSU5HIHsKKwlvZGItYWxsICgwKSwKKwlvZGItSFBMTU4tQVBOICgxKSwKKwlvZGItVlBMTU4tQVBOICgyKSwKKwlyZWdTdWIgKDMpfSAoU0laRSAoNC4uOCkpCisKK0dTTi1BZGRyZXNzIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDUuLjE3KSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddCisKK1VwZGF0ZUdwcnNMb2NhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZC1DYXBhYmlsaXR5CU5VTEwJCQlPUFRJT05BTCwKKwlzZ3NuLW1tZVNlcGFyYXRpb25TdXBwb3J0ZWQJWzBdIE5VTEwJCU9QVElPTkFMIH0KKworLS0gaGFuZG92ZXIgdHlwZXMKKworRm9yd2FyZEFjY2Vzc1NpZ25hbGxpbmctQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCWFuLUFQRFUJCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAorCWludGVncml0eVByb3RlY3Rpb25JbmZvCVswXSBJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAorCWVuY3J5cHRpb25JbmZvCVsxXSBFbmNyeXB0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAorCWtleVN0YXR1cwkJWzJdCUtleVN0YXR1cwlPUFRJT05BTCwKKwlhbGxvd2VkR1NNLUFsZ29yaXRobXMJWzRdCUFsbG93ZWRHU00tQWxnb3JpdGhtcwlPUFRJT05BTCwKKwlhbGxvd2VkVU1UUy1BbGdvcml0aG1zCVs1XQlBbGxvd2VkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAorCXJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbNl0gUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi4sCisJcmFkaW9SZXNvdXJjZUxpc3QJWzddCVJhZGlvUmVzb3VyY2VMaXN0CU9QVElPTkFMLAorCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXIJWzldCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsCisJcmFuYXAtU2VydmljZUhhbmRvdmVyCVs4XQlSQU5BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsCisJYnNzbWFwLVNlcnZpY2VIYW5kb3Zlckxpc3QJWzEwXQlCU1NNQVAtU2VydmljZUhhbmRvdmVyTGlzdAlPUFRJT05BTCwKKwljdXJyZW50bHlVc2VkQ29kZWMJWzExXSBDb2RlYwlPUFRJT05BTCwKKwlpdVN1cHBvcnRlZENvZGVjc0xpc3QJWzEyXSBTdXBwb3J0ZWRDb2RlY3NMaXN0CU9QVElPTkFMLAorCXJhYi1Db25maWd1cmF0aW9uSW5kaWNhdG9yCVsxM10gTlVMTAkJT1BUSU9OQUwsCisJaXVTZWxlY3RlZENvZGVjCVsxNF0JQ29kZWMJT1BUSU9OQUwsCisJYWx0ZXJuYXRpdmVDaGFubmVsVHlwZQlbMTVdCVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglPUFRJT05BTCwKKwl0cmFjZVByb3BhZ2F0aW9uTGlzdAlbMTddCVRyYWNlUHJvcGFnYXRpb25MaXN0CU9QVElPTkFMIH0KKworQWxsb3dlZEdTTS1BbGdvcml0aG1zIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIGludGVybmFsIHN0cnVjdHVyZSBpcyBjb2RlZCBhcyBBbGdvcml0aG0gaWRlbnRpZmllciBvY3RldCBmcm9tCisJLS0gUGVybWl0dGVkIEFsZ29yaXRobXMgZGVmaW5lZCBpbiAzR1BQIFRTIDQ4LjAwOAorCS0tIEEgbm9kZSBzaGFsbCBtYXJrIGFsbCBHU00gYWxnb3JpdGhtcyB0aGF0IGFyZSBhbGxvd2VkIGluIE1TQy1CCisKK0FsbG93ZWRVTVRTLUFsZ29yaXRobXMgOjo9IFNFUVVFTkNFIHsKKwlpbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtcwlbMF0gCVBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zCU9QVElPTkFMLAorCWVuY3J5cHRpb25BbGdvcml0aG1zCVsxXSAJUGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXMJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXMgOjo9CisJCU9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4UGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXNMZW5ndGgpKQorCS0tIE9jdGV0cyBjb250YWluIGEgY29tcGxldGUgUGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXMgZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMuIAorCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAorCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCisKKworbWF4UGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXNMZW5ndGggSU5URUdFUiA6Oj0gOQorCitQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtcyA6Oj0KKwkJT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtc0xlbmd0aCkpCisJLS0gT2N0ZXRzIGNvbnRhaW4gYSBjb21wbGV0ZSBQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtcyBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMworCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAorCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCisKKworbWF4UGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXNMZW5ndGggSU5URUdFUiA6Oj0gOQorCitLZXlTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworCW9sZCAgKDApLAorCW5ldyAgKDEpLAorCS4uLn0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gcmVjZWl2ZWQgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAib2xkIgorCS0tIHJlY2VpdmVkIHZhbHVlcyBncmVhdGVyIHRoYW4gMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAibmV3IgorCitQcmVwYXJlSE8tQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCXRhcmdldENlbGxJZAlbMF0gR2xvYmFsQ2VsbElkCU9QVElPTkFMLAorCWhvLU51bWJlck5vdFJlcXVpcmVkCU5VTEwJCQlPUFRJT05BTCwgCisJdGFyZ2V0Uk5DSWQJWzFdIFJOQ0lkCQlPUFRJT05BTCwKKwlhbi1BUERVCQlbMl0gQWNjZXNzTmV0d29ya1NpZ25hbEluZm8JT1BUSU9OQUwsCisJbXVsdGlwbGVCZWFyZXJSZXF1ZXN0ZWQJWzNdIE5VTEwJCU9QVElPTkFMLAorCWltc2kJCQlbNF0gSU1TSQkJT1BUSU9OQUwsCisJaW50ZWdyaXR5UHJvdGVjdGlvbkluZm8JWzVdIEludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbgkJT1BUSU9OQUwsCisJZW5jcnlwdGlvbkluZm8JWzZdIEVuY3J5cHRpb25JbmZvcm1hdGlvbgkJT1BUSU9OQUwsCisJcmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVs3XSBSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJYWxsb3dlZEdTTS1BbGdvcml0aG1zCVs5XQlBbGxvd2VkR1NNLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJYWxsb3dlZFVNVFMtQWxnb3JpdGhtcwlbMTBdCUFsbG93ZWRVTVRTLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJcmFkaW9SZXNvdXJjZUxpc3QJWzExXSBSYWRpb1Jlc291cmNlTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzhdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXJhYi1JZAkJWzEyXSBSQUItSWQJT1BUSU9OQUwsCisJYnNzbWFwLVNlcnZpY2VIYW5kb3ZlcglbMTNdCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsCisJcmFuYXAtU2VydmljZUhhbmRvdmVyCVsxNF0JUkFOQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLCAKKwlic3NtYXAtU2VydmljZUhhbmRvdmVyTGlzdAlbMTVdCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXJMaXN0CU9QVElPTkFMLAorCWFzY2lDYWxsUmVmZXJlbmNlCVsyMF0JQVNDSS1DYWxsUmVmZXJlbmNlCU9QVElPTkFMLAorCWdlcmFuLWNsYXNzbWFyawlbMTZdIEdFUkFOLUNsYXNzbWFyawlPUFRJT05BTCwKKwlpdUN1cnJlbnRseVVzZWRDb2RlYwlbMTddIENvZGVjCU9QVElPTkFMLAorCWl1U3VwcG9ydGVkQ29kZWNzTGlzdAlbMThdIFN1cHBvcnRlZENvZGVjc0xpc3QJT1BUSU9OQUwsCisJcmFiLUNvbmZpZ3VyYXRpb25JbmRpY2F0b3IJWzE5XSBOVUxMCQlPUFRJT05BTCwKKwl1ZXNiaS1JdQkJWzIxXQlVRVNCSS1JdQlPUFRJT05BTCwKKwlpbWVpc3YJCVsyMl0JSU1FSQkJT1BUSU9OQUwsCisJYWx0ZXJuYXRpdmVDaGFubmVsVHlwZQlbMjNdCVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglPUFRJT05BTCwKKwl0cmFjZVByb3BhZ2F0aW9uTGlzdAlbMjVdCVRyYWNlUHJvcGFnYXRpb25MaXN0CU9QVElPTkFMCSB9CisKK0JTU01BUC1TZXJ2aWNlSGFuZG92ZXJMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi4gbWF4TnVtT2ZTZXJ2aWNlSGFuZG92ZXJzKSBPRgorCQkJCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXJJbmZvCisKK0JTU01BUC1TZXJ2aWNlSGFuZG92ZXJJbmZvIDo6PSBTRVFVRU5DRSB7CisJYnNzbWFwLVNlcnZpY2VIYW5kb3ZlcglCU1NNQVAtU2VydmljZUhhbmRvdmVyLAorCXJhYi1JZAkJUkFCLUlkLAorCS0tIFJBQiBJZGVudGl0eSBpcyBuZWVkZWQgdG8gcmVsYXRlIHRoZSBzZXJ2aWNlIGhhbmRvdmVycyB3aXRoIHRoZSByYWRpbyBhY2Nlc3MgYmVhcmVycy4gCisJLi4ufQorCittYXhOdW1PZlNlcnZpY2VIYW5kb3ZlcnMgIElOVEVHRVIgOjo9IDcKKworQlNTTUFQLVNlcnZpY2VIYW5kb3ZlciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgU2VydmljZSBIYW5kb3ZlciBpbmZvcm1hdGlvbiBlbGVtZW50IGluCisJLS0gM0dQUCBUUyA0OC4wMDguCisKK1JBTkFQLVNlcnZpY2VIYW5kb3ZlciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldCBjb250YWlucyBhIGNvbXBsZXRlIFNlcnZpY2UtSGFuZG92ZXIgZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAKKworCitSYWRpb1Jlc291cmNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uIG1heE51bU9mUmFkaW9SZXNvdXJjZXMpIE9GCisJCQkJUmFkaW9SZXNvdXJjZQorCitSYWRpb1Jlc291cmNlIDo6PSBTRVFVRU5DRSB7CisJcmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbiwKKwlyYWItSWQJCVJBQi1JZCwKKwktLSBSQUIgSWRlbnRpdHkgaXMgbmVlZGVkIHRvIHJlbGF0ZSB0aGUgcmFkaW8gcmVzb3VyY2VzIHdpdGggdGhlIHJhZGlvIGFjY2VzcyBiZWFyZXJzLiAKKwkuLi59CisKK21heE51bU9mUmFkaW9SZXNvdXJjZXMgIElOVEVHRVIgOjo9IDcKKworUHJlcGFyZUhPLVJlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwloYW5kb3Zlck51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCXJlbG9jYXRpb25OdW1iZXJMaXN0CVsxXQlSZWxvY2F0aW9uTnVtYmVyTGlzdAlPUFRJT05BTCwKKwlhbi1BUERVCQlbMl0JQWNjZXNzTmV0d29ya1NpZ25hbEluZm8JT1BUSU9OQUwsCisJbXVsdGljYWxsQmVhcmVySW5mbwlbM10JTXVsdGljYWxsQmVhcmVySW5mbwlPUFRJT05BTCwKKwltdWx0aXBsZUJlYXJlck5vdFN1cHBvcnRlZAlOVUxMCQkJT1BUSU9OQUwsCisJc2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMJWzVdCVNlbGVjdGVkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAorCWNob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbNl0gQ2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCSBPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJaXVTZWxlY3RlZENvZGVjCVs3XSBDb2RlYwkJT1BUSU9OQUwsCisJaXVBdmFpbGFibGVDb2RlY3NMaXN0CVs4XSBDb2RlY0xpc3QJT1BUSU9OQUwgfQorCitTZWxlY3RlZFVNVFMtQWxnb3JpdGhtcyA6Oj0gU0VRVUVOQ0UgeworCWludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG0JWzBdIAlDaG9zZW5JbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtCU9QVElPTkFMLAorCWVuY3J5cHRpb25BbGdvcml0aG0JWzFdIAlDaG9zZW5FbmNyeXB0aW9uQWxnb3JpdGhtCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ2hvc2VuSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldCBjb250YWlucyBhIGNvbXBsZXRlIEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG0gZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAKKworQ2hvc2VuRW5jcnlwdGlvbkFsZ29yaXRobSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldCBjb250YWlucyBhIGNvbXBsZXRlIEVuY3J5cHRpb25BbGdvcml0aG0gZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAKKworQ2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJY2hvc2VuQ2hhbm5lbEluZm8JWzBdIENob3NlbkNoYW5uZWxJbmZvCU9QVElPTkFMLAorCWNob3NlblNwZWVjaFZlcnNpb24JWzFdIENob3NlblNwZWVjaFZlcnNpb24JT1BUSU9OQUwsCisJLi4ufQorCitDaG9zZW5DaGFubmVsSW5mbyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgQ2hvc2VuIENoYW5uZWwgaW5mb3JtYXRpb24gZWxlbWVudCBpbiAzR1BQIFRTIDQ4LjAwOAorCitDaG9zZW5TcGVlY2hWZXJzaW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRoZSBTcGVlY2ggVmVyc2lvbiAoY2hvc2VuKSBpbmZvcm1hdGlvbiBlbGVtZW50IGluIDNHUFAgVFMKKwktLSA0OC4wMDggCisKK1ByZXBhcmVTdWJzZXF1ZW50SE8tQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCXRhcmdldENlbGxJZAlbMF0gR2xvYmFsQ2VsbElkCU9QVElPTkFMLAorCXRhcmdldE1TQy1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKKwl0YXJnZXRSTkNJZAlbMl0gUk5DSWQJCU9QVElPTkFMLAorCWFuLUFQRFUJCVszXQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbwlPUFRJT05BTCwKKwlzZWxlY3RlZFJhYi1JZAlbNF0JUkFCLUlkCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlnZXJhbi1jbGFzc21hcmsJWzZdIEdFUkFOLUNsYXNzbWFyawlPUFRJT05BTCwKKwlyYWItQ29uZmlndXJhdGlvbkluZGljYXRvcglbN10gTlVMTAkJT1BUSU9OQUwgfQorCitQcmVwYXJlU3Vic2VxdWVudEhPLVJlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlleHRlbnNpb25Db250YWluZXIJWzBdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Byb2Nlc3NBY2Nlc3NTaWduYWxsaW5nLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlzZWxlY3RlZFVNVFMtQWxnb3JpdGhtcwlbMV0JU2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJc2VsZWN0ZWRHU00tQWxnb3JpdGhtCVsyXQlTZWxlY3RlZEdTTS1BbGdvcml0aG0JT1BUSU9OQUwsCisJY2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVszXSBDaG9zZW5SYWRpb1Jlc291cmNlSW5mb3JtYXRpb24gT1BUSU9OQUwsCisJc2VsZWN0ZWRSYWItSWQJWzRdIFJBQi1JZAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzBdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4uLAorCWlVU2VsZWN0ZWRDb2RlYwlbNV0gQ29kZWMJCU9QVElPTkFMLAorCWl1QXZhaWxhYmxlQ29kZWNzTGlzdAlbNl0gQ29kZWNMaXN0CU9QVElPTkFMIH0KKworU3VwcG9ydGVkQ29kZWNzTGlzdCA6Oj0gU0VRVUVOQ0UgeworCXV0cmFuQ29kZWNMaXN0CVswXSBDb2RlY0xpc3QJT1BUSU9OQUwsCisJZ2VyYW5Db2RlY0xpc3QJWzFdIENvZGVjTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NvZGVjTGlzdCA6Oj0gU0VRVUVOQ0UgeworCWNvZGVjMQkJWzFdIENvZGVjLAorCWNvZGVjMgkJWzJdIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzMJCVszXSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWM0CQlbNF0gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjNQkJWzVdIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzYJCVs2XSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWM3CQlbN10gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjOAkJWzhdIENvZGVjCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzldIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisJLS0gQ29kZWNzIGFyZSBzZW50IGluIHByaW9yaXR5IG9yZGVyIHdoZXJlIGNvZGVjMSBoYXMgaGlnaGVzdCBwcmlvcml0eQorCitDb2RlYyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi40KSkKKworCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEJQ29kZWQgYXMgQ29kZWMgSWRlbnRpZmljYXRpb24gY29kZSBpbiAzR1BQIFRTIDI2LjEwMworCS0tIG9jdGV0cyAyLDMsNAlQYXJhbWV0ZXJzIGZvciB0aGUgQ29kZWMgYXMgZGVmaW5lZCBpbiAzR1BQIFRTCisJLS0JCQkyNi4xMDMsIGlmIGF2YWlsYWJsZSwgbGVuZ3RoIGRlcGVuZGluZyBvbiB0aGUgY29kZWMKKworR0VSQU4tQ2xhc3NtYXJrIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjg3KSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgR0VSQU4gQ2xhc3NtYXJrIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4gM0dQUCBUUyA0OC4wMDgKKworU2VsZWN0ZWRHU00tQWxnb3JpdGhtIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIGludGVybmFsIHN0cnVjdHVyZSBpcyBjb2RlZCBhcyBBbGdvcml0aG0gaWRlbnRpZmllciBvY3RldCBmcm9tIENob3NlbiBFbmNyeXB0aW9uCisJLS0gQWxnb3JpdGhtIGRlZmluZWQgaW4gM0dQUCBUUyA0OC4wMDgKKwktLSBBIG5vZGUgc2hhbGwgbWFyayBvbmx5IHRoZSBzZWxlY3RlZCBHU00gYWxnb3JpdGhtCisKK1NlbmRFbmRTaWduYWwtQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCWFuLUFQRFUJCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK1NlbmRFbmRTaWduYWwtUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLn0KKworUk5DSWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNykpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcworCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4CisJLS0gb2N0ZXRzIDYgYW5kIDcJUk5DIElkIHZhbHVlIGFjY29yZGluZyB0byAzR1BQIFRTIDI1LjQxMworCitSZWxvY2F0aW9uTnVtYmVyTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZSZWxvY2F0aW9uTnVtYmVyKSBPRgorCQkJCVJlbG9jYXRpb25OdW1iZXIKKworTXVsdGljYWxsQmVhcmVySW5mbyA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZSZWxvY2F0aW9uTnVtYmVyKQorCitSZWxvY2F0aW9uTnVtYmVyIDo6PSBTRVFVRU5DRSB7CisJaGFuZG92ZXJOdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCXJhYi1JZAkJUkFCLUlkLAorCS0tIFJBQiBJZGVudGl0eSBpcyBuZWVkZWQgdG8gcmVsYXRlIHRoZSBjYWxscyB3aXRoIHRoZSByYWRpbyBhY2Nlc3MgYmVhcmVycy4gCisJLi4ufQorCitSQUItSWQgOjo9IElOVEVHRVIgKDEuLm1heE5yT2ZSQUJzKQorCittYXhOck9mUkFCcyBJTlRFR0VSIDo6PSAyNTUKKworbWF4TnVtT2ZSZWxvY2F0aW9uTnVtYmVyICBJTlRFR0VSIDo6PSA3CisKK1JhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzLi4xMykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIENoYW5uZWwgVHlwZSBpbmZvcm1hdGlvbiBlbGVtZW50IGluIDNHUFAgVFMgNDguMDA4CisKK0ludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxOC4ubWF4TnVtT2ZJbnRlZ3JpdHlJbmZvKSkKKwktLSBPY3RldHMgY29udGFpbiBhIGNvbXBsZXRlIEludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbiBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMworCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAorCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCisKK21heE51bU9mSW50ZWdyaXR5SW5mbyBJTlRFR0VSIDo6PSAxMDAKKworRW5jcnlwdGlvbkluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE4Li5tYXhOdW1PZkVuY3J5cHRpb25JbmZvKSkKKwktLSBPY3RldHMgY29udGFpbiBhIGNvbXBsZXRlIEVuY3J5cHRpb25JbmZvcm1hdGlvbiBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMworCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAorCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCisKK21heE51bU9mRW5jcnlwdGlvbkluZm8gSU5URUdFUiA6Oj0gMTAwCisKKy0tIGF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgdHlwZXMKKworU2VuZEF1dGhlbnRpY2F0aW9uSW5mb0FyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwludW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMJTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzLAorCXNlZ21lbnRhdGlvblByb2hpYml0ZWQJTlVMTAkJCU9QVElPTkFMLAorCWltbWVkaWF0ZVJlc3BvbnNlUHJlZmVycmVkCVsxXSBOVUxMCQkJT1BUSU9OQUwsCisJcmUtc3luY2hyb25pc2F0aW9uSW5mbwlSZS1zeW5jaHJvbmlzYXRpb25JbmZvCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlyZXF1ZXN0aW5nTm9kZVR5cGUJWzNdIFJlcXVlc3RpbmdOb2RlVHlwZQlPUFRJT05BTCwKKwlyZXF1ZXN0aW5nUExNTi1JZAlbNF0gUExNTi1JZAlPUFRJT05BTCwKKwludW1iZXJPZlJlcXVlc3RlZEFkZGl0aW9uYWwtVmVjdG9ycwlbNV0gTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzCU9QVElPTkFMLAorCWFkZGl0aW9uYWxWZWN0b3JzQXJlRm9yRVBTCVs2XSBOVUxMCQlPUFRJT05BTCB9CQorCisKK051bWJlck9mUmVxdWVzdGVkVmVjdG9ycyA6Oj0gSU5URUdFUiAoMS4uNSkKKworUmUtc3luY2hyb25pc2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXJhbmQJCQlSQU5ELAorCWF1dHMJCQlBVVRTLAorCS4uLn0KKworU2VuZEF1dGhlbnRpY2F0aW9uSW5mb1JlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhdXRoZW50aWNhdGlvblNldExpc3QJQXV0aGVudGljYXRpb25TZXRMaXN0IAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwllcHMtQXV0aGVudGljYXRpb25TZXRMaXN0CVsyXSBFUFMtQXV0aGVudGljYXRpb25TZXRMaXN0CU9QVElPTkFMIH0KKworRVBTLUF1dGhlbnRpY2F0aW9uU2V0TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uNSkgT0YKKwkJCQlFUEMtQVYKKworRVBDLUFWIDo6PSBTRVFVRU5DRSB7CisJcmFuZAkJCVJBTkQsCisJeHJlcwkJCVhSRVMsCisJYXV0bgkJCUFVVE4sCisJa2FzbWUJCUtBU01FLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitLQVNNRSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK1JlcXVlc3RpbmdOb2RlVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJdmxyICAoMCksCisJc2dzbiAgKDEpLAorCS4uLiwKKwlzLWNzY2YgICgyKSwKKwlic2YgICgzKSwKKwlnYW4tYWFhLXNlcnZlciAgKDQpLAorCXdsYW4tYWFhLXNlcnZlciAgKDUpLAorCW1tZQkJKDE2KSwKKwltbWUtc2dzbgkoMTcpCisJfQorCS0tIHRoZSB2YWx1ZXMgMiwgMywgNCBhbmQgNSBzaGFsbCBub3QgYmUgdXNlZCBvbiB0aGUgTUFQLUQgb3IgR3IgaW50ZXJmYWNlcworCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSByZWNlaXZlZCB2YWx1ZXMgaW4gdGhlIHJhbmdlICg2LTE1KSBzaGFsbCBiZSB0cmVhdGVkIGFzICJ2bHIiCisJLS0gcmVjZWl2ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiAxNyBzaGFsbCBiZSB0cmVhdGVkIGFzICJzZ3NuIgorCistLSBlcXVpcG1lbnQgbWFuYWdlbWVudCB0eXBlcworCitDaGVja0lNRUktQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1laQkJCUlNRUksCisJcmVxdWVzdGVkRXF1aXBtZW50SW5mbwlSZXF1ZXN0ZWRFcXVpcG1lbnRJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDaGVja0lNRUktUmVzIDo6PSBTRVFVRU5DRSB7CisJZXF1aXBtZW50U3RhdHVzCUVxdWlwbWVudFN0YXR1cwlPUFRJT05BTCwKKwlibXVlZgkJVUVTQkktSXUJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUmVxdWVzdGVkRXF1aXBtZW50SW5mbzo6PSBCSVQgU1RSSU5HIHsKKwllcXVpcG1lbnRTdGF0dXMgICgwKSwKKwlibXVlZiAgKDEpfSAoU0laRSAoMi4uOCkpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCisJLS0gUmVxdWVzdGVkRXF1aXBtZW50SW5mbyBkYXRhIHR5cGUgc2hhbGwgYmUgZGlzY2FyZGVkIGJ5IHRoZSByZWNlaXZlciAKKworVUVTQkktSXUgOjo9IFNFUVVFTkNFIHsKKwl1ZXNiaS1JdUEJWzBdIFVFU0JJLUl1QQkJCQlPUFRJT05BTCwKKwl1ZXNiaS1JdUIJWzFdIFVFU0JJLUl1QgkJCQlPUFRJT05BTCwKKwkuLi59CisKK1VFU0JJLUl1QQkJCQk6Oj0gQklUIFNUUklORyAoU0laRSgxLi4xMjgpKQorLS0gU2VlIDNHUFAgVFMgMjUuNDEzCisKK1VFU0JJLUl1QgkJCQk6Oj0gQklUIFNUUklORyAoU0laRSgxLi4xMjgpKQorLS0gU2VlIDNHUFAgVFMgMjUuNDEzCisKK0VxdWlwbWVudFN0YXR1cyA6Oj0gRU5VTUVSQVRFRCB7CisJd2hpdGVMaXN0ZWQgICgwKSwKKwlibGFja0xpc3RlZCAgKDEpLAorCWdyZXlMaXN0ZWQgICgyKX0KKworLS0gc3Vic2NyaWJlciBtYW5hZ2VtZW50IHR5cGVzCisKK0luc2VydFN1YnNjcmliZXJEYXRhQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJCQlPUFRJT05BTCwKKwlDT01QT05FTlRTIE9GCVN1YnNjcmliZXJEYXRhLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMTRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAkKKwluYWVhLVByZWZlcnJlZENJCVsxNV0gTkFFQS1QcmVmZXJyZWRDSQlPUFRJT05BTCwKKwktLSBuYWVhLVByZWZlcnJlZENJIGlzIGluY2x1ZGVkIGF0IHRoZSBkaXNjcmV0aW9uIG9mIHRoZSBITFIgb3BlcmF0b3IuCisJZ3Byc1N1YnNjcmlwdGlvbkRhdGEJWzE2XSBHUFJTU3Vic2NyaXB0aW9uRGF0YQlPUFRJT05BTCwKKwlyb2FtaW5nUmVzdHJpY3RlZEluU2dzbkR1ZVRvVW5zdXBwb3J0ZWRGZWF0dXJlIFsyM10gCU5VTEwJCisJCQkJCQkJT1BUSU9OQUwsIAorCW5ldHdvcmtBY2Nlc3NNb2RlCVsyNF0gTmV0d29ya0FjY2Vzc01vZGUJT1BUSU9OQUwsCisJbHNhSW5mb3JtYXRpb24JWzI1XSBMU0FJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlsbXUtSW5kaWNhdG9yCVsyMV0JTlVMTAkJT1BUSU9OQUwsCisJbGNzSW5mb3JtYXRpb24JWzIyXQlMQ1NJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlpc3RBbGVydFRpbWVyCVsyNl0gSVNULUFsZXJ0VGltZXJWYWx1ZQlPUFRJT05BTCwKKwlzdXBlckNoYXJnZXJTdXBwb3J0ZWRJbkhMUglbMjddIEFnZUluZGljYXRvcglPUFRJT05BTCwKKwltYy1TUy1JbmZvCVsyOF0gTUMtU1MtSW5mbwlPUFRJT05BTCwKKwljcy1BbGxvY2F0aW9uUmV0ZW50aW9uUHJpb3JpdHkJWzI5XSBDUy1BbGxvY2F0aW9uUmV0ZW50aW9uUHJpb3JpdHkJCU9QVElPTkFMLAorCXNnc24tQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlbMTddIFNHU04tQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKKwljaGFyZ2luZ0NoYXJhY3RlcmlzdGljcyAJWzE4XQlDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcyAJT1BUSU9OQUwsCisJYWNjZXNzUmVzdHJpY3Rpb25EYXRhCVsxOV0gQWNjZXNzUmVzdHJpY3Rpb25EYXRhCU9QVElPTkFMLAorCWljcy1JbmRpY2F0b3IJWzIwXQlCT09MRUFOCU9QVElPTkFMLAorCWVwcy1TdWJzY3JpcHRpb25EYXRhCVszMV0JRVBTLVN1YnNjcmlwdGlvbkRhdGEJT1BUSU9OQUwsCisJY3NnLVN1YnNjcmlwdGlvbkRhdGFMaXN0CVszMl0gQ1NHLVN1YnNjcmlwdGlvbkRhdGFMaXN0CU9QVElPTkFMIH0KKwktLSBJZiB0aGUgTmV0d29yayBBY2Nlc3MgTW9kZSBwYXJhbWV0ZXIgaXMgc2VudCwgaXQgc2hhbGwgYmUgcHJlc2VudCBvbmx5IGluIAorCS0tIHRoZSBmaXJzdCBzZXF1ZW5jZSBpZiBzZXFtZW50YXRpb24gaXMgdXNlZAorCitDU0ctU3Vic2NyaXB0aW9uRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUwKSBPRgorCQkJCUNTRy1TdWJzY3JpcHRpb25EYXRhCisKK0NTRy1TdWJzY3JpcHRpb25EYXRhIDo6PSBTRVFVRU5DRSB7CisJY3NnLUlkCSAJCUNTRy1JZCwKKwlleHBpcmF0aW9uRGF0ZQkJVGltZQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLn0KKworQ1NHLUlkIDo6PSBCSVQgU1RSSU5HIChTSVpFICgyNykpCisJLS0gY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDAzIFsxN10uCisKK1RpbWUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gSUVURiBSRkMgMzU4OCBbMTM5XQorCisKK0VQUy1TdWJzY3JpcHRpb25EYXRhIDo6PSBTRVFVRU5DRSB7CisJYXBuLW9pLVJlcGxhY2VtZW50CVswXQlBUE4tT0ktUmVwbGFjZW1lbnQJT1BUSU9OQUwsCisJcmZzcC1pZAkJWzJdCVJGU1AtSUQJCU9QVElPTkFMLAorCWFtYnIJCQlbM10JQU1CUgkJT1BUSU9OQUwsCisJYXBuLUNvbmZpZ3VyYXRpb25Qcm9maWxlCVs0XQlBUE4tQ29uZmlndXJhdGlvblByb2ZpbGUJT1BUSU9OQUwsCisJc3RuLXNyCQlbNl0JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0FQTi1PSS1SZXBsYWNlbWVudCA6Oj0gIE9DVEVUIFNUUklORyAoU0laRSAoOS4uMTAwKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFzIEFQTiBPcGVyYXRvciBJZGVudGlmaWVyIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddIAorCitSRlNQLUlEIDo6PSAgSU5URUdFUiAoMS4uMjU2KQorCitBUE4tQ29uZmlndXJhdGlvblByb2ZpbGUgOjo9IFNFUVVFTkNFIHsKKwlkZWZhdWx0Q29udGV4dAlDb250ZXh0SWQsCisJY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkCU5VTEwJCQlPUFRJT05BTCwKKwkJLS0gSWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIGNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZCBtYXkgb25seSBiZSBwcmVzZW50IGluIHRoZQorCQktLSBmaXJzdCBzZWdtZW50IG9mIEFQTi1Db25maWd1cmF0aW9uUHJvZmlsZS4KKwllcHNEYXRhTGlzdAlbMV0JRVBTLURhdGFMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0VQUy1EYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZBUE4tQ29uZmlndXJhdGlvbnMpIE9GCisJCQkJQVBOLUNvbmZpZ3VyYXRpb24KKworCittYXhOdW1PZkFQTi1Db25maWd1cmF0aW9ucyAgSU5URUdFUiA6Oj0gNTAKKworCitBUE4tQ29uZmlndXJhdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWNvbnRleHRJZAkJWzBdIENvbnRleHRJZCwKKwlzZXJ2ZWRQYXJ0eUlQLUFkZHJlc3MJWzFdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCWFwbgkJCVsyXSBBUE4sCisJZXBzLXFvcy1TdWJzY3JpYmVkCVszXSBFUFMtUW9TLVN1YnNjcmliZWQsCisJcGRuLWd3LUlkZW50aXR5CVs0XSBQRE4tR1ctSWRlbnRpdHkJT1BUSU9OQUwsCisJcGRuLWd3LUFsbG9jYXRpb25UeXBlCVs1XSBQRE4tR1ctQWxsb2NhdGlvblR5cGUJT1BUSU9OQUwsCisJdnBsbW5BZGRyZXNzQWxsb3dlZAlbNl0gTlVMTAkJT1BUSU9OQUwsCisJY2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJWzddIENoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCU9QVElPTkFMLAorCWFtYnIJCQlbOF0gQU1CUgkJT1BUSU9OQUwsCisJc3BlY2lmaWNBUE5JbmZvTGlzdAlbOV0gU3BlY2lmaWNBUE5JbmZvTGlzdAlPUFRJT05BTCwJZXh0ZW5zaW9uQ29udGFpbmVyCVsxMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0VQUy1Rb1MtU3Vic2NyaWJlZCA6Oj0gU0VRVUVOQ0UgeworCXFvcy1DbGFzcy1JZGVudGlmaWVyCVswXSBRb1MtQ2xhc3MtSWRlbnRpZmllciwKKwlhbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eQlbMV0gQWxsb2NhdGlvbi1SZXRlbnRpb24tUHJpb3JpdHksCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworQU1CUiA6Oj0gU0VRVUVOQ0UgeworCW1heC1SZXF1ZXN0ZWRCYW5kd2lkdGgtVUwJWzBdIEJhbmR3aWR0aCwKKwltYXgtUmVxdWVzdGVkQmFuZHdpZHRoLURMCVsxXSBCYW5kd2lkdGgsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworCitTcGVjaWZpY0FQTkluZm9MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlNwZWNpZmljQVBOSW5mb3MpIE9GCisJCQkJU3BlY2lmaWNBUE5JbmZvCisKK21heE51bU9mU3BlY2lmaWNBUE5JbmZvcyAgSU5URUdFUiA6Oj0gNTAKKworU3BlY2lmaWNBUE5JbmZvIDo6PSBTRVFVRU5DRSB7CisJYXBuCQkJWzBdIEFQTiwKKwlwZG4tZ3ctSWRlbnRpdHkJWzFdIFBETi1HVy1JZGVudGl0eSwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitCYW5kd2lkdGggOjo9IElOVEVHRVIgCisJLS0gYml0cyBwZXIgc2Vjb25kCisKK1FvUy1DbGFzcy1JZGVudGlmaWVyIDo6PSBJTlRFR0VSICgxLi45KQorCS0tIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiAgM0dQUCBUUyAyOS4yMTIKKworCisKK0FsbG9jYXRpb24tUmV0ZW50aW9uLVByaW9yaXR5IDo6PSBTRVFVRU5DRSB7CisJcHJpb3JpdHktbGV2ZWwJWzBdIElOVEVHRVIsCisJcHJlLWVtcHRpb24tY2FwYWJpbGl0eQlbMV0gQk9PTEVBTglPUFRJT05BTCwKKwlwcmUtZW1wdGlvbi12dWxuZXJhYmlsaXR5CVsyXSBCT09MRUFOCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK1BETi1HVy1JZGVudGl0eSA6Oj0gU0VRVUVOQ0UgeworCXBkbi1ndy1pcHY0LUFkZHJlc3MJWzBdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCXBkbi1ndy1pcHY2LUFkZHJlc3MJWzFdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCXBkbi1ndy1uYW1lCVsyXSBGUUROCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitGUUROIDo6PSAgT0NURVQgU1RSSU5HIChTSVpFICg5Li4xMDApKQorCisKK1BETi1HVy1BbGxvY2F0aW9uVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJc3RhdGljCSgwKSwKKwlkeW5hbWljCSgxKX0KKworCitBY2Nlc3NSZXN0cmljdGlvbkRhdGEgOjo9IEJJVCBTVFJJTkcgeworCXV0cmFuTm90QWxsb3dlZCAoMCksCisJZ2VyYW5Ob3RBbGxvd2VkICgxKSwKKwlnYW5Ob3RBbGxvd2VkICAgKDIpLAorCWktaHNwYS1ldm9sdXRpb25Ob3RBbGxvd2VkICgzKSwKKwllLXV0cmFuTm90QWxsb3dlZCAoNCksCisJaG8tdG9Ob24zR1BQLUFjY2Vzc05vdEFsbG93ZWQgKDUpIH0gKFNJWkUgKDIuLjgpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogCisJLS0gYWNjZXNzIHJlc3RyaWN0aW9uIGRhdGEgcmVsYXRlZCB0byBhbiBhY2Nlc3MgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IGEgbm9kZQorCS0tIHNoYWxsIGJlIGlnbm9yZWQKKwktLSBiaXRzIDYgdG8gNyBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZAorCQorCitDUy1BbGxvY2F0aW9uUmV0ZW50aW9uUHJpb3JpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhpcyBkYXRhIHR5cGUgZW5jb2RlcyBlYWNoIHByaW9yaXR5IGxldmVsIGRlZmluZWQgaW4gVFMgMjMuMTA3IGFzIHRoZSBiaW5hcnkgdmFsdWUKKwktLSBvZiB0aGUgcHJpb3JpdHkgbGV2ZWwuCisKK0lTVC1BbGVydFRpbWVyVmFsdWUgOjo9IElOVEVHRVIgKDE1Li4yNTUpCisKK0xDU0luZm9ybWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJZ21sYy1MaXN0CVswXQlHTUxDLUxpc3QJT1BUSU9OQUwsCisJbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0CVsxXQlMQ1MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QJT1BUSU9OQUwsCisJbW9sci1MaXN0CQlbMl0JTU9MUi1MaXN0CU9QVElPTkFMLAorCS4uLiwKKwlhZGQtbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0CVszXQlMQ1MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QJT1BUSU9OQUwgfQorCS0tIGFkZC1sY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgbWF5IGJlIHNlbnQgb25seSBpZiBsY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgaXMKKwktLSBwcmVzZW50IGFuZCBjb250YWlucyBmb3VyIGluc3RhbmNlcyBvZiBMQ1MtUHJpdmFjeUNsYXNzLiBJZiB0aGUgbWVudGlvbmVkIGNvbmRpdGlvbgorCS0tIGlzIG5vdCBzYXRpc2ZpZWQgdGhlIHJlY2VpdmluZyBub2RlIHNoYWxsIGRpc2NhcmQgYWRkLWxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdC4KKwktLSBJZiBhbiBMQ1MtUHJpdmFjeUNsYXNzIGlzIHJlY2VpdmVkIGJvdGggaW4gbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IGFuZCBpbgorCS0tIGFkZC1sY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3Qgd2l0aCB0aGUgc2FtZSBTUy1Db2RlLCB0aGVuIHRoZSBlcnJvciB1bmV4cGVjdGVkIAorCS0tIGRhdGEgdmFsdWUgc2hhbGwgYmUgcmV0dXJuZWQuCisKK0dNTEMtTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZHTUxDKSBPRgorCQkJCUlTRE4tQWRkcmVzc1N0cmluZworCS0tIGlmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCB0aGUgY29tcGxldGUgR01MQy1MaXN0IHNoYWxsIGJlIHNlbnQgaW4gb25lIHNlZ21lbnQKKworbWF4TnVtT2ZHTUxDICBJTlRFR0VSIDo6PSA1CisKK05ldHdvcmtBY2Nlc3NNb2RlIDo6PSBFTlVNRVJBVEVEIHsKKwlwYWNrZXRBbmRDaXJjdWl0CSgwKSwKKwlvbmx5Q2lyY3VpdAkJKDEpLAorCW9ubHlQYWNrZXQJCSgyKSwKKwkuLi59CisJLS0gaWYgdW5rbm93biB2YWx1ZXMgYXJlIHJlY2VpdmVkIGluIE5ldHdvcmtBY2Nlc3NNb2RlCisJLS0gdGhleSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0dQUlNEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZQRFAtQ29udGV4dHMpIE9GCisJCQkJUERQLUNvbnRleHQKKworbWF4TnVtT2ZQRFAtQ29udGV4dHMgIElOVEVHRVIgOjo9IDUwCisKK1BEUC1Db250ZXh0IDo6PSBTRVFVRU5DRSB7CisJcGRwLUNvbnRleHRJZAlDb250ZXh0SWQsCisJcGRwLVR5cGUJCVsxNl0gUERQLVR5cGUsCisJcGRwLUFkZHJlc3MJWzE3XSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlxb3MtU3Vic2NyaWJlZAlbMThdIFFvUy1TdWJzY3JpYmVkLAorCXZwbG1uQWRkcmVzc0FsbG93ZWQJWzE5XSBOVUxMCU9QVElPTkFMLAorCWFwbgkJCVsyMF0gQVBOLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMjFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWV4dC1Rb1MtU3Vic2NyaWJlZAlbMF0gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLCAKKwlwZHAtQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJWzFdIENoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCU9QVElPTkFMLAorCWV4dDItUW9TLVN1YnNjcmliZWQJWzJdIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gZXh0Mi1Rb1MtU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIGV4dC1Rb1MtU3Vic2NyaWJlZCBpcyBwcmVzZW50LgorCWV4dDMtUW9TLVN1YnNjcmliZWQJWzNdIEV4dDMtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwKKwktLSBleHQzLVFvUy1TdWJzY3JpYmVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgZXh0Mi1Rb1MtU3Vic2NyaWJlZCBpcyBwcmVzZW50LgorCSB9CisKK0NvbnRleHRJZCA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZQRFAtQ29udGV4dHMpCisKK0dQUlNTdWJzY3JpcHRpb25EYXRhIDo6PSBTRVFVRU5DRSB7CisJY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkCU5VTEwJCQlPUFRJT05BTCwKKwkJLS0gSWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIGNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZCBtYXkgb25seSBiZSBwcmVzZW50IGluIHRoZQorCQktLSBmaXJzdCBzZWdtZW50IG9mIEdQUlNTdWJzY3JpcHRpb25EYXRhLgorCWdwcnNEYXRhTGlzdAlbMV0JR1BSU0RhdGFMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK1NHU04tQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWdwcnMtQ1NJCQlbMF0JR1BSUy1DU0kJT1BUSU9OQUwsCisJbW8tc21zLUNTSQlbMV0JU01TLUNTSQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbXQtc21zLUNTSQlbM10JU01TLUNTSQlPUFRJT05BTCwKKwltdC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJWzRdCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwltZy1jc2kJCVs1XQlNRy1DU0kJT1BUSU9OQUwKKwl9CisKK0dQUlMtQ1NJIDo6PSBTRVFVRU5DRSB7CisJZ3Bycy1DYW1lbFREUERhdGFMaXN0CVswXSBHUFJTLUNhbWVsVERQRGF0YUxpc3QJT1BUSU9OQUwsCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzFdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVszXQlOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVs0XQlOVUxMCQlPUFRJT05BTCwKKwkuLi59CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIEdQUlMtQ1NJIGlzIHNlbnQgdG8gU0dTTi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4gCistLQlHUFJTLUNhbWVsVERQRGF0YSBhbmQgIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIHByZXNlbnQgaW4gCistLQl0aGUgR1BSUy1DU0kgc2VxdWVuY2UuCistLQlJZiBHUFJTLUNTSSBpcyBzZWdtZW50ZWQsIGdwcnMtQ2FtZWxURFBEYXRhTGlzdCBhbmQgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgc2hhbGwgYmUgCistLQlwcmVzZW50IGluIHRoZSBmaXJzdCBzZWdtZW50CisKK0dQUlMtQ2FtZWxURFBEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJR1BSUy1DYW1lbFREUERhdGEKKy0tCUdQUlMtQ2FtZWxURFBEYXRhTGlzdCBzaGFsbCBub3QgY29udGFpbiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mCistLQlHUFJTLUNhbWVsVERQRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBncHJzLVRyaWdnZXJEZXRlY3Rpb25Qb2ludC4KKworR1BSUy1DYW1lbFREUERhdGEgOjo9IFNFUVVFTkNFIHsKKwlncHJzLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlbMF0gR1BSUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJc2VydmljZUtleQlbMV0gU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMl0gSVNETi1BZGRyZXNzU3RyaW5nLAorCWRlZmF1bHRTZXNzaW9uSGFuZGxpbmcJWzNdIERlZmF1bHRHUFJTLUhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLgorCX0KKworRGVmYXVsdEdQUlMtSGFuZGxpbmcgOjo9IEVOVU1FUkFURUQgeworCWNvbnRpbnVlVHJhbnNhY3Rpb24gKDApICwKKwlyZWxlYXNlVHJhbnNhY3Rpb24gKDEpICwKKwkuLi59CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSByZWNlcHRpb24gb2YgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAiY29udGludWVUcmFuc2FjdGlvbiIKKy0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgInJlbGVhc2VUcmFuc2FjdGlvbiIKKworR1BSUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgOjo9IEVOVU1FUkFURUQgeworCWF0dGFjaCAJCQkoMSksCisJYXR0YWNoQ2hhbmdlT2ZQb3NpdGlvbiAJCSgyKSwKKwlwZHAtQ29udGV4dEVzdGFibGlzaG1lbnQgCQkoMTEpLAorCXBkcC1Db250ZXh0RXN0YWJsaXNobWVudEFja25vd2xlZGdlbWVudAkoMTIpLAorCXBkcC1Db250ZXh0Q2hhbmdlT2ZQb3NpdGlvbiAJCSgxNCksCisJLi4uIH0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIEZvciBHUFJTLUNhbWVsVERQRGF0YSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCistLSBHUFJTLUNhbWVsVERQRGF0YXNlcXVlbmNlLgorCitBUE4gOjo9ICBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjYzKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddIAorCitQRFAtVHlwZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI5LjA2MCBbMTA1XQorCitQRFAtQWRkcmVzcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4xNikpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyOS4wNjAgWzEwNV0KKworCS0tIFRoZSBwb3NzaWJsZSBzaXplIHZhbHVlcyBhcmU6CisJLS0gMS03IG9jdGV0cyAgWC4yNSBhZGRyZXNzIHR5cGUKKwktLSAgNCAgb2N0ZXRzICBJUHY0IGFkZHJlc3MgdHlwZQorCS0tIDE2ICBvY3RldHMgIElwdjYgYWRkcmVzcyB0eXBlCisKK1FvUy1TdWJzY3JpYmVkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0cyAKKwktLSAzLTUuCisKK0V4dC1Rb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi45KSkKKwktLSBPQ1RFVCAxOiAKKwktLSAgQWxsb2NhdGlvbi9SZXRlbnRpb24gUHJpb3JpdHkgKFRoaXMgb2N0ZXQgZW5jb2RlcyBlYWNoIHByaW9yaXR5IGxldmVsIGRlZmluZWQgaW4KKwktLSAgICAgMjMuMTA3IGFzIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHByaW9yaXR5IGxldmVsLCBkZWNsYXJhdGlvbiBpbiAyOS4wNjApCisJLS0gT2N0ZXRzIDItOSBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0cyAKKwktLSA2LTEzLgorCitFeHQyLVFvUy1TdWJzY3JpYmVkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjMpKQorCS0tIE9jdGV0cyAxLTMgYXJlIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldHMgMTQtMTYuCisJLS0gSWYgUXVhbGl0eSBvZiBTZXJ2aWNlIGluZm9ybWF0aW9uIGlzIHN0cnVjdHVyZWQgd2l0aCAxNCBvY3RldCBsZW5ndGgsIHRoZW4KKwktLSBPY3RldCAxIGlzIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldCAxNC4KKworRXh0My1Rb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4yKSkKKwktLSBPY3RldHMgMS0yIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XSBRdWFsaXR5IG9mIFNlcnZpY2UgT2N0ZXRzIDE3LTE4LgorCitDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDMyLjIxNS4KKworTFNBT25seUFjY2Vzc0luZGljYXRvciA6Oj0gRU5VTUVSQVRFRCB7CisJYWNjZXNzT3V0c2lkZUxTQXNBbGxvd2VkICAoMCksCisJYWNjZXNzT3V0c2lkZUxTQXNSZXN0cmljdGVkICgxKX0KKworTFNBRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTFNBcykgT0YKKwkJCQlMU0FEYXRhCisKK21heE51bU9mTFNBcyAgSU5URUdFUiA6Oj0gMjAKKworTFNBRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWxzYUlkZW50aXR5CVswXSBMU0FJZGVudGl0eSwKKwlsc2FBdHRyaWJ1dGVzCVsxXSBMU0FBdHRyaWJ1dGVzLAorCWxzYUFjdGl2ZU1vZGVJbmRpY2F0b3IJWzJdIE5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTFNBSW5mb3JtYXRpb24gOjo9IFNFUVVFTkNFIHsKKwljb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQJTlVMTAkJCU9QVElPTkFMLAorCisJCS0tIElmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCBjb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQgbWF5IG9ubHkgYmUgcHJlc2VudCBpbiB0aGUKKwkJLS0gZmlyc3Qgc2VnbWVudC4KKwlsc2FPbmx5QWNjZXNzSW5kaWNhdG9yCVsxXQlMU0FPbmx5QWNjZXNzSW5kaWNhdG9yCU9QVElPTkFMLAorCWxzYURhdGFMaXN0CVsyXQlMU0FEYXRhTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0xTQUlkZW50aXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10KKworTFNBQXR0cmlidXRlcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDQ4LjAwOCBbNDldCisKK1N1YnNjcmliZXJEYXRhIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWNhdGVnb3J5CQlbMl0gQ2F0ZWdvcnkJT1BUSU9OQUwsCisJc3Vic2NyaWJlclN0YXR1cwlbM10gU3Vic2NyaWJlclN0YXR1cwlPUFRJT05BTCwKKwliZWFyZXJTZXJ2aWNlTGlzdAlbNF0gQmVhcmVyU2VydmljZUxpc3QJT1BUSU9OQUwsCisJLS0gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgcmVjZXB0aW9uIG9mIHVuc3VwcG9ydGVkIC8gbm90IGFsbG9jYXRlZAorCS0tIGJlYXJlclNlcnZpY2VDb2RlcyBpcyBkZWZpbmVkIGluIHNlY3Rpb24gOC44LjEKKwl0ZWxlc2VydmljZUxpc3QJWzZdIFRlbGVzZXJ2aWNlTGlzdAlPUFRJT05BTCwKKwktLSBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciByZWNlcHRpb24gb2YgdW5zdXBwb3J0ZWQgLyBub3QgYWxsb2NhdGVkCisJLS0gdGVsZXNlcnZpY2VDb2RlcyBpcyBkZWZpbmVkIGluIHNlY3Rpb24gOC44LjEKKwlwcm92aXNpb25lZFNTCVs3XSBFeHQtU1MtSW5mb0xpc3QJT1BUSU9OQUwsCisJb2RiLURhdGEJCVs4XSBPREItRGF0YQlPUFRJT05BTCwKKwlyb2FtaW5nUmVzdHJpY3Rpb25EdWVUb1Vuc3VwcG9ydGVkRmVhdHVyZSAgWzldIE5VTEwJT1BUSU9OQUwsCisJcmVnaW9uYWxTdWJzY3JpcHRpb25EYXRhCVsxMF0gWm9uZUNvZGVMaXN0CU9QVElPTkFMLAorCXZic1N1YnNjcmlwdGlvbkRhdGEJWzExXSBWQlNEYXRhTGlzdAlPUFRJT05BTCwKKwl2Z2NzU3Vic2NyaXB0aW9uRGF0YQlbMTJdIFZHQ1NEYXRhTGlzdAlPUFRJT05BTCwKKwl2bHJDYW1lbFN1YnNjcmlwdGlvbkluZm8JWzEzXSBWbHJDYW1lbFN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwKKwl9CisKK0NhdGVnb3J5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBJVFUtVCBSZWMgUS43NjMuCisKK1N1YnNjcmliZXJTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworCXNlcnZpY2VHcmFudGVkICAoMCksCisJb3BlcmF0b3JEZXRlcm1pbmVkQmFycmluZyAgKDEpfQorCitCZWFyZXJTZXJ2aWNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCZWFyZXJTZXJ2aWNlcykgT0YKKwkJCQlFeHQtQmVhcmVyU2VydmljZUNvZGUKKworbWF4TnVtT2ZCZWFyZXJTZXJ2aWNlcyAgSU5URUdFUiA6Oj0gNTAKKworVGVsZXNlcnZpY2VMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlRlbGVzZXJ2aWNlcykgT0YKKwkJCQlFeHQtVGVsZXNlcnZpY2VDb2RlCisKK21heE51bU9mVGVsZXNlcnZpY2VzICBJTlRFR0VSIDo6PSAyMAorCitPREItRGF0YSA6Oj0gU0VRVUVOQ0UgeworCW9kYi1HZW5lcmFsRGF0YQlPREItR2VuZXJhbERhdGEsCisJb2RiLUhQTE1OLURhdGEJT0RCLUhQTE1OLURhdGEJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK09EQi1HZW5lcmFsRGF0YSA6Oj0gQklUIFNUUklORyB7CisJYWxsT0ctQ2FsbHNCYXJyZWQgICgwKSwKKwlpbnRlcm5hdGlvbmFsT0dDYWxsc0JhcnJlZCAgKDEpLAorCWludGVybmF0aW9uYWxPR0NhbGxzTm90VG9IUExNTi1Db3VudHJ5QmFycmVkICAoMiksCisJaW50ZXJ6b25hbE9HQ2FsbHNCYXJyZWQgKDYpLAorCWludGVyem9uYWxPR0NhbGxzTm90VG9IUExNTi1Db3VudHJ5QmFycmVkICg3KSwKKwlpbnRlcnpvbmFsT0dDYWxsc0FuZEludGVybmF0aW9uYWxPR0NhbGxzTm90VG9IUExNTi1Db3VudHJ5QmFycmVkICg4KSwKKwlwcmVtaXVtUmF0ZUluZm9ybWF0aW9uT0dDYWxsc0JhcnJlZCAgKDMpLAorCXByZW1pdW1SYXRlRW50ZXJ0YWluZW1lbnRPR0NhbGxzQmFycmVkICAoNCksCisJc3MtQWNjZXNzQmFycmVkICAoNSksCisJYWxsRUNULUJhcnJlZCAoOSksCisJY2hhcmdlYWJsZUVDVC1CYXJyZWQgKDEwKSwKKwlpbnRlcm5hdGlvbmFsRUNULUJhcnJlZCAoMTEpLAorCWludGVyem9uYWxFQ1QtQmFycmVkICgxMiksCisJZG91Ymx5Q2hhcmdlYWJsZUVDVC1CYXJyZWQgKDEzKSwKKwltdWx0aXBsZUVDVC1CYXJyZWQgKDE0KSwKKwlhbGxQYWNrZXRPcmllbnRlZFNlcnZpY2VzQmFycmVkICgxNSksCisJcm9hbWVyQWNjZXNzVG9IUExNTi1BUC1CYXJyZWQgICgxNiksCisJcm9hbWVyQWNjZXNzVG9WUExNTi1BUC1CYXJyZWQgICgxNyksCisJcm9hbWluZ091dHNpZGVQTE1OT0ctQ2FsbHNCYXJyZWQgICgxOCksCisJYWxsSUMtQ2FsbHNCYXJyZWQgICgxOSksCisJcm9hbWluZ091dHNpZGVQTE1OSUMtQ2FsbHNCYXJyZWQgICgyMCksCisJcm9hbWluZ091dHNpZGVQTE1OSUNvdW50cnlJQy1DYWxsc0JhcnJlZCAgKDIxKSwKKwlyb2FtaW5nT3V0c2lkZVBMTU4tQmFycmVkICAoMjIpLAorCXJvYW1pbmdPdXRzaWRlUExNTi1Db3VudHJ5QmFycmVkICAoMjMpLAorCXJlZ2lzdHJhdGlvbkFsbENGLUJhcnJlZCAgKDI0KSwKKwlyZWdpc3RyYXRpb25DRk5vdFRvSFBMTU4tQmFycmVkICAoMjUpLAorCXJlZ2lzdHJhdGlvbkludGVyem9uYWxDRi1CYXJyZWQgICgyNiksCisJcmVnaXN0cmF0aW9uSW50ZXJ6b25hbENGTm90VG9IUExNTi1CYXJyZWQgICgyNyksCisJcmVnaXN0cmF0aW9uSW50ZXJuYXRpb25hbENGLUJhcnJlZCAgKDI4KX0gKFNJWkUgKDE1Li4zMikpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCisJLS0gT0RCLUdlbmVyYWxEYXRhIHR5cGUgc2hhbGwgYmUgdHJlYXRlZCBsaWtlIHVuc3VwcG9ydGVkIE9EQi1HZW5lcmFsRGF0YQorCS0tIFdoZW4gdGhlIE9EQi1HZW5lcmFsRGF0YSB0eXBlIGlzIHJlbW92ZWQgZnJvbSB0aGUgSExSIGZvciBhIGdpdmVuIHN1YnNjcmliZXIsIAorCS0tIGluIE5vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkIG9wZXJhdGlvbiBzZW50IHRvd2FyZCB0aGUgZ3NtU0NGIAorCS0tIGFsbCBiaXRzIHNoYWxsIGJlIHNldCB0byAiTyIuCisKK09EQi1IUExNTi1EYXRhIDo6PSBCSVQgU1RSSU5HIHsKKwlwbG1uLVNwZWNpZmljQmFycmluZ1R5cGUxICAoMCksCisJcGxtbi1TcGVjaWZpY0JhcnJpbmdUeXBlMiAgKDEpLAorCXBsbW4tU3BlY2lmaWNCYXJyaW5nVHlwZTMgICgyKSwKKwlwbG1uLVNwZWNpZmljQmFycmluZ1R5cGU0ICAoMyl9IChTSVpFICg0Li4zMikpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCisJLS0gT0RCLUhQTE1OLURhdGEgdHlwZSBzaGFsbCBiZSB0cmVhdGVkIGxpa2UgdW5zdXBwb3J0ZWQgT0RCLUhQTE1OLURhdGEgCisJLS0gV2hlbiB0aGUgT0RCLUhQTE1OLURhdGEgdHlwZSBpcyByZW1vdmVkIGZyb20gdGhlIEhMUiBmb3IgYSBnaXZlbiBzdWJzY3JpYmVyLCAKKwktLSBpbiBOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZCBvcGVyYXRpb24gc2VudCB0b3dhcmQgdGhlIGdzbVNDRgorCS0tIGFsbCBiaXRzIHNoYWxsIGJlIHNldCB0byAiTyIuCisKK0V4dC1TUy1JbmZvTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTUykgT0YKKwkJCQlFeHQtU1MtSW5mbworCitFeHQtU1MtSW5mbyA6Oj0gQ0hPSUNFIHsKKwlmb3J3YXJkaW5nSW5mbwlbMF0gRXh0LUZvcndJbmZvLAorCWNhbGxCYXJyaW5nSW5mbwlbMV0gRXh0LUNhbGxCYXJJbmZvLAorCWN1Zy1JbmZvCQlbMl0gQ1VHLUluZm8sCisJc3MtRGF0YQkJWzNdIEV4dC1TUy1EYXRhLAorCWVtbHBwLUluZm8JWzRdIEVNTFBQLUluZm99CisKK0V4dC1Gb3J3SW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CUV4dC1Gb3J3RmVhdHVyZUxpc3QsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtRm9yd0ZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJRXh0LUZvcndGZWF0dXJlCisKK0V4dC1Gb3J3RmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBFeHQtU1MtU3RhdHVzLAorCWZvcndhcmRlZFRvTnVtYmVyCVs1XSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJLS0gV2hlbiB0aGlzIGRhdGEgdHlwZSBpcyBzZW50IGZyb20gYW4gSExSIHdoaWNoIHN1cHBvcnRzIENBTUVMIFBoYXNlIDIKKwktLSB0byBhIFZMUiB0aGF0IHN1cHBvcnRzIENBTUVMIFBoYXNlIDIgdGhlIFZMUiBzaGFsbCBub3QgY2hlY2sgdGhlCisJLS0gZm9ybWF0IG9mIHRoZSBudW1iZXIKKwlmb3J3YXJkZWRUb1N1YmFkZHJlc3MJWzhdIElTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlmb3J3YXJkaW5nT3B0aW9ucwlbNl0gRXh0LUZvcndPcHRpb25zCU9QVElPTkFMLAorCW5vUmVwbHlDb25kaXRpb25UaW1lCVs3XSBFeHQtTm9SZXBDb25kVGltZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzldIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbG9uZ0ZvcndhcmRlZFRvTnVtYmVyCVsxMF0gRlROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQorCitFeHQtRm9yd09wdGlvbnMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNSkpCisKKwktLSBPQ1RFVCAxOgorCisJLS0gIGJpdCA4OiBub3RpZmljYXRpb24gdG8gZm9yd2FyZGluZyBwYXJ0eQorCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgorCS0tCTEgIG5vdGlmaWNhdGlvbgorCisJLS0gIGJpdCA3OiByZWRpcmVjdGluZyBwcmVzZW50YXRpb24KKwktLQkwIG5vIHByZXNlbnRhdGlvbiAgCisJLS0JMSAgcHJlc2VudGF0aW9uCisKKwktLSAgYml0IDY6IG5vdGlmaWNhdGlvbiB0byBjYWxsaW5nIHBhcnR5CisJLS0JMCAgbm8gbm90aWZpY2F0aW9uCisJLS0JMSAgbm90aWZpY2F0aW9uCisKKwktLSAgYml0IDU6IDAgKHVudXNlZCkKKworCS0tICBiaXRzIDQzOiBmb3J3YXJkaW5nIHJlYXNvbgorCS0tCTAwICBtcyBub3QgcmVhY2hhYmxlCisJLS0JMDEgIG1zIGJ1c3kKKwktLQkxMCAgbm8gcmVwbHkKKwktLQkxMSAgdW5jb25kaXRpb25hbAorCisJLS0gYml0cyAyMTogMDAgKHVudXNlZCkKKworCS0tIE9DVEVUUyAyLTU6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGV5IHNoYWxsIGJlIGRpc2NhcmRlZCBpZgorCS0tIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZC4KKworRXh0LU5vUmVwQ29uZFRpbWUgOjo9IElOVEVHRVIgKDEuLjEwMCkKKwktLSBPbmx5IHZhbHVlcyA1LTMwIGFyZSB1c2VkLgorCS0tIFZhbHVlcyBpbiB0aGUgcmFuZ2VzIDEtNCBhbmQgMzEtMTAwIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorCS0tIElmIHJlY2VpdmVkOgorCS0tCQl2YWx1ZXMgMS00IHNoYWxsIGJlIG1hcHBlZCBvbiB0byB2YWx1ZSA1CisJLS0JCXZhbHVlcyAzMS0xMDAgc2hhbGwgYmUgbWFwcGVkIG9uIHRvIHZhbHVlIDMwCisKK0V4dC1DYWxsQmFySW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlFeHQtQ2FsbEJhckZlYXR1cmVMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtQ2FsbEJhckZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJRXh0LUNhbGxCYXJyaW5nRmVhdHVyZQorCitFeHQtQ2FsbEJhcnJpbmdGZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJYmFzaWNTZXJ2aWNlCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzRdIEV4dC1TUy1TdGF0dXMsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NVRy1JbmZvIDo6PSBTRVFVRU5DRSB7CisJY3VnLVN1YnNjcmlwdGlvbkxpc3QJQ1VHLVN1YnNjcmlwdGlvbkxpc3QsCisJY3VnLUZlYXR1cmVMaXN0CUNVRy1GZWF0dXJlTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NVRy1TdWJzY3JpcHRpb25MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgwLi5tYXhOdW1PZkNVRykgT0YKKwkJCQlDVUctU3Vic2NyaXB0aW9uCisKK0NVRy1TdWJzY3JpcHRpb24gOjo9IFNFUVVFTkNFIHsKKwljdWctSW5kZXgJQ1VHLUluZGV4LAorCWN1Zy1JbnRlcmxvY2sJQ1VHLUludGVybG9jaywKKwlpbnRyYUNVRy1PcHRpb25zCUludHJhQ1VHLU9wdGlvbnMsCisJYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CUV4dC1CYXNpY1NlcnZpY2VHcm91cExpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDVUctSW5kZXggOjo9IElOVEVHRVIgKDAuLjMyNzY3KQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBFVFMgMzAwIDEzOC4KKworQ1VHLUludGVybG9jayA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKworSW50cmFDVUctT3B0aW9ucyA6Oj0gRU5VTUVSQVRFRCB7CisJbm9DVUctUmVzdHJpY3Rpb25zICAoMCksCisJY3VnSUMtQ2FsbEJhcnJlZCAgKDEpLAorCWN1Z09HLUNhbGxCYXJyZWQgICgyKX0KKworbWF4TnVtT2ZDVUcgIElOVEVHRVIgOjo9IDEwCisKK0NVRy1GZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUNVRy1GZWF0dXJlCisKK0V4dC1CYXNpY1NlcnZpY2VHcm91cExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQorCittYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMgIElOVEVHRVIgOjo9IDMyCisKK0NVRy1GZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJYmFzaWNTZXJ2aWNlCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXByZWZlcmVudGlhbENVRy1JbmRpY2F0b3IJQ1VHLUluZGV4CU9QVElPTkFMLAorCWludGVyQ1VHLVJlc3RyaWN0aW9ucwlJbnRlckNVRy1SZXN0cmljdGlvbnMsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ludGVyQ1VHLVJlc3RyaWN0aW9ucyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKworCS0tIGJpdHMgODc2NTQzOiAwMDAwMDAgKHVudXNlZCkKKwktLSBFeGNlcHRpb24gaGFuZGxpbmc6CisJLS0gYml0cyA4NzY1NDMgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKworCS0tIGJpdHMgMjEKKwktLQkwMCAgQ1VHIG9ubHkgZmFjaWxpdGllcworCS0tCTAxICBDVUcgd2l0aCBvdXRnb2luZyBhY2Nlc3MKKwktLQkxMCAgQ1VHIHdpdGggaW5jb21pbmcgYWNjZXNzCisJLS0JMTEgIENVRyB3aXRoIGJvdGggb3V0Z29pbmcgYW5kIGluY29taW5nIGFjY2VzcworCitFeHQtU1MtRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJc3MtU3RhdHVzCVs0XSBFeHQtU1MtU3RhdHVzLAorCXNzLVN1YnNjcmlwdGlvbk9wdGlvbglTUy1TdWJzY3JpcHRpb25PcHRpb24JT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CUV4dC1CYXNpY1NlcnZpY2VHcm91cExpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs1XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitMQ1MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUHJpdmFjeUNsYXNzKSBPRgorCQkJCUxDUy1Qcml2YWN5Q2xhc3MKKworbWF4TnVtT2ZQcml2YWN5Q2xhc3MgIElOVEVHRVIgOjo9IDQKKworTENTLVByaXZhY3lDbGFzcyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJc3MtU3RhdHVzCQlFeHQtU1MtU3RhdHVzLAorCW5vdGlmaWNhdGlvblRvTVNVc2VyCVswXSBOb3RpZmljYXRpb25Ub01TVXNlcglPUFRJT05BTCwKKwktLSBub3RpZmljYXRpb25Ub01TVXNlciBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlcyBjYWxsU2Vzc2lvblJlbGF0ZWQKKwktLSBhbmQgY2FsbFNlc3Npb25VbnJlbGF0ZWQuIElmIG5vdCByZWNlaXZlZCBmb3IgU1MtY29kZXMgY2FsbFNlc3Npb25SZWxhdGVkCisJLS0gYW5kIGNhbGxTZXNzaW9uVW5yZWxhdGVkLAorCS0tIHRoZSBkZWZhdWx0IHZhbHVlcyBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMy4yNzEgc2hhbGwgYmUgYXNzdW1lZC4KKwlleHRlcm5hbENsaWVudExpc3QJWzFdIEV4dGVybmFsQ2xpZW50TGlzdAlPUFRJT05BTCwKKwktLSBleHRlcm5hbENsaWVudExpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZSBjYWxsU2Vzc2lvblVucmVsYXRlZCB0byBhCisJLS0gdmlzaXRlZCBub2RlIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBMQ1MgUmVsZWFzZSA0IG9yIGxhdGVyIHZlcnNpb25zLgorCS0tIGV4dGVybmFsQ2xpZW50TGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlcyBjYWxsU2Vzc2lvblVucmVsYXRlZCBhbmQKKwktLSBjYWxsU2Vzc2lvblJlbGF0ZWQgdG8gYSB2aXNpdGVkIG5vZGUgdGhhdCBzdXBwb3J0cyBMQ1MgUmVsZWFzZSA0IG9yIGxhdGVyIHZlcnNpb25zLgorCXBsbW5DbGllbnRMaXN0CVsyXSBQTE1OQ2xpZW50TGlzdAlPUFRJT05BTCwKKwktLSBwbG1uQ2xpZW50TGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlIHBsbW5vcGVyYXRvci4KKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZXh0LWV4dGVybmFsQ2xpZW50TGlzdAlbNF0gRXh0LUV4dGVybmFsQ2xpZW50TGlzdAlPUFRJT05BTCwKKwktLSBFeHQtZXh0ZXJuYWxDbGllbnRMaXN0IG1heSBiZSBzZW50IG9ubHkgaWYgdGhlIHZpc2l0ZWQgbm9kZSBzdXBwb3J0cyBMQ1MgUmVsZWFzZSA0IG9yCisJLS0gbGF0ZXIgdmVyc2lvbnMsIHRoZSB1c2VyIGRpZCBzcGVjaWZ5IG1vcmUgdGhhbiA1IGNsaWVudHMsIGFuZCBXaGl0ZSBCb29rIFNDQ1AgaXMgdXNlZC4KKwlzZXJ2aWNlVHlwZUxpc3QJWzVdCVNlcnZpY2VUeXBlTGlzdAlPUFRJT05BTAorCS0tIHNlcnZpY2VUeXBlTGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlIHNlcnZpY2VUeXBlIGFuZCBpZiB0aGUgdmlzaXRlZCBub2RlCisJLS0gc3VwcG9ydHMgTENTIFJlbGVhc2UgNSBvciBsYXRlciB2ZXJzaW9ucy4KKwktLSAKKwktLSBpZiBzZWdtZW50YXRpb24gaXMgdXNlZCwgdGhlIGNvbXBsZXRlIExDUy1Qcml2YWN5Q2xhc3Mgc2hhbGwgYmUgc2VudCBpbiBvbmUgc2VnbWVudAorfQorCitFeHRlcm5hbENsaWVudExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDAuLm1heE51bU9mRXh0ZXJuYWxDbGllbnQpIE9GCisJCQkJRXh0ZXJuYWxDbGllbnQKKworbWF4TnVtT2ZFeHRlcm5hbENsaWVudCAgSU5URUdFUiA6Oj0gNQorCitQTE1OQ2xpZW50TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZQTE1OQ2xpZW50KSBPRgorCQkJCUxDU0NsaWVudEludGVybmFsSUQKKworbWF4TnVtT2ZQTE1OQ2xpZW50ICBJTlRFR0VSIDo6PSA1CisKK0V4dC1FeHRlcm5hbENsaWVudExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUV4dGVybmFsQ2xpZW50KSBPRgorCQkJCUV4dGVybmFsQ2xpZW50CisKK21heE51bU9mRXh0LUV4dGVybmFsQ2xpZW50ICBJTlRFR0VSIDo6PSAzNQorCitFeHRlcm5hbENsaWVudCA6Oj0gU0VRVUVOQ0UgeworCWNsaWVudElkZW50aXR5CUxDU0NsaWVudEV4dGVybmFsSUQsCisJZ21sYy1SZXN0cmljdGlvbglbMF0gR01MQy1SZXN0cmljdGlvbglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub01TVXNlcglbMV0gTm90aWZpY2F0aW9uVG9NU1VzZXIJT1BUSU9OQUwsCisJLS0gSWYgbm90aWZpY2F0aW9uVG9NU1VzZXIgaXMgbm90IHJlY2VpdmVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBhY2NvcmRpbmcgdG8gCisJLS0gM0dQUCBUUyAyMy4yNzEgc2hhbGwgYmUgYXNzdW1lZC4KKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitHTUxDLVJlc3RyaWN0aW9uIDo6PSBFTlVNRVJBVEVEIHsKKwlnbWxjLUxpc3QJCSgwKSwKKwlob21lLUNvdW50cnkJKDEpICwKKwkuLi4gfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gQXQgcmVjZXB0aW9uIG9mIGFueSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlCistLSBHTUxDLVJlc3RyaWN0aW9uLgorCitOb3RpZmljYXRpb25Ub01TVXNlciA6Oj0gRU5VTUVSQVRFRCB7CisJbm90aWZ5TG9jYXRpb25BbGxvd2VkCSgwKSwKKwlub3RpZnlBbmRWZXJpZnktTG9jYXRpb25BbGxvd2VkSWZOb1Jlc3BvbnNlCSgxKSwKKwlub3RpZnlBbmRWZXJpZnktTG9jYXRpb25Ob3RBbGxvd2VkSWZOb1Jlc3BvbnNlCSgyKSwKKwkuLi4sCisJbG9jYXRpb25Ob3RBbGxvd2VkICgzKSB9CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBBdCByZWNlcHRpb24gb2YgYW55IG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUKKy0tIE5vdGlmaWNhdGlvblRvTVNVc2VyLgorCitTZXJ2aWNlVHlwZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU2VydmljZVR5cGUpIE9GCisJCQkJU2VydmljZVR5cGUKKworbWF4TnVtT2ZTZXJ2aWNlVHlwZSAgSU5URUdFUiA6Oj0gMzIKKworU2VydmljZVR5cGUgOjo9IFNFUVVFTkNFIHsKKwlzZXJ2aWNlVHlwZUlkZW50aXR5CUxDU1NlcnZpY2VUeXBlSUQsCisJZ21sYy1SZXN0cmljdGlvbglbMF0gR01MQy1SZXN0cmljdGlvbglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub01TVXNlcglbMV0gTm90aWZpY2F0aW9uVG9NU1VzZXIJT1BUSU9OQUwsCisJLS0gSWYgbm90aWZpY2F0aW9uVG9NU1VzZXIgaXMgbm90IHJlY2VpdmVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBhY2NvcmRpbmcgdG8gCisJLS0gM0dQUCBUUyAyMy4yNzEgc2hhbGwgYmUgYXNzdW1lZC4KKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitNT0xSLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTU9MUi1DbGFzcykgT0YKKwkJCQlNT0xSLUNsYXNzCisKK21heE51bU9mTU9MUi1DbGFzcyAgSU5URUdFUiA6Oj0gMworCitNT0xSLUNsYXNzIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwlzcy1TdGF0dXMJCUV4dC1TUy1TdGF0dXMsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitab25lQ29kZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mWm9uZUNvZGVzKQorCQkJCU9GIFpvbmVDb2RlCisKK1pvbmVDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIpKQorCS0tIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10KKworbWF4TnVtT2Zab25lQ29kZXMgIElOVEVHRVIgOjo9IDEwCisKK0luc2VydFN1YnNjcmliZXJEYXRhUmVzIDo6PSBTRVFVRU5DRSB7CisJdGVsZXNlcnZpY2VMaXN0CVsxXSBUZWxlc2VydmljZUxpc3QJT1BUSU9OQUwsCisJYmVhcmVyU2VydmljZUxpc3QJWzJdIEJlYXJlclNlcnZpY2VMaXN0CU9QVElPTkFMLAorCXNzLUxpc3QJCVszXSBTUy1MaXN0CU9QVElPTkFMLAorCW9kYi1HZW5lcmFsRGF0YQlbNF0gT0RCLUdlbmVyYWxEYXRhCU9QVElPTkFMLAorCXJlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UJWzVdIFJlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UJT1BUSU9OQUwsCisJc3VwcG9ydGVkQ2FtZWxQaGFzZXMJWzZdIFN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbN10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJb2ZmZXJlZENhbWVsNENTSXMJWzhdIE9mZmVyZWRDYW1lbDRDU0lzCU9QVElPTkFMLAorCXN1cHBvcnRlZEZlYXR1cmVzCVs5XSBTdXBwb3J0ZWRGZWF0dXJlcwlPUFRJT05BTCB9CisKK1JlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UgOjo9IEVOVU1FUkFURUQgeworCW5ldHdvcmtOb2RlLUFyZWFSZXN0cmljdGVkCSgwKSwKKwl0b29NYW55Wm9uZUNvZGVzCSgxKSwKKwl6b25lQ29kZXNDb25mbGljdAkoMiksCisJcmVnaW9uYWxTdWJzY05vdFN1cHBvcnRlZAkoMyl9CisKK0RlbGV0ZVN1YnNjcmliZXJEYXRhQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCWJhc2ljU2VydmljZUxpc3QJWzFdIEJhc2ljU2VydmljZUxpc3QJT1BUSU9OQUwsCisJLS0gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgcmVjZXB0aW9uIG9mIHVuc3VwcG9ydGVkL25vdCBhbGxvY2F0ZWQKKwktLSBiYXNpY1NlcnZpY2VDb2RlcyBpcyBkZWZpbmVkIGluIHNlY3Rpb24gNi44LjIKKwlzcy1MaXN0CQlbMl0gU1MtTGlzdAlPUFRJT05BTCwKKwlyb2FtaW5nUmVzdHJpY3Rpb25EdWVUb1Vuc3VwcG9ydGVkRmVhdHVyZSBbNF0gTlVMTAlPUFRJT05BTCwKKwlyZWdpb25hbFN1YnNjcmlwdGlvbklkZW50aWZpZXIJWzVdIFpvbmVDb2RlCU9QVElPTkFMLAorCXZic0dyb3VwSW5kaWNhdGlvbglbN10gTlVMTAkJT1BUSU9OQUwsCisJdmdjc0dyb3VwSW5kaWNhdGlvbglbOF0gTlVMTAkgCU9QVElPTkFMLAorCWNhbWVsU3Vic2NyaXB0aW9uSW5mb1dpdGhkcmF3CVs5XSBOVUxMCSAJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XSBFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLiwKKwlncHJzU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3CVsxMF0gR1BSU1N1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlPUFRJT05BTCwKKwlyb2FtaW5nUmVzdHJpY3RlZEluU2dzbkR1ZVRvVW5zdXBwcG9ydGVkRmVhdHVyZSBbMTFdIE5VTEwJT1BUSU9OQUwsCisJbHNhSW5mb3JtYXRpb25XaXRoZHJhdwlbMTJdIExTQUluZm9ybWF0aW9uV2l0aGRyYXcJT1BUSU9OQUwsCisJZ21sYy1MaXN0V2l0aGRyYXcgCVsxM10JTlVMTAkJT1BUSU9OQUwsCisJaXN0SW5mb3JtYXRpb25XaXRoZHJhdwlbMTRdIE5VTEwJCU9QVElPTkFMLAorCXNwZWNpZmljQ1NJLVdpdGhkcmF3CVsxNV0gU3BlY2lmaWNDU0ktV2l0aGRyYXcJT1BUSU9OQUwsCisJY2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3NXaXRoZHJhdwlbMTZdIE5VTEwJCU9QVElPTkFMLAorCXN0bi1zcldpdGhkcmF3CVsxN10gTlVMTAkJT1BUSU9OQUwsCisJZXBzU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3CVsxOF0gRVBTLVN1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlPUFRJT05BTCwKKwlhcG4tb2ktcmVwbGFjZW1lbnRXaXRoZHJhdwlbMTldIE5VTEwJCU9QVElPTkFMLAorCWNzZy1TdWJzY3JpcHRpb25EZWxldGVkCVsyMF0JTlVMTAkJT1BUSU9OQUwgfQorCitTcGVjaWZpY0NTSS1XaXRoZHJhdyA6Oj0gQklUIFNUUklORyB7CisJby1jc2kgKDApLAorCXNzLWNzaSAoMSksCisJdGlmLWNzaSAoMiksCisJZC1jc2kgKDMpLAorCXZ0LWNzaSAoNCksCisJbW8tc21zLWNzaSAoNSksCisJbS1jc2kgKDYpLAorCWdwcnMtY3NpICg3KSwKKwl0LWNzaSAoOCksCisJbXQtc21zLWNzaSAoOSksCisJbWctY3NpICgxMCksCisJby1JTS1DU0kgKDExKSwgCisJZC1JTS1DU0kgKDEyKSwKKwl2dC1JTS1DU0kgKDEzKSB9IChTSVpFKDguLjMyKSkgCistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBiaXRzIDExIHRvIDMxIHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYnkgYSBub24tSVAgTXVsdGltZWRpYSBDb3JlIE5ldHdvcmsgZW50aXR5LgorLS0gYml0cyAwLTEwIGFuZCAxNC0zMSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGJ5IGFuIElQIE11bHRpbWVkaWEgQ29yZSBOZXR3b3JrIGVudGl0eS4KKy0tIGJpdHMgMTEtMTMgYXJlIG9ubHkgYXBwbGljYWJsZSBpbiBhbiBJUCBNdWx0aW1lZGlhIENvcmUgTmV0d29yay4KKy0tIEJpdCA4IGFuZCBiaXRzIDExLTEzIGFyZSBvbmx5IGFwcGxpY2FibGUgZm9yIHRoZSBOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZCBvcGVyYXRpb24uCisKK0dQUlNTdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcgOjo9IENIT0lDRSB7CisJYWxsR1BSU0RhdGEJTlVMTCwKKwljb250ZXh0SWRMaXN0CUNvbnRleHRJZExpc3R9CisKK0VQUy1TdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcgOjo9IENIT0lDRSB7CisJYWxsRVBTLURhdGEJTlVMTCwKKwljb250ZXh0SWRMaXN0CUNvbnRleHRJZExpc3R9CisKK0NvbnRleHRJZExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKSBPRgorCQkJCUNvbnRleHRJZAorCitMU0FJbmZvcm1hdGlvbldpdGhkcmF3IDo6PSBDSE9JQ0UgeworCWFsbExTQURhdGEJTlVMTCwKKwlsc2FJZGVudGl0eUxpc3QJTFNBSWRlbnRpdHlMaXN0IH0KKworTFNBSWRlbnRpdHlMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkxTQXMpIE9GCisJCQkJTFNBSWRlbnRpdHkKKworQmFzaWNTZXJ2aWNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCYXNpY1NlcnZpY2VzKSBPRgorCQkJCUV4dC1CYXNpY1NlcnZpY2VDb2RlCisKK21heE51bU9mQmFzaWNTZXJ2aWNlcyAgSU5URUdFUiA6Oj0gNzAKKworRGVsZXRlU3Vic2NyaWJlckRhdGFSZXMgOjo9IFNFUVVFTkNFIHsKKwlyZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCVswXSBSZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitWbHJDYW1lbFN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlvLUNTSQkJWzBdIE8tQ1NJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJc3MtQ1NJCQlbMl0gU1MtQ1NJCU9QVElPTkFMLAorCW8tQmNzbUNhbWVsVERQLUNyaXRlcmlhTGlzdAlbNF0gTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJdGlmLUNTSQkJWzNdIE5VTEwJT1BUSU9OQUwsCisJbS1DU0kJCVs1XSBNLUNTSQlPUFRJT05BTCwKKwltby1zbXMtQ1NJCVs2XSBTTVMtQ1NJCU9QVElPTkFMLAorCXZ0LUNTSQkJWzddIFQtQ1NJCU9QVElPTkFMLAorCXQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CVs4XSBULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwlkLUNTSQkJWzldIEQtQ1NJCU9QVElPTkFMLAorCW10LXNtcy1DU0kJWzEwXSBTTVMtQ1NJCU9QVElPTkFMLAorCW10LXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlbMTFdCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTAorCX0KKworTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi4gbWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWEKKworTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWEgOjo9IFNFUVVFTkNFIHsKKwlzbXMtVHJpZ2dlckRldGVjdGlvblBvaW50CVNNUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJdHBkdS1UeXBlQ3JpdGVyaW9uCVswXQlUUERVLVR5cGVDcml0ZXJpb24JCU9QVElPTkFMLAorCS4uLiB9CisKK1RQRFUtVHlwZUNyaXRlcmlvbiA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZUUERVVHlwZXMpIE9GCisJTVQtU01TLVRQRFUtVHlwZQorCisKK21heE51bU9mVFBEVVR5cGVzIElOVEVHRVIgOjo9IDUKKworTVQtU01TLVRQRFUtVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJc21zLURFTElWRVIgCSgwKSwKKwlzbXMtU1VCTUlULVJFUE9SVCAJKDEpLAorCXNtcy1TVEFUVVMtUkVQT1JUIAkoMiksCisJLi4uIH0KKworLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JRm9yIFRQRFUtVHlwZUNyaXRlcmlvbiBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorLS0Jb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSAKKy0tCXRoZSB3aG9sZSBUUERVLVR5cGVDcml0ZXJpb24gc2VxdWVuY2UuCistLQlJbiBDQU1FTCBwaGFzZSA0LCBzbXMtU1VCTUlULVJFUE9SVCBzaGFsbCBub3QgYmUgdXNlZCBhbmQgYSByZWNlaXZlZCBUUERVLVR5cGVDcml0ZXJpb24KKy0tCXNlcXVlbmNlIGNvbnRhaW5pbmcgc21zLVNVQk1JVC1SRVBPUlQgc2hhbGwgYmUgd2hvbGx5IGlnbm9yZWQuCisKK0QtQ1NJIDo6PSBTRVFVRU5DRSB7CisJZHAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0CVswXSBEUC1BbmFseXNlZEluZm9Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzFdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVszXQlOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVs0XQlOVUxMCQlPUFRJT05BTCwKKwkuLi59IAorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBELUNTSSBpcyBzZW50IHRvIFZMUi9HTVNDLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorLS0JRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaWEgYW5kICBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSBwcmVzZW50IGluIAorLS0JdGhlIEQtQ1NJIHNlcXVlbmNlLgorLS0JSWYgRC1DU0kgaXMgc2VnbWVudGVkLCB0aGVuIHRoZSBmaXJzdCBzZWdtZW50IHNoYWxsIGNvbnRhaW4gZHAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0CistLQlhbmQgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcuIFN1YnNlcXVlbnQgc2VnbWVudHMgc2hhbGwgbm90IGNvbnRhaW4KKy0tCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nLCBidXQgbWF5IGNvbnRhaW4gZHAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0LgorCitEUC1BbmFseXNlZEluZm9Dcml0ZXJpYUxpc3QgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkRQLUFuYWx5c2VkSW5mb0NyaXRlcmlhKSBPRgorCQkJCURQLUFuYWx5c2VkSW5mb0NyaXRlcml1bQorCittYXhOdW1PZkRQLUFuYWx5c2VkSW5mb0NyaXRlcmlhIElOVEVHRVIgOjo9IDEwCisKK0RQLUFuYWx5c2VkSW5mb0NyaXRlcml1bSA6Oj0gU0VRVUVOQ0UgeworCWRpYWxsZWROdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdENhbGxIYW5kbGluZwlEZWZhdWx0Q2FsbEhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTUy1DU0kgOjo9IFNFUVVFTkNFIHsKKwlzcy1DYW1lbERhdGEJU1MtQ2FtZWxEYXRhLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCW5vdGlmaWNhdGlvblRvQ1NFCVswXQlOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVsxXQlOVUxMCQlPUFRJT05BTAorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBTUy1DU0kgaXMgc2VudCB0byBWTFIuCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCit9CisKK1NTLUNhbWVsRGF0YSAgOjo9IFNFUVVFTkNFIHsKKwlzcy1FdmVudExpc3QJU1MtRXZlbnRMaXN0LAorCWdzbVNDRi1BZGRyZXNzCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwgCisJLi4ufQorCitTUy1FdmVudExpc3QgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsU1NFdmVudHMpIE9GIFNTLUNvZGUKKwktLSBBY3Rpb25zIGZvciB0aGUgZm9sbG93aW5nIFNTLUNvZGUgdmFsdWVzIGFyZSBkZWZpbmVkIGluIENBTUVMIFBoYXNlIDM6CisJLS0gZWN0CQlTUy1Db2RlIDo6PSAnMDAxMTAwMDEnQgorCS0tIG11bHRpUFRZCVNTLUNvZGUgOjo9ICcwMTAxMDAwMSdCCisJLS0gY2QJCVNTLUNvZGUgOjo9ICcwMDEwMDEwMCdCCisJLS0gY2NicwkJU1MtQ29kZSA6Oj0gJzAxMDAwMTAwJ0IKKwktLSBhbGwgb3RoZXIgU1MgY29kZXMgc2hhbGwgYmUgaWdub3JlZAorCS0tIFdoZW4gU1MtQ1NJIGlzIHNlbnQgdG8gdGhlIFZMUiwgaXQgc2hhbGwgbm90IGNvbnRhaW4gYSBtYXJraW5nIGZvciBjY2JzLgorCS0tIElmIHRoZSBWTFIgcmVjZWl2ZXMgU1MtQ1NJIGNvbnRhaW5pbmcgYSBtYXJraW5nIGZvciBjY2JzLCB0aGUgVkxSIHNoYWxsIGRpc2NhcmQgdGhlCisJLS0gY2NicyBtYXJraW5nIGluIFNTLUNTSS4KKworbWF4TnVtT2ZDYW1lbFNTRXZlbnRzIElOVEVHRVIgOjo9IDEwCisKK08tQ1NJIDo6PSBTRVFVRU5DRSB7CisJby1CY3NtQ2FtZWxURFBEYXRhTGlzdAlPLUJjc21DYW1lbFREUERhdGFMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVswXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMV0JTlVMTAkJT1BUSU9OQUwsCisJY3NpQWN0aXZlCQlbMl0JTlVMTAkJT1BUSU9OQUx9CistLQlub3RpZmljYXRpb250b0NTRSBhbmQgY3NpQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gTy1DU0kgaXMgc2VudCB0byBWTFIvR01TQy4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKy0tCU8tQ1NJIHNoYWxsIG5vdCBiZSBzZWdtZW50ZWQuCisKK08tQmNzbUNhbWVsVERQRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCU8tQmNzbUNhbWVsVERQRGF0YQorCS0tIE8tQmNzbUNhbWVsVERQRGF0YUxpc3Qgc2hhbGwgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZgorCS0tIE8tQmNzbUNhbWVsVERQRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBvLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQuCisJLS0gRm9yIENBTUVMIFBoYXNlIDIsIHRoaXMgbWVhbnMgdGhhdCBvbmx5IG9uZSBpbnN0YW5jZSBvZiBPLUJjc21DYW1lbFREUERhdGEgaXMgYWxsb3dlZAorCS0tIHdpdGggby1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IGJlaW5nIGVxdWFsIHRvIERQMi4KKworbWF4TnVtT2ZDYW1lbFREUERhdGEgIElOVEVHRVIgOjo9IDEwCisKK08tQmNzbUNhbWVsVERQRGF0YSA6Oj0gU0VRVUVOQ0UgeworCW8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlPLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJc2VydmljZUtleQlTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdENhbGxIYW5kbGluZwlbMV0gRGVmYXVsdENhbGxIYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4KKwl9CisKK1NlcnZpY2VLZXkgOjo9IElOVEVHRVIgKDAuLjIxNDc0ODM2NDcpCisKK08tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCA6Oj0gRU5VTUVSQVRFRCB7CisJY29sbGVjdGVkSW5mbyAoMiksCisJLi4uLAorCXJvdXRlU2VsZWN0RmFpbHVyZSAoNCkgfQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBGb3IgTy1CY3NtQ2FtZWxURFBEYXRhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55CisJLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCisJLS0gTy1CY3NtQ2FtZWxURFBEYXRhc2VxdWVuY2UuIAorCS0tIEZvciBPLUJjc21DYW1lbFREUC1Dcml0ZXJpYSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorCS0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlCisJLS0gTy1CY3NtQ2FtZWxURFAtQ3JpdGVyaWEgc2VxdWVuY2UuCisKK08tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlPLUJjc21DYW1lbFREUC1Dcml0ZXJpYSAKKworVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWEgCisKK08tQmNzbUNhbWVsVERQLUNyaXRlcmlhIDo6PSBTRVFVRU5DRSB7CisJby1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50CU8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwJCisJZGVzdGluYXRpb25OdW1iZXJDcml0ZXJpYSAJWzBdIERlc3RpbmF0aW9uTnVtYmVyQ3JpdGVyaWEJT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlQ3JpdGVyaWEJWzFdIEJhc2ljU2VydmljZUNyaXRlcmlhCU9QVElPTkFMLAorCWNhbGxUeXBlQ3JpdGVyaWEJWzJdIENhbGxUeXBlQ3JpdGVyaWEJT1BUSU9OQUwsCisJLi4uLAorCW8tQ2F1c2VWYWx1ZUNyaXRlcmlhCVszXSBPLUNhdXNlVmFsdWVDcml0ZXJpYQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCB9CisKK1QtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWEgOjo9IFNFUVVFTkNFIHsKKwl0LUJDU00tVHJpZ2dlckRldGVjdGlvblBvaW50CVQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwJCisJYmFzaWNTZXJ2aWNlQ3JpdGVyaWEJWzBdIEJhc2ljU2VydmljZUNyaXRlcmlhCU9QVElPTkFMLAorCXQtQ2F1c2VWYWx1ZUNyaXRlcmlhCVsxXSBULUNhdXNlVmFsdWVDcml0ZXJpYQlPUFRJT05BTCwKKwkuLi4gfQorCitEZXN0aW5hdGlvbk51bWJlckNyaXRlcmlhICA6Oj0gU0VRVUVOQ0UgeworCW1hdGNoVHlwZQkJWzBdIE1hdGNoVHlwZSwKKwlkZXN0aW5hdGlvbk51bWJlckxpc3QgCVsxXSBEZXN0aW5hdGlvbk51bWJlckxpc3QJT1BUSU9OQUwsCisJZGVzdGluYXRpb25OdW1iZXJMZW5ndGhMaXN0CVsyXSBEZXN0aW5hdGlvbk51bWJlckxlbmd0aExpc3QJT1BUSU9OQUwsCisJLS0gb25lIG9yIGJvdGggb2YgZGVzdGluYXRpb25OdW1iZXJMaXN0IGFuZCBkZXN0aW5hdGlvbk51bWJlckxlbmd0aExpc3QgCisJLS0gc2hhbGwgYmUgcHJlc2VudAorCS4uLn0KKworRGVzdGluYXRpb25OdW1iZXJMaXN0ICA6Oj0gU0VRVUVOQ0UgU0laRQkoMS4ubWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVycykgT0YKKwkJCQlJU0ROLUFkZHJlc3NTdHJpbmcKKwktLSBUaGUgcmVjZWl2aW5nIGVudGl0eSBzaGFsbCBub3QgY2hlY2sgdGhlIGZvcm1hdCBvZiBhIG51bWJlciBpbgorCS0tIHRoZSBkaWFsbGVkIG51bWJlciBsaXN0CisKK0Rlc3RpbmF0aW9uTnVtYmVyTGVuZ3RoTGlzdCAgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlckxlbmd0aHMpIE9GIAorCQkJCQlJTlRFR0VSKDEuLm1heE51bU9mSVNETi1BZGRyZXNzRGlnaXRzKQorCitCYXNpY1NlcnZpY2VDcml0ZXJpYSAgIDo6PSBTRVFVRU5DRSBTSVpFKDEuLm1heE51bU9mQ2FtZWxCYXNpY1NlcnZpY2VDcml0ZXJpYSkgT0YKKwlFeHQtQmFzaWNTZXJ2aWNlQ29kZQorCittYXhOdW1PZklTRE4tQWRkcmVzc0RpZ2l0cyAgSU5URUdFUiA6Oj0gMTUKKworbWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVycyAgSU5URUdFUiA6Oj0gMTAKKworbWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVyTGVuZ3RocyAgSU5URUdFUiA6Oj0gMworCittYXhOdW1PZkNhbWVsQmFzaWNTZXJ2aWNlQ3JpdGVyaWEgIElOVEVHRVIgOjo9IDUKKworQ2FsbFR5cGVDcml0ZXJpYSAgICAgICA6Oj0gRU5VTUVSQVRFRCB7CisJZm9yd2FyZGVkIAkoMCksCisJbm90Rm9yd2FyZGVkCSgxKX0KKworTWF0Y2hUeXBlICAgICAgIDo6PSBFTlVNRVJBVEVEIHsKKwlpbmhpYml0aW5nIAkoMCksCisJZW5hYmxpbmcJCSgxKX0KKworTy1DYXVzZVZhbHVlQ3JpdGVyaWEgICA6Oj0gU0VRVUVOQ0UgU0laRSgxLi5tYXhOdW1PZkNBTUVMLU8tQ2F1c2VWYWx1ZUNyaXRlcmlhKSBPRgorCUNhdXNlVmFsdWUKKworVC1DYXVzZVZhbHVlQ3JpdGVyaWEgICA6Oj0gU0VRVUVOQ0UgU0laRSgxLi5tYXhOdW1PZkNBTUVMLVQtQ2F1c2VWYWx1ZUNyaXRlcmlhKSBPRgorCUNhdXNlVmFsdWUKKworbWF4TnVtT2ZDQU1FTC1PLUNhdXNlVmFsdWVDcml0ZXJpYSAgSU5URUdFUiA6Oj0gNQorCittYXhOdW1PZkNBTUVMLVQtQ2F1c2VWYWx1ZUNyaXRlcmlhICBJTlRFR0VSIDo6PSA1CisKK0NhdXNlVmFsdWUgOjo9IE9DVEVUIFNUUklORyAoU0laRSgxKSkKKy0tIFR5cGUgZXh0cmFjdGVkIGZyb20gQ2F1c2UgcGFyYW1ldGVyIGluIElUVS1UIFJlY29tbWVuZGF0aW9uIFEuNzYzLgorLS0gRm9yIHRoZSB1c2Ugb2YgY2F1c2UgdmFsdWUgcmVmZXIgdG8gSVRVLVQgUmVjb21tZW5kYXRpb24gUS44NTAuCisKK0RlZmF1bHRDYWxsSGFuZGxpbmcgOjo9IEVOVU1FUkFURUQgeworCWNvbnRpbnVlQ2FsbCAoMCkgLAorCXJlbGVhc2VDYWxsICgxKSAsCisJLi4ufQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSByZWNlcHRpb24gb2YgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAiY29udGludWVDYWxsIgorCS0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgInJlbGVhc2VDYWxsIgorCitDYW1lbENhcGFiaWxpdHlIYW5kbGluZyA6Oj0gSU5URUdFUigxLi4xNikgCisJLS0gdmFsdWUgMSA9IENBTUVMIHBoYXNlIDEsCisJLS0gdmFsdWUgMiA9IENBTUVMIHBoYXNlIDIsCisJLS0gdmFsdWUgMyA9IENBTUVMIFBoYXNlIDMsCisJLS0gdmFsdWUgNCA9IENBTUVMIHBoYXNlIDQ6CisJLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyBncmVhdGVyIHRoYW4gNCBzaGFsbCBiZSB0cmVhdGVkIGFzIENBTUVMIHBoYXNlIDQuCisKK1N1cHBvcnRlZENhbWVsUGhhc2VzIDo6PSBCSVQgU1RSSU5HIHsKKwlwaGFzZTEgKDApLAorCXBoYXNlMiAoMSksCisJcGhhc2UzICgyKSwKKwlwaGFzZTQgKDMpfSAoU0laRSAoMS4uMTYpKSAKKy0tIEEgbm9kZSBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBDQU1FTCBQaGFzZXMgaXQgc3VwcG9ydHMuCistLSBPdGhlciB2YWx1ZXMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitPZmZlcmVkQ2FtZWw0Q1NJcyA6Oj0gQklUIFNUUklORyB7IAkKKwlvLWNzaQkJKDApLAorCWQtY3NpCQkoMSksCisJdnQtY3NpCQkoMiksCisJdC1jc2kJCSgzKSwKKwltdC1zbXMtY3NpCSg0KSwKKwltZy1jc2kJCSg1KSwKKwlwc2ktZW5oYW5jZW1lbnRzCSg2KSAKK30gKFNJWkUgKDcuLjE2KSkKKy0tIEEgbm9kZSBzdXBwb3J0aW5nIENhbWVsIHBoYXNlIDQgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgQ2FtZWw0IENTSXMgCistLSBpdCBvZmZlcnMuCistLSBPdGhlciB2YWx1ZXMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitPZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzIDo6PSBCSVQgU1RSSU5HIHsgCQorCWluaXRpYXRlQ2FsbEF0dGVtcHQJKDApLAorCXNwbGl0TGVnCQkoMSksCisJbW92ZUxlZwkJKDIpLAorCWRpc2Nvbm5lY3RMZWcJKDMpLAorCWVudGl0eVJlbGVhc2VkCSg0KSwKKwlkZmMtV2l0aEFyZ3VtZW50CSg1KSwKKwlwbGF5VG9uZQkJKDYpLAorCWR0bWYtTWlkQ2FsbAkoNyksCisJY2hhcmdpbmdJbmRpY2F0b3IJKDgpLAorCWFsZXJ0aW5nRFAJKDkpLAorCWxvY2F0aW9uQXRBbGVydGluZwkoMTApLAorCWNoYW5nZU9mUG9zaXRpb25EUAkoMTEpLAorCW9yLUludGVyYWN0aW9ucwkoMTIpLAorCXdhcm5pbmdUb25lRW5oYW5jZW1lbnRzCSgxMyksCisJY2YtRW5oYW5jZW1lbnRzCSgxNCksCisJc3Vic2NyaWJlZEVuaGFuY2VkRGlhbGxlZFNlcnZpY2VzIAkoMTUpLAorCXNlcnZpbmdOZXR3b3JrRW5oYW5jZWREaWFsbGVkU2VydmljZXMgKDE2KSwKKwljcml0ZXJpYUZvckNoYW5nZU9mUG9zaXRpb25EUAkoMTcpLAorCXNlcnZpY2VDaGFuZ2VEUAkoMTgpLAorCWNvbGxlY3RJbmZvcm1hdGlvbgkoMTkpCit9IChTSVpFICgxNS4uNjQpKQorLS0gQSBub2RlIHN1cHBvcnRpbmcgQ2FtZWwgcGhhc2UgNCBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBDQU1FTDQgCistLSBmdW5jdGlvbmFsaXRpZXMgaXQgb2ZmZXJzLgorLS0gT3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworU01TLUNTSSA6Oj0gU0VRVUVOQ0UgeworCXNtcy1DQU1FTC1URFAtRGF0YUxpc3QJWzBdIFNNUy1DQU1FTC1URFAtRGF0YUxpc3QJT1BUSU9OQUwsCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzFdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVszXSBOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVs0XSBOVUxMCQlPUFRJT05BTCwKKwkuLi59CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudAorLS0Jd2hlbiBNTy1TTVMtQ1NJIG9yIE1ULVNNUy1DU0kgaXMgc2VudCB0byBWTFIgb3IgU0dTTi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKy0tCVNNUy1DQU1FTC1URFAtRGF0YSBhbmQgIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIHByZXNlbnQgaW4gCistLQl0aGUgU01TLUNTSSBzZXF1ZW5jZS4KKy0tCUlmIFNNUy1DU0kgaXMgc2VnbWVudGVkLCBzbXMtQ0FNRUwtVERQLURhdGFMaXN0IGFuZCBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSAKKy0tCXByZXNlbnQgaW4gdGhlIGZpcnN0IHNlZ21lbnQKKworU01TLUNBTUVMLVREUC1EYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJU01TLUNBTUVMLVREUC1EYXRhCistLQlTTVMtQ0FNRUwtVERQLURhdGFMaXN0IHNoYWxsIG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YKKy0tCVNNUy1DQU1FTC1URFAtRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBzbXMtVHJpZ2dlckRldGVjdGlvblBvaW50LgorCitTTVMtQ0FNRUwtVERQLURhdGEgOjo9IFNFUVVFTkNFIHsKKwlzbXMtVHJpZ2dlckRldGVjdGlvblBvaW50CVswXSBTTVMtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXNlcnZpY2VLZXkJWzFdIFNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKKwlkZWZhdWx0U01TLUhhbmRsaW5nCVszXSBEZWZhdWx0U01TLUhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLgorCX0KKworU01TLVRyaWdnZXJEZXRlY3Rpb25Qb2ludCA6Oj0gRU5VTUVSQVRFRCB7CisJc21zLUNvbGxlY3RlZEluZm8gKDEpLAorCS4uLiwKKwlzbXMtRGVsaXZlcnlSZXF1ZXN0ICgyKQorCX0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCUZvciBTTVMtQ0FNRUwtVERQLURhdGEgYW5kIE1ULXNtc0NBTUVMVERQLUNyaXRlcmlhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgCistLQlwYXJhbWV0ZXIgd2l0aCBhbnkgb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZQorLS0JdGhlIHdob2xlIHNlcXVlbmNlLgorLS0KKy0tCUlmIHRoaXMgcGFyYW1ldGVyIGlzIHJlY2VpdmVkIHdpdGggYW55IG90aGVyIHZhbHVlIHRoYW4gc21zLUNvbGxlY3RlZEluZm8KKy0tCWluIGFuIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZSBjb250YWluZWQgaW4gbW8tc21zLUNTSSwgdGhlbiB0aGUgcmVjZWl2ZXIgc2hhbGwKKy0tCWlnbm9yZSB0aGUgd2hvbGUgU01TLUNBTUVMLVREUC1EYXRhIHNlcXVlbmNlLgorLS0KKy0tCUlmIHRoaXMgcGFyYW1ldGVyIGlzIHJlY2VpdmVkIHdpdGggYW55IG90aGVyIHZhbHVlIHRoYW4gc21zLURlbGl2ZXJ5UmVxdWVzdAorLS0JaW4gYW4gU01TLUNBTUVMLVREUC1EYXRhIHNlcXVlbmNlIGNvbnRhaW5lZCBpbiBtdC1zbXMtQ1NJIHRoZW4gdGhlIHJlY2VpdmVyIHNoYWxsCistLQlpZ25vcmUgdGhlIHdob2xlIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZS4KKy0tCistLQlJZiB0aGlzIHBhcmFtZXRlciBpcyByZWNlaXZlZCB3aXRoIGFueSBvdGhlciB2YWx1ZSB0aGFuIHNtcy1EZWxpdmVyeVJlcXVlc3QKKy0tCWluIGFuIE1ULXNtc0NBTUVMVERQLUNyaXRlcmlhIHNlcXVlbmNlIHRoZW4gdGhlIHJlY2VpdmVyIHNoYWxsCistLQlpZ25vcmUgdGhlIHdob2xlIE1ULXNtc0NBTUVMVERQLUNyaXRlcmlhIHNlcXVlbmNlLgorCitEZWZhdWx0U01TLUhhbmRsaW5nIDo6PSBFTlVNRVJBVEVEIHsKKwljb250aW51ZVRyYW5zYWN0aW9uICgwKSAsCisJcmVsZWFzZVRyYW5zYWN0aW9uICgxKSAsCisJLi4ufQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JcmVjZXB0aW9uIG9mIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgImNvbnRpbnVlVHJhbnNhY3Rpb24iCistLQlyZWNlcHRpb24gb2YgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJyZWxlYXNlVHJhbnNhY3Rpb24iCisKK00tQ1NJIDo6PSBTRVFVRU5DRSB7CisJbW9iaWxpdHlUcmlnZ2VycwlNb2JpbGl0eVRyaWdnZXJzLAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMF0JSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVsyXSBOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVszXSBOVUxMCQlPUFRJT05BTCwKKwkuLi59CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIE0tQ1NJIGlzIHNlbnQgdG8gVkxSLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorCitNRy1DU0kgOjo9IFNFUVVFTkNFIHsKKwltb2JpbGl0eVRyaWdnZXJzCU1vYmlsaXR5VHJpZ2dlcnMsCisJc2VydmljZUtleQlTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVswXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzJdIE5VTEwJCU9QVElPTkFMLAorCWNzaS1BY3RpdmUJWzNdIE5VTEwJCU9QVElPTkFMLAorCS4uLn0KKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gTUctQ1NJIGlzIHNlbnQgdG8gU0dTTi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKworTW9iaWxpdHlUcmlnZ2VycyAgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTW9iaWxpdHlUcmlnZ2VycykgT0YKKwlNTS1Db2RlCisKK21heE51bU9mTW9iaWxpdHlUcmlnZ2VycyBJTlRFR0VSIDo6PSAxMAorCitNTS1Db2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorLS0JVGhpcyB0eXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBNb2JpbGl0eSBNYW5hZ2VtZW50IGV2ZW50LgorLS0JQWN0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBNTS1Db2RlIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBDQU1FTCBQaGFzZSA0OgorLS0KKy0tCUNTIGRvbWFpbiBNTSBldmVudHM6CistLQlMb2NhdGlvbi11cGRhdGUtaW4tc2FtZS1WTFIJTU0tQ29kZSA6Oj0gJzAwMDAwMDAwJ0IKKy0tCUxvY2F0aW9uLXVwZGF0ZS10by1vdGhlci1WTFIJTU0tQ29kZSA6Oj0gJzAwMDAwMDAxJ0IKKy0tCUlNU0ktQXR0YWNoCU1NLUNvZGUgOjo9ICcwMDAwMDAxMCdCCistLQlNUy1pbml0aWF0ZWQtSU1TSS1EZXRhY2gJTU0tQ29kZSA6Oj0gJzAwMDAwMDExJ0IKKy0tCU5ldHdvcmstaW5pdGlhdGVkLUlNU0ktRGV0YWNoCU1NLUNvZGUgOjo9ICcwMDAwMDEwMCdCCistLQorLS0JUFMgZG9tYWluIE1NIGV2ZW50czoKKy0tCVJvdXRlaW5nLUFyZWEtdXBkYXRlLWluLXNhbWUtU0dTTglNTS1Db2RlIDo6PSAnMTAwMDAwMDAnQgorLS0JUm91dGVpbmctQXJlYS11cGRhdGUtdG8tb3RoZXItU0dTTi11cGRhdGUtZnJvbS1uZXctU0dTTgorLS0JCQkJTU0tQ29kZSA6Oj0gJzEwMDAwMDAxJ0IKKy0tCVJvdXRlaW5nLUFyZWEtdXBkYXRlLXRvLW90aGVyLVNHU04tZGlzY29ubmVjdC1ieS1kZXRhY2gKKy0tCQkJCU1NLUNvZGUgOjo9ICcxMDAwMDAxMCdCCistLQlHUFJTLUF0dGFjaAlNTS1Db2RlIDo6PSAnMTAwMDAwMTEnQgorLS0JTVMtaW5pdGlhdGVkLUdQUlMtRGV0YWNoCU1NLUNvZGUgOjo9ICcxMDAwMDEwMCdCCistLQlOZXR3b3JrLWluaXRpYXRlZC1HUFJTLURldGFjaAlNTS1Db2RlIDo6PSAnMTAwMDAxMDEnQiAKKy0tCU5ldHdvcmstaW5pdGlhdGVkLXRyYW5zZmVyLXRvLU1TLW5vdC1yZWFjaGFibGUtZm9yLXBhZ2luZworLS0JCQkJTU0tQ29kZSA6Oj0gJzEwMDAwMTEwJ0IKKy0tCistLQlJZiB0aGUgTVNDIHJlY2VpdmVzIGFueSBvdGhlciBNTS1jb2RlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIGFib3ZlIGZvciB0aGUKKy0tCUNTIGRvbWFpbiwgdGhlbiB0aGUgTVNDIHNoYWxsIGlnbm9yZSB0aGF0IE1NLWNvZGUuCistLQlJZiB0aGUgU0dTTiByZWNlaXZlcyBhbnkgb3RoZXIgTU0tY29kZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSBmb3IgdGhlCistLQlQUyBkb21haW4sIHRoZW4gdGhlIFNHU04gc2hhbGwgaWdub3JlIHRoYXQgTU0tY29kZS4KKworVC1DU0kgOjo9IFNFUVVFTkNFIHsKKwl0LUJjc21DYW1lbFREUERhdGFMaXN0CVQtQmNzbUNhbWVsVERQRGF0YUxpc3QsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzBdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVsxXSBOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVsyXSBOVUxMCQlPUFRJT05BTH0KKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gVlQtQ1NJL1QtQ1NJIGlzIHNlbnQKKy0tCXRvIFZMUi9HTVNDLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorLS0JVC1DU0kgc2hhbGwgbm90IGJlIHNlZ21lbnRlZC4KKworVC1CY3NtQ2FtZWxURFBEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJVC1CY3NtQ2FtZWxURFBEYXRhCisJLS0tIFQtQmNzbUNhbWVsVERQRGF0YUxpc3Qgc2hhbGwgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZgorCS0tLSBULUJjc21DYW1lbFREUERhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3IgdC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LgorCS0tLSBGb3IgQ0FNRUwgUGhhc2UgMiwgdGhpcyBtZWFucyB0aGF0IG9ubHkgb25lIGluc3RhbmNlIG9mIFQtQmNzbUNhbWVsVERQRGF0YSBpcyBhbGxvd2VkCisJLS0tIHdpdGggdC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IGJlaW5nIGVxdWFsIHRvIERQMTIuIAorCS0tLSBGb3IgQ0FNRUwgUGhhc2UgMywgbW9yZSBURFCScyBhcmUgYWxsb3dlZC4KKworVC1CY3NtQ2FtZWxURFBEYXRhIDo6PSBTRVFVRU5DRSB7CisJdC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50CVQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzBdIElTRE4tQWRkcmVzc1N0cmluZywKKwlkZWZhdWx0Q2FsbEhhbmRsaW5nCVsxXSBEZWZhdWx0Q2FsbEhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IDo6PSBFTlVNRVJBVEVEIHsKKwl0ZXJtQXR0ZW1wdEF1dGhvcml6ZWQgKDEyKSwKKwkuLi4gLAorCXRCdXN5ICgxMyksCisJdE5vQW5zd2VyICgxNCl9CisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIEZvciBULUJjc21DYW1lbFREUERhdGEgc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkgb3RoZXIKKwktLSB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSwgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUKKwktLSBULUJjc21DYW1lbFREUERhdGEgc2VxdWVuY2UuCisKKy0tIGdwcnMgbG9jYXRpb24gaW5mb3JtYXRpb24gcmV0cmlldmFsIHR5cGVzCisKK1NlbmRSb3V0aW5nSW5mb0ZvckdwcnNBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJCVswXSBJTVNJLAorCWdnc24tQWRkcmVzcwkJWzFdIEdTTi1BZGRyZXNzCU9QVElPTkFMLCAKKwlnZ3NuLU51bWJlcgkJWzJdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTZW5kUm91dGluZ0luZm9Gb3JHcHJzUmVzIDo6PSBTRVFVRU5DRSB7CisJc2dzbi1BZGRyZXNzCQlbMF0gR1NOLUFkZHJlc3MsCisJZ2dzbi1BZGRyZXNzCQlbMV0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJbW9iaWxlTm90UmVhY2hhYmxlUmVhc29uCQlbMl0JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gZmFpbHVyZSByZXBvcnQgdHlwZXMKKworRmFpbHVyZVJlcG9ydEFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQkJWzBdIElNU0ksCisJZ2dzbi1OdW1iZXIJCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJLAorCWdnc24tQWRkcmVzcwkJWzJdIEdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZhaWx1cmVSZXBvcnRSZXMgOjo9IFNFUVVFTkNFIHsKKwlnZ3NuLUFkZHJlc3MJCVswXSBHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBncHJzIG5vdGlmaWNhdGlvbiB0eXBlcworCitOb3RlTXNQcmVzZW50Rm9yR3Byc0FyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQkJWzBdIElNU0ksCisJc2dzbi1BZGRyZXNzCQlbMV0gR1NOLUFkZHJlc3MsCisJZ2dzbi1BZGRyZXNzCQlbMl0gR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTm90ZU1zUHJlc2VudEZvckdwcnNSZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBmYXVsdCByZWNvdmVyeSB0eXBlcworCitSZXNldEFyZyA6Oj0gU0VRVUVOQ0UgeworCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWhsci1MaXN0CQlITFItTGlzdAkJT1BUSU9OQUwsCisJLi4ufQorCitSZXN0b3JlRGF0YUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCWxtc2kJCQlMTVNJCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXZsci1DYXBhYmlsaXR5CVs2XSBWTFItQ2FwYWJpbGl0eQlPUFRJT05BTCB9CisKK1Jlc3RvcmVEYXRhUmVzIDo6PSBTRVFVRU5DRSB7CisJaGxyLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJbXNOb3RSZWFjaGFibGUJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBWQlMvVkdDUyB0eXBlcworVkJTRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mVkJTR3JvdXBJZHMpIE9GCisJCQkJVm9pY2VCcm9hZGNhc3REYXRhCisKK1ZHQ1NEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZWR0NTR3JvdXBJZHMpIE9GCisJCQkJVm9pY2VHcm91cENhbGxEYXRhCisKK21heE51bU9mVkJTR3JvdXBJZHMgIElOVEVHRVIgOjo9IDUwCisKK21heE51bU9mVkdDU0dyb3VwSWRzICBJTlRFR0VSIDo6PSA1MAorCitWb2ljZUdyb3VwQ2FsbERhdGEgIDo6PSBTRVFVRU5DRSB7CisJZ3JvdXBJZAkJR3JvdXBJZCwgCisJLS0gZ3JvdXBJZCBzaGFsbCBiZSBmaWxsZWQgd2l0aCBzaXggVEJDRCBmaWxsZXJzICgxMTExKWlmIHRoZSBsb25nR3JvdXBJZCBpcyBwcmVzZW50ICAKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsU3Vic2NyaXB0aW9ucwlBZGRpdGlvbmFsU3Vic2NyaXB0aW9ucwlPUFRJT05BTCwKKwlhZGRpdGlvbmFsSW5mbwlbMF0gQWRkaXRpb25hbEluZm8JT1BUSU9OQUwsCisJbG9uZ0dyb3VwSWQJWzFdIExvbmctR3JvdXBJZAlPUFRJT05BTCB9CisKKwktLSBWb2ljZUdyb3VwQ2FsbERhdGEgY29udGFpbmluZyBhIGxvbmdHcm91cElkIHNoYWxsIG5vdCBiZSBzZW50IHRvIFZMUnMgdGhhdCBkaWQgbm90CisJLS0gaW5kaWNhdGUgc3VwcG9ydCBvZiBsb25nIEdyb3VwIElEcyB3aXRoaW4gdGhlIFVwZGF0ZSBMb2NhdGlvbiBvciBSZXN0b3JlIERhdGEgCisJLS0gcmVxdWVzdCBtZXNzYWdlCisKK0FkZGl0aW9uYWxJbmZvIDo6PSBCSVQgU1RSSU5HIChTSVpFICgxLi4xMzYpKQorLS0JIFJlZmVycyB0byBBZGRpdGlvbmFsIEluZm8gYXMgc3BlY2lmaWVkIGluIDNHUFAgVFMgNDMuMDY4IAorCitBZGRpdGlvbmFsU3Vic2NyaXB0aW9ucyA6Oj0gQklUIFNUUklORyB7CisJcHJpdmlsZWdlZFVwbGlua1JlcXVlc3QgKDApLAorCWVtZXJnZW5jeVVwbGlua1JlcXVlc3QgKDEpLAorCWVtZXJnZW5jeVJlc2V0ICgyKX0gKFNJWkUgKDMuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1ZvaWNlQnJvYWRjYXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWdyb3VwaWQJCUdyb3VwSWQsIAorCS0tIGdyb3VwSWQgc2hhbGwgYmUgZmlsbGVkIHdpdGggc2l4IFRCQ0QgZmlsbGVycyAoMTExMSlpZiB0aGUgbG9uZ0dyb3VwSWQgaXMgcHJlc2VudAorCWJyb2FkY2FzdEluaXRFbnRpdGxlbWVudAlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbG9uZ0dyb3VwSWQJWzBdIExvbmctR3JvdXBJZAlPUFRJT05BTCB9CisJCistLSBWb2ljZUJyb2FkY2FzdERhdGEgY29udGFpbmluZyBhIGxvbmdHcm91cElkIHNoYWxsIG5vdCBiZSBzZW50IHRvIFZMUnMgdGhhdCBkaWQgbm90CistLSBpbmRpY2F0ZSBzdXBwb3J0IG9mIGxvbmcgR3JvdXAgSURzIHdpdGhpbiB0aGUgVXBkYXRlIExvY2F0aW9uIG9yIFJlc3RvcmUgRGF0YSAKKwktLSByZXF1ZXN0IG1lc3NhZ2UKKworR3JvdXBJZCAgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICgzKSkKKwktLSBXaGVuIEdyb3VwLUlkIGlzIGxlc3MgdGhhbiBzaXggY2hhcmFjdGVycyBpbiBsZW5ndGgsIHRoZSBUQkNEIGZpbGxlciAoMTExMSkKKwktLSBpcyB1c2VkIHRvIGZpbGwgdW51c2VkIGhhbGYgb2N0ZXRzLgorCS0tIFJlZmVycyB0byB0aGUgR3JvdXAgSWRlbnRpZmljYXRpb24gYXMgc3BlY2lmaWVkIGluIDNHUFAgVFMgMjMuMDAzIAorCS0tIGFuZCAzR1BQIFRTIDQzLjA2OC8gNDMuMDY5CisKK0xvbmctR3JvdXBJZCAgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICg0KSkKKwktLSBXaGVuIExvbmctR3JvdXAtSWQgaXMgbGVzcyB0aGFuIGVpZ2h0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLCB0aGUgVEJDRCBmaWxsZXIgKDExMTEpCisJLS0gaXMgdXNlZCB0byBmaWxsIHVudXNlZCBoYWxmIG9jdGV0cy4KKwktLSBSZWZlcnMgdG8gdGhlIEdyb3VwIElkZW50aWZpY2F0aW9uIGFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDIzLjAwMyAKKwktLSBhbmQgM0dQUCBUUyA0My4wNjgvIDQzLjA2OQorCisKKy0tIHByb3ZpZGUgc3Vic2NyaWJlciBpbmZvIHR5cGVzCisKK1Byb3ZpZGVTdWJzY3JpYmVySW5mb0FyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCVswXSBJTVNJLAorCWxtc2kJCVsxXSBMTVNJCU9QVElPTkFMLAorCXJlcXVlc3RlZEluZm8JWzJdIFJlcXVlc3RlZEluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWNhbGxQcmlvcml0eQlbNF0JRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwKKwl9CisKK1Byb3ZpZGVTdWJzY3JpYmVySW5mb1JlcyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJbmZvCVN1YnNjcmliZXJJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTdWJzY3JpYmVySW5mbyA6Oj0gU0VRVUVOQ0UgeworCWxvY2F0aW9uSW5mb3JtYXRpb24JWzBdIExvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJc3Vic2NyaWJlclN0YXRlCVsxXSBTdWJzY3JpYmVyU3RhdGUJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlsb2NhdGlvbkluZm9ybWF0aW9uR1BSUwlbM10gTG9jYXRpb25JbmZvcm1hdGlvbkdQUlMJT1BUSU9OQUwsCisJcHMtU3Vic2NyaWJlclN0YXRlCVs0XSBQUy1TdWJzY3JpYmVyU3RhdGUJT1BUSU9OQUwsCisJaW1laQkJCVs1XSBJTUVJCQlPUFRJT05BTCwKKwltcy1DbGFzc21hcmsyCVs2XSBNUy1DbGFzc21hcmsyCU9QVElPTkFMLAorCWdwcnMtTVMtQ2xhc3MJWzddIEdQUlNNU0NsYXNzCU9QVElPTkFMLAorCW1ucEluZm9SZXMJWzhdIE1OUEluZm9SZXMJT1BUSU9OQUwgfQorCistLQlJZiB0aGUgSExSIHJlY2VpdmVzIGxvY2F0aW9uSW5mb3JtYXRpb24sIHN1YnNjcmliZXJTdGF0ZSBvciBtcy1DbGFzc21hcmsyIGZyb20gYW4gU0dTTgorLS0JaXQgc2hhbGwgZGlzY2FyZCB0aGVtLgorLS0JSWYgdGhlIEhMUiByZWNlaXZlcyBsb2NhdGlvbkluZm9ybWF0aW9uR1BSUywgcHMtU3Vic2NyaWJlclN0YXRlIG9yIGdwcnMtTVMtQ2xhc3MgZnJvbQorLS0JYSBWTFIgaXQgc2hhbGwgZGlzY2FyZCB0aGVtLgorLS0JSWYgdGhlIEhMUiByZWNlaXZlcyBwYXJhbWV0ZXJzIHdoaWNoIGl0IGhhcyBub3QgcmVxdWVzdGVkLCBpdCBzaGFsbCBkaXNjYXJkIHRoZW0uCisKK01OUEluZm9SZXMgOjo9IFNFUVVFTkNFIHsKKwlyb3V0ZWluZ051bWJlcglbMF0gUm91dGVpbmdOdW1iZXIgCU9QVElPTkFMLAorCWltc2kJCQlbMV0gSU1TSQkJT1BUSU9OQUwsCisJbXNpc2RuCQlbMl0gSVNETi1BZGRyZXNzU3RyaW5nIAlPUFRJT05BTCwKKwludW1iZXJQb3J0YWJpbGl0eVN0YXR1cwlbM10gTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKy0tCVRoZSBJTVNJIHBhcmFtZXRlciBjb250YWlucyBhIGdlbmVyaWMgSU1TSSwgaS5lLiBpdCBpcyBub3QgdGllZCBuZWNlc3NhcmlseSB0byB0aGUgCistLQlTdWJzY3JpYmVyLiBNQ0MgYW5kIE1OQyB2YWx1ZXMgaW4gdGhpcyBJTVNJIHNoYWxsIHBvaW50IHRvIHRoZSBTdWJzY3JpcHRpb24gTmV0d29yayBvZiAKKy0tCXRoZSBTdWJzY3JpYmVyLiBTZWUgM0dQUCBUUyAyMy4wNjYgWzEwOF0uCisKK1JvdXRlaW5nTnVtYmVyIDo6PSBUQkNELVNUUklORyAoU0laRSAoMS4uNSkpCisKKworTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworCW5vdEtub3duVG9CZVBvcnRlZAkoMCksCisJb3duTnVtYmVyUG9ydGVkT3V0CSgxKSwKKwlmb3JlaWduTnVtYmVyUG9ydGVkVG9Gb3JlaWduTmV0d29yawkoMiksCisJLi4uLAorCW93bk51bWJlck5vdFBvcnRlZE91dAkoNCksCisJZm9yZWlnbk51bWJlclBvcnRlZEluCSg1KQorCX0KKwktLQlleGNlcHRpb24gaGFuZGxpbmc6IAorCS0tICByZWNlcHRpb24gb2Ygb3RoZXIgdmFsdWVzIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIAorCS0tICB3aG9sZSBOdW1iZXJQb3J0YWJpbGl0eVN0YXR1czsKKwktLSAgb3duTnVtYmVyTm90UG9ydGVkT3V0IG9yIGZvcmVpZ25OdW1iZXJQb3J0ZWRJbiBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBbnkgVGltZSAKKwktLSAgSW50ZXJyb2dhdGlvbiBtZXNzYWdlLgorCitNUy1DbGFzc21hcmsyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIFRoaXMgcGFyYW1ldGVyIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIE1TIENsYXNzbWFyayAyIElFIGRlZmluZWQgaW4gCisJLS0gM0dQUCBUUyAyNC4wMDggWzM1XS4KKworR1BSU01TQ2xhc3MgOjo9IFNFUVVFTkNFIHsKKwltU05ldHdvcmtDYXBhYmlsaXR5CVswXSBNU05ldHdvcmtDYXBhYmlsaXR5LAorCW1TUmFkaW9BY2Nlc3NDYXBhYmlsaXR5CVsxXSBNU1JhZGlvQWNjZXNzQ2FwYWJpbGl0eQlPUFRJT05BTAorCX0KKworTVNOZXR3b3JrQ2FwYWJpbGl0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi44KSkKKwktLSBUaGlzIHBhcmFtZXRlciBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBNUyBOZXR3b3JrIENhcGFiaWxpdHkgSUUgZGVmaW5lZCBpbiAKKwktLSAzR1BQIFRTIDI0LjAwOCBbMzVdLgorCQorTVNSYWRpb0FjY2Vzc0NhcGFiaWxpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNTApKQorCS0tIFRoaXMgcGFyYW1ldGVyIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIE1TIFJhZGlvIEFjY2VzcyBDYXBhYmlsaXR5IElFIGRlZmluZWQgaW4KKwktLSAzR1BQIFRTIDI0LjAwOCBbMzVdLgorCitSZXF1ZXN0ZWRJbmZvIDo6PSBTRVFVRU5DRSB7CisJbG9jYXRpb25JbmZvcm1hdGlvbglbMF0gTlVMTAkJT1BUSU9OQUwsCisJc3Vic2NyaWJlclN0YXRlCVsxXSBOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sIAorCWN1cnJlbnRMb2NhdGlvbglbM10gTlVMTAkJT1BUSU9OQUwsCisJcmVxdWVzdGVkRG9tYWluCVs0XSBEb21haW5UeXBlCU9QVElPTkFMLAorCWltZWkJCQlbNl0gTlVMTAkJT1BUSU9OQUwsCisJbXMtY2xhc3NtYXJrCVs1XSBOVUxMCQlPUFRJT05BTCwKKwltbnBSZXF1ZXN0ZWRJbmZvCVs3XSBOVUxMIAkJT1BUSU9OQUwgfQorCistLQljdXJyZW50TG9jYXRpb24gc2hhbGwgYmUgYWJzZW50IGlmIGxvY2F0aW9uSW5mb3JtYXRpb24gaXMgYWJzZW50CisKK0RvbWFpblR5cGUgOjo9ICBFTlVNRVJBVEVEIHsKKwljcy1Eb21haW4JCSgwKSwKKwlwcy1Eb21haW4JCSgxKSwKKwkuLi59CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSByZWNlcHRpb24gb2YgdmFsdWVzID4gMSBzaGFsbCBiZSBtYXBwZWQgdG8gJ2NzLURvbWFpbicKKworTG9jYXRpb25JbmZvcm1hdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJZ2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JWzBdIEdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCU9QVElPTkFMLAorCXZsci1udW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlsb2NhdGlvbk51bWJlcglbMl0gTG9jYXRpb25OdW1iZXIJT1BUSU9OQUwsCisJY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkJWzNdIENlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJc2VsZWN0ZWRMU0EtSWQJWzVdIExTQUlkZW50aXR5CU9QVElPTkFMLAorCW1zYy1OdW1iZXIJWzZdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlnZW9kZXRpY0luZm9ybWF0aW9uCVs3XSBHZW9kZXRpY0luZm9ybWF0aW9uCU9QVElPTkFMLCAKKwljdXJyZW50TG9jYXRpb25SZXRyaWV2ZWQJWzhdIE5VTEwJCU9QVElPTkFMLAorCXNhaS1QcmVzZW50CVs5XSBOVUxMCQlPUFRJT05BTCB9CistLSBzYWktUHJlc2VudCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgcGFyYW1ldGVyIGNvbnRhaW5zCistLSBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KKy0tIGN1cnJlbnRMb2NhdGlvblJldHJpZXZlZCBzaGFsbCBiZSBwcmVzZW50IAorLS0gaWYgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdlcmUgcmV0cmlldmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bGwgcGFnaW5nLgorCitMb2NhdGlvbkluZm9ybWF0aW9uR1BSUyA6Oj0gU0VRVUVOQ0UgeworCWNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCVswXSBDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSBPUFRJT05BTCwKKwlyb3V0ZWluZ0FyZWFJZGVudGl0eQlbMV0gUkFJZGVudGl0eQlPUFRJT05BTCwKKwlnZW9ncmFwaGljYWxJbmZvcm1hdGlvbglbMl0gR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJc2dzbi1OdW1iZXIJWzNdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlzZWxlY3RlZExTQUlkZW50aXR5CVs0XSBMU0FJZGVudGl0eQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJc2FpLVByZXNlbnQJWzZdIE5VTEwJCU9QVElPTkFMLAorCWdlb2RldGljSW5mb3JtYXRpb24JWzddIEdlb2RldGljSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJY3VycmVudExvY2F0aW9uUmV0cmlldmVkCVs4XSBOVUxMCQlPUFRJT05BTCwKKwlhZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JWzldIEFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCB9CistLSBzYWktUHJlc2VudCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgcGFyYW1ldGVyIGNvbnRhaW5zCistLSBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KKy0tIGN1cnJlbnRMb2NhdGlvblJldHJpZXZlZCBzaGFsbCBiZSBwcmVzZW50IGlmIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorLS0gd2FzIHJldHJpZXZlZCBhZnRlciBzdWNjZXNzZnVsIHBhZ2luZy4KKworUkFJZGVudGl0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg2KSkKKy0tIFJvdXRpbmcgQXJlYSBJZGVudGl0eSBpcyBjb2RlZCBpbiBhY2NvcmRhbmNlIHdpdGggM0dQUCBUUyAyOS4wNjAgWzEwNV0uCistLSBJdCBzaGFsbCBjb250YWluIHRoZSB2YWx1ZSBwYXJ0IGRlZmluZWQgaW4gM0dQUCBUUyAyOS4wNjAgb25seS4gSS5lLiB0aGUgM0dQUCBUUyAyOS4wNjAKKy0tIHR5cGUgaWRlbnRpZmllciBvY3RldCBzaGFsbCBub3QgYmUgaW5jbHVkZWQuCisKKworR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoOCkpCistLQlSZWZlcnMgdG8gZ2VvZ3JhcGhpY2FsIEluZm9ybWF0aW9uIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuCistLQlPbmx5IHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKy0tCWFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDIzLjAzMiBpcyBhbGxvd2VkIHRvIGJlIHVzZWQKKy0tCVRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDMyIGlzIGFzIGZvbGxvd3M6CistLQkJVHlwZSBvZiBzaGFwZSAoZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlKQkxIG9jdGV0CistLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCistLQkJVW5jZXJ0YWludHkgY29kZQkJCQkxIG9jdGV0CisKK0dlb2RldGljSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTApKQorLS0JUmVmZXJzIHRvIENhbGxpbmcgR2VvZGV0aWMgTG9jYXRpb24gZGVmaW5lZCBpbiBRLjc2MyAoMTk5OSkuCistLQlPbmx5IHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKy0tCWFzIHNwZWNpZmllZCBpbiBRLjc2MyAoMTk5OSkgaXMgYWxsb3dlZCB0byBiZSB1c2VkCistLQlUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0byBRLjc2MyAoMTk5OSkgaXMgYXMgZm9sbG93czoKKy0tCQlTY3JlZW5pbmcgYW5kIHByZXNlbnRhdGlvbiBpbmRpY2F0b3JzCQkxIG9jdGV0CistLQkJVHlwZSBvZiBzaGFwZSAoZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlKQkxIG9jdGV0CistLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCistLQkJVW5jZXJ0YWludHkgY29kZQkJCQkxIG9jdGV0CistLQkJQ29uZmlkZW5jZQkJCQkxIG9jdGV0CisKK0xvY2F0aW9uTnVtYmVyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjEwKSkKKwktLSB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gSVRVLVQgUmVjIFEuNzYzCisKK1N1YnNjcmliZXJTdGF0ZSA6Oj0gQ0hPSUNFIHsKKwlhc3N1bWVkSWRsZQlbMF0gTlVMTCwKKwljYW1lbEJ1c3kJCVsxXSBOVUxMLAorCW5ldERldE5vdFJlYWNoYWJsZQlOb3RSZWFjaGFibGVSZWFzb24sCisJbm90UHJvdmlkZWRGcm9tVkxSCVsyXSBOVUxMfQorCitQUy1TdWJzY3JpYmVyU3RhdGUgOjo9IENIT0lDRSB7CisJbm90UHJvdmlkZWRGcm9tU0dTTglbMF0gTlVMTCwKKwlwcy1EZXRhY2hlZAlbMV0gTlVMTCwKKwlwcy1BdHRhY2hlZE5vdFJlYWNoYWJsZUZvclBhZ2luZwlbMl0gTlVMTCwKKwlwcy1BdHRhY2hlZFJlYWNoYWJsZUZvclBhZ2luZwlbM10gTlVMTCwKKwlwcy1QRFAtQWN0aXZlTm90UmVhY2hhYmxlRm9yUGFnaW5nCVs0XSBQRFAtQ29udGV4dEluZm9MaXN0LAorCXBzLVBEUC1BY3RpdmVSZWFjaGFibGVGb3JQYWdpbmcJWzVdIFBEUC1Db250ZXh0SW5mb0xpc3QsCisJbmV0RGV0Tm90UmVhY2hhYmxlCU5vdFJlYWNoYWJsZVJlYXNvbiB9CisKK1BEUC1Db250ZXh0SW5mb0xpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKSBPRgorCQkJCVBEUC1Db250ZXh0SW5mbworCitQRFAtQ29udGV4dEluZm8gOjo9IFNFUVVFTkNFIHsKKwlwZHAtQ29udGV4dElkZW50aWZpZXIJWzBdIENvbnRleHRJZCwKKwlwZHAtQ29udGV4dEFjdGl2ZQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJcGRwLVR5cGUJCVsyXSBQRFAtVHlwZSwKKwlwZHAtQWRkcmVzcwlbM10gUERQLUFkZHJlc3MJT1BUSU9OQUwsCisJYXBuLVN1YnNjcmliZWQJWzRdIEFQTgkJT1BUSU9OQUwsCisJYXBuLUluVXNlCQlbNV0gQVBOCQlPUFRJT05BTCwKKwluc2FwaQkJWzZdIE5TQVBJCQlPUFRJT05BTCwKKwl0cmFuc2FjdGlvbklkCVs3XSBUcmFuc2FjdGlvbklkCU9QVElPTkFMLAorCXRlaWQtRm9yR25BbmRHcAlbOF0gVEVJRAkJT1BUSU9OQUwsCisJdGVpZC1Gb3JJdQlbOV0gVEVJRAkJT1BUSU9OQUwsCisJZ2dzbi1BZGRyZXNzCVsxMF0gR1NOLUFkZHJlc3MgCU9QVElPTkFMLAorCXFvcy1TdWJzY3JpYmVkCVsxMV0gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCXFvcy1SZXF1ZXN0ZWQJWzEyXSBFeHQtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJcW9zLU5lZ290aWF0ZWQJWzEzXSBFeHQtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJY2hhcmdpbmdJZAlbMTRdIEdQUlNDaGFyZ2luZ0lECU9QVElPTkFMLAorCWNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCVsxNV0gQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJT1BUSU9OQUwsCisJcm5jLUFkZHJlc3MJWzE2XSBHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzE3XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXFvczItU3Vic2NyaWJlZAlbMThdIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMi1TdWJzY3JpYmVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KKwlxb3MyLVJlcXVlc3RlZAlbMTldIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMi1SZXF1ZXN0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MtUmVxdWVzdGVkIGlzIHByZXNlbnQuCisJcW9zMi1OZWdvdGlhdGVkCVsyMF0gRXh0Mi1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwktLSBxb3MyLU5lZ290aWF0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MtTmVnb3RpYXRlZCBpcyBwcmVzZW50LgorCQlxb3MzLVN1YnNjcmliZWQJWzIxXSBFeHQzLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIHFvczMtU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvczItU3Vic2NyaWJlZCBpcyBwcmVzZW50LgorCXFvczMtUmVxdWVzdGVkCVsyMl0gRXh0My1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwktLSBxb3MzLVJlcXVlc3RlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvczItUmVxdWVzdGVkIGlzIHByZXNlbnQuCisJcW9zMy1OZWdvdGlhdGVkCVsyM10gRXh0My1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTAorCS0tIHFvczMtTmVnb3RpYXRlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvczItTmVnb3RpYXRlZCBpcyBwcmVzZW50LgorfQorCitOU0FQSSA6Oj0gSU5URUdFUiAoMC4uMTUpCistLQlUaGlzIHR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgTmV0d29yayBsYXllciBTZXJ2aWNlIEFjY2VzcyBQb2ludAorCitUcmFuc2FjdGlvbklkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjIpKQorLS0JVGhpcyB0eXBlIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIgd2hpY2ggaXMgdXNlZCBpbiB0aGUgCistLQlzZXNzaW9uIG1hbmFnZW1lbnQgbWVzc2FnZXMgb24gdGhlIGFjY2VzcyBpbnRlcmZhY2UuIFRoZSBlbmNvZGluZyBpcyBkZWZpbmVkIGluIAorLS0JM0dQUCBUUyAyNC4wMDgKKworVEVJRCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKy0tCVRoaXMgdHlwZSBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBUdW5uZWwgRW5kcG9pbnQgSWRlbnRpZmllciB3aGljaCBpcyB1c2VkIHRvIAorLS0JZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaWZmZXJlbnQgdHVubmVscyBiZXR3ZWVuIHRoZSBzYW1lIHBhaXIgb2YgZW50aXRpZXMgd2hpY2ggY29tbXVuaWNhdGUgCistLQl1c2luZyB0aGUgR1BSUyBUdW5uZWxsaW5nIFByb3RvY29sIFRoZSBlbmNvZGluZyBpcyBkZWZpbmVkIGluIDNHUFAgVFMgMjkuMDYwLgorCitHUFJTQ2hhcmdpbmdJRCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKy0tCVRoZSBDaGFyZ2luZyBJRCBpcyBhIHVuaXF1ZSBmb3VyIG9jdGV0IHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgR0dTTiB3aGVuIAorLS0JYSBQRFAgQ29udGV4dCBpcyBhY3RpdmF0ZWQuIEEgQ2hhcmdpbmcgSUQgaXMgZ2VuZXJhdGVkIGZvciBlYWNoIGFjdGl2YXRlZCBjb250ZXh0LgorLS0JVGhlIGVuY29kaW5nIGlzIGRlZmluZWQgaW4gM0dQUCBUUyAyOS4wNjAuCisKK05vdFJlYWNoYWJsZVJlYXNvbiA6Oj0gRU5VTUVSQVRFRCB7CisJbXNQdXJnZWQgKDApLAorCWltc2lEZXRhY2hlZCAoMSksCisJcmVzdHJpY3RlZEFyZWEgKDIpLAorCW5vdFJlZ2lzdGVyZWQgKDMpfQorCistLSBhbnkgdGltZSBpbnRlcnJvZ2F0aW9uIGluZm8gdHlwZXMKKworQW55VGltZUludGVycm9nYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySWRlbnRpdHkJWzBdIFN1YnNjcmliZXJJZGVudGl0eSwKKwlyZXF1ZXN0ZWRJbmZvCVsxXSBSZXF1ZXN0ZWRJbmZvLAorCWdzbVNDRi1BZGRyZXNzCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBbnlUaW1lSW50ZXJyb2dhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJbmZvCVN1YnNjcmliZXJJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBhbnkgdGltZSBpbmZvcm1hdGlvbiBoYW5kbGluZyB0eXBlcworCitBbnlUaW1lU3Vic2NyaXB0aW9uSW50ZXJyb2dhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJZGVudGl0eQlbMF0gU3Vic2NyaWJlcklkZW50aXR5LAorCXJlcXVlc3RlZFN1YnNjcmlwdGlvbkluZm8JWzFdIFJlcXVlc3RlZFN1YnNjcmlwdGlvbkluZm8sCisJZ3NtU0NGLUFkZHJlc3MJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlsb25nRlROLVN1cHBvcnRlZAlbNF0JTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorCitBbnlUaW1lU3Vic2NyaXB0aW9uSW50ZXJyb2dhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWNhbGxGb3J3YXJkaW5nRGF0YQlbMV0gQ2FsbEZvcndhcmRpbmdEYXRhCU9QVElPTkFMLAorCWNhbGxCYXJyaW5nRGF0YQlbMl0gQ2FsbEJhcnJpbmdEYXRhCU9QVElPTkFMLAorCW9kYi1JbmZvCQlbM10gT0RCLUluZm8JT1BUSU9OQUwsCisJY2FtZWwtU3Vic2NyaXB0aW9uSW5mbwlbNF0gQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRWTFItQ0FNRUwtUGhhc2VzCVs1XSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRTR1NOLUNBTUVMLVBoYXNlcwlbNl0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs3XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlvZmZlcmVkQ2FtZWw0Q1NJc0luVkxSCVs4XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKKwlvZmZlcmVkQ2FtZWw0Q1NJc0luU0dTTglbOV0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJbXNpc2RuLUJTLUxpc3QJWzEwXSBNU0lTRE4tQlMtTGlzdAlPUFRJT05BTCB9CisKK1JlcXVlc3RlZFN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlyZXF1ZXN0ZWRTUy1JbmZvCVsxXSBTUy1Gb3JCUy1Db2RlCU9QVElPTkFMLAorCW9kYgkJCVsyXSBOVUxMCQlPUFRJT05BTCwKKwlyZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCVszXSBSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCQlPUFRJT05BTCwKKwlzdXBwb3J0ZWRWTFItQ0FNRUwtUGhhc2VzCVs0XSBOVUxMCQlPUFRJT05BTCwKKwlzdXBwb3J0ZWRTR1NOLUNBTUVMLVBoYXNlcwlbNV0gTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCisJCQkJWzddIEFkZGl0aW9uYWxSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCisJCQkJCQkJT1BUSU9OQUwsCisJbXNpc2RuLUJTLUxpc3QJWzhdIE5VTEwJCU9QVElPTkFMIH0KKworTVNJU0ROLUJTLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTVNJU0ROKSBPRgorCQkJCU1TSVNETi1CUworCittYXhOdW1PZk1TSVNETiAgSU5URUdFUiA6Oj0gNTAKKworCitNU0lTRE4tQlMgOjo9IFNFUVVFTkNFIHsKKwltc2lzZG4JCQlJU0ROLUFkZHJlc3NTdHJpbmcsCQorCWJhc2ljU2VydmljZUxpc3QJWzBdCUJhc2ljU2VydmljZUxpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvIDo6PSBFTlVNRVJBVEVEIHsKKwlvLUNTSQkJKDApLAorCXQtQ1NJCQkoMSksCisJdnQtQ1NJCQkoMiksCisJdGlmLUNTSQkJKDMpLAorCWdwcnMtQ1NJCQkoNCksCisJbW8tc21zLUNTSQkoNSksCisJc3MtQ1NJCQkoNiksCisJbS1DU0kJCSg3KSwKKwlkLWNzaQkJKDgpfQorCitBZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyA6Oj0gRU5VTUVSQVRFRCB7CisJbXQtc21zLUNTSQkoMCksCisJbWctY3NpCQkoMSksCisJby1JTS1DU0kgCQkoMiksCisJZC1JTS1DU0kJCSgzKSwKKwl2dC1JTS1DU0kJIAkoNCksCisJLi4ufQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOiB1bmtub3duIHZhbHVlcyBzaGFsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIHJlY2VpdmVyLgorCitDYWxsRm9yd2FyZGluZ0RhdGEgOjo9IFNFUVVFTkNFIHsKKwlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJRXh0LUZvcndGZWF0dXJlTGlzdCwKKwlub3RpZmljYXRpb25Ub0NTRQlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDYWxsQmFycmluZ0RhdGEgOjo9IFNFUVVFTkNFIHsKKwljYWxsQmFycmluZ0ZlYXR1cmVMaXN0CUV4dC1DYWxsQmFyRmVhdHVyZUxpc3QsCisJcGFzc3dvcmQJCVBhc3N3b3JkCQlPUFRJT05BTCwKKwl3cm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCVdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitXcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyIDo6PSBJTlRFR0VSICgwLi40KQorCitPREItSW5mbyA6Oj0gU0VRVUVOQ0UgeworCW9kYi1EYXRhCQlPREItRGF0YSwKKwlub3RpZmljYXRpb25Ub0NTRQlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NBTUVMLVN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlvLUNTSQkJWzBdCU8tQ1NJCU9QVElPTkFMLAorCW8tQmNzbUNhbWVsVERQLUNyaXRlcmlhTGlzdAlbMV0JTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QJT1BUSU9OQUwsIAorCWQtQ1NJCQlbMl0JRC1DU0kJT1BUSU9OQUwsCisJdC1DU0kJCVszXQlULUNTSQlPUFRJT05BTCwKKwl0LUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlbNF0JVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJdnQtQ1NJCQlbNV0JVC1DU0kJT1BUSU9OQUwsCisJdnQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CVs2XQlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwl0aWYtQ1NJCQlbN10JTlVMTAkJT1BUSU9OQUwsCisJdGlmLUNTSS1Ob3RpZmljYXRpb25Ub0NTRQlbOF0JTlVMTAkJT1BUSU9OQUwsCisJZ3Bycy1DU0kJCVs5XQlHUFJTLUNTSQlPUFRJT05BTCwKKwltby1zbXMtQ1NJCVsxMF0JU01TLUNTSQlPUFRJT05BTCwKKwlzcy1DU0kJCVsxMV0JU1MtQ1NJCU9QVElPTkFMLAorCW0tQ1NJCQlbMTJdCU0tQ1NJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMTNdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJc3BlY2lmaWNDU0lEZWxldGVkTGlzdAlbMTRdCVNwZWNpZmljQ1NJLVdpdGhkcmF3CU9QVElPTkFMLAorCW10LXNtcy1DU0kJWzE1XQlTTVMtQ1NJCU9QVElPTkFMLAorCW10LXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlbMTZdCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwltZy1jc2kJCVsxN10JTUctQ1NJCU9QVElPTkFMLAorCW8tSU0tQ1NJCQlbMThdIE8tQ1NJCU9QVElPTkFMLAorCW8tSU0tQmNzbUNhbWVsVERQLUNyaXRlcmlhTGlzdAlbMTldIE8tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCWQtSU0tQ1NJCQlbMjBdIEQtQ1NJCU9QVElPTkFMLAorCXZ0LUlNLUNTSQkJWzIxXSBULUNTSQlPUFRJT05BTCwKKwl2dC1JTS1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJWzIyXQlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTAorCX0KKworQW55VGltZU1vZGlmaWNhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJZGVudGl0eQlbMF0JU3Vic2NyaWJlcklkZW50aXR5LAorCWdzbVNDRi1BZGRyZXNzCVsxXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DRi1JbmZvCVsyXQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNGLUluZm8gT1BUSU9OQUwsCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DQi1JbmZvCVszXQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNCLUluZm8gT1BUSU9OQUwsCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DU0kJWzRdCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ1NJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCWxvbmdGVE4tU3VwcG9ydGVkCVs2XQlOVUxMCQlPUFRJT05BTCwKKwkuLi4sCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1PREItZGF0YQlbN10JTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1PREItZGF0YSBPUFRJT05BTCwKKwltb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUlQLVNNLUdXLURhdGEJWzhdCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItSVAtU00tR1ctRGF0YSBPUFRJT05BTCB9CisKK0FueVRpbWVNb2RpZmljYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlzcy1JbmZvRm9yLUNTRQlbMF0JRXh0LVNTLUluZm9Gb3ItQ1NFCU9QVElPTkFMLAorCWNhbWVsLVN1YnNjcmlwdGlvbkluZm8JWzFdCUNBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCW9kYi1JbmZvCQlbM10JT0RCLUluZm8JT1BUSU9OQUwgfQorCitNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNGLUluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwliYXNpY1NlcnZpY2UJWzFdCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzJdCUV4dC1TUy1TdGF0dXMJT1BUSU9OQUwsCisJZm9yd2FyZGVkVG9OdW1iZXIJWzNdCUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGVkVG9TdWJhZGRyZXNzCVs0XQlJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbm9SZXBseUNvbmRpdGlvblRpbWUJWzVdCUV4dC1Ob1JlcENvbmRUaW1lCU9QVElPTkFMLAorCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVs2XQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzddCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0ItSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWJhc2ljU2VydmljZQlbMV0JRXh0LUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbMl0JRXh0LVNTLVN0YXR1cwlPUFRJT05BTCwKKwlwYXNzd29yZAkJWzNdCVBhc3N3b3JkCU9QVElPTkFMLAorCXdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJWzRdCVdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJT1BUSU9OQUwsCisJbW9kaWZ5Tm90aWZpY2F0aW9uVG9DU0UJWzVdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1PREItZGF0YSA6Oj0gU0VRVUVOQ0UgeworCW9kYi1kYXRhCQlbMF0JT0RCLURhdGEJT1BUSU9OQUwsCisJbW9kaWZ5Tm90aWZpY2F0aW9uVG9DU0UJWzFdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DU0kgOjo9IFNFUVVFTkNFIHsKKwlyZXF1ZXN0ZWRDYW1lbC1TdWJzY3JpcHRpb25JbmZvCVswXQlSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvLAorCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVsxXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwltb2RpZnlDU0ktU3RhdGUJWzJdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbworCQkJCVs0XSBBZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbworCQkJCQkJCU9QVElPTkFMIH0KKy0tIHJlcXVlc3RlZENhbWVsLVN1YnNjcmlwdGlvbkluZm8gc2hhbGwgYmUgZGlzY2FyZGVkIGlmCistLSBhZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyBpcyByZWNlaXZlZAorCitNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUlQLVNNLUdXLURhdGEgOjo9IFNFUVVFTkNFIHsKKwltb2RpZnlSZWdpc3RyYXRpb25TdGF0dXMJWzBdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24gOjo9IEVOVU1FUkFURUQgeworCWRlYWN0aXZhdGUJKDApLAorCWFjdGl2YXRlCQkoMSl9CisKKy0tIHN1YnNjcmliZXIgZGF0YSBtb2RpZmljYXRpb24gbm90aWZpY2F0aW9uIHR5cGVzCisKK05vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJbXNpc2RuCQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZm9yd2FyZGluZ0luZm9Gb3ItQ1NFCVswXSBFeHQtRm9yd2FyZGluZ0luZm9Gb3ItQ1NFCU9QVElPTkFMLAorCWNhbGxCYXJyaW5nSW5mb0Zvci1DU0UJWzFdIEV4dC1DYWxsQmFycmluZ0luZm9Gb3ItQ1NFCU9QVElPTkFMLAorCW9kYi1JbmZvCQlbMl0gT0RCLUluZm8JT1BUSU9OQUwsCisJY2FtZWwtU3Vic2NyaXB0aW9uSW5mbwlbM10gQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKKwlhbGxJbmZvcm1hdGlvblNlbnQJWzRdIE5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZFJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBtb2JpbGl0eSBtYW5hZ2VtZW50IGV2ZW50IG5vdGlmaWNhdGlvb24gaW5mbyB0eXBlcworCitOb3RlTU0tRXZlbnRBcmc6Oj0gU0VRVUVOQ0UgeworCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlldmVudE1ldAkJWzBdCU1NLUNvZGUsCisJaW1zaQkJCVsxXQlJTVNJLAorCW1zaXNkbgkJWzJdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlsb2NhdGlvbkluZm9ybWF0aW9uCVszXQlMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCXN1cHBvcnRlZENBTUVMUGhhc2VzCVs1XQlTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzZdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbG9jYXRpb25JbmZvcm1hdGlvbkdQUlMJWzddCUxvY2F0aW9uSW5mb3JtYXRpb25HUFJTCU9QVElPTkFMLAorCW9mZmVyZWRDYW1lbDRGdW5jdGlvbmFsaXRpZXMJWzhdIE9mZmVyZWRDYW1lbDRGdW5jdGlvbmFsaXRpZXMJT1BUSU9OQUwKK30KKworTm90ZU1NLUV2ZW50UmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtU1MtSW5mb0Zvci1DU0UgOjo9IENIT0lDRSB7CisJZm9yd2FyZGluZ0luZm9Gb3ItQ1NFCVswXSBFeHQtRm9yd2FyZGluZ0luZm9Gb3ItQ1NFLAorCWNhbGxCYXJyaW5nSW5mb0Zvci1DU0UJWzFdIEV4dC1DYWxsQmFycmluZ0luZm9Gb3ItQ1NFCisJfQorCitFeHQtRm9yd2FyZGluZ0luZm9Gb3ItQ1NFIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CVsxXQlFeHQtRm9yd0ZlYXR1cmVMaXN0LAorCW5vdGlmaWNhdGlvblRvQ1NFCVsyXQlOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0V4dC1DYWxsQmFycmluZ0luZm9Gb3ItQ1NFIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlbMV0JRXh0LUNhbGxCYXJGZWF0dXJlTGlzdCwKKwlwYXNzd29yZAkJWzJdCVBhc3N3b3JkCU9QVElPTkFMLAorCXdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJWzNdCVdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzRdCU5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1PTS1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtT00tRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjRkZDZmCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtT00tRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDIxNiBAQAorLS0gJElkOiBNQVAtT00tRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gMTcuNy4yCU9wZXJhdGlvbiBhbmQgbWFpbnRlbmFuY2UgZGF0YSB0eXBlcworLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KQorIAorTUFQLU9NLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1PTS1EYXRhVHlwZXMgKDEyKSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCUFjdGl2YXRlVHJhY2VNb2RlQXJnLAorCUFjdGl2YXRlVHJhY2VNb2RlUmVzLAorCURlYWN0aXZhdGVUcmFjZU1vZGVBcmcsCisJRGVhY3RpdmF0ZVRyYWNlTW9kZVJlcywKKwlUcmFjZVByb3BhZ2F0aW9uTGlzdAorOworCitJTVBPUlRTCisJQWRkcmVzc1N0cmluZywKKwlJTVNJCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworOworCitBY3RpdmF0ZVRyYWNlTW9kZUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSQkJT1BUSU9OQUwsCisJdHJhY2VSZWZlcmVuY2UJWzFdIFRyYWNlUmVmZXJlbmNlLAorCXRyYWNlVHlwZQkJWzJdIFRyYWNlVHlwZSwKKwlvbWMtSWQJCVszXSBBZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl0cmFjZVJlZmVyZW5jZTIJWzVdIFRyYWNlUmVmZXJlbmNlMglPUFRJT05BTCwKKwl0cmFjZURlcHRoTGlzdAlbNl0gVHJhY2VEZXB0aExpc3QJT1BUSU9OQUwsCisJdHJhY2VORS1UeXBlTGlzdAlbN10gVHJhY2VORS1UeXBlTGlzdAlPUFRJT05BTCwKKwl0cmFjZUludGVyZmFjZUxpc3QJWzhdIFRyYWNlSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwl0cmFjZUV2ZW50TGlzdAlbOV0gVHJhY2VFdmVudExpc3QJT1BUSU9OQUwKKwl9CisKK1RyYWNlUmVmZXJlbmNlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjIpKQorCitUcmFjZVJlZmVyZW5jZTIgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMykpCisKK1RyYWNlUmVjb3JkaW5nU2Vzc2lvblJlZmVyZW5jZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKworVHJhY2VUeXBlIDo6PSBJTlRFR0VSCisJKDAuLjI1NSkKKwktLSBUcmFjZSB0eXBlcyBhcmUgZnVsbHkgZGVmaW5lZCBpbiAgM0dQUCBUUyA1Mi4wMDguIFs2MV0KKworVHJhY2VEZXB0aExpc3QgOjo9IFNFUVVFTkNFIHsKKwltc2Mtcy1UcmFjZURlcHRoCVswXSBUcmFjZURlcHRoCU9QVElPTkFMLAorCW1ndy1UcmFjZURlcHRoCVsxXSBUcmFjZURlcHRoCU9QVElPTkFMLAorCXNnc24tVHJhY2VEZXB0aAlbMl0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwlnZ3NuLVRyYWNlRGVwdGgJWzNdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJcm5jLVRyYWNlRGVwdGgJWzRdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJYm1zYy1UcmFjZURlcHRoCVs1XSBUcmFjZURlcHRoCU9QVElPTkFMLAorCS4uLn0KKworVHJhY2VEZXB0aCA6Oj0gRU5VTUVSQVRFRCB7CisJbWluaW11bSAoMCksCisJbWVkaXVtICgxKSwKKwltYXhpbXVtICgyKSwKKwkuLi59CistLSBUaGUgdmFsdWUgbWVkaXVtIGlzIGFwcGxpY2FibGUgb25seSBmb3IgUk5DLiBGb3Igb3RoZXIgbmV0d29yayBlbGVtZW50cywgaWYgdmFsdWUgbWVkaXVtCistLSBpcyByZWNlaXZlZCwgdmFsdWUgbWluaW11bSBzaGFsbCBiZSBhcHBsaWVkLgorCitUcmFjZU5FLVR5cGVMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwltc2MtcyAoMCksCisJbWd3ICgxKSwKKwlzZ3NuICgyKSwKKwlnZ3NuICgzKSwKKwlybmMgKDQpLAorCWJtLXNjICg1KX0gKFNJWkUgKDYuLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitUcmFjZUludGVyZmFjZUxpc3QgOjo9IFNFUVVFTkNFIHsKKwltc2Mtcy1MaXN0CVswXSBNU0MtUy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCW1ndy1MaXN0CQlbMV0gTUdXLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJc2dzbi1MaXN0CQlbMl0gU0dTTi1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCWdnc24tTGlzdAkJWzNdIEdHU04tSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwlybmMtTGlzdAkJWzRdIFJOQy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCWJtc2MtTGlzdAkJWzVdIEJNU0MtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwkuLi59CisKK01TQy1TLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCWEgKDApLAorCWl1ICgxKSwKKwltYyAoMiksCisJbWFwLWcgKDMpLAorCW1hcC1iICg0KSwKKwltYXAtZSAoNSksCisJbWFwLWYgKDYpLAorCWNhcCAoNyksCisJbWFwLWQgKDgpLAorCW1hcC1jICg5KX0gKFNJWkUgKDEwLi4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworTUdXLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCW1jICgwKSwKKwluYi11cCAoMSksCisJaXUtdXAgKDIpfSAoU0laRSAoMy4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworU0dTTi1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlnYiAoMCksCisJaXUgKDEpLAorCWduICgyKSwKKwltYXAtZ3IgKDMpLAorCW1hcC1nZCAoNCksCisJbWFwLWdmICg1KSwKKwlncyAoNiksCisJZ2UgKDcpfSAoU0laRSAoOC4uMTYpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0dHU04tSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJZ24gKDApLAorCWdpICgxKSwKKwlnbWIgKDIpfSAoU0laRSAoMy4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworUk5DLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCWl1ICgwKSwKKwlpdXIgKDEpLAorCWl1YiAoMiksCisJdXUgKDMpfSAoU0laRSAoNC4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworQk1TQy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlnbWIgKDApfSAoU0laRSAoMS4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworVHJhY2VFdmVudExpc3QgOjo9IFNFUVVFTkNFIHsKKwltc2Mtcy1MaXN0CVswXSBNU0MtUy1FdmVudExpc3QJT1BUSU9OQUwsCisJbWd3LUxpc3QJCVsxXSBNR1ctRXZlbnRMaXN0CU9QVElPTkFMLAorCXNnc24tTGlzdAkJWzJdIFNHU04tRXZlbnRMaXN0CU9QVElPTkFMLAorCWdnc24tTGlzdAkJWzNdIEdHU04tRXZlbnRMaXN0CU9QVElPTkFMLAorCWJtc2MtTGlzdAkJWzRdIEJNU0MtRXZlbnRMaXN0CU9QVElPTkFMLAorCS4uLn0KKworTVNDLVMtRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwltby1tdENhbGwgKDApLAorCW1vLW10LXNtcyAoMSksCisJbHUtaW1zaUF0dGFjaC1pbXNpRGV0YWNoICgyKSwKKwloYW5kb3ZlcnMgKDMpLAorCXNzICg0KX0gKFNJWkUgKDUuLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitNR1ctRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwljb250ZXh0ICgwKX0gKFNJWkUgKDEuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1NHU04tRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlwZHBDb250ZXh0ICgwKSwKKwltby1tdC1zbXMgKDEpLAorCXJhdS1ncHJzQXR0YWNoLWdwcnNEZXRhY2ggKDIpLAorCW1ibXNDb250ZXh0ICgzKX0gKFNJWkUgKDQuLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitHR1NOLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJcGRwQ29udGV4dCAoMCksCisJbWJtc0NvbnRleHQgKDEpfSAoU0laRSAoMi4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworQk1TQy1FdmVudExpc3QgOjo9IEJJVCBTVFJJTkcgeworCW1ibXNNdWx0aWNhc3RTZXJ2aWNlQWN0aXZhdGlvbiAoMCl9IChTSVpFICgxLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCisKK1RyYWNlUHJvcGFnYXRpb25MaXN0IDo6PSBTRVFVRU5DRSB7CisJdHJhY2VSZWZlcmVuY2UJWzBdIFRyYWNlUmVmZXJlbmNlCU9QVElPTkFMLAorCXRyYWNlVHlwZQkJWzFdIFRyYWNlVHlwZQlPUFRJT05BTCwKKwl0cmFjZVJlZmVyZW5jZTIJWzJdIFRyYWNlUmVmZXJlbmNlMglPUFRJT05BTCwKKwl0cmFjZVJlY29yZGluZ1Nlc3Npb25SZWZlcmVuY2UJWzNdIFRyYWNlUmVjb3JkaW5nU2Vzc2lvblJlZmVyZW5jZSBPUFRJT05BTCwKKwlybmMtVHJhY2VEZXB0aAlbNF0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwlybmMtSW50ZXJmYWNlTGlzdAlbNV0gUk5DLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJbXNjLXMtVHJhY2VEZXB0aAlbNl0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwltc2Mtcy1JbnRlcmZhY2VMaXN0CVs3XSBNU0MtUy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCW1zYy1zLUV2ZW50TGlzdAlbOF0gTVNDLVMtRXZlbnRMaXN0CU9QVElPTkFMLAorCW1ndy1UcmFjZURlcHRoCVs5XSBUcmFjZURlcHRoCU9QVElPTkFMLAorCW1ndy1JbnRlcmZhY2VMaXN0CVsxMF0gTUdXLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJbWd3LUV2ZW50TGlzdAlbMTFdIE1HVy1FdmVudExpc3QJT1BUSU9OQUwsCisJLi4ufQorCitBY3RpdmF0ZVRyYWNlTW9kZVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl0cmFjZVN1cHBvcnRJbmRpY2F0b3IJWzFdCU5VTEwJCU9QVElPTkFMCisJfQorCitEZWFjdGl2YXRlVHJhY2VNb2RlQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJCQlPUFRJT05BTCwKKwl0cmFjZVJlZmVyZW5jZQlbMV0gVHJhY2VSZWZlcmVuY2UsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXRyYWNlUmVmZXJlbmNlMglbM10gVHJhY2VSZWZlcmVuY2UyCU9QVElPTkFMCisJfQorCitEZWFjdGl2YXRlVHJhY2VNb2RlUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU00tRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNNLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmOTQxZgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNNLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSwyNzAgQEAKKy0tICRJZDogTUFQLVNNLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyICBWOC45LjAgKDIwMDktMDQpICAKKy0tIDE3LjcuNglTaG9ydCBtZXNzYWdlIGRhdGEgdHlwZXMKKworTUFQLVNNLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TTS1EYXRhVHlwZXMgKDE2KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCVJvdXRpbmdJbmZvRm9yU00tQXJnLAorCVJvdXRpbmdJbmZvRm9yU00tUmVzLAorCU1PLUZvcndhcmRTTS1BcmcsCisJTU8tRm9yd2FyZFNNLVJlcywKKwlNVC1Gb3J3YXJkU00tQXJnLAorCU1ULUZvcndhcmRTTS1SZXMsCisJUmVwb3J0U00tRGVsaXZlcnlTdGF0dXNBcmcsCisJUmVwb3J0U00tRGVsaXZlcnlTdGF0dXNSZXMsCisJQWxlcnRTZXJ2aWNlQ2VudHJlQXJnLAorCUluZm9ybVNlcnZpY2VDZW50cmVBcmcsCisJUmVhZHlGb3JTTS1BcmcsIAorCVJlYWR5Rm9yU00tUmVzLAorCVNNLURlbGl2ZXJ5T3V0Y29tZSwKKwlBbGVydFJlYXNvbiwKKwlBZGRpdGlvbmFsLU51bWJlciwKKwlNVC1Gb3J3YXJkU00tVkdDUy1BcmcsCisJTVQtRm9yd2FyZFNNLVZHQ1MtUmVzCis7CisKK0lNUE9SVFMKKwlBZGRyZXNzU3RyaW5nLAorCUlTRE4tQWRkcmVzc1N0cmluZywKKwlTaWduYWxJbmZvLAorCUlNU0ksCisJTE1TSSwKKwlBU0NJLUNhbGxSZWZlcmVuY2UKKworRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQorRlJPTSBNQVAtRVItRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUVSLURhdGFUeXBlcyAoMTcpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Cis7CisKKworUm91dGluZ0luZm9Gb3JTTS1BcmcgOjo9IFNFUVVFTkNFIHsKKwltc2lzZG4JCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJc20tUlAtUFJJCQlbMV0gQk9PTEVBTiwKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzcwlbMl0gQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzZdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWdwcnNTdXBwb3J0SW5kaWNhdG9yCVs3XQlOVUxMCQlPUFRJT05BTCwKKwktLSBncHJzU3VwcG9ydEluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUgU01TLUdNU0Mgc3VwcG9ydHMKKwktLSByZWNlaXZpbmcgb2YgdHdvIG51bWJlcnMgZnJvbSB0aGUgSExSCisJc20tUlAtTVRJCQlbOF0gU00tUlAtTVRJCU9QVElPTkFMLAorCXNtLVJQLVNNRUEJWzldIFNNLVJQLVNNRUEJT1BUSU9OQUwsCisJc20tZGVsaXZlcnlOb3RJbnRlbmRlZAlbMTBdIFNNLURlbGl2ZXJ5Tm90SW50ZW5kZWQJT1BUSU9OQUwgfQorCitTTS1EZWxpdmVyeU5vdEludGVuZGVkIDo6PSBFTlVNRVJBVEVEIHsKKwlvbmx5SU1TSS1yZXF1ZXN0ZWQgICgwKSwKKwlvbmx5TUNDLU1OQy1yZXF1ZXN0ZWQgICgxKSwKKwkuLi59CisKK1NNLVJQLU1USSA6Oj0gSU5URUdFUiAoMC4uMTApCisJLS0gMCBTTVMgRGVsaXZlciAKKwktLSAxIFNNUyBTdGF0dXMgUmVwb3J0CisJLS0gb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgc2hhbGwgYmUgZGlzY2FyZGVkIGlmCisJLS0gcmVjZWl2ZWQKKworU00tUlAtU01FQSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4xMikpCisJLS0gdGhpcyBwYXJhbWV0ZXIgY29udGFpbnMgYW4gYWRkcmVzcyBmaWVsZCB3aGljaCBpcyBlbmNvZGVkIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wNDAuIEFuIGFkZHJlc3MgZmllbGQgY29udGFpbnMgMyBlbGVtZW50cyA6CisJLS0gCQlhZGRyZXNzLWxlbmd0aAorCS0tIAkJdHlwZS1vZi1hZGRyZXNzCisJLS0gCQlhZGRyZXNzLXZhbHVlCisKK1JvdXRpbmdJbmZvRm9yU00tUmVzIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJbG9jYXRpb25JbmZvV2l0aExNU0kJWzBdIExvY2F0aW9uSW5mb1dpdGhMTVNJLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTG9jYXRpb25JbmZvV2l0aExNU0kgOjo9IFNFUVVFTkNFIHsKKwluZXR3b3JrTm9kZS1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKKwlsbXNpCQkJTE1TSQkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWdwcnNOb2RlSW5kaWNhdG9yCVs1XQlOVUxMCQlPUFRJT05BTCwKKwktLSBncHJzTm9kZUluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUgU0dTTiBudW1iZXIgaXMgc2VudCBhcyB0aGUgCisJLS0gTmV0d29yayBOb2RlIE51bWJlcgorCWFkZGl0aW9uYWwtTnVtYmVyCVs2XSBBZGRpdGlvbmFsLU51bWJlcglPUFRJT05BTCAKKwktLSBOZXR3b3JrTm9kZS1udW1iZXIgY2FuIGJlIGVpdGhlciBtc2MtbnVtYmVyIG9yIHNnc24tbnVtYmVyIG9yIElQLVNNLUdXCisJLS0gbnVtYmVyIG9yIFNNUyBSb3V0ZXIgbnVtYmVyCisJfQorCitBZGRpdGlvbmFsLU51bWJlciA6Oj0gQ0hPSUNFIHsKKwltc2MtTnVtYmVyCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2dzbi1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZ30KKwktLSBhZGRpdGlvbmFsLW51bWJlciBjYW4gYmUgZWl0aGVyIG1zYy1udW1iZXIgb3Igc2dzbi1udW1iZXIKKwktLSBpZiByZWNlaXZlZCBuZXR3b3JrTm9kZS1udW1iZXIgaXMgbXNjLW51bWJlciB0aGVuIHRoZSAJCisJLS0gYWRkaXRpb25hbCBudW1iZXIgaXMgc2dzbi1udW1iZXIgCisJLS0gaWYgcmVjZWl2ZWQgbmV0d29ya05vZGUtbnVtYmVyIGlzIHNnc24tbnVtYmVyIHRoZW4gdGhlIAorCS0tIGFkZGl0aW9uYWwgbnVtYmVyIGlzIG1zYy1udW1iZXIgCisKK01PLUZvcndhcmRTTS1BcmcgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1EQQkJU00tUlAtREEsCisJc20tUlAtT0EJCVNNLVJQLU9BLAorCXNtLVJQLVVJCQlTaWduYWxJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlpbXNpCQkJSU1TSSAJCU9QVElPTkFMIH0KKworTU8tRm9yd2FyZFNNLVJlcyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLVVJCQlTaWduYWxJbmZvIAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTVQtRm9yd2FyZFNNLUFyZyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLURBCQlTTS1SUC1EQSwKKwlzbS1SUC1PQQkJU00tUlAtT0EsCisJc20tUlAtVUkJCVNpZ25hbEluZm8sCisJbW9yZU1lc3NhZ2VzVG9TZW5kCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTVQtRm9yd2FyZFNNLVJlcyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLVVJCQlTaWduYWxJbmZvCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTTS1SUC1EQSA6Oj0gQ0hPSUNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJbG1zaQkJCVsxXSBMTVNJLAorCXNlcnZpY2VDZW50cmVBZGRyZXNzREEJWzRdIEFkZHJlc3NTdHJpbmcsCisJbm9TTS1SUC1EQQlbNV0gTlVMTH0KKworU00tUlAtT0EgOjo9IENIT0lDRSB7CisJbXNpc2RuCQlbMl0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXNlcnZpY2VDZW50cmVBZGRyZXNzT0EJWzRdIEFkZHJlc3NTdHJpbmcsCisJbm9TTS1SUC1PQQlbNV0gTlVMTH0KKworUmVwb3J0U00tRGVsaXZlcnlTdGF0dXNBcmcgOjo9IFNFUVVFTkNFIHsKKwltc2lzZG4JCUlTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzcwlBZGRyZXNzU3RyaW5nLAorCXNtLURlbGl2ZXJ5T3V0Y29tZQlTTS1EZWxpdmVyeU91dGNvbWUsCisJYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlbMF0gQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQorCQkJCQkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlncHJzU3VwcG9ydEluZGljYXRvcglbMl0JTlVMTAkJT1BUSU9OQUwsCisJLS0gZ3Byc1N1cHBvcnRJbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlIFNNUy1HTVNDIHN1cHBvcnRzIAorCS0tIGhhbmRsaW5nIG9mIHR3byBkZWxpdmVyeSBvdXRjb21lcworCWRlbGl2ZXJ5T3V0Y29tZUluZGljYXRvcglbM10gCU5VTEwJCU9QVElPTkFMLAorCS0tIERlbGl2ZXJ5T3V0Y29tZUluZGljYXRvciBpcyBzZXQgd2hlbiB0aGUgU00tRGVsaXZlcnlPdXRjb21lCisJLS0gaXMgZm9yIEdQUlMKKwlhZGRpdGlvbmFsU00tRGVsaXZlcnlPdXRjb21lCVs0XSAJU00tRGVsaXZlcnlPdXRjb21lIAlPUFRJT05BTCwKKwktLSBJZiByZWNlaXZlZCwgYWRkaXRpb25hbFNNLURlbGl2ZXJ5T3V0Y29tZSBpcyBmb3IgR1BSUworCS0tIElmIERlbGl2ZXJ5T3V0Y29tZUluZGljYXRvciBpcyBzZXQsIHRoZW4gQWRkaXRpb25hbFNNLURlbGl2ZXJ5T3V0Y29tZSBzaGFsbCBiZSBhYnNlbnQKKwlhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlbNV0gCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gT1BUSU9OQUwsCisJLS0gSWYgcmVjZWl2ZWQgYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgZm9yIEdQUlMKKwktLSBJZiBEZWxpdmVyeU91dGNvbWVJbmRpY2F0b3IgaXMgc2V0LCB0aGVuIEFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIAorCS0tIHNoYWxsIGJlIGFic2VudAorCWlwLXNtLWd3LUluZGljYXRvcglbNl0gCU5VTEwJCU9QVElPTkFMLAorCS0tIHRoZSBpcC1zbS1ndyBpbmRpY2F0b3IgaW5kaWNhdGVzIGJ5IGl0cyBwcmVzZW5jZSB0aGF0IHNtLWRlbGl2ZXJ5T3V0Y29tZQorCS0tIGlzIGZvciBkZWxpdmVyeSB2aWEgSU1TCisJLS0gSWYgcHJlc2VudCwgZGVsaXZlcnlPdXRjb21lSW5kaWNhdG9yIHNoYWxsIGJlIGFic2VudC4KKwlpcC1zbS1ndy1zbS1kZWxpdmVyeU91dGNvbWUJWzddIAlTTS1EZWxpdmVyeU91dGNvbWUJT1BUSU9OQUwsIAorCS0tIElmIHJlY2VpdmVkIGlwLXNtLWd3LXNtLWRlbGl2ZXJ5T3V0Y29tZSBpcyBmb3IgZGVsaXZlcnkgdmlhIElNUworCS0tIElmIGlwLXNtLWd3LUluZGljYXRvciBpcyBzZXQsIHRoZW4gaXAtc20tZ3ctc20tZGVsaXZlcnlPdXRjb21lIHNoYWxsIGJlIGFic2VudAorCWlwLXNtLWd3LWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JWzhdCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwKKwktLSBJZiByZWNlaXZlZCBpcC1zbS1ndy1zbS1hYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIGZvciBkZWxpdmVyeSB2aWEgSU1TCisJLS0gSWYgaXAtc20tZ3ctSW5kaWNhdG9yIGlzIHNldCwgdGhlbiBpcC1zbS1ndy1zbS1hYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIAorCS0tIHNoYWxsIGJlIGFic2VudAorfQorCitTTS1EZWxpdmVyeU91dGNvbWUgOjo9IEVOVU1FUkFURUQgeworCW1lbW9yeUNhcGFjaXR5RXhjZWVkZWQgICgwKSwKKwlhYnNlbnRTdWJzY3JpYmVyICAoMSksCisJc3VjY2Vzc2Z1bFRyYW5zZmVyICAoMil9CisKK1JlcG9ydFNNLURlbGl2ZXJ5U3RhdHVzUmVzIDo6PSBTRVFVRU5DRSB7CisJc3RvcmVkTVNJU0ROCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQWxlcnRTZXJ2aWNlQ2VudHJlQXJnIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2VydmljZUNlbnRyZUFkZHJlc3MJQWRkcmVzc1N0cmluZywKKwkuLi59CisKK0luZm9ybVNlcnZpY2VDZW50cmVBcmcgOjo9IFNFUVVFTkNFIHsKKwlzdG9yZWRNU0lTRE4JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW13LVN0YXR1cwlNVy1TdGF0dXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCwKKwlhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlbMF0JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCB9CisJLS0gYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gbWF5IGJlIHByZXNlbnQgb25seSBpZiAKKwktLSBhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIHByZXNlbnQuCisJLS0gaWYgaW5jbHVkZWQsIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIGZvciBHUFJTIGFuZAorCS0tIGFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgZm9yIG5vbi1HUFJTCisKK01XLVN0YXR1cyA6Oj0gQklUIFNUUklORyB7CisJc2MtQWRkcmVzc05vdEluY2x1ZGVkICAoMCksCisJbW5yZi1TZXQgICgxKSwKKwltY2VmLVNldCAgKDIpICwKKwltbnJnLVNldAkgICgzKX0gKFNJWkUgKDYuLjE2KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gYml0cyA0IHRvIDE1IHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisKK1JlYWR5Rm9yU00tQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCWFsZXJ0UmVhc29uCUFsZXJ0UmVhc29uLAorCWFsZXJ0UmVhc29uSW5kaWNhdG9yCU5VTEwJCQlPUFRJT05BTCwKKwktLSBhbGVydFJlYXNvbkluZGljYXRvciBpcyBzZXQgb25seSB3aGVuIHRoZSBhbGVydFJlYXNvbiAKKwktLSBzZW50IHRvIEhMUiBpcyBmb3IgR1BSUworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxBbGVydFJlYXNvbkluZGljYXRvcglbMV0gTlVMTAkJT1BUSU9OQUwKKwktLSBhZGRpdGlvbmFsQWxlcnRSZWFzb25JbmRpY2F0b3IgaXMgc2V0IG9ubHkgd2hlbiB0aGUgYWxlcnRSZWFzb24KKwktLSBzZW50IHRvIEhMUiBpcyBmb3IgSVAtU00tR1cKKwl9CisKK1JlYWR5Rm9yU00tUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FsZXJ0UmVhc29uIDo6PSBFTlVNRVJBVEVEIHsKKwltcy1QcmVzZW50ICAoMCksCisJbWVtb3J5QXZhaWxhYmxlICAoMSl9CisKK01ULUZvcndhcmRTTS1WR0NTLUFyZyA6Oj0gU0VRVUVOQ0UgeworCWFzY2lDYWxsUmVmZXJlbmNlCUFTQ0ktQ2FsbFJlZmVyZW5jZSwKKwlzbS1SUC1PQQkJU00tUlAtT0EsCisJc20tUlAtVUkJCVNpZ25hbEluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01ULUZvcndhcmRTTS1WR0NTLVJlcyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLVVJCQlbMF0gU2lnbmFsSW5mbwlPUFRJT05BTCwKKwlkaXNwYXRjaGVyTGlzdAlbMV0gRGlzcGF0Y2hlckxpc3QJT1BUSU9OQUwsCisJb25nb2luZ0NhbGwJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRGlzcGF0Y2hlckxpc3QgOjo9IAorCVNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRGlzcGF0Y2hlcnMpIE9GCisJCQkJSVNETi1BZGRyZXNzU3RyaW5nCisKK21heE51bU9mRGlzcGF0Y2hlcnMgIElOVEVHRVIgOjo9IDUKKworCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1Db2RlLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLUNvZGUuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2M2YyZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1Db2RlLmFzbgpAQCAtMCwwICsxLDE5MCBAQAorLS0gJElkOiBNQVAtU1MtQ29kZS5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkKKy0tIDE3LjcuNQlTdXBwbGVtZW50YXJ5IHNlcnZpY2UgY29kZXMKKworTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCis6Oj0KKworQkVHSU4KKworU1MtQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKKwktLSBzdXBwbGVtZW50YXJ5IHNlcnZpY2UsIGEgZ3JvdXAgb2Ygc3VwcGxlbWVudGFyeSBzZXJ2aWNlcywgb3IKKwktLSBhbGwgc3VwcGxlbWVudGFyeSBzZXJ2aWNlcy4gVGhlIHNlcnZpY2VzIGFuZCBhYmJyZXZpYXRpb25zCisJLS0gdXNlZCBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAwNCBbNV0uIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMKKwktLSBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0KKwktLSBiaXRzIDg3NjU0MzIxOiBncm91cCAoYml0cyA4NzY1KSwgYW5kIHNwZWNpZmljIHNlcnZpY2UKKwktLSAoYml0cyA0MzIxKQorCithbGxTUwkJCVNTLUNvZGUgOjo9ICcwMDAwMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgU1MKKworYWxsTGluZUlkZW50aWZpY2F0aW9uU1MJU1MtQ29kZSA6Oj0gJzAwMDEwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBsaW5lIGlkZW50aWZpY2F0aW9uIFNTCitjbGlwCQkJCVNTLUNvZGUgOjo9ICcwMDAxMDAwMSdCCisJLS0gY2FsbGluZyBsaW5lIGlkZW50aWZpY2F0aW9uIHByZXNlbnRhdGlvbgorY2xpcgkJCQlTUy1Db2RlIDo6PSAnMDAwMTAwMTAnQgorCS0tIGNhbGxpbmcgbGluZSBpZGVudGlmaWNhdGlvbiByZXN0cmljdGlvbgorY29scAkJCQlTUy1Db2RlIDo6PSAnMDAwMTAwMTEnQgorCS0tIGNvbm5lY3RlZCBsaW5lIGlkZW50aWZpY2F0aW9uIHByZXNlbnRhdGlvbgorY29scgkJCQlTUy1Db2RlIDo6PSAnMDAwMTAxMDAnQgorCS0tIGNvbm5lY3RlZCBsaW5lIGlkZW50aWZpY2F0aW9uIHJlc3RyaWN0aW9uCittY2kJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMTAxJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIG1hbGljaW91cyBjYWxsIGlkZW50aWZpY2F0aW9uCisKK2FsbE5hbWVJZGVudGlmaWNhdGlvblNTCVNTLUNvZGUgOjo9ICcwMDAxMTAwMCdCCisJLS0gYWxsIG5hbWUgaWRlbnRpZmljYXRpb24gU1MKK2NuYXAJCQkJU1MtQ29kZSA6Oj0gJzAwMDExMDAxJ0IKKwktLSBjYWxsaW5nIG5hbWUgcHJlc2VudGF0aW9uCisKKwktLSBTUy1Db2RlcyAnMDAwMTEwMTAnQiB0byAnMDAwMTExMTEnQiBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAKKwktLSBOYW1lSWRlbnRpZmljYXRpb24gU3VwcGxlbWVudGFyeSBTZXJ2aWNlIHVzZS4KKworYWxsRm9yd2FyZGluZ1NTCVNTLUNvZGUgOjo9ICcwMDEwMDAwMCdCCisJLS0gYWxsIGZvcndhcmRpbmcgU1MKK2NmdQkJCQlTUy1Db2RlIDo6PSAnMDAxMDAwMDEnQgorCS0tIGNhbGwgZm9yd2FyZGluZyB1bmNvbmRpdGlvbmFsCithbGxDb25kRm9yd2FyZGluZ1NTCVNTLUNvZGUgOjo9ICcwMDEwMTAwMCdCCisJLS0gYWxsIGNvbmRpdGlvbmFsIGZvcndhcmRpbmcgU1MKK2NmYgkJCQlTUy1Db2RlIDo6PSAnMDAxMDEwMDEnQgorCS0tIGNhbGwgZm9yd2FyZGluZyBvbiBtb2JpbGUgc3Vic2NyaWJlciBidXN5CitjZm5yeQkJCVNTLUNvZGUgOjo9ICcwMDEwMTAxMCdCCisJLS0gY2FsbCBmb3J3YXJkaW5nIG9uIG5vIHJlcGx5CitjZm5yYwkJCVNTLUNvZGUgOjo9ICcwMDEwMTAxMSdCCisJLS0gY2FsbCBmb3J3YXJkaW5nIG9uIG1vYmlsZSBzdWJzY3JpYmVyIG5vdCByZWFjaGFibGUgCitjZAkJCQlTUy1Db2RlIDo6PSAnMDAxMDAxMDAnQgorCS0tIGNhbGwgZGVmbGVjdGlvbgorCithbGxDYWxsT2ZmZXJpbmdTUwlTUy1Db2RlIDo6PSAnMDAxMTAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIGNhbGwgb2ZmZXJpbmcgU1MgaW5jbHVkZXMgYWxzbyBhbGwgZm9yd2FyZGluZyBTUworZWN0CQkJCVNTLUNvZGUgOjo9ICcwMDExMDAwMSdCCisJCS0tIGV4cGxpY2l0IGNhbGwgdHJhbnNmZXIKK21haAkJCQlTUy1Db2RlIDo6PSAnMDAxMTAwMTAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gbW9iaWxlIGFjY2VzcyBodW50aW5nCisKK2FsbENhbGxDb21wbGV0aW9uU1MJU1MtQ29kZSA6Oj0gJzAxMDAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBDYWxsIGNvbXBsZXRpb24gU1MKK2N3CQkJCVNTLUNvZGUgOjo9ICcwMTAwMDAwMSdCCisJLS0gY2FsbCB3YWl0aW5nCitob2xkCQkJCVNTLUNvZGUgOjo9ICcwMTAwMDAxMCdCCisJLS0gY2FsbCBob2xkCitjY2JzLUEJCQlTUy1Db2RlIDo6PSAnMDEwMDAwMTEnQgorCS0tIGNvbXBsZXRpb24gb2YgY2FsbCB0byBidXN5IHN1YnNjcmliZXJzLCBvcmlnaW5hdGluZyBzaWRlCisJLS0gdGhpcyBTUy1Db2RlIGlzIHVzZWQgb25seSBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSwgRGVsZXRlU3Vic2NyaWJlckRhdGEgCisJLS0gYW5kIEludGVycm9nYXRlU1MKK2NjYnMtQgkJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMCdCCisJLS0gY29tcGxldGlvbiBvZiBjYWxsIHRvIGJ1c3kgc3Vic2NyaWJlcnMsIGRlc3RpbmF0aW9uIHNpZGUKKwktLSB0aGlzIFNTLUNvZGUgaXMgdXNlZCBvbmx5IGluIEluc2VydFN1YnNjcmliZXJEYXRhIGFuZCBEZWxldGVTdWJzY3JpYmVyRGF0YQorbWMJCQkJU1MtQ29kZSA6Oj0gJzAxMDAwMTAxJ0IKKwktLSBtdWx0aWNhbGwKKworYWxsTXVsdGlQYXJ0eVNTCVNTLUNvZGUgOjo9ICcwMTAxMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgbXVsdGlwYXJ0eSBTUworbXVsdGlQVFkJCQlTUy1Db2RlIDo6PSAnMDEwMTAwMDEnQgorCS0tIG11bHRpcGFydHkKKworYWxsQ29tbXVuaXR5T2ZJbnRlcmVzdC1TUwlTUy1Db2RlIDo6PSAnMDExMDAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIGNvbW11bml0eSBvZiBpbnRlcmVzdCBTUworY3VnCQkJCVNTLUNvZGUgOjo9ICcwMTEwMDAwMSdCCisJLS0gY2xvc2VkIHVzZXIgZ3JvdXAKKworYWxsQ2hhcmdpbmdTUwkJU1MtQ29kZSA6Oj0gJzAxMTEwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBjaGFyZ2luZyBTUworYW9jaQkJCQlTUy1Db2RlIDo6PSAnMDExMTAwMDEnQgorCS0tIGFkdmljZSBvZiBjaGFyZ2UgaW5mb3JtYXRpb24KK2FvY2MJCQkJU1MtQ29kZSA6Oj0gJzAxMTEwMDEwJ0IKKwktLSBhZHZpY2Ugb2YgY2hhcmdlIGNoYXJnaW5nCisKK2FsbEFkZGl0aW9uYWxJbmZvVHJhbnNmZXJTUwlTUy1Db2RlIDo6PSAnMTAwMDAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdHJhbnNmZXIgU1MKK3V1czEJCQkJU1MtQ29kZSA6Oj0gJzEwMDAwMDAxJ0IKKwktLSBVVVMxIHVzZXItdG8tdXNlciBzaWduYWxsaW5nIAordXVzMgkJCQlTUy1Db2RlIDo6PSAnMTAwMDAwMTAnQgorCS0tIFVVUzIgdXNlci10by11c2VyIHNpZ25hbGxpbmcKK3V1czMJCQkJU1MtQ29kZSA6Oj0gJzEwMDAwMDExJ0IKKwktLSBVVVMzIHVzZXItdG8tdXNlciBzaWduYWxsaW5nCisKK2FsbEJhcnJpbmdTUwkJU1MtQ29kZSA6Oj0gJzEwMDEwMDAwJ0IKKwktLSBhbGwgYmFycmluZyBTUworYmFycmluZ09mT3V0Z29pbmdDYWxscwlTUy1Db2RlIDo6PSAnMTAwMTAwMDEnQgorCS0tIGJhcnJpbmcgb2Ygb3V0Z29pbmcgY2FsbHMKK2Jhb2MJCQkJU1MtQ29kZSA6Oj0gJzEwMDEwMDEwJ0IKKwktLSBiYXJyaW5nIG9mIGFsbCBvdXRnb2luZyBjYWxscworYm9pYwkJCQlTUy1Db2RlIDo6PSAnMTAwMTAwMTEnQgorCS0tIGJhcnJpbmcgb2Ygb3V0Z29pbmcgaW50ZXJuYXRpb25hbCBjYWxscworYm9pY0V4SEMJCQlTUy1Db2RlIDo6PSAnMTAwMTAxMDAnQgorCS0tIGJhcnJpbmcgb2Ygb3V0Z29pbmcgaW50ZXJuYXRpb25hbCBjYWxscyBleGNlcHQgdGhvc2UgZGlyZWN0ZWQKKwktLSB0byB0aGUgaG9tZSBQTE1OIENvdW50cnkKK2JhcnJpbmdPZkluY29taW5nQ2FsbHMJU1MtQ29kZSA6Oj0gJzEwMDExMDAxJ0IKKwktLSBiYXJyaW5nIG9mIGluY29taW5nIGNhbGxzCitiYWljCQkJCVNTLUNvZGUgOjo9ICcxMDAxMTAxMCdCCisJLS0gYmFycmluZyBvZiBhbGwgaW5jb21pbmcgY2FsbHMKK2JpY1JvYW0JCQlTUy1Db2RlIDo6PSAnMTAwMTEwMTEnQgorCS0tIGJhcnJpbmcgb2YgaW5jb21pbmcgY2FsbHMgd2hlbiByb2FtaW5nIG91dHNpZGUgaG9tZSBQTE1OCisJLS0gQ291bnRyeQorCithbGxQTE1OLXNwZWNpZmljU1MJU1MtQ29kZSA6Oj0gJzExMTEwMDAwJ0IKK3BsbW4tc3BlY2lmaWNTUy0xCVNTLUNvZGUgOjo9ICcxMTExMDAwMSdCCitwbG1uLXNwZWNpZmljU1MtMglTUy1Db2RlIDo6PSAnMTExMTAwMTAnQgorcGxtbi1zcGVjaWZpY1NTLTMJU1MtQ29kZSA6Oj0gJzExMTEwMDExJ0IKK3BsbW4tc3BlY2lmaWNTUy00CVNTLUNvZGUgOjo9ICcxMTExMDEwMCdCCitwbG1uLXNwZWNpZmljU1MtNQlTUy1Db2RlIDo6PSAnMTExMTAxMDEnQgorcGxtbi1zcGVjaWZpY1NTLTYJU1MtQ29kZSA6Oj0gJzExMTEwMTEwJ0IKK3BsbW4tc3BlY2lmaWNTUy03CVNTLUNvZGUgOjo9ICcxMTExMDExMSdCCitwbG1uLXNwZWNpZmljU1MtOAlTUy1Db2RlIDo6PSAnMTExMTEwMDAnQgorcGxtbi1zcGVjaWZpY1NTLTkJU1MtQ29kZSA6Oj0gJzExMTExMDAxJ0IKK3BsbW4tc3BlY2lmaWNTUy1BCVNTLUNvZGUgOjo9ICcxMTExMTAxMCdCCitwbG1uLXNwZWNpZmljU1MtQglTUy1Db2RlIDo6PSAnMTExMTEwMTEnQgorcGxtbi1zcGVjaWZpY1NTLUMJU1MtQ29kZSA6Oj0gJzExMTExMTAwJ0IKK3BsbW4tc3BlY2lmaWNTUy1ECVNTLUNvZGUgOjo9ICcxMTExMTEwMSdCCitwbG1uLXNwZWNpZmljU1MtRQlTUy1Db2RlIDo6PSAnMTExMTExMTAnQgorcGxtbi1zcGVjaWZpY1NTLUYJU1MtQ29kZSA6Oj0gJzExMTExMTExJ0IKKworYWxsQ2FsbFByaW9yaXR5U1MJU1MtQ29kZSA6Oj0gJzEwMTAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBjYWxsIHByaW9yaXR5IFNTCitlbWxwcAkJCVNTLUNvZGUgOjo9ICcxMDEwMDAwMSdCCisJLS0gZW5oYW5jZWQgTXVsdGlsZXZlbCBQcmVjZWRlbmNlIFByZS1lbXB0aW9uIChFTUxQUCkgc2VydmljZQorCithbGxMQ1NQcml2YWN5RXhjZXB0aW9uCVNTLUNvZGUgOjo9ICcxMDExMDAwMCdCCisJLS0gYWxsIExDUyBQcml2YWN5IEV4Y2VwdGlvbiBDbGFzc2VzCit1bml2ZXJzYWwJCQlTUy1Db2RlIDo6PSAnMTAxMTAwMDEnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IGFueSBMQ1MgY2xpZW50CitjYWxsU2Vzc2lvblJlbGF0ZWQJU1MtQ29kZSA6Oj0gJzEwMTEwMDEwJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBhbnkgdmFsdWUgYWRkZWQgTENTIGNsaWVudCB0byB3aGljaCBhIGNhbGwvc2Vzc2lvbiAKKwktLSBpcyBlc3RhYmxpc2hlZCBmcm9tIHRoZSB0YXJnZXQgTVMKK2NhbGxTZXNzaW9uVW5yZWxhdGVkCVNTLUNvZGUgOjo9ICcxMDExMDAxMSdCCisJLS0gYWxsb3cgbG9jYXRpb24gYnkgZGVzaWduYXRlZCBleHRlcm5hbCB2YWx1ZSBhZGRlZCBMQ1MgY2xpZW50cworcGxtbm9wZXJhdG9yCQlTUy1Db2RlIDo6PSAnMTAxMTAxMDAnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IGRlc2lnbmF0ZWQgUExNTiBvcGVyYXRvciBMQ1MgY2xpZW50cyAKK3NlcnZpY2VUeXBlCQlTUy1Db2RlIDo6PSAnMTAxMTAxMDEnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IExDUyBjbGllbnRzIG9mIGEgZGVzaWduYXRlZCBMQ1Mgc2VydmljZSB0eXBlCisKK2FsbE1PTFItU1MJCVNTLUNvZGUgOjo9ICcxMTAwMDAwMCdCCisJLS0gYWxsIE1vYmlsZSBPcmlnaW5hdGluZyBMb2NhdGlvbiBSZXF1ZXN0IENsYXNzZXMKK2Jhc2ljU2VsZkxvY2F0aW9uCVNTLUNvZGUgOjo9ICcxMTAwMDAwMSdCCisJLS0gYWxsb3cgYW4gTVMgdG8gcmVxdWVzdCBpdHMgb3duIGxvY2F0aW9uCithdXRvbm9tb3VzU2VsZkxvY2F0aW9uCVNTLUNvZGUgOjo9ICcxMTAwMDAxMCdCCisJLS0gYWxsb3cgYW4gTVMgdG8gcGVyZm9ybSBzZWxmIGxvY2F0aW9uIHdpdGhvdXQgaW50ZXJhY3Rpb24KKwktLSB3aXRoIHRoZSBQTE1OIGZvciBhIHByZWRldGVybWluZWQgcGVyaW9kIG9mIHRpbWUKK3RyYW5zZmVyVG9UaGlyZFBhcnR5CVNTLUNvZGUgOjo9ICcxMTAwMDAxMSdCCisJLS0gYWxsb3cgYW4gTVMgdG8gcmVxdWVzdCB0cmFuc2ZlciBvZiBpdHMgbG9jYXRpb24gdG8gYW5vdGhlciBMQ1MgY2xpZW50CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTNmN2YwCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDM0MiBAQAorLS0gJElkOiBNQVAtU1MtRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KSAgCistLSAxNy43LjQJU3VwcGxlbWVudGFyeSBzZXJ2aWNlIGRhdGEgdHlwZXMKKyAKK01BUC1TUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKwlSZWdpc3RlclNTLUFyZywKKwlTUy1JbmZvLAorCVNTLVN0YXR1cywKKwlTUy1TdWJzY3JpcHRpb25PcHRpb24sCisJU1MtRm9yQlMtQ29kZSwKKwlJbnRlcnJvZ2F0ZVNTLVJlcywKKwlVU1NELUFyZywKKwlVU1NELVJlcywgCisJVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCVVTU0QtU3RyaW5nLAorCVBhc3N3b3JkLAorCUd1aWRhbmNlSW5mbywKKwlTUy1MaXN0LAorCVNTLUluZm9MaXN0LAorCU92ZXJyaWRlQ2F0ZWdvcnksCisJQ2xpUmVzdHJpY3Rpb25PcHRpb24sCisJTm9SZXBseUNvbmRpdGlvblRpbWUsCisJRm9yd2FyZGluZ09wdGlvbnMsCisJbWF4TnVtT2ZTUywKKwlTUy1EYXRhLAorCVNTLUludm9jYXRpb25Ob3RpZmljYXRpb25BcmcsCisJU1MtSW52b2NhdGlvbk5vdGlmaWNhdGlvblJlcywKKwlDQ0JTLUZlYXR1cmUsCisJUmVnaXN0ZXJDQy1FbnRyeUFyZywKKwlSZWdpc3RlckNDLUVudHJ5UmVzLAorCUVyYXNlQ0MtRW50cnlBcmcsCisJRXJhc2VDQy1FbnRyeVJlcworOworCitJTVBPUlRTCisJQWRkcmVzc1N0cmluZywKKwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJSVNETi1TdWJhZGRyZXNzU3RyaW5nLAorCUZUTi1BZGRyZXNzU3RyaW5nLAorCUlNU0ksCisJQmFzaWNTZXJ2aWNlQ29kZSwKKwlBbGVydGluZ1BhdHRlcm4sCisJRU1MUFAtUHJpb3JpdHksIAorCU1heE1DLUJlYXJlcnMsCisJTUMtQmVhcmVycywKKwlFeHRlcm5hbFNpZ25hbEluZm8KK0ZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorCisJU1MtQ29kZQorRlJPTSBNQVAtU1MtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1Db2RlICgxNSkgdmVyc2lvbjExICgxMSl9Cis7CisKKworUmVnaXN0ZXJTUy1BcmcgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCWZvcndhcmRlZFRvTnVtYmVyCVs0XSBBZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRlZFRvU3ViYWRkcmVzcwlbNl0gSVNETi1TdWJhZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW5vUmVwbHlDb25kaXRpb25UaW1lCVs1XSBOb1JlcGx5Q29uZGl0aW9uVGltZQlPUFRJT05BTCwKKwkuLi4sCisJZGVmYXVsdFByaW9yaXR5CVs3XSBFTUxQUC1Qcmlvcml0eQlPUFRJT05BTCwKKwluYnJVc2VyCQlbOF0gTUMtQmVhcmVycwlPUFRJT05BTCwKKwlsb25nRlROLVN1cHBvcnRlZAlbOV0JTlVMTAkJT1BUSU9OQUwgfQorCitOb1JlcGx5Q29uZGl0aW9uVGltZSA6Oj0gSU5URUdFUiAoNS4uMzApCisKK1NTLUluZm8gOjo9IENIT0lDRSB7CisJZm9yd2FyZGluZ0luZm8JWzBdIEZvcndhcmRpbmdJbmZvLAorCWNhbGxCYXJyaW5nSW5mbwlbMV0gQ2FsbEJhcnJpbmdJbmZvLAorCXNzLURhdGEJCVszXSBTUy1EYXRhfQorCitGb3J3YXJkaW5nSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUJCU9QVElPTkFMLAorCWZvcndhcmRpbmdGZWF0dXJlTGlzdAlGb3J3YXJkaW5nRmVhdHVyZUxpc3QsCisJLi4ufQorCitGb3J3YXJkaW5nRmVhdHVyZUxpc3QgOjo9IAorCVNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUZvcndhcmRpbmdGZWF0dXJlCisKK0ZvcndhcmRpbmdGZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJYmFzaWNTZXJ2aWNlCUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbNF0gU1MtU3RhdHVzCU9QVElPTkFMLAorCWZvcndhcmRlZFRvTnVtYmVyCVs1XSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGVkVG9TdWJhZGRyZXNzCVs4XSBJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGluZ09wdGlvbnMJWzZdIEZvcndhcmRpbmdPcHRpb25zCU9QVElPTkFMLAorCW5vUmVwbHlDb25kaXRpb25UaW1lCVs3XSBOb1JlcGx5Q29uZGl0aW9uVGltZQlPUFRJT05BTCwKKwkuLi4sCisJbG9uZ0ZvcndhcmRlZFRvTnVtYmVyCVs5XSBGVE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCB9CisKK1NTLVN0YXR1cyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKworCS0tIGJpdHMgODc2NTogMDAwMCAodW51c2VkKQorCS0tIGJpdHMgNDMyMTogVXNlZCB0byBjb252ZXkgdGhlICJQIGJpdCIsIlIgYml0IiwiQSBiaXQiIGFuZCAiUSBiaXQiLAorCS0tCQkgICAgcmVwcmVzZW50aW5nIHN1cHBsZW1lbnRhcnkgc2VydmljZSBzdGF0ZSBpbmZvcm1hdGlvbgorCS0tCQkgICAgYXMgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAxMSBbMjJdCisKKwktLSBiaXQgNDogIlEgYml0IgorCisJLS0gYml0IDM6ICJQIGJpdCIKKworCS0tIGJpdCAyOiAiUiBiaXQiCisKKwktLSBiaXQgMTogIkEgYml0IgorCitGb3J3YXJkaW5nT3B0aW9ucyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKworCS0tIGJpdCA4OiBub3RpZmljYXRpb24gdG8gZm9yd2FyZGluZyBwYXJ0eQorCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgorCS0tCTEgIG5vdGlmaWNhdGlvbgorCisJLS0gYml0IDc6IHJlZGlyZWN0aW5nIHByZXNlbnRhdGlvbgorCS0tCTAgbm8gcHJlc2VudGF0aW9uICAKKwktLQkxICBwcmVzZW50YXRpb24KKworCS0tIGJpdCA2OiBub3RpZmljYXRpb24gdG8gY2FsbGluZyBwYXJ0eQorCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgorCS0tCTEgIG5vdGlmaWNhdGlvbgorCisJLS0gYml0IDU6IDAgKHVudXNlZCkKKworCS0tIGJpdHMgNDM6IGZvcndhcmRpbmcgcmVhc29uCisJLS0JMDAgIG1zIG5vdCByZWFjaGFibGUKKwktLQkwMSAgbXMgYnVzeQorCS0tCTEwICBubyByZXBseQorCS0tCTExICB1bmNvbmRpdGlvbmFsIHdoZW4gdXNlZCBpbiBhIFNSSSBSZXN1bHQsIAorCS0tCSAgICBvciBjYWxsIGRlZmxlY3Rpb24gd2hlbiB1c2VkIGluIGEgUkNIIEFyZ3VtZW50CisJLS0gYml0cyAyMTogMDAgKHVudXNlZCkKKworQ2FsbEJhcnJpbmdJbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZQkJT1BUSU9OQUwsCisJY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlDYWxsQmFycmluZ0ZlYXR1cmVMaXN0LAorCS4uLn0KKworQ2FsbEJhcnJpbmdGZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJQ2FsbEJhcnJpbmdGZWF0dXJlCisKK0NhbGxCYXJyaW5nRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwlbNF0gU1MtU3RhdHVzCU9QVElPTkFMLAorCS4uLn0KKworU1MtRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUJCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzRdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwlzcy1TdWJzY3JpcHRpb25PcHRpb24JU1MtU3Vic2NyaXB0aW9uT3B0aW9uCU9QVElPTkFMLAorCWJhc2ljU2VydmljZUdyb3VwTGlzdAlCYXNpY1NlcnZpY2VHcm91cExpc3QJT1BUSU9OQUwsCisJLi4uLAorCWRlZmF1bHRQcmlvcml0eQlFTUxQUC1Qcmlvcml0eQlPUFRJT05BTCwKKwluYnJVc2VyCQlbNV0gTUMtQmVhcmVycwlPUFRJT05BTAorCX0KKworU1MtU3Vic2NyaXB0aW9uT3B0aW9uIDo6PSBDSE9JQ0UgeworCWNsaVJlc3RyaWN0aW9uT3B0aW9uCVsyXSBDbGlSZXN0cmljdGlvbk9wdGlvbiwKKwlvdmVycmlkZUNhdGVnb3J5CVsxXSBPdmVycmlkZUNhdGVnb3J5fQorCitDbGlSZXN0cmljdGlvbk9wdGlvbiA6Oj0gRU5VTUVSQVRFRCB7CisJcGVybWFuZW50ICAoMCksCisJdGVtcG9yYXJ5RGVmYXVsdFJlc3RyaWN0ZWQgICgxKSwKKwl0ZW1wb3JhcnlEZWZhdWx0QWxsb3dlZCAgKDIpfQorCitPdmVycmlkZUNhdGVnb3J5IDo6PSBFTlVNRVJBVEVEIHsKKwlvdmVycmlkZUVuYWJsZWQgICgwKSwKKwlvdmVycmlkZURpc2FibGVkICAoMSl9CisKK1NTLUZvckJTLUNvZGUgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCS4uLiwKKwlsb25nRlROLVN1cHBvcnRlZAlbNF0JTlVMTAkJT1BUSU9OQUwgfQorCitHZW5lcmljU2VydmljZUluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1TdGF0dXMJU1MtU3RhdHVzLAorCWNsaVJlc3RyaWN0aW9uT3B0aW9uCUNsaVJlc3RyaWN0aW9uT3B0aW9uCU9QVElPTkFMLAorCS4uLiwKKwltYXhpbXVtRW50aXRsZWRQcmlvcml0eQlbMF0gRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCisJZGVmYXVsdFByaW9yaXR5CVsxXSBFTUxQUC1Qcmlvcml0eQlPUFRJT05BTCwKKwljY2JzLUZlYXR1cmVMaXN0CVsyXSBDQ0JTLUZlYXR1cmVMaXN0CU9QVElPTkFMLAorCW5iclNCCQlbM10gTWF4TUMtQmVhcmVycwlPUFRJT05BTCwKKwluYnJVc2VyCQlbNF0gTUMtQmVhcmVycwlPUFRJT05BTCwKKwluYnJTTgkJWzVdIE1DLUJlYXJlcnMJT1BUSU9OQUwgfQorCitDQ0JTLUZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNDQlMtUmVxdWVzdHMpIE9GCisJCQkJQ0NCUy1GZWF0dXJlCisKK21heE51bU9mQ0NCUy1SZXF1ZXN0cyAgSU5URUdFUiA6Oj0gNQorCitDQ0JTLUZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKKwljY2JzLUluZGV4CVswXSBDQ0JTLUluZGV4CU9QVElPTkFMLAorCWItc3Vic2NyaWJlck51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWItc3Vic2NyaWJlclN1YmFkZHJlc3MJWzJdIElTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwliYXNpY1NlcnZpY2VHcm91cAlbM10gQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwkuLi59CisKK0NDQlMtSW5kZXggIDo6PSBJTlRFR0VSICgxLi5tYXhOdW1PZkNDQlMtUmVxdWVzdHMpCisKK0ludGVycm9nYXRlU1MtUmVzIDo6PSBDSE9JQ0UgeworCXNzLVN0YXR1cwkJWzBdIFNTLVN0YXR1cywKKwliYXNpY1NlcnZpY2VHcm91cExpc3QJWzJdIEJhc2ljU2VydmljZUdyb3VwTGlzdCwKKwlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJWzNdIEZvcndhcmRpbmdGZWF0dXJlTGlzdCwKKwlnZW5lcmljU2VydmljZUluZm8JWzRdCUdlbmVyaWNTZXJ2aWNlSW5mbyB9CisKK1VTU0QtQXJnIDo6PSBTRVFVRU5DRSB7CisJdXNzZC1EYXRhQ29kaW5nU2NoZW1lCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwl1c3NkLVN0cmluZwlVU1NELVN0cmluZywKKwkuLi4gLAorCWFsZXJ0aW5nUGF0dGVybglBbGVydGluZ1BhdHRlcm4JT1BUSU9OQUwsCisJbXNpc2RuCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMIH0KKworVVNTRC1SZXMgOjo9IFNFUVVFTkNFIHsKKwl1c3NkLURhdGFDb2RpbmdTY2hlbWUJVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCXVzc2QtU3RyaW5nCVVTU0QtU3RyaW5nLAorCS4uLn0KKworVVNTRC1EYXRhQ29kaW5nU2NoZW1lIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSBpcyBkZWZpbmVkIGJ5CisJLS0gdGhlIENlbGwgQnJvYWRjYXN0IERhdGEgQ29kaW5nIFNjaGVtZSBhcyBkZXNjcmliZWQgaW4KKwktLSBUUyAzR1BQIFRTIDIzLjAzOCBbMjVdCisKK1VTU0QtU3RyaW5nIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heFVTU0QtU3RyaW5nTGVuZ3RoKSkKKwktLSBUaGUgc3RydWN0dXJlIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgVVNTRC1TdHJpbmcgaXMgZGVwZW5kZW50CisJLS0gb24gdGhlIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSBhcyBkZXNjcmliZWQgaW4gVFMgM0dQUCBUUyAyMy4wMzggWzI1XS4KKworbWF4VVNTRC1TdHJpbmdMZW5ndGggIElOVEVHRVIgOjo9IDE2MAorCitQYXNzd29yZCA6Oj0gTnVtZXJpY1N0cmluZworCShGUk9NICgiMCJ8IjEifCIyInwiMyJ8IjQifCI1InwiNiJ8IjcifCI4InwiOSIpKQorCShTSVpFICg0KSkKKworR3VpZGFuY2VJbmZvIDo6PSBFTlVNRVJBVEVEIHsKKwllbnRlclBXICAoMCksCisJZW50ZXJOZXdQVyAgKDEpLAorCWVudGVyTmV3UFctQWdhaW4gICgyKX0KKwktLSBIb3cgdGhpcyBpbmZvcm1hdGlvbiBpcyByZWFsbHkgZGVsaXZlcmVkIHRvIHRoZSBzdWJzY3JpYmVyCisJLS0gKGRpc3BsYXksIGFubm91bmNlbWVudCwgLi4uKSBpcyBub3QgcGFydCBvZiB0aGlzCisJLS0gc3BlY2lmaWNhdGlvbi4KKworU1MtTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTUykgT0YKKwkJCQlTUy1Db2RlCisKK21heE51bU9mU1MgIElOVEVHRVIgOjo9IDMwCisKK1NTLUluZm9MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlNTKSBPRgorCQkJCVNTLUluZm8KKworQmFzaWNTZXJ2aWNlR3JvdXBMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlCYXNpY1NlcnZpY2VDb2RlCisKK21heE51bU9mQmFzaWNTZXJ2aWNlR3JvdXBzICBJTlRFR0VSIDo6PSAxMworCitTUy1JbnZvY2F0aW9uTm90aWZpY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCW1zaXNkbgkJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKKwlzcy1FdmVudAkJWzJdIFNTLUNvZGUsCisJLS0gVGhlIGZvbGxvd2luZyBTUy1Db2RlIHZhbHVlcyBhcmUgYWxsb3dlZCA6CisJLS0gZWN0CQlTUy1Db2RlIDo6PSAnMDAxMTAwMDEnQgorCS0tIG11bHRpUFRZCVNTLUNvZGUgOjo9ICcwMTAxMDAwMSdCCisJLS0gY2QJCVNTLUNvZGUgOjo9ICcwMDEwMDEwMCdCCisJLS0gY2NicwkJU1MtQ29kZSA6Oj0gJzAxMDAwMTAwJ0IKKwlzcy1FdmVudFNwZWNpZmljYXRpb24JWzNdIFNTLUV2ZW50U3BlY2lmaWNhdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYi1zdWJzY3JpYmVyTnVtYmVyCVs1XQlJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJY2Nicy1SZXF1ZXN0U3RhdGUJWzZdCUNDQlMtUmVxdWVzdFN0YXRlCU9QVElPTkFMCisJfQorCitDQ0JTLVJlcXVlc3RTdGF0ZSA6Oj0gRU5VTUVSQVRFRCB7CisJcmVxdWVzdCAgCSgwKSwKKwlyZWNhbGwgIAkoMSksCisJYWN0aXZlICAJKDIpLAorCWNvbXBsZXRlZAkoMyksCisJc3VzcGVuZGVkCSg0KSwKKwlmcm96ZW4JKDUpLAorCWRlbGV0ZWQJKDYpCisJfQorCitTUy1JbnZvY2F0aW9uTm90aWZpY2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4KKwl9CisKK1NTLUV2ZW50U3BlY2lmaWNhdGlvbiA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4RXZlbnRTcGVjaWZpY2F0aW9uKSBPRgorCQkJCUFkZHJlc3NTdHJpbmcKKworbWF4RXZlbnRTcGVjaWZpY2F0aW9uICBJTlRFR0VSIDo6PSAyCisKK1JlZ2lzdGVyQ0MtRW50cnlBcmcgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwljY2JzLURhdGEJCVsxXQlDQ0JTLURhdGEJT1BUSU9OQUwsCisJLi4ufQorCitDQ0JTLURhdGEgOjo9IFNFUVVFTkNFIHsKKwljY2JzLUZlYXR1cmUJWzBdCUNDQlMtRmVhdHVyZSwKKwl0cmFuc2xhdGVkQi1OdW1iZXIJWzFdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlSW5kaWNhdG9yCVsyXQlTZXJ2aWNlSW5kaWNhdG9yCU9QVElPTkFMLAorCWNhbGxJbmZvCQlbM10JRXh0ZXJuYWxTaWduYWxJbmZvLAorCW5ldHdvcmtTaWduYWxJbmZvCVs0XQlFeHRlcm5hbFNpZ25hbEluZm8sCisJLi4ufQorCitTZXJ2aWNlSW5kaWNhdG9yIDo6PSBCSVQgU1RSSU5HIHsKKwljbGlyLWludm9rZWQgKDApLAorCWNhbWVsLWludm9rZWQgKDEpfSAoU0laRSgyLi4zMikpIAorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBiaXRzIDIgdG8gMzEgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKworUmVnaXN0ZXJDQy1FbnRyeVJlcyA6Oj0gU0VRVUVOQ0UgeworCWNjYnMtRmVhdHVyZQlbMF0gQ0NCUy1GZWF0dXJlCU9QVElPTkFMLAorCS4uLn0KKworRXJhc2VDQy1FbnRyeUFyZyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWNjYnMtSW5kZXgJWzFdCUNDQlMtSW5kZXgJT1BUSU9OQUwsCisJLi4ufQorCitFcmFzZUNDLUVudHJ5UmVzIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJc3MtU3RhdHVzCQlbMV0gU1MtU3RhdHVzCU9QVElPTkFMLAorCS4uLn0KKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVRTLUNvZGUuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtVFMtQ29kZS5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjMDBiZgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVRTLUNvZGUuYXNuCkBAIC0wLDAgKzEsOTIgQEAKKy0tICRJZDogTUFQLVRTLUNvZGUuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpIAorLS0gMTcuNy45CVRlbGVzZXJ2aWNlIENvZGVzCisgCitNQVAtVFMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1UUy1Db2RlICgxOSkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKKzo6PQorCitCRUdJTgorCitUZWxlc2VydmljZUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gdGVsZXNlcnZpY2UsIGEgZ3JvdXAgb2YgdGVsZXNlcnZpY2VzLCBvciBhbGwgdGVsZXNlcnZpY2VzLiBUaGUKKwktLSBzZXJ2aWNlcyBhcmUgZGVmaW5lZCBpbiBUUyBHU00gMjIuMDAzIFs0XS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworCS0tIGJpdHMgODc2NTQzMjE6IGdyb3VwIChiaXRzIDg3NjUpIGFuZCBzcGVjaWZpYyBzZXJ2aWNlCisJLS0gKGJpdHMgNDMyMSkKKworRXh0LVRlbGVzZXJ2aWNlQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi41KSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKKwktLSB0ZWxlc2VydmljZSwgYSBncm91cCBvZiB0ZWxlc2VydmljZXMsIG9yIGFsbCB0ZWxlc2VydmljZXMuIFRoZQorCS0tIHNlcnZpY2VzIGFyZSBkZWZpbmVkIGluIFRTIEdTTSAyMi4wMDMgWzRdLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCisJLS0gT0NURVQgMToKKwktLSBiaXRzIDg3NjU0MzIxOiBncm91cCAoYml0cyA4NzY1KSBhbmQgc3BlY2lmaWMgc2VydmljZQorCS0tIChiaXRzIDQzMjEpCisKKwktLSBPQ1RFVFMgMi01OiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gSWYgcmVjZWl2ZWQgdGhlCisgICAgLS0gRXh0LVRlbGVzZXJ2aWNlQ29kZSBzaGFsbCBiZQorIAktLSB0cmVhdGVkIGFjY29yZGluZyB0byB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGRlZmluZWQgZm9yIHRoZQorCS0tIG9wZXJhdGlvbiB0aGF0IHVzZXMgdGhpcyB0eXBlLgorCisJLS0gRXh0LVRlbGVzZXJ2aWNlQ29kZSBpbmNsdWRlcyBhbGwgdmFsdWVzIGRlZmluZWQgZm9yIFRlbGVzZXJ2aWNlQ29kZS4KKworYWxsVGVsZXNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMDAwMDAwJ0IKKworYWxsU3BlZWNoVHJhbnNtaXNzaW9uU2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAwMTAwMDAnQgordGVsZXBob255CQkJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAwMTAwMDEnQgorZW1lcmdlbmN5Q2FsbHMJCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDEwJ0IKKworYWxsU2hvcnRNZXNzYWdlU2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDAnQgorc2hvcnRNZXNzYWdlTVQtUFAJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDEnQgorc2hvcnRNZXNzYWdlTU8tUFAJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMTAnQgorCithbGxGYWNzaW1pbGVUcmFuc21pc3Npb25TZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTEwMDAwMCdCCitmYWNzaW1pbGVHcm91cDNBbmRBbHRlclNwZWVjaAlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTEwMDAwMSdCCithdXRvbWF0aWNGYWNzaW1pbGVHcm91cDMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMTAnQgorZmFjc2ltaWxlR3JvdXA0CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTAwMDExJ0IKKworLS0gVGhlIGZvbGxvd2luZyBub24taGllcmFyY2hpY2FsIENvbXBvdW5kIFRlbGVzZXJ2aWNlIEdyb3VwcworLS0gYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMzA6CithbGxEYXRhVGVsZXNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTEwMDAwJ0IKKwktLSBjb3ZlcnMgVGVsZXNlcnZpY2UgR3JvdXBzICdhbGxGYWNzaW1pbGVUcmFuc21pc3Npb25TZXJ2aWNlcycKKwktLSBhbmQgJ2FsbFNob3J0TWVzc2FnZVNlcnZpY2VzJworYWxsVGVsZXNlcnZpY2VzLUV4ZXB0U01TCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzEwMDAwMDAwJ0IKKwktLSBjb3ZlcnMgVGVsZXNlcnZpY2UgR3JvdXBzICdhbGxTcGVlY2hUcmFuc21pc3Npb25TZXJ2aWNlcycgYW5kCisJLS0gJ2FsbEZhY3NpbWlsZVRyYW5zbWlzc2lvblNlcnZpY2VzJworLS0KKy0tIENvbXBvdW5kIFRlbGVzZXJ2aWNlIEdyb3VwIENvZGVzIGFyZSBvbmx5IHVzZWQgaW4gY2FsbAorLS0gaW5kZXBlbmRlbnQgc3VwcGxlbWVudGFyeSBzZXJ2aWNlIG9wZXJhdGlvbnMsIGkuZS4gdGhleQorLS0gYXJlIG5vdCB1c2VkIGluIEluc2VydFN1YnNjcmliZXJEYXRhIG9yIGluCistLSBEZWxldGVTdWJzY3JpYmVyRGF0YSBtZXNzYWdlcy4KKworYWxsVm9pY2VHcm91cENhbGxTZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMDAxMDAwMCdCCit2b2ljZUdyb3VwQ2FsbAkJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTAwMTAwMDEnQgordm9pY2VCcm9hZGNhc3RDYWxsCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzEwMDEwMDEwJ0IKKworYWxsUExNTi1zcGVjaWZpY1RTCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAwJ0IKK3BsbW4tc3BlY2lmaWNUUy0xCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAxJ0IKK3BsbW4tc3BlY2lmaWNUUy0yCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDEwJ0IKK3BsbW4tc3BlY2lmaWNUUy0zCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDExJ0IKK3BsbW4tc3BlY2lmaWNUUy00CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTAwJ0IKK3BsbW4tc3BlY2lmaWNUUy01CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTAxJ0IKK3BsbW4tc3BlY2lmaWNUUy02CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTEwJ0IKK3BsbW4tc3BlY2lmaWNUUy03CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTExJ0IKK3BsbW4tc3BlY2lmaWNUUy04CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDAwJ0IKK3BsbW4tc3BlY2lmaWNUUy05CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDAxJ0IKK3BsbW4tc3BlY2lmaWNUUy1BCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDEwJ0IKK3BsbW4tc3BlY2lmaWNUUy1CCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDExJ0IKK3BsbW4tc3BlY2lmaWNUUy1DCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAwJ0IKK3BsbW4tc3BlY2lmaWNUUy1ECVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAxJ0IKK3BsbW4tc3BlY2lmaWNUUy1FCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTEwJ0IKK3BsbW4tc3BlY2lmaWNUUy1GCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTExJ0IKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1Db21wb25lbnRzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1Db21wb25lbnRzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmFkZTZhCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLUNvbXBvbmVudHMuYXNuCkBAIC0wLDAgKzEsMTQ4OCBAQAorLS0gUlJMUC1Db21wb25lbnRzLmFzbgorLS0gJElkJAorLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDQ0LjAzMSBWNy40LjAgKDIwMDctMDMpCistLSBodHRwOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9hcmNoaXZlLzQ0X3Nlcmllcy80NC4wMzEvNDQwMzEtNzQwLnppcC80NDAzMS03NDAuZG9jCistLQorLS0gNCBDb21wb25lbnRzCistLSA1IEVsZW1lbnRzIG9mIENvbXBvbmVudHMKKy0tCisKK1JSTFAtQ29tcG9uZW50cworLS0geyBSUkxQLUNvbXBvbmVudHMgfQorCitERUZJTklUSU9OUyBBVVRPTUFUSUMgVEFHUyA6Oj0KKworQkVHSU4KKworSU1QT1JUUworCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgVmVsb2NpdHlFc3RpbWF0ZQorRlJPTQorCU1BUC1MQ1MtRGF0YVR5cGVzIHsKKwlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTENTLURhdGFUeXBlcyAoMjUpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworCWl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisJZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKzsKKworCistLSBBZGQgaGVyZSBvdGhlciBBU04uMSBkZWZpbml0aW9ucyBwcmVzZW50ZWQgYmVsb3cKKy0tIGluIGNoYXB0ZXJzIDQgYW5kIDUuCisKKy0tIE1lYXN1cmVtZW50IFBvc2l0aW9uIHJlcXVlc3QgY29tcG9uZW50CitNc3JQb3NpdGlvbi1SZXEgOjo9IFNFUVVFTkNFIHsKKwlwb3NpdGlvbkluc3RydWN0CQlQb3NpdGlvbkluc3RydWN0LAorCXJlZmVyZW5jZUFzc2lzdERhdGEJCVJlZmVyZW5jZUFzc2lzdERhdGEJCU9QVElPTkFMLAorCW1zckFzc2lzdERhdGEJCQlNc3JBc3Npc3REYXRhCQkJT1BUSU9OQUwsCisJc3lzdGVtSW5mb0Fzc2lzdERhdGEJU3lzdGVtSW5mb0Fzc2lzdERhdGEJT1BUSU9OQUwsCisJZ3BzLUFzc2lzdERhdGEJCQlHUFMtQXNzaXN0RGF0YQkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCisJLS0gUmVsZWFzZSA5OCBleHRlbnNpb24gZWxlbWVudAorcmVsOTgtTXNyUG9zaXRpb24tUmVxLWV4dGVuc2lvbgkJCVJlbDk4LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24JCQlPUFRJT05BTCwJCisJLS0gUmVsZWFzZSA1IGV4dGVuc2lvbiBlbGVtZW50CityZWw1LU1zclBvc2l0aW9uLVJlcS1leHRlbnNpb24JCQlSZWw1LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24JCQlPUFRJT05BTCwKKwktLSBSZWxlYXNlIDcgZXh0ZW5zaW9uIGVsZW1lbnQKK3JlbDctTXNyUG9zaXRpb24tUmVxLWV4dGVuc2lvbgkJCVJlbDctTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbgkJCU9QVElPTkFMCit9CisKKy0tIE1lYXN1cmVtZW50IFBvc2l0aW9uIHJlc3BvbnNlIGNvbXBvbmVudAorTXNyUG9zaXRpb24tUnNwIDo6PSBTRVFVRU5DRSB7CisJbXVsdGlwbGVTZXRzCQkJTXVsdGlwbGVTZXRzCQkJT1BUSU9OQUwsCisJcmVmZXJlbmNlSWRlbnRpdHkJCVJlZmVyZW5jZUlkZW50aXR5CQlPUFRJT05BTCwKKwlvdGQtTWVhc3VyZUluZm8JCQlPVEQtTWVhc3VyZUluZm8JCQlPUFRJT05BTCwKKwlsb2NhdGlvbkluZm8JCQlMb2NhdGlvbkluZm8JCQlPUFRJT05BTCwKKwlncHMtTWVhc3VyZUluZm8JCQlHUFMtTWVhc3VyZUluZm8JCQlPUFRJT05BTCwKKwlsb2NhdGlvbkVycm9yCQkJTG9jYXRpb25FcnJvcgkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCQorCS0tIFJlbGVhc2UgZXh0ZW5zaW9uIGhlcmUKKwlyZWwtOTgtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgkJCisJCQkJCQkJUmVsLTk4LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24JCU9QVElPTkFMLAorCXJlbC01LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24KKwkJCQkJCQlSZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCQlPUFRJT05BTCwKKwktLSByZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIGFuZCBvdGhlciBwb3NzaWJsZSBmdXR1cmUgZXh0ZW5zaW9ucworCS0tIGFyZSB0aGUgb25seSBpbmZvcm1hdGlvbiBlbGVtZW50cyB0aGF0IG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgMm5kCisJLS0gTXNyUG9zaXRpb24tUnNwIGNvbXBvbmVudCB3aGVuIFJSTFAgcHNldWRvLXNlZ21lbnRhdGlvbiBpcyB1c2VkCisJcmVsLTctTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgorCQkJCQkJCVJlbC03LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24JCU9QVElPTkFMCit9CisKKy0tIEFzc2lzdGFuY2UgRGF0YSBjb21wb25lbnQKK0Fzc2lzdGFuY2VEYXRhIDo6PSBTRVFVRU5DRSB7CisJcmVmZXJlbmNlQXNzaXN0RGF0YQlSZWZlcmVuY2VBc3Npc3REYXRhCQkJT1BUSU9OQUwsCisJbXNyQXNzaXN0RGF0YQkJCU1zckFzc2lzdERhdGEJCQlPUFRJT05BTCwKKwlzeXN0ZW1JbmZvQXNzaXN0RGF0YQlTeXN0ZW1JbmZvQXNzaXN0RGF0YQlPUFRJT05BTCwKKwlncHMtQXNzaXN0RGF0YQkJCUdQUy1Bc3Npc3REYXRhCQkJT1BUSU9OQUwsCQorCW1vcmVBc3NEYXRhVG9CZVNlbnQJCU1vcmVBc3NEYXRhVG9CZVNlbnQJCU9QVElPTkFMLAktLSBJZiBub3QgcHJlc2VudCwgaW50ZXJwcmV0IGFzIG9ubHkKKwkJCQkJCQkJCQkJCQkJCQktLSBBc3Npc3RhbmNlIERhdGEgY29tcG9uZW50IHVzZWQgdG8KKwkJCQkJCQkJCQkJCQkJCQktLSBkZWxpdmVyIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZQorCQkJCQkJCQkJCQkJCQkJCS0tIGRhdGEuCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIJCU9QVElPTkFMLAorCS4uLiwKKwktLSBSZWxlYXNlIGV4dGVuc2lvbiBoZXJlCisJcmVsOTgtQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uCVJlbDk4LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglPUFRJT05BTCwKKwlyZWw1LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglSZWw1LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglPUFRJT05BTCwKKyByZWw3LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiBSZWw3LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiBPUFRJT05BTAkKK30KKworLS0gUHJvdG9jb2wgRXJyb3IgY29tcG9uZW50CitQcm90b2NvbEVycm9yIDo6PSBTRVFVRU5DRSB7CisJZXJyb3JDYXVzZQkJCQlFcnJvckNvZGVzLAkKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAorCS0tIFJlbGVhc2UgZXh0ZW5zaW9ucyBoZXJlCisJcmVsLTUtUHJvdG9jb2xFcnJvci1FeHRlbnNpb24gUmVsLTUtUHJvdG9jb2xFcnJvci1FeHRlbnNpb24JCU9QVElPTkFMCit9CisKKy0tIFBvc2l0aW9uIGluc3RydWN0aW9ucworUG9zaXRpb25JbnN0cnVjdCA6Oj0gU0VRVUVOQ0UgeworCS0tIE1ldGhvZCB0eXBlCisJbWV0aG9kVHlwZQkJCQlNZXRob2RUeXBlLAkKKwlwb3NpdGlvbk1ldGhvZAkJCVBvc2l0aW9uTWV0aG9kLAorCW1lYXN1cmVSZXNwb25zZVRpbWUJCU1lYXN1cmVSZXNwb25zZVRpbWUsCQkKKwl1c2VNdWx0aXBsZVNldHMJCQlVc2VNdWx0aXBsZVNldHMsCQkKKwllbnZpcm9ubWVudENoYXJhY3RlcglFbnZpcm9ubWVudENoYXJhY3RlcglPUFRJT05BTAkKK30KKworLS0KK01ldGhvZFR5cGUgOjo9IENIT0lDRSB7CisJbXNBc3Npc3RlZAkJQWNjdXJhY3lPcHQsCS0tIGFjY3VyYWN5IGlzIG9wdGlvbmFsCisJbXNCYXNlZAkJCUFjY3VyYWN5LAkJLS0gYWNjdXJhY3kgaXMgbWFuZGF0b3J5CisJbXNCYXNlZFByZWYJCUFjY3VyYWN5LAkJLS0gYWNjdXJhY3kgaXMgbWFuZGF0b3J5CisJbXNBc3Npc3RlZFByZWYJQWNjdXJhY3kgCQktLSBhY2N1cmFjeSBpcyBtYW5kYXRvcnkKK30KKworLS0gQWNjdXJhY3kgb2YgdGhlIGxvY2F0aW9uIGVzdGltYXRpb24KK0FjY3VyYWN5T3B0IDo6PSBTRVFVRU5DRSB7CisJYWNjdXJhY3kJCUFjY3VyYWN5CU9QVElPTkFMCit9CisKKy0tIFRoZSB2YWx1ZXMgb2YgdGhpcyBmaWVsZCBhcmUgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMiAoVW5jZXJ0YWludHkgY29kZSkKK0FjY3VyYWN5IDo6PSBJTlRFR0VSICgwLi4xMjcpCisKKworLS0gUG9zaXRpb24gTWV0aG9kCitQb3NpdGlvbk1ldGhvZCA6Oj0gRU5VTUVSQVRFRCB7CisJZW90ZCAoMCksCisJZ3BzICgxKSwKKwlncHNPckVPVEQgKDIpCit9CisKKy0tIE1lYXN1cmVtZW50IHJlcXVlc3QgcmVzcG9uc2UgdGltZQorTWVhc3VyZVJlc3BvbnNlVGltZSA6Oj0gSU5URUdFUiAoMC4uNykKKworLS0gdXNlTXVsdGlwbGUgU2V0cywgRkZTIQorVXNlTXVsdGlwbGVTZXRzIDo6PSBFTlVNRVJBVEVEIHsKKwltdWx0aXBsZVNldHMgKDApLAkJLS0gbXVsdGlwbGUgc2V0cyBhcmUgYWxsb3dlZAorCW9uZVNldCAoMSkJCQkJLS0gc2VuZGluZyBvZiBtdWx0aXBsZSBpcyBub3QgYWxsb3dlZAorfQorCistLSBFbnZpcm9ubWVudCBjaGFyYWN0ZXJpemF0aW9uCitFbnZpcm9ubWVudENoYXJhY3RlciA6Oj0gRU5VTUVSQVRFRCB7CisJYmFkQXJlYSAoMCksCQktLSBiYWQgdXJiYW4gb3Igc3VidXJiYW4sIGhlYXZ5IG11bHRpcGF0aCBhbmQgTkxPUworCW5vdEJhZEFyZWEgKDEpLAkJLS0gbGlnaHQgbXVsdGlwYXRoIGFuZCBOTE9TCisJbWl4ZWRBcmVhICgyKSwJCS0tIG5vdCBkZWZpbmVkIG9yIG1peGVkIGVudmlyb25tZW50CisJLi4uCit9CisKKy0tIEUtT1REIHJlZmVyZW5jZSBCVFMgZm9yIEFzc2l0YW5jZSBkYXRhIElFCitSZWZlcmVuY2VBc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCUJDQ0hDYXJyaWVyLAkJCQkJCS0tIEJDQ0ggY2FycmllcgorCWJzaWMJCQlCU0lDLAkJCQkJCQkJLS0gQlNJQworCXRpbWVTbG90U2NoZW1lCVRpbWVTbG90U2NoZW1lLCAJCQkJCS0tIFRpbWVzbG90IHNjaGVtZQorCWJ0c1Bvc2l0aW9uCQlCVFNQb3NpdGlvbgkJCU9QVElPTkFMCit9CisKKy0tIGVsbGlwc29pZCBwb2ludCBhbmQKKy0tIGVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQgc2hhcGVzIGFyZSBzdXBwb3J0ZWQKK0JUU1Bvc2l0aW9uIDo6PSBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24KKworLS0gUkYgY2hhbm5lbCBudW1iZXIgb2YgQkNDSAorQkNDSENhcnJpZXIgOjo9IElOVEVHRVIgKDAuLjEwMjMpCisKKy0tIEJhc2Ugc3RhdGlvbiBJZGVudGl0eSBDb2RlCitCU0lDIDo6PSBJTlRFR0VSICgwLi42MykKKworLS0gVGltZXNsb3Qgc2NoZW1lCitUaW1lU2xvdFNjaGVtZSA6Oj0gRU5VTUVSQVRFRCB7CisJZXF1YWxMZW5ndGggKDApLAorCXZhcmlvdXNMZW5ndGggKDEpCit9CisKKy0tIFRpbWUgc2xvdCAobW9kdWxvKQorTW9kdWxvVGltZVNsb3QgOjo9IElOVEVHRVIgKDAuLjMpCisKKy0tIEUtT1REIG1lYXN1cmVtZW50IGFzc2lzdGFuY2UgZGF0YSBJRQorLS0gVGhlIHRvdGFsIG51bWJlciBvZiBuZWlnaGJvcnMgaW4gdGhpcyBlbGVtZW50IChNc3JBc3Npc3REYXRhKQorLS0gYW5kIGluIFN5c3RlbUluZm9Bc3Npc3REYXRhIGVsZW1lbnQgKHByZXNlbnRlZCBuZWlnaGJvcnMKKy0tIGNhbiBiZSBhdCBhIG1heGltdW0gMTUhKQorTXNyQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCSBtc3JBc3Npc3RMaXN0IFNlcU9mTXNyQXNzaXN0QlRTCit9CitTZXFPZk1zckFzc2lzdEJUUyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTUpKSBPRiBNc3JBc3Npc3RCVFMKKworTXNyQXNzaXN0QlRTIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCQlCQ0NIQ2FycmllciwJCS0tIEJDQ0ggY2FycmllcgorCWJzaWMJCQkJQlNJQywJCQkJLS0gQlNJQworCW11bHRpRnJhbWVPZmZzZXQJTXVsdGlGcmFtZU9mZnNldCwgCS0tIG11bHRpZnJhbWUgb2Zmc2V0CisJdGltZVNsb3RTY2hlbWUJCVRpbWVTbG90U2NoZW1lLAkJLS0gVGltZXNsb3Qgc2NoZW1lCisJcm91Z2hSVEQJCQlSb3VnaFJURCwJCQktLSByb3VnaCBSVEQgdmFsdWUKKworCS0tIExvY2F0aW9uIENhbGN1bGF0aW9uIEFzc2lzdGFuY2UgZGF0YSBpcyBtb3ZlZCBoZXJlCisJY2FsY0Fzc2lzdGFuY2VCVFMJQ2FsY0Fzc2lzdGFuY2VCVFMJT1BUSU9OQUwKK30KKworLS0gTXVsdGlmcmFtZSBvZmZzZXQKK011bHRpRnJhbWVPZmZzZXQgOjo9IElOVEVHRVIgKDAuLjUxKQorLS0gVGhlIE11bHRpZnJhbWUgT2Zmc2V0IHZhbHVlIDUxIHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSB0cmFuc21pdHRpbmcgZW50aXR5IGFuZAorLS0gc2hhbGwgYmUgdHJlYXRlZCBieSB0aGUgcmVjZWl2aW5nIGVudGl0eSBhcyAwLgorCistLSBSb3VnaCBSVEQgdmFsdWUgYmV0d2VlbiBvbmUgYmFzZSBzdGF0aW9uIGFuZCByZWZlcmVuY2UgQlRTCitSb3VnaFJURCA6Oj0gSU5URUdFUiAoMC4uMTI1MCkKKy0tIFRoZSBSb3VnaFJURCB2YWx1ZSAxMjUwIHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSB0cmFuc21pdHRpbmcgZW50aXR5IGFuZCBzaGFsbAorLS0gYmUgdHJlYXRlZCBieSB0aGUgcmVjZWl2aW5nIGVudGl0eSBhcyAwLgorCistLSBFLU9URCBNZWFzdXJlbWVudCBhc3Npc3RhbmNlIGRhdGEgZm9yIHN5c3RlbSBpbmZvcm1hdGlvbiBMaXN0IElFCistLSBUaGUgdG90YWwgbnVtYmVyIG9mIGJhc2Ugc3RhdGlvbnMgaW4gdGhpcyBlbGVtZW50IChTeXN0ZW1JbmZvQXNzaXN0RGF0YQorLS0gcHJlc2VudGVkIG5laWdoYm9ycykgYW5kIGluIE1zckFzc2lzdERhdGEgZWxlbWVudCBjYW4gYmUgYXQgYSBtYXhpbXVtIDE1LgorU3lzdGVtSW5mb0Fzc2lzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwlzeXN0ZW1JbmZvQXNzaXN0TGlzdCAJU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTCit9CitTZXFPZlN5c3RlbUluZm9Bc3Npc3RCVFM6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMzIpKSBPRiBTeXN0ZW1JbmZvQXNzaXN0QlRTCisKKy0tIHdoZXRoZXIgbi50aCBpcyBwcmVzZW50IG9yIG5vdCA/CitTeXN0ZW1JbmZvQXNzaXN0QlRTIDo6PSBDSE9JQ0UgeworCW5vdFByZXNlbnQJCU5VTEwsCisJcHJlc2VudAkJCUFzc2lzdEJUU0RhdGEKK30KKworLS0gQWN0dWFsIGFzc2lzdGFuY2UgZGF0YSBmb3Igc3lzdGVtIGluZm9ybWF0aW9uIGJhc2Ugc3RhdGlvbgorQXNzaXN0QlRTRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWJzaWMJCQkJQlNJQywJCQkJLS0gQlNJQworCW11bHRpRnJhbWVPZmZzZXQJTXVsdGlGcmFtZU9mZnNldCwJLS0gbXVsdGlmcmFtZSBvZmZzZXQKKwl0aW1lU2xvdFNjaGVtZQkJVGltZVNsb3RTY2hlbWUsCQktLSBUaW1lc2xvdCBzY2hlbWUKKwlyb3VnaFJURAkJCVJvdWdoUlRELAkJCS0tIHJvdWdoIFJURCB2YWx1ZQorCisJLS0gTG9jYXRpb24gQ2FsY3VsYXRpb24gQXNzaXN0YW5jZSBkYXRhCisJY2FsY0Fzc2lzdGFuY2VCVFMJQ2FsY0Fzc2lzdGFuY2VCVFMJT1BUSU9OQUwKK30KKworLS0gRS1PVEQgTG9jYXRpb24gY2FsY3VsYXRpb24gYXNzaXN0YW5jZSBkYXRhLAorLS0gQ2FsY0Fzc2lzdGFuY2VCVFMgZWxlbWVudCBpcyBvcHRpb25hbCBub3Qgc3ViZmllbGRzCitDYWxjQXNzaXN0YW5jZUJUUyA6Oj0gU0VRVUVOQ0UgeworCWZpbmVSVEQJCQkJRmluZVJURCwJCS0tIGZpbmUgUlREIHZhbHVlIGJldHdlZW4gYmFzZSBzdGF0aW9ucworCXJlZmVyZW5jZVdHUzg0CQlSZWZlcmVuY2VXR1M4NAktLSByZWZlcmVuY2UgY29vcmRpbmF0ZXMKK30KKworLS0gQ29vcmRpbmF0ZXMgb2YgbmVpZ2hib3VyIEJUUywgV0dTLTg0IGVsbGlwc29pZAorUmVmZXJlbmNlV0dTODQgOjo9IFNFUVVFTkNFIHsKKwlyZWxhdGl2ZU5vcnRoCVJlbERpc3RhbmNlLAkJCQktLSByZWxhdGl2ZSBkaXN0YW5jZSAoc291dGggbmVnYXRpdmUpCisJcmVsYXRpdmVFYXN0CVJlbERpc3RhbmNlLAkJCQktLSByZWxhdGl2ZSBkaXN0YW5jZSAod2VzdCBuZWdhdGl2ZSkKKwktLSBSZWxhdGl2ZSBBbHRpdHVkZSBpcyBub3QgYWx3YXlzIGtub3duCisJcmVsYXRpdmVBbHQJCVJlbGF0aXZlQWx0CQlPUFRJT05BTAktLSByZWxhdGl2ZSBhbHRpdHVkZQorfQorCistLSBGaW5lIFJURCB2YWx1ZSBiZXR3ZWVuIHRoaXMgQlRTIGFuZCB0aGUgcmVmZXJlbmNlIEJUUwkKK0ZpbmVSVEQgOjo9IElOVEVHRVIgKDAuLjI1NSkKKworLS0gUmVsYXRpdmUgbm9ydGgvZWFzdCBkaXN0YW5jZQorUmVsRGlzdGFuY2UgOjo9IElOVEVHRVIgKC0yMDAwMDAuLjIwMDAwMCkKKworLS0gUmVsYXRpdmUgYWx0aXR1ZGUKK1JlbGF0aXZlQWx0IDo6PSBJTlRFR0VSICgtNDAwMC4uNDAwMCkKKworLS0gTWVhc3VyZSBwb3NpdGlvbiByZXNwb25zZSBJRXMKKy0tIFJlZmVyZW5jZSBJZGVudGl0eQorLS0gTXVsdGlwbGUgc2V0cworTXVsdGlwbGVTZXRzIDo6PSBTRVFVRU5DRSB7CisJLS0gbnVtYmVyIG9mIHJlZmVyZW5jZSBzZXRzCisJbmJyT2ZTZXRzCQkJSU5URUdFUiAoMi4uMyksCQkKKworCS0tIFRoaXMgZmllbGQgYWN0dWFsbHkgdGVsbHMgdGhlIG51bWJlciBvZiByZWZlcmVuY2UgQlRTcworCW5ick9mUmVmZXJlbmNlQlRTcwlJTlRFR0VSICgxLi4zKSwKKworCS0tIFRoaXMgZmllbGQgaXMgY29uZGl0aW9uYWwgYW5kIGluY2x1ZGVkIG9wdGlvbmFsbHkgb25seSBpZgorCS0tIG5ick9mU2V0cyBpcyAzIGFuZCBudW1iZXIgb2YgcmVmZXJlbmNlIEJUU3MgaXMgMi4KKwlyZWZlcmVuY2VSZWxhdGlvbgkJUmVmZXJlbmNlUmVsYXRpb24JCU9QVElPTkFMCit9CisKKy0tIFJlbGF0aW9uIGJldHdlZW4gcmVmZW5jZSBCVFNzIGFuZCBzZXRzCitSZWZlcmVuY2VSZWxhdGlvbiA6Oj0gRU5VTUVSQVRFRCB7CisJc2Vjb25kQlRTVGhpcmRTZXQgKDApLAktLSAxc3QgQlRTIHJlbGF0ZWQgdG8gMXN0IGFuZCAybmQgc2V0cworCXNlY29uZEJUU1NlY29uZFNldCAoMSksCS0tIDFzdCBCVFMgcmVsYXRlZCB0byAxc3QgYW5kIDNyZCBzZXRzCisJZmlyc3RCVFNGaXJzdFNldCAoMikJLS0gMXN0IEJUUyByZWxhdGVkIHRvIDFzdCBzZXQKK30KKworLS0gUmVmZXJlbmNlIEJUUyBJZGVudGl0eSwgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG51bWJlciBvZgorLS0gQlRTcyB0b2xkIG5ick9mUmVmZXJlbmNlQlRTcyBmaWVsZCBpbiBNdWx0aXBsZSBzZXRzIGVsZW1lbnQpCitSZWZlcmVuY2VJZGVudGl0eSA6Oj0gU0VRVUVOQ0UgeworCS0tIFJlZmVyZW5jZSBCVFMgbGlzdAorCXJlZkJUU0xpc3QJCVNlcU9mUmVmZXJlbmNlSWRlbnRpdHlUeXBlCit9CitTZXFPZlJlZmVyZW5jZUlkZW50aXR5VHlwZSA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMykpIE9GIFJlZmVyZW5jZUlkZW50aXR5VHlwZQorCistLSBDZWxsIGlkZW50aXR5CitSZWZlcmVuY2VJZGVudGl0eVR5cGUgOjo9IENIT0lDRSB7CisJYnNpY0FuZENhcnJpZXIJQlNJQ0FuZENhcnJpZXIsCQktLSBCU0lDIGFuZCBDYXJyaWVyCisJY2kJCQkJQ2VsbElELAkJCQktLSBDZWxsIElELCBMQUMgbm90IG5lZWRlZAorCXJlcXVlc3RJbmRleAlSZXF1ZXN0SW5kZXgsCQktLSBJbmRleCB0byBSZXF1ZXN0ZWQgTmVpZ2hib3IgTGlzdAorCXN5c3RlbUluZm9JbmRleAlTeXN0ZW1JbmZvSW5kZXgsCS0tIEluZGV4IHRvIFN5c3RlbSBpbmZvIGxpc3QsIHRoaXMgdHlwZSBvZiByZWYuIGlkZW50aXR5CisJCQkJCQkJCQkJLS0gc2hhbGwgbm90IGJlIHVzZWQgYnkgdGhlIE1TIHVubGVzcyBpdCBoYXMgcmVjZWl2ZWQKKwkJCQkJCQkJCQktLSB0aGUgU3lzdGVtSW5mb0Fzc2lzdERhdGEgZnJvbSB0aGUgU01MQyBmb3IgdGhpcyBjZWxsLgorCWNpQW5kTEFDCQlDZWxsSURBbmRMQUMJCS0tIENJIGFuZCBMQUMKK30KKworQlNJQ0FuZENhcnJpZXIgOjo9IFNFUVVFTkNFIHsKKwljYXJyaWVyCUJDQ0hDYXJyaWVyLAorCWJzaWMJCUJTSUMKK30KKworUmVxdWVzdEluZGV4IDo6PSBJTlRFR0VSICgxLi4xNikKKworU3lzdGVtSW5mb0luZGV4IDo6PSBJTlRFR0VSICgxLi4zMikKKworQ2VsbElEQW5kTEFDIDo6PSBTRVFVRU5DRSB7CisJcmVmZXJlbmNlTEFDCUxBQ0lELAkJCQktLSBMb2NhdGlvbiBhcmVhIGNvZGUKKwlyZWZlcmVuY2VDSQkJQ2VsbElECQkJCS0tIENlbGwgaWRlbnRpdHkKK30KK0NlbGxJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCitMQUNJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCisKKy0tIE9URC1NZWFzdXJlSW5mbworT1RELU1lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7CisJLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cywgT1RELU1zckVsZW1lbnQgaXMgcmVwZWF0ZWQgbnVtYmVyIG9mIHRpbWVzCisJLS0gdG9sZCBpbiBuYnJPZlJlZmVyZW5jZUJUU3MgaW4gTXVsdGlwbGVTZXRzLCBkZWZhdWx0IHZhbHVlIGlzIDEKKwlvdGRNc3JGaXJzdFNldHMJCU9URC1Nc3JFbGVtZW50Rmlyc3QsCisKKwktLSBpZiBtb3JlIHRoYW4gb25lIHNldHMgYXJlIHByZXNlbnQgdGhpcyBlbGVtZW50IGlzIHJlcGVhdGVkCisJLS0gTnVtYmVyT2ZTZXRzIC0gMSAoLTEgPSBmaXJzdCBzZXQpCisJb3RkTXNyUmVzdFNldHMJCVNlcU9mT1RELU1zckVsZW1lbnRSZXN0CQlPUFRJT05BTAorfQorCitTZXFPZk9URC1Nc3JFbGVtZW50UmVzdCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMikpIE9GIE9URC1Nc3JFbGVtZW50UmVzdAorCistLSBPVEQgbWVhc3VyZW50IGluZm9ybWF0aW9uIGZvciAxIHNldAorT1RELU1zckVsZW1lbnRGaXJzdCA6Oj0gU0VRVUVOQ0UgeworCXJlZkZyYW1lTnVtYmVyCQkJSU5URUdFUiAoMC4uNDI0MzEpLCAJCQkJLS0gRnJhbWUgbnVtYmVyIG1vZHVsbyA0MjQzMgorCXJlZmVyZW5jZVRpbWVTbG90CQlNb2R1bG9UaW1lU2xvdCwKKwl0b2FNZWFzdXJlbWVudHNPZlJlZglUT0EtTWVhc3VyZW1lbnRzT2ZSZWYJT1BUSU9OQUwsCisJc3RkUmVzb2x1dGlvbgkJCVN0ZFJlc29sdXRpb24sCisJdGFDb3JyZWN0aW9uCQkJSU5URUdFUiAoMC4uOTYwKQkJT1BUSU9OQUwsCS0tIFRBIGNvcnJlY3Rpb24KKworCS0tIG1lYXN1cmVkIG5laWdoYm9ycyBpbiBPVEQgbWVhc3VyZW1lbnRzCisJb3RkLUZpcnN0U2V0TXNycyAJCVNlcU9mT1RELUZpcnN0U2V0TXNycyAJT1BUSU9OQUwKK30KK1NlcU9mT1RELUZpcnN0U2V0TXNycyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTApKSBPRiBPVEQtRmlyc3RTZXRNc3JzCisKKy0tIE9URCBtZWFzdXJlbnQgaW5mb3JtYXRpb24gMiBhbmQgMyBzZXRzIGlmIGV4aXN0CitPVEQtTXNyRWxlbWVudFJlc3QgOjo9IFNFUVVFTkNFIHsKKwlyZWZGcmFtZU51bWJlcgkJCUlOVEVHRVIgKDAuLjQyNDMxKSwgCQkJCQktLSBGcmFtZSBudW1iZXIgbW9kdWxvIDQyNDMyCisJcmVmZXJlbmNlVGltZVNsb3QJCU1vZHVsb1RpbWVTbG90LAorCXRvYU1lYXN1cmVtZW50c09mUmVmCVRPQS1NZWFzdXJlbWVudHNPZlJlZgkJT1BUSU9OQUwsCisJc3RkUmVzb2x1dGlvbgkJCVN0ZFJlc29sdXRpb24sCisJdGFDb3JyZWN0aW9uCQkJSU5URUdFUiAoMC4uOTYwKQkJCU9QVElPTkFMLAktLSBUQSBjb3JyZWN0aW9uCisKKwktLSBtZWFzdXJlZCBuZWlnaGJvcnMgaW4gT1REIG1lYXN1cmVtZW50cworCW90ZC1Nc3JzT2ZPdGhlclNldHMgCVNlcU9mT1RELU1zcnNPZk90aGVyU2V0cwlPUFRJT05BTAorfQorU2VxT2ZPVEQtTXNyc09mT3RoZXJTZXRzIDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xMCkpIE9GIE9URC1Nc3JzT2ZPdGhlclNldHMKKworLS0gU3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBUT0EgbWVhc3VyZW1lbnRzIGZyb20gdGhlIHJlZmVyZW5jZSBCVFMKK1RPQS1NZWFzdXJlbWVudHNPZlJlZiA6Oj0gU0VRVUVOQ0UgeworCXJlZlF1YWxpdHkJCQlSZWZRdWFsaXR5LAorCW51bU9mTWVhc3VyZW1lbnRzCU51bU9mTWVhc3VyZW1lbnRzCit9CisKK1JlZlF1YWxpdHkgOjo9IElOVEVHRVIgKDAuLjMxKQkJCS0tIFN0IERldiBvZiBUT0Egb2YgcmVmZXJlbmNlIGFzIGRlZmluZWQgaW4gYW5uZXgKK051bU9mTWVhc3VyZW1lbnRzIDo6PSBJTlRFR0VSICgwLi43KQktLSBOby4gb2YgbWVhc3VyZW1lbnRzIGZvciBSZWZRdWFsaXR5IGFzIGRlZmluZWQgaW4gYW5uZXgKK1N0ZFJlc29sdXRpb24gOjo9IElOVEVHRVIgKDAuLjMpCQktLSBWYWx1ZXMgb2YgcmVzb2x1dGlvbiBhcmUgZGVmaW5lZCBpbiBhbm5leAorCitPVEQtRmlyc3RTZXRNc3JzIDo6PSBPVEQtTWVhc3VyZW1lbnRXaXRoSUQKKworLS0gTmVpZ2hib3VyIGluZm8gaW4gT1REIG1lYXN1cmVtZW50cyAwLTEwIHRpbWVzIGluIFREIG1lYXN1cmVtZW50IGluZm8KK09URC1Nc3JzT2ZPdGhlclNldHMgOjo9IENIT0lDRSB7CisJaWRlbnRpdHlOb3RQcmVzZW50CU9URC1NZWFzdXJlbWVudCwJCisJaWRlbnRpdHlQcmVzZW50CQlPVEQtTWVhc3VyZW1lbnRXaXRoSUQKK30KKworLS0gRm9yIHRoaXMgT1REIG1lYXN1cmVtZW50IGlkZW50aXR5IGlzIHNhbWUgYXMgdGhlIGlkZW50aXR5IG9mIEJUUworLS0gaW4gdGhlIGZpcnN0IHNldCB3aXRoIHNhbWUgc2VxdWVuY2UgbnVtYmVyCitPVEQtTWVhc3VyZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwluYm9yVGltZVNsb3QJTW9kdWxvVGltZVNsb3QsCisJZW90ZFF1YWxpdHkJCUVPVERRdWFsaXR5LAorCW90ZFZhbHVlCQlPVERWYWx1ZQorfQorCistLSBUaGlzIG1lYXN1cmVtZW50IGNvbnRhaW5zIHRoZSBCVFMgaWRlbnRpdHkgYW5kIG1lYXN1cmVtZW50CitPVEQtTWVhc3VyZW1lbnRXaXRoSUQgOjo9U0VRVUVOQ0UgeworCW5laWdoYm9ySWRlbnRpdHkJTmVpZ2hib3JJZGVudGl0eSwKKwluYm9yVGltZVNsb3QJCU1vZHVsb1RpbWVTbG90LAorCWVvdGRRdWFsaXR5CQkJRU9URFF1YWxpdHksCisJb3RkVmFsdWUJCQlPVERWYWx1ZQorfQorCitFT1REUXVhbGl0eSA6Oj0gU0VRVUVOQ0UgeworCW5ick9mTWVhc3VyZW1lbnRzCUlOVEVHRVIJKDAuLjcpLAorCXN0ZE9mRU9URAkJCUlOVEVHRVIgKDAuLjMxKQorfQorCitOZWlnaGJvcklkZW50aXR5IDo6PSBDSE9JQ0UgeworCWJzaWNBbmRDYXJyaWVyCQlCU0lDQW5kQ2FycmllciwJCS0tIEJTSUMgYW5kIENhcnJpZXIKKwljaQkJCQkJQ2VsbElELAkJCQktLSBDZWxsIElELCBMQUMgbm90IG5lZWRlZAorCW11bHRpRnJhbWVDYXJyaWVyCU11bHRpRnJhbWVDYXJyaWVyLCAJLS0gTXVsdGlGcmFtZU9mZmVzdCBhbmQgQlNJQworCXJlcXVlc3RJbmRleAkJUmVxdWVzdEluZGV4LAkJLS0gSW5kZXggdG8gUmVxdWVzdGVkIE5laWdoYm9yIExpc3QKKwlzeXN0ZW1JbmZvSW5kZXgJCVN5c3RlbUluZm9JbmRleCwJLS0gSW5kZXggdG8gU3lzdGVtIGluZm8gbGlzdCwgdGhpcyB0eXBlIG9mIG5laWdoYm91cgorCQkJCQkJCQkJCQktLSBpZGVudGl0eSBzaGFsbCBub3QgYmUgdXNlZCBieSB0aGUgTVMgdW5sZXNzIGl0IGhhcworCQkJCQkJCQkJCQktLSByZWNlaXZlZCB0aGUgU3lzdGVtSW5mb0Fzc2lzdERhdGEgZnJvbSB0aGUgU01MQyBmb3IKKwkJCQkJCQkJCQkJLS0gdGhpcyBjZWxsLgorCWNpQW5kTEFDCQkJQ2VsbElEQW5kTEFDCQktLSBDSSBhbmQgTEFDCit9CisKKy0tIE11bHRpZnJhbWUgYW5kIGNhcnJpZXIKK011bHRpRnJhbWVDYXJyaWVyIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCQlCQ0NIQ2FycmllciwKKwltdWx0aUZyYW1lT2Zmc2V0CU11bHRpRnJhbWVPZmZzZXQKK30KKworLS0gT1REIG1lYXN1cmVtZW50IHZhbHVlIGZvciBuZWlnaGJvdXIKK09URFZhbHVlIDo6PSBJTlRFR0VSICgwLi4zOTk5OSkKKworLS0gTG9jYXRpb24gaW5mb3JtYXRpb24gSUUKK0xvY2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXJlZkZyYW1lCQlJTlRFR0VSICgwLi42NTUzNSksCQkJLS0gUmVmZXJlbmNlIEZyYW1lIG51bWJlcgorCS0tIElmIHJlZkZyYW1lIGlzIHdpdGhpbiAoNDI0MzIuLjY1NTM1KSwgaXQgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIKKwktLSBpbiB0aGF0IGNhc2UgdGhlIE1TIHNob3VsZCBwcm92aWRlIEdQUyBUT1cgaWYgYXZhaWxhYmxlCisJZ3BzVE9XCQkJSU5URUdFUiAoMC4uMTQzOTk5OTkpCU9QVElPTkFMLAktLSBHUFMgVE9XCisJZml4VHlwZQkJCUZpeFR5cGUsCisJLS0gTm90ZSB0aGF0IGFwcGxpY2FibGUgcmFuZ2UgZm9yIHJlZkZyYW1lIGlzIDAgLSA0MjQzMQorCS0tIFBvc3NpYmxlIHNoYXBlcyBjYXJyaWVkIGluIHBvc0VzdGltYXRlIGFyZQorCS0tIGVsbGlwc29pZCBwb2ludCwKKwktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKwktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBlbGxpcHNlCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggYWx0aXR1ZGUgYW5kIHVuY2VydGFpbnR5IGVsbGlwc29pZAorCXBvc0VzdGltYXRlCQlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24KK30KKworRml4VHlwZSA6Oj0gSU5URUdFUiB7CisJdHdvREZpeCAoMCksCisJdGhyZWVERml4ICgxKQorfSAoMC4uMSkKKworLS0gR1BTLU1lYXN1cmVtZW50IGluZm9ybWF0aW9uCitHUFMtTWVhc3VyZUluZm8gOjo9IFNFUVVFTkNFIHsKKwktLSBNZWFzdXJlbWVudCBpbmZvIGVsZW1lbnRzCisJLS0gdXNlciBoYXMgdG8gbWFrZSBzdXJlIHRoYXQgaW4gdGhpcyBlbGVtZW50IGlzIG51bWJlciBvZiBlbGVtZW50cworCS0tIGRlZmluZWQgaW4gcmVmZXJlbmNlIEJUUyBpZGVudGl0eQorCWdwc01zclNldExpc3QJU2VxT2ZHUFMtTXNyU2V0RWxlbWVudAkKK30KK1NlcU9mR1BTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMpKSBPRiBHUFMtTXNyU2V0RWxlbWVudAorCistLSBPVEQgbWVhc3VyZW50IGluZm9ybWF0aW9uIDEtMyB0aW1lcyBpbiBtZXNzYWdlCitHUFMtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXJlZkZyYW1lCQlJTlRFR0VSICgwLi42NTUzNSkJT1BUSU9OQUwsIAktLSBSZWZlcmVuY2UgRnJhbWUgbnVtYmVyCisJZ3BzVE9XCQkJR1BTVE9XMjRiLAkJCQkJCS0tIEdQUyBUT1cKKwktLSBOb3RlIHRoYXQgYXBwbGljYWJsZSByYW5nZSBmb3IgcmVmRnJhbWUgaXMgMCAtIDQyNDMxCisKKy0tTl9TQVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgZ3BzLW1zckxpc3QKKworCWdwcy1tc3JMaXN0CQlTZXFPZkdQUy1Nc3JFbGVtZW50Cit9CisKKy0tIDI0IGJpdCBwcmVzZW50YXRpb24gZm9yIEdQU1RPVworR1BTVE9XMjRiIDo6PSBJTlRFR0VSICgwLi4xNDM5OTk5OSkKKworLS0gbWVhc3VyZWQgZWxlbWVudHMgaW4gbWVhc3VyZW1lbnQgcGFyYW1ldGVycyBmaWVsZAorU2VxT2ZHUFMtTXNyRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBHUFMtTXNyRWxlbWVudAorCitHUFMtTXNyRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQlTYXRlbGxpdGVJRCwJCQkJLS0gU2F0ZWxsaXRlIGlkZW50aWZpZXIKKwljTm8JCQkJSU5URUdFUiAoMC4uNjMpLAkJCS0tIGNhcnJpZXIgbm9pc2UgcmF0aW8KKwlkb3BwbGVyCQkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksIAktLSBkb3BwbGVyLCBtdWxsdGlwbHkgYnkgMC4yCisJd2hvbGVDaGlwcwkJSU5URUdFUiAoMC4uMTAyMiksCQkJLS0gd2hvbGUgdmFsdWUgb2YgdGhlIGNvZGUgcGhhc2UgbWVhc3VyZW1lbnQKKwlmcmFjQ2hpcHMJCUlOVEVHRVIgKDAuLjEwMjQpLAkJCS0tIGZyYWN0aW9uYWwgdmFsdWUgb2YgdGhlIGNvZGUgcGhhc2UgbWVhc3VyZW1lbnQKKwkJCQkJCQkJCQkJLS0gYSB2YWx1ZSBvZiAxMDI0IHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSBzZW5kZXIKKwkJCQkJCQkJCQkJLS0gdGhlIHJlY2VpdmVyIHNoYWxsIGNvbnNpZGVyIGEgdmFsdWUgb2YgMTAyNCB0byBiZQorCQkJCQkJCQkJCQktLSBpbnZhbGlkIGRhdGEKKwltcGF0aEluZGljCQlNcGF0aEluZGljLAkJCQkJLS0gbXVsdGlwYXRoIGluZGljYXRvcgorCXBzZXVSYW5nZVJNU0VycglJTlRFR0VSICgwLi42MykJCQkJLS0gaW5kZXgJCQorfQorCistLSBNdWx0aXBhdGggaW5kaWNhdG9yCitNcGF0aEluZGljIDo6PSBFTlVNRVJBVEVEIHsKKwlub3RNZWFzdXJlZCAoMCksCisJbG93ICgxKSwKKwltZWRpdW0gKDIpLAorCWhpZ2ggKDMpCit9CisKKy0tIExvY2F0aW9uIGVycm9yIElFCitMb2NhdGlvbkVycm9yIDo6PSBTRVFVRU5DRSB7CisJbG9jRXJyb3JSZWFzb24JCQkJTG9jRXJyb3JSZWFzb24sCisJYWRkaXRpb25hbEFzc2lzdGFuY2VEYXRhCUFkZGl0aW9uYWxBc3Npc3RhbmNlRGF0YQlPUFRJT05BTCwKKwkuLi4KK30KKworTG9jRXJyb3JSZWFzb24gOjo9IEVOVU1FUkFURUQgeworCXVuRGVmaW5lZCAoMCksCQorCW5vdEVub3VnaEJUU3MgKDEpLAorCW5vdEVub3VnaFNhdHMgKDIpLAorCWVvdGRMb2NDYWxBc3NEYXRhTWlzc2luZyAoMyksCisJZW90ZEFzc0RhdGFNaXNzaW5nICg0KSwKKwlncHNMb2NDYWxBc3NEYXRhTWlzc2luZyAoNSksCisJZ3BzQXNzRGF0YU1pc3NpbmcgKDYpLAorCW1ldGhvZE5vdFN1cHBvcnRlZCAoNyksCisJbm90UHJvY2Vzc2VkICg4KSwKKwlyZWZCVFNGb3JHUFNOb3RTZXJ2aW5nQlRTICg5KSwKKwlyZWZCVFNGb3JFT1RETm90U2VydmluZ0JUUyAoMTApLAorCS4uLiwKKwlub3RFbm91Z2hHQU5TU1NhdHMgKDExKSwJCisgZ2Fuc3NBc3NEYXRhTWlzc2luZyAoMTIpLAorCXJlZkJUU0ZvckdBTlNTTm90U2VydmluZ0JUUyAoMTMpCit9CisKKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIGFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHZhbHVlIDAKKworCistLSBkZWZpbmVzIGFkZGl0aW9uYWwgYXNzaXN0YW5jZSBkYXRhIG5lZWRlZCBmb3IgYW55IG5ldyBsb2NhdGlvbiBhdHRlbXB0CistLSBNUyBzaGFsbCByZXRhaW4gYW55IGFzc2lzdGFuY2UgZGF0YSBhbHJlYWR5IHJlY2VpdmVkCitBZGRpdGlvbmFsQXNzaXN0YW5jZURhdGEgOjo9IFNFUVVFTkNFIHsKKwlncHNBc3Npc3RhbmNlRGF0YQkJR1BTQXNzaXN0YW5jZURhdGEJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCisJZ2Fuc3NBc3Npc3RhbmNlRGF0YSBHQU5TU0Fzc2lzdGFuY2VEYXRhIE9QVElPTkFMCit9CisKK0dQU0Fzc2lzdGFuY2VEYXRhIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEdQU0Fzc2lzdGFuY2VEYXRhKSkKKy0tIEdQU0Fzc2lzdGFuY2VEYXRhIGhhcyBpZGVudGljYWwgc3RydWN0dXJlIGFuZCBlbmNvZGluZyB0byBvY3RldHMgMyB0byBuIG9mIHRoZQorLS0gR1BTIEFzc2lzdGFuY2UgRGF0YSBJRSBpbiAzR1BQIFRTIDQ5LjAzMQorCittYXhHUFNBc3Npc3RhbmNlRGF0YQlJTlRFR0VSIDo6PSA0MAorCitHQU5TU0Fzc2lzdGFuY2VEYXRhIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEdBTlNTQXNzaXN0YW5jZURhdGEpKQorLS0gR0FOU1NBc3Npc3RhbmNlRGF0YSBoYXMgaWRlbnRpY2FsIHN0cnVjdHVyZSBhbmQgZW5jb2RpbmcgdG8gb2N0ZXRzIDMgdG8gbiBvZiB0aGUKKy0tIEdBTlNTIEFzc2lzdGFuY2UgRGF0YSBJRSBpbiAzR1BQIFRTIDQ5LjAzMQorCittYXhHQU5TU0Fzc2lzdGFuY2VEYXRhCUlOVEVHRVIgOjo9IDQwCisKKworLS0gUHJvdG9jb2wgRXJyb3IgQ2F1c2VzCitFcnJvckNvZGVzIDo6PSBFTlVNRVJBVEVEIHsKKwl1bkRlZmluZWQgKDApLAorbWlzc2luZ0NvbXBvbmV0ICgxKSwJCQkKK2luY29ycmVjdERhdGEgKDIpLAkJCQorbWlzc2luZ0lFb3JDb21wb25lbnRFbGVtZW50ICgzKSwJCQorbWVzc2FnZVRvb1Nob3J0ICg0KSwJCQkKK3Vua25vd1JlZmVyZW5jZU51bWJlciAoNSksCQkKKy4uLgorfQorCistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyB2YWx1ZSAwCisKKy0tIEdQUyBhc3Npc3RhbmNlIGRhdGEgSUUKK0dQUy1Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJY29udHJvbEhlYWRlcgkJQ29udHJvbEhlYWRlcgorfQorCistLSBNb3JlIEFzc2lzdGFuY2UgRGF0YSBUbyBCZSBTZW50IElFCistLSBNb3JlIEFzc2lzdGFuY2UgRGF0YSBDb21wb25lbnRzIE9uIHRoZSBXYXkgaW5kaWNhdGlvbiBmb3IgZGVsaXZlcnkgb2YgYW4gZW50aXJlIHNldCBvZiBhc3Npc3RhbmNlCistLSBkYXRhIGluIG11bHRpcGxlIEFzc2lzdGFuY2UgRGF0YSBjb21wb25lbnRzLgorCitNb3JlQXNzRGF0YVRvQmVTZW50IDo6PSBFTlVNRVJBVEVEIHsKKwlub01vcmVNZXNzYWdlcyAoMCksCQkJLS0gVGhpcyBpcyB0aGUgb25seSBvciBsYXN0IEFzc2lzdGFuY2UgRGF0YSBtZXNzYWdlIHVzZWQgdG8gZGVsaXZlcgorCQkJCQkJCQktLSB0aGUgZW50aXJlIHNldCBvZiBhc3Npc3RhbmNlIGRhdGEuCisJbW9yZU1lc3NhZ2VzT25UaGVXYXkgKDEpCS0tIFRoZSBTTUxDIHdpbGwgc2VuZCBtb3JlIEFzc2lzdGFuY2UgRGF0YSBtZXNzYWdlcyBvciBhIGZpbmFsIFJSTFAKKwkJCQkJCQkJLS0gTWVhc3VyZSBQb3NpdGlvbiBSZXF1ZXN0IG1lc3NhZ2UgdG8gZGVsaXZlciB0aGUKKwkJCQkJCQkJLS0gdGhlIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZSBkYXRhLgorfQorCistLSBDb250cm9sIGhlYWRlciBvZiB0aGUgR1BTIGFzc2lzdGFuY2UgZGF0YQorQ29udHJvbEhlYWRlciA6Oj0gU0VRVUVOQ0UgeworCisJLS0gRmllbGQgdHlwZSBQcmVzZW50IGluZm9ybWF0aW9uCisJcmVmZXJlbmNlVGltZQkJUmVmZXJlbmNlVGltZQkJT1BUSU9OQUwsCisJcmVmTG9jYXRpb24JCQlSZWZMb2NhdGlvbgkJCU9QVElPTkFMLAorCWRncHNDb3JyZWN0aW9ucwkJREdQU0NvcnJlY3Rpb25zCQlPUFRJT05BTCwKKwluYXZpZ2F0aW9uTW9kZWwJCU5hdmlnYXRpb25Nb2RlbAkJT1BUSU9OQUwsCisJaW9ub3NwaGVyaWNNb2RlbAkJSW9ub3NwaGVyaWNNb2RlbAkJT1BUSU9OQUwsCisJdXRjTW9kZWwJCQlVVENNb2RlbAkJCU9QVElPTkFMLAorCWFsbWFuYWMJCQlBbG1hbmFjCQkJT1BUSU9OQUwsCisJYWNxdWlzQXNzaXN0CQlBY3F1aXNBc3Npc3QJCU9QVElPTkFMLAorCXJlYWxUaW1lSW50ZWdyaXR5IFNlcU9mLUJhZFNhdGVsbGl0ZVNldCBPUFRJT05BTAorfQorCitSZWZlcmVuY2VUaW1lIDo6PSBTRVFVRU5DRSB7CisJZ3BzVGltZQkJCQlHUFNUaW1lLAorCWdzbVRpbWUJCQkJR1NNVGltZQkJCQlPUFRJT05BTCwKKwlncHNUb3dBc3Npc3QJCUdQU1RPV0Fzc2lzdAkJT1BUSU9OQUwKK30KKworLS0gR1BTIFRpbWUgaW5jbHVkZXMgd2VlayBudW1iZXIgYW5kIHRpbWUtb2Ytd2VlayAoVE9XKQorR1BTVGltZSA6Oj0gU0VRVUVOQ0UgeworCWdwc1RPVzIzYgkJCUdQU1RPVzIzYiwKKwlncHNXZWVrCQkJCUdQU1dlZWsKK30KKworLS0gR1BTVE9XLCByYW5nZSAwLTYwNDc5OS45MiwgcmVzb2x1dGlvbiAwLjA4IHNlYywgMjMtYml0IHByZXNlbnRhdGlvbgorR1BTVE9XMjNiIDo6PSBJTlRFR0VSICgwLi43NTU5OTk5KQorCistLSBHUFMgd2VlayBudW1iZXIKK0dQU1dlZWsgOjo9IElOVEVHRVIgKDAuLjEwMjMpCisKKy0tIEdQU1RPV0Fzc2lzdCBjb25zaXN0cyBvZiBUTE0gbWVzc2FnZSwgQW50aS1zcG9vZiBmbGFnLCBBbGVydCBmbGFnLCBhbmQgMiByZXNlcnZlZCBiaXRzIGluIFRMTSBXb3JkCistLSBmb3IgZWFjaCB2aXNpYmxlIHNhdGVsbGl0ZS4KKy0tIE5fU0FUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIGluIEdQU1RPV0Fzc2lzdAorR1BTVE9XQXNzaXN0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xMikpIE9GIEdQU1RPV0Fzc2lzdEVsZW1lbnQKKworR1BTVE9XQXNzaXN0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQkJU2F0ZWxsaXRlSUQsCisJdGxtV29yZAkJCQlUTE1Xb3JkLAorCWFudGlTcG9vZgkJCUFudGlTcG9vZkZsYWcsCisJYWxlcnQJCQkJQWxlcnRGbGFnLAorCXRsbVJzdmRCaXRzCQkJVExNUmVzZXJ2ZWRCaXRzCit9CisKKy0tIFRMTSBXb3JkLCAxNCBiaXRzCitUTE1Xb3JkIDo6PSBJTlRFR0VSICgwLi4xNjM4MykKKworLS0gQW50aS1TcG9vZiBmbGFnCitBbnRpU3Bvb2ZGbGFnIDo6PSBJTlRFR0VSICgwLi4xKQorCistLSBBbGVydCBmbGFnCitBbGVydEZsYWcgOjo9IElOVEVHRVIgKDAuLjEpCisKKy0tIFJlc2VydmVkIGJpdHMgaW4gVExNIHdvcmQsIE1TQiBvY2N1cnMgZWFybGllciBpbiBUTE0gV29yZCB0cmFuc21pdHRlZCBieSBzYXRlbGxpdGUKK1RMTVJlc2VydmVkQml0cyA6Oj0gSU5URUdFUiAoMC4uMykKKworR1NNVGltZSA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQlCQ0NIQ2FycmllciwJLS0gQkNDSCBjYXJyaWVyCisJYnNpYwkJCUJTSUMsCQkJLS0gQlNJQworCWZyYW1lTnVtYmVyCQlGcmFtZU51bWJlciwKKwl0aW1lU2xvdAkJVGltZVNsb3QsCisJYml0TnVtYmVyCQlCaXROdW1iZXIKK30KKworLS0gRnJhbWUgbnVtYmVyCitGcmFtZU51bWJlciA6Oj0gSU5URUdFUiAoMC4uMjA5NzE1MSkKKworLS0gVGltZSBzbG90IG51bWJlcgorVGltZVNsb3QgOjo9IElOVEVHRVIgKDAuLjcpCisKKy0tIEJpdCBudW1iZXIKK0JpdE51bWJlciA6Oj0gSU5URUdFUiAoMC4uMTU2KQorCisKKy0tIFJlZmVyZW5jZSBMb2NhdGlvbiBJRQorUmVmTG9jYXRpb24gOjo9IFNFUVVFTkNFIHsKKwl0aHJlZURMb2NhdGlvbgkJCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbgorfQorCistLSBER1BTIENvcnJlY3Rpb25zIElFCitER1BTQ29ycmVjdGlvbnMgOjo9IFNFUVVFTkNFIHsKKworCWdwc1RPVwkJSU5URUdFUiAoMC4uNjA0Nzk5KSwJLS0gREdQUyByZWZlcmVuY2UgdGltZQorCXN0YXR1cwkJSU5URUdFUiAoMC4uNyksCisJLS0gTl9TQVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2Ygc2F0TGlzdAorCXNhdExpc3QJCVNlcU9mU2F0RWxlbWVudCAJCit9CitTZXFPZlNhdEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi4xNikpIE9GIFNhdEVsZW1lbnQKKworLS0gbnVtYmVyIG9mIGNvcnJlY3Rpb24gZm9yIHNhdGVsbGl0ZXMKK1NhdEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzYXRlbGxpdGVJRAkJU2F0ZWxsaXRlSUQsCisKKworLS0tIFNlcXVlbmNlIG51bWJlciBmb3IgZXBoZW1lcmlzCisJaW9kZSAJCQlJTlRFR0VSICgwLi4yMzkpLAorCS0tIFVzZXIgRGlmZmVyZW50aWFsIFJhbmdlIEVycm9yCisJdWRyZQkJCUlOVEVHRVIgKDAuLjMpLAkJCisKKwktLSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiwgcmFuZ2UgaXMKKwktLSAtNjU1LjA0IC0gKzY1NS4wNCwKKwlwc2V1ZG9SYW5nZUNvcglJTlRFR0VSICgtMjA0Ny4uMjA0NyksIAkKKworCS0tIFBzZXVkbyBSYW5nZSBSYXRlIENvcnJlY3Rpb24sIHJhbmdlIGlzCisJLS0gLTQuMDY0IC0gKzQuMDY0LAorCXJhbmdlUmF0ZUNvcglJTlRFR0VSICgtMTI3Li4xMjcpLAorCistLSBEZWx0YSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiAyIAkKKwlkZWx0YVBzZXVkb1JhbmdlQ29yMiAJSU5URUdFUiAoLTEyNy4uMTI3KSwJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKKwkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCisJLS0gRGVsdGEgUHNldWRvIFJhbmdlIENvcnJlY3Rpb24gMgkKKwlkZWx0YVJhbmdlUmF0ZUNvcjIJCUlOVEVHRVIgKC03Li43KSwJCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCisJCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgorCS0tIERlbHRhIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uIDMKKwlkZWx0YVBzZXVkb1JhbmdlQ29yMyAJSU5URUdFUiAoLTEyNy4uMTI3KSwJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKKwkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCisJLS0gRGVsdGEgUHNldWRvIFJhbmdlIENvcnJlY3Rpb24gMworCWRlbHRhUmFuZ2VSYXRlQ29yMwkJSU5URUdFUiAoLTcuLjcpCQkJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKKwkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCit9CisKK1NhdGVsbGl0ZUlEIDo6PSBJTlRFR0VSICgwLi42MykJLS0gaWRlbnRpZmllcyBzYXRlbGxpdGUKKworLS0gTmF2aWdhdGlvbiBNb2RlbCBJRQorTmF2aWdhdGlvbk1vZGVsIDo6PSBTRVFVRU5DRSB7CisJbmF2TW9kZWxMaXN0CVNlcU9mTmF2TW9kZWxFbGVtZW50CQorfQorCistLSBuYXZpZ2F0aW9uIG1vZGVsIHNhdGVsbGl0ZSBsaXN0CitTZXFPZk5hdk1vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBOYXZNb2RlbEVsZW1lbnQKKworTmF2TW9kZWxFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc2F0ZWxsaXRlSUQJCVNhdGVsbGl0ZUlELAkJCQorCXNhdFN0YXR1cwkJU2F0U3RhdHVzCQktLSBzYXRlbGxpdGUgc3RhdHVzCit9CisKKy0tIHRoZSBTdGF0dXMgb2YgdGhlIG5hdmlnYXRpb24gbW9kZWwKK1NhdFN0YXR1cyA6Oj0gQ0hPSUNFIHsKKwktLSBOZXcgc2F0ZWxsaXRlLCBuZXcgTmF2aWdhdGlvbiBNb2RlbAorCW5ld1NhdGVsbGl0ZUFuZE1vZGVsVUMJVW5jb21wcmVzc2VkRXBoZW1lcmlzLAorCisJLS0gRXhpc3Rpbmcgc2F0ZWxsaXRlLCBFeGlzdGluZyBOYXZpZ2F0aW9uIE1vZGVsCisJb2xkU2F0ZWxsaXRlQW5kTW9kZWwJTlVMTCwKKworCS0tIEV4aXN0aW5nIHNhdGVsbGl0ZSwgbmV3IE5hdmlnYXRpb24gTW9kZWwKKwluZXdOYXZpTW9kZWxVQwkJCVVuY29tcHJlc3NlZEVwaGVtZXJpcywKKwkuLi4KK30KKworLS0gVW5jb21wcmVzc2VkIHNhdGVsbGl0ZSBlbWhlbWVyaXMgYW5kIGNsb2NrIGNvcnJlY3Rpb25zCitVbmNvbXByZXNzZWRFcGhlbWVyaXMgOjo9IFNFUVVFTkNFIHsKKwllcGhlbUNvZGVPbkwyCUlOVEVHRVIgKDAuLjMpLAorCWVwaGVtVVJBCQlJTlRFR0VSICgwLi4xNSksCisJZXBoZW1TVmhlYWx0aAlJTlRFR0VSICgwLi42MyksCisJZXBoZW1JT0RDCQlJTlRFR0VSCSgwLi4xMDIzKSwKKwllcGhlbUwyUGZsYWcJSU5URUdFUiAoMC4uMSksCisJZXBoZW1TRjFSc3ZkCUVwaGVtZXJpc1N1YmZyYW1lMVJlc2VydmVkLAorCWVwaGVtVGdkCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWVwaGVtVG9jCQlJTlRFR0VSICgwLi4zNzc5OSksCisJZXBoZW1BRjIJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJZXBoZW1BRjEJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtQUYwCQlJTlRFR0VSICgtMjA5NzE1Mi4uMjA5NzE1MSksCisJZXBoZW1DcnMJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtRGVsdGFOCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbU0wCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWVwaGVtQ3VjCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbUUJCQlJTlRFR0VSICgwLi40Mjk0OTY3Mjk1KSwKKwllcGhlbUN1cwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1BUG93ZXJIYWxmCUlOVEVHRVIgKDAuLjQyOTQ5NjcyOTUpLAorCWVwaGVtVG9lCQlJTlRFR0VSICgwLi4zNzc5OSksCisJZXBoZW1GaXRGbGFnCUlOVEVHRVIgKDAuLjEpLAorCWVwaGVtQU9EQQkJSU5URUdFUiAoMC4uMzEpLAorCWVwaGVtQ2ljCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbU9tZWdhQTAJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWVwaGVtQ2lzCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbUkwCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWVwaGVtQ3JjCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbVcJCQlJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJZXBoZW1PbWVnYUFEb3QJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWVwaGVtSURvdAkJSU5URUdFUiAoLTgxOTIuLjgxOTEpCit9CisKKy0tIFJlc2VydmVkIGJpdHMgaW4gc3ViZnJhbWUgMSBvZiBuYXZpZ2F0aW9uIG1lc3NhZ2UKK0VwaGVtZXJpc1N1YmZyYW1lMVJlc2VydmVkIDo6PSBTRVFVRU5DRSB7CisJcmVzZXJ2ZWQxCQlJTlRFR0VSICgwLi44Mzg4NjA3KSwJLS0gMjMtYml0IGZpZWxkCisJcmVzZXJ2ZWQyCQlJTlRFR0VSICgwLi4xNjc3NzIxNSksCS0tIDI0LWJpdCBmaWVsZAorCXJlc2VydmVkMwkJSU5URUdFUiAoMC4uMTY3NzcyMTUpLAktLSAyNC1iaXQgZmllbGQKKwlyZXNlcnZlZDQJCUlOVEVHRVIgKDAuLjY1NTM1KQkJLS0gMTYtYml0IGZpZWxkCit9CisKKy0tIElvbm9zcGhlcmljIE1vZGVsIElFCitJb25vc3BoZXJpY01vZGVsIDo6PSBTRVFVRU5DRSB7CisJYWxmYTAJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWFsZmExCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwlhbGZhMgkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYWxmYTMJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWJldGEwCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwliZXRhMQkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYmV0YTIJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWJldGEzCQkJSU5URUdFUiAoLTEyOC4uMTI3KQorfQorCistLSBVbml2ZXJzYWwgVGltZSBDb29yZGluYXRlIE1vZGVsCitVVENNb2RlbCA6Oj0gU0VRVUVOQ0UgeworCXV0Y0ExCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCXV0Y0EwCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCXV0Y1RvdAkJCUlOVEVHRVIgKDAuLjI1NSksCisJdXRjV050CQkJSU5URUdFUiAoMC4uMjU1KSwKKwl1dGNEZWx0YVRscwkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwl1dGNXTmxzZgkJSU5URUdFUiAoMC4uMjU1KSwKKwl1dGNETgkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJdXRjRGVsdGFUbHNmCUlOVEVHRVIgKC0xMjguLjEyNykKK30KKworLS0gQWxtYW5hYywgTG9uZyB0ZXJtIG1vZGVsCistLSBOT1RFOiBUaGVzZSBhcmUgcGFyYW1ldGVycyBhcmUgc3Vic2V0IG9mIHRoZSBlcGhlbWVyaXMKKy0tIE5PVEU6IEJ1dCB3aXRoIHJlZHVjZWQgcmVzb2x1dGlvbiBhbmQgYWNjdXJhY3kKK0FsbWFuYWMgOjo9IFNFUVVFTkNFIHsKKwlhbGFtYW5hY1dOYQkJSU5URUdFUiAoMC4uMjU1KSwJLS0gT25jZSBwZXIgbWVzc2FnZQorCisJLS0gbmF2aWdhdGlvbiBtb2RlbCBzYXRlbGxpdGUgbGlzdC4KKwktLSBUaGUgc2l6ZSBvZiBhbG1hbmFjTGlzdCBpcyBhY3R1YWxseSBOdW1zX1NhdHNfVG90YWwgZmllbGQKKwlhbG1hbmFjTGlzdAkJU2VxT2ZBbG1hbmFjRWxlbWVudAkJCit9CitTZXFPZkFsbWFuYWNFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi42NCkpIE9GIEFsbWFuYWNFbGVtZW50CisKKy0tIEFsbWFuYWMgaW5mbyBvbmNlIHBlciBzYXRlbGxpdGUKK0FsbWFuYWNFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc2F0ZWxsaXRlSUQJCQlTYXRlbGxpdGVJRCwKKwlhbG1hbmFjRQkJCUlOVEVHRVIgKDAuLjY1NTM1KSwKKwlhbGFtYW5hY1RvYQkJCUlOVEVHRVIgKDAuLjI1NSksCisJYWxtYW5hY0tzaWkJCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwlhbG1hbmFjT21lZ2FEb3QJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWFsbWFuYWNTVmhlYWx0aAkJSU5URUdFUiAoMC4uMjU1KSwKKwlhbG1hbmFjQVBvd2VySGFsZglJTlRFR0VSICgwLi4xNjc3NzIxNSksCisJYWxtYW5hY09tZWdhMAkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWFsbWFuYWNXCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWFsbWFuYWNNMAkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlhbG1hbmFjQUYwCQkJSU5URUdFUiAoLTEwMjQuLjEwMjMpLAorCWFsbWFuYWNBRjEJCQlJTlRFR0VSICgtMTAyNC4uMTAyMykKK30KKworLS0gQWNxdWlzaXRpb24gQXNzaXN0YW5jZQorQWNxdWlzQXNzaXN0IDo6PSBTRVFVRU5DRSB7CisKKwktLSBOdW1iZXIgb2YgU2F0ZWxsaXRlcyBjYW4gYmUgcmVhZCBmcm9tIGFjcXVpc3RMaXN0CisJdGltZVJlbGF0aW9uCVRpbWVSZWxhdGlvbiwKKworCS0tIEFjcXVpc2l0aW9uIGFzc2lzdGFuY2UgbGlzdAorCS0tIFRoZSBzaXplIG9mIE51bWJlciBvZiBTYXRlbGxpdGVzIGlzIGFjdHVhbGx5IE51bWJlciBvZiBTYXRlbGxpdGVzIGZpZWxkCisJYWNxdWlzTGlzdAkJU2VxT2ZBY3F1aXNFbGVtZW50CQkKK30KK1NlcU9mQWNxdWlzRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBBY3F1aXNFbGVtZW50CisKKy0tIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBHUFMgdGltZSBhbmQgYWlyLWludGVyZmFjZSB0aW1pbmcKK1RpbWVSZWxhdGlvbiA6Oj0gU0VRVUVOQ0UgeworCS0tCisJZ3BzVE9XCQlHUFNUT1cyM2IsCQktLSAyM2IgcHJlc2VudGF0aW9uCisJZ3NtVGltZQkJR1NNVGltZQkJT1BUSU9OQUwKK30KKworLS0gZGF0YSBvY2N1cmluZyBwZXIgbnVtYmVyIG9mIHNhdGVsbGl0ZXMKK0FjcXVpc0VsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzdmlkCQkJCQlTYXRlbGxpdGVJRCwKKworCS0tIERvcHBsZXIgMHRoIG9yZGVyIHRlcm0sCisJLS0gLTUxMjAuMCAtIDUxMTcuNSBIeiAoPSAtMjA0OCAtIDIwNDcgd2l0aCAyLjUgSHogcmVzb2x1dGlvbikKKwlkb3BwbGVyMAkJCQlJTlRFR0VSICgtMjA0OC4uMjA0NyksCQorCWFkZGlvbmFsRG9wcGxlcgkJCUFkZGlvbmFsRG9wcGxlckZpZWxkcwlPUFRJT05BTCwKKwljb2RlUGhhc2UJCQkJSU5URUdFUiAoMC4uMTAyMiksCS0tIENvZGUgUGhhc2UKKwlpbnRDb2RlUGhhc2UJCQlJTlRFR0VSICgwLi4xOSksCS0tIEludGVnZXIgQ29kZSBQaGFzZQorCWdwc0JpdE51bWJlcgkJCUlOVEVHRVIgKDAuLjMpLCAJLS0gR1BTIGJpdCBudW1iZXIKKwljb2RlUGhhc2VTZWFyY2hXaW5kb3cJSU5URUdFUiAoMC4uMTUpLAktLSBDb2RlIFBoYXNlIFNlYXJjaCBXaW5kb3cKKwlhZGRpb25hbEFuZ2xlCQkJQWRkaW9uYWxBbmdsZUZpZWxkcwkJT1BUSU9OQUwKK30KKworQWRkaW9uYWxEb3BwbGVyRmllbGRzIDo6PSBTRVFVRU5DRSB7CisJLS0gRG9wcGxlciAxc3Qgb3JkZXIgdGVybSwgLTEuMCAtICswLjUgSHovc2VjCisgLS0gKD0gLTQyICsgKDAgdG8gNjMpIHdpdGggMS80MiBIei9zZWMuIHJlc29sdXRpb24pCisJZG9wcGxlcjEJCQkJSU5URUdFUiAoMC4uNjMpLAorCWRvcHBsZXJVbmNlcnRhaW50eQkJSU5URUdFUiAoMC4uNykKKyAtLSBhIHNlbmRlciBzaGFsbCBub3QgZW5jb2RlIGFueSBEb3BwbGVyVW5jZXJ0YWludHkgdmFsdWUgaW4gdGhlIHJhbmdlIDUgdG8gNworIC0tIGEgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIGFueSB2YWx1ZSBiZXR3ZWVuIDUgYW5kIDcuCit9CisKK0FkZGlvbmFsQW5nbGVGaWVsZHMJOjo9IFNFUVVFTkNFIHsKKwktLSBhemltdXRoIGFuZ2xlLCAwIC0gMzQ4Ljc1IGRlZyAoPSAwIC0gMzEgd2l0aCAxMS4yNSBkZWcgcmVzb2x1dGlvbikKKwlhemltdXRoCQkJCQlJTlRFR0VSICgwLi4zMSksCisJLS0gZWxldmF0aW9uIGFuZ2xlLCAwIC0gNzguNzUgZGVnICg9IDAgLSA3IHdpdGggMTEuMjUgZGVnIHJlc29sdXRpb24pCisJZWxldmF0aW9uCQkJCUlOVEVHRVIgKDAuLjcpCit9CisKKy0tIFJlYWwtVGltZSBJbnRlZ3JpdHkKKy0tIG51bWJlciBvZiBiYWQgc2F0ZWxsaXRlcyBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZWxlbWVudAorU2VxT2YtQmFkU2F0ZWxsaXRlU2V0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNikpIE9GIFNhdGVsbGl0ZUlECisKKy0tIEV4dGVuc2lvbiBFbGVtZW50cworCistLSBSZWxlYXNlIDk4IEV4dGVuc2lvbnMgaGVyZQorUmVsOTgtTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCXJlbDk4LUV4dC1FeHBPVEQJCQlSZWw5OC1FeHQtRXhwT1RECQlPUFRJT05BTCwJLS0gRXhwZWN0ZWRPVEQgZXh0ZW5zaW9uCisJLi4uLCAKKyBncHNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLCAKKyBncHNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgR1BTUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IE9QVElPTkFMCisKKy0tIEZ1cnRoZXIgUjk4IGV4dGVuc2lvbnMgaGVyZQorfQorUmVsOTgtQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisJcmVsOTgtRXh0LUV4cE9URAkJCVJlbDk4LUV4dC1FeHBPVEQJCU9QVElPTkFMLAktLSBFeHBlY3RlZE9URCBleHRlbnNpb24KKwkuLi4sIAorIGdwc1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCisgZ3BzUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IEdQU1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBPUFRJT05BTAorCistLSBGdXJ0aGVyIFI5OCBleHRlbnNpb25zIGhlcmUKK30KKworLS0gUmVsZWFzZSA5OCBFeHBPVEQgZXh0ZW5zaW9uCitSZWw5OC1FeHQtRXhwT1REIDo6PSBTRVFVRU5DRSB7CistLSBJZiBNc3JBc3Npc3RCVFMgaXMgaW5jbHVkZWQgaW4gbWVzc2FnZSwgbXNyQXNzaXN0RGF0YS1SOTgtRXhwT1REIHNoYWxsIGJlIGluY2x1ZGVkLgorCW1zckFzc2lzdERhdGEtUjk4LUV4cE9URAkJCU1zckFzc2lzdERhdGEtUjk4LUV4cE9URAkJCU9QVElPTkFMLAorCistLSBJZiBTeXN0ZW1JbmZvQXNzaXN0YURhdGEgaXMgaW5jbHVkZWQgaW4gbWVzc2FnZSwgc3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URCBzaGFsbCBiZQorLS0gaW5jbHVkZWQuCisJc3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URAlTeXN0ZW1JbmZvQXNzaXN0RGF0YS1SOTgtRXhwT1RECU9QVElPTkFMCit9CisKKy0tIE1zckFzc2lzdERhdGEgUjk4IGV4dGVuc2lvbgorTXNyQXNzaXN0RGF0YS1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSB7CisJIG1zckFzc2lzdExpc3QtUjk4LUV4cE9URAkJCSBTZXFPZk1zckFzc2lzdEJUUy1SOTgtRXhwT1RECit9CisKKy0tIEluZGV4ZXMgaW4gU2VxT2ZNc3JBc3Npc3RCVFMtUjk4LUV4cE9URCByZWZlciB0byBTZXFPZk1zckFzc2lzdEJUUworLS0gSWYgdGhlIGluZGV4IGV4Y2VlZHMgdGhlIFNlZ09mTXNyQXNzaXN0QlRTIHJhbmdlIG9yIGlmIHRoZXJlIGlzIG90aGVyCistLSBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGUgQlRTIGluZGljZXMsIHRoZSBNUyBzaGFsbCBhcHBseSBwcm90b2NvbAorLS0gZXJyb3IgY2F1c2UgaW5jb3JyZWN0RGF0YQorU2VxT2ZNc3JBc3Npc3RCVFMtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTUpKSBPRiBNc3JBc3Npc3RCVFMtUjk4LUV4cE9URAorCistLSBUaGlzIGVsZW1lbnQgY29tcGxldGVzIE1zckFzc2lzdEJUUyBJRQorTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIHsKKwlleHBlY3RlZE9URAkJCQlFeHBlY3RlZE9URCwKKwlleHBPVERVbmNlcnRhaW50eQkJRXhwT1REVW5jZXJ0YWludHkKK30KKworLS0gU3lzdGVtSW5mb0Fzc2lzdERhdGEgUjk4IGV4dGVuc2lvbgorU3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworCXN5c3RlbUluZm9Bc3Npc3RMaXN0Ujk4LUV4cE9URCAJU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQKK30KKworLS0gU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQgaW5kZXggcmVmZXIgdG8gU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTCistLSBJZiB0aGUgaW5kZXggZXhjZWVkcyB0aGUgU2VnT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTIHJhbmdlIG9yIGlmIHRoZXJlIGlzIG90aGVyCistLSBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGUgQlRTIGluZGljZXMsIHRoZSBNUyBzaGFsbCBhcHBseSBwcm90b2NvbAorLS0gZXJyb3IgY2F1c2UgaW5jb3JyZWN0RGF0YQorU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMyKSkgT0YgU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1RECisKKy0tIHdoZXRoZXIgbi50aCBpcyBwcmVzZW50IG9yIG5vdCA/CitTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IENIT0lDRSB7CisJbm90UHJlc2VudAkJTlVMTCwKKwlwcmVzZW50CQkJQXNzaXN0QlRTRGF0YS1SOTgtRXhwT1RECit9CisKKy0tIFRoaXMgZWxlbWVudCBjb21wbGV0ZXMgQXNzaXN0QlRTRGF0YSBJRQorQXNzaXN0QlRTRGF0YS1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSB7CisJZXhwZWN0ZWRPVEQJCQkJRXhwZWN0ZWRPVEQsCisJZXhwT1REdW5jZXJ0YWludHkJCUV4cE9URFVuY2VydGFpbnR5CS0tIFVuY2VydGFpbnR5IG9mIGV4cGVjdGVkIE9URAorfQorCistLSBFeHBlY3RlZCBPVEQgdmFsdWUgYmV0d2VlbiBuYm9yIGJhc2Ugc3RhdGlvbiBhbmQgcmVmZXJlbmNlIEJUUworLS0gYXQgTVMncyBjdXJyZW50IGVzdGltYXRlZCBsb2NhdGlvbi4KK0V4cGVjdGVkT1REIDo6PSBJTlRFR0VSICgwLi4xMjUwKQorLS0gVGhlIEV4cGVjdGVkT1REIHZhbHVlIDEyNTAgc2hhbGwgbm90IGJlIGVuY29kZWQgYnkgdGhlIHRyYW5zbWl0dGluZyBlbnRpdHkgYW5kCistLSBzaGFsbCBiZSB0cmVhdGVkIGJ5IHRoZSByZWNlaXZpbmcgZW50aXR5IGFzIDAuCistLSBVbmNlcnRhaW50eSBvZiBFeHB0ZWN0ZWQgT1REIGluIGJpdHMKK0V4cE9URFVuY2VydGFpbnR5IDo6PSBJTlRFR0VSKDAuLjcpCisKKy0tIFJlbGVhc2UgOTggZXh0ZW5zaW9ucworCitHUFNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgOjo9IElOVEVHRVIgKDAgLi4gMTI3KSAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisKK0dQU1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRzIDo6PSBTRVFVRU5DRSB7CisgcmVmZXJlbmNlRnJhbWVNU0IgSU5URUdFUiAoMCAuLiA2MyksIC0tIE1TQiBvZiBmcmFtZSBudW1iZXIKKyBncHNUb3dTdWJtcyBJTlRFR0VSICgwIC4uIDk5OTkpIE9QVElPTkFMLCAtLSBpbiB1bml0cyBvZiAxMDBucywgZm9yIE1TIGJhc2VkIEFHUFMKKyBkZWx0YVRvdyBJTlRFR0VSICgwIC4uIDEyNykgT1BUSU9OQUwsIC0tIGZvciBNUyBhc3Npc3RlZCBBR1BTCisgZ3BzUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IEdQU1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBPUFRJT05BTAorfQorCitSZWwtOTgtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCisJLS0gRmlyc3QgZXh0ZW5zaW9uIHRvIFJlbGVhc2UgOTgKKwlyZWwtOTgtRXh0LU1lYXN1cmVJbmZvCVNFUVVFTkNFIHsKKwkJb3RkLU1lYXN1cmVJbmZvLVI5OC1FeHQJT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQJCU9QVElPTkFMCisJfSwKKwkuLi4sIAorIHRpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRzIEdQU1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRzIE9QVElPTkFMIAorIC0tIEZ1cnRoZXIgUjk4IGV4dGVuc2lvbnMgaGVyZQorfQorCistLSBUaGlzIGlzIGFuIGFkZGl0aW9uIHRvIE9URC1NZWFzdXJlSW5mbyBlbGVtZW50IGRlZmluZWQgaW4gb3JpZ2luYWwgbWVzc2FnZSwKKy0tIElmIE9URC1NZWFzdXJlSW5mbyBpcyBhYnNlbnQsIG9yIGlmIG9uZSBvciBtb3JlIE9URC1Nc3JFbGVtZW50UmVzdCBhcmUgcHJlc2VudAorLS0gT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQgc2hhbGwgYmUgYWJzZW50LgorLS0gT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQKK09URC1NZWFzdXJlSW5mby1SOTgtRXh0IDo6PSBTRVFVRU5DRSB7CisJLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cworCW90ZE1zckZpcnN0U2V0cy1SOTgtRXh0CQlPVEQtTXNyRWxlbWVudEZpcnN0LVI5OC1FeHQKK30KKworLS0gT1REIG1lYXN1cmVtZW50IGluZm9ybWF0aW9uIEV4dCBmb3IgdGhlIGZpcnN0IHNldCBvbmx5CitPVEQtTXNyRWxlbWVudEZpcnN0LVI5OC1FeHQgOjo9IFNFUVVFTkNFIHsKKwktLSBhZGRpdGlvbmFsIG1lYXN1cmVkIG5laWdoYm9ycyBpbiBPVEQgbWVhc3VyZW1lbnRzCisJb3RkLUZpcnN0U2V0TXNycy1SOTgtRXh0IAlTZXFPZk9URC1GaXJzdFNldE1zcnMtUjk4LUV4dCAJT1BUSU9OQUwKK30KK1NlcU9mT1RELUZpcnN0U2V0TXNycy1SOTgtRXh0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi41KSkgT0YgT1RELUZpcnN0U2V0TXNycworCitSZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisKKwlleHRlbmRlZC1yZWZlcmVuY2UJRXh0ZW5kZWQtcmVmZXJlbmNlIAlPUFRJT05BTCwKKwktLSBUaGUgZXh0ZW5kZWQtcmVmZXJlbmNlIHNoYWxsIGJlIGluY2x1ZGVkIGJ5IHRoZSBNUyBpZiBhbmQgb25seSBpZiBwcmV2aW91c2x5CisJLS0gcmVjZWl2ZWQgZnJvbSB0aGUgU01MQyBpbiBhIE1lYXN1cmUgUG9zaXRpb24gUmVxdWVzdC4gV2hlbiBpbmNsdWRlZCwgdGhlIHZhbHVlIHNlbnQKKwktLSBieSB0aGUgTVMgc2hhbGwgZXF1YWwgdGhlIHZhbHVlIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMuCisKKwktLSBleHRlbnNpb24gdG8gUmVsZWFzZSA1LCBmb3IgUlJMUCBwc2V1ZG8tc2VnbWVudGF0aW9uIGhlcmUKKwlvdGQtTWVhc3VyZUluZm8tNS1FeHQJT1RELU1lYXN1cmVJbmZvLTUtRXh0CU9QVElPTkFMLAorCXVsUHNldWRvU2VnSW5kCQkJVWxQc2V1ZG9TZWdJbmQJCQlPUFRJT05BTCwJLS0gSW5jbHVkZWQgd2hlbiB1cGxpbmsgUlJMUAorCS0tIFBzZXVkby1zZWdtZW50YXRpb24gaXMgdXNlZCwgbm90IGluY2x1ZGVkIHdoZW4gbm8gdXBsaW5rIHBzZXVkby1zZWdtZW50YXRpb24gaXMgdXNlZAorCS4uLgorCQkJCQktLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNSBoZXJlIGxhdGVyCit9CisKK0V4dGVuZGVkLXJlZmVyZW5jZSA6Oj0gU0VRVUVOQ0UgeworCXNtbGMtY29kZQkJCUlOVEVHRVIgKDAuLjYzKSwKKwl0cmFuc2FjdGlvbi1JRAkJSU5URUdFUiAoMC4uMjYyMTQzKQorfQorCitPVEQtTWVhc3VyZUluZm8tNS1FeHQgOjo9IFNlcU9mT1RELU1zckVsZW1lbnRSZXN0CisJLS0gaWYgbW9yZSB0aGFuIG9uZSBtZWFzdXJlbWVudCBzZXRzIGFyZSBwcmVzZW50IHRoaXMgZWxlbWVudCBpcyByZXBlYXRlZAorCS0tIE51bWJlck9mU2V0cyAtIDEgKC0xID0gZmlyc3Qgc2V0KSBjb21iaW5lZCBpbiBPVEQtTWVhc3VyZUluZm8tNS1FeHQgYW5kCisJLS0gT1RELU1lYXN1cmVJbmZvIChlLmcuIGlmIE51bWJlck9mU2V0cyBpcyAzLCB0aGVuIG9uZSBvdGRNc3JSZXN0U2V0cyBtYXkKKwktLSBiZSBzZW50IGluIE9URC1NZWFzdXJlSW5mby01LUV4dCBhbmQgb25lIGluIE9URC1NZWFzdXJlSW5mbykKKworLS0gRmlyc3QgcGFydCBvZiBVcGxpbmsgUlJMUCBQc2V1ZG8tc2VnbWVudGF0aW9uIGluZGljYXRpb24sIHBvc3NpYmx5IG1vcmUgbWF5IGJlIGRlZmluZWQKKy0tIGluIHRoZSBmdXR1cmUgZm9yIHNlZ21lbnRhdGlvbiB3aXRoIG1vcmUgdGhhbiB0d28gc2VnbWVudHMuCitVbFBzZXVkb1NlZ0luZCA6Oj0gRU5VTUVSQVRFRCB7CisJZmlyc3RPZk1hbnkgKDApLAorCXNlY29uZE9mTWFueSgxKQorfQorCitSZWw1LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKwlleHRlbmRlZC1yZWZlcmVuY2UJCQlFeHRlbmRlZC1yZWZlcmVuY2UsCisJLi4uCisJLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgorfQorCitSZWw1LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuZGVkLXJlZmVyZW5jZQkJCUV4dGVuZGVkLXJlZmVyZW5jZSwKKwkuLi4KKworLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgorfQorCitSZWwtNS1Qcm90b2NvbEVycm9yLUV4dGVuc2lvbjo6PSBTRVFVRU5DRSB7CisJZXh0ZW5kZWQtcmVmZXJlbmNlCQkJRXh0ZW5kZWQtcmVmZXJlbmNlIAlPUFRJT05BTCwKKwktLSBUaGUgZXh0ZW5kZWQtcmVmZXJlbmNlIHNoYWxsIGJlIGluY2x1ZGVkIGJ5IHRoZSBNUyBpZiBhbmQgb25seSBpZiBwcmV2aW91c2x5CisJLS0gcmVjZWl2ZWQgZnJvbSB0aGUgU01MQy4KKwktLSBXaGVuIGluY2x1ZGVkLCB0aGUgdmFsdWUgc2VudCBieSB0aGUgTVMgc2hhbGwgZXF1YWwgdGhlIHZhbHVlIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMuCisJLi4uCisKKwktLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNSBoZXJlIGxhdGVyCit9CisKKy0tIFJlbGVhc2UgNyBFeHRlbnNpb25zIGhlcmUKKworUmVsNy1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7Cit2ZWxvY2l0eVJlcXVlc3RlZAkJIE5VTEwJCSBPUFRJT05BTCwKKyBnYW5zc1Bvc2l0aW9uTWV0aG9kIEdBTlNTUG9zaXRpb25pbmdNZXRob2QgT1BUSU9OQUwsCisgZ2Fuc3MtQXNzaXN0RGF0YSBHQU5TUy1Bc3Npc3REYXRhIE9QVElPTkFMLAorIGdhbnNzQ2FycmllclBoYXNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCisgZ2Fuc3NUT0RHU01UaW1lQXNzb2NpYXRpb25NZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwKK3JlcXVpcmVkUmVzcG9uc2VUaW1lCVJlcXVpcmVkUmVzcG9uc2VUaW1lCU9QVElPTkFMLAorCS4uLgorCS0tIEZ1cnRoZXIgUmVsZWFzZSA3IGV4dGVudGlvbnMgaGVyZQorfQorCistLSBhZGRpdGlvbmFsIHNhdGVsbGl0ZSBzeXN0ZW1zIG1heSBiZSBhZGRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIHByb3RvY29sCitHQU5TU1Bvc2l0aW9uaW5nTWV0aG9kIDo6PSBCSVQgU1RSSU5HIHsKKwlncHMgKDApLAorCWdhbGlsZW8gKDEpfSAoU0laRSAoMi4uMTYpKQorCitHQU5TUy1Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3MtY29udHJvbEhlYWRlcglHQU5TUy1Db250cm9sSGVhZGVyCit9CisKK0dBTlNTLUNvbnRyb2xIZWFkZXIgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc0NvbW1vbkFzc2lzdERhdGEgR0FOU1NDb21tb25Bc3Npc3REYXRhIE9QVElPTkFMLAorIGdhbnNzR2VuZXJpY0Fzc2lzdERhdGFMaXN0IFNlcU9mR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQgT1BUSU9OQUwKK30KKworLS0gR0FOU1MgQ29tbW9uIEFzc2lzdGFuY2UgRGF0YSBFbGVtZW50cworR0FOU1NDb21tb25Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NSZWZlcmVuY2VUaW1lCQkgR0FOU1NSZWZlcmVuY2VUaW1lCQkgT1BUSU9OQUwsCisJZ2Fuc3NSZWZMb2NhdGlvbgkJCUdBTlNTUmVmTG9jYXRpb24JCSBPUFRJT05BTCwKKwlnYW5zc0lvbm9zcGhlcmljTW9kZWwJCUdBTlNTSW9ub3NwaGVyaWNNb2RlbAkgT1BUSU9OQUwsCisJLi4uCit9CisKKy0tIExpc3Qgb2YgR0FOU1MgR2VuZXJpYyBBc3Npc3RhbmNlIERhdGEgRWxlbWVudHMsIHVwIHRvIDggR0FOU1MKK1NlcU9mR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi44KSkgT0YgR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQKKworLS0gR0FOU1MgR2VuZXJpYyBBc3Npc3RhbmNlIERhdGEgRWxlbWVudHMKK0dBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3NJRCBJTlRFR0VSICgwLi43KSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGdhbnNzVGltZU1vZGVsIFNlcU9mR0FOU1NUaW1lTW9kZWwgT1BUSU9OQUwsCisJZ2Fuc3NEaWZmQ29ycmVjdGlvbnMJCSBHQU5TU0RpZmZDb3JyZWN0aW9ucwkgT1BUSU9OQUwsCisJZ2Fuc3NOYXZpZ2F0aW9uTW9kZWwJCSBHQU5TU05hdk1vZGVsIE9QVElPTkFMLAorCWdhbnNzUmVhbFRpbWVJbnRlZ3JpdHkJIEdBTlNTUmVhbFRpbWVJbnRlZ3JpdHkJIE9QVElPTkFMLAorCWdhbnNzRGF0YUJpdEFzc2lzdAkJCSBHQU5TU0RhdGFCaXRBc3Npc3QJCSBPUFRJT05BTCwKKwlnYW5zc1JlZk1lYXN1cmVtZW50QXNzaXN0CSBHQU5TU1JlZk1lYXN1cmVtZW50QXNzaXN0IE9QVElPTkFMLAorIGdhbnNzQWxtYW5hY01vZGVsIEdBTlNTQWxtYW5hY01vZGVsIE9QVElPTkFMLAorIGdhbnNzVVRDTW9kZWwgR0FOU1NVVENNb2RlbCBPUFRJT05BTCwKKwkuLi4KK30KKworLS0gR0FOU1MgQ09NTU9OIEFTU0lTVEFOQ0UgREFUQSBFTEVNRU5UUworCistLSBHQU5TUyBSZWZlcmVuY2UgVGltZSBJRQorR0FOU1NSZWZlcmVuY2VUaW1lIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NSZWZUaW1lSW5mbwkJCSBHQU5TU1JlZlRpbWVJbmZvLAorCWdhbnNzVE9ELUdTTVRpbWVBc3NvY2lhdGlvbiBHQU5TU1RPRC1HU01UaW1lQXNzb2NpYXRpb24gT1BUSU9OQUwKK30KKworLS0gR0FOU1MgUmVmZXJlbmNlIFRpbWUgaW5jbHVkZXMgR0FOU1MgVE9ELCBHQU5TUyBEYXksIHVuY2VydGFpbnR5CitHQU5TU1JlZlRpbWVJbmZvIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NEYXkJCQkgSU5URUdFUigwIC4uIDgxOTEpIE9QVElPTkFMLAorIGdhbnNzVE9EIEdBTlNTVE9ELAorCWdhbnNzVE9EVW5jZXJ0YWludHkJIEdBTlNTVE9EVW5jZXJ0YWludHkgT1BUSU9OQUwsCisgZ2Fuc3NUaW1lSUQgSU5URUdFUiAoMCAuLiA3KSBPUFRJT05BTAorfQorCistLSBHQU5TUyBUT0QgaW50ZWdlciBzZWNvbmRzCitHQU5TU1RPRCA6Oj0gSU5URUdFUiAoMCAuLiA4NjM5OSkKKworLS0gR0FOU1MgVE9EIHVuY2VydGFpbnR5CitHQU5TU1RPRFVuY2VydGFpbnR5IDo6PSBJTlRFR0VSICgwIC4uIDEyNykgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCistLSBHQU5TUyBUT0QtR1NNIFRpbWUgYXNzb2NpYXRpb24gCitHQU5TU1RPRC1HU01UaW1lQXNzb2NpYXRpb24gOjo9IFNFUVVFTkNFIHsKKwliY2NoQ2FycmllcgkJQkNDSENhcnJpZXIsCS0tIEJDQ0ggY2FycmllcgorCWJzaWMJCQlCU0lDLAkJCS0tIEJTSUMKKwlmcmFtZU51bWJlcgkJRnJhbWVOdW1iZXIsCisJdGltZVNsb3QJCVRpbWVTbG90LAorCWJpdE51bWJlcgkJQml0TnVtYmVyLAorIGZyYW1lRHJpZnQgRnJhbWVEcmlmdCBPUFRJT05BTAorfQorCistLSBGcmFtZSBkcmlmdAorRnJhbWVEcmlmdCA6Oj0gSU5URUdFUigtNjQgLi4gNjMpCisKKy0tIEdBTlNTIFJlZmVyZW5jZSBMb2NhdGlvbiBJRQorR0FOU1NSZWZMb2NhdGlvbiA6Oj0gU0VRVUVOQ0UgeworCXRocmVlRExvY2F0aW9uCQkJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCit9CisKKy0tIEdBTlNTIElvbm9zcGhlcmljIE1vZGVsIElFCistLSBHQU5TUyBJb25vc3BoZXJpYyBNb2RlbCBjb25zaXN0cyBvZiBOZVF1aWNrIG1vZGVsIHBhcmFtZXRlcnMgYW5kIHN0b3JtIGZsYWdzCisKK0dBTlNTSW9ub3NwaGVyaWNNb2RlbCA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzSW9ub01vZGVsIEdBTlNTSW9ub3NwaGVyZU1vZGVsLAorIGdhbnNzSW9ub1N0b3JtRmxhZ3MgR0FOU1NJb25vU3Rvcm1GbGFncyBPUFRJT05BTCwKKyAuLi4KK30KKworLS0gR0FOU1MgaW9ub3NwaGVyZSBtb2RlbC4gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leCAKK0dBTlNTSW9ub3NwaGVyZU1vZGVsIDo6PSBTRVFVRU5DRSB7CisgYWkwIElOVEVHRVIgKDAgLi4gNDA5NSksCisgYWkxIElOVEVHRVIgKDAgLi4gNDA5NSksCisgYWkyIElOVEVHRVIgKDAgLi4gNDA5NSkKK30KKworLS0gR0FOU1MgaW9ub3NwaGVyZSBzdG9ybSBmbGFncworR0FOU1NJb25vU3Rvcm1GbGFncyA6Oj0gU0VRVUVOQ0UgeworCWlvbm9TdG9ybUZsYWcxCUlOVEVHRVIgKDAgLi4gMSksCisJaW9ub1N0b3JtRmxhZzIJSU5URUdFUiAoMCAuLiAxKSwKKwlpb25vU3Rvcm1GbGFnMwlJTlRFR0VSICgwIC4uIDEpLAorCWlvbm9TdG9ybUZsYWc0CUlOVEVHRVIgKDAgLi4gMSksCisJaW9ub1N0b3JtRmxhZzUJSU5URUdFUiAoMCAuLiAxKQorfQorCistLSBHQU5TUyBHRU5FUklDIEFTU0lTVEFOQ0UgREFUQSBFTEVNRU5UUworCistLSBHQU5TUyBUaW1lIE1vZGVsIElFIGNvbnNpc3RzIG9mIHRpbWUgb2Zmc2V0IGFuZCBmaXJzdCBhbmQgc2Vjb25kIG9yZGVyIHBhcmFtZXRlcnMgdG8gcmVsYXRlIEdOU1MKKy0tIHNwZWNpZmljIHN5c3RlbSB0aW1lIHRvIHNlbGVjdGVkIHRpbWUgcmVmZXJlbmNlCitTZXFPZkdBTlNTVGltZU1vZGVsIDo6PSBTRVFVRU5DRSAoU0laRSgxLi43KSkgT0YgR0FOU1NUaW1lTW9kZWxFbGVtZW50CisKK0dBTlNTVGltZU1vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzVGltZU1vZGVsUmVmVGltZQkJSU5URUdFUigwIC4uIDY1NTM1KSwKKwl0QTAJCSBUQTAsCisJdEExCQkgVEExIE9QVElPTkFMLAorCXRBMgkJIFRBMiBPUFRJT05BTCwKKyBnbnNzVE9JRCBJTlRFR0VSICgwIC4uIDcpLAorIHdlZWtOdW1iZXIgSU5URUdFUiAoMCAuLiA4MTkxKSBPUFRJT05BTCAKK30KKworLS0gR0FOU1MgdGltZSBtb2RlbCBwYXJhbWV0ZXIgQTAKK1RBMCA6Oj0gSU5URUdFUiAoLTIxNDc0ODM2NDggLi4gMjE0NzQ4MzY0NykKKworLS0gR0FOU1MgdGltZSBtb2RlbCBwYXJhbWV0ZXIgQTEKK1RBMSA6Oj0gSU5URUdFUiAoLTgzODg2MDggLi4gODM4ODYwNykKKworLS0gR0FOU1MgdGltZSBtb2RlbCBwYXJhbWV0ZXIgQTIKK1RBMiA6Oj0gSU5URUdFUiAoLTY0IC4uIDYzKQorCistLSBER0FOU1MgQ29ycmVjdGlvbnMgSUUKK0dBTlNTRGlmZkNvcnJlY3Rpb25zIDo6PSBTRVFVRU5DRSB7CisJZGdhbnNzUmVmVGltZQkJSU5URUdFUiAoMCAuLiAxMTkpLAkgLS0gREdBTlNTIHJlZmVyZW5jZSB0aW1lCisKKwktLSBOX1NHTl9UWVBFIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHNnblR5cGVMaXN0CisJc2duVHlwZUxpc3QJCSBTZXFPZlNnblR5cGVFbGVtZW50Cit9CisKK1NlcU9mU2duVHlwZUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi4zKSkgT0YgU2duVHlwZUVsZW1lbnQgLS0gbWF4IHRocmVlIHNpZ25hbHMgcGVyIEdOU1MKKworLS0gREdBTlNTIHNpZ25hbCB0eXBlIGVsZW1lbnQsIG9uY2UgcGVyIEdOU1Mgc2lnbmFsIHR5cGUgaW5jbHVkZWQgaW4gREdBTlNTCitTZ25UeXBlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzU2lnbmFsSUQJCSBHQU5TU1NpZ25hbElEIE9QVElPTkFMLCAtLSBzaWduYWwgdHlwZSBpZGVudGl0eQorIGdhbnNzU3RhdHVzSGVhbHRoIElOVEVHRVIgKDAgLi4gNyksCisJLS0gTl9TR04gY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgZGdhbnNzU2duTGlzdAorIGRnYW5zc1Nnbkxpc3QgU2VxT2ZER0FOU1NTZ25FbGVtZW50Cit9CisKK0dBTlNTU2lnbmFsSUQgOjo9IElOVEVHRVIgKDAgLi4gMykJLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorU2VxT2ZER0FOU1NTZ25FbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uMTYpKSBPRiBER0FOU1NTZ25FbGVtZW50CisKKy0tIG51bWJlciBvZiBjb3JyZWN0aW9uIGZvciBzaWduYWxzCitER0FOU1NTZ25FbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc3ZJRAkJIFNWSUQsIC0tIFNhdGVsbGl0ZSBpZGVudGl0eQorCistLS0gU2VxdWVuY2UgbnVtYmVyIGZvciBHQU5TUyBOYXZpZ2F0aW9uIE1vZGVsIHRoYXQgbWF0Y2hlcyB0aGUgREdBTlNTIGNvcnJlY3Rpb24gc2V0CisJaW9kIAkJCUlOVEVHRVIgKDAgLi4gMTAyMyksCisKKwktLSBVc2VyIERpZmZlcmVudGlhbCBSYW5nZSBFcnJvcgorCXVkcmUJCQlJTlRFR0VSICgwLi4zKSwJCQorCisJLS0gUHNldWRvIFJhbmdlIENvcnJlY3Rpb24sIHJhbmdlIGlzCisJLS0gLTY1NS4wNCAtICs2NTUuMDQsCisJcHNldWRvUmFuZ2VDb3IJSU5URUdFUiAoLTIwNDcuLjIwNDcpLCAJCisKKwktLSBQc2V1ZG8gUmFuZ2UgUmF0ZSBDb3JyZWN0aW9uLCByYW5nZSBpcworCS0tIC00LjA2NCAtICs0LjA2NCwKKwlyYW5nZVJhdGVDb3IJSU5URUdFUiAoLTEyNy4uMTI3KQorfQorCitTVklEIDo6PSBJTlRFR0VSICgwIC4uIDYzKQktLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisKKy0tIEdBTlNTIE5hdmlnYXRpb24gTW9kZWwgSUUKK0dBTlNTTmF2TW9kZWwgOjo9IFNFUVVFTkNFIHsKKyBub25Ccm9hZGNhc3RJbmRGbGFnIElOVEVHRVIgKDAgLi4gMSksCisgdG9lTVNCIElOVEVHRVIgKDAgLi4gMzEpIE9QVElPTkFMLCAtLSA1IE1TQiBvZiB0b2UgYW5kIHRvYyAKKyBlTVNCIElOVEVHRVIgKDAgLi4gMTI3KSBPUFRJT05BTCwKKyBzcXJ0QU1CUyBJTlRFR0VSICgwIC4uIDYzKSBPUFRJT05BTCwKKwlnYW5zc1NhdGVsbGl0ZUxpc3QgU2VxT2ZHQU5TU1NhdGVsbGl0ZUVsZW1lbnQKK30KKworU2VxT2ZHQU5TU1NhdGVsbGl0ZUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMyKSkgT0YgR0FOU1NTYXRlbGxpdGVFbGVtZW50CisKK0dBTlNTU2F0ZWxsaXRlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXN2SUQgU1ZJRCwKKyBzdkhlYWx0aCBJTlRFR0VSICgtNyAuLiAxMyksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBpb2QgSU5URUdFUiAoMCAuLiAxMDIzKSwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGdhbnNzQ2xvY2tNb2RlbCBHQU5TU0Nsb2NrTW9kZWwsIAorIGdhbnNzT3JiaXRNb2RlbCBHQU5TU09yYml0TW9kZWwsIAorIC4uLgorfQorCistLSBHQU5TUyBvcmJpdCBtb2RlbCBmb3IgdGhlIEdOU1Mgc2F0ZWxsaXRlIGFjY29yZGluZyB0byB0aGUgY2hvaWNlCitHQU5TU09yYml0TW9kZWwgOjo9IENIT0lDRSB7CisJa2VwbGVyaWFuU2V0CSBOYXZNb2RlbC1LZXBsZXJpYW5TZXQsCQorIC4uLgorfQorCistLSBOYXZpZ2F0aW9uIG1vZGVsIGluIEtlcGxlcmlhbiBwYXJhbWV0ZXJzCitOYXZNb2RlbC1LZXBsZXJpYW5TZXQgOjo9IFNFUVVFTkNFIHsKKyBrZXBsZXJUb2VMU0IgSU5URUdFUiAoMCAuLiA1MTEpLCAtLSA5TFNCIGFyZSBnaXZlbiBpbiBHQU5TU05hdmlnYXRpb25Nb2RlbAorCWtlcGxlclcJCQkgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWtlcGxlckRlbHRhTgkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyTTAJCSBJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJa2VwbGVyT21lZ2FEb3QJIElOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlrZXBsZXJFTFNCIAkgSU5URUdFUiAoMC4uMzM1NTQ0MzEpLAorCWtlcGxlcklEb3QJCSBJTlRFR0VSICgtODE5Mi4uODE5MSksCisJa2VwbGVyQVBvd2VySGFsZkxTQiBJTlRFR0VSICgwLi4gNjcxMDg4NjMpLAorCWtlcGxlckkwCQkgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWtlcGxlck9tZWdhMCBJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJa2VwbGVyQ3JzCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ2lzCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ3VzCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ3JjCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ2ljCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ3VjCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NykKK30KKworLS0gR0FOU1MgY2xvY2sgbW9kZWwgZm9yIHRoZSBHTlNTIHNhdGVsbGl0ZSBhY2NvcmRpbmcgdG8gdGhlIGNob2ljZQorR0FOU1NDbG9ja01vZGVsIDo6PSBDSE9JQ0UgeworCXN0YW5kYXJkQ2xvY2tNb2RlbExpc3QJIFNlcU9mU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudCwJCisgLi4uCit9CisKK1NlcU9mU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMikpIE9GIFN0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQKKworU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIHN0YW5DbG9ja1RvY0xTQiBJTlRFR0VSICgwIC4uIDUxMSksIC0tIDlMU0Igb2YgdGltZSBvZiBjbG9jaworIHN0YW5DbG9ja0FGMiBJTlRFR0VSICgtMjA0OCAuLiAyMDQ3KSwgCisgc3RhbkNsb2NrQUYxIElOVEVHRVIgKC0xMzEwNzIgLi4gMTMxMDcxKSwgCisgc3RhbkNsb2NrQUYwIElOVEVHRVIgKC0xMzQyMTc3MjggLi4gMTM0MjE3NzI3KSwKKyBzdGFuQ2xvY2tUZ2QgSU5URUdFUiAoLTUxMiAuLiA1MTEpIE9QVElPTkFMLAorIHN0YW5Nb2RlbElEIElOVEVHRVIgKDAgLi4gMSkgT1BUSU9OQUwsCisgLi4uCit9IAorCistLSBHQU5TUyBSZWFsLVRpbWUgSW50ZWdyaXR5IElFCitHQU5TU1JlYWxUaW1lSW50ZWdyaXR5IDo6PSBTRVFVRU5DRSB7CisgLS0gbGlzdCBvZiBiYWQgc2lnbmFscworIC0tIE5CUyBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBpbiBTZXFPZi1CYWRTaWduYWxTZXQKKyBnYW5zc0JhZFNpZ25hbExpc3QgU2VxT2ZCYWRTaWduYWxFbGVtZW50Cit9CisKK1NlcU9mQmFkU2lnbmFsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBCYWRTaWduYWxFbGVtZW50CisKK0JhZFNpZ25hbEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyBiYWRTVklEIFNWSUQsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBiYWRTaWduYWxJRCBJTlRFR0VSICgwIC4uIDMpIE9QVElPTkFMIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKK30KKworCistLSBHQU5TUyBEYXRhIEJpdCBBc3Npc3RhbmNlIElFCitHQU5TU0RhdGFCaXRBc3Npc3QgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc1RPRCBJTlRFR0VSICgwIC4uIDU5KSwKKyBzdklEIFNWSUQsCisgZ2Fuc3NEYXRhVHlwZUlEIElOVEVHRVIgKDAgLi4gMiksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyAtLSBsaXN0IG9mIG5hdmlnYXRpb24gZGF0YSBiaXRzCisgLS0gTl9CSVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgaW4gU2VxT2YtRGF0YUJpdHMKKyBnYW5zc0RhdGFCaXRzIFNlcU9mLUdBTlNTRGF0YUJpdHMKK30KKworU2VxT2YtR0FOU1NEYXRhQml0cyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMSAuLiAxMDI0KSkgT0YgR0FOU1NEYXRhQml0CitHQU5TU0RhdGFCaXQgOjo9IElOVEVHRVIoMCAuLiAxKQorCistLSBHQU5TUyBSZWZlcmVuY2UgTWVhc3VyZW1lbnQgQXNzaXN0YW5jZSBJRQorLS0gQ29kZSBhbmQgRG9wcGxlciBhc3Npc3RhbmNlIGZyb20gdGhlIG5ldHdvcmsuIAorR0FOU1NSZWZNZWFzdXJlbWVudEFzc2lzdCA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzU2lnbmFsSUQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGdhbnNzUmVmTWVhc0Fzc2l0TGlzdCBTZXFPZkdBTlNTUmVmTWVhc3VyZW1lbnRFbGVtZW50Cit9CisKK1NlcU9mR0FOU1NSZWZNZWFzdXJlbWVudEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEgLi4gMTYpKSBPRiBHQU5TU1JlZk1lYXN1cmVtZW50RWxlbWVudAorCitHQU5TU1JlZk1lYXN1cmVtZW50RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIHN2SUQgU1ZJRCwKKwktLSBEb3BwbGVyIDB0aCBvcmRlciB0ZXJtLAorCS0tIC0xMDI0IG0vcyB0byAxMDIzLjUgbS9zIHdpdGggMC41IG0vcyByZXNvbHV0aW9uKQorCWRvcHBsZXIwCQkJCUlOVEVHRVIgKC0yMDQ4IC4uIDIwNDcpLAktLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisJYWRkaXRpb25hbERvcHBsZXIJCUFkZGl0aW9uYWxEb3BwbGVyRmllbGRzCSBPUFRJT05BTCwKKwljb2RlUGhhc2UJCQkJSU5URUdFUiAoMCAuLiAxMDIyKSwJIC0tIENvZGUgUGhhc2UgaW4gbXMKKwlpbnRDb2RlUGhhc2UJCQlJTlRFR0VSICgwIC4uIDEyNyksCSAtLSBJbnRlZ2VyIENvZGUgUGhhc2UgaW4gbXMKKwljb2RlUGhhc2VTZWFyY2hXaW5kb3cJSU5URUdFUiAoMCAuLiAzMSksCSAtLSBDb2RlIFBoYXNlIFNlYXJjaCBXaW5kb3csIHNlZSBBbm5leAorCWFkZGl0aW9uYWxBbmdsZQkJCUFkZGlvbmFsQW5nbGVGaWVsZHMJCSBPUFRJT05BTCwKKyAuLi4KK30KKworQWRkaXRpb25hbERvcHBsZXJGaWVsZHMgOjo9IFNFUVVFTkNFIHsKKwktLSBEb3BwbGVyIDFzdCBvcmRlciB0ZXJtLCAtMC4yIC0gKzAuMSBtL3MyCisJZG9wcGxlcjEJCQkJSU5URUdFUiAoMC4uNjMpLAorCWRvcHBsZXJVbmNlcnRhaW50eQkJSU5URUdFUiAoMC4uNCkKK30KKworLS0gR0FOU1MgQWxtYW5hYyBNb2RlbCBJRQorR0FOU1NBbG1hbmFjTW9kZWwgOjo9IFNFUVVFTkNFIHsKKyB3ZWVrTnVtYmVyIElOVEVHRVIgKDAgLi4gMjU1KSwKKyBzdklETWFzayBTVklETUFTSywKKyB0b2EgSU5URUdFUiAoMCAuLiAyNTUpIE9QVElPTkFMLAorIGlvZGEgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwKKyBnYW5zc0FsbWFuYWNMaXN0IFNlcU9mR0FOU1NBbG1hbmFjRWxlbWVudAorfQorCistLSBTViBJRCBNYXNrLCBMU0IgZm9yIElEIDEgYW5kIE1TQiBmb3IgSUQgMzYKK1NWSURNQVNLIDo6PSBCSVQgU1RSSU5HIChTSVpFICgxLi4zNikpCisKK1NlcU9mR0FOU1NBbG1hbmFjRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMSAuLiAzNikpIE9GIEdBTlNTQWxtYW5hY0VsZW1lbnQKKworLS0gR0FOU1MgQWxtYW5hYyBNb2RlbCAKK0dBTlNTQWxtYW5hY0VsZW1lbnQgOjo9IENIT0lDRSB7CisJa2VwbGVyaWFuQWxtYW5hY1NldAkgQWxtYW5hYy1LZXBsZXJpYW5TZXQsCQorIC4uLgorfQorCistLSBBbG1hbmFjIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIEtlcGxlcmlhbiBwYXJhbWV0ZXJzCitBbG1hbmFjLUtlcGxlcmlhblNldCA6Oj0gU0VRVUVOQ0UgeworIAlrZXBBbG1hbmFjRQkJCSBJTlRFR0VSICgwIC4uIDIwNDcpLAorCWtlcEFsbWFuYWNEZWx0YUkJCUlOVEVHRVIgKC0xMDI0IC4uIDEwMjMpLAorCWtlcEFsbWFuYWNPbWVnYURvdAkJSU5URUdFUiAoLTEwMjQgLi4gMTAyMyksCisga2VwU1ZIZWFsdGggSU5URUdFUiAoMCAuLiAxNSksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKwlrZXBBbG1hbmFjQVBvd2VySGFsZglJTlRFR0VSICgtNjU1MzYgLi4gNjU1MzUpLAorCWtlcEFsbWFuYWNPbWVnYTAJCUlOVEVHRVIgKC0zMjc2OCAuLiAzMjc2NyksCisJa2VwQWxtYW5hY1cJCQkgSU5URUdFUiAoLTMyNzY4IC4uIDMyNzY3KSwKKwlrZXBBbG1hbmFjTTAJCQlJTlRFR0VSICgtMzI3NjggLi4gMzI3NjcpLAorCWtlcEFsbWFuYWNBRjAJCQlJTlRFR0VSICgtODE5MiAuLiA4MTkxKSwKKwlrZXBBbG1hbmFjQUYxCQkJSU5URUdFUiAoLTEwMjQuLjEwMjMpCit9CisKKy0tIEdBTlNTIFVuaXZlcnNhbCBUaW1lIENvb3JkaW5hdGUgTW9kZWwKK0dBTlNTVVRDTW9kZWwgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1V0Y0ExCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWdhbnNzVXRjQTAJCQlJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJZ2Fuc3NVdGNUb3QJCQlJTlRFR0VSICgwLi4yNTUpLAorCWdhbnNzVXRjV050CQkJSU5URUdFUiAoMC4uMjU1KSwKKwlnYW5zc1V0Y0RlbHRhVGxzCUlOVEVHRVIgKC0xMjguLjEyNyksCisJZ2Fuc3NVdGNXTmxzZgkJSU5URUdFUiAoMC4uMjU1KSwKKwlnYW5zc1V0Y0ROCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwlnYW5zc1V0Y0RlbHRhVGxzZglJTlRFR0VSICgtMTI4Li4xMjcpCit9CisKKy0tUmVxdWlyZWQgTWVhc3VyZW1lbnQgUmVxdWVzdCBSZXNwb25zZSBUaW1lLCByYW5nZSBpcyAxIHRvIDEyOCBzZWNvbmRzLiAKK1JlcXVpcmVkUmVzcG9uc2VUaW1lIDo6PSBJTlRFR0VSICAoMS4uMTI4KQorCitSZWwtNy1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisKKwl2ZWxFc3RpbWF0ZSAJVmVsb2NpdHlFc3RpbWF0ZSBPUFRJT05BTCwKKyAtLSBIb3Jpem9udGFsIFZlbG9jaXR5CisgLS0gSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5CisgLS0gSG9yaXpvbnRhbCBWZWxvY2l0eSB3aXRoIFVuY2VydGFpbnR5CisgLS0gSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5IGFuZCBVbmNlcnRhaW50eQorIGdhbnNzTG9jYXRpb25JbmZvIEdBTlNTTG9jYXRpb25JbmZvIE9QVElPTkFMLAorIGdhbnNzTWVhc3VyZUluZm8gR0FOU1NNZWFzdXJlSW5mbyBPUFRJT05BTCwKKwkuLi4KKy0tIEZ1cnRoZXIgUmVsZWFzZSA3IGV4dGVuc2lvbnMgaGVyZQorfQorCistLSBHQU5TUyBMb2NhdGlvbiBJbmZvcm1hdGlvbiBjb250YWlucyBsb2NhdGlvbiBlc3RpbWF0ZSwgdGltZSBzdGFtcCB3aXRoIHVuY2VydGFpbnR5IAorLS0gYW5kIG9wdGlvbmFsbHkgUmVmZXJlbmNlIEZyYW1lIGZpZWxkCitHQU5TU0xvY2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworIHJlZmVyZW5jZUZyYW1lIFJlZmVyZW5jZUZyYW1lIE9QVElPTkFMLCAtLSBSZWZlcmVuY2UgRnJhbWUgTnVtYmVyCisgZ2Fuc3NUT0RtIEdBTlNTVE9EbSBPUFRJT05BTCwgLS0gR05TUyBUT0QgbW9kdWxvCisgZ2Fuc3NUT0RGcmFjIElOVEVHRVIgKDAgLi4gMTYzODQpIE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisJZ2Fuc3NUT0RVbmNlcnRhaW50eSBHQU5TU1RPRFVuY2VydGFpbnR5IE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgZ2Fuc3NUaW1lSUQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCWZpeFR5cGUJCQkgRml4VHlwZSwKKyBwb3NEYXRhIFBvc2l0aW9uRGF0YSwKKyBzdGF0aW9uYXJ5SW5kaWNhdGlvbiBJTlRFR0VSKDAgLi4gMSkgT1BUSU9OQUwsIC0tICcwJyBpZiBtb3Zpbmcgb3IgbW90aW9uIG5vdCBrbm93biAKKwktLSBQb3NzaWJsZSBzaGFwZXMgY2FycmllZCBpbiBwb3NFc3RpbWF0ZSBhcmUKKwktLSBlbGxpcHNvaWQgcG9pbnQsCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgZWxsaXBzZQorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKKwlwb3NFc3RpbWF0ZQkJIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwKKyAuLi4KK30KKworUG9zaXRpb25EYXRhIDo6PSBCSVQgU1RSSU5HIHsKKyBlLW90ZCgwKSwKKwlncHMgKDEpLAorCWdhbGlsZW8gKDIpIH0gKFNJWkUgKDMuLjE2KSkKKworCistLSBHQU5TUyBUT0QgbW9kdWxvIDEgaG91cgorR0FOU1NUT0RtIDo6PSBJTlRFR0VSICgwIC4uIDM1OTk5OTkpCisKK1JlZmVyZW5jZUZyYW1lIDo6PSBTRVFVRU5DRSB7CisgcmVmZXJlbmNlRk4gSU5URUdFUiAoMCAuLiA2NTUzNSksCisJLS0gTm90ZSB0aGF0IGFwcGxpY2FibGUgcmFuZ2UgZm9yIHJlZmVyZW5jZUZOIGlzIDAgLSA0MjQzMQorIHJlZmVyZW5jZUZOTVNCIElOVEVHRVIgKDAgLi4gNjMpIE9QVElPTkFMIC0tIE1TQiBvZiBSZWZlcmVuY2UgRnJhbWUgTnVtYmVyCit9CisKKworCistLSBHQU5TUyBNZWFzdXJlbWVudCBJbmZvcm1hdGlvbiAKK0dBTlNTTWVhc3VyZUluZm8gOjo9IFNFUVVFTkNFIHsKKwktLSBNZWFzdXJlbWVudCBpbmZvIGVsZW1lbnRzCisJLS0gdXNlciBoYXMgdG8gbWFrZSBzdXJlIHRoYXQgaW4gdGhpcyBlbGVtZW50IGlzIG51bWJlciBvZiBlbGVtZW50cworCS0tIGRlZmluZWQgaW4gcmVmZXJlbmNlIEJUUyBpZGVudGl0eQorIGdhbnNzTXNyU2V0TGlzdCBTZXFPZkdBTlNTLU1zclNldEVsZW1lbnQKK30KK1NlcU9mR0FOU1MtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMykpIE9GIEdBTlNTLU1zclNldEVsZW1lbnQKKworLS0gR0FOU1MgbWVhc3VyZW1lbnQgaW5mb3JtYXRpb24gMS0zIHRpbWVzIGluIGEgbWVzc2FnZQorR0FOU1MtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIHJlZmVyZW5jZUZyYW1lIFJlZmVyZW5jZUZyYW1lIE9QVElPTkFMLCAtLSBSZWZlcmVuY2UgRnJhbWUgTnVtYmVyCisgZ2Fuc3NUT0RtIEdBTlNTVE9EbSBPUFRJT05BTCwgLS0gR0FOU1MgVE9EIG1vZHVsbworIGRlbHRhR05BU1NUT0QgSU5URUdFUiAoMCAuLiAxMjcpIE9QVElPTkFMLAorCWdhbnNzVE9EVW5jZXJ0YWludHkgR0FOU1NUT0RVbmNlcnRhaW50eSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yaW5nIHRvIEFubmV4CisKKyAtLU5fU0dOX1RZUEUgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgU2VxT2ZHQU5TUy1TZ25UeXBlRWxlbWVudAorIGdhbnNzLVNnblR5cGVMaXN0IFNlcU9mR0FOU1MtU2duVHlwZUVsZW1lbnQKK30KKworLS0gTWVhc3VyZW1lbnRzIGNhbiBiZSByZXR1cm5lZCB1cCB0byA2IGRpZmZlcmVudCBzaWduYWwgdHlwZXMgCitTZXFPZkdBTlNTLVNnblR5cGVFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi42KSkgT0YgR0FOU1MtU2duVHlwZUVsZW1lbnQKKworR0FOU1MtU2duVHlwZUVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1NpZ25hbElECQlJTlRFR0VSICgwIC4uIDE1KSwgLS0gQ29kaW5nIGFjY3JvZGluZyB0byBBbm5leAorIC0tTl9TR04gY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgU2VxT2ZHQU5TUy1TZ25FbGVtZW50CisgZ2Fuc3MtU2duTGlzdCBTZXFPZkdBTlNTLVNnbkVsZW1lbnQKK30KKworLS0gTWVhc3VyZW1lbnRzIGNhbiBiZSByZXR1cm5lZCB1cCB0byAxNiBwZXIgc2lnbmFsIHR5cGVzIAorU2VxT2ZHQU5TUy1TZ25FbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNikpIE9GIEdBTlNTLVNnbkVsZW1lbnQKKworCitHQU5TUy1TZ25FbGVtZW50IDo6PSBTRVFVRU5DRSB7Cisgc3ZJRCBTVklELAorIGNObyBJTlRFR0VSICgwIC4uIDYzKSwKKyBtcGF0aERldCBNcGF0aEluZGljLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgY2FycmllclF1YWxpdHlJbmQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGNvZGVQaGFzZSBJTlRFR0VSICgwIC4uIDIwOTcxNTEpLAorIGludGVnZXJDb2RlUGhhc2UgSU5URUdFUiAoMCAuLiA2MykgT1BUSU9OQUwsCisgY29kZVBoYXNlUk1TRXJyb3IgSU5URUdFUiAoMC4uNjMpLCAtLSBDb2RpbmcgYWNjb3JpbmcgdG8gQW5uZXgKKyBkb3BwbGVyIElOVEVHRVIgKC0zMjc2OCAuLiAzMjc2NykgT1BUSU9OQUwsCisgYWRyIElOVEVHRVIgKDAgLi4gMzM1NTQ0MzEpIE9QVElPTkFMCit9CisKK1JlbDctQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3MtQXNzaXN0RGF0YSBHQU5TUy1Bc3Npc3REYXRhIE9QVElPTkFMLAorIGdhbnNzQ2FycmllclBoYXNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCisgZ2Fuc3NUT0RHU01UaW1lQXNzb2NpYXRpb25NZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwKKwkuLi4KKy0tIFBvc3NpYmx5IG1vcmUgZXh0ZW5zaW9ucyBmb3IgUmVsZWFzZSA3IGhlcmUKK30KKworRU5ECmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtTWVzc2FnZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLU1lc3NhZ2VzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE0MGUyCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLU1lc3NhZ2VzLmFzbgpAQCAtMCwwICsxLDM4IEBACistLSBSUkxQLU1lc3NhZ2VzLmFzbgorLS0gJElkJAorLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDQ0LjAzMSBWNy40LjAgKDIwMDctMDMpCistLSBodHRwOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9hcmNoaXZlLzQ0X3Nlcmllcy80NC4wMzEvNDQwMzEtNzQwLnppcC80NDAzMS03NDAuZG9jCistLQorLS0gMy4xIEdlbmVyYWwgRm9ybWF0IG9mIFJSTFAgTWVzc2FnZQorLS0KKworUlJMUC1NZXNzYWdlcworLS0geyBSUkxQLW1lc3NhZ2VzIH0KKworREVGSU5JVElPTlMgQVVUT01BVElDIFRBR1MgOjo9CisKK0JFR0lOCisKK0lNUE9SVFMKKwlNc3JQb3NpdGlvbi1SZXEsIE1zclBvc2l0aW9uLVJzcCwgQXNzaXN0YW5jZURhdGEsCisJUHJvdG9jb2xFcnJvcgorRlJPTQorCVJSTFAtQ29tcG9uZW50cyAJLS0geyBSUkxQLUNvbXBvbmVudHMgfQorOworCitQRFUgOjo9IFNFUVVFTkNFIHsKKwlyZWZlcmVuY2VOdW1iZXIJCQlJTlRFR0VSICgwLi43KSwKKwljb21wb25lbnQJCQkJUlJMUC1Db21wb25lbnQKK30KKworUlJMUC1Db21wb25lbnQgOjo9IENIT0lDRSB7CisJbXNyUG9zaXRpb25SZXEJCQlNc3JQb3NpdGlvbi1SZXEsCisJbXNyUG9zaXRpb25Sc3AJCQlNc3JQb3NpdGlvbi1Sc3AsCisJYXNzaXN0YW5jZURhdGEJCQlBc3Npc3RhbmNlRGF0YSwKKwlhc3Npc3RhbmNlRGF0YUFjawkJTlVMTCwKKwlwcm90b2NvbEVycm9yCQkJUHJvdG9jb2xFcnJvciwKKwkuLi4KKworfQorCitFTkQKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvcGF0Y2gtcnJscC1jb21wb25lbnRzLmRpZmYgYi9ycmxwLWVwaGVtZXJpcy9hc24xL3BhdGNoLXJybHAtY29tcG9uZW50cy5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZTU1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL3BhdGNoLXJybHAtY29tcG9uZW50cy5kaWZmCkBAIC0wLDAgKzEsMzYgQEAKKy0tLSBSUkxQLUNvbXBvbmVudHMuYXNuCTIwMDktMTAtMjYgMjI6MTA6NDQuMDAwMDAwMDAwICswMTAwCisrKysgUlJMUC1Db21wb25lbnRzLmFzbgkyMDA5LTEwLTI2IDIyOjEwOjQ0LjAwMDAwMDAwMCArMDEwMAorQEAgLTE4LDE2ICsxOCwxNiBAQAorIAlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sIFZlbG9jaXR5RXN0aW1hdGUKKyBGUk9NCisgCU1BUC1MQ1MtRGF0YVR5cGVzIHsKKy0JY2NpdHQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKy0JZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1MQ1MtRGF0YVR5cGVzICgyNSkgdmVyc2lvbjUgKDUpfQorKwlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorKwlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUxDUy1EYXRhVHlwZXMgKDI1KSB2ZXJzaW9uMTEgKDExKX0KKyAKKyAJRXh0ZW5zaW9uQ29udGFpbmVyCisgRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKy0JY2NpdHQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKy0JZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uNCAoNCl9CisrCWl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisrCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisgOworIAorIC0tIEFkZCBoZXJlIG90aGVyIEFTTi4xIGRlZmluaXRpb25zIHByZXNlbnRlZCBiZWxvdworIC0tIGluIGNoYXB0ZXJzIDQgYW5kIDUuCisgCitAQCAtMzA1LDExICszMDUsMTEgQEAKKyBTeXN0ZW1JbmZvSW5kZXggOjo9IElOVEVHRVIgKDEuLjMyKQorIAorIENlbGxJREFuZExBQyA6Oj0gU0VRVUVOQ0UgeworLQlyZWZlcmVuY2VMQUMJTEFDLAkJCQktLSBMb2NhdGlvbiBhcmVhIGNvZGUKKysJcmVmZXJlbmNlTEFDCUxBQ0lELAkJCQktLSBMb2NhdGlvbiBhcmVhIGNvZGUKKyAJcmVmZXJlbmNlQ0kJCUNlbGxJRAkJCQktLSBDZWxsIGlkZW50aXR5CisgfQorIENlbGxJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCistTEFDIDo6PSBJTlRFR0VSICgwLi42NTUzNSkKKytMQUNJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCisgCisgLS0gT1RELU1lYXN1cmVJbmZvCisgT1RELU1lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAwX2FkZF9lbnVtZXJhdGVkX3ZlcmJvc2UuZGlmZiBiL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDBfYWRkX2VudW1lcmF0ZWRfdmVyYm9zZS5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzIyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAwX2FkZF9lbnVtZXJhdGVkX3ZlcmJvc2UuZGlmZgpAQCAtMCwwICsxLDU2IEBACitJbmRleDogc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmMJKHJldmlzaW9uIDE0MDcpCisrKysgc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuYwkod29ya2luZyBjb3B5KQorQEAgLTIyLDcgKzIyLDcgQEAKKyAJIkVOVU1FUkFURUQiLAkJCS8qIFRoZSBBU04uMSB0eXBlIGlzIHN0aWxsIEVOVU1FUkFURUQgKi8KKyAJIkVOVU1FUkFURUQiLAorIAlOYXRpdmVJbnRlZ2VyX2ZyZWUsCistCU5hdGl2ZUludGVnZXJfcHJpbnQsCisrCU5hdGl2ZUVudW1lcmF0ZWRfcHJpbnQsCisgCWFzbl9nZW5lcmljX25vX2NvbnN0cmFpbnQsCisgCU5hdGl2ZUludGVnZXJfZGVjb2RlX2JlciwKKyAJTmF0aXZlSW50ZWdlcl9lbmNvZGVfZGVyLAorQEAgLTIwNSwzICsyMDUsMzAgQEAKKyAJX0FTTl9FTkNPREVEX09LKGVyKTsKKyB9CisgCisraW50CisrTmF0aXZlRW51bWVyYXRlZF9wcmludChhc25fVFlQRV9kZXNjcmlwdG9yX3QgKnRkLCBjb25zdCB2b2lkICpzcHRyLCBpbnQgaWxldmVsLAorKwlhc25fYXBwX2NvbnN1bWVfYnl0ZXNfZiAqY2IsIHZvaWQgKmFwcF9rZXkpIHsKKysJYXNuX0lOVEVHRVJfc3BlY2lmaWNzX3QgKnNwZWNzPShhc25fSU5URUdFUl9zcGVjaWZpY3NfdCAqKXRkLT5zcGVjaWZpY3M7CisrCWNvbnN0IGxvbmcgKm5hdGl2ZSA9IChjb25zdCBsb25nICopc3B0cjsKKysJY2hhciBzY3JhdGNoWzI1Nl07CisrCWludCByZXQ7CisrCisrCSh2b2lkKXRkOwkvKiBVbnVzZWQgYXJndW1lbnQgKi8KKysJKHZvaWQpaWxldmVsOwkvKiBVbnVzZWQgYXJndW1lbnQgKi8KKysKKysJaWYobmF0aXZlKSB7CisrCQljb25zdCBhc25fSU5URUdFUl9lbnVtX21hcF90ICptYXAgPSBJTlRFR0VSX21hcF92YWx1ZTJlbnVtKHNwZWNzLCAqbmF0aXZlKTsKKysJCWlmIChtYXAgJiYgbWFwLT5lbnVtX2xlbiAmJiBtYXAtPmVudW1fbmFtZSkgeworKwkJCXJldCA9IHNucHJpbnRmKHNjcmF0Y2gsIHNpemVvZihzY3JhdGNoKSwKKysJCQkJIiVzIiwgbWFwLT5lbnVtX25hbWUpOworKwkJfSBlbHNlIHsKKysJCQlyZXQgPSBzbnByaW50ZihzY3JhdGNoLCBzaXplb2Yoc2NyYXRjaCksCisrCQkJCShzcGVjcyAmJiBzcGVjcy0+ZmllbGRfdW5zaWduZWQpCisrCQkJCT8gIiVsdSIgOiAiJWxkIiwgKm5hdGl2ZSk7CisrCQl9CisrCQlhc3NlcnQocmV0ID4gMCAmJiAoc2l6ZV90KXJldCA8IHNpemVvZihzY3JhdGNoKSk7CisrCQlyZXR1cm4gKGNiKHNjcmF0Y2gsIHJldCwgYXBwX2tleSkgPCAwKSA/IC0xIDogMDsKKysJfSBlbHNlIHsKKysJCXJldHVybiAoY2IoIjxhYnNlbnQ+IiwgOCwgYXBwX2tleSkgPCAwKSA/IC0xIDogMDsKKysJfQorK30KK0luZGV4OiBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5oCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuaAkocmV2aXNpb24gMTQwNykKKysrKyBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5oCSh3b3JraW5nIGNvcHkpCitAQCAtMjQsNiArMjQsNyBAQAorIHhlcl90eXBlX2VuY29kZXJfZiBOYXRpdmVFbnVtZXJhdGVkX2VuY29kZV94ZXI7CisgcGVyX3R5cGVfZGVjb2Rlcl9mIE5hdGl2ZUVudW1lcmF0ZWRfZGVjb2RlX3VwZXI7CisgcGVyX3R5cGVfZW5jb2Rlcl9mIE5hdGl2ZUVudW1lcmF0ZWRfZW5jb2RlX3VwZXI7CisrYXNuX3N0cnVjdF9wcmludF9mIE5hdGl2ZUVudW1lcmF0ZWRfcHJpbnQ7CisgCisgI2lmZGVmIF9fY3BsdXNwbHVzCisgfQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMV9maXhfcGVyX2VuY29kaW5nX2RpZXRlci5kaWZmIGIvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMV9maXhfcGVyX2VuY29kaW5nX2RpZXRlci5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOWMyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAxX2ZpeF9wZXJfZW5jb2RpbmdfZGlldGVyLmRpZmYKQEAgLTAsMCArMSwxNyBAQAorSW5kZXg6IHNrZWxldG9ucy9wZXJfc3VwcG9ydC5jCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gc2tlbGV0b25zL3Blcl9zdXBwb3J0LmMJKHJldmlzaW9uIDE0MDcpCisrKysgc2tlbGV0b25zL3Blcl9zdXBwb3J0LmMJKHdvcmtpbmcgY29weSkKK0BAIC0zMzYsNyArMzM2LDEyIEBACisgCQlidWZbM10gPSBiaXRzOworIAllbHNlIHsKKyAJCUFTTl9ERUJVRygiLT5bUEVSIG91dCBzcGxpdCAlZF0iLCBvYml0cyk7CisrI2lmIDEgLy8gRGlldGVyCisrCQlwby0+bmJvZmYgLT0gb2JpdHM7IC8vIHVuZG8gaW5jcmVtZW50YXRpb24gZnJvbSBhIGZldyBsaW5lcyBhYm92ZQorKwkJcGVyX3B1dF9mZXdfYml0cyhwbywgYml0cyA+PiAob2JpdHMgLSAyNCksIDI0KTsgLy8gc2hpZnQgYWNjb3JkaW5nIHRvIHRoZSByZXN0IG9mIHRoZSBiaXRzIAorKyNlbHNlCQkKKyAJCXBlcl9wdXRfZmV3X2JpdHMocG8sIGJpdHMgPj4gOCwgMjQpOworKyNlbmRpZgorIAkJcGVyX3B1dF9mZXdfYml0cyhwbywgYml0cywgb2JpdHMgLSAyNCk7CisgCQlBU05fREVCVUcoIjwtW1BFUiBvdXQgc3BsaXQgJWRdIiwgb2JpdHMpOworIAl9CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9kYXRhLnVieCBiL3JybHAtZXBoZW1lcmlzL2RhdGEudWJ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Y2RkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9kYXRhLnVieApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9nZXQtdGVzdC1kYXRhLnNoIGIvcnJscC1lcGhlbWVyaXMvZ2V0LXRlc3QtZGF0YS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNjlmNDNjCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZ2V0LXRlc3QtZGF0YS5zaApAQCAtMCwwICsxLDE3IEBACisjIS9iaW4vc2gKKworREVWPSQxCitPVVRGPSQyCisKKyMgQ2hhbmdlIG1vZGUKK2VjaG8gLWVuICJcJFBVQlgsNDEsMSwwMDAxLDAwMDEsOTYwMCwwKjE0XHJcbiIgPiAke0RFVn0KKworIyBXYWl0IGEgbGl0dGxlCitzbGVlcCAyCisKKyMgU3RhcnQgZHVtcAorZWNobyAtZW4gIlx4YjVceDYyXHgwMVx4MDJceDAwXHgwMFx4MDNceDBhIiB8IFwKKwlzb2NhdCAtdDUgJHtERVZ9LGI5NjAwLHJhdyxjbG9jYWw9MSxlY2hvPTAgLSA+ICR7T1VURn0KK2VjaG8gLWVuICJceGI1XHg2Mlx4MGJceDEwXHgwMFx4MDBceDFiXHg1YyIgfCBcCisJc29jYXQgLXQxMCAke0RFVn0sYjk2MDAscmF3LGNsb2NhbD0xLGVjaG89MCAtID4+ICR7T1VURn0KKwpkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL3JybHAtZXBoZW1lcmlzL2dwbC0yLjAudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gQ09QWUlORwpjb3B5IHRvIHJybHAtZXBoZW1lcmlzL2dwbC0yLjAudHh0CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9ncGwtMy4wLnR4dCBiL3JybHAtZXBoZW1lcmlzL2dwbC0zLjAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTllZDAKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9ncGwtMy4wLnR4dApAQCAtMCwwICsxLDY3NCBAQAorICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDMsIDI5IEp1bmUgMjAwNworCisgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA8aHR0cDovL2ZzZi5vcmcvPgorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGUKKworICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgYSBmcmVlLCBjb3B5bGVmdCBsaWNlbnNlIGZvcgorc29mdHdhcmUgYW5kIG90aGVyIGtpbmRzIG9mIHdvcmtzLgorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhbmQgb3RoZXIgcHJhY3RpY2FsIHdvcmtzIGFyZSBkZXNpZ25lZAordG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIHRoZSB3b3Jrcy4gIEJ5IGNvbnRyYXN0LAordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8KK3NoYXJlIGFuZCBjaGFuZ2UgYWxsIHZlcnNpb25zIG9mIGEgcHJvZ3JhbS0tdG8gbWFrZSBzdXJlIGl0IHJlbWFpbnMgZnJlZQorc29mdHdhcmUgZm9yIGFsbCBpdHMgdXNlcnMuICBXZSwgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdXNlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vc3Qgb2Ygb3VyIHNvZnR3YXJlOyBpdCBhcHBsaWVzIGFsc28gdG8KK2FueSBvdGhlciB3b3JrIHJlbGVhc2VkIHRoaXMgd2F5IGJ5IGl0cyBhdXRob3JzLiAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoZW0gaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91Cit3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldworZnJlZSBwcm9ncmFtcywgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBwcmV2ZW50IG90aGVycyBmcm9tIGRlbnlpbmcgeW91Cit0aGVzZSByaWdodHMgb3IgYXNraW5nIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIFRoZXJlZm9yZSwgeW91IGhhdmUKK2NlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZgoreW91IG1vZGlmeSBpdDogcmVzcG9uc2liaWxpdGllcyB0byByZXNwZWN0IHRoZSBmcmVlZG9tIG9mIG90aGVycy4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBwYXNzIG9uIHRvIHRoZSByZWNpcGllbnRzIHRoZSBzYW1lCitmcmVlZG9tcyB0aGF0IHlvdSByZWNlaXZlZC4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZQorb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkKK2tub3cgdGhlaXIgcmlnaHRzLgorCisgIERldmVsb3BlcnMgdGhhdCB1c2UgdGhlIEdOVSBHUEwgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczoKKygxKSBhc3NlcnQgY29weXJpZ2h0IG9uIHRoZSBzb2Z0d2FyZSwgYW5kICgyKSBvZmZlciB5b3UgdGhpcyBMaWNlbnNlCitnaXZpbmcgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IGl0LgorCisgIEZvciB0aGUgZGV2ZWxvcGVycycgYW5kIGF1dGhvcnMnIHByb3RlY3Rpb24sIHRoZSBHUEwgY2xlYXJseSBleHBsYWlucwordGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiAgRm9yIGJvdGggdXNlcnMnIGFuZAorYXV0aG9ycycgc2FrZSwgdGhlIEdQTCByZXF1aXJlcyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIGJlIG1hcmtlZCBhcworY2hhbmdlZCwgc28gdGhhdCB0aGVpciBwcm9ibGVtcyB3aWxsIG5vdCBiZSBhdHRyaWJ1dGVkIGVycm9uZW91c2x5IHRvCithdXRob3JzIG9mIHByZXZpb3VzIHZlcnNpb25zLgorCisgIFNvbWUgZGV2aWNlcyBhcmUgZGVzaWduZWQgdG8gZGVueSB1c2VycyBhY2Nlc3MgdG8gaW5zdGFsbCBvciBydW4KK21vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBzb2Z0d2FyZSBpbnNpZGUgdGhlbSwgYWx0aG91Z2ggdGhlIG1hbnVmYWN0dXJlcgorY2FuIGRvIHNvLiAgVGhpcyBpcyBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSB3aXRoIHRoZSBhaW0gb2YKK3Byb3RlY3RpbmcgdXNlcnMnIGZyZWVkb20gdG8gY2hhbmdlIHRoZSBzb2Z0d2FyZS4gIFRoZSBzeXN0ZW1hdGljCitwYXR0ZXJuIG9mIHN1Y2ggYWJ1c2Ugb2NjdXJzIGluIHRoZSBhcmVhIG9mIHByb2R1Y3RzIGZvciBpbmRpdmlkdWFscyB0bwordXNlLCB3aGljaCBpcyBwcmVjaXNlbHkgd2hlcmUgaXQgaXMgbW9zdCB1bmFjY2VwdGFibGUuICBUaGVyZWZvcmUsIHdlCitoYXZlIGRlc2lnbmVkIHRoaXMgdmVyc2lvbiBvZiB0aGUgR1BMIHRvIHByb2hpYml0IHRoZSBwcmFjdGljZSBmb3IgdGhvc2UKK3Byb2R1Y3RzLiAgSWYgc3VjaCBwcm9ibGVtcyBhcmlzZSBzdWJzdGFudGlhbGx5IGluIG90aGVyIGRvbWFpbnMsIHdlCitzdGFuZCByZWFkeSB0byBleHRlbmQgdGhpcyBwcm92aXNpb24gdG8gdGhvc2UgZG9tYWlucyBpbiBmdXR1cmUgdmVyc2lvbnMKK29mIHRoZSBHUEwsIGFzIG5lZWRlZCB0byBwcm90ZWN0IHRoZSBmcmVlZG9tIG9mIHVzZXJzLgorCisgIEZpbmFsbHksIGV2ZXJ5IHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuCitTdGF0ZXMgc2hvdWxkIG5vdCBhbGxvdyBwYXRlbnRzIHRvIHJlc3RyaWN0IGRldmVsb3BtZW50IGFuZCB1c2Ugb2YKK3NvZnR3YXJlIG9uIGdlbmVyYWwtcHVycG9zZSBjb21wdXRlcnMsIGJ1dCBpbiB0aG9zZSB0aGF0IGRvLCB3ZSB3aXNoIHRvCithdm9pZCB0aGUgc3BlY2lhbCBkYW5nZXIgdGhhdCBwYXRlbnRzIGFwcGxpZWQgdG8gYSBmcmVlIHByb2dyYW0gY291bGQKK21ha2UgaXQgZWZmZWN0aXZlbHkgcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHRoZSBHUEwgYXNzdXJlcyB0aGF0CitwYXRlbnRzIGNhbm5vdCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgcHJvZ3JhbSBub24tZnJlZS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworICAgICAgICAgICAgICAgICAgICAgICBURVJNUyBBTkQgQ09ORElUSU9OUworCisgIDAuIERlZmluaXRpb25zLgorCisgICJUaGlzIExpY2Vuc2UiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgICJDb3B5cmlnaHQiIGFsc28gbWVhbnMgY29weXJpZ2h0LWxpa2UgbGF3cyB0aGF0IGFwcGx5IHRvIG90aGVyIGtpbmRzIG9mCit3b3Jrcywgc3VjaCBhcyBzZW1pY29uZHVjdG9yIG1hc2tzLgorCisgICJUaGUgUHJvZ3JhbSIgcmVmZXJzIHRvIGFueSBjb3B5cmlnaHRhYmxlIHdvcmsgbGljZW5zZWQgdW5kZXIgdGhpcworTGljZW5zZS4gIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLiAgIkxpY2Vuc2VlcyIgYW5kCisicmVjaXBpZW50cyIgbWF5IGJlIGluZGl2aWR1YWxzIG9yIG9yZ2FuaXphdGlvbnMuCisKKyAgVG8gIm1vZGlmeSIgYSB3b3JrIG1lYW5zIHRvIGNvcHkgZnJvbSBvciBhZGFwdCBhbGwgb3IgcGFydCBvZiB0aGUgd29yaworaW4gYSBmYXNoaW9uIHJlcXVpcmluZyBjb3B5cmlnaHQgcGVybWlzc2lvbiwgb3RoZXIgdGhhbiB0aGUgbWFraW5nIG9mIGFuCitleGFjdCBjb3B5LiAgVGhlIHJlc3VsdGluZyB3b3JrIGlzIGNhbGxlZCBhICJtb2RpZmllZCB2ZXJzaW9uIiBvZiB0aGUKK2VhcmxpZXIgd29yayBvciBhIHdvcmsgImJhc2VkIG9uIiB0aGUgZWFybGllciB3b3JrLgorCisgIEEgImNvdmVyZWQgd29yayIgbWVhbnMgZWl0aGVyIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0gb3IgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbS4KKworICBUbyAicHJvcGFnYXRlIiBhIHdvcmsgbWVhbnMgdG8gZG8gYW55dGhpbmcgd2l0aCBpdCB0aGF0LCB3aXRob3V0CitwZXJtaXNzaW9uLCB3b3VsZCBtYWtlIHlvdSBkaXJlY3RseSBvciBzZWNvbmRhcmlseSBsaWFibGUgZm9yCitpbmZyaW5nZW1lbnQgdW5kZXIgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGF3LCBleGNlcHQgZXhlY3V0aW5nIGl0IG9uIGEKK2NvbXB1dGVyIG9yIG1vZGlmeWluZyBhIHByaXZhdGUgY29weS4gIFByb3BhZ2F0aW9uIGluY2x1ZGVzIGNvcHlpbmcsCitkaXN0cmlidXRpb24gKHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLCBtYWtpbmcgYXZhaWxhYmxlIHRvIHRoZQorcHVibGljLCBhbmQgaW4gc29tZSBjb3VudHJpZXMgb3RoZXIgYWN0aXZpdGllcyBhcyB3ZWxsLgorCisgIFRvICJjb252ZXkiIGEgd29yayBtZWFucyBhbnkga2luZCBvZiBwcm9wYWdhdGlvbiB0aGF0IGVuYWJsZXMgb3RoZXIKK3BhcnRpZXMgdG8gbWFrZSBvciByZWNlaXZlIGNvcGllcy4gIE1lcmUgaW50ZXJhY3Rpb24gd2l0aCBhIHVzZXIgdGhyb3VnaAorYSBjb21wdXRlciBuZXR3b3JrLCB3aXRoIG5vIHRyYW5zZmVyIG9mIGEgY29weSwgaXMgbm90IGNvbnZleWluZy4KKworICBBbiBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZSBkaXNwbGF5cyAiQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyIKK3RvIHRoZSBleHRlbnQgdGhhdCBpdCBpbmNsdWRlcyBhIGNvbnZlbmllbnQgYW5kIHByb21pbmVudGx5IHZpc2libGUKK2ZlYXR1cmUgdGhhdCAoMSkgZGlzcGxheXMgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSwgYW5kICgyKQordGVsbHMgdGhlIHVzZXIgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHdvcmsgKGV4Y2VwdCB0byB0aGUKK2V4dGVudCB0aGF0IHdhcnJhbnRpZXMgYXJlIHByb3ZpZGVkKSwgdGhhdCBsaWNlbnNlZXMgbWF5IGNvbnZleSB0aGUKK3dvcmsgdW5kZXIgdGhpcyBMaWNlbnNlLCBhbmQgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmCit0aGUgaW50ZXJmYWNlIHByZXNlbnRzIGEgbGlzdCBvZiB1c2VyIGNvbW1hbmRzIG9yIG9wdGlvbnMsIHN1Y2ggYXMgYQorbWVudSwgYSBwcm9taW5lbnQgaXRlbSBpbiB0aGUgbGlzdCBtZWV0cyB0aGlzIGNyaXRlcmlvbi4KKworICAxLiBTb3VyY2UgQ29kZS4KKworICBUaGUgInNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yaworZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgIk9iamVjdCBjb2RlIiBtZWFucyBhbnkgbm9uLXNvdXJjZQorZm9ybSBvZiBhIHdvcmsuCisKKyAgQSAiU3RhbmRhcmQgSW50ZXJmYWNlIiBtZWFucyBhbiBpbnRlcmZhY2UgdGhhdCBlaXRoZXIgaXMgYW4gb2ZmaWNpYWwKK3N0YW5kYXJkIGRlZmluZWQgYnkgYSByZWNvZ25pemVkIHN0YW5kYXJkcyBib2R5LCBvciwgaW4gdGhlIGNhc2Ugb2YKK2ludGVyZmFjZXMgc3BlY2lmaWVkIGZvciBhIHBhcnRpY3VsYXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIG9uZSB0aGF0CitpcyB3aWRlbHkgdXNlZCBhbW9uZyBkZXZlbG9wZXJzIHdvcmtpbmcgaW4gdGhhdCBsYW5ndWFnZS4KKworICBUaGUgIlN5c3RlbSBMaWJyYXJpZXMiIG9mIGFuIGV4ZWN1dGFibGUgd29yayBpbmNsdWRlIGFueXRoaW5nLCBvdGhlcgordGhhbiB0aGUgd29yayBhcyBhIHdob2xlLCB0aGF0IChhKSBpcyBpbmNsdWRlZCBpbiB0aGUgbm9ybWFsIGZvcm0gb2YKK3BhY2thZ2luZyBhIE1ham9yIENvbXBvbmVudCwgYnV0IHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoYXQgTWFqb3IKK0NvbXBvbmVudCwgYW5kIChiKSBzZXJ2ZXMgb25seSB0byBlbmFibGUgdXNlIG9mIHRoZSB3b3JrIHdpdGggdGhhdAorTWFqb3IgQ29tcG9uZW50LCBvciB0byBpbXBsZW1lbnQgYSBTdGFuZGFyZCBJbnRlcmZhY2UgZm9yIHdoaWNoIGFuCitpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbiBzb3VyY2UgY29kZSBmb3JtLiAgQQorIk1ham9yIENvbXBvbmVudCIsIGluIHRoaXMgY29udGV4dCwgbWVhbnMgYSBtYWpvciBlc3NlbnRpYWwgY29tcG9uZW50Cisoa2VybmVsLCB3aW5kb3cgc3lzdGVtLCBhbmQgc28gb24pIG9mIHRoZSBzcGVjaWZpYyBvcGVyYXRpbmcgc3lzdGVtCisoaWYgYW55KSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSB3b3JrIHJ1bnMsIG9yIGEgY29tcGlsZXIgdXNlZCB0bworcHJvZHVjZSB0aGUgd29yaywgb3IgYW4gb2JqZWN0IGNvZGUgaW50ZXJwcmV0ZXIgdXNlZCB0byBydW4gaXQuCisKKyAgVGhlICJDb3JyZXNwb25kaW5nIFNvdXJjZSIgZm9yIGEgd29yayBpbiBvYmplY3QgY29kZSBmb3JtIG1lYW5zIGFsbAordGhlIHNvdXJjZSBjb2RlIG5lZWRlZCB0byBnZW5lcmF0ZSwgaW5zdGFsbCwgYW5kIChmb3IgYW4gZXhlY3V0YWJsZQord29yaykgcnVuIHRoZSBvYmplY3QgY29kZSBhbmQgdG8gbW9kaWZ5IHRoZSB3b3JrLCBpbmNsdWRpbmcgc2NyaXB0cyB0bworY29udHJvbCB0aG9zZSBhY3Rpdml0aWVzLiAgSG93ZXZlciwgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgd29yaydzCitTeXN0ZW0gTGlicmFyaWVzLCBvciBnZW5lcmFsLXB1cnBvc2UgdG9vbHMgb3IgZ2VuZXJhbGx5IGF2YWlsYWJsZSBmcmVlCitwcm9ncmFtcyB3aGljaCBhcmUgdXNlZCB1bm1vZGlmaWVkIGluIHBlcmZvcm1pbmcgdGhvc2UgYWN0aXZpdGllcyBidXQKK3doaWNoIGFyZSBub3QgcGFydCBvZiB0aGUgd29yay4gIEZvciBleGFtcGxlLCBDb3JyZXNwb25kaW5nIFNvdXJjZQoraW5jbHVkZXMgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHNvdXJjZSBmaWxlcyBmb3IKK3RoZSB3b3JrLCBhbmQgdGhlIHNvdXJjZSBjb2RlIGZvciBzaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljYWxseQorbGlua2VkIHN1YnByb2dyYW1zIHRoYXQgdGhlIHdvcmsgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHJlcXVpcmUsCitzdWNoIGFzIGJ5IGludGltYXRlIGRhdGEgY29tbXVuaWNhdGlvbiBvciBjb250cm9sIGZsb3cgYmV0d2VlbiB0aG9zZQorc3VicHJvZ3JhbXMgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSB3b3JrLgorCisgIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgdXNlcnMKK2NhbiByZWdlbmVyYXRlIGF1dG9tYXRpY2FsbHkgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgQ29ycmVzcG9uZGluZworU291cmNlLgorCisgIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYSB3b3JrIGluIHNvdXJjZSBjb2RlIGZvcm0gaXMgdGhhdAorc2FtZSB3b3JrLgorCisgIDIuIEJhc2ljIFBlcm1pc3Npb25zLgorCisgIEFsbCByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UgYXJlIGdyYW50ZWQgZm9yIHRoZSB0ZXJtIG9mCitjb3B5cmlnaHQgb24gdGhlIFByb2dyYW0sIGFuZCBhcmUgaXJyZXZvY2FibGUgcHJvdmlkZWQgdGhlIHN0YXRlZAorY29uZGl0aW9ucyBhcmUgbWV0LiAgVGhpcyBMaWNlbnNlIGV4cGxpY2l0bHkgYWZmaXJtcyB5b3VyIHVubGltaXRlZAorcGVybWlzc2lvbiB0byBydW4gdGhlIHVubW9kaWZpZWQgUHJvZ3JhbS4gIFRoZSBvdXRwdXQgZnJvbSBydW5uaW5nIGEKK2NvdmVyZWQgd29yayBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSBvbmx5IGlmIHRoZSBvdXRwdXQsIGdpdmVuIGl0cworY29udGVudCwgY29uc3RpdHV0ZXMgYSBjb3ZlcmVkIHdvcmsuICBUaGlzIExpY2Vuc2UgYWNrbm93bGVkZ2VzIHlvdXIKK3JpZ2h0cyBvZiBmYWlyIHVzZSBvciBvdGhlciBlcXVpdmFsZW50LCBhcyBwcm92aWRlZCBieSBjb3B5cmlnaHQgbGF3LgorCisgIFlvdSBtYXkgbWFrZSwgcnVuIGFuZCBwcm9wYWdhdGUgY292ZXJlZCB3b3JrcyB0aGF0IHlvdSBkbyBub3QKK2NvbnZleSwgd2l0aG91dCBjb25kaXRpb25zIHNvIGxvbmcgYXMgeW91ciBsaWNlbnNlIG90aGVyd2lzZSByZW1haW5zCitpbiBmb3JjZS4gIFlvdSBtYXkgY29udmV5IGNvdmVyZWQgd29ya3MgdG8gb3RoZXJzIGZvciB0aGUgc29sZSBwdXJwb3NlCitvZiBoYXZpbmcgdGhlbSBtYWtlIG1vZGlmaWNhdGlvbnMgZXhjbHVzaXZlbHkgZm9yIHlvdSwgb3IgcHJvdmlkZSB5b3UKK3dpdGggZmFjaWxpdGllcyBmb3IgcnVubmluZyB0aG9zZSB3b3JrcywgcHJvdmlkZWQgdGhhdCB5b3UgY29tcGx5IHdpdGgKK3RoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgaW4gY29udmV5aW5nIGFsbCBtYXRlcmlhbCBmb3Igd2hpY2ggeW91IGRvCitub3QgY29udHJvbCBjb3B5cmlnaHQuICBUaG9zZSB0aHVzIG1ha2luZyBvciBydW5uaW5nIHRoZSBjb3ZlcmVkIHdvcmtzCitmb3IgeW91IG11c3QgZG8gc28gZXhjbHVzaXZlbHkgb24geW91ciBiZWhhbGYsIHVuZGVyIHlvdXIgZGlyZWN0aW9uCithbmQgY29udHJvbCwgb24gdGVybXMgdGhhdCBwcm9oaWJpdCB0aGVtIGZyb20gbWFraW5nIGFueSBjb3BpZXMgb2YKK3lvdXIgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgb3V0c2lkZSB0aGVpciByZWxhdGlvbnNoaXAgd2l0aCB5b3UuCisKKyAgQ29udmV5aW5nIHVuZGVyIGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIGlzIHBlcm1pdHRlZCBzb2xlbHkgdW5kZXIKK3RoZSBjb25kaXRpb25zIHN0YXRlZCBiZWxvdy4gIFN1YmxpY2Vuc2luZyBpcyBub3QgYWxsb3dlZDsgc2VjdGlvbiAxMAorbWFrZXMgaXQgdW5uZWNlc3NhcnkuCisKKyAgMy4gUHJvdGVjdGluZyBVc2VycycgTGVnYWwgUmlnaHRzIEZyb20gQW50aS1DaXJjdW12ZW50aW9uIExhdy4KKworICBObyBjb3ZlcmVkIHdvcmsgc2hhbGwgYmUgZGVlbWVkIHBhcnQgb2YgYW4gZWZmZWN0aXZlIHRlY2hub2xvZ2ljYWwKK21lYXN1cmUgdW5kZXIgYW55IGFwcGxpY2FibGUgbGF3IGZ1bGZpbGxpbmcgb2JsaWdhdGlvbnMgdW5kZXIgYXJ0aWNsZQorMTEgb2YgdGhlIFdJUE8gY29weXJpZ2h0IHRyZWF0eSBhZG9wdGVkIG9uIDIwIERlY2VtYmVyIDE5OTYsIG9yCitzaW1pbGFyIGxhd3MgcHJvaGliaXRpbmcgb3IgcmVzdHJpY3RpbmcgY2lyY3VtdmVudGlvbiBvZiBzdWNoCittZWFzdXJlcy4KKworICBXaGVuIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHlvdSB3YWl2ZSBhbnkgbGVnYWwgcG93ZXIgdG8gZm9yYmlkCitjaXJjdW12ZW50aW9uIG9mIHRlY2hub2xvZ2ljYWwgbWVhc3VyZXMgdG8gdGhlIGV4dGVudCBzdWNoIGNpcmN1bXZlbnRpb24KK2lzIGVmZmVjdGVkIGJ5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSB3aXRoIHJlc3BlY3QgdG8KK3RoZSBjb3ZlcmVkIHdvcmssIGFuZCB5b3UgZGlzY2xhaW0gYW55IGludGVudGlvbiB0byBsaW1pdCBvcGVyYXRpb24gb3IKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBhcyBhIG1lYW5zIG9mIGVuZm9yY2luZywgYWdhaW5zdCB0aGUgd29yaydzCit1c2VycywgeW91ciBvciB0aGlyZCBwYXJ0aWVzJyBsZWdhbCByaWdodHMgdG8gZm9yYmlkIGNpcmN1bXZlbnRpb24gb2YKK3RlY2hub2xvZ2ljYWwgbWVhc3VyZXMuCisKKyAgNC4gQ29udmV5aW5nIFZlcmJhdGltIENvcGllcy4KKworICBZb3UgbWF5IGNvbnZleSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZSBhcyB5b3UKK3JlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kCithcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2U7CitrZWVwIGludGFjdCBhbGwgbm90aWNlcyBzdGF0aW5nIHRoYXQgdGhpcyBMaWNlbnNlIGFuZCBhbnkKK25vbi1wZXJtaXNzaXZlIHRlcm1zIGFkZGVkIGluIGFjY29yZCB3aXRoIHNlY3Rpb24gNyBhcHBseSB0byB0aGUgY29kZTsKK2tlZXAgaW50YWN0IGFsbCBub3RpY2VzIG9mIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYWxsCityZWNpcGllbnRzIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworICBZb3UgbWF5IGNoYXJnZSBhbnkgcHJpY2Ugb3Igbm8gcHJpY2UgZm9yIGVhY2ggY29weSB0aGF0IHlvdSBjb252ZXksCithbmQgeW91IG1heSBvZmZlciBzdXBwb3J0IG9yIHdhcnJhbnR5IHByb3RlY3Rpb24gZm9yIGEgZmVlLgorCisgIDUuIENvbnZleWluZyBNb2RpZmllZCBTb3VyY2UgVmVyc2lvbnMuCisKKyAgWW91IG1heSBjb252ZXkgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBvciB0aGUgbW9kaWZpY2F0aW9ucyB0bworcHJvZHVjZSBpdCBmcm9tIHRoZSBQcm9ncmFtLCBpbiB0aGUgZm9ybSBvZiBzb3VyY2UgY29kZSB1bmRlciB0aGUKK3Rlcm1zIG9mIHNlY3Rpb24gNCwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IG1vZGlmaWVkCisgICAgaXQsIGFuZCBnaXZpbmcgYSByZWxldmFudCBkYXRlLgorCisgICAgYikgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgaXQgaXMKKyAgICByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBjb25kaXRpb25zIGFkZGVkIHVuZGVyIHNlY3Rpb24KKyAgICA3LiAgVGhpcyByZXF1aXJlbWVudCBtb2RpZmllcyB0aGUgcmVxdWlyZW1lbnQgaW4gc2VjdGlvbiA0IHRvCisgICAgImtlZXAgaW50YWN0IGFsbCBub3RpY2VzIi4KKworICAgIGMpIFlvdSBtdXN0IGxpY2Vuc2UgdGhlIGVudGlyZSB3b3JrLCBhcyBhIHdob2xlLCB1bmRlciB0aGlzCisgICAgTGljZW5zZSB0byBhbnlvbmUgd2hvIGNvbWVzIGludG8gcG9zc2Vzc2lvbiBvZiBhIGNvcHkuICBUaGlzCisgICAgTGljZW5zZSB3aWxsIHRoZXJlZm9yZSBhcHBseSwgYWxvbmcgd2l0aCBhbnkgYXBwbGljYWJsZSBzZWN0aW9uIDcKKyAgICBhZGRpdGlvbmFsIHRlcm1zLCB0byB0aGUgd2hvbGUgb2YgdGhlIHdvcmssIGFuZCBhbGwgaXRzIHBhcnRzLAorICAgIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgYXJlIHBhY2thZ2VkLiAgVGhpcyBMaWNlbnNlIGdpdmVzIG5vCisgICAgcGVybWlzc2lvbiB0byBsaWNlbnNlIHRoZSB3b3JrIGluIGFueSBvdGhlciB3YXksIGJ1dCBpdCBkb2VzIG5vdAorICAgIGludmFsaWRhdGUgc3VjaCBwZXJtaXNzaW9uIGlmIHlvdSBoYXZlIHNlcGFyYXRlbHkgcmVjZWl2ZWQgaXQuCisKKyAgICBkKSBJZiB0aGUgd29yayBoYXMgaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2VzLCBlYWNoIG11c3QgZGlzcGxheQorICAgIEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXM7IGhvd2V2ZXIsIGlmIHRoZSBQcm9ncmFtIGhhcyBpbnRlcmFjdGl2ZQorICAgIGludGVyZmFjZXMgdGhhdCBkbyBub3QgZGlzcGxheSBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzLCB5b3VyCisgICAgd29yayBuZWVkIG5vdCBtYWtlIHRoZW0gZG8gc28uCisKKyAgQSBjb21waWxhdGlvbiBvZiBhIGNvdmVyZWQgd29yayB3aXRoIG90aGVyIHNlcGFyYXRlIGFuZCBpbmRlcGVuZGVudAord29ya3MsIHdoaWNoIGFyZSBub3QgYnkgdGhlaXIgbmF0dXJlIGV4dGVuc2lvbnMgb2YgdGhlIGNvdmVyZWQgd29yaywKK2FuZCB3aGljaCBhcmUgbm90IGNvbWJpbmVkIHdpdGggaXQgc3VjaCBhcyB0byBmb3JtIGEgbGFyZ2VyIHByb2dyYW0sCitpbiBvciBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSwgaXMgY2FsbGVkIGFuCisiYWdncmVnYXRlIiBpZiB0aGUgY29tcGlsYXRpb24gYW5kIGl0cyByZXN1bHRpbmcgY29weXJpZ2h0IGFyZSBub3QKK3VzZWQgdG8gbGltaXQgdGhlIGFjY2VzcyBvciBsZWdhbCByaWdodHMgb2YgdGhlIGNvbXBpbGF0aW9uJ3MgdXNlcnMKK2JleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFsIHdvcmtzIHBlcm1pdC4gIEluY2x1c2lvbiBvZiBhIGNvdmVyZWQgd29yaworaW4gYW4gYWdncmVnYXRlIGRvZXMgbm90IGNhdXNlIHRoaXMgTGljZW5zZSB0byBhcHBseSB0byB0aGUgb3RoZXIKK3BhcnRzIG9mIHRoZSBhZ2dyZWdhdGUuCisKKyAgNi4gQ29udmV5aW5nIE5vbi1Tb3VyY2UgRm9ybXMuCisKKyAgWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMKK29mIHNlY3Rpb25zIDQgYW5kIDUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gY29udmV5IHRoZQorbWFjaGluZS1yZWFkYWJsZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLAoraW4gb25lIG9mIHRoZXNlIHdheXM6CisKKyAgICBhKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0CisgICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmaXhlZCBvbiBhIGR1cmFibGUgcGh5c2ljYWwgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgICBiKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0CisgICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSBhCisgICAgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzIGFuZCB2YWxpZCBmb3IgYXMKKyAgICBsb25nIGFzIHlvdSBvZmZlciBzcGFyZSBwYXJ0cyBvciBjdXN0b21lciBzdXBwb3J0IGZvciB0aGF0IHByb2R1Y3QKKyAgICBtb2RlbCwgdG8gZ2l2ZSBhbnlvbmUgd2hvIHBvc3Nlc3NlcyB0aGUgb2JqZWN0IGNvZGUgZWl0aGVyICgxKSBhCisgICAgY29weSBvZiB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGFsbCB0aGUgc29mdHdhcmUgaW4gdGhlCisgICAgcHJvZHVjdCB0aGF0IGlzIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBvbiBhIGR1cmFibGUgcGh5c2ljYWwKKyAgICBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UsIGZvciBhIHByaWNlIG5vCisgICAgbW9yZSB0aGFuIHlvdXIgcmVhc29uYWJsZSBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyB0aGlzCisgICAgY29udmV5aW5nIG9mIHNvdXJjZSwgb3IgKDIpIGFjY2VzcyB0byBjb3B5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZyb20gYSBuZXR3b3JrIHNlcnZlciBhdCBubyBjaGFyZ2UuCisKKyAgICBjKSBDb252ZXkgaW5kaXZpZHVhbCBjb3BpZXMgb2YgdGhlIG9iamVjdCBjb2RlIHdpdGggYSBjb3B5IG9mIHRoZQorICAgIHdyaXR0ZW4gb2ZmZXIgdG8gcHJvdmlkZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBUaGlzCisgICAgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IG9jY2FzaW9uYWxseSBhbmQgbm9uY29tbWVyY2lhbGx5LCBhbmQKKyAgICBvbmx5IGlmIHlvdSByZWNlaXZlZCB0aGUgb2JqZWN0IGNvZGUgd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQKKyAgICB3aXRoIHN1YnNlY3Rpb24gNmIuCisKKyAgICBkKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGJ5IG9mZmVyaW5nIGFjY2VzcyBmcm9tIGEgZGVzaWduYXRlZAorICAgIHBsYWNlIChncmF0aXMgb3IgZm9yIGEgY2hhcmdlKSwgYW5kIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGluIHRoZSBzYW1lIHdheSB0aHJvdWdoIHRoZSBzYW1lIHBsYWNlIGF0IG5vCisgICAgZnVydGhlciBjaGFyZ2UuICBZb3UgbmVlZCBub3QgcmVxdWlyZSByZWNpcGllbnRzIHRvIGNvcHkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuICBJZiB0aGUgcGxhY2UgdG8KKyAgICBjb3B5IHRoZSBvYmplY3QgY29kZSBpcyBhIG5ldHdvcmsgc2VydmVyLCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UKKyAgICBtYXkgYmUgb24gYSBkaWZmZXJlbnQgc2VydmVyIChvcGVyYXRlZCBieSB5b3Ugb3IgYSB0aGlyZCBwYXJ0eSkKKyAgICB0aGF0IHN1cHBvcnRzIGVxdWl2YWxlbnQgY29weWluZyBmYWNpbGl0aWVzLCBwcm92aWRlZCB5b3UgbWFpbnRhaW4KKyAgICBjbGVhciBkaXJlY3Rpb25zIG5leHQgdG8gdGhlIG9iamVjdCBjb2RlIHNheWluZyB3aGVyZSB0byBmaW5kIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlLiAgUmVnYXJkbGVzcyBvZiB3aGF0IHNlcnZlciBob3N0cyB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSwgeW91IHJlbWFpbiBvYmxpZ2F0ZWQgdG8gZW5zdXJlIHRoYXQgaXQgaXMKKyAgICBhdmFpbGFibGUgZm9yIGFzIGxvbmcgYXMgbmVlZGVkIHRvIHNhdGlzZnkgdGhlc2UgcmVxdWlyZW1lbnRzLgorCisgICAgZSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uLCBwcm92aWRlZAorICAgIHlvdSBpbmZvcm0gb3RoZXIgcGVlcnMgd2hlcmUgdGhlIG9iamVjdCBjb2RlIGFuZCBDb3JyZXNwb25kaW5nCisgICAgU291cmNlIG9mIHRoZSB3b3JrIGFyZSBiZWluZyBvZmZlcmVkIHRvIHRoZSBnZW5lcmFsIHB1YmxpYyBhdCBubworICAgIGNoYXJnZSB1bmRlciBzdWJzZWN0aW9uIDZkLgorCisgIEEgc2VwYXJhYmxlIHBvcnRpb24gb2YgdGhlIG9iamVjdCBjb2RlLCB3aG9zZSBzb3VyY2UgY29kZSBpcyBleGNsdWRlZAorZnJvbSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgYXMgYSBTeXN0ZW0gTGlicmFyeSwgbmVlZCBub3QgYmUKK2luY2x1ZGVkIGluIGNvbnZleWluZyB0aGUgb2JqZWN0IGNvZGUgd29yay4KKworICBBICJVc2VyIFByb2R1Y3QiIGlzIGVpdGhlciAoMSkgYSAiY29uc3VtZXIgcHJvZHVjdCIsIHdoaWNoIG1lYW5zIGFueQordGFuZ2libGUgcGVyc29uYWwgcHJvcGVydHkgd2hpY2ggaXMgbm9ybWFsbHkgdXNlZCBmb3IgcGVyc29uYWwsIGZhbWlseSwKK29yIGhvdXNlaG9sZCBwdXJwb3Nlcywgb3IgKDIpIGFueXRoaW5nIGRlc2lnbmVkIG9yIHNvbGQgZm9yIGluY29ycG9yYXRpb24KK2ludG8gYSBkd2VsbGluZy4gIEluIGRldGVybWluaW5nIHdoZXRoZXIgYSBwcm9kdWN0IGlzIGEgY29uc3VtZXIgcHJvZHVjdCwKK2RvdWJ0ZnVsIGNhc2VzIHNoYWxsIGJlIHJlc29sdmVkIGluIGZhdm9yIG9mIGNvdmVyYWdlLiAgRm9yIGEgcGFydGljdWxhcgorcHJvZHVjdCByZWNlaXZlZCBieSBhIHBhcnRpY3VsYXIgdXNlciwgIm5vcm1hbGx5IHVzZWQiIHJlZmVycyB0byBhCit0eXBpY2FsIG9yIGNvbW1vbiB1c2Ugb2YgdGhhdCBjbGFzcyBvZiBwcm9kdWN0LCByZWdhcmRsZXNzIG9mIHRoZSBzdGF0dXMKK29mIHRoZSBwYXJ0aWN1bGFyIHVzZXIgb3Igb2YgdGhlIHdheSBpbiB3aGljaCB0aGUgcGFydGljdWxhciB1c2VyCithY3R1YWxseSB1c2VzLCBvciBleHBlY3RzIG9yIGlzIGV4cGVjdGVkIHRvIHVzZSwgdGhlIHByb2R1Y3QuICBBIHByb2R1Y3QKK2lzIGEgY29uc3VtZXIgcHJvZHVjdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHByb2R1Y3QgaGFzIHN1YnN0YW50aWFsCitjb21tZXJjaWFsLCBpbmR1c3RyaWFsIG9yIG5vbi1jb25zdW1lciB1c2VzLCB1bmxlc3Mgc3VjaCB1c2VzIHJlcHJlc2VudAordGhlIG9ubHkgc2lnbmlmaWNhbnQgbW9kZSBvZiB1c2Ugb2YgdGhlIHByb2R1Y3QuCisKKyAgIkluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiIgZm9yIGEgVXNlciBQcm9kdWN0IG1lYW5zIGFueSBtZXRob2RzLAorcHJvY2VkdXJlcywgYXV0aG9yaXphdGlvbiBrZXlzLCBvciBvdGhlciBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBpbnN0YWxsCithbmQgZXhlY3V0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBhIGNvdmVyZWQgd29yayBpbiB0aGF0IFVzZXIgUHJvZHVjdCBmcm9tCithIG1vZGlmaWVkIHZlcnNpb24gb2YgaXRzIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhlIGluZm9ybWF0aW9uIG11c3QKK3N1ZmZpY2UgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRpbnVlZCBmdW5jdGlvbmluZyBvZiB0aGUgbW9kaWZpZWQgb2JqZWN0Citjb2RlIGlzIGluIG5vIGNhc2UgcHJldmVudGVkIG9yIGludGVyZmVyZWQgd2l0aCBzb2xlbHkgYmVjYXVzZQorbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUuCisKKyAgSWYgeW91IGNvbnZleSBhbiBvYmplY3QgY29kZSB3b3JrIHVuZGVyIHRoaXMgc2VjdGlvbiBpbiwgb3Igd2l0aCwgb3IKK3NwZWNpZmljYWxseSBmb3IgdXNlIGluLCBhIFVzZXIgUHJvZHVjdCwgYW5kIHRoZSBjb252ZXlpbmcgb2NjdXJzIGFzCitwYXJ0IG9mIGEgdHJhbnNhY3Rpb24gaW4gd2hpY2ggdGhlIHJpZ2h0IG9mIHBvc3Nlc3Npb24gYW5kIHVzZSBvZiB0aGUKK1VzZXIgUHJvZHVjdCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgcmVjaXBpZW50IGluIHBlcnBldHVpdHkgb3IgZm9yIGEKK2ZpeGVkIHRlcm0gKHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSB0cmFuc2FjdGlvbiBpcyBjaGFyYWN0ZXJpemVkKSwgdGhlCitDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCB1bmRlciB0aGlzIHNlY3Rpb24gbXVzdCBiZSBhY2NvbXBhbmllZAorYnkgdGhlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbi4gIEJ1dCB0aGlzIHJlcXVpcmVtZW50IGRvZXMgbm90IGFwcGx5CitpZiBuZWl0aGVyIHlvdSBub3IgYW55IHRoaXJkIHBhcnR5IHJldGFpbnMgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbAorbW9kaWZpZWQgb2JqZWN0IGNvZGUgb24gdGhlIFVzZXIgUHJvZHVjdCAoZm9yIGV4YW1wbGUsIHRoZSB3b3JrIGhhcworYmVlbiBpbnN0YWxsZWQgaW4gUk9NKS4KKworICBUaGUgcmVxdWlyZW1lbnQgdG8gcHJvdmlkZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gZG9lcyBub3QgaW5jbHVkZSBhCityZXF1aXJlbWVudCB0byBjb250aW51ZSB0byBwcm92aWRlIHN1cHBvcnQgc2VydmljZSwgd2FycmFudHksIG9yIHVwZGF0ZXMKK2ZvciBhIHdvcmsgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQgYnkgdGhlIHJlY2lwaWVudCwgb3IgZm9yCit0aGUgVXNlciBQcm9kdWN0IGluIHdoaWNoIGl0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGluc3RhbGxlZC4gIEFjY2VzcyB0byBhCituZXR3b3JrIG1heSBiZSBkZW5pZWQgd2hlbiB0aGUgbW9kaWZpY2F0aW9uIGl0c2VsZiBtYXRlcmlhbGx5IGFuZAorYWR2ZXJzZWx5IGFmZmVjdHMgdGhlIG9wZXJhdGlvbiBvZiB0aGUgbmV0d29yayBvciB2aW9sYXRlcyB0aGUgcnVsZXMgYW5kCitwcm90b2NvbHMgZm9yIGNvbW11bmljYXRpb24gYWNyb3NzIHRoZSBuZXR3b3JrLgorCisgIENvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkLCBhbmQgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIHByb3ZpZGVkLAoraW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gYSBmb3JtYXQgdGhhdCBpcyBwdWJsaWNseQorZG9jdW1lbnRlZCAoYW5kIHdpdGggYW4gaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4KK3NvdXJjZSBjb2RlIGZvcm0pLCBhbmQgbXVzdCByZXF1aXJlIG5vIHNwZWNpYWwgcGFzc3dvcmQgb3Iga2V5IGZvcgordW5wYWNraW5nLCByZWFkaW5nIG9yIGNvcHlpbmcuCisKKyAgNy4gQWRkaXRpb25hbCBUZXJtcy4KKworICAiQWRkaXRpb25hbCBwZXJtaXNzaW9ucyIgYXJlIHRlcm1zIHRoYXQgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcworTGljZW5zZSBieSBtYWtpbmcgZXhjZXB0aW9ucyBmcm9tIG9uZSBvciBtb3JlIG9mIGl0cyBjb25kaXRpb25zLgorQWRkaXRpb25hbCBwZXJtaXNzaW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBlbnRpcmUgUHJvZ3JhbSBzaGFsbAorYmUgdHJlYXRlZCBhcyB0aG91Z2ggdGhleSB3ZXJlIGluY2x1ZGVkIGluIHRoaXMgTGljZW5zZSwgdG8gdGhlIGV4dGVudAordGhhdCB0aGV5IGFyZSB2YWxpZCB1bmRlciBhcHBsaWNhYmxlIGxhdy4gIElmIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMKK2FwcGx5IG9ubHkgdG8gcGFydCBvZiB0aGUgUHJvZ3JhbSwgdGhhdCBwYXJ0IG1heSBiZSB1c2VkIHNlcGFyYXRlbHkKK3VuZGVyIHRob3NlIHBlcm1pc3Npb25zLCBidXQgdGhlIGVudGlyZSBQcm9ncmFtIHJlbWFpbnMgZ292ZXJuZWQgYnkKK3RoaXMgTGljZW5zZSB3aXRob3V0IHJlZ2FyZCB0byB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucy4KKworICBXaGVuIHlvdSBjb252ZXkgYSBjb3B5IG9mIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uCityZW1vdmUgYW55IGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgZnJvbSB0aGF0IGNvcHksIG9yIGZyb20gYW55IHBhcnQgb2YKK2l0LiAgKEFkZGl0aW9uYWwgcGVybWlzc2lvbnMgbWF5IGJlIHdyaXR0ZW4gdG8gcmVxdWlyZSB0aGVpciBvd24KK3JlbW92YWwgaW4gY2VydGFpbiBjYXNlcyB3aGVuIHlvdSBtb2RpZnkgdGhlIHdvcmsuKSAgWW91IG1heSBwbGFjZQorYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBvbiBtYXRlcmlhbCwgYWRkZWQgYnkgeW91IHRvIGEgY292ZXJlZCB3b3JrLAorZm9yIHdoaWNoIHlvdSBoYXZlIG9yIGNhbiBnaXZlIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBwZXJtaXNzaW9uLgorCisgIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgZm9yIG1hdGVyaWFsIHlvdQorYWRkIHRvIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IChpZiBhdXRob3JpemVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZgordGhhdCBtYXRlcmlhbCkgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGVybXM6CisKKyAgICBhKSBEaXNjbGFpbWluZyB3YXJyYW50eSBvciBsaW1pdGluZyBsaWFiaWxpdHkgZGlmZmVyZW50bHkgZnJvbSB0aGUKKyAgICB0ZXJtcyBvZiBzZWN0aW9ucyAxNSBhbmQgMTYgb2YgdGhpcyBMaWNlbnNlOyBvcgorCisgICAgYikgUmVxdWlyaW5nIHByZXNlcnZhdGlvbiBvZiBzcGVjaWZpZWQgcmVhc29uYWJsZSBsZWdhbCBub3RpY2VzIG9yCisgICAgYXV0aG9yIGF0dHJpYnV0aW9ucyBpbiB0aGF0IG1hdGVyaWFsIG9yIGluIHRoZSBBcHByb3ByaWF0ZSBMZWdhbAorICAgIE5vdGljZXMgZGlzcGxheWVkIGJ5IHdvcmtzIGNvbnRhaW5pbmcgaXQ7IG9yCisKKyAgICBjKSBQcm9oaWJpdGluZyBtaXNyZXByZXNlbnRhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoYXQgbWF0ZXJpYWwsIG9yCisgICAgcmVxdWlyaW5nIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBtYXRlcmlhbCBiZSBtYXJrZWQgaW4KKyAgICByZWFzb25hYmxlIHdheXMgYXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIHZlcnNpb247IG9yCisKKyAgICBkKSBMaW1pdGluZyB0aGUgdXNlIGZvciBwdWJsaWNpdHkgcHVycG9zZXMgb2YgbmFtZXMgb2YgbGljZW5zb3JzIG9yCisgICAgYXV0aG9ycyBvZiB0aGUgbWF0ZXJpYWw7IG9yCisKKyAgICBlKSBEZWNsaW5pbmcgdG8gZ3JhbnQgcmlnaHRzIHVuZGVyIHRyYWRlbWFyayBsYXcgZm9yIHVzZSBvZiBzb21lCisgICAgdHJhZGUgbmFtZXMsIHRyYWRlbWFya3MsIG9yIHNlcnZpY2UgbWFya3M7IG9yCisKKyAgICBmKSBSZXF1aXJpbmcgaW5kZW1uaWZpY2F0aW9uIG9mIGxpY2Vuc29ycyBhbmQgYXV0aG9ycyBvZiB0aGF0CisgICAgbWF0ZXJpYWwgYnkgYW55b25lIHdobyBjb252ZXlzIHRoZSBtYXRlcmlhbCAob3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YKKyAgICBpdCkgd2l0aCBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBvZiBsaWFiaWxpdHkgdG8gdGhlIHJlY2lwaWVudCwgZm9yCisgICAgYW55IGxpYWJpbGl0eSB0aGF0IHRoZXNlIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIGRpcmVjdGx5IGltcG9zZSBvbgorICAgIHRob3NlIGxpY2Vuc29ycyBhbmQgYXV0aG9ycy4KKworICBBbGwgb3RoZXIgbm9uLXBlcm1pc3NpdmUgYWRkaXRpb25hbCB0ZXJtcyBhcmUgY29uc2lkZXJlZCAiZnVydGhlcgorcmVzdHJpY3Rpb25zIiB3aXRoaW4gdGhlIG1lYW5pbmcgb2Ygc2VjdGlvbiAxMC4gIElmIHRoZSBQcm9ncmFtIGFzIHlvdQorcmVjZWl2ZWQgaXQsIG9yIGFueSBwYXJ0IG9mIGl0LCBjb250YWlucyBhIG5vdGljZSBzdGF0aW5nIHRoYXQgaXQgaXMKK2dvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIGEgdGVybSB0aGF0IGlzIGEgZnVydGhlcgorcmVzdHJpY3Rpb24sIHlvdSBtYXkgcmVtb3ZlIHRoYXQgdGVybS4gIElmIGEgbGljZW5zZSBkb2N1bWVudCBjb250YWlucworYSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGJ1dCBwZXJtaXRzIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZyB1bmRlciB0aGlzCitMaWNlbnNlLCB5b3UgbWF5IGFkZCB0byBhIGNvdmVyZWQgd29yayBtYXRlcmlhbCBnb3Zlcm5lZCBieSB0aGUgdGVybXMKK29mIHRoYXQgbGljZW5zZSBkb2N1bWVudCwgcHJvdmlkZWQgdGhhdCB0aGUgZnVydGhlciByZXN0cmljdGlvbiBkb2VzCitub3Qgc3Vydml2ZSBzdWNoIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZy4KKworICBJZiB5b3UgYWRkIHRlcm1zIHRvIGEgY292ZXJlZCB3b3JrIGluIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiwgeW91CittdXN0IHBsYWNlLCBpbiB0aGUgcmVsZXZhbnQgc291cmNlIGZpbGVzLCBhIHN0YXRlbWVudCBvZiB0aGUKK2FkZGl0aW9uYWwgdGVybXMgdGhhdCBhcHBseSB0byB0aG9zZSBmaWxlcywgb3IgYSBub3RpY2UgaW5kaWNhdGluZword2hlcmUgdG8gZmluZCB0aGUgYXBwbGljYWJsZSB0ZXJtcy4KKworICBBZGRpdGlvbmFsIHRlcm1zLCBwZXJtaXNzaXZlIG9yIG5vbi1wZXJtaXNzaXZlLCBtYXkgYmUgc3RhdGVkIGluIHRoZQorZm9ybSBvZiBhIHNlcGFyYXRlbHkgd3JpdHRlbiBsaWNlbnNlLCBvciBzdGF0ZWQgYXMgZXhjZXB0aW9uczsKK3RoZSBhYm92ZSByZXF1aXJlbWVudHMgYXBwbHkgZWl0aGVyIHdheS4KKworICA4LiBUZXJtaW5hdGlvbi4KKworICBZb3UgbWF5IG5vdCBwcm9wYWdhdGUgb3IgbW9kaWZ5IGEgY292ZXJlZCB3b3JrIGV4Y2VwdCBhcyBleHByZXNzbHkKK3Byb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0IG90aGVyd2lzZSB0byBwcm9wYWdhdGUgb3IKK21vZGlmeSBpdCBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlcgordGhpcyBMaWNlbnNlIChpbmNsdWRpbmcgYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIHVuZGVyIHRoZSB0aGlyZAorcGFyYWdyYXBoIG9mIHNlY3Rpb24gMTEpLgorCisgIEhvd2V2ZXIsIGlmIHlvdSBjZWFzZSBhbGwgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSwgdGhlbiB5b3VyCitsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMgcmVpbnN0YXRlZCAoYSkKK3Byb3Zpc2lvbmFsbHksIHVubGVzcyBhbmQgdW50aWwgdGhlIGNvcHlyaWdodCBob2xkZXIgZXhwbGljaXRseSBhbmQKK2ZpbmFsbHkgdGVybWluYXRlcyB5b3VyIGxpY2Vuc2UsIGFuZCAoYikgcGVybWFuZW50bHksIGlmIHRoZSBjb3B5cmlnaHQKK2hvbGRlciBmYWlscyB0byBub3RpZnkgeW91IG9mIHRoZSB2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zCitwcmlvciB0byA2MCBkYXlzIGFmdGVyIHRoZSBjZXNzYXRpb24uCisKKyAgTW9yZW92ZXIsIHlvdXIgbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzCityZWluc3RhdGVkIHBlcm1hbmVudGx5IGlmIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vdGlmaWVzIHlvdSBvZiB0aGUKK3Zpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMsIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGhhdmUKK3JlY2VpdmVkIG5vdGljZSBvZiB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlIChmb3IgYW55IHdvcmspIGZyb20gdGhhdAorY29weXJpZ2h0IGhvbGRlciwgYW5kIHlvdSBjdXJlIHRoZSB2aW9sYXRpb24gcHJpb3IgdG8gMzAgZGF5cyBhZnRlcgoreW91ciByZWNlaXB0IG9mIHRoZSBub3RpY2UuCisKKyAgVGVybWluYXRpb24gb2YgeW91ciByaWdodHMgdW5kZXIgdGhpcyBzZWN0aW9uIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUKK2xpY2Vuc2VzIG9mIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9yIHJpZ2h0cyBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlLiAgSWYgeW91ciByaWdodHMgaGF2ZSBiZWVuIHRlcm1pbmF0ZWQgYW5kIG5vdCBwZXJtYW5lbnRseQorcmVpbnN0YXRlZCwgeW91IGRvIG5vdCBxdWFsaWZ5IHRvIHJlY2VpdmUgbmV3IGxpY2Vuc2VzIGZvciB0aGUgc2FtZQorbWF0ZXJpYWwgdW5kZXIgc2VjdGlvbiAxMC4KKworICA5LiBBY2NlcHRhbmNlIE5vdCBSZXF1aXJlZCBmb3IgSGF2aW5nIENvcGllcy4KKworICBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlIGluIG9yZGVyIHRvIHJlY2VpdmUgb3IKK3J1biBhIGNvcHkgb2YgdGhlIFByb2dyYW0uICBBbmNpbGxhcnkgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsKK29jY3VycmluZyBzb2xlbHkgYXMgYSBjb25zZXF1ZW5jZSBvZiB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uCit0byByZWNlaXZlIGEgY29weSBsaWtld2lzZSBkb2VzIG5vdCByZXF1aXJlIGFjY2VwdGFuY2UuICBIb3dldmVyLAorbm90aGluZyBvdGhlciB0aGFuIHRoaXMgTGljZW5zZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gcHJvcGFnYXRlIG9yCittb2RpZnkgYW55IGNvdmVyZWQgd29yay4gIFRoZXNlIGFjdGlvbnMgaW5mcmluZ2UgY29weXJpZ2h0IGlmIHlvdSBkbworbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBwcm9wYWdhdGluZyBhCitjb3ZlcmVkIHdvcmssIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLgorCisgIDEwLiBBdXRvbWF0aWMgTGljZW5zaW5nIG9mIERvd25zdHJlYW0gUmVjaXBpZW50cy4KKworICBFYWNoIHRpbWUgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5CityZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwgbGljZW5zb3JzLCB0byBydW4sIG1vZGlmeSBhbmQKK3Byb3BhZ2F0ZSB0aGF0IHdvcmssIHN1YmplY3QgdG8gdGhpcyBMaWNlbnNlLiAgWW91IGFyZSBub3QgcmVzcG9uc2libGUKK2ZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGggdGhpcyBMaWNlbnNlLgorCisgIEFuICJlbnRpdHkgdHJhbnNhY3Rpb24iIGlzIGEgdHJhbnNhY3Rpb24gdHJhbnNmZXJyaW5nIGNvbnRyb2wgb2YgYW4KK29yZ2FuaXphdGlvbiwgb3Igc3Vic3RhbnRpYWxseSBhbGwgYXNzZXRzIG9mIG9uZSwgb3Igc3ViZGl2aWRpbmcgYW4KK29yZ2FuaXphdGlvbiwgb3IgbWVyZ2luZyBvcmdhbml6YXRpb25zLiAgSWYgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkCit3b3JrIHJlc3VsdHMgZnJvbSBhbiBlbnRpdHkgdHJhbnNhY3Rpb24sIGVhY2ggcGFydHkgdG8gdGhhdAordHJhbnNhY3Rpb24gd2hvIHJlY2VpdmVzIGEgY29weSBvZiB0aGUgd29yayBhbHNvIHJlY2VpdmVzIHdoYXRldmVyCitsaWNlbnNlcyB0byB0aGUgd29yayB0aGUgcGFydHkncyBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCBoYWQgb3IgY291bGQKK2dpdmUgdW5kZXIgdGhlIHByZXZpb3VzIHBhcmFncmFwaCwgcGx1cyBhIHJpZ2h0IHRvIHBvc3Nlc3Npb24gb2YgdGhlCitDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBmcm9tIHRoZSBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCwgaWYKK3RoZSBwcmVkZWNlc3NvciBoYXMgaXQgb3IgY2FuIGdldCBpdCB3aXRoIHJlYXNvbmFibGUgZWZmb3J0cy4KKworICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBleGVyY2lzZSBvZiB0aGUKK3JpZ2h0cyBncmFudGVkIG9yIGFmZmlybWVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEZvciBleGFtcGxlLCB5b3UgbWF5Citub3QgaW1wb3NlIGEgbGljZW5zZSBmZWUsIHJveWFsdHksIG9yIG90aGVyIGNoYXJnZSBmb3IgZXhlcmNpc2Ugb2YKK3JpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHlvdSBtYXkgbm90IGluaXRpYXRlIGxpdGlnYXRpb24KKyhpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CithbnkgcGF0ZW50IGNsYWltIGlzIGluZnJpbmdlZCBieSBtYWtpbmcsIHVzaW5nLCBzZWxsaW5nLCBvZmZlcmluZyBmb3IKK3NhbGUsIG9yIGltcG9ydGluZyB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdC4KKworICAxMS4gUGF0ZW50cy4KKworICBBICJjb250cmlidXRvciIgaXMgYSBjb3B5cmlnaHQgaG9sZGVyIHdobyBhdXRob3JpemVzIHVzZSB1bmRlciB0aGlzCitMaWNlbnNlIG9mIHRoZSBQcm9ncmFtIG9yIGEgd29yayBvbiB3aGljaCB0aGUgUHJvZ3JhbSBpcyBiYXNlZC4gIFRoZQord29yayB0aHVzIGxpY2Vuc2VkIGlzIGNhbGxlZCB0aGUgY29udHJpYnV0b3IncyAiY29udHJpYnV0b3IgdmVyc2lvbiIuCisKKyAgQSBjb250cmlidXRvcidzICJlc3NlbnRpYWwgcGF0ZW50IGNsYWltcyIgYXJlIGFsbCBwYXRlbnQgY2xhaW1zCitvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBjb250cmlidXRvciwgd2hldGhlciBhbHJlYWR5IGFjcXVpcmVkIG9yCitoZXJlYWZ0ZXIgYWNxdWlyZWQsIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIGJ5IHNvbWUgbWFubmVyLCBwZXJtaXR0ZWQKK2J5IHRoaXMgTGljZW5zZSwgb2YgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBpdHMgY29udHJpYnV0b3IgdmVyc2lvbiwKK2J1dCBkbyBub3QgaW5jbHVkZSBjbGFpbXMgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgb25seSBhcyBhCitjb25zZXF1ZW5jZSBvZiBmdXJ0aGVyIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udHJpYnV0b3IgdmVyc2lvbi4gIEZvcgorcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgaW5jbHVkZXMgdGhlIHJpZ2h0IHRvIGdyYW50CitwYXRlbnQgc3VibGljZW5zZXMgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YKK3RoaXMgTGljZW5zZS4KKworICBFYWNoIGNvbnRyaWJ1dG9yIGdyYW50cyB5b3UgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgdGhlIGNvbnRyaWJ1dG9yJ3MgZXNzZW50aWFsIHBhdGVudCBjbGFpbXMsIHRvCittYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBpbXBvcnQgYW5kIG90aGVyd2lzZSBydW4sIG1vZGlmeSBhbmQKK3Byb3BhZ2F0ZSB0aGUgY29udGVudHMgb2YgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24uCisKKyAgSW4gdGhlIGZvbGxvd2luZyB0aHJlZSBwYXJhZ3JhcGhzLCBhICJwYXRlbnQgbGljZW5zZSIgaXMgYW55IGV4cHJlc3MKK2FncmVlbWVudCBvciBjb21taXRtZW50LCBob3dldmVyIGRlbm9taW5hdGVkLCBub3QgdG8gZW5mb3JjZSBhIHBhdGVudAorKHN1Y2ggYXMgYW4gZXhwcmVzcyBwZXJtaXNzaW9uIHRvIHByYWN0aWNlIGEgcGF0ZW50IG9yIGNvdmVuYW50IG5vdCB0bworc3VlIGZvciBwYXRlbnQgaW5mcmluZ2VtZW50KS4gIFRvICJncmFudCIgc3VjaCBhIHBhdGVudCBsaWNlbnNlIHRvIGEKK3BhcnR5IG1lYW5zIHRvIG1ha2Ugc3VjaCBhbiBhZ3JlZW1lbnQgb3IgY29tbWl0bWVudCBub3QgdG8gZW5mb3JjZSBhCitwYXRlbnQgYWdhaW5zdCB0aGUgcGFydHkuCisKKyAgSWYgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywga25vd2luZ2x5IHJlbHlpbmcgb24gYSBwYXRlbnQgbGljZW5zZSwKK2FuZCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgaXMgbm90IGF2YWlsYWJsZSBmb3IgYW55b25lCit0byBjb3B5LCBmcmVlIG9mIGNoYXJnZSBhbmQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgdGhyb3VnaCBhCitwdWJsaWNseSBhdmFpbGFibGUgbmV0d29yayBzZXJ2ZXIgb3Igb3RoZXIgcmVhZGlseSBhY2Nlc3NpYmxlIG1lYW5zLAordGhlbiB5b3UgbXVzdCBlaXRoZXIgKDEpIGNhdXNlIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB0byBiZSBzbworYXZhaWxhYmxlLCBvciAoMikgYXJyYW5nZSB0byBkZXByaXZlIHlvdXJzZWxmIG9mIHRoZSBiZW5lZml0IG9mIHRoZQorcGF0ZW50IGxpY2Vuc2UgZm9yIHRoaXMgcGFydGljdWxhciB3b3JrLCBvciAoMykgYXJyYW5nZSwgaW4gYSBtYW5uZXIKK2NvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSwgdG8gZXh0ZW5kIHRoZSBwYXRlbnQKK2xpY2Vuc2UgdG8gZG93bnN0cmVhbSByZWNpcGllbnRzLiAgIktub3dpbmdseSByZWx5aW5nIiBtZWFucyB5b3UgaGF2ZQorYWN0dWFsIGtub3dsZWRnZSB0aGF0LCBidXQgZm9yIHRoZSBwYXRlbnQgbGljZW5zZSwgeW91ciBjb252ZXlpbmcgdGhlCitjb3ZlcmVkIHdvcmsgaW4gYSBjb3VudHJ5LCBvciB5b3VyIHJlY2lwaWVudCdzIHVzZSBvZiB0aGUgY292ZXJlZCB3b3JrCitpbiBhIGNvdW50cnksIHdvdWxkIGluZnJpbmdlIG9uZSBvciBtb3JlIGlkZW50aWZpYWJsZSBwYXRlbnRzIGluIHRoYXQKK2NvdW50cnkgdGhhdCB5b3UgaGF2ZSByZWFzb24gdG8gYmVsaWV2ZSBhcmUgdmFsaWQuCisKKyAgSWYsIHB1cnN1YW50IHRvIG9yIGluIGNvbm5lY3Rpb24gd2l0aCBhIHNpbmdsZSB0cmFuc2FjdGlvbiBvcgorYXJyYW5nZW1lbnQsIHlvdSBjb252ZXksIG9yIHByb3BhZ2F0ZSBieSBwcm9jdXJpbmcgY29udmV5YW5jZSBvZiwgYQorY292ZXJlZCB3b3JrLCBhbmQgZ3JhbnQgYSBwYXRlbnQgbGljZW5zZSB0byBzb21lIG9mIHRoZSBwYXJ0aWVzCityZWNlaXZpbmcgdGhlIGNvdmVyZWQgd29yayBhdXRob3JpemluZyB0aGVtIHRvIHVzZSwgcHJvcGFnYXRlLCBtb2RpZnkKK29yIGNvbnZleSBhIHNwZWNpZmljIGNvcHkgb2YgdGhlIGNvdmVyZWQgd29yaywgdGhlbiB0aGUgcGF0ZW50IGxpY2Vuc2UKK3lvdSBncmFudCBpcyBhdXRvbWF0aWNhbGx5IGV4dGVuZGVkIHRvIGFsbCByZWNpcGllbnRzIG9mIHRoZSBjb3ZlcmVkCit3b3JrIGFuZCB3b3JrcyBiYXNlZCBvbiBpdC4KKworICBBIHBhdGVudCBsaWNlbnNlIGlzICJkaXNjcmltaW5hdG9yeSIgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSB3aXRoaW4KK3RoZSBzY29wZSBvZiBpdHMgY292ZXJhZ2UsIHByb2hpYml0cyB0aGUgZXhlcmNpc2Ugb2YsIG9yIGlzCitjb25kaXRpb25lZCBvbiB0aGUgbm9uLWV4ZXJjaXNlIG9mIG9uZSBvciBtb3JlIG9mIHRoZSByaWdodHMgdGhhdCBhcmUKK3NwZWNpZmljYWxseSBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIFlvdSBtYXkgbm90IGNvbnZleSBhIGNvdmVyZWQKK3dvcmsgaWYgeW91IGFyZSBhIHBhcnR5IHRvIGFuIGFycmFuZ2VtZW50IHdpdGggYSB0aGlyZCBwYXJ0eSB0aGF0IGlzCitpbiB0aGUgYnVzaW5lc3Mgb2YgZGlzdHJpYnV0aW5nIHNvZnR3YXJlLCB1bmRlciB3aGljaCB5b3UgbWFrZSBwYXltZW50Cit0byB0aGUgdGhpcmQgcGFydHkgYmFzZWQgb24gdGhlIGV4dGVudCBvZiB5b3VyIGFjdGl2aXR5IG9mIGNvbnZleWluZwordGhlIHdvcmssIGFuZCB1bmRlciB3aGljaCB0aGUgdGhpcmQgcGFydHkgZ3JhbnRzLCB0byBhbnkgb2YgdGhlCitwYXJ0aWVzIHdobyB3b3VsZCByZWNlaXZlIHRoZSBjb3ZlcmVkIHdvcmsgZnJvbSB5b3UsIGEgZGlzY3JpbWluYXRvcnkKK3BhdGVudCBsaWNlbnNlIChhKSBpbiBjb25uZWN0aW9uIHdpdGggY29waWVzIG9mIHRoZSBjb3ZlcmVkIHdvcmsKK2NvbnZleWVkIGJ5IHlvdSAob3IgY29waWVzIG1hZGUgZnJvbSB0aG9zZSBjb3BpZXMpLCBvciAoYikgcHJpbWFyaWx5Citmb3IgYW5kIGluIGNvbm5lY3Rpb24gd2l0aCBzcGVjaWZpYyBwcm9kdWN0cyBvciBjb21waWxhdGlvbnMgdGhhdAorY29udGFpbiB0aGUgY292ZXJlZCB3b3JrLCB1bmxlc3MgeW91IGVudGVyZWQgaW50byB0aGF0IGFycmFuZ2VtZW50LAorb3IgdGhhdCBwYXRlbnQgbGljZW5zZSB3YXMgZ3JhbnRlZCwgcHJpb3IgdG8gMjggTWFyY2ggMjAwNy4KKworICBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBjb25zdHJ1ZWQgYXMgZXhjbHVkaW5nIG9yIGxpbWl0aW5nCithbnkgaW1wbGllZCBsaWNlbnNlIG9yIG90aGVyIGRlZmVuc2VzIHRvIGluZnJpbmdlbWVudCB0aGF0IG1heQorb3RoZXJ3aXNlIGJlIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYXBwbGljYWJsZSBwYXRlbnQgbGF3LgorCisgIDEyLiBObyBTdXJyZW5kZXIgb2YgT3RoZXJzJyBGcmVlZG9tLgorCisgIElmIGNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGNvbnZleSBhCitjb3ZlcmVkIHdvcmsgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5Citub3QgY29udmV5IGl0IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYWdyZWUgdG8gdGVybXMgdGhhdCBvYmxpZ2F0ZSB5b3UKK3RvIGNvbGxlY3QgYSByb3lhbHR5IGZvciBmdXJ0aGVyIGNvbnZleWluZyBmcm9tIHRob3NlIHRvIHdob20geW91IGNvbnZleQordGhlIFByb2dyYW0sIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIHRob3NlIHRlcm1zIGFuZCB0aGlzCitMaWNlbnNlIHdvdWxkIGJlIHRvIHJlZnJhaW4gZW50aXJlbHkgZnJvbSBjb252ZXlpbmcgdGhlIFByb2dyYW0uCisKKyAgMTMuIFVzZSB3aXRoIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgTm90d2l0aHN0YW5kaW5nIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLCB5b3UgaGF2ZQorcGVybWlzc2lvbiB0byBsaW5rIG9yIGNvbWJpbmUgYW55IGNvdmVyZWQgd29yayB3aXRoIGEgd29yayBsaWNlbnNlZAordW5kZXIgdmVyc2lvbiAzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW50byBhIHNpbmdsZQorY29tYmluZWQgd29yaywgYW5kIHRvIGNvbnZleSB0aGUgcmVzdWx0aW5nIHdvcmsuICBUaGUgdGVybXMgb2YgdGhpcworTGljZW5zZSB3aWxsIGNvbnRpbnVlIHRvIGFwcGx5IHRvIHRoZSBwYXJ0IHdoaWNoIGlzIHRoZSBjb3ZlcmVkIHdvcmssCitidXQgdGhlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCitzZWN0aW9uIDEzLCBjb25jZXJuaW5nIGludGVyYWN0aW9uIHRocm91Z2ggYSBuZXR3b3JrIHdpbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBhcyBzdWNoLgorCisgIDE0LiBSZXZpc2VkIFZlcnNpb25zIG9mIHRoaXMgTGljZW5zZS4KKworICBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZgordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworICBFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZQorUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbiBvZiB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlICJvciBhbnkgbGF0ZXIgdmVyc2lvbiIgYXBwbGllcyB0byBpdCwgeW91IGhhdmUgdGhlCitvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCBudW1iZXJlZAordmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQKK2J5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgSWYgdGhlIFByb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBwcm94eSBjYW4gZGVjaWRlIHdoaWNoIGZ1dHVyZQordmVyc2lvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB1c2VkLCB0aGF0IHByb3h5J3MKK3B1YmxpYyBzdGF0ZW1lbnQgb2YgYWNjZXB0YW5jZSBvZiBhIHZlcnNpb24gcGVybWFuZW50bHkgYXV0aG9yaXplcyB5b3UKK3RvIGNob29zZSB0aGF0IHZlcnNpb24gZm9yIHRoZSBQcm9ncmFtLgorCisgIExhdGVyIGxpY2Vuc2UgdmVyc2lvbnMgbWF5IGdpdmUgeW91IGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50CitwZXJtaXNzaW9ucy4gIEhvd2V2ZXIsIG5vIGFkZGl0aW9uYWwgb2JsaWdhdGlvbnMgYXJlIGltcG9zZWQgb24gYW55CithdXRob3Igb3IgY29weXJpZ2h0IGhvbGRlciBhcyBhIHJlc3VsdCBvZiB5b3VyIGNob29zaW5nIHRvIGZvbGxvdyBhCitsYXRlciB2ZXJzaW9uLgorCisgIDE1LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LgorCisgIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkKK0FQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQKK0hPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0KK0lTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRgorQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4KKworICBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTU9ESUZJRVMgQU5EL09SIENPTlZFWVMKK1RIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWQorR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFCitVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GCitEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRAorUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksCitFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCitTVUNIIERBTUFHRVMuCisKKyAgMTcuIEludGVycHJldGF0aW9uIG9mIFNlY3Rpb25zIDE1IGFuZCAxNi4KKworICBJZiB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50eSBhbmQgbGltaXRhdGlvbiBvZiBsaWFiaWxpdHkgcHJvdmlkZWQKK2Fib3ZlIGNhbm5vdCBiZSBnaXZlbiBsb2NhbCBsZWdhbCBlZmZlY3QgYWNjb3JkaW5nIHRvIHRoZWlyIHRlcm1zLAorcmV2aWV3aW5nIGNvdXJ0cyBzaGFsbCBhcHBseSBsb2NhbCBsYXcgdGhhdCBtb3N0IGNsb3NlbHkgYXBwcm94aW1hdGVzCithbiBhYnNvbHV0ZSB3YWl2ZXIgb2YgYWxsIGNpdmlsIGxpYWJpbGl0eSBpbiBjb25uZWN0aW9uIHdpdGggdGhlCitQcm9ncmFtLCB1bmxlc3MgYSB3YXJyYW50eSBvciBhc3N1bXB0aW9uIG9mIGxpYWJpbGl0eSBhY2NvbXBhbmllcyBhCitjb3B5IG9mIHRoZSBQcm9ncmFtIGluIHJldHVybiBmb3IgYSBmZWUuCisKKyAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorc3RhdGUgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCisgIElmIHRoZSBwcm9ncmFtIGRvZXMgdGVybWluYWwgaW50ZXJhY3Rpb24sIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQKK25vdGljZSBsaWtlIHRoaXMgd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIDxwcm9ncmFtPiAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKyAgICBUaGlzIHByb2dyYW0gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHlvdXIgcHJvZ3JhbSdzIGNvbW1hbmRzCittaWdodCBiZSBkaWZmZXJlbnQ7IGZvciBhIEdVSSBpbnRlcmZhY2UsIHlvdSB3b3VsZCB1c2UgYW4gImFib3V0IGJveCIuCisKKyAgWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHNjaG9vbCwKK2lmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZiBuZWNlc3NhcnkuCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLCBhbmQgaG93IHRvIGFwcGx5IGFuZCBmb2xsb3cgdGhlIEdOVSBHUEwsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0KK2ludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdQorbWF5IGNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoCit0aGUgbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLiAgQnV0IGZpcnN0LCBwbGVhc2UgcmVhZAorPGh0dHA6Ly93d3cuZ251Lm9yZy9waGlsb3NvcGh5L3doeS1ub3QtbGdwbC5odG1sPi4KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2dwcy5jIGIvcnJscC1lcGhlbWVyaXMvZ3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzNTc0OAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2dwcy5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogZ3BzLmMKKyAqCisgKiBBIGZldyB1dGlsaXR5IGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggbG93IGxldmVsIEdQUyBkYXRhCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImdwcy5oIgorCisKKyNkZWZpbmUgR0VUX0ZJRUxEX1UodywgbmIsIHBvcykgKCgodykgPj4gKHBvcykpICYgKCgxPDwobmIpKS0xKSkKKyNkZWZpbmUgR0VUX0ZJRUxEX1ModywgbmIsIHBvcykgKCgoaW50KSgodykgPDwgKDMyLShuYiktKHBvcykpKSkgPj4gKDMyLShuYikpKQorCisvKgorICogVW5wYWNrcyBHUFMgU3ViZnJhbWUgMSwyLDMgcGF5bG9hZHMgKDMgKiA4IHdvcmRzKQorICoKKyAqIE5vdGU6IGVwaC0+c3ZfaWQgaXMgbm90IGZpbGxlZCBoZXJlIHNpbmNlIG5vdCBwcmVzZW50IGluIHRob3NlIHN1YmZyYW1lcworICoKKyAqIChubyBwYXJpdHkgYml0IGNoZWNraW5nIGlzIGRvbmUsIG9ubHkgdGhlIGxvd2VyIDI0IGJpdHMgb2YgZWFjaCB3b3JkCisgKiAgYXJlIHVzZWQpCisgKi8KK2ludAorZ3BzX3VucGFja19zZjEyMyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfZXBoZW1lcmlzX3N2ICplcGgpCit7CisJdWludDMyX3QgKnNmMSA9ICZzZlswXTsKKwl1aW50MzJfdCAqc2YyID0gJnNmWzhdOworCXVpbnQzMl90ICpzZjMgPSAmc2ZbMTZdOworCisJaW50IGlvZGUxLCBpb2RlMjsKKworCWVwaC0+d2Vla19ubwk9IEdFVF9GSUVMRF9VKHNmMVswXSwgMTAsIDE0KTsKKwllcGgtPmNvZGVfb25fbDIJPSBHRVRfRklFTERfVShzZjFbMF0sICAyLCAxMik7CisJZXBoLT5zdl91cmEJPSBHRVRfRklFTERfVShzZjFbMF0sICA0LCAgOCk7CisJZXBoLT5zdl9oZWFsdGgJPSBHRVRfRklFTERfVShzZjFbMF0sICA2LCAgMik7CisJZXBoLT5sMl9wX2ZsYWcJPSBHRVRfRklFTERfVShzZjFbMV0sICAxLCAyMyk7CisJZXBoLT50X2dkCT0gR0VUX0ZJRUxEX1Moc2YxWzRdLCAgOCwgIDApOworCWVwaC0+aW9kYwk9IChHRVRfRklFTERfVShzZjFbMF0sICAyLCAgMCkgPDwgOCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmMVs1XSwgIDgsIDE2KTsKKwllcGgtPnRfb2MJPSBHRVRfRklFTERfVShzZjFbNV0sIDE2LCAgMCk7CisJZXBoLT5hX2YyCT0gR0VUX0ZJRUxEX1Moc2YxWzZdLCAgOCwgMTYpOworCWVwaC0+YV9mMQk9IEdFVF9GSUVMRF9TKHNmMVs2XSwgMTYsICAwKTsKKwllcGgtPmFfZjAJPSBHRVRfRklFTERfUyhzZjFbN10sIDIyLCAgMik7CisKKwlpb2RlMQkJPSBHRVRfRklFTERfVShzZjJbMF0sICA4LCAxNik7CisJZXBoLT5jX3JzCT0gR0VUX0ZJRUxEX1Moc2YyWzBdLCAxNiwgIDApOworCWVwaC0+ZGVsdGFfbgk9IEdFVF9GSUVMRF9TKHNmMlsxXSwgMTYsICA4KTsKKwllcGgtPm1fMAk9IChHRVRfRklFTERfUyhzZjJbMV0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjJbMl0sIDI0LCAgMCk7CisJZXBoLT5jX3VjCT0gR0VUX0ZJRUxEX1Moc2YyWzNdLCAxNiwgIDgpOworCWVwaC0+ZQkJPSAoR0VUX0ZJRUxEX1Uoc2YyWzNdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YyWzRdLCAyNCwgIDApOworCWVwaC0+Y191cwk9IEdFVF9GSUVMRF9TKHNmMls1XSwgMTYsICA4KTsKKwllcGgtPmFfcG93aGFsZgk9IChHRVRfRklFTERfVShzZjJbNV0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjJbNl0sIDI0LCAgMCk7CisJZXBoLT50X29lCT0gR0VUX0ZJRUxEX1Uoc2YyWzddLCAxNiwgIDgpOworCWVwaC0+Zml0X2ZsYWcJPSBHRVRfRklFTERfVShzZjJbN10sICAxLCAgNyk7CisKKwllcGgtPmNfaWMJPSBHRVRfRklFTERfUyhzZjNbMF0sIDE2LCAgOCk7CisJZXBoLT5vbWVnYV8wCT0gKEdFVF9GSUVMRF9TKHNmM1swXSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmM1sxXSwgMjQsICAwKTsKKwllcGgtPmNfaXMJPSBHRVRfRklFTERfUyhzZjNbMl0sIDE2LCAgOCk7CisJZXBoLT5pXzAJPSAoR0VUX0ZJRUxEX1Moc2YzWzJdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YzWzNdLCAyNCwgIDApOworCWVwaC0+Y19yYwk9IEdFVF9GSUVMRF9TKHNmM1s0XSwgMTYsICA4KTsKKwllcGgtPncJCT0gKEdFVF9GSUVMRF9TKHNmM1s0XSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmM1s1XSwgMjQsICAwKTsKKwllcGgtPm9tZWdhX2RvdAk9IEdFVF9GSUVMRF9TKHNmM1s2XSwgMjQsICAwKTsKKwlpb2RlMgkJPSBHRVRfRklFTERfVShzZjNbN10sICA4LCAxNik7CisJZXBoLT5pZG90CT0gR0VUX0ZJRUxEX1Moc2YzWzddLCAxNCwgIDIpOworCisJZXBoLT5fcnN2ZDEJPSBHRVRfRklFTERfVShzZjFbMV0sIDIzLCAgMCk7CisJZXBoLT5fcnN2ZDIJPSBHRVRfRklFTERfVShzZjFbMl0sIDI0LCAgMCk7CisJZXBoLT5fcnN2ZDMJPSBHRVRfRklFTERfVShzZjFbM10sIDI0LCAgMCk7CisJZXBoLT5fcnN2ZDQJPSBHRVRfRklFTERfVShzZjFbNF0sIDE2LCAgOCk7CisJZXBoLT5hb2RvCT0gR0VUX0ZJRUxEX1Uoc2YyWzddLCAgNSwgIDIpOworCisJLyogQ2hlY2sgJiBjcm9zcy12YWxpZGF0ZSBpb2RjWzc6MF0sIGlvZGUxLCBpb2RlMiAqLworCWlmICgoaW9kZTEgIT0gaW9kZTIpIHx8IChpb2RlMSAhPSAoZXBoLT5pb2RjICYgMHhmZikpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVW5wYWNrcyBHUFMgU3ViZnJhbWUgNCBvciA1IEFsbWFuYWMgcGFnZXMgcGF5bG9hZCAoOCB3b3JkcykKKyAqCisgKiAobm8gcGFyaXR5IGJpdCBjaGVja2luZyBpcyBkb25lLCBvbmx5IHRoZSBsb3dlciAyNCBiaXRzIG9mIGVhY2ggd29yZAorICogIGFyZSB1c2VkKQorICovCitpbnQKK2dwc191bnBhY2tfc2Y0NV9hbG1hbmFjKHVpbnQzMl90ICpzZiwgc3RydWN0IGdwc19hbG1hbmFjX3N2ICphbG0pCit7CisJYWxtLT5zdl9pZCAgICAgID0gR0VUX0ZJRUxEX1Uoc2ZbMF0sICA2LCAxNik7CisKKwlhbG0tPmUJCT0gR0VUX0ZJRUxEX1Uoc2ZbMF0sIDE2LCAgMCk7CisJYWxtLT50X29hCT0gR0VUX0ZJRUxEX1Uoc2ZbMV0sICA4LCAxNik7CisJYWxtLT5rc2lpCT0gR0VUX0ZJRUxEX1Moc2ZbMV0sIDE2LCAgMCk7CisJYWxtLT5vbWVnYV9kb3QJPSBHRVRfRklFTERfUyhzZlsyXSwgMTYsICA4KTsKKwlhbG0tPnN2X2hlYWx0aAk9IEdFVF9GSUVMRF9VKHNmWzJdLCAgOCwgIDApOworCWFsbS0+YV9wb3doYWxmCT0gR0VUX0ZJRUxEX1Uoc2ZbM10sIDI0LCAgMCk7CisJYWxtLT5vbWVnYV8wCT0gR0VUX0ZJRUxEX1Moc2ZbNF0sIDI0LCAgMCk7CisJYWxtLT53CQk9IEdFVF9GSUVMRF9TKHNmWzVdLCAyNCwgIDApOworCWFsbS0+bV8wCT0gR0VUX0ZJRUxEX1Moc2ZbNl0sIDI0LCAgMCk7CisJYWxtLT5hX2YwCT0gKEdFVF9GSUVMRF9TKHNmWzddLCA4LCAxNikgPDwgMykgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmWzddLCAzLCAgMik7CisJYWxtLT5hX2YxCT0gR0VUX0ZJRUxEX1Moc2ZbN10sIDExLCAgNSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZ3BzLmggYi9ycmxwLWVwaGVtZXJpcy9ncHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDFiOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZ3BzLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBncHMuaAorICoKKyAqIEhlYWRlciB0byBkZWFsIHdpdGggbG93IGxldmVsIEdQUyBkYXRhCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX0dQU19IX18KKyNkZWZpbmUgX19HUFNfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisKKyNkZWZpbmUgTUFYX1NWCTY0CisKKworLyogSW9ub3NwZXJpYyBtb2RlbCBkYXRhICovCitzdHJ1Y3QgZ3BzX2lvbm9zcGhlcmVfbW9kZWwgeworCQkJLyogI2JpdHMgIFNjYWxlIGZhY3RvciAgRWZmZWN0aXZlICBVbml0cyAgICAgICAgICAgICovCisJCQkvKiAgICAgICAgICAgKExTQikgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWludCBhbHBoYV8wOwkvKiBzIDggICAgICAgMl4tMzAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgYWxwaGFfMTsJLyogcyA4ICAgICAgIDJeLTI3ICAgICAgICAgICAgICAgICBzIC8gc2VtaS1jaXJjbGVzICovCisJaW50IGFscGhhXzI7CS8qIHMgOCAgICAgICAyXi0yNCAgICAgICAgICAgICAgICAgcyAvIChzZW1pLWNpcmNsZXMpXjIgKi8KKwlpbnQgYWxwaGFfMzsJLyogcyA4ICAgICAgIDJeLTI0ICAgICAgICAgICAgICAgICBzIC8gKHNlbWktY2lyY2xlcyleMyAqLworCWludCBiZXRhXzA7CS8qIHMgOCAgICAgICAyXjExICAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBiZXRhXzE7CS8qIHMgOCAgICAgICAyXjE0ICAgICAgICAgICAgICAgICAgcyAvIHNlbWktY2lyY2xlcyAqLworCWludCBiZXRhXzI7CS8qIHMgOCAgICAgICAyXjE2ICAgICAgICAgICAgICAgICAgcyAvIChzZW1pLWNpcmNsZXMpXjIgKi8KKwlpbnQgYmV0YV8zOwkvKiBzIDggICAgICAgMl4xNiAgICAgICAgICAgICAgICAgIHMgLyAoc2VtaS1jaXJjbGVzKV4zICovCit9OworCisKKy8qIFVUQyBtb2RlbCBkYXRhICovCitzdHJ1Y3QgZ3BzX3V0Y19tb2RlbCB7CisJCQkvKiAjYml0cyAgU2NhbGUgZmFjdG9yICBFZmZlY3RpdmUgIFVuaXRzICAgICAgICAgICAgKi8KKwkJCS8qICAgICAgICAgICAoTFNCKSAgICAgICByYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLworCisJaW50IGEwOwkJLyogcyAzMiAgICAgIDJeLTMwICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGExOwkJLyogcyAyNCAgICAgIDJeLTUwICAgICAgICAgICAgICAgICBzZWNvbmRzIC8gc2Vjb25kcyAqLworCWludCBkZWx0YV90X2xzOwkvKiBzICA4ICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgdF9vdDsJLyogdSAgOCAgICAgIDJeMTIgICAgICAgNjAyLDExMiAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IHduX3Q7CS8qIHUgIDggICAgICAxICAgICAgICAgICAgICAgICAgICAgd2Vla3MgICAgICAgICAgICAqLworCWludCB3bl9sc2Y7CS8qIHUgIDggICAgICAxICAgICAgICAgICAgICAgICAgICAgd2Vla3MgICAgICAgICAgICAqLworCWludCBkbjsJCS8qIHUgIDggICAgICAxICAgICAgICAgICAgICAgIDcgICAgZGF5cyAgICAgICAgICAgICAqLworCWludCBkZWx0YV90X2xzZjsvKiBzICA4ICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KK307CisKKworLyogQWxtYW5hY2ggZGF0YSAqLworc3RydWN0IGdwc19hbG1hbmFjX3N2IHsKKwlpbnQgc3ZfaWQ7CisJaW50IHN2X2hlYWx0aDsKKworCQkJLyogI2JpdHMgIFNjYWxlIGZhY3RvciAgRWZmZWN0aXZlICBVbml0cyAgICAgICAgICAgICovCisJCQkvKiAgICAgICAgICAgKExTQikgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWludCBlOwkJLyogdSAxNiAgICAgIDJeLTIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaW50IHRfb2E7CS8qIHUgIDggICAgICAyXjEyICAgICAgIDYwMiwxMTIgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBrc2lpOwkvKiBzIDE2ICAgICAgMl4tMTkgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgb21lZ2FfZG90OwkvKiBzIDE2ICAgICAgMl4tMzggICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAvIHMgKi8KKwlpbnQgYV9wb3doYWxmOwkvKiB1IDI0ICAgICAgMl4tMTEgICAgICAgICAgICAgICAgIG1ldGVycyAgICAgICAgICAgKi8KKwlpbnQgb21lZ2FfMDsJLyogcyAyNCAgICAgIDJeLTIzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IHc7CQkvKiBzIDI0ICAgICAgMl4tMjMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgbV8wOwkvKiBzIDI0ICAgICAgMl4tMjMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgYV9mMDsJLyogcyAxMSAgICAgIDJeLTIwICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGFfZjE7CS8qIHMgMTEgICAgICAyXi0zOCAgICAgICAgICAgICAgICAgc2Vjb25kcyAvIHNlY29uZHMgKi8KK307CisKK3N0cnVjdCBncHNfYWxtYW5hYyB7CisJaW50IHduYTsKKwlpbnQgbl9zdjsKKwlzdHJ1Y3QgZ3BzX2FsbWFuYWNfc3Ygc3ZzW01BWF9TVl07Cit9OworCisKKy8qIEVwaGVtZXJpcyBkYXRhICovCitzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiB7CisJaW50IHN2X2lkOworCisJCQkvKiAjYml0cyAgU2NhbGUgZmFjdG9yICBFZmZlY3RpdmUgIFVuaXRzICAgICAgICAgICAgKi8KKwkJCS8qICAgICAgICAgICAoTFNCKSAgICAgICByYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLworCisJaW50IGNvZGVfb25fbDI7CS8qIHUgIDIgICAgICAxICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLworCWludCB3ZWVrX25vOwkvKiB1IDEwICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHdlZWsgICAgICAgICAgICAgKi8KKwlpbnQgbDJfcF9mbGFnOwkvKiB1ICAxICAgICAgMSAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgc3ZfdXJhOwkvKiB1ICA0ICAgICAgLyAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgc3ZfaGVhbHRoOwkvKiB1ICA2ICAgICAgLyAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgdF9nZDsJLyogcyAgOCAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGlvZGM7CS8qIHUgMTAgICAgICAvICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLworCWludCB0X29jOwkvKiB1IDE2ICAgICAgMl40ICAgICAgICA2MDQsNzg0ICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgYV9mMjsJLyogcyAgOCAgICAgIDJeLTU1ICAgICAgICAgICAgICAgICBzZWMgLyBzZWNeMiAgICAgICovCisJaW50IGFfZjE7CS8qIHMgMTYgICAgICAyXi00MyAgICAgICAgICAgICAgICAgc2VjIC8gc2VjICAgICAgICAqLworCWludCBhX2YwOwkvKiBzIDIyICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKworCWludCBjX3JzOwkvKiBzIDE2ICAgICAgMl4tNSAgICAgICAgICAgICAgICAgIG1ldGVycyAgICAgICAgICAgKi8KKwlpbnQgZGVsdGFfbjsJLyogcyAxNiAgICAgIDJeLTQzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgLyBzICovCisJaW50IG1fMDsJLyogcyAzMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IGNfdWM7CS8qIHMgMTYgICAgICAyXi0yOSAgICAgICAgICAgICAgICAgcmFkaWFucyAgICAgICAgICAqLworCXVuc2lnbmVkIGludCBlOwkvKiB1IDMyICAgICAgMl4tMzMgICAgICAwLjAzICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgY191czsJLyogcyAxNiAgICAgIDJeLTI5ICAgICAgICAgICAgICAgICByYWRpYW5zICAgICAgICAgICovCisJdW5zaWduZWQgaW50IGFfcG93aGFsZjsgLyogdSAzMiAgMl4tMTkgICAgICAgICAgICAgbWV0ZXJzXigxLzIpICAgICAqLworCWludCB0X29lOwkvKiB1IDE2ICAgICAgMl40ICAgICAgICA2MDQsNzg0ICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgZml0X2ZsYWc7CS8qIHUgIDEgICAgICAvICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLworCisJaW50IGNfaWM7CS8qIHMgMTYgICAgICAyXi0yOSAgICAgICAgICAgICAgICAgcmFkaWFucyAgICAgICAgICAqLworCWludCBvbWVnYV8wOwkvKiBzIDMyICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgY19pczsJLyogcyAxNiAgICAgIDJeLTI5ICAgICAgICAgICAgICAgICByYWRpYW5zICAgICAgICAgICovCisJaW50IGlfMDsJLyogcyAzMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IGNfcmM7CS8qIHMgMTYgICAgICAyXi01ICAgICAgICAgICAgICAgICAgbWV0ZXJzICAgICAgICAgICAqLworCWludCB3OwkJLyogcyAzMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IG9tZWdhX2RvdDsJLyogcyAyNCAgICAgIDJeLTQzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgLyBzICovCisJaW50IGlkb3Q7CS8qIHMgMTQgICAgICAyXi00MyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzIC8gcyAqLworCisJaW50IF9yc3ZkMTsJLyogMjMgYml0cyAqLworCWludCBfcnN2ZDI7CS8qIDI0IGJpdHMgKi8KKwlpbnQgX3JzdmQzOwkvKiAyNCBiaXRzICovCisJaW50IF9yc3ZkNDsJLyogMTYgYml0cyAqLworCWludCBhb2RvOwkvKiA4IGJpdHMgIE5vdCBzdXJlIGl0IG5lZWRzIHRvIGJlIGhlcmUgLi4uICovCit9OworCitzdHJ1Y3QgZ3BzX2VwaGVtZXJpcyB7CisJaW50IG5fc3Y7CisJc3RydWN0IGdwc19lcGhlbWVyaXNfc3Ygc3ZzW01BWF9TVl07Cit9OworCisKKy8qIFJlZmVyZW5jZSBwb3NpdGlvbiAqLworc3RydWN0IGdwc19yZWZfcG9zIHsJLyogV1NHODQgZWxsaXBzb2lkICovCisJZG91YmxlIGxhdGl0dWRlOwkvKiBkZWcgKi8KKwlkb3VibGUgbG9uZ2l0dWRlOwkvKiBkZWcgKi8KKwlkb3VibGUgYWx0aXR1ZGU7CS8qIG0gYWJvdmUgZWxsaXBzb2lkICovCit9OworCisKKy8qIFJlZmVyZW5jZSB0aW1lICovCitzdHJ1Y3QgZ3BzX3JlZl90aW1lIHsKKwlpbnQgd247CQkJLyogR1BTIHdlZWsgbnVtYmVyICovCisJZG91YmxlIHRvdzsJCS8qIGluIHNlY29uZHMgKi8KK307CisKKworLyogQWxsIGFzc2lzdCBkYXRhICovCisjZGVmaW5lIEdQU19GSUVMRF9JT05PU1BIRVJFCSgxPDwwKQorI2RlZmluZSBHUFNfRklFTERfVVRDCQkoMTw8MSkKKyNkZWZpbmUgR1BTX0ZJRUxEX0FMTUFOQUMJKDE8PDIpCisjZGVmaW5lIEdQU19GSUVMRF9FUEhFTUVSSVMJKDE8PDMpCisjZGVmaW5lIEdQU19GSUVMRF9SRUZQT1MJKDE8PDQpCisjZGVmaW5lIEdQU19GSUVMRF9SRUZUSU1FCSgxPDw1KQorCitzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhIHsKKwlpbnQgZmllbGRzOworCXN0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbAlpb25vc3BoZXJlOworCXN0cnVjdCBncHNfdXRjX21vZGVsCQl1dGM7CisJc3RydWN0IGdwc19hbG1hbmFjCQlhbG1hbmFjOworCXN0cnVjdCBncHNfZXBoZW1lcmlzCQllcGhlbWVyaXM7CisJc3RydWN0IGdwc19yZWZfcG9zCQlyZWZfcG9zOworCXN0cnVjdCBncHNfcmVmX3RpbWUJCXJlZl90aW1lOworfTsKKworCisvKiBHUFMgU3ViZnJhbWUgdXRpbGl0eSBtZXRob2RzIChzZWUgZ3BzLmMgZm9yIGRldGFpbHMpICovCitpbnQgZ3BzX3VucGFja19zZjEyMyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfZXBoZW1lcmlzX3N2ICplcGgpOworaW50IGdwc191bnBhY2tfc2Y0NV9hbG1hbmFjKHVpbnQzMl90ICpzZiwgc3RydWN0IGdwc19hbG1hbmFjX3N2ICphbG0pOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0dQU19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvbWFpbi5jIGIvcnJscC1lcGhlbWVyaXMvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDI1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9tYWluLmMKQEAgLTAsMCArMSw5OSBAQAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJncHMuaCIKKyNpbmNsdWRlICJ1YnguaCIKKyNpbmNsdWRlICJ1YngtcGFyc2UuaCIKKyNpbmNsdWRlICJycmxwLmgiCisKK3N0YXRpYyBpbnQKK2RvX3VieF9yZWFkKHN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcywgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IHJ2LCBmZCwgaTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwl2b2lkICpidWY7CisKKwkvKiBMb2FkIGZpbGUgKi8KKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlydiA9IGZzdGF0KGZkLCAmc3QpOworCWlmIChydiA8IDApIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJYnVmID0gbWFsbG9jKHN0LnN0X3NpemUpOworCWlmICghYnVmKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJ2ID0gcmVhZChmZCwgYnVmLCBzdC5zdF9zaXplKTsKKwlpZiAocnYgIT0gc3Quc3Rfc2l6ZSkgeworCQlmcmVlKGJ1Zik7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFBhcnNlIGVhY2ggbWVzc2FnZSAqLworCWZvciAoaT0wOyBpPHN0LnN0X3NpemU7KSB7CisJCWludCBydjsKKwkJcnYgPSB1YnhfbXNnX2Rpc3BhdGNoKHVieF9wYXJzZV9kdCwgYnVmICsgaSwgc3Quc3Rfc2l6ZSAtIGksIGdwcyk7CisJCWlmIChydiA8IDApCisJCQlpKys7CS8qIEludmFsaWQgbWVzc2FnZTogdHJ5IG9uZSBieXRlIGxhdGVyICovCisJCWVsc2UKKwkJCWkgKz0gcnY7CisJfQorCisJLyogRG9uZSAqLworCWZyZWUoYnVmKTsKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fcnJscChzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMpCit7CisJc3RydWN0IHJybHBfYXNzaXN0X3JlcSBhcjsKKwl2b2lkICpwZHVzWzY0XTsKKwlpbnQgbGVuWzY0XTsKKwlpbnQgaSwgcnY7CisKKwljaGFyICp0ZXN0ID0gIlx4MjhceDAwXHg4MFx4MTBceDAxXHgzMlx4MDBceDE5XHg0Rlx4MDdceDE1XHgwNCI7CisKKwlycmxwX2RlY29kZV9hc3Npc3RhbmNlX3JlcXVlc3QoJmFyLCB0ZXN0LCAxMik7CisJcHJpbnRmKCIlMDh4ICUwMTZsbHhcbiIsIGFyLnJlcV9lbGVtcywgKGxvbmcgbG9uZyB1bnNpZ25lZCkgYXIuZXBoX3N2cyk7CisKKwlhci5yZXFfZWxlbXMgPSAtMTsKKwlhci5lcGhfc3ZzID0gLTFMTDsKKwlydiA9IHJybHBfZ3BzX2Fzc2lzdF9wZHVzKGdwcywgJmFyLCBwZHVzLCBsZW4sIDY0KTsKKwlwcmludGYoIiVkXG4iLCBydik7CisJZm9yIChpPTA7IGk8cnY7IGkrKykgeworCQlwcmludGYoIiVwICVkXG4iLCBwZHVzW2ldLCBsZW5baV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhIGdwczsKKwlpbnQgcnY7CisKKwltZW1zZXQoJmdwcywgMHgwMCwgc2l6ZW9mKGdwcykpOworCisJcnYgPSBkb191YnhfcmVhZCgmZ3BzLCAiZGF0YS51YngiKTsKKwkKKwlydiA9IGRvX3JybHAoJmdwcyk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvcnJscC5jIGIvcnJscC1lcGhlbWVyaXMvcnJscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MGMzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9ycmxwLmMKQEAgLTAsMCArMSw2NDggQEAKKy8qCisgKiBycmxwLmMKKyAqCisgKiBSUkxQIGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJncHMuaCIKKyNpbmNsdWRlICJycmxwLmgiCisKKyNpbmNsdWRlIDxQRFUuaD4KKyNpbmNsdWRlIDxHUFMtQXNzaXN0RGF0YS5oPgorI2luY2x1ZGUgPE5hdmlnYXRpb25Nb2RlbC5oPgorI2luY2x1ZGUgPElvbm9zcGhlcmljTW9kZWwuaD4KKyNpbmNsdWRlIDxVVENNb2RlbC5oPgorI2luY2x1ZGUgPEFsbWFuYWMuaD4KKyNpbmNsdWRlIDxSZWZMb2NhdGlvbi5oPgorI2luY2x1ZGUgPFJlZmVyZW5jZVRpbWUuaD4KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJSTFAgQXNzaXN0YW5jZSByZXF1ZXN0IGRlY29kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0te3t7ICovCisvKiBEZWNvZGUgYW5kIHZhbGlkYXRlIHRoZSBhc3Npc3RhbmNlIGRhdGEgcmVxdWVzdCBtZXNzYWdlcy4KKyAqIFNlZSBzZWN0aW9uIDEwLjEwIG9mCisgKiAgLiBFVFNJIFRTIDE0OSAwMzEgVjguMS4wICgyMDA5LTAxKQorICogIC4gM0dQUCBUUyA0OS4wMzEgdmVyc2lvbiA4LjEuMCBSZWxlYXNlIDgKKyAqLworCisvKiBQYWNrZWQgc3RydWN0dXJlIGZyb20gNDkuMDMxIHNwZWMgKFJHQSA9IFJlcXVlc3QgR1BTIEFzc2lzdGFuY2UpICovCisKKyNkZWZpbmUgUlJMUF9SR0EwX0FMTUFOQUMJKDE8PDApCisjZGVmaW5lIFJSTFBfUkdBMF9VVENfTU9ERUwJKDE8PDEpCisjZGVmaW5lIFJSTFBfUkdBMF9JT05PX01PREVMCSgxPDwyKQorI2RlZmluZSBSUkxQX1JHQTBfTkFWX01PREVMCSgxPDwzKQorI2RlZmluZSBSUkxQX1JHQTBfREdQUwkJKDE8PDQpCisjZGVmaW5lIFJSTFBfUkdBMF9SRUZfTE9DCSgxPDw1KQorI2RlZmluZSBSUkxQX1JHQTBfUkVGX1RJTUUJKDE8PDYpCisjZGVmaW5lIFJSTFBfUkdBMF9BQ1FfQVNTSVNUCSgxPDw3KQorCisjZGVmaW5lIFJSTFBfUkdBMV9SRUFMVElNRV9JTlQJKDE8PDApCisjZGVmaW5lIFJSTFBfUkdBMV9FUEhfRVhUCSgxPDwxKQorI2RlZmluZSBSUkxQX1JHQTFfRVBIX0VYVF9DSEVDSwkoMTw8MikKKworc3RydWN0IHJybHBfcmdhX2hkciB7CisJdWludDhfdCBpdGVtczA7CisJdWludDhfdCBpdGVtczE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnJscF9yZ2FfZXBoX3N2IHsKKwl1aW50OF90IHN2X2lkOwkJLyogWzc6Nl0gcmVzZXJ2ZWQsIFs1OjBdIHN2X2lkICovCisJdWludDhfdCBpb2RlOwkJLyogbGF0ZXN0IGVwaCBpbiB0aGUgTVMgbWVtb3J5IGluIGhvdXJzICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnJscF9yZ2FfZXBoIHsKKwl1aW50OF90IHduX2hpOwkJLyogWzc6Nl0gPSB3bls5OjhdICovCisJdWludDhfdCB3bl9sbzsJCS8qIHduWzc6MF0gKi8KKwl1aW50OF90IHRvZTsJCS8qIGxhdGVzdCBlcGggaW4gdGhlIE1TIG1lbW9yeSBpbiBob3VycyAqLworCXVpbnQ4X3QgbnNhdF90bXRvZTsJLyogWzc6NF0gbnN0YXQsIFszOjBdIFQtVG9lIGxpbWl0ICovCisJc3RydWN0IHJybHBfcmdhX2VwaF9zdiBzdnNbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dCB7CisJdWludDhfdCB2YWxpZGl0eTsJLyogaW4gNCBob3VycyB1bml0cyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJybHBfcmdhX2VwaF9leHRfY2hlY2sgeworCQkvKiB3ZWVrcyBhcmUgaW4gZ3BzIHdlZWsgbW9kdWxvIDQgKi8KKwl1aW50OF90IHduX2JlZ2luX2VuZDsJLyogWzc6NF0gYmVnaW4sIFszOjBdIGVuZCAqLworCXVpbnQ4X3QgdG93X2JlZ2luOworCXVpbnQ4X3QgdG93X2VuZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyogUGFyc2luZyBmdW5jdGlvbiAqLworCitpbnQKK3JybHBfZGVjb2RlX2Fzc2lzdGFuY2VfcmVxdWVzdCgKKwlzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxICphciwKKwl2b2lkICpyZXEsIGludCByZXFfbGVuKQoreworCXN0cnVjdCBycmxwX3JnYV9oZHIgKmhkciA9IE5VTEw7CisJc3RydWN0IHJybHBfcmdhX2VwaCAqZXBoID0gTlVMTDsKKwlzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dCAqZXBoX2V4dCA9IE5VTEw7CisJc3RydWN0IHJybHBfcmdhX2VwaF9leHRfY2hlY2sgKmVwaF9leHRfY2hlY2sgPSBOVUxMOworCWludCBwID0gMDsKKworCS8qIFJlc2V0ICovCisJYXItPnJlcV9lbGVtcyA9IDA7CisJYXItPmVwaF9zdnMgPSAwOworCisJLyogUGFyc2UgbWVzc2FnZSAqLworCWhkciA9IHJlcTsKKwlwICs9IHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfaGRyKTsKKwlpZiAocCA+IHJlcV9sZW4pCisJCXJldHVybiAtMTsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9OQVZfTU9ERUwpIHsKKwkJZXBoID0gcmVxICsgcDsKKwkJcCArPSBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2VwaCk7CisJCWlmIChwID4gcmVxX2xlbikKKwkJCXJldHVybiAtMTsKKwkJcCArPSAoZXBoLT5uc2F0X3RtdG9lID4+IDQpICogc2l6ZW9mKHN0cnVjdCBycmxwX3JnYV9lcGhfc3YpOworCQlpZiAocCA+IHJlcV9sZW4pCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGhkci0+aXRlbXMxICYgUlJMUF9SR0ExX0VQSF9FWFQpIHsKKwkJZXBoX2V4dCA9IHJlcSArIHA7CisJCXAgKz0gc2l6ZW9mKHN0cnVjdCBycmxwX3JnYV9lcGhfZXh0KTsKKwkJaWYgKHAgPiByZXFfbGVuKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChoZHItPml0ZW1zMSAmIFJSTFBfUkdBMV9FUEhfRVhUX0NIRUNLKSB7CisJCWVwaF9leHRfY2hlY2sgPSByZXEgKyBwOworCQlwICs9IHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dF9jaGVjayk7CisJCWlmIChwID4gcmVxX2xlbikKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocCAhPSByZXFfbGVuKQorCQlyZXR1cm4gLTI7IC8qIG5vdCBhbGwgYnl0ZXMgY29uc3VtZWQgPz8/ICovCisKKwkvKiBQcmludCBhIHdhcm5pbmcgZm9yIHVuc3VwcG9ydGVkIHJlcXVlc3RzICovCisJaWYgKChlcGhfZXh0ICE9IE5VTEwpIHx8CisJICAgIChlcGhfZXh0X2NoZWNrICE9IE5VTEwpIHx8CisJICAgIChoZHItPml0ZW1zMCAmIChSUkxQX1JHQTBfREdQUyB8IFJSTFBfUkdBMF9BQ1FfQVNTSVNUKSkgfHwKKwkgICAgKGhkci0+aXRlbXMxICYgUlJMUF9SR0ExX1JFQUxUSU1FX0lOVCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJbd10gVW5zdXBwb3J0ZWQgYXNzaXN0YW5jZSBkYXRhIHJlcXVlc3RlZCwgaWdub3JlZCAuLi5cbiIpOworCX0KKworCS8qIENvcHkgdGhlIHJlcXVlc3QgKi8KKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfQUxNQU5BQykKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX0FMTUFOQUM7CisKKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfVVRDX01PREVMKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfVVRDX01PREVMOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX0lPTk9fTU9ERUwpCisJCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9JT05PX01PREVMOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX1JFRl9MT0MpCisJCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9SRUZfTE9DOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX1JFRl9USU1FKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfUkVGX1RJTUU7CisKKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfTkFWX01PREVMKSB7CisJCWludCBpLCBuX3N2cyA9IGVwaC0+bnNhdF90bXRvZSA+PiA0OworCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfRVBIRU1FUklTOworCQlmb3IgKGk9MDsgaTxuX3N2czsgaSsrKQorCQkJYXItPmVwaF9zdnMgfD0gKDFVTEwgPDwgKGVwaC0+c3ZzW2ldLnN2X2lkIC0gMSkpOworCX0KKworCXJldHVybiAwOworfQorCisvKiB9fX0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJSTFAgZWxlbWVudHMgZmlsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0te3t7ICovCisKKwkvKiBIZWxwZXJzICovCisKK3N0YXRpYyB2b2lkCitfdHNfMjNfMDMyX3N0b3JlX2xhdGl0dWRlKGRvdWJsZSBsYXQsIHVpbnQ4X3QgKmIpCit7CisJdWludDMyX3QgeDsKKwl4ID0gKHVpbnQzMl90KSBmbG9vcihmYWJzKGxhdC85MC4wKSAqICgoZG91YmxlKSgxPDwyMykpKTsKKwlpZiAoeCA+PSAoMTw8MjMpKQorCQl4ID0gKDE8PDIzKSAtIDE7CisJaWYgKGxhdCA8IDAuMCkKKwkJeCB8PSAoMTw8MjMpOworCWJbMF0gPSAoeCA+PiAxNikgJiAweGZmOworCWJbMV0gPSAoeCA+PiAgOCkgJiAweGZmOworCWJbMl0gPSAgeCAgICAgICAgJiAweGZmOworfQorCitzdGF0aWMgdm9pZAorX3RzXzIzXzAzMl9zdG9yZV9sb25naXR1ZGUoZG91YmxlIGxvbiwgdWludDhfdCAqYikKK3sKKwlpbnQzMl90IHg7CisJeCA9IGZsb29yKChsb24vMzYwLjApICogKChkb3VibGUpKDE8PDI0KSkpOworCWlmICh4ID49ICgxPDwyMykpCisJCXggPSAweDAwN2ZmZmZmOworCWVsc2UgaWYgKHggPCAtKDE8PDIzKSkKKwkJeCA9IDB4MDA4MDAwMDA7CisJYlswXSA9ICh4ID4+IDE2KSAmIDB4ZmY7CisJYlsxXSA9ICh4ID4+ICA4KSAmIDB4ZmY7CisJYlsyXSA9ICB4ICAgICAgICAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkCitfdHNfMjNfMDMyX3N0b3JlX2FsdGl0dWRlKGRvdWJsZSBhbHQsIHVpbnQ4X3QgKmIpCit7CisJaW50IGFsdF9pID0gKGludClmYWJzKGFsdCk7CisJYlswXSA9ICgoYWx0X2kgPj4gOCkgJiAweDdmKSB8IChhbHQ8MC4wID8gMHg4MCA6IDB4MDApOworCWJbMV0gPSBhbHRfaSAmIDB4ZmY7Cit9CisKKworCS8qIEZpbGwgbWV0aG9kcyAqLworCitzdGF0aWMgdm9pZAorX3JybHBfZmlsbF9uYXZpZ2F0aW9uX21vZGVsX2VsZW1lbnQoCisJc3RydWN0IE5hdk1vZGVsRWxlbWVudCAqcnJscF9ubWUsCisJc3RydWN0IGdwc19lcGhlbWVyaXNfc3YgKmdwc19lcGhfc3YpCit7CisJc3RydWN0IFVuY29tcHJlc3NlZEVwaGVtZXJpcyAqcnJscF9lcGg7CisKKwlycmxwX25tZS0+c2F0U3RhdHVzLnByZXNlbnQgPSBTYXRTdGF0dXNfUFJfbmV3U2F0ZWxsaXRlQW5kTW9kZWxVQzsKKwlycmxwX25tZS0+c2F0ZWxsaXRlSUQgPSBncHNfZXBoX3N2LT5zdl9pZDsKKworCXJybHBfZXBoID0gJnJybHBfbm1lLT5zYXRTdGF0dXMuY2hvaWNlLm5ld1NhdGVsbGl0ZUFuZE1vZGVsVUM7CisKKwlycmxwX2VwaC0+ZXBoZW1Db2RlT25MMiAgID0gZ3BzX2VwaF9zdi0+Y29kZV9vbl9sMjsKKwlycmxwX2VwaC0+ZXBoZW1VUkEgICAgICAgID0gZ3BzX2VwaF9zdi0+c3ZfdXJhOworCXJybHBfZXBoLT5lcGhlbVNWaGVhbHRoICAgPSBncHNfZXBoX3N2LT5zdl9oZWFsdGg7CisJcnJscF9lcGgtPmVwaGVtSU9EQyAgICAgICA9IGdwc19lcGhfc3YtPmlvZGM7CisJcnJscF9lcGgtPmVwaGVtTDJQZmxhZyAgICA9IGdwc19lcGhfc3YtPmwyX3BfZmxhZzsKKwlycmxwX2VwaC0+ZXBoZW1UZ2QgICAgICAgID0gZ3BzX2VwaF9zdi0+dF9nZDsKKwlycmxwX2VwaC0+ZXBoZW1Ub2MgICAgICAgID0gZ3BzX2VwaF9zdi0+dF9vYzsKKwlycmxwX2VwaC0+ZXBoZW1BRjIgICAgICAgID0gZ3BzX2VwaF9zdi0+YV9mMjsKKwlycmxwX2VwaC0+ZXBoZW1BRjEgICAgICAgID0gZ3BzX2VwaF9zdi0+YV9mMTsKKwlycmxwX2VwaC0+ZXBoZW1BRjAgICAgICAgID0gZ3BzX2VwaF9zdi0+YV9mMDsKKwlycmxwX2VwaC0+ZXBoZW1DcnMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y19yczsKKwlycmxwX2VwaC0+ZXBoZW1EZWx0YU4gICAgID0gZ3BzX2VwaF9zdi0+ZGVsdGFfbjsKKwlycmxwX2VwaC0+ZXBoZW1NMCAgICAgICAgID0gZ3BzX2VwaF9zdi0+bV8wOworCXJybHBfZXBoLT5lcGhlbUN1YyAgICAgICAgPSBncHNfZXBoX3N2LT5jX3VjOworCXJybHBfZXBoLT5lcGhlbUUgICAgICAgICAgPSBncHNfZXBoX3N2LT5lOworCXJybHBfZXBoLT5lcGhlbUN1cyAgICAgICAgPSBncHNfZXBoX3N2LT5jX3VzOworCXJybHBfZXBoLT5lcGhlbUFQb3dlckhhbGYgPSBncHNfZXBoX3N2LT5hX3Bvd2hhbGY7CisJcnJscF9lcGgtPmVwaGVtVG9lICAgICAgICA9IGdwc19lcGhfc3YtPnRfb2U7CisJcnJscF9lcGgtPmVwaGVtRml0RmxhZyAgICA9IGdwc19lcGhfc3YtPmZpdF9mbGFnOworCXJybHBfZXBoLT5lcGhlbUFPREEgICAgICAgPSBncHNfZXBoX3N2LT5hb2RvOworCXJybHBfZXBoLT5lcGhlbUNpYyAgICAgICAgPSBncHNfZXBoX3N2LT5jX2ljOworCXJybHBfZXBoLT5lcGhlbU9tZWdhQTAgICAgPSBncHNfZXBoX3N2LT5vbWVnYV8wOworCXJybHBfZXBoLT5lcGhlbUNpcyAgICAgICAgPSBncHNfZXBoX3N2LT5jX2lzOworCXJybHBfZXBoLT5lcGhlbUkwICAgICAgICAgPSBncHNfZXBoX3N2LT5pXzA7CisJcnJscF9lcGgtPmVwaGVtQ3JjICAgICAgICA9IGdwc19lcGhfc3YtPmNfcmM7CisJcnJscF9lcGgtPmVwaGVtVyAgICAgICAgICA9IGdwc19lcGhfc3YtPnc7CisJcnJscF9lcGgtPmVwaGVtT21lZ2FBRG90ICA9IGdwc19lcGhfc3YtPm9tZWdhX2RvdDsKKwlycmxwX2VwaC0+ZXBoZW1JRG90ICAgICAgID0gZ3BzX2VwaF9zdi0+aWRvdDsKKworCXJybHBfZXBoLT5lcGhlbVNGMVJzdmQucmVzZXJ2ZWQxID0gZ3BzX2VwaF9zdi0+X3JzdmQxOworCXJybHBfZXBoLT5lcGhlbVNGMVJzdmQucmVzZXJ2ZWQyID0gZ3BzX2VwaF9zdi0+X3JzdmQyOworCXJybHBfZXBoLT5lcGhlbVNGMVJzdmQucmVzZXJ2ZWQzID0gZ3BzX2VwaF9zdi0+X3JzdmQzOworCXJybHBfZXBoLT5lcGhlbVNGMVJzdmQucmVzZXJ2ZWQ0ID0gZ3BzX2VwaF9zdi0+X3JzdmQ0OworfQorCitzdGF0aWMgdm9pZAorX3JybHBfZmlsbF9hbG1hbmFjX2VsZW1lbnQoCisJc3RydWN0IEFsbWFuYWNFbGVtZW50ICpycmxwX2FlLAorCXN0cnVjdCBncHNfYWxtYW5hY19zdiAqZ3BzX2FsbV9zdikKK3sKKwlycmxwX2FlLT5zYXRlbGxpdGVJRCA9IGdwc19hbG1fc3YtPnN2X2lkOworCisJcnJscF9hZS0+YWxtYW5hY0UgICAgICAgICAgPSBncHNfYWxtX3N2LT5lOworCXJybHBfYWUtPmFsYW1hbmFjVG9hICAgICAgID0gZ3BzX2FsbV9zdi0+dF9vYTsKKwlycmxwX2FlLT5hbG1hbmFjS3NpaSAgICAgICA9IGdwc19hbG1fc3YtPmtzaWk7CisJcnJscF9hZS0+YWxtYW5hY09tZWdhRG90ICAgPSBncHNfYWxtX3N2LT5vbWVnYV9kb3Q7CisJcnJscF9hZS0+YWxtYW5hY1NWaGVhbHRoICAgPSBncHNfYWxtX3N2LT5zdl9oZWFsdGg7CisJcnJscF9hZS0+YWxtYW5hY0FQb3dlckhhbGYgPSBncHNfYWxtX3N2LT5hX3Bvd2hhbGY7CisJcnJscF9hZS0+YWxtYW5hY09tZWdhMCAgICAgPSBncHNfYWxtX3N2LT5vbWVnYV8wOworCXJybHBfYWUtPmFsbWFuYWNXICAgICAgICAgID0gZ3BzX2FsbV9zdi0+dzsKKwlycmxwX2FlLT5hbG1hbmFjTTAgICAgICAgICA9IGdwc19hbG1fc3YtPm1fMDsKKwlycmxwX2FlLT5hbG1hbmFjQUYwICAgICAgICA9IGdwc19hbG1fc3YtPmFfZjA7CisJcnJscF9hZS0+YWxtYW5hY0FGMSAgICAgICAgPSBncHNfYWxtX3N2LT5hX2YxOworCit9CisKK3N0YXRpYyB2b2lkCitfcnJscF9maWxsX2lvbm9zcGhlcmljX21vZGVsKAorCXN0cnVjdCBJb25vc3BoZXJpY01vZGVsICpycmxwX2lvbm8sCisJc3RydWN0IGdwc19pb25vc3BoZXJlX21vZGVsICpncHNfaW9ubykKK3sKKwlycmxwX2lvbm8tPmFsZmEwID0gZ3BzX2lvbm8tPmFscGhhXzA7CisJcnJscF9pb25vLT5hbGZhMSA9IGdwc19pb25vLT5hbHBoYV8xOworCXJybHBfaW9uby0+YWxmYTIgPSBncHNfaW9uby0+YWxwaGFfMjsKKwlycmxwX2lvbm8tPmFsZmEzID0gZ3BzX2lvbm8tPmFscGhhXzM7CisJcnJscF9pb25vLT5iZXRhMCA9IGdwc19pb25vLT5iZXRhXzA7CisJcnJscF9pb25vLT5iZXRhMSA9IGdwc19pb25vLT5iZXRhXzE7CisJcnJscF9pb25vLT5iZXRhMiA9IGdwc19pb25vLT5iZXRhXzI7CisJcnJscF9pb25vLT5iZXRhMyA9IGdwc19pb25vLT5iZXRhXzM7Cit9CisKK3N0YXRpYyB2b2lkCitfcnJscF9maWxsX3V0Y19tb2RlbCgKKwlzdHJ1Y3QgVVRDTW9kZWwgKnJybHBfdXRjLAorCXN0cnVjdCBncHNfdXRjX21vZGVsICpncHNfdXRjKQoreworCXJybHBfdXRjLT51dGNBMSAgICAgICAgPSBncHNfdXRjLT5hMTsKKwlycmxwX3V0Yy0+dXRjQTAgICAgICAgID0gZ3BzX3V0Yy0+YTA7CisJcnJscF91dGMtPnV0Y1RvdCAgICAgICA9IGdwc191dGMtPnRfb3Q7CisJcnJscF91dGMtPnV0Y1dOdCAgICAgICA9IGdwc191dGMtPnduX3QgJiAweGZmOworCXJybHBfdXRjLT51dGNEZWx0YVRscyAgPSBncHNfdXRjLT5kZWx0YV90X2xzOworCXJybHBfdXRjLT51dGNXTmxzZiAgICAgPSBncHNfdXRjLT53bl9sc2YgJiAweGZmOworCXJybHBfdXRjLT51dGNETiAgICAgICAgPSBncHNfdXRjLT5kbjsKKwlycmxwX3V0Yy0+dXRjRGVsdGFUbHNmID0gZ3BzX3V0Yy0+ZGVsdGFfdF9sc2Y7Cit9CisKKy8qIH19fSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUlJMUCBBc3Npc3RhbmNlIFBEVSBHZW5lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS17e3sgKi8KKworc3RydWN0IFBEVSAqCitfcnJscF9jcmVhdGVfZ3BzX2Fzc2lzdF9wZHUoaW50IHJlZm51bSwgc3RydWN0IEdQU19Bc3Npc3REYXRhICoqb19ncHNfYWQpCit7CisJc3RydWN0IFBEVSAqcGR1OworCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqZ3BzX2FkOworCisJcGR1ID0gY2FsbG9jKDEsIHNpemVvZigqcGR1KSk7CisJaWYgKCFwZHUpCisJCXJldHVybiBOVUxMOworCisJZ3BzX2FkID0gY2FsbG9jKDEsIHNpemVvZigqZ3BzX2FkKSk7CisJaWYgKCFncHNfYWQpIHsKKwkJZnJlZShwZHUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAob19ncHNfYWQpCisJCSpvX2dwc19hZCA9IGdwc19hZDsKKworCXBkdS0+cmVmZXJlbmNlTnVtYmVyID0gcmVmbnVtOworCXBkdS0+Y29tcG9uZW50LnByZXNlbnQgPSBSUkxQX0NvbXBvbmVudF9QUl9hc3Npc3RhbmNlRGF0YTsKKwlwZHUtPmNvbXBvbmVudC5jaG9pY2UuYXNzaXN0YW5jZURhdGEuZ3BzX0Fzc2lzdERhdGEgPSBncHNfYWQ7CisKKwlyZXR1cm4gcGR1OworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfaW9ub3NwaGVyaWNfbW9kZWwoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQpCit7CisJc3RydWN0IElvbm9zcGhlcmljTW9kZWwgKnJybHBfaW9ubzsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX0lPTk9TUEhFUkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfaW9ubyA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfaW9ubykpOworCWlmICghcnJscF9pb25vKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5pb25vc3BoZXJpY01vZGVsID0gcnJscF9pb25vOworCisJX3JybHBfZmlsbF9pb25vc3BoZXJpY19tb2RlbChycmxwX2lvbm8sICZncHNfYWQtPmlvbm9zcGhlcmUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK19ycmxwX2FkZF91dGNfbW9kZWwoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQpCit7CisJc3RydWN0IFVUQ01vZGVsICpycmxwX3V0YzsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX1VUQykpCisJCXJldHVybiAtRUlOVkFMOworCisJcnJscF91dGMgPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX3V0YykpOworCWlmICghcnJscF91dGMpCisJCXJldHVybiAtRU5PTUVNOworCXJybHBfZ3BzX2FkLT5jb250cm9sSGVhZGVyLnV0Y01vZGVsID0gcnJscF91dGM7CisKKwlfcnJscF9maWxsX3V0Y19tb2RlbChycmxwX3V0YywgJmdwc19hZC0+dXRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfcmVmZXJlbmNlX2xvY2F0aW9uKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQoreworCXN0cnVjdCBSZWZMb2NhdGlvbiAqcnJscF9yZWZsb2M7CisJdWludDhfdCAqYjsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX1JFRlBPUykpCisJCXJldHVybiAtRUlOVkFMOworCisJcnJscF9yZWZsb2MgPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX3JlZmxvYykpOworCWlmICghcnJscF9yZWZsb2MpCisJCXJldHVybiAtRU5PTUVNOworCXJybHBfZ3BzX2FkLT5jb250cm9sSGVhZGVyLnJlZkxvY2F0aW9uID0gcnJscF9yZWZsb2M7CisKKwliID0gbWFsbG9jKDkpOworCisJYlswXSA9IDB4ODA7IC8qIEVsbGlwc29pZCBQb2ludCB3aXRoIGFsdGl0dWRlICovCisJX3RzXzIzXzAzMl9zdG9yZV9sYXRpdHVkZShncHNfYWQtPnJlZl9wb3MubGF0aXR1ZGUsICZiWzFdKTsKKwlfdHNfMjNfMDMyX3N0b3JlX2xvbmdpdHVkZShncHNfYWQtPnJlZl9wb3MubG9uZ2l0dWRlLCAmYls0XSk7CisJX3RzXzIzXzAzMl9zdG9yZV9hbHRpdHVkZShncHNfYWQtPnJlZl9wb3MuYWx0aXR1ZGUsICZiWzddKTsKKworCXJybHBfcmVmbG9jLT50aHJlZURMb2NhdGlvbi5idWYgPSBiOworCXJybHBfcmVmbG9jLT50aHJlZURMb2NhdGlvbi5zaXplID0gOTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfcmVmZXJlbmNlX3RpbWUoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQpCit7CisJc3RydWN0IFJlZmVyZW5jZVRpbWUgKnJybHBfcmVmdGltZTsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX1JFRlRJTUUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfcmVmdGltZSA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfcmVmdGltZSkpOworCWlmICghcnJscF9yZWZ0aW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5yZWZlcmVuY2VUaW1lID0gcnJscF9yZWZ0aW1lOworCisJcnJscF9yZWZ0aW1lLT5ncHNUaW1lLmdwc1dlZWsgICA9IGdwc19hZC0+cmVmX3RpbWUud24gJiAweDNmZjsgLyogMTBiICovCisJcnJscF9yZWZ0aW1lLT5ncHNUaW1lLmdwc1RPVzIzYiA9CisJCSgoaW50KWZsb29yKGdwc19hZC0+cmVmX3RpbWUudG93IC8gMC4wOCkpICYgMHg3ZmZmZmY7ICAvKiAyM2IgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfYWxtYW5hYygKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCwgaW50ICpzdGFydCwgaW50IGNvdW50KQoreworCWludCBpOworCXN0cnVjdCBBbG1hbmFjICpycmxwX2FsbTsKKwlzdHJ1Y3QgZ3BzX2FsbWFuYWMgKmdwc19hbG0gPSAmZ3BzX2FkLT5hbG1hbmFjOworCisJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfQUxNQU5BQykpCisJCXJldHVybiAtRUlOVkFMOworCisJcnJscF9hbG0gPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX2FsbSkpOworCWlmICghcnJscF9hbG0pCisJCXJldHVybiAtRU5PTUVNOworCXJybHBfZ3BzX2FkLT5jb250cm9sSGVhZGVyLmFsbWFuYWMgPSBycmxwX2FsbTsKKworCXJybHBfYWxtLT5hbGFtYW5hY1dOYSA9IGdwc19hbG0tPnduYTsKKwlpZiAoY291bnQgPT0gLTEpCisJCWNvdW50ID0gZ3BzX2FsbS0+bl9zdiAtICpzdGFydDsKKwlmb3IgKGk9KnN0YXJ0OyAoaTwqc3RhcnQrY291bnQpICYmIChpPGdwc19hbG0tPm5fc3YpOyBpKyspIHsKKwkJc3RydWN0IEFsbWFuYWNFbGVtZW50ICphZTsKKwkJYWUgPSBjYWxsb2MoMSwgc2l6ZW9mKCphZSkpOworCQlpZiAoIWFlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCV9ycmxwX2ZpbGxfYWxtYW5hY19lbGVtZW50KGFlLCAmZ3BzX2FsbS0+c3ZzW2ldKTsKKwkJQVNOX1NFUVVFTkNFX0FERCgmcnJscF9hbG0tPmFsbWFuYWNMaXN0Lmxpc3QsIGFlKTsKKwl9CisKKwkqc3RhcnQgPSBpOworCisJcmV0dXJuIGkgPCBncHNfYWxtLT5uX3N2OworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfZXBoZW1lcmlzKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkLCBpbnQgKnN0YXJ0LCBpbnQgY291bnQsIHVpbnQ2NF90IG1hc2spCit7CisJaW50IGksIGo7CisJc3RydWN0IE5hdmlnYXRpb25Nb2RlbCAqcnJscF9uYXY7CisJc3RydWN0IGdwc19lcGhlbWVyaXMgKmdwc19lcGggPSAmZ3BzX2FkLT5lcGhlbWVyaXM7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9FUEhFTUVSSVMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfbmF2ID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9uYXYpKTsKKwlpZiAoIXJybHBfbmF2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5uYXZpZ2F0aW9uTW9kZWwgPSBycmxwX25hdjsKKworCWlmIChjb3VudCA9PSAtMSkKKwkJY291bnQgPSBncHNfZXBoLT5uX3N2IC0gKnN0YXJ0OworCWZvciAoaT0qc3RhcnQsaj0wOyAoajxjb3VudCkgJiYgKGk8Z3BzX2VwaC0+bl9zdik7IGkrKykgeworCQlpZiAoIShtYXNrICYgKDFVTEw8PChncHNfZXBoLT5zdnNbaV0uc3ZfaWQtMSkpKSkKKwkJCWNvbnRpbnVlOworCQlzdHJ1Y3QgTmF2TW9kZWxFbGVtZW50ICpubWU7CisJCW5tZSA9IGNhbGxvYygxLCBzaXplb2YoKm5tZSkpOworCQlpZiAoIW5tZSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlfcnJscF9maWxsX25hdmlnYXRpb25fbW9kZWxfZWxlbWVudChubWUsICZncHNfZXBoLT5zdnNbaV0pOworCQlBU05fU0VRVUVOQ0VfQUREKCZycmxwX25hdi0+bmF2TW9kZWxMaXN0Lmxpc3QsIG5tZSk7CisJCWorKzsKKwl9CisKKwkqc3RhcnQgPSBpOworCisJcmV0dXJuIGkgPCBncHNfZXBoLT5uX3N2OworfQorCisKKyNkZWZpbmUgTUFYX1BEVVMgNjQKKworaW50CitycmxwX2dwc19hc3Npc3RfcGR1cygKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQsIHN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgKnJlcSwKKwl2b2lkICoqb19wZHUsIGludCAqb19sZW4sIGludCBvX21heF9wZHVzKQoreworCXN0cnVjdCBQRFUgKmxzdF9wZHVbTUFYX1BEVVNdOworCWludCBsc3RfY250ID0gMDsKKworCXN0cnVjdCBQRFUgKnJybHBfcGR1ID0gTlVMTDsKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkID0gTlVMTDsKKwl1aW50MzJfdCByZSA9IHJlcS0+cmVxX2VsZW1zOworCWludCBpLCBydiA9IDA7CisKKwkvKiBJb25vc3BoZXJpY01vZGVsLCBVVENNb2RlbCwgUmVmTG9jYXRpb24sIFJlZmVyZW5jZVRpbWUgKi8KKwlpZiAocmUgJiAoUlJMUF9BUl9JT05PX01PREVMIHwKKwkgICAgICAgICAgUlJMUF9BUl9VVENfTU9ERUwgfAorCSAgICAgICAgICBSUkxQX0FSX1JFRl9USU1FIHwKKwkgICAgICAgICAgUlJMUF9BUl9SRUZfTE9DKSkKKwl7CisJCWludCBwZHVfaGFzX2RhdGEgPSAwOworCisJCXJybHBfcGR1ID0gX3JybHBfY3JlYXRlX2dwc19hc3Npc3RfcGR1KDEsICZycmxwX2dwc19hZCk7CisJCWlmICghcnJscF9wZHUpIHsKKwkJCXJ2ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpZiAocmUgJiBSUkxQX0FSX0lPTk9fTU9ERUwpCisJCQlpZiAoIV9ycmxwX2FkZF9pb25vc3BoZXJpY19tb2RlbChycmxwX2dwc19hZCwgZ3BzX2FkKSkKKwkJCQlwZHVfaGFzX2RhdGEgPSAxOworCisJCWlmIChyZSAmIFJSTFBfQVJfVVRDX01PREVMKQorCQkJaWYgKCFfcnJscF9hZGRfdXRjX21vZGVsKHJybHBfZ3BzX2FkLCBncHNfYWQpKQorCQkJCXBkdV9oYXNfZGF0YSA9IDE7CisKKwkJaWYgKHJlICYgUlJMUF9BUl9SRUZfVElNRSkKKwkJCWlmICghX3JybHBfYWRkX3JlZmVyZW5jZV90aW1lKHJybHBfZ3BzX2FkLCBncHNfYWQpKQorCQkJCXBkdV9oYXNfZGF0YSA9IDE7CisKKwkJaWYgKHJlICYgUlJMUF9BUl9SRUZfTE9DKQorCQkJaWYgKCFfcnJscF9hZGRfcmVmZXJlbmNlX2xvY2F0aW9uKHJybHBfZ3BzX2FkLCBncHNfYWQpKQorCQkJCXBkdV9oYXNfZGF0YSA9IDE7CisKKwkJaWYgKHBkdV9oYXNfZGF0YSkgeworCQkJbHN0X3BkdVtsc3RfY250KytdID0gcnJscF9wZHU7CisJCQlycmxwX3BkdSA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBBbG1hbmFjICovCisJaWYgKHJlICYgUlJMUF9BUl9BTE1BTkFDKSB7CisJCWkgPSAwOworCQlkbyB7CisJCQlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9BTE1BTkFDKSkKKwkJCQlicmVhazsKKworCQkJaWYgKCFycmxwX3BkdSkgeworCQkJCXJybHBfcGR1ID0gX3JybHBfY3JlYXRlX2dwc19hc3Npc3RfcGR1KDEsICZycmxwX2dwc19hZCk7CisJCQkJaWYgKCFycmxwX3BkdSkgeworCQkJCQlydiA9IC1FTk9NRU07CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJfQorCisJCQlydiA9IF9ycmxwX2FkZF9hbG1hbmFjKHJybHBfZ3BzX2FkLCBncHNfYWQsICZpLCAxMCk7CisJCQlpZiAocnYgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCWxzdF9wZHVbbHN0X2NudCsrXSA9IHJybHBfcGR1OworCQkJcnJscF9wZHUgPSBOVUxMOworCQl9IHdoaWxlIChydik7CisJfQorCisJLyogRXBoZW1lcmlzICovCisJaWYgKHJlICYgUlJMUF9BUl9FUEhFTUVSSVMpIHsKKwkJaSA9IDA7CisJCWRvIHsKKwkJCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX0VQSEVNRVJJUykpCisJCQkJYnJlYWs7CisKKwkJCWlmICghcnJscF9wZHUpIHsKKwkJCQlycmxwX3BkdSA9IF9ycmxwX2NyZWF0ZV9ncHNfYXNzaXN0X3BkdSgxLCAmcnJscF9ncHNfYWQpOworCQkJCWlmICghcnJscF9wZHUpIHsKKwkJCQkJcnYgPSAtRU5PTUVNOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCX0KKworCQkJcnYgPSBfcnJscF9hZGRfZXBoZW1lcmlzKHJybHBfZ3BzX2FkLCBncHNfYWQsICZpLCAyLCByZXEtPmVwaF9zdnMpOworCisJCQlsc3RfcGR1W2xzdF9jbnQrK10gPSBycmxwX3BkdTsKKwkJCXJybHBfcGR1ID0gTlVMTDsKKworCQl9IHdoaWxlIChydik7CisJfQorCisJLyogU2VyaWFsaXplICYgUmVsZWFzZSBhbGwgUERVcyAqLworCWZvciAoaT0wOyBpPGxzdF9jbnQgJiYgaTxvX21heF9wZHVzOyBpKyspIHsKKwkJLyogUHNldWRvIHNlZ21lbnRhdGlvbiBmbGFncyAqLworCQlNb3JlQXNzRGF0YVRvQmVTZW50X3QgKm1hZCA9IGNhbGxvYygxLCBzaXplb2YoKm1hZCkpOworCQkqbWFkID0gKGkgPT0gKGxzdF9jbnQtMSkpID8KKwkJCQlNb3JlQXNzRGF0YVRvQmVTZW50X25vTW9yZU1lc3NhZ2VzIDoKKwkJCQlNb3JlQXNzRGF0YVRvQmVTZW50X21vcmVNZXNzYWdlc09uVGhlV2F5OworCQlsc3RfcGR1W2ldLT5jb21wb25lbnQuY2hvaWNlLmFzc2lzdGFuY2VEYXRhLm1vcmVBc3NEYXRhVG9CZVNlbnQgPSBtYWQ7CisKKwkJLyogU2VyaWFsaXphdGlvbiAqLworCQkvLyBhc25fZnByaW50KHN0ZG91dCwgJmFzbl9ERUZfUERVLCBsc3RfcGR1W2ldKTsKKwkJcnYgPSB1cGVyX2VuY29kZV90b19uZXdfYnVmZmVyKCZhc25fREVGX1BEVSwgTlVMTCwgbHN0X3BkdVtpXSwgJm9fcGR1W2ldKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCW9fbGVuW2ldID0gcnY7CisJfQorCisJcnYgPSBsc3RfY250OworCisJLyogUmVsZWFzZSBBU04uMSBvYmplY3RzICovCitlcnJvcjoKKwlpZiAocnJscF9wZHUpCisJCWFzbl9ERUZfUERVLmZyZWVfc3RydWN0KCZhc25fREVGX1BEVSwgKHZvaWQqKXJybHBfcGR1LCAwKTsKKworCWZvciAoaT0wOyBpPGxzdF9jbnQ7IGkrKykKKwkJYXNuX0RFRl9QRFUuZnJlZV9zdHJ1Y3QoJmFzbl9ERUZfUERVLCBsc3RfcGR1W2ldLCAwKTsKKworCXJldHVybiBydjsKK30KKworLyogfX19ICovCisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3JybHAuaCBiL3JybHAtZXBoZW1lcmlzL3JybHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU0MzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvcnJscC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBycmxwLmgKKyAqCisgKiBSUkxQIEhlYWRlcgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19SUkxQX0hfXworI2RlZmluZSBfX1JSTFBfSF9fCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImdwcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogT3VyIGludGVybmFsIHNpbXBsaWZpZWQgc3RydWN0dXJlIGZvciByZXF1ZXN0cyAqLworCisjZGVmaW5lIFJSTFBfQVJfUkVGX0xPQwkJKDE8PDApCisjZGVmaW5lIFJSTFBfQVJfUkVGX1RJTUUJKDE8PDEpCisjZGVmaW5lIFJSTFBfQVJfVVRDX01PREVMCSgxPDwyKQorI2RlZmluZSBSUkxQX0FSX0lPTk9fTU9ERUwJKDE8PDMpCisjZGVmaW5lIFJSTFBfQVJfQUxNQU5BQwkJKDE8PDQpCisjZGVmaW5lIFJSTFBfQVJfRVBIRU1FUklTCSgxPDw1KQorCitzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxIHsKKwl1aW50MzJfdCByZXFfZWxlbXM7CisJdWludDY0X3QgZXBoX3N2czsKK307CisKKworLyogTWV0aG9kcyAqLworaW50IHJybHBfZGVjb2RlX2Fzc2lzdGFuY2VfcmVxdWVzdChzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxICphciwKKwl2b2lkICpyZXEsIGludCByZXFfbGVuKTsKKworaW50IHJybHBfZ3BzX2Fzc2lzdF9wZHVzKAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCwgc3RydWN0IHJybHBfYXNzaXN0X3JlcSAqcmVxLAorCXZvaWQgKipvX3BkdSwgaW50ICpvX2xlbiwgaW50IG9fbWF4X3BkdXMpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1JSTFBfSF9fICovCisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5jIGIvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkMGY3MAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogdWJ4LXBhcnNlLmMKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBwYXJzaW5nIGNvZGUgY29udmVydGluZyBVQlggbWVzc2FnZXMgdG8gR1BTIGFzc2lzdAorICogZGF0YQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ3BzLmgiCisjaW5jbHVkZSAidWJ4LmgiCisjaW5jbHVkZSAidWJ4LXBhcnNlLmgiCisKKworLyogSGVscGVycyAqLworCitzdGF0aWMgaW50CitmbG9hdF90b19maXhlZHBvaW50KGZsb2F0IGYsIGludCBzZikKK3sKKwlpZiAoc2YgPCAwKSB7CisJCXdoaWxlIChzZisrIDwgMCkKKwkJCWYgKj0gMi4wZjsKKwl9IGVsc2UgeworCQl3aGlsZSAoc2YtLSA+IDApCisJCQlmICo9IDAuNWY7CisJfQorCisJcmV0dXJuIChpbnQpZjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2RvdWJsZV90b19maXhlZHBvaW50KGRvdWJsZSBkLCBpbnQgc2YpCit7CisJaWYgKHNmIDwgMCkgeworCQl3aGlsZSAoc2YrKyA8IDApCisJCQlkICo9IDIuMDsKKwl9IGVsc2UgeworCQl3aGlsZSAoc2YtLSA+IDApCisJCQlkICo9IDAuNTsKKwl9CisKKwlyZXR1cm4gKGludClkOworfQorCisKKy8qIFVCWCBtZXNzYWdlIHBhcnNpbmcgdG8gZmlsbCBncHMgYXNzaXN0IGRhdGEgKi8KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX25hdl9wb3NsbGgoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfbmF2X3Bvc2xsaCAqbmF2X3Bvc2xsaCA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBOQVZfUE9TTExIXG4iKTsKKworCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9SRUZQT1M7CisKKwlncHMtPnJlZl9wb3MubGF0aXR1ZGUgID0gKGRvdWJsZSkobmF2X3Bvc2xsaC0+bGF0KSAqIDFlLTc7CisJZ3BzLT5yZWZfcG9zLmxvbmdpdHVkZSA9IChkb3VibGUpKG5hdl9wb3NsbGgtPmxvbikgKiAxZS03OworCWdwcy0+cmVmX3Bvcy5hbHRpdHVkZSAgPSAoZG91YmxlKShuYXZfcG9zbGxoLT5oZWlnaHQpICogMWUtMzsKK30KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX2FpZF9pbmkoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfYWlkX2luaSAqYWlkX2luaSA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBBSURfSU5JXG4iKTsKKworCS8qIEV4dHJhY3QgaW5mbyBmb3IgIlJlZmVyZW5jZSBUaW1lIiAqLworCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9SRUZUSU1FOworCisJZ3BzLT5yZWZfdGltZS53biA9IGFpZF9pbmktPnduOworCWdwcy0+cmVmX3RpbWUudG93ID0gKGRvdWJsZSlhaWRfaW5pLT50b3cgKiAxZS0zOworCisJLy8gRklYTUU6IFdlIGNvdWxkIGV4dHJhY3QgcmVmIHBvc2l0aW9uIGFzIHdlbGwgYnV0IHdlIG5lZWQgaXQgaW4KKwkvLyAgICAgICAgV0dTODQgZ2VvZGV0aWMgY29vcmRpbmF0ZXMgYW5kIGl0J3MgcHJvdmlkZWQgYXMgZWNlZiwgc28KKwkvLyAgICAgICAgd2UgbmVlZCBhIGxvdCBvZiBtYXRoIC4uLgorfQorCitzdGF0aWMgdm9pZAorX3VieF9tc2dfcGFyc2VfYWlkX2h1aShzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCit7CisJc3RydWN0IHVieF9haWRfaHVpICphaWRfaHVpID0gcGw7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7CisKKwkvL3ByaW50ZigiWy5dIEFJRF9IVUlcbiIpOworCisJaWYgKGFpZF9odWktPmZsYWdzICYgMHgyKSB7IC8qIFVUQyBwYXJhbWV0ZXJzIHZhbGlkICovCisJCXN0cnVjdCBncHNfdXRjX21vZGVsICp1dGMgPSAmZ3BzLT51dGM7CisKKwkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX1VUQzsKKworCQl1dGMtPmEwICAgICAgICAgID0gZG91YmxlX3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+dXRjX2EwLCAtMzApOworCQl1dGMtPmExICAgICAgICAgID0gZG91YmxlX3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+dXRjX2ExLCAtNTApOworCQl1dGMtPmRlbHRhX3RfbHMgID0gYWlkX2h1aS0+dXRjX2xzOworCQl1dGMtPnRfb3QgICAgICAgID0gYWlkX2h1aS0+dXRjX3RvdCA+PiAxMjsKKwkJdXRjLT53bl90ICAgICAgICA9IGFpZF9odWktPnV0Y193bnQ7CisJCXV0Yy0+d25fbHNmICAgICAgPSBhaWRfaHVpLT51dGNfd25mOworCQl1dGMtPmRuICAgICAgICAgID0gYWlkX2h1aS0+dXRjX2RuOworCQl1dGMtPmRlbHRhX3RfbHNmID0gYWlkX2h1aS0+dXRjX2xzZjsKKwl9CisKKwlpZiAoYWlkX2h1aS0+ZmxhZ3MgJiAweDA0KSB7IC8qIEtsb2J1Y2hhciBwYXJhbWV0ZXJzIHZhbGlkICovCisJCXN0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbCAqaW9ubyA9ICZncHMtPmlvbm9zcGhlcmU7CisKKwkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX0lPTk9TUEhFUkU7CisKKwkJaW9uby0+YWxwaGFfMCA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMCwgLTMwKTsKKwkJaW9uby0+YWxwaGFfMSA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMSwgLTI3KTsKKwkJaW9uby0+YWxwaGFfMiA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMiwgLTI0KTsKKwkJaW9uby0+YWxwaGFfMyA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMywgLTI0KTsKKwkJaW9uby0+YmV0YV8wID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2IwLCAxMSk7CisJCWlvbm8tPmJldGFfMSA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9iMSwgMTQpOworCQlpb25vLT5iZXRhXzIgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYjIsIDE2KTsKKwkJaW9uby0+YmV0YV8zID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2IzLCAxNik7CisJfQorfQorCitzdGF0aWMgdm9pZAorX3VieF9tc2dfcGFyc2VfYWlkX2FsbShzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCit7CisJc3RydWN0IHVieF9haWRfYWxtICphaWRfYWxtID0gcGw7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7CisKKwkvL3ByaW50ZigiWy5dIEFJRF9BTE0gJWQgLSAlZFxuIiwgYWlkX2FsbS0+c3ZfaWQsIGFpZF9hbG0tPmdwc193ZWVrKTsKKworCWlmIChhaWRfYWxtLT5ncHNfd2VlaykgeworCQlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfQUxNQU5BQzsKKwkJZ3BzLT5hbG1hbmFjLnduYSA9IGFpZF9hbG0tPmdwc193ZWVrICYgMHhmZjsKKwkJZ3BzX3VucGFja19zZjQ1X2FsbWFuYWMoYWlkX2FsbS0+YWxtX3dvcmRzLCAmZ3BzLT5hbG1hbmFjLnN2c1tncHMtPmFsbWFuYWMubl9zdisrXSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorX3VieF9tc2dfcGFyc2VfYWlkX2VwaChzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCit7CisJc3RydWN0IHVieF9haWRfZXBoICphaWRfZXBoID0gcGw7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7CisKKwkvL3ByaW50ZigiWy5dIEFJRF9FUEggJWQgLSAlc1xuIiwgYWlkX2VwaC0+c3ZfaWQsIGFpZF9lcGgtPnByZXNlbnQgPyAicHJlc2VudCIgOiAibm90IHByZXNlbnQiKTsKKworCWlmIChhaWRfZXBoLT5wcmVzZW50KSB7CisJCWludCBpID0gZ3BzLT5lcGhlbWVyaXMubl9zdisrOworCQlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfRVBIRU1FUklTOworCQlncHMtPmVwaGVtZXJpcy5zdnNbaV0uc3ZfaWQgPSBhaWRfZXBoLT5zdl9pZDsKKwkJZ3BzX3VucGFja19zZjEyMyhhaWRfZXBoLT5lcGhfd29yZHMsICZncHMtPmVwaGVtZXJpcy5zdnNbaV0pOworCX0KK30KKworCisvKiBEaXNwYXRjaCB0YWJsZSAqLworc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSB1YnhfcGFyc2VfZHRbXSA9IHsKKwlVQlhfRElTUEFUQ0goTkFWLCBQT1NMTEgsIF91YnhfbXNnX3BhcnNlX25hdl9wb3NsbGgpLAorCVVCWF9ESVNQQVRDSChBSUQsIElOSSwgX3VieF9tc2dfcGFyc2VfYWlkX2luaSksCisJVUJYX0RJU1BBVENIKEFJRCwgSFVJLCBfdWJ4X21zZ19wYXJzZV9haWRfaHVpKSwKKwlVQlhfRElTUEFUQ0goQUlELCBBTE0sIF91YnhfbXNnX3BhcnNlX2FpZF9hbG0pLAorCVVCWF9ESVNQQVRDSChBSUQsIEVQSCwgX3VieF9tc2dfcGFyc2VfYWlkX2VwaCksCit9OworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuaCBiL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTQ3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogdWJ4LXBhcnNlLmgKKyAqCisgKiBIZWFkZXIgZm9yIHBhcnNpbmcgY29kZSBjb252ZXJ0aW5nIFVCWCBtZXNzYWdlcyB0byBHUFMgYXNzaXN0IGRhdGEKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fVUJYX1BBUlNFX0hfXworI2RlZmluZSBfX1VCWF9QQVJTRV9IX18KKworCisjaW5jbHVkZSAiZ3BzLmgiCisjaW5jbHVkZSAidWJ4LmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIERpc3BhdGNoIHRhYmxlICovCitleHRlcm4gc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSB1YnhfcGFyc2VfZHRbXTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19VQlhfUEFSU0VfSF9fICovCisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3VieC5jIGIvcnJscC1lcGhlbWVyaXMvdWJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkZDFmMAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3VieC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiB1YnguYworICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIGdlbmVyaWMgVUJYIGhlbHBlcnMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInVieC5oIgorCisKK3N0YXRpYyB2b2lkCit1YnhfY2hlY2tzdW0odWludDhfdCAqZGF0YSwgaW50IGxlbiwgdWludDhfdCAqY2tzdW0pCit7CisJaW50IGk7CisJdWludDhfdCBjazAgPSAwLCBjazEgPSAwOworCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJCWNrMCArPSBkYXRhW2ldOworCQljazEgKz0gY2swOworCX0KKwlja3N1bVswXSA9IGNrMDsKKwlja3N1bVsxXSA9IGNrMTsKK30KKworCitzdGF0aWMgdWJ4X21zZ19oYW5kbGVyX3QKK3VieF9maW5kX2hhbmRsZXIoc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSAqZHQsIHVpbnQ4X3QgbXNnX2NsYXNzLCB1aW50OF90IG1zZ19pZCkKK3sKKwl3aGlsZSAoZHQtPmhhbmRsZXIpIHsKKwkJaWYgKChkdC0+bXNnX2NsYXNzID09IG1zZ19jbGFzcykgJiYgKGR0LT5tc2dfaWQgPT0gbXNnX2lkKSkKKwkJCXJldHVybiBkdC0+aGFuZGxlcjsKKwkJZHQrKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworaW50Cit1YnhfbXNnX2Rpc3BhdGNoKHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgKmR0LAorICAgICAgICAgICAgICAgICB2b2lkICptc2csIGludCBsZW4sIHZvaWQgKnVzZXJkYXRhKQoreworCXN0cnVjdCB1YnhfaGRyICpoZHIgPSBtc2c7CisJdWludDhfdCBja3N1bVsyXSwgKmNrc3VtX3B0cjsKKwl1YnhfbXNnX2hhbmRsZXJfdCBoOworCisJaWYgKChoZHItPnN5bmNbMF0gIT0gVUJYX1NZTkMwKSB8fCAoaGRyLT5zeW5jWzFdICE9IFVCWF9TWU5DMSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJbIV0gSW52YWxpZCBzeW5jIGJ5dGVzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXVieF9jaGVja3N1bShtc2cgKyAyLCBzaXplb2Yoc3RydWN0IHVieF9oZHIpICsgaGRyLT5wYXlsb2FkX2xlbiAtIDIsIGNrc3VtKTsKKwlja3N1bV9wdHIgPSBtc2cgKyAoc2l6ZW9mKHN0cnVjdCB1YnhfaGRyKSArIGhkci0+cGF5bG9hZF9sZW4pOworCWlmICgoY2tzdW1fcHRyWzBdICE9IGNrc3VtWzBdKSB8fCAoY2tzdW1fcHRyWzFdICE9IGNrc3VtWzFdKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlshXSBJbnZhbGlkIGNoZWNrc3VtXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWggPSB1YnhfZmluZF9oYW5kbGVyKGR0LCBoZHItPm1zZ19jbGFzcywgaGRyLT5tc2dfaWQpOworCWlmIChoKQorCQloKGhkciwgbXNnICsgc2l6ZW9mKHN0cnVjdCB1YnhfaGRyKSwgaGRyLT5wYXlsb2FkX2xlbiwgdXNlcmRhdGEpOworCisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgdWJ4X2hkcikgKyBoZHItPnBheWxvYWRfbGVuICsgMjsKK30KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvdWJ4LmggYi9ycmxwLWVwaGVtZXJpcy91YnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjY0Mzg2Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvdWJ4LmgKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiB1YnguaAorICoKKyAqIEhlYWRlciBmb3IgVUJYIHJlbGF0ZWQgc3R1ZmYKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fVUJYX0hfXworI2RlZmluZSBfX1VCWF9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIENvbnN0YW50cyB1c2VkIGluIFVCWCAqLworCisJLyogU3luYyBieXRlcyAodHdvIGZpcnN0IGJ5dGVzIG9mIGVhY2ggbWVzc2FnZSkgKi8KKyNkZWZpbmUgVUJYX1NZTkMwCQkweGI1CisjZGVmaW5lIFVCWF9TWU5DMQkJMHg2MgorCisJLyogVUJYIG1lc3NhZ2VzIGNsYXNzZXMgKi8KKyNkZWZpbmUgVUJYX0NMQVNTX05BVgkJMHgwMQorI2RlZmluZSBVQlhfQ0xBU1NfUlhNCQkweDAyCisjZGVmaW5lIFVCWF9DTEFTU19JTkYJCTB4MDQKKyNkZWZpbmUgVUJYX0NMQVNTX0FDSwkJMHgwNQorI2RlZmluZSBVQlhfQ0xBU1NfQ0ZHCQkweDA2CisjZGVmaW5lIFVCWF9DTEFTU19VUEQJCTB4MDkKKyNkZWZpbmUgVUJYX0NMQVNTX01PTgkJMHgwYQorI2RlZmluZSBVQlhfQ0xBU1NfQUlECQkweDBiCisjZGVmaW5lIFVCWF9DTEFTU19USU0JCTB4MGQKKworCS8qIFVCWCBtZXNzYWdlcyB0eXBlIElEIChieSBjbGFzcykgKi8KKyNkZWZpbmUgVUJYX05BVl9QT1NFQ0VGCQkweDAxCisjZGVmaW5lIFVCWF9OQVZfUE9TTExICQkweDAyCisjZGVmaW5lIFVCWF9OQVZfU1RBVFVTCQkweDAzCisjZGVmaW5lIFVCWF9OQVZfRE9QCQkweDA0CisjZGVmaW5lIFVCWF9OQVZfU09MCQkweDA2CisjZGVmaW5lIFVCWF9OQVZfUE9TVVRNCQkweDA4CisjZGVmaW5lIFVCWF9OQVZfVkVMRUNFRgkJMHgxMQorI2RlZmluZSBVQlhfTkFWX1ZFTE5FRAkJMHgxMgorI2RlZmluZSBVQlhfTkFWX1RJTUVHUFMJCTB4MjAKKyNkZWZpbmUgVUJYX05BVl9USU1FVVRDCQkweDIxCisjZGVmaW5lIFVCWF9OQVZfQ0xPQ0sJCTB4MjIKKyNkZWZpbmUgVUJYX05BVl9TVklORk8JCTB4MzAKKyNkZWZpbmUgVUJYX05BVl9ER1BTCQkweDMxCisjZGVmaW5lIFVCWF9OQVZfU0JBUwkJMHgzMgorI2RlZmluZSBVQlhfTkFWX0VLRlNUQVRVUwkweDQwCisKKyNkZWZpbmUgVUJYX1JYTV9SQVcJCTB4MTAKKyNkZWZpbmUgVUJYX1JYTV9TRlJCCQkweDExCisjZGVmaW5lIFVCWF9SWE1fU1ZTSQkJMHgyMAorI2RlZmluZSBVQlhfUlhNX1NWU0lfR1BTCTB4MjAKKyNkZWZpbmUgVUJYX1JYTV9BTE0JCTB4MzAKKyNkZWZpbmUgVUJYX1JYTV9FUEgJCTB4MzEKKyNkZWZpbmUgVUJYX1JYTV9QT1NSRVEJCTB4NDAKKworI2RlZmluZSBVQlhfSU5GX0VSUk9SCQkweDAwCisjZGVmaW5lIFVCWF9JTkZfV0FSTklORwkJMHgwMQorI2RlZmluZSBVQlhfSU5GX05PVElDRQkJMHgwMgorI2RlZmluZSBVQlhfSU5GX1RFU1QJCTB4MDMKKyNkZWZpbmUgVUJYX0lORl9ERUJVRwkJMHgwNAorI2RlZmluZSBVQlhfSU5GX1VTRVIJCTB4MDcKKworI2RlZmluZSBVQlhfQUNLX05BSwkJMHgwMAorI2RlZmluZSBVQlhfQUNLX0FDSwkJMHgwMQorCisjZGVmaW5lIFVCWF9DRkdfUFJUCQkweDAwCisjZGVmaW5lIFVCWF9DRkdfVVNCCQkweDFiCisjZGVmaW5lIFVCWF9DRkdfTVNHCQkweDAxCisjZGVmaW5lIFVCWF9DRkdfTk1FQQkJMHgxNworI2RlZmluZSBVQlhfQ0ZHX1JBVEUJCTB4MDgKKyNkZWZpbmUgVUJYX0NGR19DRkcJCTB4MDkKKyNkZWZpbmUgVUJYX0NGR19UUAkJMHgwNworI2RlZmluZSBVQlhfQ0ZHX05BVjIJCTB4MWEKKyNkZWZpbmUgVUJYX0NGR19EQVQJCTB4MDYKKyNkZWZpbmUgVUJYX0NGR19JTkYJCTB4MDIKKyNkZWZpbmUgVUJYX0NGR19SU1QJCTB4MDQKKyNkZWZpbmUgVUJYX0NGR19SWE0JCTB4MTEKKyNkZWZpbmUgVUJYX0NGR19BTlQJCTB4MTMKKyNkZWZpbmUgVUJYX0NGR19GWE4JCTB4MGUKKyNkZWZpbmUgVUJYX0NGR19TQkFTCQkweDE2CisjZGVmaW5lIFVCWF9DRkdfTElDCQkweDgwCisjZGVmaW5lIFVCWF9DRkdfVE0JCTB4MTAKKyNkZWZpbmUgVUJYX0NGR19UTTIJCTB4MTkKKyNkZWZpbmUgVUJYX0NGR19UTU9ERQkJMHgxZAorI2RlZmluZSBVQlhfQ0ZHX0VLRgkJMHgxMgorCisjZGVmaW5lIFVCWF9VUERfRE9XTkwJCTB4MDEKKyNkZWZpbmUgVUJYX1VQRF9VUExPQUQJCTB4MDIKKyNkZWZpbmUgVUJYX1VQRF9FWEVDCQkweDAzCisjZGVmaW5lIFVCWF9VUERfTUVNQ1BZCQkweDA0CisKKyNkZWZpbmUgVUJYX01PTl9TQ0hECQkweDAxCisjZGVmaW5lIFVCWF9NT05fSU8JCTB4MDIKKyNkZWZpbmUgVUJYX01PTl9JUEMJCTB4MDMKKyNkZWZpbmUgVUJYX01PTl9WRVIJCTB4MDQKKyNkZWZpbmUgVUJYX01PTl9FWENFUFQJCTB4MDUKKyNkZWZpbmUgVUJYX01PTl9NU0dQUAkJMHgwNgorI2RlZmluZSBVQlhfTU9OX1JYQlVGCQkweDA3CisjZGVmaW5lIFVCWF9NT05fVFhCVUYJCTB4MDgKKyNkZWZpbmUgVUJYX01PTl9IVwkJMHgwOQorI2RlZmluZSBVQlhfTU9OX1VTQgkJMHgwYQorCisjZGVmaW5lIFVCWF9BSURfUkVRCQkweDAwCisjZGVmaW5lIFVCWF9BSURfSU5JCQkweDAxCisjZGVmaW5lIFVCWF9BSURfSFVJCQkweDAyCisjZGVmaW5lIFVCWF9BSURfREFUQQkJMHgxMAorI2RlZmluZSBVQlhfQUlEX0FMTQkJMHgzMAorI2RlZmluZSBVQlhfQUlEX0VQSAkJMHgzMQorCisjZGVmaW5lIFVCWF9USU1fVFAJCTB4MDEKKyNkZWZpbmUgVUJYX1RJTV9UTQkJMHgwMgorI2RlZmluZSBVQlhfVElNX1RNMgkJMHgwMworI2RlZmluZSBVQlhfVElNX1NWSU4JCTB4MDQKKworCisvKiBIZWFkZXIgKi8KK3N0cnVjdCB1YnhfaGRyIHsKKyAgICAgICAgdWludDhfdCAgc3luY1syXTsKKyAgICAgICAgdWludDhfdCAgbXNnX2NsYXNzOworICAgICAgICB1aW50OF90ICBtc2dfaWQ7CisgICAgICAgIHVpbnQxNl90IHBheWxvYWRfbGVuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKiBQYXlsb2FkIGZvcm1hdHMgKHNvbWUgb2YgdGhlbSkgKi8KK3N0cnVjdCB1YnhfbmF2X3Bvc2xsaCB7CisJdWludDMyX3QgaXRvdzsKKwlpbnQzMl90ICBsb247CS8qIHNjYWxpbmcgMWUtNyAqLworCWludDMyX3QgIGxhdDsJLyogc2NhbGluZyAxZS03ICovCisJaW50MzJfdCAgaGVpZ2h0Oy8qIG1tICovCisJaW50MzJfdCAgaHNsOwkvKiBtbSAqLworCXVpbnQzMl90IGhhY2M7CS8qIG1tICovCisJdWludDMyX3QgdmFjYzsJLyogbW0gKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB1YnhfYWlkX2luaSB7CisJaW50MzJfdCAgeDsKKwlpbnQzMl90ICB5OworCWludDMyX3QgIHo7CisJdWludDMyX3QgcG9zYWNjOworCXVpbnQxNl90IHRtX2NmZzsKKwl1aW50MTZfdCB3bjsKKwl1aW50MzJfdCB0b3c7CisJaW50MzJfdCAgdG93X25zOworCXVpbnQzMl90IHRhY2NfbXM7CisJdWludDMyX3QgdGFjY19uczsKKwlpbnQzMl90ICBjbGtkOworCXVpbnQzMl90IGNsa2RhY2M7CisJdWludDMyX3QgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWJ4X2FpZF9odWkgeworCXVpbnQzMl90IGhlYWx0aDsKKwlkb3VibGUgICB1dGNfYTE7CisJZG91YmxlICAgdXRjX2EwOworCWludDMyX3QgIHV0Y190b3Q7CisJaW50MTZfdCAgdXRjX3dudDsKKwlpbnQxNl90ICB1dGNfbHM7CisJaW50MTZfdCAgdXRjX3duZjsKKwlpbnQxNl90ICB1dGNfZG47CisJaW50MTZfdCAgdXRjX2xzZjsKKwlpbnQxNl90ICB1dGNfc3BhcmU7CisJZmxvYXQgICAga2xvYl9hMDsKKwlmbG9hdCAgICBrbG9iX2ExOworCWZsb2F0ICAgIGtsb2JfYTI7CisJZmxvYXQgICAga2xvYl9hMzsKKwlmbG9hdCAgICBrbG9iX2IwOworCWZsb2F0ICAgIGtsb2JfYjE7CisJZmxvYXQgICAga2xvYl9iMjsKKwlmbG9hdCAgICBrbG9iX2IzOworCXVpbnQzMl90IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHVieF9haWRfYWxtIHsKKwl1aW50MzJfdCBzdl9pZDsKKwl1aW50MzJfdCBncHNfd2VlazsKKwl1aW50MzJfdCBhbG1fd29yZHNbOF07CS8qIFByZXNlbnQgb25seSBpZiAnZ3BzX3dlZWsnICE9IDAgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB1YnhfYWlkX2VwaCB7CisJdWludDMyX3Qgc3ZfaWQ7CisJdWludDMyX3QgcHJlc2VudDsKKwl1aW50MzJfdCBlcGhfd29yZHNbMjRdOwkvKiBQcmVzZW50IG9ubHkgaWYgJ3ByZXNlbnQnICE9IDAgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyogTWVzc2FnZSBoYW5kbGVyICovCit0eXBlZGVmIHZvaWQgKCp1YnhfbXNnX2hhbmRsZXJfdCkoCisJc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGF5bG9hZCwgaW50IHBheWxvYWRfbGVuLCB2b2lkICp1c2VyZGF0YSk7CisKK3N0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgeworCXVpbnQ4X3QgbXNnX2NsYXNzOworCXVpbnQ4X3QgbXNnX2lkOworCXVieF9tc2dfaGFuZGxlcl90IGhhbmRsZXI7Cit9OworCisjZGVmaW5lIFVCWF9ESVNQQVRDSChrbHMsaWQsaGRsKSB7CQlcCisJLm1zZ19jbGFzcyA9IFVCWF9DTEFTU18gIyMga2xzICwJXAorCS5tc2dfaWQgPSBVQlhfICMjIGtscyAjIyBfICMjIGlkLAlcCisJLmhhbmRsZXIgPSAoaGRsKSwJCQlcCit9CisKKworLyogTWV0aG9kcyAqLworaW50IHVieF9tc2dfZGlzcGF0Y2goc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSAqZHQsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIGludCBsZW4sIHZvaWQgKnVzZXJkYXRhKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19VQlhfSF9fICovCisKZGlmZiAtLWdpdCBhL3dpcmVzaGFyay9hYmlzX29tbC5wYXRjaCBiL3dpcmVzaGFyay9hYmlzX29tbC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDEzMjExCi0tLSAvZGV2L251bGwKKysrIGIvd2lyZXNoYXJrL2FiaXNfb21sLnBhdGNoCkBAIC0wLDAgKzEsMjIwOSBAQAorRnJvbSA1ODU3NTE4YmU4NzY0MWZkYWI0NWU1OTNiYzlmZDVlZjU1OTVlNjE5IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorRGF0ZTogTW9uLCAxOSBBcHIgMjAxMCAxMzoyMzo1MSArMDgwMAorU3ViamVjdDogW1BBVENIIDEvMl0gQWRkIHRoZSBBYmlzIE9NTCBwYXRjaC4KKworLS0tCisgZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbiAgICAgICB8ICAgIDEgKworIGVwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMgfCAxMzgyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworIGVwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmggfCAgNzg3ICsrKysrKysrKysrKysrKysrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDIxNzAgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuYworIGNyZWF0ZSBtb2RlIDEwMDY0NCBlcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oCisKK2RpZmYgLS1naXQgYS9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uIGIvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgoraW5kZXggZGJjMzcyNi4uOThkY2RjMyAxMDA2NDQKKy0tLSBhL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KKysrKyBiL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KK0BAIC00ODEsNiArNDgxLDcgQEAgRElTU0VDVE9SX1NSQyA9IFwKKyAJcGFja2V0LWdzbV9hX2dtLmMJCVwKKyAJcGFja2V0LWdzbV9hX3JwLmMJCVwKKyAJcGFja2V0LWdzbV9hX3JyLmMJXAorKwlwYWNrZXQtZ3NtX2FiaXNfb21sLmMJXAorIAlwYWNrZXQtZ3NtX2lwYS5jCVwKKyAJcGFja2V0LWdzbV9ic3NsYXAuYwkJXAorIAlwYWNrZXQtZ3NtX2Jzc21hcF9sZS5jCVwKK2RpZmYgLS1naXQgYS9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5jIGIvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuYworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmZhNDZhYjUKKy0tLSAvZGV2L251bGwKKysrKyBiL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMKK0BAIC0wLDAgKzEsMTM4MiBAQAorKy8qIHBhY2tldC1hYmlzX29tbC5jCisrICogUm91dGluZXMgZm9yIHBhY2tldCBkaXNzZWN0aW9uIG9mIEdTTSBBLWJpcyBvdmVyIElQICgzR1BQIFRTIDEyLjIxKQorKyAqIENvcHlyaWdodCAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisrICogQ29weXJpZ2h0IDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorKyAqIGJhc2VkIG9uIEEtYmlzIE9NTCBjb2RlIGluIE9wZW5CU0MKKysgKgorKyAqICRJZCQKKysgKgorKyAqIFdpcmVzaGFyayAtIE5ldHdvcmsgdHJhZmZpYyBhbmFseXplcgorKyAqIEJ5IEdlcmFsZCBDb21icyA8Z2VyYWxkQHdpcmVzaGFyay5vcmc+CisrICogQ29weXJpZ2h0IDE5OTggR2VyYWxkIENvbWJzCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisrICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKysgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisrICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisrICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysgKgorKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisrICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKyAqLworKworKyNpZmRlZiBIQVZFX0NPTkZJR19ICisrIyBpbmNsdWRlICJjb25maWcuaCIKKysjZW5kaWYKKysKKysjaW5jbHVkZSA8Z2xpYi5oPgorKworKyNpbmNsdWRlIDxlcGFuL3BhY2tldC5oPgorKyNpbmNsdWRlIDxlcGFuL2VtZW0uaD4KKysjaW5jbHVkZSA8ZXBhbi9sYXBkX3NhcGkuaD4KKysjaW5jbHVkZSA8ZXBhbi9wcmVmcy5oPgorKworKyNpbmNsdWRlICJwYWNrZXQtZ3NtX2FiaXNfb21sLmgiCisrI2luY2x1ZGUgInBhY2tldC1nc21fYV9jb21tb24uaCIKKysKKysvKiBpbml0aWFsaXplIHRoZSBwcm90b2NvbCBhbmQgcmVnaXN0ZXJlZCBmaWVsZHMgKi8KKytzdGF0aWMgaW50IHByb3RvX2FiaXNfb21sID0gLTE7CisrCisrLyogT01MIGhlYWRlciAqLworK3N0YXRpYyBpbnQgaGZfb21sX21zZ19kaXNjID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfcGxhY2VtZW50ID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfc2VxdWVuY2UgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9sZW5ndGggPSAtMTsKKysvKiBGT00gaGVhZGVyICovCisrc3RhdGljIGludCBoZl9vbWxfZm9tX21zZ3R5cGUgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fb2JqY2xhc3MgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21faW5zdF9idHMgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21faW5zdF90cnggPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21faW5zdF90cyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9hdHRyX3RhZyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9hdHRyX2xlbiA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9hdHRyX3ZhbCA9IC0xOworKy8qIEZPTSBhdHRyaWJ1dGVzICovCisrc3RhdGljIGludCBoZl9hdHRyX2FkbV9zdGF0ZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9hcmZjbiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9vcGVyX3N0YXRlID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2F2YWlsX3N0YXRlID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2V2ZW50X3R5cGUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfc2V2ZXJpdHkgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYmNjaF9hcmZjbiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9ic2ljID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX3Rlc3Rfbm8gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfdHNjID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX3RlaSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9hY2hfYnRzcCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9hY2hfdHNsb3QgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYWNoX3NzbG90ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2dzbV90aW1lID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2NoYW5fY29tYiA9IC0xOworKy8qIElwYWNjZXNzICovCisrc3RhdGljIGludCBoZl9vbWxfaXBhX3RyZXNfYXR0cl90YWcgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9pcGFfdHJlc19hdHRyX2xlbiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdGVzdF9yZXMgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3J4bGV2ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9iX3J4bGV2ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9hcmZjbiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZl9xdWFsID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9mX2VyciA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfcnhxdWFsID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9mcmFtZV9vZmZzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9mcmFtZW5yX29mZnMgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2JzaWMgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2NlbGxfaWQgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3NpMiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfc2kyYmlzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9zaTJ0ZXIgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2NoYW5fZGVzYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcnNsX2lwID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9yc2xfcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcHJpbV9vbWxfaXAgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3ByaW1fb21sX3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX2xvY2F0aW9uX25hbWUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3VuaXRfaWQgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3VuaXRfbmFtZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnZfZmxhZ3MgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX252X21hc2sgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX25zbF9zcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnNsX2RhZGRyID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc2xfZHBvcnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX25zZWkgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX25zdmNpID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9idmNpID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9yYWMgPSAtMTsKKysKKysvKiBpbml0aWFsaXplIHRoZSBzdWJ0cmVlIHBvaW50ZXJzICovCisrc3RhdGljIGludCBldHRfb21sID0gLTE7Cisrc3RhdGljIGludCBldHRfb21sX2ZvbSA9IC0xOworK3N0YXRpYyBpbnQgZXR0X29tbF9mb21fYXR0ID0gLTE7CisrCisrLyogRGVjb2RlIHRoaW5ncyBhcyBuYW5vQlRTIHRyYWNlcyAqLworK3N0YXRpYyBnYm9vbGVhbiBnbG9iYWxfb21sX3VzZV9uYW5vX2J0cyA9IEZBTFNFOworKworK3N0YXRpYyBwcm90b190cmVlICp0b3BfdHJlZTsKKysKKysvKiBUUyAxMi4yMSBDaGFwdGVyIDguMSAvIFRTIDA4LjU5ICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfbXNnX2Rpc2NfdmFsc1tdID0geworKwl7IEFCSVNfT01fTURJU0NfRk9NLAkiRm9ybWF0dGVkIE8mTSIgfSwKKysJeyBBQklTX09NX01ESVNDX01NSSwJIk1NSSBUcmFuc2ZlciIgfSwKKysJeyBBQklTX09NX01ESVNDX1RSQVUsCSJUUkFVIE8mTSIgfSwKKysJeyBBQklTX09NX01ESVNDX01BTlVGLAkiTWFudWZhY3R1cmVyIHNwZWNpZmljIiB9LAorK307CisrCisrLyogVFMgMTIuMjEgQ2hhcHRlciA4LjEuMSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX3BsYWNlbWVudF92YWxzW10gPSB7CisrCXsgQUJJU19PTV9QTEFDRU1FTlRfT05MWSwJIk9ubHkiIH0sCisrCXsgQUJJU19PTV9QTEFDRU1FTlRfRklSU1QsCSJGaXJzdCIgfSwKKysJeyBBQklTX09NX1BMQUNFTUVOVF9NSURETEUsCSJNaWRkbGUiIH0sCisrCXsgQUJJU19PTV9QTEFDRU1FTlRfTEFTVCwJIkxhc3QiIH0sCisrfTsKKysKKysvKiBUUyAxMi4yMSBDaGFwdGVyIDkuMiAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2ZvbV9tc2d0eXBlX3ZhbHNbXSA9IHsKKysJeyBOTV9NVF9MT0FEX0lOSVQsCQkiU29mdHdhcmUgTG9hZCBJbml0IiB9LAorKwl7IE5NX01UX0xPQURfSU5JVF9BQ0ssCQkiU29mdHdhcmUgTG9hZCBJbml0IEFDSyIgfSwKKysJeyBOTV9NVF9MT0FEX0lOSVRfTkFDSywJCSJTb2Z0d2FyZSBMb2FkIEluaXQgTkFDSyIgfSwKKysJeyBOTV9NVF9MT0FEX1NFRywJCSJTb2Z0d2FyZSBMb2FkIFNlZ21lbnQiIH0sCisrCXsgTk1fTVRfTE9BRF9TRUdfQUNLLAkJIlNvZnR3YXJlIExvYWQgU2VnbWVudCBBQ0siIH0sCisrCXsgTk1fTVRfTE9BRF9FTkQsCQkiU29mdHdhcmUgTG9hZCBFbmQiIH0sCisrCXsgTk1fTVRfTE9BRF9FTkRfQUNLLAkJIlNvZnR3YXJlIExvYWQgRW5kIEFDSyIgfSwKKysJeyBOTV9NVF9MT0FEX0VORF9OQUNLLAkJIlNvZnR3YXJlIExvYWQgRW5kIE5BQ0siIH0sCisrCXsgTk1fTVRfU1dfQUNUX1JFUSwJCSJTb2Z0d2FyZSBBY3RpdmF0ZSBSZXF1ZXN0IiB9LAorKwl7IE5NX01UX1NXX0FDVF9SRVFfQUNLLAkJIlNvZnR3YXJlIEFjdGl2YXRlIFJlcXVlc3QgQUNLIiB9LAorKwl7IE5NX01UX1NXX0FDVF9SRVFfTkFDSywJIlNvZnR3YXJlIEFjdGl2YXRlIFJlcXVlc3QgTkFDSyIgfSwKKysJeyBOTV9NVF9BQ1RJVkFURV9TVywJCSJBY3RpdmF0ZSBTb2Z0d2FyZSIgfSwKKysJeyBOTV9NVF9BQ1RJVkFURV9TV19BQ0ssCSJBY3RpdmF0ZSBTb2Z0d2FyZSBBQ0siIH0sCisrCXsgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywJIkFjdGl2YXRlIFNvZnR3YXJlIE5BQ0siIH0sCisrCXsgTk1fTVRfU1dfQUNUSVZBVEVEX1JFUCwJIlNvZnR3YXJlIEFjdGl2YXRlZCBSZXBvcnQiIH0sCisrCXsgTk1fTVRfRVNUQUJMSVNIX1RFSSwJCSJFc3RhYmxpc2ggVEVJIiB9LAorKwl7IE5NX01UX0VTVEFCTElTSF9URUlfQUNLLAkiRXN0YWJsaXNoIFRFSSBBQ0siIH0sCisrCXsgTk1fTVRfRVNUQUJMSVNIX1RFSV9OQUNLLAkiRXN0YWJsaXNoIFRFSSBOQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9TSUdOLAkJIkNvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfU0lHTl9BQ0ssCSJDb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmcgQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9TSUdOX05BQ0ssCSJDb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmcgTkFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfU0lHTiwJCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmciIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1NJR05fQUNLLAkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIEFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfU0lHTl9OQUNLLAkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIE5BQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1RSQUYsCQkiQ29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9UUkFGX0FDSywJIkNvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyBBQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1RSQUZfTkFDSywJIkNvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyBOQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9UUkFGLAkJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfVFJBRl9BQ0ssCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMgQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9UUkFGX05BQ0ssCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMgTkFDSyIgfSwKKysJeyBOTV9NVF9DT05OX01EUk9QX0xJTkssCSJDb25uZWN0IE11bHRpLURyb3AgTGluayIgfSwKKysJeyBOTV9NVF9DT05OX01EUk9QX0xJTktfQUNLLAkiQ29ubmVjdCBNdWx0aS1Ecm9wIExpbmsgQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fTURST1BfTElOS19OQUNLLAkiQ29ubmVjdCBNdWx0aS1Ecm9wIExpbmsgTkFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX01EUk9QX0xJTkssCSJEaXNjb25uZWN0IE11bHRpLURyb3AgTGluayIgfSwKKysJeyBOTV9NVF9ESVNDX01EUk9QX0xJTktfQUNLLAkiRGlzY29ubmVjdCBNdWx0aS1Ecm9wIExpbmsgQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfTURST1BfTElOS19OQUNLLAkiRGlzY29ubmVjdCBNdWx0aS1Ecm9wIExpbmsgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQlRTX0FUVFIsCQkiU2V0IEJUUyBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX1NFVF9CVFNfQVRUUl9BQ0ssCSJTZXQgQlRTIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX1NFVF9CVFNfQVRUUl9OQUNLLAkiU2V0IEJUUyBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX1JBRElPX0FUVFIsCQkiU2V0IFJhZGlvIENhcnJpZXIgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9TRVRfUkFESU9fQVRUUl9BQ0ssCSJTZXQgUmFkaW8gQ2FycmllciBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfUkFESU9fQVRUUl9OQUNLLAkiU2V0IFJhZGlvIENhcnJpZXIgQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9DSEFOX0FUVFIsCQkiU2V0IENoYW5uZWwgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9TRVRfQ0hBTl9BVFRSX0FDSywJIlNldCBDaGFubmVsIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX1NFVF9DSEFOX0FUVFJfTkFDSywJIlNldCBDaGFubmVsIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9QRVJGX1RFU1QsCQkiUGVyZm9ybSBUZXN0IiB9LAorKwl7IE5NX01UX1BFUkZfVEVTVF9BQ0ssCQkiUGVyZm9ybSBUZXN0IEFDSyIgfSwKKysJeyBOTV9NVF9QRVJGX1RFU1RfTkFDSywJCSJQZXJmb3JtIFRlc3QgTkFDSyIgfSwKKysJeyBOTV9NVF9URVNUX1JFUCwJCSJUZXN0IFJlcG9ydCIgfSwKKysJeyBOTV9NVF9TRU5EX1RFU1RfUkVQLAkJIlNlbmQgVGVzdCBSZXBvcnQiIH0sCisrCXsgTk1fTVRfU0VORF9URVNUX1JFUF9BQ0ssCSJTZW5kIFRlc3QgUmVwb3J0IEFDSyIgfSwKKysJeyBOTV9NVF9TRU5EX1RFU1RfUkVQX05BQ0ssCSJTZW5kIFRlc3QgUmVwb3J0IE5BQ0siIH0sCisrCXsgTk1fTVRfU1RPUF9URVNULAkJIlN0b3AgVGVzdCIgfSwKKysJeyBOTV9NVF9TVE9QX1RFU1RfQUNLLAkJIlN0b3AgVGVzdCBBQ0siIH0sCisrCXsgTk1fTVRfU1RPUF9URVNUX05BQ0ssCQkiU3RvcCBUZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfU1RBVEVDSEdfRVZFTlRfUkVQLAkiU3RhdGUgQ2hhbmdlZCBFdmVudCBSZXBvcnQiIH0sCisrCXsgTk1fTVRfRkFJTFVSRV9FVkVOVF9SRVAsCSJGYWlsdXJlIEV2ZW50IFJlcG9ydCIgfSwKKysJeyBOTV9NVF9TVE9QX0VWRU5UX1JFUCwJCSJTdG9wIFNlbmRpbmcgRXZlbnQgUmVwb3J0cyIgfSwKKysJeyBOTV9NVF9TVE9QX0VWRU5UX1JFUF9BQ0ssCSJTdG9wIFNlbmRpbmcgRXZlbnQgUmVwb3J0cyBBQ0siIH0sCisrCXsgTk1fTVRfU1RPUF9FVkVOVF9SRVBfTkFDSywJIlN0b3AgU2VuZGluZyBFdmVudCBSZXBvcnRzIE5BQ0siIH0sCisrCXsgTk1fTVRfUkVTVF9FVkVOVF9SRVAsCQkiUmVzdGFydCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMiIH0sCisrCXsgTk1fTVRfUkVTVF9FVkVOVF9SRVBfQUNLLAkiUmVzdGFydCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMgQUNLIiB9LAorKwl7IE5NX01UX1JFU1RfRVZFTlRfUkVQX05BQ0ssCSJSZXN0YXJ0IFNlbmRpbmcgRXZlbnQgUmVwb3J0cyBOQUNLIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEUsCQkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfQUNLLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIEFDSyIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFX05BQ0ssCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgTkFDSyIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFX1JFUSwJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBSZXF1ZXN0IiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfUkVRX0FDSywJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBSZXF1ZXN0IEFDSyIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIFJlcXVlc3QgTkFDSyIgfSwKKysJeyBOTV9NVF9SRVBfT1VUU1RfQUxBUk1TLAkiUmVwb3J0IE91dHN0YW5kaW5nIEFsYXJtcyIgfSwKKysJeyBOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX0FDSywJIlJlcG9ydCBPdXRzdGFuZGluZyBBbGFybXMgQUNLIiB9LAorKwl7IE5NX01UX1JFUF9PVVRTVF9BTEFSTVNfTkFDSywJIlJlcG9ydCBPdXRzdGFuZGluZyBBbGFybXMgTkFDSyIgfSwKKysJeyBOTV9NVF9DSEFOR0VPVkVSLAkJIkNoYW5nZW92ZXIiIH0sCisrCXsgTk1fTVRfQ0hBTkdFT1ZFUl9BQ0ssCQkiQ2hhbmdlb3ZlciBBQ0siIH0sCisrCXsgTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLLAkiQ2hhbmdlb3ZlciBOQUNLIiB9LAorKwl7IE5NX01UX09QU1RBUlQsCQkiT3BzdGFydCIgfSwKKysJeyBOTV9NVF9PUFNUQVJUX0FDSywJCSJPcHN0YXJ0IEFDSyIgfSwKKysJeyBOTV9NVF9PUFNUQVJUX05BQ0ssCQkiT3BzdGFydCBOQUNLIiB9LAorKwl7IE5NX01UX1JFSU5JVCwJCQkiUmVpbml0aWFsaXplIiB9LAorKwl7IE5NX01UX1JFSU5JVF9BQ0ssCQkiUmVpbml0aWFsaXplIEFDSyIgfSwKKysJeyBOTV9NVF9SRUlOSVRfTkFDSywJCSJSZWluaXRpYWxpemUgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfU0lURV9PVVQsCQkiU2V0IFNpdGUgT3V0cHV0cyIgfSwKKysJeyBOTV9NVF9TRVRfU0lURV9PVVRfQUNLLAkiU2V0IFNpdGUgT3V0cHV0cyBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX1NJVEVfT1VUX05BQ0ssCSJTZXQgU2l0ZSBPdXRwdXRzIE5BQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0hXX0NPTkYsCQkiQ2hhbmdlIEhXIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fTVRfQ0hHX0hXX0NPTkZfQUNLLAkiQ2hhbmdlIEhXIENvbmZpZ3VyYXRpb24gQUNLIiB9LAorKwl7IE5NX01UX0NIR19IV19DT05GX05BQ0ssCSJDaGFuZ2UgSFcgQ29uZmlndXJhdGlvbiBOQUNLIiB9LAorKwl7IE5NX01UX01FQVNfUkVTX1JFUSwJCSJNZWFzdXJlbWVudCBSZXN1bHQgUmVxdWVzdCIgfSwKKysJeyBOTV9NVF9NRUFTX1JFU19SRVNQLAkJIk1lYXN1cmVtZW50IFJlc3VsdCBSZXNwb25zZSIgfSwKKysJeyBOTV9NVF9TVE9QX01FQVMsCQkiU3RvcCBNZWFzdXJlbWVudCIgfSwKKysJeyBOTV9NVF9TVEFSVF9NRUFTLAkJIlN0YXJ0IE1lYXN1cmVtZW50IiB9LAorKwl7IE5NX01UX0dFVF9BVFRSLAkJIkdldCBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX0dFVF9BVFRSX1JFU1AsCQkiR2V0IEF0dHJpYnV0ZXMgUmVzcG9uc2UiIH0sCisrCXsgTk1fTVRfR0VUX0FUVFJfTkFDSywJCSJHZXQgQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9BTEFSTV9USFJFUywJIlNldCBBbGFybSBUaHJlc2hvbGQiIH0sCisrCXsgTk1fTVRfU0VUX0FMQVJNX1RIUkVTX0FDSywJIlNldCBBbGFybSBUaHJlc2hvbGQgQUNLIiB9LAorKwl7IE5NX01UX1NFVF9BTEFSTV9USFJFU19OQUNLLAkiU2V0IEFsYXJtIFRocmVzaG9sZCBOQUNLIiB9LAorKwkvKiBwcm9wcmlldGFyeSwgbm90IGluIHRoZSBzdGFuZGFyZCAqLworKwl7IE5NX01UX0lQQUNDX1JFU1RBUlQsCQkiSVBBIFJlc3RhcnQiIH0sCisrCXsgTk1fTVRfSVBBQ0NfUkVTVEFSVF9BQ0ssCSJJUEEgUmVzdGFydCBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1QsCSJJUEEgUlNMIENvbm5lY3QiIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfQUNLLAkiSVBBIFJTTCBDb25uZWN0IEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLLAkiSVBBIFJTTCBDb25uZWN0IE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1QsCSJJUEEgUlNMIERpc2Nvbm5lY3QiIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfQUNLLCAiSVBBIFJTTCBEaXNjb25uZWN0IEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVF9OQUNLLCAiSVBBIFJTTCBEaXNjb25uZWN0IE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfQ09OTl9UUkFGLAkiSVBBIENvbm5lY3QgVHJhZmZpYyIgfSwKKysJeyBOTV9NVF9JUEFDQ19DT05OX1RSQUZfQUNLLAkiSVBBIENvbm5lY3QgVHJhZmZpYyBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX05BQ0ssCSJJUEEgQ29ubmVjdCBUcmFmZmljIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfRElTQ19UUkFGLAkiSVBBIERpc2Nvbm5lY3QgVHJhZmZpYyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ESVNDX1RSQUZfQUNLLAkiSVBBIERpc2Nvbm5lY3QgVHJhZmZpYyBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfRElTQ19UUkFGX05BQ0ssCSJJUEEgRGlzY29ubmVjdCBUcmFmZmljIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1csCSJJUEEgRGVmYXVsdCBCb290IFNvZnR3YXJlIiB9LAorKwl7IE5NX01UX0lQQUNDX0RFRl9CT09UX1NXX0FDSywJIklQQSBEZWZhdWx0IEJvb3QgU29mdHdhcmUgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0RFRl9CT09UX1NXX05BQ0ssCSJJUEEgRGVmYXVsdCBCb290IFNvZnR3YXJlIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUiwJIklQQSBTZXQgTlZSQU0gQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX0FDSywJIklQQSBTZXQgTlZSQU0gQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9OQUNLLAkiSVBBIFNldCBOVlJBTSBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUiwJIklQQSBHZXQgTlZSQU0gQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX0FDSywJIklQQSBHZXQgTlZSQU0gQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9OQUNLLAkiSVBBIEdldCBOVlJBTSBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX0FUVFIsCQkiSVBBIFNldCBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSywJIklQQSBTZXQgQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX0FUVFJfTkFDSywJIklQQSBTZXQgQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0FUVFJfQ0hHX0VWVCwJIklQQSBBdHRyaWJ1dGUgQ2hhbmdlIEV2ZW50IiB9LAorKwl7IE5NX01UX0lQQUNDX1NXX0RFQUNULAkJIklQQSBTb2Z0d2FyZSBEZWFjdGl2YXRlIiB9LAorKwl7IE5NX01UX0lQQUNDX1NXX0RFQUNUX0FDSywJIklQQSBTb2Z0d2FyZSBEZWFjdGl2YXRlIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TV19ERUFDVF9OQUNLLAkiSVBBIFNvZnR3YXJlIERlYWN0aXZhdGUgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19NRUFTX1JFU19SRVFfTkFDSywiSVBBIE1lYXN1cmVtZW50IFJlc3VsdCBSZXF1ZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1RBUlRfTUVBU19OQUNLLAkiSVBBIFN0YXJ0IE1lYXN1cmVtZW50IE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1RPUF9NRUFTX05BQ0ssCSJJUEEgU3RvcCBNZWFzdXJlbWVudCBOQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfUkVTRVRfUkVTT1VSQ0UsCSJTSUUgUmVzZXQgUmVzb3VyY2UiIH0sCisrCXsgTk1fTVRfQlMxMV9CRUdJTl9EQl9UWCwJIlNJRSBCZWdpbiBEYXRhYmFzZSBUcmFuc21pc3Npb24iIH0sCisrCXsgTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9BQ0ssCSJTSUUgQmVnaW4gRGF0YWJhc2UgVHJhbnNtaXNzaW9uIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCSJTSUUgQmVnaW4gRGF0YWJhc2UgVHJhbnNtaXNzaW9uIE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9FTkRfREJfVFgsCQkiU0lFIEVuZCBEYXRhYmFzZSBUcmFuc21pc3Npb24iIH0sCisrCXsgTk1fTVRfQlMxMV9FTkRfREJfVFhfQUNLLAkiU0lFIEVuZCBEYXRhYmFzZSBUcmFuc21pc3Npb24gQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfRU5EX0RCX1RYX05BQ0ssCSJTSUUgRW5kIERhdGFiYXNlIFRyYW5zbWlzc2lvbiBOQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfQ1JFQVRFX09CSiwJIlNJRSBDcmVhdGUgT2JqZWN0IiB9LAorKwl7IE5NX01UX0JTMTFfQ1JFQVRFX09CSl9BQ0ssCSJTSUUgQ3JlYXRlIE9iamVjdCBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9DUkVBVEVfT0JKX05BQ0ssCSJTSUUgQ3JlYXRlIE9iamVjdCBOQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfREVMRVRFX09CSiwJIlNJRSBEZWxldGUgT2JqZWN0IiB9LAorKwl7IE5NX01UX0JTMTFfREVMRVRFX09CSl9BQ0ssCSJTSUUgRGVsZXRlIE9iamVjdCBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCSJTSUUgRGVsZXRlIE9iamVjdCBOQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfR0VUX1NUQVRFLAkJIlNJRSBHZXQgU3RhdGUiIH0sCisrCXsgTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLLAkiU0lFIEdldCBTdGF0ZSBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9MTVRfTE9HT04sCQkiU0lFIExNVCBMb2dvbiIgfSwKKysJeyBOTV9NVF9CUzExX0xNVF9MT0dPTl9BQ0ssCSJTSUUgTE1UIExvZ29uIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX1JFU1RBUlQsCQkiU0lFIFJlc3RhcnQiIH0sCisrCXsgTk1fTVRfQlMxMV9SRVNUQVJUX0FDSywJIlNJRSBSZXN0YXJ0IEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0RJU0NPTk5FQ1QsCSJTSUUgRGlzY29ubmVjdCBCVFMiIH0sCisrCXsgTk1fTVRfQlMxMV9ESVNDT05ORUNUX0FDSywJIlNJRSBEaXNjb25uZWN0IEJUUyBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9MTVRfTE9HT0ZGLAkiU0lFIExNVCBMb2dvZmYiIH0sCisrCXsgTk1fTVRfQlMxMV9MTVRfTE9HT0ZGX0FDSywJIlNJRSBMTVQgTG9nb2ZmIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX1JFQ09OTkVDVCwJCSJTSUUgUmVjb25uZWN0IEJUUyIgfSwKKysJeyBOTV9NVF9CUzExX1JFQ09OTkVDVF9BQ0ssCSJTSUUgUmVjb25uZWN0IEJUUyBBQ0siIH0sCisrfTsKKysKKysvKiBUUyAxMi4yMSBTZWN0aW9uIDkuMjogT2JqZWN0IENsYXNzICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfZm9tX29iamNsYXNzX3ZhbHNbXSA9IHsKKysJeyBOTV9PQ19TSVRFX01BTkFHRVIsCQkiQlRTIFNpdGUgTWFuYWdlciIgfSwKKysJeyBOTV9PQ19CVFMsCQkJIkJUUyIgfSwKKysJeyBOTV9PQ19SQURJT19DQVJSSUVSLAkJIlJhZGlvIENhcnJpZXIiIH0sCisrCXsgTk1fT0NfQ0hBTk5FTCwJCSJSYWRpbyBDaGFubmVsIiB9LAorKwl7IE5NX09DX0JBU0VCX1RSQU5TQywJCSJCYXNlYmFuZCBUcmFuc2NlaXZlciIgfSwKKysJLyogcHJvcHJpZXRhcnksIHZlbmRvciBzcGVjaWZpYyAqLworKwl7IE5NX09DX0JTMTFfQURKQywJCSJTSUUgQWRqYWNlbmQgQ2hhbm5lbCIgfSwKKysJeyBOTV9PQ19CUzExX0hBTkRPVkVSLAkJIlNJRSBIYW5kb3ZlciIgfSwKKysJeyBOTV9PQ19CUzExX1BXUl9DVFJMLAkJIlNJRSBQb3dlciBDb250cm9sIiB9LAorKwl7IE5NX09DX0JTMTFfQlRTRSwJCSJTSUUgQlRTRSIgfSwKKysJeyBOTV9PQ19CUzExX1JBQ0ssCQkiU0lFIFJhY2siIH0sCisrCXsgTk1fT0NfQlMxMSwJCQkiU0lFIFNpZW1lbnNIVyIgfSwKKysJeyBOTV9PQ19CUzExX1RFU1QsCQkiU0lFIFRlc3QiIH0sCisrCXsgTk1fT0NfQlMxMV9FTlZBQlRTRSwJCSJTSUUgRW52YUJUU0UiIH0sCisrCXsgTk1fT0NfQlMxMV9CUE9SVCwJCSJTSUUgQlBvcnQiIH0sCisrCXsgTk1fT0NfR1BSU19OU0UsCQkiR1BSUyBOU0UiIH0sCisrCXsgTk1fT0NfR1BSU19DRUxMLAkJIkdQUlMgQ2VsbCIgfSwKKysJeyBOTV9PQ19HUFJTX05TVkMwLAkJIkdQUlMgTlNWQzAiIH0sCisrCXsgTk1fT0NfR1BSU19OU1ZDMSwJCSJHUFJTIE5TVkMxIiB9LAorKwl7IE5NX09DX05VTEwsCQkJIk5VTEwiIH0sCisrfTsKKysKKysvKiBUUyAxMi4yMSBTZWN0aW9uIDkuNDogQXR0cmlidXRlcyAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2ZvbV9hdHRyX3ZhbHNbXSA9IHsKKysJeyBOTV9BVFRfQUJJU19DSEFOTkVMLAkJIkEtYmlzIENoYW5uZWwiIH0sCisrCXsgTk1fQVRUX0FERF9JTkZPLAkJIkFkZGl0aW9uYWwgSW5mb3JtYXRpb24iIH0sCisrCXsgTk1fQVRUX0FERF9URVhULAkJIkFkZGl0aW9uYWwgVGV4dCIgfSwKKysJeyBOTV9BVFRfQURNX1NUQVRFLAkJIkFkbWluaXN0cmF0aXZlIFN0YXRlIiB9LAorKwl7IE5NX0FUVF9BUkZDTl9MSVNULAkJIkFSRkNOIExpc3QiIH0sCisrCXsgTk1fQVRUX0FVVE9OX1JFUE9SVCwJCSJBdXRvbm9tb3VzbHkgUmVwb3J0IiB9LAorKwl7IE5NX0FUVF9BVkFJTF9TVEFUVVMsCQkiQXZhaWxhYmlsaXR5IFN0YXR1cyIgfSwKKysJeyBOTV9BVFRfQkNDSF9BUkZDTiwJCSJCQ0NIIEFSRkNOIiB9LAorKwl7IE5NX0FUVF9CU0lDLAkJCSJCU0lDIiB9LAorKwl7IE5NX0FUVF9CVFNfQUlSX1RJTUVSLAkJIkJUUyBBaXIgVGltZXIiIH0sCisrCXsgTk1fQVRUX0NDQ0hfTF9JX1AsCQkiQ0NDSCBMb2FkIEluZGljYXRpb24gUGVyaW9kIiB9LAorKwl7IE5NX0FUVF9DQ0NIX0xfVCwJCSJDQ0NIIExvYWQgVGhyZXNob2xkIiB9LAorKwl7IE5NX0FUVF9DSEFOX0NPTUIsCQkiQ2hhbm5lbCBDb21iaW5hdGlvbiIgfSwKKysJeyBOTV9BVFRfQ09OTl9GQUlMX0NSSVQsCSJDb25uZWN0aW9uIEZhaWwgQ3JpdGVyaW9uIiB9LAorKwl7IE5NX0FUVF9ERVNULAkJCSJEZXN0aW5hdGlvbiIgfSwKKysJeyBOTV9BVFRfRVZFTlRfVFlQRSwJCSJFdmVudCBUeXBlIiB9LAorKwl7IE5NX0FUVF9GSUxFX0lELAkJIkZpbGUgSUQiIH0sCisrCXsgTk1fQVRUX0ZJTEVfVkVSU0lPTiwJCSJGaWxlIFZlcnNpb24iIH0sCisrCXsgTk1fQVRUX0dTTV9USU1FLAkJIkdTTSBUaW1lIiB9LAorKwl7IE5NX0FUVF9IU04sCQkJIkhTTiIgfSwKKysJeyBOTV9BVFRfSFdfQ09ORklHLAkJIkhXIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0hXX0RFU0MsCQkiSFcgRGVzY3JpcHRpb24iIH0sCisrCXsgTk1fQVRUX0lOVEFWRV9QQVJBTSwJCSJJbnRhdmUgUGFyYW1ldGVyIiB9LAorKwl7IE5NX0FUVF9JTlRFUkZfQk9VTkQsCQkiSW50ZXJmZXJlbmNlIEJvdW5kYXJpZXMiIH0sCisrCXsgTk1fQVRUX0xJU1RfUkVRX0FUVFIsCQkiTGlzdCBvZiByZXF1aXJlZCBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX0FUVF9NQUlPLAkJCSJNQUlPIiB9LAorKwl7IE5NX0FUVF9NQU5VRl9TVEFURSwJCSJNYW51ZmFjdHVyZXIgRGVwZW5kZW50IFN0YXRlIiB9LAorKwl7IE5NX0FUVF9NQU5VRl9USFJFU0gsCQkiTWFudWZhY3R1cmVyIERlcGVuZGVudCBUaHJlc2hvbGRzIiB9LAorKwl7IE5NX0FUVF9NQU5VRl9JRCwJCSJNYW51ZmFjdHVyZXIgSWQiIH0sCisrCXsgTk1fQVRUX01BWF9UQSwJCSJNYXhpbXVtIFRpbWluZyBBZHZhbmNlIiB9LAorKwl7IE5NX0FUVF9NRFJPUF9MSU5LLAkJIk11bHRpLWRyb3AgQlNDIExpbmsiIH0sCisrCXsgTk1fQVRUX01EUk9QX05FWFQsCQkiTXVsdGktZHJvcCBuZXh0IEJUUyBMaW5rIiB9LAorKwl7IE5NX0FUVF9OQUNLX0NBVVNFUywJCSJOQUNLIENhdXNlcyIgfSwKKysJeyBOTV9BVFRfTlkxLAkJCSJOeTEiIH0sCisrCXsgTk1fQVRUX09QRVJfU1RBVEUsCQkiT3BlcmF0aW9uYWwgU3RhdGUiIH0sCisrCXsgTk1fQVRUX09WRVJMX1BFUklPRCwJCSJPdmVybG9hZCBQZXJpb2QiIH0sCisrCXsgTk1fQVRUX1BIWVNfQ09ORiwJCSJQaHlzaWNhbCBDb25maWciIH0sCisrCXsgTk1fQVRUX1BPV0VSX0NMQVNTLAkJIlBvd2VyIENsYXNzIiB9LAorKwl7IE5NX0FUVF9QT1dFUl9USFJFU0gsCQkiUG93ZXIgT3V0cHV0IFRocmVzaG9sZHMiIH0sCisrCXsgTk1fQVRUX1BST0JfQ0FVU0UsCQkiUHJvYmFibGUgQ2F1c2UiIH0sCisrCXsgTk1fQVRUX1JBQ0hfQl9USFJFU0gsCQkiUkFDSCBCdXN5IFRocmVzaG9sZCIgfSwKKysJeyBOTV9BVFRfTERBVkdfU0xPVFMsCQkiUkFDSCBMb2FkIEF2ZXJhZ2luZyBTbG90cyIgfSwKKysJeyBOTV9BVFRfUkFEX1NVQkMsCQkiUmFkaW8gU3ViIENoYW5uZWwiIH0sCisrCXsgTk1fQVRUX1JGX01BWFBPV1JfUiwJCSJSRiBNYXggUG93ZXIgUmVkdWN0aW9uIiB9LAorKwl7IE5NX0FUVF9TSVRFX0lOUFVUUywJCSJTaXRlIElucHV0cyIgfSwKKysJeyBOTV9BVFRfU0lURV9PVVRQVVRTLAkJIlNpdGUgT3V0cHV0cyIgfSwKKysJeyBOTV9BVFRfU09VUkNFLAkJIlNvdXJjZSIgfSwKKysJeyBOTV9BVFRfU1BFQ19QUk9CLAkJIlNwZWNpZmljIFByb2JsZW1zIiB9LAorKwl7IE5NX0FUVF9TVEFSVF9USU1FLAkJIlN0YXJ0aW5nIFRpbWUiIH0sCisrCXsgTk1fQVRUX1QyMDAsCQkJIlQyMDAiIH0sCisrCXsgTk1fQVRUX1RFSSwJCQkiVEVJIiB9LAorKwl7IE5NX0FUVF9URVNUX0RVUiwJCSJUZXN0IER1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9URVNUX05PLAkJIlRlc3QgTm8iIH0sCisrCXsgTk1fQVRUX1RFU1RfUkVQT1JULAkJIlRlc3QgUmVwb3J0IEluZm8iIH0sCisrCXsgTk1fQVRUX1ZTV1JfVEhSRVNILAkJIlZTV1IgVGhyZXNob2xkcyAiIH0sCisrCXsgTk1fQVRUX1dJTkRPV19TSVpFLAkJIldpbmRvdyBTaXplIiB9LAorKwl7IE5NX0FUVF9CUzExX1JTU0lfT0ZGUywJIlNJRSBSU1NJIE9mZnNldCIgfSwKKysJeyBOTV9BVFRfQlMxMV9UWFBXUiwJCSJTSUUgVFggUG93ZXIiIH0sCisrCXsgTk1fQVRUX0JTMTFfRElWRVJTSVRZLAkiU0lFIERpdmVyc2l0eSIgfSwKKysJeyBOTV9BVFRfVFNDLAkJCSJUcmFpbmluZyBTZXF1ZW5jZSBDb2RlIiB9LAorKwl7IE5NX0FUVF9TV19DT05GSUcsCQkiU1cgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfU1dfREVTQ1IsCQkiU1cgRGVzY3JpcHRpb24iIH0sCisrCXsgTk1fQVRUX1NFVkVSSVRZLAkJIlBlcmNlaXZlZCBTZXZlcml0eSIgfSwKKysJeyBOTV9BVFRfR0VUX0FSSSwJCSJHZXQgQVJJIiB9LAorKwl7IE5NX0FUVF9IV19DT05GX0NIRywJCSJIVyBDb25maWd1cmF0aW9uIENoYW5nZSIgfSwKKysJeyBOTV9BVFRfT1VUU1RfQUxBUk0sCQkiT3V0c3RhbmRpbmcgQWxhcm0iIH0sCisrCXsgTk1fQVRUX0ZJTEVfREFUQSwJCSJGaWxlIERhdGEiIH0sCisrCXsgTk1fQVRUX01FQVNfUkVTLAkJIk1lYXN1cmVtZW50IFJlc3VsdCIgfSwKKysJeyBOTV9BVFRfTUVBU19UWVBFLAkJIk1lYXN1cmVtZW50IFR5cGUiIH0sCisrCXsgTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8sCSJTSUUgRVNOIEZXIENvZGUgTnVtYmVyIiB9LAorKwl7IE5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PLAkiU0lFIEVTTiBIVyBDb2RlIE51bWJlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCwJIlNJRSBFU04gUENCIFNlcmlhbCBOdW1iZXIiIH0sCisrCXsgTk1fQVRUX0JTMTFfRVhDRVNTSVZFX0RJU1RBTkNFLCAiU0lFIEV4Y2Vzc2l2ZSBEaXN0YW5jZSIgfSwKKysJeyBOTV9BVFRfQlMxMV9BTExfVEVTVF9DQVRHLAkiU0lFIEFsbCBUZXN0IENhdGVnb3JpZXMiIH0sCisrCXsgTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywJIlNJRSBCVFMgTFMgSG9wcGluZyIgfSwKKysJeyBOTV9BVFRfQlMxMV9DRUxMX0FMTE9DX05SLAkiU0lFIENlbGwgQWxsb2NhdGlvbiBOdW1iZXIiIH0sCisrCXsgTk1fQVRUX0JTMTFfQ0VMTF9HTE9CQUxfSUQsCSJTSUUgQ2VsbCBHbG9iYWwgSUQiIH0sCisrCXsgTk1fQVRUX0JTMTFfRU5BX0lOVEVSRl9DTEFTUywJIlNJRSBFbmFibGUgSW50ZXJmZXJlbmNlIENsYXNzIiB9LAorKwkvKiBGSVhNRSAqLworKwl7IE5NX0FUVF9CUzExX0VOQV9NU19QV1JfQ1RSTCwJIlNJRSBFbmFibGUgTVMgUG93ZXIgQ29udHJvbCIgfSwKKysJeyBOTV9BVFRfQlMxMV9FTkFfUFdSX0JER1RfSE8sCSJTSUUgRW5hYmxlIFBvd2VyIEJ1ZGdldCBITyIgfSwKKysJeyBOTV9BVFRfQlMxMV9FTkFfUlhMRVZfSE8sCSJTSUUgRW5hYmxlIFJ4TGV2ZWwgSE8iIH0sCisrCXsgTk1fQVRUX0JTMTFfRU5BX1JYUVVBTF9ITywJIlNJRSBFbmFibGUgUnhRdWFsIEhPIiB9LAorKwl7IE5NX0FUVF9CUzExX0ZBQ0NIX1FVQUwsCSJTSUUgRkFDQ0ggUXVhbGl0eSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfRFNUX0lQLAkJIklQQSBEZXN0aW5hdGlvbiBJUCBBZGRyZXNzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVCwJIklQQSBEZXN0aW9uYXRpb24gSVAgUG9ydCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU1NSQywJCSJJUEEgUlRQIFNTUkMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JUUF9QQVlMRF9UWVBFLAkiSVBBIFJUUCBQYXlsb2FkIFR5cGUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0JBU0VCX0lELAkiSVBBIEJhc2ViYW5kIElkZW50aWZpZXIiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NUUkVBTV9JRCwJIklQQSBTdHJlYW0gSWRlbnRpZmllciIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlZfRkxBR1MsCSJJUEEgTlZSQU0gRmxhZ3MiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0ZSRVFfQ1RSTCwJIklQQSBGcmVxdWVuY3kgQ29udHJvbCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHLAkiSVBBIFByaW1hcnkgT01MIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkcsCSJJUEEgU2Vjb25kYXJ5IE9NTCBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX0lQX0lGX0NGRywJIklQQSBJUCBJbnRlcmZhY2UgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19JUF9HV19DRkcsCSJJUEEgSVAgR2F0ZXdheSBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX0lOX1NFUlZfVElNRSwJIklQQSBJbiBTZXJ2aWNlIFRpbWUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1RSWF9CVFNfQVNTLAkiSVBBIFRSWCBCVFMgQXNzaWdubWVudCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTE9DQVRJT04sCSJJUEEgQlRTIExvY2F0aW9uIE5hbWUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1BBR0lOR19DRkcsCSJJUEEgUGFnaW5nIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX0ZJTEVfREFUQSwJIklQQSBGaWxlIERhdGEiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1VOSVRfSUQsCQkiSVBBIFVuaXQgSUQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1BBUkVOVF9VTklUX0lELAkiSVBBIFBhcmVudCBVbml0IElEIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19VTklUX05BTUUsCSJJUEEgVW5pdCBOYW1lIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TTk1QX0NGRywJIklQQSBTTk1QIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHX0xJU1QsICJJUEEgUHJpbWFyeSBPTUwgQ29uZmlnIExpc3QiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1BSSU1fT01MX0ZCX1RPVVQsIklQQSBQcmltYXJ5IE9NTCBGYWxsYmFjayBUaW1lb3V0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHLAkiSVBBIEN1cnJlbnQgU29mdHdhcmUgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19USU1JTkdfQlVTLAkiSVBBIFRpbWluZyBCdXMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0NHSSwJCSJJUEEgQ0dJIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19SQUMsCQkiSVBBIFJBQyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfT0JKX1ZFUlNJT04sCSJJUEEgT2JqZWN0IFZlcnNpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX0dQUlNfUEFHSU5HX0NGRywJIklQQSBHUFJTIFBhZ2luZyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OU0VJLAkJIklQQSBOU0VJIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19CVkNJLAkJIklQQSBCVkNJIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OU1ZDSSwJCSJJUEEgTlNWQ0kiIH0sCisrCXsgTk1fQVRUX0lQQUNDX05TX0NGRywJCSJJUEEgTlMgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHLAkiSVBBIEJTU0dQIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHLAkiSVBBIE5TIExpbmsgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUkxDX0NGRywJCSJJUEEgUkxDIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX0FMTV9USFJFU0hfTElTVCwJIklQQSBBbGFybSBUaHJlc2hvbGQgTGlzdCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1QsCSJJUEEgTW9uaXRvcmVkIFZhbHVlIExpc3QiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1RJQl9DT05UUk9MLAkiSVBBIFRpbWluZyBJbnRlcmZhY2UgQnVzIENvbnRyb2wiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVMsCSJJUEEgU3VwcG9ydGVkIEZlYXR1cmVzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FUywJIklQQSBDb2RpbmcgU2NoZW1lcyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUkxDX0NGR18yLAkiSVBBIFJMQyBDb25maWd1cmF0aW9uIDIiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0hFQVJUQl9UT1VULAkiSVBBIEhlYXJ0YmVhdCBUaW1lb3V0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19VUFRJTUUsCQkiSVBBIFVwdGltZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUkxDX0NGR18zLAkiSVBBIFJMQyBDb25maWd1cmF0aW9uIDMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NTTF9DRkcsCQkiSVBBIFNTTCBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEUsCSJJUEEgU2VjdXJpdHkgUG9zc2libGUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0lNTF9TU0xfU1RBVEUsCSJJUEEgSU1MIFNTTCBTdGF0ZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUkVWT0NfREFURSwJIklQQSBSZXZvY2F0aW9uIERhdGUiIH0sCisrCS8qIEZJWE1FOiBNb3JlIFNJRSAqLworK307CisrCisrLyogU2VjdGlvbiA5LjQuNDogQWRtaW5pc3RyYXRpdmUgU3RhdGUgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9hZG1fc3RhdGVfdmFsc1tdID0geworKwl7IE5NX1NUQVRFX0xPQ0tFRCwJCSJMb2NrZWQiIH0sCisrCXsgTk1fU1RBVEVfVU5MT0NLRUQsCQkiVW5sb2NrZWQiIH0sCisrCXsgTk1fU1RBVEVfU0hVVERPV04sCQkiU2h1dGRvd24iIH0sCisrCXsgTk1fU1RBVEVfTlVMTCwJCSJOdWxsIiB9LAorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfb3Blcl9zdGF0ZV92YWxzW10gPSB7CisrCXsgMSwJIkRpc2FibGVkIiB9LAorKwl7IDIsCSJFbmFibGVkIiB9LAorKwl7IDB4ZmYsCSJOVUxMIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuNyBBdmFpbGFiaWxpdHkgU3RhdHVzICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfYXZhaWxfc3RhdGVfdmFsc1tdID0geworKwl7IDAsCSJJbiB0ZXN0IiB9LAorKwl7IDEsCSJGYWlsZWQiIH0sCisrCXsgMiwJIlBvd2VyIG9mZiIgfSwKKysJeyAzLAkiT2ZmIGxpbmUiIH0sCisrCXsgNSwJIkRlcGVuZGVuY3kiIH0sCisrCXsgNiwJIkRlZ3JhZGVkIiB9LAorKwl7IDcsIAkiTm90IGluc3RhbGxlZCIgfSwKKysJeyAweGZmLAkiT0siIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4xMzogQ2hhbm5lbCBDb21iaW5hdGlvbiAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2NoYW5fY29tYl92YWxzW10gPSB7CisrCXsgTk1fQ0hBTkNfVENIRnVsbCwJCSJUQ0gvRiIgfSwKKysJeyBOTV9DSEFOQ19UQ0hIYWxmLAkJIlRDSC9IIiB9LAorKwl7IE5NX0NIQU5DX1RDSEhhbGYyLAkJIlRDSC9IIDIiIH0sCisrCXsgTk1fQ0hBTkNfU0RDQ0gsCQkiU0RDQ0giIH0sCisrCXsgTk1fQ0hBTkNfbWFpbkJDQ0gsCQkiTWFpbiBCQ0NIIiB9LAorKwl7IE5NX0NIQU5DX0JDQ0hDb21iLAkJIkNvbWJpbmVkIEJDQ0giIH0sCisrCXsgTk1fQ0hBTkNfQkNDSCwJCSJCQ0NIIiB9LAorKwl7IE5NX0NIQU5DX0JDQ0hfQ0JDSCwJCSJCQ0NIK0NCQ0giIH0sCisrCXsgTk1fQ0hBTkNfU0RDQ0hfQ0JDSCwJCSJTRENDSCtDQkNIIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTY6IEV2ZW50IFR5cGUgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9ldmVudF90eXBlX3ZhbHNbXSA9IHsKKysJeyBOTV9FVlRfQ09NTV9GQUlMLAkJIkNvbW11bmljYXRpb24gRmFpbHVyZSIgfSwKKysJeyBOTV9FVlRfUU9TX0ZBSUwsCQkiUW9TIEZhaWx1cmUiIH0sCisrCXsgTk1fRVZUX1BST0NfRkFJTCwJCSJQcm9jZXNzb3IgRmFpbHVyZSIgfSwKKysJeyBOTV9FVlRfRVFVSVBfRkFJTCwJCSJFcXVpcG1lbnQgRmFpbHVyZSIgfSwKKysJeyBOTV9FVlRfRU5WX0ZBSUwsCQkiRW52aXJvbm1lbnQgRmFpbHVyZSIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjYzOiBQZXJjZWl2ZWQgU2V2ZXJpdHkgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9zZXZlcml0eV92YWxzW10gPSB7CisrCXsgTk1fU0VWRVJfQ0VBU0VELAkJIkNlYXNlZCIgfSwKKysJeyBOTV9TRVZFUl9DUklUSUNBTCwJCSJDcml0aWNhbCIgfSwKKysJeyBOTV9TRVZFUl9NQUpPUiwJCSJNYWpvciIgfSwKKysJeyBOTV9TRVZFUl9NSU5PUiwJCSJNaW5vciIgfSwKKysJeyBOTV9TRVZFUl9XQVJOSU5HLAkJIldhcm5pbmciIH0sCisrCXsgTk1fU0VWRVJfSU5ERVRFUk1JTkFURSwJIkluZGV0ZXJtaW5hdGUiIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4zNjogTkFDSyBDYXVzZXMgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9uYWNrX2NhdXNlW10gPSB7CisrCXsgTk1fTkFDS19JTkNPUlJfU1RSVUNULAkiSW5jb3JyZWN0IG1lc3NhZ2Ugc3RydWN0dXJlIiB9LAorKwl7IE5NX05BQ0tfTVNHVFlQRV9JTlZBTCwJIkludmFsaWQgbWVzc2FnZSB0eXBlIHZhbHVlIiB9LAorKwl7IE5NX05BQ0tfT0JKQ0xBU1NfSU5WQUwsCSJJbnZhbGlkIE9iamVjdCBjbGFzcyB2YWx1ZSIgfSwKKysJeyBOTV9OQUNLX09CSkNMQVNTX05PVFNVUFAsCSJPYmplY3QgQ2xhc3Mgbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX0JUU05SX1VOS04sCQkiQlRTIE51bWJlciB1bmtub3duIiB9LAorKwl7IE5NX05BQ0tfVFJYTlJfVU5LTiwJCSJUUlggTnVtYmVyIHVua25vd24iIH0sCisrCXsgTk1fTkFDS19PQkpJTlNUX1VOS04sCQkiT2JqZWN0IEluc3RhbmNlIHVua25vd24iIH0sCisrCXsgTk1fTkFDS19BVFRSSURfSU5WQUwsCQkiSW52YWxpZCBBdHRyaWJ1dGUgSUQgdmFsdWUiIH0sCisrCXsgTk1fTkFDS19BVFRSSURfTk9UU1VQUCwJIkF0dHJpYnV0ZSBJRCBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfUEFSQU1fUkFOR0UsCQkiUGFyYW1ldGVyIHZhbHVlIG91dCBvZiByYW5nZSIgfSwKKysJeyBOTV9OQUNLX0FUVFJMSVNUX0lOQ09OU0lTVEVOVCwgIkluY29uc2lzdGVuY3kgaW4gQXR0cmlidXRlIGxpc3QiIH0sCisrCXsgTk1fTkFDS19TUEVDX0lNUExfTk9UU1VQUCwJIlNwZWNpZmllZCBJbXBsZW1lbnRhdGlvbiBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfQ0FOVF9QRVJGT1JNLAkJIk1lc3NhZ2UgY2Fubm90IGJlIHBlcmZvcm1lZCIgfSwKKysJeyBOTV9OQUNLX1JFU19OT1RJTVBMLAkJIlJlc291cmNlIG5vdCBpbXBsZW1lbnRlZCIgfSwKKysJeyBOTV9OQUNLX1JFU19OT1RBVkFJTCwJCSJSZXNvdXJjZSBub3QgYXZhaWxhYmxlIiB9LAorKwl7IE5NX05BQ0tfRlJFUV9OT1RBVkFJTCwJIkZyZXF1ZW5jeSBub3QgYXZhaWxhYmxlIiB9LAorKwl7IE5NX05BQ0tfVEVTVF9OT1RTVVBQLAkJIlRlc3Qgbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX0NBUEFDSVRZX1JFU1RSLAkiQ2FwYWNpdHkgcmVzdHJpY3Rpb25zIiB9LAorKwl7IE5NX05BQ0tfUEhZU0NGR19OT1RQRVJGT1JNLAkiUGh5cyBjb25maWcgY2Fubm90IGJlIHBlcmZvcm1lZCIgfSwKKysJeyBOTV9OQUNLX1RFU1RfTk9USU5JVCwJCSJUZXN0IG5vdCBpbml0aWF0ZWQiIH0sCisrCXsgTk1fTkFDS19QSFlTQ0ZHX05PVFJFU1RPUkUsCSJQaHlzIGNvbmZpZyBjYW5ub3QgYmUgcmVzdG9yZWQiIH0sCisrCXsgTk1fTkFDS19URVNUX05PU1VDSCwJCSJObyBzdWNoIFRlc3QiIH0sCisrCXsgTk1fTkFDS19URVNUX05PU1RPUCwJCSJUZXN0IGNhbm5vdCBiZSBzdG9wcGVkIiB9LAorKwl7IE5NX05BQ0tfTVNHSU5DT05TSVNUX1BIWVNDRkcsCSJNZXNzYWdlIGluY29uc2lzdGVuIHdpdGggcGh5c2ljYWwgY29uZmlnIiB9LAorKwl7IE5NX05BQ0tfRklMRV9JTkNPTVBMRVRFLAkiQ29tcGxldGUgZmlsZSBub3QgcmVjZWl2ZWQiIH0sCisrCXsgTk1fTkFDS19GSUxFX05PVEFWQUlMLAkiRmlsZSBub3QgYXZhaWxhYmxlIGF0IGRlc3RpbmF0aW9uIiB9LAorKwl7IE5NX05BQ0tfRklMRV9OT1RBQ1RJVkFURSwJIkZpbGUgY2Fubm90IGJlIGFjdGl2YXRlZCIgfSwKKysJeyBOTV9OQUNLX1JFUV9OT1RfR1JBTlQsCSJSZXF1ZXN0IG5vdCBncmFudGVkIiB9LAorKwl7IE5NX05BQ0tfV0FJVCwJCQkiV2FpdCIgfSwKKysJeyBOTV9OQUNLX05PVEhfUkVQT1JUX0VYSVNULAkiTm90aGluZyByZXBvcnRhYmxlIGV4aXN0aW5nIiB9LAorKwl7IE5NX05BQ0tfTUVBU19OT1RTVVBQLAkJIk1lYXN1cmVtZW50IG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19NRUFTX05PVFNUQVJULAkiTWVhc3VyZW1lbnQgbm90IHN0YXJ0ZWQiIH0sCisrCXsgMHhmZiwJCQkJIk5VTEwiIH0sCisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF90ZXN0X25vX3ZhbHNbXSA9IHsKKysJeyBOTV9JUEFDQ19URVNUTk9fUkxPT1BfQU5ULAkiUmFkaW8gTG9vcCB0ZXN0IHZpYSBhbnRlbm5hIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19STE9PUF9YQ1ZSLAkiUmFkaW8gTG9vcCB0ZXN0IHZpYSB0cmFuc2NlaXZlciIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fRlVOQ19PQkosCSJCVFMgRnVuY3Rpb25hbCBvYmplY3Qgc2VsZiB0ZXN0IiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19DSEFOX1VTQUdFLAkiQ2hhbm5lbCBVc2FnZSIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fQkNDSF9DSEFOX1VTQUdFLCAiQkNDSCBDaGFubmVsIFVzYWdlIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19GUkVRX1NZTkMsCSJGcmVxdWVuY3kgU3luY2hyb25pemF0aW9uIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0lORk8sCSJCQ0NIIEluZm9ybWF0aW9uIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19UWF9CRUFDT04sCSJUcmFuc21pdCBCZWFjb24iIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX1NZU0lORk9fTU9OSVRPUiwgIlN5c0luZm8gTW9uaXRvciIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fQkNDQ0hfTU9OSVRPUiwgIkJDQ0ggJiBDQ0NIIE1vbml0b3IiIH0sCisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIGlwYWNjX3Rlc3RfcmVzX3ZhbHNbXSA9IHsKKysJeyBOTV9JUEFDQ19URVNUUkVTX1NVQ0NFU1MsCSJTdWNjZXNzIiB9LAorKwl7IE5NX0lQQUNDX1RFU1RSRVNfVElNRU9VVCwJIlRpbWVvdXQiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVFJFU19OT19DSEFOUywJIk5vIHN1aXRhYmxlIGNoYW5uZWxzIGF2YWlsYWJsZSIgfSwKKysJeyBOTV9JUEFDQ19URVNUUkVTX1BBUlRJQUwsCSJQYXJ0aWFsIiB9LAorKwl7IE5NX0lQQUNDX1RFU1RSRVNfU1RPUFBFRCwJIlN0b3BwZWQiIH0sCisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIGlwYWNjX3Rlc3RyZXNfaWVfdmFsc1tdID0geworKwl7IE5NX0lQQUNDX1RSX0lFX0ZSRVFfRVJSX0xJU1QsCSJGcmVxdWVuY3kgRXJyb3IgTGlzdCIgfSwKKysJeyBOTV9JUEFDQ19UUl9JRV9DSEFOX1VTQUdFLAkiQ2hhbm5lbCBVc2FnZSIgfSwKKysJeyBOTV9JUEFDQ19UUl9JRV9CQ0NIX0lORk8sCSJCQ0NIIEluZm9ybWF0aW9uIiB9LAorKwl7IE5NX0lQQUNDX1RSX0lFX1JFU1VMVF9ERVRBSUxTLCJSZXN1bHQgRGV0YWlscyIgfSwKKysJeyBOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUiwJIkZyZXF1ZW5jeSBFcnJvciIgfSwKKyt9OworKworKy8qIFBhcnNlIHRoZSBpcC5hY2Nlc3Mgc3BlY2lmaWMgQkNDSCBJbmZvcm1hdGlvbiBJRSBlbWJlZGRlZCBpbnRvIHRoZSBUZXN0CisrICogUmVwb3J0IElFICovCisrc3RhdGljIGdpbnQKKytpcGFjY190cl9pZV9iY2NoKHR2YnVmZl90ICp0dmIsIHByb3RvX3RyZWUgKmF0dF90cmVlLCBpbnQgb2Zmc2V0KQorK3sKKysJZ3VpbnQxNiBiaW5mb190eXBlLCB0bXA7CisrCisrCWJpbmZvX3R5cGUgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJb2Zmc2V0ICs9IDI7CisrCisrCXRtcCA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKworKwkvKiBGSVhNRTogdGhlcmUgYXJlIHN0aWxsIHNvbWUgYnVncyByZW1haW5pbmcgaGVyZSAqLworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9hcmZjbiwKKysJCQkgICAgdHZiLCBvZmZzZXQsIDIsIFRSVUUpOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9mX3F1YWwsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysJb2Zmc2V0ICs9IDI7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2JfcnhsZXYsCisrCQkJICAgIHR2Yiwgb2Zmc2V0KyssIDEsIFRSVUUpOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9yeHF1YWwsCisrCQkJICAgIHR2Yiwgb2Zmc2V0KyssIDEsIFRSVUUpOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9mX2VyciwKKysJCQkgICAgdHZiLCBvZmZzZXQsIDIsIFRSVUUpOworKwlvZmZzZXQgKz0gMjsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfZnJhbWVfb2ZmcywKKysJCQkgICAgdHZiLCBvZmZzZXQsIDIsIFRSVUUpOworKwlvZmZzZXQgKz0gMjsKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfZnJhbWVucl9vZmZzLAorKwkJCSAgICB0dmIsIG9mZnNldCwgNCwgVFJVRSk7CisrCW9mZnNldCArPSA0OworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9ic2ljLAorKwkJCSAgICB0dmIsIG9mZnNldCsrLCAxLCBUUlVFKTsKKysKKysJZGVfbGFpKHR2YiwgYXR0X3RyZWUsIG9mZnNldCwgNSwgTlVMTCwgMCk7CisrCW9mZnNldCArPSA1OworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9jZWxsX2lkLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCW9mZnNldCArPSAyOworKworKwlpZiAoYmluZm9fdHlwZSAmIDB4ODAwMCkgeworKwkJLyogU3lzdGVtIEluZm9ybWF0aW9uIDIgKi8KKysJCS8qIEZJWE1FOiBQYXJzZSAwNC4xOCBOZWlnaGJvdXIgQ2VsbCBEZXNjcmlwdGlvbiAqLworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfc2kyLAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDE2LCBUUlVFKTsKKysJCW9mZnNldCArPSAxNjsKKysJfQorKwlpZiAoYmluZm9fdHlwZSAmIDB4MDAwMSkgeworKwkJLyogU3lzdGVtIEluZm9ybWF0aW9uIDJiaXMgKi8KKysJCS8qIEZJWE1FOiBQYXJzZSAwNC4xOCBOZWlnaGJvdXIgQ2VsbCBEZXNjcmlwdGlvbiAqLworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfc2kyYmlzLAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDE2LCBUUlVFKTsKKysJCW9mZnNldCArPSAxNjsKKysJfQorKwlpZiAoYmluZm9fdHlwZSAmIDB4MDAwMikgeworKwkJLyogU3lzdGVtIEluZm9ybWF0aW9uIDJ0ZXIgKi8KKysJCS8qIEZJWE1FOiBQYXJzZSAwNC4xOCBOZWlnaGJvdXIgQ2VsbCBEZXNjcmlwdGlvbiAqLworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfc2kydGVyLAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDE2LCBUUlVFKTsKKysJCW9mZnNldCArPSAxNjsKKysJfQorKwlpZiAoYmluZm9fdHlwZSAmIDB4MDAwNCkgeworKwkJLyogRklYTUU6IFBhcnNlIDA0LjE4IENlbGwgQ2hhbm5lbCBEZXNjcmlwdGlvbiAqLworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfY2hhbl9kZXNjLAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDE2LCBUUlVFKTsKKysJCW9mZnNldCArPSAxNjsKKysJfQorKworKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKysvKiBQYXJzZSB0aGUgaXAuYWNjZXNzIHNwZWNpZmljIENoYW5uZWwgVXNhZ2UgSUUgZW1iZWRkZWQgaW50byB0aGUgVGVzdAorKyAqIFJlcG9ydCBJRSAqLworK3N0YXRpYyBnaW50CisraXBhY2NfdHJfaWVfY2hhbl91c2FnZSh0dmJ1ZmZfdCAqdHZiLCBwcm90b190cmVlICphdHRfdHJlZSwgaW50IG9mZnNldCkKKyt7CisrCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgeworKwkJZ3VpbnQxNiByZXN1bHQgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2FyZmNuLAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDIsIHJlc3VsdCk7CisrCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9yeGxldiwKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCByZXN1bHQpOworKwkJb2Zmc2V0ICs9IDI7CisrCX0KKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrLyogUGFyc2UgdGhlIGlwLmFjY2VzcyBzcGVjaWZpYyBmb3JtYXQgb2YgdGhlIHN0YW5kYXJkIHRlc3QgcmVwb3J0IElFICovCisrc3RhdGljIGdpbnQKKytkaXNzZWN0X2lwYWNjX3Rlc3RfcmVwKHByb3RvX3RyZWUgKnRyZWUsIHR2YnVmZl90ICp0dmIpCisreworKwlnaW50IG9mZnNldCA9IDA7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfYXR0cl9pcGFfdGVzdF9yZXMsIHR2Yiwgb2Zmc2V0KyssCisrCQkJICAgIDEsIEZBTFNFKTsKKysKKysJd2hpbGUgKHR2Yl9yZXBvcnRlZF9sZW5ndGhfcmVtYWluaW5nKHR2Yiwgb2Zmc2V0KSAhPSAwKSB7CisrCQlndWludDggaWUgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQlndWludDE2IGxlbiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQrMSk7CisrCQlwcm90b19pdGVtICp0aTsKKysJCXByb3RvX3RyZWUgKmF0dF90cmVlOworKworKwkJdGkgPSBwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX29tbF9pcGFfdHJlc19hdHRyX3RhZywgdHZiLAorKwkJCQkJIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCQlhdHRfdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9vbWxfZm9tX2F0dCk7CisrCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9vbWxfaXBhX3RyZXNfYXR0cl9sZW4sIHR2YiwKKysJCQkJICAgIG9mZnNldCwgMiwgbGVuKTsKKysJCW9mZnNldCArPSAyOworKworKwkJc3dpdGNoIChpZSkgeworKwkJY2FzZSBOTV9JUEFDQ19UUl9JRV9DSEFOX1VTQUdFOgorKwkJCW9mZnNldCA9IGlwYWNjX3RyX2llX2NoYW5fdXNhZ2UodHZiLAorKwkJCQkJCSAJYXR0X3RyZWUsIG9mZnNldCk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0lQQUNDX1RSX0lFX0JDQ0hfSU5GTzoKKysJCQlvZmZzZXQgPSBpcGFjY190cl9pZV9iY2NoKHR2YiwKKysJCQkJCQkgIGF0dF90cmVlLCBvZmZzZXQpOworKwkJCWJyZWFrOworKwkJZGVmYXVsdDoKKysJCQlicmVhazsKKysJCX0KKysJfQorKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKysvKiBEaXNzZWN0IE9NTCBGT00gQXR0cmlidXRlcyBhZnRlciBPTUwgKyBGT00gaGVhZGVyICovCisrc3RhdGljIGdpbnQKKytkaXNzZWN0X29tbF9hdHRycyh0dmJ1ZmZfdCAqdHZiLCBpbnQgYmFzZV9vZmZzLCBwYWNrZXRfaW5mbyAqcGluZm8sCisrCQkgIHByb3RvX3RyZWUgKnRyZWUpCisreworKwlpbnQgb2Zmc2V0ID0gYmFzZV9vZmZzOworKworKwl3aGlsZSAodHZiX3JlcG9ydGVkX2xlbmd0aF9yZW1haW5pbmcodHZiLCBvZmZzZXQpICE9IDApIHsKKysJCWd1aW50IGk7CisrCQlndWludDggdGFnLCB2YWw4OworKwkJZ3VpbnQxNiB2YWwxNjsKKysJCWd1aW50MzIgdmFsMzI7CisrCQl1bnNpZ25lZCBpbnQgbGVuLCBsZW5fbGVuLCBobGVuOworKwkJY29uc3Qgc3RydWN0IHRsdl9kZWYgKnRkZWY7CisrCQlwcm90b19pdGVtICp0aTsKKysJCXByb3RvX3RyZWUgKmF0dF90cmVlOworKwkJdHZidWZmX3QgKnN1Yl90dmI7CisrCisrCQl0YWcgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQl0ZGVmID0gJm5tX2F0dF90bHZkZWYuZGVmW3RhZ107CisrCisrCQlzd2l0Y2ggKHRkZWYtPnR5cGUpIHsKKysJCWNhc2UgVExWX1RZUEVfRklYRUQ6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gdGRlZi0+Zml4ZWRfbGVuOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UOgorKwkJCWhsZW4gPSAxOworKwkJCWxlbl9sZW4gPSAwOworKwkJCWxlbiA9IDA7CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1RWOgorKwkJCWhsZW4gPSAxOworKwkJCWxlbl9sZW4gPSAwOworKwkJCWxlbiA9IDE7CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1RMVjoKKysJCQlobGVuID0gMjsKKysJCQlsZW5fbGVuID0gMTsKKysJCQlsZW4gPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKTsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVEwxNlY6CisrCQkJaGxlbiA9IDM7CisrCQkJbGVuX2xlbiA9IDI7CisrCQkJbGVuID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSkgPDwgOCB8CisrCQkJCQkJdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMik7CisrCQkJYnJlYWs7CisrCQlkZWZhdWx0OgorKwkJCWhsZW4gPSBsZW5fbGVuID0gbGVuID0gMDsKKysJCQlESVNTRUNUT1JfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisrCQkJYnJlYWs7CisrCQl9CisrCisrCQl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfb21sX2ZvbV9hdHRyX3RhZywgdHZiLAorKwkJCQkJIG9mZnNldCwgMSwgRkFMU0UpOworKwkJYXR0X3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfb21sX2ZvbV9hdHQpOworKwkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfb21sX2ZvbV9hdHRyX2xlbiwgdHZiLAorKwkJCQkgICAgb2Zmc2V0KzEsIGxlbl9sZW4sIGxlbik7CisrCQlvZmZzZXQgKz0gaGxlbjsKKysKKysJCXN1Yl90dmIgPSB0dmJfbmV3X3N1YnNldCh0dmIsIG9mZnNldCwgbGVuLCBsZW4pOworKworKwkJc3dpdGNoICh0YWcpIHsKKysJCS8qIHBhcnNlIG9ubHkgdGhlIG1vc3QgY29tbW9uIElFIGZvciBub3cgKi8KKysJCWNhc2UgTk1fQVRUX0FCSVNfQ0hBTk5FTDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2FjaF9idHNwLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCAxLCBUUlVFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2FjaF90c2xvdCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCsxLCAxLCBUUlVFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2FjaF9zc2xvdCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCsyLCAxLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0FETV9TVEFURToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2FkbV9zdGF0ZSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJdmFsOCA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCQljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzICIsCisrCQkJCQl2YWxfdG9fc3RyKHZhbDgsIG9tbF9hZG1fc3RhdGVfdmFscywKKysJCQkJCQkgICAiJTAyeCIpKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0FSRkNOX0xJU1Q6CisrCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7CisrCQkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCArIGkpOworKwkJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2FyZmNuLAorKwkJCQkJCSAgICB0dmIsIG9mZnNldCArIGksIDIsIHZhbDE2KTsKKysJCQl9CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9BVkFJTF9TVEFUVVM6CisrCQkJLyogQXZhaWxhYmlsaXR5IHN0YXR1cyBjYW4gaGF2ZSBsZW5ndGggMCAqLworKwkJCWlmIChsZW4pIHsKKysJCQkJdmFsOCA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwKKysJCQkJCQkgICAgaGZfYXR0cl9hdmFpbF9zdGF0ZSwgdHZiLAorKwkJCQkJICAgIAkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQl9IGVsc2UKKysJCQkJdmFsOCA9IDB4ZmY7CisrCQkJY29sX2FwcGVuZF9mc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICIlcyAiLAorKwkJCQkJdmFsX3RvX3N0cih2YWw4LCBvbWxfYXZhaWxfc3RhdGVfdmFscywKKysJCQkJCQkgICAiJTAyeCIpKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0JDQ0hfQVJGQ046CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9iY2NoX2FyZmNuLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQlNJQzoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2JzaWMsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9DSEFOX0NPTUI6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9jaGFuX2NvbWIsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9FVkVOVF9UWVBFOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfZXZlbnRfdHlwZSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0dTTV9USU1FOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfZ3NtX3RpbWUsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9PUEVSX1NUQVRFOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfb3Blcl9zdGF0ZSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJdmFsOCA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCQljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzICIsCisrCQkJCQl2YWxfdG9fc3RyKHZhbDgsIG9tbF9vcGVyX3N0YXRlX3ZhbHMsCisrCQkJCQkJICAgIiUwMngiKSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9URUk6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl90ZWksIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9UU0M6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl90c2MsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9TRVZFUklUWToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX3NldmVyaXR5LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfVEVTVF9SRVBPUlQ6CisrCQkJZGlzc2VjdF9pcGFjY190ZXN0X3JlcChhdHRfdHJlZSwgc3ViX3R2Yik7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9URVNUX05POgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfdGVzdF9ubywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMgIiwKKysJCQkJCXZhbF90b19zdHIodmFsOCwgb21sX3Rlc3Rfbm9fdmFscywKKysJCQkJCQkgICAiJTAyeCIpKTsKKysJCQlicmVhazsKKysKKysJCS8qIHByb3ByaWV0YXJ5IGlwLmFjY2VzcyBleHRlbnNpb25zICovCisrCQljYXNlIE5NX0FUVF9JUEFDQ19EU1RfSVA6CisrCQkJdmFsMzIgPSB0dmJfZ2V0X250b2hsKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF9pcHY0KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9yc2xfaXAsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgdmFsMzIpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlQ6CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9yc2xfcG9ydCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCB2YWwxNik7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19MT0NBVElPTjoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV9sb2NhdGlvbl9uYW1lLAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfVU5JVF9JRDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV91bml0X2lkLAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3VuaXRfbmFtZSwKKysJCQkJCSAgICB0dmIsIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNUOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3ByaW1fb21sX2lwLAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0KzEsIDQsIFRSVUUpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3ByaW1fb21sX3BvcnQsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQrMSs0LCAyLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX05WX0ZMQUdTOgorKwkJCXsKKysJCQkJZ3VpbnQgZmxhZ3MsIG1hc2s7CisrCQkJCWZsYWdzID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCQltYXNrID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSk7CisrCQkJCWZsYWdzIHw9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzIpIDw8IDg7CisrCQkJCW1hc2sgfD0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMykgPDwgODsKKysJCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnZfZmxhZ3MsCisrCQkJCQkJICAgIHR2Yiwgb2Zmc2V0LCAzLCBmbGFncyk7CisrCQkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX252X21hc2ssCisrCQkJCQkJICAgIHR2Yiwgb2Zmc2V0KzEsIDMsIG1hc2spOworKwkJCX0KKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX1JBQzoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV9yYWMsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQsIDEsIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfTlNFSToKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zZWksCisrCQkJCQkgICB0dmIsIG9mZnNldCwgMiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfTlNWQ0k6CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9uc3ZjaSwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0LCAyLCB2YWwxNik7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19CVkNJOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfYnZjaSwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0LCAyLCB2YWwxNik7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19OU19MSU5LX0NGRzoKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zbF9zcG9ydCwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0LCAyLCB2YWwxNik7CisrCQkJdmFsMzIgPSB0dmJfZ2V0X2lwdjQodHZiLCBvZmZzZXQrMik7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXB2NChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnNsX2RhZGRyLAorKwkJCQkJICAgdHZiLCBvZmZzZXQrMiwgNCwgdmFsMzIpOworKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCs2KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9uc2xfZHBvcnQsCisrCQkJCQkgICB0dmIsIG9mZnNldCs2LCAyLCB2YWwxNik7CisrCQkJYnJlYWs7CisrCQlkZWZhdWx0OgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX29tbF9mb21fYXR0cl92YWwsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJfQorKwkJb2Zmc2V0ICs9IGxlbjsKKysJfQorKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKytzdGF0aWMgaW50CisrZGlzc2VjdF9vbWxfZm9tKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwKKysJCWludCBvZmZzZXQsIHByb3RvX2l0ZW0gKnRvcF90aSkKKyt7CisrCWd1aW50OCBtc2dfdHlwZSwgb2JqX2NsYXNzLCBidHNfbnIsIHRyeF9uciwgdHNfbnI7CisrCXByb3RvX2l0ZW0gKnRpOworKwlwcm90b190cmVlICpmb21fdHJlZTsKKysKKysJbXNnX3R5cGUgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCW9ial9jbGFzcyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpOworKwlidHNfbnIgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsyKTsKKysJdHJ4X25yID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMyk7CisrCXRzX25yID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrNCk7CisrCXByb3RvX2l0ZW1fYXBwZW5kX3RleHQodG9wX3RpLCAiLCAlcyglMDJ4LCUwMngsJTAyeCkgJXMgIiwKKysJCQl2YWxfdG9fc3RyKG9ial9jbGFzcywgb21sX2ZvbV9vYmpjbGFzc192YWxzLCAiJTAyeCIpLAorKwkJCWJ0c19uciwgdHJ4X25yLCB0c19uciwKKysJCQl2YWxfdG9fc3RyKG1zZ190eXBlLCBvbWxfZm9tX21zZ3R5cGVfdmFscywKKysJCQkJICAgInVua25vd24gMHgleCIpKTsKKysJY29sX2FwcGVuZF9mc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICIlcyglMDJ4LCUwMngsJTAyeCkgJXMgIiwKKysJCQl2YWxfdG9fc3RyKG9ial9jbGFzcywgb21sX2ZvbV9vYmpjbGFzc192YWxzLCAiJTAyeCIpLAorKwkJCWJ0c19uciwgdHJ4X25yLCB0c19uciwKKysJCQl2YWxfdG9fc3RyKG1zZ190eXBlLCBvbWxfZm9tX21zZ3R5cGVfdmFscywKKysJCQkJICAgInVua25vd24gMHgleCIpKTsKKysJdGkgPSBwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX29tbF9mb21fbXNndHlwZSwgdHZiLCBvZmZzZXQrKywgMSwgRkFMU0UpOworKwlmb21fdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9vbWxfZm9tKTsKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShmb21fdHJlZSwgaGZfb21sX2ZvbV9vYmpjbGFzcywgdHZiLCBvZmZzZXQrKywgMSwgRkFMU0UpOworKwlwcm90b190cmVlX2FkZF9pdGVtKGZvbV90cmVlLCBoZl9vbWxfZm9tX2luc3RfYnRzLCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oZm9tX3RyZWUsIGhmX29tbF9mb21faW5zdF90cngsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShmb21fdHJlZSwgaGZfb21sX2ZvbV9pbnN0X3RzLCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCisrCisrCS8qIGRpc3NlY3QgdGhlIFRMViBvYmplY3RzIGluIHRoZSBtZXNzYWdlIGJvZHkgKi8KKysJb2Zmc2V0ID0gZGlzc2VjdF9vbWxfYXR0cnModHZiLCBvZmZzZXQsIHBpbmZvLCBmb21fdHJlZSk7CisrCisrCXJldHVybiBvZmZzZXQ7CisrfQorKworK3N0YXRpYyBjb25zdCBndWludDggaXBhY2Nlc3NfbWFnaWNbXSA9ICJjb20uaXBhY2Nlc3MiOworKworK3N0YXRpYyBpbnQKKytkaXNzZWN0X29tbF9tYW51Zih0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsCisrCQkgIGludCBvZmZzZXQsIHByb3RvX2l0ZW0gKnRvcF90aSkKKyt7CisrCWlmICh0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCkgIT0gMHgwZCB8fAorKwkgICAgdHZiX21lbWVxbCh0dmIsIG9mZnNldCsxLCBpcGFjY2Vzc19tYWdpYywgc2l6ZW9mKGlwYWNjZXNzX21hZ2ljKSkpCisrCQlyZXR1cm4gb2Zmc2V0OworKworKwlvZmZzZXQgKz0gc2l6ZW9mKGlwYWNjZXNzX21hZ2ljKSArIDE7CisrCisrCXJldHVybiBkaXNzZWN0X29tbF9mb20odHZiLCBwaW5mbywgdHJlZSwgb2Zmc2V0LCB0b3BfdGkpOworK30KKysKKytzdGF0aWMgdm9pZAorK2Rpc3NlY3RfYWJpc19vbWwodHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlKQorK3sKKysJcHJvdG9faXRlbSAqdGk7CisrCXByb3RvX3RyZWUgKm9tbF90cmVlOworKworKwlpbnQgb2Zmc2V0ID0gMDsKKysKKysJY29sX3NldF9zdHIocGluZm8tPmNpbmZvLCBDT0xfUFJPVE9DT0wsICJPTUwiKTsKKysKKysJdG9wX3RyZWUgPSB0cmVlOworKwlpZiAodHJlZSkgeworKwkJdV9pbnQ4X3QgbXNnX2Rpc2MgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCisrCQl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgcHJvdG9fYWJpc19vbWwsIHR2YiwgMCwgLTEsIEZBTFNFKTsKKysJCW9tbF90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X29tbCk7CisrCisrCQlwcm90b190cmVlX2FkZF9pdGVtKG9tbF90cmVlLCBoZl9vbWxfbXNnX2Rpc2MsIHR2Yiwgb2Zmc2V0KyssCisrCQkJCSAgICAxLCBUUlVFKTsKKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0ob21sX3RyZWUsIGhmX29tbF9wbGFjZW1lbnQsIHR2Yiwgb2Zmc2V0KyssCisrCQkJCSAgICAxLCBUUlVFKTsKKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0ob21sX3RyZWUsIGhmX29tbF9zZXF1ZW5jZSwgdHZiLCBvZmZzZXQrKywKKysJCQkJICAgIDEsIFRSVUUpOworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShvbWxfdHJlZSwgaGZfb21sX2xlbmd0aCwgdHZiLCBvZmZzZXQrKywKKysJCQkJICAgIDEsIFRSVUUpOworKworKwkJc3dpdGNoIChtc2dfZGlzYykgeworKwkJY2FzZSBBQklTX09NX01ESVNDX0ZPTToKKysJCQlvZmZzZXQgPSBkaXNzZWN0X29tbF9mb20odHZiLCBwaW5mbywgb21sX3RyZWUsCisrCQkJCQkJIG9mZnNldCwgdGkpOworKwkJCWJyZWFrOworKwkJY2FzZSBBQklTX09NX01ESVNDX01BTlVGOgorKwkJCW9mZnNldCA9IGRpc3NlY3Rfb21sX21hbnVmKHR2YiwgcGluZm8sIG9tbF90cmVlLAkJCQkJCQkgICAgICAgb2Zmc2V0LCB0aSk7CisrCQkJYnJlYWs7CisrCQljYXNlIEFCSVNfT01fTURJU0NfTU1JOgorKwkJY2FzZSBBQklTX09NX01ESVNDX1RSQVU6CisrCQlkZWZhdWx0OgorKwkJCWJyZWFrOworKwkJfQorKwl9CisrfQorKworK3ZvaWQKKytwcm90b19yZWdfaGFuZG9mZl9hYmlzX29tbCh2b2lkKTsKKysKKyt2b2lkCisrcHJvdG9fcmVnaXN0ZXJfYWJpc19vbWwodm9pZCkKKyt7CisrCXN0YXRpYyBoZl9yZWdpc3Rlcl9pbmZvIGhmW10gPSB7CisrCQl7ICZoZl9vbWxfbXNnX2Rpc2MsCisrCQkJeyAiTWVzc2FnZSBEaXNjcmltaW5hdG9yIiwgIm9tbC5tc2dfZHNjIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfbXNnX2Rpc2NfdmFscyksIDAsCisrCQkJICAiR1NNIDEyLjIxIE1lc3NhZ2UgRGlzY3JpbWluYXRvciIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfcGxhY2VtZW50LAorKwkJCXsgIlBsYWNlbWVudCBJbmRpY2F0b3IiLCAib21sLnBsYWNlbWVudCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX3BsYWNlbWVudF92YWxzKSwgMCwKKysJCQkgICJHU00gMTIuMjEgUGxhY2VtZW50IEluZGljYXRvciIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfc2VxdWVuY2UsCisrCQkJeyAiU2VxdWVuY2UgTnVtYmVyIiwgIm9tbC5zZXF1ZW5jZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIE5VTEwsIDAsCisrCQkJICAiU2VxdWVuY2UgTnVtYmVyIChpZiBtdWx0aS1wYXJ0IG1zZykiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2xlbmd0aCwKKysJCQl7ICJMZW5ndGggSW5kaWNhdG9yIiwgIm9tbC5sZW5ndGgiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIlRvdGFsIGxlbmd0aCBvZiBwYXlsb2FkIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21fbXNndHlwZSwKKysJCQl7ICJGT00gTWVzc2FnZSBUeXBlIiwgIm9tbC5mb20ubXNnX3R5cGUiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9mb21fbXNndHlwZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX29iamNsYXNzLAorKwkJCXsgIkZPTSBPYmplY3QgQ2xhc3MiLCAib21sLmZvbS5vYmpfY2xhc3MiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9mb21fb2JqY2xhc3NfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9pbnN0X2J0cywKKysJCQl7ICJGT00gT2JqZWN0IEluc3RhbmNlIEJUUyIsICJvbWwuZm9tLm9ial9pbnN0LmJ0cyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9pbnN0X3RyeCwKKysJCQl7ICJGT00gT2JqZWN0IEluc3RhbmNlIFRSWCIsICJvbWwuZm9tLm9ial9pbnN0LnRyeCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9pbnN0X3RzLAorKwkJCXsgIkZPTSBPYmplY3QgSW5zdGFuY2UgVFMiLCAib21sLmZvbS5vYmpfaW5zdC50cyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9hdHRyX3RhZywKKysJCQl7ICJGT00gQXR0cmlidXRlIElEIiwgIm9tbC5mb20uYXR0cl9pZCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2ZvbV9hdHRyX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21fYXR0cl9sZW4sCisrCQkJeyAiRk9NIEF0dHJpYnV0ZSBMZW5ndGgiLCAib21sLmZvbS5hdHRyX2xlbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21fYXR0cl92YWwsCisrCQkJeyAiRk9NIEF0dHJpYnV0ZSBWYWx1ZSIsICJvbWwuZm9tLmF0dHJfdmFsIiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKworKworKworKwkJLyogT01MIEF0dHJpYnV0ZXMgKi8KKysJCXsgJmhmX2F0dHJfYWRtX3N0YXRlLAorKwkJCXsgIkFkbWluaXN0cmF0aXZlIFN0YXRlIiwgIm9tbC5mb20uYXR0ci5hZG1fc3RhdGUiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9hZG1fc3RhdGVfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9hcmZjbiwKKysJCQl7ICJBUkZDTiIsICJvbWwuZm9tLmF0dHIuYXJmY24iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfb3Blcl9zdGF0ZSwKKysJCQl7ICJPcGVyYXRpb25hbCBTdGF0ZSIsICJvbWwuZm9tLmF0dHIub3Blcl9zdGF0ZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX29wZXJfc3RhdGVfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9hdmFpbF9zdGF0ZSwKKysJCQl7ICJBdmFpbGFiaWxpdHkgU3RhdHVzIiwgIm9tbC5mb20uYXR0ci5hdmFpbF9zdGF0ZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2F2YWlsX3N0YXRlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfZXZlbnRfdHlwZSwKKysJCQl7ICJFdmVudCBUeXBlIiwgIm9tbC5mb20uYXR0ci5ldmVudF90eXBlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfZXZlbnRfdHlwZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX3NldmVyaXR5LAorKwkJCXsgIlNldmVyaXR5IiwgIm9tbC5mb20uYXR0ci5zZXZlcml0eSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX3NldmVyaXR5X3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYmNjaF9hcmZjbiwKKysJCQl7ICJCQ0NIIEFSRkNOIiwgIm9tbC5mb20uYXR0ci5iY2NoX2FyZmNuIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiQVJGQ04gb2YgdGhlIEJDQ0giLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9ic2ljLAorKwkJCXsgIkJTSUMiLCAib21sLmZvbS5hdHRyLmJzaWMiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0hFWCwgTlVMTCwgMCwKKysJCQkgICJCYXNlIFN0YXRpb24gSWRlbnRpdHkgQ2RvZSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX3Rlc3Rfbm8sCisrCQkJeyAiVGVzdCBOdW1iZXIiLCAib21sLmZvbS5hdHRyLnRlc3Rfbm8iLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF90ZXN0X25vX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfdHNjLAorKwkJCXsgIlRTQyIsICJvbWwuZm9tLmF0dHIudHNjIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgTlVMTCwgMCwKKysJCQkgICJUcmFpbmluZyBTZXF1ZW5jZSBDb2RlIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfdGVpLAorKwkJCXsgIlRFSSIsICJvbWwuZm9tLmF0dHIudGVpIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2FjaF9idHNwLAorKwkJCXsgIkJUUyBFMSBQb3J0IiwgIm9tbC5mb20uYXR0ci5hYmlzX2NoLmJ0c19wb3J0IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2FjaF90c2xvdCwKKysJCQl7ICJFMSBUaW1lc2xvdCIsICJvbWwuZm9tLmF0dHIuYWJpc19jaC50aW1lc2xvdCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9hY2hfc3Nsb3QsCisrCQkJeyAiRTEgU3Vic2xvdCIsICJvbWwuZm9tLmF0dHIuYWJpc19jaC5zdWJzbG90IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2dzbV90aW1lLAorKwkJCXsgIkdTTSBUaW1lIiwgIm9tbC5mb20uYXR0ci5nc21fdGltZSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIkdTTSBUaW1lIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfY2hhbl9jb21iLAorKwkJCXsgIkNoYW5uZWwgQ29tYmluYXRpb24iLCAib21sLmZvbS5hdHRyLmNoYW5fY29tYiIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2NoYW5fY29tYl92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQkvKiBJUCBBY2Nlc3MgKi8KKysJCXsgJmhmX29tbF9pcGFfdHJlc19hdHRyX3RhZywKKysJCQl7ICJJUEEgVGVzdCBSZXN1bHQgRW1iZWRkZWQgSUUiLAorKwkJCQkJCSJvbWwuZm9tLnRlc3RyZXAuaXBhX3RhZyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMoaXBhY2NfdGVzdHJlc19pZV92YWxzKSwgMCwKKysJCQkgICJJbmZvcm1hdGlvbiBFbGVtZW50IGVtYmVkZGVkIGludG8gdGhlIFRlc3QgUmVzdWx0ICIKKysJCQkgICJvZiBpcC5hY2Nlc3MgQlRTIiwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9vbWxfaXBhX3RyZXNfYXR0cl9sZW4sCisrCQkJeyAiSVBBIFRlc3QgUmVzdWx0IEVtYmVkZGVkIElFIExlbmd0aCIsCisrCQkJCQkJIm9tbC5mb20udGVzdHJlcC5pcGFfbGVuIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiTGVuZ3RoIG9mIGlwLmFjY2VzcyBUZXN0IFJlc3VsdCBFbWJlZGRlZCBJRSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90ZXN0X3JlcywKKysJCQl7ICJJUEEgVGVzdCBSZXN1bHQiLCAib21sLmZvbS50ZXN0cmVwLnJlc3VsdCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIFZBTFMoaXBhY2NfdGVzdF9yZXNfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfcnhsZXYsCisrCQkJeyAiUnggTGV2ZWwiLCAib21sLmZvbS50ZXN0cmVwLmlwYV9yeGxldiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweGZjMDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9iX3J4bGV2LAorKwkJCXsgIlJ4IExldmVsIiwgIm9tbC5mb20udGVzdHJlcC5pcGFfcnhsZXZfYiIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9hcmZjbiwKKysJCQl7ICJBUkZDTiIsICJvbWwuZm9tLnRlc3RyZXAuaXBhX2FyZmNuIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4MDNmZiwgIkFSRkNOIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2ZfcXVhbCwKKysJCQl7ICJGcmVxdWVuY3kgUXVhbGl0eSIsICJvbWwuZm9tLnRlc3RyZXAuaXBhLmZyZXFfcXVhbCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDB4ZmMsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9mX2VyciwKKysJCQl7ICJGcmVxdWVuY3kgRXJyb3IiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5mcmVxX2VyciIsCisrCQkJICBGVF9JTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9yeHF1YWwsCisrCQkJeyAiUnggUXVhbGl0eSIsICJvbWwuZm9tLnRlc3RyZXAuaXBhLnJ4X3F1YWwiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAweDcsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9mcmFtZV9vZmZzLAorKwkJCXsgIkZyYW1lIE9mZnNldCIsICJvbWwuZm9tLnRlc3RyZXAuaXBhLmZyYW1lX29mZnNldCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfZnJhbWVucl9vZmZzLAorKwkJCXsgIkZyYW1lIE51bWJlciBPZmZzZXQiLAorKwkJCQkJIm9tbC5mb20udGVzdHJlcC5pcGEuZnJhbWVucl9vZmZzZXQiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2JzaWMsCisrCQkJeyAiQlNJQyIsICJvbWwuZm9tLnRlc3RyZXAuaXBhLmJzaWMiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAweDNmLAorKwkJCSAgIkJhc2UgU3RhdGlvbiBJZGVudGl0eSBDb2RlIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2NlbGxfaWQsCisrCQkJeyAiQ2VsbCBJRCIsICJvbWwuZm9tLnRlc3RyZXAuaXBhLmNlbGxfaWQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0hFWCwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3JzbF9pcCwKKysJCQl7ICJCU0MgUlNMIElQIEFkZHJlc3MiLCAib21sLmZvbS5hdHRyLmlwYS5yc2xfaXAiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAwLAorKwkJCSAgIklQIEFkZHJlc3MgdG8gd2hpY2ggdGhlIEJUUyBlc3RhYmxpc2hlcyAiCisrCQkJICAidGhlIFJTTCBsaW5rIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3JzbF9wb3J0LAorKwkJCXsgIkJTQyBSU0wgVENQIFBvcnQiLCAib21sLmZvbS5hdHRyLmlwYS5yc2xfcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIlBvcnQgbnVtYmVyIHRvIHdoaWNoIHRoZSBCU1QgZXN0YWJsaXNoZXMgIgorKwkJCSAgInRoZSBSU0wgbGluayIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9wcmltX29tbF9pcCwKKysJCQl7ICJQcmltYXJ5IE9NTCBJUCBBZGRyZXNzIiwKKysJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLnByaW1fb21sX2lwIiwKKysJCQkgIEZUX0lQdjQsIEJBU0VfTk9ORSwgTlVMTCwgMCwKKysJCQkgICJJUCBBZGRyZXNzIG9mIHRoZSBCU0MgZm9yIHRoZSBwcmltYXJ5IE9NTCBsaW5rIiwKKysJCQkgIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9wcmltX29tbF9wb3J0LAorKwkJCXsgIlByaW1hcnkgT01MIFRDUCBQb3J0IiwKKysJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLnByaW1fb21sX3BvcnQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJUQ1AgUG9ydCBvZiB0aGUgQlNDIGZvciB0aGUgcHJpbWFybHkgT01MIGxpbmsiLAorKwkJCSAgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX2xvY2F0aW9uX25hbWUsCisrCQkJeyAiTG9jYXRpb24gTmFtZSIsICJvbWwuZm9tLmF0dHIuaXBhLmxvY19uYW1lIiwKKysJCQkgIEZUX1NUUklORywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdW5pdF9uYW1lLAorKwkJCXsgIlVuaXQgTmFtZSIsICJvbWwuZm9tLmF0dHIuaXBhLnVuaXRfbmFtZSIsCisrCQkJICBGVF9TVFJJTkcsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3VuaXRfaWQsCisrCQkJeyAiVW5pdCBJRCIsICJvbWwuZm9tLmF0dHIuaXBhLnVuaXRfaWQiLAorKwkJCSAgRlRfU1RSSU5HLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9udl9mbGFncywKKysJCQl7ICJOVlJBTSBDb25maWcgRmxhZ3MiLCAib21sLmZvbS5hdHRyLmlwYS5udl9mbGFncyIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfSEVYLCBOVUxMLCAweGZmZmYsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9udl9tYXNrLAorKwkJCXsgIk5WUkFNIENvbmZpZyBNYXNrIiwgIm9tbC5mb20uYXR0ci5pcGEubnZfbWFzayIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfSEVYLCBOVUxMLCAweGZmZmYsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9zaTIsCisrCQkJeyAiU3lzdGVtIEluZm9ybWF0aW9uIDIiLCAib21sLmZvbS5hdHRyLmlwYS5zaTIiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3NpMmJpcywKKysJCQl7ICJTeXN0ZW0gSW5mb3JtYXRpb24gMmJpcyIsICJvbWwuZm9tLmF0dHIuaXBhLnNpMmJpcyIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfc2kydGVyLAorKwkJCXsgIlN5c3RlbSBJbmZvcm1hdGlvbiAydGVyIiwgIm9tbC5mb20uYXR0ci5pcGEuc2kydGVyIiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9jaGFuX2Rlc2MsCisrCQkJeyAiQ2VsbCBDaGFubmVsIERlc2NyaXB0aW9uIiwKKysJCQkJCQkib21sLmZvbS5hdHRyLmlwYS5jaGFuX2Rlc2MiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX25zbF9zcG9ydCwKKysJCQl7ICJOUyBMaW5rIElQIFNvdXJjZSBQb3J0IiwKKysJCQkJCQkib21sLmZvbS5hdHRyLmlwYS5uc2xfc3BvcnQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX25zbF9kYWRkciwKKysJCQl7ICJOUyBMaW5rIElQIERlc3RpbmF0aW9uIEFkZHIiLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLm5zbF9kYWRkciIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc2xfZHBvcnQsCisrCQkJeyAiTlMgTGluayBJUCBEZXN0aW5hdGlvbiBQb3J0IiwKKysJCQkJCQkib21sLmZvbS5hdHRyLmlwYS5uc2xfZHBvcnQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX25zZWksCisrCQkJeyAiTlNFSSIsICJvbWwuZm9tLmF0dHIuaXBhLm5zZWkiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX25zdmNpLAorKwkJCXsgIk5TVkNJIiwgIm9tbC5mb20uYXR0ci5pcGEubnN2Y2kiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX2J2Y2ksCisrCQkJeyAiQlZDSSIsICJvbWwuZm9tLmF0dHIuaXBhLmJ2Y2kiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3JhYywKKysJCQl7ICJSQUMiLCAib21sLmZvbS5hdHRyLmlwYS5yYWMiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBOVUxMLCAwLAorKwkJCSAgIlJvdXRpbmcgQXJlYSBDb2RlIiwgSEZJTEwgfQorKwkJfSwKKysJfTsKKysJc3RhdGljIGdpbnQgKmV0dFtdID0geworKwkJJmV0dF9vbWwsCisrCQkmZXR0X29tbF9mb20sCisrCQkmZXR0X29tbF9mb21fYXR0LAorKwl9OworKworKwltb2R1bGVfdCAqb21sX21vZHVsZTsKKysKKysJcHJvdG9fYWJpc19vbWwgPSBwcm90b19yZWdpc3Rlcl9wcm90b2NvbCgiR1NNIEEtYmlzIE9NTCIsICJPTUwiLAorKwkJCQkJCSAiZ3NtX2FiaXNfb21sIik7CisrCisrCXByb3RvX3JlZ2lzdGVyX2ZpZWxkX2FycmF5KHByb3RvX2FiaXNfb21sLCBoZiwgYXJyYXlfbGVuZ3RoKGhmKSk7CisrCisrCXByb3RvX3JlZ2lzdGVyX3N1YnRyZWVfYXJyYXkoZXR0LCBhcnJheV9sZW5ndGgoZXR0KSk7CisrCisrCXJlZ2lzdGVyX2Rpc3NlY3RvcigiZ3NtX2FiaXNfb21sIiwgZGlzc2VjdF9hYmlzX29tbCwgcHJvdG9fYWJpc19vbWwpOworKworKworKwlvbWxfbW9kdWxlID0gcHJlZnNfcmVnaXN0ZXJfcHJvdG9jb2wocHJvdG9fYWJpc19vbWwsIHByb3RvX3JlZ19oYW5kb2ZmX2FiaXNfb21sKTsKKysJcHJlZnNfcmVnaXN0ZXJfYm9vbF9wcmVmZXJlbmNlKG9tbF9tb2R1bGUsICJ1c2VfaXBhY2Nlc3Nfb21sIiwKKysJCSAgICAiVXNlIG5hbm9CVFMgZGVmaW5pdGlvbnMiLAorKwkJICAgICJVc2UgaXBhY2Nlc3MgbmFub0JUUyBzcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgT01MIiwKKysJCSAgICAmZ2xvYmFsX29tbF91c2VfbmFub19idHMpOworK30KKysKKyt2b2lkCisrcHJvdG9fcmVnX2hhbmRvZmZfYWJpc19vbWwodm9pZCkKKyt7CisrCWRpc3NlY3Rvcl9oYW5kbGVfdCBhYmlzX29tbF9oYW5kbGU7CisrCisrCWFiaXNfb21sX2hhbmRsZSA9IGNyZWF0ZV9kaXNzZWN0b3JfaGFuZGxlKGRpc3NlY3RfYWJpc19vbWwsIHByb3RvX2FiaXNfb21sKTsKKysJZGlzc2VjdG9yX2FkZCgibGFwZC5nc20uc2FwaSIsIExBUERfR1NNX1NBUElfT01fUFJPQywgYWJpc19vbWxfaGFuZGxlKTsKKyt9CitkaWZmIC0tZ2l0IGEvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuaCBiL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmgKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5kNTIzZTk2CistLS0gL2Rldi9udWxsCisrKysgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oCitAQCAtMCwwICsxLDc4NyBAQAorKy8qIEdTTSBOZXR3b3JrIE1hbmFnZW1lbnQgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorKyAqIDNHUFAgVFMgMTIuMjEgdmVyc2lvbiA4LjAuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA2MjMgVjguMC4wICovCisrCisrLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisrICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKysgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAqCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKysgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisrICoKKysgKi8KKysKKysjaWZuZGVmIF9fUEFDS0VUX0FCSVNfT01MX0hfXworKyNkZWZpbmUgX19QQUNLRVRfQUJJU19PTUxfSF9fCisrCisrI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorKworKy8qIEZyb20gb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oICovCisrCisrLyogZ2VuZXJpYyBoZWFkZXIgaW4gZnJvbnQgb2YgZXZlcnkgT01MIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIFRTIDA4LjU5ICovCisrc3RydWN0IGFiaXNfb21faGRyIHsKKysJZ3VpbnQ4CW1kaXNjOworKwlndWludDgJcGxhY2VtZW50OworKwlndWludDgJc2VxdWVuY2U7CisrCWd1aW50OAlsZW5ndGg7CisrCWd1aW50OAlkYXRhWzBdOworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworKyNkZWZpbmUgQUJJU19PTV9NRElTQ19GT00JCTB4ODAKKysjZGVmaW5lIEFCSVNfT01fTURJU0NfTU1JCQkweDQwCisrI2RlZmluZSBBQklTX09NX01ESVNDX1RSQVUJCTB4MjAKKysjZGVmaW5lIEFCSVNfT01fTURJU0NfTUFOVUYJCTB4MTAKKysjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX09OTFkJCTB4ODAKKysjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX0ZJUlNUIAkweDQwCisrI2RlZmluZSBBQklTX09NX1BMQUNFTUVOVF9NSURETEUJMHgyMAorKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfTEFTVAkJMHgxMAorKworK3N0cnVjdCBhYmlzX29tX29ial9pbnN0IHsKKysJZ3VpbnQ4CWJ0c19ucjsKKysJZ3VpbnQ4CXRyeF9ucjsKKysJZ3VpbnQ4CXRzX25yOworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworK3N0cnVjdCBhYmlzX29tX2ZvbV9oZHIgeworKwlndWludDgJbXNnX3R5cGU7CisrCWd1aW50OAlvYmpfY2xhc3M7CisrCXN0cnVjdCBhYmlzX29tX29ial9pbnN0CW9ial9pbnN0OworKwlndWludDgJZGF0YVswXTsKKyt9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKysKKysjZGVmaW5lIEFCSVNfT01fRk9NX0hEUl9TSVpFCShzaXplb2Yoc3RydWN0IGFiaXNfb21faGRyKSArIHNpemVvZihzdHJ1Y3QgYWJpc19vbV9mb21faGRyKSkKKysKKysvKiBTZWN0aW9uIDkuMTogTWVzc2FnZSBUeXBlcyAqLworK2VudW0gYWJpc19ubV9tc2d0eXBlIHsKKysJLyogU1cgRG93bmxvYWQgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9MT0FEX0lOSVQJCQk9IDB4MDEsCisrCU5NX01UX0xPQURfSU5JVF9BQ0ssCisrCU5NX01UX0xPQURfSU5JVF9OQUNLLAorKwlOTV9NVF9MT0FEX1NFRywKKysJTk1fTVRfTE9BRF9TRUdfQUNLLAorKwlOTV9NVF9MT0FEX0FCT1JULAorKwlOTV9NVF9MT0FEX0VORCwKKysJTk1fTVRfTE9BRF9FTkRfQUNLLAorKwlOTV9NVF9MT0FEX0VORF9OQUNLLAorKwlOTV9NVF9TV19BQ1RfUkVRLAkJLyogQlRTLT5CU0MgKi8KKysJTk1fTVRfU1dfQUNUX1JFUV9BQ0ssCisrCU5NX01UX1NXX0FDVF9SRVFfTkFDSywKKysJTk1fTVRfQUNUSVZBVEVfU1csCQkvKiBCU0MtPkJUUyAqLworKwlOTV9NVF9BQ1RJVkFURV9TV19BQ0ssCisrCU5NX01UX0FDVElWQVRFX1NXX05BQ0ssCisrCU5NX01UX1NXX0FDVElWQVRFRF9SRVAsCQkvKiAweDEwICovCisrCS8qIEEtYmlzIEludGVyZmFjZSBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX0VTVEFCTElTSF9URUkJCT0gMHgyMSwKKysJTk1fTVRfRVNUQUJMSVNIX1RFSV9BQ0ssCisrCU5NX01UX0VTVEFCTElTSF9URUlfTkFDSywKKysJTk1fTVRfQ09OTl9URVJSX1NJR04sCisrCU5NX01UX0NPTk5fVEVSUl9TSUdOX0FDSywKKysJTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywKKysJTk1fTVRfRElTQ19URVJSX1NJR04sCisrCU5NX01UX0RJU0NfVEVSUl9TSUdOX0FDSywKKysJTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywKKysJTk1fTVRfQ09OTl9URVJSX1RSQUYsCisrCU5NX01UX0NPTk5fVEVSUl9UUkFGX0FDSywKKysJTk1fTVRfQ09OTl9URVJSX1RSQUZfTkFDSywKKysJTk1fTVRfRElTQ19URVJSX1RSQUYsCisrCU5NX01UX0RJU0NfVEVSUl9UUkFGX0FDSywKKysJTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywKKysJLyogVHJhbnNtaXNzaW9uIE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfQ09OTl9NRFJPUF9MSU5LCQk9IDB4MzEsCisrCU5NX01UX0NPTk5fTURST1BfTElOS19BQ0ssCisrCU5NX01UX0NPTk5fTURST1BfTElOS19OQUNLLAorKwlOTV9NVF9ESVNDX01EUk9QX0xJTkssCisrCU5NX01UX0RJU0NfTURST1BfTElOS19BQ0ssCisrCU5NX01UX0RJU0NfTURST1BfTElOS19OQUNLLAorKwkvKiBBaXIgSW50ZXJmYWNlIE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfU0VUX0JUU19BVFRSCQk9IDB4NDEsCisrCU5NX01UX1NFVF9CVFNfQVRUUl9BQ0ssCisrCU5NX01UX1NFVF9CVFNfQVRUUl9OQUNLLAorKwlOTV9NVF9TRVRfUkFESU9fQVRUUiwKKysJTk1fTVRfU0VUX1JBRElPX0FUVFJfQUNLLAorKwlOTV9NVF9TRVRfUkFESU9fQVRUUl9OQUNLLAorKwlOTV9NVF9TRVRfQ0hBTl9BVFRSLAorKwlOTV9NVF9TRVRfQ0hBTl9BVFRSX0FDSywKKysJTk1fTVRfU0VUX0NIQU5fQVRUUl9OQUNLLAorKwkvKiBUZXN0IE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfUEVSRl9URVNUCQkJPSAweDUxLAorKwlOTV9NVF9QRVJGX1RFU1RfQUNLLAorKwlOTV9NVF9QRVJGX1RFU1RfTkFDSywKKysJTk1fTVRfVEVTVF9SRVAsCisrCU5NX01UX1NFTkRfVEVTVF9SRVAsCisrCU5NX01UX1NFTkRfVEVTVF9SRVBfQUNLLAorKwlOTV9NVF9TRU5EX1RFU1RfUkVQX05BQ0ssCisrCU5NX01UX1NUT1BfVEVTVCwKKysJTk1fTVRfU1RPUF9URVNUX0FDSywKKysJTk1fTVRfU1RPUF9URVNUX05BQ0ssCisrCS8qIFN0YXRlIE1hbmFnZW1lbnQgYW5kIEV2ZW50IFJlcG9ydCBNZXNzYWdlcyAqLworKwlOTV9NVF9TVEFURUNIR19FVkVOVF9SRVAJPSAweDYxLAorKwlOTV9NVF9GQUlMVVJFX0VWRU5UX1JFUCwKKysJTk1fTVRfU1RPUF9FVkVOVF9SRVAsCisrCU5NX01UX1NUT1BfRVZFTlRfUkVQX0FDSywKKysJTk1fTVRfU1RPUF9FVkVOVF9SRVBfTkFDSywKKysJTk1fTVRfUkVTVF9FVkVOVF9SRVAsCisrCU5NX01UX1JFU1RfRVZFTlRfUkVQX0FDSywKKysJTk1fTVRfUkVTVF9FVkVOVF9SRVBfTkFDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURSwKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0ssCisrCU5NX01UX0NIR19BRE1fU1RBVEVfTkFDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVEsCisrCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRX0FDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfTkFDSywKKysJTk1fTVRfUkVQX09VVFNUX0FMQVJNUwkJPSAweDkzLAorKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX0FDSywKKysJTk1fTVRfUkVQX09VVFNUX0FMQVJNU19OQUNLLAorKwkvKiBFcXVpcG1lbnQgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9DSEFOR0VPVkVSCQk9IDB4NzEsCisrCU5NX01UX0NIQU5HRU9WRVJfQUNLLAorKwlOTV9NVF9DSEFOR0VPVkVSX05BQ0ssCisrCU5NX01UX09QU1RBUlQsCisrCU5NX01UX09QU1RBUlRfQUNLLAorKwlOTV9NVF9PUFNUQVJUX05BQ0ssCisrCU5NX01UX1JFSU5JVCwKKysJTk1fTVRfUkVJTklUX0FDSywKKysJTk1fTVRfUkVJTklUX05BQ0ssCisrCU5NX01UX1NFVF9TSVRFX09VVCwJCS8qIEJTMTE6IGdldCBhbGFybSA/IT8gKi8KKysJTk1fTVRfU0VUX1NJVEVfT1VUX0FDSywKKysJTk1fTVRfU0VUX1NJVEVfT1VUX05BQ0ssCisrCU5NX01UX0NIR19IV19DT05GCQk9IDB4OTAsCisrCU5NX01UX0NIR19IV19DT05GX0FDSywKKysJTk1fTVRfQ0hHX0hXX0NPTkZfTkFDSywKKysJLyogTWVhc3VyZW1lbnQgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9NRUFTX1JFU19SRVEJCT0gMHg4YSwKKysJTk1fTVRfTUVBU19SRVNfUkVTUCwKKysJTk1fTVRfU1RPUF9NRUFTLAorKwlOTV9NVF9TVEFSVF9NRUFTLAorKwkvKiBPdGhlciBNZXNzYWdlcyAqLworKwlOTV9NVF9HRVRfQVRUUgkJCT0gMHg4MSwKKysJTk1fTVRfR0VUX0FUVFJfUkVTUCwKKysJTk1fTVRfR0VUX0FUVFJfTkFDSywKKysJTk1fTVRfU0VUX0FMQVJNX1RIUkVTLAorKwlOTV9NVF9TRVRfQUxBUk1fVEhSRVNfQUNLLAorKwlOTV9NVF9TRVRfQUxBUk1fVEhSRVNfTkFDSywKKysKKysJTk1fTVRfSVBBQ0NfUkVTVEFSVAkJPSAweDg3LAorKwlOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSywKKyt9OworKworK2VudW0gYWJpc19ubV9tc2d0eXBlX2JzMTEgeworKwlOTV9NVF9CUzExX1JFU0VUX1JFU09VUkNFCT0gMHg3NCwKKysKKysJTk1fTVRfQlMxMV9CRUdJTl9EQl9UWAkJPSAweGEzLAorKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX0FDSywKKysJTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9OQUNLLAorKwlOTV9NVF9CUzExX0VORF9EQl9UWAkJPSAweGE2LAorKwlOTV9NVF9CUzExX0VORF9EQl9UWF9BQ0ssCisrCU5NX01UX0JTMTFfRU5EX0RCX1RYX05BQ0ssCisrCU5NX01UX0JTMTFfQ1JFQVRFX09CSgkJPSAweGE5LAorKwlOTV9NVF9CUzExX0NSRUFURV9PQkpfQUNLLAorKwlOTV9NVF9CUzExX0NSRUFURV9PQkpfTkFDSywKKysJTk1fTVRfQlMxMV9ERUxFVEVfT0JKCQk9IDB4YWMsCisrCU5NX01UX0JTMTFfREVMRVRFX09CSl9BQ0ssCisrCU5NX01UX0JTMTFfREVMRVRFX09CSl9OQUNLLAorKworKwlOTV9NVF9CUzExX1NFVF9BVFRSCQk9IDB4ZDAsCisrCU5NX01UX0JTMTFfU0VUX0FUVFJfQUNLLAorKwlOTV9NVF9CUzExX1NFVF9BVFRSX05BQ0ssCisrCU5NX01UX0JTMTFfTE1UX1NFU1NJT04JCT0gMHhkYywKKysKKysJTk1fTVRfQlMxMV9HRVRfU1RBVEUJCT0gMHhlMywKKysJTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLLAorKwlOTV9NVF9CUzExX0xNVF9MT0dPTgkJPSAweGU1LAorKwlOTV9NVF9CUzExX0xNVF9MT0dPTl9BQ0ssCisrCU5NX01UX0JTMTFfUkVTVEFSVAkJPSAweGU3LAorKwlOTV9NVF9CUzExX1JFU1RBUlRfQUNLLAorKwlOTV9NVF9CUzExX0RJU0NPTk5FQ1QJCT0gMHhlOSwKKysJTk1fTVRfQlMxMV9ESVNDT05ORUNUX0FDSywKKysJTk1fTVRfQlMxMV9MTVRfTE9HT0ZGCQk9IDB4ZWMsCisrCU5NX01UX0JTMTFfTE1UX0xPR09GRl9BQ0ssCisrCU5NX01UX0JTMTFfUkVDT05ORUNUCQk9IDB4ZjEsCisrCU5NX01UX0JTMTFfUkVDT05ORUNUX0FDSywKKyt9OworKworK2VudW0gYWJpc19ubV9tc2d0eXBlX2lwYWNjIHsKKysJTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1QJCT0gMHhlMCwKKysJTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfQUNLLAorKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLLAorKwlOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVAk9IDB4ZTMsCisrCU5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX0FDSywKKysJTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfTkFDSywKKysJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGCQk9IDB4ZTYsCisrCU5NX01UX0lQQUNDX0NPTk5fVFJBRl9BQ0ssCisrCU5NX01UX0lQQUNDX0NPTk5fVFJBRl9OQUNLLAorKwlOTV9NVF9JUEFDQ19ESVNDX1RSQUYJCT0gMHhlOSwKKysJTk1fTVRfSVBBQ0NfRElTQ19UUkFGX0FDSywKKysJTk1fTVRfSVBBQ0NfRElTQ19UUkFGX05BQ0ssCisrCU5NX01UX0lQQUNDX0RFRl9CT09UX1NXCQk9IDB4ZWMsCisrCU5NX01UX0lQQUNDX0RFRl9CT09UX1NXX0FDSywKKysJTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfTkFDSywKKysJTk1fTVRfSVBBQ0NfU0VUX05WQVRUUgkJPSAweGVmLAorKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX0FDSywKKysJTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9OQUNLLAorKwlOTV9NVF9JUEFDQ19HRVRfTlZBVFRSCQk9IDB4ZjIsCisrCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfQUNLLAorKwlOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX05BQ0ssCisrCU5NX01UX0lQQUNDX1NFVF9BVFRSCQk9IDB4ZjUsCisrCU5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSywKKysJTk1fTVRfSVBBQ0NfU0VUX0FUVFJfTkFDSywKKysJTk1fTVRfSVBBQ0NfQVRUUl9DSEdfRVZUCT0gMHhmOCwKKysJTk1fTVRfSVBBQ0NfU1dfREVBQ1QJCT0gMHhmOSwKKysJTk1fTVRfSVBBQ0NfU1dfREVBQ1RfQUNLLAorKwlOTV9NVF9JUEFDQ19TV19ERUFDVF9OQUNLLAorKwlOTV9NVF9JUEFDQ19NRUFTX1JFU19SRVFfTkFDSwk9IDB4ZmMsCisrCU5NX01UX0lQQUNDX1NUQVJUX01FQVNfTkFDSywKKysJTk1fTVRfSVBBQ0NfU1RPUF9NRUFTX05BQ0ssCisrfTsKKysKKytlbnVtIGFiaXNfbm1fYnMxMV9jZWxsX2FsbG9jIHsKKysJTk1fQlMxMV9DQU5SX0dTTQk9IDB4MDAsCisrCU5NX0JTMTFfQ0FOUl9EQ1MxODAwCT0gMHgwMSwKKyt9OworKworKy8qIFNlY3Rpb24gOS4yOiBPYmplY3QgQ2xhc3MgKi8KKytlbnVtIGFiaXNfbm1fb2JqX2NsYXNzIHsKKysJTk1fT0NfU0lURV9NQU5BR0VSCQk9IDB4MDAsCisrCU5NX09DX0JUUywKKysJTk1fT0NfUkFESU9fQ0FSUklFUiwKKysJTk1fT0NfQ0hBTk5FTCwKKysJTk1fT0NfQkFTRUJfVFJBTlNDLAorKwkvKiBSRlU6IDA1LUZFICovCisrCU5NX09DX0JTMTFfQURKQwkJCT0gMHhhMCwKKysJTk1fT0NfQlMxMV9IQU5ET1ZFUgkJPSAweGExLAorKwlOTV9PQ19CUzExX1BXUl9DVFJMCQk9IDB4YTIsCisrCU5NX09DX0JTMTFfQlRTRQkJCT0gMHhhMywJCS8qIExNVD8gKi8KKysJTk1fT0NfQlMxMV9SQUNLCQkJPSAweGE0LAorKwlOTV9PQ19CUzExCQkJPSAweGE1LAkJLyogMDE6IEFMQ08gKi8KKysJTk1fT0NfQlMxMV9URVNUCQkJPSAweGE2LAorKwlOTV9PQ19CUzExX0VOVkFCVFNFCQk9IDB4YTgsCisrCU5NX09DX0JTMTFfQlBPUlQJCT0gMHhhOSwKKysKKysJTk1fT0NfR1BSU19OU0UJCQk9IDB4ZjAsCisrCU5NX09DX0dQUlNfQ0VMTAkJCT0gMHhmMSwKKysJTk1fT0NfR1BSU19OU1ZDMAkJPSAweGYyLAorKwlOTV9PQ19HUFJTX05TVkMxCQk9IDB4ZjMsCisrCisrCU5NX09DX05VTEwJCQk9IDB4ZmYsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNDogQXR0cmlidXRlcyAqLworK2VudW0gYWJpc19ubV9hdHRyIHsKKysJTk1fQVRUX0FCSVNfQ0hBTk5FTAk9IDB4MDEsCisrCU5NX0FUVF9BRERfSU5GTywKKysJTk1fQVRUX0FERF9URVhULAorKwlOTV9BVFRfQURNX1NUQVRFLAorKwlOTV9BVFRfQVJGQ05fTElTVCwKKysJTk1fQVRUX0FVVE9OX1JFUE9SVCwKKysJTk1fQVRUX0FWQUlMX1NUQVRVUywKKysJTk1fQVRUX0JDQ0hfQVJGQ04sCisrCU5NX0FUVF9CU0lDLAorKwlOTV9BVFRfQlRTX0FJUl9USU1FUiwKKysJTk1fQVRUX0NDQ0hfTF9JX1AsCisrCU5NX0FUVF9DQ0NIX0xfVCwKKysJTk1fQVRUX0NIQU5fQ09NQiwKKysJTk1fQVRUX0NPTk5fRkFJTF9DUklULAorKwlOTV9BVFRfREVTVCwKKysJLyogcmVzICovCisrCU5NX0FUVF9FVkVOVF9UWVBFCT0gMHgxMSwgLyogQlMxMTogZmlsZSBkYXRhID8hPyAqLworKwlOTV9BVFRfRklMRV9JRCwKKysJTk1fQVRUX0ZJTEVfVkVSU0lPTiwKKysJTk1fQVRUX0dTTV9USU1FLAorKwlOTV9BVFRfSFNOLAorKwlOTV9BVFRfSFdfQ09ORklHLAorKwlOTV9BVFRfSFdfREVTQywKKysJTk1fQVRUX0lOVEFWRV9QQVJBTSwKKysJTk1fQVRUX0lOVEVSRl9CT1VORCwKKysJTk1fQVRUX0xJU1RfUkVRX0FUVFIsCisrCU5NX0FUVF9NQUlPLAorKwlOTV9BVFRfTUFOVUZfU1RBVEUsCisrCU5NX0FUVF9NQU5VRl9USFJFU0gsCisrCU5NX0FUVF9NQU5VRl9JRCwKKysJTk1fQVRUX01BWF9UQSwKKysJTk1fQVRUX01EUk9QX0xJTkssCS8qIDB4MjAgKi8KKysJTk1fQVRUX01EUk9QX05FWFQsCisrCU5NX0FUVF9OQUNLX0NBVVNFUywKKysJTk1fQVRUX05ZMSwKKysJTk1fQVRUX09QRVJfU1RBVEUsCisrCU5NX0FUVF9PVkVSTF9QRVJJT0QsCisrCU5NX0FUVF9QSFlTX0NPTkYsCisrCU5NX0FUVF9QT1dFUl9DTEFTUywKKysJTk1fQVRUX1BPV0VSX1RIUkVTSCwKKysJTk1fQVRUX1BST0JfQ0FVU0UsCisrCU5NX0FUVF9SQUNIX0JfVEhSRVNILAorKwlOTV9BVFRfTERBVkdfU0xPVFMsCisrCU5NX0FUVF9SQURfU1VCQywKKysJTk1fQVRUX1JGX01BWFBPV1JfUiwKKysJTk1fQVRUX1NJVEVfSU5QVVRTLAorKwlOTV9BVFRfU0lURV9PVVRQVVRTLAorKwlOTV9BVFRfU09VUkNFLAkJLyogMHgzMCAqLworKwlOTV9BVFRfU1BFQ19QUk9CLAorKwlOTV9BVFRfU1RBUlRfVElNRSwKKysJTk1fQVRUX1QyMDAsCisrCU5NX0FUVF9URUksCisrCU5NX0FUVF9URVNUX0RVUiwKKysJTk1fQVRUX1RFU1RfTk8sCisrCU5NX0FUVF9URVNUX1JFUE9SVCwKKysJTk1fQVRUX1ZTV1JfVEhSRVNILAorKwlOTV9BVFRfV0lORE9XX1NJWkUsCisrCS8qIFJlcyAgKi8KKysJTk1fQVRUX0JTMTFfUlNTSV9PRkZTCT0gMHgzZCwKKysJTk1fQVRUX0JTMTFfVFhQV1IJPSAweDNlLAorKwlOTV9BVFRfQlMxMV9ESVZFUlNJVFkJPSAweDNmLAorKwkvKiBSZXMgICovCisrCU5NX0FUVF9UU0MJCT0gMHg0MCwKKysJTk1fQVRUX1NXX0NPTkZJRywKKysJTk1fQVRUX1NXX0RFU0NSLAorKwlOTV9BVFRfU0VWRVJJVFksCisrCU5NX0FUVF9HRVRfQVJJLAorKwlOTV9BVFRfSFdfQ09ORl9DSEcsCisrCU5NX0FUVF9PVVRTVF9BTEFSTSwKKysJTk1fQVRUX0ZJTEVfREFUQSwKKysJTk1fQVRUX01FQVNfUkVTLAorKwlOTV9BVFRfTUVBU19UWVBFLAorKworKwlOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OTwk9IDB4NGMsCisrCU5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PCT0gMHg0ZiwKKysKKysJTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwJPSAweDU1LAorKwlOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UJPSAweDU4LAorKworKwlOTV9BVFRfQlMxMV9BTExfVEVTVF9DQVRHCT0gMHg2MCwKKysJTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywKKysJTk1fQVRUX0JTMTFfQ0VMTF9BTExPQ19OUiwKKysJTk1fQVRUX0JTMTFfQ0VMTF9HTE9CQUxfSUQsCisrCU5NX0FUVF9CUzExX0VOQV9JTlRFUkZfQ0xBU1MJPSAweDY2LAorKwlOTV9BVFRfQlMxMV9FTkFfSU5UX0lOVEVDX0hBTkRPCT0gMHg2NywKKysJTk1fQVRUX0JTMTFfRU5BX0lOVF9JTlRSQ19IQU5ETwk9IDB4NjgsCisrCU5NX0FUVF9CUzExX0VOQV9NU19QV1JfQ1RSTAk9IDB4NjksCisrCU5NX0FUVF9CUzExX0VOQV9QV1JfQkRHVF9ITwk9IDB4NmEsCisrCU5NX0FUVF9CUzExX0VOQV9QV1JfQ1RSTF9STEZXCT0gMHg2YiwKKysJTk1fQVRUX0JTMTFfRU5BX1JYTEVWX0hPCT0gMHg2YywKKysJTk1fQVRUX0JTMTFfRU5BX1JYUVVBTF9ITwk9IDB4NmQsCisrCU5NX0FUVF9CUzExX0ZBQ0NIX1FVQUwJCT0gMHg2ZSwKKysKKysJTk1fQVRUX0lQQUNDX0RTVF9JUAkJPSAweDgwLAorKwlOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlQJPSAweDgxLAorKwlOTV9BVFRfSVBBQ0NfU1NSQwkJPSAweDgyLAkJLyogUlRQIFN5bmMgU291cmNlICovCisrCU5NX0FUVF9JUEFDQ19SVFBfUEFZTERfVFlQRQk9IDB4ODMsCisrCU5NX0FUVF9JUEFDQ19CQVNFQl9JRAkJPSAweDg0LAorKwlOTV9BVFRfSVBBQ0NfU1RSRUFNX0lECQk9IDB4ODUsCisrCU5NX0FUVF9JUEFDQ19OVl9GTEFHUwkJPSAweDg2LAorKwlOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMCQk9IDB4ODcsCisrCU5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkcJPSAweDg4LAorKwlOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkcJPSAweDg5LAorKwlOTV9BVFRfSVBBQ0NfSVBfSUZfQ0ZHCQk9IDB4OGEsCQkvKiBJUCBpbnRlcmZhY2UgKi8KKysJTk1fQVRUX0lQQUNDX0lQX0dXX0NGRwkJPSAweDhiLAkJLyogSVAgZ2F0ZXdheSAqLworKwlOTV9BVFRfSVBBQ0NfSU5fU0VSVl9USU1FCT0gMHg4YywKKysJTk1fQVRUX0lQQUNDX1RSWF9CVFNfQVNTCT0gMHg4ZCwKKysJTk1fQVRUX0lQQUNDX0xPQ0FUSU9OCQk9IDB4OGUsCQkvKiBzdHJpbmcgZGVzY3JpYmluZyBsb2NhdGlvbiAqLworKwlOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGRwkJPSAweDhmLAorKwlOTV9BVFRfSVBBQ0NfRklMRV9EQVRBCQk9IDB4OTAsCisrCU5NX0FUVF9JUEFDQ19VTklUX0lECQk9IDB4OTEsCQkvKiBTaXRlL0JUUy9UUlggKi8KKysJTk1fQVRUX0lQQUNDX1BBUkVOVF9VTklUX0lECT0gMHg5MiwKKysJTk1fQVRUX0lQQUNDX1VOSVRfTkFNRQkJPSAweDkzLAkJLyogZGVmYXVsdDogbmJ0cy08bWFjLWFzLXN0cmluZz4gKi8KKysJTk1fQVRUX0lQQUNDX1NOTVBfQ0ZHCQk9IDB4OTQsCisrCU5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVAk9IDB4OTUsCisrCU5NX0FUVF9JUEFDQ19QUklNX09NTF9GQl9UT1VUCT0gMHg5NiwJCS8qIGZhbGxiYWNrIHRpbWVvdXQgKi8KKysJTk1fQVRUX0lQQUNDX0NVUl9TV19DRkcJCT0gMHg5NywKKysJTk1fQVRUX0lQQUNDX1RJTUlOR19CVVMJCT0gMHg5OCwKKysJTk1fQVRUX0lQQUNDX0NHSQkJPSAweDk5LAkJLyogQ2VsbCBHbG9iYWwgSUQgKi8KKysJTk1fQVRUX0lQQUNDX1JBQwkJPSAweDlhLAorKwlOTV9BVFRfSVBBQ0NfT0JKX1ZFUlNJT04JPSAweDliLAorKwlOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHCT0gMHg5YywKKysJTk1fQVRUX0lQQUNDX05TRUkJCT0gMHg5ZCwKKysJTk1fQVRUX0lQQUNDX0JWQ0kJCT0gMHg5ZSwKKysJTk1fQVRUX0lQQUNDX05TVkNJCQk9IDB4OWYsCisrCU5NX0FUVF9JUEFDQ19OU19DRkcJCT0gMHhhMCwKKysJTk1fQVRUX0lQQUNDX0JTU0dQX0NGRwkJPSAweGExLAorKwlOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkcJPSAweGEyLAorKwlOTV9BVFRfSVBBQ0NfUkxDX0NGRwkJPSAweGEzLAorKwlOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNUCT0gMHhhNCwKKysJTk1fQVRUX0lQQUNDX01PTklUX1ZBTF9MSVNUCT0gMHhhNSwKKysJTk1fQVRUX0lQQUNDX1RJQl9DT05UUk9MCT0gMHhhNiwKKysJTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVMJPSAweGE3LAorKwlOTV9BVFRfSVBBQ0NfQ09ESU5HX1NDSEVNRVMJPSAweGE4LAorKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18yCQk9IDB4YTksCisrCU5NX0FUVF9JUEFDQ19IRUFSVEJfVE9VVAk9IDB4YWEsCisrCU5NX0FUVF9JUEFDQ19VUFRJTUUJCT0gMHhhYiwKKysJTk1fQVRUX0lQQUNDX1JMQ19DRkdfMwkJPSAweGFjLAorKwlOTV9BVFRfSVBBQ0NfU1NMX0NGRwkJPSAweGFkLAorKwlOTV9BVFRfSVBBQ0NfU0VDX1BPU1NJQkxFCT0gMHhhZSwKKysJTk1fQVRUX0lQQUNDX0lNTF9TU0xfU1RBVEUJPSAweGFmLAorKwlOTV9BVFRfSVBBQ0NfUkVWT0NfREFURQkJPSAweGIwLAorKworKworKwlOTV9BVFRfQlMxMV9SRl9SRVNfSU5EX1BFUgk9IDB4OGYsCisrCisrCU5NX0FUVF9CUzExX1JYX0xFVl9NSU5fQ0VMTAk9IDB4OTAsCisrCU5NX0FUVF9CUzExX0FCSVNfRVhUX1RJTUUJPSAweDkxLAorKwlOTV9BVFRfQlMxMV9USU1FUl9IT19SRVFVRVNUCT0gMHg5MiwKKysJTk1fQVRUX0JTMTFfVElNRVJfTkNFTEwJCT0gMHg5MywKKysJTk1fQVRUX0JTMTFfVFNZTkMJCT0gMHg5NCwKKysJTk1fQVRUX0JTMTFfVFRSQVUJCT0gMHg5NSwKKysJTk1fQVRUX0JTMTFfRU1SR19DRkdfTUVNQkVSCT0gMHg5YiwKKysJTk1fQVRUX0JTMTFfVFJYX0FSRUEJCT0gMHg5ZiwKKysKKysJTk1fQVRUX0JTMTFfQkNDSF9SRUNPTkYJCT0gMHhkNywKKysJTk1fQVRUX0JTMTFfQklUX0VSUl9USEVTSAk9IDB4YTAsCisrCU5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUwk9IDB4YTEsCisrCU5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1kJPSAweGEzLAorKwlOTV9BVFRfQlMxMV9DQ0xLX1RZUEUJCT0gMHhhNCwKKysJTk1fQVRUX0JTMTFfSU5QX0lNUEVEQU5DRQk9IDB4YWEsCisrCU5NX0FUVF9CUzExX0wxX1BST1RfVFlQRQk9IDB4YWIsCisrCU5NX0FUVF9CUzExX0xJTkVfQ0ZHCQk9IDB4YWMsCisrCU5NX0FUVF9CUzExX0xJX1BPUlRfMQkJPSAweGFkLAorKwlOTV9BVFRfQlMxMV9MSV9QT1JUXzIJCT0gMHhhZSwKKysKKysJTk1fQVRUX0JTMTFfTDFfUkVNX0FMTV9UWVBFCT0gMHhiMCwKKysJTk1fQVRUX0JTMTFfU1dfTE9BRF9JTlRFTkRFRAk9IDB4YmIsCisrCU5NX0FUVF9CUzExX1NXX0xPQURfU0FGRVRZCT0gMHhiYywKKysJTk1fQVRUX0JTMTFfU1dfTE9BRF9TVE9SRUQJPSAweGJkLAorKworKwlOTV9BVFRfQlMxMV9WRU5ET1JfTkFNRQkJPSAweGMxLAorKwlOTV9BVFRfQlMxMV9IT1BQSU5HX01PREUJPSAweGM1LAorKwlOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTgk9IDB4YzYsCisrCU5NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FCT0gMHhjNywKKysJTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVgk9IDB4YzgsCisrCU5NX0FUVF9CUzExX0xNVF9VU0VSX05BTUUJPSAweGM5LAorKworKwlOTV9BVFRfQlMxMV9MMV9DT05UUk9MX1RTCT0gMHhkOCwKKysJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19HUkFOCT0gMHhkYywJLyogaW4gU0FDQ0ggbXVsdGlmcmFtZXMgKi8KKysJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19SRVAJPSAweGRkLAorKworKwlOTV9BVFRfQlMxMV9TSF9MQVBEX0lOVF9USU1FUgk9IDB4ZTgsCisrCisrCU5NX0FUVF9CUzExX0JUU19TVEFURQkJPSAweGYwLAorKwlOTV9BVFRfQlMxMV9FMV9TVEFURQkJPSAweGYxLAorKwlOTV9BVFRfQlMxMV9QTEwJCQk9IDB4ZjIsCisrCU5NX0FUVF9CUzExX1JYX09GRlNFVAkJPSAweGYzLAorKwlOTV9BVFRfQlMxMV9BTlRfVFlQRQkJPSAweGY0LAorKwlOTV9BVFRfQlMxMV9QTExfTU9ERQkJPSAweGZjLAorKwlOTV9BVFRfQlMxMV9QQVNTV09SRAkJPSAweGZkLAorK307CisrI2RlZmluZSBOTV9BVFRfQlMxMV9GSUxFX0RBVEEJTk1fQVRUX0VWRU5UX1RZUEUKKysKKysvKiBTZWN0aW9uIDkuNC40OiBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSAqLworK2VudW0gYWJpc19ubV9hZG1fc3RhdGUgeworKwlOTV9TVEFURV9MT0NLRUQJCT0gMHgwMSwKKysJTk1fU1RBVEVfVU5MT0NLRUQJPSAweDAyLAorKwlOTV9TVEFURV9TSFVURE9XTgk9IDB4MDMsCisrCU5NX1NUQVRFX05VTEwJCT0gMHhmZiwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjEzOiBDaGFubmVsIENvbWJpbmF0aW9uICovCisrZW51bSBhYmlzX25tX2NoYW5fY29tYiB7CisrCU5NX0NIQU5DX1RDSEZ1bGwJPSAweDAwLAorKwlOTV9DSEFOQ19UQ0hIYWxmCT0gMHgwMSwKKysJTk1fQ0hBTkNfVENISGFsZjIJPSAweDAyLAorKwlOTV9DSEFOQ19TRENDSAkJPSAweDAzLAorKwlOTV9DSEFOQ19tYWluQkNDSAk9IDB4MDQsCisrCU5NX0NIQU5DX0JDQ0hDb21iCT0gMHgwNSwKKysJTk1fQ0hBTkNfQkNDSAkJPSAweDA2LAorKwlOTV9DSEFOQ19CQ0NIX0NCQ0gJPSAweDA3LAorKwlOTV9DSEFOQ19TRENDSF9DQkNICT0gMHgwOCwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjE2OiBFdmVudCBUeXBlICovCisrZW51bSBhYmlzX25tX2V2ZW50X3R5cGUgeworKwlOTV9FVlRfQ09NTV9GQUlMCT0gMHgwMCwKKysJTk1fRVZUX1FPU19GQUlMCQk9IDB4MDEsCisrCU5NX0VWVF9QUk9DX0ZBSUwJPSAweDAyLAorKwlOTV9FVlRfRVFVSVBfRkFJTAk9IDB4MDMsCisrCU5NX0VWVF9FTlZfRkFJTAkJPSAweDA0LAorK307CisrCisrLyogU2VjdGlvbjogOS40LjYzOiBQZXJjZWl2ZWQgU2V2ZXJpdHkgKi8KKytlbnVtIGFiaXNfbm1fc2V2ZXJpdHkgeworKwlOTV9TRVZFUl9DRUFTRUQJCT0gMHgwMCwKKysJTk1fU0VWRVJfQ1JJVElDQUwJPSAweDAxLAorKwlOTV9TRVZFUl9NQUpPUgkJPSAweDAyLAorKwlOTV9TRVZFUl9NSU5PUgkJPSAweDAzLAorKwlOTV9TRVZFUl9XQVJOSU5HCT0gMHgwNCwKKysJTk1fU0VWRVJfSU5ERVRFUk1JTkFURQk9IDB4MDUsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC40MzogUHJvYmFibGUgQ2F1c2UgVHlwZSAqLworK2VudW0gYWJpc19ubV9wY2F1c2VfdHlwZSB7CisrCU5NX1BDQVVTRV9UX1g3MjEJPSAweDAxLAorKwlOTV9QQ0FVU0VfVF9HU00JCT0gMHgwMiwKKysJTk1fUENBVVNFX1RfTUFOVUYJPSAweDAzLAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMzY6IE5BQ0sgQ2F1c2VzICovCisrZW51bSBhYmlzX25tX25hY2tfY2F1c2UgeworKwkvKiBHZW5lcmFsIE5hY2sgQ2F1c2VzICovCisrCU5NX05BQ0tfSU5DT1JSX1NUUlVDVAkJPSAweDAxLAorKwlOTV9OQUNLX01TR1RZUEVfSU5WQUwJCT0gMHgwMiwKKysJTk1fTkFDS19PQkpDTEFTU19JTlZBTAkJPSAweDA1LAorKwlOTV9OQUNLX09CSkNMQVNTX05PVFNVUFAJPSAweDA2LAorKwlOTV9OQUNLX0JUU05SX1VOS04JCT0gMHgwNywKKysJTk1fTkFDS19UUlhOUl9VTktOCQk9IDB4MDgsCisrCU5NX05BQ0tfT0JKSU5TVF9VTktOCQk9IDB4MDksCisrCU5NX05BQ0tfQVRUUklEX0lOVkFMCQk9IDB4MGMsCisrCU5NX05BQ0tfQVRUUklEX05PVFNVUFAJCT0gMHgwZCwKKysJTk1fTkFDS19QQVJBTV9SQU5HRQkJPSAweDBlLAorKwlOTV9OQUNLX0FUVFJMSVNUX0lOQ09OU0lTVEVOVAk9IDB4MGYsCisrCU5NX05BQ0tfU1BFQ19JTVBMX05PVFNVUFAJPSAweDEwLAorKwlOTV9OQUNLX0NBTlRfUEVSRk9STQkJPSAweDExLAorKwkvKiBTcGVjaWZpYyBOYWNrIENhdXNlcyAqLworKwlOTV9OQUNLX1JFU19OT1RJTVBMCQk9IDB4MTksCisrCU5NX05BQ0tfUkVTX05PVEFWQUlMCQk9IDB4MWEsCisrCU5NX05BQ0tfRlJFUV9OT1RBVkFJTAkJPSAweDFiLAorKwlOTV9OQUNLX1RFU1RfTk9UU1VQUAkJPSAweDFjLAorKwlOTV9OQUNLX0NBUEFDSVRZX1JFU1RSCQk9IDB4MWQsCisrCU5NX05BQ0tfUEhZU0NGR19OT1RQRVJGT1JNCT0gMHgxZSwKKysJTk1fTkFDS19URVNUX05PVElOSVQJCT0gMHgxZiwKKysJTk1fTkFDS19QSFlTQ0ZHX05PVFJFU1RPUkUJPSAweDIwLAorKwlOTV9OQUNLX1RFU1RfTk9TVUNICQk9IDB4MjEsCisrCU5NX05BQ0tfVEVTVF9OT1NUT1AJCT0gMHgyMiwKKysJTk1fTkFDS19NU0dJTkNPTlNJU1RfUEhZU0NGRwk9IDB4MjMsCisrCU5NX05BQ0tfRklMRV9JTkNPTVBMRVRFCQk9IDB4MjUsCisrCU5NX05BQ0tfRklMRV9OT1RBVkFJTAkJPSAweDI2LAorKwlOTV9OQUNLX0ZJTEVfTk9UQUNUSVZBVEUJPSAweDI3LAorKwlOTV9OQUNLX1JFUV9OT1RfR1JBTlQJCT0gMHgyOCwKKysJTk1fTkFDS19XQUlUCQkJPSAweDI5LAorKwlOTV9OQUNLX05PVEhfUkVQT1JUX0VYSVNUCT0gMHgyYSwKKysJTk1fTkFDS19NRUFTX05PVFNVUFAJCT0gMHgyYiwKKysJTk1fTkFDS19NRUFTX05PVFNUQVJUCQk9IDB4MmMsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4xICovCisrc3RydWN0IGFiaXNfbm1fY2hhbm5lbCB7CisrCWd1aW50OAlhdHRyaWI7CisrCWd1aW50OAlidHNfcG9ydDsKKysJZ3VpbnQ4CXRpbWVzbG90OworKwlndWludDgJc3Vic2xvdDsKKyt9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKysKKysvKiBTaWVtZW5zIEJTLTExIHNwZWNpZmljIG9iamVjdHMgaW4gdGhlIFNpZW5lbXNIVyAoMHhBNSkgb2JqZWN0IGNsYXNzICovCisrZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB7CisrCUJTMTFfT0JKX0FMQ08JCT0gMHgwMSwKKysJQlMxMV9PQkpfQkJTSUcJCT0gMHgwMiwJLyogb2JqX2NsYXNzOiAwLDEgKi8KKysJQlMxMV9PQkpfVFJYMQkJPSAweDAzLAkvKiBvbmx5IERFQUNUSVZBVEUgVFJYMSAqLworKwlCUzExX09CSl9DQ0xLCQk9IDB4MDQsCisrCUJTMTFfT0JKX0dQU1UJCT0gMHgwNiwKKysJQlMxMV9PQkpfTEkJCT0gMHgwNywKKysJQlMxMV9PQkpfUEEJCT0gMHgwOSwJLyogb2JqX2NsYXNzOiAwLCAxKi8KKyt9OworKworK2VudW0gYWJpc19iczExX3RyeF9wb3dlciB7CisrCUJTMTFfVFJYX1BPV0VSX0dTTV8yVwk9IDB4MDYsCisrCUJTMTFfVFJYX1BPV0VSX0dTTV8yNTBtVz0gMHgwNywKKysJQlMxMV9UUlhfUE9XRVJfR1NNXzgwbVcJPSAweDA4LAorKwlCUzExX1RSWF9QT1dFUl9HU01fMzBtVwk9IDB4MDksCisrCUJTMTFfVFJYX1BPV0VSX0RDU18zVwk9IDB4MGEsCisrCUJTMTFfVFJYX1BPV0VSX0RDU18xVzYJPSAweDBiLAorKwlCUzExX1RSWF9QT1dFUl9EQ1NfNTAwbVc9IDB4MGMsCisrCUJTMTFfVFJYX1BPV0VSX0RDU18xNjBtVz0gMHgwZCwKKyt9OworKworK2VudW0gYWJpc19iczExX2xpX3BsbF9tb2RlIHsKKysJQlMxMV9MSV9QTExfTE9DS0VECT0gMiwKKysJQlMxMV9MSV9QTExfU1RBTkRBTE9ORQk9IDMsCisrfTsKKysKKytlbnVtIGFiaXNfYnMxMV9waGFzZSB7CisrCUJTMTFfU1RBVEVfU09GVFdBUkVfUlFECQk9IDB4MDEsCisrCUJTMTFfU1RBVEVfTE9BRF9TTVVfSU5URU5ERUQJPSAweDExLAorKwlCUzExX1NUQVRFX0xPQURfU01VX1NBRkVUWQk9IDB4MjEsCisrCUJTMTFfU1RBVEVfTE9BRF9GQUlMRUQJCT0gMHgzMSwKKysJQlMxMV9TVEFURV9MT0FEX0RJQUdOT1NUSUMJPSAweDQxLAorKwlCUzExX1NUQVRFX1dBUk1fVVAJCT0gMHg1MSwKKysJQlMxMV9TVEFURV9XQVJNX1VQXzIJCT0gMHg1MiwKKysJQlMxMV9TVEFURV9XQUlUX01JTl9DRkcJCT0gMHg2MiwKKysJQlMxMV9TVEFURV9NQUlOVEVOQU5DRQkJPSAweDcyLAorKwlCUzExX1NUQVRFX0xPQURfTUJDQ1UJCT0gMHg5MiwKKysJQlMxMV9TVEFURV9XQUlUX01JTl9DRkdfMgk9IDB4QTIsCisrCUJTMTFfU1RBVEVfTk9STUFMCQk9IDB4MDMsCisrCUJTMTFfU1RBVEVfQUJJU19MT0FECQk9IDB4MTMsCisrfTsKKysKKysvKiBGcm9tIG9wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Rsdi5oICovCisrZW51bSB0bHZfdHlwZSB7CisrCVRMVl9UWVBFX0ZJWEVELAorKwlUTFZfVFlQRV9ULAorKwlUTFZfVFlQRV9UViwKKysJVExWX1RZUEVfVExWLAorKwlUTFZfVFlQRV9UTDE2ViwKKyt9OworKworK3N0cnVjdCB0bHZfZGVmIHsKKysJZW51bSB0bHZfdHlwZSB0eXBlOworKwl1X2ludDhfdCBmaXhlZF9sZW47CisrfTsKKysKKytzdHJ1Y3QgdGx2X2RlZmluaXRpb24geworKwlzdHJ1Y3QgdGx2X2RlZiBkZWZbMHhmZl07CisrfTsKKysKKytlbnVtIGFiaXNfbm1faXBhY2NfdGVzdF9ubyB7CisrCU5NX0lQQUNDX1RFU1ROT19STE9PUF9BTlQJPSAweDAxLAorKwlOTV9JUEFDQ19URVNUTk9fUkxPT1BfWENWUgk9IDB4MDIsCisrCU5NX0lQQUNDX1RFU1ROT19GVU5DX09CSgk9IDB4MDMsCisrCU5NX0lQQUNDX1RFU1ROT19DSEFOX1VTQUdFCT0gMHg0MCwKKysJTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfQ0hBTl9VU0FHRQk9IDB4NDEsCisrCU5NX0lQQUNDX1RFU1ROT19GUkVRX1NZTkMJPSAweDQyLAorKwlOTV9JUEFDQ19URVNUTk9fQkNDSF9JTkZPCT0gMHg0MywKKysJTk1fSVBBQ0NfVEVTVE5PX1RYX0JFQUNPTgk9IDB4NDQsCisrCU5NX0lQQUNDX1RFU1ROT19TWVNJTkZPX01PTklUT1IJPSAweDQ1LAorKwlOTV9JUEFDQ19URVNUTk9fQkNDQ0hfTU9OSVRPUgk9IDB4NDYsCisrfTsKKysKKysvKiBmaXJzdCBieXRlIGFmdGVyIGxlbmd0aCBpbnNpZGUgTk1fQVRUX1RFU1RfUkVQT1JUICovCisrZW51bSBhYmlzX25tX2lwYWNjX3Rlc3RfcmVzIHsKKysJTk1fSVBBQ0NfVEVTVFJFU19TVUNDRVNTCT0gMCwKKysJTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VUCT0gMSwKKysJTk1fSVBBQ0NfVEVTVFJFU19OT19DSEFOUwk9IDIsCisrCU5NX0lQQUNDX1RFU1RSRVNfUEFSVElBTAk9IDMsCisrCU5NX0lQQUNDX1RFU1RSRVNfU1RPUFBFRAk9IDQsCisrfTsKKysKKysvKiBpbnRlcm5hbCBJRSBpbnNpZGUgTk1fQVRUX1RFU1RfUkVQT1JUICovCisrZW51bSBhYmlzX25tX2lwYWNjX3Rlc3RyZXNfaWUgeworKwlOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUl9MSVNUCT0gMywKKysJTk1fSVBBQ0NfVFJfSUVfQ0hBTl9VU0FHRQk9IDQsCisrCU5NX0lQQUNDX1RSX0lFX0JDQ0hfSU5GTwk9IDYsCisrCU5NX0lQQUNDX1RSX0lFX1JFU1VMVF9ERVRBSUxTCT0gOCwKKysJTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlIJCT0gMTgsCisrfTsKKysKKysvKiBGcm9tIG9wZW5ic2Mvc3JjL2FiaXNfbm0uYyAqLworK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZiA9IHsKKysJLmRlZiA9IHsKKysJCVtOTV9BVFRfQUJJU19DSEFOTkVMXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisrCQlbTk1fQVRUX0FERF9JTkZPXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0FERF9URVhUXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0FETV9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9BUkZDTl9MSVNUXT0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfQVVUT05fUkVQT1JUXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0FWQUlMX1NUQVRVU10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9CQ0NIX0FSRkNOXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0JTSUNdID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0JUU19BSVJfVElNRVJdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9DQ0NIX0xfSV9QXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0NDQ0hfTF9UXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0NIQU5fQ09NQl0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9DT05OX0ZBSUxfQ1JJVF0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0RFU1RdID0JCQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0VWRU5UX1RZUEVdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfRklMRV9JRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9GSUxFX1ZFUlNJT05dID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfR1NNX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfSFNOXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9IV19DT05GSUddID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCS8vQlMxMSBbTk1fQVRUX0hXX0RFU0NdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSFdfREVTQ10gPQkJeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfSU5UQVZFX1BBUkFNXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0lOVEVSRl9CT1VORF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorKwkJW05NX0FUVF9MSVNUX1JFUV9BVFRSXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfTUFJT10gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTUFOVUZfU1RBVEVdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTUFOVUZfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX01BTlVGX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX01BWF9UQV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9NRFJPUF9MSU5LXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX01EUk9QX05FWFRdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfTkFDS19DQVVTRVNdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTlkxXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9PUEVSX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX09WRVJMX1BFUklPRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9QSFlTX0NPTkZdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfUE9XRVJfQ0xBU1NdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfUE9XRVJfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisrCQlbTk1fQVRUX1BST0JfQ0FVU0VdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKysJCVtOTV9BVFRfUkFDSF9CX1RIUkVTSF0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0xEQVZHX1NMT1RTXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX1JBRF9TVUJDXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1JGX01BWFBPV1JfUl0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9TSVRFX0lOUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9TSVRFX09VVFBVVFNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfU09VUkNFXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1NQRUNfUFJPQl0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9TVEFSVF9USU1FXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX1QyMDBdID0JCQl7IFRMVl9UWVBFX0ZJWEVELCA3IH0sCisrCQlbTk1fQVRUX1RFSV0gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfVEVTVF9EVVJdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfVEVTVF9OT10gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9URVNUX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9WU1dSX1RIUkVTSF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9XSU5ET1dfU0laRV0gPSAJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfVFNDXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9TV19DT05GSUddID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfU0VWRVJJVFldID0gCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0dFVF9BUkldID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSFdfQ09ORl9DSEddID0gCQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX09VVFNUX0FMQVJNXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0ZJTEVfREFUQV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9NRUFTX1JFU10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKyNpZiAwCisrCQkvKiBCUzExIHNwZWNpZmljcyAqLworKwkJW05NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTF0gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0JPT1RfU1dfVkVSU10gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJWzB4ZDVdID0JCQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJWzB4YThdID0JCQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX1BBU1NXT1JEXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfVFhQV1JdID0JCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfUlNTSV9PRkZTXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTElORV9DRkddID0gCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MMV9QUk9UX1RZUEVdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0hdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9CUzExX0RJVkVSU0lUWV0gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OXT17IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVl0gPXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRV0gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0JUU19TVEFURV0JPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0UxX1NUQVRFXQk9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfUExMX01PREVdCT0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9QTExdCT0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9DQ0xLX1RZUEVdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJWzB4OTVdID0JCQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrI2VuZGlmCisrCQkvKiBpcC5hY2Nlc3Mgc3BlY2lmaWNzICovCisrCQlbTk1fQVRUX0lQQUNDX0RTVF9JUF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorKwkJW05NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05WX0ZMQUdTXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorKwkJW05NX0FUVF9JUEFDQ19JUF9JRl9DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgOCB9LAorKwkJW05NX0FUVF9JUEFDQ19JUF9HV19DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgMTIgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTE9DQVRJT05dID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19VTklUX0lEXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfU05NUF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19BTE1fVEhSRVNIX0xJU1RdPSB7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0NVUl9TV19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19TVFJFQU1fSURdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19SQUNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfT0JKX1ZFUlNJT05dID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkddID17IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05TRUldID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQlZDSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OU1ZDSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OU19DRkddID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFU10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR18yXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR18zXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfRklMRV9EQVRBXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJfSwKKyt9OworKworKyNlbmRpZiAvKiBfTk1fSCAqLworLS0gCisxLjcuMC4xCisKZGlmZiAtLWdpdCBhL3dpcmVzaGFyay9sdWNlbnQtaG5iLnBhdGNoIGIvd2lyZXNoYXJrL2x1Y2VudC1obmIucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4NTE5NQotLS0gL2Rldi9udWxsCisrKyBiL3dpcmVzaGFyay9sdWNlbnQtaG5iLnBhdGNoCkBAIC0wLDAgKzEsMTIwIEBACitJbmRleDogd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtbHVjZW50X2huYi5jCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gL2Rldi9udWxsCisrKysgd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtbHVjZW50X2huYi5jCitAQCAtMCwwICsxLDEwMyBAQAorKy8qIHBhY2tldC1sdWNlbnRfaG5iLmMKKysgKiBSb3V0aW5lcyBmb3IgcGFja2V0IGRpc3NlY3Rpb24gb2YgQWxjYXRlbC9MdWNlbnQgSG9tZU5vZGVCCisrICogQ29weXJpZ2h0IDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKysgKgorKyAqIFRoaXMgcHJvdG9jb2wgZGVjb2RlciBpcyBiYXNlZCBlbnRpcmVseSBvbiByZXZlcnNlIGVuZ2luZWVyaW5nLCBpLmUuCisrICogb24gZWR1Y2F0ZWQgZ3Vlc3Nlcy4KKysgKgorKyAqICRJZDogcGFja2V0LWx1Y2VudF9obmIuYyAyOTI1NCAyMDA5LTA3LTMxIDE5OjE5OjI1WiBnZXJhbGQgJAorKyAqCisrICogV2lyZXNoYXJrIC0gTmV0d29yayB0cmFmZmljIGFuYWx5emVyCisrICogQnkgR2VyYWxkIENvbWJzIDxnZXJhbGRAd2lyZXNoYXJrLm9yZz4KKysgKiBDb3B5cmlnaHQgMTk5OCBHZXJhbGQgQ29tYnMKKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisrICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAqCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKysgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisrICovCisrCisrI2lmZGVmIEhBVkVfQ09ORklHX0gKKysjIGluY2x1ZGUgImNvbmZpZy5oIgorKyNlbmRpZgorKworKyNkZWZpbmUgTEhOQl9TQ1RQX1BQSV9NTQkxCisrI2RlZmluZSBMSE5CX1NDVFBfUFBJX0dNTQk2CisrCisrI2RlZmluZSBMSE5CX1NDVFBfUE9SVAkJNjAwNQorKworKyNpbmNsdWRlIDxnbGliLmg+CisrCisrI2luY2x1ZGUgPGVwYW4vcGFja2V0Lmg+CisrCisrLyogSW5pdGlhbGl6ZSB0aGUgcHJvdG9jb2wgYW5kIHJlZ2lzdGVyZWQgZmllbGRzICovCisrc3RhdGljIGludCBwcm90b19saG5iID0gLTE7CisrCisrc3RhdGljIGludCBoZl9saG5iX2xlbmd0aCA9IC0xOworKworKy8qIEluaXRpYWxpemUgdGhlIHN1YnRyZWUgcG9pbnRlcnMgKi8KKytzdGF0aWMgZ2ludCBldHRfbGhuYiA9IC0xOworKworK3N0YXRpYyBkaXNzZWN0b3JfaGFuZGxlX3QgcmFuYXBfaGFuZGxlOworKworKy8qIENvZGUgdG8gYWN0dWFsbHkgZGlzc2VjdCB0aGUgcGFja2V0cyAqLworK3N0YXRpYyB2b2lkCisrZGlzc2VjdF9saG5iKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSkKKyt7CisrCisrCWludCBvZmZzZXQgPSAwOworKwl1X2ludDE2X3QgbGVuOworKwl0dmJ1ZmZfdCAqbmV4dF90dmI7CisrCisrCWNvbF9zZXRfc3RyKHBpbmZvLT5jaW5mbywgQ09MX1BST1RPQ09MLCAiTEhOQiIpOworKwljb2xfY2xlYXIocGluZm8tPmNpbmZvLCBDT0xfSU5GTyk7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfbGhuYl9sZW5ndGgsIHR2Yiwgb2Zmc2V0KzIsIDIsIEZBTFNFKTsKKysJbGVuID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCsyKTsKKysJbmV4dF90dmIgPSB0dmJfbmV3X3N1YnNldCh0dmIsIG9mZnNldCsyKzYsIGxlbi00LCAtMSk7CisrCisrCWNhbGxfZGlzc2VjdG9yKHJhbmFwX2hhbmRsZSwgbmV4dF90dmIsIHBpbmZvLCB0cmVlKTsKKyt9CisrCisrdm9pZCBwcm90b19yZWdpc3Rlcl9sdWNlbnRfaG5iKHZvaWQpCisreworKwlzdGF0aWMgaGZfcmVnaXN0ZXJfaW5mbyBoZltdID0geworKwkJeyZoZl9saG5iX2xlbmd0aCwKKysJCSB7Ikxlbmd0aCIsICJsaG5iLmxlbiIsCisrCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4MCwgTlVMTCwgSEZJTEx9CisrCQkgfSwKKysJfTsKKysKKysJc3RhdGljIGdpbnQgKmV0dFtdID0geworKwkJJmV0dF9saG5iLAorKwl9OworKworKwlwcm90b19saG5iID0KKysJICAgIHByb3RvX3JlZ2lzdGVyX3Byb3RvY29sKCJBbGNhdGVsL0x1Y2VudCBIb21lTm9kZUIiLAorKwkJCQkgICAgIkx1Y2VudCBITkIiLCAibGhuYiIpOworKworKwlwcm90b19yZWdpc3Rlcl9maWVsZF9hcnJheShwcm90b19saG5iLCBoZiwgYXJyYXlfbGVuZ3RoKGhmKSk7CisrCXByb3RvX3JlZ2lzdGVyX3N1YnRyZWVfYXJyYXkoZXR0LCBhcnJheV9sZW5ndGgoZXR0KSk7CisrfQorKworK3ZvaWQgcHJvdG9fcmVnX2hhbmRvZmZfbHVjZW50X2huYih2b2lkKQorK3sKKysJZGlzc2VjdG9yX2hhbmRsZV90IGxobmJfaGFuZGxlOworKworKwlyYW5hcF9oYW5kbGUgPSBmaW5kX2Rpc3NlY3RvcigicmFuYXAiKTsKKysKKysJbGhuYl9oYW5kbGUgPSBjcmVhdGVfZGlzc2VjdG9yX2hhbmRsZShkaXNzZWN0X2xobmIsIHByb3RvX2xobmIpOworKworKwlkaXNzZWN0b3JfYWRkKCJzY3RwLnBwaSIsIExITkJfU0NUUF9QUElfTU0sIGxobmJfaGFuZGxlKTsKKysJZGlzc2VjdG9yX2FkZCgic2N0cC5wcGkiLCBMSE5CX1NDVFBfUFBJX0dNTSwgbGhuYl9oYW5kbGUpOworKwlkaXNzZWN0b3JfYWRkKCJzY3RwLnBvcnQiLCBMSE5CX1NDVFBfUE9SVCwgbGhuYl9oYW5kbGUpOworK30KK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHdpcmVzaGFyay5vcmlnL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorQEAgLTYwNSw2ICs2MDUsNyBAQAorIAlwYWNrZXQtbG9vcC5jCQlcCisgCXBhY2tldC1scGQuYwkJXAorIAlwYWNrZXQtbHNjLmMJCVwKKysJcGFja2V0LWx1Y2VudF9obmIuYwlcCisgCXBhY2tldC1sd2FwcC5jCQlcCisgCXBhY2tldC1sd3Jlcy5jCQlcCisgCXBhY2tldC1tMnBhLmMJCVwKZGlmZiAtLWdpdCBhL3dpcmVzaGFyay9yc2wtaXBhY2Nlc3MucGF0Y2ggYi93aXJlc2hhcmsvcnNsLWlwYWNjZXNzLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MjIwYjgKLS0tIC9kZXYvbnVsbAorKysgYi93aXJlc2hhcmsvcnNsLWlwYWNjZXNzLnBhdGNoCkBAIC0wLDAgKzEsNjY0IEBACitGcm9tIDhmMzVkNjIzNjQxZGJiYTkwZTYxODY2MDRjMTFlODkyYmY1MTVlY2MgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CitEYXRlOiBNb24sIDE5IEFwciAyMDEwIDEzOjMyOjU4ICswODAwCitTdWJqZWN0OiBbUEFUQ0ggMi8yXSBSU0wgcGF0Y2gKKworLS0tCisgZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYyB8ICA1MjIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCisgMSBmaWxlcyBjaGFuZ2VkLCA1MTUgaW5zZXJ0aW9ucygrKSwgNyBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCitpbmRleCBiMTBhNjcxLi5hNDU1Y2YzIDEwMDY0NAorLS0tIGEvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworKysrIGIvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworQEAgLTIsNiArMiw3IEBACisgICogUm91dGluZXMgZm9yIFJhZGlvIFNpZ25hbGxpbmcgTGluayAoUlNMKSBkaXNzZWN0aW9uLgorICAqCisgICogQ29weXJpZ2h0IDIwMDcsIEFuZGVycyBCcm9tYW4gPGFuZGVycy5icm9tYW5AZXJpY3Nzb24uY29tPgorKyAqIENvcHlyaWdodCAyMDA5LCBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICAqCisgICogJElkJAorICAqCitAQCAtNDIsNiArNDMsOCBAQAorICNpbmNsdWRlIDxlcGFuL2xhcGRfc2FwaS5oPgorIAorICNpbmNsdWRlICJwYWNrZXQtZ3NtX2FfY29tbW9uLmgiCisrI2luY2x1ZGUgInBhY2tldC1ydHAuaCIKKysjaW5jbHVkZSAicGFja2V0LXJ0Y3AuaCIKKyAKKyAvKiBJbml0aWFsaXplIHRoZSBwcm90b2NvbCBhbmQgcmVnaXN0ZXJlZCBmaWVsZHMgKi8KKyBzdGF0aWMgaW50IHByb3RvX3JzbAkJPSAtMTsKK0BAIC0xMTUsNiArMTE4LDI0IEBAIHN0YXRpYyBpbnQgaGZfcnNsX2VtbHBwX3ByaW8JCT0gLTE7Cisgc3RhdGljIGludCBoZl9yc2xfcnRkCQkJCT0gLTE7Cisgc3RhdGljIGludCBoZl9yc2xfZGVsYXlfaW5kCQkJPSAtMTsKKyBzdGF0aWMgaW50IGhmX3JzbF90Zm8JCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9zcGVlY2hfbW9kZV9zCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9zcGVlY2hfbW9kZV9tCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jb25uX3N0YXQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2Nvbm5faWQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3J0cF9wYXlsb2FkCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9ydHBfY3NkX2ZtdF9kCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9ydHBfY3NkX2ZtdF9pcgkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9sb2NhbF9wb3J0CQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9yZW1vdGVfcG9ydAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfbG9jYWxfaXAJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3JlbW90ZV9pcAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfdHhfcGt0cwkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfdHhfb2N0cwkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfcnhfcGt0cwkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfcnhfb2N0cwkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfbG9zdF9wa3RzCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X2lhX2ppdHRlcgkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9hdmdfdHhfZGx5CQk9IC0xOworIAorIC8qIEluaXRpYWxpemUgdGhlIHN1YnRyZWUgcG9pbnRlcnMgKi8KKyBzdGF0aWMgaW50IGV0dF9yc2wgPSAtMTsKK0BAIC0xNzIsNiArMTkzLDE1IEBAIHN0YXRpYyBpbnQgZXR0X2llX2NhdXNlID0gLTE7Cisgc3RhdGljIGludCBldHRfaWVfbWVhc19yZXNfbm8gPSAtMTsKKyBzdGF0aWMgaW50IGV0dF9pZV9tZXNzYWdlX2lkID0gLTE7Cisgc3RhdGljIGludCBldHRfaWVfc3lzX2luZm9fdHlwZSA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX3NwZWVjaF9tb2RlID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfY29ubl9zdGF0ID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfY29ubl9pZCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX3JlbW90ZV9pcCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX3JlbW90ZV9wb3J0ID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfbG9jYWxfcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX2xvY2FsX2lwID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfcnRwX3BheWxvYWQgPSAtMTsKKysKKyAKKyBwcm90b190cmVlICp0b3BfdHJlZTsKKyBkaXNzZWN0b3JfaGFuZGxlX3QgZ3NtX2FfY2NjaF9oYW5kbGU7CitAQCAtMjA3LDggKzIzNywxMSBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfZGlzY192YWxzW10gPSB7CisgCXsgIDB4MDYsCQkiQ29tbW9uIENoYW5uZWwgTWFuYWdlbWVudCBtZXNzYWdlcyIgfSwKKyAJeyAgMHgwOCwJCSJUUlggTWFuYWdlbWVudCBtZXNzYWdlcyIgfSwKKyAJeyAgMHgxNiwJCSJMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlcyIgfSwKKysJeyAgMHgzZiwJCSJpcC5hY2Nlc3MgVmVuZG9yIFNwZWNpZmljIG1lc3NhZ2VzIiB9LAorIAl7IDAsCQkJTlVMTCB9CisgfTsKKysjZGVmaW5lIFJTTF9NU0dESVNDX0lQQUNDRVNTCTB4M2YKKysKKyAvKgorICAqIDkuMiBNRVNTQUdFIFRZUEUKKyAgKi8KK0BAIC0yNzUsNiArMzA4LDQ5IEBAIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX21zZ19kaXNjX3ZhbHNbXSA9IHsKKyAJLyogCTAgMSAtIC0gLSAtIC0gLSBMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlczogKi8KKyAjZGVmaW5lIFJTTF9NU0dfTE9DX0lORgkJCQkJNjUJLyogOC43LjEgKi8KKyAKKysvKiBWZW5kb3ItU3BlY2lmaWMgbWVzc2FnZXMgb2YgaXAuYWNjZXNzIG5hbm9CVFMuIFRoZXJlIGlzIG5vIHB1YmxpYyBkb2N1bWVudGF0aW9uCisrICogYWJvdXQgdGhvc2UgZXh0ZW5zaW9ucywgYWxsIGluZm9ybWF0aW9uIGluIHRoaXMgZGlzc2VjdG9yIGlzIGJhc2VkIG9uIGxhd2Z1bAorKyAqIHByb3RvY29sIHJldmVyc2UgZW5naW5lcmluZyBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiAqLworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfTUVBU19QUF9ERUYJMHg2MAorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9JTlEJMHg2MQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9SRVNQCTB4NjIKKysKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUCTB4NDgKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX0FDSwkweDQ5CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9OQUNLCTB4NGEKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1QJMHg0YgorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9BQ0sgMHg0YworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9OQUNLIDB4NGQKKysKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1gJCTB4NzAKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1hfQUNLCTB4NzEKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1hfTkFDSwkweDcyCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYCQkweDczCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYX0FDSwkweDc0CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYX05BQ0sJMHg3NQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRExDWF9JTkQJMHg3NgorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRExDWAkJMHg3NworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRExDWF9BQ0sJMHg3OAorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRExDWF9OQUNLCTB4NzkKKysKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1NSVFBfQ09ORklHCQkweGUwCisrI2RlZmluZSBSU0xfSUVfSVBBQ19QUk9YWV9VRFAJCTB4ZTEKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0JTQ01QTF9UT1VUCQkweGUyCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SRU1PVEVfSVAJCTB4ZjAKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUCQkweGYxCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRAkJMHhmMgorKyNkZWZpbmUgUlNMX0lFX0lQQUNfTE9DQUxfUE9SVAkJMHhmMworKyNkZWZpbmUgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUJCTB4ZjQKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0xPQ0FMX0lQCQkweGY1CisrI2RlZmluZSBSU0xfSUVfSVBBQ19DT05OX1NUQVQJCTB4ZjYKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0hPX0NfUEFSTVMJCTB4ZjcKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0NPTk5fSUQJCTB4ZjgKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9DU0RfRk1UCQkweGY5CisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfSklUX0JVRgkJMHhmYQorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX0NPTVBSCQkweGZiCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDIJMHhmYworKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX01QTEVYCQkweGZkCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfTVBMRVhfSUQJMHhmZQorIAorIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX21zZ190eXBlX3ZhbHNbXSA9IHsKKyAJICAvKiAJMCAwIDAgMCAtIC0gLSAtIFJhZGlvIExpbmsgTGF5ZXIgTWFuYWdlbWVudCBtZXNzYWdlczogKi8KK0BAIC0zMzcsNiArNDEzLDI2IEBAIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX21zZ190eXBlX3ZhbHNbXSA9IHsKKyAJeyAgMHgzZiwJIlRGTyBNT0RpZmljYXRpb24gUkVRdWVzdCIgfSwJCQkJCS8qIDguNC4zMSAqLworIAkvKiAJMCAxIC0gLSAtIC0gLSAtIExvY2F0aW9uIFNlcnZpY2VzIG1lc3NhZ2VzOiAqLworIAl7ICAweDQxLAkiTG9jYXRpb24gSW5mb3JtYXRpb24iIH0sCQkJCQkJLyogOC43LjEgKi8KKysJLyogaXAuYWNjZXNzICovCisrCXsgIDB4NDgsCSJpcC5hY2Nlc3MgUERDSCBBQ1RJVkFUSU9OIiB9LAorKwl7ICAweDQ5LAkiaXAuYWNjZXNzIFBEQ0ggQUNUSVZBVElPTiBBQ0siIH0sCisrCXsgIDB4NGEsCSJpcC5hY2Nlc3MgUERDSCBBQ1RJVkFUSU9OIE5BQ0siIH0sCisrCXsgIDB4NGIsCSJpcC5hY2Nlc3MgUERDSCBERUFDVElWQVRJT04iIH0sCisrCXsgIDB4NGMsCSJpcC5hY2Nlc3MgUERDSCBERUFDVElWQVRJT04gQUNLIiB9LAorKwl7ICAweDRkLAkiaXAuYWNjZXNzIFBEQ0ggREVBQ1RJVkFUSU9OIE5BQ0siIH0sCisrCXsgIDB4NjAsCSJpcC5hY2Nlc3MgTUVBU3VyZW1lbnQgUFJFUFJPQ2Vzc2luZyBEZUZhdUxUIiB9LAorKwl7ICAweDYxLAkiaXAuYWNjZXNzIEhBTkRPb3ZlciBDQU5EaWRhdGUgRU5RdWlyeSIgfSwKKysJeyAgMHg2MiwJImlwLmFjY2VzcyBIQU5ET292ZXIgQ0FORGlkYXRlIFJFU1BvbnNlIiB9LAorKwl7ICAweDcwLAkiaXAuYWNjZXNzIENSQ1giIH0sCisrCXsgIDB4NzEsCSJpcC5hY2Nlc3MgQ1JDWCBBQ0siIH0sCisrCXsgIDB4NzIsCSJpcC5hY2Nlc3MgQ1JDWCBOQUNLIiB9LAorKwl7ICAweDczLAkiaXAuYWNjZXNzIE1EQ1giIH0sCisrCXsgIDB4NzQsCSJpcC5hY2Nlc3MgTURDWCBBQ0siIH0sCisrCXsgIDB4NzUsCSJpcC5hY2Nlc3MgTURDWCBOQUNLIiB9LAorKwl7ICAweDc2LAkiaXAuYWNjZXNzIERMQ1ggSU5EaWNhdGlvbiIgfSwKKysJeyAgMHg3NywJImlwLmFjY2VzcyBETENYIiB9LAorKwl7ICAweDc4LAkiaXAuYWNjZXNzIERMQ1ggQUNLIiB9LAorKwl7ICAweDc5LAkiaXAuYWNjZXNzIERMQ1ggTkFDSyIgfSwKKyAJeyAwLAkJTlVMTCB9CisgfTsKKyAKK0BAIC0zNzAsMTAgKzQ2NiwxMCBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfdHlwZV92YWxzW10gPSB7CisgI2RlZmluZSBSU0xfSUVfTUVTU0FHRV9JRAkJMjgKKyAKKyAjZGVmaW5lIFJTTF9JRV9TWVNfSU5GT19UWVBFCTMwCistCistCistCistCisrI2RlZmluZSBSU0xfSUVfTVNfUE9XRVJfUEFSQU0JCTMxCisrI2RlZmluZSBSU0xfSUVfQlNfUE9XRVJfUEFSQU0JCTMyCisrI2RlZmluZSBSU0xfSUVfUFJFUFJPQ19QQVJBTQkJMzMKKysjZGVmaW5lIFJTTF9JRV9QUkVQUk9DX01FQVMJCTM0CisgI2RlZmluZSBSU0xfSUVfRlVMTF9JTU1fQVNTX0lORgkJCTM1CisgI2RlZmluZSBSU0xfSUVfU01TQ0JfSU5GCQkJCTM2CisgI2RlZmluZSBSU0xfSUVfRlVMTF9NU19USU1JTkdfT0ZGU0VUCTM3CitAQCAtNDc2LDYgKzU3MiwyNCBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pZV90eXBlX3ZhbHNbXSA9IHsKKyAJCQlOb3QgdXNlZAorIAorIAkqLworKwl7IDB4ZTAsCQkiU1JUUCBDb25maWd1cmF0aW9uIiB9LAorKwl7IDB4ZTEsCQkiQlNDIFByb3h5IFVEUCBQb3J0IiB9LAorKwl7IDB4ZTIsCQkiQlNDIE11bHRpcGxleCBUaW1lb3V0IiB9LAorKwl7IDB4ZjAsCQkiUmVtb3RlIElQIEFkZHJlc3MiIH0sCisrCXsgMHhmMSwJCSJSZW1vdGUgUlRQIFBvcnQiIH0sCisrCXsgMHhmMiwJCSJSVFAgUGF5bG9hZCBUeXBlIiB9LAorKwl7IDB4ZjMsCQkiTG9jYWwgUlRQIFBvcnQiIH0sCisrCXsgMHhmNCwJCSJTcGVlY2ggTW9kZSIgfSwKKysJeyAweGY1LAkJIkxvY2FsIElQIEFkZHJlc3MiIH0sCisrCXsgMHhmNiwJCSJDb25uZWN0aW9uIFN0YXRpc3RpY3MiIH0sCisrCXsgMHhmNywJCSJIYW5kb3ZlciBDIFBhcmFtZXRlcnMiIH0sCisrCXsgMHhmOCwJCSJDb25uZWN0aW9uIElkZW50aWZpZXIiIH0sCisrCXsgMHhmOSwJCSJSVFAgQ1NEIEZvcm1hdCIgfSwKKysJeyAweGZhLAkJIlJUUCBKaXR0ZXIgQnVmZmVyIiB9LAorKwl7IDB4ZmIsCQkiUlRQIENvbXByZXNzaW9uIiB9LAorKwl7IDB4ZmMsCQkiUlRQIFBheWxvYWQgVHlwZSAyIiB9LAorKwl7IDB4ZmQsCQkiUlRQIE11bHRpcGxleCIgfSwKKysJeyAweGZlLAkJIlJUUCBNdWx0aXBsZXggSWRlbnRpZmllciIgfSwKKyAJeyAwLAkJCU5VTEwgfQorIH07CisgCitAQCAtNTEyLDYgKzYyNiw5NiBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9jaF9ub19DYml0c192YWxzW10gPSB7CisgCXsgMCwJCQlOVUxMIH0KKyB9OworIAorKy8qIEZyb20gb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGx2LmggKi8KKytlbnVtIHRsdl90eXBlIHsKKysJVExWX1RZUEVfRklYRUQsCisrCVRMVl9UWVBFX1QsCisrCVRMVl9UWVBFX1RWLAorKwlUTFZfVFlQRV9UTFYsCisrCVRMVl9UWVBFX1RMMTZWLAorK307CisrCisrc3RydWN0IHRsdl9kZWYgeworKwllbnVtIHRsdl90eXBlIHR5cGU7CisrCXVfaW50OF90IGZpeGVkX2xlbjsKKyt9OworKworK3N0cnVjdCB0bHZfZGVmaW5pdGlvbiB7CisrCXN0cnVjdCB0bHZfZGVmIGRlZlsweGZmXTsKKyt9OworKworK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gcnNsX2F0dF90bHZkZWYgPSB7CisrCS5kZWYgPSB7CisrCQlbUlNMX0lFX0NIX05PXQkJCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9MSU5LX0lEXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0FDVF9UWVBFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0JTX1BPV10JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfSURdCQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DSF9NT0RFXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9FTkNfSU5GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9GUkFNRV9OT10JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9IT19SRUZdCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0wxX0lORl0JCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfTDNfSU5GXQkJCT0geyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW1JTTF9JRV9NU19JRF0JCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01TX1BPV10JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfUEFHSU5HX0dSUF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9QQUdJTkdfTE9BRF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9QSFlfQ1RYXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9BQ0NFU1NfREVMQVldCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfUkFDSF9MT0FEXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9SRVFfUkVGXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisrCQlbUlNMX0lFX1JFTF9NT0RFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1JFU09VUkNFX0lORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUkxNX0NBVVNFXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9TVEFSVElOR19USU1FXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX1RJTUlOR19BRFZdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfVVBMSU5LX01FQVNdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NBVVNFXQkJCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTUVBU19SRVNfTk9dCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTUVTU0FHRV9JRF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9TWVNfSU5GT19UWVBFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX01TX1BPV0VSX1BBUkFNXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9CU19QT1dFUl9QQVJBTV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUFJFUFJPQ19QQVJBTV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUFJFUFJPQ19NRUFTXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJLy9bUlNMX0lFX0lNTV9BU1NfSU5GT10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCS8vW1JTTF9JRV9TTVNDQl9JTkZPXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyMyB9LAorKwkJLy9bUlNMX0lFX01TX1RJTUlOR19PRkZTRVRdCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9FUlJfTVNHXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9GVUxMX0JDQ0hfSU5GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DSF9ORUVERURdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfQ0JfQ01EX1RZUEVdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfU01TQ0JfTUVTU10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRlVMTF9JTU1fQVNTX0lORl0JPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJLy9bUlNMX0lFX1NBQ0NIX0lORk9dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NCQ0hfTE9BRF9JTkZdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfU01TQ0JfQ0hfSU5EXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0dSUF9DQUxMX1JFRl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfREVTQ10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTkNIX0RSWF9JTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NNRF9JTkRdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0VNTFBQX1BSSU9dCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfVUlDXQkJCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTUFJTl9DSF9SRUZdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTVVMVElSQVRFX0NPTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01VTFRJUkFURV9DTlRSTF0JPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1NVUF9DT0RFQ19UWVBFU10JPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DT0RFQ19DT05GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9SVERdCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1RGT19TVEFUVVNdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTExQX0FQRFVdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0lQQUNfUkVNT1RFX0lQXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisrCQlbUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlRdCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9JUEFDX0xPQ0FMX0lQXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisrCQlbUlNMX0lFX0lQQUNfQ09OTl9TVEFUXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9JUEFDX0xPQ0FMX1BPUlRdCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9JUEFDX1NQRUVDSF9NT0RFXQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfSVBBQ19DT05OX0lEXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyXQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJfSwKKyt9OworKworIC8qIDkuMy4xIENoYW5uZWwgbnVtYmVyCQkJOS4zLjEJTSBUViAyICovCisgc3RhdGljIGludAorIGRpc3NlY3RfcnNsX2llX2NoX25vKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbyBfVV8sIHByb3RvX3RyZWUgKnRyZWUsIGludCBvZmZzZXQsIGdib29sZWFuIGlzX21hbmRhdG9yeSkKK0BAIC0yMDQyLDcgKzIyNDYsNiBAQCBkaXNzZWN0X3JzbF9pZV9lcnJfbXNnKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwgaW50CisgCXByb3RvX2l0ZW1fc2V0X2xlbih0aSwgbGVuZ3RoKzIpOworIAorIAlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9pZV9sZW5ndGgsIHR2Yiwgb2Zmc2V0LCAxLCBGQUxTRSk7CistCW9mZnNldCsrOworIAorIAkvKiBSZWNlaXZlZCBNZXNzYWdlICovCisgCW9mZnNldCA9IGRpc3NjdF9yc2xfbXNnKHR2YiwgcGluZm8sIGllX3RyZWUsIG9mZnNldCk7CitAQCAtMjkwNywxMiArMzExMCwxODQgQEAgZGlzc2VjdF9yc2xfaWVfdGZvX3RyYW5zcF9jb250KHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbyBfVV8sIHByb3RvX3RyZWUKKyB9CisgCisgc3RhdGljIGludAorK2Rpc3NjdF9yc2xfaXBhY2Nlc3NfbXNnKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwJCQkJICAgIGludCBvZmZzZXQpCisreworKwlndWludDggbXNnX3R5cGU7CisrCWd1aW50MzIgbG9jYWxfYWRkciA9IDA7CisrCWd1aW50MTYgbG9jYWxfcG9ydCA9IDA7CisrCWFkZHJlc3Mgc3JjX2FkZHI7CisrCisrCW1zZ190eXBlID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpJjB4N2Y7CisrCW9mZnNldCsrOworKworKyNpZiAwCisrCXN3aXRjaCAobXNnX3R5cGUpIHsKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19DUkNYOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1hfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1hfTkFDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19NRENYOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX01EQ1hfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX01EQ1hfTkFDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19ETENYX0lORDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19ETENYOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RMQ1hfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RMQ1hfTkFDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfTkFDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfTkFDSzoKKysJCS8qIENoYW5uZWwgbnVtYmVyCQkJOS4zLjEJTSBUViAyCQkqLworKwkJb2Zmc2V0ID0gZGlzc2VjdF9yc2xfaWVfY2hfbm8odHZiLCBwaW5mbywgdHJlZSwgb2Zmc2V0LCBUUlVFKTsKKysJCWJyZWFrOworKwl9CisrI2VuZGlmCisrCS8qIHBhcnNlIFRMViBhdHRyaWJ1dGVzICovCisrCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgeworKwkJZ3VpbnQ4IHRhZzsKKysJCXVuc2lnbmVkIGludCBsZW4sIGhsZW4sIGxlbl9sZW47CisrCQljb25zdCBzdHJ1Y3QgdGx2X2RlZiAqdGRlZjsKKysJCXByb3RvX2l0ZW0gKnRpOworKwkJcHJvdG9fdHJlZSAqaWVfdHJlZTsKKysKKysJCXRhZyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCXRkZWYgPSAmcnNsX2F0dF90bHZkZWYuZGVmW3RhZ107CisrCisrCQlzd2l0Y2ggKHRkZWYtPnR5cGUpIHsKKysJCWNhc2UgVExWX1RZUEVfRklYRUQ6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gdGRlZi0+Zml4ZWRfbGVuOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UOgorKwkJCWhsZW4gPSAxOworKwkJCWxlbl9sZW4gPSAwOworKwkJCWxlbiA9IDA7CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1RWOgorKwkJCWhsZW4gPSAxOworKwkJCWxlbl9sZW4gPSAwOworKwkJCWxlbiA9IDE7CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1RMVjoKKysJCQlobGVuID0gMjsKKysJCQlsZW5fbGVuID0gMTsKKysJCQlsZW4gPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKTsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVEwxNlY6CisrCQkJaGxlbiA9IDM7CisrCQkJbGVuX2xlbiA9IDI7CisrCQkJbGVuID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSkgPDwgOCB8CisrCQkJCQl0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsyKTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJaGxlbiA9IGxlbl9sZW4gPSBsZW4gPSAwOworKwkJCURJU1NFQ1RPUl9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKysJCQlicmVhazsKKysJCX0KKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9yc2xfaWVfaWQsIHR2Yiwgb2Zmc2V0LCAxLCBGQUxTRSk7CisrCQlpZV90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X2llX2xvY2FsX3BvcnQpOworKwkJb2Zmc2V0ICs9IGhsZW47CisrCisrCQlzd2l0Y2ggKHRhZykgeworKwkJY2FzZSBSU0xfSUVfQ0hfTk86CisrCQkJZGlzc2VjdF9yc2xfaWVfY2hfbm8odHZiLCBwaW5mbywgaWVfdHJlZSwgb2Zmc2V0LCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9GUkFNRV9OTzoKKysJCQlkaXNzZWN0X3JzbF9pZV9mcmFtZV9ubyh0dmIsIHBpbmZvLCBpZV90cmVlLCBvZmZzZXQsIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX01TX1BPVzoKKysJCQlkaXNzZWN0X3JzbF9pZV9tc19wb3codHZiLCBwaW5mbywgaWVfdHJlZSwgb2Zmc2V0LCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1JFTU9URV9JUDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9yZW1vdGVfaXAsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19SRU1PVEVfUE9SVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9yZW1vdGVfcG9ydCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX0xPQ0FMX0lQOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2xvY2FsX2lwLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlsb2NhbF9hZGRyID0gdHZiX2dldF9pcHY0KHR2Yiwgb2Zmc2V0KTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfTE9DQUxfUE9SVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9sb2NhbF9wb3J0LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlsb2NhbF9wb3J0ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3NwZWVjaF9tb2RlX3MsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3NwZWVjaF9tb2RlX20sIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDoKKysJCWNhc2UgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3J0cF9wYXlsb2FkLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfUlRQX0NTRF9GTVQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcnRwX2NzZF9mbXRfZCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcnRwX2NzZF9mbXRfaXIsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19DT05OX0lEOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2Nvbm5faWQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19DT05OX1NUQVQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfdHhfcGt0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X3R4X29jdHMsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrNCwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X3J4X3BrdHMsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrOCwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X3J4X29jdHMsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMTIsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF9sb3N0X3BrdHMsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMTYsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF9pYV9qaXR0ZXIsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMjAsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF9hdmdfdHhfZGx5LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzI0LCA0LCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQl9CisrCQlvZmZzZXQgKz0gbGVuOworKwl9CisrCisrCXN3aXRjaCAobXNnX3R5cGUpIHsKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19DUkNYX0FDSzoKKysJCS8qIE5vdGlmeSB0aGUgUlRQIGFuZCBSVENQIGRpc3NlY3RvcnMgYWJvdXQgYSBuZXcgUlRQIHN0cmVhbSAqLworKwkJc3JjX2FkZHIudHlwZSA9IEFUX0lQdjQ7CisrCQlzcmNfYWRkci5sZW4gPSA0OworKwkJc3JjX2FkZHIuZGF0YSA9IChndWludDggKikmbG9jYWxfYWRkcjsKKysJCXJ0cF9hZGRfYWRkcmVzcyhwaW5mbywgJnNyY19hZGRyLCBsb2NhbF9wb3J0LCAwLAorKwkJCQkiR1NNIEEtYmlzL0lQIiwgcGluZm8tPmZkLT5udW0sIDAsIE5VTEwpOworKwkJcnRjcF9hZGRfYWRkcmVzcyhwaW5mbywgJnNyY19hZGRyLCBsb2NhbF9wb3J0KzEsIDAsCisrCQkJCSAiR1NNIEEtYmlzL0lQIiwgcGluZm8tPmZkLT5udW0pOworKwkJYnJlYWs7CisrCX0KKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrc3RhdGljIGludAorIGRpc3NjdF9yc2xfbXNnKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwgaW50IG9mZnNldCkKKyB7CistCWd1aW50OAltc2dfdHlwZTsKKysJZ3VpbnQ4CW1zZ19kaXNjLCBtc2dfdHlwZTsKKyAKKysJbXNnX2Rpc2MgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsrKSA+PiAxOworIAltc2dfdHlwZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2YixvZmZzZXQpJjB4N2Y7CisgCXByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfcnNsX21zZ190eXBlLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworKworKwlpZiAobXNnX2Rpc2MgPT0gUlNMX01TR0RJU0NfSVBBQ0NFU1MpIHsKKysJCW9mZnNldCA9IGRpc3NjdF9yc2xfaXBhY2Nlc3NfbXNnKHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldCk7CisrCQlyZXR1cm4gb2Zmc2V0OworKwl9CisgCW9mZnNldCsrOworIAorIAlzd2l0Y2ggKG1zZ190eXBlKXsKK0BAIC0zNDgwLDYgKzM4NTUsMTggQEAgZGlzc2N0X3JzbF9tc2codHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLCBpbnQgb2Zmc2V0KQorIAkJLyogTExQIEFQRFUgOS4zLjU4IE0gTFYgMi1OICovCisgCQlvZmZzZXQgPSBkaXNzZWN0X3JzbF9pZV9sbHBfYXBkdSh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQsIFRSVUUpOworIAkJYnJlYWs7CisrCS8qIHRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgYXJlIGlwLmFjY2VzcyBzcGVjaWZpYyBidXQgc2VudCB3aXRob3V0CisrCSAqIGlwLmFjY2VzcyBtZW1zc2FnZSBkaXNjcmltaW5hdG9yICovCisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfTUVBU19QUF9ERUY6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9JTlE6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9SRVNQOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9OQUNLOgorKwkJb2Zmc2V0ID0gZGlzc2N0X3JzbF9pcGFjY2Vzc19tc2codHZiLCBwaW5mbywgdHJlZSwgb2Zmc2V0LTEpOworIAlkZWZhdWx0OgorIAkJYnJlYWs7CisgCX0KK0BAIC0zNDg3LDYgKzM4NzQsNDAgQEAgZGlzc2N0X3JzbF9tc2codHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLCBpbnQgb2Zmc2V0KQorIAlyZXR1cm4gb2Zmc2V0OworIAorIH0KKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19zcG1fc192YWxzW10gPSB7CisrCXsgMCwJIkdTTSBGUiBjb2RlYyAoR1NNIHR5cGUgMSwgRlMpIiB9LAorKwl7IDEsCSJHU00gRUZSIGNvZGVjIChHU00gdHlwZSAyLCBGUykiIH0sCisrCXsgMiwgCSJHU00gQU1SL0ZSIGNvZGVjIChHU00gdHlwZSAzLCBGUykiIH0sCisrCXsgMywJIkdTTSBIUiBjb2RlYyAoR1NNIHR5cGUgMSwgSFMpIiB9LAorKwl7IDUsCSJHU00gQU1SL0hSIGNvZGVjIChHU00gdHlwZSAzLCBIUykiIH0sCisrCXsgMHhmLAkiQXMgc3BlY2lmaWVkIGJ5IFJUUCBQYXlsb2FkIFR5cGUgSUUiIH0sCisrCXsgMCwJTlVMTCB9CisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19zcG1fbV92YWxzW10gPSB7CisrCXsgMCwJIlNlbmQgYW5kIFJlY2VpdmUiIH0sCisrCXsgMSwJIlJlY2VpdmUgT25seSIgfSwKKysJeyAyLAkiU2VuZCBPbmx5IiB9LAorKwl7IDAsIAlOVUxMIH0KKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX2lwYWNjX3J0cF9jc2RfZm10X2RfdmFsc1tdID0geworKwl7IDAsCSJFeHRlcm5hbCBUUkFVIGZvcm1hdCIgfSwKKysJeyAxLAkiTm9uLVRSQVUgUGFja2VkIGZvcm1hdCIgfSwKKysJeyAyLAkiVFJBVSB3aXRoaW4gdGhlIEJUUyIgfSwKKysJeyAzLAkiSVdGLUZyZWUgQlRTLUJUUyBEYXRhIiB9LAorKwl7IDAsIAlOVUxMIH0KKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX2lwYWNjX3J0cF9jc2RfZm10X2lyX3ZhbHNbXSA9IHsKKysJeyAwLAkiOGtiL3MiIH0sCisrCXsgMSwJIjE2a2IvcyIgfSwKKysJeyAyLAkiMzJrYi9zIiB9LAorKwl7IDMsCSI2NGtiL3MiIH0sCisrCXsgMCwJTlVMTCB9CisrfTsKKysKKyBzdGF0aWMgdm9pZAorIGRpc3NlY3RfcnNsKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSkKKyB7CitAQCAtMzUxNCw3ICszOTM1LDYgQEAgZGlzc2VjdF9yc2wodHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlKQorIAkJLyogOS4xIE1lc3NhZ2UgZGlzY3JpbWluYXRvciAqLworIAkJcHJvdG9fdHJlZV9hZGRfaXRlbShyc2xfdHJlZSwgaGZfcnNsX21zZ19kc2MsIHR2Yiwgb2Zmc2V0LCAxLCBGQUxTRSk7CisgCQlwcm90b190cmVlX2FkZF9pdGVtKHJzbF90cmVlLCBoZl9yc2xfVF9iaXQsIHR2Yiwgb2Zmc2V0LCAxLCBGQUxTRSk7CistCQlvZmZzZXQrKzsKKyAKKyAJCW9mZnNldCA9IGRpc3NjdF9yc2xfbXNnKHR2YiwgcGluZm8sIHJzbF90cmVlLCBvZmZzZXQpOworIAorQEAgLTM4ODQsNiArNDMwNCw4NiBAQCB2b2lkIHByb3RvX3JlZ2lzdGVyX3JzbCh2b2lkKQorIAkJCUZUX1VJTlQ4LCBCQVNFX0RFQywgVkFMUyhyc2xfZW1scHBfcHJpb192YWxzKSwgMHgwMywKKyAJCQlOVUxMLCBIRklMTCB9CisgCQl9LAorKwkJeyAmaGZfcnNsX3NwZWVjaF9tb2RlX3MsCisrCQkJeyAiaXAuYWNjZXNzIFNwZWVjaCBNb2RlIFMiLCAicnNsLmlwYWNjLnNwZWVjaF9tb2RlX3MiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKHJzbF9pcGFjY19zcG1fc192YWxzKSwKKysJCQkgIDB4ZiwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9zcGVlY2hfbW9kZV9tLAorKwkJCXsgImlwLmFjY2VzcyBTcGVlY2ggTW9kZSBNIiwgInJzbC5pcGFjYy5zcGVlY2hfbW9kZV9tIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhyc2xfaXBhY2Nfc3BtX21fdmFscyksCisrCQkJICAweGYwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2Nvbm5fc3RhdCwKKysJCQl7ICJpcC5hY2Nlc3MgQ29ubmVjdGlvbiBTdGF0aXN0aWNzIiwicnNsLmlwYWNjLmNvbm5fc3RhdCIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAweDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY29ubl9pZCwKKysJCQl7ICJpcC5hY2Nlc3MgQ29ubmVjdGlvbiBJRCIsCSJyc2wuaXBhY2MuY29ubl9pZCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfcnRwX3BheWxvYWQsCisrCQkJeyAiaXAuYWNjZXNzIFJUUCBQYXlsb2FkIFR5cGUiLAkicnNsLmlwYWNjLnJ0cF9wYXlsb2FkIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMHgwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX3J0cF9jc2RfZm10X2QsCisrCQkJeyAiaXAuYWNjZXNzIFJUUCBDU0QgRm9ybWF0IEQiLCAicnNsLmlwYWNjLnJ0cF9jc2RfZm10X2QiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKHJzbF9pcGFjY19ydHBfY3NkX2ZtdF9kX3ZhbHMpLAorKwkJCSAgMHgwZiwgTlVMTCwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfcnRwX2NzZF9mbXRfaXIsCisrCQkJeyAiaXAuYWNjZXNzIFJUUCBDU0QgRm9ybWF0IElSIiwgInJzbC5pcGFjYy5ydHBfY3NkX2ZtdF9pciIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMocnNsX2lwYWNjX3J0cF9jc2RfZm10X2lyX3ZhbHMpLAorKwkJCSAgMHhmMCwgTlVMTCwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfbG9jYWxfcG9ydCwKKysJCQl7ICJpcC5hY2Nlc3MgTG9jYWwgUlRQIFBvcnQiLAkicnNsLmlwYWNjLmxvY2FsX3BvcnQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwLAorKwkJCSAgImlwLmFjY2VzcyBMb2NhbCBSVFAgUG9ydCIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX3JlbW90ZV9wb3J0LAorKwkJCXsgImlwLmFjY2VzcyBSZW1vdGUgUlRQIFBvcnQiLAkicnNsLmlwYWNjLnJlbW90ZV9wb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4MCwKKysJCQkgICJpcC5hY2Nlc3MgUmVtb3RlIFJUUCBQb3J0IiwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfbG9jYWxfaXAsCisrCQkJeyAiaXAuYWNjZXNzIExvY2FsIElQIEFkZHJlc3MiLAkicnNsLmlwYWNjLmxvY2FsX2lwIiwKKysJCQkgIEZUX0lQdjQsIEJBU0VfTk9ORSwgTlVMTCwgMHgwLAorKwkJCSAgImlwLmFjY2VzcyBMb2NhbCBJUCBBZGRyZXNzIiwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfcmVtb3RlX2lwLAorKwkJCXsgImlwLmFjY2VzcyBSZW1vdGUgSVAgQWRkcmVzcyIsICJyc2wuaXBhY2MucmVtb3RlX2lwIiwKKysJCQkgIEZUX0lQdjQsIEJBU0VfTk9ORSwgTlVMTCwgMHgwLAorKwkJCSAgImlwLmFjY2VzcyBSZW1vdGUgSVAgQWRkcmVzcyIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X3R4X3BrdHMsCisrCQkJeyAiUGFja2V0cyBTZW50IiwgInJzbC5pcGFjYy5jc3RhdC50eF9wa3RzIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfdHhfb2N0cywKKysJCQl7ICJPY3RldHMgU2VudCIsICJyc2wuaXBhY2MuY3N0YXQudHhfb2N0ZXRzIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfcnhfcGt0cywKKysJCQl7ICJQYWNrZXRzIFJlY2VpdmVkIiwgInJzbC5pcGFjYy5jc3RhdC5yeF9wa3RzIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfcnhfb2N0cywKKysJCQl7ICJPY3RldHMgUmVjZWl2ZWQiLCAicnNsLmlwYWNjLmNzdGF0LnJ4X29jdGV0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X2xvc3RfcGt0cywKKysJCQl7ICJQYWNrZXRzIExvc3QiLCAicnNsLmlwYWNjLmNzdGF0Lmxvc3RfcGt0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X2lhX2ppdHRlciwKKysJCQl7ICJJbnRlci1hcnJpdmFsIEppdHRlciIsICJyc2wuaXBhY2MuY3N0YXQuaWFfaml0dGVyIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfYXZnX3R4X2RseSwKKysJCQl7ICJBdmVyYWdlIFR4IERlbGF5IiwgInJzbC5pcGFjYy5jc3RhdC5hdmdfdHhfZGVsYXkiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKyAJfTsKKyAJc3RhdGljIGdpbnQgKmV0dFtdID0geworIAkJJmV0dF9yc2wsCitAQCAtMzk0MSw2ICs0NDQxLDE0IEBAIHZvaWQgcHJvdG9fcmVnaXN0ZXJfcnNsKHZvaWQpCisgCQkmZXR0X2llX21lYXNfcmVzX25vLAorIAkJJmV0dF9pZV9tZXNzYWdlX2lkLAorIAkJJmV0dF9pZV9zeXNfaW5mb190eXBlLAorKwkJJmV0dF9pZV9zcGVlY2hfbW9kZSwKKysJCSZldHRfaWVfY29ubl9zdGF0LAorKwkJJmV0dF9pZV9jb25uX2lkLAorKwkJJmV0dF9pZV9yZW1vdGVfaXAsCisrCQkmZXR0X2llX3JlbW90ZV9wb3J0LAorKwkJJmV0dF9pZV9sb2NhbF9wb3J0LAorKwkJJmV0dF9pZV9sb2NhbF9pcCwKKysJCSZldHRfaWVfcnRwX3BheWxvYWQsCisgCX07CisgCisgCS8qIFJlZ2lzdGVyIHRoZSBwcm90b2NvbCBuYW1lIGFuZCBkZXNjcmlwdGlvbiAqLworLS0gCisxLjcuMC4xCisKZGlmZiAtLWdpdCBhL3dpcmVzaGFyay9yc2wtc3lzdGVtX2luZm8ucGF0Y2ggYi93aXJlc2hhcmsvcnNsLXN5c3RlbV9pbmZvLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDVjNjUKLS0tIC9kZXYvbnVsbAorKysgYi93aXJlc2hhcmsvcnNsLXN5c3RlbV9pbmZvLnBhdGNoCkBAIC0wLDAgKzEsMTMgQEAKK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHdpcmVzaGFyay5vcmlnL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworQEAgLTIyOTEsNyArMjI5MSw3IEBACisgCisgCXByb3RvX3RyZWVfYWRkX3RleHQoaWVfdHJlZSwgdHZiLG9mZnNldCxsZW5ndGgsIkxheWVyIDMgbWVzc2FnZSIpOworIAluZXh0X3R2YiA9IHR2Yl9uZXdfc3Vic2V0KHR2Yiwgb2Zmc2V0LCBsZW5ndGgsIGxlbmd0aCk7CistCS8qIGNhbGxfZGlzc2VjdG9yKGdzbV9hX2R0YXBfaGFuZGxlLCBuZXh0X3R2YiwgcGluZm8sIHRvcF90cmVlKTsqLworKwljYWxsX2Rpc3NlY3Rvcihnc21fYV9jY2NoX2hhbmRsZSwgbmV4dF90dmIsIHBpbmZvLCB0b3BfdHJlZSk7CisgCisgCW9mZnNldCA9IG9mZnNldCArIGxlbmd0aDsKKyAK