ZGlmZiAtLWdpdCBhL2hscnN5bmMvaGxyc3luYy5weSBiL2hscnN5bmMvaGxyc3luYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNGE0OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvaGxyc3luYy9obHJzeW5jLnB5CkBAIC0wLDAgKzEsMTI1IEBACisjIS91c3IvYmluL3B5dGhvbjIuNQorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2Zyb20gcHlzcWxpdGUyIGltcG9ydCBkYmFwaTIgYXMgc3FsaXRlMworaW1wb3J0IHN5cworCitobHIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMV0pCit3ZWIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMl0pCisKKyMgc3dpdGNoIHRvIGF1dG9jb21taXQKK2hsci5pc29sYXRpb25fbGV2ZWwgPSBOb25lCit3ZWIuaXNvbGF0aW9uX2xldmVsID0gTm9uZQorCitobHIucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdword2ViLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKKword2l0aCBobHI6CisJaGxyX3N1YnNjcnMgPSBobHIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyCisJIiIiKS5mZXRjaGFsbCgpCisJaGxyX3Rva2VucyA9IGhsci5leGVjdXRlKCIiIgorCQlTRUxFQ1QgKiBGUk9NIEF1dGhUb2tlbgorCSIiIikuZmV0Y2hhbGwoKQorCit3aXRoIHdlYjoKKwl3ZWJfdG9rZW5zID0gd2ViLmV4ZWN1dGUoIiIiCisJCVNFTEVDVCAqIEZST00gcmVnX3Rva2VucworCSIiIikuZmV0Y2hhbGwoKQorCXdlYl9zbXMgPSB3ZWIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBzbXNfcXVldWUKKwkiIiIpLmZldGNoYWxsKCkKKworIyBpbmRleCBieSBzdWJzY3IgaWQKK2hscl9zdWJzY3JzX2J5X2lkID0ge30KK2hscl9zdWJzY3JzX2J5X2V4dCA9IHt9CitobHJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiBobHJfc3Vic2NyczoKKwlobHJfc3Vic2Nyc19ieV9pZFt4WydpZCddXSA9IHgKKwlobHJfc3Vic2Nyc19ieV9leHRbeFsnZXh0ZW5zaW9uJ11dID0geAorZGVsIGhscl9zdWJzY3JzCitmb3IgeCBpbiBobHJfdG9rZW5zOgorCWhscl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgaGxyX3Rva2VucworCit3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiB3ZWJfdG9rZW5zOgorCXdlYl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgd2ViX3Rva2VucworCisjIHJlbW92ZSBsZWZ0b3ZlciB3ZWJfdG9rZW5zIGFuZCBjb3JyZWN0IGluY29uc2lzdGVudCBmaWVsZHMKK3dpdGggd2ViOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiBzdWJzY3IgaXMgTm9uZToKKwkJCXdlYi5leGVjdXRlKCIiIgorCQkJCSAgICAgIERFTEVURSBGUk9NIHJlZ190b2tlbnMgV0hFUkUgc3Vic2NyaWJlcl9pZCA9ID8KKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sKSkKKwkJCWRlbCB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZFt4WydzdWJzY3JpYmVyX2lkJ11dCisJCQljb250aW51ZQorCQlpZiBzdHIoeFsnaW1zaSddKSAhPSBzdHIoc3Vic2NyWydpbXNpJ10pIG9yIFwKKwkJICAgeFsnZXh0ZW5zaW9uJ10gIT0gc3Vic2NyWydleHRlbnNpb24nXSBvciBcCisJCSAgIHhbJ3Rtc2knXSAhPSBzdWJzY3JbJ3Rtc2knXSBvciBcCisJCSAgIHhbJ2xhYyddICE9IHN1YnNjclsnbGFjJ106CisJCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBVUERBVEUgcmVnX3Rva2VucworCQkJCSAgICAgIFNFVCBpbXNpID0gPywgZXh0ZW5zaW9uID0gPywgdG1zaSA9ID8sIGxhYyA9ID8KKwkJCQkgICAgICBXSEVSRSBzdWJzY3JpYmVyX2lkID0gPworCQkJCSAgICIiIiwgKHN0cihzdWJzY3JbJ2ltc2knXSksIHN1YnNjclsnZXh0ZW5zaW9uJ10sCisJCQkJICAgc3Vic2NyWyd0bXNpJ10sIHN1YnNjclsnbGFjJ10sIHhbJ3N1YnNjcmliZXJfaWQnXSkpCisKKyMgYWRkIG1pc3Npbmcgd2ViX3Rva2Vucword2l0aCB3ZWI6CisJZm9yIHggaW4gaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWQudmFsdWVzKCk6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2lkLmdldCh4WydzdWJzY3JpYmVyX2lkJ10sIE5vbmUpCisJCWlmIHN1YnNjciBpcyBOb25lOgorCQkJaGxyLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgREVMRVRFIEZST00gQXV0aFRva2VuIFdIRVJFIHN1YnNjcmliZXJfaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisJCQlkZWwgaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWRbeFsnc3Vic2NyaWJlcl9pZCddXQorCQkJY29udGludWUKKwkJd2VidG9rZW4gPSB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB3ZWJ0b2tlbiBpcyBOb25lOgorCQkJd2ViLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgSU5TRVJUIElOVE8gcmVnX3Rva2VucworCQkJCSAgICAgIChzdWJzY3JpYmVyX2lkLCBleHRlbnNpb24sIHJlZ19jb21wbGV0ZWQsIG5hbWUsIGVtYWlsLCBsYWMsIGltc2ksIHRva2VuLCB0bXNpKQorCQkJCSAgICAgIFZBTFVFUworCQkJCSAgICAgICg/LCA/LCAwLCA/LCAnJywgPywgPywgPywgPykKKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sIHN1YnNjclsnZXh0ZW5zaW9uJ10sIHN1YnNjclsnbmFtZSddLAorCQkJCSAgIHN1YnNjclsnbGFjJ10sIHN0cihzdWJzY3JbJ2ltc2knXSksIHhbJ3Rva2VuJ10sIHN1YnNjclsndG1zaSddKSkKKworIyBhdXRob3JpemUgc3Vic2NyaWJlcnMKK3dpdGggaGxyOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB4WydyZWdfY29tcGxldGVkJ10gYW5kIG5vdCBzdWJzY3JbJ2F1dGhvcml6ZWQnXToKKwkJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIFVQREFURSBTdWJzY3JpYmVyCisJCQkJICAgICAgU0VUIGF1dGhvcml6ZWQgPSAxCisJCQkJICAgICAgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisKKyMgU3luYyBTTVMgZnJvbSB3ZWIgdG8gaGxyCit3aXRoIGhscjoKKwlmb3Igc21zIGluIHdlYl9zbXM6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2V4dC5nZXQoc21zWydyZWNlaXZlcl9leHQnXSkKKwkJaWYgc3Vic2NyIGlzIE5vbmU6CisJCQlwcmludCAnJXMgbm90IGZvdW5kJyAlIHNtc1sncmVjZWl2ZXJfZXh0J10KKwkJCWNvbnRpbnVlCisJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIElOU0VSVCBJTlRPIFNNUworCQkJCSAgICAgIChjcmVhdGVkLCBzZW5kZXJfaWQsIHJlY2VpdmVyX2lkLCByZXBseV9wYXRoX3JlcSwgc3RhdHVzX3JlcF9yZXEsIHByb3RvY29sX2lkLCBkYXRhX2NvZGluZ19zY2hlbWUsIHVkX2hkcl9pbmQsIHRleHQpCisJCQkJICAgICAgVkFMVUVTCisJCQkJICAgICAgKD8sIDEsID8sIDAsIDAsIDAsIDAsIDAsID8pCisJCQkJICAgIiIiLCAoc21zWydjcmVhdGVkJ10sIHN1YnNjclsnaWQnXSwgc21zWyd0ZXh0J10pKQord2l0aCB3ZWI6CisJZm9yIHNtcyBpbiB3ZWJfc21zOgorCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBERUxFVEUgRlJPTSBzbXNfcXVldWUgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoc21zWydpZCddLCkpCisKKworaGxyLmNsb3NlKCkKK3dlYi5jbG9zZSgpCisKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi9saWJvc21vY29yZS8uZ2l0aWdub3JlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSAuZ2l0aWdub3JlCnJlbmFtZSB0byBsaWJvc21vY29yZS8uZ2l0aWdub3JlCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvbGlib3Ntb2NvcmUvQ09QWUlORwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gQ09QWUlORwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvQ09QWUlORwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9saWJvc21vY29yZS9jb25maWd1cmUuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbmZpZ3VyZS5pbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvY29uZmlndXJlLmluCmRpZmYgLS1naXQgYS9naXQtdmVyc2lvbi1nZW4gYi9saWJvc21vY29yZS9naXQtdmVyc2lvbi1nZW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdpdC12ZXJzaW9uLWdlbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvZ2l0LXZlcnNpb24tZ2VuCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDAxNWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxIEBACitTVUJESVJTID0gb3Ntb2NvcmUKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTAxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTIgQEAKK29zbW9jb3JlX0hFQURFUlMgPSBzaWduYWwuaCBsaW51eGxpc3QuaCB0aW1lci5oIHNlbGVjdC5oIG1zZ2IuaCBcCisJCSAgIHRsdi5oIGJpdHZlYy5oIGNvbXAxMjguaCBzdGF0aXN0aWNzLmggZ3NtX3V0aWxzLmggdXRpbHMuaCBcCisJCSAgIGdzbXRhcC5oIHdyaXRlX3F1ZXVlLmggcnNsLmggZ3NtNDguaCByeGxldl9zdGF0LmggbW5jYy5oIFwKKwkJICAgZ3NtNDhfaWUuaCBsb2dnaW5nLmggZ3NtMDgwOC5oIHJhdGVfY3RyLmgKKworaWYgRU5BQkxFX1RBTExPQworb3Ntb2NvcmVfSEVBREVSUyArPSB0YWxsb2MuaAorZW5kaWYKKworb3Ntb2NvcmVkaXIgPSAkKGluY2x1ZGVkaXIpL29zbW9jb3JlCisKK1NVQkRJUlMgPSBwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9iaXR2ZWMuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvYml0dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EyNmJjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvYml0dmVjLmgKQEAgLTAsMCArMSw2NSBAQAorI2lmbmRlZiBfQklUVkVDX0gKKyNkZWZpbmUgX0JJVFZFQ19ICisKKy8qIGJpdCB2ZWN0b3IgdXRpbGl0eSByb3V0aW5lcyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKy8qIEluIEdTTSBtYWMgYmxvY2tzLCBldmVyeSBiaXQgY2FuIGJlIDAgb3IgMSwgb3IgTCBvciBILiAgTC9IIGFyZQorICogZGVmaW5lZCByZWxhdGl2ZSB0byB0aGUgMHgyYiBwYWRkaW5nIHBhdHRlcm4gKi8KK2VudW0gYml0X3ZhbHVlIHsKKwlaRVJPCT0gMCwKKwlPTkUJPSAxLAorCUwJPSAyLAorCUgJPSAzLAorfTsKKworc3RydWN0IGJpdHZlYyB7CisJdW5zaWduZWQgaW50IGN1cl9iaXQ7CS8qIGN1cnNlciB0byB0aGUgbmV4dCB1bnVzZWQgYml0ICovCisJdW5zaWduZWQgaW50IGRhdGFfbGVuOwkvKiBsZW5ndGggb2YgZGF0YSBhcnJheSBpbiBieXRlcyAqLworCXVpbnQ4X3QgKmRhdGE7CQkvKiBwb2ludGVyIHRvIGRhdGEgYXJyYXkgKi8KK307CisKKy8qIGNoZWNrIGlmIHRoZSBiaXQgaXMgMCBvciAxIGZvciBhIGdpdmVuIHBvc2l0aW9uIGluc2lkZSBhIGJpdHZlYyAqLworZW51bSBiaXRfdmFsdWUgYml0dmVjX2dldF9iaXRfcG9zKGNvbnN0IHN0cnVjdCBiaXR2ZWMgKmJ2LCB1bnNpZ25lZCBpbnQgYml0bnIpOworCisvKiBnZXQgdGhlIE50aCBzZXQgYml0IGluc2lkZSB0aGUgYml0IHZlY3RvciAqLwordW5zaWduZWQgaW50IGJpdHZlY19nZXRfbnRoX3NldF9iaXQoY29uc3Qgc3RydWN0IGJpdHZlYyAqYnYsIHVuc2lnbmVkIGludCBuKTsKKworLyogU2V0IGEgYml0IGF0IGdpdmVuIHBvc2l0aW9uICovCitpbnQgYml0dmVjX3NldF9iaXRfcG9zKHN0cnVjdCBiaXR2ZWMgKmJ2LCB1bnNpZ25lZCBpbnQgYml0bnVtLAorCQkJZW51bSBiaXRfdmFsdWUgYml0KTsKKworLyogU2V0IHRoZSBuZXh0IGJpdCBpbiB0aGUgdmVjdG9yICovCitpbnQgYml0dmVjX3NldF9iaXQoc3RydWN0IGJpdHZlYyAqYnYsIGVudW0gYml0X3ZhbHVlIGJpdCk7CisKKy8qIFNldCBtdWx0aXBsZSBiaXRzIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uICovCitpbnQgYml0dmVjX3NldF9iaXRzKHN0cnVjdCBiaXR2ZWMgKmJ2LCBlbnVtIGJpdF92YWx1ZSAqYml0cywgaW50IGNvdW50KTsKKworLyogQWRkIGFuIHVuc2lnbmVkIGludGVnZXIgKG9mIGxlbmd0aCBjb3VudCBiaXRzKSB0byBjdXJyZW50IHBvc2l0aW9uICovCitpbnQgYml0dmVjX3NldF91aW50KHN0cnVjdCBiaXR2ZWMgKmJ2LCB1bnNpZ25lZCBpbnQgaW4sIGludCBjb3VudCk7CisKKworLyogUGFkIHRoZSBiaXQgdmVjdG9yIHVwIHRvIGEgY2VydGFpbiBiaXQgcG9zaXRpb24gKi8KK2ludCBiaXR2ZWNfc3BhcmVfcGFkZGluZyhzdHJ1Y3QgYml0dmVjICpidiwgdW5zaWduZWQgaW50IHVwX3RvX2JpdCk7CisKKyNlbmRpZiAvKiBfQklUVkVDX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvY29tcDEyOC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9jb21wMTI4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3ODA4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvY29tcDEyOC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDT01QMTI4IGhlYWRlcgorICoKKyAqIFNlZSBjb21wMTI4LmMgZm9yIGRldGFpbHMKKyAqLworCisjaWZuZGVmIF9fQ09NUDEyOF9IX18KKyNkZWZpbmUgX19DT01QMTI4X0hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qCisgKiBQZXJmb3JtcyB0aGUgQ09NUDEyOCBhbGdvcml0aG0gKHVzZWQgYXMgQTMvQTgpCisgKiBraSAgICA6IHVpbnQ4X3QgWzE2XQorICogc3JhbmQgOiB1aW50OF90IFsxNl0KKyAqIHNyZXMgIDogdWludDhfdCBbNF0KKyAqIGtjICAgIDogdWludDhfdCBbOF0KKyAqLwordm9pZCBjb21wMTI4KHVpbnQ4X3QgKmtpLCB1aW50OF90ICpzcmFuZCwgdWludDhfdCAqc3JlcywgdWludDhfdCAqa2MpOworCisjZW5kaWYgLyogX19DT01QMTI4X0hfXyAqLworCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTA4MDguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtMDgwOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDcxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTA4MDguaApAQCAtMCwwICsxLDQxIEBACisvKiAoQykgMjAwOSwyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LDIwMTAgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworI2lmbmRlZiBPU01PQ09SRV9HU00wODA4X0gKKyNkZWZpbmUgT1NNT0NPUkVfR1NNMDgwOF9ICisKKyNpbmNsdWRlICJ0bHYuaCIKKworc3RydWN0IG1zZ2I7CisKK3N0cnVjdCBtc2diICpnc20wODA4X2NyZWF0ZV9sYXllcjMoc3RydWN0IG1zZ2IgKm1zZywgdWludDE2X3QgbmV0Y29kZSwgdWludDE2X3QgY291bnRyeWNvZGUsIGludCBsYWMsIGludCBjaSk7CitzdHJ1Y3QgbXNnYiAqZ3NtMDgwOF9jcmVhdGVfcmVzZXQodm9pZCk7CitzdHJ1Y3QgbXNnYiAqZ3NtMDgwOF9jcmVhdGVfY2xlYXJfY29tcGxldGUodm9pZCk7CitzdHJ1Y3QgbXNnYiAqZ3NtMDgwOF9jcmVhdGVfY2lwaGVyX2NvbXBsZXRlKHN0cnVjdCBtc2diICpsYXllcjMsIHVpbnQ4X3QgYWxnX2lkKTsKK3N0cnVjdCBtc2diICpnc20wODA4X2NyZWF0ZV9jaXBoZXJfcmVqZWN0KHVpbnQ4X3QgY2F1c2UpOworc3RydWN0IG1zZ2IgKmdzbTA4MDhfY3JlYXRlX2NsYXNzbWFya191cGRhdGUoY29uc3QgdWludDhfdCAqY2xhc3NtYXJrLCB1aW50OF90IGxlbmd0aCk7CitzdHJ1Y3QgbXNnYiAqZ3NtMDgwOF9jcmVhdGVfc2FwaV9yZWplY3QodWludDhfdCBsaW5rX2lkKTsKK3N0cnVjdCBtc2diICpnc20wODA4X2NyZWF0ZV9hc3NpZ25tZW50X2NvbXBsZXRlZChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdWludDhfdCBycl9jYXVzZSwKKwkJCQkJCSB1aW50OF90IGNob3Nlbl9jaGFubmVsLCB1aW50OF90IGVuY3JfYWxnX2lkLAorCQkJCQkJIHVpbnQ4X3Qgc3BlZWNoX21vZGUpOworc3RydWN0IG1zZ2IgKmdzbTA4MDhfY3JlYXRlX2Fzc2lnbm1lbnRfZmFpbHVyZSh1aW50OF90IGNhdXNlLCB1aW50OF90ICpycl9jYXVzZSk7CisKK2NvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiAqZ3NtMDgwOF9hdHRfdGx2ZGVmKCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc200OC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc200OC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWZiYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4LmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfT1NNT0NPUkVfR1NNNDhfSAorI2RlZmluZSBfT1NNT0NPUkVfR1NNNDhfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDhfaWUuaD4KKworLyogQSBwYXJzZWQgR1BSUyByb3V0aW5nIGFyZWEgKi8KK3N0cnVjdCBncHJzX3JhX2lkIHsKKwl1aW50MTZfdAltbmM7CisJdWludDE2X3QJbWNjOworCXVpbnQxNl90CWxhYzsKKwl1aW50OF90CQlyYWM7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIGdzbTQ4X2F0dF90bHZkZWY7Citjb25zdCBjaGFyICpnc200OF9jY19zdGF0ZV9uYW1lKHVpbnQ4X3Qgc3RhdGUpOworY29uc3QgY2hhciAqZ3NtNDhfY2NfbXNnX25hbWUodWludDhfdCBtc2d0eXBlKTsKK2NvbnN0IGNoYXIgKnJyX2NhdXNlX25hbWUodWludDhfdCBjYXVzZSk7CisKK3ZvaWQgZ3NtNDhfZ2VuZXJhdGVfbGFpKHN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCAqbGFpNDgsIHVpbnQxNl90IG1jYywKKwkJCXVpbnQxNl90IG1uYywgdWludDE2X3QgbGFjKTsKK2ludCBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgdG1zaSk7CitpbnQgZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21faW1zaSh1aW50OF90ICpidWYsIGNvbnN0IGNoYXIgKmltc2kpOworCisvKiBDb252ZXJ0IE1vYmlsZSBJZGVudGl0eSAoMTAuNS4xLjQpIHRvIHN0cmluZyAqLworaW50IGdzbTQ4X21pX3RvX3N0cmluZyhjaGFyICpzdHJpbmcsIGNvbnN0IGludCBzdHJfbGVuLAorCQkJY29uc3QgdWludDhfdCAqbWksIGNvbnN0IGludCBtaV9sZW4pOworCisvKiBQYXJzZSBSb3V0ZWluZyBBcmVhIElkZW50aWZpZXIgKi8KK3ZvaWQgZ3NtNDhfcGFyc2VfcmEoc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1Zik7CitpbnQgZ3NtNDhfY29uc3RydWN0X3JhKHVpbnQ4X3QgKmJ1ZiwgY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDA2MTlhCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc200OF9pZS5oCkBAIC0wLDAgKzEsMTA3IEBACisjaWZuZGVmIF9PU01PQ09SRV9HU000OF9JRV9ICisjZGVmaW5lIF9PU01PQ09SRV9HU000OF9JRV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21uY2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaD4KKworLyogZGVjb2RlIGEgJ2NhbGxlZC9jYWxsaW5nL2Nvbm5lY3QgcGFydHkgQkNEIG51bWJlcicgYXMgaW4gMTAuNS40LjcgKi8KK2ludCBnc200OF9kZWNvZGVfYmNkX251bWJlcihjaGFyICpvdXRwdXQsIGludCBvdXRwdXRfbGVuLAorCQkJICAgIGNvbnN0IHVpbnQ4X3QgKmJjZF9sdiwgaW50IGhfbGVuKTsKKworLyogY29udmVydCBhIEFTQ0lJIHBob25lIG51bWJlciB0byAnY2FsbGVkL2NhbGxpbmcvY29ubmVjdCBwYXJ0eSBCQ0QgbnVtYmVyJyAqLworaW50IGdzbTQ4X2VuY29kZV9iY2RfbnVtYmVyKHVpbnQ4X3QgKmJjZF9sdiwgdWludDhfdCBtYXhfbGVuLAorCQkJICAgIGludCBoX2xlbiwgY29uc3QgY2hhciAqaW5wdXQpOworLyogZGVjb2RlICdiZWFyZXIgY2FwYWJpbGl0eScgKi8KK2ludCBnc200OF9kZWNvZGVfYmVhcmVyX2NhcChzdHJ1Y3QgZ3NtX21uY2NfYmVhcmVyX2NhcCAqYmNhcCwKKwkJCSAgICAgY29uc3QgdWludDhfdCAqbHYpOworLyogZW5jb2RlICdiZWFyZXIgY2FwYWJpbGl0eScgKi8KK2ludCBnc200OF9lbmNvZGVfYmVhcmVyX2NhcChzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbHZfb25seSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX2JlYXJlcl9jYXAgKmJjYXApOworLyogZGVjb2RlICdjYWxsIGNvbnRyb2wgY2FwJyAqLworaW50IGdzbTQ4X2RlY29kZV9jY2NhcChzdHJ1Y3QgZ3NtX21uY2NfY2NjYXAgKmNjYXAsIGNvbnN0IHVpbnQ4X3QgKmx2KTsKKy8qIGVuY29kZSAnY2FsbCBjb250cm9sIGNhcCcgKi8KK2ludCBnc200OF9lbmNvZGVfY2NjYXAoc3RydWN0IG1zZ2IgKm1zZywKKwkJCWNvbnN0IHN0cnVjdCBnc21fbW5jY19jY2NhcCAqY2NhcCk7CisvKiBkZWNvZGUgJ2NhbGxlZCBwYXJ0eSBCQ0QgbnVtYmVyJyAqLworaW50IGdzbTQ4X2RlY29kZV9jYWxsZWQoc3RydWN0IGdzbV9tbmNjX251bWJlciAqY2FsbGVkLAorCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KTsKKy8qIGVuY29kZSAnY2FsbGVkIHBhcnR5IEJDRCBudW1iZXInICovCitpbnQgZ3NtNDhfZW5jb2RlX2NhbGxlZChzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJIGNvbnN0IHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxlZCk7CisvKiBkZWNvZGUgY2FsbGVyaWQgb2YgdmFyaW91cyBJRXMgKi8KK2ludCBnc200OF9kZWNvZGVfY2FsbGVyaWQoc3RydWN0IGdzbV9tbmNjX251bWJlciAqY2FsbGVyaWQsCisJCQkgY29uc3QgdWludDhfdCAqbHYpOworLyogZW5jb2RlIGNhbGxlcmlkIG9mIHZhcmlvdXMgSUVzICovCitpbnQgZ3NtNDhfZW5jb2RlX2NhbGxlcmlkKHN0cnVjdCBtc2diICptc2csIGludCBpZSwgaW50IG1heF9sZW4sCisJCQkgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsZXJpZCk7CisvKiBkZWNvZGUgJ2NhdXNlJyAqLworaW50IGdzbTQ4X2RlY29kZV9jYXVzZShzdHJ1Y3QgZ3NtX21uY2NfY2F1c2UgKmNhdXNlLAorCQkJY29uc3QgdWludDhfdCAqbHYpOworLyogZW5jb2RlICdjYXVzZScgKi8KK2ludCBnc200OF9lbmNvZGVfY2F1c2Uoc3RydWN0IG1zZ2IgKm1zZywgaW50IGx2X29ubHksCisJCQljb25zdCBzdHJ1Y3QgZ3NtX21uY2NfY2F1c2UgKmNhdXNlKTsKKy8qIGRlY29kZSAnY2FsbGluZyBudW1iZXInICovCitpbnQgZ3NtNDhfZGVjb2RlX2NhbGxpbmcoc3RydWN0IGdzbV9tbmNjX251bWJlciAqY2FsbGluZywKKwkJCSBjb25zdCB1aW50OF90ICpsdik7CisvKiBlbmNvZGUgJ2NhbGxpbmcgbnVtYmVyJyAqLworaW50IGdzbTQ4X2VuY29kZV9jYWxsaW5nKHN0cnVjdCBtc2diICptc2csIAorCQkJICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsaW5nKTsKKy8qIGRlY29kZSAnY29ubmVjdGVkIG51bWJlcicgKi8KK2ludCBnc200OF9kZWNvZGVfY29ubmVjdGVkKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNvbm5lY3RlZCwKKwkJCSBjb25zdCB1aW50OF90ICpsdik7CisvKiBlbmNvZGUgJ2Nvbm5lY3RlZCBudW1iZXInICovCitpbnQgZ3NtNDhfZW5jb2RlX2Nvbm5lY3RlZChzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJICAgIGNvbnN0IHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNvbm5lY3RlZCk7CisvKiBkZWNvZGUgJ3JlZGlyZWN0aW5nIG51bWJlcicgKi8KK2ludCBnc200OF9kZWNvZGVfcmVkaXJlY3Rpbmcoc3RydWN0IGdzbV9tbmNjX251bWJlciAqcmVkaXJlY3RpbmcsCisJCQkgY29uc3QgdWludDhfdCAqbHYpOworLyogZW5jb2RlICdyZWRpcmVjdGluZyBudW1iZXInICovCitpbnQgZ3NtNDhfZW5jb2RlX3JlZGlyZWN0aW5nKHN0cnVjdCBtc2diICptc2csCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpyZWRpcmVjdGluZyk7CisvKiBkZWNvZGUgJ2ZhY2lsaXR5JyAqLworaW50IGdzbTQ4X2RlY29kZV9mYWNpbGl0eShzdHJ1Y3QgZ3NtX21uY2NfZmFjaWxpdHkgKmZhY2lsaXR5LAorCQkJICAgY29uc3QgdWludDhfdCAqbHYpOworLyogZW5jb2RlICdmYWNpbGl0eScgKi8KK2ludCBnc200OF9lbmNvZGVfZmFjaWxpdHkoc3RydWN0IG1zZ2IgKm1zZywgaW50IGx2X29ubHksCisJCQkgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfZmFjaWxpdHkgKmZhY2lsaXR5KTsKKy8qIGRlY29kZSAnbm90aWZ5JyAqLworaW50IGdzbTQ4X2RlY29kZV9ub3RpZnkoaW50ICpub3RpZnksIGNvbnN0IHVpbnQ4X3QgKnYpOworLyogZW5jb2RlICdub3RpZnknICovCitpbnQgZ3NtNDhfZW5jb2RlX25vdGlmeShzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbm90aWZ5KTsKKy8qIGRlY29kZSAnc2lnbmFsJyAqLworaW50IGdzbTQ4X2RlY29kZV9zaWduYWwoaW50ICpzaWduYWwsIGNvbnN0IHVpbnQ4X3QgKnYpOworLyogZW5jb2RlICdzaWduYWwnICovCitpbnQgZ3NtNDhfZW5jb2RlX3NpZ25hbChzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgc2lnbmFsKTsKKy8qIGRlY29kZSAna2V5cGFkJyAqLworaW50IGdzbTQ4X2RlY29kZV9rZXlwYWQoaW50ICprZXlwYWQsIGNvbnN0IHVpbnQ4X3QgKmx2KTsKKy8qIGVuY29kZSAna2V5cGFkJyAqLworaW50IGdzbTQ4X2VuY29kZV9rZXlwYWQoc3RydWN0IG1zZ2IgKm1zZywgaW50IGtleXBhZCk7CisvKiBkZWNvZGUgJ3Byb2dyZXNzJyAqLworaW50IGdzbTQ4X2RlY29kZV9wcm9ncmVzcyhzdHJ1Y3QgZ3NtX21uY2NfcHJvZ3Jlc3MgKnByb2dyZXNzLAorCQkJICAgY29uc3QgdWludDhfdCAqbHYpOworLyogZW5jb2RlICdwcm9ncmVzcycgKi8KK2ludCBnc200OF9lbmNvZGVfcHJvZ3Jlc3Moc3RydWN0IG1zZ2IgKm1zZywgaW50IGx2X29ubHksCisJCQkgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfcHJvZ3Jlc3MgKnApOworLyogZGVjb2RlICd1c2VyLXVzZXInICovCitpbnQgZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKHN0cnVjdCBnc21fbW5jY191c2VydXNlciAqdXUsCisJCQkgICBjb25zdCB1aW50OF90ICpsdik7CisvKiBlbmNvZGUgJ3VzZXJ1c2VyJyAqLworaW50IGdzbTQ4X2VuY29kZV91c2VydXNlcihzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbHZfb25seSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBnc21fbW5jY191c2VydXNlciAqdXUpOworLyogZGVjb2RlICdzcyB2ZXJzaW9uJyAqLworaW50IGdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oc3RydWN0IGdzbV9tbmNjX3NzdmVyc2lvbiAqc3N2LAorCQkJICAgIGNvbnN0IHVpbnQ4X3QgKmx2KTsKKy8qIGVuY29kZSAnc3MgdmVyc2lvbicgKi8KK2ludCBnc200OF9lbmNvZGVfc3N2ZXJzaW9uKHN0cnVjdCBtc2diICptc2csCisJCQkgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2Nfc3N2ZXJzaW9uICpzc3YpOworLyogZGVjb2RlICdtb3JlIGRhdGEnIGRvZXMgbm90IHJlcXVpcmUgYSBmdW5jdGlvbiwgYmVjYXVzZSBpdCBoYXMgbm8gdmFsdWUgKi8KKy8qIGVuY29kZSAnbW9yZSBkYXRhJyAqLworaW50IGdzbTQ4X2VuY29kZV9tb3JlKHN0cnVjdCBtc2diICptc2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtX3V0aWxzLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTlmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiBHU00gdXRpbGl0eSBmdW5jdGlvbnMsIGUuZy4gY29kaW5nIGFuZCBkZWNvZGluZyAqLworLyoKKyAqIChDKSAyMDA4IGJ5IERhbmllbCBXaWxsbWFubiA8ZGFuaWVsQHRvdGFsdWViZXJ3YWNodW5nLmRlPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEdTTV9VVElMU19ICisjZGVmaW5lIEdTTV9VVElMU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBBRERfTU9EVUxPKHN1bSwgZGVsdGEsIG1vZHVsbykgZG8gewlcCisJaWYgKChzdW0gKz0gZGVsdGEpID49IG1vZHVsbykJCVwKKwkJc3VtIC09IG1vZHVsbzsJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBHU01fTUFYX0ZOCSgyNio1MSoyMDQ4KQorCitzdHJ1Y3QgZ3NtX3RpbWUgeworCXVpbnQzMl90CWZuOwkvKiBGTiBjb3VudCAqLworCXVpbnQxNl90CXQxOwkvKiBGTiBkaXYgKDI2KjUxKSAqLworCXVpbnQ4X3QJCXQyOwkvKiBGTiBtb2R1bG8gMjYgKi8KKwl1aW50OF90CQl0MzsJLyogRk4gbW9kdWxvIDUxICovCisJdWludDhfdAkJdGM7Cit9OworCitlbnVtIGdzbV9iYW5kIHsKKwlHU01fQkFORF84NTAJPSAxLAorCUdTTV9CQU5EXzkwMAk9IDIsCisJR1NNX0JBTkRfMTgwMAk9IDQsCisJR1NNX0JBTkRfMTkwMAk9IDgsCisJR1NNX0JBTkRfNDUwCT0gMHgxMCwKKwlHU01fQkFORF80ODAJPSAweDIwLAorCUdTTV9CQU5EXzc1MAk9IDB4NDAsCisJR1NNX0JBTkRfODEwCT0gMHg4MCwKK307CisKK2NvbnN0IGNoYXIgKmdzbV9iYW5kX25hbWUoZW51bSBnc21fYmFuZCBiYW5kKTsKK2VudW0gZ3NtX2JhbmQgZ3NtX2JhbmRfcGFyc2UoY29uc3QgY2hhciAqbWh6KTsKKworaW50IGdzbV83Yml0X2RlY29kZShjaGFyICpkZWNvZGVkLCBjb25zdCB1aW50OF90ICp1c2VyX2RhdGEsIHVpbnQ4X3QgbGVuZ3RoKTsKK2ludCBnc21fN2JpdF9lbmNvZGUodWludDhfdCAqcmVzdWx0LCBjb25zdCBjaGFyICpkYXRhKTsKKworaW50IG1zX3B3cl9jdGxfbHZsKGVudW0gZ3NtX2JhbmQgYmFuZCwgdW5zaWduZWQgaW50IGRibSk7CitpbnQgbXNfcHdyX2RibShlbnVtIGdzbV9iYW5kIGJhbmQsIHVpbnQ4X3QgbHZsKTsKKworLyogQWNjb3JkaW5nIHRvIFRTIDA4LjA1IENoYXB0ZXIgOC4xLjQgKi8KK2ludCByeGxldjJkYm0odWludDhfdCByeGxldik7Cit1aW50OF90IGRibTJyeGxldihpbnQgZGJtKTsKKworLyogQWNjb3JkaW5nIHRvIEdTTSAwNC4wOCBDaGFwdGVyIDEwLjUuMi4yOSAqLworc3RhdGljIGlubGluZSBpbnQgcmFjaF9tYXhfdHJhbnNfdmFsMnJhdyhpbnQgdmFsKSB7IHJldHVybiAodmFsID4+IDEpICYgMzsgfQorc3RhdGljIGlubGluZSBpbnQgcmFjaF9tYXhfdHJhbnNfcmF3MnZhbChpbnQgcmF3KSB7CisJY29uc3QgaW50IHRibFs0XSA9IHsgMSwgMiwgNCwgNyB9OworCXJldHVybiB0YmxbcmF3ICYgM107Cit9CisKKyNkZWZpbmUJQVJGQ05fUENTCTB4ODAwMAorI2RlZmluZQlBUkZDTl9VUExJTksJMHg0MDAwCisKK2VudW0gZ3NtX2JhbmQgZ3NtX2FyZmNuMmJhbmQodWludDE2X3QgYXJmY24pOworCisvKiBDb252ZXJ0IGFuIEFSRkNOIHRvIHRoZSBmcmVxdWVuY3kgaW4gTUh6ICogMTAgKi8KK3VpbnQxNl90IGdzbV9hcmZjbjJmcmVxMTAodWludDE2X3QgYXJmY24sIGludCB1cGxpbmspOworCisvKiBDb252ZXJ0IGZyb20gZnJhbWUgbnVtYmVyIHRvIEdTTSB0aW1lICovCit2b2lkIGdzbV9mbjJnc210aW1lKHN0cnVjdCBnc21fdGltZSAqdGltZSwgdWludDMyX3QgZm4pOworCisvKiBDb252ZXJ0IGZyb20gR1NNIHRpbWUgdG8gZnJhbWUgbnVtYmVyICovCit1aW50MzJfdCBnc21fZ3NtdGltZTJmbihzdHJ1Y3QgZ3NtX3RpbWUgKnRpbWUpOworCisvKiBHU00gVFMgMDMuMDMgQ2hhcHRlciAyLjYgKi8KK2VudW0gZ3Byc190bGxpX3R5b2UgeworCVRMTElfTE9DQUwsCisJVExMSV9GT1JFSUdOLAorCVRMTElfUkFORE9NLAorCVRMTElfQVVYSUxJQVJZLAorCVRMTElfUkVTRVJWRUQsCit9OworCisvKiBUUyAwMy4wMyBDaGFwdGVyIDIuNiAqLworaW50IGdwcnNfdGxsaV90eXBlKHVpbnQzMl90IHRsbGkpOworCit2b2lkIGdlbmVyYXRlX2JhY2t0cmFjZSgpOworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbXRhcC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2Q2NGJkCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApAQCAtMCwwICsxLDcyIEBACisjaWZuZGVmIF9HU01UQVBfSAorI2RlZmluZSBfR1NNVEFQX0gKKworLyogZ3NtdGFwIGhlYWRlciwgcHNldWRvLWhlYWRlciBpbiBmcm9udCBvZiB0aGUgYWN0dWEgR1NNIHBheWxvYWQgKi8KKworLyogR1NNVEFQIGlzIGEgZ2VuZXJpYyBoZWFkZXIgZm9ybWF0IGZvciBHU00gcHJvdG9jb2wgY2FwdHVyZXMsCisgKiBpdCB1c2VzIHRoZSBJQU5BLWFzc2lnbmVkIFVEUCBwb3J0IG51bWJlciA0NzI5IGFuZCBjYXJyaWVzCisgKiBwYXlsb2FkIGluIHZhcmlvdXMgZm9ybWF0cyBvZiBHU00gaW50ZXJmYWNlcyBzdWNoIGFzIFVtIE1BQworICogYmxvY2tzIG9yIFVtIGJ1cnN0cy4KKyAqCisgKiBFeGFtcGxlIHByb2dyYW1zIGdlbmVyYXRpbmcgR1NNVEFQIGRhdGEgYXJlIGFpcnByb2JlCisgKiAoaHR0cDovL2FpcnByb2JlLm9yZy8pIG9yIE9zbW9jb21CQiAoaHR0cDovL2JiLm9zbW9jb20ub3JnLykKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgR1NNVEFQX1ZFUlNJT04JCTB4MDIKKworI2RlZmluZSBHU01UQVBfVFlQRV9VTQkJMHgwMQorI2RlZmluZSBHU01UQVBfVFlQRV9BQklTCTB4MDIKKyNkZWZpbmUgR1NNVEFQX1RZUEVfVU1fQlVSU1QJMHgwMwkvKiByYXcgYnVyc3QgYml0cyAqLworCisjZGVmaW5lIEdTTVRBUF9CVVJTVF9VTktOT1dOCQkweDAwCisjZGVmaW5lIEdTTVRBUF9CVVJTVF9GQ0NICQkweDAxCisjZGVmaW5lIEdTTVRBUF9CVVJTVF9QQVJUSUFMX1NDSAkweDAyCisjZGVmaW5lIEdTTVRBUF9CVVJTVF9TQ0gJCTB4MDMKKyNkZWZpbmUgR1NNVEFQX0JVUlNUX0NUU19TQ0gJCTB4MDQKKyNkZWZpbmUgR1NNVEFQX0JVUlNUX0NPTVBBQ1RfU0NICTB4MDUKKyNkZWZpbmUgR1NNVEFQX0JVUlNUX05PUk1BTAkJMHgwNgorI2RlZmluZSBHU01UQVBfQlVSU1RfRFVNTVkJCTB4MDcKKyNkZWZpbmUgR1NNVEFQX0JVUlNUX0FDQ0VTUwkJMHgwOAorI2RlZmluZSBHU01UQVBfQlVSU1RfTk9ORQkJMHgwOQorCisjZGVmaW5lIEdTTVRBUF9DSEFOTkVMX1VOS05PV04JMHgwMAorI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9CQ0NICTB4MDEKKyNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfQ0NDSAkweDAyCisjZGVmaW5lIEdTTVRBUF9DSEFOTkVMX1JBQ0gJMHgwMworI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9BR0NICTB4MDQKKyNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfUENICTB4MDUKKyNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfU0RDQ0gJMHgwNgorI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9TRENDSDQJMHgwNworI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9TRENDSDgJMHgwOAorI2RlZmluZSBHU01UQVBfQ0hBTk5FTF9UQ0hfRgkweDA5CisjZGVmaW5lIEdTTVRBUF9DSEFOTkVMX1RDSF9ICTB4MGEKKyNkZWZpbmUgR1NNVEFQX0NIQU5ORUxfQUNDSAkweDgwCisKKyNkZWZpbmUgR1NNVEFQX0FSRkNOX0ZfUENTCTB4ODAwMAorI2RlZmluZSBHU01UQVBfQVJGQ05fRl9VUExJTksJMHg0MDAwCisjZGVmaW5lIEdTTVRBUF9BUkZDTl9NQVNLCTB4M2ZmZgorCisjZGVmaW5lIEdTTVRBUF9VRFBfUE9SVAkJCTQ3MjkKKworc3RydWN0IGdzbXRhcF9oZHIgeworCXVpbnQ4X3QgdmVyc2lvbjsJLyogdmVyc2lvbiwgc2V0IHRvIDB4MDEgY3VycmVudGx5ICovCisJdWludDhfdCBoZHJfbGVuOwkvKiBsZW5ndGggaW4gbnVtYmVyIG9mIDMyYml0IHdvcmRzICovCisJdWludDhfdCB0eXBlOwkJLyogc2VlIEdTTVRBUF9UWVBFXyogKi8KKwl1aW50OF90IHRpbWVzbG90OwkvKiB0aW1lc2xvdCAoMC4uNyBvbiBVbSkgKi8KKworCXVpbnQxNl90IGFyZmNuOwkJLyogQVJGQ04gKGZyZXF1ZW5jeSkgKi8KKwlpbnQ4X3Qgc2lnbmFsX2RibTsJLyogc2lnbmFsIGxldmVsIGluIGRCbSAqLworCWludDhfdCBzbnJfZGI7CQkvKiBzaWduYWwvbm9pc2UgcmF0aW8gaW4gZEIgKi8KKworCXVpbnQzMl90IGZyYW1lX251bWJlcjsJLyogR1NNIEZyYW1lIE51bWJlciAoRk4pICovCisKKwl1aW50OF90IHN1Yl90eXBlOwkvKiBUeXBlIG9mIGJ1cnN0L2NoYW5uZWwsIHNlZSBhYm92ZSAqLworCXVpbnQ4X3QgYW50ZW5uYV9ucjsJLyogQW50ZW5uYSBOdW1iZXIgKi8KKwl1aW50OF90IHN1Yl9zbG90OwkvKiBzdWItc2xvdCB3aXRoaW4gdGltZXNsb3QgKi8KKwl1aW50OF90IHJlczsJCS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIChSRlUpICovCisKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNlbmRpZiAvKiBfR1NNVEFQX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2xpbnV4bGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOTljNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2xpbnV4bGlzdC5oCkBAIC0wLDAgKzEsMzYwIEBACisjaWZuZGVmIF9MSU5VWF9MTElTVF9ICisjZGVmaW5lIF9MSU5VWF9MTElTVF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmbmRlZiBpbmxpbmUKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lX18KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlZmV0Y2goY29uc3Qgdm9pZCAqeCkgezt9CisKKy8qKgorICogY29udGFpbmVyX29mIC0gY2FzdCBhIG1lbWJlciBvZiBhIHN0cnVjdHVyZSBvdXQgdG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlCisgKgorICogQHB0cjoJdGhlIHBvaW50ZXIgdG8gdGhlIG1lbWJlci4KKyAqIEB0eXBlOgl0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIG1lbWJlciB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKi8KKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoewkJCVwKKyAgICAgICAgY29uc3QgdHlwZW9mKCAoKHR5cGUgKikwKS0+bWVtYmVyICkgKl9fbXB0ciA9ICh0eXBlb2YoICgodHlwZSAqKTApLT5tZW1iZXIgKSAqKShwdHIpOwlcCisgICAgICAgICh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsIG1lbWJlcikgKTt9KQorCisKKy8qCisgKiBUaGVzZSBhcmUgbm9uLU5VTEwgcG9pbnRlcnMgdGhhdCB3aWxsIHJlc3VsdCBpbiBwYWdlIGZhdWx0cworICogdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHVzZWQgdG8gdmVyaWZ5IHRoYXQgbm9ib2R5IHVzZXMKKyAqIG5vbi1pbml0aWFsaXplZCBsbGlzdCBlbnRyaWVzLgorICovCisjZGVmaW5lIExMSVNUX1BPSVNPTjEgICgodm9pZCAqKSAweDAwMTAwMTAwKQorI2RlZmluZSBMTElTVF9QT0lTT04yICAoKHZvaWQgKikgMHgwMDIwMDIwMCkKKworLyoKKyAqIFNpbXBsZSBkb3VibHkgbGlua2VkIGxsaXN0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIFNvbWUgb2YgdGhlIGludGVybmFsIGZ1bmN0aW9ucyAoIl9feHh4IikgYXJlIHVzZWZ1bCB3aGVuCisgKiBtYW5pcHVsYXRpbmcgd2hvbGUgbGxpc3RzIHJhdGhlciB0aGFuIHNpbmdsZSBlbnRyaWVzLCBhcworICogc29tZXRpbWVzIHdlIGFscmVhZHkga25vdyB0aGUgbmV4dC9wcmV2IGVudHJpZXMgYW5kIHdlIGNhbgorICogZ2VuZXJhdGUgYmV0dGVyIGNvZGUgYnkgdXNpbmcgdGhlbSBkaXJlY3RseSByYXRoZXIgdGhhbgorICogdXNpbmcgdGhlIGdlbmVyaWMgc2luZ2xlLWVudHJ5IHJvdXRpbmVzLgorICovCisKK3N0cnVjdCBsbGlzdF9oZWFkIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqbmV4dCwgKnByZXY7Cit9OworCisjZGVmaW5lIExMSVNUX0hFQURfSU5JVChuYW1lKSB7ICYobmFtZSksICYobmFtZSkgfQorCisjZGVmaW5lIExMSVNUX0hFQUQobmFtZSkgXAorCXN0cnVjdCBsbGlzdF9oZWFkIG5hbWUgPSBMTElTVF9IRUFEX0lOSVQobmFtZSkKKworI2RlZmluZSBJTklUX0xMSVNUX0hFQUQocHRyKSBkbyB7IFwKKwkocHRyKS0+bmV4dCA9IChwdHIpOyAocHRyKS0+cHJldiA9IChwdHIpOyBcCit9IHdoaWxlICgwKQorCisvKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGJldHdlZW4gdHdvIGtub3duIGNvbnNlY3V0aXZlIGVudHJpZXMuIAorICoKKyAqIFRoaXMgaXMgb25seSBmb3IgaW50ZXJuYWwgbGxpc3QgbWFuaXB1bGF0aW9uIHdoZXJlIHdlIGtub3cKKyAqIHRoZSBwcmV2L25leHQgZW50cmllcyBhbHJlYWR5IQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19sbGlzdF9hZGQoc3RydWN0IGxsaXN0X2hlYWQgKl9uZXcsCisJCQkgICAgICBzdHJ1Y3QgbGxpc3RfaGVhZCAqcHJldiwKKwkJCSAgICAgIHN0cnVjdCBsbGlzdF9oZWFkICpuZXh0KQoreworCW5leHQtPnByZXYgPSBfbmV3OworCV9uZXctPm5leHQgPSBuZXh0OworCV9uZXctPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBfbmV3OworfQorCisvKioKKyAqIGxsaXN0X2FkZCAtIGFkZCBhIG5ldyBlbnRyeQorICogQG5ldzogbmV3IGVudHJ5IHRvIGJlIGFkZGVkCisgKiBAaGVhZDogbGxpc3QgaGVhZCB0byBhZGQgaXQgYWZ0ZXIKKyAqCisgKiBJbnNlcnQgYSBuZXcgZW50cnkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBoZWFkLgorICogVGhpcyBpcyBnb29kIGZvciBpbXBsZW1lbnRpbmcgc3RhY2tzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGxpc3RfYWRkKHN0cnVjdCBsbGlzdF9oZWFkICpfbmV3LCBzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlfX2xsaXN0X2FkZChfbmV3LCBoZWFkLCBoZWFkLT5uZXh0KTsKK30KKworLyoqCisgKiBsbGlzdF9hZGRfdGFpbCAtIGFkZCBhIG5ldyBlbnRyeQorICogQG5ldzogbmV3IGVudHJ5IHRvIGJlIGFkZGVkCisgKiBAaGVhZDogbGxpc3QgaGVhZCB0byBhZGQgaXQgYmVmb3JlCisgKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGJlZm9yZSB0aGUgc3BlY2lmaWVkIGhlYWQuCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHF1ZXVlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X2FkZF90YWlsKHN0cnVjdCBsbGlzdF9oZWFkICpfbmV3LCBzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlfX2xsaXN0X2FkZChfbmV3LCBoZWFkLT5wcmV2LCBoZWFkKTsKK30KKworLyoKKyAqIERlbGV0ZSBhIGxsaXN0IGVudHJ5IGJ5IG1ha2luZyB0aGUgcHJldi9uZXh0IGVudHJpZXMKKyAqIHBvaW50IHRvIGVhY2ggb3RoZXIuCisgKgorICogVGhpcyBpcyBvbmx5IGZvciBpbnRlcm5hbCBsbGlzdCBtYW5pcHVsYXRpb24gd2hlcmUgd2Uga25vdworICogdGhlIHByZXYvbmV4dCBlbnRyaWVzIGFscmVhZHkhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2xsaXN0X2RlbChzdHJ1Y3QgbGxpc3RfaGVhZCAqIHByZXYsIHN0cnVjdCBsbGlzdF9oZWFkICogbmV4dCkKK3sKKwluZXh0LT5wcmV2ID0gcHJldjsKKwlwcmV2LT5uZXh0ID0gbmV4dDsKK30KKworLyoqCisgKiBsbGlzdF9kZWwgLSBkZWxldGVzIGVudHJ5IGZyb20gbGxpc3QuCisgKiBAZW50cnk6IHRoZSBlbGVtZW50IHRvIGRlbGV0ZSBmcm9tIHRoZSBsbGlzdC4KKyAqIE5vdGU6IGxsaXN0X2VtcHR5IG9uIGVudHJ5IGRvZXMgbm90IHJldHVybiB0cnVlIGFmdGVyIHRoaXMsIHRoZSBlbnRyeSBpcworICogaW4gYW4gdW5kZWZpbmVkIHN0YXRlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGxpc3RfZGVsKHN0cnVjdCBsbGlzdF9oZWFkICplbnRyeSkKK3sKKwlfX2xsaXN0X2RlbChlbnRyeS0+cHJldiwgZW50cnktPm5leHQpOworCWVudHJ5LT5uZXh0ID0gKHN0cnVjdCBsbGlzdF9oZWFkICopTExJU1RfUE9JU09OMTsKKwllbnRyeS0+cHJldiA9IChzdHJ1Y3QgbGxpc3RfaGVhZCAqKUxMSVNUX1BPSVNPTjI7Cit9CisKKy8qKgorICogbGxpc3RfZGVsX2luaXQgLSBkZWxldGVzIGVudHJ5IGZyb20gbGxpc3QgYW5kIHJlaW5pdGlhbGl6ZSBpdC4KKyAqIEBlbnRyeTogdGhlIGVsZW1lbnQgdG8gZGVsZXRlIGZyb20gdGhlIGxsaXN0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGxpc3RfZGVsX2luaXQoc3RydWN0IGxsaXN0X2hlYWQgKmVudHJ5KQoreworCV9fbGxpc3RfZGVsKGVudHJ5LT5wcmV2LCBlbnRyeS0+bmV4dCk7CisJSU5JVF9MTElTVF9IRUFEKGVudHJ5KTsgCit9CisKKy8qKgorICogbGxpc3RfbW92ZSAtIGRlbGV0ZSBmcm9tIG9uZSBsbGlzdCBhbmQgYWRkIGFzIGFub3RoZXIncyBoZWFkCisgKiBAbGxpc3Q6IHRoZSBlbnRyeSB0byBtb3ZlCisgKiBAaGVhZDogdGhlIGhlYWQgdGhhdCB3aWxsIHByZWNlZGUgb3VyIGVudHJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsbGlzdF9tb3ZlKHN0cnVjdCBsbGlzdF9oZWFkICpsbGlzdCwgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisgICAgICAgIF9fbGxpc3RfZGVsKGxsaXN0LT5wcmV2LCBsbGlzdC0+bmV4dCk7CisgICAgICAgIGxsaXN0X2FkZChsbGlzdCwgaGVhZCk7Cit9CisKKy8qKgorICogbGxpc3RfbW92ZV90YWlsIC0gZGVsZXRlIGZyb20gb25lIGxsaXN0IGFuZCBhZGQgYXMgYW5vdGhlcidzIHRhaWwKKyAqIEBsbGlzdDogdGhlIGVudHJ5IHRvIG1vdmUKKyAqIEBoZWFkOiB0aGUgaGVhZCB0aGF0IHdpbGwgZm9sbG93IG91ciBlbnRyeQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGxpc3RfbW92ZV90YWlsKHN0cnVjdCBsbGlzdF9oZWFkICpsbGlzdCwKKwkJCQkgIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworICAgICAgICBfX2xsaXN0X2RlbChsbGlzdC0+cHJldiwgbGxpc3QtPm5leHQpOworICAgICAgICBsbGlzdF9hZGRfdGFpbChsbGlzdCwgaGVhZCk7Cit9CisKKy8qKgorICogbGxpc3RfZW1wdHkgLSB0ZXN0cyB3aGV0aGVyIGEgbGxpc3QgaXMgZW1wdHkKKyAqIEBoZWFkOiB0aGUgbGxpc3QgdG8gdGVzdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbGxpc3RfZW1wdHkoY29uc3Qgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisJcmV0dXJuIGhlYWQtPm5leHQgPT0gaGVhZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fbGxpc3Rfc3BsaWNlKHN0cnVjdCBsbGlzdF9oZWFkICpsbGlzdCwKKwkJCQkgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGxsaXN0X2hlYWQgKmZpcnN0ID0gbGxpc3QtPm5leHQ7CisJc3RydWN0IGxsaXN0X2hlYWQgKmxhc3QgPSBsbGlzdC0+cHJldjsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqYXQgPSBoZWFkLT5uZXh0OworCisJZmlyc3QtPnByZXYgPSBoZWFkOworCWhlYWQtPm5leHQgPSBmaXJzdDsKKworCWxhc3QtPm5leHQgPSBhdDsKKwlhdC0+cHJldiA9IGxhc3Q7Cit9CisKKy8qKgorICogbGxpc3Rfc3BsaWNlIC0gam9pbiB0d28gbGxpc3RzCisgKiBAbGxpc3Q6IHRoZSBuZXcgbGxpc3QgdG8gYWRkLgorICogQGhlYWQ6IHRoZSBwbGFjZSB0byBhZGQgaXQgaW4gdGhlIGZpcnN0IGxsaXN0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGxpc3Rfc3BsaWNlKHN0cnVjdCBsbGlzdF9oZWFkICpsbGlzdCwgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisJaWYgKCFsbGlzdF9lbXB0eShsbGlzdCkpCisJCV9fbGxpc3Rfc3BsaWNlKGxsaXN0LCBoZWFkKTsKK30KKworLyoqCisgKiBsbGlzdF9zcGxpY2VfaW5pdCAtIGpvaW4gdHdvIGxsaXN0cyBhbmQgcmVpbml0aWFsaXNlIHRoZSBlbXB0aWVkIGxsaXN0LgorICogQGxsaXN0OiB0aGUgbmV3IGxsaXN0IHRvIGFkZC4KKyAqIEBoZWFkOiB0aGUgcGxhY2UgdG8gYWRkIGl0IGluIHRoZSBmaXJzdCBsbGlzdC4KKyAqCisgKiBUaGUgbGxpc3QgYXQgQGxsaXN0IGlzIHJlaW5pdGlhbGlzZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X3NwbGljZV9pbml0KHN0cnVjdCBsbGlzdF9oZWFkICpsbGlzdCwKKwkJCQkgICAgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisJaWYgKCFsbGlzdF9lbXB0eShsbGlzdCkpIHsKKwkJX19sbGlzdF9zcGxpY2UobGxpc3QsIGhlYWQpOworCQlJTklUX0xMSVNUX0hFQUQobGxpc3QpOworCX0KK30KKworLyoqCisgKiBsbGlzdF9lbnRyeSAtIGdldCB0aGUgc3RydWN0IGZvciB0aGlzIGVudHJ5CisgKiBAcHRyOgl0aGUgJnN0cnVjdCBsbGlzdF9oZWFkIHBvaW50ZXIuCisgKiBAdHlwZToJdGhlIHR5cGUgb2YgdGhlIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsbGlzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgXAorCWNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikKKworLyoqCisgKiBsbGlzdF9mb3JfZWFjaAktCWl0ZXJhdGUgb3ZlciBhIGxsaXN0CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dCwgcHJlZmV0Y2gocG9zLT5uZXh0KTsgcG9zICE9IChoZWFkKTsgXAorICAgICAgICAJcG9zID0gcG9zLT5uZXh0LCBwcmVmZXRjaChwb3MtPm5leHQpKQorCisvKioKKyAqIF9fbGxpc3RfZm9yX2VhY2gJLQlpdGVyYXRlIG92ZXIgYSBsbGlzdAorICogQHBvczoJdGhlICZzdHJ1Y3QgbGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGxpc3QuCisgKgorICogVGhpcyB2YXJpYW50IGRpZmZlcnMgZnJvbSBsbGlzdF9mb3JfZWFjaCgpIGluIHRoYXQgaXQncyB0aGUKKyAqIHNpbXBsZXN0IHBvc3NpYmxlIGxsaXN0IGl0ZXJhdGlvbiBjb2RlLCBubyBwcmVmZXRjaGluZyBpcyBkb25lLgorICogVXNlIHRoaXMgZm9yIGNvZGUgdGhhdCBrbm93cyB0aGUgbGxpc3QgdG8gYmUgdmVyeSBzaG9ydCAoZW1wdHkKKyAqIG9yIDEgZW50cnkpIG1vc3Qgb2YgdGhlIHRpbWUuCisgKi8KKyNkZWZpbmUgX19sbGlzdF9mb3JfZWFjaChwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcG9zICE9IChoZWFkKTsgcG9zID0gcG9zLT5uZXh0KQorCisvKioKKyAqIGxsaXN0X2Zvcl9lYWNoX3ByZXYJLQlpdGVyYXRlIG92ZXIgYSBsbGlzdCBiYWNrd2FyZHMKKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxsaXN0LgorICovCisjZGVmaW5lIGxsaXN0X2Zvcl9lYWNoX3ByZXYocG9zLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPnByZXYsIHByZWZldGNoKHBvcy0+cHJldik7IHBvcyAhPSAoaGVhZCk7IFwKKyAgICAgICAgCXBvcyA9IHBvcy0+cHJldiwgcHJlZmV0Y2gocG9zLT5wcmV2KSkKKyAgICAgICAgCQorLyoqCisgKiBsbGlzdF9mb3JfZWFjaF9zYWZlCS0JaXRlcmF0ZSBvdmVyIGEgbGxpc3Qgc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGxpc3QgZW50cnkKKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQG46CQlhbm90aGVyICZzdHJ1Y3QgbGxpc3RfaGVhZCB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5uZXh0LCBuID0gcG9zLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBcCisJCXBvcyA9IG4sIG4gPSBwb3MtPm5leHQpCisKKy8qKgorICogbGxpc3RfZm9yX2VhY2hfZW50cnkJLQlpdGVyYXRlIG92ZXIgbGxpc3Qgb2YgZ2l2ZW4gdHlwZQorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGxpc3QuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICovCisjZGVmaW5lIGxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgaGVhZCwgbWVtYmVyKQkJCQlcCisJZm9yIChwb3MgPSBsbGlzdF9lbnRyeSgoaGVhZCktPm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXAorCQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpOwkJCVwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAkJCQkJXAorCSAgICAgcG9zID0gbGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCkpCisKKy8qKgorICogbGxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZSAtIGl0ZXJhdGUgYmFja3dhcmRzIG92ZXIgbGxpc3Qgb2YgZ2l2ZW4gdHlwZS4KKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHBvcywgaGVhZCwgbWVtYmVyKQkJCVwKKwlmb3IgKHBvcyA9IGxsaXN0X2VudHJ5KChoZWFkKS0+cHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIucHJldik7CQkJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBsbGlzdF9lbnRyeShwb3MtPm1lbWJlci5wcmV2LCB0eXBlb2YoKnBvcyksIG1lbWJlciksCVwKKwkJICAgICBwcmVmZXRjaChwb3MtPm1lbWJlci5wcmV2KSkKKworLyoqCisgKiBsbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSAtCWl0ZXJhdGUgb3ZlciBsbGlzdCBvZiBnaXZlbiB0eXBlCisgKgkJCWNvbnRpbnVpbmcgYWZ0ZXIgZXhpc3RpbmcgcG9pbnQKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShwb3MsIGhlYWQsIG1lbWJlcikgCQlcCisJZm9yIChwb3MgPSBsbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksCVwKKwkJICAgICBwcmVmZXRjaChwb3MtPm1lbWJlci5uZXh0KTsJCQlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwkJCQkJXAorCSAgICAgcG9zID0gbGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCkpCisKKy8qKgorICogbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSAtIGl0ZXJhdGUgb3ZlciBsbGlzdCBvZiBnaXZlbiB0eXBlIHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBuOgkJYW5vdGhlciB0eXBlICogdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGxpc3QuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICovCisjZGVmaW5lIGxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuLCBoZWFkLCBtZW1iZXIpCQkJXAorCWZvciAocG9zID0gbGxpc3RfZW50cnkoKGhlYWQpLT5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksCVwKKwkJbiA9IGxsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBuLCBuID0gbGxpc3RfZW50cnkobi0+bWVtYmVyLm5leHQsIHR5cGVvZigqbiksIG1lbWJlcikpCisKKy8qKgorICogbGxpc3RfZm9yX2VhY2hfcmN1CS0JaXRlcmF0ZSBvdmVyIGFuIHJjdS1wcm90ZWN0ZWQgbGxpc3QKKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxsaXN0LgorICovCisjZGVmaW5lIGxsaXN0X2Zvcl9lYWNoX3JjdShwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dCwgcHJlZmV0Y2gocG9zLT5uZXh0KTsgcG9zICE9IChoZWFkKTsgXAorICAgICAgICAJcG9zID0gcG9zLT5uZXh0LCAoeyBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsgMDt9KSwgcHJlZmV0Y2gocG9zLT5uZXh0KSkKKyAgICAgICAgCQorI2RlZmluZSBfX2xsaXN0X2Zvcl9lYWNoX3JjdShwb3MsIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcG9zICE9IChoZWFkKTsgXAorICAgICAgICAJcG9zID0gcG9zLT5uZXh0LCAoeyBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsgMDt9KSkKKyAgICAgICAgCQorLyoqCisgKiBsbGlzdF9mb3JfZWFjaF9zYWZlX3JjdQktCWl0ZXJhdGUgb3ZlciBhbiByY3UtcHJvdGVjdGVkIGxsaXN0IHNhZmUKKyAqCQkJCQlhZ2FpbnN0IHJlbW92YWwgb2YgbGxpc3QgZW50cnkKKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQG46CQlhbm90aGVyICZzdHJ1Y3QgbGxpc3RfaGVhZCB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9zYWZlX3JjdShwb3MsIG4sIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+bmV4dCwgbiA9IHBvcy0+bmV4dDsgcG9zICE9IChoZWFkKTsgXAorCQlwb3MgPSBuLCAoeyBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsgMDt9KSwgbiA9IHBvcy0+bmV4dCkKKworLyoqCisgKiBsbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UJLQlpdGVyYXRlIG92ZXIgcmN1IGxsaXN0IG9mIGdpdmVuIHR5cGUKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocG9zLCBoZWFkLCBtZW1iZXIpCQkJXAorCWZvciAocG9zID0gbGxpc3RfZW50cnkoKGhlYWQpLT5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksCVwKKwkJICAgICBwcmVmZXRjaChwb3MtPm1lbWJlci5uZXh0KTsJCQlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyAJCQkJCVwKKwkgICAgIHBvcyA9IGxsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXAorCQkgICAgICh7IHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOyAwO30pLAkJXAorCQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpKQorCisKKy8qKgorICogbGxpc3RfZm9yX2VhY2hfY29udGludWVfcmN1CS0JaXRlcmF0ZSBvdmVyIGFuIHJjdS1wcm90ZWN0ZWQgbGxpc3QgCisgKgkJCWNvbnRpbnVpbmcgYWZ0ZXIgZXhpc3RpbmcgcG9pbnQuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsbGlzdC4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9jb250aW51ZV9yY3UocG9zLCBoZWFkKSBcCisJZm9yICgocG9zKSA9IChwb3MpLT5uZXh0LCBwcmVmZXRjaCgocG9zKS0+bmV4dCk7IChwb3MpICE9IChoZWFkKTsgXAorICAgICAgICAJKHBvcykgPSAocG9zKS0+bmV4dCwgKHsgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IDA7fSksIHByZWZldGNoKChwb3MpLT5uZXh0KSkKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbG9nZ2luZy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9sb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4Mjk1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbG9nZ2luZy5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmIF9PU01PQ09SRV9MT0dHSU5HX0gKKyNkZWZpbmUgX09TTU9DT1JFX0xPR0dJTkdfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBMT0dfTUFYX0NBVEVHT1JZCTMyCisjZGVmaW5lIExPR19NQVhfQ1RYCQk4CisjZGVmaW5lIExPR19NQVhfRklMVEVSUwk4CisKKyNkZWZpbmUgREVCVUcKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERFQlVHUChzcywgZm10LCBhcmdzLi4uKSBsb2dwKHNzLCBfX0ZJTEVfXywgX19MSU5FX18sIDAsIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgREVCVUdQQyhzcywgZm10LCBhcmdzLi4uKSBsb2dwKHNzLCBfX0ZJTEVfXywgX19MSU5FX18sIDEsIGZtdCwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHUCh4c3MsIGZtdCwgYXJncy4uLikKKyNkZWZpbmUgREVCVUdQQyhzcywgZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgc3RhdGljX2Fzc2VydChleHAsIG5hbWUpIHR5cGVkZWYgaW50IGR1bW15IyNuYW1lIFsoZXhwKSA/IDEgOiAtMV07CisKK2NoYXIgKmhleGR1bXAoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKTsKK3ZvaWQgbG9ncCh1bnNpZ25lZCBpbnQgc3Vic3lzLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDUsIDYpKSk7CisKKy8qIG5ldyBsb2dnaW5nIGludGVyZmFjZSAqLworI2RlZmluZSBMT0dQKHNzLCBsZXZlbCwgZm10LCBhcmdzLi4uKSBcCisJbG9ncDIoc3MsIGxldmVsLCBfX0ZJTEVfXywgX19MSU5FX18sIDAsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBMT0dQQyhzcywgbGV2ZWwsIGZtdCwgYXJncy4uLikgXAorCWxvZ3AyKHNzLCBsZXZlbCwgX19GSUxFX18sIF9fTElORV9fLCAxLCBmbXQsICMjYXJncykKKworLyogZGlmZmVyZW50IGxldmVscyAqLworI2RlZmluZSBMT0dMX0RFQlVHCTEJLyogZGVidWdnaW5nIGluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR0xfSU5GTwkzCisjZGVmaW5lIExPR0xfTk9USUNFCTUJLyogYWJub3JtYWwvdW5leHBlY3RlZCBjb25kaXRpb24gKi8KKyNkZWZpbmUgTE9HTF9FUlJPUgk3CS8qIGVycm9yIGNvbmRpdGlvbiwgcmVxdWlyZXMgdXNlciBhY3Rpb24gKi8KKyNkZWZpbmUgTE9HTF9GQVRBTAk4CS8qIGZhdGFsLCBwcm9ncmFtIGFib3J0ZWQgKi8KKworI2RlZmluZSBMT0dfRklMVEVSX0FMTAkweDAwMDEKKworc3RydWN0IGxvZ19jYXRlZ29yeSB7CisJdWludDhfdCBsb2dsZXZlbDsKKwl1aW50OF90IGVuYWJsZWQ7Cit9OworCitzdHJ1Y3QgbG9nX2luZm9fY2F0IHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmNvbG9yOworCWNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOworCXVpbnQ4X3QgbG9nbGV2ZWw7CisJdWludDhfdCBlbmFibGVkOworfTsKKworLyogbG9nIGNvbnRleHQgaW5mb3JtYXRpb24sIHBhc3NlZCB0byBmaWx0ZXIgKi8KK3N0cnVjdCBsb2dfY29udGV4dCB7CisJdm9pZCAqY3R4W0xPR19NQVhfQ1RYKzFdOworfTsKKworc3RydWN0IGxvZ190YXJnZXQ7CisKK3R5cGVkZWYgaW50IGxvZ19maWx0ZXIoY29uc3Qgc3RydWN0IGxvZ19jb250ZXh0ICpjdHgsCisJCSAgICAgICBzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0KTsKKworc3RydWN0IGxvZ19pbmZvIHsKKwkvKiBmaWx0ZXIgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKwlsb2dfZmlsdGVyICpmaWx0ZXJfZm47CisKKwkvKiBwZXItY2F0ZWdvcnkgaW5mb3JtYXRpb24gKi8KKwljb25zdCBzdHJ1Y3QgbG9nX2luZm9fY2F0ICpjYXQ7CisJdW5zaWduZWQgaW50IG51bV9jYXQ7Cit9OworCitzdHJ1Y3QgbG9nX3RhcmdldCB7CisgICAgICAgIHN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJaW50IGZpbHRlcl9tYXA7CisJdm9pZCAqZmlsdGVyX2RhdGFbTE9HX01BWF9GSUxURVJTKzFdOworCisJc3RydWN0IGxvZ19jYXRlZ29yeSBjYXRlZ29yaWVzW0xPR19NQVhfQ0FURUdPUlkrMV07CisJdWludDhfdCBsb2dsZXZlbDsKKwlpbnQgdXNlX2NvbG9yOjE7CisJaW50IHByaW50X3RpbWVzdGFtcDoxOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJRklMRSAqb3V0OworCQl9IHRndF9zdGRvdXQ7CisKKwkJc3RydWN0IHsKKwkJCWludCBwcmlvcml0eTsKKwkJfSB0Z3Rfc3lzbG9nOworCisJCXN0cnVjdCB7CisJCQl2b2lkICp2dHk7CisJCX0gdGd0X3Z0eTsKKwl9OworCisgICAgICAgIHZvaWQgKCpvdXRwdXQpIChzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICpzdHJpbmcpOworfTsKKworLyogdXNlIHRoZSBhYm92ZSBtYWNyb3MgKi8KK3ZvaWQgbG9ncDIodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IGxldmVsLCBjaGFyICpmaWxlLAorCSAgIGludCBsaW5lLCBpbnQgY29udCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJCQkJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA2LCA3KSkpOwordm9pZCBsb2dfaW5pdChjb25zdCBzdHJ1Y3QgbG9nX2luZm8gKmNhdCk7CisKKy8qIGNvbnRleHQgbWFuYWdlbWVudCAqLwordm9pZCBsb2dfcmVzZXRfY29udGV4dCh2b2lkKTsKK2ludCBsb2dfc2V0X2NvbnRleHQodWludDhfdCBjdHgsIHZvaWQgKnZhbHVlKTsKKworLyogZmlsdGVyIG9uIHRoZSB0YXJnZXRzICovCit2b2lkIGxvZ19zZXRfYWxsX2ZpbHRlcihzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBpbnQpOworCit2b2lkIGxvZ19zZXRfdXNlX2NvbG9yKHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsIGludCk7Cit2b2lkIGxvZ19zZXRfcHJpbnRfdGltZXN0YW1wKHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsIGludCk7Cit2b2lkIGxvZ19zZXRfbG9nX2xldmVsKHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsIGludCBsb2dfbGV2ZWwpOwordm9pZCBsb2dfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyKiBtYXNrKTsKK2ludCBsb2dfcGFyc2VfbGV2ZWwoY29uc3QgY2hhciAqbHZsKTsKK2NvbnN0IGNoYXIgKmxvZ19sZXZlbF9zdHIodW5zaWduZWQgaW50IGx2bCk7CitpbnQgbG9nX3BhcnNlX2NhdGVnb3J5KGNvbnN0IGNoYXIgKmNhdGVnb3J5KTsKK3ZvaWQgbG9nX3NldF9jYXRlZ29yeV9maWx0ZXIoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgaW50IGNhdGVnb3J5LAorCQkJICAgICAgIGludCBlbmFibGUsIGludCBsZXZlbCk7CisKKy8qIG1hbmFnZW1lbnQgb2YgdGhlIHRhcmdldHMgKi8KK3N0cnVjdCBsb2dfdGFyZ2V0ICpsb2dfdGFyZ2V0X2NyZWF0ZSh2b2lkKTsKK3N0cnVjdCBsb2dfdGFyZ2V0ICpsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIodm9pZCk7Cit2b2lkIGxvZ19hZGRfdGFyZ2V0KHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQpOwordm9pZCBsb2dfZGVsX3RhcmdldChzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0KTsKKworLyogR2VybmVyYXRlIGNvbW1hbmQgYXJndW1lbnQgc3RyaW5ncyBmb3IgVlRZIHVzZSAqLworY29uc3QgY2hhciAqbG9nX3Z0eV9jYXRlZ29yeV9zdHJpbmcoc3RydWN0IGxvZ19pbmZvICppbmZvKTsKK2NvbnN0IGNoYXIgKmxvZ192dHlfbGV2ZWxfc3RyaW5nKHN0cnVjdCBsb2dfaW5mbyAqaW5mbyk7CisKKyNlbmRpZiAvKiBfT1NNT0NPUkVfTE9HR0lOR19IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21uY2MuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbW5jYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOTRiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21uY2MuaApAQCAtMCwwICsxLDcxIEBACisjaWZuZGVmIF9PU01PQ09SRV9NTkNDX0gKKyNkZWZpbmUgX09TTU9DT1JFX01OQ0NfSAorCisjZGVmaW5lIEdTTV9NQVhfRkFDSUxJVFkgICAgICAgMTI4CisjZGVmaW5lIEdTTV9NQVhfU1NWRVJTSU9OICAgICAgMTI4CisjZGVmaW5lIEdTTV9NQVhfVVNFUlVTRVIgICAgICAgMTI4CisKKy8qIEV4cGFuZGVkIGZpZWxkcyBmcm9tIEdTTSBUUyAwNC4wOCwgVGFibGUgMTAuNS4xMDIgKi8KK3N0cnVjdCBnc21fbW5jY19iZWFyZXJfY2FwIHsKKwlpbnQJCXRyYW5zZmVyOwkvKiBJbmZvcm1hdGlvbiBUcmFuc2ZlciBDYXBhYmlsaXR5ICovCisJaW50IAkJbW9kZTsJCS8qIFRyYW5zZmVyIE1vZGUgKi8KKwlpbnQJCWNvZGluZzsJCS8qIENvZGluZyBTdGFuZGFyZCAqLworCWludAkJcmFkaW87CQkvKiBSYWRpbyBDaGFubmVsIFJlcXVpcmVtZW50ICovCisJaW50CQlzcGVlY2hfY3RtOwkvKiBDVE0gdGV4dCB0ZWxlcGhvbnkgaW5kaWNhdGlvbiAqLworCWludAkJc3BlZWNoX3Zlcls4XTsJLyogU3BlZWNoIHZlcnNpb24gaW5kaWNhdGlvbiAqLworfTsKKworc3RydWN0IGdzbV9tbmNjX251bWJlciB7CisJaW50IAkJdHlwZTsKKwlpbnQgCQlwbGFuOworCWludAkJcHJlc2VudDsKKwlpbnQJCXNjcmVlbjsKKwljaGFyCQludW1iZXJbMzNdOworfTsKKworc3RydWN0IGdzbV9tbmNjX2NhdXNlIHsKKwlpbnQJCWxvY2F0aW9uOworCWludAkJY29kaW5nOworCWludAkJcmVjOworCWludAkJcmVjX3ZhbDsKKwlpbnQJCXZhbHVlOworCWludAkJZGlhZ19sZW47CisJY2hhcgkJZGlhZ1szMl07Cit9OworCitzdHJ1Y3QgZ3NtX21uY2NfdXNlcnVzZXIgeworCWludAkJcHJvdG87CisJY2hhcgkJaW5mb1tHU01fTUFYX1VTRVJVU0VSICsgMV07IC8qICsgdGVybWluYXRpb24gY2hhciAqLworfTsKKworc3RydWN0IGdzbV9tbmNjX3Byb2dyZXNzIHsKKwlpbnQJCWNvZGluZzsKKwlpbnQJCWxvY2F0aW9uOworCWludCAJCWRlc2NyOworfTsKKworc3RydWN0IGdzbV9tbmNjX2ZhY2lsaXR5IHsKKwlpbnQJCWxlbjsKKwljaGFyCQlpbmZvW0dTTV9NQVhfRkFDSUxJVFldOworfTsKKworc3RydWN0IGdzbV9tbmNjX3NzdmVyc2lvbiB7CisJaW50CQlsZW47CisJY2hhcgkJaW5mb1tHU01fTUFYX1NTVkVSU0lPTl07Cit9OworCitzdHJ1Y3QgZ3NtX21uY2NfY2NjYXAgeworCWludAkJZHRtZjsKKwlpbnQJCXBjcDsKK307CisKK2VudW0geworCUdTTV9NTkNDX0JDQVBfU1BFRUNICT0gMCwKKwlHU01fTU5DQ19CQ0FQX1VOUl9ESUcJPSAxLAorCUdTTV9NTkNDX0JDQVBfQVVESU8JPSAyLAorCUdTTV9NTkNDX0JDQVBfRkFYX0czCT0gMywKKwlHU01fTU5DQ19CQ0FQX09USEVSX0lUQyA9IDUsCisJR1NNX01OQ0NfQkNBUF9SRVNFUlZFRAk9IDcsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9tc2diLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0MWRjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oCkBAIC0wLDAgKzEsMTY1IEBACisjaWZuZGVmIF9NU0dCX0gKKyNkZWZpbmUgX01TR0JfSAorCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJsaW51eGxpc3QuaCIKKworc3RydWN0IG1zZ2IgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBQYXJ0IG9mIHdoaWNoIFRSWCBsb2dpY2FsIGNoYW5uZWwgd2Ugd2VyZSByZWNlaXZlZCAvIHRyYW5zbWl0dGVkICovCisJLyogRklYTUU6IG1vdmUgdGhlbSBpbnRvIHRoZSBjb250cm9sIGJ1ZmZlciAqLworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJLyogdGhlIExheWVyMSBoZWFkZXIgKGlmIGFueSkgKi8KKwl1bnNpZ25lZCBjaGFyICpsMWg7CisJLyogdGhlIEEtYmlzIGxheWVyIDIgaGVhZGVyOiBPTUwsIFJTTChSTEwpLCBOUyAqLworCXVuc2lnbmVkIGNoYXIgKmwyaDsKKwkvKiB0aGUgbGF5ZXIgMyBoZWFkZXIuIEZvciBPTUw6IEZPTTsgUlNMOiAwNC4wODsgR1BSUzogQlNTR1AgKi8KKwl1bnNpZ25lZCBjaGFyICpsM2g7CisJLyogdGhlIGxheWVyIDQgaGVhZGVyICovCisJdW5zaWduZWQgY2hhciAqbDRoOworCisJLyogdGhlICdjb250cm9sIGJ1ZmZlcicsIGxhcmdlIGVub3VnaCB0byBjb250YWluIDUgcG9pbnRlcnMgKi8KKwl1bnNpZ25lZCBsb25nIGNiWzVdOworCisJdWludDE2X3QgZGF0YV9sZW47CisJdWludDE2X3QgbGVuOworCisJdW5zaWduZWQgY2hhciAqaGVhZDsKKwl1bnNpZ25lZCBjaGFyICp0YWlsOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdW5zaWduZWQgY2hhciBfZGF0YVswXTsKK307CisKK2V4dGVybiBzdHJ1Y3QgbXNnYiAqbXNnYl9hbGxvYyh1aW50MTZfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIG1zZ2JfZnJlZShzdHJ1Y3QgbXNnYiAqbSk7CitleHRlcm4gdm9pZCBtc2diX2VucXVldWUoc3RydWN0IGxsaXN0X2hlYWQgKnF1ZXVlLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK2V4dGVybiBzdHJ1Y3QgbXNnYiAqbXNnYl9kZXF1ZXVlKHN0cnVjdCBsbGlzdF9oZWFkICpxdWV1ZSk7CitleHRlcm4gdm9pZCBtc2diX3Jlc2V0KHN0cnVjdCBtc2diICptKTsKKworI2RlZmluZSBtc2diX2wxKG0pCSgodm9pZCAqKShtLT5sMWgpKQorI2RlZmluZSBtc2diX2wyKG0pCSgodm9pZCAqKShtLT5sMmgpKQorI2RlZmluZSBtc2diX2wzKG0pCSgodm9pZCAqKShtLT5sM2gpKQorI2RlZmluZSBtc2diX3NtcyhtKQkoKHZvaWQgKikobS0+bDRoKSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbXNnYl9sMWxlbihjb25zdCBzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlyZXR1cm4gbXNnYi0+dGFpbCAtICh1aW50OF90ICopbXNnYl9sMShtc2diKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbXNnYl9sMmxlbihjb25zdCBzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlyZXR1cm4gbXNnYi0+dGFpbCAtICh1aW50OF90ICopbXNnYl9sMihtc2diKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbXNnYl9sM2xlbihjb25zdCBzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlyZXR1cm4gbXNnYi0+dGFpbCAtICh1aW50OF90ICopbXNnYl9sMyhtc2diKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbXNnYl9oZWFkbGVuKGNvbnN0IHN0cnVjdCBtc2diICptc2diKQoreworCXJldHVybiBtc2diLT5sZW4gLSBtc2diLT5kYXRhX2xlbjsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqbXNnYl9wdXQoc3RydWN0IG1zZ2IgKm1zZ2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdG1wID0gbXNnYi0+dGFpbDsKKwltc2diLT50YWlsICs9IGxlbjsKKwltc2diLT5sZW4gKz0gbGVuOworCXJldHVybiB0bXA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbXNnYl9wdXRfdTgoc3RydWN0IG1zZ2IgKm1zZ2IsIHVpbnQ4X3Qgd29yZCkKK3sKKwl1aW50OF90ICpzcGFjZSA9IG1zZ2JfcHV0KG1zZ2IsIDEpOworCXNwYWNlWzBdID0gd29yZCAmIDB4RkY7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbXNnYl9wdXRfdTE2KHN0cnVjdCBtc2diICptc2diLCB1aW50MTZfdCB3b3JkKQoreworCXVpbnQ4X3QgKnNwYWNlID0gbXNnYl9wdXQobXNnYiwgMik7CisJc3BhY2VbMF0gPSB3b3JkID4+IDggJiAweEZGOworCXNwYWNlWzFdID0gd29yZCAmIDB4RkY7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbXNnYl9wdXRfdTMyKHN0cnVjdCBtc2diICptc2diLCB1aW50MzJfdCB3b3JkKQoreworCXVpbnQ4X3QgKnNwYWNlID0gbXNnYl9wdXQobXNnYiwgNCk7CisJc3BhY2VbMF0gPSB3b3JkID4+IDI0ICYgMHhGRjsKKwlzcGFjZVsxXSA9IHdvcmQgPj4gMTYgJiAweEZGOworCXNwYWNlWzJdID0gd29yZCA+PiA4ICYgMHhGRjsKKwlzcGFjZVszXSA9IHdvcmQgJiAweEZGOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICptc2diX2dldChzdHJ1Y3QgbXNnYiAqbXNnYiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp0bXAgPSBtc2diLT5kYXRhOworCW1zZ2ItPmRhdGEgKz0gbGVuOworCW1zZ2ItPmxlbiAtPSBsZW47CisJcmV0dXJuIHRtcDsKK30KK3N0YXRpYyBpbmxpbmUgdWludDhfdCBtc2diX2dldF91OChzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwl1aW50OF90ICpzcGFjZSA9IG1zZ2JfZ2V0KG1zZ2IsIDEpOworCXJldHVybiBzcGFjZVswXTsKK30KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgbXNnYl9nZXRfdTE2KHN0cnVjdCBtc2diICptc2diKQoreworCXVpbnQ4X3QgKnNwYWNlID0gbXNnYl9nZXQobXNnYiwgMik7CisJcmV0dXJuIHNwYWNlWzBdIDw8IDggfCBzcGFjZVsxXTsKK30KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbXNnYl9nZXRfdTMyKHN0cnVjdCBtc2diICptc2diKQoreworCXVpbnQ4X3QgKnNwYWNlID0gbXNnYl9nZXQobXNnYiwgNCk7CisJcmV0dXJuIHNwYWNlWzBdIDw8IDI0IHwgc3BhY2VbMV0gPDwgMTYgfCBzcGFjZVsyXSA8PCA4IHwgc3BhY2VbM107Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKm1zZ2JfcHVzaChzdHJ1Y3QgbXNnYiAqbXNnYiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwltc2diLT5kYXRhIC09IGxlbjsKKwltc2diLT5sZW4gKz0gbGVuOworCXJldHVybiBtc2diLT5kYXRhOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICptc2diX3B1bGwoc3RydWN0IG1zZ2IgKm1zZ2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJbXNnYi0+bGVuIC09IGxlbjsKKwlyZXR1cm4gbXNnYi0+ZGF0YSArPSBsZW47Cit9CitzdGF0aWMgaW5saW5lIGludCBtc2diX3RhaWxyb29tKGNvbnN0IHN0cnVjdCBtc2diICptc2diKQoreworCXJldHVybiAobXNnYi0+aGVhZCArIG1zZ2ItPmRhdGFfbGVuKSAtIG1zZ2ItPnRhaWw7Cit9CisKKy8qIGluY3JlYXNlIHRoZSBoZWFkcm9vbSBvZiBhbiBlbXB0eSBtc2diLCByZWR1Y2luZyB0aGUgdGFpbHJvb20gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2diX3Jlc2VydmUoc3RydWN0IG1zZ2IgKm1zZywgaW50IGxlbikKK3sKKwltc2ctPmRhdGEgKz0gbGVuOworCW1zZy0+dGFpbCArPSBsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1zZ2IgKm1zZ2JfYWxsb2NfaGVhZHJvb20oaW50IHNpemUsIGludCBoZWFkcm9vbSwKKwkJCQkJCWNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2Moc2l6ZSwgbmFtZSk7CisJaWYgKG1zZykKKwkJbXNnYl9yZXNlcnZlKG1zZywgaGVhZHJvb20pOworCXJldHVybiBtc2c7Cit9CisKKyNlbmRpZiAvKiBfTVNHQl9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTc5NTBlCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMgQEAKK29zbW9jb3JlX3Byb3RvX0hFQURFUlMgPSBnc21fMDRfMDguaCBnc21fMDRfMTEuaCBnc21fMDRfODAuaCBnc21fMDhfNTguaCBnc21fMTJfMjEuaCBnc21fMDhfMDguaAorCitvc21vY29yZV9wcm90b2RpciA9ICQoaW5jbHVkZWRpcikvb3Ntb2NvcmUvcHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMTEyYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oCkBAIC0wLDAgKzEsNzUxIEBACisjaWZuZGVmIFBST1RPX0dTTV8wNF8wOF9ICisjZGVmaW5lIFBST1RPX0dTTV8wNF8wOF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogR1NNIFRTIDA0LjA4ICBkZWZpbml0aW9ucyAqLworc3RydWN0IGdzbV9sY2hhbjsKKworc3RydWN0IGdzbTQ4X2NsYXNzbWFyazEgeworCXVpbnQ4X3Qgc3BhcmU6MSwKKwkJIHJldl9sZXZlbDoyLAorCQkgZXNfaW5kOjEsCisJCSBhNV8xOjEsCisJCSBwd3JfbGV2OjM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciAxMC41LjIuNSAqLworc3RydWN0IGdzbTQ4X2NoYW5fZGVzYyB7CisJdWludDhfdCBjaGFuX25yOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgbWFpb19oaWdoOjQsCisJCQkJIGg6MSwKKwkJCQkgdHNjOjM7CisJCQl1aW50OF90IGhzbjo2LAorCQkJCSBtYWlvX2xvdzoyOworCQl9IGgxOworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBhcmZjbl9oaWdoOjIsCisJCQkJIHNwYXJlOjIsCisJCQkJIGg6MSwKKwkJCQkgdHNjOjM7CisJCQl1aW50OF90IGFyZmNuX2xvdzsKKwkJfSBoMDsKKwl9OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIENoYXB0ZXIgMTAuNS4yLjIxYWEgKi8KK3N0cnVjdCBnc200OF9tdWx0aV9yYXRlX2NvbmYgeworCXVpbnQ4X3Qgc21vZCA6IDIsCisJCSBzcGFyZTogMSwKKwkJIGljbWkgOiAxLAorCQkgbnNjYiA6IDEsCisJCSB2ZXIgOiAzOworCXVpbnQ4X3QgbTRfNzUgOiAxLAorCQkgbTVfMTUgOiAxLAorCQkgbTVfOTAgOiAxLAorCQkgbTZfNzAgOiAxLAorCQkgbTdfNDAgOiAxLAorCQkgbTdfOTUgOiAxLAorCQkgbTEwXzIgOiAxLAorCQkgbTEyXzIgOiAxOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciAxMC41LjIuMzAgKi8KK3N0cnVjdCBnc200OF9yZXFfcmVmIHsKKwl1aW50OF90IHJhOworCXVpbnQ4X3QgdDNfaGlnaDozLAorCQkgdDFfOjU7CisJdWludDhfdCB0Mjo1LAorCQkgdDNfbG93OjM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIENoYXB0ZXIgOS4xLjUvOS4xLjYKKyAqCisgKiBGb3IgOS4xLjYgdGhlIGNoYW5fZGVzYyBoYXMgdGhlIG1lYW5pbmcgb2YgMTAuNS4yLjVhCisgKi8KK3N0cnVjdCBnc200OF9jaGFuX21vZGVfbW9kaWZ5IHsKKwlzdHJ1Y3QgZ3NtNDhfY2hhbl9kZXNjIGNoYW5fZGVzYzsKKwl1aW50OF90IG1vZGU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworZW51bSBnc200OF9jaGFuX21vZGUgeworCUdTTTQ4X0NNT0RFX1NJR04JPSAweDAwLAorCUdTTTQ4X0NNT0RFX1NQRUVDSF9WMQk9IDB4MDEsCisJR1NNNDhfQ01PREVfU1BFRUNIX0VGUgk9IDB4MjEsCisJR1NNNDhfQ01PREVfU1BFRUNIX0FNUgk9IDB4NDEsCisJR1NNNDhfQ01PREVfREFUQV8xNGs1CT0gMHgwZiwKKwlHU000OF9DTU9ERV9EQVRBXzEyazAJPSAweDAzLAorCUdTTTQ4X0NNT0RFX0RBVEFfNmswCT0gMHgwYiwKKwlHU000OF9DTU9ERV9EQVRBXzNrNgk9IDB4MjMsCit9OworCisvKiBDaGFwdGVyIDkuMS4yICovCitzdHJ1Y3QgZ3NtNDhfYXNzX2NtZCB7CisJLyogU2VtYW50aWMgaXMgZnJvbSAxMC41LjIuNWEgKi8KKwlzdHJ1Y3QgZ3NtNDhfY2hhbl9kZXNjIGNoYW5fZGVzYzsKKwl1aW50OF90IHBvd2VyX2NvbW1hbmQ7CisJdWludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciAxMC41LjIuMiAqLworc3RydWN0IGdzbTQ4X2NlbGxfZGVzYyB7CisJdWludDhfdCBiY2M6MywKKwkJIG5jYzozLAorCQkgYXJmY25faGk6MjsKKwl1aW50OF90IGFyZmNuX2xvOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciA5LjEuMTUgKi8KK3N0cnVjdCBnc200OF9ob19jbWQgeworCXN0cnVjdCBnc200OF9jZWxsX2Rlc2MgY2VsbF9kZXNjOworCXN0cnVjdCBnc200OF9jaGFuX2Rlc2MgY2hhbl9kZXNjOworCXVpbnQ4X3QgaG9fcmVmOworCXVpbnQ4X3QgcG93ZXJfY29tbWFuZDsKKwl1aW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBDaGFwdGVyIDkuMS4xOCAqLworc3RydWN0IGdzbTQ4X2ltbV9hc3MgeworCXVpbnQ4X3QgbDJfcGxlbjsKKwl1aW50OF90IHByb3RvX2Rpc2NyOworCXVpbnQ4X3QgbXNnX3R5cGU7CisJdWludDhfdCBwYWdlX21vZGU7CisJc3RydWN0IGdzbTQ4X2NoYW5fZGVzYyBjaGFuX2Rlc2M7CisJc3RydWN0IGdzbTQ4X3JlcV9yZWYgcmVxX3JlZjsKKwl1aW50OF90IHRpbWluZ19hZHZhbmNlOworCXVpbnQ4X3QgbW9iX2FsbG9jX2xlbjsKKwl1aW50OF90IG1vYl9hbGxvY1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBDaGFwdGVyIDEwLjUuMS4zICovCitzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgeworCXVpbnQ4X3QgZGlnaXRzWzNdOwkvKiBCQ0QhICovCisJdWludDE2X3QgbGFjOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNlY3Rpb24gOS4yLjIgKi8KK3N0cnVjdCBnc200OF9hdXRoX3JlcSB7CisJdWludDhfdCBrZXlfc2VxOjQsCisJICAgICAgICAgc3BhcmU6NDsKKwl1aW50OF90IHJhbmRbMTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNlY3Rpb24gOS4yLjE1ICovCitzdHJ1Y3QgZ3NtNDhfbG9jX3VwZF9yZXEgeworCXVpbnQ4X3QgdHlwZTo0LAorCQkga2V5X3NlcTo0OworCXN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCBsYWk7CisJc3RydWN0IGdzbTQ4X2NsYXNzbWFyazEgY2xhc3NtYXJrMTsKKwl1aW50OF90IG1pX2xlbjsKKwl1aW50OF90IG1pWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNlY3Rpb24gMTAuMSAqLworc3RydWN0IGdzbTQ4X2hkciB7CisJdWludDhfdCBwcm90b19kaXNjcjsKKwl1aW50OF90IG1zZ190eXBlOworCXVpbnQ4X3QgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMS4zeCBTeXN0ZW0gaW5mb3JtYXRpb24gVHlwZSBoZWFkZXIgKi8KK3N0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV9oZWFkZXIgeworCXVpbnQ4X3QgbDJfcGxlbjsKKwl1aW50OF90IHJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgOjQsCisJCXNraXBfaW5kaWNhdG9yOjQ7IAorCXVpbnQ4X3Qgc3lzdGVtX2luZm9ybWF0aW9uOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBnc200OF9yYWNoX2NvbnRyb2wgeworCXVpbnQ4X3QgcmUgOjEsCisJCSBjZWxsX2JhciA6MSwKKwkJIHR4X2ludGVnZXIgOjQsCisJCSBtYXhfdHJhbnMgOjI7CisJdWludDhfdCB0MjsKKwl1aW50OF90IHQzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNlY3Rpb24gMTAuNS4yLjQgQ2VsbCBTZWxlY3Rpb24gUGFyYW1ldGVycyAqLworc3RydWN0IGdzbTQ4X2NlbGxfc2VsX3BhciB7CisJdWludDhfdCBtc190eHB3cl9tYXhfY2NjaDo1LAkvKiBHU00gMDUuMDggTVMtVFhQV1ItTUFYLUNDQ0ggKi8KKwkJIGNlbGxfcmVzZWxfaHlzdDozOwkvKiBHU00gMDUuMDggQ0VMTC1SRVNFTEVDVC1IWVNURVJFU0lTICovCisJdWludDhfdCByeGxldl9hY2NfbWluOjYsCS8qIEdTTSAwNS4wOCBSWExFVi1BQ0NFU1MtTUlOICovCisJCSBuZWNpOjEsCisJCSBhY3M6MTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDEwLjUuMi4xMSBDb250cm9sIENoYW5uZWwgRGVzY3JpcHRpb24gLCBGaWd1cmUgMTAuNS4zMyAqLworc3RydWN0IGdzbTQ4X2NvbnRyb2xfY2hhbm5lbF9kZXNjciB7CisJdWludDhfdCBjY2NoX2NvbmYgOjMsCisJCWJzX2FnX2Jsa3NfcmVzIDozLAorCQlhdHQgOjEsCisJCXNwYXJlMSA6MTsKKwl1aW50OF90IGJzX3BhX21mcm1zIDogMywKKwkJc3BhcmUyIDo1OworCXVpbnQ4X3QgdDMyMTI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGdzbTQ4X2NlbGxfb3B0aW9ucyB7CisJdWludDhfdCByYWRpb19saW5rX3RpbWVvdXQ6NCwKKwkJIGR0eDoyLAorCQkgcHdyYzoxLAorCQkgc3BhcmU6MTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMi45IENNIHNlcnZpY2UgcmVxdWVzdCAqLworc3RydWN0IGdzbTQ4X3NlcnZpY2VfcmVxdWVzdCB7CisJdWludDhfdCBjbV9zZXJ2aWNlX3R5cGUgOiA0LAorCQkgY2lwaGVyX2tleV9zZXEgIDogNDsKKwkvKiBsZW5ndGggKyAzIGJ5dGVzICovCisJdWludDMyX3QgY2xhc3NtYXJrOworCXVpbnQ4X3QgbWlfbGVuOworCXVpbnQ4X3QgbWlbMF07CisJLyogb3B0aW9uYWwgcHJpb3JpdHkgbGV2ZWwgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMS4zMSBTeXN0ZW0gaW5mb3JtYXRpb24gVHlwZSAxICovCitzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMSB7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlX2hlYWRlciBoZWFkZXI7CisJdWludDhfdCBjZWxsX2NoYW5uZWxfZGVzY3JpcHRpb25bMTZdOworCXN0cnVjdCBnc200OF9yYWNoX2NvbnRyb2wgcmFjaF9jb250cm9sOworCXVpbnQ4X3QgcmVzdF9vY3RldHNbMF07IC8qIE5DSCBwb3NpdGlvbiBvbiB0aGUgQ0NDSCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNlY3Rpb24gOS4xLjMyIFN5c3RlbSBpbmZvcm1hdGlvbiBUeXBlIDIgKi8KK3N0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8yIHsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfaGVhZGVyIGhlYWRlcjsKKwl1aW50OF90IGJjY2hfZnJlcXVlbmN5X2xpc3RbMTZdOworCXVpbnQ4X3QgbmNjX3Blcm1pdHRlZDsKKwlzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sIHJhY2hfY29udHJvbDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMS4zNSBTeXN0ZW0gaW5mb3JtYXRpb24gVHlwZSAzICovCitzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMyB7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlX2hlYWRlciBoZWFkZXI7CisJdWludDE2X3QgY2VsbF9pZGVudGl0eTsKKwlzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgbGFpOworCXN0cnVjdCBnc200OF9jb250cm9sX2NoYW5uZWxfZGVzY3IgY29udHJvbF9jaGFubmVsX2Rlc2M7CisJc3RydWN0IGdzbTQ4X2NlbGxfb3B0aW9ucyBjZWxsX29wdGlvbnM7CisJc3RydWN0IGdzbTQ4X2NlbGxfc2VsX3BhciBjZWxsX3NlbF9wYXI7CisJc3RydWN0IGdzbTQ4X3JhY2hfY29udHJvbCByYWNoX2NvbnRyb2w7CisJdWludDhfdCByZXN0X29jdGV0c1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMS4zNiBTeXN0ZW0gaW5mb3JtYXRpb24gVHlwZSA0ICovCitzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNCB7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlX2hlYWRlciBoZWFkZXI7CisJc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkIGxhaTsKKwlzdHJ1Y3QgZ3NtNDhfY2VsbF9zZWxfcGFyIGNlbGxfc2VsX3BhcjsKKwlzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sIHJhY2hfY29udHJvbDsKKwkvKglvcHRpb25hbCBDQkNIIGNvbmRpdGlvbmFsIENCQ0guLi4gZm9sbG93ZWQgYnkKKwkJbWFuZGFudG9yeSBTSSA0IFJlc2V0IE9jdGV0cworCSAqLworCXVpbnQ4X3QgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMS4zNyBTeXN0ZW0gaW5mb3JtYXRpb24gVHlwZSA1ICovCitzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNSB7CisJdWludDhfdCBycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yIDo0LAorCQlza2lwX2luZGljYXRvcjo0OyAKKwl1aW50OF90IHN5c3RlbV9pbmZvcm1hdGlvbjsKKwl1aW50OF90IGJjY2hfZnJlcXVlbmN5X2xpc3RbMTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNlY3Rpb24gOS4xLjQwIFN5c3RlbSBpbmZvcm1hdGlvbiBUeXBlIDYgKi8KK3N0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV82IHsKKwl1aW50OF90IHJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgOjQsCisJCXNraXBfaW5kaWNhdG9yOjQ7IAorCXVpbnQ4X3Qgc3lzdGVtX2luZm9ybWF0aW9uOworCXVpbnQxNl90IGNlbGxfaWRlbnRpdHk7CisJc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkIGxhaTsKKwlzdHJ1Y3QgZ3NtNDhfY2VsbF9vcHRpb25zIGNlbGxfb3B0aW9uczsKKwl1aW50OF90IG5jY19wZXJtaXR0ZWQ7CisJdWludDhfdCByZXN0X29jdGV0c1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMS40M2EgU3lzdGVtIEluZm9ybWF0aW9uIHR5cGUgMTMgKi8KK3N0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xMyB7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlX2hlYWRlciBoZWFkZXI7CisJdWludDhfdCByZXN0X29jdGV0c1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTZWN0aW9uIDkuMi4xMiBJTVNJIERldGFjaCBJbmRpY2F0aW9uICovCitzdHJ1Y3QgZ3NtNDhfaW1zaV9kZXRhY2hfaW5kIHsKKwlzdHJ1Y3QgZ3NtNDhfY2xhc3NtYXJrMSBjbGFzc21hcmsxOworCXVpbnQ4X3QgbWlfbGVuOworCXVpbnQ4X3QgbWlbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogU2VjdGlvbiAxMC4yICsgR1NNIDA0LjA3IDEyLjIuMy4xLjEgKi8KKyNkZWZpbmUgR1NNNDhfUERJU0NfR1JPVVBfQ0MJMHgwMAorI2RlZmluZSBHU000OF9QRElTQ19CQ0FTVF9DQwkweDAxCisjZGVmaW5lIEdTTTQ4X1BESVNDX1BEU1MxCTB4MDIKKyNkZWZpbmUgR1NNNDhfUERJU0NfQ0MJCTB4MDMKKyNkZWZpbmUgR1NNNDhfUERJU0NfUERTUzIJMHgwNAorI2RlZmluZSBHU000OF9QRElTQ19NTQkJMHgwNQorI2RlZmluZSBHU000OF9QRElTQ19SUgkJMHgwNgorI2RlZmluZSBHU000OF9QRElTQ19NTV9HUFJTCTB4MDgKKyNkZWZpbmUgR1NNNDhfUERJU0NfU01TCQkweDA5CisjZGVmaW5lIEdTTTQ4X1BESVNDX1NNX0dQUlMJMHgwYQorI2RlZmluZSBHU000OF9QRElTQ19OQ19TUwkweDBiCisjZGVmaW5lIEdTTTQ4X1BESVNDX0xPQwkJMHgwYworI2RlZmluZSBHU000OF9QRElTQ19NQVNLCTB4MGYKKyNkZWZpbmUgR1NNNDhfUERJU0NfVVNTRAkweDExCisKKy8qIFNlY3Rpb24gMTAuNCAqLworI2RlZmluZSBHU000OF9NVF9SUl9JTklUX1JFUQkJMHgzYworI2RlZmluZSBHU000OF9NVF9SUl9BRERfQVNTCQkweDNiCisjZGVmaW5lIEdTTTQ4X01UX1JSX0lNTV9BU1MJCTB4M2YKKyNkZWZpbmUgR1NNNDhfTVRfUlJfSU1NX0FTU19FWFQJCTB4MzkKKyNkZWZpbmUgR1NNNDhfTVRfUlJfSU1NX0FTU19SRUoJCTB4M2EKKworI2RlZmluZSBHU000OF9NVF9SUl9DSVBIX01fQ01ECQkweDM1CisjZGVmaW5lIEdTTTQ4X01UX1JSX0NJUEhfTV9DT01QTAkweDMyCisKKyNkZWZpbmUgR1NNNDhfTVRfUlJfQ0ZHX0NIR19DTUQJCTB4MzAKKyNkZWZpbmUgR1NNNDhfTVRfUlJfQ0ZHX0NIR19BQ0sJCTB4MzEKKyNkZWZpbmUgR1NNNDhfTVRfUlJfQ0ZHX0NIR19SRUoJCTB4MzMKKworI2RlZmluZSBHU000OF9NVF9SUl9BU1NfQ01ECQkweDJlCisjZGVmaW5lIEdTTTQ4X01UX1JSX0FTU19DT01QTAkJMHgyOQorI2RlZmluZSBHU000OF9NVF9SUl9BU1NfRkFJTAkJMHgyZgorI2RlZmluZSBHU000OF9NVF9SUl9IQU5ET19DTUQJCTB4MmIKKyNkZWZpbmUgR1NNNDhfTVRfUlJfSEFORE9fQ09NUEwJCTB4MmMKKyNkZWZpbmUgR1NNNDhfTVRfUlJfSEFORE9fRkFJTAkJMHgyOAorI2RlZmluZSBHU000OF9NVF9SUl9IQU5ET19JTkZPCQkweDJkCisKKyNkZWZpbmUgR1NNNDhfTVRfUlJfQ0VMTF9DSEdfT1JERVIJMHgwOAorI2RlZmluZSBHU000OF9NVF9SUl9QRENIX0FTU19DTUQJMHgyMworCisjZGVmaW5lIEdTTTQ4X01UX1JSX0NIQU5fUkVMCQkweDBkCisjZGVmaW5lIEdTTTQ4X01UX1JSX1BBUlRfUkVMCQkweDBhCisjZGVmaW5lIEdTTTQ4X01UX1JSX1BBUlRfUkVMX0NPTVAJMHgwZgorCisjZGVmaW5lIEdTTTQ4X01UX1JSX1BBR19SRVFfMQkJMHgyMQorI2RlZmluZSBHU000OF9NVF9SUl9QQUdfUkVRXzIJCTB4MjIKKyNkZWZpbmUgR1NNNDhfTVRfUlJfUEFHX1JFUV8zCQkweDI0CisjZGVmaW5lIEdTTTQ4X01UX1JSX1BBR19SRVNQCQkweDI3CisjZGVmaW5lIEdTTTQ4X01UX1JSX05PVElGX05DSAkJMHgyMAorI2RlZmluZSBHU000OF9NVF9SUl9OT1RJRl9GQUNDSAkJMHgyNQorI2RlZmluZSBHU000OF9NVF9SUl9OT1RJRl9SRVNQCQkweDI2CisKKyNkZWZpbmUgR1NNNDhfTVRfUlJfU1lTSU5GT184CQkweDE4CisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fMQkJMHgxOQorI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzIJCTB4MWEKKyNkZWZpbmUgR1NNNDhfTVRfUlJfU1lTSU5GT18zCQkweDFiCisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fNAkJMHgxYworI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzUJCTB4MWQKKyNkZWZpbmUgR1NNNDhfTVRfUlJfU1lTSU5GT182CQkweDFlCisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fNwkJMHgxZgorCisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fMmJpcwkweDAyCisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fMnRlcgkweDAzCisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fNWJpcwkweDA1CisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fNXRlcgkweDA2CisjZGVmaW5lIEdTTTQ4X01UX1JSX1NZU0lORk9fOQkJMHgwNAorI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzEzCQkweDAwCisKKyNkZWZpbmUgR1NNNDhfTVRfUlJfU1lTSU5GT18xNgkJMHgzZAorI2RlZmluZSBHU000OF9NVF9SUl9TWVNJTkZPXzE3CQkweDNlCisKKyNkZWZpbmUgR1NNNDhfTVRfUlJfQ0hBTl9NT0RFX01PRElGCTB4MTAKKyNkZWZpbmUgR1NNNDhfTVRfUlJfU1RBVFVTCQkweDEyCisjZGVmaW5lIEdTTTQ4X01UX1JSX0NIQU5fTU9ERV9NT0RJRl9BQ0sJMHgxNworI2RlZmluZSBHU000OF9NVF9SUl9GUkVRX1JFREVGCQkweDE0CisjZGVmaW5lIEdTTTQ4X01UX1JSX01FQVNfUkVQCQkweDE1CisjZGVmaW5lIEdTTTQ4X01UX1JSX0NMU01fQ0hHCQkweDE2CisjZGVmaW5lIEdTTTQ4X01UX1JSX0NMU01fRU5RCQkweDEzCisjZGVmaW5lIEdTTTQ4X01UX1JSX0VYVF9NRUFTX1JFUAkweDM2CisjZGVmaW5lIEdTTTQ4X01UX1JSX0VYVF9NRUFTX1JFUF9PUkQJMHgzNworI2RlZmluZSBHU000OF9NVF9SUl9HUFJTX1NVU1BfUkVRCTB4MzQKKworI2RlZmluZSBHU000OF9NVF9SUl9WR0NTX1VQTF9HUkFOVAkweDA4CisjZGVmaW5lIEdTTTQ4X01UX1JSX1VQTElOS19SRUxFQVNFCTB4MGUKKyNkZWZpbmUgR1NNNDhfTVRfUlJfVVBMSU5LX0ZSRUUJCTB4MGMKKyNkZWZpbmUgR1NNNDhfTVRfUlJfVVBMSU5LX0JVU1kJCTB4MmEKKyNkZWZpbmUgR1NNNDhfTVRfUlJfVEFMS0VSX0lORAkJMHgxMQorCisjZGVmaW5lIEdTTTQ4X01UX1JSX0FQUF9JTkZPCQkweDM4CisKKy8qIFRhYmxlIDEwLjIvM0dQUCBUUyAwNC4wOCAqLworI2RlZmluZSBHU000OF9NVF9NTV9JTVNJX0RFVEFDSF9JTkQJMHgwMQorI2RlZmluZSBHU000OF9NVF9NTV9MT0NfVVBEX0FDQ0VQVAkweDAyCisjZGVmaW5lIEdTTTQ4X01UX01NX0xPQ19VUERfUkVKRUNUCTB4MDQKKyNkZWZpbmUgR1NNNDhfTVRfTU1fTE9DX1VQRF9SRVFVRVNUCTB4MDgKKworI2RlZmluZSBHU000OF9NVF9NTV9BVVRIX1JFSgkJMHgxMQorI2RlZmluZSBHU000OF9NVF9NTV9BVVRIX1JFUQkJMHgxMgorI2RlZmluZSBHU000OF9NVF9NTV9BVVRIX1JFU1AJCTB4MTQKKyNkZWZpbmUgR1NNNDhfTVRfTU1fSURfUkVRCQkweDE4CisjZGVmaW5lIEdTTTQ4X01UX01NX0lEX1JFU1AJCTB4MTkKKyNkZWZpbmUgR1NNNDhfTVRfTU1fVE1TSV9SRUFMTF9DTUQJMHgxYQorI2RlZmluZSBHU000OF9NVF9NTV9UTVNJX1JFQUxMX0NPTVBMCTB4MWIKKworI2RlZmluZSBHU000OF9NVF9NTV9DTV9TRVJWX0FDQwkJMHgyMQorI2RlZmluZSBHU000OF9NVF9NTV9DTV9TRVJWX1JFSgkJMHgyMgorI2RlZmluZSBHU000OF9NVF9NTV9DTV9TRVJWX0FCT1JUCTB4MjMKKyNkZWZpbmUgR1NNNDhfTVRfTU1fQ01fU0VSVl9SRVEJCTB4MjQKKyNkZWZpbmUgR1NNNDhfTVRfTU1fQ01fU0VSVl9QUk9NUFQJMHgyNQorI2RlZmluZSBHU000OF9NVF9NTV9DTV9SRUVTVF9SRVEJMHgyOAorI2RlZmluZSBHU000OF9NVF9NTV9BQk9SVAkJMHgyOQorCisjZGVmaW5lIEdTTTQ4X01UX01NX05VTEwJCTB4MzAKKyNkZWZpbmUgR1NNNDhfTVRfTU1fU1RBVFVTCQkweDMxCisjZGVmaW5lIEdTTTQ4X01UX01NX0lORk8JCTB4MzIKKworLyogVGFibGUgMTAuMy8zR1BQIFRTIDA0LjA4ICovCisjZGVmaW5lIEdTTTQ4X01UX0NDX0FMRVJUSU5HCQkweDAxCisjZGVmaW5lIEdTTTQ4X01UX0NDX0NBTExfQ09ORgkJMHgwOAorI2RlZmluZSBHU000OF9NVF9DQ19DQUxMX1BST0MJCTB4MDIKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfQ09OTkVDVAkJMHgwNworI2RlZmluZSBHU000OF9NVF9DQ19DT05ORUNUX0FDSwkJMHgwZgorI2RlZmluZSBHU000OF9NVF9DQ19FTUVSR19TRVRVUAkJMHgwZQorI2RlZmluZSBHU000OF9NVF9DQ19QUk9HUkVTUwkJMHgwMworI2RlZmluZSBHU000OF9NVF9DQ19FU1RBQgkJMHgwNAorI2RlZmluZSBHU000OF9NVF9DQ19FU1RBQl9DT05GCQkweDA2CisjZGVmaW5lIEdTTTQ4X01UX0NDX1JFQ0FMTAkJMHgwYgorI2RlZmluZSBHU000OF9NVF9DQ19TVEFSVF9DQwkJMHgwOQorI2RlZmluZSBHU000OF9NVF9DQ19TRVRVUAkJMHgwNQorCisjZGVmaW5lIEdTTTQ4X01UX0NDX01PRElGWQkJMHgxNworI2RlZmluZSBHU000OF9NVF9DQ19NT0RJRllfQ09NUEwJMHgxZgorI2RlZmluZSBHU000OF9NVF9DQ19NT0RJRllfUkVKRUNUCTB4MTMKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfVVNFUl9JTkZPCQkweDEwCisjZGVmaW5lIEdTTTQ4X01UX0NDX0hPTEQJCTB4MTgKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfSE9MRF9BQ0sJCTB4MTkKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfSE9MRF9SRUoJCTB4MWEKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfUkVUUgkJMHgxYworI2RlZmluZSBHU000OF9NVF9DQ19SRVRSX0FDSwkJMHgxZAorI2RlZmluZSBHU000OF9NVF9DQ19SRVRSX1JFSgkJMHgxZQorCisjZGVmaW5lIEdTTTQ4X01UX0NDX0RJU0NPTk5FQ1QJCTB4MjUKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfUkVMRUFTRQkJMHgyZAorI2RlZmluZSBHU000OF9NVF9DQ19SRUxFQVNFX0NPTVBMCTB4MmEKKworI2RlZmluZSBHU000OF9NVF9DQ19DT05HX0NUUkwJCTB4MzkKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfTk9USUZZCQkweDNlCisjZGVmaW5lIEdTTTQ4X01UX0NDX1NUQVRVUwkJMHgzZAorI2RlZmluZSBHU000OF9NVF9DQ19TVEFUVVNfRU5RCQkweDM0CisjZGVmaW5lIEdTTTQ4X01UX0NDX1NUQVJUX0RUTUYJCTB4MzUKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfU1RPUF9EVE1GCQkweDMxCisjZGVmaW5lIEdTTTQ4X01UX0NDX1NUT1BfRFRNRl9BQ0sJMHgzMgorI2RlZmluZSBHU000OF9NVF9DQ19TVEFSVF9EVE1GX0FDSwkweDM2CisjZGVmaW5lIEdTTTQ4X01UX0NDX1NUQVJUX0RUTUZfUkVKCTB4MzcKKyNkZWZpbmUgR1NNNDhfTVRfQ0NfRkFDSUxJVFkJCTB4M2EKKworLyogRklYTUU6IFRhYmxlIDEwLjQgLyAxMC40YSAoR1BSUykgKi8KKworLyogU2VjdGlvbiAxMC41LjIuMjYsIFRhYmxlIDEwLjUuNjQgKi8KKyNkZWZpbmUgR1NNNDhfUE1fTUFTSwkJMHgwMworI2RlZmluZSBHU000OF9QTV9OT1JNQUwJCTB4MDAKKyNkZWZpbmUgR1NNNDhfUE1fRVhURU5ERUQJMHgwMQorI2RlZmluZSBHU000OF9QTV9SRU9SRwkJMHgwMgorI2RlZmluZSBHU000OF9QTV9TQU1FCQkweDAzCisKKy8qIENoYXB0ZXIgMTAuNS4zLjUgLyBUYWJsZSAxMC41LjkzICovCisjZGVmaW5lIEdTTTQ4X0xVUERfTk9STUFMCTB4MAorI2RlZmluZSBHU000OF9MVVBEX1BFUklPRElDCTB4MQorI2RlZmluZSBHU000OF9MVVBEX0lNU0lfQVRUCTB4MgorI2RlZmluZSBHU000OF9MVVBEX1JFU0VSVkVECTB4MworCisvKiBUYWJsZSAxMC41LjQgKi8KKyNkZWZpbmUgR1NNX01JX1RZUEVfTUFTSwkweDA3CisjZGVmaW5lIEdTTV9NSV9UWVBFX05PTkUJMHgwMAorI2RlZmluZSBHU01fTUlfVFlQRV9JTVNJCTB4MDEKKyNkZWZpbmUgR1NNX01JX1RZUEVfSU1FSQkweDAyCisjZGVmaW5lIEdTTV9NSV9UWVBFX0lNRUlTVgkweDAzCisjZGVmaW5lIEdTTV9NSV9UWVBFX1RNU0kJMHgwNAorI2RlZmluZSBHU01fTUlfT0RECQkweDA4CisKKyNkZWZpbmUgR1NNNDhfSUVfTVVMX1JBVEVfQ0ZHCTB4MDMJLyogMTAuNS4yLjIxYWEgKi8KKyNkZWZpbmUgR1NNNDhfSUVfTU9CSUxFX0lECTB4MTcKKyNkZWZpbmUgR1NNNDhfSUVfTkFNRV9MT05HCTB4NDMJLyogMTAuNS4zLjVhICovCisjZGVmaW5lIEdTTTQ4X0lFX05BTUVfU0hPUlQJMHg0NQkvKiAxMC41LjMuNWEgKi8KKyNkZWZpbmUgR1NNNDhfSUVfVVRDCQkweDQ2CS8qIDEwLjUuMy44ICovCisjZGVmaW5lIEdTTTQ4X0lFX05FVF9USU1FX1RaCTB4NDcJLyogMTAuNS4zLjkgKi8KKyNkZWZpbmUgR1NNNDhfSUVfTFNBX0lERU5UCTB4NDgJLyogMTAuNS4zLjExICovCisKKyNkZWZpbmUgR1NNNDhfSUVfQkVBUkVSX0NBUAkweDA0CS8qIDEwLjUuNC41ICovCisjZGVmaW5lIEdTTTQ4X0lFX0NBVVNFCQkweDA4CS8qIDEwLjUuNC4xMSAqLworI2RlZmluZSBHU000OF9JRV9DQ19DQVAJCTB4MTUJLyogMTAuNS40LjVhICovCisjZGVmaW5lIEdTTTQ4X0lFX0FMRVJUCQkweDE5CS8qIDEwLjUuNC4yNiAqLworI2RlZmluZSBHU000OF9JRV9GQUNJTElUWQkweDFjCS8qIDEwLjUuNC4xNSAqLworI2RlZmluZSBHU000OF9JRV9QUk9HUl9JTkQJMHgxZQkvKiAxMC41LjQuMjEgKi8KKyNkZWZpbmUgR1NNNDhfSUVfQVVYX1NUQVRVUwkweDI0CS8qIDEwLjUuNC40ICovCisjZGVmaW5lIEdTTTQ4X0lFX05PVElGWQkJMHgyNwkvKiAxMC41LjQuMjAgKi8KKyNkZWZpbmUgR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZCTB4MmMJLyogMTAuNS40LjE3ICovCisjZGVmaW5lIEdTTTQ4X0lFX1NJR05BTAkJMHgzNAkvKiAxMC41LjQuMjMgKi8KKyNkZWZpbmUgR1NNNDhfSUVfQ09OTl9CQ0QJMHg0YwkvKiAxMC41LjQuMTMgKi8KKyNkZWZpbmUgR1NNNDhfSUVfQ09OTl9TVUIJMHg0ZAkvKiAxMC41LjQuMTQgKi8KKyNkZWZpbmUgR1NNNDhfSUVfQ0FMTElOR19CQ0QJMHg1YwkvKiAxMC41LjQuOSAqLworI2RlZmluZSBHU000OF9JRV9DQUxMSU5HX1NVQgkweDVkCS8qIDEwLjUuNC4xMCAqLworI2RlZmluZSBHU000OF9JRV9DQUxMRURfQkNECTB4NWUJLyogMTAuNS40LjcgKi8KKyNkZWZpbmUgR1NNNDhfSUVfQ0FMTEVEX1NVQgkweDZkCS8qIDEwLjUuNC44ICovCisjZGVmaW5lIEdTTTQ4X0lFX1JFRElSX0JDRAkweDc0CS8qIDEwLjUuNC4yMWEgKi8KKyNkZWZpbmUgR1NNNDhfSUVfUkVESVJfU1VCCTB4NzUJLyogMTAuNS40LjIxYiAqLworI2RlZmluZSBHU000OF9JRV9MT1dMX0NPTVBBVAkweDdjCS8qIDEwLjUuNC4xOCAqLworI2RlZmluZSBHU000OF9JRV9ISUdITF9DT01QQVQJMHg3ZAkvKiAxMC41LjQuMTYgKi8KKyNkZWZpbmUgR1NNNDhfSUVfVVNFUl9VU0VSCTB4N2UJLyogMTAuNS40LjI1ICovCisjZGVmaW5lIEdTTTQ4X0lFX1NTX1ZFUlMJMHg3ZgkvKiAxMC41LjQuMjQgKi8KKyNkZWZpbmUgR1NNNDhfSUVfTU9SRV9EQVRBCTB4YTAJLyogMTAuNS40LjE5ICovCisjZGVmaW5lIEdTTTQ4X0lFX0NMSVJfU1VQUAkweGExCS8qIDEwLjUuNC4xMWEgKi8KKyNkZWZpbmUgR1NNNDhfSUVfQ0xJUl9JTlZPQwkweGEyCS8qIDEwLjUuNC4xMWIgKi8KKyNkZWZpbmUgR1NNNDhfSUVfUkVWX0NfU0VUVVAJMHhhMwkvKiAxMC41LjQuMjJhICovCisjZGVmaW5lIEdTTTQ4X0lFX1JFUEVBVF9DSVIJMHhkMQkvKiAxMC41LjQuMjIgKi8KKyNkZWZpbmUgR1NNNDhfSUVfUkVQRUFUX1NFUQkweGQzCS8qIDEwLjUuNC4yMiAqLworCisvKiBTZWN0aW9uIDEwLjUuNC4xMSAvIFRhYmxlIDEwLjUuMTIyICovCisjZGVmaW5lIEdTTTQ4X0NBVVNFX0NTX0dTTQkweDYwCisKKy8qIFNlY3Rpb24gOS4xLjIgLyBUYWJsZSA5LjMgKi8KKyNkZWZpbmUgR1NNNDhfSUVfRlJRTElTVF9BRlRFUgkweDA1CisjZGVmaW5lIEdTTTQ4X0lFX0NFTExfQ0hfREVTQwkweDYyCisjZGVmaW5lIEdTTTQ4X0lFX01TTE9UX0RFU0MJMHgxMAorI2RlZmluZSBHU000OF9JRV9DSEFOTU9ERV8xCTB4NjMKKyNkZWZpbmUgR1NNNDhfSUVfQ0hBTk1PREVfMgkweDExCisjZGVmaW5lIEdTTTQ4X0lFX0NIQU5NT0RFXzMJMHgxMworI2RlZmluZSBHU000OF9JRV9DSEFOTU9ERV80CTB4MTQKKyNkZWZpbmUgR1NNNDhfSUVfQ0hBTk1PREVfNQkweDE1CisjZGVmaW5lIEdTTTQ4X0lFX0NIQU5NT0RFXzYJMHgxNgorI2RlZmluZSBHU000OF9JRV9DSEFOTU9ERV83CTB4MTcKKyNkZWZpbmUgR1NNNDhfSUVfQ0hBTk1PREVfOAkweDE4CisjZGVmaW5lIEdTTTQ4X0lFX0NIQU5ERVNDXzIJMHg2NAorLyogRklYTUUgKi8KKworLyogU2VjdGlvbiAxMC41LjQuMjMgLyBUYWJsZSAxMC41LjEzMCAqLworZW51bSBnc200OF9zaWduYWxfdmFsIHsKKwlHU000OF9TSUdOQUxfRElBTFRPTkUJPSAweDAwLAorCUdTTTQ4X1NJR05BTF9SSU5HQkFDSwk9IDB4MDEsCisJR1NNNDhfU0lHTkFMX0lOVEVSQ0VQVAk9IDB4MDIsCisJR1NNNDhfU0lHTkFMX05FVF9DT05HCT0gMHgwMywKKwlHU000OF9TSUdOQUxfQlVTWQk9IDB4MDQsCisJR1NNNDhfU0lHTkFMX0NPTkZJUk0JPSAweDA1LAorCUdTTTQ4X1NJR05BTF9BTlNXRVIJPSAweDA2LAorCUdTTTQ4X1NJR05BTF9DQUxMX1dBSVQJPSAweDA3LAorCUdTTTQ4X1NJR05BTF9PRkZfSE9PSwk9IDB4MDgsCisJR1NNNDhfU0lHTkFMX09GRgk9IDB4M2YsCisJR1NNNDhfU0lHTkFMX0FMRVJUX09GRgk9IDB4NGYsCit9OworCitlbnVtIGdzbTQ4X2NhdXNlX2xvYyB7CisJR1NNNDhfQ0FVU0VfTE9DX1VTRVIJCT0gMHgwMCwKKwlHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUJPSAweDAxLAorCUdTTTQ4X0NBVVNFX0xPQ19QVU5fU19MVQk9IDB4MDIsCisJR1NNNDhfQ0FVU0VfTE9DX1RSQU5TX05FVAk9IDB4MDMsCisJR1NNNDhfQ0FVU0VfTE9DX1BVTl9TX1JVCT0gMHgwNCwKKwlHU000OF9DQVVTRV9MT0NfUFJOX1NfUlUJPSAweDA1LAorCS8qIG5vdCBkZWZpbmVkICovCisJR1NNNDhfQ0FVU0VfTE9DX0lOTl9ORVQJCT0gMHgwNywKKwlHU000OF9DQVVTRV9MT0NfTkVUX0JFWU9ORAk9IDB4MGEsCit9OworCisvKiBTZWN0aW9uIDEwLjUuMi4zMSBSUiBDYXVzZSAvIFRhYmxlIDEwLjUuNzAgKi8KK2VudW0gZ3NtNDhfcnJfY2F1c2UgeworCUdTTTQ4X1JSX0NBVVNFX05PUk1BTAkJPSAweDAwLAorCUdTTTQ4X1JSX0NBVVNFX0FCTk9STUFMX1VOU1BFQwk9IDB4MDEsCisJR1NNNDhfUlJfQ0FVU0VfQUJOT1JNQUxfVU5BQ0NUCT0gMHgwMiwKKwlHU000OF9SUl9DQVVTRV9BQk5PUk1BTF9USU1FUgk9IDB4MDMsCisJR1NNNDhfUlJfQ0FVU0VfQUJOT1JNQUxfTk9BQ1QJPSAweDA0LAorCUdTTTQ4X1JSX0NBVVNFX1BSRU1QVElWRV9SRUwJPSAweDA1LAorCUdTTTQ4X1JSX0NBVVNFX0hORE9WRVJfSU1QCT0gMHgwNiwKKwlHU000OF9SUl9DQVVTRV9DSEFOX01PREVfVU5BQ0NUCT0gMHgwNywKKwlHU000OF9SUl9DQVVTRV9GUkVRX05PVF9JTVBMCT0gMHgwOCwKKwlHU000OF9SUl9DQVVTRV9DQUxMX0NMRUFSRUQJPSAweDQxLAorCUdTTTQ4X1JSX0NBVVNFX1NFTUFOVF9JTkNPUlIJPSAweDVmLAorCUdTTTQ4X1JSX0NBVVNFX0lOVkFMSURfTUFORF9JTkYgPSAweDYwLAorCUdTTTQ4X1JSX0NBVVNFX01TR19UWVBFX04JPSAweDYxLAorCUdTTTQ4X1JSX0NBVVNFX01TR19UWVBFX05fQ09NUEFUPSAweDYyLAorCUdTTTQ4X1JSX0NBVVNFX0NPTkRfSUVfRVJST1IJPSAweDY0LAorCUdTTTQ4X1JSX0NBVVNFX05PX0NFTExfQUxMT0NfQQk9IDB4NjUsCisJR1NNNDhfUlJfQ0FVU0VfUFJPVF9FUlJPUl9VTlNQQyA9IDB4NmYsCit9OworCisvKiBTZWN0aW9uIDEwLjUuNC4xMSBDQyBDYXVzZSAvIFRhYmxlIDEwLjUuMTIzICovCitlbnVtIGdzbTQ4X2NjX2NhdXNlIHsKKwlHU000OF9DQ19DQVVTRV9VTkFTU0lHTkVEX05SCT0gMSwKKwlHU000OF9DQ19DQVVTRV9OT19ST1VURQkJPSAzLAorCUdTTTQ4X0NDX0NBVVNFX0NIQU5fVU5BQ0NFUFQJPSA2LAorCUdTTTQ4X0NDX0NBVVNFX09QX0RFVF9CQVJSSU5HCT0gOCwKKwlHU000OF9DQ19DQVVTRV9OT1JNX0NBTExfQ0xFQVIJPSAxNiwKKwlHU000OF9DQ19DQVVTRV9VU0VSX0JVU1kJPSAxNywKKwlHU000OF9DQ19DQVVTRV9VU0VSX05PVFJFU1BPTkQJPSAxOCwKKwlHU000OF9DQ19DQVVTRV9VU0VSX0FMRVJUSU5HX05BCT0gMTksCisJR1NNNDhfQ0NfQ0FVU0VfQ0FMTF9SRUpFQ1RFRAk9IDIxLAorCUdTTTQ4X0NDX0NBVVNFX05VTUJFUl9DSEFOR0VECT0gMjIsCisJR1NNNDhfQ0NfQ0FVU0VfUFJFX0VNUFRJT04JPSAyNSwKKwlHU000OF9DQ19DQVVTRV9OT05TRV9VU0VSX0NMUgk9IDI2LAorCUdTTTQ4X0NDX0NBVVNFX0RFU1RfT09PCQk9IDI3LAorCUdTTTQ4X0NDX0NBVVNFX0lOVl9OUl9GT1JNQVQJPSAyOCwKKwlHU000OF9DQ19DQVVTRV9GQUNJTElUWV9SRUoJPSAyOSwKKwlHU000OF9DQ19DQVVTRV9SRVNQX1NUQVRVU19JTlEJPSAzMCwKKwlHU000OF9DQ19DQVVTRV9OT1JNQUxfVU5TUEVDCT0gMzEsCisJR1NNNDhfQ0NfQ0FVU0VfTk9fQ0lSQ1VJVF9DSEFOCT0gMzQsCisJR1NNNDhfQ0NfQ0FVU0VfTkVUV09SS19PT08JPSAzOCwKKwlHU000OF9DQ19DQVVTRV9URU1QX0ZBSUxVUkUJPSA0MSwKKwlHU000OF9DQ19DQVVTRV9TV0lUQ0hfQ09ORwk9IDQyLAorCUdTTTQ4X0NDX0NBVVNFX0FDQ19JTkZfRElTQ0FSRAk9IDQzLAorCUdTTTQ4X0NDX0NBVVNFX1JFUV9DSEFOX1VOQVZBSUwJPSA0NCwKKwlHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMCT0gNDcsCisJR1NNNDhfQ0NfQ0FVU0VfUU9TX1VOQVZBSUwJPSA0OSwKKwlHU000OF9DQ19DQVVTRV9SRVFfRkFDX05PVF9TVUJTQz0gNTAsCisJR1NNNDhfQ0NfQ0FVU0VfSU5DX0JBUlJFRF9DVUcJPSA1NSwKKwlHU000OF9DQ19DQVVTRV9CRUFSRVJfQ0FQX1VOQVVUSD0gNTcsCisJR1NNNDhfQ0NfQ0FVU0VfQkVBUkVSX0NBX1VOQVZBSUw9IDU4LAorCUdTTTQ4X0NDX0NBVVNFX1NFUlZfT1BUX1VOQVZBSUwJPSA2MywKKwlHU000OF9DQ19DQVVTRV9CRUFSRVJTRVJWX1VOSU1QTD0gNjUsCisJR1NNNDhfQ0NfQ0FVU0VfQUNNX0dFX0FDTV9NQVgJPSA2OCwKKwlHU000OF9DQ19DQVVTRV9SRVFfRkFDX05PVElNUEwJPSA2OSwKKwlHU000OF9DQ19DQVVTRV9SRVNUUl9CQ0FQX0FWQUlMCT0gNzAsCisJR1NNNDhfQ0NfQ0FVU0VfU0VSVl9PUFRfVU5JTVBMCT0gNzksCisJR1NNNDhfQ0NfQ0FVU0VfSU5WQUxfVFJBTlNfSUQJPSA4MSwKKwlHU000OF9DQ19DQVVTRV9VU0VSX05PVF9JTl9DVUcJPSA4NywKKwlHU000OF9DQ19DQVVTRV9JTkNPTVBBVF9ERVNUCT0gODgsCisJR1NNNDhfQ0NfQ0FVU0VfSU5WQUxfVFJBTlNfTkVUCT0gOTEsCisJR1NNNDhfQ0NfQ0FVU0VfU0VNQU5USUNfSU5DT1JSCT0gOTUsCisJR1NNNDhfQ0NfQ0FVU0VfSU5WQUxfTUFORF9JTkYJPSA5NiwKKwlHU000OF9DQ19DQVVTRV9NU0dUWVBFX05PVEVYSVNUCT0gOTcsCisJR1NNNDhfQ0NfQ0FVU0VfTVNHVFlQRV9JTkNPTVBBVAk9IDk4LAorCUdTTTQ4X0NDX0NBVVNFX0lFX05PVEVYSVNUCT0gOTksCisJR1NNNDhfQ0NfQ0FVU0VfQ09ORF9JRV9FUlIJPSAxMDAsCisJR1NNNDhfQ0NfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURQk9IDEwMSwKKwlHU000OF9DQ19DQVVTRV9SRUNPVkVSWV9USU1FUgk9IDEwMiwKKwlHU000OF9DQ19DQVVTRV9QUk9UT19FUlIJPSAxMTEsCisJR1NNNDhfQ0NfQ0FVU0VfSU5URVJXT1JLSU5HCT0gMTI3LAorfTsKKworLyogQW5uZXggRywgR1NNIHNwZWNpZmljIGNhdXNlIHZhbHVlcyBmb3IgbW9iaWxpdHkgbWFuYWdlbWVudCAqLworZW51bSBnc200OF9yZWplY3RfdmFsdWUgeworCUdTTTQ4X1JFSkVDVF9JTVNJX1VOS05PV05fSU5fSExSCT0gMiwKKwlHU000OF9SRUpFQ1RfSUxMRUdBTF9NUwkJCT0gMywKKwlHU000OF9SRUpFQ1RfSU1TSV9VTktOT1dOX0lOX1ZMUgk9IDQsCisJR1NNNDhfUkVKRUNUX0lNRUlfTk9UX0FDQ0VQVEVECQk9IDUsCisJR1NNNDhfUkVKRUNUX0lMTEVHQUxfTUUJCQk9IDYsCisJR1NNNDhfUkVKRUNUX1BMTU5fTk9UX0FMTE9XRUQJCT0gMTEsCisJR1NNNDhfUkVKRUNUX0xPQ19OT1RfQUxMT1dFRAkJPSAxMiwKKwlHU000OF9SRUpFQ1RfUk9BTUlOR19OT1RfQUxMT1dFRAk9IDEzLAorCUdTTTQ4X1JFSkVDVF9ORVRXT1JLX0ZBSUxVUkUJCT0gMTcsCisJR1NNNDhfUkVKRUNUX0NPTkdFU1RJT04JCQk9IDIyLAorCUdTTTQ4X1JFSkVDVF9TUlZfT1BUX05PVF9TVVBQT1JURUQJPSAzMiwKKwlHU000OF9SRUpFQ1RfUlFEX1NSVl9PUFRfTk9UX1NVUFBPUlRFRAk9IDMzLAorCUdTTTQ4X1JFSkVDVF9TUlZfT1BUX1RNUF9PVVRfT0ZfT1JERVIJPSAzNCwKKwlHU000OF9SRUpFQ1RfQ0FMTF9DQU5fTk9UX0JFX0lERU5USUZJRUQJPSAzOCwKKwlHU000OF9SRUpFQ1RfSU5DT1JSRUNUX01FU1NBR0UJCT0gOTUsCisJR1NNNDhfUkVKRUNUX0lOVkFMSURfTUFOREFOVE9SWV9JTkYJPSA5NiwKKwlHU000OF9SRUpFQ1RfTVNHX1RZUEVfTk9UX0lNUExFTUVOVEVECT0gOTcsCisJR1NNNDhfUkVKRUNUX01TR19UWVBFX05PVF9DT01QQVRJQkxFCT0gOTgsCisJR1NNNDhfUkVKRUNUX0lORl9FTEVNRV9OT1RfSU1QTEVNRU5URUQJPSA5OSwKKwlHU000OF9SRUpFQ1RfQ09ORFRJT05BTF9JRV9FUlJPUgk9IDEwMCwKKwlHU000OF9SRUpFQ1RfTVNHX05PVF9DT01QQVRJQkxFCQk9IDEwMSwKKwlHU000OF9SRUpFQ1RfUFJPVE9DT0xfRVJST1IJCT0gMTExLAorCisJLyogYWNjb3JkaW5nIHRvIEcuNiBBZGRpdGlvbmFsIGNhdXNlIGNvZGVzIGZvciBHTU0gKi8KKwlHU000OF9SRUpFQ1RfR1BSU19OT1RfQUxMT1dFRAkJPSA3LAorCUdTTTQ4X1JFSkVDVF9TRVJWSUNFU19OT1RfQUxMT1dFRAk9IDgsCisJR1NNNDhfUkVKRUNUX01TX0lERU5USVRZX05PVF9ERVJWSVZBQkxFID0gOSwKKwlHU000OF9SRUpFQ1RfSU1QTElDSVRMWV9ERVRBQ0hFRAk9IDEwLAorCUdTTTQ4X1JFSkVDVF9HUFJTX05PVF9BTExPV0VEX0lOX1BMTU4JPSAxNCwKKwlHU000OF9SRUpFQ1RfTVNDX1RNUF9OT1RfUkVBQ0hBQkxFCT0gMTYsCit9OworCitlbnVtIGNocmVxX3R5cGUgeworCUNIUkVRX1RfRU1FUkdfQ0FMTCwKKwlDSFJFUV9UX0NBTExfUkVFU1RfVENIX0YsCisJQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9ILAorCUNIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF9EQkwsCisJQ0hSRVFfVF9TRENDSCwKKwlDSFJFUV9UX1RDSF9GLAorCUNIUkVRX1RfVk9JQ0VfQ0FMTF9UQ0hfSCwKKwlDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSCwKKwlDSFJFUV9UX0xPQ0FUSU9OX1VQRCwKKwlDSFJFUV9UX1BBR19SX0FOWV9ORUNJMCwKKwlDSFJFUV9UX1BBR19SX0FOWV9ORUNJMSwKKwlDSFJFUV9UX1BBR19SX1RDSF9GLAorCUNIUkVRX1RfUEFHX1JfVENIX0ZILAorCUNIUkVRX1RfTE1VLAorCUNIUkVRX1RfUkVTRVJWRURfU0RDQ0gsCisJQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkUsCit9OworCisvKiBDaGFwdGVyIDExLjMgKi8KKyNkZWZpbmUgR1NNNDhfVDMwMQkxODAsIDAKKyNkZWZpbmUgR1NNNDhfVDMwMwkzMCwgMAorI2RlZmluZSBHU000OF9UMzA1CTMwLCAwCisjZGVmaW5lIEdTTTQ4X1QzMDYJMzAsIDAKKyNkZWZpbmUgR1NNNDhfVDMwOAkxMCwgMAorI2RlZmluZSBHU000OF9UMzEwCTE4MCwgMAorI2RlZmluZSBHU000OF9UMzEzCTMwLCAwCisjZGVmaW5lIEdTTTQ4X1QzMjMJMzAsIDAKKyNkZWZpbmUgR1NNNDhfVDMzMQkzMCwgMAorI2RlZmluZSBHU000OF9UMzMzCTMwLCAwCisjZGVmaW5lIEdTTTQ4X1QzMzQJMjUsIDAgLyogbWluIDE1ICovCisjZGVmaW5lIEdTTTQ4X1QzMzgJMzAsIDAKKworLyogQ2hhcHRlciA1LjEuMi4yICovCisjZGVmaW5lCUdTTV9DU1RBVEVfTlVMTAkJCTAKKyNkZWZpbmUJR1NNX0NTVEFURV9JTklUSUFURUQJCTEKKyNkZWZpbmUJR1NNX0NTVEFURV9NTV9DT05ORUNUSU9OX1BFTkQJMiAvKiBzZWUgMTAuNS40LjYgKi8KKyNkZWZpbmUJR1NNX0NTVEFURV9NT19DQUxMX1BST0MJCTMKKyNkZWZpbmUJR1NNX0NTVEFURV9DQUxMX0RFTElWRVJFRAk0CisjZGVmaW5lCUdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UCQk2CisjZGVmaW5lCUdTTV9DU1RBVEVfQ0FMTF9SRUNFSVZFRAk3CisjZGVmaW5lCUdTTV9DU1RBVEVfQ09OTkVDVF9SRVFVRVNUCTgKKyNkZWZpbmUJR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORgk5CisjZGVmaW5lCUdTTV9DU1RBVEVfQUNUSVZFCQkxMAorI2RlZmluZQlHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfUkVRCTEyCisjZGVmaW5lCUdTTV9DU1RBVEVfRElTQ09OTkVDVF9JTkQJMTIKKyNkZWZpbmUJR1NNX0NTVEFURV9SRUxFQVNFX1JFUQkJMTkKKyNkZWZpbmUJR1NNX0NTVEFURV9NT19PUklHX01PRElGWQkyNgorI2RlZmluZQlHU01fQ1NUQVRFX01PX1RFUk1fTU9ESUZZCTI3CisjZGVmaW5lCUdTTV9DU1RBVEVfQ09OTkVDVF9JTkQJCTI4CisKKyNkZWZpbmUgU0JJVChhKSAoMSA8PCBhKQorI2RlZmluZSBBTExfU1RBVEVTIDB4ZmZmZmZmZmYKKworLyogVGFibGUgMTAuNS4zLzNHUFAgVFMgMDQuMDg6IExvY2F0aW9uIEFyZWEgSWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBHU01fTEFDX1JFU0VSVkVEX0RFVEFDSEVEICAgICAgIDB4MAorI2RlZmluZSBHU01fTEFDX1JFU0VSVkVEX0FMTF9CVFMgICAgICAgIDB4ZmZmZQorCisvKiBHU00gMDQuMDggQmVhcmVyIENhcGFiaWxpdHk6IEluZm9ybWF0aW9uIFRyYW5zZmVyIENhcGFiaWxpdHkgKi8KK2VudW0gZ3NtNDhfYmNhcF9pdGNhcCB7CisJR1NNNDhfQkNBUF9JVENBUF9TUEVFQ0gJCT0gMCwKKwlHU000OF9CQ0FQX0lUQ0FQX1VOUl9ESUdfSU5GCT0gMSwKKwlHU000OF9CQ0FQX0lUQ0FQXzNrMV9BVURJTwk9IDIsCisJR1NNNDhfQkNBUF9JVENBUF9GQVhfRzMJCT0gMywKKwlHU000OF9CQ0FQX0lUQ0FQX09USEVSCQk9IDUsCisJR1NNNDhfQkNBUF9JVENBUF9SRVNFUlZFRAk9IDcsCit9OworCisvKiBHU00gMDQuMDggQmVhcmVyIENhcGFiaWxpdHk6IFRyYW5zZmVyIE1vZGUgKi8KK2VudW0gZ3NtNDhfYmNhcF90bW9kIHsKKwlHU000OF9CQ0FQX1RNT0RfQ0lSQ1VJVAkJPSAwLAorCUdTTTQ4X0JDQVBfVE1PRF9QQUNLRVQJCT0gMSwKK307CisKKy8qIEdTTSAwNC4wOCBCZWFyZXIgQ2FwYWJpbGl0eTogQ29kaW5nIFN0YW5kYXJkICovCitlbnVtIGdzbTQ4X2JjYXBfY29kaW5nIHsKKwlHU000OF9CQ0FQX0NPRElOR19HU01fU1RECT0gMCwKK307CisKKy8qIEdTTSAwNC4wOCBCZWFyZXIgQ2FwYWJpbGl0eTogUmFkaW8gQ2hhbm5lbCBSZXF1aXJlbWVudHMgKi8KK2VudW0gZ3NtNDhfYmNhcF9ycnEgeworCUdTTTQ4X0JDQVBfUlJRX0ZSX09OTFkJPSAxLAorCUdTTTQ4X0JDQVBfUlJRX0RVQUxfSFIJPSAyLAorCUdTTTQ4X0JDQVBfUlJRX0RVQUxfRlIJPSAzLAorfTsKKworI2RlZmluZSBHU000OF9UTVNJX0xFTgk1CisjZGVmaW5lIEdTTTQ4X01JRF9UTVNJX0xFTgkoR1NNNDhfVE1TSV9MRU4gKyAyKQorI2RlZmluZSBHU000OF9NSV9TSVpFIDMyCisKKy8qIENoYXB0ZXIgMTAuNC40LjE1ICovCitzdHJ1Y3QgZ3NtNDhfcmFfaWQgeworCXVpbnQ4X3QgZGlnaXRzWzNdOwkvKiBNQ0MgKyBNTkMgQkNEIGRpZ2l0cyAqLworCXVpbnQxNl90IGxhYzsJCS8qIExvY2F0aW9uIEFyZWEgQ29kZSAqLworCXVpbnQ4X3QgcmFjOwkJLyogUm91dGluZyBBcmVhIENvZGUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKworI2VuZGlmIC8qIFBST1RPX0dTTV8wNF8wOF9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmEyYjE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaApAQCAtMCwwICsxLDE4OCBAQAorI2lmbmRlZiBQUk9UT19HU01fMDRfMTFfSAorI2RlZmluZSBQUk9UT19HU01fMDRfMTFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIEdTTSBUUyAwNC4xMSAgZGVmaW5pdGlvbnMgKi8KKworLyogQ2hhcHRlciA1LjIuMzogU01DLUNTIHN0YXRlcyBhdCB0aGUgbmV0d29yayBzaWRlICovCitlbnVtIGdzbTQxMV9jcF9zdGF0ZSB7CisJR1NNNDExX0NQU19JRExFIAkJPSAwLAorCUdTTTQxMV9DUFNfTU1fQ09OTl9QRU5ESU5HCT0gMSwJLyogb25seSBNVCAhICovCisJR1NNNDExX0NQU19XQUlUX0NQX0FDSwkJPSAyLAorCUdTTTQxMV9DUFNfTU1fRVNUQUJMSVNIRUQJPSAzLAorfTsKKworLyogQ2hhcHRlciA2LjIuMjogU01SIHN0YXRlcyBhdCB0aGUgbmV0d29yayBzaWRlICovCitlbnVtIGdzbTQxMV9ycF9zdGF0ZSB7CisJR1NNNDExX1JQU19JRExFCQkJPSAwLAorCUdTTTQxMV9SUFNfV0FJVF9GT1JfUlBfQUNLCT0gMSwKKwlHU000MTFfUlBTX1dBSVRfVE9fVFhfUlBfQUNLCT0gMywKK307CisKKy8qIENoYXB0ZXIgOC4xLjIgKHJlZmVycyB0byBHU00gMDQuMDcgQ2hhcHRlciAxMS4yLjMuMS4xICovCisjZGVmaW5lIEdTTTQxMV9QRElTQ19TTVMJMHgwOQorCisvKiBDaGFwdGVyIDguMS4zICovCisjZGVmaW5lIEdTTTQxMV9NVF9DUF9EQVRBCTB4MDEKKyNkZWZpbmUgR1NNNDExX01UX0NQX0FDSwkweDA0CisjZGVmaW5lIEdTTTQxMV9NVF9DUF9FUlJPUgkweDEwCisKK2VudW0gZ3NtNDExX2NwX2llIHsKKwlHU000MTFfQ1BfSUVfVVNFUl9EQVRBCQk9IDB4MDEsCS8qIDguMS40LjEgKi8KKwlHU000MTFfQ1BfSUVfQ0FVU0UJCT0gMHgwMiwJLyogOC4xLjQuMi4gKi8KK307CisKKy8qIFNlY3Rpb24gOC4xLjQuMiAvIFRhYmxlIDguMiAqLworZW51bSBnc200MTFfY3BfY2F1c2UgeworCUdTTTQxMV9DUF9DQVVTRV9ORVRfRkFJTAk9IDE3LAorCUdTTTQxMV9DUF9DQVVTRV9DT05HRVNUSU9OCT0gMjIsCisJR1NNNDExX0NQX0NBVVNFX0lOVl9UUkFOU19JRAk9IDgxLAorCUdTTTQxMV9DUF9DQVVTRV9TRU1BTlRfSU5DX01TRwk9IDk1LAorCUdTTTQxMV9DUF9DQVVTRV9JTlZfTUFORF9JTkYJPSA5NiwKKwlHU000MTFfQ1BfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVD0gOTcsCisJR1NNNDExX0NQX0NBVVNFX01TR19JTkNPTVBfU1RBVEU9IDk4LAorCUdTTTQxMV9DUF9DQVVTRV9JRV9OT1RFWElTVAk9IDk5LAorCUdTTTQxMV9DUF9DQVVTRV9QUk9UT0NPTF9FUlIJPSAxMTEsCit9OworCisvKiBDaGFwdGVyIDguMi4yICovCisjZGVmaW5lIEdTTTQxMV9NVF9SUF9EQVRBX01PCTB4MDAKKyNkZWZpbmUgR1NNNDExX01UX1JQX0RBVEFfTVQJMHgwMQorI2RlZmluZSBHU000MTFfTVRfUlBfQUNLX01PCTB4MDIKKyNkZWZpbmUgR1NNNDExX01UX1JQX0FDS19NVAkweDAzCisjZGVmaW5lIEdTTTQxMV9NVF9SUF9FUlJPUl9NTwkweDA0CisjZGVmaW5lIEdTTTQxMV9NVF9SUF9FUlJPUl9NVAkweDA1CisjZGVmaW5lIEdTTTQxMV9NVF9SUF9TTU1BX01PCTB4MDYKKworZW51bSBnc200MTFfcnBfaWUgeworCUdTTTQxMV9JRV9SUF9VU0VSX0RBVEEJCT0gMHg0MSwJLyogOC4yLjUuMyAqLworCUdTTTQxMV9JRV9SUF9DQVVTRQkJPSAweDQyLAkvKiA4LjIuNS40ICovCit9OworCisvKiBDaGFwdGVyIDguMi41LjQgVGFibGUgOC40ICovCitlbnVtIGdzbTQxMV9ycF9jYXVzZSB7CisJLyogdmFsaWQgb25seSBmb3IgTU8gKi8KKwlHU000MTFfUlBfQ0FVU0VfTU9fTlVNX1VOQVNTSUdORUQJPSAxLAorCUdTTTQxMV9SUF9DQVVTRV9NT19PUF9ERVRfQkFSUgkJPSA4LAorCUdTTTQxMV9SUF9DQVVTRV9NT19DQUxMX0JBUlJFRAkJPSAxMCwKKwlHU000MTFfUlBfQ0FVU0VfTU9fU01TX1JFSkVDVEVECQk9IDIxLAorCUdTTTQxMV9SUF9DQVVTRV9NT19ERVNUX09VVF9PRl9PUkRFUgk9IDI3LAorCUdTTTQxMV9SUF9DQVVTRV9NT19VTklERU5USUZJRURfU1VCU0NSCT0gMjgsCisJR1NNNDExX1JQX0NBVVNFX01PX0ZBQ0lMSVRZX1JFSgkJPSAyOSwKKwlHU000MTFfUlBfQ0FVU0VfTU9fVU5LTk9XTl9TVUJTQ1IJPSAzMCwKKwlHU000MTFfUlBfQ0FVU0VfTU9fTkVUX09VVF9PRl9PUkRFUgk9IDM4LAorCUdTTTQxMV9SUF9DQVVTRV9NT19URU1QX0ZBSUwJCT0gNDEsCisJR1NNNDExX1JQX0NBVVNFX01PX0NPTkdFU1RJT04JCT0gNDIsCisJR1NNNDExX1JQX0NBVVNFX01PX1JFU19VTkFWQUlMCQk9IDQ3LAorCUdTTTQxMV9SUF9DQVVTRV9NT19SRVFfRkFDX05PVFNVQlNDUgk9IDUwLAorCUdTTTQxMV9SUF9DQVVTRV9NT19SRVFfRkFDX05PVElNUEwJPSA2OSwKKwlHU000MTFfUlBfQ0FVU0VfTU9fSU5URVJXT1JLSU5HCQk9IDEyNywKKwkvKiB2YWxpZCBvbmx5IGZvciBNVCAqLworCUdTTTQxMV9SUF9DQVVTRV9NVF9NRU1fRVhDRUVERUQJCT0gMjIsCisJLyogdmFsaWQgZm9yIGJvdGggZGlyZWN0aW9ucyAqLworCUdTTTQxMV9SUF9DQVVTRV9JTlZfVFJBTlNfUkVGCQk9IDgxLAorCUdTTTQxMV9SUF9DQVVTRV9TRU1BTlRfSU5DX01TRwkJPSA5NSwKKwlHU000MTFfUlBfQ0FVU0VfSU5WX01BTkRfSU5GCQk9IDk2LAorCUdTTTQxMV9SUF9DQVVTRV9NU0dUWVBFX05PVEVYSVNUCT0gOTcsCisJR1NNNDExX1JQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUJPSA5OCwKKwlHU000MTFfUlBfQ0FVU0VfSUVfTk9URVhJU1QJCT0gOTksCisJR1NNNDExX1JQX0NBVVNFX1BST1RPQ09MX0VSUgkJPSAxMTEsCit9OworCisvKiBDaGFwdGVyIDEwOiBUaW1lcnMgKi8KKyNkZWZpbmUgR1NNNDExX1RNUl9UUjFNCQk0MCwgMAkvKiAzNSA8IHggPCA0NSBzZWNvbmRzICovCisjZGVmaW5lIEdTTTQxMV9UTVJfVFJBTQkJMzAsIDAJLyogMjUgPCB4IDwgMzUgc2Vjb25kcyAqLworI2RlZmluZSBHU000MTFfVE1SX1RSMk0JCTE1LCAwCS8qIDEyIDwgeCA8IDIwIHNlY29uZHMgKi8KKworI2RlZmluZSBHU000MTFfVE1SX1RDMUEJCTMwLCAwCisKKy8qIENoYXB0ZXIgOC4yLjEgKi8KK3N0cnVjdCBnc200MTFfcnBfaGRyIHsKKwl1aW50OF90IGxlbjsKKwl1aW50OF90IG1zZ190eXBlOworCXVpbnQ4X3QgbXNnX3JlZjsKKwl1aW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogb3VyIG93biBlbnVtLCBub3QgcmVsYXRlZCB0byBvbi1haXIgcHJvdG9jb2wgKi8KK2VudW0gc21zX2FscGhhYmV0IHsKKwlEQ1NfTk9ORSwKKwlEQ1NfN0JJVF9ERUZBVUxULAorCURDU19VQ1MyLAorCURDU184QklUX0RBVEEsCit9OworCisvKiBHU00gMDMuNDAgLyBDaGFwdGVyIDkuMi4zLjE6IFRQLU1lc3NhZ2UtVHlwZS1JbmRpY2F0b3IgKi8KKyNkZWZpbmUgR1NNMzQwX1NNU19ERUxJVkVSX1NDMk1TCTB4MDAKKyNkZWZpbmUgR1NNMzQwX1NNU19ERUxJVkVSX1JFUF9NUzJTQwkweDAwCisjZGVmaW5lIEdTTTM0MF9TTVNfU1RBVFVTX1JFUF9TQzJNUwkweDAyCisjZGVmaW5lIEdTTTM0MF9TTVNfQ09NTUFORF9NUzJTQwkweDAyCisjZGVmaW5lIEdTTTM0MF9TTVNfU1VCTUlUX01TMlNDCQkweDAxCisjZGVmaW5lIEdTTTM0MF9TTVNfU1VCTUlUX1JFUF9TQzJNUwkweDAxCisjZGVmaW5lIEdTTTM0MF9TTVNfUkVTU0VSVkVECQkweDAzCisKKy8qIEdTTSAwMy40MCAvIENoYXB0ZXIgOS4yLjMuMjogVFAtTW9yZS1NZXNzYWdlcy10by1TZW5kICovCisjZGVmaW5lIEdTTTM0MF9UUF9NTVNfTU9SRQkJMAorI2RlZmluZSBHU00zNDBfVFBfTU1TX05PX01PUkUJCTEKKworLyogR1NNIDAzLjQwIC8gQ2hhcHRlciA5LjIuMy4zOiBUUC1WYWxpZGl0eS1QZXJpb2QtRm9ybWF0ICovCisjZGVmaW5lIEdTTTM0MF9UUF9WUEZfTk9ORQkJMAorI2RlZmluZSBHU00zNDBfVFBfVlBGX1JFTEFUSVZFCQkyCisjZGVmaW5lIEdTTTM0MF9UUF9WUEZfRU5IQU5DRUQJCTEKKyNkZWZpbmUgR1NNMzQwX1RQX1ZQRl9BQlNPTFVURQkJMworCisvKiBHU00gMDMuNDAgLyBDaGFwdGVyIDkuMi4zLjQ6IFRQLVN0YXR1cy1SZXBvcnQtSW5kaWNhdGlvbiAqLworI2RlZmluZSBHU00zNDBfVFBfU1JJX05PTkUJCTAKKyNkZWZpbmUgR1NNMzQwX1RQX1NSSV9QUkVTRU5UCQkxCisKKy8qIEdTTSAwMy40MCAvIENoYXB0ZXIgOS4yLjMuNTogVFAtU3RhdHVzLVJlcG9ydC1SZXF1ZXN0ICovCisjZGVmaW5lIEdTTTM0MF9UUF9TUlJfTk9ORQkJMAorI2RlZmluZSBHU00zNDBfVFBfU1JSX1JFUVVFU1RFRAkJMQorCisvKiBHU00gMDMuNDAgLyBDaGFwdGVyIDkuMi4zLjk6IFRQLVByb3RvY29sLUlkZW50aWZpZXIgKi8KKy8qIHRlbGVtYXRpYyBpbnRlcndvcmtpbmcgKDAwMSBvciAxMTEgaW4gYml0cyA3LTUpICovCisjZGVmaW5lIEdTTTM0MF9UUF9QSURfSU1QTElDSVQJCTB4MDAKKyNkZWZpbmUgR1NNMzQwX1RQX1BJRF9URUxFWAkJMHgwMQorI2RlZmluZSBHU00zNDBfVFBfUElEX0ZBWF9HMwkJMHgwMgorI2RlZmluZSBHU00zNDBfVFBfUElEX0ZBWF9HNAkJMHgwMworI2RlZmluZSBHU00zNDBfVFBfUElEX1ZPSUNFCQkweDA0CisjZGVmaW5lIEdTTTQzMF9UUF9QSURfRVJNRVMJCTB4MDUKKyNkZWZpbmUgR1NNNDMwX1RQX1BJRF9OQVRJT05BTF9QQUdJTkcJMHgwNgorI2RlZmluZSBHU000MzBfVFBfUElEX1ZJREVPVEVYCQkweDA3CisjZGVmaW5lIEdTTTQzMF9UUF9QSURfVEVMRVRFWF9VTlNQRUMJMHgwOAorI2RlZmluZSBHU000MzBfVFBfUElEX1RFTEVURVhfUFNQRE4JMHgwOQorI2RlZmluZSBHU000MzBfVFBfUElEX1RFTEVURVhfQ1NQRE4JMHgwYQorI2RlZmluZSBHU000MzBfVFBfUElEX1RFTEVURVhfUFNUTgkweDBiCisjZGVmaW5lIEdTTTQzMF9UUF9QSURfVEVMRVRFWF9JU0ROCTB4MGMKKyNkZWZpbmUgR1NNNDMwX1RQX1BJRF9URUxFVEVYX1VDSQkweDBkCisjZGVmaW5lIEdTTTQzMF9UUF9QSURfTVNHX0hBTkRMSU5HCTB4MTAKKyNkZWZpbmUgR1NNNDMwX1RQX1BJRF9NU0dfWDQwMAkJMHgxMQorI2RlZmluZSBHU000MzBfVFBfUElEX0VNQUlMCQkweDEyCisjZGVmaW5lIEdTTTQzMF9UUF9QSURfR1NNX01TCQkweDFmCisvKiBpZiBiaXQgNyA9IDAgYW5kIGJpdCA2ID0gMSAqLworI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzAJMAorI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzEJMQorI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzIJMgorI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzMJMworI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzQJNAorI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzUJNQorI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzYJNgorI2RlZmluZSBHU000MzBfVFBfUElEX1NNU19UWVBFXzcJNworI2RlZmluZSBHU000MzBfVFBfUElEX1JFVFVSTl9DQUxMX01TRwkweDFmCisjZGVmaW5lIEdTTTQzMF9UUF9QSURfTUVfREFUQV9ETkxPQUQJMHgzZAorI2RlZmluZSBHU000MzBfVFBfUElEX01FX0RFX1BFUlNPTkFMCTB4M2UKKyNkZWZpbmUgR1NNNDMwX1RQX1BJRF9NRV9TSU1fRE5MT0FECTB4M2YKKworLyogR1NNIDAzLjM4IENoYXB0ZXIgNDogU01TIERhdGEgQ29kaW5nIFNjaGVtZSAqLworI2RlZmluZSBHU00zMzhfRENTXzAwXworCisjZGVmaW5lIEdTTTMzOF9EQ1NfMTExMF83QklUCQkoMCA8PCAyKQorI2RlZmluZSBHU00zMzhfRENTXzExMTFfN0JJVAkJKDAgPDwgMikKKyNkZWZpbmUgR1NNMzM4X0RDU18xMTExXzhCSVRfREFUQQkoMSA8PCAyKQorI2RlZmluZSBHU00zMzhfRENTXzExMTFfQ0xBU1MwCQkwCisjZGVmaW5lIEdTTTMzOF9EQ1NfMTExMV9DTEFTUzFfTUUJMQorI2RlZmluZSBHU00zMzhfRENTXzExMTFfQ0xBU1MyX1NJTQkyCisjZGVmaW5lIEdTTTMzOF9EQ1NfMTExMV9DTEFTUzNfVEUJMwkvKiBTZWUgVFMgMDcuMDUgKi8KKworI2VuZGlmIC8qIFBST1RPX0dTTV8wNF8xMV9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTVjOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApAQCAtMCwwICsxLDEyNiBAQAorI2lmbmRlZiBQUk9UT19HU01fMDRfODBfSAorI2RlZmluZSBQUk9UT19HU01fMDRfODBfSAorCisvKiBHU00gVFMgMDQuODAgIGRlZmluaXRpb25zIChTdXBwbGVtZW50YXJ5IFNlcnZpY2VzIFNwZWNpZmljYXRpb24sIEZvcm1hdHMgYW5kIENvZGluZykgKi8KKworLyogU2VjdGlvbiAzLjQgKi8KKyNkZWZpbmUgR1NNMDQ4MF9NVFlQRV9SRUxFQVNFX0NPTVBMRVRFCTB4MkEKKyNkZWZpbmUgR1NNMDQ4MF9NVFlQRV9GQUNJTElUWQkJCTB4M0EKKyNkZWZpbmUgR1NNMDQ4MF9NVFlQRV9SRUdJU1RFUgkJCTB4M0IKKworLyogU2VjdGlvbiAzLjUgKi8KKyNkZWZpbmUgR1NNMDQ4MF9JRV9GQUNJTElUWQkJCTB4MUMKKyNkZWZpbmUgR1NNMDQ4MF9JRV9TU19WRVJTSU9OCQkJMHg3RgorCisvKiBTZWN0aW9uIDMuNi4yICovCisjZGVmaW5lIEdTTTA0ODBfQ1RZUEVfSU5WT0tFCQkJMHhBMQorI2RlZmluZSBHU00wNDgwX0NUWVBFX1JFVFVSTl9SRVNVTFQJCTB4QTIKKyNkZWZpbmUgR1NNMDQ4MF9DVFlQRV9SRVRVUk5fRVJST1IJCTB4QTMKKyNkZWZpbmUgR1NNMDQ4MF9DVFlQRV9SRUpFQ1QJCQkweEE0CisKKy8qIFNlY3Rpb24gMy42LjMgKi8KKyNkZWZpbmUgR1NNMDQ4MF9DT01QSURUQUdfSU5WT0tFX0lECQkweDAyCisjZGVmaW5lIEdTTTA0ODBfQ09NUElEVEFHX0xJTktFRF9JRAkJMHg4MAorCisvKiBTZWN0aW9uIDMuNi40ICovCisjZGVmaW5lIEdTTTA0ODBfT1BFUkFUSU9OX0NPREUJCQkweDAyCisKKy8qIFNlY3Rpb24gMy42LjUgKi8KKyNkZWZpbmUgR1NNXzA0ODBfU0VRVUVOQ0VfVEFHCQkJMHgzMAorI2RlZmluZSBHU01fMDQ4MF9TRVRfVEFHCQkJMHgzMQorCisvKiBTZWN0aW9uIDMuNi42ICovCisjZGVmaW5lIEdTTV8wNDgwX0VSUk9SX0NPREVfVEFHCQkJMHgwMgorCisvKiBTZWN0aW9uIDMuNi43ICovCisvKiBUYWJsZSAzLjEzICovCisjZGVmaW5lIEdTTV8wNDgwX1BST0JMRU1fQ09ERV9UQUdfR0VORVJBTAkweDgwCisjZGVmaW5lIEdTTV8wNDgwX1BST0JMRU1fQ09ERV9UQUdfSU5WT0tFCTB4ODEKKyNkZWZpbmUgR1NNXzA0ODBfUFJPQkxFTV9DT0RFX1RBR19SRVRVUk5fUkVTVUxUCTB4ODIKKyNkZWZpbmUgR1NNXzA0ODBfUFJPQkxFTV9DT0RFX1RBR19SRVRVUk5fRVJST1IJMHg4MworCisvKiBUYWJsZSAzLjE0ICovCisjZGVmaW5lIEdTTV8wNDgwX0dFTl9QUk9CX0NPREVfVU5SRUNPR05JU0VECTB4MDAKKyNkZWZpbmUgR1NNXzA0ODBfR0VOX1BST0JfQ09ERV9NSVNUWVBFRAkJMHgwMQorI2RlZmluZSBHU01fMDQ4MF9HRU5fUFJPQl9DT0RFX0JBRF9TVFJVQ1RVUkUJMHgwMgorCisvKiBUYWJsZSAzLjE1ICovCisjZGVmaW5lIEdTTV8wNDgwX0lOVk9LRV9QUk9CX0NPREVfRFVQTElDQVRFX0lOVk9LRV9JRAkJMHgwMAorI2RlZmluZSBHU01fMDQ4MF9JTlZPS0VfUFJPQl9DT0RFX1VOUkVDT0dOSVNFRF9PUEVSQVRJT04JMHgwMQorI2RlZmluZSBHU01fMDQ4MF9JTlZPS0VfUFJPQl9DT0RFX01JU1RZUEVEX1BBUkFNRVRFUgkJMHgwMgorI2RlZmluZSBHU01fMDQ4MF9JTlZPS0VfUFJPQl9DT0RFX1JFU09VUkNFX0xJTUlUQVRJT04JCTB4MDMKKyNkZWZpbmUgR1NNXzA0ODBfSU5WT0tFX1BST0JfQ09ERV9JTklUSUFUSU5HX1JFTEVBU0UJCTB4MDQKKyNkZWZpbmUgR1NNXzA0ODBfSU5WT0tFX1BST0JfQ09ERV9VTlJFQ09HTklTRURfTElOS0VEX0lECTB4MDUKKyNkZWZpbmUgR1NNXzA0ODBfSU5WT0tFX1BST0JfQ09ERV9VTkVYUEVDVEVEX0xJTktFRF9SRVNQT05TRQkweDA2CisjZGVmaW5lIEdTTV8wNDgwX0lOVk9LRV9QUk9CX0NPREVfVU5FWFBFQ1RFRF9MSU5LRURfT1BFUkFUSU9OCTB4MDcKKworLyogVGFibGUgMy4xNiAqLworI2RlZmluZSBHU01fMDQ4MF9SRVNVTFRfUFJPQl9DT0RFX1VOUkVDT0dOSVNFRF9JTlZPS0VfSUQJMHgwMAorI2RlZmluZSBHU01fMDQ4MF9SRVNVTFRfUFJPQl9DT0RFX1JFVFVSTl9SRVNVTFRfVU5FWFBFQ1RFRAkweDAxCisjZGVmaW5lIEdTTV8wNDgwX1JFU1VMVF9QUk9CX0NPREVfTUlTVFlQRURfUEFSQU1FVEVSCQkweDAyCisKKy8qIFRhYmxlIDMuMTcgKi8KKyNkZWZpbmUgR1NNXzA0ODBfRVJST1JfUFJPQl9DT0RFX1VOUkVDT0dOSVNFRF9JTlZPS0VfSUQJCTB4MDAKKyNkZWZpbmUgR1NNXzA0ODBfRVJST1JfUFJPQl9DT0RFX1JFVFVSTl9FUlJPUl9VTkVYUEVDVEVECTB4MDEKKyNkZWZpbmUgR1NNXzA0ODBfRVJST1JfUFJPQl9DT0RFX1VOUkVDT0dOSVNFRF9FUlJPUgkJMHgwMgorI2RlZmluZSBHU01fMDQ4MF9FUlJPUl9QUk9CX0NPREVfVU5FWFBFQ1RFRF9FUlJPUgkJMHgwMworI2RlZmluZSBHU01fMDQ4MF9FUlJPUl9QUk9CX0NPREVfTUlTVFlQRURfUEFSQU1FVEVSCQkweDA0CisKKy8qIFNlY3Rpb24gNC41ICovCisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9SRUdJU1RFUl9TUwkJMHgwQQorI2RlZmluZSBHU00wNDgwX09QX0NPREVfRVJBU0VfU1MJCTB4MEIKKyNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX0FDVElWQVRFX1NTCQkweDBDCisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9ERUFDVElWQVRFX1NTCQkweDBECisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9JTlRFUlJPR0FURV9TUwkJMHgwRQorI2RlZmluZSBHU00wNDgwX09QX0NPREVfTk9USUZZX1NTCQkweDEwCisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9SRUdJU1RFUl9QQVNTV09SRAkweDExCisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9HRVRfUEFTU1dPUkQJCTB4MTIKKyNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX1BST0NFU1NfVVNTX0RBVEEJMHgxMworI2RlZmluZSBHU00wNDgwX09QX0NPREVfRk9SV0FSRF9DSEVDS19TU19JTkQJMHgyNgorI2RlZmluZSBHU00wNDgwX09QX0NPREVfUFJPQ0VTU19VU1NfUkVRCQkweDNCCisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9VU1NfUkVRVUVTVAkJMHgzQworI2RlZmluZSBHU00wNDgwX09QX0NPREVfVVNTX05PVElGWQkJMHgzRAorI2RlZmluZSBHU00wNDgwX09QX0NPREVfRk9SV0FSRF9DVUdfSU5GTwkweDc4CisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9TUExJVF9NUFRZCQkweDc5CisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9SRVRSSUVWRV9NUFRZCQkweDdBCisjZGVmaW5lIEdTTTA0ODBfT1BfQ09ERV9IT0xEX01QVFkJCTB4N0IKKyNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX0JVSUxEX01QVFkJCTB4N0MKKyNkZWZpbmUgR1NNMDQ4MF9PUF9DT0RFX0ZPUldBUkRfQ0hBUkdFX0FEVklDRQkweDdECisKKyNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9VTktOT1dOX1NVQlNDUklCRVIJCQkweDAxCisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfSUxMRUdBTF9TVUJTQ1JJQkVSCQkJMHgwOQorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX0JFQVJFUl9TRVJWSUNFX05PVF9QUk9WSVNJT05FRAkJMHgwQQorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX1RFTEVTRVJWSUNFX05PVF9QUk9WSVNJT05FRAkJMHgwQgorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX0lMTEVHQUxfRVFVSVBNRU5UCQkJMHgwQworI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX0NBTExfQkFSUkVECQkJCTB4MEQKKyNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9JTExFR0FMX1NTX09QRVJBVElPTgkJCTB4MTAKKyNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9TU19FUlJPUl9TVEFUVVMJCQkweDExCisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfU1NfTk9UX0FWQUlMQUJMRQkJCTB4MTIKKyNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9TU19TVUJTQ1JJUFRJT05fVklPTEFUSU9OCQkweDEzCisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfU1NfSU5DT01QQVRJQklMSVRZCQkJMHgxNAorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX0ZBQ0lMSVRZX05PVF9TVVBQT1JURUQJCQkweDE1CisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfQUJTRU5UX1NVQlNDUklCRVIJCQkweDFCCisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfU1lTVEVNX0ZBSUxVUkUJCQkJMHgyMgorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX0RBVEFfTUlTU0lORwkJCQkweDIzCisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfVU5FWFBFQ1RFRF9EQVRBX1ZBTFVFCQkJMHgyNAorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX1BXX1JFR0lTVFJBVElPTl9GQUlMVVJFCQkweDI1CisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfTkVHQVRJVkVfUFdfQ0hFQ0sJCQkweDI2CisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfTlVNX1BXX0FUVEVNUFRTX1ZJT0xBVElPTgkJMHgyQgorI2RlZmluZSBHU00wNDgwX0VSUl9DT0RFX1VOS05PV05fQUxQSEFCRVQJCQkweDQ3CisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfVVNTRF9CVVNZCQkJCTB4NDgKKyNkZWZpbmUgR1NNMDQ4MF9FUlJfQ09ERV9NQVhfTVBUWV9QQVJUSUNJUEFOVFMJCQkweDdFCisjZGVmaW5lIEdTTTA0ODBfRVJSX0NPREVfUkVTT1VSQ0VTX05PVF9BVkFJTEFCTEUJCTB4N0YKKworLyogQVNOLjEgdHlwZS10YWdzICovCisjZGVmaW5lIEFTTjFfQk9PTEVBTl9UQUcJCTB4MDEKKyNkZWZpbmUgQVNOMV9JTlRFR0VSX1RBRwkJMHgwMgorI2RlZmluZSBBU04xX0JJVF9TVFJJTkdfVEFHCQkweDAzCisjZGVmaW5lIEFTTjFfT0NURVRfU1RSSU5HX1RBRwkJMHgwNAorI2RlZmluZSBBU04xX05VTExfVFlQRV9UQUcJCTB4MDUKKyNkZWZpbmUgQVNOMV9PQkpFQ1RfSURfVEFHCQkweDA2CisjZGVmaW5lIEFTTjFfVVRGOF9TVFJJTkdfVEFHCQkweDBDCisjZGVmaW5lIEFTTjFfUFJJTlRBQkxFX1NUUklOR19UQUcJMHgxMworI2RlZmluZSBBU04xX0lBNV9TVFJJTkdfVEFHCQkweDE2CisjZGVmaW5lIEFTTjFfVU5JQ09ERV9TVFJJTkdfVEFHCQkweDFFCisKKyNlbmRpZiAvKiBQUk9UT19HU01fMDRfODBfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfMDguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzA4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4ZjkzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzA4LmgKQEAgLTAsMCArMSwzMDMgQEAKKy8qIEZyb20gR1NNMDguMDggKi8KKworI2lmbmRlZiBHU01fMDgwOF9ICisjZGVmaW5lIEdTTV8wODA4X0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKgorICogdGhpcyBpcyBmcm9tIEdTTSAwMy4wMyBDR0kgYnV0IGlzIGNvcGllZCBpbiBHU00gMDguMDgKKyAqIGluIMKnIDMuMi4yLjI3IGZvciBDZWxsIElkZW50aWZpZXIgTGlzdAorICovCitlbnVtIENFTExfSURFTlQgeworCUNFTExfSURFTlRfV0hPTEVfR0xPQkFMCQk9IDAsCisJQ0VMTF9JREVOVF9MQUNfQU5EX0NJCQk9IDEsCisJQ0VMTF9JREVOVF9DSQkJCT0gMiwKKwlDRUxMX0lERU5UX05PX0NFTEwJCT0gMywKKwlDRUxMX0lERU5UX0xBSV9BTkRfTEFDCQk9IDQsCisJQ0VMTF9JREVOVF9MQUMJCQk9IDUsCisJQ0VMTF9JREVOVF9CU1MJCQk9IDYsCisJQ0VMTF9JREVOVF9VVFJBTl9QTE1OX0xBQ19STkMJPSA4LAorCUNFTExfSURFTlRfVVRSQU5fUk5DCQk9IDksCisJQ0VMTF9JREVOVF9VVFJBTl9MQUNfUk5DCT0gMTAsCit9OworCisKKy8qIEdTTSAwOC4wNiDCpyA2LjMgKi8KK2VudW0gQlNTQVBfTVNHX1RZUEUgeworCUJTU0FQX01TR19CU1NfTUFOQUdFTUVOVCAgICA9IDB4MCwKKwlCU1NBUF9NU0dfRFRBUAkJICAgID0gMHgxLAorfTsKKworc3RydWN0IGJzc21hcF9oZWFkZXIgeworCXVpbnQ4X3QgdHlwZTsKKwl1aW50OF90IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBkdGFwX2hlYWRlciB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgbGlua19pZDsKKwl1aW50OF90IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworZW51bSBCU1NfTUFQX01TR19UWVBFIHsKKwlCU1NfTUFQX01TR19SRVNFUlZFRF8wCQk9IDAsCisKKwkvKiBBU1NJR05NRU5UIE1FU1NBR0VTICovCisJQlNTX01BUF9NU0dfQVNTSUdNRU5UX1JRU1QJPSAxLAorCUJTU19NQVBfTVNHX0FTU0lHTUVOVF9DT01QTEVURQk9IDIsCisJQlNTX01BUF9NU0dfQVNTSUdNRU5UX0ZBSUxVUkUJPSAzLAorCisJLyogIEhBTkRPVkVSIE1FU1NBR0VTICovCisJQlNTX01BUF9NU0dfSEFORE9WRVJfUlFTVAkJPSAxNiwKKwlCU1NfTUFQX01TR19IQU5ET1ZFUl9SRVFVSVJFRAkJPSAxNywKKwlCU1NfTUFQX01TR19IQU5ET1ZFUl9SUVNUX0FDS05PV0xFREdFPSAxOCwKKwlCU1NfTUFQX01TR19IQU5ET1ZFUl9DTUQJCT0gMTksCisJQlNTX01BUF9NU0dfSEFORE9WRVJfQ09NUExFVEUJCT0gMjAsCisJQlNTX01BUF9NU0dfSEFORE9WRVJfU1VDQ0VFREVECQk9IDIxLAorCUJTU19NQVBfTVNHX0hBTkRPVkVSX0ZBSUxVUkUJCT0gMjIsCisJQlNTX01BUF9NU0dfSEFORE9WRVJfUEVSRk9STUVECQk9IDIzLAorCUJTU19NQVBfTVNHX0hBTkRPVkVSX0NBTkRJREFURV9FTlFVSVJFCT0gMjQsCisJQlNTX01BUF9NU0dfSEFORE9WRVJfQ0FORElEQVRFX1JFU1BPTlNFCT0gMjUsCisJQlNTX01BUF9NU0dfSEFORE9WRVJfUkVRVUlSRURfUkVKRUNUCT0gMjYsCisJQlNTX01BUF9NU0dfSEFORE9WRVJfREVURUNUCQk9IDI3LAorCisJLyogUkVMRUFTRSBNRVNTQUdFUyAqLworCUJTU19NQVBfTVNHX0NMRUFSX0NNRAkJPSAzMiwKKwlCU1NfTUFQX01TR19DTEVBUl9DT01QTEVURQkJPSAzMywKKwlCU1NfTUFQX01TR19DTEVBUl9SUVNUCQk9IDM0LAorCUJTU19NQVBfTVNHX1JFU0VSVkVEXzEJCQk9IDM1LAorCUJTU19NQVBfTVNHX1JFU0VSVkVEXzIJCQk9IDM2LAorCUJTU19NQVBfTVNHX1NBUElfTl9SRUpFQ1QJCT0gMzcsCisJQlNTX01BUF9NU0dfQ09ORlVTSU9OCQkJPSAzOCwKKworCS8qIE9USEVSIENPTk5FQ1RJT04gUkVMQVRFRCBNRVNTQUdFUyAqLworCUJTU19NQVBfTVNHX1NVU1BFTkQJCQk9IDQwLAorCUJTU19NQVBfTVNHX1JFU1VNRQkJCT0gNDEsCisJQlNTX01BUF9NU0dfQ09OTkVDVElPTl9PUklFTlRFRF9JTkZPUk1BVElPTiA9IDQyLAorCUJTU19NQVBfTVNHX1BFUkZPUk1fTE9DQVRJT05fUlFTVAk9IDQzLAorCUJTU19NQVBfTVNHX0xTQV9JTkZPUk1BVElPTgkJPSA0NCwKKwlCU1NfTUFQX01TR19QRVJGT1JNX0xPQ0FUSU9OX1JFU1BPTlNFCT0gNDUsCisJQlNTX01BUF9NU0dfUEVSRk9STV9MT0NBVElPTl9BQk9SVAk9IDQ2LAorCUJTU19NQVBfTVNHX0NPTU1PTl9JRAkJCT0gNDcsCisKKwkvKiBHRU5FUkFMIE1FU1NBR0VTICovCisJQlNTX01BUF9NU0dfUkVTRVQJCQk9IDQ4LAorCUJTU19NQVBfTVNHX1JFU0VUX0FDS05PV0xFREdFCQk9IDQ5LAorCUJTU19NQVBfTVNHX09WRVJMT0FECQkJPSA1MCwKKwlCU1NfTUFQX01TR19SRVNFUlZFRF8zCQkJPSA1MSwKKwlCU1NfTUFQX01TR19SRVNFVF9DSVJDVUlUCQk9IDUyLAorCUJTU19NQVBfTVNHX1JFU0VUX0NJUkNVSVRfQUNLTk9XTEVER0UJPSA1MywKKwlCU1NfTUFQX01TR19NU0NfSU5WT0tFX1RSQUNFCQk9IDU0LAorCUJTU19NQVBfTVNHX0JTU19JTlZPS0VfVFJBQ0UJCT0gNTUsCisJQlNTX01BUF9NU0dfQ09OTkVDVElPTkxFU1NfSU5GT1JNQVRJT04JPSA1OCwKKworCS8qIFRFUlJFU1RSSUFMIFJFU09VUkNFIE1FU1NBR0VTICovCisJQlNTX01BUF9NU0dfQkxPQ0sJCQk9IDY0LAorCUJTU19NQVBfTVNHX0JMT0NLSU5HX0FDS05PV0xFREdFCT0gNjUsCisJQlNTX01BUF9NU0dfVU5CTE9DSwkJCT0gNjYsCisJQlNTX01BUF9NU0dfVU5CTE9DS0lOR19BQ0tOT1dMRURHRQk9IDY3LAorCUJTU19NQVBfTVNHX0NJUkNVSVRfR1JPVVBfQkxPQ0sJCT0gNjgsCisJQlNTX01BUF9NU0dfQ0lSQ1VJVF9HUk9VUF9CTE9DS0lOR19BQ0tOT1dMRURHRQk9IDY5LAorCUJTU19NQVBfTVNHX0NJUkNVSVRfR1JPVVBfVU5CTE9DSwk9IDcwLAorCUJTU19NQVBfTVNHX0NJUkNVSVRfR1JPVVBfVU5CTE9DS0lOR19BQ0tOT1dMRURHRSA9IDcxLAorCUJTU19NQVBfTVNHX1VORVFVSVBQRURfQ0lSQ1VJVAkJPSA3MiwKKwlCU1NfTUFQX01TR19DSEFOR0VfQ0lSQ1VJVAkJPSA3OCwKKwlCU1NfTUFQX01TR19DSEFOR0VfQ0lSQ1VJVF9BQ0tOT1dMRURHRQk9IDc5LAorCisJLyogUkFESU8gUkVTT1VSQ0UgTUVTU0FHRVMgKi8KKwlCU1NfTUFQX01TR19SRVNPVVJDRV9SUVNUCQk9IDgwLAorCUJTU19NQVBfTVNHX1JFU09VUkNFX0lORElDQVRJT04JCT0gODEsCisJQlNTX01BUF9NU0dfUEFHSU5HCQkJPSA4MiwKKwlCU1NfTUFQX01TR19DSVBIRVJfTU9ERV9DTUQJCT0gODMsCisJQlNTX01BUF9NU0dfQ0xBU1NNQVJLX1VQREFURQkJPSA4NCwKKwlCU1NfTUFQX01TR19DSVBIRVJfTU9ERV9DT01QTEVURQk9IDg1LAorCUJTU19NQVBfTVNHX1FVRVVJTkdfSU5ESUNBVElPTgkJPSA4NiwKKwlCU1NfTUFQX01TR19DT01QTEVURV9MQVlFUl8zCQk9IDg3LAorCUJTU19NQVBfTVNHX0NMQVNTTUFSS19SUVNUCQk9IDg4LAorCUJTU19NQVBfTVNHX0NJUEhFUl9NT0RFX1JFSkVDVAkJPSA4OSwKKwlCU1NfTUFQX01TR19MT0FEX0lORElDQVRJT04JCT0gOTAsCisKKwkvKiBWR0NTL1ZCUyAqLworCUJTU19NQVBfTVNHX1ZHQ1NfVkJTX1NFVFVQCQk9IDQsCisJQlNTX01BUF9NU0dfVkdDU19WQlNfU0VUVVBfQUNLCQk9IDUsCisJQlNTX01BUF9NU0dfVkdDU19WQlNfU0VUVVBfUkVGVVNFCT0gNiwKKwlCU1NfTUFQX01TR19WR0NTX1ZCU19BU1NJR05NRU5UX1JRU1QJPSA3LAorCUJTU19NQVBfTVNHX1ZHQ1NfVkJTX0FTU0lHTk1FTlRfUkVTVUxUCT0gMjgsCisJQlNTX01BUF9NU0dfVkdDU19WQlNfQVNTSUdOTUVOVF9GQUlMVVJFCT0gMjksCisJQlNTX01BUF9NU0dfVkdDU19WQlNfUVVFVUlOR19JTkRJQ0FUSU9OCT0gMzAsCisJQlNTX01BUF9NU0dfVVBMSU5LX1JRU1QJCT0gMzEsCisJQlNTX01BUF9NU0dfVVBMSU5LX1JRU1RfQUNLTk9XTEVER0UJPSAzOSwKKwlCU1NfTUFQX01TR19VUExJTktfUlFTVF9DT05GSVJNQVRJT04JPSA3MywKKwlCU1NfTUFQX01TR19VUExJTktfUkVMRUFTRV9JTkRJQ0FUSU9OCT0gNzQsCisJQlNTX01BUF9NU0dfVVBMSU5LX1JFSkVDVF9DTUQJPSA3NSwKKwlCU1NfTUFQX01TR19VUExJTktfUkVMRUFTRV9DTUQJPSA3NiwKKwlCU1NfTUFQX01TR19VUExJTktfU0VJWkVEX0NNRAk9IDc3LAorfTsKKworZW51bSBHU00wODA4X0lFX0NPRElORyB7CisJR1NNMDgwOF9JRV9DSVJDVUlUX0lERU5USVRZX0NPREUJPSAxLAorCUdTTTA4MDhfSUVfUkVTRVJWRURfMAkJCT0gMiwKKwlHU00wODA4X0lFX1JFU09VUkNFX0FWQUlMQUJMRQkJPSAzLAorCUdTTTA4MDhfSUVfQ0FVU0UJCQk9IDQsCisJR1NNMDgwOF9JRV9DRUxMX0lERU5USUZJRVIJCT0gNSwKKwlHU00wODA4X0lFX1BSSU9SSVRZCQkJPSA2LAorCUdTTTA4MDhfSUVfTEFZRVJfM19IRUFERVJfSU5GT1JNQVRJT04JPSA3LAorCUdTTTA4MDhfSUVfSU1TSQkJCQk9IDgsCisJR1NNMDgwOF9JRV9UTVNJCQkJCT0gOSwKKwlHU00wODA4X0lFX0VOQ1JZUFRJT05fSU5GT1JNQVRJT04JPSAxMCwKKwlHU00wODA4X0lFX0NIQU5ORUxfVFlQRQkJCT0gMTEsCisJR1NNMDgwOF9JRV9QRVJJT0RJQ0lUWQkJCT0gMTIsCisJR1NNMDgwOF9JRV9FWFRFTkRFRF9SRVNPVVJDRV9JTkRJQ0FUT1IJPSAxMywKKwlHU00wODA4X0lFX05VTUJFUl9PRl9NU1MJCT0gMTQsCisJR1NNMDgwOF9JRV9SRVNFUlZFRF8xCQkJPSAxNSwKKwlHU00wODA4X0lFX1JFU0VSVkVEXzIJCQk9IDE2LAorCUdTTTA4MDhfSUVfUkVTRVJWRURfMwkJCT0gMTcsCisJR1NNMDgwOF9JRV9DTEFTU01BUktfSU5GT1JNQVRJT05fVDIJPSAxOCwKKwlHU00wODA4X0lFX0NMQVNTTUFSS19JTkZPUk1BVElPTl9UMwk9IDE5LAorCUdTTTA4MDhfSUVfSU5URVJGRVJFTkNFX0JBTkRfVE9fVVNFCT0gMjAsCisJR1NNMDgwOF9JRV9SUl9DQVVTRQkJCT0gMjEsCisJR1NNMDgwOF9JRV9SRVNFUlZFRF80CQkJPSAyMiwKKwlHU00wODA4X0lFX0xBWUVSXzNfSU5GT1JNQVRJT04JCT0gMjMsCisJR1NNMDgwOF9JRV9ETENJCQkJCT0gMjQsCisJR1NNMDgwOF9JRV9ET1dOTElOS19EVFhfRkxBRwkJPSAyNSwKKwlHU00wODA4X0lFX0NFTExfSURFTlRJRklFUl9MSVNUCQk9IDI2LAorCUdTTTA4MDhfSUVfUkVTUE9OU0VfUlFTVAkJPSAyNywKKwlHU00wODA4X0lFX1JFU09VUkNFX0lORElDQVRJT05fTUVUSE9ECT0gMjgsCisJR1NNMDgwOF9JRV9DTEFTU01BUktfSU5GT1JNQVRJT05fVFlQRV8xCT0gMjksCisJR1NNMDgwOF9JRV9DSVJDVUlUX0lERU5USVRZX0NPREVfTElTVAk9IDMwLAorCUdTTTA4MDhfSUVfRElBR05PU1RJQwkJCT0gMzEsCisJR1NNMDgwOF9JRV9MQVlFUl8zX01FU1NBR0VfQ09OVEVOVFMJPSAzMiwKKwlHU00wODA4X0lFX0NIT1NFTl9DSEFOTkVMCQk9IDMzLAorCUdTTTA4MDhfSUVfVE9UQUxfUkVTT1VSQ0VfQUNDRVNTSUJMRQk9IDM0LAorCUdTTTA4MDhfSUVfQ0lQSEVSX1JFU1BPTlNFX01PREUJCT0gMzUsCisJR1NNMDgwOF9JRV9DSEFOTkVMX05FRURFRAkJPSAzNiwKKwlHU00wODA4X0lFX1RSQUNFX1RZUEUJCQk9IDM3LAorCUdTTTA4MDhfSUVfVFJJR0dFUklECQkJPSAzOCwKKwlHU00wODA4X0lFX1RSQUNFX1JFRkVSRU5DRQkJPSAzOSwKKwlHU00wODA4X0lFX1RSQU5TQUNUSU9OSUQJCT0gNDAsCisJR1NNMDgwOF9JRV9NT0JJTEVfSURFTlRJVFkJCT0gNDEsCisJR1NNMDgwOF9JRV9PTUNJRAkJCT0gNDIsCisJR1NNMDgwOF9JRV9GT1JXQVJEX0lORElDQVRPUgkJPSA0MywKKwlHU00wODA4X0lFX0NIT1NFTl9FTkNSX0FMRwkJPSA0NCwKKwlHU00wODA4X0lFX0NJUkNVSVRfUE9PTAkJCT0gNDUsCisJR1NNMDgwOF9JRV9DSVJDVUlUX1BPT0xfTElTVAkJPSA0NiwKKwlHU00wODA4X0lFX1RJTUVfSU5ESUNBVElPTgkJPSA0NywKKwlHU00wODA4X0lFX1JFU09VUkNFX1NJVFVBVElPTgkJPSA0OCwKKwlHU00wODA4X0lFX0NVUlJFTlRfQ0hBTk5FTF9UWVBFXzEJPSA0OSwKKwlHU00wODA4X0lFX1FVRVVFSU5HX0lORElDQVRPUgkJPSA1MCwKKwlHU00wODA4X0lFX1NQRUVDSF9WRVJTSU9OCQk9IDY0LAorCUdTTTA4MDhfSUVfQVNTSUdOTUVOVF9SRVFVSVJFTUVOVAk9IDUxLAorCUdTTTA4MDhfSUVfVEFMS0VSX0ZMQUcJCQk9IDUzLAorCUdTTTA4MDhfSUVfQ09OTkVDVElPTl9SRUxFQVNFX1JRU1RFRAk9IDU0LAorCUdTTTA4MDhfSUVfR1JPVVBfQ0FMTF9SRUZFUkVOQ0UJCT0gNTUsCisJR1NNMDgwOF9JRV9FTUxQUF9QUklPUklUWQkJPSA1NiwKKwlHU00wODA4X0lFX0NPTkZJR19FVk9fSU5ESQkJPSA1NywKKwlHU00wODA4X0lFX09MRF9CU1NfVE9fTkVXX0JTU19JTkZPUk1BVElPTgk9IDU4LAorCUdTTTA4MDhfSUVfTFNBX0lERU5USUZJRVIJCT0gNTksCisJR1NNMDgwOF9JRV9MU0FfSURFTlRJRklFUl9MSVNUCQk9IDYwLAorCUdTTTA4MDhfSUVfTFNBX0lORk9STUFUSU9OCQk9IDYxLAorCUdTTTA4MDhfSUVfTENTX1FPUwkJCT0gNjIsCisJR1NNMDgwOF9JRV9MU0FfQUNDRVNTX0NUUkxfU1VQUFIJPSA2MywKKwlHU00wODA4X0lFX0xDU19QUklPUklUWQkJCT0gNjcsCisJR1NNMDgwOF9JRV9MT0NBVElPTl9UWVBFCQk9IDY4LAorCUdTTTA4MDhfSUVfTE9DQVRJT05fRVNUSU1BVEUJCT0gNjksCisJR1NNMDgwOF9JRV9QT1NJVElPTklOR19EQVRBCQk9IDcwLAorCUdTTTA4MDhfSUVfTENTX0NBVVNFCQkJPSA3MSwKKwlHU00wODA4X0lFX0xDU19DTElFTlRfVFlQRQkJPSA3MiwKKwlHU00wODA4X0lFX0FQRFUJCQkJPSA3MywKKwlHU00wODA4X0lFX05FVFdPUktfRUxFTUVOVF9JREVOVElUWQk9IDc0LAorCUdTTTA4MDhfSUVfR1BTX0FTU0lTVEFOQ0VfREFUQQkJPSA3NSwKKwlHU00wODA4X0lFX0RFQ0lQSEVSSU5HX0tFWVMJCT0gNzYsCisJR1NNMDgwOF9JRV9SRVRVUk5fRVJST1JfUlFTVAkJPSA3NywKKwlHU00wODA4X0lFX1JFVFVSTl9FUlJPUl9DQVVTRQkJPSA3OCwKKwlHU00wODA4X0lFX1NFR01FTlRBVElPTgkJCT0gNzksCisJR1NNMDgwOF9JRV9TRVJWSUNFX0hBTkRPVkVSCQk9IDgwLAorCUdTTTA4MDhfSUVfU09VUkNFX1JOQ19UT19UQVJHRVRfUk5DX1RSQU5TUEFSRU5UX1VNVFMJPSA4MSwKKwlHU00wODA4X0lFX1NPVVJDRV9STkNfVE9fVEFSR0VUX1JOQ19UUkFOU1BBUkVOVF9DRE1BMjAwMD0gODIsCisJR1NNMDgwOF9JRV9SRVNFUlZFRF81CQkJPSA2NSwKKwlHU00wODA4X0lFX1JFU0VSVkVEXzYJCQk9IDY2LAorfTsKKworZW51bSBnc20wODA4X2NhdXNlIHsKKwlHU00wODA4X0NBVVNFX1JBRElPX0lOVEVSRkFDRV9NRVNTQUdFX0ZBSUxVUkUJCQk9IDAsCisJR1NNMDgwOF9DQVVTRV9SQURJT19JTlRFUkZBQ0VfRkFJTFVSRQkJCQk9IDEsCisJR1NNMDgwOF9DQVVTRV9VUExJTktfUVVBTElUWQkJCQkJPSAyLAorCUdTTTA4MDhfQ0FVU0VfVVBMSU5LX1NUUkVOR1RICQkJCQk9IDMsCisJR1NNMDgwOF9DQVVTRV9ET1dOTElOS19RVUFMSVRZCQkJCQk9IDQsCisJR1NNMDgwOF9DQVVTRV9ET1dOTElOS19TVFJFTkdUSAkJCQkJPSA1LAorCUdTTTA4MDhfQ0FVU0VfRElTVEFOQ0UJCQkJCQk9IDYsCisJR1NNMDgwOF9DQVVTRV9PX0FORF9NX0lOVEVSVkVOVElPTgkJCQk9IDcsCisJR1NNMDgwOF9DQVVTRV9SRVNQT05TRV9UT19NU0NfSU5WT0NBVElPTgkJCT0gOCwKKwlHU00wODA4X0NBVVNFX0NBTExfQ09OVFJPTAkJCQkJPSA5LAorCUdTTTA4MDhfQ0FVU0VfUkFESU9fSU5URVJGQUNFX0ZBSUxVUkVfUkVWRVJTSU9OCQkJPSAxMCwKKwlHU00wODA4X0NBVVNFX0hBTkRPVkVSX1NVQ0NFU1NGVUwJCQkJPSAxMSwKKwlHU00wODA4X0NBVVNFX0JFVFRFUl9DRUxMCQkJCQk9IDEyLAorCUdTTTA4MDhfQ0FVU0VfRElSRUNURURfUkVUUlkJCQkJCT0gMTMsCisJR1NNMDgwOF9DQVVTRV9KT0lORURfR1JPVVBfQ0FMTF9DSEFOTkVMCQkJCT0gMTQsCisJR1NNMDgwOF9DQVVTRV9UUkFGRklDCQkJCQkJPSAxNSwKKwlHU00wODA4X0NBVVNFX0VRVUlQTUVOVF9GQUlMVVJFCQkJCQk9IDMyLAorCUdTTTA4MDhfQ0FVU0VfTk9fUkFESU9fUkVTT1VSQ0VfQVZBSUxBQkxFCQkJPSAzMywKKwlHU00wODA4X0NBVVNFX1JRU1RFRF9URVJSRVNUUklBTF9SRVNPVVJDRV9VTkFWQUlMQUJMRQk9IDM0LAorCUdTTTA4MDhfQ0FVU0VfQ0NDSF9PVkVSTE9BRAkJCQkJPSAzNSwKKwlHU00wODA4X0NBVVNFX1BST0NFU1NPUl9PVkVSTE9BRAkJCQk9IDM2LAorCUdTTTA4MDhfQ0FVU0VfQlNTX05PVF9FUVVJUFBFRAkJCQkJPSAzNywKKwlHU00wODA4X0NBVVNFX01TX05PVF9FUVVJUFBFRAkJCQkJPSAzOCwKKwlHU00wODA4X0NBVVNFX0lOVkFMSURfQ0VMTAkJCQkJPSAzOSwKKwlHU00wODA4X0NBVVNFX1RSQUZGSUNfTE9BRAkJCQkJPSA0MCwKKwlHU00wODA4X0NBVVNFX1BSRUVNUFRJT04JCQkJCT0gNDEsCisJR1NNMDgwOF9DQVVTRV9SUVNURURfVFJBTlNDT0RJTkdfUkFURV9BREFQVElPTl9VTkFWQUlMQUJMRQk9IDQ4LAorCUdTTTA4MDhfQ0FVU0VfQ0lSQ1VJVF9QT09MX01JU01BVENICQkJCT0gNDksCisJR1NNMDgwOF9DQVVTRV9TV0lUQ0hfQ0lSQ1VJVF9QT09MCQkJCT0gNTAsCisJR1NNMDgwOF9DQVVTRV9SUVNURURfU1BFRUNIX1ZFUlNJT05fVU5BVkFJTEFCTEUJCT0gNTEsCisJR1NNMDgwOF9DQVVTRV9MU0FfTk9UX0FMTE9XRUQJCQkJCT0gNTIsCisJR1NNMDgwOF9DQVVTRV9DSVBIRVJJTkdfQUxHT1JJVEhNX05PVF9TVVBQT1JURUQJCQk9IDY0LAorCUdTTTA4MDhfQ0FVU0VfVEVSUkVTVFJJQUxfQ0lSQ1VJVF9BTFJFQURZX0FMTE9DQVRFRAkJPSA4MCwKKwlHU00wODA4X0NBVVNFX0lOVkFMSURfTUVTU0FHRV9DT05URU5UUwkJCQk9IDgxLAorCUdTTTA4MDhfQ0FVU0VfSU5GT1JNQVRJT05fRUxFTUVOVF9PUl9GSUVMRF9NSVNTSU5HCQk9IDgyLAorCUdTTTA4MDhfQ0FVU0VfSU5DT1JSRUNUX1ZBTFVFCQkJCQk9IDgzLAorCUdTTTA4MDhfQ0FVU0VfVU5LTk9XTl9NRVNTQUdFX1RZUEUJCQkJPSA4NCwKKwlHU00wODA4X0NBVVNFX1VOS05PV05fSU5GT1JNQVRJT05fRUxFTUVOVAkJCT0gODUsCisJR1NNMDgwOF9DQVVTRV9QUk9UT0NPTF9FUlJPUl9CRVRXRUVOX0JTU19BTkRfTVNDCQk9IDk2LAorfTsKKworLyogR1NNIDA4LjA4IDMuMi4yLjExIENoYW5uZWwgVHlwZSAqLworZW51bSBnc20wODA4X2NoYW5faW5kaWNhdG9yIHsKKwlHU00wODA4X0NIQU5fU1BFRUNIID0gMSwKKwlHU00wODA4X0NIQU5fREFUQSAgID0gMiwKKwlHU00wODA4X0NIQU5fU0lHTiAgID0gMywKK307CisKK2VudW0gZ3NtMDgwOF9jaGFuX3JhdGVfdHlwZV9kYXRhIHsKKwlHU00wODA4X0RBVEFfRlVMTF9CTQk9IDB4OCwKKwlHU00wODA4X0RBVEFfSEFMRl9MTQk9IDB4OSwKKwlHU00wODA4X0RBVEFfRlVMTF9SUFJFRgk9IDB4YSwKKwlHU00wODA4X0RBVEFfSEFMRl9QUkVGCT0gMHhiLAorCUdTTTA4MDhfREFUQV9GVUxMX1BSRUZfTk9fQ0hBTkdFCT0gMHgxYSwKKwlHU00wODA4X0RBVEFfSEFMRl9QUkVGX05PX0NIQU5HRQk9IDB4MWIsCisJR1NNMDgwOF9EQVRBX01VTFRJX01BU0sJPSAweDIwLAorCUdTTTA4MDhfREFUQV9NVUxUSV9NQVNLX05PX0NIQU5HRQk9IDB4MzAsCit9OworCitlbnVtIGdzbTA4MDhfY2hhbl9yYXRlX3R5cGVfc3BlZWNoIHsKKwlHU00wODA4X1NQRUVDSF9GVUxMX0JNCT0gMHg4LAorCUdTTTA4MDhfU1BFRUNIX0hBTEZfTE0JPSAweDksCisJR1NNMDgwOF9TUEVFQ0hfRlVMTF9QUkVGPSAweGEsCisJR1NNMDgwOF9TUEVFQ0hfSEFMRl9QUkVGPSAweGIsCisJR1NNMDgwOF9TUEVFQ0hfRlVMTF9QUkVGX05PX0NIQU5HRQk9IDB4MWEsCisJR1NNMDgwOF9TUEVFQ0hfSEFMRl9QUkVGX05PX0NIQU5HRQk9IDB4MWIsCisJR1NNMDgwOF9TUEVFQ0hfUEVSTQk9IDB4ZiwKKwlHU00wODA4X1NQRUVDSF9QRVJNX05PX0NIQU5HRSA9IDB4MWYsCit9OworCitlbnVtIGdzbTA4MDhfcGVybWl0dGVkX3NwZWVjaCB7CisJR1NNMDgwOF9QRVJNX0ZSMQk9IDB4MDEsCisJR1NNMDgwOF9QRVJNX0ZSMgk9IDB4MTEsCisJR1NNMDgwOF9QRVJNX0ZSMwk9IDB4MjEsCisJR1NNMDgwOF9QRVJNX0hSMQk9IEdTTTA4MDhfUEVSTV9GUjEgfCAweDQsCisJR1NNMDgwOF9QRVJNX0hSMgk9IEdTTTA4MDhfUEVSTV9GUjIgfCAweDQsCisJR1NNMDgwOF9QRVJNX0hSMwk9IEdTTTA4MDhfUEVSTV9GUjMgfCAweDQsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF81OC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOTM5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF81OC5oCkBAIC0wLDAgKzEsNTEyIEBACisjaWZuZGVmIFBST1RPX0dTTV8wOF81OF9ICisjZGVmaW5lIFBST1RPX0dTTV8wOF81OF9ICisKKy8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDguNTggdmVyc2lvbiA4LjYuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA1OTYgVjguNi4wICovCisKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciB7CisJdWludDhfdAltc2dfZGlzY3I7CisJdWludDhfdAltc2dfdHlwZTsKKwl1aW50OF90CWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciA4LjMgKi8KK3N0cnVjdCBhYmlzX3JzbF9ybGxfaGRyIHsKKwlzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciBjOworCXVpbnQ4X3QJaWVfY2hhbjsKKwl1aW50OF90CWNoYW5fbnI7CisJdWludDhfdAlpZV9saW5rX2lkOworCXVpbnQ4X3QJbGlua19pZDsKKwl1aW50OF90CWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciA4LjMgYW5kIDguNCAqLworc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciB7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgYzsKKwl1aW50OF90CWllX2NoYW47CisJdWludDhfdAljaGFuX25yOworCXVpbnQ4X3QJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKy8qIENoYXB0ZXIgOS4xICovCisjZGVmaW5lIEFCSVNfUlNMX01ESVNDX1JMTAkJMHgwMgorI2RlZmluZSBBQklTX1JTTF9NRElTQ19ERURfQ0hBTgkJMHgwOAorI2RlZmluZSBBQklTX1JTTF9NRElTQ19DT01fQ0hBTgkJMHgwYworI2RlZmluZSBBQklTX1JTTF9NRElTQ19UUlgJCTB4MTAKKyNkZWZpbmUgQUJJU19SU0xfTURJU0NfTE9DCQkweDIwCisjZGVmaW5lIEFCSVNfUlNMX01ESVNDX0lQQUNDRVNTCQkweDdlCisjZGVmaW5lIEFCSVNfUlNMX01ESVNDX1RSQU5TUAkJMHgwMQorCisjZGVmaW5lIEFCSVNfUlNMX01ESVNDX0lTX1RSQU5TUCh4KQkoeCAmIDB4MDEpCisKKy8qIENoYXB0ZXIgOS4xICovCitlbnVtIGFiaXNfcnNsX21zZ3R5cGUgeworCS8qIFJhZGlvIExpbmsgTGF5ZXIgTWFuYWdlbWVudCAqLworCVJTTF9NVF9EQVRBX1JFUQkJCT0gMHgwMSwKKwlSU0xfTVRfREFUQV9JTkQsCisJUlNMX01UX0VSUk9SX0lORCwKKwlSU0xfTVRfRVNUX1JFUSwKKwlSU0xfTVRfRVNUX0NPTkYsCisJUlNMX01UX0VTVF9JTkQsCisJUlNMX01UX1JFTF9SRVEsCisJUlNMX01UX1JFTF9DT05GLAorCVJTTF9NVF9SRUxfSU5ELAorCVJTTF9NVF9VTklUX0RBVEFfUkVRLAorCVJTTF9NVF9VTklUX0RBVEFfSU5ELAkJLyogMHgwYiAqLworCisJLyogQ29tbW9uIENoYW5uZWwgTWFuYWdlbWVudCAvIFRSWCBNYW5hZ2VtZW50ICovCisJUlNMX01UX0JDQ0hfSU5GTwkJCT0gMHgxMSwKKwlSU0xfTVRfQ0NDSF9MT0FEX0lORCwKKwlSU0xfTVRfQ0hBTl9SUUQsCisJUlNMX01UX0RFTEVURV9JTkQsCisJUlNMX01UX1BBR0lOR19DTUQsCisJUlNMX01UX0lNTUVESUFURV9BU1NJR05fQ01ELAorCVJTTF9NVF9TTVNfQkNfUkVRLAorCS8qIGVtcHR5ICovCisJUlNMX01UX1JGX1JFU19JTkQJCQk9IDB4MTksCisJUlNMX01UX1NBQ0NIX0ZJTEwsCisJUlNMX01UX09WRVJMT0FELAorCVJTTF9NVF9FUlJPUl9SRVBPUlQsCisJUlNMX01UX1NNU19CQ19DTUQsCisJUlNMX01UX0NCQ0hfTE9BRF9JTkQsCisJUlNMX01UX05PVF9DTUQsCQkJLyogMHgxZiAqLworCisJLyogRGVkaWNhdGUgQ2hhbm5lbCBNYW5hZ2VtZW50ICovCisJUlNMX01UX0NIQU5fQUNUSVYJCQk9IDB4MjEsCisJUlNMX01UX0NIQU5fQUNUSVZfQUNLLAorCVJTTF9NVF9DSEFOX0FDVElWX05BQ0ssCisJUlNMX01UX0NPTk5fRkFJTCwKKwlSU0xfTVRfREVBQ1RJVkFURV9TQUNDSCwKKwlSU0xfTVRfRU5DUl9DTUQsCisJUlNMX01UX0hBTkRPX0RFVCwKKwlSU0xfTVRfTUVBU19SRVMsCisJUlNMX01UX01PREVfTU9ESUZZX1JFUSwKKwlSU0xfTVRfTU9ERV9NT0RJRllfQUNLLAorCVJTTF9NVF9NT0RFX01PRElGWV9OQUNLLAorCVJTTF9NVF9QSFlfQ09OVEVYVF9SRVEsCisJUlNMX01UX1BIWV9DT05URVhUX0NPTkYsCisJUlNMX01UX1JGX0NIQU5fUkVMLAorCVJTTF9NVF9NU19QT1dFUl9DT05UUk9MLAorCVJTTF9NVF9CU19QT1dFUl9DT05UUk9MLAkJLyogMHgzMCAqLworCVJTTF9NVF9QUkVQUk9DX0NPTkZJRywKKwlSU0xfTVRfUFJFUFJPQ19NRUFTX1JFUywKKwlSU0xfTVRfUkZfQ0hBTl9SRUxfQUNLLAorCVJTTF9NVF9TQUNDSF9JTkZPX01PRElGWSwKKwlSU0xfTVRfVEFMS0VSX0RFVCwKKwlSU0xfTVRfTElTVEVORVJfREVULAorCVJTTF9NVF9SRU1PVEVfQ09ERUNfQ09ORl9SRVAsCisJUlNMX01UX1JURF9SRVAsCisJUlNMX01UX1BSRV9IQU5ET19OT1RJRiwKKwlSU0xfTVRfTVJfQ09ERUNfTU9EX1JFUSwKKwlSU0xfTVRfTVJfQ09ERUNfTU9EX0FDSywKKwlSU0xfTVRfTVJfQ09ERUNfTU9EX05BQ0ssCisJUlNMX01UX01SX0NPREVDX01PRF9QRVIsCisJUlNMX01UX1RGT19SRVAsCisJUlNMX01UX1RGT19NT0RfUkVRLAkJLyogMHgzZiAqLworCVJTTF9NVF9MT0NBVElPTl9JTkZPCQk9IDB4NDEsCisKKwkvKiBpcC5hY2Nlc3Mgc3BlY2lmaWMgUlNMIG1lc3NhZ2UgdHlwZXMgKi8KKwlSU0xfTVRfSVBBQ19ESVJfUkVUUl9FTlEJPSAweDQwLAorCVJTTF9NVF9JUEFDX1BEQ0hfQUNUCQk9IDB4NDgsCisJUlNMX01UX0lQQUNfUERDSF9BQ1RfQUNLLAorCVJTTF9NVF9JUEFDX1BEQ0hfQUNUX05BQ0ssCisJUlNMX01UX0lQQUNfUERDSF9ERUFDVAkJPSAweDRiLAorCVJTTF9NVF9JUEFDX1BEQ0hfREVBQ1RfQUNLLAorCVJTTF9NVF9JUEFDX1BEQ0hfREVBQ1RfTkFDSywKKwlSU0xfTVRfSVBBQ19DT05ORUNUX01VWAkJPSAweDUwLAorCVJTTF9NVF9JUEFDX0NPTk5FQ1RfTVVYX0FDSywKKwlSU0xfTVRfSVBBQ19DT05ORUNUX01VWF9OQUNLLAorCVJTTF9NVF9JUEFDX0JJTkRfTVVYCQk9IDB4NTMsCisJUlNMX01UX0lQQUNfQklORF9NVVhfQUNLLAorCVJTTF9NVF9JUEFDX0JJTkRfTVVYX05BQ0ssCisJUlNMX01UX0lQQUNfRElTQ19NVVgJCT0gMHg1NiwKKwlSU0xfTVRfSVBBQ19ESVNDX01VWF9BQ0ssCisJUlNMX01UX0lQQUNfRElTQ19NVVhfTkFDSywKKwlSU0xfTVRfSVBBQ19DUkNYCQk9IDB4NzAsCQkvKiBCaW5kIHRvIGxvY2FsIEJUUyBSVFAgcG9ydCAqLworCVJTTF9NVF9JUEFDX0NSQ1hfQUNLLAorCVJTTF9NVF9JUEFDX0NSQ1hfTkFDSywKKwlSU0xfTVRfSVBBQ19NRENYCQk9IDB4NzMsCisJUlNMX01UX0lQQUNfTURDWF9BQ0ssCisJUlNMX01UX0lQQUNfTURDWF9OQUNLLAorCVJTTF9NVF9JUEFDX0RMQ1hfSU5ECQk9IDB4NzYsCisJUlNMX01UX0lQQUNfRExDWAkJPSAweDc3LAorCVJTTF9NVF9JUEFDX0RMQ1hfQUNLLAorCVJTTF9NVF9JUEFDX0RMQ1hfTkFDSywKK307CisKKy8qIFNpZW1lbnMgdmVuZG9yLXNwZWNpZmljICovCitlbnVtIGFiaXNfcnNsX21zZ3R5cGVfc2llbWVucyB7CisJUlNMX01UX1NJRU1FTlNfTVJQQ0kJCT0gMHg0MSwKKwlSU0xfTVRfU0lFTUVOU19JTlRSQUNfSE9fQ09ORF9JTkQgPSAweDQyLAorCVJTTF9NVF9TSUVNRU5TX0lOVEVSQ19IT19DT05EX0lORCA9IDB4NDMsCisJUlNMX01UX1NJRU1FTlNfRk9SQ0VEX0hPX1JFUQk9IDB4NDQsCisJUlNMX01UX1NJRU1FTlNfUFJFRl9BUkVBX1JFUQk9IDB4NDUsCisJUlNMX01UX1NJRU1FTlNfUFJFRl9BUkVBCT0gMHg0NiwKKwlSU0xfTVRfU0lFTUVOU19TVEFSVF9UUkFDRQk9IDB4NDcsCisJUlNMX01UX1NJRU1FTlNfU1RBUlRfVFJBQ0VfQUNLCT0gMHg0OCwKKwlSU0xfTVRfU0lFTUVOU19TVE9QX1RSQUNFCT0gMHg0OSwKKwlSU0xfTVRfU0lFTUVOU19UUk1SCQk9IDB4NGEsCisJUlNMX01UX1NJRU1FTlNfSE9fRkFJTF9JTkQJPSAweDRiLAorCVJTTF9NVF9TSUVNRU5TX1NUT1BfVFJBQ0VfQUNLCT0gMHg0YywKKwlSU0xfTVRfU0lFTUVOU19VUExGCQk9IDB4NGQsCisJUlNMX01UX1NJRU1FTlNfVVBMQgkJPSAweDRlLAorCVJTTF9NVF9TSUVNRU5TX1NFVF9TWVNfSU5GT18xMAk9IDB4NGYsCisJUlNMX01UX1NJRU1FTlNfTU9ESUZfQ09ORF9JTkQJPSAweDUwLAorfTsKKworLyogQ2hhcHRlciA5LjMgKi8KK2VudW0gYWJpc19yc2xfaWUgeworCVJTTF9JRV9DSEFOX05SCQkJPSAweDAxLAorCVJTTF9JRV9MSU5LX0lERU5ULAorCVJTTF9JRV9BQ1RfVFlQRSwKKwlSU0xfSUVfQlNfUE9XRVIsCisJUlNMX0lFX0NIQU5fSURFTlQsCisJUlNMX0lFX0NIQU5fTU9ERSwKKwlSU0xfSUVfRU5DUl9JTkZPLAorCVJTTF9JRV9GUkFNRV9OVU1CRVIsCisJUlNMX0lFX0hBTkRPX1JFRiwKKwlSU0xfSUVfTDFfSU5GTywKKwlSU0xfSUVfTDNfSU5GTywKKwlSU0xfSUVfTVNfSURFTlRJVFksCisJUlNMX0lFX01TX1BPV0VSLAorCVJTTF9JRV9QQUdJTkdfR1JPVVAsCisJUlNMX0lFX1BBR0lOR19MT0FELAorCVJTTF9JRV9QWUhTX0NPTlRFWFQJCT0gMHgxMCwKKwlSU0xfSUVfQUNDRVNTX0RFTEFZLAorCVJTTF9JRV9SQUNIX0xPQUQsCisJUlNMX0lFX1JFUV9SRUZFUkVOQ0UsCisJUlNMX0lFX1JFTEVBU0VfTU9ERSwKKwlSU0xfSUVfUkVTT1VSQ0VfSU5GTywKKwlSU0xfSUVfUkxNX0NBVVNFLAorCVJTTF9JRV9TVEFSVE5HX1RJTUUsCisJUlNMX0lFX1RJTUlOR19BRFZBTkNFLAorCVJTTF9JRV9VUExJTktfTUVBUywKKwlSU0xfSUVfQ0FVU0UsCisJUlNMX0lFX01FQVNfUkVTX05SLAorCVJTTF9JRV9NU0dfSUQsCisJLyogcmVzZXJ2ZWQgKi8KKwlSU0xfSUVfU1lTSU5GT19UWVBFCQk9IDB4MWUsCisJUlNMX0lFX01TX1BPV0VSX1BBUkFNLAorCVJTTF9JRV9CU19QT1dFUl9QQVJBTSwKKwlSU0xfSUVfUFJFUFJPQ19QQVJBTSwKKwlSU0xfSUVfUFJFUFJPQ19NRUFTLAorCVJTTF9JRV9JTU1fQVNTX0lORk8sCQkvKiBQaGFzZSAxICgzLjYuMCksIGxhdGVyIEZ1bGwgYmVsb3cgKi8KKwlSU0xfSUVfU01TQ0JfSU5GTwkJPSAweDI0LAorCVJTTF9JRV9NU19USU1JTkdfT0ZGU0VULAorCVJTTF9JRV9FUlJfTVNHLAorCVJTTF9JRV9GVUxMX0JDQ0hfSU5GTywKKwlSU0xfSUVfQ0hBTl9ORUVERUQsCisJUlNMX0lFX0NCX0NNRF9UWVBFLAorCVJTTF9JRV9TTVNDQl9NU0csCisJUlNMX0lFX0ZVTExfSU1NX0FTU19JTkZPLAorCVJTTF9JRV9TQUNDSF9JTkZPLAorCVJTTF9JRV9DQkNIX0xPQURfSU5GTywKKwlSU0xfSUVfU01TQ0JfQ0hBTl9JTkRJQ0FUT1IsCisJUlNMX0lFX0dST1VQX0NBTExfUkVGLAorCVJTTF9JRV9DSEFOX0RFU0MJCT0gMHgzMCwKKwlSU0xfSUVfTkNIX0RSWF9JTkZPLAorCVJTTF9JRV9DTURfSU5ESUNBVE9SLAorCVJTTF9JRV9FTUxQUF9QUklPLAorCVJTTF9JRV9VSUMsCisJUlNMX0lFX01BSU5fQ0hBTl9SRUYsCisJUlNMX0lFX01SX0NPTkZJRywKKwlSU0xfSUVfTVJfQ09OVFJPTCwKKwlSU0xfSUVfU1VQX0NPREVDX1RZUEVTLAorCVJTTF9JRV9DT0RFQ19DT05GSUcsCisJUlNMX0lFX1JURCwKKwlSU0xfSUVfVEZPX1NUQVRVUywKKwlSU0xfSUVfTExQX0FQRFUsCisJLyogU2llbWVucyB2ZW5kb3Itc3BlY2lmaWMgKi8KKwlSU0xfSUVfU0lFTUVOU19NUlBDSQkJPSAweDQwLAorCVJTTF9JRV9TSUVNRU5TX1BSRUZfQVJFQV9UWVBFCT0gMHg0MywKKwlSU0xfSUVfU0lFTUVOU19JTklOX0NFTExfSE9fUEFSCT0gMHg0NSwKKwlSU0xfSUVfU0lFTUVOU19UUkFDRV9SRUZfTlIJPSAweDQ2LAorCVJTTF9JRV9TSUVNRU5TX0lOVF9UUkFDRV9JRFgJPSAweDQ3LAorCVJTTF9JRV9TSUVNRU5TX0wyX0hEUl9JTkZPCT0gMHg0OCwKKwlSU0xfSUVfU0lFTUVOU19ISUdIRVNUX1JBVEUJPSAweDRlLAorCVJTTF9JRV9TSUVNRU5TX1NVR0dFU1RFRF9SQVRFCT0gMHg0ZiwKKworCS8qIGlwLmFjY2VzcyAqLworCVJTTF9JRV9JUEFDX1NSVFBfQ09ORklHCT0gMHhlMCwKKwlSU0xfSUVfSVBBQ19QUk9YWV9VRFAJPSAweGUxLAorCVJTTF9JRV9JUEFDX0JTQ01QTF9UT1VUCT0gMHhlMiwKKwlSU0xfSUVfSVBBQ19SRU1PVEVfSVAJPSAweGYwLAorCVJTTF9JRV9JUEFDX1JFTU9URV9QT1JUCT0gMHhmMSwKKwlSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRAk9IDB4ZjIsCisJUlNMX0lFX0lQQUNfTE9DQUxfUE9SVAk9IDB4ZjMsCisJUlNMX0lFX0lQQUNfU1BFRUNIX01PREUJPSAweGY0LAorCVJTTF9JRV9JUEFDX0xPQ0FMX0lQCT0gMHhmNSwKKwlSU0xfSUVfSVBBQ19DT05OX1NUQVQJPSAweGY2LAorCVJTTF9JRV9JUEFDX0hPX0NfUEFSTVMJPSAweGY3LAorCVJTTF9JRV9JUEFDX0NPTk5fSUQJPSAweGY4LAorCVJTTF9JRV9JUEFDX1JUUF9DU0RfRk1UCT0gMHhmOSwKKwlSU0xfSUVfSVBBQ19SVFBfSklUX0JVRgk9IDB4ZmEsCisJUlNMX0lFX0lQQUNfUlRQX0NPTVBSCT0gMHhmYiwKKwlSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDI9IDB4ZmMsCisJUlNMX0lFX0lQQUNfUlRQX01QTEVYCT0gMHhmZCwKKwlSU0xfSUVfSVBBQ19SVFBfTVBMRVhfSUQ9IDB4ZmUsCit9OworCisvKiBDaGFwdGVyIDkuMy4xICovCisjZGVmaW5lIFJTTF9DSEFOX05SX01BU0sJMHhmOAorI2RlZmluZSBSU0xfQ0hBTl9CbV9BQ0NIcwkweDA4CisjZGVmaW5lIFJTTF9DSEFOX0xtX0FDQ0hzCTB4MTAJLyogLi4gMHgxOCAqLworI2RlZmluZSBSU0xfQ0hBTl9TRENDSDRfQUNDSAkweDIwCS8qIC4uIDB4MzggKi8KKyNkZWZpbmUgUlNMX0NIQU5fU0RDQ0g4X0FDQ0gJMHg0MAkvKiAuLi4weDc4ICovCisjZGVmaW5lIFJTTF9DSEFOX0JDQ0gJCTB4ODAKKyNkZWZpbmUgUlNMX0NIQU5fUkFDSAkJMHg4OAorI2RlZmluZSBSU0xfQ0hBTl9QQ0hfQUdDSAkweDkwCisKKy8qIENoYXB0ZXIgOS4zLjMgKi8KKyNkZWZpbmUgUlNMX0FDVF9UWVBFX0lOSVRJQUwJMHgwMAorI2RlZmluZSBSU0xfQUNUX1RZUEVfUkVBQ1QJMHg4MAorI2RlZmluZSBSU0xfQUNUX0lOVFJBX0lNTV9BU1MJMHgwMAorI2RlZmluZSBSU0xfQUNUX0lOVFJBX05PUk1fQVNTCTB4MDEKKyNkZWZpbmUgUlNMX0FDVF9JTlRFUl9BU1lOQwkweDAyCisjZGVmaW5lIFJTTF9BQ1RfSU5URVJfU1lOQwkweDAzCisjZGVmaW5lIFJTTF9BQ1RfU0VDT05EX0FERAkweDA0CisjZGVmaW5lIFJTTF9BQ1RfU0VDT05EX01VTFRJCTB4MDUKKworLyogQ2hhcHRlciA5LjMuNiAqLworc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgeworCXVpbnQ4X3QgZHR4X2R0dTsKKwl1aW50OF90IHNwZF9pbmQ7CisJdWludDhfdCBjaGFuX3J0OworCXVpbnQ4X3QgY2hhbl9yYXRlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZGVmaW5lIFJTTF9DTU9EX0RUWHUJCTB4MDEJLyogdXBsaW5rICovCisjZGVmaW5lIFJTTF9DTU9EX0RUWGQJCTB4MDIJLyogZG93bmxpbmsgKi8KK2VudW0gcnNsX2Ntb2Rfc3BkIHsKKwlSU0xfQ01PRF9TUERfU1BFRUNICT0gMHgwMSwKKwlSU0xfQ01PRF9TUERfREFUQQk9IDB4MDIsCisJUlNMX0NNT0RfU1BEX1NJR04JPSAweDAzLAorfTsKKyNkZWZpbmUgUlNMX0NNT0RfQ1JUX1NEQ0NICTB4MDEKKyNkZWZpbmUgUlNMX0NNT0RfQ1JUX1RDSF9CbQkweDA4CS8qIGZ1bGwtcmF0ZSAqLworI2RlZmluZSBSU0xfQ01PRF9DUlRfVENIX0xtCTB4MDkJLyogaGFsZi1yYXRlICovCisvKiBGSVhNRTogTW9yZSBDUlQgdHlwZXMgKi8KKy8qIFNwZWVjaCAqLworI2RlZmluZSBSU0xfQ01PRF9TUF9HU00xCTB4MDEKKyNkZWZpbmUgUlNMX0NNT0RfU1BfR1NNMgkweDExCisjZGVmaW5lIFJTTF9DTU9EX1NQX0dTTTMJMHgyMQorLyogRGF0YSAqLworI2RlZmluZSBSU0xfQ01PRF9TUF9OVF8xNGs1CTB4NTgKKyNkZWZpbmUgUlNMX0NNT0RfU1BfTlRfMTJrMAkweDUwCisjZGVmaW5lIFJTTF9DTU9EX1NQX05UXzZrMAkweDUxCisKKy8qIENoYXB0ZXIgOS4zLjUgKi8KK3N0cnVjdCByc2xfaWVfY2hhbl9pZGVudCB7CisJLyogR1NNIDA0LjA4IDEwLjUuMi41ICovCisJc3RydWN0IHsKKwkJdWludDhfdCBpZWk7CisJCXVpbnQ4X3QgY2hhbl9ucjsJLyogZW5jX2NoYW5fbnIgKi8KKwkJdWludDhfdCBvY3QzOworCQl1aW50OF90IG9jdDQ7CisJfSBjaGFuX2Rlc2M7CisjaWYgMAkvKiBzcGVjIHNheXMgd2UgbmVlZCB0aGlzIGJ1dCBBYmlzc2ltIGRvZXNuJ3QgdXNlIGl0ICovCisJc3RydWN0IHsKKwkJdWludDhfdCB0YWc7CisJCXVpbnQ4X3QgbGVuOworCX0gbW9iaWxlX2FsbG9jOworI2VuZGlmCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciA5LjMuMjIgKi8KKyNkZWZpbmUgUkxMX0NBVVNFX1QyMDBfRVhQSVJFRAkJMHgwMQorI2RlZmluZSBSTExfQ0FVU0VfUkVFU1RfUkVRCQkweDAyCisjZGVmaW5lIFJMTF9DQVVTRV9VTlNPTF9VQV9SRVNQCQkweDAzCisjZGVmaW5lIFJMTF9DQVVTRV9VTlNPTF9ETV9SRVNQCQkweDA0CisjZGVmaW5lIFJMTF9DQVVTRV9VTlNPTF9ETV9SRVNQX01GCTB4MDUKKyNkZWZpbmUgUkxMX0NBVVNFX1VOU09MX1NQUlZfUkVTUAkweDA2CisjZGVmaW5lIFJMTF9DQVVTRV9TRVFfRVJSCQkweDA3CisjZGVmaW5lIFJMTF9DQVVTRV9VRlJNX0lOQ19QQVJBTQkweDA4CisjZGVmaW5lIFJMTF9DQVVTRV9TRlJNX0lOQ19QQVJBTQkweDA5CisjZGVmaW5lIFJMTF9DQVVTRV9JRlJNX0lOQ19NQklUUwkweDBhCisjZGVmaW5lIFJMTF9DQVVTRV9JRlJNX0lOQ19MRU4JCTB4MGIKKyNkZWZpbmUgUkxMX0NBVVNFX0ZSTV9VTklNUEwJCTB4MGMKKyNkZWZpbmUgUkxMX0NBVVNFX1NBQk1fTUYJCTB4MGQKKyNkZWZpbmUgUkxMX0NBVVNFX1NBQk1fSU5GT19OT1RBTEwJMHgwZQorCisvKiBDaGFwdGVyIDkuMy4yNiAqLworI2RlZmluZSBSU0xfRVJSQ0xTX05PUk1BTAkJMHgwMAorI2RlZmluZSBSU0xfRVJSQ0xTX1JFU09VUkNFX1VOQVZBSUwJMHgyMAorI2RlZmluZSBSU0xfRVJSQ0xTX1NFUlZJQ0VfVU5BVkFJTAkweDMwCisjZGVmaW5lIFJTTF9FUlJDTFNfU0VSVklDRV9VTklNUEwJMHg0MAorI2RlZmluZSBSU0xfRVJSQ0xTX0lOVkFMX01TRwkJMHg1MAorI2RlZmluZSBSU0xfRVJSQ0xTX1BST1RPX0VSUk9SCQkweDYwCisjZGVmaW5lIFJTTF9FUlJDTFNfSU5URVJXT1JLSU5HCQkweDcwCisKKy8qIG5vcm1hbCBldmVudCAqLworI2RlZmluZSBSU0xfRVJSX1JBRElPX0lGX0ZBSUwJCTB4MDAKKyNkZWZpbmUgUlNMX0VSUl9SQURJT19MSU5LX0ZBSUwJCTB4MDEKKyNkZWZpbmUgUlNMX0VSUl9IQU5ET1ZFUl9BQ0NfRkFJTAkweDAyCisjZGVmaW5lIFJTTF9FUlJfVEFMS0VSX0FDQ19GQUlMCQkweDAzCisjZGVmaW5lIFJTTF9FUlJfT01fSU5URVJWRU5USU9OCQkweDA3CisjZGVmaW5lIFJTTF9FUlJfTk9STUFMX1VOU1BFQwkJMHgwZgorI2RlZmluZSBSU0xfRVJSX1RfTVNSRlBDSV9FWFAJCTB4MTgKKy8qIHJlc291cmNlIHVuYXZhaWxhYmxlICovCisjZGVmaW5lIFJTTF9FUlJfRVFVSVBNRU5UX0ZBSUwJCTB4MjAKKyNkZWZpbmUgUlNMX0VSUl9SUl9VTkFWQUlMCQkweDIxCisjZGVmaW5lIFJTTF9FUlJfVEVSUl9DSF9GQUlMCQkweDIyCisjZGVmaW5lIFJTTF9FUlJfQ0NDSF9PVkVSTE9BRAkJMHgyMworI2RlZmluZSBSU0xfRVJSX0FDQ0hfT1ZFUkxPQUQJCTB4MjQKKyNkZWZpbmUgUlNMX0VSUl9QUk9DRVNTT1JfT1ZFUkxPQUQJMHgyNQorI2RlZmluZSBSU0xfRVJSX1JFU19VTkFWQUlMCQkweDJmCisvKiBzZXJ2aWNlIG9yIG9wdGlvbiBub3QgYXZhaWxhYmxlICovCisjZGVmaW5lIFJTTF9FUlJfVFJBTlNDX1VOQVZBSUwJCTB4MzAKKyNkZWZpbmUgUlNMX0VSUl9TRVJWX09QVF9VTkFWQUlMCTB4M2YKKy8qIHNlcnZpY2Ugb3Igb3B0aW9uIG5vdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBSU0xfRVJSX0VOQ1JfVU5JTVBMCQkweDQwCisjZGVmaW5lIFJTTF9FUlJfU0VSVl9PUFRfVU5JTVBMCQkweDRmCisvKiBpbnZhbGlkIG1lc3NhZ2UgKi8KKyNkZWZpbmUgUlNMX0VSUl9SQ0hfQUxSX0FDVFZfQUxMT0MJMHg1MAorI2RlZmluZSBSU0xfRVJSX0lOVkFMSURfTUVTU0FHRQkJMHg1ZgorLyogcHJvdG9jb2wgZXJyb3IgKi8KKyNkZWZpbmUgUlNMX0VSUl9NU0dfRElTQ1IJCTB4NjAKKyNkZWZpbmUgUlNMX0VSUl9NU0dfVFlQRQkJMHg2MQorI2RlZmluZSBSU0xfRVJSX01TR19TRVEJCQkweDYyCisjZGVmaW5lIFJTTF9FUlJfSUVfRVJST1IJCTB4NjMKKyNkZWZpbmUgUlNMX0VSUl9NQU5EX0lFX0VSUk9SCQkweDY0CisjZGVmaW5lIFJTTF9FUlJfT1BUX0lFX0VSUk9SCQkweDY1CisjZGVmaW5lIFJTTF9FUlJfSUVfTk9ORVhJU1QJCTB4NjYKKyNkZWZpbmUgUlNMX0VSUl9JRV9MRU5HVEgJCTB4NjcKKyNkZWZpbmUgUlNMX0VSUl9JRV9DT05URU5UCQkweDY4CisjZGVmaW5lIFJTTF9FUlJfUFJPVE8JCQkweDZmCisvKiBpbnRlcndvcmtpbmcgKi8KKyNkZWZpbmUgUlNMX0VSUl9JTlRFUldPUktJTkcJCTB4N2YKKworLyogQ2hhcHRlciA5LjMuMzAgKi8KKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzgJMHgwMAorI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fMQkweDAxCisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT18yCTB4MDIKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzMJMHgwMworI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fNAkweDA0CisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT181CTB4MDUKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzYJMHgwNgorI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fNwkweDA3CisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT18xNgkweDA4CisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT18xNwkweDA5CisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT18yYmlzCTB4MGEKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzJ0ZXIJMHgwYgorI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fNWJpcwkweDBkCisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT181dGVyCTB4MGUKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzEwCTB4MGYKKyNkZWZpbmUgUkVMX0VYVF9NRUFTX09SREVSCTB4NDcKKyNkZWZpbmUgUlNMX01FQVNfSU5GTwkJMHg0OAorI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fMTMJMHgyOAorI2RlZmluZSBSU0xfU1lTVEVNX0lORk9fMnF1YXRlcgkweDI5CisjZGVmaW5lIFJTTF9TWVNURU1fSU5GT185CTB4MmEKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzE4CTB4MmIKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzE5CTB4MmMKKyNkZWZpbmUgUlNMX1NZU1RFTV9JTkZPXzIwCTB4MmQKKworLyogQ2hhcHRlciA5LjMuNDAgKi8KKyNkZWZpbmUgUlNMX0NIQU5ORUVEX0FOWQkweDAwCisjZGVmaW5lIFJTTF9DSEFOTkVFRF9TRENDSAkweDAxCisjZGVmaW5lIFJTTF9DSEFOTkVFRF9UQ0hfRgkweDAyCisjZGVmaW5lIFJTTF9DSEFOTkVFRF9UQ0hfRm9ySAkweDAzCisKKy8qIENoYXB0ZXIgMy4zLjIuMyBCcm9jYXN0IGNvbnRyb2wgY2hhbm5lbCAqLworLyogQ0NDSC1DT05GLCBOQyBpcyBub3QgY29tYmluZWQgKi8KKyNkZWZpbmUgUlNMX0JDQ0hfQ0NDSF9DT05GXzFfTkMJMHgwMAorI2RlZmluZSBSU0xfQkNDSF9DQ0NIX0NPTkZfMV9DCTB4MDEKKyNkZWZpbmUgUlNMX0JDQ0hfQ0NDSF9DT05GXzJfTkMJMHgwMgorI2RlZmluZSBSU0xfQkNDSF9DQ0NIX0NPTkZfM19OQwkweDA0CisjZGVmaW5lIFJTTF9CQ0NIX0NDQ0hfQ09ORl80X05DCTB4MDYKKworLyogQlMtUEEtTUZSTVMgKi8KKyNkZWZpbmUgUlNMX0JTX1BBX01GUk1TXzIJMHgwMAorI2RlZmluZSBSU0xfQlNfUEFfTUZSTVNfMwkweDAxCisjZGVmaW5lIFJTTF9CU19QQV9NRlJNU180CTB4MDIKKyNkZWZpbmUgUlNMX0JTX1BBX01GUk1TXzUJMHgwMworI2RlZmluZSBSU0xfQlNfUEFfTUZSTVNfNgkweDA0CisjZGVmaW5lIFJTTF9CU19QQV9NRlJNU183CTB4MDUKKyNkZWZpbmUgUlNMX0JTX1BBX01GUk1TXzgJMHgwNgorI2RlZmluZSBSU0xfQlNfUEFfTUZSTVNfOQkweDA3CisKKy8qIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEWzJdICovCitlbnVtIHJzbF9pcGFjX3J0cF9wYXlsb2FkIHsKKwlSU0xfSVBBQ19SVFBfR1NNCT0gMSwKKwlSU0xfSVBBQ19SVFBfRUZSLAorCVJTTF9JUEFDX1JUUF9BTVIsCisJUlNMX0lQQUNfUlRQX0NTRCwKKwlSU0xfSVBBQ19SVFBfTVVYLAorfTsKKworLyogUlNMX0lFX0lQQUNfU1BFRUNIX01PREUsIGxvd2VyIGZvdXIgYml0cyAqLworZW51bSByc2xfaXBhY19zcGVlY2hfbW9kZV9zIHsKKwlSU0xfSVBBQ19TUEVFQ0hfR1NNX0ZSID0gMCwJLyogR1NNIEZSIChUeXBlIDEsIEZTKSAqLworCVJTTF9JUEFDX1NQRUVDSF9HU01fRUZSID0gMSwJLyogR1NNIEVGUiAoVHlwZSAyLCBGUykgKi8KKwlSU0xfSVBBQ19TUEVFQ0hfR1NNX0FNUl9GUiA9IDIsCS8qIEdTTSBBTVIvRlIgKFR5cGUgMywgRlMpICovCisJUlNMX0lQQUNfU1BFRUNIX0dTTV9IUiA9IDMsCS8qIEdTTSBIUiAoVHlwZSAxLCBIUykgKi8KKwlSU0xfSVBBQ19TUEVFQ0hfR1NNX0FNUl9IUiA9IDUsCS8qIEdTTSBBTVIvaHIgKFR5cGUgMywgSFMpICovCisJUlNMX0lQQUNfU1BFRUNIX0FTX1JUUCA9IDB4ZiwJLyogQXMgc3BlY2lmaWVkIGJ5IFJUUCBQYXlsb2FkIElFICovCit9OworLyogUlNMX0lFX0lQQUNfU1BFRUNIX01PREUsIHVwcGVyIGZvdXIgYml0cyAqLworZW51bSByc2xfaXBhY19zcGVlY2hfbW9kZV9tIHsKKwlSU0xfSVBBQ19TUEVFQ0hfTV9SWFRYID0gMCwJLyogU2VuZCBhbmQgUmVjZWl2ZSAqLworCVJTTF9JUEFDX1NQRUVDSF9NX1JYID0gMSwJLyogUmVjZWl2ZSBvbmx5ICovCisJUlNMX0lQQUNfU1BFRUNIX01fVFggPSAyLAkvKiBTZW5kIG9ubHkgKi8KK307CisKKy8qIFJTTF9JRV9JUEFDX1JUUF9DU0RfRk1ULCBsb3dlciBmb3VyIGJpdHMgKi8KK2VudW0gcnNsX2lwYWNfcnRwX2NzZF9mb3JtYXRfZCB7CisJUlNMX0lQQUNfUlRQX0NTRF9FWFRfVFJBVSA9IDAsCisJUlNMX0lQQUNfUlRQX0NTRF9OT05fVFJBVSA9IDEsCisJUlNMX0lQQUNfUlRQX0NTRF9UUkFVX0JUUyA9IDIsCisJUlNMX0lQQUNfUlRQX0NTRF9JV0ZfRlJFRSA9IDMsCit9OworLyogUlNMX0lFX0lQQUNfUlRQX0NTRF9GTVQsIHVwcGVyIGZvdXIgYml0cyAqLworZW51bSByc2xfaXBhY19ydHBfY3NkX2Zvcm1hdF9pciB7CisJUlNMX0lQQUNfUlRQX0NTRF9JUl84ayA9IDAsCisJUlNMX0lQQUNfUlRQX0NTRF9JUl8xNmsgPSAxLAorCVJTTF9JUEFDX1JUUF9DU0RfSVJfMzJrID0gMiwKKwlSU0xfSVBBQ19SVFBfQ1NEX0lSXzY0ayA9IDMsCit9OworCisvKiBTaWVtZW5zIHZlbmRvci1zcGVjaWZpYyBSU0wgZXh0ZW5zaW9ucyAqLworc3RydWN0IHJzbF9tcnBjaSB7CisJdWludDhfdCBwb3dlcl9jbGFzczozLAorCQkgdmdjc19jYXBhYmxlOjEsCisJCSB2YnNfY2FwYWJsZToxLAorCQkgZ3NtX3BoYXNlOjI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworZW51bSByc2xfbXJwY2lfcHdyY2xhc3MgeworCVJTTF9NUlBDSV9QV1JDXzEJPSAwLAorCVJTTF9NUlBDSV9QV1JDXzIJPSAxLAorCVJTTF9NUlBDSV9QV1JDXzMJPSAyLAorCVJTTF9NUlBDSV9QV1JDXzQJPSAzLAorCVJTTF9NUlBDSV9QV1JDXzUJPSA0LAorfTsKK2VudW0gcnNsX21ycGNpX3BoYXNlIHsKKwlSU0xfTVJQQ0lfUEhBU0VfMQk9IDAsCisJLyogcmVzZXJ2ZWQgKi8KKwlSU0xfTVJQQ0lfUEhBU0VfMgk9IDIsCisJUlNMX01SUENJX1BIQVNFXzJQTFVTCT0gMywKK307CisKKworI2VuZGlmIC8qIFBST1RPX0dTTV8wOF81OF9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMTJfMjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FlNDVkCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMTJfMjEuaApAQCAtMCwwICsxLDcxMyBAQAorI2lmbmRlZiBQUk9UT19HU01fMTJfMjFfSAorI2RlZmluZSBQUk9UT19HU01fMTJfMjFfSAorCisvKiBHU00gTmV0d29yayBNYW5hZ2VtZW50IG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDEyLjIxIHZlcnNpb24gOC4wLjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNjIzIFY4LjAuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorCisvKiBnZW5lcmljIGhlYWRlciBpbiBmcm9udCBvZiBldmVyeSBPTUwgbWVzc2FnZSBhY2NvcmRpbmcgdG8gVFMgMDguNTkgKi8KK3N0cnVjdCBhYmlzX29tX2hkciB7CisJdWludDhfdAltZGlzYzsKKwl1aW50OF90CXBsYWNlbWVudDsKKwl1aW50OF90CXNlcXVlbmNlOworCXVpbnQ4X3QJbGVuZ3RoOworCXVpbnQ4X3QJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIEFCSVNfT01fTURJU0NfRk9NCQkweDgwCisjZGVmaW5lIEFCSVNfT01fTURJU0NfTU1JCQkweDQwCisjZGVmaW5lIEFCSVNfT01fTURJU0NfVFJBVQkJMHgyMAorI2RlZmluZSBBQklTX09NX01ESVNDX01BTlVGCQkweDEwCisjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX09OTFkJCTB4ODAKKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfRklSU1QgCTB4NDAKKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfTUlERExFCTB4MjAKKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfTEFTVAkJMHgxMAorCitzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCB7CisJdWludDhfdAlidHNfbnI7CisJdWludDhfdAl0cnhfbnI7CisJdWludDhfdAl0c19ucjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgYWJpc19vbV9mb21faGRyIHsKKwl1aW50OF90CW1zZ190eXBlOworCXVpbnQ4X3QJb2JqX2NsYXNzOworCXN0cnVjdCBhYmlzX29tX29ial9pbnN0CW9ial9pbnN0OworCXVpbnQ4X3QJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIEFCSVNfT01fRk9NX0hEUl9TSVpFCShzaXplb2Yoc3RydWN0IGFiaXNfb21faGRyKSArIHNpemVvZihzdHJ1Y3QgYWJpc19vbV9mb21faGRyKSkKKworLyogU2VjdGlvbiA5LjE6IE1lc3NhZ2UgVHlwZXMgKi8KK2VudW0gYWJpc19ubV9tc2d0eXBlIHsKKwkvKiBTVyBEb3dubG9hZCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisJTk1fTVRfTE9BRF9JTklUCQkJPSAweDAxLAorCU5NX01UX0xPQURfSU5JVF9BQ0ssCisJTk1fTVRfTE9BRF9JTklUX05BQ0ssCisJTk1fTVRfTE9BRF9TRUcsCisJTk1fTVRfTE9BRF9TRUdfQUNLLAorCU5NX01UX0xPQURfQUJPUlQsCisJTk1fTVRfTE9BRF9FTkQsCisJTk1fTVRfTE9BRF9FTkRfQUNLLAorCU5NX01UX0xPQURfRU5EX05BQ0ssCisJTk1fTVRfU1dfQUNUX1JFUSwJCS8qIEJUUy0+QlNDICovCisJTk1fTVRfU1dfQUNUX1JFUV9BQ0ssCisJTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAorCU5NX01UX0FDVElWQVRFX1NXLAkJLyogQlNDLT5CVFMgKi8KKwlOTV9NVF9BQ1RJVkFURV9TV19BQ0ssCisJTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywKKwlOTV9NVF9TV19BQ1RJVkFURURfUkVQLAkJLyogMHgxMCAqLworCS8qIEEtYmlzIEludGVyZmFjZSBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisJTk1fTVRfRVNUQUJMSVNIX1RFSQkJPSAweDIxLAorCU5NX01UX0VTVEFCTElTSF9URUlfQUNLLAorCU5NX01UX0VTVEFCTElTSF9URUlfTkFDSywKKwlOTV9NVF9DT05OX1RFUlJfU0lHTiwKKwlOTV9NVF9DT05OX1RFUlJfU0lHTl9BQ0ssCisJTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywKKwlOTV9NVF9ESVNDX1RFUlJfU0lHTiwKKwlOTV9NVF9ESVNDX1RFUlJfU0lHTl9BQ0ssCisJTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywKKwlOTV9NVF9DT05OX1RFUlJfVFJBRiwKKwlOTV9NVF9DT05OX1RFUlJfVFJBRl9BQ0ssCisJTk1fTVRfQ09OTl9URVJSX1RSQUZfTkFDSywKKwlOTV9NVF9ESVNDX1RFUlJfVFJBRiwKKwlOTV9NVF9ESVNDX1RFUlJfVFJBRl9BQ0ssCisJTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywKKwkvKiBUcmFuc21pc3Npb24gTWFuYWdlbWVudCBNZXNzYWdlcyAqLworCU5NX01UX0NPTk5fTURST1BfTElOSwkJPSAweDMxLAorCU5NX01UX0NPTk5fTURST1BfTElOS19BQ0ssCisJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCisJTk1fTVRfRElTQ19NRFJPUF9MSU5LLAorCU5NX01UX0RJU0NfTURST1BfTElOS19BQ0ssCisJTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCisJLyogQWlyIEludGVyZmFjZSBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisJTk1fTVRfU0VUX0JUU19BVFRSCQk9IDB4NDEsCisJTk1fTVRfU0VUX0JUU19BVFRSX0FDSywKKwlOTV9NVF9TRVRfQlRTX0FUVFJfTkFDSywKKwlOTV9NVF9TRVRfUkFESU9fQVRUUiwKKwlOTV9NVF9TRVRfUkFESU9fQVRUUl9BQ0ssCisJTk1fTVRfU0VUX1JBRElPX0FUVFJfTkFDSywKKwlOTV9NVF9TRVRfQ0hBTl9BVFRSLAorCU5NX01UX1NFVF9DSEFOX0FUVFJfQUNLLAorCU5NX01UX1NFVF9DSEFOX0FUVFJfTkFDSywKKwkvKiBUZXN0IE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKwlOTV9NVF9QRVJGX1RFU1QJCQk9IDB4NTEsCisJTk1fTVRfUEVSRl9URVNUX0FDSywKKwlOTV9NVF9QRVJGX1RFU1RfTkFDSywKKwlOTV9NVF9URVNUX1JFUCwKKwlOTV9NVF9TRU5EX1RFU1RfUkVQLAorCU5NX01UX1NFTkRfVEVTVF9SRVBfQUNLLAorCU5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywKKwlOTV9NVF9TVE9QX1RFU1QsCisJTk1fTVRfU1RPUF9URVNUX0FDSywKKwlOTV9NVF9TVE9QX1RFU1RfTkFDSywKKwkvKiBTdGF0ZSBNYW5hZ2VtZW50IGFuZCBFdmVudCBSZXBvcnQgTWVzc2FnZXMgKi8KKwlOTV9NVF9TVEFURUNIR19FVkVOVF9SRVAJPSAweDYxLAorCU5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAorCU5NX01UX1NUT1BfRVZFTlRfUkVQLAorCU5NX01UX1NUT1BfRVZFTlRfUkVQX0FDSywKKwlOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAorCU5NX01UX1JFU1RfRVZFTlRfUkVQLAorCU5NX01UX1JFU1RfRVZFTlRfUkVQX0FDSywKKwlOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAorCU5NX01UX0NIR19BRE1fU1RBVEUsCisJTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0ssCisJTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAorCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRLAorCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRX0FDSywKKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAorCU5NX01UX1JFUF9PVVRTVF9BTEFSTVMJCT0gMHg5MywKKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX0FDSywKKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCisJLyogRXF1aXBtZW50IE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKwlOTV9NVF9DSEFOR0VPVkVSCQk9IDB4NzEsCisJTk1fTVRfQ0hBTkdFT1ZFUl9BQ0ssCisJTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLLAorCU5NX01UX09QU1RBUlQsCisJTk1fTVRfT1BTVEFSVF9BQ0ssCisJTk1fTVRfT1BTVEFSVF9OQUNLLAorCU5NX01UX1JFSU5JVCwKKwlOTV9NVF9SRUlOSVRfQUNLLAorCU5NX01UX1JFSU5JVF9OQUNLLAorCU5NX01UX1NFVF9TSVRFX09VVCwJCS8qIEJTMTE6IGdldCBhbGFybSA/IT8gKi8KKwlOTV9NVF9TRVRfU0lURV9PVVRfQUNLLAorCU5NX01UX1NFVF9TSVRFX09VVF9OQUNLLAorCU5NX01UX0NIR19IV19DT05GCQk9IDB4OTAsCisJTk1fTVRfQ0hHX0hXX0NPTkZfQUNLLAorCU5NX01UX0NIR19IV19DT05GX05BQ0ssCisJLyogTWVhc3VyZW1lbnQgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworCU5NX01UX01FQVNfUkVTX1JFUQkJPSAweDhhLAorCU5NX01UX01FQVNfUkVTX1JFU1AsCisJTk1fTVRfU1RPUF9NRUFTLAorCU5NX01UX1NUQVJUX01FQVMsCisJLyogT3RoZXIgTWVzc2FnZXMgKi8KKwlOTV9NVF9HRVRfQVRUUgkJCT0gMHg4MSwKKwlOTV9NVF9HRVRfQVRUUl9SRVNQLAorCU5NX01UX0dFVF9BVFRSX05BQ0ssCisJTk1fTVRfU0VUX0FMQVJNX1RIUkVTLAorCU5NX01UX1NFVF9BTEFSTV9USFJFU19BQ0ssCisJTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0ssCit9OworCitlbnVtIGFiaXNfbm1fbXNndHlwZV9iczExIHsKKwlOTV9NVF9CUzExX1JFU0VUX1JFU09VUkNFCT0gMHg3NCwKKworCU5NX01UX0JTMTFfQkVHSU5fREJfVFgJCT0gMHhhMywKKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX0FDSywKKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCisJTk1fTVRfQlMxMV9FTkRfREJfVFgJCT0gMHhhNiwKKwlOTV9NVF9CUzExX0VORF9EQl9UWF9BQ0ssCisJTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywKKwlOTV9NVF9CUzExX0NSRUFURV9PQkoJCT0gMHhhOSwKKwlOTV9NVF9CUzExX0NSRUFURV9PQkpfQUNLLAorCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAorCU5NX01UX0JTMTFfREVMRVRFX09CSgkJPSAweGFjLAorCU5NX01UX0JTMTFfREVMRVRFX09CSl9BQ0ssCisJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCisKKwlOTV9NVF9CUzExX1NFVF9BVFRSCQk9IDB4ZDAsCisJTk1fTVRfQlMxMV9TRVRfQVRUUl9BQ0ssCisJTk1fTVRfQlMxMV9TRVRfQVRUUl9OQUNLLAorCU5NX01UX0JTMTFfTE1UX1NFU1NJT04JCT0gMHhkYywKKworCU5NX01UX0JTMTFfR0VUX1NUQVRFCQk9IDB4ZTMsCisJTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLLAorCU5NX01UX0JTMTFfTE1UX0xPR09OCQk9IDB4ZTUsCisJTk1fTVRfQlMxMV9MTVRfTE9HT05fQUNLLAorCU5NX01UX0JTMTFfUkVTVEFSVAkJPSAweGU3LAorCU5NX01UX0JTMTFfUkVTVEFSVF9BQ0ssCisJTk1fTVRfQlMxMV9ESVNDT05ORUNUCQk9IDB4ZTksCisJTk1fTVRfQlMxMV9ESVNDT05ORUNUX0FDSywKKwlOTV9NVF9CUzExX0xNVF9MT0dPRkYJCT0gMHhlYywKKwlOTV9NVF9CUzExX0xNVF9MT0dPRkZfQUNLLAorCU5NX01UX0JTMTFfUkVDT05ORUNUCQk9IDB4ZjEsCisJTk1fTVRfQlMxMV9SRUNPTk5FQ1RfQUNLLAorfTsKKworZW51bSBhYmlzX25tX21zZ3R5cGVfaXBhY2MgeworCU5NX01UX0lQQUNDX1JFU1RBUlQJCT0gMHg4NywKKwlOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSywKKwlOTV9NVF9JUEFDQ19SRVNUQVJUX05BQ0ssCisJTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1QJCT0gMHhlMCwKKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9BQ0ssCisJTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfTkFDSywKKwlOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVAk9IDB4ZTMsCisJTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfQUNLLAorCU5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX05BQ0ssCisJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGCQk9IDB4ZTYsCisJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX0FDSywKKwlOTV9NVF9JUEFDQ19DT05OX1RSQUZfTkFDSywKKwlOTV9NVF9JUEFDQ19ERUZfQk9PVF9TVwkJPSAweGVjLAorCU5NX01UX0lQQUNDX0RFRl9CT09UX1NXX0FDSywKKwlNTl9NVF9JUEFDQ19ERUZfQk9PVF9TV19OQUNLLAorCU5NX01UX0lQQUNDX1NFVF9OVkFUVFIJCT0gMHhlZiwKKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX0FDSywKKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0ssCisJTk1fTVRfSVBBQ0NfR0VUX05WQVRUUgkJPSAweGYyLAorCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfQUNLLAorCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSywKKwlOTV9NVF9JUEFDQ19TRVRfQVRUUgkJPSAweGY1LAorCU5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSywKKwlOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLLAorfTsKKworZW51bSBhYmlzX25tX2JzMTFfY2VsbF9hbGxvYyB7CisJTk1fQlMxMV9DQU5SX0dTTQk9IDB4MDAsCisJTk1fQlMxMV9DQU5SX0RDUzE4MDAJPSAweDAxLAorfTsKKworLyogU2VjdGlvbiA5LjI6IE9iamVjdCBDbGFzcyAqLworZW51bSBhYmlzX25tX29ial9jbGFzcyB7CisJTk1fT0NfU0lURV9NQU5BR0VSCQk9IDB4MDAsCisJTk1fT0NfQlRTLAorCU5NX09DX1JBRElPX0NBUlJJRVIsCisJTk1fT0NfQ0hBTk5FTCwKKwlOTV9PQ19CQVNFQl9UUkFOU0MsCisJLyogUkZVOiAwNS1GRSAqLworCisJTk1fT0NfSVBBQ19FMV9UUlVOSwkJPSAweDBlLAorCU5NX09DX0lQQUNfRTFfUE9SVAkJPSAweDBmLAorCU5NX09DX0lQQUNfRTFfQ0hBTgkJPSAweDEwLAorCU5NX09DX0lQQUNfQ0xLX01PRFVMRQkJPSAweDIyLAorCisJTk1fT0NfQlMxMV9BREpDCQkJPSAweGEwLAorCU5NX09DX0JTMTFfSEFORE9WRVIJCT0gMHhhMSwKKwlOTV9PQ19CUzExX1BXUl9DVFJMCQk9IDB4YTIsCisJTk1fT0NfQlMxMV9CVFNFCQkJPSAweGEzLAkJLyogTE1UPyAqLworCU5NX09DX0JTMTFfUkFDSwkJCT0gMHhhNCwKKwlOTV9PQ19CUzExCQkJPSAweGE1LAkJLyogMDE6IEFMQ08gKi8KKwlOTV9PQ19CUzExX1RFU1QJCQk9IDB4YTYsCisJTk1fT0NfQlMxMV9FTlZBQlRTRQkJPSAweGE4LAorCU5NX09DX0JTMTFfQlBPUlQJCT0gMHhhOSwKKworCU5NX09DX0dQUlNfTlNFCQkJPSAweGYwLAorCU5NX09DX0dQUlNfQ0VMTAkJCT0gMHhmMSwKKwlOTV9PQ19HUFJTX05TVkMJCQk9IDB4ZjIsCisKKwlOTV9PQ19OVUxMCQkJPSAweGZmLAorfTsKKworLyogU2VjdGlvbiA5LjQ6IEF0dHJpYnV0ZXMgKi8KK2VudW0gYWJpc19ubV9hdHRyIHsKKwlOTV9BVFRfQUJJU19DSEFOTkVMCT0gMHgwMSwKKwlOTV9BVFRfQUREX0lORk8sCisJTk1fQVRUX0FERF9URVhULAorCU5NX0FUVF9BRE1fU1RBVEUsCisJTk1fQVRUX0FSRkNOX0xJU1QsCisJTk1fQVRUX0FVVE9OX1JFUE9SVCwKKwlOTV9BVFRfQVZBSUxfU1RBVFVTLAorCU5NX0FUVF9CQ0NIX0FSRkNOLAorCU5NX0FUVF9CU0lDLAorCU5NX0FUVF9CVFNfQUlSX1RJTUVSLAorCU5NX0FUVF9DQ0NIX0xfSV9QLAorCU5NX0FUVF9DQ0NIX0xfVCwKKwlOTV9BVFRfQ0hBTl9DT01CLAorCU5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwKKwlOTV9BVFRfREVTVCwKKwkvKiByZXMgKi8KKwlOTV9BVFRfRVZFTlRfVFlQRQk9IDB4MTEsIC8qIEJTMTE6IGZpbGUgZGF0YSA/IT8gKi8KKwlOTV9BVFRfRklMRV9JRCwKKwlOTV9BVFRfRklMRV9WRVJTSU9OLAorCU5NX0FUVF9HU01fVElNRSwKKwlOTV9BVFRfSFNOLAorCU5NX0FUVF9IV19DT05GSUcsCisJTk1fQVRUX0hXX0RFU0MsCisJTk1fQVRUX0lOVEFWRV9QQVJBTSwKKwlOTV9BVFRfSU5URVJGX0JPVU5ELAorCU5NX0FUVF9MSVNUX1JFUV9BVFRSLAorCU5NX0FUVF9NQUlPLAorCU5NX0FUVF9NQU5VRl9TVEFURSwKKwlOTV9BVFRfTUFOVUZfVEhSRVNILAorCU5NX0FUVF9NQU5VRl9JRCwKKwlOTV9BVFRfTUFYX1RBLAorCU5NX0FUVF9NRFJPUF9MSU5LLAkvKiAweDIwICovCisJTk1fQVRUX01EUk9QX05FWFQsCisJTk1fQVRUX05BQ0tfQ0FVU0VTLAorCU5NX0FUVF9OWTEsCisJTk1fQVRUX09QRVJfU1RBVEUsCisJTk1fQVRUX09WRVJMX1BFUklPRCwKKwlOTV9BVFRfUEhZU19DT05GLAorCU5NX0FUVF9QT1dFUl9DTEFTUywKKwlOTV9BVFRfUE9XRVJfVEhSRVNILAorCU5NX0FUVF9QUk9CX0NBVVNFLAorCU5NX0FUVF9SQUNIX0JfVEhSRVNILAorCU5NX0FUVF9MREFWR19TTE9UUywKKwlOTV9BVFRfUkFEX1NVQkMsCisJTk1fQVRUX1JGX01BWFBPV1JfUiwKKwlOTV9BVFRfU0lURV9JTlBVVFMsCisJTk1fQVRUX1NJVEVfT1VUUFVUUywKKwlOTV9BVFRfU09VUkNFLAkJLyogMHgzMCAqLworCU5NX0FUVF9TUEVDX1BST0IsCisJTk1fQVRUX1NUQVJUX1RJTUUsCisJTk1fQVRUX1QyMDAsCisJTk1fQVRUX1RFSSwKKwlOTV9BVFRfVEVTVF9EVVIsCisJTk1fQVRUX1RFU1RfTk8sCisJTk1fQVRUX1RFU1RfUkVQT1JULAorCU5NX0FUVF9WU1dSX1RIUkVTSCwKKwlOTV9BVFRfV0lORE9XX1NJWkUsCisJLyogUmVzICAqLworCU5NX0FUVF9CUzExX1JTU0lfT0ZGUwk9IDB4M2QsCisJTk1fQVRUX0JTMTFfVFhQV1IJPSAweDNlLAorCU5NX0FUVF9CUzExX0RJVkVSU0lUWQk9IDB4M2YsCisJLyogUmVzICAqLworCU5NX0FUVF9UU0MJCT0gMHg0MCwKKwlOTV9BVFRfU1dfQ09ORklHLAorCU5NX0FUVF9TV19ERVNDUiwKKwlOTV9BVFRfU0VWRVJJVFksCisJTk1fQVRUX0dFVF9BUkksCisJTk1fQVRUX0hXX0NPTkZfQ0hHLAorCU5NX0FUVF9PVVRTVF9BTEFSTSwKKwlOTV9BVFRfRklMRV9EQVRBLAorCU5NX0FUVF9NRUFTX1JFUywKKwlOTV9BVFRfTUVBU19UWVBFLAorCisJTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8JPSAweDRjLAorCU5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PCT0gMHg0ZiwKKworCU5NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMCT0gMHg1NSwKKwlOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UJPSAweDU4LAorCisJTk1fQVRUX0JTMTFfQUxMX1RFU1RfQ0FURwk9IDB4NjAsCisJTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywKKwlOTV9BVFRfQlMxMV9DRUxMX0FMTE9DX05SLAorCU5NX0FUVF9CUzExX0NFTExfR0xPQkFMX0lELAorCU5NX0FUVF9CUzExX0VOQV9JTlRFUkZfQ0xBU1MJPSAweDY2LAorCU5NX0FUVF9CUzExX0VOQV9JTlRfSU5URUNfSEFORE8JPSAweDY3LAorCU5NX0FUVF9CUzExX0VOQV9JTlRfSU5UUkNfSEFORE8JPSAweDY4LAorCU5NX0FUVF9CUzExX0VOQV9NU19QV1JfQ1RSTAk9IDB4NjksCisJTk1fQVRUX0JTMTFfRU5BX1BXUl9CREdUX0hPCT0gMHg2YSwKKwlOTV9BVFRfQlMxMV9FTkFfUFdSX0NUUkxfUkxGVwk9IDB4NmIsCisJTk1fQVRUX0JTMTFfRU5BX1JYTEVWX0hPCT0gMHg2YywKKwlOTV9BVFRfQlMxMV9FTkFfUlhRVUFMX0hPCT0gMHg2ZCwKKwlOTV9BVFRfQlMxMV9GQUNDSF9RVUFMCQk9IDB4NmUsCisKKwlOTV9BVFRfSVBBQ0NfRFNUX0lQCQk9IDB4ODAsCisJTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUCT0gMHg4MSwKKwlOTV9BVFRfSVBBQ0NfU1NSQwkJPSAweDgyLAorCU5NX0FUVF9JUEFDQ19SVFBfUEFZTERfVFlQRQk9IDB4ODMsCisJTk1fQVRUX0lQQUNDX0JBU0VCX0lECQk9IDB4ODQsCisJTk1fQVRUX0lQQUNDX1NUUkVBTV9JRAkJPSAweDg1LAorCU5NX0FUVF9JUEFDQ19OVl9GTEFHUwkJPSAweDg2LAorCU5NX0FUVF9JUEFDQ19GUkVRX0NUUkwJCT0gMHg4NywKKwlOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHCT0gMHg4OCwKKwlOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkcJPSAweDg5LAorCU5NX0FUVF9JUEFDQ19JUF9JRl9DRkcJCT0gMHg4YSwJCS8qIElQIGludGVyZmFjZSAqLworCU5NX0FUVF9JUEFDQ19JUF9HV19DRkcJCT0gMHg4YiwJCS8qIElQIGdhdGV3YXkgKi8KKwlOTV9BVFRfSVBBQ0NfSU5fU0VSVl9USU1FCT0gMHg4YywKKwlOTV9BVFRfSVBBQ0NfVFJYX0JUU19BU1MJPSAweDhkLAorCU5NX0FUVF9JUEFDQ19MT0NBVElPTgkJPSAweDhlLAkJLyogc3RyaW5nIGRlc2NyaWJpbmcgbG9jYXRpb24gKi8KKwlOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGRwkJPSAweDhmLAorCU5NX0FUVF9JUEFDQ19GSUxFX0RBVEEJCT0gMHg5MCwKKwlOTV9BVFRfSVBBQ0NfVU5JVF9JRAkJPSAweDkxLAkJLyogU2l0ZS9CVFMvVFJYICovCisJTk1fQVRUX0lQQUNDX1BBUkVOVF9VTklUX0lECT0gMHg5MiwKKwlOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FCQk9IDB4OTMsCQkvKiBkZWZhdWx0OiBuYnRzLTxtYWMtYXMtc3RyaW5nPiAqLworCU5NX0FUVF9JUEFDQ19TTk1QX0NGRwkJPSAweDk0LAorCU5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVAk9IDB4OTUsCisJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0ZCX1RPVVQJPSAweDk2LAorCU5NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHCQk9IDB4OTcsCisJTk1fQVRUX0lQQUNDX1RJTUlOR19CVVMJCT0gMHg5OCwKKwlOTV9BVFRfSVBBQ0NfQ0dJCQk9IDB4OTksCisJTk1fQVRUX0lQQUNDX1JBQwkJPSAweDlhLAorCU5NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTgk9IDB4OWIsCisJTk1fQVRUX0lQQUNDX0dQUlNfUEFHSU5HX0NGRwk9IDB4OWMsCisJTk1fQVRUX0lQQUNDX05TRUkJCT0gMHg5ZCwKKwlOTV9BVFRfSVBBQ0NfQlZDSQkJPSAweDllLAorCU5NX0FUVF9JUEFDQ19OU1ZDSQkJPSAweDlmLAorCU5NX0FUVF9JUEFDQ19OU19DRkcJCT0gMHhhMCwKKwlOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHCQk9IDB4YTEsCisJTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHCT0gMHhhMiwKKwlOTV9BVFRfSVBBQ0NfUkxDX0NGRwkJPSAweGEzLAkKKwlOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNUCT0gMHhhNCwKKwlOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1QJPSAweGE1LAorCU5NX0FUVF9JUEFDQ19USUJfQ09OVFJPTAk9IDB4YTYsCisJTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVMJPSAweGE3LAorCU5NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FUwk9IDB4YTgsCisJTk1fQVRUX0lQQUNDX1JMQ19DRkdfMgkJPSAweGE5LAorCU5NX0FUVF9JUEFDQ19IRUFSVEJfVE9VVAk9IDB4YWEsCisJTk1fQVRUX0lQQUNDX1VQVElNRQkJPSAweGFiLAorCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzMJCT0gMHhhYywKKwlOTV9BVFRfSVBBQ0NfU1NMX0NGRwkJPSAweGFkLAorCU5NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEUJPSAweGFlLAorCU5NX0FUVF9JUEFDQ19JTUxfU1NMX1NUQVRFCT0gMHhhZiwKKwlOTV9BVFRfSVBBQ0NfUkVWT0NfREFURQkJPSAweGIwLAorCisKKwlOTV9BVFRfQlMxMV9SRl9SRVNfSU5EX1BFUgk9IDB4OGYsCisJCisJTk1fQVRUX0JTMTFfUlhfTEVWX01JTl9DRUxMCT0gMHg5MCwKKwlOTV9BVFRfQlMxMV9BQklTX0VYVF9USU1FCT0gMHg5MSwKKwlOTV9BVFRfQlMxMV9USU1FUl9IT19SRVFVRVNUCT0gMHg5MiwKKwlOTV9BVFRfQlMxMV9USU1FUl9OQ0VMTAkJPSAweDkzLAorCU5NX0FUVF9CUzExX1RTWU5DCQk9IDB4OTQsCisJTk1fQVRUX0JTMTFfVFRSQVUJCT0gMHg5NSwKKwlOTV9BVFRfQlMxMV9FTVJHX0NGR19NRU1CRVIJPSAweDliLAorCU5NX0FUVF9CUzExX1RSWF9BUkVBCQk9IDB4OWYsCisKKwlOTV9BVFRfQlMxMV9CQ0NIX1JFQ09ORgkJPSAweGQ3LAorCU5NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0gJPSAweGEwLAorCU5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUwk9IDB4YTEsCisJTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWQk9IDB4YTMsCisJTk1fQVRUX0JTMTFfQ0NMS19UWVBFCQk9IDB4YTQsCisJTk1fQVRUX0JTMTFfSU5QX0lNUEVEQU5DRQk9IDB4YWEsCisJTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFCT0gMHhhYiwKKwlOTV9BVFRfQlMxMV9MSU5FX0NGRwkJPSAweGFjLAorCU5NX0FUVF9CUzExX0xJX1BPUlRfMQkJPSAweGFkLAorCU5NX0FUVF9CUzExX0xJX1BPUlRfMgkJPSAweGFlLAorCisJTk1fQVRUX0JTMTFfTDFfUkVNX0FMTV9UWVBFCT0gMHhiMCwKKwlOTV9BVFRfQlMxMV9TV19MT0FEX0lOVEVOREVECT0gMHhiYiwKKwlOTV9BVFRfQlMxMV9TV19MT0FEX1NBRkVUWQk9IDB4YmMsCisJTk1fQVRUX0JTMTFfU1dfTE9BRF9TVE9SRUQJPSAweGJkLAorCisJTk1fQVRUX0JTMTFfVkVORE9SX05BTUUJCT0gMHhjMSwKKwlOTV9BVFRfQlMxMV9IT1BQSU5HX01PREUJPSAweGM1LAorCU5NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OCT0gMHhjNiwKKwlOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRQk9IDB4YzcsCisJTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVgk9IDB4YzgsCisJTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRQk9IDB4YzksCisKKwlOTV9BVFRfQlMxMV9MMV9DT05UUk9MX1RTCT0gMHhkOCwKKwlOTV9BVFRfQlMxMV9SQURJT19NRUFTX0dSQU4JPSAweGRjLAkvKiBpbiBTQUNDSCBtdWx0aWZyYW1lcyAqLworCU5NX0FUVF9CUzExX1JBRElPX01FQVNfUkVQCT0gMHhkZCwKKworCU5NX0FUVF9CUzExX1NIX0xBUERfSU5UX1RJTUVSCT0gMHhlOCwKKworCU5NX0FUVF9CUzExX0JUU19TVEFURQkJPSAweGYwLAorCU5NX0FUVF9CUzExX0UxX1NUQVRFCQk9IDB4ZjEsCisJTk1fQVRUX0JTMTFfUExMCQkJPSAweGYyLAorCU5NX0FUVF9CUzExX1JYX09GRlNFVAkJPSAweGYzLAorCU5NX0FUVF9CUzExX0FOVF9UWVBFCQk9IDB4ZjQsCisJTk1fQVRUX0JTMTFfUExMX01PREUJCT0gMHhmYywKKwlOTV9BVFRfQlMxMV9QQVNTV09SRAkJPSAweGZkLAorfTsKKyNkZWZpbmUgTk1fQVRUX0JTMTFfRklMRV9EQVRBCU5NX0FUVF9FVkVOVF9UWVBFCisKKy8qIFNlY3Rpb24gOS40LjQ6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCitlbnVtIGFiaXNfbm1fYWRtX3N0YXRlIHsKKwlOTV9TVEFURV9MT0NLRUQJCT0gMHgwMSwKKwlOTV9TVEFURV9VTkxPQ0tFRAk9IDB4MDIsCisJTk1fU1RBVEVfU0hVVERPV04JPSAweDAzLAorCU5NX1NUQVRFX05VTEwJCT0gMHhmZiwKK307CisKKy8qIFNlY3Rpb24gOS40Ljc6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCitlbnVtIGFiaXNfbm1fYXZhaWxfc3RhdGUgeworCU5NX0FWU1RBVEVfSU5fVEVTVAk9IDEsCisJTk1fQVZTVEFURV9QT1dFUl9PRkYJPSAyLAorCU5NX0FWU1RBVEVfT0ZGX0xJTkUJPSAzLAorCU5NX0FWU1RBVEVfREVQRU5ERU5DWQk9IDUsCisJTk1fQVZTVEFURV9ERUdSQURFRAk9IDYsCisJTk1fQVZTVEFURV9OT1RfSU5TVEFMTEVEPSA3LAorCU5NX0FWU1RBVEVfT0sJCT0gMHhmZiwKK307CisKK2VudW0gYWJpc19ubV9vcF9zdGF0ZSB7CisJTk1fT1BTVEFURV9ESVNBQkxFRAk9IDEsCisJTk1fT1BTVEFURV9FTkFCTEVECT0gMiwKKwlOTV9PUFNUQVRFX05VTEwJCT0gMHhmZiwKK307CisKKy8qIFNlY3Rpb24gOS40LjEzOiBDaGFubmVsIENvbWJpbmF0aW9uICovCitlbnVtIGFiaXNfbm1fY2hhbl9jb21iIHsKKwlOTV9DSEFOQ19UQ0hGdWxsCT0gMHgwMCwJLyogVENIL0YgKyBUQ0gvSCArIFNBQ0NIL1RGICovCisJTk1fQ0hBTkNfVENISGFsZgk9IDB4MDEsIC8qIFRDSC9IKDAsMSkgKyBGQUNDSC9IKDAsMSkgKworCQkJCQkgICBTQUNDSC9USCgwLDEpICovCisJTk1fQ0hBTkNfVENISGFsZjIJPSAweDAyLCAvKiBUQ0gvSCgwKSArIEZBQ0NIL0goMCkgKyBTQUNDSC9USCgwKSArCisJCQkJCSAgIFRDSC9IKDEpICovCisJTk1fQ0hBTkNfU0RDQ0gJCT0gMHgwMywJLyogU0RDQ0gvOCArIFNBQ0NILzggKi8KKwlOTV9DSEFOQ19tYWluQkNDSAk9IDB4MDQsCS8qIEZDQ0ggKyBTQ0ggKyBCQ0NIICsgQ0NDSCAqLworCU5NX0NIQU5DX0JDQ0hDb21iCT0gMHgwNSwJLyogRkNDSCArIFNDSCArIEJDQ0ggKyBDQ0NIICsgU0RDQ0gvNCArCisJCQkJCSAgIFNBQ0NIL0M0ICovCisJTk1fQ0hBTkNfQkNDSAkJPSAweDA2LAkvKiBCQ0NIICsgQ0NDSCAqLworCU5NX0NIQU5DX0JDQ0hfQ0JDSAk9IDB4MDcsCS8qIENIQU5DX0JDQ0hDb21iICsgQ0JDSCAqLworCU5NX0NIQU5DX1NEQ0NIX0NCQ0gJPSAweDA4LAkvKiBDSEFOQ19TRENDSDggKyBDQkNIICovCisJLyogaXAuYWNjZXNzICovCisJTk1fQ0hBTkNfSVBBQ19iUERDSAk9IDB4MGIsCS8qIFBCQ0NIICsgUENDQ0ggKyBQRFRDSC9GICsgUEFDQ0gvRiArCisJCQkJCSAgIFBUQ0NIL0YgKi8KKwlOTV9DSEFOQ19JUEFDX2NQRENICT0gMHgwYywgLyogUEJDQ0ggKyBQRFRDSC9GICsgUEFDQ0gvRiArIFBUQ0NIL0YgKi8KKwlOTV9DSEFOQ19JUEFDX1BEQ0gJPSAweDBkLAkvKiBQRFRDSC9GICsgUEFDQ0gvRiArIFBUQ0NIL0YgKi8KKwlOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfUERDSCA9IDB4ODAsCisJTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGYgPSAweDgxLAorfTsKKworLyogU2VjdGlvbiA5LjQuMTY6IEV2ZW50IFR5cGUgKi8KK2VudW0gYWJpc19ubV9ldmVudF90eXBlIHsKKwlOTV9FVlRfQ09NTV9GQUlMCT0gMHgwMCwKKwlOTV9FVlRfUU9TX0ZBSUwJCT0gMHgwMSwKKwlOTV9FVlRfUFJPQ19GQUlMCT0gMHgwMiwKKwlOTV9FVlRfRVFVSVBfRkFJTAk9IDB4MDMsCisJTk1fRVZUX0VOVl9GQUlMCQk9IDB4MDQsCit9OworCisvKiBTZWN0aW9uOiA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworZW51bSBhYmlzX25tX3NldmVyaXR5IHsKKwlOTV9TRVZFUl9DRUFTRUQJCT0gMHgwMCwKKwlOTV9TRVZFUl9DUklUSUNBTAk9IDB4MDEsCisJTk1fU0VWRVJfTUFKT1IJCT0gMHgwMiwKKwlOTV9TRVZFUl9NSU5PUgkJPSAweDAzLAorCU5NX1NFVkVSX1dBUk5JTkcJPSAweDA0LAorCU5NX1NFVkVSX0lOREVURVJNSU5BVEUJPSAweDA1LAorfTsKKworLyogU2VjdGlvbiA5LjQuNDM6IFByb2JhYmxlIENhdXNlIFR5cGUgKi8KK2VudW0gYWJpc19ubV9wY2F1c2VfdHlwZSB7CisJTk1fUENBVVNFX1RfWDcyMQk9IDB4MDEsCisJTk1fUENBVVNFX1RfR1NNCQk9IDB4MDIsCisJTk1fUENBVVNFX1RfTUFOVUYJPSAweDAzLAorfTsKKworLyogU2VjdGlvbiA5LjQuMzY6IE5BQ0sgQ2F1c2VzICovCitlbnVtIGFiaXNfbm1fbmFja19jYXVzZSB7CisJLyogR2VuZXJhbCBOYWNrIENhdXNlcyAqLworCU5NX05BQ0tfSU5DT1JSX1NUUlVDVAkJPSAweDAxLAorCU5NX05BQ0tfTVNHVFlQRV9JTlZBTAkJPSAweDAyLAorCU5NX05BQ0tfT0JKQ0xBU1NfSU5WQUwJCT0gMHgwNSwKKwlOTV9OQUNLX09CSkNMQVNTX05PVFNVUFAJPSAweDA2LAorCU5NX05BQ0tfQlRTTlJfVU5LTgkJPSAweDA3LAorCU5NX05BQ0tfVFJYTlJfVU5LTgkJPSAweDA4LAorCU5NX05BQ0tfT0JKSU5TVF9VTktOCQk9IDB4MDksCisJTk1fTkFDS19BVFRSSURfSU5WQUwJCT0gMHgwYywKKwlOTV9OQUNLX0FUVFJJRF9OT1RTVVBQCQk9IDB4MGQsCisJTk1fTkFDS19QQVJBTV9SQU5HRQkJPSAweDBlLAorCU5NX05BQ0tfQVRUUkxJU1RfSU5DT05TSVNURU5UCT0gMHgwZiwKKwlOTV9OQUNLX1NQRUNfSU1QTF9OT1RTVVBQCT0gMHgxMCwKKwlOTV9OQUNLX0NBTlRfUEVSRk9STQkJPSAweDExLAorCS8qIFNwZWNpZmljIE5hY2sgQ2F1c2VzICovCisJTk1fTkFDS19SRVNfTk9USU1QTAkJPSAweDE5LAorCU5NX05BQ0tfUkVTX05PVEFWQUlMCQk9IDB4MWEsCisJTk1fTkFDS19GUkVRX05PVEFWQUlMCQk9IDB4MWIsCisJTk1fTkFDS19URVNUX05PVFNVUFAJCT0gMHgxYywKKwlOTV9OQUNLX0NBUEFDSVRZX1JFU1RSCQk9IDB4MWQsCisJTk1fTkFDS19QSFlTQ0ZHX05PVFBFUkZPUk0JPSAweDFlLAorCU5NX05BQ0tfVEVTVF9OT1RJTklUCQk9IDB4MWYsCisJTk1fTkFDS19QSFlTQ0ZHX05PVFJFU1RPUkUJPSAweDIwLAorCU5NX05BQ0tfVEVTVF9OT1NVQ0gJCT0gMHgyMSwKKwlOTV9OQUNLX1RFU1RfTk9TVE9QCQk9IDB4MjIsCisJTk1fTkFDS19NU0dJTkNPTlNJU1RfUEhZU0NGRwk9IDB4MjMsCisJTk1fTkFDS19GSUxFX0lOQ09NUExFVEUJCT0gMHgyNSwKKwlOTV9OQUNLX0ZJTEVfTk9UQVZBSUwJCT0gMHgyNiwKKwlOTV9OQUNLX0ZJTEVfTk9UQUNUSVZBVEUJPSAweDI3LAorCU5NX05BQ0tfUkVRX05PVF9HUkFOVAkJPSAweDI4LAorCU5NX05BQ0tfV0FJVAkJCT0gMHgyOSwKKwlOTV9OQUNLX05PVEhfUkVQT1JUX0VYSVNUCT0gMHgyYSwKKwlOTV9OQUNLX01FQVNfTk9UU1VQUAkJPSAweDJiLAorCU5NX05BQ0tfTUVBU19OT1RTVEFSVAkJPSAweDJjLAorfTsKKworLyogU2VjdGlvbiA5LjQuMSAqLworc3RydWN0IGFiaXNfbm1fY2hhbm5lbCB7CisJdWludDhfdAlhdHRyaWI7CisJdWludDhfdAlidHNfcG9ydDsKKwl1aW50OF90CXRpbWVzbG90OworCXVpbnQ4X3QJc3Vic2xvdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTaWVtZW5zIEJTLTExIHNwZWNpZmljIG9iamVjdHMgaW4gdGhlIFNpZW5lbXNIVyAoMHhBNSkgb2JqZWN0IGNsYXNzICovCitlbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHsKKwlCUzExX09CSl9BTENPCQk9IDB4MDEsCisJQlMxMV9PQkpfQkJTSUcJCT0gMHgwMiwJLyogb2JqX2NsYXNzOiAwLDEgKi8KKwlCUzExX09CSl9UUlgxCQk9IDB4MDMsCS8qIG9ubHkgREVBQ1RJVkFURSBUUlgxICovCisJQlMxMV9PQkpfQ0NMSwkJPSAweDA0LAorCUJTMTFfT0JKX0dQU1UJCT0gMHgwNiwKKwlCUzExX09CSl9MSQkJPSAweDA3LAorCUJTMTFfT0JKX1BBCQk9IDB4MDksCS8qIG9ial9jbGFzczogMCwgMSovCit9OworCitlbnVtIGFiaXNfYnMxMV90cnhfcG93ZXIgeworCUJTMTFfVFJYX1BPV0VSX0dTTV8yVwk9IDB4MDYsCisJQlMxMV9UUlhfUE9XRVJfR1NNXzI1MG1XPSAweDA3LAorCUJTMTFfVFJYX1BPV0VSX0dTTV84MG1XCT0gMHgwOCwKKwlCUzExX1RSWF9QT1dFUl9HU01fMzBtVwk9IDB4MDksCisJQlMxMV9UUlhfUE9XRVJfRENTXzNXCT0gMHgwYSwKKwlCUzExX1RSWF9QT1dFUl9EQ1NfMVc2CT0gMHgwYiwKKwlCUzExX1RSWF9QT1dFUl9EQ1NfNTAwbVc9IDB4MGMsCisJQlMxMV9UUlhfUE9XRVJfRENTXzE2MG1XPSAweDBkLAorfTsKKworZW51bSBhYmlzX2JzMTFfbGlfcGxsX21vZGUgeworCUJTMTFfTElfUExMX0xPQ0tFRAk9IDIsCisJQlMxMV9MSV9QTExfU1RBTkRBTE9ORQk9IDMsCit9OworCitlbnVtIGFiaXNfYnMxMV9saW5lX2NmZyB7CisJQlMxMV9MSU5FX0NGR19TVEFSCT0gMHgwMCwKKwlCUzExX0xJTkVfQ0ZHX01VTFRJRFJPUAk9IDB4MDEsCisJQlMxMV9MSU5FX0NGR19MT09QCT0gMHgwMiwKK307CisKK2VudW0gYWJpc19iczExX3BoYXNlIHsKKwlCUzExX1NUQVRFX1NPRlRXQVJFX1JRRAkJPSAweDAxLAorCUJTMTFfU1RBVEVfTE9BRF9TTVVfSU5URU5ERUQJPSAweDExLAorCUJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZCT0gMHgyMSwKKwlCUzExX1NUQVRFX0xPQURfRkFJTEVECQk9IDB4MzEsCisJQlMxMV9TVEFURV9MT0FEX0RJQUdOT1NUSUMJPSAweDQxLAorCUJTMTFfU1RBVEVfV0FSTV9VUAkJPSAweDUxLAorCUJTMTFfU1RBVEVfV0FSTV9VUF8yCQk9IDB4NTIsCisJQlMxMV9TVEFURV9XQUlUX01JTl9DRkcJCT0gMHg2MiwKKwlCUzExX1NUQVRFX01BSU5URU5BTkNFCQk9IDB4NzIsCisJQlMxMV9TVEFURV9MT0FEX01CQ0NVCQk9IDB4OTIsCisJQlMxMV9TVEFURV9XQUlUX01JTl9DRkdfMgk9IDB4QTIsCisJQlMxMV9TVEFURV9OT1JNQUwJCT0gMHgwMywKKwlCUzExX1NUQVRFX0FCSVNfTE9BRAkJPSAweDEzLAorfTsKKworZW51bSBhYmlzX25tX2lwYWNjX3Rlc3Rfbm8geworCU5NX0lQQUNDX1RFU1ROT19STE9PUF9BTlQJPSAweDAxLAorCU5NX0lQQUNDX1RFU1ROT19STE9PUF9YQ1ZSCT0gMHgwMiwKKwlOTV9JUEFDQ19URVNUTk9fRlVOQ19PQkoJPSAweDAzLAorCU5NX0lQQUNDX1RFU1ROT19DSEFOX1VTQUdFCT0gMHg0MCwKKwlOTV9JUEFDQ19URVNUTk9fQkNDSF9DSEFOX1VTQUdFCT0gMHg0MSwKKwlOTV9JUEFDQ19URVNUTk9fRlJFUV9TWU5DCT0gMHg0MiwKKwlOTV9JUEFDQ19URVNUTk9fQkNDSF9JTkZPCT0gMHg0MywKKwlOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OCT0gMHg0NCwKKwlOTV9JUEFDQ19URVNUTk9fU1lTSU5GT19NT05JVE9SCT0gMHg0NSwKKwlOTV9JUEFDQ19URVNUTk9fQkNDQ0hfTU9OSVRPUgk9IDB4NDYsCit9OworCisvKiBmaXJzdCBieXRlIGFmdGVyIGxlbmd0aCBpbnNpZGUgTk1fQVRUX1RFU1RfUkVQT1JUICovCitlbnVtIGFiaXNfbm1faXBhY2NfdGVzdF9yZXMgeworCU5NX0lQQUNDX1RFU1RSRVNfU1VDQ0VTUwk9IDAsCisJTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VUCT0gMSwKKwlOTV9JUEFDQ19URVNUUkVTX05PX0NIQU5TCT0gMiwKKwlOTV9JUEFDQ19URVNUUkVTX1BBUlRJQUwJPSAzLAorCU5NX0lQQUNDX1RFU1RSRVNfU1RPUFBFRAk9IDQsCit9OworCisvKiBpbnRlcm5hbCBJRSBpbnNpZGUgTk1fQVRUX1RFU1RfUkVQT1JUICovCitlbnVtIGFiaXNfbm1faXBhY2NfdGVzdHJlc19pZSB7CisJTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlJfTElTVAk9IDMsCisJTk1fSVBBQ0NfVFJfSUVfQ0hBTl9VU0FHRQk9IDQsCisJTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPCT0gNiwKKwlOTV9JUEFDQ19UUl9JRV9SRVNVTFRfREVUQUlMUwk9IDgsCisJTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlIJCT0gMTgsCit9OworCitlbnVtIGlwYWNfZWllIHsKKwlOTV9JUEFDX0VJRV9BUkZDTl9XSElURQkJPSAweDAxLAorCU5NX0lQQUNfRUlFX0FSRkNIX0JMQUNLCQk9IDB4MDIsCisJTk1fSVBBQ19FSUVfRlJFUV9FUlJfTElTVAk9IDB4MDMsCisJTk1fSVBBQ19FSUVfQ0hBTl9VU0VfTElTVAk9IDB4MDQsCisJTk1fSVBBQ19FSUVfQkNDSF9JTkZPX1RZUEUJPSAweDA1LAorCU5NX0lQQUNfRUlFX0JDQ0hfSU5GTwkJPSAweDA2LAorCU5NX0lQQUNfRUlFX0NPTkZJRwkJPSAweDA3LAorCU5NX0lQQUNfRUlFX1JFU19ERVRBSUxTCQk9IDB4MDgsCisJTk1fSVBBQ19FSUVfUlhMRVZfVEhSRVNICT0gMHgwOSwKKwlOTV9JUEFDX0VJRV9GUkVRX1NZTkNfT1BUUwk9IDB4MGEsCisJTk1fSVBBQ19FSUVfTUFDX0FERFIJCT0gMHgwYiwKKwlOTV9JUEFDX0VJRV9IV19TV19DT01QQVRfTlIJPSAweDBjLAorCU5NX0lQQUNfRUlFX01BTlVGX1NFUl9OUgk9IDB4MGQsCisJTk1fSVBBQ19FSUVfT0VNX0lECQk9IDB4MGUsCisJTk1fSVBBQ19FSUVfREFURV9USU1FX01BTlVGCT0gMHgwZiwKKwlOTV9JUEFDX0VJRV9EQVRFX1RJTUVfQ0FMSUIJPSAweDEwLAorCU5NX0lQQUNfRUlFX0JFQUNPTl9JTkZPCQk9IDB4MTEsCisJTk1fSVBBQ19FSUVfRlJFUV9FUlIJCT0gMHgxMiwKKwkvKiBGSVhNRSAqLworCU5NX0lQQUNfRUlFX0ZSRVFfQkFORFMJCT0gMHgxYywKKwlOTV9JUEFDX0VJRV9NQVhfVEEJCT0gMHgxZCwKKwlOTV9JUEFDX0VJRV9DSVBIX0FMR09TCQk9IDB4MWUsCisJTk1fSVBBQ19FSUVfQ0hBTl9UWVBFUwkJPSAweDFmLAorCU5NX0lQQUNfRUlFX0NIQU5fTU9ERVMJCT0gMHgyMCwKKwlOTV9JUEFDX0VJRV9HUFJTX0NPRElORwkJPSAweDIxLAorCU5NX0lQQUNfRUlFX1JUUF9GRUFUVVJFUwk9IDB4MjIsCisJTk1fSVBBQ19FSUVfUlNMX0ZFQVRVUkVTCT0gMHgyMywKKwlOTV9JUEFDX0VJRV9CVFNfSFdfQ0xBU1MJPSAweDI0LAorCU5NX0lQQUNfRUlFX0JUU19JRAkJPSAweDI1LAorfTsKKworZW51bSBpcGFjX2JjY2hfaW5mb190eXBlIHsKKwlJUEFDX0JJTkZfUlhMRVYJCQk9ICgxIDw8IDgpLAorCUlQQUNfQklORl9SWFFVQUwJCT0gKDEgPDwgOSksCisJSVBBQ19CSU5GX0ZSRVFfRVJSX1FVQUwJCT0gKDEgPDwgMTApLAorCUlQQUNfQklORl9GUkFNRV9PRkZTRVQJCT0gKDEgPDwgMTEpLAorCUlQQUNfQklORl9GUkFNRV9OUl9PRkZTRVQJPSAoMSA8PCAxMiksCisJSVBBQ19CSU5GX0JTSUMJCQk9ICgxIDw8IDEzKSwKKwlJUEFDX0JJTkZfQ0dJCQkJPSAoMSA8PCAxNCksCisJSVBBQ19CSU5GX05FSUdIX0JBX1NJMgkJPSAoMSA8PCAxNSksCisJSVBBQ19CSU5GX05FSUdIX0JBX1NJMmJpcwk9ICgxIDw8IDApLAorCUlQQUNfQklORl9ORUlHSF9CQV9TSTJ0ZXIJPSAoMSA8PCAxKSwKKwlJUEFDX0JJTkZfQ0VMTF9BTExPQwkJPSAoMSA8PCAyKSwKK307CisKKyNlbmRpZiAvKiBQUk9UT19HU01fMTJfMjFfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yYXRlX2N0ci5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yYXRlX2N0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzlkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3JhdGVfY3RyLmgKQEAgLTAsMCArMSw4MSBAQAorI2lmbmRlZiBfUkFURV9DVFJfSAorI2RlZmluZSBfUkFURV9DVFJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBSQVRFX0NUUl9JTlRWX05VTQk0CisKK2VudW0gcmF0ZV9jdHJfaW50diB7CisJUkFURV9DVFJfSU5UVl9TRUMsCisJUkFURV9DVFJfSU5UVl9NSU4sCisJUkFURV9DVFJfSU5UVl9IT1VSLAorCVJBVEVfQ1RSX0lOVFZfREFZLAorfTsKKworLyogZm9yIGVhY2ggb2YgdGhlIGludGVydmFscywgd2Uga2VlcCB0aGUgZm9sbG93aW5nIHZhbHVlcyAqLworc3RydWN0IHJhdGVfY3RyX3Blcl9pbnR2IHsKKwl1aW50NjRfdCBsYXN0OworCXVpbnQ2NF90IHJhdGU7Cit9OworCisvKiBmb3IgZWFjaCBhY3R1YWwgdmFsdWUsIHdlIGtlZXAgdGhlIGZvbGxvd2luZyBkYXRhICovCitzdHJ1Y3QgcmF0ZV9jdHIgeworCXVpbnQ2NF90IGN1cnJlbnQ7CisJc3RydWN0IHJhdGVfY3RyX3Blcl9pbnR2IGludHZbUkFURV9DVFJfSU5UVl9OVU1dOworfTsKKworc3RydWN0IHJhdGVfY3RyX2Rlc2MgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZGVzY3JpcHRpb247Cit9OworCisvKiBEZXNjcmliZSBhIGNvdW50ZXIgZ3JvdXAgY2xhc3MgKi8KK3N0cnVjdCByYXRlX2N0cl9ncm91cF9kZXNjIHsKKwkvKiBUaGUgcHJlZml4IHRvIHRoZSBuYW1lIG9mIGFsbCBjb3VudGVycyBpbiB0aGlzIGdyb3VwICovCisJY2hhciAqZ3JvdXBfbmFtZV9wcmVmaXg7CisJLyogVGhlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBncm91cCAqLworCWNoYXIgKmdyb3VwX2Rlc2NyaXB0aW9uOworCS8qIFRoZSBudW1iZXIgb2YgY291bnRlcnMgaW4gdGhpcyBncm91cCAqLworCXVuc2lnbmVkIGludCBudW1fY3RyOworCS8qIFBvaW50ZXIgdG8gYXJyYXkgb2YgY291bnRlciBuYW1lcyAqLworCXN0cnVjdCByYXRlX2N0cl9kZXNjICpjdHJfZGVzYzsKK307CisKKy8qIE9uZSBpbnN0YW5jZSBvZiBhIGNvdW50ZXIgZ3JvdXAgY2xhc3MgKi8KK3N0cnVjdCByYXRlX2N0cl9ncm91cCB7CisJLyogTGlua2VkIGxpc3Qgb2YgYWxsIGNvdW50ZXIgZ3JvdXBzIGluIHRoZSBzeXN0ZW0gKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCS8qIFBvaW50ZXIgdG8gdGhlIGNvdW50ZXIgZ3JvdXAgY2xhc3MgKi8KKwljb25zdCBzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXBfZGVzYyAqZGVzYzsKKwkvKiBUaGUgaW5kZXggb2YgdGhpcyBjdHJfZ3JvdXAgd2l0aGluIGl0cyBjbGFzcyAqLworCXVuc2lnbmVkIGludCBpZHg7CisJLyogQWN0dWFsIGNvdW50ZXIgc3RydWN0dXJlcyBiZWxvdyAqLworCXN0cnVjdCByYXRlX2N0ciBjdHJbMF07Cit9OworCisvKiBBbGxvY2F0ZSBhIG5ldyBncm91cCBvZiBjb3VudGVycyBhY2NvcmRpbmcgdG8gZGVzY3JpcHRpb24gKi8KK3N0cnVjdCByYXRlX2N0cl9ncm91cCAqcmF0ZV9jdHJfZ3JvdXBfYWxsb2Modm9pZCAqY3R4LAorCQkJCQkgICAgY29uc3Qgc3RydWN0IHJhdGVfY3RyX2dyb3VwX2Rlc2MgKmRlc2MsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgaWR4KTsKKworLyogRnJlZSB0aGUgbWVtb3J5IGZvciB0aGUgc3BlY2lmaWVkIGdyb3VwIG9mIGNvdW50ZXJzICovCit2b2lkIHJhdGVfY3RyX2dyb3VwX2ZyZWUoc3RydWN0IHJhdGVfY3RyX2dyb3VwICpncnApOworCisvKiBBZGQgYSBudW1iZXIgdG8gdGhlIGNvdW50ZXIgKi8KK3ZvaWQgcmF0ZV9jdHJfYWRkKHN0cnVjdCByYXRlX2N0ciAqY3RyLCBpbnQgaW5jKTsKKworLyogSW5jcmVtZW50IHRoZSBjb3VudGVyIGJ5IDEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByYXRlX2N0cl9pbmMoc3RydWN0IHJhdGVfY3RyICpjdHIpCit7CisJcmF0ZV9jdHJfYWRkKGN0ciwgMSk7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIGNvdW50ZXIgbW9kdWxlICovCitpbnQgcmF0ZV9jdHJfaW5pdCh2b2lkICp0YWxsX2N0eCk7CisKK3N0cnVjdCB2dHk7Cit2b2lkIHZ0eV9vdXRfcmF0ZV9jdHJfZ3JvdXAoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkgICAgc3RydWN0IHJhdGVfY3RyX2dyb3VwICpjdHJnKTsKKyNlbmRpZiAvKiBSQVRFX0NUUl9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3JzbC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWI5MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yc2wuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIF9PU01PQ09SRV9SU0xfSAorI2RlZmluZSBfT1NNT0NPUkVfUlNMX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3V0aWxzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4Lmg+CisKK3ZvaWQgcnNsX2luaXRfcmxsX2hkcihzdHJ1Y3QgYWJpc19yc2xfcmxsX2hkciAqZGgsIHVpbnQ4X3QgbXNnX3R5cGUpOworCitleHRlcm4gY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIHJzbF9hdHRfdGx2ZGVmOworI2RlZmluZSByc2xfdGx2X3BhcnNlKGRlYywgYnVmLCBsZW4pICAgICBcCisJCQl0bHZfcGFyc2UoZGVjLCAmcnNsX2F0dF90bHZkZWYsIGJ1ZiwgbGVuLCAwLCAwKQorCisvKiBlbmNvZGUgY2hhbm5lbCBudW1iZXIgYXMgcGVyIFNlY3Rpb24gOS4zLjEgKi8KK3VpbnQ4X3QgcnNsX2VuY19jaGFuX25yKHVpbnQ4X3QgdHlwZSwgdWludDhfdCBzdWJjaCwgdWludDhfdCB0aW1lc2xvdCk7CisvKiBkZWNvZGUgY2hhbm5lbCBudW1iZXIgYXMgcGVyIFNlY3Rpb24gOS4zLjEgKi8KK2ludCByc2xfZGVjX2NoYW5fbnIodWludDhfdCBjaGFuX25yLCB1aW50OF90ICp0eXBlLCB1aW50OF90ICpzdWJjaCwgdWludDhfdCAqdGltZXNsb3QpOworCitjb25zdCBjaGFyICpyc2xfZXJyX25hbWUodWludDhfdCBlcnIpOworY29uc3QgY2hhciAqcnNsX3JsbV9jYXVzZV9uYW1lKHVpbnQ4X3QgZXJyKTsKKworLyogU2VjdGlvbiAzLjMuMi4zIFRTIDA1LjAyLiBJIHRoaW5rIHRoaXMgbG9va3MgbGlrZSBhIHRhYmxlICovCitpbnQgcnNsX2NjY2hfY29uZl90b19ic19jY19jaGFucyhpbnQgY2NjaF9jb25mKTsKKworLyogUHVzaCBhIFJTTCBSTEwgaGVhZGVyIHdpdGggTDNfSU5GTyBJRSAqLwordm9pZCByc2xfcmxsX3B1c2hfbDMoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBtc2dfdHlwZSwgdWludDhfdCBjaGFuX25yLAorCQkgICAgIHVpbnQ4X3QgbGlua19pZCwgaW50IHRyYW5zcGFyZW50KTsKKworLyogQWxsb2NhdGUgbXNnYiBhbmQgZmlsbCB3aXRoIHNpbXBsZSBSU0wgUkxMIGhlYWRlciAqLworc3RydWN0IG1zZ2IgKnJzbF9ybGxfc2ltcGxlKHVpbnQ4X3QgbXNnX3R5cGUsIHVpbnQ4X3QgY2hhbl9uciwKKwkJCSAgICB1aW50OF90IGxpbmtfaWQsIGludCB0cmFuc3BhcmVudCk7CisjZW5kaWYgLyogX09TTU9DT1JFX1JTTF9IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcnhsZXZfc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTUwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9PU01PQ09SRV9SWExFVl9TVEFUU19ICisjZGVmaW5lIF9PU01PQ09SRV9SWExFVl9TVEFUU19ICisKKyNkZWZpbmUgTlVNX1JYTEVWUyAzMgorI2RlZmluZSBOVU1fQVJGQ05TIDEwMjQKKworc3RydWN0IHJ4bGV2X3N0YXRzIHsKKwkvKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgQVJGQ04ncyBpcyAxMDI0LCBhbmQgdGhlcmUgYXJlIDMyIFJ4TGV2ZWxzLAorCSAqIHNvIGluIHdlIGtlZXAgb25lIDEwMjRiaXQtYml0dmVjIGZvciBlYWNoIFJ4TGV2ICovCisJdWludDhfdCByeGxldl9idWNrZXRzW05VTV9SWExFVlNdW05VTV9BUkZDTlMvOF07Cit9OworCit2b2lkIHJ4bGV2X3N0YXRfaW5wdXQoc3RydWN0IHJ4bGV2X3N0YXRzICpzdCwgdWludDE2X3QgYXJmY24sIHVpbnQ4X3QgcnhsZXYpOworCisvKiBnZXQgdGhlIG5leHQgQVJGQ04gdGhhdCBoYXMgdGhlIHNwZWNpZmllZCBSeGxldiAqLworaW50MTZfdCByeGxldl9zdGF0X2dldF9uZXh0KGNvbnN0IHN0cnVjdCByeGxldl9zdGF0cyAqc3QsIHVpbnQ4X3QgcnhsZXYsIGludDE2X3QgYXJmY24pOworCit2b2lkIHJ4bGV2X3N0YXRfcmVzZXQoc3RydWN0IHJ4bGV2X3N0YXRzICpzdCk7CisKK3ZvaWQgcnhsZXZfc3RhdF9kdW1wKGNvbnN0IHN0cnVjdCByeGxldl9zdGF0cyAqc3QpOworCisjZW5kaWYgLyogX09TTU9DT1JFX1JYTEVWX1NUQVRTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc2VsZWN0LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOGIzZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX0JTQ19TRUxFQ1RfSAorI2RlZmluZSBfQlNDX1NFTEVDVF9ICisKKyNpbmNsdWRlICJsaW51eGxpc3QuaCIKKworI2RlZmluZSBCU0NfRkRfUkVBRAkweDAwMDEKKyNkZWZpbmUgQlNDX0ZEX1dSSVRFCTB4MDAwMgorI2RlZmluZSBCU0NfRkRfRVhDRVBUCTB4MDAwNAorCitzdHJ1Y3QgYnNjX2ZkIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCWludCBmZDsKKwl1bnNpZ25lZCBpbnQgd2hlbjsKKwlpbnQgKCpjYikoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KTsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGludCBwcml2X25yOworfTsKKworaW50IGJzY19yZWdpc3Rlcl9mZChzdHJ1Y3QgYnNjX2ZkICpmZCk7Cit2b2lkIGJzY191bnJlZ2lzdGVyX2ZkKHN0cnVjdCBic2NfZmQgKmZkKTsKK2ludCBic2Nfc2VsZWN0X21haW4oaW50IHBvbGxpbmcpOworI2VuZGlmIC8qIF9CU0NfU0VMRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc2lnbmFsLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZDgzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NpZ25hbC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgT1NNT0NPUkVfU0lHTkFMX0gKKyNkZWZpbmUgT1NNT0NPUkVfU0lHTkFMX0gKKwordHlwZWRlZiBpbnQgc2lnbmFsX2NiZm4odW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCXZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpOworCisKKy8qIE1hbmFnZW1lbnQgKi8KK2ludCByZWdpc3Rlcl9zaWduYWxfaGFuZGxlcih1bnNpZ25lZCBpbnQgc3Vic3lzLCBzaWduYWxfY2JmbiAqY2Jmbiwgdm9pZCAqZGF0YSk7Cit2b2lkIHVucmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIodW5zaWduZWQgaW50IHN1YnN5cywgc2lnbmFsX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpOworCisvKiBEaXNwYXRjaCAqLwordm9pZCBkaXNwYXRjaF9zaWduYWwodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwgdm9pZCAqc2lnbmFsX2RhdGEpOworCisjZW5kaWYgLyogT1NNT0NPUkVfU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zdGF0aXN0aWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1NjA1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgX1NUQVRJU1RJQ1NfSAorI2RlZmluZSBfU1RBVElTVElDU19ICisKK3N0cnVjdCBjb3VudGVyIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZGVzY3JpcHRpb247CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3VudGVyX2luYyhzdHJ1Y3QgY291bnRlciAqY3RyKQoreworCWN0ci0+dmFsdWUrKzsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvdW50ZXJfZ2V0KHN0cnVjdCBjb3VudGVyICpjdHIpCit7CisJcmV0dXJuIGN0ci0+dmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3VudGVyX3Jlc2V0KHN0cnVjdCBjb3VudGVyICpjdHIpCit7CisJY3RyLT52YWx1ZSA9IDA7Cit9CisKK3N0cnVjdCBjb3VudGVyICpjb3VudGVyX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBjb3VudGVyX2ZyZWUoc3RydWN0IGNvdW50ZXIgKmN0cik7CisKK2ludCBjb3VudGVyc19mb3JfZWFjaChpbnQgKCpoYW5kbGVfY291bnRlcikoc3RydWN0IGNvdW50ZXIgKiwgdm9pZCAqKSwgdm9pZCAqZGF0YSk7CisKKyNlbmRpZiAvKiBfU1RBVElTVElDU19IICovCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3RhbGxvYy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Y3NjQzCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApAQCAtMCwwICsxLDE5MiBAQAorI2lmbmRlZiBfVEFMTE9DX0hfCisjZGVmaW5lIF9UQUxMT0NfSF8KKy8qIAorICAgVW5peCBTTUIvQ0lGUyBpbXBsZW1lbnRhdGlvbi4KKyAgIFNhbWJhIHRlbXBvcmFyeSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMKKworICAgQ29weXJpZ2h0IChDKSBBbmRyZXcgVHJpZGdlbGwgMjAwNC0yMDA1CisgICBDb3B5cmlnaHQgKEMpIFN0ZWZhbiBNZXR6bWFjaGVyIDIwMDYKKyAgIAorICAgICAqKiBOT1RFISBUaGUgZm9sbG93aW5nIExHUEwgbGljZW5zZSBhcHBsaWVzIHRvIHRoZSB0YWxsb2MKKyAgICAgKiogbGlicmFyeS4gVGhpcyBkb2VzIE5PVCBpbXBseSB0aGF0IGFsbCBvZiBTYW1iYSBpcyByZWxlYXNlZAorICAgICAqKiB1bmRlciB0aGUgTEdQTAorICAgCisgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjZGVmaW5lIEhBVkVfVkFfQ09QWQorCisvKiB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCB0YWxsb2MgKi8KK3R5cGVkZWYgdm9pZCBUQUxMT0NfQ1RYOworCisvKgorICB0aGlzIHVzZXMgYSBsaXR0bGUgdHJpY2sgdG8gYWxsb3cgX19MSU5FX18gdG8gYmUgc3RyaW5naWZpZWQKKyovCisjaWZuZGVmIF9fbG9jYXRpb25fXworI2RlZmluZSBfX1RBTExPQ19TVFJJTkdfTElORTFfXyhzKSAgICAjcworI2RlZmluZSBfX1RBTExPQ19TVFJJTkdfTElORTJfXyhzKSAgIF9fVEFMTE9DX1NUUklOR19MSU5FMV9fKHMpCisjZGVmaW5lIF9fVEFMTE9DX1NUUklOR19MSU5FM19fICBfX1RBTExPQ19TVFJJTkdfTElORTJfXyhfX0xJTkVfXykKKyNkZWZpbmUgX19sb2NhdGlvbl9fIF9fRklMRV9fICI6IiBfX1RBTExPQ19TVFJJTkdfTElORTNfXworI2VuZGlmCisKKyNpZm5kZWYgVEFMTE9DX0RFUFJFQ0FURUQKKyNkZWZpbmUgVEFMTE9DX0RFUFJFQ0FURUQgMAorI2VuZGlmCisKKyNpZm5kZWYgUFJJTlRGX0FUVFJJQlVURQorI2lmIChfX0dOVUNfXyA+PSAzKQorLyoqIFVzZSBnY2MgYXR0cmlidXRlIHRvIGNoZWNrIHByaW50ZiBmbnMuICBhMSBpcyB0aGUgMS1iYXNlZCBpbmRleCBvZgorICogdGhlIHBhcmFtZXRlciBjb250YWluaW5nIHRoZSBmb3JtYXQsIGFuZCBhMiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0CisgKiBhcmd1bWVudC4gTm90ZSB0aGF0IHNvbWUgZ2NjIDIueCB2ZXJzaW9ucyBkb24ndCBoYW5kbGUgdGhpcworICogcHJvcGVybHkgKiovCisjZGVmaW5lIFBSSU5URl9BVFRSSUJVVEUoYTEsIGEyKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChfX3ByaW50Zl9fLCBhMSwgYTIpKSkKKyNlbHNlCisjZGVmaW5lIFBSSU5URl9BVFRSSUJVVEUoYTEsIGEyKQorI2VuZGlmCisjZW5kaWYKKworLyogdHJ5IHRvIG1ha2UgdGFsbG9jX3NldF9kZXN0cnVjdG9yKCkgYW5kIHRhbGxvY19zdGVhbCgpIHR5cGUgc2FmZSwKKyAgIGlmIHdlIGhhdmUgYSByZWNlbnQgZ2NjICovCisjaWYgKF9fR05VQ19fID49IDMpCisjZGVmaW5lIF9UQUxMT0NfVFlQRU9GKHB0cikgX190eXBlb2ZfXyhwdHIpCisjZGVmaW5lIHRhbGxvY19zZXRfZGVzdHJ1Y3RvcihwdHIsIGZ1bmN0aW9uKQkJCQkgICAgICBcCisJZG8gewkJCQkJCQkJICAgICAgXAorCQlpbnQgKCpfdGFsbG9jX2Rlc3RydWN0b3JfZm4pKF9UQUxMT0NfVFlQRU9GKHB0cikpID0gKGZ1bmN0aW9uKTsJICAgICAgXAorCQlfdGFsbG9jX3NldF9kZXN0cnVjdG9yKChwdHIpLCAoaW50ICgqKSh2b2lkICopKV90YWxsb2NfZGVzdHJ1Y3Rvcl9mbik7IFwKKwl9IHdoaWxlKDApCisvKiB0aGlzIGV4dHJlbWVseSBzdHJhbmdlIG1hY3JvIGlzIHRvIGF2b2lkIHNvbWUgYnJhaW5kYW1hZ2VkIHdhcm5pbmcKKyAgIHN0dXBpZGl0eSBpbiBnY2MgNC4xLnggKi8KKyNkZWZpbmUgdGFsbG9jX3N0ZWFsKGN0eCwgcHRyKSAoeyBfVEFMTE9DX1RZUEVPRihwdHIpIF9fdGFsbG9jX3N0ZWFsX3JldCA9IChfVEFMTE9DX1RZUEVPRihwdHIpKV90YWxsb2Nfc3RlYWwoKGN0eCksKHB0cikpOyBfX3RhbGxvY19zdGVhbF9yZXQ7IH0pCisjZWxzZQorI2RlZmluZSB0YWxsb2Nfc2V0X2Rlc3RydWN0b3IocHRyLCBmdW5jdGlvbikgXAorCV90YWxsb2Nfc2V0X2Rlc3RydWN0b3IoKHB0ciksIChpbnQgKCopKHZvaWQgKikpKGZ1bmN0aW9uKSkKKyNkZWZpbmUgX1RBTExPQ19UWVBFT0YocHRyKSB2b2lkICoKKyNkZWZpbmUgdGFsbG9jX3N0ZWFsKGN0eCwgcHRyKSAoX1RBTExPQ19UWVBFT0YocHRyKSlfdGFsbG9jX3N0ZWFsKChjdHgpLChwdHIpKQorI2VuZGlmCisKKyNkZWZpbmUgdGFsbG9jX3JlZmVyZW5jZShjdHgsIHB0cikgKF9UQUxMT0NfVFlQRU9GKHB0cikpX3RhbGxvY19yZWZlcmVuY2UoKGN0eCksKHB0cikpCisjZGVmaW5lIHRhbGxvY19tb3ZlKGN0eCwgcHRyKSAoX1RBTExPQ19UWVBFT0YoKihwdHIpKSlfdGFsbG9jX21vdmUoKGN0eCksKHZvaWQgKikocHRyKSkKKworLyogdXNlZnVsIG1hY3JvcyBmb3IgY3JlYXRpbmcgdHlwZSBjaGVja2VkIHBvaW50ZXJzICovCisjZGVmaW5lIHRhbGxvYyhjdHgsIHR5cGUpICh0eXBlICopdGFsbG9jX25hbWVkX2NvbnN0KGN0eCwgc2l6ZW9mKHR5cGUpLCAjdHlwZSkKKyNkZWZpbmUgdGFsbG9jX3NpemUoY3R4LCBzaXplKSB0YWxsb2NfbmFtZWRfY29uc3QoY3R4LCBzaXplLCBfX2xvY2F0aW9uX18pCisjZGVmaW5lIHRhbGxvY19wdHJ0eXBlKGN0eCwgcHRyKSAoX1RBTExPQ19UWVBFT0YocHRyKSl0YWxsb2Nfc2l6ZShjdHgsIHNpemVvZigqKHB0cikpKQorCisjZGVmaW5lIHRhbGxvY19uZXcoY3R4KSB0YWxsb2NfbmFtZWRfY29uc3QoY3R4LCAwLCAidGFsbG9jX25ldzogIiBfX2xvY2F0aW9uX18pCisKKyNkZWZpbmUgdGFsbG9jX3plcm8oY3R4LCB0eXBlKSAodHlwZSAqKV90YWxsb2NfemVybyhjdHgsIHNpemVvZih0eXBlKSwgI3R5cGUpCisjZGVmaW5lIHRhbGxvY196ZXJvX3NpemUoY3R4LCBzaXplKSBfdGFsbG9jX3plcm8oY3R4LCBzaXplLCBfX2xvY2F0aW9uX18pCisKKyNkZWZpbmUgdGFsbG9jX3plcm9fYXJyYXkoY3R4LCB0eXBlLCBjb3VudCkgKHR5cGUgKilfdGFsbG9jX3plcm9fYXJyYXkoY3R4LCBzaXplb2YodHlwZSksIGNvdW50LCAjdHlwZSkKKyNkZWZpbmUgdGFsbG9jX2FycmF5KGN0eCwgdHlwZSwgY291bnQpICh0eXBlICopX3RhbGxvY19hcnJheShjdHgsIHNpemVvZih0eXBlKSwgY291bnQsICN0eXBlKQorI2RlZmluZSB0YWxsb2NfYXJyYXlfc2l6ZShjdHgsIHNpemUsIGNvdW50KSBfdGFsbG9jX2FycmF5KGN0eCwgc2l6ZSwgY291bnQsIF9fbG9jYXRpb25fXykKKyNkZWZpbmUgdGFsbG9jX2FycmF5X3B0cnR5cGUoY3R4LCBwdHIsIGNvdW50KSAoX1RBTExPQ19UWVBFT0YocHRyKSl0YWxsb2NfYXJyYXlfc2l6ZShjdHgsIHNpemVvZigqKHB0cikpLCBjb3VudCkKKyNkZWZpbmUgdGFsbG9jX2FycmF5X2xlbmd0aChjdHgpICh0YWxsb2NfZ2V0X3NpemUoY3R4KS9zaXplb2YoKmN0eCkpCisKKyNkZWZpbmUgdGFsbG9jX3JlYWxsb2MoY3R4LCBwLCB0eXBlLCBjb3VudCkgKHR5cGUgKilfdGFsbG9jX3JlYWxsb2NfYXJyYXkoY3R4LCBwLCBzaXplb2YodHlwZSksIGNvdW50LCAjdHlwZSkKKyNkZWZpbmUgdGFsbG9jX3JlYWxsb2Nfc2l6ZShjdHgsIHB0ciwgc2l6ZSkgX3RhbGxvY19yZWFsbG9jKGN0eCwgcHRyLCBzaXplLCBfX2xvY2F0aW9uX18pCisKKyNkZWZpbmUgdGFsbG9jX21lbWR1cCh0LCBwLCBzaXplKSBfdGFsbG9jX21lbWR1cCh0LCBwLCBzaXplLCBfX2xvY2F0aW9uX18pCisKKyNkZWZpbmUgdGFsbG9jX3NldF90eXBlKHB0ciwgdHlwZSkgdGFsbG9jX3NldF9uYW1lX2NvbnN0KHB0ciwgI3R5cGUpCisjZGVmaW5lIHRhbGxvY19nZXRfdHlwZShwdHIsIHR5cGUpICh0eXBlICopdGFsbG9jX2NoZWNrX25hbWUocHRyLCAjdHlwZSkKKyNkZWZpbmUgdGFsbG9jX2dldF90eXBlX2Fib3J0KHB0ciwgdHlwZSkgKHR5cGUgKilfdGFsbG9jX2dldF90eXBlX2Fib3J0KHB0ciwgI3R5cGUsIF9fbG9jYXRpb25fXykKKworI2RlZmluZSB0YWxsb2NfZmluZF9wYXJlbnRfYnl0eXBlKHB0ciwgdHlwZSkgKHR5cGUgKil0YWxsb2NfZmluZF9wYXJlbnRfYnluYW1lKHB0ciwgI3R5cGUpCisKKyNpZiBUQUxMT0NfREVQUkVDQVRFRAorI2RlZmluZSB0YWxsb2NfemVyb19wKGN0eCwgdHlwZSkgdGFsbG9jX3plcm8oY3R4LCB0eXBlKQorI2RlZmluZSB0YWxsb2NfcChjdHgsIHR5cGUpIHRhbGxvYyhjdHgsIHR5cGUpCisjZGVmaW5lIHRhbGxvY19hcnJheV9wKGN0eCwgdHlwZSwgY291bnQpIHRhbGxvY19hcnJheShjdHgsIHR5cGUsIGNvdW50KQorI2RlZmluZSB0YWxsb2NfcmVhbGxvY19wKGN0eCwgcCwgdHlwZSwgY291bnQpIHRhbGxvY19yZWFsbG9jKGN0eCwgcCwgdHlwZSwgY291bnQpCisjZGVmaW5lIHRhbGxvY19kZXN0cm95KGN0eCkgdGFsbG9jX2ZyZWUoY3R4KQorI2RlZmluZSB0YWxsb2NfYXBwZW5kX3N0cmluZyhjLCBzLCBhKSAocz90YWxsb2Nfc3RyZHVwX2FwcGVuZChzLGEpOnRhbGxvY19zdHJkdXAoYywgYSkpCisjZW5kaWYKKworI2RlZmluZSBUQUxMT0NfRlJFRShjdHgpIGRvIHsgdGFsbG9jX2ZyZWUoY3R4KTsgY3R4PU5VTEw7IH0gd2hpbGUoMCkKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBjb21lIGZyb20gdGFsbG9jLmMgICovCit2b2lkICpfdGFsbG9jKGNvbnN0IHZvaWQgKmNvbnRleHQsIHNpemVfdCBzaXplKTsKK3ZvaWQgKnRhbGxvY19wb29sKGNvbnN0IHZvaWQgKmNvbnRleHQsIHNpemVfdCBzaXplKTsKK3ZvaWQgX3RhbGxvY19zZXRfZGVzdHJ1Y3Rvcihjb25zdCB2b2lkICpwdHIsIGludCAoKl9kZXN0cnVjdG9yKSh2b2lkICopKTsKK2ludCB0YWxsb2NfaW5jcmVhc2VfcmVmX2NvdW50KGNvbnN0IHZvaWQgKnB0cik7CitzaXplX3QgdGFsbG9jX3JlZmVyZW5jZV9jb3VudChjb25zdCB2b2lkICpwdHIpOwordm9pZCAqX3RhbGxvY19yZWZlcmVuY2UoY29uc3Qgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqcHRyKTsKK2ludCB0YWxsb2NfdW5saW5rKGNvbnN0IHZvaWQgKmNvbnRleHQsIHZvaWQgKnB0cik7Citjb25zdCBjaGFyICp0YWxsb2Nfc2V0X25hbWUoY29uc3Qgdm9pZCAqcHRyLCBjb25zdCBjaGFyICpmbXQsIC4uLikgUFJJTlRGX0FUVFJJQlVURSgyLDMpOwordm9pZCB0YWxsb2Nfc2V0X25hbWVfY29uc3QoY29uc3Qgdm9pZCAqcHRyLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgKnRhbGxvY19uYW1lZChjb25zdCB2b2lkICpjb250ZXh0LCBzaXplX3Qgc2l6ZSwgCisJCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBQUklOVEZfQVRUUklCVVRFKDMsNCk7Cit2b2lkICp0YWxsb2NfbmFtZWRfY29uc3QoY29uc3Qgdm9pZCAqY29udGV4dCwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpOworY29uc3QgY2hhciAqdGFsbG9jX2dldF9uYW1lKGNvbnN0IHZvaWQgKnB0cik7Cit2b2lkICp0YWxsb2NfY2hlY2tfbmFtZShjb25zdCB2b2lkICpwdHIsIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCAqX3RhbGxvY19nZXRfdHlwZV9hYm9ydChjb25zdCB2b2lkICpwdHIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmxvY2F0aW9uKTsKK3ZvaWQgKnRhbGxvY19wYXJlbnQoY29uc3Qgdm9pZCAqcHRyKTsKK2NvbnN0IGNoYXIgKnRhbGxvY19wYXJlbnRfbmFtZShjb25zdCB2b2lkICpwdHIpOwordm9pZCAqdGFsbG9jX2luaXQoY29uc3QgY2hhciAqZm10LCAuLi4pIFBSSU5URl9BVFRSSUJVVEUoMSwyKTsKK2ludCB0YWxsb2NfZnJlZSh2b2lkICpwdHIpOwordm9pZCB0YWxsb2NfZnJlZV9jaGlsZHJlbih2b2lkICpwdHIpOwordm9pZCAqX3RhbGxvY19yZWFsbG9jKGNvbnN0IHZvaWQgKmNvbnRleHQsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCAqX3RhbGxvY19zdGVhbChjb25zdCB2b2lkICpuZXdfY3R4LCBjb25zdCB2b2lkICpwdHIpOwordm9pZCAqX3RhbGxvY19tb3ZlKGNvbnN0IHZvaWQgKm5ld19jdHgsIGNvbnN0IHZvaWQgKnBwdHIpOworc2l6ZV90IHRhbGxvY190b3RhbF9zaXplKGNvbnN0IHZvaWQgKnB0cik7CitzaXplX3QgdGFsbG9jX3RvdGFsX2Jsb2Nrcyhjb25zdCB2b2lkICpwdHIpOwordm9pZCB0YWxsb2NfcmVwb3J0X2RlcHRoX2NiKGNvbnN0IHZvaWQgKnB0ciwgaW50IGRlcHRoLCBpbnQgbWF4X2RlcHRoLAorCQkJICAgIHZvaWQgKCpjYWxsYmFjaykoY29uc3Qgdm9pZCAqcHRyLAorCQkJICAJCSAgICAgaW50IGRlcHRoLCBpbnQgbWF4X2RlcHRoLAorCQkJCQkgICAgIGludCBpc19yZWYsCisJCQkJCSAgICAgdm9pZCAqcHJpdmF0ZV9kYXRhKSwKKwkJCSAgICB2b2lkICpwcml2YXRlX2RhdGEpOwordm9pZCB0YWxsb2NfcmVwb3J0X2RlcHRoX2ZpbGUoY29uc3Qgdm9pZCAqcHRyLCBpbnQgZGVwdGgsIGludCBtYXhfZGVwdGgsIEZJTEUgKmYpOwordm9pZCB0YWxsb2NfcmVwb3J0X2Z1bGwoY29uc3Qgdm9pZCAqcHRyLCBGSUxFICpmKTsKK3ZvaWQgdGFsbG9jX3JlcG9ydChjb25zdCB2b2lkICpwdHIsIEZJTEUgKmYpOwordm9pZCB0YWxsb2NfZW5hYmxlX251bGxfdHJhY2tpbmcodm9pZCk7Cit2b2lkIHRhbGxvY19kaXNhYmxlX251bGxfdHJhY2tpbmcodm9pZCk7Cit2b2lkIHRhbGxvY19lbmFibGVfbGVha19yZXBvcnQodm9pZCk7Cit2b2lkIHRhbGxvY19lbmFibGVfbGVha19yZXBvcnRfZnVsbCh2b2lkKTsKK3ZvaWQgKl90YWxsb2NfemVybyhjb25zdCB2b2lkICpjdHgsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgKl90YWxsb2NfbWVtZHVwKGNvbnN0IHZvaWQgKnQsIGNvbnN0IHZvaWQgKnAsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgKl90YWxsb2NfYXJyYXkoY29uc3Qgdm9pZCAqY3R4LCBzaXplX3QgZWxfc2l6ZSwgdW5zaWduZWQgY291bnQsIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCAqX3RhbGxvY196ZXJvX2FycmF5KGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IGVsX3NpemUsIHVuc2lnbmVkIGNvdW50LCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgKl90YWxsb2NfcmVhbGxvY19hcnJheShjb25zdCB2b2lkICpjdHgsIHZvaWQgKnB0ciwgc2l6ZV90IGVsX3NpemUsIHVuc2lnbmVkIGNvdW50LCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgKnRhbGxvY19yZWFsbG9jX2ZuKGNvbnN0IHZvaWQgKmNvbnRleHQsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOwordm9pZCAqdGFsbG9jX2F1dG9mcmVlX2NvbnRleHQodm9pZCk7CitzaXplX3QgdGFsbG9jX2dldF9zaXplKGNvbnN0IHZvaWQgKmN0eCk7Cit2b2lkICp0YWxsb2NfZmluZF9wYXJlbnRfYnluYW1lKGNvbnN0IHZvaWQgKmN0eCwgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHRhbGxvY19zaG93X3BhcmVudHMoY29uc3Qgdm9pZCAqY29udGV4dCwgRklMRSAqZmlsZSk7CitpbnQgdGFsbG9jX2lzX3BhcmVudChjb25zdCB2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpwdHIpOworCitjaGFyICp0YWxsb2Nfc3RyZHVwKGNvbnN0IHZvaWQgKnQsIGNvbnN0IGNoYXIgKnApOworY2hhciAqdGFsbG9jX3N0cmR1cF9hcHBlbmQoY2hhciAqcywgY29uc3QgY2hhciAqYSk7CitjaGFyICp0YWxsb2Nfc3RyZHVwX2FwcGVuZF9idWZmZXIoY2hhciAqcywgY29uc3QgY2hhciAqYSk7CisKK2NoYXIgKnRhbGxvY19zdHJuZHVwKGNvbnN0IHZvaWQgKnQsIGNvbnN0IGNoYXIgKnAsIHNpemVfdCBuKTsKK2NoYXIgKnRhbGxvY19zdHJuZHVwX2FwcGVuZChjaGFyICpzLCBjb25zdCBjaGFyICphLCBzaXplX3Qgbik7CitjaGFyICp0YWxsb2Nfc3RybmR1cF9hcHBlbmRfYnVmZmVyKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmEsIHNpemVfdCBuKTsKKworY2hhciAqdGFsbG9jX3Zhc3ByaW50Zihjb25zdCB2b2lkICp0LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApIFBSSU5URl9BVFRSSUJVVEUoMiwwKTsKK2NoYXIgKnRhbGxvY192YXNwcmludGZfYXBwZW5kKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkgUFJJTlRGX0FUVFJJQlVURSgyLDApOworY2hhciAqdGFsbG9jX3Zhc3ByaW50Zl9hcHBlbmRfYnVmZmVyKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkgUFJJTlRGX0FUVFJJQlVURSgyLDApOworCitjaGFyICp0YWxsb2NfYXNwcmludGYoY29uc3Qgdm9pZCAqdCwgY29uc3QgY2hhciAqZm10LCAuLi4pIFBSSU5URl9BVFRSSUJVVEUoMiwzKTsKK2NoYXIgKnRhbGxvY19hc3ByaW50Zl9hcHBlbmQoY2hhciAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pIFBSSU5URl9BVFRSSUJVVEUoMiwzKTsKK2NoYXIgKnRhbGxvY19hc3ByaW50Zl9hcHBlbmRfYnVmZmVyKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBQUklOVEZfQVRUUklCVVRFKDIsMyk7CisKK3ZvaWQgdGFsbG9jX3NldF9hYm9ydF9mbih2b2lkICgqYWJvcnRfZm4pKGNvbnN0IGNoYXIgKnJlYXNvbikpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWU4ODhiCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90aW1lci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBUSU1FUl9ICisjZGVmaW5lIFRJTUVSX0gKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlICJsaW51eGxpc3QuaCIKKworLyoqCisgKiBUaW1lciBtYW5hZ2VtZW50OgorICogICAgICAtIENyZWF0ZSBhIHN0cnVjdCB0aW1lcl9saXN0CisgKiAgICAgIC0gRmlsbCBvdXQgdGltZW91dCBhbmQgdXNlIGFkZF90aW1lciBvcgorICogICAgICAgIHVzZSBzY2hlZHVsZV90aW1lciB0byBzY2hlZHVsZSBhIHRpbWVyIGluCisgKiAgICAgICAgeCBzZWNvbmRzIGFuZCBtaWNyb3NlY29uZHMgZnJvbSBub3cuLi4KKyAqICAgICAgLSBVc2UgZGVsX3RpbWVyIHRvIHJlbW92ZSB0aGUgdGltZXIKKyAqCisgKiAgSW50ZXJuYWxseToKKyAqICAgICAgLSBXZSBob29rIGludG8gc2VsZWN0LmMgdG8gZ2l2ZSBhIHRpbWV2YWwgb2YgdGhlCisgKiAgICAgICAgbmVhcmVzdCB0aW1lci4gT24gYWxyZWFkeSBwYXNzZWQgdGltZXJzIHdlIGdpdmUKKyAqICAgICAgICBpdCBhIDAgdG8gaW1tZWRpYXRlbHkgZmlyZSBhZnRlciB0aGUgc2VsZWN0CisgKiAgICAgIC0gdXBkYXRlX3RpbWVycyB3aWxsIGNhbGwgdGhlIGNhbGxiYWNrcyBhbmQgcmVtb3ZlCisgKiAgICAgICAgdGhlIHRpbWVycy4KKyAqCisgKi8KK3N0cnVjdCB0aW1lcl9saXN0IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworCXVuc2lnbmVkIGludCBhY3RpdmUgIDogMTsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA6IDE7CisJdW5zaWduZWQgaW50IGluX2xpc3QgOiAxOworCisJdm9pZCAoKmNiKSh2b2lkKik7CisJdm9pZCAqZGF0YTsKK307CisKKy8qKgorICogdGltZXIgbWFuYWdlbWVudAorICovCit2b2lkIGJzY19hZGRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKK3ZvaWQgYnNjX3NjaGVkdWxlX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgaW50IHNlY29uZHMsIGludCBtaWNyb3NlY29uZHMpOwordm9pZCBic2NfZGVsX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcik7CitpbnQgYnNjX3RpbWVyX3BlbmRpbmcoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKKworCisvKioKKyAqIGludGVybmFsIHRpbWVyIGxpc3QgbWFuYWdlbWVudAorICovCitzdHJ1Y3QgdGltZXZhbCAqYnNjX25lYXJlc3RfdGltZXIoKTsKK3ZvaWQgYnNjX3ByZXBhcmVfdGltZXJzKCk7CitpbnQgYnNjX3VwZGF0ZV90aW1lcnMoKTsKK2ludCBic2NfdGltZXJfY2hlY2sodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90bHYuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczM2RiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKQEAgLTAsMCArMSwyNDQgQEAKKyNpZm5kZWYgX1RMVl9ICisjZGVmaW5lIF9UTFZfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKKy8qIFRlcm1pbm9sb2d5IC8gd29yZGluZworCQl0YWcJbGVuZ3RoCQl2YWx1ZQkoaW4gYml0cykKKworCSAgICBWCS0JLQkJOAorCSAgIExWCS0JOAkJTiAqIDgKKwkgIFRMVgk4CTgJCU4gKiA4CisJVEwxNlYJOAkxNgkJTiAqIDgKKwlUTFYxNgk4CTgJCU4gKiAxNgorCSBUdkxWCTgJOC8xNgkJTiAqIDgKKworKi8KKworI2RlZmluZSBMVl9HUk9TU19MRU4oeCkJCSh4KzEpCisjZGVmaW5lIFRMVl9HUk9TU19MRU4oeCkJKHgrMikKKyNkZWZpbmUgVExWMTZfR1JPU1NfTEVOKHgpCSgoMip4KSsyKQorI2RlZmluZSBUTDE2Vl9HUk9TU19MRU4oeCkJKHgrMykKKyNkZWZpbmUgTDE2VFZfR1JPU1NfTEVOKHgpCSh4KzMpCisKKyNkZWZpbmUgVFZMVl9NQVhfT05FQllURQkweDdmCisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgVFZMVl9HUk9TU19MRU4odWludDE2X3QgbGVuKQoreworCWlmIChsZW4gPD0gVFZMVl9NQVhfT05FQllURSkKKwkJcmV0dXJuIFRMVl9HUk9TU19MRU4obGVuKTsKKwllbHNlCisJCXJldHVybiBUTDE2Vl9HUk9TU19MRU4obGVuKTsKK30KKworLyogVExWIGdlbmVyYXRpb24gKi8KKworc3RhdGljIGlubGluZSB1aW50OF90ICpsdl9wdXQodWludDhfdCAqYnVmLCB1aW50OF90IGxlbiwKKwkJCQljb25zdCB1aW50OF90ICp2YWwpCit7CisJKmJ1ZisrID0gbGVuOworCW1lbWNweShidWYsIHZhbCwgbGVuKTsKKwlyZXR1cm4gYnVmICsgbGVuOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKnRsdl9wdXQodWludDhfdCAqYnVmLCB1aW50OF90IHRhZywgdWludDhfdCBsZW4sCisJCQkJY29uc3QgdWludDhfdCAqdmFsKQoreworCSpidWYrKyA9IHRhZzsKKwkqYnVmKysgPSBsZW47CisJbWVtY3B5KGJ1ZiwgdmFsLCBsZW4pOworCXJldHVybiBidWYgKyBsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqdGx2MTZfcHV0KHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCB0YWcsIHVpbnQ4X3QgbGVuLAorCQkJCWNvbnN0IHVpbnQxNl90ICp2YWwpCit7CisJKmJ1ZisrID0gdGFnOworCSpidWYrKyA9IGxlbjsKKwltZW1jcHkoYnVmLCB2YWwsIGxlbioyKTsKKwlyZXR1cm4gYnVmICsgbGVuKjI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqdGwxNnZfcHV0KHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCB0YWcsIHVpbnQxNl90IGxlbiwKKwkJCQljb25zdCB1aW50OF90ICp2YWwpCit7CisJKmJ1ZisrID0gdGFnOworCSpidWYrKyA9IGxlbiA+PiA4OworCSpidWYrKyA9IGxlbiAmIDB4ZmY7CisJbWVtY3B5KGJ1ZiwgdmFsLCBsZW4pOworCXJldHVybiBidWYgKyBsZW4qMjsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90ICp0dmx2X3B1dCh1aW50OF90ICpidWYsIHVpbnQ4X3QgdGFnLCB1aW50MTZfdCBsZW4sCisJCQkJIGNvbnN0IHVpbnQ4X3QgKnZhbCkKK3sKKwl1aW50OF90ICpyZXQ7CisKKwlpZiAobGVuIDw9IFRWTFZfTUFYX09ORUJZVEUpIHsKKwkJcmV0ID0gdGx2X3B1dChidWYsIHRhZywgbGVuLCB2YWwpOworCQlidWZbMV0gfD0gMHg4MDsKKwl9IGVsc2UKKwkJcmV0ID0gdGwxNnZfcHV0KGJ1ZiwgdGFnLCBsZW4sIHZhbCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1zZ2JfdGx2MTZfcHV0KHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3QgdGFnLCB1aW50OF90IGxlbiwgY29uc3QgdWludDE2X3QgKnZhbCkKK3sKKwl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIFRMVjE2X0dST1NTX0xFTihsZW4pKTsKKwlyZXR1cm4gdGx2MTZfcHV0KGJ1ZiwgdGFnLCBsZW4sIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl90bDE2dl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQxNl90IGxlbiwKKwkJCQkJY29uc3QgdWludDhfdCAqdmFsKQoreworCXVpbnQ4X3QgKmJ1ZiA9IG1zZ2JfcHV0KG1zZywgVEwxNlZfR1JPU1NfTEVOKGxlbikpOworCXJldHVybiB0bDE2dl9wdXQoYnVmLCB0YWcsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90ICptc2diX3R2bHZfcHV0KHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3QgdGFnLCB1aW50MTZfdCBsZW4sCisJCQkJICAgICAgY29uc3QgdWludDhfdCAqdmFsKQoreworCXVpbnQ4X3QgKmJ1ZiA9IG1zZ2JfcHV0KG1zZywgVFZMVl9HUk9TU19MRU4obGVuKSk7CisJcmV0dXJuIHR2bHZfcHV0KGJ1ZiwgdGFnLCBsZW4sIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl9sMTZ0dl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDE2X3QgbGVuLCB1aW50OF90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZhbCkKK3sKKwl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIEwxNlRWX0dST1NTX0xFTihsZW4pKTsKKworCSpidWYrKyA9IGxlbiA+PiA4OworCSpidWYrKyA9IGxlbiAmIDB4ZmY7CisJKmJ1ZisrID0gdGFnOworCW1lbWNweShidWYsIHZhbCwgbGVuKTsKKwlyZXR1cm4gYnVmICsgbGVuOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKnZfcHV0KHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCB2YWwpCit7CisJKmJ1ZisrID0gdmFsOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqdHZfcHV0KHVpbnQ4X3QgKmJ1ZiwgdWludDhfdCB0YWcsIAorCQkJCXVpbnQ4X3QgdmFsKQoreworCSpidWYrKyA9IHRhZzsKKwkqYnVmKysgPSB2YWw7CisJcmV0dXJuIGJ1ZjsKK30KKworLyogJ3ZhbCcgaXMgc3RpbGwgaW4gaG9zdCBieXRlIG9yZGVyISAqLworc3RhdGljIGlubGluZSB1aW50OF90ICp0djE2X3B1dCh1aW50OF90ICpidWYsIHVpbnQ4X3QgdGFnLCAKKwkJCQkgdWludDE2X3QgdmFsKQoreworCSpidWYrKyA9IHRhZzsKKwkqYnVmKysgPSB2YWwgPj4gODsKKwkqYnVmKysgPSB2YWwgJiAweGZmOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl9sdl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBsZW4sIGNvbnN0IHVpbnQ4X3QgKnZhbCkKK3sKKwl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIExWX0dST1NTX0xFTihsZW4pKTsKKwlyZXR1cm4gbHZfcHV0KGJ1ZiwgbGVuLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1zZ2JfdGx2X3B1dChzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50OF90IHRhZywgdWludDhfdCBsZW4sIGNvbnN0IHVpbnQ4X3QgKnZhbCkKK3sKKwl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIFRMVl9HUk9TU19MRU4obGVuKSk7CisJcmV0dXJuIHRsdl9wdXQoYnVmLCB0YWcsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90ICptc2diX3R2X3B1dChzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50OF90IHRhZywgdWludDhfdCB2YWwpCit7CisJdWludDhfdCAqYnVmID0gbXNnYl9wdXQobXNnLCAyKTsKKwlyZXR1cm4gdHZfcHV0KGJ1ZiwgdGFnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1zZ2Jfdl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB2YWwpCit7CisJdWludDhfdCAqYnVmID0gbXNnYl9wdXQobXNnLCAxKTsKKwlyZXR1cm4gdl9wdXQoYnVmLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKm1zZ2JfdHYxNl9wdXQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQxNl90IHZhbCkKK3sKKwl1aW50OF90ICpidWYgPSBtc2diX3B1dChtc2csIDMpOworCXJldHVybiB0djE2X3B1dChidWYsIHRhZywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90ICptc2diX3Rsdl9wdXNoKHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3QgdGFnLCB1aW50OF90IGxlbiwgY29uc3QgdWludDhfdCAqdmFsKQoreworCXVpbnQ4X3QgKmJ1ZiA9IG1zZ2JfcHVzaChtc2csIFRMVl9HUk9TU19MRU4obGVuKSk7CisJcmV0dXJuIHRsdl9wdXQoYnVmLCB0YWcsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90ICptc2diX3R2X3B1c2goc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQ4X3QgdmFsKQoreworCXVpbnQ4X3QgKmJ1ZiA9IG1zZ2JfcHVzaChtc2csIDIpOworCXJldHVybiB0dl9wdXQoYnVmLCB0YWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl90djE2X3B1c2goc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQxNl90IHZhbCkKK3sKKwl1aW50OF90ICpidWYgPSBtc2diX3B1c2gobXNnLCAzKTsKKwlyZXR1cm4gdHYxNl9wdXQoYnVmLCB0YWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqbXNnYl90dmx2X3B1c2goc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCB0YWcsIHVpbnQxNl90IGxlbiwKKwkJCQkgICAgICBjb25zdCB1aW50OF90ICp2YWwpCit7CisJdWludDhfdCAqYnVmID0gbXNnYl9wdXNoKG1zZywgVFZMVl9HUk9TU19MRU4obGVuKSk7CisJcmV0dXJuIHR2bHZfcHV0KGJ1ZiwgdGFnLCBsZW4sIHZhbCk7Cit9CisKKy8qIFRMViBwYXJzaW5nICovCisKK3N0cnVjdCB0bHZfcF9lbnRyeSB7CisJdWludDE2X3QgbGVuOworCWNvbnN0IHVpbnQ4X3QgKnZhbDsKK307CisKK2VudW0gdGx2X3R5cGUgeworCVRMVl9UWVBFX05PTkUsCisJVExWX1RZUEVfRklYRUQsCisJVExWX1RZUEVfVCwKKwlUTFZfVFlQRV9UViwKKwlUTFZfVFlQRV9UTFYsCisJVExWX1RZUEVfVEwxNlYsCisJVExWX1RZUEVfVHZMViwKK307CisKK3N0cnVjdCB0bHZfZGVmIHsKKwllbnVtIHRsdl90eXBlIHR5cGU7CisJdWludDhfdCBmaXhlZF9sZW47Cit9OworCitzdHJ1Y3QgdGx2X2RlZmluaXRpb24geworCXN0cnVjdCB0bHZfZGVmIGRlZlsweGZmXTsKK307CisKK3N0cnVjdCB0bHZfcGFyc2VkIHsKKwlzdHJ1Y3QgdGx2X3BfZW50cnkgbHZbMHhmZl07Cit9OworCitleHRlcm4gc3RydWN0IHRsdl9kZWZpbml0aW9uIHR2bHZfYXR0X2RlZjsKKworaW50IHRsdl9wYXJzZV9vbmUodWludDhfdCAqb190YWcsIHVpbnQxNl90ICpvX2xlbiwgY29uc3QgdWludDhfdCAqKm9fdmFsLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uICpkZWYsCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfbGVuKTsKK2ludCB0bHZfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKmRlYywgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uICpkZWYsCisJICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX2xlbiwgdWludDhfdCBsdl90YWcsIHVpbnQ4X3QgbHZfdGFnMik7CisvKiB0YWtlIGEgbWFzdGVyIChzcmMpIHRsdmRldiBhbmQgZmlsbCB1cCBhbGwgZW1wdHkgc2xvdHMgaW4gJ2RzdCcgKi8KK3ZvaWQgdGx2X2RlZl9wYXRjaChzdHJ1Y3QgdGx2X2RlZmluaXRpb24gKmRzdCwgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uICpzcmMpOworCisjZGVmaW5lIFRMVlBfUFJFU0VOVCh4LCB5KQkoKHgpLT5sdlt5XS52YWwpCisjZGVmaW5lIFRMVlBfTEVOKHgsIHkpCQkoeCktPmx2W3ldLmxlbgorI2RlZmluZSBUTFZQX1ZBTCh4LCB5KQkJKHgpLT5sdlt5XS52YWwKKworI2VuZGlmIC8qIF9UTFZfSCAqLwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS91dGlscy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzZmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3V0aWxzLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBPU01PQ09SRV9VVElMX0gKKyNkZWZpbmUgT1NNT0NPUkVfVVRJTF9ICisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RydWN0IHZhbHVlX3N0cmluZyB7CisJdW5zaWduZWQgaW50IHZhbHVlOworCWNvbnN0IGNoYXIgKnN0cjsKK307CisKK2NvbnN0IGNoYXIgKmdldF92YWx1ZV9zdHJpbmcoY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyAqdnMsIHVpbnQzMl90IHZhbCk7CitpbnQgZ2V0X3N0cmluZ192YWx1ZShjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nICp2cywgY29uc3QgY2hhciAqc3RyKTsKKworY2hhciBiY2QyY2hhcih1aW50OF90IGJjZCk7CisvKiBvbmx5IHdvcmtzIGZvciBudW1iZXJzIGluIGFzY2NpICovCit1aW50OF90IGNoYXIyYmNkKGNoYXIgYyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS93cml0ZV9xdWV1ZS5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS93cml0ZV9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMjQ0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3dyaXRlX3F1ZXVlLmgKQEAgLTAsMCArMSw0NiBAQAorLyogR2VuZXJpYyB3cml0ZSBxdWV1ZSBpbXBsZW1lbnRhdGlvbiAqLworLyoKKyAqIChDKSAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiAoQykgMjAxMCBieSBPbi1XYXZlcworICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworI2lmbmRlZiB3cml0ZV9xdWV1ZV9oCisjZGVmaW5lIHdyaXRlX3F1ZXVlX2gKKworI2luY2x1ZGUgInNlbGVjdC5oIgorI2luY2x1ZGUgIm1zZ2IuaCIKKworc3RydWN0IHdyaXRlX3F1ZXVlIHsKKwlzdHJ1Y3QgYnNjX2ZkIGJmZDsKKwl1bnNpZ25lZCBpbnQgbWF4X2xlbmd0aDsKKwl1bnNpZ25lZCBpbnQgY3VycmVudF9sZW5ndGg7CisKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBtc2dfcXVldWU7CisKKwlpbnQgKCpyZWFkX2NiKShzdHJ1Y3QgYnNjX2ZkICpmZCk7CisJaW50ICgqd3JpdGVfY2IpKHN0cnVjdCBic2NfZmQgKmZkLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlpbnQgKCpleGNlcHRfY2IpKHN0cnVjdCBic2NfZmQgKmZkKTsKK307CisKK3ZvaWQgd3JpdGVfcXVldWVfaW5pdChzdHJ1Y3Qgd3JpdGVfcXVldWUgKnF1ZXVlLCBpbnQgbWF4X2xlbmd0aCk7Cit2b2lkIHdyaXRlX3F1ZXVlX2NsZWFyKHN0cnVjdCB3cml0ZV9xdWV1ZSAqcXVldWUpOworaW50IHdyaXRlX3F1ZXVlX2VucXVldWUoc3RydWN0IHdyaXRlX3F1ZXVlICpxdWV1ZSwgc3RydWN0IG1zZ2IgKmRhdGEpOworaW50IHdyaXRlX3F1ZXVlX2JmZF9jYihzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlLnBjLmluIGIvbGlib3Ntb2NvcmUvbGlib3Ntb2NvcmUucGMuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYm9zbW9jb3JlLnBjLmluCnJlbmFtZSB0byBsaWJvc21vY29yZS9saWJvc21vY29yZS5wYy5pbgpkaWZmIC0tZ2l0IGEvbTQvRFVNTVkgYi9saWJvc21vY29yZS9tNC9EVU1NWQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbTQvRFVNTVkKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL200L0RVTU1ZCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9zcmMvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9zcmMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwNjNkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL3NyYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE3IEBACisjIFRoaXMgaXMgX05PVF8gdGhlIGxpYnJhcnkgcmVsZWFzZSB2ZXJzaW9uLCBpdCdzIGFuIEFQSSB2ZXJzaW9uLgorIyBQbGVhc2UgcmVhZCBDaGFwdGVyIDYgIkxpYnJhcnkgaW50ZXJmYWNlIHZlcnNpb25zIiBvZiB0aGUgbGlidG9vbCBkb2N1bWVudGF0aW9uIGJlZm9yZSBtYWtpbmcgYW55IG1vZGlmaWNhdGlvbgorTElCVkVSU0lPTj0wOjA6MAorCitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTID0gLWZQSUMgLVdhbGwKKworbGliX0xUTElCUkFSSUVTID0gbGlib3Ntb2NvcmUubGEKKworbGlib3Ntb2NvcmVfbGFfU09VUkNFUyA9IHRpbWVyLmMgc2VsZWN0LmMgc2lnbmFsLmMgbXNnYi5jIHJ4bGV2X3N0YXQuYyBcCisJCQkgdGx2X3BhcnNlci5jIGJpdHZlYy5jIGNvbXAxMjguYyBnc21fdXRpbHMuYyBzdGF0aXN0aWNzLmMgXAorCQkJIHdyaXRlX3F1ZXVlLmMgdXRpbHMuYyByc2wuYyBnc200OC5jIGdzbTQ4X2llLmMgXAorCQkJIGxvZ2dpbmcuYyBnc20wODA4LmMgcmF0ZV9jdHIuYworCitpZiBFTkFCTEVfVEFMTE9DCitsaWJvc21vY29yZV9sYV9TT1VSQ0VTICs9IHRhbGxvYy5jCitlbmRpZgpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL2JpdHZlYy5jIGIvbGlib3Ntb2NvcmUvc3JjL2JpdHZlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODNhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvYml0dmVjLmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qIGJpdCB2ZWN0b3IgdXRpbGl0eSByb3V0aW5lcyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CisKKyNkZWZpbmUgQklUTlVNX0ZST01fQ09NUChieXRlLCBiaXQpCSgoYnl0ZSo4KStiaXQpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJ5dGVudW1fZnJvbV9iaXRudW0odW5zaWduZWQgaW50IGJpdG51bSkKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZW51bSA9IGJpdG51bSAvIDg7CisKKwlyZXR1cm4gYnl0ZW51bTsKK30KKworLyogY29udmVydCBaRVJPL09ORS9ML0ggdG8gYSBiaXRtYXNrIGF0IGdpdmVuIHBvcyBpbiBhIGJ5dGUgKi8KK3N0YXRpYyB1aW50OF90IGJpdHZhbDJtYXNrKGVudW0gYml0X3ZhbHVlIGJpdCwgdWludDhfdCBiaXRudW0pCit7CisJaW50IGJpdHZhbDsKKworCXN3aXRjaCAoYml0KSB7CisJY2FzZSBaRVJPOgorCQliaXR2YWwgPSAoMCA8PCBiaXRudW0pOworCQlicmVhazsKKwljYXNlIE9ORToKKwkJYml0dmFsID0gKDEgPDwgYml0bnVtKTsKKwkJYnJlYWs7CisJY2FzZSBMOgorCQliaXR2YWwgPSAoKDB4MmIgXiAoMCA8PCBiaXRudW0pKSAmICgxIDw8IGJpdG51bSkpOworCQlicmVhazsKKwljYXNlIEg6CisJCWJpdHZhbCA9ICgoMHgyYiBeICgxIDw8IGJpdG51bSkpICYgKDEgPDwgYml0bnVtKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gYml0dmFsOworfQorCisvKiBjaGVjayBpZiB0aGUgYml0IGlzIDAgb3IgMSBmb3IgYSBnaXZlbiBwb3NpdGlvbiBpbnNpZGUgYSBiaXR2ZWMgKi8KK2VudW0gYml0X3ZhbHVlIGJpdHZlY19nZXRfYml0X3Bvcyhjb25zdCBzdHJ1Y3QgYml0dmVjICpidiwgdW5zaWduZWQgaW50IGJpdG5yKQoreworCXVuc2lnbmVkIGludCBieXRlbnVtID0gYnl0ZW51bV9mcm9tX2JpdG51bShiaXRucik7CisJdW5zaWduZWQgaW50IGJpdG51bSA9IDcgLSAoYml0bnIgJSA4KTsKKwl1aW50OF90IGJpdHZhbDsKKworCWlmIChieXRlbnVtID49IGJ2LT5kYXRhX2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliaXR2YWwgPSBiaXR2YWwybWFzayhPTkUsIGJpdG51bSk7CisKKwlpZiAoYnYtPmRhdGFbYnl0ZW51bV0gJiBiaXR2YWwpCisJCXJldHVybiBPTkU7CisKKwlyZXR1cm4gWkVSTzsKK30KKworLyogZ2V0IHRoZSBOdGggc2V0IGJpdCBpbnNpZGUgdGhlIGJpdCB2ZWN0b3IgKi8KK3Vuc2lnbmVkIGludCBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KGNvbnN0IHN0cnVjdCBiaXR2ZWMgKmJ2LCB1bnNpZ25lZCBpbnQgbikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgayA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnYtPmRhdGFfbGVuKjg7IGkrKykgeworCQlpZiAoYml0dmVjX2dldF9iaXRfcG9zKGJ2LCBpKSA9PSBPTkUpIHsKKwkJCWsrKzsKKwkJCWlmIChrID09IG4pCisJCQkJcmV0dXJuIGk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IHRoZSBiaXQgYXQgYSBnaXZlbiBwb3NpdGlvbiBpbnNpZGUgYSBiaXR2ZWMgKi8KK2ludCBiaXR2ZWNfc2V0X2JpdF9wb3Moc3RydWN0IGJpdHZlYyAqYnYsIHVuc2lnbmVkIGludCBiaXRuciwKKwkJCWVudW0gYml0X3ZhbHVlIGJpdCkKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZW51bSA9IGJ5dGVudW1fZnJvbV9iaXRudW0oYml0bnIpOworCXVuc2lnbmVkIGludCBiaXRudW0gPSA3IC0gKGJpdG5yICUgOCk7CisJdWludDhfdCBiaXR2YWw7CisKKwlpZiAoYnl0ZW51bSA+PSBidi0+ZGF0YV9sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZmlyc3QgY2xlYXIgdGhlIGJpdCAqLworCWJpdHZhbCA9IGJpdHZhbDJtYXNrKE9ORSwgYml0bnVtKTsKKwlidi0+ZGF0YVtieXRlbnVtXSAmPSB+Yml0dmFsOworCisJLyogdGhlbiBzZXQgaXQgdG8gZGVzaXJlZCB2YWx1ZSAqLworCWJpdHZhbCA9IGJpdHZhbDJtYXNrKGJpdCwgYml0bnVtKTsKKwlidi0+ZGF0YVtieXRlbnVtXSB8PSBiaXR2YWw7CisKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IHRoZSBuZXh0IGJpdCBpbnNpZGUgYSBiaXR2ZWMgKi8KK2ludCBiaXR2ZWNfc2V0X2JpdChzdHJ1Y3QgYml0dmVjICpidiwgZW51bSBiaXRfdmFsdWUgYml0KQoreworCWludCByYzsKKworCXJjID0gYml0dmVjX3NldF9iaXRfcG9zKGJ2LCBidi0+Y3VyX2JpdCwgYml0KTsKKwlpZiAoIXJjKQorCQlidi0+Y3VyX2JpdCsrOworCisJcmV0dXJuIHJjOworfQorCisvKiBzZXQgbXVsdGlwbGUgYml0cyAoYmFzZWQgb24gYXJyYXkgb2YgYml0dmFscykgYXQgY3VycmVudCBwb3MgKi8KK2ludCBiaXR2ZWNfc2V0X2JpdHMoc3RydWN0IGJpdHZlYyAqYnYsIGVudW0gYml0X3ZhbHVlICpiaXRzLCBpbnQgY291bnQpCit7CisJaW50IGksIHJjOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmMgPSBiaXR2ZWNfc2V0X2JpdChidiwgYml0c1tpXSk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IG11bHRpcGxlIGJpdHMgKGJhc2VkIG9uIG51bWVyaWMgdmFsdWUpIGF0IGN1cnJlbnQgcG9zICovCitpbnQgYml0dmVjX3NldF91aW50KHN0cnVjdCBiaXR2ZWMgKmJ2LCB1bnNpZ25lZCBpbnQgdWksIGludCBudW1fYml0cykKK3sKKwlpbnQgaSwgcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2JpdHM7IGkrKykgeworCQlpbnQgYml0ID0gMDsKKwkJaWYgKHVpICYgKDEgPDwgKG51bV9iaXRzIC0gaSAtIDEpKSkKKwkJCWJpdCA9IDE7CisJCXJjID0gYml0dmVjX3NldF9iaXQoYnYsIGJpdCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogcGFkIGFsbCByZW1haW5pbmcgYml0cyB1cCB0byBudW1fYml0cyAqLworaW50IGJpdHZlY19zcGFyZV9wYWRkaW5nKHN0cnVjdCBiaXR2ZWMgKmJ2LCB1bnNpZ25lZCBpbnQgdXBfdG9fYml0KQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gYnYtPmN1cl9iaXQ7IGkgPD0gdXBfdG9fYml0OyBpKyspCisJCWJpdHZlY19zZXRfYml0KGJ2LCBMKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL2NvbXAxMjguYyBiL2xpYm9zbW9jb3JlL3NyYy9jb21wMTI4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1NjgwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL3NyYy9jb21wMTI4LmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBDT01QMTI4IGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIFRoaXMgY29kZSBpcyBpbnNwaXJlZCBieSBvcmlnaW5hbCBjb2RlIGZyb20gOgorICogIE1hcmMgQnJpY2VubyA8bWFyY0BzY2FyZC5vcmc+LCBJYW4gR29sZGJlcmcgPGlhbmdAY3MuYmVya2VsZXkuZWR1PiwKKyAqICBhbmQgRGF2aWQgV2FnbmVyIDxkYXdAY3MuYmVya2VsZXkuZWR1PgorICoKKyAqIEJ1dCBpdCBoYXMgYmVlbiBmdWxseSByZXdyaXR0ZW4gZnJvbSB2YXJpb3VzIFBERnMgZm91bmQgb25saW5lIGRlc2NyaWJpbmcKKyAqIHRoZSBhbGdvcml0aG0gYmVjYXVzZSB0aGUgbGljZW5jZSBvZiB0aGUgY29kZSByZWZlcmVuY2VkIGFib3ZlIHdhcyB1bmNsZWFyLgorICogQSBjb21tZW50IHNuaXBwZXQgZnJvbSB0aGUgb3JpZ2luYWwgY29kZSBpcyBpbmNsdWRlZCBiZWxvdywgaXQgZGVzY3JpYmVzCisgKiB3aGVyZSB0aGUgZG9jIGNhbWUgZnJvbSBhbmQgaG93IHRoZSBhbGdvcml0aG0gd2FzIHJldmVyc2UgZW5naW5lZXJlZC4KKyAqCisgKgorICogKEMpIDIwMDkgYnkgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisvKgorICogLS0tIFNOSVAgLS0tCisgKgorICogVGhpcyBjb2RlIGRlcml2ZWQgZnJvbSBhIGxlYWtlZCBkb2N1bWVudCBmcm9tIHRoZSBHU00gc3RhbmRhcmRzLgorICogU29tZSBtaXNzaW5nIHBpZWNlcyB3ZXJlIGZpbGxlZCBpbiBieSByZXZlcnNlLWVuZ2luZWVyaW5nIGEgd29ya2luZyBTSU0uCisgKiBXZSBoYXZlIHZlcmlmaWVkIHRoYXQgdGhpcyBpcyB0aGUgY29ycmVjdCBDT01QMTI4IGFsZ29yaXRobS4KKyAqCisgKiBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgZG9jdW1lbnQgaWRlbnRpZmllcyBpdCBhcworICogCV9UZWNobmljYWwgSW5mb3JtYXRpb246IEdTTSBTeXN0ZW0gU2VjdXJpdHkgU3R1ZHlfLgorICogCTEwLTE2MTctMDEsIDEwdGggSnVuZSAxOTg4LgorICogVGhlIGJvdHRvbSBvZiB0aGUgdGl0bGUgcGFnZSBpcyBtYXJrZWQKKyAqIAlSYWNhbCBSZXNlYXJjaCBMdGQuCisgKiAJV29ydG9uIERyaXZlLCBXb3J0b24gR3JhbmdlIEluZHVzdHJpYWwgRXN0YXRlLAorICogCVJlYWRpbmcsIEJlcmtzLiBSRzIgMFNCLCBFbmdsYW5kLgorICogCVRlbGVwaG9uZTogUmVhZGluZyAoMDczNCkgODY4NjAxICAgVGVsZXg6IDg0NzE1MgorICogVGhlIHJlbGV2YW50IGJpdHMgYXJlIGluIFBhcnQgSSwgU2VjdGlvbiAyMCAocGFnZXMgNjYtLTY3KS4gIEVuam95IQorICoKKyAqIE5vdGU6IFRoZXJlIGFyZSB0aHJlZSB0eXBvcyBpbiB0aGUgc3BlYyAoZGlzY292ZXJlZCBieQorICogcmV2ZXJzZS1lbmdpbmVlcmluZykuCisgKiBGaXJzdCwgInogPSAoMiAqIHhbbl0gKyB4W25dKSBtb2QgMl4oOS1qKSIgc2hvdWxkIGNsZWFybHkgcmVhZAorICogInogPSAoMiAqIHhbbV0gKyB4W25dKSBtb2QgMl4oOS1qKSIuCisgKiBTZWNvbmQsIHRoZSAiayIgbG9vcCBpbiB0aGUgIkZvcm0gYml0cyBmcm9tIGJ5dGVzIiBzZWN0aW9uIGlzIHNldmVyZWx5CisgKiBib3RjaGVkOiB0aGUgayBpbmRleCBzaG91bGQgcnVuIG9ubHkgZnJvbSAwIHRvIDMsIGFuZCBjbGVhcmx5IHRoZSByYW5nZQorICogb24gInRoZSAoOC1rKXRoIGJpdCBvZiBieXRlIGoiIGlzIGFsc28gb2ZmIChzaG91bGQgYmUgMC4uNywgbm90IDEuLjgsCisgKiB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHN1YnNlcXVlbnQgc2VjdGlvbikuCisgKiBUaGlyZCwgU1JFUyBpcyB0YWtlbiBmcm9tIHRoZSBmaXJzdCA4IG5pYmJsZXMgb2YgeFtdLCBub3QgdGhlIGxhc3QgOCBhcworICogY2xhaW1lZCBpbiB0aGUgZG9jdW1lbnQuICAoQW5kIHRoZSBkb2N1bWVudCBkb2Vzbid0IHNwZWNpZnkgaG93IEtjIGlzCisgKiBkZXJpdmVkLCBidXQgdGhhdCB3YXMgYWxzbyBlYXNpbHkgZGlzY292ZXJlZCB3aXRoIHJldmVyc2UgZW5naW5lZXJpbmcuKQorICogQWxsIG9mIHRoZXNlIHR5cG9zIGhhdmUgYmVlbiBjb3JyZWN0ZWQgaW4gdGhlIGZvbGxvd2luZyBjb2RlLgorICoKKyAqIC0tLSAvU05JUCAtLS0KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFRoZSBjb21wcmVzc2lvbiB0YWJsZXMgKGp1c3QgY29waWVkIC4uLikgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHRhYmxlXzBbNTEyXSA9IHsKKyAxMDIsIDE3NywgMTg2LCAxNjIsICAgMiwgMTU2LCAxMTIsICA3NSwgIDU1LCAgMjUsICAgOCwgIDEyLCAyNTEsIDE5MywgMjQ2LCAxODgsCisgMTA5LCAyMTMsIDE1MSwgIDUzLCAgNDIsICA3OSwgMTkxLCAxMTUsIDIzMywgMjQyLCAxNjQsIDIyMywgMjA5LCAxNDgsIDEwOCwgMTYxLAorIDI1MiwgIDM3LCAyNDQsICA0NywgIDY0LCAyMTEsICAgNiwgMjM3LCAxODUsIDE2MCwgMTM5LCAxMTMsICA3NiwgMTM4LCAgNTksICA3MCwKKyAgNjcsICAyNiwgIDEzLCAxNTcsICA2MywgMTc5LCAyMjEsICAzMCwgMjE0LCAgMzYsIDE2NiwgIDY5LCAxNTIsIDEyNCwgMjA3LCAxMTYsCisgMjQ3LCAxOTQsICA0MSwgIDg0LCAgNzEsICAgMSwgIDQ5LCAgMTQsICA5NSwgIDM1LCAxNjksICAyMSwgIDk2LCAgNzgsIDIxNSwgMjI1LAorIDE4MiwgMjQzLCAgMjgsICA5MiwgMjAxLCAxMTgsICAgNCwgIDc0LCAyNDgsIDEyOCwgIDE3LCAgMTEsIDE0NiwgMTMyLCAyNDUsICA0OCwKKyAxNDksICA5MCwgMTIwLCAgMzksICA4NywgMjMwLCAxMDYsIDIzMiwgMTc1LCAgMTksIDEyNiwgMTkwLCAyMDIsIDE0MSwgMTM3LCAxNzYsCisgMjUwLCAgMjcsIDEwMSwgIDQwLCAyMTksIDIyNywgIDU4LCAgMjAsICA1MSwgMTc4LCAgOTgsIDIxNiwgMTQwLCAgMjIsICAzMiwgMTIxLAorICA2MSwgMTAzLCAyMDMsICA3MiwgIDI5LCAxMTAsICA4NSwgMjEyLCAxODAsIDIwNCwgMTUwLCAxODMsICAxNSwgIDY2LCAxNzIsIDE5NiwKKyAgNTYsIDE5NywgMTU4LCAgIDAsIDEwMCwgIDQ1LCAxNTMsICAgNywgMTQ0LCAyMjIsIDE2MywgMTY3LCAgNjAsIDEzNSwgMjEwLCAyMzEsCisgMTc0LCAxNjUsICAzOCwgMjQ5LCAyMjQsICAzNCwgMjIwLCAyMjksIDIxNywgMjA4LCAyNDEsICA2OCwgMjA2LCAxODksIDEyNSwgMjU1LAorIDIzOSwgIDU0LCAxNjgsICA4OSwgMTIzLCAxMjIsICA3MywgMTQ1LCAxMTcsIDIzNCwgMTQzLCAgOTksIDEyOSwgMjAwLCAxOTIsICA4MiwKKyAxMDQsIDE3MCwgMTM2LCAyMzUsICA5MywgIDgxLCAyMDUsIDE3MywgMjM2LCAgOTQsIDEwNSwgIDUyLCAgNDYsIDIyOCwgMTk4LCAgIDUsCisgIDU3LCAyNTQsICA5NywgMTU1LCAxNDIsIDEzMywgMTk5LCAxNzEsIDE4NywgIDUwLCAgNjUsIDE4MSwgMTI3LCAxMDcsIDE0NywgMjI2LAorIDE4NCwgMjE4LCAxMzEsICAzMywgIDc3LCAgODYsICAzMSwgIDQ0LCAgODgsICA2MiwgMjM4LCAgMTgsICAyNCwgIDQzLCAxNTQsICAyMywKKyAgODAsIDE1OSwgMTM0LCAxMTEsICAgOSwgMTE0LCAgIDMsICA5MSwgIDE2LCAxMzAsICA4MywgIDEwLCAxOTUsIDI0MCwgMjUzLCAxMTksCisgMTc3LCAxMDIsIDE2MiwgMTg2LCAxNTYsICAgMiwgIDc1LCAxMTIsICAyNSwgIDU1LCAgMTIsICAgOCwgMTkzLCAyNTEsIDE4OCwgMjQ2LAorIDIxMywgMTA5LCAgNTMsIDE1MSwgIDc5LCAgNDIsIDExNSwgMTkxLCAyNDIsIDIzMywgMjIzLCAxNjQsIDE0OCwgMjA5LCAxNjEsIDEwOCwKKyAgMzcsIDI1MiwgIDQ3LCAyNDQsIDIxMSwgIDY0LCAyMzcsICAgNiwgMTYwLCAxODUsIDExMywgMTM5LCAxMzgsICA3NiwgIDcwLCAgNTksCisgIDI2LCAgNjcsIDE1NywgIDEzLCAxNzksICA2MywgIDMwLCAyMjEsICAzNiwgMjE0LCAgNjksIDE2NiwgMTI0LCAxNTIsIDExNiwgMjA3LAorIDE5NCwgMjQ3LCAgODQsICA0MSwgICAxLCAgNzEsICAxNCwgIDQ5LCAgMzUsICA5NSwgIDIxLCAxNjksICA3OCwgIDk2LCAyMjUsIDIxNSwKKyAyNDMsIDE4MiwgIDkyLCAgMjgsIDExOCwgMjAxLCAgNzQsICAgNCwgMTI4LCAyNDgsICAxMSwgIDE3LCAxMzIsIDE0NiwgIDQ4LCAyNDUsCisgIDkwLCAxNDksICAzOSwgMTIwLCAyMzAsICA4NywgMjMyLCAxMDYsICAxOSwgMTc1LCAxOTAsIDEyNiwgMTQxLCAyMDIsIDE3NiwgMTM3LAorICAyNywgMjUwLCAgNDAsIDEwMSwgMjI3LCAyMTksICAyMCwgIDU4LCAxNzgsICA1MSwgMjE2LCAgOTgsICAyMiwgMTQwLCAxMjEsICAzMiwKKyAxMDMsICA2MSwgIDcyLCAyMDMsIDExMCwgIDI5LCAyMTIsICA4NSwgMjA0LCAxODAsIDE4MywgMTUwLCAgNjYsICAxNSwgMTk2LCAxNzIsCisgMTk3LCAgNTYsICAgMCwgMTU4LCAgNDUsIDEwMCwgICA3LCAxNTMsIDIyMiwgMTQ0LCAxNjcsIDE2MywgMTM1LCAgNjAsIDIzMSwgMjEwLAorIDE2NSwgMTc0LCAyNDksICAzOCwgIDM0LCAyMjQsIDIyOSwgMjIwLCAyMDgsIDIxNywgIDY4LCAyNDEsIDE4OSwgMjA2LCAyNTUsIDEyNSwKKyAgNTQsIDIzOSwgIDg5LCAxNjgsIDEyMiwgMTIzLCAxNDUsICA3MywgMjM0LCAxMTcsICA5OSwgMTQzLCAyMDAsIDEyOSwgIDgyLCAxOTIsCisgMTcwLCAxMDQsIDIzNSwgMTM2LCAgODEsICA5MywgMTczLCAyMDUsICA5NCwgMjM2LCAgNTIsIDEwNSwgMjI4LCAgNDYsICAgNSwgMTk4LAorIDI1NCwgIDU3LCAxNTUsICA5NywgMTMzLCAxNDIsIDE3MSwgMTk5LCAgNTAsIDE4NywgMTgxLCAgNjUsIDEwNywgMTI3LCAyMjYsIDE0NywKKyAyMTgsIDE4NCwgIDMzLCAxMzEsICA4NiwgIDc3LCAgNDQsICAzMSwgIDYyLCAgODgsICAxOCwgMjM4LCAgNDMsICAyNCwgIDIzLCAxNTQsCisgMTU5LCAgODAsIDExMSwgMTM0LCAxMTQsICAgOSwgIDkxLCAgIDMsIDEzMCwgIDE2LCAgMTAsICA4MywgMjQwLCAxOTUsIDExOSwgMjUzLAorfSwgdGFibGVfMVsyNTZdID0geworICAxOSwgIDExLCAgODAsIDExNCwgIDQzLCAgIDEsICA2OSwgIDk0LCAgMzksICAxOCwgMTI3LCAxMTcsICA5NywgICAzLCAgODUsICA0MywKKyAgMjcsIDEyNCwgIDcwLCAgODMsICA0NywgIDcxLCAgNjMsICAxMCwgIDQ3LCAgODksICA3OSwgICA0LCAgMTQsICA1OSwgIDExLCAgIDUsCisgIDM1LCAxMDcsIDEwMywgIDY4LCAgMjEsICA4NiwgIDM2LCAgOTEsICA4NSwgMTI2LCAgMzIsICA1MCwgMTA5LCAgOTQsIDEyMCwgICA2LAorICA1MywgIDc5LCAgMjgsICA0NSwgIDk5LCAgOTUsICA0MSwgIDM0LCAgODgsICA2OCwgIDkzLCAgNTUsIDExMCwgMTI1LCAxMDUsICAyMCwKKyAgOTAsICA4MCwgIDc2LCAgOTYsICAyMywgIDYwLCAgODksICA2NCwgMTIxLCAgNTYsICAxNCwgIDc0LCAxMDEsICAgOCwgIDE5LCAgNzgsCisgIDc2LCAgNjYsIDEwNCwgIDQ2LCAxMTEsICA1MCwgIDMyLCAgIDMsICAzOSwgICAwLCAgNTgsICAyNSwgIDkyLCAgMjIsICAxOCwgIDUxLAorICA1NywgIDY1LCAxMTksIDExNiwgIDIyLCAxMDksICAgNywgIDg2LCAgNTksICA5MywgIDYyLCAxMTAsICA3OCwgIDk5LCAgNzcsICA2NywKKyAgMTIsIDExMywgIDg3LCAgOTgsIDEwMiwgICA1LCAgODgsICAzMywgIDM4LCAgNTYsICAyMywgICA4LCAgNzUsICA0NSwgIDEzLCAgNzUsCisgIDk1LCAgNjMsICAyOCwgIDQ5LCAxMjMsIDEyMCwgIDIwLCAxMTIsICA0NCwgIDMwLCAgMTUsICA5OCwgMTA2LCAgIDIsIDEwMywgIDI5LAorICA4MiwgMTA3LCAgNDIsIDEyNCwgIDI0LCAgMzAsICA0MSwgIDE2LCAxMDgsIDEwMCwgMTE3LCAgNDAsICA3MywgIDQwLCAgIDcsIDExNCwKKyAgODIsIDExNSwgIDM2LCAxMTIsICAxMiwgMTAyLCAxMDAsICA4NCwgIDkyLCAgNDgsICA3MiwgIDk3LCAgIDksICA1NCwgIDU1LCAgNzQsCisgMTEzLCAxMjMsICAxNywgIDI2LCAgNTMsICA1OCwgICA0LCAgIDksICA2OSwgMTIyLCAgMjEsIDExOCwgIDQyLCAgNjAsICAyNywgIDczLAorIDExOCwgMTI1LCAgMzQsICAxNSwgIDY1LCAxMTUsICA4NCwgIDY0LCAgNjIsICA4MSwgIDcwLCAgIDEsICAyNCwgMTExLCAxMjEsICA4MywKKyAxMDQsICA4MSwgIDQ5LCAxMjcsICA0OCwgMTA1LCAgMzEsICAxMCwgICA2LCAgOTEsICA4NywgIDM3LCAgMTYsICA1NCwgMTE2LCAxMjYsCisgIDMxLCAgMzgsICAxMywgICAwLCAgNzIsIDEwNiwgIDc3LCAgNjEsICAyNiwgIDY3LCAgNDYsICAyOSwgIDk2LCAgMzcsICA2MSwgIDUyLAorIDEwMSwgIDE3LCAgNDQsIDEwOCwgIDcxLCAgNTIsICA2NiwgIDU3LCAgMzMsICA1MSwgIDI1LCAgOTAsICAgMiwgMTE5LCAxMjIsICAzNSwKK30sIHRhYmxlXzJbMTI4XSA9IHsKKyA1MiwgIDUwLCAgNDQsICAgNiwgIDIxLCAgNDksICA0MSwgIDU5LCAgMzksICA1MSwgIDI1LCAgMzIsICA1MSwgIDQ3LCAgNTIsICA0MywKKyAzNywgICA0LCAgNDAsICAzNCwgIDYxLCAgMTIsICAyOCwgICA0LCAgNTgsICAyMywgICA4LCAgMTUsICAxMiwgIDIyLCAgIDksICAxOCwKKyA1NSwgIDEwLCAgMzMsICAzNSwgIDUwLCAgIDEsICA0MywgICAzLCAgNTcsICAxMywgIDYyLCAgMTQsICAgNywgIDQyLCAgNDQsICA1OSwKKyA2MiwgIDU3LCAgMjcsICAgNiwgICA4LCAgMzEsICAyNiwgIDU0LCAgNDEsICAyMiwgIDQ1LCAgMjAsICAzOSwgICAzLCAgMTYsICA1NiwKKyA0OCwgICAyLCAgMjEsICAyOCwgIDM2LCAgNDIsICA2MCwgIDMzLCAgMzQsICAxOCwgICAwLCAgMTEsICAyNCwgIDEwLCAgMTcsICA2MSwKKyAyOSwgIDE0LCAgNDUsICAyNiwgIDU1LCAgNDYsICAxMSwgIDE3LCAgNTQsICA0NiwgICA5LCAgMjQsICAzMCwgIDYwLCAgMzIsICAgMCwKKyAyMCwgIDM4LCAgIDIsICAzMCwgIDU4LCAgMzUsICAgMSwgIDE2LCAgNTYsICA0MCwgIDIzLCAgNDgsICAxMywgIDE5LCAgMTksICAyNywKKyAzMSwgIDUzLCAgNDcsICAzOCwgIDYzLCAgMTUsICA0OSwgICA1LCAgMzcsICA1MywgIDI1LCAgMzYsICA2MywgIDI5LCAgIDUsICAgNywKK30sIHRhYmxlXzNbNjRdID0geworICAxLCAgIDUsICAyOSwgICA2LCAgMjUsICAgMSwgIDE4LCAgMjMsICAxNywgIDE5LCAgIDAsICAgOSwgIDI0LCAgMjUsICAgNiwgIDMxLAorIDI4LCAgMjAsICAyNCwgIDMwLCAgIDQsICAyNywgICAzLCAgMTMsICAxNSwgIDE2LCAgMTQsICAxOCwgICA0LCAgIDMsICAgOCwgICA5LAorIDIwLCAgIDAsICAxMiwgIDI2LCAgMjEsICAgOCwgIDI4LCAgIDIsICAyOSwgICAyLCAgMTUsICAgNywgIDExLCAgMjIsICAxNCwgIDEwLAorIDE3LCAgMjEsICAxMiwgIDMwLCAgMjYsICAyNywgIDE2LCAgMzEsICAxMSwgICA3LCAgMTMsICAyMywgIDEwLCAgIDUsICAyMiwgIDE5LAorfSwgdGFibGVfNFszMl0gPSB7CisgMTUsICAxMiwgIDEwLCAgIDQsICAgMSwgIDE0LCAgMTEsICAgNywgICA1LCAgIDAsICAxNCwgICA3LCAgIDEsICAgMiwgIDEzLCAgIDgsCisgMTAsICAgMywgICA0LCAgIDksICAgNiwgICAwLCAgIDMsICAgMiwgICA1LCAgIDYsICAgOCwgICA5LCAgMTEsICAxMywgIDE1LCAgMTIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCAqX2NvbXAxMjhfdGFibGVbNV0gPSB7IHRhYmxlXzAsIHRhYmxlXzEsIHRhYmxlXzIsIHRhYmxlXzMsIHRhYmxlXzQgfTsKKworCitzdGF0aWMgaW5saW5lIHZvaWQKK19jb21wMTI4X2NvbXByZXNzaW9uX3JvdW5kKHVpbnQ4X3QgKngsIGludCBuLCBjb25zdCB1aW50OF90ICp0YmwpCit7CisJaW50IGksIGosIG0sIGEsIGIsIHksIHo7CisJbSA9IDQgLSBuOworCWZvciAoaT0wOyBpPCgxPDxuKTsgaSsrKQorCQlmb3IgKGo9MDsgajwoMTw8bSk7IGorKykgeworCQkJYSA9IGogKyBpICogKDI8PG0pOworCQkJYiA9IGEgKyAoMTw8bSk7CisJCQl5ID0gKHhbYV0gKyAoeFtiXTw8MSkpICYgKCgzMjw8bSktMSk7CisJCQl6ID0gKCh4W2FdPDwxKSArIHhbYl0pICYgKCgzMjw8bSktMSk7CisJCQl4W2FdID0gdGJsW3ldOworCQkJeFtiXSA9IHRibFt6XTsKKwkJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19jb21wMTI4X2NvbXByZXNzaW9uKHVpbnQ4X3QgKngpCit7CisJaW50IG47CisJZm9yIChuPTA7IG48NTsgbisrKQorCQlfY29tcDEyOF9jb21wcmVzc2lvbl9yb3VuZCh4LCBuLCBfY29tcDEyOF90YWJsZVtuXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2NvbXAxMjhfYml0c2Zyb21ieXRlcyh1aW50OF90ICp4LCB1aW50OF90ICpiaXRzKQoreworCWludCBpOworCW1lbXNldChiaXRzLCAweDAwLCAxMjgpOworCWZvciAoaT0wOyBpPDEyODsgaSsrKQorCQlpZiAoeFtpPj4yXSAmICgxPDwoMy0oaSYzKSkpKQorCQkJYml0c1tpXSA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2NvbXAxMjhfcGVybXV0YXRpb24odWludDhfdCAqeCwgdWludDhfdCAqYml0cykKK3sKKwlpbnQgaTsKKwltZW1zZXQoJnhbMTZdLCAweDAwLCAxNik7CisJZm9yIChpPTA7IGk8MTI4OyBpKyspCisJCXhbKGk+PjMpKzE2XSB8PSBiaXRzWyhpKjE3KSAmIDEyN10gPDwgKDctKGkmNykpOworfQorCit2b2lkCitjb21wMTI4KHVpbnQ4X3QgKmtpLCB1aW50OF90ICpyYW5kLCB1aW50OF90ICpzcmVzLCB1aW50OF90ICprYykKK3sKKwlpbnQgaTsKKwl1aW50OF90IHhbMzJdLCBiaXRzWzEyOF07CisKKwkvKiB4WzE2LTMxXSA9IFJBTkQgKi8KKwltZW1jcHkoJnhbMTZdLCByYW5kLCAxNik7CisKKwkvKiBSb3VuZCAxLTcgKi8KKwlmb3IgKGk9MDsgaTw3OyBpKyspIHsKKwkJLyogeFswLTE1XSA9IEtpICovCisJCW1lbWNweSh4LCBraSwgMTYpOworCisJCS8qIENvbXByZXNzaW9uICovCisJCV9jb21wMTI4X2NvbXByZXNzaW9uKHgpOworCisJCS8qIEZvcm1CaXRGcm9tQnl0ZXMgKi8KKwkJX2NvbXAxMjhfYml0c2Zyb21ieXRlcyh4LCBiaXRzKTsKKworCQkvKiBQZXJtdXRhdGlvbiAqLworCQlfY29tcDEyOF9wZXJtdXRhdGlvbih4LCBiaXRzKTsKKwl9CisKKwkvKiBSb3VuZCA4IChmaW5hbCkgKi8KKwkJLyogeFswLTE1XSA9IEtpICovCisJbWVtY3B5KHgsIGtpLCAxNik7CisKKwkJLyogQ29tcHJlc3Npb24gKi8KKwlfY29tcDEyOF9jb21wcmVzc2lvbih4KTsKKworCS8qIE91dHB1dCBzdGFnZSAqLworCWZvciAoaT0wOyBpPDg7IGkrPTIpCisJCXNyZXNbaT4+MV0gPSB4W2ldPDw0IHwgeFtpKzFdOworCisJZm9yIChpPTA7IGk8MTI7IGkrPTIpCisJCWtjW2k+PjFdID0gKHhbaSArIDE4XSA8PCA2KSB8CisJCSAgICAgICAgICAgKHhbaSArIDE5XSA8PCAyKSB8CisJCSAgICAgICAgICAgKHhbaSArIDIwXSA+PiAyKTsKKworCWtjWzZdID0gKHhbMzBdPDw2KSB8ICh4WzMxXTw8Mik7CisJa2NbN10gPSAwOworfQorCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9zcmMvZ3NtMDgwOC5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbTA4MDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTdlYjNhCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL2dzbTA4MDguYwpAQCAtMCwwICsxLDI5NSBAQAorLyogKEMpIDIwMDksMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSwyMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9zbW9jb3JlL2dzbTA4MDguaD4KKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDhfMDguaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc200OC5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNkZWZpbmUgQlNTTUFQX01TR19TSVpFIDUxMgorI2RlZmluZSBCU1NNQVBfTVNHX0hFQURST09NIDEyOAorCitzdHJ1Y3QgbXNnYiAqZ3NtMDgwOF9jcmVhdGVfbGF5ZXIzKHN0cnVjdCBtc2diICptc2dfbDMsIHVpbnQxNl90IG5jLCB1aW50MTZfdCBjYywgaW50IGxhYywgaW50IF9jaSkKK3sKKwl1aW50OF90ICpkYXRhOworCXVpbnQxNl90ICpjaTsKKwlzdHJ1Y3QgbXNnYiogbXNnOworCXN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCAqbGFpOworCisJbXNnICA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oQlNTTUFQX01TR19TSVpFLCBCU1NNQVBfTVNHX0hFQURST09NLAorCQkJCSAgICJic3NtYXAgY21wbCBsMyIpOworCWlmICghbXNnKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGNyZWF0ZSB0aGUgYnNzbWFwIGhlYWRlciAqLworCW1zZy0+bDNoID0gbXNnYl9wdXQobXNnLCAyKTsKKwltc2ctPmwzaFswXSA9IDB4MDsKKworCS8qIGNyZWF0ZSBsYXllciAzIGhlYWRlciAqLworCWRhdGEgPSBtc2diX3B1dChtc2csIDEpOworCWRhdGFbMF0gPSBCU1NfTUFQX01TR19DT01QTEVURV9MQVlFUl8zOworCisJLyogY3JlYXRlIHRoZSBjZWxsIGhlYWRlciAqLworCWRhdGEgPSBtc2diX3B1dChtc2csIDMpOworCWRhdGFbMF0gPSBHU00wODA4X0lFX0NFTExfSURFTlRJRklFUjsKKwlkYXRhWzFdID0gMSArIHNpemVvZigqbGFpKSArIDI7CisJZGF0YVsyXSA9IENFTExfSURFTlRfV0hPTEVfR0xPQkFMOworCisJbGFpID0gKHN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqbGFpKSk7CisJZ3NtNDhfZ2VuZXJhdGVfbGFpKGxhaSwgY2MsIG5jLCBsYWMpOworCisJY2kgPSAodWludDE2X3QgKikgbXNnYl9wdXQobXNnLCAyKTsKKwkqY2kgPSBodG9ucyhfY2kpOworCisJLyogY29weSB0aGUgbGF5ZXIzIGRhdGEgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCBtc2diX2wzbGVuKG1zZ19sMykgKyAyKTsKKwlkYXRhWzBdID0gR1NNMDgwOF9JRV9MQVlFUl8zX0lORk9STUFUSU9OOworCWRhdGFbMV0gPSBtc2diX2wzbGVuKG1zZ19sMyk7CisJbWVtY3B5KCZkYXRhWzJdLCBtc2dfbDMtPmwzaCwgZGF0YVsxXSk7CisKKwkvKiB1cGRhdGUgdGhlIHNpemUgKi8KKwltc2ctPmwzaFsxXSA9IG1zZ2JfbDNsZW4obXNnKSAtIDI7CisKKwlyZXR1cm4gbXNnOworfQorCitzdHJ1Y3QgbXNnYiAqZ3NtMDgwOF9jcmVhdGVfcmVzZXQodm9pZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShCU1NNQVBfTVNHX1NJWkUsIEJTU01BUF9NU0dfSEVBRFJPT00sCisJCQkJCSAgICAgICAiYnNzbWFwOiByZXNldCIpOworCWlmICghbXNnKQorCQlyZXR1cm4gTlVMTDsKKworCW1zZy0+bDNoID0gbXNnYl9wdXQobXNnLCA2KTsKKwltc2ctPmwzaFswXSA9IEJTU0FQX01TR19CU1NfTUFOQUdFTUVOVDsKKwltc2ctPmwzaFsxXSA9IDB4MDQ7CisJbXNnLT5sM2hbMl0gPSAweDMwOworCW1zZy0+bDNoWzNdID0gMHgwNDsKKwltc2ctPmwzaFs0XSA9IDB4MDE7CisJbXNnLT5sM2hbNV0gPSAweDIwOworCXJldHVybiBtc2c7Cit9CisKK3N0cnVjdCBtc2diICpnc20wODA4X2NyZWF0ZV9jbGVhcl9jb21wbGV0ZSh2b2lkKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKEJTU01BUF9NU0dfU0laRSwgQlNTTUFQX01TR19IRUFEUk9PTSwKKwkJCQkJICAgICAgICJic3NtYXA6IGNsZWFyIGNvbXBsZXRlIik7CisJaWYgKCFtc2cpCisJCXJldHVybiBOVUxMOworCisJbXNnLT5sM2ggPSBtc2diX3B1dChtc2csIDMpOworCW1zZy0+bDNoWzBdID0gQlNTQVBfTVNHX0JTU19NQU5BR0VNRU5UOworCW1zZy0+bDNoWzFdID0gMTsKKwltc2ctPmwzaFsyXSA9IEJTU19NQVBfTVNHX0NMRUFSX0NPTVBMRVRFOworCisJcmV0dXJuIG1zZzsKK30KKworc3RydWN0IG1zZ2IgKmdzbTA4MDhfY3JlYXRlX2NpcGhlcl9jb21wbGV0ZShzdHJ1Y3QgbXNnYiAqbGF5ZXIzLCB1aW50OF90IGFsZ19pZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShCU1NNQVBfTVNHX1NJWkUsIEJTU01BUF9NU0dfSEVBRFJPT00sCisJCQkJCSAgICAgICAiY2lwaGVyLWNvbXBsZXRlIik7CisJaWYgKCFtc2cpCisJCXJldHVybiBOVUxMOworCisgICAgICAgIC8qIHNlbmQgcmVzcG9uc2Ugd2l0aCBCU1Mgb3ZlcnJpZGUgZm9yIEE1LzEuLi4gY2hlYXRpbmcgKi8KKwltc2ctPmwzaCA9IG1zZ2JfcHV0KG1zZywgMyk7CisJbXNnLT5sM2hbMF0gPSBCU1NBUF9NU0dfQlNTX01BTkFHRU1FTlQ7CisJbXNnLT5sM2hbMV0gPSAweGZmOworCW1zZy0+bDNoWzJdID0gQlNTX01BUF9NU0dfQ0lQSEVSX01PREVfQ09NUExFVEU7CisKKwkvKiBpbmNsdWRlIGxheWVyMyBpbiBjYXNlIHdlIGhhdmUgYXQgbGVhc3QgdHdvIG9jdGV0cyAqLworCWlmIChsYXllcjMgJiYgbXNnYl9sM2xlbihsYXllcjMpID4gMikgeworCQltc2ctPmw0aCA9IG1zZ2JfcHV0KG1zZywgbXNnYl9sM2xlbihsYXllcjMpICsgMik7CisJCW1zZy0+bDRoWzBdID0gR1NNMDgwOF9JRV9MQVlFUl8zX01FU1NBR0VfQ09OVEVOVFM7CisJCW1zZy0+bDRoWzFdID0gbXNnYl9sM2xlbihsYXllcjMpOworCQltZW1jcHkoJm1zZy0+bDRoWzJdLCBsYXllcjMtPmwzaCwgbXNnYl9sM2xlbihsYXllcjMpKTsKKwl9CisKKwkvKiBhbmQgdGhlIG9wdGlvbmFsIEJTUyBtZXNzYWdlICovCisJbXNnLT5sNGggPSBtc2diX3B1dChtc2csIDIpOworCW1zZy0+bDRoWzBdID0gR1NNMDgwOF9JRV9DSE9TRU5fRU5DUl9BTEc7CisJbXNnLT5sNGhbMV0gPSBhbGdfaWQ7CisKKwkvKiB1cGRhdGUgdGhlIHNpemUgKi8KKwltc2ctPmwzaFsxXSA9IG1zZ2JfbDNsZW4obXNnKSAtIDI7CisJcmV0dXJuIG1zZzsKK30KKworc3RydWN0IG1zZ2IgKmdzbTA4MDhfY3JlYXRlX2NpcGhlcl9yZWplY3QodWludDhfdCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShCU1NNQVBfTVNHX1NJWkUsIEJTU01BUF9NU0dfSEVBRFJPT00sCisJCQkJCSAgICAgICAiYnNzbWFwOiBjbGVhciBjb21wbGV0ZSIpOworCWlmICghbXNnKQorCQlyZXR1cm4gTlVMTDsKKworCW1zZy0+bDNoID0gbXNnYl9wdXQobXNnLCAzKTsKKwltc2ctPmwzaFswXSA9IEJTU0FQX01TR19CU1NfTUFOQUdFTUVOVDsKKwltc2ctPmwzaFsxXSA9IDI7CisJbXNnLT5sM2hbMl0gPSBCU1NfTUFQX01TR19DSVBIRVJfTU9ERV9SRUpFQ1Q7CisJbXNnLT5sM2hbM10gPSBjYXVzZTsKKworCXJldHVybiBtc2c7Cit9CisKK3N0cnVjdCBtc2diICpnc20wODA4X2NyZWF0ZV9jbGFzc21hcmtfdXBkYXRlKGNvbnN0IHVpbnQ4X3QgKmNsYXNzbWFya19kYXRhLCB1aW50OF90IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShCU1NNQVBfTVNHX1NJWkUsIEJTU01BUF9NU0dfSEVBRFJPT00sCisJCQkJCSAgICAgICAiY2xhc3NtYXJrLXVwZGF0ZSIpOworCWlmICghbXNnKQorCQlyZXR1cm4gTlVMTDsKKworCW1zZy0+bDNoID0gbXNnYl9wdXQobXNnLCAzKTsKKwltc2ctPmwzaFswXSA9IEJTU0FQX01TR19CU1NfTUFOQUdFTUVOVDsKKwltc2ctPmwzaFsxXSA9IDB4ZmY7CisJbXNnLT5sM2hbMl0gPSBCU1NfTUFQX01TR19DTEFTU01BUktfVVBEQVRFOworCisJbXNnLT5sNGggPSBtc2diX3B1dChtc2csIGxlbmd0aCk7CisJbWVtY3B5KG1zZy0+bDRoLCBjbGFzc21hcmtfZGF0YSwgbGVuZ3RoKTsKKworCS8qIHVwZGF0ZSB0aGUgc2l6ZSAqLworCW1zZy0+bDNoWzFdID0gbXNnYl9sM2xlbihtc2cpIC0gMjsKKwlyZXR1cm4gbXNnOworfQorCitzdHJ1Y3QgbXNnYiAqZ3NtMDgwOF9jcmVhdGVfc2FwaV9yZWplY3QodWludDhfdCBsaW5rX2lkKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKEJTU01BUF9NU0dfU0laRSwgQlNTTUFQX01TR19IRUFEUk9PTSwKKwkJCQkJICAgICAgICJic3NtYXA6IHNhcGkgJ24nIHJlamVjdCIpOworCWlmICghbXNnKQorCQlyZXR1cm4gTlVMTDsKKworCW1zZy0+bDNoID0gbXNnYl9wdXQobXNnLCA1KTsKKwltc2ctPmwzaFswXSA9IEJTU0FQX01TR19CU1NfTUFOQUdFTUVOVDsKKwltc2ctPmwzaFsxXSA9IDM7CisJbXNnLT5sM2hbMl0gPSBCU1NfTUFQX01TR19TQVBJX05fUkVKRUNUOworCW1zZy0+bDNoWzNdID0gbGlua19pZDsKKwltc2ctPmwzaFs0XSA9IEdTTTA4MDhfQ0FVU0VfQlNTX05PVF9FUVVJUFBFRDsKKworCXJldHVybiBtc2c7Cit9CisKK3N0cnVjdCBtc2diICpnc20wODA4X2NyZWF0ZV9hc3NpZ25tZW50X2NvbXBsZXRlZChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdWludDhfdCBycl9jYXVzZSwKKwkJCQkJCSB1aW50OF90IGNob3Nlbl9jaGFubmVsLCB1aW50OF90IGVuY3JfYWxnX2lkLAorCQkJCQkJIHVpbnQ4X3Qgc3BlZWNoX21vZGUpCit7CisJdWludDhfdCAqZGF0YTsKKworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKDM1LCAiYnNzbWFwOiBhc3MgY29tcGwiKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIE5VTEw7CisKKwltc2ctPmwzaCA9IG1zZ2JfcHV0KG1zZywgMyk7CisJbXNnLT5sM2hbMF0gPSBCU1NBUF9NU0dfQlNTX01BTkFHRU1FTlQ7CisJbXNnLT5sM2hbMV0gPSAweGZmOworCW1zZy0+bDNoWzJdID0gQlNTX01BUF9NU0dfQVNTSUdNRU5UX0NPTVBMRVRFOworCisJLyogd3JpdGUgMy4yLjIuMjIgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCAyKTsKKwlkYXRhWzBdID0gR1NNMDgwOF9JRV9SUl9DQVVTRTsKKwlkYXRhWzFdID0gcnJfY2F1c2U7CisKKwkvKiB3cml0ZSBjaXJ0Y3VpdCBpZGVudGl0eSAgY29kZSAzLjIuMi4yICovCisJLyogd3JpdGUgY2VsbCBpZGVudGlmaWVyIDMuMi4yLjE3ICovCisJLyogd3JpdGUgY2hvc2VuIGNoYW5uZWwgMy4yLjIuMzMgd2hlbiBCVFMgcGlja2VkIGl0ICovCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMik7CisJZGF0YVswXSA9IEdTTTA4MDhfSUVfQ0hPU0VOX0NIQU5ORUw7CisJZGF0YVsxXSA9IGNob3Nlbl9jaGFubmVsOworCisJLyogd3JpdGUgY2hvc2VuIGVuY3J5cHRpb24gYWxnb3JpdGhtIDMuMi4yLjQ0ICovCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMik7CisJZGF0YVswXSA9IEdTTTA4MDhfSUVfQ0hPU0VOX0VOQ1JfQUxHOworCWRhdGFbMV0gPSBlbmNyX2FsZ19pZDsKKworCS8qIHdyaXRlIGNpcmN1aXQgcG9vbCAzLjIuMi40NSAqLworCS8qIHdyaXRlIHNwZWVjaCB2ZXJzaW9uIGNob3NlbjogMy4yLjIuNTEgd2hlbiBCVFMgcGlja2VkIGl0ICovCisJaWYgKHNwZWVjaF9tb2RlICE9IDApIHsKKwkJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMik7CisJCWRhdGFbMF0gPSBHU00wODA4X0lFX1NQRUVDSF9WRVJTSU9OOworCQlkYXRhWzFdID0gc3BlZWNoX21vZGU7CisJfQorCisJLyogd3JpdGUgTFNBIGlkZW50aWZpZXIgMy4yLjIuMTUgKi8KKworCisJLyogdXBkYXRlIHRoZSBzaXplICovCisJbXNnLT5sM2hbMV0gPSBtc2diX2wzbGVuKG1zZykgLSAyOworCXJldHVybiBtc2c7Cit9CisKK3N0cnVjdCBtc2diICpnc20wODA4X2NyZWF0ZV9hc3NpZ25tZW50X2ZhaWx1cmUodWludDhfdCBjYXVzZSwgdWludDhfdCAqcnJfY2F1c2UpCit7CisJdWludDhfdCAqZGF0YTsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShCU1NNQVBfTVNHX1NJWkUsIEJTU01BUF9NU0dfSEVBRFJPT00sCisJCQkJCSAgICAgICAiYnNzbWFwOiBhc3MgZmFpbCIpOworCWlmICghbXNnKQorCQlyZXR1cm4gTlVMTDsKKworCW1zZy0+bDNoID0gbXNnYl9wdXQobXNnLCA2KTsKKwltc2ctPmwzaFswXSA9IEJTU0FQX01TR19CU1NfTUFOQUdFTUVOVDsKKwltc2ctPmwzaFsxXSA9IDB4ZmY7CisJbXNnLT5sM2hbMl0gPSBCU1NfTUFQX01TR19BU1NJR01FTlRfRkFJTFVSRTsKKwltc2ctPmwzaFszXSA9IEdTTTA4MDhfSUVfQ0FVU0U7CisJbXNnLT5sM2hbNF0gPSAxOworCW1zZy0+bDNoWzVdID0gY2F1c2U7CisKKwkvKiBSUiBjYXVzZSAzLjIuMi4yMiAqLworCWlmIChycl9jYXVzZSkgeworCQlkYXRhID0gbXNnYl9wdXQobXNnLCAyKTsKKwkJZGF0YVswXSA9IEdTTTA4MDhfSUVfUlJfQ0FVU0U7CisJCWRhdGFbMV0gPSAqcnJfY2F1c2U7CisJfQorCisJLyogQ2lyY3VpdCBwb29sIDMuMjIuNDUgKi8KKwkvKiBDaXJjdWl0IHBvb2wgbGlzdCAzLjIuMi40NiAqLworCisJLyogdXBkYXRlIHRoZSBzaXplICovCisJbXNnLT5sM2hbMV0gPSBtc2diX2wzbGVuKG1zZykgLSAyOworCXJldHVybiBtc2c7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gYnNzX2F0dF90bHZkZWYgPSB7CisJLmRlZiA9IHsKKwkJW0dTTTA4MDhfSUVfSU1TSV0JCSAgICA9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU00wODA4X0lFX1RNU0ldCQkgICAgPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNMDgwOF9JRV9DRUxMX0lERU5USUZJRVJfTElTVF0gICA9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU00wODA4X0lFX0NIQU5ORUxfTkVFREVEXQkgICAgPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtHU00wODA4X0lFX0VNTFBQX1BSSU9SSVRZXQkgICAgPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtHU00wODA4X0lFX0NIQU5ORUxfVFlQRV0JICAgID0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTA4MDhfSUVfUFJJT1JJVFldCQkgICAgPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNMDgwOF9JRV9DSVJDVUlUX0lERU5USVRZX0NPREVdICA9IHsgVExWX1RZUEVfVFYgfSwKKwkJW0dTTTA4MDhfSUVfRE9XTkxJTktfRFRYX0ZMQUddCSAgICA9IHsgVExWX1RZUEVfVFYgfSwKKwkJW0dTTTA4MDhfSUVfSU5URVJGRVJFTkNFX0JBTkRfVE9fVVNFXSA9IHsgVExWX1RZUEVfVFYgfSwKKwkJW0dTTTA4MDhfSUVfQ0xBU1NNQVJLX0lORk9STUFUSU9OX1QyXSA9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU00wODA4X0lFX0dST1VQX0NBTExfUkVGRVJFTkNFXSAgID0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTA4MDhfSUVfVEFMS0VSX0ZMQUddCSAgICA9IHsgVExWX1RZUEVfVCB9LAorCQlbR1NNMDgwOF9JRV9DT05GSUdfRVZPX0lOREldCSAgICA9IHsgVExWX1RZUEVfVFYgfSwKKwkJW0dTTTA4MDhfSUVfTFNBX0FDQ0VTU19DVFJMX1NVUFBSXSAgPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtHU00wODA4X0lFX1NFUlZJQ0VfSEFORE9WRVJdCSAgICA9IHsgVExWX1RZUEVfVFZ9LAorCQlbR1NNMDgwOF9JRV9FTkNSWVBUSU9OX0lORk9STUFUSU9OXSA9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU00wODA4X0lFX0NJUEhFUl9SRVNQT05TRV9NT0RFXSAgID0geyBUTFZfVFlQRV9UViB9LAorCX0sCit9OworCitjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gKmdzbTA4MDhfYXR0X3RsdmRlZigpCit7CisJcmV0dXJuICZic3NfYXR0X3RsdmRlZjsKK30KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9nc200OC5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbTQ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1N2FlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL3NyYy9nc200OC5jCkBAIC0wLDAgKzEsMzUzIEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3V0aWxzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDguaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oPgorCitjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gZ3NtNDhfYXR0X3RsdmRlZiA9IHsKKwkuZGVmID0geworCQlbR1NNNDhfSUVfTU9CSUxFX0lEXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9OQU1FX0xPTkddCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX05BTUVfU0hPUlRdCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX1VUQ10JCT0geyBUTFZfVFlQRV9UViB9LAorCQlbR1NNNDhfSUVfTkVUX1RJTUVfVFpdCT0geyBUTFZfVFlQRV9GSVhFRCwgNyB9LAorCQlbR1NNNDhfSUVfTFNBX0lERU5UXQk9IHsgVExWX1RZUEVfVExWIH0sCisKKwkJW0dTTTQ4X0lFX0JFQVJFUl9DQVBdCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX0NBVVNFXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9DQ19DQVBdCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX0FMRVJUXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9GQUNJTElUWV0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfUFJPR1JfSU5EXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9BVVhfU1RBVFVTXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9OT1RJRlldCT0geyBUTFZfVFlQRV9UViB9LAorCQlbR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZXQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW0dTTTQ4X0lFX1NJR05BTF0JPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtHU000OF9JRV9DT05OX0JDRF0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfQ09OTl9TVUJdCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX0NBTExJTkdfQkNEXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9DQUxMSU5HX1NVQl0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfQ0FMTEVEX0JDRF0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfQ0FMTEVEX1NVQl0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfUkVESVJfQkNEXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9SRURJUl9TVUJdCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX0xPV0xfQ09NUEFUXQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtHU000OF9JRV9ISUdITF9DT01QQVRdCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW0dTTTQ4X0lFX1VTRVJfVVNFUl0JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfU1NfVkVSU10JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbR1NNNDhfSUVfTU9SRV9EQVRBXQk9IHsgVExWX1RZUEVfVCB9LAorCQlbR1NNNDhfSUVfQ0xJUl9TVVBQXQk9IHsgVExWX1RZUEVfVCB9LAorCQlbR1NNNDhfSUVfQ0xJUl9JTlZPQ10JPSB7IFRMVl9UWVBFX1QgfSwKKwkJW0dTTTQ4X0lFX1JFVl9DX1NFVFVQXQk9IHsgVExWX1RZUEVfVCB9LAorCQlbR1NNNDhfSUVfUkVQRUFUX0NJUl0gICA9IHsgVExWX1RZUEVfVCB9LAorCQlbR1NNNDhfSUVfUkVQRUFUX1NFUV0gICA9IHsgVExWX1RZUEVfVCB9LAorCQkvKiBGSVhNRTogbW9yZSBlbGVtZW50cyAqLworCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBycl9jYXVzZV9uYW1lc1tdID0geworCXsgR1NNNDhfUlJfQ0FVU0VfTk9STUFMLAkJIk5vcm1hbCBldmVudCIgfSwKKwl7IEdTTTQ4X1JSX0NBVVNFX0FCTk9STUFMX1VOU1BFQywJIkFibm9ybWFsIHJlbGVhc2UsIHVuc3BlY2lmaWVkIiB9LAorCXsgR1NNNDhfUlJfQ0FVU0VfQUJOT1JNQUxfVU5BQ0NULAkiQWJub3JtYWwgcmVsZWFzZSwgY2hhbm5lbCB1bmFjY2VwdGFibGUiIH0sCisJeyBHU000OF9SUl9DQVVTRV9BQk5PUk1BTF9USU1FUiwJIkFibm9ybWFsIHJlbGVhc2UsIHRpbWVyIGV4cGlyZWQiIH0sCisJeyBHU000OF9SUl9DQVVTRV9BQk5PUk1BTF9OT0FDVCwJIkFibm9ybWFsIHJlbGVhc2UsIG5vIGFjdGl2aXR5IG9uIHJhZGlvIHBhdGgiIH0sCisJeyBHU000OF9SUl9DQVVTRV9QUkVNUFRJVkVfUkVMLAkJIlByZWVtcHRpdmUgcmVsZWFzZSIgfSwKKwl7IEdTTTQ4X1JSX0NBVVNFX0hORE9WRVJfSU1QLAkJIkhhbmRvdmVyIGltcG9zc2libGUsIHRpbWluZyBhZHZhbmNlIG91dCBvZiByYW5nZSIgfSwKKwl7IEdTTTQ4X1JSX0NBVVNFX0NIQU5fTU9ERV9VTkFDQ1QsCSJDaGFubmVsIG1vZGUgdW5hY2NlcHRhYmxlIiB9LAorCXsgR1NNNDhfUlJfQ0FVU0VfRlJFUV9OT1RfSU1QTCwJCSJGcmVxdWVuY3kgbm90IGltcGxlbWVudGVkIiB9LAorCXsgR1NNNDhfUlJfQ0FVU0VfQ0FMTF9DTEVBUkVELAkJIkNhbGwgYWxyZWFkeSBjbGVhcmVkIiB9LAorCXsgR1NNNDhfUlJfQ0FVU0VfU0VNQU5UX0lOQ09SUiwJCSJTZW1hbnRpY2FsbHkgaW5jb3JyZWN0IG1lc3NhZ2UiIH0sCisJeyBHU000OF9SUl9DQVVTRV9JTlZBTElEX01BTkRfSU5GLAkiSW52YWxpZCBtYW5kYXRvcnkgaW5mb3JtYXRpb24iIH0sCisJeyBHU000OF9SUl9DQVVTRV9NU0dfVFlQRV9OLAkJIk1lc3NhZ2UgdHlwZSBub24tZXhpc3RhbnQgb3Igbm90IGltcGxlbWVudGVkIiB9LAorCXsgR1NNNDhfUlJfQ0FVU0VfTVNHX1RZUEVfTl9DT01QQVQsCSJNZXNzYWdlIHR5cGUgbm90IGNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IEdTTTQ4X1JSX0NBVVNFX0NPTkRfSUVfRVJST1IsCQkiQ29uZGl0aW9uYWwgSUUgZXJyb3IiIH0sCisJeyBHU000OF9SUl9DQVVTRV9OT19DRUxMX0FMTE9DX0EsCSJObyBjZWxsIGFsbG9jYXRpb24gYXZhaWxhYmxlIiB9LAorCXsgR1NNNDhfUlJfQ0FVU0VfUFJPVF9FUlJPUl9VTlNQQywJIlByb3RvY29sIGVycm9yIHVuc3BlY2lmaWVkIiB9LAorCXsgMCwJCQkJCU5VTEwgfSwKK307CisKKy8qIEZJWE1FOiBjb252ZXJ0IHRvIHZhbHVlX3N0cmluZyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNjX3N0YXRlX25hbWVzWzMzXSA9IHsKKwkiTlVMTCIsCisJIklOSVRJQVRFRCIsCisJIk1NX0NPTk5FQ1RJT05fUEVORCIsCisJIk1PX0NBTExfUFJPQyIsCisJIkNBTExfREVMSVZFUkVEIiwKKwkiaWxsZWdhbCBzdGF0ZSA1IiwKKwkiQ0FMTF9QUkVTRU5UIiwKKwkiQ0FMTF9SRUNFSVZFRCIsCisJIkNPTk5FQ1RfUkVRVUVTVCIsCisJIk1PX1RFUk1fQ0FMTF9DT05GIiwKKwkiQUNUSVZFIiwKKwkiRElTQ09OTkVDVF9SRVEiLAorCSJESVNDT05ORUNUX0lORCIsCisJImlsbGVnYWwgc3RhdGUgMTMiLAorCSJpbGxlZ2FsIHN0YXRlIDE0IiwKKwkiaWxsZWdhbCBzdGF0ZSAxNSIsCisJImlsbGVnYWwgc3RhdGUgMTYiLAorCSJpbGxlZ2FsIHN0YXRlIDE3IiwKKwkiaWxsZWdhbCBzdGF0ZSAxOCIsCisJIlJFTEVBU0VfUkVRIiwKKwkiaWxsZWdhbCBzdGF0ZSAyMCIsCisJImlsbGVnYWwgc3RhdGUgMjEiLAorCSJpbGxlZ2FsIHN0YXRlIDIyIiwKKwkiaWxsZWdhbCBzdGF0ZSAyMyIsCisJImlsbGVnYWwgc3RhdGUgMjQiLAorCSJpbGxlZ2FsIHN0YXRlIDI1IiwKKwkiTU9fT1JJR19NT0RJRlkiLAorCSJNT19URVJNX01PRElGWSIsCisJIkNPTk5FQ1RfSU5EIiwKKwkiaWxsZWdhbCBzdGF0ZSAyOSIsCisJImlsbGVnYWwgc3RhdGUgMzAiLAorCSJpbGxlZ2FsIHN0YXRlIDMxIiwKK307CisKK2NvbnN0IGNoYXIgKmdzbTQ4X2NjX3N0YXRlX25hbWUodWludDhfdCBzdGF0ZSkKK3sKKwlpZiAoc3RhdGUgPCBBUlJBWV9TSVpFKGNjX3N0YXRlX25hbWVzKSkKKwkJcmV0dXJuIGNjX3N0YXRlX25hbWVzW3N0YXRlXTsKKworCXJldHVybiAiaW52YWxpZCI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGNjX21zZ19uYW1lc1tdID0geworCXsgR1NNNDhfTVRfQ0NfQUxFUlRJTkcsCQkiQUxFUlRJTkciIH0sCisJeyBHU000OF9NVF9DQ19DQUxMX1BST0MsCSJDQUxMX1BST0MiIH0sCisJeyBHU000OF9NVF9DQ19QUk9HUkVTUywJCSJQUk9HUkVTUyIgfSwKKwl7IEdTTTQ4X01UX0NDX0VTVEFCLAkJIkVTVEFCIiB9LAorCXsgR1NNNDhfTVRfQ0NfU0VUVVAsCQkiU0VUVVAiIH0sCisJeyBHU000OF9NVF9DQ19FU1RBQl9DT05GLAkiRVNUQUJfQ09ORiIgfSwKKwl7IEdTTTQ4X01UX0NDX0NPTk5FQ1QsCQkiQ09OTkVDVCIgfSwKKwl7IEdTTTQ4X01UX0NDX0NBTExfQ09ORiwJIkNBTExfQ09ORiIgfSwKKwl7IEdTTTQ4X01UX0NDX1NUQVJUX0NDLAkJIlNUQVJUX0NDIiB9LAorCXsgR1NNNDhfTVRfQ0NfUkVDQUxMLAkJIlJFQ0FMTCIgfSwKKwl7IEdTTTQ4X01UX0NDX0VNRVJHX1NFVFVQLAkiRU1FUkdfU0VUVVAiIH0sCisJeyBHU000OF9NVF9DQ19DT05ORUNUX0FDSywJIkNPTk5FQ1RfQUNLIiB9LAorCXsgR1NNNDhfTVRfQ0NfVVNFUl9JTkZPLAkiVVNFUl9JTkZPIiB9LAorCXsgR1NNNDhfTVRfQ0NfTU9ESUZZX1JFSkVDVCwJIk1PRElGWV9SRUpFQ1QiIH0sCisJeyBHU000OF9NVF9DQ19NT0RJRlksCQkiTU9ESUZZIiB9LAorCXsgR1NNNDhfTVRfQ0NfSE9MRCwJCSJIT0xEIiB9LAorCXsgR1NNNDhfTVRfQ0NfSE9MRF9BQ0ssCQkiSE9MRF9BQ0siIH0sCisJeyBHU000OF9NVF9DQ19IT0xEX1JFSiwJCSJIT0xEX1JFSiIgfSwKKwl7IEdTTTQ4X01UX0NDX1JFVFIsCQkiUkVUUiIgfSwKKwl7IEdTTTQ4X01UX0NDX1JFVFJfQUNLLAkJIlJFVFJfQUNLIiB9LAorCXsgR1NNNDhfTVRfQ0NfUkVUUl9SRUosCQkiUkVUUl9SRUoiIH0sCisJeyBHU000OF9NVF9DQ19NT0RJRllfQ09NUEwsCSJNT0RJRllfQ09NUEwiIH0sCisJeyBHU000OF9NVF9DQ19ESVNDT05ORUNULAkiRElTQ09OTkVDVCIgfSwKKwl7IEdTTTQ4X01UX0NDX1JFTEVBU0VfQ09NUEwsCSJSRUxFQVNFX0NPTVBMIiB9LAorCXsgR1NNNDhfTVRfQ0NfUkVMRUFTRSwJCSJSRUxFQVNFIiB9LAorCXsgR1NNNDhfTVRfQ0NfU1RPUF9EVE1GLAkiU1RPUF9EVE1GIiB9LAorCXsgR1NNNDhfTVRfQ0NfU1RPUF9EVE1GX0FDSywJIlNUT1BfRFRNRl9BQ0siIH0sCisJeyBHU000OF9NVF9DQ19TVEFUVVNfRU5RLAkiU1RBVFVTX0VOUSIgfSwKKwl7IEdTTTQ4X01UX0NDX1NUQVJUX0RUTUYsCSJTVEFSVF9EVE1GIiB9LAorCXsgR1NNNDhfTVRfQ0NfU1RBUlRfRFRNRl9BQ0ssCSJTVEFSVF9EVE1GX0FDSyIgfSwKKwl7IEdTTTQ4X01UX0NDX1NUQVJUX0RUTUZfUkVKLAkiU1RBUlRfRFRNRl9SRUoiIH0sCisJeyBHU000OF9NVF9DQ19DT05HX0NUUkwsCSJDT05HX0NUUkwiIH0sCisJeyBHU000OF9NVF9DQ19GQUNJTElUWSwJCSJGQUNJTElUWSIgfSwKKwl7IEdTTTQ4X01UX0NDX1NUQVRVUywJCSJTVEFUVVMiIH0sCisJeyBHU000OF9NVF9DQ19OT1RJRlksCQkiTk9URklZIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpnc200OF9jY19tc2dfbmFtZSh1aW50OF90IG1zZ3R5cGUpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoY2NfbXNnX25hbWVzLCBtc2d0eXBlKTsKK30KKworY29uc3QgY2hhciAqcnJfY2F1c2VfbmFtZSh1aW50OF90IGNhdXNlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKHJyX2NhdXNlX25hbWVzLCBjYXVzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRvX2JjZCh1aW50OF90ICpiY2QsIHVpbnQxNl90IHZhbCkKK3sKKwliY2RbMl0gPSB2YWwgJSAxMDsKKwl2YWwgPSB2YWwgLyAxMDsKKwliY2RbMV0gPSB2YWwgJSAxMDsKKwl2YWwgPSB2YWwgLyAxMDsKKwliY2RbMF0gPSB2YWwgJSAxMDsKKwl2YWwgPSB2YWwgLyAxMDsKK30KKwordm9pZCBnc200OF9nZW5lcmF0ZV9sYWkoc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkICpsYWk0OCwgdWludDE2X3QgbWNjLAorCQkJdWludDE2X3QgbW5jLCB1aW50MTZfdCBsYWMpCit7CisJdWludDhfdCBiY2RbM107CisKKwl0b19iY2QoYmNkLCBtY2MpOworCWxhaTQ4LT5kaWdpdHNbMF0gPSBiY2RbMF0gfCAoYmNkWzFdIDw8IDQpOworCWxhaTQ4LT5kaWdpdHNbMV0gPSBiY2RbMl07CisKKwl0b19iY2QoYmNkLCBtbmMpOworCS8qIEZJWE1FOiBkbyB3ZSBuZWVkIHRocmVlLWRpZ2l0IE1OQz8gU2VlIFRhYmxlIDEwLjUuMyAqLworI2lmIDAKKwlsYWk0OC0+ZGlnaXRzWzFdIHw9IGJjZFsyXSA8PCA0OworCWxhaTQ4LT5kaWdpdHNbMl0gPSBiY2RbMF0gfCAoYmNkWzFdIDw8IDQpOworI2Vsc2UKKwlsYWk0OC0+ZGlnaXRzWzFdIHw9IDB4ZiA8PCA0OworCWxhaTQ4LT5kaWdpdHNbMl0gPSBiY2RbMV0gfCAoYmNkWzJdIDw8IDQpOworI2VuZGlmCisKKwlsYWk0OC0+bGFjID0gaHRvbnMobGFjKTsKK30KKworaW50IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX3Rtc2kodWludDhfdCAqYnVmLCB1aW50MzJfdCB0bXNpKQoreworCXVpbnQzMl90ICp0cHRyID0gKHVpbnQzMl90ICopICZidWZbM107CisKKwlidWZbMF0gPSBHU000OF9JRV9NT0JJTEVfSUQ7CisJYnVmWzFdID0gR1NNNDhfVE1TSV9MRU47CisJYnVmWzJdID0gMHhmMCB8IEdTTV9NSV9UWVBFX1RNU0k7CisJKnRwdHIgPSBodG9ubCh0bXNpKTsKKworCXJldHVybiA3OworfQorCitpbnQgZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21faW1zaSh1aW50OF90ICpidWYsIGNvbnN0IGNoYXIgKmltc2kpCit7CisJdW5zaWduZWQgaW50IGxlbmd0aCA9IHN0cmxlbihpbXNpKSwgaSwgb2ZmID0gMDsKKwl1aW50OF90IG9kZCA9IChsZW5ndGggJiAweDEpID09IDE7CisKKwlidWZbMF0gPSBHU000OF9JRV9NT0JJTEVfSUQ7CisJYnVmWzJdID0gY2hhcjJiY2QoaW1zaVswXSkgPDwgNCB8IEdTTV9NSV9UWVBFX0lNU0kgfCAob2RkIDw8IDMpOworCisJLyogaWYgdGhlIGxlbmd0aCBpcyBldmVuIHdlIHdpbGwgZmlsbCBoYWxmIG9mIHRoZSBsYXN0IG9jdGV0ICovCisJaWYgKG9kZCkKKwkJYnVmWzFdID0gKGxlbmd0aCArIDEpID4+IDE7CisJZWxzZQorCQlidWZbMV0gPSAobGVuZ3RoICsgMikgPj4gMTsKKworCWZvciAoaSA9IDE7IGkgPCBidWZbMV07ICsraSkgeworCQl1aW50OF90IGxvd2VyLCB1cHBlcjsKKworCQlsb3dlciA9IGNoYXIyYmNkKGltc2lbKytvZmZdKTsKKwkJaWYgKCFvZGQgJiYgb2ZmICsgMSA9PSBsZW5ndGgpCisJCQl1cHBlciA9IDB4MGY7CisJCWVsc2UKKwkJCXVwcGVyID0gY2hhcjJiY2QoaW1zaVsrK29mZl0pICYgMHgwZjsKKworCQlidWZbMiArIGldID0gKHVwcGVyIDw8IDQpIHwgbG93ZXI7CisJfQorCisJcmV0dXJuIDIgKyBidWZbMV07Cit9CisKKy8qIENvbnZlcnQgTW9iaWxlIElkZW50aXR5ICgxMC41LjEuNCkgdG8gc3RyaW5nICovCitpbnQgZ3NtNDhfbWlfdG9fc3RyaW5nKGNoYXIgKnN0cmluZywgY29uc3QgaW50IHN0cl9sZW4sIGNvbnN0IHVpbnQ4X3QgKm1pLAorCQkgICAgICAgY29uc3QgaW50IG1pX2xlbikKK3sKKwlpbnQgaTsKKwl1aW50OF90IG1pX3R5cGU7CisJY2hhciAqc3RyX2N1ciA9IHN0cmluZzsKKwl1aW50MzJfdCB0bXNpOworCisJbWlfdHlwZSA9IG1pWzBdICYgR1NNX01JX1RZUEVfTUFTSzsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfTk9ORToKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9UTVNJOgorCQkvKiBUYWJsZSAxMC41LjQuMywgcmV2ZXJzZSBnZW5lcmF0ZV9taWRfZnJvbV90bXNpICovCisJCWlmIChtaV9sZW4gPT0gR1NNNDhfVE1TSV9MRU4gJiYgbWlbMF0gPT0gKDB4ZjAgfCBHU01fTUlfVFlQRV9UTVNJKSkgeworCQkJbWVtY3B5KCZ0bXNpLCAmbWlbMV0sIDQpOworCQkJdG1zaSA9IG50b2hsKHRtc2kpOworCQkJcmV0dXJuIHNucHJpbnRmKHN0cmluZywgc3RyX2xlbiwgIiV1IiwgdG1zaSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTVNJOgorCWNhc2UgR1NNX01JX1RZUEVfSU1FSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUlTVjoKKwkJKnN0cl9jdXIrKyA9IGJjZDJjaGFyKG1pWzBdID4+IDQpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IG1pX2xlbjsgaSsrKSB7CisJCQlpZiAoc3RyX2N1ciArIDIgPj0gc3RyaW5nICsgc3RyX2xlbikKKwkJCQlyZXR1cm4gc3RyX2N1ciAtIHN0cmluZzsKKwkJCSpzdHJfY3VyKysgPSBiY2QyY2hhcihtaVtpXSAmIDB4Zik7CisJCQkvKiBza2lwIGxhc3QgbmliYmxlIGluIGxhc3QgaW5wdXQgYnl0ZSB3aGVuIEdTTV9FVkVOICovCisJCQlpZiggKGkgIT0gbWlfbGVuLTEpIHx8IChtaVswXSAmIEdTTV9NSV9PREQpKQorCQkJCSpzdHJfY3VyKysgPSBiY2QyY2hhcihtaVtpXSA+PiA0KTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJKnN0cl9jdXIrKyA9ICdcMCc7CisKKwlyZXR1cm4gc3RyX2N1ciAtIHN0cmluZzsKK30KKwordm9pZCBnc200OF9wYXJzZV9yYShzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgY29uc3QgdWludDhfdCAqYnVmKQoreworCXJhaWQtPm1jYyA9IChidWZbMF0gJiAweGYpICogMTAwOworCXJhaWQtPm1jYyArPSAoYnVmWzBdID4+IDQpICogMTA7CisJcmFpZC0+bWNjICs9IChidWZbMV0gJiAweGYpICogMTsKKworCS8qIEkgd29uZGVyIHdobyBjYW1lIHVwIHdpdGggdGhlIHN0dXBpZGl0eSBvZiBlbmNvZGluZyB0aGUgTU5DCisJICogZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRpZ2l0cyBpdHMgZGVjaW1hbCBudW1iZXIgaGFzISAqLworCWlmICgoYnVmWzFdID4+IDQpID09IDB4ZikgeworCQlyYWlkLT5tbmMgPSAoYnVmWzJdICYgMHhmKSAqIDEwOworCQlyYWlkLT5tbmMgKz0gKGJ1ZlsyXSA+PiA0KSAqIDE7CisJfSBlbHNlIHsKKwkJcmFpZC0+bW5jID0gKGJ1ZlsyXSAmIDB4ZikgKiAxMDA7CisJCXJhaWQtPm1uYyArPSAoYnVmWzJdID4+IDQpICogMTA7CisJCXJhaWQtPm1uYyArPSAoYnVmWzFdID4+IDQpICogMTsKKwl9CisKKwlyYWlkLT5sYWMgPSBudG9ocygqKHVpbnQxNl90ICopKGJ1ZiArIDMpKTsKKwlyYWlkLT5yYWMgPSBidWZbNV07Cit9CisKK2ludCBnc200OF9jb25zdHJ1Y3RfcmEodWludDhfdCAqYnVmLCBjb25zdCBzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCkKK3sKKwl1aW50MTZfdCBtY2MgPSByYWlkLT5tY2M7CisJdWludDE2X3QgbW5jID0gcmFpZC0+bW5jOworCisJYnVmWzBdID0gKChtY2MgLyAxMDApICUgMTApIHwgKCgobWNjIC8gMTApICUgMTApIDw8IDQpOworCWJ1ZlsxXSA9IChtY2MgJSAxMCk7CisKKwkvKiBJIHdvbmRlciB3aG8gY2FtZSB1cCB3aXRoIHRoZSBzdHVwaWRpdHkgb2YgZW5jb2RpbmcgdGhlIE1OQworCSAqIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkaWdpdHMgaXRzIGRlY2ltYWwgbnVtYmVyIGhhcyEgKi8KKwlpZiAobW5jIDwgMTAwKSB7CisJCWJ1ZlsxXSB8PSAweGYwOworCQlidWZbMl0gPSAoKG1uYyAvIDEwKSAlIDEwKSB8ICgobW5jICUgMTApIDw8IDQpOworCX0gZWxzZSB7CisJCWJ1ZlsxXSB8PSAobW5jICUgMTApIDw8IDQ7CisJCWJ1ZlsyXSA9ICgobW5jIC8gMTAwKSAlIDEwKSB8ICgoKG1jYyAvIDEwKSAlIDEwKSA8PCA0KTsKKwl9CisKKwkqKHVpbnQxNl90ICopKGJ1ZiszKSA9IGh0b25zKHJhaWQtPmxhYyk7CisKKwlidWZbNV0gPSByYWlkLT5yYWM7CisKKwlyZXR1cm4gNjsKK30KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9nc200OF9pZS5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbTQ4X2llLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyYTFmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL3NyYy9nc200OF9pZS5jCkBAIC0wLDAgKzEsNjU5IEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wICovCisKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IEFuZHJlYXMgRXZlcnNiZXJnCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tbmNjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4Lmg+CisKK3N0YXRpYyBjb25zdCBjaGFyIGJjZF9udW1fZGlnaXRzW10gPSB7CisJJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCisJJzgnLCAnOScsICcqJywgJyMnLCAnYScsICdiJywgJ2MnLCAnXDAnCit9OworCisvKiBkZWNvZGUgYSAnY2FsbGVkL2NhbGxpbmcvY29ubmVjdCBwYXJ0eSBCQ0QgbnVtYmVyJyBhcyBpbiAxMC41LjQuNyAqLworaW50IGdzbTQ4X2RlY29kZV9iY2RfbnVtYmVyKGNoYXIgKm91dHB1dCwgaW50IG91dHB1dF9sZW4sCisJCQkgICAgY29uc3QgdWludDhfdCAqYmNkX2x2LCBpbnQgaF9sZW4pCit7CisJdWludDhfdCBpbl9sZW4gPSBiY2RfbHZbMF07CisJaW50IGk7CisKKwlmb3IgKGkgPSAxICsgaF9sZW47IGkgPD0gaW5fbGVuOyBpKyspIHsKKwkJLyogbG93ZXIgbmliYmxlICovCisJCW91dHB1dF9sZW4tLTsKKwkJaWYgKG91dHB1dF9sZW4gPD0gMSkKKwkJCWJyZWFrOworCQkqb3V0cHV0KysgPSBiY2RfbnVtX2RpZ2l0c1tiY2RfbHZbaV0gJiAweGZdOworCisJCS8qIGhpZ2hlciBuaWJibGUgKi8KKwkJb3V0cHV0X2xlbi0tOworCQlpZiAob3V0cHV0X2xlbiA8PSAxKQorCQkJYnJlYWs7CisJCSpvdXRwdXQrKyA9IGJjZF9udW1fZGlnaXRzW2JjZF9sdltpXSA+PiA0XTsKKwl9CisJaWYgKG91dHB1dF9sZW4gPj0gMSkKKwkJKm91dHB1dCsrID0gJ1wwJzsKKworCXJldHVybiAwOworfQorCisvKiBjb252ZXJ0IGEgc2luZ2xlIEFTQ0lJIGNoYXJhY3RlciB0byBjYWxsLWNvbnRyb2wgQkNEICovCitzdGF0aWMgaW50IGFzY190b19iY2QoY29uc3QgY2hhciBhc2MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShiY2RfbnVtX2RpZ2l0cyk7IGkrKykgeworCQlpZiAoYmNkX251bV9kaWdpdHNbaV0gPT0gYXNjKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisvKiBjb252ZXJ0IGEgQVNDSUkgcGhvbmUgbnVtYmVyIHRvICdjYWxsZWQvY2FsbGluZy9jb25uZWN0IHBhcnR5IEJDRCBudW1iZXInICovCitpbnQgZ3NtNDhfZW5jb2RlX2JjZF9udW1iZXIodWludDhfdCAqYmNkX2x2LCB1aW50OF90IG1heF9sZW4sCisJCSAgICAgIGludCBoX2xlbiwgY29uc3QgY2hhciAqaW5wdXQpCit7CisJaW50IGluX2xlbiA9IHN0cmxlbihpbnB1dCk7CisJaW50IGk7CisJdWludDhfdCAqYmNkX2N1ciA9IGJjZF9sdiArIDEgKyBoX2xlbjsKKworCS8qIHR3byBkaWdpdHMgcGVyIGJ5dGUsIHBsdXMgdHlwZSBieXRlICovCisJYmNkX2x2WzBdID0gaW5fbGVuLzIgKyBoX2xlbjsKKwlpZiAoaW5fbGVuICUgMikKKwkJYmNkX2x2WzBdKys7CisKKwlpZiAoYmNkX2x2WzBdID4gbWF4X2xlbikKKwkJcmV0dXJuIC1FSU87CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5fbGVuOyBpKyspIHsKKwkJaW50IHJjID0gYXNjX3RvX2JjZChpbnB1dFtpXSk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWlmIChpICUgMiA9PSAwKQorCQkJKmJjZF9jdXIgPSByYzsKKwkJZWxzZQorCQkJKmJjZF9jdXIrKyB8PSAocmMgPDwgNCk7CisJfQorCS8qIGFwcGVuZCBwYWRkaW5nIG5pYmJsZSBpbiBjYXNlIG9mIG9kZCBsZW5ndGggKi8KKwlpZiAoaSAlIDIpCisJCSpiY2RfY3VyKysgfD0gMHhmMDsKKworCS8qIHJldHVybiBob3cgbWFueSBieXRlcyB3ZSB1c2VkICovCisJcmV0dXJuIChiY2RfY3VyIC0gYmNkX2x2KTsKK30KKworLyogZGVjb2RlICdiZWFyZXIgY2FwYWJpbGl0eScgKi8KK2ludCBnc200OF9kZWNvZGVfYmVhcmVyX2NhcChzdHJ1Y3QgZ3NtX21uY2NfYmVhcmVyX2NhcCAqYmNhcCwKKwkJCSAgICAgY29uc3QgdWludDhfdCAqbHYpCit7CisJdWludDhfdCBpbl9sZW4gPSBsdlswXTsKKwlpbnQgaSwgczsKKworCWlmIChpbl9sZW4gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJjYXAtPnNwZWVjaF92ZXJbMF0gPSAtMTsgLyogZW5kIG9mIGxpc3QsIG9mIG1heGltdW0gNyB2YWx1ZXMgKi8KKworCS8qIG9jdGV0IDMgKi8KKwliY2FwLT50cmFuc2ZlciA9IGx2WzFdICYgMHgwNzsKKwliY2FwLT5tb2RlID0gKGx2WzFdICYgMHgwOCkgPj4gMzsKKwliY2FwLT5jb2RpbmcgPSAobHZbMV0gJiAweDEwKSA+PiA0OworCWJjYXAtPnJhZGlvID0gKGx2WzFdICYgMHg2MCkgPj4gNTsKKworCWlmIChiY2FwLT50cmFuc2ZlciA9PSBHU01fTU5DQ19CQ0FQX1NQRUVDSCkgeworCQlpID0gMTsKKwkJcyA9IDA7CisJCXdoaWxlKCEobHZbaV0gJiAweDgwKSkgeworCQkJaSsrOyAvKiBvY3RldCAzYSBldGMgKi8KKwkJCWlmIChpbl9sZW4gPCBpKQorCQkJCXJldHVybiAwOworCQkJYmNhcC0+c3BlZWNoX3ZlcltzKytdID0gbHZbaV0gJiAweDBmOworCQkJYmNhcC0+c3BlZWNoX3ZlcltzXSA9IC0xOyAvKiBlbmQgb2YgbGlzdCAqLworCQkJaWYgKGkgPT0gMikgLyogb2N0ZXQgM2EgKi8KKwkJCQliY2FwLT5zcGVlY2hfY3RtID0gKGx2W2ldICYgMHgyMCkgPj4gNTsKKwkJCWlmIChzID09IDcpIC8qIG1heGltdW0gc3BlZWNoIHZlcnNpb25zICsgZW5kIG9mIGxpc3QgKi8KKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCWkgPSAxOworCQl3aGlsZSAoIShsdltpXSAmIDB4ODApKSB7CisJCQlpKys7IC8qIG9jdGV0IDNhIGV0YyAqLworCQkJaWYgKGluX2xlbiA8IGkpCisJCQkJcmV0dXJuIDA7CisJCQkvKiBpZ25vcmUgdGhlbSAqLworCQl9CisJCS8qIEZJWE1FOiBpbXBsZW1lbnQgT0NURVQgNCsgcGFyc2luZyAqLworCX0KKworCXJldHVybiAwOworfQorCisvKiBlbmNvZGUgJ2JlYXJlciBjYXBhYmlsaXR5JyAqLworaW50IGdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfYmVhcmVyX2NhcCAqYmNhcCkKK3sKKwl1aW50OF90IGx2WzMyICsgMV07CisJaW50IGkgPSAxLCBzOworCisJbHZbMV0gPSBiY2FwLT50cmFuc2ZlcjsKKwlsdlsxXSB8PSBiY2FwLT5tb2RlIDw8IDM7CisJbHZbMV0gfD0gYmNhcC0+Y29kaW5nIDw8IDQ7CisJbHZbMV0gfD0gYmNhcC0+cmFkaW8gPDwgNTsKKworCWlmIChiY2FwLT50cmFuc2ZlciA9PSBHU01fTU5DQ19CQ0FQX1NQRUVDSCkgeworCQlmb3IgKHMgPSAwOyBiY2FwLT5zcGVlY2hfdmVyW3NdID49IDA7IHMrKykgeworCQkJaSsrOyAvKiBvY3RldCAzYSBldGMgKi8KKwkJCWx2W2ldID0gYmNhcC0+c3BlZWNoX3ZlcltzXTsKKwkJCWlmIChpID09IDIpIC8qIG9jdGV0IDNhICovCisJCQkJbHZbaV0gfD0gYmNhcC0+c3BlZWNoX2N0bSA8PCA1OworCQl9CisJCWx2W2ldIHw9IDB4ODA7IC8qIGxhc3QgSUUgb2Ygb2N0ZXQgMyBldGMgKi8KKwl9IGVsc2UgeworCQkvKiBGSVhNRTogaW1wbGVtZW50IE9DVEVUIDQrIGVuY29kaW5nICovCisJfQorCisJbHZbMF0gPSBpOworCWlmIChsdl9vbmx5KQorCQltc2diX2x2X3B1dChtc2csIGx2WzBdLCBsdisxKTsKKwllbHNlCisJCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0JFQVJFUl9DQVAsIGx2WzBdLCBsdisxKTsKKworCXJldHVybiAwOworfQorCisvKiBkZWNvZGUgJ2NhbGwgY29udHJvbCBjYXAnICovCitpbnQgZ3NtNDhfZGVjb2RlX2NjY2FwKHN0cnVjdCBnc21fbW5jY19jY2NhcCAqY2NhcCwgY29uc3QgdWludDhfdCAqbHYpCit7CisJdWludDhfdCBpbl9sZW4gPSBsdlswXTsKKworCWlmIChpbl9sZW4gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG9jdGV0IDMgKi8KKwljY2FwLT5kdG1mID0gbHZbMV0gJiAweDAxOworCWNjYXAtPnBjcCA9IChsdlsxXSAmIDB4MDIpID4+IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogZW5jb2RlICdjYWxsIGNvbnRyb2wgY2FwJyAqLworaW50IGdzbTQ4X2VuY29kZV9jY2NhcChzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJY29uc3Qgc3RydWN0IGdzbV9tbmNjX2NjY2FwICpjY2FwKQoreworCXVpbnQ4X3QgbHZbMl07CisKKwlsdlswXSA9IDE7CisJbHZbMV0gPSAwOworCWlmIChjY2FwLT5kdG1mKQorCQlsdiBbMV0gfD0gMHgwMTsKKwlpZiAoY2NhcC0+cGNwKQorCQlsdiBbMV0gfD0gMHgwMjsKKworCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0NDX0NBUCwgbHZbMF0sIGx2KzEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSAnY2FsbGVkIHBhcnR5IEJDRCBudW1iZXInICovCitpbnQgZ3NtNDhfZGVjb2RlX2NhbGxlZChzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsZWQsCisJCQkgY29uc3QgdWludDhfdCAqbHYpCit7CisJdWludDhfdCBpbl9sZW4gPSBsdlswXTsKKworCWlmIChpbl9sZW4gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG9jdGV0IDMgKi8KKwljYWxsZWQtPnBsYW4gPSBsdlsxXSAmIDB4MGY7CisJY2FsbGVkLT50eXBlID0gKGx2WzFdICYgMHg3MCkgPj4gNDsKKworCS8qIG9jdGV0IDQuLk4gKi8KKwlnc200OF9kZWNvZGVfYmNkX251bWJlcihjYWxsZWQtPm51bWJlciwgc2l6ZW9mKGNhbGxlZC0+bnVtYmVyKSwgbHYsIDEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGVuY29kZSAnY2FsbGVkIHBhcnR5IEJDRCBudW1iZXInICovCitpbnQgZ3NtNDhfZW5jb2RlX2NhbGxlZChzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJIGNvbnN0IHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxlZCkKK3sKKwl1aW50OF90IGx2WzE4XTsKKwlpbnQgcmV0OworCisJLyogb2N0ZXQgMyAqLworCWx2WzFdID0gY2FsbGVkLT5wbGFuOworCWx2WzFdIHw9IGNhbGxlZC0+dHlwZSA8PCA0OworCisJLyogb2N0ZXQgNC4uTiwgb2N0ZXQgMiAqLworCXJldCA9IGdzbTQ4X2VuY29kZV9iY2RfbnVtYmVyKGx2LCBzaXplb2YobHYpLCAxLCBjYWxsZWQtPm51bWJlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltc2diX3Rsdl9wdXQobXNnLCBHU000OF9JRV9DQUxMRURfQkNELCBsdlswXSwgbHYrMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZGVjb2RlIGNhbGxlcmlkIG9mIHZhcmlvdXMgSUVzICovCitpbnQgZ3NtNDhfZGVjb2RlX2NhbGxlcmlkKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxlcmlkLAorCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KQoreworCXVpbnQ4X3QgaW5fbGVuID0gbHZbMF07CisJaW50IGkgPSAxOworCisJaWYgKGluX2xlbiA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogb2N0ZXQgMyAqLworCWNhbGxlcmlkLT5wbGFuID0gbHZbMV0gJiAweDBmOworCWNhbGxlcmlkLT50eXBlID0gKGx2WzFdICYgMHg3MCkgPj4gNDsKKworCS8qIG9jdGV0IDNhICovCisJaWYgKCEobHZbMV0gJiAweDgwKSkgeworCQljYWxsZXJpZC0+c2NyZWVuID0gbHZbMl0gJiAweDAzOworCQljYWxsZXJpZC0+cHJlc2VudCA9IChsdlsyXSAmIDB4NjApID4+IDU7CisJCWkgPSAyOworCX0KKworCS8qIG9jdGV0IDQuLk4gKi8KKwlnc200OF9kZWNvZGVfYmNkX251bWJlcihjYWxsZXJpZC0+bnVtYmVyLCBzaXplb2YoY2FsbGVyaWQtPm51bWJlciksIGx2LCBpKTsKKworCXJldHVybiAwOworfQorCisvKiBlbmNvZGUgY2FsbGVyaWQgb2YgdmFyaW91cyBJRXMgKi8KK2ludCBnc200OF9lbmNvZGVfY2FsbGVyaWQoc3RydWN0IG1zZ2IgKm1zZywgaW50IGllLCBpbnQgbWF4X2xlbiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBnc21fbW5jY19udW1iZXIgKmNhbGxlcmlkKQoreworCXVpbnQ4X3QgbHZbbWF4X2xlbiAtIDFdOworCWludCBoX2xlbiA9IDE7CisJaW50IHJldDsKKworCS8qIG9jdGV0IDMgKi8KKwlsdlsxXSA9IGNhbGxlcmlkLT5wbGFuOworCWx2WzFdIHw9IGNhbGxlcmlkLT50eXBlIDw8IDQ7CisKKwlpZiAoY2FsbGVyaWQtPnByZXNlbnQgfHwgY2FsbGVyaWQtPnNjcmVlbikgeworCQkvKiBvY3RldCAzYSAqLworCQlsdlsyXSA9IGNhbGxlcmlkLT5zY3JlZW47CisJCWx2WzJdIHw9IGNhbGxlcmlkLT5wcmVzZW50IDw8IDU7CisJCWx2WzJdIHw9IDB4ODA7CisJCWhfbGVuKys7CisJfSBlbHNlCisJCWx2WzFdIHw9IDB4ODA7CisKKwkvKiBvY3RldCA0Li5OLCBvY3RldCAyICovCisJcmV0ID0gZ3NtNDhfZW5jb2RlX2JjZF9udW1iZXIobHYsIHNpemVvZihsdiksIGhfbGVuLCBjYWxsZXJpZC0+bnVtYmVyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW1zZ2JfdGx2X3B1dChtc2csIGllLCBsdlswXSwgbHYrMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZGVjb2RlICdjYXVzZScgKi8KK2ludCBnc200OF9kZWNvZGVfY2F1c2Uoc3RydWN0IGdzbV9tbmNjX2NhdXNlICpjYXVzZSwKKwkJCWNvbnN0IHVpbnQ4X3QgKmx2KQoreworCXVpbnQ4X3QgaW5fbGVuID0gbHZbMF07CisJaW50IGk7CisKKwlpZiAoaW5fbGVuIDwgMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXVzZS0+ZGlhZ19sZW4gPSAwOworCisJLyogb2N0ZXQgMyAqLworCWNhdXNlLT5sb2NhdGlvbiA9IGx2WzFdICYgMHgwZjsKKwljYXVzZS0+Y29kaW5nID0gKGx2WzFdICYgMHg2MCkgPj4gNTsKKworCWkgPSAxOworCWlmICghKGx2W2ldICYgMHg4MCkpIHsKKwkJaSsrOyAvKiBvY3RldCAzYSAqLworCQlpZiAoaW5fbGVuIDwgaSsxKQorCQkJcmV0dXJuIDA7CisJCWNhdXNlLT5yZWMgPSAxOworCQljYXVzZS0+cmVjX3ZhbCA9IGx2W2ldICYgMHg3ZjsKKwl9CisJaSsrOworCisJLyogb2N0ZXQgNCAqLworCWNhdXNlLT52YWx1ZSA9IGx2W2ldICYgMHg3ZjsKKwlpKys7CisKKwlpZiAoaW5fbGVuIDwgaSkgLyogbm8gZGlhZyAqLworCQlyZXR1cm4gMDsKKworCWlmIChpbl9sZW4gLSAoaS0xKSA+IDMyKSAvKiBtYXhpbXVtIDMyIG9jdGV0cyAqLworCQlyZXR1cm4gMDsKKworCS8qIG9jdGV0IDUtTiAqLworCW1lbWNweShjYXVzZS0+ZGlhZywgbHYgKyBpLCBpbl9sZW4gLSAoaS0xKSk7CisJY2F1c2UtPmRpYWdfbGVuID0gaW5fbGVuIC0gKGktMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZW5jb2RlICdjYXVzZScgKi8KK2ludCBnc200OF9lbmNvZGVfY2F1c2Uoc3RydWN0IG1zZ2IgKm1zZywgaW50IGx2X29ubHksCisJCQljb25zdCBzdHJ1Y3QgZ3NtX21uY2NfY2F1c2UgKmNhdXNlKQoreworCXVpbnQ4X3QgbHZbMzIrNF07CisJaW50IGk7CisKKwlpZiAoY2F1c2UtPmRpYWdfbGVuID4gMzIpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogb2N0ZXQgMyAqLworCWx2WzFdID0gY2F1c2UtPmxvY2F0aW9uOworCWx2WzFdIHw9IGNhdXNlLT5jb2RpbmcgPDwgNTsKKworCWkgPSAxOworCWlmIChjYXVzZS0+cmVjKSB7CisJCWkrKzsgLyogb2N0ZXQgM2EgKi8KKwkJbHZbaV0gPSBjYXVzZS0+cmVjX3ZhbDsKKwl9CisJbHZbaV0gfD0gMHg4MDsgLyogZW5kIG9mIG9jdGV0IDMgKi8KKworCS8qIG9jdGV0IDQgKi8KKwlpKys7CisJbHZbaV0gPSAweDgwIHwgY2F1c2UtPnZhbHVlOworCisJLyogb2N0ZXQgNS1OICovCisJaWYgKGNhdXNlLT5kaWFnX2xlbikgeworCQltZW1jcHkobHYgKyBpLCBjYXVzZS0+ZGlhZywgY2F1c2UtPmRpYWdfbGVuKTsKKwkJaSArPSBjYXVzZS0+ZGlhZ19sZW47CisJfQorCisJbHZbMF0gPSBpOworCWlmIChsdl9vbmx5KQorCQltc2diX2x2X3B1dChtc2csIGx2WzBdLCBsdisxKTsKKwllbHNlCisJCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0NBVVNFLCBsdlswXSwgbHYrMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZGVjb2RlICdjYWxsaW5nIG51bWJlcicgKi8KK2ludCBnc200OF9kZWNvZGVfY2FsbGluZyhzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsaW5nLAorCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KQoreworCXJldHVybiBnc200OF9kZWNvZGVfY2FsbGVyaWQoY2FsbGluZywgbHYpOworfQorCisvKiBlbmNvZGUgJ2NhbGxpbmcgbnVtYmVyJyAqLworaW50IGdzbTQ4X2VuY29kZV9jYWxsaW5nKHN0cnVjdCBtc2diICptc2csIAorCQkJICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjYWxsaW5nKQoreworCXJldHVybiBnc200OF9lbmNvZGVfY2FsbGVyaWQobXNnLCBHU000OF9JRV9DQUxMSU5HX0JDRCwgMTQsIGNhbGxpbmcpOworfQorCisvKiBkZWNvZGUgJ2Nvbm5lY3RlZCBudW1iZXInICovCitpbnQgZ3NtNDhfZGVjb2RlX2Nvbm5lY3RlZChzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjb25uZWN0ZWQsCisJCQkgY29uc3QgdWludDhfdCAqbHYpCit7CisJcmV0dXJuIGdzbTQ4X2RlY29kZV9jYWxsZXJpZChjb25uZWN0ZWQsIGx2KTsKK30KKworLyogZW5jb2RlICdjb25uZWN0ZWQgbnVtYmVyJyAqLworaW50IGdzbTQ4X2VuY29kZV9jb25uZWN0ZWQoc3RydWN0IG1zZ2IgKm1zZywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpjb25uZWN0ZWQpCit7CisJcmV0dXJuIGdzbTQ4X2VuY29kZV9jYWxsZXJpZChtc2csIEdTTTQ4X0lFX0NPTk5fQkNELCAxNCwgY29ubmVjdGVkKTsKK30KKworLyogZGVjb2RlICdyZWRpcmVjdGluZyBudW1iZXInICovCitpbnQgZ3NtNDhfZGVjb2RlX3JlZGlyZWN0aW5nKHN0cnVjdCBnc21fbW5jY19udW1iZXIgKnJlZGlyZWN0aW5nLAorCQkJIGNvbnN0IHVpbnQ4X3QgKmx2KQoreworCXJldHVybiBnc200OF9kZWNvZGVfY2FsbGVyaWQocmVkaXJlY3RpbmcsIGx2KTsKK30KKworLyogZW5jb2RlICdyZWRpcmVjdGluZyBudW1iZXInICovCitpbnQgZ3NtNDhfZW5jb2RlX3JlZGlyZWN0aW5nKHN0cnVjdCBtc2diICptc2csCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyICpyZWRpcmVjdGluZykKK3sKKwlyZXR1cm4gZ3NtNDhfZW5jb2RlX2NhbGxlcmlkKG1zZywgR1NNNDhfSUVfUkVESVJfQkNELCAxOSwgcmVkaXJlY3RpbmcpOworfQorCisvKiBkZWNvZGUgJ2ZhY2lsaXR5JyAqLworaW50IGdzbTQ4X2RlY29kZV9mYWNpbGl0eShzdHJ1Y3QgZ3NtX21uY2NfZmFjaWxpdHkgKmZhY2lsaXR5LAorCQkJICAgY29uc3QgdWludDhfdCAqbHYpCit7CisJdWludDhfdCBpbl9sZW4gPSBsdlswXTsKKworCWlmIChpbl9sZW4gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpbl9sZW4gPiBzaXplb2YoZmFjaWxpdHktPmluZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbWNweShmYWNpbGl0eS0+aW5mbywgbHYrMSwgaW5fbGVuKTsKKwlmYWNpbGl0eS0+bGVuID0gaW5fbGVuOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGVuY29kZSAnZmFjaWxpdHknICovCitpbnQgZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAorCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX2ZhY2lsaXR5ICpmYWNpbGl0eSkKK3sKKwl1aW50OF90IGx2W0dTTV9NQVhfRkFDSUxJVFkgKyAxXTsKKworCWlmIChmYWNpbGl0eS0+bGVuIDwgMSB8fCBmYWNpbGl0eS0+bGVuID4gR1NNX01BWF9GQUNJTElUWSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkobHYrMSwgZmFjaWxpdHktPmluZm8sIGZhY2lsaXR5LT5sZW4pOworCWx2WzBdID0gZmFjaWxpdHktPmxlbjsKKwlpZiAobHZfb25seSkKKwkJbXNnYl9sdl9wdXQobXNnLCBsdlswXSwgbHYrMSk7CisJZWxzZQorCQltc2diX3Rsdl9wdXQobXNnLCBHU000OF9JRV9GQUNJTElUWSwgbHZbMF0sIGx2KzEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSAnbm90aWZ5JyAqLworaW50IGdzbTQ4X2RlY29kZV9ub3RpZnkoaW50ICpub3RpZnksIGNvbnN0IHVpbnQ4X3QgKnYpCit7CisJKm5vdGlmeSA9IHZbMF0gJiAweDdmOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGVuY29kZSAnbm90aWZ5JyAqLworaW50IGdzbTQ4X2VuY29kZV9ub3RpZnkoc3RydWN0IG1zZ2IgKm1zZywgaW50IG5vdGlmeSkKK3sKKwltc2diX3ZfcHV0KG1zZywgbm90aWZ5IHwgMHg4MCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZGVjb2RlICdzaWduYWwnICovCitpbnQgZ3NtNDhfZGVjb2RlX3NpZ25hbChpbnQgKnNpZ25hbCwgY29uc3QgdWludDhfdCAqdikKK3sKKwkqc2lnbmFsID0gdlswXTsKKworCXJldHVybiAwOworfQorCisvKiBlbmNvZGUgJ3NpZ25hbCcgKi8KK2ludCBnc200OF9lbmNvZGVfc2lnbmFsKHN0cnVjdCBtc2diICptc2csIGludCBzaWduYWwpCit7CisJbXNnYl90dl9wdXQobXNnLCBHU000OF9JRV9TSUdOQUwsIHNpZ25hbCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZGVjb2RlICdrZXlwYWQnICovCitpbnQgZ3NtNDhfZGVjb2RlX2tleXBhZChpbnQgKmtleXBhZCwgY29uc3QgdWludDhfdCAqbHYpCit7CisJdWludDhfdCBpbl9sZW4gPSBsdlswXTsKKworCWlmIChpbl9sZW4gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSprZXlwYWQgPSBsdlsxXSAmIDB4N2Y7CisKKwlyZXR1cm4gMDsKK30KKworLyogZW5jb2RlICdrZXlwYWQnICovCitpbnQgZ3NtNDhfZW5jb2RlX2tleXBhZChzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQga2V5cGFkKQoreworCW1zZ2JfdHZfcHV0KG1zZywgR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZLCBrZXlwYWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSAncHJvZ3Jlc3MnICovCitpbnQgZ3NtNDhfZGVjb2RlX3Byb2dyZXNzKHN0cnVjdCBnc21fbW5jY19wcm9ncmVzcyAqcHJvZ3Jlc3MsCisJCQkgICBjb25zdCB1aW50OF90ICpsdikKK3sKKwl1aW50OF90IGluX2xlbiA9IGx2WzBdOworCisJaWYgKGluX2xlbiA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJvZ3Jlc3MtPmNvZGluZyA9IChsdlsxXSAmIDB4NjApID4+IDU7CisJcHJvZ3Jlc3MtPmxvY2F0aW9uID0gbHZbMV0gJiAweDBmOworCXByb2dyZXNzLT5kZXNjciA9IGx2WzJdICYgMHg3ZjsKKworCXJldHVybiAwOworfQorCisvKiBlbmNvZGUgJ3Byb2dyZXNzJyAqLworaW50IGdzbTQ4X2VuY29kZV9wcm9ncmVzcyhzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbHZfb25seSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBnc21fbW5jY19wcm9ncmVzcyAqcCkKK3sKKwl1aW50OF90IGx2WzNdOworCisJbHZbMF0gPSAyOworCWx2WzFdID0gMHg4MCB8ICgocC0+Y29kaW5nICYgMHgzKSA8PCA1KSB8IChwLT5sb2NhdGlvbiAmIDB4Zik7CisJbHZbMl0gPSAweDgwIHwgKHAtPmRlc2NyICYgMHg3Zik7CisJaWYgKGx2X29ubHkpCisJCW1zZ2JfbHZfcHV0KG1zZywgbHZbMF0sIGx2KzEpOworCWVsc2UKKwkJbXNnYl90bHZfcHV0KG1zZywgR1NNNDhfSUVfUFJPR1JfSU5ELCBsdlswXSwgbHYrMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZGVjb2RlICd1c2VyLXVzZXInICovCitpbnQgZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKHN0cnVjdCBnc21fbW5jY191c2VydXNlciAqdXUsCisJCQkgICBjb25zdCB1aW50OF90ICpsdikKK3sKKwl1aW50OF90IGluX2xlbiA9IGx2WzBdOworCWNoYXIgKmluZm8gPSB1dS0+aW5mbzsKKwlpbnQgaW5mb19sZW4gPSBzaXplb2YodXUtPmluZm8pOworCWludCBpOworCisJaWYgKGluX2xlbiA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJdXUtPnByb3RvID0gbHZbMV07CisKKwlmb3IgKGkgPSAyOyBpIDw9IGluX2xlbjsgaSsrKSB7CisJCWluZm9fbGVuLS07CisJCWlmIChpbmZvX2xlbiA8PSAxKQorCQkJYnJlYWs7CisJCSppbmZvKysgPSBsdltpXTsKKwl9CisJaWYgKGluZm9fbGVuID49IDEpCisJCSppbmZvKysgPSAnXDAnOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGVuY29kZSAndXNlcnVzZXInICovCitpbnQgZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKHN0cnVjdCBtc2diICptc2csIGludCBsdl9vbmx5LAorCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX3VzZXJ1c2VyICp1dSkKK3sKKwl1aW50OF90IGx2W0dTTV9NQVhfVVNFUlVTRVIgKyAyXTsKKworCWlmIChzdHJsZW4odXUtPmluZm8pID4gR1NNX01BWF9VU0VSVVNFUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsdlswXSA9IDEgKyBzdHJsZW4odXUtPmluZm8pOworCWx2WzFdID0gdXUtPnByb3RvOworCW1lbWNweShsdiArIDIsIHV1LT5pbmZvLCBzdHJsZW4odXUtPmluZm8pKTsKKwlpZiAobHZfb25seSkKKwkJbXNnYl9sdl9wdXQobXNnLCBsdlswXSwgbHYrMSk7CisJZWxzZQorCQltc2diX3Rsdl9wdXQobXNnLCBHU000OF9JRV9VU0VSX1VTRVIsIGx2WzBdLCBsdisxKTsKKworCXJldHVybiAwOworfQorCisvKiBkZWNvZGUgJ3NzIHZlcnNpb24nICovCitpbnQgZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbihzdHJ1Y3QgZ3NtX21uY2Nfc3N2ZXJzaW9uICpzc3YsCisJCQkgICAgY29uc3QgdWludDhfdCAqbHYpCit7CisJdWludDhfdCBpbl9sZW4gPSBsdlswXTsKKworCWlmIChpbl9sZW4gPCAxIHx8IGluX2xlbiA8IHNpemVvZihzc3YtPmluZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbWNweShzc3YtPmluZm8sIGx2ICsgMSwgaW5fbGVuKTsKKwlzc3YtPmxlbiA9IGluX2xlbjsKKworCXJldHVybiAwOworfQorCisvKiBlbmNvZGUgJ3NzIHZlcnNpb24nICovCitpbnQgZ3NtNDhfZW5jb2RlX3NzdmVyc2lvbihzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJICAgY29uc3Qgc3RydWN0IGdzbV9tbmNjX3NzdmVyc2lvbiAqc3N2KQoreworCXVpbnQ4X3QgbHZbR1NNX01BWF9TU1ZFUlNJT04gKyAxXTsKKworCWlmIChzc3YtPmxlbiA+IEdTTV9NQVhfU1NWRVJTSU9OKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWx2WzBdID0gc3N2LT5sZW47CisJbWVtY3B5KGx2ICsgMSwgc3N2LT5pbmZvLCBzc3YtPmxlbik7CisJbXNnYl90bHZfcHV0KG1zZywgR1NNNDhfSUVfU1NfVkVSUywgbHZbMF0sIGx2KzEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRlY29kZSAnbW9yZSBkYXRhJyBkb2VzIG5vdCByZXF1aXJlIGEgZnVuY3Rpb24sIGJlY2F1c2UgaXQgaGFzIG5vIHZhbHVlICovCisKKy8qIGVuY29kZSAnbW9yZSBkYXRhJyAqLworaW50IGdzbTQ4X2VuY29kZV9tb3JlKHN0cnVjdCBtc2diICptc2cpCit7CisJdWludDhfdCAqaWU7CisKKwlpZSA9IG1zZ2JfcHV0KG1zZywgMSk7CisJaWVbMF0gPSBHU000OF9JRV9NT1JFX0RBVEE7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL2dzbV91dGlscy5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbV91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOTJmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvZ3NtX3V0aWxzLmMKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiAoQykgMjAwOCBieSBEYW5pZWwgV2lsbG1hbm4gPGRhbmllbEB0b3RhbHVlYmVyd2FjaHVuZy5kZT4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworLy8jaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3V0aWxzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgIi4uL2NvbmZpZy5oIgorCisvKiBHU00gMDMuMzggNi4yLjEgQ2hhcmFjaHRlciBwYWNraW5nICovCitpbnQgZ3NtXzdiaXRfZGVjb2RlKGNoYXIgKnRleHQsIGNvbnN0IHVpbnQ4X3QgKnVzZXJfZGF0YSwgdWludDhfdCBsZW5ndGgpCit7CisJaW50IGkgPSAwOworCWludCBsID0gMDsKKworICAgICAgICAvKiBGSVhNRTogV2UgbmVlZCB0byBhY2NvdW50IGZvciB1c2VyIGRhdGEgaGVhZGVycyBoZXJlICovCisJaSArPSBsOworCWZvciAoOyBpIDwgbGVuZ3RoOyBpICsrKQorCQkqKHRleHQgKyspID0KKwkJCSgodXNlcl9kYXRhWyhpICogNyArIDcpID4+IDNdIDw8CisJCQkgICg3IC0gKChpICogNyArIDcpICYgNykpKSB8CisJCQkgKHVzZXJfZGF0YVsoaSAqIDcpID4+IDNdID4+CisJCQkgICgoaSAqIDcpICYgNykpKSAmIDB4N2Y7CisJKnRleHQgPSAnXDAnOworCisJcmV0dXJuIGkgLSBsOworfQorCisKKy8qIEdTTSAwMy4zOCA2LjIuMSBDaGFyYWNodGVyIHBhY2tpbmcgKi8KK2ludCBnc21fN2JpdF9lbmNvZGUodWludDhfdCAqcmVzdWx0LCBjb25zdCBjaGFyICpkYXRhKQoreworCWludCBpLGogPSAwOworCXVuc2lnbmVkIGNoYXIgY2gxLCBjaDI7CisJaW50IHNoaWZ0ID0gMDsKKworCWZvciAoIGk9MDsgaTxzdHJsZW4oZGF0YSk7IGkrKyApIHsKKworCQljaDEgPSBkYXRhW2ldICYgMHg3RjsKKwkJY2gxID0gY2gxID4+IHNoaWZ0OworCQljaDIgPSBkYXRhWyhpKzEpXSAmIDB4N0Y7CisJCWNoMiA9IGNoMiA8PCAoNy1zaGlmdCk7CisKKwkJY2gxID0gY2gxIHwgY2gyOworCisJCXJlc3VsdFtqKytdID0gY2gxOworCisJCXNoaWZ0Kys7CisKKwkJaWYgKChzaGlmdCA9PSA3KSAmJiAoaSsxPHN0cmxlbihkYXRhKSkpIHsKKwkJCXNoaWZ0ID0gMDsKKwkJCWkrKzsKKwkJfQorCX0KKworCXJldHVybiBpOworfQorCisvKiBkZXRlcm1pbmUgcG93ZXIgY29udHJvbCBsZXZlbCBmb3IgZ2l2ZW4gZEJtIHZhbHVlLCBhcyBpbmRpY2F0ZWQKKyAqIGJ5IHRoZSB0YWJsZXMgaW4gY2hhcHRlciA0LjEuMSBvZiBHU00gVFMgMDUuMDUgKi8KK2ludCBtc19wd3JfY3RsX2x2bChlbnVtIGdzbV9iYW5kIGJhbmQsIHVuc2lnbmVkIGludCBkYm0pCit7CisJc3dpdGNoIChiYW5kKSB7CisJY2FzZSBHU01fQkFORF80NTA6CisJY2FzZSBHU01fQkFORF80ODA6CisJY2FzZSBHU01fQkFORF83NTA6CisJY2FzZSBHU01fQkFORF85MDA6CisJY2FzZSBHU01fQkFORF84MTA6CisJY2FzZSBHU01fQkFORF84NTA6CisJCWlmIChkYm0gPj0gMzkpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAoZGJtIDwgNSkKKwkJCXJldHVybiAxOTsKKwkJZWxzZSB7CisJCQkvKiB3ZSBhcmUgZ3VhcmFudGVlZCB0byBoYXZlICg1IDw9IGRibSA8IDM5KSAqLworCQkJcmV0dXJuIDIgKyAoKDM5IC0gZGJtKSAvIDIpOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX0JBTkRfMTgwMDoKKwkJaWYgKGRibSA+PSAzNikKKwkJCXJldHVybiAyOTsKKwkJZWxzZSBpZiAoZGJtID49IDM0KQkKKwkJCXJldHVybiAzMDsKKwkJZWxzZSBpZiAoZGJtID49IDMyKQorCQkJcmV0dXJuIDMxOworCQllbHNlIGlmIChkYm0gPT0gMzEpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSB7CisJCQkvKiB3ZSBhcmUgZ3VhcmFudGVlZCB0byBoYXZlICgwIDw9IGRibSA8IDMxKSAqLworCQkJcmV0dXJuICgzMCAtIGRibSkgLyAyOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX0JBTkRfMTkwMDoKKwkJaWYgKGRibSA+PSAzMykKKwkJCXJldHVybiAzMDsKKwkJZWxzZSBpZiAoZGJtID49IDMyKQorCQkJcmV0dXJuIDMxOworCQllbHNlIGlmIChkYm0gPT0gMzEpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSB7CisJCQkvKiB3ZSBhcmUgZ3VhcmFudGVlZCB0byBoYXZlICgwIDw9IGRibSA8IDMxKSAqLworCQkJcmV0dXJuICgzMCAtIGRibSkgLyAyOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IG1zX3B3cl9kYm0oZW51bSBnc21fYmFuZCBiYW5kLCB1aW50OF90IGx2bCkKK3sKKwlsdmwgJj0gMHgxZjsKKworCXN3aXRjaCAoYmFuZCkgeworCWNhc2UgR1NNX0JBTkRfNDUwOgorCWNhc2UgR1NNX0JBTkRfNDgwOgorCWNhc2UgR1NNX0JBTkRfNzUwOgorCWNhc2UgR1NNX0JBTkRfOTAwOgorCWNhc2UgR1NNX0JBTkRfODEwOgorCWNhc2UgR1NNX0JBTkRfODUwOgorCQlpZiAobHZsIDwgMikKKwkJCXJldHVybiAzOTsKKwkJZWxzZSBpZiAobHZsIDwgMjApCisJCQlyZXR1cm4gMzkgLSAoKGx2bCAtIDIpICogMikgOworCQllbHNlCisJCQlyZXR1cm4gNTsKKwkJYnJlYWs7CisJY2FzZSBHU01fQkFORF8xODAwOgorCQlpZiAobHZsIDwgMTYpCisJCQlyZXR1cm4gMzAgLSAobHZsICogMik7CisJCWVsc2UgaWYgKGx2bCA8IDI5KQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiAzNiAtICgobHZsIC0gMjkpICogMik7CisJCWJyZWFrOworCWNhc2UgR1NNX0JBTkRfMTkwMDoKKwkJaWYgKGx2bCA8IDE2KQorCQkJcmV0dXJuIDMwIC0gKGx2bCAqIDIpOworCQllbHNlIGlmIChsdmwgPCAzMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQllbHNlCisJCQlyZXR1cm4gMzMgLSAobHZsIC0gMzApOworCQlicmVhazsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIEFjY29yZGluZyB0byBUUyAwOC4wNSBDaGFwdGVyIDguMS40ICovCitpbnQgcnhsZXYyZGJtKHVpbnQ4X3QgcnhsZXYpCit7CisJaWYgKHJ4bGV2ID4gNjMpCisJCXJ4bGV2ID0gNjM7CisKKwlyZXR1cm4gLTExMCArIHJ4bGV2OworfQorCisvKiBBY2NvcmRpbmcgdG8gVFMgMDguMDUgQ2hhcHRlciA4LjEuNCAqLwordWludDhfdCBkYm0ycnhsZXYoaW50IGRibSkKK3sKKwlpbnQgcnhsZXYgPSBkYm0gKyAxMTA7CisKKwlpZiAocnhsZXYgPiA2MykKKwkJcnhsZXYgPSA2MzsKKwllbHNlIGlmIChyeGxldiA8IDApCisJCXJ4bGV2ID0gMDsKKworCXJldHVybiByeGxldjsKK30KKworY29uc3QgY2hhciAqZ3NtX2JhbmRfbmFtZShlbnVtIGdzbV9iYW5kIGJhbmQpCit7CisJc3dpdGNoIChiYW5kKSB7CisJY2FzZSBHU01fQkFORF80NTA6CisJCXJldHVybiAiR1NNNDUwIjsKKwljYXNlIEdTTV9CQU5EXzQ4MDoKKwkJcmV0dXJuICJHU000NTAiOworCWNhc2UgR1NNX0JBTkRfNzUwOgorCQlyZXR1cm4gIkdTTTc1MCI7CisJY2FzZSBHU01fQkFORF84MTA6CisJCXJldHVybiAiR1NNODEwIjsKKwljYXNlIEdTTV9CQU5EXzg1MDoKKwkJcmV0dXJuICJHU004NTAiOworCWNhc2UgR1NNX0JBTkRfOTAwOgorCQlyZXR1cm4gIkdTTTkwMCI7CisJY2FzZSBHU01fQkFORF8xODAwOgorCQlyZXR1cm4gIkRDUzE4MDAiOworCWNhc2UgR1NNX0JBTkRfMTkwMDoKKwkJcmV0dXJuICJQQ1MxOTAwIjsKKwl9CisJcmV0dXJuICJpbnZhbGlkIjsKK30KKworZW51bSBnc21fYmFuZCBnc21fYmFuZF9wYXJzZShjb25zdCBjaGFyKiBtaHopCit7CisJd2hpbGUgKCptaHogJiYgIWlzZGlnaXQoKm1oeikpCisJCW1oeisrOworCisJaWYgKCptaHogPT0gJ1wwJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHN0cnRvbChtaHosIE5VTEwsIDEwKSkgeworCWNhc2UgNDUwOgorCQlyZXR1cm4gR1NNX0JBTkRfNDUwOworCWNhc2UgNDgwOgorCQlyZXR1cm4gR1NNX0JBTkRfNDgwOworCWNhc2UgNzUwOgorCQlyZXR1cm4gR1NNX0JBTkRfNzUwOworCWNhc2UgODEwOgorCQlyZXR1cm4gR1NNX0JBTkRfODEwOworCWNhc2UgODUwOgorCQlyZXR1cm4gR1NNX0JBTkRfODUwOworCWNhc2UgOTAwOgorCQlyZXR1cm4gR1NNX0JBTkRfOTAwOworCWNhc2UgMTgwMDoKKwkJcmV0dXJuIEdTTV9CQU5EXzE4MDA7CisJY2FzZSAxOTAwOgorCQlyZXR1cm4gR1NNX0JBTkRfMTkwMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKworI2lmZGVmIEhBVkVfRVhFQ0lORk9fSAorI2luY2x1ZGUgPGV4ZWNpbmZvLmg+Cit2b2lkIGdlbmVyYXRlX2JhY2t0cmFjZSgpCit7CisJaW50IGksIG5wdHJzOworCXZvaWQgKmJ1ZmZlclsxMDBdOworCWNoYXIgKipzdHJpbmdzOworCisJbnB0cnMgPSBiYWNrdHJhY2UoYnVmZmVyLCBBUlJBWV9TSVpFKGJ1ZmZlcikpOworCXByaW50ZigiYmFja3RyYWNlKCkgcmV0dXJuZWQgJWQgYWRkcmVzc2VzXG4iLCBucHRycyk7CisKKwlzdHJpbmdzID0gYmFja3RyYWNlX3N5bWJvbHMoYnVmZmVyLCBucHRycyk7CisJaWYgKCFzdHJpbmdzKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAxOyBpIDwgbnB0cnM7IGkrKykKKwkJcHJpbnRmKCIlc1xuIiwgc3RyaW5nc1tpXSk7CisKKwlmcmVlKHN0cmluZ3MpOworfQorI2VuZGlmCisKK2VudW0gZ3NtX2JhbmQgZ3NtX2FyZmNuMmJhbmQodWludDE2X3QgYXJmY24pCit7CisJaWYgKGFyZmNuICYgQVJGQ05fUENTKQorCQlyZXR1cm4gR1NNX0JBTkRfMTkwMDsKKwllbHNlIGlmIChhcmZjbiA8PSAxMjQpCisJCXJldHVybiBHU01fQkFORF85MDA7CisJZWxzZSBpZiAoYXJmY24gPj0gOTU1ICYmIGFyZmNuIDw9IDEwMjMpCisJCXJldHVybiBHU01fQkFORF85MDA7CisJZWxzZSBpZiAoYXJmY24gPj0gMTI4ICYmIGFyZmNuIDw9IDI1MSkKKwkJcmV0dXJuIEdTTV9CQU5EXzg1MDsKKwllbHNlIGlmIChhcmZjbiA+PSA1MTIgJiYgYXJmY24gPD0gODg1KQorCQlyZXR1cm4gR1NNX0JBTkRfMTgwMDsKKwllbHNlIGlmIChhcmZjbiA+PSAyNTkgJiYgYXJmY24gPD0gMjkzKQorCQlyZXR1cm4gR1NNX0JBTkRfNDUwOworCWVsc2UgaWYgKGFyZmNuID49IDMwNiAmJiBhcmZjbiA8PSAzNDApCisJCXJldHVybiBHU01fQkFORF80ODA7CisJZWxzZSBpZiAoYXJmY24gPj0gMzUwICYmIGFyZmNuIDw9IDQyNSkKKwkJcmV0dXJuIEdTTV9CQU5EXzgxMDsKKwllbHNlIGlmIChhcmZjbiA+PSA0MzggJiYgYXJmY24gPD0gNTExKQorCQlyZXR1cm4gR1NNX0JBTkRfNzUwOworCWVsc2UKKwkJcmV0dXJuIEdTTV9CQU5EXzE4MDA7Cit9CisKKy8qIENvbnZlcnQgYW4gQVJGQ04gdG8gdGhlIGZyZXF1ZW5jeSBpbiBNSHogKiAxMCAqLwordWludDE2X3QgZ3NtX2FyZmNuMmZyZXExMCh1aW50MTZfdCBhcmZjbiwgaW50IHVwbGluaykKK3sKKwl1aW50MTZfdCBmcmVxMTBfdWw7CisJdWludDE2X3QgZnJlcTEwX2RsOworCisJaWYgKGFyZmNuICYgQVJGQ05fUENTKSB7CisJCS8qIERDUyAxOTAwICovCisJCWFyZmNuICY9IH5BUkZDTl9QQ1M7CisJCWZyZXExMF91bCA9IDE4NTAyICsgMiAqIChhcmZjbi01MTIpOworCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyA4MDA7CisJfSBlbHNlIGlmIChhcmZjbiA8PSAxMjQpIHsKKwkJLyogUHJpbWFyeSBHU00gKyBBUkZDTiAwIG9mIEUtR1NNICovCisJCWZyZXExMF91bCA9IDg5MDAgKyAyICogYXJmY247CisJCWZyZXExMF9kbCA9IGZyZXExMF91bCArIDQ1MDsKKwl9IGVsc2UgaWYgKGFyZmNuID49IDk1NSAmJiBhcmZjbiA8PSAxMDIzKSB7CisJCS8qIEUtR1NNIGFuZCBSLUdTTSAqLworCQlmcmVxMTBfdWwgPSA4OTAwICsgMiAqIChhcmZjbiAtIDEwMjQpOworCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyA0NTA7CisJfSBlbHNlIGlmIChhcmZjbiA+PSAxMjggJiYgYXJmY24gPD0gMjUxKSB7CisJCS8qIEdTTSA4NTAgKi8KKwkJZnJlcTEwX3VsID0gODI0MiArIDIgKiAoYXJmY24gLSAxMjgpOworCQlmcmVxMTBfZGwgPSBmcmVxMTBfdWwgKyA0NTA7CisJfSBlbHNlIGlmIChhcmZjbiA+PSA1MTIgJiYgYXJmY24gPD0gODg1KSB7CisJCS8qIERDUyAxODAwICovCisJCWZyZXExMF91bCA9IDE3MTAyICsgMiAqIChhcmZjbiAtIDUxMik7CisJCWZyZXExMF9kbCA9IGZyZXExMF91bCArIDk1MDsKKwl9IGVsc2UgaWYgKGFyZmNuID49IDI1OSAmJiBhcmZjbiA8PSAyOTMpIHsKKwkJLyogR1NNIDQ1MCAqLworCQlmcmVxMTBfdWwgPSA0NTA2ICsgMiAqIChhcmZjbiAtIDI1OSk7CisJCWZyZXExMF9kbCA9IGZyZXExMF91bCArIDEwMDsKKwl9IGVsc2UgaWYgKGFyZmNuID49IDMwNiAmJiBhcmZjbiA8PSAzNDApIHsKKwkJLyogR1NNIDQ4MCAqLworCQlmcmVxMTBfdWwgPSA0NzkwICsgMiAqIChhcmZjbiAtIDMwNik7CisJCWZyZXExMF9kbCA9IGZyZXExMF91bCArIDEwMDsKKwl9IGVsc2UgaWYgKGFyZmNuID49IDM1MCAmJiBhcmZjbiA8PSA0MjUpIHsKKwkJLyogR1NNIDgxMCAqLworCQlmcmVxMTBfdWwgPSA4MDYwICsgMiAqIChhcmZjbiAtIDM1MCk7CisJCWZyZXExMF9kbCA9IGZyZXExMF91bCArIDQ1MDsKKwl9IGVsc2UgaWYgKGFyZmNuID49IDQzOCAmJiBhcmZjbiA8PSA1MTEpIHsKKwkJLyogR1NNIDc1MCAqLworCQlmcmVxMTBfdWwgPSA3NDcyICsgMiAqIChhcmZjbiAtIDQzOCk7CisJCWZyZXExMF9kbCA9IGZyZXExMF91bCArIDMwMDsKKwl9IGVsc2UKKwkJcmV0dXJuIDB4ZmZmZjsKKworCWlmICh1cGxpbmspCisJCXJldHVybiBmcmVxMTBfdWw7CisJZWxzZQorCQlyZXR1cm4gZnJlcTEwX2RsOworfQorCit2b2lkIGdzbV9mbjJnc210aW1lKHN0cnVjdCBnc21fdGltZSAqdGltZSwgdWludDMyX3QgZm4pCit7CisJdGltZS0+Zm4gPSBmbjsKKwl0aW1lLT50MSA9IHRpbWUtPmZuIC8gKDI2KjUxKTsKKwl0aW1lLT50MiA9IHRpbWUtPmZuICUgMjY7CisJdGltZS0+dDMgPSB0aW1lLT5mbiAlIDUxOworCXRpbWUtPnRjID0gKHRpbWUtPmZuIC8gNTEpICUgODsKK30KKwordWludDMyX3QgZ3NtX2dzbXRpbWUyZm4oc3RydWN0IGdzbV90aW1lICp0aW1lKQoreworCS8qIFRTIDA1LjAyIENoYXB0ZXIgNC4zLjMgVERNQSBmcmFtZSBudW1iZXIgKi8KKwlyZXR1cm4gKDUxICogKCh0aW1lLT50MyAtIHRpbWUtPnQyICsgMjYpICUgMjYpICsgdGltZS0+dDMgKyAoMjYgKiA1MSAqIHRpbWUtPnQxKSk7Cit9CisKKy8qIFRTIDAzLjAzIENoYXB0ZXIgMi42ICovCitpbnQgZ3Byc190bGxpX3R5cGUodWludDMyX3QgdGxsaSkKK3sKKwlpZiAoKHRsbGkgJiAweGMwMDAwMDAwKSA9PSAweGMwMDAwMDAwKQorCQlyZXR1cm4gVExMSV9MT0NBTDsKKwllbHNlIGlmICgodGxsaSAmIDB4YzAwMDAwMDApID09IDB4ODAwMDAwMDApCisJCXJldHVybiBUTExJX0ZPUkVJR047CisJZWxzZSBpZiAoKHRsbGkgJiAweGY4MDAwMDAwKSA9PSAweDc4MDAwMDAwKQorCQlyZXR1cm4gVExMSV9SQU5ET007CisJZWxzZSBpZiAoKHRsbGkgJiAweGY4MDAwMDAwKSA9PSAweDcwMDAwMDAwKQorCQlyZXR1cm4gVExMSV9BVVhJTElBUlk7CisKKwlyZXR1cm4gVExMSV9SRVNFUlZFRDsKK30KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9sb2dnaW5nLmMgYi9saWJvc21vY29yZS9zcmMvbG9nZ2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MmE2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvbG9nZ2luZy5jCkBAIC0wLDAgKzEsNDE5IEBACisvKiBEZWJ1Z2dpbmcvTG9nZ2luZyBzdXBwb3J0IGNvZGUgKi8KKworLyogKEMpIDIwMDgtMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDggYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICIuLi9jb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9sb2dnaW5nLmg+CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbG9nX2luZm8gKmxvZ19pbmZvOworCitzdGF0aWMgc3RydWN0IGxvZ19jb250ZXh0IGxvZ19jb250ZXh0Oworc3RhdGljIHZvaWQgKnRhbGxfbG9nX2N0eCA9IE5VTEw7CitzdGF0aWMgTExJU1RfSEVBRCh0YXJnZXRfbGlzdCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGxvZ2xldmVsX3N0cnNbXSA9IHsKKwl7IDAsCQkiRVZFUllUSElORyIgfSwKKwl7IExPR0xfREVCVUcsCSJERUJVRyIgfSwKKwl7IExPR0xfSU5GTywJIklORk8iIH0sCisJeyBMT0dMX05PVElDRSwJIk5PVElDRSIgfSwKKwl7IExPR0xfRVJST1IsCSJFUlJPUiIgfSwKKwl7IExPR0xfRkFUQUwsCSJGQVRBTCIgfSwKKwl7IDAsIE5VTEwgfSwKK307CisKK2ludCBsb2dfcGFyc2VfbGV2ZWwoY29uc3QgY2hhciAqbHZsKQoreworCXJldHVybiBnZXRfc3RyaW5nX3ZhbHVlKGxvZ2xldmVsX3N0cnMsIGx2bCk7Cit9CisKK2NvbnN0IGNoYXIgKmxvZ19sZXZlbF9zdHIodW5zaWduZWQgaW50IGx2bCkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhsb2dsZXZlbF9zdHJzLCBsdmwpOworfQorCitpbnQgbG9nX3BhcnNlX2NhdGVnb3J5KGNvbnN0IGNoYXIgKmNhdGVnb3J5KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxvZ19pbmZvLT5udW1fY2F0OyArK2kpIHsKKwkJaWYgKCFzdHJjYXNlY21wKGxvZ19pbmZvLT5jYXRbaV0ubmFtZSsxLCBjYXRlZ29yeSkpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIFBhcnNlIHRoZSBjYXRlZ29yeSBtYXNrLgorICogVGhlIGZvcm1hdCBjYW4gYmUgdGhpczogY2F0ZWdvcnkxOmNhdGVnb3J5MjpjYXRlZ29yeTMKKyAqIG9yIGNhdGVnb3J5MSwyOmNhdGVnb3J5MiwzOi4uLgorICovCit2b2lkIGxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0cnVjdCBsb2dfdGFyZ2V0KiB0YXJnZXQsIGNvbnN0IGNoYXIgKl9tYXNrKQoreworCWludCBpID0gMDsKKwljaGFyICptYXNrID0gc3RyZHVwKF9tYXNrKTsKKwljaGFyICpjYXRlZ29yeV90b2tlbiA9IE5VTEw7CisKKwkvKiBEaXNhYmxlIGV2ZXJ5dGhpbmcgdG8gZW5hYmxlIGl0IGFmdGVyd2FyZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXJnZXQtPmNhdGVnb3JpZXMpOyArK2kpCisJCXRhcmdldC0+Y2F0ZWdvcmllc1tpXS5lbmFibGVkID0gMDsKKworCWNhdGVnb3J5X3Rva2VuID0gc3RydG9rKG1hc2ssICI6Iik7CisJZG8geworCQlmb3IgKGkgPSAwOyBpIDwgbG9nX2luZm8tPm51bV9jYXQ7ICsraSkgeworCQkJY2hhciogY29sb24gPSBzdHJzdHIoY2F0ZWdvcnlfdG9rZW4sICIsIik7CisJCQlpbnQgbGVuZ3RoID0gc3RybGVuKGNhdGVnb3J5X3Rva2VuKTsKKworCQkJaWYgKGNvbG9uKQorCQkJICAgIGxlbmd0aCA9IGNvbG9uIC0gY2F0ZWdvcnlfdG9rZW47CisKKwkJCWlmIChzdHJuY2FzZWNtcChsb2dfaW5mby0+Y2F0W2ldLm5hbWUsIGNhdGVnb3J5X3Rva2VuLAorCQkJCQlsZW5ndGgpID09IDApIHsKKwkJCQlpbnQgbGV2ZWwgPSAwOworCisJCQkJaWYgKGNvbG9uKQorCQkJCQlsZXZlbCA9IGF0b2koY29sb24rMSk7CisKKwkJCQl0YXJnZXQtPmNhdGVnb3JpZXNbaV0uZW5hYmxlZCA9IDE7CisJCQkJdGFyZ2V0LT5jYXRlZ29yaWVzW2ldLmxvZ2xldmVsID0gbGV2ZWw7CisJCQl9CisJCX0KKwl9IHdoaWxlICgoY2F0ZWdvcnlfdG9rZW4gPSBzdHJ0b2soTlVMTCwgIjoiKSkpOworCisJZnJlZShtYXNrKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbG9yKGludCBzdWJzeXMpCit7CisJaWYgKHN1YnN5cyA8IGxvZ19pbmZvLT5udW1fY2F0KQorCQlyZXR1cm4gbG9nX2luZm8tPmNhdFtzdWJzeXNdLmNvbG9yOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9vdXRwdXQoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgdW5zaWduZWQgaW50IHN1YnN5cywKKwkJICAgIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgY29udCwgY29uc3QgY2hhciAqZm9ybWF0LAorCQkgICAgdmFfbGlzdCBhcCkKK3sKKwljaGFyIGNvbFszMF07CisJY2hhciBzdWJbMzBdOworCWNoYXIgdGltWzMwXTsKKwljaGFyIGJ1Zls0MDk2XTsKKwljaGFyIGZpbmFsWzQwOTZdOworCisJLyogcHJlcGFyZSB0aGUgZGF0YSAqLworCWNvbFswXSA9ICdcMCc7CisJc3ViWzBdID0gJ1wwJzsKKwl0aW1bMF0gPSAnXDAnOworCWJ1ZlswXSA9ICdcMCc7CisKKwkvKiBhcmUgd2UgdXNpbmcgY29sb3IgKi8KKwlpZiAodGFyZ2V0LT51c2VfY29sb3IpIHsKKwkJY29uc3QgY2hhciAqYyA9IGNvbG9yKHN1YnN5cyk7CisJCWlmIChjKSB7CisJCQlzbnByaW50Zihjb2wsIHNpemVvZihjb2wpLCAiJXMiLCBjb2xvcihzdWJzeXMpKTsKKwkJCWNvbFtzaXplb2YoY29sKS0xXSA9ICdcMCc7CisJCX0KKwl9CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgYXApOworCWJ1ZltzaXplb2YoYnVmKS0xXSA9ICdcMCc7CisKKwlpZiAoIWNvbnQpIHsKKwkJaWYgKHRhcmdldC0+cHJpbnRfdGltZXN0YW1wKSB7CisJCQljaGFyICp0aW1lc3RyOworCQkJdGltZV90IHRtOworCQkJdG0gPSB0aW1lKE5VTEwpOworCQkJdGltZXN0ciA9IGN0aW1lKCZ0bSk7CisJCQl0aW1lc3RyW3N0cmxlbih0aW1lc3RyKS0xXSA9ICdcMCc7CisJCQlzbnByaW50Zih0aW0sIHNpemVvZih0aW0pLCAiJXMgIiwgdGltZXN0cik7CisJCQl0aW1bc2l6ZW9mKHRpbSktMV0gPSAnXDAnOworCQl9CisJCXNucHJpbnRmKHN1Yiwgc2l6ZW9mKHN1YiksICI8JTQuNHg+ICVzOiVkICIsIHN1YnN5cywgZmlsZSwgbGluZSk7CisJCXN1YltzaXplb2Yoc3ViKS0xXSA9ICdcMCc7CisJfQorCisJc25wcmludGYoZmluYWwsIHNpemVvZihmaW5hbCksICIlcyVzJXMlc1wwMzNbMDttIiwgY29sLCB0aW0sIHN1YiwgYnVmKTsKKwlmaW5hbFtzaXplb2YoZmluYWwpLTFdID0gJ1wwJzsKKwl0YXJnZXQtPm91dHB1dCh0YXJnZXQsIGZpbmFsKTsKK30KKworCitzdGF0aWMgdm9pZCBfbG9ncCh1bnNpZ25lZCBpbnQgc3Vic3lzLCBpbnQgbGV2ZWwsIGNoYXIgKmZpbGUsIGludCBsaW5lLAorCQkgIGludCBjb250LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisJc3RydWN0IGxvZ190YXJnZXQgKnRhcjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhciwgJnRhcmdldF9saXN0LCBlbnRyeSkgeworCQlzdHJ1Y3QgbG9nX2NhdGVnb3J5ICpjYXRlZ29yeTsKKwkJaW50IG91dHB1dCA9IDA7CisKKwkJY2F0ZWdvcnkgPSAmdGFyLT5jYXRlZ29yaWVzW3N1YnN5c107CisJCS8qIHN1YnN5c3RlbSBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgbG9nZ2VkICovCisJCWlmICghY2F0ZWdvcnktPmVuYWJsZWQpCisJCQljb250aW51ZTsKKworCQkvKiBDaGVjayB0aGUgZ2xvYmFsIGxvZyBsZXZlbCAqLworCQlpZiAodGFyLT5sb2dsZXZlbCAhPSAwICYmIGxldmVsIDwgdGFyLT5sb2dsZXZlbCkKKwkJCWNvbnRpbnVlOworCisJCS8qIENoZWNrIHRoZSBjYXRlZ29yeSBsb2cgbGV2ZWwgKi8KKwkJaWYgKHRhci0+bG9nbGV2ZWwgPT0gMCAmJiBjYXRlZ29yeS0+bG9nbGV2ZWwgIT0gMCAmJgorCQkgICAgbGV2ZWwgPCBjYXRlZ29yeS0+bG9nbGV2ZWwpCisJCQljb250aW51ZTsKKworCQkvKiBBcHBseSBmaWx0ZXJzIGhlcmUuLi4gaWYgdGhhdCBiZWNvbWVzIG1lc3N5IHdlIHdpbGwKKwkJICogbmVlZCB0byBwdXQgZmlsdGVycyBpbiBhIGxpc3QgYW5kIGVhY2ggZmlsdGVyIHdpbGwKKwkJICogc2F5IHN0b3AsIGNvbnRpbnVlLCBvdXRwdXQgKi8KKwkJaWYgKCh0YXItPmZpbHRlcl9tYXAgJiBMT0dfRklMVEVSX0FMTCkgIT0gMCkKKwkJCW91dHB1dCA9IDE7CisJCWVsc2UgaWYgKGxvZ19pbmZvLT5maWx0ZXJfZm4pCisJCQlvdXRwdXQgPSBsb2dfaW5mby0+ZmlsdGVyX2ZuKCZsb2dfY29udGV4dCwKKwkJCQkJCSAgICAgICB0YXIpOworCisJCWlmIChvdXRwdXQpIHsKKwkJCS8qIEZJWE1FOiBjb3B5aW5nIHRoZSB2YV9saXN0IGlzIGFuIHVnbHkKKwkJCSAqIHdvcmthcm91bmQgYWdhaW5zdCBhIGJ1ZyBoaWRkZW4gc29tZXdoZXJlIGluCisJCQkgKiBfb3V0cHV0LiAgSWYgd2UgZG8gbm90IGNvcHkgaGVyZSwgdGhlIGZpcnN0CisJCQkgKiBjYWxsIHRvIF9vdXRwdXQoKSB3aWxsIGNvcnJ1cHQgdGhlIHZhX2xpc3QKKwkJCSAqIGNvbnRlbnRzLCBhbmQgYW55IGZ1cnRoZXIgX291dHB1dCgpIGNhbGxzCisJCQkgKiB3aXRoIHRoZSBzYW1lIHZhX2xpc3Qgd2lsbCBzZWdmYXVsdCAqLworCQkJdmFfbGlzdCBicDsKKwkJCXZhX2NvcHkoYnAsIGFwKTsKKwkJCV9vdXRwdXQodGFyLCBzdWJzeXMsIGZpbGUsIGxpbmUsIGNvbnQsIGZvcm1hdCwgYnApOworCQkJdmFfZW5kKGJwKTsKKwkJfQorCX0KK30KKwordm9pZCBsb2dwKHVuc2lnbmVkIGludCBzdWJzeXMsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgY29udCwKKwkgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlfbG9ncChzdWJzeXMsIExPR0xfREVCVUcsIGZpbGUsIGxpbmUsIGNvbnQsIGZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKK3ZvaWQgbG9ncDIodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IGxldmVsLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGNvbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlfbG9ncChzdWJzeXMsIGxldmVsLCBmaWxlLCBsaW5lLCBjb250LCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworfQorCitzdGF0aWMgY2hhciBoZXhkX2J1ZmZbNDA5Nl07CisKK2NoYXIgKmhleGR1bXAoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCBpOworCWNoYXIgKmN1ciA9IGhleGRfYnVmZjsKKworCWhleGRfYnVmZlswXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWludCBsZW5fcmVtYWluID0gc2l6ZW9mKGhleGRfYnVmZikgLSAoY3VyIC0gaGV4ZF9idWZmKTsKKwkJaW50IHJjID0gc25wcmludGYoY3VyLCBsZW5fcmVtYWluLCAiJTAyeCAiLCBidWZbaV0pOworCQlpZiAocmMgPD0gMCkKKwkJCWJyZWFrOworCQljdXIgKz0gcmM7CisJfQorCWhleGRfYnVmZltzaXplb2YoaGV4ZF9idWZmKS0xXSA9IDA7CisJcmV0dXJuIGhleGRfYnVmZjsKK30KKwordm9pZCBsb2dfYWRkX3RhcmdldChzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0KQoreworCWxsaXN0X2FkZF90YWlsKCZ0YXJnZXQtPmVudHJ5LCAmdGFyZ2V0X2xpc3QpOworfQorCit2b2lkIGxvZ19kZWxfdGFyZ2V0KHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQpCit7CisJbGxpc3RfZGVsKCZ0YXJnZXQtPmVudHJ5KTsKK30KKwordm9pZCBsb2dfcmVzZXRfY29udGV4dCh2b2lkKQoreworCW1lbXNldCgmbG9nX2NvbnRleHQsIDAsIHNpemVvZihsb2dfY29udGV4dCkpOworfQorCitpbnQgbG9nX3NldF9jb250ZXh0KHVpbnQ4X3QgY3R4X25yLCB2b2lkICp2YWx1ZSkKK3sKKwlpZiAoY3R4X25yID4gTE9HX01BWF9DVFgpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9nX2NvbnRleHQuY3R4W2N0eF9ucl0gPSB2YWx1ZTsKKworCXJldHVybiAwOworfQorCit2b2lkIGxvZ19zZXRfYWxsX2ZpbHRlcihzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBpbnQgYWxsKQoreworCWlmIChhbGwpCisJCXRhcmdldC0+ZmlsdGVyX21hcCB8PSBMT0dfRklMVEVSX0FMTDsKKwllbHNlCisJCXRhcmdldC0+ZmlsdGVyX21hcCAmPSB+TE9HX0ZJTFRFUl9BTEw7Cit9CisKK3ZvaWQgbG9nX3NldF91c2VfY29sb3Ioc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgaW50IHVzZV9jb2xvcikKK3sKKwl0YXJnZXQtPnVzZV9jb2xvciA9IHVzZV9jb2xvcjsKK30KKwordm9pZCBsb2dfc2V0X3ByaW50X3RpbWVzdGFtcChzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBpbnQgcHJpbnRfdGltZXN0YW1wKQoreworCXRhcmdldC0+cHJpbnRfdGltZXN0YW1wID0gcHJpbnRfdGltZXN0YW1wOworfQorCit2b2lkIGxvZ19zZXRfbG9nX2xldmVsKHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsIGludCBsb2dfbGV2ZWwpCit7CisJdGFyZ2V0LT5sb2dsZXZlbCA9IGxvZ19sZXZlbDsKK30KKwordm9pZCBsb2dfc2V0X2NhdGVnb3J5X2ZpbHRlcihzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBpbnQgY2F0ZWdvcnksCisJCQkgICAgICAgaW50IGVuYWJsZSwgaW50IGxldmVsKQoreworCWlmIChjYXRlZ29yeSA+PSBsb2dfaW5mby0+bnVtX2NhdCkKKwkJcmV0dXJuOworCXRhcmdldC0+Y2F0ZWdvcmllc1tjYXRlZ29yeV0uZW5hYmxlZCA9ICEhZW5hYmxlOworCXRhcmdldC0+Y2F0ZWdvcmllc1tjYXRlZ29yeV0ubG9nbGV2ZWwgPSBsZXZlbDsKK30KKworLyogc2luY2UgQzg5L0M5OSBzYXlzIHN0ZGVyciBpcyBhIG1hY3JvLCB3ZSBjYW4gc2FmZWx5IGRvIHRoaXMhICovCisjaWZkZWYgc3RkZXJyCitzdGF0aWMgdm9pZCBfc3RkZXJyX291dHB1dChzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICpsb2cpCit7CisJZnByaW50Zih0YXJnZXQtPnRndF9zdGRvdXQub3V0LCAiJXMiLCBsb2cpOworCWZmbHVzaCh0YXJnZXQtPnRndF9zdGRvdXQub3V0KTsKK30KKyNlbmRpZgorCitzdHJ1Y3QgbG9nX3RhcmdldCAqbG9nX3RhcmdldF9jcmVhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0OworCXVuc2lnbmVkIGludCBpOworCisJdGFyZ2V0ID0gdGFsbG9jX3plcm8odGFsbF9sb2dfY3R4LCBzdHJ1Y3QgbG9nX3RhcmdldCk7CisJaWYgKCF0YXJnZXQpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MTElTVF9IRUFEKCZ0YXJnZXQtPmVudHJ5KTsKKworCS8qIGluaXRpYWxpemUgdGhlIHBlci1jYXRlZ29yeSBlbmFibGVkL2xvZ2xldmVsIGZyb20gZGVmYXVsdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbG9nX2luZm8tPm51bV9jYXQ7IGkrKykgeworCQlzdHJ1Y3QgbG9nX2NhdGVnb3J5ICpjYXQgPSAmdGFyZ2V0LT5jYXRlZ29yaWVzW2ldOworCQljYXQtPmVuYWJsZWQgPSBsb2dfaW5mby0+Y2F0W2ldLmVuYWJsZWQ7CisJCWNhdC0+bG9nbGV2ZWwgPSBsb2dfaW5mby0+Y2F0W2ldLmxvZ2xldmVsOworCX0KKworCS8qIGdsb2JhbCBzZXR0aW5ncyAqLworCXRhcmdldC0+dXNlX2NvbG9yID0gMTsKKwl0YXJnZXQtPnByaW50X3RpbWVzdGFtcCA9IDA7CisKKwkvKiBnbG9iYWwgbG9nIGxldmVsICovCisJdGFyZ2V0LT5sb2dsZXZlbCA9IDA7CisJcmV0dXJuIHRhcmdldDsKK30KKworc3RydWN0IGxvZ190YXJnZXQgKmxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycih2b2lkKQoreworLyogc2luY2UgQzg5L0M5OSBzYXlzIHN0ZGVyciBpcyBhIG1hY3JvLCB3ZSBjYW4gc2FmZWx5IGRvIHRoaXMhICovCisjaWZkZWYgc3RkZXJyCisJc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldDsKKworCXRhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlKCk7CisJaWYgKCF0YXJnZXQpCisJCXJldHVybiBOVUxMOworCisJdGFyZ2V0LT50Z3Rfc3Rkb3V0Lm91dCA9IHN0ZGVycjsKKwl0YXJnZXQtPm91dHB1dCA9IF9zdGRlcnJfb3V0cHV0OworCXJldHVybiB0YXJnZXQ7CisjZWxzZQorCXJldHVybiBOVUxMOworI2VuZGlmIC8qIHN0ZGVyciAqLworfQorCitjb25zdCBjaGFyICpsb2dfdnR5X2xldmVsX3N0cmluZyhzdHJ1Y3QgbG9nX2luZm8gKmluZm8pCit7CisJY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyAqdnM7CisJdW5zaWduZWQgaW50IGxlbiA9IDM7IC8qICgpXDAgKi8KKwljaGFyICpzdHI7CisKKwlmb3IgKHZzID0gbG9nbGV2ZWxfc3RyczsgdnMtPnZhbHVlIHx8IHZzLT5zdHI7IHZzKyspCisJCWxlbiArPSBzdHJsZW4odnMtPnN0cikgKyAxOworCisJc3RyID0gdGFsbG9jX3plcm9fc2l6ZShOVUxMLCBsZW4pOworCWlmICghc3RyKQorCQlyZXR1cm4gTlVMTDsKKworCXN0clswXSA9ICcoJzsKKwlmb3IgKHZzID0gbG9nbGV2ZWxfc3RyczsgdnMtPnZhbHVlIHx8IHZzLT5zdHI7IHZzKyspIHsKKwkJc3RyY2F0KHN0ciwgdnMtPnN0cik7CisJCXN0cmNhdChzdHIsICJ8Iik7CisJfQorCXN0cltzdHJsZW4oc3RyKS0xXSA9ICcpJzsKKworCXJldHVybiBzdHI7Cit9CisKK2NvbnN0IGNoYXIgKmxvZ192dHlfY2F0ZWdvcnlfc3RyaW5nKHN0cnVjdCBsb2dfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gMzsJLyogIigpXDAiICovCisJdW5zaWduZWQgaW50IGk7CisJY2hhciAqc3RyOworCisJZm9yIChpID0gMDsgaSA8IGluZm8tPm51bV9jYXQ7IGkrKykKKwkJbGVuICs9IHN0cmxlbihpbmZvLT5jYXRbaV0ubmFtZSkgKyAxOworCisJc3RyID0gdGFsbG9jX3plcm9fc2l6ZShOVUxMLCBsZW4pOworCWlmICghc3RyKQorCQlyZXR1cm4gTlVMTDsKKworCXN0clswXSA9ICcoJzsKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnVtX2NhdDsgaSsrKSB7CisJCXN0cmNhdChzdHIsIGluZm8tPmNhdFtpXS5uYW1lKzEpOworCQlzdHJjYXQoc3RyLCAifCIpOworCX0KKwlzdHJbc3RybGVuKHN0ciktMV0gPSAnKSc7CisKKwlyZXR1cm4gc3RyOworfQorCit2b2lkIGxvZ19pbml0KGNvbnN0IHN0cnVjdCBsb2dfaW5mbyAqY2F0KQoreworCXRhbGxfbG9nX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAibG9nZ2luZyIpOworCWxvZ19pbmZvID0gY2F0OworfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL21zZ2IuYyBiL2xpYm9zbW9jb3JlL3NyYy9tc2diLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwZTJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL3NyYy9tc2diLmMKQEAgLTAsMCArMSw5MCBAQAorLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKy8vI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKy8vI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKwordm9pZCAqdGFsbF9tc2diX2N0eDsKKworc3RydWN0IG1zZ2IgKm1zZ2JfYWxsb2ModWludDE2X3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCisJbXNnID0gX3RhbGxvY196ZXJvKHRhbGxfbXNnYl9jdHgsIHNpemVvZigqbXNnKSArIHNpemUsIG5hbWUpOworCisJaWYgKCFtc2cpIHsKKwkJLy9MT0dQKERSU0wsIExPR0xfRkFUQUwsICJ1bmFibGUgdG8gYWxsb2NhdGUgbXNnYlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1zZy0+ZGF0YV9sZW4gPSBzaXplOworCW1zZy0+bGVuID0gMDsKKwltc2ctPmRhdGEgPSBtc2ctPl9kYXRhOworCW1zZy0+aGVhZCA9IG1zZy0+X2RhdGE7CisJbXNnLT50YWlsID0gbXNnLT5fZGF0YTsKKworCXJldHVybiBtc2c7Cit9CisKK3ZvaWQgbXNnYl9mcmVlKHN0cnVjdCBtc2diICptKQoreworCXRhbGxvY19mcmVlKG0pOworfQorCit2b2lkIG1zZ2JfZW5xdWV1ZShzdHJ1Y3QgbGxpc3RfaGVhZCAqcXVldWUsIHN0cnVjdCBtc2diICptc2cpCit7CisJbGxpc3RfYWRkX3RhaWwoJm1zZy0+bGlzdCwgcXVldWUpOworfQorCitzdHJ1Y3QgbXNnYiAqbXNnYl9kZXF1ZXVlKHN0cnVjdCBsbGlzdF9oZWFkICpxdWV1ZSkKK3sKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqbGg7CisKKwlpZiAobGxpc3RfZW1wdHkocXVldWUpKQorCQlyZXR1cm4gTlVMTDsKKworCWxoID0gcXVldWUtPm5leHQ7CisJbGxpc3RfZGVsKGxoKTsKKwkKKwlyZXR1cm4gbGxpc3RfZW50cnkobGgsIHN0cnVjdCBtc2diLCBsaXN0KTsKK30KKwordm9pZCBtc2diX3Jlc2V0KHN0cnVjdCBtc2diICptc2cpCit7CisJbXNnLT5sZW4gPSAwOworCW1zZy0+ZGF0YSA9IG1zZy0+X2RhdGE7CisJbXNnLT5oZWFkID0gbXNnLT5fZGF0YTsKKwltc2ctPnRhaWwgPSBtc2ctPl9kYXRhOworCisJbXNnLT50cnggPSBOVUxMOworCW1zZy0+bGNoYW4gPSBOVUxMOworCW1zZy0+bDJoID0gTlVMTDsKKwltc2ctPmwzaCA9IE5VTEw7CisJbXNnLT5sNGggPSBOVUxMOworCisJbWVtc2V0KCZtc2ctPmNiLCAwLCBzaXplb2YobXNnLT5jYikpOworfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3JhdGVfY3RyLmMgYi9saWJvc21vY29yZS9zcmMvcmF0ZV9jdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDhjNzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL3JhdGVfY3RyLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qIHV0aWxpdHkgcm91dGluZXMgZm9yIGtlZXBpbmcgY29udGVycyBhYm91dCBldmVudHMgYW5kIHRoZSBldmVudCByYXRlcyAqLworCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorCitzdGF0aWMgTExJU1RfSEVBRChyYXRlX2N0cl9ncm91cHMpOworCitzdGF0aWMgdm9pZCAqdGFsbF9yYXRlX2N0cl9jdHg7CisKK3N0cnVjdCByYXRlX2N0cl9ncm91cCAqcmF0ZV9jdHJfZ3JvdXBfYWxsb2Modm9pZCAqY3R4LAorCQkJCQkgICAgY29uc3Qgc3RydWN0IHJhdGVfY3RyX2dyb3VwX2Rlc2MgKmRlc2MsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgaWR4KQoreworCXVuc2lnbmVkIGludCBzaXplOworCXN0cnVjdCByYXRlX2N0cl9ncm91cCAqZ3JvdXA7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCByYXRlX2N0cl9ncm91cCkgKworCQkJZGVzYy0+bnVtX2N0ciAqIHNpemVvZihzdHJ1Y3QgcmF0ZV9jdHIpOworCisJaWYgKCFjdHgpCisJCWN0eCA9IHRhbGxfcmF0ZV9jdHJfY3R4OworCisJZ3JvdXAgPSB0YWxsb2NfemVyb19zaXplKGN0eCwgc2l6ZSk7CisJaWYgKCFncm91cCkKKwkJcmV0dXJuIE5VTEw7CisKKwlncm91cC0+ZGVzYyA9IGRlc2M7CisJZ3JvdXAtPmlkeCA9IGlkeDsKKworCWxsaXN0X2FkZCgmZ3JvdXAtPmxpc3QsICZyYXRlX2N0cl9ncm91cHMpOworCisJcmV0dXJuIGdyb3VwOworfQorCit2b2lkIHJhdGVfY3RyX2dyb3VwX2ZyZWUoc3RydWN0IHJhdGVfY3RyX2dyb3VwICpncnApCit7CisJbGxpc3RfZGVsKCZncnAtPmxpc3QpOworCXRhbGxvY19mcmVlKGdycCk7Cit9CisKK3ZvaWQgcmF0ZV9jdHJfYWRkKHN0cnVjdCByYXRlX2N0ciAqY3RyLCBpbnQgaW5jKQoreworCWN0ci0+Y3VycmVudCArPSBpbmM7Cit9CisKK3N0YXRpYyB2b2lkIGludGVydmFsX2V4cGlyZWQoc3RydWN0IHJhdGVfY3RyICpjdHIsIGVudW0gcmF0ZV9jdHJfaW50diBpbnR2KQoreworCS8qIGNhbGN1bGF0ZSByYXRlIG92ZXIgbGFzdCBpbnRlcnZhbCAqLworCWN0ci0+aW50dltpbnR2XS5yYXRlID0gY3RyLT5jdXJyZW50IC0gY3RyLT5pbnR2W2ludHZdLmxhc3Q7CisJLyogc2F2ZSBjdXJyZW50IGNvdW50ZXIgZm9yIG5leHQgaW50ZXJ2YWwgKi8KKwljdHItPmludHZbaW50dl0ubGFzdCA9IGN0ci0+Y3VycmVudDsKK30KKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHJhdGVfY3RyX3RpbWVyOworc3RhdGljIHVpbnQ2NF90IHRpbWVyX3RpY2tzOworCisvKiBUaGUgb25lLXNlY29uZCBpbnRlcnZhbCBoYXMgZXhwaXJlZCAqLworc3RhdGljIHZvaWQgcmF0ZV9jdHJfZ3JvdXBfaW50dihzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXAgKmdycCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBncnAtPmRlc2MtPm51bV9jdHI7IGkrKykgeworCQlzdHJ1Y3QgcmF0ZV9jdHIgKmN0ciA9ICZncnAtPmN0cltpXTsKKworCQlpbnRlcnZhbF9leHBpcmVkKGN0ciwgUkFURV9DVFJfSU5UVl9TRUMpOworCQlpZiAoKHRpbWVyX3RpY2tzICUgNjApID09IDApCisJCQlpbnRlcnZhbF9leHBpcmVkKGN0ciwgUkFURV9DVFJfSU5UVl9NSU4pOworCQlpZiAoKHRpbWVyX3RpY2tzICUgKDYwKjYwKSkgPT0gMCkKKwkJCWludGVydmFsX2V4cGlyZWQoY3RyLCBSQVRFX0NUUl9JTlRWX0hPVVIpOworCQlpZiAoKHRpbWVyX3RpY2tzICUgKDI0KjYwKjYwKSkgPT0gMCkKKwkJCWludGVydmFsX2V4cGlyZWQoY3RyLCBSQVRFX0NUUl9JTlRWX0RBWSk7CisJfQorfQorCitzdGF0aWMgdm9pZCByYXRlX2N0cl90aW1lcl9jYih2b2lkICpkYXRhKQoreworCXN0cnVjdCByYXRlX2N0cl9ncm91cCAqY3RyZzsKKworCS8qIEluY3JlbWVudCBudW1iZXIgb2YgdGlja3MgYmVmb3JlIHdlIGNhbGN1bGF0ZSBpbnRlcnZhbHMsCisJICogYXMgYSBjb3VudGVyIHZhbHVlIG9mIDAgd291bGQgYWxyZWFkeSB3cmFwIGFsbCBjb3VudGVycyAqLworCXRpbWVyX3RpY2tzKys7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjdHJnLCAmcmF0ZV9jdHJfZ3JvdXBzLCBsaXN0KQorCQlyYXRlX2N0cl9ncm91cF9pbnR2KGN0cmcpOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZyYXRlX2N0cl90aW1lciwgMSwgMCk7Cit9CisKK2ludCByYXRlX2N0cl9pbml0KHZvaWQgKnRhbGxfY3R4KQoreworCXRhbGxfcmF0ZV9jdHJfY3R4ID0gdGFsbF9jdHg7CisJcmF0ZV9jdHJfdGltZXIuY2IgPSByYXRlX2N0cl90aW1lcl9jYjsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnJhdGVfY3RyX3RpbWVyLCAxLCAwKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3JzbC5jIGIvbGlib3Ntb2NvcmUvc3JjL3JzbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDJkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvcnNsLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDguNTggdmVyc2lvbiA4LjYuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA1OTYgVjguNi4wICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yc2wuaD4KKworI2RlZmluZSBSU0xfQUxMT0NfU0laRQkJMjAwCisjZGVmaW5lIFJTTF9BTExPQ19IRUFEUk9PTQk1NgorCit2b2lkIHJzbF9pbml0X3JsbF9oZHIoc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKmRoLCB1aW50OF90IG1zZ190eXBlKQoreworCWRoLT5jLm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX1JMTDsKKwlkaC0+Yy5tc2dfdHlwZSA9IG1zZ190eXBlOworCWRoLT5pZV9jaGFuID0gUlNMX0lFX0NIQU5fTlI7CisJZGgtPmllX2xpbmtfaWQgPSBSU0xfSUVfTElOS19JREVOVDsKK30KKworY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIHJzbF9hdHRfdGx2ZGVmID0geworCS5kZWYgPSB7CisJCVtSU0xfSUVfQ0hBTl9OUl0JCT0geyBUTFZfVFlQRV9UViB9LAorCQlbUlNMX0lFX0xJTktfSURFTlRdCQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW1JTTF9JRV9BQ1RfVFlQRV0JCT0geyBUTFZfVFlQRV9UViB9LAorCQlbUlNMX0lFX0JTX1BPV0VSXQkJPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtSU0xfSUVfQ0hBTl9JREVOVF0JCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW1JTTF9JRV9DSEFOX01PREVdCQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtSU0xfSUVfRU5DUl9JTkZPXQkJPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbUlNMX0lFX0ZSQU1FX05VTUJFUl0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbUlNMX0lFX0hBTkRPX1JFRl0JCT0geyBUTFZfVFlQRV9UViB9LAorCQlbUlNMX0lFX0wxX0lORk9dCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW1JTTF9JRV9MM19JTkZPXQkJPSB7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtSU0xfSUVfTVNfSURFTlRJVFldCQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtSU0xfSUVfTVNfUE9XRVJdCQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW1JTTF9JRV9QQUdJTkdfR1JPVVBdCQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW1JTTF9JRV9QQUdJTkdfTE9BRF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbUlNMX0lFX1BZSFNfQ09OVEVYVF0JCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW1JTTF9JRV9BQ0NFU1NfREVMQVldCQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW1JTTF9JRV9SQUNIX0xPQURdCQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtSU0xfSUVfUkVRX1JFRkVSRU5DRV0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorCQlbUlNMX0lFX1JFTEVBU0VfTU9ERV0JCT0geyBUTFZfVFlQRV9UViB9LAorCQlbUlNMX0lFX1JFU09VUkNFX0lORk9dCQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtSU0xfSUVfUkxNX0NBVVNFXQkJPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbUlNMX0lFX1NUQVJUTkdfVElNRV0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbUlNMX0lFX1RJTUlOR19BRFZBTkNFXQkJPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtSU0xfSUVfVVBMSU5LX01FQVNdCQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtSU0xfSUVfQ0FVU0VdCQkJPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbUlNMX0lFX01FQVNfUkVTX05SXQkJPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtSU0xfSUVfTVNHX0lEXQkJCT0geyBUTFZfVFlQRV9UViB9LAorCQlbUlNMX0lFX1NZU0lORk9fVFlQRV0JCT0geyBUTFZfVFlQRV9UViB9LAorCQlbUlNMX0lFX01TX1BPV0VSX1BBUkFNXQkJPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbUlNMX0lFX0JTX1BPV0VSX1BBUkFNXQkJPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbUlNMX0lFX1BSRVBST0NfUEFSQU1dCQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtSU0xfSUVfUFJFUFJPQ19NRUFTXQkJPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbUlNMX0lFX0lNTV9BU1NfSU5GT10JCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW1JTTF9JRV9TTVNDQl9JTkZPXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyMyB9LAorCQlbUlNMX0lFX01TX1RJTUlOR19PRkZTRVRdCT0geyBUTFZfVFlQRV9UViB9LAorCQlbUlNMX0lFX0VSUl9NU0ddCQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtSU0xfSUVfRlVMTF9CQ0NIX0lORk9dCQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtSU0xfSUVfQ0hBTl9ORUVERURdCQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW1JTTF9JRV9DQl9DTURfVFlQRV0JCT0geyBUTFZfVFlQRV9UViB9LAorCQlbUlNMX0lFX1NNU0NCX01TR10JCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW1JTTF9JRV9GVUxMX0lNTV9BU1NfSU5GT10JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbUlNMX0lFX1NBQ0NIX0lORk9dCQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtSU0xfSUVfQ0JDSF9MT0FEX0lORk9dCQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW1JTTF9JRV9TTVNDQl9DSEFOX0lORElDQVRPUl0JPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtSU0xfSUVfR1JPVVBfQ0FMTF9SRUZdCQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtSU0xfSUVfQ0hBTl9ERVNDXQkJPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbUlNMX0lFX05DSF9EUlhfSU5GT10JCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW1JTTF9JRV9DTURfSU5ESUNBVE9SXQkJPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbUlNMX0lFX0VNTFBQX1BSSU9dCQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW1JTTF9JRV9VSUNdCQkJPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbUlNMX0lFX01BSU5fQ0hBTl9SRUZdCQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW1JTTF9JRV9NUl9DT05GSUddCQk9IHsgVExWX1RZUEVfVExWIH0sCisJCVtSU0xfSUVfTVJfQ09OVFJPTF0JCT0geyBUTFZfVFlQRV9UViB9LAorCQlbUlNMX0lFX1NVUF9DT0RFQ19UWVBFU10JPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbUlNMX0lFX0NPREVDX0NPTkZJR10JCT0geyBUTFZfVFlQRV9UTFYgfSwKKwkJW1JTTF9JRV9SVERdCQkJPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtSU0xfSUVfVEZPX1NUQVRVU10JCT0geyBUTFZfVFlQRV9UViB9LAorCQlbUlNMX0lFX0xMUF9BUERVXQkJPSB7IFRMVl9UWVBFX1RMViB9LAorCQlbUlNMX0lFX1NJRU1FTlNfTVJQQ0ldCQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW1JTTF9JRV9JUEFDX1BST1hZX1VEUF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbUlNMX0lFX0lQQUNfQlNDTVBMX1RPVVRdCT0geyBUTFZfVFlQRV9UViB9LAorCQlbUlNMX0lFX0lQQUNfUkVNT1RFX0lQXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisJCVtSU0xfSUVfSVBBQ19SRU1PVEVfUE9SVF0JPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRF0JPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtSU0xfSUVfSVBBQ19MT0NBTF9QT1JUXQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW1JTTF9JRV9JUEFDX1NQRUVDSF9NT0RFXQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW1JTTF9JRV9JUEFDX0xPQ0FMX0lQXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisJCVtSU0xfSUVfSVBBQ19DT05OX0lEXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtSU0xfSUVfSVBBQ19SVFBfQ1NEX0ZNVF0JPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtSU0xfSUVfSVBBQ19SVFBfSklUX0JVRl0JPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtSU0xfSUVfSVBBQ19SVFBfQ09NUFJdCQk9IHsgVExWX1RZUEVfVFYgfSwKKwkJW1JTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMl0JPSB7IFRMVl9UWVBFX1RWIH0sCisJCVtSU0xfSUVfSVBBQ19SVFBfTVBMRVhdCQk9IHsgVExWX1RZUEVfRklYRUQsIDggfSwKKwkJW1JTTF9JRV9JUEFDX1JUUF9NUExFWF9JRF0JPSB7IFRMVl9UWVBFX1RWIH0sCisJfSwKK307CisKKy8qIGVuY29kZSBjaGFubmVsIG51bWJlciBhcyBwZXIgU2VjdGlvbiA5LjMuMSAqLwordWludDhfdCByc2xfZW5jX2NoYW5fbnIodWludDhfdCB0eXBlLCB1aW50OF90IHN1YmNoLCB1aW50OF90IHRpbWVzbG90KQoreworCXVpbnQ4X3QgcmV0OworCisJcmV0ID0gKHRpbWVzbG90ICYgMHgwNykgfCB0eXBlOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSU0xfQ0hBTl9MbV9BQ0NIczoKKwkJc3ViY2ggJj0gMHgwMTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfQ0hBTl9TRENDSDRfQUNDSDoKKwkJc3ViY2ggJj0gMHgwMzsKKwkJYnJlYWs7CisJY2FzZSBSU0xfQ0hBTl9TRENDSDhfQUNDSDoKKwkJc3ViY2ggJj0gMHgwNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogbm8gc3ViY2hhbm5lbHMgYWxsb3dlZCAqLworCQlzdWJjaCA9IDB4MDA7CisJCWJyZWFrOworCX0KKwlyZXQgfD0gKHN1YmNoIDw8IDMpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHJzbF9kZWNfY2hhbl9ucih1aW50OF90IGNoYW5fbnIsIHVpbnQ4X3QgKnR5cGUsIHVpbnQ4X3QgKnN1YmNoLCB1aW50OF90ICp0aW1lc2xvdCkKK3sKKwkqdGltZXNsb3QgPSBjaGFuX25yICYgMHg3OworCisJaWYgKChjaGFuX25yICYgMHhmOCkgPT0gUlNMX0NIQU5fQm1fQUNDSHMpIHsKKwkJKnR5cGUgPSBSU0xfQ0hBTl9CbV9BQ0NIczsKKwkJKnN1YmNoID0gMDsKKwl9IGVsc2UgaWYgKChjaGFuX25yICYgMHhmMCkgPT0gUlNMX0NIQU5fTG1fQUNDSHMpIHsKKwkJKnR5cGUgPSBSU0xfQ0hBTl9MbV9BQ0NIczsKKwkJKnN1YmNoID0gKGNoYW5fbnIgPj4gMykgJiAweDE7CisJfSBlbHNlIGlmICgoY2hhbl9uciAmIDB4ZTApID09IFJTTF9DSEFOX1NEQ0NINF9BQ0NIKSB7CisJCSp0eXBlID0gUlNMX0NIQU5fU0RDQ0g0X0FDQ0g7CisJCSpzdWJjaCA9IChjaGFuX25yID4+IDMpICYgMHgzOworCX0gZWxzZSBpZiAoKGNoYW5fbnIgJiAweGMwKSA9PSBSU0xfQ0hBTl9TRENDSDhfQUNDSCkgeworCQkqdHlwZSA9IFJTTF9DSEFOX1NEQ0NIOF9BQ0NIOworCQkqc3ViY2ggPSAoY2hhbl9uciA+PiAzKSAmIDB4NzsKKwl9IGVsc2UgaWYgKChjaGFuX25yICYgMHhmOCkgPT0gUlNMX0NIQU5fQkNDSCkgeworCQkqdHlwZSA9IFJTTF9DSEFOX0JDQ0g7CisJCSpzdWJjaCA9IDA7CisJfSBlbHNlIGlmICgoY2hhbl9uciAmIDB4ZjgpID09IFJTTF9DSEFOX1JBQ0gpIHsKKwkJKnR5cGUgPSBSU0xfQ0hBTl9SQUNIOworCQkqc3ViY2ggPSAwOworCX0gZWxzZSBpZiAoKGNoYW5fbnIgJiAweGY4KSA9PSBSU0xfQ0hBTl9QQ0hfQUdDSCkgeworCQkqdHlwZSA9IFJTTF9DSEFOX1BDSF9BR0NIOworCQkqc3ViY2ggPSAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyByc2xfZXJyX3ZhbHNbXSA9IHsKKwl7IFJTTF9FUlJfUkFESU9fSUZfRkFJTCwJIlJhZGlvIEludGVyZmFjZSBGYWlsdXJlIiB9LAorCXsgUlNMX0VSUl9SQURJT19MSU5LX0ZBSUwsCSJSYWRpbyBMaW5rIEZhaWx1cmUiIH0sCisJeyBSU0xfRVJSX0hBTkRPVkVSX0FDQ19GQUlMLAkiSGFuZG92ZXIgQWNjZXNzIEZhaWx1cmUiIH0sCisJeyBSU0xfRVJSX1RBTEtFUl9BQ0NfRkFJTCwJIlRhbGtlciBBY2Nlc3MgRmFpbHVyZSIgfSwKKwl7IFJTTF9FUlJfT01fSU5URVJWRU5USU9OLAkiTyZNIEludGVydmVudGlvbiIgfSwKKwl7IFJTTF9FUlJfTk9STUFMX1VOU1BFQywJIk5vcm1hbCBldmVudCwgdW5zcGVjaWZpZWQiIH0sCisJeyBSU0xfRVJSX1RfTVNSRlBDSV9FWFAsCSJTaWVtZW5zOiBUX01TUkZQQ0kgRXhwaXJlZCIgfSwKKwl7IFJTTF9FUlJfRVFVSVBNRU5UX0ZBSUwsCSJFcXVpcG1lbnQgRmFpbHVyZSIgfSwKKwl7IFJTTF9FUlJfUlJfVU5BVkFJTCwJCSJSYWRpbyBSZXNvdXJjZSBub3QgYXZhaWxhYmxlIiB9LAorCXsgUlNMX0VSUl9URVJSX0NIX0ZBSUwsCQkiVGVycmVzdHJpYWwgQ2hhbm5lbCBGYWlsdXJlIiB9LAorCXsgUlNMX0VSUl9DQ0NIX09WRVJMT0FELAkiQ0NDSCBPdmVybG9hZCIgfSwKKwl7IFJTTF9FUlJfQUNDSF9PVkVSTE9BRCwJIkFDQ0ggT3ZlcmxvYWQiIH0sCisJeyBSU0xfRVJSX1BST0NFU1NPUl9PVkVSTE9BRCwJIlByb2Nlc3NvciBPdmVybG9hZCIgfSwKKwl7IFJTTF9FUlJfUkVTX1VOQVZBSUwsCQkiUmVzb3VyY2Ugbm90IGF2YWlsYWJsZSwgdW5zcGVjaWZpZWQiIH0sCisJeyBSU0xfRVJSX1RSQU5TQ19VTkFWQUlMLAkiVHJhbnNjb2Rpbmcgbm90IGF2YWlsYWJsZSIgfSwKKwl7IFJTTF9FUlJfU0VSVl9PUFRfVU5BVkFJTCwJIlNlcnZpY2Ugb3IgT3B0aW9uIG5vdCBhdmFpbGFibGUiIH0sCisJeyBSU0xfRVJSX0VOQ1JfVU5JTVBMLAkJIkVuY3J5cHRpb24gYWxnb3JpdGhtIG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IFJTTF9FUlJfU0VSVl9PUFRfVU5JTVBMLAkiU2VydmljZSBvciBPcHRpb24gbm90IGltcGxlbWVudGVkIiB9LAorCXsgUlNMX0VSUl9SQ0hfQUxSX0FDVFZfQUxMT0MsCSJSYWRpbyBjaGFubmVsIGFscmVhZHkgYWN0aXZhdGVkIiB9LAorCXsgUlNMX0VSUl9JTlZBTElEX01FU1NBR0UsCSJJbnZhbGlkIE1lc3NhZ2UsIHVuc3BlY2lmaWVkIiB9LAorCXsgUlNMX0VSUl9NU0dfRElTQ1IsCQkiTWVzc2FnZSBEaXNjcmltaW5hdG9yIEVycm9yIiB9LAorCXsgUlNMX0VSUl9NU0dfVFlQRSwJCSJNZXNzYWdlIFR5cGUgRXJyb3IiIH0sCisJeyBSU0xfRVJSX01TR19TRVEsCQkiTWVzc2FnZSBTZXF1ZW5jZSBFcnJvciIgfSwKKwl7IFJTTF9FUlJfSUVfRVJST1IsCQkiR2VuZXJhbCBJRSBlcnJvciIgfSwKKwl7IFJTTF9FUlJfTUFORF9JRV9FUlJPUiwJIk1hbmRhdG9yeSBJRSBlcnJvciIgfSwKKwl7IFJTTF9FUlJfT1BUX0lFX0VSUk9SLAkJIk9wdGlvbmFsIElFIGVycm9yIiB9LAorCXsgUlNMX0VSUl9JRV9OT05FWElTVCwJCSJJRSBub24tZXhpc3RlbnQiIH0sCisJeyBSU0xfRVJSX0lFX0xFTkdUSCwJCSJJRSBsZW5ndGggZXJyb3IiIH0sCisJeyBSU0xfRVJSX0lFX0NPTlRFTlQsCQkiSUUgY29udGVudCBlcnJvciIgfSwKKwl7IFJTTF9FUlJfUFJPVE8sCQkiUHJvdG9jb2wgZXJyb3IsIHVuc3BlY2lmaWVkIiB9LAorCXsgUlNMX0VSUl9JTlRFUldPUktJTkcsCQkiSW50ZXJ3b3JraW5nIGVycm9yLCB1bnNwZWNpZmllZCIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqcnNsX2Vycl9uYW1lKHVpbnQ4X3QgZXJyKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKHJzbF9lcnJfdmFscywgZXJyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgcnNsX3JsbV9jYXVzZV9zdHJzW10gPSB7CisJeyBSTExfQ0FVU0VfVDIwMF9FWFBJUkVELAkiVGltZXIgVDIwMCBleHBpcmVkIChOMjAwKzEpIHRpbWVzIiB9LAorCXsgUkxMX0NBVVNFX1JFRVNUX1JFUSwJCSJSZS1lc3RhYmxpc2htZW50IHJlcXVlc3QiIH0sCisJeyBSTExfQ0FVU0VfVU5TT0xfVUFfUkVTUCwJIlVuc29saWNpdGVkIFVBIHJlc3BvbnNlIiB9LAorCXsgUkxMX0NBVVNFX1VOU09MX0RNX1JFU1AsCSJVbnNvbGljaXRlZCBETSByZXNwb25zZSIgfSwKKwl7IFJMTF9DQVVTRV9VTlNPTF9ETV9SRVNQX01GLAkiVW5zb2xpY2l0ZWQgRE0gcmVzcG9uc2UsIG11bHRpcGxlIGZyYW1lIiB9LAorCXsgUkxMX0NBVVNFX1VOU09MX1NQUlZfUkVTUCwJIlVuc29saWNpdGVkIHN1cGVydmlzb3J5IHJlc3BvbnNlIiB9LAorCXsgUkxMX0NBVVNFX1NFUV9FUlIsCQkiU2VxdWVuY2UgRXJyb3IiIH0sCisJeyBSTExfQ0FVU0VfVUZSTV9JTkNfUEFSQU0sCSJVLUZyYW1lIHdpdGggaW5jb3JyZWN0IHBhcmFtZXRlcnMiIH0sCisJeyBSTExfQ0FVU0VfU0ZSTV9JTkNfUEFSQU0sCSJTLUZyYW1lIHdpdGggaW5jb3JyZWN0IHBhcmFtZXRlcnMiIH0sCisJeyBSTExfQ0FVU0VfSUZSTV9JTkNfTUJJVFMsCSJJLUZyYW1lIHdpdGggaW5jb3JyZWN0IHVzZSBvZiBNIGJpdCIgfSwKKwl7IFJMTF9DQVVTRV9JRlJNX0lOQ19MRU4sCSJJLUZyYW1lIHdpdGggaW5jb3JyZWN0IGxlbmd0aCIgfSwKKwl7IFJMTF9DQVVTRV9GUk1fVU5JTVBMLAkJIkZyYWVtZSBub3QgaW1wbGVtZW50ZWQiIH0sCisJeyBSTExfQ0FVU0VfU0FCTV9NRiwJCSJTQUJNIGNvbW1hbmQsIG11bHRpcGxlIGZyYW1lIGVzdGFibGlzaGVkIHN0YXRlIiB9LAorCXsgUkxMX0NBVVNFX1NBQk1fSU5GT19OT1RBTEwsCSJTQUJNIGZyYW1lIHdpdGggaW5mb3JtYXRpb24gbm90IGFsbG93ZWQgaW4gdGhpcyBzdGF0ZSIgfSwKKwl7IDAsCQkJCU5VTEwgfSwKK307CisKK2NvbnN0IGNoYXIgKnJzbF9ybG1fY2F1c2VfbmFtZSh1aW50OF90IGVycikKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhyc2xfcmxtX2NhdXNlX3N0cnMsIGVycik7Cit9CisKKy8qIFNlY3Rpb24gMy4zLjIuMyBUUyAwNS4wMi4gSSB0aGluayB0aGlzIGxvb2tzIGxpa2UgYSB0YWJsZSAqLworaW50IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NfY2hhbnMoaW50IGNjY2hfY29uZikKK3sKKwlzd2l0Y2ggKGNjY2hfY29uZikgeworCWNhc2UgUlNMX0JDQ0hfQ0NDSF9DT05GXzFfTkM6CisJCXJldHVybiAxOworCWNhc2UgUlNMX0JDQ0hfQ0NDSF9DT05GXzFfQzoKKwkJcmV0dXJuIDE7CisJY2FzZSBSU0xfQkNDSF9DQ0NIX0NPTkZfMl9OQzoKKwkJcmV0dXJuIDI7CisJY2FzZSBSU0xfQkNDSF9DQ0NIX0NPTkZfM19OQzoKKwkJcmV0dXJuIDM7CisJY2FzZSBSU0xfQkNDSF9DQ0NIX0NPTkZfNF9OQzoKKwkJcmV0dXJuIDQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KK30KKworLyogU2VjdGlvbiAzLjMuMi4zIFRTIDA1LjAyICovCitpbnQgcnNsX2NjY2hfY29uZl90b19ic19jY2NoX3NkY2NoX2NvbWIoaW50IGNjY2hfY29uZikKK3sKKwlzd2l0Y2ggKGNjY2hfY29uZikgeworCWNhc2UgUlNMX0JDQ0hfQ0NDSF9DT05GXzFfTkM6CisJCXJldHVybiAwOworCWNhc2UgUlNMX0JDQ0hfQ0NDSF9DT05GXzFfQzoKKwkJcmV0dXJuIDE7CisJY2FzZSBSU0xfQkNDSF9DQ0NIX0NPTkZfMl9OQzoKKwkJcmV0dXJuIDA7CisJY2FzZSBSU0xfQkNDSF9DQ0NIX0NPTkZfM19OQzoKKwkJcmV0dXJuIDA7CisJY2FzZSBSU0xfQkNDSF9DQ0NIX0NPTkZfNF9OQzoKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KK30KKworLyogUHVzaCBhIFJTTCBSTEwgaGVhZGVyIHdpdGggTDNfSU5GTyBJRSAqLwordm9pZCByc2xfcmxsX3B1c2hfbDMoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBtc2dfdHlwZSwgdWludDhfdCBjaGFuX25yLAorCQkgICAgIHVpbnQ4X3QgbGlua19pZCwgaW50IHRyYW5zcGFyZW50KQoreworCXVpbnQ4X3QgbDNfbGVuID0gbXNnLT50YWlsIC0gKHVpbnQ4X3QgKiltc2diX2wzKG1zZyk7CisJc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKnJoOworCisJLyogY29uc3RydWN0IGEgUlNMbXMgUkxMIG1lc3NhZ2UgKERBVEEgSU5ESUNBVElPTiwgVU5JVCBEQVRBCisJICogSU5ESUNBVElPTikgYW5kIHNlbmQgaXQgb2ZmIHZpYSBSU0xtcyAqLworCisJLyogUHVzaCB0aGUgTDMgSUUgdGFnIGFuZCBsZW5naCAqLworCW1zZ2JfdHYxNl9wdXNoKG1zZywgUlNMX0lFX0wzX0lORk8sIGwzX2xlbik7CisKKwkvKiBUaGVuIHB1c2ggdGhlIFJTTCBoZWFkZXIgKi8KKwlyaCA9IChzdHJ1Y3QgYWJpc19yc2xfcmxsX2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKnJoKSk7CisJcnNsX2luaXRfcmxsX2hkcihyaCwgbXNnX3R5cGUpOworCWlmICh0cmFuc3BhcmVudCkKKwkJcmgtPmMubXNnX2Rpc2NyIHw9IEFCSVNfUlNMX01ESVNDX1RSQU5TUDsKKwlyaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisJcmgtPmxpbmtfaWQgPSBsaW5rX2lkOworCisJLyogc2V0IHRoZSBsMiBoZWFkZXIgcG9pbnRlciAqLworCW1zZy0+bDJoID0gKHVpbnQ4X3QgKilyaDsKK30KKworc3RydWN0IG1zZ2IgKnJzbF9ybGxfc2ltcGxlKHVpbnQ4X3QgbXNnX3R5cGUsIHVpbnQ4X3QgY2hhbl9uciwKKwkJCSAgICB1aW50OF90IGxpbmtfaWQsIGludCB0cmFuc3BhcmVudCkKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfcmxsX2hkciAqcmg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCW1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oUlNMX0FMTE9DX1NJWkUrUlNMX0FMTE9DX0hFQURST09NLAorCQkJCSAgUlNMX0FMTE9DX0hFQURST09NLCAicnNsX3JsbF9zaW1wbGUiKTsKKworCWlmICghbXNnKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIHB1dCB0aGUgUlNMIGhlYWRlciAqLworCXJoID0gKHN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpyaCkpOworCXJzbF9pbml0X3JsbF9oZHIocmgsIG1zZ190eXBlKTsKKwlpZiAodHJhbnNwYXJlbnQpCisJCXJoLT5jLm1zZ19kaXNjciB8PSBBQklTX1JTTF9NRElTQ19UUkFOU1A7CisJcmgtPmNoYW5fbnIgPSBjaGFuX25yOworCXJoLT5saW5rX2lkID0gbGlua19pZDsKKworCS8qIHNldCB0aGUgbDIgaGVhZGVyIHBvaW50ZXIgKi8KKwltc2ctPmwyaCA9ICh1aW50OF90ICopcmg7CisKKwlyZXR1cm4gbXNnOworfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3J4bGV2X3N0YXQuYyBiL2xpYm9zbW9jb3JlL3NyYy9yeGxldl9zdGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZDY3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL3NyYy9yeGxldl9zdGF0LmMKQEAgLTAsMCArMSw5NCBAQAorLyogUnggTGV2ZWwgc3RhdGlzdGljcyAqLworCisvKiAoQykgMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcnhsZXZfc3RhdC5oPgorCitpbnQgYml0dmVjX2ZpbmRfYml0X3Bvcyhjb25zdCBzdHJ1Y3QgYml0dmVjICpidiwgdW5zaWduZWQgaW50IG4sIGVudW0gYml0X3ZhbHVlIHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IG47IGkgPCBidi0+ZGF0YV9sZW4qODsgaSsrKSB7CisJCWlmIChiaXR2ZWNfZ2V0X2JpdF9wb3MoYnYsIGkpID09IHZhbCkKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAtMTsKK30KKwordm9pZCByeGxldl9zdGF0X2lucHV0KHN0cnVjdCByeGxldl9zdGF0cyAqc3QsIHVpbnQxNl90IGFyZmNuLCB1aW50OF90IHJ4bGV2KQoreworCXN0cnVjdCBiaXR2ZWMgYnY7CisKKwlpZiAocnhsZXYgPj0gTlVNX1JYTEVWUykKKwkJcnhsZXYgPSBOVU1fUlhMRVZTLTE7CisKKwlidi5kYXRhX2xlbiA9IE5VTV9BUkZDTlMvODsKKwlidi5kYXRhID0gc3QtPnJ4bGV2X2J1Y2tldHNbcnhsZXZdOworCisJYml0dmVjX3NldF9iaXRfcG9zKCZidiwgYXJmY24sIE9ORSk7Cit9CisKKy8qIGdldCB0aGUgbmV4dCBBUkZDTiB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIFJ4bGV2ICovCitpbnQxNl90IHJ4bGV2X3N0YXRfZ2V0X25leHQoY29uc3Qgc3RydWN0IHJ4bGV2X3N0YXRzICpzdCwgdWludDhfdCByeGxldiwgaW50MTZfdCBhcmZjbikKK3sKKwlzdHJ1Y3QgYml0dmVjIGJ2OworCisJaWYgKHJ4bGV2ID49IE5VTV9SWExFVlMpCisJCXJ4bGV2ID0gTlVNX1JYTEVWUy0xOworCisJYnYuZGF0YV9sZW4gPSBOVU1fQVJGQ05TLzg7CisKKwlpZiAoYXJmY24gPCAwKQorCQlhcmZjbiA9IC0xOworCisJYnYuZGF0YSA9IHN0LT5yeGxldl9idWNrZXRzW3J4bGV2XTsKKworCXJldHVybiBiaXR2ZWNfZmluZF9iaXRfcG9zKCZidiwgYXJmY24rMSwgT05FKTsKK30KKwordm9pZCByeGxldl9zdGF0X3Jlc2V0KHN0cnVjdCByeGxldl9zdGF0cyAqc3QpCit7CisJbWVtc2V0KHN0LCAwLCBzaXplb2YoKnN0KSk7Cit9CisKK3ZvaWQgcnhsZXZfc3RhdF9kdW1wKGNvbnN0IHN0cnVjdCByeGxldl9zdGF0cyAqc3QpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSBOVU1fUlhMRVZTLTE7IGkgPj0gMDsgaS0tKSB7CisJCWludDE2X3QgYXJmY24gPSAtMTsKKworCQlwcmludGYoIkFSRkNOIHdpdGggUnhMZXYgJXU6ICIsIGkpOworCQl3aGlsZSAoKGFyZmNuID0gcnhsZXZfc3RhdF9nZXRfbmV4dChzdCwgaSwgYXJmY24pKSA+PSAwKSB7CisJCQlwcmludGYoIiV1ICIsIGFyZmNuKTsKKwkJfQorCQlwcmludGYoIlxuIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3NlbGVjdC5jIGIvbGlib3Ntb2NvcmUvc3JjL3NlbGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNmFmYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvc2VsZWN0LmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIHNlbGVjdCBmaWxlZGVzY3JpcHRvciBoYW5kbGluZywgdGFrZW4gZnJvbToKKyAqIHVzZXJzcGFjZSBsb2dnaW5nIGRhZW1vbiBmb3IgdGhlIGlwdGFibGVzIFVMT0cgdGFyZ2V0CisgKiBvZiB0aGUgbGludXggMi40IG5ldGZpbHRlciBzdWJzeXN0ZW0uCisgKgorICogKEMpIDIwMDAtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIAorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKworI2luY2x1ZGUgIi4uL2NvbmZpZy5oIgorCisjaWZkZWYgSEFWRV9TWVNfU0VMRUNUX0gKKworc3RhdGljIGludCBtYXhmZCA9IDA7CitzdGF0aWMgTExJU1RfSEVBRChic2NfZmRzKTsKK3N0YXRpYyBpbnQgdW5yZWdpc3RlcmVkX2NvdW50OworCitpbnQgYnNjX3JlZ2lzdGVyX2ZkKHN0cnVjdCBic2NfZmQgKmZkKQoreworCWludCBmbGFnczsKKworCS8qIG1ha2UgRkQgbm9uYmxvY2tpbmcgKi8KKwlmbGFncyA9IGZjbnRsKGZkLT5mZCwgRl9HRVRGTCk7CisJaWYgKGZsYWdzIDwgMCkKKwkJcmV0dXJuIGZsYWdzOworCWZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJZmxhZ3MgPSBmY250bChmZC0+ZmQsIEZfU0VURkwsIGZsYWdzKTsKKwlpZiAoZmxhZ3MgPCAwKQorCQlyZXR1cm4gZmxhZ3M7CisKKwkvKiBSZWdpc3RlciBGRCAqLworCWlmIChmZC0+ZmQgPiBtYXhmZCkKKwkJbWF4ZmQgPSBmZC0+ZmQ7CisKKwlsbGlzdF9hZGRfdGFpbCgmZmQtPmxpc3QsICZic2NfZmRzKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGJzY191bnJlZ2lzdGVyX2ZkKHN0cnVjdCBic2NfZmQgKmZkKQoreworCXVucmVnaXN0ZXJlZF9jb3VudCsrOworCWxsaXN0X2RlbCgmZmQtPmxpc3QpOworfQorCitpbnQgYnNjX3NlbGVjdF9tYWluKGludCBwb2xsaW5nKQoreworCXN0cnVjdCBic2NfZmQgKnVmZCwgKnRtcDsKKwlmZF9zZXQgcmVhZHNldCwgd3JpdGVzZXQsIGV4Y2VwdHNldDsKKwlpbnQgd29yayA9IDAsIHJjOworCXN0cnVjdCB0aW1ldmFsIG5vX3RpbWUgPSB7MCwgMH07CisKKwlGRF9aRVJPKCZyZWFkc2V0KTsKKwlGRF9aRVJPKCZ3cml0ZXNldCk7CisJRkRfWkVSTygmZXhjZXB0c2V0KTsKKworCS8qIHByZXBhcmUgcmVhZCBhbmQgd3JpdGUgZmRzZXRzICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodWZkLCAmYnNjX2ZkcywgbGlzdCkgeworCQlpZiAodWZkLT53aGVuICYgQlNDX0ZEX1JFQUQpCisJCQlGRF9TRVQodWZkLT5mZCwgJnJlYWRzZXQpOworCisJCWlmICh1ZmQtPndoZW4gJiBCU0NfRkRfV1JJVEUpCisJCQlGRF9TRVQodWZkLT5mZCwgJndyaXRlc2V0KTsKKworCQlpZiAodWZkLT53aGVuICYgQlNDX0ZEX0VYQ0VQVCkKKwkJCUZEX1NFVCh1ZmQtPmZkLCAmZXhjZXB0c2V0KTsKKwl9CisKKwlic2NfdGltZXJfY2hlY2soKTsKKworCWlmICghcG9sbGluZykKKwkJYnNjX3ByZXBhcmVfdGltZXJzKCk7CisJcmMgPSBzZWxlY3QobWF4ZmQrMSwgJnJlYWRzZXQsICZ3cml0ZXNldCwgJmV4Y2VwdHNldCwgcG9sbGluZyA/ICZub190aW1lIDogYnNjX25lYXJlc3RfdGltZXIoKSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBmaXJlIHRpbWVycyAqLworCWJzY191cGRhdGVfdGltZXJzKCk7CisKKwkvKiBjYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb25zICovCityZXN0YXJ0OgorCXVucmVnaXN0ZXJlZF9jb3VudCA9IDA7CisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1ZmQsIHRtcCwgJmJzY19mZHMsIGxpc3QpIHsKKwkJaW50IGZsYWdzID0gMDsKKworCQlpZiAoRkRfSVNTRVQodWZkLT5mZCwgJnJlYWRzZXQpKSB7CisJCQlmbGFncyB8PSBCU0NfRkRfUkVBRDsKKwkJCUZEX0NMUih1ZmQtPmZkLCAmcmVhZHNldCk7CisJCX0KKworCQlpZiAoRkRfSVNTRVQodWZkLT5mZCwgJndyaXRlc2V0KSkgeworCQkJZmxhZ3MgfD0gQlNDX0ZEX1dSSVRFOworCQkJRkRfQ0xSKHVmZC0+ZmQsICZ3cml0ZXNldCk7CisJCX0KKworCQlpZiAoRkRfSVNTRVQodWZkLT5mZCwgJmV4Y2VwdHNldCkpIHsKKwkJCWZsYWdzIHw9IEJTQ19GRF9FWENFUFQ7CisJCQlGRF9DTFIodWZkLT5mZCwgJmV4Y2VwdHNldCk7CisJCX0KKworCQlpZiAoZmxhZ3MpIHsKKwkJCXdvcmsgPSAxOworCQkJdWZkLT5jYih1ZmQsIGZsYWdzKTsKKwkJfQorCQkvKiB1Z2x5LCB1Z2x5IGhhY2suIElmIG1vcmUgdGhhbiBvbmUgZmlsZWRlc2NyaXB0b3JzIHdlcmUKKwkJICogdW5yZWdpc3RlcmVkLCB0aGV5IG1pZ2h0IGhhdmUgYmVlbiBjb25zZWN1dGl2ZSBhbmQKKwkJICogbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSgpIGlzIG5vIGxvbmdlciBzYWZlICovCisJCS8qIHRoaXMgc2VlbXMgdG8gaGFwcGVuIHdpdGggdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgbGlzdCBhcyB3ZWxsICovCisJCWlmICh1bnJlZ2lzdGVyZWRfY291bnQgPj0gMSkKKwkJCWdvdG8gcmVzdGFydDsKKwl9CisJcmV0dXJuIHdvcms7Cit9CisKKyNlbmRpZiAvKiBfSEFWRV9TWVNfU0VMRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9zaWduYWwuYyBiL2xpYm9zbW9jb3JlL3NyYy9zaWduYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2NhODZjCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL3NpZ25hbC5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIEdlbmVyaWMgc2lnbmFsbGluZy9ub3RpZmljYXRpb24gaW5mcmFzdHJ1Y3R1cmUgKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKwordm9pZCAqdGFsbF9zaWdoX2N0eDsKK3N0YXRpYyBMTElTVF9IRUFEKHNpZ25hbF9oYW5kbGVyX2xpc3QpOworCitzdHJ1Y3Qgc2lnbmFsX2hhbmRsZXIgeworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCXVuc2lnbmVkIGludCBzdWJzeXM7CisJc2lnbmFsX2NiZm4gKmNiZm47CisJdm9pZCAqZGF0YTsKK307CisKKworaW50IHJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKHVuc2lnbmVkIGludCBzdWJzeXMsIHNpZ25hbF9jYmZuICpjYmZuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzaWduYWxfaGFuZGxlciAqc2lnX2RhdGE7CisKKwlzaWdfZGF0YSA9IHRhbGxvYyh0YWxsX3NpZ2hfY3R4LCBzdHJ1Y3Qgc2lnbmFsX2hhbmRsZXIpOworCWlmICghc2lnX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHNpZ19kYXRhLCAwLCBzaXplb2YoKnNpZ19kYXRhKSk7CisKKwlzaWdfZGF0YS0+c3Vic3lzID0gc3Vic3lzOworCXNpZ19kYXRhLT5kYXRhID0gZGF0YTsKKwlzaWdfZGF0YS0+Y2JmbiA9IGNiZm47CisKKwkvKiBGSVhNRTogY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgaGFuZGxlciBmb3IgdGhpcyBzdWJzeXMvY2Jmbi9kYXRhICovCisKKwlsbGlzdF9hZGRfdGFpbCgmc2lnX2RhdGEtPmVudHJ5LCAmc2lnbmFsX2hhbmRsZXJfbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB1bnJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKHVuc2lnbmVkIGludCBzdWJzeXMsIHNpZ25hbF9jYmZuICpjYmZuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzaWduYWxfaGFuZGxlciAqaGFuZGxlcjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhbmRsZXIsICZzaWduYWxfaGFuZGxlcl9saXN0LCBlbnRyeSkgeworCQlpZiAoaGFuZGxlci0+Y2JmbiA9PSBjYmZuICYmIGhhbmRsZXItPmRhdGEgPT0gZGF0YSAKKwkJICAgICYmIHN1YnN5cyA9PSBoYW5kbGVyLT5zdWJzeXMpIHsKKwkJCWxsaXN0X2RlbCgmaGFuZGxlci0+ZW50cnkpOworCQkJdGFsbG9jX2ZyZWUoaGFuZGxlcik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCit2b2lkIGRpc3BhdGNoX3NpZ25hbCh1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3Qgc2lnbmFsX2hhbmRsZXIgKmhhbmRsZXI7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShoYW5kbGVyLCAmc2lnbmFsX2hhbmRsZXJfbGlzdCwgZW50cnkpIHsKKwkJaWYgKGhhbmRsZXItPnN1YnN5cyAhPSBzdWJzeXMpCisJCQljb250aW51ZTsKKwkJKCpoYW5kbGVyLT5jYmZuKShzdWJzeXMsIHNpZ25hbCwgaGFuZGxlci0+ZGF0YSwgc2lnbmFsX2RhdGEpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy9zdGF0aXN0aWNzLmMgYi9saWJvc21vY29yZS9zcmMvc3RhdGlzdGljcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTZhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvc3RhdGlzdGljcy5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIHV0aWxpdHkgcm91dGluZXMgZm9yIGtlZXBpbmcgc29tZSBzdGF0aXN0aWNzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgorCitzdGF0aWMgTExJU1RfSEVBRChjb3VudGVycyk7CisKK3ZvaWQgKnRhbGxfY3RyX2N0eDsKKworc3RydWN0IGNvdW50ZXIgKmNvdW50ZXJfYWxsb2MoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgY291bnRlciAqY3RyID0gdGFsbG9jX3plcm8odGFsbF9jdHJfY3R4LCBzdHJ1Y3QgY291bnRlcik7CisKKwlpZiAoIWN0cikKKwkJcmV0dXJuIE5VTEw7CisKKwljdHItPm5hbWUgPSBuYW1lOworCWxsaXN0X2FkZF90YWlsKCZjdHItPmxpc3QsICZjb3VudGVycyk7CisKKwlyZXR1cm4gY3RyOworfQorCit2b2lkIGNvdW50ZXJfZnJlZShzdHJ1Y3QgY291bnRlciAqY3RyKQoreworCWxsaXN0X2RlbCgmY3RyLT5saXN0KTsKKwl0YWxsb2NfZnJlZShjdHIpOworfQorCitpbnQgY291bnRlcnNfZm9yX2VhY2goaW50ICgqaGFuZGxlX2NvdW50ZXIpKHN0cnVjdCBjb3VudGVyICosIHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNvdW50ZXIgKmN0cjsKKwlpbnQgcmMgPSAwOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY3RyLCAmY291bnRlcnMsIGxpc3QpIHsKKwkJcmMgPSBoYW5kbGVfY291bnRlcihjdHIsIGRhdGEpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3RhbGxvYy5jIGIvbGlib3Ntb2NvcmUvc3JjL3RhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YzJlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvc21vY29yZS9zcmMvdGFsbG9jLmMKQEAgLTAsMCArMSwxODA1IEBACisvKiAKKyAgIFNhbWJhIFVuaXggU01CL0NJRlMgaW1wbGVtZW50YXRpb24uCisKKyAgIFNhbWJhIHRyaXZpYWwgYWxsb2NhdGlvbiBsaWJyYXJ5IC0gbmV3IGludGVyZmFjZQorCisgICBOT1RFOiBQbGVhc2UgcmVhZCB0YWxsb2NfZ3VpZGUudHh0IGZvciBmdWxsIGRvY3VtZW50YXRpb24KKworICAgQ29weXJpZ2h0IChDKSBBbmRyZXcgVHJpZGdlbGwgMjAwNAorICAgQ29weXJpZ2h0IChDKSBTdGVmYW4gTWV0em1hY2hlciAyMDA2CisgICAKKyAgICAgKiogTk9URSEgVGhlIGZvbGxvd2luZyBMR1BMIGxpY2Vuc2UgYXBwbGllcyB0byB0aGUgdGFsbG9jCisgICAgICoqIGxpYnJhcnkuIFRoaXMgZG9lcyBOT1QgaW1wbHkgdGhhdCBhbGwgb2YgU2FtYmEgaXMgcmVsZWFzZWQKKyAgICAgKiogdW5kZXIgdGhlIExHUEwKKyAgIAorICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisqLworCisvKgorICBpbnNwaXJlZCBieSBodHRwOi8vc3dhcHBlZC5jYy9oYWxsb2MvCisqLworCisjaWZkZWYgX1NBTUJBX0JVSUxEXworI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpZiAoU0FNQkFfVkVSU0lPTl9NQUpPUjw0KQorI2luY2x1ZGUgImluY2x1ZGVzLmgiCisvKiBUaGlzIGlzIHRvIGNpcmN1bXZlbnQgU0FNQkEzJ3MgcGFyYW5vaWQgbWFsbG9jIGNoZWNrZXIuIEhlcmUgaW4gdGhpcyBmaWxlCisgKiB3ZSB0cnVzdCBvdXJzZWx2ZXMuLi4gKi8KKyNpZmRlZiBtYWxsb2MKKyN1bmRlZiBtYWxsb2MKKyNlbmRpZgorI2lmZGVmIHJlYWxsb2MKKyN1bmRlZiByZWFsbG9jCisjZW5kaWYKKyNkZWZpbmUgX1RBTExPQ19TQU1CQTMKKyNlbmRpZiAvKiAoU0FNQkFfVkVSU0lPTl9NQUpPUjw0KSAqLworI2VuZGlmIC8qIF9TQU1CQV9CVUlMRF8gKi8KKworI2lmbmRlZiBfVEFMTE9DX1NBTUJBMworLy8jaW5jbHVkZSAicmVwbGFjZS5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2RlZmluZSBfX1VTRV9HTlUKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyN1bmRlZiBfX1VTRV9HTlUKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNkZWZpbmUgTUlOKHgseSkgKCh4KSA8ICh5KSA/ICh4KSA6ICh5KSkKKyNlbmRpZiAvKiBub3QgX1RBTExPQ19TQU1CQTMgKi8KKworLyogdXNlIHRoaXMgdG8gZm9yY2UgZXZlcnkgcmVhbGxvYyB0byBjaGFuZ2UgdGhlIHBvaW50ZXIsIHRvIHN0cmVzcyB0ZXN0CisgICBjb2RlIHRoYXQgbWlnaHQgbm90IGNvcGUgKi8KKyNkZWZpbmUgQUxXQVlTX1JFQUxMT0MgMAorCisKKyNkZWZpbmUgTUFYX1RBTExPQ19TSVpFIDB4MTAwMDAwMDAKKyNkZWZpbmUgVEFMTE9DX01BR0lDIDB4ZTgxNGVjNzAKKyNkZWZpbmUgVEFMTE9DX0ZMQUdfRlJFRSAweDAxCisjZGVmaW5lIFRBTExPQ19GTEFHX0xPT1AgMHgwMgorI2RlZmluZSBUQUxMT0NfRkxBR19QT09MIDB4MDQJCS8qIFRoaXMgaXMgYSB0YWxsb2MgcG9vbCAqLworI2RlZmluZSBUQUxMT0NfRkxBR19QT09MTUVNIDB4MDgJLyogVGhpcyBpcyBhbGxvY2F0ZWQgaW4gYSBwb29sICovCisjZGVmaW5lIFRBTExPQ19NQUdJQ19SRUZFUkVOQ0UgKChjb25zdCBjaGFyICopMSkKKworLyogYnkgZGVmYXVsdCB3ZSBhYm9ydCB3aGVuIGdpdmVuIGEgYmFkIHBvaW50ZXIgKHN1Y2ggYXMgd2hlbiB0YWxsb2NfZnJlZSgpIGlzIGNhbGxlZCAKKyAgIG9uIGEgcG9pbnRlciB0aGF0IGNhbWUgZnJvbSBtYWxsb2MoKSAqLworI2lmbmRlZiBUQUxMT0NfQUJPUlQKKyNkZWZpbmUgVEFMTE9DX0FCT1JUKHJlYXNvbikgYWJvcnQoKQorI2VuZGlmCisKKyNpZm5kZWYgZGlzY2FyZF9jb25zdF9wCisjaWYgZGVmaW5lZChfX2ludHB0cl90X2RlZmluZWQpIHx8IGRlZmluZWQoSEFWRV9JTlRQVFJfVCkKKyMgZGVmaW5lIGRpc2NhcmRfY29uc3RfcCh0eXBlLCBwdHIpICgodHlwZSAqKSgoaW50cHRyX3QpKHB0cikpKQorI2Vsc2UKKyMgZGVmaW5lIGRpc2NhcmRfY29uc3RfcCh0eXBlLCBwdHIpICgodHlwZSAqKShwdHIpKQorI2VuZGlmCisjZW5kaWYKKworLyogdGhlc2UgbWFjcm9zIGdhaW4gdXMgYSBmZXcgcGVyY2VudCBvZiBzcGVlZCBvbiBnY2MgKi8KKyNpZiAoX19HTlVDX18gPj0gMykKKy8qIHRoZSBzdHJhbmdlICEhIGlzIHRvIGVuc3VyZSB0aGF0IF9fYnVpbHRpbl9leHBlY3QoKSB0YWtlcyBlaXRoZXIgMCBvciAxCisgICBhcyBpdHMgZmlyc3QgYXJndW1lbnQgKi8KKyNpZm5kZWYgbGlrZWx5CisjZGVmaW5lIGxpa2VseSh4KSAgIF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpCisjZW5kaWYKKyNpZm5kZWYgdW5saWtlbHkKKyNkZWZpbmUgdW5saWtlbHkoeCkgX19idWlsdGluX2V4cGVjdCghISh4KSwgMCkKKyNlbmRpZgorI2Vsc2UKKyNpZm5kZWYgbGlrZWx5CisjZGVmaW5lIGxpa2VseSh4KSAoeCkKKyNlbmRpZgorI2lmbmRlZiB1bmxpa2VseQorI2RlZmluZSB1bmxpa2VseSh4KSAoeCkKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX0FQUExFX18KKy8qIHRha2VuIGZyb20gaHR0cDovL2luc2FuZWNvZGluZy5ibG9nc3BvdC5jb20vMjAwNy8wMy9tZXRob2RzLWZvci1zYWZlLXN0cmluZy1oYW5kbGluZy5odG1sICovCitzaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sKKyAgY29uc3QgY2hhciAqcCA9IChjb25zdCBjaGFyICopbWVtY2hyKHMsIDAsIG4pOworICByZXR1cm4ocCA/IHAtcyA6IG4pOworfQorI2VuZGlmCisKKy8qIHRoaXMgbnVsbF9jb250ZXh0IGlzIG9ubHkgdXNlZCBpZiB0YWxsb2NfZW5hYmxlX2xlYWtfcmVwb3J0KCkgb3IKKyAgIHRhbGxvY19lbmFibGVfbGVha19yZXBvcnRfZnVsbCgpIGlzIGNhbGxlZCwgb3RoZXJ3aXNlIGl0IHJlbWFpbnMKKyAgIE5VTEwKKyovCitzdGF0aWMgdm9pZCAqbnVsbF9jb250ZXh0Oworc3RhdGljIHZvaWQgKmF1dG9mcmVlX2NvbnRleHQ7CisKK3N0cnVjdCB0YWxsb2NfcmVmZXJlbmNlX2hhbmRsZSB7CisJc3RydWN0IHRhbGxvY19yZWZlcmVuY2VfaGFuZGxlICpuZXh0LCAqcHJldjsKKwl2b2lkICpwdHI7Cit9OworCit0eXBlZGVmIGludCAoKnRhbGxvY19kZXN0cnVjdG9yX3QpKHZvaWQgKik7CisKK3N0cnVjdCB0YWxsb2NfY2h1bmsgeworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKm5leHQsICpwcmV2OworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnBhcmVudCwgKmNoaWxkOworCXN0cnVjdCB0YWxsb2NfcmVmZXJlbmNlX2hhbmRsZSAqcmVmczsKKwl0YWxsb2NfZGVzdHJ1Y3Rvcl90IGRlc3RydWN0b3I7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzaXplX3Qgc2l6ZTsKKwl1bnNpZ25lZCBmbGFnczsKKworCS8qCisJICogInBvb2wiIGhhcyBkdWFsIHVzZToKKwkgKgorCSAqIEZvciB0aGUgdGFsbG9jIHBvb2wgaXRzZWxmIChpLmUuIFRBTExPQ19GTEFHX1BPT0wgaXMgc2V0KSwgInBvb2wiCisJICogbWFya3MgdGhlIGVuZCBvZiB0aGUgY3VycmVudGx5IGFsbG9jYXRlZCBhcmVhLgorCSAqCisJICogRm9yIG1lbWJlcnMgb2YgdGhlIHBvb2wgKGkuZS4gVEFMTE9DX0ZMQUdfUE9PTE1FTSBpcyBzZXQpLCAicG9vbCIKKwkgKiBpcyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCB0YWxsb2NfY2h1bmsgb2YgdGhlIHBvb2wgdGhhdCBpdCB3YXMKKwkgKiBhbGxvY2F0ZWQgZnJvbS4gVGhpcyB3YXkgY2hpbGRyZW4gY2FuIHF1aWNrbHkgZmluZCB0aGUgcG9vbCB0byBjaGV3CisJICogZnJvbS4KKwkgKi8KKwl2b2lkICpwb29sOworfTsKKworLyogMTYgYnl0ZSBhbGlnbm1lbnQgc2VlbXMgdG8ga2VlcCBldmVyeW9uZSBoYXBweSAqLworI2RlZmluZSBUQ19IRFJfU0laRSAoKHNpemVvZihzdHJ1Y3QgdGFsbG9jX2NodW5rKSsxNSkmfjE1KQorI2RlZmluZSBUQ19QVFJfRlJPTV9DSFVOSyh0YykgKCh2b2lkICopKFRDX0hEUl9TSVpFICsgKGNoYXIqKXRjKSkKKworc3RhdGljIHZvaWQgKCp0YWxsb2NfYWJvcnRfZm4pKGNvbnN0IGNoYXIgKnJlYXNvbik7CisKK3ZvaWQgdGFsbG9jX3NldF9hYm9ydF9mbih2b2lkICgqYWJvcnRfZm4pKGNvbnN0IGNoYXIgKnJlYXNvbikpCit7CisJdGFsbG9jX2Fib3J0X2ZuID0gYWJvcnRfZm47Cit9CisKK3N0YXRpYyB2b2lkIHRhbGxvY19hYm9ydChjb25zdCBjaGFyICpyZWFzb24pCit7CisJaWYgKCF0YWxsb2NfYWJvcnRfZm4pIHsKKwkJVEFMTE9DX0FCT1JUKHJlYXNvbik7CisJfQorCisJdGFsbG9jX2Fib3J0X2ZuKHJlYXNvbik7Cit9CisKK3N0YXRpYyB2b2lkIHRhbGxvY19hYm9ydF9kb3VibGVfZnJlZSh2b2lkKQoreworCXRhbGxvY19hYm9ydCgiQmFkIHRhbGxvYyBtYWdpYyB2YWx1ZSAtIGRvdWJsZSBmcmVlIik7Cit9CisKK3N0YXRpYyB2b2lkIHRhbGxvY19hYm9ydF91bmtub3duX3ZhbHVlKHZvaWQpCit7CisJdGFsbG9jX2Fib3J0KCJCYWQgdGFsbG9jIG1hZ2ljIHZhbHVlIC0gdW5rbm93biB2YWx1ZSIpOworfQorCisvKiBwYW5pYyBpZiB3ZSBnZXQgYSBiYWQgbWFnaWMgdmFsdWUgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRhbGxvY19jaHVuayAqdGFsbG9jX2NodW5rX2Zyb21fcHRyKGNvbnN0IHZvaWQgKnB0cikKK3sKKwljb25zdCBjaGFyICpwcCA9IChjb25zdCBjaGFyICopcHRyOworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjID0gZGlzY2FyZF9jb25zdF9wKHN0cnVjdCB0YWxsb2NfY2h1bmssIHBwIC0gVENfSERSX1NJWkUpOworCWlmICh1bmxpa2VseSgodGMtPmZsYWdzICYgKFRBTExPQ19GTEFHX0ZSRUUgfCB+MHhGKSkgIT0gVEFMTE9DX01BR0lDKSkgeyAKKwkJaWYgKHRjLT5mbGFncyAmIFRBTExPQ19GTEFHX0ZSRUUpIHsKKwkJCXRhbGxvY19hYm9ydF9kb3VibGVfZnJlZSgpOworCQl9IGVsc2UgeworCQkJdGFsbG9jX2Fib3J0X3Vua25vd25fdmFsdWUoKTsKKwkJfQorCX0KKwlyZXR1cm4gdGM7Cit9CisKKy8qIGhvb2sgaW50byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgKi8KKyNkZWZpbmUgX1RMSVNUX0FERChsaXN0LCBwKSBcCitkbyB7IFwKKyAgICAgICAgaWYgKCEobGlzdCkpIHsgXAorCQkobGlzdCkgPSAocCk7IFwKKwkJKHApLT5uZXh0ID0gKHApLT5wcmV2ID0gTlVMTDsgXAorCX0gZWxzZSB7IFwKKwkJKGxpc3QpLT5wcmV2ID0gKHApOyBcCisJCShwKS0+bmV4dCA9IChsaXN0KTsgXAorCQkocCktPnByZXYgPSBOVUxMOyBcCisJCShsaXN0KSA9IChwKTsgXAorCX1cCit9IHdoaWxlICgwKQorCisvKiByZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgbGlzdCAtIGVsZW1lbnQgZG9lc24ndCBoYXZlIHRvIGJlIGluIGxpc3QuICovCisjZGVmaW5lIF9UTElTVF9SRU1PVkUobGlzdCwgcCkgXAorZG8geyBcCisJaWYgKChwKSA9PSAobGlzdCkpIHsgXAorCQkobGlzdCkgPSAocCktPm5leHQ7IFwKKwkJaWYgKGxpc3QpIChsaXN0KS0+cHJldiA9IE5VTEw7IFwKKwl9IGVsc2UgeyBcCisJCWlmICgocCktPnByZXYpIChwKS0+cHJldi0+bmV4dCA9IChwKS0+bmV4dDsgXAorCQlpZiAoKHApLT5uZXh0KSAocCktPm5leHQtPnByZXYgPSAocCktPnByZXY7IFwKKwl9IFwKKwlpZiAoKHApICYmICgocCkgIT0gKGxpc3QpKSkgKHApLT5uZXh0ID0gKHApLT5wcmV2ID0gTlVMTDsgXAorfSB3aGlsZSAoMCkKKworCisvKgorICByZXR1cm4gdGhlIHBhcmVudCBjaHVuayBvZiBhIHBvaW50ZXIKKyovCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0YWxsb2NfY2h1bmsgKnRhbGxvY19wYXJlbnRfY2h1bmsoY29uc3Qgdm9pZCAqcHRyKQoreworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjOworCisJaWYgKHVubGlrZWx5KHB0ciA9PSBOVUxMKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihwdHIpOworCXdoaWxlICh0Yy0+cHJldikgdGM9dGMtPnByZXY7CisKKwlyZXR1cm4gdGMtPnBhcmVudDsKK30KKwordm9pZCAqdGFsbG9jX3BhcmVudChjb25zdCB2b2lkICpwdHIpCit7CisJc3RydWN0IHRhbGxvY19jaHVuayAqdGMgPSB0YWxsb2NfcGFyZW50X2NodW5rKHB0cik7CisJcmV0dXJuIHRjPyBUQ19QVFJfRlJPTV9DSFVOSyh0YykgOiBOVUxMOworfQorCisvKgorICBmaW5kIHBhcmVudHMgbmFtZQorKi8KK2NvbnN0IGNoYXIgKnRhbGxvY19wYXJlbnRfbmFtZShjb25zdCB2b2lkICpwdHIpCit7CisJc3RydWN0IHRhbGxvY19jaHVuayAqdGMgPSB0YWxsb2NfcGFyZW50X2NodW5rKHB0cik7CisJcmV0dXJuIHRjPyB0Yy0+bmFtZSA6IE5VTEw7Cit9CisKKy8qCisgIEEgcG9vbCBjYXJyaWVzIGFuIGluLXBvb2wgb2JqZWN0IGNvdW50IGNvdW50IGluIHRoZSBmaXJzdCAxNiBieXRlcy4KKyAgYnl0ZXMuIFRoaXMgaXMgZG9uZSB0byBzdXBwb3J0IHRhbGxvY19zdGVhbCgpIHRvIGEgcGFyZW50IG91dHNpZGUgb2YgdGhlCisgIHBvb2wuIFRoZSBjb3VudCBpbmNsdWRlcyB0aGUgcG9vbCBpdHNlbGYsIHNvIGEgdGFsbG9jX2ZyZWUoKSBvbiBhIHBvb2wgd2lsbAorICBvbmx5IGRlc3Ryb3kgdGhlIHBvb2wgaWYgdGhlIGNvdW50IGhhcyBkcm9wcGVkIHRvIHplcm8uIEEgdGFsbG9jX2ZyZWUoKSBvZiBhCisgIHBvb2wgbWVtYmVyIHdpbGwgcmVkdWNlIHRoZSBjb3VudCwgYW5kIGV2ZW50dWFsbHkgYWxzbyBjYWxsIGZyZWUoMykgb24gdGhlCisgIHBvb2wgbWVtb3J5LgorCisgIFRoZSBvYmplY3QgY291bnQgaXMgbm90IHB1dCBpbnRvICJzdHJ1Y3QgdGFsbG9jX2NodW5rIiBiZWNhdXNlIGl0IGlzIG9ubHkKKyAgcmVsZXZhbnQgZm9yIHRhbGxvYyBwb29scyBhbmQgdGhlIGFsaWdubWVudCB0byAxNiBieXRlcyB3b3VsZCBpbmNyZWFzZSB0aGUKKyAgbWVtb3J5IGZvb3RwcmludCBvZiBlYWNoIHRhbGxvYyBjaHVuayBieSB0aG9zZSAxNiBieXRlcy4KKyovCisKKyNkZWZpbmUgVEFMTE9DX1BPT0xfSERSX1NJWkUgMTYKKworc3RhdGljIHVuc2lnbmVkIGludCAqdGFsbG9jX3Bvb2xfb2JqZWN0Y291bnQoc3RydWN0IHRhbGxvY19jaHVuayAqdGMpCit7CisJcmV0dXJuICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKil0YyArIHNpemVvZihzdHJ1Y3QgdGFsbG9jX2NodW5rKSk7Cit9CisKKy8qCisgIEFsbG9jYXRlIGZyb20gYSBwb29sCisqLworCitzdGF0aWMgc3RydWN0IHRhbGxvY19jaHVuayAqdGFsbG9jX2FsbG9jX3Bvb2woc3RydWN0IHRhbGxvY19jaHVuayAqcGFyZW50LAorCQkJCQkgICAgICBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgdGFsbG9jX2NodW5rICpwb29sX2N0eCA9IE5VTEw7CisJc2l6ZV90IHNwYWNlX2xlZnQ7CisJc3RydWN0IHRhbGxvY19jaHVuayAqcmVzdWx0OworCXNpemVfdCBjaHVua19zaXplOworCisJaWYgKHBhcmVudCA9PSBOVUxMKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChwYXJlbnQtPmZsYWdzICYgVEFMTE9DX0ZMQUdfUE9PTCkgeworCQlwb29sX2N0eCA9IHBhcmVudDsKKwl9CisJZWxzZSBpZiAocGFyZW50LT5mbGFncyAmIFRBTExPQ19GTEFHX1BPT0xNRU0pIHsKKwkJcG9vbF9jdHggPSAoc3RydWN0IHRhbGxvY19jaHVuayAqKXBhcmVudC0+cG9vbDsKKwl9CisKKwlpZiAocG9vbF9jdHggPT0gTlVMTCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzcGFjZV9sZWZ0ID0gKChjaGFyICopcG9vbF9jdHggKyBUQ19IRFJfU0laRSArIHBvb2xfY3R4LT5zaXplKQorCQktICgoY2hhciAqKXBvb2xfY3R4LT5wb29sKTsKKworCS8qCisJICogQWxpZ24gc2l6ZSB0byAxNiBieXRlcworCSAqLworCWNodW5rX3NpemUgPSAoKHNpemUgKyAxNSkgJiB+MTUpOworCisJaWYgKHNwYWNlX2xlZnQgPCBjaHVua19zaXplKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXJlc3VsdCA9IChzdHJ1Y3QgdGFsbG9jX2NodW5rICopcG9vbF9jdHgtPnBvb2w7CisKKyNpZiBkZWZpbmVkKERFVkVMT1BFUikgJiYgZGVmaW5lZChWQUxHUklORF9NQUtFX01FTV9VTkRFRklORUQpCisJVkFMR1JJTkRfTUFLRV9NRU1fVU5ERUZJTkVEKHJlc3VsdCwgc2l6ZSk7CisjZW5kaWYKKworCXBvb2xfY3R4LT5wb29sID0gKHZvaWQgKikoKGNoYXIgKilyZXN1bHQgKyBjaHVua19zaXplKTsKKworCXJlc3VsdC0+ZmxhZ3MgPSBUQUxMT0NfTUFHSUMgfCBUQUxMT0NfRkxBR19QT09MTUVNOworCXJlc3VsdC0+cG9vbCA9IHBvb2xfY3R4OworCisJKnRhbGxvY19wb29sX29iamVjdGNvdW50KHBvb2xfY3R4KSArPSAxOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogCisgICBBbGxvY2F0ZSBhIGJpdCBvZiBtZW1vcnkgYXMgYSBjaGlsZCBvZiBhbiBleGlzdGluZyBwb2ludGVyCisqLworc3RhdGljIGlubGluZSB2b2lkICpfX3RhbGxvYyhjb25zdCB2b2lkICpjb250ZXh0LCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YyA9IE5VTEw7CisKKwlpZiAodW5saWtlbHkoY29udGV4dCA9PSBOVUxMKSkgeworCQljb250ZXh0ID0gbnVsbF9jb250ZXh0OworCX0KKworCWlmICh1bmxpa2VseShzaXplID49IE1BWF9UQUxMT0NfU0laRSkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGNvbnRleHQgIT0gTlVMTCkgeworCQl0YyA9IHRhbGxvY19hbGxvY19wb29sKHRhbGxvY19jaHVua19mcm9tX3B0cihjb250ZXh0KSwKKwkJCQkgICAgICAgVENfSERSX1NJWkUrc2l6ZSk7CisJfQorCisJaWYgKHRjID09IE5VTEwpIHsKKwkJdGMgPSAoc3RydWN0IHRhbGxvY19jaHVuayAqKW1hbGxvYyhUQ19IRFJfU0laRStzaXplKTsKKwkJaWYgKHVubGlrZWx5KHRjID09IE5VTEwpKSByZXR1cm4gTlVMTDsKKwkJdGMtPmZsYWdzID0gVEFMTE9DX01BR0lDOworCQl0Yy0+cG9vbCAgPSBOVUxMOworCX0KKworCXRjLT5zaXplID0gc2l6ZTsKKwl0Yy0+ZGVzdHJ1Y3RvciA9IE5VTEw7CisJdGMtPmNoaWxkID0gTlVMTDsKKwl0Yy0+bmFtZSA9IE5VTEw7CisJdGMtPnJlZnMgPSBOVUxMOworCisJaWYgKGxpa2VseShjb250ZXh0KSkgeworCQlzdHJ1Y3QgdGFsbG9jX2NodW5rICpwYXJlbnQgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIoY29udGV4dCk7CisKKwkJaWYgKHBhcmVudC0+Y2hpbGQpIHsKKwkJCXBhcmVudC0+Y2hpbGQtPnBhcmVudCA9IE5VTEw7CisJCQl0Yy0+bmV4dCA9IHBhcmVudC0+Y2hpbGQ7CisJCQl0Yy0+bmV4dC0+cHJldiA9IHRjOworCQl9IGVsc2UgeworCQkJdGMtPm5leHQgPSBOVUxMOworCQl9CisJCXRjLT5wYXJlbnQgPSBwYXJlbnQ7CisJCXRjLT5wcmV2ID0gTlVMTDsKKwkJcGFyZW50LT5jaGlsZCA9IHRjOworCX0gZWxzZSB7CisJCXRjLT5uZXh0ID0gdGMtPnByZXYgPSB0Yy0+cGFyZW50ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gVENfUFRSX0ZST01fQ0hVTksodGMpOworfQorCisvKgorICogQ3JlYXRlIGEgdGFsbG9jIHBvb2wKKyAqLworCit2b2lkICp0YWxsb2NfcG9vbChjb25zdCB2b2lkICpjb250ZXh0LCBzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpyZXN1bHQgPSBfX3RhbGxvYyhjb250ZXh0LCBzaXplICsgVEFMTE9DX1BPT0xfSERSX1NJWkUpOworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjOworCisJaWYgKHVubGlrZWx5KHJlc3VsdCA9PSBOVUxMKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihyZXN1bHQpOworCisJdGMtPmZsYWdzIHw9IFRBTExPQ19GTEFHX1BPT0w7CisJdGMtPnBvb2wgPSAoY2hhciAqKXJlc3VsdCArIFRBTExPQ19QT09MX0hEUl9TSVpFOworCisJKnRhbGxvY19wb29sX29iamVjdGNvdW50KHRjKSA9IDE7CisKKyNpZiBkZWZpbmVkKERFVkVMT1BFUikgJiYgZGVmaW5lZChWQUxHUklORF9NQUtFX01FTV9OT0FDQ0VTUykKKwlWQUxHUklORF9NQUtFX01FTV9OT0FDQ0VTUyh0Yy0+cG9vbCwgc2l6ZSk7CisjZW5kaWYKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgIHNldHVwIGEgZGVzdHJ1Y3RvciB0byBiZSBjYWxsZWQgb24gZnJlZSBvZiBhIHBvaW50ZXIKKyAgdGhlIGRlc3RydWN0b3Igc2hvdWxkIHJldHVybiAwIG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuCisgIGlmIHRoZSBkZXN0cnVjdG9yIGZhaWxzIHRoZW4gdGhlIGZyZWUgaXMgZmFpbGVkLCBhbmQgdGhlIG1lbW9yeSBjYW4KKyAgYmUgY29udGludWVkIHRvIGJlIHVzZWQKKyovCit2b2lkIF90YWxsb2Nfc2V0X2Rlc3RydWN0b3IoY29uc3Qgdm9pZCAqcHRyLCBpbnQgKCpkZXN0cnVjdG9yKSh2b2lkICopKQoreworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKHB0cik7CisJdGMtPmRlc3RydWN0b3IgPSBkZXN0cnVjdG9yOworfQorCisvKgorICBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgcGllY2Ugb2YgbWVtb3J5LiAKKyovCitpbnQgdGFsbG9jX2luY3JlYXNlX3JlZl9jb3VudChjb25zdCB2b2lkICpwdHIpCit7CisJaWYgKHVubGlrZWx5KCF0YWxsb2NfcmVmZXJlbmNlKG51bGxfY29udGV4dCwgcHRyKSkpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAgaGVscGVyIGZvciB0YWxsb2NfcmVmZXJlbmNlKCkKKworICB0aGlzIGlzIHJlZmVyZW5jZWQgYnkgYSBmdW5jdGlvbiBwb2ludGVyIGFuZCBzaG91bGQgbm90IGJlIGlubGluZQorKi8KK3N0YXRpYyBpbnQgdGFsbG9jX3JlZmVyZW5jZV9kZXN0cnVjdG9yKHN0cnVjdCB0YWxsb2NfcmVmZXJlbmNlX2hhbmRsZSAqaGFuZGxlKQoreworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnB0cl90YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihoYW5kbGUtPnB0cik7CisJX1RMSVNUX1JFTU9WRShwdHJfdGMtPnJlZnMsIGhhbmRsZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgICBtb3JlIGVmZmljaWVudCB3YXkgdG8gYWRkIGEgbmFtZSB0byBhIHBvaW50ZXIgLSB0aGUgbmFtZSBtdXN0IHBvaW50IHRvIGEgCisgICB0cnVlIHN0cmluZyBjb25zdGFudAorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfdGFsbG9jX3NldF9uYW1lX2NvbnN0KGNvbnN0IHZvaWQgKnB0ciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihwdHIpOworCXRjLT5uYW1lID0gbmFtZTsKK30KKworLyoKKyAgaW50ZXJuYWwgdGFsbG9jX25hbWVkX2NvbnN0KCkKKyovCitzdGF0aWMgaW5saW5lIHZvaWQgKl90YWxsb2NfbmFtZWRfY29uc3QoY29uc3Qgdm9pZCAqY29udGV4dCwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdm9pZCAqcHRyOworCisJcHRyID0gX190YWxsb2MoY29udGV4dCwgc2l6ZSk7CisJaWYgKHVubGlrZWx5KHB0ciA9PSBOVUxMKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlfdGFsbG9jX3NldF9uYW1lX2NvbnN0KHB0ciwgbmFtZSk7CisKKwlyZXR1cm4gcHRyOworfQorCisvKgorICBtYWtlIGEgc2Vjb25kYXJ5IHJlZmVyZW5jZSB0byBhIHBvaW50ZXIsIGhhbmdpbmcgb2ZmIHRoZSBnaXZlbiBjb250ZXh0LgorICB0aGUgcG9pbnRlciByZW1haW5zIHZhbGlkIHVudGlsIGJvdGggdGhlIG9yaWdpbmFsIGNhbGxlciBhbmQgdGhpcyBnaXZlbgorICBjb250ZXh0IGFyZSBmcmVlZC4KKyAgCisgIHRoZSBtYWpvciB1c2UgZm9yIHRoaXMgaXMgd2hlbiB0d28gZGlmZmVyZW50IHN0cnVjdHVyZXMgbmVlZCB0byByZWZlcmVuY2UgdGhlIAorICBzYW1lIHVuZGVybHlpbmcgZGF0YSwgYW5kIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gZnJlZSB0aGUgdHdvIGluc3RhbmNlcyBzZXBhcmF0ZWx5LAorICBhbmQgaW4gZWl0aGVyIG9yZGVyCisqLwordm9pZCAqX3RhbGxvY19yZWZlcmVuY2UoY29uc3Qgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqcHRyKQoreworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjOworCXN0cnVjdCB0YWxsb2NfcmVmZXJlbmNlX2hhbmRsZSAqaGFuZGxlOworCWlmICh1bmxpa2VseShwdHIgPT0gTlVMTCkpIHJldHVybiBOVUxMOworCisJdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIocHRyKTsKKwloYW5kbGUgPSAoc3RydWN0IHRhbGxvY19yZWZlcmVuY2VfaGFuZGxlICopX3RhbGxvY19uYW1lZF9jb25zdChjb250ZXh0LAorCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCB0YWxsb2NfcmVmZXJlbmNlX2hhbmRsZSksCisJCQkJCQkgICBUQUxMT0NfTUFHSUNfUkVGRVJFTkNFKTsKKwlpZiAodW5saWtlbHkoaGFuZGxlID09IE5VTEwpKSByZXR1cm4gTlVMTDsKKworCS8qIG5vdGUgdGhhdCB3ZSBoYW5nIHRoZSBkZXN0cnVjdG9yIG9mZiB0aGUgaGFuZGxlLCBub3QgdGhlCisJICAgbWFpbiBjb250ZXh0IGFzIHRoYXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3RpbGwgc2V0dXAgdGhlaXIKKwkgICBvd24gZGVzdHJ1Y3RvciBvbiB0aGUgY29udGV4dCBpZiB0aGV5IHdhbnQgdG8gKi8KKwl0YWxsb2Nfc2V0X2Rlc3RydWN0b3IoaGFuZGxlLCB0YWxsb2NfcmVmZXJlbmNlX2Rlc3RydWN0b3IpOworCWhhbmRsZS0+cHRyID0gZGlzY2FyZF9jb25zdF9wKHZvaWQsIHB0cik7CisJX1RMSVNUX0FERCh0Yy0+cmVmcywgaGFuZGxlKTsKKwlyZXR1cm4gaGFuZGxlLT5wdHI7Cit9CisKKworLyogCisgICBpbnRlcm5hbCB0YWxsb2NfZnJlZSBjYWxsCisqLworc3RhdGljIGlubGluZSBpbnQgX3RhbGxvY19mcmVlKHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YzsKKworCWlmICh1bmxpa2VseShwdHIgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCXRjID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKHB0cik7CisKKwlpZiAodW5saWtlbHkodGMtPnJlZnMpKSB7CisJCWludCBpc19jaGlsZDsKKwkJLyogY2hlY2sgdGhpcyBpcyBhIHJlZmVyZW5jZSBmcm9tIGEgY2hpbGQgb3IgZ3JhbnRjaGlsZAorCQkgKiBiYWNrIHRvIGl0J3MgcGFyZW50IG9yIGdyYW50cGFyZW50CisJCSAqCisJCSAqIGluIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgcmVmZXJlbmNlIGFuZAorCQkgKiBjYWxsIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGFsbG9jX2ZyZWUoKSBvbiB0aGUgY3VycmVudAorCQkgKiBwb2ludGVyLgorCQkgKi8KKwkJaXNfY2hpbGQgPSB0YWxsb2NfaXNfcGFyZW50KHRjLT5yZWZzLCBwdHIpOworCQlfdGFsbG9jX2ZyZWUodGMtPnJlZnMpOworCQlpZiAoaXNfY2hpbGQpIHsKKwkJCXJldHVybiBfdGFsbG9jX2ZyZWUocHRyKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHVubGlrZWx5KHRjLT5mbGFncyAmIFRBTExPQ19GTEFHX0xPT1ApKSB7CisJCS8qIHdlIGhhdmUgYSBmcmVlIGxvb3AgLSBzdG9wIGxvb3BpbmcgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHVubGlrZWx5KHRjLT5kZXN0cnVjdG9yKSkgeworCQl0YWxsb2NfZGVzdHJ1Y3Rvcl90IGQgPSB0Yy0+ZGVzdHJ1Y3RvcjsKKwkJaWYgKGQgPT0gKHRhbGxvY19kZXN0cnVjdG9yX3QpLTEpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl0Yy0+ZGVzdHJ1Y3RvciA9ICh0YWxsb2NfZGVzdHJ1Y3Rvcl90KS0xOworCQlpZiAoZChwdHIpID09IC0xKSB7CisJCQl0Yy0+ZGVzdHJ1Y3RvciA9IGQ7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdGMtPmRlc3RydWN0b3IgPSBOVUxMOworCX0KKworCWlmICh0Yy0+cGFyZW50KSB7CisJCV9UTElTVF9SRU1PVkUodGMtPnBhcmVudC0+Y2hpbGQsIHRjKTsKKwkJaWYgKHRjLT5wYXJlbnQtPmNoaWxkKSB7CisJCQl0Yy0+cGFyZW50LT5jaGlsZC0+cGFyZW50ID0gdGMtPnBhcmVudDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh0Yy0+cHJldikgdGMtPnByZXYtPm5leHQgPSB0Yy0+bmV4dDsKKwkJaWYgKHRjLT5uZXh0KSB0Yy0+bmV4dC0+cHJldiA9IHRjLT5wcmV2OworCX0KKworCXRjLT5mbGFncyB8PSBUQUxMT0NfRkxBR19MT09QOworCisJd2hpbGUgKHRjLT5jaGlsZCkgeworCQkvKiB3ZSBuZWVkIHRvIHdvcmsgb3V0IHdobyB3aWxsIG93biBhbiBhYmFuZG9uZWQgY2hpbGQKKwkJICAgaWYgaXQgY2Fubm90IGJlIGZyZWVkLiBJbiBwcmlvcml0eSBvcmRlciwgdGhlIGZpcnN0CisJCSAgIGNob2ljZSBpcyBvd25lciBvZiBhbnkgcmVtYWluaW5nIHJlZmVyZW5jZSB0byB0aGlzCisJCSAgIHBvaW50ZXIsIHRoZSBzZWNvbmQgY2hvaWNlIGlzIG91ciBwYXJlbnQsIGFuZCB0aGUKKwkJICAgZmluYWwgY2hvaWNlIGlzIHRoZSBudWxsIGNvbnRleHQuICovCisJCXZvaWQgKmNoaWxkID0gVENfUFRSX0ZST01fQ0hVTksodGMtPmNoaWxkKTsKKwkJY29uc3Qgdm9pZCAqbmV3X3BhcmVudCA9IG51bGxfY29udGV4dDsKKwkJaWYgKHVubGlrZWx5KHRjLT5jaGlsZC0+cmVmcykpIHsKKwkJCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnAgPSB0YWxsb2NfcGFyZW50X2NodW5rKHRjLT5jaGlsZC0+cmVmcyk7CisJCQlpZiAocCkgbmV3X3BhcmVudCA9IFRDX1BUUl9GUk9NX0NIVU5LKHApOworCQl9CisJCWlmICh1bmxpa2VseShfdGFsbG9jX2ZyZWUoY2hpbGQpID09IC0xKSkgeworCQkJaWYgKG5ld19wYXJlbnQgPT0gbnVsbF9jb250ZXh0KSB7CisJCQkJc3RydWN0IHRhbGxvY19jaHVuayAqcCA9IHRhbGxvY19wYXJlbnRfY2h1bmsocHRyKTsKKwkJCQlpZiAocCkgbmV3X3BhcmVudCA9IFRDX1BUUl9GUk9NX0NIVU5LKHApOworCQkJfQorCQkJdGFsbG9jX3N0ZWFsKG5ld19wYXJlbnQsIGNoaWxkKTsKKwkJfQorCX0KKworCXRjLT5mbGFncyB8PSBUQUxMT0NfRkxBR19GUkVFOworCisJaWYgKHRjLT5mbGFncyAmIChUQUxMT0NfRkxBR19QT09MfFRBTExPQ19GTEFHX1BPT0xNRU0pKSB7CisJCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnBvb2w7CisJCXVuc2lnbmVkIGludCAqcG9vbF9vYmplY3RfY291bnQ7CisKKwkJcG9vbCA9ICh0Yy0+ZmxhZ3MgJiBUQUxMT0NfRkxBR19QT09MKQorCQkJPyB0YyA6IChzdHJ1Y3QgdGFsbG9jX2NodW5rICopdGMtPnBvb2w7CisKKwkJcG9vbF9vYmplY3RfY291bnQgPSB0YWxsb2NfcG9vbF9vYmplY3Rjb3VudChwb29sKTsKKworCQlpZiAoKnBvb2xfb2JqZWN0X2NvdW50ID09IDApIHsKKwkJCXRhbGxvY19hYm9ydCgiUG9vbCBvYmplY3QgY291bnQgemVybyEiKTsKKwkJfQorCisJCSpwb29sX29iamVjdF9jb3VudCAtPSAxOworCisJCWlmICgqcG9vbF9vYmplY3RfY291bnQgPT0gMCkgeworCQkJZnJlZShwb29sKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJZnJlZSh0Yyk7CisJfQorCXJldHVybiAwOworfQorCisvKiAKKyAgIG1vdmUgYSBsdW1wIG9mIG1lbW9yeSBmcm9tIG9uZSB0YWxsb2MgY29udGV4dCB0byBhbm90aGVyIHJldHVybiB0aGUKKyAgIHB0ciBvbiBzdWNjZXNzLCBvciBOVUxMIGlmIGl0IGNvdWxkIG5vdCBiZSB0cmFuc2ZlcnJlZC4KKyAgIHBhc3NpbmcgTlVMTCBhcyBwdHIgd2lsbCBhbHdheXMgcmV0dXJuIE5VTEwgd2l0aCBubyBzaWRlIGVmZmVjdHMuCisqLwordm9pZCAqX3RhbGxvY19zdGVhbChjb25zdCB2b2lkICpuZXdfY3R4LCBjb25zdCB2b2lkICpwdHIpCit7CisJc3RydWN0IHRhbGxvY19jaHVuayAqdGMsICpuZXdfdGM7CisKKwlpZiAodW5saWtlbHkoIXB0cikpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHVubGlrZWx5KG5ld19jdHggPT0gTlVMTCkpIHsKKwkJbmV3X2N0eCA9IG51bGxfY29udGV4dDsKKwl9CisKKwl0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihwdHIpOworCisJaWYgKHVubGlrZWx5KG5ld19jdHggPT0gTlVMTCkpIHsKKwkJaWYgKHRjLT5wYXJlbnQpIHsKKwkJCV9UTElTVF9SRU1PVkUodGMtPnBhcmVudC0+Y2hpbGQsIHRjKTsKKwkJCWlmICh0Yy0+cGFyZW50LT5jaGlsZCkgeworCQkJCXRjLT5wYXJlbnQtPmNoaWxkLT5wYXJlbnQgPSB0Yy0+cGFyZW50OworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHRjLT5wcmV2KSB0Yy0+cHJldi0+bmV4dCA9IHRjLT5uZXh0OworCQkJaWYgKHRjLT5uZXh0KSB0Yy0+bmV4dC0+cHJldiA9IHRjLT5wcmV2OworCQl9CisJCQorCQl0Yy0+cGFyZW50ID0gdGMtPm5leHQgPSB0Yy0+cHJldiA9IE5VTEw7CisJCXJldHVybiBkaXNjYXJkX2NvbnN0X3Aodm9pZCwgcHRyKTsKKwl9CisKKwluZXdfdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIobmV3X2N0eCk7CisKKwlpZiAodW5saWtlbHkodGMgPT0gbmV3X3RjIHx8IHRjLT5wYXJlbnQgPT0gbmV3X3RjKSkgeworCQlyZXR1cm4gZGlzY2FyZF9jb25zdF9wKHZvaWQsIHB0cik7CisJfQorCisJaWYgKHRjLT5wYXJlbnQpIHsKKwkJX1RMSVNUX1JFTU9WRSh0Yy0+cGFyZW50LT5jaGlsZCwgdGMpOworCQlpZiAodGMtPnBhcmVudC0+Y2hpbGQpIHsKKwkJCXRjLT5wYXJlbnQtPmNoaWxkLT5wYXJlbnQgPSB0Yy0+cGFyZW50OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHRjLT5wcmV2KSB0Yy0+cHJldi0+bmV4dCA9IHRjLT5uZXh0OworCQlpZiAodGMtPm5leHQpIHRjLT5uZXh0LT5wcmV2ID0gdGMtPnByZXY7CisJfQorCisJdGMtPnBhcmVudCA9IG5ld190YzsKKwlpZiAobmV3X3RjLT5jaGlsZCkgbmV3X3RjLT5jaGlsZC0+cGFyZW50ID0gTlVMTDsKKwlfVExJU1RfQUREKG5ld190Yy0+Y2hpbGQsIHRjKTsKKworCXJldHVybiBkaXNjYXJkX2NvbnN0X3Aodm9pZCwgcHRyKTsKK30KKworCisKKy8qCisgIHJlbW92ZSBhIHNlY29uZGFyeSByZWZlcmVuY2UgdG8gYSBwb2ludGVyLiBUaGlzIHVuZG8ncyB3aGF0CisgIHRhbGxvY19yZWZlcmVuY2UoKSBoYXMgZG9uZS4gVGhlIGNvbnRleHQgYW5kIHBvaW50ZXIgYXJndW1lbnRzCisgIG11c3QgbWF0Y2ggdGhvc2UgZ2l2ZW4gdG8gYSB0YWxsb2NfcmVmZXJlbmNlKCkKKyovCitzdGF0aWMgaW5saW5lIGludCB0YWxsb2NfdW5yZWZlcmVuY2UoY29uc3Qgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqcHRyKQoreworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKHB0cik7CisJc3RydWN0IHRhbGxvY19yZWZlcmVuY2VfaGFuZGxlICpoOworCisJaWYgKHVubGlrZWx5KGNvbnRleHQgPT0gTlVMTCkpIHsKKwkJY29udGV4dCA9IG51bGxfY29udGV4dDsKKwl9CisKKwlmb3IgKGg9dGMtPnJlZnM7aDtoPWgtPm5leHQpIHsKKwkJc3RydWN0IHRhbGxvY19jaHVuayAqcCA9IHRhbGxvY19wYXJlbnRfY2h1bmsoaCk7CisJCWlmIChwID09IE5VTEwpIHsKKwkJCWlmIChjb250ZXh0ID09IE5VTEwpIGJyZWFrOworCQl9IGVsc2UgaWYgKFRDX1BUUl9GUk9NX0NIVU5LKHApID09IGNvbnRleHQpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChoID09IE5VTEwpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBfdGFsbG9jX2ZyZWUoaCk7Cit9CisKKy8qCisgIHJlbW92ZSBhIHNwZWNpZmljIHBhcmVudCBjb250ZXh0IGZyb20gYSBwb2ludGVyLiBUaGlzIGlzIGEgbW9yZQorICBjb250cm9sbGVkIHZhcmllbnQgb2YgdGFsbG9jX2ZyZWUoKQorKi8KK2ludCB0YWxsb2NfdW5saW5rKGNvbnN0IHZvaWQgKmNvbnRleHQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0Y19wLCAqbmV3X3A7CisJdm9pZCAqbmV3X3BhcmVudDsKKworCWlmIChwdHIgPT0gTlVMTCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNvbnRleHQgPT0gTlVMTCkgeworCQljb250ZXh0ID0gbnVsbF9jb250ZXh0OworCX0KKworCWlmICh0YWxsb2NfdW5yZWZlcmVuY2UoY29udGV4dCwgcHRyKSA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKworCWlmIChjb250ZXh0ID09IE5VTEwpIHsKKwkJaWYgKHRhbGxvY19wYXJlbnRfY2h1bmsocHRyKSAhPSBOVUxMKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodGFsbG9jX2NodW5rX2Zyb21fcHRyKGNvbnRleHQpICE9IHRhbGxvY19wYXJlbnRfY2h1bmsocHRyKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCQorCXRjX3AgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIocHRyKTsKKworCWlmICh0Y19wLT5yZWZzID09IE5VTEwpIHsKKwkJcmV0dXJuIF90YWxsb2NfZnJlZShwdHIpOworCX0KKworCW5ld19wID0gdGFsbG9jX3BhcmVudF9jaHVuayh0Y19wLT5yZWZzKTsKKwlpZiAobmV3X3ApIHsKKwkJbmV3X3BhcmVudCA9IFRDX1BUUl9GUk9NX0NIVU5LKG5ld19wKTsKKwl9IGVsc2UgeworCQluZXdfcGFyZW50ID0gTlVMTDsKKwl9CisKKwlpZiAodGFsbG9jX3VucmVmZXJlbmNlKG5ld19wYXJlbnQsIHB0cikgIT0gMCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJdGFsbG9jX3N0ZWFsKG5ld19wYXJlbnQsIHB0cik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgYWRkIGEgbmFtZSB0byBhbiBleGlzdGluZyBwb2ludGVyIC0gdmFfbGlzdCB2ZXJzaW9uCisqLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICp0YWxsb2Nfc2V0X25hbWVfdihjb25zdCB2b2lkICpwdHIsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkgUFJJTlRGX0FUVFJJQlVURSgyLDApOworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnRhbGxvY19zZXRfbmFtZV92KGNvbnN0IHZvaWQgKnB0ciwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKHB0cik7CisJdGMtPm5hbWUgPSB0YWxsb2NfdmFzcHJpbnRmKHB0ciwgZm10LCBhcCk7CisJaWYgKGxpa2VseSh0Yy0+bmFtZSkpIHsKKwkJX3RhbGxvY19zZXRfbmFtZV9jb25zdCh0Yy0+bmFtZSwgIi5uYW1lIik7CisJfQorCXJldHVybiB0Yy0+bmFtZTsKK30KKworLyoKKyAgYWRkIGEgbmFtZSB0byBhbiBleGlzdGluZyBwb2ludGVyCisqLworY29uc3QgY2hhciAqdGFsbG9jX3NldF9uYW1lKGNvbnN0IHZvaWQgKnB0ciwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCW5hbWUgPSB0YWxsb2Nfc2V0X25hbWVfdihwdHIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJcmV0dXJuIG5hbWU7Cit9CisKKworLyoKKyAgY3JlYXRlIGEgbmFtZWQgdGFsbG9jIHBvaW50ZXIuIEFueSB0YWxsb2MgcG9pbnRlciBjYW4gYmUgbmFtZWQsIGFuZAorICB0YWxsb2NfbmFtZWQoKSBvcGVyYXRlcyBqdXN0IGxpa2UgdGFsbG9jKCkgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIHlvdQorICB0byBuYW1lIHRoZSBwb2ludGVyLgorKi8KK3ZvaWQgKnRhbGxvY19uYW1lZChjb25zdCB2b2lkICpjb250ZXh0LCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2b2lkICpwdHI7CisJY29uc3QgY2hhciAqbmFtZTsKKworCXB0ciA9IF9fdGFsbG9jKGNvbnRleHQsIHNpemUpOworCWlmICh1bmxpa2VseShwdHIgPT0gTlVMTCkpIHJldHVybiBOVUxMOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJbmFtZSA9IHRhbGxvY19zZXRfbmFtZV92KHB0ciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCWlmICh1bmxpa2VseShuYW1lID09IE5VTEwpKSB7CisJCV90YWxsb2NfZnJlZShwdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcHRyOworfQorCisvKgorICByZXR1cm4gdGhlIG5hbWUgb2YgYSB0YWxsb2MgcHRyLCBvciAiVU5OQU1FRCIKKyovCitjb25zdCBjaGFyICp0YWxsb2NfZ2V0X25hbWUoY29uc3Qgdm9pZCAqcHRyKQoreworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjID0gdGFsbG9jX2NodW5rX2Zyb21fcHRyKHB0cik7CisJaWYgKHVubGlrZWx5KHRjLT5uYW1lID09IFRBTExPQ19NQUdJQ19SRUZFUkVOQ0UpKSB7CisJCXJldHVybiAiLnJlZmVyZW5jZSI7CisJfQorCWlmIChsaWtlbHkodGMtPm5hbWUpKSB7CisJCXJldHVybiB0Yy0+bmFtZTsKKwl9CisJcmV0dXJuICJVTk5BTUVEIjsKK30KKworCisvKgorICBjaGVjayBpZiBhIHBvaW50ZXIgaGFzIHRoZSBnaXZlbiBuYW1lLiBJZiBpdCBkb2VzLCByZXR1cm4gdGhlIHBvaW50ZXIsCisgIG90aGVyd2lzZSByZXR1cm4gTlVMTAorKi8KK3ZvaWQgKnRhbGxvY19jaGVja19uYW1lKGNvbnN0IHZvaWQgKnB0ciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBjaGFyICpwbmFtZTsKKwlpZiAodW5saWtlbHkocHRyID09IE5VTEwpKSByZXR1cm4gTlVMTDsKKwlwbmFtZSA9IHRhbGxvY19nZXRfbmFtZShwdHIpOworCWlmIChsaWtlbHkocG5hbWUgPT0gbmFtZSB8fCBzdHJjbXAocG5hbWUsIG5hbWUpID09IDApKSB7CisJCXJldHVybiBkaXNjYXJkX2NvbnN0X3Aodm9pZCwgcHRyKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHRhbGxvY19hYm9ydF90eXBlX21pc3NtYXRjaChjb25zdCBjaGFyICpsb2NhdGlvbiwKKwkJCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJY29uc3QgY2hhciAqZXhwZWN0ZWQpCit7CisJY29uc3QgY2hhciAqcmVhc29uOworCisJcmVhc29uID0gdGFsbG9jX2FzcHJpbnRmKE5VTEwsCisJCQkJICIlczogVHlwZSBtaXNtYXRjaDogbmFtZVslc10gZXhwZWN0ZWRbJXNdIiwKKwkJCQkgbG9jYXRpb24sCisJCQkJIG5hbWU/bmFtZToiTlVMTCIsCisJCQkJIGV4cGVjdGVkKTsKKwlpZiAoIXJlYXNvbikgeworCQlyZWFzb24gPSAiVHlwZSBtaXNtYXRjaCI7CisJfQorCisJdGFsbG9jX2Fib3J0KHJlYXNvbik7Cit9CisKK3ZvaWQgKl90YWxsb2NfZ2V0X3R5cGVfYWJvcnQoY29uc3Qgdm9pZCAqcHRyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpsb2NhdGlvbikKK3sKKwljb25zdCBjaGFyICpwbmFtZTsKKworCWlmICh1bmxpa2VseShwdHIgPT0gTlVMTCkpIHsKKwkJdGFsbG9jX2Fib3J0X3R5cGVfbWlzc21hdGNoKGxvY2F0aW9uLCBOVUxMLCBuYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcG5hbWUgPSB0YWxsb2NfZ2V0X25hbWUocHRyKTsKKwlpZiAobGlrZWx5KHBuYW1lID09IG5hbWUgfHwgc3RyY21wKHBuYW1lLCBuYW1lKSA9PSAwKSkgeworCQlyZXR1cm4gZGlzY2FyZF9jb25zdF9wKHZvaWQsIHB0cik7CisJfQorCisJdGFsbG9jX2Fib3J0X3R5cGVfbWlzc21hdGNoKGxvY2F0aW9uLCBwbmFtZSwgbmFtZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgIHRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiB0YWxsb2MKKyovCit2b2lkICp0YWxsb2NfaW5pdChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXZvaWQgKnB0cjsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyoKKwkgKiBzYW1iYTMgZXhwZWN0cyB0YWxsb2NfcmVwb3J0X2RlcHRoX2NiKE5VTEwsIC4uLikKKwkgKiByZXBvcnRzIGFsbCB0YWxsb2MnZWQgbWVtb3J5LCBzbyB3ZSBuZWVkIHRvIGVuYWJsZQorCSAqIG51bGxfdHJhY2tpbmcKKwkgKi8KKwl0YWxsb2NfZW5hYmxlX251bGxfdHJhY2tpbmcoKTsKKworCXB0ciA9IF9fdGFsbG9jKE5VTEwsIDApOworCWlmICh1bmxpa2VseShwdHIgPT0gTlVMTCkpIHJldHVybiBOVUxMOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJbmFtZSA9IHRhbGxvY19zZXRfbmFtZV92KHB0ciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCWlmICh1bmxpa2VseShuYW1lID09IE5VTEwpKSB7CisJCV90YWxsb2NfZnJlZShwdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcHRyOworfQorCisvKgorICB0aGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBTYW1iYTMgdGFsbG9jX2Rlc3Ryb3lfcG9vbCBmdW5jdGlvbmFsaXR5LiBJdAorICBzaG91bGQgcHJvYmFibHkgbm90IGJlIHVzZWQgaW4gbmV3IGNvZGUuIEl0J3MgaW4gaGVyZSB0byBrZWVwIHRoZSB0YWxsb2MKKyAgY29kZSBjb25zaXN0ZW50IGFjcm9zcyBTYW1iYSAzIGFuZCA0LgorKi8KK3ZvaWQgdGFsbG9jX2ZyZWVfY2hpbGRyZW4odm9pZCAqcHRyKQoreworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjOworCisJaWYgKHVubGlrZWx5KHB0ciA9PSBOVUxMKSkgeworCQlyZXR1cm47CisJfQorCisJdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIocHRyKTsKKworCXdoaWxlICh0Yy0+Y2hpbGQpIHsKKwkJLyogd2UgbmVlZCB0byB3b3JrIG91dCB3aG8gd2lsbCBvd24gYW4gYWJhbmRvbmVkIGNoaWxkCisJCSAgIGlmIGl0IGNhbm5vdCBiZSBmcmVlZC4gSW4gcHJpb3JpdHkgb3JkZXIsIHRoZSBmaXJzdAorCQkgICBjaG9pY2UgaXMgb3duZXIgb2YgYW55IHJlbWFpbmluZyByZWZlcmVuY2UgdG8gdGhpcworCQkgICBwb2ludGVyLCB0aGUgc2Vjb25kIGNob2ljZSBpcyBvdXIgcGFyZW50LCBhbmQgdGhlCisJCSAgIGZpbmFsIGNob2ljZSBpcyB0aGUgbnVsbCBjb250ZXh0LiAqLworCQl2b2lkICpjaGlsZCA9IFRDX1BUUl9GUk9NX0NIVU5LKHRjLT5jaGlsZCk7CisJCWNvbnN0IHZvaWQgKm5ld19wYXJlbnQgPSBudWxsX2NvbnRleHQ7CisJCWlmICh1bmxpa2VseSh0Yy0+Y2hpbGQtPnJlZnMpKSB7CisJCQlzdHJ1Y3QgdGFsbG9jX2NodW5rICpwID0gdGFsbG9jX3BhcmVudF9jaHVuayh0Yy0+Y2hpbGQtPnJlZnMpOworCQkJaWYgKHApIG5ld19wYXJlbnQgPSBUQ19QVFJfRlJPTV9DSFVOSyhwKTsKKwkJfQorCQlpZiAodW5saWtlbHkoX3RhbGxvY19mcmVlKGNoaWxkKSA9PSAtMSkpIHsKKwkJCWlmIChuZXdfcGFyZW50ID09IG51bGxfY29udGV4dCkgeworCQkJCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnAgPSB0YWxsb2NfcGFyZW50X2NodW5rKHB0cik7CisJCQkJaWYgKHApIG5ld19wYXJlbnQgPSBUQ19QVFJfRlJPTV9DSFVOSyhwKTsKKwkJCX0KKwkJCXRhbGxvY19zdGVhbChuZXdfcGFyZW50LCBjaGlsZCk7CisJCX0KKwl9CisKKwlpZiAoKHRjLT5mbGFncyAmIFRBTExPQ19GTEFHX1BPT0wpCisJICAgICYmICgqdGFsbG9jX3Bvb2xfb2JqZWN0Y291bnQodGMpID09IDEpKSB7CisJCXRjLT5wb29sID0gKChjaGFyICopdGMgKyBUQ19IRFJfU0laRSArIFRBTExPQ19QT09MX0hEUl9TSVpFKTsKKyNpZiBkZWZpbmVkKERFVkVMT1BFUikgJiYgZGVmaW5lZChWQUxHUklORF9NQUtFX01FTV9OT0FDQ0VTUykKKwkJVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MoCisJCQl0Yy0+cG9vbCwgdGMtPnNpemUgLSBUQUxMT0NfUE9PTF9IRFJfU0laRSk7CisjZW5kaWYKKwl9Cit9CisKKy8qIAorICAgQWxsb2NhdGUgYSBiaXQgb2YgbWVtb3J5IGFzIGEgY2hpbGQgb2YgYW4gZXhpc3RpbmcgcG9pbnRlcgorKi8KK3ZvaWQgKl90YWxsb2MoY29uc3Qgdm9pZCAqY29udGV4dCwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIF9fdGFsbG9jKGNvbnRleHQsIHNpemUpOworfQorCisvKgorICBleHRlcm5hbGx5IGNhbGxhYmxlIHRhbGxvY19zZXRfbmFtZV9jb25zdCgpCisqLwordm9pZCB0YWxsb2Nfc2V0X25hbWVfY29uc3QoY29uc3Qgdm9pZCAqcHRyLCBjb25zdCBjaGFyICpuYW1lKQoreworCV90YWxsb2Nfc2V0X25hbWVfY29uc3QocHRyLCBuYW1lKTsKK30KKworLyoKKyAgY3JlYXRlIGEgbmFtZWQgdGFsbG9jIHBvaW50ZXIuIEFueSB0YWxsb2MgcG9pbnRlciBjYW4gYmUgbmFtZWQsIGFuZAorICB0YWxsb2NfbmFtZWQoKSBvcGVyYXRlcyBqdXN0IGxpa2UgdGFsbG9jKCkgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIHlvdQorICB0byBuYW1lIHRoZSBwb2ludGVyLgorKi8KK3ZvaWQgKnRhbGxvY19uYW1lZF9jb25zdChjb25zdCB2b2lkICpjb250ZXh0LCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gX3RhbGxvY19uYW1lZF9jb25zdChjb250ZXh0LCBzaXplLCBuYW1lKTsKK30KKworLyogCisgICBmcmVlIGEgdGFsbG9jIHBvaW50ZXIuIFRoaXMgYWxzbyBmcmVlcyBhbGwgY2hpbGQgcG9pbnRlcnMgb2YgdGhpcyAKKyAgIHBvaW50ZXIgcmVjdXJzaXZlbHkKKworICAgcmV0dXJuIDAgaWYgdGhlIG1lbW9yeSBpcyBhY3R1YWxseSBmcmVlZCwgb3RoZXJ3aXNlIC0xLiBUaGUgbWVtb3J5CisgICB3aWxsIG5vdCBiZSBmcmVlZCBpZiB0aGUgcmVmX2NvdW50IGlzID4gMSBvciB0aGUgZGVzdHJ1Y3RvciAoaWYKKyAgIGFueSkgcmV0dXJucyBub24temVybworKi8KK2ludCB0YWxsb2NfZnJlZSh2b2lkICpwdHIpCit7CisJcmV0dXJuIF90YWxsb2NfZnJlZShwdHIpOworfQorCisKKworLyoKKyAgQSB0YWxsb2MgdmVyc2lvbiBvZiByZWFsbG9jLiBUaGUgY29udGV4dCBhcmd1bWVudCBpcyBvbmx5IHVzZWQgaWYKKyAgcHRyIGlzIE5VTEwKKyovCit2b2lkICpfdGFsbG9jX3JlYWxsb2MoY29uc3Qgdm9pZCAqY29udGV4dCwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YzsKKwl2b2lkICpuZXdfcHRyOworCWJvb2wgbWFsbG9jZWQgPSBmYWxzZTsKKworCS8qIHNpemUgemVybyBpcyBlcXVpdmFsZW50IHRvIGZyZWUoKSAqLworCWlmICh1bmxpa2VseShzaXplID09IDApKSB7CisJCV90YWxsb2NfZnJlZShwdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAodW5saWtlbHkoc2l6ZSA+PSBNQVhfVEFMTE9DX1NJWkUpKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIHJlYWxsb2MoTlVMTCkgaXMgZXF1aXZhbGVudCB0byBtYWxsb2MoKSAqLworCWlmIChwdHIgPT0gTlVMTCkgeworCQlyZXR1cm4gX3RhbGxvY19uYW1lZF9jb25zdChjb250ZXh0LCBzaXplLCBuYW1lKTsKKwl9CisKKwl0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihwdHIpOworCisJLyogZG9uJ3QgYWxsb3cgcmVhbGxvYyBvbiByZWZlcmVuY2VkIHBvaW50ZXJzICovCisJaWYgKHVubGlrZWx5KHRjLT5yZWZzKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBkb24ndCBsZXQgYW55Ym9keSB0cnkgdG8gcmVhbGxvYyBhIHRhbGxvY19wb29sICovCisJaWYgKHVubGlrZWx5KHRjLT5mbGFncyAmIFRBTExPQ19GTEFHX1BPT0wpKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGRvbid0IHNocmluayBpZiB3ZSBoYXZlIGxlc3MgdGhhbiAxayB0byBnYWluICovCisJaWYgKChzaXplIDwgdGMtPnNpemUpICYmICgodGMtPnNpemUgLSBzaXplKSA8IDEwMjQpKSB7CisJCXRjLT5zaXplID0gc2l6ZTsKKwkJcmV0dXJuIHB0cjsKKwl9CisKKwkvKiBieSByZXNldHRpbmcgbWFnaWMgd2UgY2F0Y2ggdXNlcnMgb2YgdGhlIG9sZCBtZW1vcnkgKi8KKwl0Yy0+ZmxhZ3MgfD0gVEFMTE9DX0ZMQUdfRlJFRTsKKworI2lmIEFMV0FZU19SRUFMTE9DCisJbmV3X3B0ciA9IG1hbGxvYyhzaXplICsgVENfSERSX1NJWkUpOworCWlmIChuZXdfcHRyKSB7CisJCW1lbWNweShuZXdfcHRyLCB0YywgdGMtPnNpemUgKyBUQ19IRFJfU0laRSk7CisJCWZyZWUodGMpOworCX0KKyNlbHNlCisJaWYgKHRjLT5mbGFncyAmIFRBTExPQ19GTEFHX1BPT0xNRU0pIHsKKworCQluZXdfcHRyID0gdGFsbG9jX2FsbG9jX3Bvb2wodGMsIHNpemUgKyBUQ19IRFJfU0laRSk7CisJCSp0YWxsb2NfcG9vbF9vYmplY3Rjb3VudCgoc3RydWN0IHRhbGxvY19jaHVuayAqKQorCQkJCQkgKHRjLT5wb29sKSkgLT0gMTsKKworCQlpZiAobmV3X3B0ciA9PSBOVUxMKSB7CisJCQluZXdfcHRyID0gbWFsbG9jKFRDX0hEUl9TSVpFK3NpemUpOworCQkJbWFsbG9jZWQgPSB0cnVlOworCQl9CisKKwkJaWYgKG5ld19wdHIpIHsKKwkJCW1lbWNweShuZXdfcHRyLCB0YywgTUlOKHRjLT5zaXplLHNpemUpICsgVENfSERSX1NJWkUpOworCQl9CisJfQorCWVsc2UgeworCQluZXdfcHRyID0gcmVhbGxvYyh0Yywgc2l6ZSArIFRDX0hEUl9TSVpFKTsKKwl9CisjZW5kaWYKKwlpZiAodW5saWtlbHkoIW5ld19wdHIpKSB7CQorCQl0Yy0+ZmxhZ3MgJj0gflRBTExPQ19GTEFHX0ZSRUU7IAorCQlyZXR1cm4gTlVMTDsgCisJfQorCisJdGMgPSAoc3RydWN0IHRhbGxvY19jaHVuayAqKW5ld19wdHI7CisJdGMtPmZsYWdzICY9IH5UQUxMT0NfRkxBR19GUkVFOworCWlmIChtYWxsb2NlZCkgeworCQl0Yy0+ZmxhZ3MgJj0gflRBTExPQ19GTEFHX1BPT0xNRU07CisJfQorCWlmICh0Yy0+cGFyZW50KSB7CisJCXRjLT5wYXJlbnQtPmNoaWxkID0gdGM7CisJfQorCWlmICh0Yy0+Y2hpbGQpIHsKKwkJdGMtPmNoaWxkLT5wYXJlbnQgPSB0YzsKKwl9CisKKwlpZiAodGMtPnByZXYpIHsKKwkJdGMtPnByZXYtPm5leHQgPSB0YzsKKwl9CisJaWYgKHRjLT5uZXh0KSB7CisJCXRjLT5uZXh0LT5wcmV2ID0gdGM7CisJfQorCisJdGMtPnNpemUgPSBzaXplOworCV90YWxsb2Nfc2V0X25hbWVfY29uc3QoVENfUFRSX0ZST01fQ0hVTksodGMpLCBuYW1lKTsKKworCXJldHVybiBUQ19QVFJfRlJPTV9DSFVOSyh0Yyk7Cit9CisKKy8qCisgIGEgd3JhcHBlciBhcm91bmQgdGFsbG9jX3N0ZWFsKCkgZm9yIHNpdHVhdGlvbnMgd2hlcmUgeW91IGFyZSBtb3ZpbmcgYSBwb2ludGVyCisgIGJldHdlZW4gdHdvIHN0cnVjdHVyZXMsIGFuZCB3YW50IHRoZSBvbGQgcG9pbnRlciB0byBiZSBzZXQgdG8gTlVMTAorKi8KK3ZvaWQgKl90YWxsb2NfbW92ZShjb25zdCB2b2lkICpuZXdfY3R4LCBjb25zdCB2b2lkICpfcHB0cikKK3sKKwljb25zdCB2b2lkICoqcHB0ciA9IGRpc2NhcmRfY29uc3RfcChjb25zdCB2b2lkICosX3BwdHIpOworCXZvaWQgKnJldCA9IF90YWxsb2Nfc3RlYWwobmV3X2N0eCwgKnBwdHIpOworCSgqcHB0cikgPSBOVUxMOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgIHJldHVybiB0aGUgdG90YWwgc2l6ZSBvZiBhIHRhbGxvYyBwb29sIChzdWJ0cmVlKQorKi8KK3NpemVfdCB0YWxsb2NfdG90YWxfc2l6ZShjb25zdCB2b2lkICpwdHIpCit7CisJc2l6ZV90IHRvdGFsID0gMDsKKwlzdHJ1Y3QgdGFsbG9jX2NodW5rICpjLCAqdGM7CisKKwlpZiAocHRyID09IE5VTEwpIHsKKwkJcHRyID0gbnVsbF9jb250ZXh0OworCX0KKwlpZiAocHRyID09IE5VTEwpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIocHRyKTsKKworCWlmICh0Yy0+ZmxhZ3MgJiBUQUxMT0NfRkxBR19MT09QKSB7CisJCXJldHVybiAwOworCX0KKworCXRjLT5mbGFncyB8PSBUQUxMT0NfRkxBR19MT09QOworCisJdG90YWwgPSB0Yy0+c2l6ZTsKKwlmb3IgKGM9dGMtPmNoaWxkO2M7Yz1jLT5uZXh0KSB7CisJCXRvdGFsICs9IHRhbGxvY190b3RhbF9zaXplKFRDX1BUUl9GUk9NX0NIVU5LKGMpKTsKKwl9CisKKwl0Yy0+ZmxhZ3MgJj0gflRBTExPQ19GTEFHX0xPT1A7CisKKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qCisgIHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBpbiBhIHRhbGxvYyBwb29sIChzdWJ0cmVlKQorKi8KK3NpemVfdCB0YWxsb2NfdG90YWxfYmxvY2tzKGNvbnN0IHZvaWQgKnB0cikKK3sKKwlzaXplX3QgdG90YWwgPSAwOworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKmMsICp0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihwdHIpOworCisJaWYgKHRjLT5mbGFncyAmIFRBTExPQ19GTEFHX0xPT1ApIHsKKwkJcmV0dXJuIDA7CisJfQorCisJdGMtPmZsYWdzIHw9IFRBTExPQ19GTEFHX0xPT1A7CisKKwl0b3RhbCsrOworCWZvciAoYz10Yy0+Y2hpbGQ7YztjPWMtPm5leHQpIHsKKwkJdG90YWwgKz0gdGFsbG9jX3RvdGFsX2Jsb2NrcyhUQ19QVFJfRlJPTV9DSFVOSyhjKSk7CisJfQorCisJdGMtPmZsYWdzICY9IH5UQUxMT0NfRkxBR19MT09QOworCisJcmV0dXJuIHRvdGFsOworfQorCisvKgorICByZXR1cm4gdGhlIG51bWJlciBvZiBleHRlcm5hbCByZWZlcmVuY2VzIHRvIGEgcG9pbnRlcgorKi8KK3NpemVfdCB0YWxsb2NfcmVmZXJlbmNlX2NvdW50KGNvbnN0IHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihwdHIpOworCXN0cnVjdCB0YWxsb2NfcmVmZXJlbmNlX2hhbmRsZSAqaDsKKwlzaXplX3QgcmV0ID0gMDsKKworCWZvciAoaD10Yy0+cmVmcztoO2g9aC0+bmV4dCkgeworCQlyZXQrKzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAgcmVwb3J0IG9uIG1lbW9yeSB1c2FnZSBieSBhbGwgY2hpbGRyZW4gb2YgYSBwb2ludGVyLCBnaXZpbmcgYSBmdWxsIHRyZWUgdmlldworKi8KK3ZvaWQgdGFsbG9jX3JlcG9ydF9kZXB0aF9jYihjb25zdCB2b2lkICpwdHIsIGludCBkZXB0aCwgaW50IG1heF9kZXB0aCwKKwkJCSAgICB2b2lkICgqY2FsbGJhY2spKGNvbnN0IHZvaWQgKnB0ciwKKwkJCSAgCQkgICAgIGludCBkZXB0aCwgaW50IG1heF9kZXB0aCwKKwkJCQkJICAgICBpbnQgaXNfcmVmLAorCQkJCQkgICAgIHZvaWQgKnByaXZhdGVfZGF0YSksCisJCQkgICAgdm9pZCAqcHJpdmF0ZV9kYXRhKQoreworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKmMsICp0YzsKKworCWlmIChwdHIgPT0gTlVMTCkgeworCQlwdHIgPSBudWxsX2NvbnRleHQ7CisJfQorCWlmIChwdHIgPT0gTlVMTCkgcmV0dXJuOworCisJdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIocHRyKTsKKworCWlmICh0Yy0+ZmxhZ3MgJiBUQUxMT0NfRkxBR19MT09QKSB7CisJCXJldHVybjsKKwl9CisKKwljYWxsYmFjayhwdHIsIGRlcHRoLCBtYXhfZGVwdGgsIDAsIHByaXZhdGVfZGF0YSk7CisKKwlpZiAobWF4X2RlcHRoID49IDAgJiYgZGVwdGggPj0gbWF4X2RlcHRoKSB7CisJCXJldHVybjsKKwl9CisKKwl0Yy0+ZmxhZ3MgfD0gVEFMTE9DX0ZMQUdfTE9PUDsKKwlmb3IgKGM9dGMtPmNoaWxkO2M7Yz1jLT5uZXh0KSB7CisJCWlmIChjLT5uYW1lID09IFRBTExPQ19NQUdJQ19SRUZFUkVOQ0UpIHsKKwkJCXN0cnVjdCB0YWxsb2NfcmVmZXJlbmNlX2hhbmRsZSAqaCA9IChzdHJ1Y3QgdGFsbG9jX3JlZmVyZW5jZV9oYW5kbGUgKilUQ19QVFJfRlJPTV9DSFVOSyhjKTsKKwkJCWNhbGxiYWNrKGgtPnB0ciwgZGVwdGggKyAxLCBtYXhfZGVwdGgsIDEsIHByaXZhdGVfZGF0YSk7CisJCX0gZWxzZSB7CisJCQl0YWxsb2NfcmVwb3J0X2RlcHRoX2NiKFRDX1BUUl9GUk9NX0NIVU5LKGMpLCBkZXB0aCArIDEsIG1heF9kZXB0aCwgY2FsbGJhY2ssIHByaXZhdGVfZGF0YSk7CisJCX0KKwl9CisJdGMtPmZsYWdzICY9IH5UQUxMT0NfRkxBR19MT09QOworfQorCitzdGF0aWMgdm9pZCB0YWxsb2NfcmVwb3J0X2RlcHRoX0ZJTEVfaGVscGVyKGNvbnN0IHZvaWQgKnB0ciwgaW50IGRlcHRoLCBpbnQgbWF4X2RlcHRoLCBpbnQgaXNfcmVmLCB2b2lkICpfZikKK3sKKwljb25zdCBjaGFyICpuYW1lID0gdGFsbG9jX2dldF9uYW1lKHB0cik7CisJRklMRSAqZiA9IChGSUxFICopX2Y7CisKKwlpZiAoaXNfcmVmKSB7CisJCWZwcmludGYoZiwgIiUqc3JlZmVyZW5jZSB0bzogJXNcbiIsIGRlcHRoKjQsICIiLCBuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkZXB0aCA9PSAwKSB7CisJCWZwcmludGYoZiwiJXN0YWxsb2MgcmVwb3J0IG9uICclcycgKHRvdGFsICU2bHUgYnl0ZXMgaW4gJTNsdSBibG9ja3MpXG4iLCAKKwkJCShtYXhfZGVwdGggPCAwID8gImZ1bGwgIiA6IiIpLCBuYW1lLAorCQkJKHVuc2lnbmVkIGxvbmcpdGFsbG9jX3RvdGFsX3NpemUocHRyKSwKKwkJCSh1bnNpZ25lZCBsb25nKXRhbGxvY190b3RhbF9ibG9ja3MocHRyKSk7CisJCXJldHVybjsKKwl9CisKKwlmcHJpbnRmKGYsICIlKnMlLTMwcyBjb250YWlucyAlNmx1IGJ5dGVzIGluICUzbHUgYmxvY2tzIChyZWYgJWQpICVwXG4iLCAKKwkJZGVwdGgqNCwgIiIsCisJCW5hbWUsCisJCSh1bnNpZ25lZCBsb25nKXRhbGxvY190b3RhbF9zaXplKHB0ciksCisJCSh1bnNpZ25lZCBsb25nKXRhbGxvY190b3RhbF9ibG9ja3MocHRyKSwKKwkJKGludCl0YWxsb2NfcmVmZXJlbmNlX2NvdW50KHB0ciksIHB0cik7CisKKyNpZiAwCisJZnByaW50ZihmLCAiY29udGVudDogIik7CisJaWYgKHRhbGxvY190b3RhbF9zaXplKHB0cikpIHsKKwkJaW50IHRvdCA9IHRhbGxvY190b3RhbF9zaXplKHB0cik7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCB0b3Q7IGkrKykgeworCQkJaWYgKCgoKGNoYXIgKilwdHIpW2ldID4gMzEpICYmICgoKGNoYXIgKilwdHIpW2ldIDwgMTI2KSkgeworCQkJCWZwcmludGYoZiwgIiVjIiwgKChjaGFyICopcHRyKVtpXSk7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoZiwgIn4lMDJ4IiwgKChjaGFyICopcHRyKVtpXSk7CisJCQl9CisJCX0KKwl9CisJZnByaW50ZihmLCAiXG4iKTsKKyNlbmRpZgorfQorCisvKgorICByZXBvcnQgb24gbWVtb3J5IHVzYWdlIGJ5IGFsbCBjaGlsZHJlbiBvZiBhIHBvaW50ZXIsIGdpdmluZyBhIGZ1bGwgdHJlZSB2aWV3CisqLwordm9pZCB0YWxsb2NfcmVwb3J0X2RlcHRoX2ZpbGUoY29uc3Qgdm9pZCAqcHRyLCBpbnQgZGVwdGgsIGludCBtYXhfZGVwdGgsIEZJTEUgKmYpCit7CisJdGFsbG9jX3JlcG9ydF9kZXB0aF9jYihwdHIsIGRlcHRoLCBtYXhfZGVwdGgsIHRhbGxvY19yZXBvcnRfZGVwdGhfRklMRV9oZWxwZXIsIGYpOworCWZmbHVzaChmKTsKK30KKworLyoKKyAgcmVwb3J0IG9uIG1lbW9yeSB1c2FnZSBieSBhbGwgY2hpbGRyZW4gb2YgYSBwb2ludGVyLCBnaXZpbmcgYSBmdWxsIHRyZWUgdmlldworKi8KK3ZvaWQgdGFsbG9jX3JlcG9ydF9mdWxsKGNvbnN0IHZvaWQgKnB0ciwgRklMRSAqZikKK3sKKwl0YWxsb2NfcmVwb3J0X2RlcHRoX2ZpbGUocHRyLCAwLCAtMSwgZik7Cit9CisKKy8qCisgIHJlcG9ydCBvbiBtZW1vcnkgdXNhZ2UgYnkgYWxsIGNoaWxkcmVuIG9mIGEgcG9pbnRlcgorKi8KK3ZvaWQgdGFsbG9jX3JlcG9ydChjb25zdCB2b2lkICpwdHIsIEZJTEUgKmYpCit7CisJdGFsbG9jX3JlcG9ydF9kZXB0aF9maWxlKHB0ciwgMCwgMSwgZik7Cit9CisKKy8qCisgIHJlcG9ydCBvbiBhbnkgbWVtb3J5IGhhbmdpbmcgb2ZmIHRoZSBudWxsIGNvbnRleHQKKyovCitzdGF0aWMgdm9pZCB0YWxsb2NfcmVwb3J0X251bGwodm9pZCkKK3sKKwlpZiAodGFsbG9jX3RvdGFsX3NpemUobnVsbF9jb250ZXh0KSAhPSAwKSB7CisJCXRhbGxvY19yZXBvcnQobnVsbF9jb250ZXh0LCBzdGRlcnIpOworCX0KK30KKworLyoKKyAgcmVwb3J0IG9uIGFueSBtZW1vcnkgaGFuZ2luZyBvZmYgdGhlIG51bGwgY29udGV4dAorKi8KK3N0YXRpYyB2b2lkIHRhbGxvY19yZXBvcnRfbnVsbF9mdWxsKHZvaWQpCit7CisJaWYgKHRhbGxvY190b3RhbF9zaXplKG51bGxfY29udGV4dCkgIT0gMCkgeworCQl0YWxsb2NfcmVwb3J0X2Z1bGwobnVsbF9jb250ZXh0LCBzdGRlcnIpOworCX0KK30KKworLyoKKyAgZW5hYmxlIHRyYWNraW5nIG9mIHRoZSBOVUxMIGNvbnRleHQKKyovCit2b2lkIHRhbGxvY19lbmFibGVfbnVsbF90cmFja2luZyh2b2lkKQoreworCWlmIChudWxsX2NvbnRleHQgPT0gTlVMTCkgeworCQludWxsX2NvbnRleHQgPSBfdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDAsICJudWxsX2NvbnRleHQiKTsKKwl9Cit9CisKKy8qCisgIGRpc2FibGUgdHJhY2tpbmcgb2YgdGhlIE5VTEwgY29udGV4dAorKi8KK3ZvaWQgdGFsbG9jX2Rpc2FibGVfbnVsbF90cmFja2luZyh2b2lkKQoreworCV90YWxsb2NfZnJlZShudWxsX2NvbnRleHQpOworCW51bGxfY29udGV4dCA9IE5VTEw7Cit9CisKKy8qCisgIGVuYWJsZSBsZWFrIHJlcG9ydGluZyBvbiBleGl0CisqLwordm9pZCB0YWxsb2NfZW5hYmxlX2xlYWtfcmVwb3J0KHZvaWQpCit7CisJdGFsbG9jX2VuYWJsZV9udWxsX3RyYWNraW5nKCk7CisJYXRleGl0KHRhbGxvY19yZXBvcnRfbnVsbCk7Cit9CisKKy8qCisgIGVuYWJsZSBmdWxsIGxlYWsgcmVwb3J0aW5nIG9uIGV4aXQKKyovCit2b2lkIHRhbGxvY19lbmFibGVfbGVha19yZXBvcnRfZnVsbCh2b2lkKQoreworCXRhbGxvY19lbmFibGVfbnVsbF90cmFja2luZygpOworCWF0ZXhpdCh0YWxsb2NfcmVwb3J0X251bGxfZnVsbCk7Cit9CisKKy8qIAorICAgdGFsbG9jIGFuZCB6ZXJvIG1lbW9yeS4gCisqLwordm9pZCAqX3RhbGxvY196ZXJvKGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdm9pZCAqcCA9IF90YWxsb2NfbmFtZWRfY29uc3QoY3R4LCBzaXplLCBuYW1lKTsKKworCWlmIChwKSB7CisJCW1lbXNldChwLCAnXDAnLCBzaXplKTsKKwl9CisKKwlyZXR1cm4gcDsKK30KKworLyoKKyAgbWVtZHVwIHdpdGggYSB0YWxsb2MuIAorKi8KK3ZvaWQgKl90YWxsb2NfbWVtZHVwKGNvbnN0IHZvaWQgKnQsIGNvbnN0IHZvaWQgKnAsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKQoreworCXZvaWQgKm5ld3AgPSBfdGFsbG9jX25hbWVkX2NvbnN0KHQsIHNpemUsIG5hbWUpOworCisJaWYgKGxpa2VseShuZXdwKSkgeworCQltZW1jcHkobmV3cCwgcCwgc2l6ZSk7CisJfQorCisJcmV0dXJuIG5ld3A7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqX190YWxsb2Nfc3RybGVuZHVwKGNvbnN0IHZvaWQgKnQsIGNvbnN0IGNoYXIgKnAsIHNpemVfdCBsZW4pCit7CisJY2hhciAqcmV0OworCisJcmV0ID0gKGNoYXIgKilfX3RhbGxvYyh0LCBsZW4gKyAxKTsKKwlpZiAodW5saWtlbHkoIXJldCkpIHJldHVybiBOVUxMOworCisJbWVtY3B5KHJldCwgcCwgbGVuKTsKKwlyZXRbbGVuXSA9IDA7CisKKwlfdGFsbG9jX3NldF9uYW1lX2NvbnN0KHJldCwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICBzdHJkdXAgd2l0aCBhIHRhbGxvYworKi8KK2NoYXIgKnRhbGxvY19zdHJkdXAoY29uc3Qgdm9pZCAqdCwgY29uc3QgY2hhciAqcCkKK3sKKwlpZiAodW5saWtlbHkoIXApKSByZXR1cm4gTlVMTDsKKwlyZXR1cm4gX190YWxsb2Nfc3RybGVuZHVwKHQsIHAsIHN0cmxlbihwKSk7Cit9CisKKy8qCisgIHN0cm5kdXAgd2l0aCBhIHRhbGxvYworKi8KK2NoYXIgKnRhbGxvY19zdHJuZHVwKGNvbnN0IHZvaWQgKnQsIGNvbnN0IGNoYXIgKnAsIHNpemVfdCBuKQoreworCWlmICh1bmxpa2VseSghcCkpIHJldHVybiBOVUxMOworCXJldHVybiBfX3RhbGxvY19zdHJsZW5kdXAodCwgcCwgc3RybmxlbihwLCBuKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqX190YWxsb2Nfc3RybGVuZHVwX2FwcGVuZChjaGFyICpzLCBzaXplX3Qgc2xlbiwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqYSwgc2l6ZV90IGFsZW4pCit7CisJY2hhciAqcmV0OworCisJcmV0ID0gdGFsbG9jX3JlYWxsb2MoTlVMTCwgcywgY2hhciwgc2xlbiArIGFsZW4gKyAxKTsKKwlpZiAodW5saWtlbHkoIXJldCkpIHJldHVybiBOVUxMOworCisJLyogYXBwZW5kIHRoZSBzdHJpbmcgYW5kIHRoZSB0cmFpbGluZyBcMCAqLworCW1lbWNweSgmcmV0W3NsZW5dLCBhLCBhbGVuKTsKKwlyZXRbc2xlbithbGVuXSA9IDA7CisKKwlfdGFsbG9jX3NldF9uYW1lX2NvbnN0KHJldCwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQXBwZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgKi8KK2NoYXIgKnRhbGxvY19zdHJkdXBfYXBwZW5kKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmEpCit7CisJaWYgKHVubGlrZWx5KCFzKSkgeworCQlyZXR1cm4gdGFsbG9jX3N0cmR1cChOVUxMLCBhKTsKKwl9CisKKwlpZiAodW5saWtlbHkoIWEpKSB7CisJCXJldHVybiBzOworCX0KKworCXJldHVybiBfX3RhbGxvY19zdHJsZW5kdXBfYXBwZW5kKHMsIHN0cmxlbihzKSwgYSwgc3RybGVuKGEpKTsKK30KKworLyoKKyAqIEFwcGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgdGFsbG9jJ2VkIGJ1ZmZlciwKKyAqIG5vdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgKi8KK2NoYXIgKnRhbGxvY19zdHJkdXBfYXBwZW5kX2J1ZmZlcihjaGFyICpzLCBjb25zdCBjaGFyICphKQoreworCXNpemVfdCBzbGVuOworCisJaWYgKHVubGlrZWx5KCFzKSkgeworCQlyZXR1cm4gdGFsbG9jX3N0cmR1cChOVUxMLCBhKTsKKwl9CisKKwlpZiAodW5saWtlbHkoIWEpKSB7CisJCXJldHVybiBzOworCX0KKworCXNsZW4gPSB0YWxsb2NfZ2V0X3NpemUocyk7CisJaWYgKGxpa2VseShzbGVuID4gMCkpIHsKKwkJc2xlbi0tOworCX0KKworCXJldHVybiBfX3RhbGxvY19zdHJsZW5kdXBfYXBwZW5kKHMsIHNsZW4sIGEsIHN0cmxlbihhKSk7Cit9CisKKy8qCisgKiBBcHBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAqLworY2hhciAqdGFsbG9jX3N0cm5kdXBfYXBwZW5kKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmEsIHNpemVfdCBuKQoreworCWlmICh1bmxpa2VseSghcykpIHsKKwkJcmV0dXJuIHRhbGxvY19zdHJkdXAoTlVMTCwgYSk7CisJfQorCisJaWYgKHVubGlrZWx5KCFhKSkgeworCQlyZXR1cm4gczsKKwl9CisKKwlyZXR1cm4gX190YWxsb2Nfc3RybGVuZHVwX2FwcGVuZChzLCBzdHJsZW4ocyksIGEsIHN0cm5sZW4oYSwgbikpOworfQorCisvKgorICogQXBwZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSB0YWxsb2MnZWQgYnVmZmVyLAorICogbm90IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAqLworY2hhciAqdGFsbG9jX3N0cm5kdXBfYXBwZW5kX2J1ZmZlcihjaGFyICpzLCBjb25zdCBjaGFyICphLCBzaXplX3QgbikKK3sKKwlzaXplX3Qgc2xlbjsKKworCWlmICh1bmxpa2VseSghcykpIHsKKwkJcmV0dXJuIHRhbGxvY19zdHJkdXAoTlVMTCwgYSk7CisJfQorCisJaWYgKHVubGlrZWx5KCFhKSkgeworCQlyZXR1cm4gczsKKwl9CisKKwlzbGVuID0gdGFsbG9jX2dldF9zaXplKHMpOworCWlmIChsaWtlbHkoc2xlbiA+IDApKSB7CisJCXNsZW4tLTsKKwl9CisKKwlyZXR1cm4gX190YWxsb2Nfc3RybGVuZHVwX2FwcGVuZChzLCBzbGVuLCBhLCBzdHJubGVuKGEsIG4pKTsKK30KKworI2lmbmRlZiBIQVZFX1ZBX0NPUFkKKyNpZmRlZiBIQVZFX19fVkFfQ09QWQorI2RlZmluZSB2YV9jb3B5KGRlc3QsIHNyYykgX192YV9jb3B5KGRlc3QsIHNyYykKKyNlbHNlCisjZGVmaW5lIHZhX2NvcHkoZGVzdCwgc3JjKSAoZGVzdCkgPSAoc3JjKQorI2VuZGlmCisjZW5kaWYKKworY2hhciAqdGFsbG9jX3Zhc3ByaW50Zihjb25zdCB2b2lkICp0LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisJaW50IGxlbjsKKwljaGFyICpyZXQ7CisJdmFfbGlzdCBhcDI7CisJY2hhciBjOworCisJLyogdGhpcyBjYWxsIGxvb2tzIHN0cmFuZ2UsIGJ1dCBpdCBtYWtlcyBpdCB3b3JrIG9uIG9sZGVyIHNvbGFyaXMgYm94ZXMgKi8KKwl2YV9jb3B5KGFwMiwgYXApOworCWxlbiA9IHZzbnByaW50ZigmYywgMSwgZm10LCBhcDIpOworCXZhX2VuZChhcDIpOworCWlmICh1bmxpa2VseShsZW4gPCAwKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXQgPSAoY2hhciAqKV9fdGFsbG9jKHQsIGxlbisxKTsKKwlpZiAodW5saWtlbHkoIXJldCkpIHJldHVybiBOVUxMOworCisJdmFfY29weShhcDIsIGFwKTsKKwl2c25wcmludGYocmV0LCBsZW4rMSwgZm10LCBhcDIpOworCXZhX2VuZChhcDIpOworCisJX3RhbGxvY19zZXRfbmFtZV9jb25zdChyZXQsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICBQZXJmb3JtIHN0cmluZyBmb3JtYXR0aW5nLCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBuZXdseSBhbGxvY2F0ZWQKKyAgbWVtb3J5IGhvbGRpbmcgdGhlIHJlc3VsdCwgaW5zaWRlIGEgbWVtb3J5IHBvb2wuCisgKi8KK2NoYXIgKnRhbGxvY19hc3ByaW50Zihjb25zdCB2b2lkICp0LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWNoYXIgKnJldDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXJldCA9IHRhbGxvY192YXNwcmludGYodCwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKl9fdGFsbG9jX3Zhc2xlbnByaW50Zl9hcHBlbmQoY2hhciAqcywgc2l6ZV90IHNsZW4sCisJCQkJCQkgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQorCQkJCQkJIFBSSU5URl9BVFRSSUJVVEUoMywwKTsKKworc3RhdGljIGlubGluZSBjaGFyICpfX3RhbGxvY192YXNsZW5wcmludGZfYXBwZW5kKGNoYXIgKnMsIHNpemVfdCBzbGVuLAorCQkJCQkJIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKwlzc2l6ZV90IGFsZW47CisJdmFfbGlzdCBhcDI7CisJY2hhciBjOworCisJdmFfY29weShhcDIsIGFwKTsKKwlhbGVuID0gdnNucHJpbnRmKCZjLCAxLCBmbXQsIGFwMik7CisJdmFfZW5kKGFwMik7CisKKwlpZiAoYWxlbiA8PSAwKSB7CisJCS8qIEVpdGhlciB0aGUgdnNucHJpbnRmIGZhaWxlZCBvciB0aGUgZm9ybWF0IHJlc3VsdGVkIGluCisJCSAqIG5vIGNoYXJhY3RlcnMgYmVpbmcgZm9ybWF0dGVkLiBJbiB0aGUgZm9ybWVyIGNhc2UsIHdlCisJCSAqIG91Z2h0IHRvIHJldHVybiBOVUxMLCBpbiB0aGUgbGF0dGVyIHdlIG91Z2h0IHRvIHJldHVybgorCQkgKiB0aGUgb3JpZ2luYWwgc3RyaW5nLiBNb3N0IGN1cnJlbnQgY2FsbGVycyBvZiB0aGlzCisJCSAqIGZ1bmN0aW9uIGV4cGVjdCBpdCB0byBuZXZlciByZXR1cm4gTlVMTC4KKwkJICovCisJCXJldHVybiBzOworCX0KKworCXMgPSB0YWxsb2NfcmVhbGxvYyhOVUxMLCBzLCBjaGFyLCBzbGVuICsgYWxlbiArIDEpOworCWlmICghcykgcmV0dXJuIE5VTEw7CisKKwl2YV9jb3B5KGFwMiwgYXApOworCXZzbnByaW50ZihzICsgc2xlbiwgYWxlbiArIDEsIGZtdCwgYXAyKTsKKwl2YV9lbmQoYXAyKTsKKworCV90YWxsb2Nfc2V0X25hbWVfY29uc3Qocywgcyk7CisJcmV0dXJuIHM7Cit9CisKKy8qKgorICogUmVhbGxvYyBAcCBzIHRvIGFwcGVuZCB0aGUgZm9ybWF0dGVkIHJlc3VsdCBvZiBAcCBmbXQgYW5kIEBwIGFwLAorICogYW5kIHJldHVybiBAcCBzLCB3aGljaCBtYXkgaGF2ZSBtb3ZlZC4gIEdvb2QgZm9yIGdyYWR1YWxseQorICogYWNjdW11bGF0aW5nIG91dHB1dCBpbnRvIGEgc3RyaW5nIGJ1ZmZlci4gQXBwZW5kcyBhdCB0aGUgZW5kCisgKiBvZiB0aGUgc3RyaW5nLgorICoqLworY2hhciAqdGFsbG9jX3Zhc3ByaW50Zl9hcHBlbmQoY2hhciAqcywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworCWlmICh1bmxpa2VseSghcykpIHsKKwkJcmV0dXJuIHRhbGxvY192YXNwcmludGYoTlVMTCwgZm10LCBhcCk7CisJfQorCisJcmV0dXJuIF9fdGFsbG9jX3Zhc2xlbnByaW50Zl9hcHBlbmQocywgc3RybGVuKHMpLCBmbXQsIGFwKTsKK30KKworLyoqCisgKiBSZWFsbG9jIEBwIHMgdG8gYXBwZW5kIHRoZSBmb3JtYXR0ZWQgcmVzdWx0IG9mIEBwIGZtdCBhbmQgQHAgYXAsCisgKiBhbmQgcmV0dXJuIEBwIHMsIHdoaWNoIG1heSBoYXZlIG1vdmVkLiBBbHdheXMgYXBwZW5kcyBhdCB0aGUKKyAqIGVuZCBvZiB0aGUgdGFsbG9jJ2VkIGJ1ZmZlciwgbm90IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAqKi8KK2NoYXIgKnRhbGxvY192YXNwcmludGZfYXBwZW5kX2J1ZmZlcihjaGFyICpzLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisJc2l6ZV90IHNsZW47CisKKwlpZiAodW5saWtlbHkoIXMpKSB7CisJCXJldHVybiB0YWxsb2NfdmFzcHJpbnRmKE5VTEwsIGZtdCwgYXApOworCX0KKworCXNsZW4gPSB0YWxsb2NfZ2V0X3NpemUocyk7CisJaWYgKGxpa2VseShzbGVuID4gMCkpIHsKKwkJc2xlbi0tOworCX0KKworCXJldHVybiBfX3RhbGxvY192YXNsZW5wcmludGZfYXBwZW5kKHMsIHNsZW4sIGZtdCwgYXApOworfQorCisvKgorICBSZWFsbG9jIEBwIHMgdG8gYXBwZW5kIHRoZSBmb3JtYXR0ZWQgcmVzdWx0IG9mIEBwIGZtdCBhbmQgcmV0dXJuIEBwCisgIHMsIHdoaWNoIG1heSBoYXZlIG1vdmVkLiAgR29vZCBmb3IgZ3JhZHVhbGx5IGFjY3VtdWxhdGluZyBvdXRwdXQKKyAgaW50byBhIHN0cmluZyBidWZmZXIuCisgKi8KK2NoYXIgKnRhbGxvY19hc3ByaW50Zl9hcHBlbmQoY2hhciAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXMgPSB0YWxsb2NfdmFzcHJpbnRmX2FwcGVuZChzLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCXJldHVybiBzOworfQorCisvKgorICBSZWFsbG9jIEBwIHMgdG8gYXBwZW5kIHRoZSBmb3JtYXR0ZWQgcmVzdWx0IG9mIEBwIGZtdCBhbmQgcmV0dXJuIEBwCisgIHMsIHdoaWNoIG1heSBoYXZlIG1vdmVkLiAgR29vZCBmb3IgZ3JhZHVhbGx5IGFjY3VtdWxhdGluZyBvdXRwdXQKKyAgaW50byBhIGJ1ZmZlci4KKyAqLworY2hhciAqdGFsbG9jX2FzcHJpbnRmX2FwcGVuZF9idWZmZXIoY2hhciAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXMgPSB0YWxsb2NfdmFzcHJpbnRmX2FwcGVuZF9idWZmZXIocywgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gczsKK30KKworLyoKKyAgYWxsb2MgYW4gYXJyYXksIGNoZWNraW5nIGZvciBpbnRlZ2VyIG92ZXJmbG93IGluIHRoZSBhcnJheSBzaXplCisqLwordm9pZCAqX3RhbGxvY19hcnJheShjb25zdCB2b2lkICpjdHgsIHNpemVfdCBlbF9zaXplLCB1bnNpZ25lZCBjb3VudCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoY291bnQgPj0gTUFYX1RBTExPQ19TSVpFL2VsX3NpemUpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBfdGFsbG9jX25hbWVkX2NvbnN0KGN0eCwgZWxfc2l6ZSAqIGNvdW50LCBuYW1lKTsKK30KKworLyoKKyAgYWxsb2MgYW4gemVybyBhcnJheSwgY2hlY2tpbmcgZm9yIGludGVnZXIgb3ZlcmZsb3cgaW4gdGhlIGFycmF5IHNpemUKKyovCit2b2lkICpfdGFsbG9jX3plcm9fYXJyYXkoY29uc3Qgdm9pZCAqY3R4LCBzaXplX3QgZWxfc2l6ZSwgdW5zaWduZWQgY291bnQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKGNvdW50ID49IE1BWF9UQUxMT0NfU0laRS9lbF9zaXplKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gX3RhbGxvY196ZXJvKGN0eCwgZWxfc2l6ZSAqIGNvdW50LCBuYW1lKTsKK30KKworLyoKKyAgcmVhbGxvYyBhbiBhcnJheSwgY2hlY2tpbmcgZm9yIGludGVnZXIgb3ZlcmZsb3cgaW4gdGhlIGFycmF5IHNpemUKKyovCit2b2lkICpfdGFsbG9jX3JlYWxsb2NfYXJyYXkoY29uc3Qgdm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBlbF9zaXplLCB1bnNpZ25lZCBjb3VudCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoY291bnQgPj0gTUFYX1RBTExPQ19TSVpFL2VsX3NpemUpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBfdGFsbG9jX3JlYWxsb2MoY3R4LCBwdHIsIGVsX3NpemUgKiBjb3VudCwgbmFtZSk7Cit9CisKKy8qCisgIGEgZnVuY3Rpb24gdmVyc2lvbiBvZiB0YWxsb2NfcmVhbGxvYygpLCBzbyBpdCBjYW4gYmUgcGFzc2VkIGFzIGEgZnVuY3Rpb24gcG9pbnRlcgorICB0byBsaWJyYXJpZXMgdGhhdCB3YW50IGEgcmVhbGxvYyBmdW5jdGlvbiAoYSByZWFsbG9jIGZ1bmN0aW9uIGVuY2Fwc3VsYXRlcworICBhbGwgdGhlIGJhc2ljIGNhcGFiaWxpdGllcyBvZiBhbiBhbGxvY2F0aW9uIGxpYnJhcnksIHdoaWNoIGlzIHdoeSB0aGlzIGlzIHVzZWZ1bCkKKyovCit2b2lkICp0YWxsb2NfcmVhbGxvY19mbihjb25zdCB2b2lkICpjb250ZXh0LCB2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworCXJldHVybiBfdGFsbG9jX3JlYWxsb2MoY29udGV4dCwgcHRyLCBzaXplLCBOVUxMKTsKK30KKworCitzdGF0aWMgaW50IHRhbGxvY19hdXRvZnJlZV9kZXN0cnVjdG9yKHZvaWQgKnB0cikKK3sKKwlhdXRvZnJlZV9jb250ZXh0ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGFsbG9jX2F1dG9mcmVlKHZvaWQpCit7CisJX3RhbGxvY19mcmVlKGF1dG9mcmVlX2NvbnRleHQpOworfQorCisvKgorICByZXR1cm4gYSBjb250ZXh0IHdoaWNoIHdpbGwgYmUgYXV0by1mcmVlZCBvbiBleGl0CisgIHRoaXMgaXMgdXNlZnVsIGZvciByZWR1Y2luZyB0aGUgbm9pc2UgaW4gbGVhayByZXBvcnRzCisqLwordm9pZCAqdGFsbG9jX2F1dG9mcmVlX2NvbnRleHQodm9pZCkKK3sKKwlpZiAoYXV0b2ZyZWVfY29udGV4dCA9PSBOVUxMKSB7CisJCWF1dG9mcmVlX2NvbnRleHQgPSBfdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDAsICJhdXRvZnJlZV9jb250ZXh0Iik7CisJCXRhbGxvY19zZXRfZGVzdHJ1Y3RvcihhdXRvZnJlZV9jb250ZXh0LCB0YWxsb2NfYXV0b2ZyZWVfZGVzdHJ1Y3Rvcik7CisJCWF0ZXhpdCh0YWxsb2NfYXV0b2ZyZWUpOworCX0KKwlyZXR1cm4gYXV0b2ZyZWVfY29udGV4dDsKK30KKworc2l6ZV90IHRhbGxvY19nZXRfc2l6ZShjb25zdCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjOworCisJaWYgKGNvbnRleHQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwl0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihjb250ZXh0KTsKKworCXJldHVybiB0Yy0+c2l6ZTsKK30KKworLyoKKyAgZmluZCBhIHBhcmVudCBvZiB0aGlzIGNvbnRleHQgdGhhdCBoYXMgdGhlIGdpdmVuIG5hbWUsIGlmIGFueQorKi8KK3ZvaWQgKnRhbGxvY19maW5kX3BhcmVudF9ieW5hbWUoY29uc3Qgdm9pZCAqY29udGV4dCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdGFsbG9jX2NodW5rICp0YzsKKworCWlmIChjb250ZXh0ID09IE5VTEwpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdGMgPSB0YWxsb2NfY2h1bmtfZnJvbV9wdHIoY29udGV4dCk7CisJd2hpbGUgKHRjKSB7CisJCWlmICh0Yy0+bmFtZSAmJiBzdHJjbXAodGMtPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCXJldHVybiBUQ19QVFJfRlJPTV9DSFVOSyh0Yyk7CisJCX0KKwkJd2hpbGUgKHRjICYmIHRjLT5wcmV2KSB0YyA9IHRjLT5wcmV2OworCQlpZiAodGMpIHsKKwkJCXRjID0gdGMtPnBhcmVudDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAgc2hvdyB0aGUgcGFyZW50YWdlIG9mIGEgY29udGV4dAorKi8KK3ZvaWQgdGFsbG9jX3Nob3dfcGFyZW50cyhjb25zdCB2b2lkICpjb250ZXh0LCBGSUxFICpmaWxlKQoreworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjOworCisJaWYgKGNvbnRleHQgPT0gTlVMTCkgeworCQlmcHJpbnRmKGZpbGUsICJ0YWxsb2Mgbm8gcGFyZW50cyBmb3IgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwl0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihjb250ZXh0KTsKKwlmcHJpbnRmKGZpbGUsICJ0YWxsb2MgcGFyZW50cyBvZiAnJXMnXG4iLCB0YWxsb2NfZ2V0X25hbWUoY29udGV4dCkpOworCXdoaWxlICh0YykgeworCQlmcHJpbnRmKGZpbGUsICJcdCclcydcbiIsIHRhbGxvY19nZXRfbmFtZShUQ19QVFJfRlJPTV9DSFVOSyh0YykpKTsKKwkJd2hpbGUgKHRjICYmIHRjLT5wcmV2KSB0YyA9IHRjLT5wcmV2OworCQlpZiAodGMpIHsKKwkJCXRjID0gdGMtPnBhcmVudDsKKwkJfQorCX0KKwlmZmx1c2goZmlsZSk7Cit9CisKKy8qCisgIHJldHVybiAxIGlmIHB0ciBpcyBhIHBhcmVudCBvZiBjb250ZXh0CisqLworaW50IHRhbGxvY19pc19wYXJlbnQoY29uc3Qgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqcHRyKQoreworCXN0cnVjdCB0YWxsb2NfY2h1bmsgKnRjOworCisJaWYgKGNvbnRleHQgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwl0YyA9IHRhbGxvY19jaHVua19mcm9tX3B0cihjb250ZXh0KTsKKwl3aGlsZSAodGMpIHsKKwkJaWYgKFRDX1BUUl9GUk9NX0NIVU5LKHRjKSA9PSBwdHIpIHJldHVybiAxOworCQl3aGlsZSAodGMgJiYgdGMtPnByZXYpIHRjID0gdGMtPnByZXY7CisJCWlmICh0YykgeworCQkJdGMgPSB0Yy0+cGFyZW50OworCQl9CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3RpbWVyLmMgYi9saWJvc21vY29yZS9zcmMvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Q3ZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL3RpbWVyLmMKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiAoQykgMjAwOCwyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKworc3RhdGljIExMSVNUX0hFQUQodGltZXJfbGlzdCk7CitzdGF0aWMgc3RydWN0IHRpbWV2YWwgc19uZWFyZXN0X3RpbWU7CitzdGF0aWMgc3RydWN0IHRpbWV2YWwgc19zZWxlY3RfdGltZTsKKworI2RlZmluZSBNSUNST19TRUNPTkRTICAxMDAwMDAwTEwKKworI2RlZmluZSBUSU1FX1NNQUxMRVIobGVmdCwgcmlnaHQpIFwKKyAgICAgICAgKGxlZnQudHZfc2VjKk1JQ1JPX1NFQ09ORFMrbGVmdC50dl91c2VjKSA8PSAocmlnaHQudHZfc2VjKk1JQ1JPX1NFQ09ORFMrcmlnaHQudHZfdXNlYykKKwordm9pZCBic2NfYWRkX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlzdHJ1Y3QgdGltZXJfbGlzdCAqbGlzdF90aW1lcjsKKworCS8qIFRPRE86IE9wdGltaXplIGFuZCByZW1lbWJlciB0aGUgY2xvc2VzdCBpdGVtLi4uICovCisJdGltZXItPmFjdGl2ZSA9IDE7CisKKwkvKiB0aGlzIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB1cGRhdGVfdGltZXJzICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobGlzdF90aW1lciwgJnRpbWVyX2xpc3QsIGVudHJ5KQorCQlpZiAodGltZXIgPT0gbGlzdF90aW1lcikKKwkJCXJldHVybjsKKworCXRpbWVyLT5pbl9saXN0ID0gMTsKKwlsbGlzdF9hZGQoJnRpbWVyLT5lbnRyeSwgJnRpbWVyX2xpc3QpOworfQorCit2b2lkIGJzY19zY2hlZHVsZV90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsIGludCBzZWNvbmRzLCBpbnQgbWljcm9zZWNvbmRzKQoreworCXN0cnVjdCB0aW1ldmFsIGN1cnJlbnRfdGltZTsKKworCWdldHRpbWVvZmRheSgmY3VycmVudF90aW1lLCBOVUxMKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgY3VycmVudFRpbWUgPSBjdXJyZW50X3RpbWUudHZfc2VjICogTUlDUk9fU0VDT05EUyArIGN1cnJlbnRfdGltZS50dl91c2VjOworCWN1cnJlbnRUaW1lICs9IHNlY29uZHMgKiBNSUNST19TRUNPTkRTICsgbWljcm9zZWNvbmRzOworCXRpbWVyLT50aW1lb3V0LnR2X3NlYyA9IGN1cnJlbnRUaW1lIC8gTUlDUk9fU0VDT05EUzsKKwl0aW1lci0+dGltZW91dC50dl91c2VjID0gY3VycmVudFRpbWUgJSBNSUNST19TRUNPTkRTOworCWJzY19hZGRfdGltZXIodGltZXIpOworfQorCit2b2lkIGJzY19kZWxfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCWlmICh0aW1lci0+aW5fbGlzdCkgeworCQl0aW1lci0+YWN0aXZlID0gMDsKKwkJdGltZXItPmluX2xpc3QgPSAwOworCQlsbGlzdF9kZWwoJnRpbWVyLT5lbnRyeSk7CisJfQorfQorCitpbnQgYnNjX3RpbWVyX3BlbmRpbmcoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXJldHVybiB0aW1lci0+YWN0aXZlOworfQorCisvKgorICogaWYgd2UgaGF2ZSBhIG5lYXJlc3QgdGltZSByZXR1cm4gdGhlIGRlbHRhIGJldHdlZW4gdGhlIGN1cnJlbnQKKyAqIHRpbWUgYW5kIHRoZSB0aW1lIG9mIHRoZSBuZWFyZXN0IHRpbWVyLgorICogSWYgdGhlIG5lYXJlc3QgdGltZXIgdGltZWQgb3V0IHJldHVybiBOVUxMIGFuZCB0aGVuIHdlIHdpbGwKKyAqIGRpc3BhdGNoIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIHNlbGVjdAorICovCitzdHJ1Y3QgdGltZXZhbCAqYnNjX25lYXJlc3RfdGltZXIoKQoreworCXN0cnVjdCB0aW1ldmFsIGN1cnJlbnRfdGltZTsKKworCWlmIChzX25lYXJlc3RfdGltZS50dl9zZWMgPT0gMCAmJiBzX25lYXJlc3RfdGltZS50dl91c2VjID09IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKGdldHRpbWVvZmRheSgmY3VycmVudF90aW1lLCBOVUxMKSA9PSAtMSkKKwkJcmV0dXJuIE5VTEw7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcgbmVhcmVzdFRpbWUgPSBzX25lYXJlc3RfdGltZS50dl9zZWMgKiBNSUNST19TRUNPTkRTICsgc19uZWFyZXN0X3RpbWUudHZfdXNlYzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgY3VycmVudFRpbWUgPSBjdXJyZW50X3RpbWUudHZfc2VjICogTUlDUk9fU0VDT05EUyArIGN1cnJlbnRfdGltZS50dl91c2VjOworCisJaWYgKG5lYXJlc3RUaW1lIDwgY3VycmVudFRpbWUpIHsKKwkJc19zZWxlY3RfdGltZS50dl9zZWMgPSAwOworCQlzX3NlbGVjdF90aW1lLnR2X3VzZWMgPSAwOworCX0gZWxzZSB7CisJCXNfc2VsZWN0X3RpbWUudHZfc2VjID0gKG5lYXJlc3RUaW1lIC0gY3VycmVudFRpbWUpIC8gTUlDUk9fU0VDT05EUzsKKwkJc19zZWxlY3RfdGltZS50dl91c2VjID0gKG5lYXJlc3RUaW1lIC0gY3VycmVudFRpbWUpICUgTUlDUk9fU0VDT05EUzsKKwl9CisKKwlyZXR1cm4gJnNfc2VsZWN0X3RpbWU7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBuZWFyZXN0IHRpbWUgYW5kIHVwZGF0ZSBzX25lYXJlc3RfdGltZQorICovCit2b2lkIGJzY19wcmVwYXJlX3RpbWVycygpCit7CisJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLCAqbmVhcmVzdF90aW1lciA9IE5VTEw7CisJbGxpc3RfZm9yX2VhY2hfZW50cnkodGltZXIsICZ0aW1lcl9saXN0LCBlbnRyeSkgeworCQlpZiAoIW5lYXJlc3RfdGltZXIgfHwgVElNRV9TTUFMTEVSKHRpbWVyLT50aW1lb3V0LCBuZWFyZXN0X3RpbWVyLT50aW1lb3V0KSkgeworCQkJbmVhcmVzdF90aW1lciA9IHRpbWVyOworCQl9CisJfQorCisJaWYgKG5lYXJlc3RfdGltZXIpIHsKKwkJc19uZWFyZXN0X3RpbWUgPSBuZWFyZXN0X3RpbWVyLT50aW1lb3V0OworCX0gZWxzZSB7CisJCW1lbXNldCgmc19uZWFyZXN0X3RpbWUsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOworCX0KK30KKworLyoKKyAqIGZpcmUgYWxsIHRpbWVycy4uLiBhbmQgcmVtb3ZlIHRoZW0KKyAqLworaW50IGJzY191cGRhdGVfdGltZXJzKCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBjdXJyZW50X3RpbWU7CisJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLCAqdG1wOworCWludCB3b3JrID0gMDsKKworCWdldHRpbWVvZmRheSgmY3VycmVudF90aW1lLCBOVUxMKTsKKworCS8qCisJICogVGhlIGNhbGxiYWNrcyBtaWdodCBtZXNzIHdpdGggb3VyIGxpc3QgYW5kIGluIHRoaXMgY2FzZQorCSAqIGV2ZW4gbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSBpcyBub3Qgc2FmZSB0byB1c2UuIFRvIGFsbG93CisJICogZGVsX3RpbWVyLCBhZGRfdGltZXIsIHNjaGVkdWxlX3RpbWVyIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbgorCSAqIHRoZSBjYWxsYmFjayB3ZSBqdW1wIHRocm91Z2ggc29tZSBsb29wcy4KKwkgKgorCSAqIEZpcnN0IHdlIHNldCB0aGUgaGFuZGxlZCBmbGFnIG9mIGVhY2ggYWN0aXZlIHRpbWVyIHRvIHplcm8sCisJICogdGhlbiB3ZSBpdGVyYXRlIG92ZXIgdGhlIGxpc3QgYW5kIGV4ZWN1dGUgdGhlIGNhbGxiYWNrcy4gQXMgdGhlCisJICogbGlzdCBtaWdodCBoYXZlIGJlZW4gY2hhbmdlZCAoc3BlY2lhbGx5IHRoZSBuZXh0KSBmcm9tIHdpdGhpbgorCSAqIHRoZSBjYWxsYmFjayB3ZSBoYXZlIHRvIHN0YXJ0IG92ZXIgYWdhaW4uIE9uY2UgZXZlcnkgY2FsbGJhY2sKKwkgKiBpcyBkaXNwYXRjaGVkIHdlIHdpbGwgcmVtb3ZlIHRoZSBub24tYWN0aXZlIGZyb20gdGhlIGxpc3QuCisJICoKKwkgKiBUT0RPOiBJZiB0aGlzIGlzIGEgcGVyZm9ybWFuY2UgaXNzdWUgd2UgY2FuIHBvaXNvbiBhIGdsb2JhbAorCSAqIHZhcmlhYmxlIGluIGFkZF90aW1lciBhbmQgZGVsX3RpbWVyIGFuZCBvbmx5IHRoZW4gcmVzdGFydC4KKwkgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lciwgJnRpbWVyX2xpc3QsIGVudHJ5KSB7CisJCXRpbWVyLT5oYW5kbGVkID0gMDsKKwl9CisKK3Jlc3RhcnQ6CisJbGxpc3RfZm9yX2VhY2hfZW50cnkodGltZXIsICZ0aW1lcl9saXN0LCBlbnRyeSkgeworCQlpZiAoIXRpbWVyLT5oYW5kbGVkICYmIFRJTUVfU01BTExFUih0aW1lci0+dGltZW91dCwgY3VycmVudF90aW1lKSkgeworCQkJdGltZXItPmhhbmRsZWQgPSAxOworCQkJdGltZXItPmFjdGl2ZSA9IDA7CisJCQkoKnRpbWVyLT5jYikodGltZXItPmRhdGEpOworCQkJd29yayA9IDE7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwl9CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRpbWVyLCB0bXAsICZ0aW1lcl9saXN0LCBlbnRyeSkgeworCQl0aW1lci0+aGFuZGxlZCA9IDA7CisJCWlmICghdGltZXItPmFjdGl2ZSkgeworCQkJYnNjX2RlbF90aW1lcih0aW1lcik7CisJCX0KKwl9CisKKwlyZXR1cm4gd29yazsKK30KKworaW50IGJzY190aW1lcl9jaGVjayh2b2lkKQoreworCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcjsKKwlpbnQgaSA9IDA7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lciwgJnRpbWVyX2xpc3QsIGVudHJ5KSB7CisJCWkrKzsKKwl9CisJcmV0dXJuIGk7Cit9CmRpZmYgLS1naXQgYS9saWJvc21vY29yZS9zcmMvdGx2X3BhcnNlci5jIGIvbGlib3Ntb2NvcmUvc3JjL3Rsdl9wYXJzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDdlNTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL3Rsdl9wYXJzZXIuYwpAQCAtMCwwICsxLDE3MSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKworc3RydWN0IHRsdl9kZWZpbml0aW9uIHR2bHZfYXR0X2RlZjsKKworaW50IHRsdl9kdW1wKHN0cnVjdCB0bHZfcGFyc2VkICpkZWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDB4ZmY7IGkrKykgeworCQlpZiAoIWRlYy0+bHZbaV0udmFsKQorCQkJY29udGludWU7CisJCXByaW50ZigiVD0lMDJ4IEw9JWRcbiIsIGksIGRlYy0+bHZbaV0ubGVuKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIG9fdGFnOiAgb3V0cHV0OiB0YWcgZm91bmQKKyAqIG9fbGVuOiAgb3V0cHV0OiBsZW5ndGggb2YgdGhlIGRhdGEKKyAqIG9fdmFsOiAgb3V0cHV0OiBwb2ludGVyIHRvIHRoZSBkYXRhCisgKiBkZWY6ICAgICBpbnB1dDogYSBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIHZhbGlkIFRMViB0YWdzIC8gY29uZmlndXJhdGlvbnMKKyAqIGJ1ZjogICAgIGlucHV0OiB0aGUgaW5wdXQgZGF0YSBidWZmZXIgdG8gYmUgcGFyc2VkCisgKiBidWZfbGVuOiBpbnB1dDogdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YSBidWZmZXIKKyAqCisgKiBBbHNvLCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYnkgdGhlIFRMViBlbnRyeQorICovCitpbnQgdGx2X3BhcnNlX29uZSh1aW50OF90ICpvX3RhZywgdWludDE2X3QgKm9fbGVuLCBjb25zdCB1aW50OF90ICoqb192YWwsCisJCSAgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uICpkZWYsCisJCSAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX2xlbikKK3sKKwl1aW50OF90IHRhZzsKKwlpbnQgbGVuOworCisJdGFnID0gKmJ1ZjsKKwkqb190YWcgPSB0YWc7CisKKwkvKiBGSVhNRTogdXNlIHRhYmxlcyBmb3Iga253b24gSUVJICovCisJc3dpdGNoIChkZWYtPmRlZlt0YWddLnR5cGUpIHsKKwljYXNlIFRMVl9UWVBFX1Q6CisJCS8qIEdTTSBUUyAwNC4wNyAxMS4yLjQ6IFR5cGUgMSBUViBvciBUeXBlIDIgVCAqLworCQkqb192YWwgPSBidWY7CisJCSpvX2xlbiA9IDA7CisJCWxlbiA9IDE7CisJCWJyZWFrOworCWNhc2UgVExWX1RZUEVfVFY6CisJCSpvX3ZhbCA9IGJ1ZisxOworCQkqb19sZW4gPSAxOworCQlsZW4gPSAyOworCQlicmVhazsKKwljYXNlIFRMVl9UWVBFX0ZJWEVEOgorCQkqb192YWwgPSBidWYrMTsKKwkJKm9fbGVuID0gZGVmLT5kZWZbdGFnXS5maXhlZF9sZW47CisJCWxlbiA9IGRlZi0+ZGVmW3RhZ10uZml4ZWRfbGVuICsgMTsKKwkJYnJlYWs7CisJY2FzZSBUTFZfVFlQRV9UTFY6CisJCS8qIEdTTSBUUyAwNC4wNyAxMS4yLjQ6IFR5cGUgNCBUTFYgKi8KKwkJaWYgKGJ1ZiArIDEgPiBidWYgKyBidWZfbGVuKQorCQkJcmV0dXJuIC0xOworCQkqb192YWwgPSBidWYrMjsKKwkJKm9fbGVuID0gKihidWYrMSk7CisJCWxlbiA9ICpvX2xlbiArIDI7CisJCWlmIChsZW4gPiBidWZfbGVuKQorCQkJcmV0dXJuIC0yOworCQlicmVhazsKKwljYXNlIFRMVl9UWVBFX1R2TFY6CisJCWlmICgqKGJ1ZisxKSAmIDB4ODApIHsKKwkJCS8qIGxpa2UgVExWLCBidXQgd2l0aG91dCBoaWdoZXN0IGJpdCBvZiBsZW4gKi8KKwkJCWlmIChidWYgKyAxID4gYnVmICsgYnVmX2xlbikKKwkJCQlyZXR1cm4gLTE7CisJCQkqb192YWwgPSBidWYrMjsKKwkJCSpvX2xlbiA9ICooYnVmKzEpICYgMHg3ZjsKKwkJCWxlbiA9ICpvX2xlbiArIDI7CisJCQlpZiAobGVuID4gYnVmX2xlbikKKwkJCQlyZXR1cm4gLTI7CisJCQlicmVhazsKKwkJfQorCQkvKiBsaWtlIFRMMTZWLCBmYWxsdGhyb3VnaCAqLworCWNhc2UgVExWX1RZUEVfVEwxNlY6CisJCWlmICgyID4gYnVmX2xlbikKKwkJCXJldHVybiAtMTsKKwkJKm9fdmFsID0gYnVmKzM7CisJCSpvX2xlbiA9ICooYnVmKzEpIDw8IDggfCAqKGJ1ZisyKTsKKwkJbGVuID0gKm9fbGVuICsgMzsKKwkJaWYgKGxlbiA+IGJ1Zl9sZW4pCisJCQlyZXR1cm4gLTI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtMzsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCisvKiBkZWM6ICAgIG91dHB1dDogYSBjYWxsZXItYWxsb2NhdGVkIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgdGx2X3BhcnNlZCwKKyAqIGRlZjogICAgIGlucHV0OiBhIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgdmFsaWQgVExWIHRhZ3MgLyBjb25maWd1cmF0aW9ucworICogYnVmOiAgICAgaW5wdXQ6IHRoZSBpbnB1dCBkYXRhIGJ1ZmZlciB0byBiZSBwYXJzZWQKKyAqIGJ1Zl9sZW46IGlucHV0OiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlcgorICogbHZfdGFnOiAgaW5wdXQ6IGFuIGluaXRpYWwgTFYgdGFnIGF0IHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyCisgKiBsdl90YWcyOiBpbnB1dDogYSBzZWNvbmQgaW5pdGlhbCBMViB0YWcgZm9sbG93aW5nIGx2X3RhZyAKKyAqLworaW50IHRsdl9wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqZGVjLCBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gKmRlZiwKKwkgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfbGVuLCB1aW50OF90IGx2X3RhZywKKwkgICAgICB1aW50OF90IGx2X3RhZzIpCit7CisJaW50IG9mcyA9IDAsIG51bV9wYXJzZWQgPSAwOworCXVpbnQxNl90IGxlbjsKKworCW1lbXNldChkZWMsIDAsIHNpemVvZigqZGVjKSk7CisKKwlpZiAobHZfdGFnKSB7CisJCWlmIChvZnMgPiBidWZfbGVuKQorCQkJcmV0dXJuIC0xOworCQlkZWMtPmx2W2x2X3RhZ10udmFsID0gJmJ1ZltvZnMrMV07CisJCWRlYy0+bHZbbHZfdGFnXS5sZW4gPSBidWZbb2ZzXTsKKwkJbGVuID0gZGVjLT5sdltsdl90YWddLmxlbiArIDE7CisJCWlmIChvZnMgKyBsZW4gPiBidWZfbGVuKQorCQkJcmV0dXJuIC0yOworCQludW1fcGFyc2VkKys7CisJCW9mcyArPSBsZW47CisJfQorCWlmIChsdl90YWcyKSB7CisJCWlmIChvZnMgPiBidWZfbGVuKQorCQkJcmV0dXJuIC0xOworCQlkZWMtPmx2W2x2X3RhZzJdLnZhbCA9ICZidWZbb2ZzKzFdOworCQlkZWMtPmx2W2x2X3RhZzJdLmxlbiA9IGJ1ZltvZnNdOworCQlsZW4gPSBkZWMtPmx2W2x2X3RhZzJdLmxlbiArIDE7CisJCWlmIChvZnMgKyBsZW4gPiBidWZfbGVuKQorCQkJcmV0dXJuIC0yOworCQludW1fcGFyc2VkKys7CisJCW9mcyArPSBsZW47CisJfQorCisJd2hpbGUgKG9mcyA8IGJ1Zl9sZW4pIHsKKwkJaW50IHJ2OworCQl1aW50OF90IHRhZzsKKwkJY29uc3QgdWludDhfdCAqdmFsOworCisJCXJ2ID0gdGx2X3BhcnNlX29uZSgmdGFnLCAmbGVuLCAmdmFsLCBkZWYsCisJCSAgICAgICAgICAgICAgICAgICAmYnVmW29mc10sIGJ1Zl9sZW4tb2ZzKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiBydjsKKwkJZGVjLT5sdlt0YWddLnZhbCA9IHZhbDsKKwkJZGVjLT5sdlt0YWddLmxlbiA9IGxlbjsKKwkJb2ZzICs9IHJ2OworCQludW1fcGFyc2VkKys7CisJfQorCS8vdGx2X2R1bXAoZGVjKTsKKwlyZXR1cm4gbnVtX3BhcnNlZDsKK30KKworLyogdGFrZSBhIG1hc3RlciAoc3JjKSB0bHZkZXYgYW5kIGZpbGwgdXAgYWxsIGVtcHR5IHNsb3RzIGluICdkc3QnICovCit2b2lkIHRsdl9kZWZfcGF0Y2goc3RydWN0IHRsdl9kZWZpbml0aW9uICpkc3QsIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiAqc3JjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHN0LT5kZWYpOyBpKyspIHsKKwkJaWYgKHNyYy0+ZGVmW2ldLnR5cGUgPT0gVExWX1RZUEVfTk9ORSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZHN0LT5kZWZbaV0udHlwZSA9PSBUTFZfVFlQRV9OT05FKQorCQkJZHN0LT5kZWZbaV0gPSBzcmMtPmRlZltpXTsKKwl9Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfdGx2KHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHZsdl9hdHRfZGVmLmRlZik7IGkrKykKKwkJdHZsdl9hdHRfZGVmLmRlZltpXS50eXBlID0gVExWX1RZUEVfVHZMVjsKK30KZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlL3NyYy91dGlscy5jIGIvbGlib3Ntb2NvcmUvc3JjL3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhYjA2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm9zbW9jb3JlL3NyYy91dGlscy5jCkBAIC0wLDAgKzEsNTAgQEAKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3V0aWxzLmg+CisKK3N0YXRpYyBjaGFyIG5hbWVidWZbMjU1XTsKK2NvbnN0IGNoYXIgKmdldF92YWx1ZV9zdHJpbmcoY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyAqdnMsIHVpbnQzMl90IHZhbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7OyBpKyspIHsKKwkJaWYgKHZzW2ldLnZhbHVlID09IDAgJiYgdnNbaV0uc3RyID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKHZzW2ldLnZhbHVlID09IHZhbCkKKwkJCXJldHVybiB2c1tpXS5zdHI7CisJfQorCisJc25wcmludGYobmFtZWJ1Ziwgc2l6ZW9mKG5hbWVidWYpLCAidW5rbm93biAweCV4IiwgdmFsKTsKKwlyZXR1cm4gbmFtZWJ1ZjsKK30KKworaW50IGdldF9zdHJpbmdfdmFsdWUoY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyAqdnMsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7OyBpKyspIHsKKwkJaWYgKHZzW2ldLnZhbHVlID09IDAgJiYgdnNbaV0uc3RyID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKCFzdHJjYXNlY21wKHZzW2ldLnN0ciwgc3RyKSkKKwkJCXJldHVybiB2c1tpXS52YWx1ZTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2NoYXIgYmNkMmNoYXIodWludDhfdCBiY2QpCit7CisJaWYgKGJjZCA8IDB4YSkKKwkJcmV0dXJuICcwJyArIGJjZDsKKwllbHNlCisJCXJldHVybiAnQScgKyAoYmNkIC0gMHhhKTsKK30KKworLyogb25seSB3b3JrcyBmb3IgbnVtYmVycyBpbiBhc2NjaSAqLwordWludDhfdCBjaGFyMmJjZChjaGFyIGMpCit7CisJcmV0dXJuIGMgLSAweDMwOworfQpkaWZmIC0tZ2l0IGEvbGlib3Ntb2NvcmUvc3JjL3dyaXRlX3F1ZXVlLmMgYi9saWJvc21vY29yZS9zcmMvd3JpdGVfcXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MThhOGMwCi0tLSAvZGV2L251bGwKKysrIGIvbGlib3Ntb2NvcmUvc3JjL3dyaXRlX3F1ZXVlLmMKQEAgLTAsMCArMSw4OCBAQAorLyogR2VuZXJpYyB3cml0ZSBxdWV1ZSBpbXBsZW1lbnRhdGlvbiAqLworLyoKKyAqIChDKSAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiAoQykgMjAxMCBieSBPbi1XYXZlcworICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvd3JpdGVfcXVldWUuaD4KKworaW50IHdyaXRlX3F1ZXVlX2JmZF9jYihzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJc3RydWN0IHdyaXRlX3F1ZXVlICpxdWV1ZTsKKworCXF1ZXVlID0gY29udGFpbmVyX29mKGZkLCBzdHJ1Y3Qgd3JpdGVfcXVldWUsIGJmZCk7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQlxdWV1ZS0+cmVhZF9jYihmZCk7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9FWENFUFQpCisJCXF1ZXVlLT5leGNlcHRfY2IoZmQpOworCisJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpIHsKKwkJc3RydWN0IG1zZ2IgKm1zZzsKKworCQlmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCQltc2cgPSBtc2diX2RlcXVldWUoJnF1ZXVlLT5tc2dfcXVldWUpOworCQlpZiAoIW1zZykKKwkJCXJldHVybiAtMTsKKworCQktLXF1ZXVlLT5jdXJyZW50X2xlbmd0aDsKKwkJcXVldWUtPndyaXRlX2NiKGZkLCBtc2cpOworCQltc2diX2ZyZWUobXNnKTsKKworCQlpZiAoIWxsaXN0X2VtcHR5KCZxdWV1ZS0+bXNnX3F1ZXVlKSkKKwkJCWZkLT53aGVuIHw9IEJTQ19GRF9XUklURTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB3cml0ZV9xdWV1ZV9pbml0KHN0cnVjdCB3cml0ZV9xdWV1ZSAqcXVldWUsIGludCBtYXhfbGVuZ3RoKQoreworCXF1ZXVlLT5tYXhfbGVuZ3RoID0gbWF4X2xlbmd0aDsKKwlxdWV1ZS0+Y3VycmVudF9sZW5ndGggPSAwOworCXF1ZXVlLT5yZWFkX2NiID0gTlVMTDsKKwlxdWV1ZS0+d3JpdGVfY2IgPSBOVUxMOworCXF1ZXVlLT5iZmQuY2IgPSB3cml0ZV9xdWV1ZV9iZmRfY2I7CisJSU5JVF9MTElTVF9IRUFEKCZxdWV1ZS0+bXNnX3F1ZXVlKTsKK30KKworaW50IHdyaXRlX3F1ZXVlX2VucXVldWUoc3RydWN0IHdyaXRlX3F1ZXVlICpxdWV1ZSwgc3RydWN0IG1zZ2IgKmRhdGEpCit7CisvLwlpZiAocXVldWUtPmN1cnJlbnRfbGVuZ3RoICsgMSA+PSBxdWV1ZS0+bWF4X2xlbmd0aCkKKy8vCQlMT0dQKERNU0MsIExPR0xfRVJST1IsICJUaGUgcXVldWUgaXMgZnVsbC4gRHJvcHBpbmcgbm90IHlldCBpbXBsZW1lbnRlZC5cbiIpOworCisJKytxdWV1ZS0+Y3VycmVudF9sZW5ndGg7CisJbXNnYl9lbnF1ZXVlKCZxdWV1ZS0+bXNnX3F1ZXVlLCBkYXRhKTsKKwlxdWV1ZS0+YmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgd3JpdGVfcXVldWVfY2xlYXIoc3RydWN0IHdyaXRlX3F1ZXVlICpxdWV1ZSkKK3sKKwl3aGlsZSAoIWxsaXN0X2VtcHR5KCZxdWV1ZS0+bXNnX3F1ZXVlKSkgeworCQlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9kZXF1ZXVlKCZxdWV1ZS0+bXNnX3F1ZXVlKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorCisJcXVldWUtPmN1cnJlbnRfbGVuZ3RoID0gMDsKKwlxdWV1ZS0+YmZkLndoZW4gJj0gfkJTQ19GRF9XUklURTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL01ha2VmaWxlLmFtCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdHMvc21zL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvc21zL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9zbXMvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdHMvc21zL3Ntc190ZXN0LmMgYi9saWJvc21vY29yZS90ZXN0cy9zbXMvc21zX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvc21zL3Ntc190ZXN0LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9zbXNfdGVzdC5jCmRpZmYgLS1naXQgYS90ZXN0cy90aW1lci9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy90aW1lci9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvdGVzdHMvdGltZXIvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYyBiL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvdGltZXIvdGltZXJfdGVzdC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy90aW1lci90aW1lcl90ZXN0LmMKZGlmZiAtLWdpdCBhL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMjcuNC1taXNkbi1hYmlzLmRpZmYgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjI3LjQtbWlzZG4tYWJpcy5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTFlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjI3LjQtbWlzZG4tYWJpcy5kaWZmCkBAIC0wLDAgKzEsMTQ0IEBACitkaWZmIC1OcnUgLS1leGNsdWRlLWZyb20gL3N1bmJlYW0vaG9tZS9sYWZvcmdlL3NjcmlwdHMvZG9udGRpZmYgbGludXgtMi42LjI3LjQtY2xlYW4vZHJpdmVycy9pc2RuL21JU0ROL2xheWVyMi5jIGxpbnV4LTIuNi4yNy40L2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYworLS0tIGxpbnV4LTIuNi4yNy40LWNsZWFuL2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYwkyMDA4LTEwLTI2IDAwOjA1OjA3LjAwMDAwMDAwMCArMDIwMAorKysrIGxpbnV4LTIuNi4yNy40L2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYwkyMDA4LTEyLTIzIDE2OjE2OjI5LjAwMDAwMDAwMCArMDEwMAorQEAgLTk0LDggKzk0LDEwIEBACisgCXN0cnVjdCBsYXllcjIgKmwyID0gZmktPnVzZXJkYXRhOworIAl2YV9saXN0IHZhOworIAorKyNpZiAwCisgCWlmICghKCpkZWJ1ZyAmIERFQlVHX0wyX0ZTTSkpCisgCQlyZXR1cm47CisrI2VuZGlmCisgCXZhX3N0YXJ0KHZhLCBmbXQpOworIAlwcmludGsoS0VSTl9ERUJVRyAibDIgKHRlaSAlZCk6ICIsIGwyLT50ZWkpOworIAl2cHJpbnRrKGZtdCwgdmEpOworQEAgLTg4Miw2ICs4ODQsOCBAQAorIAlsMi0+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+ICQoZGlzdGRpcikvLnRhcmJhbGwtdmVyc2lvbgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9SRUFETUUgYi9vcGVuYnNjL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAxZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9SRUFETUUKQEAgLTAsMCArMSwzMiBAQAorQWJvdXQgT3BlbkJTQworPT09PT09PT09PT09PQorCitPcGVuQlNDIGlzIGEgbWluaW1hbGlzdGljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBHU00gTmV0d29yaywgd2l0aAorcGFydGljdWxhciBlbXBoYXNpcyBvbiB0aGUgZnVuY3Rpb25hbGl0eSB0eXBpY2FsbHkgcHJvdmlkZWQgYnkgdGhlIEJTQywKK01TQywgSExSLCBWTFIgYW5kIFNNU0MuCisKK0l0cyBjdXJyZW50bHkgc3VwcG9ydGVkIGludGVyZmFjZXMgdG93YXJkcyB0aGUgQlRTIGFyZToKKworICogQ2xhc3NpYyBBLWJpcyBvdmVyIEUxIHVzaW5nIGEgbUlTRE4gYmFzZWQgRTEgaW50ZXJmYWNlLiBJbiBvdGhlcgorICAgd29yZHMsIHlvdSBjYW4gY29ubmVjdCBleGlzdGluZyBHU00gQmFzZSBUcmFuc2NlaXZlciBTdGF0aW9uIChCVFMpCisgICB0aHJvdWdoIEUxIHRvIE9wZW5CU0MuICBTbyBmYXIsIHdlIGhhdmUgb25seSB0ZXN0ZWQgdGhlIFNpZW1lbnMgQlMtMTEKKyAgIFRlc3QgcmVwb3J0cyB3aXRoIG90aGVyIEJUUyBhcmUgbXVjaCBhcHByZWNpYXRlZCEKKworICogQS1iaXMgb3ZlciBJUCBhcyB1c2VkIGJ5IHRoZSBpcC5hY2Nlc3MgbmFub0JUUyBwcm9kdWN0IGZhbWlseQorCitZb3UgY2FuIGZpbmQgdGhlIHByb2plY3QgZG9jdW1lbnRhdGlvbiBhdCBodHRwOi8vb3BlbmJzYy5nbnVtb25rcy5vcmcvCisKK1RoaXMgcHJvamVjdCBpcyBzdGlsbCBpbiBpdHMgZWFybHkgZGF5cywgYW5kIHRoZXJlIGFyZSBsb3RzIG9mIGFyZWFzIHdoZXJlIGl0Citkb2Vzbid0IGJlaGF2ZSBhcyBwZXIgR1NNIHNwZWMuCisKKwlIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorCisKK2xpYm9zbW9jb3JlCis9PT09PT09PT09PQorCitQbGVhc2Ugbm90ZSB0aGF0IGFzIG9mIE1hcmNoIDIwMTAsIE9wZW5CU0MgaGFzIGEgZGVwZW5kZW5jeSB0byBhIGxpYnJhcnkKK2NhbGxlZCAibGlib3Ntb2NvcmUiLiAgWW91IGNhbiBvYnRhaW4gdGhhdCBsaWJyYXJ5IGZyb20KKworCWdpdDovL2dpdC5vc21vY29tLm9yZy9saWJvc21vY29yZS5naXQKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb25maWd1cmUuaW4gYi9vcGVuYnNjL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQ0ZWUxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw1OSBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQKK0FDX0lOSVQoW29wZW5ic2NdLAorCW00X2VzeXNjbWQoWy4vZ2l0LXZlcnNpb24tZ2VuIC50YXJiYWxsLXZlcnNpb25dKSwKKwlbb3BlbmJzYy1kZXZlbEBsaXN0cy5vcGVuYnNjLm9yZ10pCisKK0FNX0lOSVRfQVVUT01BS0UoW2Rpc3QtYnppcDJdKQorCitkbmwga2VybmVsIHN0eWxlIGNvbXBpbGUgbWVzc2FnZXMKK200X2lmZGVmKFtBTV9TSUxFTlRfUlVMRVNdLCBbQU1fU0lMRU5UX1JVTEVTKFt5ZXNdKV0pCisKK2RubCBjaGVja3MgZm9yIHByb2dyYW1zCitBQ19QUk9HX01BS0VfU0VUCitBQ19QUk9HX0NDCitBQ19QUk9HX0lOU1RBTEwKK0FDX1BST0dfUkFOTElCCisKK2RubCBjaGVja3MgZm9yIGxpYnJhcmllcworQUNfU0VBUkNIX0xJQlMoY3J5cHQsIGNyeXB0LAorICAgIFtMSUJDUllQVD0iLWxjcnlwdCI7IEFDX0RFRklORShbVlRZX0NSWVBUX1BXXSwgW10sIFtVc2UgY3J5cHQgZnVuY3Rpb25hbGl0eSBvZiB2dHkuXSldKQorCitQS0dfQ0hFQ0tfTU9EVUxFUyhMSUJPU01PQ09SRSwgbGlib3Ntb2NvcmUgPj0gMC4xLjYpCisKK2RubCBjaGVja3MgZm9yIGhlYWRlciBmaWxlcworQUNfSEVBREVSX1NUREMKKworZG5sIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcworCisjIFRoZSBmb2xsb3dpbmcgdGVzdCBpcyB0YWtlbiBmcm9tIFdlYktpdCdzIHdlYmtpdC5tNAorc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPSIkQ0ZMQUdTIC1mdmlzaWJpbGl0eT1oaWRkZW4gIgorQUNfTVNHX0NIRUNLSU5HKFtpZiAke0NDfSBzdXBwb3J0cyAtZnZpc2liaWxpdHk9aGlkZGVuXSkKK0FDX0NPTVBJTEVfSUZFTFNFKFtjaGFyIGZvbztdLAorICAgICAgWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICBTWU1CT0xfVklTSUJJTElUWT0iLWZ2aXNpYmlsaXR5PWhpZGRlbiJdLAorICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pKQorQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgorQUNfU1VCU1QoU1lNQk9MX1ZJU0lCSUxJVFkpCisKKworZG5sIEdlbmVyYXRlIHRoZSBvdXRwdXQKK0FNX0NPTkZJR19IRUFERVIoYnNjY29uZmlnLmgpCisKK0FDX09VVFBVVCgKKyAgICBvcGVuYnNjLnBjCisgICAgbGlic2NjcC5wYworICAgIGluY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZQorICAgIGluY2x1ZGUvdnR5L01ha2VmaWxlCisgICAgaW5jbHVkZS9zY2NwL01ha2VmaWxlCisgICAgaW5jbHVkZS9NYWtlZmlsZQorICAgIHNyYy9NYWtlZmlsZQorICAgIHNyYy9pcGFjY2Vzcy9NYWtlZmlsZQorICAgIHNyYy9ncHJzL01ha2VmaWxlCisgICAgdGVzdHMvTWFrZWZpbGUKKyAgICB0ZXN0cy9kZWJ1Zy9NYWtlZmlsZQorICAgIHRlc3RzL2dzbTA0MDgvTWFrZWZpbGUKKyAgICB0ZXN0cy9kYi9NYWtlZmlsZQorICAgIHRlc3RzL2NoYW5uZWwvTWFrZWZpbGUKKyAgICB0ZXN0cy9zY2NwL01ha2VmaWxlCisgICAgTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9vcGVuYnNjL2NvbnRyaWIvYnQucHkgYi9vcGVuYnNjL2NvbnRyaWIvYnQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWIxMTFlZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9idC5weQpAQCAtMCwwICsxLDMzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IG9zCisKK2YgPSBvcGVuKCJ1bmJhbGFuY2VkIikKK2xpbmVzID0gW10KK2ZvciBsaW5lIGluIGY6CisgICAgbGluZXMuYXBwZW5kKGxpbmUpCisKK2ZpbGVuYW1lcyA9IHt9CisKK291dHB1dCA9IFtdCitmb3IgbGluZSBpbiBsaW5lczoKKyAgICBpZiAiWzB4IiBpbiBsaW5lOgorICAgICAgICBzdGFydCA9IGxpbmUuZmluZCgiWyIpCisgICAgICAgIGVuZCA9IGxpbmUuZmluZCgiXSIpCisgICAgICAgIGFkZHIgPSBsaW5lW3N0YXJ0KzE6ZW5kXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlID0gZmlsZW5hbWVzW2FkZHJdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHIgPSBvcy5wb3BlbigiYWRkcjJsaW5lIC1mcyAtZSAuL2JzY19oYWNrICVzIiAlIGFkZHIpCisgICAgICAgICAgICBhbGwgPSByLnJlYWQoKS5yZXBsYWNlKCJcbiIsICIsIikKKyAgICAgICAgICAgIGZpbGUgPSBhbGwKKyAgICAgICAgICAgIGZpbGVuYW1lc1thZGRyXSA9IGZpbGUKKworICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKGFkZHIsIGZpbGUpCisgICAgb3V0cHV0LmFwcGVuZChsaW5lKQorCitnID0gb3BlbigidW5iYWxhbmNlZC4yIiwgInciKQorZy53cml0ZSgiIi5qb2luKG91dHB1dCkpCisKKworCmRpZmYgLS1naXQgYS9vcGVuYnNjL2NvbnRyaWIvY29udmVydF90b19lbnVtLnB5IGIvb3BlbmJzYy9jb250cmliL2NvbnZlcnRfdG9fZW51bS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iY2Q2ZjJjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9jb250cmliL2NvbnZlcnRfdG9fZW51bS5weQpAQCAtMCwwICsxLDM3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBDb252ZXJ0IEVUU0kgZG9jdW1lbnRzIHRvIGFuIGVudW0KKyMKKworaW1wb3J0IHJlLCBzeXMKKworZGVmIGNvbnZlcnQoc3RyaW5nKToKKyAgICBzdHJpbmcgPSBzdHJpbmcuc3RyaXAoKS5yZXBsYWNlKCIgIiwgIiIpLnJqdXN0KDgsICIwIikKKyAgICB2YXIgPSAwCisgICAgb2Zmc2V0ID0gNworICAgIGZvciBjaGFyIGluIHN0cmluZzoKKyAgICAgICAgYXNzZXJ0IG9mZnNldCA+PSAwCisgICAgICAgIHZhciA9IHZhciB8IChpbnQoY2hhcikgPDwgb2Zmc2V0KQorICAgICAgICBvZmZzZXQgPSBvZmZzZXQgLSAxCisKKyAgICByZXR1cm4gdmFyCisKK2RlZiBzdHJpbmcobmFtZSk6CisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgiICIsICJfIikKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCciJywgIiIpCisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLycsICdfJykKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcoJywgJ18nKQorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJyknLCAnXycpCisgICAgcmV0dXJuICIlc18lcyIgJSAoc3lzLmFyZ3ZbMl0sIG5hbWUudXBwZXIoKSkKKworZmlsZSA9IG9wZW4oc3lzLmFyZ3ZbMV0pCisKKworZm9yIGxpbmUgaW4gZmlsZToKKyAgICBtID0gcmUubWF0Y2gociJbIFx0XSooP1A8dmFsdWU+WzAxIF0rKVsgXSsoP1A8bmFtZT5bYS16QS1aIC8wLTkoKV0rKSIsIGxpbmVbOi0xXSkKKworICAgIGlmIG06CisgICAgICAgIHByaW50ICJcdCVzXHRcdD0gJWQsIiAlIChzdHJpbmcobS5ncm91cGRpY3QoKVsibmFtZSJdKSwgY29udmVydChtLmdyb3VwZGljdCgpWyJ2YWx1ZSJdKSkKKyAgICBlbHNlOgorICAgICAgICBwcmludCBsaW5lWzotMV0KZGlmZiAtLWdpdCBhL29wZW5ic2MvY29udHJpYi9tZ2NwX3NlcnZlci5weSBiL29wZW5ic2MvY29udHJpYi9tZ2NwX3NlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNWM0ODlkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9jb250cmliL21nY3Bfc2VydmVyLnB5CkBAIC0wLDAgKzEsNjAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBTaW1wbGUgc2VydmVyIGZvciBtZ2NwLi4uIHNlbmQgYXVkaXQsIHJlY2VpdmUgcmVzcG9uc2UuLgorCitpbXBvcnQgc29ja2V0LCB0aW1lCisKK01HQ1BfR0FURVdBWV9QT1JUID0gMjQyNworTUdDUF9DQUxMQUdFTlRfUE9SVCA9IDI3MjcKKworcnNpcF9yZXNwID0gIiIiMjAwIDMyMTMyMTMzMlxyXG4iIiIKK2F1ZGl0X3BhY2tldCA9ICIiIkFVRVAgJWQgMTNAbWd3IE1HQ1AgMS4wXHJcbiIiIgorY3JjeF9wYWNrZXQgPSAiIiJDUkNYICVkIDE0QG1ndyBNR0NQIDEuMFxyXG5DOiA0YTg0YWQ1ZDI1ZlxyXG5MOiBwOjIwLCBhOkdTTS1FRlIsIG50OklOXHJcbk06IHJlY3Zvbmx5XHJcbiIiIgorZGxjeF9wYWNrZXQgPSAiIiJETENYICVkIDE0QG1ndyBNR0NQIDEuMFxyXG5DOiA0YTg0YWQ1ZDI1ZlxyXG5JOiAlZFxyXG4iIiIKK21kY3hfcGFja2V0ID0gIiIiTURDWCAlZCAxNEBtZ3cgTUdDUCAxLjBcclxuQzogNGE4NGFkNWQyNWZcclxuSTogJWRcclxuTDogcDoyMCwgYTpHU00tRUZSLCBudDpJTlxyXG5NOiByZWN2b25seVxyXG5cclxudj0wXHJcbm89LSAyNTg2OTY0NzcgMCBJTiBJUDQgMTcyLjE2LjEuMTA3XHJcbnM9LVxyXG5jPUlOIElQNCAxNzIuMTYuMS4xMDdcclxudD0wIDBcclxubT1hdWRpbyA2NjY2IFJUUC9BVlAgMTI3XHJcbmE9cnRwbWFwOjEyNyBHU00tRUZSLzgwMDAvMVxyXG5hPXB0aW1lOjIwXHJcbmE9cmVjdm9ubHlcclxubT1pbWFnZSA0NDAyIHVkcHRsIHQzOFxyXG5hPVQzOEZheFZlcnNpb246MFxyXG5hPVQzOE1heEJpdFJhdGU6MTQ0MDBcclxuIiIiCisKK2RlZiBoZXhkdW1wKHNyYywgbGVuZ3RoPTgpOgorICAgICIiIlJlY2lwZSBpcyBmcm9tIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzE0MjgxMi8iIiIKKyAgICByZXN1bHQgPSBbXQorICAgIGRpZ2l0cyA9IDQgaWYgaXNpbnN0YW5jZShzcmMsIHVuaWNvZGUpIGVsc2UgMgorICAgIGZvciBpIGluIHhyYW5nZSgwLCBsZW4oc3JjKSwgbGVuZ3RoKToKKyAgICAgICBzID0gc3JjW2k6aStsZW5ndGhdCisgICAgICAgaGV4YSA9IGInICcuam9pbihbIiUwKlgiICUgKGRpZ2l0cywgb3JkKHgpKSAgZm9yIHggaW4gc10pCisgICAgICAgdGV4dCA9IGInJy5qb2luKFt4IGlmIDB4MjAgPD0gb3JkKHgpIDwgMHg3RiBlbHNlIGInLicgIGZvciB4IGluIHNdKQorICAgICAgIHJlc3VsdC5hcHBlbmQoIGIiJTA0WCAgICUtKnMgICAlcyIgJSAoaSwgbGVuZ3RoKihkaWdpdHMgKyAxKSwgaGV4YSwgdGV4dCkgKQorICAgIHJldHVybiBiJ1xuJy5qb2luKHJlc3VsdCkKKworc2VydmVyX3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX0RHUkFNKQorc2VydmVyX3NvY2tldC5iaW5kKCgiMTI3LjAuMC4xIiwgTUdDUF9DQUxMQUdFTlRfUE9SVCkpCitzZXJ2ZXJfc29ja2V0LnNldGJsb2NraW5nKDEpCisKK2xhc3RfY2kgPSAxCitkZWYgc2VuZF9hbmRfcmVjZWl2ZShwYWNrZXQpOgorICAgIGdsb2JhbCBsYXN0X2NpCisgICAgc2VydmVyX3NvY2tldC5zZW5kdG8ocGFja2V0LCAoIjEyNy4wLjAuMSIsIE1HQ1BfR0FURVdBWV9QT1JUKSkKKyAgICB0cnk6CisgICAgICAgIGRhdGEsIGFkZHIgPSBzZXJ2ZXJfc29ja2V0LnJlY3Zmcm9tKDQwOTYpCisKKyAgICAgICAgIyBhdHRlbXB0IHRvIHN0b3JlIHRoZSBDSSBvZiB0aGUgcmVzcG9uc2UKKyAgICAgICAgbGlzdCA9IGRhdGEuc3BsaXQoIlxuIikKKyAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdDoKKyAgICAgICAgICAgaWYgaXRlbS5zdGFydHN3aXRoKCJJOiAiKToKKyAgICAgICAgICAgICAgIGxhc3RfY2kgPSBpbnQoaXRlbVszOl0pCisKKyAgICAgICAgcHJpbnQgaGV4ZHVtcChkYXRhKSwgYWRkcgorICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6CisgICAgICAgIHByaW50IGUKKyAgICAgICAgcGFzcworCitkZWYgZ2VuZXJhdGVfdGlkKCk6CisgICAgaW1wb3J0IHJhbmRvbQorICAgIHJldHVybiByYW5kb20ucmFuZGludCgwLCA2NTEyMykKKworCisKK3doaWxlIFRydWU6CisgICAgc2VuZF9hbmRfcmVjZWl2ZShhdWRpdF9wYWNrZXQgJSBnZW5lcmF0ZV90aWQoKSkKKyAgICBzZW5kX2FuZF9yZWNlaXZlKGNyY3hfcGFja2V0ICUgZ2VuZXJhdGVfdGlkKCkgKQorICAgIHNlbmRfYW5kX3JlY2VpdmUobWRjeF9wYWNrZXQgJSAoZ2VuZXJhdGVfdGlkKCksIGxhc3RfY2kpKQorICAgIHNlbmRfYW5kX3JlY2VpdmUoZGxjeF9wYWNrZXQgJSAoZ2VuZXJhdGVfdGlkKCksIGxhc3RfY2kpKQorCisgICAgdGltZS5zbGVlcCgzKQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvQlMxMS1PTUwudHh0IGIvb3BlbmJzYy9kb2MvQlMxMS1PTUwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzMyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9CUzExLU9NTC50eHQKQEAgLTAsMCArMSwzMSBAQAorVGhlIFNpZW1lbnMgQlMtMTEgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIEdTTSAxMi4yMSBPTUwgb3BlcmF0aW9uczoKKworCitDUkVBVEUgT0JKRUNUCisKK2FiaXNfb21fZm9tX2hkci5vYmpfY2xhc3MgY2FuIGJlIAorQTM6CitBNTogQUxDTywgQkJTSUcsIENDTEssIEdQU1UsIExJLCBQQQorQTg6IEVudmFCVFNFCitBOTogQlBPUlQKKwordGhlIGFiaXNfb21fb2JqX2luc3QudHJ4X25yIGZpZWxkIGluZGljYXRlcyB0aGUgaW5kZXggb2Ygb2JqZWN0LCB3aGVyZWFzIHRoZQorYWJpc19vbV9mb21faGRyLmJ0c19uciBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKworZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB7CisJQlMxMV9PQkpfQUxDTwkJPSAweDAxLAorCUJTMTFfT0JKX0JCU0lHCQk9IDB4MDIsCS8qIG9ial9jbGFzczogMCwxICovCisJQlMxMV9PQkpfVFJYMQkJPSAweDAzLAkvKiBvbmx5IERFQUNUSVZBVEUgVFJYMSAqLworCUJTMTFfT0JKX0NDTEsJCT0gMHgwNCwKKwlCUzExX09CSl9HUFNVCQk9IDB4MDYsCisJQlMxMV9PQkpfTEkJCT0gMHgwNywKKwlCUzExX09CSl9QQQkJPSAweDA5LAkvKiBvYmpfY2xhc3M6IDAsIDEqLworfTsKKworSW4gY2FzZSBvZiBDUkVBVEUgRU5WQUJUU0UsIHRoZSBhYmlzX29tX29ial9pbnN0LnRyeF9uciBpbmRpY2F0ZXMgdGhlIEVudmFCVFNFeAorbnVtYmVyLgorCitJbiBjYXNlIG9mIEE5IChDUkVBRVRFIEJQT1JUKSwgdGhlIGFiaXNfb21fb2JqX2luc3QuYnRzX25yIGluZGljYXRlcyB3aGljaCBCUE9SVAorc2hhbGwgYmUgdXNlZC4KKworCmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9jYWxsLXJvdXRpbmcudHh0IGIvb3BlbmJzYy9kb2MvY2FsbC1yb3V0aW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDAyZjllCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvY2FsbC1yb3V0aW5nLnR4dApAQCAtMCwwICsxLDI1IEBACitDYWxsIHJvdXRpbmcgaW4gT3BlbkJTQworCitGbG93IG9mIGV2ZW50czoKKworICMgTU8gY2FsbCBpbml0aWF0ZWQgYnkgTVMsIENIQU5ORUwgUlFELCBJTU1FRElBVEUgQVNTSUdOCisgIyBNUyBzZW5kcyBDQyBTRVRVUCBtZXNzYWdlLCB3ZSBhc3N1bWUgYWxyZWFkeSBvbiBUQ0gvSCBGQUNDSAorICMgT3BlbkJTQyBkb2VzIGEgc3Vic2NyaWJlciBsb29rdXAgYmFzZWQgb24gdGhlIHRhcmdldCBleHRlbnNpb24KKyAgKiBJZiBhIHN1YnNjcmliZXIgaXMgZm91bmQ6CisgICAjIHNlbmQgQ0FMTCBQUk9DRUVESU5HIG1lc3NhZ2UgdG8gTU8KKyAgICMgcGFnZSB0aGUgTVQgc3Vic2NyaWJlciBhbmQgYXNrIGl0SSB0byBhc2sgZm9yIFRDSC9ICisgICAjIG9uY2UgcGFnaW5nIGNvbXBsZXRlcywgd2UgaGF2ZSB0aGUgVENIL0ggZm9yIHRoZSBNVCBlbmQKKyAgICMgc2VuZCBTRVRVUCB0byBNVAorICAgIyByZWNlaXZlIENBTEwgQ09ORklSTUVEIGZyb20gTVQKKyAgICMgc2V0LXVwIHRoZSBUUkFVIG11eCBtYXBwaW5nIGJldHdlZW4gdGhlIEUxIHN1YnNsb3RzIGZvciBib3RoIFRDSC9ICisgICAjIHJlY2VpdmUgQUxFUlRJTkcgZnJvbSBNVCwgcm91dGUgQUxFUlRJTkcgdG8gTU8KKyAgICMgcmVjZWl2ZSBDT05ORUNUIGZyb20gTVQsIGNvbmZpcm0gdG8gTVQgd2l0aCBDT05ORUNUX0FDSworICAgIyBzZW5kIGEgQ09OTkVDVCBtZXNzYWdlIHRvIE1PLCByZWNlaXZlIENPTk5FQ1RfQUNLIGZyb20gTU8KKyAqIElmIHN1YnNjcmliZXIgaXMgbm90IGZvdW5kOgorICAjIHNlbmQgUkVMRUFTRSBDT01QTEVURSB3aXRoIGFwcm9wcmlhdGUgY2F1c2UgdG8gTU8gKDE6IHVuYWxsb2FjYXRlZCAzOiBubyByb3V0ZSkKKyAgCisKKworVGhvdWdodHMgYWJvdXQgUlIvTU06CisKKyogd2UgYWxsb2NhdGUgUlIvTU0gZW50aXRpZXMgb24gZGVtYW5kLCB3aGVuIHdlIG5lZWQgdGhlbQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvY2hhbm5lbF9yZWxlYXNlLnR4dCBiL29wZW5ic2MvZG9jL2NoYW5uZWxfcmVsZWFzZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjZjA5YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2NoYW5uZWxfcmVsZWFzZS50eHQKQEAgLTAsMCArMSw3NCBAQAorCitHU00gMDQuMDggNy4xLjcgLyA5LjEuNwkJUlIgQ0hBTk5FTCBSRUxFU0UKKworUlNMIDA4LjU4IDMuNCAvID8JCVJMTCBMaW5rIFJlbGVhc2UgUmVxdWVzdAorCitSU0wgMDguNTggNC42IC8gOC40LjUJCURFQUNUaXZhdGUgU0FDQ0gKKwkqIERlYWN0aXZhdGUgU0FDQ0ggYWNjb3JkaW5nIHRvIENoYW5uZWwgUmVsZWFzZSBQcm9jIDA0LjA4CisJKiB0byBiZSBzZW50IGFmdGVyIFJSIENIQU5ORUwgUkVMRUFTRSBpcyBzZW50IHRvIE1TCisKK1JTTCAwOC41OCA0LjcgLyA4LjQuMTQJCVJGIENIQU5uZWwgUkVMZWFzZQorCSogdGVsbHMgdGhlIEJUUyB0byByZWxlYXNlIGEgcmFkaW8gY2hhbm5lbAorCSogIndoZW4gYW4gYWN0aXZhdGVkIHJhZGlvIGNoYW5uZWwgaXMgbm8gbG9uZ2VyIG5lZWRlZCIKKwkqIEJUUyByZXNwb25kcyB3aXRoIFJGIENIQU5uZWwgUkVMZWFzZSBBQ0tub3dsZWRnZQorCisKK0dTTSAwNC4wOCAzLjQuMTM6IFJSIGNvbm5lY3Rpb24gcmVsZWFzZSBwcm9jZWR1cmUKKworKiBuZXR3b3JrIHNlbmRzIFJSIENIQU5ORUwgUkVMRUFTRSB0byBNUyBvbiB0aGUgRENDSAorICAqIHN0YXJ0IFQzMTA5CisgICogZGVhY3RpdmF0ZSBTQUNDSAorKiBNUyBkaXNjb25uZWN0cyBtYWluIHNpZ25hbGxpbmcgbGluayAoYnkgc2VuZGluZyBESVNDKQorICAqIGFsbCBvdGhlciBkYXRhIGxpbmtzIGFyZSBkaXNjb25uZWN0ZWQgYnkgbG9jYWwgZW5kIGxpbmsgcmVsZWFzZQorKiBuZXR3b3JrIHJlY2VpdmVzIERJU0MgKEJUUyBzZW5kcyBSTEwgUkVMIElORCB0byBCU0MpCisgICogc3RvcCBUMzEwOQorICAqIHN0YXJ0IFQzMTExIAorKiB3aGVuIFQzMTExIHRpbWVzIG91dCwgdGhlIG5ldHdvcmsgY2FuIHJldXNlIHRoZSBjaGFubmxzCisqIGlmIFQzMTA5IHRpbWVzIG91dCwgdGhlIG5ldHdvcmsgZGVhY3RpdmF0ZXMgdGhlIGNoYW5uZWxzIAorICBhbmQgY2FuIHJldXNlIHRoZW0KKyAgKiB0aGlzIHByb2JhYmx5IG1lYW5zIHNpbXBseSBSRiBDSEFObmVsIFJFTGVhc2UKKworCis9PSBJbXBsZW1lbnRhdGlvbiBpbiBPcGVuQlNDID09CisKK2NoYW5fYWxsb2MuYzpsY2hhbl9hdXRvX3JlbGVhc2UoKQorCSogY2hlY2tzIGlmIHVzZSBjb3VudCBzdGlsbCA+IDAgKGFib3J0KQorCSogY2FsbHMgZ3NtNDhfc2VuZF9ycl9yZWxlYXNlKCkKKwkJKiB3aGljaCBjYWxscyByc2xfZGVhY3Rfc2FjY2goKQorCSogY2FsbHMgcnNsX3JlbGVhc2VfcmVxdWVzdCgpCisJCSogd2hpY2ggc2VuZHMgUkxMIExpbmsgUmVsZWFzZSByZXF1ZXN0CisJCitSWCBvZiBSRUxlYXNlIElORGljYXRpb246CisJKiBjYWxsIHJzbF9yZl9jaGFuX3JlbGVhc2UoKSAoc2VuZCBSRl9DSEFOX1JFTCkKKworUlggb2YgUkVMZWFzZSBDT05GaW1lbToKKwkqIGNhbGwgcnNsX3JmX2NoYW5fcmVsZWFzZSgpIChzZW5kIFJGX0NIQU5fUkVMKQorCisqIFJYIG9mIFJGX0NIQU5fUkVMX0FDSworCSogY2FsbCBsY2hhbl9mcmVlKCkKKwkJKiBzdWJzY3JfcHV0KCkKKwkJKiBkZWxldGUgcmVsZWFzZV90aW1lcgorCisKKz09PSBJbnRlZ3JhdGlvbiB3aXRoIFNNUyA9PT0KKworKiBSWCBvZiBDUF9FUlJPUiBvciB1bmltcGxlbWVudGVkIE1UCisJKiB0cmlnZ2VyIHRyYW5zX2ZyZWUoKSB3aGljaCB3aWxsIGxjaGFuX2F1dG9fcmVsZWFzZSgpCisKKyogQ1AgVEMxKiBleHBpcmVkIHdoaWxlIHdhaXRpbmcgZm9yIENQLUFDSworCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCisqIFJYIG9mIFJQX0VSUk9SCisJKiB0cmlnZ2VyIHRyYW5zX2ZyZWUoKSB3aGljaCB3aWxsIGxjaGFuX2F1dG9fcmVsZWFzZSgpCisJCisqIFRYIG9mIENQLUFDSyBpbiBNVCBERUxJVkVSCisJKiB0cmlnZ2VyIHRyYW5zX2ZyZWUoKSB3aGljaCB3aWxsIGxjaGFuX2F1dG9fcmVsZWFzZSgpCisKKyogUlggb2YgQ1AtQUNLIGluIE1PIFNVQk1JVAorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCQorKiBSWCBvZiBSUC1BQ0sgaW4gTVQgREVMSVZFUiAoYW5kIG5vIG1vcmUgbWVzc2FnZXMpCisJKiB0cmlnZ2VyIHJzbF9yZWxlYXNlX3JlcXVlc3QoKSBmb3IgU0FQSTMKKworKiBSWCBvZiBSUC1TTU1BIGluIE1UIERFTElWRVIgKGFuZCBubyBtb3JlIG1lc3NhZ2VzKQorCSogdHJpZ2dlciByc2xfcmVsZWFzZV9yZXF1ZXN0KCkgZm9yIFNBUEkzCmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9lMS1kYXRhLW1vZGVsLnR4dCBiL29wZW5ic2MvZG9jL2UxLWRhdGEtbW9kZWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTRmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9lMS1kYXRhLW1vZGVsLnR4dApAQCAtMCwwICsxLDE3MiBAQAorRTEgcmVsYXRlZCBkYXRhIG1vZGVsCisKK1RoaXMgZGF0YSBtb2RlbCBkZXNjcmliZXMgdGhlIHBoeXNpY2FsIHJlbGF0aW9uc2hpcCBvZiB0aGUgaW5kaXZpZHVhbAorcGFydHMgaW4gdGhlIG5ldHdvcmssIGl0IGlzIG5vdCB0aGUgbG9naWNhbC9wcm90b2NvbCBzaWRlIG9mIHRoZSBHU00KK25ldHdvcmsuCisKK0EgQlRTIGlzIGNvbm5lY3RlZCB0byB0aGUgQlNDIGJ5IHNvbWUgcGh5c2ljYWwgbGluay4gIEl0IGNvdWxkIGJlIGFuIGFjdHVhbAorRTEgbGluaywgYnV0IGl0IGNvdWxkIGFsc28gYmUgYWJpcy1vdmVyLUlQIHdpdGggYSBtaXh0dXJlIG9mIFRDUCBhbmQgUlRQL1VEUC4KKworVG8gZnVydGhlciBjb21wbGljYXRlIHRoZSBmYWN0LCBtdWx0aXBsZSBCVFMgY2FuIHNoYXJlIG9uZSBzdWNoIHB5c2ljYWwKK2xpbmsuICBPbiBhIHNpbmdsZSBFMSBsaW5lLCB3ZSBjYW4gZWFzaWx5IGFjY29tb2RhdGUgdXAgdG8gdGhyZWUgQlRTIHdpdGgKK3R3byBUUlggZWFjaC4KKworVGh1cywgaXQgaXMgYmVzdCBmb3IgT3BlbkJTQyB0byBoYXZlIHNvbWUga2luZCBvZiBhYnN0cmFjdGlvbiBsYXllci4gIFRoZSBCU0MncwordmlldyBvZiBhIEJUUyBjb25uZWN0ZWQgdG8gaXQuICBXZSBjYWxsIHRoaXMgJ2J0c19saW5rJy4gIEEgYnRzX2xpbmsgY2FuIGJlCisqIGFsbCB0aGUgVENQIGFuZCBVRFAgc3RyZWFtcyBvZiBhIEFiaXMtb3Zlci1JUCBCVFMKKyogYSBzZXQgb2YgRTEgdGltZXNsb3RzIGZvciBPTUwsIFJTTCBhbmQgVFJBVSBjb25uZWN0aW9ucyBvbiBhIEUxIGxpbmsKKyogYSBzZXJpYWwgbGluZSBleGNsdXNpdmVseSB1c2VkIGZvciBPTUwgbWVzc2FnZXMgKFQtTGluaykKKworQSBidHNfbGluayBjYW4gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBPcGVuQlNDIGNvcmUgYXQgcnVudGltZS4KKworc3RydWN0IHRyeF9saW5rIHsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKK307CisKK3N0cnVjdCBidHNfbGluayB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgdHJ4X2xpbmsgdHJ4X2xpbmtzW05VTV9UUlhdOworfTsKKworSW50ZXJmYWNlIGZyb20gc3RhY2sgdG8gaW5wdXQgY29yZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2ludCBhYmlzX3JzbF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpOworCXNlbmQgYSBtZXNzYWdlIHRocm91Z2ggYSBSU0wgbGluayB0byB0aGUgVFJYIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyIGluCisJbXNnLT50cnguCisKK2ludCBhYmlzX3JzbF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZyk7CisJcmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSBhIFJTTCBsaW5rIGZyb20gdGhlIFRSWCBzcGVjaWZpZWQgYnkgdGhlCisJY2FsbGVyIGluIG1zZy0+dHJ4LgorCitpbnQgYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpOworCXNlbmQgYSBtZXNzYWdlIHRocm91Z2ggYSBPTUwgbGluayB0byB0aGUgQlRTIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyIGluCisJbXNnLT50cngtPmJ0cy4gIFRoZSBjYWxsZXIgY2FuIGp1c3QgdXNlIGJ0cy0+YzAgdG8gZ2V0IHRoZSBmaXJzdCBUUlgKKwlpbiBhIEJUUy4gKE9NTCBtZXNzYWdlcyBhcmUgbm90IHJlYWxseSBzZW50IHRvIGEgVFJYIGJ1dCB0byB0aGUgQlRTKQorCitpbnQgYWJpc19ubV9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZyk7CisJcmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSBhIE9NTCBsaW5rIGZyb20gdGhlIEJUUyBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlcgorCWluIG1zZy0+dHJ4LT5idHMuICBUaGUgY2FsbGVyIGNhbiBqdXN0IHVzZSBidHMtPmMwIHRvIGdldCB0aGUgZmlyc3QKKwlUUlggaW4gYSBCVFMuCisKK2ludCBhYmlzX2xpbmtfZXZlbnQoaW50IGV2ZW50LCB2b2lkICpkYXRhKTsKKwlzaWduYWwgc29tZSBldmVudCAoc3VjaCBhcyBsYXllciAxIGNvbm5lY3QvZGlzY29ubmVjdCkgZnJvbSB0aGUKKwlpbnB1dCBjb3JlIHRvIHRoZSBzdGFjay4KKworaW50IHN1YmNoX2RlbXV4X2luKG14LCBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CisJcmVjZWl2ZSAnbGVuJyBieXRlcyBmcm9tIGEgZ2l2ZW4gRTEgdGltZXNsb3QgKFRSQVUgZnJhbWVzKQorCitpbnQgc3ViY2hhbl9tdXhfb3V0KG14LCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CisJb2J0YWluICdsZW4nIGJ5dGVzIG9mIG91dHB1dCBkYXRhIHRvIGJlIHNlbnQgb24gRTEgdGltZXNsb3QKKworSW50cmZhY2UgYnkgSW5wdXQgQ29yZSBmb3IgSW5wdXQgUGx1Z2lucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbnQgYnRzbGlua19yZWdpc3Rlcl9wbHVnaW4oKTsKKworCitDb25maWd1cmF0aW9uIGZvciB0aGUgRTEgaW5wdXQgbW9kdWxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0JUUworCUJUUyBudW1iZXIKKwludW1iZXIgb2YgVFJYCisJT01MIGxpbmsKKwkJRTEgbGluZSBudW1iZXIKKwkJdGltZXNsb3QgbnVtYmVyCisJCVtzdWJzbG90IG51bWJlcl0KKwkJU0FQSQorCQlURUkKKwlmb3IgZWFjaCBUUlgKKwkJUlNMIGxpbmsKKwkJCUUxIGxpbmUgbnVtYmVyCisJCQl0aW1lc2xvdCBudW1iZXIKKwkJCVtzdWJzbG90IG51bWJlcl0KKwkJCVNBUEkKKwkJCVRFSQorCQlmb3IgZWFjaCBUUworCQkJRTEgbGluZSBudW1iZXIKKwkJCXRpbWVzbG90IG51bWJlcgorCQkJc3Vic2xvdCBudW1iZXIKKworCitFMSBpbnB1dCBtb2R1bGUgZGF0YSBtb2RlbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK2VudW0gZTFpbnBfc2lnbl90eXBlIHsKKwlFMUlOUF9TSUdOX05PTkUsCisJRTFJTlBfU0lHTl9PTUwsCisJRTFJTlBfU0lHTl9SU0wsCit9OworCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rIHsKKwkvKiBsaXN0IG9mIHNpZ25hbGxpbmcgbGlua3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZTsKKworCS8qIHRyeCBmb3IgbXNnLT50cnggb2YgcmVjZWl2ZWQgbXNncyAqLwkKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCS8qIG1zZ2IgcXVldWUgb2YgdG8tYmUtdHJhbnNtaXR0ZWQgbXNncyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X2xpc3Q7CisKKwkvKiBTQVBJIGFuZCBURUkgb24gdGhlIEUxIFRTICovCisJdV9pbnQ4X3Qgc2FwaTsKKwl1X2ludDhfdCB0ZWk7Cit9CisKK2VudW0gZTFpbnBfdHNfdHlwZSB7CisJRTFJTlBfVFNfVFlQRV9OT05FLAorCUUxSU5QX1RTX1RZUEVfU0lHTiwKKwlFMUlOUF9UU19UWVBFX1RSQVUsCit9OworCisvKiBBIHRpbWVzbG90IGluIHRoZSBFMSBpbnRlcmZhY2UgKi8KK3N0cnVjdCBlMWlucF90cyB7CisJZW51bSBlMWlucF90c190eXBlIHR5cGU7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGxsaXN0X2hlYWQgc2lnbl9saW5rczsKKwkJfSBzaWduOworCQlzdHJ1Y3QgeworCQkJLyogc3ViY2hhbm5lbCBkZW11eGVyIGZvciBmcmFtZXMgZnJvbSBFMSAqLworCQkJc3RydWN0IHN1YmNoX2RlbXV4IGRlbXV4OworCQkJLyogc3ViY2hhbm5lbCBtdXhlciBmb3IgZnJhbWVzIHRvIEUxICovCisJCQlzdHJ1Y3Qgc3ViY2hfbXV4IG11eDsKKwkJfSB0cmF1OworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogbUlTRE4gZHJpdmVyIGhhcyBvbmUgZmQgZm9yIGVhY2ggdHMgKi8KKwkJCXN0cnVjdCBic2NfZmQ7CisJCX0gbWlzZG47CisJfSBkcml2ZXI7Cit9OworCitzdHJ1Y3QgZTFpbnBfbGluZSB7CisJdW5zaWduZWQgaW50IG51bTsKKwljaGFyICpuYW1lOworCisJc3RydWN0IGUxaW5wX3RzIHRzW05SX0UxX1RTXTsKKworCWNoYXIgKmUxaW5wX2RyaXZlcjsKKwl2b2lkICpkcml2ZXJfZGF0YTsKK307CisKKy8qIENhbGwgZnJvbSB0aGUgU3RhY2s6IGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBUUyBoYXMgY2hhbmdlZCAqLworaW50IGUxaW5wX3VwZGF0ZV90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzKTsKKworLyogUmVjZWl2ZSBhIHBhY2tldCBmcm9tIHRoZSBFMSBkcml2ZXIgKi8KK2ludCBlMWlucF9yeF90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQl1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpOworCisvKiBTZW5kIGEgcGFja2V0LCBjYWxsYmFjayBmdW5jdGlvbiBpbiB0aGUgZHJpdmVyICovCitpbnQgZTFkcml2ZXJfdHhfdHMoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IG1zZ2IgKm1zZykKKworCitzdHJ1Y3QgZTFpbnBfZHJpdmVyIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKndhbnRfd3JpdGUpKHN0cnVjdCBlMWlucF90cyAqdHMpOworfTsKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL2dzbS1ob3BwaW5nLnR4dCBiL29wZW5ic2MvZG9jL2dzbS1ob3BwaW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTEwOTM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvZ3NtLWhvcHBpbmcudHh0CkBAIC0wLDAgKzEsNTQgQEAKK2FjY29yZGluZyB0byBHU00gMDUuMDI6CisKK2dlbmVyYWwgcGFyYW1ldGVycyBmcm9tIENDQ0g6CisqIENBIGNlbGwgYWxsb2NhdGlvbiBvZiBBUkZDTidzIChTeXN0ZW0gSW5mb3JtYXRpb24gLyBCQ0NIKQorKiBGTjogVERNQSBmcmFtZSBudW1iZXIgKHQxLHQyLHQzJykgaW4gU0NICisKK3NwZWNpZmljIHBhcmFtZXRlcnMgZnJvbSBjaGFubmVsIGFzc2lnbm1lbnQ6CisqIE1BOiBtb2JpbGUgYWxsb2NhdGlvbiwgZGVmaW5lcyBzZXQgb2YgQVJGQ04ncywgdXAgdG8gNjQKKyogTUFJTzogaW5kZXgKKyogSFNOOiBob3BwaW5nIHNlcXVlbmNlIGdlbmVyYXRvciBudW1iZXIgKDAuLjY0KQorCisKK2hvcHBpbmcgc2VxdWVuY2UgZ2VuZXJhdGlvbiAoNi4yLjMpOgorCit1X2ludDhfdCBybnRhYmxlWzExNF0gPSB7CisJIDQ4LCAgOTgsICA2MywgICAxLCAgMzYsICA5NSwgIDc4LCAxMDIsICA5NCwgIDczLAorCSAgMCwgIDY0LCAgMjUsICA4MSwgIDc2LCAgNTksIDEyNCwgIDIzLCAxMDQsIDEwMCwKKwkxMDEsICA0NywgMTE4LCAgODUsICAxOCwgIDU2LCAgOTYsICA4NiwgIDU0LCAgIDIsCisJIDgwLCAgMzQsIDEyNywgIDEzLCAgIDYsICA4OSwgIDU3LCAxMDMsICAxMiwgIDc0LAorCSA1NSwgMTExLCAgNzUsICAzOCwgMTA5LCAgNzEsIDExMiwgIDI5LCAgMTEsICA4OCwKKwkgODcsICAxOSwgICAzLCAgNjgsIDExMCwgIDI2LCAgMzMsICAzMSwgICA4LCAgNDUsCisJIDgyLCAgNTgsICA0MCwgMTA3LCAgMzIsICAgNSwgMTA2LCAgOTIsICA2MiwgIDY3LAorCSA3NywgMTA4LCAxMjIsICAzNywgIDYwLCAgNjYsIDEyMSwgIDQyLCAgNTEsIDEyNiwKKwkxMTcsIDExNCwgICA0LCAgOTAsICA0MywgIDUyLCAgNTMsIDExMywgMTIwLCAgNzIsCisJIDE2LCAgNDksICAgNywgIDc5LCAxMTksICA2MSwgIDIyLCAgODQsICAgOSwgIDk3LAorCTEyNSwgIDk5LCAgMTcsIDEyMworfTsKKworLyogbWFpPTAgcmVwcmVzZW50cyBsb3dlc3QgQVJGQ04gaW4gdGhlIE1BICovCisKKwordV9pbnQ4X3QgaG9wcGluZ19tYWkodV9pbnQ4X3QgaHNuLCB1X2ludDMyX3QgZm4sIHVfaW50OF90IG1haW8sCisJCSAgICAgdV9pbnQ4X3QgdDEsIHVfaW50OF90IHQyLCB1X2ludDhfdCB0M18pCit7CisJdV9pbnQ4X3QgbWFpOworCisJaWYgKGhzbiA9PSAwKSAvKiBjeWNsaWMgaG9wcGluZyAqLworCQltYWkgPSAoZm4gKyBtYWlvKSAlIG47CisJZWxzZSB7CisJCXVfaW50MzJfdCBtLCBtXywgdF8sIHM7CisKKwkJbSA9IHQyICsgcm50YWJsZVsoaHNuIHhvciAodDEgJSA2NCkpICsgdDNdOworCQltXyA9IG0gJSAoMl5OQklOKTsKKwkJdF8gPSB0MyAlICgyXk5CSU4pOworCQlpZiAobV8gPCBuIHRoZW4pCisJCQlzID0gbV87CisJCWVsc2UKKwkJCXMgPSAobV8gKyB0XykgJSBuOworCQltYWkgPSAocyArIG1haW8pICUgbjsKKwl9CisKKwlyZXR1cm4gbWFpOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9oYW5kb3Zlci50eHQgYi9vcGVuYnNjL2RvYy9oYW5kb3Zlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxOWU4NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2hhbmRvdmVyLnR4dApAQCAtMCwwICsxLDg5IEBACitJZGVhcyBhYm91dCBhIGhhbmRvdmVyIGFsZ29yaXRobQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGlzIG1vc3RseSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBwcmVzZW50ZWQgaW4gQ2hhcHRlciA4IG9mICJQZXJmb3JtYW5jZQorRW5oYW5jZW1lbnRzIGluIGEgRnJlcXVlbmN5IEhvcHBpbmcgR1NNIE5ldHdvcmsiIGJ5IFRob21hcyBUb2Z0ZWdhYXJkIE5pZWxzZW4KK2FuZCBKb2Vyb2VuIFdpZ2FyZC4gCisKKworPT09IFJlYXNvbnMgZm9yIHBlcmZvcm1pbmcgaGFuZG92ZXIgPT09CisKK1NlY3Rpb24gMi4xLjE6IEhhbmRvdmVyIHVzZWQgaW4gdGhlaXIgQ0FQQUNJVFkgc2ltdWxhdGlvbjoKKworMSkgSW50ZXJmZXJlbmNlIEhhbmRvdmVyCisKK0F2ZXJhZ2UgUlhMRVYgaXMgc2F0aXNmYWN0b3J5IGhpZ2gsIGJ1dCBhdmVyYWdlIFJYUVVBTCB0b28gbG93IGluZGljYXRlcworaW50ZXJmZXJlbmNlIHRvIHRoZSBjaGFubmVsLiAgSGFuZG92ZXIgc2hvdWxkIGJlIG1hZGUuCisKKzIpIEJhZCBRdWFsaXR5CisKK0F2ZXJhZ2VkIFJYUVVBTCBpcyBsb3dlciB0aGFuIGEgdGhyZXNob2xkCisKKzMpIExvdyBMZXZlbCAvIFNpZ25hbCBTdHJlbmd0aAorCitBdmVyYWdlIFJYTEVWIGlzIGxvd2VyIHRoYW4gYSB0aHJlc2hvbGQKKworNCkgRGlzdGFuY2UgSGFuZG92ZXIKKworTVMgaXMgdG9vIGZhciBhd2F5IGZyb20gYSBjZWxsIChtZWFzdXJlZCBieSBUQSkKKworNSkgUG93ZXIgYnVkZ2V0IC8gQmV0dGVyIENlbGwKKworUlggTGV2ZWwgb2YgbmVpZ2hib3IgY2VsbCBpcyBhdCBsZWFzdCAiSE8gTWFyZ2luIGRCIiBkQiBiZXR0ZXIgdGhhbiB0aGUKK2N1cnJlbnQgc2VydmluZyBjZWxsLgorCis9PT0gSWRlYWwgcGFyYW1ldGVycyBmb3IgSE8gYWxnb3JpdGhtID09PQorCitDaGFwdGVyIDgsIFNlY3Rpb24gMi4yLCBUYWJsZSAyNDoKKworV2luZG93IFJYTEVWIGF2ZXJhZ2luZzoJCTEwIFNBQ0NIIGZyYW1lcyAobm8gd2VpZ2h0aW5nKQorV2luZG93IFJYUVVBTCBhdmVyYWdpbmc6CTEgU0FDQ0ggZnJhbWUgKG5vIGF2ZXJhZ2luZykKK0xldmVsIFRocmVhc2hvbGQ6CQkxIG9mIHRoZSBsYXN0IDEgQVYtUlhMRVYgdmFsdWVzIDwgLTExMGRCbQorUXVhbGl0eSBUaHJlc2hvbGQ6CQkzIG9mIHRoZSBsYXN0IDQgQVYtUlhRVUFMIHZhbHVlcyA+PSA1CitJbnRlcmZlcmVuY2UgVGhyZXNob2xkOgkJMSBvZiB0aGUgbGFzdCBBVi1SWExFViA+IC04NSBkQm0gJgorCQkJCTMgb2YgdGhlIGxhc3QgNCBBVi1SWFFVQUwgdmFsdWVzID49IDUKK1Bvd2VyIEJ1ZGdldDoJCQlMZXZlbCBvZiBuZWlnaGJvciBjZWxsID4gMyBkQiBiZXR0ZXIKK1Bvd2VyIEJ1ZGdldCBJbnRlcnZhbDoJCUV2ZXJ5IDYgU0FDQ0ggZnJhbWVzICg2IHNlY29uZHMgPyE/KQorRGlzdGFuY2UgSGFuZG92ZXI6CQlEaXNhYmxlZAorRXZhbHVhdGlvbiBydWxlIDE6CQlSWExFViBvZiB0aGUgY2FuZGlkYXRlIGNlbGwgYSB0bGVhc3QgLTEwNCBkQm0KK0V2YWx1YXRpb24gcnVsZSAyOgkJTGV2ZWwgb2YgY2FuZGlkYXRlIGNlbGwgPiAzZEIgYmV0dGVyIG93biBjZWxsCitUaW1lciBTdWNjZXNzZnVsIEhPOgkJNSBTQUNDSCBmcmFtZXMKK1RpbWVyIFVuc3VjY2Vzc2Z1bCBITzoJCTEgU0FDQ0ggZnJhbWUKKworSW4gYSBub24tZnJlcXVlbmN5IGhvcHBpbmcgY2FzZSwgUlhRVUFMIHRocmVzaG9sZCBjYW4gYmUgZGVjcmVhc2VkIHRvCitSWExFViA+PSA0CisKK1doZW4gZnJlcXVlbmN5IGhvcHBpbmcgaXMgZW5hYmxlZCwgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKK3Nob3VsZCBiZSBpbnRyb2R1Y2VkOgorCisqIE5vIGludHJhLWNlbGwgaGFuZG92ZXIKKyogVXNlIGEgSE8gTWFyZ2luIG9mIDJkQgorCis9PT0gSGFuZG92ZXIgQ2hhbm5lbCBSZXNlcnZhdGlvbiA9PT0KKworSW4gbG9hZGVkIG5ldHdvcmssIGVhY2ggY2VsbCBzaG91bGQgcmVzZXJ2ZSBzb21lIGNoYW5uZWxzIGZvciBoYW5kb3ZlcnMsCityYXRoZXIgdGhhbiB1c2luZyBhbGwgb2YgdGhlbSBmb3IgbmV3IGNhbGwgZXN0YWJsaXNobWVudC4gIFRoaXMgcmVkdWNlcyB0aGUKK25lZWQgdG8gZHJvcCBjYWxscyBkdWUgdG8gZmFpbGluZyBoYW5kb3ZlcnMsIGF0IHRoZSBleHBlbnNlIG9mIGZhaWxpbmcgbmV3IGNhbGwKK2F0dGVtcHRzLgorCis9PT0gRHluYW1pYyBITyBNYXJnaW4gPT09CisKK1RoZSBoYW5kb3ZlciBtYXJnaW4gKGh5c3RlcmVzaXMpIHNob3VsZCBkZXBlbmQgb24gdGhlIFJYUVVBTC4gT3B0aW1hbCByZXN1bHRzCit3ZXJlIGFjaGlldmVkIHdpdGggdGhlIGZvbGxvd2luZyBzZXR0aW5nczoKKyogUlhRVUFMIDw9IDQ6IDkgZEIKKyogUlhRVUFMID09IDU6IDYgZEIKKyogUlhRVUFMID49IDY6IDEgZEIKKworCisKKz09IEFjdHVhbCBIYW5kb3ZlciBvbiBhIHByb3RvY29sIGxldmVsID09CisKK0FmdGVyIHRoZSBCU0MgaGFzIGRlY2lkZWQgYSBoYW5kb3ZlciBzaGFsbCBiZSBkb25lLCBpdCBoYXMgdG8KKworIyBhbGxvY2F0ZSBhIGNoYW5uZWwgYXQgdGhlIG5ldyBCVFMKKyMgYWxsb2NhdGUgYSBoYW5kb3ZlciByZWZlcmVuY2UKKyMgYWN0aXZhdGUgdGhlIGNoYW5uZWwgb24gdGhlIEJUUyBzaWRlIHVzaW5nIFJTTCBDSEFOTkVMIEFDVElWQVRJT04sCisgIGluZGljYXRpbmcgdGhlIEhPIHJlZmVyZW5jZQorIyBCVFMgcmVzcG9uZHMgd2l0aCBDSEFOIEFDVCBBQ0ssIGluY2x1ZGluZyBHU00gZnJhbWUgbnVtYmVyCisjIEJTQyBzZW5kcyAwNC4wOCBITyBDTUQgdG8gTVMgdXNpbmcgb2xkIEJUUworCmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9vbWwtaW50ZXJmYWNlLnR4dCBiL29wZW5ic2MvZG9jL29tbC1pbnRlcmZhY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZGNmZWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9vbWwtaW50ZXJmYWNlLnR4dApAQCAtMCwwICsxLDIxIEBACitvbWwgaW50ZXJmYWNlIGRlc2lnbiBub3RlcworCitwcm9ibGVtczoKKworKiB0aGVyZSBpcyBubyB3YXkgaG93IHRvIHRhZyBhIGNvbW1hbmQgc2VudCB0byB0aGUgQlRTLCB3aXRoIHRoZSByZXNwb25zZQorICBoYXZpbmcgdGhlIHNhbWUgdGFnIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBjb21tYW5kCisqIHRoZXJlZm9yZSwgd2UgY2FuIGhhdmUgZS5nLiBib3RoIHRoZSBCU0MgYW5kIHRoZSBPTUwgaW50ZXJmYWNlIHNlbmQgYQorICBTRVQgQVRUUklCVVRFIG1lc3NhZ2UsIHdoZXJlIHRoZSByZXNwb25zZXMgd291bGQgZW5kIHVwIGF0IHRoZSB3cm9uZworICBxdWVyeS4KKwordGhlIG9ubHkgcG9zc2libGUgc29sdXRpb25zIGkgY2FuIGltYWdpbmU6CisqIGhhdmUgc29tZSBraW5kIG9mIGV4Y2x1c2l2ZSBsb2NraW5nLCB3aGVyZSB0aGUgT01MIGludGVyZmFjZSBnZXRzIGJsb2NrZWQKKyAgZnJvbSB0aGUgQlNDIGFuZCBpcyBleGNsdXNpdmVseSBhc3NpZ25lZCB0byB0aGUgT01MIGNvbnNvbGUgdW50aWwgYWxsIGNvbW1hbmRzCisgIG9mIHRoZSBPTUwgY29uc29sZSBoYXZlIHRlcm1pbmF0ZWQuICBUaGlzIGNhbiBlaXRoZXIgYmUgZG9uZSBleHBsaWNpdGx5CisgIGR5bmFtaWNhbGx5IG9yIG9uIGRlbWFuZAorCisqIHVzZSB0aGUgT01MIGludGVyZmFjZSBzeW5jaHJvbm91c2x5LCBpLmUuIGFsd2F5cyB3YWl0IGZvciB0aGUgcmVzcG9uc2UgZnJvbQorICB0aGUgQlRTIGJlZm9yZQorCisqIHVuaWxhdGVyYWwgLyB1bnNvbGljaXRlZCBtZXNzYWdlcyBuZWVkIHRvIGJlIGJyb2FkY2FzdGVkIHRvIGJvdGggdGhlIEJTQyBhbmQKKyAgdGhlIE9NTCBjb25zb2xlCmRpZmYgLS1naXQgYS9vcGVuYnNjL2dpdC12ZXJzaW9uLWdlbiBiL29wZW5ic2MvZ2l0LXZlcnNpb24tZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYyYWQ0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2dpdC12ZXJzaW9uLWdlbgpAQCAtMCwwICsxLDE1MSBAQAorIyEvYmluL3NoCisjIFByaW50IGEgdmVyc2lvbiBzdHJpbmcuCitzY3JpcHR2ZXJzaW9uPTIwMTAtMDEtMjguMDEKKworIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgVGhpcyBzY3JpcHQgaXMgZGVyaXZlZCBmcm9tIEdJVC1WRVJTSU9OLUdFTiBmcm9tIEdJVDogaHR0cDovL2dpdC5vci5jei8uCisjIEl0IG1heSBiZSBydW4gdHdvIHdheXM6CisjIC0gZnJvbSBhIGdpdCByZXBvc2l0b3J5IGluIHdoaWNoIHRoZSAiZ2l0IGRlc2NyaWJlIiBjb21tYW5kIGJlbG93CisjICAgcHJvZHVjZXMgdXNlZnVsIG91dHB1dCAodGh1cyByZXF1aXJpbmcgYXQgbGVhc3Qgb25lIHNpZ25lZCB0YWcpCisjIC0gZnJvbSBhIG5vbi1naXQtcmVwbyBkaXJlY3RvcnkgY29udGFpbmluZyBhIC50YXJiYWxsLXZlcnNpb24gZmlsZSwgd2hpY2gKKyMgICBwcmVzdW1lcyB0aGlzIHNjcmlwdCBpcyBpbnZva2VkIGxpa2UgIi4vZ2l0LXZlcnNpb24tZ2VuIC50YXJiYWxsLXZlcnNpb24iLgorCisjIEluIG9yZGVyIHRvIHVzZSBpbnRyYS12ZXJzaW9uIHN0cmluZ3MgaW4geW91ciBwcm9qZWN0LCB5b3Ugd2lsbCBuZWVkIHR3bworIyBzZXBhcmF0ZSBnZW5lcmF0ZWQgdmVyc2lvbiBzdHJpbmcgZmlsZXM6CisjCisjIC50YXJiYWxsLXZlcnNpb24gLSBwcmVzZW50IG9ubHkgaW4gYSBkaXN0cmlidXRpb24gdGFyYmFsbCwgYW5kIG5vdCBpbgorIyAgIGEgY2hlY2tlZC1vdXQgcmVwb3NpdG9yeS4gIENyZWF0ZWQgd2l0aCBjb250ZW50cyB0aGF0IHdlcmUgbGVhcm5lZCBhdAorIyAgIHRoZSBsYXN0IHRpbWUgYXV0b2NvbmYgd2FzIHJ1biwgYW5kIHVzZWQgYnkgZ2l0LXZlcnNpb24tZ2VuLiAgTXVzdCBub3QKKyMgICBiZSBwcmVzZW50IGluIGVpdGhlciAkKHNyY2Rpcikgb3IgJChidWlsZGRpcikgZm9yIGdpdC12ZXJzaW9uLWdlbiB0bworIyAgIGdpdmUgYWNjdXJhdGUgYW5zd2VycyBkdXJpbmcgbm9ybWFsIGRldmVsb3BtZW50IHdpdGggYSBjaGVja2VkIG91dCB0cmVlLAorIyAgIGJ1dCBtdXN0IGJlIHByZXNlbnQgaW4gYSB0YXJiYWxsIHdoZW4gdGhlcmUgaXMgbm8gdmVyc2lvbiBjb250cm9sIHN5c3RlbS4KKyMgICBUaGVyZWZvcmUsIGl0IGNhbm5vdCBiZSB1c2VkIGluIGFueSBkZXBlbmRlbmNpZXMuICBHTlVtYWtlZmlsZSBoYXMKKyMgICBob29rcyB0byBmb3JjZSBhIHJlY29uZmlndXJlIGF0IGRpc3RyaWJ1dGlvbiB0aW1lIHRvIGdldCB0aGUgdmFsdWUKKyMgICBjb3JyZWN0LCB3aXRob3V0IHBlbmFsaXppbmcgbm9ybWFsIGRldmVsb3BtZW50IHdpdGggZXh0cmEgcmVjb25maWd1cmVzLgorIworIyAudmVyc2lvbiAtIHByZXNlbnQgaW4gYSBjaGVja2VkLW91dCByZXBvc2l0b3J5IGFuZCBpbiBhIGRpc3RyaWJ1dGlvbgorIyAgIHRhcmJhbGwuICBVc2FibGUgaW4gZGVwZW5kZW5jaWVzLCBwYXJ0aWN1bGFybHkgZm9yIGZpbGVzIHRoYXQgZG9uJ3QKKyMgICB3YW50IHRvIGRlcGVuZCBvbiBjb25maWcuaCBidXQgZG8gd2FudCB0byB0cmFjayB2ZXJzaW9uIGNoYW5nZXMuCisjICAgRGVsZXRlIHRoaXMgZmlsZSBwcmlvciB0byBhbnkgYXV0b2NvbmYgcnVuIHdoZXJlIHlvdSB3YW50IHRvIHJlYnVpbGQKKyMgICBmaWxlcyB0byBwaWNrIHVwIGEgdmVyc2lvbiBzdHJpbmcgY2hhbmdlOyBhbmQgbGVhdmUgaXQgc3RhbGUgdG8KKyMgICBtaW5pbWl6ZSByZWJ1aWxkIHRpbWUgYWZ0ZXIgdW5yZWxhdGVkIGNoYW5nZXMgdG8gY29uZmlndXJlIHNvdXJjZXMuCisjCisjIEl0IGlzIHByb2JhYmx5IHdpc2UgdG8gYWRkIHRoZXNlIHR3byBmaWxlcyB0byAuZ2l0aWdub3JlLCBzbyB0aGF0IHlvdQorIyBkb24ndCBhY2NpZGVudGFsbHkgY29tbWl0IGVpdGhlciBnZW5lcmF0ZWQgZmlsZS4KKyMKKyMgVXNlIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB5b3VyIGNvbmZpZ3VyZS5hYywgc28gdGhhdCAkKFZFUlNJT04pIHdpbGwKKyMgYXV0b21hdGljYWxseSBiZSB1cC10by1kYXRlIGVhY2ggdGltZSBjb25maWd1cmUgaXMgcnVuIChhbmQgbm90ZSB0aGF0CisjIHNpbmNlIGNvbmZpZ3VyZS5hYyBubyBsb25nZXIgaW5jbHVkZXMgYSB2ZXJzaW9uIHN0cmluZywgTWFrZWZpbGUgcnVsZXMKKyMgc2hvdWxkIG5vdCBkZXBlbmQgb24gY29uZmlndXJlLmFjIGZvciB2ZXJzaW9uIHVwZGF0ZXMpLgorIworIyBBQ19JTklUKFtHTlUgcHJvamVjdF0sCisjICAgICAgICAgbTRfZXN5c2NtZChbYnVpbGQtYXV4L2dpdC12ZXJzaW9uLWdlbiAudGFyYmFsbC12ZXJzaW9uXSksCisjICAgICAgICAgW2J1Zy1wcm9qZWN0QGV4YW1wbGVdKQorIworIyBUaGVuIHVzZSB0aGUgZm9sbG93aW5nIGxpbmVzIGluIHlvdXIgTWFrZWZpbGUuYW0sIHNvIHRoYXQgLnZlcnNpb24KKyMgd2lsbCBiZSBwcmVzZW50IGZvciBkZXBlbmRlbmNpZXMsIGFuZCBzbyB0aGF0IC50YXJiYWxsLXZlcnNpb24gd2lsbAorIyBleGlzdCBpbiBkaXN0cmlidXRpb24gdGFyYmFsbHMuCisjCisjIEJVSUxUX1NPVVJDRVMgPSAkKHRvcF9zcmNkaXIpLy52ZXJzaW9uCisjICQodG9wX3NyY2RpcikvLnZlcnNpb246CisjCWVjaG8gJChWRVJTSU9OKSA+ICRALXQgJiYgbXYgJEAtdCAkQAorIyBkaXN0LWhvb2s6CisjCWVjaG8gJChWRVJTSU9OKSA+ICQoZGlzdGRpcikvLnRhcmJhbGwtdmVyc2lvbgorCitjYXNlICQjIGluCisgICAgMSkgOzsKKyAgICAqKSBlY2hvIDE+JjIgIlVzYWdlOiAkMCBcJHNyY2Rpci8udGFyYmFsbC12ZXJzaW9uIjsgZXhpdCAxOzsKK2VzYWMKKwordGFyYmFsbF92ZXJzaW9uX2ZpbGU9JDEKK25sPScKKycKKworIyBGaXJzdCBzZWUgaWYgdGhlcmUgaXMgYSB0YXJiYWxsLW9ubHkgdmVyc2lvbiBmaWxlLgorIyB0aGVuIHRyeSAiZ2l0IGRlc2NyaWJlIiwgdGhlbiBkZWZhdWx0LgoraWYgdGVzdCAtZiAkdGFyYmFsbF92ZXJzaW9uX2ZpbGUKK3RoZW4KKyAgICB2PWBjYXQgJHRhcmJhbGxfdmVyc2lvbl9maWxlYCB8fCBleGl0IDEKKyAgICBjYXNlICR2IGluCisJKiRubCopIHY9IDs7ICMgcmVqZWN0IG11bHRpLWxpbmUgb3V0cHV0CisJWzAtOV0qKSA7OworCSopIHY9IDs7CisgICAgZXNhYworICAgIHRlc3QgLXogIiR2IiBcCisJJiYgZWNobyAiJDA6IFdBUk5JTkc6ICR0YXJiYWxsX3ZlcnNpb25fZmlsZSBzZWVtcyB0byBiZSBkYW1hZ2VkIiAxPiYyCitmaQorCitpZiB0ZXN0IC1uICIkdiIKK3RoZW4KKyAgICA6ICMgdXNlICR2CitlbGlmIHRlc3QgLWQgLi8uLi8uZ2l0IFwKKyAgICAmJiB2PWBnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCAtLW1hdGNoPSd2KicgSEVBRCAyPi9kZXYvbnVsbCBcCisJICB8fCBnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCBIRUFEIDI+L2Rldi9udWxsYCBcCisgICAgJiYgY2FzZSAkdiBpbgorCSBbMC05XSopIDs7CisJIHZbMC05XSopIDs7CisJICopIChleGl0IDEpIDs7CisgICAgICAgZXNhYwordGhlbgorICAgICMgSXMgdGhpcyBhIG5ldyBnaXQgdGhhdCBsaXN0cyBudW1iZXIgb2YgY29tbWl0cyBzaW5jZSB0aGUgbGFzdAorICAgICMgdGFnIG9yIHRoZSBwcmV2aW91cyBvbGRlciB2ZXJzaW9uIHRoYXQgZGlkIG5vdD8KKyAgICAjICAgTmV3ZXI6IHY2LjEwLTc3LWcwZjhmYWViCisgICAgIyAgIE9sZGVyOiB2Ni4xMC1nMGY4ZmFlYgorICAgIGNhc2UgJHYgaW4KKwkqLSotKikgOiBnaXQgZGVzY3JpYmUgaXMgb2theSB0aHJlZSBwYXJ0IGZsYXZvciA7OworCSotKikKKwkgICAgOiBnaXQgZGVzY3JpYmUgaXMgb2xkZXIgdHdvIHBhcnQgZmxhdm9yCisJICAgICMgUmVjcmVhdGUgdGhlIG51bWJlciBvZiBjb21taXRzIGFuZCByZXdyaXRlIHN1Y2ggdGhhdCB0aGUKKwkgICAgIyByZXN1bHQgaXMgdGhlIHNhbWUgYXMgaWYgd2Ugd2VyZSB1c2luZyB0aGUgbmV3ZXIgdmVyc2lvbgorCSAgICAjIG9mIGdpdCBkZXNjcmliZS4KKwkgICAgdnRhZz1gZWNobyAiJHYiIHwgc2VkICdzLy0uKi8vJ2AKKwkgICAgbnVtY29tbWl0cz1gZ2l0IHJldi1saXN0ICIkdnRhZyIuLkhFQUQgfCB3YyAtbGAKKwkgICAgdj1gZWNobyAiJHYiIHwgc2VkICJzL1woLipcKS1cKC4qXCkvXDEtJG51bWNvbW1pdHMtXDIvImA7CisJICAgIDs7CisgICAgZXNhYworCisgICAgIyBDaGFuZ2UgdGhlIGZpcnN0ICctJyB0byBhICcuJywgc28gdmVyc2lvbi1jb21wYXJpbmcgdG9vbHMgd29yayBwcm9wZXJseS4KKyAgICAjIFJlbW92ZSB0aGUgImciIGluIGdpdCBkZXNjcmliZSdzIG91dHB1dCBzdHJpbmcsIHRvIHNhdmUgYSBieXRlLgorICAgIHY9YGVjaG8gIiR2IiB8IHNlZCAncy8tLy4vO3MvXCguKlwpLWcvXDEtLydgOworZWxzZQorICAgIHY9VU5LTk9XTgorZmkKKwordj1gZWNobyAiJHYiIHxzZWQgJ3MvXnYvLydgCisKKyMgRG9uJ3QgZGVjbGFyZSBhIHZlcnNpb24gImRpcnR5IiBtZXJlbHkgYmVjYXVzZSBhIHRpbWUgc3RhbXAgaGFzIGNoYW5nZWQuCitnaXQgc3RhdHVzID4gL2Rldi9udWxsIDI+JjEKKworZGlydHk9YHNoIC1jICdnaXQgZGlmZi1pbmRleCAtLW5hbWUtb25seSBIRUFEJyAyPi9kZXYvbnVsbGAgfHwgZGlydHk9CitjYXNlICIkZGlydHkiIGluCisgICAgJycpIDs7CisgICAgKikgIyBBcHBlbmQgdGhlIHN1ZmZpeCBvbmx5IGlmIHRoZXJlIGlzbid0IG9uZSBhbHJlYWR5LgorCWNhc2UgJHYgaW4KKwkgICotZGlydHkpIDs7CisJICAqKSB2PSIkdi1kaXJ0eSIgOzsKKwllc2FjIDs7Citlc2FjCisKKyMgT21pdCB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28gdGhhdCBtNF9lc3lzY21kIGNhbiB1c2UgdGhlIHJlc3VsdCBkaXJlY3RseS4KK2VjaG8gIiR2IiB8IHRyIC1kICdcMDEyJworCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLWVuZDogIiQiCisjIEVuZDoKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9NYWtlZmlsZS5hbSBiL29wZW5ic2MvaW5jbHVkZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmIyYTMzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMyBAQAorU1VCRElSUyA9IG9wZW5ic2MgdnR5IHNjY3AKKworbm9pbnN0X0hFQURFUlMgPSBtSVNETmlmLmggY29tcGF0X2FmX2lzZG4uaApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL2NvbXBhdF9hZl9pc2RuLmggYi9vcGVuYnNjL2luY2x1ZGUvY29tcGF0X2FmX2lzZG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmNiZmIzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL2NvbXBhdF9hZl9pc2RuLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmZGVmIE1JU0ROX09MRF9BRl9DT01QQVRJQklMSVRZCisjdW5kZWYgQUZfSVNETgorI3VuZGVmIFBGX0lTRE4KKworZXh0ZXJuCWludAlBRl9JU0ROOworI2RlZmluZSBQRl9JU0ROCUFGX0lTRE4KKworaW50CUFGX0lTRE47CisKKyNlbmRpZgorCitleHRlcm4gdm9pZCBpbml0X2FmX2lzZG4odm9pZCk7CisKKyNpZmRlZiBBRl9DT01QQVRJQklMSVRZX0ZVTkMKKyNpZmRlZiBNSVNETl9PTERfQUZfQ09NUEFUSUJJTElUWQordm9pZCBpbml0X2FmX2lzZG4odm9pZCkKK3sKKwlpbnQJczsKKworCS8qIHRlc3QgZm9yIG5ldyB2YWx1ZSAqLworCUFGX0lTRE4gPSAzNDsKKwlzID0gc29ja2V0KEFGX0lTRE4sIFNPQ0tfUkFXLCBJU0ROX1BfQkFTRSk7CisJaWYgKHMgPj0gMCkgeworCQljbG9zZShzKTsKKwkJcmV0dXJuOworCX0KKwlBRl9JU0ROID0gMjc7CisJcyA9IHNvY2tldChBRl9JU0ROLCBTT0NLX1JBVywgSVNETl9QX0JBU0UpOworCWlmIChzID49IDApIHsKKwkJY2xvc2Uocyk7CisJCXJldHVybjsKKwl9Cit9CisjZWxzZQordm9pZCBpbml0X2FmX2lzZG4odm9pZCkKK3sKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvbUlTRE5pZi5oIGIvb3BlbmJzYy9pbmNsdWRlL21JU0ROaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTA2NWQyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL21JU0ROaWYuaApAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqCisgKiBBdXRob3IJS2Fyc3RlbiBLZWlsIDxra2VpbEBub3ZlbGwuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDA4ICBieSBLYXJzdGVuIEtlaWwgPGtrZWlsQG5vdmVsbC5jb20+CisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgKiB2ZXJzaW9uIDIuMSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBtSVNETklGX0gKKyNkZWZpbmUgbUlTRE5JRl9ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpZmRlZiBsaW51eAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisKKy8qCisgKiBBQkkgVmVyc2lvbiAzMiBiaXQKKyAqCisgKiA8OCBiaXQ+IE1ham9yIHZlcnNpb24KKyAqCQktIGNoYW5nZWQgaWYgYW55IGludGVyZmFjZSBiZWNvbWUgYmFja3dhcmRzIGluY29tcGF0aWJsZQorICoKKyAqIDw4IGJpdD4gTWlub3IgdmVyc2lvbgorICogICAgICAgICAgICAgIC0gY2hhbmdlZCBpZiBhbnkgaW50ZXJmYWNlIGlzIGV4dGVuZGVkIGJ1dCBiYWNrd2FyZHMgY29tcGF0aWJsZQorICoKKyAqIDwxNiBiaXQ+IFJlbGVhc2UgbnVtYmVyCisgKiAgICAgICAgICAgICAgLSBzaG91bGQgYmUgaW5jcmVtZW50ZWQgb24gZXZlcnkgY2hlY2tpbgorICovCisjZGVmaW5lCU1JU0ROX01BSk9SX1ZFUlNJT04JMQorI2RlZmluZQlNSVNETl9NSU5PUl9WRVJTSU9OCTEKKyNkZWZpbmUgTUlTRE5fUkVMRUFTRQkJMjAKKworLyogcHJpbWl0aXZlcyBmb3IgaW5mb3JtYXRpb24gZXhjaGFuZ2UKKyAqIGdlbmVyZWxsIGZvcm1hdAorICogPDE2ICBiaXQgIDAgPgorICogPDggIGJpdCBjb21tYW5kPgorICogICAgQklUIDggPSAxIExBWUVSIHByaXZhdGUKKyAqICAgIEJJVCA3ID0gMSBhbnN3ZXIKKyAqICAgIEJJVCA2ID0gMSBEQVRBCisgKiA8OCAgYml0IHRhcmdldCBsYXllciBtYXNrPgorICoKKyAqIExheWVyID0gMDAgaXMgcmVzZXJ2ZWQgZm9yIGdlbmVyYWwgY29tbWFuZHMKKyAgIExheWVyID0gMDEgIEwyIC0+IEhXCisgICBMYXllciA9IDAyICBIVyAtPiBMMgorICAgTGF5ZXIgPSAwNCAgTDMgLT4gTDIKKyAgIExheWVyID0gMDggIEwyIC0+IEwzCisgKiBMYXllciA9IEZGIGlzIHJlc2VydmVkIGZvciBicm9hZGNhc3QgY29tbWFuZHMKKyAqLworCisjZGVmaW5lIE1JU0ROX0NNRE1BU0sJCTB4ZmYwMAorI2RlZmluZSBNSVNETl9MQVlFUk1BU0sJCTB4MDBmZgorCisvKiBnZW5lcmVsbCBjb21tYW5kcyAqLworI2RlZmluZSBPUEVOX0NIQU5ORUwJCTB4MDEwMAorI2RlZmluZSBDTE9TRV9DSEFOTkVMCQkweDAyMDAKKyNkZWZpbmUgQ09OVFJPTF9DSEFOTkVMCQkweDAzMDAKKyNkZWZpbmUgQ0hFQ0tfREFUQQkJMHgwNDAwCisKKy8qIGxheWVyIDIgLT4gbGF5ZXIgMSAqLworI2RlZmluZSBQSF9BQ1RJVkFURV9SRVEJCTB4MDEwMQorI2RlZmluZSBQSF9ERUFDVElWQVRFX1JFUQkweDAyMDEKKyNkZWZpbmUgUEhfREFUQV9SRVEJCTB4MjAwMQorI2RlZmluZSBNUEhfQUNUSVZBVEVfUkVRCTB4MDUwMQorI2RlZmluZSBNUEhfREVBQ1RJVkFURV9SRVEJMHgwNjAxCisjZGVmaW5lIE1QSF9JTkZPUk1BVElPTl9SRVEJMHgwNzAxCisjZGVmaW5lIFBIX0NPTlRST0xfUkVRCQkweDA4MDEKKworLyogbGF5ZXIgMSAtPiBsYXllciAyICovCisjZGVmaW5lIFBIX0FDVElWQVRFX0lORAkJMHgwMTAyCisjZGVmaW5lIFBIX0FDVElWQVRFX0NORgkJMHg0MTAyCisjZGVmaW5lIFBIX0RFQUNUSVZBVEVfSU5ECTB4MDIwMgorI2RlZmluZSBQSF9ERUFDVElWQVRFX0NORgkweDQyMDIKKyNkZWZpbmUgUEhfREFUQV9JTkQJCTB4MjAwMgorI2RlZmluZSBQSF9EQVRBX0VfSU5ECQkweDMwMDIKKyNkZWZpbmUgTVBIX0FDVElWQVRFX0lORAkweDA1MDIKKyNkZWZpbmUgTVBIX0RFQUNUSVZBVEVfSU5ECTB4MDYwMgorI2RlZmluZSBNUEhfSU5GT1JNQVRJT05fSU5ECTB4MDcwMgorI2RlZmluZSBQSF9EQVRBX0NORgkJMHg2MDAyCisjZGVmaW5lIFBIX0NPTlRST0xfSU5ECQkweDA4MDIKKyNkZWZpbmUgUEhfQ09OVFJPTF9DTkYJCTB4NDgwMgorCisvKiBsYXllciAzIC0+IGxheWVyIDIgKi8KKyNkZWZpbmUgRExfRVNUQUJMSVNIX1JFUQkweDEwMDQKKyNkZWZpbmUgRExfUkVMRUFTRV9SRVEJCTB4MTEwNAorI2RlZmluZSBETF9EQVRBX1JFUQkJMHgzMDA0CisjZGVmaW5lIERMX1VOSVREQVRBX1JFUQkJMHgzMTA0CisjZGVmaW5lIERMX0lORk9STUFUSU9OX1JFUQkweDAwMDQKKworLyogbGF5ZXIgMiAtPiBsYXllciAzICovCisjZGVmaW5lIERMX0VTVEFCTElTSF9JTkQJMHgxMDA4CisjZGVmaW5lIERMX0VTVEFCTElTSF9DTkYJMHg1MDA4CisjZGVmaW5lIERMX1JFTEVBU0VfSU5ECQkweDExMDgKKyNkZWZpbmUgRExfUkVMRUFTRV9DTkYJCTB4NTEwOAorI2RlZmluZSBETF9EQVRBX0lORAkJMHgzMDA4CisjZGVmaW5lIERMX1VOSVREQVRBX0lORAkJMHgzMTA4CisjZGVmaW5lIERMX0lORk9STUFUSU9OX0lORAkweDAwMDgKKworLyogaW50ZXJuIGxheWVyIDIgbWFuYWdtZW50ICovCisjZGVmaW5lIE1ETF9BU1NJR05fUkVRCQkweDE4MDQKKyNkZWZpbmUgTURMX0FTU0lHTl9JTkQJCTB4MTkwNAorI2RlZmluZSBNRExfUkVNT1ZFX1JFUQkJMHgxQTA0CisjZGVmaW5lIE1ETF9SRU1PVkVfSU5ECQkweDFCMDQKKyNkZWZpbmUgTURMX1NUQVRVU19VUF9JTkQJMHgxQzA0CisjZGVmaW5lIE1ETF9TVEFUVVNfRE9XTl9JTkQJMHgxRDA0CisjZGVmaW5lIE1ETF9TVEFUVVNfVUlfSU5ECTB4MUUwNAorI2RlZmluZSBNRExfRVJST1JfSU5ECQkweDFGMDQKKyNkZWZpbmUgTURMX0VSUk9SX1JTUAkJMHg1RjA0CisKKy8qIERMX0lORk9STUFUSU9OX0lORCB0eXBlcyAqLworI2RlZmluZSBETF9JTkZPX0wyX0NPTk5FQ1QJMHgwMDAxCisjZGVmaW5lIERMX0lORk9fTDJfUkVNT1ZFRAkweDAwMDIKKworLyogUEhfQ09OVFJPTCB0eXBlcyAqLworLyogVE9VQ0ggVE9ORSBJUyAweDIwWFggIFhYICIwIi4uLiI5IiwgIkEiLCJCIiwiQyIsIkQiLCIqIiwiIyIgKi8KKyNkZWZpbmUgRFRNRl9UT05FX1ZBTAkJMHgyMDAwCisjZGVmaW5lIERUTUZfVE9ORV9NQVNLCQkweDAwN0YKKyNkZWZpbmUgRFRNRl9UT05FX1NUQVJUCQkweDIxMDAKKyNkZWZpbmUgRFRNRl9UT05FX1NUT1AJCTB4MjIwMAorI2RlZmluZSBEVE1GX0hGQ19DT0VGCQkweDQwMDAKKyNkZWZpbmUgRFNQX0NPTkZfSk9JTgkJMHgyNDAzCisjZGVmaW5lIERTUF9DT05GX1NQTElUCQkweDI0MDQKKyNkZWZpbmUgRFNQX1JFQ0VJVkVfT0ZGCQkweDI0MDUKKyNkZWZpbmUgRFNQX1JFQ0VJVkVfT04JCTB4MjQwNgorI2RlZmluZSBEU1BfRUNIT19PTgkJMHgyNDA3CisjZGVmaW5lIERTUF9FQ0hPX09GRgkJMHgyNDA4CisjZGVmaW5lIERTUF9NSVhfT04JCTB4MjQwOQorI2RlZmluZSBEU1BfTUlYX09GRgkJMHgyNDBhCisjZGVmaW5lIERTUF9ERUxBWQkJMHgyNDBiCisjZGVmaW5lIERTUF9KSVRURVIJCTB4MjQwYworI2RlZmluZSBEU1BfVFhEQVRBX09OCQkweDI0MGQKKyNkZWZpbmUgRFNQX1RYREFUQV9PRkYJCTB4MjQwZQorI2RlZmluZSBEU1BfVFhfREVKSVRURVIJCTB4MjQwZgorI2RlZmluZSBEU1BfVFhfREVKX09GRgkJMHgyNDEwCisjZGVmaW5lIERTUF9UT05FX1BBVFRfT04JMHgyNDExCisjZGVmaW5lIERTUF9UT05FX1BBVFRfT0ZGCTB4MjQxMgorI2RlZmluZSBEU1BfVk9MX0NIQU5HRV9UWAkweDI0MTMKKyNkZWZpbmUgRFNQX1ZPTF9DSEFOR0VfUlgJMHgyNDE0CisjZGVmaW5lIERTUF9CRl9FTkFCTEVfS0VZCTB4MjQxNQorI2RlZmluZSBEU1BfQkZfRElTQUJMRQkJMHgyNDE2CisjZGVmaW5lIERTUF9CRl9BQ0NFUFQJCTB4MjQxNgorI2RlZmluZSBEU1BfQkZfUkVKRUNUCQkweDI0MTcKKyNkZWZpbmUgRFNQX1BJUEVMSU5FX0NGRwkweDI0MTgKKyNkZWZpbmUgSEZDX1ZPTF9DSEFOR0VfVFgJMHgyNjAxCisjZGVmaW5lIEhGQ19WT0xfQ0hBTkdFX1JYCTB4MjYwMgorI2RlZmluZSBIRkNfU1BMX0xPT1BfT04JCTB4MjYwMworI2RlZmluZSBIRkNfU1BMX0xPT1BfT0ZGCTB4MjYwNAorCisvKiBEU1BfVE9ORV9QQVRUX09OIHBhcmFtZXRlciAqLworI2RlZmluZSBUT05FX09GRgkJCTB4MDAwMAorI2RlZmluZSBUT05FX0dFUk1BTl9ESUFMVE9ORQkJMHgwMDAxCisjZGVmaW5lIFRPTkVfR0VSTUFOX09MRERJQUxUT05FCQkweDAwMDIKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9ESUFMVE9ORQkJMHgwMDAzCisjZGVmaW5lIFRPTkVfR0VSTUFOX0RJQUxQQlgJCTB4MDAwNAorI2RlZmluZSBUT05FX0dFUk1BTl9PTERESUFMUEJYCQkweDAwMDUKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9ESUFMUEJYCQkweDAwMDYKKyNkZWZpbmUgVE9ORV9HRVJNQU5fUklOR0lORwkJMHgwMDA3CisjZGVmaW5lIFRPTkVfR0VSTUFOX09MRFJJTkdJTkcJCTB4MDAwOAorI2RlZmluZSBUT05FX0FNRVJJQ0FOX1JJTkdQQlgJCTB4MDAwYgorI2RlZmluZSBUT05FX0dFUk1BTl9SSU5HUEJYCQkweDAwMGMKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xEUklOR1BCWAkJMHgwMDBkCisjZGVmaW5lIFRPTkVfQU1FUklDQU5fUklOR0lORwkJMHgwMDBlCisjZGVmaW5lIFRPTkVfR0VSTUFOX0JVU1kJCTB4MDAwZgorI2RlZmluZSBUT05FX0dFUk1BTl9PTERCVVNZCQkweDAwMTAKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9CVVNZCQkweDAwMTEKKyNkZWZpbmUgVE9ORV9HRVJNQU5fSEFOR1VQCQkweDAwMTIKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xESEFOR1VQCQkweDAwMTMKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9IQU5HVVAJCTB4MDAxNAorI2RlZmluZSBUT05FX1NQRUNJQUxfSU5GTwkJMHgwMDE1CisjZGVmaW5lIFRPTkVfR0VSTUFOX0dBU1NFTkJFU0VUWlQJMHgwMDE2CisjZGVmaW5lIFRPTkVfR0VSTUFOX0FVRlNDSEFMVFRPTgkweDAwMTYKKworLyogTVBIX0lORk9STUFUSU9OX0lORCAqLworI2RlZmluZSBMMV9TSUdOQUxfTE9TX09GRgkweDAwMTAKKyNkZWZpbmUgTDFfU0lHTkFMX0xPU19PTgkweDAwMTEKKyNkZWZpbmUgTDFfU0lHTkFMX0FJU19PRkYJMHgwMDEyCisjZGVmaW5lIEwxX1NJR05BTF9BSVNfT04JMHgwMDEzCisjZGVmaW5lIEwxX1NJR05BTF9SRElfT0ZGCTB4MDAxNAorI2RlZmluZSBMMV9TSUdOQUxfUkRJX09OCTB4MDAxNQorI2RlZmluZSBMMV9TSUdOQUxfU0xJUF9SWAkweDAwMjAKKyNkZWZpbmUgTDFfU0lHTkFMX1NMSVBfVFgJMHgwMDIxCisKKy8qCisgKiBwcm90b2NvbCBpZHMKKyAqIEQgY2hhbm5lbCAxLTMxCisgKiBCIGNoYW5uZWwgMzMgLSA2MworICovCisKKyNkZWZpbmUgSVNETl9QX05PTkUJCTAKKyNkZWZpbmUgSVNETl9QX0JBU0UJCTAKKyNkZWZpbmUgSVNETl9QX1RFX1MwCQkweDAxCisjZGVmaW5lIElTRE5fUF9OVF9TMCAgCQkweDAyCisjZGVmaW5lIElTRE5fUF9URV9FMQkJMHgwMworI2RlZmluZSBJU0ROX1BfTlRfRTEgIAkJMHgwNAorI2RlZmluZSBJU0ROX1BfVEVfVVAwCQkweDA1CisjZGVmaW5lIElTRE5fUF9OVF9VUDAJCTB4MDYKKworI2RlZmluZSBJU19JU0ROX1BfVEUocCkgKChwID09IElTRE5fUF9URV9TMCkgfHwgKHAgPT0gSVNETl9QX1RFX0UxKSB8fCBcCisJCQkJKHAgPT0gSVNETl9QX1RFX1VQMCkgfHwgKHAgPT0gSVNETl9QX0xBUERfVEUpKQorI2RlZmluZSBJU19JU0ROX1BfTlQocCkgKChwID09IElTRE5fUF9OVF9TMCkgfHwgKHAgPT0gSVNETl9QX05UX0UxKSB8fCBcCisJCQkJKHAgPT0gSVNETl9QX05UX1VQMCkgfHwgKHAgPT0gSVNETl9QX0xBUERfTlQpKQorI2RlZmluZSBJU19JU0ROX1BfUzAocCkgKChwID09IElTRE5fUF9URV9TMCkgfHwgKHAgPT0gSVNETl9QX05UX1MwKSkKKyNkZWZpbmUgSVNfSVNETl9QX0UxKHApICgocCA9PSBJU0ROX1BfVEVfRTEpIHx8IChwID09IElTRE5fUF9OVF9FMSkpCisjZGVmaW5lIElTX0lTRE5fUF9VUDAocCkgKChwID09IElTRE5fUF9URV9VUDApIHx8IChwID09IElTRE5fUF9OVF9VUDApKQorCisKKyNkZWZpbmUgSVNETl9QX0xBUERfVEUJCTB4MTAKKyNkZWZpbmUJSVNETl9QX0xBUERfTlQJCTB4MTEKKworI2RlZmluZSBJU0ROX1BfQl9NQVNLCQkweDFmCisjZGVmaW5lIElTRE5fUF9CX1NUQVJUCQkweDIwCisKKyNkZWZpbmUgSVNETl9QX0JfUkFXCQkweDIxCisjZGVmaW5lIElTRE5fUF9CX0hETEMJCTB4MjIKKyNkZWZpbmUgSVNETl9QX0JfWDc1U0xQCQkweDIzCisjZGVmaW5lIElTRE5fUF9CX0wyRFRNRgkJMHgyNAorI2RlZmluZSBJU0ROX1BfQl9MMkRTUAkJMHgyNQorI2RlZmluZSBJU0ROX1BfQl9MMkRTUEhETEMJMHgyNgorCisjZGVmaW5lIE9QVElPTl9MMl9QTVgJCTEKKyNkZWZpbmUgT1BUSU9OX0wyX1BUUAkJMgorI2RlZmluZSBPUFRJT05fTDJfRklYRURURUkJMworI2RlZmluZSBPUFRJT05fTDJfQ0xFQU5VUAk0CisKKy8qIHNob3VsZCBiZSBpbiBzeW5jIHdpdGggbGludXgva29iamVjdC5oOktPQkpfTkFNRV9MRU4gKi8KKyNkZWZpbmUgTUlTRE5fTUFYX0lETEVOCQkyMAorCitzdHJ1Y3QgbUlTRE5oZWFkIHsKKwl1bnNpZ25lZCBpbnQJcHJpbTsKKwl1bnNpZ25lZCBpbnQJaWQ7Cit9ICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBNSVNETl9IRUFERVJfTEVOCXNpemVvZihzdHJ1Y3QgbUlTRE5oZWFkKQorI2RlZmluZSBNQVhfREFUQV9TSVpFCQkyMDQ4CisjZGVmaW5lIE1BWF9EQVRBX01FTQkJKE1BWF9EQVRBX1NJWkUgKyBNSVNETl9IRUFERVJfTEVOKQorI2RlZmluZSBNQVhfREZSQU1FX0xFTgkJMjYwCisKKyNkZWZpbmUgTUlTRE5fSURfQUREUl9NQVNLCTB4RkZGRgorI2RlZmluZSBNSVNETl9JRF9URUlfTUFTSwkweEZGMDAKKyNkZWZpbmUgTUlTRE5fSURfU0FQSV9NQVNLCTB4MDBGRgorI2RlZmluZSBNSVNETl9JRF9URUlfQU5ZCTB4N0YwMAorCisjZGVmaW5lIE1JU0ROX0lEX0FOWQkJMHhGRkZGCisjZGVmaW5lIE1JU0ROX0lEX05PTkUJCTB4RkZGRQorCisjZGVmaW5lIEdST1VQX1RFSQkJMTI3CisjZGVmaW5lIFRFSV9TQVBJCQk2MworI2RlZmluZSBDVFJMX1NBUEkJCTAKKworI2RlZmluZSBNSVNETl9NQVhfQ0hBTk5FTAkxMjcKKyNkZWZpbmUgTUlTRE5fQ0hNQVBfU0laRQkoKE1JU0ROX01BWF9DSEFOTkVMICsgMSkgPj4gMykKKworI2RlZmluZSBTT0xfTUlTRE4JMAorCitzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4geworCXNhX2ZhbWlseV90ICAgIGZhbWlseTsKKwl1bnNpZ25lZCBjaGFyCWRldjsKKwl1bnNpZ25lZCBjaGFyCWNoYW5uZWw7CisJdW5zaWduZWQgY2hhcglzYXBpOworCXVuc2lnbmVkIGNoYXIJdGVpOworfTsKKworc3RydWN0IG1JU0ROdmVyc2lvbiB7CisJdW5zaWduZWQgY2hhcgltYWpvcjsKKwl1bnNpZ25lZCBjaGFyCW1pbm9yOworCXVuc2lnbmVkIHNob3J0CXJlbGVhc2U7Cit9OworCisjZGVmaW5lIE1BWF9ERVZJQ0VfSUQgNjMKKworc3RydWN0IG1JU0ROX2RldmluZm8geworCXVfaW50CQkJaWQ7CisJdV9pbnQJCQlEcHJvdG9jb2xzOworCXVfaW50CQkJQnByb3RvY29sczsKKwl1X2ludAkJCXByb3RvY29sOworCXVfY2hhcgkJCWNoYW5uZWxtYXBbTUlTRE5fQ0hNQVBfU0laRV07CisJdV9pbnQJCQlucmJjaGFuOworCWNoYXIJCQluYW1lW01JU0ROX01BWF9JRExFTl07Cit9OworCitzdHJ1Y3QgbUlTRE5fZGV2cmVuYW1lIHsKKwl1X2ludAkJCWlkOworCWNoYXIJCQluYW1lW01JU0ROX01BWF9JRExFTl07Cit9OworCitzdHJ1Y3QgcGhfaW5mb19jaCB7CisJaW50MzJfdCAJCXByb3RvY29sOworCWludDY0X3QJCQlGbGFnczsKK307CisKK3N0cnVjdCBwaF9pbmZvX2RjaCB7CisJc3RydWN0IHBoX2luZm9fY2gJY2g7CisJaW50MTZfdAkJCXN0YXRlOworCWludDE2X3QJCQludW1fYmNoOworfTsKKworc3RydWN0IHBoX2luZm8geworCXN0cnVjdCBwaF9pbmZvX2RjaAlkY2g7CisJc3RydWN0IHBoX2luZm9fY2ggCWJjaFtdOworfTsKKworLyogdGltZXIgZGV2aWNlIGlvY3RsICovCisjZGVmaW5lIElNQUREVElNRVIJX0lPUignSScsIDY0LCBpbnQpCisjZGVmaW5lIElNREVMVElNRVIJX0lPUignSScsIDY1LCBpbnQpCisvKiBzb2NrZXQgaW9jdGxzICovCisjZGVmaW5lCUlNR0VUVkVSU0lPTglfSU9SKCdJJywgNjYsIGludCkKKyNkZWZpbmUJSU1HRVRDT1VOVAlfSU9SKCdJJywgNjcsIGludCkKKyNkZWZpbmUgSU1HRVRERVZJTkZPCV9JT1IoJ0knLCA2OCwgaW50KQorI2RlZmluZSBJTUNUUkxSRVEJX0lPUignSScsIDY5LCBpbnQpCisjZGVmaW5lIElNQ0xFQVJfTDIJX0lPUignSScsIDcwLCBpbnQpCisjZGVmaW5lIElNU0VUREVWTkFNRQlfSU9SKCdJJywgNzEsIHN0cnVjdCBtSVNETl9kZXZyZW5hbWUpCisKK3N0YXRpYyBpbmxpbmUgaW50Cit0ZXN0X2NoYW5uZWxtYXAodV9pbnQgbnIsIHVfY2hhciAqbWFwKQoreworCWlmIChuciA8PSBNSVNETl9NQVhfQ0hBTk5FTCkKKwkJcmV0dXJuIG1hcFtuciA+PiAzXSAmICgxIDw8IChuciAmIDcpKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldF9jaGFubmVsbWFwKHVfaW50IG5yLCB1X2NoYXIgKm1hcCkKK3sKKwltYXBbbnIgPj4gM10gfD0gKDEgPDwgKG5yICYgNykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2NsZWFyX2NoYW5uZWxtYXAodV9pbnQgbnIsIHVfY2hhciAqbWFwKQoreworCW1hcFtuciA+PiAzXSAmPSB+KDEgPDwgKG5yICYgNykpOworfQorCisvKiBDT05UUk9MX0NIQU5ORUwgcGFyYW1ldGVycyAqLworI2RlZmluZSBNSVNETl9DVFJMX0dFVE9QCQkweDAwMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9MT09QCQkJMHgwMDAxCisjZGVmaW5lIE1JU0ROX0NUUkxfQ09OTkVDVAkJMHgwMDAyCisjZGVmaW5lIE1JU0ROX0NUUkxfRElTQ09OTkVDVAkJMHgwMDA0CisjZGVmaW5lIE1JU0ROX0NUUkxfUENNQ09OTkVDVAkJMHgwMDEwCisjZGVmaW5lIE1JU0ROX0NUUkxfUENNRElTQ09OTkVDVAkweDAwMjAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9TRVRQRUVSCQkweDAwNDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9VTlNFVFBFRVIJCTB4MDA4MAorI2RlZmluZSBNSVNETl9DVFJMX1JYX09GRgkJMHgwMTAwCisjZGVmaW5lIE1JU0ROX0NUUkxfRklMTF9FTVBUWQkJMHgwMjAwCisjZGVmaW5lIE1JU0ROX0NUUkxfR0VUUEVFUgkJMHgwNDAwCisjZGVmaW5lIE1JU0ROX0NUUkxfSFdfRkVBVFVSRVNfT1AJMHgyMDAwCisjZGVmaW5lIE1JU0ROX0NUUkxfSFdfRkVBVFVSRVMJCTB4MjAwMQorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19PUAkJMHg0MDAwCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX1BDTV9DT05OCQkweDQwMDEKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfUENNX0RJU0MJCTB4NDAwMgorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19DT05GX0pPSU4JMHg0MDAzCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX0NPTkZfU1BMSVQJMHg0MDA0CisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX1JFQ0VJVkVfT0ZGCTB4NDAwNQorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19SRUNFSVZFX09OCTB4NDAwNgorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19FQ0hPQ0FOX09OIAkweDQwMDcKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfRUNIT0NBTl9PRkYgCTB4NDAwOAorCisKKy8qIHNvY2tldCBvcHRpb25zICovCisjZGVmaW5lIE1JU0ROX1RJTUVfU1RBTVAJCTB4MDAwMQorCitzdHJ1Y3QgbUlTRE5fY3RybF9yZXEgeworCWludAkJb3A7CisJaW50CQljaGFubmVsOworCWludAkJcDE7CisJaW50CQlwMjsKK307CisKKy8qIG11eGVyIG9wdGlvbnMgKi8KKyNkZWZpbmUgTUlTRE5fT1BUX0FMTAkJMQorI2RlZmluZSBNSVNETl9PUFRfVEVJTUdSCTIKKworI2VuZGlmIC8qIG1JU0ROSUZfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI2MmRlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNCBAQAorbm9pbnN0X0hFQURFUlMgPSBhYmlzX25tLmggYWJpc19yc2wuaCBkYi5oIGdzbV8wNF8wOC5oIGdzbV9kYXRhLmggXAorCQkgZ3NtX3N1YnNjcmliZXIuaCBnc21fMDRfMTEuaCBkZWJ1Zy5oIHNpZ25hbC5oIFwKKwkJIG1pc2RuLmggY2hhbl9hbGxvYy5oIHRlbG5ldF9pbnRlcmZhY2UuaCBwYWdpbmcuaCBcCisJCSBzdWJjaGFuX2RlbXV4LmggdHJhdV9mcmFtZS5oIGUxX2lucHV0LmggdHJhdV9tdXguaCBcCisJCSBpcGFjY2Vzcy5oIHJzMjMyLmggb3BlbmJzY2RlZmluZXMuaCBydHBfcHJveHkuaCBcCisJCSBic2NfcmxsLmggbW5jYy5oIHRyYW5zYWN0aW9uLmggdXNzZC5oIGdzbV8wNF84MC5oIFwKKwkJIHNpbGVudF9jYWxsLmggbWdjcC5oIG1lYXNfcmVwLmggcmVzdF9vY3RldHMuaCBcCisJCSBzeXN0ZW1faW5mb3JtYXRpb24uaCBoYW5kb3Zlci5oIG1nY3BfaW50ZXJuYWwuaCBcCisJCSB2dHkuaCBcCisJCWNyYzI0LmggZ3Byc19ic3NncC5oIGdwcnNfbGxjLmggZ3Byc19ucy5oIFwKKwkJZ2JfcHJveHkuaCBncHJzX3Nnc24uaCBnc21fMDRfMDhfZ3Bycy5oIHNnc24uaAorCitvcGVuYnNjX0hFQURFUlMgPSBnc21fMDRfMDguaCBtZWFzX3JlcC5oIGJzY19hcGkuaAorb3BlbmJzY2RpciA9ICQoaW5jbHVkZWRpcikvb3BlbmJzYwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMGU0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX25tLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qIEdTTSBOZXR3b3JrIE1hbmFnZW1lbnQgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMTIuMjEgdmVyc2lvbiA4LjAuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA2MjMgVjguMC4wICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9OTV9ICisjZGVmaW5lIF9OTV9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMTJfMjEuaD4KKworc3RydWN0IGNlbGxfZ2xvYmFsX2lkIHsKKwl1X2ludDE2X3QgbWNjOworCXVfaW50MTZfdCBtbmM7CisJdV9pbnQxNl90IGxhYzsKKwl1X2ludDE2X3QgY2k7Cit9OworCisvKiBUaGUgQkNDSCBpbmZvIGZyb20gYW4gaXAuYWNjZXNzIHRlc3QsIGluIGhvc3QgYnl0ZSBvcmRlcgorICogYW5kIGFscmVhZHkgcGFyc2VkLi4uICovCitzdHJ1Y3QgaXBhY19iY2NoX2luZm8geworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwl1X2ludDE2X3QgaW5mb190eXBlOworCXVfaW50OF90IGZyZXFfcXVhbDsKKwl1X2ludDE2X3QgYXJmY247CisJdV9pbnQ4X3QgcnhfbGV2OworCXVfaW50OF90IHJ4X3F1YWw7CisJaW50MTZfdCBmcmVxX2VycjsKKwl1X2ludDE2X3QgZnJhbWVfb2Zmc2V0OworCXVfaW50MzJfdCBmcmFtZV9ucl9vZmZzZXQ7CisJdV9pbnQ4X3QgYnNpYzsKKwlzdHJ1Y3QgY2VsbF9nbG9iYWxfaWQgY2dpOworCXVfaW50OF90IGJhX2xpc3Rfc2kyWzE2XTsKKwl1X2ludDhfdCBiYV9saXN0X3NpMmJpc1sxNl07CisJdV9pbnQ4X3QgYmFfbGlzdF9zaTJ0ZXJbMTZdOworCXVfaW50OF90IGNhX2xpc3Rfc2kxWzE2XTsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZjsKKworLyogUFVCTElDICovCisKK3N0cnVjdCBtc2diOworCitzdHJ1Y3QgYWJpc19ubV9jZmcgeworCS8qIGNhbGxiYWNrIGZvciB1bmlkaXJlY3Rpb25hbCByZXBvcnRzICovCisJaW50ICgqcmVwb3J0X2NiKShzdHJ1Y3QgbXNnYiAqLAorCQkJIHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKik7CisJLyogY2FsbGJhY2sgZm9yIHNvZnR3YXJlIGFjdGl2YXRlIHJlcXVlc3RzIGZyb20gQlRTICovCisJaW50ICgqc3dfYWN0X3JlcSkoc3RydWN0IG1zZ2IgKik7Cit9OworCitleHRlcm4gaW50IGFiaXNfbm1fcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCitpbnQgYWJpc19ubV90bHZfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKnRwLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCB1X2ludDhfdCAqYnVmLCBpbnQgbGVuKTsKK2ludCBhYmlzX25tX3J4KHN0cnVjdCBtc2diICptc2cpOworaW50IGFiaXNfbm1fb3BzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLCB1X2ludDhfdCBpMSwgdV9pbnQ4X3QgaTIpOworaW50IGFiaXNfbm1fY2hnX2FkbV9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLAorCQkJICB1X2ludDhfdCBpMSwgdV9pbnQ4X3QgaTIsIGVudW0gYWJpc19ubV9hZG1fc3RhdGUgYWRtX3N0YXRlKTsKK2ludCBhYmlzX25tX2VzdGFibGlzaF90ZWkoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgdHJ4X25yLAorCQkJICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCwKKwkJCSAgdV9pbnQ4X3QgdGVpKTsKK2ludCBhYmlzX25tX2Nvbm5fdGVycl9zaWduKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LAorCQkJICAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QpOworaW50IGFiaXNfbm1fY29ubl90ZXJyX3RyYWYoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LAorCQkJICAgdV9pbnQ4X3QgZTFfc3Vic2xvdCk7CitpbnQgYWJpc19ubV9zZXRfYnRzX2F0dHIoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9zZXRfcmFkaW9fYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsIHVfaW50OF90IGNoYW5fY29tYik7CitpbnQgYWJpc19ubV9zd19hY3RfcmVxX2FjayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkxLAorCQkJdV9pbnQ4X3QgaTIsIHVfaW50OF90IGkzLCBpbnQgbmFjaywgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRfbGVuKTsKK2ludCBhYmlzX25tX3Jhd19tc2coc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGxlbiwgdV9pbnQ4X3QgKm1zZyk7CitpbnQgYWJpc19ubV9ldmVudF9yZXBvcnRzKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBvbik7CitpbnQgYWJpc19ubV9yZXNldF9yZXNvdXJjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX3NvZnR3YXJlX2xvYWQoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHRyeF9uciwgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLAorCQkJICBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqY2JfZGF0YSk7CitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkX3N0YXR1cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICAgICAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpOworCitpbnQgYWJpc19ubV9jb25uX21kcm9wX2xpbmsoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgZTFfcG9ydDAsIHVfaW50OF90IHRzMCwKKwkJCSAgICB1X2ludDhfdCBlMV9wb3J0MSwgdV9pbnQ4X3QgdHMxKTsKKworaW50IGFiaXNfbm1fcGVyZm9ybV90ZXN0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCSB1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgdGVzdF9uciwgdV9pbnQ4X3QgYXV0b25fcmVwb3J0LAorCQkJIHVfaW50OF90ICpwaHlzX2NvbmZpZywgdV9pbnQxNl90IHBoeXNfY29uZmlnX2xlbik7CisKK2ludCBhYmlzX25tX2NoY29tYjRwY2hhbihlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKTsKKworLyogU2llbWVucyAvIEJTLTExIHNwZWNpZmljICovCitpbnQgYWJpc19ubV9iczExX3Jlc2V0X3Jlc291cmNlKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGJlZ2luKTsKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHR5cGUsCisJCQkgIHVfaW50OF90IGlkeCwgdV9pbnQ4X3QgYXR0cl9sZW4sIGNvbnN0IHVfaW50OF90ICphdHRyKTsKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCk7CitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9icG9ydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpOworaW50IGFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB0eXBlLCB1X2ludDhfdCBpZHgpOworaW50IGFiaXNfbm1fYnMxMV9kZWxldGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KTsKK2ludCBhYmlzX25tX2JzMTFfY29ubl9vbWxfdGVpKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGUxX3BvcnQsCisJCQkgIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90LCB1X2ludDhfdCB0ZWkpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfb21sX3RlaV90cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9zZXRfdHJ4X3Bvd2VyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCBsZXZlbCk7CitpbnQgYWJpc19ubV9iczExX2dldF90cnhfcG93ZXIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworaW50IGFiaXNfbm1fYnMxMV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBsZXZlbCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG9uKTsKK2ludCBhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pOworaW50IGFiaXNfbm1fYnMxMV9pbmZpZWxkX2xvZ29uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBvbik7CitpbnQgYWJpc19ubV9iczExX3NldF90cngxX3B3KHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X3BsbF9sb2NrZWQoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGxvY2tlZCk7CitpbnQgYWJpc19ubV9iczExX2dldF9wbGxfbW9kZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X3BsbChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdmFsdWUpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfY2NsayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9sb2FkX3N3bChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCSAgdV9pbnQ4X3Qgd2luX3NpemUsIGludCBmb3JjZWQsIGdzbV9jYmZuICpjYmZuKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X2V4dF90aW1lKHN0cnVjdCBnc21fYnRzICpidHMpOworaW50IGFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgYnBvcnQsIGVudW0gYWJpc19iczExX2xpbmVfY2ZnIGxpbmVfY2ZnKTsKK2ludCBhYmlzX25tX2JzMTFfYnNjX2Rpc2Nvbm5lY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHJlY29ubmVjdCk7CitpbnQgYWJpc19ubV9iczExX3Jlc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGNvbW1hbmRzICovCitpbnQgYWJpc19ubV9pcGFjY2Vzc19tc2coc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbXNnX3R5cGUsCisJCQkgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBidHNfbnIsCisJCQkgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKKwkJCSB1X2ludDhfdCAqYXR0ciwgaW50IGF0dHJfbGVuKTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLAorCQkJCWludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9pcGFjY2Vzc19yZXN0YXJ0KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCQl1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkJdV9pbnQ4X3QgKmF0dHIsIHVfaW50OF90IGF0dHJfbGVuKTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3JzbF9jb25uZWN0KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCAKKwkJCQkgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCwgdV9pbnQ4X3Qgc3RyZWFtKTsKK3ZvaWQgYWJpc19ubV9pcGFjY2Vzc19jZ2kodV9pbnQ4X3QgKmJ1Ziwgc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgaXBhY19wYXJzZV9iY2NoX2luZm8oc3RydWN0IGlwYWNfYmNjaF9pbmZvICpiaW5mLCB1X2ludDhfdCAqYnVmKTsKK2NvbnN0IGNoYXIgKmlwYWNjX3Rlc3RyZXNfbmFtZSh1X2ludDhfdCByZXMpOworCisvKiBGdW5jdGlvbnMgY2FsbGluZyBpbnRvIG90aGVyIGNvZGUgcGFydHMgKi8KK2VudW0gbm1fZXZ0IHsKKwlFVlRfU1RBVEVDSEdfT1BFUiwKKwlFVlRfU1RBVEVDSEdfQURNLAorfTsKK2ludCBubV9zdGF0ZV9ldmVudChlbnVtIG5tX2V2dCBldnQsIHVfaW50OF90IG9ial9jbGFzcywgdm9pZCAqb2JqLAorCQkgICBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpvbGRfc3RhdGUsIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5ld19zdGF0ZSwKKwkJICAgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKm9ial9pbnN0KTsKKworY29uc3QgY2hhciAqbm1fb3BzdGF0ZV9uYW1lKHVfaW50OF90IG9zKTsKK2NvbnN0IGNoYXIgKm5tX2F2YWlsX25hbWUodV9pbnQ4X3QgYXZhaWwpOworaW50IG5tX2lzX3J1bm5pbmcoc3RydWN0IGdzbV9ubV9zdGF0ZSAqcyk7CisjZW5kaWYgLyogX05NX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfcnNsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX3JzbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjc3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX3JzbC5oCkBAIC0wLDAgKzEsODggQEAKKy8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDguNTggdmVyc2lvbiA4LjYuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA1OTYgVjguNi4wICovCisKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfUlNMX0gKKyNkZWZpbmUgX1JTTF9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKworaW50IHJzbF9iY2NoX2luZm8oc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHR5cGUsCisJCSAgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworaW50IHJzbF9zYWNjaF9maWxsaW5nKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0eXBlLCAKKwkJICAgICAgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworaW50IHJzbF9jaGFuX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCBjaGFuX25yLAorCQkgICAgICB1X2ludDhfdCBhY3RfdHlwZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgKmNoYW5fbW9kZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX2lkZW50ICpjaGFuX2lkZW50LAorCQkgICAgICB1X2ludDhfdCBic19wb3dlciwgdV9pbnQ4X3QgbXNfcG93ZXIsCisJCSAgICAgIHVfaW50OF90IHRhKTsKK2ludCByc2xfY2hhbl9hY3RpdmF0ZV9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgYWN0X3R5cGUsIAorCQkJICAgIHVfaW50OF90IHRhLCB1X2ludDhfdCBob19yZWYpOworaW50IHJzbF9jaGFuX21vZGVfbW9kaWZ5X3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICp0cyk7CitpbnQgcnNsX2VuY3J5cHRpb25fY21kKHN0cnVjdCBtc2diICptc2cpOworaW50IHJzbF9wYWdpbmdfY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHBhZ2luZ19ncm91cCwgdV9pbnQ4X3QgbGVuLAorCQkgICB1X2ludDhfdCAqbXNfaWRlbnQsIHVfaW50OF90IGNoYW5fbmVlZGVkKTsKK2ludCByc2xfcGFnaW5nX2NtZF9zdWJzY3Ioc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgY2hhbl9uZWVkZWQsCisJCQkgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IHJzbF9pbW1fYXNzaWduX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBsZW4sIHVfaW50OF90ICp2YWwpOworCitpbnQgcnNsX2RhdGFfcmVxdWVzdChzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKTsKK2ludCByc2xfZXN0YWJsaXNoX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpOworaW50IHJzbF9yZWxhc2VfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCk7CisKKy8qIFNpZW1lbnMgdmVuZG9yLXNwZWNpZmljIFJTTCBleHRlbnNpb25zICovCitpbnQgcnNsX3NpZW1lbnNfbXJwY2koc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCByc2xfbXJwY2kgKm1ycGNpKTsKKworLyogaXAuYWNjZXNzIHNwZWNmaWMgUlNMIGV4dGVuc2lvbnMgKi8KK2ludCByc2xfaXBhY2NfY3JjeChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgcnNsX2lwYWNjX21kY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBpcCwKKwkJICAgdV9pbnQxNl90IHBvcnQsIHVfaW50OF90IHJ0cF9wYXlsb2FkMik7CitpbnQgcnNsX2lwYWNjX21kY3hfdG9fcnRwc29jayhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgcnNsX2lwYWNjX3BkY2hfYWN0aXZhdGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIGludCBhY3QpOworCitpbnQgYWJpc19yc2xfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCit1bnNpZ25lZCBpbnQgZ2V0X3BhZ2luZ19ncm91cCh1X2ludDY0X3QgaW1zaSwgdW5zaWduZWQgaW50IGJzX2NjX2NoYW5zLAorCQkJICAgICAgaW50IG5fcGFnX2Jsb2Nrcyk7Cit1bnNpZ25lZCBpbnQgbl9wYWdfYmxvY2tzKGludCBic19jY2NoX3NkY2NoX2NvbWIsIHVuc2lnbmVkIGludCBic19hZ19ibGtzX3Jlcyk7Cit1X2ludDY0X3Qgc3RyX3RvX2ltc2koY29uc3QgY2hhciAqaW1zaV9zdHIpOwordV9pbnQ4X3QgbGNoYW4yY2hhbl9ucihjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgcnNsX3JlbGVhc2VfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCk7CisKK2ludCByc2xfbGNoYW5fc2V0X3N0YXRlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQpOworCisvKiB0byBiZSBwcm92aWRlZCBieSBleHRlcm5hbCBjb2RlICovCitpbnQgYWJpc19yc2xfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCByc2xfZGVhY3Rfc2FjY2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCisvKiBCQ0NIIHJlbGF0ZWQgY29kZSAqLworaW50IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NfY2hhbnMoaW50IGNjY2hfY29uZik7CitpbnQgcnNsX2NjY2hfY29uZl90b19ic19jY2NoX3NkY2NoX2NvbWIoaW50IGNjY2hfY29uZik7CitpbnQgcnNsX251bWJlcl9vZl9wYWdpbmdfc3ViY2hhbm5lbHMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKK2ludCByc2xfY2hhbl9ic19wb3dlcl9jdHJsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1bnNpZ25lZCBpbnQgZnBjLCBpbnQgZGIpOworaW50IHJzbF9jaGFuX21zX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYm0pOworCisjZW5kaWYgLyogUlNMX01UX0ggKi8KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX2FwaS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTM0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ic2NfYXBpLmgKQEAgLTAsMCArMSw2IEBACisvKiBHU00gMDguMDggbGlrZSBBUEkgZm9yIE9wZW5CU0MgKi8KKworI2luY2x1ZGUgImdzbV9kYXRhLmgiCisKKworaW50IGdzbTA4MDhfc3VibWl0X2R0YXAoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2csIGludCBsaW5rX2lkKTsKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19ybGwuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19ybGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjg5OGQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX3JsbC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0JTQ19STExfSAorI2RlZmluZSBfQlNDX1JMTF9ICisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKK2VudW0gYnNjX3JsbHJfaW5kIHsKKwlCU0NfUkxMUl9JTkRfRVNUX0NPTkYsCisJQlNDX1JMTFJfSU5EX1JFTF9JTkQsCisJQlNDX1JMTFJfSU5EX0VSUl9JTkQsCisJQlNDX1JMTFJfSU5EX1RJTUVPVVQsCit9OworCitpbnQgcmxsX2VzdGFibGlzaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwKKwkJICB2b2lkICgqY2IpKHN0cnVjdCBnc21fbGNoYW4gKiwgdV9pbnQ4X3QsIHZvaWQgKiwKKwkJCSAgICAgZW51bSBic2Nfcmxscl9pbmQpLAorCQkgIHZvaWQgKmRhdGEpOwordm9pZCBybGxfaW5kaWNhdGlvbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwgdV9pbnQ4X3QgdHlwZSk7CisKKyNlbmRpZiAvKiBfQlNDX1JMTF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jaGFuX2FsbG9jLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jaGFuX2FsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmNTg1OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NoYW5fYWxsb2MuaApAQCAtMCwwICsxLDY3IEBACisvKiBNYW5hZ2VtZW50IGZ1bmN0aW9ucyB0byBhbGxvY2F0ZS9yZWxlYXNlIHN0cnVjdCBnc21fbGNoYW4gKi8KKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgX0NIQU5fQUxMT0NfSAorI2RlZmluZSBfQ0hBTl9BTExPQ19ICisKKyNpbmNsdWRlICJnc21fc3Vic2NyaWJlci5oIgorCisvKiBTcGVjaWFsIGFsbG9jYXRvciBmb3IgQzAgb2YgQlRTICovCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2MwX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJICAgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbik7CisKKy8qIFJlZ3VsYXIgcGh5c2ljYWwgY2hhbm5lbCBhbGxvY2F0b3IgKi8KK3N0cnVjdCBnc21fYnRzX3RyeF90cyAqdHNfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQllbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKTsKKworLyogUmVndWxhciBwaHlzaWNhbCBjaGFubmVsIChUUykgKi8KK3ZvaWQgdHNfZnJlZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKTsKKworLyogRmluZCBhbiBhbGxvY2F0ZWQgY2hhbm5lbCAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fZmluZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CisKKy8qIEZpbmQgYW4gYWxsb2NhdGVkIGNoYW5uZWwgZm9yIGEgc3BlY2lmaWVkIHN1YnNjcmliZXIgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCisvKiBBbGxvY2F0ZSBhIGxvZ2ljYWwgY2hhbm5lbCAoU0RDQ0gsIFRDSCwgLi4uKSAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBnc21fY2hhbl90IHR5cGUpOworCisvKiBGcmVlIGEgbG9naWNhbCBjaGFubmVsIChTRENDSCwgVENILCAuLi4pICovCit2b2lkIGxjaGFuX2ZyZWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOwordm9pZCBsY2hhbl9yZXNldChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKKy8qIENvbnNpZGVyIHJlbGVhc2luZyB0aGUgY2hhbm5lbCAqLworaW50IGxjaGFuX2F1dG9fcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKK3N0cnVjdCBsb2FkX2NvdW50ZXIgeworCXVuc2lnbmVkIGludCB0b3RhbDsKKwl1bnNpZ25lZCBpbnQgdXNlZDsKK307CisKK3N0cnVjdCBwY2hhbl9sb2FkIHsKKwlzdHJ1Y3QgbG9hZF9jb3VudGVyIHBjaGFuW0dTTV9QQ0hBTl9VTktOT1dOXTsKK307CisKK3ZvaWQgYnRzX2NoYW5fbG9hZChzdHJ1Y3QgcGNoYW5fbG9hZCAqY2wsIGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMpOwordm9pZCBuZXR3b3JrX2NoYW5fbG9hZChzdHJ1Y3QgcGNoYW5fbG9hZCAqcGwsIHN0cnVjdCBnc21fbmV0d29yayAqbmV0KTsKKworaW50IHRyeF9pc191c2FibGUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworCisjZW5kaWYgLyogX0NIQU5fQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvY3JjMjQuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NyYzI0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4ZmNiNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NyYzI0LmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9DUkMyNF9ICisjZGVmaW5lIF9DUkMyNF9ICisKKyNkZWZpbmUgSU5JVF9DUkMyNAkweGZmZmZmZgorCit1X2ludDMyX3QgY3JjMjRfY2FsYyh1X2ludDMyX3QgZmNzLCB1X2ludDhfdCAqY3AsIHVuc2lnbmVkIGludCBsZW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RiLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODJlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kYi5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIChDKSAyMDA4IGJ5IEphbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EQl9ICisjZGVmaW5lIF9EQl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKworLyogb25lIHRpbWUgaW5pdGlhbGlzYXRpb24gKi8KK2ludCBkYl9pbml0KGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGRiX3ByZXBhcmUoKTsKK2ludCBkYl9maW5pKCk7CisKKy8qIHN1YnNjcmliZXIgbWFuYWdlbWVudCAqLworc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBkYl9jcmVhdGVfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICAgIGNoYXIgKmltc2kpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBkYl9nZXRfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJIGVudW0gZ3NtX3N1YnNjcmliZXJfZmllbGQgZmllbGQsCisJCQkJCSBjb25zdCBjaGFyICpzdWJzY3IpOworaW50IGRiX3N5bmNfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIpOworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfdG1zaShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIpOworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfZXh0ZW4oc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyKTsKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX3Rva2VuKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlciwgdV9pbnQzMl90KiB0b2tlbik7CitpbnQgZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlciwgY2hhciAqaW1laSk7CitpbnQgZGJfc3luY19lcXVpcG1lbnQoc3RydWN0IGdzbV9lcXVpcG1lbnQgKmVxdWlwKTsKKworLyogYXV0aCBpbmZvICovCitpbnQgZ2V0X2F1dGhpbmZvX2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyAqYWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2ludCBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgKmF0dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgc2V0X2F1dGh0dXBsZV9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CisKKy8qIFNNUyBzdG9yZS1hbmQtZm9yd2FyZCAqLworaW50IGRiX3Ntc19zdG9yZShzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKK3N0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgbG9uZyBsb25nIG1pbl9pZCk7CitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnRfYnlfc3Vic2NyKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1bnNpZ25lZCBsb25nIGxvbmcgbWluX3N1YnNjcl9pZCk7CitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnRfZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgZGJfc21zX21hcmtfc2VudChzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKKworLyogQVBEVSBibG9iIHN0b3JhZ2UgKi8KK2ludCBkYl9hcGR1X2Jsb2Jfc3RvcmUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsIAorCQkJdV9pbnQ4X3QgYXBkdV9pZF9mbGFncywgdV9pbnQ4X3QgbGVuLAorCQkJdV9pbnQ4X3QgKmFwZHUpOworCisvKiBTdGF0aXN0aWNzIGNvdW50ZXIgc3RvcmFnZSAqLworc3RydWN0IGNvdW50ZXI7CitpbnQgZGJfc3RvcmVfY291bnRlcihzdHJ1Y3QgY291bnRlciAqY3RyKTsKK3N0cnVjdCByYXRlX2N0cl9ncm91cDsKK2ludCBkYl9zdG9yZV9yYXRlX2N0cl9ncm91cChzdHJ1Y3QgcmF0ZV9jdHJfZ3JvdXAgKmN0cmcpOworCisjZW5kaWYgLyogX0RCX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RlYnVnLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZmQwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kZWJ1Zy5oCkBAIC0wLDAgKzEsNTUgQEAKKyNpZm5kZWYgX0RFQlVHX0gKKyNkZWZpbmUgX0RFQlVHX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisKKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxvc21vY29yZS9sb2dnaW5nLmg+CisKKy8qIERlYnVnIEFyZWFzIG9mIHRoZSBjb2RlICovCitlbnVtIHsKKwlEUkxMLAorCURDQywKKwlETU0sCisJRFJSLAorCURSU0wsCisJRE5NLAorCURNTkNDLAorCURTTVMsCisJRFBBRywKKwlETUVBUywKKwlETUksCisJRE1JQiwKKwlETVVYLAorCURJTlAsCisJRFNDQ1AsCisJRE1TQywKKwlETUdDUCwKKwlESE8sCisJRERCLAorCURSRUYsCisJREdQUlMsCisJRE5TLAorCURCU1NHUCwKKwlEZWJ1Z19MYXN0RW50cnksCit9OworCisvKiBjb250ZXh0ICovCisjZGVmaW5lIEJTQ19DVFhfTENIQU4JMAorI2RlZmluZSBCU0NfQ1RYX1NVQlNDUgkxCisjZGVmaW5lIEJTQ19DVFhfQlRTCTIKKyNkZWZpbmUgQlNDX0NUWF9TQ0NQCTMKKworLyogdGFyZ2V0ICovCisKK2VudW0geworCS8vREVCVUdfRklMVEVSX0FMTCA9IDEgPDwgMCwKKwlMT0dfRklMVEVSX0lNU0kgPSAxIDw8IDEsCit9OworCit2b2lkIGxvZ19zZXRfaW1zaV9maWx0ZXIoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciAqaW1zaSk7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbG9nX2luZm8gbG9nX2luZm87CisKKyNlbmRpZiAvKiBfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZTFfaW5wdXQuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2UxX2lucHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzZDlkNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2UxX2lucHV0LmgKQEAgLTAsMCArMSwxNjggQEAKKyNpZm5kZWYgX0UxX0lOUFVUX0gKKyNkZWZpbmUgX0UxX0lOUFVUX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisKKyNkZWZpbmUgTlVNX0UxX1RTICAgMzIKKworZW51bSBlMWlucF9zaWduX3R5cGUgeworCUUxSU5QX1NJR05fTk9ORSwKKwlFMUlOUF9TSUdOX09NTCwKKwlFMUlOUF9TSUdOX1JTTCwKK307Citjb25zdCBjaGFyICplMWlucF9zaWdudHlwZV9uYW1lKGVudW0gZTFpbnBfc2lnbl90eXBlIHRwKTsKKworc3RydWN0IGUxaW5wX3RzOworCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rIHsKKwkvKiBsaXN0IG9mIHNpZ25hbGxpbmcgbGlua3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJLyogdG8gd2hpY2ggdGltZXNsb3QgZG8gd2UgYmVsb25nPyAqLworCXN0cnVjdCBlMWlucF90cyAqdHM7CisKKwllbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlOworCisJLyogdHJ4IGZvciBtc2ctPnRyeCBvZiByZWNlaXZlZCBtc2dzICovCQorCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJLyogbXNnYiBxdWV1ZSBvZiB0by1iZS10cmFuc21pdHRlZCBtc2dzICovCisJc3RydWN0IGxsaXN0X2hlYWQgdHhfbGlzdDsKKworCS8qIFNBUEkgYW5kIFRFSSBvbiB0aGUgRTEgVFMgKi8KKwl1X2ludDhfdCBzYXBpOworCXVfaW50OF90IHRlaTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVfaW50OF90IGNoYW5uZWw7CisJCX0gbWlzZG47CisJfSBkcml2ZXI7Cit9OworCitlbnVtIGUxaW5wX3RzX3R5cGUgeworCUUxSU5QX1RTX1RZUEVfTk9ORSwKKwlFMUlOUF9UU19UWVBFX1NJR04sCisJRTFJTlBfVFNfVFlQRV9UUkFVLAorfTsKK2NvbnN0IGNoYXIgKmUxaW5wX3RzdHlwZV9uYW1lKGVudW0gZTFpbnBfdHNfdHlwZSB0cCk7CisKKy8qIEEgdGltZXNsb3QgaW4gdGhlIEUxIGludGVyZmFjZSAqLworc3RydWN0IGUxaW5wX3RzIHsKKwllbnVtIGUxaW5wX3RzX3R5cGUgdHlwZTsKKwlpbnQgbnVtOworCisJLyogdG8gd2hpY2ggbGluZSBkbyB3ZSBiZWxvbmcgPyAqLworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogbGlzdCBvZiBhbGwgc2lnbmFsbGluZyBsaW5rcyBvbiB0aGlzIFRTICovCisJCQlzdHJ1Y3QgbGxpc3RfaGVhZCBzaWduX2xpbmtzOworCQkJLyogdGltZXIgd2hlbiB0byBkZXF1ZXVlIG5leHQgZnJhbWUgKi8KKwkJCXN0cnVjdCB0aW1lcl9saXN0IHR4X3RpbWVyOworCQl9IHNpZ247CisJCXN0cnVjdCB7CisJCQkvKiBzdWJjaGFubmVsIGRlbXV4ZXIgZm9yIGZyYW1lcyBmcm9tIEUxICovCisJCQlzdHJ1Y3Qgc3ViY2hfZGVtdXggZGVtdXg7CisJCQkvKiBzdWJjaGFubmVsIG11eGVyIGZvciBmcmFtZXMgdG8gRTEgKi8KKwkJCXN0cnVjdCBzdWJjaF9tdXggbXV4OworCQl9IHRyYXU7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKiBtSVNETiBkcml2ZXIgaGFzIG9uZSBmZCBmb3IgZWFjaCB0cyAqLworCQkJc3RydWN0IGJzY19mZCBmZDsKKwkJfSBtaXNkbjsKKwkJc3RydWN0IHsKKwkJCS8qIGlwLmFjY2VzcyBkcml2ZXIgaGFzIG9uZSBmZCBmb3IgZWFjaCB0cyAqLworCQkJc3RydWN0IGJzY19mZCBmZDsKKwkJfSBpcGFjY2VzczsKKworCX0gZHJpdmVyOworfTsKKworc3RydWN0IGUxaW5wX2RyaXZlciB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKndhbnRfd3JpdGUpKHN0cnVjdCBlMWlucF90cyAqdHMpOworfTsJCisKK3N0cnVjdCBlMWlucF9saW5lIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGludCBudW07CisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qIGFycmF5IG9mIHRpbWVzdGxvdHMgKi8KKwlzdHJ1Y3QgZTFpbnBfdHMgdHNbTlVNX0UxX1RTXTsKKworCXN0cnVjdCBlMWlucF9kcml2ZXIgKmRyaXZlcjsKKwl2b2lkICpkcml2ZXJfZGF0YTsKK307CisKKy8qIHJlZ2lzdGVyIGEgZHJpdmVyIHdpdGggdGhlIEUxIGNvcmUgKi8KK2ludCBlMWlucF9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGUxaW5wX2RyaXZlciAqZHJ2KTsKKworLyogcmVnaXN0ZXIgYSBsaW5lIHdpdGggdGhlIEUxIGNvcmUgKi8KK2ludCBlMWlucF9saW5lX3JlZ2lzdGVyKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKTsKKworLyogZW5zdXJlIGEgY2VydGFpbiBsaW5lIGV4aXN0cywgcmV0dXJuIHBvaW50ZXIgdG8gaXQgKi8KK3N0cnVjdCBlMWlucF9saW5lICplMWlucF9saW5lX2dldF9jcmVhdGUodV9pbnQ4X3QgZTFfbnIpOworCisvKiBmaW5kIGEgc2lnbl9saW5rIGZvciBnaXZlbiBURUkgYW5kIFNBUEkgaW4gYSBUUyAqLworc3RydWN0IGUxaW5wX3NpZ25fbGluayAqCitlMWlucF9sb29rdXBfc2lnbl9saW5rKHN0cnVjdCBlMWlucF90cyAqdHMsIHVfaW50OF90IHRlaSwKKwkJCXVfaW50OF90IHNhcGkpOworCisvKiBjcmVhdGUgYSBuZXcgc2lnbmFsbGluZyBsaW5rIGluIGEgRTEgdGltZXNsb3QgKi8KK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgKgorZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBlbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlLAorCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHRlaSwKKwkJCXVfaW50OF90IHNhcGkpOworCisvKiBjb25maWd1cmUgYW5kIGluaXRpYWxpemUgb25lIGUxaW5wX3RzICovCitpbnQgZTFpbnBfdHNfY29uZmlnKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBlMWlucF9saW5lICpsaW5lLAorCQkgICAgZW51bSBlMWlucF90c190eXBlIHR5cGUpOworCisvKiBDYWxsIGZyb20gdGhlIFN0YWNrOiBjb25maWd1cmF0aW9uIG9mIHRoaXMgVFMgaGFzIGNoYW5nZWQgKi8KK2ludCBlMWlucF91cGRhdGVfdHMoc3RydWN0IGUxaW5wX3RzICp0cyk7CisKKy8qIFJlY2VpdmUgYSBwYWNrZXQgZnJvbSB0aGUgRTEgZHJpdmVyICovCitpbnQgZTFpbnBfcnhfdHMoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IG1zZ2IgKm1zZywKKwkJdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKTsKKworLyogY2FsbGVkIGJ5IGRyaXZlciBpZiBpdCB3YW50cyB0byB0cmFuc21pdCBvbiBhIGdpdmVuIFRTICovCitzdHJ1Y3QgbXNnYiAqZTFpbnBfdHhfdHMoc3RydWN0IGUxaW5wX3RzICplMWlfdHMsCisJCQkgc3RydWN0IGUxaW5wX3NpZ25fbGluayAqKnNpZ25fbGluayk7CisKKy8qIGNhbGxlZCBieSBkcml2ZXIgaW4gY2FzZSBzb21lIGtpbmQgb2YgbGluayBzdGF0ZSBldmVudCAqLworaW50IGUxaW5wX2V2ZW50KHN0cnVjdCBlMWlucF90cyAqdHMsIGludCBldnQsIHVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIFdyaXRlIExBUEQgZnJhbWVzIHRvIHRoZSBmZC4gKi8KK3ZvaWQgZTFfc2V0X3BjYXBfZmQoaW50IGZkKTsKKworLyogY2FsbGVkIGJ5IFRSQVUgbXV4ZXIgdG8gb2J0YWluIHRoZSBkZXN0aW5hdGlvbiBtdXggZW50aXR5ICovCitzdHJ1Y3Qgc3ViY2hfbXV4ICplMWlucF9nZXRfbXV4KHVfaW50OF90IGUxX25yLCB1X2ludDhfdCB0c19ucik7CisKK3ZvaWQgZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3koc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluayk7CitpbnQgZTFpbnBfbGluZV91cGRhdGUoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpOworCisvKiBlMV9jb25maWcuYyAqLworaW50IGUxX3JlY29uZmlnX3RzKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpOworaW50IGUxX3JlY29uZmlnX3RyeChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCk7CitpbnQgZTFfcmVjb25maWdfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpOworCitpbnQgaWFfY29uZmlnX2Nvbm5lY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IHNvY2thZGRyX2luICpzaW4pOworaW50IGlwYWNjZXNzX3NldHVwKHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0KTsKKworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIGUxaW5wX2RyaXZlcl9saXN0OworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIGUxaW5wX2xpbmVfbGlzdDsKKworI2VuZGlmIC8qIF9FMV9JTlBVVF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nYl9wcm94eS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ2JfcHJveHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjIzNmI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ2JfcHJveHkuaApAQCAtMCwwICsxLDQyIEBACisjaWZuZGVmIF9HQl9QUk9YWV9ICisjZGVmaW5lIF9HQl9QUk9YWV9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisKK3N0cnVjdCBnYnByb3h5X2NvbmZpZyB7CisJLyogcGFyc2VkIGZyb20gY29uZmlnIGZpbGUgKi8KKwl1X2ludDMyX3QgbnNpcF9saXN0ZW5faXA7CisJdV9pbnQxNl90IG5zaXBfbGlzdGVuX3BvcnQ7CisKKwl1X2ludDMyX3QgbnNpcF9zZ3NuX2lwOworCXVfaW50MTZfdCBuc2lwX3Nnc25fcG9ydDsKKworCXVfaW50MTZfdCBuc2lwX3Nnc25fbnNlaTsKKwl1X2ludDE2X3QgbnNpcF9zZ3NuX25zdmNpOworCisJLyogbWlzYyAqLworCXN0cnVjdCBncHJzX25zX2luc3QgKm5zaTsKK307CisKK2V4dGVybiBzdHJ1Y3QgZ2Jwcm94eV9jb25maWcgZ2JjZmc7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IHNob3dfZ2Jwcm94eV9jbWQ7CisKKy8qIGdiX3Byb3h5X3Z0eSAuYyAqLworCitpbnQgZ2Jwcm94eV92dHlfaW5pdCh2b2lkKTsKK2ludCBnYnByb3h5X3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICpjb25maWdfZmlsZSwgc3RydWN0IGdicHJveHlfY29uZmlnICpjZmcpOworCisKKy8qIGdiX3Byb3h5LmMgKi8KKworLyogTWFpbiBpbnB1dCBmdW5jdGlvbiBmb3IgR2IgcHJveHkgKi8KK2ludCBnYnByb3hfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQxNl90IG5zX2J2Y2kpOworCitpbnQgZ2Jwcm94X3NpZ25hbCh1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkgIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpOworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX2Jzc2dwLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX2Jzc2dwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjY2IxMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfYnNzZ3AuaApAQCAtMCwwICsxLDE2MyBAQAorI2lmbmRlZiBfR1BSU19CU1NHUF9ICisjZGVmaW5lIF9HUFJTX0JTU0dQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBTZWN0aW9uIDExLjMuMjYgLyBUYWJsZSAxMS4yNyAqLworZW51bSBic3NncF9wZHVfdHlwZSB7CisJLyogUERVcyBiZXR3ZWVuIFJMIGFuZCBCU1NHUCBTQVBzICovCisJQlNTR1BfUERVVF9ETF9VTklUREFUQQkJPSAweDAwLAorCUJTU0dQX1BEVVRfVUxfVU5JVERBVEEJCT0gMHgwMSwKKwlCU1NHUF9QRFVUX1JBX0NBUEFCSUxJVFkJPSAweDAyLAorCUJTU0dQX1BEVVRfUFRNX1VOSVREQVRBCQk9IDB4MDMsCisJLyogUERVcyBiZXR3ZWVuIEdNTSBTQVBzICovCisJQlNTR1BfUERVVF9QQUdJTkdfUFMJCT0gMHgwNiwKKwlCU1NHUF9QRFVUX1BBR0lOR19DUwkJPSAweDA3LAorCUJTU0dQX1BEVVRfUkFfQ0FQQV9VRFBBVEUJPSAweDA4LAorCUJTU0dQX1BEVVRfUkFfQ0FQQV9VUERBVEVfQUNLCT0gMHgwOSwKKwlCU1NHUF9QRFVUX1JBRElPX1NUQVRVUwkJPSAweDBhLAorCUJTU0dQX1BEVVRfU1VTUEVORAkJPSAweDBiLAorCUJTU0dQX1BEVVRfU1VTUEVORF9BQ0sJCT0gMHgwYywKKwlCU1NHUF9QRFVUX1NVU1BFTkRfTkFDSwkJPSAweDBkLAorCUJTU0dQX1BEVVRfUkVTVU1FCQk9IDB4MGUsCisJQlNTR1BfUERVVF9SRVNVTUVfQUNLCQk9IDB4MGYsCisJQlNTR1BfUERVVF9SRVNVTUVfTkFDSwkJPSAweDEwLAorCS8qIFBEdXMgYmV0d2VlbiBOTSBTQVBzICovCisJQlNTR1BfUERVVF9CVkNfQkxPQ0sJCT0gMHgyMCwKKwlCU1NHUF9QRFVUX0JWQ19CTE9DS19BQ0sJPSAweDIxLAorCUJTU0dQX1BEVVRfQlZDX1JFU0VUCQk9IDB4MjIsCisJQlNTR1BfUERVVF9CVkNfUkVTRVRfQUNLCT0gMHgyMywKKwlCU1NHUF9QRFVUX0JWQ19VTkJMT0NLCQk9IDB4MjQsCisJQlNTR1BfUERVVF9CVkNfVU5CTE9DS19BQ0sJPSAweDI1LAorCUJTU0dQX1BEVVRfRkxPV19DT05UUk9MX0JWQwk9IDB4MjYsCisJQlNTR1BfUERVVF9GTE9XX0NPTlRST0xfQlZDX0FDSwk9IDB4MjcsCisJQlNTR1BfUERVVF9GTE9XX0NPTlRST0xfTVMJPSAweDI4LAorCUJTU0dQX1BEVVRfRkxPV19DT05UUk9MX01TX0FDSwk9IDB4MjksCisJQlNTR1BfUERVVF9GTFVTSF9MTAkJPSAweDJhLAorCUJTU0dQX1BEVVRfRkxVU0hfTExfQUNLCQk9IDB4MmIsCisJQlNTR1BfUERVVF9MTENfRElTQ0FSRAkJPSAweDJjLAorCUJTU0dQX1BEVVRfU0dTTl9JTlZPS0VfVFJBQ0UJPSAweDQwLAorCUJTU0dQX1BEVVRfU1RBVFVTCQk9IDB4NDEsCisJLyogUERVcyBiZXR3ZWVuIFBGTSBTQVAncyAqLworCUJTU0dQX1BEVVRfRE9XTkxPQURfQlNTX1BGQwk9IDB4NTAsCisJQlNTR1BfUERVVF9DUkVBVEVfQlNTX1BGQwk9IDB4NTEsCisJQlNTR1BfUERVVF9DUkVBVEVfQlNTX1BGQ19BQ0sJPSAweDUyLAorCUJTU0dQX1BEVVRfQ1JFQVRFX0JTU19QRkNfTkFDSwk9IDB4NTMsCisJQlNTR1BfUERVVF9NT0RJRllfQlNTX1BGQwk9IDB4NTQsCisJQlNTR1BfUERVVF9NT0RJRllfQlNTX1BGQ19BQ0sJPSAweDU1LAorCUJTU0dQX1BEVVRfREVMRVRFX0JTU19QRkMJPSAweDU2LAorCUJTU0dQX1BEVVRfREVMRVRFX0JTU19QRkNfQUNLCT0gMHg1NywKK307CisKKy8qIFNlY3Rpb24gMTAuMi4xIGFuZCAxMC4yLjIgKi8KK3N0cnVjdCBic3NncF91ZF9oZHIgeworCXVpbnQ4X3QgcGR1X3R5cGU7CisJdWludDMyX3QgdGxsaTsKKwl1aW50OF90IHFvc19wcm9maWxlWzNdOworCXVpbnQ4X3QgZGF0YVswXTsJLyogVExWJ3MgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBic3NncF9ub3JtYWxfaGRyIHsKKwl1aW50OF90IHBkdV90eXBlOworCXVpbnQ4X3QgZGF0YVswXTsJLyogVExWJ3MgKi8KK307CisKK2VudW0gYnNzZ3BfaWVpX3R5cGUgeworCUJTU0dQX0lFX0FMSUdOTUVOVAkJPSAweDAwLAorCUJTU0dQX0lFX0JNQVhfREVGQVVMVF9NUwk9IDB4MDEsCisJQlNTR1BfSUVfQlNTX0FSRUFfSUQJCT0gMHgwMiwKKwlCU1NHUF9JRV9CVUNLRVRfTEVBS19SQVRFCT0gMHgwMywKKwlCU1NHUF9JRV9CVkNJCQkJPSAweDA0LAorCUJTU0dQX0lFX0JWQ19CVUNLRVRfU0laRQk9IDB4MDUsCisJQlNTR1BfSUVfQlZDX01FQVNVUkVNRU5UCT0gMHgwNiwKKwlCU1NHUF9JRV9DQVVTRQkJCT0gMHgwNywKKwlCU1NHUF9JRV9DRUxMX0lECQk9IDB4MDgsCisJQlNTR1BfSUVfQ0hBTl9ORUVERUQJCT0gMHgwOSwKKwlCU1NHUF9JRV9EUlhfUEFSQU1TCQk9IDB4MGEsCisJQlNTR1BfSUVfRU1MUFBfUFJJTwkJPSAweDBiLAorCUJTU0dQX0lFX0ZMVVNIX0FDVElPTgkJPSAweDBjLAorCUJTU0dQX0lFX0lNU0kJCQk9IDB4MGQsCisJQlNTR1BfSUVfTExDX1BEVQkJPSAweDBlLAorCUJTU0dQX0lFX0xMQ19GUkFNRVNfRElTQ0FSREVECT0gMHgwZiwKKwlCU1NHUF9JRV9MT0NBVElPTl9BUkVBCQk9IDB4MTAsCisJQlNTR1BfSUVfTU9CSUxFX0lECQk9IDB4MTEsCisJQlNTR1BfSUVfTVNfQlVDS0VUX1NJWkUJCT0gMHgxMiwKKwlCU1NHUF9JRV9NU19SQURJT19BQ0NFU1NfQ0FQCT0gMHgxMywKKwlCU1NHUF9JRV9PTUNfSUQJCQk9IDB4MTQsCisJQlNTR1BfSUVfUERVX0lOX0VSUk9SCQk9IDB4MTUsCisJQlNTR1BfSUVfUERVX0xJRkVUSU1FCQk9IDB4MTYsCisJQlNTR1BfSUVfUFJJT1JJVFkJCT0gMHgxNywKKwlCU1NHUF9JRV9RT1NfUFJPRklMRQkJPSAweDE4LAorCUJTU0dQX0lFX1JBRElPX0NBVVNFCQk9IDB4MTksCisJQlNTR1BfSUVfUkFfQ0FQX1VQRF9DQVVTRQk9IDB4MWEsCisJQlNTR1BfSUVfUk9VVEVJTkdfQVJFQQkJPSAweDFiLAorCUJTU0dQX0lFX1JfREVGQVVMVF9NUwkJPSAweDFjLAorCUJTU0dQX0lFX1NVU1BFTkRfUkVGX05SCQk9IDB4MWQsCisJQlNTR1BfSUVfVEFHCQkJPSAweDFlLAorCUJTU0dQX0lFX1RMTEkJCQk9IDB4MWYsCisJQlNTR1BfSUVfVE1TSQkJCT0gMHgyMCwKKwlCU1NHUF9JRV9UUkFDRV9SRUZFUkVOQwkJPSAweDIxLAorCUJTU0dQX0lFX1RSQUNFX1RZUEUJCT0gMHgyMiwKKwlCU1NHUF9JRV9UUkFOU0FDVElPTl9JRAkJPSAweDIzLAorCUJTU0dQX0lFX1RSSUdHRVJfSUQJCT0gMHgyNCwKKwlCU1NHUF9JRV9OVU1fT0NUX0FGRgkJPSAweDI1LAorCUJTU0dQX0lFX0xTQV9JRF9MSVNUCQk9IDB4MjYsCisJQlNTR1BfSUVfTFNBX0lORk9STUFUSU9OCT0gMHgyNywKKwlCU1NHUF9JRV9QQUNLRVRfRkxPV19JRAkJPSAweDI4LAorCUJTU0dQX0lFX1BBQ0tFVF9GTE9XX1RJTUVSCT0gMHgyOSwKKwlCU1NHUF9JRV9BR0dfQlNTX1FPU19QUk9GSUxFCT0gMHgzYSwKKwlCU1NHUF9JRV9GRUFUVVJFX0JJVE1BUAkJPSAweDNiLAorCUJTU0dQX0lFX0JVQ0tFVF9GVUxMX1JBVElPCT0gMHgzYywKKwlCU1NHUF9JRV9TRVJWSUNFX1VUUkFOX0NDTwk9IDB4M2QsCit9OworCisvKiBTZWN0aW9uIDExLjMuOCAvIFRhYmxlIDExLjEwOiBDYXVzZSBjb2RpbmcgKi8KK2VudW0gZ3Byc19ic3NncF9jYXVzZSB7CisJQlNTR1BfQ0FVU0VfUFJPQ19PVkVSTE9BRAk9IDB4MDAsCisJQlNTR1BfQ0FVU0VfRVFVSVBfRkFJTAkJPSAweDAxLAorCUJTU0dQX0NBVVNFX1RSQVNJVF9ORVRfRkFJTAk9IDB4MDIsCisJQlNTR1BfQ0FVU0VfQ0FQQV9HUkVBVEVSXzBLUEJTCT0gMHgwMywKKwlCU1NHUF9DQVVTRV9VTktOT1dOX01TCQk9IDB4MDQsCisJQlNTR1BfQ0FVU0VfVU5LTk9XTl9CVkNJCT0gMHgwNSwKKwlCU1NHUF9DQVVTRV9DRUxMX1RSQUZfQ09ORwk9IDB4MDYsCisJQlNTR1BfQ0FVU0VfU0dTTl9DT05HCQk9IDB4MDcsCisJQlNTR1BfQ0FVU0VfT01MX0lOVEVSVgkJPSAweDA4LAorCUJTU0dQX0NBVVNFX0JWQ0lfQkxPQ0tFRAk9IDB4MDksCisJQlNTR1BfQ0FVU0VfUEZDX0NSRUFURV9GQUlMCT0gMHgwYSwKKwlCU1NHUF9DQVVTRV9TRU1fSU5DT1JSX1BEVQk9IDB4MjAsCisJQlNTR1BfQ0FVU0VfSU5WX01BTkRfSU5GCT0gMHgyMSwKKwlCU1NHUF9DQVVTRV9NSVNTSU5HX01BTkRfSUUJPSAweDIyLAorCUJTU0dQX0NBVVNFX01JU1NJTkdfQ09ORF9JRQk9IDB4MjMsCisJQlNTR1BfQ0FVU0VfVU5FWFBfQ09ORF9JRQk9IDB4MjQsCisJQlNTR1BfQ0FVU0VfQ09ORF9JRV9FUlIJCT0gMHgyNSwKKwlCU1NHUF9DQVVTRV9QRFVfSU5DT01QX1NUQVRFCT0gMHgyNiwKKwlCU1NHUF9DQVVTRV9QUk9UT19FUlJfVU5TUEVDCT0gMHgyNywKKwlCU1NHUF9DQVVTRV9QRFVfSU5DT01QX0ZFQVQJPSAweDI4LAorfTsKKworLyogT3VyIGltcGxlbWVudGF0aW9uICovCisKKy8qIGdwcnNfYnNzZ3BfdXRpbC5jICovCitleHRlcm4gc3RydWN0IGdwcnNfbnNfaW5zdCAqYnNzZ3BfbnNpOworc3RydWN0IG1zZ2IgKmJzc2dwX21zZ2JfYWxsb2Modm9pZCk7Citjb25zdCBjaGFyICpic3NncF9jYXVzZV9zdHIoZW51bSBncHJzX2Jzc2dwX2NhdXNlIGNhdXNlKTsKKy8qIFRyYW5zbWl0IGEgc2ltcGxlIHJlc3BvbnNlIHN1Y2ggYXMgQkxPQ0svVU5CTE9DSy9SRVNFVCBBQ0svTkFDSyAqLworaW50IGJzc2dwX3R4X3NpbXBsZV9idmNpKHVpbnQ4X3QgcGR1X3R5cGUsIHVpbnQxNl90IG5zZWksCisJCQkgdWludDE2X3QgYnZjaSwgdWludDE2X3QgbnNfYnZjaSk7CisvKiBDaGFwdGVyIDEwLjQuMTQ6IFN0YXR1cyAqLworaW50IGJzc2dwX3R4X3N0YXR1cyh1aW50OF90IGNhdXNlLCB1aW50MTZfdCAqYnZjaSwgc3RydWN0IG1zZ2IgKm9yaWdfbXNnKTsKKworLyogZ3Byc19ic3NncC5jICovCisKKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKworZXh0ZXJuIGludCBncHJzX2Jzc2dwX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKK3VpbnQxNl90IGJzc2dwX3BhcnNlX2NlbGxfaWQoc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1Zik7CisKKy8qIFdyYXBwZXIgYXJvdW5kIFRMViBwYXJzZXIgdG8gcGFyc2UgQlNTR1AgSUVzICovCitzdGF0aWMgaW5saW5lIGludCBic3NncF90bHZfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKnRwLCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisJcmV0dXJuIHRsdl9wYXJzZSh0cCwgJnR2bHZfYXR0X2RlZiwgYnVmLCBsZW4sIDAsIDApOworfQorCisjZW5kaWYgLyogX0dQUlNfQlNTR1BfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19sbGMuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfbGxjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2NjgyZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfbGxjLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfR1BSU19MTENfSAorI2RlZmluZSBfR1BSU19MTENfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFNlY3Rpb24gNC43IExMQyBMYXllciBTdHJ1Y3R1cmUgKi8KK2VudW0gZ3Byc19sbGNfc2FwaSB7CisJR1BSU19TQVBJX0dNTQkJPSAxLAorCUdQUlNfU0FQSV9UT00yCQk9IDIsCisJR1BSU19TQVBJX1NORENQMwk9IDMsCisJR1BSU19TQVBJX1NORENQNQk9IDUsCisJR1BSU19TQVBJX1NNUwkJPSA3LAorCUdQUlNfU0FQSV9UT004CQk9IDgsCisJR1BSU19TQVBJX1NORENQOQk9IDksCisJR1BSU19TQVBJX1NORENQMTEJPSAxMSwKK307CisKKy8qIFNlY3Rpb24gNi40IENvbW1hbmRzIGFuZCBSZXNwb25zZXMgKi8KK2VudW0gZ3Byc19sbGNfdV9jbWQgeworCUdQUlNfTExDX1VfRE1fUkVTUAkJPSAweDAxLAorCUdQUlNfTExDX1VfRElTQ19DTUQJCT0gMHgwNCwKKwlHUFJTX0xMQ19VX1VBX1JFU1AJCT0gMHgwNiwKKwlHUFJTX0xMQ19VX1NBQk1fQ01ECQk9IDB4MDcsCisJR1BSU19MTENfVV9GUk1SX1JFU1AJCT0gMHgwOCwKKwlHUFJTX0xMQ19VX1hJRAkJCT0gMHgwYiwKKwlHUFJTX0xMQ19VX05VTExfQ01ECQk9IDB4MDAsCit9OworCitpbnQgZ3Byc19sbGNfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0dik7CitpbnQgZ3Byc19sbGNfdHhfdWkoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBzYXBpLCBpbnQgY29tbWFuZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19ucy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YjFiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ncHJzX25zLmgKQEAgLTAsMCArMSwyMTIgQEAKKyNpZm5kZWYgX0dQUlNfTlNfSAorI2RlZmluZSBfR1BSU19OU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogR1BSUyBOZXR3b3JrcyBTZXJ2aWNlIChOUykgbWVzc2FnZXMgb24gdGhlIEdiIGludGVyZmFjZQorICogM0dQUCBUUyAwOC4xNiB2ZXJzaW9uIDguMC4xIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAxIDI5OSBWOC4wLjEgKDIwMDItMDUpCisgKiAzR1BQIFRTIDQ4LjAxNiB2ZXJzaW9uIDYuNS4wIFJlbGVhc2UgNiAvIEVUU0kgVFMgMTQ4IDAxNiBWNi41LjAgKDIwMDUtMTEpICovCisKK3N0cnVjdCBncHJzX25zX2hkciB7CisJdWludDhfdCBwZHVfdHlwZTsKKwl1aW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBUUyAwOC4xNiwgU2VjdGlvbiAxMC4zLjcsIFRhYmxlIDE0ICovCitlbnVtIG5zX3BkdV90eXBlIHsKKwlOU19QRFVUX1VOSVREQVRBCT0gMHgwMCwKKwlOU19QRFVUX1JFU0VUCQk9IDB4MDIsCisJTlNfUERVVF9SRVNFVF9BQ0sJPSAweDAzLAorCU5TX1BEVVRfQkxPQ0sJCT0gMHgwNCwKKwlOU19QRFVUX0JMT0NLX0FDSwk9IDB4MDUsCisJTlNfUERVVF9VTkJMT0NLCQk9IDB4MDYsCisJTlNfUERVVF9VTkJMT0NLX0FDSwk9IDB4MDcsCisJTlNfUERVVF9TVEFUVVMJCT0gMHgwOCwKKwlOU19QRFVUX0FMSVZFCQk9IDB4MGEsCisJTlNfUERVVF9BTElWRV9BQ0sJPSAweDBiLAorCS8qIFRTIDQ4LjAxNiBTZWN0aW9uIDEwLjMuNywgVGFibGUgMTAuMy43LjEgKi8KKwlTTlNfUERVVF9BQ0sJCT0gMHgwYywKKwlTTlNfUERVVF9BREQJCT0gMHgwZCwKKwlTTlNfUERVVF9DSEFOR0VfV0VJR0hUCT0gMHgwZSwKKwlTTlNfUERVVF9DT05GSUcJCT0gMHgwZiwKKwlTTlNfUERVVF9DT05GSUdfQUNLCT0gMHgxMCwKKwlTTlNfUERVVF9ERUxFVEUJCT0gMHgxMSwKKwlTTlNfUERVVF9TSVpFCQk9IDB4MTIsCisJU05TX1BEVVRfU0laRV9BQ0sJPSAweDEzLAorfTsKKworLyogVFMgMDguMTYsIFNlY3Rpb24gMTAuMywgVGFibGUgMTIgKi8KK2VudW0gbnNfY3RybF9pZSB7CisJTlNfSUVfQ0FVU0UJCT0gMHgwMCwKKwlOU19JRV9WQ0kJCT0gMHgwMSwKKwlOU19JRV9QRFUJCT0gMHgwMiwKKwlOU19JRV9CVkNJCQk9IDB4MDMsCisJTlNfSUVfTlNFSQkJPSAweDA0LAorCS8qIFRTIDQ4LjAxNiBTZWN0aW9uIDEwLjMsIFRhYmxlIDEwLjMuMSAqLworCU5TX0lFX0lQdjRfTElTVAkJPSAweDA1LAorCU5TX0lFX0lQdjZfTElTVAkJPSAweDA2LAorCU5TX0lFX01BWF9OUl9OU1ZDCT0gMHgwNywKKwlOU19JRV9JUHY0X0VQX05SCT0gMHgwOCwKKwlOU19JRV9JUHY2X0VQX05SCT0gMHgwOSwKKwlOU19JRV9SRVNFVF9GTEFHCT0gMHgwYSwKKwlOU19JRV9JUF9BRERSCQk9IDB4MGIsCit9OworCisvKiBUUyAwOC4xNiwgU2VjdGlvbiAxMC4zLjIsIFRhYmxlIDEzICovCitlbnVtIG5zX2NhdXNlIHsKKwlOU19DQVVTRV9UUkFOU0lUX0ZBSUwJCT0gMHgwMCwKKwlOU19DQVVTRV9PTV9JTlRFUlZFTlRJT04JPSAweDAxLAorCU5TX0NBVVNFX0VRVUlQX0ZBSUwJCT0gMHgwMiwKKwlOU19DQVVTRV9OU1ZDX0JMT0NLRUQJCT0gMHgwMywKKwlOU19DQVVTRV9OU1ZDX1VOS05PV04JCT0gMHgwNCwKKwlOU19DQVVTRV9CVkNJX1VOS05PV04JCT0gMHgwNSwKKwlOU19DQVVTRV9TRU1fSU5DT1JSX1BEVQkJPSAweDA4LAorCU5TX0NBVVNFX1BEVV9JTkNPTVBfUFNUQVRFCT0gMHgwYSwKKwlOU19DQVVTRV9QUk9UT19FUlJfVU5TUEVDCT0gMHgwYiwKKwlOU19DQVVTRV9JTlZBTF9FU1NFTlRfSUUJPSAweDBjLAorCU5TX0NBVVNFX01JU1NJTkdfRVNTRU5UX0lFCT0gMHgwZCwKKwkvKiBUUyA0OC4wMTYgU2VjdGlvbiAxMC4zLjIsIFRhYmxlIDEwLjMuMi4xICovCisJTlNfQ0FVU0VfSU5WQUxfTlJfSVB2NF9FUAk9IDB4MGUsCisJTlNfQ0FVU0VfSU5WQUxfTlJfSVB2Nl9FUAk9IDB4MGYsCisJTlNfQ0FVU0VfSU5WQUxfTlJfTlNfVkMJCT0gMHgxMCwKKwlOU19DQVVTRV9JTlZBTF9XRUlHSAkJPSAweDExLAorCU5TX0NBVVNFX1VOS05fSVBfRVAJCT0gMHgxMiwKKwlOU19DQVVTRV9VTktOX0lQX0FERFIJCT0gMHgxMywKKwlOU19DQVVTRV9VTktOX0lQX1RFU1RfRkFJTEVECT0gMHgxNCwKK307CisKKy8qIE91ciBJbXBsZW1lbnRhdGlvbiAqLworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2RlZmluZSBOU19USU1FUlNfQ09VTlQgNworI2RlZmluZSBOU19USU1FUlMgIih0bnMtYmxvY2t8dG5zLWJsb2NrLXJldHJpZXN8dG5zLXJlc2V0fHRucy1yZXNldC1yZXRyaWVzfHRucy10ZXN0fHRucy1hbGl2ZXx0bnMtYWxpdmUtcmV0cmllcykiCisjZGVmaW5lIE5TX1RJTUVSU19IRUxQCVwKKwkiKHVuKWJsb2NraW5nIFRpbWVyIChUbnMtYmxvY2spIHRpbWVvdXRcbiIJCVwKKwkiKHVuKWJsb2NraW5nIFRpbWVyIChUbnMtYmxvY2spIG51bWJlciBvZiByZXRyaWVzXG4iCVwKKwkiUmVzZXQgVGltZXIgKFRucy1yZXNldCkgdGltZW91dFxuIgkJCVwKKwkiUmVzZXQgVGltZXIgKFRucy1yZXNldCkgbnVtYmVyIG9mIHJldHJpZXNcbiIJCVwKKwkiVGVzdCBUaW1lciAoVG5zLXRlc3QpIHRpbWVvdXRcbiIJCQlcCisKK2VudW0gbnNfdGltZW91dCB7CisJTlNfVE9VVF9UTlNfQkxPQ0ssCisJTlNfVE9VVF9UTlNfQkxPQ0tfUkVUUklFUywKKwlOU19UT1VUX1ROU19SRVNFVCwKKwlOU19UT1VUX1ROU19SRVNFVF9SRVRSSUVTLAorCU5TX1RPVVRfVE5TX1RFU1QsCisJTlNfVE9VVF9UTlNfQUxJVkUsCisJTlNfVE9VVF9UTlNfQUxJVkVfUkVUUklFUywKK307CisKKyNkZWZpbmUgTlNFX1NfQkxPQ0tFRAkweDAwMDEKKyNkZWZpbmUgTlNFX1NfQUxJVkUJMHgwMDAyCisKK2VudW0gZ3Byc19uc19sbCB7CisJR1BSU19OU19MTF9VRFAsCisJR1BSU19OU19MTF9FMSwKK307CisKK2VudW0gZ3Byc19uc19ldnQgeworCUdQUlNfTlNfRVZUX1VOSVRfREFUQSwKK307CisKK3N0cnVjdCBncHJzX25zdmM7Cit0eXBlZGVmIGludCBncHJzX25zX2NiX3QoZW51bSBncHJzX25zX2V2dCBldmVudCwgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywKKwkJCSBzdHJ1Y3QgbXNnYiAqbXNnLCB1aW50MTZfdCBidmNpKTsKKworLyogQW4gaW5zdGFuY2Ugb2YgdGhlIE5TIHByb3RvY29sIHN0YWNrICovCitzdHJ1Y3QgZ3Byc19uc19pbnN0IHsKKwkvKiBjYWxsYmFjayB0byB0aGUgdXNlciBmb3IgaW5jb21pbmcgVU5JVCBEQVRBIElORCAqLworCWdwcnNfbnNfY2JfdCAqY2I7CisKKwkvKiBsaW5rZWQgbGlzdHMgb2YgYWxsIE5TVkMgaW4gdGhpcyBpbnN0YW5jZSAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGdwcnNfbnN2Y3M7CisKKwl1aW50MTZfdCB0aW1lb3V0W05TX1RJTUVSU19DT1VOVF07CisKKwkvKiB3aGljaCBsaW5rLWxheWVyIGFyZSB3ZSBiYXNlZCBvbj8gKi8KKwllbnVtIGdwcnNfbnNfbGwgbGw7CisKKwl1bmlvbiB7CisJCS8qIE5TLW92ZXItSVAgc3BlY2lmaWMgYml0cyAqLworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGJzY19mZCBmZDsKKwkJfSBuc2lwOworCX07Cit9OworCitlbnVtIG5zdmNfdGltZXJfbW9kZSB7CisJLyogc3RhbmRhcmQgdGltZXJzICovCisJTlNWQ19USU1FUl9UTlNfVEVTVCwKKwlOU1ZDX1RJTUVSX1ROU19BTElWRSwKKwlOU1ZDX1RJTUVSX1ROU19SRVNFVCwKKwlfTlNWQ19USU1FUl9OUiwKK307CisKK3N0cnVjdCBncHJzX25zdmMgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpOworCisJdWludDE2X3QgbnNlaTsJCS8qIGVuZC10by1lbmQgc2lnbmlmaWNhbmNlICovCisJdWludDE2X3QgbnN2Y2k7CS8qIHVuaXF1ZWx5IGlkZW50aWZpZXMgTlMtVkMgYXQgU0dTTiAqLworCisJdWludDMyX3Qgc3RhdGU7CisJdWludDMyX3QgcmVtb3RlX3N0YXRlOworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJZW51bSBuc3ZjX3RpbWVyX21vZGUgdGltZXJfbW9kZTsKKwlpbnQgYWxpdmVfcmV0cmllczsKKworCXVuc2lnbmVkIGludCByZW1vdGVfZW5kX2lzX3Nnc246MTsKKwl1bnNpZ25lZCBpbnQgcGVyc2lzdGVudDoxOworCisJc3RydWN0IHJhdGVfY3RyX2dyb3VwICpjdHJnOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHNvY2thZGRyX2luIGJ0c19hZGRyOworCQl9IGlwOworCX07Cit9OworCisvKiBDcmVhdGUgYSBuZXcgTlMgcHJvdG9jb2wgaW5zdGFuY2UgKi8KK3N0cnVjdCBncHJzX25zX2luc3QgKmdwcnNfbnNfaW5zdGFudGlhdGUoZ3Byc19uc19jYl90ICpjYik7CisKKy8qIERlc3Ryb3kgYSBOUyBwcm90b2NvbCBpbnN0YW5jZSAqLwordm9pZCBncHJzX25zX2Rlc3Ryb3koc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpKTsKKworLyogTGlzdGVuIGZvciBpbmNvbWluZyBHUFJTIHBhY2tldHMgKi8KK2ludCBuc2lwX2xpc3RlbihzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksIHVpbnQxNl90IHVkcF9wb3J0KTsKKworc3RydWN0IHNvY2thZGRyX2luOworCisvKiBtYWluIGVudHJ5IHBvaW50LCBoZXJlIGluY29taW5nIE5TIGZyYW1lcyBlbnRlciAqLworaW50IGdwcnNfbnNfcmN2bXNnKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgc3RydWN0IG1zZ2IgKm1zZywKKwkJICAgc3RydWN0IHNvY2thZGRyX2luICpzYWRkcik7CisKKy8qIG1haW4gZnVuY3Rpb24gZm9yIGhpZ2hlciBsYXllcnMgKEJTU0dQKSB0byBzZW5kIE5TIG1lc3NhZ2VzICovCitpbnQgZ3Byc19uc19zZW5kbXNnKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgc3RydWN0IG1zZ2IgKm1zZyk7CisKK2ludCBncHJzX25zX3R4X3Jlc2V0KHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgY2F1c2UpOworaW50IGdwcnNfbnNfdHhfYmxvY2soc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdWludDhfdCBjYXVzZSk7CitpbnQgZ3Byc19uc190eF91bmJsb2NrKHN0cnVjdCBncHJzX25zdmMgKm5zdmMpOworCisvKiBMaXN0ZW4gZm9yIGluY29taW5nIEdQUlMgcGFja2V0cyAqLworaW50IG5zaXBfbGlzdGVuKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgdWludDE2X3QgdWRwX3BvcnQpOworCisvKiBFc3RhYmxpc2ggYSBjb25uZWN0aW9uIChmcm9tIHRoZSBCU1MpIHRvIHRoZSBTR1NOICovCitzdHJ1Y3QgZ3Byc19uc3ZjICpuc2lwX2Nvbm5lY3Qoc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLAorCQkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqZGVzdCwgdWludDE2X3QgbnNlaSwKKwkJCQl1aW50MTZfdCBuc3ZjaSk7CisKK3N0cnVjdCBncHJzX25zdmMgKm5zdmNfY3JlYXRlKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgdWludDE2X3QgbnN2Y2kpOwordm9pZCBuc3ZjX2RlbGV0ZShzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjKTsKK3N0cnVjdCBncHJzX25zdmMgKm5zdmNfYnlfbnNlaShzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksIHVpbnQxNl90IG5zZWkpOworCisvKiBBZGQgTlMtc3BlY2lmaWMgVlRZIHN0dWZmICovCitpbnQgZ3Byc19uc192dHlfaW5pdChzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfc2dzbi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3Byc19zZ3NuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjMGIxYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dwcnNfc2dzbi5oCkBAIC0wLDAgKzEsMTE0IEBACisjaWZuZGVmIF9HUFJTX1NHU05fSAorI2RlZmluZSBfR1BSU19TR1NOX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBUUyAwNC4wOCA0LjEuMy4zIEdNTSBtb2JpbGl0eSBtYW5hZ2VtZW50IHN0YXRlcyBvbiB0aGUgbmV0d29yayBzaWRlICovCitlbnVtIGdwcnNfbW1fc3RhdGUgeworCUdNTV9ERVJFR0lTVEVSRUQsCQkvKiA0LjEuMy4zLjEuMSAqLworCUdNTV9DT01NT05fUFJPQ19JTklULAkJLyogNC4xLjMuMy4xLjIgKi8KKwlHTU1fUkVHSVNURVJFRF9OT1JNQUwsCQkvKiA0LjEuMy4zLjIuMSAqLworCUdNTV9SRUdJU1RFUkVEX1NVU1BFTkRFRCwJLyogNC4xLjMuMy4yLjIgKi8KKwlHTU1fREVSRUdJU1RFUkVEX0lOSVQsCQkvKiA0LjEuMy4zLjEuNCAqLworfTsKKworZW51bSBncHJzX2NpcGhfYWxnbyB7CisJR1BSU19BTEdPX0dFQTAsCisJR1BSU19BTEdPX0dFQTEsCisJR1BSU19BTEdPX0dFQTIsCit9OworCisjZGVmaW5lIE1TX1JBRElPX0FDQ0VTU19DQVBBCisKKy8qIEFjY29yZGluZyB0byBUUyAwMy42MCwgVGFibGUgNTogU0dTTiBNTSBhbmQgUERQIENvbnRleHRzICovCisvKiBFeHRlbmRlZCBieSAzR1BQIFRTIDIzLjA2MCwgVGFibGUgNjogU0dTTiBNTSBhbmQgUERQIENvbnRleHRzICovCitzdHJ1Y3Qgc2dzbl9tbV9jdHggeworCXN0cnVjdCBsbGlzdF9oZWFkCWxpc3Q7CisKKwljaGFyIAkJCWltc2lbR1NNX0lNU0lfTEVOR1RIXTsKKwllbnVtIGdwcnNfbW1fc3RhdGUJbW1fc3RhdGU7CisJdWludDMyX3QgCQlwX3Rtc2k7CisJdWludDMyX3QgCQlwX3Rtc2lfc2lnOworCWNoYXIgCQkJaW1laVtHU01fSU1FSV9MRU5HVEhdOworCS8qIE9wdDogU29mdHdhcmUgVmVyc2lvbiBOdW1iYmVyIC8gVFMgMjMuMTk1ICovCisJY2hhciAJCQltc2lzZG5bR1NNX0VYVEVOU0lPTl9MRU5HVEhdOworCXN0cnVjdCBncHJzX3JhX2lkCXJhOworCXVpbnQxNl90CQljZWxsX2lkOworCXVpbnQzMl90CQljZWxsX2lkX2FnZTsKKwl1aW50MTZfdAkJc2FjOwkvKiBJdTogU2VydmljZSBBcmVhIENvZGUgKi8KKwl1aW50MzJfdAkJc2FjX2FnZTsvKiBJdTogU2VydmljZSBBcmVhIENvZGUgYWdlICovCisJLyogVkxSIG51bWJlciAqLworCXVpbnQzMl90CQluZXdfc2dzbl9hZGRyOworCS8qIEF1dGhlbnRpY2F0aW9uIFRyaXBsZXRzICovCisJLyogS2MgKi8KKwkvKiBJdTogQ0ssIElLLCBLU0kgKi8KKwkvKiBDS1NOICovCisJZW51bSBncHJzX2NpcGhfYWxnbwljaXBoX2FsZ287CisJc3RydWN0IHsKKwkJdWludDhfdAlidWZbMTRdOwkvKiAxMC41LjUuMTJhICovCisJCXVpbnQ4X3QJbGVuOworCX0gbXNfcmFkaW9fYWNjZXNzX2NhcGE7CisJc3RydWN0IHsKKwkJdWludDhfdAlidWZbNF07CQkvKiAxMC41LjUuMTIgKi8KKwkJdWludDhfdAlsZW47CisJfSBtc19uZXR3b3JrX2NhcGE7CisJdWludDE2X3QJCWRyeF9wYXJtczsKKwlpbnQJCQltbnJnOwkvKiBNUyByZXBvcnRlZCB0byBITFI/ICovCisJaW50CQkJbmdhZjsJLyogTVMgcmVwb3J0ZWQgdG8gTVNDL1ZMUj8gKi8KKwlpbnQJCQlwcGY7CS8qIHBhZ2luZyBmb3IgR1BSUyArIG5vbi1HUFJTPyAqLworCS8qIFNNUyBQYXJhbWV0ZXJzICovCisJaW50CQkJcmVjb3Zlcnk7CisJdWludDhfdAkJCXJhZGlvX3ByaW9fc21zOworCisJc3RydWN0IGxsaXN0X2hlYWQJcGRwX2xpc3Q7CisKKwkvKiBBZGRpdGlvbmFsIGJpdHMgbm90IHByZXNlbnQgaW4gdGhlIEdTTSBUUyAqLworCXVpbnQzMl90CQl0bGxpOworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworCXVuc2lnbmVkIGludAkJVDsKK307CisKK2VudW0gcGRwX2N0eF9zdGF0ZSB7CisJUERQX1NUQUVfTk9ORSwKK307CisKK2VudW0gcGRwX3R5cGUgeworCVBEUF9UWVBFX05PTkUsCit9OworCitzdHJ1Y3Qgc2dzbl9wZHBfY3R4IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZAlsaXN0OworCisJdW5zaWduZWQgaW50CQlpZDsKKwllbnVtIHBkcF9jdHhfc3RhdGUJc3RhdGU7CisJZW51bSBwZHBfdHlwZQkJdHlwZTsKKwl1aW50MzJfdAkJYWRkcmVzc3M7CisJY2hhciAJCQkqYXBuX3N1YnNjcmliZWQ7CisJY2hhciAJCQkqYXBuX3VzZWQ7CisJdWludDE2X3QJCW5zYXBpOworCXVpbnQ4X3QJCQl0aTsJLyogdHJhbnNhY3Rpb24gaWRlbnRpZmllciAqLworCXVpbnQzMl90CQlnZ3NuX2luX3VzZTsKKwlpbnQJCQl2cGxtbl9hbGxvd2VkOworCXVpbnQzMl90CQlxb3NfcHJvZmlsZV9zdWJzY3I7CisJdWludDMyX3QJCXFvc19wcm9maWxlX3JlcTsKKwl1aW50MzJfdAkJcW9zX3Byb2ZpbGVfbmVnOworCXVpbnQ4X3QJCQlyYWRpb19wcmlvOworCXVpbnQzMl90CQl0eF9ucGR1X25yOworCXVpbnQzMl90CQlyeF9ucGR1X25yOworCXVpbnQzMl90CQl0eF9ndHBfc25kOworCXVpbnQzMl90CQlyeF9ndHBfc251OworCXVpbnQzMl90CQljaGFyZ2luZ19pZDsKKwlpbnQJCQlyZW9yZGVyaW5nX3JlcWQ7Cit9OworCisvKiBsb29rLXVwIGEgU0dTTiBNTSBjb250ZXh0IGJhc2VkIG9uIFRMTEkgKyBSQUkgKi8KK3N0cnVjdCBzZ3NuX21tX2N0eCAqc2dzbl9tbV9jdHhfYnlfdGxsaSh1aW50MzJfdCB0bGxpLAorCQkJCQljb25zdCBzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCk7CitzdHJ1Y3Qgc2dzbl9tbV9jdHggKnNnc25fbW1fY3R4X2J5X3B0bXNpKHVpbnQzMl90IHRtc2kpOworc3RydWN0IHNnc25fbW1fY3R4ICpzZ3NuX21tX2N0eF9ieV9pbXNpKGNvbnN0IGNoYXIgKmltc2kpOworCisvKiBBbGxvY2F0ZSBhIG5ldyBTR1NOIE1NIGNvbnRleHQgKi8KK3N0cnVjdCBzZ3NuX21tX2N0eCAqc2dzbl9tbV9jdHhfYWxsb2ModWludDMyX3QgdGxsaSwKKwkJCQkJY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQpOworCisjZW5kaWYgLyogX0dQUlNfU0dTTl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMDguaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZGNiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMDguaApAQCAtMCwwICsxLDYzIEBACisjaWZuZGVmIF9HU01fMDRfMDhfSAorI2RlZmluZSBfR1NNXzA0XzA4X0gKKworI2luY2x1ZGUgPG9wZW5ic2MvbWVhc19yZXAuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbTQ4Lmg+CisKK3N0cnVjdCBtc2diOworc3RydWN0IGdzbV9idHM7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXI7CitzdHJ1Y3QgZ3NtX25ldHdvcms7CitzdHJ1Y3QgZ3NtX3RyYW5zOworCisjZGVmaW5lIEdTTTQ4X0FMTE9DX1NJWkUJMTAyNAorI2RlZmluZSBHU000OF9BTExPQ19IRUFEUk9PTQkxMjgKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXNnYiAqZ3NtNDhfbXNnYl9hbGxvYyh2b2lkKQoreworCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKEdTTTQ4X0FMTE9DX1NJWkUsIEdTTTQ4X0FMTE9DX0hFQURST09NLAorCQkJCSAgICJHU00gMDQuMDgiKTsKK30KKworLyogY29uZmlnIG9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGJlaGF2aW91ciBvZiB0aGUgbG93ZXIgbGV2ZXMgKi8KK3ZvaWQgZ3NtMDQwOF9hbGxvd19ldmVyeW9uZShpbnQgYWxsb3cpOworCitpbnQgZ3NtMDQwOF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCk7CitlbnVtIGdzbV9jaGFuX3QgZ2V0X2N0eXBlX2J5X2NocmVxKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHJhLCBpbnQgbmVjaSk7CitlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCBnZXRfcmVhc29uX2J5X2NocmVxKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHJhLCBpbnQgbmVjaSk7CisKK2ludCBnc200OF90eF9tbV9pbmZvKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCBnc200OF90eF9tbV9hdXRoX3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgKnJhbmQsIGludCBrZXlfc2VxKTsKK2ludCBnc200OF90eF9tbV9hdXRoX3JlaihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgZ3NtNDhfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucyk7CisKK2ludCBnc200OF9zZW5kX3JyX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IGdzbTQ4X3NlbmRfcnJfY2lwaF9tb2RlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgd2FudF9pbWVpc3YpOworaW50IGdzbTQ4X3NlbmRfcnJfYXBwX2luZm8oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFwZHVfaWQsCisJCQkgICB1X2ludDhfdCBhcGR1X2xlbiwgY29uc3QgdV9pbnQ4X3QgKmFwZHUpOworaW50IGdzbTQ4X3NlbmRfcnJfYXNzX2NtZChzdHJ1Y3QgZ3NtX2xjaGFuICpkZXN0X2xjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgcG93ZXJfY2xhc3MpOworaW50IGdzbTQ4X3NlbmRfaG9fY21kKHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbiwgc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuLAorCQkgICAgICB1X2ludDhfdCBwb3dlcl9jb21tYW5kLCB1X2ludDhfdCBob19yZWYpOworCitpbnQgYnNjX3VwcXVldWUoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitpbnQgbW5jY19zZW5kKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbXNnX3R5cGUsIHZvaWQgKmFyZyk7CisKKy8qIGNvbnZlcnQgYSBBU0NJSSBwaG9uZSBudW1iZXIgdG8gY2FsbC1jb250cm9sIEJDRCAqLworaW50IGVuY29kZV9iY2RfbnVtYmVyKHVfaW50OF90ICpiY2RfbHYsIHVfaW50OF90IG1heF9sZW4sCisJCSAgICAgIGludCBoX2xlbiwgY29uc3QgY2hhciAqaW5wdXQpOworaW50IGRlY29kZV9iY2RfbnVtYmVyKGNoYXIgKm91dHB1dCwgaW50IG91dHB1dF9sZW4sIGNvbnN0IHVfaW50OF90ICpiY2RfbHYsCisJCSAgICAgIGludCBoX2xlbik7CisKK2ludCBzZW5kX3NpZW1lbnNfbXJwY2koc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90ICpjbGFzc21hcmsyX2x2KTsKK2ludCBnc200OF9wYWdpbmdfZXh0cmFjdF9taShzdHJ1Y3QgbXNnYiAqbXNnLCBjaGFyICptaV9zdHJpbmcsIHVfaW50OF90ICptaV90eXBlKTsKK2ludCBnc200OF9oYW5kbGVfcGFnaW5nX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCitpbnQgZ3NtNDhfbGNoYW5fbW9kaWZ5KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsY2hhbl9tb2RlKTsKK2ludCBnc200OF9yeF9ycl9tb2RpZl9hY2soc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgZ3NtNDhfcGFyc2VfbWVhc19yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqcmVwLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOF9ncHJzLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMDhfZ3Bycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NGIyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMDhfZ3Bycy5oCkBAIC0wLDAgKzEsMzUwIEBACisjaWZuZGVmIF9HU000OF9HUFJTX0gKKyNkZWZpbmUgX0dTTTQ4X0dQUlNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFRhYmxlIDEwLjQgLyAxMC40YSwgR1BSUyBNb2JpbGl0eSBNYW5hZ2VtZW50IChHTU0pICovCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVFRBQ0hfUkVRCQkweDAxCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVFRBQ0hfQUNLCQkweDAyCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVFRBQ0hfQ09NUEwJMHgwMworI2RlZmluZSBHU000OF9NVF9HTU1fQVRUQUNIX1JFSgkJMHgwNAorI2RlZmluZSBHU000OF9NVF9HTU1fREVUQUNIX1JFUQkJMHgwNQorI2RlZmluZSBHU000OF9NVF9HTU1fREVUQUNIX0FDSwkJMHgwNgorCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9SQV9VUERfUkVRCQkweDA4CisjZGVmaW5lIEdTTTQ4X01UX0dNTV9SQV9VUERfQUNLCQkweDA5CisjZGVmaW5lIEdTTTQ4X01UX0dNTV9SQV9VUERfQ09NUEwJMHgwYQorI2RlZmluZSBHU000OF9NVF9HTU1fUkFfVVBEX1JFSgkJMHgwYgorCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9QVE1TSV9SRUFMTF9DTUQJMHgxMAorI2RlZmluZSBHU000OF9NVF9HTU1fUFRNU0lfUkVBTExfQ09NUEwJMHgxMQorI2RlZmluZSBHU000OF9NVF9HTU1fQVVUSF9DSVBIX1JFUQkweDEyCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVVRIX0NJUEhfUkVTUAkweDEzCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9BVVRIX0NJUEhfUkVKCTB4MTQKKyNkZWZpbmUgR1NNNDhfTVRfR01NX0lEX1JFUQkJMHgxNQorI2RlZmluZSBHU000OF9NVF9HTU1fSURfUkVTUAkJMHgxNgorI2RlZmluZSBHU000OF9NVF9HTU1fU1RBVFVTCQkweDIwCisjZGVmaW5lIEdTTTQ4X01UX0dNTV9JTkZPCQkweDIxCisKKy8qIFRhYmxlIDEwLjRhLCBHUFJTIFNlc3Npb24gTWFuYWdlbWVudCAoR1NNKSAqLworI2RlZmluZSBHU000OF9NVF9HU01fQUNUX1BEUF9SRVEJMHg0MQorI2RlZmluZSBHU000OF9NVF9HU01fQUNUX1BEUF9BQ0sJMHg0MgorI2RlZmluZSBHU000OF9NVF9HU01fQUNUX1BEUF9SRUoJMHg0MworI2RlZmluZSBHU000OF9NVF9HU01fUkVRX1BEUF9BQ1QJMHg0NAorI2RlZmluZSBHU000OF9NVF9HU01fUkVRX1BEUF9BQ1RfUkVKCTB4NDUKKyNkZWZpbmUgR1NNNDhfTVRfR1NNX0RFQUNUX1BEUF9SRVEJMHg0NgorI2RlZmluZSBHU000OF9NVF9HU01fREVBQ1RfUERQX0FDSwkweDQ3CisjZGVmaW5lIEdTTTQ4X01UX0dTTV9BQ1RfQUFfUERQX1JFUQkweDUwCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9BQ1RfQUFfUERQX0FDSwkweDUxCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9BQ1RfQUFfUERQX1JFSgkweDUyCisjZGVmaW5lIEdTTTQ4X01UX0dTTV9ERUFDVF9BQV9QRFBfUkVRCTB4NTMKKyNkZWZpbmUgR1NNNDhfTVRfR1NNX0RFQUNUX0FBX1BEUF9BQ0sJMHg1NAorI2RlZmluZSBHU000OF9NVF9HU01fU1RBVFVTCQkweDU1CisKKy8qIENoYXB0ZXIgMTAuNS41LjIgLyBUYWJsZSAxMC41LjEzNSAqLworI2RlZmluZSBHUFJTX0FUVF9UX0FUVEFDSAkJMQorI2RlZmluZSBHUFJTX0FUVF9UX0FUVF9XSElMRV9JTVNJCTIKKyNkZWZpbmUgR1BSU19BVFRfVF9DT01CSU5FRAkJMworCisvKiBDaGFwdGVyIDEwLjUuNS4xOCAvIFRhYmxlIDEwNS4xNTAgKi8KKyNkZWZpbmUgR1BSU19VUERfVF9SQQkJCTAKKyNkZWZpbmUgR1BSU19VUERfVF9SQV9MQQkJMQorI2RlZmluZSBHUFJTX1VQRF9UX1JBX0xBX0lNU0lfQVRUCTIKKyNkZWZpbmUgR1BSU19VUERfVF9QRVJJT0RJQwkJMworCitlbnVtIGdzbTQ4X2dwcnNfaWVfbW0geworCUdTTTQ4X0lFX0dNTV9USU1FUl9SRUFEWQk9IDB4MTcsIC8qIDEwLjUuNy4zICovCisJR1NNNDhfSUVfR01NX1BUTVNJX1NJRwkJPSAweDE5LAkvKiAxMC41LjUuOCAqLworCUdTTTQ4X0lFX0dNTV9BVVRIX1JBTkQJCT0gMHgyMSwgLyogMTAuNS4zLjEgKi8KKwlHU000OF9JRV9HTU1fQVVUSF9TUkVTCQk9IDB4MjIsIC8qIDEwLjUuMy4yICovCisJR1NNNDhfSUVfR01NX0lNRUlTVgkJPSAweDIzLCAvKiAxMC41LjEuNCAqLworCUdTTTQ4X0lFX0dNTV9EUlhfUEFSQU0JCT0gMHgyNywJLyogMTAuNS41LjYgKi8KKwlHU000OF9JRV9HTU1fTVNfTkVUX0NBUEEJPSAweDMxLAkvKiAxMC41LjUuMTIgKi8KK307CisKK2VudW0gZ3NtNDhfZ3Byc19pZV9zbSB7CisJR1NNNDhfSUVfR1NNX0FQTgkJPSAweDI4LAkvKiAxMC41LjYuMSAqLworCUdTTTQ4X0lFX0dTTV9QUk9UT19DT05GX09QVAk9IDB4MjcsCS8qIDEwLjUuNi4zICovCisJR1NNNDhfSUVfR1NNX1BEUF9BRERSCQk9IDB4MmIsIC8qIDEwLjUuNi40ICovCisJR1NNNDhfSUVfR1NNX0FBX1RNUgkJPSAweDI5LAkvKiAxMC41LjcuMyAqLworCUdTTTQ4X0lFX0dTTV9OQU1FX0ZVTEwJCT0gMHg0MywgLyogMTAuNS4zLjVhICovCisJR1NNNDhfSUVfR1NNX05BTUVfU0hPUlQJCT0gMHg0NSwgLyogMTAuNS4zLjVhICovCisJR1NNNDhfSUVfR1NNX1RJTUVaT05FCQk9IDB4NDYsIC8qIDEwLjUuMy44ICovCisJR1NNNDhfSUVfR1NNX1VUQ19BTkRfVFoJCT0gMHg0NywgLyogMTAuNS4zLjkgKi8KKwlHU000OF9JRV9HU01fTFNBX0lECQk9IDB4NDgsIC8qIDEwLjUuMy4xMSAqLworfTsKKworLyogQ2hhcHRlciA5LjQuMTUgLyBUYWJsZSA5LjQuMTUgKi8KK3N0cnVjdCBnc200OF9yYV91cGRfYWNrIHsKKwl1aW50OF90IGZvcmNlX3N0Ynk6NCwJLyogMTAuNS41LjcgKi8KKwkJIHVwZF9yZXN1bHQ6NDsJLyogMTAuNS41LjE3ICovCisJdWludDhfdCByYV91cGRfdGltZXI7CS8qIDEwLjUuNy4zICovCisJc3RydWN0IGdzbTQ4X3JhX2lkIHJhX2lkOyAvKiAxMC41LjUuMTUgKi8KKwl1aW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBDaGFwdGVyIDEwLjUuNy4zICovCitlbnVtIGdzbTQ4X2dwcnNfdG1yX3VuaXQgeworCUdQUlNfVE1SXzJTRUNPTkRTCT0gMCA8PCA1LAorCUdQUlNfVE1SX01JTlVURQkJPSAxIDw8IDUsCisJR1BSU19UTVJfNk1JTlVURQk9IDIgPDwgNSwKKwlHUFJTX1RNUl9ERUFDVElWQVRFRAk9IDMgPDwgNSwKK307CisKKy8qIENoYXB0ZXIgOS40LjIgLyBUYWJsZSA5LjQuMiAqLworc3RydWN0IGdzbTQ4X2F0dGFjaF9hY2sgeworCXVpbnQ4X3QgYXR0X3Jlc3VsdDo0LAkvKiAxMC41LjUuNyAqLworCQkgZm9yY2Vfc3RieTo0OwkvKiAxMC41LjUuMSAqLworCXVpbnQ4X3QgcmFfdXBkX3RpbWVyOwkvKiAxMC41LjcuMyAqLworCXVpbnQ4X3QgcmFkaW9fcHJpbzsJLyogMTAuNS43LjIgKi8KKwlzdHJ1Y3QgZ3NtNDhfcmFfaWQgcmFfaWQ7IC8qIDEwLjUuNS4xNSAqLworCXVpbnQ4X3QgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIENoYXB0ZXIgOS41LjEgLyBUYWJsZSA5LjUuMSAqLworc3RydWN0IGdzbTQ4X2FjdF9wZHBfY3R4X3JlcSB7CisJdWludDhfdCByZXFfbnNhcGk7CisJdWludDhfdCByZXFfbGxjX3NhcGk7CisJdWludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogQ2hhcHRlciAxMC41LjUuMTQgLyBUYWJsZSAxMC41LjE0NyAqLworZW51bSBnc200OF9nbW1fY2F1c2UgeworCUdNTV9DQVVTRV9JTVNJX1VOS05PV04JCT0gMHgwMiwKKwlHTU1fQ0FVU0VfSUxMRUdBTF9NUwkJPSAweDAzLAorCUdNTV9DQVVTRV9JTExFR0FMX01FCQk9IDB4MDYsCisJR01NX0NBVVNFX0dQUlNfTk9UQUxMT1dFRAk9IDB4MDcsCisJR01NX0NBVVNFX0dQUlNfT1RIRVJfTk9UQUxMT1dFRAk9IDB4MDgsCisJR01NX0NBVVNFX01TX0lEX05PVF9ERVJJVkVECT0gMHgwOSwKKwlHTU1fQ0FVU0VfSU1QTF9ERVRBQ0hFRAkJPSAweDBhLAorCUdNTV9DQVVTRV9QTE1OX05PVEFMTE9XRUQJPSAweDBiLAorCUdNTV9DQVVTRV9MQV9OT1RBTExPV0VECQk9IDB4MGMsCisJR01NX0NBVVNFX1JPQU1JTkdfTk9UQUxMT1dFRAk9IDB4MGQsCisJR01NX0NBVVNFX05PX0dQUlNfUExNTgkJPSAweDBlLAorCUdNTV9DQVVTRV9NU0NfVEVNUF9OT1RSRUFDSAk9IDB4MTAsCisJR01NX0NBVVNFX05FVF9GQUlMCQk9IDB4MTEsCisJR01NX0NBVVNFX0NPTkdFU1RJT04JCT0gMHgxNiwKKwlHTU1fQ0FVU0VfU0VNX0lOQ09SUl9NU0cJPSAweDVmLAorCUdNTV9DQVVTRV9JTlZfTUFORF9JTkZPCQk9IDB4NjAsCisJR01NX0NBVVNFX01TR1RfTk9URVhJU1RfTk9USU1QTAk9IDB4NjEsCisJR01NX0NBVVNFX01TR1RfSU5DT01QX1BfU1RBVEUJPSAweDYyLAorCUdNTV9DQVVTRV9JRV9OT1RFWElTVF9OT1RJTVBMCT0gMHg2MywKKwlHTU1fQ0FVU0VfQ09ORF9JRV9FUlIJCT0gMHg2NCwKKwlHTU1fQ0FVU0VfTVNHX0lOQ09NUF9QX1NUQVRFCT0gMHg2NSwKKwlHTU1fQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQwk9IDB4NmYsCit9OworCisvKiBDaGFwdGVyIDEwLjQuNi42IC8gVGFibGUgMTAuNS4xNTcgKi8KK2VudW0gZ3NtNDhfZ3NtX2NhdXNlIHsKKwlHU01fQ0FVU0VfSU5TVUZGX1JTUkMJCT0gMHgxYSwKKwlHU01fQ0FVU0VfTUlTU0lOR19BUE4JCT0gMHgxYiwKKwlHU01fQ0FVU0VfVU5LTk9XTl9QRFAJCT0gMHgxYywKKwlHU01fQ0FVU0VfQVVUSF9GQUlMRUQJCT0gMHgxZCwKKwlHU01fQ0FVU0VfQUNUX1JFSl9HR1NOCQk9IDB4MWUsCisJR1NNX0NBVVNFX0FDVF9SRUpfVU5TUEVDCT0gMHgxZiwKKwlHU01fQ0FVU0VfU0VSVl9PUFRfTk9UU1VQUAk9IDB4MjAsCisJR1NNX0NBVVNFX1JFUV9TRVJWX09QVF9OT1RTVUIJPSAweDIxLAorCUdTTV9DQVVTRV9TRVJWX09QVF9URU1QX09PTwk9IDB4MjIsCisJR1NNX0NBVVNFX05TQVBJX0lOX1VTRQkJPSAweDIzLAorCUdTTV9DQVVTRV9ERUFDVF9SRUdVTEFSCQk9IDB4MjQsCisJR1NNX0NBVVNFX1FPU19OT1RfQUNDRVBURUQJPSAweDI1LAorCUdTTV9DQVVTRV9ORVRfRkFJTAkJPSAweDI2LAorCUdTTV9DQVVTRV9SRUFDVF9SUUQJCT0gMHgyNywKKwlHU01fQ0FVU0VfRkVBVFVSRV9OT1RTVVBQCT0gMHgyOCwKKwlHU01fQ0FVU0VfSU5WQUxJRF9UUkFOU19JRAk9IDB4NTEsCisJR1NNX0NBVVNFX1NFTV9JTkNPUlJfTVNHCT0gMHg1ZiwKKwlHU01fQ0FVU0VfSU5WX01BTkRfSU5GTwkJPSAweDYwLAorCUdTTV9DQVVTRV9NU0dUX05PVEVYSVNUX05PVElNUEwJPSAweDYxLAorCUdTTV9DQVVTRV9NU0dUX0lOQ09NUF9QX1NUQVRFCT0gMHg2MiwKKwlHU01fQ0FVU0VfSUVfTk9URVhJU1RfTk9USU1QTAk9IDB4NjMsCisJR1NNX0NBVVNFX0NPTkRfSUVfRVJSCQk9IDB4NjQsCisJR1NNX0NBVVNFX01TR19JTkNPTVBfUF9TVEFURQk9IDB4NjUsCisJR1NNX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMJPSAweDZmLAorfTsKKworLyogU2VjdGlvbiA2LjEuMi4yOiBTZXNzaW9uIG1hbmFnZW1lbnQgc3RhdGVzIG9uIHRoZSBuZXR3b3JrIHNpZGUgKi8KK2VudW0gZ3NtNDhfcGRwX3N0YXRlIHsKKwlQRFBfU19JTkFDVElWRSwKKwlQRFBfU19BQ1RJVkVfUEVORElORywKKwlQRFBfU19BQ1RJVkUsCisJUERQX1NfSU5BQ1RJVkVfUEVORElORywKKwlQRFBfU19NT0RJRllfUEVORElORywKK307CisKKy8qIFRhYmxlIDEwLjUuMTU1LzNHUFAgVFMgMjQuMDA4ICovCitlbnVtIGdzbTQ4X3BkcF90eXBlX29yZyB7CisJUERQX1RZUEVfT1JHX0VUU0kJCT0gMHgwMCwKKwlQRFBfVFlQRV9PUkdfSUVURgkJPSAweDAxLAorfTsKK2VudW0gZ3NtNDhfcGRwX3R5cGVfbnIgeworCVBEUF9UWVBFX05fRVRTSV9SRVNFUlZFRAk9IDB4MDAsCisJUERQX1RZUEVfTl9FVFNJX1BQUAkJPSAweDAxLAorCVBEUF9UWVBFX05fSUVURl9JUHY0CQk9IDB4MjEsCisJUERQX1RZUEVfTl9JRVRGX0lQdjYJCT0gMHg1NywKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc19yZWxpYWJfY2xhc3MgeworCUdTTTQ4X1FPU19SQ19MTENfQUNLX1JMQ19BQ0tfREFUQV9QUk9UCT0gMiwKKwlHU000OF9RT1NfUkNfTExDX1VOX1JMQ19BQ0tfREFUQV9QUk9UCT0gMywKKwlHU000OF9RT1NfUkNfTExDX1VOX1JMQ19VTl9QUk9UX0RBVEEJPSA0LAorCUdTTTQ4X1FPU19SQ19MTENfVU5fUkxDX1VOX0RBVEFfVU4JPSA1LAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX3ByZWNlZF9jbGFzcyB7CisJR1NNNDhfUU9TX1BDX0hJR0gJPSAxLAorCUdTTTQ4X1FPU19QQ19OT1JNQUwJPSAyLAorCUdTTTQ4X1FPU19QQ19MT1cJPSAzLAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX3BlYWtfdHB1dCB7CisJR1NNNDhfUU9TX1BFQUtfVFBVVF8xMDAwYnBzCT0gMSwKKwlHU000OF9RT1NfUEVBS19UUFVUXzIwMDBicHMJPSAyLAorCUdTTTQ4X1FPU19QRUFLX1RQVVRfNDAwMGJwcwk9IDMsCisJR1NNNDhfUU9TX1BFQUtfVFBVVF84MDAwYnBzCT0gNCwKKwlHU000OF9RT1NfUEVBS19UUFVUXzE2MDAwYnBzCT0gNSwKKwlHU000OF9RT1NfUEVBS19UUFVUXzMyMDAwYnBzCT0gNiwKKwlHU000OF9RT1NfUEVBS19UUFVUXzY0MDAwYnBzCT0gNywKKwlHU000OF9RT1NfUEVBS19UUFVUXzEyODAwMGJwcwk9IDgsCisJR1NNNDhfUU9TX1BFQUtfVFBVVF8yNTYwMDBicHMJPSA5LAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX21lYW5fdHB1dCB7CisJR1NNNDhfUU9TX01FQU5fVFBVVF8xMDBicGgJPSAxLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMjAwYnBoCT0gMiwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzUwMGJwaAk9IDMsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8xMDAwYnBoCT0gNCwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzIwMDBicGgJPSA1LAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfNTAwMGJwaAk9IDYsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8xMDAwMGJwaAk9IDcsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8yMDAwMGJwaAk9IDgsCisJR1NNNDhfUU9TX01FQU5fVFBVVF81MDAwMGJwaAk9IDksCisJR1NNNDhfUU9TX01FQU5fVFBVVF8xMDBrYnBoCT0gMTAsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8yMDBrYnBoCT0gMTEsCisJR1NNNDhfUU9TX01FQU5fVFBVVF81MDBrYnBoCT0gMHhjLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMU1icGgJPSAweGQsCisJR1NNNDhfUU9TX01FQU5fVFBVVF8yTWJwaAk9IDB4ZSwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzVNYnBoCT0gMHhmLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfMTBNYnBoCT0gMHgxMCwKKwlHU000OF9RT1NfTUVBTl9UUFVUXzIwTWJwaAk9IDB4MTEsCisJR1NNNDhfUU9TX01FQU5fVFBVVF81ME1icGgJPSAweDEyLAorCUdTTTQ4X1FPU19NRUFOX1RQVVRfQkVTVF9FRkZPUlQJPSAweDFmLAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX2Vycl9zZHUgeworCUdTTTQ4X1FPU19FUlJTRFVfTk9ERVRFQ1QJPSAxLAorCUdTTTQ4X1FPU19FUlJTRFVfWUVTCQk9IDIsCisJR1NNNDhfUU9TX0VSUlNEVV9OTwkJPSAzLAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX2RlbGl2X29yZGVyIHsKKwlHU000OF9RT1NfRE9fT1JERVJFRAkJPSAxLAorCUdTTTQ4X1FPU19ET19VTk9SREVSRUQJCT0gMiwKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc190cmFmX2NsYXNzIHsKKwlHU000OF9RT1NfVENfQ09OVkVSU0FUSU9OQUwJPSAxLAorCUdTTTQ4X1FPU19UQ19TVFJFQU1JTkcJCT0gMiwKKwlHU000OF9RT1NfVENfSU5URVJBQ1RJVkUJPSAzLAorCUdTTTQ4X1FPU19UQ19CQUNLR1JPVU5ECQk9IDQsCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3NfbWF4X3NkdV9zaXplIHsKKwkvKiB2YWx1ZXMgYmVsb3cgaW4gMTAgb2N0ZXQgZ3JhbnVsYXJpdHkgKi8KKwlHU000OF9RT1NfTUFYU0RVXzE1MDIJCT0gMHg5NywKKwlHU000OF9RT1NfTUFYU0RVXzE1MTAJCT0gMHg5OCwKKwlHU000OF9RT1NfTUFYU0RVXzE1MjAJCT0gMHg5OSwKK307CisKKy8qIEZpZ3VyZSAxMC41LjEzOC8yNC4wMDggLyBDaGFwdGVyIDEwLjUuNi41ICovCitlbnVtIGdzbTQ4X3Fvc19tYXhfYml0cmF0ZSB7CisJR1NNNDhfUU9TX01CUkFURV8xawkJPSAweDAxLAorCUdTTTQ4X1FPU19NQlJBVEVfNjNrCQk9IDB4M2YsCisJR1NNNDhfUU9TX01CUkFURV82NGsJCT0gMHg0MCwKKwlHU000OF9RT1NfTUJSQVRFXzU2OGsJCT0gMHg3ZiwKKwlHU000OF9RT1NfTUJSQVRFXzU3NmsJCT0gMHg4MCwKKwlHU000OF9RT1NfTUJSQVRFXzg2NDBrCQk9IDB4ZmUsCisJR1NNNDhfUU9TX01CUkFURV8wawkJPSAweGZmLAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK2VudW0gZ3NtNDhfcW9zX3Jlc2lkX2JlciB7CisJR1NNNDhfUU9TX1JCRVJfNWVfMgkJPSAweDAxLAorCUdTTTQ4X1FPU19SQkVSXzFlXzIJCT0gMHgwMiwKKwlHU000OF9RT1NfUkJFUl81ZV8zCQk9IDB4MDMsCisJR1NNNDhfUU9TX1JCRVJfNGVfMwkJPSAweDA0LAorCUdTTTQ4X1FPU19SQkVSXzFlXzMJCT0gMHgwNSwKKwlHU000OF9RT1NfUkJFUl8xZV80CQk9IDB4MDYsCisJR1NNNDhfUU9TX1JCRVJfMWVfNQkJPSAweDA3LAorCUdTTTQ4X1FPU19SQkVSXzFlXzYJCT0gMHgwOCwKKwlHU000OF9RT1NfUkJFUl82ZV84CQk9IDB4MDksCit9OworCisvKiBGaWd1cmUgMTAuNS4xMzgvMjQuMDA4IC8gQ2hhcHRlciAxMC41LjYuNSAqLworZW51bSBnc200OF9xb3Nfc2R1X2VyciB7CisJR1NNNDhfUU9TX1NFUlJfMWVfMgkJPSAweDAxLAorCUdTTTQ4X1FPU19TRVJSXzdlXzIJCT0gMHgwMiwKKwlHU000OF9RT1NfU0VSUl8xZV8zCQk9IDB4MDMsCisJR1NNNDhfUU9TX1NFUlJfMWVfNAkJPSAweDA0LAorCUdTTTQ4X1FPU19TRVJSXzFlXzUJCT0gMHgwNSwKKwlHU000OF9RT1NfU0VSUl8xZV82CQk9IDB4MDYsCisJR1NNNDhfUU9TX1NFUlJfMWVfMQkJPSAweDA3LAorfTsKKworLyogRmlndXJlIDEwLjUuMTM4LzI0LjAwOCAvIENoYXB0ZXIgMTAuNS42LjUgKi8KK3N0cnVjdCBnc200OF9xb3MgeworCS8qIG9jdGV0IDMgKi8KKwl1aW50OF90IHJlbGlhYl9jbGFzczozOworCXVpbnQ4X3QgZGVsYXlfY2xhc3M6MzsKKwl1aW50OF90IHNwYXJlOjI7CisJLyogb2N0ZXQgNCAqLworCXVpbnQ4X3QgcHJlY2VkX2NsYXNzOjM7CisJdWludDhfdCBzcGFyZTI6MTsKKwl1aW50OF90IHBlYWtfdHB1dDo0OworCS8qIG9jdGV0IDUgKi8KKwl1aW50OF90IG1lYW5fdHB1dDo1OworCXVpbnQ4X3Qgc3BhcmUzOjM7CisJLyogb2N0ZXQgNiAqLworCXVpbnQ4X3QgZGVsaXZfZXJyX3NkdTozOworCXVpbnQ4X3QgZGVsaXZfb3JkZXI6MjsKKwl1aW50OF90IHRyYWZfY2xhc3M6MzsKKwkvKiBvY3RldCA3ICovCisJdWludDhfdCBtYXhfc2R1X3NpemU7CisJLyogb2N0ZXQgOCAqLworCXVpbnQ4X3QgbWF4X2JpdHJhdGVfdXA7CisJLyogb2N0ZXQgOSAqLworCXVpbnQ4X3QgbWF4X2JpdHJhdGVfZG93bjsKKwkvKiBvY3RldCAxMCAqLworCXVpbnQ4X3Qgc2R1X2Vycl9yYXRpbzo0OworCXVpbnQ4X3QgcmVzaWRfYmVyOjQ7CisJLyogb2N0ZXQgMTEgKi8KKwl1aW50OF90IGhhbmRsaW5nX3ByaW86MjsKKwl1aW50OF90IHhmZXJfZGVsYXk6NjsKKwkvKiBvY3RldCAxMiAqLworCXVpbnQ4X3QgZ3Vhcl9iaXRyYXRlX3VwOworCS8qIG9jdGV0IDEzICovCisJdWludDhfdCBndWFyX2JpdHJhdGVfZG93bjsKKwkvKiBvY3RldCAxNCAqLworCXVpbnQ4X3Qgc3JjX3N0YXRzX2Rlc2M6NDsKKwl1aW50OF90IHNpZ19pbmQ6MTsKKwl1aW50OF90IHNwYXJlNTozOworCS8qIG9jdGV0IDE1ICovCisJdWludDhfdCBtYXhfYml0cmF0ZV9kb3duX2V4dDsKKwkvKiBvY3RldCAxNiAqLworCXVpbnQ4X3QgZ3Vhcl9iaXRyYXRlX2Rvd25fZXh0OworfTsKKworCitpbnQgZ3Byc190bGxpX3R5cGUodWludDMyX3QgdGxsaSk7CisKK3N0cnVjdCBnc21fYnRzICpnc200OF9idHNfYnlfcmFfaWQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJICAgY29uc3QgdWludDhfdCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKKworI2VuZGlmIC8qIF9HU000OF9HUFJTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8xMS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyN2FmMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8xMS5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX0dTTV8wNF8xMV9ICisjZGVmaW5lIF9HU01fMDRfMTFfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzExLmg+CisKKy8qIFNNUyBkZWxpdmVyIFBEVSAqLworc3RydWN0IHNtc19kZWxpdmVyIHsKKwl1X2ludDhfdCBtdGk6MjsJCS8qIG1lc3NhZ2UgdHlwZSBpbmRpY2F0b3IgKi8KKwl1X2ludDhfdCBtbXM6MTsJCS8qIG1vcmUgbWVzc2FnZXMgdG8gc2VuZCAqLworCXVfaW50OF90IHJwOjE7CQkvKiByZXBseSBwYXRoICovCisJdV9pbnQ4X3QgdWRoaToxOwkvKiB1c2VyIGRhdGEgaGVhZGVyIGluZGljYXRvciAqLworCXVfaW50OF90IHNyaToxOwkJLyogc3RhdHVzIHJlcG9ydCBpbmRpY2F0aW9uICovCisJdV9pbnQ4X3QgKm9yaWdfYWRkcjsJLyogb3JpZ2luYXRpbmcgYWRkcmVzcyAqLworCXVfaW50OF90IHBpZDsJCS8qIHByb3RvY29sIGlkZW50aWZpZXIgKi8KKwl1X2ludDhfdCBkY3M7CQkvKiBkYXRhIGNvZGluZyBzY2hlbWUgKi8KKwkJCQkvKiBzZXJ2aWNlIGNlbnRyZSB0aW1lIHN0YW1wICovCisJdV9pbnQ4X3QgdWRfbGVuOwkvKiB1c2VyIGRhdGEgbGVuZ3RoICovCisJdV9pbnQ4X3QgKnVzZXJfZGF0YTsJLyogdXNlciBkYXRhICovCisKKwl1X2ludDhfdCBtc2dfcmVmOwkvKiBtZXNzYWdlIHJlZmVyZW5jZSAqLworCXVfaW50OF90ICpzbXNjOworfTsKKworc3RydWN0IG1zZ2I7CisKK2ludCBnc20wNDExX3Jjdl9zbXMoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCk7CisKK2ludCBnc200MTFfc2VuZF9zbXNfbGNoYW4oc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBnc21fc21zICpzbXMpOworCitzdHJ1Y3QgZ3NtX3NtcyAqc21zX2FsbG9jKHZvaWQpOwordm9pZCBzbXNfZnJlZShzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKKwordm9pZCBfZ3NtNDExX3Ntc190cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKTsKK2ludCBnc200MTFfc2VuZF9zbXNfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICAgc3RydWN0IGdzbV9zbXMgKnNtcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF84MC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhYjFjNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF84MC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX0dTTV8wNF84MF9ICisjZGVmaW5lIF9HU01fMDRfODBfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oPgorCisjZGVmaW5lIE1BWF9MRU5fVVNTRF9TVFJJTkcJMzEKKworc3RydWN0IHVzc2RfcmVxdWVzdCB7CisJCQljaGFyIHRleHRbTUFYX0xFTl9VU1NEX1NUUklORyArIDFdOworCQkJdV9pbnQ4X3QgdHJhbnNhY3Rpb25faWQ7CisJCQl1X2ludDhfdCBpbnZva2VfaWQ7Cit9OworCitpbnQgZ3NtMDQ4MF9kZWNvZGVfdXNzZF9yZXF1ZXN0KGNvbnN0IHN0cnVjdCBtc2diICptc2csIAorCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcXVlc3QpOyAKK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZXNwb25zZShjb25zdCBzdHJ1Y3QgbXNnYiAqaW5fbXNnLCBjb25zdCBjaGFyKiByZXNwb25zZV90ZXh0LCAKKwkJCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitpbnQgZ3NtMDQ4MF9zZW5kX3Vzc2RfcmVqZWN0KGNvbnN0IHN0cnVjdCBtc2diICptc2csIAorCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcXVlc3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9kYXRhLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTI3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fZGF0YS5oCkBAIC0wLDAgKzEsNzU0IEBACisjaWZuZGVmIF9HU01fREFUQV9ICisjZGVmaW5lIF9HU01fREFUQV9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyB7CisJR1NNX1BDSEFOX05PTkUsCisJR1NNX1BDSEFOX0NDQ0gsCisJR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0LAorCUdTTV9QQ0hBTl9UQ0hfRiwKKwlHU01fUENIQU5fVENIX0gsCisJR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDLAorCUdTTV9QQ0hBTl9QRENILAkJLyogR1BSUyBQRENIICovCisJR1NNX1BDSEFOX1RDSF9GX1BEQ0gsCS8qIFRDSC9GIGlmIHVzZWQsIFBEQ0ggb3RoZXJ3aXNlICovCisJR1NNX1BDSEFOX1VOS05PV04sCit9OworCitlbnVtIGdzbV9jaGFuX3QgeworCUdTTV9MQ0hBTl9OT05FLAorCUdTTV9MQ0hBTl9TRENDSCwKKwlHU01fTENIQU5fVENIX0YsCisJR1NNX0xDSEFOX1RDSF9ILAorCUdTTV9MQ0hBTl9VTktOT1dOLAorfTsKKworLyogUlJMUCBtb2RlIG9mIG9wZXJhdGlvbiAqLworZW51bSBycmxwX21vZGUgeworCVJSTFBfTU9ERV9OT05FLAorCVJSTFBfTU9ERV9NU19CQVNFRCwKKwlSUkxQX01PREVfTVNfUFJFRiwKKwlSUkxQX01PREVfQVNTX1BSRUYsCit9OworCisvKiBDaGFubmVsIFJlcXVlc3QgcmVhc29uICovCitlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCB7CisJR1NNX0NIUkVRX1JFQVNPTl9FTUVSRywKKwlHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlHU01fQ0hSRVFfUkVBU09OX0NBTEwsCisJR1NNX0NIUkVRX1JFQVNPTl9MT0NBVElPTl9VUEQsCisJR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKK307CisKKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbW5jYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2JpdHZlYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3N0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorCisjZGVmaW5lIFRSWF9OUl9UUwk4CisjZGVmaW5lIFRTX01BWF9MQ0hBTgk4CisKKyNkZWZpbmUgSEFSRENPREVEX0FSRkNOIDEyMworI2RlZmluZSBIQVJEQ09ERURfVFNDCTcKKyNkZWZpbmUgSEFSRENPREVEX0JTSUMJMHgzZgkvKiBOQ0MgPSA3IC8gQkNDID0gNyAqLworCisvKiBmb3IgbXVsdGktZHJvcCBjb25maWcgKi8KKyNkZWZpbmUgSEFSRENPREVEX0JUUzBfVFMJMQorI2RlZmluZSBIQVJEQ09ERURfQlRTMV9UUwk2CisjZGVmaW5lIEhBUkRDT0RFRF9CVFMyX1RTCTExCisKK2VudW0gZ3NtX2hvb2tzIHsKKwlHU01fSE9PS19OTV9TV0xPQUQsCisJR1NNX0hPT0tfUlJfUEFHSU5HLAorfTsKKworZW51bSBnc21fcGFnaW5nX2V2ZW50IHsKKwlHU01fUEFHSU5HX1NVQ0NFRURFRCwKKwlHU01fUEFHSU5HX0VYUElSRUQsCisJR1NNX1BBR0lOR19PT00sCit9OworCitlbnVtIGJ0c19ncHJzX21vZGUgeworCUJUU19HUFJTX05PTkUgPSAwLAorCUJUU19HUFJTX0dQUlMgPSAxLAorCUJUU19HUFJTX0VHUFJTID0gMiwKK307CisKKy8qIHRoZSBkYXRhIHN0cnVjdHVyZSBzdG9yZWQgaW4gbXNnYi0+Y2IgZm9yIG9wZW5ic2MgYXBwcyAqLworc3RydWN0IG9wZW5ic2NfbXNnYl9jYiB7CisJdW5zaWduZWQgY2hhciAqYnNzZ3BoOworCXVuc2lnbmVkIGNoYXIgKmxsY2g7CisKKwkvKiBDZWxsIElkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBjaGFyICpic3NncF9jZWxsX2lkOworCisJLyogSWRlbnRpZmllcnMgb2YgYSBCVFMsIGVxdWFsIHRvICdzdHJ1Y3QgYnNzZ3BfYnRzX2N0eCcgKi8KKwl1X2ludDE2X3QgbnNlaTsKKwl1X2ludDE2X3QgYnZjaTsKKworCS8qIElkZW50aWZpZXIgb2YgYSBNUyAoaW5zaWRlIEJUUyksIGVxdWFsIHRvICdzdHJ1Y3Qgc2dzbl9tbV9jdHgnICovCisJdV9pbnQzMl90IHRsbGk7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworI2RlZmluZSBPQlNDX01TR0JfQ0IoX19tc2diKQkoKHN0cnVjdCBvcGVuYnNjX21zZ2JfY2IgKikmKChfX21zZ2IpLT5jYlswXSkpCisjZGVmaW5lIG1zZ2JfdGxsaShfX3gpCQlPQlNDX01TR0JfQ0IoX194KS0+dGxsaQorI2RlZmluZSBtc2diX25zZWkoX194KQkJT0JTQ19NU0dCX0NCKF9feCktPm5zZWkKKyNkZWZpbmUgbXNnYl9idmNpKF9feCkJCU9CU0NfTVNHQl9DQihfX3gpLT5idmNpCisjZGVmaW5lIG1zZ2JfZ21taChfX3gpCQkoX194KS0+bDNoCisjZGVmaW5lIG1zZ2JfYnNzZ3BoKF9feCkJT0JTQ19NU0dCX0NCKF9feCktPmJzc2dwaAorI2RlZmluZSBtc2diX2Jzc2dwX2xlbihfX3gpCSgoX194KS0+dGFpbCAtICh1aW50OF90ICopbXNnYl9ic3NncGgoX194KSkKKyNkZWZpbmUgbXNnYl9iY2lkKF9feCkJCU9CU0NfTVNHQl9DQihfX3gpLT5ic3NncF9jZWxsX2lkCisjZGVmaW5lIG1zZ2JfbGxjaChfX3gpCQlPQlNDX01TR0JfQ0IoX194KS0+bGxjaAorCitzdHJ1Y3QgbXNnYjsKK3R5cGVkZWYgaW50IGdzbV9jYmZuKHVuc2lnbmVkIGludCBob29rbnVtLAorCQkgICAgIHVuc2lnbmVkIGludCBldmVudCwKKwkJICAgICBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkgICAgIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKTsKKworLyoKKyAqIFVzZSB0aGUgY2hhbm5lbC4gQXMgc2lkZSBlZmZlY3QgdGhlIGxjaGFubmVsIHJlY3ljbGUgdGltZXIKKyAqIHdpbGwgYmUgc3RhcnRlZC4KKyAqLworI2RlZmluZSBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQgMjAsIDAKKyNkZWZpbmUgdXNlX3N1YnNjcl9jb24oY29uKSBcCisJZG8gewkoY29uKS0+dXNlX2NvdW50Kys7IFwKKwkJREVCVUdQKERSRUYsICJsY2hhbiAoYnRzPSVkLHRyeD0lZCx0cz0lZCxjaD0lZCkgaW5jcmVhc2VzIHVzYWdlIHRvOiAlZFxuIiwgXAorCQkJKGNvbiktPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCAoY29uKS0+bGNoYW4tPnRzLT50cngtPm5yLCAoY29uKS0+bGNoYW4tPnRzLT5uciwgXAorCQkJKGNvbiktPmxjaGFuLT5uciwgKGNvbiktPnVzZV9jb3VudCk7IFwKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCYoY29uKS0+cmVsZWFzZV90aW1lciwgTENIQU5fUkVMRUFTRV9USU1FT1VUKTsgfSB3aGlsZSgwKTsKKworI2RlZmluZSBwdXRfc3Vic2NyX2Nvbihjb24pIFwKKwlkbyB7IChjb24pLT51c2VfY291bnQtLTsgXAorCQlERUJVR1AoRFJFRiwgImxjaGFuIChidHM9JWQsdHJ4PSVkLHRzPSVkLGNoPSVkKSBkZWNyZWFzZXMgdXNhZ2UgdG86ICVkXG4iLCBcCisJCQkoY29uKS0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIChjb24pLT5sY2hhbi0+dHMtPnRyeC0+bnIsIChjb24pLT5sY2hhbi0+dHMtPm5yLCBcCisJCQkoY29uKS0+bGNoYW4tPm5yLCAoY29uKS0+dXNlX2NvdW50KTsgXAorCX0gd2hpbGUoMCk7CisKKworLyogUmVhbCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBjb250YWluaW5nIEtpICovCitlbnVtIGdzbV9hdXRoX2FsZ28geworCUFVVEhfQUxHT19OT05FLAorCUFVVEhfQUxHT19YT1IsCisJQVVUSF9BTEdPX0NPTVAxMjh2MSwKK307CisKK3N0cnVjdCBnc21fYXV0aF9pbmZvIHsKKwllbnVtIGdzbV9hdXRoX2FsZ28gYXV0aF9hbGdvOworCXVuc2lnbmVkIGludCBhM2E4X2tpX2xlbjsKKwl1X2ludDhfdCBhM2E4X2tpWzE2XTsKK307CisKK3N0cnVjdCBnc21fYXV0aF90dXBsZSB7CisJaW50IHVzZV9jb3VudDsKKwlpbnQga2V5X3NlcTsKKwl1X2ludDhfdCByYW5kWzE2XTsKKwl1X2ludDhfdCBzcmVzWzRdOworCXVfaW50OF90IGtjWzhdOworfTsKKworCitzdHJ1Y3QgZ3NtX2xjaGFuOworc3RydWN0IGdzbV9zdWJzY3JpYmVyOworc3RydWN0IGdzbV9tbmNjOworc3RydWN0IHJ0cF9zb2NrZXQ7CisKKy8qIE5ldHdvcmsgTWFuYWdlbWVudCBTdGF0ZSAqLworc3RydWN0IGdzbV9ubV9zdGF0ZSB7CisJdV9pbnQ4X3Qgb3BlcmF0aW9uYWw7CisJdV9pbnQ4X3QgYWRtaW5pc3RyYXRpdmU7CisJdV9pbnQ4X3QgYXZhaWxhYmlsaXR5OworfTsKKworLyoKKyAqIExPQ0FUSU9OIFVQREFUSU5HIFJFUVVFU1Qgc3RhdGUKKyAqCisgKiBPdXIgY3VycmVudCBvcGVyYXRpb24gaXM6CisgKgktIEdldCBpbWVpL3Rtc2kKKyAqCS0gQWNjZXB0L1JlamVjdCBhY2NvcmRpbmcgdG8gZ2xvYmFsIHBvbGljeQorICovCitzdHJ1Y3QgZ3NtX2xvY191cGRhdGluZ19vcGVyYXRpb24geworICAgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCB1cGRhdGluZ190aW1lcjsKKwl1bnNpZ25lZCBpbnQgd2FpdGluZ19mb3JfaW1zaSA6IDE7CisJdW5zaWduZWQgaW50IHdhaXRpbmdfZm9yX2ltZWkgOiAxOworfTsKKworLyogTWF4aW11bSBudW1iZXIgb2YgbmVpZ2hib3IgY2VsbHMgd2hvc2UgYXZlcmFnZSB3ZSB0cmFjayAqLworI2RlZmluZSBNQVhfTkVJR0hfTUVBUwkJMTAKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgYXZlcmFnaW5nIHdpbmRvdyBmb3IgbmVpZ2hib3IgY2VsbHMgKi8KKyNkZWZpbmUgTUFYX1dJTl9ORUlHSF9BVkcJMTAKKworLyogcHJvY2Vzc2VkIG5laWdoYm9yIG1lYXN1cmVtZW50cyBmb3Igb25lIGNlbGwgKi8KK3N0cnVjdCBuZWlnaF9tZWFzX3Byb2MgeworCXVfaW50MTZfdCBhcmZjbjsKKwl1X2ludDhfdCBic2ljOworCXVfaW50OF90IHJ4bGV2W01BWF9XSU5fTkVJR0hfQVZHXTsKKwl1bnNpZ25lZCBpbnQgcnhsZXZfY250OworCXVfaW50OF90IGxhc3Rfc2Vlbl9ucjsKK307CisKKyNkZWZpbmUgTUFYX0E1X0tFWV9MRU4JKDEyOC84KQorI2RlZmluZSBSU0xfRU5DX0FMR19BNSh4KQkoeCsxKQorCisvKiBpcyB0aGUgZGF0YSBsaW5rIGVzdGFibGlzaGVkPyB3aG8gZXN0YWJsaXNoZWQgaXQ/ICovCisjZGVmaW5lIExDSEFOX1NBUElfVU5VU0VECTAKKyNkZWZpbmUgTENIQU5fU0FQSV9NUwkJMQorI2RlZmluZSBMQ0hBTl9TQVBJX05FVAkJMgorCisvKiBzdGF0ZSBvZiBhIGxvZ2ljYWwgY2hhbm5lbCAqLworZW51bSBnc21fbGNoYW5fc3RhdGUgeworCUxDSEFOX1NfTk9ORSwJCS8qIGNoYW5uZWwgaXMgbm90IGFjdGl2ZSAqLworCUxDSEFOX1NfQUNUX1JFUSwJLyogY2hhbm5lbCBhY3RpdmF0aW4gcmVxdWVzdGVkICovCisJTENIQU5fU19BQ1RJVkUsCQkvKiBjaGFubmVsIGlzIGFjdGl2ZSBhbmQgb3BlcmF0aW9uYWwgKi8KKwlMQ0hBTl9TX1JFTF9SRVEsCS8qIGNoYW5uZWwgcmVsZWFzZSBoYXMgYmVlbiByZXF1ZXN0ZWQgKi8KKwlMQ0hBTl9TX0lOQUNUSVZFLAkvKiBjaGFubmVsIGlzIHNldCBpbmFjdGl2ZSAqLworfTsKKworLyogdGhlIHBlciBzdWJzY3JpYmVyIGRhdGEgZm9yIGxjaGFuICovCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiB7CisJLyogVG8gd2hvbSB3ZSBhcmUgYWxsb2NhdGVkIGF0IHRoZSBtb21lbnQgKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCS8qIFRpbWVyIHN0YXJ0ZWQgdG8gcmVsZWFzZSB0aGUgY2hhbm5lbCAqLworCXN0cnVjdCB0aW1lcl9saXN0IHJlbGVhc2VfdGltZXI7CisKKwkvKgorCSAqIE9wZXJhdGlvbnMgdGhhdCBoYXZlIGEgc3RhdGUgYW5kIG1pZ2h0IGJlIHBlbmRpbmcKKwkgKi8KKwlzdHJ1Y3QgZ3NtX2xvY191cGRhdGluZ19vcGVyYXRpb24gKmxvY19vcGVyYXRpb247CisKKwkvKiB1c2UgY291bnQuIGhvdyBtYW55IHVzZXJzIHVzZSB0aGlzIGNoYW5uZWwgKi8KKwl1bnNpZ25lZCBpbnQgdXNlX2NvdW50OworCisJLyogQXJlIHdlIHBhcnQgb2YgYSBzcGVjaWFsICJzaWxlbnQiIGNhbGwgKi8KKwlpbnQgc2lsZW50X2NhbGw7CisKKwkvKiBiYWNrIHBvaW50ZXJzICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJc3RydWN0IGdzbV9idHMgKmJ0czsKK307CisKK3N0cnVjdCBnc21fbGNoYW4geworCS8qIFRoZSBUUyB0aGF0IHdlJ3JlIHBhcnQgb2YgKi8KKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCS8qIFRoZSBsb2dpY2FsIHN1YnNsb3QgbnVtYmVyIGluIHRoZSBUUyAqLworCXVfaW50OF90IG5yOworCS8qIFRoZSBsb2dpY2FsIGNoYW5uZWwgdHlwZSAqLworCWVudW0gZ3NtX2NoYW5fdCB0eXBlOworCS8qIFJTTCBjaGFubmVsIG1vZGUgKi8KKwllbnVtIHJzbF9jbW9kX3NwZCByc2xfY21vZGU7CisJLyogSWYgVENILCB0cmFmZmljIGNoYW5uZWwgbW9kZSAqLworCWVudW0gZ3NtNDhfY2hhbl9tb2RlIHRjaF9tb2RlOworCS8qIFN0YXRlICovCisJZW51bSBnc21fbGNoYW5fc3RhdGUgc3RhdGU7CisJLyogUG93ZXIgbGV2ZWxzIGZvciBNUyBhbmQgQlRTICovCisJdV9pbnQ4X3QgYnNfcG93ZXI7CisJdV9pbnQ4X3QgbXNfcG93ZXI7CisJLyogRW5jcnlwdGlvbiBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCB7CisJCXVfaW50OF90IGFsZ19pZDsKKwkJdV9pbnQ4X3Qga2V5X2xlbjsKKwkJdV9pbnQ4X3Qga2V5W01BWF9BNV9LRVlfTEVOXTsKKwl9IGVuY3I7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBUMzEwMTsKKworCS8qIEFNUiBiaXRzICovCisJc3RydWN0IGdzbTQ4X211bHRpX3JhdGVfY29uZiBtcl9jb25mOworCQorCS8qIEVzdGFibGlzaGVkIGRhdGEgbGluayBsYXllciBzZXJ2aWNlcyAqLworCXVfaW50OF90IHNhcGlzWzhdOworCisJLyogY2FjaGUgb2YgbGFzdCBtZWFzdXJlbWVudCByZXBvcnRzIG9uIHRoaXMgbGNoYW4gKi8KKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwIG1lYXNfcmVwWzZdOworCWludCBtZWFzX3JlcF9pZHg7CisKKwkvKiB0YWJsZSBvZiBuZWlnaGJvciBjZWxsIG1lYXN1cmVtZW50cyAqLworCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgbmVpZ2hfbWVhc1tNQVhfTkVJR0hfTUVBU107CisKKwlzdHJ1Y3QgeworCQl1X2ludDMyX3QgYm91bmRfaXA7CisJCXVfaW50MzJfdCBjb25uZWN0X2lwOworCQl1X2ludDE2X3QgYm91bmRfcG9ydDsKKwkJdV9pbnQxNl90IGNvbm5lY3RfcG9ydDsKKwkJdV9pbnQxNl90IGNvbm5faWQ7CisJCXVfaW50OF90IHJ0cF9wYXlsb2FkOworCQl1X2ludDhfdCBydHBfcGF5bG9hZDI7CisJCXVfaW50OF90IHNwZWVjaF9tb2RlOworCQlzdHJ1Y3QgcnRwX3NvY2tldCAqcnRwX3NvY2tldDsKKwl9IGFiaXNfaXA7CisKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiBjb25uOworfTsKKworc3RydWN0IGdzbV9lMV9zdWJzbG90IHsKKwkvKiBOdW1iZXIgb2YgRTEgbGluayAqLworCXVfaW50OF90CWUxX25yOworCS8qIE51bWJlciBvZiBFMSBUUyBpbnNpZGUgRTEgbGluayAqLworCXVfaW50OF90CWUxX3RzOworCS8qIFN1Yi1zbG90IHdpdGhpbiB0aGUgRTEgVFMsIDB4ZmYgaWYgZnVsbCBUUyAqLworCXVfaW50OF90CWUxX3RzX3NzOworfTsKKworI2RlZmluZSBUU19GX1BEQ0hfTU9ERQkweDEwMDAKKy8qIE9uZSBUaW1lc2xvdCBpbiBhIFRSWCAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzIHsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwkvKiBudW1iZXIgb2YgdGhpcyB0aW1lc2xvdCBhdCB0aGUgVFJYICovCisJdV9pbnQ4X3QgbnI7CisKKwllbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuOworCisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJc3RydWN0IHRsdl9wYXJzZWQgbm1fYXR0cjsKKwl1X2ludDhfdCBubV9jaGFuX2NvbWI7CisKKwkvKiBUbyB3aGljaCBFMSBzdWJzbG90IGFyZSB3ZSBjb25uZWN0ZWQgKi8KKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgZTFfbGluazsKKworCXN0cnVjdCBnc21fbGNoYW4gbGNoYW5bVFNfTUFYX0xDSEFOXTsKK307CisKKy8qIE9uZSBUUlggaW4gYSBCVFMgKi8KK3N0cnVjdCBnc21fYnRzX3RyeCB7CisJLyogbGlzdCBoZWFkZXIgaW4gYnRzLT50cnhfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCS8qIG51bWJlciBvZiB0aGlzIFRSWCBpbiB0aGUgQlRTICovCisJdV9pbnQ4X3QgbnI7CisJLyogaG93IGRvIHdlIHRhbGsgUlNMIHdpdGggdGhpcyBUUlg/ICovCisJc3RydWN0IGdzbV9lMV9zdWJzbG90IHJzbF9lMV9saW5rOworCXVfaW50OF90IHJzbF90ZWk7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqcnNsX2xpbms7CisKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCXN0cnVjdCB0bHZfcGFyc2VkIG5tX2F0dHI7CisJc3RydWN0IHsKKwkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwl9IGJiX3RyYW5zYzsKKworCXVfaW50MTZfdCBhcmZjbjsKKwlpbnQgbm9taW5hbF9wb3dlcjsJCS8qIGluIGRCbSAqLworCXVuc2lnbmVkIGludCBtYXhfcG93ZXJfcmVkOwkvKiBpbiBhY3R1YWwgZEIgKi8KKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gYmJzaWc7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJCQl9IHBhOworCQl9IGJzMTE7CisJfTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgdHNbVFJYX05SX1RTXTsKK307CisKK2VudW0gZ3NtX2J0c190eXBlIHsKKwlHU01fQlRTX1RZUEVfVU5LTk9XTiwKKwlHU01fQlRTX1RZUEVfQlMxMSwKKwlHU01fQlRTX1RZUEVfTkFOT0JUUywKK307CisKK3N0cnVjdCBnc21fYnRzX21vZGVsIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJZW51bSBnc21fYnRzX3R5cGUgdHlwZTsKKwljb25zdCBjaGFyICpuYW1lOworCisJc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWY7Cit9OworCisvKioKKyAqIEEgcGVuZGluZyBwYWdpbmcgcmVxdWVzdCAKKyAqLworc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCB7CisJLyogbGlzdF9oZWFkIGZvciBsaXN0IG9mIGFsbCBwYWdpbmcgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwkvKiB0aGUgc3Vic2NyaWJlciB3aGljaCB3ZSdyZSBwYWdpbmcuIExhdGVyIGdzbV9wYWdpbmdfcmVxdWVzdAorCSAqIHNob3VsZCBwcm9iYWJseSBiZWNvbWUgYSBwYXJ0IG9mIHRoZSBnc21fc3Vic2NyaWJlciBzdHJ1Y3Q/ICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJLyogYmFjay1wb2ludGVyIHRvIHRoZSBCVFMgb24gd2hpY2ggd2UgYXJlIHBhZ2luZyAqLworCXN0cnVjdCBnc21fYnRzICpidHM7CisJLyogd2hhdCBraW5kIG9mIGNoYW5uZWwgdHlwZSBkbyB3ZSBhc2sgdGhlIE1TIHRvIGVzdGFibGlzaCAqLworCWludCBjaGFuX3R5cGU7CisKKwkvKiBUaW1lciAzMTEzOiBob3cgbG9uZyBkbyB3ZSB0cnkgdG8gcGFnZT8gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBUMzExMzsKKworCS8qIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBpbiBjYXNlIHBhZ2luZyBjb21wbGV0ZXMgKi8KKwlnc21fY2JmbiAqY2JmbjsKKwl2b2lkICpjYmZuX3BhcmFtOworfTsKKworLyoKKyAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHBhZ2luZyBzdGF0dXMgb2Ygb25lIEJUUy4gSXQKKyAqIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdHMsIGEgYmFjayBwb2ludGVyCisgKiB0byB0aGUgZ3NtX2J0cywgYSB0aW1lciBhbmQgc29tZSBtb3JlIHN0YXRlLgorICovCitzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgeworCS8qIHBlbmRpbmcgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBwZW5kaW5nX3JlcXVlc3RzOworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3b3JrX3RpbWVyOworCisJLyogbG9hZCAqLworCXVfaW50MTZfdCBhdmFpbGFibGVfc2xvdHM7Cit9OworCitzdHJ1Y3QgZ3NtX2VudmFidHNlIHsKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworfTsKKworc3RydWN0IGdzbV9idHNfZ3Byc19uc3ZjIHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCS8qIGRhdGEgcmVhZCB2aWEgVlRZIGNvbmZpZyBmaWxlLCB0byBjb25maWd1cmUgdGhlIEJUUworCSAqIHZpYSBPTUwgZnJvbSBCU0MgKi8KKwlpbnQgaWQ7CisJdV9pbnQxNl90IG5zdmNpOworCXVfaW50MTZfdCBsb2NhbF9wb3J0OwkvKiBvbiB0aGUgQlRTICovCisJdV9pbnQxNl90IHJlbW90ZV9wb3J0OwkvKiBvbiB0aGUgU0dTTiAqLworCXVfaW50MzJfdCByZW1vdGVfaXA7CS8qIG9uIHRoZSBTR1NOICovCisKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworfTsKKworLyogT25lIEJUUyAqLworc3RydWN0IGdzbV9idHMgeworCS8qIGxpc3QgaGVhZGVyIGluIG5ldC0+YnRzX2xpc3QgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrOworCS8qIG51bWJlciBvZiB0aHMgQlRTIGluIG5ldHdvcmsgKi8KKwl1X2ludDhfdCBucjsKKwkvKiBDZWxsIElkZW50aXR5ICovCisJdV9pbnQxNl90IGNlbGxfaWRlbnRpdHk7CisJLyogbG9jYXRpb24gYXJlYSBjb2RlIG9mIHRoaXMgQlRTICovCisJdV9pbnQxNl90IGxvY2F0aW9uX2FyZWFfY29kZTsKKwkvKiBUcmFpbmluZyBTZXF1ZW5jZSBDb2RlICovCisJdV9pbnQ4X3QgdHNjOworCS8qIEJhc2UgU3RhdGlvbiBJZGVudGlmaWNhdGlvbiBDb2RlIChCU0lDKSAqLworCXVfaW50OF90IGJzaWM7CisJLyogdHlwZSBvZiBCVFMgKi8KKwllbnVtIGdzbV9idHNfdHlwZSB0eXBlOworCXN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbDsKKwllbnVtIGdzbV9iYW5kIGJhbmQ7CisJLyogc2hvdWxkIHRoZSBjaGFubmVsIGFsbG9jYXRvciBhbGxvY2F0ZSBjaGFubmVscyBmcm9tIGhpZ2ggVFJYIHRvIFRSWDAsCisJICogcmF0aGVyIHRoYW4gc3RhcnRpbmcgZnJvbSBUUlgwIGFuZCBnbyB1cHdhcmRzPyAqLworCWludCBjaGFuX2FsbG9jX3JldmVyc2U7CisJLyogbWF4aW11bSBUeCBwb3dlciB0aGF0IHRoZSBNUyBpcyBwZXJtaXR0ZWQgdG8gdXNlIGluIHRoaXMgY2VsbCAqLworCWludCBtc19tYXhfcG93ZXI7CisKKwkvKiBob3cgZG8gd2UgdGFsayBPTUwgd2l0aCB0aGlzIFRSWD8gKi8KKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3Qgb21sX2UxX2xpbms7CisJdV9pbnQ4X3Qgb21sX3RlaTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpvbWxfbGluazsKKworCS8qIEFiaXMgbmV0d29yayBtYW5hZ2VtZW50IE8mTSBoYW5kbGUgKi8KKwlzdHJ1Y3QgYWJpc19ubV9oICpubWg7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCBubV9hdHRyOworCisJLyogbnVtYmVyIG9mIHRoaXMgQlRTIG9uIGdpdmVuIEUxIGxpbmsgKi8KKwl1X2ludDhfdCBidHNfbnI7CisKKwkvKiBwYWdpbmcgc3RhdGUgYW5kIGNvbnRyb2wgKi8KKwlzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgcGFnaW5nOworCisJLyogQ0NDSCBpcyBvbiBDMCAqLworCXN0cnVjdCBnc21fYnRzX3RyeCAqYzA7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCX0gc2l0ZV9tZ3I7CisKKwkvKiBwYXJhbWV0ZXJzIGZyb20gd2hpY2ggd2UgYnVpbGQgU1lTVEVNIElORk9STUFUSU9OICovCisJc3RydWN0IHsKKwkJc3RydWN0IGdzbTQ4X3JhY2hfY29udHJvbCByYWNoX2NvbnRyb2w7CisJCXVfaW50OF90IG5jY19wZXJtaXR0ZWQ7CisJCXN0cnVjdCBnc200OF9jZWxsX3NlbF9wYXIgY2VsbF9zZWxfcGFyOworCQlzdHJ1Y3QgZ3NtNDhfY2VsbF9vcHRpb25zIGNlbGxfb3B0aW9uczsKKwkJc3RydWN0IGdzbTQ4X2NvbnRyb2xfY2hhbm5lbF9kZXNjciBjaGFuX2Rlc2M7CisJCXN0cnVjdCBiaXR2ZWMgbmVpZ2hfbGlzdDsKKwkJc3RydWN0IGJpdHZlYyBjZWxsX2FsbG9jOworCQlzdHJ1Y3QgeworCQkJLyogYml0bWFzayBsYXJnZSBlbm91Z2ggZm9yIGFsbCBwb3NzaWJsZSBBUkZDTidzICovCisJCQl1X2ludDhfdCBuZWlnaF9saXN0WzEwMjQvOF07CisJCQl1X2ludDhfdCBjZWxsX2FsbG9jWzEwMjQvOF07CisJCX0gZGF0YTsKKwl9IHNpX2NvbW1vbjsKKworCS8qIGlwLmFjY2Vzc3MgVW5pdCBJRCdzIGhhdmUgU2l0ZS9CVFMvVFJYIGxheW91dCAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVfaW50MTZfdCBzaXRlX2lkOworCQkJdV9pbnQxNl90IGJ0c19pZDsKKwkJCXVfaW50MzJfdCBmbGFnczsKKwkJfSBpcF9hY2Nlc3M7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJCQl9IGNjbGs7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJCQl9IHJhY2s7CisJCQlzdHJ1Y3QgZ3NtX2VudmFidHNlIGVudmFidHNlWzRdOworCQl9IGJzMTE7CisJfTsKKworCS8qIE5vdCBlbnRpcmVseSBzdXJlIGhvdyBpcC5hY2Nlc3Mgc3BlY2lmaWMgdGhpcyBpcyAqLworCXN0cnVjdCB7CisJCWVudW0gYnRzX2dwcnNfbW9kZSBtb2RlOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCXVfaW50MTZfdCBuc2VpOworCQkJdWludDhfdCB0aW1lcls3XTsKKwkJfSBuc2U7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJdV9pbnQxNl90IGJ2Y2k7CisJCQl1aW50OF90IHRpbWVyWzExXTsKKwkJfSBjZWxsOworCQlzdHJ1Y3QgZ3NtX2J0c19ncHJzX25zdmMgbnN2Y1syXTsKKwkJdV9pbnQ4X3QgcmFjOworCX0gZ3ByczsKKworCS8qIFJBQ0ggTk0gdmFsdWVzICovCisJaW50IHJhY2hfYl90aHJlc2g7CisJaW50IHJhY2hfbGRhdmdfc2xvdHM7CisJCisJLyogdHJhbnNjZWl2ZXJzICovCisJaW50IG51bV90cng7CisJc3RydWN0IGxsaXN0X2hlYWQgdHJ4X2xpc3Q7Cit9OworCisvKiBTb21lIHN0YXRpc3RpY3Mgb2Ygb3VyIG5ldHdvcmsgKi8KK3N0cnVjdCBnc21uZXRfc3RhdHMgeworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICp0b3RhbDsKKwkJc3RydWN0IGNvdW50ZXIgKm5vX2NoYW5uZWw7CisJfSBjaHJlcTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqYXR0ZW1wdGVkOworCQlzdHJ1Y3QgY291bnRlciAqbm9fY2hhbm5lbDsJLyogbm8gY2hhbm5lbCBhdmFpbGFibGUgKi8KKwkJc3RydWN0IGNvdW50ZXIgKnRpbWVvdXQ7CQkvKiBUMzEwMyB0aW1lb3V0ICovCisJCXN0cnVjdCBjb3VudGVyICpjb21wbGV0ZWQ7CS8qIEhPIENPTVBMIHJlY2VpdmVkICovCisJCXN0cnVjdCBjb3VudGVyICpmYWlsZWQ7CQkvKiBITyBGQUlMIHJlY2VpdmVkICovCisJfSBoYW5kb3ZlcjsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqYXR0YWNoOworCQlzdHJ1Y3QgY291bnRlciAqbm9ybWFsOworCQlzdHJ1Y3QgY291bnRlciAqcGVyaW9kaWM7CisJCXN0cnVjdCBjb3VudGVyICpkZXRhY2g7CisJfSBsb2NfdXBkX3R5cGU7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKnJlamVjdDsKKwkJc3RydWN0IGNvdW50ZXIgKmFjY2VwdDsKKwl9IGxvY191cGRfcmVzcDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqYXR0ZW1wdGVkOworCQlzdHJ1Y3QgY291bnRlciAqZGV0YWNoZWQ7CisJCXN0cnVjdCBjb3VudGVyICpjb21wbGV0ZWQ7CisJCXN0cnVjdCBjb3VudGVyICpleHBpcmVkOworCX0gcGFnaW5nOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpzdWJtaXR0ZWQ7IC8qIE1PIFNNUyBzdWJtaXNzaW9ucyAqLworCQlzdHJ1Y3QgY291bnRlciAqbm9fcmVjZWl2ZXI7CisJCXN0cnVjdCBjb3VudGVyICpkZWxpdmVyZWQ7IC8qIE1UIFNNUyBkZWxpdmVyaWVzICovCisJCXN0cnVjdCBjb3VudGVyICpycF9lcnJfbWVtOworCQlzdHJ1Y3QgY291bnRlciAqcnBfZXJyX290aGVyOworCX0gc21zOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpkaWFsbGVkOwkvKiB0b3RhbCBudW1iZXIgb2YgZGlhbGxlZCBjYWxscyAqLworCQlzdHJ1Y3QgY291bnRlciAqYWxlcnRlZDsJLyogd2UgYWxlcnRlZCB0aGUgb3RoZXIgZW5kICovCisJCXN0cnVjdCBjb3VudGVyICpjb25uZWN0ZWQ7LyogaG93IG1hbnkgY2FsbHMgd2VyZSBhY2NlcHRlZCAqLworCX0gY2FsbDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqcmZfZmFpbDsKKwkJc3RydWN0IGNvdW50ZXIgKnJsbF9lcnI7CisJfSBjaGFuOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpvbWxfZmFpbDsKKwkJc3RydWN0IGNvdW50ZXIgKnJzbF9mYWlsOworCX0gYnRzOworfTsKKworZW51bSBnc21fYXV0aF9wb2xpY3kgeworCUdTTV9BVVRIX1BPTElDWV9DTE9TRUQsIC8qIG9ubHkgc3Vic2NyaWJlcnMgYXV0aG9yaXplZCBpbiBEQiAqLworCUdTTV9BVVRIX1BPTElDWV9BQ0NFUFRfQUxMLCAvKiBhY2NlcHQgZXZlcnlvbmUsIGV2ZW4gaWYgbm90IGF1dGhvcml6ZWQgaW4gREIgKi8KKwlHU01fQVVUSF9QT0xJQ1lfVE9LRU4sIC8qIGFjY2VwdCBmaXJzdCwgc2VuZCB0b2tlbiBwZXIgc21zLCB0aGVuIHJldm9rZSBhdXRob3JpemF0aW9uICovCit9OworCisjZGVmaW5lIEdTTV9UMzEwMV9ERUZBVUxUIDEwCisjZGVmaW5lIEdTTV9UMzExM19ERUZBVUxUIDYwCisKK3N0cnVjdCBnc21fbmV0d29yayB7CisJLyogZ2xvYmFsIHBhcmFtZXRlcnMgKi8KKwl1X2ludDE2X3QgY291bnRyeV9jb2RlOworCXVfaW50MTZfdCBuZXR3b3JrX2NvZGU7CisJY2hhciAqbmFtZV9sb25nOworCWNoYXIgKm5hbWVfc2hvcnQ7CisJZW51bSBnc21fYXV0aF9wb2xpY3kgYXV0aF9wb2xpY3k7CisJZW51bSBnc200OF9yZWplY3RfdmFsdWUgcmVqZWN0X2NhdXNlOworCWludCBhNV9lbmNyeXB0aW9uOworCWludCBuZWNpOworCWludCBzZW5kX21tX2luZm87CisJc3RydWN0IHsKKwkJaW50IGFjdGl2ZTsKKwkJLyogV2luZG93IFJYTEVWIGF2ZXJhZ2luZyAqLworCQl1bnNpZ25lZCBpbnQgd2luX3J4bGV2X2F2ZzsJLyogbnVtYmVyIG9mIFNBQ0NIIGZyYW1lcyAqLworCQkvKiBXaW5kb3cgUlhRVUFMIGF2ZXJhZ2luZyAqLworCQl1bnNpZ25lZCBpbnQgd2luX3J4cXVhbF9hdmc7CS8qIG51bWJlciBvZiBTQUNDSCBmcmFtZXMgKi8KKwkJLyogV2luZG93IFJYTEVWIG5laWdoYm91cmluZyBjZWxscyBhdmVyYWdpbmcgKi8KKwkJdW5zaWduZWQgaW50IHdpbl9yeGxldl9hdmdfbmVpZ2g7IC8qIG51bWJlciBvZiBTQUNDSCBmcmFtZXMgKi8KKworCQkvKiBob3cgb2Z0ZW4gc2hvdWxkIHdlIGNoZWNrIGZvciBwb3dlciBidWRnZXQgSE8gKi8KKwkJdW5zaWduZWQgaW50IHB3cl9pbnRlcnZhbDsJLyogU0FDQ0ggZnJhbWVzICovCisJCS8qIGhvdyBtdWNoIGJldHRlciBkb2VzIGEgbmVpZ2hib3IgY2VsbCBoYXZlIHRvIGJlID8gKi8KKwkJdW5zaWduZWQgaW50IHB3cl9oeXN0ZXJlc2lzOwkvKiBkQm0gKi8KKwkJLyogbWF4aW11bSBkaXN0YWNuZSBiZWZvcmUgd2UgdHJ5IGEgaGFuZG92ZXIgKi8KKwkJdW5zaWduZWQgaW50IG1heF9kaXN0YW5jZTsJLyogVEEgdmFsdWVzICovCisJfSBoYW5kb3ZlcjsKKworCXN0cnVjdCBnc21uZXRfc3RhdHMgc3RhdHM7CisKKwkvKiBsYXllciA0ICovCisJaW50ICgqbW5jY19yZWN2KSAoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCB1cHF1ZXVlOworCXN0cnVjdCBsbGlzdF9oZWFkIHRyYW5zX2xpc3Q7CisKKwl1bnNpZ25lZCBpbnQgbnVtX2J0czsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBidHNfbGlzdDsKKworCS8qIHRpbWVyIHZhbHVlcyAqLworCWludCBUMzEwMTsKKwlpbnQgVDMxMDM7CisJaW50IFQzMTA1OworCWludCBUMzEwNzsKKwlpbnQgVDMxMDk7CisJaW50IFQzMTExOworCWludCBUMzExMzsKKwlpbnQgVDMxMTU7CisJaW50IFQzMTE3OworCWludCBUMzExOTsKKwlpbnQgVDMxNDE7CisKKwkvKiBSYWRpbyBSZXNvdXJjZSBMb2NhdGlvbiBQcm90b2NvbCAoVFMgMDQuMzEpICovCisJc3RydWN0IHsKKwkJZW51bSBycmxwX21vZGUgbW9kZTsKKwl9IHJybHA7Cit9OworCisjZGVmaW5lIFNNU19IRFJfU0laRQkxMjgKKyNkZWZpbmUgU01TX1RFWFRfU0laRQkyNTYKK3N0cnVjdCBnc21fc21zIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaWQ7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzZW5kZXI7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlcjsKKworCXVuc2lnbmVkIGxvbmcgdmFsaWRpdHlfbWludXRlczsKKwl1X2ludDhfdCByZXBseV9wYXRoX3JlcTsKKwl1X2ludDhfdCBzdGF0dXNfcmVwX3JlcTsKKwl1X2ludDhfdCB1ZF9oZHJfaW5kOworCXVfaW50OF90IHByb3RvY29sX2lkOworCXVfaW50OF90IGRhdGFfY29kaW5nX3NjaGVtZTsKKwl1X2ludDhfdCBtc2dfcmVmOworCWNoYXIgZGVzdF9hZGRyWzIwKzFdOwkvKiBEQSBMViBpcyAxMiBieXRlcyBtYXgsIGkuZS4gMTAgYnl0ZXMKKwkJCQkgKiBCQ0QgPT0gMjAgYnl0ZXMgc3RyaW5nICovCisJdV9pbnQ4X3QgdXNlcl9kYXRhX2xlbjsKKwl1X2ludDhfdCB1c2VyX2RhdGFbU01TX1RFWFRfU0laRV07CisKKwljaGFyIHRleHRbU01TX1RFWFRfU0laRV07Cit9OworCisKK3N0cnVjdCBnc21fbmV0d29yayAqZ3NtX25ldHdvcmtfaW5pdCh1X2ludDE2X3QgY291bnRyeV9jb2RlLCB1X2ludDE2X3QgbmV0d29ya19jb2RlLAorCQkJCSAgICAgaW50ICgqbW5jY19yZWN2KShzdHJ1Y3QgZ3NtX25ldHdvcmsgKiwgaW50LCB2b2lkICopKTsKK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX2FsbG9jKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBlbnVtIGdzbV9idHNfdHlwZSB0eXBlLAorCQkJICAgICAgdV9pbnQ4X3QgdHNjLCB1X2ludDhfdCBic2ljKTsKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgZ3NtX3NldF9idHNfdHlwZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGdzbV9idHNfdHlwZSB0eXBlKTsKKworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfbnVtKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbnVtKTsKKworLyogR2V0IHJlZmVyZW5jZSB0byBhIG5laWdoYm9yIGNlbGwgb24gYSBnaXZlbiBCQ0NIIEFSRkNOICovCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19uZWlnaGJvcihjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCSB1X2ludDE2X3QgYXJmY24sIHVfaW50OF90IGJzaWMpOworCitzdHJ1Y3QgZ3NtX2J0c190cnggKmdzbV9idHNfdHJ4X251bShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbnVtKTsKKworY29uc3QgY2hhciAqZ3NtX3BjaGFuX25hbWUoZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBjKTsKK2VudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgZ3NtX3BjaGFuX3BhcnNlKGNvbnN0IGNoYXIgKm5hbWUpOworY29uc3QgY2hhciAqZ3NtX2xjaGFudF9uYW1lKGVudW0gZ3NtX2NoYW5fdCBjKTsKK2NvbnN0IGNoYXIgKmdzbV9jaHJlcV9uYW1lKGVudW0gZ3NtX2NocmVxX3JlYXNvbl90IGMpOworY2hhciAqZ3NtX3RyeF9uYW1lKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKK2NoYXIgKmdzbV90c19uYW1lKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpOworY2hhciAqZ3NtX2xjaGFuX25hbWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworY29uc3QgY2hhciAqZ3NtX2xjaGFuc19uYW1lKGVudW0gZ3NtX2xjaGFuX3N0YXRlIHMpOworCitlbnVtIGdzbV9lMV9ldmVudCB7CisJRVZUX0UxX05PTkUsCisJRVZUX0UxX1RFSV9VUCwKKwlFVlRfRTFfVEVJX0ROLAorfTsKKwordm9pZCBzZXRfdHNfZTFsaW5rKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsIHVfaW50OF90IGUxX25yLAorCQkgICB1X2ludDhfdCBlMV90cywgdV9pbnQ4X3QgZTFfdHNfc3MpOworZW51bSBnc21fYnRzX3R5cGUgcGFyc2VfYnRzdHlwZShjb25zdCBjaGFyICphcmcpOworY29uc3QgY2hhciAqYnRzdHlwZTJzdHIoZW51bSBnc21fYnRzX3R5cGUgdHlwZSk7CitzdHJ1Y3QgZ3NtX2J0c190cnggKmdzbV9idHNfdHJ4X2J5X25yKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBucik7CitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19ieV9sYWMoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVuc2lnbmVkIGludCBsYWMsCisJCQkJc3RydWN0IGdzbV9idHMgKnN0YXJ0X2J0cyk7CisKK2V4dGVybiB2b2lkICp0YWxsX2JzY19jdHg7CitleHRlcm4gaW50IGlwYWNjX3J0cF9kaXJlY3Q7CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lwYWNjZXNzX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19zaWVtZW5zX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworZW51bSBnc21fYXV0aF9wb2xpY3kgZ3NtX2F1dGhfcG9saWN5X3BhcnNlKGNvbnN0IGNoYXIgKmFyZyk7Citjb25zdCBjaGFyICpnc21fYXV0aF9wb2xpY3lfbmFtZShlbnVtIGdzbV9hdXRoX3BvbGljeSBwb2xpY3kpOworCitlbnVtIHJybHBfbW9kZSBycmxwX21vZGVfcGFyc2UoY29uc3QgY2hhciAqYXJnKTsKK2NvbnN0IGNoYXIgKnJybHBfbW9kZV9uYW1lKGVudW0gcnJscF9tb2RlIG1vZGUpOworCitlbnVtIGJ0c19ncHJzX21vZGUgYnRzX2dwcnNfbW9kZV9wYXJzZShjb25zdCBjaGFyICphcmcpOworY29uc3QgY2hhciAqYnRzX2dwcnNfbW9kZV9uYW1lKGVudW0gYnRzX2dwcnNfbW9kZSBtb2RlKTsKKwordm9pZCBnc21fdHJ4X2xvY2tfcmYoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIGludCBsb2NrZWQpOworCitpbnQgZ3NtNDhfcmFfaWRfYnlfYnRzKHVfaW50OF90ICpidWYsIHN0cnVjdCBnc21fYnRzICpidHMpOwordm9pZCBncHJzX3JhX2lkX2J5X2J0cyhzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgc3RydWN0IGdzbV9idHMgKmJ0cyk7CitzdHJ1Y3QgZ3NtX21lYXNfcmVwICpsY2hhbl9uZXh0X21lYXNfcmVwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworaW50IGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fc3Vic2NyaWJlci5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjUzOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaApAQCAtMCwwICsxLDk1IEBACisjaWZuZGVmIF9HU01fU1VCU0NSX0gKKyNkZWZpbmUgX0dTTV9TVUJTQ1JfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiZ3NtX2RhdGEuaCIKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBHU01fSU1FSV9MRU5HVEggMTcKKyNkZWZpbmUgR1NNX0lNU0lfTEVOR1RIIDE3CisjZGVmaW5lIEdTTV9OQU1FX0xFTkdUSCAxMjgKKworI2RlZmluZSBHU01fRVhURU5TSU9OX0xFTkdUSCAxNSAvKiBNU0lTRE4gY2FuIG9ubHkgYmUgMTUgZGlnaXRzIGxlbmd0aCAqLworI2RlZmluZSBHU01fTUlOX0VYVEVOIDIwMDAwCisjZGVmaW5lIEdTTV9NQVhfRVhURU4gNDk5OTkKKworLyogcmVzZXJ2ZWQgYWNjb3JkaW5nIHRvIEdTTSAwMy4wMyDCpyAyLjQgKi8KKyNkZWZpbmUgR1NNX1JFU0VSVkVEX1RNU0kgICAweEZGRkZGRkZGCisKKworI2RlZmluZSBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUCTB4MDAwMDAwMDEKKyNkZWZpbmUgdG1zaV9mcm9tX3N0cmluZyhzdHIpIHN0cnRvdWwoc3RyLCBOVUxMLCAxMCkKKworc3RydWN0IGdzbV9lcXVpcG1lbnQgeworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgaWQ7CisJY2hhciBpbWVpW0dTTV9JTUVJX0xFTkdUSF07CisJY2hhciBuYW1lW0dTTV9OQU1FX0xFTkdUSF07CisKKwlzdHJ1Y3QgZ3NtNDhfY2xhc3NtYXJrMSBjbGFzc21hcmsxOworCXVfaW50OF90IGNsYXNzbWFyazJfbGVuOworCXVfaW50OF90IGNsYXNzbWFyazJbM107CisJdV9pbnQ4X3QgY2xhc3NtYXJrM19sZW47CisJdV9pbnQ4X3QgY2xhc3NtYXJrM1sxNF07Cit9OworCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgeworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgaWQ7CisJY2hhciBpbXNpW0dTTV9JTVNJX0xFTkdUSF07CisJdV9pbnQzMl90IHRtc2k7CisJdV9pbnQxNl90IGxhYzsKKwljaGFyIG5hbWVbR1NNX05BTUVfTEVOR1RIXTsKKwljaGFyIGV4dGVuc2lvbltHU01fRVhURU5TSU9OX0xFTkdUSF07CisJaW50IGF1dGhvcml6ZWQ7CisKKwkvKiBUZW1wb3JhcnkgZmllbGQgd2hpY2ggaXMgbm90IHN0b3JlZCBpbiB0aGUgREIvSExSICovCisJdV9pbnQzMl90IGZsYWdzOworCisJLyogRXZlcnkgdXNlciBjYW4gb25seSBoYXZlIG9uZSBlcXVpcG1lbnQgaW4gdXNlIGF0IGFueSBnaXZlbgorCSAqIHBvaW50IGluIHRpbWUgKi8KKwlzdHJ1Y3QgZ3NtX2VxdWlwbWVudCBlcXVpcG1lbnQ7CisKKwkvKiBmb3IgaW50ZXJuYWwgbWFuYWdlbWVudCAqLworCWludCB1c2VfY291bnQ7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisKKwkvKiBwZW5kaW5nIHJlcXVlc3RzICovCisJaW50IGluX2NhbGxiYWNrOworCXN0cnVjdCBsbGlzdF9oZWFkIHJlcXVlc3RzOworfTsKKworZW51bSBnc21fc3Vic2NyaWJlcl9maWVsZCB7CisJR1NNX1NVQlNDUklCRVJfSU1TSSwKKwlHU01fU1VCU0NSSUJFUl9UTVNJLAorCUdTTV9TVUJTQ1JJQkVSX0VYVEVOU0lPTiwKKwlHU01fU1VCU0NSSUJFUl9JRCwKK307CisKK2VudW0gZ3NtX3N1YnNjcmliZXJfdXBkYXRlX3JlYXNvbiB7CisJR1NNX1NVQlNDUklCRVJfVVBEQVRFX0FUVEFDSEVELAorCUdTTV9TVUJTQ1JJQkVSX1VQREFURV9ERVRBQ0hFRCwKKwlHU01fU1VCU0NSSUJFUl9VUERBVEVfRVFVSVBNRU5ULAorfTsKKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX3B1dChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfdG1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICB1X2ludDMyX3QgdG1zaSk7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfaW1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICBjb25zdCBjaGFyICppbXNpKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9leHRlbnNpb24oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpleHQpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2lkKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgaWQpOworaW50IHN1YnNjcl91cGRhdGUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgcmVhc29uKTsKK3ZvaWQgc3Vic2NyX3B1dF9jaGFubmVsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK3ZvaWQgc3Vic2NyX2dldF9jaGFubmVsKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpwYXJhbSk7CisKK2NoYXIgKnN1YnNjcl9uYW1lKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKKworLyogaW50ZXJuYWwgKi8KK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2FsbG9jKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIGFjdGl2ZV9zdWJzY3JpYmVyczsKKworI2VuZGlmIC8qIF9HU01fU1VCU0NSX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2hhbmRvdmVyLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9oYW5kb3Zlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjFiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9oYW5kb3Zlci5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfSEFORE9WRVJfSAorI2RlZmluZSBfSEFORE9WRVJfSAorLyogSGFuZCBvdmVyIHRoZSBzcGVjaWZpZWQgbG9naWNhbCBjaGFubmVsIHRvIHRoZSBzcGVjaWZpZWQgbmV3IEJUUy4KKyAqIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBhY3R1YWwgaGFuZG92ZXIgYWxnb3JpdGhtLAorICogYWZ0ZXIgaXQgaGFzIGRlY2lkZWQgaXQgd2FudHMgdG8gaW5pdGlhdGUgSE8gdG8gYSBzcGVjaWZpYyBCVFMgKi8KK2ludCBic2NfaGFuZG92ZXJfc3RhcnQoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworI2VuZGlmIC8qIF9IQU5ET1ZFUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9pcGFjY2Vzcy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaXBhY2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGRkZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaXBhY2Nlc3MuaApAQCAtMCwwICsxLDEwOSBAQAorI2lmbmRlZiBfSVBBQ0NFU1NfSAorI2RlZmluZSBfSVBBQ0NFU1NfSAorCisjaW5jbHVkZSAiZTFfaW5wdXQuaCIKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBJUEFfVENQX1BPUlRfT01MCTMwMDIKKyNkZWZpbmUgSVBBX1RDUF9QT1JUX1JTTAkzMDAzCisKK3N0cnVjdCBpcGFjY2Vzc19oZWFkIHsKKwl1X2ludDE2X3QgbGVuOwkvKiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwl1X2ludDhfdCBwcm90bzsKKwl1X2ludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2VudW0gaXBhY2Nlc3NfcHJvdG8geworCUlQQUNfUFJPVE9fUlNMCQk9IDB4MDAsCisJSVBBQ19QUk9UT19JUEFDQ0VTUwk9IDB4ZmUsCisJSVBBQ19QUk9UT19TQ0NQCQk9IDB4ZmQsCisJSVBBQ19QUk9UT19PTUwJCT0gMHhmZiwKK307CisKK2VudW0gaXBhY2Nlc3NfbXNndHlwZSB7CisJSVBBQ19NU0dUX1BJTkcJCT0gMHgwMCwKKwlJUEFDX01TR1RfUE9ORwkJPSAweDAxLAorCUlQQUNfTVNHVF9JRF9HRVQJPSAweDA0LAorCUlQQUNfTVNHVF9JRF9SRVNQCT0gMHgwNSwKKwlJUEFDX01TR1RfSURfQUNLCT0gMHgwNiwKK307CisKK2VudW0gaXBhY2Nlc3NfaWRfdGFncyB7CisJSVBBQ19JRFRBR19TRVJOUgkJPSAweDAwLAorCUlQQUNfSURUQUdfVU5JVE5BTUUJCT0gMHgwMSwKKwlJUEFDX0lEVEFHX0xPQ0FUSU9OMQkJPSAweDAyLAorCUlQQUNfSURUQUdfTE9DQVRJT04yCQk9IDB4MDMsCisJSVBBQ19JRFRBR19FUVVJUFZFUlMJCT0gMHgwNCwKKwlJUEFDX0lEVEFHX1NXVkVSU0lPTgkJPSAweDA1LAorCUlQQUNfSURUQUdfSVBBRERSCQk9IDB4MDYsCisJSVBBQ19JRFRBR19NQUNBRERSCQk9IDB4MDcsCisJSVBBQ19JRFRBR19VTklUCQkJPSAweDA4LAorfTsKKworaW50IGlwYWNjZXNzX2Nvbm5lY3Qoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EpOworCisvKgorICogbWV0aG9kcyBmb3IgcGFyc2luZyBhbmQgc2VuZGluZyBhIG1lc3NhZ2UKKyAqLworaW50IGlwYWNjZXNzX3Jjdm1zZ19iYXNlKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBic2NfZmQgKmJmZCk7CitzdHJ1Y3QgbXNnYiAqaXBhY2Nlc3NfcmVhZF9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yKTsKK3ZvaWQgaXBhY2Nlc3NfcHJlcGVuZF9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgaW50IHByb3RvKTsKK2ludCBpcGFjY2Vzc19zZW5kX2lkX2FjayhpbnQgZmQpOworaW50IGlwYWNjZXNzX3NlbmRfaWRfcmVxKGludCBmZCk7CisKK2ludCBpcGFjY2Vzc19pZHRhZ19wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqZGVjLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pOworCitpbnQgaXBhY2Nlc3NfZHJvcF9vbWwoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgaXBhY2Nlc3NfZHJvcF9yc2woc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworCisvKgorICogRmlybXdhcmUgc3BlY2lmaWMgaGVhZGVyCisgKi8KK3N0cnVjdCBzZHBfZmlybXdhcmUgeworCWNoYXIgbWFnaWNbNF07CisJY2hhciBtb3JlX21hZ2ljWzJdOworCXVfaW50MTZfdCBtb3JlX21vcmVfbWFnaWM7CisJdV9pbnQzMl90IGhlYWRlcl9sZW5ndGg7CisJdV9pbnQzMl90IGZpbGVfbGVuZ3RoOworCWNoYXIgc3dfcGFydFsyMF07CisJY2hhciB0ZXh0MVs2NF07CisJY2hhciB0aW1lWzEyXTsKKwljaGFyIGRhdGVbMTRdOworCWNoYXIgdGV4dDJbMTBdOworCWNoYXIgdmVyc2lvblsyMF07CisJdV9pbnQxNl90IHRhYmxlX29mZnNldDsKKwkvKiBzdHVmZiBpIGRvbid0IGtub3cgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzZHBfaGVhZGVyX2VudHJ5IHsKKwl1X2ludDE2X3Qgc29tZXRoaW5nMTsKKwljaGFyIHRleHQxWzY0XTsKKwljaGFyIHRpbWVbMTJdOworCWNoYXIgZGF0ZVsxNF07CisJY2hhciB0ZXh0MlsxMF07CisJY2hhciB2ZXJzaW9uWzIwXTsKKwl1X2ludDMyX3QgbGVuZ3RoOworCXVfaW50MzJfdCBhZGRyMTsKKwl1X2ludDMyX3QgYWRkcjI7CisJdV9pbnQzMl90IHN0YXJ0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNkcF9oZWFkZXJfaXRlbSB7CisJc3RydWN0IHNkcF9oZWFkZXJfZW50cnkgaGVhZGVyX2VudHJ5OworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCW9mZl90IGFic29sdXRlX29mZnNldDsKK307CisKK3N0cnVjdCBzZHBfaGVhZGVyIHsKKwlzdHJ1Y3Qgc2RwX2Zpcm13YXJlIGZpcm13YXJlX2luZm87CisKKwkvKiBmb3IgbW9yZV9tYWdpYyBhIGxpc3Qgb2Ygc2RwX2hlYWRlcl9lbnRyeV9saXN0ICovCisJc3RydWN0IGxsaXN0X2hlYWQgaGVhZGVyX2xpc3Q7CisKKwkvKiB0aGUgZW50cnkgb2YgdGhlIHNkcF9oZWFkZXIgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKK307CisKK2ludCBpcGFjY2Vzc19hbmFseXplX2ZpbGUoaW50IGZkLCBjb25zdCB1bnNpZ25lZCBpbnQgc3Rfc2l6ZSwgY29uc3QgdW5zaWduZWQgYmFzZV9vZmZzZXQsIHN0cnVjdCBsbGlzdF9oZWFkICpsaXN0KTsKKworI2VuZGlmIC8qIF9JUEFDQ0VTU19IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZWFzX3JlcC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWVhc19yZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzJjOGQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWVhc19yZXAuaApAQCAtMCwwICsxLDg1IEBACisjaWZuZGVmIF9NRUFTX1JFUF9ICisjZGVmaW5lIF9NRUFTX1JFUF9ICisKKyNkZWZpbmUgTVJDX0ZfUFJPQ0VTU0VECTB4MDAwMQorCisvKiBleHRyYWN0ZWQgZnJvbSBhIEwzIG1lYXN1cmVtZW50IHJlcG9ydCBJRSAqLworc3RydWN0IGdzbV9tZWFzX3JlcF9jZWxsIHsKKwl1X2ludDhfdCByeGxldjsKKwl1X2ludDhfdCBic2ljOworCXVfaW50OF90IG5laWdoX2lkeDsKKwl1X2ludDE2X3QgYXJmY247CisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworLyogUlggTGV2ZWwgYW5kIFJYIFF1YWxpdHkgKi8KK3N0cnVjdCBnc21fcnhfbGV2X3F1YWwgeworCXVfaW50OF90IHJ4X2xldjsKKwl1X2ludDhfdCByeF9xdWFsOworfTsKKworLyogdW5pZGlyZWN0aW9uYWwgbWVhc3VtcmVtZW50IHJlcG9ydCAqLworc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgeworCXN0cnVjdCBnc21fcnhfbGV2X3F1YWwgZnVsbDsKKwlzdHJ1Y3QgZ3NtX3J4X2xldl9xdWFsIHN1YjsKK307CisKKyNkZWZpbmUgTUVBU19SRVBfRl9VTF9EVFgJMHgwMQorI2RlZmluZSBNRUFTX1JFUF9GX0RMX1ZBTElECTB4MDIKKyNkZWZpbmUgTUVBU19SRVBfRl9CQTEJCTB4MDQKKyNkZWZpbmUgTUVBU19SRVBfRl9ETF9EVFgJMHgwOAorI2RlZmluZSBNRUFTX1JFUF9GX01TX1RPCTB4MTAKKyNkZWZpbmUgTUVBU19SRVBfRl9NU19MMQkweDIwCisjZGVmaW5lIE1FQVNfUkVQX0ZfRlBDCQkweDQwCisKKy8qIHBhcnNlZCB1cGxpbmsgYW5kIGRvd25saW5rIG1lYXN1cmVtZW50IHJlc3VsdCAqLworc3RydWN0IGdzbV9tZWFzX3JlcCB7CisJLyogYmFjay1wb2ludGVyIHRvIHRoZSBsb2dpY2FsIGNoYW5uZWwgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCS8qIG51bWJlciBvZiB0aGUgbWVhc3VyZW1lbnQgcmVwb3J0ICovCisJdV9pbnQ4X3QgbnI7CisJLyogZmxhZ3MsIHNlZSBNRUFTX1JFUF9GXyogKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwkvKiB1cGxpbmsgYW5kIGRvd25saW5rIHJ4bGV2LCByeHF1YWw7IGZ1bGwgYW5kIHN1YiAqLworCXN0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyIHVsOworCXN0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyIGRsOworCisJdV9pbnQ4X3QgYnNfcG93ZXI7CisJdV9pbnQ4X3QgbXNfdGltaW5nX29mZnNldDsKKwlzdHJ1Y3QgeworCQlpbnQ4X3QgcHdyOwkvKiBNUyBwb3dlciBpbiBkQm0gKi8KKwkJdV9pbnQ4X3QgdGE7CS8qIE1TIHRpbWluZyBhZHZhbmNlICovCisJfSBtc19sMTsKKworCS8qIG5laWdoYm9yIG1lYXN1cmVtZW50IHJlcG9ydHMgZm9yIHVwIHRvIDYgY2VsbHMgKi8KKwlpbnQgbnVtX2NlbGw7CisJc3RydWN0IGdzbV9tZWFzX3JlcF9jZWxsIGNlbGxbNl07Cit9OworCitlbnVtIG1lYXNfcmVwX2ZpZWxkIHsKKwlNRUFTX1JFUF9ETF9SWExFVl9GVUxMLAorCU1FQVNfUkVQX0RMX1JYTEVWX1NVQiwKKwlNRUFTX1JFUF9ETF9SWFFVQUxfRlVMTCwKKwlNRUFTX1JFUF9ETF9SWFFVQUxfU1VCLAorCU1FQVNfUkVQX1VMX1JYTEVWX0ZVTEwsCisJTUVBU19SRVBfVUxfUlhMRVZfU1VCLAorCU1FQVNfUkVQX1VMX1JYUVVBTF9GVUxMLAorCU1FQVNfUkVQX1VMX1JYUVVBTF9TVUIsCit9OworCisvKiBvYnRhaW4gYW4gYXZlcmFnZSBvdmVyIHRoZSBsYXN0ICdudW0nIGZpZWxkcyBpbiB0aGUgbWVhcyByZXBzICovCitpbnQgZ2V0X21lYXNfcmVwX2F2Zyhjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJICAgICBlbnVtIG1lYXNfcmVwX2ZpZWxkIGZpZWxkLCB1bnNpZ25lZCBpbnQgbnVtKTsKKworLyogQ2hlY2sgaWYgTiBvdXQgb2YgTSBsYXN0IHZhbHVlcyBmb3IgRklFTEQgYXJlID49IGJkICovCitpbnQgbWVhc19yZXBfbl9vdXRfb2ZfbV9iZShjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJCWVudW0gbWVhc19yZXBfZmllbGQgZmllbGQsCisJCQl1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IG0sIGludCBiZSk7CisKK3Vuc2lnbmVkIGludCBjYWxjX2luaXRpYWxfaWR4KHVuc2lnbmVkIGludCBhcnJheV9zaXplLAorCQkJICAgICAgdW5zaWduZWQgaW50IG1lYXNfcmVwX2lkeCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBudW1fdmFsdWVzKTsKKworI2VuZGlmIC8qIF9NRUFTX1JFUF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiN2ZjMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3AuaApAQCAtMCwwICsxLDEzNSBAQAorLyogQSBNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wgTWVkaWEgR2F0ZXdheTogUkZDIDM0MzUgKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgT1BFTkJTQ19NR0NQX0gKKyNkZWZpbmUgT1BFTkJTQ19NR0NQX0gKKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjZGVmaW5lIFJUUF9QT1JUX0RFRkFVTFQgNDAwMAorCisvKioKKyAqIENhbGN1bGF0ZSB0aGUgUlRQIGF1ZGlvIHBvcnQgZm9yIHRoZSBnaXZlbiBtdWx0aXBsZXgKKyAqIGFuZCB0aGUgZGlyZWN0aW9uLiBUaGlzIGFsbG93cyBhIHNlbWkgc3RhdGljIGVuZHBvaW50CisgKiB0byBwb3J0IGNhbGN1bGF0aW9uIHJlbW92aW5nIHRoZSBuZWVkIGZvciB0aGUgQlNDCisgKiBhbmQgdGhlIE1lZGlhR2F0ZXdheSB0byBjb21tdW5pY2F0ZS4KKyAqCisgKiBQb3J0IHVzYWdlIGV4cGxhaW5lZDoKKyAqICAgICAgIGJhc2UgKyAobXVsdGlwbGV4ICogMikgKyAwID09IGxvY2FsIHBvcnQgdG8gd2FpdCBmb3IgbmV0d29yayBwYWNrZXRzCisgKiAgICAgICBiYXNlICsgKG11bHRpcGxleCAqIDIpICsgMSA9PSBsb2NhbCBwb3J0IGZvciBydGNwCisgKgorICogVGhlIGFib3ZlIHBvcnQgd2lsbCByZWNlaXZlIHBhY2tldHMgZnJvbSB0aGUgQlRTIHRoYXQgbmVlZAorICogdG8gYmUgcGF0Y2hlZCBhbmQgZm9yd2FyZGVkIHRvIHRoZSBuZXR3b3JrLgorICogVGhlIGFib3ZlIHBvcnQgd2lsbCByZWNlaXZlIHBhY2tldHMgZnJvbSB0aGUgbmV0d29yayB0aGF0CisgKiBuZWVkIHRvIGJlIHBhdGNoZWQgYW5kIGZvcndhcmRlZCB0byB0aGUgQlRTLgorICoKKyAqIFdlIGFzc3VtZSB0byBoYXZlIGEgc3RhdGljIEJUUyBJUCBhZGRyZXNzIHNvIHdlIGNhbiBkaWZmZXJlbnRpYXRlCisgKiBuZXR3b3JrIGFuZCBCVFMuCisgKgorICovCitzdGF0aWMgaW5saW5lIGludCBydHBfY2FsY3VsYXRlX3BvcnQoaW50IG11bHRpcGxleCwgaW50IGJhc2UpCit7CisJcmV0dXJuIGJhc2UgKyAobXVsdGlwbGV4ICogMik7Cit9CisKKworLyoKKyAqIEhhbmRsaW5nIG9mIE1HQ1AgRW5kcG9pbnRzIGFuZCB0aGUgTUdDUCBDb25maWcKKyAqLworc3RydWN0IG1nY3BfZW5kcG9pbnQ7CitzdHJ1Y3QgbWdjcF9jb25maWc7CisKKyNkZWZpbmUgTUdDUF9FTkRQX0NSQ1ggMQorI2RlZmluZSBNR0NQX0VORFBfRExDWCAyCisjZGVmaW5lIE1HQ1BfRU5EUF9NRENYIDMKKworLyoKKyAqIHdoYXQgdG8gZG8gd2l0aCB0aGUgbXNnPworICoJLSBjb250aW51ZSBhcyB1c3VhbD8KKyAqCS0gcmVqZWN0IGFuZCBzZW5kIGEgZmFpbHVyZSBjb2RlPworICoJLSBkZWZlcj8gZG8gbm90IHNlbmQgYW55dGhpbmcKKyAqLworI2RlZmluZSBNR0NQX1BPTElDWV9DT05UCTQKKyNkZWZpbmUgTUdDUF9QT0xJQ1lfUkVKRUNUCTUKKyNkZWZpbmUgTUdDUF9QT0xJQ1lfREVGRVIJNgorCit0eXBlZGVmIGludCAoKm1nY3BfY2hhbmdlKShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgaW50IGVuZHBvaW50LCBpbnQgc3RhdGUsIGludCBsb2NhbF9ydHApOwordHlwZWRlZiBpbnQgKCptZ2NwX3BvbGljeSkoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIGludCBlbmRwb2ludCwgaW50IHN0YXRlLCBjb25zdCBjaGFyICp0cmFuc2FjdGlvX2lkKTsKK3R5cGVkZWYgaW50ICgqbWdjcF9yZXNldCkoc3RydWN0IG1nY3BfY29uZmlnICpjZmcpOworCitzdHJ1Y3QgbWdjcF9jb25maWcgeworCWludCBzb3VyY2VfcG9ydDsKKwljaGFyICpsb2NhbF9pcDsKKwljaGFyICpzb3VyY2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbnVtYmVyX2VuZHBvaW50czsKKwljaGFyICpidHNfaXA7CisJY2hhciAqY2FsbF9hZ2VudF9hZGRyOworCisJc3RydWN0IGluX2FkZHIgYnRzX2luOworCWNoYXIgKmF1ZGlvX25hbWU7CisJaW50IGF1ZGlvX3BheWxvYWQ7CisJaW50IGF1ZGlvX2xvb3A7CisJaW50IGVhcmx5X2JpbmQ7CisJaW50IHJ0cF9iYXNlX3BvcnQ7CisKKwljaGFyICpmb3J3YXJkX2lwOworCWludCBmb3J3YXJkX3BvcnQ7CisKKwkvKiBzcGVjIGhhbmRsaW5nICovCisJaW50IGZvcmNlX3JlYWxsb2M7CisKKwltZ2NwX2NoYW5nZSBjaGFuZ2VfY2I7CisJbWdjcF9wb2xpY3kgcG9saWN5X2NiOworCW1nY3BfcmVzZXQgcmVzZXRfY2I7CisJdm9pZCAqZGF0YTsKKworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwb2ludHM7CisJdW5zaWduZWQgaW50IGxhc3RfY2FsbF9pZDsKK307CisKKy8qIGNvbmZpZyBtYW5hZ2VtZW50ICovCitzdHJ1Y3QgbWdjcF9jb25maWcgKm1nY3BfY29uZmlnX2FsbG9jKHZvaWQpOworaW50IG1nY3BfcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyk7CitpbnQgbWdjcF92dHlfaW5pdCh2b2lkKTsKK2ludCBtZ2NwX2VuZHBvaW50c19hbGxvY2F0ZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyk7CitpbnQgbWdjcF9iaW5kX3J0cF9wb3J0KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLCBpbnQgcnRwX3BvcnQpOwordm9pZCBtZ2NwX2ZyZWVfZW5kcChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCk7CisKKy8qCisgKiBmb3JtYXQgaGVscGVyIGZ1bmN0aW9ucworICovCitzdHJ1Y3QgbXNnYiAqbWdjcF9oYW5kbGVfbWVzc2FnZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdHJ1Y3QgbXNnYiAqbWdjcF9jcmVhdGVfcmVzcG9uc2Vfd2l0aF9kYXRhKGludCBjb2RlLCBjb25zdCBjaGFyICptc2csIGNvbnN0IGNoYXIgKnRyYW5zLCBjb25zdCBjaGFyICpkYXRhKTsKKworLyogYWRjIGhlbHBlciAqLworc3RhdGljIGlubGluZSBpbnQgbWdjcF90aW1lc2xvdF90b19lbmRwb2ludChpbnQgbXVsdGlwbGV4LCBpbnQgdGltZXNsb3QpCit7CisJaWYgKHRpbWVzbG90ID09IDApCisJCXRpbWVzbG90ID0gMTsKKwlyZXR1cm4gdGltZXNsb3QgKyAoMzEgKiBtdWx0aXBsZXgpOworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcF9pbnRlcm5hbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcF9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YWVjMzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwX2ludGVybmFsLmgKQEAgLTAsMCArMSw3OCBAQAorLyogTUdDUCBQcml2YXRlIERhdGEgKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgT1BFTkJTQ19NR0NQX0RBVEFfSAorI2RlZmluZSBPUEVOQlNDX01HQ1BfREFUQV9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2RlZmluZSBDSV9VTlVTRUQgMAorCitzdHJ1Y3QgbWdjcF9lbmRwb2ludCB7CisJaW50IGNpOworCWNoYXIgKmNhbGxpZDsKKwljaGFyICpsb2NhbF9vcHRpb25zOworCWludCBjb25uX21vZGU7CisKKwlpbnQgYnRzX3BheWxvYWRfdHlwZTsKKwlpbnQgbmV0X3BheWxvYWRfdHlwZTsKKworCS8qIHRoZSBsb2NhbCBydHAgcG9ydCB3ZSBhcmUgYmluZGluZyB0byAqLworCWludCBydHBfcG9ydDsKKworCS8qCisJICogUlRQIG1hbmdsaW5nOgorCSAqICAtIHdlIGdldCBSVFAgYW5kIFJUQ1AgdG8gdXMgYW5kIG5lZWQgdG8gZm9yd2FyZCB0byB0aGUgQlRTCisJICogIC0gd2UgZ2V0IFJUUCBhbmQgUlRDUCBmcm9tIHRoZSBCVFMgYW5kIGZvcndhcmQgdG8gdGhlIG5ldHdvcmsKKwkgKi8KKwlzdHJ1Y3QgYnNjX2ZkIGxvY2FsX3J0cDsKKwlzdHJ1Y3QgYnNjX2ZkIGxvY2FsX3J0Y3A7CisKKwlzdHJ1Y3QgaW5fYWRkciByZW1vdGU7CisJc3RydWN0IGluX2FkZHIgYnRzOworCisJLyogaW4gbmV0d29yayBieXRlIG9yZGVyICovCisJaW50IG5ldF9ydHAsIG5ldF9ydGNwOworCWludCBidHNfcnRwLCBidHNfcnRjcDsKKworCS8qIGJhY2twb2ludGVyICovCisJc3RydWN0IG1nY3BfY29uZmlnICpjZmc7CisKKwkvKiBzdGF0aXN0aWNzICovCisJdW5zaWduZWQgaW50IGluX2J0czsKKwl1bnNpZ25lZCBpbnQgaW5fcmVtb3RlOworfTsKKworI2RlZmluZSBFTkRQT0lOVF9OVU1CRVIoZW5kcCkgYWJzKGVuZHAgLSBlbmRwLT5jZmctPmVuZHBvaW50cykKKworc3RydWN0IG1nY3BfbXNnX3B0ciB7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBsZW5ndGg7Cit9OworCitpbnQgbWdjcF9hbmFseXplX2hlYWRlcihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZywKKwkJCXN0cnVjdCBtZ2NwX21zZ19wdHIgKnB0ciwgaW50IHNpemUsCisJCQljb25zdCBjaGFyICoqdHJhbnNhY3Rpb25faWQsIHN0cnVjdCBtZ2NwX2VuZHBvaW50ICoqZW5kcCk7CitpbnQgbWdjcF9zZW5kX2R1bW15KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9taXNkbi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWlzZG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzM4ZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWlzZG4uaApAQCAtMCwwICsxLDI5IEBACisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgTUlTRE5fSAorI2RlZmluZSBNSVNETl9ICisKKyNpbmNsdWRlICJlMV9pbnB1dC5oIgorCitpbnQgbWlfc2V0dXAoaW50IGNhcmRuciwgIHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBpbnQgcmVsZWFzZV9sMik7CitpbnQgX2FiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCBtaV9lMV9saW5lX3VwZGF0ZShzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbW5jYy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbW5jYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiODMzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tbmNjLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9NTkNDX0gKKyNkZWZpbmUgX01OQ0NfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbW5jYy5oPgorCisvKiBPbmUgZW5kIG9mIGEgY2FsbCAqLworc3RydWN0IGdzbV9jYWxsIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKworCS8qIG5ldHdvcmsgaGFuZGxlICovCisJdm9pZCAqbmV0OworCisJLyogdGhlICdsb2NhbCcgdHJhbnNhY3Rpb24gKi8KKwl1X2ludDMyX3QgY2FsbHJlZjsKKwkvKiB0aGUgJ3JlbW90ZScgdHJhbnNhY3Rpb24gKi8KKwl1X2ludDMyX3QgcmVtb3RlX3JlZjsKK307CisKKyNkZWZpbmUgTU5DQ19TRVRVUF9SRVEJCTB4MDEwMQorI2RlZmluZSBNTkNDX1NFVFVQX0lORAkJMHgwMTAyCisjZGVmaW5lIE1OQ0NfU0VUVVBfUlNQCQkweDAxMDMKKyNkZWZpbmUgTU5DQ19TRVRVUF9DTkYJCTB4MDEwNAorI2RlZmluZSBNTkNDX1NFVFVQX0NPTVBMX1JFUQkweDAxMDUKKyNkZWZpbmUgTU5DQ19TRVRVUF9DT01QTF9JTkQJMHgwMTA2CisvKiBNTkNDX1JFSl8qIGlzIHBlcmZvbWVkIHZpYSBNTkNDX1JFTF8qICovCisjZGVmaW5lIE1OQ0NfQ0FMTF9DT05GX0lORAkweDAxMDcKKyNkZWZpbmUgTU5DQ19DQUxMX1BST0NfUkVRCTB4MDEwOAorI2RlZmluZSBNTkNDX1BST0dSRVNTX1JFUQkweDAxMDkKKyNkZWZpbmUgTU5DQ19BTEVSVF9SRVEJCTB4MDEwYQorI2RlZmluZSBNTkNDX0FMRVJUX0lORAkJMHgwMTBiCisjZGVmaW5lIE1OQ0NfTk9USUZZX1JFUQkJMHgwMTBjCisjZGVmaW5lIE1OQ0NfTk9USUZZX0lORAkJMHgwMTBkCisjZGVmaW5lIE1OQ0NfRElTQ19SRVEJCTB4MDEwZQorI2RlZmluZSBNTkNDX0RJU0NfSU5ECQkweDAxMGYKKyNkZWZpbmUgTU5DQ19SRUxfUkVRCQkweDAxMTAKKyNkZWZpbmUgTU5DQ19SRUxfSU5ECQkweDAxMTEKKyNkZWZpbmUgTU5DQ19SRUxfQ05GCQkweDAxMTIKKyNkZWZpbmUgTU5DQ19GQUNJTElUWV9SRVEJMHgwMTEzCisjZGVmaW5lIE1OQ0NfRkFDSUxJVFlfSU5ECTB4MDExNAorI2RlZmluZSBNTkNDX1NUQVJUX0RUTUZfSU5ECTB4MDExNQorI2RlZmluZSBNTkNDX1NUQVJUX0RUTUZfUlNQCTB4MDExNgorI2RlZmluZSBNTkNDX1NUQVJUX0RUTUZfUkVKCTB4MDExNworI2RlZmluZSBNTkNDX1NUT1BfRFRNRl9JTkQJMHgwMTE4CisjZGVmaW5lIE1OQ0NfU1RPUF9EVE1GX1JTUAkweDAxMTkKKyNkZWZpbmUgTU5DQ19NT0RJRllfUkVRCQkweDAxMWEKKyNkZWZpbmUgTU5DQ19NT0RJRllfSU5ECQkweDAxMWIKKyNkZWZpbmUgTU5DQ19NT0RJRllfUlNQCQkweDAxMWMKKyNkZWZpbmUgTU5DQ19NT0RJRllfQ05GCQkweDAxMWQKKyNkZWZpbmUgTU5DQ19NT0RJRllfUkVKCQkweDAxMWUKKyNkZWZpbmUgTU5DQ19IT0xEX0lORAkJMHgwMTFmCisjZGVmaW5lIE1OQ0NfSE9MRF9DTkYJCTB4MDEyMAorI2RlZmluZSBNTkNDX0hPTERfUkVKCQkweDAxMjEKKyNkZWZpbmUgTU5DQ19SRVRSSUVWRV9JTkQJMHgwMTIyCisjZGVmaW5lIE1OQ0NfUkVUUklFVkVfQ05GCTB4MDEyMworI2RlZmluZSBNTkNDX1JFVFJJRVZFX1JFSgkweDAxMjQKKyNkZWZpbmUgTU5DQ19VU0VSSU5GT19SRVEJMHgwMTI1CisjZGVmaW5lIE1OQ0NfVVNFUklORk9fSU5ECTB4MDEyNgorI2RlZmluZSBNTkNDX1JFSl9SRVEJCTB4MDEyNworI2RlZmluZSBNTkNDX1JFSl9JTkQJCTB4MDEyOAorCisjZGVmaW5lIE1OQ0NfQlJJREdFCQkweDAyMDAKKyNkZWZpbmUgTU5DQ19GUkFNRV9SRUNWCQkweDAyMDEKKyNkZWZpbmUgTU5DQ19GUkFNRV9EUk9QCQkweDAyMDIKKyNkZWZpbmUgTU5DQ19MQ0hBTl9NT0RJRlkJMHgwMjAzCisKKyNkZWZpbmUgR1NNX1RDSEZfRlJBTUUJCTB4MDMwMAorI2RlZmluZSBHU01fVENIRl9GUkFNRV9FRlIJMHgwMzAxCisKKyNkZWZpbmUgR1NNX01BWF9GQUNJTElUWQkxMjgKKyNkZWZpbmUgR1NNX01BWF9TU1ZFUlNJT04JMTI4CisjZGVmaW5lIEdTTV9NQVhfVVNFUlVTRVIJMTI4CisKKyNkZWZpbmUJTU5DQ19GX0JFQVJFUl9DQVAJMHgwMDAxCisjZGVmaW5lIE1OQ0NfRl9DQUxMRUQJCTB4MDAwMgorI2RlZmluZSBNTkNDX0ZfQ0FMTElORwkJMHgwMDA0CisjZGVmaW5lIE1OQ0NfRl9SRURJUkVDVElORwkweDAwMDgKKyNkZWZpbmUgTU5DQ19GX0NPTk5FQ1RFRAkweDAwMTAKKyNkZWZpbmUgTU5DQ19GX0NBVVNFCQkweDAwMjAKKyNkZWZpbmUgTU5DQ19GX1VTRVJVU0VSCQkweDAwNDAKKyNkZWZpbmUgTU5DQ19GX1BST0dSRVNTCQkweDAwODAKKyNkZWZpbmUgTU5DQ19GX0VNRVJHRU5DWQkweDAxMDAKKyNkZWZpbmUgTU5DQ19GX0ZBQ0lMSVRZCQkweDAyMDAKKyNkZWZpbmUgTU5DQ19GX1NTVkVSU0lPTgkweDA0MDAKKyNkZWZpbmUgTU5DQ19GX0NDQ0FQCQkweDA4MDAKKyNkZWZpbmUgTU5DQ19GX0tFWVBBRAkJMHgxMDAwCisjZGVmaW5lIE1OQ0NfRl9TSUdOQUwJCTB4MjAwMAorCitzdHJ1Y3QgZ3NtX21uY2MgeworCS8qIGNvbnRleHQgYmFzZWQgaW5mb3JtYXRpb24gKi8KKwl1X2ludDMyX3QJbXNnX3R5cGU7CisJdV9pbnQzMl90CWNhbGxyZWY7CisKKwkvKiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgKi8KKwl1X2ludDMyX3QJZmllbGRzOworCisJLyogZGF0YSBkZXJpdmVkIGluZm9ybWF0aW9ucyAoTU5DQ19GXyBiYXNlZCkgKi8KKwlzdHJ1Y3QgZ3NtX21uY2NfYmVhcmVyX2NhcAliZWFyZXJfY2FwOworCXN0cnVjdCBnc21fbW5jY19udW1iZXIJCWNhbGxlZDsKKwlzdHJ1Y3QgZ3NtX21uY2NfbnVtYmVyCQljYWxsaW5nOworCXN0cnVjdCBnc21fbW5jY19udW1iZXIJCXJlZGlyZWN0aW5nOworCXN0cnVjdCBnc21fbW5jY19udW1iZXIJCWNvbm5lY3RlZDsKKwlzdHJ1Y3QgZ3NtX21uY2NfY2F1c2UJCWNhdXNlOworCXN0cnVjdCBnc21fbW5jY19wcm9ncmVzcwlwcm9ncmVzczsKKwlzdHJ1Y3QgZ3NtX21uY2NfdXNlcnVzZXIJdXNlcnVzZXI7CisJc3RydWN0IGdzbV9tbmNjX2ZhY2lsaXR5CWZhY2lsaXR5OworCXN0cnVjdCBnc21fbW5jY19jY2NhcAkJY2NjYXA7CisJc3RydWN0IGdzbV9tbmNjX3NzdmVyc2lvbglzc3ZlcnNpb247CisJc3RydWN0CXsKKwkJaW50CQlzdXA7CisJCWludAkJaW52OworCX0gY2xpcjsKKwlpbnQJCXNpZ25hbDsKKworCS8qIGRhdGEgZGVyaXZlZCBpbmZvcm1hdGlvbiwgbm90IE1OQ0NfRiBiYXNlZCAqLworCWludAkJa2V5cGFkOworCWludAkJbW9yZTsKKwlpbnQJCW5vdGlmeTsgLyogMC4uMTI3ICovCisJaW50CQllbWVyZ2VuY3k7CisJY2hhcgkJaW1zaVsxNl07CisKKwl1bnNpZ25lZCBjaGFyCWxjaGFuX21vZGU7Cit9OworCitzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgeworCXVfaW50MzJfdAltc2dfdHlwZTsKKwl1X2ludDMyX3QJY2FsbHJlZjsKKwl1bnNpZ25lZCBjaGFyCWRhdGFbMF07Cit9OworCitjaGFyICpnZXRfbW5jY19uYW1lKGludCB2YWx1ZSk7CitpbnQgbW5jY19yZWN2KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbXNnX3R5cGUsIHZvaWQgKmFyZyk7Cit2b2lkIG1uY2Nfc2V0X2NhdXNlKHN0cnVjdCBnc21fbW5jYyAqZGF0YSwgaW50IGxvYywgaW50IHZhbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvb3BlbmJzY2RlZmluZXMuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL29wZW5ic2NkZWZpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyZTU5MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL29wZW5ic2NkZWZpbmVzLmgKQEAgLTAsMCArMSwzNSBAQAorLyogCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgT1BFTkJTQ0RFRklORVNfSAorI2RlZmluZSBPUEVOQlNDREVGSU5FU19ICisKKyNpZmRlZiBCVUlMRElOR19PTl9XSU5ET1dTCisgICAgI2lmZGVmIEJVSUxESU5HX09QRU5CU0MKKyAgICAgICAgI2RlZmluZSBCU0NfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorICAgICNlbHNlCisgICAgICAgICNkZWZpbmUgQlNDX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyAgICAjZW5kaWYKKyNlbHNlCisgICAgI2RlZmluZSBCU0NfQVBJIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9wYWdpbmcuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3BhZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmRjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9wYWdpbmcuaApAQCAtMCwwICsxLDQ2IEBACisvKiBQYWdpbmcgaGVscGVyIGFuZCBtYW5hZ2VyLi4uLiAqLworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgUEFHSU5HX0gKKyNkZWZpbmUgUEFHSU5HX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSAiZ3NtX2RhdGEuaCIKKyNpbmNsdWRlICJnc21fc3Vic2NyaWJlci5oIgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisKKy8qIGNhbGwgb25jZSBmb3IgZXZlcnkgZ3NtX2J0cy4uLiAqLwordm9pZCBwYWdpbmdfaW5pdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworLyogc2NoZWR1bGUgcGFnaW5nIHJlcXVlc3QgKi8KK2ludCBwYWdpbmdfcmVxdWVzdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcmssIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkgICBpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpOworCisvKiBzdG9wIHBhZ2luZyByZXF1ZXN0cyAqLwordm9pZCBwYWdpbmdfcmVxdWVzdF9zdG9wKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworLyogdXBkYXRlIHBhZ2luZyBsb2FkICovCit2b2lkIHBhZ2luZ191cGRhdGVfYnVmZmVyX3NwYWNlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50MTZfdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcmVzdF9vY3RldHMuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Jlc3Rfb2N0ZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5MDExOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Jlc3Rfb2N0ZXRzLmgKQEAgLTAsMCArMSwxMzMgQEAKKyNpZm5kZWYgX1JFU1RfT0NURVRTX0gKKyNkZWZpbmUgX1JFU1RfT0NURVRTX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisKKy8qIGdlbmVyYXRlIFNJMSByZXN0IG9jdGV0cyAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMSh1X2ludDhfdCAqZGF0YSwgdV9pbnQ4X3QgKm5jaF9wb3MpOworCitzdHJ1Y3QgZ3NtNDhfc2lfc2VsZWN0aW9uX3BhcmFtcyB7CisJdV9pbnQxNl90IHBlbmFsdHlfdGltZTo1LAorCQkgIHRlbXBfb2ZmczozLAorCQkgIGNlbGxfcmVzZWxfb2ZmOjYsCisJCSAgY2JxOjEsCisJCSAgcHJlc2VudDoxOworfTsKKworc3RydWN0IGdzbTQ4X3NpX3Bvd2VyX29mZnNldCB7CisJdV9pbnQ4X3QgcG93ZXJfb2Zmc2V0OjIsCisJCSBwcmVzZW50OjE7Cit9OworCitzdHJ1Y3QgZ3NtNDhfc2kzX2dwcnNfaW5kIHsKKwl1X2ludDhfdCBzaTEzX3Bvc2l0aW9uOjEsCisJCSByYV9jb2xvdXI6MywKKwkJIHByZXNlbnQ6MTsKK307CisKK3N0cnVjdCBnc200OF9sc2FfcGFyYW1zIHsKKwl1X2ludDMyX3QgcHJpb190aHI6MywKKwkJIGxzYV9vZmZzZXQ6MywKKwkJIG1jYzoxMiwKKwkJIG1uYzoxMjsKKwl1bnNpZ25lZCBpbnQgcHJlc2VudDsKK307CisKK3N0cnVjdCBnc200OF9zaV9yb19pbmZvIHsKKwlzdHJ1Y3QgZ3NtNDhfc2lfc2VsZWN0aW9uX3BhcmFtcyBzZWxlY3Rpb25fcGFyYW1zOworCXN0cnVjdCBnc200OF9zaV9wb3dlcl9vZmZzZXQgcG93ZXJfb2Zmc2V0OworCXVfaW50OF90IHNpMnRlcl9pbmRpY2F0b3I7CisJdV9pbnQ4X3QgZWFybHlfY21fY3RybDsKKwlzdHJ1Y3QgeworCQl1X2ludDhfdCB3aGVyZTozLAorCQkJIHByZXNlbnQ6MTsKKwl9IHNjaGVkdWxpbmc7CisJc3RydWN0IGdzbTQ4X3NpM19ncHJzX2luZCBncHJzX2luZDsKKworCS8qIFNJIDQgc3BlY2lmaWMgKi8KKwlzdHJ1Y3QgZ3NtNDhfbHNhX3BhcmFtcyBsc2FfcGFyYW1zOworCXVfaW50MTZfdCBjZWxsX2lkOworCXVfaW50OF90IGJyZWFrX2luZDsJLyogZG8gd2UgaGF2ZSBTSTcgKyBTSTggPyAqLworfTsKKworCisvKiBHZW5lcmF0ZSBTSTMgUmVzdCBPY3Rlc3RzIChDaGFwdGVyIDEwLjUuMi4zNCAvIFRhYmxlIDEwLjQuNzIpICovCitpbnQgcmVzdF9vY3RldHNfc2kzKHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyAqc2kzKTsKKworLyogR2VuZXJhdGUgU0k0IFJlc3QgT2N0ZXRzIChDaGFwdGVyIDEwLjUuMi4zNSkgKi8KK2ludCByZXN0X29jdGV0c19zaTQodV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaV9yb19pbmZvICpzaTQpOworCitlbnVtIHBiY2NoX2NhcnJpZXJfdHlwZSB7CisJUEJDQ0hfQkNDSCwKKwlQQkNDSF9BUkZDTiwKKwlQQkNDSF9NQUlPCit9OworCisvKiBUUyAwMy42MCBDaGFwdGVyIDYuMy4zLjE6IE5ldHdvcmsgTW9kZSBvZiBPcGVyYXRpb24gKi8KK2VudW0gZ3Byc19ubW8geworCUdQUlNfTk1PX0kJPSAwLAkvKiBDUyBwYWdpbiBvbiBHUFJTIHBhZ2luZyBvciB0cmFmZmljIGNoYW5uZWwgKi8KKwlHUFJTX05NT19JSQk9IDEsCS8qIGFsbCBwYWdpbmcgb24gQ0NDSCAqLworCUdQUlNfTk1PX0lJSQk9IDIsCS8qIG5vIHBhZ2luZyBjb29yZGluYXRpb24gKi8KK307CisKKy8qIFRTIDA0LjYwIDEyLjI0ICovCitzdHJ1Y3QgZ3Byc19jZWxsX29wdGlvbnMgeworCWVudW0gZ3Byc19ubW8gbm1vOworCS8qIFQzMTY4OiB3YWl0IGZvciBwYWNrZXQgdXBsaW5rIGFzc2lnbm1lbnQgbWVzc2FnZSAqLworCXVfaW50MzJfdCB0MzE2ODsJLyogaW4gbWlsbGlzZWNvbmRzICovCisJLyogVDMxOTI6IHdhaXQgZm9yIHJlbGVhc2Ugb2YgdGhlIFRCRiBhZnRlciByZWNlcHRpb24gb2YgdGhlIGZpbmFsIGJsb2NrICovCisJdV9pbnQzMl90IHQzMTkyOwkvKiBpbiBtaWxsaXNlY29uZHMgKi8KKwl1X2ludDMyX3QgZHJ4X3RpbWVyX21heDsvKiBpbiBzZWNvbmRzICovCisJdV9pbnQzMl90IGJzX2N2X21heDsKKworCXVfaW50OF90IGV4dF9pbmZvX3ByZXNlbnQ7CisJc3RydWN0IHsKKwkJdV9pbnQ4X3QgZWdwcnNfc3VwcG9ydGVkOworCQkJdV9pbnQ4X3QgdXNlX2VncHJzX3BfY2hfcmVxOworCQkJdV9pbnQ4X3QgYmVwX3BlcmlvZDsKKwkJdV9pbnQ4X3QgcGZjX3N1cHBvcnRlZDsKKwkJdV9pbnQ4X3QgZHRtX3N1cHBvcnRlZDsKKwkJdV9pbnQ4X3QgYnNzX3BhZ2luZ19jb29yZGluYXRpb247CisJfSBleHRfaW5mbzsKK307CisKKy8qIFRTIDA0LjYwIFRhYmxlIDEyLjkuMiAqLworc3RydWN0IGdwcnNfcG93ZXJfY3RybF9wYXJzIHsKKwl1X2ludDhfdCBhbHBoYTsKKwl1X2ludDhfdCB0X2F2Z193OworCXVfaW50OF90IHRfYXZnX3Q7CisJdV9pbnQ4X3QgcGNfbWVhc19jaGFuOworCXVfaW50OF90IG5fYXZnX2k7Cit9OworCitzdHJ1Y3QgZ3NtNDhfc2kxM19pbmZvIHsKKwlzdHJ1Y3QgZ3Byc19jZWxsX29wdGlvbnMgY2VsbF9vcHRzOworCXN0cnVjdCBncHJzX3Bvd2VyX2N0cmxfcGFycyBwd3JfY3RybF9wYXJzOworCXVfaW50OF90IGJjY2hfY2hhbmdlX21hcms7CisJdV9pbnQ4X3Qgc2lfY2hhbmdlX2ZpZWxkOworCXVfaW50OF90IHBiY2NoX3ByZXNlbnQ7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCByYWM7CisJCQl1X2ludDhfdCBzcGdjX2NjY2hfc3VwOworCQkJdV9pbnQ4X3QgbmV0X2N0cmxfb3JkOworCQkJdV9pbnQ4X3QgcHJpb19hY2NfdGhyOworCQl9IG5vX3BiY2NoOworCQlzdHJ1Y3QgeworCQkJdV9pbnQ4X3QgcHNpMV9yZXBfcGVyOworCQkJdV9pbnQ4X3QgcGI7CisJCQl1X2ludDhfdCB0c2M7CisJCQl1X2ludDhfdCB0bjsKKwkJCWVudW0gcGJjY2hfY2Fycmllcl90eXBlIGNhcnJpZXJfdHlwZTsKKwkJCXVfaW50MTZfdCBhcmZjbjsKKwkJCXVfaW50OF90IG1haW87CisJCX0gcGJjY2g7CisJfTsKK307CisKKy8qIEdlbmVyYXRlIFNJMTMgUmVzdCBPY3Rlc3RzIChDaGFwdGVyIDEwLjUuMi4zN2IpICovCitpbnQgcmVzdF9vY3RldHNfc2kxMyh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyAqc2kxMyk7CisKKyNlbmRpZiAvKiBfUkVTVF9PQ1RFVFNfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcnMyMzIuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3JzMjMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExODdjYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3JzMjMyLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9SUzIzMl9ICisjZGVmaW5lIF9SUzIzMl9ICisKK2ludCByczIzMl9zZXR1cChjb25zdCBjaGFyICpzZXJpYWxfcG9ydCwgdW5zaWduZWQgaW50IGRlbGF5X21zLAorCQlzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworaW50IGhhbmRsZV9zZXJpYWxfbXNnKHN0cnVjdCBtc2diICptc2cpOworCisjZW5kaWYgLyogX1JTMjMyX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3J0cF9wcm94eS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcnRwX3Byb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViMWE1ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3J0cF9wcm94eS5oCkBAIC0wLDAgKzEsOTEgQEAKKyNpZm5kZWYgX1JUUF9QUk9YWV9ICisjZGVmaW5lIF9SVFBfUFJPWFlfSAorCisvKiBSVFAgcHJveHkgaGFuZGxpbmcgZm9yIGlwLmFjY2VzcyBuYW5vQlRTICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisKKyNkZWZpbmUgUlRQX1BUX0dTTV9GVUxMIDMKKyNkZWZpbmUgUlRQX1BUX0dTTV9IQUxGIDk2CisjZGVmaW5lIFJUUF9QVF9HU01fRUZSIDk3CisjZGVmaW5lIFJUUF9QVF9BTVJfRlVMTCA5OAorI2RlZmluZSBSVFBfUFRfQU1SX0hBTEYgOTkKKworZW51bSBydHBfcnhfYWN0aW9uIHsKKwlSVFBfTk9ORSwKKwlSVFBfUFJPWFksCisJUlRQX1JFQ1ZfVVBTVFJFQU0sCit9OworCitlbnVtIHJ0cF90eF9hY3Rpb24geworCVJUUF9TRU5EX05PTkUsCisJUlRQX1NFTkRfRE9XTlNUUkVBTSwKK307CisKK3N0cnVjdCBydHBfc3ViX3NvY2tldCB7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbl9sb2NhbDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luX3JlbW90ZTsKKworCXN0cnVjdCBic2NfZmQgYmZkOworCS8qIGxpbmtlZCBsaXN0IG9mIHRvLWJlLXRyYW5zbWl0dGVkIG1zZ2IncyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X3F1ZXVlOworfTsKKworc3RydWN0IHJ0cF9zb2NrZXQgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgcnRwOworCXN0cnVjdCBydHBfc3ViX3NvY2tldCBydGNwOworCisJLyogd2hhdCBzaG91bGQgd2UgZG8gb24gcmVjZWl2ZT8gKi8KKwllbnVtIHJ0cF9yeF9hY3Rpb24gcnhfYWN0aW9uOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBydHBfc29ja2V0ICpvdGhlcl9zb2NrOworCQl9IHByb3h5OworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQ7CisJCQl1X2ludDMyX3QgY2FsbHJlZjsKKwkJfSByZWNlaXZlOworCX07CisJZW51bSBydHBfdHhfYWN0aW9uIHR4X2FjdGlvbjsKKwlzdHJ1Y3QgeworCQl1X2ludDE2X3Qgc2VxdWVuY2U7CisJCXVfaW50MzJfdCB0aW1lc3RhbXA7CisJCXVfaW50MzJfdCBzc3JjOworCQlzdHJ1Y3QgdGltZXZhbCBsYXN0X3R2OworCX0gdHJhbnNtaXQ7Cit9OworCitzdHJ1Y3QgcnRwX3NvY2tldCAqcnRwX3NvY2tldF9jcmVhdGUodm9pZCk7CitpbnQgcnRwX3NvY2tldF9iaW5kKHN0cnVjdCBydHBfc29ja2V0ICpycywgdV9pbnQzMl90IGlwKTsKK2ludCBydHBfc29ja2V0X2Nvbm5lY3Qoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0KTsKK2ludCBydHBfc29ja2V0X3Byb3h5KHN0cnVjdCBydHBfc29ja2V0ICp0aGlzLCBzdHJ1Y3QgcnRwX3NvY2tldCAqb3RoZXIpOworaW50IHJ0cF9zb2NrZXRfdXBzdHJlYW0oc3RydWN0IHJ0cF9zb2NrZXQgKnRoaXMsIHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1X2ludDMyX3QgY2FsbHJlZik7CitpbnQgcnRwX3NvY2tldF9mcmVlKHN0cnVjdCBydHBfc29ja2V0ICpycyk7CitpbnQgcnRwX3NlbmRfZnJhbWUoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCBzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKmZyYW1lKTsKKworI2VuZGlmIC8qIF9SVFBfUFJPWFlfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2dzbi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2dzbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzUzYzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zZ3NuLmgKQEAgLTAsMCArMSwzMCBAQAorI2lmbmRlZiBfU0dTTl9ICisjZGVmaW5lIF9TR1NOX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisKK3N0cnVjdCBzZ3NuX2NvbmZpZyB7CisJLyogcGFyc2VkIGZyb20gY29uZmlnIGZpbGUgKi8KKwl1X2ludDMyX3QgbnNpcF9saXN0ZW5faXA7CisJdV9pbnQxNl90IG5zaXBfbGlzdGVuX3BvcnQ7CisKKwkvKiBtaXNjICovCisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpOworfTsKKworCisvKiBzZ3NuX3Z0eS5jICovCisKK2ludCBzZ3NuX3Z0eV9pbml0KHZvaWQpOworaW50IHNnc25fcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3Qgc2dzbl9jb25maWcgKmNmZyk7CisKKy8qIHNnc24uYyAqLworCisvKiBNYWluIGlucHV0IGZ1bmN0aW9uIGZvciBHYiBwcm94eSAqLworaW50IHNnc25fcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQxNl90IG5zX2J2Y2kpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpZ25hbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhmNzk0NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpZ25hbC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKiBHZW5lcmljIHNpZ25hbGxpbmcvbm90aWZpY2F0aW9uIGluZnJhc3RydWN0dXJlICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgT1BFTkJTQ19TSUdOQUxfSAorI2RlZmluZSBPUEVOQlNDX1NJR05BTF9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2lnbmFsLmg+CisKKy8qCisgKiBTaWduYWxsaW5nIHN1YnN5c3RlbXMKKyAqLworZW51bSBzaWduYWxfc3Vic3lzdGVtcyB7CisJU1NfUEFHSU5HLAorCVNTX1NNUywKKwlTU19BQklTSVAsCisJU1NfTk0sCisJU1NfTENIQU4sCisJU1NfU1VCU0NSLAorCVNTX1NDQUxMLAorCVNTX0dMT0JBTCwKKwlTU19DSEFMTE9DLAorCVNTX05TLAorfTsKKworLyogU1NfUEFHSU5HIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX3BhZ2luZyB7CisJU19QQUdJTkdfU1VDQ0VFREVELAorCVNfUEFHSU5HX0VYUElSRUQsCit9OworCisvKiBTU19TTVMgc2lnbmFscyAqLworZW51bSBzaWduYWxfc21zIHsKKwlTX1NNU19TVUJNSVRURUQsCS8qIEEgU01TIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdXMgKi8KKwlTX1NNU19ERUxJVkVSRUQsCS8qIEEgU01TIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQgdG8gYSBNUyAqLworCVNfU01TX1NNTUEsCQkvKiBBIE1TIHRlbGxzIHVzIGl0IGhhcyBtb3JlIHNwYWNlIGF2YWlsYWJsZSAqLworCVNfU01TX01FTV9FWENFRURFRCwJLyogQSBNUyB0ZWxscyB1cyBpdCBoYXMgbm8gbW9yZSBzcGFjZSBhdmFpbGFibGUgKi8KK307CisKKy8qIFNTX0FCSVNJUCBzaWduYWxzICovCitlbnVtIHNpZ25hbF9hYmlzaXAgeworCVNfQUJJU0lQX0NSQ1hfQUNLLAorCVNfQUJJU0lQX01EQ1hfQUNLLAorCVNfQUJJU0lQX0RMQ1hfSU5ELAorfTsKKworLyogU1NfTk0gc2lnbmFscyAqLworZW51bSBzaWduYWxfbm0geworCVNfTk1fU1dfQUNUSVZfUkVQLAkvKiBHU00gMTIuMjEgc29mdHdhcmUgYWN0aXZhdGVkIHJlcG9ydCAqLworCVNfTk1fRkFJTF9SRVAsCQkvKiBHU00gMTIuMjEgZmFpbHVyZSBldmVudCByZXBvcnQgKi8KKwlTX05NX05BQ0ssCQkvKiBHU00gMTIuMjEgdmFyaW91cyBOTV9NVF8qX05BQ0sgaGFwcGVuZWQgKi8KKwlTX05NX0lQQUNDX05BQ0ssCS8qIEdTTSAxMi4yMSBuYW5vQlRTIGV4dGVuc2lvbnMgTk1fTVRfSVBBQ0NfKl8qX05BQ0sgaGFwcGVuZWQgKi8KKwlTX05NX0lQQUNDX0FDSywJCS8qIEdTTSAxMi4yMSBuYW5vQlRTIGV4dGVuc2lvbnMgTk1fTVRfSVBBQ0NfKl8qX0FDSyBoYXBwZW5lZCAqLworCVNfTk1fSVBBQ0NfUkVTVEFSVF9BQ0ssIC8qIG5hbm9CVFMgaGFzIHNlbmQgYSByZXN0YXJ0IGFjayAqLworCVNfTk1fSVBBQ0NfUkVTVEFSVF9OQUNLLC8qIG5hbm9CVFMgaGFzIHNlbmQgYSByZXN0YXJ0IGFjayAqLworCVNfTk1fVEVTVF9SRVAsCQkvKiBHU00gMTIuMjEgVGVzdCBSZXBvcnQgKi8KK307CisKKy8qIFNTX0xDSEFOIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX2xjaGFuIHsKKwkvKgorCSAqIFRoZSBsY2hhbiBnb3QgZnJlZWQgd2l0aCBhbiB1c2VfY291bnQgIT0gMCBhbmQgZXJyb3IKKwkgKiByZWNvdmVyeSBuZWVkcyB0byBiZSBjYXJyaWVkIG91dCBmcm9tIHdpdGhpbiB0aGUKKwkgKiBzaWduYWwgaGFuZGxlci4KKwkgKi8KKwlTX0xDSEFOX1VORVhQRUNURURfUkVMRUFTRSwKKwlTX0xDSEFOX0FDVElWQVRFX0FDSywJCS8qIDA4LjU4IENoYW5uZWwgQWN0aXZhdGUgQUNLICovCisJU19MQ0hBTl9BQ1RJVkFURV9OQUNLLAkJLyogMDguNTggQ2hhbm5lbCBBY3RpdmF0ZSBOQUNLICovCisJU19MQ0hBTl9IQU5ET1ZFUl9DT01QTCwJCS8qIDA0LjA4IEhhbmRvdmVyIENvbXBsZXRlZCAqLworCVNfTENIQU5fSEFORE9WRVJfRkFJTCwJCS8qIDA0LjA4IEhhbmRvdmVyIEZhaWxlZCAqLworCVNfTENIQU5fSEFORE9WRVJfREVURUNULAkvKiAwOC41OCBIYW5kb3ZlciBEZXRlY3QgKi8KKwlTX0xDSEFOX01FQVNfUkVQLAkJLyogMDguNTggTWVhc3VyZW1lbnQgUmVwb3J0ICovCit9OworCisvKiBTU19DSEFMTE9DIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX2NoYWxsb2MgeworCVNfQ0hBTExPQ19BTExPQ19GQUlMLAkvKiBhbGxvY2F0aW9uIG9mIGxjaGFuIGhhcyBmYWlsZWQgKi8KKwlTX0NIQUxMT0NfRlJFRUQsCS8qIGxjaGFuIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmcmVlZCAqLworfTsKKworLyogU1NfU1VCU0NSIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX3N1YnNjciB7CisJU19TVUJTQ1JfQVRUQUNIRUQsCisJU19TVUJTQ1JfREVUQUNIRUQsCisJU19TVUJTQ1JfSURFTlRJVFksCQkvKiB3ZSd2ZSByZWNlaXZlZCBzb21lIGlkZW50aXR5IGluZm9ybWF0aW9uICovCit9OworCisvKiBTU19TQ0FMTCBzaWduYWxzICovCitlbnVtIHNpZ25hbF9zY2FsbCB7CisJU19TQ0FMTF9TVUNDRVNTLAorCVNfU0NBTExfRVhQSVJFRCwKKwlTX1NDQUxMX0RFVEFDSEVELAorfTsKKworZW51bSBzaWduYWxfZ2xvYmFsIHsKKwlTX0dMT0JBTF9TSFVURE9XTiwKK307CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlcjsKKworc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSB7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCS8qIE5VTEwgaW4gY2FzZSB0aGUgcGFnaW5nIGRpZG4ndCB3b3JrICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47Cit9OworCitzdHJ1Y3Qgc2NhbGxfc2lnbmFsX2RhdGEgeworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXZvaWQgKmRhdGE7Cit9OworCitzdHJ1Y3QgaXBhY2NfYWNrX3NpZ25hbF9kYXRhIHsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwl1X2ludDhfdCBtc2dfdHlwZTsJCit9OworCitzdHJ1Y3QgY2hhbGxvY19zaWduYWxfZGF0YSB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwllbnVtIGdzbV9jaGFuX3QgdHlwZTsKK307CisKK2VudW0gc2lnbmFsX25zIHsKKwlTX05TX1JFU0VULAorCVNfTlNfQkxPQ0ssCisJU19OU19VTkJMT0NLLAorCVNfTlNfQUxJVkVfRVhQLAkvKiBUbnMtYWxpdmUgZXhwaXJlZCBtb3JlIHRoYW4gTiB0aW1lcyAqLworfTsKKworc3RydWN0IG5zX3NpZ25hbF9kYXRhIHsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCXVpbnQ4X3QgY2F1c2U7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpbGVudF9jYWxsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWxlbnRfY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmM1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWxlbnRfY2FsbC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX1NJTEVOVF9DQUxMX0gKKyNkZWZpbmUgX1NJTEVOVF9DQUxMX0gKKworZXh0ZXJuIGludCBnc21fc2lsZW50X2NhbGxfc3RhcnQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgdHlwZSk7CitleHRlcm4gaW50IGdzbV9zaWxlbnRfY2FsbF9zdG9wKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2V4dGVybiBpbnQgc2lsZW50X2NhbGxfcngoc3RydWN0IG1zZ2IgKm1zZyk7CitleHRlcm4gaW50IHNpbGVudF9jYWxsX3Jlcm91dGUoc3RydWN0IG1zZ2IgKm1zZyk7CisKKyNlbmRpZiAvKiBfU0lMRU5UX0NBTExfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3ViY2hhbl9kZW11eC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3ViY2hhbl9kZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZmEwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zdWJjaGFuX2RlbXV4LmgKQEAgLTAsMCArMSwxMDIgQEAKKyNpZm5kZWYgX1NVQkNIX0RFTVVYX0gKKyNkZWZpbmUgX1NVQkNIX0RFTVVYX0gKKy8qIEEgRTEgc3ViLWNoYW5uZWwgKGRlKW11bHRpcGxleGVyIHdpdGggVFJBVSBmcmFtZSBzeW5jICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorCisjZGVmaW5lIE5SX1NVQkNICTQKKyNkZWZpbmUgVFJBVV9GUkFNRV9TSVpFCTQwCisjZGVmaW5lIFRSQVVfRlJBTUVfQklUUwkoVFJBVV9GUkFNRV9TSVpFKjgpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERFTVVMVElQTEVYRVIgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGRlbXV4X3N1YmNoIHsKKwl1X2ludDhfdCBvdXRfYml0YnVmW1RSQVVfRlJBTUVfQklUU107CisJdV9pbnQxNl90IG91dF9pZHg7IC8qIG5leHQgYml0IHRvIGJlIHdyaXR0ZW4gaW4gb3V0X2JpdGJ1ZiAqLworCS8qIG51bWJlciBvZiBjb25zZWN1dGl2ZSB6ZXJvcyB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgKGZvciBzeW5jKSAqLworCXVuc2lnbmVkIGludCBjb25zZWN1dGl2ZV96ZXJvczsKKwkvKiBhcmUgd2UgaW4gVFJBVSBmcmFtZSBzeW5jIG9yIG5vdD8gKi8KKwl1bnNpZ25lZCBpbnQgaW5fc3luYzsKK307CisKK3N0cnVjdCBzdWJjaF9kZW11eCB7CisJLyogYml0bWFzayBvZiBjdXJyZW50bHkgYWN0aXZlIHN1YmNoYW5uZWxzICovCisJdV9pbnQ4X3QgY2hhbl9hY3RpdjsKKwkvKiBvbmUgZGVtdXhfc3ViY2ggc3RydWN0IGZvciBldmVyeSBzdWJjaGFubmVsICovCisJc3RydWN0IGRlbXV4X3N1YmNoIHN1YmNoW05SX1NVQkNIXTsKKwkvKiBjYWxsYmFjayB0byBiZSBjYWxsZWQgb25jZSB3ZSBoYXZlIHJlY2VpdmVkIGEgY29tcGxldGUKKwkgKiBmcmFtZSBvbiBhIGdpdmVuIHN1YmNoYW5uZWwgKi8KKwlpbnQgKCpvdXRfY2IpKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgY2gsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuLAorCQkgICAgICB2b2lkICopOworCS8qIHVzZXItcHJvdmlkZWQgZGF0YSwgdHJhbnNwYXJlbnRseSBwYXNzZWQgdG8gb3V0X2NiKCkgKi8KKwl2b2lkICpkYXRhOworfTsKKworLyogaW5pdGlhbGl6ZSBvbmUgZGVtdWx0aXBsZXhlciBpbnN0YW5jZSAqLworaW50IHN1YmNoX2RlbXV4X2luaXQoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgpOworCisvKiBmZWVkICdsZW4nIG51bWJlciBvZiBtdXhlZCBieXRlcyBpbnRvIHRoZSBkZW11bHRpcGxleGVyICovCitpbnQgc3ViY2hfZGVtdXhfaW4oc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKKworLyogYWN0aXZhdGUgZGVjb2RpbmcvcHJvY2Vzc2luZyBmb3Igb25lIHN1YmNoYW5uZWwgKi8KK2ludCBzdWJjaF9kZW11eF9hY3RpdmF0ZShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IHN1YmNoKTsKKworLyogZGVhY3RpdmF0ZSBkZWNvZGluZy9wcm9jZXNzaW5nIGZvciBvbmUgc3ViY2hhbm5lbCAqLworaW50IHN1YmNoX2RlbXV4X2RlYWN0aXZhdGUoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIGludCBzdWJjaCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1VTFRJUExFWEVSICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIG9uZSBlbGVtZW50IGluIHRoZSB0eF9xdWV1ZSBvZiBhIG11eGVyIHN1Yi1jaGFubmVsICovCitzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJdW5zaWduZWQgaW50IGJpdF9sZW47CS8qIHRvdGFsIG51bWJlciBvZiBiaXRzIGluICdiaXRzJyAqLworCXVuc2lnbmVkIGludCBuZXh0X2JpdDsJLyogbmV4dCBiaXQgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKworCXVfaW50OF90IGJpdHNbMF07CS8qIG9uZSBiaXQgcGVyIGJ5dGUgKi8KK307CisKK3N0cnVjdCBtdXhfc3ViY2ggeworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X3F1ZXVlOworfTsKKworLyogc3RydWN0dXJlIHJlcHJlc2VudGluZyBvbmUgaW5zdGFuY2Ugb2YgdGhlIHN1YmNoYW5uZWwgbXV4ZXIgKi8KK3N0cnVjdCBzdWJjaF9tdXggeworCXN0cnVjdCBtdXhfc3ViY2ggc3ViY2hbTlJfU1VCQ0hdOworfTsKKworLyogaW5pdGlhbGl6ZSBhIHN1YmNoYW5uZWwgbXV4ZXIgaW5zdGFuY2UgKi8KK2ludCBzdWJjaGFuX211eF9pbml0KHN0cnVjdCBzdWJjaF9tdXggKm14KTsKKworLyogcmVxdWVzdCB0aGUgb3V0cHV0IG9mICdsZW4nIG11bHRpcGxleGVkIGJ5dGVzICovCitpbnQgc3ViY2hhbl9tdXhfb3V0KHN0cnVjdCBzdWJjaF9tdXggKm14LCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CisKKy8qIGVucXVldWUgc29tZSBkYXRhIGludG8gb25lIHN1Yi1jaGFubmVsIG9mIHRoZSBtdXhlciAqLworaW50IHN1YmNoYW5fbXV4X2VucXVldWUoc3RydWN0IHN1YmNoX211eCAqbXgsIGludCBzX25yLCBjb25zdCB1X2ludDhfdCAqZGF0YSwKKwkJCWludCBsZW4pOworCisjZW5kaWYgLyogX1NVQkNIX0RFTVVYX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N5c3RlbV9pbmZvcm1hdGlvbi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyYTlhYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N5c3RlbV9pbmZvcm1hdGlvbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfU1lTVEVNX0lORk9fSAorI2RlZmluZSBfU1lTVEVNX0lORk9fSAorCitpbnQgZ3NtX2dlbmVyYXRlX3NpKHVfaW50OF90ICpvdXRwdXQsIHN0cnVjdCBnc21fYnRzICpidHMsIGludCB0eXBlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjMzZiNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDQzIEBACisvKiBtaW5pbWFsaXN0aWMgdGVsbmV0L25ldHdvcmsgaW50ZXJmYWNlIGl0IG1pZ2h0IHR1cm4gaW50byBhIHdpcmUgaW50ZXJmYWNlICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBURUxORVRfSU5URVJGQUNFX0gKKyNkZWZpbmUgVEVMTkVUX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlICJnc21fZGF0YS5oIgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcms7CisJc3RydWN0IGJzY19mZCBmZDsKKwlzdHJ1Y3QgdnR5ICp2dHk7CisJc3RydWN0IGxvZ190YXJnZXQgKmRiZzsKK307CisKKwordm9pZCB0ZWxuZXRfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcmssIGludCBwb3J0KTsKKworaW50IGJzY192dHlfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhbnNhY3Rpb24uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYW5zYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhMDA4YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYW5zYWN0aW9uLmgKQEAgLTAsMCArMSw3NiBAQAorI2lmbmRlZiBfVFJBTlNBQ1RfSAorI2RlZmluZSBfVFJBTlNBQ1RfSAorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorCisvKiBPbmUgdHJhbnNhY3Rpb24gKi8KK3N0cnVjdCBnc21fdHJhbnMgeworCS8qIEVudHJ5IGluIGxpc3Qgb2YgYWxsIHRyYW5zYWN0aW9ucyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJLyogVGhlIHByb3RvY29sIHdpdGhpbiB3aGljaCB3ZSBsaXZlICovCisJdV9pbnQ4X3QgcHJvdG9jb2w7CisKKwkvKiBUaGUgY3VycmVudCB0cmFuc2FjdGlvbiBJRCAqLworCXVfaW50OF90IHRyYW5zYWN0aW9uX2lkOworCQorCS8qIFRvIHdob20gd2UgYmVsb25nLCB1bmlxdWUgaWRlbnRpZmllciBvZiByZW1vdGUgTU0gZW50aXR5ICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiBUaGUgYXNzb2NpYXRlZCBjb25uZWN0aW9uIHdlIGFyZSB1c2luZyB0byB0cmFuc21pdCBtZXNzYWdlcyAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCisJLyogcmVmZXJlbmNlIGZyb20gTU5DQyBvciBvdGhlciBhcHBsaWNhdGlvbiAqLworCXVfaW50MzJfdCBjYWxscmVmOworCisJLyogaWYgdHJhZmZpYyBjaGFubmVsIHJlY2VpdmUgd2FzIHJlcXVlc3RlZCAqLworCWludCB0Y2hfcmVjdjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKworCQkJLyogY3VycmVudCBjYWxsIHN0YXRlICovCisJCQlpbnQgc3RhdGU7CisKKwkJCS8qIGN1cnJlbnQgdGltZXIgYW5kIG1lc3NhZ2UgcXVldWUgKi8KKwkJCWludCBUY3VycmVudDsJCS8qIGN1cnJlbnQgQ0MgdGltZXIgKi8KKwkJCWludCBUMzA4X3NlY29uZDsJLyogdXNlZCB0byBzZW5kIHJlbGVhc2UgYWdhaW4gKi8KKwkJCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCQkJc3RydWN0IGdzbV9tbmNjIG1zZzsJLyogc3RvcmVzIHNldHVwL2Rpc2Nvbm5lY3QvcmVsZWFzZSBtZXNzYWdlICovCisJCX0gY2M7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCBsaW5rX2lkOwkvKiBSU0wgTGluayBJRCB0byBiZSB1c2VkIGZvciB0aGlzIHRyYW5zICovCisJCQlpbnQgaXNfbXQ7CS8qIGlzIHRoaXMgYSBNTyAoMCkgb3IgTVQgKDEpIHRyYW5zZmVyICovCisJCQllbnVtIGdzbTQxMV9jcF9zdGF0ZSBjcF9zdGF0ZTsKKwkJCXN0cnVjdCB0aW1lcl9saXN0IGNwX3RpbWVyOworCisJCQllbnVtIGdzbTQxMV9ycF9zdGF0ZSBycF9zdGF0ZTsKKworCQkJc3RydWN0IGdzbV9zbXMgKnNtczsKKwkJfSBzbXM7CisJfTsKK307CisKKworCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSAgIHVfaW50OF90IHByb3RvLCB1X2ludDhfdCB0cmFuc19pZCk7CitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2NhbGxyZWYoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVfaW50MzJfdCBjYWxscmVmKTsKKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfYWxsb2Moc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdHJhbnNfaWQsCisJCQkgICAgICB1X2ludDMyX3QgY2FsbHJlZik7Cit2b2lkIHRyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworCitpbnQgdHJhbnNfYXNzaWduX3RyYW5zX2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdGlfZmxhZyk7CisKKy8qIHVwZGF0ZSBhbGwgdHJhbnNhY3Rpb25zIHRvIHVzZSBhIGRpZmZlcmVudCBMQ0hBTiwgZS5nLgorICogYWZ0ZXIgaGFuZG92ZXIgaGFzIHN1Y2NlZWRlZCAqLworaW50IHRyYW5zX2xjaGFuX2NoYW5nZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubl9vbGQsCisJCSAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubl9uZXcpOworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X2ZyYW1lLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X2ZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyM2Q0YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfZnJhbWUuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIF9UUkFVX0ZSQU1FX0gKKyNkZWZpbmUgX1RSQVVfRlJBTUVfSAorLyogVFJBVSBmcmFtZSBoYW5kbGluZyBhY2NvcmRpbmcgdG8gR1NNIFRTIDA4LjYwICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiAyMSBmb3IgRlIvRUZSLCAyNSBmb3IgQU1SLCAxNSBmb3IgT00sIDE1IGZvciBkYXRhLCAxMyBmb3IgRS1kYXRhLCAyMSBpZGxlICovCisjZGVmaW5lIE1BWF9DX0JJVFMJMjUKKy8qIDI2MCBmb3IgRlIvRUZSLCAyNTYgZm9yIEFNUiwgMjY0IGZvciBPTSwgMjg4IGZvciBFLWRhdGEgKi8KKyNkZWZpbmUgTUFYX0RfQklUUwkyODgKKy8qIGZvciBhbGwgc3BlZWNoIGZyYW1lcyAqLworI2RlZmluZSBNQVhfVF9CSVRTCTQKKy8qIGZvciBPTSAqLworI2RlZmluZSBNQVhfU19CSVRTCTYKKy8qIGZvciBFLWRhdGEgKi8KKyNkZWZpbmUgTUFYX01fQklUUwkyCisKK3N0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgeworCXVfaW50OF90IGNfYml0c1tNQVhfQ19CSVRTXTsKKwl1X2ludDhfdCBkX2JpdHNbTUFYX0RfQklUU107CisJdV9pbnQ4X3QgdF9iaXRzW01BWF9UX0JJVFNdOworCXVfaW50OF90IHNfYml0c1tNQVhfU19CSVRTXTsKKwl1X2ludDhfdCBtX2JpdHNbTUFYX01fQklUU107Cit9OworCisjZGVmaW5lIFRSQVVfRlRfRlJfVVAJCTB4MDIJLyogMCAwIDAgMSAwIC0gMy41LjEuMS4xICovCisjZGVmaW5lIFRSQVVfRlRfRlJfRE9XTgkJMHgxYwkvKiAxIDEgMSAwIDAgLSAzLjUuMS4xLjEgKi8KKyNkZWZpbmUgVFJBVV9GVF9FRlIJCTB4MWEJLyogMSAxIDAgMSAwIC0gMy41LjEuMS4xICovCisjZGVmaW5lIFRSQVVfRlRfQU1SCQkweDA2CS8qIDAgMCAxIDEgMCAtIDMuNS4xLjIgKi8KKyNkZWZpbmUgVFJBVV9GVF9PTV9VUAkJMHgwNwkvKiAwIDAgMSAwIDEgLSAzLjUuMiAqLworI2RlZmluZSBUUkFVX0ZUX09NX0RPV04JCTB4MWIJLyogMSAxIDAgMSAxIC0gMy41LjIgKi8KKyNkZWZpbmUgVFJBVV9GVF9EQVRBX1VQCQkweDA4CS8qIDAgMSAwIDAgMCAtIDMuNS4zICovCisjZGVmaW5lIFRSQVVfRlRfREFUQV9ET1dOCTB4MTYJLyogMSAwIDEgMSAwIC0gMy41LjMgKi8KKyNkZWZpbmUgVFJBVV9GVF9EMTQ1X1NZTkMJMHgxNAkvKiAxIDAgMSAwIDAgLSAzLjUuMyAqLworI2RlZmluZSBUUkFVX0ZUX0VEQVRBCQkweDFmCS8qIDEgMSAxIDEgMSAtIDMuNS40ICovCisjZGVmaW5lIFRSQVVfRlRfSURMRV9VUAkJMHgxMAkvKiAxIDAgMCAwIDAgLSAzLjUuNSAqLworI2RlZmluZSBUUkFVX0ZUX0lETEVfRE9XTgkweDBlCS8qIDAgMSAxIDEgMCAtIDMuNS41ICovCisKKworaW50IGRlY29kZV90cmF1X2ZyYW1lKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyLCBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzKTsKK2ludCBlbmNvZGVfdHJhdV9mcmFtZSh1X2ludDhfdCAqdHJhdV9iaXRzLCBjb25zdCBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmcik7CitpbnQgdHJhdV9mcmFtZV91cDJkb3duKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKTsKK3VfaW50OF90ICp0cmF1X2lkbGVfZnJhbWUodm9pZCk7CisKKworI2VuZGlmIC8qIF9UUkFVX0ZSQU1FX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfbXV4LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X211eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWI3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X211eC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIFNpbXBsZSBUUkFVIGZyYW1lIHJlZmxlY3RvciB0byByb3V0ZSB2b2ljZSBjYWxscyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qIFRoZSAiVFJBVSBtdXggbWFwIiBkZWZpbmVzIHdoaWNoIHBhcnRpY3VsYXIgMTZrYml0IHN1Yi1zbG90IChpbiB3aGljaCBFMQorICogdGltZXNsb3Qgb24gd2hpY2ggRTEgaW50ZXJmYWNlKSBzaG91bGQgYmUgZGlyZWN0bHkgbXV4ZWQgdG8gd2hpY2ggb3RoZXIgCisgKiBzdWItc2xvdC4gIEVudHJpZXMgaW4gdGhlIG11eCBtYXAgYXJlIGFsd2F5cyBiaS1kaXJlY3Rpb25hbC4gCisgKgorICogVGhlIGlkZWEgb2YgYWxsIHRoaXMgaXMgdG8gZGlyZWN0bHkgc3dpdGNoIHZvaWNlIGNoYW5uZWxzIGluIHRoZSBCU0MKKyAqIGZyb20gb25lIHBob25lIHRvIGFub3RoZXIuICBXZSBkbyB0aGlzIHJpZ2h0IG5vdyBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0CisgKiBhbnkgZXh0ZXJuYWwgaW50ZXJmYWNlIGZvciB2b2ljZSBjaGFubmVscywgYW5kIGluIHRoZSBmdXR1cmUgYXMgYW4KKyAqIG9wdGltaXphdGlvbiB0byByb3V0aW5nIHRoZW0gZXh0ZXJuYWxseS4KKyAqLworCisvKiBtYXAgYSBUUkFVIG11eCBtYXAgZW50cnkgKi8KK2ludCB0cmF1X211eF9tYXAoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmMsCisJCSBjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmRzdCk7CitpbnQgdHJhdV9tdXhfbWFwX2xjaGFuKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKnNyYywJCisJCQljb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpkc3QpOworCisvKiB1bm1hcCBhIFRSQVUgbXV4IG1hcCBlbnRyeSAqLworaW50IHRyYXVfbXV4X3VubWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3MsIHVfaW50MzJfdCBjYWxscmVmKTsKKworLyogd2UgZ2V0IGNhbGxlZCBieSBzdWJjaGFuX2RlbXV4ICovCitpbnQgdHJhdV9tdXhfaW5wdXQoc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfZTFfc3MsCisJCSAgIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMsIGludCBudW1fYml0cyk7CisKKy8qIGFkZCBhIHRyYXUgcmVjZWl2ZXIgKi8KK2ludCB0cmF1X3JlY3ZfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBjYWxscmVmKTsKKworLyogc2VuZCB0cmF1IGZyb20gYXBwbGljYXRpb24gKi8KK2ludCB0cmF1X3NlbmRfZnJhbWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpOwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdXNzZC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdXNzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZWEzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy91c3NkLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfVVNTRF9ICisjZGVmaW5lIF9VU1NEX0gKKworLyogSGFuZGxlciBmdW5jdGlvbiBmb3IgbW9iaWxlLW9yaWdpbmF0ZWQgVVNTRCBtZXNzYWdlcyAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCitpbnQgaGFuZGxlX3Jjdl91c3NkKHN0cnVjdCBtc2diICptc2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Z0eS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdnR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiMTE0OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Z0eS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgT1BFTkJTQ19WVFlfSAorI2RlZmluZSBPUEVOQlNDX1ZUWV9ICisKK3N0cnVjdCBnc21fbmV0d29yazsKK3N0cnVjdCB2dHk7CisKK3ZvaWQgb3BlbmJzY192dHlfYWRkX2NtZHModm9pZCk7Cit2b2lkIG9wZW5ic2NfdnR5X3ByaW50X3N0YXRpc3RpY3Moc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhhNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyIEBACitzY2NwX0hFQURFUlMgPSBzY2NwX3R5cGVzLmggc2NjcC5oCitzY2NwZGlyID0gJChpbmNsdWRlZGlyKS9zY2NwCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmggYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0YTJhYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3AuaApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIFNDQ1AgbWFuYWdlbWVudCBjb2RlCisgKgorICogKEMpIDIwMDksIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFNDQ1BfSAorI2RlZmluZSBTQ0NQX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAic2NjcF90eXBlcy5oIgorCitzdHJ1Y3QgbXNnYjsKK3N0cnVjdCBzY2NwX3N5c3RlbTsKKworZW51bSB7CisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX05PTkUsCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFUVVFU1QsCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0sCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVELAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VELAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9TRVRVUF9FUlJPUiwKK307CisKK3N0cnVjdCBzb2NrYWRkcl9zY2NwIHsKKwlzYV9mYW1pbHlfdAlzY2NwX2ZhbWlseTsJCS8qIEFGX1NDQ1AgaW4gdGhlIGZ1dHVyZT8/PyAqLworCXVfaW50OF90CXNjY3Bfc3NuOwkJLyogc3Vic3N5c3RlbSBudW1iZXIgZm9yIHJvdXRpbmcgKi8KKworCS8qIFRPRE8gZmlsbCBpbiBhZGRyZXNzIGluZGljYXRvci4uLiBpZiB0aGF0IGlzIGV2ZXIgbmVlZGVkICovCisKKwkvKiBub3Qgc3VyZSBhYm91dCB0aGVzZSAqLworCS8qIHVfaW50OF90ICAgIHNjY3BfY2xhc3M7ICovCit9OworCisvKgorICogcGFyc2VkIHN0cnVjdHVyZSBvZiBhbiBhZGRyZXNzCisgKi8KK3N0cnVjdCBzY2NwX2FkZHJlc3MgeworCXN0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzICAgIGFkZHJlc3M7CisJdV9pbnQ4X3QJCQkgICAgc3NuOworCXVfaW50OF90CQkJICAgIHBvaVsyXTsKK307CisKK3N0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgeworCXVfaW50OF90CQkJICAgIGRhdGFfbGVuOworCXVfaW50OF90CQkJICAgIGRhdGFfc3RhcnQ7Cit9OworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uIHsKKwkvKiBwdWJsaWMgKi8KKwl2b2lkICpkYXRhX2N0eDsKKwl2b2lkICgqZGF0YV9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZywgdW5zaWduZWQgaW50IGxlbik7CisKKwl2b2lkICpzdGF0ZV9jdHg7CisJdm9pZCAoKnN0YXRlX2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICosIGludCBvbGRfc3RhdGUpOworCisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJaW50IGNvbm5lY3Rpb25fc3RhdGU7CisKKwkvKiBwcml2YXRlICovCisJLyogbGlzdCBvZiBhY3RpdmUgY29ubmVjdGlvbnMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBzY2NwX3N5c3RlbSAqc3lzdGVtOworCWludCBpbmNvbWluZzsKK307CisKKy8qKgorICogc3lzdGVtIGZ1bmN0aW9uYWxpdHkgdG8gaW1wbGVtZW50IG9uIHRvcCBvZiBhbnkgb3RoZXIgdHJhbnNwb3J0IGxheWVyOgorICogICBjYWxsIHNjY3Bfc3lzdGVtX2luY29taW5nIGZvciBpbmNvbWluZyBkYXRhIChmcm9tIHRoZSBuZXR3b3JrKQorICogICBzY2NwIHdpbGwgY2FsbCBvdXRnb2luZyB3aGVuZXZlciBvdXRnb2luZyBkYXRhIGV4aXN0cworICovCitpbnQgc2NjcF9zeXN0ZW1faW5pdCh2b2lkICgqb3V0Z29pbmcpKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjdHgpLCB2b2lkICpjb250ZXh0KTsKK2ludCBzY2NwX3N5c3RlbV9pbmNvbWluZyhzdHJ1Y3QgbXNnYiAqZGF0YSk7CisKKy8qKgorICogU2VuZCBkYXRhIG9uIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24KKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl93cml0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbXNnYiAqZGF0YSk7CitpbnQgc2NjcF9jb25uZWN0aW9uX3NlbmRfaXQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitpbnQgc2NjcF9jb25uZWN0aW9uX2Nsb3NlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCBjYXVzZSk7CitpbnQgc2NjcF9jb25uZWN0aW9uX2ZyZWUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKy8qKgorICogaW50ZXJuYWwuLiAKKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9mb3JjZV9mcmVlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4pOworCisvKioKKyAqIENyZWF0ZSBhIG5ldyBzb2NrZXQuIFNldCB5b3VyIGNhbGxiYWNrcyBhbmQgdGhlbiBjYWxsIGJpbmQgdG8gb3BlbgorICogdGhlIGNvbm5lY3Rpb24uCisgKi8KK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKnNjY3BfY29ubmVjdGlvbl9zb2NrZXQodm9pZCk7CisKKy8qKgorICogT3BlbiB0aGUgY29ubmVjdGlvbiBhbmQgc2VuZCBhZGRpdGlvbmFsIGRhdGEKKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9jb25uZWN0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNjY3BfY2FsbGVkLAorCQkJICAgIHN0cnVjdCBtc2diICpkYXRhKTsKKworLyoqCisgKiBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4gU2V0IHRoZSBhY2NlcHQgY2FsbGJhY2suCisgKiBUT0RPOiBhZGQgdHJ1ZSByb3V0aW5nIGluZm9ybWF0aW9uLi4uIGluIGFuYWxvZ3kgdG8gc29ja2V0LCBiaW5kLCBhY2NlcHQKKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2ssCisJCQkJIGludCAoKmFjY2VwdF9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdm9pZCAqZGF0YSksCisJCQkJIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qKgorICogU2VuZCBkYXRhIGluIHRlcm1zIG9mIHVuaXQgZGF0YS4gQSBmaXhlZCBhZGRyZXNzIGluZGljYXRvciB3aWxsIGJlIHVzZWQuCisgKi8KK2ludCBzY2NwX3dyaXRlKHN0cnVjdCBtc2diICpkYXRhLAorCSAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29ja19zZW5kZXIsCisJICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrX3RhcmdldCwgaW50IGNsYXNzKTsKK2ludCBzY2NwX3NldF9yZWFkKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrLAorCQkgIGludCAoKnJlYWRfY2IpKHN0cnVjdCBtc2diICptc2diLCB1bnNpZ25lZCBpbnQsIHZvaWQgKnVzZXJfZGF0YSksCisJCSAgdm9pZCAqdXNlcl9kYXRhKTsKKworLyogZ2VuZXJpYyBzb2NrIGFkZHJlc3NlcyAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwIHNjY3Bfc3NuX2Jzc2FwOworCisvKiBoZWxwZXJzICovCit1X2ludDMyX3Qgc2NjcF9zcmNfcmVmX3RvX2ludChzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpyZWYpOworc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzY2NwX3NyY19yZWZfZnJvbV9pbnQodV9pbnQzMl90KTsKKworLyoqCisgKiBCZWxvdyB0aGlzIGFyZSBoZWxwZXIgZnVuY3Rpb25zIGFuZCBzdHJ1Y3RzIGZvciBwYXJzaW5nIFNDQ1AgbWVzc2FnZXMKKyAqLworc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHsKKwlzdHJ1Y3Qgc2NjcF9hZGRyZXNzIGNhbGxlZDsKKwlzdHJ1Y3Qgc2NjcF9hZGRyZXNzIGNhbGxpbmc7CisKKwkvKiBwb2ludCB0byB0aGUgbXNnIHBhY2tldCAqLworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJLyogZGF0YSBwb2ludGVyICovCisJaW50IGRhdGFfbGVuOworfTsKKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBuYXQgY29kZQorICovCitpbnQgc2NjcF9kZXRlcm1pbmVfbXNnX3R5cGUoc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgc2NjcF9wYXJzZV9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3BfdHlwZXMuaCBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3BfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJkNzBmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3Avc2NjcF90eXBlcy5oCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogSVRVIFEuNzEzIGRlZmluZWQgdHlwZXMgZm9yIFNDQ1AKKyAqCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgU0NDUF9UWVBFU19ICisjZGVmaW5lIFNDQ1BfVFlQRVNfSAorCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKKy8qIFRhYmxlIDEvUS43MTMgLSBTQ0NQIG1lc3NhZ2UgdHlwZXMgKi8KK2VudW0gc2NjcF9tZXNzYWdlX3R5cGVzIHsKKwlTQ0NQX01TR19UWVBFX0NSCT0gMSwKKwlTQ0NQX01TR19UWVBFX0NDCT0gMiwKKwlTQ0NQX01TR19UWVBFX0NSRUYJPSAzLAorCVNDQ1BfTVNHX1RZUEVfUkxTRAk9IDQsCisJU0NDUF9NU0dfVFlQRV9STEMJPSA1LAorCVNDQ1BfTVNHX1RZUEVfRFQxCT0gNiwKKwlTQ0NQX01TR19UWVBFX0RUMgk9IDcsCisJU0NDUF9NU0dfVFlQRV9BSwk9IDgsCisJU0NDUF9NU0dfVFlQRV9VRFQJPSA5LAorCVNDQ1BfTVNHX1RZUEVfVURUUwk9IDEwLAorCVNDQ1BfTVNHX1RZUEVfRUQJPSAxMSwKKwlTQ0NQX01TR19UWVBFX0VBCT0gMTIsCisJU0NDUF9NU0dfVFlQRV9SU1IJPSAxMywKKwlTQ0NQX01TR19UWVBFX1JTQwk9IDE0LAorCVNDQ1BfTVNHX1RZUEVfRVJSCT0gMTUsCisJU0NDUF9NU0dfVFlQRV9JVAk9IDE2LAorCVNDQ1BfTVNHX1RZUEVfWFVEVAk9IDE3LAorCVNDQ1BfTVNHX1RZUEVfWFVEVFMJPSAxOCwKKwlTQ0NQX01TR19UWVBFX0xVRFQJPSAxOSwKKwlTQ0NQX01TR19UWVBFX0xVRFRTCT0gMjAKK307CisKKy8qIFRhYmxlIDIvUS43MTMgLSBTQ0NQIHBhcmFtZXRlciBuYW1lIGNvZGVzICovCitlbnVtIHNjY3BfcGFyYW1ldGVyX25hbWVfY29kZXMgeworCVNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTAkJPSAwLAorCVNDQ1BfUE5DX0RFU1RJTkFUSU9OX0xPQ0FMX1JFRkVSRU5DRQk9IDEsCisJU0NDUF9QTkNfU09VUkNFX0xPQ0FMX1JFRkVSRU5DRQkJPSAyLAorCVNDQ1BfUE5DX0NBTExFRF9QQVJUWV9BRERSRVNTCQk9IDMsCisJU0NDUF9QTkNfQ0FMTElOR19QQVJUWV9BRERSRVNTCQk9IDQsCisJU0NDUF9QTkNfUFJPVE9DT0xfQ0xBU1MJCQk9IDUsCisJU0NDUF9QTkNfU0VHTUVOVElORwkJCT0gNiwKKwlTQ0NQX1BOQ19SRUNFSVZFX1NFUV9OVU1CRVIJCT0gNywKKwlTQ0NQX1BOQ19TRVFVRU5DSU5HCQkJPSA4LAorCVNDQ1BfUE5DX0NSRURJVAkJCQk9IDksCisJU0NDUF9QTkNfUkVMRUFTRV9DQVVTRQkJCT0gMTAsCisJU0NDUF9QTkNfUkVUVVJOX0NBVVNFCQkJPSAxMSwKKwlTQ0NQX1BOQ19SRVNFVF9DQVVTRQkJCT0gMTIsCisJU0NDUF9QTkNfRVJST1JfQ0FVU0UJCQk9IDEzLAorCVNDQ1BfUE5DX1JFRlVTQUxfQ0FVU0UJCQk9IDE0LAorCVNDQ1BfUE5DX0RBVEEJCQkJPSAxNSwKKwlTQ0NQX1BOQ19TRUdNRU5UQVRJT04JCQk9IDE2LAorCVNDQ1BfUE5DX0hPUF9DT1VOVEVSCQkJPSAxNywKKwlTQ0NQX1BOQ19JTVBPUlRBTkNFCQkJPSAxOCwKKwlTQ0NQX1BOQ19MT05HX0RBVEEJCQk9IDE5LAorfTsKKworLyogRmlndXJlIDMvUS43MTMgQ2FsbGVkL2NhbGxpbmcgcGFydHkgYWRkcmVzcyAqLworZW51bSB7CisJU0NDUF9USVRMRV9JTkRfTk9ORQkJCT0gMCwKKwlTQ0NQX1RJVExFX0lORF9OQVRVUkVfT05MWQkJPSAxLAorCVNDQ1BfVElUTEVfSU5EX1RSQU5TTEFUSU9OX09OTFkJCT0gMiwKKwlTQ0NQX1RJVExFX0lORF9UUkFOU19OVU1fRU5DCQk9IDMsCisJU0NDUF9USVRMRV9JTkRfVFJBTlNfTlVNX0VOQ19OQVRVUkUJPSA0LAorfTsKKworZW51bSB7CisJU0NDUF9DQUxMX1JPVVRFX09OX1NTTgkJCT0gMSwKKwlTQ0NQX0NBTExfUk9VVEVfT05fR1QJCQk9IDAsCit9OworCitzdHJ1Y3Qgc2NjcF9jYWxsZWRfcGFydHlfYWRkcmVzcyB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVfaW50OF90CXBvaW50X2NvZGVfaW5kaWNhdG9yIDogMSwKKwkJCXNzbl9pbmRpY2F0b3IJICAgICA6IDEsCisJCQlnbG9iYWxfdGl0bGVfaW5kaWNhdG9yIDogNCwKKwkJCXJvdXRpbmdfaW5kaWNhdG9yICAgIDogMSwKKwkJCXJlc2VydmVkCSAgICAgOiAxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90CXJlc2VydmVkCSAgICAgOiAxLAorCQkJcm91dGluZ19pbmRpY2F0b3IgICAgOiAxLAorCQkJZ2xvYmFsX3RpdGxlX2luZGljYXRvciA6IDQsCisJCQlzc25faW5kaWNhdG9yCSAgICAgOiAxLAorCQkJcG9pbnRfY29kZV9pbmRpY2F0b3IgOiAxOworI2VuZGlmCisJdV9pbnQ4X3QJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIGluZGljYXRvciBpbmRpY2F0ZXMgcHJlc2VuY2UgaW4gdGhlIGFib3ZlIG9yZGVyICovCisKKy8qIEZpZ3VyZSA2L1EuNzEzICovCitzdHJ1Y3Qgc2NjcF9zaWduYWxsaW5nX3BvaW50X2NvZGUgeworCXVfaW50OF90CWxzYjsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QJbXNiIDogNiwKKwkJCXJlc2VydmVkIDogMjsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdAlyZXNlcnZlZCA6IDIsCisJCQltc2IgOiA2OworI2VuZGlmCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTU04gPT0gc3Vic3lzdGVtIG51bWJlciAqLworZW51bSBzY2NwX3N1YnN5c3RlbV9udW1iZXIgeworCVNDQ1BfU1NOX05PVF9LTk9XTl9PUl9VU0VECSAgICA9IDAsCisJU0NDUF9TU05fTUFOQUdFTUVOVAkJICAgID0gMSwKKwlTQ0NQX1NTTl9SRVNFUlZFRF9JVFUJCSAgICA9IDIsCisJU0NDUF9TU05fSVNETl9VU0VSX1BBUlQJCSAgICA9IDMsCisJU0NDUF9TU05fT01BUAkJCSAgICA9IDQsIC8qIG9wZXJhdGlvbiwgbWFpbnQgYW5kIGFkbWluaXN0cmF0aW9uIHBhcnQgKi8KKwlTQ0NQX1NTTl9NQVAJCQkgICAgPSA1LCAvKiBtb2JpbGUgYXBwbGljYXRpb24gcGFydCAqLworCVNDQ1BfU1NOX0hMUgkJCSAgICA9IDYsCisJU0NDUF9TU05fVkxSCQkJICAgID0gNywKKwlTQ0NQX1NTTl9NU0MJCQkgICAgPSA4LAorCVNDQ1BfU1NOX0VJQwkJCSAgICA9IDksIC8qIGVxdWlwZW50IGlkZW50aWZpZXIgY2VudHJlICovCisJU0NDUF9TU05fQVVDCQkJICAgID0gMTAsIC8qIGF1dGhlbnRpY2F0aW9uIGNlbnRyZSAqLworCVNDQ1BfU1NOX0lTRE5fU1VQUExfU0VSVklDRVMJICAgID0gMTEsCisJU0NDUF9TU05fUkVTRVJWRURfSU5UTAkJICAgID0gMTIsCisJU0NDUF9TU05fSVNETl9FREdFX1RPX0VER0UJICAgID0gMTMsCisJU0NDUF9TU05fVENfVEVTVF9SRVNQT05ERVIJICAgID0gMTQsCisKKwkvKiBGcm9tIEdTTSAwMy4wMyA4LjIgKi8KKwlTQ0NQX1NTTl9CU1NBUAkJCSAgICA9IDI1NCwKKwlTQ0NQX1NTTl9CU1NPTQkJCSAgICA9IDI1MywKK307CisKKy8qIFEuNzEzLCAzLjQuMi4zICovCitlbnVtIHsKKwlTQ0NQX05BSV9VTktOT1dOCQkgICAgPSAwLAorCVNDQ1BfTkFJX1NVQlNDUklCRVJfTlVNQkVSCSAgICA9IDEsCisJU0NDUF9OQUlfUkVTRVJWRURfTkFUSU9OQUwJICAgID0gMiwKKwlTQ0NQX05BSV9OQVRJT05BTF9TSUdOSUZJQ0FOVAkgICAgPSAzLAorCVNDQ1BfTkFJX0lOVEVSTkFUSU9OQUwJCSAgICA9IDQsCit9OworCitzdHJ1Y3Qgc2NjcF9nbG9iYWxfdGl0bGUgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1X2ludDhfdAluYXR1cmVfb2ZfYWRkcl9pbmQgOiA3LAorCQkJb2RkX2V2ZW4gOiAxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90CW9kZF9ldmVuIDogMSwKKwkJCW5hdHVyZV9vZl9hZGRyX2luZCA6IDc7CisjZW5kaWYKKwl1X2ludDhfdAlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogUS43MTMsIDMuMyAqLworc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSB7CisJdV9pbnQ4X3QgICAgb2N0ZXQxOworCXVfaW50OF90ICAgIG9jdGV0MjsKKwl1X2ludDhfdCAgICBvY3RldDM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBRLjcxNCwgMy42ICovCitlbnVtIHNjY3BfcHJvdG9jb2xfY2xhc3MgeworCVNDQ1BfUFJPVE9DT0xfQ0xBU1NfMAkJICAgID0gMCwKKwlTQ0NQX1BST1RPQ09MX0NMQVNTXzEJCSAgICA9IDEsCisJU0NDUF9QUk9UT0NPTF9DTEFTU18yCQkgICAgPSAyLAorCVNDQ1BfUFJPVE9DT0xfQ0xBU1NfMwkJICAgID0gMywKK307CisKKy8qIGJpdHMgNS04IHdoZW4gY2xhc3MwLCBjbGFzczEgaXMgdXNlZCAqLworZW51bSBzY2NwX3Byb3RvY29sX29wdGlvbnMgeworCVNDQ1BfUFJPVE9DT0xfTk9fU1BFQ0lBTAkgICAgPSAwLAorCVNDQ1BfUFJPVE9DT0xfUkVUVVJOX01FU1NBR0UJICAgID0gOCwKK307CisKK2VudW0gc2NjcF9yZWxlYXNlX2NhdXNlIHsKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfRU5EX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAwLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9FTkRfVVNFUl9DT05HRVNUSU9OCSAgICA9IDEsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VORF9VU0VSX0ZBSUxVUkUJICAgID0gMiwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU0NDUF9VU0VSX09SSUdJTkFURUQJICAgID0gMywKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfUkVNT1RFX1BST0NFRFVSRV9FUlJPUiAgID0gNCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfSU5DT05TSVNURU5UX0NPTk5fREFUQSAgID0gNSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfQUNDRVNTX0ZBSUxVUkUJICAgID0gNiwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfQUNDRVNTX0NPTkdFU1RJT04JICAgID0gNywKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU1VCU1lTVEVNX0ZBSUxVUkUJICAgID0gOCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU1VCU1lTVEVNX0NPTkdFU1RJT04JICAgID0gOSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfTVRQX0ZBSUxVUkUJCSAgICA9IDEwLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9ORVRXT1JLX0NPTkdFU1RJT04JICAgID0gMTEsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VYUElSQVRJT05fUkVTRVQJICAgID0gMTIsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VYUElSQVRJT05fSU5BQ1RJVkUJICAgID0gMTMsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1JFU0VSVkVECQkgICAgPSAxNCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfVU5RVUFMSUZJRUQJCSAgICA9IDE1LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9TQ0NQX0ZBSUxVUkUJCSAgICA9IDE2LAorfTsKKworZW51bSBzY2NwX3JldHVybl9jYXVzZSB7CisJU0NDUF9SRVRVUk5fQ0FVU0VfTk9fVFJBTlNMQVRJT05fTkFUVVJFCSAgICA9IDAsCisJU0NDUF9SRVRVUk5fQ0FVU0VfTk9fVFJBTlNMQVRJT04JICAgID0gMSwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9TVUJTWVNURU1fQ09OR0VTVElPTgkgICAgPSAyLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NVQlNZU1RFTV9GQUlMVVJFCSAgICA9IDMsCisJU0NDUF9SRVRVUk5fQ0FVU0VfVU5FUVVJUFBFRF9VU0VSCSAgICA9IDQsCisJU0NDUF9SRVRVUk5fQ0FVU0VfTVRQX0ZBSUxVUkUJCSAgICA9IDUsCisJU0NDUF9SRVRVUk5fQ0FVU0VfTkVUV09SS19DT05HRVNUSU9OCSAgICA9IDYsCisJU0NDUF9SRVRVUk5fQ0FVU0VfVU5RVUFMSUZJRUQJCSAgICA9IDcsCisJU0NDUF9SRVRVUk5fQ0FVU0VfRVJST1JfSU5fTVNHX1RSQU5TUE9SVCAgICA9IDgsCisJU0NDUF9SRVRVUk5fQ0FVU0VfRVJST1JfSU5fTE9DQUxfUFJPQ0VTU0lORyA9IDksCisJU0NDUF9SRVRVUk5fQ0FVU0VfREVTVF9DQU5OT1RfUEVSRk9STV9SRUFTU0VNQkxZID0gMTAsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU0NDUF9GQUlMVVJFCQkgICAgPSAxMSwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9IT1BfQ09VTlRFUl9WSU9MQVRJT04JICAgID0gMTIsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU0VHTUVOVEFUSU9OX05PVF9TVVBQT1JURUQ9IDEzLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NFR01FTlRBVElPTl9GQU9MVVJFCSAgICA9IDE0Cit9OworCitlbnVtIHNjY3BfcmVzZXRfY2F1c2UgeworCVNDQ1BfUkVTRVRfQ0FVU0VfRU5EX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAwLAorCVNDQ1BfUkVTRVRfQ0FVU0VfU0NDUF9VU0VSX09SSUdJTkFURUQJICAgID0gMSwKKwlTQ0NQX1JFU0VUX0NBVVNFX01TR19PVVRfT0ZfT1JERVJfUFMJICAgID0gMiwKKwlTQ0NQX1JFU0VUX0NBVVNFX01TR19PVVRfT0ZfT1JERVJfUFIJICAgID0gMywKKwlTQ0NQX1JFU0VUX0NBVVNFX1JQQ19PVVRfT0ZfV0lORE9XCSAgICA9IDQsCisJU0NDUF9SRVNFVF9DQVVTRV9SUENfSU5DT1JSRUNUX1BTCSAgICA9IDUsCisJU0NDUF9SRVNFVF9DQVVTRV9SUENfR0VORVJBTAkJICAgID0gNiwKKwlTQ0NQX1JFU0VUX0NBVVNFX1JFTU9URV9FTkRfVVNFUl9PUEVSQVRJT05BTD0gNywKKwlTQ0NQX1JFU0VUX0NBVVNFX05FVFdPUktfT1BFUkFUSU9OQUwJICAgID0gOCwKKwlTQ0NQX1JFU0VUX0NBVVNFX0FDQ0VTU19PUEVSQVRJT05BTAkgICAgPSA5LAorCVNDQ1BfUkVTRVRfQ0FVU0VfTkVUV09SS19DT05HRVNUSU9OCSAgICA9IDEwLAorCVNDQ1BfUkVTRVRfQ0FVU0VfUkVTRVJWRUQJCSAgICA9IDExLAorfTsKKworZW51bSBzY2NwX2Vycm9yX2NhdXNlIHsKKwlTQ0NQX0VSUk9SX0xSTl9NSVNNQVRDSF9VTkFTU0lHTkVECSAgICA9IDAsIC8qIGxvY2FsIHJlZmVyZW5jZSBudW1iZXIgKi8KKwlTQ0NQX0VSUk9SX0xSTl9NSVNNQVRDSF9JTkNPTlNJU1RFTlQJICAgID0gMSwKKwlTQ0NQX0VSUk9SX1BPSU5UX0NPREVfTUlTTUFUQ0gJCSAgICA9IDIsCisJU0NDUF9FUlJPUl9TRVJWSUNFX0NMQVNTX01JU01BVENICSAgICA9IDMsCisJU0NDUF9FUlJPUl9VTlFVQUxJRklFRAkJCSAgICA9IDQsCit9OworCitlbnVtIHNjY3BfcmVmdXNhbF9jYXVzZSB7CisJU0NDUF9SRUZVU0FMX0VORF9VU0VSX09SSUdJTkFURUQJICAgID0gMCwKKwlTQ0NQX1JFRlVTQUxfRU5EX1VTRVJfQ09OR0VTVElPTgkgICAgPSAxLAorCVNDQ1BfUkVGVVNBTF9FTkRfVVNFUl9GQUlMVVJFCQkgICAgPSAyLAorCVNDQ1BfUkVGVVNBTF9TQ0NQX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAzLAorCVNDQ1BfUkVGVVNBTF9ERVNUSU5BVElPTl9BRERSRVNTX1VLTk9XTgkgICAgPSA0LAorCVNDQ1BfUkVGVVNBTF9ERVNUSU5BVElPTl9JTkFDQ0VTU0lCTEUJICAgID0gNSwKKwlTQ0NQX1JFRlVTQUxfTkVUX1FPU19OT05fVFJBTlNJRU5UCSAgICA9IDYsCisJU0NDUF9SRUZVU0FMX05FVF9RT1NfVFJBTlNJRU5UCQkgICAgPSA3LAorCVNDQ1BfUkVGVVNBTF9BQ0NFU1NfRkFJTFVSRQkJICAgID0gOCwKKwlTQ0NQX1JFRlVTQUxfQUNDRVNTX0NPTkdFU1RJT04JCSAgICA9IDksCisJU0NDUF9SRUZVU0FMX1NVQlNZU1RFTV9GQUlMVVJFCQkgICAgPSAxMCwKKwlTQ0NQX1JFRlVTQUxfU1VCU1lURU1fQ09OR0VTVElPTgkgICAgPSAxMSwKKwlTQ0NQX1JFRlVTQUxfRVhQSVJBVElPTgkJCSAgICA9IDEyLAorCVNDQ1BfUkVGVVNBTF9JTkNPTVBBVElCTEVfVVNFUl9EQVRBCSAgICA9IDEzLAorCVNDQ1BfUkVGVVNBTF9SRVNFUlZFRAkJCSAgICA9IDE0LAorCVNDQ1BfUkVGVVNBTF9VTlFVQUxJRklFRAkJICAgID0gMTUsCisJU0NDUF9SRUZVU0FMX0hPUF9DT1VOVEVSX1ZJT0xBVElPTgkgICAgPSAxNiwKKwlTQ0NQX1JFRlVTQUxfU0NDUF9GQUlMVVJFCQkgICAgPSAxNywKKwlTQ0NQX1JFRlVTQUxfVU5FUVVJUFBFRF9VU0VSCQkgICAgPSAxOCwKK307CisKKy8qCisgKiBtZXNzYWdlcy4uLiBhcyBvZiBRLjcxMyBDaGFwdGVyIDQKKyAqLworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0IHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXByb3RvX2NsYXNzOworCisKKwkvKiB2YXJpYWJsZSAqLworCXVfaW50OF90CQkJdmFyaWFibGVfY2FsbGVkOworI2lmIFZBUklBQkxFCisJY2FsbGVkX3BhcnR5X2FkZHJlc3MKKyNlbmRpZgorCisJLyogb3B0aW9uYWwgKi8KKwl1X2ludDhfdAkJCW9wdGlvbmFsX3N0YXJ0OworCisjaWYgT1BUSU9OQUwKKwljcmVkaXQgMworCWNhbGxpbmdwYXJ0eSB2YXIgNC1uCisJZGF0YSAgICAgICAgICAgIDMtMTMwCisJaG9wX2NvdW50ZXIgICAgIDMKKwlpbXBvcnRhbmNlICAgICAgMworCWVuZF9vZl9vcHRpb25hbCAxCisjZW5kaWYKKworCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlwcm90b19jbGFzczsKKworCS8qIG9wdGlvbmFsICovCisJdV9pbnQ4X3QJCQlvcHRpb25hbF9zdGFydDsKKworCS8qIG9wdGlvbmFsICovCisjaWYgT1BUSU9OQUwKKwljcmVkaXQgMworCWNhbGxlZCBwYXJ0eSA0CisJZGF0YSAgICAgICAgICAgIDMtMTMwCisJaW1wb3J0YW5jZSAgICAgIDMKKwllbmRfb2Zfb3B0aW9uYWwgMQorI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQljYXVzZTsKKworCS8qIG9wdGlvbmFsICovCisJdV9pbnQ4X3QJCQlvcHRpb25hbF9zdGFydDsKKworCS8qIG9wdGlvbmFsICovCisjaWYgT1BUSU9OQUwKKwljYWxsZWQgcGFydHkgNAorCWRhdGEgICAgICAgICAgICAzLTEzMAorCWltcG9ydGFuY2UgICAgICAzCisJZW5kX29mX29wdGlvbmFsIDEKKyNlbmRpZgorCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlyZWxlYXNlX2NhdXNlOworCisKKwkvKiBvcHRpb25hbCAqLworCXVfaW50OF90CQkJb3B0aW9uYWxfc3RhcnQ7CisKKyNpZiBPUFRJT05BTAorCWRhdGEgICAgICAgICAgICAzLTEzMAorCWltcG9ydGFuY2UgICAgICAzCisJZW5kX29mX29wdGlvbmFsIDEKKyNlbmRpZgorCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSB7CisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2RhdGFfZm9ybTEgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlzZWdtZW50aW5nOworCisJLyogdmFyaWFibGUgKi8KKwl1X2ludDhfdAkJCXZhcmlhYmxlX3N0YXJ0OworCisjaWYgVkFSSUFCTEUKKwlkYXRhIDItMjU2OworI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK3N0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJdV9pbnQ4X3QJCQlwcm90b19jbGFzczsKKworCisJLyogdmFyaWFibGUgKi8KKwl1X2ludDhfdAkJCXZhcmlhYmxlX2NhbGxlZDsKKwl1X2ludDhfdAkJCXZhcmlhYmxlX2NhbGxpbmc7CisJdV9pbnQ4X3QJCQl2YXJpYWJsZV9kYXRhOworCisjaWYgVkFSSUFCTEUKKwljYWxsZWQgcGFydHkgYWRkcmVzcworCWNhbGxpbmcgcGFydHkgYWRkcmVzcworI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9kYXRhX2l0IHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXByb3RvX2NsYXNzOworCisJdV9pbnQ4X3QJCQlzZXF1ZW5jaW5nWzJdOworCXVfaW50OF90CQkJY3JlZGl0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfcHJvdG9fZXJyIHsKKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQllcnJvcl9jYXVzZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9NYWtlZmlsZS5hbSBiL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3NDc2NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSBAQAorbm9pbnN0X0hFQURFUlMgPSBidWZmZXIuaCBjb21tYW5kLmggIHZlY3Rvci5oIHZ0eS5oCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L2J1ZmZlci5oIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQ2N2E5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIEJ1ZmZlcmluZyB0byBvdXRwdXQgYW5kIGlucHV0LgorICogQ29weXJpZ2h0IChDKSAxOTk4IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfWkVCUkFfQlVGRkVSX0gKKyNkZWZpbmUgX1pFQlJBX0JVRkZFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogQ3JlYXRlIGEgbmV3IGJ1ZmZlci4gIE1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZCBpbiBjaHVua3Mgb2YgdGhlIGdpdmVuCisgICBzaXplLiAgSWYgdGhlIGFyZ3VtZW50IGlzIDAsIHRoZSBsaWJyYXJ5IHdpbGwgc3VwcGx5IGEgcmVhc29uYWJsZQorICAgZGVmYXVsdCBzaXplIHN1aXRhYmxlIGZvciBidWZmZXJpbmcgc29ja2V0IEkvTy4gKi8KK3N0cnVjdCBidWZmZXIgKmJ1ZmZlcl9uZXcodm9pZCAqY3R4LCBzaXplX3QpOworCisvKiBGcmVlIGFsbCBkYXRhIGluIHRoZSBidWZmZXIuICovCit2b2lkIGJ1ZmZlcl9yZXNldChzdHJ1Y3QgYnVmZmVyICopOworCisvKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNhbGxzIGJ1ZmZlcl9yZXNldCB0byByZWxlYXNlIGFsbCBidWZmZXJlZCBkYXRhLgorICAgVGhlbiBpdCBmcmVlcyB0aGUgc3RydWN0IGJ1ZmZlciBpdHNlbGYuICovCit2b2lkIGJ1ZmZlcl9mcmVlKHN0cnVjdCBidWZmZXIgKik7CisKKy8qIEFkZCB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCitleHRlcm4gdm9pZCBidWZmZXJfcHV0KHN0cnVjdCBidWZmZXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworLyogQWRkIGEgc2luZ2xlIGNoYXJhY3RlciB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCitleHRlcm4gdm9pZCBidWZmZXJfcHV0YyhzdHJ1Y3QgYnVmZmVyICosIHVfY2hhcik7CisvKiBBZGQgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLworZXh0ZXJuIHZvaWQgYnVmZmVyX3B1dHN0cihzdHJ1Y3QgYnVmZmVyICosIGNvbnN0IGNoYXIgKik7CisKKy8qIENvbWJpbmUgYWxsIGFjY3VtdWxhdGVkIChhbmQgdW5mbHVzaGVkKSBkYXRhIGluc2lkZSB0aGUgYnVmZmVyIGludG8gYQorICAgc2luZ2xlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBhbGxvY2F0ZWQgdXNpbmcgWE1BTExPQyhNVFlQRV9UTVApLiAgTm90ZQorICAgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsdGVyIHRoZSBzdGF0ZSBvZiB0aGUgYnVmZmVyLCBzbyB0aGUgZGF0YQorICAgaXMgc3RpbGwgaW5zaWRlIHdhaXRpbmcgdG8gYmUgZmx1c2hlZC4gKi8KK2NoYXIgKmJ1ZmZlcl9nZXRzdHIoc3RydWN0IGJ1ZmZlciAqKTsKKworLyogUmV0dXJucyAxIGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcgZGF0YSBpbiB0aGUgYnVmZmVyLiAgT3RoZXJ3aXNlIHJldHVybnMgMC4gKi8KK2ludCBidWZmZXJfZW1wdHkoc3RydWN0IGJ1ZmZlciAqKTsKKwordHlwZWRlZiBlbnVtIHsKKwkvKiBBbiBJL08gZXJyb3Igb2NjdXJyZWQuICBUaGUgYnVmZmVyIHNob3VsZCBiZSBkZXN0cm95ZWQgYW5kIHRoZQorCSAgIGZpbGUgZGVzY3JpcHRvciBzaG91bGQgYmUgY2xvc2VkLiAqLworCUJVRkZFUl9FUlJPUiA9IC0xLAorCisJLyogVGhlIGRhdGEgd2FzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LCBhbmQgdGhlIGJ1ZmZlciBpcyBub3cgZW1wdHkKKwkgICAodGhlcmUgaXMgbm8gcGVuZGluZyBkYXRhIHdhaXRpbmcgdG8gYmUgZmx1c2hlZCkuICovCisJQlVGRkVSX0VNUFRZID0gMCwKKworCS8qIFRoZXJlIGlzIHBlbmRpbmcgZGF0YSBpbiB0aGUgYnVmZmVyIHdhaXRpbmcgdG8gYmUgZmx1c2hlZC4gIFBsZWFzZQorCSAgIHRyeSBmbHVzaGluZyB0aGUgYnVmZmVyIHdoZW4gc2VsZWN0IGluZGljYXRlcyB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IKKwkgICBpcyB3cml0ZWFibGUuICovCisJQlVGRkVSX1BFTkRJTkcgPSAxCit9IGJ1ZmZlcl9zdGF0dXNfdDsKKworLyogVHJ5IHRvIHdyaXRlIHRoaXMgZGF0YSB0byB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgQW55IGRhdGEgdGhhdCBjYW5ub3QKKyAgIGJlIHdyaXR0ZW4gaW1tZWRpYXRlbHkgaXMgYWRkZWQgdG8gdGhlIGJ1ZmZlciBxdWV1ZS4gKi8KK2V4dGVybiBidWZmZXJfc3RhdHVzX3QgYnVmZmVyX3dyaXRlKHN0cnVjdCBidWZmZXIgKiwgaW50IGZkLAorCQkJCSAgICBjb25zdCB2b2lkICosIHNpemVfdCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gZmx1c2ggc29tZSAoYnV0IHBlcmhhcHMgbm90IGFsbCkgb2YKKyAgIHRoZSBxdWV1ZWQgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLiAqLworZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfYXZhaWxhYmxlKHN0cnVjdCBidWZmZXIgKiwgaW50IGZkKTsKKworLyogVGhlIGZvbGxvd2luZyAyIGZ1bmN0aW9ucyAoYnVmZmVyX2ZsdXNoX2FsbCBhbmQgYnVmZmVyX2ZsdXNoX3dpbmRvdykKKyAgIGFyZSBmb3IgdXNlIGluIGxpYi92dHkuYyBvbmx5LiAgVGhleSBzaG91bGQgbm90IGJlIHVzZWQgZWxzZXdoZXJlLiAqLworCisvKiBDYWxsIGJ1ZmZlcl9mbHVzaF9hdmFpbGFibGUgcmVwZWF0ZWRseSB1bnRpbCBlaXRoZXIgYWxsIGRhdGEgaGFzIGJlZW4KKyAgIGZsdXNoZWQsIG9yIGFuIEkvTyBlcnJvciBoYXMgYmVlbiBlbmNvdW50ZXJlZCwgb3IgdGhlIG9wZXJhdGlvbiB3b3VsZAorICAgYmxvY2suICovCitleHRlcm4gYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl9mbHVzaF9hbGwoc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQpOworCisvKiBBdHRlbXB0IHRvIHdyaXRlIGVub3VnaCBkYXRhIHRvIHRoZSBnaXZlbiBmZCB0byBmaWxsIGEgd2luZG93IG9mIHRoZQorICAgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodCAoYW5kIHJlbW92ZSB0aGUgZGF0YSB3cml0dGVuIGZyb20gdGhlIGJ1ZmZlcikuCisKKyAgIElmICFub19tb3JlLCB0aGVuIGEgbWVzc2FnZSBzYXlpbmcgIiAtLU1vcmUtLSAiIGlzIGFwcGVuZGVkLgorICAgSWYgZXJhc2UgaXMgdHJ1ZSwgdGhlbiBmaXJzdCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzICIgLS1Nb3JlLS0gIiBtZXNzYWdlCisgICB3aXRoIHNwYWNlcy4KKworICAgQW55IHdyaXRlIGVycm9yIChpbmNsdWRpbmcgRUFHQUlOIG9yIEVJTlRSKSB3aWxsIGNhdXNlIHRoaXMgZnVuY3Rpb24KKyAgIHRvIHJldHVybiAtMSAoYmVjYXVzZSB0aGUgbG9naWMgZm9yIGhhbmRsaW5nIHRoZSBlcmFzZSBhbmQgbW9yZSBmZWF0dXJlcworICAgaXMgdG9vIGNvbXBsaWNhdGVkIHRvIHJldHJ5IHRoZSB3cml0ZSBsYXRlcikuCisqLworZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfd2luZG93KHN0cnVjdCBidWZmZXIgKiwgaW50IGZkLCBpbnQgd2lkdGgsCisJCQkJCSAgIGludCBoZWlnaHQsIGludCBlcmFzZSwgaW50IG5vX21vcmUpOworCisjZW5kaWYJCQkJLyogX1pFQlJBX0JVRkZFUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L2NvbW1hbmQuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvY29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNmUwYTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvdnR5L2NvbW1hbmQuaApAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAqIFplYnJhIGNvbmZpZ3VyYXRpb24gY29tbWFuZCBpbnRlcmZhY2Ugcm91dGluZQorICogQ29weXJpZ2h0IChDKSAxOTk3LCA5OCBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX1pFQlJBX0NPTU1BTkRfSAorI2RlZmluZSBfWkVCUkFfQ09NTUFORF9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgInZlY3Rvci5oIgorI2luY2x1ZGUgInZ0eS5oIgorCisvKiBIb3N0IGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgKi8KK3N0cnVjdCBob3N0IHsKKwkvKiBIb3N0IG5hbWUgb2YgdGhpcyByb3V0ZXIuICovCisJY2hhciAqbmFtZTsKKworCS8qIFBhc3N3b3JkIGZvciB2dHkgaW50ZXJmYWNlLiAqLworCWNoYXIgKnBhc3N3b3JkOworCWNoYXIgKnBhc3N3b3JkX2VuY3J5cHQ7CisKKwkvKiBFbmFibGUgcGFzc3dvcmQgKi8KKwljaGFyICplbmFibGU7CisJY2hhciAqZW5hYmxlX2VuY3J5cHQ7CisKKwkvKiBTeXN0ZW0gd2lkZSB0ZXJtaW5hbCBsaW5lcy4gKi8KKwlpbnQgbGluZXM7CisKKwkvKiBMb2cgZmlsZW5hbWUuICovCisJY2hhciAqbG9nZmlsZTsKKworCS8qIGNvbmZpZyBmaWxlIG5hbWUgb2YgdGhpcyBob3N0ICovCisJY2hhciAqY29uZmlnOworCisJLyogRmxhZ3MgZm9yIHNlcnZpY2VzICovCisJaW50IGFkdmFuY2VkOworCWludCBlbmNyeXB0OworCisJLyogQmFubmVyIGNvbmZpZ3VyYXRpb24uICovCisJY29uc3QgY2hhciAqbW90ZDsKKwljaGFyICptb3RkZmlsZTsKK307CisKKy8qIFRoZXJlIGFyZSBzb21lIGNvbW1hbmQgbGV2ZWxzIHdoaWNoIGNhbGxlZCBmcm9tIGNvbW1hbmQgbm9kZS4gKi8KK2VudW0gbm9kZV90eXBlIHsKKwlBVVRIX05PREUsCQkvKiBBdXRoZW50aWNhdGlvbiBtb2RlIG9mIHZ0eSBpbnRlcmZhY2UuICovCisJVklFV19OT0RFLAkJLyogVmlldyBub2RlLiBEZWZhdWx0IG1vZGUgb2YgdnR5IGludGVyZmFjZS4gKi8KKwlBVVRIX0VOQUJMRV9OT0RFLAkvKiBBdXRoZW50aWNhdGlvbiBtb2RlIGZvciBjaGFuZ2UgZW5hYmxlLiAqLworCUVOQUJMRV9OT0RFLAkJLyogRW5hYmxlIG5vZGUuICovCisJQ09ORklHX05PREUsCQkvKiBDb25maWcgbm9kZS4gRGVmYXVsdCBtb2RlIG9mIGNvbmZpZyBmaWxlLiAqLworCVNFUlZJQ0VfTk9ERSwJCS8qIFNlcnZpY2Ugbm9kZS4gKi8KKwlERUJVR19OT0RFLAkJLyogRGVidWcgbm9kZS4gKi8KKyNpZiAwCisJQUFBX05PREUsCQkvKiBBQUEgbm9kZS4gKi8KKwlLRVlDSEFJTl9OT0RFLAkJLyogS2V5LWNoYWluIG5vZGUuICovCisJS0VZQ0hBSU5fS0VZX05PREUsCS8qIEtleS1jaGFpbiBrZXkgbm9kZS4gKi8KKwlJTlRFUkZBQ0VfTk9ERSwJCS8qIEludGVyZmFjZSBtb2RlIG5vZGUuICovCisJWkVCUkFfTk9ERSwJCS8qIHplYnJhIGNvbm5lY3Rpb24gbm9kZS4gKi8KKwlUQUJMRV9OT0RFLAkJLyogcnRtX3RhYmxlIHNlbGVjdGlvbiBub2RlLiAqLworCVJJUF9OT0RFLAkJLyogUklQIHByb3RvY29sIG1vZGUgbm9kZS4gKi8KKwlSSVBOR19OT0RFLAkJLyogUklQbmcgcHJvdG9jb2wgbW9kZSBub2RlLiAqLworCUJHUF9OT0RFLAkJLyogQkdQIHByb3RvY29sIG1vZGUgd2hpY2ggaW5jbHVkZXMgQkdQNCsgKi8KKwlCR1BfVlBOVjRfTk9ERSwJCS8qIEJHUCBNUExTLVZQTiBQRSBleGNoYW5nZS4gKi8KKwlCR1BfSVBWNF9OT0RFLAkJLyogQkdQIElQdjQgdW5pY2FzdCBhZGRyZXNzIGZhbWlseS4gICovCisJQkdQX0lQVjRNX05PREUsCQkvKiBCR1AgSVB2NCBtdWx0aWNhc3QgYWRkcmVzcyBmYW1pbHkuICAqLworCUJHUF9JUFY2X05PREUsCQkvKiBCR1AgSVB2NiBhZGRyZXNzIGZhbWlseSAqLworCU9TUEZfTk9ERSwJCS8qIE9TUEYgcHJvdG9jb2wgbW9kZSAqLworCU9TUEY2X05PREUsCQkvKiBPU1BGIHByb3RvY29sIGZvciBJUHY2IG1vZGUgKi8KKwlJU0lTX05PREUsCQkvKiBJU0lTIHByb3RvY29sIG1vZGUgKi8KKwlNQVNDX05PREUsCQkvKiBNQVNDIGZvciBtdWx0aWNhc3QuICAqLworCUlSRFBfTk9ERSwJCS8qIElDTVAgUm91dGVyIERpc2NvdmVyeSBQcm90b2NvbCBtb2RlLiAqLworCUlQX05PREUsCQkvKiBTdGF0aWMgaXAgcm91dGUgbm9kZS4gKi8KKwlBQ0NFU1NfTk9ERSwJCS8qIEFjY2VzcyBsaXN0IG5vZGUuICovCisJUFJFRklYX05PREUsCQkvKiBQcmVmaXggbGlzdCBub2RlLiAqLworCUFDQ0VTU19JUFY2X05PREUsCS8qIEFjY2VzcyBsaXN0IG5vZGUuICovCisJUFJFRklYX0lQVjZfTk9ERSwJLyogUHJlZml4IGxpc3Qgbm9kZS4gKi8KKwlBU19MSVNUX05PREUsCQkvKiBBUyBsaXN0IG5vZGUuICovCisJQ09NTVVOSVRZX0xJU1RfTk9ERSwJLyogQ29tbXVuaXR5IGxpc3Qgbm9kZS4gKi8KKwlSTUFQX05PREUsCQkvKiBSb3V0ZSBtYXAgbm9kZS4gKi8KKwlTTVVYX05PREUsCQkvKiBTTk1QIGNvbmZpZ3VyYXRpb24gbm9kZS4gKi8KKwlEVU1QX05PREUsCQkvKiBQYWNrZXQgZHVtcCBub2RlLiAqLworCUZPUldBUkRJTkdfTk9ERSwJLyogSVAgZm9yd2FyZGluZyBub2RlLiAqLworI2VuZGlmCisJVlRZX05PREUsCQkvKiBWdHkgbm9kZS4gKi8KKworCUdTTU5FVF9OT0RFLAorCUJUU19OT0RFLAorCVRSWF9OT0RFLAorCVRTX05PREUsCisJU1VCU0NSX05PREUsCisJTUdDUF9OT0RFLAorCUdCUFJPWFlfTk9ERSwKKwlTR1NOX05PREUsCisJTlNfTk9ERSwKK307CisKKy8qIE5vZGUgd2hpY2ggaGFzIHNvbWUgY29tbWFuZHMgYW5kIHByb21wdCBzdHJpbmcgYW5kIGNvbmZpZ3VyYXRpb24KKyAgIGZ1bmN0aW9uIHBvaW50ZXIgLiAqLworc3RydWN0IGNtZF9ub2RlIHsKKwkvKiBOb2RlIGluZGV4LiAqLworCWVudW0gbm9kZV90eXBlIG5vZGU7CisKKwkvKiBQcm9tcHQgY2hhcmFjdGVyIGF0IHZ0eSBpbnRlcmZhY2UuICovCisJY29uc3QgY2hhciAqcHJvbXB0OworCisJLyogSXMgdGhpcyBub2RlJ3MgY29uZmlndXJhdGlvbiBnb2VzIHRvIHZ0eXNoID8gKi8KKwlpbnQgdnR5c2g7CisKKwkvKiBOb2RlJ3MgY29uZmlndXJhdGlvbiB3cml0ZSBmdW5jdGlvbiAqLworCWludCAoKmZ1bmMpIChzdHJ1Y3QgdnR5ICopOworCisJLyogVmVjdG9yIG9mIHRoaXMgbm9kZSdzIGNvbW1hbmQgbGlzdC4gKi8KKwl2ZWN0b3IgY21kX3ZlY3RvcjsKK307CisKK2VudW0geworCUNNRF9BVFRSX0RFUFJFQ0FURUQgPSAxLAorCUNNRF9BVFRSX0hJRERFTiwKK307CisKKy8qIFN0cnVjdHVyZSBvZiBjb21tYW5kIGVsZW1lbnQuICovCitzdHJ1Y3QgY21kX2VsZW1lbnQgeworCWNvbnN0IGNoYXIgKnN0cmluZzsJLyogQ29tbWFuZCBzcGVjaWZpY2F0aW9uIGJ5IHN0cmluZy4gKi8KKwlpbnQgKCpmdW5jKSAoc3RydWN0IGNtZF9lbGVtZW50ICosIHN0cnVjdCB2dHkgKiwgaW50LCBjb25zdCBjaGFyICpbXSk7CisJY29uc3QgY2hhciAqZG9jOwkvKiBEb2N1bWVudGF0aW9uIG9mIHRoaXMgY29tbWFuZC4gKi8KKwlpbnQgZGFlbW9uOwkJLyogRGFlbW9uIHRvIHdoaWNoIHRoaXMgY29tbWFuZCBiZWxvbmcuICovCisJdmVjdG9yIHN0cnZlYzsJCS8qIFBvaW50aW5nIG91dCBlYWNoIGRlc2NyaXB0aW9uIHZlY3Rvci4gKi8KKwl1bnNpZ25lZCBpbnQgY21kc2l6ZTsJLyogQ29tbWFuZCBpbmRleCBjb3VudC4gKi8KKwljaGFyICpjb25maWc7CQkvKiBDb25maWd1cmF0aW9uIHN0cmluZyAqLworCXZlY3RvciBzdWJjb25maWc7CS8qIFN1YiBjb25maWd1cmF0aW9uIHN0cmluZyAqLworCXVfY2hhciBhdHRyOwkJLyogQ29tbWFuZCBhdHRyaWJ1dGVzICovCit9OworCisvKiBDb21tYW5kIGRlc2NyaXB0aW9uIHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBkZXNjIHsKKwljb25zdCBjaGFyICpjbWQ7CS8qIENvbW1hbmQgc3RyaW5nLiAqLworCWNvbnN0IGNoYXIgKnN0cjsJLyogQ29tbWFuZCdzIGRlc2NyaXB0aW9uLiAqLworfTsKKworLyogUmV0dXJuIHZhbHVlIG9mIHRoZSBjb21tYW5kcy4gKi8KKyNkZWZpbmUgQ01EX1NVQ0NFU1MgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ01EX1dBUk5JTkcgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ01EX0VSUl9OT19NQVRDSCAgICAgICAgIDIKKyNkZWZpbmUgQ01EX0VSUl9BTUJJR1VPVVMgICAgICAgIDMKKyNkZWZpbmUgQ01EX0VSUl9JTkNPTVBMRVRFICAgICAgIDQKKyNkZWZpbmUgQ01EX0VSUl9FWEVFRF9BUkdDX01BWCAgIDUKKyNkZWZpbmUgQ01EX0VSUl9OT1RISU5HX1RPRE8gICAgIDYKKyNkZWZpbmUgQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0ggIDcKKyNkZWZpbmUgQ01EX0NPTVBMRVRFX01BVENIICAgICAgIDgKKyNkZWZpbmUgQ01EX0NPTVBMRVRFX0xJU1RfTUFUQ0ggIDkKKyNkZWZpbmUgQ01EX1NVQ0NFU1NfREFFTU9OICAgICAgMTAKKworLyogQXJnYyBtYXggY291bnRzLiAqLworI2RlZmluZSBDTURfQVJHQ19NQVggICAyNQorCisvKiBUdXJuIG9mZiB0aGVzZSBtYWNyb3Mgd2hlbiB1aXNuZyBjcHAgd2l0aCBleHRyYWN0LnBsICovCisjaWZuZGVmIFZUWVNIX0VYVFJBQ1RfUEwKKworLyogaGVscGVyIGRlZmluZXMgZm9yIGVuZC11c2VyIERFRlVOKiBtYWNyb3MgKi8KKyNkZWZpbmUgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cnMsIGRudW0pIFwKKyAgc3RhdGljIHN0cnVjdCBjbWRfZWxlbWVudCBjbWRuYW1lID0gXAorICB7IFwKKyAgICAuc3RyaW5nID0gY21kc3RyLCBcCisgICAgLmZ1bmMgPSBmdW5jbmFtZSwgXAorICAgIC5kb2MgPSBoZWxwc3RyLCBcCisgICAgLmF0dHIgPSBhdHRycywgXAorICAgIC5kYWVtb24gPSBkbnVtLCBcCisgIH07CisKKy8qIGdsb2JhbCAobm9uIHN0YXRpYykgY21kX2VsZW1lbnQgKi8KKyNkZWZpbmUgZ0RFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHJzLCBkbnVtKSBcCisgIHN0cnVjdCBjbWRfZWxlbWVudCBjbWRuYW1lID0gXAorICB7IFwKKyAgICAuc3RyaW5nID0gY21kc3RyLCBcCisgICAgLmZ1bmMgPSBmdW5jbmFtZSwgXAorICAgIC5kb2MgPSBoZWxwc3RyLCBcCisgICAgLmF0dHIgPSBhdHRycywgXAorICAgIC5kYWVtb24gPSBkbnVtLCBcCisgIH07CisKKyNkZWZpbmUgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBzdGF0aWMgaW50IGZ1bmNuYW1lIChzdHJ1Y3QgY21kX2VsZW1lbnQgKiwgc3RydWN0IHZ0eSAqLCBpbnQsIGNvbnN0IGNoYXIgKltdKTsgXAorCisjZGVmaW5lIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpIFwKKyAgc3RhdGljIGludCBmdW5jbmFtZSBcCisgICAgKHN0cnVjdCBjbWRfZWxlbWVudCAqc2VsZiwgc3RydWN0IHZ0eSAqdnR5LCBpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQorCisvKiBERUZVTiBmb3IgdnR5IGNvbW1hbmQgaW50ZXJhZmNlLiBMaXR0bGUgYml0IGhhY2t5IDstKS4gKi8KKyNkZWZpbmUgREVGVU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIDApIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworLyogZ2xvYmFsIChub24gc3RhdGljKSBjbWRfZWxlbWVudCAqLworI2RlZmluZSBnREVGVU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIGdERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCAwKSBcCisgIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpCisKKyNkZWZpbmUgREVGVU5fQVRUUihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyKSBcCisgIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0ciwgMCkgXAorICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQorCisjZGVmaW5lIERFRlVOX0hJRERFTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0FUVFIgKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0hJRERFTikKKworI2RlZmluZSBERUZVTl9ERVBSRUNBVEVEKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQVRUUiAoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfREVQUkVDQVRFRCkgXAorCisvKiBERUZVTl9OT1NIIGZvciBjb21tYW5kcyB0aGF0IHZ0eXNoIHNob3VsZCBpZ25vcmUgKi8KKyNkZWZpbmUgREVGVU5fTk9TSChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpCisKKy8qIERFRlNIIGZvciB2dHlzaC4gKi8KKyNkZWZpbmUgREVGU0goZGFlbW9uLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoTlVMTCwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCBkYWVtb24pIFwKKworLyogREVGVU4gKyBERUZTSCAqLworI2RlZmluZSBERUZVTlNIKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIGRhZW1vbikgXAorICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQorCisvKiBERUZVTiArIERFRlNIIHdpdGggYXR0cmlidXRlcyAqLworI2RlZmluZSBERUZVTlNIX0FUVFIoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyKSBcCisgIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0ciwgZGFlbW9uKSBcCisgIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpCisKKyNkZWZpbmUgREVGVU5TSF9ISURERU4oZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOU0hfQVRUUiAoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4pCisKKyNkZWZpbmUgREVGVU5TSF9ERVBSRUNBVEVEKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTlNIX0FUVFIgKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfREVQUkVDQVRFRCkKKworLyogQUxJQVMgbWFjcm8gd2hpY2ggZGVmaW5lIGV4aXN0aW5nIGNvbW1hbmQncyBhbGlhcy4gKi8KKyNkZWZpbmUgQUxJQVMoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCAwKQorCisvKiBnbG9iYWwgKG5vbiBzdGF0aWMpIGNtZF9lbGVtZW50ICovCisjZGVmaW5lIGdBTElBUyhmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIGdERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCAwKQorCisjZGVmaW5lIEFMSUFTX0FUVFIoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyLCAwKQorCisjZGVmaW5lIEFMSUFTX0hJRERFTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0hJRERFTiwgMCkKKworI2RlZmluZSBBTElBU19ERVBSRUNBVEVEKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfREVQUkVDQVRFRCwgMCkKKworI2RlZmluZSBBTElBU19TSChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgZGFlbW9uKQorCisjZGVmaW5lIEFMSUFTX1NIX0hJRERFTihkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfSElEREVOLCBkYWVtb24pCisKKyNkZWZpbmUgQUxJQVNfU0hfREVQUkVDQVRFRChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfREVQUkVDQVRFRCwgZGFlbW9uKQorCisjZW5kaWYJCQkJLyogVlRZU0hfRVhUUkFDVF9QTCAqLworCisvKiBTb21lIG1hY3JvZXMgKi8KKyNkZWZpbmUgQ01EX09QVElPTihTKSAgICgoU1swXSkgPT0gJ1snKQorI2RlZmluZSBDTURfVkFSSUFCTEUoUykgKCgoU1swXSkgPj0gJ0EnICYmIChTWzBdKSA8PSAnWicpIHx8ICgoU1swXSkgPT0gJzwnKSkKKyNkZWZpbmUgQ01EX1ZBUkFSRyhTKSAgICgoU1swXSkgPT0gJy4nKQorI2RlZmluZSBDTURfUkFOR0UoUykJKChTWzBdID09ICc8JykpCisKKyNkZWZpbmUgQ01EX0lQVjQoUykJICAgKChzdHJjbXAgKChTKSwgIkEuQi5DLkQiKSA9PSAwKSkKKyNkZWZpbmUgQ01EX0lQVjRfUFJFRklYKFMpICgoc3RyY21wICgoUyksICJBLkIuQy5EL00iKSA9PSAwKSkKKyNkZWZpbmUgQ01EX0lQVjYoUykgICAgICAgICgoc3RyY21wICgoUyksICJYOlg6Olg6WCIpID09IDApKQorI2RlZmluZSBDTURfSVBWNl9QUkVGSVgoUykgKChzdHJjbXAgKChTKSwgIlg6WDo6WDpYL00iKSA9PSAwKSkKKworLyogQ29tbW9uIGRlc2NyaXB0aW9ucy4gKi8KKyNkZWZpbmUgU0hPV19TVFIgIlNob3cgcnVubmluZyBzeXN0ZW0gaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgSVBfU1RSICJJUCBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBJUFY2X1NUUiAiSVB2NiBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBOT19TVFIgIk5lZ2F0ZSBhIGNvbW1hbmQgb3Igc2V0IGl0cyBkZWZhdWx0c1xuIgorI2RlZmluZSBDTEVBUl9TVFIgIlJlc2V0IGZ1bmN0aW9uc1xuIgorI2RlZmluZSBSSVBfU1RSICJSSVAgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgQkdQX1NUUiAiQkdQIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE9TUEZfU1RSICJPU1BGIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE5FSUdIQk9SX1NUUiAiU3BlY2lmeSBuZWlnaGJvciByb3V0ZXJcbiIKKyNkZWZpbmUgREVCVUdfU1RSICJEZWJ1Z2dpbmcgZnVuY3Rpb25zIChzZWUgYWxzbyAndW5kZWJ1ZycpXG4iCisjZGVmaW5lIFVOREVCVUdfU1RSICJEaXNhYmxlIGRlYnVnZ2luZyBmdW5jdGlvbnMgKHNlZSBhbHNvICdkZWJ1ZycpXG4iCisjZGVmaW5lIFJPVVRFUl9TVFIgIkVuYWJsZSBhIHJvdXRpbmcgcHJvY2Vzc1xuIgorI2RlZmluZSBBU19TVFIgIkFTIG51bWJlclxuIgorI2RlZmluZSBNQkdQX1NUUiAiTUJHUCBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBNQVRDSF9TVFIgIk1hdGNoIHZhbHVlcyBmcm9tIHJvdXRpbmcgdGFibGVcbiIKKyNkZWZpbmUgU0VUX1NUUiAiU2V0IHZhbHVlcyBpbiBkZXN0aW5hdGlvbiByb3V0aW5nIHByb3RvY29sXG4iCisjZGVmaW5lIE9VVF9TVFIgIkZpbHRlciBvdXRnb2luZyByb3V0aW5nIHVwZGF0ZXNcbiIKKyNkZWZpbmUgSU5fU1RSICAiRmlsdGVyIGluY29taW5nIHJvdXRpbmcgdXBkYXRlc1xuIgorI2RlZmluZSBWNE5PVEFUSU9OX1NUUiAic3BlY2lmeSBieSBJUHY0IGFkZHJlc3Mgbm90YXRpb24oZS5nLiAwLjAuMC4wKVxuIgorI2RlZmluZSBPU1BGNl9OVU1CRVJfU1RSICJTcGVjaWZ5IGJ5IG51bWJlclxuIgorI2RlZmluZSBJTlRFUkZBQ0VfU1RSICJJbnRlcmZhY2UgaW5mb21hdGlvblxuIgorI2RlZmluZSBJRk5BTUVfU1RSICJJbnRlcmZhY2UgbmFtZShlLmcuIGVwMClcbiIKKyNkZWZpbmUgSVA2X1NUUiAiSVB2NiBJbmZvcm1hdGlvblxuIgorI2RlZmluZSBPU1BGNl9TVFIgIk9wZW4gU2hvcnRlc3QgUGF0aCBGaXJzdCAoT1NQRikgZm9yIElQdjZcbiIKKyNkZWZpbmUgT1NQRjZfUk9VVEVSX1NUUiAiRW5hYmxlIGEgcm91dGluZyBwcm9jZXNzXG4iCisjZGVmaW5lIE9TUEY2X0lOU1RBTkNFX1NUUiAiPDEtNjU1MzU+IEluc3RhbmNlIElEXG4iCisjZGVmaW5lIFNFQ09ORFNfU1RSICI8MS02NTUzNT4gU2Vjb25kc1xuIgorI2RlZmluZSBST1VURV9TVFIgIlJvdXRpbmcgVGFibGVcbiIKKyNkZWZpbmUgUFJFRklYX0xJU1RfU1RSICJCdWlsZCBhIHByZWZpeCBsaXN0XG4iCisjZGVmaW5lIE9TUEY2X0RVTVBfVFlQRV9MSVNUIFwKKyIobmVpZ2hib3J8aW50ZXJmYWNlfGFyZWF8bHNhfHplYnJhfGNvbmZpZ3xkYmV4fHNwZnxyb3V0ZXxsc2RifHJlZGlzdHJpYnV0ZXxob29rfGFzYnJ8cHJlZml4fGFicikiCisjZGVmaW5lIElTSVNfU1RSICJJUy1JUyBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBBUkVBX1RBR19TVFIgIlthcmVhIHRhZ11cbiIKKworI2RlZmluZSBDT05GX0JBQ0tVUF9FWFQgIi5zYXYiCisKKy8qIElQdjQgb25seSBtYWNoaW5lIHNob3VsZCBub3QgYWNjZXB0IElQdjYgYWRkcmVzcyBmb3IgcGVlcidzIElQCisgICBhZGRyZXNzLiAgU28gd2UgcmVwbGFjZSBWVFkgY29tbWFuZCBzdHJpbmcgbGlrZSBiZWxvdy4gKi8KKyNpZmRlZiBIQVZFX0lQVjYKKyNkZWZpbmUgTkVJR0hCT1JfQ01EICAgICAgICJuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WCkgIgorI2RlZmluZSBOT19ORUlHSEJPUl9DTUQgICAgIm5vIG5laWdoYm9yIChBLkIuQy5EfFg6WDo6WDpYKSAiCisjZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSICAiTmVpZ2hib3IgYWRkcmVzc1xuSVB2NiBhZGRyZXNzXG4iCisjZGVmaW5lIE5FSUdIQk9SX0NNRDIgICAgICAibmVpZ2hib3IgKEEuQi5DLkR8WDpYOjpYOlh8V09SRCkgIgorI2RlZmluZSBOT19ORUlHSEJPUl9DTUQyICAgIm5vIG5laWdoYm9yIChBLkIuQy5EfFg6WDo6WDpYfFdPUkQpICIKKyNkZWZpbmUgTkVJR0hCT1JfQUREUl9TVFIyICJOZWlnaGJvciBhZGRyZXNzXG5OZWlnaGJvciBJUHY2IGFkZHJlc3Ncbk5laWdoYm9yIHRhZ1xuIgorI2Vsc2UKKyNkZWZpbmUgTkVJR0hCT1JfQ01EICAgICAgICJuZWlnaGJvciBBLkIuQy5EICIKKyNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EICAgICJubyBuZWlnaGJvciBBLkIuQy5EICIKKyNkZWZpbmUgTkVJR0hCT1JfQUREUl9TVFIgICJOZWlnaGJvciBhZGRyZXNzXG4iCisjZGVmaW5lIE5FSUdIQk9SX0NNRDIgICAgICAibmVpZ2hib3IgKEEuQi5DLkR8V09SRCkgIgorI2RlZmluZSBOT19ORUlHSEJPUl9DTUQyICAgIm5vIG5laWdoYm9yIChBLkIuQy5EfFdPUkQpICIKKyNkZWZpbmUgTkVJR0hCT1JfQUREUl9TVFIyICJOZWlnaGJvciBhZGRyZXNzXG5OZWlnaGJvciB0YWdcbiIKKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgKi8KKworLyogUHJvdG90eXBlcy4gKi8KK3ZvaWQgaW5zdGFsbF9ub2RlKHN0cnVjdCBjbWRfbm9kZSAqLCBpbnQgKCopKHN0cnVjdCB2dHkgKikpOwordm9pZCBpbnN0YWxsX2RlZmF1bHQoZW51bSBub2RlX3R5cGUpOwordm9pZCBpbnN0YWxsX2VsZW1lbnQoZW51bSBub2RlX3R5cGUsIHN0cnVjdCBjbWRfZWxlbWVudCAqKTsKK3ZvaWQgaW5zdGFsbF9lbGVtZW50X3ZlKHN0cnVjdCBjbWRfZWxlbWVudCAqY21kKTsKK3ZvaWQgc29ydF9ub2RlKCk7CisKKy8qIENvbmNhdGVuYXRlcyBhcmd2W3NoaWZ0XSB0aHJvdWdoIGFyZ3ZbYXJnYy0xXSBpbnRvIGEgc2luZ2xlIE5VTC10ZXJtaW5hdGVkCisgICBzdHJpbmcgd2l0aCBhIHNwYWNlIGJldHdlZW4gZWFjaCBlbGVtZW50IChhbGxvY2F0ZWQgdXNpbmcKKyAgIFhNQUxMT0MoTVRZUEVfVE1QKSkuICBSZXR1cm5zIE5VTEwgaWYgc2hpZnQgPj0gYXJnYy4gKi8KK2NoYXIgKmFyZ3ZfY29uY2F0KGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgYXJnYywgaW50IHNoaWZ0KTsKKwordmVjdG9yIGNtZF9tYWtlX3N0cnZlYyhjb25zdCBjaGFyICopOwordm9pZCBjbWRfZnJlZV9zdHJ2ZWModmVjdG9yKTsKK3ZlY3RvciBjbWRfZGVzY3JpYmVfY29tbWFuZCgpOworY2hhciAqKmNtZF9jb21wbGV0ZV9jb21tYW5kKCk7Citjb25zdCBjaGFyICpjbWRfcHJvbXB0KGVudW0gbm9kZV90eXBlKTsKK2ludCBjb25maWdfZnJvbV9maWxlKHN0cnVjdCB2dHkgKiwgRklMRSAqKTsKK2VudW0gbm9kZV90eXBlIG5vZGVfcGFyZW50KGVudW0gbm9kZV90eXBlKTsKK2ludCBjbWRfZXhlY3V0ZV9jb21tYW5kKHZlY3Rvciwgc3RydWN0IHZ0eSAqLCBzdHJ1Y3QgY21kX2VsZW1lbnQgKiosIGludCk7CitpbnQgY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmVjdG9yLCBzdHJ1Y3QgdnR5ICosIHN0cnVjdCBjbWRfZWxlbWVudCAqKik7Cit2b2lkIGNvbmZpZ19yZXBsYWNlX3N0cmluZyhzdHJ1Y3QgY21kX2VsZW1lbnQgKiwgY2hhciAqLCAuLi4pOwordm9pZCBjbWRfaW5pdChpbnQpOworCisvKiBFeHBvcnQgdHlwaWNhbCBmdW5jdGlvbnMuICovCitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19lbmRfY21kOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfZXhpdF9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19xdWl0X2NtZDsKK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2hlbHBfY21kOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfbGlzdF9jbWQ7CitjaGFyICpob3N0X2NvbmZpZ19maWxlKCk7Cit2b2lkIGhvc3RfY29uZmlnX3NldChjb25zdCBjaGFyICopOworCit2b2lkIHByaW50X3ZlcnNpb24oY29uc3QgY2hhciAqKTsKKworZXh0ZXJuIHZvaWQgKnRhbGxfdnR5X2NtZF9jdHg7CisKKyNlbmRpZgkJCQkvKiBfWkVCUkFfQ09NTUFORF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L3ZlY3Rvci5oIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS92ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmExODRkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS92ZWN0b3IuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogR2VuZXJpYyB2ZWN0b3IgaW50ZXJmYWNlIGhlYWRlci4KKyAqIENvcHlyaWdodCAoQykgMTk5NywgOTggS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAqIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9aRUJSQV9WRUNUT1JfSAorI2RlZmluZSBfWkVCUkFfVkVDVE9SX0gKKworLyogc3RydWN0IGZvciB2ZWN0b3IgKi8KK3N0cnVjdCBfdmVjdG9yIHsKKwl1bnNpZ25lZCBpbnQgYWN0aXZlOwkvKiBudW1iZXIgb2YgYWN0aXZlIHNsb3RzICovCisJdW5zaWduZWQgaW50IGFsbG9jZWQ7CS8qIG51bWJlciBvZiBhbGxvY2F0ZWQgc2xvdCAqLworCXZvaWQgKippbmRleDsJCS8qIGluZGV4IHRvIGRhdGEgKi8KK307Cit0eXBlZGVmIHN0cnVjdCBfdmVjdG9yICp2ZWN0b3I7CisKKyNkZWZpbmUgVkVDVE9SX01JTl9TSVpFIDEKKworLyogKFNvbWV0aW1lcykgdXNlZnVsbCBtYWNyb3MuICBUaGlzIG1hY3JvIGNvbnZlcnQgaW5kZXggZXhwcmVzc2lvbiB0bworIGFycmF5IGV4cHJlc3Npb24uICovCisvKiBSZWZlcmVuY2Ugc2xvdCBhdCBnaXZlbiBpbmRleCwgY2FsbGVyIG11c3QgZW5zdXJlIHNsb3QgaXMgYWN0aXZlICovCisjZGVmaW5lIHZlY3Rvcl9zbG90KFYsSSkgICgoViktPmluZGV4WyhJKV0pCisvKiBOdW1iZXIgb2YgYWN0aXZlIHNsb3RzLgorICogTm90ZSB0aGF0IHRoaXMgZGlmZmVycyBmcm9tIHZlY3Rvcl9jb3VudCgpIGFzIGl0IHRoZSBjb3VudCByZXR1cm5lZAorICogd2lsbCBpbmNsdWRlIGFueSBlbXB0eSBzbG90cworICovCisjZGVmaW5lIHZlY3Rvcl9hY3RpdmUoVikgKChWKS0+YWN0aXZlKQorCisvKiBQcm90b3R5cGVzLiAqLwordmVjdG9yIHZlY3Rvcl9pbml0KHVuc2lnbmVkIGludCBzaXplKTsKK3ZvaWQgdmVjdG9yX2Vuc3VyZSh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IG51bSk7CitpbnQgdmVjdG9yX2VtcHR5X3Nsb3QodmVjdG9yIHYpOworaW50IHZlY3Rvcl9zZXQodmVjdG9yIHYsIHZvaWQgKnZhbCk7CitpbnQgdmVjdG9yX3NldF9pbmRleCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGksIHZvaWQgKnZhbCk7Cit2b2lkIHZlY3Rvcl91bnNldCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGkpOwordW5zaWduZWQgaW50IHZlY3Rvcl9jb3VudCh2ZWN0b3Igdik7Cit2b2lkIHZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZSh2ZWN0b3Igdik7Cit2b2lkIHZlY3Rvcl9vbmx5X2luZGV4X2ZyZWUodm9pZCAqaW5kZXgpOwordm9pZCB2ZWN0b3JfZnJlZSh2ZWN0b3Igdik7Cit2ZWN0b3IgdmVjdG9yX2NvcHkodmVjdG9yIHYpOworCit2b2lkICp2ZWN0b3JfbG9va3VwKHZlY3RvciwgdW5zaWduZWQgaW50KTsKK3ZvaWQgKnZlY3Rvcl9sb29rdXBfZW5zdXJlKHZlY3RvciwgdW5zaWduZWQgaW50KTsKKworZXh0ZXJuIHZvaWQgKnRhbGxfdnR5X3ZlY19jdHg7CisKKyNlbmRpZgkJCQkvKiBfWkVCUkFfVkVDVE9SX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS92dHkvdnR5LmggYi9vcGVuYnNjL2luY2x1ZGUvdnR5L3Z0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDFmYzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvdnR5L3Z0eS5oCkBAIC0wLDAgKzEsMTUxIEBACisjaWZuZGVmIF9WVFlfSAorI2RlZmluZSBfVlRZX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qIEdDQyBoYXZlIHByaW50ZiB0eXBlIGF0dHJpYnV0ZSBjaGVjay4gICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgVlRZX1BSSU5URl9BVFRSSUJVVEUoYSxiKSBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgYSwgYikpKQorI2Vsc2UKKyNkZWZpbmUgVlRZX1BSSU5URl9BVFRSSUJVVEUoYSxiKQorI2VuZGlmCQkJCS8qIF9fR05VQ19fICovCisKKy8qIERvZXMgdGhlIEkvTyBlcnJvciBpbmRpY2F0ZSB0aGF0IHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHJldHJpZWQgbGF0ZXI/ICovCisjZGVmaW5lIEVSUk5PX0lPX1JFVFJZKEVOKSBcCisJKCgoRU4pID09IEVBR0FJTikgfHwgKChFTikgPT0gRVdPVUxEQkxPQ0spIHx8ICgoRU4pID09IEVJTlRSKSkKKworLyogVnR5IHJlYWQgYnVmZmVyIHNpemUuICovCisjZGVmaW5lIFZUWV9SRUFEX0JVRlNJWiA1MTIKKworI2RlZmluZSBWVFlfQlVGU0laIDUxMgorI2RlZmluZSBWVFlfTUFYSElTVCAyMAorCisvKiBWdHkgZXZlbnRzICovCitlbnVtIGV2ZW50IHsKKwlWVFlfU0VSViwKKwlWVFlfUkVBRCwKKwlWVFlfV1JJVEUsCisJVlRZX0NMT1NFRCwKKwlWVFlfVElNRU9VVF9SRVNFVCwKKyNpZmRlZiBWVFlTSAorCVZUWVNIX1NFUlYsCisJVlRZU0hfUkVBRCwKKwlWVFlTSF9XUklURQorI2VuZGlmCQkJCS8qIFZUWVNIICovCit9OworCitzdHJ1Y3QgdnR5IHsKKwlGSUxFICpmaWxlOworCisJLyogcHJpdmF0ZSBkYXRhLCBzcGVjaWZpZWQgYnkgY3JlYXRvciAqLworCXZvaWQgKnByaXY7CisKKwkvKiBGaWxlIGRlc2NyaXB0ZXIgb2YgdGhpcyB2dHkuICovCisJaW50IGZkOworCisJLyogSXMgdGhpcyB2dHkgY29ubmVjdCB0byBmaWxlIG9yIG5vdCAqLworCWVudW0geyBWVFlfVEVSTSwgVlRZX0ZJTEUsIFZUWV9TSEVMTCwgVlRZX1NIRUxMX1NFUlYgfSB0eXBlOworCisJLyogTm9kZSBzdGF0dXMgb2YgdGhpcyB2dHkgKi8KKwlpbnQgbm9kZTsKKworCS8qIEZhaWx1cmUgY291bnQgKi8KKwlpbnQgZmFpbDsKKworCS8qIE91dHB1dCBidWZmZXIuICovCisJc3RydWN0IGJ1ZmZlciAqb2J1ZjsKKworCS8qIENvbW1hbmQgaW5wdXQgYnVmZmVyICovCisJY2hhciAqYnVmOworCisJLyogQ29tbWFuZCBjdXJzb3IgcG9pbnQgKi8KKwlpbnQgY3A7CisKKwkvKiBDb21tYW5kIGxlbmd0aCAqLworCWludCBsZW5ndGg7CisKKwkvKiBDb21tYW5kIG1heCBsZW5ndGguICovCisJaW50IG1heDsKKworCS8qIEhpc3RyeSBvZiBjb21tYW5kICovCisJY2hhciAqaGlzdFtWVFlfTUFYSElTVF07CisKKwkvKiBIaXN0b3J5IGxvb2t1cCBjdXJyZW50IHBvaW50ICovCisJaW50IGhwOworCisJLyogSGlzdG9yeSBpbnNlcnQgZW5kIHBvaW50ICovCisJaW50IGhpbmRleDsKKworCS8qIEZvciBjdXJyZW50IHJlZmVyZW5jaW5nIHBvaW50IG9mIGludGVyZmFjZSwgcm91dGUtbWFwLAorCSAgIGFjY2Vzcy1saXN0IGV0Yy4uLiAqLworCXZvaWQgKmluZGV4OworCisJLyogRm9yIG11bHRpcGxlIGxldmVsIGluZGV4IHRyZWF0bWVudCBzdWNoIGFzIGtleSBjaGFpbiBhbmQga2V5LiAqLworCXZvaWQgKmluZGV4X3N1YjsKKworCS8qIEZvciBlc2NhcGUgY2hhcmFjdGVyLiAqLworCXVuc2lnbmVkIGNoYXIgZXNjYXBlOworCisJLyogQ3VycmVudCB2dHkgc3RhdHVzLiAqLworCWVudW0geyBWVFlfTk9STUFMLCBWVFlfQ0xPU0UsIFZUWV9NT1JFLCBWVFlfTU9SRUxJTkUgfSBzdGF0dXM7CisKKwkvKiBJQUMgaGFuZGxpbmc6IHdhcyB0aGUgbGFzdCBjaGFyYWN0ZXIgcmVjZWl2ZWQgdGhlIElBQworCSAqIChpbnRlcnByZXQtYXMtY29tbWFuZCkgZXNjYXBlIGNoYXJhY3RlciAoYW5kIHRoZXJlZm9yZSB0aGUgbmV4dAorCSAqIGNoYXJhY3RlciB3aWxsIGJlIHRoZSBjb21tYW5kIGNvZGUpPyAgUmVmZXIgdG8gVGVsbmV0IFJGQyA4NTQuICovCisJdW5zaWduZWQgY2hhciBpYWM7CisKKwkvKiBJQUMgU0IgKG9wdGlvbiBzdWJuZWdvdGlhdGlvbikgaGFuZGxpbmcgKi8KKwl1bnNpZ25lZCBjaGFyIGlhY19zYl9pbl9wcm9ncmVzczsKKwkvKiBBdCB0aGUgbW9tZW50LCB3ZSBjYXJlIG9ubHkgYWJvdXQgdGhlIE5BV1MgKHdpbmRvdyBzaXplKSBuZWdvdGlhdGlvbiwKKwkgKiBhbmQgdGhhdCByZXF1aXJlcyBqdXN0IGEgNS1jaGFyYWN0ZXIgYnVmZmVyIChSRkMgMTA3Myk6CisJICogPE5BV1MgY2hhcj4gPDE2LWJpdCB3aWR0aD4gPDE2LWJpdCBoZWlnaHQ+ICovCisjZGVmaW5lIFRFTE5FVF9OQVdTX1NCX0xFTiA1CisJdW5zaWduZWQgY2hhciBzYl9idWZbVEVMTkVUX05BV1NfU0JfTEVOXTsKKwkvKiBIb3cgbWFueSBzdWJuZWdvdGlhdGlvbiBjaGFyYWN0ZXJzIGhhdmUgd2UgcmVjZWl2ZWQ/ICBXZSBqdXN0IGRyb3AKKwkgKiB0aG9zZSB0aGF0IGRvIG5vdCBmaXQgaW4gdGhlIGJ1ZmZlci4gKi8KKwlzaXplX3Qgc2JfbGVuOworCisJLyogV2luZG93IHdpZHRoL2hlaWdodC4gKi8KKwlpbnQgd2lkdGg7CisJaW50IGhlaWdodDsKKworCS8qIENvbmZpZ3VyZSBsaW5lcy4gKi8KKwlpbnQgbGluZXM7CisKKwlpbnQgbW9uaXRvcjsKKworCS8qIEluIGNvbmZpZ3VyZSBtb2RlLiAqLworCWludCBjb25maWc7Cit9OworCisvKiBTbWFsbCBtYWNybyB0byBkZXRlcm1pbmUgbmV3bGluZSBpcyBuZXdsaW5lIG9ubHkgb3IgbGluZWZlZWQgbmVlZGVkLiAqLworI2RlZmluZSBWVFlfTkVXTElORSAgKCh2dHktPnR5cGUgPT0gVlRZX1RFUk0pID8gIlxyXG4iIDogIlxuIikKKworc3RhdGljIGlubGluZSBjaGFyICp2dHlfbmV3bGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJcmV0dXJuIFZUWV9ORVdMSU5FOworfQorCisvKiBQcm90b3R5cGVzLiAqLwordm9pZCB2dHlfaW5pdCAodm9pZCk7CitpbnQgdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uc3QgY2hhciAqZmlsZV9uYW1lKTsKK3ZvaWQgdnR5X2luaXRfdnR5c2ggKHZvaWQpOwordm9pZCB2dHlfcmVzZXQgKHZvaWQpOworc3RydWN0IHZ0eSAqdnR5X25ldyAodm9pZCk7CitzdHJ1Y3QgdnR5ICp2dHlfY3JlYXRlIChpbnQgdnR5X3NvY2ssIHZvaWQgKnByaXYpOworaW50IHZ0eV9vdXQgKHN0cnVjdCB2dHkgKiwgY29uc3QgY2hhciAqLCAuLi4pIFZUWV9QUklOVEZfQVRUUklCVVRFKDIsIDMpOworaW50IHZ0eV9vdXRfbmV3bGluZShzdHJ1Y3QgdnR5ICopOworaW50IHZ0eV9yZWFkKHN0cnVjdCB2dHkgKnZ0eSk7CisvL3ZvaWQgdnR5X3RpbWVfcHJpbnQgKHN0cnVjdCB2dHkgKiwgaW50KTsKK3ZvaWQgdnR5X2Nsb3NlIChzdHJ1Y3QgdnR5ICopOworY2hhciAqdnR5X2dldF9jd2QgKHZvaWQpOwordm9pZCB2dHlfbG9nIChjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqcHJvdG8sIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCk7CitpbnQgdnR5X2NvbmZpZ19sb2NrIChzdHJ1Y3QgdnR5ICopOworaW50IHZ0eV9jb25maWdfdW5sb2NrIChzdHJ1Y3QgdnR5ICopOworaW50IHZ0eV9zaGVsbCAoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfc2hlbGxfc2VydiAoc3RydWN0IHZ0eSAqKTsKK3ZvaWQgdnR5X2hlbGxvIChzdHJ1Y3QgdnR5ICopOworCit2b2lkICp0YWxsX3Z0eV9jdHg7CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvbGlic2NjcC5wYy5pbiBiL29wZW5ic2MvbGlic2NjcC5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGE4ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9saWJzY2NwLnBjLmluCkBAIC0wLDAgKzEsMTAgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBPcGVuQlNDIFNDQ1AgTGliCitEZXNjcmlwdGlvbjogT3BlbkJTQyBTQ0NQIExpYgorVmVyc2lvbjogQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbHNjY3AKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9LwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9vcGVuYnNjLnBjLmluIGIvb3BlbmJzYy9vcGVuYnNjLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYTA3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL29wZW5ic2MucGMuaW4KQEAgLTAsMCArMSwxMSBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJALworCitOYW1lOiBPcGVuQlNDCitEZXNjcmlwdGlvbjogT3BlbkJTQyBiYXNlIHN0YXRpb24gY29udHJvbGxlcgorUmVxdWlyZXM6CitWZXJzaW9uOiBAVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sb3BlbmJzYworQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9zcmMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3YzQxMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDQgQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlIC1JJCh0b3BfYnVpbGRkaXIpCitBTV9DRkxBR1M9LVdhbGwgJChMSUJPU01PQ09SRV9DRkxBR1MpCitBTV9MREZMQUdTID0gJChMSUJPU01PQ09SRV9MSUJTKQorCisjIGJ1aWxkIGN1cnJlbnQgZGlyZWN0b3J5IGJlZm9yZSBidWlsZGluZyBncHJzCitTVUJESVJTID0gLiBpcGFjY2VzcyBncHJzCisKK3NiaW5fUFJPR1JBTVMgPSBic2NfaGFjayBiczExX2NvbmZpZyBpc2Ruc3luYyBic2NfbWdjcAorbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJzYy5hIGxpYm1zYy5hIGxpYnZ0eS5hIGxpYnNjY3AuYQorbm9pbnN0X0hFQURFUlMgPSB2dHkvY2FyZHNoZWxsLmgKKworYnNjZGlyID0gJChsaWJkaXIpCitic2NfTElCUkFSSUVTID0gbGlic2NjcC5hCisKK2xpYmJzY19hX1NPVVJDRVMgPSBhYmlzX3JzbC5jIGFiaXNfbm0uYyBnc21fZGF0YS5jIGdzbV8wNF8wOF91dGlscy5jIFwKKwkJY2hhbl9hbGxvYy5jIGRlYnVnLmMgc29ja2V0LmMgXAorCQlnc21fc3Vic2NyaWJlcl9iYXNlLmMgc3ViY2hhbl9kZW11eC5jIGJzY19ybGwuYyB0cmFuc2FjdGlvbi5jIFwKKwkJdHJhdV9mcmFtZS5jIHRyYXVfbXV4LmMgcGFnaW5nLmMgZTFfY29uZmlnLmMgZTFfaW5wdXQuYyBcCisJCWlucHV0L21pc2RuLmMgaW5wdXQvaXBhY2Nlc3MuYyBcCisJCXRhbGxvY19jdHguYyBzeXN0ZW1faW5mb3JtYXRpb24uYyByZXN0X29jdGV0cy5jIFwKKwkJcnRwX3Byb3h5LmMgYnRzX3NpZW1lbnNfYnMxMS5jIGJ0c19pcGFjY2Vzc19uYW5vYnRzLmMgXAorCQlidHNfdW5rbm93bi5jIGJzY192ZXJzaW9uLmMgYnNjX2FwaS5jCisKK2xpYm1zY19hX1NPVVJDRVMgPSBnc21fc3Vic2NyaWJlci5jIGRiLmMgXAorCQltbmNjLmMgZ3NtXzA0XzA4LmMgZ3NtXzA0XzExLmMgdHJhbnNhY3Rpb24uYyBcCisJCXRva2VuX2F1dGguYyBycmxwLmMgZ3NtXzA0XzgwLmMgdXNzZC5jIHNpbGVudF9jYWxsLmMgXAorCQloYW5kb3Zlcl9sb2dpYy5jIGhhbmRvdmVyX2RlY2lzaW9uLmMgbWVhc19yZXAuYworCitsaWJ2dHlfYV9TT1VSQ0VTID0gdnR5L2J1ZmZlci5jIHZ0eS9jb21tYW5kLmMgdnR5L3ZlY3Rvci5jIHZ0eS92dHkuYyBcCisJCXRlbG5ldF9pbnRlcmZhY2UuYyB2dHlfaW50ZXJmYWNlX2NtZHMuYyB2dHkvdXRpbHMuYworCitsaWJzY2NwX2FfU09VUkNFUyA9IHNjY3Avc2NjcC5jCisKK2JzY19oYWNrX1NPVVJDRVMgPSBic2NfaGFjay5jIGJzY19pbml0LmMgdnR5X2ludGVyZmFjZS5jIHZ0eV9pbnRlcmZhY2VfbGF5ZXIzLmMKK2JzY19oYWNrX0xEQUREID0gbGlibXNjLmEgbGliYnNjLmEgbGlibXNjLmEgbGlidnR5LmEgLWxkbCAtbGRiaSAkKExJQkNSWVBUKQorCiticzExX2NvbmZpZ19TT1VSQ0VTID0gYnMxMV9jb25maWcuYyBhYmlzX25tLmMgZ3NtX2RhdGEuYyBkZWJ1Zy5jIFwKKwkJICAgICAgcnMyMzIuYyBidHNfc2llbWVuc19iczExLmMKKworaXNkbnN5bmNfU09VUkNFUyA9IGlzZG5zeW5jLmMKKworYnNjX21nY3BfU09VUkNFUyA9IG1nY3AvbWdjcF9tYWluLmMgbWdjcC9tZ2NwX3Byb3RvY29sLmMgbWdjcC9tZ2NwX25ldHdvcmsuYyBtZ2NwL21nY3BfdnR5LmMgXAorCQkgICBkZWJ1Zy5jCitic2NfbWdjcF9MREFERCA9IGxpYnZ0eS5hCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9hYmlzX25tLmMgYi9vcGVuYnNjL3NyYy9hYmlzX25tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyODViZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2FiaXNfbm0uYwpAQCAtMCwwICsxLDMwMTUgQEAKKy8qIEdTTSBOZXR3b3JrIE1hbmFnZW1lbnQgKE9NTCkgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorICogM0dQUCBUUyAxMi4yMSB2ZXJzaW9uIDguMC4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDYyMyBWOC4wLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+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+Z3Bycy5uc3ZjKSkKKwkJCXJldHVybiBOVUxMOworCQlvYmogPSAmYnRzLT5ncHJzLm5zdmNbb2JqX2luc3QtPnRyeF9ucl07CisJCWJyZWFrOworCX0KKwlyZXR1cm4gb2JqOworfQorCisvKiBVcGRhdGUgdGhlIGFkbWluaXN0cmF0aXZlIHN0YXRlIG9mIGEgZ2l2ZW4gb2JqZWN0IGluIG91ciBpbi1tZW1vcnkgZGF0YQorICogc3RydWN0dXJlcyBhbmQgc2VuZCBhbiBldmVudCB0byB0aGUgaGlnaGVyIGxheWVyICovCitzdGF0aWMgaW50IHVwZGF0ZV9hZG1zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgICBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqb2JqX2luc3QsIHVfaW50OF90IGFkbV9zdGF0ZSkKK3sKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlICpubV9zdGF0ZSwgbmV3X3N0YXRlOworCXZvaWQgKm9iajsKKwlpbnQgcmM7CisKKwlvYmogPSBvYmpjbGFzczJvYmooYnRzLCBvYmpfY2xhc3MsIG9ial9pbnN0KTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbm1fc3RhdGUgPSBvYmpjbGFzczJubXN0YXRlKGJ0cywgb2JqX2NsYXNzLCBvYmpfaW5zdCk7CisJaWYgKCFubV9zdGF0ZSkKKwkJcmV0dXJuIC0xOworCisJbmV3X3N0YXRlID0gKm5tX3N0YXRlOworCW5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSA9IGFkbV9zdGF0ZTsKKworCXJjID0gbm1fc3RhdGVfZXZlbnQoRVZUX1NUQVRFQ0hHX0FETSwgb2JqX2NsYXNzLCBvYmosIG5tX3N0YXRlLCAmbmV3X3N0YXRlLCBvYmpfaW5zdCk7CisKKwlubV9zdGF0ZS0+YWRtaW5pc3RyYXRpdmUgPSBhZG1fc3RhdGU7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yeF9zdGF0ZWNoZ19yZXAoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbWItPnRyeC0+YnRzOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbm1fc3RhdGUgKm5tX3N0YXRlLCBuZXdfc3RhdGU7CisJaW50IHJjOworCisJREVCVUdQQyhETk0sICJTVEFURSBDSEc6ICIpOworCisJbWVtc2V0KCZuZXdfc3RhdGUsIDAsIHNpemVvZihuZXdfc3RhdGUpKTsKKworCW5tX3N0YXRlID0gb2JqY2xhc3Mybm1zdGF0ZShidHMsIGZvaC0+b2JqX2NsYXNzLCAmZm9oLT5vYmpfaW5zdCk7CisJaWYgKCFubV9zdGF0ZSkgeworCQlERUJVR1BDKEROTSwgInVua25vd24gb2JqZWN0IGNsYXNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbmV3X3N0YXRlID0gKm5tX3N0YXRlOworCQorCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgYnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX09QRVJfU1RBVEUpKSB7CisJCW5ld19zdGF0ZS5vcGVyYXRpb25hbCA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9PUEVSX1NUQVRFKTsKKwkJREVCVUdQQyhETk0sICJPUF9TVEFURT0lcyAiLCBubV9vcHN0YXRlX25hbWUobmV3X3N0YXRlLm9wZXJhdGlvbmFsKSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQVZBSUxfU1RBVFVTKSkgeworCQlpZiAoVExWUF9MRU4oJnRwLCBOTV9BVFRfQVZBSUxfU1RBVFVTKSA9PSAwKQorCQkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSA9IDB4ZmY7CisJCWVsc2UKKwkJCW5ld19zdGF0ZS5hdmFpbGFiaWxpdHkgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQVZBSUxfU1RBVFVTKTsKKwkJREVCVUdQQyhETk0sICJBVkFJTD0lcyglMDJ4KSAiLCBubV9hdmFpbF9uYW1lKG5ld19zdGF0ZS5hdmFpbGFiaWxpdHkpLAorCQkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSk7CisJfSBlbHNlCisJCW5ld19zdGF0ZS5hdmFpbGFiaWxpdHkgPSAweGZmOworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQURNX1NUQVRFKSkgeworCQluZXdfc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQURNX1NUQVRFKTsKKwkJREVCVUdQQyhETk0sICJBRE09JTJzICIsIG5tX2FkbV9uYW1lKG5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSkpOworCX0KKwlERUJVR1BDKEROTSwgIlxuIik7CisKKwlpZiAoKG5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSAhPSAwICYmIG5tX3N0YXRlLT5hZG1pbmlzdHJhdGl2ZSA9PSAwKSB8fAorCSAgICBuZXdfc3RhdGUub3BlcmF0aW9uYWwgIT0gbm1fc3RhdGUtPm9wZXJhdGlvbmFsIHx8CisJICAgIG5ld19zdGF0ZS5hdmFpbGFiaWxpdHkgIT0gbm1fc3RhdGUtPmF2YWlsYWJpbGl0eSkgeworCQkvKiBVcGRhdGUgdGhlIG9wZXJhdGlvbmFsIHN0YXRlIG9mIGEgZ2l2ZW4gb2JqZWN0IGluIG91ciBpbi1tZW1vcnkgZGF0YQorIAkJKiBzdHJ1Y3R1cmVzIGFuZCBzZW5kIGFuIGV2ZW50IHRvIHRoZSBoaWdoZXIgbGF5ZXIgKi8KKwkJdm9pZCAqb2JqID0gb2JqY2xhc3Myb2JqKGJ0cywgZm9oLT5vYmpfY2xhc3MsICZmb2gtPm9ial9pbnN0KTsKKwkJcmMgPSBubV9zdGF0ZV9ldmVudChFVlRfU1RBVEVDSEdfT1BFUiwgZm9oLT5vYmpfY2xhc3MsIG9iaiwgbm1fc3RhdGUsICZuZXdfc3RhdGUsICZmb2gtPm9ial9pbnN0KTsKKwkJbm1fc3RhdGUtPm9wZXJhdGlvbmFsID0gbmV3X3N0YXRlLm9wZXJhdGlvbmFsOworCQlubV9zdGF0ZS0+YXZhaWxhYmlsaXR5ID0gbmV3X3N0YXRlLmF2YWlsYWJpbGl0eTsKKwkJaWYgKG5tX3N0YXRlLT5hZG1pbmlzdHJhdGl2ZSA9PSAwKQorCQkJbm1fc3RhdGUtPmFkbWluaXN0cmF0aXZlID0gbmV3X3N0YXRlLmFkbWluaXN0cmF0aXZlOworCX0KKyNpZiAwCisJaWYgKG9wX3N0YXRlID09IDEpIHsKKwkJLyogdHJ5IHRvIGVuYWJsZSBvYmplY3RzIHRoYXQgYXJlIGRpc2FibGVkICovCisJCWFiaXNfbm1fb3BzdGFydChidHMsIGZvaC0+b2JqX2NsYXNzLAorCQkJCWZvaC0+b2JqX2luc3QuYnRzX25yLAorCQkJCWZvaC0+b2JqX2luc3QudHJ4X25yLAorCQkJCWZvaC0+b2JqX2luc3QudHNfbnIpOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ4X2ZhaWxfZXZ0X3JlcChzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobWIpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJREVCVUdQQyhETk0sICJGYWlsdXJlIEV2ZW50IFJlcG9ydCAiKTsKKwkKKwlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1iLT50cngtPmJ0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0VWRU5UX1RZUEUpKQorCQlERUJVR1BDKEROTSwgIlR5cGU9JXMgIiwgZXZlbnRfdHlwZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9FVkVOVF9UWVBFKSkpOworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfU0VWRVJJVFkpKQorCQlERUJVR1BDKEROTSwgIlNldmVyaXR5PSVzICIsIHNldmVyaXR5X25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX1NFVkVSSVRZKSkpOworCisJREVCVUdQQyhETk0sICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfcmVwb3J0KHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwl1X2ludDhfdCBtdCA9IGZvaC0+bXNnX3R5cGU7CisKKwlkZWJ1Z3BfZm9oKGZvaCk7CisKKwkvL25taC0+Y2ZnLT5yZXBvcnRfY2IobWIsIGZvaCk7CisKKwlzd2l0Y2ggKG10KSB7CisJY2FzZSBOTV9NVF9TVEFURUNIR19FVkVOVF9SRVA6CisJCXJldHVybiBhYmlzX25tX3J4X3N0YXRlY2hnX3JlcChtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfU1dfQUNUSVZBVEVEX1JFUDoKKwkJREVCVUdQQyhETk0sICJTb2Z0d2FyZSBBY3RpdmF0ZWQgUmVwb3J0XG4iKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX1NXX0FDVElWX1JFUCwgbWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQOgorCQlyeF9mYWlsX2V2dF9yZXAobWIpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fRkFJTF9SRVAsIG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9URVNUX1JFUDoKKwkJREVCVUdQQyhETk0sICJUZXN0IFJlcG9ydFxuIik7CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9URVNUX1JFUCwgbWIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKEROTSwgInJlcG9ydGluZyBOTSBNVCAweCUwMnhcbiIsIG10KTsKKwkJYnJlYWs7CisJCQorCX07CisKKwlyZXR1cm4gMDsKK30KKworLyogQWN0aXZhdGUgdGhlIHNwZWNpZmllZCBzb2Z0d2FyZSBpbnRvIHRoZSBCVFMgKi8KK3N0YXRpYyBpbnQgaXBhY2Nfc3dfYWN0aXZhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwgdV9pbnQ4X3QgaTEsCisJCQkgICAgIHVfaW50OF90IGkyLCBjb25zdCB1X2ludDhfdCAqc3dfZGVzYywgdV9pbnQ4X3Qgc3dkZXNjX2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gc3dkZXNjX2xlbjsKKwl1X2ludDhfdCAqdHJhaWxlcjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfQUNUSVZBVEVfU1csIG9ial9jbGFzcywgaTAsIGkxLCBpMik7CisKKwl0cmFpbGVyID0gbXNnYl9wdXQobXNnLCBzd2Rlc2NfbGVuKTsKKwltZW1jcHkodHJhaWxlciwgc3dfZGVzYywgc3dkZXNjX2xlbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworc3RhdGljIGludCBhYmlzX25tX3BhcnNlX3N3X2Rlc2NyKGNvbnN0IHVfaW50OF90ICpzd19kZXNjciwgaW50IHN3X2Rlc2NyX2xlbikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIHN3X2Rlc2NyX2RlZiA9IHsKKwkJLmRlZiA9IHsKKwkJCVtOTV9BVFRfRklMRV9JRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgfSwKKwkJCVtOTV9BVFRfRklMRV9WRVJTSU9OXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCB9LAorCQl9LAorCX07CisKKwl1X2ludDhfdCB0YWc7CisJdV9pbnQxNl90IHRhZ19sZW47CisJY29uc3QgdV9pbnQ4X3QgKnZhbDsKKwlpbnQgb2ZzID0gMCwgbGVuOworCisJLyogQ2xhc3NpYyBUTFYgcGFyc2luZyBkb2Vzbid0IHdvcmsgd2VsbCB3aXRoIFNXX0RFU0NSIGJlY2F1c2Ugb2YgaXQncworCSAqIG5lc3RlZCBuYXR1cmUgYW5kIHRoZSBmYWN0IHlvdSBoYXZlIHRvIGFzc3VtZSBpdCBjb250YWlucyBvbmx5IHR3byBzdWIKKwkgKiB0YWdzIE5NX0FUVF9GSUxFX1ZFUlNJT04gJiBOTV9BVFRfRklMRV9JRCB0byBwYXJzZSBpdCAqLworCisJaWYgKHN3X2Rlc2NyWzBdICE9IE5NX0FUVF9TV19ERVNDUikgeworCQlERUJVR1AoRE5NLCAiU1dfREVTQ1IgYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJb2ZzICs9IDE7CisKKwlsZW4gPSB0bHZfcGFyc2Vfb25lKCZ0YWcsICZ0YWdfbGVuLCAmdmFsLAorCQkmc3dfZGVzY3JfZGVmLCAmc3dfZGVzY3Jbb2ZzXSwgc3dfZGVzY3JfbGVuLW9mcyk7CisJaWYgKGxlbiA8IDAgfHwgKHRhZyAhPSBOTV9BVFRfRklMRV9JRCkpIHsKKwkJREVCVUdQKEROTSwgIkZJTEVfSUQgYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAtMjsKKwl9CisJb2ZzICs9IGxlbjsKKworCWxlbiA9IHRsdl9wYXJzZV9vbmUoJnRhZywgJnRhZ19sZW4sICZ2YWwsCisJCSZzd19kZXNjcl9kZWYsICZzd19kZXNjcltvZnNdLCBzd19kZXNjcl9sZW4tb2ZzKTsKKwlpZiAobGVuIDwgMCB8fCAodGFnICE9IE5NX0FUVF9GSUxFX1ZFUlNJT04pKSB7CisJCURFQlVHUChETk0sICJGSUxFX1ZFUlNJT04gYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAtMzsKKwl9CisJb2ZzICs9IGxlbjsKKworCXJldHVybiBvZnM7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yeF9zd19hY3RfcmVxKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJY29uc3QgdV9pbnQ4X3QgKnN3X2NvbmZpZzsKKwlpbnQgcmV0LCBzd19jb25maWdfbGVuLCBzd19kZXNjcl9sZW47CisKKwlkZWJ1Z3BfZm9oKGZvaCk7CisKKwlERUJVR1BDKEROTSwgIlNXIEFjdGl2YXRlIFJlcXVlc3Q6ICIpOworCisJREVCVUdQKEROTSwgIlNvZnR3YXJlIEFjdGl2YXRlIFJlcXVlc3QsIEFDS2luZyBhbmQgQWN0aXZhdGluZ1xuIik7CisKKwlyZXQgPSBhYmlzX25tX3N3X2FjdF9yZXFfYWNrKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJICAgICAgZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQkJICAgICAgZm9oLT5vYmpfaW5zdC50cnhfbnIsCisJCQkJICAgICAgZm9oLT5vYmpfaW5zdC50c19uciwgMCwKKwkJCQkgICAgICBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKworCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlzd19jb25maWcgPSBUTFZQX1ZBTCgmdHAsIE5NX0FUVF9TV19DT05GSUcpOworCXN3X2NvbmZpZ19sZW4gPSBUTFZQX0xFTigmdHAsIE5NX0FUVF9TV19DT05GSUcpOworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX1NXX0NPTkZJRykpIHsKKwkJREVCVUdQKEROTSwgIlNXIGNvbmZpZyBub3QgZm91bmQhIENhbid0IGNvbnRpbnVlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCURFQlVHUChETk0sICJGb3VuZCBTVyBjb25maWc6ICVzXG4iLCBoZXhkdW1wKHN3X2NvbmZpZywgc3dfY29uZmlnX2xlbikpOworCX0KKworCQkvKiBVc2UgdGhlIGZpcnN0IFNXX0RFU0NSIHByZXNlbnQgaW4gU1cgY29uZmlnICovCisJc3dfZGVzY3JfbGVuID0gYWJpc19ubV9wYXJzZV9zd19kZXNjcihzd19jb25maWcsIHN3X2NvbmZpZ19sZW4pOworCWlmIChzd19kZXNjcl9sZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBpcGFjY19zd19hY3RpdmF0ZShtYi0+dHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLAorCQkJCSBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCQkgZm9oLT5vYmpfaW5zdC50cnhfbnIsCisJCQkJIGZvaC0+b2JqX2luc3QudHNfbnIsCisJCQkJIHN3X2NvbmZpZywgc3dfZGVzY3JfbGVuKTsKK30KKworLyogUmVjZWl2ZSBhIENIQU5HRV9BRE1fU1RBVEVfQUNLLCBwYXJzZSB0aGUgVExWIGFuZCB1cGRhdGUgbG9jYWwgc3RhdGUgKi8KK3N0YXRpYyBpbnQgYWJpc19ubV9yeF9jaGdfYWRtX3N0YXRlX2FjayhzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobWIpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXVfaW50OF90IGFkbV9zdGF0ZTsKKworCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9BRE1fU1RBVEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFkbV9zdGF0ZSA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9BRE1fU1RBVEUpOworCisJcmV0dXJuIHVwZGF0ZV9hZG1zdGF0ZShtYi0+dHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLCAmZm9oLT5vYmpfaW5zdCwgYWRtX3N0YXRlKTsKK30KKworc3RhdGljIGludCBhYmlzX25tX3J4X2xtdF9ldmVudChzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobWIpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJREVCVUdQKEROTSwgIkxNVCBFdmVudCAiKTsKKwlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1iLT50cngtPmJ0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OKSAmJgorCSAgICBUTFZQX0xFTigmdHAsIE5NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OKSA+PSAxKSB7CisJCXVfaW50OF90IG9ub2ZmID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04pOworCQlERUJVR1BDKEROTSwgIkxPRyVzICIsIG9ub2ZmID8gIk9OIiA6ICJPRkYiKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVYpICYmCisJICAgIFRMVlBfTEVOKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVikgPj0gMSkgeworCQl1X2ludDhfdCBsZXZlbCA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVYpOworCQlERUJVR1BDKEROTSwgIkxldmVsPSV1ICIsIGxldmVsKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9CUzExX0xNVF9VU0VSX05BTUUpICYmCisJICAgIFRMVlBfTEVOKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSkgPj0gMSkgeworCQljaGFyICpuYW1lID0gKGNoYXIgKikgVExWUF9WQUwoJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FKTsKKwkJREVCVUdQQyhETk0sICJVc2VybmFtZT0lcyAiLCBuYW1lKTsKKwl9CisJREVCVUdQQyhETk0sICJcbiIpOworCS8qIEZJWE1FOiBwYXJzZSBMTVQgTE9HT04gVElNRSAqLworCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIGEgT01MIE5NIE1lc3NhZ2UgZnJvbSBCVFMgKi8KK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfZm9tKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJdV9pbnQ4X3QgbXQgPSBmb2gtPm1zZ190eXBlOworCisJLyogY2hlY2sgZm9yIHVuc29saWNpdGVkIG1lc3NhZ2UgKi8KKwlpZiAoaXNfcmVwb3J0KG10KSkKKwkJcmV0dXJuIGFiaXNfbm1fcmN2bXNnX3JlcG9ydChtYik7CisKKwlpZiAoaXNfaW5fYXJyKG10LCBzd19sb2FkX21zZ3MsIEFSUkFZX1NJWkUoc3dfbG9hZF9tc2dzKSkpCisJCXJldHVybiBhYmlzX25tX3Jjdm1zZ19zdyhtYik7CisKKwlpZiAoaXNfaW5fYXJyKG10LCBuYWNrcywgQVJSQVlfU0laRShuYWNrcykpKSB7CisJCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJCWRlYnVncF9mb2goZm9oKTsKKworCQlERUJVR1BDKEROTSwgIiVzIE5BQ0sgIiwgZ2V0X3ZhbHVlX3N0cmluZyhuYWNrX25hbWVzLCBtdCkpOworCisJCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpCisJCQlERUJVR1BDKEROTSwgIkNBVVNFPSVzXG4iLAorCQkJCW5hY2tfY2F1c2VfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKSk7CisJCWVsc2UKKwkJCURFQlVHUEMoRE5NLCAiXG4iKTsKKworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fTkFDSywgKHZvaWQqKSAmbXQpOworCQlyZXR1cm4gMDsKKwl9CisjaWYgMAorCS8qIGNoZWNrIGlmIGxhc3QgbWVzc2FnZSBpcyB0byBiZSBhY2tlZCAqLworCWlmIChpc19hY2tfbmFjayhubWgtPmxhc3RfbXNndHlwZSkpIHsKKwkJaWYgKG10ID09IE1UX0FDSyhubWgtPmxhc3RfbXNndHlwZSkpIHsKKwkJCURFQlVHUChETk0sICJyZWNlaXZlZCBBQ0sgKDB4JXgpXG4iLCBmb2gtPm1zZ190eXBlKTsKKwkJCS8qIHdlIGdvdCBvdXIgQUNLLCBjb250aW51ZSBzZW5kaW5nIHRoZSBuZXh0IG1zZyAqLworCQl9IGVsc2UgaWYgKG10ID09IE1UX05BQ0sobm1oLT5sYXN0X21zZ3R5cGUpKSB7CisJCQkvKiB3ZSBnb3QgYSBOQUNLLCBzaWduYWwgdGhpcyB0byB0aGUgY2FsbGVyICovCisJCQlERUJVR1AoRE5NLCAicmVjZWl2ZWQgTkFDSyAoMHgleClcbiIsIGZvaC0+bXNnX3R5cGUpOworCQkJLyogRklYTUU6IHNvbWVob3cgc2lnbmFsIHRoaXMgdG8gdGhlIGNhbGxlciAqLworCQl9IGVsc2UgeworCQkJLyogcmVhbGx5IHN0cmFuZ2UgdGhpbmdzIGhhcHBlbiAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisjZW5kaWYKKworCXN3aXRjaCAobXQpIHsKKwljYXNlIE5NX01UX0NIR19BRE1fU1RBVEVfQUNLOgorCQlyZXR1cm4gYWJpc19ubV9yeF9jaGdfYWRtX3N0YXRlX2FjayhtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfU1dfQUNUX1JFUToKKwkJcmV0dXJuIGFiaXNfbm1fcnhfc3dfYWN0X3JlcShtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9MTVRfU0VTU0lPTjoKKwkJcmV0dXJuIGFiaXNfbm1fcnhfbG10X2V2ZW50KG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9DT05OX01EUk9QX0xJTktfQUNLOgorCQlERUJVR1AoRE5NLCAiQ09OTiBNRFJPUCBMSU5LIEFDS1xuIik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfUkVTVEFSVF9BQ0s6CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9JUEFDQ19SRVNUQVJUX0FDSywgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfUkVTVEFSVF9OQUNLOgorCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fSVBBQ0NfUkVTVEFSVF9OQUNLLCBOVUxMKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yeF9pcGFjYyhzdHJ1Y3QgbXNnYiAqbWIpOworCitzdGF0aWMgaW50IGFiaXNfbm1fcmN2bXNnX21hbnVmKHN0cnVjdCBtc2diICptYikKK3sKKwlpbnQgcmM7CisJaW50IGJ0c190eXBlID0gbWItPnRyeC0+YnRzLT50eXBlOworCisJc3dpdGNoIChidHNfdHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCXJjID0gYWJpc19ubV9yeF9pcGFjYyhtYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiZG9uJ3Qga25vdyBob3cgdG8gcGFyc2UgT01MIGZvciB0aGlzICIKKwkJICAgICAiQlRTIHR5cGUgKCV1KVxuIiwgYnRzX3R5cGUpOworCQlyYyA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogSGlnaC1MZXZlbCBBUEkgKi8KKy8qIEVudHJ5LXBvaW50IHdoZXJlIEwyIE9NTCBmcm9tIEJUUyBlbnRlcnMgdGhlIE5NIGNvZGUgKi8KK2ludCBhYmlzX25tX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKworCS8qIFZhcmlvdXMgY29uc2lzdGVuY3kgY2hlY2tzICovCisJaWYgKG9oLT5wbGFjZW1lbnQgIT0gQUJJU19PTV9QTEFDRU1FTlRfT05MWSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkFCSVMgT01MIHBsYWNlbWVudCAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQlvaC0+cGxhY2VtZW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChvaC0+c2VxdWVuY2UgIT0gMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkFCSVMgT01MIHNlcXVlbmNlIDB4JXggIT0gMHgwMFxuIiwKKwkJCW9oLT5zZXF1ZW5jZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNpZiAwCisJdW5zaWduZWQgaW50IGwyX2xlbiA9IG1zZy0+dGFpbCAtICh1X2ludDhfdCAqKW1zZ2JfbDIobXNnKTsKKwl1bnNpZ25lZCBpbnQgaGxlbiA9IHNpemVvZigqb2gpICsgc2l6ZW9mKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIpOworCWlmIChvaC0+bGVuZ3RoICsgaGxlbiA+IGwyX2xlbikgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkFCSVMgT01MIHRydW5jYXRlZCBtZXNzYWdlICgldSA+ICV1KVxuIiwKKwkJCW9oLT5sZW5ndGggKyBzaXplb2YoKm9oKSwgbDJfbGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChvaC0+bGVuZ3RoICsgaGxlbiA8IGwyX2xlbikKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJBQklTIE9NTCBtZXNzYWdlIHdpdGggZXh0cmEgdHJhaWxlcj8hPyAob2gtPmxlbj0lZCwgc2l6ZW9mX29oPSVkIGwyX2xlbj0lZFxuIiwgb2gtPmxlbmd0aCwgc2l6ZW9mKCpvaCksIGwyX2xlbik7CisjZW5kaWYKKwltc2ctPmwzaCA9ICh1bnNpZ25lZCBjaGFyICopb2ggKyBzaXplb2YoKm9oKTsKKworCXN3aXRjaCAob2gtPm1kaXNjKSB7CisJY2FzZSBBQklTX09NX01ESVNDX0ZPTToKKwkJcmMgPSBhYmlzX25tX3Jjdm1zZ19mb20obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX09NX01ESVNDX01BTlVGOgorCQlyYyA9IGFiaXNfbm1fcmN2bXNnX21hbnVmKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQUJJU19PTV9NRElTQ19NTUk6CisJY2FzZSBBQklTX09NX01ESVNDX1RSQVU6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAidW5pbXBsZW1lbnRlZCBBQklTIE9NTCBtZXNzYWdlIGRpc2NyaW1pbmF0b3IgMHgleFxuIiwKKwkJCW9oLT5tZGlzYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAidW5rbm93biBBQklTIE9NTCBtZXNzYWdlIGRpc2NyaW1pbmF0b3IgMHgleFxuIiwKKwkJCW9oLT5tZGlzYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1zZ2JfZnJlZShtc2cpOworCXJldHVybiByYzsKK30KKworI2lmIDAKKy8qIGluaXRpYWxpemVkIGFsbCByZXNvdXJjZXMgKi8KK3N0cnVjdCBhYmlzX25tX2ggKmFiaXNfbm1faW5pdChzdHJ1Y3QgYWJpc19ubV9jZmcgKmNmZykKK3sKKwlzdHJ1Y3QgYWJpc19ubV9oICpubWg7CisKKwlubWggPSBtYWxsb2Moc2l6ZW9mKCpubWgpKTsKKwlpZiAoIW5taCkKKwkJcmV0dXJuIE5VTEw7CisKKwlubWgtPmNmZyA9IGNmZzsKKworCXJldHVybiBubWg7Cit9CisKKy8qIGZyZWUgYWxsIHJlc291cmNlcyAqLwordm9pZCBhYmlzX25tX2Zpbmkoc3RydWN0IGFiaXNfbm1faCAqbm1oKQoreworCWZyZWUobm1oKTsKK30KKyNlbmRpZgorCisvKiBIZXJlIHdlIGFyZSB0cnlpbmcgdG8gZGVmaW5lIGEgaGlnaC1sZXZlbCBBUEkgdGhhdCBjYW4gYmUgdXNlZCBieQorICogdGhlIGFjdHVhbCBCU0MgaW1wbGVtZW50YXRpb24uICBIb3dldmVyLCB0aGUgYXJjaGl0ZWN0dXJlIGlzIGN1cnJlbnRseQorICogc3RpbGwgdW5kZXIgZGVzaWduLiAgSWRlYWxseSB0aGUgY2FsbHMgdG8gdGhpcyBBUEkgd291bGQgYmUgc3luY2hyb25vdXMsCisgKiB3aGlsZSB0aGUgdW5kZXJseWluZyBzdGFjayBiZWhpbmQgdGhlIEFQaSBydW5zIGluIGEgdHJhZGl0aW9uYWwgc2VsZWN0CisgKiBiYXNlZCBzdGF0ZSBtYWNoaW5lLgorICovCisKKy8qIDYuMiBTb2Z0d2FyZSBMb2FkOiAqLworZW51bSBzd19zdGF0ZSB7CisJU1dfU1RBVEVfTk9ORSwKKwlTV19TVEFURV9XQUlUX0lOSVRBQ0ssCisJU1dfU1RBVEVfV0FJVF9TRUdBQ0ssCisJU1dfU1RBVEVfV0FJVF9FTkRBQ0ssCisJU1dfU1RBVEVfV0FJVF9BQ1RBQ0ssCisJU1dfU1RBVEVfRVJST1IsCit9OworCitzdHJ1Y3QgYWJpc19ubV9zdyB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgdHJ4X25yOworCWdzbV9jYmZuICpjYmZuOworCXZvaWQgKmNiX2RhdGE7CisJaW50IGZvcmNlZDsKKworCS8qIHRoaXMgd2lsbCBiZWNvbWUgcGFydCBvZiB0aGUgU1cgTE9BRCBJTklUSUFURSAqLworCXVfaW50OF90IG9ial9jbGFzczsKKwl1X2ludDhfdCBvYmpfaW5zdGFuY2VbM107CisKKwl1X2ludDhfdCBmaWxlX2lkWzI1NV07CisJdV9pbnQ4X3QgZmlsZV9pZF9sZW47CisKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25bMjU1XTsKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25fbGVuOworCisJdV9pbnQ4X3Qgd2luZG93X3NpemU7CisJdV9pbnQ4X3Qgc2VnX2luX3dpbmRvdzsKKworCWludCBmZDsKKwlGSUxFICpzdHJlYW07CisJZW51bSBzd19zdGF0ZSBzdGF0ZTsKKwlpbnQgbGFzdF9zZWc7Cit9OworCitzdGF0aWMgc3RydWN0IGFiaXNfbm1fc3cgZ19zdzsKKworc3RhdGljIHZvaWQgc3dfYWRkX2ZpbGVfaWRfYW5kX3ZlcihzdHJ1Y3QgYWJpc19ubV9zdyAqc3csIHN0cnVjdCBtc2diICptc2cpCit7CisJaWYgKHN3LT5idHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX05BTk9CVFMpIHsKKwkJbXNnYl92X3B1dChtc2csIE5NX0FUVF9TV19ERVNDUik7CisJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfSUQsIHN3LT5maWxlX2lkX2xlbiwgc3ctPmZpbGVfaWQpOworCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3LT5maWxlX3ZlcnNpb25fbGVuLAorCQkJICAgICAgIHN3LT5maWxlX3ZlcnNpb24pOworCX0gZWxzZSBpZiAoc3ctPmJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkgeworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3ctPmZpbGVfaWRfbGVuLCBzdy0+ZmlsZV9pZCk7CisJCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3LT5maWxlX3ZlcnNpb25fbGVuLAorCQkJICAgICBzdy0+ZmlsZV92ZXJzaW9uKTsKKwl9IGVsc2UgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlBsZWFzZSBpbXBsZW1lbnQgdGhpcyBmb3IgdGhlIEJUUy5cbiIpOworCX0KK30KKworLyogNi4yLjEgLyA4LjMuMTogTG9hZCBEYXRhIEluaXRpYXRlICovCitzdGF0aWMgaW50IHN3X2xvYWRfaW5pdChzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGxlbiA9IDMqMiArIHN3LT5maWxlX2lkX2xlbiArIHN3LT5maWxlX3ZlcnNpb25fbGVuOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9MT0FEX0lOSVQsIHN3LT5vYmpfY2xhc3MsCisJCQlzdy0+b2JqX2luc3RhbmNlWzBdLCBzdy0+b2JqX2luc3RhbmNlWzFdLAorCQkJc3ctPm9ial9pbnN0YW5jZVsyXSk7CisKKwlzd19hZGRfZmlsZV9pZF9hbmRfdmVyKHN3LCBtc2cpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1dJTkRPV19TSVpFLCBzdy0+d2luZG93X3NpemUpOworCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworc3RhdGljIGludCBpc19sYXN0X2xpbmUoRklMRSAqc3RyZWFtKQoreworCWNoYXIgbmV4dF9zZWdfYnVmWzI1Nl07CisJbG9uZyBwb3M7CisKKwkvKiBjaGVjayBpZiB3ZSdyZSBzZW5kaW5nIHRoZSBsYXN0IGxpbmUgKi8KKwlwb3MgPSBmdGVsbChzdHJlYW0pOworCWlmICghZmdldHMobmV4dF9zZWdfYnVmLCBzaXplb2YobmV4dF9zZWdfYnVmKS0yLCBzdHJlYW0pKSB7CisJCWZzZWVrKHN0cmVhbSwgcG9zLCBTRUVLX1NFVCk7CisJCXJldHVybiAxOworCX0KKworCWZzZWVrKHN0cmVhbSwgcG9zLCBTRUVLX1NFVCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIDYuMi4yIC8gOC4zLjIgTG9hZCBEYXRhIFNlZ21lbnQgKi8KK3N0YXRpYyBpbnQgc3dfbG9hZF9zZWdtZW50KHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJY2hhciBzZWdfYnVmWzI1Nl07CisJY2hhciAqbGluZV9idWYgPSBzZWdfYnVmKzI7CisJdW5zaWduZWQgY2hhciAqdGx2OworCXVfaW50OF90IGxlbjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKworCXN3aXRjaCAoc3ctPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWlmIChmZ2V0cyhsaW5lX2J1Ziwgc2l6ZW9mKHNlZ19idWYpLTIsIHN3LT5zdHJlYW0pID09IE5VTEwpIHsKKwkJCXBlcnJvcigiZmdldHMgcmVhZGluZyBzZWdtZW50Iik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzZWdfYnVmWzBdID0gMHgwMDsKKworCQkvKiBjaGVjayBpZiB3ZSdyZSBzZW5kaW5nIHRoZSBsYXN0IGxpbmUgKi8KKwkJc3ctPmxhc3Rfc2VnID0gaXNfbGFzdF9saW5lKHN3LT5zdHJlYW0pOworCQlpZiAoc3ctPmxhc3Rfc2VnKQorCQkJc2VnX2J1ZlsxXSA9IDA7CisJCWVsc2UKKwkJCXNlZ19idWZbMV0gPSAxICsgc3ctPnNlZ19pbl93aW5kb3crKzsKKworCQlsZW4gPSBzdHJsZW4obGluZV9idWYpICsgMjsKKwkJdGx2ID0gbXNnYl9wdXQobXNnLCBUTFZfR1JPU1NfTEVOKGxlbikpOworCQl0bHZfcHV0KHRsdiwgTk1fQVRUX0JTMTFfRklMRV9EQVRBLCBsZW4sICh1X2ludDhfdCAqKXNlZ19idWYpOworCQkvKiBCUzExIHdhbnRzIENSICsgTEYgaW4gZXhjZXNzIG9mIHRoZSBUTFYgbGVuZ3RoICE/ISAqLworCQl0bHZbMV0gLT0gMjsKKworCQkvKiB3ZSBvbmx5IG5vdyBrbm93IHRoZSBleGFjdCBsZW5ndGggZm9yIHRoZSBPTSBoZHIgKi8KKwkJbGVuID0gc3RybGVuKGxpbmVfYnVmKSsyOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOiB7CisJCXN0YXRpY19hc3NlcnQoc2l6ZW9mKHNlZ19idWYpID49IElQQUNDX1NFR01FTlRfU0laRSwgYnVmZmVyX2JpZ19lbm91Z2gpOworCQlsZW4gPSByZWFkKHN3LT5mZCwgJnNlZ19idWYsIElQQUNDX1NFR01FTlRfU0laRSk7CisJCWlmIChsZW4gPCAwKSB7CisJCQlwZXJyb3IoInJlYWQgZmFpbGVkIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChsZW4gIT0gSVBBQ0NfU0VHTUVOVF9TSVpFKQorCQkJc3ctPmxhc3Rfc2VnID0gMTsKKworCQkrK3N3LT5zZWdfaW5fd2luZG93OworCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9JUEFDQ19GSUxFX0RBVEEsIGxlbiwgKGNvbnN0IHVfaW50OF90ICopIHNlZ19idWYpOworCQlsZW4gKz0gMzsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAic3dfbG9hZF9zZWdtZW50IG5lZWRzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgQlRTLlxuIik7CisJCS8qIEZJWE1FOiBPdGhlciBCVFMgdHlwZXMgKi8KKwkJcmV0dXJuIC0xOworCX0KKworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9MT0FEX1NFRywgc3ctPm9ial9jbGFzcywKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMF0sIHN3LT5vYmpfaW5zdGFuY2VbMV0sCisJCQlzdy0+b2JqX2luc3RhbmNlWzJdKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworLyogNi4yLjQgLyA4LjMuNCBMb2FkIERhdGEgRW5kICovCitzdGF0aWMgaW50IHN3X2xvYWRfZW5kKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMioyICsgc3ctPmZpbGVfaWRfbGVuICsgc3ctPmZpbGVfdmVyc2lvbl9sZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0xPQURfRU5ELCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJc3dfYWRkX2ZpbGVfaWRfYW5kX3ZlcihzdywgbXNnKTsKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHN3LT5idHMsIG1zZyk7Cit9CisKKy8qIEFjdGl2YXRlIHRoZSBzcGVjaWZpZWQgc29mdHdhcmUgaW50byB0aGUgQlRTICovCitzdGF0aWMgaW50IHN3X2FjdGl2YXRlKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMioyICsgc3ctPmZpbGVfaWRfbGVuICsgc3ctPmZpbGVfdmVyc2lvbl9sZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0FDVElWQVRFX1NXLCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJLyogRklYTUU6IHRoaXMgaXMgQlMxMSBzcGVjaWZpYyBmb3JtYXQgKi8KKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3ctPmZpbGVfaWRfbGVuLCBzdy0+ZmlsZV9pZCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3ctPmZpbGVfdmVyc2lvbl9sZW4sCisJCSAgICAgc3ctPmZpbGVfdmVyc2lvbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHN3LT5idHMsIG1zZyk7Cit9CisKK3N0cnVjdCBzZHBfZmlybXdhcmUgeworCWNoYXIgbWFnaWNbNF07CisJY2hhciBtb3JlX21hZ2ljWzRdOworCXVuc2lnbmVkIGludCBoZWFkZXJfbGVuZ3RoOworCXVuc2lnbmVkIGludCBmaWxlX2xlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgaW50IHBhcnNlX3NkcF9oZWFkZXIoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN0cnVjdCBzZHBfZmlybXdhcmUgZmlybXdhcmVfaGVhZGVyOworCWludCByYzsKKwlzdHJ1Y3Qgc3RhdCBzdGF0OworCisJcmMgPSByZWFkKHN3LT5mZCwgJmZpcm13YXJlX2hlYWRlciwgc2l6ZW9mKGZpcm13YXJlX2hlYWRlcikpOworCWlmIChyYyAhPSBzaXplb2YoZmlybXdhcmVfaGVhZGVyKSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkNvdWxkIG5vdCByZWFkIFNEUCBmaWxlIGhlYWRlci5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHN0cm5jbXAoZmlybXdhcmVfaGVhZGVyLm1hZ2ljLCAiIFNEUCIsIDQpICE9IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUaGUgbWFnaWMgbnVtYmVyMSBpcyB3cm9uZy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzBdICE9IDB4MTAgfHwKKwkgICAgZmlybXdhcmVfaGVhZGVyLm1vcmVfbWFnaWNbMV0gIT0gMHgwMiB8fAorCSAgICBmaXJtd2FyZV9oZWFkZXIubW9yZV9tYWdpY1syXSAhPSAweDAwIHx8CisJICAgIGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzNdICE9IDB4MDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUaGUgbW9yZSBtYWdpYyBudW1iZXIgaXMgd3JvbmcuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJaWYgKGZzdGF0KHN3LT5mZCwgJnN0YXQpID09IC0xKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQ291bGQgbm90IHN0YXQgdGhlIGZpbGUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChudG9obChmaXJtd2FyZV9oZWFkZXIuZmlsZV9sZW5ndGgpICE9IHN0YXQuc3Rfc2l6ZSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRoZSBmaWxlc2l6ZXMgZG8gbm90IG1hdGNoLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBnbyBiYWNrIHRvIHRoZSBzdGFydCBhcyB3ZSBjaGVja2VkIHRoZSB3aG9sZSBmaWxlc2l6ZS4uICovCisJbHNlZWsoc3ctPmZkLCAwbCwgU0VFS19TRVQpOworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgIlRoZSBpcGFjY2VzcyBTRFAgaGVhZGVyIGlzIG5vdCBmdWxseSB1bmRlcnN0b29kLlxuIgorCQkJICAgICAgICJUaGVyZSBtaWdodCBiZSBjaGVja3N1bXMgaW4gdGhlIGZpbGUgdGhhdCBhcmUgbm90XG4iCisJCQkgICAgICAgInZlcmlmaWVkIGFuZCBpbmNvbXBsZXRlIGZpcm13YXJlIG1pZ2h0IGJlIGZsYXNoZWQuXG4iCisJCQkgICAgICAgIlRoZXJlIGlzIGFic29sdXRlbHkgbm8gV0FSUkFOVFkgdGhhdCBmbGFzaGluZyB3aWxsXG4iCisJCQkgICAgICAgIndvcmsuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd19vcGVuX2ZpbGUoc3RydWN0IGFiaXNfbm1fc3cgKnN3LCBjb25zdCBjaGFyICpmbmFtZSkKK3sKKwljaGFyIGZpbGVfaWRbMTIrMV07CisJY2hhciBmaWxlX3ZlcnNpb25bODArMV07CisJaW50IHJjOworCisJc3ctPmZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkpOworCWlmIChzdy0+ZmQgPCAwKQorCQlyZXR1cm4gc3ctPmZkOworCisJc3dpdGNoIChzdy0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJc3ctPnN0cmVhbSA9IGZkb3Blbihzdy0+ZmQsICJyIik7CisJCWlmICghc3ctPnN0cmVhbSkgeworCQkJcGVycm9yKCJmZG9wZW4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKiByZWFkIGZpcnN0IGxpbmUgYW5kIHBhcnNlIGZpbGUgSUQgYW5kIFZFUlNJT04gKi8KKwkJcmMgPSBmc2NhbmYoc3ctPnN0cmVhbSwgIkAoIyklMTJzOiU4MHNcclxuIiwKKwkJCSAgICBmaWxlX2lkLCBmaWxlX3ZlcnNpb24pOworCQlpZiAocmMgIT0gMikgeworCQkJcGVycm9yKCJwYXJzaW5nIGhlYWRlciBsaW5lIG9mIHNvZnR3YXJlIGZpbGUiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlzdHJjcHkoKGNoYXIgKilzdy0+ZmlsZV9pZCwgZmlsZV9pZCk7CisJCXN3LT5maWxlX2lkX2xlbiA9IHN0cmxlbihmaWxlX2lkKTsKKwkJc3RyY3B5KChjaGFyICopc3ctPmZpbGVfdmVyc2lvbiwgZmlsZV92ZXJzaW9uKTsKKwkJc3ctPmZpbGVfdmVyc2lvbl9sZW4gPSBzdHJsZW4oZmlsZV92ZXJzaW9uKTsKKwkJLyogcmV3aW5kIHRvIHN0YXJ0IG9mIGZpbGUgKi8KKwkJcmV3aW5kKHN3LT5zdHJlYW0pOworCQlicmVhazsJCisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJLyogVE9ETzogZXh0cmFjdCB0aGF0IGZyb20gdGhlIGZpbGVuYW1lIG9yIGNvbnRlbnQgKi8KKwkJcmMgPSBwYXJzZV9zZHBfaGVhZGVyKHN3KTsKKwkJaWYgKHJjIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcGFyc2UgdGhlIGlwYWNjZXNzIFNEUCBoZWFkZXJcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJc3RyY3B5KChjaGFyICopc3ctPmZpbGVfaWQsICJpZCIpOworCQlzdy0+ZmlsZV9pZF9sZW4gPSAzOworCQlzdHJjcHkoKGNoYXIgKilzdy0+ZmlsZV92ZXJzaW9uLCAidmVyc2lvbiIpOworCQlzdy0+ZmlsZV92ZXJzaW9uX2xlbiA9IDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFdlIGRvbid0IGtub3cgaG93IHRvIHRyZWF0IHRoZW0geWV0ICovCisJCWNsb3NlKHN3LT5mZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCQorc3RhdGljIHZvaWQgc3dfY2xvc2VfZmlsZShzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJc3dpdGNoIChzdy0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJZmNsb3NlKHN3LT5zdHJlYW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljbG9zZShzdy0+ZmQpOworCQlicmVhazsKKwl9Cit9CisKKy8qIEZpbGwgdGhlIHdpbmRvdyAqLworc3RhdGljIGludCBzd19maWxsX3dpbmRvdyhzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJaW50IHJjOworCisJd2hpbGUgKHN3LT5zZWdfaW5fd2luZG93IDwgc3ctPndpbmRvd19zaXplKSB7CisJCXJjID0gc3dfbG9hZF9zZWdtZW50KHN3KTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJaWYgKHN3LT5sYXN0X3NlZykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGJhY2sgZnVuY3Rpb24gZnJvbSBhYmlzX25tX3Jjdm1zZygpIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfc3coc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCWludCByYyA9IC0xOworCXN0cnVjdCBhYmlzX25tX3N3ICpzdyA9ICZnX3N3OworCWVudW0gc3dfc3RhdGUgb2xkX3N0YXRlID0gc3ctPnN0YXRlOworCQorCS8vREVCVUdQKEROTSwgInN0YXRlICV1LCBOTSBNVCAweCUwMnhcbiIsIHN3LT5zdGF0ZSwgZm9oLT5tc2dfdHlwZSk7CisKKwlzd2l0Y2ggKHN3LT5zdGF0ZSkgeworCWNhc2UgU1dfU1RBVEVfV0FJVF9JTklUQUNLOgorCQlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwkJY2FzZSBOTV9NVF9MT0FEX0lOSVRfQUNLOgorCQkJLyogZmlsbCB3aW5kb3cgd2l0aCBzZWdtZW50cyAqLworCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0xPQURfSU5JVF9BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJcmMgPSBzd19maWxsX3dpbmRvdyhzdyk7CisJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX1NFR0FDSzsKKwkJCWJyZWFrOworCQljYXNlIE5NX01UX0xPQURfSU5JVF9OQUNLOgorCQkJaWYgKHN3LT5mb3JjZWQpIHsKKwkJCQlERUJVR1AoRE5NLCAiRk9SQ0VEOiBJZ25vcmluZyBTb2Z0d2FyZSBMb2FkICIKKwkJCQkJIkluaXQgTkFDS1xuIik7CisJCQkJaWYgKHN3LT5jYmZuKQorCQkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCQkgTk1fTVRfTE9BRF9JTklUX0FDSywgbWIsCisJCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJCXJjID0gc3dfZmlsbF93aW5kb3coc3cpOworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfU0VHQUNLOworCQkJfSBlbHNlIHsKKwkJCQlERUJVR1AoRE5NLCAiU29mdHdhcmUgTG9hZCBJbml0IE5BQ0tcbiIpOworCQkJCS8qIEZJWE1FOiBjYXVzZSAqLworCQkJCWlmIChzdy0+Y2JmbikKKwkJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkJIE5NX01UX0xPQURfSU5JVF9OQUNLLCBtYiwKKwkJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfRVJST1I7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFNXX1NUQVRFX1dBSVRfU0VHQUNLOgorCQlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwkJY2FzZSBOTV9NVF9MT0FEX1NFR19BQ0s6CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfTE9BRF9TRUdfQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCXN3LT5zZWdfaW5fd2luZG93ID0gMDsKKwkJCWlmICghc3ctPmxhc3Rfc2VnKSB7CisJCQkJLyogZmlsbCB3aW5kb3cgd2l0aCBtb3JlIHNlZ21lbnRzICovCisJCQkJcmMgPSBzd19maWxsX3dpbmRvdyhzdyk7CisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9TRUdBQ0s7CisJCQl9IGVsc2UgeworCQkJCS8qIGVuZCB0aGUgdHJhbnNmZXIgKi8KKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX0VOREFDSzsKKwkJCQlyYyA9IHN3X2xvYWRfZW5kKHN3KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE5NX01UX0xPQURfQUJPUlQ6CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfTE9BRF9BQk9SVCwgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFNXX1NUQVRFX1dBSVRfRU5EQUNLOgorCQlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwkJY2FzZSBOTV9NVF9MT0FEX0VORF9BQ0s6CisJCQlzd19jbG9zZV9maWxlKHN3KTsKKwkJCURFQlVHUChETk0sICJTb2Z0d2FyZSBMb2FkIEVuZCAoQlRTICV1KVxuIiwKKwkJCQlzdy0+YnRzLT5ucik7CisJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9OT05FOworCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0xPQURfRU5EX0FDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBOTV9NVF9MT0FEX0VORF9OQUNLOgorCQkJaWYgKHN3LT5mb3JjZWQpIHsKKwkJCQlERUJVR1AoRE5NLCAiRk9SQ0VEOiBJZ25vcmluZyBTb2Z0d2FyZSBMb2FkIgorCQkJCQkiRW5kIE5BQ0tcbiIpOworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCQkJaWYgKHN3LT5jYmZuKQorCQkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCQkgTk1fTVRfTE9BRF9FTkRfQUNLLCBtYiwKKwkJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQl9IGVsc2UgeworCQkJCURFQlVHUChETk0sICJTb2Z0d2FyZSBMb2FkIEVuZCBOQUNLXG4iKTsKKwkJCQkvKiBGSVhNRTogY2F1c2UgKi8KKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9FUlJPUjsKKwkJCQlpZiAoc3ctPmNiZm4pCisJCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJCSBOTV9NVF9MT0FEX0VORF9OQUNLLCBtYiwKKwkJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCWNhc2UgU1dfU1RBVEVfV0FJVF9BQ1RBQ0s6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0FDVElWQVRFX1NXX0FDSzoKKwkJCS8qIHdlJ3JlIGRvbmUgKi8KKwkJCURFQlVHUChETk0sICJBY3RpdmF0ZSBTb2Z0d2FyZSBET05FIVxuIik7CisJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9OT05FOworCQkJcmMgPSAwOworCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0FDVElWQVRFX1NXX0FDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19OQUNLOgorCQkJREVCVUdQKEROTSwgIkFjdGl2YXRlIFNvZnR3YXJlIE5BQ0tcbiIpOworCQkJLyogRklYTUU6IGNhdXNlICovCisJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9FUlJPUjsKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9BQ1RJVkFURV9TV19OQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBTV19TVEFURV9OT05FOgorCQlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwkJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFNXX1NUQVRFX0VSUk9SOgorCQlicmVhazsKKwl9CisKKwlpZiAocmMpCisJCURFQlVHUChETk0sICJ1bmV4cGVjdGVkIE5NIE1UIDB4JTAyeCBpbiBzdGF0ZSAldSAtPiAldVxuIiwKKwkJCWZvaC0+bXNnX3R5cGUsIG9sZF9zdGF0ZSwgc3ctPnN0YXRlKTsKKworCXJldHVybiByYzsKK30KKworLyogTG9hZCB0aGUgc3BlY2lmaWVkIHNvZnR3YXJlIGludG8gdGhlIEJUUyAqLworaW50IGFiaXNfbm1fc29mdHdhcmVfbG9hZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdHJ4X25yLCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCSAgdV9pbnQ4X3Qgd2luX3NpemUsIGludCBmb3JjZWQsCisJCQkgIGdzbV9jYmZuICpjYmZuLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBhYmlzX25tX3N3ICpzdyA9ICZnX3N3OworCWludCByYzsKKworCURFQlVHUChETk0sICJTb2Z0d2FyZSBMb2FkIChCVFMgJXUsIEZpbGUgXCIlc1wiKVxuIiwKKwkJYnRzLT5uciwgZm5hbWUpOworCisJaWYgKHN3LT5zdGF0ZSAhPSBTV19TVEFURV9OT05FKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3ctPmJ0cyA9IGJ0czsKKwlzdy0+dHJ4X25yID0gdHJ4X25yOworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlzdy0+b2JqX2NsYXNzID0gTk1fT0NfU0lURV9NQU5BR0VSOworCQlzdy0+b2JqX2luc3RhbmNlWzBdID0gMHhmZjsKKwkJc3ctPm9ial9pbnN0YW5jZVsxXSA9IDB4ZmY7CisJCXN3LT5vYmpfaW5zdGFuY2VbMl0gPSAweGZmOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlzdy0+b2JqX2NsYXNzID0gTk1fT0NfQkFTRUJfVFJBTlNDOworCQlzdy0+b2JqX2luc3RhbmNlWzBdID0gc3ctPmJ0cy0+bnI7CisJCXN3LT5vYmpfaW5zdGFuY2VbMV0gPSBzdy0+dHJ4X25yOworCQlzdy0+b2JqX2luc3RhbmNlWzJdID0gMHhmZjsKKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfVU5LTk9XTjoKKwlkZWZhdWx0OgorCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJTb2Z0d2FyZSBMb2FkIG5vdCBwcm9wZXJseSBpbXBsZW1lbnRlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCX0KKwlzdy0+d2luZG93X3NpemUgPSB3aW5fc2l6ZTsKKwlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX0lOSVRBQ0s7CisJc3ctPmNiZm4gPSBjYmZuOworCXN3LT5jYl9kYXRhID0gY2JfZGF0YTsKKwlzdy0+Zm9yY2VkID0gZm9yY2VkOworCisJcmMgPSBzd19vcGVuX2ZpbGUoc3csIGZuYW1lKTsKKwlpZiAocmMgPCAwKSB7CisJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gc3dfbG9hZF9pbml0KHN3KTsKK30KKworaW50IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgYWJpc19ubV9zdyAqc3cgPSAmZ19zdzsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgcmMsIHBlcmNlbnQ7CisKKwlyYyA9IGZzdGF0KHN3LT5mZCwgJnN0KTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiRVJST1IgZHVyaW5nIHN0YXQiKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChzdy0+c3RyZWFtKQorCQlwZXJjZW50ID0gKGZ0ZWxsKHN3LT5zdHJlYW0pICogMTAwKSAvIHN0LnN0X3NpemU7CisJZWxzZQorCQlwZXJjZW50ID0gKGxzZWVrKHN3LT5mZCwgMCwgU0VFS19DVVIpICogMTAwKSAvIHN0LnN0X3NpemU7CisJcmV0dXJuIHBlcmNlbnQ7Cit9CisKKy8qIEFjdGl2YXRlIHRoZSBzcGVjaWZpZWQgc29mdHdhcmUgaW50byB0aGUgQlRTICovCitpbnQgYWJpc19ubV9zb2Z0d2FyZV9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCSAgICAgIGdzbV9jYmZuICpjYmZuLCB2b2lkICpjYl9kYXRhKQoreworCXN0cnVjdCBhYmlzX25tX3N3ICpzdyA9ICZnX3N3OworCWludCByYzsKKworCURFQlVHUChETk0sICJBY3RpdmF0aW5nIFNvZnR3YXJlIChCVFMgJXUsIEZpbGUgXCIlc1wiKVxuIiwKKwkJYnRzLT5uciwgZm5hbWUpOworCisJaWYgKHN3LT5zdGF0ZSAhPSBTV19TVEFURV9OT05FKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3ctPmJ0cyA9IGJ0czsKKwlzdy0+b2JqX2NsYXNzID0gTk1fT0NfU0lURV9NQU5BR0VSOworCXN3LT5vYmpfaW5zdGFuY2VbMF0gPSAweGZmOworCXN3LT5vYmpfaW5zdGFuY2VbMV0gPSAweGZmOworCXN3LT5vYmpfaW5zdGFuY2VbMl0gPSAweGZmOworCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfQUNUQUNLOworCXN3LT5jYmZuID0gY2JmbjsKKwlzdy0+Y2JfZGF0YSA9IGNiX2RhdGE7CisKKwkvKiBPcGVuIHRoZSBmaWxlIGluIG9yZGVyIHRvIGZpbGwgc29tZSBzdyBzdHJ1Y3QgbWVtYmVycyAqLworCXJjID0gc3dfb3Blbl9maWxlKHN3LCBmbmFtZSk7CisJaWYgKHJjIDwgMCkgeworCQlzdy0+c3RhdGUgPSBTV19TVEFURV9OT05FOworCQlyZXR1cm4gcmM7CisJfQorCXN3X2Nsb3NlX2ZpbGUoc3cpOworCisJcmV0dXJuIHN3X2FjdGl2YXRlKHN3KTsKK30KKworc3RhdGljIHZvaWQgZmlsbF9ubV9jaGFubmVsKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoLCB1X2ludDhfdCBidHNfcG9ydCwKKwkJICAgICAgIHVfaW50OF90IHRzX25yLCB1X2ludDhfdCBzdWJzbG90X25yKQoreworCWNoLT5hdHRyaWIgPSBOTV9BVFRfQUJJU19DSEFOTkVMOworCWNoLT5idHNfcG9ydCA9IGJ0c19wb3J0OworCWNoLT50aW1lc2xvdCA9IHRzX25yOworCWNoLT5zdWJzbG90ID0gc3Vic2xvdF9ucjsJCit9CisKK2ludCBhYmlzX25tX2VzdGFibGlzaF90ZWkoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgdHJ4X25yLAorCQkJICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCwKKwkJCSAgdV9pbnQ4X3QgdGVpKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqY2g7CisJdV9pbnQ4X3QgbGVuID0gc2l6ZW9mKCpjaCkgKyAyOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0VTVEFCTElTSF9URUksIE5NX09DX1JBRElPX0NBUlJJRVIsCisJCQlidHMtPmJ0c19uciwgdHJ4X25yLCAweGZmKTsKKwkKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9URUksIHRlaSk7CisKKwljaCA9IChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjaCkpOworCWZpbGxfbm1fY2hhbm5lbChjaCwgZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIGNvbm5lY3Qgc2lnbmFsbGluZyBvZiBvbmUgKEJUUyxUUlgpIHRvIGEgcGFydGljdWxhciB0aW1lc2xvdCBvbiB0aGUgRTEgKi8KK2ludCBhYmlzX25tX2Nvbm5fdGVycl9zaWduKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LAorCQkJICAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRyeC0+YnRzOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqY2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIHNpemVvZigqY2gpLCBOTV9NVF9DT05OX1RFUlJfU0lHTiwKKwkJCU5NX09DX1JBRElPX0NBUlJJRVIsIGJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmKTsKKwkKKwljaCA9IChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjaCkpOworCWZpbGxfbm1fY2hhbm5lbChjaCwgZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKyNpZiAwCitpbnQgYWJpc19ubV9kaXNjX3RlcnJfc2lnbihzdHJ1Y3QgYWJpc19ubV9oICpoLCBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqaW5zdCwKKwkJCSAgIHN0cnVjdCBhYmlzX25tX2FiaXNfY2hhbm5lbCAqY2hhbikKK3sKK30KKyNlbmRpZgorCitpbnQgYWJpc19ubV9jb25uX3RlcnJfdHJhZihzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLAorCQkJICAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsCisJCQkgICB1X2ludDhfdCBlMV9zdWJzbG90KQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB0cy0+dHJ4LT5idHM7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgc2l6ZW9mKCpjaCksIE5NX01UX0NPTk5fVEVSUl9UUkFGLAorCQkJTk1fT0NfQ0hBTk5FTCwgYnRzLT5idHNfbnIsIHRzLT50cngtPm5yLCB0cy0+bnIpOworCisJY2ggPSAoc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqY2gpKTsKKwlmaWxsX25tX2NoYW5uZWwoY2gsIGUxX3BvcnQsIGUxX3RpbWVzbG90LCBlMV9zdWJzbG90KTsKKworCURFQlVHUChETk0sICJDT05ORUNUIFRFUlIgVFJBRiBVbT0lcyBFMT0oJXUsJXUsJXUpXG4iLAorCQlnc21fdHNfbmFtZSh0cyksCisJCWUxX3BvcnQsIGUxX3RpbWVzbG90LCBlMV9zdWJzbG90KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisjaWYgMAoraW50IGFiaXNfbm1fZGlzY190ZXJyX3RyYWYoc3RydWN0IGFiaXNfbm1faCAqaCwgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKmluc3QsCisJCQkgICBzdHJ1Y3QgYWJpc19ubV9hYmlzX2NoYW5uZWwgKmNoYW4sCisJCQkgICB1X2ludDhfdCBzdWJjaGFuKQoreworfQorI2VuZGlmCisKKy8qIENoYXB0ZXIgOC42LjEgKi8KK2ludCBhYmlzX25tX3NldF9idHNfYXR0cihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCAqYXR0ciwgaW50IGF0dHJfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCAqY3VyOworCisJREVCVUdQKEROTSwgIlNldCBCVFMgQXR0ciAoYnRzPSVkKVxuIiwgYnRzLT5ucik7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBhdHRyX2xlbiwgTk1fTVRfU0VUX0JUU19BVFRSLCBOTV9PQ19CVFMsIGJ0cy0+YnRzX25yLCAweGZmLCAweGZmKTsKKwljdXIgPSBtc2diX3B1dChtc2csIGF0dHJfbGVuKTsKKwltZW1jcHkoY3VyLCBhdHRyLCBhdHRyX2xlbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogQ2hhcHRlciA4LjYuMiAqLworaW50IGFiaXNfbm1fc2V0X3JhZGlvX2F0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90ICpjdXI7CisKKwlERUJVR1AoRE5NLCAiU2V0IFRSWCBBdHRyIChidHM9JWQsdHJ4PSVkKVxuIiwgdHJ4LT5idHMtPm5yLCB0cngtPm5yKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGF0dHJfbGVuLCBOTV9NVF9TRVRfUkFESU9fQVRUUiwgTk1fT0NfUkFESU9fQ0FSUklFUiwKKwkJCXRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYpOworCWN1ciA9IG1zZ2JfcHV0KG1zZywgYXR0cl9sZW4pOworCW1lbWNweShjdXIsIGF0dHIsIGF0dHJfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2NoYW5fY29tYihzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBjaGFuX2NvbWIpCit7CisJaW50IGk7CisKKwkvKiBBcyBpdCB0dXJucyBvdXQsIHRoZSBCUy0xMSBoYXMgc29tZSB2ZXJ5IHBlY3VsaWFyIHJlc3RyaWN0aW9ucworCSAqIG9uIHRoZSBjaGFubmVsIGNvbWJpbmF0aW9ucyBpdCBhbGxvd3MgKi8KKwlzd2l0Y2ggKHRzLT50cngtPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjoKKwkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmMjoKKwkJCS8qIG5vdCBzdXBwb3J0ZWQgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIE5NX0NIQU5DX1NEQ0NIOgorCQkJLyogb25seSBvbmUgU0RDQ0gvOCBwZXIgVFJYICovCisJCQlmb3IgKGkgPSAwOyBpIDwgVFJYX05SX1RTOyBpKyspIHsKKwkJCQlpZiAoaSA9PSB0cy0+bnIpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICh0cy0+dHJ4LT50c1tpXS5ubV9jaGFuX2NvbWIgPT0KKwkJCQkgICAgTk1fQ0hBTkNfU0RDQ0gpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJLyogbm90IGFsbG93ZWQgZm9yIFRTMCBvZiBCQ0NILVRSWCAqLworCQkJaWYgKHRzLT50cnggPT0gdHMtPnRyeC0+YnRzLT5jMCAmJgorCQkJICAgIHRzLT5uciA9PSAwKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCS8qIG5vdCBvbiB0aGUgc2FtZSBUUlggdGhhdCBoYXMgYSBCQ0NIK1NEQ0NINAorCQkJICogY29tYmluYXRpb24gKi8KKwkJCWlmICh0cy0+dHJ4ID09IHRzLT50cngtPmJ0cy0+YzAgJiYKKwkJCSAgICAodHMtPnRyeC0+dHNbMF0ubm1fY2hhbl9jb21iID09IDUgfHwKKwkJCSAgICAgdHMtPnRyeC0+dHNbMF0ubm1fY2hhbl9jb21iID09IDgpKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIE5NX0NIQU5DX21haW5CQ0NIOgorCQljYXNlIE5NX0NIQU5DX0JDQ0hDb21iOgorCQkJLyogYWxsb3dlZCBvbmx5IGZvciBUUzAgb2YgQzAgKi8KKwkJCWlmICh0cy0+dHJ4ICE9IHRzLT50cngtPmJ0cy0+YzAgfHwKKwkJCSAgICB0cy0+bnIgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIE5NX0NIQU5DX0JDQ0g6CisJCQkvKiBhbGxvd2VkIG9ubHkgZm9yIFRTIDIvNC82IG9mIEMwICovCisJCQlpZiAodHMtPnRyeCAhPSB0cy0+dHJ4LT5idHMtPmMwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHRzLT5uciAhPSAyICYmIHRzLT5uciAhPSA0ICYmCisJCQkgICAgdHMtPm5yICE9IDYpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSA4OiAvKiB0aGlzIGlzIG5vdCBsaWtlIDA4LjU4LCBidXQgaW4gZmFjdAorCQkJICogRkNDSCtTQ0grQkNDSCtDQ0NIK1NEQ0NILzQrU0FDQ0gvQzQrQ0JDSCAqLworCQkJLyogRklYTUU6IG9ubHkgb25lIENCQ0ggYWxsb3dlZCBwZXIgY2VsbCAqLworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJc3dpdGNoICh0cy0+bnIpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHRzLT50cngtPm5yID09IDApIHsKKwkJCQkvKiBvbmx5IG9uIFRSWDAgKi8KKwkJCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQkJCWNhc2UgTk1fQ0hBTkNfQkNDSDoKKwkJCQljYXNlIE5NX0NIQU5DX21haW5CQ0NIOgorCQkJCWNhc2UgTk1fQ0hBTkNfQkNDSENvbWI6CisJCQkJCXJldHVybiAwOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hGdWxsOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjoKKwkJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9UQ0hIYWxmOgorCQkJCQlyZXR1cm4gMDsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKHRzLT50cngtPm5yID09IDApIHsKKwkJCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQkJCWNhc2UgTk1fQ0hBTkNfU0RDQ0hfQ0JDSDoKKwkJCQkJaWYgKHRzLT50cngtPnRzWzBdLm5tX2NoYW5fY29tYiA9PQorCQkJCQkgICAgTk1fQ0hBTkNfbWFpbkJDQ0gpCisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJY2FzZSBOTV9DSEFOQ19TRENDSDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEZ1bGw6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGY6CisJCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfUERDSDoKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQkJCWNhc2UgTk1fQ0hBTkNfU0RDQ0g6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hGdWxsOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjoKKwkJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9UQ0hIYWxmOgorCQkJCQlyZXR1cm4gMDsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCWNhc2UgNDoKKwkJY2FzZSA1OgorCQljYXNlIDY6CisJCWNhc2UgNzoKKwkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQljYXNlIE5NX0NIQU5DX1RDSEZ1bGw6CisJCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9UQ0hIYWxmOgorCQkJCXJldHVybiAwOworCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1BEQ0g6CisJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9QRENIOgorCQkJCWlmICh0cy0+dHJ4LT5uciA9PSAwKQorCQkJCQlyZXR1cm4gMDsKKwkJCQllbHNlCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJZGVmYXVsdDoKKwkJLyogdW5rbm93biBCVFMgdHlwZSAqLworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC42LjMgKi8KK2ludCBhYmlzX25tX3NldF9jaGFubmVsX2F0dHIoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgY2hhbl9jb21iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB0cy0+dHJ4LT5idHM7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwl1X2ludDE2X3QgYXJmY24gPSBodG9ucyh0cy0+dHJ4LT5hcmZjbik7CisJdV9pbnQ4X3QgemVybyA9IDB4MDA7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBsZW4gPSAyICsgMjsKKworCWlmIChidHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX0JTMTEpCisJCWxlbiArPSA0ICsgMiArIDIgKyAzOworCisJREVCVUdQKEROTSwgIlNldCBDaGFuIEF0dHIgJXNcbiIsIGdzbV90c19uYW1lKHRzKSk7CisJaWYgKHZlcmlmeV9jaGFuX2NvbWIodHMsIGNoYW5fY29tYikgPCAwKSB7CisJCW1zZ2JfZnJlZShtc2cpOworCQlERUJVR1AoRE5NLCAiSW52YWxpZCBDaGFubmVsIENvbWJpbmF0aW9uISEhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXRzLT5ubV9jaGFuX2NvbWIgPSBjaGFuX2NvbWI7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX1NFVF9DSEFOX0FUVFIsCisJCQlOTV9PQ19DSEFOTkVMLCBidHMtPmJ0c19uciwKKwkJCXRzLT50cngtPm5yLCB0cy0+bnIpOworCS8qIEZJWE1FOiBkb24ndCBzZW5kIEFSRkNOIGxpc3QsIGhvcHBpbmcgc2VxdWVuY2UsIG1BSU8sIC4uLiovCisJaWYgKGJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkKKwkJbXNnYl90bHYxNl9wdXQobXNnLCBOTV9BVFRfQVJGQ05fTElTVCwgMSwgJmFyZmNuKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9DSEFOX0NPTUIsIGNoYW5fY29tYik7CisJaWYgKGJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkgeworCQltc2diX3R2X3B1dChtc2csIE5NX0FUVF9IU04sIDB4MDApOworCQltc2diX3R2X3B1dChtc2csIE5NX0FUVF9NQUlPLCAweDAwKTsKKwl9CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfVFNDLCBidHMtPnRzYyk7CS8qIHRyYWluaW5nIHNlcXVlbmNlICovCisJaWYgKGJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkKKwkJbXNnYl90bHZfcHV0KG1zZywgMHg1OSwgMSwgJnplcm8pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX3N3X2FjdF9yZXFfYWNrKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgaTEsCisJCQl1X2ludDhfdCBpMiwgdV9pbnQ4X3QgaTMsIGludCBuYWNrLCB1X2ludDhfdCAqYXR0ciwgaW50IGF0dF9sZW4pCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IG1zZ3R5cGUgPSBOTV9NVF9TV19BQ1RfUkVRX0FDSzsKKwl1X2ludDhfdCBsZW4gPSBhdHRfbGVuOworCisJaWYgKG5hY2spIHsKKwkJbGVuICs9IDI7CisJCW1zZ3R5cGUgPSBOTV9NVF9TV19BQ1RfUkVRX05BQ0s7CisJfQorCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgYXR0X2xlbiwgbXNndHlwZSwgb2JqX2NsYXNzLCBpMSwgaTIsIGkzKTsKKworCWlmIChhdHRyKSB7CisJCXVfaW50OF90ICpwdHIgPSBtc2diX3B1dChtc2csIGF0dF9sZW4pOworCQltZW1jcHkocHRyLCBhdHRyLCBhdHRfbGVuKTsKKwl9CisJaWYgKG5hY2spCisJCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX05BQ0tfQ0FVU0VTLCBOTV9OQUNLX09CSkNMQVNTX05PVFNVUFApOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX3Jhd19tc2coc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGxlbiwgdV9pbnQ4X3QgKnJhd21zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJdV9pbnQ4X3QgKmRhdGE7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKm9oKSk7CisJZmlsbF9vbV9oZHIob2gsIGxlbik7CisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgbGVuKTsKKwltZW1jcHkoZGF0YSwgcmF3bXNnLCBsZW4pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIFNpZW1lbnMgc3BlY2lmaWMgY29tbWFuZHMgKi8KK3N0YXRpYyBpbnQgX19zaW1wbGVfY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG1zZ190eXBlKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIG1zZ190eXBlLCBOTV9PQ19TSVRFX01BTkFHRVIsCisJCQkweGZmLCAweGZmLCAweGZmKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDguOS4yICovCitpbnQgYWJpc19ubV9vcHN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgaTAsIHVfaW50OF90IGkxLCB1X2ludDhfdCBpMikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBOTV9NVF9PUFNUQVJULCBvYmpfY2xhc3MsIGkwLCBpMSwgaTIpOworCisJZGVidWdwX2ZvaCgoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqKSBvaC0+ZGF0YSk7CisJREVCVUdQQyhETk0sICJTZW5kaW5nIE9QU1RBUlRcbiIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC44LjUgKi8KK2ludCBhYmlzX25tX2NoZ19hZG1fc3RhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwKKwkJCSAgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyLCBlbnVtIGFiaXNfbm1fYWRtX3N0YXRlIGFkbV9zdGF0ZSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAyLCBOTV9NVF9DSEdfQURNX1NUQVRFLCBvYmpfY2xhc3MsIGkwLCBpMSwgaTIpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX0FETV9TVEFURSwgYWRtX3N0YXRlKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9jb25uX21kcm9wX2xpbmsoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgZTFfcG9ydDAsIHVfaW50OF90IHRzMCwKKwkJCSAgICB1X2ludDhfdCBlMV9wb3J0MSwgdV9pbnQ4X3QgdHMxKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCAqYXR0cjsKKworCURFQlVHUChETk0sICJDT05ORUNUIE1EUk9QIExJTksgRTE9KCV1LCV1KSAtPiBFMT0oJXUsICV1KVxuIiwKKwkJZTFfcG9ydDAsIHRzMCwgZTFfcG9ydDEsIHRzMSk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCA2LCBOTV9NVF9DT05OX01EUk9QX0xJTkssCisJCQlOTV9PQ19TSVRFX01BTkFHRVIsIDB4MDAsIDB4MDAsIDB4MDApOworCisJYXR0ciA9IG1zZ2JfcHV0KG1zZywgMyk7CisJYXR0clswXSA9IE5NX0FUVF9NRFJPUF9MSU5LOworCWF0dHJbMV0gPSBlMV9wb3J0MDsKKwlhdHRyWzJdID0gdHMwOworCisJYXR0ciA9IG1zZ2JfcHV0KG1zZywgMyk7CisJYXR0clswXSA9IE5NX0FUVF9NRFJPUF9ORVhUOworCWF0dHJbMV0gPSBlMV9wb3J0MTsKKwlhdHRyWzJdID0gdHMxOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC43LjEgKi8KK2ludCBhYmlzX25tX3BlcmZvcm1fdGVzdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJIHVfaW50OF90IHRlc3RfbnIsIHVfaW50OF90IGF1dG9uX3JlcG9ydCwKKwkJCSB1X2ludDhfdCAqcGh5c19jb25maWcsIHVfaW50MTZfdCBwaHlzX2NvbmZpZ19sZW4pCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCWludCBsZW4gPSA0OyAvKiAyIFRWIGF0dHJpYnV0ZXMgKi8KKworCURFQlVHUChETk0sICJQRUZPUk0gVEVTVFxuIik7CisJCisJaWYgKHBoeXNfY29uZmlnX2xlbikKKwkJbGVuICs9IDMgKyBwaHlzX2NvbmZpZ19sZW47CisJCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9QRVJGX1RFU1QsCisJCQlvYmpfY2xhc3MsIGJ0c19uciwgdHJ4X25yLCB0c19ucik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfVEVTVF9OTywgdGVzdF9ucik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQVVUT05fUkVQT1JULCBhdXRvbl9yZXBvcnQpOworCWlmIChwaHlzX2NvbmZpZ19sZW4pCisJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX1BIWVNfQ09ORiwgcGh5c19jb25maWdfbGVuLAorCQkJCXBoeXNfY29uZmlnKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9ldmVudF9yZXBvcnRzKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBvbikKK3sKKwlpZiAob24gPT0gMCkKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX1NUT1BfRVZFTlRfUkVQKTsKKwllbHNlCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9SRVNUX0VWRU5UX1JFUCk7Cit9CisKKy8qIFNpZW1lbnMgKG9yIEJTLTExKSBzcGVjaWZpYyBjb21tYW5kcyAqLworCitpbnQgYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIGludCByZWNvbm5lY3QpCit7CisJaWYgKHJlY29ubmVjdCA9PSAwKQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9ESVNDT05ORUNUKTsKKwllbHNlCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX1JFQ09OTkVDVCk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfcmVzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX1JFU1RBUlQpOworfQorCisKK3N0cnVjdCBiczExX2RhdGVfdGltZSB7CisJdV9pbnQxNl90CXllYXI7CisJdV9pbnQ4X3QJbW9udGg7CisJdV9pbnQ4X3QJZGF5OworCXVfaW50OF90CWhvdXI7CisJdV9pbnQ4X3QJbWluOworCXVfaW50OF90CXNlYzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKwordm9pZCBnZXRfYnMxMV9kYXRlX3RpbWUoc3RydWN0IGJzMTFfZGF0ZV90aW1lICphZXQpCit7CisJdGltZV90IHQ7CisJc3RydWN0IHRtICp0bTsKKworCXQgPSB0aW1lKE5VTEwpOworCXRtID0gbG9jYWx0aW1lKCZ0KTsKKwlhZXQtPnNlYyA9IHRtLT50bV9zZWM7CisJYWV0LT5taW4gPSB0bS0+dG1fbWluOworCWFldC0+aG91ciA9IHRtLT50bV9ob3VyOworCWFldC0+ZGF5ID0gdG0tPnRtX21kYXk7CisJYWV0LT5tb250aCA9IHRtLT50bV9tb247CisJYWV0LT55ZWFyID0gaHRvbnMoMTkwMCArIHRtLT50bV95ZWFyKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9yZXNldF9yZXNvdXJjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX1JFU0VUX1JFU09VUkNFKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IGJlZ2luKQoreworCWlmIChiZWdpbikKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfQkVHSU5fREJfVFgpOworCWVsc2UKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfRU5EX0RCX1RYKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB0eXBlLCB1X2ludDhfdCBpZHgsCisJCQkJdV9pbnQ4X3QgYXR0cl9sZW4sIGNvbnN0IHVfaW50OF90ICphdHRyKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCAqY3VyOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgYXR0cl9sZW4sIE5NX01UX0JTMTFfQ1JFQVRFX09CSiwKKwkJCU5NX09DX0JTMTEsIHR5cGUsIDAsIGlkeCk7CisJY3VyID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJbWVtY3B5KGN1ciwgYXR0ciwgYXR0cl9sZW4pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZGVsZXRlX29iamVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gYWJpc19iczExX29ianR5cGUgdHlwZSwgdV9pbnQ4X3QgaWR4KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX0JTMTFfREVMRVRFX09CSiwKKwkJCU5NX09DX0JTMTEsIHR5cGUsIDAsIGlkeCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfZW52YUJUU0Uoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCB6ZXJvID0gMHgwMDsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDMsIE5NX01UX0JTMTFfQ1JFQVRFX09CSiwKKwkJCU5NX09DX0JTMTFfRU5WQUJUU0UsIDAsIGlkeCwgMHhmZik7CisJbXNnYl90bHZfcHV0KG1zZywgMHg5OSwgMSwgJnplcm8pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX2Jwb3J0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBOTV9NVF9CUzExX0NSRUFURV9PQkosIE5NX09DX0JTMTFfQlBPUlQsCisJCQlpZHgsIDB4ZmYsIDB4ZmYpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZGVsZXRlX2Jwb3J0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBOTV9NVF9CUzExX0RFTEVURV9PQkosIE5NX09DX0JTMTFfQlBPUlQsCisJCQlpZHgsIDB4ZmYsIDB4ZmYpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBzbV9hdHRyW10gPSB7IE5NX0FUVF9URUksIE5NX0FUVF9BQklTX0NIQU5ORUwgfTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X29tbF90ZWlfdHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAyK3NpemVvZihzbV9hdHRyKSwgTk1fTVRfR0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwKKwkJCTB4ZmYsIDB4ZmYsIDB4ZmYpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2Yoc21fYXR0ciksIHNtX2F0dHIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIGxpa2UgYWJpc19ubV9jb25uX3RlcnJfdHJhZiArIHNldF90ZWkgKi8KK2ludCBhYmlzX25tX2JzMTFfY29ubl9vbWxfdGVpKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGUxX3BvcnQsCisJCQkgIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90LAorCQkJICB1X2ludDhfdCB0ZWkpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgc2l6ZW9mKCpjaCkrMiwgTk1fTVRfQlMxMV9TRVRfQVRUUiwKKwkJCU5NX09DX1NJVEVfTUFOQUdFUiwgMHhmZiwgMHhmZiwgMHhmZik7CisKKwljaCA9IChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjaCkpOworCWZpbGxfbm1fY2hhbm5lbChjaCwgZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1RFSSwgdGVpKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX3NldF90cnhfcG93ZXIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IGxldmVsKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDMsIE5NX01UX0JTMTFfU0VUX0FUVFIsCisJCQlOTV9PQ19CUzExLCBCUzExX09CSl9QQSwgMHgwMCwgdHJ4LT5ucik7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfVFhQV1IsIDEsICZsZXZlbCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHRyeC0+YnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF90cnhfcG93ZXIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHIgPSBOTV9BVFRfQlMxMV9UWFBXUjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX1BBLCAweDAwLCB0cngtPm5yKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKGF0dHIpLCAmYXR0cik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHRyeC0+YnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF9wbGxfbW9kZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBhdHRyW10gPSB7IE5NX0FUVF9CUzExX1BMTF9NT0RFIH07CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAyK3NpemVvZihhdHRyKSwgTk1fTVRfR0VUX0FUVFIsCisJCQlOTV9PQ19CUzExLCBCUzExX09CSl9MSSwgMHgwMCwgMHgwMCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0xJU1RfUkVRX0FUVFIsIHNpemVvZihhdHRyKSwgYXR0cik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9nZXRfY2NsayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBhdHRyW10gPSB7IE5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1ksCisJCQkgICAgTk1fQVRUX0JTMTFfQ0NMS19UWVBFIH07CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAyK3NpemVvZihhdHRyKSwgTk1fTVRfR0VUX0FUVFIsCisJCQlOTV9PQ19CUzExLCBCUzExX09CSl9DQ0xLLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKGF0dHIpLCBhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworCit9CisKKy8vc3RhdGljIGNvbnN0IHVfaW50OF90IGJzMTFfbG9nb25fYzdbXSA9IHsgMHgwNywgMHhkOSwgMHgwMSwgMHgxMSwgMHgwZCwgMHgxMCwgMHgyMCB9OworCitpbnQgYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKQoreworCXJldHVybiBhYmlzX25tX2JzMTFfbG9nb24oYnRzLCAweDAyLCAiRkFDVE9SWSIsIG9uKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9pbmZpZWxkX2xvZ29uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBvbikKK3sKKwlyZXR1cm4gYWJpc19ubV9iczExX2xvZ29uKGJ0cywgMHgwMywgIkZJRUxEICAiLCBvbik7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGV2ZWwsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBvbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzMTFfZGF0ZV90aW1lIGJkdDsKKworCWdldF9iczExX2RhdGVfdGltZSgmYmR0KTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlpZiAob24pIHsKKwkJdV9pbnQ4X3QgbGVuID0gMyoyICsgc2l6ZW9mKGJkdCkKKwkJCQkrIDEgKyBzdHJsZW4obmFtZSk7CisJCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9CUzExX0xNVF9MT0dPTiwKKwkJCQlOTV9PQ19CUzExX0JUU0UsIDB4ZmYsIDB4ZmYsIDB4ZmYpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRSwKKwkJCSAgICAgc2l6ZW9mKGJkdCksICh1X2ludDhfdCAqKSAmYmR0KTsKKwkJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFViwKKwkJCSAgICAgMSwgJmxldmVsKTsKKwkJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSwKKwkJCSAgICAgc3RybGVuKG5hbWUpLCAodV9pbnQ4X3QgKiluYW1lKTsKKwl9IGVsc2UgeworCQlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX0JTMTFfTE1UX0xPR09GRiwKKwkJCQlOTV9PQ19CUzExX0JUU0UsIDB4ZmYsIDB4ZmYsIDB4ZmYpOworCX0KKwkKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpwYXNzd29yZCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2c7CisKKwlpZiAoc3RybGVuKHBhc3N3b3JkKSAhPSAxMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyAJbXNnID0gbm1fbXNnYl9hbGxvYygpOworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc3RybGVuKHBhc3N3b3JkKSwgTk1fTVRfQlMxMV9TRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX1RSWDEsIDB4MDAsIDB4MDApOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX1BBU1NXT1JELCAxMCwgKGNvbnN0IHVfaW50OF90ICopcGFzc3dvcmQpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIGNoYW5nZSB0aGUgQlMtMTEgUExMIE1vZGUgdG8gZWl0aGVyIGxvY2tlZCAoRTEgZGVyaXZlZCkgb3Igc3RhbmRhbG9uZSAqLworaW50IGFiaXNfbm1fYnMxMV9zZXRfcGxsX2xvY2tlZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbG9ja2VkKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCB0bHZfdmFsdWU7CisJCisJbXNnID0gbm1fbXNnYl9hbGxvYygpOworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDMsIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX0JTMTEsCisJCQlCUzExX09CSl9MSSwgMHgwMCwgMHgwMCk7CisKKwlpZiAobG9ja2VkKQorCQl0bHZfdmFsdWUgPSBCUzExX0xJX1BMTF9MT0NLRUQ7CisJZWxzZQorCQl0bHZfdmFsdWUgPSBCUzExX0xJX1BMTF9TVEFOREFMT05FOworCQorCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX1BMTF9NT0RFLCAxLCAmdGx2X3ZhbHVlKTsKKwkKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogU2V0IHRoZSBjYWxpYnJhdGlvbiB2YWx1ZSBvZiB0aGUgUExMICh3b3JrIHZhbHVlL3NldCB2YWx1ZSkKKyAqIEl0IGRlcGVuZHMgb24gdGhlIGxvZ2luIHdoaWNoIG9uZSBpcyBjaGFuZ2VkICovCitpbnQgYWJpc19ubV9iczExX3NldF9wbGwoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHZhbHVlKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCB0bHZfdmFsdWVbMl07CisKKwltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMSwKKwkJCUJTMTFfT0JKX1RSWDEsIDB4MDAsIDB4MDApOworCisJdGx2X3ZhbHVlWzBdID0gdmFsdWU+Pjg7CisJdGx2X3ZhbHVlWzFdID0gdmFsdWUmMHhmZjsKKworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX1BMTCwgMiwgdGx2X3ZhbHVlKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX0dFVF9TVEFURSk7Cit9CisKKy8qIEJTMTEgU1dMICovCisKK3ZvaWQgKnRhbGxfZmxlX2N0eDsKKworc3RydWN0IGFiaXNfbm1fYnMxMV9zdyB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwljaGFyIHN3bF9mbmFtZVtQQVRIX01BWF07CisJdV9pbnQ4X3Qgd2luX3NpemU7CisJaW50IGZvcmNlZDsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBmaWxlX2xpc3Q7CisJZ3NtX2NiZm4gKnVzZXJfY2I7CS8qIHNwZWNpZmllZCBieSB0aGUgdXNlciAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgYWJpc19ubV9iczExX3N3IF9nX2JzMTFfc3csICpnX2JzMTFfc3cgPSAmX2dfYnMxMV9zdzsKKworc3RydWN0IGZpbGVfbGlzdF9lbnRyeSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwljaGFyIGZuYW1lW1BBVEhfTUFYXTsKK307CisKK3N0cnVjdCBmaWxlX2xpc3RfZW50cnkgKmZsX2RlcXVldWUoc3RydWN0IGxsaXN0X2hlYWQgKnF1ZXVlKQoreworCXN0cnVjdCBsbGlzdF9oZWFkICpsaDsKKworCWlmIChsbGlzdF9lbXB0eShxdWV1ZSkpCisJCXJldHVybiBOVUxMOworCisJbGggPSBxdWV1ZS0+bmV4dDsKKwlsbGlzdF9kZWwobGgpOworCQorCXJldHVybiBsbGlzdF9lbnRyeShsaCwgc3RydWN0IGZpbGVfbGlzdF9lbnRyeSwgbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgYnMxMV9yZWFkX3N3bF9maWxlKHN0cnVjdCBhYmlzX25tX2JzMTFfc3cgKmJzMTFfc3cpCit7CisJY2hhciBsaW5lYnVmWzI1NV07CisJc3RydWN0IGxsaXN0X2hlYWQgKmxoLCAqbGgyOworCUZJTEUgKnN3bDsKKwlpbnQgcmMgPSAwOworCisJc3dsID0gZm9wZW4oYnMxMV9zdy0+c3dsX2ZuYW1lLCAiciIpOworCWlmICghc3dsKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHplcm8gdGhlIHN0YWxlIGZpbGUgbGlzdCwgaWYgYW55ICovCisJbGxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbGgyLCAmYnMxMV9zdy0+ZmlsZV9saXN0KSB7CisJCWxsaXN0X2RlbChsaCk7CisJCXRhbGxvY19mcmVlKGxoKTsKKwl9CisKKwl3aGlsZSAoZmdldHMobGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpLCBzd2wpKSB7CisJCWNoYXIgZmlsZV9pZFsxMisxXTsKKwkJY2hhciBmaWxlX3ZlcnNpb25bODArMV07CisJCXN0cnVjdCBmaWxlX2xpc3RfZW50cnkgKmZsZTsKKwkJc3RhdGljIGNoYXIgZGlyW1BBVEhfTUFYXTsKKworCQlpZiAoc3RybGVuKGxpbmVidWYpIDwgNCkKKwkJCWNvbnRpbnVlOworCQorCQlyYyA9IHNzY2FuZihsaW5lYnVmKzQsICIlMTJzOiU4MHNcclxuIiwgZmlsZV9pZCwgZmlsZV92ZXJzaW9uKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcGVycm9yKCJFUlIgcGFyc2luZyBTV0wgZmlsZSIpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHJjIDwgMikKKwkJCWNvbnRpbnVlOworCisJCWZsZSA9IHRhbGxvY196ZXJvKHRhbGxfZmxlX2N0eCwgc3RydWN0IGZpbGVfbGlzdF9lbnRyeSk7CisJCWlmICghZmxlKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIGNvbnN0cnVjdCBuZXcgZmlsZW5hbWUgKi8KKwkJc3RybmNweShkaXIsIGJzMTFfc3ctPnN3bF9mbmFtZSwgc2l6ZW9mKGRpcikpOworCQlzdHJuY2F0KGZsZS0+Zm5hbWUsIGRpcm5hbWUoZGlyKSwgc2l6ZW9mKGZsZS0+Zm5hbWUpIC0gMSk7CisJCXN0cmNhdChmbGUtPmZuYW1lLCAiLyIpOworCQlzdHJuY2F0KGZsZS0+Zm5hbWUsIGZpbGVfaWQsIHNpemVvZihmbGUtPmZuYW1lKSAtIDEgLXN0cmxlbihmbGUtPmZuYW1lKSk7CisJCQorCQlsbGlzdF9hZGRfdGFpbCgmZmxlLT5saXN0LCAmYnMxMV9zdy0+ZmlsZV9saXN0KTsKKwl9CisKK291dDoKKwlmY2xvc2Uoc3dsKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGJzMTEgc3dsb2FkIHNwZWNpZmljIGNhbGxiYWNrLCBwYXNzZWQgdG8gYWJpc19ubSBjb3JlIHN3bG9hZCAqLworc3RhdGljIGludCBiczExX3N3bG9hZF9jYmZuKHVuc2lnbmVkIGludCBob29rLCB1bnNpZ25lZCBpbnQgZXZlbnQsCisJCQkgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGFiaXNfbm1fYnMxMV9zdyAqYnMxMV9zdyA9IGRhdGE7CisJc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxlOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOTV9NVF9MT0FEX0VORF9BQ0s6CisJCWZsZSA9IGZsX2RlcXVldWUoJmJzMTFfc3ctPmZpbGVfbGlzdCk7CisJCWlmIChmbGUpIHsKKwkJCS8qIHN0YXJ0IGRvd25sb2FkIHRoZSBuZXh0IGZpbGUgb2Ygb3VyIGZpbGUgbGlzdCAqLworCQkJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQoYnMxMV9zdy0+YnRzLCAweGZmLCBmbGUtPmZuYW1lLAorCQkJCQkJICAgYnMxMV9zdy0+d2luX3NpemUsCisJCQkJCQkgICBiczExX3N3LT5mb3JjZWQsCisJCQkJCQkgICAmYnMxMV9zd2xvYWRfY2JmbiwgYnMxMV9zdyk7CisJCQl0YWxsb2NfZnJlZShmbGUpOworCQl9IGVsc2UgeworCQkJLyogYWN0aXZhdGUgdGhlIFNXTCAqLworCQkJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKGJzMTFfc3ctPmJ0cywKKwkJCQkJCQliczExX3N3LT5zd2xfZm5hbWUsCisJCQkJCQkJYnMxMV9zd2xvYWRfY2JmbiwKKwkJCQkJCQliczExX3N3KTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfQUNLOgorCWNhc2UgTk1fTVRfTE9BRF9JTklUX05BQ0s6CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19OQUNLOgorCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCWRlZmF1bHQ6CisJCS8qIGZhbGx0aHJvdWdoIHRvIHRoZSB1c2VyIGNhbGxiYWNrICovCisJCWlmIChiczExX3N3LT51c2VyX2NiKQorCQkJcmMgPSBiczExX3N3LT51c2VyX2NiKGhvb2ssIGV2ZW50LCBtc2csIE5VTEwsIE5VTEwpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFNpZW1lbnMgcHJvdmlkZXMgYSBTV0wgZmlsZSB0aGF0IGlzIGEgbWVyZSBsaXN0aW5nIG9mIGFsbCB0aGUgb3RoZXIKKyAqIGZpbGVzIHRoYXQgYXJlIHBhcnQgb2YgYSBzb2Z0d2FyZSByZWxlYXNlLiAgV2UgbmVlZCB0byB1cGxvYWQgZmlyc3QKKyAqIHRoZSBsaXN0IGZpbGUsIGFuZCB0aGVuIGVhY2ggZmlsZSB0aGF0IGlzIGxpc3RlZCBpbiB0aGUgbGlzdCBmaWxlICovCitpbnQgYWJpc19ubV9iczExX2xvYWRfc3dsKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICB1X2ludDhfdCB3aW5fc2l6ZSwgaW50IGZvcmNlZCwgZ3NtX2NiZm4gKmNiZm4pCit7CisJc3RydWN0IGFiaXNfbm1fYnMxMV9zdyAqYnMxMV9zdyA9IGdfYnMxMV9zdzsKKwlzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5ICpmbGU7CisJaW50IHJjID0gMDsKKworCUlOSVRfTExJU1RfSEVBRCgmYnMxMV9zdy0+ZmlsZV9saXN0KTsKKwliczExX3N3LT5idHMgPSBidHM7CisJYnMxMV9zdy0+d2luX3NpemUgPSB3aW5fc2l6ZTsKKwliczExX3N3LT51c2VyX2NiID0gY2JmbjsKKwliczExX3N3LT5mb3JjZWQgPSBmb3JjZWQ7CisKKwlzdHJuY3B5KGJzMTFfc3ctPnN3bF9mbmFtZSwgZm5hbWUsIHNpemVvZihiczExX3N3LT5zd2xfZm5hbWUpKTsKKwlyYyA9IGJzMTFfcmVhZF9zd2xfZmlsZShiczExX3N3KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiBkZXF1ZXVlIG5leHQgaXRlbSBpbiBmaWxlIGxpc3QgKi8KKwlmbGUgPSBmbF9kZXF1ZXVlKCZiczExX3N3LT5maWxlX2xpc3QpOworCWlmICghZmxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHN0YXJ0IGRvd25sb2FkIHRoZSBuZXh0IGZpbGUgb2Ygb3VyIGZpbGUgbGlzdCAqLworCXJjID0gYWJpc19ubV9zb2Z0d2FyZV9sb2FkKGJ0cywgMHhmZiwgZmxlLT5mbmFtZSwgd2luX3NpemUsIGZvcmNlZCwKKwkJCQkgICBiczExX3N3bG9hZF9jYmZuLCBiczExX3N3KTsKKwl0YWxsb2NfZnJlZShmbGUpOworCXJldHVybiByYzsKK30KKworI2lmIDAKK3N0YXRpYyB1X2ludDhfdCByZXFfYXR0cl9idHNlW10gPSB7CisJTk1fQVRUX0FETV9TVEFURSwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04sCisJTk1fQVRUX0JTMTFfTE1UX0xPR0lOX1RJTUUsIE5NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVYsCisJTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSwKKworCTB4YWYsIE5NX0FUVF9CUzExX1JYX09GRlNFVCwgTk1fQVRUX0JTMTFfVkVORE9SX05BTUUsCisKKwlOTV9BVFRfQlMxMV9TV19MT0FEX0lOVEVOREVELCBOTV9BVFRfQlMxMV9TV19MT0FEX1NBRkVUWSwKKworCU5NX0FUVF9CUzExX1NXX0xPQURfU1RPUkVEIH07CisKK3N0YXRpYyB1X2ludDhfdCByZXFfYXR0cl9idHNtW10gPSB7CisJTk1fQVRUX0FCSVNfQ0hBTk5FTCwgTk1fQVRUX1RFSSwgTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRSwKKwlOTV9BVFRfQURNX1NUQVRFLCBOTV9BVFRfQVZBSUxfU1RBVFVTLCAweGNlLCBOTV9BVFRfRklMRV9JRCwKKwlOTV9BVFRfRklMRV9WRVJTSU9OLCBOTV9BVFRfT1BFUl9TVEFURSwgMHhlOCwgTk1fQVRUX0JTMTFfQUxMX1RFU1RfQ0FURywKKwlOTV9BVFRfU1dfREVTQ1IsIE5NX0FUVF9HRVRfQVJJIH07CisjZW5kaWYKKwkKK3N0YXRpYyB1X2ludDhfdCByZXFfYXR0cltdID0geworCU5NX0FUVF9BRE1fU1RBVEUsIE5NX0FUVF9BVkFJTF9TVEFUVVMsIDB4YTgsIE5NX0FUVF9PUEVSX1NUQVRFLAorCTB4ZDUsIDB4YTEsIE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PLCBOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OTywKKwkweDQyLCBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCwgTk1fQVRUX0JTMTFfUExMIH07CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCS8qIFNpZW1lbnNIVyBDQ1RSTCBvYmplY3QgKi8KKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKHJlcV9hdHRyKSwgTk1fTVRfR0VUX0FUVFIsIE5NX09DX0JTMTEsCisJCQkweDAzLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKHJlcV9hdHRyKSwgcmVxX2F0dHIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfc2V0X2V4dF90aW1lKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBiczExX2RhdGVfdGltZSBhZXQ7CisKKwlnZXRfYnMxMV9kYXRlX3RpbWUoJmFldCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCS8qIFNpZW1lbnNIVyBDQ1RSTCBvYmplY3QgKi8KKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGFldCksIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwKKwkJCTB4ZmYsIDB4ZmYsIDB4ZmYpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX0FCSVNfRVhUX1RJTUUsIHNpemVvZihhZXQpLCAodV9pbnQ4X3QgKikgJmFldCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgYnBvcnQsIGVudW0gYWJpc19iczExX2xpbmVfY2ZnIGxpbmVfY2ZnKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgYWV0OworCisJZ2V0X2JzMTFfZGF0ZV90aW1lKCZhZXQpOworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIsIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX0JTMTFfQlBPUlQsCisJCQlicG9ydCwgMHhmZiwgMHgwMik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MSU5FX0NGRywgbGluZV9jZmcpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGNvbW1hbmRzICovCitzdGF0aWMgY29uc3QgY2hhciBpcGFjY2Vzc19tYWdpY1tdID0gImNvbS5pcGFjY2VzcyI7CisKKworc3RhdGljIGludCBhYmlzX25tX3J4X2lwYWNjKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2g7CisJdV9pbnQ4X3QgaWRzdHJsZW4gPSBvaC0+ZGF0YVswXTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgaXBhY2NfYWNrX3NpZ25hbF9kYXRhIHNpZ25hbDsKKworCWlmIChzdHJuY21wKChjaGFyICopJm9oLT5kYXRhWzFdLCBpcGFjY2Vzc19tYWdpYywgaWRzdHJsZW4pKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiaWQgc3RyaW5nIGlzIG5vdCBjb20uaXBhY2Nlc3MgIT8hXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9oID0gKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgKG9oLT5kYXRhICsgMSArIGlkc3RybGVuKTsKKwlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1zZy0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCisJZGVidWdwX2ZvaChmb2gpOworCisJREVCVUdQQyhETk0sICJJUEFDQ0VTUygweCUwMngpOiAiLCBmb2gtPm1zZ190eXBlKTsKKworCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCWNhc2UgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfQUNLOgorCQlERUJVR1BDKEROTSwgIlJTTCBDT05ORUNUIEFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVApKQorCQkJREVCVUdQQyhETk0sICJJUD0lcyAiLAorCQkJCWluZXRfbnRvYSgqKChzdHJ1Y3QgaW5fYWRkciAqKQorCQkJCQlUTFZQX1ZBTCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVApKSkpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUKSkKKwkJCURFQlVHUEMoRE5NLCAiUE9SVD0ldSAiLAorCQkJCW50b2hzKCooKHVfaW50MTZfdCAqKQorCQkJCQlUTFZQX1ZBTCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVCkpKSk7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfSVBBQ0NfU1RSRUFNX0lEKSkKKwkJCURFQlVHUEMoRE5NLCAiU1RSRUFNPTB4JTAyeCAiLAorCQkJCQkqVExWUF9WQUwoJnRwLCBOTV9BVFRfSVBBQ0NfU1RSRUFNX0lEKSk7CisJCURFQlVHUEMoRE5NLCAiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLOgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlJTTCBDT05ORUNUIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJREVCVUdQQyhETk0sICIgQ0FVU0U9JXNcbiIsCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJREVCVUdQQyhETk0sICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLOgorCQlERUJVR1BDKEROTSwgIlNFVCBOVkFUVFIgQUNLXG4iKTsKKwkJLyogRklYTUU6IGRlY29kZSBhbmQgc2hvdyB0aGUgYWN0dWFsIGF0dHJpYnV0ZXMgKi8KKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0s6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiU0VUIE5WQVRUUiBOQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIiBDQVVTRT0lc1xuIiwKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX0dFVF9OVkFUVFJfQUNLOgorCQlERUJVR1BDKEROTSwgIkdFVCBOVkFUVFIgQUNLXG4iKTsKKwkJLyogRklYTUU6IGRlY29kZSBhbmQgc2hvdyB0aGUgYWN0dWFsIGF0dHJpYnV0ZXMgKi8KKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX05BQ0s6CisJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIkdFVCBOVkFUVFIgTkFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICIgQ0FVU0U9JXNcbiIsCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfQVRUUl9BQ0s6CisJCURFQlVHUEMoRE5NLCAiU0VUIEFUVFIgQUNLXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLOgorCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJTRVQgQVRUUiBOQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIiBDQVVTRT0lc1xuIiwKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKEROTSwgInVua25vd25cbiIpOworCQlicmVhazsKKwl9CisKKwkvKiBzaWduYWwgaGFuZGxpbmcgKi8KKwlzd2l0Y2ggIChmb2gtPm1zZ190eXBlKSB7CisJY2FzZSBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLOgorCWNhc2UgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9OQUNLOgorCWNhc2UgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9OQUNLOgorCQlzaWduYWwudHJ4ID0gZ3NtX2J0c190cnhfYnlfbnIobXNnLT50cngtPmJ0cywgZm9oLT5vYmpfaW5zdC50cnhfbnIpOworCQlzaWduYWwubXNnX3R5cGUgPSBmb2gtPm1zZ190eXBlOworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fSVBBQ0NfTkFDSywgJnNpZ25hbCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9BQ0s6CisJCXNpZ25hbC50cnggPSBnc21fYnRzX3RyeF9ieV9ucihtc2ctPnRyeC0+YnRzLCBmb2gtPm9ial9pbnN0LnRyeF9ucik7CisJCXNpZ25hbC5tc2dfdHlwZSA9IGZvaC0+bXNnX3R5cGU7CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9JUEFDQ19BQ0ssICZzaWduYWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogc2VuZCBhbiBpcC1hY2Nlc3MgbWFudWZhY3R1cmVyIHNwZWNpZmljIG1lc3NhZ2UgKi8KK2ludCBhYmlzX25tX2lwYWNjZXNzX21zZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBtc2dfdHlwZSwKKwkJCSB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGJ0c19uciwKKwkJCSB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaDsKKwl1X2ludDhfdCAqZGF0YTsKKworCS8qIGNvbnN0cnVjdCB0aGUgMTIuMjEgT00gaGVhZGVyLCBvYnNlcnZlIHRoZSBlcnJvbmVvdXMgbGVuZ3RoICovCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpvaCkpOworCWZpbGxfb21faGRyKG9oLCBzaXplb2YoKmZvaCkgKyBhdHRyX2xlbik7CisJb2gtPm1kaXNjID0gQUJJU19PTV9NRElTQ19NQU5VRjsKKworCS8qIGFkZCB0aGUgaXAuYWNjZXNzIG1hZ2ljICovCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgc2l6ZW9mKGlwYWNjZXNzX21hZ2ljKSsxKTsKKwkqZGF0YSsrID0gc2l6ZW9mKGlwYWNjZXNzX21hZ2ljKTsKKwltZW1jcHkoZGF0YSwgaXBhY2Nlc3NfbWFnaWMsIHNpemVvZihpcGFjY2Vzc19tYWdpYykpOworCisJLyogZmlsbCB0aGUgMTIuMjEgRk9NIGhlYWRlciAqLworCWZvaCA9IChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpmb2gpKTsKKwlmb2gtPm1zZ190eXBlID0gbXNnX3R5cGU7CisJZm9oLT5vYmpfY2xhc3MgPSBvYmpfY2xhc3M7CisJZm9oLT5vYmpfaW5zdC5idHNfbnIgPSBidHNfbnI7CisJZm9oLT5vYmpfaW5zdC50cnhfbnIgPSB0cnhfbnI7CisJZm9oLT5vYmpfaW5zdC50c19uciA9IHRzX25yOworCisJaWYgKGF0dHIgJiYgYXR0cl9sZW4pIHsKKwkJZGF0YSA9IG1zZ2JfcHV0KG1zZywgYXR0cl9sZW4pOworCQltZW1jcHkoZGF0YSwgYXR0ciwgYXR0cl9sZW4pOworCX0KKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBzZXQgc29tZSBhdHRyaWJ1dGVzIGluIE5WUkFNICovCitpbnQgYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCAqYXR0ciwKKwkJCQlpbnQgYXR0cl9sZW4pCit7CisJcmV0dXJuIGFiaXNfbm1faXBhY2Nlc3NfbXNnKHRyeC0+YnRzLCBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSLAorCQkJCSAgICBOTV9PQ19CQVNFQl9UUkFOU0MsIDAsIHRyeC0+bnIsIDB4ZmYsIGF0dHIsCisJCQkJICAgIGF0dHJfbGVuKTsKK30KKworaW50IGFiaXNfbm1faXBhY2Nlc3NfcnNsX2Nvbm5lY3Qoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsCisJCQkJIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQsIHVfaW50OF90IHN0cmVhbSkKK3sKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKwl1X2ludDhfdCBhdHRyW10gPSB7IE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQsIDAsCisJCQkgICAgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JULCAwLCAwLAorCQkJICAgIE5NX0FUVF9JUEFDQ19EU1RfSVAsIDAsIDAsIDAsIDAgfTsKKworCWludCBhdHRyX2xlbiA9IHNpemVvZihhdHRyKTsKKworCWlhLnNfYWRkciA9IGh0b25sKGlwKTsKKwlhdHRyWzFdID0gc3RyZWFtOworCWF0dHJbM10gPSBwb3J0ID4+IDg7CisJYXR0cls0XSA9IHBvcnQgJiAweGZmOworCSoodV9pbnQzMl90ICopKGF0dHIrNikgPSBpYS5zX2FkZHI7CisKKwkvKiBpZiBpcCA9PSAwLCB3ZSB1c2UgdGhlIGRlZmF1bHQgSVAgKi8KKwlpZiAoaXAgPT0gMCkKKwkJYXR0cl9sZW4gLT0gNTsKKworCURFQlVHUChETk0sICJpcC5hY2Nlc3MgUlNMIENPTk5FQ1QgSVA9JXMgUE9SVD0ldSBTVFJFQU09MHglMDJ4XG4iLAorCQlpbmV0X250b2EoaWEpLCBwb3J0LCBzdHJlYW0pOworCisJcmV0dXJuIGFiaXNfbm1faXBhY2Nlc3NfbXNnKHRyeC0+YnRzLCBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVCwKKwkJCQkgICAgTk1fT0NfQkFTRUJfVFJBTlNDLCB0cngtPmJ0cy0+YnRzX25yLAorCQkJCSAgICB0cngtPm5yLCAweGZmLCBhdHRyLCBhdHRyX2xlbik7Cit9CisKKy8qIHJlc3RhcnQgLyByZWJvb3QgYW4gaXAuYWNjZXNzIG5hbm9CVFMgKi8KK2ludCBhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfSVBBQ0NfUkVTVEFSVCwgTk1fT0NfQkFTRUJfVFJBTlNDLAorCQkJdHJ4LT5idHMtPm5yLCB0cngtPm5yLCAweGZmKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCQl1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkJdV9pbnQ4X3QgKmF0dHIsIHVfaW50OF90IGF0dHJfbGVuKQoreworCXJldHVybiBhYmlzX25tX2lwYWNjZXNzX21zZyhidHMsIE5NX01UX0lQQUNDX1NFVF9BVFRSLAorCQkJCSAgICBvYmpfY2xhc3MsIGJ0c19uciwgdHJ4X25yLCB0c19uciwKKwkJCQkgICAgIGF0dHIsIGF0dHJfbGVuKTsKK30KKwordm9pZCBhYmlzX25tX2lwYWNjZXNzX2NnaSh1X2ludDhfdCAqYnVmLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCS8qIHdlIHNpbXBseSByZXVzZSB0aGUgR1NNNDggZnVuY3Rpb24gYW5kIG92ZXJ3cml0ZSB0aGUgUkFDCisJICogd2l0aCB0aGUgQ2VsbCBJRCAqLworCWdzbTQ4X3JhX2lkX2J5X2J0cyhidWYsIGJ0cyk7CisJKigodV9pbnQxNl90ICopKGJ1ZiArIDUpKSA9IGh0b25zKGJ0cy0+Y2VsbF9pZGVudGl0eSk7Cit9CisKK3ZvaWQgZ3NtX3RyeF9sb2NrX3JmKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCBpbnQgbG9ja2VkKQoreworCWludCBuZXdfc3RhdGUgPSBsb2NrZWQgPyBOTV9TVEFURV9MT0NLRUQgOiBOTV9TVEFURV9VTkxPQ0tFRDsKKworCXRyeC0+bm1fc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSBuZXdfc3RhdGU7CisJaWYgKCF0cngtPmJ0cyB8fCAhdHJ4LT5idHMtPm9tbF9saW5rKQorCQlyZXR1cm47CisKKwlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIE5NX09DX1JBRElPX0NBUlJJRVIsCisJCQkgICAgICB0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmLAorCQkJICAgICAgbmV3X3N0YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgaXBhY2NfdGVzdHJlc19uYW1lc1tdID0geworCXsgTk1fSVBBQ0NfVEVTVFJFU19TVUNDRVNTLAkiU1VDQ0VTUyIgfSwKKwl7IE5NX0lQQUNDX1RFU1RSRVNfVElNRU9VVCwJIlRJTUVPVVQiIH0sCisJeyBOTV9JUEFDQ19URVNUUkVTX05PX0NIQU5TLAkiTk8gQ0hBTk5FTFMiIH0sCisJeyBOTV9JUEFDQ19URVNUUkVTX1BBUlRJQUwsCSJQQVJUSUFMIiB9LAorCXsgTk1fSVBBQ0NfVEVTVFJFU19TVE9QUEVELAkiU1RPUFBFRCIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqaXBhY2NfdGVzdHJlc19uYW1lKHVfaW50OF90IHJlcykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhpcGFjY190ZXN0cmVzX25hbWVzLCByZXMpOworfQorCit2b2lkIGlwYWNfcGFyc2VfY2dpKHN0cnVjdCBjZWxsX2dsb2JhbF9pZCAqY2lkLCBjb25zdCB1X2ludDhfdCAqYnVmKQoreworCWNpZC0+bWNjID0gKGJ1ZlswXSAmIDB4ZikgKiAxMDA7CisJY2lkLT5tY2MgKz0gKGJ1ZlswXSA+PiA0KSAqICAxMDsKKwljaWQtPm1jYyArPSAoYnVmWzFdICYgMHhmKSAqICAxOworCisJaWYgKGJ1ZlsxXSA+PiA0ID09IDB4ZikgeworCQljaWQtPm1uYyA9IChidWZbMl0gJiAweGYpICogMTA7CisJCWNpZC0+bW5jICs9IChidWZbMl0gPj4gNCkgKiAgMTsKKwl9IGVsc2UgeworCQljaWQtPm1uYyA9IChidWZbMl0gJiAweGYpICogMTAwOworCQljaWQtPm1uYyArPSAoYnVmWzJdID4+IDQpICogIDEwOworCQljaWQtPm1uYyArPSAoYnVmWzFdID4+IDQpICogICAxOworCX0KKworCWNpZC0+bGFjID0gbnRvaHMoKigodV9pbnQxNl90ICopJmJ1ZlszXSkpOworCWNpZC0+Y2kgPSBudG9ocygqKCh1X2ludDE2X3QgKikmYnVmWzVdKSk7Cit9CisKKy8qIHBhcnNlIEJDQ0ggaW5mb3JtYXRpb24gSUVJIGZyb20gd2lyZSBmb3JtYXQgdG8gc3RydWN0IGlwYWNfYmNjaF9pbmZvICovCitpbnQgaXBhY19wYXJzZV9iY2NoX2luZm8oc3RydWN0IGlwYWNfYmNjaF9pbmZvICpiaW5mLCB1X2ludDhfdCAqYnVmKQoreworCXVfaW50OF90ICpjdXIgPSBidWY7CisJdV9pbnQxNl90IGxlbjsKKworCW1lbXNldChiaW5mLCAwLCBzaXplb2YoYmluZikpOworCisJaWYgKGN1clswXSAhPSBOTV9JUEFDX0VJRV9CQ0NIX0lORk8pCisJCXJldHVybiAtRUlOVkFMOworCWN1cisrOworCisJbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJYmluZi0+aW5mb190eXBlID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9GUkVRX0VSUl9RVUFMKQorCQliaW5mLT5mcmVxX3F1YWwgPSAqY3VyID4+IDI7CisKKwliaW5mLT5hcmZjbiA9ICpjdXIrKyAmIDMgPDwgODsKKwliaW5mLT5hcmZjbiB8PSAqY3VyKys7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX1JYTEVWKQorCQliaW5mLT5yeF9sZXYgPSAqY3VyICYgMHgzZjsKKwljdXIrKzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfUlhRVUFMKQorCQliaW5mLT5yeF9xdWFsID0gKmN1ciAmIDB4NzsKKwljdXIrKzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfRlJFUV9FUlJfUVVBTCkKKwkJYmluZi0+ZnJlcV9lcnIgPSBudG9ocygqKHVfaW50MTZfdCAqKWN1cik7CisJY3VyICs9IDI7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX0ZSQU1FX09GRlNFVCkKKwkJYmluZi0+ZnJhbWVfb2Zmc2V0ID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9GUkFNRV9OUl9PRkZTRVQpCisJCWJpbmYtPmZyYW1lX25yX29mZnNldCA9IG50b2hsKCoodV9pbnQzMl90ICopY3VyKTsKKwljdXIgKz0gNDsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfQlNJQykKKwkJYmluZi0+YnNpYyA9ICpjdXIgJiAweDNmOworCWN1cisrOworCisJaXBhY19wYXJzZV9jZ2koJmJpbmYtPmNnaSwgY3VyKTsKKwljdXIgKz0gNzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfTkVJR0hfQkFfU0kyKSB7CisJCW1lbWNweShiaW5mLT5iYV9saXN0X3NpMiwgY3VyLCBzaXplb2YoYmluZi0+YmFfbGlzdF9zaTIpKTsKKwkJY3VyICs9IHNpemVvZihiaW5mLT5iYV9saXN0X3NpMik7CisJfQorCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9ORUlHSF9CQV9TSTJiaXMpIHsKKwkJbWVtY3B5KGJpbmYtPmJhX2xpc3Rfc2kyYmlzLCBjdXIsCisJCQlzaXplb2YoYmluZi0+YmFfbGlzdF9zaTJiaXMpKTsKKwkJY3VyICs9IHNpemVvZihiaW5mLT5iYV9saXN0X3NpMmJpcyk7CisJfQorCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9ORUlHSF9CQV9TSTJ0ZXIpIHsKKwkJbWVtY3B5KGJpbmYtPmJhX2xpc3Rfc2kydGVyLCBjdXIsCisJCQlzaXplb2YoYmluZi0+YmFfbGlzdF9zaTJ0ZXIpKTsKKwkJY3VyICs9IHNpemVvZihiaW5mLT5iYV9saXN0X3NpMnRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9hYmlzX3JzbC5jIGIvb3BlbmJzYy9zcmMvYWJpc19yc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2IyOTgyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYWJpc19yc2wuYwpAQCAtMCwwICsxLDE3NjUgQEAKKy8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorICogM0dQUCBUUyAwOC41OCB2ZXJzaW9uIDguNi4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDU5NiBWOC42LjAgKi8KKworLyogKEMpIDIwMDgtMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19ybGwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWVhc19yZXAuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3J0cF9wcm94eS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3JzbC5oPgorCisjZGVmaW5lIFJTTF9BTExPQ19TSVpFCQkxMDI0CisjZGVmaW5lIFJTTF9BTExPQ19IRUFEUk9PTQkxMjgKKworI2RlZmluZSBNQVgoYSwgYikgKGEpID49IChiKSA/IChhKSA6IChiKQorCitzdGF0aWMgdV9pbnQ4X3QgbWRpc2NfYnlfbXNndHlwZSh1X2ludDhfdCBtc2dfdHlwZSkKK3sKKwkvKiBtYXNrIG9mZiB0aGUgdHJhbnNwYXJlbnQgYml0ID8gKi8KKwltc2dfdHlwZSAmPSAweGZlOworCisJaWYgKChtc2dfdHlwZSAmIDB4ZjApID09IDB4MDApCisJCXJldHVybiBBQklTX1JTTF9NRElTQ19STEw7CisJaWYgKChtc2dfdHlwZSAmIDB4ZjApID09IDB4MTApIHsKKwkJaWYgKG1zZ190eXBlID49IDB4MTkgJiYgbXNnX3R5cGUgPD0gMHgyMikKKwkJCXJldHVybiBBQklTX1JTTF9NRElTQ19UUlg7CisJCWVsc2UKKwkJCXJldHVybiBBQklTX1JTTF9NRElTQ19DT01fQ0hBTjsKKwl9CisJaWYgKChtc2dfdHlwZSAmIDB4ZTApID09IDB4MjApCisJCXJldHVybiBBQklTX1JTTF9NRElTQ19ERURfQ0hBTjsKKwkKKwlyZXR1cm4gQUJJU19SU0xfTURJU0NfTE9DOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9kY2hhbl9oZHIoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGgsCisJCQkJICB1X2ludDhfdCBtc2dfdHlwZSkKK3sKKwlkaC0+Yy5tc2dfZGlzY3IgPSBtZGlzY19ieV9tc2d0eXBlKG1zZ190eXBlKTsKKwlkaC0+Yy5tc2dfdHlwZSA9IG1zZ190eXBlOworCWRoLT5pZV9jaGFuID0gUlNMX0lFX0NIQU5fTlI7Cit9CisKKy8qIGRldGVybWluZSBsb2dpY2FsIGNoYW5uZWwgYmFzZWQgb24gVFJYIGFuZCBjaGFubmVsIG51bWJlciBJRSAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fbG9va3VwKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCBjaGFuX25yKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXVfaW50OF90IHRzX25yID0gY2hhbl9uciAmIDB4MDc7CisJdV9pbnQ4X3QgY2JpdHMgPSBjaGFuX25yID4+IDM7CisJdV9pbnQ4X3QgbGNoX2lkeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNbdHNfbnJdOworCisJaWYgKGNiaXRzID09IDB4MDEpIHsKKwkJbGNoX2lkeCA9IDA7CS8qIFRDSC9GICovCQorCQlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9UQ0hfRiAmJgorCQkgICAgdHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9QRENIICYmCisJCSAgICB0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX1RDSF9GX1BEQ0gpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwl9IGVsc2UgaWYgKChjYml0cyAmIDB4MWUpID09IDB4MDIpIHsKKwkJbGNoX2lkeCA9IGNiaXRzICYgMHgxOwkvKiBUQ0gvSCAqLworCQlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9UQ0hfSCkKKwkJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNoYW5fbnI9MHglMDJ4IGJ1dCBwY2hhbj0ldVxuIiwKKwkJCQljaGFuX25yLCB0cy0+cGNoYW4pOworCX0gZWxzZSBpZiAoKGNiaXRzICYgMHgxYykgPT0gMHgwNCkgeworCQlsY2hfaWR4ID0gY2JpdHMgJiAweDM7CS8qIFNEQ0NILzQgKi8KKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fQ0NDSF9TRENDSDQpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwl9IGVsc2UgaWYgKChjYml0cyAmIDB4MTgpID09IDB4MDgpIHsKKwkJbGNoX2lkeCA9IGNiaXRzICYgMHg3OwkvKiBTRENDSC84ICovCisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDKQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJfSBlbHNlIGlmIChjYml0cyA9PSAweDEwIHx8IGNiaXRzID09IDB4MTEgfHwgY2JpdHMgPT0gMHgxMikgeworCQlsY2hfaWR4ID0gMDsKKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fQ0NDSCAmJgorCQkgICAgdHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINCkKKwkJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNoYW5fbnI9MHglMDJ4IGJ1dCBwY2hhbj0ldVxuIiwKKwkJCQljaGFuX25yLCB0cy0+cGNoYW4pOworCQkvKiBGSVhNRTogd2Ugc2hvdWxkIG5vdCByZXR1cm4gZmlyc3Qgc2RjY2g0ICEhISAqLworCX0gZWxzZSB7CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgInVua25vd24gY2hhbl9ucj0weCUwMnhcbiIsIGNoYW5fbnIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsY2hhbiA9ICZ0cy0+bGNoYW5bbGNoX2lkeF07CisJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfTENIQU4sIGxjaGFuKTsKKwlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9TVUJTQ1IsIGxjaGFuLT5jb25uLnN1YnNjcik7CisKKwlyZXR1cm4gbGNoYW47Cit9CisKKy8qIFNlZSBUYWJsZSAxMC41LjI1IG9mIEdTTTA0LjA4ICovCit1X2ludDhfdCBsY2hhbjJjaGFuX25yKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSBsY2hhbi0+dHM7CisJdV9pbnQ4X3QgY2JpdHMsIGNoYW5fbnI7CisKKwlzd2l0Y2ggKHRzLT5wY2hhbikgeworCWNhc2UgR1NNX1BDSEFOX1RDSF9GOgorCWNhc2UgR1NNX1BDSEFOX1BEQ0g6CisJY2FzZSBHU01fUENIQU5fVENIX0ZfUERDSDoKKwkJY2JpdHMgPSAweDAxOworCQlicmVhazsKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJY2JpdHMgPSAweDAyOworCQljYml0cyArPSBsY2hhbi0+bnI7CisJCWJyZWFrOworCWNhc2UgR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0OgorCQljYml0cyA9IDB4MDQ7CisJCWNiaXRzICs9IGxjaGFuLT5ucjsKKwkJYnJlYWs7CisJY2FzZSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM6CisJCWNiaXRzID0gMHgwODsKKwkJY2JpdHMgKz0gbGNoYW4tPm5yOworCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgR1NNX1BDSEFOX0NDQ0g6CisJCWNiaXRzID0gMHgxMDsKKwkJYnJlYWs7CisJfQorCisJY2hhbl9uciA9IChjYml0cyA8PCAzKSB8ICh0cy0+bnIgJiAweDcpOworCisJcmV0dXJuIGNoYW5fbnI7Cit9CisKKy8qIEFzIHBlciBUUyAwMy4wMyBTZWN0aW9uIDIuMiwgdGhlIElNU0kgaGFzICdub3QgbW9yZSB0aGFuIDE1IGRpZ2l0cycgKi8KK3VfaW50NjRfdCBzdHJfdG9faW1zaShjb25zdCBjaGFyICppbXNpX3N0cikKK3sKKwl1X2ludDY0X3QgcmV0OworCisJcmV0ID0gc3RydG91bGwoaW1zaV9zdHIsIE5VTEwsIDEwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFRhYmxlIDUgQ2xhdXNlIDcgVFMgMDUuMDIgKi8KK3Vuc2lnbmVkIGludCBuX3BhZ19ibG9ja3MoaW50IGJzX2NjY2hfc2RjY2hfY29tYiwgdW5zaWduZWQgaW50IGJzX2FnX2Jsa3NfcmVzKQoreworCWlmICghYnNfY2NjaF9zZGNjaF9jb21iKQorCQlyZXR1cm4gOSAtIGJzX2FnX2Jsa3NfcmVzOworCWVsc2UKKwkJcmV0dXJuIDMgLSBic19hZ19ibGtzX3JlczsKK30KKworLyogQ2hhcHRlciA2LjUuMiBvZiBUUyAwNS4wMiAqLwordW5zaWduZWQgaW50IGdldF9jY2NoX2dyb3VwKHVfaW50NjRfdCBpbXNpLCB1bnNpZ25lZCBpbnQgYnNfY2NfY2hhbnMsCisJCQkgICAgdW5zaWduZWQgaW50IG5fcGFnX2Jsb2NrcykKK3sKKwlyZXR1cm4gKGltc2kgJSAxMDAwKSAlIChic19jY19jaGFucyAqIG5fcGFnX2Jsb2NrcykgLyBuX3BhZ19ibG9ja3M7Cit9CisKKy8qIENoYXB0ZXIgNi41LjIgb2YgVFMgMDUuMDIgKi8KK3Vuc2lnbmVkIGludCBnZXRfcGFnaW5nX2dyb3VwKHVfaW50NjRfdCBpbXNpLCB1bnNpZ25lZCBpbnQgYnNfY2NfY2hhbnMsCisJCQkgICAgICBpbnQgbl9wYWdfYmxvY2tzKQoreworCXJldHVybiAoaW1zaSAlIDEwMDApICUgKGJzX2NjX2NoYW5zICogbl9wYWdfYmxvY2tzKSAlIG5fcGFnX2Jsb2NrczsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpyc2xfbXNnYl9hbGxvYyh2b2lkKQoreworCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKFJTTF9BTExPQ19TSVpFLCBSU0xfQUxMT0NfSEVBRFJPT00sCisJCQkJICAgIlJTTCIpOworfQorCisjZGVmaW5lIE1BQ0JMT0NLX1NJWkUJMjMKK3N0YXRpYyB2b2lkIHBhZF9tYWNibG9jayh1X2ludDhfdCAqb3V0LCBjb25zdCB1X2ludDhfdCAqaW4sIGludCBsZW4pCit7CisJbWVtY3B5KG91dCwgaW4sIGxlbik7CisKKwlpZiAobGVuIDwgTUFDQkxPQ0tfU0laRSkKKwkJbWVtc2V0KG91dCtsZW4sIDB4MmIsIE1BQ0JMT0NLX1NJWkUtbGVuKTsKK30KKworLyogQ2hhcHRlciA5LjMuNzogRW5jcnlwdGlvbiBJbmZvcm1hdGlvbiAqLworc3RhdGljIGludCBidWlsZF9lbmNyX2luZm8odV9pbnQ4X3QgKm91dCwgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJKm91dCsrID0gbGNoYW4tPmVuY3IuYWxnX2lkICYgMHhmZjsKKwlpZiAobGNoYW4tPmVuY3Iua2V5X2xlbikKKwkJbWVtY3B5KG91dCwgbGNoYW4tPmVuY3Iua2V5LCBsY2hhbi0+ZW5jci5rZXlfbGVuKTsKKwlyZXR1cm4gbGNoYW4tPmVuY3Iua2V5X2xlbiArIDE7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3JzbF9jYXVzZShpbnQgbHZsLCBjb25zdCB1X2ludDhfdCAqY2F1c2VfdiwgdV9pbnQ4X3QgY2F1c2VfbGVuKQoreworCWludCBpOworCisJTE9HUEMoRFJTTCwgbHZsLCAiQ0FVU0U9MHglMDJ4KCVzKSAiLAorCQljYXVzZV92WzBdLCByc2xfZXJyX25hbWUoY2F1c2VfdlswXSkpOworCWZvciAoaSA9IDE7IGkgPCBjYXVzZV9sZW4tMTsgaSsrKQorCQlMT0dQQyhEUlNMLCBsdmwsICIlMDJ4ICIsIGNhdXNlX3ZbaV0pOworfQorCisvKiBTZW5kIGEgQkNDSF9JTkZPIG1lc3NhZ2UgYXMgcGVyIENoYXB0ZXIgOC41LjEgKi8KK2ludCByc2xfYmNjaF9pbmZvKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0eXBlLAorCQkgIGNvbnN0IHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZipkaCk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9CQ0NIX0lORk8pOworCWRoLT5jaGFuX25yID0gUlNMX0NIQU5fQkNDSDsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1NZU0lORk9fVFlQRSwgdHlwZSk7CisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0ZVTExfQkNDSF9JTkZPLCBsZW4sIGRhdGEpOworCisJbXNnLT50cnggPSB0cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX3NhY2NoX2ZpbGxpbmcoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHR5cGUsCisJCSAgICAgIGNvbnN0IHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICpjaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWNoID0gKHN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjaCkpOworCWNoLT5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19UUlg7CisJY2gtPm1zZ190eXBlID0gUlNMX01UX1NBQ0NIX0ZJTEw7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9TWVNJTkZPX1RZUEUsIHR5cGUpOworCW1zZ2JfdGwxNnZfcHV0KG1zZywgUlNMX0lFX0wzX0lORk8sIGxlbiwgZGF0YSk7CisKKwltc2ctPnRyeCA9IHRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfY2hhbl9ic19wb3dlcl9jdHJsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1bnNpZ25lZCBpbnQgZnBjLCBpbnQgZGIpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwlkYiA9IGFicyhkYik7CisJaWYgKGRiID4gMzApCisJCXJldHVybiAtRUlOVkFMOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWxjaGFuLT5ic19wb3dlciA9IGRiLzI7CisJaWYgKGZwYykKKwkJbGNoYW4tPmJzX3Bvd2VyIHw9IDB4MTA7CisJCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0JTX1BPV0VSX0NPTlRST0wpOworCWRoLT5jaGFuX25yID0gY2hhbl9ucjsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0JTX1BPV0VSLCBsY2hhbi0+YnNfcG93ZXIpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfY2hhbl9tc19wb3dlcl9jdHJsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1bnNpZ25lZCBpbnQgZnBjLCBpbnQgZGJtKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2c7CisJdV9pbnQ4X3QgY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCWludCBjdGxfbHZsOworCisJY3RsX2x2bCA9IG1zX3B3cl9jdGxfbHZsKGxjaGFuLT50cy0+dHJ4LT5idHMtPmJhbmQsIGRibSk7CisJaWYgKGN0bF9sdmwgPCAwKQorCQlyZXR1cm4gY3RsX2x2bDsKKworCW1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwlsY2hhbi0+bXNfcG93ZXIgPSBjdGxfbHZsOworCisJaWYgKGZwYykKKwkJbGNoYW4tPm1zX3Bvd2VyIHw9IDB4MjA7CisJCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX01TX1BPV0VSX0NPTlRST0wpOworCWRoLT5jaGFuX25yID0gY2hhbl9ucjsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX01TX1BPV0VSLCBsY2hhbi0+bXNfcG93ZXIpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgY2hhbm5lbF9tb2RlX2Zyb21fbGNoYW4oc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgKmNtLAorCQkJCSAgIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCW1lbXNldChjbSwgMCwgc2l6ZW9mKGNtKSk7CisKKwkvKiBGSVhNRTogd2hhdCB0byBkbyB3aXRoIGRhdGEgY2FsbHMgPyAqLworCWNtLT5kdHhfZHR1ID0gMHgwMDsKKworCS8qIHNldCBUQ0ggU3BlZWNoL0RhdGEgKi8KKwljbS0+c3BkX2luZCA9IGxjaGFuLT5yc2xfY21vZGU7CisKKwlpZiAobGNoYW4tPnJzbF9jbW9kZSA9PSBSU0xfQ01PRF9TUERfU0lHTiAmJgorCSAgICBsY2hhbi0+dGNoX21vZGUgIT0gR1NNNDhfQ01PREVfU0lHTikKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAidW5zdXBwb3J0ZWQ6IHJzbF9tb2RlID09IHNpZ25hbGxpbmcsICIKKwkJCSJidXQgdGNoX21vZGUgIT0gc2lnbmFsbGluZ1xuIik7CisKKwlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJY2FzZSBHU01fTENIQU5fU0RDQ0g6CisJCWNtLT5jaGFuX3J0ID0gUlNMX0NNT0RfQ1JUX1NEQ0NIOworCQlicmVhazsKKwljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJY20tPmNoYW5fcnQgPSBSU0xfQ01PRF9DUlRfVENIX0JtOworCQlicmVhazsKKwljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJY20tPmNoYW5fcnQgPSBSU0xfQ01PRF9DUlRfVENIX0xtOworCQlicmVhazsKKwljYXNlIEdTTV9MQ0hBTl9OT05FOgorCWNhc2UgR1NNX0xDSEFOX1VOS05PV046CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChsY2hhbi0+dGNoX21vZGUpIHsKKwljYXNlIEdTTTQ4X0NNT0RFX1NJR046CisJCWNtLT5jaGFuX3JhdGUgPSAwOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9WMToKKwkJY20tPmNoYW5fcmF0ZSA9IFJTTF9DTU9EX1NQX0dTTTE7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0VGUjoKKwkJY20tPmNoYW5fcmF0ZSA9IFJTTF9DTU9EX1NQX0dTTTI7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0FNUjoKKwkJY20tPmNoYW5fcmF0ZSA9IFJTTF9DTU9EX1NQX0dTTTM7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfREFUQV8xNGs1OgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfTlRfMTRrNTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzEyazA6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9OVF8xMmswOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfNmswOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfTlRfNmswOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA4LjQuMSAqLworI2lmIDAKK2ludCByc2xfY2hhbl9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgY2hhbl9uciwKKwkJICAgICAgdV9pbnQ4X3QgYWN0X3R5cGUsCisJCSAgICAgIHN0cnVjdCByc2xfaWVfY2hhbl9tb2RlICpjaGFuX21vZGUsCisJCSAgICAgIHN0cnVjdCByc2xfaWVfY2hhbl9pZGVudCAqY2hhbl9pZGVudCwKKwkJICAgICAgdV9pbnQ4X3QgYnNfcG93ZXIsIHVfaW50OF90IG1zX3Bvd2VyLAorCQkgICAgICB1X2ludDhfdCB0YSkKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9DSEFOX0FDVElWKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9BQ1RfVFlQRSwgYWN0X3R5cGUpOworCS8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggUGhhc2UgMSAqLworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX01PREUsIHNpemVvZigqY2hhbl9tb2RlKSwKKwkJICAgICAodV9pbnQ4X3QgKikgY2hhbl9tb2RlKTsKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9JREVOVCwgNCwKKwkJICAgICAodV9pbnQ4X3QgKikgY2hhbl9pZGVudCk7CisjaWYgMAorCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9FTkNSX0lORk8sIDEsCisJCSAgICAgKHVfaW50OF90ICopICZlbmNyX2luZm8pOworI2VuZGlmCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQlNfUE9XRVIsIGJzX3Bvd2VyKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9NU19QT1dFUiwgbXNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1RJTUlOR19BRFZBTkNFLCB0YSk7CisKKwltc2ctPnRyeCA9IHRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisjZW5kaWYKKworaW50IHJzbF9jaGFuX2FjdGl2YXRlX2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBhY3RfdHlwZSwKKwkJCSAgICB1X2ludDhfdCB0YSwgdV9pbnQ4X3QgaG9fcmVmKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHJjOworCisJdV9pbnQ4X3QgY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCXVfaW50MTZfdCBhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbjsKKwlzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSBjbTsKKwlzdHJ1Y3QgcnNsX2llX2NoYW5faWRlbnQgY2k7CisKKwlyYyA9IGNoYW5uZWxfbW9kZV9mcm9tX2xjaGFuKCZjbSwgbGNoYW4pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW1lbXNldCgmY2ksIDAsIHNpemVvZihjaSkpOworCWNpLmNoYW5fZGVzYy5pZWkgPSAweDY0OworCWNpLmNoYW5fZGVzYy5jaGFuX25yID0gY2hhbl9ucjsKKwljaS5jaGFuX2Rlc2Mub2N0MyA9IChsY2hhbi0+dHMtPnRyeC0+YnRzLT50c2MgPDwgNSkgfCAoKGFyZmNuICYgMHgzZmYpID4+IDgpOworCWNpLmNoYW5fZGVzYy5vY3Q0ID0gYXJmY24gJiAweGZmOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQ0hBTl9BQ1RJVik7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQUNUX1RZUEUsIGFjdF90eXBlKTsKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9NT0RFLCBzaXplb2YoY20pLAorCQkgICAgICh1X2ludDhfdCAqKSAmY20pOworCS8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggUGhhc2UgMSAqLworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX0lERU5ULCA0LAorCQkgICAgICh1X2ludDhfdCAqKSAmY2kpOworCisJaWYgKGxjaGFuLT5lbmNyLmFsZ19pZCA+IFJTTF9FTkNfQUxHX0E1KDApKSB7CisJCXVfaW50OF90IGVuY3JfaW5mb1tNQVhfQTVfS0VZX0xFTisyXTsKKwkJcmMgPSBidWlsZF9lbmNyX2luZm8oZW5jcl9pbmZvLCBsY2hhbik7CisJCWlmIChyYyA+IDApCisJCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRU5DUl9JTkZPLCByYywgZW5jcl9pbmZvKTsKKwl9CisKKwlzd2l0Y2ggKGFjdF90eXBlKSB7CisJY2FzZSBSU0xfQUNUX0lOVEVSX0FTWU5DOgorCWNhc2UgUlNMX0FDVF9JTlRFUl9TWU5DOgorCQltc2diX3R2X3B1dChtc2csIFJTTF9JRV9IQU5ET19SRUYsIGhvX3JlZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0JTX1BPV0VSLCBsY2hhbi0+YnNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX01TX1BPV0VSLCBsY2hhbi0+bXNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1RJTUlOR19BRFZBTkNFLCB0YSk7CisKKwlpZiAobGNoYW4tPnRjaF9tb2RlID09IEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIpCisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9NUl9DT05GSUcsIHNpemVvZihsY2hhbi0+bXJfY29uZiksCisJCQkgICAgICh1X2ludDhfdCAqKSAmbGNoYW4tPm1yX2NvbmYpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40Ljk6IE1vZGlmeSBjaGFubmVsIG1vZGUgb24gQlRTIHNpZGUgKi8KK2ludCByc2xfY2hhbl9tb2RlX21vZGlmeV9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgcmM7CisKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgY207CisKKwlyYyA9IGNoYW5uZWxfbW9kZV9mcm9tX2xjaGFuKCZjbSwgbGNoYW4pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX01PREVfTU9ESUZZX1JFUSk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTU9ERSwgc2l6ZW9mKGNtKSwKKwkJICAgICAodV9pbnQ4X3QgKikgJmNtKTsKKworCWlmIChsY2hhbi0+ZW5jci5hbGdfaWQgPiBSU0xfRU5DX0FMR19BNSgwKSkgeworCQl1X2ludDhfdCBlbmNyX2luZm9bTUFYX0E1X0tFWV9MRU4rMl07CisJCXJjID0gYnVpbGRfZW5jcl9pbmZvKGVuY3JfaW5mbywgbGNoYW4pOworCQlpZiAocmMgPiAwKQorCQkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgcmMsIGVuY3JfaW5mbyk7CisJfQorCisJaWYgKGxjaGFuLT50Y2hfbW9kZSA9PSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SKSB7CisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9NUl9DT05GSUcsIHNpemVvZihsY2hhbi0+bXJfY29uZiksCisJCQkgICAgICh1X2ludDhfdCAqKSAmbGNoYW4tPm1yX2NvbmYpOworCX0KKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguNC42OiBTZW5kIHRoZSBlbmNyeXB0aW9uIGNvbW1hbmQgd2l0aCBnaXZlbiBMMyBpbmZvICovCitpbnQgcnNsX2VuY3J5cHRpb25fY21kKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwl1X2ludDhfdCBlbmNyX2luZm9bTUFYX0E1X0tFWV9MRU4rMl07CisJdV9pbnQ4X3QgbDNfbGVuID0gbXNnLT5sZW47CisJaW50IHJjOworCisJLyogRmlyc3QgcHVzaCB0aGUgTDMgSUUgdGFnIGFuZCBsZW5ndGggKi8KKwltc2diX3R2MTZfcHVzaChtc2csIFJTTF9JRV9MM19JTkZPLCBsM19sZW4pOworCisJLyogdGhlbiB0aGUgbGluayBpZGVudGlmaWVyIChTQVBJMCwgbWFpbiBzaWduIGxpbmspICovCisJbXNnYl90dl9wdXNoKG1zZywgUlNMX0lFX0xJTktfSURFTlQsIDApOworCisJLyogdGhlbiBlbmNyeXB0aW9uIGluZm9ybWF0aW9uICovCisJcmMgPSBidWlsZF9lbmNyX2luZm8oZW5jcl9pbmZvLCBsY2hhbik7CisJaWYgKHJjIDw9IDApCisJCXJldHVybiByYzsKKwltc2diX3Rsdl9wdXNoKG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgcmMsIGVuY3JfaW5mbyk7CisKKwkvKiBhbmQgZmluYWxseSB0aGUgRENIQU4gaGVhZGVyICovCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9FTkNSX0NNRCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40LjUgLyA0LjY6IERlYWN0aXZhdGUgdGhlIFNBQ0NIIGFmdGVyIDA0LjA4IFJSIENIQU4gUkVMRUFTRSAqLworaW50IHJzbF9kZWFjdF9zYWNjaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9ERUFDVElWQVRFX1NBQ0NIKTsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlERUJVR1AoRFJTTCwgIiVzIERFQUNUaXZhdGUgU0FDQ0ggQ01EXG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbikpOworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjQuMTQgLyA0Ljc6IFRlbGwgQlRTIHRvIHJlbGVhc2UgdGhlIHJhZGlvIGNoYW5uZWwgKi8KK2ludCByc2xfcmZfY2hhbl9yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX1JGX0NIQU5fUkVMKTsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlERUJVR1AoRFJTTCwgIiVzIFJGIENoYW5uZWwgUmVsZWFzZSBDTURcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisKKwkvKiBCVFMgd2lsbCByZXNwb25kIGJ5IFJGIENIQU4gUkVMIEFDSyAqLworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfcGFnaW5nX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBwYWdpbmdfZ3JvdXAsIHVfaW50OF90IGxlbiwKKwkJICAgdV9pbnQ4X3QgKm1zX2lkZW50LCB1X2ludDhfdCBjaGFuX25lZWRlZCkKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9QQUdJTkdfQ01EKTsKKwlkaC0+Y2hhbl9uciA9IFJTTF9DSEFOX1BDSF9BR0NIOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfUEFHSU5HX0dST1VQLCBwYWdpbmdfZ3JvdXApOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9NU19JREVOVElUWSwgbGVuLTIsIG1zX2lkZW50KzIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTkVFREVELCBjaGFuX25lZWRlZCk7CisKKwltc2ctPnRyeCA9IGJ0cy0+YzA7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX3BhZ2luZ19jbWRfc3Vic2NyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGNoYW5fbmVlZCwKKwkJCSAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisjaWYgMAorCXVfaW50OF90IG1pWzEyOF07CisJdW5zaWduZWQgaW50IG1pX2xlbjsKKwl1X2ludDhfdCBwYWdpbmdfZ3JvdXA7CisjZW5kaWYKKworCXJldHVybiAtMTsKK30KKworaW50IGltc2lfc3RyMmJjZCh1X2ludDhfdCAqYmNkX291dCwgY29uc3QgY2hhciAqc3RyX2luKQoreworCWludCBpLCBsZW4gPSBzdHJsZW4oc3RyX2luKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpbnQgbnVtID0gc3RyX2luW2ldIC0gMHgzMDsKKwkJaWYgKG51bSA8IDAgfHwgbnVtID4gOSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKGkgJSAyID09IDApCisJCQliY2Rfb3V0W2kvMl0gPSBudW07CisJCWVsc2UKKwkJCWJjZF9vdXRbaS8yXSB8PSAobnVtIDw8IDQpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNS42ICovCitpbnQgcnNsX2ltbV9hc3NpZ25fY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGxlbiwgdV9pbnQ4X3QgKnZhbCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwl1X2ludDhfdCBidWZbTUFDQkxPQ0tfU0laRV07CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSU1NRURJQVRFX0FTU0lHTl9DTUQpOworCWRoLT5jaGFuX25yID0gUlNMX0NIQU5fUENIX0FHQ0g7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9JTU1fQVNTX0lORk8sIGxlbiwgdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogSWYgcGhhc2UgMiwgY29uc3RydWN0IGEgRlVMTF9JTU1fQVNTX0lORk8gKi8KKwkJcGFkX21hY2Jsb2NrKGJ1ZiwgdmFsLCBsZW4pOworCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRlVMTF9JTU1fQVNTX0lORk8sIE1BQ0JMT0NLX1NJWkUsIGJ1Zik7CisJCWJyZWFrOworCX0KKworCW1zZy0+dHJ4ID0gYnRzLT5jMDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIFNlbmQgU2llbWVucyBzcGVjaWZpYyBNUyBSRiBQb3dlciBDYXBhYmlsaXR5IEluZGljYXRpb24gKi8KK2ludCByc2xfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IHJzbF9tcnBjaSAqbXJwY2kpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfU0lFTUVOU19NUlBDSSk7CisJZGgtPmMubXNnX2Rpc2NyID0gQUJJU19SU0xfTURJU0NfREVEX0NIQU47CisJZGgtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9TSUVNRU5TX01SUENJLCAqKHVfaW50OF90ICopbXJwY2kpOworCisJREVCVUdQKERSU0wsICIlcyBUWCBTaWVtZW5zIE1SUENJIDB4JTAyeFxuIiwKKwkJZ3NtX2xjaGFuX25hbWUobGNoYW4pLCAqKHVfaW50OF90ICopbXJwY2kpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKworLyogU2VuZCAiREFUQSBSRVFVRVNUIiBtZXNzYWdlIHdpdGggZ2l2ZW4gTDMgSW5mbyBwYXlsb2FkICovCisvKiBDaGFwdGVyIDguMy4xICovCitpbnQgcnNsX2RhdGFfcmVxdWVzdChzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQoreworCWlmIChtc2ctPmxjaGFuID09IE5VTEwpIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2Fubm90IHNlbmQgREFUQSBSRVFVRVNUIHRvIHVua25vd24gbGNoYW5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyc2xfcmxsX3B1c2hfbDMobXNnLCBSU0xfTVRfREFUQV9SRVEsIGxjaGFuMmNoYW5fbnIobXNnLT5sY2hhbiksCisJCQlsaW5rX2lkLCAxKTsKKworCW1zZy0+dHJ4ID0gbXNnLT5sY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIFNlbmQgIkVTVEFCTElTSCBSRVFVRVNUIiBtZXNzYWdlIHdpdGggZ2l2ZW4gTDMgSW5mbyBwYXlsb2FkICovCisvKiBDaGFwdGVyIDguMy4xICovCitpbnQgcnNsX2VzdGFibGlzaF9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKQoreworCXN0cnVjdCBtc2diICptc2c7CisKKwltc2cgPSByc2xfcmxsX3NpbXBsZShSU0xfTVRfRVNUX1JFUSwgbGNoYW4yY2hhbl9ucihsY2hhbiksCisJCQkgICAgIGxpbmtfaWQsIDApOworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguMy43IFJlcXVlc3QgdGhlIHJlbGVhc2Ugb2YgbXVsdGlmcmFtZSBtb2RlIG9mIFJMTCBjb25uZWN0aW9uLgorICAgVGhpcyBpcyB3aGF0IGhpZ2hlciBsYXllcnMgc2hvdWxkIGNhbGwuICBUaGUgQlRTIHRoZW4gcmVzcG9uZHMgd2l0aAorICAgUkVMRUFTRSBDT05GSVJNLCB3aGljaCB3ZSBpbiB0dXJuIHVzZSB0byB0cmlnZ2VyIFJTTCBDSEFOTkVMIFJFTEVBU0UsCisgICB3aGljaCBpbiB0dXJuIGlzIGFja25vd2xlZGdlZCBieSBSU0wgQ0hBTk5FTCBSRUxFQVNFIEFDSywgd2hpY2ggY2FsbHMKKyAgIGxjaGFuX2ZyZWUoKSAqLworaW50IHJzbF9yZWxlYXNlX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpCit7CisKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCisJbXNnID0gcnNsX3JsbF9zaW1wbGUoUlNMX01UX1JFTF9SRVEsIGxjaGFuMmNoYW5fbnIobGNoYW4pLAorCQkJICAgICBsaW5rX2lkLCAwKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9SRUxFQVNFX01PREUsIDApOwkvKiBub3JtYWwgcmVsZWFzZSAqLworCisJLyogRklYTUU6IHN0YXJ0IHNvbWUgdGltZXIgaW4gY2FzZSB3ZSBkb24ndCByZWNlaXZlIGEgUkVMIEFDSyA/ICovCisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9sY2hhbl9zZXRfc3RhdGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIGludCBzdGF0ZSkKK3sKKwlsY2hhbi0+c3RhdGUgPSBzdGF0ZTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA4LjQuMjogQ2hhbm5lbCBBY3RpdmF0ZSBBY2tub3dsZWRnZSAqLworc3RhdGljIGludCByc2xfcnhfY2hhbl9hY3RfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKworCS8qIEJUUyBoYXMgY29uZmlybWVkIGNoYW5uZWwgYWN0aXZhdGlvbiwgd2Ugbm93IG5lZWQKKwkgKiB0byBhc3NpZ24gdGhlIGFjdGl2YXRlZCBjaGFubmVsIHRvIHRoZSBNUyAqLworCWlmIChyc2xoLT5pZV9jaGFuICE9IFJTTF9JRV9DSEFOX05SKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtc2ctPmxjaGFuLT5zdGF0ZSAhPSBMQ0hBTl9TX0FDVF9SRVEpCisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBDSEFOIEFDVCBBQ0ssIGJ1dCBzdGF0ZSAlc1xuIiwKKwkJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pLAorCQkJZ3NtX2xjaGFuc19uYW1lKG1zZy0+bGNoYW4tPnN0YXRlKSk7CisJcnNsX2xjaGFuX3NldF9zdGF0ZShtc2ctPmxjaGFuLCBMQ0hBTl9TX0FDVElWRSk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fQUNUSVZBVEVfQUNLLCBtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC4zOiBDaGFubmVsIEFjdGl2YXRlIE5BQ0sgKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fYWN0X25hY2soc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIENIQU5ORUwgQUNUSVZBVEUgTkFDSyIsCisJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pKTsKKworCS8qIEJUUyBoYXMgcmVqZWN0ZWQgY2hhbm5lbCBhY3RpdmF0aW9uID8hPyAqLworCWlmIChkaC0+aWVfY2hhbiAhPSBSU0xfSUVfQ0hBTl9OUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9DQVVTRSkpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKmNhdXNlID0gVExWUF9WQUwoJnRwLCBSU0xfSUVfQ0FVU0UpOworCQlwcmludF9yc2xfY2F1c2UoTE9HTF9FUlJPUiwgY2F1c2UsCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKwkJaWYgKCpjYXVzZSAhPSBSU0xfRVJSX1JDSF9BTFJfQUNUVl9BTExPQykKKwkJCXJzbF9sY2hhbl9zZXRfc3RhdGUobXNnLT5sY2hhbiwgTENIQU5fU19OT05FKTsKKwl9IGVsc2UKKwkJcnNsX2xjaGFuX3NldF9zdGF0ZShtc2ctPmxjaGFuLCBMQ0hBTl9TX05PTkUpOworCisJTE9HUEMoRFJTTCwgTE9HTF9FUlJPUiwgIlxuIik7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fQUNUSVZBVEVfTkFDSywgbXNnLT5sY2hhbik7CisKKwlsY2hhbl9mcmVlKG1zZy0+bGNoYW4pOworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC40OiBDb25uZWN0aW9uIEZhaWx1cmUgSW5kaWNhdGlvbiAqLworc3RhdGljIGludCByc2xfcnhfY29ubl9mYWlsKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwkvKiBGSVhNRTogcHJpbnQgd2hpY2ggY2hhbm5lbCAqLworCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBDT05ORUNUSU9OIEZBSUw6IFJFTEVBU0lORyAiLAorCSAgICAgZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbikpOworCisJcnNsX3Rsdl9wYXJzZSgmdHAsIGRoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpkaCkpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9DQVVTRSkpCisJCXByaW50X3JzbF9jYXVzZShMT0dMX05PVElDRSwgVExWUF9WQUwoJnRwLCBSU0xfSUVfQ0FVU0UpLAorCQkJCVRMVlBfTEVOKCZ0cCwgUlNMX0lFX0NBVVNFKSk7CisKKwlMT0dQQyhEUlNMLCBMT0dMX05PVElDRSwgIlxuIik7CisJLyogRklYTUU6IG9ubHkgZnJlZSBpdCBhZnRlciBjaGFubmVsIHJlbGVhc2UgQUNLICovCisJY291bnRlcl9pbmMobXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrLT5zdGF0cy5jaGFuLnJmX2ZhaWwpOworCXJldHVybiByc2xfcmZfY2hhbl9yZWxlYXNlKG1zZy0+bGNoYW4pOworfQorCitzdGF0aWMgdm9pZCBwcmludF9tZWFzX3JlcF91bmkoc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgKm1ydSwKKwkJCQljb25zdCBjaGFyICpwcmVmaXgpCit7CisJREVCVUdQQyhETUVBUywgIlJYTC1GVUxMLSVzPSUzZGRCbSBSWEwtU1VCLSVzPSUzZGRCbSAiLAorCQlwcmVmaXgsIHJ4bGV2MmRibShtcnUtPmZ1bGwucnhfbGV2KSwKKwkJcHJlZml4LCByeGxldjJkYm0obXJ1LT5zdWIucnhfbGV2KSk7CisJREVCVUdQQyhETUVBUywgIlJYUS1GVUxMLSVzPSVkIFJYUS1TVUItJXM9JWQgIiwKKwkJcHJlZml4LCBtcnUtPmZ1bGwucnhfcXVhbCwgcHJlZml4LCBtcnUtPnN1Yi5yeF9xdWFsKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbWVhc19yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIpCit7CisJaW50IGk7CisKKwlERUJVR1AoRE1FQVMsICJNRUFTVVJFTUVOVCBSRVNVTFQgTlI9JWQgIiwgbXItPm5yKTsKKworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX0RUWCkKKwkJREVCVUdQQyhETUVBUywgIkRUWGQgIik7CisKKwlwcmludF9tZWFzX3JlcF91bmkoJm1yLT51bCwgInVsIik7CisJREVCVUdQQyhETUVBUywgIkJTX1BPV0VSPSVkICIsIG1yLT5ic19wb3dlcik7CisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfTVNfVE8pCisJCURFQlVHUEMoRE1FQVMsICJNU19UTz0lZCAiLCBtci0+bXNfdGltaW5nX29mZnNldCk7CisKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9NU19MMSkgeworCQlERUJVR1BDKERNRUFTLCAiTDFfTVNfUFdSPSUzZGRCbSAiLCBtci0+bXNfbDEucHdyKTsKKwkJREVCVUdQQyhETUVBUywgIkwxX0ZQQz0ldSAiLAorCQkJbXItPmZsYWdzICYgTUVBU19SRVBfRl9GUEMgPyAxIDogMCk7CisJCURFQlVHUEMoRE1FQVMsICJMMV9UQT0ldSAiLCBtci0+bXNfbDEudGEpOworCX0KKworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX1VMX0RUWCkKKwkJREVCVUdQQyhETUVBUywgIkRUWHUgIik7CisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfQkExKQorCQlERUJVR1BDKERNRUFTLCAiQkExICIpOworCWlmICghKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfVkFMSUQpKQorCQlERUJVR1BDKERNRUFTLCAiTk9UIFZBTElEICIpOworCWVsc2UKKwkJcHJpbnRfbWVhc19yZXBfdW5pKCZtci0+ZGwsICJkbCIpOworCisJREVCVUdQQyhETUVBUywgIk5VTV9ORUlHSD0ldVxuIiwgbXItPm51bV9jZWxsKTsKKwlpZiAobXItPm51bV9jZWxsID09IDcpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgbXItPm51bV9jZWxsOyBpKyspIHsKKwkJc3RydWN0IGdzbV9tZWFzX3JlcF9jZWxsICptcmMgPSAmbXItPmNlbGxbaV07CisJCURFQlVHUChETUVBUywgIklEWD0ldSBBUkZDTj0ldSBCU0lDPSV1ID0+ICVkIGRCbVxuIiwKKwkJCW1yYy0+bmVpZ2hfaWR4LCBtcmMtPmFyZmNuLCBtcmMtPmJzaWMsIHJ4bGV2MmRibShtcmMtPnJ4bGV2KSk7CisJfQorfQorCitzdGF0aWMgaW50IHJzbF9yeF9tZWFzX3JlcyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbWVhc19yZXAgKm1yID0gbGNoYW5fbmV4dF9tZWFzX3JlcChtc2ctPmxjaGFuKTsKKwl1X2ludDhfdCBsZW47CisJY29uc3QgdV9pbnQ4X3QgKnZhbDsKKwlpbnQgcmM7CisKKwkvKiBjaGVjayBpZiB0aGlzIGNoYW5uZWwgaXMgYWN0dWFsbHkgYWN0aXZlICovCisJLyogRklYTUU6IG1heWJlIHRoaXMgY2hlY2sgc2hvdWxkIGJlIHdheSBtb3JlIGdlbmVyaWMvY2VudHJhbGl6ZWQgKi8KKwlpZiAobXNnLT5sY2hhbi0+c3RhdGUgIT0gTENIQU5fU19BQ1RJVkUpIHsKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzOiBNRUFTIFJFUyBmb3IgaW5hY3RpdmUgY2hhbm5lbFxuIiwKKwkJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KG1yLCAwLCBzaXplb2YoKm1yKSk7CisJbXItPmxjaGFuID0gbXNnLT5sY2hhbjsKKworCXJzbF90bHZfcGFyc2UoJnRwLCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX01FQVNfUkVTX05SKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX1VQTElOS19NRUFTKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0JTX1BPV0VSKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBNYW5kYXRvcnkgUGFydHMgKi8KKwltci0+bnIgPSAqVExWUF9WQUwoJnRwLCBSU0xfSUVfTUVBU19SRVNfTlIpOworCisJbGVuID0gVExWUF9MRU4oJnRwLCBSU0xfSUVfVVBMSU5LX01FQVMpOworCXZhbCA9IFRMVlBfVkFMKCZ0cCwgUlNMX0lFX1VQTElOS19NRUFTKTsKKwlpZiAobGVuID49IDMpIHsKKwkJaWYgKHZhbFswXSAmIDB4NDApCisJCQltci0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9ETF9EVFg7CisJCW1yLT51bC5mdWxsLnJ4X2xldiA9IHZhbFswXSAmIDB4M2Y7CisJCW1yLT51bC5zdWIucnhfbGV2ID0gdmFsWzFdICYgMHgzZjsKKwkJbXItPnVsLmZ1bGwucnhfcXVhbCA9IHZhbFsyXT4+MyAmIDB4NzsKKwkJbXItPnVsLnN1Yi5yeF9xdWFsID0gdmFsWzJdICYgMHg3OworCX0KKworCW1yLT5ic19wb3dlciA9ICpUTFZQX1ZBTCgmdHAsIFJTTF9JRV9CU19QT1dFUik7CisKKwkvKiBPcHRpb25hbCBQYXJ0cyAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfTVNfVElNSU5HX09GRlNFVCkpCisJCW1yLT5tc190aW1pbmdfb2Zmc2V0ID0KKwkJCSpUTFZQX1ZBTCgmdHAsIFJTTF9JRV9NU19USU1JTkdfT0ZGU0VUKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfTDFfSU5GTykpIHsKKwkJdmFsID0gVExWUF9WQUwoJnRwLCBSU0xfSUVfTDFfSU5GTyk7CisJCW1yLT5mbGFncyB8PSBNRUFTX1JFUF9GX01TX0wxOworCQltci0+bXNfbDEucHdyID0gbXNfcHdyX2RibShtc2ctPnRyeC0+YnRzLT5iYW5kLCB2YWxbMF0gPj4gMyk7CisJCWlmICh2YWxbMF0gJiAweDA0KQorCQkJbXItPmZsYWdzIHw9IE1FQVNfUkVQX0ZfRlBDOworCQltci0+bXNfbDEudGEgPSB2YWxbMV07CisJfQorCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfTDNfSU5GTykpIHsKKwkJbXNnLT5sM2ggPSAodV9pbnQ4X3QgKikgVExWUF9WQUwoJnRwLCBSU0xfSUVfTDNfSU5GTyk7CisJCXJjID0gZ3NtNDhfcGFyc2VfbWVhc19yZXAobXIsIG1zZyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCisJcHJpbnRfbWVhc19yZXAobXIpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX01FQVNfUkVQLCBtcik7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA4LjQuNyAqLworc3RhdGljIGludCByc2xfcnhfaGFuZG9fZGV0KHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlERUJVR1AoRFJTTCwgIiVzIEhBTkRPVkVSIERFVEVDVCAiLCBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSk7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0FDQ0VTU19ERUxBWSkpCisJCURFQlVHUEMoRFJTTCwgImFjY2VzcyBkZWxheSA9ICV1XG4iLAorCQkJKlRMVlBfVkFMKCZ0cCwgUlNMX0lFX0FDQ0VTU19ERUxBWSkpOworCWVsc2UKKwkJREVCVUdQQyhEUlNMLCAiXG4iKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9IQU5ET1ZFUl9ERVRFQ1QsIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfZGNoYW4oc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCWludCByYyA9IDA7CisJY2hhciAqdHNfbmFtZTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJzbGgtPmNoYW5fbnIpOworCXRzX25hbWUgPSBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKTsKKworCXN3aXRjaCAocnNsaC0+Yy5tc2dfdHlwZSkgeworCWNhc2UgUlNMX01UX0NIQU5fQUNUSVZfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIENIQU5ORUwgQUNUSVZBVEUgQUNLXG4iLCB0c19uYW1lKTsKKwkJcmMgPSByc2xfcnhfY2hhbl9hY3RfYWNrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0NIQU5fQUNUSVZfTkFDSzoKKwkJcmMgPSByc2xfcnhfY2hhbl9hY3RfbmFjayhtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9DT05OX0ZBSUw6CisJCXJjID0gcnNsX3J4X2Nvbm5fZmFpbChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9NRUFTX1JFUzoKKwkJcmMgPSByc2xfcnhfbWVhc19yZXMobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSEFORE9fREVUOgorCQlyYyA9IHJzbF9yeF9oYW5kb19kZXQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUkZfQ0hBTl9SRUxfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIFJGIENIQU5ORUwgUkVMRUFTRSBBQ0tcbiIsIHRzX25hbWUpOworCQlpZiAobXNnLT5sY2hhbi0+c3RhdGUgIT0gTENIQU5fU19SRUxfUkVRKQorCQkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIENIQU4gUkVMIEFDSyBidXQgc3RhdGUgJXNcbiIsCisJCQkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbiksCisJCQkJZ3NtX2xjaGFuc19uYW1lKG1zZy0+bGNoYW4tPnN0YXRlKSk7CisJCXJzbF9sY2hhbl9zZXRfc3RhdGUobXNnLT5sY2hhbiwgTENIQU5fU19OT05FKTsKKwkJbGNoYW5fZnJlZShtc2ctPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfTU9ERV9NT0RJRllfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIENIQU5ORUwgTU9ERSBNT0RJRlkgQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfTU9ERV9NT0RJRllfTkFDSzoKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgQ0hBTk5FTCBNT0RFIE1PRElGWSBOQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0FDVF9BQ0s6CisJCURFQlVHUEMoRFJTTCwgIiVzIElQQUMgUERDSCBBQ1QgQUNLXG4iLCB0c19uYW1lKTsKKwkJbXNnLT5sY2hhbi0+dHMtPmZsYWdzIHw9IFRTX0ZfUERDSF9NT0RFOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfQUNUX05BQ0s6CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUMgUERDSCBBQ1QgTkFDS1xuIiwgdHNfbmFtZSk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfUERDSF9ERUFDVF9BQ0s6CisJCURFQlVHUChEUlNMLCAiJXMgSVBBQyBQRENIIERFQUNUIEFDS1xuIiwgdHNfbmFtZSk7CisJCW1zZy0+bGNoYW4tPnRzLT5mbGFncyAmPSB+VFNfRl9QRENIX01PREU7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfUERDSF9ERUFDVF9OQUNLOgorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBJUEFDIFBEQ0ggREVBQ1QgTkFDS1xuIiwgdHNfbmFtZSk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1BIWV9DT05URVhUX0NPTkY6CisJY2FzZSBSU0xfTVRfUFJFUFJPQ19NRUFTX1JFUzoKKwljYXNlIFJTTF9NVF9UQUxLRVJfREVUOgorCWNhc2UgUlNMX01UX0xJU1RFTkVSX0RFVDoKKwljYXNlIFJTTF9NVF9SRU1PVEVfQ09ERUNfQ09ORl9SRVA6CisJY2FzZSBSU0xfTVRfTVJfQ09ERUNfTU9EX0FDSzoKKwljYXNlIFJTTF9NVF9NUl9DT0RFQ19NT0RfTkFDSzoKKwljYXNlIFJTTF9NVF9NUl9DT0RFQ19NT0RfUEVSOgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgVW5pbXBsZW1lbnRlZCBBYmlzIFJTTCBEQ2hhbiAiCisJCQkibXNnIDB4JTAyeFxuIiwgdHNfbmFtZSwgcnNsaC0+Yy5tc2dfdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyB1bmtub3duIEFiaXMgUlNMIERDaGFuIG1zZyAweCUwMnhcbiIsCisJCQl0c19uYW1lLCByc2xoLT5jLm1zZ190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJzbF9yeF9lcnJvcl9yZXAoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIEVSUk9SIFJFUE9SVCAiLCBnc21fdHJ4X25hbWUobXNnLT50cngpKTsKKworCXJzbF90bHZfcGFyc2UoJnRwLCByc2xoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpyc2xoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0NBVVNFKSkKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfRVJST1IsIFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0NBVVNFKSwKKwkJCQlUTFZQX0xFTigmdHAsIFJTTF9JRV9DQVVTRSkpOworCisJTE9HUEMoRFJTTCwgTE9HTF9FUlJPUiwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF90cngoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChyc2xoLT5tc2dfdHlwZSkgeworCWNhc2UgUlNMX01UX0VSUk9SX1JFUE9SVDoKKwkJcmMgPSByc2xfcnhfZXJyb3JfcmVwKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1JGX1JFU19JTkQ6CisJCS8qIGludGVyZmVyZW5jZSBvbiBpZGxlIGNoYW5uZWxzIG9mIFRSWCAqLworCQkvL0RFQlVHUChEUlNMLCAiJXMgUkYgUmVzb3VyY2UgSW5kaWNhdGlvblxuIiwgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX09WRVJMT0FEOgorCQkvKiBpbmRpY2F0ZSBDQ0NIIC8gQUNDSCAvIHByb2Nlc3NvciBvdmVybG9hZCAqLworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBDQ0NIL0FDQ0gvQ1BVIE92ZXJsb2FkXG4iLAorCQkgICAgIGdzbV90cnhfbmFtZShtc2ctPnRyeCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgVW5rbm93biBBYmlzIFJTTCBUUlggbWVzc2FnZSAiCisJCQkidHlwZSAweCUwMnhcbiIsIGdzbV90cnhfbmFtZShtc2ctPnRyeCksIHJzbGgtPm1zZ190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiByYzsKK30KKworLyogSWYgVDMxMDEgZXhwaXJlcywgd2UgbmV2ZXIgcmVjZWl2ZWQgYSByZXNwb25zZSB0byBJTU1FRElBVEUgQVNTSUdOICovCitzdGF0aWMgdm9pZCB0MzEwMV9leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBkYXRhOworCisJcnNsX3JmX2NoYW5fcmVsZWFzZShsY2hhbik7Cit9CisKKy8qIE1TIGhhcyByZXF1ZXN0ZWQgYSBjaGFubmVsIG9uIHRoZSBSQUNIICovCitzdGF0aWMgaW50IHJzbF9yeF9jaGFuX3JxZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPnRyeC0+YnRzOworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKnJxZF9oZHIgPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IGdzbTQ4X3JlcV9yZWYgKnJxZF9yZWY7CisJc3RydWN0IGdzbTQ4X2ltbV9hc3MgaWE7CisJZW51bSBnc21fY2hhbl90IGxjdHlwZTsKKwllbnVtIGdzbV9jaHJlcV9yZWFzb25fdCBjaHJlcV9yZWFzb247CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJdV9pbnQ4X3QgcnFkX3RhOworCWludCByZXQ7CisKKwl1X2ludDE2X3QgYXJmY247CisJdV9pbnQ4X3QgdHNfbnVtYmVyLCBzdWJjaDsKKworCS8qIHBhcnNlIHJlcXVlc3QgcmVmZXJlbmNlIHRvIGJlIHVzZWQgaW4gaW1tZWRpYXRlIGFzc2lnbiAqLworCWlmIChycWRfaGRyLT5kYXRhWzBdICE9IFJTTF9JRV9SRVFfUkVGRVJFTkNFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJxZF9yZWYgPSAoc3RydWN0IGdzbTQ4X3JlcV9yZWYgKikgJnJxZF9oZHItPmRhdGFbMV07CisKKwkvKiBwYXJzZSBhY2Nlc3MgZGVsYXkgYW5kIHVzZSBhcyBUQSAqLworCWlmIChycWRfaGRyLT5kYXRhW3NpemVvZihzdHJ1Y3QgZ3NtNDhfcmVxX3JlZikrMV0gIT0gUlNMX0lFX0FDQ0VTU19ERUxBWSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcnFkX3RhID0gcnFkX2hkci0+ZGF0YVtzaXplb2Yoc3RydWN0IGdzbTQ4X3JlcV9yZWYpKzJdOworCisJLyogZGV0ZXJtaW5lIGNoYW5uZWwgdHlwZSAoU0RDQ0gvVENIX0YvVENIX0gpIGJhc2VkIG9uCisJICogcmVxdWVzdCByZWZlcmVuY2UgUkEgKi8KKwlsY3R5cGUgPSBnZXRfY3R5cGVfYnlfY2hyZXEoYnRzLCBycWRfcmVmLT5yYSwgYnRzLT5uZXR3b3JrLT5uZWNpKTsKKwljaHJlcV9yZWFzb24gPSBnZXRfcmVhc29uX2J5X2NocmVxKGJ0cywgcnFkX3JlZi0+cmEsIGJ0cy0+bmV0d29yay0+bmVjaSk7CisKKwljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmNocmVxLnRvdGFsKTsKKworCS8qIGNoZWNrIGF2YWlsYWJpbGl0eSAvIGFsbG9jYXRlIGNoYW5uZWwgKi8KKwlsY2hhbiA9IGxjaGFuX2FsbG9jKGJ0cywgbGN0eXBlKTsKKwlpZiAoIWxjaGFuKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJCVFMgJWQgQ0hBTiBSUUQ6IG5vIHJlc291cmNlcyBmb3IgJXMgMHgleFxuIiwKKwkJICAgICBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBnc21fbGNoYW50X25hbWUobGN0eXBlKSwgcnFkX3JlZi0+cmEpOworCQljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmNocmVxLm5vX2NoYW5uZWwpOworCQkvKiBGSVhNRTogc2VuZCBzb21lIGtpbmQgb2YgcmVqZWN0ID8hPyAqLworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAobGNoYW4tPnN0YXRlICE9IExDSEFOX1NfTk9ORSkKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIGxjaGFuX2FsbG9jKCkgcmV0dXJuZWQgY2hhbm5lbCAiCisJCSAgICAgImluIHN0YXRlICVzXG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbiksCisJCSAgICAgZ3NtX2xjaGFuc19uYW1lKGxjaGFuLT5zdGF0ZSkpOworCXJzbF9sY2hhbl9zZXRfc3RhdGUobGNoYW4sIExDSEFOX1NfQUNUX1JFUSk7CisKKwl0c19udW1iZXIgPSBsY2hhbi0+dHMtPm5yOworCWFyZmNuID0gbGNoYW4tPnRzLT50cngtPmFyZmNuOworCXN1YmNoID0gbGNoYW4tPm5yOworCQorCWxjaGFuLT5lbmNyLmFsZ19pZCA9IFJTTF9FTkNfQUxHX0E1KDApOwkvKiBubyBlbmNyeXB0aW9uICovCisJbGNoYW4tPm1zX3Bvd2VyID0gbXNfcHdyX2N0bF9sdmwoYnRzLT5iYW5kLCBidHMtPm1zX21heF9wb3dlcik7CisJbGNoYW4tPmJzX3Bvd2VyID0gMDsgLyogMGRCIHJlZHVjdGlvbiwgb3V0cHV0IHBvd2VyID0gUG4gKi8KKwlsY2hhbi0+cnNsX2Ntb2RlID0gUlNMX0NNT0RfU1BEX1NJR047CisJbGNoYW4tPnRjaF9tb2RlID0gR1NNNDhfQ01PREVfU0lHTjsKKwlyc2xfY2hhbl9hY3RpdmF0ZV9sY2hhbihsY2hhbiwgMHgwMCwgcnFkX3RhLCAwKTsKKworCS8qIGNyZWF0ZSBJTU1FRElBVEUgQVNTSUdOIDA0LjA4IG1lc3NnZSAqLworCW1lbXNldCgmaWEsIDAsIHNpemVvZihpYSkpOworCWlhLmwyX3BsZW4gPSAweDJkOworCWlhLnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJaWEubXNnX3R5cGUgPSBHU000OF9NVF9SUl9JTU1fQVNTOworCWlhLnBhZ2VfbW9kZSA9IEdTTTQ4X1BNX1NBTUU7CisJaWEuY2hhbl9kZXNjLmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwlpYS5jaGFuX2Rlc2MuaDAuaCA9IDA7CisJaWEuY2hhbl9kZXNjLmgwLmFyZmNuX2hpZ2ggPSBhcmZjbiA+PiA4OworCWlhLmNoYW5fZGVzYy5oMC5hcmZjbl9sb3cgPSBhcmZjbiAmIDB4ZmY7CisJaWEuY2hhbl9kZXNjLmgwLnRzYyA9IGJ0cy0+dHNjOworCS8qIHVzZSByZXF1ZXN0IHJlZmVyZW5jZSBleHRyYWN0ZWQgZnJvbSBDSEFOX1JRRCAqLworCW1lbWNweSgmaWEucmVxX3JlZiwgcnFkX3JlZiwgc2l6ZW9mKGlhLnJlcV9yZWYpKTsKKwlpYS50aW1pbmdfYWR2YW5jZSA9IHJxZF90YTsKKwlpYS5tb2JfYWxsb2NfbGVuID0gMDsKKworCURFQlVHUChEUlNMLCAiJXMgQWN0aXZhdGluZyBBUkZDTigldSkgU1MoJXUpIGxjdHlwZSAlcyAiCisJCSJyPSVzIHJhPTB4JTAyeFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pLCBhcmZjbiwgc3ViY2gsCisJCWdzbV9sY2hhbnRfbmFtZShsY2hhbi0+dHlwZSksIGdzbV9jaHJlcV9uYW1lKGNocmVxX3JlYXNvbiksCisJCXJxZF9yZWYtPnJhKTsKKworCS8qIFN0YXJ0IHRpbWVyIFQzMTAxIHRvIHdhaXQgZm9yIEdTTTQ4X01UX1JSX1BBR19SRVNQICovCisJbGNoYW4tPlQzMTAxLmNiID0gdDMxMDFfZXhwaXJlZDsKKwlsY2hhbi0+VDMxMDEuZGF0YSA9IGxjaGFuOworCWJzY19zY2hlZHVsZV90aW1lcigmbGNoYW4tPlQzMTAxLCBidHMtPm5ldHdvcmstPlQzMTAxLCAwKTsKKworCS8qIHNlbmQgSU1NRURJQVRFIEFTU0lHTiBDTUQgb24gUlNMIHRvIEJUUyAodG8gc2VuZCBvbiBDQ0NIIHRvIE1TKSAqLworCXJldCA9IHJzbF9pbW1fYXNzaWduX2NtZChidHMsIHNpemVvZihpYSksICh1X2ludDhfdCAqKSAmaWEpOworCisJcmV0dXJuIHJldDsKK30KKworLyogTVMgaGFzIHJlcXVlc3RlZCBhIGNoYW5uZWwgb24gdGhlIFJBQ0ggKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NjY2hfbG9hZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJdV9pbnQxNl90IHBnX2J1Zl9zcGFjZTsKKwl1X2ludDE2X3QgcmFjaF9zbG90X2NvdW50ID0gLTE7CisJdV9pbnQxNl90IHJhY2hfYnVzeV9jb3VudCA9IC0xOworCXVfaW50MTZfdCByYWNoX2FjY2Vzc19jb3VudCA9IC0xOworCisJc3dpdGNoIChyc2xoLT5kYXRhWzBdKSB7CisJY2FzZSBSU0xfSUVfUEFHSU5HX0xPQUQ6CisJCXBnX2J1Zl9zcGFjZSA9IHJzbGgtPmRhdGFbMV0gPDwgOCB8IHJzbGgtPmRhdGFbMl07CisJCWlmIChpc19pcGFjY2Vzc19idHMobXNnLT50cngtPmJ0cykgJiYgcGdfYnVmX3NwYWNlID09IDB4ZmZmZikgeworCQkJLyogcGFnaW5nIGxvYWQgYmVsb3cgY29uZmlndXJlZCB0aHJlc2hvbGQsIHVzZSA1MCBhcyBkZWZhdWx0ICovCisJCQlwZ19idWZfc3BhY2UgPSA1MDsKKwkJfQorCQlwYWdpbmdfdXBkYXRlX2J1ZmZlcl9zcGFjZShtc2ctPnRyeC0+YnRzLCBwZ19idWZfc3BhY2UpOworCQlicmVhazsKKwljYXNlIFJTTF9JRV9SQUNIX0xPQUQ6CisJCWlmIChtc2ctPmRhdGFfbGVuID49IDcpIHsKKwkJCXJhY2hfc2xvdF9jb3VudCA9IHJzbGgtPmRhdGFbMl0gPDwgOCB8IHJzbGgtPmRhdGFbM107CisJCQlyYWNoX2J1c3lfY291bnQgPSByc2xoLT5kYXRhWzRdIDw8IDggfCByc2xoLT5kYXRhWzVdOworCQkJcmFjaF9hY2Nlc3NfY291bnQgPSByc2xoLT5kYXRhWzZdIDw8IDggfCByc2xoLT5kYXRhWzddOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2NjaGFuKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCisJbXNnLT5sY2hhbiA9IGxjaGFuX2xvb2t1cChtc2ctPnRyeCwgcnNsaC0+Y2hhbl9ucik7CisKKwlzd2l0Y2ggKHJzbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9DSEFOX1JRRDoKKwkJLyogTVMgaGFzIHJlcXVlc3RlZCBhIGNoYW5uZWwgb24gdGhlIFJBQ0ggKi8KKwkJcmMgPSByc2xfcnhfY2hhbl9ycWQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfQ0NDSF9MT0FEX0lORDoKKwkJLyogY3VycmVudCBsb2FkIG9uIHRoZSBDQ0NIICovCisJCXJjID0gcnNsX3J4X2NjY2hfbG9hZChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9ERUxFVEVfSU5EOgorCQkvKiBDQ0NIIG92ZXJsb2FkZWQsIElNTV9BU1NJR04gd2FzIGRyb3BwZWQgKi8KKwljYXNlIFJTTF9NVF9DQkNIX0xPQURfSU5EOgorCQkvKiBjdXJyZW50IGxvYWQgb24gdGhlIENCQ0ggKi8KKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIlVuaW1wbGVtZW50ZWQgQWJpcyBSU0wgVFJYIG1lc3NhZ2UgIgorCQkJInR5cGUgMHglMDJ4XG4iLCByc2xoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIlVua25vd24gQWJpcyBSU0wgVFJYIG1lc3NhZ2UgdHlwZSAiCisJCQkiMHglMDJ4XG4iLCByc2xoLT5jLm1zZ190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJzbF9yeF9ybGxfZXJyX2luZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICpybGxoID0gbXNnYl9sMihtc2cpOworCXVfaW50OF90ICpybG1fY2F1c2UgPSBybGxoLT5kYXRhOworCisJTE9HUChEUkxMLCBMT0dMX0VSUk9SLCAiJXMgRVJST1IgSU5ESUNBVElPTiBjYXVzZT0lc1xuIiwKKwkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbiksCisJCXJzbF9ybG1fY2F1c2VfbmFtZShybG1fY2F1c2VbMV0pKTsKKworCXJsbF9pbmRpY2F0aW9uKG1zZy0+bGNoYW4sIHJsbGgtPmxpbmtfaWQsIEJTQ19STExSX0lORF9FUlJfSU5EKTsKKworCWlmIChybG1fY2F1c2VbMV0gPT0gUkxMX0NBVVNFX1QyMDBfRVhQSVJFRCkgeworCQljb3VudGVyX2luYyhtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcmstPnN0YXRzLmNoYW4ucmxsX2Vycik7CisJCXJldHVybiByc2xfcmZfY2hhbl9yZWxlYXNlKG1zZy0+bGNoYW4pOworCX0KKworCXJldHVybiAwOworfQorCisvKglFU1RBQkxJU0ggSU5ESUNBVElPTiwgTE9DQVRJT04gQVJFQSBVUERBVEUgUkVRVUVTVAorCTB4MDIsIDB4MDYsCisJMHgwMSwgMHgyMCwKKwkweDAyLCAweDAwLAorCTB4MGIsIDB4MDAsIDB4MGYsIDB4MDUsIDB4MDgsIC4uLiAqLworCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X3JsbChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICpybGxoID0gbXNnYl9sMihtc2cpOworCWludCByYyA9IDA7CisJY2hhciAqdHNfbmFtZTsKKwl1X2ludDhfdCBzYXBpID0gcmxsaC0+bGlua19pZCAmIDc7CisKKwltc2ctPmxjaGFuID0gbGNoYW5fbG9va3VwKG1zZy0+dHJ4LCBybGxoLT5jaGFuX25yKTsKKwl0c19uYW1lID0gZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbik7CisJREVCVUdQKERSTEwsICIlcyBTQVBJPSV1ICIsIHRzX25hbWUsIHNhcGkpOworCQorCXN3aXRjaCAocmxsaC0+Yy5tc2dfdHlwZSkgeworCWNhc2UgUlNMX01UX0RBVEFfSU5EOgorCQlERUJVR1BDKERSTEwsICJEQVRBIElORElDQVRJT05cbiIpOworCQlpZiAobXNnYl9sMmxlbihtc2cpID4KKwkJICAgIHNpemVvZihzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkcikgKyBzaXplb2YoKnJsbGgpICYmCisJCSAgICBybGxoLT5kYXRhWzBdID09IFJTTF9JRV9MM19JTkZPKSB7CisJCQltc2ctPmwzaCA9ICZybGxoLT5kYXRhWzNdOworCQkJcmV0dXJuIGdzbTA0MDhfcmN2bXNnKG1zZywgcmxsaC0+bGlua19pZCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfRVNUX0lORDoKKwkJREVCVUdQQyhEUkxMLCAiRVNUQUJMSVNIIElORElDQVRJT05cbiIpOworCQkvKiBsY2hhbiBpcyBlc3RhYmxpc2hlZCwgc3RvcCBUMzEwMSAqLworCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfTVM7CisJCWJzY19kZWxfdGltZXIoJm1zZy0+bGNoYW4tPlQzMTAxKTsKKwkJaWYgKG1zZ2JfbDJsZW4obXNnKSA+CisJCSAgICBzaXplb2Yoc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIpICsgc2l6ZW9mKCpybGxoKSAmJgorCQkgICAgcmxsaC0+ZGF0YVswXSA9PSBSU0xfSUVfTDNfSU5GTykgeworCQkJbXNnLT5sM2ggPSAmcmxsaC0+ZGF0YVszXTsKKwkJCXJldHVybiBnc20wNDA4X3Jjdm1zZyhtc2csIHJsbGgtPmxpbmtfaWQpOworCQl9CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0VTVF9DT05GOgorCQlERUJVR1BDKERSTEwsICJFU1RBQkxJU0ggQ09ORklSTVxuIik7CisJCW1zZy0+bGNoYW4tPnNhcGlzW3JsbGgtPmxpbmtfaWQgJiAweDddID0gTENIQU5fU0FQSV9ORVQ7CisJCXJsbF9pbmRpY2F0aW9uKG1zZy0+bGNoYW4sIHJsbGgtPmxpbmtfaWQsCisJCQkJICBCU0NfUkxMUl9JTkRfRVNUX0NPTkYpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9SRUxfSU5EOgorCQkvKiBCVFMgaW5mb3JtcyB1cyBvZiBoYXZpbmcgcmVjZWl2ZWQgIERJU0MgZnJvbSBNUyAqLworCQlERUJVR1BDKERSTEwsICJSRUxFQVNFIElORElDQVRJT05cbiIpOworCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfVU5VU0VEOworCQlybGxfaW5kaWNhdGlvbihtc2ctPmxjaGFuLCBybGxoLT5saW5rX2lkLAorCQkJCSAgQlNDX1JMTFJfSU5EX1JFTF9JTkQpOworCQkvKiB3ZSBjYW4gbm93IHJlbGVhZSB0aGUgY2hhbm5lbCBvbiB0aGUgQlRTL0FiaXMgc2lkZSAqLworCQkvKiBGSVhNRTogb2ZmaWNpYWxseSB3ZSBuZWVkIHRvIHN0YXJ0IFQzMTExIGFuZCB3YWl0IGZvcgorCQkgKiBzb21lIGdyYWNlIHBlcmlvZCAqLworCQlyc2xfcmZfY2hhbl9yZWxlYXNlKG1zZy0+bGNoYW4pOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9SRUxfQ09ORjoKKwkJLyogQlRTIGluZm9ybXMgdXMgb2YgaGF2aW5nIHJlY2VpdmVkIFVBIGZyb20gTVMsCisJCSAqIGluIHJlc3BvbnNlIHRvIERJU0MgdGhhdCB3ZSd2ZSBzZW50IGVhcmxpZXIgKi8KKwkJREVCVUdQQyhEUkxMLCAiUkVMRUFTRSBDT05GSVJNQVRJT05cbiIpOworCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfVU5VU0VEOworCQkvKiB3ZSBjYW4gbm93IHJlbGVhZSB0aGUgY2hhbm5lbCBvbiB0aGUgQlRTL0FiaXMgc2lkZSAqLworCQkvKiBGSVhNRTogb2ZmaWNpYWxseSB3ZSBuZWVkIHRvIHN0YXJ0IFQzMTExIGFuZCB3YWl0IGZvcgorCQkgKiBzb21lIGdyYWNlIHBlcmlvZCAqLworCQlyc2xfcmZfY2hhbl9yZWxlYXNlKG1zZy0+bGNoYW4pOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9FUlJPUl9JTkQ6CisJCXJjID0gcnNsX3J4X3JsbF9lcnJfaW5kKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1VOSVRfREFUQV9JTkQ6CisJCUxPR1AoRFJMTCwgTE9HTF9OT1RJQ0UsICJ1bmltcGxlbWVudGVkIEFiaXMgUkxMIG1lc3NhZ2UgIgorCQkJInR5cGUgMHglMDJ4XG4iLCBybGxoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUkxMLCBMT0dMX05PVElDRSwgInVua25vd24gQWJpcyBSTEwgbWVzc2FnZSAiCisJCQkidHlwZSAweCUwMnhcbiIsIHJsbGgtPmMubXNnX3R5cGUpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB1X2ludDhfdCBpcGFfc21vZF9zX2Zvcl9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzd2l0Y2ggKGxjaGFuLT50Y2hfbW9kZSkgeworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX1YxOgorCQlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQkJcmV0dXJuIDB4MDA7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQkJcmV0dXJuIDB4MDM7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0VGUjoKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiAweDAxOworCQkvKiB0aGVyZSdzIG5vIGhhbGYtcmF0ZSBFRlIgKi8KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SOgorCQlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQkJcmV0dXJuIDB4MDI7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQkJcmV0dXJuIDB4MDU7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlMT0dQKERSU0wsIExPR0xfRVJST1IsICJDYW5ub3QgZGV0ZXJtaW5lIGlwLmFjY2VzcyBzcGVlY2ggbW9kZSBmb3IgIgorCQkidGNoX21vZGUgPT0gMHglMDJ4XG4iLCBsY2hhbi0+dGNoX21vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdV9pbnQ4X3QgaXBhX3J0cF9wdF9mb3JfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3dpdGNoIChsY2hhbi0+dGNoX21vZGUpIHsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9WMToKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiBSVFBfUFRfR1NNX0ZVTEw7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQkJcmV0dXJuIFJUUF9QVF9HU01fSEFMRjsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOgorCQlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQkJcmV0dXJuIFJUUF9QVF9HU01fRUZSOworCQkvKiB0aGVyZSdzIG5vIGhhbGYtcmF0ZSBFRlIgKi8KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SOgorCQlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQkJcmV0dXJuIFJUUF9QVF9BTVJfRlVMTDsKKwkJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCQlyZXR1cm4gUlRQX1BUX0FNUl9IQUxGOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiQ2Fubm90IGRldGVybWluZSBpcC5hY2Nlc3MgcnRwIHBheWxvYWQgdHlwZSBmb3IgIgorCQkidGNoX21vZGUgPT0gMHglMDJ4XG4gJiBsY2hhbl90eXBlID09ICVkIiwKKwkJbGNoYW4tPnRjaF9tb2RlLCBsY2hhbi0+dHlwZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGlwLmFjY2VzcyBzcGVjaWZpYyBSU0wgZXh0ZW5zaW9ucyAqLworc3RhdGljIHZvaWQgaXBhY19wYXJzZV9ydHAoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCB0bHZfcGFyc2VkICp0dikKK3sKKwlzdHJ1Y3QgaW5fYWRkciBpcDsKKwl1X2ludDE2X3QgcG9ydCwgY29ubl9pZDsKKworCWlmIChUTFZQX1BSRVNFTlQodHYsIFJTTF9JRV9JUEFDX0xPQ0FMX0lQKSkgeworCQlpcC5zX2FkZHIgPSAqKCh1X2ludDMyX3QgKikgVExWUF9WQUwodHYsIFJTTF9JRV9JUEFDX0xPQ0FMX0lQKSk7CisJCURFQlVHUEMoRFJTTCwgIkxPQ0FMX0lQPSVzICIsIGluZXRfbnRvYShpcCkpOworCQlsY2hhbi0+YWJpc19pcC5ib3VuZF9pcCA9IG50b2hsKGlwLnNfYWRkcik7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfTE9DQUxfUE9SVCkpIHsKKwkJcG9ydCA9ICooKHVfaW50MTZfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfTE9DQUxfUE9SVCkpOworCQlwb3J0ID0gbnRvaHMocG9ydCk7CisJCURFQlVHUEMoRFJTTCwgIkxPQ0FMX1BPUlQ9JXUgIiwgcG9ydCk7CisJCWxjaGFuLT5hYmlzX2lwLmJvdW5kX3BvcnQgPSBwb3J0OworCX0KKworCWlmIChUTFZQX1BSRVNFTlQodHYsIFJTTF9JRV9JUEFDX0NPTk5fSUQpKSB7CisJCWNvbm5faWQgPSAqKCh1X2ludDE2X3QgKikgVExWUF9WQUwodHYsIFJTTF9JRV9JUEFDX0NPTk5fSUQpKTsKKwkJY29ubl9pZCA9IG50b2hzKGNvbm5faWQpOworCQlERUJVR1BDKERSU0wsICJDT05fSUQ9JXUgIiwgY29ubl9pZCk7CisJCWxjaGFuLT5hYmlzX2lwLmNvbm5faWQgPSBjb25uX2lkOworCX0KKworCWlmIChUTFZQX1BSRVNFTlQodHYsIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMikpIHsKKwkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyID0KKwkJCQkqVExWUF9WQUwodHYsIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMik7CisJCURFQlVHUEMoRFJTTCwgIlJUUF9QQVlMT0FEMj0weCUwMnggIiwKKwkJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMik7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUpKSB7CisJCWxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlID0KKwkJCQkqVExWUF9WQUwodHYsIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFKTsKKwkJREVCVUdQQyhEUlNMLCAic3BlZWNoX21vZGU9MHglMDJ4ICIsCisJCQlsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX0lQKSkgeworCQlpcC5zX2FkZHIgPSAqKCh1X2ludDMyX3QgKikgVExWUF9WQUwodHYsIFJTTF9JRV9JUEFDX1JFTU9URV9JUCkpOworCQlERUJVR1BDKERSU0wsICJSRU1PVEVfSVA9JXMgIiwgaW5ldF9udG9hKGlwKSk7CisJCWxjaGFuLT5hYmlzX2lwLmNvbm5lY3RfaXAgPSBudG9obChpcC5zX2FkZHIpOworCX0KKworCWlmIChUTFZQX1BSRVNFTlQodHYsIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUKSkgeworCQlwb3J0ID0gKigodV9pbnQxNl90ICopIFRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19SRU1PVEVfUE9SVCkpOworCQlwb3J0ID0gbnRvaHMocG9ydCk7CisJCURFQlVHUEMoRFJTTCwgIlJFTU9URV9QT1JUPSV1ICIsIHBvcnQpOworCQlsY2hhbi0+YWJpc19pcC5jb25uZWN0X3BvcnQgPSBwb3J0OworCX0KK30KKworaW50IHJzbF9pcGFjY19jcmN4KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0lQQUNfQ1JDWCk7CisJZGgtPmMubXNnX2Rpc2NyID0gQUJJU19SU0xfTURJU0NfSVBBQ0NFU1M7CisJZGgtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCS8qIDB4MS0gPT0gcmVjZWl2ZS1vbmx5LCAweC0xID09IEVGUiBjb2RlYyAqLworCWxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlID0gMHgxMCB8IGlwYV9zbW9kX3NfZm9yX2xjaGFuKGxjaGFuKTsKKwlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZCA9IGlwYV9ydHBfcHRfZm9yX2xjaGFuKGxjaGFuKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRCwgbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQpOworCisJREVCVUdQKERSU0wsICIlcyBJUEFDX0JJTkQgc3BlZWNoX21vZGU9MHglMDJ4IFJUUF9QQVlMT0FEPSVkXG4iLAorCQlnc21fbGNoYW5fbmFtZShsY2hhbiksIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlLAorCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZCk7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9pcGFjY19tZGN4KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0LAorCQkgICB1X2ludDhfdCBydHBfcGF5bG9hZDIpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJdV9pbnQzMl90ICphdHRfaXA7CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSVBBQ19NRENYKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19JUEFDQ0VTUzsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJLyogd2UgbmVlZCB0byBzdG9yZSB0aGVzZSBub3cgYXMgTURDWF9BQ0sgZG9lcyBub3QgcmV0dXJuIHRoZW0gOiggKi8KKwlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIgPSBydHBfcGF5bG9hZDI7CisJbGNoYW4tPmFiaXNfaXAuY29ubmVjdF9wb3J0ID0gcG9ydDsKKwlsY2hhbi0+YWJpc19pcC5jb25uZWN0X2lwID0gaXA7CisKKwkvKiAweDAtID09IGJvdGggZGlyZWN0aW9ucywgMHgtMSA9PSBFRlIgY29kZWMgKi8KKwlsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSA9IDB4MDAgfCBpcGFfc21vZF9zX2Zvcl9sY2hhbihsY2hhbik7CisJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQgPSBpcGFfcnRwX3B0X2Zvcl9sY2hhbihsY2hhbik7CisKKwlpYS5zX2FkZHIgPSBodG9ubChpcCk7CisJREVCVUdQKERSU0wsICIlcyBJUEFDX01EQ1ggSVA9JXMgUE9SVD0lZCBSVFBfUEFZTE9BRD0lZCBSVFBfUEFZTE9BRDI9JWQgIgorCQkiQ09OTl9JRD0lZCBzcGVlY2hfbW9kZT0weCUwMnhcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwKKwkJaW5ldF9udG9hKGlhKSwgcG9ydCwgbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQsIHJ0cF9wYXlsb2FkMiwKKwkJbGNoYW4tPmFiaXNfaXAuY29ubl9pZCwgbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUpOworCisJbXNnYl90djE2X3B1dChtc2csIFJTTF9JRV9JUEFDX0NPTk5fSUQsIGxjaGFuLT5hYmlzX2lwLmNvbm5faWQpOworCW1zZ2Jfdl9wdXQobXNnLCBSU0xfSUVfSVBBQ19SRU1PVEVfSVApOworCWF0dF9pcCA9ICh1X2ludDMyX3QgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoaXApKTsKKwkqYXR0X2lwID0gaWEuc19hZGRyOworCW1zZ2JfdHYxNl9wdXQobXNnLCBSU0xfSUVfSVBBQ19SRU1PVEVfUE9SVCwgcG9ydCk7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERSwgbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQsIGxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkKTsKKwlpZiAocnRwX3BheWxvYWQyKQorCQltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMiwgcnRwX3BheWxvYWQyKTsKKwkKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogdGVsbCBCVFMgdG8gY29ubmVjdCBSVFAgc3RyZWFtIHRvIG91ciBsb2NhbCBSVFAgc29ja2V0ICovCitpbnQgcnNsX2lwYWNjX21kY3hfdG9fcnRwc29jayhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgcnRwX3NvY2tldCAqcnMgPSBsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0OworCWludCByYzsKKworCXJjID0gcnNsX2lwYWNjX21kY3gobGNoYW4sIG50b2hsKHJzLT5ydHAuc2luX2xvY2FsLnNpbl9hZGRyLnNfYWRkciksCisJCQkJbnRvaHMocnMtPnJ0cC5zaW5fbG9jYWwuc2luX3BvcnQpLAorCQkJLyogRklYTUU6IHVzZSBSVFAgcGF5bG9hZCBvZiBib3VuZCBzb2NrZXQsIG5vdCBCVFMqLworCQkJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMik7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCByc2xfaXBhY2NfcGRjaF9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgaW50IGFjdCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwl1X2ludDhfdCBtc2dfdHlwZTsKKworCWlmIChhY3QpCisJCW1zZ190eXBlID0gUlNMX01UX0lQQUNfUERDSF9BQ1Q7CisJZWxzZQorCQltc2dfdHlwZSA9IFJTTF9NVF9JUEFDX1BEQ0hfREVBQ1Q7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBtc2dfdHlwZSk7CisJZGgtPmMubXNnX2Rpc2NyID0gQUJJU19SU0xfTURJU0NfREVEX0NIQU47CisJZGgtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCURFQlVHUChEUlNMLCAiJXMgSVBBQ19QRENIXyVzQUNUXG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbiksCisJCWFjdCA/ICIiIDogIkRFIik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9pcGFjY19jcmN4X2FjayhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHR2OworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gbXNnLT5sY2hhbjsKKworCS8qIHRoZSBCVFMgaGFzIGFja25vd2xlZGdlZCBhIGxvY2FsIGJpbmQsIGl0IG5vdyB0ZWxscyB1cyB0aGUgSVAKKwkqIGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyIHRvIHdoaWNoIGl0IGhhcyBib3VuZCB0aGUgZ2l2ZW4gbG9naWNhbAorCSogY2hhbm5lbCAqLworCisJcnNsX3Rsdl9wYXJzZSgmdHYsIGRoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpkaCkpOworCWlmICghVExWUF9QUkVTRU5UKCZ0diwgUlNMX0lFX0lQQUNfTE9DQUxfUE9SVCkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHYsIFJTTF9JRV9JUEFDX0xPQ0FMX0lQKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0diwgUlNMX0lFX0lQQUNfQ09OTl9JRCkpIHsKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIm1hbmRhdG9yeSBJRSBtaXNzaW5nIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlwYWNfcGFyc2VfcnRwKGxjaGFuLCAmdHYpOworCisJLyogaW4gY2FzZSB3ZSBkb24ndCB1c2UgZGlyZWN0IEJUUy10by1CVFMgUlRQICovCisJaWYgKCFpcGFjY19ydHBfZGlyZWN0KSB7CisJCWludCByYzsKKwkJLyogdGhlIEJUUyBoYXMgc3VjY2Vzc2Z1bGx5IGJvdW5kIGEgVENIIHRvIGEgbG9jYWwgaXAvcG9ydCwKKwkJICogd2hpY2ggbWVhbnMgd2UgY2FuIGNvbm5lY3Qgb3VyIFVEUCBzb2NrZXQgdG8gaXQgKi8KKwkJaWYgKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpIHsKKwkJCXJ0cF9zb2NrZXRfZnJlZShsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KTsKKwkJCWxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQgPSBOVUxMOworCQl9CisKKwkJbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCA9IHJ0cF9zb2NrZXRfY3JlYXRlKCk7CisJCWlmICghbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkKKwkJCWdvdG8gb3V0X2VycjsKKworCQlyYyA9IHJ0cF9zb2NrZXRfY29ubmVjdChsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0LAorCQkJCSAgIGxjaGFuLT5hYmlzX2lwLmJvdW5kX2lwLAorCQkJCSAgIGxjaGFuLT5hYmlzX2lwLmJvdW5kX3BvcnQpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXRfZXJyOworCX0KKworCWRpc3BhdGNoX3NpZ25hbChTU19BQklTSVAsIFNfQUJJU0lQX0NSQ1hfQUNLLCBtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworb3V0X2VycjoKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9pcGFjY19tZGN4X2FjayhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHR2OworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gbXNnLT5sY2hhbjsKKworCS8qIHRoZSBCVFMgaGFzIGFja25vd2xlZGdlZCBhIHJlbW90ZSBjb25uZWN0IHJlcXVlc3QgYW5kCisJICogaXQgbm93IHRlbGxzIHVzIHRoZSBJUCBhZGRyZXNzIGFuZCBwb3J0IG51bWJlciB0byB3aGljaCBpdCBoYXMKKwkgKiBjb25uZWN0ZWQgdGhlIGdpdmVuIGxvZ2ljYWwgY2hhbm5lbCAqLworCisJcnNsX3Rsdl9wYXJzZSgmdHYsIGRoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpkaCkpOworCWlwYWNfcGFyc2VfcnRwKGxjaGFuLCAmdHYpOworCWRpc3BhdGNoX3NpZ25hbChTU19BQklTSVAsIFNfQUJJU0lQX01EQ1hfQUNLLCBtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjX2RsY3hfaW5kKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHY7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCisJcnNsX3Rsdl9wYXJzZSgmdHYsIGRoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpkaCkpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHYsIFJTTF9JRV9DQVVTRSkpCisJCXByaW50X3JzbF9jYXVzZShMT0dMX0RFQlVHLCBUTFZQX1ZBTCgmdHYsIFJTTF9JRV9DQVVTRSksCisJCQkJVExWUF9MRU4oJnR2LCBSU0xfSUVfQ0FVU0UpKTsKKworCS8qIHRoZSBCVFMgdGVsbHMgdXMgYSBSVFAgc3RyZWFtIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCAqLworCWlmIChsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KSB7CisJCXJ0cF9zb2NrZXRfZnJlZShsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KTsKKwkJbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCA9IE5VTEw7CisJfQorCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0FCSVNJUCwgU19BQklTSVBfRExDWF9JTkQsIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfaXBhY2Moc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfcmxsX2hkciAqcmxsaCA9IG1zZ2JfbDIobXNnKTsKKwljaGFyICp0c19uYW1lOworCWludCByYyA9IDA7CisKKwltc2ctPmxjaGFuID0gbGNoYW5fbG9va3VwKG1zZy0+dHJ4LCBybGxoLT5jaGFuX25yKTsKKwl0c19uYW1lID0gZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbik7CisJCisJc3dpdGNoIChybGxoLT5jLm1zZ190eXBlKSB7CisJY2FzZSBSU0xfTVRfSVBBQ19DUkNYX0FDSzoKKwkJREVCVUdQKERSU0wsICIlcyBJUEFDX0NSQ1hfQUNLICIsIHRzX25hbWUpOworCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjX2NyY3hfYWNrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfQ1JDWF9OQUNLOgorCQkvKiBzb21laG93IHRoZSBCVFMgd2FzIHVuYWJsZSB0byBiaW5kIHRoZSBsY2hhbiB0byBpdHMgbG9jYWwKKwkJICogcG9ydD8hPyAqLworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBJUEFDX0NSQ1hfTkFDS1xuIiwgdHNfbmFtZSk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfTURDWF9BQ0s6CisJCS8qIHRoZSBCVFMgdGVsbHMgdXMgdGhhdCBhIGNvbm5lY3Qgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsICovCisJCURFQlVHUChEUlNMLCAiJXMgSVBBQ19NRENYX0FDSyAiLCB0c19uYW1lKTsKKwkJcmMgPSBhYmlzX3JzbF9yeF9pcGFjY19tZGN4X2Fjayhtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX01EQ1hfTkFDSzoKKwkJLyogc29tZWhvdyB0aGUgQlRTIHdhcyB1bmFibGUgdG8gY29ubmVjdCB0aGUgbGNoYW4gdG8gYSByZW1vdGUKKwkJICogcG9ydCAqLworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBJUEFDX01EQ1hfTkFDS1xuIiwgdHNfbmFtZSk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfRExDWF9JTkQ6CisJCURFQlVHUChEUlNMLCAiJXMgSVBBQ19ETENYX0lORCAiLCB0c19uYW1lKTsKKwkJcmMgPSBhYmlzX3JzbF9yeF9pcGFjY19kbGN4X2luZChtc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiVW5rbm93biBpcC5hY2Nlc3MgbXNnX3R5cGUgMHglMDJ4XG4iLAorCQkJcmxsaC0+Yy5tc2dfdHlwZSk7CisJCWJyZWFrOworCX0KKwlERUJVR1BDKERSU0wsICJcbiIpOworCisJcmV0dXJuIHJjOworfQorCisKKy8qIEVudHJ5LXBvaW50IHdoZXJlIEwyIFJTTCBmcm9tIEJUUyBlbnRlcnMgKi8KK2ludCBhYmlzX3JzbF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciAqcnNsaDsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFtc2cpIHsKKwkJREVCVUdQKERSU0wsICJFbXB0eSBSU0wgbXNnPy4uXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChtc2diX2wybGVuKG1zZykgPCBzaXplb2YoKnJzbGgpKSB7CisJCURFQlVHUChEUlNMLCAiVHJ1bmNhdGVkIFJTTCBtZXNzYWdlIHdpdGggbDJsZW46ICV1XG4iLCBtc2diX2wybGVuKG1zZykpOworCQlyZXR1cm4gLTE7CisJfQorCisJcnNsaCA9IG1zZ2JfbDIobXNnKTsKKworCXN3aXRjaCAocnNsaC0+bXNnX2Rpc2NyICYgMHhmZSkgeworCWNhc2UgQUJJU19SU0xfTURJU0NfUkxMOgorCQlyYyA9IGFiaXNfcnNsX3J4X3JsbChtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX0RFRF9DSEFOOgorCQlyYyA9IGFiaXNfcnNsX3J4X2RjaGFuKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQUJJU19SU0xfTURJU0NfQ09NX0NIQU46CisJCXJjID0gYWJpc19yc2xfcnhfY2NoYW4obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19UUlg6CisJCXJjID0gYWJpc19yc2xfcnhfdHJ4KG1zZyk7CisJCWJyZWFrOworCWNhc2UgQUJJU19SU0xfTURJU0NfTE9DOgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAidW5pbXBsZW1lbnRlZCBSU0wgbXNnIGRpc2MgMHglMDJ4XG4iLAorCQkJcnNsaC0+bXNnX2Rpc2NyKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19JUEFDQ0VTUzoKKwkJcmMgPSBhYmlzX3JzbF9yeF9pcGFjYyhtc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAidW5rbm93biBSU0wgbWVzc2FnZSBkaXNjcmltaW5hdG9yICIKKwkJCSIweCUwMnhcbiIsIHJzbGgtPm1zZ19kaXNjcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltc2diX2ZyZWUobXNnKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIEZyb20gVGFibGUgMTAuNS4zMyBvZiBHU00gMDQuMDggKi8KK2ludCByc2xfbnVtYmVyX29mX3BhZ2luZ19zdWJjaGFubmVscyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWlmIChidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuY2NjaF9jb25mID09IFJTTF9CQ0NIX0NDQ0hfQ09ORl8xX0MpIHsKKwkJcmV0dXJuIE1BWCgxLCAoMyAtIGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19hZ19ibGtzX3JlcykpCisJCQkqIChidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuYnNfcGFfbWZybXMgKyAyKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gKDkgLSBidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuYnNfYWdfYmxrc19yZXMpCisJCQkqIChidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuYnNfcGFfbWZybXMgKyAyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jIGIvb3BlbmJzYy9zcmMvYnMxMV9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjZkZThhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnMxMV9jb25maWcuYwpAQCAtMCwwICsxLDg3MyBAQAorLyogU2llbWVucyBCUy0xMSBtaWNyb0JUUyBjb25maWd1cmF0aW9uIHRvb2wgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGJhc2VkIG9uIGlkZWFzIChidXQgbm90IGNvZGUpIG9mIEJTMTFDb25maWcKKyAqIChDKSAyMDA5IGJ5IERpZXRlciBTcGFhciA8c3BhYXJAbWlyaWRlci5hdWd1c3RhLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3JzMjMyLmg+CisKKy8qIHN0YXRlIG9mIG91ciBiczExX2NvbmZpZyBhcHBsaWNhdGlvbiAqLworZW51bSBiczExY2ZnX3N0YXRlIHsKKwlTVEFURV9OT05FLAorCVNUQVRFX0xPR09OX1dBSVQsCisJU1RBVEVfTE9HT05fQUNLLAorCVNUQVRFX1NXTE9BRCwKKwlTVEFURV9RVUVSWSwKK307CitzdGF0aWMgZW51bSBiczExY2ZnX3N0YXRlIGJzMTFjZmdfc3RhdGUgPSBTVEFURV9OT05FOworc3RhdGljIGNoYXIgKmNvbW1hbmQsICp2YWx1ZTsKK3N0cnVjdCB0aW1lcl9saXN0IHN0YXR1c190aW1lcjsKKworc3RhdGljIGNvbnN0IHVfaW50OF90IG9ial9saV9hdHRyW10gPSB7CisJTk1fQVRUX0JTMTFfQklUX0VSUl9USEVTSCwgMHgwOSwgMHgwMCwKKwlOTV9BVFRfQlMxMV9MMV9QUk9UX1RZUEUsIDB4MDAsCisJTk1fQVRUX0JTMTFfTElORV9DRkcsIDB4MDAsCit9Oworc3RhdGljIGNvbnN0IHVfaW50OF90IG9ial9iYnNpZzBfYXR0cltdID0geworCU5NX0FUVF9CUzExX1JTU0lfT0ZGUywgMHgwMiwgMHgwMCwgMHgwMCwKKwlOTV9BVFRfQlMxMV9ESVZFUlNJVFksIDB4MDEsIDB4MDAsCit9Oworc3RhdGljIGNvbnN0IHVfaW50OF90IG9ial9wYTBfYXR0cltdID0geworCU5NX0FUVF9CUzExX1RYUFdSLCAweDAxLCBCUzExX1RSWF9QT1dFUl9HU01fMzBtVywKK307CitzdGF0aWMgY29uc3QgY2hhciAqdHJ4MV9wYXNzd29yZCA9ICIxMTExMTExMTExIjsKKyNkZWZpbmUgVEVJX09NTAkyNQorCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgdG9vX2Zhc3RbXSA9IHsgMHgxMiwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiB9OworCitzdGF0aWMgc3RydWN0IGxvZ190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisKKy8qIGR1bW15IGZ1bmN0aW9uIHRvIGtlZXAgZ3NtX2RhdGEuYyBoYXBweSAqLworc3RydWN0IGNvdW50ZXIgKmNvdW50ZXJfYWxsb2MoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGhhbmRsZV9zZXJpYWxfbXNnKHN0cnVjdCBtc2diICpyeF9tc2cpOworCisvKiBjcmVhdGUgYWxsIG9iamVjdHMgZm9yIGFuIGluaXRpYWwgY29uZmlndXJhdGlvbiAqLworc3RhdGljIGludCBjcmVhdGVfb2JqZWN0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWZwcmludGYoc3Rkb3V0LCAiQ3JhdGluZyBPYmplY3RzIGZvciBtaW5pbWFsIGNvbmZpZ1xuIik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9MSSwgMCwgc2l6ZW9mKG9ial9saV9hdHRyKSwKKwkJCQkgICBvYmpfbGlfYXR0cik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9HUFNVLCAwLCAwLCBOVUxMKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0FMQ08sIDAsIDAsIE5VTEwpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfQ0NMSywgMCwgMCwgTlVMTCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9CQlNJRywgMCwKKwkJCQkgICBzaXplb2Yob2JqX2Jic2lnMF9hdHRyKSwgb2JqX2Jic2lnMF9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX1BBLCAwLAorCQkJCSAgIHNpemVvZihvYmpfcGEwX2F0dHIpLCBvYmpfcGEwX2F0dHIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfZW52YUJUU0UoYnRzLCAwKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMSk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShidHMsIDIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfZW52YUJUU0UoYnRzLCAzKTsKKworCWFiaXNfbm1fYnMxMV9jb25uX29tbF90ZWkoYnRzLCAwLCAxLCAweGZmLCBURUlfT01MKTsKKworCWFiaXNfbm1fYnMxMV9zZXRfdHJ4X3Bvd2VyKGJ0cy0+YzAsIEJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XKTsKKwkKKwlzbGVlcCgxKTsKKworCWFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhidHMsIHRyeDFfcGFzc3dvcmQpOworCisJc2xlZXAoMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcmVhdGVfdHJ4MShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXVfaW50OF90IGJic2lnMV9hdHRyW3NpemVvZihvYmpfYmJzaWcwX2F0dHIpKzEyXTsKKwl1X2ludDhfdCAqY3VyID0gYmJzaWcxX2F0dHI7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCAxKTsKKworCWlmICghdHJ4KQorCQl0cnggPSBnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCisJZnByaW50ZihzdGRvdXQsICJDcmF0aW5nIE9iamVjdHMgZm9yIFRSWDFcbiIpOworCisJYWJpc19ubV9iczExX3NldF90cngxX3B3KGJ0cywgdHJ4MV9wYXNzd29yZCk7CisKKwlzbGVlcCgxKTsKKworCWN1ciA9IHRsdl9wdXQoY3VyLCBOTV9BVFRfQlMxMV9QQVNTV09SRCwgMTAsCisJCSAgICAgICh1X2ludDhfdCAqKXRyeDFfcGFzc3dvcmQpOworCW1lbWNweShjdXIsIG9ial9iYnNpZzBfYXR0ciwgc2l6ZW9mKG9ial9iYnNpZzBfYXR0cikpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfQkJTSUcsIDEsCisJCQkJICAgc2l6ZW9mKGJic2lnMV9hdHRyKSwgYmJzaWcxX2F0dHIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfUEEsIDEsCisJCQkJICAgc2l6ZW9mKG9ial9wYTBfYXR0ciksIG9ial9wYTBfYXR0cik7CisJYWJpc19ubV9iczExX3NldF90cnhfcG93ZXIodHJ4LCBCUzExX1RSWF9QT1dFUl9HU01fMzBtVyk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpzZXJpYWxfcG9ydCA9ICIvZGV2L3R0eVVTQjAiOworc3RhdGljIGNoYXIgKmZuYW1lX3NhZmV0eSA9ICJCVFNCTUM3Ni5TV0kiOworc3RhdGljIGNoYXIgKmZuYW1lX3NvZnR3YXJlID0gIkhTMDExMTA2LlNXTCI7CitzdGF0aWMgaW50IGRlbGF5X21zID0gMDsKK3N0YXRpYyBpbnQgd2luX3NpemUgPSA4Oworc3RhdGljIGludCBwYXJhbV9kaXNjb25uZWN0ID0gMDsKK3N0YXRpYyBpbnQgcGFyYW1fcmVzdGFydCA9IDA7CitzdGF0aWMgaW50IHBhcmFtX2ZvcmNlZCA9IDA7CitzdGF0aWMgc3RydWN0IGdzbV9idHMgKmdfYnRzOworCitzdGF0aWMgaW50IGZpbGVfaXNfcmVhZGFibGUoY29uc3QgY2hhciAqZm5hbWUpCit7CisJaW50IHJjOworCXN0cnVjdCBzdGF0IHN0OworCisJcmMgPSBzdGF0KGZuYW1lLCAmc3QpOworCWlmIChyYyA8IDApCisJCXJldHVybiAwOworCisJaWYgKFNfSVNSRUcoc3Quc3RfbW9kZSkgJiYgKHN0LnN0X21vZGUgJiBTX0lSVVNSKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwZXJjZW50Oworc3RhdGljIGludCBwZXJjZW50X29sZDsKKworLyogY2FsbGJhY2sgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBBQklTIE9NTCBjb2RlICovCitzdGF0aWMgaW50IHN3bG9hZF9jYmZuKHVuc2lnbmVkIGludCBob29rLCB1bnNpZ25lZCBpbnQgZXZlbnQsIHN0cnVjdCBtc2diICptc2csCisJCSAgICAgICB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSkKK3sKKwlpZiAoaG9vayAhPSBHU01fSE9PS19OTV9TV0xPQUQpCisJCXJldHVybiAwOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTk1fTVRfTE9BRF9JTklUX0FDSzoKKwkJZnByaW50ZihzdGRvdXQsICJTb2Z0d2FyZSBMb2FkIEluaXRpYXRlIEFDS1xuIik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9JTklUX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IFNvZnR3YXJlIExvYWQgSW5pdGlhdGUgTkFDS1xuIik7CisJCWV4aXQoNSk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9FTkRfQUNLOgorCQlpZiAoZGF0YSkgeworCQkJLyogd2UgZGlkIGEgc2FmZXR5IGxvYWQgYW5kIG11c3QgYWN0aXZhdGUgaXQgKi8KKwkJCWFiaXNfbm1fc29mdHdhcmVfYWN0aXZhdGUoZ19idHMsIGZuYW1lX3NhZmV0eSwKKwkJCQkJCSAgc3dsb2FkX2NiZm4sIGdfYnRzKTsKKwkJCXNsZWVwKDUpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogU29mdHdhcmUgTG9hZCBFbmQgTkFDS1xuIik7CisJCWV4aXQoMyk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSzoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogQWN0aXZhdGUgU29mdHdhcmUgTkFDS1xuIik7CisJCWV4aXQoNCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCQliczExY2ZnX3N0YXRlID0gU1RBVEVfTk9ORTsKKwkJCisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9TRUdfQUNLOgorCQlwZXJjZW50ID0gYWJpc19ubV9zb2Z0d2FyZV9sb2FkX3N0YXR1cyhnX2J0cyk7CisJCWlmIChwZXJjZW50ID4gcGVyY2VudF9vbGQpCisJCQlwcmludGYoIlNvZnR3YXJlIERvd25sb2FkIFByb2dyZXNzOiAlZCUlXG4iLCBwZXJjZW50KTsKKwkJcGVyY2VudF9vbGQgPSBwZXJjZW50OworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpiczExX2xpbmtfc3RhdGVbXSA9IHsKKwlbMHgwMF0JPSAiRG93biIsCisJWzB4MDFdCT0gIlVwIiwKKwlbMHgwMl0JPSAiUmVzdG9yaW5nIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpsaW5rc3RhdGVfbmFtZSh1X2ludDhfdCBsaW5rc3RhdGUpCit7CisJaWYgKGxpbmtzdGF0ZSA+IEFSUkFZX1NJWkUoYnMxMV9saW5rX3N0YXRlKSkKKwkJcmV0dXJuICJVbmtub3duIjsKKworCXJldHVybiBiczExX2xpbmtfc3RhdGVbbGlua3N0YXRlXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm1iY2N1X2xvYWRbXSA9IHsKKwlbMF0JPSAiTm8gTG9hZCIsCisJWzFdCT0gIkxvYWQgQlRTQ0FDIiwKKwlbMl0JPSAiTG9hZCBCVFNEUlgiLAorCVszXQk9ICJMb2FkIEJUU0JCWCIsCisJWzRdCT0gIkxvYWQgQlRTQVJDIiwKKwlbNV0JPSAiTG9hZCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbWJjY3VfbG9hZF9uYW1lKHVfaW50OF90IGxpbmtzdGF0ZSkKK3sKKwlpZiAobGlua3N0YXRlID4gQVJSQVlfU0laRShtYmNjdV9sb2FkKSkKKwkJcmV0dXJuICJVbmtub3duIjsKKworCXJldHVybiBtYmNjdV9sb2FkW2xpbmtzdGF0ZV07Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpidHNfcGhhc2VfbmFtZSh1X2ludDhfdCBwaGFzZSkKK3sKKwlzd2l0Y2ggKHBoYXNlKSB7CisJY2FzZSBCUzExX1NUQVRFX1dBUk1fVVA6CisJY2FzZSBCUzExX1NUQVRFX1dBUk1fVVBfMjoKKwkJcmV0dXJuICJXYXJtIFVwIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0xPQURfU01VX1NBRkVUWToKKwkJcmV0dXJuICJMb2FkIFNNVSBTYWZldHkiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9TTVVfSU5URU5ERUQ6CisJCXJldHVybiAiTG9hZCBTTVUgSW50ZW5kZWQiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9NQkNDVToKKwkJcmV0dXJuICJMb2FkIE1CQ0NVIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1NPRlRXQVJFX1JRRDoKKwkJcmV0dXJuICJTb2Z0d2FyZSByZXF1aXJlZCI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9XQUlUX01JTl9DRkc6CisJY2FzZSBCUzExX1NUQVRFX1dBSVRfTUlOX0NGR18yOgorCQlyZXR1cm4gIldhaXQgbWluaW1hbCBjb25maWciOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfTUFJTlRFTkFOQ0U6CisJCXJldHVybiAiTWFpbnRlbmFuY2UiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfTk9STUFMOgorCQlyZXR1cm4gIk5vcm1hbCI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9BQklTX0xPQUQ6CisJCXJldHVybiAiQWJpcyBsb2FkIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVbmtub3duIjsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqdHJ4X3Bvd2VyX25hbWUodV9pbnQ4X3QgcHdyKQoreworCXN3aXRjaCAocHdyKSB7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9HU01fMlc6CQorCQlyZXR1cm4gIjJXIChHU00pIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0dTTV8yNTBtVzoKKwkJcmV0dXJuICIyNTBtVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9HU01fODBtVzoKKwkJcmV0dXJuICI4MG1XIChHU00pIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XOgorCQlyZXR1cm4gIjMwbVcgKEdTTSkiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfRENTXzNXOgorCQlyZXR1cm4gIjNXIChEQ1MpIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU18xVzY6CisJCXJldHVybiAiMS42VyAoRENTKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9EQ1NfNTAwbVc6CisJCXJldHVybiAiNTAwbVcgKERDUykiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfRENTXzE2MG1XOgorCQlyZXR1cm4gIjE2MG1XIChEQ1MpIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24gdmFsdWUiOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnBsbF9tb2RlX25hbWUodV9pbnQ4X3QgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEJTMTFfTElfUExMX0xPQ0tFRDoKKwkJcmV0dXJuICJFMSBMb2NrZWQiOworCWNhc2UgQlMxMV9MSV9QTExfU1RBTkRBTE9ORToKKwkJcmV0dXJuICJTdGFuZGFsb25lIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24iOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNjbGtfYWNjX25hbWUodV9pbnQ4X3QgYWNjKQoreworCXN3aXRjaCAoYWNjKSB7CisJY2FzZSAwOgorCQkvKiBPdXQgb2YgdGhlIGRlbWFuZGVkICsvLSAwLjA1cHBtICovCisJCXJldHVybiAiTWVkaXVtIjsKKwljYXNlIDE6CisJCS8qIFN5bmNocm9uaXplZCB3aXRoIEFiaXMsIHdpdGhpbiBkZW1hbmRlZCB0b2xlcmFuY2UgKy8tIDAuMDVwcG0gKi8KKwkJcmV0dXJuICJIaWdoIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24iOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm9ial9uYW1lKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCkKK3sKKwlzdGF0aWMgY2hhciByZXRidWZbMjU2XTsKKworCXJldGJ1ZlswXSA9IDA7CisKKwlzd2l0Y2ggKGZvaC0+b2JqX2NsYXNzKSB7CisJY2FzZSBOTV9PQ19CUzExOgorCQlzdHJjYXQocmV0YnVmLCAiQlMxMSAiKTsKKwkJc3dpdGNoIChmb2gtPm9ial9pbnN0LmJ0c19ucikgeworCQljYXNlIEJTMTFfT0JKX1BBOgorCQkJc3ByaW50ZihyZXRidWYrc3RybGVuKHJldGJ1ZiksICJQb3dlciBBbXBsaWZpZXIgJWQgIiwKKwkJCQlmb2gtPm9ial9pbnN0LnRzX25yKTsKKwkJCWJyZWFrOworCQljYXNlIEJTMTFfT0JKX0xJOgorCQkJc3ByaW50ZihyZXRidWYrc3RybGVuKHJldGJ1ZiksICJMaW5lIEludGVyZmFjZSAiKTsKKwkJCWJyZWFrOworCQljYXNlIEJTMTFfT0JKX0NDTEs6CisJCQlzcHJpbnRmKHJldGJ1ZitzdHJsZW4ocmV0YnVmKSwgIkNDTEsgIik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX1NJVEVfTUFOQUdFUjoKKwkJc3RyY2F0KHJldGJ1ZiwgIlNJVEUgTUFOQUdFUiAiKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXRidWY7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3N0YXRlKHN0cnVjdCB0bHZfcGFyc2VkICp0cCkKK3sKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpKSB7CisJCXVfaW50OF90IHBoYXNlLCBtYmNjdTsKKwkJaWYgKFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpID49IDEpIHsKKwkJCXBoYXNlID0gKlRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpOworCQkJcHJpbnRmKCJQSEFTRTogJXUgJS0yMHMgIiwgcGhhc2UgJiAweGYsCisJCQkJYnRzX3BoYXNlX25hbWUocGhhc2UpKTsKKwkJfQorCQlpZiAoVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkgPj0gMikgeworCQkJbWJjY3UgPSAqKFRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpKzEpOworCQkJcHJpbnRmKCJNQkNDVTA6ICUtMTFzIE1CQ0NVMTogJS0xMXMgIiwKKwkJCQltYmNjdV9sb2FkX25hbWUobWJjY3UgJiAweGYpLCBtYmNjdV9sb2FkX25hbWUobWJjY3UgPj4gNCkpOworCQl9CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0UxX1NUQVRFKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfRTFfU1RBVEUpID49IDEpIHsKKwkJdV9pbnQ4X3QgZTFfc3RhdGUgPSAqVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0UxX1NUQVRFKTsKKwkJcHJpbnRmKCJBYmlzLWxpbms6ICUtOXMgIiwgbGlua3N0YXRlX25hbWUoZTFfc3RhdGUgJiAweGYpKTsKKwl9CisJcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgaW50IHByaW50X2F0dHIoc3RydWN0IHRsdl9wYXJzZWQgKnRwKQoreworCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMKSkgeworCQlwcmludGYoIlx0QlMtMTEgRVNOIFBDQiBTZXJpYWwgTnVtYmVyOiAlc1xuIiwKKwkJCVRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCkpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OTykpIHsKKwkJcHJpbnRmKCJcdEJTLTExIEVTTiBIYXJkd2FyZSBDb2RlIE51bWJlcjogJXNcbiIsCisJCQlUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8pKzYpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OTykpIHsKKwkJcHJpbnRmKCJcdEJTLTExIEVTTiBGaXJtd2FyZSBDb2RlIE51bWJlcjogJXNcbiIsCisJCQlUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8pKzYpOworCX0KKyNpZiAwCisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTKSkgeworCQlwcmludGYoIkJTLTExIEJvb3QgU29mdHdhcmUgVmVyc2lvbjogJXNcbiIsCisJCQlUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTKSs2KTsKKwl9CisjZW5kaWYKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQUJJU19DSEFOTkVMKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0FCSVNfQ0hBTk5FTCkgPj0gMykgeworCQljb25zdCB1X2ludDhfdCAqY2hhbiA9IFRMVlBfVkFMKHRwLCBOTV9BVFRfQUJJU19DSEFOTkVMKTsKKwkJcHJpbnRmKCJcdEUxIENoYW5uZWw6IFBvcnQ9JXUgVGltZXNsb3Q9JXUgIiwKKwkJCWNoYW5bMF0sIGNoYW5bMV0pOworCQlpZiAoY2hhblsyXSA9PSAweGZmKQorCQkJcHJpbnRmKCIoRnVsbCBTbG90KVxuIik7CisJCWVsc2UKKwkJCXByaW50ZigiU3Vic2xvdD0ldVxuIiwgY2hhblsyXSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9URUkpKQorCQlwcmludGYoIlx0VEVJOiAlZFxuIiwgKlRMVlBfVkFMKHRwLCBOTV9BVFRfVEVJKSk7CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfVFhQV1IpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9UWFBXUikgPj0gMSkgeworCQlwcmludGYoIlx0VFJYIFBvd2VyOiAlc1xuIiwKKwkJCXRyeF9wb3dlcl9uYW1lKCpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfVFhQV1IpKSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX1BMTF9NT0RFKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfUExMX01PREUpID49IDEpIHsKKwkJcHJpbnRmKCJcdFBMTCBNb2RlOiAlc1xuIiwKKwkJCXBsbF9tb2RlX25hbWUoKlRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9QTExfTU9ERSkpKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfUExMKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfUExMKSA+PSA0KSB7CisJCWNvbnN0IHVfaW50OF90ICp2cCA9IFRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9QTEwpOworCQlwcmludGYoIlx0UExMIFNldCBWYWx1ZT0lZCwgV29yayBWYWx1ZT0lZFxuIiwKKwkJCXZwWzBdIDw8IDggfCB2cFsxXSwgdnBbMl0gPDwgOCB8IHZwWzNdKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1kpID49IDEpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKmFjYyA9IFRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZKTsKKwkJcHJpbnRmKCJcdENDTEsgQWNjdXJhY3k6ICVzICglZClcbiIsIGNjbGtfYWNjX25hbWUoKmFjYyksICphY2MpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9DQ0xLX1RZUEUpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9DQ0xLX1RZUEUpID49IDEpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKmFjYyA9IFRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9DQ0xLX1RZUEUpOworCQlwcmludGYoIlx0Q0NMSyBUeXBlPSVkXG4iLCAqYWNjKTsKKwl9CisKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbWRfcXVlcnkodm9pZCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGdfYnRzLT5jMDsKKworCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9RVUVSWTsKKwlhYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X29tbF90ZWlfdHMoZ19idHMpOworCWFiaXNfbm1fYnMxMV9nZXRfcGxsX21vZGUoZ19idHMpOworCWFiaXNfbm1fYnMxMV9nZXRfY2NsayhnX2J0cyk7CisJYWJpc19ubV9iczExX2dldF90cnhfcG93ZXIodHJ4KTsKKwl0cnggPSBnc21fYnRzX3RyeF9udW0oZ19idHMsIDEpOworCWlmICh0cngpCisJCWFiaXNfbm1fYnMxMV9nZXRfdHJ4X3Bvd2VyKHRyeCk7CisJc2xlZXAoMSk7CisJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCWNvbW1hbmQgPSBOVUxMOworfQorCisvKiBoYW5kbGUgYSByZXNwb25zZSBmcm9tIHRoZSBCVFMgdG8gYSBHRVQgU1RBVEUgY29tbWFuZCAqLworc3RhdGljIGludCBoYW5kbGVfc3RhdGVfcmVzcChlbnVtIGFiaXNfYnMxMV9waGFzZSBzdGF0ZSkKK3sKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgQlMxMV9TVEFURV9XQVJNX1VQOgorCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9TQUZFVFk6CisJY2FzZSBCUzExX1NUQVRFX0xPQURfU01VX0lOVEVOREVEOgorCWNhc2UgQlMxMV9TVEFURV9MT0FEX01CQ0NVOgorCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfU09GVFdBUkVfUlFEOgorCQliczExY2ZnX3N0YXRlID0gU1RBVEVfU1dMT0FEOworCQkvKiBzZW5kIHNhZmV0eSBsb2FkLiBVc2UgZ19idHMgYXMgcHJpdmF0ZSAncGFyYW0nCisJCSAqIGFyZ3VtZW50LCBzbyBvdXIgc3dsb2FkX2NiZm4gY2FuIGRpc3Rpbmd1aXNoCisJCSAqIGEgc2FmZXR5IGxvYWQgZnJvbSBhIHJlZ3VsYXIgc29mdHdhcmUgKi8KKwkJaWYgKGZpbGVfaXNfcmVhZGFibGUoZm5hbWVfc2FmZXR5KSkKKwkJCXJjID0gYWJpc19ubV9zb2Z0d2FyZV9sb2FkKGdfYnRzLCAweGZmLCBmbmFtZV9zYWZldHksCisJCQkJCQkgICB3aW5fc2l6ZSwgcGFyYW1fZm9yY2VkLAorCQkJCQkJICAgc3dsb2FkX2NiZm4sIGdfYnRzKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJObyB2YWxpZCBTYWZldHkgTG9hZCBmaWxlIFwiJXNcIlxuIiwKKwkJCQlmbmFtZV9zYWZldHkpOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHOgorCWNhc2UgQlMxMV9TVEFURV9XQUlUX01JTl9DRkdfMjoKKwkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX1NXTE9BRDsKKwkJcmMgPSBjcmVhdGVfb2JqZWN0cyhnX2J0cyk7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9NQUlOVEVOQU5DRToKKwkJaWYgKGNvbW1hbmQpIHsKKwkJCWlmICghc3RyY21wKGNvbW1hbmQsICJkaXNjb25uZWN0IikpCisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicmVjb25uZWN0IikpCisJCQkJcmMgPSBhYmlzX25tX2JzMTFfYnNjX2Rpc2Nvbm5lY3QoZ19idHMsIDEpOworCQkJZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAic29mdHdhcmUiKQorCQkJICAgICYmIGJzMTFjZmdfc3RhdGUgIT0gU1RBVEVfU1dMT0FEKSB7CisJCQkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX1NXTE9BRDsKKwkJCQkvKiBzZW5kIHNvZnR3YXJlIChGSVhNRTogb3ZlciBBLWJpcz8pICovCisJCQkJaWYgKGZpbGVfaXNfcmVhZGFibGUoZm5hbWVfc29mdHdhcmUpKQorCQkJCQlyYyA9IGFiaXNfbm1fYnMxMV9sb2FkX3N3bChnX2J0cywgZm5hbWVfc29mdHdhcmUsCisJCQkJCQkJCSAgIHdpbl9zaXplLCBwYXJhbV9mb3JjZWQsCisJCQkJCQkJCSAgIHN3bG9hZF9jYmZuKTsKKwkJCQllbHNlCisJCQkJCWZwcmludGYoc3RkZXJyLCAiTm8gdmFsaWQgU29mdHdhcmUgZmlsZSBcIiVzXCJcbiIsCisJCQkJCQlmbmFtZV9zb2Z0d2FyZSk7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImRlbGV0ZS10cngxIikpIHsKKwkJCQlwcmludGYoIkxvY2luZyBCQlNJRyBhbmQgUEEgb2JqZWN0cyBvZiBUUlgxXG4iKTsKKwkJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoZ19idHMsIE5NX09DX0JTMTEsCisJCQkJCQkgICAgICBCUzExX09CSl9CQlNJRywgMCwgMSwKKwkJCQkJCSAgICAgIE5NX1NUQVRFX0xPQ0tFRCk7CisJCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGdfYnRzLCBOTV9PQ19CUzExLAorCQkJCQkJICAgICAgQlMxMV9PQkpfUEEsIDAsIDEsCisJCQkJCQkgICAgICBOTV9TVEFURV9MT0NLRUQpOworCQkJCXNsZWVwKDEpOworCQkJCXByaW50ZigiRGVsZXRpbmcgQkJTSUcgYW5kIFBBIG9iamVjdHMgb2YgVFJYMVxuIik7CisJCQkJYWJpc19ubV9iczExX2RlbGV0ZV9vYmplY3QoZ19idHMsIEJTMTFfT0JKX0JCU0lHLCAxKTsKKwkJCQlhYmlzX25tX2JzMTFfZGVsZXRlX29iamVjdChnX2J0cywgQlMxMV9PQkpfUEEsIDEpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiY3JlYXRlLXRyeDEiKSkgeworCQkJCWNyZWF0ZV90cngxKGdfYnRzKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInBsbC1lMS1sb2NrZWQiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsX2xvY2tlZChnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtc3RhbmRhbG9uZSIpKSB7CisJCQkJYWJpc19ubV9iczExX3NldF9wbGxfbG9ja2VkKGdfYnRzLCAwKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInBsbC1zZXR2YWx1ZSIpKSB7CisJCQkJYWJpc19ubV9iczExX3NldF9wbGwoZ19idHMsIGF0b2kodmFsdWUpKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInBsbC13b3JrdmFsdWUiKSkgeworCQkJCS8qIFRvIHNldCB0aGUgd29yayB2YWx1ZSB3ZSBuZWVkIHRvIGxvZ2luIGFzIEZJRUxEICovCisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9pbmZpZWxkX2xvZ29uKGdfYnRzLCAxKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X3BsbChnX2J0cywgYXRvaSh2YWx1ZSkpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9pbmZpZWxkX2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAib21sLXRlaSIpKSB7CisJCQkJYWJpc19ubV9iczExX2Nvbm5fb21sX3RlaShnX2J0cywgMCwgMSwgMHhmZiwgVEVJX09NTCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInJlc3RhcnQiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9yZXN0YXJ0KGdfYnRzKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicXVlcnkiKSkgeworCQkJCWNtZF9xdWVyeSgpOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJjcmVhdGUtYnBvcnQxIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfY3JlYXRlX2Jwb3J0KGdfYnRzLCAxKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImRlbGV0ZS1icG9ydDEiKSkgeworCQkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShnX2J0cywgTk1fT0NfQlMxMV9CUE9SVCwgMSwgMHhmZiwgMHhmZiwgTk1fU1RBVEVfTE9DS0VEKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZGVsZXRlX2Jwb3J0KGdfYnRzLCAxKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImJwb3J0MC1zdGFyIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X2Jwb3J0X2xpbmVfY2ZnKGdfYnRzLCAwLCBCUzExX0xJTkVfQ0ZHX1NUQVIpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiYnBvcnQwLW11bHRpZHJvcCIpKSB7CisJCQkJYWJpc19ubV9iczExX3NldF9icG9ydF9saW5lX2NmZyhnX2J0cywgMCwgQlMxMV9MSU5FX0NGR19NVUxUSURST1ApOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfTk9STUFMOgorCQlpZiAoY29tbWFuZCkgeworCQkJaWYgKCFzdHJjbXAoY29tbWFuZCwgInJlY29ubmVjdCIpKQorCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImRpc2Nvbm5lY3QiKSkKKwkJCQlhYmlzX25tX2JzMTFfYnNjX2Rpc2Nvbm5lY3QoZ19idHMsIDApOworCQkJZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicXVlcnkiKSkgeworCQkJCWNtZF9xdWVyeSgpOworCQkJfQorCQl9IGVsc2UgaWYgKHBhcmFtX2Rpc2Nvbm5lY3QpIHsKKwkJCXBhcmFtX2Rpc2Nvbm5lY3QgPSAwOworCQkJYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KGdfYnRzLCAwKTsKKwkJCWlmIChwYXJhbV9yZXN0YXJ0KSB7CisJCQkJcGFyYW1fcmVzdGFydCA9IDA7CisJCQkJYWJpc19ubV9iczExX3Jlc3RhcnQoZ19idHMpOworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qIGhhbmRsZSBhIGZ1bGx5LXJlY2VpdmVkIG1lc3NhZ2UvcGFja2V0IGZyb20gdGhlIFJTMjMyIHBvcnQgKi8KK2ludCBoYW5kbGVfc2VyaWFsX21zZyhzdHJ1Y3QgbXNnYiAqcnhfbXNnKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCWludCByYyA9IC0xOworCisjaWYgMAorCWlmIChyeF9tc2ctPmxlbiA8IExBUERfSERSX0xFTgorCQkJICArIHNpemVvZihzdHJ1Y3QgYWJpc19vbV9mb21faGRyKQorCQkJICArIHNpemVvZihzdHJ1Y3QgYWJpc19vbV9oZHIpKSB7CisJCWlmICghbWVtY21wKHJ4X21zZy0+ZGF0YSArIDIsIHRvb19mYXN0LAorCQkJICAgIHNpemVvZih0b29fZmFzdCkpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkJTMTEgdGVsbHMgdXMgd2UncmUgdG9vICIKKwkJCQkiZmFzdCwgdHJ5IC0tZGVsYXkgYmlnZ2VyIHRoYW4gJXVcbiIsCisJCQkJZGVsYXlfbXMpOworCQkJcmV0dXJuIC1FMkJJRzsKKwkJfSBlbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgInVua25vd24gQlMxMSBtZXNzYWdlXG4iKTsKKwl9CisjZW5kaWYKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX2wyKHJ4X21zZyk7CisJZm9oID0gKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgb2gtPmRhdGE7CisJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJY2FzZSBOTV9NVF9CUzExX0xNVF9MT0dPTl9BQ0s6CisJCXByaW50ZigiTE1UIExPR09OOiBBQ0tcblxuIik7CisJCWlmIChiczExY2ZnX3N0YXRlID09IFNUQVRFX05PTkUpCisJCQliczExY2ZnX3N0YXRlID0gU1RBVEVfTE9HT05fQUNLOworCQlyYyA9IGFiaXNfbm1fYnMxMV9nZXRfc3RhdGUoZ19idHMpOworCQlicmVhazsKKwljYXNlIE5NX01UX0JTMTFfTE1UX0xPR09GRl9BQ0s6CisJCXByaW50ZigiTE1UIExPR09GRjogQUNLXG4iKTsKKwkJZXhpdCgwKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX0dFVF9TVEFURV9BQ0s6CisJCXJjID0gYWJpc19ubV90bHZfcGFyc2UoJnRwLCBnX2J0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCXByaW50X3N0YXRlKCZ0cCk7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpICYmCisJCSAgICBUTFZQX0xFTigmdHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkgPj0gMSkKKwkJCXJjID0gaGFuZGxlX3N0YXRlX3Jlc3AoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfR0VUX0FUVFJfUkVTUDoKKwkJcHJpbnRmKCJcbiVzQVRUUklCVVRFUzpcbiIsIG9ial9uYW1lKGZvaCkpOworCQlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIGdfYnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwkJcmMgPSBwcmludF9hdHRyKCZ0cCk7CisJCS8vaGV4ZHVtcChmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX1NFVF9BVFRSX0FDSzoKKwkJcHJpbnRmKCJTRVQgQVRUUklCVVRFIE9iakNsYXNzPTB4JTAyeCBPYmpJbnN0PSglZCwlZCwlZCkgQUNLXG4iLAorCQkJZm9oLT5vYmpfY2xhc3MsIGZvaC0+b2JqX2luc3QuYnRzX25yLAorCQkJZm9oLT5vYmpfaW5zdC50cnhfbnIsIGZvaC0+b2JqX2luc3QudHNfbnIpOworCQlyYyA9IDA7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9TRVRfQVRUUl9OQUNLOgorCQlwcmludGYoIlNFVCBBVFRSSUJVVEUgT2JqQ2xhc3M9MHglMDJ4IE9iakluc3Q9KCVkLCVkLCVkKSBOQUNLXG4iLAorCQkJZm9oLT5vYmpfY2xhc3MsIGZvaC0+b2JqX2luc3QuYnRzX25yLAorCQkJZm9oLT5vYmpfaW5zdC50cnhfbnIsIGZvaC0+b2JqX2luc3QudHNfbnIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IGFiaXNfbm1fcmN2bXNnKHJ4X21zZyk7CisJfQorCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJFUlJPUiBpbiBtYWluIGxvb3AiKTsKKwkJLy9icmVhazsKKwl9CisJaWYgKHJjID09IDEpCisJCXJldHVybiByYzsKKworCXN3aXRjaCAoYnMxMWNmZ19zdGF0ZSkgeworCWNhc2UgU1RBVEVfTk9ORToKKwkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDEpOworCQlicmVhazsKKwljYXNlIFNUQVRFX0xPR09OX0FDSzoKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZzdGF0dXNfdGltZXIsIDUsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBubV9zdGF0ZV9ldmVudChlbnVtIG5tX2V2dCBldnQsIHVfaW50OF90IG9ial9jbGFzcywgdm9pZCAqb2JqLAorCQkgICBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpvbGRfc3RhdGUsIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5ld19zdGF0ZSwKKwkJICAgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKm9ial9pbnMpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3RhdHVzX3RpbWVyX2NiKHZvaWQgKmRhdGEpCit7CisJYWJpc19ubV9iczExX2dldF9zdGF0ZShnX2J0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2Jhbm5lcih2b2lkKQoreworCXByaW50ZigiYnMxMV9jb25maWcgKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIGFuZCBEaWV0ZXIgU3BhYXJcbiIpOworCXByaW50ZigiVGhpcyBpcyBGUkVFIFNPRlRXQVJFIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWVxuXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCh2b2lkKQoreworCXByaW50ZigiYnMxMV9jb25maWcgW29wdGlvbnNdIFtjb21tYW5kXVxuIik7CisJcHJpbnRmKCJcblN1cHBvcnRlZCBvcHRpb25zOlxuIik7CisJcHJpbnRmKCJcdC1oIC0taGVscFx0XHRcdFByaW50IHRoaXMgaGVscCB0ZXh0XG4iKTsKKwlwcmludGYoIlx0LXAgLS1wb3J0IDwvZGV2L3R0eVhYWD5cdFx0U3BlY2lmeSBzZXJpYWwgcG9ydFxuIik7CisJcHJpbnRmKCJcdC1zIC0tc29mdHdhcmUgPGZpbGU+XHRcdFNwZWNpZnkgU29mdHdhcmUgZmlsZVxuIik7CisJcHJpbnRmKCJcdC1TIC0tc2FmZXR5IDxmaWxlPlx0XHRTcGVjaWZ5IFNhZmV0eSBMb2FkIGZpbGVcbiIpOworCXByaW50ZigiXHQtZCAtLWRlbGF5IDxtcz5cdFx0XHRTcGVjaWZ5IGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuIik7CisJcHJpbnRmKCJcdC1EIC0tZGlzY29ubmVjdFx0XHRcdERpc2Nvbm5lY3QgQlRTIGZyb20gQlNDXG4iKTsKKwlwcmludGYoIlx0LXcgLS13aW4tc2l6ZSA8bnVtPlx0XHRTcGVjaWZ5IFdpbmRvdyBTaXplXG4iKTsKKwlwcmludGYoIlx0LWYgLS1mb3JjZWRcdFx0XHRGb3JjZSBTb2Z0d2FyZSBMb2FkXG4iKTsKKwlwcmludGYoIlxuU3VwcG9ydGVkIGNvbW1hbmRzOlxuIik7CisJcHJpbnRmKCJcdHF1ZXJ5XHRcdFx0UXVlcnkgdGhlIEJTLTExIGFib3V0IHNlcmlhbCBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb25cbiIpOworCXByaW50ZigiXHRkaXNjb25uZWN0XHRcdERpc2Nvbm5lY3QgQS1iaXMgbGluayAoZ28gaW50byBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRyZXNjb25uZWN0XHRcdFJlY29ubmVjdCBBLWJpcyBsaW5rIChnbyBpbnRvIG5vcm1hbCBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRyZXN0YXJ0XHRcdFx0UmVzdGFydCB0aGUgQlRTXG4iKTsKKwlwcmludGYoIlx0c29mdHdhcmVcdFx0RG93bmxvYWQgU29mdHdhcmUgKG9ubHkgaW4gYWRtaW5pc3RyYXRpdmUgc3RhdGUpXG4iKTsKKwlwcmludGYoIlx0Y3JlYXRlLXRyeDFcdFx0Q3JlYXRlIG9iamVjdHMgZm9yIFRSWDEgKERhbmdlcjogWW91ciBCUy0xMSBtaWdodCBvdmVyaGVhdClcbiIpOworCXByaW50ZigiXHRkZWxldGUtdHJ4MVx0XHREZWxldGUgb2JqZWN0cyBmb3IgVFJYMVxuIik7CisJcHJpbnRmKCJcdHBsbC1lMS1sb2NrZWRcdFx0U2V0IHRoZSBQTEwgdG8gYmUgbG9ja2VkIHRvIEUxIGNsb2NrXG4iKTsKKwlwcmludGYoIlx0cGxsLXN0YW5kYWxvbmVcdFx0U2V0IHRoZSBQTEwgdG8gYmUgaW4gc3RhbmRhbG9uZSBtb2RlXG4iKTsKKwlwcmludGYoIlx0cGxsLXNldHZhbHVlIDx2YWx1ZT5cdFNldCB0aGUgUExMIHNldCB2YWx1ZVxuIik7CisJcHJpbnRmKCJcdHBsbC13b3JrdmFsdWUgPHZhbHVlPlx0U2V0IHRoZSBQTEwgd29yayB2YWx1ZVxuIik7CisJcHJpbnRmKCJcdG9tbC10ZWlcdFx0XHRTZXQgT01MIEUxIFRTIGFuZCBURUlcbiIpOworCXByaW50ZigiXHRicG9ydDAtc3Rhclx0XHRTZXQgQlBPUlQwIGxpbmUgY29uZmlnIHRvIHN0YXJcbiIpOworCXByaW50ZigiXHRicG9ydDAtbXVsdGlwb3J0XHRTZXQgQlBPUlQwIGxpbmUgY29uZmlnIHRvIG11bHRpcG9ydFxuIik7CisJcHJpbnRmKCJcdGNyZWF0ZS1icG9ydDFcdFx0Q3JlYXRlIEJQT1JUMSBvYmplY3RcbiIpOworCXByaW50ZigiXHRkZWxldGUtYnBvcnQxXHRcdERlbGV0ZSBCUE9SVDEgb2JqZWN0XG4iKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBvcHRpb25faW5kZXggPSAwOworCXByaW50X2Jhbm5lcigpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IGM7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyAiaGVscCIsIDAsIDAsICdoJyB9LAorCQkJeyAicG9ydCIsIDEsIDAsICdwJyB9LAorCQkJeyAic29mdHdhcmUiLCAxLCAwLCAncycgfSwKKwkJCXsgInNhZmV0eSIsIDEsIDAsICdTJyB9LAorCQkJeyAiZGVsYXkiLCAxLCAwLCAnZCcgfSwKKwkJCXsgImRpc2Nvbm5lY3QiLCAwLCAwLCAnRCcgfSwKKwkJCXsgIndpbi1zaXplIiwgMSwgMCwgJ3cnIH0sCisJCQl7ICJmb3JjZWQiLCAwLCAwLCAnZicgfSwKKwkJCXsgInJlc3RhcnQiLCAwLCAwLCAncicgfSwKKwkJCXsgImRlYnVnIiwgMSwgMCwgJ2InfSwKKwkJfTsKKworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhwOnM6Uzp0ZDpEdzpmcmE6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJY2FzZSAncCc6CisJCQlzZXJpYWxfcG9ydCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlmbmFtZV9zb2Z0d2FyZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCWZuYW1lX3NhZmV0eSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWRlbGF5X21zID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJd2luX3NpemUgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnRCc6CisJCQlwYXJhbV9kaXNjb25uZWN0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCXBhcmFtX2ZvcmNlZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlwYXJhbV9kaXNjb25uZWN0ID0gMTsKKwkJCXBhcmFtX3Jlc3RhcnQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAob3B0aW5kIDwgYXJnYykKKwkJY29tbWFuZCA9IGFyZ3Zbb3B0aW5kXTsKKwkgICAgICAgIGlmIChvcHRpbmQrMSA8IGFyZ2MpCisJCQl2YWx1ZSA9IGFyZ3Zbb3B0aW5kKzFdOworCit9CisKK3N0YXRpYyBpbnQgbnVtX3NpZ2ludDsKKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKwlmcHJpbnRmKHN0ZG91dCwgIlxuc2lnbmFsICV1IHJlY2VpdmVkXG4iLCBzaWduYWwpOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNJR0lOVDoKKwkJbnVtX3NpZ2ludCsrOworCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCWlmIChudW1fc2lnaW50ID49IDMpCisJCQlleGl0KDApOworCQlicmVhazsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldDsKKwlpbnQgcmM7CisKKwlsb2dfaW5pdCgmbG9nX2luZm8pOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisJaGFuZGxlX29wdGlvbnMoYXJnYywgYXJndik7CisJYnRzX21vZGVsX2JzMTFfaW5pdCgpOworCisJZ3NtbmV0ID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBOVUxMKTsKKwlpZiAoIWdzbW5ldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBhbGxvY2F0ZSBnc20gbmV0d29ya1xuIik7CisJCWV4aXQoMSk7CisJfQorCWdfYnRzID0gZ3NtX2J0c19hbGxvYyhnc21uZXQsIEdTTV9CVFNfVFlQRV9CUzExLCBIQVJEQ09ERURfVFNDLAorCQkJCUhBUkRDT0RFRF9CU0lDKTsKKworCXJjID0gcnMyMzJfc2V0dXAoc2VyaWFsX3BvcnQsIGRlbGF5X21zLCBnX2J0cyk7CisJaWYgKHJjIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlByb2JsZW0gc2V0dGluZyB1cCBzZXJpYWwgcG9ydFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJc2lnbmFsKFNJR0lOVCwgJnNpZ25hbF9oYW5kbGVyKTsKKworCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAxKTsKKwkvL2FiaXNfbm1fYnMxMV9nZXRfc2Vybm8oZ19idHMpOworCisJc3RhdHVzX3RpbWVyLmNiID0gc3RhdHVzX3RpbWVyX2NiOworCisJd2hpbGUgKDEpIHsKKwkJYnNjX3NlbGVjdF9tYWluKDApOworCX0KKworCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfYXBpLmMgYi9vcGVuYnNjL3NyYy9ic2NfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwNDc1MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY19hcGkuYwpAQCAtMCwwICsxLDMzIEBACisvKiBHU00gMDguMDggbGlrZSBBUEkgZm9yIE9wZW5CU0MuIFRoZSBicmlkZ2UgZnJvbSBNU0MgdG8gQlNDICovCisKKy8qIChDKSAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19hcGkuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisKKworaW50IGdzbTA4MDhfc3VibWl0X2R0YXAoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQlzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbGlua19pZCkKK3sKKwltc2ctPmxjaGFuID0gY29ubi0+bGNoYW47CisJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCXJldHVybiByc2xfZGF0YV9yZXF1ZXN0KG1zZywgbGlua19pZCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfaGFjay5jIGIvb3BlbmJzYy9zcmMvYnNjX2hhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTBkNGFiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX2hhY2suYwpAQCAtMCwwICsxLDI2OCBAQAorLyogQSBoYWNraXNoIG1pbmltYWwgQlNDICgrTVNDICtITFIpIGltcGxlbWVudGF0aW9uICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCisvKiBNQ0MgYW5kIE1OQyBmb3IgdGhlIExvY2F0aW9uIEFyZWEgSWRlbnRpZmllciAqLworc3RhdGljIHN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0Oworc3RydWN0IGdzbV9uZXR3b3JrICpic2NfZ3NtbmV0ID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpkYXRhYmFzZV9uYW1lID0gImhsci5zcWxpdGUzIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25maWdfZmlsZSA9ICJvcGVuYnNjLmNmZyI7CitleHRlcm4gY29uc3QgY2hhciAqb3BlbmJzY192ZXJzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKm9wZW5ic2NfY29weXJpZ2h0OworCisvKiB0aW1lciB0byBzdG9yZSBzdGF0aXN0aWNzICovCisjZGVmaW5lIERCX1NZTkNfSU5URVJWQUwJNjAsIDAKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkYl9zeW5jX3RpbWVyOworCitleHRlcm4gaW50IGJzY19ib290c3RyYXBfbmV0d29yayhpbnQgKCptbWNfcmV2KShzdHJ1Y3QgZ3NtX25ldHdvcmsgKiwgaW50LCB2b2lkICopLAorCQkJCSBjb25zdCBjaGFyICpjZmdfZmlsZSk7CitleHRlcm4gaW50IGJzY19zaHV0ZG93bl9uZXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitzdGF0aWMgdm9pZCBjcmVhdGVfcGNhcF9maWxlKGNoYXIgKmZpbGUpCit7CisJbW9kZV90IG1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIOworCWludCBmZCA9IG9wZW4oZmlsZSwgT19XUk9OTFl8T19UUlVOQ3xPX0NSRUFULCBtb2RlKTsKKworCWlmIChmZCA8IDApIHsKKwkJcGVycm9yKCJGYWlsZWQgdG8gb3BlbiBmaWxlIGZvciBwY2FwIik7CisJCXJldHVybjsKKwl9CisKKwllMV9zZXRfcGNhcF9mZChmZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKCkKK3sKKwlwcmludGYoIlVzYWdlOiBic2NfaGFja1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigiICBTb21lIHVzZWZ1bCBoZWxwLi4uXG4iKTsKKwlwcmludGYoIiAgLWggLS1oZWxwIHRoaXMgdGV4dFxuIik7CisJcHJpbnRmKCIgIC1kIG9wdGlvbiAtLWRlYnVnPURSTEw6RENDOkRNTTpEUlI6RFJTTDpETk0gZW5hYmxlIGRlYnVnZ2luZ1xuIik7CisJcHJpbnRmKCIgIC1jIC0tY29uZmlnLWZpbGUgZmlsZW5hbWUgVGhlIGNvbmZpZyBmaWxlIHRvIHVzZS5cbiIpOworCXByaW50ZigiICAtcyAtLWRpc2FibGUtY29sb3JcbiIpOworCXByaW50ZigiICAtbCAtLWRhdGFiYXNlIGRiLW5hbWUgVGhlIGRhdGFiYXNlIHRvIHVzZVxuIik7CisJcHJpbnRmKCIgIC1hIC0tYXV0aG9yaXplLWV2ZXJ5b25lLiBBdXRob3JpemUgZXZlcnkgbmV3IHN1YnNjcmliZXIuIERhbmdlcm91cyEuXG4iKTsKKwlwcmludGYoIiAgLXAgLS1wY2FwIGZpbGUgIFRoZSBmaWxlbmFtZSBvZiB0aGUgcGNhcCBmaWxlXG4iKTsKKwlwcmludGYoIiAgLVQgLS10aW1lc3RhbXAgUHJlZml4IGV2ZXJ5IGxvZyBsaW5lIHdpdGggYSB0aW1lc3RhbXBcbiIpOworCXByaW50ZigiICAtViAtLXZlcnNpb24uIFByaW50IHRoZSB2ZXJzaW9uIG9mIE9wZW5CU0MuXG4iKTsKKwlwcmludGYoIiAgLVAgLS1ydHAtcHJveHkgRW5hYmxlIHRoZSBSVFAgUHJveHkgY29kZSBpbnNpZGUgT3BlbkJTQ1xuIik7CisJcHJpbnRmKCIgIC1lIC0tbG9nLWxldmVsIG51bWJlci4gU2V0IGEgZ2xvYmFsIGxvZ2xldmVsLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3ZlcnNpb24oKQoreworCXByaW50ZigiJXNcbiIsIG9wZW5ic2NfdmVyc2lvbik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2NvcHlyaWdodCgpCit7CisJcHV0cyhvcGVuYnNjX2NvcHlyaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9vcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgb3B0aW9uX2luZGV4ID0gMCwgYzsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ImhlbHAiLCAwLCAwLCAnaCd9LAorCQkJeyJkZWJ1ZyIsIDEsIDAsICdkJ30sCisJCQl7ImNvbmZpZy1maWxlIiwgMSwgMCwgJ2MnfSwKKwkJCXsiZGlzYWJsZS1jb2xvciIsIDAsIDAsICdzJ30sCisJCQl7ImRhdGFiYXNlIiwgMSwgMCwgJ2wnfSwKKwkJCXsiYXV0aG9yaXplLWV2ZXJ5b25lIiwgMCwgMCwgJ2EnfSwKKwkJCXsicGNhcCIsIDEsIDAsICdwJ30sCisJCQl7InRpbWVzdGFtcCIsIDAsIDAsICdUJ30sCisJCQl7InZlcnNpb24iLCAwLCAwLCAnVicgfSwKKwkJCXsicnRwLXByb3h5IiwgMCwgMCwgJ1AnfSwKKwkJCXsibG9nLWxldmVsIiwgMSwgMCwgJ2UnfSwKKwkJCXswLCAwLCAwLCAwfQorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaGQ6c2w6YXI6cDpUUFZjOmU6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCXByaW50X3VzYWdlKCk7CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KDApOworCQljYXNlICdzJzoKKwkJCWxvZ19zZXRfdXNlX2NvbG9yKHN0ZGVycl90YXJnZXQsIDApOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWRhdGFiYXNlX25hbWUgPSBzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWNvbmZpZ19maWxlID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQljcmVhdGVfcGNhcF9maWxlKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnVCc6CisJCQlsb2dfc2V0X3ByaW50X3RpbWVzdGFtcChzdGRlcnJfdGFyZ2V0LCAxKTsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCWlwYWNjX3J0cF9kaXJlY3QgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJbG9nX3NldF9sb2dfbGV2ZWwoc3RkZXJyX3RhcmdldCwgYXRvaShvcHRhcmcpKTsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCXByaW50X3ZlcnNpb24oKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJCXByaW50X2NvcHlyaWdodCgpOworCQkJZXhpdCgwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogaWdub3JlICovCisJCQlicmVhazsKKwkJfQorCX0KK30KKworZXh0ZXJuIHZvaWQgKnRhbGxfdnR5X2N0eDsKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWduYWwpCit7CisJZnByaW50ZihzdGRvdXQsICJzaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHSU5UOgorCQlic2Nfc2h1dGRvd25fbmV0KGJzY19nc21uZXQpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfR0xPQkFMLCBTX0dMT0JBTF9TSFVURE9XTiwgTlVMTCk7CisJCXNsZWVwKDMpOworCQlleGl0KDApOworCQlicmVhazsKKwljYXNlIFNJR0FCUlQ6CisJCS8qIGluIGNhc2Ugb2YgYWJvcnQsIHdlIHdhbnQgdG8gb2J0YWluIGEgdGFsbG9jIHJlcG9ydAorCQkgKiBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MgKi8KKwljYXNlIFNJR1VTUjE6CisJCXRhbGxvY19yZXBvcnQodGFsbF92dHlfY3R4LCBzdGRlcnIpOworCQl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF9ic2NfY3R4LCBzdGRlcnIpOworCQlicmVhazsKKwljYXNlIFNJR1VTUjI6CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX3Z0eV9jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyogdGltZXIgaGFuZGxpbmcgKi8KK3N0YXRpYyBpbnQgX2RiX3N0b3JlX2NvdW50ZXIoc3RydWN0IGNvdW50ZXIgKmNvdW50ZXIsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGRiX3N0b3JlX2NvdW50ZXIoY291bnRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGRiX3N5bmNfdGltZXJfY2Iodm9pZCAqZGF0YSkKK3sKKwkvKiBzdG9yZSBjb3VudGVycyB0byBkYXRhYmFzZSBhbmQgcmUtc2NoZWR1bGUgKi8KKwljb3VudGVyc19mb3JfZWFjaChfZGJfc3RvcmVfY291bnRlciwgTlVMTCk7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZkYl9zeW5jX3RpbWVyLCBEQl9TWU5DX0lOVEVSVkFMKTsKK30KKworZXh0ZXJuIGludCBidHNfbW9kZWxfdW5rbm93bl9pbml0KHZvaWQpOworZXh0ZXJuIGludCBidHNfbW9kZWxfYnMxMV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBidHNfbW9kZWxfbmFub2J0c19pbml0KHZvaWQpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJjOworCisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwl0YWxsX2JzY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgIm9wZW5ic2MiKTsKKwl0YWxsb2NfY3R4X2luaXQoKTsKKwlvbl9kc29fbG9hZF90b2tlbigpOworCW9uX2Rzb19sb2FkX3JybHAoKTsKKwlvbl9kc29fbG9hZF9ob19kZWMoKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisKKwlidHNfbW9kZWxfdW5rbm93bl9pbml0KCk7CisJYnRzX21vZGVsX2JzMTFfaW5pdCgpOworCWJ0c19tb2RlbF9uYW5vYnRzX2luaXQoKTsKKworCS8qIGVuYWJsZSBmaWx0ZXJzICovCisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCisJLyogcGFyc2Ugb3B0aW9ucyAqLworCWhhbmRsZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCisJLyogc2VlZCB0aGUgUFJORyAqLworCXNyYW5kKHRpbWUoTlVMTCkpOworCisJaWYgKGRiX2luaXQoZGF0YWJhc2VfbmFtZSkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIGluaXQgZGF0YWJhc2UuIFBsZWFzZSBjaGVjayB0aGUgb3B0aW9uIHNldHRpbmdzLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRmKCJEQjogRGF0YWJhc2UgaW5pdGlhbGl6ZWQuXG4iKTsKKworCWlmIChkYl9wcmVwYXJlKCkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIHByZXBhcmUgZGF0YWJhc2UuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwcmludGYoIkRCOiBEYXRhYmFzZSBwcmVwYXJlZC5cbiIpOworCisJLyogc2V0dXAgdGhlIHRpbWVyICovCisJZGJfc3luY190aW1lci5jYiA9IGRiX3N5bmNfdGltZXJfY2I7CisJZGJfc3luY190aW1lci5kYXRhID0gTlVMTDsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmRiX3N5bmNfdGltZXIsIERCX1NZTkNfSU5URVJWQUwpOworCisJcmMgPSBic2NfYm9vdHN0cmFwX25ldHdvcmsobW5jY19yZWN2LCBjb25maWdfZmlsZSk7CisJaWYgKHJjIDwgMCkKKwkJZXhpdCgxKTsKKworCXNpZ25hbChTSUdJTlQsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR0FCUlQsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjEsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjIsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJd2hpbGUgKDEpIHsKKwkJYnNjX3VwcXVldWUoYnNjX2dzbW5ldCk7CisJCWxvZ19yZXNldF9jb250ZXh0KCk7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfaW5pdC5jIGIvb3BlbmJzYy9zcmMvYnNjX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQ0NmEyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX2luaXQuYwpAQCAtMCwwICsxLDEwOTggQEAKKy8qIEEgaGFja2lzaCBtaW5pbWFsIEJTQyAoK01TQyArSExSKSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9taXNkbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisvKiBnbG9iYWwgcG9pbnRlciB0byB0aGUgZ3NtIG5ldHdvcmsgZGF0YSBzdHJ1Y3R1cmUgKi8KK2V4dGVybiBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmJzY19nc21uZXQ7CisKK3N0YXRpYyB2b2lkIHBhdGNoX25tX3RhYmxlcyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgZm9yIE9NIGFuZCBOTSBwYWNrZXRzIHRoYXQgd2UgY2Fubm90IHlldAorICogZ2VuZXJhdGUgYnkgY29kZSBidXQgd2UganVzdCBwYXNzIG9uICovCisKKy8vIEJUUyBTaXRlIE1hbmFnZXIsIFNFVCBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogQlRTIFNpdGUgTWFuYWdlcgorICBJbnN0YW5jZSAxOiBGRgorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgc0FiaXNFeHRlcm5hbFRpbWU6IDIwMDcvMDkvMDggICAxNDozNjoxMQorICBvbUxBUERSZWxUaW1lcjogMzBzZWMKKyAgc2hvcnRMQVBESW50VGltZXI6IDVzZWMKKyAgZW1lcmdlbmN5VGltZXIxOiAxMCBtaW51dGVzCisgIGVtZXJnZW5jeVRpbWVyMjogMCBtaW51dGVzCisqLworCit1bnNpZ25lZCBjaGFyIG1zZ18xW10gPQoreworCU5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkJTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRSwgMHgwNywKKwkJCTB4RDcsIDB4MDksIDB4MDgsIDB4MEUsIDB4MjQsIDB4MEIsIDB4Q0UsCisJCTB4MDIsCisJCQkweDAwLCAweDFFLAorCQlOTV9BVFRfQlMxMV9TSF9MQVBEX0lOVF9USU1FUiwKKwkJCTB4MDEsIDB4MDUsCisJCTB4NDIsIDB4MDIsIDB4MDAsIDB4MEEsCisJCTB4NDQsIDB4MDIsIDB4MDAsIDB4MDAKK307CisKKy8vIEJUUywgU0VUIEJUUyBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogQlRTCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIEluc3RhbmNlIDI6IEZGCisgIEluc3RhbmNlIDM6IEZGCitTRVQgQlRTIEFUVFJJQlVURVMKKyAgYnNJZGVudGl0eUNvZGUgLyBCU0lDOgorICAgIFBMTU5fY29sb3VyX2NvZGU6IDdoCisgICAgQlNfY29sb3VyX2NvZGU6ICAgN2gKKyAgQlRTIEFpciBUaW1lciBUMzEwNTogNCAgLHVuaXQgMTAgbXMKKyAgYnRzSXNIb3BwaW5nOiBGQUxTRQorICBwZXJpb2RDQ0NITG9hZEluZGljYXRpb246IDFzZWMKKyAgdGhyZXNob2xkQ0NDSExvYWRJbmRpY2F0aW9uOiAwJQorICBjZWxsQWxsb2NhdGlvbk51bWJlcjogMDBoID0gR1NNIDkwMAorICBlbmFibGVJbnRlcmZlcmVuY2VDbGFzczogMDBoID0gIERpc2FibGVkCisgIGZBQ0NIUXVhbDogNiAoRkFDQ0ggc3RlYWxpbmcgZmxhZ3MgbWludXMgMSkKKyAgaW50YXZlUGFyYW1ldGVyOiAzMSBTQUNDSCBtdWx0aWZyYW1lcworICBpbnRlcmZlcmVuY2VMZXZlbEJvdW5kYXJpZXM6CisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDE6IDBBaAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSAyOiAwRmgKKyAgICBJbnRlcmZlcmVuY2UgQm91bmRhcnkgMzogMTRoCisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDQ6IDE5aAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSA1OiAxRWgKKyAgbVNUeFB3ck1heDogMTEKKyAgICAgIEdTTSByYW5nZTogICAgIDI9MzlkQm0sIDE1PTEzZEJtLCBzdGVwc2l6ZSAyIGRCbQorICAgICAgRENTMTgwMCByYW5nZTogMD0zMGRCbSwgMTU9MGRCbSwgc3RlcHNpemUgMiBkQm0KKyAgICAgIFBDUzE5MDAgcmFuZ2U6IDA9MzBkQm0sIDE1PTBkQm0sIHN0ZXBzaXplIDIgZEJtCisgICAgICAgICAgICAgICAgICAgIDMwPTMzZEJtLCAzMT0zMmRCbQorICBueTE6CisgICAgTWF4aW11bSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgZm9yIFBIWVNJQ0FMIElORk9STUFUSU9OIG1lc3NhZ2UgKEdTTSAwNC4wOCk6IDIwCisgIHBvd2VyT3V0cHV0VGhyZXNob2xkczoKKyAgICBPdXQgUG93ZXIgRmF1bHQgVGhyZXNob2xkOiAgICAgLTEwIGRCCisgICAgUmVkIE91dCBQb3dlciBUaHJlc2hvbGQ6ICAgICAgIC0gNiBkQgorICAgIEV4Y2Vzc2l2ZSBPdXQgUG93ZXIgVGhyZXNob2xkOiAgIDUgZEIKKyAgckFDSEJ1c3lUaHJlc2hvbGQ6IC0xMjcgZEJtCisgIHJBQ0hMb2FkQXZlcmFnaW5nU2xvdHM6IDI1MCAsbnVtYmVyIG9mIFJBQ0ggYnVyc3QgcGVyaW9kcworICByZlJlc291cmNlSW5kaWNhdGlvblBlcmlvZDogMTI1ICBTQUNDSCBtdWx0aWZyYW1lcworICBUMjAwOgorICAgIFNEQ0NIOiAgICAgICAgICAgICAgICAwNDQgaW4gIDUgbXMKKyAgICBGQUNDSC9GdWxsIHJhdGU6ICAgICAgMDMxIGluICA1IG1zCisgICAgRkFDQ0gvSGFsZiByYXRlOiAgICAgIDA0MSBpbiAgNSBtcworICAgIFNBQ0NIIHdpdGggVENIIFNBUEkwOiAwOTAgaW4gMTAgbXMKKyAgICBTQUNDSCB3aXRoIFNEQ0NIOiAgICAgMDkwIGluIDEwIG1zCisgICAgU0RDQ0ggd2l0aCBTQVBJMzogICAgIDA5MCBpbiAgNSBtcworICAgIFNBQ0NIIHdpdGggVENIIFNBUEkzOiAxMzUgaW4gMTAgbXMKKyAgdFN5bmM6IDkwMDAgdW5pdHMgb2YgMTAgbXNlYworICB0VHJhdTogOTAwMCB1bml0cyBvZiAxMCBtc2VjCisgIGVuYWJsZVVtTG9vcFRlc3Q6IDAwaCA9ICBkaXNhYmxlZAorICBlbmFibGVFeGNlc3NpdmVEaXN0YW5jZTogMDBoID0gIERpc2FibGVkCisgIGV4Y2Vzc2l2ZURpc3RhbmNlOiA2NGttCisgIGhvcHBpbmdNb2RlOiAwMGggPSBiYXNlYmFuZCBob3BwaW5nCisgIGNlbGxUeXBlOiAwMGggPSAgU3RhbmRhcmQgQ2VsbAorICBCQ0NIIEFSRkNOIC8gYkNDSEZyZXF1ZW5jeTogMQorKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnMxMV9hdHRyX2J0c1tdID0KK3sKKwkJTk1fQVRUX0JTSUMsIEhBUkRDT0RFRF9CU0lDLAorCQlOTV9BVFRfQlRTX0FJUl9USU1FUiwgMHgwNCwKKwkJTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywgMHgwMCwKKwkJTk1fQVRUX0NDQ0hfTF9JX1AsIDB4MDEsCisJCU5NX0FUVF9DQ0NIX0xfVCwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfQ0VMTF9BTExPQ19OUiwgTk1fQlMxMV9DQU5SX0dTTSwKKwkJTk1fQVRUX0JTMTFfRU5BX0lOVEVSRl9DTEFTUywgMHgwMSwKKwkJTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTCwgMHgwNiwKKwkJLyogaW50ZXJmZXJlbmNlIGF2Zy4gcGVyaW9kIGluIG51bWJlcnMgb2YgU0FDQ0ggbXVsdGlmciAqLworCQlOTV9BVFRfSU5UQVZFX1BBUkFNLCAweDFGLAorCQlOTV9BVFRfSU5URVJGX0JPVU5ELCAweDBBLCAweDBGLCAweDE0LCAweDE5LCAweDFFLCAweDdCLAorCQlOTV9BVFRfQ0NDSF9MX1QsIDB4MjMsCisJCU5NX0FUVF9HU01fVElNRSwgMHgyOCwgMHgwMCwKKwkJTk1fQVRUX0FETV9TVEFURSwgMHgwMywKKwkJTk1fQVRUX1JBQ0hfQl9USFJFU0gsIDB4N0YsCisJCU5NX0FUVF9MREFWR19TTE9UUywgMHgwMCwgMHhGQSwKKwkJTk1fQVRUX0JTMTFfUkZfUkVTX0lORF9QRVIsIDB4N0QsCisJCU5NX0FUVF9UMjAwLCAweDJDLCAweDFGLCAweDI5LCAweDVBLCAweDVBLCAweDVBLCAweDg3LAorCQlOTV9BVFRfQlMxMV9UU1lOQywgMHgyMywgMHgyOCwKKwkJTk1fQVRUX0JTMTFfVFRSQVUsIDB4MjMsIDB4MjgsCisJCU5NX0FUVF9URVNUX0RVUiwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX09VVFNUX0FMQVJNLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UsIDB4MDEsIDB4NDAsCisJCU5NX0FUVF9CUzExX0hPUFBJTkdfTU9ERSwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfUExMLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQkNDSF9BUkZDTiwgMHgwMCwgSEFSRENPREVEX0FSRkNOLyoweDAxKi8sCit9OworCisvLyBIYW5kb3ZlciBSZWNvZ25pdGlvbiwgU0VUIEFUVFJJQlVURVMKKworLyoKK0lsbGVnYWwgQ29udGVudHMgR1NNIEZvcm1hdHRlZCBPJk0gTXNnCisgIE9iamVjdCBDbGFzczogSGFuZG92ZXIgUmVjb2duaXRpb24KKyAgQlRTIHJlbGF0LiBOdW1iZXI6IDAKKyAgSW5zdGFuY2UgMjogRkYKKyAgSW5zdGFuY2UgMzogRkYKK1NFVCBBVFRSSUJVVEVTCisgIGVuYWJsZURlbGF5UG93ZXJCdWRnZXRITzogMDBoID0gRGlzYWJsZWQKKyAgZW5hYmxlRGlzdGFuY2VITzogMDBoID0gIERpc2FibGVkCisgIGVuYWJsZUludGVybmFsSW50ZXJDZWxsSGFuZG92ZXI6IDAwaCA9IERpc2FibGVkCisgIGVuYWJsZUludGVybmFsSW50cmFDZWxsSGFuZG92ZXI6IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVQb3dlckJ1ZGdldEhPOiAwMGggPSBEaXNhYmxlZAorICBlbmFibGVSWExFVkhPOiAwMGggPSAgRGlzYWJsZWQKKyAgZW5hYmxlUlhRVUFMSE86IDAwaCA9ICBEaXNhYmxlZAorICBob0F2ZXJhZ2luZ0Rpc3RhbmNlOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ0xldjoKKyAgICBBX0xFVl9ITzogOCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgICBXX0xFVl9ITzogMSAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9BdmVyYWdpbmdQb3dlckJ1ZGdldDogIDE2ICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ1F1YWw6CisgICAgQV9RVUFMX0hPOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICAgIFdfUVVBTF9ITzogMiAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9Mb3dlclRocmVzaG9sZExldkRMOiAoMTAgLSAxMTApIGRCbQorICBob0xvd2VyVGhyZXNob2xkTGV2VUw6ICg1IC0gMTEwKSBkQm0KKyAgaG9Mb3dlclRocmVzaG9sZFF1YWxETDogMDZoID0gICA2LjQlIDwgQkVSIDwgMTIuOCUKKyAgaG9Mb3dlclRocmVzaG9sZFF1YWxVTDogMDZoID0gICA2LjQlIDwgQkVSIDwgMTIuOCUKKyAgaG9UaHJlc2hvbGRMZXZETGludHJhIDogKDIwIC0gMTEwKSBkQm0KKyAgaG9UaHJlc2hvbGRMZXZVTGludHJhOiAoMjAgLSAxMTApIGRCbQorICBob1RocmVzaG9sZE1zUmFuZ2VNYXg6IDIwIGttCisgIG5DZWxsOiAwNmgKKyAgdGltZXJIT1JlcXVlc3Q6IDMgICx1bml0IDIgU0FDQ0ggbXVsdGlmcmFtZXMKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzNbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9IQU5ET1ZFUiwgMHgwMCwgMHhGRiwgMHhGRiwKKwkJMHhEMCwgMHgwMCwJCS8qIGVuYWJsZURlbGF5UG93ZXJCdWRnZXRITyAqLworCQkweDY0LCAweDAwLAkJLyogZW5hYmxlRGlzdGFuY2VITyAqLworCQkweDY3LCAweDAwLAkJLyogZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlciAqLworCQkweDY4LCAweDAwLAkJLyogZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlciAqLworCQkweDZBLCAweDAwLAkJLyogZW5hYmxlUG93ZXJCdWRnZXRITyAqLworCQkweDZDLCAweDAwLAkJLyogZW5hYmxlUlhMRVZITyAqLworCQkweDZELCAweDAwLAkJLyogZW5hYmxlUlhRVUFMSE8gKi8KKwkJMHg2RiwgMHgwOCwJCS8qIGhvQXZlcmFnaW5nRGlzdGFuY2UgKi8KKwkJMHg3MCwgMHgwOCwgMHgwMSwJLyogaG9BdmVyYWdpbmdMZXYgKi8KKwkJMHg3MSwgMHgxMCwgMHgxMCwgMHgxMCwKKwkJMHg3MiwgMHgwOCwgMHgwMiwJLyogaG9BdmVyYWdpbmdRdWFsICovCisJCTB4NzMsIDB4MEEsCQkvKiBob0xvd2VyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg3NCwgMHgwNSwJCS8qIGhvTG93ZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDc1LCAweDA2LAkJLyogaG9Mb3dlclRocmVzaG9sZFF1YWxETCAqLworCQkweDc2LCAweDA2LAkJLyogaG9Mb3dlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDc4LCAweDE0LAkJLyogaG9UaHJlc2hvbGRMZXZETGludHJhICovCisJCTB4NzksIDB4MTQsCQkvKiBob1RocmVzaG9sZExldlVMaW50cmEgKi8KKwkJMHg3QSwgMHgxNCwJCS8qIGhvVGhyZXNob2xkTXNSYW5nZU1heCAqLworCQkweDdELCAweDA2LAkJLyogbkNlbGwgKi8KKwkJTk1fQVRUX0JTMTFfVElNRVJfSE9fUkVRVUVTVCwgMHgwMywKKwkJMHgyMCwgMHgwMSwgMHgwMCwKKwkJMHg0NSwgMHgwMSwgMHgwMCwKKwkJMHg0OCwgMHgwMSwgMHgwMCwKKwkJMHg1QSwgMHgwMSwgMHgwMCwKKwkJMHg1QiwgMHgwMSwgMHgwNSwKKwkJMHg1RSwgMHgwMSwgMHgxQSwKKwkJMHg1RiwgMHgwMSwgMHgyMCwKKwkJMHg5RCwgMHgwMSwgMHgwMCwKKwkJMHg0NywgMHgwMSwgMHgwMCwKKwkJMHg1QywgMHgwMSwgMHg2NCwKKwkJMHg1RCwgMHgwMSwgMHgxRSwKKwkJMHg5NywgMHgwMSwgMHgyMCwKKwkJMHhGNywgMHgwMSwgMHgzQywKK307CisKKy8vIFBvd2VyIENvbnRyb2wsIFNFVCBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogUG93ZXIgQ29udHJvbAorICBCVFMgcmVsYXQuIE51bWJlcjogMAorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgZW5hYmxlTXNQb3dlckNvbnRyb2w6IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVQb3dlckNvbnRyb2xSTEZXOiAwMGggPSAgRGlzYWJsZWQKKyAgcGNBdmVyYWdpbmdMZXY6CisgICAgQV9MRVZfUEM6IDQgIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19MRVZfUEM6IDEgIFNBQ0NIIG11bHRpZnJhbWVzCisgIHBjQXZlcmFnaW5nUXVhbDoKKyAgICBBX1FVQUxfUEM6IDQgIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19RVUFMX1BDOiAyICBTQUNDSCBtdWx0aWZyYW1lcworICBwY0xvd2VyVGhyZXNob2xkTGV2REw6IDBGaAorICBwY0xvd2VyVGhyZXNob2xkTGV2VUw6IDBBaAorICBwY0xvd2VyVGhyZXNob2xkUXVhbERMOiAwNWggPSAgIDMuMiUgPCBCRVIgPCAgNi40JQorICBwY0xvd2VyVGhyZXNob2xkUXVhbFVMOiAwNWggPSAgIDMuMiUgPCBCRVIgPCAgNi40JQorICBwY1JMRlRocmVzaG9sZDogMENoCisgIHBjVXBwZXJUaHJlc2hvbGRMZXZETDogMTRoCisgIHBjVXBwZXJUaHJlc2hvbGRMZXZVTDogMEZoCisgIHBjVXBwZXJUaHJlc2hvbGRRdWFsREw6IDA0aCA9ICAgMS42JSA8IEJFUiA8ICAzLjIlCisgIHBjVXBwZXJUaHJlc2hvbGRRdWFsVUw6IDA0aCA9ICAgMS42JSA8IEJFUiA8ICAzLjIlCisgIHBvd2VyQ29uZmlybTogMiAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworICBwb3dlckNvbnRyb2xJbnRlcnZhbDogMiAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworICBwb3dlckluY3JTdGVwU2l6ZTogMDJoID0gNCBkQgorICBwb3dlclJlZFN0ZXBTaXplOiAwMWggPSAyIGRCCisgIHJhZGlvTGlua1RpbWVvdXRCczogNjQgIFNBQ0NIIG11bHRpZnJhbWVzCisgIGVuYWJsZUJTUG93ZXJDb250cm9sOiAwMGggPSAgZGlzYWJsZWQKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzRbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9QV1JfQ1RSTCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkJTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMLCAweDAwLAorCQlOTV9BVFRfQlMxMV9FTkFfUFdSX0NUUkxfUkxGVywgMHgwMCwKKwkJMHg3RSwgMHgwNCwgMHgwMSwJLyogcGNBdmVyYWdpbmdMZXYgKi8KKwkJMHg3RiwgMHgwNCwgMHgwMiwJLyogcGNBdmVyYWdpbmdRdWFsICovCisJCTB4ODAsIDB4MEYsCQkvKiBwY0xvd2VyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg4MSwgMHgwQSwJCS8qIHBjTG93ZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDgyLCAweDA1LAkJLyogcGNMb3dlclRocmVzaG9sZFF1YWxETCAqLworCQkweDgzLCAweDA1LAkJLyogcGNMb3dlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDg0LCAweDBDLCAJCS8qIHBjUkxGVGhyZXNob2xkICovCisJCTB4ODUsIDB4MTQsIAkJLyogcGNVcHBlclRocmVzaG9sZExldkRMICovCisJCTB4ODYsIDB4MEYsIAkJLyogcGNVcHBlclRocmVzaG9sZExldlVMICovCisJCTB4ODcsIDB4MDQsCQkvKiBwY1VwcGVyVGhyZXNob2xkUXVhbERMICovCisJCTB4ODgsIDB4MDQsCQkvKiBwY1VwcGVyVGhyZXNob2xkUXVhbFVMICovCisJCTB4ODksIDB4MDIsCQkvKiBwb3dlckNvbmZpcm0gKi8KKwkJMHg4QSwgMHgwMiwJCS8qIHBvd2VyQ29uZmlybUludGVydmFsICovCisJCTB4OEIsIDB4MDIsCQkvKiBwb3dlckluY3JTdGVwU2l6ZSAqLworCQkweDhDLCAweDAxLAkJLyogcG93ZXJSZWRTdGVwU2l6ZSAqLworCQkweDhELCAweDQwLAkJLyogcmFkaW9MaW5rVGltZW91dEJzICovCisJCTB4NjUsIDB4MDEsIDB4MDAgLy8gc2V0IHRvIDB4MDEgdG8gZW5hYmxlIEJTUG93ZXJDb250cm9sCit9OworCisKKy8vIFRyYW5zY2VpdmVyLCBTRVQgVFJYIEFUVFJJQlVURVMgKFRSWCAwKQorCisvKgorICBPYmplY3QgQ2xhc3M6IFRyYW5zY2VpdmVyCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIFRyYW5jZWl2ZXIgbnVtYmVyOiAwCisgIEluc3RhbmNlIDM6IEZGCitTRVQgVFJYIEFUVFJJQlVURVMKKyAgYVJGQ05MaXN0IChIRVgpOiAgMDAwMQorICB0eFB3ck1heFJlZHVjdGlvbjogMDBoID0gICAzMGRCCisgIHJhZGlvTWVhc0dyYW46IDI1NCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgcmFkaW9NZWFzUmVwOiAwMWggPSAgZW5hYmxlZAorICBtZW1iZXJPZkVtZXJnZW5jeUNvbmZpZzogMDFoID0gIFRSVUUKKyAgdHJ4QXJlYTogMDBoID0gVFJYIGRvZXNuJ3QgYmVsb25nIHRvIGEgY29uY2VudHJpYyBjZWxsCisqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBiczExX2F0dHJfcmFkaW9bXSA9Cit7CisJCU5NX0FUVF9BUkZDTl9MSVNULCAweDAxLCAweDAwLCBIQVJEQ09ERURfQVJGQ04gLyoweDAxKi8sCisJCU5NX0FUVF9SRl9NQVhQT1dSX1IsIDB4MDAsCisJCU5NX0FUVF9CUzExX1JBRElPX01FQVNfR1JBTiwgMHgwMSwgMHgwNSwKKwkJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19SRVAsIDB4MDEsIDB4MDEsCisJCU5NX0FUVF9CUzExX0VNUkdfQ0ZHX01FTUJFUiwgMHgwMSwgMHgwMSwKKwkJTk1fQVRUX0JTMTFfVFJYX0FSRUEsIDB4MDEsIDB4MDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfYnRzW10gPSB7CisJTk1fQVRUX0lOVEVSRl9CT1VORCwgMHg1NSwgMHg1YiwgMHg2MSwgMHg2NywgMHg2ZCwgMHg3MywKKwkvKiBpbnRlcmZlcmVuY2UgYXZnLiBwZXJpb2QgaW4gbnVtYmVycyBvZiBTQUNDSCBtdWx0aWZyICovCisJTk1fQVRUX0lOVEFWRV9QQVJBTSwgMHgwNiwKKwkvKiBjb25uIGZhaWwgYmFzZWQgb24gU0FDQ0ggZXJyb3IgcmF0ZSAqLworCU5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgxMCwKKwlOTV9BVFRfVDIwMCwgMHgxZSwgMHgyNCwgMHgyNCwgMHhhOCwgMHgzNCwgMHgyMSwgMHhhOCwKKwlOTV9BVFRfTUFYX1RBLCAweDNmLAorCU5NX0FUVF9PVkVSTF9QRVJJT0QsIDB4MDAsIDB4MDEsIDEwLCAvKiBzZWNvbmRzICovCisJTk1fQVRUX0NDQ0hfTF9ULCAxMCwgLyogcGVyY2VudCAqLworCU5NX0FUVF9DQ0NIX0xfSV9QLCAxLCAvKiBzZWNvbmRzICovCisJTk1fQVRUX1JBQ0hfQl9USFJFU0gsIDEwLCAvKiBidXN5IHRocmVzaG9sZCBpbiAtIGRCbSAqLworCU5NX0FUVF9MREFWR19TTE9UUywgMHgwMywgMHhlOCwgLyogcmFjaCBsb2FkIGF2ZXJhZ2luZyAxMDAwIHNsb3RzICovCisJTk1fQVRUX0JUU19BSVJfVElNRVIsIDEyOCwgLyogbWlsaXNlY29uZHMgKi8KKwlOTV9BVFRfTlkxLCAxMCwgLyogMTAgcmV0cmFuc21pc3Npb25zIG9mIHBoeXNpY2FsIGNvbmZpZyAqLworCU5NX0FUVF9CQ0NIX0FSRkNOLCBIQVJEQ09ERURfQVJGQ04gPj4gOCwgSEFSRENPREVEX0FSRkNOICYgMHhmZiwKKwlOTV9BVFRfQlNJQywgSEFSRENPREVEX0JTSUMsCisJTk1fQVRUX0lQQUNDX0NHSSwgMCwgNywgIDB4MDAsIDB4ZjEsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfcmFkaW9bXSA9IHsKKwlOTV9BVFRfUkZfTUFYUE9XUl9SLCAweDBjLCAvKiBudW1iZXIgb2YgLTJkQiByZWR1Y3Rpb24gc3RlcHMgLyBQbiAqLworCU5NX0FUVF9BUkZDTl9MSVNULCAweDAwLCAweDAyLCBIQVJEQ09ERURfQVJGQ04gPj4gOCwgSEFSRENPREVEX0FSRkNOICYgMHhmZiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9uc2VbXSA9IHsKKwlOTV9BVFRfSVBBQ0NfTlNFSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIE5TRUkgOTI1ICovCisJTk1fQVRUX0lQQUNDX05TX0NGRywgMCwgNywgIDMsICAvKiAodW4pYmxvY2tpbmcgdGltZXIgKFRucy1ibG9jaykgKi8KKwkJCQkgICAgMywgIC8qICh1bilibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiByZXNldCB0aW1lciAoVG5zLXJlc2V0KSAqLworCQkJCSAgICAzLCAgLyogcmVzZXQgcmV0cmllcyAqLworCQkJCSAgICAzMCwgIC8qIHRlc3QgdGltZXIgKFRucy10ZXN0KSAqLworCQkJCSAgICAzLCAgLyogYWxpdmUgdGltZXIgKFRucy1hbGl2ZSkgKi8KKwkJCQkgICAgMTAsIC8qIGFsaXZlIHJldHJpcmVzICovCisJTk1fQVRUX0lQQUNDX0JTU0dQX0NGRywgMCwgMTEsCisJCQkJICAgIDMsICAvKiBibG9ja2ltZyB0aW1lciAoVDEpICovCisJCQkJICAgIDMsICAvKiBibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiB1bmJsb2NraW5nIHJldHJpZXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc2V0IHRpbWVyICovCisJCQkJICAgIDMsICAvKiByZXNldCByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiBzdXNwZW5kIHRpbWVyIChUMykgaW4gMTAwbXMgKi8KKwkJCQkgICAgMywgIC8qIHN1c3BlbmQgcmV0cmllcyAqLworCQkJCSAgICAxMCwgLyogcmVzdW1lIHRpbWVyIChUNCkgaW4gMTAwbXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc3VtZSByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiBjYXBhYmlsaXR5IHVwZGF0ZSB0aW1lciAoVDUpICovCisJCQkJICAgIDMsICAvKiBjYXBhYmlsaXR5IHVwZGF0ZSByZXRyaWVzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfY2VsbFtdID0geworCU5NX0FUVF9JUEFDQ19SQUMsIDAsIDEsICAxLCAvKiByb3V0aW5nIGFyZWEgY29kZSAqLworCU5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcsIDAsIDIsCisJCTUsCS8qIHJlcGVhdCB0aW1lICg1MG1zKSAqLworCQkzLAkvKiByZXBlYXQgY291bnQgKi8KKwlOTV9BVFRfSVBBQ0NfQlZDSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIEJWQ0kgOTI1ICovCisJTk1fQVRUX0lQQUNDX1JMQ19DRkcsIDAsIDksCisJCTIwLCAJLyogVDMxNDIgKi8KKwkJNSwgCS8qIFQzMTY5ICovCisJCTUsCS8qIFQzMTkxICovCisJCTIwMCwJLyogVDMxOTMgKi8KKwkJNSwJLyogVDMxOTUgKi8KKwkJMTAsCS8qIE4zMTAxICovCisJCTQsCS8qIE4zMTAzICovCisJCTgsCS8qIE4zMTA1ICovCisJCTE1LAkvKiBSTEMgQ1YgY291bnRkb3duICovCisJTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTLCAwLCAyLCAgMHgwZiwgMHgwMCwJLyogQ1MxLi5DUzQgKi8KKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18yLCAwLCA1LAorCQkweDAwLCAyNTAsCS8qIFQgZG93bmxpbmsgVEJGIGV4dGVuc2lvbiAoMC4uNTAwKSAqLworCQkweDAwLCAyNTAsCS8qIFQgdXBsaW5rIFRCRiBleHRlbnNpb24gKDAuLjUwMCkgKi8KKwkJMiwJLyogQ1MyICovCisjaWYgMAorCS8qIEVER0UgbW9kZWwgb25seSwgYnJlYWtzIG9sZGVyIG1vZGVscy4KKwkgKiBTaG91bGQgaW5xdWlyZSB0aGUgQlRTIGNhcGFiaWxpdGllcyAqLworCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzMsIDAsIDEsCisJCTIsCS8qIE1DUzIgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbmFub2J0c19hdHRyX25zdmMwW10gPSB7CisJTk1fQVRUX0lQQUNDX05TVkNJLCAwLCAyLCAgMHgwMywgMHg5ZCwgLyogOTI1ICovCisJTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHLCAwLCA4LAorCQkweDU5LCAweGQ4LCAvKiByZW1vdGUgdWRwIHBvcnQgKDIzMDAwKSAqLworCQkxOTIsIDE2OCwgMTAwLCAxMSwgLyogcmVtb3RlIGlwIGFkZHJlc3MgKi8KKwkJMHg1OSwgMHhkOCwgLyogbG9jYWwgdWRwIHBvcnQgKDIzMDAwKSAqLworfTsKKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHdlIGdldCBhIEdTTSAxMi4yMSBzdGF0ZSBjaGFuZ2UgZXZlbnQgKi8KK2ludCBubV9zdGF0ZV9ldmVudChlbnVtIG5tX2V2dCBldnQsIHVfaW50OF90IG9ial9jbGFzcywgdm9pZCAqb2JqLAorCQkgICBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpvbGRfc3RhdGUsIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5ld19zdGF0ZSwKKwkJICAgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKm9ial9pbnN0KQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0czsKKwlzdHJ1Y3QgZ3NtX2J0c19ncHJzX25zdmMgKm5zdmM7CisKKwkvKiBUaGlzIGV2ZW50LWRyaXZlbiBCVFMgc2V0dXAgaXMgY3VycmVudGx5IG9ubHkgcmVxdWlyZWQgb24gbmFub0JUUyAqLworCisJLyogRVZUX1NUQVRFQ0hHX0FETSBpcyBjYWxsZWQgYWZ0ZXIgd2UgY2FsbCBjaGdfYWRtX3N0YXRlKCkgYW5kIHdvdWxkIGNyZWF0ZQorCSAqIGVuZGxlc3MgbG9vcCAqLworCWlmIChldnQgIT0gRVZUX1NUQVRFQ0hHX09QRVIpCisJCXJldHVybiAwOworCisJc3dpdGNoIChvYmpfY2xhc3MpIHsKKwljYXNlIE5NX09DX1NJVEVfTUFOQUdFUjoKKwkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIHNpdGVfbWdyKTsKKwkJaWYgKChuZXdfc3RhdGUtPm9wZXJhdGlvbmFsID09IDIgJiYKKwkJICAgICBuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09LKSB8fAorCQkgICAgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMSAmJgorCQkgICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfT0ZGX0xJTkUpKQorCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLCAweGZmLCAweGZmLCAweGZmKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19CVFM6CisJCWJ0cyA9IG9iajsKKwkJaWYgKG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfREVQRU5ERU5DWSkgeworCQkJcGF0Y2hfbm1fdGFibGVzKGJ0cyk7CisJCQlhYmlzX25tX3NldF9idHNfYXR0cihidHMsIG5hbm9idHNfYXR0cl9idHMsCisJCQkJCSAgICAgc2l6ZW9mKG5hbm9idHNfYXR0cl9idHMpKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShidHMsIG9ial9jbGFzcywKKwkJCQkJICAgICAgYnRzLT5idHNfbnIsIDB4ZmYsIDB4ZmYsCisJCQkJCSAgICAgIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJCWFiaXNfbm1fb3BzdGFydChidHMsIG9ial9jbGFzcywKKwkJCQkJYnRzLT5idHNfbnIsIDB4ZmYsIDB4ZmYpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQ0hBTk5FTDoKKwkJdHMgPSBvYmo7CisJCXRyeCA9IHRzLT50cng7CisJCWlmIChuZXdfc3RhdGUtPm9wZXJhdGlvbmFsID09IDEgJiYKKwkJICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfREVQRU5ERU5DWSkgeworCQkJcGF0Y2hfbm1fdGFibGVzKHRyeC0+YnRzKTsKKwkJCWVudW0gYWJpc19ubV9jaGFuX2NvbWIgY2NvbWIgPQorCQkJCQkJYWJpc19ubV9jaGNvbWI0cGNoYW4odHMtPnBjaGFuKTsKKwkJCWFiaXNfbm1fc2V0X2NoYW5uZWxfYXR0cih0cywgY2NvbWIpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKHRyeC0+YnRzLCBvYmpfY2xhc3MsCisJCQkJCSAgICAgIHRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIHRzLT5uciwKKwkJCQkJICAgICAgTk1fU1RBVEVfVU5MT0NLRUQpOworCQkJYWJpc19ubV9vcHN0YXJ0KHRyeC0+YnRzLCBvYmpfY2xhc3MsCisJCQkJCXRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIHRzLT5ucik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19SQURJT19DQVJSSUVSOgorCQl0cnggPSBvYmo7CisJCWlmIChuZXdfc3RhdGUtPm9wZXJhdGlvbmFsID09IDEgJiYKKwkJICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfT0spCisJCQlhYmlzX25tX29wc3RhcnQodHJ4LT5idHMsIG9ial9jbGFzcywgdHJ4LT5idHMtPmJ0c19uciwKKwkJCQkJdHJ4LT5uciwgMHhmZik7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19OU0U6CisJCWJ0cyA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBnc21fYnRzLCBncHJzLm5zZSk7CisJCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKQorCQkJYnJlYWs7CisJCWlmIChuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSA1KSB7CisJCQlhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJCSAgMHhmZiwgMHhmZiwgbmFub2J0c19hdHRyX25zZSwKKwkJCQkJCSAgc2l6ZW9mKG5hbm9idHNfYXR0cl9uc2UpKTsKKwkJCWFiaXNfbm1fb3BzdGFydChidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCTB4ZmYsIDB4ZmYpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJICAgICAgMHhmZiwgMHhmZiwgTk1fU1RBVEVfVU5MT0NLRUQpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19DRUxMOgorCQlidHMgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZ3NtX2J0cywgZ3Bycy5jZWxsKTsKKwkJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpCisJCQlicmVhazsKKwkJaWYgKG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IDUpIHsKKwkJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkJICAwLCAweGZmLCBuYW5vYnRzX2F0dHJfY2VsbCwKKwkJCQkJCSAgc2l6ZW9mKG5hbm9idHNfYXR0cl9jZWxsKSk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkwLCAweGZmKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCSAgICAgIDAsIDB4ZmYsIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNWQzoKKwkJbnN2YyA9IG9iajsKKwkJYnRzID0gbnN2Yy0+YnRzOworCQlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkKKwkJCWJyZWFrOworCQkvKiBXZSBza2lwIE5TVkMxIHNpbmNlIHdlIG9ubHkgdXNlIE5TVkMwICovCisJCWlmIChuc3ZjLT5pZCA9PSAxKQorCQkJYnJlYWs7CisJCWlmIChuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09GRl9MSU5FKSB7CisJCQlhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJCSAgbnN2Yy0+aWQsIDB4ZmYsCisJCQkJCQkgIG5hbm9idHNfYXR0cl9uc3ZjMCwKKwkJCQkJCSAgc2l6ZW9mKG5hbm9idHNfYXR0cl9uc3ZjMCkpOworCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJbnN2Yy0+aWQsIDB4ZmYpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJICAgICAgbnN2Yy0+aWQsIDB4ZmYsCisJCQkJCSAgICAgIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgd2UgcmVjZWl2ZSBhIDEyLjIxIFNXIGFjdGl2YXRlZCByZXBvcnQgKi8KK3N0YXRpYyBpbnQgc3dfYWN0aXZfcmVwKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbWItPnRyeC0+YnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgZm9oLT5vYmpfaW5zdC50cnhfbnIpOworCisJaWYgKCF0cngpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChmb2gtPm9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQkFTRUJfVFJBTlNDOgorCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLAorCQkJCSAgICAgIHRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYsCisJCQkJICAgICAgTk1fU1RBVEVfVU5MT0NLRUQpOworCQlhYmlzX25tX29wc3RhcnQodHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLAorCQkJCXRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYpOworCQkvKiBUUlggc29mdHdhcmUgaXMgYWN0aXZlLCB0ZWxsIGl0IHRvIGluaXRpYXRlIFJTTCBMaW5rICovCisJCWFiaXNfbm1faXBhY2Nlc3NfcnNsX2Nvbm5lY3QodHJ4LCAwLCAzMDAzLCB0cngtPnJzbF90ZWkpOworCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6IHsKKwkJLyoKKwkJICogTG9ja2luZyB0aGUgcmFkaW8gY2FycmllciB3aWxsIG1ha2UgaXQgZ28KKwkJICogb2ZmbGluZSBhZ2FpbiBhbmQgd2Ugd291bGQgY29tZSBoZXJlLiBUaGUKKwkJICogZnJhbWV3b3JrIHNob3VsZCBkZXRlcm1pbmUgdGhhdCB0aGVyZSB3YXMKKwkJICogbm8gY2hhbmdlIGFuZCBhdm9pZCByZWN1cnNpb24uCisJCSAqCisJCSAqIFRoaXMgY29kZSBpcyBoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IG9uIHN0YXJ0CisJCSAqIGEgVFJYIHJlbWFpbnMgbG9ja2VkLgorCQkgKi8KKwkJaW50IHJjX3N0YXRlID0gdHJ4LT5ubV9zdGF0ZS5hZG1pbmlzdHJhdGl2ZTsKKwkJLyogUGF0Y2ggQVJGQ04gaW50byByYWRpbyBhdHRyaWJ1dGUgKi8KKwkJbmFub2J0c19hdHRyX3JhZGlvWzVdICY9IDB4ZjA7CisJCW5hbm9idHNfYXR0cl9yYWRpb1s1XSB8PSB0cngtPmFyZmNuID4+IDg7CisJCW5hbm9idHNfYXR0cl9yYWRpb1s2XSA9IHRyeC0+YXJmY24gJiAweGZmOworCQlhYmlzX25tX3NldF9yYWRpb19hdHRyKHRyeCwgbmFub2J0c19hdHRyX3JhZGlvLAorCQkJCSAgICAgICBzaXplb2YobmFub2J0c19hdHRyX3JhZGlvKSk7CisJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZSh0cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZiwKKwkJCQkgICAgICByY19zdGF0ZSk7CisJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsIHRyeC0+YnRzLT5idHNfbnIsCisJCQkJdHJ4LT5uciwgMHhmZik7CisJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgTkFDSyBvbiB0aGUgT01MIE5NICovCitzdGF0aWMgaW50IG9tbF9tc2dfbmFjayh1X2ludDhfdCBtdCkKK3sKKwlpZiAobXQgPT0gTk1fTVRfU0VUX0JUU19BVFRSX05BQ0spIHsKKwkJTE9HUChETk0sIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gc2V0IEJUUyBhdHRyaWJ1dGVzLiBUaGF0IGlzIGZhdGFsLiAiCisJCQkJIldhcyB0aGUgYnRzIHR5cGUgYW5kIGZyZXF1ZW5jeSBwcm9wZXJseSBzcGVjaWZpZWQ/XG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBldmVyeSB0aW1lIHdlIHJlY2VpdmUgYSBzaWduYWwgZnJvbSBOTSAqLworc3RhdGljIGludCBubV9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICAgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXVfaW50OF90ICptc2dfdHlwZTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX05NX1NXX0FDVElWX1JFUDoKKwkJcmV0dXJuIHN3X2FjdGl2X3JlcChzaWduYWxfZGF0YSk7CisJY2FzZSBTX05NX05BQ0s6CisJCW1zZ190eXBlID0gc2lnbmFsX2RhdGE7CisJCXJldHVybiBvbWxfbXNnX25hY2soKm1zZ190eXBlKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbV9uYW5vYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJLyogV2UgZG9uJ3QgZG8gY2FsbGJhY2sgYmFzZWQgYm9vdHN0cmFwcGluZywgYnV0IGV2ZW50IGRyaXZlbiAoc2VlIGFib3ZlKSAqLworfQorCitzdGF0aWMgdm9pZCBubV9yZWNvbmZpZ190cyhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCWVudW0gYWJpc19ubV9jaGFuX2NvbWIgY2NvbWIgPSBhYmlzX25tX2NoY29tYjRwY2hhbih0cy0+cGNoYW4pOworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFsID0gJnRzLT5lMV9saW5rOworCisJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBjY29tYik7CisKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKHRzLT50cngtPmJ0cykpCisJCXJldHVybjsKKworCXN3aXRjaCAodHMtPnBjaGFuKSB7CisJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCWFiaXNfbm1fY29ubl90ZXJyX3RyYWYodHMsIGUxbC0+ZTFfbnIsIGUxbC0+ZTFfdHMsCisJCQkJCWUxbC0+ZTFfdHNfc3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5tX3JlY29uZmlnX3RyeChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxbCA9ICZ0cngtPnJzbF9lMV9saW5rOworCWludCBpOworCisJcGF0Y2hfbm1fdGFibGVzKHRyeC0+YnRzKTsKKworCXN3aXRjaCAodHJ4LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQkvKiBGSVhNRTogZGlzY292ZXIgdGhpcyBieSBmZXRjaGluZyBhbiBhdHRyaWJ1dGUgKi8KKyNpZiAwCisJCXRyeC0+bm9taW5hbF9wb3dlciA9IDE1OyAvKiAxNWRCbSA9PSAzMG1XIFBBIGNvbmZpZ3VyYXRpb24gKi8KKyNlbHNlCisJCXRyeC0+bm9taW5hbF9wb3dlciA9IDI0OyAvKiAyNGRCbSA9PSAyNTBtVyBQQSBjb25maWd1cmF0aW9uICovCisjZW5kaWYKKwkJYWJpc19ubV9jb25uX3RlcnJfc2lnbih0cngsIGUxbC0+ZTFfbnIsIGUxbC0+ZTFfdHMsCisJCQkJCWUxbC0+ZTFfdHNfc3MpOworCQlhYmlzX25tX2VzdGFibGlzaF90ZWkodHJ4LT5idHMsIHRyeC0+bnIsIGUxbC0+ZTFfbnIsCisJCQkJICAgICAgZTFsLT5lMV90cywgZTFsLT5lMV90c19zcywgdHJ4LT5yc2xfdGVpKTsKKworCQkvKiBTZXQgUmFkaW8gQXR0cmlidXRlcyAqLworCQlpZiAodHJ4ID09IHRyeC0+YnRzLT5jMCkKKwkJCWFiaXNfbm1fc2V0X3JhZGlvX2F0dHIodHJ4LCBiczExX2F0dHJfcmFkaW8sCisJCQkJCSAgICAgICBzaXplb2YoYnMxMV9hdHRyX3JhZGlvKSk7CisJCWVsc2UgeworCQkJdV9pbnQ4X3QgdHJ4MV9hdHRyX3JhZGlvW3NpemVvZihiczExX2F0dHJfcmFkaW8pXTsKKwkJCXVfaW50OF90IGFyZmNuX2xvdyA9IHRyeC0+YXJmY24gJiAweGZmOworCQkJdV9pbnQ4X3QgYXJmY25faGlnaCA9ICh0cngtPmFyZmNuID4+IDgpICYgMHgwZjsKKwkJCW1lbWNweSh0cngxX2F0dHJfcmFkaW8sIGJzMTFfYXR0cl9yYWRpbywKKwkJCQlzaXplb2YodHJ4MV9hdHRyX3JhZGlvKSk7CisKKwkJCS8qIHBhdGNoIEFSRkNOIGludG8gVFJYIEF0dHJpYnV0ZXMgKi8KKwkJCXRyeDFfYXR0cl9yYWRpb1syXSAmPSAweGYwOworCQkJdHJ4MV9hdHRyX3JhZGlvWzJdIHw9IGFyZmNuX2hpZ2g7CisJCQl0cngxX2F0dHJfcmFkaW9bM10gPSBhcmZjbl9sb3c7CisKKwkJCWFiaXNfbm1fc2V0X3JhZGlvX2F0dHIodHJ4LCB0cngxX2F0dHJfcmFkaW8sCisJCQkJCSAgICAgICBzaXplb2YodHJ4MV9hdHRyX3JhZGlvKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJc3dpdGNoICh0cngtPmJ0cy0+YmFuZCkgeworCQljYXNlIEdTTV9CQU5EXzg1MDoKKwkJY2FzZSBHU01fQkFORF85MDA6CisJCQl0cngtPm5vbWluYWxfcG93ZXIgPSAyMDsKKwkJCWJyZWFrOworCQljYXNlIEdTTV9CQU5EXzE4MDA6CisJCWNhc2UgR1NNX0JBTkRfMTkwMDoKKwkJCXRyeC0+bm9taW5hbF9wb3dlciA9IDIzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuc3VwcG9ydGVkIG5hbm9CVFMgR1NNIGJhbmQgJXNcbiIsCisJCQkJZ3NtX2JhbmRfbmFtZSh0cngtPmJ0cy0+YmFuZCkpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRSWF9OUl9UUzsgaSsrKQorCQlubV9yZWNvbmZpZ190cygmdHJ4LT50c1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkIG5tX3JlY29uZmlnX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlwYXRjaF9ubV90YWJsZXMoYnRzKTsKKwkJYWJpc19ubV9yYXdfbXNnKGJ0cywgc2l6ZW9mKG1zZ18xKSwgbXNnXzEpOyAvKiBzZXQgQlRTIFNpdGVNZ3IgYXR0ciovCisJCWFiaXNfbm1fc2V0X2J0c19hdHRyKGJ0cywgYnMxMV9hdHRyX2J0cywgc2l6ZW9mKGJzMTFfYXR0cl9idHMpKTsKKwkJYWJpc19ubV9yYXdfbXNnKGJ0cywgc2l6ZW9mKG1zZ18zKSwgbXNnXzMpOyAvKiBzZXQgQlRTIGhhbmRvdmVyIGF0dHIgKi8KKwkJYWJpc19ubV9yYXdfbXNnKGJ0cywgc2l6ZW9mKG1zZ180KSwgbXNnXzQpOyAvKiBzZXQgQlRTIHBvd2VyIGNvbnRyb2wgYXR0ciAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KQorCQlubV9yZWNvbmZpZ190cngodHJ4KTsKK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX29tX2JzMTEoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwkvKiBzdG9wIHNlbmRpbmcgZXZlbnQgcmVwb3J0cyAqLworCWFiaXNfbm1fZXZlbnRfcmVwb3J0cyhidHMsIDApOworCisJLyogYmVnaW4gREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDEpOworCisJLyogZW5kIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAwKTsKKworCS8qIFJlc2V0IEJUUyBTaXRlIG1hbmFnZXIgcmVzb3VyY2UgKi8KKwlhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2UoYnRzKTsKKworCS8qIGJlZ2luIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAxKTsKKworCS8qIHJlY29uZmlndXJlIEJUUyB3aXRoIGFsbCBUUlggYW5kIGFsbCBUUyAqLworCW5tX3JlY29uZmlnX2J0cyhidHMpOworCisJLyogZW5kIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAwKTsKKworCS8qIFJlc2V0IEJUUyBTaXRlIG1hbmFnZXIgcmVzb3VyY2UgKi8KKwlhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2UoYnRzKTsKKworCS8qIHJlc3RhcnQgc2VuZGluZyBldmVudCByZXBvcnRzICovCisJYWJpc19ubV9ldmVudF9yZXBvcnRzKGJ0cywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgImJvb3RzdHJhcHBpbmcgT01MIGZvciBCVFMgJXVcbiIsIGJ0cy0+bnIpOworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlib290c3RyYXBfb21fYnMxMShidHMpOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlib290c3RyYXBfb21fbmFub2J0cyhidHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuYWJsZSB0byBib290c3RyYXAgT01MOiBVbmtub3duIEJUUyB0eXBlICVkXG4iLCBidHMtPnR5cGUpOworCX0KK30KKworc3RhdGljIGludCBzaHV0ZG93bl9vbShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgInNodXR0aW5nIGRvd24gT01MIGZvciBCVFMgJXVcbiIsIGJ0cy0+bnIpOworCisJLyogc3RvcCBzZW5kaW5nIGV2ZW50IHJlcG9ydHMgKi8KKwlhYmlzX25tX2V2ZW50X3JlcG9ydHMoYnRzLCAwKTsKKworCS8qIGJlZ2luIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAxKTsKKworCS8qIGVuZCBEQiB0cmFuc21pc3Npb24gKi8KKwlhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKGJ0cywgMCk7CisKKwkvKiBSZXNldCBCVFMgU2l0ZSBtYW5hZ2VyIHJlc291cmNlICovCisJYWJpc19ubV9iczExX3Jlc2V0X3Jlc291cmNlKGJ0cyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGJzY19zaHV0ZG93bl9uZXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJm5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJaW50IHJjOworCQlyYyA9IHNodXRkb3duX29tKGJ0cyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHNldCBhbGwgc3lzdGVtIGluZm9ybWF0aW9uIHR5cGVzICovCitzdGF0aWMgaW50IHNldF9zeXN0ZW1faW5mb3Moc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJaW50IGksIHJjOworCXVfaW50OF90IHNpX3RtcFsyM107CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRyeC0+YnRzOworCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLm1zX3R4cHdyX21heF9jY2NoID0KKwkJCW1zX3B3cl9jdGxfbHZsKGJ0cy0+YmFuZCwgYnRzLT5tc19tYXhfcG93ZXIpOworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5uZWNpID0gYnRzLT5uZXR3b3JrLT5uZWNpOworCisJaWYgKHRyeCA9PSB0cngtPmJ0cy0+YzApIHsKKwkJZm9yIChpID0gMTsgaSA8PSA0OyBpKyspIHsKKwkJCXJjID0gZ3NtX2dlbmVyYXRlX3NpKHNpX3RtcCwgdHJ4LT5idHMsIGkpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQlERUJVR1AoRFJSLCAiU0klMnU6ICVzXG4iLCBpLCBoZXhkdW1wKHNpX3RtcCwgcmMpKTsKKwkJCXJzbF9iY2NoX2luZm8odHJ4LCBpLCBzaV90bXAsIHNpemVvZihzaV90bXApKTsKKwkJfQorCQlpZiAoYnRzLT5ncHJzLm1vZGUgIT0gQlRTX0dQUlNfTk9ORSkgeworCQkJaSA9IDEzOworCQkJcmMgPSBnc21fZ2VuZXJhdGVfc2koc2lfdG1wLCB0cngtPmJ0cywgUlNMX1NZU1RFTV9JTkZPXzEzKTsKKwkJCWlmIChyYyA8IDApCisJCQkJZ290byBlcnJfb3V0OworCQkJREVCVUdQKERSUiwgIlNJJTJ1OiAlc1xuIiwgaSwgaGV4ZHVtcChzaV90bXAsIHJjKSk7CisJCQlyc2xfYmNjaF9pbmZvKHRyeCwgUlNMX1NZU1RFTV9JTkZPXzEzLCBzaV90bXAsIHJjKTsKKwkJfQorCX0KKworCWkgPSA1OworCXJjID0gZ3NtX2dlbmVyYXRlX3NpKHNpX3RtcCwgdHJ4LT5idHMsIFJTTF9TWVNURU1fSU5GT181KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycl9vdXQ7CisJREVCVUdQKERSUiwgIlNJJTJ1OiAlc1xuIiwgaSwgaGV4ZHVtcChzaV90bXAsIHJjKSk7CisJcnNsX3NhY2NoX2ZpbGxpbmcodHJ4LCBSU0xfU1lTVEVNX0lORk9fNSwgc2lfdG1wLCByYyk7CisKKwlpID0gNjsKKwlyYyA9IGdzbV9nZW5lcmF0ZV9zaShzaV90bXAsIHRyeC0+YnRzLCBSU0xfU1lTVEVNX0lORk9fNik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnJfb3V0OworCURFQlVHUChEUlIsICJTSSUydTogJXNcbiIsIGksIGhleGR1bXAoc2lfdG1wLCByYykpOworCXJzbF9zYWNjaF9maWxsaW5nKHRyeCwgUlNMX1NZU1RFTV9JTkZPXzYsIHNpX3RtcCwgcmMpOworCisJcmV0dXJuIDA7CitlcnJfb3V0OgorCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiQ2Fubm90IGdlbmVyYXRlIFNJICV1IGZvciBCVFMgJXUsIG1vc3QgbGlrZWx5ICIKKwkJImEgcHJvYmxlbSB3aXRoIG5laWdoYm9yIGNlbGwgbGlzdCBnZW5lcmF0aW9uXG4iLAorCQlpLCB0cngtPmJ0cy0+bnIpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIFBhdGNoIHRoZSB2YXJpb3VzIFNZU1RFTSBJTkZPUk1BVElPTiB0YWJsZXMgdG8gdXBkYXRlCisgKiB0aGUgTEFJCisgKi8KK3N0YXRpYyB2b2lkIHBhdGNoX25tX3RhYmxlcyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXVfaW50OF90IGFyZmNuX2xvdyA9IGJ0cy0+YzAtPmFyZmNuICYgMHhmZjsKKwl1X2ludDhfdCBhcmZjbl9oaWdoID0gKGJ0cy0+YzAtPmFyZmNuID4+IDgpICYgMHgwZjsKKworCS8qIHBhdGNoIEFSRkNOIGludG8gQlRTIEF0dHJpYnV0ZXMgKi8KKwliczExX2F0dHJfYnRzWzY5XSAmPSAweGYwOworCWJzMTFfYXR0cl9idHNbNjldIHw9IGFyZmNuX2hpZ2g7CisJYnMxMV9hdHRyX2J0c1s3MF0gPSBhcmZjbl9sb3c7CisJbmFub2J0c19hdHRyX2J0c1s0Ml0gJj0gMHhmMDsKKwluYW5vYnRzX2F0dHJfYnRzWzQyXSB8PSBhcmZjbl9oaWdoOworCW5hbm9idHNfYXR0cl9idHNbNDNdID0gYXJmY25fbG93OworCisJLyogcGF0Y2ggQVJGQ04gaW50byBUUlggQXR0cmlidXRlcyAqLworCWJzMTFfYXR0cl9yYWRpb1syXSAmPSAweGYwOworCWJzMTFfYXR0cl9yYWRpb1syXSB8PSBhcmZjbl9oaWdoOworCWJzMTFfYXR0cl9yYWRpb1szXSA9IGFyZmNuX2xvdzsKKworCS8qIHBhdGNoIHRoZSBSQUNIIGF0dHJpYnV0ZXMgKi8KKwlpZiAoYnRzLT5yYWNoX2JfdGhyZXNoICE9IC0xKSB7CisJCW5hbm9idHNfYXR0cl9idHNbMzNdID0gYnRzLT5yYWNoX2JfdGhyZXNoICYgMHhmZjsKKwkJYnMxMV9hdHRyX2J0c1szM10gPSBidHMtPnJhY2hfYl90aHJlc2ggJiAweGZmOworCX0KKworCWlmIChidHMtPnJhY2hfbGRhdmdfc2xvdHMgIT0gLTEpIHsKKwkJdV9pbnQ4X3QgYXZnX2hpZ2ggPSBidHMtPnJhY2hfbGRhdmdfc2xvdHMgJiAweGZmOworCQl1X2ludDhfdCBhdmdfbG93ID0gKGJ0cy0+cmFjaF9sZGF2Z19zbG90cyA+PiA4KSAmIDB4MGY7CisKKwkJbmFub2J0c19hdHRyX2J0c1szNV0gPSBhdmdfaGlnaDsKKwkJbmFub2J0c19hdHRyX2J0c1szNl0gPSBhdmdfbG93OworCQliczExX2F0dHJfYnRzWzM1XSA9IGF2Z19oaWdoOworCQliczExX2F0dHJfYnRzWzM2XSA9IGF2Z19sb3c7CisJfQorCisJLyogcGF0Y2ggQlNJQyAqLworCWJzMTFfYXR0cl9idHNbMV0gPSBidHMtPmJzaWM7CisJbmFub2J0c19hdHRyX2J0c1tzaXplb2YobmFub2J0c19hdHRyX2J0cyktMTFdID0gYnRzLT5ic2ljOworCisJLyogcGF0Y2ggQ0dJICovCisJYWJpc19ubV9pcGFjY2Vzc19jZ2kobmFub2J0c19hdHRyX2J0cytzaXplb2YobmFub2J0c19hdHRyX2J0cyktNywgYnRzKTsKKworCS8qIHBhdGNoIHRoZSBwb3dlciByZWR1Y3Rpb24gKi8KKwliczExX2F0dHJfcmFkaW9bNV0gPSBidHMtPmMwLT5tYXhfcG93ZXJfcmVkIC8gMjsKKwluYW5vYnRzX2F0dHJfcmFkaW9bMV0gPSBidHMtPmMwLT5tYXhfcG93ZXJfcmVkIC8gMjsKKworCS8qIHBhdGNoIE5TRUkgKi8KKwluYW5vYnRzX2F0dHJfbnNlWzNdID0gYnRzLT5ncHJzLm5zZS5uc2VpID4+IDg7CisJbmFub2J0c19hdHRyX25zZVs0XSA9IGJ0cy0+Z3Bycy5uc2UubnNlaSAmIDB4ZmY7CisJbWVtY3B5KG5hbm9idHNfYXR0cl9uc2UrOCwgYnRzLT5ncHJzLm5zZS50aW1lciwKKwkJQVJSQVlfU0laRShidHMtPmdwcnMubnNlLnRpbWVyKSk7CisJbWVtY3B5KG5hbm9idHNfYXR0cl9uc2UrMTgsIGJ0cy0+Z3Bycy5jZWxsLnRpbWVyLAorCQlBUlJBWV9TSVpFKGJ0cy0+Z3Bycy5jZWxsLnRpbWVyKSk7CisKKwkvKiBwYXRjaCBOU1ZDSSAqLworCW5hbm9idHNfYXR0cl9uc3ZjMFszXSA9IGJ0cy0+Z3Bycy5uc3ZjWzBdLm5zdmNpID4+IDg7CisJbmFub2J0c19hdHRyX25zdmMwWzRdID0gYnRzLT5ncHJzLm5zdmNbMF0ubnN2Y2kgJiAweGZmOworCisJLyogcGF0Y2ggSVAgYWRkcmVzcyBhcyBTR1NOIElQICovCisJKih1X2ludDE2X3QgKikobmFub2J0c19hdHRyX25zdmMwKzgpID0KKwkJCQlodG9ucyhidHMtPmdwcnMubnN2Y1swXS5yZW1vdGVfcG9ydCk7CisJKih1X2ludDMyX3QgKikobmFub2J0c19hdHRyX25zdmMwKzEwKSA9CisJCQkJaHRvbmwoYnRzLT5ncHJzLm5zdmNbMF0ucmVtb3RlX2lwKTsKKwkqKHVfaW50MTZfdCAqKShuYW5vYnRzX2F0dHJfbnN2YzArMTQpID0KKwkJCQlodG9ucyhidHMtPmdwcnMubnN2Y1swXS5sb2NhbF9wb3J0KTsKKworCS8qIHBhdGNoIEJWQ0kgKi8KKwluYW5vYnRzX2F0dHJfY2VsbFsxMl0gPSBidHMtPmdwcnMuY2VsbC5idmNpID4+IDg7CisJbmFub2J0c19hdHRyX2NlbGxbMTNdID0gYnRzLT5ncHJzLmNlbGwuYnZjaSAmIDB4ZmY7CisJLyogcGF0Y2ggUkFDICovCisJbmFub2J0c19hdHRyX2NlbGxbM10gPSBidHMtPmdwcnMucmFjOworCisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX0VHUFJTKSB7CisJCS8qIHBhdGNoIEVHUFJTIGNvZGluZyBzY2hlbWVzIE1DUyAxLi45ICovCisJCW5hbm9idHNfYXR0cl9jZWxsWzI5XSA9IDB4OGY7CisJCW5hbm9idHNfYXR0cl9jZWxsWzMwXSA9IDB4ZmY7CisJfQorfQorCitzdGF0aWMgdm9pZCBib290c3RyYXBfcnNsKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJib290c3RyYXBwaW5nIFJTTCBmb3IgQlRTL1RSWCAoJXUvJXUpICIKKwkJIm9uIEFSRkNOICV1IHVzaW5nIE1DQz0ldSBNTkM9JXUgTEFDPSV1IENJRD0ldSBCU0lDPSV1IFRTQz0ldVxuIiwKKwkJdHJ4LT5idHMtPm5yLCB0cngtPm5yLCB0cngtPmFyZmNuLCBic2NfZ3NtbmV0LT5jb3VudHJ5X2NvZGUsCisJCWJzY19nc21uZXQtPm5ldHdvcmtfY29kZSwgdHJ4LT5idHMtPmxvY2F0aW9uX2FyZWFfY29kZSwKKwkJdHJ4LT5idHMtPmNlbGxfaWRlbnRpdHksIHRyeC0+YnRzLT5ic2ljLCB0cngtPmJ0cy0+dHNjKTsKKwlzZXRfc3lzdGVtX2luZm9zKHRyeCk7Cit9CisKK3ZvaWQgaW5wdXRfZXZlbnQoaW50IGV2ZW50LCBlbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlLCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlpbnQgdHNfbm8sIGxjaGFuX25vOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRVZUX0UxX1RFSV9VUDoKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCQlib290c3RyYXBfb20odHJ4LT5idHMpOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCQlib290c3RyYXBfcnNsKHRyeCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRVZUX0UxX1RFSV9ETjoKKwkJTE9HUChETUksIExPR0xfRVJST1IsICJMb3N0IHNvbWUgRTEgVEVJIGxpbms6ICVkICVwXG4iLCB0eXBlLCB0cngpOworCisJCWlmICh0eXBlID09IEUxSU5QX1NJR05fT01MKQorCQkJY291bnRlcl9pbmModHJ4LT5idHMtPm5ldHdvcmstPnN0YXRzLmJ0cy5vbWxfZmFpbCk7CisJCWVsc2UgaWYgKHR5cGUgPT0gRTFJTlBfU0lHTl9SU0wpCisJCQljb3VudGVyX2luYyh0cngtPmJ0cy0+bmV0d29yay0+c3RhdHMuYnRzLnJzbF9mYWlsKTsKKworCQkvKgorCQkgKiBmcmVlIGFsbCBhbGxvY2F0ZWQgY2hhbm5lbHMuIGNoYW5nZSB0aGUgbm1fc3RhdGUgc28gdGhlCisJCSAqIHRyeCBhbmQgdHJ4X3RzIGJlY29tZXMgdW51c2FibGUgYW5kIGNoYW5fYWxsb2MuYyBjYW4gbm90CisJCSAqIGFsbG9jYXRlIGZyb20gaXQuCisJCSAqLworCQlmb3IgKHRzX25vID0gMDsgdHNfbm8gPCBBUlJBWV9TSVpFKHRyeC0+dHMpOyArK3RzX25vKSB7CisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNbdHNfbm9dOworCisJCQlmb3IgKGxjaGFuX25vID0gMDsgbGNoYW5fbm8gPCBBUlJBWV9TSVpFKHRzLT5sY2hhbik7ICsrbGNoYW5fbm8pIHsKKwkJCQlpZiAodHMtPmxjaGFuW2xjaGFuX25vXS5zdGF0ZSAhPSBHU01fTENIQU5fTk9ORSkKKwkJCQkJbGNoYW5fZnJlZSgmdHMtPmxjaGFuW2xjaGFuX25vXSk7CisJCQkJbGNoYW5fcmVzZXQoJnRzLT5sY2hhbltsY2hhbl9ub10pOworCQkJfQorCisJCQl0cy0+bm1fc3RhdGUub3BlcmF0aW9uYWwgPSAwOworCQkJdHMtPm5tX3N0YXRlLmF2YWlsYWJpbGl0eSA9IDA7CisJCX0KKworCQl0cngtPm5tX3N0YXRlLm9wZXJhdGlvbmFsID0gMDsKKwkJdHJ4LT5ubV9zdGF0ZS5hdmFpbGFiaWxpdHkgPSAwOworCQl0cngtPmJiX3RyYW5zYy5ubV9zdGF0ZS5vcGVyYXRpb25hbCA9IDA7CisJCXRyeC0+YmJfdHJhbnNjLm5tX3N0YXRlLmF2YWlsYWJpbGl0eSA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBib290c3RyYXBfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IGksIG47CisKKwlzd2l0Y2ggKGJ0cy0+YmFuZCkgeworCWNhc2UgR1NNX0JBTkRfMTgwMDoKKwkJaWYgKGJ0cy0+YzAtPmFyZmNuIDwgNTEyIHx8IGJ0cy0+YzAtPmFyZmNuID4gODg1KSB7CisJCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkdTTTE4MDAgY2hhbm5lbCBtdXN0IGJlIGJldHdlZW4gNTEyLTg4NS5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQkFORF8xOTAwOgorCQlpZiAoYnRzLT5jMC0+YXJmY24gPCA1MTIgfHwgYnRzLT5jMC0+YXJmY24gPiA4MTApIHsKKwkJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiR1NNMTkwMCBjaGFubmVsIG11c3QgYmUgYmV0d2VlbiA1MTItODEwLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CQU5EXzkwMDoKKwkJaWYgKGJ0cy0+YzAtPmFyZmNuIDwgMSB8fAorCQkgICAoYnRzLT5jMC0+YXJmY24gPiAxMjQgJiYgYnRzLT5jMC0+YXJmY24gPCA5NTUpIHx8CisJCSAgICBidHMtPmMwLT5hcmZjbiA+IDEwMjMpICB7CisJCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkdTTTkwMCBjaGFubmVsIG11c3QgYmUgYmV0d2VlbiAxLTEyNCwgOTU1LTEwMjMuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVW5zdXBwb3J0ZWQgZnJlcXVlbmN5IGJhbmQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGJ0cy0+bmV0d29yay0+YXV0aF9wb2xpY3kgPT0gR1NNX0FVVEhfUE9MSUNZX0FDQ0VQVF9BTEwgJiYKKwkgICAgIWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5jZWxsX2JhcikKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJcbldBUk5JTkc6IFlvdSBhcmUgcnVubmluZyBhbiAnYWNjZXB0LWFsbCcgIgorCQkJIm5ldHdvcmsgb24gYSBCVFMgdGhhdCBpcyBub3QgYmFycmVkLiAgVGhpcyAiCisJCQkiY29uZmlndXJhdGlvbiBpcyBsaWtlbHkgdG8gaW50ZXJmZXJlIHdpdGggcHJvZHVjdGlvbiAiCisJCQkiR1NNIG5ldHdvcmtzIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGluIGEgUkYgIgorCQkJInNoaWVsZGVkIGVudmlyb25tZW50IHN1Y2ggYXMgYSBmYXJhZGF5IGNhZ2UhXG5cbiIpOworCisJLyogQ29udHJvbCBDaGFubmVsIERlc2NyaXB0aW9uICovCisJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmF0dCA9IDE7CisJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX3BhX21mcm1zID0gUlNMX0JTX1BBX01GUk1TXzU7CisJLyogVDMyMTIgaXMgc2V0IGZyb20gdnR5L2NvbmZpZyAqLworCisJLyogU2V0IGNjY2ggY29uZmlnIGJ5IGxvb2tpbmcgYXQgdHMgY29uZmlnICovCisJZm9yIChuPTAsIGk9MDsgaTw4OyBpKyspCisJCW4gKz0gYnRzLT5jMC0+dHNbaV0ucGNoYW4gPT0gR1NNX1BDSEFOX0NDQ0ggPyAxIDogMDsKKworCXN3aXRjaCAobikgeworCWNhc2UgMDoKKwkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZiA9IFJTTF9CQ0NIX0NDQ0hfQ09ORl8xX0M7CisJCWJyZWFrOworCWNhc2UgMToKKwkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZiA9IFJTTF9CQ0NIX0NDQ0hfQ09ORl8xX05DOworCQlicmVhazsKKwljYXNlIDI6CisJCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPSBSU0xfQkNDSF9DQ0NIX0NPTkZfMl9OQzsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuY2NjaF9jb25mID0gUlNMX0JDQ0hfQ0NDSF9DT05GXzNfTkM7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZiA9IFJTTF9CQ0NIX0NDQ0hfQ09ORl80X05DOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuc3VwcG9ydGVkIENDQ0ggdGltZXNsb3QgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHNvbWUgZGVmYXVsdHMgZm9yIG91ciBzeXN0ZW0gaW5mb3JtYXRpb24gKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnMucmFkaW9fbGlua190aW1lb3V0ID0gMjsgLyogMTIgKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnMuZHR4ID0gMjsgLyogTVMgc2hhbGwgbm90IHVzZSB1cHBsaW5rIERUWCAqLworCWJ0cy0+c2lfY29tbW9uLmNlbGxfb3B0aW9ucy5wd3JjID0gMDsgLyogUFdSQyBub3Qgc2V0ICovCisKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuYWNzID0gMDsKKworCWJ0cy0+c2lfY29tbW9uLm5jY19wZXJtaXR0ZWQgPSAweGZmOworCisJcGFnaW5nX2luaXQoYnRzKTsKKworCXJldHVybiAwOworfQorCitpbnQgYnNjX2Jvb3RzdHJhcF9uZXR3b3JrKGludCAoKm1uY2NfcmVjdikoc3RydWN0IGdzbV9uZXR3b3JrICosIGludCwgdm9pZCAqKSwKKwkJCSAgY29uc3QgY2hhciAqY29uZmlnX2ZpbGUpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgcmM7CisKKwkvKiBpbml0aWFsaXplIG91ciBkYXRhIHN0cnVjdHVyZXMgKi8KKwlic2NfZ3NtbmV0ID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBtbmNjX3JlY3YpOworCWlmICghYnNjX2dzbW5ldCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlic2NfZ3NtbmV0LT5uYW1lX2xvbmcgPSB0YWxsb2Nfc3RyZHVwKGJzY19nc21uZXQsICJPcGVuQlNDIik7CisJYnNjX2dzbW5ldC0+bmFtZV9zaG9ydCA9IHRhbGxvY19zdHJkdXAoYnNjX2dzbW5ldCwgIk9wZW5CU0MiKTsKKworCXRlbG5ldF9pbml0KGJzY19nc21uZXQsIDQyNDIpOworCXJjID0gdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uZmlnX2ZpbGUpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChETk0sIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gcGFyc2UgdGhlIGNvbmZpZyBmaWxlOiAnJXMnXG4iLCBjb25maWdfZmlsZSk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19OTSwgbm1fc2lnX2NiLCBOVUxMKTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJmJzY19nc21uZXQtPmJ0c19saXN0LCBsaXN0KSB7CisJCWJvb3RzdHJhcF9idHMoYnRzKTsKKwkJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkKKwkJCXJjID0gZTFfcmVjb25maWdfYnRzKGJ0cyk7CisKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQgKDEpOworCX0KKworCS8qIGluaXRpYWxpemUgbmFub0JUUyBzdXBwb3J0IG9tY2UgKi8KKwlyYyA9IGlwYWNjZXNzX3NldHVwKGJzY19nc21uZXQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfcmxsLmMgYi9vcGVuYnNjL3NyYy9ic2NfcmxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0ZjVhYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY19ybGwuYwpAQCAtMCwwICsxLDEyMiBAQAorLyogR1NNIEJTQyBSYWRpbyBMaW5rIExheWVyIEFQSQorICogM0dQUCBUUyAwOC41OCB2ZXJzaW9uIDguNi4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDU5NiBWOC42LjAgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19ybGwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorCitzdHJ1Y3QgYnNjX3JsbF9yZXEgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCBsaW5rX2lkOworCisJdm9pZCAoKmNiKShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwKKwkJICAgdm9pZCAqZGF0YSwgZW51bSBic2Nfcmxscl9pbmQpOworCXZvaWQgKmRhdGE7Cit9OworCisvKiB3ZSBvbmx5IGNvbXBhcmUgQzEsIEMyIGFuZCBTQVBJICovCisjZGVmaW5lIExJTktJRF9NQVNLCTB4QzcKKworc3RhdGljIExMSVNUX0hFQUQoYnNjX3JsbF9yZXFzKTsKKworc3RhdGljIHZvaWQgY29tcGxldGVfcmxscihzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIsIGVudW0gYnNjX3JsbHJfaW5kIHR5cGUpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gJnJsbHItPmxjaGFuLT5jb25uOworCWxsaXN0X2RlbCgmcmxsci0+bGlzdCk7CisJcHV0X3N1YnNjcl9jb24oY29ubik7CisJcmxsci0+Y2Iocmxsci0+bGNoYW4sIHJsbHItPmxpbmtfaWQsIHJsbHItPmRhdGEsIHR5cGUpOworCXRhbGxvY19mcmVlKHJsbHIpOworfQorCitzdGF0aWMgdm9pZCB0aW1lcl9jYih2b2lkICpfcmxscikKK3sKKwlzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIgPSBfcmxscjsKKworCWNvbXBsZXRlX3JsbHIocmxsciwgQlNDX1JMTFJfSU5EX1RJTUVPVVQpOworfQorCisvKiBlc3RhYmxpc2ggYSBSTEwgY29ubmVjdGlvbiB3aXRoIGdpdmVuIFNBUEkgLyBwcmlvcml0eSAqLworaW50IHJsbF9lc3RhYmxpc2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IHNhcGksCisJCSAgdm9pZCAoKmNiKShzdHJ1Y3QgZ3NtX2xjaGFuICosIHVfaW50OF90LCB2b2lkICosCisJCQkgICAgIGVudW0gYnNjX3JsbHJfaW5kKSwKKwkJICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBic2NfcmxsX3JlcSAqcmxsciA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGJzY19ybGxfcmVxKTsKKwl1X2ludDhfdCBsaW5rX2lkOworCWlmICghcmxscikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsaW5rX2lkID0gc2FwaTsKKworCS8qIElmIHdlIGFyZSBhIFRDSCBhbmQgbm90IGluIHNpZ25hbGxpbmcgbW9kZSwgd2UgbmVlZCB0bworCSAqIGluZGljYXRlIHRoYXQgdGhlIG5ldyBSTEwgY29ubmVjdGlvbiBpcyB0byBiZSBtYWRlIG9uIHRoZSBTQUNDSCAqLworCWlmICgobGNoYW4tPnR5cGUgPT0gR1NNX0xDSEFOX1RDSF9GIHx8CisJICAgICBsY2hhbi0+dHlwZSA9PSBHU01fTENIQU5fVENIX0gpICYmIHNhcGkgIT0gMCkKKwkJbGlua19pZCB8PSAweDQwOworCisJY29ubiA9ICZsY2hhbi0+Y29ubjsKKwl1c2Vfc3Vic2NyX2Nvbihjb25uKTsKKwlybGxyLT5sY2hhbiA9IGxjaGFuOworCXJsbHItPmxpbmtfaWQgPSBsaW5rX2lkOworCXJsbHItPmNiID0gY2I7CisJcmxsci0+ZGF0YSA9IGRhdGE7CisKKwlsbGlzdF9hZGQoJnJsbHItPmxpc3QsICZic2NfcmxsX3JlcXMpOworCisJcmxsci0+dGltZXIuY2IgPSAmdGltZXJfY2I7CisJcmxsci0+dGltZXIuZGF0YSA9IHJsbHI7CisKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnJsbHItPnRpbWVyLCAxMCwgMCk7CisKKwkvKiBzZW5kIHRoZSBSU0wgUkxMIEVTVGFibGlzaCBSRVF1ZXN0ICovCisJcmV0dXJuIHJzbF9lc3RhYmxpc2hfcmVxdWVzdChybGxyLT5sY2hhbiwgcmxsci0+bGlua19pZCk7Cit9CisKKy8qIENhbGxlZCBmcm9tIFJTTCBjb2RlIGluIGNhc2Ugd2UgaGF2ZSByZWNlaXZlZCBhbiBpbmRpY2F0aW9uIHJlZ2FyZGluZworICogYW55IFJMTCBsaW5rICovCit2b2lkIHJsbF9pbmRpY2F0aW9uKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkLCB1X2ludDhfdCB0eXBlKQoreworCXN0cnVjdCBic2NfcmxsX3JlcSAqcmxsciwgKnJsbHIyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShybGxyLCBybGxyMiwgJmJzY19ybGxfcmVxcywgbGlzdCkgeworCQlpZiAocmxsci0+bGNoYW4gPT0gbGNoYW4gJiYKKwkJICAgIChybGxyLT5saW5rX2lkICYgTElOS0lEX01BU0spID09IChsaW5rX2lkICYgTElOS0lEX01BU0spKSB7CisJCQlic2NfZGVsX3RpbWVyKCZybGxyLT50aW1lcik7CisJCQljb21wbGV0ZV9ybGxyKHJsbHIsIHR5cGUpOworCQkJcmV0dXJuOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnNjX3ZlcnNpb24uYyBiL29wZW5ic2Mvc3JjL2JzY192ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2NjE5NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY192ZXJzaW9uLmMKQEAgLTAsMCArMSwzMiBAQAorLyogSG9sZCB0aGUgY29weXJpZ2h0IGFuZCB2ZXJzaW9uIHN0cmluZyAqLworLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiYnNjY29uZmlnLmgiCisKK2NvbnN0IGNoYXIgKm9wZW5ic2NfdmVyc2lvbiA9ICJPcGVuQlNDICIgUEFDS0FHRV9WRVJTSU9OOworY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQgPQorCSJDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBIYXJhbGQgV2VsdGUsIEhvbGdlciBGcmV5dGhlclxuIgorCSJDb250cmlidXRpb25zIGJ5IERhbmllbCBXaWxsbWFubiwgSmFuIEzDvGJiZSxTdGVmYW4gU2NobWlkdFxuIgorCSJEaWV0ZXIgU3BhYXIsIEFuZHJlYXMgRXZlcnNiZXJnXG5cbiIKKwkiTGljZW5zZSBHUEx2Mis6IEdOVSBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyIDxodHRwOi8vZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbD5cbiIKKwkiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgYXJlIGZyZWUgdG8gY2hhbmdlIGFuZCByZWRpc3RyaWJ1dGUgaXQuXG4iCisJIlRoZXJlIGlzIE5PIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuXG4iOworCisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2J0c19pcGFjY2Vzc19uYW5vYnRzLmMgYi9vcGVuYnNjL3NyYy9idHNfaXBhY2Nlc3NfbmFub2J0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDhlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9idHNfaXBhY2Nlc3NfbmFub2J0cy5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGNvZGUgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2J0c19tb2RlbCBtb2RlbF9uYW5vYnRzID0geworCS50eXBlID0gR1NNX0JUU19UWVBFX05BTk9CVFMsCisJLm5tX2F0dF90bHZkZWYgPSB7CisJCS5kZWYgPSB7CisJCQkvKiBpcC5hY2Nlc3Mgc3BlY2lmaWNzICovCisJCQlbTk1fQVRUX0lQQUNDX0RTVF9JUF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorCQkJW05NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NUUkVBTV9JRF0gPQl7IFRMVl9UWVBFX1RWLCB9LAorCQkJW05NX0FUVF9JUEFDQ19GUkVRX0NUUkxdID0JeyBUTFZfVFlQRV9UViwgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorCQkJW05NX0FUVF9JUEFDQ19JUF9JRl9DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgOCB9LAorCQkJW05NX0FUVF9JUEFDQ19JUF9HV19DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgMTIgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSU5fU0VSVl9USU1FXSA9CXsgVExWX1RZUEVfRklYRUQsIDQgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTE9DQVRJT05dID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19QQUdJTkdfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfVU5JVF9JRF0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1VOSVRfTkFNRV0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NOTVBfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHX0xJU1RdID0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OVl9GTEFHU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0ZSRVFfQ1RSTF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0lQQUNDX1BSSU1fT01MX0ZCX1RPVVRdID0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfVElNSU5HX0JVU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0NHSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19SQUNdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfT0JKX1ZFUlNJT05dID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkddPSB7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX05TRUldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQlZDSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OU1ZDSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OU19DRkddID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNUXT0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19NT05JVF9WQUxfTElTVF0gPSB7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1RJQl9DT05UUk9MXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR18yXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSEVBUlRCX1RPVVRdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19VUFRJTUVdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR18zXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfU1NMX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NFQ19QT1NTSUJMRV0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0lNTF9TU0xfU1RBVEVdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19SRVZPQ19EQVRFXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJfSwKKwl9LAorfTsKKworaW50IGJ0c19tb2RlbF9uYW5vYnRzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZ3NtX2J0c19tb2RlbF9yZWdpc3RlcigmbW9kZWxfbmFub2J0cyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9idHNfc2llbWVuc19iczExLmMgYi9vcGVuYnNjL3NyYy9idHNfc2llbWVuc19iczExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2NjgyNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2J0c19zaWVtZW5zX2JzMTEuYwpAQCAtMCwwICsxLDY2IEBACisvKiBTaWVtZW5zIEJTLTExIHNwZWNpZmljIGNvZGUgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2J0c19tb2RlbCBtb2RlbF9iczExID0geworCS50eXBlID0gR1NNX0JUU19UWVBFX0JTMTEsCisJLm5tX2F0dF90bHZkZWYgPSB7CisJCS5kZWYgPSB7CisJCQlbTk1fQVRUX0FWQUlMX1NUQVRVU10gPQkJeyBUTFZfVFlQRV9UTFYgfSwKKwkJCS8qIEJTMTEgc3BlY2lmaWNzICovCisJCQlbTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OT10gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbMHhkNV0gPQkJCXsgVExWX1RZUEVfVExWIH0sCisJCQlbMHhhOF0gPQkJCXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUEFTU1dPUkRdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9UWFBXUl0gPQkJeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9SU1NJX09GRlNdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9MSU5FX0NGR10gPSAJeyBUTFZfVFlQRV9UViB9LAorCQkJW05NX0FUVF9CUzExX0wxX1BST1RfVFlQRV0gPQl7IFRMVl9UWVBFX1RWIH0sCisJCQlbTk1fQVRUX0JTMTFfQklUX0VSUl9USEVTSF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0JTMTFfRElWRVJTSVRZXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT05dPXsgVExWX1RZUEVfVExWIH0sCQorCQkJW05NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVl0gPXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRV0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0JUU19TVEFURV0JPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0UxX1NUQVRFXQk9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUExMX01PREVdCT0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9QTExdCT0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZXSA9CXsgVExWX1RZUEVfVFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9DQ0xLX1RZUEVdID0JeyBUTFZfVFlQRV9UViB9LAorCQkJWzB4OTVdID0JCQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCX0sCisJfSwKK307CisKK2ludCBidHNfbW9kZWxfYnMxMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoJm1vZGVsX2JzMTEpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnRzX3Vua25vd24uYyBiL29wZW5ic2Mvc3JjL2J0c191bmtub3duLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjNWQ5OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2J0c191bmtub3duLmMKQEAgLTAsMCArMSw0MCBAQAorLyogR2VuZXJpYyBCVFMgLSBWVFkgY29kZSB0cmllcyB0byBhbGxvY2F0ZSB0aGlzIEJUUyBiZWZvcmUgdHlwZSBpcyBrbm93biAqLworCisvKiAoQykgMjAxMCBieSBEYW5pZWwgV2lsbG1hbm4gPGRhbmllbEB0b3RhbHVlYmVyd2FjaHVuZy5kZT4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgbW9kZWxfdW5rbm93biA9IHsKKwkudHlwZSA9IEdTTV9CVFNfVFlQRV9VTktOT1dOLAorCS5ubV9hdHRfdGx2ZGVmID0geworCQkuZGVmID0geworCQl9LAorCX0sCit9OworCitpbnQgYnRzX21vZGVsX3Vua25vd25faW5pdCh2b2lkKQoreworCXJldHVybiBnc21fYnRzX21vZGVsX3JlZ2lzdGVyKCZtb2RlbF91bmtub3duKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2NoYW5fYWxsb2MuYyBiL29wZW5ic2Mvc3JjL2NoYW5fYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDdhYmRjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvY2hhbl9hbGxvYy5jCkBAIC0wLDAgKzEsNDU4IEBACisvKiBHU00gQ2hhbm5lbCBhbGxvY2F0aW9uIHJvdXRpbmVzCisgKgorICogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisKK3N0YXRpYyB2b2lkIGF1dG9fcmVsZWFzZV9jaGFubmVsKHZvaWQgKl9sY2hhbik7CisKK3N0YXRpYyBpbnQgdHNfaXNfdXNhYmxlKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJLyogRklYTUU6IEhvdyBkb2VzIHRoaXMgYmVoYXZlIGZvciBCUy0xMSA/ICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyh0cy0+dHJ4LT5idHMpKSB7CisJCWlmICghbm1faXNfcnVubmluZygmdHMtPm5tX3N0YXRlKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgdHJ4X2lzX3VzYWJsZShzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwkvKiBGSVhNRTogSG93IGRvZXMgdGhpcyBiZWhhdmUgZm9yIEJTLTExID8gKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKHRyeC0+YnRzKSkgeworCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRyeC0+bm1fc3RhdGUpIHx8CisJCSAgICAhbm1faXNfcnVubmluZygmdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGUpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBnc21fYnRzX3RyeF90cyAqdHNfYzBfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQkgICBlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gYnRzLT5jMDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNbMF07CisKKwlpZiAocGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0ggJiYKKwkgICAgcGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX05PTkUpCisJCXJldHVybiBOVUxMOworCisJdHMtPnBjaGFuID0gcGNoYW47CisKKwlyZXR1cm4gdHM7Cit9CisKKy8qIEFsbG9jYXRlIGEgcGh5c2ljYWwgY2hhbm5lbCAoVFMpICovCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlpbnQgajsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJaW50IGZyb20sIHRvOworCisJCWlmICghdHJ4X2lzX3VzYWJsZSh0cngpKQorCQkJY29udGludWU7CisKKwkJLyogdGhlIGZvbGxvd2luZyBjb25zdHJhaW50cyBhcmUgcHVyZSBwb2xpY3ksCisJCSAqIG5vIHJlcXVpcmVtZW50IHRvIHB1dCB0aGlzIHJlc3RyaWN0aW9uIGluIHBsYWNlICovCisJCWlmICh0cnggPT0gYnRzLT5jMCkgeworCQkJLyogT24gdGhlIGZpcnN0IFRSWCB3ZSBydW4gb25lIENDQ0ggYW5kIG9uZSBTRENDSDggKi8KKwkJCXN3aXRjaCAocGNoYW4pIHsKKwkJCWNhc2UgR1NNX1BDSEFOX0NDQ0g6CisJCQljYXNlIEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINDoKKwkJCQlmcm9tID0gMDsgdG8gPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJCQljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJCQlmcm9tID0gMTsgdG8gPSA3OworCQkJCWJyZWFrOworCQkJY2FzZSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM6CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogRXZlcnkgc2Vjb25kYXJ5IFRSWCBpcyBjb25maWd1cmVkIGZvciBUQ0gvRgorCQkJICogYW5kIFRDSC9IIG9ubHkgKi8KKwkJCXN3aXRjaCAocGNoYW4pIHsKKwkJCWNhc2UgR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOgorCQkJCWZyb20gPSAxOyB0byA9IDE7CisJCQljYXNlIEdTTV9QQ0hBTl9UQ0hfRjoKKwkJCWNhc2UgR1NNX1BDSEFOX1RDSF9IOgorCQkJCWZyb20gPSAxOyB0byA9IDc7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKwkJZm9yIChqID0gZnJvbTsgaiA8PSB0bzsgaisrKSB7CisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNbal07CisKKwkJCWlmICghdHNfaXNfdXNhYmxlKHRzKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHRzLT5wY2hhbiA9PSBHU01fUENIQU5fTk9ORSkgeworCQkJCXRzLT5wY2hhbiA9IHBjaGFuOworCQkJCS8qIHNldCBjaGFubmVsIGF0dHJpYnV0ZSBvbiBPTUwgKi8KKwkJCQlhYmlzX25tX3NldF9jaGFubmVsX2F0dHIodHMsIGFiaXNfbm1fY2hjb21iNHBjaGFuKHBjaGFuKSk7CisJCQkJcmV0dXJuIHRzOworCQkJfQorCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBGcmVlIGEgcGh5c2ljYWwgY2hhbm5lbCAoVFMpICovCit2b2lkIHRzX2ZyZWUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwl0cy0+cGNoYW4gPSBHU01fUENIQU5fTk9ORTsKK30KKworc3RhdGljIGNvbnN0IHVfaW50OF90IHN1YnNsb3RzX3Blcl9wY2hhbltdID0geworCVtHU01fUENIQU5fTk9ORV0gPSAwLAorCVtHU01fUENIQU5fQ0NDSF0gPSAwLAorCVtHU01fUENIQU5fQ0NDSF9TRENDSDRdID0gNCwKKwlbR1NNX1BDSEFOX1RDSF9GXSA9IDEsCisJW0dTTV9QQ0hBTl9UQ0hfSF0gPSAyLAorCVtHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOENdID0gOCwKKwkvKiBGSVhNRTogd2hhdCBhYm91dCBkeW5hbWljIFRDSF9GX1RDSF9IID8gKi8KKwlbR1NNX1BDSEFOX1RDSF9GX1BEQ0hdID0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2xjaGFuICoKK19sY19maW5kX3RyeChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCWludCBqLCBzczsKKworCWlmICghdHJ4X2lzX3VzYWJsZSh0cngpKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJdHMgPSAmdHJ4LT50c1tqXTsKKwkJaWYgKCF0c19pc191c2FibGUodHMpKQorCQkJY29udGludWU7CisJCS8qIGlwLmFjY2VzcyBkeW5hbWljIFRDSC9GICsgUERDSCBjb21iaW5hdGlvbiAqLworCQlpZiAodHMtPnBjaGFuID09IEdTTV9QQ0hBTl9UQ0hfRl9QRENIICYmCisJCSAgICBwY2hhbiA9PSBHU01fUENIQU5fVENIX0YpIHsKKwkJCS8qIHdlIGNhbiBvbmx5IGNvbnNpZGVyIHN1Y2ggYSBkeW5hbWljIGNoYW5uZWwKKwkJCSAqIGlmIHRoZSBQRENIIGlzIGN1cnJlbnRseSBpbmFjdGl2ZSAqLworCQkJaWYgKHRzLT5mbGFncyAmIFRTX0ZfUERDSF9NT0RFKQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHRzLT5wY2hhbiAhPSBwY2hhbikKKwkJCWNvbnRpbnVlOworCQkvKiBjaGVjayBpZiBhbGwgc3ViLXNsb3RzIGFyZSBhbGxvY2F0ZWQgeWV0ICovCisJCWZvciAoc3MgPSAwOyBzcyA8IHN1YnNsb3RzX3Blcl9wY2hhbltwY2hhbl07IHNzKyspIHsKKwkJCXN0cnVjdCBnc21fbGNoYW4gKmxjID0gJnRzLT5sY2hhbltzc107CisJCQlpZiAobGMtPnR5cGUgPT0gR1NNX0xDSEFOX05PTkUgJiYKKwkJCSAgICBsYy0+c3RhdGUgPT0gTENIQU5fU19OT05FKQorCQkJCXJldHVybiBsYzsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGdzbV9sY2hhbiAqCitfbGNfZmluZF9idHMoc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCXN0cnVjdCBnc21fbGNoYW4gKmxjOworCisJaWYgKGJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlKSB7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQkJbGMgPSBfbGNfZmluZF90cngodHJ4LCBwY2hhbik7CisJCQlpZiAobGMpCisJCQkJcmV0dXJuIGxjOworCQl9CisJfSBlbHNlIHsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQkJbGMgPSBfbGNfZmluZF90cngodHJ4LCBwY2hhbik7CisJCQlpZiAobGMpCisJCQkJcmV0dXJuIGxjOworCQl9CisJfQorCisJLyogd2UgY2Fubm90IGFsbG9jYXRlIG1vcmUgb2YgdGhlc2UgKi8KKwlpZiAocGNoYW4gPT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGlmIHdlJ3ZlIHJlYWNoZWQgaGVyZSwgd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBwaHlzaWNhbAorCSAqIGNoYW5uZWwgZm9yIHRoZSBsb2dpY2FsIGNoYW5uZWwgdHlwZSByZXF1ZXN0ZWQgKi8KKwl0cyA9IHRzX2FsbG9jKGJ0cywgcGNoYW4pOworCWlmICghdHMpIHsKKwkJLyogbm8gbW9yZSByYWRpbyByZXNvdXJjZXMgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAmdHMtPmxjaGFuWzBdOworfQorCisvKiBBbGxvY2F0ZSBhIGxvZ2ljYWwgY2hhbm5lbCAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBnc21fY2hhbl90IHR5cGUpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBOVUxMOworCWVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgZmlyc3QsIHNlY29uZDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR1NNX0xDSEFOX1NEQ0NIOgorCQlpZiAoYnRzLT5jaGFuX2FsbG9jX3JldmVyc2UpIHsKKwkJCWZpcnN0ID0gR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOworCQkJc2Vjb25kID0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0OworCQl9IGVsc2UgeworCQkJZmlyc3QgPSBHU01fUENIQU5fQ0NDSF9TRENDSDQ7CisJCQlzZWNvbmQgPSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM7CisJCX0KKworCQlsY2hhbiA9IF9sY19maW5kX2J0cyhidHMsIGZpcnN0KTsKKwkJaWYgKGxjaGFuID09IE5VTEwpCisJCQlsY2hhbiA9IF9sY19maW5kX2J0cyhidHMsIHNlY29uZCk7CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQlsY2hhbiA9IF9sY19maW5kX2J0cyhidHMsIEdTTV9QQ0hBTl9UQ0hfRik7CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQlsY2hhbiA9X2xjX2ZpbmRfYnRzKGJ0cywgR1NNX1BDSEFOX1RDSF9IKTsKKwkJLyogSWYgd2UgZG9uJ3QgaGF2ZSBUQ0gvSCBhdmFpbGFibGUsIGZhbGwtYmFjayB0byBUQ0gvRiAqLworCQlpZiAoIWxjaGFuKSB7CisJCQlsY2hhbiA9IF9sY19maW5kX2J0cyhidHMsIEdTTV9QQ0hBTl9UQ0hfRik7CisJCQl0eXBlID0gR1NNX0xDSEFOX1RDSF9GOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJMTCwgTE9HTF9FUlJPUiwgIlVua25vd24gZ3NtX2NoYW5fdCAldVxuIiwgdHlwZSk7CisJfQorCisJaWYgKGxjaGFuKSB7CisJCWxjaGFuLT50eXBlID0gdHlwZTsKKworCQkvKiBjbGVhciBzYXBpcyAqLworCQltZW1zZXQobGNoYW4tPnNhcGlzLCAwLCBBUlJBWV9TSVpFKGxjaGFuLT5zYXBpcykpOworCisJCS8qIGNsZWFyIG11bHRpIHJhdGUgY29uZmlnICovCisJCW1lbXNldCgmbGNoYW4tPm1yX2NvbmYsIDAsIHNpemVvZihsY2hhbi0+bXJfY29uZikpOworCisJCS8qIGNsZWFyIHBlciBNU0MvQlNDIGRhdGEgKi8KKwkJbWVtc2V0KCZsY2hhbi0+Y29ubiwgMCwgc2l6ZW9mKGxjaGFuLT5jb25uKSk7CisKKwkJLyogQ29uZmlndXJlIHRoZSB0aW1lIGFuZCBzdGFydCBpdCBzbyBpdCB3aWxsIGJlIGNsb3NlZCAqLworCQlsY2hhbi0+Y29ubi5sY2hhbiA9IGxjaGFuOworCQlsY2hhbi0+Y29ubi5idHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCQlsY2hhbi0+Y29ubi5yZWxlYXNlX3RpbWVyLmNiID0gYXV0b19yZWxlYXNlX2NoYW5uZWw7CisJCWxjaGFuLT5jb25uLnJlbGVhc2VfdGltZXIuZGF0YSA9IGxjaGFuOworCQlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5jb25uLnJlbGVhc2VfdGltZXIsIExDSEFOX1JFTEVBU0VfVElNRU9VVCk7CisKKwl9IGVsc2UgeworCQlzdHJ1Y3QgY2hhbGxvY19zaWduYWxfZGF0YSBzaWc7CisJCXNpZy5idHMgPSBidHM7CisJCXNpZy50eXBlID0gdHlwZTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX0NIQUxMT0MsIFNfQ0hBTExPQ19BTExPQ19GQUlMLCAmc2lnKTsKKwl9CisKKwlyZXR1cm4gbGNoYW47Cit9CisKKy8qIEZyZWUgYSBsb2dpY2FsIGNoYW5uZWwgKi8KK3ZvaWQgbGNoYW5fZnJlZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgY2hhbGxvY19zaWduYWxfZGF0YSBzaWc7CisJaW50IGk7CisKKwlzaWcudHlwZSA9IGxjaGFuLT50eXBlOworCWxjaGFuLT50eXBlID0gR1NNX0xDSEFOX05PTkU7CisJaWYgKGxjaGFuLT5jb25uLnN1YnNjcikgeworCQlzdWJzY3JfcHV0KGxjaGFuLT5jb25uLnN1YnNjcik7CisJCWxjaGFuLT5jb25uLnN1YnNjciA9IE5VTEw7CisJfQorCisJLyogV2UgbWlnaHQga2lsbCBhbiBhY3RpdmUgY2hhbm5lbC4uLiAqLworCWlmIChsY2hhbi0+Y29ubi51c2VfY291bnQgIT0gMCkgeworCQlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fVU5FWFBFQ1RFRF9SRUxFQVNFLCBsY2hhbik7CisJCWxjaGFuLT5jb25uLnVzZV9jb3VudCA9IDA7CisJfQorCisJLyogc3RvcCB0aGUgdGltZXIgKi8KKwlic2NfZGVsX3RpbWVyKCZsY2hhbi0+Y29ubi5yZWxlYXNlX3RpbWVyKTsKKwlic2NfZGVsX3RpbWVyKCZsY2hhbi0+VDMxMDEpOworCisJLyogY2xlYXIgY2FjaGVkIG1lYXN1ZW1lbnQgcmVwb3J0cyAqLworCWxjaGFuLT5tZWFzX3JlcF9pZHggPSAwOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCk7IGkrKykgeworCQlsY2hhbi0+bWVhc19yZXBbaV0uZmxhZ3MgPSAwOworCQlsY2hhbi0+bWVhc19yZXBbaV0ubnIgPSAwOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsY2hhbi0+bmVpZ2hfbWVhcyk7IGkrKykKKwkJbGNoYW4tPm5laWdoX21lYXNbaV0uYXJmY24gPSAwOworCisJbGNoYW4tPmNvbm4uc2lsZW50X2NhbGwgPSAwOworCisJc2lnLmxjaGFuID0gbGNoYW47CisJc2lnLmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJZGlzcGF0Y2hfc2lnbmFsKFNTX0NIQUxMT0MsIFNfQ0hBTExPQ19GUkVFRCwgJnNpZyk7CisKKwkvKiBGSVhNRTogdHNfZnJlZSgpIHRoZSB0aW1lc2xvdCwgaWYgd2UncmUgdGhlIGxhc3QgbG9naWNhbAorCSAqIGNoYW5uZWwgdXNpbmcgaXQgKi8KK30KKworLyoKKyAqIFRoZXJlIHdhcyBhbiBlcnJvciB3aXRoIHRoZSBUUlggYW5kIHdlIG5lZWQgdG8gZm9yZ2V0CisgKiBhbnkgc3RhdGUgc28gdGhhdCBhIGxjaGFuIGNhbiBiZSBhbGxvY2F0ZWQgYWdhaW4gYWZ0ZXIKKyAqIHRoZSB0cnggaXMgZnVsbHkgdXNhYmxlLgorICovCit2b2lkIGxjaGFuX3Jlc2V0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCWJzY19kZWxfdGltZXIoJmxjaGFuLT5UMzEwMSk7CisKKwlsY2hhbi0+dHlwZSA9IEdTTV9MQ0hBTl9OT05FOworCWxjaGFuLT5zdGF0ZSA9IExDSEFOX1NfTk9ORTsKK30KKworCisvKiBDb25zaWRlciByZWxlYXNpbmcgdGhlIGNoYW5uZWwgbm93ICovCitpbnQgbGNoYW5fYXV0b19yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCWlmIChsY2hhbi0+Y29ubi51c2VfY291bnQgPiAwKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIEFzc3VtZSB3ZSBoYXZlIEdTTTA0LjA4IHJ1bm5pbmcgYW5kIHNlbmQgYSByZWxlYXNlICovCisJaWYgKGxjaGFuLT5jb25uLnN1YnNjcikgeworCQlnc200OF9zZW5kX3JyX3JlbGVhc2UobGNoYW4pOworCX0KKworCS8qIHNwb29mZWQ/IG1lc3NhZ2UgKi8KKwlpZiAobGNoYW4tPmNvbm4udXNlX2NvdW50IDwgMCkKKwkJTE9HUChEUkxMLCBMT0dMX0VSUk9SLCAiQ2hhbm5lbCBjb3VudCBpcyBuZWdhdGl2ZTogJWRcbiIsCisJCQlsY2hhbi0+Y29ubi51c2VfY291bnQpOworCisJREVCVUdQKERSTEwsICIlcyBSZWN5Y2xpbmcgQ2hhbm5lbFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pKTsKKwlyc2xfbGNoYW5fc2V0X3N0YXRlKGxjaGFuLCBMQ0hBTl9TX1JFTF9SRVEpOworCXJzbF9yZWxlYXNlX3JlcXVlc3QobGNoYW4sIDApOworCXJldHVybiAxOworfQorCisvKiBBdXRvIHJlbGVhc2UgdGhlIGNoYW5uZWwgd2hlbiB0aGUgdXNlIGNvdW50IGlzIHplcm8gKi8KK3N0YXRpYyB2b2lkIGF1dG9fcmVsZWFzZV9jaGFubmVsKHZvaWQgKl9sY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IF9sY2hhbjsKKworCWlmICghbGNoYW5fYXV0b19yZWxlYXNlKGxjaGFuKSkKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+Y29ubi5yZWxlYXNlX3RpbWVyLCBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQpOworfQorCitzdHJ1Y3QgZ3NtX2xjaGFuKiBsY2hhbl9maW5kKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKSB7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJaW50IHRzX25vLCBsY2hhbl9ubzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJZm9yICh0c19ubyA9IDA7IHRzX25vIDwgODsgKyt0c19ubykgeworCQkJZm9yIChsY2hhbl9ubyA9IDA7IGxjaGFuX25vIDwgVFNfTUFYX0xDSEFOOyArK2xjaGFuX25vKSB7CisJCQkJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPQorCQkJCQkmdHJ4LT50c1t0c19ub10ubGNoYW5bbGNoYW5fbm9dOworCQkJCWlmIChzdWJzY3IgPT0gbGNoYW4tPmNvbm4uc3Vic2NyKQorCQkJCQlyZXR1cm4gbGNoYW47CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gc3Vic2NyLT5uZXQ7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZuZXQtPmJ0c19saXN0LCBsaXN0KSB7CisJCWxjaGFuID0gbGNoYW5fZmluZChidHMsIHN1YnNjcik7CisJCWlmIChsY2hhbikKKwkJCXJldHVybiBsY2hhbjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBidHNfY2hhbl9sb2FkKHN0cnVjdCBwY2hhbl9sb2FkICpjbCwgY29uc3Qgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJaW50IGk7CisKKwkJLyogc2tpcCBhZG1pbmlzdHJhdGl2ZWx5IGRlYWN0aXZhdGVkIHRyYW54c2NlaXZlcnMgKi8KKwkJaWYgKCFubV9pc19ydW5uaW5nKCZ0cngtPm5tX3N0YXRlKSB8fAorCQkgICAgIW5tX2lzX3J1bm5pbmcoJnRyeC0+YmJfdHJhbnNjLm5tX3N0YXRlKSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRyeC0+dHMpOyBpKyspIHsKKwkJCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSAmdHJ4LT50c1tpXTsKKwkJCXN0cnVjdCBsb2FkX2NvdW50ZXIgKnBsID0gJmNsLT5wY2hhblt0cy0+cGNoYW5dOworCQkJaW50IGo7CisKKwkJCS8qIHNraXAgYWRtaW5pc3RyYXRpdmVseSBkZWFjdGl2YXRlZCB0aW1lc2xvdHMgKi8KKwkJCWlmICghbm1faXNfcnVubmluZygmdHMtPm5tX3N0YXRlKSkKKwkJCQljb250aW51ZTsKKworCQkJZm9yIChqID0gMDsgaiA8IHN1YnNsb3RzX3Blcl9wY2hhblt0cy0+cGNoYW5dOyBqKyspIHsKKwkJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9ICZ0cy0+bGNoYW5bal07CisKKwkJCQlwbC0+dG90YWwrKzsKKworCQkJCXN3aXRjaCAobGNoYW4tPnN0YXRlKSB7CisJCQkJY2FzZSBMQ0hBTl9TX05PTkU6CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXBsLT51c2VkKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBuZXR3b3JrX2NoYW5fbG9hZChzdHJ1Y3QgcGNoYW5fbG9hZCAqcGwsIHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwltZW1zZXQocGwsIDAsIHNpemVvZigqcGwpKTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJm5ldC0+YnRzX2xpc3QsIGxpc3QpCisJCWJ0c19jaGFuX2xvYWQocGwsIGJ0cyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9kYi5jIGIvb3BlbmJzYy9zcmMvZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2E3ODYzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZGIuYwpAQCAtMCwwICsxLDEyMzEgQEAKKy8qIFNpbXBsZSBITFIvVkxSIGRhdGFiYXNlIGJhY2tlbmQgdXNpbmcgZGJpICovCisvKiAoQykgMjAwOCBieSBKYW4gTHVlYmJlIDxqbHVlYmJlQGRlYmlhbi5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxkYmkvZGJpLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3N0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorCitzdGF0aWMgY2hhciAqZGJfYmFzZW5hbWUgPSBOVUxMOworc3RhdGljIGNoYXIgKmRiX2Rpcm5hbWUgPSBOVUxMOworc3RhdGljIGRiaV9jb25uIGNvbm47CisKK3N0YXRpYyBjaGFyICpjcmVhdGVfc3RtdHNbXSA9IHsKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgTWV0YSAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJrZXkgVEVYVCBVTklRVUUgTk9UIE5VTEwsICIKKwkJInZhbHVlIFRFWFQgTk9UIE5VTEwiCisJCSIpIiwKKwkiSU5TRVJUIE9SIElHTk9SRSBJTlRPIE1ldGEgIgorCQkiKGtleSwgdmFsdWUpICIKKwkJIlZBTFVFUyAiCisJCSIoJ3JldmlzaW9uJywgJzInKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFN1YnNjcmliZXIgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInVwZGF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJpbXNpIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJuYW1lIFRFWFQsICIKKwkJImV4dGVuc2lvbiBURVhUIFVOSVFVRSwgIgorCQkiYXV0aG9yaXplZCBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwgIgorCQkidG1zaSBURVhUIFVOSVFVRSwgIgorCQkibGFjIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEF1dGhUb2tlbiAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJzdWJzY3JpYmVyX2lkIElOVEVHRVIgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidG9rZW4gVEVYVCBVTklRVUUgTk9UIE5VTEwiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgRXF1aXBtZW50ICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1cGRhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhULCAiCisJCSJjbGFzc21hcmsxIE5VTUVSSUMsICIKKwkJImNsYXNzbWFyazIgQkxPQiwgIgorCQkiY2xhc3NtYXJrMyBCTE9CLCAiCisJCSJpbWVpIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEVxdWlwbWVudFdhdGNoICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1cGRhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkic3Vic2NyaWJlcl9pZCBOVU1FUklDIE5PVCBOVUxMLCAiCisJCSJlcXVpcG1lbnRfaWQgTlVNRVJJQyBOT1QgTlVMTCwgIgorCQkiVU5JUVVFIChzdWJzY3JpYmVyX2lkLCBlcXVpcG1lbnRfaWQpICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBTTVMgKCIKKwkJLyogbWV0YWRhdGEsIG5vdCBwYXJ0IG9mIHNtcyAqLworCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkic2VudCBUSU1FU1RBTVAsICIKKwkJInNlbmRlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJyZWNlaXZlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJkZWxpdmVyX2F0dGVtcHRzIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLCAiCisJCS8qIGRhdGEgZGlyZWN0bHkgY29waWVkL2Rlcml2ZWQgZnJvbSBTTVMgKi8KKwkJInZhbGlkX3VudGlsIFRJTUVTVEFNUCwgIgorCQkicmVwbHlfcGF0aF9yZXEgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkic3RhdHVzX3JlcF9yZXEgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkicHJvdG9jb2xfaWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiZGF0YV9jb2Rpbmdfc2NoZW1lIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInVkX2hkcl9pbmQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiZGVzdF9hZGRyIFRFWFQsICIKKwkJInVzZXJfZGF0YSBCTE9CLCAiCS8qIFRQLVVEICovCisJCS8qIGFkZGl0aW9uYWwgZGF0YSwgaW50ZXJwcmV0ZWQgZnJvbSBTTVMgKi8KKwkJImhlYWRlciBCTE9CLCAiCQkvKiBVRCBIZWFkZXIgKi8KKwkJInRleHQgVEVYVCAiCQkvKiBkZWNvZGVkIFVEIGFmdGVyIFVESCAqLworCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFZMUiAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidXBkYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInN1YnNjcmliZXJfaWQgTlVNRVJJQyBVTklRVUUgTk9UIE5VTEwsICIKKwkJImxhc3RfYnRzIE5VTUVSSUMgTk9UIE5VTEwgIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEFwZHVCbG9icyAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkiYXBkdV9pZF9mbGFncyBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJzdWJzY3JpYmVyX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImFwZHUgQkxPQiAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQ291bnRlcnMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkidGltZXN0YW1wIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidmFsdWUgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhUIE5PVCBOVUxMICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBSYXRlQ291bnRlcnMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkidGltZXN0YW1wIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidmFsdWUgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhUIE5PVCBOVUxMLCAiCisJCSJpbmRleCBJTlRFR0VSIE5PVCBOVUxMICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBdXRoS2V5cyAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJzdWJzY3JpYmVyX2lkIElOVEVHRVIgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJhbGdvcml0aG1faWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiYTNhOF9raSBCTE9CICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBdXRoVHVwbGVzICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJInN1YnNjcmliZXJfaWQgTlVNRVJJQyBVTklRVUUgTk9UIE5VTEwsICIKKwkJImlzc3VlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInVzZV9jb3VudCBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwgIgorCQkia2V5X3NlcSBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJyYW5kIEJMT0IgTk9UIE5VTEwsICIKKwkJInNyZXMgQkxPQiBOT1QgTlVMTCwgIgorCQkia2MgQkxPQiBOT1QgTlVMTCAiCisJCSIpIiwKK307CisKK3ZvaWQgZGJfZXJyb3JfZnVuYyhkYmlfY29ubiBjb25uLCB2b2lkICpkYXRhKQoreworCWNvbnN0IGNoYXIgKm1zZzsKKwlkYmlfY29ubl9lcnJvcihjb25uLCAmbXNnKTsKKwlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkRCSTogJXNcbiIsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZGJfcmV2aXNpb24odm9pZCkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljb25zdCBjaGFyICpyZXY7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeShjb25uLAorCQkJCSJTRUxFQ1QgdmFsdWUgRlJPTSBNZXRhIFdIRVJFIGtleT0ncmV2aXNpb24nIik7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXYgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAidmFsdWUiKTsKKwlpZiAoIXJldiB8fCBhdG9pKHJldikgIT0gMikgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9pbml0KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJZGJpX2luaXRpYWxpemUoTlVMTCk7CisKKwljb25uID0gZGJpX2Nvbm5fbmV3KCJzcWxpdGUzIik7CisJaWYgKGNvbm4gPT0gTlVMTCkgeworCQlMT0dQKEREQiwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byBjcmVhdGUgY29ubmVjdGlvbi5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkYmlfY29ubl9lcnJvcl9oYW5kbGVyKCBjb25uLCBkYl9lcnJvcl9mdW5jLCBOVUxMICk7CisKKwkvKiBNeVNRTAorCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImhvc3QiLCAibG9jYWxob3N0Iik7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAidXNlcm5hbWUiLCAieW91cl9uYW1lIik7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAicGFzc3dvcmQiLCAieW91cl9wYXNzd29yZCIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImRibmFtZSIsICJ5b3VyX2RibmFtZSIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImVuY29kaW5nIiwgIlVURi04Iik7CisJKi8KKworCS8qIFNxTGl0ZSAzICovCisJZGJfYmFzZW5hbWUgPSBzdHJkdXAobmFtZSk7CisJZGJfZGlybmFtZSA9IHN0cmR1cChuYW1lKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJzcWxpdGUzX2RiZGlyIiwgZGlybmFtZShkYl9kaXJuYW1lKSk7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAiZGJuYW1lIiwgYmFzZW5hbWUoZGJfYmFzZW5hbWUpKTsKKworCWlmIChkYmlfY29ubl9jb25uZWN0KGNvbm4pIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJZnJlZShkYl9kaXJuYW1lKTsKKwlmcmVlKGRiX2Jhc2VuYW1lKTsKKwlkYl9kaXJuYW1lID0gZGJfYmFzZW5hbWUgPSBOVUxMOworCXJldHVybiAtMTsKK30KKworCitpbnQgZGJfcHJlcGFyZSgpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcmVhdGVfc3RtdHMpOyBpKyspIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnkoY29ubiwgY3JlYXRlX3N0bXRzW2ldKTsKKwkJaWYgKCFyZXN1bHQpIHsKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLAorCQkJICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBzb21lIHRhYmxlLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisKKwlpZiAoY2hlY2tfZGJfcmV2aXNpb24oKSA8IDApIHsKKwkJTE9HUChEREIsIExPR0xfRkFUQUwsICJEYXRhYmFzZSBzY2hlbWEgcmV2aXNpb24gaW52YWxpZCwgIgorCQkJInBsZWFzZSB1cGRhdGUgeW91ciBkYXRhYmFzZSBzY2hlbWFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRiX2ZpbmkoKQoreworCWRiaV9jb25uX2Nsb3NlKGNvbm4pOworCWRiaV9zaHV0ZG93bigpOworCisJaWYgKGRiX2Rpcm5hbWUpCisJICAgIGZyZWUoZGJfZGlybmFtZSk7CisJaWYgKGRiX2Jhc2VuYW1lKQorCSAgICBmcmVlKGRiX2Jhc2VuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpkYl9jcmVhdGVfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgY2hhciAqaW1zaSkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCS8qIElzIHRoaXMgc3Vic2NyaWJlciBrbm93biBpbiB0aGUgZGI/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+aWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRiX2FwZHVfYmxvYl9zdG9yZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCXVfaW50OF90IGFwZHVfaWRfZmxhZ3MsIHVfaW50OF90IGxlbiwKKwkJCXVfaW50OF90ICphcGR1KQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgKnFfYXBkdTsKKworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sIGFwZHUsIGxlbiwgJnFfYXBkdSk7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIEFwZHVCbG9icyAiCisJCSIoY3JlYXRlZCxzdWJzY3JpYmVyX2lkLGFwZHVfaWRfZmxhZ3MsYXBkdSkgVkFMVUVTICIKKwkJIihkYXRldGltZSgnbm93JyksJWxsdSwldSwlcykiLAorCQlzdWJzY3ItPmlkLCBhcGR1X2lkX2ZsYWdzLCBxX2FwZHUpOworCisJZnJlZShxX2FwZHUpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdG9yZV9jb3VudGVyKHN0cnVjdCBjb3VudGVyICpjdHIpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY2hhciAqcV9uYW1lOworCisJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgY3RyLT5uYW1lLCAmcV9uYW1lKTsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIElOVE8gQ291bnRlcnMgIgorCQkiKHRpbWVzdGFtcCxuYW1lLHZhbHVlKSBWQUxVRVMgIgorCQkiKGRhdGV0aW1lKCdub3cnKSwlcywlbHUpIiwgcV9uYW1lLCBjdHItPnZhbHVlKTsKKworCWZyZWUocV9uYW1lKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRiX3N0b3JlX3JhdGVfY3RyKHN0cnVjdCByYXRlX2N0cl9ncm91cCAqY3RyZywgdW5zaWduZWQgaW50IG51bSwKKwkJCSAgICAgY2hhciAqcV9wcmVmaXgpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY2hhciAqcV9uYW1lOworCisJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgY3RyZy0+ZGVzYy0+Y3RyX2Rlc2NbbnVtXS5uYW1lLAorCQkJCSAgICZxX25hbWUpOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJbnNlcnQgSU5UTyBSYXRlQ291bnRlcnMgIgorCQkiKHRpbWVzdGFtcCxuYW1lLGluZGV4LHZhbHVlKSBWQUxVRVMgIgorCQkiKGRhdGV0aW1lKCdub3cnKSwlcy4lcywldSwlIlBSSXU2NCIpIiwKKwkJcV9wcmVmaXgsIHFfbmFtZSwgY3RyZy0+aWR4LCBjdHJnLT5jdHJbbnVtXS5jdXJyZW50KTsKKworCWZyZWUocV9uYW1lKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfc3RvcmVfcmF0ZV9jdHJfZ3JvdXAoc3RydWN0IHJhdGVfY3RyX2dyb3VwICpjdHJnKQoreworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKnFfcHJlZml4OworCisJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgY3RyZy0+ZGVzYy0+Z3JvdXBfbmFtZV9wcmVmaXgsICZxX3ByZWZpeCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3RyZy0+ZGVzYy0+bnVtX2N0cjsgaSsrKQorCQlkYl9zdG9yZV9yYXRlX2N0cihjdHJnLCBpLCBxX3ByZWZpeCk7CisKKwlmcmVlKHFfcHJlZml4KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZGVidWcuYyBiL29wZW5ic2Mvc3JjL2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxOGY2NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2RlYnVnLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qIE9wZW5CU0MgRGVidWdnaW5nL0xvZ2dpbmcgc3VwcG9ydCBjb2RlICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworLyogZGVmYXVsdCBjYXRlZ29yaWVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGxvZ19pbmZvX2NhdCBkZWZhdWx0X2NhdGVnb3JpZXNbXSA9IHsKKwlbRFJMTF0gPSB7CisJCS5uYW1lID0gIkRSTEwiLAorCQkuZGVzY3JpcHRpb24gPSAiQS1iaXMgUmFkaW8gTGluayBMYXllciAoUkxMKSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzFtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEQ0NdID0geworCQkubmFtZSA9ICJEQ0MiLAorCQkuZGVzY3JpcHRpb24gPSAiTGF5ZXIzIENhbGwgQ29udHJvbCAoQ0MpIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszMm0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RNTV0gPSB7CisJCS5uYW1lID0gIkRNTSIsCisJCS5kZXNjcmlwdGlvbiA9ICJMYXllcjMgTW9iaWxpdHkgTWFuYWdlbWVudCAoTU0pIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszM20iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RSUl0gPSB7CisJCS5uYW1lID0gIkRSUiIsCisJCS5kZXNjcmlwdGlvbiA9ICJMYXllcjMgUmFkaW8gUmVzb3VyY2UgKFJSKSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzRtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEUlNMXSA9IHsKKwkJLm5hbWUgPSAiRFJTTCIsCisJCS5kZXNjcmlwdGlvbiA9ICJBLWJpcyBSYWRpbyBTaWdhbmxsaW5nIExpbmsgKFJTTCkiLAorCQkuY29sb3IgPSAiXDAzM1sxOzM1bSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE5NXSA9CXsKKwkJLm5hbWUgPSAiRE5NIiwKKwkJLmRlc2NyaXB0aW9uID0gIkEtYmlzIE5ldHdvcmsgTWFuYWdlbWVudCAvIE8mTSAoTk0vT01MKSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzZtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX0lORk8sCisJfSwKKwlbRE1OQ0NdID0geworCQkubmFtZSA9ICJETU5DQyIsCisJCS5kZXNjcmlwdGlvbiA9ICJNTkNDIEFQSSBmb3IgQ2FsbCBDb250cm9sIGFwcGxpY2F0aW9uIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszOW0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RTTVNdID0geworCQkubmFtZSA9ICJEU01TIiwKKwkJLmRlc2NyaXB0aW9uID0gIkxheWVyMyBTaG9ydCBNZXNzYWdlIFNlcnZpY2UgKFNNUykiLAorCQkuY29sb3IgPSAiXDAzM1sxOzM3bSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFBBR10JPSB7CisJCS5uYW1lID0gIkRQQUciLAorCQkuZGVzY3JpcHRpb24gPSAiUGFnaW5nIFN1YnN5c3RlbSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzhtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETUVBU10gPSB7CisJCS5uYW1lID0gIkRNRUFTIiwKKwkJLmRlc2NyaXB0aW9uID0gIlJhZGlvIE1lYXN1cmVtZW50IFByb2Nlc3NpbmciLAorCQkuZW5hYmxlZCA9IDAsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RNSV0gPSB7CisJCS5uYW1lID0gIkRNSSIsCisJCS5kZXNjcmlwdGlvbiA9ICJBLWJpcyBJbnB1dCBEcml2ZXIgZm9yIFNpZ25hbGxpbmciLAorCQkuZW5hYmxlZCA9IDAsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RNSUJdID0geworCQkubmFtZSA9ICJETUlCIiwKKwkJLmRlc2NyaXB0aW9uID0gIkEtYmlzIElucHV0IERyaXZlciBmb3IgQi1DaGFubmVscyAodm9pY2UpIiwKKwkJLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETVVYXSA9IHsKKwkJLm5hbWUgPSAiRE1VWCIsCisJCS5kZXNjcmlwdGlvbiA9ICJBLWJpcyBCLVN1YmNoYW5uZWwgVFJBVSBGcmFtZSBNdWx0aXBsZXgiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RJTlBdID0geworCQkubmFtZSA9ICJESU5QIiwKKwkJLmRlc2NyaXB0aW9uID0gIkEtYmlzIEludHB1dCBTdWJzeXN0ZW0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RTQ0NQXSA9IHsKKwkJLm5hbWUgPSAiRFNDQ1AiLAorCQkuZGVzY3JpcHRpb24gPSAiU0NDUCBQcm90b2NvbCIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1TQ10gPSB7CisJCS5uYW1lID0gIkRNU0MiLAorCQkuZGVzY3JpcHRpb24gPSAiTW9iaWxlIFN3aXRjaGluZyBDZW50ZXIiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RNR0NQXSA9IHsKKwkJLm5hbWUgPSAiRE1HQ1AiLAorCQkuZGVzY3JpcHRpb24gPSAiTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtESE9dID0geworCQkubmFtZSA9ICJESE8iLAorCQkuZGVzY3JpcHRpb24gPSAiSGFuZC1PdmVyIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEREJdID0geworCQkubmFtZSA9ICJEREIiLAorCQkuZGVzY3JpcHRpb24gPSAiRGF0YWJhc2UgTGF5ZXIiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RSRUZdID0geworCQkubmFtZSA9ICJEUkVGIiwKKwkJLmRlc2NyaXB0aW9uID0gIlJlZmVyZW5jZSBDb3VudGluZyIsCisJCS5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbREdQUlNdID0geworCQkubmFtZSA9ICJER1BSUyIsCisJCS5kZXNjcmlwdGlvbiA9ICJHUFJTIFBhY2tldCBTZXJ2aWNlIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX0RFQlVHLAorCX0sCisJW0ROU10gPSB7CisJCS5uYW1lID0gIkROUyIsCisJCS5kZXNjcmlwdGlvbiA9ICJHUFJTIE5ldHdvcmsgU2VydmljZSAoTlMpIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX0RFQlVHLAorCX0sCisJW0RCU1NHUF0gPSB7CisJCS5uYW1lID0gIkRCU1NHUCIsCisJCS5kZXNjcmlwdGlvbiA9ICJHUFJTIEJTUyBHYXRld2F5IFByb3RvY29sIChCU1NHUCkiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfREVCVUcsCisJfSwKK307CisKK2VudW0gbG9nX2N0eHQgeworCUNUWF9TVUJTQ1JJQkVSLAorfTsKKworZW51bSBsb2dfZmlsdGVyIHsKKwlfRkxUX0FMTCA9IExPR19GSUxURVJfQUxMLAkvKiBsaWJvc21vY29yZSAqLworCUZMVF9JTVNJID0gMSwKK307CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZuKGNvbnN0IHN0cnVjdCBsb2dfY29udGV4dCAqY3R4LAorCQkgICAgIHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXIpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBjdHgtPmN0eFtDVFhfU1VCU0NSSUJFUl07CisKKwlpZiAoKHRhci0+ZmlsdGVyX21hcCAmICgxIDw8IEZMVF9JTVNJKSkgIT0gMAorCSAgICAmJiBzdWJzY3IgJiYgc3RyY21wKHN1YnNjci0+aW1zaSwgdGFyLT5maWx0ZXJfZGF0YVtGTFRfSU1TSV0pID09IDApCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBsb2dfaW5mbyBsb2dfaW5mbyA9IHsKKwkuZmlsdGVyX2ZuID0gZmlsdGVyX2ZuLAorCS5jYXQgPSBkZWZhdWx0X2NhdGVnb3JpZXMsCisJLm51bV9jYXQgPSBBUlJBWV9TSVpFKGRlZmF1bHRfY2F0ZWdvcmllcyksCit9OworCit2b2lkIGxvZ19zZXRfaW1zaV9maWx0ZXIoc3RydWN0IGxvZ190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciAqaW1zaSkKK3sKKwlpZiAoaW1zaSkgeworCQl0YXJnZXQtPmZpbHRlcl9tYXAgfD0gKDEgPDwgRkxUX0lNU0kpOworCQl0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9JTVNJXSA9IHRhbGxvY19zdHJkdXAodGFyZ2V0LCBpbXNpKTsKKwl9IGVsc2UgaWYgKHRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX0lNU0ldKSB7CisJCXRhcmdldC0+ZmlsdGVyX21hcCAmPSB+KDEgPDwgRkxUX0lNU0kpOworCQl0YWxsb2NfZnJlZSh0YXJnZXQtPmZpbHRlcl9kYXRhW0ZMVF9JTVNJXSk7CisJCXRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX0lNU0ldID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9lMV9jb25maWcuYyBiL29wZW5ic2Mvc3JjL2UxX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZmJjZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9lMV9jb25maWcuYwpAQCAtMCwwICsxLDIzNiBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9mcmFtZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9tdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21pc2RuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworI2RlZmluZSBTQVBJX0wyTUwJMAorI2RlZmluZSBTQVBJX09NTAk2MgorI2RlZmluZSBTQVBJX1JTTAkwCS8qIDYzID8gKi8KKworLyogVGhlIGUxX3JlY29uZmlnXyooKSBmdW5jdGlvbnMgYmVsb3cgdGFsZSB0aGUgY29uZmlndXJhdGlvbiBwcmVzZW50IGluIHRoZQorICogYnRzL3RyeC90cyBkYXRhIHN0cnVjdHVyZXMgYW5kIGVuc3VyZSB0aGUgRTEgY29uZmlndXJhdGlvbiByZWZsZWN0cyB0aGUKKyAqIHRpbWVzbG90L3N1YnNsb3QvVEVJIGNvbmZpZ3VyYXRpb24gKi8KKworaW50IGUxX3JlY29uZmlnX3RzKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rID0gJnRzLT5lMV9saW5rOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF90cyAqZTFfdHM7CisKKwlERUJVR1AoRE1JLCAiZTFfcmVjb25maWdfdHMoJXUsJXUsJXUpXG4iLCB0cy0+dHJ4LT5idHMtPm5yLCB0cy0+dHJ4LT5uciwgdHMtPm5yKTsKKworCWlmICghZTFfbGluay0+ZTFfdHMpCisJCXJldHVybiAwOworCisJbGluZSA9IGUxaW5wX2xpbmVfZ2V0X2NyZWF0ZShlMV9saW5rLT5lMV9ucik7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN3aXRjaCAodHMtPnBjaGFuKSB7CisJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCWUxX3RzID0gJmxpbmUtPnRzW2UxX2xpbmstPmUxX3RzLTFdOworCQllMWlucF90c19jb25maWcoZTFfdHMsIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZlMV90cy0+dHJhdS5kZW11eCwgZTFfbGluay0+ZTFfdHNfc3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGUxX3JlY29uZmlnX3RyeChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmsgPSAmdHJ4LT5yc2xfZTFfbGluazsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnNpZ25fdHM7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqcnNsX2xpbms7CisJaW50IGk7CisKKwlpZiAoIWUxX2xpbmstPmUxX3RzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFJTTCBMaW5rICovCisJbGluZSA9IGUxaW5wX2xpbmVfZ2V0X2NyZWF0ZShlMV9saW5rLT5lMV9ucik7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzaWduX3RzID0gJmxpbmUtPnRzW2UxX2xpbmstPmUxX3RzLTFdOworCWUxaW5wX3RzX2NvbmZpZyhzaWduX3RzLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCXJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX1JTTCwKKwkJCQkJICB0cngsIHRyeC0+cnNsX3RlaSwgU0FQSV9SU0wpOworCWlmICghcnNsX2xpbmspCisJCXJldHVybiAtRU5PTUVNOworCWlmICh0cngtPnJzbF9saW5rKQorCQllMWlucF9zaWduX2xpbmtfZGVzdHJveSh0cngtPnJzbF9saW5rKTsKKwl0cngtPnJzbF9saW5rID0gcnNsX2xpbms7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFJYX05SX1RTOyBpKyspCisJCWUxX3JlY29uZmlnX3RzKCZ0cngtPnRzW2ldKTsKKworCXJldHVybiAwOworfQorCitpbnQgZTFfcmVjb25maWdfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rID0gJmJ0cy0+b21sX2UxX2xpbms7CisJc3RydWN0IGUxaW5wX3RzICpzaWduX3RzOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKm9tbF9saW5rOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJREVCVUdQKERNSSwgImUxX3JlY29uZmlnX2J0cygldSlcbiIsIGJ0cy0+bnIpOworCisJaWYgKCFlMV9saW5rLT5lMV90cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBPTUwgbGluayAqLworCWxpbmUgPSBlMWlucF9saW5lX2dldF9jcmVhdGUoZTFfbGluay0+ZTFfbnIpOworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2lnbl90cyA9ICZsaW5lLT50c1tlMV9saW5rLT5lMV90cy0xXTsKKwllMWlucF90c19jb25maWcoc2lnbl90cywgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKwlvbWxfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9PTUwsCisJCQkJCSAgYnRzLT5jMCwgYnRzLT5vbWxfdGVpLCBTQVBJX09NTCk7CisJaWYgKCFvbWxfbGluaykKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGJ0cy0+b21sX2xpbmspCisJCWUxaW5wX3NpZ25fbGlua19kZXN0cm95KGJ0cy0+b21sX2xpbmspOworCWJ0cy0+b21sX2xpbmsgPSBvbWxfbGluazsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpCisJCWUxX3JlY29uZmlnX3RyeCh0cngpOworCisJLyogbm90aWZ5IEUxIGlucHV0IHNvbWV0aGluZyBoYXMgY2hhbmdlZCAqLworCXJldHVybiBlMWlucF9saW5lX3VwZGF0ZShsaW5lKTsKK30KKworI2lmIDAKKy8qIGRvIHNvbWUgY29tcGlsZWQtaW4gY29uZmlndXJhdGlvbiBmb3Igb3VyIEJUUy9FMSBzZXR1cCAqLworaW50IGUxX2NvbmZpZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgY2FyZG5yLCBpbnQgcmVsZWFzZV9sMikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnNpZ25fdHM7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqb21sX2xpbmssICpyc2xfbGluazsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGJ0cy0+YzA7CisJaW50IGJhc2VfdHM7CisKKwlzd2l0Y2ggKGJ0cy0+bnIpIHsKKwljYXNlIDA6CisJCS8qIEZpcnN0IEJUUyB1c2VzIEUxIFRTIDAxLDAyLDAzLDA0LDA1ICovCisJCWJhc2VfdHMgPSBIQVJEQ09ERURfQlRTMF9UUyAtIDE7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogU2Vjb25kIEJUUyB1c2VzIEUxIFRTIDA2LDA3LDA4LDA5LDEwICovCisJCWJhc2VfdHMgPSBIQVJEQ09ERURfQlRTMV9UUyAtIDE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJLyogVGhpcmQgQlRTIHVzZXMgRTEgVFMgMTEsMTIsMTMsMTQsMTUgKi8KKwkJYmFzZV90cyA9IEhBUkRDT0RFRF9CVFMyX1RTIC0gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsaW5lID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZTFpbnBfbGluZSk7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGNyZWF0ZSBFMSB0aW1lc2xvdHMgZm9yIHNpZ25hbGxpbmcgYW5kIFRSQVUgZnJhbWVzICovCisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzEtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzItMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisKKwkvKiBjcmVhdGUgc2lnbmFsbGluZyBsaW5rcyBmb3IgVFMxICovCisJc2lnbl90cyA9ICZsaW5lLT50c1tiYXNlX3RzKzEtMV07CisJb21sX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fT01MLAorCQkJCQkgIHRyeCwgVEVJX09NTCwgU0FQSV9PTUwpOworCXJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX1JTTCwKKwkJCQkJICB0cngsIFRFSV9SU0wsIFNBUElfUlNMKTsKKworCS8qIGNyZWF0ZSBiYWNrLWxpbmtzIGZyb20gYnRzL3RyeCAqLworCWJ0cy0+b21sX2xpbmsgPSBvbWxfbGluazsKKwl0cngtPnJzbF9saW5rID0gcnNsX2xpbms7CisKKwkvKiBlbmFibGUgc3ViY2hhbm5lbCBkZW11eGVyIG9uIFRTMiAqLworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzItMV0udHJhdS5kZW11eCwgMSk7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMi0xXS50cmF1LmRlbXV4LCAyKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cysyLTFdLnRyYXUuZGVtdXgsIDMpOworCisJLyogZW5hYmxlIHN1YmNoYW5uZWwgZGVtdXhlciBvbiBUUzMgKi8KKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cyszLTFdLnRyYXUuZGVtdXgsIDApOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0udHJhdS5kZW11eCwgMSk7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXS50cmF1LmRlbXV4LCAyKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cyszLTFdLnRyYXUuZGVtdXgsIDMpOworCisJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgMSk7CisJaWYgKHRyeCkgeworCQkvKiBjcmVhdGUgRTEgdGltZXNsb3RzIGZvciBUUkFVIGZyYW1lcyBvZiBUUlgxICovCisJCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbYmFzZV90cys0LTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1RSQVUpOworCQllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKworCQkvKiBjcmVhdGUgUlNMIHNpZ25hbGxpbmcgbGluayBmb3IgVFJYMSAqLworCQlzaWduX3RzID0gJmxpbmUtPnRzW2Jhc2VfdHMrMS0xXTsKKwkJcnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fUlNMLAorCQkJCQkgIHRyeCwgVEVJX1JTTCsxLCBTQVBJX1JTTCk7CisJCS8qIGNyZWF0ZSBiYWNrLWxpbmtzIGZyb20gdHJ4ICovCisJCXRyeC0+cnNsX2xpbmsgPSByc2xfbGluazsKKworCQkvKiBlbmFibGUgc3ViY2hhbm5lbCBkZW11eGVyIG9uIFRTMiAqLworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys0LTFdLnRyYXUuZGVtdXgsIDApOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys0LTFdLnRyYXUuZGVtdXgsIDEpOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys0LTFdLnRyYXUuZGVtdXgsIDIpOworCQlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cys0LTFdLnRyYXUuZGVtdXgsIDMpOworCisJCS8qIGVuYWJsZSBzdWJjaGFubmVsIGRlbXV4ZXIgb24gVFMzICovCisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0udHJhdS5kZW11eCwgMCk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0udHJhdS5kZW11eCwgMSk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0udHJhdS5kZW11eCwgMik7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzUtMV0udHJhdS5kZW11eCwgMyk7CisJfQorCisJcmV0dXJuIG1pX3NldHVwKGNhcmRuciwgbGluZSwgcmVsZWFzZV9sMik7Cit9CisjZW5kaWYKKworLyogY29uZmlndXJlIHBzZXVkbyBFMSBsaW5lIGluIGlwLmFjY2VzcyBzdHlsZSBhbmQgY29ubmVjdCB0byBCVFMgKi8KK2ludCBpYV9jb25maWdfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnNpZ25fdHMsICpyc2xfdHM7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqb21sX2xpbmssICpyc2xfbGluazsKKworCWxpbmUgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBlMWlucF9saW5lKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogY3JlYXRlIEUxIHRpbWVzbG90cyBmb3Igc2lnbmFsbGluZyBhbmQgVFJBVSBmcmFtZXMgKi8KKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzWzEtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1syLTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCisJLyogY3JlYXRlIHNpZ25hbGxpbmcgbGlua3MgZm9yIFRTMSAqLworCXNpZ25fdHMgPSAmbGluZS0+dHNbMS0xXTsKKwlyc2xfdHMgPSAmbGluZS0+dHNbMi0xXTsKKwlvbWxfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9PTUwsCisJCQkJCSAgYnRzLT5jMCwgMHhmZiwgMCk7CisJcnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHJzbF90cywgRTFJTlBfU0lHTl9SU0wsCisJCQkJCSAgYnRzLT5jMCwgMCwgMCk7CisKKwkvKiBjcmVhdGUgYmFjay1saW5rcyBmcm9tIGJ0cy90cnggKi8KKwlidHMtPm9tbF9saW5rID0gb21sX2xpbms7CisJYnRzLT5jMC0+cnNsX2xpbmsgPSByc2xfbGluazsKKworCS8qIGRlZmF1bHQgcG9ydCBhdCBCVFMgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zIGlzIDMwMDYgKi8KKwlpZiAoc2luLT5zaW5fcG9ydCA9PSAwKQorCQlzaW4tPnNpbl9wb3J0ID0gaHRvbnMoMzAwNik7CisKKwlyZXR1cm4gaXBhY2Nlc3NfY29ubmVjdChsaW5lLCBzaW4pOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZTFfaW5wdXQuYyBiL29wZW5ic2Mvc3JjL2UxX2lucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkZmU5YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2UxX2lucHV0LmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qIE9wZW5CU0MgQWJpcyBpbnRlcmZhY2UgdG8gRTEgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bUlTRE5pZi5oPgorCisvLyNkZWZpbmUgQUZfQ09NUEFUSUJJTElUWV9GVU5DCisvLyNpbmNsdWRlIDxjb21wYXRfYWZfaXNkbi5oPgorI2lmbmRlZiBBRl9JU0ROCisjZGVmaW5lIEFGX0lTRE4gMzQKKyNkZWZpbmUgUEZfSVNETiBBRl9JU0ROCisjZW5kaWYKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X211eC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9taXNkbi5oPgorCisjZGVmaW5lIE5VTV9FMV9UUwkzMgorCisvKiBsaXN0IG9mIGFsbCBFMSBkcml2ZXJzICovCitMTElTVF9IRUFEKGUxaW5wX2RyaXZlcl9saXN0KTsKKworLyogbGlzdCBvZiBhbGwgRTEgbGluZXMgKi8KK0xMSVNUX0hFQUQoZTFpbnBfbGluZV9saXN0KTsKKworc3RhdGljIHZvaWQgKnRhbGxfc2lnbF9jdHg7CisKKy8qIHRvIGJlIGltcGxlbWVudGVkLCBlLmcuIGJ5IGJzY19oYWNrLmMgKi8KK3ZvaWQgaW5wdXRfZXZlbnQoaW50IGV2ZW50LCBlbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlLCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCk7CisKKy8qCisgKiBwY2FwIHdyaXRpbmcgb2YgdGhlIG1pc2RuIGxvYWQKKyAqIHBjYXAgZm9ybWF0IGlzIGZyb20gaHR0cDovL3dpa2kud2lyZXNoYXJrLm9yZy9EZXZlbG9wbWVudC9MaWJwY2FwRmlsZUZvcm1hdAorICovCisjZGVmaW5lIERMVF9MSU5VWF9MQVBECQkxNzcKKyNkZWZpbmUgUENBUF9JTlBVVAkJMAorI2RlZmluZSBQQ0FQX09VVFBVVAkJMQorCitzdHJ1Y3QgcGNhcF9oZHIgeworCXVfaW50MzJfdCBtYWdpY19udW1iZXI7CisJdV9pbnQxNl90IHZlcnNpb25fbWFqb3I7CisJdV9pbnQxNl90IHZlcnNpb25fbWlub3I7CisJaW50MzJfdCAgdGhpc3pvbmU7CisJdV9pbnQzMl90IHNpZ2ZpZ3M7CisJdV9pbnQzMl90IHNuYXBsZW47CisJdV9pbnQzMl90IG5ldHdvcms7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcGNhcHJlY19oZHIgeworCXVfaW50MzJfdCB0c19zZWM7CisJdV9pbnQzMl90IHRzX3VzZWM7CisJdV9pbnQzMl90IGluY2xfbGVuOworCXVfaW50MzJfdCBvcmlnX2xlbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyIHsKKyAgICAgICAgdV9pbnQxNl90IHBrdHR5cGU7CisJdV9pbnQxNl90IGhhdHlwZTsKKwl1X2ludDE2X3QgaGFsZW47CisJdV9pbnQ2NF90IGFkZHI7CisJaW50MTZfdCBwcm90b2NvbDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBsYXBkX2hlYWRlciB7CisJdV9pbnQ4X3QgZWExIDogMTsKKwl1X2ludDhfdCBjciA6IDE7CisJdV9pbnQ4X3Qgc2FwaSA6IDY7CisJdV9pbnQ4X3QgZWEyIDogMTsKKwl1X2ludDhfdCB0ZWkgOiA3OworCXVfaW50OF90IGNvbnRyb2xfZm9vOyAvKiBmYWtlIFVNJ3MgLi4uICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWNfYXNzZXJ0KChpbnQpJigoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIqKU5VTEwpLT5oYXR5cGUgPT0gMiwJaGF0eXBlX29mZnNldCk7CitzdGF0aWNfYXNzZXJ0KChpbnQpJigoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIqKU5VTEwpLT5oYWxlbiA9PSA0LAkJaGFsZW5fb2Zmc2V0KTsKK3N0YXRpY19hc3NlcnQoKGludCkmKChzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciopTlVMTCktPmFkZHIgPT0gNiwJCWFkZHJfb2Zmc2V0KTsKK3N0YXRpY19hc3NlcnQoKGludCkmKChzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciopTlVMTCktPnByb3RvY29sID09IDE0LAlwcm90b19vZmZzZXQpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIpID09IDE2LAkJCWxhcGRfaGVhZGVyX3NpemUpOworCisKK3N0YXRpYyBpbnQgcGNhcF9mZCA9IC0xOworCit2b2lkIGUxX3NldF9wY2FwX2ZkKGludCBmZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBwY2FwX2hkciBoZWFkZXIgPSB7CisJCS5tYWdpY19udW1iZXIJPSAweGExYjJjM2Q0LAorCQkudmVyc2lvbl9tYWpvcgk9IDIsCisJCS52ZXJzaW9uX21pbm9yCT0gNCwKKwkJLnRoaXN6b25lCT0gMCwKKwkJLnNpZ2ZpZ3MJPSAwLAorCQkuc25hcGxlbgk9IDY1NTM1LAorCQkubmV0d29yawk9IERMVF9MSU5VWF9MQVBELAorCX07CisKKwlwY2FwX2ZkID0gZmQ7CisJcmV0ID0gd3JpdGUocGNhcF9mZCwgJmhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOworfQorCisvKiBUaGlzIGN1cnJlbnRseSBvbmx5IHdvcmtzIGZvciB0aGUgRC1DaGFubmVsICovCitzdGF0aWMgdm9pZCB3cml0ZV9wY2FwX3BhY2tldChpbnQgZGlyZWN0aW9uLCBpbnQgc2FwaSwgaW50IHRlaSwKKwkJCSAgICAgIHN0cnVjdCBtc2diICptc2cpIHsKKwlpZiAocGNhcF9mZCA8IDApCisJCXJldHVybjsKKworCWludCByZXQ7CisJdGltZV90IGN1cl90aW1lOworCXN0cnVjdCB0bSAqdG07CisJaW50IG1pX2hlYWQgPSAoZGlyZWN0aW9uPT1QQ0FQX0lOUFVUKSA/IE1JU0ROX0hFQURFUl9MRU4gOiAwOworCisJc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIgaGVhZGVyID0geworCQkucGt0dHlwZQk9IDQsCisJCS5oYXR5cGUJCT0gMCwKKwkJLmhhbGVuCQk9IDAsCisJCS5hZGRyCQk9IGRpcmVjdGlvbiA9PSBQQ0FQX09VVFBVVCA/IDB4MCA6IDB4MSwKKwkJLnByb3RvY29sCT0gbnRvaHMoNDgpLAorCX07CisKKwlzdHJ1Y3QgbGFwZF9oZWFkZXIgbGFwZF9oZWFkZXIgPSB7CisJCS5lYTEJCT0gMCwKKwkJLmNyCQk9IGRpcmVjdGlvbiA9PSBQQ0FQX09VVFBVVCA/IDEgOiAwLAorCQkuc2FwaQkJPSBzYXBpICYgMHgzRiwKKwkJLmVhMgkJPSAxLAorCQkudGVpCQk9IHRlaSAmIDB4N0YsCisJCS5jb250cm9sX2Zvbwk9IDB4MDMgLyogVUkgKi8sCisJfTsJCisKKwlzdHJ1Y3QgcGNhcHJlY19oZHIgcGF5bG9hZF9oZWFkZXIgPSB7CisJCS50c19zZWMJICAgID0gMCwKKwkJLnRzX3VzZWMgICAgPSAwLAorCQkuaW5jbF9sZW4gICA9IG1zZy0+bGVuICsgc2l6ZW9mKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKQorCQkJCSsgc2l6ZW9mKHN0cnVjdCBsYXBkX2hlYWRlcikKKwkJCQktIG1pX2hlYWQsCisJCS5vcmlnX2xlbiAgID0gbXNnLT5sZW4gKyBzaXplb2Yoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIpCisJCQkJKyBzaXplb2Yoc3RydWN0IGxhcGRfaGVhZGVyKQorCQkJCS0gbWlfaGVhZCwKKwl9OworCisKKwljdXJfdGltZSA9IHRpbWUoTlVMTCk7CisJdG0gPSBsb2NhbHRpbWUoJmN1cl90aW1lKTsKKwlwYXlsb2FkX2hlYWRlci50c19zZWMgPSBta3RpbWUodG0pOworCisJcmV0ID0gd3JpdGUocGNhcF9mZCwgJnBheWxvYWRfaGVhZGVyLCBzaXplb2YocGF5bG9hZF9oZWFkZXIpKTsKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CisJcmV0ID0gd3JpdGUocGNhcF9mZCwgJmxhcGRfaGVhZGVyLCBzaXplb2YobGFwZF9oZWFkZXIpKTsKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCBtc2ctPmRhdGEgKyBtaV9oZWFkLAorCQkJbXNnLT5sZW4gLSBtaV9oZWFkKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnNpZ25fdHlwZXNbXSA9IHsKKwlbRTFJTlBfU0lHTl9OT05FXQk9ICJOb25lIiwKKwlbRTFJTlBfU0lHTl9PTUxdCT0gIk9NTCIsCisJW0UxSU5QX1NJR05fUlNMXQk9ICJSU0wiLAorfTsKK2NvbnN0IGNoYXIgKmUxaW5wX3NpZ250eXBlX25hbWUoZW51bSBlMWlucF9zaWduX3R5cGUgdHApCit7CisJaWYgKHRwID49IEFSUkFZX1NJWkUoc2lnbl90eXBlcykpCisJCXJldHVybiAidW5kZWZpbmVkIjsKKwlyZXR1cm4gc2lnbl90eXBlc1t0cF07Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp0c190eXBlc1tdID0geworCVtFMUlOUF9UU19UWVBFX05PTkVdCT0gIk5vbmUiLAorCVtFMUlOUF9UU19UWVBFX1NJR05dCT0gIlNpZ25hbGxpbmciLAorCVtFMUlOUF9UU19UWVBFX1RSQVVdCT0gIlRSQVUiLAorfTsKKworY29uc3QgY2hhciAqZTFpbnBfdHN0eXBlX25hbWUoZW51bSBlMWlucF90c190eXBlIHRwKQoreworCWlmICh0cCA+PSBBUlJBWV9TSVpFKHRzX3R5cGVzKSkKKwkJcmV0dXJuICJ1bmRlZmluZWQiOworCXJldHVybiB0c190eXBlc1t0cF07Cit9CisKKy8qIGNhbGxiYWNrIHdoZW4gYSBUUkFVIGZyYW1lIHdhcyByZWNlaXZlZCAqLworc3RhdGljIGludCBzdWJjaF9jYihzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IGNoLCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbiwKKwkJICAgIHZvaWQgKl9wcml2KQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gX3ByaXY7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90IHNyY19zczsKKworCXNyY19zcy5lMV9uciA9IGUxaV90cy0+bGluZS0+bnVtOworCXNyY19zcy5lMV90cyA9IGUxaV90cy0+bnVtOworCXNyY19zcy5lMV90c19zcyA9IGNoOworCisJcmV0dXJuIHRyYXVfbXV4X2lucHV0KCZzcmNfc3MsIGRhdGEsIGxlbik7Cit9CisKK2ludCBhYmlzX3JzbF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqc2lnbl9saW5rOworCXN0cnVjdCBlMWlucF9kcml2ZXIgKmUxaW5wX2RyaXZlcjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKworCW1zZy0+bDJoID0gbXNnLT5kYXRhOworCisJaWYgKCFtc2ctPnRyeCkgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJyc2xfc2VuZG1zZzogbXNnLT50cnggPT0gTlVMTDogJXNcbiIsCisJCQloZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKwkJdGFsbG9jX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmICghbXNnLT50cngtPnJzbF9saW5rKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgInJzbF9zZW5kbXNnOiBtc2ctPnRyeC0+cnNsX2xpbmsgPT0gTlVMTDogJXNcbiIsCisJCQloZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKwkJdGFsbG9jX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc2lnbl9saW5rID0gbXNnLT50cngtPnJzbF9saW5rOworCWUxaV90cyA9IHNpZ25fbGluay0+dHM7CisJaWYgKCFic2NfdGltZXJfcGVuZGluZygmZTFpX3RzLT5zaWduLnR4X3RpbWVyKSkgeworCQkvKiBub3RpZnkgdGhlIGRyaXZlciB3ZSBoYXZlIHNvbWV0aGluZyB0byB3cml0ZSAqLworCQllMWlucF9kcml2ZXIgPSBzaWduX2xpbmstPnRzLT5saW5lLT5kcml2ZXI7CisJCWUxaW5wX2RyaXZlci0+d2FudF93cml0ZShlMWlfdHMpOworCX0KKwltc2diX2VucXVldWUoJnNpZ25fbGluay0+dHhfbGlzdCwgbXNnKTsKKworCS8qIGR1bXAgaXQgKi8KKwl3cml0ZV9wY2FwX3BhY2tldChQQ0FQX09VVFBVVCwgc2lnbl9saW5rLT5zYXBpLCBzaWduX2xpbmstPnRlaSwgbXNnKTsKKworCXJldHVybiAwOworfQorCitpbnQgX2FiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnNpZ25fbGluazsKKwlzdHJ1Y3QgZTFpbnBfZHJpdmVyICplMWlucF9kcml2ZXI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHM7CisKKwltc2ctPmwyaCA9IG1zZy0+ZGF0YTsKKworCWlmICghbXNnLT50cnggfHwgIW1zZy0+dHJ4LT5idHMgfHwgIW1zZy0+dHJ4LT5idHMtPm9tbF9saW5rKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIm5tX3NlbmRtc2c6IG1zZy0+dHJ4ID09IE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzaWduX2xpbmsgPSBtc2ctPnRyeC0+YnRzLT5vbWxfbGluazsKKwllMWlfdHMgPSBzaWduX2xpbmstPnRzOworCWlmICghYnNjX3RpbWVyX3BlbmRpbmcoJmUxaV90cy0+c2lnbi50eF90aW1lcikpIHsKKwkJLyogbm90aWZ5IHRoZSBkcml2ZXIgd2UgaGF2ZSBzb21ldGhpbmcgdG8gd3JpdGUgKi8KKwkJZTFpbnBfZHJpdmVyID0gc2lnbl9saW5rLT50cy0+bGluZS0+ZHJpdmVyOworCQllMWlucF9kcml2ZXItPndhbnRfd3JpdGUoZTFpX3RzKTsKKwl9CisJbXNnYl9lbnF1ZXVlKCZzaWduX2xpbmstPnR4X2xpc3QsIG1zZyk7CisKKwkvKiBkdW1wIGl0ICovCisJd3JpdGVfcGNhcF9wYWNrZXQoUENBUF9PVVRQVVQsIHNpZ25fbGluay0+c2FwaSwgc2lnbl9saW5rLT50ZWksIG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGltZXNsb3QgKi8KKworLyogY29uZmlndXJlIGFuZCBpbml0aWFsaXplIG9uZSBlMWlucF90cyAqLworaW50IGUxaW5wX3RzX2NvbmZpZyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwKKwkJICAgIGVudW0gZTFpbnBfdHNfdHlwZSB0eXBlKQoreworCWlmICh0cy0+dHlwZSA9PSB0eXBlICYmIHRzLT5saW5lICYmIGxpbmUpCisJCXJldHVybiAwOworCisJdHMtPnR5cGUgPSB0eXBlOworCXRzLT5saW5lID0gbGluZTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQlJTklUX0xMSVNUX0hFQUQoJnRzLT5zaWduLnNpZ25fbGlua3MpOworCQlicmVhazsKKwljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJc3ViY2hhbl9tdXhfaW5pdCgmdHMtPnRyYXUubXV4KTsKKwkJdHMtPnRyYXUuZGVtdXgub3V0X2NiID0gc3ViY2hfY2I7CisJCXRzLT50cmF1LmRlbXV4LmRhdGEgPSB0czsKKwkJc3ViY2hfZGVtdXhfaW5pdCgmdHMtPnRyYXUuZGVtdXgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgInVuc3VwcG9ydGVkIEUxIHRpbWVzbG90IHR5cGUgJXVcbiIsCisJCQl0cy0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlMWlucF9saW5lICplMWlucF9saW5lX2dldCh1X2ludDhfdCBlMV9ucikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqZTFpX2xpbmU7CisKKwkvKiBpdGVyYXRlIG92ZXIgZ2xvYmFsIGxpc3Qgb2YgZTEgbGluZXMgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShlMWlfbGluZSwgJmUxaW5wX2xpbmVfbGlzdCwgbGlzdCkgeworCQlpZiAoZTFpX2xpbmUtPm51bSA9PSBlMV9ucikKKwkJCXJldHVybiBlMWlfbGluZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBlMWlucF9saW5lICplMWlucF9saW5lX2dldF9jcmVhdGUodV9pbnQ4X3QgZTFfbnIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJaW50IGk7CisKKwlsaW5lID0gZTFpbnBfbGluZV9nZXQoZTFfbnIpOworCWlmIChsaW5lKQorCQlyZXR1cm4gbGluZTsKKworCWxpbmUgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBlMWlucF9saW5lKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiBOVUxMOworCisJbGluZS0+bnVtID0gZTFfbnI7CisJZm9yIChpID0gMDsgaSA8IE5VTV9FMV9UUzsgaSsrKSB7CisJCWxpbmUtPnRzW2ldLm51bSA9IGkrMTsKKwkJbGluZS0+dHNbaV0ubGluZSA9IGxpbmU7CisJfQorCWxsaXN0X2FkZF90YWlsKCZsaW5lLT5saXN0LCAmZTFpbnBfbGluZV9saXN0KTsKKworCXJldHVybiBsaW5lOworfQorCitzdGF0aWMgc3RydWN0IGUxaW5wX3RzICplMWlucF90c19nZXQodV9pbnQ4X3QgZTFfbnIsIHVfaW50OF90IHRzX25yKQoreworCXN0cnVjdCBlMWlucF9saW5lICplMWlfbGluZTsKKworCWUxaV9saW5lID0gZTFpbnBfbGluZV9nZXQoZTFfbnIpOworCWlmICghZTFpX2xpbmUpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZlMWlfbGluZS0+dHNbdHNfbnItMV07Cit9CisKK3N0cnVjdCBzdWJjaF9tdXggKmUxaW5wX2dldF9tdXgodV9pbnQ4X3QgZTFfbnIsIHVfaW50OF90IHRzX25yKQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gZTFpbnBfdHNfZ2V0KGUxX25yLCB0c19ucik7CisKKwlpZiAoIWUxaV90cykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gJmUxaV90cy0+dHJhdS5tdXg7Cit9CisKKy8qIFNpZ25hbGxpbmcgTGluayAqLworCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICplMWlucF9sb29rdXBfc2lnbl9saW5rKHN0cnVjdCBlMWlucF90cyAqZTFpLAorCQkJCQkgCXVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluaywgJmUxaS0+c2lnbi5zaWduX2xpbmtzLCBsaXN0KSB7CisJCWlmIChsaW5rLT5zYXBpID09IHNhcGkgJiYgbGluay0+dGVpID09IHRlaSkKKwkJCXJldHVybiBsaW5rOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBjcmVhdGUgYSBuZXcgc2lnbmFsbGluZyBsaW5rIGluIGEgRTEgdGltZXNsb3QgKi8KKworc3RydWN0IGUxaW5wX3NpZ25fbGluayAqCitlMWlucF9zaWduX2xpbmtfY3JlYXRlKHN0cnVjdCBlMWlucF90cyAqdHMsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdGVpLAorCQkJdV9pbnQ4X3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCisJaWYgKHRzLT50eXBlICE9IEUxSU5QX1RTX1RZUEVfU0lHTikKKwkJcmV0dXJuIE5VTEw7CisKKwlsaW5rID0gdGFsbG9jX3plcm8odGFsbF9zaWdsX2N0eCwgc3RydWN0IGUxaW5wX3NpZ25fbGluayk7CisJaWYgKCFsaW5rKQorCQlyZXR1cm4gTlVMTDsKKworCWxpbmstPnRzID0gdHM7CisJbGluay0+dHlwZSA9IHR5cGU7CisJSU5JVF9MTElTVF9IRUFEKCZsaW5rLT50eF9saXN0KTsKKwlsaW5rLT50cnggPSB0cng7CisJbGluay0+dGVpID0gdGVpOworCWxpbmstPnNhcGkgPSBzYXBpOworCisJbGxpc3RfYWRkX3RhaWwoJmxpbmstPmxpc3QsICZ0cy0+c2lnbi5zaWduX2xpbmtzKTsKKworCXJldHVybiBsaW5rOworfQorCit2b2lkIGUxaW5wX3NpZ25fbGlua19kZXN0cm95KHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbmspCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCWxsaXN0X2RlbCgmbGluay0+bGlzdCk7CisJd2hpbGUgKCFsbGlzdF9lbXB0eSgmbGluay0+dHhfbGlzdCkpIHsKKwkJbXNnID0gbXNnYl9kZXF1ZXVlKCZsaW5rLT50eF9saXN0KTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorCisJaWYgKGxpbmstPnRzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfU0lHTikKKwkJYnNjX2RlbF90aW1lcigmbGluay0+dHMtPnNpZ24udHhfdGltZXIpOworCisJdGFsbG9jX2ZyZWUobGluayk7Cit9CisKKy8qIHRoZSBFMSBkcml2ZXIgdGVsbHMgdXMgaGUgaGFzIHJlY2VpdmVkIHNvbWV0aGluZyBvbiBhIFRTICovCitpbnQgZTFpbnBfcnhfdHMoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IG1zZ2IgKm1zZywKKwkJdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisJaW50IHJldDsKKworCXN3aXRjaCAodHMtPnR5cGUpIHsKKwljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJLyogY29uc3VsdCB0aGUgbGlzdCBvZiBzaWduYWxsaW5nIGxpbmtzICovCisJCXdyaXRlX3BjYXBfcGFja2V0KFBDQVBfSU5QVVQsIHNhcGksIHRlaSwgbXNnKTsKKwkJbGluayA9IGUxaW5wX2xvb2t1cF9zaWduX2xpbmsodHMsIHRlaSwgc2FwaSk7CisJCWlmICghbGluaykgeworCQkJTE9HUChETUksIExPR0xfRVJST1IsICJkaWRuJ3QgZmluZCBzaWduYWxsaW5nIGxpbmsgZm9yICIKKwkJCQkidGVpICVkLCBzYXBpICVkXG4iLCB0ZWksIHNhcGkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9CVFMsIGxpbmstPnRyeC0+YnRzKTsKKwkJc3dpdGNoIChsaW5rLT50eXBlKSB7CisJCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCQltc2ctPnRyeCA9IGxpbmstPnRyeDsKKwkJCXJldCA9IGFiaXNfbm1fcmN2bXNnKG1zZyk7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9TSUdOX1JTTDoKKwkJCW1zZy0+dHJ4ID0gbGluay0+dHJ4OworCQkJcmV0ID0gYWJpc19yc2xfcmN2bXNnKG1zZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgInVua25vd24gbGluayB0eXBlICV1XG4iLCBsaW5rLT50eXBlKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQlyZXQgPSBzdWJjaF9kZW11eF9pbigmdHMtPnRyYXUuZGVtdXgsIG1zZy0+bDJoLCBtc2diX2wybGVuKG1zZykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgInVua25vd24gVFMgdHlwZSAldVxuIiwgdHMtPnR5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFRTWF9BTExPQ19TSVpFIDQwOTYKKworLyogY2FsbGVkIGJ5IGRyaXZlciBpZiBpdCB3YW50cyB0byB0cmFuc21pdCBvbiBhIGdpdmVuIFRTICovCitzdHJ1Y3QgbXNnYiAqZTFpbnBfdHhfdHMoc3RydWN0IGUxaW5wX3RzICplMWlfdHMsCisJCQkgc3RydWN0IGUxaW5wX3NpZ25fbGluayAqKnNpZ25fbGluaykKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCXN0cnVjdCBtc2diICptc2cgPSBOVUxMOworCWludCBsZW47CisKKwlzd2l0Y2ggKGUxaV90cy0+dHlwZSkgeworCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQkvKiBGSVhNRTogaW1wbGVtZW50IHRoaXMgcm91bmQgcm9iaW4gKi8KKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluaywgJmUxaV90cy0+c2lnbi5zaWduX2xpbmtzLCBsaXN0KSB7CisJCQltc2cgPSBtc2diX2RlcXVldWUoJmxpbmstPnR4X2xpc3QpOworCQkJaWYgKG1zZykgeworCQkJCWlmIChzaWduX2xpbmspCisJCQkJCSpzaWduX2xpbmsgPSBsaW5rOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQltc2cgPSBtc2diX2FsbG9jKFRTWF9BTExPQ19TSVpFLCAiVFJBVV9UWCIpOworCQlpZiAoIW1zZykKKwkJCXJldHVybiBOVUxMOworCQlsZW4gPSBzdWJjaGFuX211eF9vdXQoJmUxaV90cy0+dHJhdS5tdXgsIG1zZy0+ZGF0YSwgNDApOworCQltc2diX3B1dChtc2csIDQwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETUksIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZCBFMSBUUyB0eXBlICV1XG4iLCBlMWlfdHMtPnR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIG1zZzsKK30KKworLyogY2FsbGVkIGJ5IGRyaXZlciBpbiBjYXNlIHNvbWUga2luZCBvZiBsaW5rIHN0YXRlIGV2ZW50ICovCitpbnQgZTFpbnBfZXZlbnQoc3RydWN0IGUxaW5wX3RzICp0cywgaW50IGV2dCwgdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisKKwlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayh0cywgdGVpLCBzYXBpKTsKKwlpZiAoIWxpbmspCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRklYTUU6IHJlcG9ydCBmdXJ0aGVyIHVwd2FyZHMgKi8KKwlpbnB1dF9ldmVudChldnQsIGxpbmstPnR5cGUsIGxpbmstPnRyeCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlZ2lzdGVyIGEgZHJpdmVyIHdpdGggdGhlIEUxIGNvcmUgKi8KK2ludCBlMWlucF9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGUxaW5wX2RyaXZlciAqZHJ2KQoreworCWxsaXN0X2FkZF90YWlsKCZkcnYtPmxpc3QsICZlMWlucF9kcml2ZXJfbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBlMWlucF9saW5lX3VwZGF0ZShzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSkKK3sKKwlyZXR1cm4gbWlfZTFfbGluZV91cGRhdGUobGluZSk7Cit9CisKK3N0YXRpYyBpbnQgZTFpX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkgICAgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCWlmIChzdWJzeXMgIT0gU1NfR0xPQkFMIHx8CisJICAgIHNpZ25hbCAhPSBTX0dMT0JBTF9TSFVURE9XTikKKwkJcmV0dXJuIDA7CisKKwlpZiAocGNhcF9mZCkgeworCQljbG9zZShwY2FwX2ZkKTsKKwkJcGNhcF9mZCA9IC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX2UxX2lucCh2b2lkKQoreworCXRhbGxfc2lnbF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAxLAorCQkJCQkgICAiZTFpbnBfc2lnbl9saW5rIik7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfR0xPQkFMLCBlMWlfc2lnX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3NyYy9ncHJzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzM1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTggQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlIC1JJCh0b3BfYnVpbGRkaXIpCitBTV9DRkxBR1M9LVdhbGwgJChMSUJPU01PQ09SRV9DRkxBR1MpCitBTV9MREZMQUdTID0gJChMSUJPU01PQ09SRV9MSUJTKQorCitzYmluX1BST0dSQU1TID0gb3Ntby1nYnByb3h5IG9zbW8tc2dzbgorbm9pbnN0X0xJQlJBUklFUyA9IGxpYnNnc24uYQorCitsaWJzZ3NuX2FfU09VUkNFUyA9IGdwcnNfbnMuYyBncHJzX2Jzc2dwLmMgZ3Byc19sbGMuYyBnc21fMDRfMDhfZ3Bycy5jIFwKKwkJY3JjMjQuYyBncHJzX3Nnc24uYyBncHJzX2Jzc2dwX3V0aWwuYworCitvc21vX2dicHJveHlfU09VUkNFUyA9IGdiX3Byb3h5LmMgZ2JfcHJveHlfbWFpbi5jIGdiX3Byb3h5X3Z0eS5jIFwKKwkJCWdwcnNfbnMuYyBncHJzX25zX3Z0eS5jIGdwcnNfYnNzZ3BfdXRpbC5jIFwKKwkJCSQodG9wX3NyY2Rpcikvc3JjL3NvY2tldC5jICQodG9wX3NyY2Rpcikvc3JjL2RlYnVnLmMKK29zbW9fZ2Jwcm94eV9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9zcmMvbGlidnR5LmEKKworb3Ntb19zZ3NuX1NPVVJDRVMgPSBzZ3NuX21haW4uYyBzZ3NuX3Z0eS5jIGdwcnNfbnNfdnR5LmMgXAorCQkJJCh0b3Bfc3JjZGlyKS9zcmMvc29ja2V0LmMgJCh0b3Bfc3JjZGlyKS9zcmMvZGVidWcuYworb3Ntb19zZ3NuX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJ2dHkuYSBsaWJzZ3NuLmEKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvY3JjMjQuYyBiL29wZW5ic2Mvc3JjL2dwcnMvY3JjMjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDgyMTIwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9jcmMyNC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIEdQUlMgTExDIENSQy0yNCBJbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NyYzI0Lmg+CisKKy8qIENSQzI0IHRhYmxlIC0gRkNTICovCitzdGF0aWMgY29uc3QgdV9pbnQzMl90IHRibF9jcmMyNFsyNTZdID0geworCTB4MDAwMDAwMDAsIDB4MDBkNmE3NzYsIDB4MDBmNjQ1NTcsIDB4MDAyMGUyMjEsIDB4MDBiNzgxMTUsIDB4MDA2MTI2NjMsIDB4MDA0MWM0NDIsIDB4MDA5NzYzMzQsCisJMHgwMDM0MDk5MSwgMHgwMGUyYWVlNywgMHgwMGMyNGNjNiwgMHgwMDE0ZWJiMCwgMHgwMDgzODg4NCwgMHgwMDU1MmZmMiwgMHgwMDc1Y2RkMywgMHgwMGEzNmFhNSwKKwkweDAwNjgxMzIyLCAweDAwYmViNDU0LCAweDAwOWU1Njc1LCAweDAwNDhmMTAzLCAweDAwZGY5MjM3LCAweDAwMDkzNTQxLCAweDAwMjlkNzYwLCAweDAwZmY3MDE2LAorCTB4MDA1YzFhYjMsIDB4MDA4YWJkYzUsIDB4MDBhYTVmZTQsIDB4MDA3Y2Y4OTIsIDB4MDBlYjliYTYsIDB4MDAzZDNjZDAsIDB4MDAxZGRlZjEsIDB4MDBjYjc5ODcsCisJMHgwMGQwMjY0NCwgMHgwMDA2ODEzMiwgMHgwMDI2NjMxMywgMHgwMGYwYzQ2NSwgMHgwMDY3YTc1MSwgMHgwMGIxMDAyNywgMHgwMDkxZTIwNiwgMHgwMDQ3NDU3MCwKKwkweDAwZTQyZmQ1LCAweDAwMzI4OGEzLCAweDAwMTI2YTgyLCAweDAwYzRjZGY0LCAweDAwNTNhZWMwLCAweDAwODUwOWI2LCAweDAwYTVlYjk3LCAweDAwNzM0Y2UxLAorCTB4MDBiODM1NjYsIDB4MDA2ZTkyMTAsIDB4MDA0ZTcwMzEsIDB4MDA5OGQ3NDcsIDB4MDAwZmI0NzMsIDB4MDBkOTEzMDUsIDB4MDBmOWYxMjQsIDB4MDAyZjU2NTIsCisJMHgwMDhjM2NmNywgMHgwMDVhOWI4MSwgMHgwMDdhNzlhMCwgMHgwMGFjZGVkNiwgMHgwMDNiYmRlMiwgMHgwMGVkMWE5NCwgMHgwMGNkZjhiNSwgMHgwMDFiNWZjMywKKwkweDAwZmI0NzMzLCAweDAwMmRlMDQ1LCAweDAwMGQwMjY0LCAweDAwZGJhNTEyLCAweDAwNGNjNjI2LCAweDAwOWE2MTUwLCAweDAwYmE4MzcxLCAweDAwNmMyNDA3LAorCTB4MDBjZjRlYTIsIDB4MDAxOWU5ZDQsIDB4MDAzOTBiZjUsIDB4MDBlZmFjODMsIDB4MDA3OGNmYjcsIDB4MDBhZTY4YzEsIDB4MDA4ZThhZTAsIDB4MDA1ODJkOTYsCisJMHgwMDkzNTQxMSwgMHgwMDQ1ZjM2NywgMHgwMDY1MTE0NiwgMHgwMGIzYjYzMCwgMHgwMDI0ZDUwNCwgMHgwMGYyNzI3MiwgMHgwMGQyOTA1MywgMHgwMDA0MzcyNSwKKwkweDAwYTc1ZDgwLCAweDAwNzFmYWY2LCAweDAwNTExOGQ3LCAweDAwODdiZmExLCAweDAwMTBkYzk1LCAweDAwYzY3YmUzLCAweDAwZTY5OWMyLCAweDAwMzAzZWI0LAorCTB4MDAyYjYxNzcsIDB4MDBmZGM2MDEsIDB4MDBkZDI0MjAsIDB4MDAwYjgzNTYsIDB4MDA5Y2UwNjIsIDB4MDA0YTQ3MTQsIDB4MDA2YWE1MzUsIDB4MDBiYzAyNDMsCisJMHgwMDFmNjhlNiwgMHgwMGM5Y2Y5MCwgMHgwMGU5MmRiMSwgMHgwMDNmOGFjNywgMHgwMGE4ZTlmMywgMHgwMDdlNGU4NSwgMHgwMDVlYWNhNCwgMHgwMDg4MGJkMiwKKwkweDAwNDM3MjU1LCAweDAwOTVkNTIzLCAweDAwYjUzNzAyLCAweDAwNjM5MDc0LCAweDAwZjRmMzQwLCAweDAwMjI1NDM2LCAweDAwMDJiNjE3LCAweDAwZDQxMTYxLAorCTB4MDA3NzdiYzQsIDB4MDBhMWRjYjIsIDB4MDA4MTNlOTMsIDB4MDA1Nzk5ZTUsIDB4MDBjMGZhZDEsIDB4MDAxNjVkYTcsIDB4MDAzNmJmODYsIDB4MDBlMDE4ZjAsCisJMHgwMGFkODVkZCwgMHgwMDdiMjJhYiwgMHgwMDViYzA4YSwgMHgwMDhkNjdmYywgMHgwMDFhMDRjOCwgMHgwMGNjYTNiZSwgMHgwMGVjNDE5ZiwgMHgwMDNhZTZlOSwKKwkweDAwOTk4YzRjLCAweDAwNGYyYjNhLCAweDAwNmZjOTFiLCAweDAwYjk2ZTZkLCAweDAwMmUwZDU5LCAweDAwZjhhYTJmLCAweDAwZDg0ODBlLCAweDAwMGVlZjc4LAorCTB4MDBjNTk2ZmYsIDB4MDAxMzMxODksIDB4MDAzM2QzYTgsIDB4MDBlNTc0ZGUsIDB4MDA3MjE3ZWEsIDB4MDBhNGIwOWMsIDB4MDA4NDUyYmQsIDB4MDA1MmY1Y2IsCisJMHgwMGYxOWY2ZSwgMHgwMDI3MzgxOCwgMHgwMDA3ZGEzOSwgMHgwMGQxN2Q0ZiwgMHgwMDQ2MWU3YiwgMHgwMDkwYjkwZCwgMHgwMGIwNWIyYywgMHgwMDY2ZmM1YSwKKwkweDAwN2RhMzk5LCAweDAwYWIwNGVmLCAweDAwOGJlNmNlLCAweDAwNWQ0MWI4LCAweDAwY2EyMjhjLCAweDAwMWM4NWZhLCAweDAwM2M2N2RiLCAweDAwZWFjMGFkLAorCTB4MDA0OWFhMDgsIDB4MDA5ZjBkN2UsIDB4MDBiZmVmNWYsIDB4MDA2OTQ4MjksIDB4MDBmZTJiMWQsIDB4MDAyODhjNmIsIDB4MDAwODZlNGEsIDB4MDBkZWM5M2MsCisJMHgwMDE1YjBiYiwgMHgwMGMzMTdjZCwgMHgwMGUzZjVlYywgMHgwMDM1NTI5YSwgMHgwMGEyMzFhZSwgMHgwMDc0OTZkOCwgMHgwMDU0NzRmOSwgMHgwMDgyZDM4ZiwKKwkweDAwMjFiOTJhLCAweDAwZjcxZTVjLCAweDAwZDdmYzdkLCAweDAwMDE1YjBiLCAweDAwOTYzODNmLCAweDAwNDA5ZjQ5LCAweDAwNjA3ZDY4LCAweDAwYjZkYTFlLAorCTB4MDA1NmMyZWUsIDB4MDA4MDY1OTgsIDB4MDBhMDg3YjksIDB4MDA3NjIwY2YsIDB4MDBlMTQzZmIsIDB4MDAzN2U0OGQsIDB4MDAxNzA2YWMsIDB4MDBjMWExZGEsCisJMHgwMDYyY2I3ZiwgMHgwMGI0NmMwOSwgMHgwMDk0OGUyOCwgMHgwMDQyMjk1ZSwgMHgwMGQ1NGE2YSwgMHgwMDAzZWQxYywgMHgwMDIzMGYzZCwgMHgwMGY1YTg0YiwKKwkweDAwM2VkMWNjLCAweDAwZTg3NmJhLCAweDAwYzg5NDliLCAweDAwMWUzM2VkLCAweDAwODk1MGQ5LCAweDAwNWZmN2FmLCAweDAwN2YxNThlLCAweDAwYTliMmY4LAorCTB4MDAwYWQ4NWQsIDB4MDBkYzdmMmIsIDB4MDBmYzlkMGEsIDB4MDAyYTNhN2MsIDB4MDBiZDU5NDgsIDB4MDA2YmZlM2UsIDB4MDA0YjFjMWYsIDB4MDA5ZGJiNjksCisJMHgwMDg2ZTRhYSwgMHgwMDUwNDNkYywgMHgwMDcwYTFmZCwgMHgwMGE2MDY4YiwgMHgwMDMxNjViZiwgMHgwMGU3YzJjOSwgMHgwMGM3MjBlOCwgMHgwMDExODc5ZSwKKwkweDAwYjJlZDNiLCAweDAwNjQ0YTRkLCAweDAwNDRhODZjLCAweDAwOTIwZjFhLCAweDAwMDU2YzJlLCAweDAwZDNjYjU4LCAweDAwZjMyOTc5LCAweDAwMjU4ZTBmLAorCTB4MDBlZWY3ODgsIDB4MDAzODUwZmUsIDB4MDAxOGIyZGYsIDB4MDBjZTE1YTksIDB4MDA1OTc2OWQsIDB4MDA4ZmQxZWIsIDB4MDBhZjMzY2EsIDB4MDA3OTk0YmMsCisJMHgwMGRhZmUxOSwgMHgwMDBjNTk2ZiwgMHgwMDJjYmI0ZSwgMHgwMGZhMWMzOCwgMHgwMDZkN2YwYywgMHgwMGJiZDg3YSwgMHgwMDliM2E1YiwgMHgwMDRkOWQyZAorfTsKKworI2RlZmluZSBJTklUX0NSQzI0CTB4ZmZmZmZmCisKK3VfaW50MzJfdCBjcmMyNF9jYWxjKHVfaW50MzJfdCBmY3MsIHVfaW50OF90ICpjcCwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuLS0pCisJCWZjcyA9IChmY3MgPj4gOCkgXiB0YmxfY3JjMjRbKGZjcyBeICpjcCsrKSAmIDB4ZmZdOworCXJldHVybiBmY3M7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5LmMgYi9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4MGVhMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ2JfcHJveHkuYwpAQCAtMCwwICsxLDU2OCBAQAorLyogTlMtb3Zlci1JUCBwcm94eSAqLworCisvKiAoQykgMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTAgYnkgT24gV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ic3NncC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ2JfcHJveHkuaD4KKworc3RydWN0IGdicHJveF9wZWVyIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJLyogTlMtVkMgb3ZlciB3aGljaCB3ZSBzZW5kL3JlY2VpdmUgZGF0YSB0byB0aGlzIEJWQyAqLworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisKKwkvKiBCVkNJIHVzZWQgZm9yIFBvaW50LXRvLVBvaW50IHRvIHRoaXMgcGVlciAqLworCXVpbnQxNl90IGJ2Y2k7CisKKwkvKiBSb3V0ZWluZyBBcmVhIHRoYXQgdGhpcyBwZWVyIGlzIHBhcnQgb2YgKHJhdyAwNC4wOCBlbmNvZGluZykgKi8KKwl1aW50OF90IHJhWzZdOworfTsKKworLyogTGlua2VkIGxpc3Qgb2YgYWxsIEdiIHBlZXJzIChleGNlcHQgU0dTTikgKi8KK3N0YXRpYyBMTElTVF9IRUFEKGdicHJveF9idHNfcGVlcnMpOworCisvKiBGaW5kIHRoZSBnYnByb3hfcGVlciBieSBpdHMgQlZDSSAqLworc3RhdGljIHN0cnVjdCBnYnByb3hfcGVlciAqcGVlcl9ieV9idmNpKHVpbnQxNl90IGJ2Y2kpCit7CisJc3RydWN0IGdicHJveF9wZWVyICpwZWVyOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBlZXIsICZnYnByb3hfYnRzX3BlZXJzLCBsaXN0KSB7CisJCWlmIChwZWVyLT5idmNpID09IGJ2Y2kpCisJCQlyZXR1cm4gcGVlcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXJfYnlfbnN2YyhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmZ2Jwcm94X2J0c19wZWVycywgbGlzdCkgeworCQlpZiAocGVlci0+bnN2YyA9PSBuc3ZjKQorCQkJcmV0dXJuIHBlZXI7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBsb29rLXVwIGEgcGVlciBieSBpdHMgUm91dGVpbmcgQXJlYSBDb2RlIChSQUMpICovCitzdGF0aWMgc3RydWN0IGdicHJveF9wZWVyICpwZWVyX2J5X3JhYyhjb25zdCB1aW50OF90ICpyYSkKK3sKKwlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXI7CisJbGxpc3RfZm9yX2VhY2hfZW50cnkocGVlciwgJmdicHJveF9idHNfcGVlcnMsIGxpc3QpIHsKKwkJaWYgKCFtZW1jbXAocGVlci0+cmEsIHJhLCA2KSkKKwkJCXJldHVybiBwZWVyOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogbG9vay11cCBhIHBlZXIgYnkgaXRzIExvY2F0aW9uIEFyZWEgQ29kZSAoTEFDKSAqLworc3RhdGljIHN0cnVjdCBnYnByb3hfcGVlciAqcGVlcl9ieV9sYWMoY29uc3QgdWludDhfdCAqbGEpCit7CisJc3RydWN0IGdicHJveF9wZWVyICpwZWVyOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBlZXIsICZnYnByb3hfYnRzX3BlZXJzLCBsaXN0KSB7CisJCWlmICghbWVtY21wKHBlZXItPnJhLCBsYSwgNSkpCisJCQlyZXR1cm4gcGVlcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXJfYWxsb2ModWludDE2X3QgYnZjaSkKK3sKKwlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXI7CisKKwlwZWVyID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZ2Jwcm94X3BlZXIpOworCWlmICghcGVlcikKKwkJcmV0dXJuIE5VTEw7CisKKwlwZWVyLT5idmNpID0gYnZjaTsKKwlsbGlzdF9hZGQoJnBlZXItPmxpc3QsICZnYnByb3hfYnRzX3BlZXJzKTsKKworCXJldHVybiBwZWVyOworfQorCitzdGF0aWMgdm9pZCBwZWVyX2ZyZWUoc3RydWN0IGdicHJveF9wZWVyICpwZWVyKQoreworCWxsaXN0X2RlbCgmcGVlci0+bGlzdCk7CisJdGFsbG9jX2ZyZWUocGVlcik7Cit9CisKKy8qIEZJWE1FOiB0aGlzIG5lZWRzIHRvIGdvIHRvIGxpYm9zbW9jb3JlL21zZ2IuYyAqLworc3RhdGljIHN0cnVjdCBtc2diICptc2diX2NvcHkoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbmV3X21zZzsKKworCW5ld19tc2cgPSBtc2diX2FsbG9jKG1zZy0+ZGF0YV9sZW4sIG5hbWUpOworCWlmICghbmV3X21zZykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBjb3B5IGhlYWRlciAqLworCW1lbWNweShuZXdfbXNnLCBtc2csIHNpemVvZigqbmV3X21zZykpOworCS8qIGNvcHkgZGF0YSAqLworCW1lbWNweShuZXdfbXNnLT5kYXRhLCBtc2ctPmRhdGEsIG5ld19tc2ctPmRhdGFfbGVuKTsKKworCXJldHVybiBuZXdfbXNnOworfQorCisvKiBzdHJpcCBvZmYgdGhlIE5TIGhlYWRlciAqLworc3RhdGljIHZvaWQgc3RyaXBfbnNfaGRyKHN0cnVjdCBtc2diICptc2cpCit7CisJaW50IHN0cmlwX2xlbiA9IG1zZ2JfYnNzZ3BoKG1zZykgLSBtc2ctPmRhdGE7CisJbXNnYl9wdWxsKG1zZywgc3RyaXBfbGVuKTsKK30KKworLyogZmVlZCBhIG1lc3NhZ2UgZG93biB0aGUgTlMtVkMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGVlciAqLworc3RhdGljIGludCBnYnByb3hfcmVsYXkyc2dzbihzdHJ1Y3QgbXNnYiAqb2xkX21zZywgdWludDE2X3QgbnNfYnZjaSkKK3sKKwkvKiBjcmVhdGUgYSBjb3B5IG9mIHRoZSBtZXNzYWdlIHNvIHRoZSBvbGQgb25lIGNhbgorCSAqIGJlIGZyZWUoKWQgc2FmZWx5IHdoZW4gd2UgcmV0dXJuIGZyb20gZ2Jwcm94X3Jjdm1zZygpICovCisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfY29weShvbGRfbXNnLCAibXNnYl9yZWxheTJzZ3NuIik7CisKKwlERUJVR1AoREdQUlMsICJOU0VJPSV1IHByb3h5aW5nIEJUUy0+U0dTTiAoTlNfQlZDST0ldSwgTlNFST0ldSlcbiIsCisJCW1zZ2JfbnNlaShtc2cpLCBuc19idmNpLCBnYmNmZy5uc2lwX3Nnc25fbnNlaSk7CisKKwltc2diX2J2Y2kobXNnKSA9IG5zX2J2Y2k7CisJbXNnYl9uc2VpKG1zZykgPSBnYmNmZy5uc2lwX3Nnc25fbnNlaTsKKworCXN0cmlwX25zX2hkcihtc2cpOworCisJcmV0dXJuIGdwcnNfbnNfc2VuZG1zZyhic3NncF9uc2ksIG1zZyk7Cit9CisKKy8qIGZlZWQgYSBtZXNzYWdlIGRvd24gdGhlIE5TLVZDIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBlZXIgKi8KK3N0YXRpYyBpbnQgZ2Jwcm94X3JlbGF5MnBlZXIoc3RydWN0IG1zZ2IgKm9sZF9tc2csIHN0cnVjdCBnYnByb3hfcGVlciAqcGVlciwKKwkJCSAgdWludDE2X3QgbnNfYnZjaSkKK3sKKwkvKiBjcmVhdGUgYSBjb3B5IG9mIHRoZSBtZXNzYWdlIHNvIHRoZSBvbGQgb25lIGNhbgorCSAqIGJlIGZyZWUoKWQgc2FmZWx5IHdoZW4gd2UgcmV0dXJuIGZyb20gZ2Jwcm94X3Jjdm1zZygpICovCisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfY29weShvbGRfbXNnLCAibXNnYl9yZWxheTJwZWVyIik7CisKKwlERUJVR1AoREdQUlMsICJOU0VJPSV1IHByb3h5aW5nIFNHU04tPkJTUyAoTlNfQlZDST0ldSwgTlNFST0ldSlcbiIsCisJCW1zZ2JfbnNlaShtc2cpLCBuc19idmNpLCBwZWVyLT5uc3ZjLT5uc2VpKTsKKworCW1zZ2JfYnZjaShtc2cpID0gbnNfYnZjaTsKKwltc2diX25zZWkobXNnKSA9IHBlZXItPm5zdmMtPm5zZWk7CisKKwkvKiBTdHJpcCB0aGUgb2xkIE5TIGhlYWRlciwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGEgbmV3IG9uZSAqLworCXN0cmlwX25zX2hkcihtc2cpOworCisJcmV0dXJuIGdwcnNfbnNfc2VuZG1zZyhic3NncF9uc2ksIG1zZyk7Cit9CisKKy8qIFNlbmQgYSBtZXNzYWdlIHRvIGEgcGVlciBpZGVudGlmaWVkIGJ5IHB0cF9idmNpIGJ1dCB1c2luZyBuc19idmNpCisgKiBpbiB0aGUgTlMgaGRyICovCitzdGF0aWMgaW50IGdicHJveF9yZWxheTJidmNpKHN0cnVjdCBtc2diICptc2csIHVpbnQxNl90IHB0cF9idmNpLAorCQkJICB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKworCXBlZXIgPSBwZWVyX2J5X2J2Y2kocHRwX2J2Y2kpOworCWlmICghcGVlcikgeworCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiQ2Fubm90IGZpbmQgQlNTIGZvciBCVkNJICV1XG4iLAorCQkJcHRwX2J2Y2kpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlyZXR1cm4gZ2Jwcm94X3JlbGF5MnBlZXIobXNnLCBwZWVyLCBuc19idmNpKTsKK30KKworLyogUmVjZWl2ZSBhbiBpbmNvbWluZyBzaWduYWxsaW5nIG1lc3NhZ2UgZnJvbSBhIEJTUy1zaWRlIE5TLVZDICovCitzdGF0aWMgaW50IGdicHJveF9yeF9zaWdfZnJvbV9ic3Moc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywKKwkJCQkgIHVpbnQxNl90IG5zX2J2Y2kpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPSAoc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKikgbXNnYl9ic3NncGgobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwl1aW50OF90IHBkdV90eXBlID0gYmdwaC0+cGR1X3R5cGU7CisJaW50IGRhdGFfbGVuID0gbXNnYl9ic3NncF9sZW4obXNnKSAtIHNpemVvZigqYmdwaCk7CisJc3RydWN0IGdicHJveF9wZWVyICpmcm9tX3BlZXI7CisJc3RydWN0IGdwcnNfcmFfaWQgcmFpZDsKKworCWlmIChuc19idmNpICE9IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9OT1RJQ0UsICJOU0VJPSV1IEJWQ0kgJXUgaXMgbm90IHNpZ25hbGxpbmdcbiIsCisJCQluc3ZjLT5uc2VpLCBuc19idmNpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogd2UgYWN0dWFsbHkgc2hvdWxkIG5ldmVyIHNlZSB0aG9zZSB0d28gZm9yIEJWQ0kgPT0gMCwgYnV0IGRvdWJsZS1jaGVjaworCSAqIGp1c3QgdG8gbWFrZSBzdXJlICAqLworCWlmIChwZHVfdHlwZSA9PSBCU1NHUF9QRFVUX1VMX1VOSVREQVRBIHx8CisJICAgIHBkdV90eXBlID09IEJTU0dQX1BEVVRfRExfVU5JVERBVEEpIHsKKwkJTE9HUChER1BSUywgTE9HTF9OT1RJQ0UsICJOU0VJPSV1IFVOSVREQVRBIG5vdCBhbGxvd2VkIGluICIKKwkJCSJzaWduYWxsaW5nXG4iLCBuc3ZjLT5uc2VpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYnNzZ3BfdGx2X3BhcnNlKCZ0cCwgYmdwaC0+ZGF0YSwgZGF0YV9sZW4pOworCisJc3dpdGNoIChwZHVfdHlwZSkgeworCWNhc2UgQlNTR1BfUERVVF9TVVNQRU5EOgorCWNhc2UgQlNTR1BfUERVVF9SRVNVTUU6CisJCS8qIFdlIGltcGxlbWVudCBSQUMgc25vb3BpbmcgZHVyaW5nIFNVU1BFTkQvUkVTVU1FLCBzaW5jZQorCQkgKiBpdCBlc3RhYmxpc2hlcyBhIHJlbGF0aW9uc2lwIGJldHdlZW4gQlZDSS9wZWVyIGFuZCB0aGUKKwkJICogcm91dGVpbmcgYXJlYSBjb2RlLiAgVGhlIHNub29wZWQgaW5mb3JtYXRpb24gaXMgdGhlbgorCQkgKiB1c2VkIGZvciByb3V0aW5nIHRoZSB7U1VTUEVORCxSRVNVTUV9X1tOXUFDSyBiYWNrIHRvCisJCSAqIHRoZSBjb3JyZWN0IEJTU0dQICovCisJCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgQlNTR1BfSUVfUk9VVEVJTkdfQVJFQSkpCisJCQlnb3RvIGVycl9tYW5kX2llOworCQlmcm9tX3BlZXIgPSBwZWVyX2J5X25zdmMobnN2Yyk7CisJCWlmICghZnJvbV9wZWVyKQorCQkJZ290byBlcnJfbm9fcGVlcjsKKwkJbWVtY3B5KGZyb21fcGVlci0+cmEsIFRMVlBfVkFMKCZ0cCwgQlNTR1BfSUVfUk9VVEVJTkdfQVJFQSksCisJCQlzaXplb2YoZnJvbV9wZWVyLT5yYSkpOworCQlnc200OF9wYXJzZV9yYSgmcmFpZCwgZnJvbV9wZWVyLT5yYSk7CisJCUxPR1AoREdQUlMsIExPR0xfSU5GTywgIk5TRUk9JXUgUkFDIHNub29waW5nOiBSQUMgJXUtJXUtJXUtJXUgIgorCQkJImJlaGluZCBCVkNJPSV1LCBOU1ZDST0ldVxuIiwgbnN2Yy0+bnNlaSwgcmFpZC5tY2MsCisJCQlyYWlkLm1uYywgcmFpZC5sYWMsIHJhaWQucmFjICwgZnJvbV9wZWVyLT5idmNpLAorCQkJbnN2Yy0+bnN2Y2kpOworCQkvKiBGSVhNRTogVGhpcyBvbmx5IHN1cHBvcnRzIG9uZSBCU1MgcGVyIFJBICovCisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9CVkNfUkVTRVQ6CisJCS8qIElmIHdlIHJlY2VpdmUgYSBCVkMgcmVzZXQgb24gdGhlIHNpZ25hbGxpbmcgZW5kcG9pbnQsIHdlCisJCSAqIGRvbid0IHdhbnQgdGhlIFNHU04gdG8gcmVzZXQsIGFzIHRoZSBzaWduYWxsaW5nIGVuZHBvaW50CisJCSAqIGlzIGNvbW1vbiBmb3IgYWxsIHBvaW50LXRvLXBvaW50IEJWQ3MgKGFuZCB0aHVzIGFsbCBCVFMpICovCisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9CVkNJKSkgeworCQkJdWludDE2X3QgYnZjaSA9IG50b2hzKCoodWludDE2X3QgKilUTFZQX1ZBTCgmdHAsIEJTU0dQX0lFX0JWQ0kpKTsKKwkJCUxPR1AoREdQUlMsIExPR0xfSU5GTywgIk5TRUk9JXUgUnggQlZDIFJFU0VUIChCVkNJPSV1KVxuIiwKKwkJCQluc3ZjLT5uc2VpLCBidmNpKTsKKwkJCWlmIChidmNpID09IDApIHsKKwkJCQkvKiBGSVhNRTogb25seSBkbyB0aGlzIGlmIFNHU04gaXMgYWxpdmUhICovCisJCQkJTE9HUChER1BSUywgTE9HTF9JTkZPLCAiTlNFST0ldSBUeCBmYWtlICIKKwkJCQkJIkJWQyBSRVNFVCBBQ0sgb2YgQlZDST0wXG4iLCBuc3ZjLT5uc2VpKTsKKwkJCQlyZXR1cm4gYnNzZ3BfdHhfc2ltcGxlX2J2Y2koQlNTR1BfUERVVF9CVkNfUkVTRVRfQUNLLAorCQkJCQkJCSAgICBuc3ZjLT5uc2VpLCAwLCBuc19idmNpKTsKKwkJCX0KKwkJCWZyb21fcGVlciA9IHBlZXJfYnlfYnZjaShidmNpKTsKKwkJCWlmICghZnJvbV9wZWVyKSB7CisJCQkJLyogaWYgYSBQVFAtQlZDIGlzIHJlc2V0LCBhbmQgd2UgZG9uJ3Qga25vdyB0aGF0CisJCQkJICogUFRQLUJWQ0kgeWV0LCB3ZSBzaG91bGQgYWxsb2NhdGUgYSBuZXcgcGVlciAqLworCQkJCUxPR1AoREdQUlMsIExPR0xfSU5GTywgIkFsbG9jYXRpb25nIG5ldyBwZWVyIGZvciAiCisJCQkJICAgICAiQlZDST0ldSB2aWEgTlNWQ0k9JXUvTlNFST0ldVxuIiwgYnZjaSwKKwkJCQkgICAgIG5zdmMtPm5zdmNpLCBuc3ZjLT5uc2VpKTsKKwkJCQlmcm9tX3BlZXIgPSBwZWVyX2FsbG9jKGJ2Y2kpOworCQkJCWZyb21fcGVlci0+bnN2YyA9IG5zdmM7CisJCQl9CisJCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgQlNTR1BfSUVfQ0VMTF9JRCkpIHsKKwkJCQlzdHJ1Y3QgZ3Byc19yYV9pZCByYWlkOworCQkJCS8qIFdlIGhhdmUgYSBDZWxsIElkZW50aWZpZXIgcHJlc2VudCBpbiB0aGlzCisJCQkJICogUERVLCB0aGlzIG1lYW5zIHdlIGNhbiBleHRlbmQgb3VyIGxvY2FsCisJCQkJICogc3RhdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBwYXJ0aWN1bGFyIGNlbGwKKwkJCQkgKiAqLworCQkJCW1lbWNweShmcm9tX3BlZXItPnJhLAorCQkJCQlUTFZQX1ZBTCgmdHAsIEJTU0dQX0lFX0NFTExfSUQpLAorCQkJCQlzaXplb2YoZnJvbV9wZWVyLT5yYSkpOworCQkJCWdzbTQ4X3BhcnNlX3JhKCZyYWlkLCBmcm9tX3BlZXItPnJhKTsKKwkJCQlMT0dQKERHUFJTLCBMT0dMX0lORk8sICJOU0VJPSV1L0JWQ0k9JXUgIgorCQkJCSAgICAgIkNlbGwgSUQgJXUtJXUtJXUtJXVcbiIsIG5zdmMtPm5zZWksCisJCQkJICAgICBidmNpLCByYWlkLm1jYywgcmFpZC5tbmMsIHJhaWQubGFjLAorCQkJCSAgICAgcmFpZC5yYWMpOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCS8qIE5vcm1hbGx5LCB3ZSBjYW4gc2ltcGx5IHBhc3Mgb24gYWxsIHNpZ25hbGxpbmcgbWVzc2FnZXMgZnJvbSBCU1MgdG8KKwkgKiBTR1NOICovCisJcmV0dXJuIGdicHJveF9yZWxheTJzZ3NuKG1zZywgbnNfYnZjaSk7CitlcnJfbm9fcGVlcjoKKwlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiTlNFST0ldShCU1MpIGNhbm5vdCBmaW5kIHBlZXIgYmFzZWQgb24gUkFDXG4iLAorCQluc3ZjLT5uc2VpKTsKKwlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX1VOS05PV05fQlZDSSwgTlVMTCwgbXNnKTsKK2Vycl9tYW5kX2llOgorCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJOU0VJPSV1KEJTUykgbWlzc2luZyBtYW5kYXRvcnkgUkEgSUVcbiIsCisJCW5zdmMtPm5zZWkpOworCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFLCBOVUxMLCBtc2cpOworfQorCisvKiBSZWNlaXZlIHBhZ2luZyByZXF1ZXN0IGZyb20gU0dTTiwgd2UgbmVlZCB0byByZWxheSB0byBwcm9wZXIgQlNTICovCitzdGF0aWMgaW50IGdicHJveF9yeF9wYWdpbmcoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHRsdl9wYXJzZWQgKnRwLAorCQkJICAgIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQxNl90IG5zX2J2Y2kpCit7CisJc3RydWN0IGdicHJveF9wZWVyICpwZWVyOworCisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfQlZDSSkpIHsKKwkJdWludDE2X3QgYnZjaSA9IG50b2hzKCoodWludDE2X3QgKilUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfQlZDSSkpOworCQlyZXR1cm4gZ2Jwcm94X3JlbGF5MmJ2Y2kobXNnLCBidmNpLCBuc19idmNpKTsKKwl9IGVsc2UgaWYgKFRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfUk9VVEVJTkdfQVJFQSkpIHsKKwkJcGVlciA9IHBlZXJfYnlfcmFjKFRMVlBfVkFMKHRwLCBCU1NHUF9JRV9ST1VURUlOR19BUkVBKSk7CisJCXJldHVybiBnYnByb3hfcmVsYXkycGVlcihtc2csIHBlZXIsIG5zX2J2Y2kpOworCX0gZWxzZSBpZiAoVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9MT0NBVElPTl9BUkVBKSkgeworCQlwZWVyID0gcGVlcl9ieV9sYWMoVExWUF9WQUwodHAsIEJTU0dQX0lFX0xPQ0FUSU9OX0FSRUEpKTsKKwkJcmV0dXJuIGdicHJveF9yZWxheTJwZWVyKG1zZywgcGVlciwgbnNfYnZjaSk7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCisvKiBSZWNlaXZlIGFuIGluY29taW5nIEJWQy1SRVNFVCBtZXNzYWdlIGZyb20gdGhlIFNHU04gKi8KK3N0YXRpYyBpbnQgcnhfcmVzZXRfZnJvbV9zZ3NuKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0cCwKKwkJCSAgICAgIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQxNl90IG5zX2J2Y2kpCit7CisJc3RydWN0IGdicHJveF9wZWVyICpwZWVyOworCXVpbnQxNl90IHB0cF9idmNpOworCisJaWYgKCFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX0JWQ0kpKSB7CisJCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFLAorCQkJCSAgICAgICBOVUxMLCBtc2cpOworCX0KKwlwdHBfYnZjaSA9IG50b2hzKCoodWludDE2X3QgKilUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfQlZDSSkpOworCisJaWYgKHB0cF9idmNpID49IDIpIHsKKwkJLyogQSByZXNldCBmb3IgYSBQVFAgQlZDIHdhcyByZWNlaXZlZCwgZm9yd2FyZCBpdCB0byBpdHMKKwkJICogcmVzcGVjdGl2ZSBwZWVyICovCisJCXBlZXIgPSBwZWVyX2J5X2J2Y2kocHRwX2J2Y2kpOworCQlpZiAoIXBlZXIpIHsKKwkJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJDYW5ub3QgZmluZCBCU1MgZm9yIEJWQ0kgJXVcbiIsCisJCQkJcHRwX2J2Y2kpOworCQkJcmV0dXJuIGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9VTktOT1dOX0JWQ0ksCisJCQkJCSAgICAgICBOVUxMLCBtc2cpOworCQl9CisJCXJldHVybiBnYnByb3hfcmVsYXkycGVlcihtc2csIHBlZXIsIG5zX2J2Y2kpOworCX0KKworCS8qIEEgcmVzZXQgZm9yIHRoZSBTaWduYWxsaW5nIGVudGl0eSBoYXMgYmVlbiByZWNlaXZlZAorCSAqIGZyb20gdGhlIFNHU04uICBBcyB0aGUgc2lnbmFsbGluZyBCVkNJIGlzIHNoYXJlZAorCSAqIGFtb25nIGFsbCB0aGUgQlNTJ3MgdGhhdCB3ZSBtdWx0aXBsZXgsIGl0IG5lZWRzIHRvCisJICogYmUgcmVsYXllZCAgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmZ2Jwcm94X2J0c19wZWVycywgbGlzdCkKKwkJZ2Jwcm94X3JlbGF5MnBlZXIobXNnLCBwZWVyLCBuc19idmNpKTsKKworCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIGFuIGluY29taW5nIHNpZ25hbGxpbmcgbWVzc2FnZSBmcm9tIHRoZSBTR1NOLXNpZGUgTlMtVkMgKi8KK3N0YXRpYyBpbnQgZ2Jwcm94X3J4X3NpZ19mcm9tX3Nnc24oc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywKKwkJCQkgICB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBic3NncF9ub3JtYWxfaGRyICpiZ3BoID0gKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdWludDhfdCBwZHVfdHlwZSA9IGJncGgtPnBkdV90eXBlOworCWludCBkYXRhX2xlbiA9IG1zZ2JfYnNzZ3BfbGVuKG1zZykgLSBzaXplb2YoKmJncGgpOworCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlcjsKKwl1aW50MTZfdCBidmNpOworCWludCByYyA9IDA7CisKKwlpZiAobnNfYnZjaSAhPSAwKSB7CisJCUxPR1AoREdQUlMsIExPR0xfTk9USUNFLCAiTlNFST0ldShTR1NOKSBCVkNJICV1IGlzIG5vdCAiCisJCQkic2lnbmFsbGluZ1xuIiwgbnN2Yy0+bnNlaSwgbnNfYnZjaSk7CisJCS8qIEZJWE1FOiBTZW5kIHByb3BlciBlcnJvciBtZXNzYWdlICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHdlIGFjdHVhbGx5IHNob3VsZCBuZXZlciBzZWUgdGhvc2UgdHdvIGZvciBCVkNJID09IDAsIGJ1dCBkb3VibGUtY2hlY2sKKwkgKiBqdXN0IHRvIG1ha2Ugc3VyZSAgKi8KKwlpZiAocGR1X3R5cGUgPT0gQlNTR1BfUERVVF9VTF9VTklUREFUQSB8fAorCSAgICBwZHVfdHlwZSA9PSBCU1NHUF9QRFVUX0RMX1VOSVREQVRBKSB7CisJCUxPR1AoREdQUlMsIExPR0xfTk9USUNFLCAiTlNFST0ldShTR1NOKSBVTklUREFUQSBub3QgYWxsb3dlZCBpbiAiCisJCQkic2lnbmFsbGluZ1xuIiwgbnN2Yy0+bnNlaSk7CisJCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfUFJPVE9fRVJSX1VOU1BFQywgTlVMTCwgbXNnKTsKKwl9CisKKwlyYyA9IGJzc2dwX3Rsdl9wYXJzZSgmdHAsIGJncGgtPmRhdGEsIGRhdGFfbGVuKTsKKworCXN3aXRjaCAocGR1X3R5cGUpIHsKKwljYXNlIEJTU0dQX1BEVVRfQlZDX1JFU0VUOgorCQlyYyA9IHJ4X3Jlc2V0X2Zyb21fc2dzbihtc2csICZ0cCwgbnN2YywgbnNfYnZjaSk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9GTFVTSF9MTDoKKwljYXNlIEJTU0dQX1BEVVRfQlZDX0JMT0NLX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfQlZDX1VOQkxPQ0tfQUNLOgorCWNhc2UgQlNTR1BfUERVVF9CVkNfUkVTRVRfQUNLOgorCQkvKiBzaW1wbGUgY2FzZTogQlZDSSBJRSBpcyBtYW5kYXRvcnkgKi8KKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9CVkNJKSkKKwkJCWdvdG8gZXJyX21hbmRfaWU7CisJCWJ2Y2kgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9CVkNJKSk7CisJCXJjID0gZ2Jwcm94X3JlbGF5MmJ2Y2kobXNnLCBidmNpLCBuc19idmNpKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1BBR0lOR19QUzoKKwljYXNlIEJTU0dQX1BEVVRfUEFHSU5HX0NTOgorCQkvKiBwcm9jZXNzIHRoZSBwYWdpbmcgcmVxdWVzdCAoTEFDL1JBQyBsb29rdXApICovCisJCXJjID0gZ2Jwcm94X3J4X3BhZ2luZyhtc2csICZ0cCwgbnN2YywgbnNfYnZjaSk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9TVEFUVVM6CisJCS8qIFNvbWUgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCAqLworCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwKKwkJCSJOU0VJPSV1KFNHU04pIFNUQVRVUyAiLCBuc3ZjLT5uc2VpKTsKKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9DQVVTRSkpIHsKKwkJCUxPR1BDKERHUFJTLCBMT0dMX05PVElDRSwgIlxuIik7CisJCQlnb3RvIGVycl9tYW5kX2llOworCQl9CisJCUxPR1BDKERHUFJTLCBMT0dMX05PVElDRSwKKwkJCSJjYXVzZT0weCUwMngoJXMpICIsICpUTFZQX1ZBTCgmdHAsIEJTU0dQX0lFX0NBVVNFKSwKKwkJCWJzc2dwX2NhdXNlX3N0cigqVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9DQVVTRSkpKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX0JWQ0kpKSB7CisJCQl1aW50MTZfdCAqYnZjaSA9ICh1aW50MTZfdCAqKQorCQkJCQkJVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9CVkNJKTsKKwkJCUxPR1BDKERHUFJTLCBMT0dMX05PVElDRSwKKwkJCQkiQlZDST0ldVxuIiwgbnRvaHMoKmJ2Y2kpKTsKKwkJfSBlbHNlCisJCQlMT0dQQyhER1BSUywgTE9HTF9OT1RJQ0UsICJcbiIpOworCQlicmVhazsKKwkvKiB0aG9zZSBvbmx5IGV4aXN0IGluIHRoZSBTR1NOIC0+IEJTUyBkaXJlY3Rpb24gKi8KKwljYXNlIEJTU0dQX1BEVVRfU1VTUEVORF9BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX1NVU1BFTkRfTkFDSzoKKwljYXNlIEJTU0dQX1BEVVRfUkVTVU1FX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfUkVTVU1FX05BQ0s6CisJCS8qIFJBQyBJRSBpcyBtYW5kYXRvcnkgKi8KKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9ST1VURUlOR19BUkVBKSkKKwkJCWdvdG8gZXJyX21hbmRfaWU7CisJCXBlZXIgPSBwZWVyX2J5X3JhYyhUTFZQX1ZBTCgmdHAsIEJTU0dQX0lFX1JPVVRFSU5HX0FSRUEpKTsKKwkJaWYgKCFwZWVyKQorCQkJZ290byBlcnJfbm9fcGVlcjsKKwkJcmMgPSBnYnByb3hfcmVsYXkycGVlcihtc2csIHBlZXIsIG5zX2J2Y2kpOworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfU0dTTl9JTlZPS0VfVFJBQ0U6CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsCisJCSAgICAgIk5TRUk9JXUoU0dTTikgSU5WT0tFIFRSQUNFIG5vdCBzdXBwb3J0ZWRcbiIsIG5zdmMtPm5zZWkpOworCQlyYyA9IGJzc2dwX3R4X3N0YXR1cyhCU1NHUF9DQVVTRV9QRFVfSU5DT01QX0ZFQVQsIE5VTEwsIG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoREdQUlMsIExPR0xfTk9USUNFLCAiQlNTR1AgUERVIHR5cGUgMHglMDJ4IHVua25vd25cbiIsCisJCQlwZHVfdHlwZSk7CisJCXJjID0gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMsIE5VTEwsIG1zZyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK2Vycl9tYW5kX2llOgorCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJOU0VJPSV1KFNHU04pIG1pc3NpbmcgbWFuZGF0b3J5IElFXG4iLAorCQluc3ZjLT5uc2VpKTsKKwlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX01JU1NJTkdfTUFORF9JRSwgTlVMTCwgbXNnKTsKK2Vycl9ub19wZWVyOgorCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJOU0VJPSV1KFNHU04pIGNhbm5vdCBmaW5kIHBlZXIgYmFzZWQgb24gUkFDXG4iLAorCQluc3ZjLT5uc2VpKTsKKwlyZXR1cm4gYnNzZ3BfdHhfc3RhdHVzKEJTU0dQX0NBVVNFX1VOS05PV05fQlZDSSwgTlVMTCwgbXNnKTsKK30KKworLyogTWFpbiBpbnB1dCBmdW5jdGlvbiBmb3IgR2IgcHJveHkgKi8KK2ludCBnYnByb3hfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQxNl90IG5zX2J2Y2kpCit7CisJaW50IHJjOworCisJLyogT25seSBCVkNJPTAgbWVzc2FnZXMgbmVlZCBzcGVjaWFsIHRyZWF0bWVudCAqLworCWlmIChuc19idmNpID09IDAgfHwgbnNfYnZjaSA9PSAxKSB7CisJCWlmIChuc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24pCisJCQlyYyA9IGdicHJveF9yeF9zaWdfZnJvbV9zZ3NuKG1zZywgbnN2YywgbnNfYnZjaSk7CisJCWVsc2UKKwkJCXJjID0gZ2Jwcm94X3J4X3NpZ19mcm9tX2Jzcyhtc2csIG5zdmMsIG5zX2J2Y2kpOworCX0gZWxzZSB7CisJCS8qIEFsbCBvdGhlciBCVkNJIGFyZSBQVFAgYW5kIHRodXMgY2FuIGJlIHNpbXBseSBmb3J3YXJkZWQgKi8KKwkJaWYgKCFuc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24pIHsKKwkJCXJjID0gZ2Jwcm94X3JlbGF5MnNnc24obXNnLCBuc19idmNpKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBnYnByb3hfcGVlciAqcGVlciA9IHBlZXJfYnlfYnZjaShuc19idmNpKTsKKwkJCWlmICghcGVlcikgeworCQkJCUxPR1AoREdQUlMsIExPR0xfSU5GTywgIkFsbG9jYXRpb25nIG5ldyBwZWVyIGZvciAiCisJCQkJICAgICAiQlZDST0ldSB2aWEgTlNWQz0ldS9OU0VJPSV1XG4iLCBuc19idmNpLAorCQkJCSAgICAgbnN2Yy0+bnN2Y2ksIG5zdmMtPm5zZWkpOworCQkJCXBlZXIgPSBwZWVyX2FsbG9jKG5zX2J2Y2kpOworCQkJCXBlZXItPm5zdmMgPSBuc3ZjOworCQkJfQorCQkJcmMgPSBnYnByb3hfcmVsYXkycGVlcihtc2csIHBlZXIsIG5zX2J2Y2kpOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBTaWduYWwgaGFuZGxlciBmb3Igc2lnbmFscyBmcm9tIE5TIGxheWVyICovCitpbnQgZ2Jwcm94X3NpZ25hbCh1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkgIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IG5zX3NpZ25hbF9kYXRhICpuc3NkID0gc2lnbmFsX2RhdGE7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YyA9IG5zc2QtPm5zdmM7CisJc3RydWN0IGdicHJveF9wZWVyICpwZWVyOworCisJaWYgKHN1YnN5cyAhPSBTU19OUykKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2lnbmFsID09IFNfTlNfUkVTRVQgJiYgbnN2Yy0+bnNlaSA9PSBnYmNmZy5uc2lwX3Nnc25fbnNlaSkgeworCQkvKiBXZSBoYXZlIHJlY2VpdmVkIGEgTlMtUkVTRVQgZnJvbSB0aGUgTlNFSSBhbmQgTlNWQworCQkgKiBvZiB0aGUgU0dTTi4gIFRoaXMgbWlnaHQgaGFwcGVuIHdpdGggU0dTTiB0aGF0IHN0YXJ0CisJCSAqIHRoZWlyIG93biBOUy1SRVNFVCBwcm9jZWR1cmUgd2l0aG91dCB3YWl0aW5nIGZvciBvdXIKKwkJICogTlMtUkVTRVQgKi8KKwkJbnN2Yy0+cmVtb3RlX2VuZF9pc19zZ3NuID0gMTsKKwl9CisKKwlpZiAoc2lnbmFsID09IFNfTlNfQUxJVkVfRVhQICYmIG5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbikgeworCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwgIlRucyBhbGl2ZSBleHBpcmVkIHRvbyBvZnRlbiwgIgorCQkJInJlLXN0YXJ0aW5nIFJFU0VUIHByb2NlZHVyZVxuIik7CisJCW5zaXBfY29ubmVjdChuc3ZjLT5uc2ksICZuc3ZjLT5pcC5idHNfYWRkciwgbnN2Yy0+bnNlaSwKKwkJCSAgICAgbnN2Yy0+bnN2Y2kpOworCX0KKworCS8qIFdlIGN1cnJlbnRseSBvbmx5IGNhcmUgYWJvdXQgc2lnbmFscyBmcm9tIHRoZSBTR1NOICovCisJaWYgKCFuc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24pCisJCXJldHVybiAwOworCisJLyogaXRlcmF0ZSBvdmVyIGFsbCBCVFMgcGVlcnMgYW5kIHNlbmQgdGhlIHJlc3BlY3RpdmUgUERVICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkocGVlciwgJmdicHJveF9idHNfcGVlcnMsIGxpc3QpIHsKKwkJc3dpdGNoIChzaWduYWwpIHsKKwkJY2FzZSBTX05TX1JFU0VUOgorCQkJZ3Byc19uc190eF9yZXNldChwZWVyLT5uc3ZjLCBuc3NkLT5jYXVzZSk7CisJCQlicmVhazsKKwkJY2FzZSBTX05TX0JMT0NLOgorCQkJZ3Byc19uc190eF9ibG9jayhwZWVyLT5uc3ZjLCBuc3NkLT5jYXVzZSk7CisJCQlicmVhazsKKwkJY2FzZSBTX05TX1VOQkxPQ0s6CisJCQlncHJzX25zX3R4X3VuYmxvY2socGVlci0+bnN2Yyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKworZ0RFRlVOKHNob3dfZ2Jwcm94eSwgc2hvd19nYnByb3h5X2NtZCwgInNob3cgZ2Jwcm94eSIsCisgICAgICAgU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEdiIHByb3h5IikKK3sKKwlzdHJ1Y3QgZ2Jwcm94X3BlZXIgKnBlZXI7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmZ2Jwcm94X2J0c19wZWVycywgbGlzdCkgeworCQlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjID0gcGVlci0+bnN2YzsKKwkJc3RydWN0IGdwcnNfcmFfaWQgcmFpZDsKKwkJZ3NtNDhfcGFyc2VfcmEoJnJhaWQsIHBlZXItPnJhKTsKKworCQl2dHlfb3V0KHZ0eSwgIk5TRUkgJTV1LCBOUy1WQyAlNXUsIFBUUC1CVkNJICV1LCAiCisJCQkiUkFDICV1LSV1LSV1LSV1JXMiLAorCQkJbnN2Yy0+bnNlaSwgbnN2Yy0+bnN2Y2ksIHBlZXItPmJ2Y2ksCisJCQlyYWlkLm1jYywgcmFpZC5tbmMsIHJhaWQubGFjLCByYWlkLnJhYywgVlRZX05FV0xJTkUpOworCQlpZiAobnN2Yy0+bnNpLT5sbCA9PSBHUFJTX05TX0xMX1VEUCkKKwkJCXZ0eV9vdXQodnR5LCAiICByZW1vdGUgYWRkcmVzcyAlczoldSVzIiwKKwkJCQlpbmV0X250b2EobnN2Yy0+aXAuYnRzX2FkZHIuc2luX2FkZHIpLAorCQkJCW50b2hzKG5zdmMtPmlwLmJ0c19hZGRyLnNpbl9wb3J0KSwgVlRZX05FV0xJTkUpOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5X21haW4uYyBiL29wZW5ic2Mvc3JjL2dwcnMvZ2JfcHJveHlfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOGYxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5X21haW4uYwpAQCAtMCwwICsxLDE4OCBAQAorLyogTlMtb3Zlci1JUCBwcm94eSAqLworCisvKiAoQykgMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTAgYnkgT24gV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3JhdGVfY3RyLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Z0eS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ2JfcHJveHkuaD4KKworI2luY2x1ZGUgIi4uLy4uL2JzY2NvbmZpZy5oIgorCisvKiB0aGlzIGlzIGhlcmUgZm9yIHRoZSB2dHkuLi4gaXQgd2lsbCBuZXZlciBiZSBjYWxsZWQgKi8KK3ZvaWQgc3Vic2NyX3B1dCgpIHsgYWJvcnQoKTsgfQorCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3ZvaWQgKnRhbGxfYnNjX2N0eDsKKworY29uc3QgY2hhciAqb3BlbmJzY192ZXJzaW9uID0gIk9zbW9jb20gTlNJUCBQcm94eSAiIFBBQ0tBR0VfVkVSU0lPTjsKK2NvbnN0IGNoYXIgKm9wZW5ic2NfY29weXJpZ2h0ID0KKwkiQ29weXJpZ2h0IChDKSAyMDEwIEhhcmFsZCBXZWx0ZSBhbmQgT24tV2F2ZXNcbiIKKwkiQ29udHJpYnV0aW9ucyBieSBEYW5pZWwgV2lsbG1hbm4sIEphbiBMw7xiYmUsIFN0ZWZhbiBTY2htaWR0XG4iCisJIkRpZXRlciBTcGFhciwgQW5kcmVhcyBFdmVyc2JlcmcsIEhvbGdlciBGcmV5dGhlclxuXG4iCisJIkxpY2Vuc2UgR1BMdjIrOiBHTlUgR1BMIHZlcnNpb24gMiBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+XG4iCisJIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmlidXRlIGl0LlxuIgorCSJUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3LlxuIjsKKworc3RhdGljIGNoYXIgKmNvbmZpZ19maWxlID0gIm9zbW9fZ2Jwcm94eS5jZmciOworc3RydWN0IGdicHJveHlfY29uZmlnIGdiY2ZnOworCisvKiBQb2ludGVyIHRvIHRoZSBTR1NOIHBlZXIgKi8KK2V4dGVybiBzdHJ1Y3QgZ2Jwcm94X3BlZXIgKmdicHJveF9wZWVyX3Nnc247CisKKy8qIGNhbGwtYmFjayBmdW5jdGlvbiBmb3IgdGhlIE5TIHByb3RvY29sICovCitzdGF0aWMgaW50IHByb3h5X25zX2NiKGVudW0gZ3Byc19uc19ldnQgZXZlbnQsIHN0cnVjdCBncHJzX25zdmMgKm5zdmMsCisJCSAgICAgIHN0cnVjdCBtc2diICptc2csIHVfaW50MTZfdCBidmNpKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBHUFJTX05TX0VWVF9VTklUX0RBVEE6CisJCXJjID0gZ2Jwcm94X3Jjdm1zZyhtc2csIG5zdmMsIGJ2Y2kpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERHUFJTLCBMT0dMX0VSUk9SLCAiU0dTTjogVW5rbm93biBldmVudCAldSBmcm9tIE5TXG4iLCBldmVudCk7CisJCWlmIChtc2cpCisJCQl0YWxsb2NfZnJlZShtc2cpOworCQlyYyA9IC1FSU87CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWduYWwpCit7CisJZnByaW50ZihzdGRvdXQsICJzaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHSU5UOgorCQlkaXNwYXRjaF9zaWduYWwoU1NfR0xPQkFMLCBTX0dMT0JBTF9TSFVURE9XTiwgTlVMTCk7CisJCXNsZWVwKDEpOworCQlleGl0KDApOworCQlicmVhazsKKwljYXNlIFNJR0FCUlQ6CisJCS8qIGluIGNhc2Ugb2YgYWJvcnQsIHdlIHdhbnQgdG8gb2J0YWluIGEgdGFsbG9jIHJlcG9ydAorCQkgKiBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MgKi8KKwljYXNlIFNJR1VTUjE6CisJCXRhbGxvY19yZXBvcnQodGFsbF92dHlfY3R4LCBzdGRlcnIpOworCQl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF9ic2NfY3R4LCBzdGRlcnIpOworCQlicmVhazsKKwljYXNlIFNJR1VTUjI6CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX3Z0eV9jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworZXh0ZXJuIHZvaWQgKnRhbGxfbXNnYl9jdHg7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgZHVtbXlfbmV0d29yazsKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCWludCByYzsKKworCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAwLCAibnNpcF9wcm94eSIpOworCXRhbGxfbXNnYl9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAibXNnYiIpOworCisJc2lnbmFsKFNJR0lOVCwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHQUJSVCwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHVVNSMSwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHVVNSMiwgJnNpZ25hbF9oYW5kbGVyKTsKKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwlsb2dfaW5pdCgmbG9nX2luZm8pOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisKKwlyYXRlX2N0cl9pbml0KHRhbGxfYnNjX2N0eCk7CisJdGVsbmV0X2luaXQoJmR1bW15X25ldHdvcmssIDQyNDYpOworCisJYnNzZ3BfbnNpID0gZ3Byc19uc19pbnN0YW50aWF0ZSgmcHJveHlfbnNfY2IpOworCWlmICghYnNzZ3BfbnNpKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJVbmFibGUgdG8gaW5zdGFudGlhdGUgTlNcbiIpOworCQlleGl0KDEpOworCX0KKwlnYmNmZy5uc2kgPSBic3NncF9uc2k7CisJZ3Byc19uc192dHlfaW5pdChic3NncF9uc2kpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX05TLCAmZ2Jwcm94X3NpZ25hbCwgTlVMTCk7CisKKwlyYyA9IGdicHJveHlfcGFyc2VfY29uZmlnKGNvbmZpZ19maWxlLCAmZ2JjZmcpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9GQVRBTCwgIkNhbm5vdCBwYXJzZSBjb25maWcgZmlsZVxuIik7CisJCWV4aXQoMik7CisJfQorCisJbnNpcF9saXN0ZW4oYnNzZ3BfbnNpLCBnYmNmZy5uc2lwX2xpc3Rlbl9wb3J0KTsKKworCS8qICdlc3RhYmxpc2gnIHRoZSBvdXRnb2luZyBjb25uZWN0aW9uIHRvIHRoZSBTR1NOICovCisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNpbi5zaW5fcG9ydCA9IGh0b25zKGdiY2ZnLm5zaXBfc2dzbl9wb3J0KTsKKwlzaW4uc2luX2FkZHIuc19hZGRyID0gaHRvbmwoZ2JjZmcubnNpcF9zZ3NuX2lwKTsKKwluc2lwX2Nvbm5lY3QoYnNzZ3BfbnNpLCAmc2luLCBnYmNmZy5uc2lwX3Nnc25fbnNlaSwKKwkJCWdiY2ZnLm5zaXBfc2dzbl9uc3ZjaSk7CisKKwl3aGlsZSAoMSkgeworCQlyYyA9IGJzY19zZWxlY3RfbWFpbigwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQoMyk7CisJfQorCisJZXhpdCgwKTsKK30KKworc3RydWN0IGdzbV9uZXR3b3JrOworaW50IGJzY192dHlfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKmR1bW15KQoreworCWNtZF9pbml0KDEpOworCXZ0eV9pbml0KCk7CisKKwlvcGVuYnNjX3Z0eV9hZGRfY21kcygpOworICAgICAgICBnYnByb3h5X3Z0eV9pbml0KCk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ2JfcHJveHlfdnR5LmMgYi9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5X3Z0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxY2Y5N2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2diX3Byb3h5X3Z0eS5jCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2diX3Byb3h5Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisKKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworc3RhdGljIHN0cnVjdCBnYnByb3h5X2NvbmZpZyAqZ19jZmcgPSBOVUxMOworCisvKgorICogdnR5IGNvZGUgZm9yIG1nY3AgYmVsb3cKKyAqLworc3RhdGljIHN0cnVjdCBjbWRfbm9kZSBnYnByb3h5X25vZGUgPSB7CisJR0JQUk9YWV9OT0RFLAorCSIlcyhnYnByb3h5KSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9nYnByb3h5KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCXZ0eV9vdXQodnR5LCAiZ2Jwcm94eSVzIiwgVlRZX05FV0xJTkUpOworCisJaWYgKGdfY2ZnLT5uc2lwX2xpc3Rlbl9pcCkgeworCQlpYS5zX2FkZHIgPSBodG9ubChnX2NmZy0+bnNpcF9saXN0ZW5faXApOworCQl2dHlfb3V0KHZ0eSwgIiBuc2lwIGJzcyBsb2NhbCBpcCAlcyVzIiwgaW5ldF9udG9hKGlhKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwl9CisJdnR5X291dCh2dHksICIgbnNpcCBic3MgbG9jYWwgcG9ydCAldSVzIiwgZ19jZmctPm5zaXBfbGlzdGVuX3BvcnQsCisJCVZUWV9ORVdMSU5FKTsKKwlpYS5zX2FkZHIgPSBodG9ubChnX2NmZy0+bnNpcF9zZ3NuX2lwKTsKKwl2dHlfb3V0KHZ0eSwgIiBuc2lwIHNnc24gcmVtb3RlIGlwICVzJXMiLCBpbmV0X250b2EoaWEpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbnNpcCBzZ3NuIHJlbW90ZSBwb3J0ICV1JXMiLCBnX2NmZy0+bnNpcF9zZ3NuX3BvcnQsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBuc2lwIHNnc24gbnNlaSAldSVzIiwgZ19jZmctPm5zaXBfc2dzbl9uc2VpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbnNpcCBzZ3NuIG5zdmNpICV1JXMiLCBnX2NmZy0+bnNpcF9zZ3NuX25zdmNpLAorCQlWVFlfTkVXTElORSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19nYnByb3h5LAorICAgICAgY2ZnX2dicHJveHlfY21kLAorICAgICAgImdicHJveHkiLAorICAgICAgIkNvbmZpZ3VyZSB0aGUgR2IgcHJveHkiKQoreworCXZ0eS0+bm9kZSA9IEdCUFJPWFlfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2lwX2Jzc19sb2NhbF9pcCwKKyAgICAgIGNmZ19uc2lwX2Jzc19sb2NhbF9pcF9jbWQsCisgICAgICAibnNpcCBic3MgbG9jYWwgaXAgQS5CLkMuRCIsCisgICAgICAiU2V0IHRoZSBJUCBhZGRyZXNzIG9uIHdoaWNoIHdlIGxpc3RlbiBmb3IgQlNTIGNvbm5lY3RzIikKK3sKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWluZXRfYXRvbihhcmd2WzBdLCAmaWEpOworCWdfY2ZnLT5uc2lwX2xpc3Rlbl9pcCA9IG50b2hsKGlhLnNfYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2lwX2Jzc19sb2NhbF9wb3J0LAorICAgICAgY2ZnX25zaXBfYnNzX2xvY2FsX3BvcnRfY21kLAorICAgICAgIm5zaXAgYnNzIGxvY2FsIHBvcnQgPDAtNjU1MzQ+IiwKKyAgICAgICJTZXQgdGhlIFVEUCBwb3J0IG9uIHdoaWNoIHdlIGxpc3RlbiBmb3IgQlNTIGNvbm5lY3RzIikKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IGF0b2koYXJndlswXSk7CisKKwlnX2NmZy0+bnNpcF9saXN0ZW5fcG9ydCA9IHBvcnQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19uc2lwX3Nnc25faXAsCisgICAgICBjZmdfbnNpcF9zZ3NuX2lwX2NtZCwKKyAgICAgICJuc2lwIHNnc24gcmVtb3RlIGlwIEEuQi5DLkQiLAorICAgICAgIlNldCB0aGUgSVAgb2YgdGhlIFNHU04gdG8gd2hpY2ggdGhlIHByb3h5IHNoYWxsIGNvbm5lY3QiKQoreworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaW5ldF9hdG9uKGFyZ3ZbMF0sICZpYSk7CisJZ19jZmctPm5zaXBfc2dzbl9pcCA9IG50b2hsKGlhLnNfYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2lwX3Nnc25fcG9ydCwKKyAgICAgIGNmZ19uc2lwX3Nnc25fcG9ydF9jbWQsCisgICAgICAibnNpcCBzZ3NuIHJlbW90ZSBwb3J0IDwwLTY1NTM0PiIsCisgICAgICAiU2V0IHRoZSBVRFAgcG9ydCBvZiB0aGUgU0dTTiB0byB3aGljaCB0aGUgcHJveHkgc2hhbGwgY29ubmVjdCIpCit7CisJdW5zaWduZWQgaW50IHBvcnQgPSBhdG9pKGFyZ3ZbMF0pOworCisJZ19jZmctPm5zaXBfc2dzbl9wb3J0ID0gcG9ydDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2lwX3Nnc25fbnNlaSwKKyAgICAgIGNmZ19uc2lwX3Nnc25fbnNlaV9jbWQsCisgICAgICAibnNpcCBzZ3NuIG5zZWkgPDAtNjU1MzQ+IiwKKyAgICAgICJTZXQgdGhlIE5TRUkgdG8gYmUgdXNlZCBpbiB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBTR1NOIikKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IGF0b2koYXJndlswXSk7CisKKwlnX2NmZy0+bnNpcF9zZ3NuX25zZWkgPSBwb3J0OworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25zaXBfc2dzbl9uc3ZjaSwKKyAgICAgIGNmZ19uc2lwX3Nnc25fbnN2Y2lfY21kLAorICAgICAgIm5zaXAgc2dzbiBuc3ZjaSA8MC02NTUzND4iLAorICAgICAgIlNldCB0aGUgTlNWQ0kgdG8gYmUgdXNlZCBpbiB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBTR1NOIikKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IGF0b2koYXJndlswXSk7CisKKwlnX2NmZy0+bnNpcF9zZ3NuX25zdmNpID0gcG9ydDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK2ludCBnYnByb3h5X3Z0eV9pbml0KHZvaWQpCit7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X2dicHJveHlfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmNmZ19nYnByb3h5X2NtZCk7CisJaW5zdGFsbF9ub2RlKCZnYnByb3h5X25vZGUsIGNvbmZpZ193cml0ZV9nYnByb3h5KTsKKwlpbnN0YWxsX2RlZmF1bHQoR0JQUk9YWV9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoR0JQUk9YWV9OT0RFLCAmY2ZnX25zaXBfYnNzX2xvY2FsX2lwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdCUFJPWFlfTk9ERSwgJmNmZ19uc2lwX2Jzc19sb2NhbF9wb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdCUFJPWFlfTk9ERSwgJmNmZ19uc2lwX3Nnc25faXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR0JQUk9YWV9OT0RFLCAmY2ZnX25zaXBfc2dzbl9wb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdCUFJPWFlfTk9ERSwgJmNmZ19uc2lwX3Nnc25fbnNlaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHQlBST1hZX05PREUsICZjZmdfbnNpcF9zZ3NuX25zdmNpX2NtZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdicHJveHlfcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3QgZ2Jwcm94eV9jb25maWcgKmNmZykKK3sKKwlpbnQgcmM7CisKKwlnX2NmZyA9IGNmZzsKKwlyYyA9IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbmZpZ19maWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIHRoZSBjb25maWcgZmlsZTogJyVzJ1xuIiwgY29uZmlnX2ZpbGUpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ic3NncC5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2Jzc2dwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkZmQzMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ic3NncC5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKiBHUFJTIEJTU0dQIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGFzIHBlciAzR1BQIFRTIDA4LjE4ICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4X2dwcnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbGxjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisKK3ZvaWQgKmJzc2dwX3RhbGxfY3R4ID0gTlVMTDsKKworI2RlZmluZSBCVkNfRl9CTE9DS0VECTB4MDAwMQorCisvKiBUaGUgcGVyLUJUUyBjb250ZXh0IHRoYXQgd2Uga2VlcCBvbiB0aGUgU0dTTiBzaWRlIG9mIHRoZSBCU1NHUCBsaW5rICovCitzdHJ1Y3QgYnNzZ3BfYnRzX2N0eCB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCS8qIHBhcnNlZCBSQSBJRCBhbmQgQ2VsbCBJRCBvZiB0aGUgcmVtb3RlIEJUUyAqLworCXN0cnVjdCBncHJzX3JhX2lkIHJhX2lkOworCXVpbnQxNl90IGNlbGxfaWQ7CisKKwkvKiBOU0VJIGFuZCBCVkNJIG9mIHVuZGVybHlpbmcgR2IgbGluay4gIFRvZ2V0aGVyIHRoZXkKKwkgKiB1bmlxdWVseSBpZGVudGlmeSBhIGxpbmsgdG8gYSBCVFMgKDUuNC40KSAqLworCXVpbnQxNl90IGJ2Y2k7CisJdWludDE2X3QgbnNlaTsKKworCXVpbnQzMl90IGJ2Y19zdGF0ZTsKKworCS8qIHdlIG1pZ2h0IHdhbnQgdG8gYWRkIHRoaXMgYXMgYSBzaG9ydGN1dCBsYXRlciwgYXZvaWRpbmcgdGhlIE5TVkMKKwkgKiBsb29rdXAgZm9yIGV2ZXJ5IHBhY2tldCwgc2ltaWxhciB0byBhIHJvdXRpbmcgY2FjaGUgKi8KKwkvL3N0cnVjdCBncHJzX25zdmMgKm5zdmM7Cit9Oworc3RhdGljIExMSVNUX0hFQUQoYnRzX2N0eHRzKTsKKworLyogRmluZCBhIEJUUyBDb250ZXh0IGJhc2VkIG9uIHBhcnNlZCBSQSBJRCBhbmQgQ2VsbCBJRCAqLworc3RydWN0IGJzc2dwX2J0c19jdHggKmJ0c2N0eF9ieV9yYWlkX2NpZChjb25zdCBzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgdWludDE2X3QgY2lkKQoreworCXN0cnVjdCBic3NncF9idHNfY3R4ICpiY3R4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYmN0eCwgJmJ0c19jdHh0cywgbGlzdCkgeworCQlpZiAoIW1lbWNtcCgmYmN0eC0+cmFfaWQsIHJhaWQsIHNpemVvZihiY3R4LT5yYV9pZCkpICYmCisJCSAgICBiY3R4LT5jZWxsX2lkID09IGNpZCkKKwkJCXJldHVybiBiY3R4OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogRmluZCBhIEJUUyBjb250ZXh0IGJhc2VkIG9uIEJWQ0krTlNFSSB0dXBsZSAqLworc3RydWN0IGJzc2dwX2J0c19jdHggKmJ0c2N0eF9ieV9idmNpX25zZWkodWludDE2X3QgYnZjaSwgdWludDE2X3QgbnNlaSkKK3sKKwlzdHJ1Y3QgYnNzZ3BfYnRzX2N0eCAqYmN0eDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJjdHgsICZidHNfY3R4dHMsIGxpc3QpIHsKKwkJaWYgKGJjdHgtPm5zZWkgPT0gbnNlaSAmJiBiY3R4LT5idmNpID09IGJ2Y2kpCisJCQlyZXR1cm4gYmN0eDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBic3NncF9idHNfY3R4ICpidHNjdHhfYWxsb2ModWludDE2X3QgYnZjaSwgdWludDE2X3QgbnNlaSkKK3sKKwlzdHJ1Y3QgYnNzZ3BfYnRzX2N0eCAqY3R4OworCisJY3R4ID0gdGFsbG9jX3plcm8oYnNzZ3BfdGFsbF9jdHgsIHN0cnVjdCBic3NncF9idHNfY3R4KTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIE5VTEw7CisJY3R4LT5idmNpID0gYnZjaTsKKwljdHgtPm5zZWkgPSBuc2VpOworCWxsaXN0X2FkZCgmY3R4LT5saXN0LCAmYnRzX2N0eHRzKTsKKworCXJldHVybiBjdHg7Cit9CisKKy8qIENoYXB0ZXIgMTAuNC41OiBGbG93IENvbnRyb2wgQlZDIEFDSyAqLworc3RhdGljIGludCBic3NncF90eF9mY19idmNfYWNrKHVpbnQxNl90IG5zZWksIHVpbnQ4X3QgdGFnLCB1aW50MTZfdCBuc19idmNpKQoreworCXN0cnVjdCBtc2diICptc2cgPSBic3NncF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpiZ3BoKSk7CisKKwltc2diX25zZWkobXNnKSA9IG5zZWk7CisJbXNnYl9idmNpKG1zZykgPSBuc19idmNpOworCisJYmdwaC0+cGR1X3R5cGUgPSBCU1NHUF9QRFVUX0ZMT1dfQ09OVFJPTF9CVkNfQUNLOworCW1zZ2JfdHZsdl9wdXQobXNnLCBCU1NHUF9JRV9UQUcsIDEsICZ0YWcpOworCisJcmV0dXJuIGdwcnNfbnNfc2VuZG1zZyhic3NncF9uc2ksIG1zZyk7Cit9CisKK3VpbnQxNl90IGJzc2dwX3BhcnNlX2NlbGxfaWQoc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKwkvKiA2IG9jdGV0cyBSQUMgKi8KKwlnc200OF9wYXJzZV9yYShyYWlkLCBidWYpOworCS8qIDIgb2N0ZXRzIENJRCAqLworCXJldHVybiBudG9ocygqKHVpbnQxNl90ICopIChidWYrNikpOworfQorCisvKiBDaGFwdGVyIDguNCBCVkMtUmVzZXQgUHJvY2VkdXJlICovCitzdGF0aWMgaW50IGJzc2dwX3J4X2J2Y19yZXNldChzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHAsCQorCQkJICAgICAgdWludDE2X3QgbnNfYnZjaSkKK3sKKwlzdHJ1Y3QgYnNzZ3BfYnRzX2N0eCAqYmN0eDsKKwl1aW50MTZfdCBuc2VpID0gbXNnYl9uc2VpKG1zZyk7CisJdWludDE2X3QgYnZjaTsKKwlpbnQgcmM7CisKKwlidmNpID0gbnRvaHMoKih1aW50MTZfdCAqKVRMVlBfVkFMKHRwLCBCU1NHUF9JRV9CVkNJKSk7CisJREVCVUdQQyhEQlNTR1AsICJCVkNJPSV1LCBjYXVzZT0lc1xuIiwgYnZjaSwKKwkJYnNzZ3BfY2F1c2Vfc3RyKCpUTFZQX1ZBTCh0cCwgQlNTR1BfSUVfQ0FVU0UpKSk7CisKKwkvKiBsb29rLXVwIG9yIGNyZWF0ZSB0aGUgQlRTIGNvbnRleHQgZm9yIHRoaXMgQlZDICovCisJYmN0eCA9IGJ0c2N0eF9ieV9idmNpX25zZWkoYnZjaSwgbnNlaSk7CisJaWYgKCFiY3R4KQorCQliY3R4ID0gYnRzY3R4X2FsbG9jKGJ2Y2ksIG5zZWkpOworCisJLyogV2hlbiB3ZSByZWNlaXZlIGEgQlZDLVJFU0VUIFBEVSAoYXQgbGVhc3Qgb2YgYSBQVFAgQlZDSSksIHRoZSBCU1MKKwkgKiBpbmZvcm1zIHVzIGFib3V0IGl0cyBSQUMgKyBDZWxsIElELCBzbyB3ZSBjYW4gY3JlYXRlIGEgbWFwcGluZyAqLworCWlmIChidmNpICE9IDAgJiYgYnZjaSAhPSAxKSB7CisJCWlmICghVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9DRUxMX0lEKSkgeworCQkJTE9HUChEQlNTR1AsIExPR0xfRVJST1IsICJCU1NHUCBSRVNFVCBCVkNJPSV1ICIKKwkJCQkibWlzc2luZyBtYW5kYXRvcnkgSUVcbiIsIGJ2Y2kpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogYWN0dWFsbHkgZXh0cmFjdCBSQUMgLyBDSUQgKi8KKwkJYmN0eC0+Y2VsbF9pZCA9IGJzc2dwX3BhcnNlX2NlbGxfaWQoJmJjdHgtPnJhX2lkLAorCQkJCQkJVExWUF9WQUwodHAsIEJTU0dQX0lFX0NFTExfSUQpKTsKKwkJTE9HUChEQlNTR1AsIExPR0xfTk9USUNFLCAiQ2VsbCAldS0ldS0ldS0ldSBDSSAldSBvbiBCVkNJICV1XG4iLAorCQkJYmN0eC0+cmFfaWQubWNjLCBiY3R4LT5yYV9pZC5tbmMsIGJjdHgtPnJhX2lkLmxhYywKKwkJCWJjdHgtPnJhX2lkLnJhYywgYmN0eC0+Y2VsbF9pZCwgYnZjaSk7CisJfQorCisJLyogQWNrbm93bGVkZ2UgdGhlIFJFU0VUIHRvIHRoZSBCVFMgKi8KKwlyYyA9IGJzc2dwX3R4X3NpbXBsZV9idmNpKEJTU0dQX1BEVVRfQlZDX1JFU0VUX0FDSywKKwkJCQkgIG5zZWksIGJ2Y2ksIG5zX2J2Y2kpOworCXJldHVybiAwOworfQorCisvKiBVcGxpbmsgdW5pdC1kYXRhICovCitzdGF0aWMgaW50IGJzc2dwX3J4X3VsX3VkKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGJzc2dwX3VkX2hkciAqYnVkaCA9IChzdHJ1Y3QgYnNzZ3BfdWRfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJaW50IGRhdGFfbGVuID0gbXNnYl9ic3NncF9sZW4obXNnKSAtIHNpemVvZigqYnVkaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJaW50IHJjOworCisJREVCVUdQKERCU1NHUCwgIkJTU0dQIFVMLVVEXG4iKTsKKworCS8qIGV4dHJhY3QgVExMSSBhbmQgcGFyc2UgVExWIElFcyAqLworCW1zZ2JfdGxsaShtc2cpID0gbnRvaGwoYnVkaC0+dGxsaSk7CisJcmMgPSBic3NncF90bHZfcGFyc2UoJnRwLCBidWRoLT5kYXRhLCBkYXRhX2xlbik7CisKKwkvKiBDZWxsIElEIGFuZCBMTENfUERVIGFyZSB0aGUgb25seSBtYW5kYXRvcnkgSUUgKi8KKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX0NFTExfSUQpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9MTENfUERVKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBGSVhNRTogbG9va3VwIGJzc2dwX2J0c19jdHggYmFzZWQgb24gQlZDSSArIE5TRUkgKi8KKworCS8qIHN0b3JlIHBvaW50ZXIgdG8gTExDIGhlYWRlciBhbmQgQ0VMTCBJRCBpbiBtc2diLT5jYiAqLworCW1zZ2JfbGxjaChtc2cpID0gVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9MTENfUERVKTsKKwltc2diX2JjaWQobXNnKSA9IFRMVlBfVkFMKCZ0cCwgQlNTR1BfSUVfQ0VMTF9JRCk7CisKKwlyZXR1cm4gZ3Byc19sbGNfcmN2bXNnKG1zZywgJnRwKTsKK30KKworc3RhdGljIGludCBic3NncF9yeF9zdXNwZW5kKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJaW50IGRhdGFfbGVuID0gbXNnYl9ic3NncF9sZW4obXNnKSAtIHNpemVvZigqYmdwaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJaW50IHJjOworCisJREVCVUdQKERCU1NHUCwgIkJTU0dQIFNVU1BFTkRcbiIpOworCisJcmMgPSBic3NncF90bHZfcGFyc2UoJnRwLCBiZ3BoLT5kYXRhLCBkYXRhX2xlbik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9UTExJKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgQlNTR1BfSUVfUk9VVEVJTkdfQVJFQSkpCisJCXJldHVybiAtRUlPOworCisJLyogRklYTUU6IHBhc3MgdGhlIFNVU1BFTkQgcmVxdWVzdCB0byBHTU0gKi8KKwkvKiBTRU5EIFNVU1BFTkRfQUNLIG9yIFNVU1BFTkRfTkFDSyAqLworfQorCitzdGF0aWMgaW50IGJzc2dwX3J4X3Jlc3VtZShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBic3NncF9ub3JtYWxfaGRyICpiZ3BoID0KKwkJCShzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX2Jzc2dwaChtc2cpOworCWludCBkYXRhX2xlbiA9IG1zZ2JfYnNzZ3BfbGVuKG1zZykgLSBzaXplb2YoKmJncGgpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCWludCByYzsKKworCURFQlVHUChEQlNTR1AsICJCU1NHUCBSRVNVTUVcbiIpOworCisJcmMgPSBic3NncF90bHZfcGFyc2UoJnRwLCBiZ3BoLT5kYXRhLCBkYXRhX2xlbik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9UTExJKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgQlNTR1BfSUVfUk9VVEVJTkdfQVJFQSkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX1NVU1BFTkRfUkVGX05SKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBGSVhNRTogcGFzcyB0aGUgUkVTVU1FIHJlcXVlc3QgdG8gR01NICovCisJLyogU0VORCBSRVNVTUVfQUNLIG9yIFJFU1VNRV9OQUNLICovCit9CisKK3N0YXRpYyBpbnQgYnNzZ3BfcnhfZmNfYnZjKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB0bHZfcGFyc2VkICp0cCkKK3sKKworCURFQlVHUChEQlNTR1AsICJCU1NHUCBGQyBCVkNcbiIpOworCisJaWYgKCFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX1RBRykgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfQlZDX0JVQ0tFVF9TSVpFKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9CVUNLRVRfTEVBS19SQVRFKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKHRwLCBCU1NHUF9JRV9CTUFYX0RFRkFVTFRfTVMpIHx8CisJICAgICFUTFZQX1BSRVNFTlQodHAsIEJTU0dQX0lFX1JfREVGQVVMVF9NUykpCisJCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFLCBOVUxMLCBtc2cpOworCisJLyogRklYTUU6IGFjdHVhbGx5IGltcGxlbWVudCBmbG93IGNvbnRyb2wgKi8KKworCS8qIFNlbmQgRkxPV19DT05UUk9MX0JWQ19BQ0sgKi8KKwlyZXR1cm4gYnNzZ3BfdHhfZmNfYnZjX2Fjayhtc2diX25zZWkobXNnKSwgKlRMVlBfVkFMKHRwLCBCU1NHUF9JRV9UQUcpLAorCQkJCSAgIG1zZ2JfYnZjaShtc2cpKTsKK30KKworLyogV2UgZXhwZWN0IG1zZ2JfYnNzZ3BoKCkgdG8gcG9pbnQgdG8gdGhlIEJTU0dQIGhlYWRlciAqLworaW50IGdwcnNfYnNzZ3BfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKmJncGggPQorCQkJKHN0cnVjdCBic3NncF9ub3JtYWxfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdWludDhfdCBwZHVfdHlwZSA9IGJncGgtPnBkdV90eXBlOworCWludCBkYXRhX2xlbiA9IG1zZ2JfYnNzZ3BfbGVuKG1zZykgLSBzaXplb2YoKmJncGgpOworCXVpbnQxNl90IGJ2Y2k7CS8qIFBUUCBCVkNJICovCisJdWludDE2X3QgbnNfYnZjaSA9IG1zZ2JfYnZjaShtc2cpOworCWludCByYyA9IDA7CisKKwkvKiBJZGVudGlmaWVycyBmcm9tIERPV046IE5TRUksIEJWQ0kgKGJvdGggaW4gbXNnLT5jYikgKi8KKworCS8qIFVOSVREQVRBIEJTU0dQIGhlYWRlcnMgaGF2ZSBUTExJIGluIGZyb250ICovCisJaWYgKHBkdV90eXBlICE9IEJTU0dQX1BEVVRfVUxfVU5JVERBVEEgJiYKKwkgICAgcGR1X3R5cGUgIT0gQlNTR1BfUERVVF9ETF9VTklUREFUQSkKKwkJcmMgPSBic3NncF90bHZfcGFyc2UoJnRwLCBiZ3BoLT5kYXRhLCBkYXRhX2xlbik7CisKKwlzd2l0Y2ggKHBkdV90eXBlKSB7CisJY2FzZSBCU1NHUF9QRFVUX1VMX1VOSVREQVRBOgorCQkvKiBzb21lIExMQyBkYXRhIGZyb20gdGhlIE1TICovCisJCXJjID0gYnNzZ3BfcnhfdWxfdWQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1JBX0NBUEFCSUxJVFk6CisJCS8qIEJTUyByZXF1ZXN0cyBSQSBjYXBhYmlsaXR5IG9yIElNU0kgKi8KKwkJREVCVUdQKERCU1NHUCwgIkJTU0dQIFJBIENBUEFCSUxJVFkgVVBEQVRFXG4iKTsKKwkJLyogRklYTUU6IHNlbmQgUkFfQ0FQQV9VUERBVEVfQUNLICovCisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9SQURJT19TVEFUVVM6CisJCURFQlVHUChEQlNTR1AsICJCU1NHUCBSQURJTyBTVEFUVVNcbiIpOworCQkvKiBCU1MgaW5mb3JtcyB1cyBvZiBzb21lIGV4Y2VwdGlvbiAqLworCQkvKiBGSVhNRTogbm90aWZ5IEdNTSAqLworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfU1VTUEVORDoKKwkJLyogTVMgd2FudHMgdG8gc3VzcGVuZCAqLworCQlyYyA9IGJzc2dwX3J4X3N1c3BlbmQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1JFU1VNRToKKwkJLyogTVMgd2FudHMgdG8gcmVzdW1lICovCisJCXJjID0gYnNzZ3BfcnhfcmVzdW1lKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9GTFVTSF9MTDoKKwkJLyogQlNTIGluZm9ybXMgTVMgaGFzIG1vdmVkIHRvIG9uZSBjZWxsIHRvIG90aGVyIGNlbGwgKi8KKwkJREVCVUdQKERCU1NHUCwgIkJTU0dQIEZMVVNIIExMXG4iKTsKKwkJLyogRklYTUU6IG5vdGlmeSBHTU0gKi8KKwkJLyogU2VuZCBGTFVTSF9MTF9BQ0sgKi8KKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0xMQ19ESVNDQVJEOgorCQkvKiBCU1MgaW5mb3JtcyB0aGF0IHNvbWUgTExDIFBEVSdzIGhhdmUgYmVlbiBkaXNjYXJkZWQgKi8KKwkJREVCVUdQKERCU1NHUCwgIkJTU0dQIExMQyBESVNDQVJERURcbiIpOworCQkvKiBGSVhNRTogbm90aWZ5IEdNTSAqLworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfRkxPV19DT05UUk9MX0JWQzoKKwkJLyogQlNTIGluZm9ybXMgdXMgb2YgYXZhaWxhYmxlIGJhbmR3aWR0aCBpbiBHYiBpbnRlcmZhY2UgKi8KKwkJcmMgPSBic3NncF9yeF9mY19idmMobXNnLCAmdHApOworCQlicmVhazsKKwljYXNlIEJTU0dQX1BEVVRfRkxPV19DT05UUk9MX01TOgorCQkvKiBCU1MgaW5mb3JtcyB1cyBvZiBhdmFpbGFibGUgYmFuZHdpZHRoIHRvIG9uZSBNUyAqLworCQlERUJVR1AoREJTU0dQLCAiQlNTR1AgRkMgTVNcbiIpOworCQkvKiBGSVhNRTogYWN0dWFsbHkgaW1wbGVtZW50IGZsb3cgY29udHJvbCAqLworCQkvKiBGSVhNRTogU2VuZCBGTE9XX0NPTlRST0xfTVNfQUNLICovCisJCWJyZWFrOworCWNhc2UgQlNTR1BfUERVVF9CVkNfQkxPQ0s6CisJCS8qIEJTUyB0ZWxscyB1cyB0aGF0IEJWQyBzaGFsbCBiZSBibG9ja2VkICovCisJCURFQlVHUChEQlNTR1AsICJCU1NHUCBCVkMgQkxPQ0sgIik7CisJCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgQlNTR1BfSUVfQlZDSSkgfHwKKwkJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9DQVVTRSkpCisJCQlnb3RvIGVycl9tYW5kX2llOworCQlidmNpID0gbnRvaHMoKih1aW50MTZfdCAqKVRMVlBfVkFMKCZ0cCwgQlNTR1BfSUVfQlZDSSkpOworCQlERUJVR1BDKERCU1NHUCwgIkJWQ0k9JXUsIGNhdXNlPSVzXG4iLCBidmNpLAorCQkJYnNzZ3BfY2F1c2Vfc3RyKCpUTFZQX1ZBTCgmdHAsIEJTU0dQX0lFX0NBVVNFKSkpOworCQkvKiBXZSBhbHdheXMgYWNrbm93bGVkZ2UgdGhlIEJMT0NLaW5nICovCisJCXJjID0gYnNzZ3BfdHhfc2ltcGxlX2J2Y2koQlNTR1BfUERVVF9CVkNfQkxPQ0tfQUNLLAorCQkJCQkgIG1zZ2JfbnNlaShtc2cpLCBidmNpLCBuc19idmNpKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19VTkJMT0NLOgorCQkvKiBCU1MgdGVsbHMgdXMgdGhhdCBCVkMgc2hhbGwgYmUgdW5ibG9ja2VkICovCisJCURFQlVHUChEQlNTR1AsICJCU1NHUCBCVkMgVU5CTE9DSyAiKTsKKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9CVkNJKSkKKwkJCWdvdG8gZXJyX21hbmRfaWU7CisJCWJ2Y2kgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwoJnRwLCBCU1NHUF9JRV9CVkNJKSk7CisJCURFQlVHUEMoREJTU0dQLCAiQlZDST0ldVxuIiwgYnZjaSk7CisJCS8qIFdlIGFsd2F5cyBhY2tub3dsZWRnZSB0aGUgdW5CTE9DS2luZyAqLworCQlyYyA9IGJzc2dwX3R4X3NpbXBsZV9idmNpKEJTU0dQX1BEVVRfQlZDX1VOQkxPQ0tfQUNLLAorCQkJCQkgIG1zZ2JfbnNlaShtc2cpLCBidmNpLCBuc19idmNpKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19SRVNFVDoKKwkJLyogQlNTIHRlbGxzIHVzIHRoYXQgQlZDIGluaXQgaXMgcmVxdWlyZWQgKi8KKwkJREVCVUdQKERCU1NHUCwgIkJTU0dQIEJWQyBSRVNFVCAiKTsKKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBCU1NHUF9JRV9CVkNJKSB8fAorCQkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIEJTU0dQX0lFX0NBVVNFKSkKKwkJCWdvdG8gZXJyX21hbmRfaWU7CisJCXJjID0gYnNzZ3BfcnhfYnZjX3Jlc2V0KG1zZywgJnRwLCBuc19idmNpKTsKKwkJYnJlYWs7CisJY2FzZSBCU1NHUF9QRFVUX1NUQVRVUzoKKwkJLyogU29tZSBleGNlcHRpb24gaGFzIG9jY3VycmVkICovCisJCS8qIEZJWE1FOiBub3RpZnkgR01NICovCisJY2FzZSBCU1NHUF9QRFVUX0RPV05MT0FEX0JTU19QRkM6CisJY2FzZSBCU1NHUF9QRFVUX0NSRUFURV9CU1NfUEZDX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfQ1JFQVRFX0JTU19QRkNfTkFDSzoKKwljYXNlIEJTU0dQX1BEVVRfTU9ESUZZX0JTU19QRkM6CisJY2FzZSBCU1NHUF9QRFVUX0RFTEVURV9CU1NfUEZDX0FDSzoKKwkJREVCVUdQKERCU1NHUCwgIkJTU0dQIFBEVSB0eXBlIDB4JTAyeCBub3QgW3lldF0gaW1wbGVtZW50ZWRcbiIsCisJCQlwZHVfdHlwZSk7CisJCWJyZWFrOworCS8qIHRob3NlIG9ubHkgZXhpc3QgaW4gdGhlIFNHU04gLT4gQlNTIGRpcmVjdGlvbiAqLworCWNhc2UgQlNTR1BfUERVVF9ETF9VTklUREFUQToKKwljYXNlIEJTU0dQX1BEVVRfUEFHSU5HX1BTOgorCWNhc2UgQlNTR1BfUERVVF9QQUdJTkdfQ1M6CisJY2FzZSBCU1NHUF9QRFVUX1JBX0NBUEFfVVBEQVRFX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfU1VTUEVORF9BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX1NVU1BFTkRfTkFDSzoKKwljYXNlIEJTU0dQX1BEVVRfUkVTVU1FX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfUkVTVU1FX05BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX0ZMVVNIX0xMX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfRkxPV19DT05UUk9MX0JWQ19BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX0ZMT1dfQ09OVFJPTF9NU19BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19CTE9DS19BQ0s6CisJY2FzZSBCU1NHUF9QRFVUX0JWQ19VTkJMT0NLX0FDSzoKKwljYXNlIEJTU0dQX1BEVVRfU0dTTl9JTlZPS0VfVFJBQ0U6CisJCURFQlVHUChEQlNTR1AsICJCU1NHUCBQRFUgdHlwZSAweCUwMnggb25seSBleGlzdHMgaW4gRExcbiIsCisJCQlwZHVfdHlwZSk7CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERCU1NHUCwgIkJTU0dQIFBEVSB0eXBlIDB4JTAyeCB1bmtub3duXG4iLCBwZHVfdHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK2Vycl9tYW5kX2llOgorCXJldHVybiBic3NncF90eF9zdGF0dXMoQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFLCBOVUxMLCBtc2cpOworfQorCisvKiBFbnRyeSBmdW5jdGlvbiBmcm9tIHVwcGVyIGxldmVsIChMTEMpLCBhc2tpbmcgdXMgdG8gdHJhbnNtaXQgYSBCU1NHUCBQRFUKKyAqIHRvIGEgcmVtb3RlIE1TIChpZGVudGlmaWVkIGJ5IFRMTEkpIGF0IGEgQlRTIGlkZW50aWZpZWQgYnkgaXRzIEJWQ0kgYW5kIE5TRUkgKi8KK2ludCBncHJzX2Jzc2dwX3R4X2RsX3VkKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGJzc2dwX2J0c19jdHggKmJjdHg7CisJc3RydWN0IGJzc2dwX3VkX2hkciAqYnVkaDsKKwl1aW50OF90IGxsY19wZHVfdGx2X2hkcl9sZW4gPSAyOworCXVpbnQ4X3QgKmxsY19wZHVfdGx2LCAqcW9zX3Byb2ZpbGU7CisJdWludDE2X3QgcGR1X2xpZmV0aW1lID0gMTAwMDsgLyogY2VudGktc2Vjb25kcyAqLworCXVpbnQ4X3QgcW9zX3Byb2ZpbGVfZGVmYXVsdFszXSA9IHsgMHgwMCwgMHgwMCwgMHgyMSB9OworCXVpbnQxNl90IG1zZ19sZW4gPSBtc2ctPmxlbjsKKwl1aW50MTZfdCBidmNpID0gbXNnYl9idmNpKG1zZyk7CisJdWludDE2X3QgbnNlaSA9IG1zZ2JfbnNlaShtc2cpOworCisJLyogSWRlbnRpZmllcnMgZnJvbSBVUDogVExMSSwgQlZDSSwgTlNFSSAoYWxsIGluIG1zZ2ItPmNiKSAqLworCWlmIChidmNpIDwgMikgeworCQlMT0dQKERCU1NHUCwgTE9HTF9FUlJPUiwgIkNhbm5vdCBzZW5kIERMLVVEIHRvIEJWQ0kgJXVcbiIsCisJCQlidmNpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmN0eCA9IGJ0c2N0eF9ieV9idmNpX25zZWkoYnZjaSwgbnNlaSk7CisJaWYgKCFiY3R4KQorCQliY3R4ID0gYnRzY3R4X2FsbG9jKGJ2Y2ksIG5zZWkpOworCisJaWYgKG1zZy0+bGVuID4gVFZMVl9NQVhfT05FQllURSkKKwkJbGxjX3BkdV90bHZfaGRyX2xlbiArPSAxOworCisJLyogcHJlcGVuZCB0aGUgdGFnIGFuZCBsZW5ndGggb2YgdGhlIExMQy1QRFUgVExWICovCisJbGxjX3BkdV90bHYgPSBtc2diX3B1c2gobXNnLCBsbGNfcGR1X3Rsdl9oZHJfbGVuKTsKKwlsbGNfcGR1X3RsdlswXSA9IEJTU0dQX0lFX0xMQ19QRFU7CisJaWYgKGxsY19wZHVfdGx2X2hkcl9sZW4gPiAyKSB7CisJCWxsY19wZHVfdGx2WzFdID0gbXNnX2xlbiA+PiA4OworCQlsbGNfcGR1X3RsdlsyXSA9IG1zZ19sZW4gJiAweGZmOworCX0gZWxzZSB7CisJCWxsY19wZHVfdGx2WzFdID0gbXNnX2xlbiAmIDB4M2Y7CisJCWxsY19wZHVfdGx2WzFdIHw9IDB4ODA7CisJfQorCisJLyogRklYTUU6IG9wdGlvbmFsIGVsZW1lbnRzICovCisKKwkvKiBwcmVwZW5kIHRoZSBwZHUgbGlmZXRpbWUgKi8KKwlwZHVfbGlmZXRpbWUgPSBodG9ucyhwZHVfbGlmZXRpbWUpOworCW1zZ2JfdHZsdl9wdXNoKG1zZywgQlNTR1BfSUVfUERVX0xJRkVUSU1FLCAyLCAodWludDhfdCAqKSZwZHVfbGlmZXRpbWUpOworCisJLyogcHJlcGVuZCB0aGUgUW9TIHByb2ZpbGUsIFRMTEkgYW5kIHBkdSB0eXBlICovCisJYnVkaCA9IChzdHJ1Y3QgYnNzZ3BfdWRfaGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqYnVkaCkpOworCW1lbWNweShidWRoLT5xb3NfcHJvZmlsZSwgcW9zX3Byb2ZpbGVfZGVmYXVsdCwgc2l6ZW9mKHFvc19wcm9maWxlX2RlZmF1bHQpKTsKKwlidWRoLT50bGxpID0gaHRvbmwobXNnYl90bGxpKG1zZykpOworCWJ1ZGgtPnBkdV90eXBlID0gQlNTR1BfUERVVF9ETF9VTklUREFUQTsKKworCS8qIElkZW50aWZpZXJzIGRvd246IEJWQ0ksIE5TRUkgKGluIG1zZ2ItPmNiKSAqLworCisJcmV0dXJuIGdwcnNfbnNfc2VuZG1zZyhic3NncF9uc2ksIG1zZyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfYnNzZ3BfdXRpbC5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2Jzc2dwX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWI1MTc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX2Jzc2dwX3V0aWwuYwpAQCAtMCwwICsxLDExOSBAQAorLyogR1BSUyBCU1NHUCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBhcyBwZXIgM0dQUCBUUyAwOC4xOCAqLworCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKworc3RydWN0IGdwcnNfbnNfaW5zdCAqYnNzZ3BfbnNpOworCisvKiBCU1NHUCBQcm90b2NvbCBzcGVjaWZpYywgbm90IGltcGxlbWVudGF0aW9uIHNwZWNpZmljICovCisvKiBGSVhNRTogVGhpcyBuZWVkcyB0byBnbyBpbnRvIGxpYm9zbW9jb3JlIGFmdGVyIGZpbmlzaGVkICovCisKKy8qIENoYXB0ZXIgMTEuMy45IC8gVGFibGUgMTEuMTA6IENhdXNlIGNvZGluZyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgYnNzZ3BfY2F1c2Vfc3RyaW5nc1tdID0geworCXsgQlNTR1BfQ0FVU0VfUFJPQ19PVkVSTE9BRCwJIlByb2Nlc3NvciBvdmVybG9hZCIgfSwKKwl7IEJTU0dQX0NBVVNFX0VRVUlQX0ZBSUwsCSJFcXVpcG1lbnQgRmFpbHVyZSIgfSwKKwl7IEJTU0dQX0NBVVNFX1RSQVNJVF9ORVRfRkFJTCwJIlRyYW5zaXQgbmV0b3drciBzZXJ2aWNlIGZhaWx1cmUiIH0sCisJeyBCU1NHUF9DQVVTRV9DQVBBX0dSRUFURVJfMEtQQlMsIlRyYW5zbWlzc2lvbiBjYXBhY2l0eSBtb2RpZmllZCIgfSwKKwl7IEJTU0dQX0NBVVNFX1VOS05PV05fTVMsCSJVbmtub3duIE1TIiB9LAorCXsgQlNTR1BfQ0FVU0VfVU5LTk9XTl9CVkNJLAkiVW5rbm93biBCVkNJIiB9LAorCXsgQlNTR1BfQ0FVU0VfQ0VMTF9UUkFGX0NPTkcsCSJDZWxsIHRyYWZmaWMgY29uZ2VzdGlvbiIgfSwKKwl7IEJTU0dQX0NBVVNFX1NHU05fQ09ORywJIlNHU04gY29uZ2VzdGlvbiIgfSwKKwl7IEJTU0dQX0NBVVNFX09NTF9JTlRFUlYsCSJPJk0gaW50ZXJ2ZW50aW9uIiB9LAorCXsgQlNTR1BfQ0FVU0VfQlZDSV9CTE9DS0VELAkiQlZDSSBibG9ja2VkIiB9LAorCXsgQlNTR1BfQ0FVU0VfUEZDX0NSRUFURV9GQUlMLAkiUEZDIGNyZWF0ZSBmYWlsdXJlIiB9LAorCXsgQlNTR1BfQ0FVU0VfU0VNX0lOQ09SUl9QRFUsCSJTZW1hbnRpY2FsbHkgaW5jb3JyZWN0IFBEVSIgfSwKKwl7IEJTU0dQX0NBVVNFX0lOVl9NQU5EX0lORiwJIkludmFsaWQgbWFuZGF0b3J5IGluZm9ybWF0aW9uIiB9LAorCXsgQlNTR1BfQ0FVU0VfTUlTU0lOR19NQU5EX0lFLAkiTWlzc2luZyBtYW5kYXRvcnkgSUUiIH0sCisJeyBCU1NHUF9DQVVTRV9NSVNTSU5HX0NPTkRfSUUsCSJNaXNzaW5nIGNvbmRpdGlvbmFsIElFIiB9LAorCXsgQlNTR1BfQ0FVU0VfVU5FWFBfQ09ORF9JRSwJIlVuZXhwZWN0ZWQgY29uZGl0aW9uYWwgSUUiIH0sCisJeyBCU1NHUF9DQVVTRV9DT05EX0lFX0VSUiwJIkNvbmRpdGlvbmFsIElFIGVycm9yIiB9LAorCXsgQlNTR1BfQ0FVU0VfUERVX0lOQ09NUF9TVEFURSwJIlBEVSBpbmNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IEJTU0dQX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMsCSJQcm90b2NvbCBlcnJvciAtIHVuc3BlY2lmaWVkIiB9LAorCXsgQlNTR1BfQ0FVU0VfUERVX0lOQ09NUF9GRUFULCAJIlBEVSBub3QgY29tcGF0aWJsZSB3aXRoIGZlYXR1cmUgc2V0IiB9LAorCXsgMCwgTlVMTCB9LAorfTsKKworY29uc3QgY2hhciAqYnNzZ3BfY2F1c2Vfc3RyKGVudW0gZ3Byc19ic3NncF9jYXVzZSBjYXVzZSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhic3NncF9jYXVzZV9zdHJpbmdzLCBjYXVzZSk7Cit9CisKKworc3RydWN0IG1zZ2IgKmJzc2dwX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbSg0MDk2LCAxMjgsICJCU1NHUCIpOworfQorCisvKiBUcmFuc21pdCBhIHNpbXBsZSByZXNwb25zZSBzdWNoIGFzIEJMT0NLL1VOQkxPQ0svUkVTRVQgQUNLL05BQ0sgKi8KK2ludCBic3NncF90eF9zaW1wbGVfYnZjaSh1aW50OF90IHBkdV90eXBlLCB1aW50MTZfdCBuc2VpLAorCQkJIHVpbnQxNl90IGJ2Y2ksIHVpbnQxNl90IG5zX2J2Y2kpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGJzc2dwX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqYmdwaCA9CisJCQkoc3RydWN0IGJzc2dwX25vcm1hbF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmJncGgpKTsKKwl1aW50MTZfdCBfYnZjaTsKKworCW1zZ2JfbnNlaShtc2cpID0gbnNlaTsKKwltc2diX2J2Y2kobXNnKSA9IG5zX2J2Y2k7CisKKwliZ3BoLT5wZHVfdHlwZSA9IHBkdV90eXBlOworCV9idmNpID0gaHRvbnMoYnZjaSk7CisJbXNnYl90dmx2X3B1dChtc2csIEJTU0dQX0lFX0JWQ0ksIDIsICh1aW50OF90ICopICZfYnZjaSk7CisKKwlyZXR1cm4gZ3Byc19uc19zZW5kbXNnKGJzc2dwX25zaSwgbXNnKTsKK30KKworLyogQ2hhcHRlciAxMC40LjE0OiBTdGF0dXMgKi8KK2ludCBic3NncF90eF9zdGF0dXModWludDhfdCBjYXVzZSwgdWludDE2X3QgKmJ2Y2ksIHN0cnVjdCBtc2diICpvcmlnX21zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gYnNzZ3BfbXNnYl9hbGxvYygpOworCXN0cnVjdCBic3NncF9ub3JtYWxfaGRyICpiZ3BoID0KKwkJCShzdHJ1Y3QgYnNzZ3Bfbm9ybWFsX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYmdwaCkpOworCisJREVCVUdQQyhEQlNTR1AsICJCU1NHUDogVFggU1RBVFVTLCBjYXVzZT0lc1xuIiwgYnNzZ3BfY2F1c2Vfc3RyKGNhdXNlKSk7CisJbXNnYl9uc2VpKG1zZykgPSBtc2diX25zZWkob3JpZ19tc2cpOworCW1zZ2JfYnZjaShtc2cpID0gMDsKKworCWJncGgtPnBkdV90eXBlID0gQlNTR1BfUERVVF9TVEFUVVM7CisJbXNnYl90dmx2X3B1dChtc2csIEJTU0dQX0lFX0NBVVNFLCAxLCAmY2F1c2UpOworCWlmIChidmNpKSB7CisJCXVpbnQxNl90IF9idmNpID0gaHRvbnMoKmJ2Y2kpOworCQltc2diX3R2bHZfcHV0KG1zZywgQlNTR1BfSUVfQlZDSSwgMiwgKHVpbnQ4X3QgKikgJl9idmNpKTsKKwl9CisJaWYgKG9yaWdfbXNnKQorCQltc2diX3R2bHZfcHV0KG1zZywgQlNTR1BfSUVfUERVX0lOX0VSUk9SLAorCQkJICAgICAgbXNnYl9ic3NncF9sZW4ob3JpZ19tc2cpLCBtc2diX2Jzc2dwaChvcmlnX21zZykpOworCisJcmV0dXJuIGdwcnNfbnNfc2VuZG1zZyhic3NncF9uc2ksIG1zZyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbGxjLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbGxjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3NWEzZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19sbGMuYwpAQCAtMCwwICsxLDU0OSBAQAorLyogR1BSUyBMTEMgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gYXMgcGVyIDNHUFAgVFMgMDQuNjQgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbGxjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jcmMyNC5oPgorCisvKiBTZWN0aW9uIDQuNS4yIExvZ2ljYWwgTGluayBTdGF0ZXMgKyBBbm5leCBDLjIgKi8KK2VudW0gZ3Byc19sbGNfbGxfc3RhdGUgeworCUdQUlNfTExTX1VOQVNTSUdORUQJPSAxLAkvKiBObyBUTExJIHlldCAqLworCUdQUlNfTExTX0FTU0lHTkVEX0FETQk9IDIsCS8qIFRMTEkgYXNzaWduZWQgKi8KKwlHUFJTX0xMU19MT0NBTF9FU1QJPSAzLAkvKiBMb2NhbCBFc3RhYmxpc2htZW50ICovCisJR1BSU19MTFNfUkVNT1RFX0VTVAk9IDQsCS8qIFJlbW90ZSBFc3RhYmxpc2htZW50ICovCisJR1BSU19MTFNfQUJNCQk9IDUsCisJR1BSU19MTFNfTE9DQUxfUkVMCT0gNiwJLyogTG9jYWwgUmVsZWFzZSAqLworCUdQUlNfTExTX1RJTUVSX1JFQyAJPSA3LAkvKiBUaW1lciBSZWNvdmVyeSAqLworfTsKKworLyogU2VjdGlvbiA0LjcuMTogTG9naWNhbCBMaW5rIEVudGl0eTogT25lIHBlciBETENJIChUTExJICsgU0FQSSkgKi8KK3N0cnVjdCBncHJzX2xsY19sbGUgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHRpbWVyX2xpc3QgdDIwMDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0MjAxOwkvKiB3YWl0IGZvciBhY2tub3dsZWRnZW1lbnQgKi8KKworCWVudW0gZ3Byc19sbGNfbGxfc3RhdGUgc3RhdGU7CisKKwl1aW50MzJfdCB0bGxpOworCXVpbnQzMl90IHNhcGk7CisKKwl1aW50OF90IHZfc2VudDsKKwl1aW50OF90IHZfYWNrOworCXVpbnQ4X3Qgdl9yZWN2OworCisJdW5zaWduZWQgaW50IG4yMDA7CisJdW5zaWduZWQgaW50IHJldHJhbnNfY3RyOworCisJLyogb3ZlciB3aGljaCBCU1NHUCBCVFMgY3R4IGRvIHdlIG5lZWQgdG8gdHJhbnNtaXQgKi8KKwl1aW50MTZfdCBidmNpOworCXVpbnQxNl90IG5zZWk7Cit9OworCitzdGF0aWMgTExJU1RfSEVBRChncHJzX2xsY19sbGVzKTsKK3ZvaWQgKmxsY190YWxsX2N0eDsKKworLyogbG9va3VwIExMQyBFbnRpdHkgYmFzZWQgb24gRExDSSAoVExMSStTQVBJIHR1cGxlKSAqLworc3RhdGljIHN0cnVjdCBncHJzX2xsY19sbGUgKmxsZV9ieV90bGxpX3NhcGkodWludDMyX3QgdGxsaSwgdWludDMyX3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGU7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShsbGUsICZncHJzX2xsY19sbGVzLCBsaXN0KSB7CisJCWlmIChsbGUtPnRsbGkgPT0gdGxsaSAmJiBsbGUtPnNhcGkgPT0gc2FwaSkKKwkJCXJldHVybiBsbGU7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlX2FsbG9jKHVpbnQzMl90IHRsbGksIHVpbnQzMl90IHNhcGkpCit7CisJc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlOworCisJbGxlID0gdGFsbG9jX3plcm8obGxjX3RhbGxfY3R4LCBzdHJ1Y3QgZ3Byc19sbGNfbGxlKTsKKwlpZiAoIWxsZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsbGUtPnRsbGkgPSB0bGxpOworCWxsZS0+c2FwaSA9IHNhcGk7CisJbGxlLT5zdGF0ZSA9IEdQUlNfTExTX1VOQVNTSUdORUQ7CisJbGxpc3RfYWRkKCZsbGUtPmxpc3QsICZncHJzX2xsY19sbGVzKTsKKworCXJldHVybiBsbGU7Cit9CisKK2VudW0gZ3Byc19sbGNfY21kIHsKKwlHUFJTX0xMQ19OVUxMLAorCUdQUlNfTExDX1JSLAorCUdQUlNfTExDX0FDSywKKwlHUFJTX0xMQ19STlIsCisJR1BSU19MTENfU0FDSywKKwlHUFJTX0xMQ19ETSwKKwlHUFJTX0xMQ19ESVNDLAorCUdQUlNfTExDX1VBLAorCUdQUlNfTExDX1NBQk0sCisJR1BSU19MTENfRlJNUiwKKwlHUFJTX0xMQ19YSUQsCit9OworCitzdHJ1Y3QgZ3Byc19sbGNfaGRyX3BhcnNlZCB7CisJdWludDhfdCBzYXBpOworCXVpbnQ4X3QgaXNfY21kOjEsCisJCSBhY2tfcmVxOjEsCisJCSBpc19lbmNyeXB0ZWQ6MTsKKwl1aW50MzJfdCBzZXFfcng7CisJdWludDMyX3Qgc2VxX3R4OworCXVpbnQzMl90IGZjczsKKwl1aW50MzJfdCBmY3NfY2FsYzsKKwl1aW50OF90ICpkYXRhOworCXVpbnQxNl90IGRhdGFfbGVuOworCWVudW0gZ3Byc19sbGNfY21kIGNtZDsKK307CisKKyNkZWZpbmUgTExDX0FMTE9DX1NJWkUgMTYzODQKKyNkZWZpbmUgVUlfSERSX0xFTgkzCisjZGVmaW5lIE4yMDIJCTQKKyNkZWZpbmUgQ1JDMjRfTEVOR1RICTMKKworc3RhdGljIGludCBncHJzX2xsY19mY3ModWludDhfdCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1aW50MzJfdCBmY3NfY2FsYzsKKworCWZjc19jYWxjID0gY3JjMjRfY2FsYyhJTklUX0NSQzI0LCBkYXRhLCBsZW4pOworCWZjc19jYWxjID0gfmZjc19jYWxjOworCWZjc19jYWxjICY9IDB4ZmZmZmZmOworCisJcmV0dXJuIGZjc19jYWxjOworfQorCitzdGF0aWMgdm9pZCB0MjAwX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3Byc19sbGNfbGxlICpsbGUgPSBkYXRhOworCisJLyogOC41LjEuMzogRXhwaXJ5IG9mIFQyMDAgKi8KKworCWlmIChsbGUtPnJldHJhbnNfY3RyID49IGxsZS0+bjIwMCkgeworCQkvKiBGSVhNRTogTExHTS1TVEFUVVMtSU5ELCBMTC1SRUxFQVNFLUlORC9DTkYgKi8KKwkJbGxlLT5zdGF0ZSA9IEdQUlNfTExTX0FTU0lHTkVEX0FETTsKKwl9CisKKwlzd2l0Y2ggKGxsZS0+c3RhdGUpIHsKKwljYXNlIEdQUlNfTExTX0xPQ0FMX0VTVDoKKwkJLyogcmV0cmFuc21pdCBTQUJNICovCisJCS8qIHJlLXN0YXJ0IFQyMDAgKi8KKwkJbGxlLT5yZXRyYW5zX2N0cisrOworCQlicmVhazsKKwljYXNlIEdQUlNfTExTX0xPQ0FMX1JFTDoKKwkJLyogcmV0cmFuc21pdCBESVNDICovCisJCS8qIHJlLXN0YXJ0IFQyMDAgKi8KKwkJbGxlLT5yZXRyYW5zX2N0cisrOworCQlicmVhazsKKwl9CisKK30KKworc3RhdGljIHZvaWQgdDIwMV9leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlID0gZGF0YTsKKworCWlmIChsbGUtPnJldHJhbnNfY3RyIDwgbGxlLT5uMjAwKSB7CisJCS8qIHRyYW5zbWl0IGFwcm9wcmlhdGUgc3VwZXJ2aXNvcnkgZnJhbWUgKDguNi40LjEpICovCisJCS8qIHNldCB0aW1lciBUMjAxICovCisJCWxsZS0+cmV0cmFuc19jdHIrKzsKKwl9Cit9CisKK2ludCBncHJzX2xsY190eF91KHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3Qgc2FwaSwgaW50IGNvbW1hbmQsCisJCSAgZW51bSBncHJzX2xsY191X2NtZCB1X2NtZCwgaW50IHBmX2JpdCkKK3sKKwl1aW50OF90ICpmY3MsICpsbGNoOworCXVpbnQ4X3QgYWRkciwgY3RybDsKKwl1aW50MzJfdCBmY3NfY2FsYzsKKworCS8qIElkZW50aWZpZXJzIGZyb20gVVA6IChUTExJLCBTQVBJKSArIChCVkNJLCBOU0VJKSAqLworCisJLyogQWRkcmVzcyBGaWVsZCAqLworCWFkZHIgPSBzYXBpICYgMHhmOworCWlmIChjb21tYW5kKQorCQlhZGRyIHw9IDB4NDA7CisKKwkvKiA2LjMgRmlndXJlIDggKi8KKwljdHJsID0gMHhlMCB8IHVfY21kOworCWlmIChwZl9iaXQpCisJCWN0cmwgfD0gMHgxMDsKKworCS8qIHByZXBlbmQgTExDIFVJIGhlYWRlciAqLworCWxsY2ggPSBtc2diX3B1c2gobXNnLCAyKTsKKwlsbGNoWzBdID0gYWRkcjsKKwlsbGNoWzFdID0gY3RybDsKKworCS8qIGFwcGVuZCBGQ1MgdG8gZW5kIG9mIGZyYW1lICovCisJZmNzID0gbXNnYl9wdXQobXNnLCAzKTsKKwlmY3NfY2FsYyA9IGdwcnNfbGxjX2ZjcyhsbGNoLCBmY3MgLSBsbGNoKTsKKwlmY3NbMF0gPSBmY3NfY2FsYyAmIDB4ZmY7CisJZmNzWzFdID0gKGZjc19jYWxjID4+IDgpICYgMHhmZjsKKwlmY3NbMl0gPSAoZmNzX2NhbGMgPj4gMTYpICYgMHhmZjsKKworCS8qIElkZW50aWZpZXJzIHBhc3NlZCBkb3duOiAoQlZDSSwgTlNFSSkgKi8KKworCXJldHVybiBncHJzX2Jzc2dwX3R4X2RsX3VkKG1zZyk7Cit9CisKKy8qIFNlbmQgWElEIHJlc3BvbnNlIHRvIExMRSAqLworc3RhdGljIGludCBncHJzX2xsY190eF94aWQoc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCS8qIGNvcHkgaWRlbnRpZmllcnMgZnJvbSBMTEUgdG8gZW5zdXJlIGxvd2VyIGxheWVycyBjYW4gcm91dGUgKi8KKwltc2diX3RsbGkobXNnKSA9IGxsZS0+dGxsaTsKKwltc2diX2J2Y2kobXNnKSA9IGxsZS0+YnZjaTsKKwltc2diX25zZWkobXNnKSA9IGxsZS0+bnNlaTsKKworCXJldHVybiBncHJzX2xsY190eF91KG1zZywgbGxlLT5zYXBpLCAwLCBHUFJTX0xMQ19VX1hJRCwgMSk7Cit9CisKKy8qIFRyYW5zbWl0IGEgVUkgZnJhbWUgb3ZlciB0aGUgZ2l2ZW4gU0FQSSAqLworaW50IGdwcnNfbGxjX3R4X3VpKHN0cnVjdCBtc2diICptc2csIHVpbnQ4X3Qgc2FwaSwgaW50IGNvbW1hbmQpCit7CisJc3RydWN0IGdwcnNfbGxjX2xsZSAqbGxlOworCXVpbnQ4X3QgKmZjcywgKmxsY2g7CisJdWludDhfdCBhZGRyLCBjdHJsWzJdOworCXVpbnQzMl90IGZjc19jYWxjOworCXVpbnQxNl90IG51ID0gMDsKKworCS8qIElkZW50aWZpZXJzIGZyb20gVVA6IChUTExJLCBTQVBJKSArIChCVkNJLCBOU0VJKSAqLworCisJLyogbG9vay11cCBvciBjcmVhdGUgdGhlIExMIEVudGl0eSBmb3IgdGhpcyAoVExMSSwgU0FQSSkgdHVwbGUgKi8KKwlsbGUgPSBsbGVfYnlfdGxsaV9zYXBpKG1zZ2JfdGxsaShtc2cpLCBzYXBpKTsKKwlpZiAoIWxsZSkKKwkJbGxlID0gbGxlX2FsbG9jKG1zZ2JfdGxsaShtc2cpLCBzYXBpKTsKKwkvKiBVcGRhdGUgTExFJ3MgKEJWQ0ksIE5TRUkpIHR1cGxlICovCisJbGxlLT5idmNpID0gbXNnYl9idmNpKG1zZyk7CisJbGxlLT5uc2VpID0gbXNnYl9uc2VpKG1zZyk7CisKKwkvKiBBZGRyZXNzIEZpZWxkICovCisJYWRkciA9IHNhcGkgJiAweGY7CisJaWYgKGNvbW1hbmQpCisJCWFkZHIgfD0gMHg0MDsKKworCS8qIENvbnRyb2wgRmllbGQgKi8KKwljdHJsWzBdID0gMHhjMDsKKwljdHJsWzBdIHw9IG51ID4+IDY7CisJY3RybFsxXSA9IChudSA8PCAyKSAmIDB4ZmM7CisJY3RybFsxXSB8PSAweDAxOyAvKiBQcm90ZWN0ZWQgTW9kZSAqLworCisJLyogcHJlcGVuZCBMTEMgVUkgaGVhZGVyICovCisJbGxjaCA9IG1zZ2JfcHVzaChtc2csIDMpOworCWxsY2hbMF0gPSBhZGRyOworCWxsY2hbMV0gPSBjdHJsWzBdOworCWxsY2hbMl0gPSBjdHJsWzFdOworCisJLyogYXBwZW5kIEZDUyB0byBlbmQgb2YgZnJhbWUgKi8KKwlmY3MgPSBtc2diX3B1dChtc2csIDMpOworCWZjc19jYWxjID0gZ3Byc19sbGNfZmNzKGxsY2gsIGZjcyAtIGxsY2gpOworCWZjc1swXSA9IGZjc19jYWxjICYgMHhmZjsKKwlmY3NbMV0gPSAoZmNzX2NhbGMgPj4gOCkgJiAweGZmOworCWZjc1syXSA9IChmY3NfY2FsYyA+PiAxNikgJiAweGZmOworCisJLyogSWRlbnRpZmllcnMgcGFzc2VkIGRvd246IChCVkNJLCBOU0VJKSAqLworCisJcmV0dXJuIGdwcnNfYnNzZ3BfdHhfZGxfdWQobXNnKTsKK30KKworc3RhdGljIGludCBncHJzX2xsY19oZHJfZHVtcChzdHJ1Y3QgZ3Byc19sbGNfaGRyX3BhcnNlZCAqZ3BoKQoreworCURFQlVHUChER1BSUywgIkxMQyBTQVBJPSV1ICVjICVjIEZDUz0weCUwNngoJXMpICIsCisJCWdwaC0+c2FwaSwgZ3BoLT5pc19jbWQgPyAnQycgOiAnUicsIGdwaC0+YWNrX3JlcSA/ICdBJyA6ICcgJywKKwkJZ3BoLT5mY3MsIGdwaC0+ZmNzX2NhbGMgPT0gZ3BoLT5mY3MgPyAiY29ycmVjdCIgOiAiV1JPTkciKTsKKworCWlmIChncGgtPmNtZCkKKwkJREVCVUdQQyhER1BSUywgIkNNRD0ldSAiLCBncGgtPmNtZCk7CisKKwlpZiAoZ3BoLT5kYXRhKQorCQlERUJVR1BDKERHUFJTLCAiREFUQSAiKTsKKworCURFQlVHUEMoREdQUlMsICJcbiIpOworfQorc3RhdGljIGludCBncHJzX2xsY19oZHJfcngoc3RydWN0IGdwcnNfbGxjX2hkcl9wYXJzZWQgKmdwaCwKKwkJCSAgIHN0cnVjdCBncHJzX2xsY19sbGUgKmxsZSkKK3sKKwlzd2l0Y2ggKGdwaC0+Y21kKSB7CisJY2FzZSBHUFJTX0xMQ19TQUJNOiAvKiBTZWN0aW9uIDYuNC4xLjEgKi8KKwkJbGxlLT52X3NlbnQgPSBsbGUtPnZfYWNrID0gbGxlLT52X3JlY3YgPSAwOworCQlpZiAobGxlLT5zdGF0ZSA9PSBHUFJTX0xMU19BU1NJR05FRF9BRE0pIHsKKwkJCS8qIHN0YXJ0IHJlLWVzdGFibGlzaG1lbnQgKDguNy4xKSAqLworCQl9CisJCWxsZS0+c3RhdGUgPSBHUFJTX0xMU19SRU1PVEVfRVNUOworCQkvKiBGSVhNRTogU2VuZCBVQSAqLworCQlsbGUtPnN0YXRlID0gR1BSU19MTFNfQUJNOworCQkvKiBGSVhNRTogcHJvY2VzcyBkYXRhICovCisJCWJyZWFrOworCWNhc2UgR1BSU19MTENfRElTQzogLyogU2VjdGlvbiA2LjQuMS4yICovCisJCS8qIEZJWE1FOiBTZW5kIFVBICovCisJCS8qIHRlcm1pbmF0ZSBBQk0gKi8KKwkJbGxlLT5zdGF0ZSA9IEdQUlNfTExTX0FTU0lHTkVEX0FETTsKKwkJYnJlYWs7CisJY2FzZSBHUFJTX0xMQ19VQTogLyogU2VjdGlvbiA2LjQuMS4zICovCisJCWlmIChsbGUtPnN0YXRlID09IEdQUlNfTExTX0xPQ0FMX0VTVCkKKwkJCWxsZS0+c3RhdGUgPSBHUFJTX0xMU19BQk07CisJCWJyZWFrOworCWNhc2UgR1BSU19MTENfRE06IC8qIFNlY3Rpb24gNi40LjEuNDogQUJNIGNhbm5vdCBiZSBwZXJmb3JtZWQgKi8KKwkJaWYgKGxsZS0+c3RhdGUgPT0gR1BSU19MTFNfTE9DQUxfRVNUKQorCQkJbGxlLT5zdGF0ZSA9IEdQUlNfTExTX0FTU0lHTkVEX0FETTsKKwkJYnJlYWs7CisJY2FzZSBHUFJTX0xMQ19GUk1SOiAvKiBTZWN0aW9uIDYuNC4xLjUgKi8KKwkJYnJlYWs7CisJY2FzZSBHUFJTX0xMQ19YSUQ6IC8qIFNlY3Rpb24gNi40LjEuNiAqLworCQkvKiBGSVhNRTogaW1wbGVtZW50IFhJRCBuZWdvdGlhdGlvbiB1c2luZyBTTkRDUCAqLworCQl7CisJCQlzdHJ1Y3QgbXNnYiAqcmVzcDsKKwkJCXVpbnQ4X3QgKnhpZDsKKwkJCXJlc3AgPSBtc2diX2FsbG9jX2hlYWRyb29tKDQwOTYsIDEwMjQsICJMTENfWElEIik7CisJCQl4aWQgPSBtc2diX3B1dChyZXNwLCBncGgtPmRhdGFfbGVuKTsKKwkJCW1lbWNweSh4aWQsIGdwaC0+ZGF0YSwgZ3BoLT5kYXRhX2xlbik7CisJCQlncHJzX2xsY190eF94aWQobGxlLCByZXNwKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogcGFyc2UgYSBHUFJTIExMQyBoZWFkZXIsIGFsc28gY2hlY2sgZm9yIGludmFsaWQgZnJhbWVzICovCitzdGF0aWMgaW50IGdwcnNfbGxjX2hkcl9wYXJzZShzdHJ1Y3QgZ3Byc19sbGNfaGRyX3BhcnNlZCAqZ2hwLAorCQkJICAgICAgY29uc3QgdWludDhfdCAqbGxjX2hkciwgaW50IGxlbikKK3sKKwl1aW50OF90ICpjdHJsID0gbGxjX2hkcisxOworCWludCBpc19zYWNrID0gMDsKKwl1bnNpZ25lZCBpbnQgY3JjX2xlbmd0aDsKKwl1aW50MzJfdCBmY3NfY2FsYzsKKworCWlmIChsZW4gPD0gQ1JDMjRfTEVOR1RIKQorCQlyZXR1cm4gLUVJTzsKKworCWNyY19sZW5ndGggPSBsZW4gLSBDUkMyNF9MRU5HVEg7CisKKwlnaHAtPmFja19yZXEgPSAwOworCisJLyogU2VjdGlvbiA1LjU6IEZDUyAqLworCWdocC0+ZmNzID0gKihsbGNfaGRyICsgbGVuIC0gMyk7CisJZ2hwLT5mY3MgfD0gKihsbGNfaGRyICsgbGVuIC0gMikgPDwgODsKKwlnaHAtPmZjcyB8PSAqKGxsY19oZHIgKyBsZW4gLSAxKSA8PCAxNjsKKworCS8qIFNlY3Rpb24gNi4yLjE6IGludmFsaWQgUEQgZmllbGQgKi8KKwlpZiAobGxjX2hkclswXSAmIDB4ODApCisJCXJldHVybiAtRUlPOworCisJLyogVGhpcyBvbmx5IHdvcmtzIGZvciB0aGUgTVMtPlNHU04gZGlyZWN0aW9uICovCisJaWYgKGxsY19oZHJbMF0gJiAweDQwKQorCQlnaHAtPmlzX2NtZCA9IDA7CisJZWxzZQorCQlnaHAtPmlzX2NtZCA9IDE7CisKKwlnaHAtPnNhcGkgPSBsbGNfaGRyWzBdICYgMHhmOworCisJLyogU2VjdGlvbiA2LjIuMzogY2hlY2sgZm9yIHJlc2VydmVkIFNBUEkgKi8KKwlzd2l0Y2ggKGdocC0+c2FwaSkgeworCWNhc2UgMDoKKwljYXNlIDQ6CisJY2FzZSA2OgorCWNhc2UgMHhhOgorCWNhc2UgMHhjOgorCWNhc2UgMHhkOgorCWNhc2UgMHhmOgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGN0cmxbMF0gJiAweDgwKSA9PSAwKSB7CisJCS8qIEkgKEluZm9ybWF0aW9uIHRyYW5zZmVyICsgU3VwZXJ2aXNvcnkpIGZvcm1hdCAqLworCQl1aW50OF90IGs7CisKKwkJZ2hwLT5kYXRhID0gY3RybCArIDM7CisKKwkJaWYgKGN0cmxbMF0gJiAweDQwKQorCQkJZ2hwLT5hY2tfcmVxID0gMTsKKworCQlnaHAtPnNlcV90eCAgPSAoY3RybFswXSAmIDB4MWYpIDw8IDQ7CisJCWdocC0+c2VxX3R4IHw9IChjdHJsWzFdID4+IDQpOworCisJCWdocC0+c2VxX3J4ICA9IChjdHJsWzFdICYgMHg3KSA8PCA2OworCQlnaHAtPnNlcV9yeCB8PSAoY3RybFsyXSA+PiAyKTsKKworCQlzd2l0Y2ggKGN0cmxbMl0gJiAweDAzKSB7CisJCWNhc2UgMDoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfUlI7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19BQ0s7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19STlI7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19TQUNLOworCQkJayA9IGN0cmxbM10gJiAweDFmOworCQkJZ2hwLT5kYXRhICs9IDEgKyBrOworCQkJYnJlYWs7CisJCX0KKwkJZ2hwLT5kYXRhX2xlbiA9IChsbGNfaGRyICsgbGVuIC0gMykgLSBnaHAtPmRhdGE7CisJfSBlbHNlIGlmICgoY3RybFswXSAmIDB4YzApID09IDB4ODApIHsKKwkJLyogUyAoU3VwZXJ2aXNvcnkpIGZvcm1hdCAqLworCQlnaHAtPmRhdGEgPSBOVUxMOworCQlnaHAtPmRhdGFfbGVuID0gMDsKKworCQlpZiAoY3RybFswXSAmIDB4MjApCisJCQlnaHAtPmFja19yZXEgPSAxOworCQlnaHAtPnNlcV9yeCAgPSAoY3RybFswXSAmIDB4NykgPDwgNjsKKwkJZ2hwLT5zZXFfcnggfD0gKGN0cmxbMV0gPj4gMik7CisKKwkJc3dpdGNoIChjdHJsWzFdICYgMHgwMykgeworCQljYXNlIDA6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1JSOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWdocC0+Y21kID0gR1BSU19MTENfQUNLOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfUk5SOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfU0FDSzsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmICgoY3RybFswXSAmIDB4ZTApID09IDB4YzApIHsKKwkJLyogVUkgKFVuY29uZmlybWVkIEluZm9yYW10aW9uKSBmb3JtYXQgKi8KKwkJZ2hwLT5kYXRhID0gY3RybCArIDI7CisJCWdocC0+ZGF0YV9sZW4gPSAobGxjX2hkciArIGxlbiAtIDMpIC0gZ2hwLT5kYXRhOworCisJCWdocC0+c2VxX3R4ICA9IChjdHJsWzBdICYgMHg3KSA8PCA2OworCQlnaHAtPnNlcV90eCB8PSAoY3RybFsxXSA+PiAyKTsKKwkJaWYgKGN0cmxbMV0gJiAweDAyKSB7CisJCQlnaHAtPmlzX2VuY3J5cHRlZCA9IDE7CisJCQkvKiBGSVhNRTogZW5jcnlwdGlvbiAqLworCQl9CisJCWlmIChjdHJsWzFdICYgMHgwMSkgeworCQkJLyogRkNTIG92ZXIgaGRyICsgYWxsIGluZiBmaWVsZHMgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIEZDUyBvdmVyIGhkciArIE4yMDIgb2N0ZXRzICg0KSAqLworCQkJaWYgKGNyY19sZW5ndGggPiBVSV9IRFJfTEVOICsgTjIwMikKKwkJCQljcmNfbGVuZ3RoID0gVUlfSERSX0xFTiArIE4yMDI7CisJCX0KKwl9IGVsc2UgeworCQkvKiBVIChVbm51bWJlcmVkKSBmb3JtYXQ6IDEgMSAxIFAvRiBNNCBNMyBNMiBNMSAqLworCQlnaHAtPmRhdGEgPSBOVUxMOworCQlnaHAtPmRhdGFfbGVuID0gMDsKKworCQlzd2l0Y2ggKGN0cmxbMF0gJiAweGYpIHsKKwkJY2FzZSBHUFJTX0xMQ19VX05VTExfQ01EOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19OVUxMOworCQkJYnJlYWs7CisJCWNhc2UgR1BSU19MTENfVV9ETV9SRVNQOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19ETTsKKwkJCWJyZWFrOworCQljYXNlIEdQUlNfTExDX1VfRElTQ19DTUQ6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX0RJU0M7CisJCQlicmVhazsKKwkJY2FzZSBHUFJTX0xMQ19VX1VBX1JFU1A6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1VBOworCQkJYnJlYWs7CisJCWNhc2UgR1BSU19MTENfVV9TQUJNX0NNRDoKKwkJCWdocC0+Y21kID0gR1BSU19MTENfU0FCTTsKKwkJCWJyZWFrOworCQljYXNlIEdQUlNfTExDX1VfRlJNUl9SRVNQOgorCQkJZ2hwLT5jbWQgPSBHUFJTX0xMQ19GUk1SOworCQkJYnJlYWs7CisJCWNhc2UgR1BSU19MTENfVV9YSUQ6CisJCQlnaHAtPmNtZCA9IEdQUlNfTExDX1hJRDsKKwkJCWdocC0+ZGF0YSA9IGN0cmwgKyAxOworCQkJZ2hwLT5kYXRhX2xlbiA9IChsbGNfaGRyICsgbGVuIC0gMykgLSBnaHAtPmRhdGE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJLyogY2FsY3VsYXRlIHdoYXQgRkNTIHdlIGV4cGVjdCAqLworCWdocC0+ZmNzX2NhbGMgPSBncHJzX2xsY19mY3MobGxjX2hkciwgY3JjX2xlbmd0aCk7CisKKwkvKiBGSVhNRTogcGFyc2Ugc2FjayBmcmFtZSAqLworfQorCisvKiByZWNlaXZlIGFuIGluY29taW5nIExMQyBQRFUgKEJTU0dQLVVMLVVOSVREQVRBLUlORCwgNy4yLjQuMikgKi8KK2ludCBncHJzX2xsY19yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHRsdl9wYXJzZWQgKnR2KQoreworCXN0cnVjdCBic3NncF91ZF9oZHIgKnVkaCA9IChzdHJ1Y3QgYnNzZ3BfdWRfaGRyICopIG1zZ2JfYnNzZ3BoKG1zZyk7CisJc3RydWN0IGdwcnNfbGxjX2hkciAqbGggPSBtc2diX2xsY2gobXNnKTsKKwlzdHJ1Y3QgZ3Byc19sbGNfaGRyX3BhcnNlZCBsbGhwOworCXN0cnVjdCBncHJzX2xsY19sbGUgKmxsZTsKKwlpbnQgcmMgPSAwOworCisJLyogSWRlbnRpZmllcnMgZnJvbSBET1dOOiBOU0VJLCBCVkNJLCBUTExJICovCisKKwlyYyA9IGdwcnNfbGxjX2hkcl9wYXJzZSgmbGxocCwgbGgsIFRMVlBfTEVOKHR2LCBCU1NHUF9JRV9MTENfUERVKSk7CisJLyogRklYTUUgKi8KKworCWdwcnNfbGxjX2hkcl9kdW1wKCZsbGhwKTsKKworCS8qIGZpbmQgdGhlIExMQyBFbnRpdHkgZm9yIHRoaXMgVExMSStTQVBJIHR1cGxlICovCisJbGxlID0gbGxlX2J5X3RsbGlfc2FwaShtc2diX3RsbGkobXNnKSwgbGxocC5zYXBpKTsKKwkvKiBhbGxvY2F0ZSBhIG5ldyBMTEUgaWYgbmVlZGVkICovCisJaWYgKCFsbGUpCisJCWxsZSA9IGxsZV9hbGxvYyhtc2diX3RsbGkobXNnKSwgbGxocC5zYXBpKTsKKworCS8qIFVwZGF0ZSBMTEUncyAoQlZDSSwgTlNFSSkgdHVwbGUgKi8KKwlsbGUtPmJ2Y2kgPSBtc2diX2J2Y2kobXNnKTsKKwlsbGUtPm5zZWkgPSBtc2diX25zZWkobXNnKTsKKworCXJjID0gZ3Byc19sbGNfaGRyX3J4KCZsbGhwLCBsbGUpOworCS8qIEZJWE1FICovCisKKwlpZiAobGxocC5kYXRhKSB7CisJCW1zZ2JfZ21taChtc2cpID0gbGxocC5kYXRhOworCQlzd2l0Y2ggKGxsaHAuc2FwaSkgeworCQljYXNlIEdQUlNfU0FQSV9HTU06CisJCQlyYyA9IGdzbTA0MDhfZ3Byc19yY3Ztc2cobXNnKTsKKwkJCWJyZWFrOworCQljYXNlIEdQUlNfU0FQSV9UT00yOgorCQljYXNlIEdQUlNfU0FQSV9UT004OgorCQkJLyogRklYTUUgKi8KKwkJY2FzZSBHUFJTX1NBUElfU05EQ1AzOgorCQljYXNlIEdQUlNfU0FQSV9TTkRDUDU6CisJCWNhc2UgR1BSU19TQVBJX1NORENQOToKKwkJY2FzZSBHUFJTX1NBUElfU05EQ1AxMToKKwkJCS8qIEZJWE1FICovCisJCWNhc2UgR1BSU19TQVBJX1NNUzoKKwkJCS8qIEZJWE1FICovCisJCWRlZmF1bHQ6CisJCQlMT0dQKERHUFJTLCBMT0dMX05PVElDRSwgIlVuc3VwcG9ydGVkIFNBUEkgJXVcbiIsIGxsaHAuc2FwaSk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ucy5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0ZTJlYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19ucy5jCkBAIC0wLDAgKzEsOTE1IEBACisvKiBHUFJTIE5ldHdvcmtzIFNlcnZpY2UgKE5TKSBtZXNzYWdlcyBvbiB0aGUgR2IgaW50ZXJmYWNlYnZjaSA9IG1zZ2JfYnZjaShtc2cpOworICogM0dQUCBUUyAwOC4xNiB2ZXJzaW9uIDguMC4xIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAxIDI5OSBWOC4wLjEgKDIwMDItMDUpICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworLyogU29tZSBpbnRyb2R1Y3Rpb24gaW50byBOUzogIE5TIGlzIHVzZWQgdHlwaWNhbGx5IG9uIHRvcCBvZiBmcmFtZSByZWxheSwKKyAqIGJ1dCBpbiB0aGUgaXAuYWNjZXNzIHdvcmxkIGl0IGlzIGVuY2Fwc3VsYXRlZCBpbiBVRFAgcGFja2V0cy4gIEl0IHNlcnZlcworICogYXMgYW4gaW50ZXJtZWRpYXRlIHNoaW0gYmV0d2VuIEJTU0dQIGFuZCB0aGUgdW5kZXJseWluZyBtZWRpdW0uICBJdCBkb2Vzbid0CisgKiBkbyBtdWNoLCBhcGFydCBmcm9tIHByb3ZpZGluZyBjb25nZXN0aW9uIG5vdGlmaWNhdGlvbiBhbmQgc3RhdHVzIGluZGljYXRpb24uCisgKgorICogVGVybXM6CisgKiAJTlMJCU5ldHdvcmsgU2VydmljZQorICoJTlNWQwkJTlMgVmlydHVhbCBDb25uZWN0aW9uCisgKglOU0VJCQlOUyBFbnRpdHkgSWRlbnRpZmllcgorICoJTlNWTAkJTlMgVmlydHVhbCBMaW5rCisgKglOU1ZMSQkJTlMgVmlydHVhbCBMaW5rIElkZW50aWZpZXIKKyAqCUJWQwkJQlNTR1AgVmlydHVhbCBDb25uZWN0aW9uCisgKglCVkNJCQlCU1NHUCBWaXJ0dWFsIENvbm5lY3Rpb24gSWRlbnRpZmllcgorICoJTlNWQ0cJCU5TIFZpcnR1YWwgQ29ubmVjdGlvbiBHb3VwCisgKglCbG9ja2VkCQlOUy1WQyBjYW5ub3QgYmUgdXNlZCBmb3IgdXNlciB0cmFmZmljCisgKglBbGl2ZQkJQWJpbGl0eSBvZiBhIE5TLVZDIHRvIHByb3ZpZGUgY29tbXVuaWNhdGlvbgorICoKKyAqICBUaGVyZSBjYW4gYmUgbXVsdGlwbGUgQlNTR1AgdmlydHVhbCBjb25uZWN0aW9ucyBvdmVyIG9uZSAoZ3JvdXAgb2YpIE5TVkMncy4gIEJTU0dQIHdpbGwKKyAqIHRoZXJlZm9yZSBpZGVudGlmeSB0aGUgQlNTR1AgdmlydHVhbCBjb25uZWN0aW9uIGJ5IGEgQlZDSSBwYXNzZWQgZG93biB0byBOUy4KKyAqIE5TIHRoZW4gaGFzIHRvIGZpcmd1cmUgb3V0IHdoaWNoIE5TVkMncyBhcmUgcmVzcG9uc2libGUgZm9yIHRoaXMgQlZDSS4KKyAqIFRob3NlIG1hcHBpbmdzIGFyZSBhZG1pbmlzdHJhdGl2ZWx5IGNvbmZpZ3VyZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcmF0ZV9jdHIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKworI2RlZmluZSBOU19BTExPQ19TSVpFCTEwMjQKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBuc19hdHRfdGx2ZGVmID0geworCS5kZWYgPSB7CisJCVtOU19JRV9DQVVTRV0JPSB7IFRMVl9UWVBFX1R2TFYsIDAgfSwKKwkJW05TX0lFX1ZDSV0JPSB7IFRMVl9UWVBFX1R2TFYsIDAgfSwKKwkJW05TX0lFX1BEVV0JPSB7IFRMVl9UWVBFX1R2TFYsIDAgfSwKKwkJW05TX0lFX0JWQ0ldCT0geyBUTFZfVFlQRV9UdkxWLCAwIH0sCisJCVtOU19JRV9OU0VJXQk9IHsgVExWX1RZUEVfVHZMViwgMCB9LAorCX0sCit9OworCitlbnVtIG5zX2N0ciB7CisJTlNfQ1RSX1BLVFNfSU4sCisJTlNfQ1RSX1BLVFNfT1VULAorCU5TX0NUUl9CWVRFU19JTiwKKwlOU19DVFJfQllURVNfT1VULAorCU5TX0NUUl9CTE9DS0VELAorCU5TX0NUUl9ERUFELAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByYXRlX2N0cl9kZXNjIG5zdmNfY3RyX2Rlc2NyaXB0aW9uW10gPSB7CisJeyAicGFja2V0cy5pbiIsICJQYWNrZXRzIGF0IE5TIExldmVsICggSW4pIiB9LAorCXsgInBhY2tldHMub3V0IiwiUGFja2V0cyBhdCBOUyBMZXZlbCAoT3V0KSIgfSwKKwl7ICJieXRlcy5pbiIsCSJCeXRlcyBhdCBOUyBMZXZlbCAgICggSW4pIiB9LAorCXsgImJ5dGVzLm91dCIsCSJCeXRlcyBhdCBOUyBMZXZlbCAgIChPdXQpIiB9LAorCXsgImJsb2NrZWQiLAkiTlMtVkMgQmxvY2sgY291bnQgICAgICAgICIgfSwKKwl7ICJkZWFkIiwJIk5TLVZDIGdvbmUgZGVhZCBjb3VudCAgICAiIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhdGVfY3RyX2dyb3VwX2Rlc2MgbnN2Y19jdHJnX2Rlc2MgPSB7CisJLmdyb3VwX25hbWVfcHJlZml4ID0gIm5zLm5zdmMiLAorCS5ncm91cF9kZXNjcmlwdGlvbiA9ICJOU1ZDIFBlZXIgU3RhdGlzdGljcyIsCisJLm51bV9jdHIgPSBBUlJBWV9TSVpFKG5zdmNfY3RyX2Rlc2NyaXB0aW9uKSwKKwkuY3RyX2Rlc2MgPSBuc3ZjX2N0cl9kZXNjcmlwdGlvbiwKK307CisKKy8qIExvb2t1cCBzdHJ1Y3QgZ3Byc19uc3ZjIGJhc2VkIG9uIE5TVkNJICovCitzdGF0aWMgc3RydWN0IGdwcnNfbnN2YyAqbnN2Y19ieV9uc3ZjaShzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksCisJCQkJCXVpbnQxNl90IG5zdmNpKQoreworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisJbGxpc3RfZm9yX2VhY2hfZW50cnkobnN2YywgJm5zaS0+Z3Byc19uc3ZjcywgbGlzdCkgeworCQlpZiAobnN2Yy0+bnN2Y2kgPT0gbnN2Y2kpCisJCQlyZXR1cm4gbnN2YzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIExvb2t1cCBzdHJ1Y3QgZ3Byc19uc3ZjIGJhc2VkIG9uIE5TVkNJICovCitzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjX2J5X25zZWkoc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLCB1aW50MTZfdCBuc2VpKQoreworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisJbGxpc3RfZm9yX2VhY2hfZW50cnkobnN2YywgJm5zaS0+Z3Byc19uc3ZjcywgbGlzdCkgeworCQlpZiAobnN2Yy0+bnNlaSA9PSBuc2VpKQorCQkJcmV0dXJuIG5zdmM7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBMb29rdXAgc3RydWN0IGdwcnNfbnN2YyBiYXNlZCBvbiByZW1vdGUgcGVlciBzb2NrZXQgYWRkciAqLworc3RhdGljIHN0cnVjdCBncHJzX25zdmMgKm5zdmNfYnlfcmVtX2FkZHIoc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLAorCQkJCQkgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKQoreworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisJbGxpc3RfZm9yX2VhY2hfZW50cnkobnN2YywgJm5zaS0+Z3Byc19uc3ZjcywgbGlzdCkgeworCQlpZiAobnN2Yy0+aXAuYnRzX2FkZHIuc2luX2FkZHIuc19hZGRyID09CisJCQkJCXNpbi0+c2luX2FkZHIuc19hZGRyICYmCisJCSAgICBuc3ZjLT5pcC5idHNfYWRkci5zaW5fcG9ydCA9PSBzaW4tPnNpbl9wb3J0KQorCQkJcmV0dXJuIG5zdmM7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBncHJzX25zX3RpbWVyX2NiKHZvaWQgKmRhdGEpOworCitzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjX2NyZWF0ZShzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksIHVpbnQxNl90IG5zdmNpKQoreworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisKKwluc3ZjID0gdGFsbG9jX3plcm8obnNpLCBzdHJ1Y3QgZ3Byc19uc3ZjKTsKKwluc3ZjLT5uc3ZjaSA9IG5zdmNpOworCS8qIGJlZm9yZSBSRVNFVCBwcm9jZWR1cmU6IEJMT0NLRUQgYW5kIERFQUQgKi8KKwluc3ZjLT5zdGF0ZSA9IE5TRV9TX0JMT0NLRUQ7CisJbnN2Yy0+bnNpID0gbnNpOworCW5zdmMtPnRpbWVyLmNiID0gZ3Byc19uc190aW1lcl9jYjsKKwluc3ZjLT50aW1lci5kYXRhID0gbnN2YzsKKwluc3ZjLT5jdHJnID0gcmF0ZV9jdHJfZ3JvdXBfYWxsb2MobnN2YywgJm5zdmNfY3RyZ19kZXNjLCBuc3ZjaSk7CisKKwlsbGlzdF9hZGQoJm5zdmMtPmxpc3QsICZuc2ktPmdwcnNfbnN2Y3MpOworCisJcmV0dXJuIG5zdmM7Cit9CisKK3ZvaWQgbnN2Y19kZWxldGUoc3RydWN0IGdwcnNfbnN2YyAqbnN2YykKK3sKKwlpZiAoYnNjX3RpbWVyX3BlbmRpbmcoJm5zdmMtPnRpbWVyKSkKKwkJYnNjX2RlbF90aW1lcigmbnN2Yy0+dGltZXIpOworCWxsaXN0X2RlbCgmbnN2Yy0+bGlzdCk7CisJdGFsbG9jX2ZyZWUobnN2Yyk7Cit9CisKK3N0YXRpYyB2b2lkIG5zX2Rpc3BhdGNoX3NpZ25hbChzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJICAgICAgIHVpbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IG5zX3NpZ25hbF9kYXRhIG5zc2Q7CisKKwluc3NkLm5zdmMgPSBuc3ZjOworCW5zc2QuY2F1c2UgPSBjYXVzZTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19OUywgc2lnbmFsLCAmbnNzZCk7Cit9CisKKy8qIFNlY3Rpb24gMTAuMy4yLCBUYWJsZSAxMyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbnNfY2F1c2Vfc3RyW10gPSB7CisJeyBOU19DQVVTRV9UUkFOU0lUX0ZBSUwsCSJUcmFuc2l0IG5ldHdvcmsgZmFpbHVyZSIgfSwKKwl7IE5TX0NBVVNFX09NX0lOVEVSVkVOVElPTiwgCSJPJk0gaW50ZXJ2ZW50aW9uIiB9LAorCXsgTlNfQ0FVU0VfRVFVSVBfRkFJTCwJCSJFcXVpcG1lbnQgZmFpbHVyZSIgfSwKKwl7IE5TX0NBVVNFX05TVkNfQkxPQ0tFRCwJIk5TLVZDIGJsb2NrZWQiIH0sCisJeyBOU19DQVVTRV9OU1ZDX1VOS05PV04sCSJOUy1WQyB1bmtub3duIiB9LAorCXsgTlNfQ0FVU0VfQlZDSV9VTktOT1dOLAkiQlZDSSB1bmtub3duIiB9LAorCXsgTlNfQ0FVU0VfU0VNX0lOQ09SUl9QRFUsCSJTZW1hbnRpY2FsbHkgaW5jb3JyZWN0IFBEVSIgfSwKKwl7IE5TX0NBVVNFX1BEVV9JTkNPTVBfUFNUQVRFLAkiUERVIG5vdCBjb21wYXRpYmxlIHdpdGggcHJvdG9jb2wgc3RhdGUiIH0sCisJeyBOU19DQVVTRV9QUk9UT19FUlJfVU5TUEVDLAkiUHJvdG9jb2wgZXJyb3IsIHVuc3BlY2lmaWVkIiB9LAorCXsgTlNfQ0FVU0VfSU5WQUxfRVNTRU5UX0lFLAkiSW52YWxpZCBlc3NlbnRpYWwgSUUiIH0sCisJeyBOU19DQVVTRV9NSVNTSU5HX0VTU0VOVF9JRSwJIk1pc3NpbmcgZXNzZW50aWFsIElFIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpncHJzX25zX2NhdXNlX3N0cihlbnVtIG5zX2NhdXNlIGNhdXNlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKG5zX2NhdXNlX3N0ciwgY2F1c2UpOworfQorCitzdGF0aWMgaW50IG5zaXBfc2VuZG1zZyhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKworc3RhdGljIGludCBncHJzX25zX3R4KHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHN0cnVjdCBtc2diICptc2cpCit7CisJaW50IHJldDsKKworCS8qIEluY3JlbWVudCBudW1iZXIgb2YgVXBsaW5rIGJ5dGVzICovCisJcmF0ZV9jdHJfaW5jKCZuc3ZjLT5jdHJnLT5jdHJbTlNfQ1RSX1BLVFNfT1VUXSk7CisJcmF0ZV9jdHJfYWRkKCZuc3ZjLT5jdHJnLT5jdHJbTlNfQ1RSX0JZVEVTX09VVF0sIG1zZ2JfbDJsZW4obXNnKSk7CisKKwlzd2l0Y2ggKG5zdmMtPm5zaS0+bGwpIHsKKwljYXNlIEdQUlNfTlNfTExfVURQOgorCQlyZXQgPSBuc2lwX3NlbmRtc2cobnN2YywgbXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZCBOUyBsaW5rbGF5ZXIgJXVcbiIsIG5zdmMtPm5zaS0+bGwpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0ID0gLUVJTzsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3Byc19uc190eF9zaW1wbGUoc3RydWN0IGdwcnNfbnN2YyAqbnN2YywgdWludDhfdCBwZHVfdHlwZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhOU19BTExPQ19TSVpFLCAiR1BSUy9OUyIpOworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoOworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIHNpemVvZigqbnNoKSk7CisJbnNoID0gKHN0cnVjdCBncHJzX25zX2hkciAqKSBtc2ctPmwyaDsKKworCW5zaC0+cGR1X3R5cGUgPSBwZHVfdHlwZTsKKworCXJldHVybiBncHJzX25zX3R4KG5zdmMsIG1zZyk7Cit9CisKK2ludCBncHJzX25zX3R4X3Jlc2V0KHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoTlNfQUxMT0NfU0laRSwgIkdQUlMvTlMiKTsKKwlzdHJ1Y3QgZ3Byc19uc19oZHIgKm5zaDsKKwl1aW50MTZfdCBuc3ZjaSA9IGh0b25zKG5zdmMtPm5zdmNpKTsKKwl1aW50MTZfdCBuc2VpID0gaHRvbnMobnN2Yy0+bnNlaSk7CisKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBUeCBOUyBSRVNFVCAoTlNWQ0k9JXUsIGNhdXNlPSVzKVxuIiwKKwkJbnN2Yy0+bnNlaSwgbnN2Yy0+bnN2Y2ksIGdwcnNfbnNfY2F1c2Vfc3RyKGNhdXNlKSk7CisKKwltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpuc2gpKTsKKwluc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCW5zaC0+cGR1X3R5cGUgPSBOU19QRFVUX1JFU0VUOworCisJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX0NBVVNFLCAxLCAmY2F1c2UpOworCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9WQ0ksIDIsICh1aW50OF90ICopICZuc3ZjaSk7CisJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX05TRUksIDIsICh1aW50OF90ICopICZuc2VpKTsKKworCXJldHVybiBncHJzX25zX3R4KG5zdmMsIG1zZyk7CisKK30KKworaW50IGdwcnNfbnNfdHhfc3RhdHVzKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgY2F1c2UsCisJCSAgICAgIHVpbnQxNl90IGJ2Y2ksIHN0cnVjdCBtc2diICpvcmlnX21zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhOU19BTExPQ19TSVpFLCAiR1BSUy9OUyIpOworCXN0cnVjdCBncHJzX25zX2hkciAqbnNoOworCXVpbnQxNl90IG5zdmNpID0gaHRvbnMobnN2Yy0+bnN2Y2kpOworCisJYnZjaSA9IGh0b25zKGJ2Y2kpOworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgVHggTlMgU1RBVFVTIChOU1ZDST0ldSwgY2F1c2U9JXMpXG4iLAorCQluc3ZjLT5uc2VpLCBuc3ZjLT5uc3ZjaSwgZ3Byc19uc19jYXVzZV9zdHIoY2F1c2UpKTsKKworCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBzaXplb2YoKm5zaCkpOworCW5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnLT5sMmg7CisJbnNoLT5wZHVfdHlwZSA9IE5TX1BEVVRfU1RBVFVTOworCisJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX0NBVVNFLCAxLCAmY2F1c2UpOworCisJLyogU2VjdGlvbiA5LjIuNy4xOiBTdGF0aWMgY29uZGl0aW9ucyBmb3IgTlMtVkNJICovCisJaWYgKGNhdXNlID09IE5TX0NBVVNFX05TVkNfQkxPQ0tFRCB8fAorCSAgICBjYXVzZSA9PSBOU19DQVVTRV9OU1ZDX1VOS05PV04pCisJCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9WQ0ksIDIsICh1aW50OF90ICopJm5zdmNpKTsKKworCS8qIFNlY3Rpb24gOS4yLjcuMjogU3RhdGljIGNvbmRpdGlvbnMgZm9yIE5TIFBEVSAqLworCXN3aXRjaCAoY2F1c2UpIHsKKwljYXNlIE5TX0NBVVNFX1NFTV9JTkNPUlJfUERVOgorCWNhc2UgTlNfQ0FVU0VfUERVX0lOQ09NUF9QU1RBVEU6CisJY2FzZSBOU19DQVVTRV9QUk9UT19FUlJfVU5TUEVDOgorCWNhc2UgTlNfQ0FVU0VfSU5WQUxfRVNTRU5UX0lFOgorCWNhc2UgTlNfQ0FVU0VfTUlTU0lOR19FU1NFTlRfSUU6CisJCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9QRFUsIG1zZ2JfbDJsZW4ob3JpZ19tc2cpLAorCQkJICAgICAgb3JpZ19tc2ctPmwyaCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qIFNlY3Rpb24gOS4yLjcuMzogU3RhdGljIGNvbmRpdGlvbnMgZm9yIEJWQ0kgKi8KKwlpZiAoY2F1c2UgPT0gTlNfQ0FVU0VfQlZDSV9VTktOT1dOKQorCQltc2diX3R2bHZfcHV0KG1zZywgTlNfSUVfVkNJLCAyLCAodWludDhfdCAqKSZidmNpKTsKKworCXJldHVybiBncHJzX25zX3R4KG5zdmMsIG1zZyk7Cit9CisKK2ludCBncHJzX25zX3R4X2Jsb2NrKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHVpbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoTlNfQUxMT0NfU0laRSwgIkdQUlMvTlMiKTsKKwlzdHJ1Y3QgZ3Byc19uc19oZHIgKm5zaDsKKwl1aW50MTZfdCBuc3ZjaSA9IGh0b25zKG5zdmMtPm5zdmNpKTsKKworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUxPR1AoRE5TLCBMT0dMX0lORk8sICJOU0VJPSV1IFR4IE5TIEJMT0NLIChOU1ZDST0ldSwgY2F1c2U9JXMpXG4iLAorCQluc3ZjLT5uc2VpLCBuc3ZjLT5uc3ZjaSwgZ3Byc19uc19jYXVzZV9zdHIoY2F1c2UpKTsKKworCS8qIGJlIGNvbnNlcnZhdGl2ZSBhbmQgbWFyayBpdCBhcyBibG9ja2VkIGV2ZW4gbm93ISAqLworCW5zdmMtPnN0YXRlIHw9IE5TRV9TX0JMT0NLRUQ7CisJcmF0ZV9jdHJfaW5jKCZuc3ZjLT5jdHJnLT5jdHJbTlNfQ1RSX0JMT0NLRURdKTsKKworCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBzaXplb2YoKm5zaCkpOworCW5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnLT5sMmg7CisJbnNoLT5wZHVfdHlwZSA9IE5TX1BEVVRfQkxPQ0s7CisKKwltc2diX3R2bHZfcHV0KG1zZywgTlNfSUVfQ0FVU0UsIDEsICZjYXVzZSk7CisJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX1ZDSSwgMiwgKHVpbnQ4X3QgKikgJm5zdmNpKTsKKworCXJldHVybiBncHJzX25zX3R4KG5zdmMsIG1zZyk7Cit9CisKK2ludCBncHJzX25zX3R4X3VuYmxvY2soc3RydWN0IGdwcnNfbnN2YyAqbnN2YykKK3sKKwlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBUeCBOUyBVTkJMT0NLIChOU1ZDST0ldSlcbiIsCisJCW5zdmMtPm5zZWksIG5zdmMtPm5zdmNpKTsKKworCXJldHVybiBncHJzX25zX3R4X3NpbXBsZShuc3ZjLCBOU19QRFVUX1VOQkxPQ0spOworfQorCitpbnQgZ3Byc19uc190eF9hbGl2ZShzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjKQoreworCUxPR1AoRE5TLCBMT0dMX0RFQlVHLCAiTlNFST0ldSBUeCBOUyBBTElWRSAoTlNWQ0k9JXUpXG4iLAorCQluc3ZjLT5uc2VpLCBuc3ZjLT5uc3ZjaSk7CisKKwlyZXR1cm4gZ3Byc19uc190eF9zaW1wbGUobnN2YywgTlNfUERVVF9BTElWRSk7Cit9CisKK2ludCBncHJzX25zX3R4X2FsaXZlX2FjayhzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjKQoreworCUxPR1AoRE5TLCBMT0dMX0RFQlVHLCAiTlNFST0ldSBUeCBOUyBBTElWRV9BQ0sgKE5TVkNJPSV1KVxuIiwKKwkJbnN2Yy0+bnNlaSwgbnN2Yy0+bnN2Y2kpOworCisJcmV0dXJuIGdwcnNfbnNfdHhfc2ltcGxlKG5zdmMsIE5TX1BEVVRfQUxJVkVfQUNLKTsKK30KKworc3RhdGljIGNvbnN0IGVudW0gbnNfdGltZW91dCB0aW1lcl9tb2RlX3RvdXRbX05TVkNfVElNRVJfTlJdID0geworCVtOU1ZDX1RJTUVSX1ROU19SRVNFVF0JPSBOU19UT1VUX1ROU19SRVNFVCwKKwlbTlNWQ19USU1FUl9UTlNfQUxJVkVdCT0gTlNfVE9VVF9UTlNfQUxJVkUsCisJW05TVkNfVElNRVJfVE5TX1RFU1RdCT0gTlNfVE9VVF9UTlNfVEVTVCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIHRpbWVyX21vZGVfc3Ryc1tdID0geworCXsgTlNWQ19USU1FUl9UTlNfUkVTRVQsICJ0bnMtcmVzZXQiIH0sCisJeyBOU1ZDX1RJTUVSX1ROU19BTElWRSwgInRucy1hbGl2ZSIgfSwKKwl7IE5TVkNfVElNRVJfVE5TX1RFU1QsICJ0bnMtdGVzdCIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIHZvaWQgbnN2Y19zdGFydF90aW1lcihzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjLCBlbnVtIG5zdmNfdGltZXJfbW9kZSBtb2RlKQoreworCWVudW0gbnNfdGltZW91dCB0b3V0ID0gdGltZXJfbW9kZV90b3V0W21vZGVdOworCXVuc2lnbmVkIGludCBzZWNvbmRzID0gbnN2Yy0+bnNpLT50aW1lb3V0W3RvdXRdOworCisJREVCVUdQKEROUywgIk5TRUk9JXUgU3RhcnRpbmcgdGltZXIgaW4gbW9kZSAlcyAoJXUgc2Vjb25kcylcbiIsCisJCW5zdmMtPm5zZWksIGdldF92YWx1ZV9zdHJpbmcodGltZXJfbW9kZV9zdHJzLCBtb2RlKSwKKwkJc2Vjb25kcyk7CisJCQorCWlmIChic2NfdGltZXJfcGVuZGluZygmbnN2Yy0+dGltZXIpKQorCQlic2NfZGVsX3RpbWVyKCZuc3ZjLT50aW1lcik7CisKKwluc3ZjLT50aW1lcl9tb2RlID0gbW9kZTsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJm5zdmMtPnRpbWVyLCBzZWNvbmRzLCAwKTsKK30KKworc3RhdGljIHZvaWQgZ3Byc19uc190aW1lcl9jYih2b2lkICpkYXRhKQoreworCXN0cnVjdCBncHJzX25zdmMgKm5zdmMgPSBkYXRhOworCWVudW0gbnNfdGltZW91dCB0b3V0ID0gdGltZXJfbW9kZV90b3V0W25zdmMtPnRpbWVyX21vZGVdOworCXVuc2lnbmVkIGludCBzZWNvbmRzID0gbnN2Yy0+bnNpLT50aW1lb3V0W3RvdXRdOworCisJREVCVUdQKEROUywgIk5TRUk9JXUgVGltZXIgZXhwaXJlZCBpbiBtb2RlICVzICgldSBzZWNvbmRzKVxuIiwKKwkJbnN2Yy0+bnNlaSwgZ2V0X3ZhbHVlX3N0cmluZyh0aW1lcl9tb2RlX3N0cnMsIG5zdmMtPnRpbWVyX21vZGUpLAorCQlzZWNvbmRzKTsKKwkJCisJc3dpdGNoIChuc3ZjLT50aW1lcl9tb2RlKSB7CisJY2FzZSBOU1ZDX1RJTUVSX1ROU19BTElWRToKKwkJLyogVG5zLWFsaXZlIGNhc2U6IHdlIGV4cGlyZWQgd2l0aG91dCByZXNwb25zZSAhICovCisJCW5zdmMtPmFsaXZlX3JldHJpZXMrKzsKKwkJaWYgKG5zdmMtPmFsaXZlX3JldHJpZXMgPgorCQkJbnN2Yy0+bnNpLT50aW1lb3V0W05TX1RPVVRfVE5TX0FMSVZFX1JFVFJJRVNdKSB7CisJCQkvKiBtYXJrIGFzIGRlYWQgYW5kIGJsb2NrZWQgKi8KKwkJCW5zdmMtPnN0YXRlID0gTlNFX1NfQkxPQ0tFRDsKKwkJCXJhdGVfY3RyX2luYygmbnN2Yy0+Y3RyZy0+Y3RyW05TX0NUUl9CTE9DS0VEXSk7CisJCQlyYXRlX2N0cl9pbmMoJm5zdmMtPmN0cmctPmN0cltOU19DVFJfREVBRF0pOworCQkJTE9HUChETlMsIExPR0xfTk9USUNFLAorCQkJCSJOU0VJPSV1IFRucy1hbGl2ZSBleHBpcmVkIG1vcmUgdGhlbiAiCisJCQkJIiV1IHRpbWVzLCBibG9ja2luZyBOUy1WQ1xuIiwgbnN2Yy0+bnNlaSwKKwkJCQluc3ZjLT5uc2ktPnRpbWVvdXRbTlNfVE9VVF9UTlNfQUxJVkVfUkVUUklFU10pOworCQkJbnNfZGlzcGF0Y2hfc2lnbmFsKG5zdmMsIFNfTlNfQUxJVkVfRVhQLCAwKTsKKwkJCW5zX2Rpc3BhdGNoX3NpZ25hbChuc3ZjLCBTX05TX0JMT0NLLCBOU19DQVVTRV9OU1ZDX0JMT0NLRUQpOworCQkJcmV0dXJuOworCQl9CisJCS8qIFRucy10ZXN0IGNhc2U6IHNlbmQgTlMtQUxJVkUgUERVICovCisJCWdwcnNfbnNfdHhfYWxpdmUobnN2Yyk7CisJCS8qIHN0YXJ0IFRucy1hbGl2ZSB0aW1lciAqLworCQluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX0FMSVZFKTsKKwkJYnJlYWs7CisJY2FzZSBOU1ZDX1RJTUVSX1ROU19URVNUOgorCQkvKiBUbnMtdGVzdCBjYXNlOiBzZW5kIE5TLUFMSVZFIFBEVSAqLworCQlncHJzX25zX3R4X2FsaXZlKG5zdmMpOworCQkvKiBzdGFydCBUbnMtYWxpdmUgdGltZXIgKHRyYW5zaXRpb24gaW50byBmYXN0ZXIKKwkJICogYWxpdmUgcmV0cmFuc21pc3Npb25zKSAqLworCQluc3ZjLT5hbGl2ZV9yZXRyaWVzID0gMDsKKwkJbnN2Y19zdGFydF90aW1lcihuc3ZjLCBOU1ZDX1RJTUVSX1ROU19BTElWRSk7CisJCWJyZWFrOworCWNhc2UgTlNWQ19USU1FUl9UTlNfUkVTRVQ6CisJCS8qIENoYXB0ZXIgNy4zOiBSZS1zZW5kIHRoZSBSRVNFVCAqLworCQlncHJzX25zX3R4X3Jlc2V0KG5zdmMsIE5TX0NBVVNFX09NX0lOVEVSVkVOVElPTik7CisJCS8qIFJlLXN0YXJ0IFRucy1yZXNldCB0aW1lciAqLworCQluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX1JFU0VUKTsKKwkJYnJlYWs7CisJY2FzZSBfTlNWQ19USU1FUl9OUjoKKwkJYnJlYWs7CisJfQorfQorCisvKiBTZWN0aW9uIDkuMi42ICovCitzdGF0aWMgaW50IGdwcnNfbnNfdHhfcmVzZXRfYWNrKHN0cnVjdCBncHJzX25zdmMgKm5zdmMpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoTlNfQUxMT0NfU0laRSwgIkdQUlMvTlMiKTsKKwlzdHJ1Y3QgZ3Byc19uc19oZHIgKm5zaDsKKwl1aW50MTZfdCBuc3ZjaSwgbnNlaTsKKworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5zdmNpID0gaHRvbnMobnN2Yy0+bnN2Y2kpOworCW5zZWkgPSBodG9ucyhuc3ZjLT5uc2VpKTsKKworCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBzaXplb2YoKm5zaCkpOworCW5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnLT5sMmg7CisKKwluc2gtPnBkdV90eXBlID0gTlNfUERVVF9SRVNFVF9BQ0s7CisKKwlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBUeCBOUyBSRVNFVCBBQ0sgKE5TVkNJPSV1KVxuIiwKKwkJbnN2Yy0+bnNlaSwgbnN2Yy0+bnN2Y2kpOworCisJbXNnYl90dmx2X3B1dChtc2csIE5TX0lFX1ZDSSwgMiwgKHVpbnQ4X3QgKikmbnN2Y2kpOworCW1zZ2JfdHZsdl9wdXQobXNnLCBOU19JRV9OU0VJLCAyLCAodWludDhfdCAqKSZuc2VpKTsKKworCXJldHVybiBncHJzX25zX3R4KG5zdmMsIG1zZyk7Cit9CisKKy8qIFNlY3Rpb24gOS4yLjEwOiB0cmFuc21pdCBzaWRlIC8gTlMtVU5JVERBVEEtUkVRVUVTVCBwcmltaXRpdmUgKi8KK2ludCBncHJzX25zX3NlbmRtc2coc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2g7CisJdWludDE2X3QgYnZjaSA9IG1zZ2JfYnZjaShtc2cpOworCisJbnN2YyA9IG5zdmNfYnlfbnNlaShuc2ksIG1zZ2JfbnNlaShtc2cpKTsKKwlpZiAoIW5zdmMpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJVbmFibGUgdG8gcmVzb2x2ZSBOU0VJICV1ICIKKwkJCSJ0byBOUy1WQyFcbiIsIG1zZ2JfbnNlaShtc2cpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCEobnN2Yy0+c3RhdGUgJiBOU0VfU19BTElWRSkpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJOU0VJPSV1IGlzIG5vdCBhbGl2ZSwgY2Fubm90IHNlbmRcbiIsCisJCQluc3ZjLT5uc2VpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKG5zdmMtPnN0YXRlICYgTlNFX1NfQkxPQ0tFRCkgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwgIk5TRUk9JXUgaXMgYmxvY2tlZCwgY2Fubm90IHNlbmRcbiIsCisJCQluc3ZjLT5uc2VpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwltc2ctPmwyaCA9IG1zZ2JfcHVzaChtc2csIHNpemVvZigqbnNoKSArIDMpOworCW5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnLT5sMmg7CisJaWYgKCFuc2gpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJOb3QgZW5vdWdoIGhlYWRyb29tIGZvciBOUyBoZWFkZXJcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwluc2gtPnBkdV90eXBlID0gTlNfUERVVF9VTklUREFUQTsKKwkvKiBzcGFyZSBvY3RldCBpbiBkYXRhWzBdICovCisJbnNoLT5kYXRhWzFdID0gYnZjaSA+PiA4OworCW5zaC0+ZGF0YVsyXSA9IGJ2Y2kgJiAweGZmOworCisJcmV0dXJuIGdwcnNfbnNfdHgobnN2YywgbXNnKTsKK30KKworLyogU2VjdGlvbiA5LjIuMTA6IHJlY2VpdmUgc2lkZSAqLworc3RhdGljIGludCBncHJzX25zX3J4X3VuaXRkYXRhKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopbXNnLT5sMmg7CisJdWludDE2X3QgYnZjaTsKKworCWlmIChuc3ZjLT5zdGF0ZSAmIE5TRV9TX0JMT0NLRUQpCisJCXJldHVybiBncHJzX25zX3R4X3N0YXR1cyhuc3ZjLCBOU19DQVVTRV9OU1ZDX0JMT0NLRUQsCisJCQkJCSAwLCBtc2cpOworCisJLyogc3BhcmUgb2N0ZXQgaW4gZGF0YVswXSAqLworCWJ2Y2kgPSBuc2gtPmRhdGFbMV0gPDwgOCB8IG5zaC0+ZGF0YVsyXTsKKwltc2diX2Jzc2dwaChtc2cpID0gJm5zaC0+ZGF0YVszXTsKKwltc2diX2J2Y2kobXNnKSA9IGJ2Y2k7CisKKwkvKiBjYWxsIHVwcGVyIGxheWVyIChCU1NHUCkgKi8KKwlyZXR1cm4gbnN2Yy0+bnNpLT5jYihHUFJTX05TX0VWVF9VTklUX0RBVEEsIG5zdmMsIG1zZywgYnZjaSk7Cit9CisKKy8qIFNlY3Rpb24gOS4yLjcgKi8KK3N0YXRpYyBpbnQgZ3Byc19uc19yeF9zdGF0dXMoc3RydWN0IGdwcnNfbnN2YyAqbnN2Yywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3Byc19uc19oZHIgKm5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnLT5sMmg7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdWludDhfdCBjYXVzZTsKKwlpbnQgcmM7CisKKwlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBOUyBTVEFUVVMgIiwgbnN2Yy0+bnNlaSk7CisKKwlyYyA9IHRsdl9wYXJzZSgmdHAsICZuc19hdHRfdGx2ZGVmLCBuc2gtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKSwgMCwgMCk7CisKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIE5TX0lFX0NBVVNFKSkgeworCQlMT0dQQyhETlMsIExPR0xfSU5GTywgIm1pc3NpbmcgY2F1c2UgSUVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljYXVzZSA9ICpUTFZQX1ZBTCgmdHAsIE5TX0lFX0NBVVNFKTsKKwlMT0dQQyhETlMsIExPR0xfSU5GTywgImNhdXNlPSVzXG4iLCBncHJzX25zX2NhdXNlX3N0cihjYXVzZSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNlY3Rpb24gNy4zICovCitzdGF0aWMgaW50IGdwcnNfbnNfcnhfcmVzZXQoc3RydWN0IGdwcnNfbnN2YyAqbnN2Yywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3Byc19uc19oZHIgKm5zaCA9IChzdHJ1Y3QgZ3Byc19uc19oZHIgKikgbXNnLT5sMmg7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdWludDhfdCAqY2F1c2U7CisJdWludDE2X3QgKm5zdmNpLCAqbnNlaTsKKwlpbnQgcmM7CisKKwlyYyA9IHRsdl9wYXJzZSgmdHAsICZuc19hdHRfdGx2ZGVmLCBuc2gtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKSwgMCwgMCk7CisKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIE5TX0lFX0NBVVNFKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgTlNfSUVfVkNJKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgTlNfSUVfTlNFSSkpIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJOUyBSRVNFVCBNaXNzaW5nIG1hbmRhdG9yeSBJRVxuIik7CisJCWdwcnNfbnNfdHhfc3RhdHVzKG5zdmMsIE5TX0NBVVNFX01JU1NJTkdfRVNTRU5UX0lFLCAwLCBtc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljYXVzZSA9ICh1aW50OF90ICopIFRMVlBfVkFMKCZ0cCwgTlNfSUVfQ0FVU0UpOworCW5zdmNpID0gKHVpbnQxNl90ICopIFRMVlBfVkFMKCZ0cCwgTlNfSUVfVkNJKTsKKwluc2VpID0gKHVpbnQxNl90ICopIFRMVlBfVkFMKCZ0cCwgTlNfSUVfTlNFSSk7CisKKwlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBSeCBOUyBSRVNFVCAoTlNWQ0k9JXUsIGNhdXNlPSVzKVxuIiwKKwkJbnN2Yy0+bnN2Y2ksIG5zdmMtPm5zZWksIGdwcnNfbnNfY2F1c2Vfc3RyKCpjYXVzZSkpOworCisJLyogTWFyayBOUy1WQyBhcyBibG9ja2VkIGFuZCBhbGl2ZSAqLworCW5zdmMtPnN0YXRlID0gTlNFX1NfQkxPQ0tFRCB8IE5TRV9TX0FMSVZFOworCisJbnN2Yy0+bnNlaSA9IG50b2hzKCpuc2VpKTsKKwluc3ZjLT5uc3ZjaSA9IG50b2hzKCpuc3ZjaSk7CisKKwkvKiBzdGFydCB0aGUgdGVzdCBwcm9jZWR1cmUgKi8KKwluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX0FMSVZFKTsKKworCS8qIGluZm9ybSBpbnRlcmVzdGVkIHBhcnRpZXMgYWJvdXQgdGhlIGZhY3QgdGhhdCB0aGlzIE5TVkMKKwkgKiBoYXMgcmVjZWl2ZWQgUkVTRVQgKi8KKwluc19kaXNwYXRjaF9zaWduYWwobnN2YywgU19OU19SRVNFVCwgKmNhdXNlKTsKKworCXJldHVybiBncHJzX25zX3R4X3Jlc2V0X2Fjayhuc3ZjKTsKK30KKworc3RhdGljIGludCBncHJzX25zX3J4X2Jsb2NrKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXVpbnQ4X3QgKmNhdXNlOworCWludCByYzsKKworCUxPR1AoRE5TLCBMT0dMX0lORk8sICJOU0VJPSV1IFJ4IE5TIEJMT0NLXG4iLCBuc3ZjLT5uc2VpKTsKKworCW5zdmMtPnN0YXRlIHw9IE5TRV9TX0JMT0NLRUQ7CisKKwlyYyA9IHRsdl9wYXJzZSgmdHAsICZuc19hdHRfdGx2ZGVmLCBuc2gtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKSwgMCwgMCk7CisKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIE5TX0lFX0NBVVNFKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgTlNfSUVfVkNJKSkgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwgIk5TIFJFU0VUIE1pc3NpbmcgbWFuZGF0b3J5IElFXG4iKTsKKwkJZ3Byc19uc190eF9zdGF0dXMobnN2YywgTlNfQ0FVU0VfTUlTU0lOR19FU1NFTlRfSUUsIDAsIG1zZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNhdXNlID0gKHVpbnQ4X3QgKikgVExWUF9WQUwoJnRwLCBOU19JRV9DQVVTRSk7CisJLy9uc3ZjaSA9ICh1aW50MTZfdCAqKSBUTFZQX1ZBTCgmdHAsIE5TX0lFX1ZDSSk7CisKKwluc19kaXNwYXRjaF9zaWduYWwobnN2YywgU19OU19CTE9DSywgKmNhdXNlKTsKKwlyYXRlX2N0cl9pbmMoJm5zdmMtPmN0cmctPmN0cltOU19DVFJfQkxPQ0tFRF0pOworCisJcmV0dXJuIGdwcnNfbnNfdHhfc2ltcGxlKG5zdmMsIE5TX1BEVVRfQkxPQ0tfQUNLKTsKK30KKworLyogbWFpbiBlbnRyeSBwb2ludCwgaGVyZSBpbmNvbWluZyBOUyBmcmFtZXMgZW50ZXIgKi8KK2ludCBncHJzX25zX3Jjdm1zZyhzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2ksIHN0cnVjdCBtc2diICptc2csCisJCSAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2FkZHIpCit7CisJc3RydWN0IGdwcnNfbnNfaGRyICpuc2ggPSAoc3RydWN0IGdwcnNfbnNfaGRyICopIG1zZy0+bDJoOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisJaW50IHJjID0gMDsKKworCS8qIGxvb2sgdXAgdGhlIE5TVkMgYmFzZWQgb24gc291cmNlIGFkZHJlc3MgKi8KKwluc3ZjID0gbnN2Y19ieV9yZW1fYWRkcihuc2ksIHNhZGRyKTsKKwlpZiAoIW5zdmMpIHsKKwkJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJCXVpbnQxNl90IG5zZWk7CisJCS8qIE9ubHkgdGhlIFJFU0VUIHByb2NlZHVyZSBjcmVhdGVzIGEgbmV3IE5TVkMgKi8KKwkJaWYgKG5zaC0+cGR1X3R5cGUgIT0gTlNfUERVVF9SRVNFVCkgeworCQkJc3RydWN0IGdwcnNfbnN2YyBmYWtlX25zdmM7CisJCQlMT0dQKEROUywgTE9HTF9JTkZPLCAiSWdub3JpbmcgTlMgUERVIHR5cGUgMHglMHggIgorCQkJCSJmcm9tICVzOiV1IGZvciBub24tZXhpc3RpbmcgTlMtVkNcbiIsCisJCQkJbnNoLT5wZHVfdHlwZSwgaW5ldF9udG9hKHNhZGRyLT5zaW5fYWRkciksCisJCQkJbnRvaHMoc2FkZHItPnNpbl9wb3J0KSk7CisJCQkvKiBTaW5jZSB3ZSBoYXZlIG5vIE5TVkMsIHdlIGhhdmUgdG8gY3JlYXRlIGEgZmFrZSAqLworCQkJZmFrZV9uc3ZjLm5zdmNpID0gZmFrZV9uc3ZjLm5zZWkgPSAwOworCQkJZmFrZV9uc3ZjLm5zaSA9IG5zaTsKKwkJCWZha2VfbnN2Yy5pcC5idHNfYWRkciA9ICpzYWRkcjsKKwkJCWZha2VfbnN2Yy5zdGF0ZSA9IE5TRV9TX0FMSVZFOworCQkJcmV0dXJuIGdwcnNfbnNfdHhfc3RhdHVzKCZmYWtlX25zdmMsCisJCQkJCQlOU19DQVVTRV9QRFVfSU5DT01QX1BTVEFURSwgMCwKKwkJCQkJCW1zZyk7CisJCX0KKwkJcmMgPSB0bHZfcGFyc2UoJnRwLCAmbnNfYXR0X3RsdmRlZiwgbnNoLT5kYXRhLAorCQkJCQkJbXNnYl9sMmxlbihtc2cpLCAwLCAwKTsKKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRwLCBOU19JRV9DQVVTRSkgfHwKKwkJICAgICFUTFZQX1BSRVNFTlQoJnRwLCBOU19JRV9WQ0kpIHx8CisJCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgTlNfSUVfTlNFSSkpIHsKKwkJCUxPR1AoRE5TLCBMT0dMX0VSUk9SLCAiTlMgUkVTRVQgTWlzc2luZyBtYW5kYXRvcnkgSUVcbiIpOworCQkJZ3Byc19uc190eF9zdGF0dXMobnN2YywgTlNfQ0FVU0VfTUlTU0lOR19FU1NFTlRfSUUsIDAsCisJCQkJCSAgbXNnKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW5zZWkgPSBudG9ocygqKHVpbnQxNl90ICopVExWUF9WQUwoJnRwLCBOU19JRV9OU0VJKSk7CisJCS8qIENoZWNrIGlmIHdlIGFscmVhZHkga25vdyB0aGlzIE5TRUksIHRoZSByZW1vdGUgZW5kIG1pZ2h0CisJCSAqIHNpbXBseSBoYXZlIGNoYW5nZWQgYWRkcmVzc2VzLCBvciBpdCBpcyBhIFNHU04gKi8KKwkJbnN2YyA9IG5zdmNfYnlfbnNlaShuc2ksIG5zZWkpOworCQlpZiAoIW5zdmMpIHsKKwkJCUxPR1AoRE5TLCBMT0dMX0lORk8sICJDcmVhdGluZyBOUy1WQyBmb3IgQlNTIGF0ICVzOiV1XG4iLAorCQkJCWluZXRfbnRvYShzYWRkci0+c2luX2FkZHIpLCBudG9ocyhzYWRkci0+c2luX3BvcnQpKTsKKwkJCW5zdmMgPSBuc3ZjX2NyZWF0ZShuc2ksIDB4ZmZmZik7CisJCX0KKwkJLyogVXBkYXRlIHRoZSByZW1vdGUgcGVlciBJUCBhZGRyZXNzL3BvcnQgKi8KKwkJbnN2Yy0+aXAuYnRzX2FkZHIgPSAqc2FkZHI7CisJfSBlbHNlCisJCW1zZ2JfbnNlaShtc2cpID0gbnN2Yy0+bnNlaTsKKworCS8qIEluY3JlbWVudCBudW1iZXIgb2YgSW5jb21pbmcgYnl0ZXMgKi8KKwlyYXRlX2N0cl9pbmMoJm5zdmMtPmN0cmctPmN0cltOU19DVFJfUEtUU19JTl0pOworCURFQlVHUChETlMsICJCWVRFU19JTiBtc2diX2wybGVuPSVkXG4iLCBtc2diX2wybGVuKG1zZykpOworCXJhdGVfY3RyX2FkZCgmbnN2Yy0+Y3RyZy0+Y3RyW05TX0NUUl9CWVRFU19JTl0sIG1zZ2JfbDJsZW4obXNnKSk7CisKKwlzd2l0Y2ggKG5zaC0+cGR1X3R5cGUpIHsKKwljYXNlIE5TX1BEVVRfQUxJVkU6CisJCS8qIElmIHdlJ3JlIGRlYWQgYW5kIGJsb2NrZWQgYW5kIHN1ZGRlbmx5IHJlY2VpdmUgYQorCQkgKiBOUy1BTElWRSBvdXQgb2YgdGhlIGJsdWUsIHdlIG1pZ2h0IGhhdmUgYmVlbiByZS1zdGFydGVkCisJCSAqIGFuZCBzaG91bGQgc2VuZCBhIE5TLVJFU0VUIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIHJlY292ZXJzCisJCSAqIGZpbmUuICovCisJCWlmIChuc3ZjLT5zdGF0ZSA9PSBOU0VfU19CTE9DS0VEKQorCQkJcmMgPSBncHJzX25zX3R4X3Jlc2V0KG5zdmMsIE5TX0NBVVNFX1BEVV9JTkNPTVBfUFNUQVRFKTsKKwkJZWxzZQorCQkJcmMgPSBncHJzX25zX3R4X2FsaXZlX2Fjayhuc3ZjKTsKKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX0FMSVZFX0FDSzoKKwkJLyogc3RvcCBUbnMtYWxpdmUgKi8KKwkJYnNjX2RlbF90aW1lcigmbnN2Yy0+dGltZXIpOworCQkvKiBzdGFydCBUbnMtdGVzdCAqLworCQluc3ZjX3N0YXJ0X3RpbWVyKG5zdmMsIE5TVkNfVElNRVJfVE5TX1RFU1QpOworCQlpZiAobnN2Yy0+cmVtb3RlX2VuZF9pc19zZ3NuKSB7CisJCQkvKiBGSVhNRTogdGhpcyBzaG91bGQgYmUgb25lIGxldmVsIGhpZ2hlciAqLworCQkJaWYgKG5zdmMtPnN0YXRlICYgTlNFX1NfQkxPQ0tFRCkKKwkJCQlyYyA9IGdwcnNfbnNfdHhfdW5ibG9jayhuc3ZjKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5TX1BEVVRfVU5JVERBVEE6CisJCS8qIGFjdHVhbCB1c2VyIGRhdGEgKi8KKwkJcmMgPSBncHJzX25zX3J4X3VuaXRkYXRhKG5zdmMsIG1zZyk7CisJCWJyZWFrOworCWNhc2UgTlNfUERVVF9TVEFUVVM6CisJCXJjID0gZ3Byc19uc19yeF9zdGF0dXMobnN2YywgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX1JFU0VUOgorCQlyYyA9IGdwcnNfbnNfcnhfcmVzZXQobnN2YywgbXNnKTsKKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX1JFU0VUX0FDSzoKKwkJTE9HUChETlMsIExPR0xfSU5GTywgIk5TRUk9JXUgUnggTlMgUkVTRVQgQUNLXG4iLCBuc3ZjLT5uc2VpKTsKKwkJLyogbWFyayBOUy1WQyBhcyBibG9ja2VkICsgYWN0aXZlICovCisJCW5zdmMtPnN0YXRlID0gTlNFX1NfQkxPQ0tFRCB8IE5TRV9TX0FMSVZFOworCQluc3ZjLT5yZW1vdGVfc3RhdGUgPSBOU0VfU19CTE9DS0VEIHwgTlNFX1NfQUxJVkU7CisJCXJhdGVfY3RyX2luYygmbnN2Yy0+Y3RyZy0+Y3RyW05TX0NUUl9CTE9DS0VEXSk7CisJCWlmIChuc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24pIHsKKwkJCS8qIHN0b3AgUkVTRVQgdGltZXIgKi8KKwkJCWJzY19kZWxfdGltZXIoJm5zdmMtPnRpbWVyKTsKKwkJCS8qIEluaXRpYXRlIFRFU1QgcHJvYy46IFNlbmQgQUxJVkUgYW5kIHN0YXJ0IHRpbWVyICovCisJCQlyYyA9IGdwcnNfbnNfdHhfc2ltcGxlKG5zdmMsIE5TX1BEVVRfQUxJVkUpOworCQkJbnN2Y19zdGFydF90aW1lcihuc3ZjLCBOU1ZDX1RJTUVSX1ROU19BTElWRSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOU19QRFVUX1VOQkxPQ0s6CisJCS8qIFNlY3Rpb24gNy4yOiB1bmJsb2NraW5nIHByb2NlZHVyZSAqLworCQlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBSeCBOUyBVTkJMT0NLXG4iLCBuc3ZjLT5uc2VpKTsKKwkJbnN2Yy0+c3RhdGUgJj0gfk5TRV9TX0JMT0NLRUQ7CisJCW5zX2Rpc3BhdGNoX3NpZ25hbChuc3ZjLCBTX05TX1VOQkxPQ0ssIDApOworCQlyYyA9IGdwcnNfbnNfdHhfc2ltcGxlKG5zdmMsIE5TX1BEVVRfVU5CTE9DS19BQ0spOworCQlicmVhazsKKwljYXNlIE5TX1BEVVRfVU5CTE9DS19BQ0s6CisJCUxPR1AoRE5TLCBMT0dMX0lORk8sICJOU0VJPSV1IFJ4IE5TIFVOQkxPQ0sgQUNLXG4iLCBuc3ZjLT5uc2VpKTsKKwkJLyogbWFyayBOUy1WQyBhcyB1bmJsb2NrZWQgKyBhY3RpdmUgKi8KKwkJbnN2Yy0+c3RhdGUgPSBOU0VfU19BTElWRTsKKwkJbnN2Yy0+cmVtb3RlX3N0YXRlID0gTlNFX1NfQUxJVkU7CisJCW5zX2Rpc3BhdGNoX3NpZ25hbChuc3ZjLCBTX05TX1VOQkxPQ0ssIDApOworCQlicmVhazsKKwljYXNlIE5TX1BEVVRfQkxPQ0s6CisJCXJjID0gZ3Byc19uc19yeF9ibG9jayhuc3ZjLCBtc2cpOworCQlicmVhazsKKwljYXNlIE5TX1BEVVRfQkxPQ0tfQUNLOgorCQlMT0dQKEROUywgTE9HTF9JTkZPLCAiTlNFST0ldSBSeCBOUyBCTE9DSyBBQ0tcbiIsIG5zdmMtPm5zZWkpOworCQkvKiBtYXJrIHJlbW90ZSBOUy1WQyBhcyBibG9ja2VkICsgYWN0aXZlICovCisJCW5zdmMtPnJlbW90ZV9zdGF0ZSA9IE5TRV9TX0JMT0NLRUQgfCBOU0VfU19BTElWRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETlMsIExPR0xfTk9USUNFLCAiTlNFST0ldSBSeCBVbmtub3duIE5TIFBEVSB0eXBlIDB4JTAyeFxuIiwKKwkJCW5zdmMtPm5zZWksIG5zaC0+cGR1X3R5cGUpOworCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0cnVjdCBncHJzX25zX2luc3QgKmdwcnNfbnNfaW5zdGFudGlhdGUoZ3Byc19uc19jYl90ICpjYikKK3sKKwlzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBncHJzX25zX2luc3QpOworCisJbnNpLT5jYiA9IGNiOworCUlOSVRfTExJU1RfSEVBRCgmbnNpLT5ncHJzX25zdmNzKTsKKwluc2ktPnRpbWVvdXRbTlNfVE9VVF9UTlNfQkxPQ0tdID0gMzsKKwluc2ktPnRpbWVvdXRbTlNfVE9VVF9UTlNfQkxPQ0tfUkVUUklFU10gPSAzOworCW5zaS0+dGltZW91dFtOU19UT1VUX1ROU19SRVNFVF0gPSAzOworCW5zaS0+dGltZW91dFtOU19UT1VUX1ROU19SRVNFVF9SRVRSSUVTXSA9IDM7CisJbnNpLT50aW1lb3V0W05TX1RPVVRfVE5TX1RFU1RdID0gMzA7CisJbnNpLT50aW1lb3V0W05TX1RPVVRfVE5TX0FMSVZFXSA9IDM7CisJbnNpLT50aW1lb3V0W05TX1RPVVRfVE5TX0FMSVZFX1JFVFJJRVNdID0gMTA7CisKKwlyZXR1cm4gbnNpOworfQorCit2b2lkIGdwcnNfbnNfZGVzdHJveShzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kpCit7CisJLyogRklYTUU6IGNsZWFyIGFsbCB0aW1lcnMgKi8KKworCS8qIHJlY3Vyc2l2ZWx5IGZyZWUgdGhlIE5TSSBhbmQgYWxsIGl0cyBOU1ZDcyAqLworCXRhbGxvY19mcmVlKG5zaSk7Cit9CisKKworLyogTlMtb3Zlci1JUCBjb2RlLCBhY2NvcmRpbmcgdG8gM0dQUCBUUyA0OC4wMTYgQ2hhcHRlciA2LjIKKyAqIFdlIGRvbid0IHN1cHBvcnQgU2l6ZSBQcm9jZWR1cmUsIENvbmZpZ3VyYXRpb24gUHJvY2VkdXJlLCBDaGFuZ2VXZWlnaHQgUHJvY2VkdXJlICovCisKKy8qIFJlYWQgYSBzaW5nbGUgTlMtb3Zlci1JUCBtZXNzYWdlICovCitzdGF0aWMgc3RydWN0IG1zZ2IgKnJlYWRfbnNpcF9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yLAorCQkJCSAgc3RydWN0IHNvY2thZGRyX2luICpzYWRkcikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhOU19BTExPQ19TSVpFLCAiQWJpcy9JUC9HUFJTLU5TIik7CisJaW50IHJldCA9IDA7CisJc29ja2xlbl90IHNhZGRyX2xlbiA9IHNpemVvZigqc2FkZHIpOworCisJaWYgKCFtc2cpIHsKKwkJKmVycm9yID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0ID0gcmVjdmZyb20oYmZkLT5mZCwgbXNnLT5kYXRhLCBOU19BTExPQ19TSVpFLCAwLAorCQkJKHN0cnVjdCBzb2NrYWRkciAqKXNhZGRyLCAmc2FkZHJfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKEROUywgTE9HTF9FUlJPUiwgInJlY3YgZXJyb3IgJXMgZHVyaW5nIE5TSVAgcmVjdlxuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IHJldDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisJbXNnYl9wdXQobXNnLCByZXQpOworCisJcmV0dXJuIG1zZzsKK30KKworc3RhdGljIGludCBoYW5kbGVfbnNpcF9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOworCXN0cnVjdCBncHJzX25zX2luc3QgKm5zaSA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcmVhZF9uc2lwX21zZyhiZmQsICZlcnJvciwgJnNhZGRyKTsKKworCWlmICghbXNnKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGdwcnNfbnNfcmN2bXNnKG5zaSwgbXNnLCAmc2FkZHIpOworCisJbXNnYl9mcmVlKG1zZyk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX25zaXBfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCS8qIEZJWE1FOiBhY3R1YWxseSBzZW5kIHRoZSBkYXRhIGhlcmUgaW5zdGVhZCBvZiBuc2lwX3NlbmRtc2coKSAqLworCXJldHVybiAtRUlPOworfQorCitpbnQgbnNpcF9zZW5kbXNnKHN0cnVjdCBncHJzX25zdmMgKm5zdmMsIHN0cnVjdCBtc2diICptc2cpCit7CisJaW50IHJjOworCXN0cnVjdCBncHJzX25zX2luc3QgKm5zaSA9IG5zdmMtPm5zaTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRhZGRyID0gJm5zdmMtPmlwLmJ0c19hZGRyOworCisJcmMgPSBzZW5kdG8obnNpLT5uc2lwLmZkLmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuLCAwLAorCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKilkYWRkciwgc2l6ZW9mKCpkYWRkcikpOworCisJdGFsbG9jX2ZyZWUobXNnKTsKKworCXJldHVybiByYzsKK30KKworLyogVURQIFBvcnQgMjMwMDAgY2FycmllcyB0aGUgTExDLWluLUJTU0dQLWluLU5TIHByb3RvY29sIHN0YWNrICovCitzdGF0aWMgaW50IG5zaXBfZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJcmMgPSBoYW5kbGVfbnNpcF9yZWFkKGJmZCk7CisJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCXJjID0gaGFuZGxlX25zaXBfd3JpdGUoYmZkKTsKKworCXJldHVybiByYzsKK30KKworZXh0ZXJuIGludCBtYWtlX3NvY2soc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgcHJvdG8sIHVpbnQxNl90IHBvcnQsCisJCSAgICAgaW50ICgqY2IpKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkpOworCisvKiBMaXN0ZW4gZm9yIGluY29taW5nIEdQUlMgcGFja2V0cyAqLworaW50IG5zaXBfbGlzdGVuKHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgdWludDE2X3QgdWRwX3BvcnQpCit7CisJaW50IHJldDsKKworCXJldCA9IG1ha2Vfc29jaygmbnNpLT5uc2lwLmZkLCBJUFBST1RPX1VEUCwgdWRwX3BvcnQsIG5zaXBfZmRfY2IpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbnNpLT5sbCA9IEdQUlNfTlNfTExfVURQOworCW5zaS0+bnNpcC5mZC5kYXRhID0gbnNpOworCisJcmV0dXJuIHJldDsKK30KKworLyogRXN0YWJsaXNoIGEgY29ubmVjdGlvbiAoZnJvbSB0aGUgQlNTKSB0byB0aGUgU0dTTiAqLworc3RydWN0IGdwcnNfbnN2YyAqbnNpcF9jb25uZWN0KHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwKKwkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRlc3QsIHVpbnQxNl90IG5zZWksCisJCQkJdWludDE2X3QgbnN2Y2kpCit7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCW5zdmMgPSBuc3ZjX2J5X3JlbV9hZGRyKG5zaSwgZGVzdCk7CisJaWYgKCFuc3ZjKQorCQluc3ZjID0gbnN2Y19jcmVhdGUobnNpLCBuc3ZjaSk7CisJbnN2Yy0+aXAuYnRzX2FkZHIgPSAqZGVzdDsKKwluc3ZjLT5uc2VpID0gbnNlaTsKKwluc3ZjLT5uc3ZjaSA9IG5zdmNpOworCW5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbiA9IDE7CisKKwkvKiBJbml0aWF0ZSBhIFJFU0VUIHByb2NlZHVyZSAqLworCS8qIE1hcmsgTlMtVkMgbG9jYWxseSBhcyBibG9ja2VkIGFuZCBkZWFkICovCisJbnN2Yy0+c3RhdGUgPSBOU0VfU19CTE9DS0VEOworCS8qIFNlbmQgTlMtUkVTRVQgUERVICovCisJaWYgKGdwcnNfbnNfdHhfcmVzZXQobnN2YywgTlNfQ0FVU0VfT01fSU5URVJWRU5USU9OKSA8IDApIHsKKwkJTE9HUChETlMsIExPR0xfRVJST1IsICJOU0VJPSV1LCBlcnJvciByZXNldHRpbmcgTlMtVkNcbiIsCisJCQluc2VpKTsKKwl9CisJLyogU3RhcnQgVG5zLXJlc2V0ICovCisJbnN2Y19zdGFydF90aW1lcihuc3ZjLCBOU1ZDX1RJTUVSX1ROU19SRVNFVCk7CisKKwlyZXR1cm4gbnN2YzsKK30KKworCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbnNfdnR5LmMgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfbnNfdnR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiMDA3NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19uc192dHkuYwpAQCAtMCwwICsxLDI5MCBAQAorLyogVlRZIGludGVyZmFjZSBmb3Igb3VyIEdQUlMgTmV0d29ya3MgU2VydmljZSAoTlMpIGltcGxlbWVudGF0aW9uICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcmF0ZV9jdHIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKworI2luY2x1ZGUgPHZ0eS92dHkuaD4KKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorCitzdGF0aWMgc3RydWN0IGdwcnNfbnNfaW5zdCAqdnR5X25zaSA9IE5VTEw7CisKKy8qIEZJWE1FOiB0aGlzIHNob3VsZCBnbyB0byBzb21lIGNvbW1vbiBmaWxlIGFzIGl0IGlzIGNvcGllZAorICogaW4gdnR5X2ludGVyZmFjZS5jIG9mIHRoZSBCU0MgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGdwcnNfbnNfdGltZXJfc3Ryc1tdID0geworCXsgMCwgInRucy1ibG9jayIgfSwKKwl7IDEsICJ0bnMtYmxvY2stcmV0cmllcyIgfSwKKwl7IDIsICJ0bnMtcmVzZXQiIH0sCisJeyAzLCAidG5zLXJlc2V0LXJldHJpZXMiIH0sCisJeyA0LCAidG5zLXRlc3QiIH0sCisJeyA1LCAidG5zLWFsaXZlIiB9LAorCXsgNiwgInRucy1hbGl2ZS1yZXRyaWVzIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IGNtZF9ub2RlIG5zX25vZGUgPSB7CisJTlNfTk9ERSwKKwkiJXMobnMpIyIsCisJMSwKK307CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX25zKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCXVuc2lnbmVkIGludCBpOworCisJdnR5X291dCh2dHksICJucyVzIiwgVlRZX05FV0xJTkUpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobnN2YywgJnZ0eV9uc2ktPmdwcnNfbnN2Y3MsIGxpc3QpIHsKKwkJaWYgKCFuc3ZjLT5wZXJzaXN0ZW50KQorCQkJY29udGludWU7CisJCXZ0eV9vdXQodnR5LCAiIG5zZSAldSBuc3ZjaSAldSVzIiwKKwkJCW5zdmMtPm5zZWksIG5zdmMtPm5zdmNpLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiIG5zZSAldSByZW1vdGUtcm9sZSAlcyVzIiwKKwkJCW5zdmMtPm5zZWksIG5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbiA/ICJzZ3NuIiA6ICJic3MiLAorCQkJVlRZX05FV0xJTkUpOworCQlpZiAobnN2Yy0+bnNpLT5sbCA9PSBHUFJTX05TX0xMX1VEUCkgeworCQkJdnR5X291dCh2dHksICIgbnNlICV1IHJlbW90ZS1pcCAlcyVzIiwKKwkJCQluc3ZjLT5uc2VpLAorCQkJCWluZXRfbnRvYShuc3ZjLT5pcC5idHNfYWRkci5zaW5fYWRkciksCisJCQkJVlRZX05FV0xJTkUpOworCQkJdnR5X291dCh2dHksICIgbnNlICV1IHJlbW90ZS1wb3J0ICV1JXMiLAorCQkJCW5zdmMtPm5zZWksIG50b2hzKG5zdmMtPmlwLmJ0c19hZGRyLnNpbl9wb3J0KSwKKwkJCQlWVFlfTkVXTElORSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2dHlfbnNpLT50aW1lb3V0KTsgaSsrKQorCQl2dHlfb3V0KHZ0eSwgIiB0aW1lciAlcyAldSVzIiwKKwkJCWdldF92YWx1ZV9zdHJpbmcoZ3Byc19uc190aW1lcl9zdHJzLCBpKSwKKwkJCXZ0eV9uc2ktPnRpbWVvdXRbaV0sIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25zLCBjZmdfbnNfY21kLAorICAgICAgIm5zIiwKKyAgICAgICJDb25maWd1cmUgdGhlIEdQUlMgTmV0d29yayBTZXJ2aWNlIikKK3sKKwl2dHktPm5vZGUgPSBOU19OT0RFOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgZHVtcF9ucyhzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBncHJzX25zX2luc3QgKm5zaSwgaW50IHN0YXRzKQoreworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShuc3ZjLCAmbnNpLT5ncHJzX25zdmNzLCBsaXN0KSB7CisJCXZ0eV9vdXQodnR5LCAiTlNFSSAlNXUsIE5TLVZDICU1dSwgUmVtb3RlOiAlLTRzLCAlNXMgJTlzIiwKKwkJCW5zdmMtPm5zZWksIG5zdmMtPm5zdmNpLAorCQkJbnN2Yy0+cmVtb3RlX2VuZF9pc19zZ3NuID8gIlNHU04iIDogIkJTUyIsCisJCQluc3ZjLT5zdGF0ZSAmIE5TRV9TX0FMSVZFID8gIkFMSVZFIiA6ICJERUFEIiwKKwkJCW5zdmMtPnN0YXRlICYgTlNFX1NfQkxPQ0tFRCA/ICJCTE9DS0VEIiA6ICJVTkJMT0NLRUQiKTsKKwkJaWYgKG5zdmMtPm5zaS0+bGwgPT0gR1BSU19OU19MTF9VRFApCisJCQl2dHlfb3V0KHZ0eSwgIiwgJTE1czoldSIsCisJCQkJaW5ldF9udG9hKG5zdmMtPmlwLmJ0c19hZGRyLnNpbl9hZGRyKSwKKwkJCQludG9ocyhuc3ZjLT5pcC5idHNfYWRkci5zaW5fcG9ydCkpOworCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCQlpZiAoc3RhdHMpCisJCQl2dHlfb3V0X3JhdGVfY3RyX2dyb3VwKHZ0eSwgIiAiLCBuc3ZjLT5jdHJnKTsKKwl9Cit9CisKK0RFRlVOKHNob3dfbnMsIHNob3dfbnNfY21kLCAic2hvdyBucyIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE5TIHByb3RvY29sIikKK3sKKwlzdHJ1Y3QgZ3Byc19uc19pbnN0ICpuc2kgPSB2dHlfbnNpOworCWR1bXBfbnModnR5LCBuc2ksIDApOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19uc19zdGF0cywgc2hvd19uc19zdGF0c19jbWQsICJzaG93IG5zIHN0YXRzIiwKKwlTSE9XX1NUUgorCSJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBOUyBwcm90b2NvbFxuIgorCSJJbmNsdWRlIHN0YXRpc3RpY3NcbiIpCit7CisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpID0gdnR5X25zaTsKKwlkdW1wX25zKHZ0eSwgbnNpLCAxKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgTlNFX0NNRF9TVFIgIk5TIEVudGl0eVxuIiAiTlMgRW50aXR5IElEIChOU0VJKVxuIgorCitERUZVTihjZmdfbnNlX25zdmMsIGNmZ19uc2VfbnN2Y2lfY21kLAorCSJuc2UgPDAtNjU1MzU+IG5zdmNpIDwwLTY1NTM0PiIsCisJTlNFX0NNRF9TVFIKKwkiTlMgVmlydHVhbCBDb25uZWN0aW9uXG4iCisJIk5TIFZpcnR1YWwgQ29ubmVjdGlvbiBJRCAoTlNWQ0kpXG4iCisJKQoreworCXVpbnQxNl90IG5zZWkgPSBhdG9pKGFyZ3ZbMF0pOworCXVpbnQxNl90IG5zdmNpID0gYXRvaShhcmd2WzFdKTsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCisJbnN2YyA9IG5zdmNfYnlfbnNlaSh2dHlfbnNpLCBuc2VpKTsKKwlpZiAoIW5zdmMpIHsKKwkJbnN2YyA9IG5zdmNfY3JlYXRlKHZ0eV9uc2ksIG5zdmNpKTsKKwkJbnN2Yy0+bnNlaSA9IG5zZWk7CisJfQorCW5zdmMtPm5zdmNpID0gbnN2Y2k7CisJLyogQWxsIE5TVkNzIHRoYXQgYXJlIGV4cGxpY2l0bHkgY29uZmlndXJlZCBieSBWVFkgYXJlCisJICogbWFya2VkIGFzIHBlcnNpc3RlbnQgc28gd2UgY2FuIHdyaXRlIHRoZW0gdG8gdGhlIGNvbmZpZworCSAqIGZpbGUgYXQgc29tZSBsYXRlciBwb2ludCAqLworCW5zdmMtPnBlcnNpc3RlbnQgPSAxOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbnNlX3JlbW90ZWlwLCBjZmdfbnNlX3JlbW90ZWlwX2NtZCwKKwkibnNlIDwwLTY1NTM1PiByZW1vdGUtaXAgQS5CLkMuRCIsCisJTlNFX0NNRF9TVFIKKwkiUmVtb3RlIElQIEFkZHJlc3NcbiIKKwkiUmVtb3RlIElQIEFkZHJlc3NcbiIpCit7CisJdWludDE2X3QgbnNlaSA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCW5zdmMgPSBuc3ZjX2J5X25zZWkodnR5X25zaSwgbnNlaSk7CisJaWYgKCFuc3ZjKSB7CisJCXZ0eV9vdXQodnR5LCAiTm8gc3VjaCBOU0UgKCV1KSVzIiwgbnNlaSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWluZXRfYXRvbihhcmd2WzFdLCAmbnN2Yy0+aXAuYnRzX2FkZHIuc2luX2FkZHIpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworCit9CisKK0RFRlVOKGNmZ19uc2VfcmVtb3RlcG9ydCwgY2ZnX25zZV9yZW1vdGVwb3J0X2NtZCwKKwkibnNlIDwwLTY1NTM1PiByZW1vdGUtcG9ydCA8MC02NTUzNT4iLAorCU5TRV9DTURfU1RSCisJIlJlbW90ZSBVRFAgUG9ydFxuIgorCSJSZW1vdGUgVURQIFBvcnQgTnVtYmVyXG4iKQoreworCXVpbnQxNl90IG5zZWkgPSBhdG9pKGFyZ3ZbMF0pOworCXVpbnQxNl90IHBvcnQgPSBhdG9pKGFyZ3ZbMV0pOworCXN0cnVjdCBncHJzX25zdmMgKm5zdmM7CisKKwluc3ZjID0gbnN2Y19ieV9uc2VpKHZ0eV9uc2ksIG5zZWkpOworCWlmICghbnN2YykgeworCQl2dHlfb3V0KHZ0eSwgIk5vIHN1Y2ggTlNFICgldSklcyIsIG5zZWksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCW5zdmMtPmlwLmJ0c19hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uc2VfcmVtb3Rlcm9sZSwgY2ZnX25zZV9yZW1vdGVyb2xlX2NtZCwKKwkibnNlIDwwLTY1NTM1PiByZW1vdGUtcm9sZSAoc2dzbnxic3MpIiwKKwlOU0VfQ01EX1NUUgorCSJSZW1vdGUgTlNFIFJvbGVcbiIKKwkiUmVtb3RlIFBlZXIgaXMgU0dTTlxuIgorCSJSZW1vdGUgUGVlciBpcyBCU1NcbiIpCit7CisJdWludDE2X3QgbnNlaSA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdwcnNfbnN2YyAqbnN2YzsKKworCW5zdmMgPSBuc3ZjX2J5X25zZWkodnR5X25zaSwgbnNlaSk7CisJaWYgKCFuc3ZjKSB7CisJCXZ0eV9vdXQodnR5LCAiTm8gc3VjaCBOU0UgKCV1KSVzIiwgbnNlaSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKCFzdHJjbXAoYXJndlsxXSwgInNnc24iKSkKKwkJbnN2Yy0+cmVtb3RlX2VuZF9pc19zZ3NuID0gMTsKKwllbHNlCisJCW5zdmMtPnJlbW90ZV9lbmRfaXNfc2dzbiA9IDA7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19ub19uc2UsIGNmZ19ub19uc2VfY21kLAorCSJubyBuc2UgPDAtNjU1MzU+IiwKKwkiRGVsZXRlIE5TIEVudGl0eVxuIgorCSJEZWxldGUgIiBOU0VfQ01EX1NUUikKK3sKKwl1aW50MTZfdCBuc2VpID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCisJbnN2YyA9IG5zdmNfYnlfbnNlaSh2dHlfbnNpLCBuc2VpKTsKKwlpZiAoIW5zdmMpIHsKKwkJdnR5X291dCh2dHksICJObyBzdWNoIE5TRSAoJXUpJXMiLCBuc2VpLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwluc3ZjX2RlbGV0ZShuc3ZjKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25zX3RpbWVyLCBjZmdfbnNfdGltZXJfY21kLAorCSJ0aW1lciAiIE5TX1RJTUVSUyAiIDwwLTY1NTM1PiIsCisJIk5ldHdvcmsgU2VydmljZSBUaW1lclxuIgorCU5TX1RJTUVSU19IRUxQICJUaW1lciBWYWx1ZVxuIikKK3sKKwlpbnQgaWR4ID0gZ2V0X3N0cmluZ192YWx1ZShncHJzX25zX3RpbWVyX3N0cnMsIGFyZ3ZbMF0pOworCWludCB2YWwgPSBhdG9pKGFyZ3ZbMV0pOworCisJaWYgKGlkeCA8IDAgfHwgaWR4ID49IEFSUkFZX1NJWkUodnR5X25zaS0+dGltZW91dCkpCisJCXJldHVybiBDTURfV0FSTklORzsKKworCXZ0eV9uc2ktPnRpbWVvdXRbaWR4XSA9IHZhbDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworaW50IGdwcnNfbnNfdnR5X2luaXQoc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpKQoreworCXZ0eV9uc2kgPSBuc2k7CisKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfbnNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfbnNfc3RhdHNfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmNmZ19uc19jbWQpOworCWluc3RhbGxfbm9kZSgmbnNfbm9kZSwgY29uZmlnX3dyaXRlX25zKTsKKwlpbnN0YWxsX2RlZmF1bHQoTlNfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KE5TX05PREUsICZjZmdfbnNlX25zdmNpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE5TX05PREUsICZjZmdfbnNlX3JlbW90ZWlwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE5TX05PREUsICZjZmdfbnNlX3JlbW90ZXBvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTlNfTk9ERSwgJmNmZ19uc2VfcmVtb3Rlcm9sZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChOU19OT0RFLCAmY2ZnX25vX25zZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChOU19OT0RFLCAmY2ZnX25zX3RpbWVyX2NtZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19zZ3NuLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfc2dzbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNDY3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL2dwcnNfc2dzbi5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIEdQUlMgU0dTTiBmdW5jdGlvbmFsaXR5ICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfc2dzbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ucy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3Byc19ic3NncC5oPgorCitzdGF0aWMgTExJU1RfSEVBRChzZ3NuX21tX2N0eHRzKTsKKworc3RhdGljIGludCByYV9pZF9lcXVhbHMoY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKmlkMSwKKwkJCWNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICppZDIpCit7CisJcmV0dXJuIChpZDEtPm1jYyA9PSBpZDItPm1jYyAmJiBpZDEtPm1uYyA9PSBpZDItPm1uYyAmJgorCQlpZDEtPmxhYyA9PSBpZDItPmxhYyAmJiBpZDEtPnJhYyA9PSBpZDItPnJhYyk7Cit9CisKKy8qIGxvb2stdXAgYSBTR1NOIE1NIGNvbnRleHQgYmFzZWQgb24gVExMSSArIFJBSSAqLworc3RydWN0IHNnc25fbW1fY3R4ICpzZ3NuX21tX2N0eF9ieV90bGxpKHVpbnQzMl90IHRsbGksCisJCQkJCWNvbnN0IHN0cnVjdCBncHJzX3JhX2lkICpyYWlkKQoreworCXN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCAmc2dzbl9tbV9jdHh0cywgbGlzdCkgeworCQlpZiAodGxsaSA9PSBjdHgtPnRsbGkgJiYKKwkJICAgIHJhX2lkX2VxdWFscyhyYWlkLCAmY3R4LT5yYSkpCisJCQlyZXR1cm4gY3R4OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHNnc25fbW1fY3R4ICpzZ3NuX21tX2N0eF9ieV9wdG1zaSh1aW50MzJfdCBwX3Rtc2kpCit7CisJc3RydWN0IHNnc25fbW1fY3R4ICpjdHg7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjdHgsICZzZ3NuX21tX2N0eHRzLCBsaXN0KSB7CisJCWlmIChwX3Rtc2kgPT0gY3R4LT5wX3Rtc2kpCisJCQlyZXR1cm4gY3R4OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHNnc25fbW1fY3R4ICpzZ3NuX21tX2N0eF9ieV9pbXNpKGNvbnN0IGNoYXIgKmltc2kpCit7CisJc3RydWN0IHNnc25fbW1fY3R4ICpjdHg7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjdHgsICZzZ3NuX21tX2N0eHRzLCBsaXN0KSB7CisJCWlmICghc3RyY21wKGltc2ksIGN0eC0+aW1zaSkpCisJCQlyZXR1cm4gY3R4OworCX0KKwlyZXR1cm4gTlVMTDsKKworfQorCisvKiBBbGxvY2F0ZSBhIG5ldyBTR1NOIE1NIGNvbnRleHQgKi8KK3N0cnVjdCBzZ3NuX21tX2N0eCAqc2dzbl9tbV9jdHhfYWxsb2ModWludDMyX3QgdGxsaSwKKwkJCQkJY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQpCit7CisJc3RydWN0IHNnc25fbW1fY3R4ICpjdHggPSB0YWxsb2NfemVybyhOVUxMLCBzdHJ1Y3Qgc2dzbl9tbV9jdHgpOworCisJaWYgKCFjdHgpCisJCXJldHVybiBOVUxMOworCisJbWVtY3B5KCZjdHgtPnJhLCByYWlkLCBzaXplb2YoY3R4LT5yYSkpOworCWN0eC0+dGxsaSA9IHRsbGk7CisJY3R4LT5tbV9zdGF0ZSA9IEdNTV9ERVJFR0lTVEVSRUQ7CisKKwlsbGlzdF9hZGQoJmN0eC0+bGlzdCwgJnNnc25fbW1fY3R4dHMpOworCisJcmV0dXJuIGN0eDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19zbmRjcC5jIGIvb3BlbmJzYy9zcmMvZ3Bycy9ncHJzX3NuZGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxYTM5MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3Byc19zbmRjcC5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qIEdQUlMgU05EQ1AgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gYXMgcGVyIDNHUFAgVFMgMDQuNjUgKi8KKworLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2Jzc2dwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX2xsYy5oPgorCisvKiBDaGFwdGVyIDcuMjogU04tUERVIEZvcm1hdHMgKi8KK3N0cnVjdCBzbmRjcF9jb21tb25faGRyIHsKKwkvKiBvY3RldCAxICovCisJdWludDhfdCBuc2FwaTo0OworCXVpbnQ4X3QgbW9yZToxOworCXVpbnQ4X3QgdHlwZToxOworCXVpbnQ4X3QgZmlyc3Q6MTsKKwl1aW50OF90IHNwYXJlOjE7CisJLyogb2N0ZXQgMiAqLworCXVpbnQ4X3QgcGNvbXA7CisJdWludDhfdCBkY29tcDsKK307CisKK3N0cnVjdCBzbmRjcF91ZGF0YV9oZHIgeworCS8qIG9jdGV0IDMgKi8KKwl1aW50OF90IG5wZHVfaGlnaDo0OworCXVpbnQ4X3Qgc2VnX25yOjQ7CisJLyogb2N0ZXQgNCAqLworCXVpbnQ4X3QgbnBkdV9sb3c7Cit9OworCisvKiBFbnRyeSBwb2ludCBmb3IgdGhlIExMLVVOSVREQVRBLmluZGljYXRpb24gKi8KK2ludCBzbmRjcF91bml0ZGF0YV9pbmQoc3RydWN0IG1zZ2IgKm1zZywgdWludDhfdCBzYXBpLCB1aW50OF90ICpoZHIsIHVpbnQ4X3QgbGVuKQoreworCXN0cnVjdCBzbmRjcF91ZGF0YV9oZHIgKnN1aDsKKwl1aW50MTZfdCBucGR1OworCisJaWYgKHN1aC0+dHlwZSA9PSAwKSB7CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJTTi1EQVRBIFBEVSBhdCB1bml0ZGF0YV9pbmQoKSBmdW5jdGlvblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW5wZHUgPSAoc3VoLT5ucGR1X2hpZ2ggPDwgOCkgfCBzdWgtPm5wZHVfbG93OworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL2dzbV8wNF8wOF9ncHJzLmMgYi9vcGVuYnNjL3NyYy9ncHJzL2dzbV8wNF8wOF9ncHJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE0MjExMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvZ3NtXzA0XzA4X2dwcnMuYwpAQCAtMCwwICsxLDc2MiBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wICovCisKKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4X2dwcnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbGxjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX3Nnc24uaD4KKworLyogMTAuNS41LjE0IEdQUlMgTU0gQ2F1c2UgLyBUYWJsZSAxMC41LjE0NyAqLworc3RydWN0IHZhbHVlX3N0cmluZyBnbW1fY2F1c2VfbmFtZXNbXSA9IHsKKwkvKiBGSVhNRSAqLworCXsgR01NX0NBVVNFX1NFTV9JTkNPUlJfTVNHLCAiU2VtYW50aWNhbGx5IGluY29ycmVjdCBtZXNzYWdlIiB9LAorCXsgR01NX0NBVVNFX0lOVl9NQU5EX0lORk8sICJJbnZhbGlkIG1hbmRhdG9yeSBpbmZvcm1hdGlvbiIgfSwKKwl7IEdNTV9DQVVTRV9NU0dUX05PVEVYSVNUX05PVElNUEwsCisJCQkiTWVzc2FnZSB0eXBlIG5vbi1leGlzdGFudCBvciBub3QgaW1wbGVtZW50ZWQiIH0sCisJeyBHTU1fQ0FVU0VfTVNHVF9JTkNPTVBfUF9TVEFURSwKKwkJCSJNZXNzYWdlIHR5cGUgbm90IGNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IEdNTV9DQVVTRV9JRV9OT1RFWElTVF9OT1RJTVBMLAorCQkJIkluZm9ybWF0aW9uIGVsZW1lbnQgbm9uLWV4aXN0ZW50IG9yIG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IEdNTV9DQVVTRV9DT05EX0lFX0VSUiwgIkNvbmRpdGlvbmFsIElFIGVycm9yIiB9LAorCXsgR01NX0NBVVNFX01TR19JTkNPTVBfUF9TVEFURSwKKwkJCQkiTWVzc2FnZSBub3QgY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlICIgfSwKKwl7IEdNTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDLCAiUHJvdG9jb2wgZXJyb3IsIHVuc3BlY2lmaWVkIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCisvKiAxMC41LjYuNiBTTSBDYXVzZSAvIFRhYmxlIDEwLjUuMTU3ICovCitzdHJ1Y3QgdmFsdWVfc3RyaW5nIGdzbV9jYXVzZV9uYW1lc1tdID0geworCXsgR1NNX0NBVVNFX0lOU1VGRl9SU1JDLCAiSW5zdWZmaWNpZW50IHJlc291cmNlcyIgfSwKKwl7IEdTTV9DQVVTRV9NSVNTSU5HX0FQTiwgIk1pc3Npbmcgb3IgdW5rbm93biBBUE4iIH0sCisJeyBHU01fQ0FVU0VfVU5LTk9XTl9QRFAsICJVbmtub3duIFBEUCBhZGRyZXNzIG9yIFBEUCB0eXBlIiB9LAorCXsgR1NNX0NBVVNFX0FVVEhfRkFJTEVELCAiVXNlciBBdXRoZW50aWNhdGlvbiBmYWlsZWQiIH0sCisJeyBHU01fQ0FVU0VfQUNUX1JFSl9HR1NOLCAiQWN0aXZhdGlvbiByZWplY3RlZCBieSBHR1NOIiB9LAorCXsgR1NNX0NBVVNFX0FDVF9SRUpfVU5TUEVDLCAiQWN0aXZhdGlvbiByZWplY3RlZCwgdW5zcGVjaWZpZWQiIH0sCisJeyBHU01fQ0FVU0VfU0VSVl9PUFRfTk9UU1VQUCwgIlNlcnZpY2Ugb3B0aW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBHU01fQ0FVU0VfUkVRX1NFUlZfT1BUX05PVFNVQiwKKwkJCQkiUmVxdWVzdGVkIHNlcnZpY2Ugb3B0aW9uIG5vdCBzdWJzY3JpYmVkIiB9LAorCXsgR1NNX0NBVVNFX1NFUlZfT1BUX1RFTVBfT09PLAorCQkJCSJTZXJ2aWNlIG9wdGlvbiB0ZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIiIH0sCisJeyBHU01fQ0FVU0VfTlNBUElfSU5fVVNFLCAiTlNBUEkgYWxyZWFkeSB1c2VkIiB9LAorCXsgR1NNX0NBVVNFX0RFQUNUX1JFR1VMQVIsICJSZWd1bGFyIGRlYWN0aXZhdGlvbiIgfSwKKwl7IEdTTV9DQVVTRV9RT1NfTk9UX0FDQ0VQVEVELCAiUW9TIG5vdCBhY2NlcHRlZCIgfSwKKwl7IEdTTV9DQVVTRV9ORVRfRkFJTCwgIk5ldHdvcmsgRmFpbHVyZSIgfSwKKwl7IEdTTV9DQVVTRV9SRUFDVF9SUUQsICJSZWFjdGl2YXRpb24gcmVxdWlyZWQiIH0sCisJeyBHU01fQ0FVU0VfRkVBVFVSRV9OT1RTVVBQLCAiRmVhdHVyZSBub3Qgc3VwcG9ydGVkICIgfSwKKwl7IEdTTV9DQVVTRV9JTlZBTElEX1RSQU5TX0lELCAiSW52YWxpZCB0cmFuc2FjdGlvbiBpZGVudGlmaWVyIiB9LAorCXsgR1NNX0NBVVNFX1NFTV9JTkNPUlJfTVNHLCAiU2VtYW50aWNhbGx5IGluY29ycmVjdCBtZXNzYWdlIiB9LAorCXsgR1NNX0NBVVNFX0lOVl9NQU5EX0lORk8sICJJbnZhbGlkIG1hbmRhdG9yeSBpbmZvcm1hdGlvbiIgfSwKKwl7IEdTTV9DQVVTRV9NU0dUX05PVEVYSVNUX05PVElNUEwsCisJCQkiTWVzc2FnZSB0eXBlIG5vbi1leGlzdGFudCBvciBub3QgaW1wbGVtZW50ZWQiIH0sCisJeyBHU01fQ0FVU0VfTVNHVF9JTkNPTVBfUF9TVEFURSwKKwkJCSJNZXNzYWdlIHR5cGUgbm90IGNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IEdTTV9DQVVTRV9JRV9OT1RFWElTVF9OT1RJTVBMLAorCQkJIkluZm9ybWF0aW9uIGVsZW1lbnQgbm9uLWV4aXN0ZW50IG9yIG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IEdTTV9DQVVTRV9DT05EX0lFX0VSUiwgIkNvbmRpdGlvbmFsIElFIGVycm9yIiB9LAorCXsgR1NNX0NBVVNFX01TR19JTkNPTVBfUF9TVEFURSwKKwkJCQkiTWVzc2FnZSBub3QgY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlICIgfSwKKwl7IEdTTV9DQVVTRV9QUk9UT19FUlJfVU5TUEVDLCAiUHJvdG9jb2wgZXJyb3IsIHVuc3BlY2lmaWVkIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqYXR0X25hbWUodWludDhfdCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR1BSU19BVFRfVF9BVFRBQ0g6CisJCXJldHVybiAiR1BSUyBhdHRhY2giOworCWNhc2UgR1BSU19BVFRfVF9BVFRfV0hJTEVfSU1TSToKKwkJcmV0dXJuICJHUFJTIGF0dGFjaCB3aGlsZSBJTVNJIGF0dGFjaGVkIjsKKwljYXNlIEdQUlNfQVRUX1RfQ09NQklORUQ6CisJCXJldHVybiAiQ29tYmluZWQgR1BSUy9JTVNJIGF0dGFjaCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp1cGRfbmFtZSh1aW50OF90IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHUFJTX1VQRF9UX1JBOgorCQlyZXR1cm4gIlJBIHVwZGF0aW5nIjsKKwljYXNlIEdQUlNfVVBEX1RfUkFfTEE6CisJCXJldHVybiAiY29tYmluZWQgUkEvTEEgdXBkYXRpbmciOworCWNhc2UgR1BSU19VUERfVF9SQV9MQV9JTVNJX0FUVDoKKwkJcmV0dXJuICJjb21iaW5lZCBSQS9MQSB1cGRhdGluZyArIElNU0kgYXR0YWNoIjsKKwljYXNlIEdQUlNfVVBEX1RfUEVSSU9ESUM6CisJCXJldHVybiAicGVyaW9kaWMgdXBkYXRpbmciOworCX0KKwlyZXR1cm4gInVua25vd24iOworfQorCisvKiBTZW5kIGEgbWVzc2FnZSB0aHJvdWdoIHRoZSB1bmRlcmx5aW5nIGxheWVyICovCitzdGF0aWMgaW50IGdzbTQ4X2dtbV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIGludCBjb21tYW5kKQoreworCS8qIGNhbGxlciBuZWVkcyB0byBwcm92aWRlIFRMTEksIEJWQ0kgYW5kIE5TRUkgKi8KKwlyZXR1cm4gZ3Byc19sbGNfdHhfdWkobXNnLCBHUFJTX1NBUElfR01NLCBjb21tYW5kKTsKK30KKworLyogY29weSBpZGVudGlmaWVycyBmcm9tIG9sZCBtZXNzYWdlIHRvIG5ldyBtZXNzYWdlLCB0aGlzCisgKiBpcyByZXF1aXJlZCBzbyBsb3dlciBsYXllcnMgY2FuIHJvdXRlIGl0IGNvcnJlY3RseSAqLworc3RhdGljIHZvaWQgZ21tX2NvcHlfaWQoc3RydWN0IG1zZ2IgKm1zZywgY29uc3Qgc3RydWN0IG1zZ2IgKm9sZCkKK3sKKwltc2diX3RsbGkobXNnKSA9IG1zZ2JfdGxsaShvbGQpOworCW1zZ2JfYnZjaShtc2cpID0gbXNnYl9idmNpKG9sZCk7CisJbXNnYl9uc2VpKG1zZykgPSBtc2diX25zZWkob2xkKTsKK30KKworc3RhdGljIHN0cnVjdCBnc200OF9xb3MgZGVmYXVsdF9xb3MgPSB7CisJLmRlbGF5X2NsYXNzID0gNCwJLyogYmVzdCBlZmZvcnQgKi8KKwkucmVsaWFiX2NsYXNzID0gR1NNNDhfUU9TX1JDX0xMQ19VTl9STENfQUNLX0RBVEFfUFJPVCwKKwkucGVha190cHV0ID0gR1NNNDhfUU9TX1BFQUtfVFBVVF8zMjAwMGJwcywKKwkucHJlY2VkX2NsYXNzID0gR1NNNDhfUU9TX1BDX05PUk1BTCwKKwkubWVhbl90cHV0ID0gR1NNNDhfUU9TX01FQU5fVFBVVF9CRVNUX0VGRk9SVCwKKwkudHJhZl9jbGFzcyA9IEdTTTQ4X1FPU19UQ19JTlRFUkFDVElWRSwKKwkuZGVsaXZfb3JkZXIgPSBHU000OF9RT1NfRE9fVU5PUkRFUkVELAorCS5kZWxpdl9lcnJfc2R1ID0gR1NNNDhfUU9TX0VSUlNEVV9ZRVMsCisJLm1heF9zZHVfc2l6ZSA9IEdTTTQ4X1FPU19NQVhTRFVfMTUyMCwKKwkubWF4X2JpdHJhdGVfdXAgPSBHU000OF9RT1NfTUJSQVRFXzYzaywKKwkubWF4X2JpdHJhdGVfZG93biA9IEdTTTQ4X1FPU19NQlJBVEVfNjNrLAorCS5yZXNpZF9iZXIgPSBHU000OF9RT1NfUkJFUl81ZV8yLAorCS5zZHVfZXJyX3JhdGlvID0gR1NNNDhfUU9TX1NFUlJfMWVfMiwKKwkuaGFuZGxpbmdfcHJpbyA9IDMsCisJLnhmZXJfZGVsYXkgPSAweDEwLAkvKiAyMDBtcyAqLworCS5ndWFyX2JpdHJhdGVfdXAgPSBHU000OF9RT1NfTUJSQVRFXzBrLAorCS5ndWFyX2JpdHJhdGVfZG93biA9IEdTTTQ4X1FPU19NQlJBVEVfMGssCisJLnNpZ19pbmQgPSAwLAkvKiBub3Qgb3B0aW1pc2VkIGZvciBzaWduYWxsaW5nICovCisJLm1heF9iaXRyYXRlX2Rvd25fZXh0ID0gMCwJLyogdXNlIG9jdGV0IDkgKi8KKwkuZ3Vhcl9iaXRyYXRlX2Rvd25fZXh0ID0gMCwJLyogdXNlIG9jdGV0IDEzICovCit9OworCisvKiBDaGFwdGVyIDkuNC4yOiBBdHRhY2ggYWNjZXB0ICovCitzdGF0aWMgaW50IGdzbTQ4X3R4X2dtbV9hdHRfYWNrKHN0cnVjdCBtc2diICpvbGRfbXNnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJc3RydWN0IGdzbTQ4X2F0dGFjaF9hY2sgKmFhOworCXN0cnVjdCBncHJzX3JhX2lkIHJhX2lkOworCisJREVCVUdQKERNTSwgIjwtIEdQUlMgQVRUQUNIIEFDQ0VQVFxuIik7CisKKwlnbW1fY29weV9pZChtc2csIG9sZF9tc2cpOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTV9HUFJTOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dNTV9BVFRBQ0hfQUNLOworCisJYWEgPSAoc3RydWN0IGdzbTQ4X2F0dGFjaF9hY2sgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmFhKSk7CisJYWEtPmZvcmNlX3N0YnkgPSAwOwkvKiBub3QgaW5kaWNhdGVkICovCisJYWEtPmF0dF9yZXN1bHQgPSAxOwkvKiBHUFJTIG9ubHkgKi8KKwlhYS0+cmFfdXBkX3RpbWVyID0gR1BSU19UTVJfTUlOVVRFIHwgMTA7CisJYWEtPnJhZGlvX3ByaW8gPSA0OwkvKiBsb3dlc3QgKi8KKwlic3NncF9wYXJzZV9jZWxsX2lkKCZyYV9pZCwgbXNnYl9iY2lkKG9sZF9tc2cpKTsKKwlnc200OF9jb25zdHJ1Y3RfcmEoYWEtPnJhX2lkLmRpZ2l0cywgJnJhX2lkKTsKKworCS8qIE9wdGlvbjogUC1UTVNJIHNpZ25hdHVyZSwgYWxsb2NhdGVkIFAtVE1TSSwgTVMgSUQsIC4uLiAqLworCXJldHVybiBnc200OF9nbW1fc2VuZG1zZyhtc2csIDApOworfQorCisvKiBDaGFwdGVyIDkuNC41OiBBdHRhY2ggcmVqZWN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3R4X2dtbV9hdHRfcmVqKHN0cnVjdCBtc2diICpvbGRfbXNnLCB1aW50OF90IGdtbV9jYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJREVCVUdQKERNTSwgIjwtIEdQUlMgQVRUQUNIIFJFSkVDVFxuIik7CisKKwlnbW1fY29weV9pZChtc2csIG9sZF9tc2cpOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU1fR1BSUzsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9HTU1fQVRUQUNIX1JFSjsKKwlnaC0+ZGF0YVswXSA9IGdtbV9jYXVzZTsKKworCXJldHVybiBnc200OF9nbW1fc2VuZG1zZyhtc2csIDApOworfQorCisvKiBUcmFuc21pdCBDaGFwdGVyIDkuNC4xMiBJZGVudGl0eSBSZXF1ZXN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3R4X2dtbV9pZF9yZXEoc3RydWN0IG1zZ2IgKm9sZF9tc2csIHVpbnQ4X3QgaWRfdHlwZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJREVCVUdQKERNTSwgIi0+IEdQUlMgSURFTlRJVFkgUkVRVUVTVDogbWlfdHlwZT0lMDJ4XG4iLCBpZF90eXBlKTsKKworCWdtbV9jb3B5X2lkKG1zZywgb2xkX21zZyk7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTV9HUFJTOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dNTV9JRF9SRVE7CisJLyogMTAuNS41LjkgSUQgdHlwZSAyICsgaWRlbnRpdHkgdHlwZSBhbmQgMTAuNS41LjcgJ2ZvcmNlIHRvIHN0YW5kYnknIElFICovCisJZ2gtPmRhdGFbMF0gPSBpZF90eXBlICYgMHhmOworCisJcmV0dXJuIGdzbTQ4X2dtbV9zZW5kbXNnKG1zZywgMCk7Cit9CisKKy8qIENoZWNrIGlmIHdlIGNhbiBhbHJlYWR5IGF1dGhvcml6ZSBhIHN1YnNjcmliZXIgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfZ21tX2F1dGhvcml6ZShzdHJ1Y3Qgc2dzbl9tbV9jdHggKmN0eCwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpZiAoc3RybGVuKGN0eC0+aW1laSkgJiYgc3RybGVuKGN0eC0+aW1zaSkpIHsKKwkJY3R4LT5tbV9zdGF0ZSA9IEdNTV9SRUdJU1RFUkVEX05PUk1BTDsKKwkJcmV0dXJuIGdzbTQ4X3R4X2dtbV9hdHRfYWNrKG1zZyk7CisJfSAKKwlpZiAoIXN0cmxlbihjdHgtPmltZWkpKQorCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX2lkX3JlcShtc2csIEdTTV9NSV9UWVBFX0lNRUkpOworCisJaWYgKCFzdHJsZW4oY3R4LT5pbXNpKSkKKwkJcmV0dXJuIGdzbTQ4X3R4X2dtbV9pZF9yZXEobXNnLCBHU01fTUlfVFlQRV9JTVNJKTsKKworCXJldHVybiAwOworfQorCisvKiBQYXJzZSBDaGFwdGVyIDkuNC4xMyBJZGVudGl0eSBSZXNwb25zZSAqLworc3RhdGljIGludCBnc200OF9yeF9nbW1faWRfcmVzcChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG1zZyk7CisJdWludDhfdCBtaV90eXBlID0gZ2gtPmRhdGFbMV0gJiBHU01fTUlfVFlQRV9NQVNLOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCXN0cnVjdCBncHJzX3JhX2lkIHJhX2lkOworCXN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4OworCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksICZnaC0+ZGF0YVsxXSwgZ2gtPmRhdGFbMF0pOworCURFQlVHUChETU0sICJHTU0gSURFTlRJVFkgUkVTUE9OU0U6IG1pX3R5cGU9MHglMDJ4IE1JKCVzKSAiLAorCQltaV90eXBlLCBtaV9zdHJpbmcpOworCisJYnNzZ3BfcGFyc2VfY2VsbF9pZCgmcmFfaWQsIG1zZ2JfYmNpZChtc2cpKTsKKwljdHggPSBzZ3NuX21tX2N0eF9ieV90bGxpKG1zZ2JfdGxsaShtc2cpLCAmcmFfaWQpOworCWlmICghY3R4KSB7CisJCURFQlVHUChETU0sICJmcm9tIHVua25vd24gVExMSSAweCUwOHg/IT9cbiIsIG1zZ2JfdGxsaShtc2cpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChtaV90eXBlKSB7CisJY2FzZSBHU01fTUlfVFlQRV9JTVNJOgorCQkvKiB3ZSBhbHJlYWR5IGhhdmUgYSBtbSBjb250ZXh0IHdpdGggY3VycmVudCBUTExJLCBidXQgbm8KKwkJICogUC1UTVNJIC8gSU1TSSB5ZXQuICBXaGF0IHdlIG5vdyBuZWVkIHRvIGRvIGlzIHRvIGZpbGwKKwkJICogdGhpcyBpbml0aWFsIGNvbnRleHQgd2l0aCBkYXRhIGZyb20gdGhlIEhMUiAqLworCQlzdHJuY3B5KGN0eC0+aW1zaSwgbWlfc3RyaW5nLCBzaXplb2YoY3R4LT5pbWVpKSk7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1FSToKKwkJc3RybmNweShjdHgtPmltZWksIG1pX3N0cmluZywgc2l6ZW9mKGN0eC0+aW1laSkpOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUlTVjoKKwkJYnJlYWs7CisJfQorCisJREVCVUdQQyhETU0sICJcbiIpOworCS8qIENoZWNrIGlmIHdlIGNhbiBsZXQgdGhlIG1vYmlsZSBzdGF0aW9uIGVudGVyICovCisJcmV0dXJuIGdzbTQ4X2dtbV9hdXRob3JpemUoY3R4LCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBhdHRhY2hfcmVqX2NiKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNnc25fbW1fY3R4ICpjdHggPSBkYXRhOworCisJLyogRklYTUU6IGRldGVybWluZSB0aHJvdWdoIHdoaWNoIEJUUy9UUlggdG8gc2VuZCB0aGlzICovCisJLy9nc200OF90eF9nbW1fYXR0X3JlaihjdHgtPnRsbGksIEdNTV9DQVVTRV9NU19JRF9OT1RfREVSSVZFRCk7CisJY3R4LT5tbV9zdGF0ZSA9IEdNTV9ERVJFR0lTVEVSRUQ7CisJLyogRklYTUU6IHJlbGVhc2UgdGhlIGNvbnRleHQgKi8KK30KKworc3RhdGljIHZvaWQgc2NoZWR1bGVfcmVqZWN0KHN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4KQoreworCWN0eC0+VCA9IDMzNzA7CisJY3R4LT50aW1lci5jYiA9IGF0dGFjaF9yZWpfY2I7CisJY3R4LT50aW1lci5kYXRhID0gY3R4OworCWJzY19zY2hlZHVsZV90aW1lcigmY3R4LT50aW1lciwgNiwgMCk7Cit9CisKKy8qIFNlY3Rpb24gOS40LjEgQXR0YWNoIHJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfZ21tX2F0dF9yZXEoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfZ21taChtc2cpOworCXVpbnQ4X3QgKmN1ciA9IGdoLT5kYXRhLCAqbXNuYywgKm1pLCAqb2xkX3JhX2luZm87CisJdWludDhfdCBtc25jX2xlbiwgYXR0X3R5cGUsIG1pX2xlbiwgbWlfdHlwZTsKKwl1aW50MTZfdCBkcnhfcGFyOworCXVpbnQzMl90IHRtc2k7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisJc3RydWN0IGdwcnNfcmFfaWQgcmFfaWQ7CisJdWludDE2X3QgY2lkOworCXN0cnVjdCBzZ3NuX21tX2N0eCAqY3R4OworCisJREVCVUdQKERNTSwgIkdNTSBBVFRBQ0ggUkVRVUVTVCAiKTsKKworCS8qIEFzIHBlciBUUyAwNC4wOCBDaGFwdGVyIDQuNy4xLjQsIHRoZSBhdHRhY2ggcmVxdWVzdCBhcnJpdmVzIGVpdGhlcgorCSAqIHdpdGggYSBmb3JlaWduIFRMTEkgKFAtVE1TSSB0aGF0IHdhcyBhbGxvY2F0ZWQgdG8gdGhlIE1TIGJlZm9yZSksCisJICogb3Igd2l0aCByYW5kb20gVExMSS4gKi8KKworCWNpZCA9IGJzc2dwX3BhcnNlX2NlbGxfaWQoJnJhX2lkLCBtc2diX2JjaWQobXNnKSk7CisKKwkvKiBNUyBuZXR3b3JrIGNhcGFiaWxpdHkgMTAuNS41LjEyICovCisJbXNuY19sZW4gPSAqY3VyKys7CisJbXNuYyA9IGN1cjsKKwlpZiAobXNuY19sZW4gPiAyKQorCQlnb3RvIGVycl9pbnZhbDsKKwljdXIgKz0gbXNuY19sZW47CisKKwkvKiBhVFRBQ0ggVHlwZSAxMC41LjUuMiAqLworCWF0dF90eXBlID0gKmN1cisrICYgMHgwZjsKKworCS8qIERSWCBwYXJhbWV0ZXIgMTAuNS41LjYgKi8KKwlkcnhfcGFyID0gKmN1cisrOworCWRyeF9wYXIgfD0gKmN1cisrIDw8IDg7CisKKwkvKiBNb2JpbGUgSWRlbnRpdHkgKFAtVE1TSSBvciBJTVNJKSAxMC41LjEuNCAqLworCW1pX2xlbiA9ICpjdXIrKzsKKwltaSA9IGN1cjsKKwlpZiAobWlfbGVuID4gOCkKKwkJZ290byBlcnJfaW52YWw7CisJbWlfdHlwZSA9ICptaSAmIEdTTV9NSV9UWVBFX01BU0s7CisJY3VyICs9IG1pX2xlbjsKKworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9zdHJpbmcsIHNpemVvZihtaV9zdHJpbmcpLCBtaSwgbWlfbGVuKTsKKworCURFQlVHUEMoRE1NLCAiTUkoJXMpIHR5cGU9XCIlc1wiICIsIG1pX3N0cmluZywgYXR0X25hbWUoYXR0X3R5cGUpKTsKKworCS8qIE9sZCByb3V0aW5nIGFyZWEgaWRlbnRpZmljYXRpb24gMTAuNS41LjE1ICovCisJb2xkX3JhX2luZm8gPSBjdXI7CisJY3VyICs9IDY7CisKKwkvKiBNUyBSYWRpbyBBY2Nlc3MgQ2FwYWJpbGl0eSAxMC41LjUuMTJhICovCisKKwkvKiBPcHRpb25hbDogT2xkIFAtVE1TSSBTaWduYXR1cmUsIFJlcXVlc3RlZCBSRUFEWSB0aW1lciwgVE1TSSBTdGF0dXMgKi8KKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJLyogVHJ5IHRvIGZpbmQgTU0gY29udGV4dCBiYXNlZCBvbiBJTVNJICovCisJCWN0eCA9IHNnc25fbW1fY3R4X2J5X2ltc2kobWlfc3RyaW5nKTsKKwkJaWYgKCFjdHgpIHsKKyNpZiAwCisJCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX2F0dF9yZWoobXNnLCBHTU1fQ0FVU0VfSU1TSV9VTktOT1dOKTsKKyNlbHNlCisJCQkvKiBBcyBhIHRlbW9yYXJ5IGhhY2ssIHdlIHNpbXBseSBhc3N1bWUgdGhhdCB0aGUgSU1TSSBleGlzdHMgKi8KKwkJCWN0eCA9IHNnc25fbW1fY3R4X2FsbG9jKDAsICZyYV9pZCk7CisJCQlpZiAoIWN0eCkKKwkJCQlyZXR1cm4gZ3NtNDhfdHhfZ21tX2F0dF9yZWoobXNnLCBHTU1fQ0FVU0VfTkVUX0ZBSUwpOworCQkJc3RybmNweShjdHgtPmltc2ksIG1pX3N0cmluZywgc2l6ZW9mKGN0eC0+aW1zaSkpOworI2VuZGlmCisJCX0KKwkJLyogRklYTUU6IFN0YXJ0IHNvbWUgdGltZXIgKi8KKwkJY3R4LT5tbV9zdGF0ZSA9IEdNTV9DT01NT05fUFJPQ19JTklUOworCQljdHgtPnRsbGkgPSBtc2diX3RsbGkobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9UTVNJOgorCQl0bXNpID0gc3RydG91bChtaV9zdHJpbmcsIE5VTEwsIDEwKTsKKwkJLyogVHJ5IHRvIGZpbmQgTU0gY29udGV4dCBiYXNlZCBvbiBQLVRNU0kgKi8KKwkJY3R4ID0gc2dzbl9tbV9jdHhfYnlfcHRtc2kodG1zaSk7CisJCWlmICghY3R4KSB7CisJCQljdHggPSBzZ3NuX21tX2N0eF9hbGxvYyhtc2diX3RsbGkobXNnKSwgJnJhX2lkKTsKKwkJCS8qIEZJWE1FOiBTdGFydCBzb21lIHRpbWVyICovCisJCQljdHgtPm1tX3N0YXRlID0gR01NX0NPTU1PTl9QUk9DX0lOSVQ7CisJCQljdHgtPnRsbGkgPSBtc2diX3RsbGkobXNnKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJLyogVXBkYXRlIE1NIENvbnRleHQgd2l0aCBjdXJyaWVudCBSQSBhbmQgQ2VsbCBJRCAqLworCWN0eC0+cmEgPSByYV9pZDsKKwljdHgtPmNlbGxfaWQgPSBjaWQ7CisKKwkvKiBGSVhNRTogYWxsb2NhdGUgYSBuZXcgUC1UTVNJICgrIFAtVE1TSSBzaWduYXR1cmUpICovCisJLyogRklYTUU6IHVwZGF0ZSB0aGUgVExMSSB3aXRoIHRoZSBuZXcgbG9jYWwgVExMSSBiYXNlZCBvbiB0aGUgUC1UTVNJICovCisKKwlERUJVR1BDKERNTSwgIlxuIik7CisKKwlyZXR1cm4gY3R4ID8gZ3NtNDhfZ21tX2F1dGhvcml6ZShjdHgsIG1zZykgOiAwOworCitlcnJfaW52YWw6CisJREVCVUdQQyhETU0sICJcbiIpOworCXJldHVybiBnc200OF90eF9nbW1fYXR0X3Jlaihtc2csIEdNTV9DQVVTRV9TRU1fSU5DT1JSX01TRyk7Cit9CisKKy8qIENoYXB0ZXIgOS40LjE1OiBSb3V0aW5nIGFyZWEgdXBkYXRlIGFjY2VwdCAqLworc3RhdGljIGludCBnc200OF90eF9nbW1fcmFfdXBkX2FjayhzdHJ1Y3QgbXNnYiAqb2xkX21zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXN0cnVjdCBnc200OF9yYV91cGRfYWNrICpydWE7CisJc3RydWN0IGdwcnNfcmFfaWQgcmFfaWQ7CisKKwlERUJVR1AoRE1NLCAiPC0gUk9VVElORyBBUkVBIFVQREFURSBBQ0NFUFRcbiIpOworCisJZ21tX2NvcHlfaWQobXNnLCBvbGRfbXNnKTsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU1fR1BSUzsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9HTU1fUkFfVVBEX0FDSzsKKworCXJ1YSA9IChzdHJ1Y3QgZ3NtNDhfcmFfdXBkX2FjayAqKSBtc2diX3B1dChtc2csIHNpemVvZigqcnVhKSk7CisJcnVhLT5mb3JjZV9zdGJ5ID0gMDsJLyogbm90IGluZGljYXRlZCAqLworCXJ1YS0+dXBkX3Jlc3VsdCA9IDA7CS8qIFJBIHVwZGF0ZWQgKi8KKwlydWEtPnJhX3VwZF90aW1lciA9IEdQUlNfVE1SX01JTlVURSB8IDEwOworCisJYnNzZ3BfcGFyc2VfY2VsbF9pZCgmcmFfaWQsIG1zZ2JfYmNpZChvbGRfbXNnKSk7CisJZ3NtNDhfY29uc3RydWN0X3JhKHJ1YS0+cmFfaWQuZGlnaXRzLCAmcmFfaWQpOworCisJLyogT3B0aW9uOiBQLVRNU0kgc2lnbmF0dXJlLCBhbGxvY2F0ZWQgUC1UTVNJLCBNUyBJRCwgLi4uICovCisJcmV0dXJuIGdzbTQ4X2dtbV9zZW5kbXNnKG1zZywgMCk7Cit9CisKKy8qIENoYXB0ZXIgOS40LjE3OiBSb3V0aW5nIGFyZWEgdXBkYXRlIHJlamVjdCAqLworc3RhdGljIGludCBnc200OF90eF9nbW1fcmFfdXBkX3JlaihzdHJ1Y3QgbXNnYiAqb2xkX21zZywgdWludDhfdCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJREVCVUdQKERNTSwgIjwtIFJPVVRJTkcgQVJFQSBVUERBVEUgUkVKRUNUXG4iKTsKKworCWdtbV9jb3B5X2lkKG1zZywgb2xkX21zZyk7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAyKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTV9HUFJTOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dNTV9SQV9VUERfUkVKOworCWdoLT5kYXRhWzBdID0gY2F1c2U7CisJZ2gtPmRhdGFbMV0gPSAwOyAvKiA/ICovCisKKwkvKiBPcHRpb246IFAtVE1TSSBzaWduYXR1cmUsIGFsbG9jYXRlZCBQLVRNU0ksIE1TIElELCAuLi4gKi8KKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwKTsKK30KKworLyogQ2hhcHRlciA5LjQuMTQ6IFJvdXRpbmcgYXJlYSB1cGRhdGUgcmVxdWVzdCAqLworc3RhdGljIGludCBnc200OF9yeF9nbW1fcmFfdXBkX3JlcShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG1zZyk7CisJc3RydWN0IHNnc25fbW1fY3R4ICptbWN0eDsKKwl1aW50OF90ICpjdXIgPSBnaC0+ZGF0YTsKKwlzdHJ1Y3QgZ3Byc19yYV9pZCBvbGRfcmFfaWQ7CisJdWludDhfdCB1cGRfdHlwZTsKKworCS8qIFVwZGF0ZSBUeXBlIDEwLjUuNS4xOCAqLworCXVwZF90eXBlID0gKmN1cisrICYgMHgwZjsKKworCURFQlVHUChETU0sICJHTU0gUkEgVVBEQVRFIFJFUVVFU1QgdHlwZT1cIiVzXCIgIiwgdXBkX25hbWUodXBkX3R5cGUpKTsKKworCS8qIE9sZCByb3V0aW5nIGFyZWEgaWRlbnRpZmljYXRpb24gMTAuNS41LjE1ICovCisJZ3NtNDhfcGFyc2VfcmEoJm9sZF9yYV9pZCwgY3VyKTsKKwljdXIgKz0gNjsKKworCS8qIE1TIFJhZGlvIEFjY2VzcyBDYXBhYmlsaXR5IDEwLjUuNS4xMmEgKi8KKworCS8qIE9wdGlvbmFsOiBPbGQgUC1UTVNJIFNpZ25hdHVyZSwgUmVxdWVzdGVkIFJFQURZIHRpbWVyLCBUTVNJIFN0YXR1cywKKwkgKiBEUlggcGFyYW1ldGVyLCBNUyBuZXR3b3JrIGNhcGFiaWxpdHkgKi8KKworCXN3aXRjaCAodXBkX3R5cGUpIHsKKwljYXNlIEdQUlNfVVBEX1RfUkFfTEE6CisJY2FzZSBHUFJTX1VQRF9UX1JBX0xBX0lNU0lfQVRUOgorCQlERUJVR1BDKERNTSwgIiB1bnN1cHBvcnRlZCBpbiBNb2RlIElJSSwgaXMgeW91ciBTSTEzIGNvcnJ1cHQ/XG4iKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X2dtbV9yYV91cGRfcmVqKG1zZywgR01NX0NBVVNFX1BST1RPX0VSUl9VTlNQRUMpOworCQlicmVhazsKKwljYXNlIEdQUlNfVVBEX1RfUkE6CisJY2FzZSBHUFJTX1VQRF9UX1BFUklPRElDOgorCQlicmVhazsKKwl9CisKKwkvKiBMb29rLXVwIHRoZSBNTSBjb250ZXh0IGJhc2VkIG9uIG9sZCBSQS1JRCBhbmQgVExMSSAqLworCW1tY3R4ID0gc2dzbl9tbV9jdHhfYnlfdGxsaShtc2diX3RsbGkobXNnKSwgJm9sZF9yYV9pZCk7CisJaWYgKCFtbWN0eCB8fCBtbWN0eC0+bW1fc3RhdGUgPT0gR01NX0RFUkVHSVNURVJFRCkgeworCQkvKiBUaGUgTVMgaGFzIHRvIHBlcmZvcm0gR1BSUyBhdHRhY2ggKi8KKwkJREVCVUdQQyhETU0sICIgUkVKRUNUXG4iKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X2dtbV9yYV91cGRfcmVqKG1zZywgR01NX0NBVVNFX0lNUExfREVUQUNIRUQpOworCX0KKworCS8qIFVwZGF0ZSB0aGUgTU0gY29udGV4dCB3aXRoIHRoZSBuZXcgUkEtSUQgKi8KKwlic3NncF9wYXJzZV9jZWxsX2lkKCZtbWN0eC0+cmEsIG1zZ2JfYmNpZChtc2cpKTsKKwkvKiBVcGRhdGUgdGhlIE1NIGNvbnRleHQgd2l0aCB0aGUgbmV3IFRMTEkgKi8KKwltbWN0eC0+dGxsaSA9IG1zZ2JfdGxsaShtc2cpOworCS8qIEZJWE1FOiBVcGRhdGUgdGhlIE1NIGNvbnRleHQgd2l0aCB0aGUgTVMgcmFkaW8gYWNjIGNhcGFiaWxpdGllcyAqLworCS8qIEZJWE1FOiBVcGRhdGUgdGhlIE1NIGNvbnRleHQgd2l0aCB0aGUgTVMgbmV0d29yayBjYXBhYmlsaXRpZXMgKi8KKworCURFQlVHUEMoRE1NLCAiIEFDQ0VQVFxuIik7CisJcmV0dXJuIGdzbTQ4X3R4X2dtbV9yYV91cGRfYWNrKG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfZ21tX3N0YXR1cyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERNTSwgIkdQUlMgTU0gU1RBVFVTIChjYXVzZTogJXMpXG4iLAorCQlnZXRfdmFsdWVfc3RyaW5nKGdtbV9jYXVzZV9uYW1lcywgZ2gtPmRhdGFbMF0pKTsKKworCXJldHVybiAwOworfQorCisvKiBHUFJTIE1vYmlsaXR5IE1hbmFnZW1lbnQgKi8KK3N0YXRpYyBpbnQgZ3NtMDQwOF9yY3ZfZ21tKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKGdoLT5tc2dfdHlwZSkgeworCWNhc2UgR1NNNDhfTVRfR01NX1JBX1VQRF9SRVE6CisJCXJjID0gZ3NtNDhfcnhfZ21tX3JhX3VwZF9yZXEobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9HTU1fQVRUQUNIX1JFUToKKwkJcmMgPSBnc200OF9yeF9nbW1fYXR0X3JlcShtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX0dNTV9JRF9SRVNQOgorCQlyYyA9IGdzbTQ4X3J4X2dtbV9pZF9yZXNwKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfR01NX1NUQVRVUzoKKwkJcmMgPSBnc200OF9yeF9nbW1fc3RhdHVzKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfR01NX1JBX1VQRF9DT01QTDoKKwkJLyogb25seSBpbiBjYXNlIFNHU04gb2ZmZXJlZCBuZXcgUC1UTVNJICovCisJY2FzZSBHU000OF9NVF9HTU1fQVRUQUNIX0NPTVBMOgorCQkvKiBvbmx5IGluIGNhc2UgU0dTTiBvZmZlcmVkIG5ldyBQLVRNU0kgKi8KKwljYXNlIEdTTTQ4X01UX0dNTV9ERVRBQ0hfUkVROgorCWNhc2UgR1NNNDhfTVRfR01NX1BUTVNJX1JFQUxMX0NPTVBMOgorCWNhc2UgR1NNNDhfTVRfR01NX0FVVEhfQ0lQSF9SRVNQOgorCQlERUJVR1AoRE1NLCAiVW5pbXBsZW1lbnRlZCBHU00gMDQuMDggR01NIG1zZyB0eXBlIDB4JTAyeFxuIiwKKwkJCWdoLT5tc2dfdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChETU0sICJVbmtub3duIEdTTSAwNC4wOCBHTU0gbXNnIHR5cGUgMHglMDJ4XG4iLAorCQkJZ2gtPm1zZ190eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBtc2diX3B1dF9wZHBfYWRkcl9pcHY0KHN0cnVjdCBtc2diICptc2csIHVpbnQzMl90IGlwYWRkcikKK3sKKwl1aW50OF90IHZbNl07CisKKwl2WzBdID0gUERQX1RZUEVfT1JHX0lFVEY7CisJdlsxXSA9IFBEUF9UWVBFX05fSUVURl9JUHY0OworCSoodWludDMyX3QgKikodisyKSA9IGh0b25sKGlwYWRkcik7CisKKwltc2diX3Rsdl9wdXQobXNnLCBHU000OF9JRV9HU01fUERQX0FERFIsIHNpemVvZih2KSwgdik7Cit9CisKK3N0YXRpYyB2b2lkIG1zZ2JfcHV0X3BkcF9hZGRyX3BwcChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXVpbnQ4X3QgdlsyXTsKKworCXZbMF0gPSBQRFBfVFlQRV9PUkdfRVRTSTsKKwl2WzFdID0gUERQX1RZUEVfTl9FVFNJX1BQUDsKKworCW1zZ2JfdGx2X3B1dChtc2csIEdTTTQ4X0lFX0dTTV9QRFBfQUREUiwgc2l6ZW9mKHYpLCB2KTsKK30KKworLyogU2VjdGlvbiA5LjUuMjogQXRpdmF0ZSBQRFAgQ29udGV4dCBBY2NlcHQgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfZ3NtX2FjdF9wZHBfYWNjKHN0cnVjdCBtc2diICpvbGRfbXNnLCBzdHJ1Y3QgZ3NtNDhfYWN0X3BkcF9jdHhfcmVxICpyZXEpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqb2xkX2doID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG9sZF9tc2cpOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2FjdF9wZHBfY3R4X2FjayAqYWN0X2FjazsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwl1aW50OF90IHRyYW5zYWN0aW9uX2lkID0gKChvbGRfZ2gtPnByb3RvX2Rpc2NyID4+IDQpIF4gMHg4KTsgLyogZmxpcCAqLworCisJREVCVUdQKERNTSwgIjwtIEFDVElWQVRFIFBEUCBDT05URVhUIEFDS1xuIik7CisKKwlnbW1fY29weV9pZChtc2csIG9sZF9tc2cpOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19TTV9HUFJTIHwgKHRyYW5zYWN0aW9uX2lkIDw8IDQpOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dTTV9BQ1RfUERQX0FDSzsKKworCS8qIE5lZ290aWF0ZWQgTExDIFNBUEkgKi8KKwltc2diX3ZfcHV0KG1zZywgcmVxLT5yZXFfbGxjX3NhcGkpOworCS8qIGNvcHkgUW9TIHBhcmFtZXRlcnMgZnJvbSBvcmlnaW5hbCByZXF1ZXN0ICovCisJbXNnYl9sdl9wdXQobXNnLCBzaXplb2YoZGVmYXVsdF9xb3MpLCAodWludDhfdCAqKSZkZWZhdWx0X3Fvcyk7CisJLyogUmFkaW8gcHJpb3JpdHkgMTAuNS43LjIgKi8KKwltc2diX3ZfcHV0KG1zZywgNCk7CisJLyogUERQIGFkZHJlc3MgKi8KKwltc2diX3B1dF9wZHBfYWRkcl9pcHY0KG1zZywgMHgwMTAyMDMwNCk7CisJLyogT3B0aW9uYWw6IFByb3RvY29sIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworCS8qIE9wdGlvbmFsOiBQYWNrZXQgRmxvdyBJZGVudGlmaWVyICovCisKKwlyZXR1cm4gZ3NtNDhfZ21tX3NlbmRtc2cobXNnLCAwKTsKK30KKworLyogU2VjdGlvbiA5LjUuOTogRGVhY3RpdmF0ZSBQRFAgQ29udGV4dCBBY2NlcHQgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfZ3NtX2RlYWN0X3BkcF9hY2Moc3RydWN0IG1zZ2IgKm9sZF9tc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqb2xkX2doID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG9sZF9tc2cpOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJdWludDhfdCB0cmFuc2FjdGlvbl9pZCA9ICgob2xkX2doLT5wcm90b19kaXNjciA+PiA0KSBeIDB4OCk7IC8qIGZsaXAgKi8KKworCURFQlVHUChETU0sICI8LSBERUFDVElWQVRFIFBEUCBDT05URVhUIEFDS1xuIik7CisKKwlnbW1fY29weV9pZChtc2csIG9sZF9tc2cpOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19TTV9HUFJTIHwgKHRyYW5zYWN0aW9uX2lkIDw8IDQpOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0dTTV9ERUFDVF9QRFBfQUNLOworCisJcmV0dXJuIGdzbTQ4X2dtbV9zZW5kbXNnKG1zZywgMCk7Cit9CisKKy8qIFNlY3Rpb24gOS41LjE6IEFjdGl2YXRlIFBEUCBDb250ZXh0IFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfZ3NtX2FjdF9wZHBfcmVxKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfYWN0X3BkcF9jdHhfcmVxICphY3RfcmVxID0gKHN0cnVjdCBnc200OF9hY3RfcGRwX2N0eF9yZXEgKikgZ2gtPmRhdGE7CisJdWludDhfdCAqcGRwX2FkZHJfbHYgPSBhY3RfcmVxLT5kYXRhOworCXVpbnQ4X3QgcmVxX3Fvc19sZW4sIHJlcV9wZHBhX2xlbjsKKwl1aW50OF90ICpyZXFfcW9zLCAqcmVxX3BkcGE7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlERUJVR1AoRE1NLCAiQUNUSVZBVEUgUERQIENPTlRFWFQgUkVROiAiKTsKKwlyZXFfcW9zX2xlbiA9IGFjdF9yZXEtPmRhdGFbMF07CisJcmVxX3FvcyA9IGFjdF9yZXEtPmRhdGEgKyAxOwkvKiAxMC41LjYuNSAqLworCXJlcV9wZHBhX2xlbiA9IGFjdF9yZXEtPmRhdGFbMSArIHJlcV9xb3NfbGVuXTsKKwlyZXFfcGRwYSA9IGFjdF9yZXEtPmRhdGEgKyAxICsgcmVxX3Fvc19sZW4gKyAxOwkvKiAxMC41LjYuNCAqLworCisJc3dpdGNoIChyZXFfcGRwYVswXSAmIDB4ZikgeworCWNhc2UgMHgwOgorCQlERUJVR1BDKERNTSwgIkVUU0kgIik7CisJCWJyZWFrOworCWNhc2UgMHgxOgorCQlERUJVR1BDKERNTSwgIklFVEYgIik7CisJCWJyZWFrOworCWNhc2UgMHhmOgorCQlERUJVR1BDKERNTSwgIkVtcHR5ICIpOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHJlcV9wZHBhWzFdKSB7CisJY2FzZSAweDIxOgorCQlERUJVR1BDKERNTSwgIklQdjQgIik7CisJCWlmIChyZXFfcGRwYV9sZW4gPj0gNikgeworCQkJc3RydWN0IGluX2FkZHIgaWE7CisJCQlpYS5zX2FkZHIgPSBudG9obCgqKCh1aW50MzJfdCAqKSAocmVxX3BkcGErMikpKTsKKwkJCURFQlVHUEMoRE1NLCAiJXMgIiwgaW5ldF9udG9hKGlhKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDU3OgorCQlERUJVR1BDKERNTSwgIklQdjYgIik7CisJCWlmIChyZXFfcGRwYV9sZW4gPj0gMTgpIHsKKwkJCS8qIEZJWE1FOiBwcmludCBJUHY2IGFkZHJlc3MgKi8KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgkKKwkJREVCVUdQQyhETU0sICIweCUwMnggIiwgcmVxX3BkcGFbMV0pOworCQlicmVhazsKKwl9CisKKwkvKiBGSVhNRTogcGFyc2UgVExWIGZvciBBUCBuYW1lIGFuZCBwcm90b2NvbCBjb25maWcgb3B0aW9ucyAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9HU01fQVBOKSkge30KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfR1NNX1BST1RPX0NPTkZfT1BUKSkge30KKworCXJldHVybiBnc200OF90eF9nc21fYWN0X3BkcF9hY2MobXNnLCBhY3RfcmVxKTsKK30KKworLyogU2VjdGlvbiA5LjUuODogRGVhY3RpdmF0ZSBQRFAgQ29udGV4dCBSZXF1ZXN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X2dzbV9kZWFjdF9wZHBfcmVxKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKworCURFQlVHUChETU0sICJERUFDVElWQVRFIFBEUCBDT05URVhUIFJFUSAoY2F1c2U6ICVzKVxuIiwKKwkJZ2V0X3ZhbHVlX3N0cmluZyhnc21fY2F1c2VfbmFtZXMsIGdoLT5kYXRhWzBdKSk7CisKKwlyZXR1cm4gZ3NtNDhfdHhfZ3NtX2RlYWN0X3BkcF9hY2MobXNnKTsKK30KKworc3RhdGljIGludCBnc200OF9yeF9nc21fc3RhdHVzKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisKKwlERUJVR1AoRE1NLCAiR1BSUyBTTSBTVEFUVVMgKGNhdXNlOiAlcylcbiIsCisJCWdldF92YWx1ZV9zdHJpbmcoZ3NtX2NhdXNlX25hbWVzLCBnaC0+ZGF0YVswXSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdQUlMgU2Vzc2lvbiBNYW5hZ2VtZW50ICovCitzdGF0aWMgaW50IGdzbTA0MDhfcmN2X2dzbShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9nbW1oKG1zZyk7CisJaW50IHJjOworCisJc3dpdGNoIChnaC0+bXNnX3R5cGUpIHsKKwljYXNlIEdTTTQ4X01UX0dTTV9BQ1RfUERQX1JFUToKKwkJcmMgPSBnc200OF9yeF9nc21fYWN0X3BkcF9yZXEobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9HU01fREVBQ1RfUERQX1JFUToKKwkJcmMgPSBnc200OF9yeF9nc21fZGVhY3RfcGRwX3JlcShtc2cpOworCWNhc2UgR1NNNDhfTVRfR1NNX1NUQVRVUzoKKwkJcmMgPSBnc200OF9yeF9nc21fc3RhdHVzKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfR1NNX1JFUV9QRFBfQUNUX1JFSjoKKwljYXNlIEdTTTQ4X01UX0dTTV9BQ1RfQUFfUERQX1JFUToKKwljYXNlIEdTTTQ4X01UX0dTTV9ERUFDVF9BQV9QRFBfUkVROgorCQlERUJVR1AoRE1NLCAiVW5pbXBsZW1lbnRlZCBHU00gMDQuMDggR1NNIG1zZyB0eXBlIDB4JTAyeFxuIiwKKwkJCWdoLT5tc2dfdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChETU0sICJVbmtub3duIEdTTSAwNC4wOCBHU00gbXNnIHR5cGUgMHglMDJ4XG4iLAorCQkJZ2gtPm1zZ190eXBlKTsKKwkJYnJlYWs7CisKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIE1haW4gZW50cnkgcG9pbnQgZm9yIGluY29taW5nIDA0LjA4IEdQUlMgbWVzc2FnZXMgKi8KK2ludCBnc20wNDA4X2dwcnNfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX2dtbWgobXNnKTsKKwl1aW50OF90IHBkaXNjID0gZ2gtPnByb3RvX2Rpc2NyICYgMHgwZjsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJc3dpdGNoIChwZGlzYykgeworCWNhc2UgR1NNNDhfUERJU0NfTU1fR1BSUzoKKwkJcmMgPSBnc20wNDA4X3Jjdl9nbW0obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19TTV9HUFJTOgorCQlyYyA9IGdzbTA0MDhfcmN2X2dzbShtc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoRE1NLCAiVW5rbm93biBHU00gMDQuMDggZGlzY3JpbWluYXRvciAweCUwMnhcbiIsCisJCQlwZGlzYyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvb3Ntb19nYnByb3h5LmNmZyBiL29wZW5ic2Mvc3JjL2dwcnMvb3Ntb19nYnByb3h5LmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTFiMDRhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3Bycy9vc21vX2dicHJveHkuY2ZnCkBAIC0wLDAgKzEsMTMgQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorZ2Jwcm94eQorICBuc2lwIGJzcyBsb2NhbCBwb3J0IDIzMDAwCisgIG5zaXAgc2dzbiByZW1vdGUgaXAgMTI3LjAuMC4xCisgIG5zaXAgc2dzbiByZW1vdGUgcG9ydCA3Nzc3CisgIG5zaXAgc2dzbiBuc2VpIDEwMQorICBuc2lwIHNnc24gbnN2Y2kgMTAxCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL29zbW9fc2dzbi5jZmcgYi9vcGVuYnNjL3NyYy9ncHJzL29zbW9fc2dzbi5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5ZTg1MwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvb3Ntb19zZ3NuLmNmZwpAQCAtMCwwICsxLDkgQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorc2dzbgorICBuc2lwIGxvY2FsIHBvcnQgMjMwMDAKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dwcnMvc2dzbl9tYWluLmMgYi9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTVmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fbWFpbi5jCkBAIC0wLDAgKzEsMTgzIEBACisvKiBHUFJTIFNHU04gSW1wbGVtZW50YXRpb24gKi8KKworLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IE9uIFdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yYXRlX2N0ci5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Nnc24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfYnNzZ3AuaD4KKworI2luY2x1ZGUgIi4uLy4uL2JzY2NvbmZpZy5oIgorCisvKiB0aGlzIGlzIGhlcmUgZm9yIHRoZSB2dHkuLi4gaXQgd2lsbCBuZXZlciBiZSBjYWxsZWQgKi8KK3ZvaWQgc3Vic2NyX3B1dCgpIHsgYWJvcnQoKTsgfQorCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3ZvaWQgKnRhbGxfYnNjX2N0eDsKKworc3RydWN0IGdwcnNfbnNfaW5zdCAqc2dzbl9uc2k7CisKK2NvbnN0IGNoYXIgKm9wZW5ic2NfdmVyc2lvbiA9ICJPc21vY29tIE5TSVAgUHJveHkgIiBQQUNLQUdFX1ZFUlNJT047Citjb25zdCBjaGFyICpvcGVuYnNjX2NvcHlyaWdodCA9CisJIkNvcHlyaWdodCAoQykgMjAxMCBIYXJhbGQgV2VsdGUgYW5kIE9uLVdhdmVzXG4iCisJIkNvbnRyaWJ1dGlvbnMgYnkgRGFuaWVsIFdpbGxtYW5uLCBKYW4gTMO8YmJlLCBTdGVmYW4gU2NobWlkdFxuIgorCSJEaWV0ZXIgU3BhYXIsIEFuZHJlYXMgRXZlcnNiZXJnLCBIb2xnZXIgRnJleXRoZXJcblxuIgorCSJMaWNlbnNlIEdQTHYyKzogR05VIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIgPGh0dHA6Ly9nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sPlxuIgorCSJUaGlzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBhcmUgZnJlZSB0byBjaGFuZ2UgYW5kIHJlZGlzdHJpYnV0ZSBpdC5cbiIKKwkiVGhlcmUgaXMgTk8gV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy5cbiI7CisKK3N0YXRpYyBjaGFyICpjb25maWdfZmlsZSA9ICJvc21vX3Nnc24uY2ZnIjsKK3N0YXRpYyBzdHJ1Y3Qgc2dzbl9jb25maWcgc2djZmc7CisKKy8qIGNhbGwtYmFjayBmdW5jdGlvbiBmb3IgdGhlIE5TIHByb3RvY29sICovCitzdGF0aWMgaW50IHNnc25fbnNfY2IoZW51bSBncHJzX25zX2V2dCBldmVudCwgc3RydWN0IGdwcnNfbnN2YyAqbnN2YywKKwkJICAgICAgc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQxNl90IGJ2Y2kpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEdQUlNfTlNfRVZUX1VOSVRfREFUQToKKwkJLyogaGFuZCB0aGUgbWVzc2FnZSBpbnRvIHRoZSBCU1NHUCBpbXBsZW1lbnRhdGlvbiAqLworCQlyYyA9IGdwcnNfYnNzZ3BfcmN2bXNnKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoREdQUlMsIExPR0xfRVJST1IsICJTR1NOOiBVbmtub3duIGV2ZW50ICV1IGZyb20gTlNcbiIsIGV2ZW50KTsKKwkJaWYgKG1zZykKKwkJCXRhbGxvY19mcmVlKG1zZyk7CisJCXJjID0gLUVJTzsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKwlmcHJpbnRmKHN0ZG91dCwgInNpZ25hbCAldSByZWNlaXZlZFxuIiwgc2lnbmFsKTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTSUdJTlQ6CisJCWRpc3BhdGNoX3NpZ25hbChTU19HTE9CQUwsIFNfR0xPQkFMX1NIVVRET1dOLCBOVUxMKTsKKwkJc2xlZXAoMSk7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgU0lHQUJSVDoKKwkJLyogaW4gY2FzZSBvZiBhYm9ydCwgd2Ugd2FudCB0byBvYnRhaW4gYSB0YWxsb2MgcmVwb3J0CisJCSAqIGFuZCB0aGVuIHJldHVybiB0byB0aGUgY2FsbGVyLCB3aG8gd2lsbCBhYm9ydCB0aGUgcHJvY2VzcyAqLworCWNhc2UgU0lHVVNSMToKKwkJdGFsbG9jX3JlcG9ydCh0YWxsX3Z0eV9jdHgsIHN0ZGVycik7CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX2JzY19jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWNhc2UgU0lHVVNSMjoKKwkJdGFsbG9jX3JlcG9ydF9mdWxsKHRhbGxfdnR5X2N0eCwgc3RkZXJyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKiBOU0kgdGhhdCBCU1NHUCB1c2VzIHdoZW4gdHJhbnNtaXR0aW5nIG9uIE5TICovCitleHRlcm4gc3RydWN0IGdwcnNfbnNfaW5zdCAqYnNzZ3BfbnNpOworZXh0ZXJuIHZvaWQgKnRhbGxfbXNnYl9jdHg7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgZHVtbXlfbmV0d29yazsKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCWludCByYzsKKworCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAwLCAib3Ntb19zZ3NuIik7CisJdGFsbF9tc2diX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJtc2diIik7CisKKwlzaWduYWwoU0lHSU5ULCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdBQlJULCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdVU1IxLCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdVU1IyLCAmc2lnbmFsX2hhbmRsZXIpOworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKworCXJhdGVfY3RyX2luaXQodGFsbF9ic2NfY3R4KTsKKwl0ZWxuZXRfaW5pdCgmZHVtbXlfbmV0d29yaywgNDI0NSk7CisKKwlzZ3NuX25zaSA9IGdwcnNfbnNfaW5zdGFudGlhdGUoJnNnc25fbnNfY2IpOworCWlmICghc2dzbl9uc2kpIHsKKwkJTE9HUChER1BSUywgTE9HTF9FUlJPUiwgIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBOU1xuIik7CisJCWV4aXQoMSk7CisJfQorCWJzc2dwX25zaSA9IHNnY2ZnLm5zaSA9IHNnc25fbnNpOworCWdwcnNfbnNfdnR5X2luaXQoYnNzZ3BfbnNpKTsKKwkvKiBGSVhNRTogcmVnaXN0ZXIgc2lnbmFsIGhhbmRsZXIgZm9yIFNTX05TICovCisKKwlyYyA9IHNnc25fcGFyc2VfY29uZmlnKGNvbmZpZ19maWxlLCAmc2djZmcpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChER1BSUywgTE9HTF9GQVRBTCwgIkNhbm5vdCBwYXJzZSBjb25maWcgZmlsZVxuIik7CisJCWV4aXQoMik7CisJfQorCisJbnNpcF9saXN0ZW4oc2dzbl9uc2ksIHNnY2ZnLm5zaXBfbGlzdGVuX3BvcnQpOworCisJd2hpbGUgKDEpIHsKKwkJcmMgPSBic2Nfc2VsZWN0X21haW4oMCk7CisJCWlmIChyYyA8IDApCisJCQlleGl0KDMpOworCX0KKworCWV4aXQoMCk7Cit9CisKK3N0cnVjdCBnc21fbmV0d29yazsKK2ludCBic2NfdnR5X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpkdW1teSkKK3sKKwljbWRfaW5pdCgxKTsKKwl2dHlfaW5pdCgpOworCisJb3BlbmJzY192dHlfYWRkX2NtZHMoKTsKKyAgICAgICAgc2dzbl92dHlfaW5pdCgpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fdnR5LmMgYi9vcGVuYnNjL3NyYy9ncHJzL3Nnc25fdnR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxOGZjYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dwcnMvc2dzbl92dHkuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIChDKSAyMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zZ3NuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ncHJzX25zLmg+CisKKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworc3RhdGljIHN0cnVjdCBzZ3NuX2NvbmZpZyAqZ19jZmcgPSBOVUxMOworCitzdGF0aWMgc3RydWN0IGNtZF9ub2RlIHNnc25fbm9kZSA9IHsKKwlTR1NOX05PREUsCisJIiVzKHNnc24pIyIsCisJMSwKK307CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX3Nnc24oc3RydWN0IHZ0eSAqdnR5KQoreworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJdnR5X291dCh2dHksICJzZ3NuJXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoZ19jZmctPm5zaXBfbGlzdGVuX2lwKSB7CisJCWlhLnNfYWRkciA9IGh0b25sKGdfY2ZnLT5uc2lwX2xpc3Rlbl9pcCk7CisJCXZ0eV9vdXQodnR5LCAiICBuc2lwIGxvY2FsIGlwICVzJXMiLCBpbmV0X250b2EoaWEpLAorCQkJVlRZX05FV0xJTkUpOworCX0KKwl2dHlfb3V0KHZ0eSwgIiAgbnNpcCBsb2NhbCBwb3J0ICV1JXMiLCBnX2NmZy0+bnNpcF9saXN0ZW5fcG9ydCwKKwkJVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X3Nnc24sIHNob3dfc2dzbl9jbWQsICJzaG93IHNnc24iLAorICAgICAgU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFNHU04iKQoreworCS8qIEZJWE1FOiBpdGVyYXRlIG92ZXIgbGlzdCBvZiBOUy1WQydzIGFuZCBkaXNwbGF5IHRoZWlyIHN0YXRlICovCisJc3RydWN0IGdwcnNfbnNfaW5zdCAqbnNpID0gZ19jZmctPm5zaTsKKwlzdHJ1Y3QgZ3Byc19uc3ZjICpuc3ZjOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobnN2YywgJm5zaS0+Z3Byc19uc3ZjcywgbGlzdCkgeworCQl2dHlfb3V0KHZ0eSwgIk5TRUkgJTV1LCBOUy1WQyAlNXUsICVzLW1vZGUsICVzICVzJXMiLAorCQkJbnN2Yy0+bnNlaSwgbnN2Yy0+bnN2Y2ksCisJCQluc3ZjLT5yZW1vdGVfZW5kX2lzX3Nnc24gPyAiQlNTIiA6ICJTR1NOIiwKKwkJCW5zdmMtPnN0YXRlICYgTlNFX1NfQUxJVkUgPyAiQUxJVkUiIDogIkRFQUQiLAorCQkJbnN2Yy0+c3RhdGUgJiBOU0VfU19CTE9DS0VEID8gIkJMT0NLRUQiIDogIlVOQkxPQ0tFRCIsCisJCQlWVFlfTkVXTElORSk7CisJCWlmIChuc3ZjLT5uc2ktPmxsID09IEdQUlNfTlNfTExfVURQKQorCQkJdnR5X291dCh2dHksICIgIHJlbW90ZSBwZWVyICVzOiV1JXMiLAorCQkJCWluZXRfbnRvYShuc3ZjLT5pcC5idHNfYWRkci5zaW5fYWRkciksCisJCQkJbnRvaHMobnN2Yy0+aXAuYnRzX2FkZHIuc2luX3BvcnQpLCBWVFlfTkVXTElORSk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfc2dzbiwKKyAgICAgIGNmZ19zZ3NuX2NtZCwKKyAgICAgICJzZ3NuIiwKKyAgICAgICJDb25maWd1cmUgdGhlIFNHU04iKQoreworCXZ0eS0+bm9kZSA9IFNHU05fTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX25zaXBfbG9jYWxfaXAsCisgICAgICBjZmdfbnNpcF9sb2NhbF9pcF9jbWQsCisgICAgICAibnNpcCBsb2NhbCBpcCBBLkIuQy5EIiwKKyAgICAgICJTZXQgdGhlIElQIGFkZHJlc3Mgb24gd2hpY2ggd2UgbGlzdGVuIGZvciBCU1MgY29ubmVjdHMiKQoreworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaW5ldF9hdG9uKGFyZ3ZbMF0sICZpYSk7CisJZ19jZmctPm5zaXBfbGlzdGVuX2lwID0gbnRvaGwoaWEuc19hZGRyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25zaXBfbG9jYWxfcG9ydCwKKyAgICAgIGNmZ19uc2lwX2xvY2FsX3BvcnRfY21kLAorICAgICAgIm5zaXAgbG9jYWwgcG9ydCA8MC02NTUzND4iLAorICAgICAgIlNldCB0aGUgVURQIHBvcnQgb24gd2hpY2ggd2UgbGlzdGVuIGZvciBCU1MgY29ubmVjdHMiKQoreworCXVuc2lnbmVkIGludCBwb3J0ID0gYXRvaShhcmd2WzBdKTsKKworCWdfY2ZnLT5uc2lwX2xpc3Rlbl9wb3J0ID0gcG9ydDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworCisKK2ludCBzZ3NuX3Z0eV9pbml0KHZvaWQpCit7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfc2dzbl9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmY2ZnX3Nnc25fY21kKTsKKwlpbnN0YWxsX25vZGUoJnNnc25fbm9kZSwgY29uZmlnX3dyaXRlX3Nnc24pOworCWluc3RhbGxfZGVmYXVsdChTR1NOX05PREUpOworCWluc3RhbGxfZWxlbWVudChTR1NOX05PREUsICZjZmdfbnNpcF9sb2NhbF9pcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChTR1NOX05PREUsICZjZmdfbnNpcF9sb2NhbF9wb3J0X2NtZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNnc25fcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3Qgc2dzbl9jb25maWcgKmNmZykKK3sKKwlpbnQgcmM7CisKKwlnX2NmZyA9IGNmZzsKKwlyYyA9IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbmZpZ19maWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIHRoZSBjb25maWcgZmlsZTogJyVzJ1xuIiwgY29uZmlnX2ZpbGUpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfMDguYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTU1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDguYwpAQCAtMCwwICsxLDI5MzYgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+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+ZGF0YTsKKwkJCWlmIChuZXQtPm1uY2NfcmVjdikKKwkJCQluZXQtPm1uY2NfcmVjdihuZXQsIG1uY2MtPm1zZ190eXBlLCBtbmNjKTsKKwkJCXdvcmsgPSAxOyAvKiB3b3JrIGRvbmUgKi8KKwkJCXRhbGxvY19mcmVlKG1zZyk7CisJCX0KKworCXJldHVybiB3b3JrOworfQorCisvKgorICogVGhpcyB3aWxsIGJlIHJhbiBieSB0aGUgbGlua2VyIHdoZW4gbG9hZGluZyB0aGUgRFNPLiBXZSB1c2UgaXQgdG8KKyAqIGRvIHN5c3RlbSBpbml0aWFsaXphdGlvbiwgZS5nLiByZWdpc3RyYXRpb24gb2Ygc2lnbmFsIGhhbmRsZXJzLgorICovCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkXzA0MDgodm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19MQ0hBTiwgZ3NtMDQwOF9oYW5kbGVfbGNoYW5fc2lnbmFsLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19BQklTSVAsIGhhbmRsZV9hYmlzaXBfc2lnbmFsLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV8wNF8wOF91dGlscy5jIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4X3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzZWQyNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOF91dGlscy5jCkBAIC0wLDAgKzEsNTc1IEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAKKyAqIHV0aWxpdHkgZnVuY3Rpb25zCisgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCisvKiBzaG91bGQgaXAuYWNjZXNzIEJUUyB1c2UgZGlyZWN0IFJUUCBzdHJlYW1zIGJldHdlZW4gZWFjaCBvdGhlciAoMSksCisgKiBvciBzaG91bGQgT3BlbkJTQyBhbHdheXMgYWN0IGFzIFJUUCByZWxheS9wcm94eSBpbiBiZXR3ZWVuICgwKSA/ICovCitpbnQgaXBhY2NfcnRwX2RpcmVjdCA9IDE7CisKK2ludCBnc200OF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnLT5kYXRhOworCisJLyogaWYgd2UgZ2V0IHBhc3NlZCBhIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSwgZG8gc29tZSBjb21tb24KKwkgKiB3b3JrIHRoYXQgdGhlIGNhbGxlciBubyBsb25nZXIgaGFzIHRvIGRvICovCisJaWYgKHRyYW5zKSB7CisJCWdoLT5wcm90b19kaXNjciA9IHRyYW5zLT5wcm90b2NvbCB8ICh0cmFucy0+dHJhbnNhY3Rpb25faWQgPDwgNCk7CisJCW1zZy0+bGNoYW4gPSB0cmFucy0+Y29ubi0+bGNoYW47CisJfQorCisJaWYgKG1zZy0+bGNoYW4pIHsKKwkJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCisJCWlmICgoZ2gtPnByb3RvX2Rpc2NyICYgR1NNNDhfUERJU0NfTUFTSykgPT0gR1NNNDhfUERJU0NfQ0MpCisJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJTAyeCkgIgorCQkJCSJTZW5kaW5nICclcycgdG8gTVMuXG4iLCBtc2ctPnRyeC0+YnRzLT5uciwKKwkJCQltc2ctPnRyeC0+bnIsIG1zZy0+bGNoYW4tPnRzLT5uciwKKwkJCQlnaC0+cHJvdG9fZGlzY3IgJiAweGYwLAorCQkJCWdzbTQ4X2NjX21zZ19uYW1lKGdoLT5tc2dfdHlwZSkpOworCQllbHNlCisJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgcGQgJTAyeCkgIgorCQkJCSJTZW5kaW5nIDB4JTAyeCB0byBNUy5cbiIsIG1zZy0+dHJ4LT5idHMtPm5yLAorCQkJCW1zZy0+dHJ4LT5uciwgbXNnLT5sY2hhbi0+dHMtPm5yLAorCQkJCWdoLT5wcm90b19kaXNjciwgZ2gtPm1zZ190eXBlKTsKKwl9CisKKwltc2ctPmwzaCA9IG1zZy0+ZGF0YTsKKworCXJldHVybiByc2xfZGF0YV9yZXF1ZXN0KG1zZywgMCk7Cit9CisKKy8qIFNlY3Rpb24gOS4xLjggLyBUYWJsZSA5LjkgKi8KK3N0cnVjdCBjaHJlcSB7CisJdV9pbnQ4X3QgdmFsOworCXVfaW50OF90IG1hc2s7CisJZW51bSBjaHJlcV90eXBlIHR5cGU7Cit9OworCisvKiBJZiBTWVNURU0gSU5GT1JNQVRJT04gVFlQRSA0IE5FQ0kgYml0ID09IDEgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hyZXEgY2hyZXFfdHlwZV9uZWNpMVtdID0geworCXsgMHhhMCwgMHhlMCwgQ0hSRVFfVF9FTUVSR19DQUxMIH0sCisJeyAweGMwLCAweGUwLCBDSFJFUV9UX0NBTExfUkVFU1RfVENIX0YgfSwKKwl7IDB4NjgsIDB4ZmMsIENIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSCB9LAorCXsgMHg2YywgMHhmYywgQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IX0RCTCB9LAorCXsgMHhlMCwgMHhlMCwgQ0hSRVFfVF9TRENDSCB9LAorCXsgMHg0MCwgMHhmMCwgQ0hSRVFfVF9WT0lDRV9DQUxMX1RDSF9IIH0sCisJeyAweDUwLCAweGYwLCBDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSCB9LAorCXsgMHgwMCwgMHhmMCwgQ0hSRVFfVF9MT0NBVElPTl9VUEQgfSwKKwl7IDB4MTAsIDB4ZjAsIENIUkVRX1RfU0RDQ0ggfSwKKwl7IDB4ODAsIDB4ZTAsIENIUkVRX1RfUEFHX1JfQU5ZX05FQ0kxIH0sCisJeyAweDIwLCAweGYwLCBDSFJFUV9UX1BBR19SX1RDSF9GIH0sCisJeyAweDMwLCAweGYwLCBDSFJFUV9UX1BBR19SX1RDSF9GSCB9LAorCXsgMHg2NywgMHhmZiwgQ0hSRVFfVF9MTVUgfSwKKwl7IDB4NjAsIDB4ZjksIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4NjEsIDB4ZmIsIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4NjMsCTB4ZmYsIENIUkVRX1RfUkVTRVJWRURfU0RDQ0ggfSwKKwl7IDB4N2YsIDB4ZmYsIENIUkVRX1RfUkVTRVJWRURfSUdOT1JFIH0sCit9OworCisvKiBJZiBTWVNURU0gSU5GT1JNQVRJT04gVFlQRSA0IE5FQ0kgYml0ID09IDAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hyZXEgY2hyZXFfdHlwZV9uZWNpMFtdID0geworCXsgMHhhMCwgMHhlMCwgQ0hSRVFfVF9FTUVSR19DQUxMIH0sCisJeyAweGMwLCAweGUwLCBDSFJFUV9UX0NBTExfUkVFU1RfVENIX0ggfSwKKwl7IDB4ZTAsIDB4ZTAsIENIUkVRX1RfVENIX0YgfSwKKwl7IDB4NTAsIDB4ZjAsIENIUkVRX1RfREFUQV9DQUxMX1RDSF9IIH0sCisJeyAweDAwLCAweGUwLCBDSFJFUV9UX0xPQ0FUSU9OX1VQRCB9LAorCXsgMHg4MCwgMHhlMCwgQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTAgfSwKKwl7IDB4MjAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0YgfSwKKwl7IDB4MzAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0ZIIH0sCisJeyAweDY3LCAweGZmLCBDSFJFUV9UX0xNVSB9LAorCXsgMHg2MCwgMHhmOSwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MSwgMHhmYiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MywJMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg3ZiwgMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkUgfSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGdzbV9jaGFuX3QgY3R5cGVfYnlfY2hyZXFbXSA9IHsKKwlbQ0hSRVFfVF9FTUVSR19DQUxMXQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfRl0JPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSF9EQkxdCT0gR1NNX0xDSEFOX1RDSF9ILAorCVtDSFJFUV9UX1NEQ0NIXQkJCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1RDSF9GXQkJCT0gR1NNX0xDSEFOX1RDSF9GLAorCVtDSFJFUV9UX1ZPSUNFX0NBTExfVENIX0hdCT0gR1NNX0xDSEFOX1RDSF9ILAorCVtDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfTE9DQVRJT05fVVBEXQkJPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfUEFHX1JfQU5ZX05FQ0kxXQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTBdCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1BBR19SX1RDSF9GXQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZIXQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfTE1VXQkJCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIXQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkVdCT0gR1NNX0xDSEFOX1VOS05PV04sCit9OworCitzdGF0aWMgY29uc3QgZW51bSBnc21fY2hyZXFfcmVhc29uX3QgcmVhc29uX2J5X2NocmVxW10gPSB7CisJW0NIUkVRX1RfRU1FUkdfQ0FMTF0JCT0gR1NNX0NIUkVRX1JFQVNPTl9FTUVSRywKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9GXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IX0RCTF0JPSBHU01fQ0hSRVFfUkVBU09OX0NBTEwsCisJW0NIUkVRX1RfU0RDQ0hdCQkJPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1RDSF9GXQkJCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9WT0lDRV9DQUxMX1RDSF9IXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9EQVRBX0NBTExfVENIX0hdCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9MT0NBVElPTl9VUERdCQk9IEdTTV9DSFJFUV9SRUFTT05fTE9DQVRJT05fVVBELAorCVtDSFJFUV9UX1BBR19SX0FOWV9ORUNJMV0JPSBHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlbQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTBdCT0gR1NNX0NIUkVRX1JFQVNPTl9QQUcsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZdCQk9IEdTTV9DSFJFUV9SRUFTT05fUEFHLAorCVtDSFJFUV9UX1BBR19SX1RDSF9GSF0JCT0gR1NNX0NIUkVRX1JFQVNPTl9QQUcsCisJW0NIUkVRX1RfTE1VXQkJCT0gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKKwlbQ0hSRVFfVF9SRVNFUlZFRF9TRENDSF0JPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1JFU0VSVkVEX0lHTk9SRV0JPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorfTsKKworZW51bSBnc21fY2hhbl90IGdldF9jdHlwZV9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpCit7CisJaW50IGk7CisJaW50IGxlbmd0aDsKKwljb25zdCBzdHJ1Y3QgY2hyZXEgKmNocmVxOworCisJaWYgKG5lY2kpIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kxOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTEpOworCX0gZWxzZSB7CisJCWNocmVxID0gY2hyZXFfdHlwZV9uZWNpMDsKKwkJbGVuZ3RoID0gQVJSQVlfU0laRShjaHJlcV90eXBlX25lY2kwKTsKKwl9CisKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgY2hyZXEgKmNociA9ICZjaHJlcVtpXTsKKwkJaWYgKChyYSAmIGNoci0+bWFzaykgPT0gY2hyLT52YWwpCisJCQlyZXR1cm4gY3R5cGVfYnlfY2hyZXFbY2hyLT50eXBlXTsKKwl9CisJTE9HUChEUlIsIExPR0xfRVJST1IsICJVbmtub3duIENIQU5ORUwgUkVRVUVTVCBSUUQgMHglMDJ4XG4iLCByYSk7CisJcmV0dXJuIEdTTV9MQ0hBTl9TRENDSDsKK30KKworZW51bSBnc21fY2hyZXFfcmVhc29uX3QgZ2V0X3JlYXNvbl9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpCit7CisJaW50IGk7CisJaW50IGxlbmd0aDsKKwljb25zdCBzdHJ1Y3QgY2hyZXEgKmNocmVxOworCisJaWYgKG5lY2kpIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kxOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTEpOworCX0gZWxzZSB7CisJCWNocmVxID0gY2hyZXFfdHlwZV9uZWNpMDsKKwkJbGVuZ3RoID0gQVJSQVlfU0laRShjaHJlcV90eXBlX25lY2kwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGNocmVxICpjaHIgPSAmY2hyZXFbaV07CisJCWlmICgocmEgJiBjaHItPm1hc2spID09IGNoci0+dmFsKQorCQkJcmV0dXJuIHJlYXNvbl9ieV9jaHJlcVtjaHItPnR5cGVdOworCX0KKwlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIlVua25vd24gQ0hBTk5FTCBSRVFVRVNUIFJFQVNPTiAweCUwMnhcbiIsIHJhKTsKKwlyZXR1cm4gR1NNX0NIUkVRX1JFQVNPTl9PVEhFUjsKK30KKworLyogNy4xLjcgYW5kIDkuMS43OiBSUiBDSEFObmVsIFJFTGVhc2UgKi8KK2ludCBnc200OF9zZW5kX3JyX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXVfaW50OF90ICpjYXVzZTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9DSEFOX1JFTDsKKworCWNhdXNlID0gbXNnYl9wdXQobXNnLCAxKTsKKwljYXVzZVswXSA9IEdTTTQ4X1JSX0NBVVNFX05PUk1BTDsKKworCURFQlVHUChEUlIsICJTZW5kaW5nIENoYW5uZWwgUmVsZWFzZTogQ2hhbjogTnVtYmVyOiAlZCBUeXBlOiAlZFxuIiwKKwkJbGNoYW4tPm5yLCBsY2hhbi0+dHlwZSk7CisKKwkvKiBTZW5kIGFjdHVhbCByZWxlYXNlIHJlcXVlc3QgdG8gTVMgKi8KKwlnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7CisJLyogRklYTUU6IFN0YXJ0IFRpbWVyIFQzMTA5ICovCisKKwkvKiBEZWFjdGl2YXRlIHRoZSBTQUNDSCBvbiB0aGUgQlRTIHNpZGUgKi8KKwlyZXR1cm4gcnNsX2RlYWN0X3NhY2NoKGxjaGFuKTsKK30KKworaW50IHNlbmRfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJICAgICAgIHVfaW50OF90ICpjbGFzc21hcmsyX2x2KQoreworCXN0cnVjdCByc2xfbXJwY2kgbXJwY2k7CisKKwlpZiAoY2xhc3NtYXJrMl9sdlswXSA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJbXJwY2kucG93ZXJfY2xhc3MgPSBjbGFzc21hcmsyX2x2WzFdICYgMHg3OworCW1ycGNpLnZnY3NfY2FwYWJsZSA9IGNsYXNzbWFyazJfbHZbMl0gJiAoMSA8PCAxKTsKKwltcnBjaS52YnNfY2FwYWJsZSA9IGNsYXNzbWFyazJfbHZbMl0gJiAoMSA8PDIpOworCW1ycGNpLmdzbV9waGFzZSA9IChjbGFzc21hcmsyX2x2WzFdKSA+PiA1ICYgMHgzOworCisJcmV0dXJuIHJzbF9zaWVtZW5zX21ycGNpKGxjaGFuLCAmbXJwY2kpOworfQorCitpbnQgZ3NtNDhfcGFnaW5nX2V4dHJhY3RfbWkoc3RydWN0IG1zZ2IgKm1zZywgY2hhciAqbWlfc3RyaW5nLCB1X2ludDhfdCAqbWlfdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMl9sdiA9IGdoLT5kYXRhICsgMTsKKwl1X2ludDhfdCAqbWlfbHYgPSBnaC0+ZGF0YSArIDIgKyAqY2xhc3NtYXJrMl9sdjsKKwkqbWlfdHlwZSA9IG1pX2x2WzFdICYgR1NNX01JX1RZUEVfTUFTSzsKKworCXJldHVybiBnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBHU000OF9NSV9TSVpFLCBtaV9sdisxLCAqbWlfbHYpOworfQorCitpbnQgZ3NtNDhfaGFuZGxlX3BhZ2luZ19yZXNwKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYgPSBnaC0+ZGF0YSArIDE7CisJc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSBzaWdfZGF0YTsKKworCWlmIChpc19zaWVtZW5zX2J0cyhidHMpKQorCQlzZW5kX3NpZW1lbnNfbXJwY2kobXNnLT5sY2hhbiwgY2xhc3NtYXJrMl9sdik7CisKKwlpZiAoIW1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyKSB7CisJCW1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyID0gc3Vic2NyOworCX0gZWxzZSBpZiAobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgIT0gc3Vic2NyKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiPC0gQ2hhbm5lbCBhbHJlYWR5IG93bmVkIGJ5IHNvbWVvbmUgZWxzZT9cbiIpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCURFQlVHUChEUlIsICI8LSBDaGFubmVsIGFscmVhZHkgb3duZWQgYnkgdXNcbiIpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXN1YnNjciA9IG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyOworCX0KKworCXNpZ19kYXRhLnN1YnNjciA9IHN1YnNjcjsKKwlzaWdfZGF0YS5idHMJPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc2lnX2RhdGEubGNoYW4JPSBtc2ctPmxjaGFuOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5wYWdpbmcuY29tcGxldGVkKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19QQUdJTkcsIFNfUEFHSU5HX1NVQ0NFRURFRCwgJnNpZ19kYXRhKTsKKworCS8qIFN0b3AgcGFnaW5nIG9uIHRoZSBidHMgd2UgcmVjZWl2ZWQgdGhlIHBhZ2luZyByZXNwb25zZSAqLworCXBhZ2luZ19yZXF1ZXN0X3N0b3AobXNnLT50cngtPmJ0cywgc3Vic2NyLCBtc2ctPmxjaGFuKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA5LjEuOTogQ2lwaGVyaW5nIE1vZGUgQ29tbWFuZCAqLworaW50IGdzbTQ4X3NlbmRfcnJfY2lwaF9tb2RlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgd2FudF9pbWVpc3YpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwl1X2ludDhfdCBjaXBoX21vZF9zZXQ7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlERUJVR1AoRFJSLCAiVFggQ0lQSEVSSU5HIE1PREUgQ01EXG4iKTsKKworCWlmIChsY2hhbi0+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+aW52b2tlX2lkKTsKKworCS8qIFdyYXAgdGhpcyB1cCBhcyBhIFJlamVjdCBjb21wb25lbnQgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTTA0ODBfQ1RZUEVfUkVKRUNUKTsKKworCS8qIFdyYXAgdGhlIGNvbXBvbmVudCBpbiBhIEZhY2lsaXR5IG1lc3NhZ2UgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTTA0ODBfSUVfRkFDSUxJVFkpOworCisJLyogQW5kIGZpbmFsbHkgcHJlLXBlbmQgdGhlIEwzIGhlYWRlciAqLworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX05DX1NTOworCWdoLT5wcm90b19kaXNjciB8PSByZXEtPnRyYW5zYWN0aW9uX2lkIHwgKDE8PDcpOyAgLyogVEkgZGlyZWN0aW9uID0gMSAqLworCWdoLT5tc2dfdHlwZSA9IEdTTTA0ODBfTVRZUEVfUkVMRUFTRV9DT01QTEVURTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fZGF0YS5jIGIvb3BlbmJzYy9zcmMvZ3NtX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGIzMjEyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtX2RhdGEuYwpAQCAtMCwwICsxLDU0MCBAQAorLyogKEMpIDIwMDgtMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zdGF0aXN0aWNzLmg+CisKK3ZvaWQgKnRhbGxfYnNjX2N0eDsKKworc3RhdGljIExMSVNUX0hFQUQoYnRzX21vZGVscyk7CisKK3ZvaWQgc2V0X3RzX2UxbGluayhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBlMV9uciwKKwkJICAgdV9pbnQ4X3QgZTFfdHMsIHVfaW50OF90IGUxX3RzX3NzKQoreworCXRzLT5lMV9saW5rLmUxX25yID0gZTFfbnI7CisJdHMtPmUxX2xpbmsuZTFfdHMgPSBlMV90czsKKwl0cy0+ZTFfbGluay5lMV90c19zcyA9IGUxX3RzX3NzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBwY2hhbl9uYW1lc1tdID0geworCXsgR1NNX1BDSEFOX05PTkUsCSJOT05FIiB9LAorCXsgR1NNX1BDSEFOX0NDQ0gsCSJDQ0NIIiB9LAorCXsgR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0LCJDQ0NIK1NEQ0NINCIgfSwKKwl7IEdTTV9QQ0hBTl9UQ0hfRiwJIlRDSC9GIiB9LAorCXsgR1NNX1BDSEFOX1RDSF9ILAkiVENIL0giIH0sCisJeyBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEMsICJTRENDSDgiIH0sCisJeyBHU01fUENIQU5fUERDSCwJIlBEQ0giIH0sCisJeyBHU01fUENIQU5fVENIX0ZfUERDSCwJIlRDSC9GX1BEQ0giIH0sCisJeyBHU01fUENIQU5fVU5LTk9XTiwJIlVOS05PV04iIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqZ3NtX3BjaGFuX25hbWUoZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBjKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKHBjaGFuX25hbWVzLCBjKTsKK30KKworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBnc21fcGNoYW5fcGFyc2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gZ2V0X3N0cmluZ192YWx1ZShwY2hhbl9uYW1lcywgbmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGxjaGFudF9uYW1lc1tdID0geworCXsgR1NNX0xDSEFOX05PTkUsCSJOT05FIiB9LAorCXsgR1NNX0xDSEFOX1NEQ0NILAkiU0RDQ0giIH0sCisJeyBHU01fTENIQU5fVENIX0YsCSJUQ0gvRiIgfSwKKwl7IEdTTV9MQ0hBTl9UQ0hfSCwJIlRDSC9IIiB9LAorCXsgR1NNX0xDSEFOX1VOS05PV04sCSJVTktOT1dOIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKmdzbV9sY2hhbnRfbmFtZShlbnVtIGdzbV9jaGFuX3QgYykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhsY2hhbnRfbmFtZXMsIGMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBsY2hhbl9zX25hbWVzW10gPSB7CisJeyBMQ0hBTl9TX05PTkUsCQkiTk9ORSIgfSwKKwl7IExDSEFOX1NfQUNUX1JFUSwJIkFDVElWQVRJT04gUkVRVUVTVEVEIiB9LAorCXsgTENIQU5fU19BQ1RJVkUsCSJBQ1RJVkUiIH0sCisJeyBMQ0hBTl9TX0lOQUNUSVZFLAkiSU5BQ1RJVkUiIH0sCisJeyBMQ0hBTl9TX1JFTF9SRVEsCSJSRUxFQVNFIFJFUVVFU1RFRCIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpnc21fbGNoYW5zX25hbWUoZW51bSBnc21fbGNoYW5fc3RhdGUgcykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhsY2hhbl9zX25hbWVzLCBzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgY2hyZXFfbmFtZXNbXSA9IHsKKwl7IEdTTV9DSFJFUV9SRUFTT05fRU1FUkcsCSJFTUVSR0VOQ1kiIH0sCisJeyBHU01fQ0hSRVFfUkVBU09OX1BBRywJCSJQQUdJTkciIH0sCisJeyBHU01fQ0hSRVFfUkVBU09OX0NBTEwsCSJDQUxMIiB9LAorCXsgR1NNX0NIUkVRX1JFQVNPTl9MT0NBVElPTl9VUEQsIkxPQ0FUSU9OX1VQREFURSIgfSwKKwl7IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCSJPVEhFUiIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqZ3NtX2NocmVxX25hbWUoZW51bSBnc21fY2hyZXFfcmVhc29uX3QgYykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhjaHJlcV9uYW1lcywgYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqYnRzX21vZGVsX2ZpbmQoZW51bSBnc21fYnRzX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqbW9kZWw7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlbCwgJmJ0c19tb2RlbHMsIGxpc3QpIHsKKwkJaWYgKG1vZGVsLT50eXBlID09IHR5cGUpCisJCQlyZXR1cm4gbW9kZWw7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBnc21fYnRzX21vZGVsX3JlZ2lzdGVyKHN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbCkKK3sKKwlpZiAoYnRzX21vZGVsX2ZpbmQobW9kZWwtPnR5cGUpKQorCQlyZXR1cm4gLUVFWElTVDsKKworCXRsdl9kZWZfcGF0Y2goJm1vZGVsLT5ubV9hdHRfdGx2ZGVmLCAmbm1fYXR0X3RsdmRlZik7CisJbGxpc3RfYWRkX3RhaWwoJm1vZGVsLT5saXN0LCAmYnRzX21vZGVscyk7CisJcmV0dXJuIDA7Cit9CisKKworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdGFsbG9jX3plcm8oYnRzLCBzdHJ1Y3QgZ3NtX2J0c190cngpOworCWludCBrOworCisJaWYgKCF0cngpCisJCXJldHVybiBOVUxMOworCisJdHJ4LT5idHMgPSBidHM7CisJdHJ4LT5uciA9IGJ0cy0+bnVtX3RyeCsrOworCXRyeC0+bm1fc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSBOTV9TVEFURV9VTkxPQ0tFRDsKKworCWZvciAoayA9IDA7IGsgPCBUUlhfTlJfVFM7IGsrKykgeworCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNba107CisJCWludCBsOworCQkKKwkJdHMtPnRyeCA9IHRyeDsKKwkJdHMtPm5yID0gazsKKwkJdHMtPnBjaGFuID0gR1NNX1BDSEFOX05PTkU7CisKKwkJZm9yIChsID0gMDsgbCA8IFRTX01BWF9MQ0hBTjsgbCsrKSB7CisJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwkJCWxjaGFuID0gJnRzLT5sY2hhbltsXTsKKworCQkJbGNoYW4tPnRzID0gdHM7CisJCQlsY2hhbi0+bnIgPSBsOworCQkJbGNoYW4tPnR5cGUgPSBHU01fTENIQU5fTk9ORTsKKwkJfQorCX0KKworCWlmICh0cngtPm5yICE9IDApCisJCXRyeC0+bm9taW5hbF9wb3dlciA9IGJ0cy0+YzAtPm5vbWluYWxfcG93ZXI7CisKKwlsbGlzdF9hZGRfdGFpbCgmdHJ4LT5saXN0LCAmYnRzLT50cnhfbGlzdCk7CisKKwlyZXR1cm4gdHJ4OworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCBidHNfbnNlX3RpbWVyX2RlZmF1bHRbXSA9IHsgMywgMywgMywgMywgMzAsIDMsIDEwIH07CitzdGF0aWMgY29uc3QgdWludDhfdCBidHNfY2VsbF90aW1lcl9kZWZhdWx0W10gPQorCQkJCXsgMywgMywgMywgMywgMywgMTAsIDMsIDEwLCAzLCAxMCwgMyB9OworCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19hbGxvYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgZW51bSBnc21fYnRzX3R5cGUgdHlwZSwKKwkJCSAgICAgIHVfaW50OF90IHRzYywgdV9pbnQ4X3QgYnNpYykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdGFsbG9jX3plcm8obmV0LCBzdHJ1Y3QgZ3NtX2J0cyk7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsID0gYnRzX21vZGVsX2ZpbmQodHlwZSk7CisJaW50IGk7CisKKwlpZiAoIWJ0cykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIW1vZGVsICYmIHR5cGUgIT0gR1NNX0JUU19UWVBFX1VOS05PV04pIHsKKwkJdGFsbG9jX2ZyZWUoYnRzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYnRzLT5uZXR3b3JrID0gbmV0OworCWJ0cy0+bnIgPSBuZXQtPm51bV9idHMrKzsKKwlidHMtPnR5cGUgPSB0eXBlOworCWJ0cy0+bW9kZWwgPSBtb2RlbDsKKwlidHMtPnRzYyA9IHRzYzsKKwlidHMtPmJzaWMgPSBic2ljOworCWJ0cy0+bnVtX3RyeCA9IDA7CisJSU5JVF9MTElTVF9IRUFEKCZidHMtPnRyeF9saXN0KTsKKwlidHMtPm1zX21heF9wb3dlciA9IDE1OwkvKiBkQm0gKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0ID0gMjsgLyogNCBkQiAqLworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5yeGxldl9hY2NfbWluID0gMDsKKwlidHMtPnNpX2NvbW1vbi5uZWlnaF9saXN0LmRhdGEgPSBidHMtPnNpX2NvbW1vbi5kYXRhLm5laWdoX2xpc3Q7CisJYnRzLT5zaV9jb21tb24ubmVpZ2hfbGlzdC5kYXRhX2xlbiA9CisJCQkJc2l6ZW9mKGJ0cy0+c2lfY29tbW9uLmRhdGEubmVpZ2hfbGlzdCk7CisJYnRzLT5zaV9jb21tb24uY2VsbF9hbGxvYy5kYXRhID0gYnRzLT5zaV9jb21tb24uZGF0YS5jZWxsX2FsbG9jOworCWJ0cy0+c2lfY29tbW9uLmNlbGxfYWxsb2MuZGF0YV9sZW4gPQorCQkJCXNpemVvZihidHMtPnNpX2NvbW1vbi5kYXRhLmNlbGxfYWxsb2MpOworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5yZSA9IDE7IC8qIG5vIHJlLWVzdGFibGlzaG1lbnQgKi8KKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudHhfaW50ZWdlciA9IDk7ICAvKiAxMiBzbG90cyBzcHJlYWQgLSAyMTcvMTE1IHNsb3RzIGRlbGF5ICovCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyA9IDM7IC8qIDcgcmV0cmFuc21pc3Npb25zICovCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnQyID0gNDsgLyogbm8gZW1lcmdlbmN5IGNhbGxzICovCisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidHMtPmdwcnMubnN2Yyk7IGkrKykgeworCQlidHMtPmdwcnMubnN2Y1tpXS5idHMgPSBidHM7CisJCWJ0cy0+Z3Bycy5uc3ZjW2ldLmlkID0gaTsKKwl9CisJbWVtY3B5KCZidHMtPmdwcnMubnNlLnRpbWVyLCBidHNfbnNlX3RpbWVyX2RlZmF1bHQsCisJCXNpemVvZihidHMtPmdwcnMubnNlLnRpbWVyKSk7CisJbWVtY3B5KCZidHMtPmdwcnMuY2VsbC50aW1lciwgYnRzX2NlbGxfdGltZXJfZGVmYXVsdCwKKwkJc2l6ZW9mKGJ0cy0+Z3Bycy5jZWxsLnRpbWVyKSk7CisKKwkvKiBjcmVhdGUgb3VyIHByaW1hcnkgVFJYICovCisJYnRzLT5jMCA9IGdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisJaWYgKCFidHMtPmMwKSB7CisJCXRhbGxvY19mcmVlKGJ0cyk7CisJCXJldHVybiBOVUxMOworCX0KKwlidHMtPmMwLT50c1swXS5wY2hhbiA9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINDsKKworCWJ0cy0+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+bnVtX2J0czsgaSsrKSB7CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgaSk7CisKKwkJaWYgKHNraXApIHsKKwkJCWlmIChzdGFydF9idHMgPT0gYnRzKQorCQkJCXNraXAgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobGFjID09IEdTTV9MQUNfUkVTRVJWRURfQUxMX0JUUyB8fCBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSA9PSBsYWMpCisJCQlyZXR1cm4gYnRzOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgYXV0aF9wb2xpY3lfbmFtZXNbXSA9IHsKKwl7IEdTTV9BVVRIX1BPTElDWV9DTE9TRUQsCSJjbG9zZWQiIH0sCisJeyBHU01fQVVUSF9QT0xJQ1lfQUNDRVBUX0FMTCwJImFjY2VwdC1hbGwiIH0sCisJeyBHU01fQVVUSF9QT0xJQ1lfVE9LRU4sCSJ0b2tlbiIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworZW51bSBnc21fYXV0aF9wb2xpY3kgZ3NtX2F1dGhfcG9saWN5X3BhcnNlKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlyZXR1cm4gZ2V0X3N0cmluZ192YWx1ZShhdXRoX3BvbGljeV9uYW1lcywgYXJnKTsKK30KKworY29uc3QgY2hhciAqZ3NtX2F1dGhfcG9saWN5X25hbWUoZW51bSBnc21fYXV0aF9wb2xpY3kgcG9saWN5KQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGF1dGhfcG9saWN5X25hbWVzLCBwb2xpY3kpOworfQorCit2b2lkIGdwcnNfcmFfaWRfYnlfYnRzKHN0cnVjdCBncHJzX3JhX2lkICpyYWlkLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXJhaWQtPm1jYyA9IGJ0cy0+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+cnhfYWN0aW9uKSB7CisJY2FzZSBSVFBfUFJPWFk6CisJCW90aGVyX3JzID0gb2xkX3JzLT5wcm94eS5vdGhlcl9zb2NrOworCQlydHBfc29ja2V0X3Byb3h5KG5ld19ycywgb3RoZXJfcnMpOworCQkvKiBkZWxldGUgcmVmZXJlbmNlIHRvIG90aGVyIGVuZCBzb2NrZXQgdG8gcHJldmVudAorCQkgKiBydHBfc29ja2V0X2ZyZWUoKSBmcm9tIHJlbW92aW5nIHRoZSBpbnZlcnNlIHJlZmVyZW5jZSAqLworCQlvbGRfcnMtPnByb3h5Lm90aGVyX3NvY2sgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFJUUF9SRUNWX1VQU1RSRUFNOgorCQluZXdfcnMtPnJlY2VpdmUgPSBvbGRfcnMtPnJlY2VpdmU7CisJCWJyZWFrOworCWNhc2UgUlRQX05PTkU6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhvX2xvZ2ljX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCXN3aXRjaCAoc3Vic3lzKSB7CisJY2FzZSBTU19MQ0hBTjoKKwkJbGNoYW4gPSBzaWduYWxfZGF0YTsKKwkJc3dpdGNoIChzaWduYWwpIHsKKwkJY2FzZSBTX0xDSEFOX0FDVElWQVRFX0FDSzoKKwkJCXJldHVybiBob19jaGFuX2FjdGl2X2FjayhsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9BQ1RJVkFURV9OQUNLOgorCQkJcmV0dXJuIGhvX2NoYW5fYWN0aXZfbmFjayhsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9ERVRFQ1Q6CisJCQlyZXR1cm4gaG9fcnNsX2RldGVjdChsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9DT01QTDoKKwkJCXJldHVybiBob19nc200OF9ob19jb21wbChsY2hhbik7CisJCWNhc2UgU19MQ0hBTl9IQU5ET1ZFUl9GQUlMOgorCQkJcmV0dXJuIGhvX2dzbTQ4X2hvX2ZhaWwobGNoYW4pOworCQl9CisJCWJyZWFrOworCWNhc2UgU1NfQUJJU0lQOgorCQlsY2hhbiA9IHNpZ25hbF9kYXRhOworCQlzd2l0Y2ggKHNpZ25hbCkgeworCQljYXNlIFNfQUJJU0lQX0NSQ1hfQUNLOgorCQkJcmV0dXJuIGhvX2lwYWNfY3JjeF9hY2sobGNoYW4pOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfaG9fbG9naWModm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19MQ0hBTiwgaG9fbG9naWNfc2lnX2NiLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19BQklTSVAsIGhvX2xvZ2ljX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pbnB1dC9pcGFjY2Vzcy5jIGIvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjFjYWRkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYwpAQCAtMCwwICsxLDc3OCBAQAorLyogT3BlbkJTQyBBYmlzIGlucHV0IGRyaXZlciBmb3IgaXAuYWNjZXNzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+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+dHlwZSA9PSBFMUlOUF9UU19UWVBFX1NJR04pIHsKKwkJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJCXJjID0gaGFuZGxlX3RzMV9yZWFkKGJmZCk7CisJCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQkJcmMgPSBoYW5kbGVfdHMxX3dyaXRlKGJmZCk7CisJfSBlbHNlCisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInVua25vd24gRTEgVFMgdHlwZSAldVxuIiwgZTFpX3RzLT50eXBlKTsKKworCXJldHVybiByYzsKK30KKworc3RydWN0IGUxaW5wX2RyaXZlciBpcGFjY2Vzc19kcml2ZXIgPSB7CisJLm5hbWUgPSAiaXAuYWNjZXNzIiwKKwkud2FudF93cml0ZSA9IHRzX3dhbnRfd3JpdGUsCit9OworCisvKiBjYWxsYmFjayBvZiB0aGUgT01MIGxpc3RlbmluZyBmaWxlZGVzY3JpcHRvciAqLworc3RhdGljIGludCBsaXN0ZW5fZmRfY2Ioc3RydWN0IGJzY19mZCAqbGlzdGVuX2JmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJldDsKKwlpbnQgaWR4ID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCXNvY2tsZW5fdCBzYV9sZW4gPSBzaXplb2Yoc2EpOworCisJaWYgKCEod2hhdCAmIEJTQ19GRF9SRUFEKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBhY2NlcHQobGlzdGVuX2JmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhLCAmc2FfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoImFjY2VwdCIpOworCQlyZXR1cm4gcmV0OworCX0KKwlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAiYWNjZXB0KCllZCBuZXcgT01MIGxpbmsgZnJvbSAlc1xuIiwKKwkJaW5ldF9udG9hKHNhLnNpbl9hZGRyKSk7CisKKwlsaW5lID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZTFpbnBfbGluZSk7CisJaWYgKCFsaW5lKSB7CisJCWNsb3NlKHJldCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlsaW5lLT5kcml2ZXIgPSAmaXBhY2Nlc3NfZHJpdmVyOworCS8vbGluZS0+ZHJpdmVyX2RhdGEgPSBlMWg7CisJLyogY3JlYXRlIHZpcnJ0dWFsIEUxIHRpbWVzbG90cyBmb3Igc2lnbmFsbGluZyAqLworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbMS0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKworCS8qIGluaXRpYWxpemUgdGhlIGZkcyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxpbmUtPnRzKTsgKytpKQorCQlsaW5lLT50c1tpXS5kcml2ZXIuaXBhY2Nlc3MuZmQuZmQgPSAtMTsKKworCWUxaV90cyA9ICZsaW5lLT50c1tpZHhdOworCisJYmZkID0gJmUxaV90cy0+ZHJpdmVyLmlwYWNjZXNzLmZkOworCWJmZC0+ZmQgPSByZXQ7CisJYmZkLT5kYXRhID0gbGluZTsKKwliZmQtPnByaXZfbnIgPSBQUklWX09NTDsKKwliZmQtPmNiID0gaXBhY2Nlc3NfZmRfY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEXG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGxpbmUpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFJlcXVlc3QgSUQuIEZJWE1FOiByZXF1ZXN0IExPQ0FUSU9OLCBIVy9TVyBWRXJzaW9uLCBVbml0IE5hbWUsIFNlcm5vICovCisJcmV0ID0gaXBhY2Nlc3Nfc2VuZF9pZF9yZXEoYmZkLT5mZCk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKwkvL3JldHVybiBlMWlucF9saW5lX3JlZ2lzdGVyKGxpbmUpOworfQorCitzdGF0aWMgaW50IHJzbF9saXN0ZW5fZmRfY2Ioc3RydWN0IGJzY19mZCAqbGlzdGVuX2JmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCXNvY2tsZW5fdCBzYV9sZW4gPSBzaXplb2Yoc2EpOworCXN0cnVjdCBic2NfZmQgKmJmZDsKKwlpbnQgcmV0OworCisJaWYgKCEod2hhdCAmIEJTQ19GRF9SRUFEKSkKKwkJcmV0dXJuIDA7CisKKwliZmQgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBic2NfZmQpOworCWlmICghYmZkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFNvbWUgQlRTIGhhcyBjb25uZWN0ZWQgdG8gdXMsIGJ1dCB3ZSBkb24ndCBrbm93IHlldCB3aGljaCBsaW5lCisJICogKGFzIGNyZWF0ZWQgYnkgdGhlIE9NTCBsaW5rKSB0byBhc3NvY2lhdGUgaXQgd2l0aC4gIFRodXMsIHdlCisJICogYWxsb2NhdGUgYSB0ZW1wb3JhcnkgYmZkIHVudGlsIHdlIGhhdmUgcmVjZWl2ZWQgSUQgZnJvbSBCVFMgKi8KKworCWJmZC0+ZmQgPSBhY2NlcHQobGlzdGVuX2JmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhLCAmc2FfbGVuKTsKKwlpZiAoYmZkLT5mZCA8IDApIHsKKwkJcGVycm9yKCJhY2NlcHQiKTsKKwkJcmV0dXJuIGJmZC0+ZmQ7CisJfQorCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICJhY2NlcHQoKWVkIG5ldyBSU0wgbGluayBmcm9tICVzXG4iLCBpbmV0X250b2Eoc2Euc2luX2FkZHIpKTsKKwliZmQtPnByaXZfbnIgPSBQUklWX1JTTDsKKwliZmQtPmNiID0gaXBhY2Nlc3NfZmRfY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEXG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGJmZCk7CisJCXJldHVybiByZXQ7CisJfQorCS8qIFJlcXVlc3QgSUQuIEZJWE1FOiByZXF1ZXN0IExPQ0FUSU9OLCBIVy9TVyBWRXJzaW9uLCBVbml0IE5hbWUsIFNlcm5vICovCisJcmV0ID0gd3JpdGUoYmZkLT5mZCwgaWRfcmVxLCBzaXplb2YoaWRfcmVxKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQWN0aXZlbHkgY29ubmVjdCB0byBhIEJUUy4gIEN1cnJlbnRseSB1c2VkIGJ5IGlwYWNjZXNzLWNvbmZpZy5jICovCitpbnQgaXBhY2Nlc3NfY29ubmVjdChzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgc3RydWN0IHNvY2thZGRyX2luICpzYSkKK3sKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1swXTsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSAmZTFpX3RzLT5kcml2ZXIuaXBhY2Nlc3MuZmQ7CisJaW50IHJldCwgb24gPSAxOworCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRCB8IEJTQ19GRF9XUklURTsKKwliZmQtPmRhdGEgPSBsaW5lOworCWJmZC0+cHJpdl9uciA9IFBSSVZfT01MOworCisJaWYgKGJmZC0+ZmQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBjcmVhdGUgVENQIHNvY2tldC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzZXRzb2Nrb3B0KGJmZC0+ZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKworCXJldCA9IGNvbm5lY3QoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSBzYSwgc2l6ZW9mKCpzYSkpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBjb25uZWN0IHNvY2tldFxuIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwkKKwlsaW5lLT5kcml2ZXIgPSAmaXBhY2Nlc3NfZHJpdmVyOworCisgICAgICAgIHJldHVybiByZXQ7CisJLy9yZXR1cm4gZTFpbnBfbGluZV9yZWdpc3RlcihsaW5lKTsKK30KKworaW50IGlwYWNjZXNzX3NldHVwKHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0KQoreworCWludCByZXQ7CisKKwkvKiByZWdpc3RlciB0aGUgZHJpdmVyIHdpdGggdGhlIGNvcmUgKi8KKwkvKiBGSVhNRTogZG8gdGhpcyBpbiB0aGUgcGx1Z2luIGluaXRpYWxpemVyIGZ1bmN0aW9uICovCisJcmV0ID0gZTFpbnBfZHJpdmVyX3JlZ2lzdGVyKCZpcGFjY2Vzc19kcml2ZXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwllMWggPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBpYV9lMV9oYW5kbGUpOworCWlmICghZTFoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWUxaC0+Z3NtbmV0ID0gZ3NtbmV0OworCisJLyogTGlzdGVuIGZvciBPTUwgY29ubmVjdGlvbnMgKi8KKwlyZXQgPSBtYWtlX3NvY2soJmUxaC0+bGlzdGVuX2ZkLCBJUFBST1RPX1RDUCwgSVBBX1RDUF9QT1JUX09NTCwKKwkJCWxpc3Rlbl9mZF9jYik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBMaXN0ZW4gZm9yIFJTTCBjb25uZWN0aW9ucyAqLworCXJldCA9IG1ha2Vfc29jaygmZTFoLT5yc2xfbGlzdGVuX2ZkLCBJUFBST1RPX1RDUCwKKwkJCUlQQV9UQ1BfUE9SVF9SU0wsIHJzbF9saXN0ZW5fZmRfY2IpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lucHV0L21pc2RuLmMgYi9vcGVuYnNjL3NyYy9pbnB1dC9taXNkbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjAxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pbnB1dC9taXNkbi5jCkBAIC0wLDAgKzEsNTM2IEBACisvKiBPcGVuQlNDIEFiaXMgaW5wdXQgZHJpdmVyIGZvciBtSVNETnVzZXIgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bUlTRE5pZi5oPgorCisvLyNkZWZpbmUgQUZfQ09NUEFUSUJJTElUWV9GVU5DCisvLyNpbmNsdWRlIDxjb21wYXRfYWZfaXNkbi5oPgorI2lmbmRlZiBBRl9JU0ROCisjZGVmaW5lIEFGX0lTRE4gMzQKKyNkZWZpbmUgUEZfSVNETiBBRl9JU0ROCisjZW5kaWYKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNkZWZpbmUgVFMxX0FMTE9DX1NJWkUJMzAwCisKK3N0cnVjdCBwcmltX25hbWUgeworCXVuc2lnbmVkIGludCBwcmltOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitjb25zdCBzdHJ1Y3QgcHJpbV9uYW1lIHByaW1fbmFtZXNbXSA9IHsKKwl7IFBIX0NPTlRST0xfSU5ELCAiUEhfQ09OVFJPTF9JTkQiIH0sCisJeyBQSF9EQVRBX0lORCwgIlBIX0RBVEFfSU5EIiB9LAorCXsgUEhfREFUQV9DTkYsICJQSF9EQVRBX0NORiIgfSwKKwl7IFBIX0FDVElWQVRFX0lORCwgIlBIX0FDVElWQVRFX0lORCIgfSwKKwl7IERMX0VTVEFCTElTSF9JTkQsICJETF9FU1RBQkxJU0hfSU5EIiB9LAorCXsgRExfRVNUQUJMSVNIX0NORiwgIkRMX0VTVEFCTElTSF9DTkYiIH0sCisJeyBETF9SRUxFQVNFX0lORCwgIkRMX1JFTEVBU0VfSU5EIiB9LAorCXsgRExfUkVMRUFTRV9DTkYsICJETF9SRUxFQVNFX0NORiIgfSwKKwl7IERMX0RBVEFfSU5ELCAiRExfREFUQV9JTkQiIH0sCisJeyBETF9VTklUREFUQV9JTkQsICJETF9VTklUREFUQV9JTkQiIH0sCisJeyBETF9JTkZPUk1BVElPTl9JTkQsICJETF9JTkZPUk1BVElPTl9JTkQiIH0sCisJeyBNUEhfQUNUSVZBVEVfSU5ELCAiTVBIX0FDVElWQVRFX0lORCIgfSwKKwl7IE1QSF9ERUFDVElWQVRFX0lORCwgIk1QSF9ERUFDVElWQVRFX0lORCIgfSwKK307CisKK2NvbnN0IGNoYXIgKmdldF9wcmltX25hbWUodW5zaWduZWQgaW50IHByaW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcmltX25hbWVzKTsgaSsrKSB7CisJCWlmIChwcmltX25hbWVzW2ldLnByaW0gPT0gcHJpbSkKKwkJCXJldHVybiBwcmltX25hbWVzW2ldLm5hbWU7CisJfQorCisJcmV0dXJuICJVTktOT1dOIjsKK30KKworc3RhdGljIGludCBoYW5kbGVfdHMxX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFRTMV9BTExPQ19TSVpFLCAibUlTRE4gVFMxIik7CisJc3RydWN0IHNvY2thZGRyX21JU0ROIGwyYWRkcjsKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaDsKKwlzb2NrbGVuX3QgYWxlbjsKKwlpbnQgcmV0OworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKSBtc2ctPmRhdGE7CisKKwlhbGVuID0gc2l6ZW9mKGwyYWRkcik7CisJcmV0ID0gcmVjdmZyb20oYmZkLT5mZCwgbXNnLT5kYXRhLCAzMDAsIDAsCisJCSAgICAgICAoc3RydWN0IHNvY2thZGRyICopICZsMmFkZHIsICZhbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInJlY3Zmcm9tIGVycm9yICAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoYWxlbiAhPSBzaXplb2YobDJhZGRyKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGVycm9yIGxlblxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisKKwlERUJVR1AoRE1JLCAiYWxlbiA9JWQsIGRldiglZCkgY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKVxuIiwKKwkJYWxlbiwgbDJhZGRyLmRldiwgbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKworCURFQlVHUChETUksICI8PSBsZW4gPSAlZCwgcHJpbSgweCV4KSBpZCgweCV4KTogJXNcbiIsCisJCXJldCwgaGgtPnByaW0sIGhoLT5pZCwgZ2V0X3ByaW1fbmFtZShoaC0+cHJpbSkpOworCisJc3dpdGNoIChoaC0+cHJpbSkgeworCWNhc2UgRExfSU5GT1JNQVRJT05fSU5EOgorCQkvKiBtSVNETiB0ZWxscyB1cyB3aGljaCBjaGFubmVsIG51bWJlciBpcyBhbGxvY2F0ZWQgZm9yIHRoaXMKKwkJICogdHVwbGUgb2YgKFNBUEksIFRFSSkuICovCisJCURFQlVHUChETUksICJETF9JTkZPUk1BVElPTl9JTkQ6IHVzZSBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpIGZvciBub3dcbiIsCisJCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayhlMWlfdHMsIGwyYWRkci50ZWksIGwyYWRkci5zYXBpKTsKKwkJaWYgKCFsaW5rKSB7CisJCQlERUJVR1BDKERNSSwgIm1JU0ROIG1lc3NhZ2UgZm9yIHVua25vd24gc2lnbl9saW5rXG4iKTsKKwkJCW1zZ2JfZnJlZShtc2cpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogc2F2ZSB0aGUgY2hhbm5lbCBudW1iZXIgaW4gdGhlIGRyaXZlciBwcml2YXRlIHN0cnVjdCAqLworCQlsaW5rLT5kcml2ZXIubWlzZG4uY2hhbm5lbCA9IGwyYWRkci5jaGFubmVsOworCQlicmVhazsKKwljYXNlIERMX0VTVEFCTElTSF9JTkQ6CisJCURFQlVHUChETUksICJETF9FU1RBQkxJU0hfSU5EOiBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlyZXQgPSBlMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfVVAsIGwyYWRkci50ZWksIGwyYWRkci5zYXBpKTsKKwkJYnJlYWs7CisJY2FzZSBETF9SRUxFQVNFX0lORDoKKwkJREVCVUdQKERNSSwgIkRMX1JFTEVBU0VfSU5EOiBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlyZXQgPSBlMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfRE4sIGwyYWRkci50ZWksIGwyYWRkci5zYXBpKTsKKwkJYnJlYWs7CisJY2FzZSBETF9EQVRBX0lORDoKKwljYXNlIERMX1VOSVREQVRBX0lORDoKKwkJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBNSVNETl9IRUFERVJfTEVOOworCQlERUJVR1AoRE1JLCAiUlg6ICVzXG4iLCBoZXhkdW1wKG1zZ2JfbDIobXNnKSwgcmV0IC0gTUlTRE5fSEVBREVSX0xFTikpOworCQlyZXQgPSBlMWlucF9yeF90cyhlMWlfdHMsIG1zZywgbDJhZGRyLnRlaSwgbDJhZGRyLnNhcGkpOworCQlicmVhazsKKwljYXNlIFBIX0FDVElWQVRFX0lORDoKKwkJREVCVUdQKERNSSwgIlBIX0FDVElWQVRFX0lORDogY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKVxuIiwKKwkJbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKwkJYnJlYWs7CisJY2FzZSBQSF9ERUFDVElWQVRFX0lORDoKKwkJREVCVUdQKERNSSwgIlBIX0RFQUNUSVZBVEVfSU5EOiBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0c193YW50X3dyaXRlKHN0cnVjdCBlMWlucF90cyAqZTFpX3RzKQoreworCS8qIFdlIG5ldmVyIGluY2x1ZGUgdGhlIG1JU0ROIEItQ2hhbm5lbCBGRCBpbnRvIHRoZQorCSAqIHdyaXRlc2V0LCBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgcG9sbCgpIGJhc2VkCisJICogd3JpdGUgZmxvdyBjb250cm9sICovCQkKKwlpZiAoZTFpX3RzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfVFJBVSkKKwkJcmV0dXJuIDA7CisKKwllMWlfdHMtPmRyaXZlci5taXNkbi5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0aW1lb3V0X3RzMV93cml0ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gKHN0cnVjdCBlMWlucF90cyAqKWRhdGE7CisKKwkvKiB0cmlnZ2VyIHdyaXRlIG9mIHRzMSwgZHVlIHRvIHR4IGRlbGF5IHRpbWVyICovCisJdHNfd2FudF93cml0ZShlMWlfdHMpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90czFfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpzaWduX2xpbms7CisJc3RydWN0IHNvY2thZGRyX21JU0ROIHNhOworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IG1JU0ROaGVhZCAqaGg7CisJdV9pbnQ4X3QgKmwyX2RhdGE7CisJaW50IHJldDsKKworCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCisJLyogZ2V0IHRoZSBuZXh0IG1zZyBmb3IgdGhpcyB0aW1lc2xvdCAqLworCW1zZyA9IGUxaW5wX3R4X3RzKGUxaV90cywgJnNpZ25fbGluayk7CisJaWYgKCFtc2cpIHsKKwkJLyogbm8gbWVzc2FnZSBhZnRlciB0eCBkZWxheSB0aW1lciAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlsMl9kYXRhID0gbXNnLT5kYXRhOworCisJLyogcHJlcGVuZCB0aGUgbUlTRE5oZWFkICovCisJaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmhoKSk7CisJaGgtPnByaW0gPSBETF9EQVRBX1JFUTsKKworCURFQlVHUChETUksICJUWCBURUkoJWQpIFNBUEkoJWQpOiAlc1xuIiwgc2lnbl9saW5rLT50ZWksCisJCXNpZ25fbGluay0+c2FwaSwgaGV4ZHVtcChsMl9kYXRhLCBtc2ctPmxlbiAtIE1JU0ROX0hFQURFUl9MRU4pKTsKKworCS8qIGNvbnN0cnVjdCB0aGUgc29ja2FkZHIgKi8KKwlzYS5mYW1pbHkgPSBBRl9JU0ROOworCXNhLnNhcGkgPSBzaWduX2xpbmstPnNhcGk7CisJc2EuZGV2ID0gc2lnbl9saW5rLT50ZWk7CisJc2EuY2hhbm5lbCA9IHNpZ25fbGluay0+ZHJpdmVyLm1pc2RuLmNoYW5uZWw7CisKKwlyZXQgPSBzZW5kdG8oYmZkLT5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbiwgMCwKKwkJICAgICAoc3RydWN0IHNvY2thZGRyICopJnNhLCBzaXplb2Yoc2EpKTsKKwlpZiAocmV0IDwgMCkKKwkJZnByaW50ZihzdGRlcnIsICIlcyBzZW5kdG8gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwltc2diX2ZyZWUobXNnKTsKKworCS8qIHNldCB0eCBkZWxheSB0aW1lciBmb3IgbmV4dCBldmVudCAqLworCWUxaV90cy0+c2lnbi50eF90aW1lci5jYiA9IHRpbWVvdXRfdHMxX3dyaXRlOworCWUxaV90cy0+c2lnbi50eF90aW1lci5kYXRhID0gZTFpX3RzOworCWJzY19zY2hlZHVsZV90aW1lcigmZTFpX3RzLT5zaWduLnR4X3RpbWVyLCAwLCA1MDAwMCk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEJDSEFOX1RYX0dSQU4JMTYwCisvKiB3cml0ZSB0byBhIEIgY2hhbm5lbCBUUyAqLworc3RhdGljIGludCBoYW5kbGVfdHNYX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbdHNfbnItMV07CisJc3RydWN0IG1JU0ROaGVhZCAqaGg7CisJdV9pbnQ4X3QgdHhfYnVmW0JDSEFOX1RYX0dSQU4gKyBzaXplb2YoKmhoKV07CisJc3RydWN0IHN1YmNoX211eCAqbXggPSAmZTFpX3RzLT50cmF1Lm11eDsKKwlpbnQgcmV0OworCisJaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKSB0eF9idWY7CisJaGgtPnByaW0gPSBQSF9EQVRBX1JFUTsKKworCXN1YmNoYW5fbXV4X291dChteCwgdHhfYnVmK3NpemVvZigqaGgpLCBCQ0hBTl9UWF9HUkFOKTsKKworCURFQlVHUChETUlCLCAiQkNIQU4gVFg6ICVzXG4iLAorCQloZXhkdW1wKHR4X2J1ZitzaXplb2YoKmhoKSwgQkNIQU5fVFhfR1JBTikpOworCisJcmV0ID0gc2VuZChiZmQtPmZkLCB0eF9idWYsIHNpemVvZigqaGgpICsgQkNIQU5fVFhfR1JBTiwgMCk7CisJaWYgKHJldCA8IHNpemVvZigqaGgpICsgQkNIQU5fVFhfR1JBTikKKwkJREVCVUdQKERNSUIsICJzZW5kIHJldHVybnMgJWQgaW5zdGVhZCBvZiAlenVcbiIsIHJldCwKKwkJCXNpemVvZigqaGgpICsgQkNIQU5fVFhfR1JBTik7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFRTWF9BTExPQ19TSVpFIDQwOTYKKy8qIEZJWE1FOiByZWFkIGZyb20gYSBCIGNoYW5uZWwgVFMgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3RzWF9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbdHNfbnItMV07CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoVFNYX0FMTE9DX1NJWkUsICJtSVNETiBUU3giKTsKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaDsKKwlpbnQgcmV0OworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKSBtc2ctPmRhdGE7CisKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+ZGF0YSwgVFNYX0FMTE9DX1NJWkUsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAicmVjdmZyb20gZXJyb3IgICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCWlmIChoaC0+cHJpbSAhPSBQSF9DT05UUk9MX0lORCkKKwkJREVCVUdQKERNSUIsICI8PSBCQ0hBTiBsZW4gPSAlZCwgcHJpbSgweCV4KSBpZCgweCV4KTogJXNcbiIsCisJCQlyZXQsIGhoLT5wcmltLCBoaC0+aWQsIGdldF9wcmltX25hbWUoaGgtPnByaW0pKTsKKworCXN3aXRjaCAoaGgtPnByaW0pIHsKKwljYXNlIFBIX0RBVEFfSU5EOgorCQltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIE1JU0ROX0hFQURFUl9MRU47CisJCURFQlVHUChETUlCLCAiQkNIQU4gUlg6ICVzXG4iLAorCQkJaGV4ZHVtcChtc2diX2wyKG1zZyksIHJldCAtIE1JU0ROX0hFQURFUl9MRU4pKTsKKwkJcmV0ID0gZTFpbnBfcnhfdHMoZTFpX3RzLCBtc2csIDAsIDApOworCQlicmVhazsKKwljYXNlIFBIX0FDVElWQVRFX0lORDoKKwljYXNlIFBIX0RBVEFfQ05GOgorCQkvKiBwaHlzaWNhbCBsYXllciBpbmRpY2F0ZXMgdGhhdCBkYXRhIGhhcyBiZWVuIHNlbnQsCisJCSAqIHdlIHRodXMgY2FuIHNlbmQgc29tZSBtb3JlIGRhdGEgKi8KKwkJcmV0ID0gaGFuZGxlX3RzWF93cml0ZShiZmQpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkvKiBGSVhNRTogd2h5IGRvIHdlIGZyZWUgc2lnbmFsbGluZyBtc2dzIGluIHRoZSBjYWxsZXIsIGFuZCB0cmF1IG5vdD8gKi8KKwltc2diX2ZyZWUobXNnKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gc2VsZWN0LmMgaW4gY2FzZSBvbmUgb2YgdGhlIGZkJ3MgY2FuIGJlIHJlYWQvd3JpdHRlbiAqLworc3RhdGljIGludCBtaXNkbl9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gdHNfbnItMTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1tpZHhdOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGUxaV90cy0+dHlwZSkgeworCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQkJcmMgPSBoYW5kbGVfdHMxX3JlYWQoYmZkKTsKKwkJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCQlyYyA9IGhhbmRsZV90czFfd3JpdGUoYmZkKTsKKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCQlyYyA9IGhhbmRsZV90c1hfcmVhZChiZmQpOworCQkvKiBXZSBuZXZlciBpbmNsdWRlIHRoZSBtSVNETiBCLUNoYW5uZWwgRkQgaW50byB0aGUKKwkJICogd3JpdGVzZXQsIHNpbmNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBwb2xsKCkgYmFzZWQKKwkJICogd3JpdGUgZmxvdyBjb250cm9sICovCQkKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJ1bmtub3duIEUxIFRTIHR5cGUgJXVcbiIsIGUxaV90cy0+dHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhY3RpdmF0ZV9iY2hhbihzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgaW50IHRzLCBpbnQgYWN0KQoreworCXN0cnVjdCBtSVNETmhlYWQgaGg7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gdHMtMTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1tpZHhdOworCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZlMWlfdHMtPmRyaXZlci5taXNkbi5mZDsKKworCWZwcmludGYoc3Rkb3V0LCAiYWN0aXZhdGUgYmNoYW5cbiIpOworCWlmIChhY3QpCisJCWhoLnByaW0gPSBQSF9BQ1RJVkFURV9SRVE7CisJZWxzZQorCQloaC5wcmltID0gUEhfREVBQ1RJVkFURV9SRVE7CisKKwloaC5pZCA9IE1JU0ROX0lEX0FOWTsKKwlyZXQgPSBzZW5kdG8oYmZkLT5mZCwgJmhoLCBzaXplb2YoaGgpLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZG91dCwgImNvdWxkIG5vdCBzZW5kIEFDVElWQVRFX1JRICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgZTFpbnBfZHJpdmVyIG1pc2RuX2RyaXZlciA9IHsKKwkubmFtZSA9ICJtSVNETnVzZXIiLAorCS53YW50X3dyaXRlID0gdHNfd2FudF93cml0ZSwKK307CisKK3N0YXRpYyBpbnQgbWlfZTFfc2V0dXAoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIGludCByZWxlYXNlX2wyKQoreworCWludCB0cywgcmV0OworCisJLyogVFMwIGlzIENSQzQsIGRvbid0IG5lZWQgYW55IGZkIGZvciBpdCAqLworCWZvciAodHMgPSAxOyB0cyA8IE5VTV9FMV9UUzsgdHMrKykgeworCQl1bnNpZ25lZCBpbnQgaWR4ID0gdHMtMTsKKwkJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKwkJc3RydWN0IGJzY19mZCAqYmZkID0gJmUxaV90cy0+ZHJpdmVyLm1pc2RuLmZkOworCQlzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4gYWRkcjsKKworCQliZmQtPmRhdGEgPSBsaW5lOworCQliZmQtPnByaXZfbnIgPSB0czsKKwkJYmZkLT5jYiA9IG1pc2RuX2ZkX2NiOworCisJCXN3aXRjaCAoZTFpX3RzLT50eXBlKSB7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9OT05FOgorCQkJY29udGludWU7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCQliZmQtPmZkID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfREdSQU0sIElTRE5fUF9MQVBEX05UKTsKKwkJCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQkJYmZkLT5mZCA9IHNvY2tldChQRl9JU0ROLCBTT0NLX0RHUkFNLCBJU0ROX1BfQl9SQVcpOworCQkJLyogV2UgbmV2ZXIgaW5jbHVkZSB0aGUgbUlTRE4gQi1DaGFubmVsIEZEIGludG8gdGhlCisJIAkJKiB3cml0ZXNldCwgc2luY2UgaXQgZG9lc24ndCBzdXBwb3J0IHBvbGwoKSBiYXNlZAorCSAJCSogd3JpdGUgZmxvdyBjb250cm9sICovCQkKKwkJCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoYmZkLT5mZCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMgY291bGQgbm90IG9wZW4gc29ja2V0ICVzXG4iLAorCQkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIGJmZC0+ZmQ7CisJCX0KKworCQltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJCWFkZHIuZmFtaWx5ID0gQUZfSVNETjsKKwkJYWRkci5kZXYgPSBsaW5lLT5udW07CisJCXN3aXRjaCAoZTFpX3RzLT50eXBlKSB7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQkJYWRkci5jaGFubmVsID0gMDsKKwkJCS8qIFNBUEkgbm90IHN1cHBvcnRlZCB5ZXQgaW4ga2VybmVsICovCisJCQkvL2FkZHIuc2FwaSA9IGUxaW5wX3RzLT5zaWduLnNhcGk7CisJCQlhZGRyLnNhcGkgPSAwOworCQkJYWRkci50ZWkgPSBHUk9VUF9URUk7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCQlhZGRyLmNoYW5uZWwgPSB0czsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREVCVUdQKERNSSwgInVuc3VwcG9ydGVkIEUxIFRTIHR5cGU6ICV1XG4iLAorCQkJCWUxaV90cy0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IGJpbmQoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGJpbmQgbDIgc29ja2V0ICVzXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmIChlMWlfdHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9TSUdOKSB7CisJCQlyZXQgPSBpb2N0bChiZmQtPmZkLCBJTUNMRUFSX0wyLCAmcmVsZWFzZV9sMik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IHNlbmQgSU9DVEwgSU1DTEVBTl9MMiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfQorCisJCS8qIEZJWE1FOiBvbmx5IGFjdGl2YXRlIEItQ2hhbm5lbHMgb25jZSB3ZSBzdGFydCB0bworCQkgKiB1c2UgdGhlbSB0byBjb25zZXJ2ZSBDUFUgcG93ZXIgKi8KKwkJaWYgKGUxaV90cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX1RSQVUpCisJCQlhY3RpdmF0ZV9iY2hhbihsaW5lLCB0cywgMSk7CisKKwkJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCByZWdpc3RlciBGRDogJXNcbiIsCisJCQkJc3RyZXJyb3IocmV0KSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtaV9lMV9saW5lX3VwZGF0ZShzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSkKK3sKKwlzdHJ1Y3QgbUlTRE5fZGV2aW5mbyBkZXZpbmZvOworCWludCBzaywgcmV0LCBjbnQ7CisKKwlpZiAoIWxpbmUtPmRyaXZlcikgeworCQkvKiB0aGlzIG11c3QgYmUgdGhlIGZpcnN0IHVwZGF0ZSAqLworCQlsaW5lLT5kcml2ZXIgPSAmbWlzZG5fZHJpdmVyOworCX0gZWxzZSB7CisJCS8qIHRoaXMgaXMgYSBzdWJzZXF1ZW50IHVwZGF0ZSAqLworCQkvKiBGSVhNRTogZmlyc3QgY2xvc2UgYWxsIHNvY2tldHMgKi8KKwkJZnByaW50ZihzdGRlcnIsICJpbmNyZW1lbnRhbCBsaW5lIHVwZGF0ZXMgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobGluZS0+ZHJpdmVyICE9ICZtaXNkbl9kcml2ZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogb3BlbiB0aGUgSVNETiBjYXJkIGRldmljZSAqLworCXNrID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfUkFXLCBJU0ROX1BfQkFTRSk7CisJaWYgKHNrIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGNvdWxkIG5vdCBvcGVuIHNvY2tldCAlc1xuIiwKKwkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gc2s7CisJfQorCisJcmV0ID0gaW9jdGwoc2ssIElNR0VUQ09VTlQsICZjbnQpOworCWlmIChyZXQpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlcyBlcnJvciBnZXR0aW5nIGludGVyZiBjb3VudDogJXNcbiIsCisJCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2Uoc2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLy9ERUJVR1AoRE1JLCIlZCBkZXZpY2UlcyBmb3VuZFxuIiwgY250LCAoY250PT0xKT8iIjoicyIpOworCXByaW50ZigiJWQgZGV2aWNlJXMgZm91bmRcbiIsIGNudCwgKGNudD09MSk/IiI6InMiKTsKKyNpZiAxCisJZGV2aW5mby5pZCA9IGxpbmUtPm51bTsKKwlyZXQgPSBpb2N0bChzaywgSU1HRVRERVZJTkZPLCAmZGV2aW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRvdXQsICJlcnJvciBnZXR0aW5nIGluZm8gZm9yIGRldmljZSAlZDogJXNcbiIsCisJCQlsaW5lLT5udW0sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgaWQ6ICAgICAgICAgICAgICVkXG4iLCBkZXZpbmZvLmlkKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgRHByb3RvY29sczogICAgICUwOHhcbiIsIGRldmluZm8uRHByb3RvY29scyk7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIEJwcm90b2NvbHM6ICAgICAlMDh4XG4iLCBkZXZpbmZvLkJwcm90b2NvbHMpOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBwcm90b2NvbDogICAgICAgJWRcbiIsIGRldmluZm8ucHJvdG9jb2wpOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBucmJjaGFuOiAgICAgICAgJWRcbiIsIGRldmluZm8ubnJiY2hhbik7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIG5hbWU6ICAgICAgICAgICAlc1xuIiwgZGV2aW5mby5uYW1lKTsKKyNlbmRpZgorCisJaWYgKCEoZGV2aW5mby5EcHJvdG9jb2xzICYgKDEgPDwgSVNETl9QX05UX0UxKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogY2FyZCBpcyBub3Qgb2YgdHlwZSBFMSAoTlQtbW9kZSlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBtaV9lMV9zZXR1cChsaW5lLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfc21zKHZvaWQpCit7CisJLyogcmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIHRoZSBjb3JlICovCisJZTFpbnBfZHJpdmVyX3JlZ2lzdGVyKCZtaXNkbl9kcml2ZXIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzM5MzIxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMyBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUgLUkkKHRvcF9idWlsZGRpcikKK0FNX0NGTEFHUz0tV2FsbCAkKExJQk9TTU9DT1JFX0NGTEFHUykKK0FNX0xERkxBR1MgPSAkKExJQk9TTU9DT1JFX0xJQlMpCisKK3NiaW5fUFJPR1JBTVMgPSBpcGFjY2Vzcy1maW5kIGlwYWNjZXNzLWNvbmZpZyBpcGFjY2Vzcy1wcm94eQorCitpcGFjY2Vzc19maW5kX1NPVVJDRVMgPSBpcGFjY2Vzcy1maW5kLmMKKworaXBhY2Nlc3NfY29uZmlnX1NPVVJDRVMgPSBpcGFjY2Vzcy1jb25maWcuYyBpcGFjY2Vzcy1maXJtd2FyZS5jCitpcGFjY2Vzc19jb25maWdfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGlibXNjLmEgXAorCQkJJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYnZ0eS5hIC1sZGwgLWxkYmkgJChMSUJDUllQVCkKKworaXBhY2Nlc3NfcHJveHlfU09VUkNFUyA9IGlwYWNjZXNzLXByb3h5LmMgLi4vZGVidWcuYwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtY29uZmlnLmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjdlNTFmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtY29uZmlnLmMKQEAgLTAsMCArMSw3NDMgQEAKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIGNvbmZpZ3VyYXRpb24gdG9vbCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDksMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICogKEMpIDIwMDksMjAxMCBieSBPbiBXYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldDsKKworc3RhdGljIGludCBuZXRfbGlzdGVuX3Rlc3RucjsKK3N0YXRpYyBpbnQgcmVzdGFydDsKK3N0YXRpYyBjaGFyICpwcmltX29tbF9pcDsKK3N0YXRpYyBjaGFyICp1bml0X2lkOworc3RhdGljIHVfaW50MTZfdCBudl9mbGFnczsKK3N0YXRpYyB1X2ludDE2X3QgbnZfbWFzazsKK3N0YXRpYyBjaGFyICpzb2Z0d2FyZSA9IE5VTEw7CitzdGF0aWMgaW50IHN3X2xvYWRfc3RhdGUgPSAwOworc3RhdGljIGludCBvbWxfc3RhdGUgPSAwOworc3RhdGljIGludCBkdW1wX2ZpbGVzID0gMDsKK3N0YXRpYyBjaGFyICpmaXJtd2FyZV9hbmFseXNpcyA9IE5VTEw7CitzdGF0aWMgaW50IGZvdW5kX3RyeCA9IDA7CisKK3N0cnVjdCBzd19sb2FkIHsKKwl1X2ludDhfdCBmaWxlX2lkWzI1NV07CisJdV9pbnQ4X3QgZmlsZV9pZF9sZW47CisKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25bMjU1XTsKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25fbGVuOworfTsKKworc3RhdGljIHZvaWQgKnRhbGxfY3R4X2NvbmZpZyA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHN3X2xvYWQgKnN3X2xvYWQxID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgc3dfbG9hZCAqc3dfbG9hZDIgPSBOVUxMOworCisvKgorc3RhdGljIHVfaW50OF90IHByaW1fb21sX2F0dHJbXSA9IHsgMHg5NSwgMHgwMCwgNywgMHg4OCwgMTkyLCAxNjgsIDEwMCwgMTEsIDB4MDAsIDB4MDAgfTsKK3N0YXRpYyB1X2ludDhfdCB1bml0X2lkX2F0dHJbXSA9IHsgMHg5MSwgMHgwMCwgOSwgJzInLCAnMycsICc0JywgJzInLCAnLycgLCAnMCcsICcvJywgJzAnLCAweDAwIH07CisqLworCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIE5BQ0sgb24gdGhlIE9NTCBOTQorICoKKyAqIEN1cnJlbnRseSB3ZSBzZW5kIHRoZSBjb25maWcgcmVxdWVzdHMgYnV0IGRvbid0IGNoZWNrIHRoZQorICogcmVzdWx0LiBUaGUgbmFub0JUUyB3aWxsIHNlbmQgdXMgYSBOQUNLIHdoZW4gd2UgZGlkIHNvbWV0aGluZyB0aGUKKyAqIEJUUyBkaWRuJ3QgbGlrZS4KKyAqLworc3RhdGljIGludCBpcGFjY19tc2dfbmFjayh1X2ludDhfdCBtdCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIkZhaWx1cmUgdG8gc2V0IGF0dHJpYnV0ZS4gVGhpcyBzZWVtcyBmYXRhbFxuIik7CisJZXhpdCgtMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3Jlc3RhcnRfb3JfZXhpdChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlpZiAocmVzdGFydCkgeworCQlhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQodHJ4KTsKKwl9IGVsc2UgeworCQlleGl0KDApOworCX0KK30KKworc3RhdGljIGludCBpcGFjY19tc2dfYWNrKHVfaW50OF90IG10LCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlpZiAoc3dfbG9hZF9zdGF0ZSA9PSAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlIG5ldyBzb2Z0d2FyZSBpcyBhY3RpdmFlZC5cbiIpOworCQljaGVja19yZXN0YXJ0X29yX2V4aXQodHJ4KTsKKwl9IGVsc2UgaWYgKG9tbF9zdGF0ZSA9PSAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiU2V0IHRoZSBwcmltYXJ5IE9NTCBJUC5cbiIpOworCQljaGVja19yZXN0YXJ0X29yX2V4aXQodHJ4KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlwYWNjX2ZlcnJfZWxlbSB7CisJaW50MTZfdCBmcmVxX2VycjsKKwl1X2ludDhfdCBmcmVxX3F1YWw7CisJdV9pbnQ4X3QgYXJmY247Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaXBhY2NfY3VzYWdlX2VsZW0geworCXVfaW50MTZfdCBhcmZjbjoxMCwKKwkJICByeGxldjo2OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBpbnQgdGVzdF9yZXAodm9pZCAqX21zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gX21zZzsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQxNl90IHRlc3RfcmVwX2xlbiwgZmVycl9saXN0X2xlbjsKKwlzdHJ1Y3QgaXBhY2NfZmVycl9lbGVtICppZmU7CisJc3RydWN0IGlwYWNfYmNjaF9pbmZvIGJpbmZvOworCWludCBpLCByYzsKKworCURFQlVHUChETk0sICJURVNUIFJFUE9SVDogIik7CisKKwlpZiAoZm9oLT5kYXRhWzBdICE9IE5NX0FUVF9URVNUX05PIHx8CisJICAgIGZvaC0+ZGF0YVsyXSAhPSBOTV9BVFRfVEVTVF9SRVBPUlQpCisJCXJldHVybiAtRUlOVkFMOworCisJREVCVUdQQyhETk0sICJ0ZXN0X25vPTB4JTAyeCAiLCBmb2gtPmRhdGFbMV0pOworCS8qIGRhdGFbMl0gPT0gTk1fQVRUX1RFU1RfUkVQT1JUICovCisJLyogZGF0YVszLi40XTogdGVzdF9yZXBfbGVuICovCisJdGVzdF9yZXBfbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKikgJmZvaC0+ZGF0YVszXSk7CisJLyogZGF0YVs1XTogaXAuYWNjZXNzIHRlc3QgcmVzdWx0ICovCisJREVCVUdQQyhETk0sICJ0ZXN0X3Jlcz0lc1xuIiwgaXBhY2NfdGVzdHJlc19uYW1lKGZvaC0+ZGF0YVs1XSkpOworCisJLyogZGF0YVs2XTogaXAuYWNjZXNzIG5lc3RlZCBJRS4gMyA9PSBmcmVxX2Vycl9saXN0ICovCisJc3dpdGNoIChmb2gtPmRhdGFbNl0pIHsKKwljYXNlIE5NX0lQQUNfRUlFX0ZSRVFfRVJSX0xJU1Q6CisJCS8qIGRhdGFbNy4uOF06IGxlbmd0aCBvZiBmZXJyX2xpc3QgKi8KKwkJZmVycl9saXN0X2xlbiA9IG50b2hzKCoodV9pbnQxNl90ICopICZmb2gtPmRhdGFbN10pOworCisJCS8qIGRhdGFbOS4uLl06IGZyZXF1ZW5jeSBlcnJvciBsaXN0IGVsZW1lbnRzICovCisJCWZvciAoaSA9IDA7IGkgPCBmZXJyX2xpc3RfbGVuOyBpKz0gc2l6ZW9mKCppZmUpKSB7CisJCQlpZmUgPSAoc3RydWN0IGlwYWNjX2ZlcnJfZWxlbSAqKSAoZm9oLT5kYXRhICsgOSArIGkpOworCQkJREVCVUdQKEROTSwgIj09PiBBUkZDTiAlNHUsIEZyZXF1ZW5jeSBFcnJvciAlNmhkXG4iLAorCQkJaWZlLT5hcmZjbiwgbnRvaHMoaWZlLT5mcmVxX2VycikpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fSVBBQ19FSUVfQ0hBTl9VU0VfTElTVDoKKwkJLyogZGF0YVs3Li44XTogbGVuZ3RoIG9mIGZlcnJfbGlzdCAqLworCQlmZXJyX2xpc3RfbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKikgJmZvaC0+ZGF0YVs3XSk7CisKKwkJLyogZGF0YVs5Li4uXTogY2hhbm5lbCB1c2FnZSBsaXN0IGVsZW1lbnRzICovCisJCWZvciAoaSA9IDA7IGkgPCBmZXJyX2xpc3RfbGVuOyBpKz0gMikgeworCQkJdV9pbnQxNl90ICpjdV9wdHIgPSAodV9pbnQxNl90ICopKGZvaC0+ZGF0YSArIDkgKyBpKTsKKwkJCXVfaW50MTZfdCBjdSA9IG50b2hzKCpjdV9wdHIpOworCQkJREVCVUdQKEROTSwgIj09PiBBUkZDTiAlNHUsIFJ4TGV2ICUydVxuIiwKKwkJCQljdSAmIDB4M2ZmLCBjdSA+PiAxMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9JUEFDX0VJRV9CQ0NIX0lORk9fVFlQRToKKwkJYnJlYWs7CisJY2FzZSBOTV9JUEFDX0VJRV9CQ0NIX0lORk86CisJCXJjID0gaXBhY19wYXJzZV9iY2NoX2luZm8oJmJpbmZvLCBmb2gtPmRhdGErNik7CisJCWlmIChyYyA8IDApIHsKKwkJCURFQlVHUChETk0sICJCQ0NIIEluZm8gcGFyc2luZyBmYWlsZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJREVCVUdQKEROTSwgIj09PiBBUkZDTiAldSwgUnhMZXYgJTJ1LCBSeFF1YWwgJTJ1OiAlM2QtJWQsIExBQyAlZCBDSSAlZFxuIiwKKwkJCWJpbmZvLmFyZmNuLCBiaW5mby5yeF9sZXYsIGJpbmZvLnJ4X3F1YWwsCisJCQliaW5mby5jZ2kubWNjLCBiaW5mby5jZ2kubW5jLAorCQkJYmluZm8uY2dpLmxhYywgYmluZm8uY2dpLmNpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbm1fc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCSAgICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgaXBhY2NfYWNrX3NpZ25hbF9kYXRhICppcGFjY19kYXRhOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfTk1fSVBBQ0NfTkFDSzoKKwkJaXBhY2NfZGF0YSA9IHNpZ25hbF9kYXRhOworCQlyZXR1cm4gaXBhY2NfbXNnX25hY2soaXBhY2NfZGF0YS0+bXNnX3R5cGUpOworCWNhc2UgU19OTV9JUEFDQ19BQ0s6CisJCWlwYWNjX2RhdGEgPSBzaWduYWxfZGF0YTsKKwkJcmV0dXJuIGlwYWNjX21zZ19hY2soaXBhY2NfZGF0YS0+bXNnX3R5cGUsIGlwYWNjX2RhdGEtPnRyeCk7CisJY2FzZSBTX05NX1RFU1RfUkVQOgorCQlyZXR1cm4gdGVzdF9yZXAoc2lnbmFsX2RhdGEpOworCWNhc2UgU19OTV9JUEFDQ19SRVNUQVJUX0FDSzoKKwkJcHJpbnRmKCJUaGUgQlRTIGhhcyBhY2tlZCB0aGUgcmVzdGFydC4gRXhpdGluZy5cbiIpOworCQlleGl0KDApOworCQlicmVhazsKKwljYXNlIFNfTk1fSVBBQ0NfUkVTVEFSVF9OQUNLOgorCQlwcmludGYoIlRoZSBCVFMgaGFzIG5hY2tlZCB0aGUgcmVzdGFydC4gRXhpdGluZy5cbiIpOworCQlleGl0KDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGJhY2sgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBBQklTIE9NTCBjb2RlICovCitzdGF0aWMgaW50IHBlcmNlbnQ7CitzdGF0aWMgaW50IHBlcmNlbnRfb2xkOworc3RhdGljIGludCBzd2xvYWRfY2Jmbih1bnNpZ25lZCBpbnQgaG9vaywgdW5zaWduZWQgaW50IGV2ZW50LCBzdHJ1Y3QgbXNnYiAqX21zZywKKwkJICAgICAgIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlpZiAoaG9vayAhPSBHU01fSE9PS19OTV9TV0xPQUQpCisJCXJldHVybiAwOworCisJdHJ4ID0gKHN0cnVjdCBnc21fYnRzX3RyeCAqKSBkYXRhOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTk1fTVRfTE9BRF9JTklUX0FDSzoKKwkJZnByaW50ZihzdGRvdXQsICJTb2Z0d2FyZSBMb2FkIEluaXRpYXRlIEFDS1xuIik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9JTklUX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IFNvZnR3YXJlIExvYWQgSW5pdGlhdGUgTkFDS1xuIik7CisJCWV4aXQoNSk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9FTkRfQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkxPQUQgRU5EIEFDSy4uLiIpOworCQkvKiBub3cgbWFrZSBpdCB0aGUgZGVmYXVsdCAqLworCQlzd19sb2FkX3N0YXRlID0gMTsKKworCQltc2cgPSBtc2diX2FsbG9jKDEwMjQsICJzdzogbnZhdHRyIik7CisJCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCAzKTsKKwkJbXNnLT5sM2ggPSAmbXNnLT5sMmhbM107CisKKwkJLyogYWN0aXZhdGUgc29mdHdhcmUgKi8KKwkJaWYgKHN3X2xvYWQxKSB7CisJCQltc2diX3ZfcHV0KG1zZywgTk1fQVRUX1NXX0RFU0NSKTsKKwkJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfSUQsIHN3X2xvYWQxLT5maWxlX2lkX2xlbiwgc3dfbG9hZDEtPmZpbGVfaWQpOworCQkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9WRVJTSU9OLCBzd19sb2FkMS0+ZmlsZV92ZXJzaW9uX2xlbiwKKwkJCQkJc3dfbG9hZDEtPmZpbGVfdmVyc2lvbik7CisJCX0KKworCQlpZiAoc3dfbG9hZDIpIHsKKwkJCW1zZ2Jfdl9wdXQobXNnLCBOTV9BVFRfU1dfREVTQ1IpOworCQkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3dfbG9hZDItPmZpbGVfaWRfbGVuLCBzd19sb2FkMi0+ZmlsZV9pZCk7CisJCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3X2xvYWQyLT5maWxlX3ZlcnNpb25fbGVuLAorCQkJCQlzd19sb2FkMi0+ZmlsZV92ZXJzaW9uKTsKKwkJfQorCisJCS8qIGZpbGwgaW4gdGhlIGRhdGEgKi8KKwkJbXNnLT5sMmhbMF0gPSBOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGRzsKKwkJbXNnLT5sMmhbMV0gPSBtc2diX2wzbGVuKG1zZykgPj4gODsKKwkJbXNnLT5sMmhbMl0gPSBtc2diX2wzbGVuKG1zZykgJiAweGZmOworCQlwcmludGYoIkZvbyBsMmg6ICVwIGwzaDogJXAuLi4gbGVuZ3RoIGwyOiAldSAgbDM6ICV1XG4iLCBtc2ctPmwyaCwgbXNnLT5sM2gsIG1zZ2JfbDJsZW4obXNnKSwgbXNnYl9sM2xlbihtc2cpKTsKKwkJYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKHRyeCwgbXNnLT5sMmgsIG1zZ2JfbDJsZW4obXNnKSk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IFNvZnR3YXJlIExvYWQgRW5kIE5BQ0tcbiIpOworCQlleGl0KDMpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IEFjdGl2YXRlIFNvZnR3YXJlIE5BQ0tcbiIpOworCQlleGl0KDQpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX0FDSzoKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX1NFR19BQ0s6CisJCXBlcmNlbnQgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWRfc3RhdHVzKHRyeC0+YnRzKTsKKwkJaWYgKHBlcmNlbnQgPiBwZXJjZW50X29sZCkKKwkJCXByaW50ZigiU29mdHdhcmUgRG93bmxvYWQgUHJvZ3Jlc3M6ICVkJSVcbiIsIHBlcmNlbnQpOworCQlwZXJjZW50X29sZCA9IHBlcmNlbnQ7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9BQk9SVDoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogTG9hZCBhYm9ydGVkIGJ5IHRoZSBCVFMuXG4iKTsKKwkJZXhpdCg2KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBib290c3RyYXBfb20oc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJaW50IGxlbjsKKwlzdGF0aWMgdV9pbnQ4X3QgYnVmWzEwMjRdOworCXVfaW50OF90ICpjdXIgPSBidWY7CisKKwlwcmludGYoIk9NTCBsaW5rIGVzdGFibGlzaGVkIHVzaW5nIFRSWCAlZFxuIiwgdHJ4LT5ucik7CisKKwlpZiAodW5pdF9pZCkgeworCQlsZW4gPSBzdHJsZW4odW5pdF9pZCk7CisJCWlmIChsZW4gPiBzaXplb2YoYnVmKS0xMCkKKwkJCXJldHVybjsKKwkJYnVmWzBdID0gTk1fQVRUX0lQQUNDX1VOSVRfSUQ7CisJCWJ1ZlsxXSA9IChsZW4rMSkgPj4gODsKKwkJYnVmWzJdID0gKGxlbisxKSAmIDB4ZmY7CisJCW1lbWNweShidWYrMywgdW5pdF9pZCwgbGVuKTsKKwkJYnVmWzMrbGVuXSA9IDA7CisJCXByaW50Zigic2V0dGluZyBVbml0IElEIHRvICclcydcbiIsIHVuaXRfaWQpOworCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIodHJ4LCBidWYsIDMrbGVuKzEpOworCX0KKwlpZiAocHJpbV9vbWxfaXApIHsKKwkJc3RydWN0IGluX2FkZHIgaWE7CisKKwkJaWYgKCFpbmV0X2F0b24ocHJpbV9vbWxfaXAsICZpYSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBJUCBhZGRyZXNzOiAlc1xuIiwKKwkJCQlwcmltX29tbF9pcCk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiAweDg4ICsgSVAgKyBwb3J0ICovCisJCWxlbiA9IDEgKyBzaXplb2YoaWEpICsgMjsKKworCQkqY3VyKysgPSBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHX0xJU1Q7CisJCSpjdXIrKyA9IChsZW4pID4+IDg7CisJCSpjdXIrKyA9IChsZW4pICYgMHhmZjsKKwkJKmN1cisrID0gMHg4ODsKKwkJbWVtY3B5KGN1ciwgJmlhLCBzaXplb2YoaWEpKTsKKwkJY3VyICs9IHNpemVvZihpYSk7CisJCSpjdXIrKyA9IDA7CisJCSpjdXIrKyA9IDA7CisJCXByaW50Zigic2V0dGluZyBwcmltYXJ5IE9NTCBsaW5rIElQIHRvICclcydcbiIsIGluZXRfbnRvYShpYSkpOworCQlvbWxfc3RhdGUgPSAxOworCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIodHJ4LCBidWYsIDMrbGVuKTsKKwl9CisJaWYgKG52X21hc2spIHsKKwkJbGVuID0gNDsKKworCQkqY3VyKysgPSBOTV9BVFRfSVBBQ0NfTlZfRkxBR1M7CisJCSpjdXIrKyA9IChsZW4pID4+IDg7CisJCSpjdXIrKyA9IChsZW4pICYgMHhmZjsKKwkJKmN1cisrID0gbnZfZmxhZ3MgJiAweGZmOworCQkqY3VyKysgPSBudl9tYXNrICYgMHhmZjsKKwkJKmN1cisrID0gbnZfZmxhZ3MgPj4gODsKKwkJKmN1cisrID0gbnZfbWFzayA+PiA4OworCQlwcmludGYoInNldHRpbmcgTlYgRmxhZ3MvTWFzayB0byAweCUwNHgvMHglMDR4XG4iLAorCQkJbnZfZmxhZ3MsIG52X21hc2spOworCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIodHJ4LCBidWYsIDMrbGVuKTsKKwl9CisKKwlpZiAocmVzdGFydCAmJiAhcHJpbV9vbWxfaXAgJiYgIXNvZnR3YXJlKSB7CisJCXByaW50ZigicmVzdGFydGluZyBCVFNcbiIpOworCQlhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQodHJ4KTsKKwl9CisKK30KKwordm9pZCBpbnB1dF9ldmVudChpbnQgZXZlbnQsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsIHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEVWVF9FMV9URUlfVVA6CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIEUxSU5QX1NJR05fT01MOgorCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCQkvKiBGSVhNRSAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEVWVF9FMV9URUlfRE46CisJCWZwcmludGYoc3RkZXJyLCAiTG9zdCBzb21lIEUxIFRFSSBsaW5rXG4iKTsKKwkJLyogRklYTUU6IGRlYWwgd2l0aCBURUkgb3IgTDEgbGluayBsb3NzICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworaW50IG5tX3N0YXRlX2V2ZW50KGVudW0gbm1fZXZ0IGV2dCwgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB2b2lkICpvYmosCisJCSAgIHN0cnVjdCBnc21fbm1fc3RhdGUgKm9sZF9zdGF0ZSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbmV3X3N0YXRlLAorCQkgICBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqb2JqX2luc3QpCit7CisJaWYgKG9ial9jbGFzcyA9PSBOTV9PQ19CQVNFQl9UUkFOU0MpIHsKKwkJaWYgKCFmb3VuZF90cnggJiYgb2JqX2luc3QtPnRyeF9uciAhPSAweGZmKSB7CisJCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBnc21fYnRzX3RyeCwgYmJfdHJhbnNjKTsKKwkJCWJvb3RzdHJhcF9vbSh0cngpOworCQkJZm91bmRfdHJ4ID0gMTsKKwkJfQorCX0gZWxzZSBpZiAoZXZ0ID09IEVWVF9TVEFURUNIR19PUEVSICYmCisJICAgIG9ial9jbGFzcyA9PSBOTV9PQ19SQURJT19DQVJSSUVSICYmCisJICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IDMpIHsKKwkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBvYmo7CisKKwkJaWYgKG5ldF9saXN0ZW5fdGVzdG5yKSB7CisJCQl1X2ludDhfdCBwaHlzX2NvbmZpZ1tdID0geyAweDAyLCAweDBhLCAweDAwLCAweDAxLCAweDAyIH07CisJCQlhYmlzX25tX3BlcmZvcm1fdGVzdCh0cngtPmJ0cywgMiwgMCwgdHJ4LT5uciwgMHhmZiwKKwkJCQkJICAgICBuZXRfbGlzdGVuX3Rlc3RuciwgMSwKKwkJCQkJICAgICBwaHlzX2NvbmZpZywgc2l6ZW9mKHBoeXNfY29uZmlnKSk7CisJCX0gZWxzZSBpZiAoc29mdHdhcmUpIHsKKwkJCWludCByYzsKKwkJCXByaW50ZigiQXR0ZW1wdGluZyBzb2Z0d2FyZSB1cGxvYWQgd2l0aCAnJXMnXG4iLCBzb2Z0d2FyZSk7CisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZCh0cngtPmJ0cywgdHJ4LT5uciwgc29mdHdhcmUsIDE5LCAwLCBzd2xvYWRfY2JmbiwgdHJ4KTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBzdGFydCBzb2Z0d2FyZSBsb2FkXG4iKTsKKwkJCQlleGl0KC0zKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzd19sb2FkICpjcmVhdGVfc3dsb2FkKHN0cnVjdCBzZHBfaGVhZGVyICpoZWFkZXIpCit7CisJc3RydWN0IHN3X2xvYWQgKmxvYWQ7CisKKwlsb2FkID0gdGFsbG9jX3plcm8odGFsbF9jdHhfY29uZmlnLCBzdHJ1Y3Qgc3dfbG9hZCk7CisKKwlzdHJuY3B5KChjaGFyICopbG9hZC0+ZmlsZV9pZCwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnN3X3BhcnQsIDIwKTsKKwlsb2FkLT5maWxlX2lkX2xlbiA9IHN0cmxlbihoZWFkZXItPmZpcm13YXJlX2luZm8uc3dfcGFydCkgKyAxOworCisJc3RybmNweSgoY2hhciAqKWxvYWQtPmZpbGVfdmVyc2lvbiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnZlcnNpb24sIDIwKTsKKwlsb2FkLT5maWxlX3ZlcnNpb25fbGVuID0gc3RybGVuKGhlYWRlci0+ZmlybXdhcmVfaW5mby52ZXJzaW9uKSArIDE7CisKKwlyZXR1cm4gbG9hZDsKK30KKworc3RhdGljIGludCBmaW5kX3N3X2xvYWRfcGFyYW1zKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0YXQ7CisJc3RydWN0IHNkcF9oZWFkZXIgKmhlYWRlcjsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqZW50cnk7CisJaW50IGZkOworCXZvaWQgKnRhbGxfZmlybV9jdHggPSAwOworCisJZW50cnkgPSB0YWxsb2NfemVybyh0YWxsX2Zpcm1fY3R4LCBzdHJ1Y3QgbGxpc3RfaGVhZCk7CisJSU5JVF9MTElTVF9IRUFEKGVudHJ5KTsKKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmICghZmQpIHsKKwkJcGVycm9yKCJuYWRhIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB2ZXJpZnkgdGhlIGZpbGUgKi8KKwlpZiAoZnN0YXQoZmQsICZzdGF0KSA9PSAtMSkgeworCQlwZXJyb3IoIkNhbiBub3Qgc3RhdCB0aGUgZmlsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaXBhY2Nlc3NfYW5hbHl6ZV9maWxlKGZkLCBzdGF0LnN0X3NpemUsIDAsIGVudHJ5KTsKKwlpZiAoY2xvc2UoZmQpICE9IDApIHsKKwkJcGVycm9yKCJDbG9zZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHRyeSB0byBmaW5kIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoaGVhZGVyLCBlbnRyeSwgZW50cnkpIHsKKwkJaWYgKG50b2hzKGhlYWRlci0+ZmlybXdhcmVfaW5mby5tb3JlX21vcmVfbWFnaWMpID09IDB4MTAwMCkgeworCQkJc3dfbG9hZDEgPSBjcmVhdGVfc3dsb2FkKGhlYWRlcik7CisJCX0gZWxzZSBpZiAobnRvaHMoaGVhZGVyLT5maXJtd2FyZV9pbmZvLm1vcmVfbW9yZV9tYWdpYykgPT0gMHgyMDAxKSB7CisJCQlzd19sb2FkMiA9IGNyZWF0ZV9zd2xvYWQoaGVhZGVyKTsKKwkJfQorCX0KKworCWlmICghc3dfbG9hZDEgfHwgIXN3X2xvYWQyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRGlkIG5vdCBmaW5kIGRhdGEuXG4iKTsKKwkJdGFsbG9jX2ZyZWUodGFsbF9maXJtX2N0eCk7CisJCXJldHVybiAtMTsKKyAgICAgICAgfQorCisJdGFsbG9jX2ZyZWUodGFsbF9maXJtX2N0eCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZW50cnkoc3RydWN0IHNkcF9oZWFkZXJfaXRlbSAqc3ViX2VudHJ5LCBpbnQgcGFydCwgaW50IGZkKQoreworCWludCBvdXRfZmQ7CisJaW50IGNvcGllZDsKKwljaGFyIGZpbGVuYW1lWzQwOTZdOworCW9mZl90IHRhcmdldDsKKworCWlmICghZHVtcF9maWxlcykKKwkJcmV0dXJuOworCisJaWYgKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnNvbWV0aGluZzEgPT0gMCkKKwkJcmV0dXJuOworCisJc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICJwYXJ0LiVkIiwgcGFydCsrKTsKKwlvdXRfZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1dST05MWSB8IE9fQ1JFQVQsIDA2NjApOworCWlmIChvdXRfZmQgPCAwKSB7CisJCXBlcnJvcigiQ2FuIG5vdCBkdW1wIGZpcm13YXJlIik7CisJCXJldHVybjsKKwl9CisKKwl0YXJnZXQgPSBzdWJfZW50cnktPmFic29sdXRlX29mZnNldCArIG50b2hsKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnN0YXJ0KSArIDQ7CisJaWYgKGxzZWVrKGZkLCB0YXJnZXQsIFNFRUtfU0VUKSAhPSB0YXJnZXQpIHsKKwkJcGVycm9yKCJzZWVrIGZhaWxlZCIpOworCQljbG9zZShvdXRfZmQpOworCQlyZXR1cm47CisJfQorCisJZm9yIChjb3BpZWQgPSAwOyBjb3BpZWQgPCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5sZW5ndGgpOyArK2NvcGllZCkgeworCQljaGFyIGM7CisJCWlmIChyZWFkKGZkLCAmYywgc2l6ZW9mKGMpKSAhPSBzaXplb2YoYykpIHsKKwkJCXBlcnJvcigiY29weSBmYWlsZWQiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHdyaXRlKG91dF9mZCwgJmMsIHNpemVvZihjKSkgIT0gc2l6ZW9mKGMpKSB7CisJCQlwZXJyb3IoIndyaXRlIGZhaWxlZCIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwljbG9zZShvdXRfZmQpOworfQorCitzdGF0aWMgdm9pZCBhbmFseXplX2Zpcm13YXJlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0YXQ7CisJc3RydWN0IHNkcF9oZWFkZXIgKmhlYWRlcjsKKwlzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtICpzdWJfZW50cnk7CisJc3RydWN0IGxsaXN0X2hlYWQgKmVudHJ5OworCWludCBmZDsKKwl2b2lkICp0YWxsX2Zpcm1fY3R4ID0gMDsKKwlpbnQgcGFydCA9IDA7CisKKwllbnRyeSA9IHRhbGxvY196ZXJvKHRhbGxfZmlybV9jdHgsIHN0cnVjdCBsbGlzdF9oZWFkKTsKKwlJTklUX0xMSVNUX0hFQUQoZW50cnkpOworCisJcHJpbnRmKCJPcGVuaW5nIHBvc3NpYmxlIGZpcm13YXJlICclcydcbiIsIGZpbGVuYW1lKTsKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoIWZkKSB7CisJCXBlcnJvcigibmFkYSIpOworCQlyZXR1cm47CisJfQorCisJLyogdmVyaWZ5IHRoZSBmaWxlICovCisJaWYgKGZzdGF0KGZkLCAmc3RhdCkgPT0gLTEpIHsKKwkJcGVycm9yKCJDYW4gbm90IHN0YXQgdGhlIGZpbGUiKTsKKwkJcmV0dXJuOworCX0KKworCWlwYWNjZXNzX2FuYWx5emVfZmlsZShmZCwgc3RhdC5zdF9zaXplLCAwLCBlbnRyeSk7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShoZWFkZXIsIGVudHJ5LCBlbnRyeSkgeworCQlwcmludGYoIlByaW50aW5nIGhlYWRlciBpbmZvcm1hdGlvbjpcbiIpOworCQlwcmludGYoIm1vcmVfbW9yZV9tYWdpYzogMHgleFxuIiwgbnRvaHMoaGVhZGVyLT5maXJtd2FyZV9pbmZvLm1vcmVfbW9yZV9tYWdpYykpOworCQlwcmludGYoImhlYWRlcl9sZW5ndGg6ICV1XG4iLCBudG9obChoZWFkZXItPmZpcm13YXJlX2luZm8uaGVhZGVyX2xlbmd0aCkpOworCQlwcmludGYoImZpbGVfbGVuZ3RoOiAldVxuIiwgbnRvaGwoaGVhZGVyLT5maXJtd2FyZV9pbmZvLmZpbGVfbGVuZ3RoKSk7CisJCXByaW50Zigic3dfcGFydDogJS4yMHNcbiIsIGhlYWRlci0+ZmlybXdhcmVfaW5mby5zd19wYXJ0KTsKKwkJcHJpbnRmKCJ0ZXh0MTogJS42NHNcbiIsIGhlYWRlci0+ZmlybXdhcmVfaW5mby50ZXh0MSk7CisJCXByaW50ZigidGltZTogJS4xMnNcbiIsIGhlYWRlci0+ZmlybXdhcmVfaW5mby50aW1lKTsKKwkJcHJpbnRmKCJkYXRlOiAlLjE0c1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLmRhdGUpOworCQlwcmludGYoInRleHQyOiAlLjEwc1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnRleHQyKTsKKwkJcHJpbnRmKCJ2ZXJzaW9uOiAlLjIwc1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnZlcnNpb24pOworCQlwcmludGYoInN1Yml0ZW1zLi4uXG4iKTsKKworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJfZW50cnksICZoZWFkZXItPmhlYWRlcl9saXN0LCBlbnRyeSkgeworCQkJcHJpbnRmKCJcdHNvbWV0aGluZzE6ICV1XG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5zb21ldGhpbmcxKTsKKwkJCXByaW50ZigiXHR0ZXh0MTogJS42NHNcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnRleHQxKTsKKwkJCXByaW50ZigiXHR0aW1lOiAlLjEyc1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkudGltZSk7CisJCQlwcmludGYoIlx0ZGF0ZTogJS4xNHNcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LmRhdGUpOworCQkJcHJpbnRmKCJcdHRleHQyOiAlLjEwc1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkudGV4dDIpOworCQkJcHJpbnRmKCJcdHZlcnNpb246ICUuMjBzXG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS52ZXJzaW9uKTsKKwkJCXByaW50ZigiXHRsZW5ndGg6ICV1XG4iLCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5sZW5ndGgpKTsKKwkJCXByaW50ZigiXHRhZGRyMTogMHgleFxuIiwgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuYWRkcjEpKTsKKwkJCXByaW50ZigiXHRhZGRyMjogMHgleFxuIiwgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuYWRkcjIpKTsKKwkJCXByaW50ZigiXHRzdGFydDogMHgleFxuIiwgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuc3RhcnQpKTsKKwkJCXByaW50ZigiXHRhYnMuIG9mZnNldDogMHglbHhcbiIsIHN1Yl9lbnRyeS0+YWJzb2x1dGVfb2Zmc2V0KTsKKwkJCXByaW50ZigiXG5cbiIpOworCisJCQlkdW1wX2VudHJ5KHN1Yl9lbnRyeSwgcGFydCsrLCBmZCk7CisJCX0KKwkJcHJpbnRmKCJcblxuIik7CisJfQorCisJaWYgKGNsb3NlKGZkKSAhPSAwKSB7CisJCXBlcnJvcigiQ2xvc2UgZmFpbGVkLlxuIik7CisJCXJldHVybjsKKwl9CisKKwl0YWxsb2NfZnJlZSh0YWxsX2Zpcm1fY3R4KTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2Uodm9pZCkKK3sKKwlwcmludGYoIlVzYWdlOiBpcGFjY2Vzcy1jb25maWdcbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKHZvaWQpCit7CisJcHJpbnRmKCIgIC11IC0tdW5pdC1pZCBVTklUX0lEXG4iKTsKKwlwcmludGYoIiAgLW8gLS1vbWwtaXAgaXBcbiIpOworCXByaW50ZigiICAtciAtLXJlc3RhcnRcbiIpOworCXByaW50ZigiICAtbiBmbGFncy9tYXNrXHRTZXQgTlZSQU0gYXR0cmlidXRlcy5cbiIpOworCXByaW50ZigiICAtbCAtLWxpc3RlbiB0ZXN0bnIgXHRQZXJmb3JtIHNwZWNpZmllZCB0ZXN0IG51bWJlclxuIik7CisJcHJpbnRmKCIgIC1oIC0taGVscCB0aGlzIHRleHRcbiIpOworCXByaW50ZigiICAtcyAtLXN0cmVhbS1pZCBJRFxuIik7CisJcHJpbnRmKCIgIC1kIC0tc29mdHdhcmUgZmlybXdhcmVcbiIpOworCXByaW50ZigiICAtZiAtLWZpcm13YXJlIGZpcm13YXJlIFByb3ZpZGUgZmlybXdhcmUgaW5mb3JtYXRpb25cbiIpOworCXByaW50ZigiICAtdyAtLXdyaXRlLWZpcm13YXJlLiBUaGlzIHdpbGwgZHVtcCB0aGUgZmlybXdhcmUgcGFydHMgdG8gdGhlIGZpbGVzeXN0ZW0uIFVzZSB3aXRoIC1mLlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJaW50IHJjLCBvcHRpb25faW5kZXggPSAwLCBzdHJlYW1faWQgPSAweGZmOworCXN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCWxvZ19zZXRfbG9nX2xldmVsKHN0ZGVycl90YXJnZXQsIDApOworCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsICJETk0sMCIpOworCWJ0c19tb2RlbF9uYW5vYnRzX2luaXQoKTsKKworCXByaW50ZigiaXBhY2Nlc3MtY29uZmlnIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZVxuIik7CisJcHJpbnRmKCJUaGlzIGlzIEZSRUUgU09GVFdBUkUgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZXG5cbiIpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IGM7CisJCXVuc2lnbmVkIGxvbmcgdWw7CisJCWNoYXIgKnNsYXNoOworCQlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJCXsgInVuaXQtaWQiLCAxLCAwLCAndScgfSwKKwkJCXsgIm9tbC1pcCIsIDEsIDAsICdvJyB9LAorCQkJeyAicmVzdGFydCIsIDAsIDAsICdyJyB9LAorCQkJeyAiaGVscCIsIDAsIDAsICdoJyB9LAorCQkJeyAibGlzdGVuIiwgMSwgMCwgJ2wnIH0sCisJCQl7ICJzdHJlYW0taWQiLCAxLCAwLCAncycgfSwKKwkJCXsgInNvZnR3YXJlIiwgMSwgMCwgJ2QnIH0sCisJCQl7ICJmaXJtd2FyZSIsIDEsIDAsICdmJyB9LAorCQkJeyAid3JpdGUtZmlybXdhcmUiLCAwLCAwLCAndycgfSwKKwkJCXsgMCwgMCwgMCwgMCB9LAorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAidTpvOnJuOmw6aHM6ZDpmOnciLCBsb25nX29wdGlvbnMsCisJCQkJJm9wdGlvbl9pbmRleCk7CisKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAndSc6CisJCQl1bml0X2lkID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJcHJpbV9vbWxfaXAgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZXN0YXJ0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCXNsYXNoID0gc3RyY2hyKG9wdGFyZywgJy8nKTsKKwkJCWlmICghc2xhc2gpCisJCQkJZXhpdCgyKTsKKwkJCXVsID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDE2KTsKKwkJCW52X2ZsYWdzID0gdWwgJiAweGZmZmY7CisJCQl1bCA9IHN0cnRvdWwoc2xhc2grMSwgTlVMTCwgMTYpOworCQkJbnZfbWFzayA9IHVsICYgMHhmZmZmOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJbmV0X2xpc3Rlbl90ZXN0bnIgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzdHJlYW1faWQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlzb2Z0d2FyZSA9IHN0cmR1cChvcHRhcmcpOworCQkJaWYgKGZpbmRfc3dfbG9hZF9wYXJhbXMob3B0YXJnKSAhPSAwKQorCQkJCWV4aXQoMCk7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlmaXJtd2FyZV9hbmFseXNpcyA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCWR1bXBfZmlsZXMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfdXNhZ2UoKTsKKwkJCXByaW50X2hlbHAoKTsKKwkJCWV4aXQoMCk7CisJCX0KKwl9OworCisJaWYgKGZpcm13YXJlX2FuYWx5c2lzKQorCQlhbmFseXplX2Zpcm13YXJlKGZpcm13YXJlX2FuYWx5c2lzKTsKKworCWlmIChvcHRpbmQgPj0gYXJnYykgeworCQkvKiBvbmx5IHdhcm4gaWYgd2UgaGF2ZSBub3QgZG9uZSBhbnl0aGluZyBlbHNlICovCisJCWlmICghZmlybXdhcmVfYW5hbHlzaXMpCisJCQlmcHJpbnRmKHN0ZGVyciwgInlvdSBoYXZlIHRvIHNwZWNpZnkgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIEJUUy4gVXNlIC0taGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvblxuIik7CisJCWV4aXQoMik7CisJfQorCisJZ3NtbmV0ID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBOVUxMKTsKKwlpZiAoIWdzbW5ldCkKKwkJZXhpdCgxKTsKKworCWJ0cyA9IGdzbV9idHNfYWxsb2MoZ3NtbmV0LCBHU01fQlRTX1RZUEVfTkFOT0JUUywgSEFSRENPREVEX1RTQywKKwkJCQlIQVJEQ09ERURfQlNJQyk7CisJLyogaXAuYWNjZXNzIHN1cHBvcnRzIHVwIHRvIDQgY2hhaW5lZCBUUlggKi8KKwlnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCWdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisJZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKwlidHMtPm9tbF90ZWkgPSBzdHJlYW1faWQ7CisJCisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTk0sIG5tX3NpZ19jYiwgTlVMTCk7CisJcHJpbnRmKCJUcnlpbmcgdG8gY29ubmVjdCB0byBpcC5hY2Nlc3MgQlRTIC4uLlxuIik7CisKKwltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlpbmV0X2F0b24oYXJndltvcHRpbmRdLCAmc2luLnNpbl9hZGRyKTsKKwlyYyA9IGlhX2NvbmZpZ19jb25uZWN0KGJ0cywgJnNpbik7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoIkVycm9yIGNvbm5lY3RpbmcgdG8gdGhlIEJUUyIpOworCQlleGl0KDEpOworCX0KKwkKKwl3aGlsZSAoMSkgeworCQlyYyA9IGJzY19zZWxlY3RfbWFpbigwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQoMyk7CisJfQorCisJZXhpdCgwKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmluZC5jIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmluZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNGEwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maW5kLmMKQEAgLTAsMCArMSwyMDggQEAKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+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+bGNoYW5fbW9kZSA9IEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI7CisJCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfTENIQU5fTU9ESUZZLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX0FMRVJUX0lORDoKKwkJcmMgPSBtbmNjX2FsZXJ0X2luZChjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX05PVElGWV9JTkQ6CisJCXJjID0gbW5jY19ub3RpZnlfaW5kKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfRElTQ19JTkQ6CisJCXJjID0gbW5jY19kaXNjX2luZChjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1JFTF9JTkQ6CisJY2FzZSBNTkNDX1JFSl9JTkQ6CisJCXJjID0gbW5jY19yZWxfaW5kKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfUkVMX0NORjoKKwkJcmMgPSBtbmNjX3JlbF9jbmYoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19GQUNJTElUWV9JTkQ6CisJCWJyZWFrOworCWNhc2UgTU5DQ19TVEFSVF9EVE1GX0lORDoKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1NUT1BfRFRNRl9JTkQ6CisJCWJyZWFrOworCWNhc2UgTU5DQ19NT0RJRllfSU5EOgorCQltbmNjX3NldF9jYXVzZShkYXRhLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfU0VSVl9PUFRfVU5JTVBMKTsKKwkJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlamVjdGluZyBNT0RJRlkgd2l0aCBjYXVzZSAlZFxuIiwKKwkJCWNhbGwtPmNhbGxyZWYsIGRhdGEtPmNhdXNlLnZhbHVlKTsKKwkJcmMgPSBtbmNjX3NlbmQobmV0LCBNTkNDX01PRElGWV9SRUosIGRhdGEpOworCQlicmVhazsKKwljYXNlIE1OQ0NfTU9ESUZZX0NORjoKKwkJYnJlYWs7CisJY2FzZSBNTkNDX0hPTERfSU5EOgorCQltbmNjX3NldF9jYXVzZShkYXRhLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfU0VSVl9PUFRfVU5JTVBMKTsKKwkJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlamVjdGluZyBIT0xEIHdpdGggY2F1c2UgJWRcbiIsCisJCQljYWxsLT5jYWxscmVmLCBkYXRhLT5jYXVzZS52YWx1ZSk7CisJCXJjID0gbW5jY19zZW5kKG5ldCwgTU5DQ19IT0xEX1JFSiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19SRVRSSUVWRV9JTkQ6CisJCW1uY2Nfc2V0X2NhdXNlKGRhdGEsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9TRVJWX09QVF9VTklNUEwpOworCQlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVqZWN0aW5nIFJFVFJJRVZFIHdpdGggY2F1c2UgJWRcbiIsCisJCQljYWxsLT5jYWxscmVmLCBkYXRhLT5jYXVzZS52YWx1ZSk7CisJCXJjID0gbW5jY19zZW5kKG5ldCwgTU5DQ19SRVRSSUVWRV9SRUosIGRhdGEpOworCQlicmVhazsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCWNhc2UgR1NNX1RDSEZfRlJBTUVfRUZSOgorCQlyYyA9IG1uY2NfcmN2X3RjaGYoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1OQ0MsIExPR0xfTk9USUNFLCAiKGNhbGwgJXgpIE1lc3NhZ2UgdW5oYW5kbGVkXG4iLCBjYWxscmVmKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0xIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTgwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTEKQEAgLTAsMCArMSw1NCBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTEzIDYwCisgYnRzIDAKKyAgdHlwZSBiczExCisgIGJhbmQgR1NNOTAwCisgIGNlbGxfaWRlbnRpdHkgMQorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgb21sIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgb21sIGUxIHRlaSAyNQorICB0cnggMAorICAgYXJmY24gMTIxCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDEKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAzCisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMiBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQ1MGM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0yCkBAIC0wLDAgKzEsODIgQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCituZXR3b3JrCisgbmV0d29yayBjb3VudHJ5IGNvZGUgMQorIG1vYmlsZSBuZXR3b3JrIGNvZGUgMQorIHNob3J0IG5hbWUgT3BlbkJTQworIGxvbmcgbmFtZSBPcGVuQlNDCisgdGltZXIgdDMxMDEgMTAKKyB0aW1lciB0MzExMyA2MAorIGJ0cyAwCisgIHR5cGUgYnMxMQorICBiYW5kIEdTTTkwMAorICBjZWxsX2lkZW50aXR5IDEKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG9tbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgIG9tbCBlMSB0ZWkgMjUKKyAgdHJ4IDAKKyAgIGFyZmNuIDEyMQorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAxCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDMKKyAgdHJ4IDEKKyAgIGFyZmNuIDEyMworICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAyCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMi0yIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMi0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTgwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4yLTIKQEAgLTAsMCArMSwxNDggQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCituZXR3b3JrCisgbmV0d29yayBjb3VudHJ5IGNvZGUgMQorIG1vYmlsZSBuZXR3b3JrIGNvZGUgMQorIHNob3J0IG5hbWUgT3BlbkJTQworIGxvbmcgbmFtZSBPcGVuQlNDCisgdGltZXIgdDMxMDEgMTAKKyB0aW1lciB0MzExMyA2MAorIGJ0cyAwCisgIHR5cGUgYnMxMQorICBiYW5kIEdTTTkwMAorICBjZWxsX2lkZW50aXR5IDEKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG9tbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgIG9tbCBlMSB0ZWkgMjUKKyAgdHJ4IDAKKyAgIGFyZmNuIDEyMQorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAxCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMworICB0cnggMQorICAgYXJmY24gMTIzCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDIKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAzCisgYnRzIDEKKyAgdHlwZSBiczExCisgIGJhbmQgR1NNOTAwCisgIGxvY2F0aW9uX2FyZWFfY29kZSAyCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICBvbWwgZTEgbGluZSAxIHRpbWVzbG90IDYgc3ViLXNsb3QgZnVsbAorICBvbWwgZTEgdGVpIDI1CisgIHRyeCAwCisgICBhcmZjbiAxMjIKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMSB0aW1lc2xvdCA2IHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMQorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgNyBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFNEQ0NIOAorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgNyBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA3IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDcgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOCBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA4IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDggc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOCBzdWItc2xvdCAzCisgIHRyeCAxCisgICBhcmZjbiAxMjQKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMSB0aW1lc2xvdCA2IHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMgorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOSBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA5IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDkgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOSBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCAxMCBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCAxMCBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCAxMCBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCAxMCBzdWItc2xvdCAzCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTBiYTc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cwpAQCAtMCwwICsxLDc1IEBACishCishIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eQorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbmV0d29yaworIG5ldHdvcmsgY291bnRyeSBjb2RlIDEKKyBtb2JpbGUgbmV0d29yayBjb2RlIDEKKyBzaG9ydCBuYW1lIE9wZW5CU0MKKyBsb25nIG5hbWUgT3BlbkJTQworIGF1dGggcG9saWN5IGNsb3NlZAorIGxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdCBjYXVzZSAxMworIGVuY3J5cHRpb24gYTUgMAorIG5lY2kgMAorIHJybHAgbW9kZSBub25lCisgbW0gaW5mbyAxCisgaGFuZG92ZXIgMAorIGhhbmRvdmVyIHdpbmRvdyByeGxldiBhdmVyYWdpbmcgMTAKKyBoYW5kb3ZlciB3aW5kb3cgcnhxdWFsIGF2ZXJhZ2luZyAxCisgaGFuZG92ZXIgd2luZG93IHJ4bGV2IG5laWdoYm9yIGF2ZXJhZ2luZyAxMAorIGhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBpbnRlcnZhbCA2CisgaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGh5c3RlcmVzaXMgMworIGhhbmRvdmVyIG1heGltdW0gZGlzdGFuY2UgOTk5OQorIHRpbWVyIHQzMTAxIDEwCisgdGltZXIgdDMxMDMgMAorIHRpbWVyIHQzMTA1IDAKKyB0aW1lciB0MzEwNyAwCisgdGltZXIgdDMxMDkgMAorIHRpbWVyIHQzMTExIDAKKyB0aW1lciB0MzExMyA2MAorIHRpbWVyIHQzMTE1IDAKKyB0aW1lciB0MzExNyAwCisgdGltZXIgdDMxMTkgMAorIHRpbWVyIHQzMTQxIDAKKyBidHMgMAorICB0eXBlIG5hbm9idHMKKyAgYmFuZCBEQ1MxODAwCisgIGNlbGxfaWRlbnRpdHkgMAorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgbXMgbWF4IHBvd2VyIDE1CisgIGNlbGwgcmVzZWxlY3Rpb24gaHlzdGVyZXNpcyA0CisgIHJ4bGV2IGFjY2VzcyBtaW4gMAorICBjaGFubmVsIGFsbG9jYXRvciBhc2NlbmRpbmcKKyAgcmFjaCB0eCBpbnRlZ2VyIDkKKyAgcmFjaCBtYXggdHJhbnNtaXNzaW9uIDcKKyAgaXAuYWNjZXNzIHVuaXRfaWQgMTgwMSAwCisgIG9tbCBpcC5hY2Nlc3Mgc3RyZWFtX2lkIDI1NQorICBncHJzIG1vZGUgbm9uZQorICB0cnggMAorICAgcmZfbG9ja2VkIDAKKyAgIGFyZmNuIDUxNAorICAgbm9taW5hbCBwb3dlciAyMworICAgbWF4X3Bvd2VyX3JlZCAyMAorICAgcnNsIGUxIHRlaSAwCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFNEQ0NIOAorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cy5tdWx0aXRyeCBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMubXVsdGl0cngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUyN2ZmNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMubXVsdGl0cngKQEAgLTAsMCArMSw5NyBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyBhdXRoIHBvbGljeSBjbG9zZWQKKyBsb2NhdGlvbiB1cGRhdGluZyByZWplY3QgY2F1c2UgMTMKKyBlbmNyeXB0aW9uIGE1IDAKKyBuZWNpIDAKKyBycmxwIG1vZGUgbm9uZQorIG1tIGluZm8gMAorIGhhbmRvdmVyIDAKKyBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgYXZlcmFnaW5nIDEwCisgaGFuZG92ZXIgd2luZG93IHJ4cXVhbCBhdmVyYWdpbmcgMQorIGhhbmRvdmVyIHdpbmRvdyByeGxldiBuZWlnaGJvciBhdmVyYWdpbmcgMTAKKyBoYW5kb3ZlciBwb3dlciBidWRnZXQgaW50ZXJ2YWwgNgorIGhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBoeXN0ZXJlc2lzIDMKKyBoYW5kb3ZlciBtYXhpbXVtIGRpc3RhbmNlIDk5OTkKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTAzIDAKKyB0aW1lciB0MzEwNSAwCisgdGltZXIgdDMxMDcgMAorIHRpbWVyIHQzMTA5IDAKKyB0aW1lciB0MzExMSAwCisgdGltZXIgdDMxMTMgNjAKKyB0aW1lciB0MzExNSAwCisgdGltZXIgdDMxMTcgMAorIHRpbWVyIHQzMTE5IDAKKyB0aW1lciB0MzE0MSAwCisgYnRzIDAKKyAgdHlwZSBuYW5vYnRzCisgIGJhbmQgRENTMTgwMAorICBjZWxsX2lkZW50aXR5IDAKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG1zIG1heCBwb3dlciAxNQorICBjZWxsIHJlc2VsZWN0aW9uIGh5c3RlcmVzaXMgNAorICByeGxldiBhY2Nlc3MgbWluIDAKKyAgY2hhbm5lbCBhbGxvY2F0b3IgYXNjZW5kaW5nCisgIHJhY2ggdHggaW50ZWdlciA5CisgIHJhY2ggbWF4IHRyYW5zbWlzc2lvbiA3CisgIGlwLmFjY2VzcyB1bml0X2lkIDE4MDAgMAorICBvbWwgaXAuYWNjZXNzIHN0cmVhbV9pZCAyNTUKKyAgZ3BycyBtb2RlIG5vbmUKKyAgdHJ4IDAKKyAgIHJmX2xvY2tlZCAwCisgICBhcmZjbiA4NzEKKyAgIG5vbWluYWwgcG93ZXIgMjMKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIHRlaSAwCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFNEQ0NIOAorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICB0cnggMQorICAgcmZfbG9ja2VkIDAKKyAgIGFyZmNuIDg3MworICAgbm9taW5hbCBwb3dlciAyMworICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgdGVpIDAKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9wYWdpbmcuYyBiL29wZW5ic2Mvc3JjL3BhZ2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZWQ5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9wYWdpbmcuYwpAQCAtMCwwICsxLDMyOSBAQAorLyogUGFnaW5nIGhlbHBlciBhbmQgbWFuYWdlci4uLi4gKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisvKgorICogUmVsZXZhbnQgc3BlY3M6CisgKiAgICAgMTIuMjE6CisgKiAgICAgICAtIDkuNC4xMiBmb3IgQ0NDSCBMb2NhbCBUaHJlc2hvbGQKKyAqCisgKiAgICAgMDUuNTg6CisgKiAgICAgICAtIDguNS4yIENDQ0ggTG9hZCBpbmRpY2F0aW9uCisgKiAgICAgICAtIDkuMy4xNSBQYWdpbmcgTG9hZAorICoKKyAqIEFwcHJvYWNoOgorICogICAgICAgLSBTZW5kIHBhZ2luZyBjb21tYW5kIHRvIHN1YnNjcmliZXIKKyAqICAgICAgIC0gT24gQ2hhbm5lbCBSZXF1ZXN0IHdlIHdpbGwgcmVtZW1iZXIgdGhlIHJlYXNvbgorICogICAgICAgLSBBZnRlciB0aGUgQUNLIHdlIHdpbGwgcmVxdWVzdCB0aGUgaWRlbnRpdHkKKyAqCSAtIFRoZW4gd2Ugd2lsbCBzZW5kIGFzc2lnbiB0aGUgZ3NtX3N1YnNjcmliZXIgYW5kCisgKgkgLSBhbmQgY2FsbCBhIGNhbGxiYWNrCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+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+Y29ubjsKKwlpZiAoIWNvbm4tPnNpbGVudF9jYWxsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB1dF9zdWJzY3JfY29uKGNvbm4pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9zb2NrZXQuYyBiL29wZW5ic2Mvc3JjL3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZDRkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9zb2NrZXQuYwpAQCAtMCwwICsxLDk0IEBACisvKiBPcGVuQlNDIHNva2NldCBjb2RlLCB0YWtlbiBmcm9tIEFiaXMgaW5wdXQgZHJpdmVyIGZvciBpcC5hY2Nlc3MgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiAoQykgMjAxMCBieSBPbi1XYXZlcworICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworaW50IG1ha2Vfc29jayhzdHJ1Y3QgYnNjX2ZkICpiZmQsIGludCBwcm90bywgdV9pbnQxNl90IHBvcnQsCisJICAgICAgaW50ICgqY2IpKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IHJldCwgb24gPSAxOworCWludCB0eXBlID0gU09DS19TVFJFQU07CisKKwlpZiAocHJvdG8gPT0gSVBQUk9UT19VRFApCisJCXR5cGUgPSBTT0NLX0RHUkFNOworCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCB0eXBlLCBwcm90byk7CisJYmZkLT5jYiA9IGNiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCS8vYmZkLT5kYXRhID0gbGluZTsKKworCWlmIChiZmQtPmZkIDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY3JlYXRlIFRDUCBzb2NrZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBiaW5kIGwyIHNvY2tldCAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGJmZC0+ZmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAocHJvdG8gIT0gSVBQUk9UT19VRFApIHsKKwkJcmV0ID0gbGlzdGVuKGJmZC0+ZmQsIDEpOworCQlpZiAocmV0IDwgMCkgeworCQkJcGVycm9yKCJsaXN0ZW4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoInJlZ2lzdGVyX2xpc3Rlbl9mZCIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9zdWJjaGFuX2RlbXV4LmMgYi9vcGVuYnNjL3NyYy9zdWJjaGFuX2RlbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2YzFmZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3N1YmNoYW5fZGVtdXguYwpAQCAtMCwwICsxLDMyMiBAQAorLyogQSBFMSBzdWItY2hhbm5lbCAoZGUpbXVsdGlwbGV4ZXIgd2l0aCBUUkFVIGZyYW1lIHN5bmMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+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+IgorI2RlZmluZSBDT05GSUdGSUxFX01BU0sgMDIyCisjZGVmaW5lIFNZU0NPTkZESVIgIi91c3IvbG9jYWwvZXRjIgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5L2NvbW1hbmQuYyBiL29wZW5ic2Mvc3JjL3Z0eS9jb21tYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExMzBiNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eS9jb21tYW5kLmMKQEAgLTAsMCArMSwzNDI0IEBACisvKgorICAgJElkOiBjb21tYW5kLmMsdiAxLjQ3IDIwMDUvMDQvMjUgMTY6MjY6NDIgcGF1bCBFeHAgJAorCisgICBDb21tYW5kIGludGVycHJldGVyIHJvdXRpbmUgZm9yIHZpcnR1YWwgdGVybWluYWwgW2FrYSBUZWxldFlwZV0KKyAgIENvcHlyaWdodCAoQykgMTk5NywgOTgsIDk5IEt1bmloaXJvIElzaGlndXJvCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKworR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCitieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgorb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImNhcmRzaGVsbC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2RlZmluZSBfWE9QRU5fU09VUkNFCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisvLyNpbmNsdWRlICJtZW1vcnkuaCIKKy8vI2luY2x1ZGUgImxvZy5oIgorLy8jaW5jbHVkZSA8bGliL3ZlcnNpb24uaD4KKy8vI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgPHZ0eS92ZWN0b3IuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKy8vI2luY2x1ZGUgIndvcmtxdWV1ZS5oIgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKwordm9pZCAqdGFsbF92dHlfY21kX2N0eDsKKworLyogQ29tbWFuZCB2ZWN0b3Igd2hpY2ggaW5jbHVkZXMgc29tZSBsZXZlbCBvZiBjb21tYW5kIGxpc3RzLiBOb3JtYWxseQorICAgZWFjaCBkYWVtb24gbWFpbnRhaW5zIGVhY2ggb3duIGNtZHZlYy4gKi8KK3ZlY3RvciBjbWR2ZWM7CisKKy8qIEhvc3QgaW5mb3JtYXRpb24gc3RydWN0dXJlLiAqLworc3RydWN0IGhvc3QgaG9zdDsKKworLyogU3RhbmRhcmQgY29tbWFuZCBub2RlIHN0cnVjdHVyZXMuICovCitzdHJ1Y3QgY21kX25vZGUgYXV0aF9ub2RlID0geworCUFVVEhfTk9ERSwKKwkiUGFzc3dvcmQ6ICIsCit9OworCitzdHJ1Y3QgY21kX25vZGUgdmlld19ub2RlID0geworCVZJRVdfTk9ERSwKKwkiJXM+ICIsCit9OworCitzdHJ1Y3QgY21kX25vZGUgYXV0aF9lbmFibGVfbm9kZSA9IHsKKwlBVVRIX0VOQUJMRV9OT0RFLAorCSJQYXNzd29yZDogIiwKK307CisKK3N0cnVjdCBjbWRfbm9kZSBlbmFibGVfbm9kZSA9IHsKKwlFTkFCTEVfTk9ERSwKKwkiJXMjICIsCit9OworCitzdHJ1Y3QgY21kX25vZGUgY29uZmlnX25vZGUgPSB7CisJQ09ORklHX05PREUsCisJIiVzKGNvbmZpZykjICIsCisJMQorfTsKKworLyogRGVmYXVsdCBtb3RkIHN0cmluZy4gKi8KK2NvbnN0IGNoYXIgKmRlZmF1bHRfbW90ZCA9ICJcclxuXAorSGVsbG8sIHRoaXMgaXMgIiBRVUFHR0FfUFJPR05BTUUgIiAodmVyc2lvbiAiIFFVQUdHQV9WRVJTSU9OICIpLlxyXG5cCisiIFFVQUdHQV9DT1BZUklHSFQgIlxyXG5cCitcclxuIjsKKworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgZmFjaWxpdHlfbWFwIHsKKwlpbnQgZmFjaWxpdHk7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzaXplX3QgbWF0Y2g7Cit9IHN5c2xvZ19mYWNpbGl0aWVzW10gPSB7CisJeworCUxPR19LRVJOLCAia2VybiIsIDF9LCB7CisJTE9HX1VTRVIsICJ1c2VyIiwgMn0sIHsKKwlMT0dfTUFJTCwgIm1haWwiLCAxfSwgeworCUxPR19EQUVNT04sICJkYWVtb24iLCAxfSwgeworCUxPR19BVVRILCAiYXV0aCIsIDF9LCB7CisJTE9HX1NZU0xPRywgInN5c2xvZyIsIDF9LCB7CisJTE9HX0xQUiwgImxwciIsIDJ9LCB7CisJTE9HX05FV1MsICJuZXdzIiwgMX0sIHsKKwlMT0dfVVVDUCwgInV1Y3AiLCAyfSwgeworCUxPR19DUk9OLCAiY3JvbiIsIDF9LAorI2lmZGVmIExPR19GVFAKKwl7CisJTE9HX0ZUUCwgImZ0cCIsIDF9LAorI2VuZGlmCisJeworCUxPR19MT0NBTDAsICJsb2NhbDAiLCA2fSwgeworCUxPR19MT0NBTDEsICJsb2NhbDEiLCA2fSwgeworCUxPR19MT0NBTDIsICJsb2NhbDIiLCA2fSwgeworCUxPR19MT0NBTDMsICJsb2NhbDMiLCA2fSwgeworCUxPR19MT0NBTDQsICJsb2NhbDQiLCA2fSwgeworCUxPR19MT0NBTDUsICJsb2NhbDUiLCA2fSwgeworCUxPR19MT0NBTDYsICJsb2NhbDYiLCA2fSwgeworCUxPR19MT0NBTDcsICJsb2NhbDciLCA2fSwgeworMCwgTlVMTCwgMH0sfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmZhY2lsaXR5X25hbWUoaW50IGZhY2lsaXR5KQoreworCXN0cnVjdCBmYWNpbGl0eV9tYXAgKmZtOworCisJZm9yIChmbSA9IHN5c2xvZ19mYWNpbGl0aWVzOyBmbS0+bmFtZTsgZm0rKykKKwkJaWYgKGZtLT5mYWNpbGl0eSA9PSBmYWNpbGl0eSkKKwkJCXJldHVybiBmbS0+bmFtZTsKKwlyZXR1cm4gIiI7Cit9CisKK3N0YXRpYyBpbnQgZmFjaWxpdHlfbWF0Y2goY29uc3QgY2hhciAqc3RyKQoreworCXN0cnVjdCBmYWNpbGl0eV9tYXAgKmZtOworCisJZm9yIChmbSA9IHN5c2xvZ19mYWNpbGl0aWVzOyBmbS0+bmFtZTsgZm0rKykKKwkJaWYgKCFzdHJuY21wKHN0ciwgZm0tPm5hbWUsIGZtLT5tYXRjaCkpCisJCQlyZXR1cm4gZm0tPmZhY2lsaXR5OworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBsZXZlbF9tYXRjaChjb25zdCBjaGFyICpzKQoreworCWludCBsZXZlbDsKKworCWZvciAobGV2ZWwgPSAwOyB6bG9nX3ByaW9yaXR5W2xldmVsXSAhPSBOVUxMOyBsZXZlbCsrKQorCQlpZiAoIXN0cm5jbXAocywgemxvZ19wcmlvcml0eVtsZXZlbF0sIDIpKQorCQkJcmV0dXJuIGxldmVsOworCXJldHVybiBaTE9HX0RJU0FCTEVEOworfQorI2VuZGlmCisKKy8qIFRoaXMgaXMgY2FsbGVkIGZyb20gbWFpbiB3aGVuIGEgZGFlbW9uIGlzIGludm9rZWQgd2l0aCAtdiBvciAtLXZlcnNpb24uICovCit2b2lkIHByaW50X3ZlcnNpb24oY29uc3QgY2hhciAqcHJvZ25hbWUpCit7CisJcHJpbnRmKCIlcyB2ZXJzaW9uICVzXG4iLCBwcm9nbmFtZSwgUVVBR0dBX1ZFUlNJT04pOworCXByaW50ZigiJXNcbiIsIFFVQUdHQV9DT1BZUklHSFQpOworfQorDAorLyogVXRpbGl0eSBmdW5jdGlvbiB0byBjb25jYXRlbmF0ZSBhcmd2IGFyZ3VtZW50IGludG8gYSBzaW5nbGUgc3RyaW5nCisgICB3aXRoIGluc2VydGluZyAnICcgY2hhcmFjdGVyIGJldHdlZW4gZWFjaCBhcmd1bWVudC4gICovCitjaGFyICphcmd2X2NvbmNhdChjb25zdCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGludCBzaGlmdCkKK3sKKwlpbnQgaTsKKwlzaXplX3QgbGVuOworCWNoYXIgKnN0cjsKKwljaGFyICpwOworCisJbGVuID0gMDsKKwlmb3IgKGkgPSBzaGlmdDsgaSA8IGFyZ2M7IGkrKykKKwkJbGVuICs9IHN0cmxlbihhcmd2W2ldKSArIDE7CisJaWYgKCFsZW4pCisJCXJldHVybiBOVUxMOworCXAgPSBzdHIgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgbGVuLCAiYXJ2Z19jb25jYXQiKTsKKwlmb3IgKGkgPSBzaGlmdDsgaSA8IGFyZ2M7IGkrKykgeworCQlzaXplX3QgYXJnbGVuOworCQltZW1jcHkocCwgYXJndltpXSwgKGFyZ2xlbiA9IHN0cmxlbihhcmd2W2ldKSkpOworCQlwICs9IGFyZ2xlbjsKKwkJKnArKyA9ICcgJzsKKwl9CisJKihwIC0gMSkgPSAnXDAnOworCXJldHVybiBzdHI7Cit9CisKKy8qIEluc3RhbGwgdG9wIG5vZGUgb2YgY29tbWFuZCB2ZWN0b3IuICovCit2b2lkIGluc3RhbGxfbm9kZShzdHJ1Y3QgY21kX25vZGUgKm5vZGUsIGludCAoKmZ1bmMpIChzdHJ1Y3QgdnR5ICopKQoreworCXZlY3Rvcl9zZXRfaW5kZXgoY21kdmVjLCBub2RlLT5ub2RlLCBub2RlKTsKKwlub2RlLT5mdW5jID0gZnVuYzsKKwlub2RlLT5jbWRfdmVjdG9yID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKK30KKworLyogQ29tcGFyZSB0d28gY29tbWFuZCdzIHN0cmluZy4gIFVzZWQgaW4gc29ydF9ub2RlICgpLiAqLworc3RhdGljIGludCBjbXBfbm9kZShjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICpxKQoreworCXN0cnVjdCBjbWRfZWxlbWVudCAqYSA9ICooc3RydWN0IGNtZF9lbGVtZW50ICoqKXA7CisJc3RydWN0IGNtZF9lbGVtZW50ICpiID0gKihzdHJ1Y3QgY21kX2VsZW1lbnQgKiopcTsKKworCXJldHVybiBzdHJjbXAoYS0+c3RyaW5nLCBiLT5zdHJpbmcpOworfQorCitzdGF0aWMgaW50IGNtcF9kZXNjKGNvbnN0IHZvaWQgKnAsIGNvbnN0IHZvaWQgKnEpCit7CisJc3RydWN0IGRlc2MgKmEgPSAqKHN0cnVjdCBkZXNjICoqKXA7CisJc3RydWN0IGRlc2MgKmIgPSAqKHN0cnVjdCBkZXNjICoqKXE7CisKKwlyZXR1cm4gc3RyY21wKGEtPmNtZCwgYi0+Y21kKTsKK30KKworLyogU29ydCBlYWNoIG5vZGUncyBjb21tYW5kIGVsZW1lbnQgYWNjb3JkaW5nIHRvIGNvbW1hbmQgc3RyaW5nLiAqLwordm9pZCBzb3J0X25vZGUoKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCXN0cnVjdCBjbWRfbm9kZSAqY25vZGU7CisJdmVjdG9yIGRlc2N2ZWM7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZHZlYyk7IGkrKykKKwkJaWYgKChjbm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgaSkpICE9IE5VTEwpIHsKKwkJCXZlY3RvciBjbWRfdmVjdG9yID0gY25vZGUtPmNtZF92ZWN0b3I7CisJCQlxc29ydChjbWRfdmVjdG9yLT5pbmRleCwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKSwKKwkJCSAgICAgIHNpemVvZih2b2lkICopLCBjbXBfbm9kZSk7CisKKwkJCWZvciAoaiA9IDA7IGogPCB2ZWN0b3JfYWN0aXZlKGNtZF92ZWN0b3IpOyBqKyspCisJCQkJaWYgKChjbWRfZWxlbWVudCA9CisJCQkJICAgICB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBqKSkgIT0gTlVMTAorCQkJCSAgICAmJiB2ZWN0b3JfYWN0aXZlKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKSB7CisJCQkJCWRlc2N2ZWMgPQorCQkJCQkgICAgdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPnN0cnZlYywKKwkJCQkJCQl2ZWN0b3JfYWN0aXZlCisJCQkJCQkJKGNtZF9lbGVtZW50LT5zdHJ2ZWMpIC0KKwkJCQkJCQkxKTsKKwkJCQkJcXNvcnQoZGVzY3ZlYy0+aW5kZXgsCisJCQkJCSAgICAgIHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYyksCisJCQkJCSAgICAgIHNpemVvZih2b2lkICopLCBjbXBfZGVzYyk7CisJCQkJfQorCQl9Cit9CisKKy8qIEJyZWFraW5nIHVwIHN0cmluZyBpbnRvIGVhY2ggY29tbWFuZCBwaWVjZS4gSSBhc3N1bWUgZ2l2ZW4KKyAgIGNoYXJhY3RlciBpcyBzZXBhcmF0ZWQgYnkgYSBzcGFjZSBjaGFyYWN0ZXIuIFJldHVybiB2YWx1ZSBpcyBhCisgICB2ZWN0b3Igd2hpY2ggaW5jbHVkZXMgY2hhciAqKiBkYXRhIGVsZW1lbnQuICovCit2ZWN0b3IgY21kX21ha2Vfc3RydmVjKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwljb25zdCBjaGFyICpjcCwgKnN0YXJ0OworCWNoYXIgKnRva2VuOworCWludCBzdHJsZW47CisJdmVjdG9yIHN0cnZlYzsKKworCWlmIChzdHJpbmcgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwljcCA9IHN0cmluZzsKKworCS8qIFNraXAgd2hpdGUgc3BhY2VzLiAqLworCXdoaWxlIChpc3NwYWNlKChpbnQpKmNwKSAmJiAqY3AgIT0gJ1wwJykKKwkJY3ArKzsKKworCS8qIFJldHVybiBpZiB0aGVyZSBpcyBvbmx5IHdoaXRlIHNwYWNlcyAqLworCWlmICgqY3AgPT0gJ1wwJykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKmNwID09ICchJyB8fCAqY3AgPT0gJyMnKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFByZXBhcmUgcmV0dXJuIHZlY3Rvci4gKi8KKwlzdHJ2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworCisJLyogQ29weSBlYWNoIGNvbW1hbmQgcGllY2UgYW5kIHNldCBpbnRvIHZlY3Rvci4gKi8KKwl3aGlsZSAoMSkgeworCQlzdGFydCA9IGNwOworCQl3aGlsZSAoIShpc3NwYWNlKChpbnQpKmNwKSB8fCAqY3AgPT0gJ1xyJyB8fCAqY3AgPT0gJ1xuJykgJiYKKwkJICAgICAgICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKwkJc3RybGVuID0gY3AgLSBzdGFydDsKKwkJdG9rZW4gPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgc3RybGVuICsgMSwgIm1ha2Vfc3RydmVjIik7CisJCW1lbWNweSh0b2tlbiwgc3RhcnQsIHN0cmxlbik7CisJCSoodG9rZW4gKyBzdHJsZW4pID0gJ1wwJzsKKwkJdmVjdG9yX3NldChzdHJ2ZWMsIHRva2VuKTsKKworCQl3aGlsZSAoKGlzc3BhY2UoKGludCkqY3ApIHx8ICpjcCA9PSAnXG4nIHx8ICpjcCA9PSAnXHInKSAmJgorCQkgICAgICAgKmNwICE9ICdcMCcpCisJCQljcCsrOworCisJCWlmICgqY3AgPT0gJ1wwJykKKwkJCXJldHVybiBzdHJ2ZWM7CisJfQorfQorCisvKiBGcmVlIGFsbG9jYXRlZCBzdHJpbmcgdmVjdG9yLiAqLwordm9pZCBjbWRfZnJlZV9zdHJ2ZWModmVjdG9yIHYpCit7CisJdW5zaWduZWQgaW50IGk7CisJY2hhciAqY3A7CisKKwlpZiAoIXYpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHYpOyBpKyspCisJCWlmICgoY3AgPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkKKwkJCXRhbGxvY19mcmVlKGNwKTsKKworCXZlY3Rvcl9mcmVlKHYpOworfQorCisvKiBGZXRjaCBuZXh0IGRlc2NyaXB0aW9uLiAgVXNlZCBpbiBjbWRfbWFrZV9kZXNjdmVjKCkuICovCitzdGF0aWMgY2hhciAqY21kX2Rlc2Nfc3RyKGNvbnN0IGNoYXIgKipzdHJpbmcpCit7CisJY29uc3QgY2hhciAqY3AsICpzdGFydDsKKwljaGFyICp0b2tlbjsKKwlpbnQgc3RybGVuOworCisJY3AgPSAqc3RyaW5nOworCisJaWYgKGNwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogU2tpcCB3aGl0ZSBzcGFjZXMuICovCisJd2hpbGUgKGlzc3BhY2UoKGludCkqY3ApICYmICpjcCAhPSAnXDAnKQorCQljcCsrOworCisJLyogUmV0dXJuIGlmIHRoZXJlIGlzIG9ubHkgd2hpdGUgc3BhY2VzICovCisJaWYgKCpjcCA9PSAnXDAnKQorCQlyZXR1cm4gTlVMTDsKKworCXN0YXJ0ID0gY3A7CisKKwl3aGlsZSAoISgqY3AgPT0gJ1xyJyB8fCAqY3AgPT0gJ1xuJykgJiYgKmNwICE9ICdcMCcpCisJCWNwKys7CisKKwlzdHJsZW4gPSBjcCAtIHN0YXJ0OworCXRva2VuID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIHN0cmxlbiArIDEsICJjbWRfZGVzY19zdHIiKTsKKwltZW1jcHkodG9rZW4sIHN0YXJ0LCBzdHJsZW4pOworCSoodG9rZW4gKyBzdHJsZW4pID0gJ1wwJzsKKworCSpzdHJpbmcgPSBjcDsKKworCXJldHVybiB0b2tlbjsKK30KKworLyogTmV3IHN0cmluZyB2ZWN0b3IuICovCitzdGF0aWMgdmVjdG9yIGNtZF9tYWtlX2Rlc2N2ZWMoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpkZXNjc3RyKQoreworCWludCBtdWx0aXBsZSA9IDA7CisJY29uc3QgY2hhciAqc3A7CisJY2hhciAqdG9rZW47CisJaW50IGxlbjsKKwljb25zdCBjaGFyICpjcDsKKwljb25zdCBjaGFyICpkcDsKKwl2ZWN0b3IgYWxsdmVjOworCXZlY3RvciBzdHJ2ZWMgPSBOVUxMOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJY3AgPSBzdHJpbmc7CisJZHAgPSBkZXNjc3RyOworCisJaWYgKGNwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJYWxsdmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKworCXdoaWxlICgxKSB7CisJCXdoaWxlIChpc3NwYWNlKChpbnQpKmNwKSAmJiAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisKKwkJaWYgKCpjcCA9PSAnKCcpIHsKKwkJCW11bHRpcGxlID0gMTsKKwkJCWNwKys7CisJCX0KKwkJaWYgKCpjcCA9PSAnKScpIHsKKwkJCW11bHRpcGxlID0gMDsKKwkJCWNwKys7CisJCX0KKwkJaWYgKCpjcCA9PSAnfCcpIHsKKwkJCWlmICghbXVsdGlwbGUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgcGFyc2UgZXJyb3IhOiAlc1xuIiwKKwkJCQkJc3RyaW5nKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJY3ArKzsKKwkJfQorCisJCXdoaWxlIChpc3NwYWNlKChpbnQpKmNwKSAmJiAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisKKwkJaWYgKCpjcCA9PSAnKCcpIHsKKwkJCW11bHRpcGxlID0gMTsKKwkJCWNwKys7CisJCX0KKworCQlpZiAoKmNwID09ICdcMCcpCisJCQlyZXR1cm4gYWxsdmVjOworCisJCXNwID0gY3A7CisKKwkJd2hpbGUgKCEKKwkJICAgICAgIChpc3NwYWNlKChpbnQpKmNwKSB8fCAqY3AgPT0gJ1xyJyB8fCAqY3AgPT0gJ1xuJworCQkJfHwgKmNwID09ICcpJyB8fCAqY3AgPT0gJ3wnKSAmJiAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisKKwkJbGVuID0gY3AgLSBzcDsKKworCQl0b2tlbiA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBsZW4gKyAxLCAiY21kX21ha2VfZGVzY3ZlYyIpOworCQltZW1jcHkodG9rZW4sIHNwLCBsZW4pOworCQkqKHRva2VuICsgbGVuKSA9ICdcMCc7CisKKwkJZGVzYyA9IHRhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIHN0cnVjdCBkZXNjKTsKKwkJZGVzYy0+Y21kID0gdG9rZW47CisJCWRlc2MtPnN0ciA9IGNtZF9kZXNjX3N0cigmZHApOworCisJCWlmIChtdWx0aXBsZSkgeworCQkJaWYgKG11bHRpcGxlID09IDEpIHsKKwkJCQlzdHJ2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworCQkJCXZlY3Rvcl9zZXQoYWxsdmVjLCBzdHJ2ZWMpOworCQkJfQorCQkJbXVsdGlwbGUrKzsKKwkJfSBlbHNlIHsKKwkJCXN0cnZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisJCQl2ZWN0b3Jfc2V0KGFsbHZlYywgc3RydmVjKTsKKwkJfQorCQl2ZWN0b3Jfc2V0KHN0cnZlYywgZGVzYyk7CisJfQorfQorCisvKiBDb3VudCBtYW5kYW50b3J5IHN0cmluZyB2ZWN0b3Igc2l6ZS4gIFRoaXMgaXMgdG8gZGV0ZXJtaW5lIGlucHV0ZWQKKyAgIGNvbW1hbmQgaGFzIGVub3VnaCBjb21tYW5kIGxlbmd0aC4gKi8KK3N0YXRpYyBpbnQgY21kX2NtZHNpemUodmVjdG9yIHN0cnZlYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgc2l6ZSA9IDA7CisJdmVjdG9yIGRlc2N2ZWM7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShzdHJ2ZWMpOyBpKyspCisJCWlmICgoZGVzY3ZlYyA9IHZlY3Rvcl9zbG90KHN0cnZlYywgaSkpICE9IE5VTEwpIHsKKwkJCWlmICgodmVjdG9yX2FjdGl2ZShkZXNjdmVjKSkgPT0gMQorCQkJICAgICYmIChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3ZlYywgMCkpICE9IE5VTEwpIHsKKwkJCQlpZiAoZGVzYy0+Y21kID09IE5VTEwgfHwgQ01EX09QVElPTihkZXNjLT5jbWQpKQorCQkJCQlyZXR1cm4gc2l6ZTsKKwkJCQllbHNlCisJCQkJCXNpemUrKzsKKwkJCX0gZWxzZQorCQkJCXNpemUrKzsKKwkJfQorCXJldHVybiBzaXplOworfQorCisvKiBSZXR1cm4gcHJvbXB0IGNoYXJhY3RlciBvZiBzcGVjaWZpZWQgbm9kZS4gKi8KK2NvbnN0IGNoYXIgKmNtZF9wcm9tcHQoZW51bSBub2RlX3R5cGUgbm9kZSkKK3sKKwlzdHJ1Y3QgY21kX25vZGUgKmNub2RlOworCisJY25vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIG5vZGUpOworCXJldHVybiBjbm9kZS0+cHJvbXB0OworfQorCisvKiBJbnN0YWxsIGEgY29tbWFuZCBpbnRvIGEgbm9kZS4gKi8KK3ZvaWQgaW5zdGFsbF9lbGVtZW50KGVudW0gbm9kZV90eXBlIG50eXBlLCBzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZCkKK3sKKwlzdHJ1Y3QgY21kX25vZGUgKmNub2RlOworCisJY25vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIG50eXBlKTsKKworCWlmIChjbm9kZSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkNvbW1hbmQgbm9kZSAlZCBkb2Vzbid0IGV4aXN0LCBwbGVhc2UgY2hlY2sgaXRcbiIsCisJCQludHlwZSk7CisJCWV4aXQoMSk7CisJfQorCisJdmVjdG9yX3NldChjbm9kZS0+Y21kX3ZlY3RvciwgY21kKTsKKworCWNtZC0+c3RydmVjID0gY21kX21ha2VfZGVzY3ZlYyhjbWQtPnN0cmluZywgY21kLT5kb2MpOworCWNtZC0+Y21kc2l6ZSA9IGNtZF9jbWRzaXplKGNtZC0+c3RydmVjKTsKK30KKworLyogSW5zdGFsbCBhIGNvbW1hbmQgaW50byBWSUVXIGFuZCBFTkFCTEUgbm9kZSAqLwordm9pZCBpbnN0YWxsX2VsZW1lbnRfdmUoc3RydWN0IGNtZF9lbGVtZW50ICpjbWQpCit7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsIGNtZCk7Cit9CisKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGl0b2E2NFtdID0KKyAgICAiLi8wMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisKK3N0YXRpYyB2b2lkIHRvNjQoY2hhciAqcywgbG9uZyB2LCBpbnQgbikKK3sKKwl3aGlsZSAoLS1uID49IDApIHsKKwkJKnMrKyA9IGl0b2E2NFt2ICYgMHgzZl07CisJCXYgPj49IDY7CisJfQorfQorCitzdGF0aWMgY2hhciAqemVuY3J5cHQoY29uc3QgY2hhciAqcGFzc3dkKQoreworCWNoYXIgc2FsdFs2XTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwljaGFyICpjcnlwdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCAwKTsKKworCXRvNjQoJnNhbHRbMF0sIHJhbmRvbSgpLCAzKTsKKwl0bzY0KCZzYWx0WzNdLCB0di50dl91c2VjLCAzKTsKKwlzYWx0WzVdID0gJ1wwJzsKKworCXJldHVybiBjcnlwdChwYXNzd2QsIHNhbHQpOworfQorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gd3JpdGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIGhvc3QuICovCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9ob3N0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAoaG9zdC5uYW1lKQorCQl2dHlfb3V0KHZ0eSwgImhvc3RuYW1lICVzJXMiLCBob3N0Lm5hbWUsIFZUWV9ORVdMSU5FKTsKKworCWlmIChob3N0LmVuY3J5cHQpIHsKKwkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJCXZ0eV9vdXQodnR5LCAicGFzc3dvcmQgOCAlcyVzIiwgaG9zdC5wYXNzd29yZF9lbmNyeXB0LAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCQl2dHlfb3V0KHZ0eSwgImVuYWJsZSBwYXNzd29yZCA4ICVzJXMiLAorCQkJCWhvc3QuZW5hYmxlX2VuY3J5cHQsIFZUWV9ORVdMSU5FKTsKKwl9IGVsc2UgeworCQlpZiAoaG9zdC5wYXNzd29yZCkKKwkJCXZ0eV9vdXQodnR5LCAicGFzc3dvcmQgJXMlcyIsIGhvc3QucGFzc3dvcmQsCisJCQkJVlRZX05FV0xJTkUpOworCQlpZiAoaG9zdC5lbmFibGUpCisJCQl2dHlfb3V0KHZ0eSwgImVuYWJsZSBwYXNzd29yZCAlcyVzIiwgaG9zdC5lbmFibGUsCisJCQkJVlRZX05FV0xJTkUpOworCX0KKworI2lmIDAKKwlpZiAoemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCAhPSBMT0dfREVCVUcpIHsKKwkJdnR5X291dCh2dHksICIhIE4uQi4gVGhlICdsb2cgdHJhcCcgY29tbWFuZCBpcyBkZXByZWNhdGVkLiVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICJsb2cgdHJhcCAlcyVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bF0sIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlpZiAoaG9zdC5sb2dmaWxlCisJICAgICYmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfRklMRV0gIT0gWkxPR19ESVNBQkxFRCkpIHsKKwkJdnR5X291dCh2dHksICJsb2cgZmlsZSAlcyIsIGhvc3QubG9nZmlsZSk7CisJCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfRklMRV0gIT0KKwkJICAgIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpCisJCQl2dHlfb3V0KHZ0eSwgIiAlcyIsCisJCQkJemxvZ19wcmlvcml0eVt6bG9nX2RlZmF1bHQtPgorCQkJCQkgICAgICBtYXhsdmxbWkxPR19ERVNUX0ZJTEVdXSk7CisJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJfQorCisJaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9TVERPVVRdICE9IFpMT0dfRElTQUJMRUQpIHsKKwkJdnR5X291dCh2dHksICJsb2cgc3Rkb3V0Iik7CisJCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfU1RET1VUXSAhPQorCQkgICAgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCkKKwkJCXZ0eV9vdXQodnR5LCAiICVzIiwKKwkJCQl6bG9nX3ByaW9yaXR5W3psb2dfZGVmYXVsdC0+CisJCQkJCSAgICAgIG1heGx2bFtaTE9HX0RFU1RfU1RET1VUXV0pOworCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCX0KKworCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl0gPT0gWkxPR19ESVNBQkxFRCkKKwkJdnR5X291dCh2dHksICJubyBsb2cgbW9uaXRvciVzIiwgVlRZX05FV0xJTkUpOworCWVsc2UgaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXSAhPQorCQkgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCkKKwkJdnR5X291dCh2dHksICJsb2cgbW9uaXRvciAlcyVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX01PTklUT1JdXSwKKwkJCVZUWV9ORVdMSU5FKTsKKworCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfU1lTTE9HXSAhPSBaTE9HX0RJU0FCTEVEKSB7CisJCXZ0eV9vdXQodnR5LCAibG9nIHN5c2xvZyIpOworCQlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX1NZU0xPR10gIT0KKwkJICAgIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpCisJCQl2dHlfb3V0KHZ0eSwgIiAlcyIsCisJCQkJemxvZ19wcmlvcml0eVt6bG9nX2RlZmF1bHQtPgorCQkJCQkgICAgICBtYXhsdmxbWkxPR19ERVNUX1NZU0xPR11dKTsKKwkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlpZiAoemxvZ19kZWZhdWx0LT5mYWNpbGl0eSAhPSBMT0dfREFFTU9OKQorCQl2dHlfb3V0KHZ0eSwgImxvZyBmYWNpbGl0eSAlcyVzIiwKKwkJCWZhY2lsaXR5X25hbWUoemxvZ19kZWZhdWx0LT5mYWNpbGl0eSksIFZUWV9ORVdMSU5FKTsKKworCWlmICh6bG9nX2RlZmF1bHQtPnJlY29yZF9wcmlvcml0eSA9PSAxKQorCQl2dHlfb3V0KHZ0eSwgImxvZyByZWNvcmQtcHJpb3JpdHklcyIsIFZUWV9ORVdMSU5FKTsKKyNlbmRpZgorCWlmIChob3N0LmFkdmFuY2VkKQorCQl2dHlfb3V0KHZ0eSwgInNlcnZpY2UgYWR2YW5jZWQtdnR5JXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoaG9zdC5lbmNyeXB0KQorCQl2dHlfb3V0KHZ0eSwgInNlcnZpY2UgcGFzc3dvcmQtZW5jcnlwdGlvbiVzIiwgVlRZX05FV0xJTkUpOworCisJaWYgKGhvc3QubGluZXMgPj0gMCkKKwkJdnR5X291dCh2dHksICJzZXJ2aWNlIHRlcm1pbmFsLWxlbmd0aCAlZCVzIiwgaG9zdC5saW5lcywKKwkJCVZUWV9ORVdMSU5FKTsKKworCWlmIChob3N0Lm1vdGRmaWxlKQorCQl2dHlfb3V0KHZ0eSwgImJhbm5lciBtb3RkIGZpbGUgJXMlcyIsIGhvc3QubW90ZGZpbGUsCisJCQlWVFlfTkVXTElORSk7CisJZWxzZSBpZiAoIWhvc3QubW90ZCkKKwkJdnR5X291dCh2dHksICJubyBiYW5uZXIgbW90ZCVzIiwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGdldHRpbmcgY29tbWFuZCB2ZWN0b3IuICovCitzdGF0aWMgdmVjdG9yIGNtZF9ub2RlX3ZlY3Rvcih2ZWN0b3IgdiwgZW51bSBub2RlX3R5cGUgbnR5cGUpCit7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZSA9IHZlY3Rvcl9zbG90KHYsIG50eXBlKTsKKwlyZXR1cm4gY25vZGUtPmNtZF92ZWN0b3I7Cit9CisKKyNpZiAwCisvKiBGaWx0ZXIgY29tbWFuZCB2ZWN0b3IgYnkgc3ltYm9sLiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgYWN0dWFsbHkgdXNlZDsKKyAqIHNob3VsZCBpdCBiZSBkZWxldGVkPyAqLworc3RhdGljIGludCBjbWRfZmlsdGVyX2J5X3N5bWJvbChjaGFyICpjb21tYW5kLCBjaGFyICpzeW1ib2wpCit7CisJaW50IGksIGxpbTsKKworCWlmIChzdHJjbXAoc3ltYm9sLCAiSVBWNF9BRERSRVNTIikgPT0gMCkgeworCQlpID0gMDsKKwkJbGltID0gc3RybGVuKGNvbW1hbmQpOworCQl3aGlsZSAoaSA8IGxpbSkgeworCQkJaWYgKCEKKwkJCSAgICAoaXNkaWdpdCgoaW50KWNvbW1hbmRbaV0pIHx8IGNvbW1hbmRbaV0gPT0gJy4nCisJCQkgICAgIHx8IGNvbW1hbmRbaV0gPT0gJy8nKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWkrKzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cmNtcChzeW1ib2wsICJTVFJJTkciKSA9PSAwKSB7CisJCWkgPSAwOworCQlsaW0gPSBzdHJsZW4oY29tbWFuZCk7CisJCXdoaWxlIChpIDwgbGltKSB7CisJCQlpZiAoIQorCQkJICAgIChpc2FscGhhKChpbnQpY29tbWFuZFtpXSkgfHwgY29tbWFuZFtpXSA9PSAnXycKKwkJCSAgICAgfHwgY29tbWFuZFtpXSA9PSAnLScpKQorCQkJCXJldHVybiAxOworCQkJaSsrOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAoc3RyY21wKHN5bWJvbCwgIklGTkFNRSIpID09IDApIHsKKwkJaSA9IDA7CisJCWxpbSA9IHN0cmxlbihjb21tYW5kKTsKKwkJd2hpbGUgKGkgPCBsaW0pIHsKKwkJCWlmICghaXNhbG51bSgoaW50KWNvbW1hbmRbaV0pKQorCQkJCXJldHVybiAxOworCQkJaSsrOworCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBDb21wbGV0aW9uIG1hdGNoIHR5cGVzLiAqLworZW51bSBtYXRjaF90eXBlIHsKKwlub19tYXRjaCwKKwlleHRlbmRfbWF0Y2gsCisJaXB2NF9wcmVmaXhfbWF0Y2gsCisJaXB2NF9tYXRjaCwKKwlpcHY2X3ByZWZpeF9tYXRjaCwKKwlpcHY2X21hdGNoLAorCXJhbmdlX21hdGNoLAorCXZhcmFyZ19tYXRjaCwKKwlwYXJ0bHlfbWF0Y2gsCisJZXhhY3RfbWF0Y2gKK307CisKK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUgY21kX2lwdjRfbWF0Y2goY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKnNwOworCWludCBkb3RzID0gMCwgbnVtcyA9IDA7CisJY2hhciBidWZbNF07CisKKwlpZiAoc3RyID09IE5VTEwpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwlmb3IgKDs7KSB7CisJCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwkJc3AgPSBzdHI7CisJCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKKwkJCWlmICgqc3RyID09ICcuJykgeworCQkJCWlmIChkb3RzID49IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICcuJykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJ1wwJykKKwkJCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCQkJCWRvdHMrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQorCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJc3RyKys7CisJCX0KKworCQlpZiAoc3RyIC0gc3AgPiAzKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cm5jcHkoYnVmLCBzcCwgc3RyIC0gc3ApOworCQlpZiAoYXRvaShidWYpID4gMjU1KQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCW51bXMrKzsKKworCQlpZiAoKnN0ciA9PSAnXDAnKQorCQkJYnJlYWs7CisKKwkJc3RyKys7CisJfQorCisJaWYgKG51bXMgPCA0KQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJcmV0dXJuIGV4YWN0X21hdGNoOworfQorCitzdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY0X3ByZWZpeF9tYXRjaChjb25zdCBjaGFyICpzdHIpCit7CisJY29uc3QgY2hhciAqc3A7CisJaW50IGRvdHMgPSAwOworCWNoYXIgYnVmWzRdOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJZm9yICg7OykgeworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCXNwID0gc3RyOworCQl3aGlsZSAoKnN0ciAhPSAnXDAnICYmICpzdHIgIT0gJy8nKSB7CisJCQlpZiAoKnN0ciA9PSAnLicpIHsKKwkJCQlpZiAoZG90cyA9PSAzKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnLicgfHwgKihzdHIgKyAxKSA9PSAnLycpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCisJCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJCQlkb3RzKys7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQorCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJc3RyKys7CisJCX0KKworCQlpZiAoc3RyIC0gc3AgPiAzKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cm5jcHkoYnVmLCBzcCwgc3RyIC0gc3ApOworCQlpZiAoYXRvaShidWYpID4gMjU1KQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCWlmIChkb3RzID09IDMpIHsKKwkJCWlmICgqc3RyID09ICcvJykgeworCQkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCisJCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJCQlzdHIrKzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoKnN0ciA9PSAnXDAnKQorCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisJCX0KKworCQlpZiAoKnN0ciA9PSAnXDAnKQorCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKwlzcCA9IHN0cjsKKwl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CisJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cisrOworCX0KKworCWlmIChhdG9pKHNwKSA+IDMyKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwlyZXR1cm4gZXhhY3RfbWF0Y2g7Cit9CisKKyNkZWZpbmUgSVBWNl9BRERSX1NUUgkJIjAxMjM0NTY3ODlhYmNkZWZBQkNERUY6LiUiCisjZGVmaW5lIElQVjZfUFJFRklYX1NUUgkJIjAxMjM0NTY3ODlhYmNkZWZBQkNERUY6LiUvIgorI2RlZmluZSBTVEFURV9TVEFSVAkJMQorI2RlZmluZSBTVEFURV9DT0xPTgkJMgorI2RlZmluZSBTVEFURV9ET1VCTEUJCTMKKyNkZWZpbmUgU1RBVEVfQUREUgkJNAorI2RlZmluZSBTVEFURV9ET1QgICAgICAgICAgICAgICA1CisjZGVmaW5lIFNUQVRFX1NMQVNICQk2CisjZGVmaW5lIFNUQVRFX01BU0sJCTcKKworI2lmZGVmIEhBVkVfSVBWNgorCitzdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY2X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgc3RhdGUgPSBTVEFURV9TVEFSVDsKKwlpbnQgY29sb25zID0gMCwgbnVtcyA9IDAsIGRvdWJsZV9jb2xvbiA9IDA7CisJY29uc3QgY2hhciAqc3AgPSBOVUxMOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNl9kdW1teTsKKwlpbnQgcmV0OworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJaWYgKHN0cnNwbihzdHIsIElQVjZfQUREUl9TVFIpICE9IHN0cmxlbihzdHIpKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkvKiB1c2UgaW5ldF9wdG9uIHRoYXQgaGFzIGEgYmV0dGVyIHN1cHBvcnQsCisJICogZm9yIGV4YW1wbGUgaW5ldF9wdG9uIGNhbiBzdXBwb3J0IHRoZSBhdXRvbWF0aWMgYWRkcmVzc2VzOgorCSAqICA6OjEuMi4zLjQKKwkgKi8KKwlyZXQgPSBpbmV0X3B0b24oQUZfSU5FVDYsIHN0ciwgJnNpbjZfZHVtbXkuc2luNl9hZGRyKTsKKworCWlmIChyZXQgPT0gMSkKKwkJcmV0dXJuIGV4YWN0X21hdGNoOworCisJd2hpbGUgKCpzdHIgIT0gJ1wwJykgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgU1RBVEVfU1RBUlQ6CisJCQlpZiAoKnN0ciA9PSAnOicpIHsKKwkJCQlpZiAoKihzdHIgKyAxKSAhPSAnOicgJiYgKihzdHIgKyAxKSAhPSAnXDAnKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisJCQkJY29sb25zLS07CisJCQkJc3RhdGUgPSBTVEFURV9DT0xPTjsKKwkJCX0gZWxzZSB7CisJCQkJc3AgPSBzdHI7CisJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCisJCQljb250aW51ZTsKKwkJY2FzZSBTVEFURV9DT0xPTjoKKwkJCWNvbG9ucysrOworCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCXN0YXRlID0gU1RBVEVfRE9VQkxFOworCQkJZWxzZSB7CisJCQkJc3AgPSBzdHIgKyAxOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RPVUJMRToKKwkJCWlmIChkb3VibGVfY29sb24pCisJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQlpZiAoKihzdHIgKyAxKSA9PSAnOicpCisJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJZWxzZSB7CisJCQkJaWYgKCooc3RyICsgMSkgIT0gJ1wwJykKKwkJCQkJY29sb25zKys7CisJCQkJc3AgPSBzdHIgKyAxOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKworCQkJZG91YmxlX2NvbG9uKys7CisJCQludW1zKys7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9BRERSOgorCQkJaWYgKCooc3RyICsgMSkgPT0gJzonIHx8ICooc3RyICsgMSkgPT0gJ1wwJykgeworCQkJCWlmIChzdHIgLSBzcCA+IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCW51bXMrKzsKKwkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJfQorCQkJaWYgKCooc3RyICsgMSkgPT0gJy4nKQorCQkJCXN0YXRlID0gU1RBVEVfRE9UOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfRE9UOgorCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChudW1zID4gOCkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlpZiAoY29sb25zID4gNykKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKyNpZiAwCisJaWYgKG51bXMgPCAxMSkKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKyNlbmRpZgkJCQkvKiAwICovCisKKwlyZXR1cm4gZXhhY3RfbWF0Y2g7Cit9CisKK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUgY21kX2lwdjZfcHJlZml4X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgc3RhdGUgPSBTVEFURV9TVEFSVDsKKwlpbnQgY29sb25zID0gMCwgbnVtcyA9IDAsIGRvdWJsZV9jb2xvbiA9IDA7CisJaW50IG1hc2s7CisJY29uc3QgY2hhciAqc3AgPSBOVUxMOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisKKwlpZiAoc3RyID09IE5VTEwpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwlpZiAoc3Ryc3BuKHN0ciwgSVBWNl9QUkVGSVhfU1RSKSAhPSBzdHJsZW4oc3RyKSkKKwkJcmV0dXJuIG5vX21hdGNoOworCisJd2hpbGUgKCpzdHIgIT0gJ1wwJyAmJiBzdGF0ZSAhPSBTVEFURV9NQVNLKSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBTVEFURV9TVEFSVDoKKwkJCWlmICgqc3RyID09ICc6JykgeworCQkJCWlmICgqKHN0ciArIDEpICE9ICc6JyAmJiAqKHN0ciArIDEpICE9ICdcMCcpCisJCQkJCXJldHVybiBub19tYXRjaDsKKwkJCQljb2xvbnMtLTsKKwkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJfSBlbHNlIHsKKwkJCQlzcCA9IHN0cjsKKwkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisKKwkJCWNvbnRpbnVlOworCQljYXNlIFNUQVRFX0NPTE9OOgorCQkJY29sb25zKys7CisJCQlpZiAoKihzdHIgKyAxKSA9PSAnLycpCisJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJZWxzZSBpZiAoKihzdHIgKyAxKSA9PSAnOicpCisJCQkJc3RhdGUgPSBTVEFURV9ET1VCTEU7CisJCQllbHNlIHsKKwkJCQlzcCA9IHN0ciArIDE7CisJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfRE9VQkxFOgorCQkJaWYgKGRvdWJsZV9jb2xvbikKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JykKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisJCQllbHNlIHsKKwkJCQlpZiAoKihzdHIgKyAxKSAhPSAnXDAnICYmICooc3RyICsgMSkgIT0gJy8nKQorCQkJCQljb2xvbnMrKzsKKwkJCQlzcCA9IHN0ciArIDE7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnLycpCisJCQkJCXN0YXRlID0gU1RBVEVfU0xBU0g7CisJCQkJZWxzZQorCQkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisKKwkJCWRvdWJsZV9jb2xvbisrOworCQkJbnVtcyArPSAxOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfQUREUjoKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JyB8fCAqKHN0ciArIDEpID09ICcuJworCQkJICAgIHx8ICooc3RyICsgMSkgPT0gJ1wwJyB8fCAqKHN0ciArIDEpID09ICcvJykgeworCQkJCWlmIChzdHIgLSBzcCA+IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWZvciAoOyBzcCA8PSBzdHI7IHNwKyspCisJCQkJCWlmICgqc3AgPT0gJy8nKQorCQkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJbnVtcysrOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJCWVsc2UgaWYgKCooc3RyICsgMSkgPT0gJy4nKQorCQkJCQlzdGF0ZSA9IFNUQVRFX0RPVDsKKwkJCQllbHNlIGlmICgqKHN0ciArIDEpID09ICcvJykKKwkJCQkJc3RhdGUgPSBTVEFURV9TTEFTSDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RPVDoKKwkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX1NMQVNIOgorCQkJaWYgKCooc3RyICsgMSkgPT0gJ1wwJykKKwkJCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJCQlzdGF0ZSA9IFNUQVRFX01BU0s7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG51bXMgPiAxMSkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlpZiAoY29sb25zID4gNykKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKwlpZiAoc3RhdGUgPCBTVEFURV9NQVNLKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJbWFzayA9IHN0cnRvbChzdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoKmVuZHB0ciAhPSAnXDAnKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwlpZiAobWFzayA8IDAgfHwgbWFzayA+IDEyOCkKKwkJcmV0dXJuIG5vX21hdGNoOworCisvKiBJIGRvbid0IGtub3cgd2h5IG1hc2sgPCAxMyBtYWtlcyBjb21tYW5kIG1hdGNoIHBhcnRseS4KKyAgIEZvcmdpdmUgbWUgdG8gbWFrZSB0aGlzIGNvbW1lbnRzLiBJIFdhbnQgdG8gc2V0IHN0YXRpYyBkZWZhdWx0IHJvdXRlCisgICBiZWNhdXNlIG9mIGxhY2sgb2YgZnVuY3Rpb24gdG8gb3JpZ2luYXRlIGRlZmF1bHQgaW4gb3NwZjZkOyBzb3JyeQorICAgICAgIHlhc3UKKyAgaWYgKG1hc2sgPCAxMykKKyAgICByZXR1cm4gcGFydGx5X21hdGNoOworKi8KKworCXJldHVybiBleGFjdF9tYXRjaDsKK30KKworI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KKworI2RlZmluZSBERUNJTUFMX1NUUkxFTl9NQVggMTAKKworc3RhdGljIGludCBjbWRfcmFuZ2VfbWF0Y2goY29uc3QgY2hhciAqcmFuZ2UsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyICpwOworCWNoYXIgYnVmW0RFQ0lNQUxfU1RSTEVOX01BWCArIDFdOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBtaW4sIG1heCwgdmFsOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCXZhbCA9IHN0cnRvdWwoc3RyLCAmZW5kcHRyLCAxMCk7CisJaWYgKCplbmRwdHIgIT0gJ1wwJykKKwkJcmV0dXJuIDA7CisKKwlyYW5nZSsrOworCXAgPSBzdHJjaHIocmFuZ2UsICctJyk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKHAgLSByYW5nZSA+IERFQ0lNQUxfU1RSTEVOX01BWCkKKwkJcmV0dXJuIDA7CisJc3RybmNweShidWYsIHJhbmdlLCBwIC0gcmFuZ2UpOworCWJ1ZltwIC0gcmFuZ2VdID0gJ1wwJzsKKwltaW4gPSBzdHJ0b3VsKGJ1ZiwgJmVuZHB0ciwgMTApOworCWlmICgqZW5kcHRyICE9ICdcMCcpCisJCXJldHVybiAwOworCisJcmFuZ2UgPSBwICsgMTsKKwlwID0gc3RyY2hyKHJhbmdlLCAnPicpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChwIC0gcmFuZ2UgPiBERUNJTUFMX1NUUkxFTl9NQVgpCisJCXJldHVybiAwOworCXN0cm5jcHkoYnVmLCByYW5nZSwgcCAtIHJhbmdlKTsKKwlidWZbcCAtIHJhbmdlXSA9ICdcMCc7CisJbWF4ID0gc3RydG91bChidWYsICZlbmRwdHIsIDEwKTsKKwlpZiAoKmVuZHB0ciAhPSAnXDAnKQorCQlyZXR1cm4gMDsKKworCWlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiBNYWtlIGNvbXBsZXRpb24gbWF0Y2ggYW5kIHJldHVybiBtYXRjaCB0eXBlIGZsYWcuICovCitzdGF0aWMgZW51bSBtYXRjaF90eXBlCitjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY2hhciAqY29tbWFuZCwgdmVjdG9yIHYsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyICpzdHI7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2hfdHlwZTsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCW1hdGNoX3R5cGUgPSBub19tYXRjaDsKKworCS8qIElmIGNvbW1hbmQgYW5kIGNtZF9lbGVtZW50IHN0cmluZyBkb2VzIG5vdCBtYXRjaCBzZXQgTlVMTCB0byB2ZWN0b3IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpIHsKKwkJCWlmIChpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCXVuc2lnbmVkIGludCBqOworCQkJCWludCBtYXRjaGVkID0gMDsKKworCQkJCWRlc2N2ZWMgPQorCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLCBpbmRleCk7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCXN0ciA9IGRlc2MtPmNtZDsKKworCQkJCQkJaWYgKENNRF9WQVJBUkcoc3RyKSkgeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgdmFyYXJnX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIHZhcmFyZ19tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UgaWYgKENNRF9SQU5HRShzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9yYW5nZV9tYXRjaAorCQkJCQkJCSAgICAoc3RyLCBjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICByYW5nZV9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0KKyNpZmRlZiBIQVZFX0lQVjYKKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY2KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjZfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjZfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjZfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjZfUFJFRklYKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjZfcHJlZml4X21hdGNoKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY2X3ByZWZpeF9tYXRjaDsKKworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY0KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjRfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjRfUFJFRklYKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfcHJlZml4X21hdGNoKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfcHJlZml4X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaDsKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZQorCQkJCQkJCS8qIENoZWNrIGlzIHRoaXMgcG9pbnQncyBhcmd1bWVudCBvcHRpb25hbCA/ICovCisJCQkJCQlpZiAoQ01EX09QVElPTihzdHIpCisJCQkJCQkJICAgIHx8CisJCQkJCQkJICAgIENNRF9WQVJJQUJMRShzdHIpKSB7CisJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCSAgICBleHRlbmRfbWF0Y2gpCisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgZXh0ZW5kX21hdGNoOworCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCX0gZWxzZQorCQkJCQkJICAgIGlmIChzdHJuY21wCisJCQkJCQkJKGNvbW1hbmQsIHN0ciwKKwkJCQkJCQkgc3RybGVuKGNvbW1hbmQpKSA9PQorCQkJCQkJCTApIHsKKwkJCQkJCQlpZiAoc3RyY21wKGNvbW1hbmQsIHN0cikKKwkJCQkJCQkgICAgPT0gMCkKKwkJCQkJCQkJbWF0Y2hfdHlwZSA9CisJCQkJCQkJCSAgICBleGFjdF9tYXRjaDsKKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgcGFydGx5X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBwYXJ0bHlfbWF0Y2g7CisJCQkJCQkJfQorCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCWlmICghbWF0Y2hlZCkKKwkJCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOworCQkJfQorCQl9CisJcmV0dXJuIG1hdGNoX3R5cGU7Cit9CisKKy8qIEZpbHRlciB2ZWN0b3IgYnkgY29tbWFuZCBjaGFyYWN0ZXIgd2l0aCBpbmRleC4gKi8KK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUKK2NtZF9maWx0ZXJfYnlfc3RyaW5nKGNoYXIgKmNvbW1hbmQsIHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgY2hhciAqc3RyOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJZW51bSBtYXRjaF90eXBlIG1hdGNoX3R5cGU7CisJdmVjdG9yIGRlc2N2ZWM7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwltYXRjaF90eXBlID0gbm9fbWF0Y2g7CisKKwkvKiBJZiBjb21tYW5kIGFuZCBjbWRfZWxlbWVudCBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggc2V0IE5VTEwgdG8gdmVjdG9yICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKSB7CisJCQkvKiBJZiBnaXZlbiBpbmRleCBpcyBiaWdnZXIgdGhhbiBtYXggc3RyaW5nIHZlY3RvciBvZiBjb21tYW5kLAorCQkJICAgc2V0IE5VTEwgKi8KKwkJCWlmIChpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCXVuc2lnbmVkIGludCBqOworCQkJCWludCBtYXRjaGVkID0gMDsKKworCQkJCWRlc2N2ZWMgPQorCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLCBpbmRleCk7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCXN0ciA9IGRlc2MtPmNtZDsKKworCQkJCQkJaWYgKENNRF9WQVJBUkcoc3RyKSkgeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgdmFyYXJnX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIHZhcmFyZ19tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UgaWYgKENNRF9SQU5HRShzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9yYW5nZV9tYXRjaAorCQkJCQkJCSAgICAoc3RyLCBjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICByYW5nZV9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9CisjaWZkZWYgSEFWRV9JUFY2CisJCQkJCQllbHNlIGlmIChDTURfSVBWNihzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY2X21hdGNoCisJCQkJCQkJICAgIChjb21tYW5kKSA9PQorCQkJCQkJCSAgICBleGFjdF9tYXRjaCkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY2X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY2X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChDTURfSVBWNl9QUkVGSVgoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2Nl9wcmVmaXhfbWF0Y2goY29tbWFuZCkgPT0gZXhhY3RfbWF0Y2gpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2Nl9wcmVmaXhfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY0KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpID09CisJCQkJCQkJICAgIGV4YWN0X21hdGNoKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjRfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9JUFY0X1BSRUZJWChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY0X3ByZWZpeF9tYXRjaChjb21tYW5kKSA9PSBleGFjdF9tYXRjaCkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2NF9wcmVmaXhfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJCSAgIHx8IENNRF9WQVJJQUJMRShzdHIpKQorCQkJCQkJeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgZXh0ZW5kX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIGV4dGVuZF9tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChzdHJjbXAoY29tbWFuZCwgc3RyKQorCQkJCQkJCSAgICA9PSAwKSB7CisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgZXhhY3RfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQlpZiAoIW1hdGNoZWQpCisJCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCX0KKwkJfQorCXJldHVybiBtYXRjaF90eXBlOworfQorCisvKiBDaGVjayBhbWJpZ3VvdXMgbWF0Y2ggKi8KK3N0YXRpYyBpbnQKK2lzX2NtZF9hbWJpZ3VvdXMoY2hhciAqY29tbWFuZCwgdmVjdG9yIHYsIGludCBpbmRleCwgZW51bSBtYXRjaF90eXBlIHR5cGUpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGo7CisJY29uc3QgY2hhciAqc3RyID0gTlVMTDsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCWNvbnN0IGNoYXIgKm1hdGNoZWQgPSBOVUxMOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKSB7CisJCQlpbnQgbWF0Y2ggPSAwOworCisJCQlkZXNjdmVjID0gdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPnN0cnZlYywgaW5kZXgpOworCisJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgeworCQkJCQllbnVtIG1hdGNoX3R5cGUgcmV0OworCisJCQkJCXN0ciA9IGRlc2MtPmNtZDsKKworCQkJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCQkJY2FzZSBleGFjdF9tYXRjaDoKKwkJCQkJCWlmICghCisJCQkJCQkgICAgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJICAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKyYmIHN0cmNtcChjb21tYW5kLCBzdHIpID09IDApCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHBhcnRseV9tYXRjaDoKKwkJCQkJCWlmICghCisJCQkJCQkgICAgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJICAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKyYmIHN0cm5jbXAoY29tbWFuZCwgc3RyLCBzdHJsZW4oY29tbWFuZCkpID09IDApIHsKKwkJCQkJCQlpZiAobWF0Y2hlZAorCQkJCQkJCSAgICAmJiBzdHJjbXAobWF0Y2hlZCwKKwkJCQkJCQkJICAgICAgc3RyKSAhPSAwKQorCQkJCQkJCQlyZXR1cm4gMTsJLyogVGhlcmUgaXMgYW1iaWd1b3VzIG1hdGNoLiAqLworCQkJCQkJCWVsc2UKKwkJCQkJCQkJbWF0Y2hlZCA9IHN0cjsKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgcmFuZ2VfbWF0Y2g6CisJCQkJCQlpZiAoY21kX3JhbmdlX21hdGNoCisJCQkJCQkgICAgKHN0ciwgY29tbWFuZCkpIHsKKwkJCQkJCQlpZiAobWF0Y2hlZAorCQkJCQkJCSAgICAmJiBzdHJjbXAobWF0Y2hlZCwKKwkJCQkJCQkJICAgICAgc3RyKSAhPSAwKQorCQkJCQkJCQlyZXR1cm4gMTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCW1hdGNoZWQgPSBzdHI7CisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworI2lmZGVmIEhBVkVfSVBWNgorCQkJCQljYXNlIGlwdjZfbWF0Y2g6CisJCQkJCQlpZiAoQ01EX0lQVjYoc3RyKSkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgaXB2Nl9wcmVmaXhfbWF0Y2g6CisJCQkJCQlpZiAoKHJldCA9CisJCQkJCQkgICAgIGNtZF9pcHY2X3ByZWZpeF9tYXRjaAorCQkJCQkJICAgICAoY29tbWFuZCkpICE9IG5vX21hdGNoKSB7CisJCQkJCQkJaWYgKHJldCA9PSBwYXJ0bHlfbWF0Y2gpCisJCQkJCQkJCXJldHVybiAyOwkvKiBUaGVyZSBpcyBpbmNvbXBsZXRlIG1hdGNoLiAqLworCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAqLworCQkJCQljYXNlIGlwdjRfbWF0Y2g6CisJCQkJCQlpZiAoQ01EX0lQVjQoc3RyKSkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgaXB2NF9wcmVmaXhfbWF0Y2g6CisJCQkJCQlpZiAoKHJldCA9CisJCQkJCQkgICAgIGNtZF9pcHY0X3ByZWZpeF9tYXRjaAorCQkJCQkJICAgICAoY29tbWFuZCkpICE9IG5vX21hdGNoKSB7CisJCQkJCQkJaWYgKHJldCA9PSBwYXJ0bHlfbWF0Y2gpCisJCQkJCQkJCXJldHVybiAyOwkvKiBUaGVyZSBpcyBpbmNvbXBsZXRlIG1hdGNoLiAqLworCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIGV4dGVuZF9tYXRjaDoKKwkJCQkJCWlmIChDTURfT1BUSU9OKHN0cikKKwkJCQkJCSAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2Ugbm9fbWF0Y2g6CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCWlmICghbWF0Y2gpCisJCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOworCQl9CisJcmV0dXJuIDA7Cit9CisKKy8qIElmIHNyYyBtYXRjaGVzIGRzdCByZXR1cm4gZHN0IHN0cmluZywgb3RoZXJ3aXNlIHJldHVybiBOVUxMICovCitzdGF0aWMgY29uc3QgY2hhciAqY21kX2VudHJ5X2Z1bmN0aW9uKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZHN0KQoreworCS8qIFNraXAgdmFyaWFibGUgYXJndW1lbnRzLiAqLworCWlmIChDTURfT1BUSU9OKGRzdCkgfHwgQ01EX1ZBUklBQkxFKGRzdCkgfHwgQ01EX1ZBUkFSRyhkc3QpIHx8CisJICAgIENNRF9JUFY0KGRzdCkgfHwgQ01EX0lQVjRfUFJFRklYKGRzdCkgfHwgQ01EX1JBTkdFKGRzdCkpCisJCXJldHVybiBOVUxMOworCisJLyogSW4gY2FzZSBvZiAnY29tbWFuZCBcdCcsIGdpdmVuIHNyYyBpcyBOVUxMIHN0cmluZy4gKi8KKwlpZiAoc3JjID09IE5VTEwpCisJCXJldHVybiBkc3Q7CisKKwkvKiBNYXRjaGVkIHdpdGggaW5wdXQgc3RyaW5nLiAqLworCWlmIChzdHJuY21wKHNyYywgZHN0LCBzdHJsZW4oc3JjKSkgPT0gMCkKKwkJcmV0dXJuIGRzdDsKKworCXJldHVybiBOVUxMOworfQorCisvKiBJZiBzcmMgbWF0Y2hlcyBkc3QgcmV0dXJuIGRzdCBzdHJpbmcsIG90aGVyd2lzZSByZXR1cm4gTlVMTCAqLworLyogVGhpcyB2ZXJzaW9uIHdpbGwgcmV0dXJuIHRoZSBkc3Qgc3RyaW5nIGFsd2F5cyBpZiBpdCBpcworICAgQ01EX1ZBUklBQkxFIGZvciAnPycga2V5IHByb2Nlc3NpbmcgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjbWRfZW50cnlfZnVuY3Rpb25fZGVzYyhjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKmRzdCkKK3sKKwlpZiAoQ01EX1ZBUkFSRyhkc3QpKQorCQlyZXR1cm4gZHN0OworCisJaWYgKENNRF9SQU5HRShkc3QpKSB7CisJCWlmIChjbWRfcmFuZ2VfbWF0Y2goZHN0LCBzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorI2lmZGVmIEhBVkVfSVBWNgorCWlmIChDTURfSVBWNihkc3QpKSB7CisJCWlmIChjbWRfaXB2Nl9tYXRjaChzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKENNRF9JUFY2X1BSRUZJWChkc3QpKSB7CisJCWlmIChjbWRfaXB2Nl9wcmVmaXhfbWF0Y2goc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgKi8KKworCWlmIChDTURfSVBWNChkc3QpKSB7CisJCWlmIChjbWRfaXB2NF9tYXRjaChzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKENNRF9JUFY0X1BSRUZJWChkc3QpKSB7CisJCWlmIChjbWRfaXB2NF9wcmVmaXhfbWF0Y2goc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8qIE9wdGlvbmFsIG9yIHZhcmlhYmxlIGNvbW1hbmRzIGFsd2F5cyBtYXRjaCBvbiAnPycgKi8KKwlpZiAoQ01EX09QVElPTihkc3QpIHx8IENNRF9WQVJJQUJMRShkc3QpKQorCQlyZXR1cm4gZHN0OworCisJLyogSW4gY2FzZSBvZiAnY29tbWFuZCBcdCcsIGdpdmVuIHNyYyBpcyBOVUxMIHN0cmluZy4gKi8KKwlpZiAoc3JjID09IE5VTEwpCisJCXJldHVybiBkc3Q7CisKKwlpZiAoc3RybmNtcChzcmMsIGRzdCwgc3RybGVuKHNyYykpID09IDApCisJCXJldHVybiBkc3Q7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworLyogQ2hlY2sgc2FtZSBzdHJpbmcgZWxlbWVudCBleGlzdGVuY2UuICBJZiBpdCBpc24ndCB0aGVyZSByZXR1cm4KKyAgICAxLiAqLworc3RhdGljIGludCBjbWRfdW5pcXVlX3N0cmluZyh2ZWN0b3IgdiwgY29uc3QgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKm1hdGNoOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChtYXRjaCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKQorCQkJaWYgKHN0cmNtcChtYXRjaCwgc3RyKSA9PSAwKQorCQkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiBDb21wYXJlIHN0cmluZyB0byBkZXNjcmlwdGlvbiB2ZWN0b3IuICBJZiB0aGVyZSBpcyBzYW1lIHN0cmluZworICAgcmV0dXJuIDEgZWxzZSByZXR1cm4gMC4gKi8KK3N0YXRpYyBpbnQgZGVzY191bmlxdWVfc3RyaW5nKHZlY3RvciB2LCBjb25zdCBjaGFyICpzdHIpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkKKwkJCWlmIChzdHJjbXAoZGVzYy0+Y21kLCBzdHIpID09IDApCisJCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY21kX3RyeV9kb19zaG9ydGN1dChlbnVtIG5vZGVfdHlwZSBub2RlLCBjaGFyICpmaXJzdF93b3JkKQoreworCWlmIChmaXJzdF93b3JkICE9IE5VTEwgJiYKKwkgICAgbm9kZSAhPSBBVVRIX05PREUgJiYKKwkgICAgbm9kZSAhPSBWSUVXX05PREUgJiYKKwkgICAgbm9kZSAhPSBBVVRIX0VOQUJMRV9OT0RFICYmCisJICAgIG5vZGUgIT0gRU5BQkxFX05PREUgJiYgMCA9PSBzdHJjbXAoImRvIiwgZmlyc3Rfd29yZCkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKiAnPycgZGVzY3JpYmUgY29tbWFuZCBzdXBwb3J0LiAqLworc3RhdGljIHZlY3RvcgorY21kX2Rlc2NyaWJlX2NvbW1hbmRfcmVhbCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwgaW50ICpzdGF0dXMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdmVjdG9yIGNtZF92ZWN0b3I7CisjZGVmaW5lIElOSVRfTUFUQ0hWRUNfU0laRSAxMAorCXZlY3RvciBtYXRjaHZlYzsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBpbmRleDsKKwlpbnQgcmV0OworCWVudW0gbWF0Y2hfdHlwZSBtYXRjaDsKKwljaGFyICpjb21tYW5kOworCXN0YXRpYyBzdHJ1Y3QgZGVzYyBkZXNjX2NyID0geyAiPGNyPiIsICIiIH07CisKKwkvKiBTZXQgaW5kZXguICovCisJaWYgKHZlY3Rvcl9hY3RpdmUodmxpbmUpID09IDApIHsKKwkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJCXJldHVybiBOVUxMOworCX0gZWxzZQorCQlpbmRleCA9IHZlY3Rvcl9hY3RpdmUodmxpbmUpIC0gMTsKKworCS8qIE1ha2UgY29weSB2ZWN0b3Igb2YgY3VycmVudCBub2RlJ3MgY29tbWFuZCB2ZWN0b3IuICovCisJY21kX3ZlY3RvciA9IHZlY3Rvcl9jb3B5KGNtZF9ub2RlX3ZlY3RvcihjbWR2ZWMsIHZ0eS0+bm9kZSkpOworCisJLyogUHJlcGFyZSBtYXRjaCB2ZWN0b3IgKi8KKwltYXRjaHZlYyA9IHZlY3Rvcl9pbml0KElOSVRfTUFUQ0hWRUNfU0laRSk7CisKKwkvKiBGaWx0ZXIgY29tbWFuZHMuICovCisJLyogT25seSB3b3JkcyBwcmVjZWRlcyBjdXJyZW50IHdvcmQgd2lsbCBiZSBjaGVja2VkIGluIHRoaXMgbG9vcC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpKSkgeworCQkJbWF0Y2ggPQorCQkJICAgIGNtZF9maWx0ZXJfYnlfY29tcGxldGlvbihjb21tYW5kLCBjbWRfdmVjdG9yLCBpKTsKKworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaCkgeworCQkJCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJCQkJdmVjdG9yIGRlc2N2ZWM7CisJCQkJdW5zaWduZWQgaW50IGosIGs7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaisrKQorCQkJCQlpZiAoKGNtZF9lbGVtZW50ID0KKwkJCQkJICAgICB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBqKSkgIT0gTlVMTAorCQkJCQkgICAgJiYKKwkJCQkJICAgICh2ZWN0b3JfYWN0aXZlCisJCQkJCSAgICAgKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKSkgeworCQkJCQkJZGVzY3ZlYyA9CisJCQkJCQkgICAgdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPgorCQkJCQkJCQlzdHJ2ZWMsCisJCQkJCQkJCXZlY3Rvcl9hY3RpdmUKKwkJCQkJCQkJKGNtZF9lbGVtZW50LT4KKwkJCQkJCQkJIHN0cnZlYykgLSAxKTsKKwkJCQkJCWZvciAoayA9IDA7CisJCQkJCQkgICAgIGsgPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOworCQkJCQkJICAgICBrKyspIHsKKwkJCQkJCQlzdHJ1Y3QgZGVzYyAqZGVzYyA9CisJCQkJCQkJICAgIHZlY3Rvcl9zbG90KGRlc2N2ZWMsCisJCQkJCQkJCQlrKTsKKwkJCQkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLAorCQkJCQkJCQkgICBkZXNjKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJdmVjdG9yX3NldChtYXRjaHZlYywgJmRlc2NfY3IpOworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJCQkJcmV0dXJuIG1hdGNodmVjOworCQkJfQorCisJCQlpZiAoKHJldCA9CisJCQkgICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaSwKKwkJCQkJICAgICAgbWF0Y2gpKSA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJKnN0YXR1cyA9IENNRF9FUlJfQU1CSUdVT1VTOworCQkJCXJldHVybiBOVUxMOworCQkJfSBlbHNlIGlmIChyZXQgPT0gMikgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKwkvKiBQcmVwYXJlIG1hdGNoIHZlY3RvciAqLworCS8qICBtYXRjaHZlYyA9IHZlY3Rvcl9pbml0IChJTklUX01BVENIVkVDX1NJWkUpOyAqLworCisJLyogTWFrZSBzdXJlIHRoYXQgY21kX3ZlY3RvciBpcyBmaWx0ZXJlZCBiYXNlZCBvbiBjdXJyZW50IHdvcmQgKi8KKwljb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KTsKKwlpZiAoY29tbWFuZCkKKwkJbWF0Y2ggPSBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwgaW5kZXgpOworCisJLyogTWFrZSBkZXNjcmlwdGlvbiB2ZWN0b3IuICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpKSAhPSBOVUxMKSB7CisJCQljb25zdCBjaGFyICpzdHJpbmcgPSBOVUxMOworCQkJdmVjdG9yIHN0cnZlYyA9IGNtZF9lbGVtZW50LT5zdHJ2ZWM7CisKKwkJCS8qIGlmIGNvbW1hbmQgaXMgTlVMTCwgaW5kZXggbWF5IGJlIGVxdWFsIHRvIHZlY3Rvcl9hY3RpdmUgKi8KKwkJCWlmIChjb21tYW5kICYmIGluZGV4ID49IHZlY3Rvcl9hY3RpdmUoc3RydmVjKSkKKwkJCQl2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQkvKiBDaGVjayBpZiBjb21tYW5kIGlzIGNvbXBsZXRlZC4gKi8KKwkJCQlpZiAoY29tbWFuZCA9PSBOVUxMCisJCQkJICAgICYmIGluZGV4ID09IHZlY3Rvcl9hY3RpdmUoc3RydmVjKSkgeworCQkJCQlzdHJpbmcgPSAiPGNyPiI7CisJCQkJCWlmICghZGVzY191bmlxdWVfc3RyaW5nCisJCQkJCSAgICAobWF0Y2h2ZWMsIHN0cmluZykpCisJCQkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLCAmZGVzY19jcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJdW5zaWduZWQgaW50IGo7CisJCQkJCXZlY3RvciBkZXNjdmVjID0KKwkJCQkJICAgIHZlY3Rvcl9zbG90KHN0cnZlYywgaW5kZXgpOworCQkJCQlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCQkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsKKwkJCQkJICAgICBqKyspCisJCQkJCQlpZiAoKGRlc2MgPQorCQkJCQkJICAgICB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCQlzdHJpbmcgPQorCQkJCQkJCSAgICBjbWRfZW50cnlfZnVuY3Rpb25fZGVzYworCQkJCQkJCSAgICAoY29tbWFuZCwKKwkJCQkJCQkgICAgIGRlc2MtPmNtZCk7CisJCQkJCQkJaWYgKHN0cmluZykgeworCQkJCQkJCQkvKiBVbmlxdWVuZXNzIGNoZWNrICovCisJCQkJCQkJCWlmICghZGVzY191bmlxdWVfc3RyaW5nKG1hdGNodmVjLCBzdHJpbmcpKQorCQkJCQkJCQkJdmVjdG9yX3NldAorCQkJCQkJCQkJICAgIChtYXRjaHZlYywKKwkJCQkJCQkJCSAgICAgZGVzYyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCAwKSA9PSBOVUxMKSB7CisJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKKwkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJfSBlbHNlCisJCSpzdGF0dXMgPSBDTURfU1VDQ0VTUzsKKworCXJldHVybiBtYXRjaHZlYzsKK30KKwordmVjdG9yIGNtZF9kZXNjcmliZV9jb21tYW5kKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqIHZ0eSwgaW50ICpzdGF0dXMpCit7CisJdmVjdG9yIHJldDsKKworCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgeworCQllbnVtIG5vZGVfdHlwZSBvbm9kZTsKKwkJdmVjdG9yIHNoaWZ0ZWRfdmxpbmU7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQlvbm9kZSA9IHZ0eS0+bm9kZTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCS8qIFdlIGNhbiB0cnkgaXQgb24gZW5hYmxlIG5vZGUsIGNvcycgdGhlIHZ0eSBpcyBhdXRoZW50aWNhdGVkICovCisKKwkJc2hpZnRlZF92bGluZSA9IHZlY3Rvcl9pbml0KHZlY3Rvcl9jb3VudCh2bGluZSkpOworCQkvKiB1c2UgbWVtY3B5PyAqLworCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykgeworCQkJdmVjdG9yX3NldF9pbmRleChzaGlmdGVkX3ZsaW5lLCBpbmRleCAtIDEsCisJCQkJCSB2ZWN0b3JfbG9va3VwKHZsaW5lLCBpbmRleCkpOworCQl9CisKKwkJcmV0ID0gY21kX2Rlc2NyaWJlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIHN0YXR1cyk7CisKKwkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBjbWRfZGVzY3JpYmVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIHN0YXR1cyk7Cit9CisKKy8qIENoZWNrIExDRCBvZiBtYXRjaGVkIGNvbW1hbmQuICovCitzdGF0aWMgaW50IGNtZF9sY2QoY2hhciAqKm1hdGNoZWQpCit7CisJaW50IGk7CisJaW50IGo7CisJaW50IGxjZCA9IC0xOworCWNoYXIgKnMxLCAqczI7CisJY2hhciBjMSwgYzI7CisKKwlpZiAobWF0Y2hlZFswXSA9PSBOVUxMIHx8IG1hdGNoZWRbMV0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAxOyBtYXRjaGVkW2ldICE9IE5VTEw7IGkrKykgeworCQlzMSA9IG1hdGNoZWRbaSAtIDFdOworCQlzMiA9IG1hdGNoZWRbaV07CisKKwkJZm9yIChqID0gMDsgKGMxID0gczFbal0pICYmIChjMiA9IHMyW2pdKTsgaisrKQorCQkJaWYgKGMxICE9IGMyKQorCQkJCWJyZWFrOworCisJCWlmIChsY2QgPCAwKQorCQkJbGNkID0gajsKKwkJZWxzZSB7CisJCQlpZiAobGNkID4gaikKKwkJCQlsY2QgPSBqOworCQl9CisJfQorCXJldHVybiBsY2Q7Cit9CisKKy8qIENvbW1hbmQgbGluZSBjb21wbGV0aW9uIHN1cHBvcnQuICovCitzdGF0aWMgY2hhciAqKmNtZF9jb21wbGV0ZV9jb21tYW5kX3JlYWwodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCisJCQkJCWludCAqc3RhdHVzKQoreworCXVuc2lnbmVkIGludCBpOworCXZlY3RvciBjbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisjZGVmaW5lIElOSVRfTUFUQ0hWRUNfU0laRSAxMAorCXZlY3RvciBtYXRjaHZlYzsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBpbmRleDsKKwljaGFyICoqbWF0Y2hfc3RyOworCXN0cnVjdCBkZXNjICpkZXNjOworCXZlY3RvciBkZXNjdmVjOworCWNoYXIgKmNvbW1hbmQ7CisJaW50IGxjZDsKKworCWlmICh2ZWN0b3JfYWN0aXZlKHZsaW5lKSA9PSAwKSB7CisJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJaW5kZXggPSB2ZWN0b3JfYWN0aXZlKHZsaW5lKSAtIDE7CisKKwkvKiBGaXJzdCwgZmlsdGVyIGJ5IHByZWNlZWRpbmcgY29tbWFuZCBzdHJpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpKSkgeworCQkJZW51bSBtYXRjaF90eXBlIG1hdGNoOworCQkJaW50IHJldDsKKworCQkJLyogRmlyc3QgdHJ5IGNvbXBsZXRpb24gbWF0Y2gsIGlmIHRoZXJlIGlzIGV4YWN0bHkgbWF0Y2ggcmV0dXJuIDEgKi8KKwkJCW1hdGNoID0KKwkJCSAgICBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwgaSk7CisKKwkJCS8qIElmIHRoZXJlIGlzIGV4YWN0IG1hdGNoIHRoZW4gZmlsdGVyIGFtYmlndW91cyBtYXRjaCBlbHNlIGNoZWNrCisJCQkgICBhbWJpZ3VvdXNuZXNzLiAqLworCQkJaWYgKChyZXQgPQorCQkJICAgICBpc19jbWRfYW1iaWd1b3VzKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGksCisJCQkJCSAgICAgIG1hdGNoKSkgPT0gMSkgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCSpzdGF0dXMgPSBDTURfRVJSX0FNQklHVU9VUzsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCS8qCisJCQkgICBlbHNlIGlmIChyZXQgPT0gMikKKwkJCSAgIHsKKwkJCSAgIHZlY3Rvcl9mcmVlIChjbWRfdmVjdG9yKTsKKwkJCSAgICpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQkJICAgcmV0dXJuIE5VTEw7CisJCQkgICB9CisJCQkgKi8KKwkJfQorCisJLyogUHJlcGFyZSBtYXRjaCB2ZWN0b3IuICovCisJbWF0Y2h2ZWMgPSB2ZWN0b3JfaW5pdChJTklUX01BVENIVkVDX1NJWkUpOworCisJLyogTm93IHdlIGdvdCBpbnRvIGNvbXBsZXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkpKSB7CisJCQljb25zdCBjaGFyICpzdHJpbmc7CisJCQl2ZWN0b3Igc3RydmVjID0gY21kX2VsZW1lbnQtPnN0cnZlYzsKKworCQkJLyogQ2hlY2sgZmllbGQgbGVuZ3RoICovCisJCQlpZiAoaW5kZXggPj0gdmVjdG9yX2FjdGl2ZShzdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCXVuc2lnbmVkIGludCBqOworCisJCQkJZGVzY3ZlYyA9IHZlY3Rvcl9zbG90KHN0cnZlYywgaW5kZXgpOworCQkJCWZvciAoaiA9IDA7IGogPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOyBqKyspCisJCQkJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgeworCQkJCQkJaWYgKChzdHJpbmcgPSBjbWRfZW50cnlfZnVuY3Rpb24odmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSwgZGVzYy0+Y21kKSkpCisJCQkJCQkJaWYgKGNtZF91bmlxdWVfc3RyaW5nIChtYXRjaHZlYywgc3RyaW5nKSkKKwkJCQkJCQkJdmVjdG9yX3NldCAobWF0Y2h2ZWMsIHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgc3RyaW5nKSk7CisJCQkJCX0KKwkJCX0KKwkJfQorCisJLyogV2UgZG9uJ3QgbmVlZCBjbWRfdmVjdG9yIGFueSBtb3JlLiAqLworCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJLyogTm8gbWF0Y2hlZCBjb21tYW5kICovCisJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCAwKSA9PSBOVUxMKSB7CisJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKKworCQkvKiBJbiBjYXNlIG9mICdjb21tYW5kIFx0JyBwYXR0ZXJuLiAgRG8geW91IG5lZWQgJz8nIGNvbW1hbmQgYXQKKwkJICAgdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KKwkJaWYgKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkgPT0gJ1wwJykKKwkJCSpzdGF0dXMgPSBDTURfRVJSX05PVEhJTkdfVE9ETzsKKwkJZWxzZQorCQkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE9ubHkgb25lIG1hdGNoZWQgKi8KKwlpZiAodmVjdG9yX3Nsb3QobWF0Y2h2ZWMsIDEpID09IE5VTEwpIHsKKwkJbWF0Y2hfc3RyID0gKGNoYXIgKiopbWF0Y2h2ZWMtPmluZGV4OworCQl2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUobWF0Y2h2ZWMpOworCQkqc3RhdHVzID0gQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0g7CisJCXJldHVybiBtYXRjaF9zdHI7CisJfQorCS8qIE1ha2UgaXQgc3VyZSBsYXN0IGVsZW1lbnQgaXMgTlVMTC4gKi8KKwl2ZWN0b3Jfc2V0KG1hdGNodmVjLCBOVUxMKTsKKworCS8qIENoZWNrIExDRCBvZiBtYXRjaGVkIHN0cmluZ3MuICovCisJaWYgKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkgIT0gTlVMTCkgeworCQlsY2QgPSBjbWRfbGNkKChjaGFyICoqKW1hdGNodmVjLT5pbmRleCk7CisKKwkJaWYgKGxjZCkgeworCQkJaW50IGxlbiA9IHN0cmxlbih2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpKTsKKworCQkJaWYgKGxlbiA8IGxjZCkgeworCQkJCWNoYXIgKmxjZHN0cjsKKworCQkJCWxjZHN0ciA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBsY2QgKyAxLAorCQkJCQkJICAgICAgImNvbXBsZXRlLWxjZHN0ciIpOworCQkJCW1lbWNweShsY2RzdHIsIG1hdGNodmVjLT5pbmRleFswXSwgbGNkKTsKKwkJCQlsY2RzdHJbbGNkXSA9ICdcMCc7CisKKwkJCQkvKiBtYXRjaF9zdHIgPSAoY2hhciAqKikgJmxjZHN0cjsgKi8KKworCQkJCS8qIEZyZWUgbWF0Y2h2ZWMuICovCisJCQkJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUobWF0Y2h2ZWMpOyBpKyspIHsKKwkJCQkJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCBpKSkKKwkJCQkJCXRhbGxvY19mcmVlKHZlY3Rvcl9zbG90KG1hdGNodmVjLCBpKSk7CisJCQkJfQorCQkJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKKworCQkJCS8qIE1ha2UgbmV3IG1hdGNodmVjLiAqLworCQkJCW1hdGNodmVjID0gdmVjdG9yX2luaXQoSU5JVF9NQVRDSFZFQ19TSVpFKTsKKwkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLCBsY2RzdHIpOworCQkJCW1hdGNoX3N0ciA9IChjaGFyICoqKW1hdGNodmVjLT5pbmRleDsKKwkJCQl2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUobWF0Y2h2ZWMpOworCisJCQkJKnN0YXR1cyA9IENNRF9DT01QTEVURV9NQVRDSDsKKwkJCQlyZXR1cm4gbWF0Y2hfc3RyOworCQkJfQorCQl9CisJfQorCisJbWF0Y2hfc3RyID0gKGNoYXIgKiopbWF0Y2h2ZWMtPmluZGV4OworCXZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZShtYXRjaHZlYyk7CisJKnN0YXR1cyA9IENNRF9DT01QTEVURV9MSVNUX01BVENIOworCXJldHVybiBtYXRjaF9zdHI7Cit9CisKK2NoYXIgKipjbWRfY29tcGxldGVfY29tbWFuZCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwgaW50ICpzdGF0dXMpCit7CisJY2hhciAqKnJldDsKKworCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgeworCQllbnVtIG5vZGVfdHlwZSBvbm9kZTsKKwkJdmVjdG9yIHNoaWZ0ZWRfdmxpbmU7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQlvbm9kZSA9IHZ0eS0+bm9kZTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCS8qIFdlIGNhbiB0cnkgaXQgb24gZW5hYmxlIG5vZGUsIGNvcycgdGhlIHZ0eSBpcyBhdXRoZW50aWNhdGVkICovCisKKwkJc2hpZnRlZF92bGluZSA9IHZlY3Rvcl9pbml0KHZlY3Rvcl9jb3VudCh2bGluZSkpOworCQkvKiB1c2UgbWVtY3B5PyAqLworCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykgeworCQkJdmVjdG9yX3NldF9pbmRleChzaGlmdGVkX3ZsaW5lLCBpbmRleCAtIDEsCisJCQkJCSB2ZWN0b3JfbG9va3VwKHZsaW5lLCBpbmRleCkpOworCQl9CisKKwkJcmV0ID0gY21kX2NvbXBsZXRlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIHN0YXR1cyk7CisKKwkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBjbWRfY29tcGxldGVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIHN0YXR1cyk7Cit9CisKKy8qIHJldHVybiBwYXJlbnQgbm9kZSAqLworLyogTVVTVCBldmVudHVhbGx5IGNvbnZlcmdlIG9uIENPTkZJR19OT0RFICovCitlbnVtIG5vZGVfdHlwZSB2dHlfZ29fcGFyZW50KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlhc3NlcnQodnR5LT5ub2RlID4gQ09ORklHX05PREUpOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIEdTTU5FVF9OT0RFOgorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwkJdnR5LT5pbmRleCA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgQlRTX05PREU6CisJCXZ0eS0+bm9kZSA9IEdTTU5FVF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gYnRzLT5uZXR3b3JrOworCQl9CisJCWJyZWFrOworCWNhc2UgVFJYX05PREU6CisJCXZ0eS0+bm9kZSA9IEJUU19OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IHRyeC0+YnRzOworCQl9CisJCWJyZWFrOworCWNhc2UgVFNfTk9ERToKKwkJdnR5LT5ub2RlID0gVFJYX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cy0+dHJ4OworCQl9CisJCWJyZWFrOworCWNhc2UgU1VCU0NSX05PREU6CisJCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKwkJc3Vic2NyX3B1dCh2dHktPmluZGV4KTsKKwkJdnR5LT5pbmRleCA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCX0KKworCXJldHVybiB2dHktPm5vZGU7Cit9CisKKy8qIEV4ZWN1dGUgY29tbWFuZCBieSBhcmd1bWVudCB2bGluZSB2ZWN0b3IuICovCitzdGF0aWMgaW50CitjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCisJCQkgc3RydWN0IGNtZF9lbGVtZW50ICoqY21kKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBpbmRleDsKKwl2ZWN0b3IgY21kX3ZlY3RvcjsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXN0cnVjdCBjbWRfZWxlbWVudCAqbWF0Y2hlZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBtYXRjaGVkX2NvdW50LCBpbmNvbXBsZXRlX2NvdW50OworCWludCBhcmdjOworCWNvbnN0IGNoYXIgKmFyZ3ZbQ01EX0FSR0NfTUFYXTsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2ggPSAwOworCWludCB2YXJmbGFnOworCWNoYXIgKmNvbW1hbmQ7CisKKwkvKiBNYWtlIGNvcHkgb2YgY29tbWFuZCBlbGVtZW50cy4gKi8KKwljbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSkpIHsKKwkJCWludCByZXQ7CisKKwkJCW1hdGNoID0KKwkJCSAgICBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwKKwkJCQkJCSAgICAgaW5kZXgpOworCisJCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoKQorCQkJCWJyZWFrOworCisJCQlyZXQgPQorCQkJICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaW5kZXgsIG1hdGNoKTsKKworCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCQkJfSBlbHNlIGlmIChyZXQgPT0gMikgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCQkJfQorCQl9CisKKwkvKiBDaGVjayBtYXRjaGVkIGNvdW50LiAqLworCW1hdGNoZWRfZWxlbWVudCA9IE5VTEw7CisJbWF0Y2hlZF9jb3VudCA9IDA7CisJaW5jb21wbGV0ZV9jb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkpKSB7CisJCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoCisJCQkgICAgfHwgaW5kZXggPj0gY21kX2VsZW1lbnQtPmNtZHNpemUpIHsKKwkJCQltYXRjaGVkX2VsZW1lbnQgPSBjbWRfZWxlbWVudDsKKyNpZiAwCisJCQkJcHJpbnRmKCJERUJVRzogJXNcbiIsIGNtZF9lbGVtZW50LT5zdHJpbmcpOworI2VuZGlmCisJCQkJbWF0Y2hlZF9jb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQlpbmNvbXBsZXRlX2NvdW50Kys7CisJCQl9CisJCX0KKworCS8qIEZpbmlzaCBvZiB1c2luZyBjbWRfdmVjdG9yLiAqLworCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJLyogVG8gZXhlY3V0ZSBjb21tYW5kLCBtYXRjaGVkX2NvdW50IG11c3QgYmUgMS4gKi8KKwlpZiAobWF0Y2hlZF9jb3VudCA9PSAwKSB7CisJCWlmIChpbmNvbXBsZXRlX2NvdW50KQorCQkJcmV0dXJuIENNRF9FUlJfSU5DT01QTEVURTsKKwkJZWxzZQorCQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJfQorCisJaWYgKG1hdGNoZWRfY291bnQgPiAxKQorCQlyZXR1cm4gQ01EX0VSUl9BTUJJR1VPVVM7CisKKwkvKiBBcmd1bWVudCB0cmVhdG1lbnQgKi8KKwl2YXJmbGFnID0gMDsKKwlhcmdjID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaSsrKSB7CisJCWlmICh2YXJmbGFnKQorCQkJYXJndlthcmdjKytdID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpOworCQllbHNlIHsKKwkJCXZlY3RvciBkZXNjdmVjID0KKwkJCSAgICB2ZWN0b3Jfc2xvdChtYXRjaGVkX2VsZW1lbnQtPnN0cnZlYywgaSk7CisKKwkJCWlmICh2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpID09IDEpIHsKKwkJCQlzdHJ1Y3QgZGVzYyAqZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIDApOworCisJCQkJaWYgKENNRF9WQVJBUkcoZGVzYy0+Y21kKSkKKwkJCQkJdmFyZmxhZyA9IDE7CisKKwkJCQlpZiAodmFyZmxhZyB8fCBDTURfVkFSSUFCTEUoZGVzYy0+Y21kKQorCQkJCSAgICB8fCBDTURfT1BUSU9OKGRlc2MtPmNtZCkpCisJCQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJCX0gZWxzZQorCQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJfQorCisJCWlmIChhcmdjID49IENNRF9BUkdDX01BWCkKKwkJCXJldHVybiBDTURfRVJSX0VYRUVEX0FSR0NfTUFYOworCX0KKworCS8qIEZvciB2dHlzaCBleGVjdXRpb24uICovCisJaWYgKGNtZCkKKwkJKmNtZCA9IG1hdGNoZWRfZWxlbWVudDsKKworCWlmIChtYXRjaGVkX2VsZW1lbnQtPmRhZW1vbikKKwkJcmV0dXJuIENNRF9TVUNDRVNTX0RBRU1PTjsKKworCS8qIEV4ZWN1dGUgbWF0Y2hlZCBjb21tYW5kLiAqLworCXJldHVybiAoKm1hdGNoZWRfZWxlbWVudC0+ZnVuYykgKG1hdGNoZWRfZWxlbWVudCwgdnR5LCBhcmdjLCBhcmd2KTsKK30KKworaW50CitjbWRfZXhlY3V0ZV9jb21tYW5kKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgY21kX2VsZW1lbnQgKipjbWQsCisJCSAgICBpbnQgdnR5c2gpCit7CisJaW50IHJldCwgc2F2ZWRfcmV0LCB0cmllZCA9IDA7CisJZW51bSBub2RlX3R5cGUgb25vZGU7CisJdm9pZCAqb2luZGV4OworCisJb25vZGUgPSB2dHktPm5vZGU7CisJb2luZGV4ID0gdnR5LT5pbmRleDsKKworCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgeworCQl2ZWN0b3Igc2hpZnRlZF92bGluZTsKKwkJdW5zaWduZWQgaW50IGluZGV4OworCisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQkvKiBXZSBjYW4gdHJ5IGl0IG9uIGVuYWJsZSBub2RlLCBjb3MnIHRoZSB2dHkgaXMgYXV0aGVudGljYXRlZCAqLworCisJCXNoaWZ0ZWRfdmxpbmUgPSB2ZWN0b3JfaW5pdCh2ZWN0b3JfY291bnQodmxpbmUpKTsKKwkJLyogdXNlIG1lbWNweT8gKi8KKwkJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspIHsKKwkJCXZlY3Rvcl9zZXRfaW5kZXgoc2hpZnRlZF92bGluZSwgaW5kZXggLSAxLAorCQkJCQkgdmVjdG9yX2xvb2t1cCh2bGluZSwgaW5kZXgpKTsKKwkJfQorCisJCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIGNtZCk7CisKKwkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQlyZXR1cm4gcmV0OworCX0KKworCXNhdmVkX3JldCA9IHJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfcmVhbCh2bGluZSwgdnR5LCBjbWQpOworCisJaWYgKHZ0eXNoKQorCQlyZXR1cm4gc2F2ZWRfcmV0OworCisJLyogVGhpcyBhc3N1bWVzIGFsbCBub2RlcyBhYm92ZSBDT05GSUdfTk9ERSBhcmUgY2hpbGRzIG9mIENPTkZJR19OT0RFICovCisJd2hpbGUgKHJldCAhPSBDTURfU1VDQ0VTUyAmJiByZXQgIT0gQ01EX1dBUk5JTkcKKwkgICAgICAgJiYgdnR5LT5ub2RlID4gQ09ORklHX05PREUpIHsKKwkJdnR5X2dvX3BhcmVudCh2dHkpOworCQlyZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwodmxpbmUsIHZ0eSwgY21kKTsKKwkJdHJpZWQgPSAxOworCQlpZiAocmV0ID09IENNRF9TVUNDRVNTIHx8IHJldCA9PSBDTURfV0FSTklORykgeworCQkJLyogc3VjY2VzZnVsbCBjb21tYW5kLCBsZWF2ZSB0aGUgbm9kZSBhcyBpcyAqLworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwkvKiBubyBjb21tYW5kIHN1Y2NlZWRlZCwgcmVzZXQgdGhlIHZ0eSB0byB0aGUgb3JpZ2luYWwgbm9kZSBhbmQKKwkgICByZXR1cm4gdGhlIGVycm9yIGZvciB0aGlzIG5vZGUgKi8KKwlpZiAodHJpZWQpIHsKKwkJdnR5LT5ub2RlID0gb25vZGU7CisJCXZ0eS0+aW5kZXggPSBvaW5kZXg7CisJfQorCXJldHVybiBzYXZlZF9yZXQ7Cit9CisKKy8qIEV4ZWN1dGUgY29tbWFuZCBieSBhcmd1bWVudCByZWFkbGluZS4gKi8KK2ludAorY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCisJCQkgICBzdHJ1Y3QgY21kX2VsZW1lbnQgKipjbWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGluZGV4OworCXZlY3RvciBjbWRfdmVjdG9yOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJc3RydWN0IGNtZF9lbGVtZW50ICptYXRjaGVkX2VsZW1lbnQ7CisJdW5zaWduZWQgaW50IG1hdGNoZWRfY291bnQsIGluY29tcGxldGVfY291bnQ7CisJaW50IGFyZ2M7CisJY29uc3QgY2hhciAqYXJndltDTURfQVJHQ19NQVhdOworCWludCB2YXJmbGFnOworCWVudW0gbWF0Y2hfdHlwZSBtYXRjaCA9IDA7CisJY2hhciAqY29tbWFuZDsKKworCS8qIE1ha2UgY29weSBvZiBjb21tYW5kIGVsZW1lbnQgKi8KKwljbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSkpIHsKKwkJCWludCByZXQ7CisKKwkJCW1hdGNoID0gY21kX2ZpbHRlcl9ieV9zdHJpbmcodmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSwKKwkJCQkJCSAgICAgY21kX3ZlY3RvciwgaW5kZXgpOworCisJCQkvKiBJZiBjb21tYW5kIG1lZXRzICcuVkFSQVJHJyB0aGVuIGZpbmlzaCBtYXRjaGluZy4gKi8KKwkJCWlmIChtYXRjaCA9PSB2YXJhcmdfbWF0Y2gpCisJCQkJYnJlYWs7CisKKwkJCXJldCA9CisJCQkgICAgaXNfY21kX2FtYmlndW91cyhjb21tYW5kLCBjbWRfdmVjdG9yLCBpbmRleCwgbWF0Y2gpOworCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCQkJfQorCQkJaWYgKHJldCA9PSAyKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJCQl9CisJCX0KKworCS8qIENoZWNrIG1hdGNoZWQgY291bnQuICovCisJbWF0Y2hlZF9lbGVtZW50ID0gTlVMTDsKKwltYXRjaGVkX2NvdW50ID0gMDsKKwlpbmNvbXBsZXRlX2NvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAodmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkgIT0gTlVMTCkgeworCQkJY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKTsKKworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaAorCQkJICAgIHx8IGluZGV4ID49IGNtZF9lbGVtZW50LT5jbWRzaXplKSB7CisJCQkJbWF0Y2hlZF9lbGVtZW50ID0gY21kX2VsZW1lbnQ7CisJCQkJbWF0Y2hlZF9jb3VudCsrOworCQkJfSBlbHNlCisJCQkJaW5jb21wbGV0ZV9jb3VudCsrOworCQl9CisKKwkvKiBGaW5pc2ggb2YgdXNpbmcgY21kX3ZlY3Rvci4gKi8KKwl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKworCS8qIFRvIGV4ZWN1dGUgY29tbWFuZCwgbWF0Y2hlZF9jb3VudCBtdXN0IGJlIDEuICovCisJaWYgKG1hdGNoZWRfY291bnQgPT0gMCkgeworCQlpZiAoaW5jb21wbGV0ZV9jb3VudCkKKwkJCXJldHVybiBDTURfRVJSX0lOQ09NUExFVEU7CisJCWVsc2UKKwkJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCX0KKworCWlmIChtYXRjaGVkX2NvdW50ID4gMSkKKwkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCisJLyogQXJndW1lbnQgdHJlYXRtZW50ICovCisJdmFyZmxhZyA9IDA7CisJYXJnYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGkrKykgeworCQlpZiAodmFyZmxhZykKKwkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJZWxzZSB7CisJCQl2ZWN0b3IgZGVzY3ZlYyA9CisJCQkgICAgdmVjdG9yX3Nsb3QobWF0Y2hlZF9lbGVtZW50LT5zdHJ2ZWMsIGkpOworCisJCQlpZiAodmVjdG9yX2FjdGl2ZShkZXNjdmVjKSA9PSAxKSB7CisJCQkJc3RydWN0IGRlc2MgKmRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCAwKTsKKworCQkJCWlmIChDTURfVkFSQVJHKGRlc2MtPmNtZCkpCisJCQkJCXZhcmZsYWcgPSAxOworCisJCQkJaWYgKHZhcmZsYWcgfHwgQ01EX1ZBUklBQkxFKGRlc2MtPmNtZCkKKwkJCQkgICAgfHwgQ01EX09QVElPTihkZXNjLT5jbWQpKQorCQkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCQl9IGVsc2UKKwkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCX0KKworCQlpZiAoYXJnYyA+PSBDTURfQVJHQ19NQVgpCisJCQlyZXR1cm4gQ01EX0VSUl9FWEVFRF9BUkdDX01BWDsKKwl9CisKKwkvKiBGb3IgdnR5c2ggZXhlY3V0aW9uLiAqLworCWlmIChjbWQpCisJCSpjbWQgPSBtYXRjaGVkX2VsZW1lbnQ7CisKKwlpZiAobWF0Y2hlZF9lbGVtZW50LT5kYWVtb24pCisJCXJldHVybiBDTURfU1VDQ0VTU19EQUVNT047CisKKwkvKiBOb3cgZXhlY3V0ZSBtYXRjaGVkIGNvbW1hbmQgKi8KKwlyZXR1cm4gKCptYXRjaGVkX2VsZW1lbnQtPmZ1bmMpIChtYXRjaGVkX2VsZW1lbnQsIHZ0eSwgYXJnYywgYXJndik7Cit9CisKKy8qIENvbmZpZ3JhdGlvbiBtYWtlIGZyb20gZmlsZS4gKi8KK2ludCBjb25maWdfZnJvbV9maWxlKHN0cnVjdCB2dHkgKnZ0eSwgRklMRSAqIGZwKQoreworCWludCByZXQ7CisJdmVjdG9yIHZsaW5lOworCisJd2hpbGUgKGZnZXRzKHZ0eS0+YnVmLCBWVFlfQlVGU0laLCBmcCkpIHsKKwkJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWModnR5LT5idWYpOworCisJCS8qIEluIGNhc2Ugb2YgY29tbWVudCBsaW5lICovCisJCWlmICh2bGluZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCS8qIEV4ZWN1dGUgY29uZmlndXJhdGlvbiBjb21tYW5kIDogdGhpcyBpcyBzdHJpY3QgbWF0Y2ggKi8KKwkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmxpbmUsIHZ0eSwgTlVMTCk7CisKKwkJLyogVHJ5IGFnYWluIHdpdGggc2V0dGluZyBub2RlIHRvIENPTkZJR19OT0RFICovCisJCXdoaWxlIChyZXQgIT0gQ01EX1NVQ0NFU1MgJiYgcmV0ICE9IENNRF9XQVJOSU5HCisJCSAgICAgICAmJiByZXQgIT0gQ01EX0VSUl9OT1RISU5HX1RPRE8KKwkJICAgICAgICYmIHZ0eS0+bm9kZSAhPSBDT05GSUdfTk9ERSkgeworCQkJdnR5X2dvX3BhcmVudCh2dHkpOworCQkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmxpbmUsIHZ0eSwgTlVMTCk7CisJCX0KKworCQljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCisJCWlmIChyZXQgIT0gQ01EX1NVQ0NFU1MgJiYgcmV0ICE9IENNRF9XQVJOSU5HCisJCSAgICAmJiByZXQgIT0gQ01EX0VSUl9OT1RISU5HX1RPRE8pCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIENvbmZpZ3JhdGlvbiBmcm9tIHRlcm1pbmFsICovCitERUZVTihjb25maWdfdGVybWluYWwsCisgICAgICBjb25maWdfdGVybWluYWxfY21kLAorICAgICAgImNvbmZpZ3VyZSB0ZXJtaW5hbCIsCisgICAgICAiQ29uZmlndXJhdGlvbiBmcm9tIHZ0eSBpbnRlcmZhY2VcbiIgIkNvbmZpZ3VyYXRpb24gdGVybWluYWxcbiIpCit7CisJaWYgKHZ0eV9jb25maWdfbG9jayh2dHkpKQorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwllbHNlIHsKKwkJdnR5X291dCh2dHksICJWVFkgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgYnkgb3RoZXIgVlRZJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRW5hYmxlIGNvbW1hbmQgKi8KK0RFRlVOKGVuYWJsZSwgY29uZmlnX2VuYWJsZV9jbWQsICJlbmFibGUiLCAiVHVybiBvbiBwcml2aWxlZ2VkIG1vZGUgY29tbWFuZFxuIikKK3sKKwkvKiBJZiBlbmFibGUgcGFzc3dvcmQgaXMgTlVMTCwgY2hhbmdlIHRvIEVOQUJMRV9OT0RFICovCisJaWYgKChob3N0LmVuYWJsZSA9PSBOVUxMICYmIGhvc3QuZW5hYmxlX2VuY3J5cHQgPT0gTlVMTCkgfHwKKwkgICAgdnR5LT50eXBlID09IFZUWV9TSEVMTF9TRVJWKQorCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwllbHNlCisJCXZ0eS0+bm9kZSA9IEFVVEhfRU5BQkxFX05PREU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIERpc2FibGUgY29tbWFuZCAqLworREVGVU4oZGlzYWJsZSwKKyAgICAgIGNvbmZpZ19kaXNhYmxlX2NtZCwgImRpc2FibGUiLCAiVHVybiBvZmYgcHJpdmlsZWdlZCBtb2RlIGNvbW1hbmRcbiIpCit7CisJaWYgKHZ0eS0+bm9kZSA9PSBFTkFCTEVfTk9ERSkKKwkJdnR5LT5ub2RlID0gVklFV19OT0RFOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRG93biB2dHkgbm9kZSBsZXZlbC4gKi8KK2dERUZVTihjb25maWdfZXhpdCwKKyAgICAgIGNvbmZpZ19leGl0X2NtZCwgImV4aXQiLCAiRXhpdCBjdXJyZW50IG1vZGUgYW5kIGRvd24gdG8gcHJldmlvdXMgbW9kZVxuIikKK3sKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgR1NNTkVUX05PREU6CisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCQl2dHktPmluZGV4ID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBCVFNfTk9ERToKKwkJdnR5LT5ub2RlID0gR1NNTkVUX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSBidHMtPm5ldHdvcms7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUUlhfTk9ERToKKwkJdnR5LT5ub2RlID0gQlRTX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gdHJ4LT5idHM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUU19OT0RFOgorCQl2dHktPm5vZGUgPSBUUlhfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IHRzLT50cng7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTVUJTQ1JfTk9ERToKKwkJdnR5LT5ub2RlID0gVklFV19OT0RFOworCQlzdWJzY3JfcHV0KHZ0eS0+aW5kZXgpOworCQl2dHktPmluZGV4ID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBWSUVXX05PREU6CisJY2FzZSBFTkFCTEVfTk9ERToKKwkJaWYgKDApCQkvL3Z0eV9zaGVsbCAodnR5KSkKKwkJCWV4aXQoMCk7CisJCWVsc2UKKwkJCXZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKwkJYnJlYWs7CisJY2FzZSBWVFlfTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCWJyZWFrOworCWNhc2UgTUdDUF9OT0RFOgorCWNhc2UgR0JQUk9YWV9OT0RFOgorCWNhc2UgU0dTTl9OT0RFOgorCWNhc2UgTlNfTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHF1aXQgaXMgYWxpYXMgb2YgZXhpdC4gKi8KK2dBTElBUyhjb25maWdfZXhpdCwKKyAgICAgIGNvbmZpZ19xdWl0X2NtZCwgInF1aXQiLCAiRXhpdCBjdXJyZW50IG1vZGUgYW5kIGRvd24gdG8gcHJldmlvdXMgbW9kZVxuIikKKworLyogRW5kIG9mIGNvbmZpZ3VyYXRpb24uICovCisgICAgZ0RFRlVOKGNvbmZpZ19lbmQsCisgICAgICBjb25maWdfZW5kX2NtZCwgImVuZCIsICJFbmQgY3VycmVudCBtb2RlIGFuZCBjaGFuZ2UgdG8gZW5hYmxlIG1vZGUuIikKK3sKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgVklFV19OT0RFOgorCWNhc2UgRU5BQkxFX05PREU6CisJCS8qIE5vdGhpbmcgdG8gZG8uICovCisJCWJyZWFrOworCWNhc2UgQ09ORklHX05PREU6CisJY2FzZSBWVFlfTk9ERToKKwkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFNob3cgdmVyc2lvbi4gKi8KK0RFRlVOKHNob3dfdmVyc2lvbiwKKyAgICAgIHNob3dfdmVyc2lvbl9jbWQsICJzaG93IHZlcnNpb24iLCBTSE9XX1NUUiAiRGlzcGxheXMgcHJvZ3JhbSB2ZXJzaW9uXG4iKQoreworCXZ0eV9vdXQodnR5LCAiJXMgJXMgKCVzKS4lcyIsIFFVQUdHQV9QUk9HTkFNRSwgUVVBR0dBX1ZFUlNJT04sCisJCWhvc3QubmFtZSA/IGhvc3QubmFtZSA6ICIiLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIlcyVzIiwgUVVBR0dBX0NPUFlSSUdIVCwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBIZWxwIGRpc3BsYXkgZnVuY3Rpb24gZm9yIGFsbCBub2RlLiAqLworZ0RFRlVOKGNvbmZpZ19oZWxwLAorICAgICAgY29uZmlnX2hlbHBfY21kLCAiaGVscCIsICJEZXNjcmlwdGlvbiBvZiB0aGUgaW50ZXJhY3RpdmUgaGVscCBzeXN0ZW1cbiIpCit7CisJdnR5X291dCh2dHksCisJCSJUaGlzIFZUWSBwcm92aWRlcyBhZHZhbmNlZCBoZWxwIGZlYXR1cmVzLiAgV2hlbiB5b3UgbmVlZCBoZWxwLCVzXAorYW55dGltZSBhdCB0aGUgY29tbWFuZCBsaW5lIHBsZWFzZSBwcmVzcyAnPycuJXNcCislc1wKK0lmIG5vdGhpbmcgbWF0Y2hlcywgdGhlIGhlbHAgbGlzdCB3aWxsIGJlIGVtcHR5IGFuZCB5b3UgbXVzdCBiYWNrdXAlc1wKKyB1bnRpbCBlbnRlcmluZyBhICc/JyBzaG93cyB0aGUgYXZhaWxhYmxlIG9wdGlvbnMuJXNcCitUd28gc3R5bGVzIG9mIGhlbHAgYXJlIHByb3ZpZGVkOiVzXAorMS4gRnVsbCBoZWxwIGlzIGF2YWlsYWJsZSB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gZW50ZXIgYSVzXAorY29tbWFuZCBhcmd1bWVudCAoZS5nLiAnc2hvdyA/JykgYW5kIGRlc2NyaWJlcyBlYWNoIHBvc3NpYmxlJXNcCithcmd1bWVudC4lc1wKKzIuIFBhcnRpYWwgaGVscCBpcyBwcm92aWRlZCB3aGVuIGFuIGFiYnJldmlhdGVkIGFyZ3VtZW50IGlzIGVudGVyZWQlc1wKKyAgIGFuZCB5b3Ugd2FudCB0byBrbm93IHdoYXQgYXJndW1lbnRzIG1hdGNoIHRoZSBpbnB1dCVzXAorICAgKGUuZy4gJ3Nob3cgbWU/Jy4pJXMlcyIsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsCisJCVZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIEhlbHAgZGlzcGxheSBmdW5jdGlvbiBmb3IgYWxsIG5vZGUuICovCitnREVGVU4oY29uZmlnX2xpc3QsIGNvbmZpZ19saXN0X2NtZCwgImxpc3QiLCAiUHJpbnQgY29tbWFuZCBsaXN0XG4iKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBjbWRfbm9kZSAqY25vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIHZ0eS0+bm9kZSk7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbm9kZS0+Y21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKChjbWQgPSB2ZWN0b3Jfc2xvdChjbm9kZS0+Y21kX3ZlY3RvciwgaSkpICE9IE5VTEwKKwkJICAgICYmICEoY21kLT5hdHRyID09IENNRF9BVFRSX0RFUFJFQ0FURUQKKwkJCSB8fCBjbWQtPmF0dHIgPT0gQ01EX0FUVFJfSElEREVOKSkKKwkJCXZ0eV9vdXQodnR5LCAiICAlcyVzIiwgY21kLT5zdHJpbmcsIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFdyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpbnRvIGZpbGUuICovCitERUZVTihjb25maWdfd3JpdGVfZmlsZSwKKyAgICAgIGNvbmZpZ193cml0ZV9maWxlX2NtZCwKKyAgICAgICJ3cml0ZSBmaWxlIiwKKyAgICAgICJXcml0ZSBydW5uaW5nIGNvbmZpZ3VyYXRpb24gdG8gbWVtb3J5LCBuZXR3b3JrLCBvciB0ZXJtaW5hbFxuIgorICAgICAgIldyaXRlIHRvIGNvbmZpZ3VyYXRpb24gZmlsZVxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZmQ7CisJc3RydWN0IGNtZF9ub2RlICpub2RlOworCWNoYXIgKmNvbmZpZ19maWxlOworCWNoYXIgKmNvbmZpZ19maWxlX3RtcCA9IE5VTEw7CisJY2hhciAqY29uZmlnX2ZpbGVfc2F2ID0gTlVMTDsKKwlzdHJ1Y3QgdnR5ICpmaWxlX3Z0eTsKKworCS8qIENoZWNrIGFuZCBzZWUgaWYgd2UgYXJlIG9wZXJhdGluZyB1bmRlciB2dHlzaCBjb25maWd1cmF0aW9uICovCisJaWYgKGhvc3QuY29uZmlnID09IE5VTEwpIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBzYXZlIHRvIGNvbmZpZ3VyYXRpb24gZmlsZSwgdXNpbmcgdnR5c2guJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJLyogR2V0IGZpbGVuYW1lLiAqLworCWNvbmZpZ19maWxlID0gaG9zdC5jb25maWc7CisKKwljb25maWdfZmlsZV9zYXYgPQorCSAgICBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwKKwkJCSBzdHJsZW4oY29uZmlnX2ZpbGUpICsgc3RybGVuKENPTkZfQkFDS1VQX0VYVCkgKyAxLAorCQkJICJjb25maWdfZmlsZV9zYXYiKTsKKwlzdHJjcHkoY29uZmlnX2ZpbGVfc2F2LCBjb25maWdfZmlsZSk7CisJc3RyY2F0KGNvbmZpZ19maWxlX3NhdiwgQ09ORl9CQUNLVVBfRVhUKTsKKworCWNvbmZpZ19maWxlX3RtcCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJsZW4oY29uZmlnX2ZpbGUpICsgOCwKKwkJCQkJImNvbmZpZ19maWxlX3RtcCIpOworCXNwcmludGYoY29uZmlnX2ZpbGVfdG1wLCAiJXMuWFhYWFhYIiwgY29uZmlnX2ZpbGUpOworCisJLyogT3BlbiBmaWxlIHRvIGNvbmZpZ3VyYXRpb24gd3JpdGUuICovCisJZmQgPSBta3N0ZW1wKGNvbmZpZ19maWxlX3RtcCk7CisJaWYgKGZkIDwgMCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IG9wZW4gY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwKKwkJCWNvbmZpZ19maWxlX3RtcCwgVlRZX05FV0xJTkUpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJLyogTWFrZSB2dHkgZm9yIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi8KKwlmaWxlX3Z0eSA9IHZ0eV9uZXcoKTsKKwlmaWxlX3Z0eS0+ZmQgPSBmZDsKKwlmaWxlX3Z0eS0+dHlwZSA9IFZUWV9GSUxFOworCisJLyogQ29uZmlnIGZpbGUgaGVhZGVyIHByaW50LiAqLworCXZ0eV9vdXQoZmlsZV92dHksICIhXG4hIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eVxuISAgICIpOworCS8vdnR5X3RpbWVfcHJpbnQgKGZpbGVfdnR5LCAxKTsKKwl2dHlfb3V0KGZpbGVfdnR5LCAiIVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCisJCWlmICgobm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgaSkpICYmIG5vZGUtPmZ1bmMpIHsKKwkJCWlmICgoKm5vZGUtPmZ1bmMpIChmaWxlX3Z0eSkpCisJCQkJdnR5X291dChmaWxlX3Z0eSwgIiFcbiIpOworCQl9CisJdnR5X2Nsb3NlKGZpbGVfdnR5KTsKKworCWlmICh1bmxpbmsoY29uZmlnX2ZpbGVfc2F2KSAhPSAwKQorCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQl2dHlfb3V0KHZ0eSwKKwkJCQkiQ2FuJ3QgdW5saW5rIGJhY2t1cCBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLAorCQkJCWNvbmZpZ19maWxlX3NhdiwgVlRZX05FV0xJTkUpOworCQkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCQl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCWlmIChsaW5rKGNvbmZpZ19maWxlLCBjb25maWdfZmlsZV9zYXYpICE9IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBiYWNrdXAgb2xkIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCisJCQljb25maWdfZmlsZV9zYXYsIFZUWV9ORVdMSU5FKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJc3luYygpOworCWlmICh1bmxpbmsoY29uZmlnX2ZpbGUpICE9IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCB1bmxpbmsgY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwKKwkJCWNvbmZpZ19maWxlLCBWVFlfTkVXTElORSk7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCXVubGluayhjb25maWdfZmlsZV90bXApOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWlmIChsaW5rKGNvbmZpZ19maWxlX3RtcCwgY29uZmlnX2ZpbGUpICE9IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBzYXZlIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsIGNvbmZpZ19maWxlLAorCQkJVlRZX05FV0xJTkUpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwlzeW5jKCk7CisKKwl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisKKwlpZiAoY2htb2QoY29uZmlnX2ZpbGUsIDA2NjYgJiB+Q09ORklHRklMRV9NQVNLKSAhPSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3QgY2htb2QgY29uZmlndXJhdGlvbiBmaWxlICVzOiAlcyAoJWQpLiVzIiwKKwkJCWNvbmZpZ19maWxlLCBzdHJlcnJvcihlcnJubyksIGVycm5vLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwl2dHlfb3V0KHZ0eSwgIkNvbmZpZ3VyYXRpb24gc2F2ZWQgdG8gJXMlcyIsIGNvbmZpZ19maWxlLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhjb25maWdfd3JpdGVfZmlsZSwKKyAgICAgIGNvbmZpZ193cml0ZV9jbWQsCisgICAgICAid3JpdGUiLCAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIpCisKKyAgICBBTElBUyhjb25maWdfd3JpdGVfZmlsZSwKKyAgICAgIGNvbmZpZ193cml0ZV9tZW1vcnlfY21kLAorICAgICAgIndyaXRlIG1lbW9yeSIsCisgICAgICAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIKKyAgICAgICJXcml0ZSBjb25maWd1cmF0aW9uIHRvIHRoZSBmaWxlIChzYW1lIGFzIHdyaXRlIGZpbGUpXG4iKQorCisgICAgQUxJQVMoY29uZmlnX3dyaXRlX2ZpbGUsCisgICAgICBjb3B5X3J1bm5pbmdjb25maWdfc3RhcnR1cGNvbmZpZ19jbWQsCisgICAgICAiY29weSBydW5uaW5nLWNvbmZpZyBzdGFydHVwLWNvbmZpZyIsCisgICAgICAiQ29weSBjb25maWd1cmF0aW9uXG4iCisgICAgICAiQ29weSBydW5uaW5nIGNvbmZpZyB0by4uLiBcbiIKKyAgICAgICJDb3B5IHJ1bm5pbmcgY29uZmlnIHRvIHN0YXJ0dXAgY29uZmlnIChzYW1lIGFzIHdyaXRlIGZpbGUpXG4iKQorCisvKiBXcml0ZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaW50byB0aGUgdGVybWluYWwuICovCisgICAgREVGVU4oY29uZmlnX3dyaXRlX3Rlcm1pbmFsLAorICAgICAgY29uZmlnX3dyaXRlX3Rlcm1pbmFsX2NtZCwKKyAgICAgICJ3cml0ZSB0ZXJtaW5hbCIsCisgICAgICAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIKKyAgICAgICJXcml0ZSB0byB0ZXJtaW5hbFxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgY21kX25vZGUgKm5vZGU7CisKKwlpZiAodnR5LT50eXBlID09IFZUWV9TSEVMTF9TRVJWKSB7CisJCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZHZlYyk7IGkrKykKKwkJCWlmICgobm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgaSkpICYmIG5vZGUtPmZ1bmMKKwkJCSAgICAmJiBub2RlLT52dHlzaCkgeworCQkJCWlmICgoKm5vZGUtPmZ1bmMpICh2dHkpKQorCQkJCQl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKKwkJCX0KKwl9IGVsc2UgeworCQl2dHlfb3V0KHZ0eSwgIiVzQ3VycmVudCBjb25maWd1cmF0aW9uOiVzIiwgVlRZX05FV0xJTkUsCisJCQlWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiISVzIiwgVlRZX05FV0xJTkUpOworCisJCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZHZlYyk7IGkrKykKKwkJCWlmICgobm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgaSkpICYmIG5vZGUtPmZ1bmMpIHsKKwkJCQlpZiAoKCpub2RlLT5mdW5jKSAodnR5KSkKKwkJCQkJdnR5X291dCh2dHksICIhJXMiLCBWVFlfTkVXTElORSk7CisJCQl9CisJCXZ0eV9vdXQodnR5LCAiZW5kJXMiLCBWVFlfTkVXTElORSk7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogV3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uIGludG8gdGhlIHRlcm1pbmFsLiAqLworQUxJQVMoY29uZmlnX3dyaXRlX3Rlcm1pbmFsLAorICAgICAgc2hvd19ydW5uaW5nX2NvbmZpZ19jbWQsCisgICAgICAic2hvdyBydW5uaW5nLWNvbmZpZyIsIFNIT1dfU1RSICJydW5uaW5nIGNvbmZpZ3VyYXRpb25cbiIpCisKKy8qIFdyaXRlIHN0YXJ0dXAgY29uZmlndXJhdGlvbiBpbnRvIHRoZSB0ZXJtaW5hbC4gKi8KKyAgICBERUZVTihzaG93X3N0YXJ0dXBfY29uZmlnLAorICAgICAgc2hvd19zdGFydHVwX2NvbmZpZ19jbWQsCisgICAgICAic2hvdyBzdGFydHVwLWNvbmZpZyIsIFNIT1dfU1RSICJDb250ZW50ZXMgb2Ygc3RhcnR1cCBjb25maWd1cmF0aW9uXG4iKQoreworCWNoYXIgYnVmW0JVRlNJWl07CisJRklMRSAqY29uZnA7CisKKwljb25mcCA9IGZvcGVuKGhvc3QuY29uZmlnLCAiciIpOworCWlmIChjb25mcCA9PSBOVUxMKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgb3BlbiBjb25maWd1cmF0aW9uIGZpbGUgWyVzXSVzIiwKKwkJCWhvc3QuY29uZmlnLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwl3aGlsZSAoZmdldHMoYnVmLCBCVUZTSVosIGNvbmZwKSkgeworCQljaGFyICpjcCA9IGJ1ZjsKKworCQl3aGlsZSAoKmNwICE9ICdccicgJiYgKmNwICE9ICdcbicgJiYgKmNwICE9ICdcMCcpCisJCQljcCsrOworCQkqY3AgPSAnXDAnOworCisJCXZ0eV9vdXQodnR5LCAiJXMlcyIsIGJ1ZiwgVlRZX05FV0xJTkUpOworCX0KKworCWZjbG9zZShjb25mcCk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIEhvc3RuYW1lIGNvbmZpZ3VyYXRpb24gKi8KK0RFRlVOKGNvbmZpZ19ob3N0bmFtZSwKKyAgICAgIGhvc3RuYW1lX2NtZCwKKyAgICAgICJob3N0bmFtZSBXT1JEIiwKKyAgICAgICJTZXQgc3lzdGVtJ3MgbmV0d29yayBuYW1lXG4iICJUaGlzIHN5c3RlbSdzIG5ldHdvcmsgbmFtZVxuIikKK3sKKwlpZiAoIWlzYWxwaGEoKGludCkqYXJndlswXSkpIHsKKwkJdnR5X291dCh2dHksICJQbGVhc2Ugc3BlY2lmeSBzdHJpbmcgc3RhcnRpbmcgd2l0aCBhbHBoYWJldCVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChob3N0Lm5hbWUpCisJCXRhbGxvY19mcmVlKGhvc3QubmFtZSk7CisKKwlob3N0Lm5hbWUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX25vX2hvc3RuYW1lLAorICAgICAgbm9faG9zdG5hbWVfY21kLAorICAgICAgIm5vIGhvc3RuYW1lIFtIT1NUTkFNRV0iLAorICAgICAgTk9fU1RSICJSZXNldCBzeXN0ZW0ncyBuZXR3b3JrIG5hbWVcbiIgIkhvc3QgbmFtZSBvZiB0aGlzIHJvdXRlclxuIikKK3sKKwlpZiAoaG9zdC5uYW1lKQorCQl0YWxsb2NfZnJlZShob3N0Lm5hbWUpOworCWhvc3QubmFtZSA9IE5VTEw7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBWVFkgaW50ZXJmYWNlIHBhc3N3b3JkIHNldC4gKi8KK0RFRlVOKGNvbmZpZ19wYXNzd29yZCwgcGFzc3dvcmRfY21kLAorICAgICAgInBhc3N3b3JkICg4fCkgV09SRCIsCisgICAgICAiQXNzaWduIHRoZSB0ZXJtaW5hbCBjb25uZWN0aW9uIHBhc3N3b3JkXG4iCisgICAgICAiU3BlY2lmaWVzIGEgSElEREVOIHBhc3N3b3JkIHdpbGwgZm9sbG93XG4iCisgICAgICAiZHVtbXkgc3RyaW5nIFxuIiAiVGhlIEhJRERFTiBsaW5lIHBhc3N3b3JkIHN0cmluZ1xuIikKK3sKKwkvKiBBcmd1bWVudCBjaGVjay4gKi8KKwlpZiAoYXJnYyA9PSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiUGxlYXNlIHNwZWNpZnkgcGFzc3dvcmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoYXJnYyA9PSAyKSB7CisJCWlmICgqYXJndlswXSA9PSAnOCcpIHsKKwkJCWlmIChob3N0LnBhc3N3b3JkKQorCQkJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmQpOworCQkJaG9zdC5wYXNzd29yZCA9IE5VTEw7CisJCQlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQorCQkJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmRfZW5jcnlwdCk7CisJCQlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMV0pOworCQkJcmV0dXJuIENNRF9TVUNDRVNTOworCQl9IGVsc2UgeworCQkJdnR5X291dCh2dHksICJVbmtub3duIGVuY3J5cHRpb24gdHlwZS4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCX0KKworCWlmICghaXNhbG51bSgoaW50KSphcmd2WzBdKSkgeworCQl2dHlfb3V0KHZ0eSwKKwkJCSJQbGVhc2Ugc3BlY2lmeSBzdHJpbmcgc3RhcnRpbmcgd2l0aCBhbHBoYW51bWVyaWMlcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaG9zdC5wYXNzd29yZCkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZCk7CisJaG9zdC5wYXNzd29yZCA9IE5VTEw7CisKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwlpZiAoaG9zdC5lbmNyeXB0KSB7CisJCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOworCQlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGFyZ3ZbMF0pKTsKKwl9IGVsc2UKKyNlbmRpZgorCQlob3N0LnBhc3N3b3JkID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMoY29uZmlnX3Bhc3N3b3JkLCBwYXNzd29yZF90ZXh0X2NtZCwKKyAgICAgICJwYXNzd29yZCBMSU5FIiwKKyAgICAgICJBc3NpZ24gdGhlIHRlcm1pbmFsIGNvbm5lY3Rpb24gcGFzc3dvcmRcbiIKKyAgICAgICJUaGUgVU5FTkNSWVBURUQgKGNsZWFydGV4dCkgbGluZSBwYXNzd29yZFxuIikKKworLyogVlRZIGVuYWJsZSBwYXNzd29yZCBzZXQuICovCisgICAgREVGVU4oY29uZmlnX2VuYWJsZV9wYXNzd29yZCwgZW5hYmxlX3Bhc3N3b3JkX2NtZCwKKyAgICAgICJlbmFibGUgcGFzc3dvcmQgKDh8KSBXT1JEIiwKKyAgICAgICJNb2RpZnkgZW5hYmxlIHBhc3N3b3JkIHBhcmFtZXRlcnNcbiIKKyAgICAgICJBc3NpZ24gdGhlIHByaXZpbGVnZWQgbGV2ZWwgcGFzc3dvcmRcbiIKKyAgICAgICJTcGVjaWZpZXMgYSBISURERU4gcGFzc3dvcmQgd2lsbCBmb2xsb3dcbiIKKyAgICAgICJkdW1teSBzdHJpbmcgXG4iICJUaGUgSElEREVOICdlbmFibGUnIHBhc3N3b3JkIHN0cmluZ1xuIikKK3sKKwkvKiBBcmd1bWVudCBjaGVjay4gKi8KKwlpZiAoYXJnYyA9PSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiUGxlYXNlIHNwZWNpZnkgcGFzc3dvcmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwkvKiBDcnlwdCB0eXBlIGlzIHNwZWNpZmllZC4gKi8KKwlpZiAoYXJnYyA9PSAyKSB7CisJCWlmICgqYXJndlswXSA9PSAnOCcpIHsKKwkJCWlmIChob3N0LmVuYWJsZSkKKwkJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZSk7CisJCQlob3N0LmVuYWJsZSA9IE5VTEw7CisKKwkJCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQkJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCQkJaG9zdC5lbmFibGVfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlsxXSk7CisKKwkJCXJldHVybiBDTURfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCXZ0eV9vdXQodnR5LCAiVW5rbm93biBlbmNyeXB0aW9uIHR5cGUuJXMiLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwl9CisKKwlpZiAoIWlzYWxudW0oKGludCkqYXJndlswXSkpIHsKKwkJdnR5X291dCh2dHksCisJCQkiUGxlYXNlIHNwZWNpZnkgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYWxwaGFudW1lcmljJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGhvc3QuZW5hYmxlKQorCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZSk7CisJaG9zdC5lbmFibGUgPSBOVUxMOworCisJLyogUGxhaW4gcGFzc3dvcmQgaW5wdXQuICovCisjaWZkZWYgVlRZX0NSWVBUX1BXCisJaWYgKGhvc3QuZW5jcnlwdCkgeworCQlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCQlob3N0LmVuYWJsZV9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCB6ZW5jcnlwdChhcmd2WzBdKSk7CisJfSBlbHNlCisjZW5kaWYKKwkJaG9zdC5lbmFibGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhjb25maWdfZW5hYmxlX3Bhc3N3b3JkLAorICAgICAgZW5hYmxlX3Bhc3N3b3JkX3RleHRfY21kLAorICAgICAgImVuYWJsZSBwYXNzd29yZCBMSU5FIiwKKyAgICAgICJNb2RpZnkgZW5hYmxlIHBhc3N3b3JkIHBhcmFtZXRlcnNcbiIKKyAgICAgICJBc3NpZ24gdGhlIHByaXZpbGVnZWQgbGV2ZWwgcGFzc3dvcmRcbiIKKyAgICAgICJUaGUgVU5FTkNSWVBURUQgKGNsZWFydGV4dCkgJ2VuYWJsZScgcGFzc3dvcmRcbiIpCisKKy8qIFZUWSBlbmFibGUgcGFzc3dvcmQgZGVsZXRlLiAqLworICAgIERFRlVOKG5vX2NvbmZpZ19lbmFibGVfcGFzc3dvcmQsIG5vX2VuYWJsZV9wYXNzd29yZF9jbWQsCisgICAgICAibm8gZW5hYmxlIHBhc3N3b3JkIiwKKyAgICAgIE5PX1NUUgorICAgICAgIk1vZGlmeSBlbmFibGUgcGFzc3dvcmQgcGFyYW1ldGVyc1xuIgorICAgICAgIkFzc2lnbiB0aGUgcHJpdmlsZWdlZCBsZXZlbCBwYXNzd29yZFxuIikKK3sKKwlpZiAoaG9zdC5lbmFibGUpCisJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlKTsKKwlob3N0LmVuYWJsZSA9IE5VTEw7CisKKwlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJaG9zdC5lbmFibGVfZW5jcnlwdCA9IE5VTEw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKK0RFRlVOKHNlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdCwKKyAgICAgIHNlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQsCisgICAgICAic2VydmljZSBwYXNzd29yZC1lbmNyeXB0aW9uIiwKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iICJFbmFibGUgZW5jcnlwdGVkIHBhc3N3b3Jkc1xuIikKK3sKKwlpZiAoaG9zdC5lbmNyeXB0KQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisKKwlob3N0LmVuY3J5cHQgPSAxOworCisJaWYgKGhvc3QucGFzc3dvcmQpIHsKKwkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmRfZW5jcnlwdCk7CisJCWhvc3QucGFzc3dvcmRfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgemVuY3J5cHQoaG9zdC5wYXNzd29yZCkpOworCX0KKwlpZiAoaG9zdC5lbmFibGUpIHsKKwkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwkJaG9zdC5lbmFibGVfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgemVuY3J5cHQoaG9zdC5lbmFibGUpKTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3NlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdCwKKyAgICAgIG5vX3NlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQsCisgICAgICAibm8gc2VydmljZSBwYXNzd29yZC1lbmNyeXB0aW9uIiwKKyAgICAgIE5PX1NUUiAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGVuY3J5cHRlZCBwYXNzd29yZHNcbiIpCit7CisJaWYgKCFob3N0LmVuY3J5cHQpCisJCXJldHVybiBDTURfU1VDQ0VTUzsKKworCWhvc3QuZW5jcnlwdCA9IDA7CisKKwlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQorCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOworCWhvc3QucGFzc3dvcmRfZW5jcnlwdCA9IE5VTEw7CisKKwlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJaG9zdC5lbmFibGVfZW5jcnlwdCA9IE5VTEw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworREVGVU4oY29uZmlnX3Rlcm1pbmFsX2xlbmd0aCwgY29uZmlnX3Rlcm1pbmFsX2xlbmd0aF9jbWQsCisgICAgICAidGVybWluYWwgbGVuZ3RoIDwwLTUxMj4iLAorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIHBhcmFtZXRlcnNcbiIKKyAgICAgICJTZXQgbnVtYmVyIG9mIGxpbmVzIG9uIGEgc2NyZWVuXG4iCisgICAgICAiTnVtYmVyIG9mIGxpbmVzIG9uIHNjcmVlbiAoMCBmb3Igbm8gcGF1c2luZylcbiIpCit7CisJaW50IGxpbmVzOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisKKwlsaW5lcyA9IHN0cnRvbChhcmd2WzBdLCAmZW5kcHRyLCAxMCk7CisJaWYgKGxpbmVzIDwgMCB8fCBsaW5lcyA+IDUxMiB8fCAqZW5kcHRyICE9ICdcMCcpIHsKKwkJdnR5X291dCh2dHksICJsZW5ndGggaXMgbWFsZm9ybWVkJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJdnR5LT5saW5lcyA9IGxpbmVzOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfdGVybWluYWxfbm9fbGVuZ3RoLCBjb25maWdfdGVybWluYWxfbm9fbGVuZ3RoX2NtZCwKKyAgICAgICJ0ZXJtaW5hbCBubyBsZW5ndGgiLAorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIHBhcmFtZXRlcnNcbiIKKyAgICAgIE5PX1NUUiAiU2V0IG51bWJlciBvZiBsaW5lcyBvbiBhIHNjcmVlblxuIikKK3sKKwl2dHktPmxpbmVzID0gLTE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aCwgc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kLAorICAgICAgInNlcnZpY2UgdGVybWluYWwtbGVuZ3RoIDwwLTUxMj4iLAorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIKKyAgICAgICJTeXN0ZW0gd2lkZSB0ZXJtaW5hbCBsZW5ndGggY29uZmlndXJhdGlvblxuIgorICAgICAgIk51bWJlciBvZiBsaW5lcyBvZiBWVFkgKDAgbWVhbnMgbm8gbGluZSBjb250cm9sKVxuIikKK3sKKwlpbnQgbGluZXM7CisJY2hhciAqZW5kcHRyID0gTlVMTDsKKworCWxpbmVzID0gc3RydG9sKGFyZ3ZbMF0sICZlbmRwdHIsIDEwKTsKKwlpZiAobGluZXMgPCAwIHx8IGxpbmVzID4gNTEyIHx8ICplbmRwdHIgIT0gJ1wwJykgeworCQl2dHlfb3V0KHZ0eSwgImxlbmd0aCBpcyBtYWxmb3JtZWQlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlob3N0LmxpbmVzID0gbGluZXM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3NlcnZpY2VfdGVybWluYWxfbGVuZ3RoLCBub19zZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aF9jbWQsCisgICAgICAibm8gc2VydmljZSB0ZXJtaW5hbC1sZW5ndGggWzwwLTUxMj5dIiwKKyAgICAgIE5PX1NUUgorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIKKyAgICAgICJTeXN0ZW0gd2lkZSB0ZXJtaW5hbCBsZW5ndGggY29uZmlndXJhdGlvblxuIgorICAgICAgIk51bWJlciBvZiBsaW5lcyBvZiBWVFkgKDAgbWVhbnMgbm8gbGluZSBjb250cm9sKVxuIikKK3sKKwlob3N0LmxpbmVzID0gLTE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTl9ISURERU4oZG9fZWNobywKKwkgICAgIGVjaG9fY21kLAorCSAgICAgImVjaG8gLk1FU1NBR0UiLAorCSAgICAgIkVjaG8gYSBtZXNzYWdlIGJhY2sgdG8gdGhlIHZ0eVxuIiAiVGhlIG1lc3NhZ2UgdG8gZWNob1xuIikKK3sKKwljaGFyICptZXNzYWdlOworCisJdnR5X291dCh2dHksICIlcyVzIiwKKwkJKChtZXNzYWdlID0KKwkJICBhcmd2X2NvbmNhdChhcmd2LCBhcmdjLCAwKSkgPyBtZXNzYWdlIDogIiIpLCBWVFlfTkVXTElORSk7CisJaWYgKG1lc3NhZ2UpCisJCXRhbGxvY19mcmVlKG1lc3NhZ2UpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2lmIDAKK0RFRlVOKGNvbmZpZ19sb2dtc2csCisgICAgICBjb25maWdfbG9nbXNnX2NtZCwKKyAgICAgICJsb2dtc2cgIiBMT0dfTEVWRUxTICIgLk1FU1NBR0UiLAorICAgICAgIlNlbmQgYSBtZXNzYWdlIHRvIGVuYWJsZWQgbG9nZ2luZyBkZXN0aW5hdGlvbnNcbiIKKyAgICAgIExPR19MRVZFTF9ERVNDICJUaGUgbWVzc2FnZSB0byBzZW5kXG4iKQoreworCWludCBsZXZlbDsKKwljaGFyICptZXNzYWdlOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKworCXpsb2coTlVMTCwgbGV2ZWwsCisJICAgICAoKG1lc3NhZ2UgPSBhcmd2X2NvbmNhdChhcmd2LCBhcmdjLCAxKSkgPyBtZXNzYWdlIDogIiIpKTsKKwlpZiAobWVzc2FnZSkKKwkJdGFsbG9jX2ZyZWUobWVzc2FnZSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X2xvZ2dpbmcsCisgICAgICBzaG93X2xvZ2dpbmdfY21kLAorICAgICAgInNob3cgbG9nZ2luZyIsIFNIT1dfU1RSICJTaG93IGN1cnJlbnQgbG9nZ2luZyBjb25maWd1cmF0aW9uXG4iKQoreworCXN0cnVjdCB6bG9nICp6bCA9IHpsb2dfZGVmYXVsdDsKKworCXZ0eV9vdXQodnR5LCAiU3lzbG9nIGxvZ2dpbmc6ICIpOworCWlmICh6bC0+bWF4bHZsW1pMT0dfREVTVF9TWVNMT0ddID09IFpMT0dfRElTQUJMRUQpCisJCXZ0eV9vdXQodnR5LCAiZGlzYWJsZWQiKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAibGV2ZWwgJXMsIGZhY2lsaXR5ICVzLCBpZGVudCAlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psLT5tYXhsdmxbWkxPR19ERVNUX1NZU0xPR11dLAorCQkJZmFjaWxpdHlfbmFtZSh6bC0+ZmFjaWxpdHkpLCB6bC0+aWRlbnQpOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIlN0ZG91dCBsb2dnaW5nOiAiKTsKKwlpZiAoemwtPm1heGx2bFtaTE9HX0RFU1RfU1RET1VUXSA9PSBaTE9HX0RJU0FCTEVEKQorCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemwtPm1heGx2bFtaTE9HX0RFU1RfU1RET1VUXV0pOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIk1vbml0b3IgbG9nZ2luZzogIik7CisJaWYgKHpsLT5tYXhsdmxbWkxPR19ERVNUX01PTklUT1JdID09IFpMT0dfRElTQUJMRUQpCisJCXZ0eV9vdXQodnR5LCAiZGlzYWJsZWQiKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAibGV2ZWwgJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXV0pOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIkZpbGUgbG9nZ2luZzogIik7CisJaWYgKCh6bC0+bWF4bHZsW1pMT0dfREVTVF9GSUxFXSA9PSBaTE9HX0RJU0FCTEVEKSB8fCAhemwtPmZwKQorCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzLCBmaWxlbmFtZSAlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psLT5tYXhsdmxbWkxPR19ERVNUX0ZJTEVdXSwKKwkJCXpsLT5maWxlbmFtZSk7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiUHJvdG9jb2wgbmFtZTogJXMlcyIsCisJCXpsb2dfcHJvdG9fbmFtZXNbemwtPnByb3RvY29sXSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiUmVjb3JkIHByaW9yaXR5OiAlcyVzIiwKKwkJKHpsLT5yZWNvcmRfcHJpb3JpdHkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX3N0ZG91dCwKKyAgICAgIGNvbmZpZ19sb2dfc3Rkb3V0X2NtZCwKKyAgICAgICJsb2cgc3Rkb3V0IiwgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHN0ZG91dCBsb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TVERPVVQsIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19zdGRvdXRfbGV2ZWwsCisgICAgICBjb25maWdfbG9nX3N0ZG91dF9sZXZlbF9jbWQsCisgICAgICAibG9nIHN0ZG91dCAiIExPR19MRVZFTFMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgc3Rkb3V0IGxvZ2dpbmcgbGV2ZWxcbiIgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IGxldmVsOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1RET1VULCBsZXZlbCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX3N0ZG91dCwKKyAgICAgIG5vX2NvbmZpZ19sb2dfc3Rkb3V0X2NtZCwKKyAgICAgICJubyBsb2cgc3Rkb3V0IFtMRVZFTF0iLAorICAgICAgTk9fU1RSICJMb2dnaW5nIGNvbnRyb2xcbiIgIkNhbmNlbCBsb2dnaW5nIHRvIHN0ZG91dFxuIiAiTG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1RET1VULCBaTE9HX0RJU0FCTEVEKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfbW9uaXRvciwKKyAgICAgIGNvbmZpZ19sb2dfbW9uaXRvcl9jbWQsCisgICAgICAibG9nIG1vbml0b3IiLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHRlcm1pbmFsIGxpbmUgKG1vbml0b3IpIGxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX01PTklUT1IsIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19tb25pdG9yX2xldmVsLAorICAgICAgY29uZmlnX2xvZ19tb25pdG9yX2xldmVsX2NtZCwKKyAgICAgICJsb2cgbW9uaXRvciAiIExPR19MRVZFTFMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgKG1vbml0b3IpIGxvZ2dpbmcgbGV2ZWxcbiIgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IGxldmVsOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfTU9OSVRPUiwgbGV2ZWwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19tb25pdG9yLAorICAgICAgbm9fY29uZmlnX2xvZ19tb25pdG9yX2NtZCwKKyAgICAgICJubyBsb2cgbW9uaXRvciBbTEVWRUxdIiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkRpc2FibGUgdGVybWluYWwgbGluZSAobW9uaXRvcikgbG9nZ2luZ1xuIiAiTG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfTU9OSVRPUiwgWkxPR19ESVNBQkxFRCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHNldF9sb2dfZmlsZShzdHJ1Y3QgdnR5ICp2dHksIGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgbG9nbGV2ZWwpCit7CisJaW50IHJldDsKKwljaGFyICpwID0gTlVMTDsKKwljb25zdCBjaGFyICpmdWxscGF0aDsKKworCS8qIFBhdGggZGV0ZWN0aW9uLiAqLworCWlmICghSVNfRElSRUNUT1JZX1NFUCgqZm5hbWUpKSB7CisJCWNoYXIgY3dkW01BWFBBVEhMRU4gKyAxXTsKKwkJY3dkW01BWFBBVEhMRU5dID0gJ1wwJzsKKworCQlpZiAoZ2V0Y3dkKGN3ZCwgTUFYUEFUSExFTikgPT0gTlVMTCkgeworCQkJemxvZ19lcnIoImNvbmZpZ19sb2dfZmlsZTogVW5hYmxlIHRvIGFsbG9jIG1lbSEiKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCisJCWlmICgocCA9IF90YWxsb2NfemVybyh0YWxsX3ZjbWRfY3R4LAorCQkJCSAgICAgIHN0cmxlbihjd2QpICsgc3RybGVuKGZuYW1lKSArIDIpLAorCQkJCSAgICAgICJzZXRfbG9nX2ZpbGUiKQorCQkgICAgPT0gTlVMTCkgeworCQkJemxvZ19lcnIoImNvbmZpZ19sb2dfZmlsZTogVW5hYmxlIHRvIGFsbG9jIG1lbSEiKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlzcHJpbnRmKHAsICIlcy8lcyIsIGN3ZCwgZm5hbWUpOworCQlmdWxscGF0aCA9IHA7CisJfSBlbHNlCisJCWZ1bGxwYXRoID0gZm5hbWU7CisKKwlyZXQgPSB6bG9nX3NldF9maWxlKE5VTEwsIGZ1bGxwYXRoLCBsb2dsZXZlbCk7CisKKwlpZiAocCkKKwkJdGFsbG9jX2ZyZWUocCk7CisKKwlpZiAoIXJldCkgeworCQl2dHlfb3V0KHZ0eSwgImNhbid0IG9wZW4gbG9nZmlsZSAlc1xuIiwgZm5hbWUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGhvc3QubG9nZmlsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5sb2dmaWxlKTsKKworCWhvc3QubG9nZmlsZSA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgZm5hbWUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX2ZpbGUsCisgICAgICBjb25maWdfbG9nX2ZpbGVfY21kLAorICAgICAgImxvZyBmaWxlIEZJTEVOQU1FIiwKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIkxvZ2dpbmcgdG8gZmlsZVxuIiAiTG9nZ2luZyBmaWxlbmFtZVxuIikKK3sKKwlyZXR1cm4gc2V0X2xvZ19maWxlKHZ0eSwgYXJndlswXSwgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfZmlsZV9sZXZlbCwKKyAgICAgIGNvbmZpZ19sb2dfZmlsZV9sZXZlbF9jbWQsCisgICAgICAibG9nIGZpbGUgRklMRU5BTUUgIiBMT0dfTEVWRUxTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkxvZ2dpbmcgdG8gZmlsZVxuIiAiTG9nZ2luZyBmaWxlbmFtZVxuIiBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlsxXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXJldHVybiBzZXRfbG9nX2ZpbGUodnR5LCBhcmd2WzBdLCBsZXZlbCk7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfZmlsZSwKKyAgICAgIG5vX2NvbmZpZ19sb2dfZmlsZV9jbWQsCisgICAgICAibm8gbG9nIGZpbGUgW0ZJTEVOQU1FXSIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIkNhbmNlbCBsb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZSBuYW1lXG4iKQoreworCXpsb2dfcmVzZXRfZmlsZShOVUxMKTsKKworCWlmIChob3N0LmxvZ2ZpbGUpCisJCXRhbGxvY19mcmVlKGhvc3QubG9nZmlsZSk7CisKKwlob3N0LmxvZ2ZpbGUgPSBOVUxMOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhub19jb25maWdfbG9nX2ZpbGUsCisgICAgICBub19jb25maWdfbG9nX2ZpbGVfbGV2ZWxfY21kLAorICAgICAgIm5vIGxvZyBmaWxlIEZJTEVOQU1FIExFVkVMIiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkNhbmNlbCBsb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZSBuYW1lXG4iICJMb2dnaW5nIGxldmVsXG4iKQorCisgICAgREVGVU4oY29uZmlnX2xvZ19zeXNsb2csCisgICAgICBjb25maWdfbG9nX3N5c2xvZ19jbWQsCisgICAgICAibG9nIHN5c2xvZyIsICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzeXNsb2cgbG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1lTTE9HLCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfc3lzbG9nX2xldmVsLAorICAgICAgY29uZmlnX2xvZ19zeXNsb2dfbGV2ZWxfY21kLAorICAgICAgImxvZyBzeXNsb2cgIiBMT0dfTEVWRUxTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHN5c2xvZyBsb2dnaW5nIGxldmVsXG4iIExPR19MRVZFTF9ERVNDKQoreworCWludCBsZXZlbDsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgbGV2ZWwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU5fREVQUkVDQVRFRChjb25maWdfbG9nX3N5c2xvZ19mYWNpbGl0eSwKKwkJIGNvbmZpZ19sb2dfc3lzbG9nX2ZhY2lsaXR5X2NtZCwKKwkJICJsb2cgc3lzbG9nIGZhY2lsaXR5ICIgTE9HX0ZBQ0lMSVRJRVMsCisJCSAiTG9nZ2luZyBjb250cm9sXG4iCisJCSAiTG9nZ2luZyBnb2VzIHRvIHN5c2xvZ1xuIgorCQkgIihEZXByZWNhdGVkKSBGYWNpbGl0eSBwYXJhbWV0ZXIgZm9yIHN5c2xvZyBtZXNzYWdlc1xuIgorCQkgTE9HX0ZBQ0lMSVRZX0RFU0MpCit7CisJaW50IGZhY2lsaXR5OworCisJaWYgKChmYWNpbGl0eSA9IGZhY2lsaXR5X21hdGNoKGFyZ3ZbMF0pKSA8IDApCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7CisJemxvZ19kZWZhdWx0LT5mYWNpbGl0eSA9IGZhY2lsaXR5OworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19zeXNsb2csCisgICAgICBub19jb25maWdfbG9nX3N5c2xvZ19jbWQsCisgICAgICAibm8gbG9nIHN5c2xvZyBbTEVWRUxdIiwKKyAgICAgIE5PX1NUUiAiTG9nZ2luZyBjb250cm9sXG4iICJDYW5jZWwgbG9nZ2luZyB0byBzeXNsb2dcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgWkxPR19ESVNBQkxFRCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhub19jb25maWdfbG9nX3N5c2xvZywKKyAgICAgIG5vX2NvbmZpZ19sb2dfc3lzbG9nX2ZhY2lsaXR5X2NtZCwKKyAgICAgICJubyBsb2cgc3lzbG9nIGZhY2lsaXR5ICIgTE9HX0ZBQ0lMSVRJRVMsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJMb2dnaW5nIGdvZXMgdG8gc3lzbG9nXG4iCisgICAgICAiRmFjaWxpdHkgcGFyYW1ldGVyIGZvciBzeXNsb2cgbWVzc2FnZXNcbiIgTE9HX0ZBQ0lMSVRZX0RFU0MpCisKKyAgICBERUZVTihjb25maWdfbG9nX2ZhY2lsaXR5LAorICAgICAgY29uZmlnX2xvZ19mYWNpbGl0eV9jbWQsCisgICAgICAibG9nIGZhY2lsaXR5ICIgTE9HX0ZBQ0lMSVRJRVMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiRmFjaWxpdHkgcGFyYW1ldGVyIGZvciBzeXNsb2cgbWVzc2FnZXNcbiIgTE9HX0ZBQ0lMSVRZX0RFU0MpCit7CisJaW50IGZhY2lsaXR5OworCisJaWYgKChmYWNpbGl0eSA9IGZhY2lsaXR5X21hdGNoKGFyZ3ZbMF0pKSA8IDApCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkgPSBmYWNpbGl0eTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfZmFjaWxpdHksCisgICAgICBub19jb25maWdfbG9nX2ZhY2lsaXR5X2NtZCwKKyAgICAgICJubyBsb2cgZmFjaWxpdHkgW0ZBQ0lMSVRZXSIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJSZXNldCBzeXNsb2cgZmFjaWxpdHkgdG8gZGVmYXVsdCAoZGFlbW9uKVxuIiAiU3lzbG9nIGZhY2lsaXR5XG4iKQoreworCXpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkgPSBMT0dfREFFTU9OOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU5fREVQUkVDQVRFRChjb25maWdfbG9nX3RyYXAsCisJCSBjb25maWdfbG9nX3RyYXBfY21kLAorCQkgImxvZyB0cmFwICIgTE9HX0xFVkVMUywKKwkJICJMb2dnaW5nIGNvbnRyb2xcbiIKKwkJICIoRGVwcmVjYXRlZCkgU2V0IGxvZ2dpbmcgbGV2ZWwgYW5kIGRlZmF1bHQgZm9yIGFsbCBkZXN0aW5hdGlvbnNcbiIKKwkJIExPR19MRVZFTF9ERVNDKQoreworCWludCBuZXdfbGV2ZWw7CisJaW50IGk7CisKKwlpZiAoKG5ld19sZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKworCXpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwgPSBuZXdfbGV2ZWw7CisJZm9yIChpID0gMDsgaSA8IFpMT0dfTlVNX0RFU1RTOyBpKyspCisJCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtpXSAhPSBaTE9HX0RJU0FCTEVEKQorCQkJemxvZ19kZWZhdWx0LT5tYXhsdmxbaV0gPSBuZXdfbGV2ZWw7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTl9ERVBSRUNBVEVEKG5vX2NvbmZpZ19sb2dfdHJhcCwKKwkJIG5vX2NvbmZpZ19sb2dfdHJhcF9jbWQsCisJCSAibm8gbG9nIHRyYXAgW0xFVkVMXSIsCisJCSBOT19TVFIKKwkJICJMb2dnaW5nIGNvbnRyb2xcbiIKKwkJICJQZXJtaXQgYWxsIGxvZ2dpbmcgaW5mb3JtYXRpb25cbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCA9IExPR19ERUJVRzsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5LAorICAgICAgY29uZmlnX2xvZ19yZWNvcmRfcHJpb3JpdHlfY21kLAorICAgICAgImxvZyByZWNvcmQtcHJpb3JpdHkiLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkxvZyB0aGUgcHJpb3JpdHkgb2YgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBtZXNzYWdlXG4iKQoreworCXpsb2dfZGVmYXVsdC0+cmVjb3JkX3ByaW9yaXR5ID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5LAorICAgICAgbm9fY29uZmlnX2xvZ19yZWNvcmRfcHJpb3JpdHlfY21kLAorICAgICAgIm5vIGxvZyByZWNvcmQtcHJpb3JpdHkiLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiRG8gbm90IGxvZyB0aGUgcHJpb3JpdHkgb2YgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBtZXNzYWdlXG4iKQoreworCXpsb2dfZGVmYXVsdC0+cmVjb3JkX3ByaW9yaXR5ID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworREVGVU4oYmFubmVyX21vdGRfZmlsZSwKKyAgICAgIGJhbm5lcl9tb3RkX2ZpbGVfY21kLAorICAgICAgImJhbm5lciBtb3RkIGZpbGUgW0ZJTEVdIiwKKyAgICAgICJTZXQgYmFubmVyXG4iICJCYW5uZXIgZm9yIG1vdGRcbiIgIkJhbm5lciBmcm9tIGEgZmlsZVxuIiAiRmlsZW5hbWVcbiIpCit7CisJaWYgKGhvc3QubW90ZGZpbGUpCisJCXRhbGxvY19mcmVlKGhvc3QubW90ZGZpbGUpOworCWhvc3QubW90ZGZpbGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihiYW5uZXJfbW90ZF9kZWZhdWx0LAorICAgICAgYmFubmVyX21vdGRfZGVmYXVsdF9jbWQsCisgICAgICAiYmFubmVyIG1vdGQgZGVmYXVsdCIsCisgICAgICAiU2V0IGJhbm5lciBzdHJpbmdcbiIgIlN0cmluZ3MgZm9yIG1vdGRcbiIgIkRlZmF1bHQgc3RyaW5nXG4iKQoreworCWhvc3QubW90ZCA9IGRlZmF1bHRfbW90ZDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2Jhbm5lcl9tb3RkLAorICAgICAgbm9fYmFubmVyX21vdGRfY21kLAorICAgICAgIm5vIGJhbm5lciBtb3RkIiwgTk9fU1RSICJTZXQgYmFubmVyIHN0cmluZ1xuIiAiU3RyaW5ncyBmb3IgbW90ZFxuIikKK3sKKwlob3N0Lm1vdGQgPSBOVUxMOworCWlmIChob3N0Lm1vdGRmaWxlKQorCQl0YWxsb2NfZnJlZShob3N0Lm1vdGRmaWxlKTsKKwlob3N0Lm1vdGRmaWxlID0gTlVMTDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFNldCBjb25maWcgZmlsZW5hbWUuICBDYWxsZWQgZnJvbSB2dHkuYyAqLwordm9pZCBob3N0X2NvbmZpZ19zZXQoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaG9zdC5jb25maWcgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGZpbGVuYW1lKTsKK30KKwordm9pZCBpbnN0YWxsX2RlZmF1bHQoZW51bSBub2RlX3R5cGUgbm9kZSkKK3sKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19leGl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfcXVpdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX2VuZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX2hlbHBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19saXN0X2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ193cml0ZV90ZXJtaW5hbF9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX3dyaXRlX2ZpbGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ193cml0ZV9tZW1vcnlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ193cml0ZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmc2hvd19ydW5uaW5nX2NvbmZpZ19jbWQpOworfQorCisvKiBJbml0aWFsaXplIGNvbW1hbmQgaW50ZXJmYWNlLiBJbnN0YWxsIGJhc2ljIG5vZGVzIGFuZCBjb21tYW5kcy4gKi8KK3ZvaWQgY21kX2luaXQoaW50IHRlcm1pbmFsKQoreworCS8qIEFsbG9jYXRlIGluaXRpYWwgdG9wIHZlY3RvciBvZiBjb21tYW5kcy4gKi8KKwljbWR2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworCisJLyogRGVmYXVsdCBob3N0IHZhbHVlIHNldHRpbmdzLiAqLworCWhvc3QubmFtZSA9IE5VTEw7CisJaG9zdC5wYXNzd29yZCA9IE5VTEw7CisJaG9zdC5lbmFibGUgPSBOVUxMOworCWhvc3QubG9nZmlsZSA9IE5VTEw7CisJaG9zdC5jb25maWcgPSBOVUxMOworCWhvc3QubGluZXMgPSAtMTsKKwlob3N0Lm1vdGQgPSBkZWZhdWx0X21vdGQ7CisJaG9zdC5tb3RkZmlsZSA9IE5VTEw7CisKKwkvKiBJbnN0YWxsIHRvcCBub2Rlcy4gKi8KKwlpbnN0YWxsX25vZGUoJnZpZXdfbm9kZSwgTlVMTCk7CisJaW5zdGFsbF9ub2RlKCZlbmFibGVfbm9kZSwgTlVMTCk7CisJaW5zdGFsbF9ub2RlKCZhdXRoX25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmYXV0aF9lbmFibGVfbm9kZSwgTlVMTCk7CisJaW5zdGFsbF9ub2RlKCZjb25maWdfbm9kZSwgY29uZmlnX3dyaXRlX2hvc3QpOworCisJLyogRWFjaCBub2RlJ3MgYmFzaWMgY29tbWFuZHMuICovCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfdmVyc2lvbl9jbWQpOworCWlmICh0ZXJtaW5hbCkgeworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX2xpc3RfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19leGl0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfcXVpdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX2hlbHBfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19lbmFibGVfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9ub19sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmVjaG9fY21kKTsKKwl9CisKKwlpZiAodGVybWluYWwpIHsKKwkJaW5zdGFsbF9kZWZhdWx0KEVOQUJMRV9OT0RFKTsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX2Rpc2FibGVfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX3Rlcm1pbmFsX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudCAoRU5BQkxFX05PREUsICZjb3B5X3J1bm5pbmdjb25maWdfc3RhcnR1cGNvbmZpZ19jbWQpOworCX0KKwlpbnN0YWxsX2VsZW1lbnQgKEVOQUJMRV9OT0RFLCAmc2hvd19zdGFydHVwX2NvbmZpZ19jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJnNob3dfdmVyc2lvbl9jbWQpOworCisJaWYgKHRlcm1pbmFsKSB7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZlY2hvX2NtZCk7CisKKwkJaW5zdGFsbF9kZWZhdWx0KENPTkZJR19OT0RFKTsKKwl9CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZob3N0bmFtZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX2hvc3RuYW1lX2NtZCk7CisKKwlpZiAodGVybWluYWwpIHsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmcGFzc3dvcmRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmcGFzc3dvcmRfdGV4dF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZlbmFibGVfcGFzc3dvcmRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmZW5hYmxlX3Bhc3N3b3JkX3RleHRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fZW5hYmxlX3Bhc3N3b3JkX2NtZCk7CisKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2VydmljZV9wYXNzd29yZF9lbmNyeXB0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX3NlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQpOworI2VuZGlmCisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmJhbm5lcl9tb3RkX2RlZmF1bHRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmYmFubmVyX21vdGRfZmlsZV9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19iYW5uZXJfbW90ZF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZzZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19zZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aF9jbWQpOworCisJfQorCXNyYW5kKHRpbWUoTlVMTCkpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5L3V0aWxzLmMgYi9vcGVuYnNjL3NyYy92dHkvdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGRmYjhlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L3V0aWxzLmMKQEAgLTAsMCArMSw1MCBAQAorLyogdXRpbGl0eSByb3V0aW5lcyBmb3IgcHJpbnRpbmcgY29tbW9uIG9iamVjdHMgaW4gdGhlIE9zbW9jb20gd29ybGQgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcmF0ZV9jdHIuaD4KKworI2luY2x1ZGUgPHZ0eS92dHkuaD4KKwordm9pZCB2dHlfb3V0X3JhdGVfY3RyX2dyb3VwKHN0cnVjdCB2dHkgKnZ0eSwgY29uc3QgY2hhciAqcHJlZml4LAorCQkJICAgIHN0cnVjdCByYXRlX2N0cl9ncm91cCAqY3RyZykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXZ0eV9vdXQodnR5LCAiJXMlczolcyIsIHByZWZpeCwgY3RyZy0+ZGVzYy0+Z3JvdXBfZGVzY3JpcHRpb24sIFZUWV9ORVdMSU5FKTsKKwlmb3IgKGkgPSAwOyBpIDwgY3RyZy0+ZGVzYy0+bnVtX2N0cjsgaSsrKSB7CisJCXN0cnVjdCByYXRlX2N0ciAqY3RyID0gJmN0cmctPmN0cltpXTsKKwkJdnR5X291dCh2dHksICIgJXMlczogJTgiIFBSSXU2NCAiICIKKwkJCSIoJSIgUFJJdTY0ICIvcyAlIiBQUkl1NjQgIi9tICUiIFBSSXU2NCAiL2ggJSIgUFJJdTY0ICIvZCklcyIsCisJCQlwcmVmaXgsIGN0cmctPmRlc2MtPmN0cl9kZXNjW2ldLmRlc2NyaXB0aW9uLCBjdHItPmN1cnJlbnQsCisJCQljdHItPmludHZbUkFURV9DVFJfSU5UVl9TRUNdLnJhdGUsCisJCQljdHItPmludHZbUkFURV9DVFJfSU5UVl9NSU5dLnJhdGUsCisJCQljdHItPmludHZbUkFURV9DVFJfSU5UVl9IT1VSXS5yYXRlLAorCQkJY3RyLT5pbnR2W1JBVEVfQ1RSX0lOVFZfREFZXS5yYXRlLAorCQkJVlRZX05FV0xJTkUpOworCX07Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvdmVjdG9yLmMgYi9vcGVuYnNjL3NyYy92dHkvdmVjdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI0N2FlNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eS92ZWN0b3IuYwpAQCAtMCwwICsxLDE5MiBAQAorLyogR2VuZXJpYyB2ZWN0b3IgaW50ZXJmYWNlIHJvdXRpbmUKKyAqIENvcHlyaWdodCAoQykgMTk5NyBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICogMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHZ0eS92ZWN0b3IuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisKK3ZvaWQgKnRhbGxfdnR5X3ZlY19jdHg7CisKKy8qIEluaXRpYWxpemUgdmVjdG9yIDogYWxsb2NhdGUgbWVtb3J5IGFuZCByZXR1cm4gdmVjdG9yLiAqLwordmVjdG9yIHZlY3Rvcl9pbml0KHVuc2lnbmVkIGludCBzaXplKQoreworCXZlY3RvciB2ID0gdGFsbG9jX3plcm8odGFsbF92dHlfdmVjX2N0eCwgc3RydWN0IF92ZWN0b3IpOworCWlmICghdikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBhbGxvY2F0ZSBhdCBsZWFzdCBvbmUgc2xvdCAqLworCWlmIChzaXplID09IDApCisJCXNpemUgPSAxOworCisJdi0+YWxsb2NlZCA9IHNpemU7CisJdi0+YWN0aXZlID0gMDsKKwl2LT5pbmRleCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzaXplb2Yodm9pZCAqKSAqIHNpemUsCisJCQkJInZlY3Rvcl9pbml0OmluZGV4Iik7CisJaWYgKCF2LT5pbmRleCkgeworCQl0YWxsb2NfZnJlZSh2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB2OworfQorCit2b2lkIHZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZSh2ZWN0b3IgdikKK3sKKwl0YWxsb2NfZnJlZSh2KTsKK30KKwordm9pZCB2ZWN0b3Jfb25seV9pbmRleF9mcmVlKHZvaWQgKmluZGV4KQoreworCXRhbGxvY19mcmVlKGluZGV4KTsKK30KKwordm9pZCB2ZWN0b3JfZnJlZSh2ZWN0b3IgdikKK3sKKwl0YWxsb2NfZnJlZSh2LT5pbmRleCk7CisJdGFsbG9jX2ZyZWUodik7Cit9CisKK3ZlY3RvciB2ZWN0b3JfY29weSh2ZWN0b3IgdikKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl2ZWN0b3IgbmV3ID0gdGFsbG9jX3plcm8odGFsbF92dHlfdmVjX2N0eCwgc3RydWN0IF92ZWN0b3IpOworCWlmICghbmV3KQorCQlyZXR1cm4gTlVMTDsKKworCW5ldy0+YWN0aXZlID0gdi0+YWN0aXZlOworCW5ldy0+YWxsb2NlZCA9IHYtPmFsbG9jZWQ7CisKKwlzaXplID0gc2l6ZW9mKHZvaWQgKikgKiAodi0+YWxsb2NlZCk7CisJbmV3LT5pbmRleCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzaXplLCAidmVjdG9yX2NvcHk6aW5kZXgiKTsKKwlpZiAoIW5ldy0+aW5kZXgpIHsKKwkJdGFsbG9jX2ZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbWNweShuZXctPmluZGV4LCB2LT5pbmRleCwgc2l6ZSk7CisKKwlyZXR1cm4gbmV3OworfQorCisvKiBDaGVjayBhc3NpZ25lZCBpbmRleCwgYW5kIGlmIGl0IHJ1bnMgc2hvcnQgZG91YmxlIGluZGV4IHBvaW50ZXIgKi8KK3ZvaWQgdmVjdG9yX2Vuc3VyZSh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IG51bSkKK3sKKwlpZiAodi0+YWxsb2NlZCA+IG51bSkKKwkJcmV0dXJuOworCisJdi0+aW5kZXggPSB0YWxsb2NfcmVhbGxvY19zaXplKHRhbGxfdnR5X3ZlY19jdHgsIHYtPmluZGV4LAorCQkJCSAgICAgICBzaXplb2Yodm9pZCAqKSAqICh2LT5hbGxvY2VkICogMikpOworCW1lbXNldCgmdi0+aW5kZXhbdi0+YWxsb2NlZF0sIDAsIHNpemVvZih2b2lkICopICogdi0+YWxsb2NlZCk7CisJdi0+YWxsb2NlZCAqPSAyOworCisJaWYgKHYtPmFsbG9jZWQgPD0gbnVtKQorCQl2ZWN0b3JfZW5zdXJlKHYsIG51bSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gb25seSByZXR1cm5zIG5leHQgZW1wdHkgc2xvdCBpbmRleC4gIEl0IGRvc2Ugbm90IG1lYW4KKyAgIHRoZSBzbG90J3MgaW5kZXggbWVtb3J5IGlzIGFzc2lnbmVkLCBwbGVhc2UgY2FsbCB2ZWN0b3JfZW5zdXJlKCkKKyAgIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gKi8KK2ludCB2ZWN0b3JfZW1wdHlfc2xvdCh2ZWN0b3IgdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICh2LT5hY3RpdmUgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdi0+YWN0aXZlOyBpKyspCisJCWlmICh2LT5pbmRleFtpXSA9PSAwKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gaTsKK30KKworLyogU2V0IHZhbHVlIHRvIHRoZSBzbWFsbGVzdCBlbXB0eSBzbG90LiAqLworaW50IHZlY3Rvcl9zZXQodmVjdG9yIHYsIHZvaWQgKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWkgPSB2ZWN0b3JfZW1wdHlfc2xvdCh2KTsKKwl2ZWN0b3JfZW5zdXJlKHYsIGkpOworCisJdi0+aW5kZXhbaV0gPSB2YWw7CisKKwlpZiAodi0+YWN0aXZlIDw9IGkpCisJCXYtPmFjdGl2ZSA9IGkgKyAxOworCisJcmV0dXJuIGk7Cit9CisKKy8qIFNldCB2YWx1ZSB0byBzcGVjaWZpZWQgaW5kZXggc2xvdC4gKi8KK2ludCB2ZWN0b3Jfc2V0X2luZGV4KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSwgdm9pZCAqdmFsKQoreworCXZlY3Rvcl9lbnN1cmUodiwgaSk7CisKKwl2LT5pbmRleFtpXSA9IHZhbDsKKworCWlmICh2LT5hY3RpdmUgPD0gaSkKKwkJdi0+YWN0aXZlID0gaSArIDE7CisKKwlyZXR1cm4gaTsKK30KKworLyogTG9vayB1cCB2ZWN0b3IuICAqLwordm9pZCAqdmVjdG9yX2xvb2t1cCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkgPj0gdi0+YWN0aXZlKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdi0+aW5kZXhbaV07Cit9CisKKy8qIExvb2t1cCB2ZWN0b3IsIGVuc3VyZSBpdC4gKi8KK3ZvaWQgKnZlY3Rvcl9sb29rdXBfZW5zdXJlKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwl2ZWN0b3JfZW5zdXJlKHYsIGkpOworCXJldHVybiB2LT5pbmRleFtpXTsKK30KKworLyogVW5zZXQgdmFsdWUgYXQgc3BlY2lmaWVkIGluZGV4IHNsb3QuICovCit2b2lkIHZlY3Rvcl91bnNldCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkgPj0gdi0+YWxsb2NlZCkKKwkJcmV0dXJuOworCisJdi0+aW5kZXhbaV0gPSBOVUxMOworCisJaWYgKGkgKyAxID09IHYtPmFjdGl2ZSkgeworCQl2LT5hY3RpdmUtLTsKKwkJd2hpbGUgKGkgJiYgdi0+aW5kZXhbLS1pXSA9PSBOVUxMICYmIHYtPmFjdGl2ZS0tKSA7CS8qIElzIHRoaXMgdWdseSA/ICovCisJfQorfQorCisvKiBDb3VudCB0aGUgbnVtYmVyIG9mIG5vdCBlbXBsdHkgc2xvdC4gKi8KK3Vuc2lnbmVkIGludCB2ZWN0b3JfY291bnQodmVjdG9yIHYpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY291bnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHYtPmFjdGl2ZTsgaSsrKQorCQlpZiAodi0+aW5kZXhbaV0gIT0gTlVMTCkKKwkJCWNvdW50Kys7CisKKwlyZXR1cm4gY291bnQ7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvdnR5LmMgYi9vcGVuYnNjL3NyYy92dHkvdnR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwNjg1NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eS92dHkuYwpAQCAtMCwwICsxLDE2NzUgQEAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxhcnBhL3RlbG5ldC5oPgorCisjaW5jbHVkZSAiY2FyZHNoZWxsLmgiCisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dnR5L2J1ZmZlci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisvKiBvdXIgY2FsbGJhY2ssIGxvY2F0ZWQgaW4gdGVsbmV0X2ludGVyZmFjZS5jICovCit2b2lkIHZ0eV9ldmVudChlbnVtIGV2ZW50IGV2ZW50LCBpbnQgc29jaywgc3RydWN0IHZ0eSAqdnR5KTsKKworZXh0ZXJuIHN0cnVjdCBob3N0IGhvc3Q7CisKKy8qIFZlY3RvciB3aGljaCBzdG9yZSBlYWNoIHZ0eSBzdHJ1Y3R1cmUuICovCitzdGF0aWMgdmVjdG9yIHZ0eXZlYzsKKwordmVjdG9yIFZ2dHlfc2Vydl90aHJlYWQ7CisKK2NoYXIgKnZ0eV9jd2QgPSBOVUxMOworCisvKiBDb25maWd1cmUgbG9jay4gKi8KK3N0YXRpYyBpbnQgdnR5X2NvbmZpZzsKKworc3RhdGljIGludCBub19wYXNzd29yZF9jaGVjayA9IDE7CisKK3ZvaWQgKnRhbGxfdnR5X2N0eDsKKworc3RhdGljIHZvaWQgdnR5X2NsZWFyX2J1ZihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJbWVtc2V0KHZ0eS0+YnVmLCAwLCB2dHktPm1heCk7Cit9CisKKy8qIEFsbG9jYXRlIG5ldyB2dHkgc3RydWN0LiAqLworc3RydWN0IHZ0eSAqdnR5X25ldygpCit7CisJc3RydWN0IHZ0eSAqbmV3ID0gdGFsbG9jX3plcm8odGFsbF92dHlfY3R4LCBzdHJ1Y3QgdnR5KTsKKworCWlmICghbmV3KQorCQlnb3RvIG91dDsKKworCW5ldy0+b2J1ZiA9IGJ1ZmZlcl9uZXcobmV3LCAwKTsJLyogVXNlIGRlZmF1bHQgYnVmZmVyIHNpemUuICovCisJaWYgKCFuZXctPm9idWYpCisJCWdvdG8gb3V0X25ldzsKKwluZXctPmJ1ZiA9IF90YWxsb2NfemVybyhuZXcsIFZUWV9CVUZTSVosICJ2dHlfbmV3LT5idWYiKTsKKwlpZiAoIW5ldy0+YnVmKQorCQlnb3RvIG91dF9vYnVmOworCisJbmV3LT5tYXggPSBWVFlfQlVGU0laOworCisJcmV0dXJuIG5ldzsKKworb3V0X29idWY6CisJYnVmZmVyX2ZyZWUobmV3LT5vYnVmKTsKK291dF9uZXc6CisJdGFsbG9jX2ZyZWUobmV3KTsKKwluZXcgPSBOVUxMOworb3V0OgorCXJldHVybiBuZXc7Cit9CisKKy8qIEF1dGhlbnRpY2F0aW9uIG9mIHZ0eSAqLworc3RhdGljIHZvaWQgdnR5X2F1dGgoc3RydWN0IHZ0eSAqdnR5LCBjaGFyICpidWYpCit7CisJY2hhciAqcGFzc3dkID0gTlVMTDsKKwllbnVtIG5vZGVfdHlwZSBuZXh0X25vZGUgPSAwOworCWludCBmYWlsOworCWNoYXIgKmNyeXB0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBBVVRIX05PREU6CisjaWZkZWYgVlRZX0NSWVBUX1BXCisJCWlmIChob3N0LmVuY3J5cHQpCisJCQlwYXNzd2QgPSBob3N0LnBhc3N3b3JkX2VuY3J5cHQ7CisJCWVsc2UKKyNlbmRpZgorCQkJcGFzc3dkID0gaG9zdC5wYXNzd29yZDsKKwkJaWYgKGhvc3QuYWR2YW5jZWQpCisJCQluZXh0X25vZGUgPSBob3N0LmVuYWJsZSA/IFZJRVdfTk9ERSA6IEVOQUJMRV9OT0RFOworCQllbHNlCisJCQluZXh0X25vZGUgPSBWSUVXX05PREU7CisJCWJyZWFrOworCWNhc2UgQVVUSF9FTkFCTEVfTk9ERToKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwkJaWYgKGhvc3QuZW5jcnlwdCkKKwkJCXBhc3N3ZCA9IGhvc3QuZW5hYmxlX2VuY3J5cHQ7CisJCWVsc2UKKyNlbmRpZgorCQkJcGFzc3dkID0gaG9zdC5lbmFibGU7CisJCW5leHRfbm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwl9CisKKwlpZiAocGFzc3dkKSB7CisjaWZkZWYgVlRZX0NSWVBUX1BXCisJCWlmIChob3N0LmVuY3J5cHQpCisJCQlmYWlsID0gc3RyY21wKGNyeXB0KGJ1ZiwgcGFzc3dkKSwgcGFzc3dkKTsKKwkJZWxzZQorI2VuZGlmCisJCQlmYWlsID0gc3RyY21wKGJ1ZiwgcGFzc3dkKTsKKwl9IGVsc2UKKwkJZmFpbCA9IDE7CisKKwlpZiAoIWZhaWwpIHsKKwkJdnR5LT5mYWlsID0gMDsKKwkJdnR5LT5ub2RlID0gbmV4dF9ub2RlOwkvKiBTdWNjZXNzICEgKi8KKwl9IGVsc2UgeworCQl2dHktPmZhaWwrKzsKKwkJaWYgKHZ0eS0+ZmFpbCA+PSAzKSB7CisJCQlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERSkgeworCQkJCXZ0eV9vdXQodnR5LAorCQkJCQkiJSUgQmFkIHBhc3N3b3JkcywgdG9vIG1hbnkgZmFpbHVyZXMhJXMiLAorCQkJCQlWVFlfTkVXTElORSk7CisJCQkJdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJCQl9IGVsc2UgeworCQkJCS8qIEFVVEhfRU5BQkxFX05PREUgKi8KKwkJCQl2dHktPmZhaWwgPSAwOworCQkJCXZ0eV9vdXQodnR5LAorCQkJCQkiJSUgQmFkIGVuYWJsZSBwYXNzd29yZHMsIHRvbyBtYW55IGZhaWx1cmVzISVzIiwKKwkJCQkJVlRZX05FV0xJTkUpOworCQkJCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKwkJCX0KKwkJfQorCX0KK30KKworLyogQ2xvc2UgdnR5IGludGVyZmFjZS4gKi8KK3ZvaWQgdnR5X2Nsb3NlKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKworCWlmICh2dHktPm9idWYpICB7CisJCS8qIEZsdXNoIGJ1ZmZlci4gKi8KKwkJYnVmZmVyX2ZsdXNoX2FsbCh2dHktPm9idWYsIHZ0eS0+ZmQpOworCisJCS8qIEZyZWUgaW5wdXQgYnVmZmVyLiAqLworCQlidWZmZXJfZnJlZSh2dHktPm9idWYpOworCQl2dHktPm9idWYgPSBOVUxMOworCX0KKworCS8qIEZyZWUgY29tbWFuZCBoaXN0b3J5LiAqLworCWZvciAoaSA9IDA7IGkgPCBWVFlfTUFYSElTVDsgaSsrKQorCQlpZiAodnR5LT5oaXN0W2ldKQorCQkJdGFsbG9jX2ZyZWUodnR5LT5oaXN0W2ldKTsKKworCS8qIFVuc2V0IHZlY3Rvci4gKi8KKwl2ZWN0b3JfdW5zZXQodnR5dmVjLCB2dHktPmZkKTsKKworCS8qIENsb3NlIHNvY2tldC4gKi8KKwlpZiAodnR5LT5mZCA+IDApCisJCWNsb3NlKHZ0eS0+ZmQpOworCisJaWYgKHZ0eS0+YnVmKSB7CisJCXRhbGxvY19mcmVlKHZ0eS0+YnVmKTsKKwkJdnR5LT5idWYgPSBOVUxMOworCX0KKworCS8qIENoZWNrIGNvbmZpZ3VyZS4gKi8KKwl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCisJLyogVlRZX0NMT1NFRCBpcyBoYW5kbGVkIGJ5IHRoZSB0ZWxuZXRfaW50ZXJmYWNlICovCisJdnR5X2V2ZW50KFZUWV9DTE9TRUQsIHZ0eS0+ZmQsIHZ0eSk7CisKKwkvKiBPSyBmcmVlIHZ0eS4gKi8KKwl0YWxsb2NfZnJlZSh2dHkpOworfQorCitpbnQgdnR5X3NoZWxsKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlyZXR1cm4gdnR5LT50eXBlID09IFZUWV9TSEVMTCA/IDEgOiAwOworfQorCisKKy8qIFZUWSBzdGFuZGFyZCBvdXRwdXQgZnVuY3Rpb24uICovCitpbnQgdnR5X291dChzdHJ1Y3QgdnR5ICp2dHksIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgbGVuID0gMDsKKwlpbnQgc2l6ZSA9IDEwMjQ7CisJY2hhciBidWZbMTAyNF07CisJY2hhciAqcCA9IE5VTEw7CisKKwlpZiAodnR5X3NoZWxsKHZ0eSkpIHsKKwkJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwkJdnByaW50Zihmb3JtYXQsIGFyZ3MpOworCQl2YV9lbmQoYXJncyk7CisJfSBlbHNlIHsKKwkJLyogVHJ5IHRvIHdyaXRlIHRvIGluaXRpYWwgYnVmZmVyLiAgKi8KKwkJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwkJbGVuID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgZm9ybWF0LCBhcmdzKTsKKwkJdmFfZW5kKGFyZ3MpOworCisJCS8qIEluaXRpYWwgYnVmZmVyIGlzIG5vdCBlbm91Z2guICAqLworCQlpZiAobGVuIDwgMCB8fCBsZW4gPj0gc2l6ZSkgeworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAobGVuID4gLTEpCisJCQkJCXNpemUgPSBsZW4gKyAxOworCQkJCWVsc2UKKwkJCQkJc2l6ZSA9IHNpemUgKiAyOworCisJCQkJcCA9IHRhbGxvY19yZWFsbG9jX3NpemUodnR5LCBwLCBzaXplKTsKKwkJCQlpZiAoIXApCisJCQkJCXJldHVybiAtMTsKKworCQkJCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJCQkJbGVuID0gdnNucHJpbnRmKHAsIHNpemUsIGZvcm1hdCwgYXJncyk7CisJCQkJdmFfZW5kKGFyZ3MpOworCisJCQkJaWYgKGxlbiA+IC0xICYmIGxlbiA8IHNpemUpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogV2hlbiBpbml0aWFsIGJ1ZmZlciBpcyBlbm91Z2ggdG8gc3RvcmUgYWxsIG91dHB1dC4gICovCisJCWlmICghcCkKKwkJCXAgPSBidWY7CisKKwkJLyogUG9pbnRlciBwIG11c3QgcG9pbnQgb3V0IGJ1ZmZlci4gKi8KKwkJYnVmZmVyX3B1dCh2dHktPm9idWYsICh1X2NoYXIgKikgcCwgbGVuKTsKKworCQkvKiBJZiBwIGlzIG5vdCBkaWZmZXJlbnQgd2l0aCBidWYsIGl0IGlzIGFsbG9jYXRlZCBidWZmZXIuICAqLworCQlpZiAocCAhPSBidWYpCisJCQl0YWxsb2NfZnJlZShwKTsKKwl9CisKKwl2dHlfZXZlbnQoVlRZX1dSSVRFLCB2dHktPmZkLCB2dHkpOworCisJcmV0dXJuIGxlbjsKK30KKworaW50IHZ0eV9vdXRfbmV3bGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJY2hhciAqcCA9IHZ0eV9uZXdsaW5lKHZ0eSk7CisJYnVmZmVyX3B1dCh2dHktPm9idWYsIHAsIHN0cmxlbihwKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB2dHlfY29uZmlnX2xvY2soc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHlfY29uZmlnID09IDApIHsKKwkJdnR5LT5jb25maWcgPSAxOworCQl2dHlfY29uZmlnID0gMTsKKwl9CisJcmV0dXJuIHZ0eS0+Y29uZmlnOworfQorCitpbnQgdnR5X2NvbmZpZ191bmxvY2soc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHlfY29uZmlnID09IDEgJiYgdnR5LT5jb25maWcgPT0gMSkgeworCQl2dHktPmNvbmZpZyA9IDA7CisJCXZ0eV9jb25maWcgPSAwOworCX0KKwlyZXR1cm4gdnR5LT5jb25maWc7Cit9CisKKy8qIFNheSBoZWxsbyB0byB2dHkgaW50ZXJmYWNlLiAqLwordm9pZCB2dHlfaGVsbG8oc3RydWN0IHZ0eSAqdnR5KQoreworCWlmIChob3N0Lm1vdGRmaWxlKSB7CisJCUZJTEUgKmY7CisJCWNoYXIgYnVmWzQwOTZdOworCisJCWYgPSBmb3Blbihob3N0Lm1vdGRmaWxlLCAiciIpOworCQlpZiAoZikgeworCQkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpKSB7CisJCQkJY2hhciAqczsKKwkJCQkvKiB3b3JrIGJhY2t3YXJkcyB0byBpZ25vcmUgdHJhaWxsaW5nIGlzc3BhY2UoKSAqLworCQkJCWZvciAocyA9IGJ1ZiArIHN0cmxlbihidWYpOworCQkJCSAgICAgKHMgPiBidWYpICYmIGlzc3BhY2UoKihzIC0gMSkpOyBzLS0pIDsKKwkJCQkqcyA9ICdcMCc7CisJCQkJdnR5X291dCh2dHksICIlcyVzIiwgYnVmLCBWVFlfTkVXTElORSk7CisJCQl9CisJCQlmY2xvc2UoZik7CisJCX0gZWxzZQorCQkJdnR5X291dCh2dHksICJNT1REIGZpbGUgbm90IGZvdW5kJXMiLCBWVFlfTkVXTElORSk7CisJfSBlbHNlIGlmIChob3N0Lm1vdGQpCisJCXZ0eV9vdXQodnR5LCAiJXMiLCBob3N0Lm1vdGQpOworfQorCisvKiBQdXQgb3V0IHByb21wdCBhbmQgd2FpdCBpbnB1dCBmcm9tIHVzZXIuICovCitzdGF0aWMgdm9pZCB2dHlfcHJvbXB0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzdHJ1Y3QgdXRzbmFtZSBuYW1lczsKKwljb25zdCBjaGFyICpob3N0bmFtZTsKKworCWlmICh2dHktPnR5cGUgPT0gVlRZX1RFUk0pIHsKKwkJaG9zdG5hbWUgPSBob3N0Lm5hbWU7CisJCWlmICghaG9zdG5hbWUpIHsKKwkJCXVuYW1lKCZuYW1lcyk7CisJCQlob3N0bmFtZSA9IG5hbWVzLm5vZGVuYW1lOworCQl9CisJCXZ0eV9vdXQodnR5LCBjbWRfcHJvbXB0KHZ0eS0+bm9kZSksIGhvc3RuYW1lKTsKKwl9Cit9CisKKy8qIENvbW1hbmQgZXhlY3V0aW9uIG92ZXIgdGhlIHZ0eSBpbnRlcmZhY2UuICovCitzdGF0aWMgaW50IHZ0eV9jb21tYW5kKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdmVjdG9yIHZsaW5lOworCisJLyogU3BsaXQgcmVhZGxpbmUgc3RyaW5nIHVwIGludG8gdGhlIHZlY3RvciAqLworCXZsaW5lID0gY21kX21ha2Vfc3RydmVjKGJ1Zik7CisKKwlpZiAodmxpbmUgPT0gTlVMTCkKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCisJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZCh2bGluZSwgdnR5LCBOVUxMLCAwKTsKKwlpZiAocmV0ICE9IENNRF9TVUNDRVNTKQorCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIENNRF9XQVJOSU5HOgorCQkJaWYgKHZ0eS0+dHlwZSA9PSBWVFlfRklMRSkKKwkJCQl2dHlfb3V0KHZ0eSwgIldhcm5pbmcuLi4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9FUlJfQU1CSUdVT1VTOgorCQkJdnR5X291dCh2dHksICIlJSBBbWJpZ3VvdXMgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9FUlJfTk9fTUFUQ0g6CisJCQl2dHlfb3V0KHZ0eSwgIiUlIFVua25vd24gY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9FUlJfSU5DT01QTEVURToKKwkJCXZ0eV9vdXQodnR5LCAiJSUgQ29tbWFuZCBpbmNvbXBsZXRlLiVzIiwgVlRZX05FV0xJTkUpOworCQkJYnJlYWs7CisJCX0KKwljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgdGVsbmV0X2JhY2t3YXJkX2NoYXIgPSAweDA4Oworc3RhdGljIGNvbnN0IGNoYXIgdGVsbmV0X3NwYWNlX2NoYXIgPSAnICc7CisKKy8qIEJhc2ljIGZ1bmN0aW9uIHRvIHdyaXRlIGJ1ZmZlciB0byB2dHkuICovCitzdGF0aWMgdm9pZCB2dHlfd3JpdGUoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBuYnl0ZXMpCit7CisJaWYgKCh2dHktPm5vZGUgPT0gQVVUSF9OT0RFKSB8fCAodnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpKQorCQlyZXR1cm47CisKKwkvKiBTaG91bGQgd2UgZG8gYnVmZmVyaW5nIGhlcmUgPyAgQW5kIG1ha2UgdnR5X2ZsdXNoICh2dHkpID8gKi8KKwlidWZmZXJfcHV0KHZ0eS0+b2J1ZiwgYnVmLCBuYnl0ZXMpOworfQorCisvKiBFbnN1cmUgbGVuZ3RoIG9mIGlucHV0IGJ1ZmZlci4gIElzIGJ1ZmZlciBpcyBzaG9ydCwgZG91YmxlIGl0LiAqLworc3RhdGljIHZvaWQgdnR5X2Vuc3VyZShzdHJ1Y3QgdnR5ICp2dHksIGludCBsZW5ndGgpCit7CisJaWYgKHZ0eS0+bWF4IDw9IGxlbmd0aCkgeworCQl2dHktPm1heCAqPSAyOworCQl2dHktPmJ1ZiA9IHRhbGxvY19yZWFsbG9jX3NpemUodnR5LCB2dHktPmJ1ZiwgdnR5LT5tYXgpOworCQkvLyBGSVhNRTogY2hlY2sgcmV0dXJuCisJfQorfQorCisvKiBCYXNpYyBmdW5jdGlvbiB0byBpbnNlcnQgY2hhcmFjdGVyIGludG8gdnR5LiAqLworc3RhdGljIHZvaWQgdnR5X3NlbGZfaW5zZXJ0KHN0cnVjdCB2dHkgKnZ0eSwgY2hhciBjKQoreworCWludCBpOworCWludCBsZW5ndGg7CisKKwl2dHlfZW5zdXJlKHZ0eSwgdnR5LT5sZW5ndGggKyAxKTsKKwlsZW5ndGggPSB2dHktPmxlbmd0aCAtIHZ0eS0+Y3A7CisJbWVtbW92ZSgmdnR5LT5idWZbdnR5LT5jcCArIDFdLCAmdnR5LT5idWZbdnR5LT5jcF0sIGxlbmd0aCk7CisJdnR5LT5idWZbdnR5LT5jcF0gPSBjOworCisJdnR5X3dyaXRlKHZ0eSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCBsZW5ndGggKyAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7CisKKwl2dHktPmNwKys7CisJdnR5LT5sZW5ndGgrKzsKK30KKworLyogU2VsZiBpbnNlcnQgY2hhcmFjdGVyICdjJyBpbiBvdmVyd3JpdGUgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUoc3RydWN0IHZ0eSAqdnR5LCBjaGFyIGMpCit7CisJdnR5X2Vuc3VyZSh2dHksIHZ0eS0+bGVuZ3RoICsgMSk7CisJdnR5LT5idWZbdnR5LT5jcCsrXSA9IGM7CisKKwlpZiAodnR5LT5jcCA+IHZ0eS0+bGVuZ3RoKQorCQl2dHktPmxlbmd0aCsrOworCisJaWYgKCh2dHktPm5vZGUgPT0gQVVUSF9OT0RFKSB8fCAodnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpKQorCQlyZXR1cm47CisKKwl2dHlfd3JpdGUodnR5LCAmYywgMSk7Cit9CisKKy8qIEluc2VydCBhIHdvcmQgaW50byB2dHkgaW50ZXJmYWNlIHdpdGggb3ZlcndyaXRlIG1vZGUuICovCitzdGF0aWMgdm9pZCB2dHlfaW5zZXJ0X3dvcmRfb3ZlcndyaXRlKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqc3RyKQoreworCWludCBsZW4gPSBzdHJsZW4oc3RyKTsKKwl2dHlfd3JpdGUodnR5LCBzdHIsIGxlbik7CisJc3RyY3B5KCZ2dHktPmJ1Zlt2dHktPmNwXSwgc3RyKTsKKwl2dHktPmNwICs9IGxlbjsKKwl2dHktPmxlbmd0aCA9IHZ0eS0+Y3A7Cit9CisKKy8qIEZvcndhcmQgY2hhcmFjdGVyLiAqLworc3RhdGljIHZvaWQgdnR5X2ZvcndhcmRfY2hhcihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKHZ0eS0+Y3AgPCB2dHktPmxlbmd0aCkgeworCQl2dHlfd3JpdGUodnR5LCAmdnR5LT5idWZbdnR5LT5jcF0sIDEpOworCQl2dHktPmNwKys7CisJfQorfQorCisvKiBCYWNrd2FyZCBjaGFyYWN0ZXIuICovCitzdGF0aWMgdm9pZCB2dHlfYmFja3dhcmRfY2hhcihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKHZ0eS0+Y3AgPiAwKSB7CisJCXZ0eS0+Y3AtLTsKKwkJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9iYWNrd2FyZF9jaGFyLCAxKTsKKwl9Cit9CisKKy8qIE1vdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9iZWdpbm5pbmdfb2ZfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3ApCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9lbmRfb2ZfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgPCB2dHktPmxlbmd0aCkKKwkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOworfQorCisvKiBBZGQgY3VycmVudCBjb21tYW5kIGxpbmUgdG8gdGhlIGhpc3RvcnkgYnVmZmVyLiAqLworc3RhdGljIHZvaWQgdnR5X2hpc3RfYWRkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaW5kZXg7CisKKwlpZiAodnR5LT5sZW5ndGggPT0gMCkKKwkJcmV0dXJuOworCisJaW5kZXggPSB2dHktPmhpbmRleCA/IHZ0eS0+aGluZGV4IC0gMSA6IFZUWV9NQVhISVNUIC0gMTsKKworCS8qIElnbm9yZSB0aGUgc2FtZSBzdHJpbmcgYXMgcHJldmlvdXMgb25lLiAqLworCWlmICh2dHktPmhpc3RbaW5kZXhdKQorCQlpZiAoc3RyY21wKHZ0eS0+YnVmLCB2dHktPmhpc3RbaW5kZXhdKSA9PSAwKSB7CisJCQl2dHktPmhwID0gdnR5LT5oaW5kZXg7CisJCQlyZXR1cm47CisJCX0KKworCS8qIEluc2VydCBoaXN0b3J5IGVudHJ5LiAqLworCWlmICh2dHktPmhpc3RbdnR5LT5oaW5kZXhdKQorCQl0YWxsb2NfZnJlZSh2dHktPmhpc3RbdnR5LT5oaW5kZXhdKTsKKwl2dHktPmhpc3RbdnR5LT5oaW5kZXhdID0gdGFsbG9jX3N0cmR1cCh2dHksIHZ0eS0+YnVmKTsKKworCS8qIEhpc3RvcnkgaW5kZXggcm90YXRpb24uICovCisJdnR5LT5oaW5kZXgrKzsKKwlpZiAodnR5LT5oaW5kZXggPT0gVlRZX01BWEhJU1QpCisJCXZ0eS0+aGluZGV4ID0gMDsKKworCXZ0eS0+aHAgPSB2dHktPmhpbmRleDsKK30KKworLyogR2V0IHRlbG5ldCB3aW5kb3cgc2l6ZS4gKi8KK3N0YXRpYyBpbnQKK3Z0eV90ZWxuZXRfb3B0aW9uIChzdHJ1Y3QgdnR5ICp2dHksIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG5ieXRlcykKK3sKKyNpZmRlZiBURUxORVRfT1BUSU9OX0RFQlVHCisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBuYnl0ZXM7IGkrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKGJ1ZltpXSkKKwl7CisJY2FzZSBJQUM6CisJICB2dHlfb3V0ICh2dHksICJJQUMgIik7CisJICBicmVhazsKKwljYXNlIFdJTEw6CisJICB2dHlfb3V0ICh2dHksICJXSUxMICIpOworCSAgYnJlYWs7CisJY2FzZSBXT05UOgorCSAgdnR5X291dCAodnR5LCAiV09OVCAiKTsKKwkgIGJyZWFrOworCWNhc2UgRE86CisJICB2dHlfb3V0ICh2dHksICJETyAiKTsKKwkgIGJyZWFrOworCWNhc2UgRE9OVDoKKwkgIHZ0eV9vdXQgKHZ0eSwgIkRPTlQgIik7CisJICBicmVhazsKKwljYXNlIFNCOgorCSAgdnR5X291dCAodnR5LCAiU0IgIik7CisJICBicmVhazsKKwljYXNlIFNFOgorCSAgdnR5X291dCAodnR5LCAiU0UgIik7CisJICBicmVhazsKKwljYXNlIFRFTE9QVF9FQ0hPOgorCSAgdnR5X291dCAodnR5LCAiVEVMT1BUX0VDSE8gJXMiLCBWVFlfTkVXTElORSk7CisJICBicmVhazsKKwljYXNlIFRFTE9QVF9TR0E6CisJICB2dHlfb3V0ICh2dHksICJURUxPUFRfU0dBICVzIiwgVlRZX05FV0xJTkUpOworCSAgYnJlYWs7CisJY2FzZSBURUxPUFRfTkFXUzoKKwkgIHZ0eV9vdXQgKHZ0eSwgIlRFTE9QVF9OQVdTICVzIiwgVlRZX05FV0xJTkUpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHZ0eV9vdXQgKHZ0eSwgIiV4ICIsIGJ1ZltpXSk7CisJICBicmVhazsKKwl9CisgICAgfQorICB2dHlfb3V0ICh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworI2VuZGlmIC8qIFRFTE5FVF9PUFRJT05fREVCVUcgKi8KKworICBzd2l0Y2ggKGJ1ZlswXSkKKyAgICB7CisgICAgY2FzZSBTQjoKKyAgICAgIHZ0eS0+c2JfbGVuID0gMDsKKyAgICAgIHZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzID0gMTsKKyAgICAgIHJldHVybiAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTRToKKyAgICAgIHsKKwlpZiAoIXZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzKQorCSAgcmV0dXJuIDA7CisKKwlpZiAoKHZ0eS0+c2JfbGVuID09IDApIHx8ICh2dHktPnNiX2J1ZlswXSA9PSAnXDAnKSkKKwkgIHsKKwkgICAgdnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MgPSAwOworCSAgICByZXR1cm4gMDsKKwkgIH0KKwlzd2l0Y2ggKHZ0eS0+c2JfYnVmWzBdKQorCSAgeworCSAgY2FzZSBURUxPUFRfTkFXUzoKKwkgICAgaWYgKHZ0eS0+c2JfbGVuICE9IFRFTE5FVF9OQVdTX1NCX0xFTikKKwkgICAgICB2dHlfb3V0KHZ0eSwiUkZDIDEwNzMgdmlvbGF0aW9uIGRldGVjdGVkOiB0ZWxuZXQgTkFXUyBvcHRpb24gIgorCQkJInNob3VsZCBzZW5kICVkIGNoYXJhY3RlcnMsIGJ1dCB3ZSByZWNlaXZlZCAlbHUiLAorCQkJVEVMTkVUX05BV1NfU0JfTEVOLCAodV9sb25nKXZ0eS0+c2JfbGVuKTsKKwkgICAgZWxzZSBpZiAoc2l6ZW9mKHZ0eS0+c2JfYnVmKSA8IFRFTE5FVF9OQVdTX1NCX0xFTikKKwkgICAgICB2dHlfb3V0KHZ0eSwgIkJ1ZyBkZXRlY3RlZDogc2l6ZW9mKHZ0eS0+c2JfYnVmKSAlbHUgPCAlZCwgIgorCQkgICAgICAgInRvbyBzbWFsbCB0byBoYW5kbGUgdGhlIHRlbG5ldCBOQVdTIG9wdGlvbiIsCisJCSAgICAgICAodV9sb25nKXNpemVvZih2dHktPnNiX2J1ZiksIFRFTE5FVF9OQVdTX1NCX0xFTik7CisJICAgIGVsc2UKKwkgICAgICB7CisJCXZ0eS0+d2lkdGggPSAoKHZ0eS0+c2JfYnVmWzFdIDw8IDgpfHZ0eS0+c2JfYnVmWzJdKTsKKwkJdnR5LT5oZWlnaHQgPSAoKHZ0eS0+c2JfYnVmWzNdIDw8IDgpfHZ0eS0+c2JfYnVmWzRdKTsKKyNpZmRlZiBURUxORVRfT1BUSU9OX0RFQlVHCisJCXZ0eV9vdXQodnR5LCAiVEVMTkVUIE5BV1Mgd2luZG93IHNpemUgbmVnb3RpYXRpb24gY29tcGxldGVkOiAiCisJCQkgICAgICAid2lkdGggJWQsIGhlaWdodCAlZCVzIiwKKwkJCXZ0eS0+d2lkdGgsIHZ0eS0+aGVpZ2h0LCBWVFlfTkVXTElORSk7CisjZW5kaWYKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgfQorCXZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzID0gMDsKKwlyZXR1cm4gMDsKKwlicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gMTsKK30KKworLyogRXhlY3V0ZSBjdXJyZW50IGNvbW1hbmQgbGluZS4gKi8KK3N0YXRpYyBpbnQgdnR5X2V4ZWN1dGUoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCByZXQ7CisKKwlyZXQgPSBDTURfU1VDQ0VTUzsKKworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBBVVRIX05PREU6CisJY2FzZSBBVVRIX0VOQUJMRV9OT0RFOgorCQl2dHlfYXV0aCh2dHksIHZ0eS0+YnVmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gdnR5X2NvbW1hbmQodnR5LCB2dHktPmJ1Zik7CisJCWlmICh2dHktPnR5cGUgPT0gVlRZX1RFUk0pCisJCQl2dHlfaGlzdF9hZGQodnR5KTsKKwkJYnJlYWs7CisJfQorCisJLyogQ2xlYXIgY29tbWFuZCBsaW5lIGJ1ZmZlci4gKi8KKwl2dHktPmNwID0gdnR5LT5sZW5ndGggPSAwOworCXZ0eV9jbGVhcl9idWYodnR5KTsKKworCWlmICh2dHktPnN0YXR1cyAhPSBWVFlfQ0xPU0UpCisJCXZ0eV9wcm9tcHQodnR5KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFNlbmQgV0lMTCBURUxPUFRfRUNITyB0byByZW1vdGUgc2VydmVyLiAqLworc3RhdGljIHZvaWQKK3Z0eV93aWxsX2VjaG8gKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNtZFtdID0geyBJQUMsIFdJTEwsIFRFTE9QVF9FQ0hPLCAnXDAnIH07CisJdnR5X291dCAodnR5LCAiJXMiLCBjbWQpOworfQorCisvKiBNYWtlIHN1cHByZXNzIEdvLUFoZWFkIHRlbG5ldCBvcHRpb24uICovCitzdGF0aWMgdm9pZAordnR5X3dpbGxfc3VwcHJlc3NfZ29fYWhlYWQgKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNtZFtdID0geyBJQUMsIFdJTEwsIFRFTE9QVF9TR0EsICdcMCcgfTsKKwl2dHlfb3V0ICh2dHksICIlcyIsIGNtZCk7Cit9CisKKy8qIE1ha2UgZG9uJ3QgdXNlIGxpbmVtb2RlIG92ZXIgdGVsbmV0LiAqLworc3RhdGljIHZvaWQKK3Z0eV9kb250X2xpbmVtb2RlIChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdW5zaWduZWQgY2hhciBjbWRbXSA9IHsgSUFDLCBET05ULCBURUxPUFRfTElORU1PREUsICdcMCcgfTsKKwl2dHlfb3V0ICh2dHksICIlcyIsIGNtZCk7Cit9CisKKy8qIFVzZSB3aW5kb3cgc2l6ZS4gKi8KK3N0YXRpYyB2b2lkCit2dHlfZG9fd2luZG93X3NpemUgKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNtZFtdID0geyBJQUMsIERPLCBURUxPUFRfTkFXUywgJ1wwJyB9OworCXZ0eV9vdXQgKHZ0eSwgIiVzIiwgY21kKTsKK30KKworc3RhdGljIHZvaWQgdnR5X2tpbGxfbGluZV9mcm9tX2JlZ2lubmluZyhzdHJ1Y3QgdnR5ICopOworc3RhdGljIHZvaWQgdnR5X3JlZHJhd19saW5lKHN0cnVjdCB2dHkgKik7CisKKy8qIFByaW50IGNvbW1hbmQgbGluZSBoaXN0b3J5LiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbQorICAgdnR5X25leHRfbGluZSBhbmQgdnR5X3ByZXZpb3VzX2xpbmUuICovCitzdGF0aWMgdm9pZCB2dHlfaGlzdG9yeV9wcmludChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGxlbmd0aDsKKworCXZ0eV9raWxsX2xpbmVfZnJvbV9iZWdpbm5pbmcodnR5KTsKKworCS8qIEdldCBwcmV2aW91cyBsaW5lIGZyb20gaGlzdG9yeSBidWZmZXIgKi8KKwlsZW5ndGggPSBzdHJsZW4odnR5LT5oaXN0W3Z0eS0+aHBdKTsKKwltZW1jcHkodnR5LT5idWYsIHZ0eS0+aGlzdFt2dHktPmhwXSwgbGVuZ3RoKTsKKwl2dHktPmNwID0gdnR5LT5sZW5ndGggPSBsZW5ndGg7CisKKwkvKiBSZWRyYXcgY3VycmVudCBsaW5lICovCisJdnR5X3JlZHJhd19saW5lKHZ0eSk7Cit9CisKKy8qIFNob3cgbmV4dCBjb21tYW5kIGxpbmUgaGlzdG9yeS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9uZXh0X2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCB0cnlfaW5kZXg7CisKKwlpZiAodnR5LT5ocCA9PSB2dHktPmhpbmRleCkKKwkJcmV0dXJuOworCisJLyogVHJ5IGlzIHRoZXJlIGhpc3RvcnkgZXhpc3Qgb3Igbm90LiAqLworCXRyeV9pbmRleCA9IHZ0eS0+aHA7CisJaWYgKHRyeV9pbmRleCA9PSAoVlRZX01BWEhJU1QgLSAxKSkKKwkJdHJ5X2luZGV4ID0gMDsKKwllbHNlCisJCXRyeV9pbmRleCsrOworCisJLyogSWYgdGhlcmUgaXMgbm90IGhpc3RvcnkgcmV0dXJuLiAqLworCWlmICh2dHktPmhpc3RbdHJ5X2luZGV4XSA9PSBOVUxMKQorCQlyZXR1cm47CisJZWxzZQorCQl2dHktPmhwID0gdHJ5X2luZGV4OworCisJdnR5X2hpc3RvcnlfcHJpbnQodnR5KTsKK30KKworLyogU2hvdyBwcmV2aW91cyBjb21tYW5kIGxpbmUgaGlzdG9yeS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9wcmV2aW91c19saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgdHJ5X2luZGV4OworCisJdHJ5X2luZGV4ID0gdnR5LT5ocDsKKwlpZiAodHJ5X2luZGV4ID09IDApCisJCXRyeV9pbmRleCA9IFZUWV9NQVhISVNUIC0gMTsKKwllbHNlCisJCXRyeV9pbmRleC0tOworCisJaWYgKHZ0eS0+aGlzdFt0cnlfaW5kZXhdID09IE5VTEwpCisJCXJldHVybjsKKwllbHNlCisJCXZ0eS0+aHAgPSB0cnlfaW5kZXg7CisKKwl2dHlfaGlzdG9yeV9wcmludCh2dHkpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJlZHJhdyBhbGwgb2YgdGhlIGNvbW1hbmQgbGluZSBjaGFyYWN0ZXIuICovCitzdGF0aWMgdm9pZCB2dHlfcmVkcmF3X2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eV93cml0ZSh2dHksIHZ0eS0+YnVmLCB2dHktPmxlbmd0aCk7CisJdnR5LT5jcCA9IHZ0eS0+bGVuZ3RoOworfQorCisvKiBGb3J3YXJkIHdvcmQuICovCitzdGF0aWMgdm9pZCB2dHlfZm9yd2FyZF93b3JkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl3aGlsZSAodnR5LT5jcCAhPSB2dHktPmxlbmd0aCAmJiB2dHktPmJ1Zlt2dHktPmNwXSAhPSAnICcpCisJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKKworCXdoaWxlICh2dHktPmNwICE9IHZ0eS0+bGVuZ3RoICYmIHZ0eS0+YnVmW3Z0eS0+Y3BdID09ICcgJykKKwkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOworfQorCisvKiBCYWNrd2FyZCB3b3JkIHdpdGhvdXQgc2tpcHBpbmcgdHJhaW5pbmcgc3BhY2UuICovCitzdGF0aWMgdm9pZCB2dHlfYmFja3dhcmRfcHVyZV93b3JkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdICE9ICcgJykKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKK30KKworLyogQmFja3dhcmQgd29yZC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9iYWNrd2FyZF93b3JkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdID09ICcgJykKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKworCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gIT0gJyAnKQorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworfQorCisvKiBXaGVuICdeRCcgaXMgdHlwZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSB3ZSBtb3ZlIHRvIHRoZSBkb3duCisgICBsZXZlbC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9kb3duX2xldmVsKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCSgqY29uZmlnX2V4aXRfY21kLmZ1bmMpIChOVUxMLCB2dHksIDAsIE5VTEwpOworCXZ0eV9wcm9tcHQodnR5KTsKKwl2dHktPmNwID0gMDsKK30KKworLyogV2hlbiAnXlonIGlzIHJlY2VpdmVkIGZyb20gdnR5LCBtb3ZlIGRvd24gdG8gdGhlIGVuYWJsZSBtb2RlLiAqLworc3RhdGljIHZvaWQgdnR5X2VuZF9jb25maWcoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgVklFV19OT0RFOgorCWNhc2UgRU5BQkxFX05PREU6CisJCS8qIE5vdGhpbmcgdG8gZG8uICovCisJCWJyZWFrOworCWNhc2UgQ09ORklHX05PREU6CisJY2FzZSBWVFlfTk9ERToKKwkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFVua25vd24gbm9kZSwgd2UgaGF2ZSB0byBpZ25vcmUgaXQuICovCisJCWJyZWFrOworCX0KKworCXZ0eV9wcm9tcHQodnR5KTsKKwl2dHktPmNwID0gMDsKK30KKworLyogRGVsZXRlIGEgY2hhcmN0ZXIgYXQgdGhlIGN1cnJlbnQgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfZGVsZXRlX2NoYXIoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCBpOworCWludCBzaXplOworCisJaWYgKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUgfHwgdnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpCisJCXJldHVybjsKKworCWlmICh2dHktPmxlbmd0aCA9PSAwKSB7CisJCXZ0eV9kb3duX2xldmVsKHZ0eSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodnR5LT5jcCA9PSB2dHktPmxlbmd0aCkKKwkJcmV0dXJuOwkJLyogY29tcGxldGlvbiBuZWVkIGhlcmU/ICovCisKKwlzaXplID0gdnR5LT5sZW5ndGggLSB2dHktPmNwOworCisJdnR5LT5sZW5ndGgtLTsKKwltZW1tb3ZlKCZ2dHktPmJ1Zlt2dHktPmNwXSwgJnZ0eS0+YnVmW3Z0eS0+Y3AgKyAxXSwgc2l6ZSAtIDEpOworCXZ0eS0+YnVmW3Z0eS0+bGVuZ3RoXSA9ICdcMCc7CisKKwl2dHlfd3JpdGUodnR5LCAmdnR5LT5idWZbdnR5LT5jcF0sIHNpemUgLSAxKTsKKwl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X3NwYWNlX2NoYXIsIDEpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9iYWNrd2FyZF9jaGFyLCAxKTsKK30KKworLyogRGVsZXRlIGEgY2hhcmFjdGVyIGJlZm9yZSB0aGUgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfZGVsZXRlX2JhY2t3YXJkX2NoYXIoc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHktPmNwID09IDApCisJCXJldHVybjsKKworCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJdnR5X2RlbGV0ZV9jaGFyKHZ0eSk7Cit9CisKKy8qIEtpbGwgcmVzdCBvZiBsaW5lIGZyb20gY3VycmVudCBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9raWxsX2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCBpOworCWludCBzaXplOworCisJc2l6ZSA9IHZ0eS0+bGVuZ3RoIC0gdnR5LT5jcDsKKworCWlmIChzaXplID09IDApCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfc3BhY2VfY2hhciwgMSk7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9iYWNrd2FyZF9jaGFyLCAxKTsKKworCW1lbXNldCgmdnR5LT5idWZbdnR5LT5jcF0sIDAsIHNpemUpOworCXZ0eS0+bGVuZ3RoID0gdnR5LT5jcDsKK30KKworLyogS2lsbCBsaW5lIGZyb20gdGhlIGJlZ2lubmluZy4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9raWxsX2xpbmVfZnJvbV9iZWdpbm5pbmcoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eV9iZWdpbm5pbmdfb2ZfbGluZSh2dHkpOworCXZ0eV9raWxsX2xpbmUodnR5KTsKK30KKworLyogRGVsZXRlIGEgd29yZCBiZWZvcmUgdGhlIHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2ZvcndhcmRfa2lsbF93b3JkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl3aGlsZSAodnR5LT5jcCAhPSB2dHktPmxlbmd0aCAmJiB2dHktPmJ1Zlt2dHktPmNwXSA9PSAnICcpCisJCXZ0eV9kZWxldGVfY2hhcih2dHkpOworCXdoaWxlICh2dHktPmNwICE9IHZ0eS0+bGVuZ3RoICYmIHZ0eS0+YnVmW3Z0eS0+Y3BdICE9ICcgJykKKwkJdnR5X2RlbGV0ZV9jaGFyKHZ0eSk7Cit9CisKKy8qIERlbGV0ZSBhIHdvcmQgYmVmb3JlIHRoZSBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9iYWNrd2FyZF9raWxsX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gPT0gJyAnKQorCQl2dHlfZGVsZXRlX2JhY2t3YXJkX2NoYXIodnR5KTsKKwl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdICE9ICcgJykKKwkJdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIFRyYW5zcG9zZSBjaGFycyBiZWZvcmUgb3IgYXQgdGhlIHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X3RyYW5zcG9zZV9jaGFycyhzdHJ1Y3QgdnR5ICp2dHkpCit7CisJY2hhciBjMSwgYzI7CisKKwkvKiBJZiBsZW5ndGggaXMgc2hvcnQgb3IgcG9pbnQgaXMgbmVhciBieSB0aGUgYmVnaW5uaW5nIG9mIGxpbmUgdGhlbgorCSAgIHJldHVybi4gKi8KKwlpZiAodnR5LT5sZW5ndGggPCAyIHx8IHZ0eS0+Y3AgPCAxKQorCQlyZXR1cm47CisKKwkvKiBJbiBjYXNlIG9mIHBvaW50IGlzIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KKwlpZiAodnR5LT5jcCA9PSB2dHktPmxlbmd0aCkgeworCQljMSA9IHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXTsKKwkJYzIgPSB2dHktPmJ1Zlt2dHktPmNwIC0gMl07CisKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZSh2dHksIGMxKTsKKwkJdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZSh2dHksIGMyKTsKKwl9IGVsc2UgeworCQljMSA9IHZ0eS0+YnVmW3Z0eS0+Y3BdOworCQljMiA9IHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXTsKKworCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQl2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHZ0eSwgYzEpOworCQl2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHZ0eSwgYzIpOworCX0KK30KKworLyogRG8gY29tcGxldGlvbiBhdCB2dHkgaW50ZXJmYWNlLiAqLworc3RhdGljIHZvaWQgdnR5X2NvbXBsZXRlX2NvbW1hbmQoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCBpOworCWludCByZXQ7CisJY2hhciAqKm1hdGNoZWQgPSBOVUxMOworCXZlY3RvciB2bGluZTsKKworCWlmICh2dHktPm5vZGUgPT0gQVVUSF9OT0RFIHx8IHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKQorCQlyZXR1cm47CisKKwl2bGluZSA9IGNtZF9tYWtlX3N0cnZlYyh2dHktPmJ1Zik7CisJaWYgKHZsaW5lID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIEluIGNhc2Ugb2YgJ2hlbHAgXHQnLiAqLworCWlmIChpc3NwYWNlKChpbnQpdnR5LT5idWZbdnR5LT5sZW5ndGggLSAxXSkpCisJCXZlY3Rvcl9zZXQodmxpbmUsICdcMCcpOworCisJbWF0Y2hlZCA9IGNtZF9jb21wbGV0ZV9jb21tYW5kKHZsaW5lLCB2dHksICZyZXQpOworCisJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIENNRF9FUlJfQU1CSUdVT1VTOgorCQl2dHlfb3V0KHZ0eSwgIiUlIEFtYmlndW91cyBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOworCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlicmVhazsKKwljYXNlIENNRF9FUlJfTk9fTUFUQ0g6CisJCS8qIHZ0eV9vdXQgKHZ0eSwgIiUlIFRoZXJlIGlzIG5vIG1hdGNoZWQgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsgKi8KKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSBDTURfQ09NUExFVEVfRlVMTF9NQVRDSDoKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJdnR5X2JhY2t3YXJkX3B1cmVfd29yZCh2dHkpOworCQl2dHlfaW5zZXJ0X3dvcmRfb3ZlcndyaXRlKHZ0eSwgbWF0Y2hlZFswXSk7CisJCXZ0eV9zZWxmX2luc2VydCh2dHksICcgJyk7CisJCXRhbGxvY19mcmVlKG1hdGNoZWRbMF0pOworCQlicmVhazsKKwljYXNlIENNRF9DT01QTEVURV9NQVRDSDoKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJdnR5X2JhY2t3YXJkX3B1cmVfd29yZCh2dHkpOworCQl2dHlfaW5zZXJ0X3dvcmRfb3ZlcndyaXRlKHZ0eSwgbWF0Y2hlZFswXSk7CisJCXRhbGxvY19mcmVlKG1hdGNoZWRbMF0pOworCQlicmVhazsKKwljYXNlIENNRF9DT01QTEVURV9MSVNUX01BVENIOgorCQlmb3IgKGkgPSAwOyBtYXRjaGVkW2ldICE9IE5VTEw7IGkrKykgeworCQkJaWYgKGkgIT0gMCAmJiAoKGkgJSA2KSA9PSAwKSkKKwkJCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCQkJdnR5X291dCh2dHksICIlLTEwcyAiLCBtYXRjaGVkW2ldKTsKKwkJCXRhbGxvY19mcmVlKG1hdGNoZWRbaV0pOworCQl9CisJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSBDTURfRVJSX05PVEhJTkdfVE9ETzoKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChtYXRjaGVkKQorCQl2ZWN0b3Jfb25seV9pbmRleF9mcmVlKG1hdGNoZWQpOworfQorCitzdGF0aWMgdm9pZAordnR5X2Rlc2NyaWJlX2ZvbGQoc3RydWN0IHZ0eSAqdnR5LCBpbnQgY21kX3dpZHRoLAorCQkgIHVuc2lnbmVkIGludCBkZXNjX3dpZHRoLCBzdHJ1Y3QgZGVzYyAqZGVzYykKK3sKKwljaGFyICpidWY7CisJY29uc3QgY2hhciAqY21kLCAqcDsKKwlpbnQgcG9zOworCisJY21kID0gZGVzYy0+Y21kWzBdID09ICcuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQ7CisKKwlpZiAoZGVzY193aWR0aCA8PSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgY21kX3dpZHRoLCBjbWQsIGRlc2MtPnN0ciwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuOworCX0KKworCWJ1ZiA9IF90YWxsb2NfemVybyh2dHksIHN0cmxlbihkZXNjLT5zdHIpICsgMSwgImRlc2NyaWJlX2ZvbGQiKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJZm9yIChwID0gZGVzYy0+c3RyOyBzdHJsZW4ocCkgPiBkZXNjX3dpZHRoOyBwICs9IHBvcyArIDEpIHsKKwkJZm9yIChwb3MgPSBkZXNjX3dpZHRoOyBwb3MgPiAwOyBwb3MtLSkKKwkJCWlmICgqKHAgKyBwb3MpID09ICcgJykKKwkJCQlicmVhazsKKworCQlpZiAocG9zID09IDApCisJCQlicmVhazsKKworCQlzdHJuY3B5KGJ1ZiwgcCwgcG9zKTsKKwkJYnVmW3Bvc10gPSAnXDAnOworCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIGNtZF93aWR0aCwgY21kLCBidWYsIFZUWV9ORVdMSU5FKTsKKworCQljbWQgPSAiIjsKKwl9CisKKwl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIGNtZF93aWR0aCwgY21kLCBwLCBWVFlfTkVXTElORSk7CisKKwl0YWxsb2NfZnJlZShidWYpOworfQorCisvKiBEZXNjcmliZSBtYXRjaGVkIGNvbW1hbmQgZnVuY3Rpb24uICovCitzdGF0aWMgdm9pZCB2dHlfZGVzY3JpYmVfY29tbWFuZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IHJldDsKKwl2ZWN0b3IgdmxpbmU7CisJdmVjdG9yIGRlc2NyaWJlOworCXVuc2lnbmVkIGludCBpLCB3aWR0aCwgZGVzY193aWR0aDsKKwlzdHJ1Y3QgZGVzYyAqZGVzYywgKmRlc2NfY3IgPSBOVUxMOworCisJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWModnR5LT5idWYpOworCisJLyogSW4gY2FzZSBvZiAnPiA/Jy4gKi8KKwlpZiAodmxpbmUgPT0gTlVMTCkgeworCQl2bGluZSA9IHZlY3Rvcl9pbml0KDEpOworCQl2ZWN0b3Jfc2V0KHZsaW5lLCAnXDAnKTsKKwl9IGVsc2UgaWYgKGlzc3BhY2UoKGludCl2dHktPmJ1Zlt2dHktPmxlbmd0aCAtIDFdKSkKKwkJdmVjdG9yX3NldCh2bGluZSwgJ1wwJyk7CisKKwlkZXNjcmliZSA9IGNtZF9kZXNjcmliZV9jb21tYW5kKHZsaW5lLCB2dHksICZyZXQpOworCisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCS8qIEFtYmlndW91cyBlcnJvci4gKi8KKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgQ01EX0VSUl9BTUJJR1VPVVM6CisJCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisJCXZ0eV9vdXQodnR5LCAiJSUgQW1iaWd1b3VzIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXJldHVybjsKKwkJYnJlYWs7CisJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCQl2dHlfb3V0KHZ0eSwgIiUlIFRoZXJlIGlzIG5vIG1hdGNoZWQgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJcmV0dXJuOworCQlicmVhazsKKwl9CisKKwkvKiBHZXQgd2lkdGggb2YgY29tbWFuZCBzdHJpbmcuICovCisJd2lkdGggPSAwOworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGRlc2NyaWJlKTsgaSsrKQorCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjcmliZSwgaSkpICE9IE5VTEwpIHsKKwkJCXVuc2lnbmVkIGludCBsZW47CisKKwkJCWlmIChkZXNjLT5jbWRbMF0gPT0gJ1wwJykKKwkJCQljb250aW51ZTsKKworCQkJbGVuID0gc3RybGVuKGRlc2MtPmNtZCk7CisJCQlpZiAoZGVzYy0+Y21kWzBdID09ICcuJykKKwkJCQlsZW4tLTsKKworCQkJaWYgKHdpZHRoIDwgbGVuKQorCQkJCXdpZHRoID0gbGVuOworCQl9CisKKwkvKiBHZXQgd2lkdGggb2YgZGVzY3JpcHRpb24gc3RyaW5nLiAqLworCWRlc2Nfd2lkdGggPSB2dHktPndpZHRoIC0gKHdpZHRoICsgNik7CisKKwkvKiBQcmludCBvdXQgZGVzY3JpcHRpb24uICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoZGVzY3JpYmUpOyBpKyspCisJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2NyaWJlLCBpKSkgIT0gTlVMTCkgeworCQkJaWYgKGRlc2MtPmNtZFswXSA9PSAnXDAnKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc3RyY21wKGRlc2MtPmNtZCwgIjxjcj4iKSA9PSAwKSB7CisJCQkJZGVzY19jciA9IGRlc2M7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICghZGVzYy0+c3RyKQorCQkJCXZ0eV9vdXQodnR5LCAiICAlLXMlcyIsCisJCQkJCWRlc2MtPmNtZFswXSA9PQorCQkJCQknLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCQlWVFlfTkVXTElORSk7CisJCQllbHNlIGlmIChkZXNjX3dpZHRoID49IHN0cmxlbihkZXNjLT5zdHIpKQorCQkJCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgd2lkdGgsCisJCQkJCWRlc2MtPmNtZFswXSA9PQorCQkJCQknLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCQlkZXNjLT5zdHIsIFZUWV9ORVdMSU5FKTsKKwkJCWVsc2UKKwkJCQl2dHlfZGVzY3JpYmVfZm9sZCh2dHksIHdpZHRoLCBkZXNjX3dpZHRoLCBkZXNjKTsKKworI2lmIDAKKwkJCXZ0eV9vdXQodnR5LCAiICAlLSpzICVzJXMiLCB3aWR0aAorCQkJCWRlc2MtPmNtZFswXSA9PSAnLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCWRlc2MtPnN0ciA/IGRlc2MtPnN0ciA6ICIiLCBWVFlfTkVXTElORSk7CisjZW5kaWYJCQkJLyogMCAqLworCQl9CisKKwlpZiAoKGRlc2MgPSBkZXNjX2NyKSkgeworCQlpZiAoIWRlc2MtPnN0cikKKwkJCXZ0eV9vdXQodnR5LCAiICAlLXMlcyIsCisJCQkJZGVzYy0+Y21kWzBdID09ICcuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJVlRZX05FV0xJTkUpOworCQllbHNlIGlmIChkZXNjX3dpZHRoID49IHN0cmxlbihkZXNjLT5zdHIpKQorCQkJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCB3aWR0aCwKKwkJCQlkZXNjLT5jbWRbMF0gPT0gJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKKwkJCQlkZXNjLT5zdHIsIFZUWV9ORVdMSU5FKTsKKwkJZWxzZQorCQkJdnR5X2Rlc2NyaWJlX2ZvbGQodnR5LCB3aWR0aCwgZGVzY193aWR0aCwgZGVzYyk7CisJfQorCisJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKwl2ZWN0b3JfZnJlZShkZXNjcmliZSk7CisKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5X3JlZHJhd19saW5lKHZ0eSk7Cit9CisKKy8qIF5DIHN0b3AgY3VycmVudCBpbnB1dCBhbmQgZG8gbm90IGFkZCBjb21tYW5kIGxpbmUgdG8gdGhlIGhpc3RvcnkuICovCitzdGF0aWMgdm9pZCB2dHlfc3RvcF9pbnB1dChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5LT5jcCA9IHZ0eS0+bGVuZ3RoID0gMDsKKwl2dHlfY2xlYXJfYnVmKHZ0eSk7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBWSUVXX05PREU6CisJY2FzZSBFTkFCTEVfTk9ERToKKwkJLyogTm90aGluZyB0byBkby4gKi8KKwkJYnJlYWs7CisJY2FzZSBDT05GSUdfTk9ERToKKwljYXNlIFZUWV9OT0RFOgorCQl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93biBub2RlLCB3ZSBoYXZlIHRvIGlnbm9yZSBpdC4gKi8KKwkJYnJlYWs7CisJfQorCXZ0eV9wcm9tcHQodnR5KTsKKworCS8qIFNldCBoaXN0b3J5IHBvaW50ZXIgdG8gdGhlIGxhdGVzdCBvbmUuICovCisJdnR5LT5ocCA9IHZ0eS0+aGluZGV4OworfQorCisjZGVmaW5lIENPTlRST0woWCkgICgoWCkgLSAnQCcpCisjZGVmaW5lIFZUWV9OT1JNQUwgICAgIDAKKyNkZWZpbmUgVlRZX1BSRV9FU0NBUEUgMQorI2RlZmluZSBWVFlfRVNDQVBFICAgICAyCisKKy8qIEVzY2FwZSBjaGFyYWN0ZXIgY29tbWFuZCBtYXAuICovCitzdGF0aWMgdm9pZCB2dHlfZXNjYXBlX21hcCh1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICgnQScpOgorCQl2dHlfcHJldmlvdXNfbGluZSh2dHkpOworCQlicmVhazsKKwljYXNlICgnQicpOgorCQl2dHlfbmV4dF9saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgKCdDJyk6CisJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKKwkJYnJlYWs7CisJY2FzZSAoJ0QnKToKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogR28gYmFjayB0byBub3JtYWwgbW9kZS4gKi8KKwl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7Cit9CisKKy8qIFF1aXQgcHJpbnQgb3V0IHRvIHRoZSBidWZmZXIuICovCitzdGF0aWMgdm9pZCB2dHlfYnVmZmVyX3Jlc2V0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlidWZmZXJfcmVzZXQodnR5LT5vYnVmKTsKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5X3JlZHJhd19saW5lKHZ0eSk7Cit9CisKKy8qIFJlYWQgZGF0YSB2aWEgdnR5IHNvY2tldC4gKi8KK2ludCB2dHlfcmVhZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisJaW50IG5ieXRlczsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltWVFlfUkVBRF9CVUZTSVpdOworCisJaW50IHZ0eV9zb2NrID0gdnR5LT5mZDsKKworCS8qIFJlYWQgcmF3IGRhdGEgZnJvbSBzb2NrZXQgKi8KKwlpZiAoKG5ieXRlcyA9IHJlYWQodnR5LT5mZCwgYnVmLCBWVFlfUkVBRF9CVUZTSVopKSA8PSAwKSB7CisJCWlmIChuYnl0ZXMgPCAwKSB7CisJCQlpZiAoRVJSTk9fSU9fUkVUUlkoZXJybm8pKSB7CisJCQkJdnR5X2V2ZW50KFZUWV9SRUFELCB2dHlfc29jaywgdnR5KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlidWZmZXJfcmVzZXQodnR5LT5vYnVmKTsKKwkJdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5ieXRlczsgaSsrKSB7CisJCWlmIChidWZbaV0gPT0gSUFDKSB7CisJCQlpZiAoIXZ0eS0+aWFjKSB7CisJCQkJdnR5LT5pYWMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQl2dHktPmlhYyA9IDA7CisJCQl9CisJCX0KKworCQlpZiAodnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MgJiYgIXZ0eS0+aWFjKSB7CisJCQlpZiAodnR5LT5zYl9sZW4gPCBzaXplb2YodnR5LT5zYl9idWYpKQorCQkJCXZ0eS0+c2JfYnVmW3Z0eS0+c2JfbGVuXSA9IGJ1ZltpXTsKKwkJCXZ0eS0+c2JfbGVuKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh2dHktPmlhYykgeworCQkJLyogSW4gY2FzZSBvZiB0ZWxuZXQgY29tbWFuZCAqLworCQkJaW50IHJldCA9IDA7CisJCQlyZXQgPSB2dHlfdGVsbmV0X29wdGlvbih2dHksIGJ1ZiArIGksIG5ieXRlcyAtIGkpOworCQkJdnR5LT5pYWMgPSAwOworCQkJaSArPSByZXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh2dHktPnN0YXR1cyA9PSBWVFlfTU9SRSkgeworCQkJc3dpdGNoIChidWZbaV0pIHsKKwkJCWNhc2UgQ09OVFJPTCgnQycpOgorCQkJY2FzZSAncSc6CisJCQljYXNlICdRJzoKKwkJCQl2dHlfYnVmZmVyX3Jlc2V0KHZ0eSk7CisJCQkJYnJlYWs7CisjaWYgMAkJCQkvKiBNb3JlIGxpbmUgZG9lcyBub3Qgd29yayBmb3IgInNob3cgaXAgYmdwIi4gICovCisJCQljYXNlICdcbic6CisJCQljYXNlICdccic6CisJCQkJdnR5LT5zdGF0dXMgPSBWVFlfTU9SRUxJTkU7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEVzY2FwZSBjaGFyYWN0ZXIuICovCisJCWlmICh2dHktPmVzY2FwZSA9PSBWVFlfRVNDQVBFKSB7CisJCQl2dHlfZXNjYXBlX21hcChidWZbaV0sIHZ0eSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFByZS1lc2NhcGUgc3RhdHVzLiAqLworCQlpZiAodnR5LT5lc2NhcGUgPT0gVlRZX1BSRV9FU0NBUEUpIHsKKwkJCXN3aXRjaCAoYnVmW2ldKSB7CisJCQljYXNlICdbJzoKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9FU0NBUEU7CisJCQkJYnJlYWs7CisJCQljYXNlICdiJzoKKwkJCQl2dHlfYmFja3dhcmRfd29yZCh2dHkpOworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2YnOgorCQkJCXZ0eV9mb3J3YXJkX3dvcmQodnR5KTsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQljYXNlICdkJzoKKwkJCQl2dHlfZm9yd2FyZF9raWxsX3dvcmQodnR5KTsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQljYXNlIENPTlRST0woJ0gnKToKKwkJCWNhc2UgMHg3ZjoKKwkJCQl2dHlfYmFja3dhcmRfa2lsbF93b3JkKHZ0eSk7CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoYnVmW2ldKSB7CisJCWNhc2UgQ09OVFJPTCgnQScpOgorCQkJdnR5X2JlZ2lubmluZ19vZl9saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdCJyk6CisJCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnQycpOgorCQkJdnR5X3N0b3BfaW5wdXQodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0QnKToKKwkJCXZ0eV9kZWxldGVfY2hhcih2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnRScpOgorCQkJdnR5X2VuZF9vZl9saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdGJyk6CisJCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdIJyk6CisJCWNhc2UgMHg3ZjoKKwkJCXZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcih2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnSycpOgorCQkJdnR5X2tpbGxfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnTicpOgorCQkJdnR5X25leHRfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnUCcpOgorCQkJdnR5X3ByZXZpb3VzX2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1QnKToKKwkJCXZ0eV90cmFuc3Bvc2VfY2hhcnModnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1UnKToKKwkJCXZ0eV9raWxsX2xpbmVfZnJvbV9iZWdpbm5pbmcodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1cnKToKKwkJCXZ0eV9iYWNrd2FyZF9raWxsX3dvcmQodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1onKToKKwkJCXZ0eV9lbmRfY29uZmlnKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSAnXG4nOgorCQljYXNlICdccic6CisJCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCQkJdnR5X2V4ZWN1dGUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlICdcdCc6CisJCQl2dHlfY29tcGxldGVfY29tbWFuZCh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJaWYgKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUKKwkJCSAgICB8fCB2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkKKwkJCQl2dHlfc2VsZl9pbnNlcnQodnR5LCBidWZbaV0pOworCQkJZWxzZQorCQkJCXZ0eV9kZXNjcmliZV9jb21tYW5kKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSAnXDAzMyc6CisJCQlpZiAoaSArIDEgPCBuYnl0ZXMgJiYgYnVmW2kgKyAxXSA9PSAnWycpIHsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9FU0NBUEU7CisJCQkJaSsrOworCQkJfSBlbHNlCisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfUFJFX0VTQ0FQRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKGJ1ZltpXSA+IDMxICYmIGJ1ZltpXSA8IDEyNykKKwkJCQl2dHlfc2VsZl9pbnNlcnQodnR5LCBidWZbaV0pOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBDaGVjayBzdGF0dXMuICovCisJaWYgKHZ0eS0+c3RhdHVzID09IFZUWV9DTE9TRSkKKwkJdnR5X2Nsb3NlKHZ0eSk7CisJZWxzZSB7CisJCXZ0eV9ldmVudChWVFlfV1JJVEUsIHZ0eV9zb2NrLCB2dHkpOworCQl2dHlfZXZlbnQoVlRZX1JFQUQsIHZ0eV9zb2NrLCB2dHkpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogUmVhZCB1cCBjb25maWd1cmF0aW9uIGZpbGUgKi8KK3N0YXRpYyBpbnQKK3Z0eV9yZWFkX2ZpbGUoRklMRSAqY29uZnApCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdnR5ICp2dHk7CisKKwl2dHkgPSB2dHlfbmV3KCk7CisJdnR5LT5mZCA9IDA7CisJdnR5LT50eXBlID0gVlRZX0ZJTEU7CisJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisKKwlyZXQgPSBjb25maWdfZnJvbV9maWxlKHZ0eSwgY29uZnApOworCisJaWYgKHJldCAhPSBDTURfU1VDQ0VTUykgeworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIENNRF9FUlJfQU1CSUdVT1VTOgorCQkJZnByaW50ZihzdGRlcnIsICJBbWJpZ3VvdXMgY29tbWFuZC5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX0VSUl9OT19NQVRDSDoKKwkJCWZwcmludGYoc3RkZXJyLCAiVGhlcmUgaXMgbm8gc3VjaCBjb21tYW5kLlxuIik7CisJCQlicmVhazsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9jY3VycmVkIGR1cmluZyByZWFkaW5nIGJlbG93ICIKKwkJCSJsaW5lOlxuJXNcbiIsIHZ0eS0+YnVmKTsKKwkJdnR5X2Nsb3NlKHZ0eSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZ0eV9jbG9zZSh2dHkpOworCXJldHVybiAwOworfQorCisvKiBDcmVhdGUgbmV3IHZ0eSBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgdnR5ICoKK3Z0eV9jcmVhdGUgKGludCB2dHlfc29jaywgdm9pZCAqcHJpdikKK3sKKyAgc3RydWN0IHZ0eSAqdnR5OworCisJc3RydWN0IHRlcm1pb3MgdDsKKworCXRjZ2V0YXR0cih2dHlfc29jaywgJnQpOworCWNmbWFrZXJhdygmdCk7CisJdGNzZXRhdHRyKHZ0eV9zb2NrLCBUQ1NBTk9XLCAmdCk7CisKKyAgLyogQWxsb2NhdGUgbmV3IHZ0eSBzdHJ1Y3R1cmUgYW5kIHNldCB1cCBkZWZhdWx0IHZhbHVlcy4gKi8KKyAgdnR5ID0gdnR5X25ldyAoKTsKKyAgdnR5LT5mZCA9IHZ0eV9zb2NrOworICB2dHktPnByaXYgPSBwcml2OworICB2dHktPnR5cGUgPSBWVFlfVEVSTTsKKyAgaWYgKG5vX3Bhc3N3b3JkX2NoZWNrKQorICAgIHsKKyAgICAgIGlmIChob3N0LmFkdmFuY2VkKQorCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworICAgICAgZWxzZQorCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKyAgICB9CisgIGVsc2UKKyAgICB2dHktPm5vZGUgPSBBVVRIX05PREU7CisgIHZ0eS0+ZmFpbCA9IDA7CisgIHZ0eS0+Y3AgPSAwOworICB2dHlfY2xlYXJfYnVmICh2dHkpOworICB2dHktPmxlbmd0aCA9IDA7CisgIG1lbXNldCAodnR5LT5oaXN0LCAwLCBzaXplb2YgKHZ0eS0+aGlzdCkpOworICB2dHktPmhwID0gMDsKKyAgdnR5LT5oaW5kZXggPSAwOworICB2ZWN0b3Jfc2V0X2luZGV4ICh2dHl2ZWMsIHZ0eV9zb2NrLCB2dHkpOworICB2dHktPnN0YXR1cyA9IFZUWV9OT1JNQUw7CisgIGlmIChob3N0LmxpbmVzID49IDApCisgICAgdnR5LT5saW5lcyA9IGhvc3QubGluZXM7CisgIGVsc2UKKyAgICB2dHktPmxpbmVzID0gLTE7CisKKyAgaWYgKCEgbm9fcGFzc3dvcmRfY2hlY2spCisgICAgeworICAgICAgLyogVnR5IGlzIG5vdCBhdmFpbGFibGUgaWYgcGFzc3dvcmQgaXNuJ3Qgc2V0LiAqLworICAgICAgaWYgKGhvc3QucGFzc3dvcmQgPT0gTlVMTCAmJiBob3N0LnBhc3N3b3JkX2VuY3J5cHQgPT0gTlVMTCkKKwl7CisJICB2dHlfb3V0ICh2dHksICJWdHkgcGFzc3dvcmQgaXMgbm90IHNldC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkgIHZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCSAgdnR5X2Nsb3NlICh2dHkpOworCSAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAvKiBTYXkgaGVsbG8gdG8gdGhlIHdvcmxkLiAqLworICB2dHlfaGVsbG8gKHZ0eSk7CisgIGlmICghIG5vX3Bhc3N3b3JkX2NoZWNrKQorICAgIHZ0eV9vdXQgKHZ0eSwgIiVzVXNlciBBY2Nlc3MgVmVyaWZpY2F0aW9uJXMlcyIsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUpOworCisgIC8qIFNldHRpbmcgdXAgdGVybWluYWwuICovCisgIHZ0eV93aWxsX2VjaG8gKHZ0eSk7CisgIHZ0eV93aWxsX3N1cHByZXNzX2dvX2FoZWFkICh2dHkpOworCisgIHZ0eV9kb250X2xpbmVtb2RlICh2dHkpOworICB2dHlfZG9fd2luZG93X3NpemUgKHZ0eSk7CisgIC8qIHZ0eV9kb250X2xmbG93X2FoZWFkICh2dHkpOyAqLworCisgIHZ0eV9wcm9tcHQgKHZ0eSk7CisKKyAgLyogQWRkIHJlYWQvd3JpdGUgdGhyZWFkLiAqLworICB2dHlfZXZlbnQgKFZUWV9XUklURSwgdnR5X3NvY2ssIHZ0eSk7CisgIHZ0eV9ldmVudCAoVlRZX1JFQUQsIHZ0eV9zb2NrLCB2dHkpOworCisgIHJldHVybiB2dHk7Cit9CisKK0RFRlVOKGNvbmZpZ193aG8sIGNvbmZpZ193aG9fY21kLCAid2hvIiwgIkRpc3BsYXkgd2hvIGlzIG9uIHZ0eVxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgdnR5ICp2OworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodnR5dmVjKTsgaSsrKQorCQlpZiAoKHYgPSB2ZWN0b3Jfc2xvdCh2dHl2ZWMsIGkpKSAhPSBOVUxMKQorCQkJdnR5X291dCh2dHksICIlc3Z0eVslZF0gJXMiLAorCQkJCXYtPmNvbmZpZyA/ICIqIiA6ICIgIiwgaSwgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogTW92ZSB0byB2dHkgY29uZmlndXJhdGlvbiBtb2RlLiAqLworREVGVU4obGluZV92dHksCisgICAgICBsaW5lX3Z0eV9jbWQsCisgICAgICAibGluZSB2dHkiLCAiQ29uZmlndXJlIGEgdGVybWluYWwgbGluZVxuIiAiVmlydHVhbCB0ZXJtaW5hbFxuIikKK3sKKwl2dHktPm5vZGUgPSBWVFlfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHZ0eSBsb2dpbi4gKi8KK0RFRlVOKHZ0eV9sb2dpbiwgdnR5X2xvZ2luX2NtZCwgImxvZ2luIiwgIkVuYWJsZSBwYXNzd29yZCBjaGVja2luZ1xuIikKK3sKKwlub19wYXNzd29yZF9jaGVjayA9IDA7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub192dHlfbG9naW4sCisgICAgICBub192dHlfbG9naW5fY21kLCAibm8gbG9naW4iLCBOT19TVFIgIkVuYWJsZSBwYXNzd29yZCBjaGVja2luZ1xuIikKK3sKKwlub19wYXNzd29yZF9jaGVjayA9IDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzZXJ2aWNlX2FkdmFuY2VkX3Z0eSwKKyAgICAgIHNlcnZpY2VfYWR2YW5jZWRfdnR5X2NtZCwKKyAgICAgICJzZXJ2aWNlIGFkdmFuY2VkLXZ0eSIsCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGFkdmFuY2VkIG1vZGUgdnR5IGludGVyZmFjZVxuIikKK3sKKwlob3N0LmFkdmFuY2VkID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3NlcnZpY2VfYWR2YW5jZWRfdnR5LAorICAgICAgbm9fc2VydmljZV9hZHZhbmNlZF92dHlfY21kLAorICAgICAgIm5vIHNlcnZpY2UgYWR2YW5jZWQtdnR5IiwKKyAgICAgIE5PX1NUUgorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIgIkVuYWJsZSBhZHZhbmNlZCBtb2RlIHZ0eSBpbnRlcmZhY2VcbiIpCit7CisJaG9zdC5hZHZhbmNlZCA9IDA7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTih0ZXJtaW5hbF9tb25pdG9yLAorICAgICAgdGVybWluYWxfbW9uaXRvcl9jbWQsCisgICAgICAidGVybWluYWwgbW9uaXRvciIsCisgICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgcGFyYW1ldGVyc1xuIgorICAgICAgIkNvcHkgZGVidWcgb3V0cHV0IHRvIHRoZSBjdXJyZW50IHRlcm1pbmFsIGxpbmVcbiIpCit7CisJdnR5LT5tb25pdG9yID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHRlcm1pbmFsX25vX21vbml0b3IsCisgICAgICB0ZXJtaW5hbF9ub19tb25pdG9yX2NtZCwKKyAgICAgICJ0ZXJtaW5hbCBubyBtb25pdG9yIiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICBOT19TVFIgIkNvcHkgZGVidWcgb3V0cHV0IHRvIHRoZSBjdXJyZW50IHRlcm1pbmFsIGxpbmVcbiIpCit7CisJdnR5LT5tb25pdG9yID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfaGlzdG9yeSwKKyAgICAgIHNob3dfaGlzdG9yeV9jbWQsCisgICAgICAic2hvdyBoaXN0b3J5IiwgU0hPV19TVFIgIkRpc3BsYXkgdGhlIHNlc3Npb24gY29tbWFuZCBoaXN0b3J5XG4iKQoreworCWludCBpbmRleDsKKworCWZvciAoaW5kZXggPSB2dHktPmhpbmRleCArIDE7IGluZGV4ICE9IHZ0eS0+aGluZGV4OykgeworCQlpZiAoaW5kZXggPT0gVlRZX01BWEhJU1QpIHsKKwkJCWluZGV4ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZ0eS0+aGlzdFtpbmRleF0gIT0gTlVMTCkKKwkJCXZ0eV9vdXQodnR5LCAiICAlcyVzIiwgdnR5LT5oaXN0W2luZGV4XSwgVlRZX05FV0xJTkUpOworCisJCWluZGV4Kys7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBEaXNwbGF5IGN1cnJlbnQgY29uZmlndXJhdGlvbi4gKi8KK3N0YXRpYyBpbnQgdnR5X2NvbmZpZ193cml0ZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICJsaW5lIHZ0eSVzIiwgVlRZX05FV0xJTkUpOworCisJLyogbG9naW4gKi8KKwlpZiAobm9fcGFzc3dvcmRfY2hlY2spCisJCXZ0eV9vdXQodnR5LCAiIG5vIGxvZ2luJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RydWN0IGNtZF9ub2RlIHZ0eV9ub2RlID0geworCVZUWV9OT0RFLAorCSIlcyhjb25maWctbGluZSkjICIsCisJMSwKK307CisKKy8qIFJlc2V0IGFsbCBWVFkgc3RhdHVzLiAqLwordm9pZCB2dHlfcmVzZXQoKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB2dHkgKnZ0eTsKKwlzdHJ1Y3QgdGhyZWFkICp2dHlfc2Vydl90aHJlYWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2dHl2ZWMpOyBpKyspCisJCWlmICgodnR5ID0gdmVjdG9yX3Nsb3QodnR5dmVjLCBpKSkgIT0gTlVMTCkgeworCQkJYnVmZmVyX3Jlc2V0KHZ0eS0+b2J1Zik7CisJCQl2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKKwkJCXZ0eV9jbG9zZSh2dHkpOworCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShWdnR5X3NlcnZfdGhyZWFkKTsgaSsrKQorCQlpZiAoKHZ0eV9zZXJ2X3RocmVhZCA9CisJCSAgICAgdmVjdG9yX3Nsb3QoVnZ0eV9zZXJ2X3RocmVhZCwgaSkpICE9IE5VTEwpIHsKKwkJCS8vdGhyZWFkX2NhbmNlbCAodnR5X3NlcnZfdGhyZWFkKTsKKwkJCXZlY3Rvcl9zbG90KFZ2dHlfc2Vydl90aHJlYWQsIGkpID0gTlVMTDsKKwkJCWNsb3NlKGkpOworCQl9Cit9CisKK3N0YXRpYyB2b2lkIHZ0eV9zYXZlX2N3ZCh2b2lkKQoreworCWNoYXIgY3dkW01BWFBBVEhMRU5dOworCWNoYXIgKmMgOworCisJYyA9IGdldGN3ZChjd2QsIE1BWFBBVEhMRU4pOworCisJaWYgKCFjKSB7CisJCWlmIChjaGRpcihTWVNDT05GRElSKSAhPSAwKQorCQkgICAgcGVycm9yKCJjaGRpciBmYWlsZWQiKTsKKwkJaWYgKGdldGN3ZChjd2QsIE1BWFBBVEhMRU4pID09IE5VTEwpCisJCSAgICBwZXJyb3IoImdldGN3ZCBmYWlsZWQiKTsKKwl9CisKKwl2dHlfY3dkID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgc3RybGVuKGN3ZCkgKyAxLCAic2F2ZV9jd2QiKTsKKwlzdHJjcHkodnR5X2N3ZCwgY3dkKTsKK30KKworY2hhciAqdnR5X2dldF9jd2QoKQoreworCXJldHVybiB2dHlfY3dkOworfQorCitpbnQgdnR5X3NoZWxsX3NlcnYoc3RydWN0IHZ0eSAqdnR5KQoreworCXJldHVybiB2dHktPnR5cGUgPT0gVlRZX1NIRUxMX1NFUlYgPyAxIDogMDsKK30KKwordm9pZCB2dHlfaW5pdF92dHlzaCgpCit7CisJdnR5dmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKK30KKworZXh0ZXJuIHZvaWQgKnRhbGxfYnNjX2N0eDsKKy8qIEluc3RhbGwgdnR5J3Mgb3duIGNvbW1hbmRzIGxpa2UgYHdobycgY29tbWFuZC4gKi8KK3ZvaWQgdnR5X2luaXQoKQoreworCXRhbGxfdnR5X2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAwLCAidnR5Iik7CisJdGFsbF92dHlfdmVjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX3Z0eV9jdHgsIDAsICJ2dHlfdmVjdG9yIik7CisJdGFsbF92dHlfY21kX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX3Z0eV9jdHgsIDAsICJ2dHlfY29tbWFuZCIpOworCisJLyogRm9yIGZ1cnRoZXIgY29uZmlndXJhdGlvbiByZWFkLCBwcmVzZXJ2ZSBjdXJyZW50IGRpcmVjdG9yeS4gKi8KKwl2dHlfc2F2ZV9jd2QoKTsKKworCXZ0eXZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisKKwkvKiBJbnN0YWxsIGJncCB0b3Agbm9kZS4gKi8KKwlpbnN0YWxsX25vZGUoJnZ0eV9ub2RlLCB2dHlfY29uZmlnX3dyaXRlKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfd2hvX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfaGlzdG9yeV9jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ193aG9fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZsaW5lX3Z0eV9jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnNlcnZpY2VfYWR2YW5jZWRfdnR5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fc2VydmljZV9hZHZhbmNlZF92dHlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZzaG93X2hpc3RvcnlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZ0ZXJtaW5hbF9tb25pdG9yX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmdGVybWluYWxfbm9fbW9uaXRvcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJnNob3dfaGlzdG9yeV9jbWQpOworCisJaW5zdGFsbF9kZWZhdWx0KFZUWV9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoVlRZX05PREUsICZ2dHlfbG9naW5fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVlRZX05PREUsICZub192dHlfbG9naW5fY21kKTsKK30KKworaW50IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKwlGSUxFICpjZmlsZTsKKwlpbnQgcmM7CisKKwljZmlsZSA9IGZvcGVuKGZpbGVfbmFtZSwgInIiKTsKKwlpZiAoIWNmaWxlKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJjID0gdnR5X3JlYWRfZmlsZShjZmlsZSk7CisJZmNsb3NlKGNmaWxlKTsKKworCWhvc3RfY29uZmlnX3NldChmaWxlX25hbWUpOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZS5jIGIvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NjEzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlLmMKQEAgLTAsMCArMSwyMDAwIEBACisvKiBPcGVuQlNDIGludGVyZmFjZSB0byBxdWFnZ2EgVlRZICovCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx2dHkvYnVmZmVyLmg+CisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWVhc19yZXAuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8b3BlbmJzYy92dHkuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dwcnNfbnMuaD4KKworc3RhdGljIHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworCisvKiBGSVhNRTogdGhpcyBzaG91bGQgZ28gdG8gc29tZSBjb21tb24gZmlsZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgZ3Byc19uc190aW1lcl9zdHJzW10gPSB7CisJeyAwLCAidG5zLWJsb2NrIiB9LAorCXsgMSwgInRucy1ibG9jay1yZXRyaWVzIiB9LAorCXsgMiwgInRucy1yZXNldCIgfSwKKwl7IDMsICJ0bnMtcmVzZXQtcmV0cmllcyIgfSwKKwl7IDQsICJ0bnMtdGVzdCIgfSwKKwl7IDUsICJ0bnMtYWxpdmUiIH0sCisJeyA2LCAidG5zLWFsaXZlLXJldHJpZXMiIH0sCisJeyAwLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGdwcnNfYnNzZ3BfY2ZnX3N0cnNbXSA9IHsKKwl7IDAsCSJibG9ja2luZy10aW1lciIgfSwKKwl7IDEsCSJibG9ja2luZy1yZXRyaWVzIiB9LAorCXsgMiwJInVuYmxvY2tpbmctcmV0cmllcyIgfSwKKwl7IDMsCSJyZXNldC10aW1lciIgfSwKKwl7IDQsCSJyZXNldC1yZXRyaWVzIiB9LAorCXsgNSwJInN1c3BlbmQtdGltZXIiIH0sCisJeyA2LAkic3VzcGVuZC1yZXRyaWVzIiB9LAorCXsgNywJInJlc3VtZS10aW1lciIgfSwKKwl7IDgsCSJyZXN1bWUtcmV0cmllcyIgfSwKKwl7IDksCSJjYXBhYmlsaXR5LXVwZGF0ZS10aW1lciIgfSwKKwl7IDEwLAkiY2FwYWJpbGl0eS11cGRhdGUtcmV0cmllcyIgfSwKKwl7IDAsCU5VTEwgfQorfTsKKworc3RydWN0IGNtZF9ub2RlIG5ldF9ub2RlID0geworCUdTTU5FVF9OT0RFLAorCSIlcyhuZXR3b3JrKSMiLAorCTEsCit9OworCitzdHJ1Y3QgY21kX25vZGUgYnRzX25vZGUgPSB7CisJQlRTX05PREUsCisJIiVzKGJ0cykjIiwKKwkxLAorfTsKKworc3RydWN0IGNtZF9ub2RlIHRyeF9ub2RlID0geworCVRSWF9OT0RFLAorCSIlcyh0cngpIyIsCisJMSwKK307CisKK3N0cnVjdCBjbWRfbm9kZSB0c19ub2RlID0geworCVRTX05PREUsCisJIiVzKHRzKSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGR1bW15X2NvbmZpZ193cml0ZShzdHJ1Y3QgdnR5ICp2KQoreworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbmV0X2R1bXBfbm1zdGF0ZShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5tcykKK3sKKwl2dHlfb3V0KHZ0eSwiT3BlciAnJXMnLCBBZG1pbiAldSwgQXZhaWwgJyVzJyVzIiwKKwkJbm1fb3BzdGF0ZV9uYW1lKG5tcy0+b3BlcmF0aW9uYWwpLCBubXMtPmFkbWluaXN0cmF0aXZlLAorCQlubV9hdmFpbF9uYW1lKG5tcy0+YXZhaWxhYmlsaXR5KSwgVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3BjaGFuX2xvYWRfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqcHJlZml4LAorCQkJCWNvbnN0IHN0cnVjdCBwY2hhbl9sb2FkICpwbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBsLT5wY2hhbik7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgbG9hZF9jb3VudGVyICpsYyA9ICZwbC0+cGNoYW5baV07CisJCXVuc2lnbmVkIGludCBwZXJjZW50OworCisJCWlmIChsYy0+dG90YWwgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXBlcmNlbnQgPSAobGMtPnVzZWQgKiAxMDApIC8gbGMtPnRvdGFsOworCisJCXZ0eV9vdXQodnR5LCAiJXMlMjBzOiAlM3UlJSAoJXUvJXUpJXMiLCBwcmVmaXgsCisJCQlnc21fcGNoYW5fbmFtZShpKSwgcGVyY2VudCwgbGMtPnVzZWQsIGxjLT50b3RhbCwKKwkJCVZUWV9ORVdMSU5FKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCXN0cnVjdCBwY2hhbl9sb2FkIHBsOworCisJdnR5X291dCh2dHksICJCU0MgaXMgb24gQ291bnRyeSBDb2RlICV1LCBOZXR3b3JrIENvZGUgJXUgIgorCQkiYW5kIGhhcyAldSBCVFMlcyIsIG5ldC0+Y291bnRyeV9jb2RlLCBuZXQtPm5ldHdvcmtfY29kZSwKKwkJbmV0LT5udW1fYnRzLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIExvbmcgbmV0d29yayBuYW1lOiAnJXMnJXMiLAorCQluZXQtPm5hbWVfbG9uZywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBTaG9ydCBuZXR3b3JrIG5hbWU6ICclcyclcyIsCisJCW5ldC0+bmFtZV9zaG9ydCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBBdXRoZW50aWNhdGlvbiBwb2xpY3k6ICVzJXMiLAorCQlnc21fYXV0aF9wb2xpY3lfbmFtZShuZXQtPmF1dGhfcG9saWN5KSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBMb2NhdGlvbiB1cGRhdGluZyByZWplY3QgY2F1c2U6ICV1JXMiLAorCQluZXQtPnJlamVjdF9jYXVzZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBFbmNyeXB0aW9uOiBBNS8ldSVzIiwgbmV0LT5hNV9lbmNyeXB0aW9uLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5FQ0kgKFRDSC9IKTogJXUlcyIsIG5ldC0+bmVjaSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBSUkxQIE1vZGU6ICVzJXMiLCBycmxwX21vZGVfbmFtZShuZXQtPnJybHAubW9kZSksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTU0gSW5mbzogJXMlcyIsIG5ldC0+c2VuZF9tbV9pbmZvID8gIk9uIiA6ICJPZmYiLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIEhhbmRvdmVyOiAlcyVzIiwgbmV0LT5oYW5kb3Zlci5hY3RpdmUgPyAiT24iIDogIk9mZiIsCisJCVZUWV9ORVdMSU5FKTsKKwluZXR3b3JrX2NoYW5fbG9hZCgmcGwsIG5ldCk7CisJdnR5X291dCh2dHksICIgIEN1cnJlbnQgQ2hhbm5lbCBMb2FkOiVzIiwgVlRZX05FV0xJTkUpOworCWR1bXBfcGNoYW5fbG9hZF92dHkodnR5LCAiICAgICIsICZwbCk7Cit9CisKK0RFRlVOKHNob3dfbmV0LCBzaG93X25ldF9jbWQsICJzaG93IG5ldHdvcmsiLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgR1NNIE5FVFdPUktcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJbmV0X2R1bXBfdnR5KHZ0eSwgbmV0KTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgZTFpc2xfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICplMWwpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisKKwlpZiAoIWUxbCkgeworCQl2dHlfb3V0KHZ0eSwgIiAgIE5vbmUlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuOworCX0KKworCWxpbmUgPSBlMWwtPnRzLT5saW5lOworCisJdnR5X291dCh2dHksICIgICAgRTEgTGluZSAldSwgVHlwZSAlczogVGltZXNsb3QgJXUsIE1vZGUgJXMlcyIsCisJCWxpbmUtPm51bSwgbGluZS0+ZHJpdmVyLT5uYW1lLCBlMWwtPnRzLT5udW0sCisJCWUxaW5wX3NpZ250eXBlX25hbWUoZTFsLT50eXBlKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgIEUxIFRFSSAldSwgU0FQSSAldSVzIiwKKwkJZTFsLT50ZWksIGUxbC0+c2FwaSwgVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBidHNfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBwY2hhbl9sb2FkIHBsOworCisJdnR5X291dCh2dHksICJCVFMgJXUgaXMgb2YgJXMgdHlwZSBpbiBiYW5kICVzLCBoYXMgQ0kgJXUgTEFDICV1LCAiCisJCSJCU0lDICV1LCBUU0MgJXUgYW5kICV1IFRSWCVzIiwKKwkJYnRzLT5uciwgYnRzdHlwZTJzdHIoYnRzLT50eXBlKSwgZ3NtX2JhbmRfbmFtZShidHMtPmJhbmQpLAorCQlidHMtPmNlbGxfaWRlbnRpdHksCisJCWJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlLCBidHMtPmJzaWMsIGJ0cy0+dHNjLAorCQlidHMtPm51bV90cngsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIk1TIE1heCBwb3dlcjogJXUgZEJtJXMiLCBidHMtPm1zX21heF9wb3dlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiTWluaW11bSBSeCBMZXZlbCBmb3IgQWNjZXNzOiAlaSBkQm0lcyIsCisJCXJ4bGV2MmRibShidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIucnhsZXZfYWNjX21pbiksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkNlbGwgUmVzZWxlY3Rpb24gSHlzdGVyZXNpczogJXUgZEJtJXMiLAorCQlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0KjIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlJBQ0ggVFgtSW50ZWdlcjogJXUlcyIsIGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50eF9pbnRlZ2VyLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJSQUNIIE1heCB0cmFuc21pc3Npb25zOiAldSVzIiwKKwkJcmFjaF9tYXhfdHJhbnNfcmF3MnZhbChidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wubWF4X3RyYW5zKSwKKwkJVlRZX05FV0xJTkUpOworCWlmIChidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wuY2VsbF9iYXIpCisJCXZ0eV9vdXQodnR5LCAiICBDRUxMIElTIEJBUlJFRCVzIiwgVlRZX05FV0xJTkUpOworCWlmIChpc19pcGFjY2Vzc19idHMoYnRzKSkKKwkJdnR5X291dCh2dHksICIgIFVuaXQgSUQ6ICV1LyV1LzAsIE9NTCBTdHJlYW0gSUQgMHglMDJ4JXMiLAorCQkJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCwgYnRzLT5pcF9hY2Nlc3MuYnRzX2lkLAorCQkJYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5NIFN0YXRlOiAiKTsKKwluZXRfZHVtcF9ubXN0YXRlKHZ0eSwgJmJ0cy0+bm1fc3RhdGUpOworCXZ0eV9vdXQodnR5LCAiICBTaXRlIE1nciBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZidHMtPnNpdGVfbWdyLm5tX3N0YXRlKTsKKwl2dHlfb3V0KHZ0eSwgIiAgUGFnaW5nOiBGSVhNRSBwZW5kaW5nIHJlcXVlc3RzLCAldSBmcmVlIHNsb3RzJXMiLAorCQlidHMtPnBhZ2luZy5hdmFpbGFibGVfc2xvdHMsIFZUWV9ORVdMSU5FKTsKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiICBFMSBTaWduYWxsaW5nIExpbms6JXMiLCBWVFlfTkVXTElORSk7CisJCWUxaXNsX2R1bXBfdnR5KHZ0eSwgYnRzLT5vbWxfbGluayk7CisJfQorCS8qIEZJWE1FOiBvbWxfbGluaywgY2hhbl9kZXNjICovCisJbWVtc2V0KCZwbCwgMCwgc2l6ZW9mKHBsKSk7CisJYnRzX2NoYW5fbG9hZCgmcGwsIGJ0cyk7CisJdnR5X291dCh2dHksICIgIEN1cnJlbnQgQ2hhbm5lbCBMb2FkOiVzIiwgVlRZX05FV0xJTkUpOworCWR1bXBfcGNoYW5fbG9hZF92dHkodnR5LCAiICAgICIsICZwbCk7Cit9CisKK0RFRlVOKHNob3dfYnRzLCBzaG93X2J0c19jbWQsICJzaG93IGJ0cyBbbnVtYmVyXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBCVFNcbiIKKwkJIkJUUyBudW1iZXIiKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCWludCBidHNfbnI7CisKKwlpZiAoYXJnYyAhPSAwKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAnJXMnJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHNfZHVtcF92dHkodnR5LCBnc21fYnRzX251bShuZXQsIGJ0c19ucikpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCS8qIHByaW50IGFsbCBCVFMncyAqLworCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykKKwkJYnRzX2R1bXBfdnR5KHZ0eSwgZ3NtX2J0c19udW0obmV0LCBidHNfbnIpKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2UxX2xpbmsoc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rLCBjb25zdCBjaGFyICpsaW5lLAorCQkJICBjb25zdCBjaGFyICp0cywgY29uc3QgY2hhciAqc3MpCit7CisJZTFfbGluay0+ZTFfbnIgPSBhdG9pKGxpbmUpOworCWUxX2xpbmstPmUxX3RzID0gYXRvaSh0cyk7CisJaWYgKCFzdHJjbXAoc3MsICJmdWxsIikpCisJCWUxX2xpbmstPmUxX3RzX3NzID0gMjU1OworCWVsc2UKKwkJZTFfbGluay0+ZTFfdHNfc3MgPSBhdG9pKHNzKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX3dyaXRlX2UxX2xpbmsoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmssCisJCQkJIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpZiAoIWUxX2xpbmstPmUxX3RzKQorCQlyZXR1cm47CisKKwlpZiAoZTFfbGluay0+ZTFfdHNfc3MgPT0gMjU1KQorCQl2dHlfb3V0KHZ0eSwgIiVzZTEgbGluZSAldSB0aW1lc2xvdCAldSBzdWItc2xvdCBmdWxsJXMiLAorCQkJcHJlZml4LCBlMV9saW5rLT5lMV9uciwgZTFfbGluay0+ZTFfdHMsIFZUWV9ORVdMSU5FKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAiJXNlMSBsaW5lICV1IHRpbWVzbG90ICV1IHN1Yi1zbG90ICV1JXMiLAorCQkJcHJlZml4LCBlMV9saW5rLT5lMV9uciwgZTFfbGluay0+ZTFfdHMsCisJCQllMV9saW5rLT5lMV90c19zcywgVlRZX05FV0xJTkUpOworfQorCisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV90c19zaW5nbGUoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXZ0eV9vdXQodnR5LCAiICAgIHRpbWVzbG90ICV1JXMiLCB0cy0+bnIsIFZUWV9ORVdMSU5FKTsKKwlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9OT05FKQorCQl2dHlfb3V0KHZ0eSwgIiAgICAgcGh5c19jaGFuX2NvbmZpZyAlcyVzIiwKKwkJCWdzbV9wY2hhbl9uYW1lKHRzLT5wY2hhbiksIFZUWV9ORVdMSU5FKTsKKwljb25maWdfd3JpdGVfZTFfbGluayh2dHksICZ0cy0+ZTFfbGluaywgIiAgICAgIik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV90cnhfc2luZ2xlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJaW50IGk7CisKKwl2dHlfb3V0KHZ0eSwgIiAgdHJ4ICV1JXMiLCB0cngtPm5yLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICByZl9sb2NrZWQgJXUlcyIsCisJCXRyeC0+bm1fc3RhdGUuYWRtaW5pc3RyYXRpdmUgPT0gTk1fU1RBVEVfTE9DS0VEID8gMSA6IDAsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgIGFyZmNuICV1JXMiLCB0cngtPmFyZmNuLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICBub21pbmFsIHBvd2VyICV1JXMiLCB0cngtPm5vbWluYWxfcG93ZXIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgIG1heF9wb3dlcl9yZWQgJXUlcyIsIHRyeC0+bWF4X3Bvd2VyX3JlZCwgVlRZX05FV0xJTkUpOworCWNvbmZpZ193cml0ZV9lMV9saW5rKHZ0eSwgJnRyeC0+cnNsX2UxX2xpbmssICIgICByc2wgIik7CisJdnR5X291dCh2dHksICIgICByc2wgZTEgdGVpICV1JXMiLCB0cngtPnJzbF90ZWksIFZUWV9ORVdMSU5FKTsKKworCWZvciAoaSA9IDA7IGkgPCBUUlhfTlJfVFM7IGkrKykKKwkJY29uZmlnX3dyaXRlX3RzX3NpbmdsZSh2dHksICZ0cngtPnRzW2ldKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX3dyaXRlX2J0c19ncHJzKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBtb2RlICVzJXMiLCBidHNfZ3Byc19tb2RlX25hbWUoYnRzLT5ncHJzLm1vZGUpLAorCQlWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpCisJCXJldHVybjsKKworCXZ0eV9vdXQodnR5LCAiICBncHJzIHJvdXRpbmcgYXJlYSAldSVzIiwgYnRzLT5ncHJzLnJhYywKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBncHJzIGNlbGwgYnZjaSAldSVzIiwgYnRzLT5ncHJzLmNlbGwuYnZjaSwKKwkJVlRZX05FV0xJTkUpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ0cy0+Z3Bycy5jZWxsLnRpbWVyKTsgaSsrKQorCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBjZWxsIHRpbWVyICVzICV1JXMiLAorCQkJZ2V0X3ZhbHVlX3N0cmluZyhncHJzX2Jzc2dwX2NmZ19zdHJzLCBpKSwKKwkJCWJ0cy0+Z3Bycy5jZWxsLnRpbWVyW2ldLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGdwcnMgbnNlaSAldSVzIiwgYnRzLT5ncHJzLm5zZS5uc2VpLAorCQlWVFlfTkVXTElORSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zZS50aW1lcik7IGkrKykKKwkJdnR5X291dCh2dHksICIgIGdwcnMgbnMgdGltZXIgJXMgJXUlcyIsCisJCQlnZXRfdmFsdWVfc3RyaW5nKGdwcnNfbnNfdGltZXJfc3RycywgaSksCisJCQlidHMtPmdwcnMubnNlLnRpbWVyW2ldLCBWVFlfTkVXTElORSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zdmMpOyBpKyspIHsKKwkJc3RydWN0IGdzbV9idHNfZ3Byc19uc3ZjICpuc3ZjID0KKwkJCQkJJmJ0cy0+Z3Bycy5uc3ZjW2ldOworCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCQlpYS5zX2FkZHIgPSBodG9ubChuc3ZjLT5yZW1vdGVfaXApOworCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IG5zdmNpICV1JXMiLCBpLAorCQkJbnN2Yy0+bnN2Y2ksIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgIGdwcnMgbnN2YyAldSBsb2NhbCB1ZHAgcG9ydCAldSVzIiwgaSwKKwkJCW5zdmMtPmxvY2FsX3BvcnQsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgIGdwcnMgbnN2YyAldSByZW1vdGUgdWRwIHBvcnQgJXUlcyIsIGksCisJCQluc3ZjLT5yZW1vdGVfcG9ydCwgVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IHJlbW90ZSBpcCAlcyVzIiwgaSwKKwkJCWluZXRfbnRvYShpYSksIFZUWV9ORVdMSU5FKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV9idHNfc2luZ2xlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCXZ0eV9vdXQodnR5LCAiIGJ0cyAldSVzIiwgYnRzLT5uciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICB0eXBlICVzJXMiLCBidHN0eXBlMnN0cihidHMtPnR5cGUpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJhbmQgJXMlcyIsIGdzbV9iYW5kX25hbWUoYnRzLT5iYW5kKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBjZWxsX2lkZW50aXR5ICV1JXMiLCBidHMtPmNlbGxfaWRlbnRpdHksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbG9jYXRpb25fYXJlYV9jb2RlICV1JXMiLCBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlICV1JXMiLCBidHMtPnRzYywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiYXNlX3N0YXRpb25faWRfY29kZSAldSVzIiwgYnRzLT5ic2ljLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIG1zIG1heCBwb3dlciAldSVzIiwgYnRzLT5tc19tYXhfcG93ZXIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgY2VsbCByZXNlbGVjdGlvbiBoeXN0ZXJlc2lzICV1JXMiLAorCQlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0KjIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcnhsZXYgYWNjZXNzIG1pbiAldSVzIiwKKwkJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4sIFZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyKQorCQl2dHlfb3V0KHZ0eSwgIiAgcGVyaW9kaWMgbG9jYXRpb24gdXBkYXRlICV1JXMiLAorCQkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyICogMTAsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgY2hhbm5lbCBhbGxvY2F0b3IgJXMlcyIsCisJCWJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlID8gImRlc2NlbmRpbmciIDogImFzY2VuZGluZyIsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcmFjaCB0eCBpbnRlZ2VyICV1JXMiLAorCQlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudHhfaW50ZWdlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICByYWNoIG1heCB0cmFuc21pc3Npb24gJXUlcyIsCisJCXJhY2hfbWF4X3RyYW5zX3JhdzJ2YWwoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyksCisJCVZUWV9ORVdMSU5FKTsKKworCWlmIChidHMtPnJhY2hfYl90aHJlc2ggIT0gLTEpCisJCXZ0eV9vdXQodnR5LCAiICByYWNoIG5tIGJ1c3kgdGhyZXNob2xkICV1JXMiLAorCQkJYnRzLT5yYWNoX2JfdGhyZXNoLCBWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+cmFjaF9sZGF2Z19zbG90cyAhPSAtMSkKKwkJdnR5X291dCh2dHksICIgIHJhY2ggbm0gbG9hZCBhdmVyYWdlICV1JXMiLAorCQkJYnRzLT5yYWNoX2xkYXZnX3Nsb3RzLCBWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5jZWxsX2JhcikKKwkJdnR5X291dCh2dHksICIgIGNlbGwgYmFycmVkIDElcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJdnR5X291dCh2dHksICIgIGlwLmFjY2VzcyB1bml0X2lkICV1ICV1JXMiLAorCQkJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCwgYnRzLT5pcF9hY2Nlc3MuYnRzX2lkLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICBvbWwgaXAuYWNjZXNzIHN0cmVhbV9pZCAldSVzIiwgYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJfSBlbHNlIHsKKwkJY29uZmlnX3dyaXRlX2UxX2xpbmsodnR5LCAmYnRzLT5vbWxfZTFfbGluaywgIiAgb21sICIpOworCQl2dHlfb3V0KHZ0eSwgIiAgb21sIGUxIHRlaSAldSVzIiwgYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJfQorCWNvbmZpZ193cml0ZV9idHNfZ3Bycyh2dHksIGJ0cyk7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KQorCQljb25maWdfd3JpdGVfdHJ4X3NpbmdsZSh2dHksIHRyeCk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX2J0cyhzdHJ1Y3QgdnR5ICp2KQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZnc21uZXQtPmJ0c19saXN0LCBsaXN0KQorCQljb25maWdfd3JpdGVfYnRzX3NpbmdsZSh2LCBidHMpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9uZXQoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eV9vdXQodnR5LCAibmV0d29yayVzIiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIG5ldHdvcmsgY291bnRyeSBjb2RlICV1JXMiLCBnc21uZXQtPmNvdW50cnlfY29kZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIG1vYmlsZSBuZXR3b3JrIGNvZGUgJXUlcyIsIGdzbW5ldC0+bmV0d29ya19jb2RlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgc2hvcnQgbmFtZSAlcyVzIiwgZ3NtbmV0LT5uYW1lX3Nob3J0LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbG9uZyBuYW1lICVzJXMiLCBnc21uZXQtPm5hbWVfbG9uZywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGF1dGggcG9saWN5ICVzJXMiLCBnc21fYXV0aF9wb2xpY3lfbmFtZShnc21uZXQtPmF1dGhfcG9saWN5KSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdCBjYXVzZSAldSVzIiwKKwkJZ3NtbmV0LT5yZWplY3RfY2F1c2UsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBlbmNyeXB0aW9uIGE1ICV1JXMiLCBnc21uZXQtPmE1X2VuY3J5cHRpb24sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBuZWNpICV1JXMiLCBnc21uZXQtPm5lY2ksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBycmxwIG1vZGUgJXMlcyIsIHJybHBfbW9kZV9uYW1lKGdzbW5ldC0+cnJscC5tb2RlKSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIG1tIGluZm8gJXUlcyIsIGdzbW5ldC0+c2VuZF9tbV9pbmZvLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgJXUlcyIsIGdzbW5ldC0+aGFuZG92ZXIuYWN0aXZlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgd2luZG93IHJ4bGV2IGF2ZXJhZ2luZyAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgd2luZG93IHJ4cXVhbCBhdmVyYWdpbmcgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4cXVhbF9hdmcsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgbmVpZ2hib3IgYXZlcmFnaW5nICV1JXMiLAorCQlnc21uZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmdfbmVpZ2gsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciBwb3dlciBidWRnZXQgaW50ZXJ2YWwgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIucHdyX2ludGVydmFsLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGh5c3RlcmVzaXMgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIucHdyX2h5c3RlcmVzaXMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciBtYXhpbXVtIGRpc3RhbmNlICV1JXMiLAorCQlnc21uZXQtPmhhbmRvdmVyLm1heF9kaXN0YW5jZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTAxICV1JXMiLCBnc21uZXQtPlQzMTAxLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDMgJXUlcyIsIGdzbW5ldC0+VDMxMDMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzEwNSAldSVzIiwgZ3NtbmV0LT5UMzEwNSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTA3ICV1JXMiLCBnc21uZXQtPlQzMTA3LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDkgJXUlcyIsIGdzbW5ldC0+VDMxMDksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzExMSAldSVzIiwgZ3NtbmV0LT5UMzExMSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTEzICV1JXMiLCBnc21uZXQtPlQzMTEzLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMTUgJXUlcyIsIGdzbW5ldC0+VDMxMTUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzExNyAldSVzIiwgZ3NtbmV0LT5UMzExNywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTE5ICV1JXMiLCBnc21uZXQtPlQzMTE5LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxNDEgJXUlcyIsIGdzbW5ldC0+VDMxNDEsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgdHJ4X2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJdnR5X291dCh2dHksICJUUlggJXUgb2YgQlRTICV1IGlzIG9uIEFSRkNOICV1JXMiLAorCQl0cngtPm5yLCB0cngtPmJ0cy0+bnIsIHRyeC0+YXJmY24sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgUkYgTm9taW5hbCBQb3dlcjogJWQgZEJtLCByZWR1Y2VkIGJ5ICV1IGRCLCAiCisJCSJyZXN1bHRpbmcgQlMgcG93ZXI6ICVkIGRCbSVzIiwKKwkJdHJ4LT5ub21pbmFsX3Bvd2VyLCB0cngtPm1heF9wb3dlcl9yZWQsCisJCXRyeC0+bm9taW5hbF9wb3dlciAtIHRyeC0+bWF4X3Bvd2VyX3JlZCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZ0cngtPm5tX3N0YXRlKTsKKwl2dHlfb3V0KHZ0eSwgIiAgQmFzZWJhbmQgVHJhbnNjZWl2ZXIgTk0gU3RhdGU6ICIpOworCW5ldF9kdW1wX25tc3RhdGUodnR5LCAmdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGUpOworCWlmIChpc19pcGFjY2Vzc19idHModHJ4LT5idHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiICBpcC5hY2Nlc3Mgc3RyZWFtIElEOiAweCUwMnglcyIsCisJCQl0cngtPnJzbF90ZWksIFZUWV9ORVdMSU5FKTsKKwl9IGVsc2UgeworCQl2dHlfb3V0KHZ0eSwgIiAgRTEgU2lnbmFsbGluZyBMaW5rOiVzIiwgVlRZX05FV0xJTkUpOworCQllMWlzbF9kdW1wX3Z0eSh2dHksIHRyeC0+cnNsX2xpbmspOworCX0KK30KKworREVGVU4oc2hvd190cngsCisgICAgICBzaG93X3RyeF9jbWQsCisgICAgICAic2hvdyB0cnggW2J0c19ucl0gW3RyeF9ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgVFJYXG4iCisJIkJUUyBOdW1iZXJcbiIKKwkiVFJYIE51bWJlclxuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlpbnQgYnRzX25yLCB0cnhfbnI7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+PSBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJyVzJyVzIiwgYXJndlswXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCX0KKwlpZiAoYXJnYyA+PSAyKSB7CisJCXRyeF9uciA9IGF0b2koYXJndlsxXSk7CisJCWlmICh0cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgVFJYICclcyclcyIsIGFyZ3ZbMV0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCXRyeF9kdW1wX3Z0eSh2dHksIHRyeCk7CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJaWYgKGJ0cykgeworCQkvKiBwcmludCBhbGwgVFJYIGluIHRoaXMgQlRTICovCisJCWZvciAodHJ4X25yID0gMDsgdHJ4X25yIDwgYnRzLT5udW1fdHJ4OyB0cnhfbnIrKykgeworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJCXRyeF9kdW1wX3Z0eSh2dHksIHRyeCk7CisJCX0KKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKworCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWZvciAodHJ4X25yID0gMDsgdHJ4X25yIDwgYnRzLT5udW1fdHJ4OyB0cnhfbnIrKykgeworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJCXRyeF9kdW1wX3Z0eSh2dHksIHRyeCk7CisJCX0KKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworc3RhdGljIHZvaWQgdHNfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXZ0eV9vdXQodnR5LCAiVGltZXNsb3QgJXUgb2YgVFJYICV1IGluIEJUUyAldSwgcGh5cyBjZmcgJXMlcyIsCisJCXRzLT5uciwgdHMtPnRyeC0+bnIsIHRzLT50cngtPmJ0cy0+bnIsCisJCWdzbV9wY2hhbl9uYW1lKHRzLT5wY2hhbiksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTk0gU3RhdGU6ICIpOworCW5ldF9kdW1wX25tc3RhdGUodnR5LCAmdHMtPm5tX3N0YXRlKTsKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyh0cy0+dHJ4LT5idHMpKQorCQl2dHlfb3V0KHZ0eSwgIiAgRTEgTGluZSAldSwgVGltZXNsb3QgJXUsIFN1YnNsb3QgJXUlcyIsCisJCQl0cy0+ZTFfbGluay5lMV9uciwgdHMtPmUxX2xpbmsuZTFfdHMsCisJCQl0cy0+ZTFfbGluay5lMV90c19zcywgVlRZX05FV0xJTkUpOworfQorCitERUZVTihzaG93X3RzLAorICAgICAgc2hvd190c19jbWQsCisgICAgICAic2hvdyB0aW1lc2xvdCBbYnRzX25yXSBbdHJ4X25yXSBbdHNfbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIFRTXG4iCisJIkJUUyBOdW1iZXJcbiIgIlRSWCBOdW1iZXJcbiIgIlRpbWVzbG90IE51bWJlclxuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJaW50IGJ0c19uciwgdHJ4X25yLCB0c19ucjsKKworCWlmIChhcmdjID49IDEpIHsKKwkJLyogdXNlIHRoZSBCVFMgbnVtYmVyIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAqLworCQlidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCQlpZiAoYnRzX25yID49IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAnJXMnJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJfQorCWlmIChhcmdjID49IDIpIHsKKwkJdHJ4X25yID0gYXRvaShhcmd2WzFdKTsKKwkJaWYgKHRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUlggJyVzJyVzIiwgYXJndlsxXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMykgeworCQl0c19uciA9IGF0b2koYXJndlsyXSk7CisJCWlmICh0c19uciA+PSBUUlhfTlJfVFMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUyAnJXMnJXMiLCBhcmd2WzJdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQl0cyA9ICZ0cngtPnRzW3RzX25yXTsKKwkJdHNfZHVtcF92dHkodnR5LCB0cyk7CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJZm9yIChidHNfbnIgPSAwOyBidHNfbnIgPCBuZXQtPm51bV9idHM7IGJ0c19ucisrKSB7CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJZm9yICh0cnhfbnIgPSAwOyB0cnhfbnIgPCBidHMtPm51bV90cng7IHRyeF9ucisrKSB7CisJCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCQkJZm9yICh0c19uciA9IDA7IHRzX25yIDwgVFJYX05SX1RTOyB0c19ucisrKSB7CisJCQkJdHMgPSAmdHJ4LT50c1t0c19ucl07CisJCQkJdHNfZHVtcF92dHkodnR5LCB0cyk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHN1YnNjcl9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXZ0eV9vdXQodnR5LCAiICAgIElEOiAlbGx1LCBBdXRob3JpemVkOiAlZCVzIiwgc3Vic2NyLT5pZCwKKwkJc3Vic2NyLT5hdXRob3JpemVkLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+bmFtZSkKKwkJdnR5X291dCh2dHksICIgICAgTmFtZTogJyVzJyVzIiwgc3Vic2NyLT5uYW1lLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+ZXh0ZW5zaW9uKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBFeHRlbnNpb246ICVzJXMiLCBzdWJzY3ItPmV4dGVuc2lvbiwKKwkJCVZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5pbXNpKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBJTVNJOiAlcyVzIiwgc3Vic2NyLT5pbXNpLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+dG1zaSAhPSBHU01fUkVTRVJWRURfVE1TSSkKKwkJdnR5X291dCh2dHksICIgICAgVE1TSTogJTA4WCVzIiwgc3Vic2NyLT50bXNpLAorCQkJVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICIgICAgVXNlIGNvdW50OiAldSVzIiwgc3Vic2NyLT51c2VfY291bnQsIFZUWV9ORVdMSU5FKTsKK30KKworc3RhdGljIHZvaWQgbWVhc19yZXBfZHVtcF91bmlfdnR5KHN0cnVjdCB2dHkgKnZ0eSwKKwkJCQkgIHN0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyICptcnUsCisJCQkJICBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkJICBjb25zdCBjaGFyICpkaXIpCit7CisJdnR5X291dCh2dHksICIlcyAgUlhMLUZVTEwtJXM6ICU0ZCBkQm0sIFJYTC1TVUItJXM6ICU0ZCBkQm0gIiwKKwkJcHJlZml4LCBkaXIsIHJ4bGV2MmRibShtcnUtPmZ1bGwucnhfbGV2KSwKKwkJCWRpciwgcnhsZXYyZGJtKG1ydS0+c3ViLnJ4X2xldikpOworCXZ0eV9vdXQodnR5LCAiUlhRLUZVTEwtJXM6ICVkLCBSWFEtU1VCLSVzOiAlZCVzIiwKKwkJZGlyLCBtcnUtPmZ1bGwucnhfcXVhbCwgZGlyLCBtcnUtPnN1Yi5yeF9xdWFsLAorCQlWVFlfTkVXTElORSk7Cit9CisKK3N0YXRpYyB2b2lkIG1lYXNfcmVwX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIsCisJCQkgICAgICBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJdnR5X291dCh2dHksICIlc01lYXN1cmVtZW50IFJlcG9ydDolcyIsIHByZWZpeCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiJXMgIEZsYWdzOiAlcyVzJXMlcyVzIiwgcHJlZml4LAorCQkJbXItPmZsYWdzICYgTUVBU19SRVBfRl9VTF9EVFggPyAiRFRYdSAiIDogIiIsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX0RUWCA/ICJEVFhkICIgOiAiIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRlBDID8gIkZQQyAiIDogIiIsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX1ZBTElEID8gIiAiIDogIkRMaW52YWwgIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9NU19UTykKKwkJdnR5X291dCh2dHksICIlcyAgTVMgVGltaW5nIE9mZnNldDogJXUlcyIsIHByZWZpeCwKKwkJCW1yLT5tc190aW1pbmdfb2Zmc2V0LCBWVFlfTkVXTElORSk7CisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfTVNfTDEpCisJCXZ0eV9vdXQodnR5LCAiJXMgIEwxIE1TIFBvd2VyOiAldSBkQm0sIFRpbWluZyBBZHZhbmNlOiAldSVzIiwKKwkJCXByZWZpeCwgbXItPm1zX2wxLnB3ciwgbXItPm1zX2wxLnRhLCBWVFlfTkVXTElORSk7CisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfVkFMSUQpCisJCW1lYXNfcmVwX2R1bXBfdW5pX3Z0eSh2dHksICZtci0+ZGwsIHByZWZpeCwgImRsIik7CisJbWVhc19yZXBfZHVtcF91bmlfdnR5KHZ0eSwgJm1yLT51bCwgcHJlZml4LCAidWwiKTsKK30KKworc3RhdGljIHZvaWQgbGNoYW5fZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlpbnQgaWR4OworCisJdnR5X291dCh2dHksICJMY2hhbiAldSBpbiBUaW1lc2xvdCAldSBvZiBUUlggJXUgaW4gQlRTICV1LCBUeXBlICVzJXMiLAorCQlsY2hhbi0+bnIsIGxjaGFuLT50cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwKKwkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGdzbV9sY2hhbnRfbmFtZShsY2hhbi0+dHlwZSksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgVXNlIENvdW50OiAldSwgU3RhdGU6ICVzJXMiLCBsY2hhbi0+Y29ubi51c2VfY291bnQsCisJCWdzbV9sY2hhbnNfbmFtZShsY2hhbi0+c3RhdGUpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIEJTIFBvd2VyOiAldSBkQm0sIE1TIFBvd2VyOiAldSBkQm0lcyIsCisJCWxjaGFuLT50cy0+dHJ4LT5ub21pbmFsX3Bvd2VyIC0gbGNoYW4tPnRzLT50cngtPm1heF9wb3dlcl9yZWQKKwkJLSBsY2hhbi0+YnNfcG93ZXIqMiwKKwkJbXNfcHdyX2RibShsY2hhbi0+dHMtPnRyeC0+YnRzLT5iYW5kLCBsY2hhbi0+bXNfcG93ZXIpLAorCQlWVFlfTkVXTElORSk7CisJaWYgKGxjaGFuLT5jb25uLnN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiAgU3Vic2NyaWJlcjolcyIsIFZUWV9ORVdMSU5FKTsKKwkJc3Vic2NyX2R1bXBfdnR5KHZ0eSwgbGNoYW4tPmNvbm4uc3Vic2NyKTsKKwl9IGVsc2UKKwkJdnR5X291dCh2dHksICIgIE5vIFN1YnNjcmliZXIlcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGxjaGFuLT50cy0+dHJ4LT5idHMpKSB7CisJCXN0cnVjdCBpbl9hZGRyIGlhOworCQlpYS5zX2FkZHIgPSBodG9ubChsY2hhbi0+YWJpc19pcC5ib3VuZF9pcCk7CisJCXZ0eV9vdXQodnR5LCAiICBCb3VuZCBJUDogJXMgUG9ydCAldSBSVFBfVFlQRTI9JXUgQ09OTl9JRD0ldSVzIiwKKwkJCWluZXRfbnRvYShpYSksIGxjaGFuLT5hYmlzX2lwLmJvdW5kX3BvcnQsCisJCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIsIGxjaGFuLT5hYmlzX2lwLmNvbm5faWQsCisJCQlWVFlfTkVXTElORSk7CisJfQorCisJLyogd2Ugd2FudCB0byByZXBvcnQgdGhlIGxhc3QgbWVhc3VyZW1lbnQgcmVwb3J0ICovCisJaWR4ID0gY2FsY19pbml0aWFsX2lkeChBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCksCisJCQkgICAgICAgbGNoYW4tPm1lYXNfcmVwX2lkeCwgMSk7CisJbWVhc19yZXBfZHVtcF92dHkodnR5LCAmbGNoYW4tPm1lYXNfcmVwW2lkeF0sICIgICIpOworfQorCisjaWYgMAorVE9ETzogY2FsbHJlZiBhbmQgcmVtb3RlIGNhbGxyZWYgb2YgY2FsbCBtdXN0IGJlIHJlc29sdmVkIHRvIGdldCBnc21fdHJhbnMgb2JqZWN0CitzdGF0aWMgdm9pZCBjYWxsX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9jYWxsICpjYWxsKQoreworCXZ0eV9vdXQodnR5LCAiQ2FsbCBUeXBlICV1LCBTdGF0ZSAldSwgVHJhbnNhY3Rpb24gSUQgJXUlcyIsCisJCWNhbGwtPnR5cGUsIGNhbGwtPnN0YXRlLCBjYWxsLT50cmFuc2FjdGlvbl9pZCwgVlRZX05FV0xJTkUpOworCisJaWYgKGNhbGwtPmxvY2FsX2xjaGFuKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FsbCBMb2NhbCBDaGFubmVsOiVzIiwgVlRZX05FV0xJTkUpOworCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGNhbGwtPmxvY2FsX2xjaGFuKTsKKwl9IGVsc2UKKwkJdnR5X291dCh2dHksICJDYWxsIGhhcyBubyBMb2NhbCBDaGFubmVsJXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoY2FsbC0+cmVtb3RlX2xjaGFuKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FsbCBSZW1vdGUgQ2hhbm5lbDolcyIsIFZUWV9ORVdMSU5FKTsKKwkJbGNoYW5fZHVtcF92dHkodnR5LCBjYWxsLT5yZW1vdGVfbGNoYW4pOworCX0gZWxzZQorCQl2dHlfb3V0KHZ0eSwgIkNhbGwgaGFzIG5vIFJlbW90ZSBDaGFubmVsJXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoY2FsbC0+Y2FsbGVkX3N1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIkNhbGxlZCBTdWJzY3JpYmVyOiVzIiwgVlRZX05FV0xJTkUpOworCQlzdWJzY3JfZHVtcF92dHkodnR5LCBjYWxsLT5jYWxsZWRfc3Vic2NyKTsKKwl9IGVsc2UKKwkJdnR5X291dCh2dHksICJDYWxsIGhhcyBubyBDYWxsZWQgU3Vic2NyaWJlciVzIiwgVlRZX05FV0xJTkUpOworfQorI2VuZGlmCisKK0RFRlVOKHNob3dfbGNoYW4sCisgICAgICBzaG93X2xjaGFuX2NtZCwKKyAgICAgICJzaG93IGxjaGFuIFtidHNfbnJdIFt0cnhfbnJdIFt0c19ucl0gW2xjaGFuX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBsb2dpY2FsIGNoYW5uZWxcbiIKKwkiQlRTIE51bWJlclxuIiAiVFJYIE51bWJlclxuIiAiVGltZXNsb3QgTnVtYmVyXG4iCisJIkxvZ2ljYWwgQ2hhbm5lbCBOdW1iZXJcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCWludCBidHNfbnIsIHRyeF9uciwgdHNfbnIsIGxjaGFuX25yOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQkvKiB1c2UgdGhlIEJUUyBudW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkICovCisJCWJ0c19uciA9IGF0b2koYXJndlswXSk7CisJCWlmIChidHNfbnIgPj0gbmV0LT5udW1fYnRzKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgQlRTICVzJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJfQorCWlmIChhcmdjID49IDIpIHsKKwkJdHJ4X25yID0gYXRvaShhcmd2WzFdKTsKKwkJaWYgKHRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUlggJXMlcyIsIGFyZ3ZbMV0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJfQorCWlmIChhcmdjID49IDMpIHsKKwkJdHNfbnIgPSBhdG9pKGFyZ3ZbMl0pOworCQlpZiAodHNfbnIgPj0gVFJYX05SX1RTKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgVFMgJXMlcyIsIGFyZ3ZbMl0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRzID0gJnRyeC0+dHNbdHNfbnJdOworCX0KKwlpZiAoYXJnYyA+PSA0KSB7CisJCWxjaGFuX25yID0gYXRvaShhcmd2WzNdKTsKKwkJaWYgKGxjaGFuX25yID49IFRTX01BWF9MQ0hBTikgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIExDSEFOICVzJXMiLCBhcmd2WzNdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlsY2hhbiA9ICZ0cy0+bGNoYW5bbGNoYW5fbnJdOworCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGxjaGFuKTsKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspIHsKKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCQlmb3IgKHRyeF9uciA9IDA7IHRyeF9uciA8IGJ0cy0+bnVtX3RyeDsgdHJ4X25yKyspIHsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCQlmb3IgKHRzX25yID0gMDsgdHNfbnIgPCBUUlhfTlJfVFM7IHRzX25yKyspIHsKKwkJCQl0cyA9ICZ0cngtPnRzW3RzX25yXTsKKwkJCQlmb3IgKGxjaGFuX25yID0gMDsgbGNoYW5fbnIgPCBUU19NQVhfTENIQU47CisJCQkJICAgICBsY2hhbl9ucisrKSB7CisJCQkJCWxjaGFuID0gJnRzLT5sY2hhbltsY2hhbl9ucl07CisJCQkJCWlmIChsY2hhbi0+dHlwZSA9PSBHU01fTENIQU5fTk9ORSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGxjaGFuKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGUxZHJ2X2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGUxaW5wX2RyaXZlciAqZHJ2KQoreworCXZ0eV9vdXQodnR5LCAiRTEgSW5wdXQgRHJpdmVyICVzJXMiLCBkcnYtPm5hbWUsIFZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd19lMWRydiwKKyAgICAgIHNob3dfZTFkcnZfY21kLAorICAgICAgInNob3cgZTFfZHJpdmVyIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGUgRTEgZHJpdmVyc1xuIikKK3sKKwlzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcnY7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShkcnYsICZlMWlucF9kcml2ZXJfbGlzdCwgbGlzdCkKKwkJZTFkcnZfZHVtcF92dHkodnR5LCBkcnYpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBlMWxpbmVfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSkKK3sKKwl2dHlfb3V0KHZ0eSwgIkUxIExpbmUgTnVtYmVyICV1LCBOYW1lICVzLCBEcml2ZXIgJXMlcyIsCisJCWxpbmUtPm51bSwgbGluZS0+bmFtZSA/IGxpbmUtPm5hbWUgOiAiIiwKKwkJbGluZS0+ZHJpdmVyLT5uYW1lLCBWVFlfTkVXTElORSk7Cit9CisKK0RFRlVOKHNob3dfZTFsaW5lLAorICAgICAgc2hvd19lMWxpbmVfY21kLAorICAgICAgInNob3cgZTFfbGluZSBbbGluZV9ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgRTEgbGluZVxuIgorCSJFMSBMaW5lIE51bWJlclxuIikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKworCWlmIChhcmdjID49IDEpIHsKKwkJaW50IG51bSA9IGF0b2koYXJndlswXSk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChsaW5lLT5udW0gPT0gbnVtKSB7CisJCQkJZTFsaW5lX2R1bXBfdnR5KHZ0eSwgbGluZSk7CisJCQkJcmV0dXJuIENNRF9TVUNDRVNTOworCQkJfQorCQl9CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CQorCQorCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpCisJCWUxbGluZV9kdW1wX3Z0eSh2dHksIGxpbmUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBlMXRzX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGUxaW5wX3RzICp0cykKK3sKKwlpZiAodHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9OT05FKQorCQlyZXR1cm47CisJdnR5X291dCh2dHksICJFMSBUaW1lc2xvdCAlMnUgb2YgTGluZSAldSBpcyBUeXBlICVzJXMiLAorCQl0cy0+bnVtLCB0cy0+bGluZS0+bnVtLCBlMWlucF90c3R5cGVfbmFtZSh0cy0+dHlwZSksCisJCVZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd19lMXRzLAorICAgICAgc2hvd19lMXRzX2NtZCwKKyAgICAgICJzaG93IGUxX3RpbWVzbG90IFtsaW5lX25yXSBbdHNfbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIEUxIHRpbWVzbG90XG4iCisJIkUxIExpbmUgTnVtYmVyXG4iICJFMSBUaW1lc2xvdCBOdW1iZXJcbiIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBOVUxMOworCXN0cnVjdCBlMWlucF90cyAqdHM7CisJaW50IHRzX25yOworCisJaWYgKGFyZ2MgPT0gMCkgeworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5lLCAmZTFpbnBfbGluZV9saXN0LCBsaXN0KSB7CisJCQlmb3IgKHRzX25yID0gMDsgdHNfbnIgPCBOVU1fRTFfVFM7IHRzX25yKyspIHsKKwkJCQl0cyA9ICZsaW5lLT50c1t0c19ucl07CisJCQkJZTF0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWlmIChhcmdjID49IDEpIHsKKwkJaW50IG51bSA9IGF0b2koYXJndlswXSk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChsaW5lLT5udW0gPT0gbnVtKQorCQkJCWJyZWFrOworCQl9CisJCWlmICghbGluZSB8fCBsaW5lLT5udW0gIT0gbnVtKSB7CisJCQl2dHlfb3V0KHZ0eSwgIkUxIGxpbmUgJXMgaXMgaW52YWxpZCVzIiwKKwkJCQlhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwl9CQorCWlmIChhcmdjID49IDIpIHsKKwkJdHNfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHNfbnIgPiBOVU1fRTFfVFMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiRTEgdGltZXNsb3QgJXMgaXMgaW52YWxpZCVzIiwKKwkJCQlhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHMgPSAmbGluZS0+dHNbdHNfbnJdOworCQllMXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkJZm9yICh0c19uciA9IDA7IHRzX25yIDwgTlVNX0UxX1RTOyB0c19ucisrKSB7CisJCQl0cyA9ICZsaW5lLT50c1t0c19ucl07CisJCQllMXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQl9CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBwYWdpbmdfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpwYWcpCit7CisJdnR5X291dCh2dHksICJQYWdpbmcgb24gQlRTICV1JXMiLCBwYWctPmJ0cy0+bnIsIFZUWV9ORVdMSU5FKTsKKwlzdWJzY3JfZHVtcF92dHkodnR5LCBwYWctPnN1YnNjcik7Cit9CisKK3N0YXRpYyB2b2lkIGJ0c19wYWdpbmdfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnBhZzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZywgJmJ0cy0+cGFnaW5nLnBlbmRpbmdfcmVxdWVzdHMsIGVudHJ5KQorCQlwYWdpbmdfZHVtcF92dHkodnR5LCBwYWcpOworfQorCitERUZVTihzaG93X3BhZ2luZywKKyAgICAgIHNob3dfcGFnaW5nX2NtZCwKKyAgICAgICJzaG93IHBhZ2luZyBbYnRzX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgcGFnaW5nIHJldXFlc3RzIG9mIGEgQlRTXG4iCisJIkJUUyBOdW1iZXJcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgYnRzX25yOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQkvKiB1c2UgdGhlIEJUUyBudW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkICovCisJCWJ0c19uciA9IGF0b2koYXJndlswXSk7CisJCWlmIChidHNfbnIgPj0gbmV0LT5udW1fYnRzKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgQlRTICVzJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWJ0c19wYWdpbmdfZHVtcF92dHkodnR5LCBidHMpOworCQkKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspIHsKKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCQlidHNfcGFnaW5nX2R1bXBfdnR5KHZ0eSwgYnRzKTsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgTkVUV09SS19TVFIgIkNvbmZpZ3VyZSB0aGUgR1NNIG5ldHdvcmtcbiIKKworREVGVU4oY2ZnX25ldCwKKyAgICAgIGNmZ19uZXRfY21kLAorICAgICAgIm5ldHdvcmsiLCBORVRXT1JLX1NUUikKK3sKKwl2dHktPmluZGV4ID0gZ3NtbmV0OworCXZ0eS0+bm9kZSA9IEdTTU5FVF9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19uZXRfbmNjLAorICAgICAgY2ZnX25ldF9uY2NfY21kLAorICAgICAgIm5ldHdvcmsgY291bnRyeSBjb2RlIDwxLTk5OT4iLAorICAgICAgIlNldCB0aGUgR1NNIG5ldHdvcmsgY291bnRyeSBjb2RlIikKK3sKKwlnc21uZXQtPmNvdW50cnlfY29kZSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfbW5jLAorICAgICAgY2ZnX25ldF9tbmNfY21kLAorICAgICAgIm1vYmlsZSBuZXR3b3JrIGNvZGUgPDEtOTk5PiIsCisgICAgICAiU2V0IHRoZSBHU00gbW9iaWxlIG5ldHdvcmsgY29kZSIpCit7CisJZ3NtbmV0LT5uZXR3b3JrX2NvZGUgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X25hbWVfc2hvcnQsCisgICAgICBjZmdfbmV0X25hbWVfc2hvcnRfY21kLAorICAgICAgInNob3J0IG5hbWUgTkFNRSIsCisgICAgICAiU2V0IHRoZSBzaG9ydCBHU00gbmV0d29yayBuYW1lIikKK3sKKwlpZiAoZ3NtbmV0LT5uYW1lX3Nob3J0KQorCQl0YWxsb2NfZnJlZShnc21uZXQtPm5hbWVfc2hvcnQpOworCisJZ3NtbmV0LT5uYW1lX3Nob3J0ID0gdGFsbG9jX3N0cmR1cChnc21uZXQsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X25hbWVfbG9uZywKKyAgICAgIGNmZ19uZXRfbmFtZV9sb25nX2NtZCwKKyAgICAgICJsb25nIG5hbWUgTkFNRSIsCisgICAgICAiU2V0IHRoZSBsb25nIEdTTSBuZXR3b3JrIG5hbWUiKQoreworCWlmIChnc21uZXQtPm5hbWVfbG9uZykKKwkJdGFsbG9jX2ZyZWUoZ3NtbmV0LT5uYW1lX2xvbmcpOworCisJZ3NtbmV0LT5uYW1lX2xvbmcgPSB0YWxsb2Nfc3RyZHVwKGdzbW5ldCwgYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfYXV0aF9wb2xpY3ksCisgICAgICBjZmdfbmV0X2F1dGhfcG9saWN5X2NtZCwKKyAgICAgICJhdXRoIHBvbGljeSAoY2xvc2VkfGFjY2VwdC1hbGx8dG9rZW4pIiwKKwkiQXV0aGVudGljYXRpb24gKG5vdCBjcnlwdG9ncmFwaGljKVxuIgorCSJTZXQgdGhlIEdTTSBuZXR3b3JrIGF1dGhlbnRpY2F0aW9uIHBvbGljeVxuIgorCSJSZXF1aXJlIHRoZSBNUyB0byBiZSBhY3RpdmF0ZWQgaW4gSExSXG4iCisJIkFjY2VwdCBhbGwgTVMsIHdoZXRoZXIgaW4gSExSIG9yIG5vdFxuIgorCSJVc2UgU01TLXRva2VuIGJhc2VkIGF1dGhlbnRpY2F0aW9uXG4iKQoreworCWVudW0gZ3NtX2F1dGhfcG9saWN5IHBvbGljeSA9IGdzbV9hdXRoX3BvbGljeV9wYXJzZShhcmd2WzBdKTsKKworCWdzbW5ldC0+YXV0aF9wb2xpY3kgPSBwb2xpY3k7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfcmVqZWN0X2NhdXNlLAorICAgICAgY2ZnX25ldF9yZWplY3RfY2F1c2VfY21kLAorICAgICAgImxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdCBjYXVzZSA8Mi0xMTE+IiwKKyAgICAgICJTZXQgdGhlIHJlamVjdCBjYXVzZSBvZiBsb2NhdGlvbiB1cGRhdGluZyByZWplY3RcbiIpCit7CisJZ3NtbmV0LT5yZWplY3RfY2F1c2UgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2VuY3J5cHRpb24sCisgICAgICBjZmdfbmV0X2VuY3J5cHRpb25fY21kLAorICAgICAgImVuY3J5cHRpb24gYTUgKDB8MXwyKSIsCisgICAgICAiRW5hYmxlIG9yIGRpc2FibGUgZW5jcnlwdGlvbiAoQTUpIGZvciB0aGlzIG5ldHdvcmtcbiIpCit7CisJZ3NtbmV0LT5hNV9lbmNyeXB0aW9uPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X25lY2ksCisgICAgICBjZmdfbmV0X25lY2lfY21kLAorICAgICAgIm5lY2kgKDB8MSkiLAorICAgICAgIlNldCBpZiBORUNJIG9mIGNlbGwgc2VsZWN0aW9uIGlzIHRvIGJlIHNldCIpCit7CisJZ3NtbmV0LT5uZWNpID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfcnJscF9tb2RlLCBjZmdfbmV0X3JybHBfbW9kZV9jbWQsCisgICAgICAicnJscCBtb2RlIChub25lfG1zLWJhc2VkfG1zLXByZWZlcnJlZHxhc3MtcHJlZmVycmVkKSIsCisJIlJhZGlvIFJlc291cmNlIExvY2F0aW9uIFByb3RvY29sXG4iCisJIlNldCB0aGUgUmFkaW8gUmVzb3VyY2UgTG9jYXRpb24gUHJvdG9jb2wgTW9kZVxuIgorCSJEb24ndCBzZW5kIFJSTFAgcmVxdWVzdFxuIgorCSJSZXF1ZXN0IE1TLWJhc2VkIGxvY2F0aW9uXG4iCisJIlJlcXVlc3QgYW55IGxvY2F0aW9uLCBwcmVmZXIgTVMtYmFzZWRcbiIKKwkiUmVxdWVzdCBhbnkgbG9jYXRpb24sIHByZWZlciBNUy1hc3Npc3RlZFxuIikKK3sKKwlnc21uZXQtPnJybHAubW9kZSA9IHJybHBfbW9kZV9wYXJzZShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9tbV9pbmZvLCBjZmdfbmV0X21tX2luZm9fY21kLAorICAgICAgIm1tIGluZm8gKDB8MSkiLAorCSJXaGV0aGVyIHRvIHNlbmQgTU0gSU5GTyBhZnRlciBMT0MgVVBEIEFDQ0VQVCIpCit7CisJZ3NtbmV0LT5zZW5kX21tX2luZm8gPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIEhBTkRPVkVSX1NUUgkiSGFuZG92ZXIgT3B0aW9uc1xuIgorCitERUZVTihjZmdfbmV0X2hhbmRvdmVyLCBjZmdfbmV0X2hhbmRvdmVyX2NtZCwKKyAgICAgICJoYW5kb3ZlciAoMHwxKSIsCisJSEFORE9WRVJfU1RSCisJIkRvbid0IHBlcmZvcm0gaW4tY2FsbCBoYW5kb3ZlclxuIgorCSJQZXJmb3JtIGluLWNhbGwgaGFuZG92ZXJcbiIpCit7CisJaW50IGVuYWJsZSA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoZW5hYmxlICYmIGlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJdnR5X291dCh2dHksICIlJSBDYW5ub3QgZW5hYmxlIGhhbmRvdmVyIHVubGVzcyBSVFAgUHJveHkgbW9kZSAiCisJCQkiaXMgZW5hYmxlZCBieSB1c2luZyB0aGUgLVAgY29tbWFuZCBsaW5lIG9wdGlvbiVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlnc21uZXQtPmhhbmRvdmVyLmFjdGl2ZSA9IGVuYWJsZTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2RlZmluZSBIT19XSU5fU1RSIEhBTkRPVkVSX1NUUiAiTWVhc3VyZW1lbnQgV2luZG93XG4iCisjZGVmaW5lIEhPX1dJTl9SWExFVl9TVFIgSE9fV0lOX1NUUiAiUmVjZWl2ZWQgTGV2ZWwgQXZlcmFnaW5nXG4iCisjZGVmaW5lIEhPX1dJTl9SWFFVQUxfU1RSIEhPX1dJTl9TVFIgIlJlY2VpdmVkIFF1YWxpdHkgQXZlcmFnaW5nXG4iCisjZGVmaW5lIEhPX1BCVURHRVRfU1RSIEhBTkRPVkVSX1NUUiAiUG93ZXIgQnVkZ2V0XG4iCisKK0RFRlVOKGNmZ19uZXRfaG9fd2luX3J4bGV2X2F2ZywgY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnX2NtZCwKKyAgICAgICJoYW5kb3ZlciB3aW5kb3cgcnhsZXYgYXZlcmFnaW5nIDwxLTEwPiIsCisJSE9fV0lOX1JYTEVWX1NUUgorCSJIb3cgbWFueSBSeExldiBtZWFzdXJlbWVudHMgYXJlIHVzZWQgZm9yIGF2ZXJhZ2luZyIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fd2luX3J4cXVhbF9hdmcsIGNmZ19uZXRfaG9fd2luX3J4cXVhbF9hdmdfY21kLAorICAgICAgImhhbmRvdmVyIHdpbmRvdyByeHF1YWwgYXZlcmFnaW5nIDwxLTEwPiIsCisJSE9fV0lOX1JYUVVBTF9TVFIKKwkiSG93IG1hbnkgUnhRdWFsIG1lYXN1cmVtZW50cyBhcmUgdXNlZCBmb3IgYXZlcmFnaW5nIikKK3sKKwlnc21uZXQtPmhhbmRvdmVyLndpbl9yeHF1YWxfYXZnID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fd2luX3J4bGV2X25laWdoX2F2ZywgY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnX25laWdoX2NtZCwKKyAgICAgICJoYW5kb3ZlciB3aW5kb3cgcnhsZXYgbmVpZ2hib3IgYXZlcmFnaW5nIDwxLTEwPiIsCisJSE9fV0lOX1JYTEVWX1NUUgorCSJIb3cgbWFueSBSeFF1YWwgbWVhc3VyZW1lbnRzIGFyZSB1c2VkIGZvciBhdmVyYWdpbmciKQoreworCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3B3cl9pbnRlcnZhbCwgY2ZnX25ldF9ob19wd3JfaW50ZXJ2YWxfY21kLAorICAgICAgImhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBpbnRlcnZhbCA8MS05OT4iLAorCUhPX1BCVURHRVRfU1RSCisJIkhvdyBvZnRlbiB0byBjaGVjayBpZiB3ZSBoYXZlIGEgYmV0dGVyIGNlbGwgKFNBQ0NIIGZyYW1lcykiKQoreworCWdzbW5ldC0+aGFuZG92ZXIucHdyX2ludGVydmFsID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fcHdyX2h5c3RlcmVzaXMsIGNmZ19uZXRfaG9fcHdyX2h5c3RlcmVzaXNfY21kLAorICAgICAgImhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBoeXN0ZXJlc2lzIDwwLTk5OT4iLAorCUhPX1BCVURHRVRfU1RSCisJIkhvdyBtYW55IGRCIGRvZXMgYSBuZWlnaGJvciB0byBiZSBzdHJvbmdlciB0byBiZWNvbWUgYSBITyBjYW5kaWRhdGUiKQoreworCWdzbW5ldC0+aGFuZG92ZXIucHdyX2h5c3RlcmVzaXMgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9ob19tYXhfZGlzdGFuY2UsIGNmZ19uZXRfaG9fbWF4X2Rpc3RhbmNlX2NtZCwKKyAgICAgICJoYW5kb3ZlciBtYXhpbXVtIGRpc3RhbmNlIDwwLTk5OTk+IiwKKwlIQU5ET1ZFUl9TVFIKKwkiSG93IGJpZyBpcyB0aGUgbWF4aW11bSB0aW1pbmcgYWR2YW5jZSBiZWZvcmUgSE8gaXMgZm9yY2VkIikKK3sKKwlnc21uZXQtPmhhbmRvdmVyLm1heF9kaXN0YW5jZSA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIERFQ0xBUkVfVElNRVIobnVtYmVyLCBkb2MpIFwKKyAgICBERUZVTihjZmdfbmV0X1QjI251bWJlciwJCQkJCVwKKyAgICAgIGNmZ19uZXRfVCMjbnVtYmVyIyNfY21kLAkJCQkJXAorICAgICAgInRpbWVyIHQiICNudW1iZXIgICIgPDAtNjU1MzU+IiwJCQkJXAorICAgICAgIkNvbmZpZ3VyZSBHU00gVGltZXJzXG4iCQkJCQlcCisgICAgICBkb2MpCQkJCQkJCVwKK3sJCQkJCQkJCVwKKwlpbnQgdmFsdWUgPSBhdG9pKGFyZ3ZbMF0pOwkJCQlcCisJCQkJCQkJCVwKKwlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNjU1MzUpIHsJCQlcCisJCXZ0eV9vdXQodnR5LCAiVGltZXIgdmFsdWUgJXMgb3V0IG9mIHJhbmdlLiVzIiwJXAorCQkgICAgICAgIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsJCQlcCisJCXJldHVybiBDTURfV0FSTklORzsJCQkJXAorCX0JCQkJCQkJXAorCQkJCQkJCQlcCisJZ3NtbmV0LT5UIyNudW1iZXIgPSB2YWx1ZTsJCQkJXAorCXJldHVybiBDTURfU1VDQ0VTUzsJCQkJCVwKK30KKworREVDTEFSRV9USU1FUigzMTAxLCAiU2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBJTU1FRElBVEUgQVNTSUdOTUVOVC4iKQorREVDTEFSRV9USU1FUigzMTAzLCAiU2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBIQU5ET1ZFUi4iKQorREVDTEFSRV9USU1FUigzMTA1LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMDcsICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzEwOSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTExLCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTMsICJTZXQgdGhlIHRpbWUgdG8gdHJ5IHBhZ2luZyBhIHN1YnNjcmliZXIuIikKK0RFQ0xBUkVfVElNRVIoMzExNSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTE3LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTksICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzE0MSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorCisKKy8qIHBlci1CVFMgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX2J0cywKKyAgICAgIGNmZ19idHNfY21kLAorICAgICAgImJ0cyBCVFNfTlIiLAorICAgICAgIlNlbGVjdCBhIEJUUyB0byBjb25maWd1cmVcbiIKKwkiQlRTIE51bWJlclxuIikKK3sKKwlpbnQgYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJaWYgKGJ0c19uciA+IGdzbW5ldC0+bnVtX2J0cykgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFRoZSBuZXh0IHVudXNlZCBCVFMgbnVtYmVyIGlzICV1JXMiLAorCQkJZ3NtbmV0LT5udW1fYnRzLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9IGVsc2UgaWYgKGJ0c19uciA9PSBnc21uZXQtPm51bV9idHMpIHsKKwkJLyogYWxsb2NhdGUgYSBuZXcgb25lICovCisJCWJ0cyA9IGdzbV9idHNfYWxsb2MoZ3NtbmV0LCBHU01fQlRTX1RZUEVfVU5LTk9XTiwKKwkJCQkgICAgSEFSRENPREVEX1RTQywgSEFSRENPREVEX0JTSUMpOworCX0gZWxzZQorCQlidHMgPSBnc21fYnRzX251bShnc21uZXQsIGJ0c19ucik7CisKKwlpZiAoIWJ0cykgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFVuYWJsZSB0byBhbGxvY2F0ZSBCVFMgJXUlcyIsCisJCQlnc21uZXQtPm51bV9idHMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXZ0eS0+aW5kZXggPSBidHM7CisJdnR5LT5ub2RlID0gQlRTX05PREU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfdHlwZSwKKyAgICAgIGNmZ19idHNfdHlwZV9jbWQsCisgICAgICAidHlwZSBUWVBFIiwKKyAgICAgICJTZXQgdGhlIEJUUyB0eXBlXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCByYzsKKworCXJjID0gZ3NtX3NldF9idHNfdHlwZShidHMsIHBhcnNlX2J0c3R5cGUoYXJndlswXSkpOworCWlmIChyYyA8IDApCisJCXJldHVybiBDTURfV0FSTklORzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19iYW5kLAorICAgICAgY2ZnX2J0c19iYW5kX2NtZCwKKyAgICAgICJiYW5kIEJBTkQiLAorICAgICAgIlNldCB0aGUgZnJlcXVlbmN5IGJhbmQgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGJhbmQgPSBnc21fYmFuZF9wYXJzZShhcmd2WzBdKTsKKworCWlmIChiYW5kIDwgMCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEJBTkQgJWQgaXMgbm90IGEgdmFsaWQgR1NNIGJhbmQlcyIsCisJCQliYW5kLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmJhbmQgPSBiYW5kOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2NpLAorICAgICAgY2ZnX2J0c19jaV9jbWQsCisgICAgICAiY2VsbF9pZGVudGl0eSA8MC02NTUzNT4iLAorICAgICAgIlNldCB0aGUgQ2VsbCBpZGVudGl0eSBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgY2kgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGNpIDwgMCB8fCBjaSA+IDB4ZmZmZikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIENJICVkIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtNjU1MzUpJXMiLAorCQkJY2ksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlidHMtPmNlbGxfaWRlbnRpdHkgPSBjaTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19sYWMsCisgICAgICBjZmdfYnRzX2xhY19jbWQsCisgICAgICAibG9jYXRpb25fYXJlYV9jb2RlIDwwLTY1NTM1PiIsCisgICAgICAiU2V0IHRoZSBMb2NhdGlvbiBBcmVhIENvZGUgKExBQykgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGxhYyA9IGF0b2koYXJndlswXSk7CisKKwlpZiAobGFjIDwgMCB8fCBsYWMgPiAweGZmZmYpIHsKKwkJdnR5X291dCh2dHksICIlJSBMQUMgJWQgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSAoMC02NTUzNSklcyIsCisJCQlsYWMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChsYWMgPT0gR1NNX0xBQ19SRVNFUlZFRF9ERVRBQ0hFRCB8fCBsYWMgPT0gR1NNX0xBQ19SRVNFUlZFRF9BTExfQlRTKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTEFDICVkIGlzIHJlc2VydmVkIGJ5IEdTTSAwNC4wOCVzIiwKKwkJCWxhYywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUgPSBsYWM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX2J0c190c2MsCisgICAgICBjZmdfYnRzX3RzY19jbWQsCisgICAgICAidHJhaW5pbmdfc2VxdWVuY2VfY29kZSA8MC0yNTU+IiwKKyAgICAgICJTZXQgdGhlIFRyYWluaW5nIFNlcXVlbmNlIENvZGUgKFRTQykgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHRzYyA9IGF0b2koYXJndlswXSk7CisKKwlpZiAodHNjIDwgMCB8fCB0c2MgPiAweGZmKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgVFNDICVkIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtMjU1KSVzIiwKKwkJCXRzYywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWJ0cy0+dHNjID0gdHNjOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2JzaWMsCisgICAgICBjZmdfYnRzX2JzaWNfY21kLAorICAgICAgImJhc2Vfc3RhdGlvbl9pZF9jb2RlIDwwLTYzPiIsCisgICAgICAiU2V0IHRoZSBCYXNlIFN0YXRpb24gSWRlbnRpdHkgQ29kZSAoQlNJQykgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGJzaWMgPSBhdG9pKGFyZ3ZbMF0pOworCisJaWYgKGJzaWMgPCAwIHx8IGJzaWMgPiAweDNmKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQlNJQyAlZCBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlICgwLTI1NSklcyIsCisJCQlic2ljLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJYnRzLT5ic2ljID0gYnNpYzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfYnRzX3VuaXRfaWQsCisgICAgICBjZmdfYnRzX3VuaXRfaWRfY21kLAorICAgICAgImlwLmFjY2VzcyB1bml0X2lkIDwwLTY1NTM0PiA8MC0yNTU+IiwKKyAgICAgICJTZXQgdGhlIGlwLmFjY2VzcyBCVFMgVW5pdCBJRCBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgc2l0ZV9pZCA9IGF0b2koYXJndlswXSk7CisJaW50IGJ0c19pZCA9IGF0b2koYXJndlsxXSk7CisKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQlRTIGlzIG5vdCBvZiBpcC5hY2Nlc3MgdHlwZSVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCA9IHNpdGVfaWQ7CisJYnRzLT5pcF9hY2Nlc3MuYnRzX2lkID0gYnRzX2lkOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIE9NTF9TVFIJIk9yZ2FuaXphdGlvbiAmIE1haW50ZW5hbmNlIExpbmtcbiIKKyNkZWZpbmUgSVBBX1NUUiAiaXAuYWNjZXNzIFNwZWNpZmljIE9wdGlvbnNcbiIKKworREVGVU4oY2ZnX2J0c19zdHJlYW1faWQsCisgICAgICBjZmdfYnRzX3N0cmVhbV9pZF9jbWQsCisgICAgICAib21sIGlwLmFjY2VzcyBzdHJlYW1faWQgPDAtMjU1PiIsCisJT01MX1NUUiBJUEFfU1RSCisgICAgICAiU2V0IHRoZSBpcC5hY2Nlc3MgU3RyZWFtIElEIG9mIHRoZSBPTUwgbGluayBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgc3RyZWFtX2lkID0gYXRvaShhcmd2WzBdKTsKKworCWlmICghaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJdnR5X291dCh2dHksICIlJSBCVFMgaXMgbm90IG9mIGlwLmFjY2VzcyB0eXBlJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPm9tbF90ZWkgPSBzdHJlYW1faWQ7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgT01MX0UxX1NUUiBPTUxfU1RSICJFMSBMaW5lXG4iCisKK0RFRlVOKGNmZ19idHNfb21sX2UxLAorICAgICAgY2ZnX2J0c19vbWxfZTFfY21kLAorICAgICAgIm9tbCBlMSBsaW5lIEUxX0xJTkUgdGltZXNsb3QgPDEtMzE+IHN1Yi1zbG90ICgwfDF8MnwzfGZ1bGwpIiwKKwlPTUxfRTFfU1RSCisgICAgICAiRTEgaW50ZXJmYWNlIHRvIGJlIHVzZWQgZm9yIE9NTFxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCXBhcnNlX2UxX2xpbmsoJmJ0cy0+b21sX2UxX2xpbmssIGFyZ3ZbMF0sIGFyZ3ZbMV0sIGFyZ3ZbMl0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfb21sX2UxX3RlaSwKKyAgICAgIGNmZ19idHNfb21sX2UxX3RlaV9jbWQsCisgICAgICAib21sIGUxIHRlaSA8MC02Mz4iLAorCU9NTF9FMV9TVFIKKyAgICAgICJTZXQgdGhlIFRFSSB0byBiZSB1c2VkIGZvciBPTUwiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5vbWxfdGVpID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19jaGFsbG9jLCBjZmdfYnRzX2NoYWxsb2NfY21kLAorICAgICAgImNoYW5uZWwgYWxsb2NhdG9yIChhc2NlbmRpbmd8ZGVzY2VuZGluZykiLAorCSJDaGFubm5lbCBBbGxvY2F0b3JcbiIgIkNoYW5uZWwgQWxsb2NhdG9yXG4iCisJIkFsbG9jYXRlIFRpbWVzbG90cyBhbmQgVHJhbnNjZWl2ZXJzIGluIGFzY2VuZGluZyBvcmRlclxuIgorCSJBbGxvY2F0ZSBUaW1lc2xvdHMgYW5kIFRyYW5zY2VpdmVycyBpbiBkZXNjZW5kaW5nIG9yZGVyXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJaWYgKCFzdHJjbXAoYXJndlswXSwgImFzY2VuZGluZyIpKQorCQlidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSA9IDA7CisJZWxzZQorCQlidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSA9IDE7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgUkFDSF9TVFIgIlJhbmRvbSBBY2Nlc3MgQ29udHJvbCBDaGFubmVsXG4iCisKK0RFRlVOKGNmZ19idHNfcmFjaF90eF9pbnRlZ2VyLAorICAgICAgY2ZnX2J0c19yYWNoX3R4X2ludGVnZXJfY21kLAorICAgICAgInJhY2ggdHggaW50ZWdlciA8MC0xNT4iLAorCVJBQ0hfU1RSCisgICAgICAiU2V0IHRoZSByYXcgdHggaW50ZWdlciB2YWx1ZSBpbiBSQUNIIENvbnRyb2wgcGFyYW1ldGVycyBJRSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnR4X2ludGVnZXIgPSBhdG9pKGFyZ3ZbMF0pICYgMHhmOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19yYWNoX21heF90cmFucywKKyAgICAgIGNmZ19idHNfcmFjaF9tYXhfdHJhbnNfY21kLAorICAgICAgInJhY2ggbWF4IHRyYW5zbWlzc2lvbiAoMXwyfDR8NykiLAorCVJBQ0hfU1RSCisgICAgICAiU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBSQUNIIGJ1cnN0IHRyYW5zbWlzc2lvbnMiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5tYXhfdHJhbnMgPSByYWNoX21heF90cmFuc192YWwycmF3KGF0b2koYXJndlswXSkpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2RlZmluZSBOTV9TVFIgIk5ldHdvcmsgTWFuYWdlbWVudFxuIgorCitERUZVTihjZmdfYnRzX3JhY2hfbm1fYl90aHJlc2gsCisgICAgICBjZmdfYnRzX3JhY2hfbm1fYl90aHJlc2hfY21kLAorICAgICAgInJhY2ggbm0gYnVzeSB0aHJlc2hvbGQgPDAtMjU1PiIsCisJUkFDSF9TVFIgTk1fU1RSCisgICAgICAiU2V0IHRoZSBOTSBCdXN5IFRocmVzaG9sZCBpbiBkQiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJYnRzLT5yYWNoX2JfdGhyZXNoID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfcmFjaF9ubV9sZGF2ZywKKyAgICAgIGNmZ19idHNfcmFjaF9ubV9sZGF2Z19jbWQsCisgICAgICAicmFjaCBubSBsb2FkIGF2ZXJhZ2UgPDAtNjU1MzU+IiwKKwlSQUNIX1NUUiBOTV9TVFIKKyAgICAgICJTZXQgdGhlIE5NIExvYWRhdmVyYWdlIFNsb3RzIHZhbHVlIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlidHMtPnJhY2hfbGRhdmdfc2xvdHMgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19jZWxsX2JhcnJlZCwgY2ZnX2J0c19jZWxsX2JhcnJlZF9jbWQsCisgICAgICAiY2VsbCBiYXJyZWQgKDB8MSkiLAorICAgICAgIlNob3VsZCB0aGlzIGNlbGwgYmUgYmFycmVkIGZyb20gYWNjZXNzPyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wuY2VsbF9iYXIgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX21zX21heF9wb3dlciwgY2ZnX2J0c19tc19tYXhfcG93ZXJfY21kLAorICAgICAgIm1zIG1heCBwb3dlciA8MC00MD4iLAorICAgICAgIk1heGltdW0gdHJhbnNtaXQgcG93ZXIgb2YgdGhlIE1TIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+bXNfbWF4X3Bvd2VyID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19jZWxsX3Jlc2VsX2h5c3QsIGNmZ19idHNfY2VsbF9yZXNlbF9oeXN0X2NtZCwKKyAgICAgICJjZWxsIHJlc2VsZWN0aW9uIGh5c3RlcmVzaXMgPDAtMTQ+IiwKKyAgICAgICJDZWxsIFJlLVNlbGVjdGlvbiBIeXN0ZXJlc2lzIGluIGRCIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5jZWxsX3Jlc2VsX2h5c3QgPSBhdG9pKGFyZ3ZbMF0pLzI7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfcnhsZXZfYWNjX21pbiwgY2ZnX2J0c19yeGxldl9hY2NfbWluX2NtZCwKKyAgICAgICJyeGxldiBhY2Nlc3MgbWluIDwwLTYzPiIsCisgICAgICAiTWluaW11bSBSeExldiBuZWVkZWQgZm9yIGNlbGwgYWNjZXNzIChiZXR0ZXIgdGhhbiAtMTEwZEJtKSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIucnhsZXZfYWNjX21pbiA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfcGVyX2xvY191cGQsIGNmZ19idHNfcGVyX2xvY191cGRfY21kLAorICAgICAgInBlcmlvZGljIGxvY2F0aW9uIHVwZGF0ZSA8MC0xNTMwPiIsCisgICAgICAiUGVyaW9kaWMgTG9jYXRpb24gVXBkYXRpbmcgSW50ZXJ2YWwgaW4gTWludXRlcyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MudDMyMTIgPSBhdG9pKGFyZ3ZbMF0pIC8gMTA7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgR1BSU19URVhUCSJHUFJTIFBhY2tldCBOZXR3b3JrXG4iCisKK0RFRlVOKGNmZ19idHNfcHJzX2J2Y2ksIGNmZ19idHNfZ3Byc19idmNpX2NtZCwKKwkiZ3BycyBjZWxsIGJ2Y2kgPDItNjU1MzU+IiwKKwlHUFJTX1RFWFQKKwkiR1BSUyBDZWxsIFNldHRpbmdzXG4iCisJIkdQUlMgQlNTR1AgVkMgSWRlbnRpZmllciIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+Z3Bycy5jZWxsLmJ2Y2kgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfbnNlaSwgY2ZnX2J0c19ncHJzX25zZWlfY21kLAorCSJncHJzIG5zZWkgPDAtNjU1MzU+IiwKKwlHUFJTX1RFWFQKKwkiR1BSUyBOUyBFbnRpdHkgSWRlbnRpZmllciIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+Z3Bycy5uc2UubnNlaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgTlNWQ19URVhUICJOZXR3b3JrIFNlcnZpY2UgVmlydHVhbCBDb25uZWN0aW9uIChOUy1WQylcbiIgXAorCQkiTlNWQyBMb2dpY2FsIE51bWJlclxuIgorCitERUZVTihjZmdfYnRzX2dwcnNfbnN2Y2ksIGNmZ19idHNfZ3Byc19uc3ZjaV9jbWQsCisJImdwcnMgbnN2YyA8MC0xPiBuc3ZjaSA8MC02NTUzNT4iLAorCUdQUlNfVEVYVCBOU1ZDX1RFWFQKKwkiTlMgVmlydHVhbCBDb25uZWN0aW9uIElkZW50aWZpZXJcbiIKKwkiR1BSUyBOUyBWQyBJZGVudGlmaWVyIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zdmNbaWR4XS5uc3ZjaSA9IGF0b2koYXJndlsxXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjX2xwb3J0LCBjZmdfYnRzX2dwcnNfbnN2Y19scG9ydF9jbWQsCisJImdwcnMgbnN2YyA8MC0xPiBsb2NhbCB1ZHAgcG9ydCA8MC02NTUzNT4iLAorCUdQUlNfVEVYVCBOU1ZDX1RFWFQKKwkiR1BSUyBOUyBMb2NhbCBVRFAgUG9ydCIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGlkeCA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+Z3Bycy5uc3ZjW2lkeF0ubG9jYWxfcG9ydCA9IGF0b2koYXJndlsxXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjX3Jwb3J0LCBjZmdfYnRzX2dwcnNfbnN2Y19ycG9ydF9jbWQsCisJImdwcnMgbnN2YyA8MC0xPiByZW1vdGUgdWRwIHBvcnQgPDAtNjU1MzU+IiwKKwlHUFJTX1RFWFQgTlNWQ19URVhUCisJIkdQUlMgTlMgUmVtb3RlIFVEUCBQb3J0IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChidHMtPmdwcnMubW9kZSA9PSBCVFNfR1BSU19OT05FKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zdmNbaWR4XS5yZW1vdGVfcG9ydCA9IGF0b2koYXJndlsxXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjX3JpcCwgY2ZnX2J0c19ncHJzX25zdmNfcmlwX2NtZCwKKwkiZ3BycyBuc3ZjIDwwLTE+IHJlbW90ZSBpcCBBLkIuQy5EIiwKKwlHUFJTX1RFWFQgTlNWQ19URVhUCisJIkdQUlMgTlMgUmVtb3RlIElQIEFkZHJlc3MiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBpZHggPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBpbl9hZGRyIGlhOworCisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpbmV0X2F0b24oYXJndlsxXSwgJmlhKTsKKwlidHMtPmdwcnMubnN2Y1tpZHhdLnJlbW90ZV9pcCA9IG50b2hsKGlhLnNfYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc190aW1lciwgY2ZnX2J0c19ncHJzX25zX3RpbWVyX2NtZCwKKwkiZ3BycyBucyB0aW1lciAiIE5TX1RJTUVSUyAiIDwwLTI1NT4iLAorCUdQUlNfVEVYVCAiTmV0d29yayBTZXJ2aWNlXG4iCisJIk5ldHdvcmsgU2VydmljZSBUaW1lclxuIgorCU5TX1RJTUVSU19IRUxQICJUaW1lciBWYWx1ZVxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gZ2V0X3N0cmluZ192YWx1ZShncHJzX25zX3RpbWVyX3N0cnMsIGFyZ3ZbMF0pOworCWludCB2YWwgPSBhdG9pKGFyZ3ZbMV0pOworCisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaWR4IDwgMCB8fCBpZHggPj0gQVJSQVlfU0laRShidHMtPmdwcnMubnNlLnRpbWVyKSkKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJYnRzLT5ncHJzLm5zZS50aW1lcltpZHhdID0gdmFsOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIEJTU0dQX1RJTUVSUyAiKGJsb2NraW5nLXRpbWVyfGJsb2NraW5nLXJldHJpZXN8dW5ibG9ja2luZy1yZXRyaWVzfHJlc2V0LXRpbWVyfHJlc2V0LXJldHJpZXN8c3VzcGVuZC10aW1lcnxzdXNwZW5kLXJldHJpZXN8cmVzdW1lLXRpbWVyfHJlc3VtZS1yZXRyaWVzfGNhcGFiaWxpdHktdXBkYXRlLXRpbWVyfGNhcGFiaWxpdHktdXBkYXRlLXJldHJpZXMpIgorI2RlZmluZSBCU1NHUF9USU1FUlNfSEVMUAkiIgorCitERUZVTihjZmdfYnRzX2dwcnNfY2VsbF90aW1lciwgY2ZnX2J0c19ncHJzX2NlbGxfdGltZXJfY21kLAorCSJncHJzIGNlbGwgdGltZXIgIiBCU1NHUF9USU1FUlMgIiA8MC0yNTU+IiwKKwlHUFJTX1RFWFQgIkNlbGwgLyBCU1NHUFxuIgorCSJDZWxsL0JTU0dQIFRpbWVyXG4iCisJQlNTR1BfVElNRVJTX0hFTFAgIlRpbWVyIFZhbHVlXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBpZHggPSBnZXRfc3RyaW5nX3ZhbHVlKGdwcnNfYnNzZ3BfY2ZnX3N0cnMsIGFyZ3ZbMF0pOworCWludCB2YWwgPSBhdG9pKGFyZ3ZbMV0pOworCisJaWYgKGJ0cy0+Z3Bycy5tb2RlID09IEJUU19HUFJTX05PTkUpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaWR4IDwgMCB8fCBpZHggPj0gQVJSQVlfU0laRShidHMtPmdwcnMuY2VsbC50aW1lcikpCisJCXJldHVybiBDTURfV0FSTklORzsKKworCWJ0cy0+Z3Bycy5jZWxsLnRpbWVyW2lkeF0gPSB2YWw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19yYWMsIGNmZ19idHNfZ3Byc19yYWNfY21kLAorCSJncHJzIHJvdXRpbmcgYXJlYSA8MC0yNTU+IiwKKwlHUFJTX1RFWFQKKwkiR1BSUyBSb3V0aW5nIEFyZWEgQ29kZSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoYnRzLT5ncHJzLm1vZGUgPT0gQlRTX0dQUlNfTk9ORSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEdQUlMgbm90IGVuYWJsZWQgb24gdGhpcyBCVFMlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+Z3Bycy5yYWMgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfbW9kZSwgY2ZnX2J0c19ncHJzX21vZGVfY21kLAorCSJncHJzIG1vZGUgKG5vbmV8Z3Byc3xlZ3BycykiLAorCUdQUlNfVEVYVAorCSJHUFJTIE1vZGUgZm9yIHRoaXMgQlRTXG4iCisJIkdQUlMgRGlzYWJsZWQgb24gdGhpcyBCVFNcbiIKKwkiR1BSUyBFbmFibGVkIG9uIHRoaXMgQlRTXG4iCisJIkVHUFJTIChFREdFKSBFbmFibGVkIG9uIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5ncHJzLm1vZGUgPSBidHNfZ3Byc19tb2RlX3BhcnNlKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIFRSWF9URVhUICJSYWRpbyBUcmFuc2NlaXZlclxuIgorCisvKiBwZXIgVFJYIGNvbmZpZ3VyYXRpb24gKi8KK0RFRlVOKGNmZ190cngsCisgICAgICBjZmdfdHJ4X2NtZCwKKyAgICAgICJ0cnggVFJYX05SIiwKKwlUUlhfVEVYVAorICAgICAgIlNlbGVjdCBhIFRSWCB0byBjb25maWd1cmUiKQoreworCWludCB0cnhfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJaWYgKHRyeF9uciA+IGJ0cy0+bnVtX3RyeCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFRoZSBuZXh0IHVudXNlZCBUUlggbnVtYmVyIGluIHRoaXMgQlRTIGlzICV1JXMiLAorCQkJYnRzLT5udW1fdHJ4LCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9IGVsc2UgaWYgKHRyeF9uciA9PSBidHMtPm51bV90cngpIHsKKwkJLyogd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KKwkJdHJ4ID0gZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKwl9IGVsc2UKKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKworCWlmICghdHJ4KQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwl2dHktPmluZGV4ID0gdHJ4OworCXZ0eS0+bm9kZSA9IFRSWF9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X2FyZmNuLAorICAgICAgY2ZnX3RyeF9hcmZjbl9jbWQsCisgICAgICAiYXJmY24gPDEtMTAyND4iLAorICAgICAgIlNldCB0aGUgQVJGQ04gZm9yIHRoaXMgVFJYXG4iKQoreworCWludCBhcmZjbiA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCisJLyogRklYTUU6IGNoZWNrIGlmIHRoaXMgQVJGQ04gaXMgc3VwcG9ydGVkIGJ5IHRoaXMgVFJYICovCisKKwl0cngtPmFyZmNuID0gYXJmY247CisKKwkvKiBGSVhNRTogcGF0Y2ggQVJGQ04gaW50byBTWVNURU0gSU5GT1JNQVRJT04gKi8KKwkvKiBGSVhNRTogdXNlIE9NTCBsYXllciB0byB1cGRhdGUgdGhlIEFSRkNOICovCisJLyogRklYTUU6IHVzZSBSU0wgbGF5ZXIgdG8gdXBkYXRlIFNZU1RFTSBJTkZPUk1BVElPTiAqLworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X25vbWluYWxfcG93ZXIsCisgICAgICBjZmdfdHJ4X25vbWluYWxfcG93ZXJfY21kLAorICAgICAgIm5vbWluYWwgcG93ZXIgPDAtMTAwPiIsCisgICAgICAiTm9taW5hbCBUUlggUkYgUG93ZXIgaW4gZEJcbiIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCisJdHJ4LT5ub21pbmFsX3Bvd2VyID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9tYXhfcG93ZXJfcmVkLAorICAgICAgY2ZnX3RyeF9tYXhfcG93ZXJfcmVkX2NtZCwKKyAgICAgICJtYXhfcG93ZXJfcmVkIDwwLTEwMD4iLAorICAgICAgIlJlZHVjdGlvbiBvZiBtYXhpbXVtIEJTIFJGIFBvd2VyIGluIGRCXG4iKQoreworCWludCBtYXhwd3JfciA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCWludCB1cHBlcl9saW1pdCA9IDI0OwkvKiBkZWZhdWx0IDEyLjIxIG1heCBwb3dlciByZWQuICovCisKKwkvKiBGSVhNRTogY2hlY2sgaWYgb3VyIEJUUyB0eXBlIHN1cHBvcnRzIG1vcmUgdGhhbiAxMiAqLworCWlmIChtYXhwd3JfciA8IDAgfHwgbWF4cHdyX3IgPiB1cHBlcl9saW1pdCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFBvd2VyICVkIGRCIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UlcyIsCisJCQltYXhwd3JfciwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWlmIChtYXhwd3JfciAmIDEpIHsKKwkJdnR5X291dCh2dHksICIlJSBQb3dlciAlZCBkQiBpcyBub3QgYW4gZXZlbiB2YWx1ZSVzIiwKKwkJCW1heHB3cl9yLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwl0cngtPm1heF9wb3dlcl9yZWQgPSBtYXhwd3JfcjsKKworCS8qIEZJWE1FOiBtYWtlIHN1cmUgd2UgdXBkYXRlIHRoaXMgdXNpbmcgT01MICovCisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfcnNsX2UxLAorICAgICAgY2ZnX3RyeF9yc2xfZTFfY21kLAorICAgICAgInJzbCBlMSBsaW5lIEUxX0xJTkUgdGltZXNsb3QgPDEtMzE+IHN1Yi1zbG90ICgwfDF8MnwzfGZ1bGwpIiwKKyAgICAgICJFMSBpbnRlcmZhY2UgdG8gYmUgdXNlZCBmb3IgUlNMXG4iKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCXBhcnNlX2UxX2xpbmsoJnRyeC0+cnNsX2UxX2xpbmssIGFyZ3ZbMF0sIGFyZ3ZbMV0sIGFyZ3ZbMl0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X3JzbF9lMV90ZWksCisgICAgICBjZmdfdHJ4X3JzbF9lMV90ZWlfY21kLAorICAgICAgInJzbCBlMSB0ZWkgPDAtNjM+IiwKKyAgICAgICJTZXQgdGhlIFRFSSB0byBiZSB1c2VkIGZvciBSU0wiKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCXRyeC0+cnNsX3RlaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfcmZfbG9ja2VkLAorICAgICAgY2ZnX3RyeF9yZl9sb2NrZWRfY21kLAorICAgICAgInJmX2xvY2tlZCAoMHwxKSIsCisgICAgICAiVHVybiBvZmYgUkYgb2YgdGhlIFRSWC5cbiIpCit7CisJaW50IGxvY2tlZCA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCisJZ3NtX3RyeF9sb2NrX3JmKHRyeCwgbG9ja2VkKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHBlciBUUyBjb25maWd1cmF0aW9uICovCitERUZVTihjZmdfdHMsCisgICAgICBjZmdfdHNfY21kLAorICAgICAgInRpbWVzbG90IDwwLTc+IiwKKyAgICAgICJTZWxlY3QgYSBUaW1lc2xvdCB0byBjb25maWd1cmUiKQoreworCWludCB0c19uciA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisKKwlpZiAodHNfbnIgPj0gVFJYX05SX1RTKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQSBHU00gVFJYIG9ubHkgaGFzICV1IFRpbWVzbG90cyBwZXIgVFJYJXMiLAorCQkJVFJYX05SX1RTLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwl0cyA9ICZ0cngtPnRzW3RzX25yXTsKKworCXZ0eS0+aW5kZXggPSB0czsKKwl2dHktPm5vZGUgPSBUU19OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHNfcGNoYW4sCisgICAgICBjZmdfdHNfcGNoYW5fY21kLAorICAgICAgInBoeXNfY2hhbl9jb25maWcgUENIQU4iLAorICAgICAgIlBoeXNpY2FsIENoYW5uZWwgY29uZmlndXJhdGlvbiAoVENIL1NEQ0NILy4uLikiKQoreworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSB2dHktPmluZGV4OworCWludCBwY2hhbmM7CisKKwlwY2hhbmMgPSBnc21fcGNoYW5fcGFyc2UoYXJndlswXSk7CisJaWYgKHBjaGFuYyA8IDApCisJCXJldHVybiBDTURfV0FSTklORzsKKworCXRzLT5wY2hhbiA9IHBjaGFuYzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RzX2UxX3N1YnNsb3QsCisgICAgICBjZmdfdHNfZTFfc3Vic2xvdF9jbWQsCisgICAgICAiZTEgbGluZSBFMV9MSU5FIHRpbWVzbG90IDwxLTMxPiBzdWItc2xvdCAoMHwxfDJ8M3xmdWxsKSIsCisgICAgICAiRTEgc3ViLXNsb3QgY29ubmVjdGVkIHRvIHRoaXMgb24tYWlyIHRpbWVzbG90IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKKworCXBhcnNlX2UxX2xpbmsoJnRzLT5lMV9saW5rLCBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworZXh0ZXJuIGludCBic2NfdnR5X2luaXRfZXh0cmEoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitpbnQgYnNjX3Z0eV9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCWdzbW5ldCA9IG5ldDsKKworCWNtZF9pbml0KDEpOworCXZ0eV9pbml0KCk7CisKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfbmV0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X2J0c19jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd190cnhfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfdHNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfbGNoYW5fY21kKTsKKworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19lMWRydl9jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19lMWxpbmVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfZTF0c19jbWQpOworCisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzaG93X3BhZ2luZ19jbWQpOworCisJb3BlbmJzY192dHlfYWRkX2NtZHMoKTsKKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmNmZ19uZXRfY21kKTsKKwlpbnN0YWxsX25vZGUoJm5ldF9ub2RlLCBjb25maWdfd3JpdGVfbmV0KTsKKwlpbnN0YWxsX2RlZmF1bHQoR1NNTkVUX05PREUpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbmNjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9tbmNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25hbWVfc2hvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25hbWVfbG9uZ19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfYXV0aF9wb2xpY3lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X3JlamVjdF9jYXVzZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfZW5jcnlwdGlvbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbmVjaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfcnJscF9tb2RlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9tbV9pbmZvX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9oYW5kb3Zlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaG9fd2luX3J4bGV2X2F2Z19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaG9fd2luX3J4cXVhbF9hdmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmdfbmVpZ2hfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3B3cl9pbnRlcnZhbF9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaG9fcHdyX2h5c3RlcmVzaXNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX21heF9kaXN0YW5jZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMDFfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTAzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwNV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMDdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTA5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzExMV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTE1X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzExN19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTQxX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfYnRzX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZidHNfbm9kZSwgY29uZmlnX3dyaXRlX2J0cyk7CisJaW5zdGFsbF9kZWZhdWx0KEJUU19OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3R5cGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2JhbmRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2NpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19sYWNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3RzY19jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfYnNpY19jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfdW5pdF9pZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfc3RyZWFtX2lkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19vbWxfZTFfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX29tbF9lMV90ZWlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2NoYWxsb2NfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfdHhfaW50ZWdlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfcmFjaF9tYXhfdHJhbnNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfbm1fYl90aHJlc2hfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfbm1fbGRhdmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2NlbGxfYmFycmVkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19tc19tYXhfcG93ZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3Blcl9sb2NfdXBkX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jZWxsX3Jlc2VsX2h5c3RfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3J4bGV2X2FjY19taW5fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbW9kZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc190aW1lcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19yYWNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfYnZjaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19jZWxsX3RpbWVyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zZWlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnN2Y2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnN2Y19scG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjX3Jwb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zdmNfcmlwX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfdHJ4X2NtZCk7CisJaW5zdGFsbF9ub2RlKCZ0cnhfbm9kZSwgZHVtbXlfY29uZmlnX3dyaXRlKTsKKwlpbnN0YWxsX2RlZmF1bHQoVFJYX05PREUpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfYXJmY25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X25vbWluYWxfcG93ZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X21heF9wb3dlcl9yZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHJ4X3JzbF9lMV9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfcnNsX2UxX3RlaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfcmZfbG9ja2VkX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVFJYX05PREUsICZjZmdfdHNfY21kKTsKKwlpbnN0YWxsX25vZGUoJnRzX25vZGUsIGR1bW15X2NvbmZpZ193cml0ZSk7CisJaW5zdGFsbF9kZWZhdWx0KFRTX05PREUpOworCWluc3RhbGxfZWxlbWVudChUU19OT0RFLCAmY2ZnX3RzX3BjaGFuX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRTX05PREUsICZjZmdfdHNfZTFfc3Vic2xvdF9jbWQpOworCisJYnNjX3Z0eV9pbml0X2V4dHJhKG5ldCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfY21kcy5jIGIvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZV9jbWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1ZTEwOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfY21kcy5jCkBAIC0wLDAgKzEsMzM2IEBACisvKiBPcGVuQlNDIGxvZ2dpbmcgaGVscGVyIGZvciB0aGUgVlRZICovCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvdnR5Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dnR5L2J1ZmZlci5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIExPR0dJTkdfU1RSCSJDb25maWd1cmUgbG9nIG1lc3NhZ2UgdG8gdGhpcyB0ZXJtaW5hbFxuIgorCitzdGF0aWMgdm9pZCBfdnR5X291dHB1dChzdHJ1Y3QgbG9nX3RhcmdldCAqdGd0LCBjb25zdCBjaGFyICpsaW5lKQoreworCXN0cnVjdCB2dHkgKnZ0eSA9IHRndC0+dGd0X3Z0eS52dHk7CisJdnR5X291dCh2dHksICIlcyIsIGxpbmUpOworCS8qIFRoaXMgaXMgYW4gdWdseSBoYWNrLCBidXQgdGhlcmUgaXMgbm8gZWFzeSB3YXkuLi4gKi8KKwlpZiAoc3RyY2hyKGxpbmUsICdcbicpKQorCQl2dHlfb3V0KHZ0eSwgIlxyIik7Cit9CisKK3N0cnVjdCBsb2dfdGFyZ2V0ICpsb2dfdGFyZ2V0X2NyZWF0ZV92dHkoc3RydWN0IHZ0eSAqdnR5KQoreworCXN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQ7CisKKwl0YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZSgpOworCWlmICghdGFyZ2V0KQorCQlyZXR1cm4gTlVMTDsKKworCXRhcmdldC0+dGd0X3Z0eS52dHkgPSB2dHk7CisJdGFyZ2V0LT5vdXRwdXQgPSBfdnR5X291dHB1dDsKKwlyZXR1cm4gdGFyZ2V0OworfQorCitERUZVTihlbmFibGVfbG9nZ2luZywKKyAgICAgIGVuYWJsZV9sb2dnaW5nX2NtZCwKKyAgICAgICJsb2dnaW5nIGVuYWJsZSIsCisJTE9HR0lOR19TVFIKKyAgICAgICJFbmFibGVzIGxvZ2dpbmcgdG8gdGhpcyB2dHlcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmIChjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIGFscmVhZHkgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWNvbm4tPmRiZyA9IGxvZ190YXJnZXRfY3JlYXRlX3Z0eSh2dHkpOworCWlmICghY29ubi0+ZGJnKQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwlsb2dfYWRkX3RhcmdldChjb25uLT5kYmcpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19mbHRyX2ltc2ksCisgICAgICBsb2dnaW5nX2ZsdHJfaW1zaV9jbWQsCisgICAgICAibG9nZ2luZyBmaWx0ZXIgaW1zaSBJTVNJIiwKKwlMT0dHSU5HX1NUUgorICAgICAgIlByaW50IGFsbCBtZXNzYWdlcyByZWxhdGVkIHRvIGEgSU1TSVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWxvZ19zZXRfaW1zaV9maWx0ZXIoY29ubi0+ZGJnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfZmx0cl9hbGwsCisgICAgICBsb2dnaW5nX2ZsdHJfYWxsX2NtZCwKKyAgICAgICJsb2dnaW5nIGZpbHRlciBhbGwgPDAtMT4iLAorCUxPR0dJTkdfU1RSCisgICAgICAiUHJpbnQgYWxsIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJbG9nX3NldF9hbGxfZmlsdGVyKGNvbm4tPmRiZywgYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX3VzZV9jbHIsCisgICAgICBsb2dnaW5nX3VzZV9jbHJfY21kLAorICAgICAgImxvZ2dpbmcgY29sb3IgPDAtMT4iLAorCUxPR0dJTkdfU1RSCisgICAgICAiVXNlIGNvbG9yIGZvciBwcmludGluZyBtZXNzYWdlc1xuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWxvZ19zZXRfdXNlX2NvbG9yKGNvbm4tPmRiZywgYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX3BybnRfdGltZXN0YW1wLAorICAgICAgbG9nZ2luZ19wcm50X3RpbWVzdGFtcF9jbWQsCisgICAgICAibG9nZ2luZyB0aW1lc3RhbXAgPDAtMT4iLAorCUxPR0dJTkdfU1RSCisgICAgICAiUHJpbnQgdGhlIHRpbWVzdGFtcCBvZiBlYWNoIG1lc3NhZ2VcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfc2V0X3ByaW50X3RpbWVzdGFtcChjb25uLT5kYmcsIGF0b2koYXJndlswXSkpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRklYTUU6IHRob3NlIGhhdmUgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGxvZyBsZXZlbHMgYW5kIGNhdGVnb3JpZXMgKi8KKyNkZWZpbmUgVlRZX0RFQlVHX0NBVEVHT1JJRVMgIihybGx8Y2N8bW18cnJ8cnNsfG5tfHNtc3xwYWd8bW5jY3xpbnB8bWl8bWlifG11eHxtZWFzfHNjY3B8bXNjfG1nY3B8aG98ZGJ8cmVmfGdwcnN8bnN8YnNzZ3B8YWxsKSIKKyNkZWZpbmUgQ0FURUdPUklFU19IRUxQCVwKKwkiQS1iaXMgUmFkaW8gTGluayBMYXllciAoUkxMKVxuIgkJCVwKKwkiTGF5ZXIzIENhbGwgQ29udHJvbCAoQ0MpXG4iCQkJCVwKKwkiTGF5ZXIzIE1vYmlsaXR5IE1hbmFnZW1lbnQgKE1NKVxuIgkJCVwKKwkiTGF5ZXIzIFJhZGlvIFJlc291cmNlIChSUilcbiIJCQkJXAorCSJBLWJpcyBSYWRpbyBTaWduYWxsaW5nIExpbmsgKFJTTClcbiIJCQlcCisJIkEtYmlzIE5ldHdvcmsgTWFuYWdlbWVudCAvIE8mTSAoTk0vT01MKVxuIgkJXAorCSJMYXllcjMgU2hvcnQgTWVzc2FnYWdpbmcgU2VydmljZSAoU01TKVxuIgkJXAorCSJQYWdpbmcgU3Vic3lzdGVtXG4iCQkJCQlcCisJIk1OQ0MgQVBJIGZvciBDYWxsIENvbnRyb2wgYXBwbGljYXRpb25cbiIJCVwKKwkiQS1iaXMgSW5wdXQgU3Vic3lzdGVtXG4iCQkJCVwKKwkiQS1iaXMgSW5wdXQgRHJpdmVyIGZvciBTaWduYWxsaW5nXG4iCQkJXAorCSJBLWJpcyBJbnB1dCBEcml2ZXIgZm9yIEItQ2hhbm5lbCAodm9pY2UgZGF0YSlcbiIJXAorCSJBLWJpcyBCLUNoYW5uZWwgLyBTdWItY2hhbm5lbCBNdWx0aXBsZXhlclxuIgkJXAorCSJSYWRpbyBNZWFzdXJlbWVudHNcbiIJCQkJCVwKKwkiU0NDUFxuIgkJCQkJCVwKKwkiTW9iaWxlIFN3aXRjaGluZyBDZW50ZXJcbiIJCQkJXAorCSJNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2xcbiIJCQlcCisJIkhhbmQtb3ZlclxuIgkJCQkJCVwKKwkiRGF0YWJhc2UgTGF5ZXJcbiIJCQkJCVwKKwkiUmVmZXJlbmNlIENvdW50aW5nXG4iCQkJCQlcCisJIkdQUlMgQ29yZVxuIgkJCQkJCVwKKwkiR1BSUyBOZXR3b3JrIFNlcnZpY2UgKE5TKVxuIgkJCQlcCisJIkdQUlMgQlNTIEdhdGV3YXkgUHJvdG9jb2wgKEJTU0dQKVxuIgkJCVwKKwkiR2xvYmFsIHNldHRpbmcgZm9yIGFsbCBzdWJzeXRlbXNcbiIKKworI2RlZmluZSBWVFlfREVCVUdfTEVWRUxTICIoZXZlcnl0aGluZ3xkZWJ1Z3xpbmZvfG5vdGljZXxlcnJvcnxmYXRhbCkiCisjZGVmaW5lIExFVkVMU19IRUxQCVwKKwkiTG9nIHNpbXBseSBldmVyeXRoaW5nXG4iCQkJCVwKKwkiTG9nIGRlYnVnIG1lc3NhZ2VzIGFuZCBoaWdoZXIgbGV2ZWxzXG4iCQlcCisJIkxvZyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIGFuZCBoaWdoZXIgbGV2ZWxzXG4iCVwKKwkiTG9nIG5vdGljYWJsZSBtZXNzYWdlcyBhbmQgaGlnaGVyIGxldmVsc1xuIgkJXAorCSJMb2cgZXJyb3IgbWVzc2FnZXMgYW5kIGhpZ2hlciBsZXZlbHNcbiIJCVwKKwkiTG9nIG9ubHkgZmF0YWwgbWVzc2FnZXNcbiIKK0RFRlVOKGxvZ2dpbmdfbGV2ZWwsCisgICAgICBsb2dnaW5nX2xldmVsX2NtZCwKKyAgICAgICJsb2dnaW5nIGxldmVsICIgVlRZX0RFQlVHX0NBVEVHT1JJRVMgIiAiIFZUWV9ERUJVR19MRVZFTFMsCisgICAgICBMT0dHSU5HX1NUUgorICAgICAgIlNldCB0aGUgbG9nIGxldmVsIGZvciBhIHNwZWNpZmllZCBjYXRlZ29yeVxuIgorICAgICAgQ0FURUdPUklFU19IRUxQCisgICAgICBMRVZFTFNfSEVMUCkKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisJaW50IGNhdGVnb3J5ID0gbG9nX3BhcnNlX2NhdGVnb3J5KGFyZ3ZbMF0pOworCWludCBsZXZlbCA9IGxvZ19wYXJzZV9sZXZlbChhcmd2WzFdKTsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGxldmVsIDwgMCkgeworCQl2dHlfb3V0KHZ0eSwgIkludmFsaWQgbGV2ZWwgYCVzJyVzIiwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJLyogQ2hlY2sgZm9yIHNwZWNpYWwgY2FzZSB3aGVyZSB3ZSB3YW50IHRvIHNldCBnbG9iYWwgbG9nIGxldmVsICovCisJaWYgKCFzdHJjbXAoYXJndlswXSwgImFsbCIpKSB7CisJCWxvZ19zZXRfbG9nX2xldmVsKGNvbm4tPmRiZywgbGV2ZWwpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCisJaWYgKGNhdGVnb3J5IDwgMCkgeworCQl2dHlfb3V0KHZ0eSwgIkludmFsaWQgY2F0ZWdvcnkgYCVzJyVzIiwgYXJndlswXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJY29ubi0+ZGJnLT5jYXRlZ29yaWVzW2NhdGVnb3J5XS5lbmFibGVkID0gMTsKKwljb25uLT5kYmctPmNhdGVnb3JpZXNbY2F0ZWdvcnldLmxvZ2xldmVsID0gbGV2ZWw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfc2V0X2NhdGVnb3J5X21hc2ssCisgICAgICBsb2dnaW5nX3NldF9jYXRlZ29yeV9tYXNrX2NtZCwKKyAgICAgICJsb2dnaW5nIHNldCBsb2cgbWFzayBNQVNLIiwKKwlMT0dHSU5HX1NUUgorICAgICAgIkRlY2lkZSB3aGljaCBjYXRlZ29yaWVzIHRvIG91dHB1dC5cbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfcGFyc2VfY2F0ZWdvcnlfbWFzayhjb25uLT5kYmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oZGlhYmxlX2xvZ2dpbmcsCisgICAgICBkaXNhYmxlX2xvZ2dpbmdfY21kLAorICAgICAgImxvZ2dpbmcgZGlzYWJsZSIsCisJTE9HR0lOR19TVFIKKyAgICAgICJEaXNhYmxlcyBsb2dnaW5nIHRvIHRoaXMgdnR5XG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJbG9nX2RlbF90YXJnZXQoY29ubi0+ZGJnKTsKKwl0YWxsb2NfZnJlZShjb25uLT5kYmcpOworCWNvbm4tPmRiZyA9IE5VTEw7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCB2dHlfcHJpbnRfbG9ndGFyZ2V0KHN0cnVjdCB2dHkgKnZ0eSwgY29uc3Qgc3RydWN0IGxvZ19pbmZvICppbmZvLAorCQkJCWNvbnN0IHN0cnVjdCBsb2dfdGFyZ2V0ICp0Z3QpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwl2dHlfb3V0KHZ0eSwgIiBHbG9iYWwgTG9nbGV2ZWw6ICVzJXMiLAorCQlsb2dfbGV2ZWxfc3RyKHRndC0+bG9nbGV2ZWwpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgVXNlIGNvbG9yOiAlcywgUHJpbnQgVGltZXN0YW1wOiAlcyVzIiwKKwkJdGd0LT51c2VfY29sb3IgPyAiT24iIDogIk9mZiIsCisJCXRndC0+cHJpbnRfdGltZXN0YW1wID8gIk9uIiA6ICJPZmYiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIiBMb2cgTGV2ZWwgc3BlY2lmaWMgaW5mb3JtYXRpb246JXMiLCBWVFlfTkVXTElORSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnVtX2NhdDsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBsb2dfY2F0ZWdvcnkgKmNhdCA9ICZ0Z3QtPmNhdGVnb3JpZXNbaV07CisJCXZ0eV9vdXQodnR5LCAiICAlLTEwcyAlLTEwcyAlLThzICVzJXMiLAorCQkJaW5mby0+Y2F0W2ldLm5hbWUrMSwgbG9nX2xldmVsX3N0cihjYXQtPmxvZ2xldmVsKSwKKwkJCWNhdC0+ZW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIsCisgCQkJaW5mby0+Y2F0W2ldLmRlc2NyaXB0aW9uLAorCQkJVlRZX05FV0xJTkUpOworCX0KK30KKworI2RlZmluZSBTSE9XX0xPR19TVFIgIlNob3cgY3VycmVudCBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiIKKworREVGVU4oc2hvd19sb2dnaW5nX3Z0eSwKKyAgICAgIHNob3dfbG9nZ2luZ192dHlfY21kLAorICAgICAgInNob3cgbG9nZ2luZyB2dHkiLAorCVNIT1dfU1RSIFNIT1dfTE9HX1NUUgorCSJTaG93IGN1cnJlbnQgbG9nZ2luZyBjb25maWd1cmF0aW9uIGZvciB0aGlzIHZ0eVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwl2dHlfcHJpbnRfbG9ndGFyZ2V0KHZ0eSwgJmxvZ19pbmZvLCBjb25uLT5kYmcpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCit2b2lkIG9wZW5ic2NfdnR5X3ByaW50X3N0YXRpc3RpY3Moc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCkKK3sKKwl2dHlfb3V0KHZ0eSwgIkNoYW5uZWwgUmVxdWVzdHMgICAgICAgIDogJWx1IHRvdGFsLCAlbHUgbm8gY2hhbm5lbCVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5jaHJlcS50b3RhbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuY2hyZXEubm9fY2hhbm5lbCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkNoYW5uZWwgRmFpbHVyZXMgICAgICAgIDogJWx1IHJmX2ZhaWx1cmVzLCAlbHUgcmxsIGZhaWx1cmVzJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmNoYW4ucmZfZmFpbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuY2hhbi5ybGxfZXJyKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiUGFnaW5nICAgICAgICAgICAgICAgICAgOiAlbHUgYXR0ZW1wdGVkLCAlbHUgY29tcGxldGUsICVsdSBleHBpcmVkJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5hdHRlbXB0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5jb21wbGV0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnBhZ2luZy5leHBpcmVkKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiQlRTIGZhaWx1cmVzICAgICAgICAgICAgOiAlbHUgT01MLCAlbHUgUlNMJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmJ0cy5vbWxfZmFpbCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuYnRzLnJzbF9mYWlsKSwgVlRZX05FV0xJTkUpOworfQorCit2b2lkIG9wZW5ic2NfdnR5X2FkZF9jbWRzKCkKK3sKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJmVuYWJsZV9sb2dnaW5nX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZkaXNhYmxlX2xvZ2dpbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJmxvZ2dpbmdfZmx0cl9pbXNpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZsb2dnaW5nX2ZsdHJfYWxsX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZsb2dnaW5nX3VzZV9jbHJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJmxvZ2dpbmdfcHJudF90aW1lc3RhbXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJmxvZ2dpbmdfc2V0X2NhdGVnb3J5X21hc2tfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJmxvZ2dpbmdfbGV2ZWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfbG9nZ2luZ192dHlfY21kKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfbGF5ZXIzLmMgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2xheWVyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMmFkYmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlX2xheWVyMy5jCkBAIC0wLDAgKzEsNTY4IEBACisvKiBPcGVuQlNDIGludGVyZmFjZSB0byBxdWFnZ2EgVlRZICovCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+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+c3RhdHMuaGFuZG92ZXIuYXR0ZW1wdGVkKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5ub19jaGFubmVsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci50aW1lb3V0KSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5jb21wbGV0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLmZhaWxlZCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlNNUyBNTyAgICAgICAgICAgICAgICAgIDogJWx1IHN1Ym1pdHRlZCwgJWx1IG5vIHJlY2VpdmVyJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5zdWJtaXR0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5ub19yZWNlaXZlciksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlNNUyBNVCAgICAgICAgICAgICAgICAgIDogJWx1IGRlbGl2ZXJlZCwgJWx1IG5vIG1lbW9yeSwgJWx1IG90aGVyIGVycm9yJXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5kZWxpdmVyZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5ycF9lcnJfbWVtKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5zbXMucnBfZXJyX290aGVyKSwgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitpbnQgYnNjX3Z0eV9pbml0X2V4dHJhKHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCWdzbW5ldCA9IG5ldDsKKworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NDQUxMLCBzY2FsbF9jYmZuLCBOVUxMKTsKKworCWluc3RhbGxfZWxlbWVudF92ZSgmc2hvd19zdWJzY3JfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfc3Vic2NyX2NhY2hlX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNtc19zZW5kX3BlbmRfY21kKTsKKworCWluc3RhbGxfZWxlbWVudF92ZSgmc3Vic2NyaWJlcl9zZW5kX3Ntc19jbWQpOworCWluc3RhbGxfZWxlbWVudF92ZSgmc3Vic2NyaWJlcl9zaWxlbnRfc21zX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0YXJ0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50X3ZlKCZzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0b3BfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnRfdmUoJnNob3dfc3RhdHNfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmNmZ19zdWJzY3JfY21kKTsKKwlpbnN0YWxsX25vZGUoJnN1YnNjcl9ub2RlLCBkdW1teV9jb25maWdfd3JpdGUpOworCisJaW5zdGFsbF9kZWZhdWx0KFNVQlNDUl9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoU1VCU0NSX05PREUsICZjZmdfc3Vic2NyX25hbWVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoU1VCU0NSX05PREUsICZjZmdfc3Vic2NyX2V4dGVuc2lvbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChTVUJTQ1JfTk9ERSwgJmNmZ19zdWJzY3JfYXV0aG9yaXplZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChTVUJTQ1JfTk9ERSwgJmNmZ19zdWJzY3JfYTNhOF9jbWQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjFiOTMxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxIEBACitTVUJESVJTID0gZGVidWcgZ3NtMDQwOCBkYiBjaGFubmVsIHNjY3AKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzI5NjU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9jaGFubmVsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTUgQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitBTV9DRkxBR1M9LVdhbGwgLWdnZGIzICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorCitub2luc3RfUFJPR1JBTVMgPSBjaGFubmVsX3Rlc3QKKworY2hhbm5lbF90ZXN0X1NPVVJDRVMgPSBjaGFubmVsX3Rlc3QuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZGIuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZ3NtX3N1YnNjcmliZXJfYmFzZS5jIFwKKwkkKHRvcF9zcmNkaXIpL3NyYy9nc21fc3Vic2NyaWJlci5jIFwKKwkkKHRvcF9zcmNkaXIpL3NyYy9kZWJ1Zy5jIFwKKwkkKHRvcF9zcmNkaXIpL3NyYy9nc21fZGF0YS5jIFwKKwkkKHRvcF9zcmNkaXIpL3NyYy9idHNfaXBhY2Nlc3NfbmFub2J0cy5jIFwKKwkkKHRvcF9zcmNkaXIpL3NyYy9idHNfc2llbWVuc19iczExLmMKK2NoYW5uZWxfdGVzdF9MREFERCA9IC1sZGwgLWxkYmkgJChMSUJPU01PQ09SRV9MSUJTKQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvY2hhbm5lbF90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvY2hhbm5lbF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU5MDAxYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9jaGFubmVsX3Rlc3QuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorCisvKiBvdXIgaGFuZGxlciAqLworc3RhdGljIGludCBzdWJzY3JfY2IodW5zaWduZWQgaW50IGhvb2ssIHVuc2lnbmVkIGludCBldmVudCwgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJYXNzZXJ0KGhvb2sgPT0gMTAxKTsKKwlhc3NlcnQoZXZlbnQgPT0gMjAwKTsKKwlhc3NlcnQobXNnID09ICh2b2lkKikweDEzMjNMKTsKKwlhc3NlcnQoZGF0YSA9PSAodm9pZCopMHg0MjQyTCk7CisJYXNzZXJ0KHBhcmFtID09ICh2b2lkKikweDIzNDJMKTsKKwlwcmludGYoIlJlYWNoZWQsIGRpZG4ndCBjcmFzaCwgdGVzdCBwYXNzZWRcbiIpOworCXJldHVybiAwOworfQorCisvKiBtb2NrIG9iamVjdCBmb3IgdGVzdGluZywgZGlyZWN0bHkgaW52b2tlIHRoZSBjYi4uLiBtYXliZSBsYXRlciB0aHJvdWdoIHRoZSB0aW1lciAqLwordm9pZCBwYWdpbmdfcmVxdWVzdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcmliZXIsIGludCB0eXBlLCBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqZGF0YSkKK3sKKwljYmZuKDEwMSwgMjAwLCAodm9pZCopMHgxMzIzTCwgKHZvaWQqKTB4NDI0MkwsIGRhdGEpOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcms7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCXByaW50ZigiVGVzdGluZyB0aGUgZ3NtX3N1YnNjcmliZXIgY2hhbiBsb2dpY1xuIik7CisKKwkvKiBDcmVhdGUgYSBkdW1teSBuZXR3b3JrICovCisJbmV0d29yayA9IGdzbV9uZXR3b3JrX2luaXQoMSwgMSwgTlVMTCk7CisJaWYgKCFuZXR3b3JrKQorCQlleGl0KDEpOworCWJ0cyA9IGdzbV9idHNfYWxsb2MobmV0d29yaywgR1NNX0JUU19UWVBFX0JTMTEsIDAsIDApOworCWJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlID0gMjM7CisKKwkvKiBDcmVhdGUgYSBkdW1teSBzdWJzY3JpYmVyICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBzdWJzY3JfYWxsb2MoKTsKKwlzdWJzY3ItPmxhYyA9IDIzOworCXN1YnNjci0+bmV0ID0gbmV0d29yazsKKworCS8qIEFzayBmb3IgYSBjaGFubmVsLi4uICovCisJc3Vic2NyX2dldF9jaGFubmVsKHN1YnNjciwgUlNMX0NIQU5ORUVEX1RDSF9GLCBzdWJzY3JfY2IsICh2b2lkKikweDIzNDJMKTsKKworCXdoaWxlICgxKSB7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9Cit9CisKK3ZvaWQgbm1fc3RhdGVfZXZlbnQoKSB7fQordm9pZCBpbnB1dF9ldmVudCgpIHt9Cit2b2lkIHNtc19hbGxvYygpIHt9CisKK3N0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmOworCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2RiL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9kYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWI5MTgwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9kYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDggQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitBTV9DRkxBR1M9LVdhbGwgLWdnZGIzICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorCitub2luc3RfUFJPR1JBTVMgPSBkYl90ZXN0CisKK2RiX3Rlc3RfU09VUkNFUyA9IGRiX3Rlc3QuYworZGJfdGVzdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJtc2MuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQoTElCT1NNT0NPUkVfTElCUykgLWxkbCAtbGRiaQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2RiL2RiX3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvZGIvZGJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNjhhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2RiL2RiX3Rlc3QuYwpAQCAtMCwwICsxLDEwNiBAQAorLyogKEMpIDIwMDggYnkgSmFuIEx1ZWJiZSA8amx1ZWJiZUBkZWJpYW4ub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIENPTVBBUkUob3JpZ2luYWwsIGNvcHkpIFwKKwlpZiAob3JpZ2luYWwtPmlkICE9IGNvcHktPmlkKSBcCisJCWZwcmludGYoc3RkZXJyLCAiSWRzIGRvIG5vdCBtYXRjaCBpbiAlczolZCAlbGx1ICVsbHVcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5pZCwgY29weS0+aWQpOyBcCisJaWYgKG9yaWdpbmFsLT5sYWMgIT0gY29weS0+bGFjKSBcCisJCWZwcmludGYoc3RkZXJyLCAiTEFDIGRvIG5vdCBtYXRjaCBpbiAlczolZCAlZCAlZFxuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPmxhYywgY29weS0+bGFjKTsgXAorCWlmIChvcmlnaW5hbC0+YXV0aG9yaXplZCAhPSBjb3B5LT5hdXRob3JpemVkKSBcCisJCWZwcmludGYoc3RkZXJyLCAiQXV0aG9yaXplIGRvIG5vdCBtYXRjaCBpbiAlczolZCAlZCAlZFxuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPmF1dGhvcml6ZWQsIFwKKwkJCWNvcHktPmF1dGhvcml6ZWQpOyBcCisJaWYgKHN0cmNtcChvcmlnaW5hbC0+aW1zaSwgY29weS0+aW1zaSkgIT0gMCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIklNU0lzIGRvIG5vdCBtYXRjaCBpbiAlczolZCAnJXMnICclcydcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5pbXNpLCBjb3B5LT5pbXNpKTsgXAorCWlmIChvcmlnaW5hbC0+dG1zaSAhPSBjb3B5LT50bXNpKSBcCisJCWZwcmludGYoc3RkZXJyLCAiVE1TSXMgZG8gbm90IG1hdGNoIGluICVzOiVkICcldScgJyV1J1xuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPnRtc2ksIGNvcHktPnRtc2kpOyBcCisJaWYgKHN0cmNtcChvcmlnaW5hbC0+bmFtZSwgY29weS0+bmFtZSkgIT0gMCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIm5hbWVzIGRvIG5vdCBtYXRjaCBpbiAlczolZCAnJXMnICclcydcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5uYW1lLCBjb3B5LT5uYW1lKTsgXAorCWlmIChzdHJjbXAob3JpZ2luYWwtPmV4dGVuc2lvbiwgY29weS0+ZXh0ZW5zaW9uKSAhPSAwKSBcCisJCWZwcmludGYoc3RkZXJyLCAibmFtZXMgZG8gbm90IG1hdGNoIGluICVzOiVkICclcycgJyVzJ1xuIiwgXAorCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgb3JpZ2luYWwtPmV4dGVuc2lvbiwgY29weS0+ZXh0ZW5zaW9uKTsgXAorCitpbnQgbWFpbigpIHsKKworCWlmIChkYl9pbml0KCJobHIuc3FsaXRlMyIpKSB7CisJCXByaW50ZigiREI6IEZhaWxlZCB0byBpbml0IGRhdGFiYXNlLiBQbGVhc2UgY2hlY2sgdGhlIG9wdGlvbiBzZXR0aW5ncy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CSAKKwlwcmludGYoIkRCOiBEYXRhYmFzZSBpbml0aWFsaXplZC5cbiIpOworCisJaWYgKGRiX3ByZXBhcmUoKSkgeworCQlwcmludGYoIkRCOiBGYWlsZWQgdG8gcHJlcGFyZSBkYXRhYmFzZS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcHJpbnRmKCJEQjogRGF0YWJhc2UgcHJlcGFyZWQuXG4iKTsKKworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqYWxpY2UgPSBOVUxMOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqYWxpY2VfZGI7CisKKwljaGFyICphbGljZV9pbXNpID0gIjMyNDMyNDU0MzIzNDUiOworCWFsaWNlID0gZGJfY3JlYXRlX3N1YnNjcmliZXIoTlVMTCwgYWxpY2VfaW1zaSk7CisJZGJfc3luY19zdWJzY3JpYmVyKGFsaWNlKTsKKwlhbGljZV9kYiA9IGRiX2dldF9zdWJzY3JpYmVyKE5VTEwsIEdTTV9TVUJTQ1JJQkVSX0lNU0ksIGFsaWNlLT5pbXNpKTsKKwlDT01QQVJFKGFsaWNlLCBhbGljZV9kYik7CisJc3Vic2NyX3B1dChhbGljZV9kYik7CisJc3Vic2NyX3B1dChhbGljZSk7CisKKwlhbGljZV9pbXNpID0gIjM2OTMyNDU0MjM0NDUiOworCWFsaWNlID0gZGJfY3JlYXRlX3N1YnNjcmliZXIoTlVMTCwgYWxpY2VfaW1zaSk7CisJZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKGFsaWNlLCAiMTIzNDU2Nzg5MCIpOworCWRiX3N1YnNjcmliZXJfYWxsb2NfdG1zaShhbGljZSk7CisJYWxpY2UtPmxhYz00MjsKKwlkYl9zeW5jX3N1YnNjcmliZXIoYWxpY2UpOworCWFsaWNlX2RiID0gZGJfZ2V0X3N1YnNjcmliZXIoTlVMTCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgYWxpY2VfaW1zaSk7CisJQ09NUEFSRShhbGljZSwgYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2UpOworCXN1YnNjcl9wdXQoYWxpY2VfZGIpOworCisJYWxpY2VfaW1zaSA9ICI5OTkzMjQ1NDIzNDQ1IjsKKwlhbGljZSA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKE5VTEwsIGFsaWNlX2ltc2kpOworCWRiX3N1YnNjcmliZXJfYWxsb2NfdG1zaShhbGljZSk7CisJYWxpY2UtPmxhYz00MjsKKwlkYl9zeW5jX3N1YnNjcmliZXIoYWxpY2UpOworCWRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShhbGljZSwgIjEyMzQ1Njc4OTAiKTsKKwlkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkoYWxpY2UsICI2NTQzNTYwOTIwIik7CisJYWxpY2VfZGIgPSBkYl9nZXRfc3Vic2NyaWJlcihOVUxMLCBHU01fU1VCU0NSSUJFUl9JTVNJLCBhbGljZV9pbXNpKTsKKwlDT01QQVJFKGFsaWNlLCBhbGljZV9kYik7CisJc3Vic2NyX3B1dChhbGljZSk7CisJc3Vic2NyX3B1dChhbGljZV9kYik7CisKKwlkYl9maW5pKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogc3R1YnMgKi8KK3ZvaWQgaW5wdXRfZXZlbnQodm9pZCkge30KK3ZvaWQgbm1fc3RhdGVfZXZlbnQodm9pZCkge30KZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZGVidWcvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL2RlYnVnL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MjNmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2RlYnVnL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNiBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAkKExJQk9TTU9DT1JFX0NGTEFHUykKK25vaW5zdF9QUk9HUkFNUyA9IGRlYnVnX3Rlc3QKKworZGVidWdfdGVzdF9TT1VSQ0VTID0gZGVidWdfdGVzdC5jICQodG9wX3NyY2Rpcikvc3JjL2RlYnVnLmMgCitkZWJ1Z190ZXN0X0xEQUREID0gJChMSUJPU01PQ09SRV9MSUJTKQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9kZWJ1Z190ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL2RlYnVnL2RlYnVnX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2U0ODM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9kZWJ1Z190ZXN0LmMKQEAgLTAsMCArMSw0MyBAQAorLyogc2ltcGxlIHRlc3QgZm9yIHRoZSBkZWJ1ZyBpbnRlcmZhY2UgKi8KKy8qCisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJc3RydWN0IGxvZ190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisKKwlsb2dfaW5pdCgmbG9nX2luZm8pOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisKKwlsb2dfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCAiRFJMTCIpOworCURFQlVHUChEQ0MsICJZb3Ugc2hvdWxkIG5vdCBzZWUgdGhpc1xuIik7CisKKwlsb2dfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCAiRFJMTDpEQ0MiKTsKKwlERUJVR1AoRFJMTCwgIllvdSBzaG91bGQgc2VlIHRoaXNcbiIpOworCURFQlVHUChEQ0MsICJZb3Ugc2hvdWxkIHNlZSB0aGlzXG4iKTsKKwlERUJVR1AoRE1NLCAiWW91IHNob3VsZCBub3Qgc2VlIHRoaXNcbiIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4YzY3MwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDYgQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitBTV9DRkxBR1M9LVdhbGwgJChMSUJPU01PQ09SRV9DRkxBR1MpCitub2luc3RfUFJPR1JBTVMgPSBnc20wNDA4X3Rlc3QKKworZ3NtMDQwOF90ZXN0X1NPVVJDRVMgPSBnc20wNDA4X3Rlc3QuYworZ3NtMDQwOF90ZXN0X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYm1zYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJChMSUJPU01PQ09SRV9MSUJTKSAtbGRiaQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9nc20wNDA4L2dzbTA0MDhfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9nc20wNDA4L2dzbTA0MDhfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4N2Q0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvZ3NtMDQwOF90ZXN0LmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIHNpbXBsZSB0ZXN0IGZvciB0aGUgZ3NtMDQwOCBmb3JtYXR0aW5nIGZ1bmN0aW9ucyAqLworLyoKKyAqIChDKSAyMDA4IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisjZGVmaW5lIENPTVBBUkUocmVzdWx0LCBvcCwgdmFsdWUpIFwKKyAgICBpZiAoISgocmVzdWx0KSBvcCAodmFsdWUpKSkge1wKKwlmcHJpbnRmKHN0ZGVyciwgIkNvbXBhcmUgZmFpbGVkLiBXYXMgJXggc2hvdWxkIGJlICV4IGluICVzOiVkXG4iLHJlc3VsdCwgdmFsdWUsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKwlleGl0KC0xKTsgXAorICAgIH0KKworI2RlZmluZSBDT01QQVJFX1NUUihyZXN1bHQsIHZhbHVlKSBcCisJaWYgKHN0cmNtcChyZXN1bHQsIHZhbHVlKSAhPSAwKSB7IFwKKwkJZnByaW50ZihzdGRlcnIsICJDb21wYXJlIGZhaWxlZC4gV2FzICVzIHNob3VsZCBiZSAlcyBpbiAlczolZFxuIixyZXN1bHQsIHZhbHVlLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisJCWV4aXQoLTEpOyBcCisJfQorCisvKgorICogVGVzdCBMb2NhdGlvbiBBcmVhIElkZW50aWZpZXIgZm9ybWF0dGluZy4gVGFibGUgMTAuNS4zIG9mIDA0LjA4CisgKi8KK3N0YXRpYyB2b2lkIHRlc3RfbG9jYXRpb25fYXJlYV9pZGVudGlmaWVyKHZvaWQpCit7CisgICAgc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkIGxhaTQ4OworCisgICAgcHJpbnRmKCJUZXN0aW5nIHRlc3QgbG9jYXRpb24gYXJlYSBpZGVudGlmaWVyXG4iKTsKKworICAgIC8qCisgICAgICogVGVzdCB0aGUgZGVmYXVsdC90ZXN0IHNldHVwLiBDb21pbmcgZnJvbQorICAgICAqIGJzY19oYWNrLmMgZHVtcHMKKyAgICAgKi8KKyAgICBnc200OF9nZW5lcmF0ZV9sYWkoJmxhaTQ4LCAxLCAxLCAxKTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1swXSwgPT0sIDB4MDApOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzFdLCA9PSwgMHhGMSk7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMl0sID09LCAweDEwKTsKKyAgICBDT01QQVJFKGxhaTQ4LmxhYywgPT0sIGh0b25zKDB4MDAwMSkpOworCisgICAgZ3NtNDhfZ2VuZXJhdGVfbGFpKCZsYWk0OCwgNjAyLCAxLCAxNSk7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMF0sID09LCAweDA2KTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1sxXSwgPT0sIDB4RjIpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzJdLCA9PSwgMHgxMCk7CisgICAgQ09NUEFSRShsYWk0OC5sYWMsID09LCBodG9ucygweDAwMGYpKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9taV9mdW5jdGlvbmFsaXR5KHZvaWQpCit7CisJY29uc3QgY2hhciAqaW1zaV9vZGQgID0gIjk4NzY1NDMyMTA5ODc2MyI7CisJY29uc3QgY2hhciAqaW1zaV9ldmVuID0gIjk4NzY1NDMyMTA5ODc2NTQiOworCWNvbnN0IHVfaW50MzJfdCB0bXNpID0gMHhmYWJlYWNkMDsKKwl1X2ludDhfdCBtaVsxMjhdOworCXVuc2lnbmVkIGludCBtaV9sZW47CisJY2hhciBtaV9wYXJzZWRbR1NNNDhfTUlfU0laRV07CisKKwlwcmludGYoIlRlc3RpbmcgcGFyc2luZyBhbmQgZ2VuZXJhdGluZyBUTVNJL0lNU0lcbiIpOworCisJLyogdG1zaSBjb2RlICovCisJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21fdG1zaShtaSwgdG1zaSk7CisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3BhcnNlZCwgc2l6ZW9mKG1pX3BhcnNlZCksIG1pICsgMiwgbWlfbGVuIC0gMik7CisJQ09NUEFSRSgodV9pbnQzMl90KXN0cnRvdWwobWlfcGFyc2VkLCBOVUxMLCAxMCksID09LCB0bXNpKTsKKworCS8qIGltc2kgY29kZSAqLworCW1pX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX2ltc2kobWksIGltc2lfb2RkKTsKKwlnc200OF9taV90b19zdHJpbmcobWlfcGFyc2VkLCBzaXplb2YobWlfcGFyc2VkKSwgbWkgKyAyLCBtaV9sZW4gLTIpOworCXByaW50ZigiaGV4OiAlc1xuIiwgaGV4ZHVtcChtaSwgbWlfbGVuKSk7CisJQ09NUEFSRV9TVFIobWlfcGFyc2VkLCBpbXNpX29kZCk7CisKKwltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV9pbXNpKG1pLCBpbXNpX2V2ZW4pOworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9wYXJzZWQsIHNpemVvZihtaV9wYXJzZWQpLCBtaSArIDIsIG1pX2xlbiAtMik7CisJcHJpbnRmKCJoZXg6ICVzXG4iLCBoZXhkdW1wKG1pLCBtaV9sZW4pKTsKKwlDT01QQVJFX1NUUihtaV9wYXJzZWQsIGltc2lfZXZlbik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwl0ZXN0X2xvY2F0aW9uX2FyZWFfaWRlbnRpZmllcigpOworCXRlc3RfbWlfZnVuY3Rpb25hbGl0eSgpOworCisJZXhpdCgwKTsKK30KKworCisKKy8qCisgKiBTdHVicyB0byBjb21waWxlIGFuZCBsaW5rCisgKi8KK3ZvaWQgaW5wdXRfZXZlbnQodm9pZCkge30KK3ZvaWQgbm1fc3RhdGVfZXZlbnQodm9pZCkge30KZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvc2NjcC9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvc2NjcC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzU2OTNlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9zY2NwL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOCBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAtZ2dkYjMgJChMSUJPU01PQ09SRV9DRkxBR1MpCisKK25vaW5zdF9QUk9HUkFNUyA9IHNjY3BfdGVzdAorCitzY2NwX3Rlc3RfU09VUkNFUyA9IHNjY3BfdGVzdC5jCitzY2NwX3Rlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYnNjY3AuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQoTElCT1NNT0NPUkVfTElCUykKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9zY2NwL3NjY3BfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9zY2NwL3NjY3BfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZWI0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL3NjY3Avc2NjcF90ZXN0LmMKQEAgLTAsMCArMSw4NTEgQEAKKy8qCisgKiBTQ0NQIHRlc3RpbmcgY29kZQorICoKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IE9uLVdhdmVzCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKworI2luY2x1ZGUgPHNjY3Avc2NjcC5oPgorCisjZGVmaW5lIE1JTih4LCB5KSAoKHgpIDwgKHkpID8gKHgpIDogKHkpKQorCisvKiBCU0MgLT4gTVNDICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3Jlc2V0W10gPSB7CisJMHgwOSwgMHgwMCwgMHgwMywgMHgwNSwgMHgwNywgMHgwMiwgMHg0MiwgMHhmZSwKKwkweDAyLCAweDQyLCAweGZlLCAweDA2LCAweDAwLCAweDA0LCAweDMwLCAweDA0LAorCTB4MDEsIDB4MjAsCit9OworCisvKiBNU0MgLT4gQlNDIHJlc2V0IGFjayAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9yZXNldF9hY2tbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA3LCAweDBiLCAweDA0LCAweDQzLCAweDAxLAorCTB4MDAsIDB4ZmUsIDB4MDQsIDB4NDMsIDB4NWMsIDB4MDAsIDB4ZmUsIDB4MDMsCisJMHgwMCwgMHgwMSwgMHgzMSwKK307CisKKy8qIE1TQyAtPiBCU0MgcGFnaW5nLCBjb25uZWN0aW9uIGxlc3MgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcGFnaW5nW10gPSB7CisJMHgwOSwgMHgwMCwgMHgwMywgMHgwNywgMHgwYiwgMHgwNCwgMHg0MywgMHgwMSwKKwkweDAwLCAweGZlLCAweDA0LCAweDQzLCAweDVjLCAweDAwLCAweGZlLCAweDEwLAorCTB4MDAsIDB4MGUsIDB4NTIsIDB4MDgsIDB4MDgsIDB4MjksIDB4NDcsIDB4MTAsCisJMHgwMiwgMHgwMSwgMHgzMSwgMHg5NywgMHg2MSwgMHgxYSwgMHgwMSwgMHgwNiwKK307CisKKy8qIE1TQyAtPiBCU0MgcGFnaW5nLCBVRFQgd2l0aG91dCBQQyAgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfdWR0W10gPSB7CisJMHgwOSwgMHgwMCwgMHgwMywgMHgwNSwgMHgwNywgMHgwMiwgMHg0MiwgMHhmZSwKKwkweDAyLCAweDQyLCAweGZlLCAweDEwLCAweDAwLCAweDBlLCAweDUyLCAweDA4LAorCTB4MDgsIDB4MjksIDB4NDcsIDB4MTAsIDB4MDIsIDB4MDEsIDB4MzEsIDB4OTcsCisJMHg2MSwgMHgxYSwgMHgwMSwgMHgwNiwKK307CisKKy8qIEJTQyAtPiBNU0MgY29ubmVjdGlvbiBvcGVuICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX2NyW10gPSB7CisJMHgwMSwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMiwgMHgwMiwgMHgwNCwgMHgwMiwKKwkweDQyLCAweGZlLCAweDBmLCAweDFmLCAweDAwLCAweDFkLCAweDU3LCAweDA1LAorCTB4MDgsIDB4MDAsIDB4NzIsIDB4ZjQsIDB4ODAsIDB4MjAsIDB4MTIsIDB4YzMsCisJMHg1MCwgMHgxNywgMHgxMCwgMHgwNSwgMHgyNCwgMHgxMSwgMHgwMywgMHgzMywKKwkweDE5LCAweGEyLCAweDA4LCAweDI5LCAweDQ3LCAweDEwLCAweDAyLCAweDAxLAorCTB4MzEsIDB4OTcsIDB4NjEsIDB4MDAKK307CisKKy8qIE1TQyAtPiBCU0MgY29ubmVjdGlvbiBjb25maXJtICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX2NjW10gPSB7CisJMHgwMiwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMywgMHgwMiwgMHgwMSwgMHgwMCwKK307CisKKy8qIE1TQyAtPiBCU0MgRFRBUAorICoKKyAqIHdlIGZha2UgYSBiaXQgYW5kIG1ha2UgaXQgQlNDIC0+IE1TQy4uLiBzbyB0aGUKKyAqIHBheWxvYWQgZG9lcyBub3QgbWFrZSBhbnkgc2Vuc2UuLgorICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX2R0YXBbXSA9IHsKKwkweDA2LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAxLCAweDBmLCAweDAxLCAweDAwLCAweDBjLAorCTB4MDMsIDB4MDUsIDB4NWMsIDB4MDgsIDB4MTEsIDB4ODEsIDB4MzMsIDB4NjYsIDB4MDIsIDB4MTMsCisJMHg0NSwgMHhmNCwKK307CisKKy8qIE1TQyAtPiBCU0MgY2xlYXIgY29tbWFuZCAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9jbGVhcltdID0geworCTB4MDYsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MDYsIDB4MDAsIDB4MDQsIDB4MjAsCisJMHgwNCwgMHgwMSwgMHgwOSwKK307CisKKy8qIE1TQyAtPiBCU0MgcmVsZWFzZWQgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcmVsZWFzZWRbXSA9IHsKKwkweDA0LCAweDAwLCAweDAwLCAweDAzLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDAxLCAweDBmLAorCTB4MDIsIDB4MjMsIDB4NDIsIDB4MDAsCit9OworCisvKiBCU0MgLT4gTVNDIHJlbGVhc2VkICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3JlbGVhc2VfY29tcGxldGVbXSA9IHsKKwkweDA1LCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDAwLCAweDAzCit9OworCitzdHJ1Y3QgdGVzdF9kYXRhIHsKKwlpbnQgbGVuZ3RoOworCWNvbnN0IHVfaW50OF90ICpkYXRhOworCWludCBwYXlsb2FkX3N0YXJ0OworCWludCBwYXlsb2FkX2xlbmd0aDsKKwl1X2ludDhfdCBmaXJzdF9ieXRlOworCisgICAgICAgIC8qIGluIGNhc2UgaXQgc2hvdWxkIHRyaWdnZXIgYSBzY2NwIHJlc3BvbnNlICovCisJaW50IHdyaXRlOworCWNvbnN0IHVfaW50OF90ICAqcmVzcG9uc2U7CisJaW50IHJlc3BvbnNlX2xlbmd0aDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGVzdF9kYXRhIHRlc3RfZGF0YVtdID0geworCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldCksCisJCS5kYXRhCQk9ICZic3NtYXBfcmVzZXRbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTIsCisJCS5wYXlsb2FkX2xlbmd0aCA9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0KSAtIDEyLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldF9hY2spLAorCQkuZGF0YQkJPSAmYnNzbWFwX3Jlc2V0X2Fja1swXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxNiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfcmVzZXRfYWNrKSAtIDE2LAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9wYWdpbmcpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3BhZ2luZ1swXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxNiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfcGFnaW5nKSAtIDE2LAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9jciksCisJCS5kYXRhCQk9ICZic3NtYXBfY3JbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTIsCisJCS8qIDB4MDAgaXMgZW5kIG9mIG9wdGlvbmFsIGRhdGEsIHN1YnRyYWN0IHRoaXMgYnl0ZSAqLworCQkucGF5bG9hZF9sZW5ndGggPSAzMSwKKwkJLmZpcnN0X2J5dGUJPSAweDAsCisKKwkJLyogdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBzaG91bGQgdHJpZ2dlciBhIGNvbm5lY3Rpb24gY29uZmlybSAqLworCQkud3JpdGUJCT0gMSwKKwkJLnJlc3BvbnNlCT0gJmJzc21hcF9jY1swXSwKKwkJLnJlc3BvbnNlX2xlbmd0aD0gQVJSQVlfU0laRShic3NtYXBfY2MpLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX2R0YXApLAorCQkuZGF0YQkJPSAmYnNzbWFwX2R0YXBbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gNywKKwkJLnBheWxvYWRfbGVuZ3RoID0gMTUsCisJCS5maXJzdF9ieXRlCT0gMHgwMSwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9jbGVhciksCisJCS5kYXRhCQk9ICZic3NtYXBfY2xlYXJbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gNywKKwkJLnBheWxvYWRfbGVuZ3RoID0gNiwKKwkJLmZpcnN0X2J5dGUJPSAweDAwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3JlbGVhc2VkKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9yZWxlYXNlZFswXSwKKwkJLnBheWxvYWRfbGVuZ3RoID0gMiwKKwkJLnBheWxvYWRfc3RhcnQgID0gMTEsCisJCS5maXJzdF9ieXRlCT0gMHgyMywKKworCQkud3JpdGUJCT0gMSwKKwkJLnJlc3BvbnNlCT0gJmJzc21hcF9yZWxlYXNlX2NvbXBsZXRlWzBdLAorCQkucmVzcG9uc2VfbGVuZ3RoPSBBUlJBWV9TSVpFKGJzc21hcF9yZWxlYXNlX2NvbXBsZXRlKSwKKwl9LAorfTsKKworLyogd2Ugd2lsbCBzZW5kIFVEVHMgYW5kIHZlcmlmeSB0aGV5IGxvb2sgbGlrZSB0aGlzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHRlc3RfZGF0YSBzZW5kX2RhdGFbXSA9IHsKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfdWR0KSwKKwkJLmRhdGEJCT0gJmJzc21hcF91ZHRbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTIsCisJCS5wYXlsb2FkX2xlbmd0aCA9IEFSUkFZX1NJWkUoYnNzbWFwX3VkdCkgLSAxMiwKKwkJLmZpcnN0X2J5dGUJPSAweDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcmVzZXQpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3Jlc2V0WzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDEyLAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldCkgLSAxMiwKKwkJLmZpcnN0X2J5dGUJPSAweDAsCisJfSwKK307CisKK3N0cnVjdCBjb25uZWN0aW9uX3Rlc3QgeworCS8qIHNob3VsZCB0aGUgY29ubmVjdGlvbiBiZSByZWZ1c2VkPyAqLworCWludCByZWZ1c2U7CisKKwlpbnQgd2l0aF9kYXRhOworCisJLyogb24gd2hpY2ggc2lkZSB0byBjbG9zZSB0aGUgY29ubmVjdGlvbj8gKi8KKwlpbnQgY2xvc2Vfc2lkZTsKKwlpbnQgY2xvc2VfY2F1c2U7Cit9OworCisvKiBzY2NwIGNvbm5lY3Rpb24gaGFuZGxpbmcgd2Ugd2FudCB0byB0ZXN0ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbm5lY3Rpb25fdGVzdCBjb25uZWN0aW9uX3Rlc3RzW10gPSB7CisJeworCQkucmVmdXNlCT0gMSwKKwl9LAorCXsKKwkJLnJlZnVzZQk9IDEsCisJCS53aXRoX2RhdGEgPSAxLAorCX0sCisJeworCQkucmVmdXNlID0gMCwKKwkJLmNsb3NlX3NpZGUgPSAwLAorCQkuY2xvc2VfY2F1c2UgPSA1LAorCX0sCisJeworCQkucmVmdXNlID0gMCwKKwkJLmNsb3NlX3NpZGUgPSAwLAorCQkuY2xvc2VfY2F1c2UgPSA1LAorCQkud2l0aF9kYXRhID0gMSwKKwl9LAorCXsKKwkJLnJlZnVzZSA9IDAsCisJCS5jbG9zZV9zaWRlID0gMSwKKwkJLmNsb3NlX2NhdXNlID0gNSwKKwl9LAorCXsKKwkJLnJlZnVzZSA9IDAsCisJCS5jbG9zZV9zaWRlID0gMSwKKwkJLmNsb3NlX2NhdXNlID0gNSwKKwkJLndpdGhfZGF0YSA9IDEsCisJfSwKK307CisKK3N0cnVjdCBzY2NwX3BhcnNlX2hlYWRlcl9yZXN1bHQgeworCS8qIHJlc3VsdHMgKi8KKwlpbnQgbXNnX3R5cGU7CisJaW50IHdhbnRlZF9sZW47CisJaW50IHNyY19zc247CisJaW50IGRzdF9zc247CisKKwlpbnQgaGFzX3NyY19yZWYsIGhhc19kc3RfcmVmOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2Ugc3JjX3JlZjsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIGRzdF9yZWY7CisKKwkvKiB0aGUgaW5wdXQgKi8KKwljb25zdCB1X2ludDhfdCAqaW5wdXQ7CisJaW50IGlucHV0X2xlbjsKK307CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBpdF90ZXN0W10gPSB7CisweDEwLCAweDAxLCAweDA3LCAKKzB4OTQsIDB4MDEsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworc3RhdGljIGNvbnN0IHVfaW50OF90IHByb3RvX2VycltdID0geworMHgwZiwgMHgwYywgMHgwNCwgMHgwMCwgMHgwMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NjcF9wYXJzZV9oZWFkZXJfcmVzdWx0IHBhcnNlX3Jlc3VsdFtdID0geworCXsKKwkJLm1zZ190eXBlCT0gU0NDUF9NU0dfVFlQRV9JVCwKKwkJLndhbnRlZF9sZW4JPSAwLAorCQkuc3JjX3Nzbgk9IC0xLAorCQkuZHN0X3Nzbgk9IC0xLAorCQkuaGFzX3NyY19yZWYJPSAxLAorCQkuaGFzX2RzdF9yZWYJPSAxLAorCisJCS5zcmNfcmVmCT0geworCQkJLm9jdGV0MSA9IDB4MDEsCisJCQkub2N0ZXQyID0gMHgwNCwKKwkJCS5vY3RldDMgPSAweDAwCisJCX0sCisJCS5kc3RfcmVmCT0geworCQkJLm9jdGV0MSA9IDB4MDEsCisJCQkub2N0ZXQyID0gMHgwNywKKwkJCS5vY3RldDMgPSAweDk0LAorCQl9LAorCisJCS5pbnB1dAkJPSBpdF90ZXN0LAorCQkuaW5wdXRfbGVuCT0gc2l6ZW9mKGl0X3Rlc3QpLAorCX0sCisJeworCQkubXNnX3R5cGUJPSBTQ0NQX01TR19UWVBFX0VSUiwKKwkJLndhbnRlZF9sZW4JPSAwLAorCQkuc3JjX3Nzbgk9IC0xLAorCQkuZHN0X3Nzbgk9IC0xLAorCQkuaGFzX3NyY19yZWYJPSAwLAorCQkuaGFzX2RzdF9yZWYJPSAxLAorCQkuZHN0X3JlZgk9IHsKKwkJCS5vY3RldDEgPSAweDBjLAorCQkJLm9jdGV0MiA9IDB4MDQsCisJCQkub2N0ZXQzID0gMHgwMCwKKwkJfSwKKwkJLmlucHV0CQk9IHByb3RvX2VyciwKKwkJLmlucHV0X2xlbgk9IHNpemVvZihwcm90b19lcnIpLAorCX0sCit9OworCisKKy8qIHRlc3RpbmcgcHJvY2VkdXJlOgorICoJLSB3ZSB3aWxsIHVzZSBzY2NwX3dyaXRlIGFuZCBzZWUgd2hhdCB3aWxsIGJlIHNldCBpbiB0aGUKKyAqCSAgb3V0Z29pbmcgY2FsbGJhY2sKKyAqCS0gd2Ugd2lsbCBjYWxsIHNjY3Bfc3lzdGVtX2luY29taW5nIGFuZCBzZWUgd2hpY2ggY2FsbHMKKyAqCSAgYXJlIG1hZGUuIEFuZCB0aGVuIGNvbXBhcmUgaXQgdG8gdGhlIG9uZXMgd2UgZXhwZWN0LiBXZQorICoJICB3YW50IHRoZSBwYXlsb2FkIHRvIGFycml2ZSwgb3IgY2FsbGJhY2tzIHRvIGJlIGNhbGxlZC4KKyAqCS0gd2Ugd2lsbCB1c2Ugc2NjcF9jb25uZWN0aW9uX3NvY2tldCBhbmQgc2NjcF9jb25uZWN0aW9uX3dyaXRlCisgKgkgIGFuZCB2ZXJpZnkgc3RhdGUgaGFuZGxpbmcgb2YgY29ubmVjdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGN1cnJlbnRfdGVzdDsKKworLyoKKyAqIHRlc3Qgc3RhdGUuLi4KKyAqLworc3RhdGljIGludCBjYWxsZWQgID0gMDsKK3N0YXRpYyBpbnQgbWF0Y2hlZCA9IDA7CitzdGF0aWMgaW50IHdyaXRlX2NhbGxlZCA9IDA7CisKKyNkZWZpbmUgRkFJTCh4LCBhcmdzLi4uKSBwcmludGYoIkZBSUxVUkUgaW4gJXM6JWQ6ICIgeCwgX19GSUxFX18sIF9fTElORV9fLCAjIyBhcmdzKQorCisvKgorICogd3JpdGluZyB0aGVzZSBwYWNrZXRzIGFuZCBleHBlY3RpbmcgYSByZXN1bHQKKyAqLworaW50IHNjY3BfcmVhZF9jYihzdHJ1Y3QgbXNnYiAqZGF0YSwgdW5zaWduZWQgbGVuLCB2b2lkICpjb250ZXh0KQoreworCXVfaW50MTZfdCBwYXlsb2FkX2xlbmd0aCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnBheWxvYWRfbGVuZ3RoOworCWNvbnN0IHVfaW50OF90ICpnb3QsICp3YW50ZWQ7CisJaW50IGk7CisKKwljYWxsZWQgPSAxOworCisJaWYgKG1zZ2JfbDNsZW4oZGF0YSkgPCBsZW4pIHsKKwkJLyogdGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCAqLworCQlGQUlMKCJTb21ldGhpbmcgaG9ycmlibGUgaGFwcGVuZWQuLiBpbnZhbGlkIHBhY2tldC4uXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJaWYgKGxlbiA9PSAwIHx8IGxlbiAhPSBwYXlsb2FkX2xlbmd0aCkgeworCQlGQUlMKCJsZW5ndGggbWlzbWF0Y2g6IGdvdDogJWQgd2FudGVkOiAlZFxuIiwgbXNnYl9sM2xlbihkYXRhKSwgcGF5bG9hZF9sZW5ndGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGRhdGEtPmwzaFswXSAhPSAgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZmlyc3RfYnl0ZSkgeworCQlGQUlMKCJUaGUgZmlyc3QgYnl0ZXMgb2YgbDMgZG8gbm90IG1hdGNoOiAweCV4IDB4JXhcbiIsCisJCQlkYXRhLT5sM2hbMF0sIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmZpcnN0X2J5dGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJZ290ID0gJmRhdGEtPmwzaFswXTsKKwl3YW50ZWQgPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5kYXRhICsgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucGF5bG9hZF9zdGFydDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQlpZiAoZ290W2ldICE9IHdhbnRlZFtpXSkgeworCQkJRkFJTCgiRmFpbGVkIHRvIGNvbXBhcmUgYnl0ZS4gR290OiAweCV4IFdhbnRlZDogMHgleCBhdCAlZFxuIiwKKwkJCSAgICAgZ290W2ldLCB3YW50ZWRbaV0sIGkpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJbWF0Y2hlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2NjcF93cml0ZV9jYihzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY3R4KQoreworCWludCBpID0gMDsKKwljb25zdCB1X2ludDhfdCAqZ290LCAqd2FudGVkOworCisJaWYgKHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnJlc3BvbnNlID09IE5VTEwpIHsKKwkJRkFJTCgiRGlkbid0IGV4cGVjdCB3cml0ZSBjYWxsYmFja1xuIik7CisJCWdvdG8gZXhpdDsKKwl9IGVsc2UgaWYgKHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnJlc3BvbnNlX2xlbmd0aCAhPSBtc2diX2wybGVuKGRhdGEpKSB7CisJCUZBSUwoIlNpemUgZG9lcyBub3QgbWF0Y2guIEdvdDogJWQgV2FudGVkOiAlZFxuIiwKKwkJICAgICBtc2diX2wybGVuKGRhdGEpLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5yZXNwb25zZV9sZW5ndGgpOworCX0KKworCWdvdCA9ICZkYXRhLT5sMmhbMF07CisJd2FudGVkID0gdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucmVzcG9uc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnYl9sMmxlbihkYXRhKTsgKytpKSB7CisJCWlmIChnb3RbaV0gIT0gd2FudGVkW2ldKSB7CisJCQlGQUlMKCJGYWlsZWQgdG8gY29tcGFyZSBieXRlLiBHb3Q6IDB4JXggV2FudGVkOiAweCV4IGF0ICVkXG4iLAorCQkJICAgICBnb3RbaV0sIHdhbnRlZFtpXSwgaSk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwl3cml0ZV9jYWxsZWQgPSAxOworCitleGl0OgorCW1zZ2JfZnJlZShkYXRhKTsKK30KKwordm9pZCBzY2NwX2NfcmVhZChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbXNnYiAqbXNnYiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzY2NwX3JlYWRfY2IobXNnYiwgbGVuLCBjb25uZWN0aW9uLT5kYXRhX2N0eCk7Cit9CisKK3ZvaWQgc2NjcF9jX3N0YXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCBvbGRfc3RhdGUpCit7CisJaWYgKGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPj0gU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpCisJCXNjY3BfY29ubmVjdGlvbl9mcmVlKGNvbm5lY3Rpb24pOworfQorCitpbnQgc2NjcF9hY2NlcHRfY2Ioc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdm9pZCAqdXNlcl9kYXRhKQoreworCWNhbGxlZCA9IDE7CisJdW5zaWduZWQgaW50IHJlZiA9IDA7CisJcmVmIHw9IGNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZS5vY3RldDEgPDwgMjQ7CisJcmVmIHw9IGNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZS5vY3RldDIgPDwgMTY7CisJcmVmIHw9IGNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZS5vY3RldDMgPDwgIDg7CisJcmVmID0gbnRvaGwocmVmKTsKKworCWNvbm5lY3Rpb24tPmRhdGFfY2IgPSBzY2NwX2NfcmVhZDsKKwljb25uZWN0aW9uLT5zdGF0ZV9jYiA9IHNjY3BfY19zdGF0ZTsKKworCS8qIGFjY2VwdCB0aGlzICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjY3BfdWR0X3dyaXRlX2NiKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjb250ZXh0KQoreworCWNvbnN0IHVfaW50OF90ICpnb3QsICp3YW50ZWQ7CisJaW50IGk7CisKKwl3cml0ZV9jYWxsZWQgPSAxOworCisJaWYgKHNlbmRfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aCAhPSBtc2diX2wybGVuKGRhdGEpKSB7CisJCUZBSUwoIlNpemUgZG9lcyBub3QgbWF0Y2guIEdvdDogJWQgV2FudGVkOiAlZFxuIiwKKwkJICAgICBtc2diX2wybGVuKGRhdGEpLCBzZW5kX2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGgpOworCQlnb3RvIGV4aXQ7CisJfQorCisJZ290ID0gJmRhdGEtPmwyaFswXTsKKwl3YW50ZWQgPSBzZW5kX2RhdGFbY3VycmVudF90ZXN0XS5kYXRhOworCisJZm9yIChpID0gMDsgaSA8IG1zZ2JfbDJsZW4oZGF0YSk7ICsraSkgeworCQlpZiAoZ290W2ldICE9IHdhbnRlZFtpXSkgeworCQkJRkFJTCgiRmFpbGVkIHRvIGNvbXBhcmUgYnl0ZS4gR290OiAweCV4IFdhbnRlZDogMHgleCBhdCAlZFxuIiwKKwkJCSAgICAgZ290W2ldLCB3YW50ZWRbaV0sIGkpOworCQkJZ290byBleGl0OworCQl9CisJfQorCisJbWF0Y2hlZCA9IDE7CisKK2V4aXQ6CisJbXNnYl9mcmVlKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3Bfc3lzdGVtKHZvaWQpCit7CisJc2NjcF9zeXN0ZW1faW5pdChzY2NwX3dyaXRlX2NiLCBOVUxMKTsKKwlzY2NwX3NldF9yZWFkKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9yZWFkX2NiLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9hY2NlcHRfY2IsIE5VTEwpOworCisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHRlc3RfZGF0YSk7ICsrY3VycmVudF90ZXN0KSB7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGg7CisJCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKGxlbmd0aCArIDIsIDIsIF9fZnVuY19fKTsKKwkJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIGxlbmd0aCk7CisJCW1lbWNweShtc2ctPmwyaCwgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZGF0YSwgbGVuZ3RoKTsKKworCQljYWxsZWQgPSBtYXRjaGVkID0gd3JpdGVfY2FsbGVkID0gMDsKKwkJcHJpbnRmKCJUZXN0aW5nIHBhY2tldDogJWRcbiIsIGN1cnJlbnRfdGVzdCk7CisJCXNjY3Bfc3lzdGVtX2luY29taW5nKG1zZyk7CisKKwkJaWYgKCFjYWxsZWQgfHwgIW1hdGNoZWQgfHwgKHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLndyaXRlICE9IHdyaXRlX2NhbGxlZCkpCisJCQlGQUlMKCJjdXJyZW50IHRlc3Q6ICVkIGNhbGxlZDogJWQgbWF0Y2hlZDogJWQgd3JpdGU6ICVkXG4iLAorCQkJICAgICBjdXJyZW50X3Rlc3QsIGNhbGxlZCwgbWF0Y2hlZCwgd3JpdGVfY2FsbGVkKTsKKworCQltc2diX2ZyZWUobXNnKTsKKwl9Cit9CisKKy8qIHRlc3Qgc2VuZGluZyBvZiB1ZHQgKi8KK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9zZW5kX3VkdCh2b2lkKQoreworCXNjY3Bfc3lzdGVtX2luaXQoc2NjcF91ZHRfd3JpdGVfY2IsIE5VTEwpOworCXNjY3Bfc2V0X3JlYWQoTlVMTCwgTlVMTCwgTlVMTCk7CisJc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZyhOVUxMLCBOVUxMLCBOVUxMKTsKKworCWZvciAoY3VycmVudF90ZXN0ID0gMDsgY3VycmVudF90ZXN0IDwgQVJSQVlfU0laRShzZW5kX2RhdGEpOyArK2N1cnJlbnRfdGVzdCkgeworCQljb25zdCBzdHJ1Y3QgdGVzdF9kYXRhICp0ZXN0ID0gJnNlbmRfZGF0YVtjdXJyZW50X3Rlc3RdOworCisJCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKHRlc3QtPnBheWxvYWRfbGVuZ3RoLCBfX2Z1bmNfXyk7CisJCW1zZy0+bDNoID0gbXNnYl9wdXQobXNnLCB0ZXN0LT5wYXlsb2FkX2xlbmd0aCk7CisJCW1lbWNweShtc2ctPmwzaCwgdGVzdC0+ZGF0YSArIHRlc3QtPnBheWxvYWRfc3RhcnQsIHRlc3QtPnBheWxvYWRfbGVuZ3RoKTsKKworCQltYXRjaGVkID0gd3JpdGVfY2FsbGVkID0gMDsKKwkJcHJpbnRmKCJUZXN0aW5nIHBhY2tldDogJWRcbiIsIGN1cnJlbnRfdGVzdCk7CisJCXNjY3Bfd3JpdGUobXNnLCAmc2NjcF9zc25fYnNzYXAsICZzY2NwX3Nzbl9ic3NhcCwgMCk7CisKKwkJaWYgKCFtYXRjaGVkIHx8ICF3cml0ZV9jYWxsZWQpCisJCQlGQUlMKCJjdXJyZW50IHRlc3Q6ICVkIG1hdGNoZWQ6ICVkIHdyaXRlOiAlZFxuIiwKKwkJCSAgICAgY3VycmVudF90ZXN0LCBtYXRjaGVkLCB3cml0ZV9jYWxsZWQpOworCisJCW1zZ2JfZnJlZShtc2cpOworCX0KK30KKworLyogc2VuZCB1ZHQgZnJvbSBvbmUgZW5kIHRvIGFub3RoZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGVzdF92YWx1ZSA9IDB4MjQ0MjsKK3N0YXRpYyBpbnQgc2NjcF91ZHRfcmVhZChzdHJ1Y3QgbXNnYiAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwgdm9pZCAqY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgKnZhbDsKKworCWlmIChsZW4gIT0gNCkgeworCQlGQUlMKCJXcm9uZyBzaXplOiAlZFxuIiwgbXNnYl9sM2xlbihkYXRhKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl2YWwgPSAodW5zaWduZWQgaW50KilkYXRhLT5sM2g7CisJbWF0Y2hlZCA9IHRlc3RfdmFsdWUgPT0gKnZhbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzY2NwX3dyaXRlX2xvb3Aoc3RydWN0IG1zZ2IgKmRhdGEsIHZvaWQgKmNvbnRleHQpCit7CisJLyogc2VuZCBpdCBiYWNrIHRvIHVzICovCisJc2NjcF9zeXN0ZW1faW5jb21pbmcoZGF0YSk7CisJbXNnYl9mcmVlKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3BfdWR0X2NvbW11bmljYXRpb24odm9pZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgKnZhbDsKKworCXNjY3Bfc3lzdGVtX2luaXQoc2NjcF93cml0ZV9sb29wLCBOVUxMKTsKKwlzY2NwX3NldF9yZWFkKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF91ZHRfcmVhZCwgTlVMTCk7CisJc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZyhOVUxMLCBOVUxMLCBOVUxMKTsKKworCisJZGF0YSA9IG1zZ2JfYWxsb2MoNCwgInRlc3QgZGF0YSIpOworCWRhdGEtPmwzaCA9ICZkYXRhLT5kYXRhWzBdOworCXZhbCA9ICh1bnNpZ25lZCBpbnQgKiltc2diX3B1dChkYXRhLCA0KTsKKwkqdmFsID0gdGVzdF92YWx1ZTsKKworCW1hdGNoZWQgPSAwOworCXNjY3Bfd3JpdGUoZGF0YSwgJnNjY3Bfc3NuX2Jzc2FwLCAmc2NjcF9zc25fYnNzYXAsIDApOworCisJaWYgKCFtYXRjaGVkKQorCSAgICBGQUlMKCJUYWxraW5nIHdpdGggdXMgZGlkbid0IHdvcmtcbiIpOworCisJbXNnYl9mcmVlKGRhdGEpOworfQorCisKKy8qIGNvbm5lY3Rpb24gdGVzdGluZy4uLiBvcGVuLCBzZW5kLCBjbG9zZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25uZWN0aW9uX3Rlc3QgKmN1cnJlbnRfY29uX3Rlc3Q7CitzdGF0aWMgc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqb3V0Z29pbmdfY29uOworc3RhdGljIHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmluY29taW5nX2NvbjsKK3N0YXRpYyBpbnQgb3V0Z29pbmdfZGF0YSwgaW5jb21pbmdfZGF0YSwgaW5jb21pbmdfc3RhdGUsIG91dGdvaW5nX3N0YXRlOworCitzdGF0aWMgc3RydWN0IG1zZ2IgKnRlc3RfZGF0YTEsICp0ZXN0X2RhdGEyLCAqdGVzdF9kYXRhMzsKKworc3RhdGljIHZvaWQgc2NjcF9jb25uX2luX3N0YXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIGludCBvbGRfc3RhdGUpCit7CisJcHJpbnRmKCJcdGluY29tZTogJWQgLT4gJWRcbiIsIG9sZF9zdGF0ZSwgY29ubi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisJaWYgKGNvbm4tPmNvbm5lY3Rpb25fc3RhdGUgPj0gU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpIHsKKwkJaWYgKGNvbm4gPT0gaW5jb21pbmdfY29uKSB7CisJCQlzY2NwX2Nvbm5lY3Rpb25fZnJlZShjb25uKTsKKwkJCWluY29taW5nX2NvbiA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjY3BfY29ubl9pbl9kYXRhKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2csIHVuc2lnbmVkIGludCBsZW4pCit7CisJLyogY29tcGFyZSB0aGUgZGF0YSAqLworCSsraW5jb21pbmdfZGF0YTsKKwlwcmludGYoIlx0aW5jb21pbmcgZGF0YTogJWRcbiIsIGxlbik7CisKKwkvKiBjb21wYXJlIHRoZSBkYXRhICovCisJaWYgKGxlbiAhPSA0KSB7CisJCUZBSUwoIkxlbmd0aCBvZiBwYWNrZXQgaXMgd3Jvbmc6ICV1ICV1XG4iLCBtc2diX2wzbGVuKG1zZyksIGxlbik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5jb21pbmdfZGF0YSA9PSAxKSB7CisJCWlmIChtZW1jbXAobXNnLT5sM2gsIHRlc3RfZGF0YTEtPmwzaCwgbGVuKSAhPSAwKSB7CisJCQlGQUlMKCJDb21wYXJpbmcgdGhlIGRhdGEgZmFpbGVkOiAlZFxuIiwgaW5jb21pbmdfZGF0YSk7CisJCQlpbmNvbWluZ19zdGF0ZSA9IDA7CisJCQlwcmludGYoIkdvdDogICAgJXNcbiIsIGhleGR1bXAobXNnLT5sM2gsIGxlbikpOworCQkJcHJpbnRmKCJXYW50ZWQ6ICVzXG4iLCBoZXhkdW1wKHRlc3RfZGF0YTEtPmwzaCwgbGVuKSk7CisKKwkJfQorCX0gZWxzZSBpZiAoaW5jb21pbmdfZGF0YSA9PSAyKSB7CisJCWlmIChtZW1jbXAobXNnLT5sM2gsIHRlc3RfZGF0YTItPmwzaCwgbGVuKSAhPSAwKSB7CisJCQlGQUlMKCJDb21wYXJpbmcgdGhlIGRhdGEgZmFpbGVkOiAlZFxuIiwgaW5jb21pbmdfZGF0YSk7CisJCQlpbmNvbWluZ19zdGF0ZSA9IDA7CisJCQlwcmludGYoIkdvdDogICAgJXNcbiIsIGhleGR1bXAobXNnLT5sM2gsIGxlbikpOworCQkJcHJpbnRmKCJXYW50ZWQ6ICVzXG4iLCBoZXhkdW1wKHRlc3RfZGF0YTItPmwzaCwgbGVuKSk7CisJCX0KKwl9CisKKwkvKiBzZW5kaW5nIG91dCBkYXRhICovCisJaWYgKGluY29taW5nX2RhdGEgPT0gMikgeworCQlwcmludGYoIlx0UmV0dXJuaW5nIGRhdGEzXG4iKTsKKwkJc2NjcF9jb25uZWN0aW9uX3dyaXRlKGNvbm4sIHRlc3RfZGF0YTMpOworCX0KK30KKworc3RhdGljIGludCBzY2NwX2Nvbm5fYWNjZXB0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHZvaWQgKmN0eCkKK3sKKwlwcmludGYoIlx0YWNjZXB0OiAlcFxuIiwgY29ubik7CisJY29ubi0+c3RhdGVfY2IgPSBzY2NwX2Nvbm5faW5fc3RhdGU7CisJY29ubi0+ZGF0YV9jYiA9IHNjY3BfY29ubl9pbl9kYXRhOworCisJaWYgKGN1cnJlbnRfY29uX3Rlc3QtPnJlZnVzZSkKKwkJcmV0dXJuIC0xOworCisJaW5jb21pbmdfY29uID0gY29ubjsKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGJhY2tzIGZvciB0aGUgb3V0Z29pbmcgc2lkZSAqLworc3RhdGljIHZvaWQgc2NjcF9jb25uX291dF9zdGF0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBpbnQgb2xkX3N0YXRlKQoreworCXByaW50ZigiXHRvdXRnb2luZzogJXAgJWQgLT4gJWRcbiIsIGNvbm4sIG9sZF9zdGF0ZSwgY29ubi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisKKwlpZiAoY29ubi0+Y29ubmVjdGlvbl9zdGF0ZSA+PSBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSkgeworCQlpZiAoY29ubiA9PSBvdXRnb2luZ19jb24pIHsKKwkJCXNjY3BfY29ubmVjdGlvbl9mcmVlKGNvbm4pOworCQkJb3V0Z29pbmdfY29uID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2NjcF9jb25uX291dF9kYXRhKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2csIHVuc2lnbmVkIGludCBsZW4pCit7CisJKytvdXRnb2luZ19kYXRhOworCXByaW50ZigiXHRvdXRnb2luZyBkYXRhOiAlcCAlZFxuIiwgY29ubiwgbGVuKTsKKworCWlmIChsZW4gIT0gNCkKKwkJRkFJTCgiTGVuZ3RoIG9mIHBhY2tldCBpcyB3cm9uZzogJXUgJXVcbiIsIG1zZ2JfbDNsZW4obXNnKSwgbGVuKTsKKworCWlmIChvdXRnb2luZ19kYXRhID09IDEpIHsKKwkJaWYgKG1lbWNtcChtc2ctPmwzaCwgdGVzdF9kYXRhMy0+bDNoLCBsZW4pICE9IDApIHsKKwkJCUZBSUwoIkNvbXBhcmluZyB0aGUgZGF0YSBmYWlsZWRcbiIpOworCQkJb3V0Z29pbmdfc3RhdGUgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkb190ZXN0X3NjY3BfY29ubmVjdGlvbihjb25zdCBzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0ICp0ZXN0KQoreworCWludCByZXQ7CisKKwljdXJyZW50X2Nvbl90ZXN0ID0gdGVzdDsKKwlvdXRnb2luZ19jb24gPSBpbmNvbWluZ19jb24gPSAwOworCisJb3V0Z29pbmdfY29uID0gc2NjcF9jb25uZWN0aW9uX3NvY2tldCgpOworCWlmICghb3V0Z29pbmdfY29uKSB7CisJCUZBSUwoIkNvbm5lY3Rpb24gaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlvdXRnb2luZ19jb24tPnN0YXRlX2NiID0gc2NjcF9jb25uX291dF9zdGF0ZTsKKwlvdXRnb2luZ19jb24tPmRhdGFfY2IgPSBzY2NwX2Nvbm5fb3V0X2RhdGE7CisJb3V0Z29pbmdfZGF0YSA9IGluY29taW5nX2RhdGEgPSAwOworCWluY29taW5nX3N0YXRlID0gb3V0Z29pbmdfc3RhdGUgPSAxOworCisJLyogc3RhcnQgdGVzdGluZyAqLworCWlmICh0ZXN0LT53aXRoX2RhdGEpIHsKKwkJaWYgKHNjY3BfY29ubmVjdGlvbl9jb25uZWN0KG91dGdvaW5nX2NvbiwgJnNjY3Bfc3NuX2Jzc2FwLCB0ZXN0X2RhdGExKSAhPSAwKQorCQkJRkFJTCgiQmluZGluZyBmYWlsZWRcbiIpOworCX0gZWxzZSB7CisJCSsraW5jb21pbmdfZGF0YTsKKwkJaWYgKHNjY3BfY29ubmVjdGlvbl9jb25uZWN0KG91dGdvaW5nX2NvbiwgJnNjY3Bfc3NuX2Jzc2FwLCBOVUxMKSAhPSAwKQorCQkJRkFJTCgiQmluZGluZyBmYWlsZWRcbiIpOworCX0KKworCWlmICh0ZXN0LT5yZWZ1c2UpIHsKKwkJaWYgKG91dGdvaW5nX2NvbikKKwkJCUZBSUwoIk91dGdvaW5nIGNvbm5lY3Rpb24gc2hvdWxkIGhhdmUgYmVlbiByZWZ1c2VkLlxuIik7CisJfSBlbHNlIHsKKwkJaWYgKCFpbmNvbWluZ19jb24pCisJCQlGQUlMKCJDcmVhdGluZyBpbmNvbWluZyBkaWRuJ3Qgd29yay5cbiIpOworCisJCXByaW50ZigiXHRXcml0aW5nIHRlc3QgZGF0YTJcbiIpOworCQlzY2NwX2Nvbm5lY3Rpb25fd3JpdGUob3V0Z29pbmdfY29uLCB0ZXN0X2RhdGEyKTsKKwkJc2NjcF9jb25uZWN0aW9uX3NlbmRfaXQob3V0Z29pbmdfY29uKTsKKworCQkvKiBjbG9zaW5nIGNvbm5lY3Rpb24gKi8KKwkJaWYgKHRlc3QtPmNsb3NlX3NpZGUgPT0gMCkKKwkJCXJldCA9IHNjY3BfY29ubmVjdGlvbl9jbG9zZShvdXRnb2luZ19jb24sIDApOworCQllbHNlCisJCQlyZXQgPSBzY2NwX2Nvbm5lY3Rpb25fY2xvc2UoaW5jb21pbmdfY29uLCAwKTsKKworCQlpZiAocmV0ICE9IDApCisJCQlGQUlMKCJDbG9zaW5nIHRoZSBjb25uZWN0aW9uIGZhaWxlZFxuIik7CisJfQorCisJLyogb3V0Z29pbmcgc2hvdWxkIGJlIGdvbmUgbm93ICovCisJaWYgKG91dGdvaW5nX2NvbikKKwkJRkFJTCgiT3V0Z29pbmcgY29ubmVjdGlvbiB3YXMgbm90IHByb3Blcmx5IGNsb3NlZFxuIik7CisKKwlpZiAoaW5jb21pbmdfY29uKQorCQlGQUlMKCJJbmNvbWluZyBjb25uZWN0aW9uIHdhcyBub3QgcHJvcGVyeSBjbG9zZWQuXG4iKTsKKworCWlmICh0ZXN0LT5yZWZ1c2UgPT0gMCkgeworCQlpZiAob3V0Z29pbmdfZGF0YSAhPSAxIHx8IGluY29taW5nX2RhdGEgIT0gMikgeworCQkJRkFJTCgiRGF0YSBzZW5kaW5nIGZhaWxlZDogJWQvJWQgJWQvJWRcbiIsCisJCQkgICAgIG91dGdvaW5nX2RhdGEsIDEsCisJCQkgICAgIGluY29taW5nX2RhdGEsIDIpOworCQl9CisJfQorCisJaWYgKCFpbmNvbWluZ19zdGF0ZSB8fCAhb3V0Z29pbmdfc3RhdGUpCisJCUZBSUwoIkZhaWx1cmUgd2l0aCB0aGUgc3RhdGUgdHJhbnNpdGlvbi4gJWQgJWRcbiIsCisJCSAgICAgb3V0Z29pbmdfc3RhdGUsIGluY29taW5nX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zY2NwX2Nvbm5lY3Rpb24odm9pZCkKK3sKKwlzY2NwX3N5c3RlbV9pbml0KHNjY3Bfd3JpdGVfbG9vcCwgTlVMTCk7CisJc2NjcF9zZXRfcmVhZChOVUxMLCBOVUxMLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9jb25uX2FjY2VwdCwgTlVMTCk7CisKKwl0ZXN0X2RhdGExID0gbXNnYl9hbGxvYyg0LCAiZGF0YTEiKTsKKwl0ZXN0X2RhdGExLT5sM2ggPSBtc2diX3B1dCh0ZXN0X2RhdGExLCA0KTsKKwkqKCh1bnNpZ25lZCBpbnQqKXRlc3RfZGF0YTEtPmwzaCkgPSAweDIzNDIxMTIyOworCisJdGVzdF9kYXRhMiA9IG1zZ2JfYWxsb2MoNCwgImRhdGEyIik7CisJdGVzdF9kYXRhMi0+bDNoID0gbXNnYl9wdXQodGVzdF9kYXRhMiwgNCk7CisJKigodW5zaWduZWQgaW50Kil0ZXN0X2RhdGEyLT5sM2gpID0gMHg0MjIzMjIxMTsKKworCXRlc3RfZGF0YTMgPSBtc2diX2FsbG9jKDQsICJkYXRhMyIpOworCXRlc3RfZGF0YTMtPmwzaCA9IG1zZ2JfcHV0KHRlc3RfZGF0YTMsIDQpOworCSooKHVuc2lnbmVkIGludCopdGVzdF9kYXRhMy0+bDNoKSA9IDB4MjMyM2ZmNTU7CisKKworCWZvciAoY3VycmVudF90ZXN0ID0gMDsgY3VycmVudF90ZXN0IDwgQVJSQVlfU0laRShjb25uZWN0aW9uX3Rlc3RzKTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJcHJpbnRmKCJUZXN0aW5nICVkIHJlZnVzZTogJWQgd2l0aF9kYXRhOiAlZFxuIiwKKwkJCWN1cnJlbnRfdGVzdCwgY29ubmVjdGlvbl90ZXN0c1tjdXJyZW50X3Rlc3RdLnJlZnVzZSwKKwkJCWNvbm5lY3Rpb25fdGVzdHNbY3VycmVudF90ZXN0XS53aXRoX2RhdGEpOworCQlkb190ZXN0X3NjY3BfY29ubmVjdGlvbigmY29ubmVjdGlvbl90ZXN0c1tjdXJyZW50X3Rlc3RdKTsKKwl9CisKKwltc2diX2ZyZWUodGVzdF9kYXRhMSk7CisJbXNnYl9mcmVlKHRlc3RfZGF0YTIpOworCW1zZ2JfZnJlZSh0ZXN0X2RhdGEzKTsKK30KKworLyogaW52YWxpZCBpbnB1dCAqLworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3N5c3RlbV9jcmFzaCh2b2lkKQoreworCXByaW50ZigidHJ5aW5nIHRvIHByb3Zva2UgYSBjcmFzaCB3aXRoIGludmFsaWQgaW5wdXRcbiIpOworCXNjY3Bfc2V0X3JlYWQoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX3JlYWRfY2IsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX2FjY2VwdF9jYiwgTlVMTCk7CisKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUodGVzdF9kYXRhKTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJaW50IG9yaWdpbmFsX2xlbmd0aCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aDsKKwkJaW50IGxlbmd0aCA9IG9yaWdpbmFsX2xlbmd0aCArIDI7CisJCWludCBpOworCisJCXByaW50ZigiVGVzdGluZyBwYWNrZXQ6ICVkXG4iLCBjdXJyZW50X3Rlc3QpOworCisJCWZvciAoaSA9IGxlbmd0aDsgaSA+PSAwOyAtLWkpIHsKKwkJCXVuc2lnbmVkIGludCBsZW5ndGggPSBNSU4odGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ubGVuZ3RoLCBpKTsKKwkJCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKGxlbmd0aCArIDIsIDIsIF9fZnVuY19fKTsKKwkJCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBsZW5ndGgpOworCQkJbWVtY3B5KG1zZy0+bDJoLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5kYXRhLCBsZW5ndGgpOworCQkJc2NjcF9zeXN0ZW1faW5jb21pbmcobXNnKTsKKwkJCW1zZ2JfZnJlZShtc2cpOworCQl9CisJfQorCisJcHJpbnRmKCJzdXJ2aXZlZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9wYXJzaW5nKHZvaWQpCit7CisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHBhcnNlX3Jlc3VsdCk7ICsrY3VycmVudF90ZXN0KSB7CisJCXN0cnVjdCBtc2diICptc2c7CisJCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisKKwkJbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbSgxMDI0LCAxMjgsICJwYXJzZS10ZXN0Iik7CisJCW1zZ2JfcHV0KG1zZywgMSk7CisJCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5pbnB1dF9sZW4pOworCQltZW1jcHkobXNnLT5sMmgsIHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmlucHV0LCBtc2diX2wybGVuKG1zZykpOworCisJCW1lbXNldCgmcmVzdWx0LCAwLCBzaXplb2YocmVzdWx0KSk7CisJCWlmIChzY2NwX3BhcnNlX2hlYWRlcihtc2csICZyZXN1bHQpICE9IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHNjY3AgcGFyc2UgdGVzdDogJWRcbiIsIGN1cnJlbnRfdGVzdCk7CisJCX0gZWxzZSB7CisJCQlpZiAocGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0ud2FudGVkX2xlbiAhPSByZXN1bHQuZGF0YV9sZW4pIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlVuZXhwZWN0ZWQgZGF0YSBsZW5ndGguXG4iKTsKKwkJCQlhYm9ydCgpOworCQkJfQorCisJCQlpZiAocGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uaGFzX3NyY19yZWYpIHsKKwkJCQlpZiAobWVtY21wKHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJCQkgICAmcGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uc3JjX3JlZiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKSAhPSAwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiU1JDIFJFRiBkaWQgbm90IG1hdGNoXG4iKTsKKwkJCQkJYWJvcnQoKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5oYXNfZHN0X3JlZikgeworCQkJCWlmIChtZW1jbXAocmVzdWx0LmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCQkJICAgJnBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmRzdF9yZWYsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSkgIT0gMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkRTVCBSRUYgZGlkIG5vdCBtYXRjaFxuIik7CisJCQkJCWFib3J0KCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAocGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uc3JjX3NzbiAhPSAtMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiTm90IGltcGxlbWVudGVkLlxuIik7CisJCQkJYWJvcnQoKTsKKwkJCX0KKworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmRzdF9zc24gIT0gLTEpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBpbXBsZW1lbnRlZC5cbiIpOworCQkJCWFib3J0KCk7CisJCQl9CisJCX0KKworCQltc2diX2ZyZWUobXNnKTsKKwl9Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXRlc3Rfc2NjcF9zeXN0ZW0oKTsKKwl0ZXN0X3NjY3Bfc2VuZF91ZHQoKTsKKwl0ZXN0X3NjY3BfdWR0X2NvbW11bmljYXRpb24oKTsKKwl0ZXN0X3NjY3BfY29ubmVjdGlvbigpOworCXRlc3Rfc2NjcF9zeXN0ZW1fY3Jhc2goKTsKKwl0ZXN0X3NjY3BfcGFyc2luZygpOworCXJldHVybiAwOworfQorCit2b2lkIGRiX3N0b3JlX2NvdW50ZXIoKSB7fQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9zbXMudHh0IGIvb3BlbmJzYy90ZXN0cy9zbXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Yzg4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL3Ntcy50eHQKQEAgLTAsMCArMSw1MCBAQAorMDMgMDIgMDEgMGEgMDIgNDMgMGIgMDAgMWQgMzkgMDEgMWEgMDAgMDEgMDAgMDcgOTEgNTUgMTEgMTggMzEgMjggMDAgMGUgMzEgMjAgMDQgODEgMjEgNDMgMDAgMDAgZmYgMDQgZDQgZjIgOWMgMGUKKworMDMgMDIgMDEgMGEgMDIgNDMgMGIgMDAgMWQgLQorMzkgLSBUcmFuc2FjdGlvbklEIDMsIFNNUyBtZXNzYWdlcwk6OiBnaC0+cHJvdG9fZGlzY3IKKzAxIC0gQ1AtREFUQQkJCQk6OiBnaC0+bXNnX3R5cGUKKzFhIC0gTGVuZ3RoOiAyNgkJCQk6OiBnaC0+ZGF0YVswXQorMDAgLSBNVEkgMCBSUC1EQVRBIChtcy0+bikKKzAxIC0gTVIgMQorMDAgLSBSUC1PQQorMDcgLSBSUC1EQSAoU01TQyBMZW5ndGgpCis5MSAtIEludGVybmF0aW9uYWwgTm8sIE51bWJlcmluZyBQbGFuCis1NSAxMSAxOCAzMSAyOCAwMCAtIDU1MTE4MTEzODIwMAorMGUgLSBSUC1VRCBsZW4gKDE0KQorCitUUERVICgxNCBieXRlKToKKzMxIC0gTVRJKDAxKSwgVlBGKDI6cmVsYXRpdmUpLCBNTVMoMCksIFNSSSgxKSwgVURISSgwKSwgUlAoMCkKKzIwIC0gTWVzc2FnZSBSZWZlcmVuY2UKKzA0IC0gREEgbGVuZ3RoCis4MSAtIE51bWJlcmluZyBQbGFuLCBOYXRpb25hbCBudW1iZXIKKzIxIDQzIC0gREEgMTIzNAorMDAgLSBQSUQKKzAwIC0gRENTCitmZiAtIFZhbGlkaXR5IHBlcmlvZAorMDQgLSBVc2VyIERhdGEgbGVuZ3RoICgwNCkKK2Q0IGYyIDljIDBlIC0gZ3NtX2RlZmF1bHQgN2JpdCBlbmNvZGVkICJUZXN0IiAoNCBieXRlKQorCiswMyAwMiAwMSAwYSAwMiA0MyAwYiAwMCA5ZiAwOSAwMSA5YyAwMCBkYSAwMCAwNyA5MSA4OCA5NiAxMyAwMCAwMCA5OSA5MCAxMSA3YiAwNCA4MSAyMiAyMiAwMCAwOCBmZiA4NiA2YyAzOCA4YyA1MCA5MiA4MCA4OCA0YyAwMCA0ZCAwMCA0ZCAwMCA0MSA2YSAxOSA2NyAwMyA3NCAwNiA4YyBhMSA3ZCBiMiAwMCAyMCAwMCAyMCA1MSA2OCA3NCAwMyA5OSA5NiA1MiA3NSA3ZCBiMiA4ZCBlZiA2YSAxOSA2NyAwMyBmZiAwYyA2YSAxOSA2NyAwMyA5NiBmNiA5OCBhOCA5NiBhYSBmZiAwMSA4YiA5MyA2MCBhOCA4MCA3MCA2NiAwZSA1MSAzMiA4NCBjNCBmZiAwYyA5NyA0OCA2ZCAzYiA2MiA5NSA4YyBjNyBmZiAwMSA3MyBmZSA1NyAyOCA1MiBhMCA1MSA2NSA5MCAwMSA5NiA1MCA5MSBjZiA1OSAyNyA4MCA2ZiA3NiBkZiA2ZCAwYiA1NyBmYSA5NiA4YSA5MSA3NyA1ZSA2MyA1MyA2MSBmZiAwYyA4YSBjYiA0ZSAwYSA3ZCBiMiA2NCAxYyA1YyAwYiAzMCAwYyA2YSAxOSA2NyAwMyAzMCAwZAorCiswMyAwMiAwMSAwYSAwMiA0MyAwYiAwMCA5ZiAtIGxvd2VyIGxldmVscworMDkgLSBUcmFuc2FjdGlvbklEIDAsIFNNUyBtZXNzYWdlcworMDEgLSBDUC1EQVRBCis5YyAtIExlbmd0aDogKDE1NikKKzAwIC0gTVRJIDAgUlAtREFUQSAobXMtPm4pCitkYSAtIE1SICg/KQorMDAgLSBSUC1PQQorMDcgLSBSUC1EQSAoU01TQyBMZW5ndGgpCis5MSAtIEludGVybmF0aW9uYWwgTm8uCis4OCA5NiAxMyAwMCAwMCA5OQorOTAgLSBSUC1VRCBsZW4gKDE0NCkKKzExIC0KKzdiIC0gTWVzc2FnZSBSZWZlcmVuY2UKKzA0IC0gREEgbGVuZ3RoCis4MSAtIE51bWJlcmluZyBQbGFuCisyMiAyMiAtIEFkZHJlc3MgMjIyMgorMDAgLSBQSUQKKzA4IC0gRENTIChVQ1MyIGNoYXJzZXQpCitmZiAtIFZhbGlkaXR5IHBlcmlvZAorODYgLSBVc2VyIERhdGEgbGVuZ3RoICgxMzQpCis2YyAzOCA4YyA1MCA5MiA4MCA4OCA0YyAwMCA0ZCAwMCA0ZCAwMCA0MSA2YSAxOSA2NyAwMyA3NCAwNiA4YyBhMSA3ZCBiMiAwMCAyMCAwMCAyMCA1MSA2OCA3NCAwMyA5OSA5NiA1MiA3NSA3ZCBiMiA4ZCBlZiA2YSAxOSA2NyAwMyBmZiAwYyA2YSAxOSA2NyAwMyA5NiBmNiA5OCBhOCA5NiBhYSBmZiAwMSA4YiA5MyA2MCBhOCA4MCA3MCA2NiAwZSA1MSAzMiA4NCBjNCBmZiAwYyA5NyA0OCA2ZCAzYiA2MiA5NSA4YyBjNyBmZiAwMSA3MyBmZSA1NyAyOCA1MiBhMCA1MSA2NSA5MCAwMSA5NiA1MCA5MSBjZiA1OSAyNyA4MCA2ZiA3NiBkZiA2ZCAwYiA1NyBmYSA5NiA4YSA5MSA3NyA1ZSA2MyA1MyA2MSBmZiAwYyA4YSBjYiA0ZSAwYSA3ZCBiMiA2NCAxYyA1YyAwYiAzMCAwYyA2YSAxOSA2NyAwMyAzMCAwZAorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rvb2xzL2hscnN0YXQucGwgYi9vcGVuYnNjL3Rvb2xzL2hscnN0YXQucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjY4ZmM5YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdG9vbHMvaGxyc3RhdC5wbApAQCAtMCwwICsxLDczIEBACisjIS91c3IvYmluL3BlcmwKKwordXNlIHN0cmljdDsKK3VzZSBEQkk7CitteSAkZGJoID0gREJJLT5jb25uZWN0KCJkYmk6U1FMaXRlOmRibmFtZT1obHIuc3FsaXRlMyIsIiIsIiIpOworCisKK215ICVtY2NfbmFtZXM7CitteSAlbWNjX21uY19uYW1lczsKKworc3ViIGdldF9tY2NfbW5jX25hbWUoJCkKK3sKKwlteSAkbWNjX21uYyA9IHNoaWZ0OworCW15ICRyZXQgPSAkbWNjX21uYzsKKworCWlmICgkbWNjX21uY19uYW1lc3skbWNjX21uY30gbmUgJycpIHsKKwkJJHJldCA9ICRtY2NfbW5jX25hbWVzeyRtY2NfbW5jfTsKKwl9CisKKwlyZXR1cm4gJHJldDsKK30KKworc3ViIHJlYWRfbmV0d29ya3MoJCkKK3sKKwlteSAkZmlsZW5hbWUgPSBzaGlmdDsKKwlteSAkY3VyX25hbWU7CisKKwlvcGVuKElORklMRSwgJGZpbGVuYW1lKTsKKwl3aGlsZSAobXkgJGwgPSA8SU5GSUxFPikgeworCQljaG9tcCgkbCk7CisJCWlmICgkbCA9fiAvXiMvKSB7CisJCQluZXh0OworCQl9CisJCWlmICgkbCA9fiAvXlx0LykgeworCQkJbXkgKCRtY2MsICRtbmMsICRicmFuZCwgJHIpID0gc3BsaXQoJyAnLCAkbCwgNCk7CisJCQkjcHJpbnRmKCIlc3wlc3wlc1xuIiwgJG1jYywgJG1uYywgJGJyYW5kKTsKKwkJCSRtY2NfbW5jX25hbWVzeyIkbWNjLSRtbmMifSA9ICRicmFuZDsKKwkJCSRtY2NfbmFtZXN7JG1jY30gPSAkY3VyX25hbWU7CisJCX0gZWxzaWYgKCRsID1+IC9eKFx3XHcpXHQoLiopLykgeworCQkJI3ByaW50ZigiJXN8JXNcbiIsICQxLCAkMik7CisJCQkkY3VyX25hbWUgPSAkMjsKKwkJfQorCX0KKwljbG9zZShJTkZJTEUpOworfQorCityZWFkX25ldHdvcmtzKCJuZXR3b3Jrcy50YWIiKTsKKworbXkgJW9wZXJfY291bnQ7CitteSAlY291bnRyeV9jb3VudDsKKworI215ICRzdGggPSAkZGJoLT5wcmVwYXJlKCJTRUxFQ1QgaW1zaSBGUk9NIHN1YnNjcmliZXIgd2hlcmUgYXV0aG9yaXplZD0xIik7CitteSAkc3RoID0gJGRiaC0+cHJlcGFyZSgiU0VMRUNUIGltc2kgRlJPTSBzdWJzY3JpYmVyIik7CisKKyRzdGgtPmV4ZWN1dGUoKTsKKword2hpbGUgKG15ICRocmVmID0gJHN0aC0+ZmV0Y2hyb3dfaGFzaHJlZikgeworCW15ICgkbWNjLCAkbW5jKSA9ICQkaHJlZntpbXNpfSA9fiAvKFxkezN9KShcZHsyfSkuKi87CisJI3ByaW50ZigiJXMgJXMtJXMgXG4iLCAkJGhyZWZ7aW1zaX0sICRtY2MsICRtbmMpOworCSRvcGVyX2NvdW50eyIkbWNjLSRtbmMifSsrOworCSRjb3VudHJ5X2NvdW50eyRtY2N9Kys7Cit9CisKKworZm9yZWFjaCBteSAkYyAoc29ydHskY291bnRyeV9jb3VudHskYn0gPD0+ICRjb3VudHJ5X2NvdW50eyRhfX0ga2V5cyAlY291bnRyeV9jb3VudCkgeworCXByaW50ZigiJXM6ICVkXG4iLCAkbWNjX25hbWVzeyRjfSwgJGNvdW50cnlfY291bnR7JGN9KTsKKworCWZvcmVhY2ggbXkgJGsgKHNvcnR7JG9wZXJfY291bnR7JGJ9IDw9PiAkb3Blcl9jb3VudHskYX19IGtleXMgJW9wZXJfY291bnQpIHsKKwkJaWYgKCRrID1+IC9eJGMtLykgeworCQkJcHJpbnRmKCJcdCVzOiAlZFxuIiwgZ2V0X21jY19tbmNfbmFtZSgkayksICRvcGVyX2NvdW50eyRrfSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy8uZ2l0aWdub3JlIGIvcnJscC1lcGhlbWVyaXMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGI0NWU0Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDQgQEAKK2FzbjFfZ2VuLyoKKyoubworKi5hCitycmxwLXRlc3QKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL0NPUFlJTkcgYi9ycmxwLWVwaGVtZXJpcy9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNzA4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9DT1BZSU5HCkBAIC0wLDAgKzEsMiBAQAorU2VlIHRoZSBpbmNsdWRlZCBncGwtMi4wLnR4dCBvciBncGwtMy4wLnR4dCBkZXBlbmRpbmcgb24geW91cgorcHJlZmVyZW5jZXMuCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9NYWtlZmlsZSBiL3JybHAtZXBoZW1lcmlzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MmNhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQ0IEBACisKK0FTTjFDPS4uLy4uLy4uL3RtcC9ycmxwL2FzbjFjL2FzbjFjL2FzbjFjCitBU04xX0lOQ0xVREU9L2hvbWUvdG50L3RtcC9ycmxwL2FzbjFjL3NrZWxldG9ucworQ0M9Z2NjCitDRkxBR1M9LUkkKEFTTjFfSU5DTFVERSkgLUlhc24xX2dlbiAtTzMgLVdhbGwKKworQVNOMV9GSUxFUz0kKHdpbGRjYXJkIGFzbjEvKi5hc24pCisKKworYWxsOiBycmxwLXRlc3QKKworCitycmxwLXRlc3Q6IGxpYmdzbS1hc24xLmEgZ3BzLm8gdWJ4Lm8gdWJ4LXBhcnNlLm8gcnJscC5vIG1haW4ubworCSQoQ0MpIC1vICRAIGdwcy5vIHVieC5vIHVieC1wYXJzZS5vIHJybHAubyBtYWluLm8gLUwuIC1sZ3NtLWFzbjEgLWxtCisKKworIworIyBBU04xIGZpbGUgYXV0b2dlbmVyYXRpb24gKG5lZWQgcmVjdXJzaXZlIG1ha2VmaWxlIGNhbGwpCisjCisKK0FTTjFfU09VUkNFUyA9ICQod2lsZGNhcmQgYXNuMV9nZW4vKi5jKQorQVNOMV9PQkpFQ1RTID0gJChBU04xX1NPVVJDRVM6LmM9Lm8pCisKK2xpYmdzbS1hc24xLmE6ICQoQVNOMV9GSUxFUykKKwlta2RpciAtcCBhc24xX2dlbiAmJiBcCisJY2QgYXNuMV9nZW4gJiYgXAorCSQoQVNOMUMpIC1mc2tlbGV0b25zLWNvcHkgLWZuYXRpdmUtdHlwZXMgLWdlbi1QRVIgJChhZGRwcmVmaXggLi4vLCReKQorCUBybSBhc24xX2dlbi9jb252ZXJ0ZXItc2FtcGxlLmMgYXNuMV9nZW4vTWFrZWZpbGUuYW0uc2FtcGxlCisJQCQoTUFLRSkgbGliZ3NtLWFzbjEuYS5zdWJtYWtlCisKK2xpYmdzbS1hc24xLmEuc3VibWFrZTogJChBU04xX09CSkVDVFMpCisJJChBUikgcmNzIGxpYmdzbS1hc24xLmEgJF4KKworLlBIT05ZOiBsaWJnc20tYXNuMS5hLnN1Ym1ha2UKKworCisjCisjIENsZWFuCisjCisKK2NsZWFuOgorCXJtIC1SZiBhc24xX2dlbgorCXJtIC1mIGxpYmdzbS1hc24xLmEgKi5vIHJybHAtdGVzdAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1CUy1Db2RlLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUJTLUNvZGUuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjUzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1CUy1Db2RlLmFzbgpAQCAtMCwwICsxLDEzMSBAQAorLS0gJElkOiBNQVAtQlMtQ29kZS5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgCistLSAxNy43LjEwCUJlYXJlciBTZXJ2aWNlIENvZGVzCisgCitNQVAtQlMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1CUy1Db2RlICgyMCkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKKzo6PQorCitCRUdJTgorCitCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKKwktLSBiZWFyZXIgc2VydmljZSwgYSBncm91cCBvZiBiZWFyZXIgc2VydmljZXMsIG9yIGFsbCBiZWFyZXIKKwktLSBzZXJ2aWNlcy4gVGhlIHNlcnZpY2VzIGFyZSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjIuMDAyIFszXS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLQorCS0tIHBsbW4tc3BlY2lmaWMgYmVhcmVyIHNlcnZpY2VzOgorCS0tIGJpdHMgODc2NTQzMjE6IGRlZmluZWQgYnkgdGhlIEhQTE1OIG9wZXJhdG9yCisKKwktLSByZXN0IG9mIGJlYXJlciBzZXJ2aWNlczoKKwktLSBiaXQgODogMCAodW51c2VkKQorCS0tIGJpdHMgNzY1NDMyMTogZ3JvdXAgKGJpdHMgNzY1NCksIGFuZCByYXRlLCBpZiBhcHBsaWNhYmxlCisJLS0gKGJpdHMgMzIxKQorCitFeHQtQmVhcmVyU2VydmljZUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gYmVhcmVyIHNlcnZpY2UsIGEgZ3JvdXAgb2YgYmVhcmVyIHNlcnZpY2VzLCBvciBhbGwgYmVhcmVyCisJLS0gc2VydmljZXMuIFRoZSBzZXJ2aWNlcyBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAwMiBbM10uCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0KKwktLSBPQ1RFVCAxOgorCS0tIHBsbW4tc3BlY2lmaWMgYmVhcmVyIHNlcnZpY2VzOgorCS0tIGJpdHMgODc2NTQzMjE6IGRlZmluZWQgYnkgdGhlIEhQTE1OIG9wZXJhdG9yCisJLS0KKwktLSByZXN0IG9mIGJlYXJlciBzZXJ2aWNlczoKKwktLSBiaXQgODogMCAodW51c2VkKQorCS0tIGJpdHMgNzY1NDMyMTogZ3JvdXAgKGJpdHMgNzY1NCksIGFuZCByYXRlLCBpZiBhcHBsaWNhYmxlCisJLS0gKGJpdHMgMzIxKQorCisJLS0gT0NURVRTIDItNTogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIElmIHJlY2VpdmVkIHRoZQorICAgIC0tIEV4dC1UZWxlc2VydmljZUNvZGUgc2hhbGwgYmUKKwktLSB0cmVhdGVkIGFjY29yZGluZyB0byB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGRlZmluZWQgZm9yIHRoZQorCS0tIG9wZXJhdGlvbiB0aGF0IHVzZXMgdGhpcyB0eXBlLiAKKworCisJLS0gRXh0LUJlYXJlclNlcnZpY2VDb2RlIGluY2x1ZGVzIGFsbCB2YWx1ZXMgZGVmaW5lZCBmb3IgQmVhcmVyU2VydmljZUNvZGUuCisKK2FsbEJlYXJlclNlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMDAwMDAnQgorCithbGxEYXRhQ0RBLVNlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTAwMDAnQgorZGF0YUNEQS0zMDBicHMJCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTAwMDEnQgorZGF0YUNEQS0xMjAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTAwMTAnQgorZGF0YUNEQS0xMjAwLTc1YnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTAwMTEnQgorZGF0YUNEQS0yNDAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTAxMDAnQgorZGF0YUNEQS00ODAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTAxMDEnQgorZGF0YUNEQS05NjAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTAxMTAnQgorZ2VuZXJhbC1kYXRhQ0RBCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTAxMTEnQgorCithbGxEYXRhQ0RTLVNlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTEwMDAnQgorZGF0YUNEUy0xMjAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTEwMTAnQgorZGF0YUNEUy0yNDAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTExMDAnQgorZGF0YUNEUy00ODAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTExMDEnQgorZGF0YUNEUy05NjAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTExMTAnQgorZ2VuZXJhbC1kYXRhQ0RTCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAwMTExMTEnQgorCithbGxQYWRBY2Nlc3NDQS1TZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDAwJ0IKK3BhZEFjY2Vzc0NBLTMwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDAxJ0IKK3BhZEFjY2Vzc0NBLTEyMDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDAxMCdCCitwYWRBY2Nlc3NDQS0xMjAwLTc1YnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMTEnQgorcGFkQWNjZXNzQ0EtMjQwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMTAwJ0IKK3BhZEFjY2Vzc0NBLTQ4MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDEwMSdCCitwYWRBY2Nlc3NDQS05NjAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAxMTAnQgorZ2VuZXJhbC1wYWRBY2Nlc3NDQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMTExJ0IKKworYWxsRGF0YVBEUy1TZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAxMDAwJ0IKK2RhdGFQRFMtMjQwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAxMTAwJ0IKK2RhdGFQRFMtNDgwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAxMTAxJ0IKK2RhdGFQRFMtOTYwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAxMTEwJ0IKK2dlbmVyYWwtZGF0YVBEUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAxMTExJ0IKKworYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDREEJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDExMDAwMCdCCisKK2FsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RTCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMTEwMDAnQgorCithbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMDAwMDAwJ0IKKworYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDRFMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTAwMTAwMCdCCisKKy0tIFRoZSBmb2xsb3dpbmcgbm9uLWhpZXJhcmNoaWNhbCBDb21wb3VuZCBCZWFyZXIgU2VydmljZQorLS0gR3JvdXBzIGFyZSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjIuMDMwOgorYWxsRGF0YUNpcmN1aXRBc3luY2hyb25vdXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTAxMDAwMCdCCisJLS0gY292ZXJzICJhbGxEYXRhQ0RBLVNlcnZpY2VzIiwgImFsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RBIiBhbmQKKwktLSAiYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDREEiCithbGxBc3luY2hyb25vdXNTZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMTAwMDAwJ0IKKwktLSBjb3ZlcnMgImFsbERhdGFDREEtU2VydmljZXMiLCAiYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDREEiLAorCS0tICJhbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEQSIgYW5kICJhbGxQYWRBY2Nlc3NDREEtU2VydmljZXMiCithbGxEYXRhQ2lyY3VpdFN5bmNocm9ub3VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDEwMTEwMDAnQgorCS0tIGNvdmVycyAiYWxsRGF0YUNEUy1TZXJ2aWNlcyIsICJhbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEUyIgYW5kCisJLS0gImFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RTIgorYWxsU3luY2hyb25vdXNTZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMTAxMDAwJ0IKKwktLSBjb3ZlcnMgImFsbERhdGFDRFMtU2VydmljZXMiLCAiYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDRFMiLAorCS0tICJhbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEUyIgYW5kICJhbGxEYXRhUERTLVNlcnZpY2VzIgorLS0KKy0tIENvbXBvdW5kIEJlYXJlciBTZXJ2aWNlIEdyb3VwIENvZGVzIGFyZSBvbmx5IHVzZWQgaW4gY2FsbAorLS0gaW5kZXBlbmRlbnQgc3VwcGxlbWVudGFyeSBzZXJ2aWNlIG9wZXJhdGlvbnMsIGkuZS4gdGhleQorLS0gYXJlIG5vdCB1c2VkIGluIEluc2VydFN1YnNjcmliZXJEYXRhIG9yIGluCistLSBEZWxldGVTdWJzY3JpYmVyRGF0YSBtZXNzYWdlcy4KKworYWxsUExNTi1zcGVjaWZpY0JTCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMDAnQgorcGxtbi1zcGVjaWZpY0JTLTEJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDAwMSdCCitwbG1uLXNwZWNpZmljQlMtMglCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDEwJ0IKK3BsbW4tc3BlY2lmaWNCUy0zCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMTEnQgorcGxtbi1zcGVjaWZpY0JTLTQJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDEwMCdCCitwbG1uLXNwZWNpZmljQlMtNQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTAxJ0IKK3BsbW4tc3BlY2lmaWNCUy02CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMTAnQgorcGxtbi1zcGVjaWZpY0JTLTcJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDExMSdCCitwbG1uLXNwZWNpZmljQlMtOAlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDAwJ0IKK3BsbW4tc3BlY2lmaWNCUy05CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMDEnQgorcGxtbi1zcGVjaWZpY0JTLUEJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTAxMCdCCitwbG1uLXNwZWNpZmljQlMtQglCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDExJ0IKK3BsbW4tc3BlY2lmaWNCUy1DCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMDAnQgorcGxtbi1zcGVjaWZpY0JTLUQJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTEwMSdCCitwbG1uLXNwZWNpZmljQlMtRQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTEwJ0IKK3BsbW4tc3BlY2lmaWNCUy1GCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMTEnQgorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQ29tbW9uRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUNvbW1vbkRhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNkMjAyZQotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUNvbW1vbkRhdGFUeXBlcy5hc24KQEAgLTAsMCArMSw2MzMgQEAKKy0tICRJZDogTUFQLUNvbW1vbkRhdGFUeXBlcy5hc24gMzA0NzAgMjAwOS0xMC0xMCAxMjozNzo1Nloga3JqICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkKKy0tIDE3LjcuOAlDb21tb24gZGF0YSB0eXBlcworCitNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisKKwktLSBnZW5lcmFsIGRhdGEgdHlwZXMgYW5kIHZhbHVlcworCUFkZHJlc3NTdHJpbmcsCisJSVNETi1BZGRyZXNzU3RyaW5nLAorCW1heElTRE4tQWRkcmVzc0xlbmd0aCwKKwlGVE4tQWRkcmVzc1N0cmluZywKKwlJU0ROLVN1YmFkZHJlc3NTdHJpbmcsCisJRXh0ZXJuYWxTaWduYWxJbmZvLCAKKwlFeHQtRXh0ZXJuYWxTaWduYWxJbmZvLCAKK0FjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAorCVNpZ25hbEluZm8sCisJbWF4U2lnbmFsSW5mb0xlbmd0aCwKKwlBbGVydGluZ1BhdHRlcm4sCisJVEJDRC1TVFJJTkcsCisKKwktLSBkYXRhIHR5cGVzIGZvciBudW1iZXJpbmcgYW5kIGlkZW50aWZpY2F0aW9uCisJSU1TSSwKKwlUTVNJLCAKKwlJZGVudGl0eSwKKwlTdWJzY3JpYmVySWQsCisJSU1FSSwKKwlITFItTGlzdCwKKwlMTVNJLAorCUdsb2JhbENlbGxJZCwKKwlOZXR3b3JrUmVzb3VyY2UsCisJQWRkaXRpb25hbE5ldHdvcmtSZXNvdXJjZSwKKwlOQUVBLVByZWZlcnJlZENJLCAKKwlOQUVBLUNJQywgCisJQVNDSS1DYWxsUmVmZXJlbmNlLAorCVN1YnNjcmliZXJJZGVudGl0eSwKKwlQTE1OLUlkLAorCisJLS0gZGF0YSB0eXBlcyBmb3IgQ0FNRUwKKwlDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSwgCisJQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkRml4ZWRMZW5ndGgsCisJTEFJRml4ZWRMZW5ndGgsCisKKwktLSBkYXRhIHR5cGVzIGZvciBzdWJzY3JpYmVyIG1hbmFnZW1lbnQKKwlCYXNpY1NlcnZpY2VDb2RlLAorCUV4dC1CYXNpY1NlcnZpY2VDb2RlLAorCUVNTFBQLUluZm8sCisJRU1MUFAtUHJpb3JpdHksIAorCU1DLVNTLUluZm8sCisJTWF4TUMtQmVhcmVycywKKwlNQy1CZWFyZXJzLAorCUV4dC1TUy1TdGF0dXMsCisKKwktLSBkYXRhIHR5cGVzIGZvciBnZW9ncmFwaGljIGxvY2F0aW9uCisJQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uLAorCUxDU0NsaWVudEV4dGVybmFsSUQsCisJTENTQ2xpZW50SW50ZXJuYWxJRCwKKwlMQ1NTZXJ2aWNlVHlwZUlELAorLS0tIFdTIGFkZGVkIGV4cG9ydHMgbmVlZGVkIGJ5IGdzbV9tYXAuYXNuIChleHRyYSBhc24xIGZpbGUgdG8gaGFuZGxlIG9sZGVyIHByb3QuIHZlci4pCisJUHJvdG9jb2xJZCwKKwlMQ1NTZXJ2aWNlVHlwZUlECQorOworCitJTVBPUlRTCisJVGVsZXNlcnZpY2VDb2RlLAorCUV4dC1UZWxlc2VydmljZUNvZGUKK0ZST00gTUFQLVRTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtVFMtQ29kZSAoMTkpIHZlcnNpb24xMSAoMTEpfQorCisJQmVhcmVyU2VydmljZUNvZGUsCisJRXh0LUJlYXJlclNlcnZpY2VDb2RlCitGUk9NIE1BUC1CUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUJTLUNvZGUgKDIwKSB2ZXJzaW9uMTEgKDExKX0KKworCVNTLUNvZGUKK0ZST00gTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Cis7CisKKworLS0gZ2VuZXJhbCBkYXRhIHR5cGVzCisKK1RCQ0QtU1RSSU5HIDo6PSBPQ1RFVCBTVFJJTkcKKwktLSBUaGlzIHR5cGUgKFRlbGVwaG9ueSBCaW5hcnkgQ29kZWQgRGVjaW1hbCBTdHJpbmcpIGlzIHVzZWQgdG8KKwktLSByZXByZXNlbnQgc2V2ZXJhbCBkaWdpdHMgZnJvbSAwIHRocm91Z2ggOSwgKiwgIywgYSwgYiwgYywgdHdvCisJLS0gZGlnaXRzIHBlciBvY3RldCwgZWFjaCBkaWdpdCBlbmNvZGVkIDAwMDAgdG8gMTAwMSAoMCB0byA5KSwKKwktLSAxMDEwICgqKSwgMTAxMSAoIyksIDExMDAgKGEpLCAxMTAxIChiKSBvciAxMTEwIChjKTsgMTExMSB1c2VkCisJLS0gYXMgZmlsbGVyIHdoZW4gdGhlcmUgaXMgYW4gb2RkIG51bWJlciBvZiBkaWdpdHMuCisKKwktLSBiaXRzIDg3NjUgb2Ygb2N0ZXQgbiBlbmNvZGluZyBkaWdpdCAybgorCS0tIGJpdHMgNDMyMSBvZiBvY3RldCBuIGVuY29kaW5nIGRpZ2l0IDIobi0xKSArMQorCitBZGRyZXNzU3RyaW5nIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEFkZHJlc3NMZW5ndGgpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIG51bWJlciBmb3IgYWRkcmVzc2luZworCS0tIHB1cnBvc2VzLiBJdCBpcyBjb21wb3NlZCBvZgorCS0tCWEpCW9uZSBvY3RldCBmb3IgbmF0dXJlIG9mIGFkZHJlc3MsIGFuZCBudW1iZXJpbmcgcGxhbgorCS0tCQlpbmRpY2F0b3IuCisJLS0JYikJZGlnaXRzIG9mIGFuIGFkZHJlc3MgZW5jb2RlZCBhcyBUQkNELVN0cmluZy4KKworCS0tIGEpCVRoZSBmaXJzdCBvY3RldCBpbmNsdWRlcyBhIG9uZSBiaXQgZXh0ZW5zaW9uIGluZGljYXRvciwgYQorCS0tCQkzIGJpdHMgbmF0dXJlIG9mIGFkZHJlc3MgaW5kaWNhdG9yIGFuZCBhIDQgYml0cyBudW1iZXJpbmcKKwktLQkJcGxhbiBpbmRpY2F0b3IsIGVuY29kZWQgYXMgZm9sbG93czoKKworCS0tIGJpdCA4OiAxICAobm8gZXh0ZW5zaW9uKQorCisJLS0gYml0cyA3NjU6IG5hdHVyZSBvZiBhZGRyZXNzIGluZGljYXRvcgorCS0tCTAwMCAgdW5rbm93bgorCS0tCTAwMSAgaW50ZXJuYXRpb25hbCBudW1iZXIKKwktLQkwMTAgIG5hdGlvbmFsIHNpZ25pZmljYW50IG51bWJlcgorCS0tCTAxMSAgbmV0d29yayBzcGVjaWZpYyBudW1iZXIKKwktLQkxMDAgIHN1YnNjcmliZXIgbnVtYmVyCisJLS0JMTAxICByZXNlcnZlZAorCS0tCTExMCAgYWJicmV2aWF0ZWQgbnVtYmVyCisJLS0JMTExICByZXNlcnZlZCBmb3IgZXh0ZW5zaW9uCisKKwktLSBiaXRzIDQzMjE6IG51bWJlcmluZyBwbGFuIGluZGljYXRvcgorCS0tCTAwMDAgIHVua25vd24KKwktLQkwMDAxICBJU0ROL1RlbGVwaG9ueSBOdW1iZXJpbmcgUGxhbiAoUmVjIElUVS1UIEUuMTY0KQorCS0tCTAwMTAgIHNwYXJlCisJLS0JMDAxMSAgZGF0YSBudW1iZXJpbmcgcGxhbiAoSVRVLVQgUmVjIFguMTIxKQorCS0tCTAxMDAgIHRlbGV4IG51bWJlcmluZyBwbGFuIChJVFUtVCBSZWMgRi42OSkKKwktLQkwMTAxICBzcGFyZQorCS0tCTAxMTAgIGxhbmQgbW9iaWxlIG51bWJlcmluZyBwbGFuIChJVFUtVCBSZWMgRS4yMTIpCisJLS0JMDExMSAgc3BhcmUKKwktLQkxMDAwICBuYXRpb25hbCBudW1iZXJpbmcgcGxhbgorCS0tCTEwMDEgIHByaXZhdGUgbnVtYmVyaW5nIHBsYW4KKwktLQkxMTExICByZXNlcnZlZCBmb3IgZXh0ZW5zaW9uCisKKwktLQlhbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZC4KKworCS0tIGIpCVRoZSBmb2xsb3dpbmcgb2N0ZXRzIHJlcHJlc2VudGluZyBkaWdpdHMgb2YgYW4gYWRkcmVzcworCS0tCQllbmNvZGVkIGFzIGEgVEJDRC1TVFJJTkcuCisKK21heEFkZHJlc3NMZW5ndGggIElOVEVHRVIgOjo9IDIwCisKK0lTRE4tQWRkcmVzc1N0cmluZyA6Oj0gCisJCQlBZGRyZXNzU3RyaW5nIChTSVpFICgxLi5tYXhJU0ROLUFkZHJlc3NMZW5ndGgpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBJU0ROIG51bWJlcnMuCisKK21heElTRE4tQWRkcmVzc0xlbmd0aCAgSU5URUdFUiA6Oj0gOQorCitGVE4tQWRkcmVzc1N0cmluZyA6Oj0gCisJCQlBZGRyZXNzU3RyaW5nIChTSVpFICgxLi5tYXhGVE4tQWRkcmVzc0xlbmd0aCkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IGZvcndhcmRlZC10byBudW1iZXJzLiAKKwktLSBJZiBOQUkgPSBpbnRlcm5hdGlvbmFsIHRoZSBmaXJzdCBkaWdpdHMgcmVwcmVzZW50IHRoZSBjb3VudHJ5IGNvZGUgKENDKQorCS0tIGFuZCB0aGUgbmV0d29yayBkZXN0aW5hdGlvbiBjb2RlIChOREMpIGFzIGZvciBFLjE2NC4KKworbWF4RlROLUFkZHJlc3NMZW5ndGggIElOVEVHRVIgOjo9IDE1CisKK0lTRE4tU3ViYWRkcmVzc1N0cmluZyA6Oj0gCisJCQlPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heElTRE4tU3ViYWRkcmVzc0xlbmd0aCkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IElTRE4gc3ViYWRkcmVzc2VzLgorCS0tIEl0IGlzIGNvbXBvc2VkIG9mCisJLS0JYSkJb25lIG9jdGV0IGZvciB0eXBlIG9mIHN1YmFkZHJlc3MgYW5kIG9kZC9ldmVuIGluZGljYXRvci4KKwktLQliKQkyMCBvY3RldHMgZm9yIHN1YmFkZHJlc3MgaW5mb3JtYXRpb24uCisKKwktLQlhKQlUaGUgZmlyc3Qgb2N0ZXQgaW5jbHVkZXMgYSBvbmUgYml0IGV4dGVuc2lvbiBpbmRpY2F0b3IsIGEKKwktLQkJMyBiaXRzIHR5cGUgb2Ygc3ViYWRkcmVzcyBhbmQgYSBvbmUgYml0IG9kZC9ldmVuIGluZGljYXRvciwKKwktLQkJZW5jb2RlZCBhcyBmb2xsb3dzOgorCisJLS0JYml0IDg6IDEgIChubyBleHRlbnNpb24pCisKKwktLQliaXRzIDc2NTogdHlwZSBvZiBzdWJhZGRyZXNzCisJLS0JCTAwMCAgTlNBUCAoWC4yMTMvSVNPIDgzNDggQUQyKQorCS0tCQkwMTAgIFVzZXIgU3BlY2lmaWVkCisJLS0JCUFsbCBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkCisKKwktLQliaXQgNDogb2RkL2V2ZW4gaW5kaWNhdG9yCisJLS0JCTAgIGV2ZW4gbnVtYmVyIG9mIGFkZHJlc3Mgc2lnbmFscworCS0tCQkxICBvZGQgbnVtYmVyIG9mIGFkZHJlc3Mgc2lnbmFscworCS0tCQlUaGUgb2RkL2V2ZW4gaW5kaWNhdG9yIGlzIHVzZWQgd2hlbiB0aGUgdHlwZSBvZiBzdWJhZGRyZXNzCisJLS0JCWlzICJ1c2VyIHNwZWNpZmllZCIgYW5kIHRoZSBjb2RpbmcgaXMgQkNELgorCisJLS0JYml0cyAzMjE6IDAwMCAodW51c2VkKQorCisJLS0JYikgU3ViYWRkcmVzcyBpbmZvcm1hdGlvbi4KKwktLQlUaGUgTlNBUCBYLjIxMy9JU084MzQ4QUQyIGFkZHJlc3Mgc2hhbGwgYmUgZm9ybWF0dGVkIGFzIHNwZWNpZmllZAorCS0tCWJ5IG9jdGV0IDQgd2hpY2ggY29udGFpbnMgdGhlIEF1dGhvcml0eSBhbmQgRm9ybWF0IElkZW50aWZpZXIKKwktLQkoQUZJKS4gVGhlIGVuY29kaW5nIGlzIG1hZGUgYWNjb3JkaW5nIHRvIHRoZSAicHJlZmVycmVkIGJpbmFyeQorCS0tCWVuY29kaW5nIiBhcyBkZWZpbmVkIGluIFguMjEzL0lTTzgzNEFEMi4gRm9yIHRoZSBkZWZpbml0aW9uCisJLS0Jb2YgdGhpcyB0eXBlIG9mIHN1YmFkZHJlc3MsIHNlZSBJVFUtVCBSZWMgSS4zMzQuCisKKwktLQlGb3IgVXNlci1zcGVjaWZpYyBzdWJhZGRyZXNzLCB0aGlzIGZpZWxkIGlzIGVuY29kZWQgYWNjb3JkaW5nCisJLS0JdG8gdGhlIHVzZXIgc3BlY2lmaWNhdGlvbiwgc3ViamVjdCB0byBhIG1heGltdW0gbGVuZ3RoIG9mIDIwCisJLS0Jb2N0ZXRzLiBXaGVuIGludGVyd29ya2luZyB3aXRoIFguMjUgbmV0d29ya3MgQkNEIGNvZGluZyBzaG91bGQKKwktLQliZSBhcHBsaWVkLgorCittYXhJU0ROLVN1YmFkZHJlc3NMZW5ndGggIElOVEVHRVIgOjo9IDIxCisKK0V4dGVybmFsU2lnbmFsSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXByb3RvY29sSWQJUHJvdG9jb2xJZCwKKwlzaWduYWxJbmZvCVNpZ25hbEluZm8sCisJLS0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBnaXZlbiBpbgorCS0tIGNsYXVzZSA3LjYuOS4KKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS0tIGV4dGVuc2lvbkNvbnRhaW5lciBtdXN0IG5vdCBiZSB1c2VkIGluIHZlcnNpb24gMgorCS4uLn0KKworU2lnbmFsSW5mbyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhTaWduYWxJbmZvTGVuZ3RoKSkKKworbWF4U2lnbmFsSW5mb0xlbmd0aCAgSU5URUdFUiA6Oj0gMjAwCisJLS0gVGhpcyBOYW1lZFZhbHVlIHJlcHJlc2VudHMgdGhlIHRoZW9yZXRpY2FsIG1heGltdW0gbnVtYmVyIG9mIG9jdGV0cyB3aGljaCBpcworCS0tIGF2YWlsYWJsZSB0byBjYXJyeSBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgU2lnbmFsSW5mbyBkYXRhIHR5cGUsCisJLS0gd2l0aG91dCByZXF1aXJpbmcgc2VnbWVudGF0aW9uIHRvIGNvcGUgd2l0aCB0aGUgbmV0d29yayBsYXllciBzZXJ2aWNlLgorCS0tIEhvd2V2ZXIsIHRoZSBhY3R1YWwgbWF4aW11bSBzaXplIGF2YWlsYWJsZSBmb3IgYW4gaW5zdGFuY2Ugb2YgdGhlIGRhdGEKKwktLSB0eXBlIG1heSBiZSBsb3dlciwgZXNwZWNpYWxseSB3aGVuIG90aGVyIGluZm9ybWF0aW9uIGVsZW1lbnRzCisJLS0gaGF2ZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2FtZSBjb21wb25lbnQuCisKK1Byb3RvY29sSWQgOjo9IEVOVU1FUkFURUQgeworCWdzbS0wNDA4ICAoMSksCisJZ3NtLTA4MDYgICgyKSwKKwlnc20tQlNTTUFQICAoMyksCisJLS0gVmFsdWUgMyBpcyByZXNlcnZlZCBhbmQgbXVzdCBub3QgYmUgdXNlZAorCWV0cy0zMDAxMDItMSAgKDQpfQorCitFeHQtRXh0ZXJuYWxTaWduYWxJbmZvIDo6PSBTRVFVRU5DRSB7CisJZXh0LVByb3RvY29sSWQJRXh0LVByb3RvY29sSWQsCisJc2lnbmFsSW5mbwlTaWduYWxJbmZvLAorCS0tIEluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZ2l2ZW4gaW4KKwktLSBjbGF1c2UgNy42LjkuMTAKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRXh0LVByb3RvY29sSWQgOjo9IEVOVU1FUkFURUQgeworCWV0cy0zMDAzNTYgICgxKSwKKwkuLi4gCisJIH0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIEZvciBFeHQtRXh0ZXJuYWxTaWduYWxJbmZvIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55CistLSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSB3aG9sZSAKKy0tIEV4dC1FeHRlcm5hbFNpZ25hbEluZm8gc2VxdWVuY2UuCisKK0FjY2Vzc05ldHdvcmtTaWduYWxJbmZvIDo6PSBTRVFVRU5DRSB7CisJYWNjZXNzTmV0d29ya1Byb3RvY29sSWQJQWNjZXNzTmV0d29ya1Byb3RvY29sSWQsCisJc2lnbmFsSW5mbwlMb25nU2lnbmFsSW5mbywKKwktLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGdpdmVuIGluIGNsYXVzZSA3LjYuOS4xCisJCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0xvbmdTaWduYWxJbmZvIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heExvbmdTaWduYWxJbmZvTGVuZ3RoKSkKKworbWF4TG9uZ1NpZ25hbEluZm9MZW5ndGggIElOVEVHRVIgOjo9IDI1NjAKKwktLSBUaGlzIE5hbWVkIFZhbHVlIHJlcHJlc2VudHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG9jdGV0cyB3aGljaCBpcyBhdmFpbGFibGUKKwktLSB0byBjYXJyeSBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgTG9uZ1NpZ25hbEluZm8gZGF0YSB0eXBlIHVzaW5nCisJLS0gV2hpdGUgQm9vayBTQ0NQIHdpdGggdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzLgorCS0tIEl0IHRha2VzIGFjY291bnQgb2YgdGhlIG9jdGV0cyB1c2VkIGJ5IHRoZSBsb3dlciBsYXllcnMgb2YgdGhlIHByb3RvY29sLCBhbmQKKwktLSBvdGhlciBpbmZvcm1hdGlvbiBlbGVtZW50cyB3aGljaCBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIHNhbWUgY29tcG9uZW50LgorCitBY2Nlc3NOZXR3b3JrUHJvdG9jb2xJZCA6Oj0gRU5VTUVSQVRFRCB7CisJdHMzRy00ODAwNiAgICgxKSwKKwl0czNHLTI1NDEzICgyKSwKKwkuLi59CisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIEZvciBBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbyBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorCS0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlIAorCS0tIEFjY2Vzc05ldHdvcmtTaWduYWxJbmZvIHNlcXVlbmNlLgorCitBbGVydGluZ1BhdHRlcm4gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkgKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBBbGVydGluZyBQYXR0ZXJuCisKKwktLQliaXRzIDg3NjUgOiAwMDAwICh1bnVzZWQpCisKKwktLQliaXRzIDQzIDogdHlwZSBvZiBQYXR0ZXJuCisJLS0JCTAwIGxldmVsCisJLS0JCTAxIGNhdGVnb3J5CisJLS0JCTEwIGNhdGVnb3J5CisJLS0JCWFsbCBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkLgorCisJLS0JYml0cyAyMSA6IHR5cGUgb2YgYWxlcnRpbmcKKworYWxlcnRpbmdMZXZlbC0wICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAwMDAnQgorYWxlcnRpbmdMZXZlbC0xICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAwMDEnQgorYWxlcnRpbmdMZXZlbC0yICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAwMTAnQgorCS0tIGFsbCBvdGhlciB2YWx1ZXMgb2YgQWxlcnRpbmcgbGV2ZWwgYXJlIHJlc2VydmVkCisJLS0gQWxlcnRpbmcgTGV2ZWxzIGFyZSBkZWZpbmVkIGluIEdTTSAwMi4wNworCQorYWxlcnRpbmdDYXRlZ29yeS0xICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAxMDAnQgorYWxlcnRpbmdDYXRlZ29yeS0yICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAxMDEnQgorYWxlcnRpbmdDYXRlZ29yeS0zICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAxMTAnQgorYWxlcnRpbmdDYXRlZ29yeS00ICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDAxMTEnQgorYWxlcnRpbmdDYXRlZ29yeS01ICAgQWxlcnRpbmdQYXR0ZXJuIDo6PSAnMDAwMDEwMDAnQgorCS0tIGFsbCBvdGhlciB2YWx1ZXMgb2YgQWxlcnRpbmcgQ2F0ZWdvcnkgYXJlIHJlc2VydmVkCisJLS0gQWxlcnRpbmcgY2F0ZWdvcmllcyBhcmUgZGVmaW5lZCBpbiBHU00gMDIuMDcKKworLS0gZGF0YSB0eXBlcyBmb3IgbnVtYmVyaW5nIGFuZCBpZGVudGlmaWNhdGlvbgorCitJTVNJIDo6PSBUQkNELVNUUklORyAoU0laRSAoMy4uOCkpCisJLS0gZGlnaXRzIG9mIE1DQywgTU5DLCBNU0lOIGFyZSBjb25jYXRlbmF0ZWQgaW4gdGhpcyBvcmRlci4KKworSWRlbnRpdHkgOjo9IENIT0lDRSB7CisJaW1zaQkJCUlNU0ksCisJaW1zaS1XaXRoTE1TSQlJTVNJLVdpdGhMTVNJfQorCitJTVNJLVdpdGhMTVNJIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJbG1zaQkJCUxNU0ksCisJLS0gYSBzcGVjaWFsIHZhbHVlIDAwMDAwMDAwIGluZGljYXRlcyB0aGF0IHRoZSBMTVNJIGlzIG5vdCBpbiB1c2UKKwkuLi59CisKK0FTQ0ktQ2FsbFJlZmVyZW5jZSA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDEuLjgpKQorCS0tIGRpZ2l0cyBvZiBWR0NTL1ZCUy1hcmVhLEdyb3VwLUlEIGFyZSBjb25jYXRlbmF0ZWQgaW4gdGhpcyBvcmRlciBpZiB0aGVyZSBpcyBhCisJLS0gVkdDUy9WQlMtYXJlYS4KKworVE1TSSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi40KSkKKworU3Vic2NyaWJlcklkIDo6PSBDSE9JQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwl0bXNpCQkJWzFdIFRNU0l9CisKK0lNRUkgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICg4KSkKKwktLQlSZWZlcnMgdG8gSW50ZXJuYXRpb25hbCBNb2JpbGUgU3RhdGlvbiBFcXVpcG1lbnQgSWRlbnRpdHkKKwktLQlhbmQgU29mdHdhcmUgVmVyc2lvbiBOdW1iZXIgKFNWTikgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAwMyBbMTddLgorCS0tCUlmIHRoZSBTVk4gaXMgbm90IHByZXNlbnQgdGhlIGxhc3Qgb2N0ZXQgc2hhbGwgY29udGFpbiB0aGUKKwktLQlkaWdpdCAwIGFuZCBhIGZpbGxlci4KKwktLQlJZiBwcmVzZW50IHRoZSBTVk4gc2hhbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGxhc3Qgb2N0ZXQuCisKK0hMUi1JZCA6Oj0gSU1TSQorCS0tIGxlYWRpbmcgZGlnaXRzIG9mIElNU0ksIGkuZS4gKE1DQywgTU5DLCBsZWFkaW5nIGRpZ2l0cyBvZgorCS0tIE1TSU4pIGZvcm1pbmcgSExSIElkIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XS4KKworSExSLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mSExSLUlkKSBPRgorCQkJCUhMUi1JZAorCittYXhOdW1PZkhMUi1JZCAgSU5URUdFUiA6Oj0gNTAKKworTE1TSSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKworR2xvYmFsQ2VsbElkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDUuLjcpKQorCS0tIFJlZmVycyB0byBDZWxsIEdsb2JhbCBJZGVudGlmaWNhdGlvbiBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10uCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcworCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjQuMDA4IFszNV0KKwktLSBvY3RldHMgNiBhbmQgNwlDZWxsIElkZW50aXR5IChDSSkgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjQuMDA4IFszNV0KKworTmV0d29ya1Jlc291cmNlIDo6PSBFTlVNRVJBVEVEIHsKKwlwbG1uICAoMCksCisJaGxyICAoMSksCisJdmxyICAoMiksCisJcHZsciAgKDMpLAorCWNvbnRyb2xsaW5nTVNDICAoNCksCisJdm1zYyAgKDUpLAorCWVpciAgKDYpLAorCXJzcyAgKDcpfQorCitBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlIDo6PSBFTlVNRVJBVEVEIHsKKwlzZ3NuICgwKSwKKwlnZ3NuICgxKSwKKwlnbWxjICgyKSwKKwlnc21TQ0YgKDMpLAorCW5wbHIgKDQpLAorCWF1YyAoNSksCisJLi4uICwKKwl1ZSAoNiksCisJbW1lICg3KX0KKwktLSBpZiB1bmtub3duIHZhbHVlIGlzIHJlY2VpdmVkIGluIEFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UKKwktLSBpdCBzaGFsbCBiZSBpZ25vcmVkLgorCisKK05BRUEtUHJlZmVycmVkQ0kgOjo9IFNFUVVFTkNFIHsKKwluYWVhLVByZWZlcnJlZENJQwlbMF0gTkFFQS1DSUMsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitOQUVBLUNJQyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYnkgdGhlIENhcnJpZXIgSWRlbnRpZmljYXRpb24KKwktLSBwYXJhbWV0ZXIgaW4gQU5TSSBUMS4xMTMuMy4gQ2FycmllciBjb2RlcyBiZXR3ZWVuICIwMDAiIGFuZCAiOTk5IiBtYXkKKwktLSBiZSBlbmNvZGVkIGFzIDMgZGlnaXRzIHVzaW5nICIwMDAiIHRvICI5OTkiIG9yIGFzIDQgZGlnaXRzIHVzaW5nIAorCS0tICIwMDAwIiB0byAiMDk5OSIuIENhcnJpZXIgY29kZXMgYmV0d2VlbiAiMTAwMCIgYW5kICI5OTk5IiBhcmUgZW5jb2RlZAorCS0tIHVzaW5nIDQgZGlnaXRzLgorCitTdWJzY3JpYmVySWRlbnRpdHkgOjo9IENIT0lDRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCW1zaXNkbgkJWzFdIElTRE4tQWRkcmVzc1N0cmluZworCX0KKworTENTQ2xpZW50RXh0ZXJuYWxJRCA6Oj0gU0VRVUVOQ0UgeworCWV4dGVybmFsQWRkcmVzcwlbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0xDU0NsaWVudEludGVybmFsSUQgOjo9IEVOVU1FUkFURUQgeworCWJyb2FkY2FzdFNlcnZpY2UJKDApLAorCW8tYW5kTS1IUExNTgkoMSksCisJby1hbmRNLVZQTE1OCSgyKSwKKwlhbm9ueW1vdXNMb2NhdGlvbgkoMyksCisJdGFyZ2V0TVNzdWJzY3JpYmVkU2VydmljZQkoNCksCisJLi4uIH0KKy0tIGZvciBhIENBTUVMIHBoYXNlIDMgUExNTiBvcGVyYXRvciBjbGllbnQsIHRoZSB2YWx1ZSB0YXJnZXRNU3N1YnNjcmliZWRTZXJ2aWNlIHNoYWxsIGJlIHVzZWQKKworTENTU2VydmljZVR5cGVJRCA6Oj0gSU5URUdFUiAoMC4uMTI3KQorCS0tIHRoZSBpbnRlZ2VyIHZhbHVlcyAwLTYzIGFyZSByZXNlcnZlZCBmb3IgU3RhbmRhcmQgTENTIHNlcnZpY2UgdHlwZXMKKwktLSB0aGUgaW50ZWdlciB2YWx1ZXMgNjQtMTI3IGFyZSByZXNlcnZlZCBmb3IgTm9uIFN0YW5kYXJkIExDUyBzZXJ2aWNlIHR5cGVzCisKKy0tIFN0YW5kYXJkIExDUyBTZXJ2aWNlIFR5cGVzCitlbWVyZ2VuY3lTZXJ2aWNlcwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMAorZW1lcmdlbmN5QWxlcnRTZXJ2aWNlcwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMQorcGVyc29uVHJhY2tpbmcJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAyCitmbGVldE1hbmFnZW1lbnQJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDMKK2Fzc2V0TWFuYWdlbWVudAkJTENTU2VydmljZVR5cGVJRCA6Oj0gNAordHJhZmZpY0Nvbmdlc3Rpb25SZXBvcnRpbmcJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDUKK3JvYWRzaWRlQXNzaXN0YW5jZQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNgorcm91dGluZ1RvTmVhcmVzdENvbW1lcmNpYWxFbnRlcnByaXNlCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3CituYXZpZ2F0aW9uCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOAorCS0tdGhpcyBzZXJ2aWNlIHR5cGUgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBpbiBwcmV2aW91cyByZWxlYXNlcworY2l0eVNpZ2h0c2VlaW5nCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Citsb2NhbGl6ZWRBZHZlcnRpc2luZwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAKK21vYmlsZVllbGxvd1BhZ2VzCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMSAKK3RyYWZmaWNBbmRQdWJsaWNUcmFuc3BvcnRhdGlvbkluZm8JCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyCit3ZWF0aGVyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEzCithc3NldEFuZFNlcnZpY2VGaW5kaW5nCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxNAorZ2FtaW5nCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE1CitmaW5kWW91ckZyaWVuZAkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE2CitkYXRpbmcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTcKK2NoYXR0aW5nCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE4Cityb3V0ZUZpbmRpbmcJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxOQord2hlcmVBbUkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMjAKKworLS0gVGhlIHZhbHVlcyBvZiBMQ1NTZXJ2aWNlVHlwZUlEIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byAzR1BQIFRTIDIyLjA3MS4KKworLS0gTm9uIFN0YW5kYXJkIExDUyBTZXJ2aWNlIFR5cGVzCitzZXJ2NjQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjQKK3NlcnY2NQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2NQorc2VydjY2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY2CitzZXJ2NjcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjcKK3NlcnY2OAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2OAorc2VydjY5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY5CitzZXJ2NzAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzAKK3NlcnY3MQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3MQorc2VydjcyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDcyCitzZXJ2NzMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzMKK3NlcnY3NAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3NAorc2Vydjc1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc1CitzZXJ2NzYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzYKK3NlcnY3NwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3Nworc2Vydjc4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc4CitzZXJ2NzkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzkKK3NlcnY4MAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4MAorc2VydjgxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgxCitzZXJ2ODIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODIKK3NlcnY4MwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4Mworc2Vydjg0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg0CitzZXJ2ODUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODUKK3NlcnY4NgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4Ngorc2Vydjg3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg3CitzZXJ2ODgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODgKK3NlcnY4OQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4OQorc2VydjkwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkwCitzZXJ2OTEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTEKK3NlcnY5MgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Mgorc2VydjkzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkzCitzZXJ2OTQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTQKK3NlcnY5NQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5NQorc2Vydjk2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk2CitzZXJ2OTcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTcKK3NlcnY5OAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5OAorc2Vydjk5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk5CitzZXJ2MTAwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwMAorc2VydjEwMQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDEKK3NlcnYxMDIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAyCitzZXJ2MTAzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwMworc2VydjEwNAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDQKK3NlcnYxMDUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA1CitzZXJ2MTA2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwNgorc2VydjEwNwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDcKK3NlcnYxMDgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA4CitzZXJ2MTA5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwOQorc2VydjExMAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTAKK3NlcnYxMTEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTExCitzZXJ2MTEyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExMgorc2VydjExMwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTMKK3NlcnYxMTQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE0CitzZXJ2MTE1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExNQorc2VydjExNgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTYKK3NlcnYxMTcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE3CitzZXJ2MTE4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExOAorc2VydjExOQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTkKK3NlcnYxMjAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIwCitzZXJ2MTIxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyMQorc2VydjEyMgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjIKK3NlcnYxMjMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIzCitzZXJ2MTI0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyNAorc2VydjEyNQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjUKK3NlcnYxMjYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTI2CitzZXJ2MTI3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyNworCitQTE1OLUlkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisKKy0tIGRhdGEgdHlwZXMgZm9yIENBTUVMCisKK0NlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJIDo6PSBDSE9JQ0UgeworCWNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZEZpeGVkTGVuZ3RoCVswXSBDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRGaXhlZExlbmd0aCwKKwlsYWlGaXhlZExlbmd0aAlbMV0gTEFJRml4ZWRMZW5ndGh9CisKK0NlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZEZpeGVkTGVuZ3RoIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDcpKQorCS0tIFJlZmVycyB0byBDZWxsIEdsb2JhbCBJZGVudGlmaWNhdGlvbiBvciBTZXJ2aWNlIEFyZSBJZGVudGlmaWNhdGlvbgorCS0tIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMDMuCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcworCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4CisJLS0gb2N0ZXRzIDYgYW5kIDcJQ2VsbCBJZGVudGl0eSAoQ0kpIHZhbHVlIG9yIAorCS0tIAkJCVNlcnZpY2UgQXJlYSBDb2RlIChTQUMpIHZhbHVlIAorCS0tCQkJYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDAzCisKK0xBSUZpeGVkTGVuZ3RoIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDUpKQorCS0tIFJlZmVycyB0byBMb2NhdGlvbiBBcmVhIElkZW50aWZpY2F0aW9uIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMDMgWzE3XS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdAorCS0tCQkJb3IgZmlsbGVyICgxMTExKSBmb3IgMiBkaWdpdCBNTkNzCisJLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0cyA0IGFuZCA1CUxvY2F0aW9uIEFyZWEgQ29kZSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XQorCistLSBkYXRhIHR5cGVzIGZvciBzdWJzY3JpYmVyIG1hbmFnZW1lbnQKKworQmFzaWNTZXJ2aWNlQ29kZSA6Oj0gQ0hPSUNFIHsKKwliZWFyZXJTZXJ2aWNlCVsyXSBCZWFyZXJTZXJ2aWNlQ29kZSwKKwl0ZWxlc2VydmljZQlbM10gVGVsZXNlcnZpY2VDb2RlfQorCitFeHQtQmFzaWNTZXJ2aWNlQ29kZSA6Oj0gQ0hPSUNFIHsKKwlleHQtQmVhcmVyU2VydmljZQlbMl0gRXh0LUJlYXJlclNlcnZpY2VDb2RlLAorCWV4dC1UZWxlc2VydmljZQlbM10gRXh0LVRlbGVzZXJ2aWNlQ29kZX0KKworRU1MUFAtSW5mbyA6Oj0gU0VRVUVOQ0UgeworCW1heGltdW1lbnRpdGxlZFByaW9yaXR5CUVNTFBQLVByaW9yaXR5LAorCWRlZmF1bHRQcmlvcml0eQlFTUxQUC1Qcmlvcml0eSwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRU1MUFAtUHJpb3JpdHkgOjo9IElOVEVHRVIgKDAuLjE1KQorCS0tIFRoZSBtYXBwaW5nIGZyb20gdGhlIHZhbHVlcyBBLEIsMCwxLDIsMyw0IHRvIHRoZSBpbnRlZ2VyLXZhbHVlIGlzCisJLS0gc3BlY2lmaWVkIGFzIGZvbGxvd3Mgd2hlcmUgQSBpcyB0aGUgaGlnaGVzdCBhbmQgNCBpcyB0aGUgbG93ZXN0CisJLS0gcHJpb3JpdHkgbGV2ZWwKKwktLSB0aGUgaW50ZWdlciB2YWx1ZXMgNy0xNSBhcmUgc3BhcmUgYW5kIHNoYWxsIGJlIG1hcHBlZCB0byB2YWx1ZSA0CisKK3ByaW9yaXR5TGV2ZWxBCQlFTUxQUC1Qcmlvcml0eSA6Oj0gNgorcHJpb3JpdHlMZXZlbEIJCUVNTFBQLVByaW9yaXR5IDo6PSA1Citwcmlvcml0eUxldmVsMAkJRU1MUFAtUHJpb3JpdHkgOjo9IDAKK3ByaW9yaXR5TGV2ZWwxCQlFTUxQUC1Qcmlvcml0eSA6Oj0gMQorcHJpb3JpdHlMZXZlbDIJCUVNTFBQLVByaW9yaXR5IDo6PSAyCitwcmlvcml0eUxldmVsMwkJRU1MUFAtUHJpb3JpdHkgOjo9IDMKK3ByaW9yaXR5TGV2ZWw0CQlFTUxQUC1Qcmlvcml0eSA6Oj0gNAorCitNQy1TUy1JbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdIFNTLUNvZGUsCisJc3MtU3RhdHVzCQlbMV0gRXh0LVNTLVN0YXR1cywKKwluYnJTQgkJWzJdIE1heE1DLUJlYXJlcnMsCisJbmJyVXNlcgkJWzNdIE1DLUJlYXJlcnMsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNYXhNQy1CZWFyZXJzIDo6PSBJTlRFR0VSICgyLi5tYXhOdW1PZk1DLUJlYXJlcnMpCisKK01DLUJlYXJlcnMgOjo9IElOVEVHRVIgKDEuLm1heE51bU9mTUMtQmVhcmVycykKKworbWF4TnVtT2ZNQy1CZWFyZXJzICBJTlRFR0VSIDo6PSA3CisKK0V4dC1TUy1TdGF0dXMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNSkpCisKKwktLSBPQ1RFVCAxOgorCS0tCisJLS0gYml0cyA4NzY1OiAwMDAwICh1bnVzZWQpCisJLS0gYml0cyA0MzIxOiBVc2VkIHRvIGNvbnZleSB0aGUgIlAgYml0IiwiUiBiaXQiLCJBIGJpdCIgYW5kICJRIGJpdCIsCisJLS0JCSAgICByZXByZXNlbnRpbmcgc3VwcGxlbWVudGFyeSBzZXJ2aWNlIHN0YXRlIGluZm9ybWF0aW9uCisJLS0JCSAgICBhcyBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDExIFsyMl0KKworCS0tIGJpdCA0OiAiUSBiaXQiCisKKwktLSBiaXQgMzogIlAgYml0IgorCisJLS0gYml0IDI6ICJSIGJpdCIKKworCS0tIGJpdCAxOiAiQSBiaXQiCisKKwktLSBPQ1RFVFMgMi01OiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gVGhleSBzaGFsbCBiZSBkaXNjYXJkZWQgaWYKKwktLSByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QuCisKKworCS0tIGRhdGEgdHlwZXMgZm9yIGdlb2dyYXBoaWMgbG9jYXRpb24KKworQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uIDo6PSBJTlRFR0VSICgwLi4zMjc2NykKKy0tIHRoZSB2YWx1ZSByZXByZXNlbnRzIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWludXRlcyBzaW5jZSB0aGUgbGFzdAorLS0gbmV0d29yayBjb250YWN0IG9mIHRoZSBtb2JpbGUgc3RhdGlvbiAoaS5lLiB0aGUgYWN0dWFsaXR5IG9mIHRoZQorLS0gbG9jYXRpb24gaW5mb3JtYXRpb24pLgorLS0gdmFsdWUgIjAiIGluZGljYXRlcyB0aGF0IHRoZSBNUyBpcyBjdXJyZW50bHkgaW4gY29udGFjdCB3aXRoIHRoZQorLS0gICAgICAgICAgIG5ldHdvcmsKKy0tIHZhbHVlICIzMjc2NyIgaW5kaWNhdGVzIHRoYXQgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGlzIGF0IGxlYXN0CistLSAgICAgICAgICAgICAgIDMyNzY3IG1pbnV0ZXMgb2xkCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FUi1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRVItRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGI5MGZjCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRVItRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDQxNSBAQAorLS0gJElkOiBNQVAtRVItRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KSAKKy0tIDE3LjcuNwlFcnJvciBkYXRhIHR5cGVzCisKK01BUC1FUi1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRVItRGF0YVR5cGVzICgxNykgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKwlSb2FtaW5nTm90QWxsb3dlZFBhcmFtLAorCUNhbGxCYXJyZWRQYXJhbSwKKwlDVUctUmVqZWN0UGFyYW0sCisJU1MtSW5jb21wYXRpYmlsaXR5Q2F1c2UsCisJUFctUmVnaXN0cmF0aW9uRmFpbHVyZUNhdXNlLAorCVNNLURlbGl2ZXJ5RmFpbHVyZUNhdXNlLAorCVN5c3RlbUZhaWx1cmVQYXJhbSwKKwlEYXRhTWlzc2luZ1BhcmFtLAorCVVuZXhwZWN0ZWREYXRhUGFyYW0sCisJRmFjaWxpdHlOb3RTdXBQYXJhbSwKKwlPUi1Ob3RBbGxvd2VkUGFyYW0sCisJVW5rbm93blN1YnNjcmliZXJQYXJhbSwKKwlOdW1iZXJDaGFuZ2VkUGFyYW0sCisJVW5pZGVudGlmaWVkU3ViUGFyYW0sCisJSWxsZWdhbFN1YnNjcmliZXJQYXJhbSwKKwlJbGxlZ2FsRXF1aXBtZW50UGFyYW0sCisJQmVhcmVyU2Vydk5vdFByb3ZQYXJhbSwKKwlUZWxlc2Vydk5vdFByb3ZQYXJhbSwKKwlUcmFjaW5nQnVmZmVyRnVsbFBhcmFtLAorCU5vUm9hbWluZ05iUGFyYW0sCisJQWJzZW50U3Vic2NyaWJlclBhcmFtLAorCUJ1c3lTdWJzY3JpYmVyUGFyYW0sCisJTm9TdWJzY3JpYmVyUmVwbHlQYXJhbSwKKwlGb3J3YXJkaW5nVmlvbGF0aW9uUGFyYW0sCisJRm9yd2FyZGluZ0ZhaWxlZFBhcmFtLCAKKwlBVEktTm90QWxsb3dlZFBhcmFtLAorCVN1YkJ1c3lGb3JNVC1TTVMtUGFyYW0sCisJTWVzc2FnZVdhaXRMaXN0RnVsbFBhcmFtLAorCUFic2VudFN1YnNjcmliZXJTTS1QYXJhbSwKKwlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNLAorCVJlc291cmNlTGltaXRhdGlvblBhcmFtLAorCU5vR3JvdXBDYWxsTmJQYXJhbSwKKwlJbmNvbXBhdGlibGVUZXJtaW5hbFBhcmFtLAorCVNob3J0VGVybURlbmlhbFBhcmFtLAorCUxvbmdUZXJtRGVuaWFsUGFyYW0sCisJVW5hdXRob3JpemVkUmVxdWVzdGluZ05ldHdvcmstUGFyYW0sCisJVW5hdXRob3JpemVkTENTQ2xpZW50LVBhcmFtLAorCVBvc2l0aW9uTWV0aG9kRmFpbHVyZS1QYXJhbSwKK1Vua25vd25PclVucmVhY2hhYmxlTENTQ2xpZW50LVBhcmFtLAorCU1NLUV2ZW50Tm90U3VwcG9ydGVkLVBhcmFtLAorQVRTSS1Ob3RBbGxvd2VkUGFyYW0sCitBVE0tTm90QWxsb3dlZFBhcmFtLAorSWxsZWdhbFNTLU9wZXJhdGlvblBhcmFtLAorU1MtTm90QXZhaWxhYmxlUGFyYW0sCitTUy1TdWJzY3JpcHRpb25WaW9sYXRpb25QYXJhbSwKK0luZm9ybWF0aW9uTm90QXZhaWxhYmxlUGFyYW0sCitUYXJnZXRDZWxsT3V0c2lkZUdDQS1QYXJhbSwKK09uZ29pbmdHcm91cENhbGxQYXJhbQorCis7CisKK0lNUE9SVFMKKwlTUy1TdGF0dXMKK0ZST00gTUFQLVNTLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1EYXRhVHlwZXMgKDE0KSB2ZXJzaW9uMTEgKDExKX0KKworCVNpZ25hbEluZm8sCisJQmFzaWNTZXJ2aWNlQ29kZSwKKwlOZXR3b3JrUmVzb3VyY2UsCisJQWRkaXRpb25hbE5ldHdvcmtSZXNvdXJjZQorRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisKKwlTUy1Db2RlCitGUk9NIE1BUC1TUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLUNvZGUgKDE1KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorOworCitSb2FtaW5nTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJcm9hbWluZ05vdEFsbG93ZWRDYXVzZQlSb2FtaW5nTm90QWxsb3dlZENhdXNlLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxSb2FtaW5nTm90QWxsb3dlZENhdXNlCVswXSBBZGRpdGlvbmFsUm9hbWluZ05vdEFsbG93ZWRDYXVzZSBPUFRJT05BTCB9CisKKy0tCWlmIHRoZSBhZGRpdGlvbmFsUm9hbWluZ05vdGFsbG93ZWRDYXVzZSBpcyByZWNlaXZlZCBieSB0aGUgTVNDL1ZMUiBvciBTR1NOIHRoZW4gdGhlIAorLS0Jcm9hbWluZ05vdEFsbG93ZWRDYXVzZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0FkZGl0aW9uYWxSb2FtaW5nTm90QWxsb3dlZENhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwlzdXBwb3J0ZWRSQVQtVHlwZXNOb3RBbGxvd2VkICgwKSwKKwkuLi59CisKK1JvYW1pbmdOb3RBbGxvd2VkQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCXBsbW5Sb2FtaW5nTm90QWxsb3dlZCAgKDApLAorCW9wZXJhdG9yRGV0ZXJtaW5lZEJhcnJpbmcgICgzKX0KKworQ2FsbEJhcnJlZFBhcmFtIDo6PSBDSE9JQ0UgeworCWNhbGxCYXJyaW5nQ2F1c2UJQ2FsbEJhcnJpbmdDYXVzZSwKKwktLSBjYWxsIEJhcnJpbmdDYXVzZSBtdXN0IG5vdCBiZSB1c2VkIGluIHZlcnNpb24gMyBhbmQgaGlnaGVyCisJZXh0ZW5zaWJsZUNhbGxCYXJyZWRQYXJhbQlFeHRlbnNpYmxlQ2FsbEJhcnJlZFBhcmFtCisJLS0gZXh0ZW5zaWJsZUNhbGxCYXJyZWRQYXJhbSBtdXN0IG5vdCBiZSB1c2VkIGluIHZlcnNpb24gPDMKKwl9CisKK0NhbGxCYXJyaW5nQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCWJhcnJpbmdTZXJ2aWNlQWN0aXZlICAoMCksCisJb3BlcmF0b3JCYXJyaW5nICAoMSl9CisKK0V4dGVuc2libGVDYWxsQmFycmVkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwljYWxsQmFycmluZ0NhdXNlCUNhbGxCYXJyaW5nQ2F1c2UJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXVuYXV0aG9yaXNlZE1lc3NhZ2VPcmlnaW5hdG9yCVsxXSBOVUxMCQlPUFRJT05BTCB9CisKK0NVRy1SZWplY3RQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWN1Zy1SZWplY3RDYXVzZQlDVUctUmVqZWN0Q2F1c2UJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NVRy1SZWplY3RDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJaW5jb21pbmdDYWxsc0JhcnJlZFdpdGhpbkNVRyAgKDApLAorCXN1YnNjcmliZXJOb3RNZW1iZXJPZkNVRyAgKDEpLAorCXJlcXVlc3RlZEJhc2ljU2VydmljZVZpb2xhdGVzQ1VHLUNvbnN0cmFpbnRzICAoNSksCisJY2FsbGVkUGFydHlTUy1JbnRlcmFjdGlvblZpb2xhdGlvbiAgKDcpfQorCitTUy1JbmNvbXBhdGliaWxpdHlDYXVzZSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVsxXSBTUy1Db2RlCU9QVElPTkFMLAorCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzRdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwkuLi59CisKK1BXLVJlZ2lzdHJhdGlvbkZhaWx1cmVDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJdW5kZXRlcm1pbmVkICAoMCksCisJaW52YWxpZEZvcm1hdCAgKDEpLAorCW5ld1Bhc3N3b3Jkc01pc21hdGNoICAoMil9CisKK1NNLUVudW1lcmF0ZWREZWxpdmVyeUZhaWx1cmVDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJbWVtb3J5Q2FwYWNpdHlFeGNlZWRlZCAgKDApLAorCWVxdWlwbWVudFByb3RvY29sRXJyb3IgICgxKSwKKwllcXVpcG1lbnROb3RTTS1FcXVpcHBlZCAgKDIpLAorCXVua25vd25TZXJ2aWNlQ2VudHJlICAoMyksCisJc2MtQ29uZ2VzdGlvbiAgKDQpLAorCWludmFsaWRTTUUtQWRkcmVzcyAgKDUpLAorCXN1YnNjcmliZXJOb3RTQy1TdWJzY3JpYmVyICAoNil9CisKK1NNLURlbGl2ZXJ5RmFpbHVyZUNhdXNlIDo6PSBTRVFVRU5DRSB7CisJc20tRW51bWVyYXRlZERlbGl2ZXJ5RmFpbHVyZUNhdXNlCVNNLUVudW1lcmF0ZWREZWxpdmVyeUZhaWx1cmVDYXVzZSwKKwlkaWFnbm9zdGljSW5mbwlTaWduYWxJbmZvCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBYnNlbnRTdWJzY3JpYmVyU00tUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwsCisJLS0gQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBjYW4gYmUgZWl0aGVyIGZvciBub24tR1BSUyAKKwktLSBvciBmb3IgR1BSUworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNICAJWzBdIAlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCU9QVElPTkFMIH0KKwktLSBpZiByZWNlaXZlZCwgYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gCisJLS0gaXMgZm9yIEdQUlMgYW5kIGFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgCisJLS0gZm9yIG5vbi1HUFJTCisKK0Fic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gOjo9IElOVEVHRVIgKDAuLjI1NSkKKwktLSBBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjA0MAorCitTeXN0ZW1GYWlsdXJlUGFyYW0gOjo9IENIT0lDRSB7CisJbmV0d29ya1Jlc291cmNlCU5ldHdvcmtSZXNvdXJjZSwKKwktLSBuZXR3b3JrUmVzb3VyY2UgbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDMKKwlleHRlbnNpYmxlU3lzdGVtRmFpbHVyZVBhcmFtCUV4dGVuc2libGVTeXN0ZW1GYWlsdXJlUGFyYW0KKwktLSBleHRlbnNpYmxlU3lzdGVtRmFpbHVyZVBhcmFtIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiA8MworCX0KKworRXh0ZW5zaWJsZVN5c3RlbUZhaWx1cmVQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCW5ldHdvcmtSZXNvdXJjZQlOZXR3b3JrUmVzb3VyY2UJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbE5ldHdvcmtSZXNvdXJjZQlbMF0gQWRkaXRpb25hbE5ldHdvcmtSZXNvdXJjZQlPUFRJT05BTCwKKwlmYWlsdXJlQ2F1c2VQYXJhbQlbMV0gRmFpbHVyZUNhdXNlUGFyYW0JT1BUSU9OQUwgfQorCitGYWlsdXJlQ2F1c2VQYXJhbSA6Oj0gRU5VTUVSQVRFRCB7CisJbGltaXRSZWFjaGVkT25OdW1iZXJPZkNvbmN1cnJlbnRMb2NhdGlvblJlcXVlc3RzICgwKSwKKwkuLi4gfQorCS0tIGlmIHVua25vd24gdmFsdWUgaXMgcmVjZWl2ZWQgaW4gRmFpbHVyZUNhdXNlUGFyYW0gaXQgc2hhbGwgYmUgaWdub3JlZAorCisKK0RhdGFNaXNzaW5nUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVW5leHBlY3RlZERhdGFQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitGYWNpbGl0eU5vdFN1cFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJc2hhcGVPZkxvY2F0aW9uRXN0aW1hdGVOb3RTdXBwb3J0ZWQgWzBdCU5VTEwJCU9QVElPTkFMLAorCW5lZWRlZExjc0NhcGFiaWxpdHlOb3RTdXBwb3J0ZWRJblNlcnZpbmdOb2RlIFsxXSBOVUxMCU9QVElPTkFMIH0KKworT1ItTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Vua25vd25TdWJzY3JpYmVyUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl1bmtub3duU3Vic2NyaWJlckRpYWdub3N0aWMJVW5rbm93blN1YnNjcmliZXJEaWFnbm9zdGljCU9QVElPTkFMfQorCitVbmtub3duU3Vic2NyaWJlckRpYWdub3N0aWMgOjo9IEVOVU1FUkFURUQgeworCWltc2lVbmtub3duICAoMCksCisJZ3Bycy1lcHMtU3Vic2NyaXB0aW9uVW5rbm93biAgKDEpLAorCS4uLiwKKwlucGRiTWlzbWF0Y2ggICgyKX0KKwktLSBpZiB1bmtub3duIHZhbHVlcyBhcmUgcmVjZWl2ZWQgaW4gCQorCS0tIFVua25vd25TdWJzY3JpYmVyRGlhZ25vc3RpYyB0aGV5IHNoYWxsIGJlIGRpc2NhcmRlZAorCitOdW1iZXJDaGFuZ2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVW5pZGVudGlmaWVkU3ViUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworSWxsZWdhbFN1YnNjcmliZXJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbGxlZ2FsRXF1aXBtZW50UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQmVhcmVyU2Vydk5vdFByb3ZQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitUZWxlc2Vydk5vdFByb3ZQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitUcmFjaW5nQnVmZmVyRnVsbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK05vUm9hbWluZ05iUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQWJzZW50U3Vic2NyaWJlclBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWJzZW50U3Vic2NyaWJlclJlYXNvbglbMF0gQWJzZW50U3Vic2NyaWJlclJlYXNvbglPUFRJT05BTH0KKworQWJzZW50U3Vic2NyaWJlclJlYXNvbiA6Oj0gRU5VTUVSQVRFRCB7CisJaW1zaURldGFjaCAoMCksCisJcmVzdHJpY3RlZEFyZWEgKDEpLAorCW5vUGFnZVJlc3BvbnNlICgyKSwKKwkuLi4gLAorCXB1cmdlZE1TICgzKX0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzogYXQgcmVjZXB0aW9uIG9mIG90aGVyIHZhbHVlcyB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgCistLSBBYnNlbnRTdWJzY3JpYmVyUmVhc29uIHNoYWxsIGJlIGlnbm9yZWQuIAorLS0gVGhlIEFic2VudFN1YnNjcmliZXJSZWFzb246IHB1cmdlZE1TIGlzIGRlZmluZWQgZm9yIHRoZSBTdXBlci1DaGFyZ2VyIGZlYXR1cmUgCistLSAoc2VlIFRTIDIzLjExNikuIElmIHRoaXMgdmFsdWUgaXMgcmVjZWl2ZWQgaW4gYSBQcm92aWRlIFJvYW1pbmcgTnVtYmVyIHJlc3BvbnNlCistLSBpdCBzaGFsbCBiZSBtYXBwZWQgdG8gdGhlIEFic2VudFN1YnNjcmliZXJSZWFzb246IGltc2lEZXRhY2ggaW4gdGhlIFNlbmQgUm91dGVpbmcKKy0tIEluZm9ybWF0aW9uIHJlc3BvbnNlCisKK0J1c3lTdWJzY3JpYmVyUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwljY2JzLVBvc3NpYmxlCVswXSBOVUxMCQlPUFRJT05BTCwKKwljY2JzLUJ1c3kJCVsxXSBOVUxMCQlPUFRJT05BTH0KKworTm9TdWJzY3JpYmVyUmVwbHlQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitGb3J3YXJkaW5nVmlvbGF0aW9uUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRm9yd2FyZGluZ0ZhaWxlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FUSS1Ob3RBbGxvd2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQVRTSS1Ob3RBbGxvd2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQVRNLU5vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbGxlZ2FsU1MtT3BlcmF0aW9uUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU1MtTm90QXZhaWxhYmxlUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU1MtU3Vic2NyaXB0aW9uVmlvbGF0aW9uUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworSW5mb3JtYXRpb25Ob3RBdmFpbGFibGVQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTdWJCdXN5Rm9yTVQtU01TLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWdwcnNDb25uZWN0aW9uU3VzcGVuZGVkCU5VTEwJCQlPUFRJT05BTCB9CisJLS0gSWYgR3Byc0Nvbm5lY3Rpb25TdXNwZW5kZWQgaXMgbm90IHVuZGVyc3Rvb2QgaXQgc2hhbGwgCisJLS0gYmUgZGlzY2FyZGVkCisKK01lc3NhZ2VXYWl0TGlzdEZ1bGxQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitSZXNvdXJjZUxpbWl0YXRpb25QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitOb0dyb3VwQ2FsbE5iUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworSW5jb21wYXRpYmxlVGVybWluYWxQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTaG9ydFRlcm1EZW5pYWxQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCS4uLn0KKworTG9uZ1Rlcm1EZW5pYWxQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCS4uLn0KKworVW5hdXRob3JpemVkUmVxdWVzdGluZ05ldHdvcmstUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVW5hdXRob3JpemVkTENTQ2xpZW50LVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJdW5hdXRob3JpemVkTENTQ2xpZW50LURpYWdub3N0aWMJWzBdIFVuYXV0aG9yaXplZExDU0NsaWVudC1EaWFnbm9zdGljCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCQkJT1BUSU9OQUwsCisJLi4uIH0KKworVW5hdXRob3JpemVkTENTQ2xpZW50LURpYWdub3N0aWMgOjo9IEVOVU1FUkFURUQgeworCW5vQWRkaXRpb25hbEluZm9ybWF0aW9uICgwKSwKKwljbGllbnROb3RJbk1TUHJpdmFjeUV4Y2VwdGlvbkxpc3QgKDEpLAorCWNhbGxUb0NsaWVudE5vdFNldHVwICgyKSwKKwlwcml2YWN5T3ZlcnJpZGVOb3RBcHBsaWNhYmxlICgzKSwKKwlkaXNhbGxvd2VkQnlMb2NhbFJlZ3VsYXRvcnlSZXF1aXJlbWVudHMgKDQpLAorCS4uLiwKKwl1bmF1dGhvcml6ZWRQcml2YWN5Q2xhc3MgKDUpLAorCXVuYXV0aG9yaXplZENhbGxTZXNzaW9uVW5yZWxhdGVkRXh0ZXJuYWxDbGllbnQgKDYpLAorCXVuYXV0aG9yaXplZENhbGxTZXNzaW9uUmVsYXRlZEV4dGVybmFsQ2xpZW50ICg3KSB9CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlhbnkgdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIGlnbm9yZWQKKworUG9zaXRpb25NZXRob2RGYWlsdXJlLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJcG9zaXRpb25NZXRob2RGYWlsdXJlLURpYWdub3N0aWMJWzBdIFBvc2l0aW9uTWV0aG9kRmFpbHVyZS1EaWFnbm9zdGljCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCQkJT1BUSU9OQUwsCisJLi4uIH0KKworUG9zaXRpb25NZXRob2RGYWlsdXJlLURpYWdub3N0aWMgOjo9IEVOVU1FUkFURUQgeworCWNvbmdlc3Rpb24gICgwKSwKKwlpbnN1ZmZpY2llbnRSZXNvdXJjZXMgICgxKSwKKwlpbnN1ZmZpY2llbnRNZWFzdXJlbWVudERhdGEgICgyKSwKKwlpbmNvbnNpc3RlbnRNZWFzdXJlbWVudERhdGEgICgzKSwKKwlsb2NhdGlvblByb2NlZHVyZU5vdENvbXBsZXRlZCAgKDQpLAorCWxvY2F0aW9uUHJvY2VkdXJlTm90U3VwcG9ydGVkQnlUYXJnZXRNUyAgKDUpLAorCXFvU05vdEF0dGFpbmFibGUgICg2KSwKKwlwb3NpdGlvbk1ldGhvZE5vdEF2YWlsYWJsZUluTmV0d29yawkoNyksCisJcG9zaXRpb25NZXRob2ROb3RBdmFpbGFibGVJbkxvY2F0aW9uQXJlYQkoOCksCisJLi4uIH0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCWFueSB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgaWdub3JlZAorCitVbmtub3duT3JVbnJlYWNoYWJsZUxDU0NsaWVudC1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNTS1FdmVudE5vdFN1cHBvcnRlZC1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitUYXJnZXRDZWxsT3V0c2lkZUdDQS1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitPbmdvaW5nR3JvdXBDYWxsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRXh0ZW5zaW9uRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUV4dGVuc2lvbkRhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0YzA1NwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUV4dGVuc2lvbkRhdGFUeXBlcy5hc24KQEAgLTAsMCArMSw3NCBAQAorLS0gJElkOiBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcy5hc24KKy0tCistLSBUYWtlbiBmcm9tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkKKy0tCistLSAxNy43LjExIEV4dGVuc2lvbiBkYXRhIHR5cGVzCistLQorCitNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisKKwlQcml2YXRlRXh0ZW5zaW9uLAorCUV4dGVuc2lvbkNvbnRhaW5lciwKKwlTTFItQXJnRXh0ZW5zaW9uQ29udGFpbmVyOworCisKKy0tIElPQyBmb3IgcHJpdmF0ZSBNQVAgZXh0ZW5zaW9ucworCisKK01BUC1FWFRFTlNJT04gIDo6PSBDTEFTUyB7CisJJkV4dGVuc2lvblR5cGUJCQkJT1BUSU9OQUwsCisJJmV4dGVuc2lvbklkIAlPQkpFQ1QgSURFTlRJRklFUiB9CisJLS0gVGhlIGxlbmd0aCBvZiB0aGUgT2JqZWN0IElkZW50aWZpZXIgc2hhbGwgbm90IGV4Y2VlZCAxNiBvY3RldHMgYW5kIHRoZQorCS0tIG51bWJlciBvZiBjb21wb25lbnRzIG9mIHRoZSBPYmplY3QgSWRlbnRpZmllciBzaGFsbCBub3QgZXhjZWVkIDE2CisKKy0tIGRhdGEgdHlwZXMKKworRXh0ZW5zaW9uQ29udGFpbmVyIDo6PSBTRVFVRU5DRSB7CisJcHJpdmF0ZUV4dGVuc2lvbkxpc3QJWzBdUHJpdmF0ZUV4dGVuc2lvbkxpc3QJT1BUSU9OQUwsIAorCXBjcy1FeHRlbnNpb25zCVsxXVBDUy1FeHRlbnNpb25zCU9QVElPTkFMLAorCS4uLn0KKworU0xSLUFyZ0V4dGVuc2lvbkNvbnRhaW5lciA6Oj0gU0VRVUVOQ0UgeworCXByaXZhdGVFeHRlbnNpb25MaXN0CVswXVByaXZhdGVFeHRlbnNpb25MaXN0CU9QVElPTkFMLCAKKwlzbHItQXJnLVBDUy1FeHRlbnNpb25zCVsxXVNMUi1BcmctUENTLUV4dGVuc2lvbnMJT1BUSU9OQUwsCisJLi4ufQorCitQcml2YXRlRXh0ZW5zaW9uTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZQcml2YXRlRXh0ZW5zaW9ucykgT0YKKwkJCQlQcml2YXRlRXh0ZW5zaW9uCisKK1ByaXZhdGVFeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKwlleHRJZAkJTUFQLUVYVEVOU0lPTi4mZXh0ZW5zaW9uSWQKKwkJCQkoe0V4dGVuc2lvblNldH0pLAorCWV4dFR5cGUJCU1BUC1FWFRFTlNJT04uJkV4dGVuc2lvblR5cGUKKwkJCQkoe0V4dGVuc2lvblNldH17QGV4dElkfSkJT1BUSU9OQUx9CisKK21heE51bU9mUHJpdmF0ZUV4dGVuc2lvbnMgIElOVEVHRVIgOjo9IDEwCisKK0V4dGVuc2lvblNldAkJTUFQLUVYVEVOU0lPTiA6Oj0KKwkJey4uLgorCQkgLS0gRXh0ZW5zaW9uU2V0IGlzIHRoZSBzZXQgb2YgYWxsIGRlZmluZWQgcHJpdmF0ZSBleHRlbnNpb25zCisJfQorCS0tIFVuc3VwcG9ydGVkIHByaXZhdGUgZXh0ZW5zaW9ucyBzaGFsbCBiZSBkaXNjYXJkZWQgaWYgcmVjZWl2ZWQuCisKK1BDUy1FeHRlbnNpb25zIDo6PSBTRVFVRU5DRSB7CisJLi4ufQorCitTTFItQXJnLVBDUy1FeHRlbnNpb25zIDo6PSBTRVFVRU5DRSB7CisJLi4uLAorCW5hLUVTUkstUmVxdWVzdAlbMF0JTlVMTAkJT1BUSU9OQUwgfQorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTENTLURhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1MQ1MtRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDM0Yjg5Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTENTLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSw2NTcgQEAKKy0tICRJZDogTUFQLUxDUy1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSBNQVAtTENTLURhdGFUeXBlcy5hc24KKy0tCistLSBUYWtlbiBmcm9tIDNHUFAgVFMgMjkuMDAyICBWOC45LjAgKDIwMDktMDQpCistLQorLS0gMTcuNy4xMyBMb2NhdGlvbiBzZXJ2aWNlIGRhdGEgdHlwZXMKKy0tCisKK01BUC1MQ1MtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUxDUy1EYXRhVHlwZXMgKDI1KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKK0lNUExJQ0lUIFRBR1MKKzo6PQorQkVHSU4KKworRVhQT1JUUworCVJvdXRpbmdJbmZvRm9yTENTLUFyZywKKwlSb3V0aW5nSW5mb0ZvckxDUy1SZXMsCisJUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcsCisJUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1SZXMsCisJU3Vic2NyaWJlckxvY2F0aW9uUmVwb3J0LUFyZywKKwlTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtUmVzLAorTG9jYXRpb25UeXBlLCAKK0RlZmVycmVkTG9jYXRpb25FdmVudFR5cGUsCitMQ1NDbGllbnROYW1lLAorTENTLVFvUywKK0hvcml6b250YWwtQWNjdXJhY3ksCitSZXNwb25zZVRpbWUsCitFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sIAorVmVsb2NpdHlFc3RpbWF0ZSwKK1N1cHBvcnRlZEdBRFNoYXBlcywKK0FkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwKK0xDU1JlcXVlc3RvcklELCAKK0xDUy1SZWZlcmVuY2VOdW1iZXIsCitMQ1NDb2Rld29yZCwKK0FyZWFFdmVudEluZm8sCitSZXBvcnRpbmdQTE1OTGlzdCwKK1BlcmlvZGljTERSSW5mbywKK1NlcXVlbmNlTnVtYmVyCis7CisKK0lNUE9SVFMKKwlBZGRyZXNzU3RyaW5nLAorCUlTRE4tQWRkcmVzc1N0cmluZywKKwlJTUVJLAorCUlNU0ksCisJTE1TSSwKKwlTdWJzY3JpYmVySWRlbnRpdHksCisJQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uLAorCUxDU0NsaWVudEV4dGVybmFsSUQsCisJTENTQ2xpZW50SW50ZXJuYWxJRCwKK0xDU1NlcnZpY2VUeXBlSUQsCitDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSwKK1BMTU4tSWQKK0ZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lciwKKwlTTFItQXJnRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisKKwlVU1NELURhdGFDb2RpbmdTY2hlbWUsCitVU1NELVN0cmluZworRlJPTSBNQVAtU1MtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKQorICAgbWFwLVNTLURhdGFUeXBlcyAoMTQpIHZlcnNpb24xMSAoMTEpfQorCisJQVBOLAorCUdTTi1BZGRyZXNzLAorCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cworRlJPTSBNQVAtTVMtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLU1TLURhdGFUeXBlcyAoMTEpIHZlcnNpb24xMSAoMTEpfQorCisJQWRkaXRpb25hbC1OdW1iZXIKK0ZST00gTUFQLVNNLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TTS1EYXRhVHlwZXMgKDE2KSB2ZXJzaW9uMTEgKDExKX0KKzsKKworCitSb3V0aW5nSW5mb0ZvckxDUy1BcmcgOjo9IFNFUVVFTkNFIHsKKwltbGNOdW1iZXIJCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJdGFyZ2V0TVMJCVsxXSBTdWJzY3JpYmVySWRlbnRpdHksCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitSb3V0aW5nSW5mb0ZvckxDUy1SZXMgOjo9IFNFUVVFTkNFIHsKKwl0YXJnZXRNUwkJWzBdIFN1YnNjcmliZXJJZGVudGl0eSwKKwlsY3NMb2NhdGlvbkluZm8JWzFdIExDU0xvY2F0aW9uSW5mbywKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdi1nbWxjLUFkZHJlc3MJWzNdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWgtZ21sYy1BZGRyZXNzCVs0XQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlwcHItQWRkcmVzcwlbNV0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJYWRkaXRpb25hbC12LWdtbGMtQWRkcmVzcwlbNl0JR1NOLUFkZHJlc3MJT1BUSU9OQUwgfQorCitMQ1NMb2NhdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwluZXR3b3JrTm9kZS1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCS0tIE5ldHdvcmtOb2RlLW51bWJlciBjYW4gYmUgZWl0aGVyIG1zYy1udW1iZXIgb3Igc2dzbi1udW1iZXIKKwlsbXNpCQkJWzBdIExNU0kJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJZ3Byc05vZGVJbmRpY2F0b3IgCVsyXSBOVUxMCQlPUFRJT05BTCwKKwktLSBncHJzTm9kZUluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUgU0dTTiBudW1iZXIgaXMgc2VudCBhcyB0aGUgTmV0d29yayBOb2RlIE51bWJlcgorCWFkZGl0aW9uYWwtTnVtYmVyCVszXSBBZGRpdGlvbmFsLU51bWJlcglPUFRJT05BTCwKKwlzdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJWzRdCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlPUFRJT05BTCwKKwlhZGRpdGlvbmFsLUxDUy1DYXBhYmlsaXR5U2V0cwlbNV0JU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCU9QVElPTkFMCisJfQorCitQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZyA6Oj0gU0VRVUVOQ0UgeworCWxvY2F0aW9uVHlwZQlMb2NhdGlvblR5cGUsCisJbWxjLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJbGNzLUNsaWVudElECVswXSBMQ1MtQ2xpZW50SUQJT1BUSU9OQUwsCisJcHJpdmFjeU92ZXJyaWRlCVsxXSBOVUxMCQlPUFRJT05BTCwKKwlpbXNpCQkJWzJdIElNU0kJCU9QVElPTkFMLAorCW1zaXNkbgkJWzNdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlsbXNpCQkJWzRdIExNU0kJCU9QVElPTkFMLAorCWltZWkJCQlbNV0gSU1FSQkJT1BUSU9OQUwsCisJbGNzLVByaW9yaXR5CVs2XSBMQ1MtUHJpb3JpdHkJT1BUSU9OQUwsCisJbGNzLVFvUwkJWzddIExDUy1Rb1MJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs4XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlzdXBwb3J0ZWRHQURTaGFwZXMJWzldCVN1cHBvcnRlZEdBRFNoYXBlcwlPUFRJT05BTCwKKwlsY3MtUmVmZXJlbmNlTnVtYmVyCVsxMF0JTENTLVJlZmVyZW5jZU51bWJlcglPUFRJT05BTCwKKwlsY3NTZXJ2aWNlVHlwZUlECVsxMV0JTENTU2VydmljZVR5cGVJRAlPUFRJT05BTCwKKwlsY3NDb2Rld29yZAlbMTJdCUxDU0NvZGV3b3JkCU9QVElPTkFMLAorCWxjcy1Qcml2YWN5Q2hlY2sJWzEzXQlMQ1MtUHJpdmFjeUNoZWNrCU9QVElPTkFMLAorCWFyZWFFdmVudEluZm8JWzE0XQlBcmVhRXZlbnRJbmZvCU9QVElPTkFMLAorCWgtZ21sYy1BZGRyZXNzCVsxNV0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJbW8tbHJTaG9ydENpcmN1aXRJbmRpY2F0b3IJWzE2XSBOVUxMCQlPUFRJT05BTCwKKwlwZXJpb2RpY0xEUkluZm8JWzE3XSBQZXJpb2RpY0xEUkluZm8JT1BUSU9OQUwsCisJcmVwb3J0aW5nUExNTkxpc3QJWzE4XSBSZXBvcnRpbmdQTE1OTGlzdAlPUFRJT05BTCB9CisKKwktLSBvbmUgb2YgaW1zaSBvciBtc2lzZG4gaXMgbWFuZGF0b3J5CisJLS0gSWYgYSBsb2NhdGlvbiBlc3RpbWF0ZSB0eXBlIGluZGljYXRlcyBhY3RpdmF0ZSBkZWZlcnJlZCBsb2NhdGlvbiBvciBjYW5jZWwgZGVmZXJyZWQgCisJLS0gbG9jYXRpb24sIGEgbGNzLVJlZmVyZW5jZSBudW1iZXIgc2hhbGwgYmUgaW5jbHVkZWQuCisKK0xvY2F0aW9uVHlwZSA6Oj0gU0VRVUVOQ0UgeworCWxvY2F0aW9uRXN0aW1hdGVUeXBlCVswXSBMb2NhdGlvbkVzdGltYXRlVHlwZSwKKwkuLi4sCisJZGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZQlbMV0gRGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZQlPUFRJT05BTCB9CisKK0xvY2F0aW9uRXN0aW1hdGVUeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwljdXJyZW50TG9jYXRpb24JKDApLAorCWN1cnJlbnRPckxhc3RLbm93bkxvY2F0aW9uCSgxKSwKKwlpbml0aWFsTG9jYXRpb24JKDIpLAorCS4uLiwKKwlhY3RpdmF0ZURlZmVycmVkTG9jYXRpb24JKDMpLAorCWNhbmNlbERlZmVycmVkTG9jYXRpb24JKDQpICwKKwlub3RpZmljYXRpb25WZXJpZmljYXRpb25Pbmx5CSg1KSB9CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlhIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnIGNvbnRhaW5pbmcgYW4gdW5yZWNvZ25pemVkIExvY2F0aW9uRXN0aW1hdGVUeXBlCistLQlzaGFsbCBiZSByZWplY3RlZCBieSB0aGUgcmVjZWl2ZXIgd2l0aCBhIHJldHVybiBlcnJvciBjYXVzZSBvZiB1bmV4cGVjdGVkIGRhdGEgdmFsdWUKKworRGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZSA6Oj0gQklUIFNUUklORyB7CisJbXNBdmFpbGFibGUJKDApICwKKwllbnRlcmluZ0ludG9BcmVhCSgxKSwKKwlsZWF2aW5nRnJvbUFyZWEJKDIpLAorCWJlaW5nSW5zaWRlQXJlYQkoMykgLAorCXBlcmlvZGljTERSCSg0KSAgfSAoU0laRSAoMS4uMTYpKSAKKy0tIGJlaW5nSW5zaWRlQXJlYSBpcyBhbHdheXMgdHJlYXRlZCBhcyBvbmVUaW1lRXZlbnQgcmVnYXJkbGVzcyBvZiB0aGUgcG9zc2libGUgdmFsdWUKKy0tIG9mIG9jY3VycmVuY2VJbmZvIGluc2lkZSBhcmVhRXZlbnRJbmZvLgorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gYSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZyBjb250YWluaW5nIG90aGVyIHZhbHVlcyB0aGFuIGxpc3RlZCBhYm92ZSBpbiAKKy0tIERlZmVycmVkTG9jYXRpb25FdmVudFR5cGUgc2hhbGwgYmUgcmVqZWN0ZWQgYnkgdGhlIHJlY2VpdmVyIHdpdGggYSByZXR1cm4gZXJyb3IgY2F1c2Ugb2YgCistLSB1bmV4cGVjdGVkIGRhdGEgdmFsdWUuCisKK0xDUy1DbGllbnRJRCA6Oj0gU0VRVUVOQ0UgeworCWxjc0NsaWVudFR5cGUJWzBdIExDU0NsaWVudFR5cGUsCisJbGNzQ2xpZW50RXh0ZXJuYWxJRAlbMV0gTENTQ2xpZW50RXh0ZXJuYWxJRAlPUFRJT05BTCwKKwlsY3NDbGllbnREaWFsZWRCeU1TCVsyXSBBZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWxjc0NsaWVudEludGVybmFsSUQJWzNdIExDU0NsaWVudEludGVybmFsSUQJT1BUSU9OQUwsCisJbGNzQ2xpZW50TmFtZQlbNF0gTENTQ2xpZW50TmFtZQlPUFRJT05BTCwKKwkuLi4sCisJbGNzQVBOCQlbNV0gQVBOCQlPUFRJT05BTCwKKwlsY3NSZXF1ZXN0b3JJRAlbNl0gTENTUmVxdWVzdG9ySUQJT1BUSU9OQUwgfQorCitMQ1NDbGllbnRUeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwllbWVyZ2VuY3lTZXJ2aWNlcwkoMCksCisJdmFsdWVBZGRlZFNlcnZpY2VzCSgxKSwKKwlwbG1uT3BlcmF0b3JTZXJ2aWNlcwkoMiksCisJbGF3ZnVsSW50ZXJjZXB0U2VydmljZXMJKDMpLAorCS4uLiB9CisJLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tCXVucmVjb2duaXplZCB2YWx1ZXMgbWF5IGJlIGlnbm9yZWQgaWYgdGhlIExDUyBjbGllbnQgdXNlcyB0aGUgcHJpdmFjeSBvdmVycmlkZQorCS0tCW90aGVyd2lzZSwgYW4gdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIHRyZWF0ZWQgYXMgdW5leHBlY3RlZCBkYXRhIGJ5IGEgcmVjZWl2ZXIKKwktLQlhIHJldHVybiBlcnJvciBzaGFsbCB0aGVuIGJlIHJldHVybmVkIGlmIHJlY2VpdmVkIGluIGEgTUFQIGludm9rZSAKKworTENTQ2xpZW50TmFtZSA6Oj0gU0VRVUVOQ0UgeworCWRhdGFDb2RpbmdTY2hlbWUJWzBdIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwluYW1lU3RyaW5nCVsyXSBOYW1lU3RyaW5nLAorCS4uLiwKKwlsY3MtRm9ybWF0SW5kaWNhdG9yCVszXSBMQ1MtRm9ybWF0SW5kaWNhdG9yCU9QVElPTkFMIH0KKworLS0gVGhlIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSBzaGFsbCBpbmRpY2F0ZSB1c2Ugb2YgdGhlIGRlZmF1bHQgYWxwaGFiZXQgdGhyb3VnaCB0aGUKKy0tIGZvbGxvd2luZyBlbmNvZGluZworLS0JYml0CTcgNiA1IDQgMyAyIDEgMAorLS0JCTAgMCAwIDAgMSAxIDEgMQorCitOYW1lU3RyaW5nIDo6PSBVU1NELVN0cmluZyAoU0laRSAoMS4ubWF4TmFtZVN0cmluZ0xlbmd0aCkpCisKK21heE5hbWVTdHJpbmdMZW5ndGggIElOVEVHRVIgOjo9IDYzCisKK0xDU1JlcXVlc3RvcklEIDo6PSBTRVFVRU5DRSB7CisJZGF0YUNvZGluZ1NjaGVtZQlbMF0gVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCXJlcXVlc3RvcklEU3RyaW5nCVsxXSBSZXF1ZXN0b3JJRFN0cmluZywKKwkuLi4sCisJbGNzLUZvcm1hdEluZGljYXRvcglbMl0gTENTLUZvcm1hdEluZGljYXRvcglPUFRJT05BTCB9CisKK1JlcXVlc3RvcklEU3RyaW5nIDo6PSBVU1NELVN0cmluZyAoU0laRSAoMS4ubWF4UmVxdWVzdG9ySURTdHJpbmdMZW5ndGgpKQorCittYXhSZXF1ZXN0b3JJRFN0cmluZ0xlbmd0aCAgSU5URUdFUiA6Oj0gNjMKKworTENTLUZvcm1hdEluZGljYXRvciA6Oj0gRU5VTUVSQVRFRCB7CisJbG9naWNhbE5hbWUJKDApLAorCWUtbWFpbEFkZHJlc3MJKDEpLAorCW1zaXNkbgkJKDIpLAorCXVybAkJCSgzKSwKKwlzaXBVcmwJCSg0KSwKKwkuLi4gfQorCitMQ1MtUHJpb3JpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gMCA9IGhpZ2hlc3QgcHJpb3JpdHkKKwktLSAxID0gbm9ybWFsIHByaW9yaXR5CisJLS0gYWxsIG90aGVyIHZhbHVlcyB0cmVhdGVkIGFzIDEgCisKK0xDUy1Rb1MgOjo9IFNFUVVFTkNFIHsKKwlob3Jpem9udGFsLWFjY3VyYWN5CVswXSBIb3Jpem9udGFsLUFjY3VyYWN5CU9QVElPTkFMLAorCXZlcnRpY2FsQ29vcmRpbmF0ZVJlcXVlc3QJWzFdIE5VTEwJCU9QVElPTkFMLAorCXZlcnRpY2FsLWFjY3VyYWN5CVsyXSBWZXJ0aWNhbC1BY2N1cmFjeQlPUFRJT05BTCwJcmVzcG9uc2VUaW1lCVszXSBSZXNwb25zZVRpbWUJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXZlbG9jaXR5UmVxdWVzdAlbNV0gTlVMTAkJT1BUSU9OQUwKK30KKworSG9yaXpvbnRhbC1BY2N1cmFjeSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBiaXQgOCA9IDAKKwktLSBiaXRzIDctMSA9IDcgYml0IFVuY2VydGFpbnR5IENvZGUgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4gVGhlIGhvcml6b250YWwgbG9jYXRpb24gCisJLS0gZXJyb3Igc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgZXJyb3IgaW5kaWNhdGVkIGJ5IHRoZSB1bmNlcnRhaW50eSBjb2RlIHdpdGggNjclCisJLS0gY29uZmlkZW5jZS4KKworVmVydGljYWwtQWNjdXJhY3kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gYml0IDggPSAwCisJLS0gYml0cyA3LTEgPSA3IGJpdCBWZXJ0aWNhbCBVbmNlcnRhaW50eSBDb2RlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuIAorCS0tIFRoZSB2ZXJ0aWNhbCBsb2NhdGlvbiBlcnJvciBzaG91bGQgYmUgbGVzcyB0aGFuIHRoZSBlcnJvciBpbmRpY2F0ZWQgCisJLS0gYnkgdGhlIHVuY2VydGFpbnR5IGNvZGUgd2l0aCA2NyUgY29uZmlkZW5jZS4KKworUmVzcG9uc2VUaW1lIDo6PSBTRVFVRU5DRSB7CisJcmVzcG9uc2VUaW1lQ2F0ZWdvcnkJUmVzcG9uc2VUaW1lQ2F0ZWdvcnksCisJLi4ufQorLS0Jbm90ZTogYW4gZXhwYW5kYWJsZSBTRVFVRU5DRSBzaW1wbGlmaWVzIGxhdGVyIGFkZGl0aW9uIG9mIGEgbnVtZXJpYyByZXNwb25zZSB0aW1lLgorCitSZXNwb25zZVRpbWVDYXRlZ29yeSA6Oj0gRU5VTUVSQVRFRCB7CisJbG93ZGVsYXkgICgwKSwKKwlkZWxheXRvbGVyYW50ICAoMSksCisJLi4uIH0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCWFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHZhbHVlIDEgKGRlbGF5dG9sZXJhbnQpCisKK1N1cHBvcnRlZEdBRFNoYXBlcyA6Oj0gQklUIFNUUklORyB7CisJZWxsaXBzb2lkUG9pbnQgICgwKSwKKwllbGxpcHNvaWRQb2ludFdpdGhVbmNlcnRhaW50eUNpcmNsZSAoMSksCisJZWxsaXBzb2lkUG9pbnRXaXRoVW5jZXJ0YWludHlFbGxpcHNlICgyKSwKKwlwb2x5Z29uICgzKSwKKwllbGxpcHNvaWRQb2ludFdpdGhBbHRpdHVkZSAoNCksCisJZWxsaXBzb2lkUG9pbnRXaXRoQWx0aXR1ZGVBbmRVbmNlcnRhaW50eUVsaXBzb2lkICg1KSwKKwllbGxpcHNvaWRBcmMgICg2KSB9IChTSVpFICg3Li4xNikpCistLSBBIG5vZGUgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgU2hhcGVzIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIgaXQgc3VwcG9ydHMuCistLSBleGNlcHRpb24gaGFuZGxpbmc6IGJpdHMgNyB0byAxNSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkLgorCitMQ1MtUmVmZXJlbmNlTnVtYmVyOjo9IE9DVEVUIFNUUklORyAoU0laRSgxKSkKKworTENTQ29kZXdvcmQgOjo9IFNFUVVFTkNFIHsKKwlkYXRhQ29kaW5nU2NoZW1lCVswXSBVU1NELURhdGFDb2RpbmdTY2hlbWUsCisJbGNzQ29kZXdvcmRTdHJpbmcJWzFdIExDU0NvZGV3b3JkU3RyaW5nLAorCS4uLn0KKworTENTQ29kZXdvcmRTdHJpbmcgOjo9IFVTU0QtU3RyaW5nIChTSVpFICgxLi5tYXhMQ1NDb2Rld29yZFN0cmluZ0xlbmd0aCkpCisKK21heExDU0NvZGV3b3JkU3RyaW5nTGVuZ3RoICBJTlRFR0VSIDo6PSAyMAorCitMQ1MtUHJpdmFjeUNoZWNrIDo6PSBTRVFVRU5DRSB7CisJY2FsbFNlc3Npb25VbnJlbGF0ZWQJWzBdIFByaXZhY3lDaGVja1JlbGF0ZWRBY3Rpb24sCisJY2FsbFNlc3Npb25SZWxhdGVkCVsxXSBQcml2YWN5Q2hlY2tSZWxhdGVkQWN0aW9uCU9QVElPTkFMLAorCS4uLn0KKworUHJpdmFjeUNoZWNrUmVsYXRlZEFjdGlvbiA6Oj0gRU5VTUVSQVRFRCB7CisJYWxsb3dlZFdpdGhvdXROb3RpZmljYXRpb24gKDApLAorCWFsbG93ZWRXaXRoTm90aWZpY2F0aW9uICgxKSwKKwlhbGxvd2VkSWZOb1Jlc3BvbnNlICgyKSwKKwlyZXN0cmljdGVkSWZOb1Jlc3BvbnNlICgzKSwKKwlub3RBbGxvd2VkICg0KSwKKwkuLi59CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlhIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnIGNvbnRhaW5pbmcgYW4gdW5yZWNvZ25pemVkIFByaXZhY3lDaGVja1JlbGF0ZWRBY3Rpb24KKy0tCXNoYWxsIGJlIHJlamVjdGVkIGJ5IHRoZSByZWNlaXZlciB3aXRoIGEgcmV0dXJuIGVycm9yIGNhdXNlIG9mIHVuZXhwZWN0ZWQgZGF0YSB2YWx1ZQorCitBcmVhRXZlbnRJbmZvIDo6PSBTRVFVRU5DRSB7CisJYXJlYURlZmluaXRpb24JWzBdCUFyZWFEZWZpbml0aW9uLAorCW9jY3VycmVuY2VJbmZvCVsxXQlPY2N1cnJlbmNlSW5mbwlPUFRJT05BTCwKKwlpbnRlcnZhbFRpbWUJWzJdCUludGVydmFsVGltZQlPUFRJT05BTCwKKwkuLi59CisKK0FyZWFEZWZpbml0aW9uIDo6PSBTRVFVRU5DRSB7CisJYXJlYUxpc3QJCVswXQlBcmVhTGlzdCwKKwkuLi59CisKK0FyZWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkFyZWFzKSBPRiBBcmVhCisKK21heE51bU9mQXJlYXMgIElOVEVHRVIgOjo9IDEwCisKK0FyZWEgOjo9IFNFUVVFTkNFIHsKKwlhcmVhVHlwZQkJWzBdCUFyZWFUeXBlLAorCWFyZWFJZGVudGlmaWNhdGlvbglbMV0JQXJlYUlkZW50aWZpY2F0aW9uLAorCS4uLn0KKworQXJlYVR5cGUgOjo9IEVOVU1FUkFURUQgeworCWNvdW50cnlDb2RlCSgwKSwKKwlwbG1uSWQJCSgxKSwKKwlsb2NhdGlvbkFyZWFJZAkoMiksCisJcm91dGluZ0FyZWFJZAkoMyksCisJY2VsbEdsb2JhbElkCSg0KSwKKwkuLi4sCisJdXRyYW5DZWxsSWQJKDUpIH0KKworQXJlYUlkZW50aWZpY2F0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjcpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0IGlmIDMgZGlnaXQgTU5DIGluY2x1ZGVkCisJLS0JCQlvciBmaWxsZXIgKDExMTEpCisJLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0cyA0IGFuZCA1CUxvY2F0aW9uIEFyZWEgQ29kZSAoTEFDKSBmb3IgTG9jYWwgQXJlYSBJZCwKKwktLQkJCVJvdXRpbmcgQXJlYSBJZCBhbmQgQ2VsbCBHbG9iYWwgSWQKKwktLSBvY3RldCA2CVJvdXRpbmcgQXJlYSBDb2RlIChSQUMpIGZvciBSb3V0aW5nIEFyZWEgSWQKKwktLSBvY3RldHMgNiBhbmQgNwlDZWxsIElkZW50aXR5IChDSSkgZm9yIENlbGwgR2xvYmFsIElkCisJLS0gb2N0ZXRzIDQgdW50aWwgNwlVdHJhbiBDZWxsIElkZW50aXR5IChVQy1JZCkgZm9yIFV0cmFuIENlbGwgSWQKKworT2NjdXJyZW5jZUluZm8gOjo9IEVOVU1FUkFURUQgeworCW9uZVRpbWVFdmVudAkoMCksCisJbXVsdGlwbGVUaW1lRXZlbnQJKDEpLAorCS4uLn0KKworSW50ZXJ2YWxUaW1lIDo6PSBJTlRFR0VSICgxLi4zMjc2NykKKwktLSBtaW5pbXVtIGludGVydmFsIHRpbWUgYmV0d2VlbiBhcmVhIHJlcG9ydHMgaW4gc2Vjb25kcworCitQZXJpb2RpY0xEUkluZm8gOjo9IFNFUVVFTkNFIHsKKwlyZXBvcnRpbmdBbW91bnQJCVJlcG9ydGluZ0Ftb3VudCwKKwlyZXBvcnRpbmdJbnRlcnZhbAlSZXBvcnRpbmdJbnRlcnZhbCwKKwkuLi59CistLSByZXBvcnRpbmdJbnRlcnZhbCB4IHJlcG9ydGluZ0Ftb3VudCBzaGFsbCBub3QgZXhjZWVkIDg2Mzk5OTkgKDk5IGRheXMsIDIzIGhvdXJzLAorLS0gNTkgbWludXRlcyBhbmQgNTkgc2Vjb25kcykgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBPTUEgTUxQIGFuZCBSTFAKKworUmVwb3J0aW5nQW1vdW50IDo6PSBJTlRFR0VSICgxLi5tYXhSZXBvcnRpbmdBbW91bnQpCisKK21heFJlcG9ydGluZ0Ftb3VudCBJTlRFR0VSIDo6PSA4NjM5OTk5CisKK1JlcG9ydGluZ0ludGVydmFsIDo6PSBJTlRFR0VSICgxLi5tYXhSZXBvcnRpbmdJbnRlcnZhbCkKKy0tIFJlcG9ydGluZ0ludGVydmFsIGlzIGluIHNlY29uZHMKKworbWF4UmVwb3J0aW5nSW50ZXJ2YWwgSU5URUdFUiA6Oj0gODYzOTk5OQorCitSZXBvcnRpbmdQTE1OTGlzdDo6PSBTRVFVRU5DRSB7CisJcGxtbi1MaXN0UHJpb3JpdGl6ZWQJCQlbMF0gTlVMTAkJCQkJT1BUSU9OQUwsCisJcGxtbi1MaXN0IAkJCQkJCVsxXSBQTE1OTGlzdCwKKwkuLi59CisKK1BMTU5MaXN0Ojo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUmVwb3J0aW5nUExNTikgT0YKKwkJCQlSZXBvcnRpbmdQTE1OCisKK21heE51bU9mUmVwb3J0aW5nUExNTiBJTlRFR0VSIDo6PSAyMAorCitSZXBvcnRpbmdQTE1OOjo9IFNFUVVFTkNFIHsKKwlwbG1uLUlkIAkJCQkJCVswXSBQTE1OLUlkLAorCXJhbi1UZWNobm9sb2d5IAkJCQkJWzFdIFJBTi1UZWNobm9sb2d5CQkJT1BUSU9OQUwsCisJcmFuLVBlcmlvZGljTG9jYXRpb25TdXBwb3J0CQlbMl0gTlVMTAkJCQkJT1BUSU9OQUwsCisJLi4ufQorCitSQU4tVGVjaG5vbG9neSA6Oj0gRU5VTUVSQVRFRCB7CisJZ3NtCQkJKDApLAorCXVtdHMJCSgxKSwKKwkuLi59CisKK1Byb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tUmVzIDo6PSBTRVFVRU5DRSB7CisJbG9jYXRpb25Fc3RpbWF0ZQlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sCisJYWdlT2ZMb2NhdGlvbkVzdGltYXRlCVswXSBBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlhZGQtTG9jYXRpb25Fc3RpbWF0ZQlbMl0gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIAlPUFRJT05BTCwKKwlkZWZlcnJlZG10LWxyUmVzcG9uc2VJbmRpY2F0b3IJWzNdIE5VTEwJCU9QVElPTkFMLAorCWdlcmFuUG9zaXRpb25pbmdEYXRhCVs0XSBQb3NpdGlvbmluZ0RhdGFJbmZvcm1hdGlvbglPUFRJT05BTCwKKwl1dHJhblBvc2l0aW9uaW5nRGF0YQlbNV0gVXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvCU9QVElPTkFMLAorCWNlbGxJZE9yU2FpCVs2XSBDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSQlPUFRJT05BTCwKKwlzYWktUHJlc2VudAlbN10gTlVMTAkJT1BUSU9OQUwsCisJYWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yCVs4XSBBY2N1cmFjeUZ1bGZpbG1lbnRJbmRpY2F0b3IJCU9QVElPTkFMLAorCXZlbG9jaXR5RXN0aW1hdGUJWzldIFZlbG9jaXR5RXN0aW1hdGUJT1BUSU9OQUwsCisJbW8tbHJTaG9ydENpcmN1aXRJbmRpY2F0b3IJWzEwXSBOVUxMCQlPUFRJT05BTCB9CisKKy0tCWlmIGRlZmVycmVkbXQtbHJSZXNwb25zZUluZGljYXRvciBpcyBzZXQsIGxvY2F0aW9uRXN0aW1hdGUgaXMgaWdub3JlZC4KKworLS0gdGhlIGFkZC1Mb2NhdGlvbkVzdGltYXRlIHBhcmFtZXRlciBzaGFsbCBub3QgYmUgc2VudCB0byBhIG5vZGUgdGhhdCBkaWQgbm90IGluZGljYXRlIHRoZQorLS0gZ2VvZ3JhcGhpYyBzaGFwZXMgc3VwcG9ydGVkIGluIHRoZSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZworLS0gVGhlIGxvY2F0aW9uRXN0aW1hdGUgYW5kIHRoZSBhZGQtbG9jYXRpb25Fc3RpbWF0ZSBwYXJhbWV0ZXJzIHNoYWxsIG5vdCBiZSBzZW50IGlmCistLSB0aGUgc3VwcG9ydGVkR0FEU2hhcGVzIHBhcmFtZXRlciBoYXMgYmVlbiByZWNlaXZlZCBpbiBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZworLS0gYW5kIHRoZSBzaGFwZSBlbmNvZGVkIGluIGxvY2F0aW9uRXN0aW1hdGUgb3IgYWRkLUxvY2F0aW9uRXN0aW1hdGUgaXMgbm90IG1hcmtlZAorLS0gYXMgc3VwcG9ydGVkIGluIHN1cHBvcnRlZEdBRFNoYXBlcy4gSW4gc3VjaCBhIGNhc2UgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbgorLS0gc2hhbGwgYmUgcmVqZWN0ZWQgd2l0aCBlcnJvciBGYWNpbGl0eU5vdFN1cHBvcnRlZCB3aXRoIGFkZGl0aW9uYWwgaW5kaWNhdGlvbgorLS0gc2hhcGVPZkxvY2F0aW9uRXN0aW1hdGVOb3RTdXBwb3J0ZWQuCistLSBzYWktUHJlc2VudCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2VsbElkT3JTYWkgcGFyYW1ldGVyIGNvbnRhaW5zIGEgU2VydmljZSBBcmVhIElkZW50aXR5LgorCitBY2N1cmFjeUZ1bGZpbG1lbnRJbmRpY2F0b3IgOjo9IEVOVU1FUkFURUQgeworCXJlcXVlc3RlZEFjY3VyYWN5RnVsZmlsbGVkICAoMCksCisJcmVxdWVzdGVkQWNjdXJhY3lOb3RGdWxmaWxsZWQgICgxKSwKKwkuLi4JfQorCitFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4RXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uKSkKKwktLSBSZWZlcnMgdG8gZ2VvZ3JhcGhpY2FsIEluZm9ybWF0aW9uIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuCisJLS0gVGhpcyBpcyBjb21wb3NlZCBvZiAxIG9yIG1vcmUgb2N0ZXRzIHdpdGggYW4gaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0bworCS0tIDNHUFAgVFMgMjMuMDMyCisJLS0gT2N0ZXQgMTogVHlwZSBvZiBzaGFwZSwgb25seSB0aGUgZm9sbG93aW5nIHNoYXBlcyBpbiAzR1BQIFRTIDIzLjAzMiBhcmUgYWxsb3dlZDoKKwktLQkJKGEpIEVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZQorCS0tCQkoYikgRWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgZWxsaXBzZQorCS0tCQkoYykgRWxsaXBzb2lkIHBvaW50IHdpdGggYWx0aXR1ZGUgYW5kIHVuY2VydGFpbnR5IGVsbGlwc29pZAorCS0tCQkoZCkgRWxsaXBzb2lkIEFyYworCS0tCQkoZSkgRWxsaXBzb2lkIFBvaW50CisJLS0gQW55IG90aGVyIHZhbHVlIGluIG9jdGV0IDEgc2hhbGwgYmUgdHJlYXRlZCBhcyBpbnZhbGlkCisJLS0gT2N0ZXRzIDIgdG8gOCBmb3IgY2FzZSAoYSkgliBFbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlVbmNlcnRhaW50eSBjb2RlCQkJCTEgb2N0ZXQKKwktLSBPY3RldHMgMiB0byAxMSBmb3IgY2FzZSAoYikgliBFbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBlbGxpcHNlOgorCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IHNlbWktbWFqb3IgYXhpcwkJCQkxIG9jdGV0CisJLS0JCVVuY2VydGFpbnR5IHNlbWktbWlub3IgYXhpcwkJCQkxIG9jdGV0CisJLS0JCUFuZ2xlIG9mIG1ham9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlDb25maWRlbmNlCQkJCTEgb2N0ZXQKKwktLSBPY3RldHMgMiB0byAxNCBmb3IgY2FzZSAoYykgliBFbGxpcHNvaWQgcG9pbnQgd2l0aCBhbHRpdHVkZSBhbmQgdW5jZXJ0YWludHkgZWxsaXBzb2lkCisJLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJQWx0aXR1ZGUJCQkJMiBvY3RldHMKKwktLQkJVW5jZXJ0YWludHkgc2VtaS1tYWpvciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJVW5jZXJ0YWludHkgc2VtaS1taW5vciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJQW5nbGUgb2YgbWFqb3IgYXhpcwkJCQkxIG9jdGV0CisJLS0JCVVuY2VydGFpbnR5IGFsdGl0dWRlCQkJCTEgb2N0ZXQKKwktLQkJQ29uZmlkZW5jZQkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gMTMgZm9yIGNhc2UgKGQpIJYgRWxsaXBzb2lkIEFyYworCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCUlubmVyIHJhZGl1cwkJCQkyIG9jdGV0cworCS0tCQlVbmNlcnRhaW50eSByYWRpdXMJCQkJMSBvY3RldAorCS0tCQlPZmZzZXQgYW5nbGUJCQkJMSBvY3RldAorCS0tCQlJbmNsdWRlZCBhbmdsZQkJCQkxIG9jdGV0CisJLS0JCUNvbmZpZGVuY2UJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDcgZm9yIGNhc2UgKGUpIJYgRWxsaXBzb2lkIFBvaW50CisJLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKworCS0tCisJLS0gQW4gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBjb21wcmlzaW5nIG1vcmUgdGhhbiBvbmUgb2N0ZXQgYW5kCisJLS0gY29udGFpbmluZyBhbnkgb3RoZXIgc2hhcGUgb3IgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBvY3RldHMgb3IgY29kaW5nIGFjY29yZGluZworCS0tIHRvIDNHUFAgVFMgMjMuMDMyIHNoYWxsIGJlIHRyZWF0ZWQgYXMgaW52YWxpZCBkYXRhIGJ5IGEgcmVjZWl2ZXIuCisJLS0KKwktLSBBbiBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGNvbXByaXNpbmcgb25lIG9jdGV0IHNoYWxsIGJlIGRpc2NhcmRlZAorCS0tIGJ5IHRoZSByZWNlaXZlciBpZiBhbiBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGlzIHJlY2VpdmVkIAorCS0tIGluIHRoZSBzYW1lIG1lc3NhZ2UuCisJLS0KKwktLSBBbiBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGNvbXByaXNpbmcgb25lIG9jdGV0IHNoYWxsIGJlIHRyZWF0ZWQgYXMKKwktLSBpbnZhbGlkIGRhdGEgYnkgdGhlIHJlY2VpdmVyIGlmIGFuIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgaXMgbm90CisJLS0gcmVjZWl2ZWQgaW4gdGhlIHNhbWUgbWVzc2FnZS4KKworbWF4RXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uICBJTlRFR0VSIDo6PSAyMAorCS0tIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd3MgZm9yIGZ1cnRoZXIgc2hhcGVzIGluIDNHUFAgVFMgMjMuMDMyIHRvIGJlIGluY2x1ZGVkIGluIGxhdGVyIAorCS0tIHZlcnNpb25zIG9mIDNHUFAgVFMgMjkuMDAyCisKK1ZlbG9jaXR5RXN0aW1hdGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNC4uNykpCisJLS0gUmVmZXJzIHRvIFZlbG9jaXR5IGRlc2NyaXB0aW9uIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuCisJLS0gVGhpcyBpcyBjb21wb3NlZCBvZiA0IG9yIG1vcmUgb2N0ZXRzIHdpdGggYW4gaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0bworCS0tIDNHUFAgVFMgMjMuMDMyCisJLS0gT2N0ZXQgMTogVHlwZSBvZiB2ZWxvY2l0eSwgb25seSB0aGUgZm9sbG93aW5nIHR5cGVzIGluIDNHUFAgVFMgMjMuMDMyIGFyZSBhbGxvd2VkOgorCS0tCQkoYSkgSG9yaXpvbnRhbCBWZWxvY2l0eQorCS0tCQkoYikgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5CisJLS0JCShjKSBIb3Jpem9udGFsIFZlbG9jaXR5IHdpdGggVW5jZXJ0YWludHkKKwktLQkJKGQpIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eSBhbmQgVW5jZXJ0YWludHkKKwktLSBGb3IgdHlwZXMgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5IGFuZCBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkKKwktLSBhbmQgVW5jZXJ0YWludHksIHRoZSBkaXJlY3Rpb24gb2YgdGhlIFZlcnRpY2FsIFNwZWVkIGlzIGFsc28gaW5jbHVkZWQgaW4gT2N0ZXQgMQorCS0tIEFueSBvdGhlciB2YWx1ZSBpbiBvY3RldCAxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgaW52YWxpZAorCS0tIE9jdGV0cyAyIHRvIDQgZm9yIGNhc2UgKGEpIEhvcml6b250YWwgdmVsb2NpdHk6CisJLS0JCUJlYXJpbmcJCQkJMSBvY3RldAorCS0tCQlIb3Jpem9udGFsIFNwZWVkCQkJCTIgb2N0ZXRzCisJLS0gT2N0ZXRzIDIgdG8gNSBmb3IgY2FzZSAoYikgliBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHk6CisJLS0JCUJlYXJpbmcJCQkJMSBvY3RldAorCS0tCQlIb3Jpem9udGFsIFNwZWVkCQkJCTIgb2N0ZXRzCisJLS0JCVZlcnRpY2FsIFNwZWVkCQkJCTEgb2N0ZXQKKwktLSBPY3RldHMgMiB0byA1IGZvciBjYXNlIChjKSCWIEhvcml6b250YWwgdmVsb2NpdHkgd2l0aCBVbmNlcnRhaW50eToKKwktLQkJQmVhcmluZwkJCQkxIG9jdGV0CisJLS0JCUhvcml6b250YWwgU3BlZWQJCQkJMiBvY3RldHMKKwktLQkJVW5jZXJ0YWludHkgU3BlZWQJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDcgZm9yIGNhc2UgKGQpIJYgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5IGFuZCBVbmNlcnRhaW50eToKKwktLQkJQmVhcmluZwkJCQkxIG9jdGV0CisJLS0JCUhvcml6b250YWwgU3BlZWQJCQkJMiBvY3RldHMKKwktLQkJVmVydGljYWwgU3BlZWQJCQkJMSBvY3RldAorCS0tCQlIb3Jpem9udGFsIFVuY2VydGFpbnR5IFNwZWVkCQkJMSBvY3RldAorCS0tCQlWZXJ0aWNhbCBVbmNlcnRhaW50eSBTcGVlZAkJCQkxIG9jdGV0CisKK1Bvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLm1heFBvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uKSkKKwktLSBSZWZlcnMgdG8gdGhlIFBvc2l0aW9uaW5nIERhdGEgZGVmaW5lZCBpbiAzR1BQIFRTIDQ5LjAzMS4KKwktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIDIgb3IgbW9yZSBvY3RldHMgd2l0aCBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvCisJLS0gM0dQUCBUUyA0OS4wMzEuIAorCittYXhQb3NpdGlvbmluZ0RhdGFJbmZvcm1hdGlvbiBJTlRFR0VSIDo6PSAxMAorCS0tIAorCitVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMy4ubWF4VXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvKSkKKwktLSBSZWZlcnMgdG8gdGhlIFBvc2l0aW9uIERhdGEgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMy4KKwktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIHRoZSBwb3NpdGlvbmluZ0RhdGFEaXNjcmltaW5hdG9yIGFuZCB0aGUgcG9zaXRpb25pbmdEYXRhU2V0CisJLS0gaW5jbHVkZWQgaW4gcG9zaXRpb25EYXRhIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMuCisKK21heFV0cmFuUG9zaXRpb25pbmdEYXRhSW5mbyBJTlRFR0VSIDo6PSAxMQorCS0tIAorCitBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4QWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uKSkKKwktLSBSZWZlcnMgdG8gZ2VvZ3JhcGhpY2FsIEluZm9ybWF0aW9uIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuCisJLS0gVGhpcyBpcyBjb21wb3NlZCBvZiAxIG9yIG1vcmUgb2N0ZXRzIHdpdGggYW4gaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0byAKKwktLSAzR1BQIFRTIDIzLjAzMgorCS0tIE9jdGV0IDE6IFR5cGUgb2Ygc2hhcGUsIGFsbCB0aGUgc2hhcGVzIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIgYXJlIGFsbG93ZWQ6CisJLS0gT2N0ZXRzIDIgdG8gbiAod2hlcmUgbiBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIG9jdGV0cyBuZWNlc3NhcnkgdG8gZW5jb2RlIHRoZSBzaGFwZQorCS0tIGFjY29yZGluZyB0byAzR1BQIFRTIDIzLjAzMikgYXJlIHVzZWQgdG8gZW5jb2RlIHRoZSBzaGFwZSBpdHNlbGYgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorCS0tIGVuY29kaW5nIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIKKwktLQorCS0tIEFuIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIsIHdoZXRoZXIgdmFsaWQgb3IgaW52YWxpZCwgcmVjZWl2ZWQgCisJLS0gdG9nZXRoZXIgd2l0aCBhIHZhbGlkIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgaW4gdGhlIHNhbWUgbWVzc2FnZSAKKwktLSBzaGFsbCBiZSBkaXNjYXJkZWQuCisJLS0KKwktLSBBbiBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGNvbnRhaW5pbmcgYW55IHNoYXBlIG5vdCBkZWZpbmVkIGluIAorCS0tIDNHUFAgVFMgMjMuMDMyIG9yIGFuIGluY29ycmVjdCBudW1iZXIgb2Ygb2N0ZXRzIG9yIGNvZGluZyBhY2NvcmRpbmcgdG8gCisJLS0gM0dQUCBUUyAyMy4wMzIgc2hhbGwgYmUgdHJlYXRlZCBhcyBpbnZhbGlkIGRhdGEgYnkgYSByZWNlaXZlciBpZiBub3QgcmVjZWl2ZWQgCisJLS0gdG9nZXRoZXIgd2l0aCBhIHZhbGlkIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgaW4gdGhlIHNhbWUgbWVzc2FnZS4KKworbWF4QWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uICBJTlRFR0VSIDo6PSA5MQorCS0tIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd3Mgc3VwcG9ydCBmb3IgYWxsIHRoZSBzaGFwZXMgY3VycmVudGx5IGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIKKworU3Vic2NyaWJlckxvY2F0aW9uUmVwb3J0LUFyZyA6Oj0gU0VRVUVOQ0UgeworCWxjcy1FdmVudAkJTENTLUV2ZW50LAorCWxjcy1DbGllbnRJRAlMQ1MtQ2xpZW50SUQsIAorCWxjc0xvY2F0aW9uSW5mbwlMQ1NMb2NhdGlvbkluZm8sCisJbXNpc2RuCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWltc2kJCQlbMV0gSU1TSQkJT1BUSU9OQUwsCisJaW1laQkJCVsyXSBJTUVJCQlPUFRJT05BTCwKKwluYS1FU1JECQlbM10gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW5hLUVTUksJCVs0XSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbG9jYXRpb25Fc3RpbWF0ZQlbNV0gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCU9QVElPTkFMLAorCWFnZU9mTG9jYXRpb25Fc3RpbWF0ZQlbNl0gQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCXNsci1BcmdFeHRlbnNpb25Db250YWluZXIJWzddIFNMUi1BcmdFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlhZGQtTG9jYXRpb25Fc3RpbWF0ZQlbOF0gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCU9QVElPTkFMLAorCWRlZmVycmVkbXQtbHJEYXRhCVs5XSBEZWZlcnJlZG10LWxyRGF0YQlPUFRJT05BTCwgCisJbGNzLVJlZmVyZW5jZU51bWJlcglbMTBdIExDUy1SZWZlcmVuY2VOdW1iZXIJT1BUSU9OQUwsCisJZ2VyYW5Qb3NpdGlvbmluZ0RhdGEJWzExXSBQb3NpdGlvbmluZ0RhdGFJbmZvcm1hdGlvbglPUFRJT05BTCwKKwl1dHJhblBvc2l0aW9uaW5nRGF0YQlbMTJdIFV0cmFuUG9zaXRpb25pbmdEYXRhSW5mbwlPUFRJT05BTCwKKwljZWxsSWRPclNhaQlbMTNdCUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCU9QVElPTkFMLAorCWgtZ21sYy1BZGRyZXNzCVsxNF0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJbGNzU2VydmljZVR5cGVJRAlbMTVdCUxDU1NlcnZpY2VUeXBlSUQJT1BUSU9OQUwsCisJc2FpLVByZXNlbnQJWzE3XSBOVUxMCQlPUFRJT05BTCwKKwlwc2V1ZG9ueW1JbmRpY2F0b3IJWzE4XSBOVUxMCQlPUFRJT05BTCwKKwlhY2N1cmFjeUZ1bGZpbG1lbnRJbmRpY2F0b3IJWzE5XSBBY2N1cmFjeUZ1bGZpbG1lbnRJbmRpY2F0b3IJT1BUSU9OQUwsCisJdmVsb2NpdHlFc3RpbWF0ZQlbMjBdIFZlbG9jaXR5RXN0aW1hdGUJT1BUSU9OQUwsCisJc2VxdWVuY2VOdW1iZXIJWzIxXSBTZXF1ZW5jZU51bWJlcglPUFRJT05BTCwKKwlwZXJpb2RpY0xEUkluZm8JWzIyXSBQZXJpb2RpY0xEUkluZm8JT1BUSU9OQUwsCisJbW8tbHJTaG9ydENpcmN1aXRJbmRpY2F0b3IJWzIzXSBOVUxMCQlPUFRJT05BTCB9CisKKwktLSBvbmUgb2YgbXNpc2RuIG9yIGltc2kgaXMgbWFuZGF0b3J5CisJLS0gYSBsb2NhdGlvbiBlc3RpbWF0ZSB0aGF0IGlzIHZhbGlkIGZvciB0aGUgbG9jYXRpb25Fc3RpbWF0ZSBwYXJhbWV0ZXIgc2hvdWxkIAorCS0tIGJlIHRyYW5zZmVycmVkIGluIHRoaXMgcGFyYW1ldGVyIGluIHByZWZlcmVuY2UgdG8gdGhlIGFkZC1Mb2NhdGlvbkVzdGltYXRlLgorCS0tIHRoZSBkZWZlcnJlZG10LWxyRGF0YSBwYXJhbWV0ZXIgc2hhbGwgYmUgaW5jbHVkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIGxjcy1FdmVudAorCS0tIGluZGljYXRlcyBhIGRlZmVycmVkbXQtbHJSZXNwb25zZS4KKwktLSBpZiB0aGUgbGNzLUV2ZW50IGluZGljYXRlcyBhIGRlZmVycmVkbXQtbHJSZXNwb25zZSB0aGVuIHRoZSBsb2NhdGlvbkVzdGltYXRlIAorCS0tIGFuZCB0aGUgYWRkLWxvY2F0aW9uRXN0aW1hdGUgcGFyYW1ldGVycyBzaGFsbCBub3QgYmUgc2VudCBpZiB0aGUgCisJLS0gc3VwcG9ydGVkR0FEU2hhcGVzIHBhcmFtZXRlciBoYWQgYmVlbiByZWNlaXZlZCBpbiBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZworCS0tIGFuZCB0aGUgc2hhcGUgZW5jb2RlZCBpbiBsb2NhdGlvbkVzdGltYXRlIG9yIGFkZC1Mb2NhdGlvbkVzdGltYXRlIHdhcyBub3QgbWFya2VkCisJLS0gYXMgc3VwcG9ydGVkIGluIHN1cHBvcnRlZEdBRFNoYXBlcy4gSW4gc3VjaCBhIGNhc2UgdGVybWluYXRpb25DYXVzZSAKKwktLSBpbiBkZWZlcnJlZG10LWxyRGF0YSBzaGFsbCBiZSBwcmVzZW50IHdpdGggdmFsdWUgCisJLS0gc2hhcGVPZkxvY2F0aW9uRXN0aW1hdGVOb3RTdXBwb3J0ZWQuIAorCS0tIElmIGEgbGNzIGV2ZW50IGluZGljYXRlcyBkZWZlcnJlZCBtdC1sciByZXNwb25zZSwgdGhlIGxjcy1SZWZlcmVuY2UgbnVtYmVyIHNoYWxsIGJlIAorCS0tIGluY2x1ZGVkLiAKKwktLSBzYWktUHJlc2VudCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2VsbElkT3JTYWkgcGFyYW1ldGVyIGNvbnRhaW5zIGEgU2VydmljZSBBcmVhIElkZW50aXR5LgorCitEZWZlcnJlZG10LWxyRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWRlZmVycmVkTG9jYXRpb25FdmVudFR5cGUJRGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZSwKKwl0ZXJtaW5hdGlvbkNhdXNlCVswXSBUZXJtaW5hdGlvbkNhdXNlCU9QVElPTkFMLAorCWxjc0xvY2F0aW9uSW5mbwlbMV0gTENTTG9jYXRpb25JbmZvCU9QVElPTkFMLAorCS4uLn0KKwktLSBsY3NMb2NhdGlvbkluZm8gbWF5IGJlIGluY2x1ZGVkIG9ubHkgaWYgYSB0ZXJtaW5hdGlvbkNhdXNlIGlzIHByZXNlbnQgCisJLS0gaW5kaWNhdGluZyBtdC1sclJlc3RhcnQuCisKK0xDUy1FdmVudCA6Oj0gRU5VTUVSQVRFRCB7CisJZW1lcmdlbmN5Q2FsbE9yaWdpbmF0aW9uICAoMCksCisJZW1lcmdlbmN5Q2FsbFJlbGVhc2UgICgxKSwgCisJbW8tbHIgICgyKSwKKwkuLi4sCisJZGVmZXJyZWRtdC1sclJlc3BvbnNlICAoMykgLAorCWRlZmVycmVkbW8tbHJUVFRQSW5pdGlhdGlvbiAgKDQpICB9CisJLS0JZGVmZXJyZWRtdC1sclJlc3BvbnNlIGlzIGFwcGxpY2FibGUgdG8gdGhlIGRlbGl2ZXJ5IG9mIGEgbG9jYXRpb24gZXN0aW1hdGUgCisJLS0JZm9yIGFuIExEUiBpbml0aWF0ZWQgZWFybGllciBieSBlaXRoZXIgdGhlIG5ldHdvcmsgKHZpYSBhbiBNVC1MUiBhY3RpdmF0ZSBkZWZlcnJlZCAKKwktLQlsb2NhdGlvbikgb3IgdGhlIFVFICh2aWEgYSBkZWZlcnJlZCBNTy1MUiBUVFRQIGluaXRpYXRpb24pCisJLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tCWEgU3Vic2NyaWJlckxvY2F0aW9uUmVwb3J0LUFyZyBjb250YWluaW5nIGFuIHVucmVjb2duaXplZCBMQ1MtRXZlbnQKKwktLQlzaGFsbCBiZSByZWplY3RlZCBieSBhIHJlY2VpdmVyIHdpdGggYSByZXR1cm4gZXJyb3IgY2F1c2Ugb2YgdW5leHBlY3RlZCBkYXRhIHZhbHVlCisKK1Rlcm1pbmF0aW9uQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCW5vcm1hbCAgKDApLAorCWVycm9ydW5kZWZpbmVkICAoMSksCisJaW50ZXJuYWxUaW1lb3V0ICAoMiksCisJY29uZ2VzdGlvbiAgKDMpLAorCW10LWxyUmVzdGFydCAgKDQpLAorCXByaXZhY3lWaW9sYXRpb24gICg1KSwKKwkuLi4sCisJc2hhcGVPZkxvY2F0aW9uRXN0aW1hdGVOb3RTdXBwb3J0ZWQgKDYpICwKKwlzdWJzY3JpYmVyVGVybWluYXRpb24gKDcpLAorCXVFVGVybWluYXRpb24gKDgpLAorCW5ldHdvcmtUZXJtaW5hdGlvbiAoOSkgIH0gCistLSBtdC1sclJlc3RhcnQgc2hhbGwgYmUgdXNlZCB0byB0cmlnZ2VyIHRoZSBHTUxDIHRvIHJlc3RhcnQgdGhlIGxvY2F0aW9uIHByb2NlZHVyZSwgCistLSBlaXRoZXIgYmVjYXVzZSB0aGUgc2VuZGluZyBub2RlIGtub3dzIHRoYXQgdGhlIHRlcm1pbmFsIGhhcyBtb3ZlZCB1bmRlciBjb3ZlcmFnZSAKKy0tIG9mIGFub3RoZXIgTVNDIG9yIFNHU04gKGUuZy4gU2VuZCBJZGVudGlmaWNhdGlvbiByZWNlaXZlZCksIG9yIGJlY2F1c2UgdGhlIHN1YnNjcmliZXIKKy0tIGhhcyBiZWVuIGRlcmVnaXN0ZXJlZCBkdWUgdG8gYSBDYW5jZWwgTG9jYXRpb24gcmVjZWl2ZWQgZnJvbSBITFIuCistLQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nCistLSBhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyB2YWx1ZSAxIChlcnJvcnVuZGVmaW5lZCkgCisKK1NlcXVlbmNlTnVtYmVyIDo6PSBJTlRFR0VSICgxLi5tYXhSZXBvcnRpbmdBbW91bnQpCisKK1N1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1SZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLCAKKwkuLi4sIAorCW5hLUVTUksJCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbmEtRVNSRAkJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwloLWdtbGMtQWRkcmVzcwlbMl0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJbW8tbHJTaG9ydENpcmN1aXRJbmRpY2F0b3IJWzNdIE5VTEwJCU9QVElPTkFMLAorCXJlcG9ydGluZ1BMTU5MaXN0CVs0XSBSZXBvcnRpbmdQTE1OTGlzdAlPUFRJT05BTCwKKwlsY3MtUmVmZXJlbmNlTnVtYmVyCVs1XQlMQ1MtUmVmZXJlbmNlTnVtYmVyCU9QVElPTkFMIH0KKworLS0gbmEtRVNSSyBhbmQgbmEtRVNSRCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlCistLQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nCistLSByZWNlaXB0IG9mIGJvdGggbmEtRVNSSyBhbmQgbmEtRVNSRCBzaGFsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGEgcmV0dXJuIGVycm9yCisKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU1TLURhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1NUy1EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMTJhMDIKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1NUy1EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsMjc4MCBAQAorLS0gJElkOiBNQVAtTVMtRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KSAKKy0tIDE3LjcuMQlNb2JpbGUgU2VydmljZSBkYXRhIHR5cGVzCisKK01BUC1NUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTVMtRGF0YVR5cGVzICgxMSkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKworCS0tIGxvY2F0aW9uIHJlZ2lzdHJhdGlvbiB0eXBlcworCVVwZGF0ZUxvY2F0aW9uQXJnLAorCVVwZGF0ZUxvY2F0aW9uUmVzLAorCUNhbmNlbExvY2F0aW9uQXJnLAorCUNhbmNlbExvY2F0aW9uUmVzLCAKKwlQdXJnZU1TLUFyZywgCisJUHVyZ2VNUy1SZXMsCisJU2VuZElkZW50aWZpY2F0aW9uQXJnLAorCVNlbmRJZGVudGlmaWNhdGlvblJlcywgCisJVXBkYXRlR3Byc0xvY2F0aW9uQXJnLAorCVVwZGF0ZUdwcnNMb2NhdGlvblJlcywKKwlJU1QtU3VwcG9ydEluZGljYXRvciwgCisJU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzLAorCisJLS0gZ3BycyBsb2NhdGlvbiByZWdpc3RyYXRpb24gdHlwZXMKKwlHU04tQWRkcmVzcywKKworCS0tIGhhbmRvdmVyIHR5cGVzCisJRm9yd2FyZEFjY2Vzc1NpZ25hbGxpbmctQXJnLAorCVByZXBhcmVITy1BcmcsCisJUHJlcGFyZUhPLVJlcywKKwlQcmVwYXJlU3Vic2VxdWVudEhPLUFyZywgCisJUHJlcGFyZVN1YnNlcXVlbnRITy1SZXMsCisJUHJvY2Vzc0FjY2Vzc1NpZ25hbGxpbmctQXJnLAorCVNlbmRFbmRTaWduYWwtQXJnLAorCVNlbmRFbmRTaWduYWwtUmVzLAorCisJLS0gYXV0aGVudGljYXRpb24gbWFuYWdlbWVudCB0eXBlcworCVNlbmRBdXRoZW50aWNhdGlvbkluZm9BcmcsCisJU2VuZEF1dGhlbnRpY2F0aW9uSW5mb1JlcywgCisJQXV0aGVudGljYXRpb25GYWlsdXJlUmVwb3J0QXJnLAorQXV0aGVudGljYXRpb25GYWlsdXJlUmVwb3J0UmVzLAorCisJLS0gc2VjdXJpdHkgbWFuYWdlbWVudCB0eXBlcworCUtjLCAKKwlDa3NuLAorCisJLS0gZXF1aXBtZW50IG1hbmFnZW1lbnQgdHlwZXMKKwlDaGVja0lNRUktQXJnLAorCUNoZWNrSU1FSS1SZXMsCisKKwktLSBzdWJzY3JpYmVyIG1hbmFnZW1lbnQgdHlwZXMKKwlJbnNlcnRTdWJzY3JpYmVyRGF0YUFyZywKKwlJbnNlcnRTdWJzY3JpYmVyRGF0YVJlcywgCisJTFNBSWRlbnRpdHksCisJRGVsZXRlU3Vic2NyaWJlckRhdGFBcmcsCisJRGVsZXRlU3Vic2NyaWJlckRhdGFSZXMsCisJRXh0LVFvUy1TdWJzY3JpYmVkLAorCUV4dDItUW9TLVN1YnNjcmliZWQsIAorCUV4dDMtUW9TLVN1YnNjcmliZWQsCisJU3Vic2NyaWJlckRhdGEsCisJT0RCLURhdGEsCisJU3Vic2NyaWJlclN0YXR1cywKKwlab25lQ29kZUxpc3QsCisJbWF4TnVtT2Zab25lQ29kZXMsIAorCU8tQ1NJLCAKK0QtQ1NJLAorCU8tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0LCAKKwlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdCwKKwlTUy1DU0ksCisJU2VydmljZUtleSwKKwlEZWZhdWx0Q2FsbEhhbmRsaW5nLAorCUNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nLAorCUJhc2ljU2VydmljZUNyaXRlcmlhLAorCVN1cHBvcnRlZENhbWVsUGhhc2VzLAorCU9mZmVyZWRDYW1lbDRDU0lzLAorCU9mZmVyZWRDYW1lbDRGdW5jdGlvbmFsaXRpZXMsCisJbWF4TnVtT2ZDYW1lbFREUERhdGEsCisJQ1VHLUluZGV4LCAKKwlDVUctSW5mbywKKwlDVUctSW50ZXJsb2NrLAorCUludGVyQ1VHLVJlc3RyaWN0aW9ucywKKwlJbnRyYUNVRy1PcHRpb25zLAorCU5vdGlmaWNhdGlvblRvTVNVc2VyLCAKKwlRb1MtU3Vic2NyaWJlZCwKK0lTVC1BbGVydFRpbWVyVmFsdWUsCisJVC1DU0ksCisJVC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LAorQVBOLAorQWRkaXRpb25hbEluZm8sCisKKwktLSBmYXVsdCByZWNvdmVyeSB0eXBlcworCVJlc2V0QXJnLAorCVJlc3RvcmVEYXRhQXJnLAorCVJlc3RvcmVEYXRhUmVzLAorCistLSBwcm92aWRlIHN1YnNjcmliZXIgaW5mbyB0eXBlcyAKK0dlb2dyYXBoaWNhbEluZm9ybWF0aW9uLCAKK01TLUNsYXNzbWFyazIsCitHUFJTTVNDbGFzcywKKworCS0tIHN1YnNjcmliZXIgaW5mb3JtYXRpb24gZW5xdWlyeSB0eXBlcworCVByb3ZpZGVTdWJzY3JpYmVySW5mb0FyZywKKwlQcm92aWRlU3Vic2NyaWJlckluZm9SZXMsCisJU3Vic2NyaWJlckluZm8sCisJTG9jYXRpb25JbmZvcm1hdGlvbiwKKwlMb2NhdGlvbkluZm9ybWF0aW9uR1BSUywKKwlSQUlkZW50aXR5LAorCVN1YnNjcmliZXJTdGF0ZSwKKwlHUFJTQ2hhcmdpbmdJRCwgCitNTlBJbmZvUmVzLAorCVJvdXRlaW5nTnVtYmVyLAorCisJLS0gYW55IHRpbWUgaW5mb3JtYXRpb24gZW5xdWlyeSB0eXBlcworCUFueVRpbWVJbnRlcnJvZ2F0aW9uQXJnLAorCUFueVRpbWVJbnRlcnJvZ2F0aW9uUmVzLAorCisJLS0gYW55IHRpbWUgaW5mb3JtYXRpb24gaGFuZGxpbmcgdHlwZXMKKwlBbnlUaW1lU3Vic2NyaXB0aW9uSW50ZXJyb2dhdGlvbkFyZywKKwlBbnlUaW1lU3Vic2NyaXB0aW9uSW50ZXJyb2dhdGlvblJlcywKKwlBbnlUaW1lTW9kaWZpY2F0aW9uQXJnLAorCUFueVRpbWVNb2RpZmljYXRpb25SZXMsCisKKwktLSBzdWJzY3JpYmVyIGRhdGEgbW9kaWZpY2F0aW9uIG5vdGlmaWNhdGlvbiB0eXBlcworCU5vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkQXJnLAorCU5vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkUmVzLAorCisJLS0gZ3BycyBsb2NhdGlvbiBpbmZvcm1hdGlvbiByZXRyaWV2YWwgdHlwZXMKKwlTZW5kUm91dGluZ0luZm9Gb3JHcHJzQXJnLAorCVNlbmRSb3V0aW5nSW5mb0ZvckdwcnNSZXMsCisKKwktLSBmYWlsdXJlIHJlcG9ydGluZyB0eXBlcworCUZhaWx1cmVSZXBvcnRBcmcsCisJRmFpbHVyZVJlcG9ydFJlcywKKworCS0tIGdwcnMgbm90aWZpY2F0aW9uIHR5cGVzCisJTm90ZU1zUHJlc2VudEZvckdwcnNBcmcsCisJTm90ZU1zUHJlc2VudEZvckdwcnNSZXMsCisKKwktLSBNb2JpbGl0eSBNYW5hZ2VtZW50IHR5cGVzCitOb3RlTU0tRXZlbnRBcmcsCisJTm90ZU1NLUV2ZW50UmVzLAorCU51bWJlclBvcnRhYmlsaXR5U3RhdHVzLAorCVBhZ2luZ0FyZWEsCisKKwktLSBWR0NTIC8gVkJTIHR5cGVzIHR5cGVzCitHcm91cElkLCAKK0xvbmctR3JvdXBJZCwKK0FkZGl0aW9uYWxTdWJzY3JpcHRpb25zCisKKzsKKworSU1QT1JUUworCW1heE51bU9mU1MsCisJU1MtU3Vic2NyaXB0aW9uT3B0aW9uLAorCVNTLUxpc3QsCisJU1MtRm9yQlMtQ29kZSwKKwlQYXNzd29yZAorRlJPTSBNQVAtU1MtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLURhdGFUeXBlcyAoMTQpIHZlcnNpb24xMSAoMTEpfQorCisJU1MtQ29kZQorRlJPTSBNQVAtU1MtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1Db2RlICgxNSkgdmVyc2lvbjExICgxMSl9CisKKwlFeHQtQmVhcmVyU2VydmljZUNvZGUKK0ZST00gTUFQLUJTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQlMtQ29kZSAoMjApIHZlcnNpb24xMSAoMTEpfQorCisJRXh0LVRlbGVzZXJ2aWNlQ29kZQorRlJPTSBNQVAtVFMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1UUy1Db2RlICgxOSkgdmVyc2lvbjExICgxMSl9CisKKwlBZGRyZXNzU3RyaW5nLAorSVNETi1BZGRyZXNzU3RyaW5nLCAKKwlJU0ROLVN1YmFkZHJlc3NTdHJpbmcsIAorCUZUTi1BZGRyZXNzU3RyaW5nLAorCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAorCUlNU0ksIAorCUlNRUksCisJVE1TSSwKKwlITFItTGlzdCwKKwlMTVNJLAorCUlkZW50aXR5LAorCUdsb2JhbENlbGxJZCwKKwlDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSwKKwlFeHQtQmFzaWNTZXJ2aWNlQ29kZSwKKwlOQUVBLVByZWZlcnJlZENJLAorCUVNTFBQLUluZm8sIAorCU1DLVNTLUluZm8sCisJU3Vic2NyaWJlcklkZW50aXR5LAorCUFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbiwKKwlMQ1NDbGllbnRFeHRlcm5hbElELAorCUxDU0NsaWVudEludGVybmFsSUQsCisJRXh0LVNTLVN0YXR1cywKKwlMQ1NTZXJ2aWNlVHlwZUlELAorCUFTQ0ktQ2FsbFJlZmVyZW5jZSwKKwlUQkNELVNUUklORywKKwlMQUlGaXhlZExlbmd0aCwKKwlQTE1OLUlkLAorRU1MUFAtUHJpb3JpdHkKK0ZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorCisJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQorRlJPTSBNQVAtRVItRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUVSLURhdGFUeXBlcyAoMTcpIHZlcnNpb24xMSAoMTEpfQorCisJVHJhY2VQcm9wYWdhdGlvbkxpc3QKK0ZST00gTUFQLU9NLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1PTS1EYXRhVHlwZXMgKDEyKSB2ZXJzaW9uMTEgKDExKX0KKworOworCistLSBsb2NhdGlvbiByZWdpc3RyYXRpb24gdHlwZXMKKworVXBkYXRlTG9jYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwltc2MtTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJdmxyLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJbG1zaQkJCVsxMF0gTE1TSQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXZsci1DYXBhYmlsaXR5CVs2XSBWTFItQ2FwYWJpbGl0eQlPUFRJT05BTCwKKwlpbmZvcm1QcmV2aW91c05ldHdvcmtFbnRpdHkJWzExXQlOVUxMCQlPUFRJT05BTCwKKwljcy1MQ1MtTm90U3VwcG9ydGVkQnlVRQlbMTJdCU5VTEwJCU9QVElPTkFMLAorCXYtZ21sYy1BZGRyZXNzCVsyXQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlhZGQtaW5mbwkJWzEzXSBBREQtSW5mbwlPUFRJT05BTCwKKwlwYWdpbmdBcmVhCVsxNF0gUGFnaW5nQXJlYQlPUFRJT05BTCwKKwlza2lwU3Vic2NyaWJlckRhdGFVcGRhdGUJWzE1XSBOVUxMCQlPUFRJT05BTCAKKwktLSBUaGUgc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlIHBhcmFtZXRlciBpbiB0aGUgVXBkYXRlTG9jYXRpb25BcmcgYW5kIHRoZSBBREQtSW5mbworCS0tIHN0cnVjdHVyZXMgY2FycnkgdGhlIHNhbWUgc2VtYW50aWMuCisJIH0KKworVkxSLUNhcGFiaWxpdHkgOjo9IFNFUVVFTkNFeworCXN1cHBvcnRlZENhbWVsUGhhc2VzICAJWzBdIFN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlzb2xzYVN1cHBvcnRJbmRpY2F0b3IJWzJdIE5VTEwJCU9QVElPTkFMLAorCWlzdFN1cHBvcnRJbmRpY2F0b3IJWzFdIElTVC1TdXBwb3J0SW5kaWNhdG9yCU9QVElPTkFMLAorCXN1cGVyQ2hhcmdlclN1cHBvcnRlZEluU2VydmluZ05ldHdvcmtFbnRpdHkJWzNdIFN1cGVyQ2hhcmdlckluZm8JT1BUSU9OQUwsCisJbG9uZ0ZUTi1TdXBwb3J0ZWQJWzRdCU5VTEwJCU9QVElPTkFMLAorCXN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlbNV0JU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCU9QVElPTkFMLAorCW9mZmVyZWRDYW1lbDRDU0lzCVs2XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRSQVQtVHlwZXNJbmRpY2F0b3IJWzddCVN1cHBvcnRlZFJBVC1UeXBlcwlPUFRJT05BTCwKKwlsb25nR3JvdXBJRC1TdXBwb3J0ZWQJWzhdCU5VTEwJCU9QVElPTkFMIH0KKworU3VwcG9ydGVkUkFULVR5cGVzOjo9IEJJVCBTVFJJTkcgeworCXV0cmFuICAoMCksCisJZ2VyYW4gICgxKSwKKwlnYW4gICAgKDIpLAorCWktaHNwYS1ldm9sdXRpb24gKDMpLAorCWUtdXRyYW4JKDQpfSAoU0laRSAoMi4uOCkpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiBiaXRzIDUgdG8gNyBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZAorCSAKKworCitTdXBlckNoYXJnZXJJbmZvIDo6PSBDSE9JQ0UgeworCXNlbmRTdWJzY3JpYmVyRGF0YQlbMF0gTlVMTCwKKwlzdWJzY3JpYmVyRGF0YVN0b3JlZAlbMV0gQWdlSW5kaWNhdG9yIH0KKworQWdlSW5kaWNhdG9yIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjYpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgdGhpcyBwYXJhbWV0ZXIgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuCisKK0lTVC1TdXBwb3J0SW5kaWNhdG9yIDo6PSAgRU5VTUVSQVRFRCB7CisJYmFzaWNJU1RTdXBwb3J0ZWQJKDApLAorCWlzdENvbW1hbmRTdXBwb3J0ZWQJKDEpLAorCS4uLn0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgPiAxIHNoYWxsIGJlIG1hcHBlZCB0byAnIGlzdENvbW1hbmRTdXBwb3J0ZWQgJworCitTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMgOjo9IEJJVCBTVFJJTkcgeworCWxjc0NhcGFiaWxpdHlTZXQxICgwKSwKKwlsY3NDYXBhYmlsaXR5U2V0MiAoMSksCisJbGNzQ2FwYWJpbGl0eVNldDMgKDIpLAorCWxjc0NhcGFiaWxpdHlTZXQ0ICgzKSAsCisJbGNzQ2FwYWJpbGl0eVNldDUgKDQpIH0gKFNJWkUgKDIuLjE2KSkgCistLSBDb3JlIG5ldHdvcmsgc2lnbmFsbGluZyBjYXBhYmlsaXR5IHNldDEgaW5kaWNhdGVzIExDUyBSZWxlYXNlOTggb3IgUmVsZWFzZTk5IHZlcnNpb24uCistLSBDb3JlIG5ldHdvcmsgc2lnbmFsbGluZyBjYXBhYmlsaXR5IHNldDIgaW5kaWNhdGVzIExDUyBSZWxlYXNlNC4KKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0MyBpbmRpY2F0ZXMgTENTIFJlbGVhc2U1LgorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQ0IGluZGljYXRlcyBMQ1MgUmVsZWFzZTYuCistLSBDb3JlIG5ldHdvcmsgc2lnbmFsbGluZyBjYXBhYmlsaXR5IHNldDUgaW5kaWNhdGVzIExDUyBSZWxlYXNlNyBvciBsYXRlciB2ZXJzaW9uLgorLS0gQSBub2RlIHNoYWxsIG1hcmsgaW4gdGhlIEJJVCBTVFJJTkcgYWxsIExDUyBjYXBhYmlsaXR5IHNldHMgaXQgc3VwcG9ydHMuIAorLS0gSWYgbm8gYml0IGlzIHNldCB0aGVuIHRoZSBzZW5kaW5nIG5vZGUgZG9lcyBub3Qgc3VwcG9ydCBMQ1MuCistLSBJZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzZW50IGJ5IGFuIFZMUiB0aGVuIHRoZSBWTFIgbWF5IHN1cHBvcnQgYXQgbW9zdCBjYXBhYmlsaXR5IHNldDEuCistLSBJZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzZW50IGJ5IGFuIFNHU04gdGhlbiBubyBzdXBwb3J0IGZvciBMQ1MgaXMgYXNzdW1lZC4KKy0tIEFuIFNHU04gaXMgbm90IGFsbG93ZWQgdG8gaW5kaWNhdGUgc3VwcG9ydCBvZiBjYXBhYmlsaXR5IHNldDEuCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworVXBkYXRlTG9jYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlobHItTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGQtQ2FwYWJpbGl0eQlOVUxMCQkJT1BUSU9OQUwsCisJcGFnaW5nQXJlYS1DYXBhYmlsaXR5CVswXU5VTEwJCQlPUFRJT05BTCB9CisKK0FERC1JbmZvIDo6PSBTRVFVRU5DRSB7CisJaW1laXN2CQlbMF0gSU1FSSwKKwlza2lwU3Vic2NyaWJlckRhdGFVcGRhdGUJWzFdIE5VTEwJCU9QVElPTkFMLAorCS0tIFRoZSBza2lwU3Vic2NyaWJlckRhdGFVcGRhdGUgcGFyYW1ldGVyIGluIHRoZSBVcGRhdGVMb2NhdGlvbkFyZyBhbmQgdGhlIEFERC1JbmZvCisJLS0gc3RydWN0dXJlcyBjYXJyeSB0aGUgc2FtZSBzZW1hbnRpYy4KKwkuLi59CisKKworUGFnaW5nQXJlYSA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uNSkgT0YgTG9jYXRpb25BcmVhIAorCisKK0xvY2F0aW9uQXJlYSA6Oj0gQ0hPSUNFIHsKKwlsYWlGaXhlZExlbmd0aAlbMF0gTEFJRml4ZWRMZW5ndGgsCisJbGFjCQkJWzFdIExBQ30KKworCitMQUMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMikpCisJLS0gUmVmZXJzIHRvIExvY2F0aW9uIEFyZWEgQ29kZSBvZiB0aGUgTG9jYXRpb24gQXJlYSBJZGVudGlmaWNhdGlvbiBkZWZpbmVkIGluIAorICAgICAtLSAzR1BQIFRTIDIzLjAwMyBbMTddLgorCS0tIExvY2F0aW9uIEFyZWEgQ29kZSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XQorCitDYW5jZWxMb2NhdGlvbkFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlpZGVudGl0eQkJSWRlbnRpdHksCisJY2FuY2VsbGF0aW9uVHlwZQlDYW5jZWxsYXRpb25UeXBlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXR5cGVPZlVwZGF0ZQlbMF0gVHlwZU9mVXBkYXRlCU9QVElPTkFMIH0KKworVHlwZU9mVXBkYXRlIDo6PSBFTlVNRVJBVEVEIHsKKwlzZ3NuLWNoYW5nZSAoMCksCisJbW1lLWNoYW5nZSAoMSksCisJLi4ufQorCS0tIFR5cGVPZlVwZGF0ZSBzaGFsbCBiZSBhYnNlbnQgaWYgQ2FuY2VsbGF0aW9uVHlwZSBpcyBkaWZmZXJlbnQgZnJvbSB1cGRhdGVQcm9jZWR1cmUKKworQ2FuY2VsbGF0aW9uVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJdXBkYXRlUHJvY2VkdXJlCSgwKSwKKwlzdWJzY3JpcHRpb25XaXRoZHJhdwkoMSksCisJLi4ufQorCS0tIFRoZSBITFIgc2hhbGwgbm90IHNlbmQgdmFsdWVzIG90aGVyIHRoYW4gbGlzdGVkIGFib3ZlCisKK0NhbmNlbExvY2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1B1cmdlTVMtQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCXZsci1OdW1iZXIJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlzZ3NuLU51bWJlcglbMV0JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitQdXJnZU1TLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWZyZWV6ZVRNU0kJWzBdCU5VTEwJCU9QVElPTkFMLAorCWZyZWV6ZVAtVE1TSQlbMV0JTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZnJlZXplTS1UTVNJCVsyXQlOVUxMCQlPUFRJT05BTCB9CisKK1NlbmRJZGVudGlmaWNhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCXRtc2kJCQlUTVNJLAorCW51bWJlck9mUmVxdWVzdGVkVmVjdG9ycwlOdW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMgCU9QVElPTkFMLAorCS0tIHdpdGhpbiBhIGRpYWxvZ3VlIG51bWJlck9mUmVxdWVzdGVkVmVjdG9ycyBzaGFsbCBiZSBwcmVzZW50IGluIAorCS0tIHRoZSBmaXJzdCBzZXJ2aWNlIHJlcXVlc3QgYW5kIHNoYWxsIG5vdCBiZSBwcmVzZW50IGluIHN1YnNlcXVlbnQgc2VydmljZSByZXF1ZXN0cy4gCisJLS0gSWYgcmVjZWl2ZWQgaW4gYSBzdWJzZXF1ZW50IHNlcnZpY2UgcmVxdWVzdCBpdCBzaGFsbCBiZSBkaXNjYXJkZWQuIAorCXNlZ21lbnRhdGlvblByb2hpYml0ZWQJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCW1zYy1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nIAlPUFRJT05BTCwKKwlwcmV2aW91cy1MQUkJWzBdIExBSUZpeGVkTGVuZ3RoCU9QVElPTkFMLAorCWhvcENvdW50ZXIJWzFdIEhvcENvdW50ZXIJT1BUSU9OQUwgfQorCitIb3BDb3VudGVyIDo6PSBJTlRFR0VSICgwLi4zKQorCitTZW5kSWRlbnRpZmljYXRpb25SZXMgOjo9IFszXSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0kJCQlPUFRJT05BTCwKKwktLSBJTVNJIHNoYWxsIGJlIHByZXNlbnQgaW4gdGhlIGZpcnN0IChvciBvbmx5KSBzZXJ2aWNlIHJlc3BvbnNlIG9mIGEgZGlhbG9ndWUuCisJLS0gSWYgbXVsdGlwbGUgc2VydmljZSByZXF1ZXN0cyBhcmUgcHJlc2VudCBpbiBhIGRpYWxvZ3VlIHRoZW4gSU1TSQorCS0tIHNoYWxsIG5vdCBiZSBwcmVzZW50IGluIGFueSBzZXJ2aWNlIHJlc3BvbnNlIG90aGVyIHRoYW4gdGhlIGZpcnN0IG9uZS4KKwlhdXRoZW50aWNhdGlvblNldExpc3QJQXV0aGVudGljYXRpb25TZXRMaXN0CU9QVElPTkFMLAorCWN1cnJlbnRTZWN1cml0eUNvbnRleHQJWzJdQ3VycmVudFNlY3VyaXR5Q29udGV4dAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKKy0tIGF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgdHlwZXMKKworQXV0aGVudGljYXRpb25TZXRMaXN0IDo6PSBDSE9JQ0UgeworCXRyaXBsZXRMaXN0CVswXSBUcmlwbGV0TGlzdCwKKwlxdWludHVwbGV0TGlzdAlbMV0gUXVpbnR1cGxldExpc3QgfQorCitUcmlwbGV0TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uNSkgT0YKKwkJCQlBdXRoZW50aWNhdGlvblRyaXBsZXQKKworUXVpbnR1cGxldExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUpIE9GCisJCQkJQXV0aGVudGljYXRpb25RdWludHVwbGV0CisKK0F1dGhlbnRpY2F0aW9uVHJpcGxldCA6Oj0gU0VRVUVOQ0UgeworCXJhbmQJCQlSQU5ELAorCXNyZXMJCQlTUkVTLAorCWtjCQkJS2MsCisJLi4ufQorCitBdXRoZW50aWNhdGlvblF1aW50dXBsZXQgOjo9IFNFUVVFTkNFIHsKKwlyYW5kCQkJUkFORCwKKwl4cmVzCQkJWFJFUywKKwljawkJCUNLLAorCWlrCQkJSUssCisJYXV0bgkJCUFVVE4sCisJLi4ufQorCitDdXJyZW50U2VjdXJpdHlDb250ZXh0IDo6PSBDSE9JQ0UgeworCWdzbS1TZWN1cml0eUNvbnRleHREYXRhCVswXSBHU00tU2VjdXJpdHlDb250ZXh0RGF0YSwKKwl1bXRzLVNlY3VyaXR5Q29udGV4dERhdGEJWzFdIFVNVFMtU2VjdXJpdHlDb250ZXh0RGF0YSB9CisKK0dTTS1TZWN1cml0eUNvbnRleHREYXRhIDo6PSBTRVFVRU5DRSB7CisJa2MJCQlLYywKKwlja3NuCQkJQ2tzbiwKKwkuLi4gfQorCitVTVRTLVNlY3VyaXR5Q29udGV4dERhdGEgOjo9IFNFUVVFTkNFIHsKKwljawkJCUNLLAorCWlrCQkJSUssCisJa3NpCQkJS1NJLAorCS4uLiB9CisKK1JBTkQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTYpKQorCitTUkVTIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQpKQorCitLYyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg4KSkKKworWFJFUyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0Li4xNikpCisKK0NLIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE2KSkKKworSUsgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTYpKQorCitBVVROIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE2KSkKKworQVVUUyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNCkpCisKK0Nrc24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIDNHUFAgVFMgMjQuMDA4CisKK0tTSSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gM0dQUCBUUyAyNC4wMDgKKworQXV0aGVudGljYXRpb25GYWlsdXJlUmVwb3J0QXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJZmFpbHVyZUNhdXNlCUZhaWx1cmVDYXVzZSwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJcmUtYXR0ZW1wdAlCT09MRUFOCQlPUFRJT05BTCwKKwlhY2Nlc3NUeXBlCUFjY2Vzc1R5cGUJT1BUSU9OQUwsCisJcmFuZAkJCVJBTkQJCQlPUFRJT05BTCwKKwl2bHItTnVtYmVyCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJc2dzbi1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCB9CisKK0FjY2Vzc1R5cGUgOjo9IEVOVU1FUkFURUQgeworCWNhbGwgKDApLAorCWVtZXJnZW5jeUNhbGwgKDEpLAorCWxvY2F0aW9uVXBkYXRpbmcgKDIpLAorCXN1cHBsZW1lbnRhcnlTZXJ2aWNlICgzKSwKKwlzaG9ydE1lc3NhZ2UgKDQpLAorCWdwcnNBdHRhY2ggKDUpLAorCXJvdXRpbmdBcmVhVXBkYXRpbmcgKDYpLAorCXNlcnZpY2VSZXF1ZXN0ICg3KSwKKwlwZHBDb250ZXh0QWN0aXZhdGlvbiAoOCksCisJcGRwQ29udGV4dERlYWN0aXZhdGlvbiAoOSksCisJLi4uLAorCWdwcnNEZXRhY2ggKDEwKX0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gcmVjZWl2ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiAxMCBzaGFsbCBiZSBpZ25vcmVkLgorCitBdXRoZW50aWNhdGlvbkZhaWx1cmVSZXBvcnRSZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRmFpbHVyZUNhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwl3cm9uZ1VzZXJSZXNwb25zZSAgKDApLAorCXdyb25nTmV0d29ya1NpZ25hdHVyZSAgKDEpfQorCistLSBncHJzIGxvY2F0aW9uIHJlZ2lzdHJhdGlvbiB0eXBlcworCitVcGRhdGVHcHJzTG9jYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwlzZ3NuLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCQorCXNnc24tQWRkcmVzcwlHU04tQWRkcmVzcywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJc2dzbi1DYXBhYmlsaXR5CVswXSBTR1NOLUNhcGFiaWxpdHkJT1BUSU9OQUwsCisJaW5mb3JtUHJldmlvdXNOZXR3b3JrRW50aXR5CVsxXQlOVUxMCQlPUFRJT05BTCwKKwlwcy1MQ1MtTm90U3VwcG9ydGVkQnlVRQlbMl0JTlVMTAkJT1BUSU9OQUwsCisJdi1nbWxjLUFkZHJlc3MJWzNdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWFkZC1pbmZvCQlbNF0gIEFERC1JbmZvCU9QVElPTkFMLAorCWVwcy1pbmZvCQlbNV0JRVBTLUluZm8JT1BUSU9OQUwsCisJc2VydmluZ05vZGVUeXBlSW5kaWNhdG9yCVs2XQlOVUxMCQlPUFRJT05BTCwKKwlza2lwU3Vic2NyaWJlckRhdGFVcGRhdGUJWzddIE5VTEwJCU9QVElPTkFMLAorCXVzZWRSQVQtVHlwZQlbOF0gVXNlZC1SQVQtVHlwZQlPUFRJT05BTCAKKwkgfQorCitVc2VkLVJBVC1UeXBlOjo9IEVOVU1FUkFURUQgeworCXV0cmFuICAoMCksCisJZ2VyYW4gICgxKSwKKwlnYW4gICAgKDIpLAorCWktaHNwYS1ldm9sdXRpb24gKDMpLAorCWUtdXRyYW4JKDQpLAorCS4uLn0KKworRVBTLUluZm8gOjo9IENIT0lDRXsKKwlwZG4tZ3ctdXBkYXRlCVswXSBQRE4tR1ctVXBkYXRlLAorCWlzci1JbmZvcm1hdGlvbglbMV0gSVNSLUluZm9ybWF0aW9uIH0KKworUEROLUdXLVVwZGF0ZSA6Oj0gU0VRVUVOQ0V7CisJYXBuCQkJWzBdIEFQTgkJT1BUSU9OQUwsCisJcGRuLWd3LUlkZW50aXR5CVsxXSBQRE4tR1ctSWRlbnRpdHkJT1BUSU9OQUwsCisJY29udGV4dElkCQlbMl0gQ29udGV4dElkICAgICAgICAgICAgICAgICAgICAgT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworSVNSLUluZm9ybWF0aW9uOjo9IEJJVCBTVFJJTkcgeworCXVwZGF0ZU1NRSAgKDApLAorCWNhbmNlbFNHU04gICgxKX0gKFNJWkUgKDIuLjgpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogcmVjZXB0aW9uIG9mIHVua25vd24gYml0IGFzc2lnbm1lbnRzIGluIHRoZQorCS0tIElTUi1JbmZvcm1hdGlvbiBkYXRhIHR5cGUgc2hhbGwgYmUgZGlzY2FyZGVkIGJ5IHRoZSByZWNlaXZlciAKKworU0dTTi1DYXBhYmlsaXR5IDo6PSBTRVFVRU5DRXsKKwlzb2xzYVN1cHBvcnRJbmRpY2F0b3IJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJc3VwZXJDaGFyZ2VyU3VwcG9ydGVkSW5TZXJ2aW5nTmV0d29ya0VudGl0eQlbMl0gU3VwZXJDaGFyZ2VySW5mbwlPUFRJT05BTCAsCisJZ3Byc0VuaGFuY2VtZW50c1N1cHBvcnRJbmRpY2F0b3IgCVszXSBOVUxMCQlPUFRJT05BTCwKKwlzdXBwb3J0ZWRDYW1lbFBoYXNlcyAgCVs0XSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJWzVdICBTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJT1BUSU9OQUwsCisJb2ZmZXJlZENhbWVsNENTSXMJWzZdIE9mZmVyZWRDYW1lbDRDU0lzCU9QVElPTkFMLAorCXNtc0NhbGxCYXJyaW5nU3VwcG9ydEluZGljYXRvcglbN10JTlVMTAkJT1BUSU9OQUwsCXN1cHBvcnRlZFJBVC1UeXBlc0luZGljYXRvcglbOF0JU3VwcG9ydGVkUkFULVR5cGVzCU9QVElPTkFMLAorCXN1cHBvcnRlZEZlYXR1cmVzCVs5XSBTdXBwb3J0ZWRGZWF0dXJlcwlPUFRJT05BTCB9CisKK1N1cHBvcnRlZEZlYXR1cmVzOjo9IEJJVCBTVFJJTkcgeworCW9kYi1hbGwgKDApLAorCW9kYi1IUExNTi1BUE4gKDEpLAorCW9kYi1WUExNTi1BUE4gKDIpLAorCXJlZ1N1YiAoMyl9IChTSVpFICg0Li44KSkKKworR1NOLUFkZHJlc3MgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNS4uMTcpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10KKworVXBkYXRlR3Byc0xvY2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJaGxyLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkLUNhcGFiaWxpdHkJTlVMTAkJCU9QVElPTkFMLAorCXNnc24tbW1lU2VwYXJhdGlvblN1cHBvcnRlZAlbMF0gTlVMTAkJT1BUSU9OQUwgfQorCistLSBoYW5kb3ZlciB0eXBlcworCitGb3J3YXJkQWNjZXNzU2lnbmFsbGluZy1BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJYW4tQVBEVQkJQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJaW50ZWdyaXR5UHJvdGVjdGlvbkluZm8JWzBdIEludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbgkJT1BUSU9OQUwsCisJZW5jcnlwdGlvbkluZm8JWzFdIEVuY3J5cHRpb25JbmZvcm1hdGlvbgkJT1BUSU9OQUwsCisJa2V5U3RhdHVzCQlbMl0JS2V5U3RhdHVzCU9QVElPTkFMLAorCWFsbG93ZWRHU00tQWxnb3JpdGhtcwlbNF0JQWxsb3dlZEdTTS1BbGdvcml0aG1zCU9QVElPTkFMLAorCWFsbG93ZWRVTVRTLUFsZ29yaXRobXMJWzVdCUFsbG93ZWRVTVRTLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJcmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVs2XSBSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLiwKKwlyYWRpb1Jlc291cmNlTGlzdAlbN10JUmFkaW9SZXNvdXJjZUxpc3QJT1BUSU9OQUwsCisJYnNzbWFwLVNlcnZpY2VIYW5kb3ZlcglbOV0JQlNTTUFQLVNlcnZpY2VIYW5kb3ZlcglPUFRJT05BTCwKKwlyYW5hcC1TZXJ2aWNlSGFuZG92ZXIJWzhdCVJBTkFQLVNlcnZpY2VIYW5kb3ZlcglPUFRJT05BTCwKKwlic3NtYXAtU2VydmljZUhhbmRvdmVyTGlzdAlbMTBdCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXJMaXN0CU9QVElPTkFMLAorCWN1cnJlbnRseVVzZWRDb2RlYwlbMTFdIENvZGVjCU9QVElPTkFMLAorCWl1U3VwcG9ydGVkQ29kZWNzTGlzdAlbMTJdIFN1cHBvcnRlZENvZGVjc0xpc3QJT1BUSU9OQUwsCisJcmFiLUNvbmZpZ3VyYXRpb25JbmRpY2F0b3IJWzEzXSBOVUxMCQlPUFRJT05BTCwKKwlpdVNlbGVjdGVkQ29kZWMJWzE0XQlDb2RlYwlPUFRJT05BTCwKKwlhbHRlcm5hdGl2ZUNoYW5uZWxUeXBlCVsxNV0JUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCU9QVElPTkFMLAorCXRyYWNlUHJvcGFnYXRpb25MaXN0CVsxN10JVHJhY2VQcm9wYWdhdGlvbkxpc3QJT1BUSU9OQUwgfQorCitBbGxvd2VkR1NNLUFsZ29yaXRobXMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gaW50ZXJuYWwgc3RydWN0dXJlIGlzIGNvZGVkIGFzIEFsZ29yaXRobSBpZGVudGlmaWVyIG9jdGV0IGZyb20KKwktLSBQZXJtaXR0ZWQgQWxnb3JpdGhtcyBkZWZpbmVkIGluIDNHUFAgVFMgNDguMDA4CisJLS0gQSBub2RlIHNoYWxsIG1hcmsgYWxsIEdTTSBhbGdvcml0aG1zIHRoYXQgYXJlIGFsbG93ZWQgaW4gTVNDLUIKKworQWxsb3dlZFVNVFMtQWxnb3JpdGhtcyA6Oj0gU0VRVUVOQ0UgeworCWludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zCVswXSAJUGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXMJT1BUSU9OQUwsCisJZW5jcnlwdGlvbkFsZ29yaXRobXMJWzFdIAlQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtcwkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitQZXJtaXR0ZWRJbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtcyA6Oj0KKwkJT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhQZXJtaXR0ZWRJbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtc0xlbmd0aCkpCisJLS0gT2N0ZXRzIGNvbnRhaW4gYSBjb21wbGV0ZSBQZXJtaXR0ZWRJbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtcyBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMy4gCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCwgaWYgbmVlZGVkLCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgCisJLS0gbGFzdCBvY3RldCBvZiB0aGUgb2N0ZXQgc3RyaW5nLiAKKworCittYXhQZXJtaXR0ZWRJbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtc0xlbmd0aCBJTlRFR0VSIDo6PSA5CisKK1Blcm1pdHRlZEVuY3J5cHRpb25BbGdvcml0aG1zIDo6PQorCQlPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heFBlcm1pdHRlZEVuY3J5cHRpb25BbGdvcml0aG1zTGVuZ3RoKSkKKwktLSBPY3RldHMgY29udGFpbiBhIGNvbXBsZXRlIFBlcm1pdHRlZEVuY3J5cHRpb25BbGdvcml0aG1zIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCwgaWYgbmVlZGVkLCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgCisJLS0gbGFzdCBvY3RldCBvZiB0aGUgb2N0ZXQgc3RyaW5nLiAKKworCittYXhQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtc0xlbmd0aCBJTlRFR0VSIDo6PSA5CisKK0tleVN0YXR1cyA6Oj0gRU5VTUVSQVRFRCB7CisJb2xkICAoMCksCisJbmV3ICAoMSksCisJLi4ufQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSByZWNlaXZlZCB2YWx1ZXMgaW4gcmFuZ2UgMi0zMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJvbGQiCisJLS0gcmVjZWl2ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJuZXciCisKK1ByZXBhcmVITy1BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJdGFyZ2V0Q2VsbElkCVswXSBHbG9iYWxDZWxsSWQJT1BUSU9OQUwsCisJaG8tTnVtYmVyTm90UmVxdWlyZWQJTlVMTAkJCU9QVElPTkFMLCAKKwl0YXJnZXRSTkNJZAlbMV0gUk5DSWQJCU9QVElPTkFMLAorCWFuLUFQRFUJCVsyXSBBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbwlPUFRJT05BTCwKKwltdWx0aXBsZUJlYXJlclJlcXVlc3RlZAlbM10gTlVMTAkJT1BUSU9OQUwsCisJaW1zaQkJCVs0XSBJTVNJCQlPUFRJT05BTCwKKwlpbnRlZ3JpdHlQcm90ZWN0aW9uSW5mbwlbNV0gSW50ZWdyaXR5UHJvdGVjdGlvbkluZm9ybWF0aW9uCQlPUFRJT05BTCwKKwllbmNyeXB0aW9uSW5mbwlbNl0gRW5jcnlwdGlvbkluZm9ybWF0aW9uCQlPUFRJT05BTCwKKwlyYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JWzddIFJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlhbGxvd2VkR1NNLUFsZ29yaXRobXMJWzldCUFsbG93ZWRHU00tQWxnb3JpdGhtcwlPUFRJT05BTCwKKwlhbGxvd2VkVU1UUy1BbGdvcml0aG1zCVsxMF0JQWxsb3dlZFVNVFMtQWxnb3JpdGhtcwlPUFRJT05BTCwKKwlyYWRpb1Jlc291cmNlTGlzdAlbMTFdIFJhZGlvUmVzb3VyY2VMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbOF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJcmFiLUlkCQlbMTJdIFJBQi1JZAlPUFRJT05BTCwKKwlic3NtYXAtU2VydmljZUhhbmRvdmVyCVsxM10JQlNTTUFQLVNlcnZpY2VIYW5kb3ZlcglPUFRJT05BTCwKKwlyYW5hcC1TZXJ2aWNlSGFuZG92ZXIJWzE0XQlSQU5BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsIAorCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXJMaXN0CVsxNV0JQlNTTUFQLVNlcnZpY2VIYW5kb3Zlckxpc3QJT1BUSU9OQUwsCisJYXNjaUNhbGxSZWZlcmVuY2UJWzIwXQlBU0NJLUNhbGxSZWZlcmVuY2UJT1BUSU9OQUwsCisJZ2VyYW4tY2xhc3NtYXJrCVsxNl0gR0VSQU4tQ2xhc3NtYXJrCU9QVElPTkFMLAorCWl1Q3VycmVudGx5VXNlZENvZGVjCVsxN10gQ29kZWMJT1BUSU9OQUwsCisJaXVTdXBwb3J0ZWRDb2RlY3NMaXN0CVsxOF0gU3VwcG9ydGVkQ29kZWNzTGlzdAlPUFRJT05BTCwKKwlyYWItQ29uZmlndXJhdGlvbkluZGljYXRvcglbMTldIE5VTEwJCU9QVElPTkFMLAorCXVlc2JpLUl1CQlbMjFdCVVFU0JJLUl1CU9QVElPTkFMLAorCWltZWlzdgkJWzIyXQlJTUVJCQlPUFRJT05BTCwKKwlhbHRlcm5hdGl2ZUNoYW5uZWxUeXBlCVsyM10JUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCU9QVElPTkFMLAorCXRyYWNlUHJvcGFnYXRpb25MaXN0CVsyNV0JVHJhY2VQcm9wYWdhdGlvbkxpc3QJT1BUSU9OQUwJIH0KKworQlNTTUFQLVNlcnZpY2VIYW5kb3Zlckxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLiBtYXhOdW1PZlNlcnZpY2VIYW5kb3ZlcnMpIE9GCisJCQkJQlNTTUFQLVNlcnZpY2VIYW5kb3ZlckluZm8KKworQlNTTUFQLVNlcnZpY2VIYW5kb3ZlckluZm8gOjo9IFNFUVVFTkNFIHsKKwlic3NtYXAtU2VydmljZUhhbmRvdmVyCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXIsCisJcmFiLUlkCQlSQUItSWQsCisJLS0gUkFCIElkZW50aXR5IGlzIG5lZWRlZCB0byByZWxhdGUgdGhlIHNlcnZpY2UgaGFuZG92ZXJzIHdpdGggdGhlIHJhZGlvIGFjY2VzcyBiZWFyZXJzLiAKKwkuLi59CisKK21heE51bU9mU2VydmljZUhhbmRvdmVycyAgSU5URUdFUiA6Oj0gNworCitCU1NNQVAtU2VydmljZUhhbmRvdmVyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRoZSBTZXJ2aWNlIEhhbmRvdmVyIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4KKwktLSAzR1BQIFRTIDQ4LjAwOC4KKworUkFOQVAtU2VydmljZUhhbmRvdmVyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIE9jdGV0IGNvbnRhaW5zIGEgY29tcGxldGUgU2VydmljZS1IYW5kb3ZlciBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMworCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMuIAorCisKK1JhZGlvUmVzb3VyY2VMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi4gbWF4TnVtT2ZSYWRpb1Jlc291cmNlcykgT0YKKwkJCQlSYWRpb1Jlc291cmNlCisKK1JhZGlvUmVzb3VyY2UgOjo9IFNFUVVFTkNFIHsKKwlyYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uLAorCXJhYi1JZAkJUkFCLUlkLAorCS0tIFJBQiBJZGVudGl0eSBpcyBuZWVkZWQgdG8gcmVsYXRlIHRoZSByYWRpbyByZXNvdXJjZXMgd2l0aCB0aGUgcmFkaW8gYWNjZXNzIGJlYXJlcnMuIAorCS4uLn0KKworbWF4TnVtT2ZSYWRpb1Jlc291cmNlcyAgSU5URUdFUiA6Oj0gNworCitQcmVwYXJlSE8tUmVzIDo6PSBbM10gU0VRVUVOQ0UgeworCWhhbmRvdmVyTnVtYmVyCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJcmVsb2NhdGlvbk51bWJlckxpc3QJWzFdCVJlbG9jYXRpb25OdW1iZXJMaXN0CU9QVElPTkFMLAorCWFuLUFQRFUJCVsyXQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbwlPUFRJT05BTCwKKwltdWx0aWNhbGxCZWFyZXJJbmZvCVszXQlNdWx0aWNhbGxCZWFyZXJJbmZvCU9QVElPTkFMLAorCW11bHRpcGxlQmVhcmVyTm90U3VwcG9ydGVkCU5VTEwJCQlPUFRJT05BTCwKKwlzZWxlY3RlZFVNVFMtQWxnb3JpdGhtcwlbNV0JU2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJY2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVs2XSBDaG9zZW5SYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JIE9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlpdVNlbGVjdGVkQ29kZWMJWzddIENvZGVjCQlPUFRJT05BTCwKKwlpdUF2YWlsYWJsZUNvZGVjc0xpc3QJWzhdIENvZGVjTGlzdAlPUFRJT05BTCB9CisKK1NlbGVjdGVkVU1UUy1BbGdvcml0aG1zIDo6PSBTRVFVRU5DRSB7CisJaW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobQlbMF0gCUNob3NlbkludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG0JT1BUSU9OQUwsCisJZW5jcnlwdGlvbkFsZ29yaXRobQlbMV0gCUNob3NlbkVuY3J5cHRpb25BbGdvcml0aG0JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDaG9zZW5JbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIE9jdGV0IGNvbnRhaW5zIGEgY29tcGxldGUgSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobSBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMworCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMuIAorCitDaG9zZW5FbmNyeXB0aW9uQWxnb3JpdGhtIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIE9jdGV0IGNvbnRhaW5zIGEgY29tcGxldGUgRW5jcnlwdGlvbkFsZ29yaXRobSBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMworCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMuIAorCitDaG9zZW5SYWRpb1Jlc291cmNlSW5mb3JtYXRpb24gOjo9IFNFUVVFTkNFIHsKKwljaG9zZW5DaGFubmVsSW5mbwlbMF0gQ2hvc2VuQ2hhbm5lbEluZm8JT1BUSU9OQUwsCisJY2hvc2VuU3BlZWNoVmVyc2lvbglbMV0gQ2hvc2VuU3BlZWNoVmVyc2lvbglPUFRJT05BTCwKKwkuLi59CisKK0Nob3NlbkNoYW5uZWxJbmZvIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRoZSBDaG9zZW4gQ2hhbm5lbCBpbmZvcm1hdGlvbiBlbGVtZW50IGluIDNHUFAgVFMgNDguMDA4CisKK0Nob3NlblNwZWVjaFZlcnNpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIFNwZWVjaCBWZXJzaW9uIChjaG9zZW4pIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4gM0dQUCBUUworCS0tIDQ4LjAwOCAKKworUHJlcGFyZVN1YnNlcXVlbnRITy1BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJdGFyZ2V0Q2VsbElkCVswXSBHbG9iYWxDZWxsSWQJT1BUSU9OQUwsCisJdGFyZ2V0TVNDLU51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXRhcmdldFJOQ0lkCVsyXSBSTkNJZAkJT1BUSU9OQUwsCisJYW4tQVBEVQkJWzNdCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvCU9QVElPTkFMLAorCXNlbGVjdGVkUmFiLUlkCVs0XQlSQUItSWQJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs1XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWdlcmFuLWNsYXNzbWFyawlbNl0gR0VSQU4tQ2xhc3NtYXJrCU9QVElPTkFMLAorCXJhYi1Db25maWd1cmF0aW9uSW5kaWNhdG9yCVs3XSBOVUxMCQlPUFRJT05BTCB9CisKK1ByZXBhcmVTdWJzZXF1ZW50SE8tUmVzIDo6PSBbM10gU0VRVUVOQ0UgeworCWFuLUFQRFUJCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUHJvY2Vzc0FjY2Vzc1NpZ25hbGxpbmctQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCWFuLUFQRFUJCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAorCXNlbGVjdGVkVU1UUy1BbGdvcml0aG1zCVsxXQlTZWxlY3RlZFVNVFMtQWxnb3JpdGhtcwlPUFRJT05BTCwKKwlzZWxlY3RlZEdTTS1BbGdvcml0aG0JWzJdCVNlbGVjdGVkR1NNLUFsZ29yaXRobQlPUFRJT05BTCwKKwljaG9zZW5SYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JWzNdIENob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbiBPUFRJT05BTCwKKwlzZWxlY3RlZFJhYi1JZAlbNF0gUkFCLUlkCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi4sCisJaVVTZWxlY3RlZENvZGVjCVs1XSBDb2RlYwkJT1BUSU9OQUwsCisJaXVBdmFpbGFibGVDb2RlY3NMaXN0CVs2XSBDb2RlY0xpc3QJT1BUSU9OQUwgfQorCitTdXBwb3J0ZWRDb2RlY3NMaXN0IDo6PSBTRVFVRU5DRSB7CisJdXRyYW5Db2RlY0xpc3QJWzBdIENvZGVjTGlzdAlPUFRJT05BTCwKKwlnZXJhbkNvZGVjTGlzdAlbMV0gQ29kZWNMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ29kZWNMaXN0IDo6PSBTRVFVRU5DRSB7CisJY29kZWMxCQlbMV0gQ29kZWMsCisJY29kZWMyCQlbMl0gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjMwkJWzNdIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzQJCVs0XSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWM1CQlbNV0gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjNgkJWzZdIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzcJCVs3XSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWM4CQlbOF0gQ29kZWMJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbOV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKwktLSBDb2RlY3MgYXJlIHNlbnQgaW4gcHJpb3JpdHkgb3JkZXIgd2hlcmUgY29kZWMxIGhhcyBoaWdoZXN0IHByaW9yaXR5CisKK0NvZGVjIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjQpKQorCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMQlDb2RlZCBhcyBDb2RlYyBJZGVudGlmaWNhdGlvbiBjb2RlIGluIDNHUFAgVFMgMjYuMTAzCisJLS0gb2N0ZXRzIDIsMyw0CVBhcmFtZXRlcnMgZm9yIHRoZSBDb2RlYyBhcyBkZWZpbmVkIGluIDNHUFAgVFMKKwktLQkJCTI2LjEwMywgaWYgYXZhaWxhYmxlLCBsZW5ndGggZGVwZW5kaW5nIG9uIHRoZSBjb2RlYworCitHRVJBTi1DbGFzc21hcmsgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMi4uODcpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRoZSBHRVJBTiBDbGFzc21hcmsgaW5mb3JtYXRpb24gZWxlbWVudCBpbiAzR1BQIFRTIDQ4LjAwOAorCitTZWxlY3RlZEdTTS1BbGdvcml0aG0gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gaW50ZXJuYWwgc3RydWN0dXJlIGlzIGNvZGVkIGFzIEFsZ29yaXRobSBpZGVudGlmaWVyIG9jdGV0IGZyb20gQ2hvc2VuIEVuY3J5cHRpb24KKwktLSBBbGdvcml0aG0gZGVmaW5lZCBpbiAzR1BQIFRTIDQ4LjAwOAorCS0tIEEgbm9kZSBzaGFsbCBtYXJrIG9ubHkgdGhlIHNlbGVjdGVkIEdTTSBhbGdvcml0aG0KKworU2VuZEVuZFNpZ25hbC1BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJYW4tQVBEVQkJQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLn0KKworU2VuZEVuZFNpZ25hbC1SZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJWzBdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4ufQorCitSTkNJZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg3KSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdAorCS0tCQkJb3IgZmlsbGVyICgxMTExKSBmb3IgMiBkaWdpdCBNTkNzCisJLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0cyA0IGFuZCA1CUxvY2F0aW9uIEFyZWEgQ29kZSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDgKKwktLSBvY3RldHMgNiBhbmQgNwlSTkMgSWQgdmFsdWUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjUuNDEzCisKK1JlbG9jYXRpb25OdW1iZXJMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlJlbG9jYXRpb25OdW1iZXIpIE9GCisJCQkJUmVsb2NhdGlvbk51bWJlcgorCitNdWx0aWNhbGxCZWFyZXJJbmZvIDo6PSBJTlRFR0VSICgxLi5tYXhOdW1PZlJlbG9jYXRpb25OdW1iZXIpCisKK1JlbG9jYXRpb25OdW1iZXIgOjo9IFNFUVVFTkNFIHsKKwloYW5kb3Zlck51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJcmFiLUlkCQlSQUItSWQsCisJLS0gUkFCIElkZW50aXR5IGlzIG5lZWRlZCB0byByZWxhdGUgdGhlIGNhbGxzIHdpdGggdGhlIHJhZGlvIGFjY2VzcyBiZWFyZXJzLiAKKwkuLi59CisKK1JBQi1JZCA6Oj0gSU5URUdFUiAoMS4ubWF4TnJPZlJBQnMpCisKK21heE5yT2ZSQUJzIElOVEVHRVIgOjo9IDI1NQorCittYXhOdW1PZlJlbG9jYXRpb25OdW1iZXIgIElOVEVHRVIgOjo9IDcKKworUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMuLjEzKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgQ2hhbm5lbCBUeXBlIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4gM0dQUCBUUyA0OC4wMDgKKworSW50ZWdyaXR5UHJvdGVjdGlvbkluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE4Li5tYXhOdW1PZkludGVncml0eUluZm8pKQorCS0tIE9jdGV0cyBjb250YWluIGEgY29tcGxldGUgSW50ZWdyaXR5UHJvdGVjdGlvbkluZm9ybWF0aW9uIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCwgaWYgbmVlZGVkLCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgCisJLS0gbGFzdCBvY3RldCBvZiB0aGUgb2N0ZXQgc3RyaW5nLiAKKworbWF4TnVtT2ZJbnRlZ3JpdHlJbmZvIElOVEVHRVIgOjo9IDEwMAorCitFbmNyeXB0aW9uSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTguLm1heE51bU9mRW5jcnlwdGlvbkluZm8pKQorCS0tIE9jdGV0cyBjb250YWluIGEgY29tcGxldGUgRW5jcnlwdGlvbkluZm9ybWF0aW9uIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCwgaWYgbmVlZGVkLCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgCisJLS0gbGFzdCBvY3RldCBvZiB0aGUgb2N0ZXQgc3RyaW5nLiAKKworbWF4TnVtT2ZFbmNyeXB0aW9uSW5mbyBJTlRFR0VSIDo6PSAxMDAKKworLS0gYXV0aGVudGljYXRpb24gbWFuYWdlbWVudCB0eXBlcworCitTZW5kQXV0aGVudGljYXRpb25JbmZvQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCW51bWJlck9mUmVxdWVzdGVkVmVjdG9ycwlOdW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMsCisJc2VnbWVudGF0aW9uUHJvaGliaXRlZAlOVUxMCQkJT1BUSU9OQUwsCisJaW1tZWRpYXRlUmVzcG9uc2VQcmVmZXJyZWQJWzFdIE5VTEwJCQlPUFRJT05BTCwKKwlyZS1zeW5jaHJvbmlzYXRpb25JbmZvCVJlLXN5bmNocm9uaXNhdGlvbkluZm8JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXJlcXVlc3RpbmdOb2RlVHlwZQlbM10gUmVxdWVzdGluZ05vZGVUeXBlCU9QVElPTkFMLAorCXJlcXVlc3RpbmdQTE1OLUlkCVs0XSBQTE1OLUlkCU9QVElPTkFMLAorCW51bWJlck9mUmVxdWVzdGVkQWRkaXRpb25hbC1WZWN0b3JzCVs1XSBOdW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMJT1BUSU9OQUwsCisJYWRkaXRpb25hbFZlY3RvcnNBcmVGb3JFUFMJWzZdIE5VTEwJCU9QVElPTkFMIH0JCisKKworTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzIDo6PSBJTlRFR0VSICgxLi41KQorCitSZS1zeW5jaHJvbmlzYXRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJcmFuZAkJCVJBTkQsCisJYXV0cwkJCUFVVFMsCisJLi4ufQorCitTZW5kQXV0aGVudGljYXRpb25JbmZvUmVzIDo6PSBbM10gU0VRVUVOQ0UgeworCWF1dGhlbnRpY2F0aW9uU2V0TGlzdAlBdXRoZW50aWNhdGlvblNldExpc3QgCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWVwcy1BdXRoZW50aWNhdGlvblNldExpc3QJWzJdIEVQUy1BdXRoZW50aWNhdGlvblNldExpc3QJT1BUSU9OQUwgfQorCitFUFMtQXV0aGVudGljYXRpb25TZXRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi41KSBPRgorCQkJCUVQQy1BVgorCitFUEMtQVYgOjo9IFNFUVVFTkNFIHsKKwlyYW5kCQkJUkFORCwKKwl4cmVzCQkJWFJFUywKKwlhdXRuCQkJQVVUTiwKKwlrYXNtZQkJS0FTTUUsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0tBU01FIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE2KSkKKworUmVxdWVzdGluZ05vZGVUeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwl2bHIgICgwKSwKKwlzZ3NuICAoMSksCisJLi4uLAorCXMtY3NjZiAgKDIpLAorCWJzZiAgKDMpLAorCWdhbi1hYWEtc2VydmVyICAoNCksCisJd2xhbi1hYWEtc2VydmVyICAoNSksCisJbW1lCQkoMTYpLAorCW1tZS1zZ3NuCSgxNykKKwl9CisJLS0gdGhlIHZhbHVlcyAyLCAzLCA0IGFuZCA1IHNoYWxsIG5vdCBiZSB1c2VkIG9uIHRoZSBNQVAtRCBvciBHciBpbnRlcmZhY2VzCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIHJlY2VpdmVkIHZhbHVlcyBpbiB0aGUgcmFuZ2UgKDYtMTUpIHNoYWxsIGJlIHRyZWF0ZWQgYXMgInZsciIKKwktLSByZWNlaXZlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDE3IHNoYWxsIGJlIHRyZWF0ZWQgYXMgInNnc24iCisKKy0tIGVxdWlwbWVudCBtYW5hZ2VtZW50IHR5cGVzCisKK0NoZWNrSU1FSS1BcmcgOjo9IFNFUVVFTkNFIHsKKwlpbWVpCQkJSU1FSSwKKwlyZXF1ZXN0ZWRFcXVpcG1lbnRJbmZvCVJlcXVlc3RlZEVxdWlwbWVudEluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NoZWNrSU1FSS1SZXMgOjo9IFNFUVVFTkNFIHsKKwllcXVpcG1lbnRTdGF0dXMJRXF1aXBtZW50U3RhdHVzCU9QVElPTkFMLAorCWJtdWVmCQlVRVNCSS1JdQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitSZXF1ZXN0ZWRFcXVpcG1lbnRJbmZvOjo9IEJJVCBTVFJJTkcgeworCWVxdWlwbWVudFN0YXR1cyAgKDApLAorCWJtdWVmICAoMSl9IChTSVpFICgyLi44KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6IHJlY2VwdGlvbiBvZiB1bmtub3duIGJpdCBhc3NpZ25tZW50cyBpbiB0aGUKKwktLSBSZXF1ZXN0ZWRFcXVpcG1lbnRJbmZvIGRhdGEgdHlwZSBzaGFsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIHJlY2VpdmVyIAorCitVRVNCSS1JdSA6Oj0gU0VRVUVOQ0UgeworCXVlc2JpLUl1QQlbMF0gVUVTQkktSXVBCQkJCU9QVElPTkFMLAorCXVlc2JpLUl1QglbMV0gVUVTQkktSXVCCQkJCU9QVElPTkFMLAorCS4uLn0KKworVUVTQkktSXVBCQkJCTo6PSBCSVQgU1RSSU5HIChTSVpFKDEuLjEyOCkpCistLSBTZWUgM0dQUCBUUyAyNS40MTMKKworVUVTQkktSXVCCQkJCTo6PSBCSVQgU1RSSU5HIChTSVpFKDEuLjEyOCkpCistLSBTZWUgM0dQUCBUUyAyNS40MTMKKworRXF1aXBtZW50U3RhdHVzIDo6PSBFTlVNRVJBVEVEIHsKKwl3aGl0ZUxpc3RlZCAgKDApLAorCWJsYWNrTGlzdGVkICAoMSksCisJZ3JleUxpc3RlZCAgKDIpfQorCistLSBzdWJzY3JpYmVyIG1hbmFnZW1lbnQgdHlwZXMKKworSW5zZXJ0U3Vic2NyaWJlckRhdGFBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJWzBdIElNU0kJCU9QVElPTkFMLAorCUNPTVBPTkVOVFMgT0YJU3Vic2NyaWJlckRhdGEsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCQorCW5hZWEtUHJlZmVycmVkQ0kJWzE1XSBOQUVBLVByZWZlcnJlZENJCU9QVElPTkFMLAorCS0tIG5hZWEtUHJlZmVycmVkQ0kgaXMgaW5jbHVkZWQgYXQgdGhlIGRpc2NyZXRpb24gb2YgdGhlIEhMUiBvcGVyYXRvci4KKwlncHJzU3Vic2NyaXB0aW9uRGF0YQlbMTZdIEdQUlNTdWJzY3JpcHRpb25EYXRhCU9QVElPTkFMLAorCXJvYW1pbmdSZXN0cmljdGVkSW5TZ3NuRHVlVG9VbnN1cHBvcnRlZEZlYXR1cmUgWzIzXSAJTlVMTAkKKwkJCQkJCQlPUFRJT05BTCwgCisJbmV0d29ya0FjY2Vzc01vZGUJWzI0XSBOZXR3b3JrQWNjZXNzTW9kZQlPUFRJT05BTCwKKwlsc2FJbmZvcm1hdGlvbglbMjVdIExTQUluZm9ybWF0aW9uCU9QVElPTkFMLAorCWxtdS1JbmRpY2F0b3IJWzIxXQlOVUxMCQlPUFRJT05BTCwKKwlsY3NJbmZvcm1hdGlvbglbMjJdCUxDU0luZm9ybWF0aW9uCU9QVElPTkFMLAorCWlzdEFsZXJ0VGltZXIJWzI2XSBJU1QtQWxlcnRUaW1lclZhbHVlCU9QVElPTkFMLAorCXN1cGVyQ2hhcmdlclN1cHBvcnRlZEluSExSCVsyN10gQWdlSW5kaWNhdG9yCU9QVElPTkFMLAorCW1jLVNTLUluZm8JWzI4XSBNQy1TUy1JbmZvCU9QVElPTkFMLAorCWNzLUFsbG9jYXRpb25SZXRlbnRpb25Qcmlvcml0eQlbMjldIENTLUFsbG9jYXRpb25SZXRlbnRpb25Qcmlvcml0eQkJT1BUSU9OQUwsCisJc2dzbi1DQU1FTC1TdWJzY3JpcHRpb25JbmZvCVsxN10gU0dTTi1DQU1FTC1TdWJzY3JpcHRpb25JbmZvCU9QVElPTkFMLAorCWNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzIAlbMThdCUNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzIAlPUFRJT05BTCwKKwlhY2Nlc3NSZXN0cmljdGlvbkRhdGEJWzE5XSBBY2Nlc3NSZXN0cmljdGlvbkRhdGEJT1BUSU9OQUwsCisJaWNzLUluZGljYXRvcglbMjBdCUJPT0xFQU4JT1BUSU9OQUwsCisJZXBzLVN1YnNjcmlwdGlvbkRhdGEJWzMxXQlFUFMtU3Vic2NyaXB0aW9uRGF0YQlPUFRJT05BTCwKKwljc2ctU3Vic2NyaXB0aW9uRGF0YUxpc3QJWzMyXSBDU0ctU3Vic2NyaXB0aW9uRGF0YUxpc3QJT1BUSU9OQUwgfQorCS0tIElmIHRoZSBOZXR3b3JrIEFjY2VzcyBNb2RlIHBhcmFtZXRlciBpcyBzZW50LCBpdCBzaGFsbCBiZSBwcmVzZW50IG9ubHkgaW4gCisJLS0gdGhlIGZpcnN0IHNlcXVlbmNlIGlmIHNlcW1lbnRhdGlvbiBpcyB1c2VkCisKK0NTRy1TdWJzY3JpcHRpb25EYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uNTApIE9GCisJCQkJQ1NHLVN1YnNjcmlwdGlvbkRhdGEKKworQ1NHLVN1YnNjcmlwdGlvbkRhdGEgOjo9IFNFUVVFTkNFIHsKKwljc2ctSWQJIAkJQ1NHLUlkLAorCWV4cGlyYXRpb25EYXRlCQlUaW1lCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4ufQorCitDU0ctSWQgOjo9IEJJVCBTVFJJTkcgKFNJWkUgKDI3KSkKKwktLSBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMy4wMDMgWzE3XS4KKworVGltZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBJRVRGIFJGQyAzNTg4IFsxMzldCisKKworRVBTLVN1YnNjcmlwdGlvbkRhdGEgOjo9IFNFUVVFTkNFIHsKKwlhcG4tb2ktUmVwbGFjZW1lbnQJWzBdCUFQTi1PSS1SZXBsYWNlbWVudAlPUFRJT05BTCwKKwlyZnNwLWlkCQlbMl0JUkZTUC1JRAkJT1BUSU9OQUwsCisJYW1icgkJCVszXQlBTUJSCQlPUFRJT05BTCwKKwlhcG4tQ29uZmlndXJhdGlvblByb2ZpbGUJWzRdCUFQTi1Db25maWd1cmF0aW9uUHJvZmlsZQlPUFRJT05BTCwKKwlzdG4tc3IJCVs2XQlJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs1XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworQVBOLU9JLVJlcGxhY2VtZW50IDo6PSAgT0NURVQgU1RSSU5HIChTSVpFICg5Li4xMDApKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYXMgQVBOIE9wZXJhdG9yIElkZW50aWZpZXIgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10gCisKK1JGU1AtSUQgOjo9ICBJTlRFR0VSICgxLi4yNTYpCisKK0FQTi1Db25maWd1cmF0aW9uUHJvZmlsZSA6Oj0gU0VRVUVOQ0UgeworCWRlZmF1bHRDb250ZXh0CUNvbnRleHRJZCwKKwljb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQJTlVMTAkJCU9QVElPTkFMLAorCQktLSBJZiBzZWdtZW50YXRpb24gaXMgdXNlZCwgY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkIG1heSBvbmx5IGJlIHByZXNlbnQgaW4gdGhlCisJCS0tIGZpcnN0IHNlZ21lbnQgb2YgQVBOLUNvbmZpZ3VyYXRpb25Qcm9maWxlLgorCWVwc0RhdGFMaXN0CVsxXQlFUFMtRGF0YUxpc3QsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworRVBTLURhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkFQTi1Db25maWd1cmF0aW9ucykgT0YKKwkJCQlBUE4tQ29uZmlndXJhdGlvbgorCisKK21heE51bU9mQVBOLUNvbmZpZ3VyYXRpb25zICBJTlRFR0VSIDo6PSA1MAorCisKK0FQTi1Db25maWd1cmF0aW9uIDo6PSBTRVFVRU5DRSB7CisJY29udGV4dElkCQlbMF0gQ29udGV4dElkLAorCXNlcnZlZFBhcnR5SVAtQWRkcmVzcwlbMV0gUERQLUFkZHJlc3MJT1BUSU9OQUwsCisJYXBuCQkJWzJdIEFQTiwKKwllcHMtcW9zLVN1YnNjcmliZWQJWzNdIEVQUy1Rb1MtU3Vic2NyaWJlZCwKKwlwZG4tZ3ctSWRlbnRpdHkJWzRdIFBETi1HVy1JZGVudGl0eQlPUFRJT05BTCwKKwlwZG4tZ3ctQWxsb2NhdGlvblR5cGUJWzVdIFBETi1HVy1BbGxvY2F0aW9uVHlwZQlPUFRJT05BTCwKKwl2cGxtbkFkZHJlc3NBbGxvd2VkCVs2XSBOVUxMCQlPUFRJT05BTCwKKwljaGFyZ2luZ0NoYXJhY3RlcmlzdGljcwlbN10gQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJT1BUSU9OQUwsCisJYW1icgkJCVs4XSBBTUJSCQlPUFRJT05BTCwKKwlzcGVjaWZpY0FQTkluZm9MaXN0CVs5XSBTcGVjaWZpY0FQTkluZm9MaXN0CU9QVElPTkFMLAlleHRlbnNpb25Db250YWluZXIJWzEwXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworRVBTLVFvUy1TdWJzY3JpYmVkIDo6PSBTRVFVRU5DRSB7CisJcW9zLUNsYXNzLUlkZW50aWZpZXIJWzBdIFFvUy1DbGFzcy1JZGVudGlmaWVyLAorCWFsbG9jYXRpb24tUmV0ZW50aW9uLVByaW9yaXR5CVsxXSBBbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eSwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitBTUJSIDo6PSBTRVFVRU5DRSB7CisJbWF4LVJlcXVlc3RlZEJhbmR3aWR0aC1VTAlbMF0gQmFuZHdpZHRoLAorCW1heC1SZXF1ZXN0ZWRCYW5kd2lkdGgtREwJWzFdIEJhbmR3aWR0aCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCisKK1NwZWNpZmljQVBOSW5mb0xpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU3BlY2lmaWNBUE5JbmZvcykgT0YKKwkJCQlTcGVjaWZpY0FQTkluZm8KKworbWF4TnVtT2ZTcGVjaWZpY0FQTkluZm9zICBJTlRFR0VSIDo6PSA1MAorCitTcGVjaWZpY0FQTkluZm8gOjo9IFNFUVVFTkNFIHsKKwlhcG4JCQlbMF0gQVBOLAorCXBkbi1ndy1JZGVudGl0eQlbMV0gUEROLUdXLUlkZW50aXR5LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0JhbmR3aWR0aCA6Oj0gSU5URUdFUiAKKwktLSBiaXRzIHBlciBzZWNvbmQKKworUW9TLUNsYXNzLUlkZW50aWZpZXIgOjo9IElOVEVHRVIgKDEuLjkpCisJLS0gdmFsdWVzIGFyZSBkZWZpbmVkIGluICAzR1BQIFRTIDI5LjIxMgorCisKKworQWxsb2NhdGlvbi1SZXRlbnRpb24tUHJpb3JpdHkgOjo9IFNFUVVFTkNFIHsKKwlwcmlvcml0eS1sZXZlbAlbMF0gSU5URUdFUiwKKwlwcmUtZW1wdGlvbi1jYXBhYmlsaXR5CVsxXSBCT09MRUFOCU9QVElPTkFMLAorCXByZS1lbXB0aW9uLXZ1bG5lcmFiaWxpdHkJWzJdIEJPT0xFQU4JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworUEROLUdXLUlkZW50aXR5IDo6PSBTRVFVRU5DRSB7CisJcGRuLWd3LWlwdjQtQWRkcmVzcwlbMF0gUERQLUFkZHJlc3MJT1BUSU9OQUwsCisJcGRuLWd3LWlwdjYtQWRkcmVzcwlbMV0gUERQLUFkZHJlc3MJT1BUSU9OQUwsCisJcGRuLWd3LW5hbWUJWzJdIEZRRE4JCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0ZRRE4gOjo9ICBPQ1RFVCBTVFJJTkcgKFNJWkUgKDkuLjEwMCkpCisKKworUEROLUdXLUFsbG9jYXRpb25UeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwlzdGF0aWMJKDApLAorCWR5bmFtaWMJKDEpfQorCisKK0FjY2Vzc1Jlc3RyaWN0aW9uRGF0YSA6Oj0gQklUIFNUUklORyB7CisJdXRyYW5Ob3RBbGxvd2VkICgwKSwKKwlnZXJhbk5vdEFsbG93ZWQgKDEpLAorCWdhbk5vdEFsbG93ZWQgICAoMiksCisJaS1oc3BhLWV2b2x1dGlvbk5vdEFsbG93ZWQgKDMpLAorCWUtdXRyYW5Ob3RBbGxvd2VkICg0KSwKKwloby10b05vbjNHUFAtQWNjZXNzTm90QWxsb3dlZCAoNSkgfSAoU0laRSAoMi4uOCkpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiAKKwktLSBhY2Nlc3MgcmVzdHJpY3Rpb24gZGF0YSByZWxhdGVkIHRvIGFuIGFjY2VzcyB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgYSBub2RlCisJLS0gc2hhbGwgYmUgaWdub3JlZAorCS0tIGJpdHMgNiB0byA3IHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisJCisKK0NTLUFsbG9jYXRpb25SZXRlbnRpb25Qcmlvcml0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGlzIGRhdGEgdHlwZSBlbmNvZGVzIGVhY2ggcHJpb3JpdHkgbGV2ZWwgZGVmaW5lZCBpbiBUUyAyMy4xMDcgYXMgdGhlIGJpbmFyeSB2YWx1ZQorCS0tIG9mIHRoZSBwcmlvcml0eSBsZXZlbC4KKworSVNULUFsZXJ0VGltZXJWYWx1ZSA6Oj0gSU5URUdFUiAoMTUuLjI1NSkKKworTENTSW5mb3JtYXRpb24gOjo9IFNFUVVFTkNFIHsKKwlnbWxjLUxpc3QJWzBdCUdNTEMtTGlzdAlPUFRJT05BTCwKKwlsY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QJWzFdCUxDUy1Qcml2YWN5RXhjZXB0aW9uTGlzdAlPUFRJT05BTCwKKwltb2xyLUxpc3QJCVsyXQlNT0xSLUxpc3QJT1BUSU9OQUwsCisJLi4uLAorCWFkZC1sY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QJWzNdCUxDUy1Qcml2YWN5RXhjZXB0aW9uTGlzdAlPUFRJT05BTCB9CisJLS0gYWRkLWxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdCBtYXkgYmUgc2VudCBvbmx5IGlmIGxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdCBpcworCS0tIHByZXNlbnQgYW5kIGNvbnRhaW5zIGZvdXIgaW5zdGFuY2VzIG9mIExDUy1Qcml2YWN5Q2xhc3MuIElmIHRoZSBtZW50aW9uZWQgY29uZGl0aW9uCisJLS0gaXMgbm90IHNhdGlzZmllZCB0aGUgcmVjZWl2aW5nIG5vZGUgc2hhbGwgZGlzY2FyZCBhZGQtbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0LgorCS0tIElmIGFuIExDUy1Qcml2YWN5Q2xhc3MgaXMgcmVjZWl2ZWQgYm90aCBpbiBsY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgYW5kIGluCisJLS0gYWRkLWxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdCB3aXRoIHRoZSBzYW1lIFNTLUNvZGUsIHRoZW4gdGhlIGVycm9yIHVuZXhwZWN0ZWQgCisJLS0gZGF0YSB2YWx1ZSBzaGFsbCBiZSByZXR1cm5lZC4KKworR01MQy1MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkdNTEMpIE9GCisJCQkJSVNETi1BZGRyZXNzU3RyaW5nCisJLS0gaWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIHRoZSBjb21wbGV0ZSBHTUxDLUxpc3Qgc2hhbGwgYmUgc2VudCBpbiBvbmUgc2VnbWVudAorCittYXhOdW1PZkdNTEMgIElOVEVHRVIgOjo9IDUKKworTmV0d29ya0FjY2Vzc01vZGUgOjo9IEVOVU1FUkFURUQgeworCXBhY2tldEFuZENpcmN1aXQJKDApLAorCW9ubHlDaXJjdWl0CQkoMSksCisJb25seVBhY2tldAkJKDIpLAorCS4uLn0KKwktLSBpZiB1bmtub3duIHZhbHVlcyBhcmUgcmVjZWl2ZWQgaW4gTmV0d29ya0FjY2Vzc01vZGUKKwktLSB0aGV5IHNoYWxsIGJlIGRpc2NhcmRlZC4KKworR1BSU0RhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlBEUC1Db250ZXh0cykgT0YKKwkJCQlQRFAtQ29udGV4dAorCittYXhOdW1PZlBEUC1Db250ZXh0cyAgSU5URUdFUiA6Oj0gNTAKKworUERQLUNvbnRleHQgOjo9IFNFUVVFTkNFIHsKKwlwZHAtQ29udGV4dElkCUNvbnRleHRJZCwKKwlwZHAtVHlwZQkJWzE2XSBQRFAtVHlwZSwKKwlwZHAtQWRkcmVzcwlbMTddIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCXFvcy1TdWJzY3JpYmVkCVsxOF0gUW9TLVN1YnNjcmliZWQsCisJdnBsbW5BZGRyZXNzQWxsb3dlZAlbMTldIE5VTEwJT1BUSU9OQUwsCisJYXBuCQkJWzIwXSBBUE4sCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJZXh0LVFvUy1TdWJzY3JpYmVkCVswXSBFeHQtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsIAorCXBkcC1DaGFyZ2luZ0NoYXJhY3RlcmlzdGljcwlbMV0gQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJT1BUSU9OQUwsCisJZXh0Mi1Rb1MtU3Vic2NyaWJlZAlbMl0gRXh0Mi1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwktLSBleHQyLVFvUy1TdWJzY3JpYmVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgZXh0LVFvUy1TdWJzY3JpYmVkIGlzIHByZXNlbnQuCisJZXh0My1Rb1MtU3Vic2NyaWJlZAlbM10gRXh0My1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTAorCS0tIGV4dDMtUW9TLVN1YnNjcmliZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBleHQyLVFvUy1TdWJzY3JpYmVkIGlzIHByZXNlbnQuCisJIH0KKworQ29udGV4dElkIDo6PSBJTlRFR0VSICgxLi5tYXhOdW1PZlBEUC1Db250ZXh0cykKKworR1BSU1N1YnNjcmlwdGlvbkRhdGEgOjo9IFNFUVVFTkNFIHsKKwljb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQJTlVMTAkJCU9QVElPTkFMLAorCQktLSBJZiBzZWdtZW50YXRpb24gaXMgdXNlZCwgY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkIG1heSBvbmx5IGJlIHByZXNlbnQgaW4gdGhlCisJCS0tIGZpcnN0IHNlZ21lbnQgb2YgR1BSU1N1YnNjcmlwdGlvbkRhdGEuCisJZ3Byc0RhdGFMaXN0CVsxXQlHUFJTRGF0YUxpc3QsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworU0dTTi1DQU1FTC1TdWJzY3JpcHRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJZ3Bycy1DU0kJCVswXQlHUFJTLUNTSQlPUFRJT05BTCwKKwltby1zbXMtQ1NJCVsxXQlTTVMtQ1NJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwltdC1zbXMtQ1NJCVszXQlTTVMtQ1NJCU9QVElPTkFMLAorCW10LXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlbNF0JTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCW1nLWNzaQkJWzVdCU1HLUNTSQlPUFRJT05BTAorCX0KKworR1BSUy1DU0kgOjo9IFNFUVVFTkNFIHsKKwlncHJzLUNhbWVsVERQRGF0YUxpc3QJWzBdIEdQUlMtQ2FtZWxURFBEYXRhTGlzdAlPUFRJT05BTCwKKwljYW1lbENhcGFiaWxpdHlIYW5kbGluZwlbMV0gQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzNdCU5VTEwJCU9QVElPTkFMLAorCWNzaS1BY3RpdmUJWzRdCU5VTEwJCU9QVElPTkFMLAorCS4uLn0KKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gR1BSUy1DU0kgaXMgc2VudCB0byBTR1NOLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLiAKKy0tCUdQUlMtQ2FtZWxURFBEYXRhIGFuZCAgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgc2hhbGwgYmUgcHJlc2VudCBpbiAKKy0tCXRoZSBHUFJTLUNTSSBzZXF1ZW5jZS4KKy0tCUlmIEdQUlMtQ1NJIGlzIHNlZ21lbnRlZCwgZ3Bycy1DYW1lbFREUERhdGFMaXN0IGFuZCBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSAKKy0tCXByZXNlbnQgaW4gdGhlIGZpcnN0IHNlZ21lbnQKKworR1BSUy1DYW1lbFREUERhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlHUFJTLUNhbWVsVERQRGF0YQorLS0JR1BSUy1DYW1lbFREUERhdGFMaXN0IHNoYWxsIG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YKKy0tCUdQUlMtQ2FtZWxURFBEYXRhIGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWUgZm9yIGdwcnMtVHJpZ2dlckRldGVjdGlvblBvaW50LgorCitHUFJTLUNhbWVsVERQRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWdwcnMtVHJpZ2dlckRldGVjdGlvblBvaW50CVswXSBHUFJTLVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKKwlzZXJ2aWNlS2V5CVsxXSBTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVsyXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdFNlc3Npb25IYW5kbGluZwlbM10gRGVmYXVsdEdQUlMtSGFuZGxpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uCisJfQorCitEZWZhdWx0R1BSUy1IYW5kbGluZyA6Oj0gRU5VTUVSQVRFRCB7CisJY29udGludWVUcmFuc2FjdGlvbiAoMCkgLAorCXJlbGVhc2VUcmFuc2FjdGlvbiAoMSkgLAorCS4uLn0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgaW4gcmFuZ2UgMi0zMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJjb250aW51ZVRyYW5zYWN0aW9uIgorLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyBncmVhdGVyIHRoYW4gMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAicmVsZWFzZVRyYW5zYWN0aW9uIgorCitHUFJTLVRyaWdnZXJEZXRlY3Rpb25Qb2ludCA6Oj0gRU5VTUVSQVRFRCB7CisJYXR0YWNoIAkJCSgxKSwKKwlhdHRhY2hDaGFuZ2VPZlBvc2l0aW9uIAkJKDIpLAorCXBkcC1Db250ZXh0RXN0YWJsaXNobWVudCAJCSgxMSksCisJcGRwLUNvbnRleHRFc3RhYmxpc2htZW50QWNrbm93bGVkZ2VtZW50CSgxMiksCisJcGRwLUNvbnRleHRDaGFuZ2VPZlBvc2l0aW9uIAkJKDE0KSwKKwkuLi4gfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gRm9yIEdQUlMtQ2FtZWxURFBEYXRhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55CistLSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSB3aG9sZSAKKy0tIEdQUlMtQ2FtZWxURFBEYXRhc2VxdWVuY2UuCisKK0FQTiA6Oj0gIE9DVEVUIFNUUklORyAoU0laRSAoMi4uNjMpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10gCisKK1BEUC1UeXBlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjkuMDYwIFsxMDVdCisKK1BEUC1BZGRyZXNzIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjE2KSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI5LjA2MCBbMTA1XQorCisJLS0gVGhlIHBvc3NpYmxlIHNpemUgdmFsdWVzIGFyZToKKwktLSAxLTcgb2N0ZXRzICBYLjI1IGFkZHJlc3MgdHlwZQorCS0tICA0ICBvY3RldHMgIElQdjQgYWRkcmVzcyB0eXBlCisJLS0gMTYgIG9jdGV0cyAgSXB2NiBhZGRyZXNzIHR5cGUKKworUW9TLVN1YnNjcmliZWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyNC4wMDggWzM1XSBRdWFsaXR5IG9mIFNlcnZpY2UgT2N0ZXRzIAorCS0tIDMtNS4KKworRXh0LVFvUy1TdWJzY3JpYmVkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjkpKQorCS0tIE9DVEVUIDE6IAorCS0tICBBbGxvY2F0aW9uL1JldGVudGlvbiBQcmlvcml0eSAoVGhpcyBvY3RldCBlbmNvZGVzIGVhY2ggcHJpb3JpdHkgbGV2ZWwgZGVmaW5lZCBpbgorCS0tICAgICAyMy4xMDcgYXMgdGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgcHJpb3JpdHkgbGV2ZWwsIGRlY2xhcmF0aW9uIGluIDI5LjA2MCkKKwktLSBPY3RldHMgMi05IGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XSBRdWFsaXR5IG9mIFNlcnZpY2UgT2N0ZXRzIAorCS0tIDYtMTMuCisKK0V4dDItUW9TLVN1YnNjcmliZWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uMykpCisJLS0gT2N0ZXRzIDEtMyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0cyAxNC0xNi4KKwktLSBJZiBRdWFsaXR5IG9mIFNlcnZpY2UgaW5mb3JtYXRpb24gaXMgc3RydWN0dXJlZCB3aXRoIDE0IG9jdGV0IGxlbmd0aCwgdGhlbgorCS0tIE9jdGV0IDEgaXMgY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0IDE0LgorCitFeHQzLVFvUy1TdWJzY3JpYmVkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjIpKQorCS0tIE9jdGV0cyAxLTIgYXJlIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldHMgMTctMTguCisKK0NoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMzIuMjE1LgorCitMU0FPbmx5QWNjZXNzSW5kaWNhdG9yIDo6PSBFTlVNRVJBVEVEIHsKKwlhY2Nlc3NPdXRzaWRlTFNBc0FsbG93ZWQgICgwKSwKKwlhY2Nlc3NPdXRzaWRlTFNBc1Jlc3RyaWN0ZWQgKDEpfQorCitMU0FEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZMU0FzKSBPRgorCQkJCUxTQURhdGEKKworbWF4TnVtT2ZMU0FzICBJTlRFR0VSIDo6PSAyMAorCitMU0FEYXRhIDo6PSBTRVFVRU5DRSB7CisJbHNhSWRlbnRpdHkJWzBdIExTQUlkZW50aXR5LAorCWxzYUF0dHJpYnV0ZXMJWzFdIExTQUF0dHJpYnV0ZXMsCisJbHNhQWN0aXZlTW9kZUluZGljYXRvcglbMl0gTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitMU0FJbmZvcm1hdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZAlOVUxMCQkJT1BUSU9OQUwsCisKKwkJLS0gSWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIGNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZCBtYXkgb25seSBiZSBwcmVzZW50IGluIHRoZQorCQktLSBmaXJzdCBzZWdtZW50LgorCWxzYU9ubHlBY2Nlc3NJbmRpY2F0b3IJWzFdCUxTQU9ubHlBY2Nlc3NJbmRpY2F0b3IJT1BUSU9OQUwsCisJbHNhRGF0YUxpc3QJWzJdCUxTQURhdGFMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTFNBSWRlbnRpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XQorCitMU0FBdHRyaWJ1dGVzIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgNDguMDA4IFs0OV0KKworU3Vic2NyaWJlckRhdGEgOjo9IFNFUVVFTkNFIHsKKwltc2lzZG4JCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJY2F0ZWdvcnkJCVsyXSBDYXRlZ29yeQlPUFRJT05BTCwKKwlzdWJzY3JpYmVyU3RhdHVzCVszXSBTdWJzY3JpYmVyU3RhdHVzCU9QVElPTkFMLAorCWJlYXJlclNlcnZpY2VMaXN0CVs0XSBCZWFyZXJTZXJ2aWNlTGlzdAlPUFRJT05BTCwKKwktLSBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciByZWNlcHRpb24gb2YgdW5zdXBwb3J0ZWQgLyBub3QgYWxsb2NhdGVkCisJLS0gYmVhcmVyU2VydmljZUNvZGVzIGlzIGRlZmluZWQgaW4gc2VjdGlvbiA4LjguMQorCXRlbGVzZXJ2aWNlTGlzdAlbNl0gVGVsZXNlcnZpY2VMaXN0CU9QVElPTkFMLAorCS0tIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHJlY2VwdGlvbiBvZiB1bnN1cHBvcnRlZCAvIG5vdCBhbGxvY2F0ZWQKKwktLSB0ZWxlc2VydmljZUNvZGVzIGlzIGRlZmluZWQgaW4gc2VjdGlvbiA4LjguMQorCXByb3Zpc2lvbmVkU1MJWzddIEV4dC1TUy1JbmZvTGlzdAlPUFRJT05BTCwKKwlvZGItRGF0YQkJWzhdIE9EQi1EYXRhCU9QVElPTkFMLAorCXJvYW1pbmdSZXN0cmljdGlvbkR1ZVRvVW5zdXBwb3J0ZWRGZWF0dXJlICBbOV0gTlVMTAlPUFRJT05BTCwKKwlyZWdpb25hbFN1YnNjcmlwdGlvbkRhdGEJWzEwXSBab25lQ29kZUxpc3QJT1BUSU9OQUwsCisJdmJzU3Vic2NyaXB0aW9uRGF0YQlbMTFdIFZCU0RhdGFMaXN0CU9QVElPTkFMLAorCXZnY3NTdWJzY3JpcHRpb25EYXRhCVsxMl0gVkdDU0RhdGFMaXN0CU9QVElPTkFMLAorCXZsckNhbWVsU3Vic2NyaXB0aW9uSW5mbwlbMTNdIFZsckNhbWVsU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTAorCX0KKworQ2F0ZWdvcnkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIElUVS1UIFJlYyBRLjc2My4KKworU3Vic2NyaWJlclN0YXR1cyA6Oj0gRU5VTUVSQVRFRCB7CisJc2VydmljZUdyYW50ZWQgICgwKSwKKwlvcGVyYXRvckRldGVybWluZWRCYXJyaW5nICAoMSl9CisKK0JlYXJlclNlcnZpY2VMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkJlYXJlclNlcnZpY2VzKSBPRgorCQkJCUV4dC1CZWFyZXJTZXJ2aWNlQ29kZQorCittYXhOdW1PZkJlYXJlclNlcnZpY2VzICBJTlRFR0VSIDo6PSA1MAorCitUZWxlc2VydmljZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mVGVsZXNlcnZpY2VzKSBPRgorCQkJCUV4dC1UZWxlc2VydmljZUNvZGUKKworbWF4TnVtT2ZUZWxlc2VydmljZXMgIElOVEVHRVIgOjo9IDIwCisKK09EQi1EYXRhIDo6PSBTRVFVRU5DRSB7CisJb2RiLUdlbmVyYWxEYXRhCU9EQi1HZW5lcmFsRGF0YSwKKwlvZGItSFBMTU4tRGF0YQlPREItSFBMTU4tRGF0YQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworT0RCLUdlbmVyYWxEYXRhIDo6PSBCSVQgU1RSSU5HIHsKKwlhbGxPRy1DYWxsc0JhcnJlZCAgKDApLAorCWludGVybmF0aW9uYWxPR0NhbGxzQmFycmVkICAoMSksCisJaW50ZXJuYXRpb25hbE9HQ2FsbHNOb3RUb0hQTE1OLUNvdW50cnlCYXJyZWQgICgyKSwKKwlpbnRlcnpvbmFsT0dDYWxsc0JhcnJlZCAoNiksCisJaW50ZXJ6b25hbE9HQ2FsbHNOb3RUb0hQTE1OLUNvdW50cnlCYXJyZWQgKDcpLAorCWludGVyem9uYWxPR0NhbGxzQW5kSW50ZXJuYXRpb25hbE9HQ2FsbHNOb3RUb0hQTE1OLUNvdW50cnlCYXJyZWQgKDgpLAorCXByZW1pdW1SYXRlSW5mb3JtYXRpb25PR0NhbGxzQmFycmVkICAoMyksCisJcHJlbWl1bVJhdGVFbnRlcnRhaW5lbWVudE9HQ2FsbHNCYXJyZWQgICg0KSwKKwlzcy1BY2Nlc3NCYXJyZWQgICg1KSwKKwlhbGxFQ1QtQmFycmVkICg5KSwKKwljaGFyZ2VhYmxlRUNULUJhcnJlZCAoMTApLAorCWludGVybmF0aW9uYWxFQ1QtQmFycmVkICgxMSksCisJaW50ZXJ6b25hbEVDVC1CYXJyZWQgKDEyKSwKKwlkb3VibHlDaGFyZ2VhYmxlRUNULUJhcnJlZCAoMTMpLAorCW11bHRpcGxlRUNULUJhcnJlZCAoMTQpLAorCWFsbFBhY2tldE9yaWVudGVkU2VydmljZXNCYXJyZWQgKDE1KSwKKwlyb2FtZXJBY2Nlc3NUb0hQTE1OLUFQLUJhcnJlZCAgKDE2KSwKKwlyb2FtZXJBY2Nlc3NUb1ZQTE1OLUFQLUJhcnJlZCAgKDE3KSwKKwlyb2FtaW5nT3V0c2lkZVBMTU5PRy1DYWxsc0JhcnJlZCAgKDE4KSwKKwlhbGxJQy1DYWxsc0JhcnJlZCAgKDE5KSwKKwlyb2FtaW5nT3V0c2lkZVBMTU5JQy1DYWxsc0JhcnJlZCAgKDIwKSwKKwlyb2FtaW5nT3V0c2lkZVBMTU5JQ291bnRyeUlDLUNhbGxzQmFycmVkICAoMjEpLAorCXJvYW1pbmdPdXRzaWRlUExNTi1CYXJyZWQgICgyMiksCisJcm9hbWluZ091dHNpZGVQTE1OLUNvdW50cnlCYXJyZWQgICgyMyksCisJcmVnaXN0cmF0aW9uQWxsQ0YtQmFycmVkICAoMjQpLAorCXJlZ2lzdHJhdGlvbkNGTm90VG9IUExNTi1CYXJyZWQgICgyNSksCisJcmVnaXN0cmF0aW9uSW50ZXJ6b25hbENGLUJhcnJlZCAgKDI2KSwKKwlyZWdpc3RyYXRpb25JbnRlcnpvbmFsQ0ZOb3RUb0hQTE1OLUJhcnJlZCAgKDI3KSwKKwlyZWdpc3RyYXRpb25JbnRlcm5hdGlvbmFsQ0YtQmFycmVkICAoMjgpfSAoU0laRSAoMTUuLjMyKSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6IHJlY2VwdGlvbiBvZiB1bmtub3duIGJpdCBhc3NpZ25tZW50cyBpbiB0aGUKKwktLSBPREItR2VuZXJhbERhdGEgdHlwZSBzaGFsbCBiZSB0cmVhdGVkIGxpa2UgdW5zdXBwb3J0ZWQgT0RCLUdlbmVyYWxEYXRhCisJLS0gV2hlbiB0aGUgT0RCLUdlbmVyYWxEYXRhIHR5cGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBITFIgZm9yIGEgZ2l2ZW4gc3Vic2NyaWJlciwgCisJLS0gaW4gTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWQgb3BlcmF0aW9uIHNlbnQgdG93YXJkIHRoZSBnc21TQ0YgCisJLS0gYWxsIGJpdHMgc2hhbGwgYmUgc2V0IHRvICJPIi4KKworT0RCLUhQTE1OLURhdGEgOjo9IEJJVCBTVFJJTkcgeworCXBsbW4tU3BlY2lmaWNCYXJyaW5nVHlwZTEgICgwKSwKKwlwbG1uLVNwZWNpZmljQmFycmluZ1R5cGUyICAoMSksCisJcGxtbi1TcGVjaWZpY0JhcnJpbmdUeXBlMyAgKDIpLAorCXBsbW4tU3BlY2lmaWNCYXJyaW5nVHlwZTQgICgzKX0gKFNJWkUgKDQuLjMyKSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6IHJlY2VwdGlvbiBvZiB1bmtub3duIGJpdCBhc3NpZ25tZW50cyBpbiB0aGUKKwktLSBPREItSFBMTU4tRGF0YSB0eXBlIHNoYWxsIGJlIHRyZWF0ZWQgbGlrZSB1bnN1cHBvcnRlZCBPREItSFBMTU4tRGF0YSAKKwktLSBXaGVuIHRoZSBPREItSFBMTU4tRGF0YSB0eXBlIGlzIHJlbW92ZWQgZnJvbSB0aGUgSExSIGZvciBhIGdpdmVuIHN1YnNjcmliZXIsIAorCS0tIGluIE5vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkIG9wZXJhdGlvbiBzZW50IHRvd2FyZCB0aGUgZ3NtU0NGCisJLS0gYWxsIGJpdHMgc2hhbGwgYmUgc2V0IHRvICJPIi4KKworRXh0LVNTLUluZm9MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlNTKSBPRgorCQkJCUV4dC1TUy1JbmZvCisKK0V4dC1TUy1JbmZvIDo6PSBDSE9JQ0UgeworCWZvcndhcmRpbmdJbmZvCVswXSBFeHQtRm9yd0luZm8sCisJY2FsbEJhcnJpbmdJbmZvCVsxXSBFeHQtQ2FsbEJhckluZm8sCisJY3VnLUluZm8JCVsyXSBDVUctSW5mbywKKwlzcy1EYXRhCQlbM10gRXh0LVNTLURhdGEsCisJZW1scHAtSW5mbwlbNF0gRU1MUFAtSW5mb30KKworRXh0LUZvcndJbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJRXh0LUZvcndGZWF0dXJlTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0V4dC1Gb3J3RmVhdHVyZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlFeHQtRm9yd0ZlYXR1cmUKKworRXh0LUZvcndGZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJYmFzaWNTZXJ2aWNlCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzRdIEV4dC1TUy1TdGF0dXMsCisJZm9yd2FyZGVkVG9OdW1iZXIJWzVdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwktLSBXaGVuIHRoaXMgZGF0YSB0eXBlIGlzIHNlbnQgZnJvbSBhbiBITFIgd2hpY2ggc3VwcG9ydHMgQ0FNRUwgUGhhc2UgMgorCS0tIHRvIGEgVkxSIHRoYXQgc3VwcG9ydHMgQ0FNRUwgUGhhc2UgMiB0aGUgVkxSIHNoYWxsIG5vdCBjaGVjayB0aGUKKwktLSBmb3JtYXQgb2YgdGhlIG51bWJlcgorCWZvcndhcmRlZFRvU3ViYWRkcmVzcwlbOF0gSVNETi1TdWJhZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRpbmdPcHRpb25zCVs2XSBFeHQtRm9yd09wdGlvbnMJT1BUSU9OQUwsCisJbm9SZXBseUNvbmRpdGlvblRpbWUJWzddIEV4dC1Ob1JlcENvbmRUaW1lCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbOV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlsb25nRm9yd2FyZGVkVG9OdW1iZXIJWzEwXSBGVE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCB9CisKK0V4dC1Gb3J3T3B0aW9ucyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi41KSkKKworCS0tIE9DVEVUIDE6CisKKwktLSAgYml0IDg6IG5vdGlmaWNhdGlvbiB0byBmb3J3YXJkaW5nIHBhcnR5CisJLS0JMCAgbm8gbm90aWZpY2F0aW9uCisJLS0JMSAgbm90aWZpY2F0aW9uCisKKwktLSAgYml0IDc6IHJlZGlyZWN0aW5nIHByZXNlbnRhdGlvbgorCS0tCTAgbm8gcHJlc2VudGF0aW9uICAKKwktLQkxICBwcmVzZW50YXRpb24KKworCS0tICBiaXQgNjogbm90aWZpY2F0aW9uIHRvIGNhbGxpbmcgcGFydHkKKwktLQkwICBubyBub3RpZmljYXRpb24KKwktLQkxICBub3RpZmljYXRpb24KKworCS0tICBiaXQgNTogMCAodW51c2VkKQorCisJLS0gIGJpdHMgNDM6IGZvcndhcmRpbmcgcmVhc29uCisJLS0JMDAgIG1zIG5vdCByZWFjaGFibGUKKwktLQkwMSAgbXMgYnVzeQorCS0tCTEwICBubyByZXBseQorCS0tCTExICB1bmNvbmRpdGlvbmFsCisKKwktLSBiaXRzIDIxOiAwMCAodW51c2VkKQorCisJLS0gT0NURVRTIDItNTogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIFRoZXkgc2hhbGwgYmUgZGlzY2FyZGVkIGlmCisJLS0gcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kLgorCitFeHQtTm9SZXBDb25kVGltZSA6Oj0gSU5URUdFUiAoMS4uMTAwKQorCS0tIE9ubHkgdmFsdWVzIDUtMzAgYXJlIHVzZWQuCisJLS0gVmFsdWVzIGluIHRoZSByYW5nZXMgMS00IGFuZCAzMS0xMDAgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisJLS0gSWYgcmVjZWl2ZWQ6CisJLS0JCXZhbHVlcyAxLTQgc2hhbGwgYmUgbWFwcGVkIG9uIHRvIHZhbHVlIDUKKwktLQkJdmFsdWVzIDMxLTEwMCBzaGFsbCBiZSBtYXBwZWQgb24gdG8gdmFsdWUgMzAKKworRXh0LUNhbGxCYXJJbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwljYWxsQmFycmluZ0ZlYXR1cmVMaXN0CUV4dC1DYWxsQmFyRmVhdHVyZUxpc3QsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0V4dC1DYWxsQmFyRmVhdHVyZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlFeHQtQ2FsbEJhcnJpbmdGZWF0dXJlCisKK0V4dC1DYWxsQmFycmluZ0ZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKKwliYXNpY1NlcnZpY2UJRXh0LUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbNF0gRXh0LVNTLVN0YXR1cywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ1VHLUluZm8gOjo9IFNFUVVFTkNFIHsKKwljdWctU3Vic2NyaXB0aW9uTGlzdAlDVUctU3Vic2NyaXB0aW9uTGlzdCwKKwljdWctRmVhdHVyZUxpc3QJQ1VHLUZlYXR1cmVMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ1VHLVN1YnNjcmlwdGlvbkxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDAuLm1heE51bU9mQ1VHKSBPRgorCQkJCUNVRy1TdWJzY3JpcHRpb24KKworQ1VHLVN1YnNjcmlwdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWN1Zy1JbmRleAlDVUctSW5kZXgsCisJY3VnLUludGVybG9jawlDVUctSW50ZXJsb2NrLAorCWludHJhQ1VHLU9wdGlvbnMJSW50cmFDVUctT3B0aW9ucywKKwliYXNpY1NlcnZpY2VHcm91cExpc3QJRXh0LUJhc2ljU2VydmljZUdyb3VwTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NVRy1JbmRleCA6Oj0gSU5URUdFUiAoMC4uMzI3NjcpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIEVUUyAzMDAgMTM4LgorCitDVUctSW50ZXJsb2NrIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQpKQorCitJbnRyYUNVRy1PcHRpb25zIDo6PSBFTlVNRVJBVEVEIHsKKwlub0NVRy1SZXN0cmljdGlvbnMgICgwKSwKKwljdWdJQy1DYWxsQmFycmVkICAoMSksCisJY3VnT0ctQ2FsbEJhcnJlZCAgKDIpfQorCittYXhOdW1PZkNVRyAgSU5URUdFUiA6Oj0gMTAKKworQ1VHLUZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJQ1VHLUZlYXR1cmUKKworRXh0LUJhc2ljU2VydmljZUdyb3VwTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUV4dC1CYXNpY1NlcnZpY2VDb2RlCisKK21heE51bU9mRXh0LUJhc2ljU2VydmljZUdyb3VwcyAgSU5URUdFUiA6Oj0gMzIKKworQ1VHLUZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKKwliYXNpY1NlcnZpY2UJRXh0LUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJcHJlZmVyZW50aWFsQ1VHLUluZGljYXRvcglDVUctSW5kZXgJT1BUSU9OQUwsCisJaW50ZXJDVUctUmVzdHJpY3Rpb25zCUludGVyQ1VHLVJlc3RyaWN0aW9ucywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworSW50ZXJDVUctUmVzdHJpY3Rpb25zIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCisJLS0gYml0cyA4NzY1NDM6IDAwMDAwMCAodW51c2VkKQorCS0tIEV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBiaXRzIDg3NjU0MyBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZAorCisJLS0gYml0cyAyMQorCS0tCTAwICBDVUcgb25seSBmYWNpbGl0aWVzCisJLS0JMDEgIENVRyB3aXRoIG91dGdvaW5nIGFjY2VzcworCS0tCTEwICBDVUcgd2l0aCBpbmNvbWluZyBhY2Nlc3MKKwktLQkxMSAgQ1VHIHdpdGggYm90aCBvdXRnb2luZyBhbmQgaW5jb21pbmcgYWNjZXNzCisKK0V4dC1TUy1EYXRhIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwlzcy1TdGF0dXMJWzRdIEV4dC1TUy1TdGF0dXMsCisJc3MtU3Vic2NyaXB0aW9uT3B0aW9uCVNTLVN1YnNjcmlwdGlvbk9wdGlvbglPUFRJT05BTCwKKwliYXNpY1NlcnZpY2VHcm91cExpc3QJRXh0LUJhc2ljU2VydmljZUdyb3VwTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0xDUy1Qcml2YWN5RXhjZXB0aW9uTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZQcml2YWN5Q2xhc3MpIE9GCisJCQkJTENTLVByaXZhY3lDbGFzcworCittYXhOdW1PZlByaXZhY3lDbGFzcyAgSU5URUdFUiA6Oj0gNAorCitMQ1MtUHJpdmFjeUNsYXNzIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwlzcy1TdGF0dXMJCUV4dC1TUy1TdGF0dXMsCisJbm90aWZpY2F0aW9uVG9NU1VzZXIJWzBdIE5vdGlmaWNhdGlvblRvTVNVc2VyCU9QVElPTkFMLAorCS0tIG5vdGlmaWNhdGlvblRvTVNVc2VyIG1heSBiZSBzZW50IG9ubHkgZm9yIFNTLWNvZGVzIGNhbGxTZXNzaW9uUmVsYXRlZAorCS0tIGFuZCBjYWxsU2Vzc2lvblVucmVsYXRlZC4gSWYgbm90IHJlY2VpdmVkIGZvciBTUy1jb2RlcyBjYWxsU2Vzc2lvblJlbGF0ZWQKKwktLSBhbmQgY2FsbFNlc3Npb25VbnJlbGF0ZWQsCisJLS0gdGhlIGRlZmF1bHQgdmFsdWVzIGFjY29yZGluZyB0byAzR1BQIFRTIDIzLjI3MSBzaGFsbCBiZSBhc3N1bWVkLgorCWV4dGVybmFsQ2xpZW50TGlzdAlbMV0gRXh0ZXJuYWxDbGllbnRMaXN0CU9QVElPTkFMLAorCS0tIGV4dGVybmFsQ2xpZW50TGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlIGNhbGxTZXNzaW9uVW5yZWxhdGVkIHRvIGEKKwktLSB2aXNpdGVkIG5vZGUgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IExDUyBSZWxlYXNlIDQgb3IgbGF0ZXIgdmVyc2lvbnMuCisJLS0gZXh0ZXJuYWxDbGllbnRMaXN0IG1heSBiZSBzZW50IG9ubHkgZm9yIFNTLWNvZGVzIGNhbGxTZXNzaW9uVW5yZWxhdGVkIGFuZAorCS0tIGNhbGxTZXNzaW9uUmVsYXRlZCB0byBhIHZpc2l0ZWQgbm9kZSB0aGF0IHN1cHBvcnRzIExDUyBSZWxlYXNlIDQgb3IgbGF0ZXIgdmVyc2lvbnMuCisJcGxtbkNsaWVudExpc3QJWzJdIFBMTU5DbGllbnRMaXN0CU9QVElPTkFMLAorCS0tIHBsbW5DbGllbnRMaXN0IG1heSBiZSBzZW50IG9ubHkgZm9yIFNTLWNvZGUgcGxtbm9wZXJhdG9yLgorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlleHQtZXh0ZXJuYWxDbGllbnRMaXN0CVs0XSBFeHQtRXh0ZXJuYWxDbGllbnRMaXN0CU9QVElPTkFMLAorCS0tIEV4dC1leHRlcm5hbENsaWVudExpc3QgbWF5IGJlIHNlbnQgb25seSBpZiB0aGUgdmlzaXRlZCBub2RlIHN1cHBvcnRzIExDUyBSZWxlYXNlIDQgb3IKKwktLSBsYXRlciB2ZXJzaW9ucywgdGhlIHVzZXIgZGlkIHNwZWNpZnkgbW9yZSB0aGFuIDUgY2xpZW50cywgYW5kIFdoaXRlIEJvb2sgU0NDUCBpcyB1c2VkLgorCXNlcnZpY2VUeXBlTGlzdAlbNV0JU2VydmljZVR5cGVMaXN0CU9QVElPTkFMCisJLS0gc2VydmljZVR5cGVMaXN0IG1heSBiZSBzZW50IG9ubHkgZm9yIFNTLWNvZGUgc2VydmljZVR5cGUgYW5kIGlmIHRoZSB2aXNpdGVkIG5vZGUKKwktLSBzdXBwb3J0cyBMQ1MgUmVsZWFzZSA1IG9yIGxhdGVyIHZlcnNpb25zLgorCS0tIAorCS0tIGlmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCB0aGUgY29tcGxldGUgTENTLVByaXZhY3lDbGFzcyBzaGFsbCBiZSBzZW50IGluIG9uZSBzZWdtZW50Cit9CisKK0V4dGVybmFsQ2xpZW50TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMC4ubWF4TnVtT2ZFeHRlcm5hbENsaWVudCkgT0YKKwkJCQlFeHRlcm5hbENsaWVudAorCittYXhOdW1PZkV4dGVybmFsQ2xpZW50ICBJTlRFR0VSIDo6PSA1CisKK1BMTU5DbGllbnRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlBMTU5DbGllbnQpIE9GCisJCQkJTENTQ2xpZW50SW50ZXJuYWxJRAorCittYXhOdW1PZlBMTU5DbGllbnQgIElOVEVHRVIgOjo9IDUKKworRXh0LUV4dGVybmFsQ2xpZW50TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZFeHQtRXh0ZXJuYWxDbGllbnQpIE9GCisJCQkJRXh0ZXJuYWxDbGllbnQKKworbWF4TnVtT2ZFeHQtRXh0ZXJuYWxDbGllbnQgIElOVEVHRVIgOjo9IDM1CisKK0V4dGVybmFsQ2xpZW50IDo6PSBTRVFVRU5DRSB7CisJY2xpZW50SWRlbnRpdHkJTENTQ2xpZW50RXh0ZXJuYWxJRCwKKwlnbWxjLVJlc3RyaWN0aW9uCVswXSBHTUxDLVJlc3RyaWN0aW9uCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvTVNVc2VyCVsxXSBOb3RpZmljYXRpb25Ub01TVXNlcglPUFRJT05BTCwKKwktLSBJZiBub3RpZmljYXRpb25Ub01TVXNlciBpcyBub3QgcmVjZWl2ZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGFjY29yZGluZyB0byAKKwktLSAzR1BQIFRTIDIzLjI3MSBzaGFsbCBiZSBhc3N1bWVkLgorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0dNTEMtUmVzdHJpY3Rpb24gOjo9IEVOVU1FUkFURUQgeworCWdtbGMtTGlzdAkJKDApLAorCWhvbWUtQ291bnRyeQkoMSkgLAorCS4uLiB9CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBBdCByZWNlcHRpb24gb2YgYW55IG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUKKy0tIEdNTEMtUmVzdHJpY3Rpb24uCisKK05vdGlmaWNhdGlvblRvTVNVc2VyIDo6PSBFTlVNRVJBVEVEIHsKKwlub3RpZnlMb2NhdGlvbkFsbG93ZWQJKDApLAorCW5vdGlmeUFuZFZlcmlmeS1Mb2NhdGlvbkFsbG93ZWRJZk5vUmVzcG9uc2UJKDEpLAorCW5vdGlmeUFuZFZlcmlmeS1Mb2NhdGlvbk5vdEFsbG93ZWRJZk5vUmVzcG9uc2UJKDIpLAorCS4uLiwKKwlsb2NhdGlvbk5vdEFsbG93ZWQgKDMpIH0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIEF0IHJlY2VwdGlvbiBvZiBhbnkgb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZQorLS0gTm90aWZpY2F0aW9uVG9NU1VzZXIuCisKK1NlcnZpY2VUeXBlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTZXJ2aWNlVHlwZSkgT0YKKwkJCQlTZXJ2aWNlVHlwZQorCittYXhOdW1PZlNlcnZpY2VUeXBlICBJTlRFR0VSIDo6PSAzMgorCitTZXJ2aWNlVHlwZSA6Oj0gU0VRVUVOQ0UgeworCXNlcnZpY2VUeXBlSWRlbnRpdHkJTENTU2VydmljZVR5cGVJRCwKKwlnbWxjLVJlc3RyaWN0aW9uCVswXSBHTUxDLVJlc3RyaWN0aW9uCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvTVNVc2VyCVsxXSBOb3RpZmljYXRpb25Ub01TVXNlcglPUFRJT05BTCwKKwktLSBJZiBub3RpZmljYXRpb25Ub01TVXNlciBpcyBub3QgcmVjZWl2ZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGFjY29yZGluZyB0byAKKwktLSAzR1BQIFRTIDIzLjI3MSBzaGFsbCBiZSBhc3N1bWVkLgorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK01PTFItTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZNT0xSLUNsYXNzKSBPRgorCQkJCU1PTFItQ2xhc3MKKworbWF4TnVtT2ZNT0xSLUNsYXNzICBJTlRFR0VSIDo6PSAzCisKK01PTFItQ2xhc3MgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCXNzLVN0YXR1cwkJRXh0LVNTLVN0YXR1cywKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1pvbmVDb2RlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2Zab25lQ29kZXMpCisJCQkJT0YgWm9uZUNvZGUKKworWm9uZUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMikpCisJLS0gaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XQorCittYXhOdW1PZlpvbmVDb2RlcyAgSU5URUdFUiA6Oj0gMTAKKworSW5zZXJ0U3Vic2NyaWJlckRhdGFSZXMgOjo9IFNFUVVFTkNFIHsKKwl0ZWxlc2VydmljZUxpc3QJWzFdIFRlbGVzZXJ2aWNlTGlzdAlPUFRJT05BTCwKKwliZWFyZXJTZXJ2aWNlTGlzdAlbMl0gQmVhcmVyU2VydmljZUxpc3QJT1BUSU9OQUwsCisJc3MtTGlzdAkJWzNdIFNTLUxpc3QJT1BUSU9OQUwsCisJb2RiLUdlbmVyYWxEYXRhCVs0XSBPREItR2VuZXJhbERhdGEJT1BUSU9OQUwsCisJcmVnaW9uYWxTdWJzY3JpcHRpb25SZXNwb25zZQlbNV0gUmVnaW9uYWxTdWJzY3JpcHRpb25SZXNwb25zZQlPUFRJT05BTCwKKwlzdXBwb3J0ZWRDYW1lbFBoYXNlcwlbNl0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs3XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlvZmZlcmVkQ2FtZWw0Q1NJcwlbOF0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkRmVhdHVyZXMJWzldIFN1cHBvcnRlZEZlYXR1cmVzCU9QVElPTkFMIH0KKworUmVnaW9uYWxTdWJzY3JpcHRpb25SZXNwb25zZSA6Oj0gRU5VTUVSQVRFRCB7CisJbmV0d29ya05vZGUtQXJlYVJlc3RyaWN0ZWQJKDApLAorCXRvb01hbnlab25lQ29kZXMJKDEpLAorCXpvbmVDb2Rlc0NvbmZsaWN0CSgyKSwKKwlyZWdpb25hbFN1YnNjTm90U3VwcG9ydGVkCSgzKX0KKworRGVsZXRlU3Vic2NyaWJlckRhdGFBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJYmFzaWNTZXJ2aWNlTGlzdAlbMV0gQmFzaWNTZXJ2aWNlTGlzdAlPUFRJT05BTCwKKwktLSBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciByZWNlcHRpb24gb2YgdW5zdXBwb3J0ZWQvbm90IGFsbG9jYXRlZAorCS0tIGJhc2ljU2VydmljZUNvZGVzIGlzIGRlZmluZWQgaW4gc2VjdGlvbiA2LjguMgorCXNzLUxpc3QJCVsyXSBTUy1MaXN0CU9QVElPTkFMLAorCXJvYW1pbmdSZXN0cmljdGlvbkR1ZVRvVW5zdXBwb3J0ZWRGZWF0dXJlIFs0XSBOVUxMCU9QVElPTkFMLAorCXJlZ2lvbmFsU3Vic2NyaXB0aW9uSWRlbnRpZmllcglbNV0gWm9uZUNvZGUJT1BUSU9OQUwsCisJdmJzR3JvdXBJbmRpY2F0aW9uCVs3XSBOVUxMCQlPUFRJT05BTCwKKwl2Z2NzR3JvdXBJbmRpY2F0aW9uCVs4XSBOVUxMCSAJT1BUSU9OQUwsCisJY2FtZWxTdWJzY3JpcHRpb25JbmZvV2l0aGRyYXcJWzldIE5VTEwJIAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzZdIEV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4uLAorCWdwcnNTdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcJWzEwXSBHUFJTU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3CU9QVElPTkFMLAorCXJvYW1pbmdSZXN0cmljdGVkSW5TZ3NuRHVlVG9VbnN1cHBwb3J0ZWRGZWF0dXJlIFsxMV0gTlVMTAlPUFRJT05BTCwKKwlsc2FJbmZvcm1hdGlvbldpdGhkcmF3CVsxMl0gTFNBSW5mb3JtYXRpb25XaXRoZHJhdwlPUFRJT05BTCwKKwlnbWxjLUxpc3RXaXRoZHJhdyAJWzEzXQlOVUxMCQlPUFRJT05BTCwKKwlpc3RJbmZvcm1hdGlvbldpdGhkcmF3CVsxNF0gTlVMTAkJT1BUSU9OQUwsCisJc3BlY2lmaWNDU0ktV2l0aGRyYXcJWzE1XSBTcGVjaWZpY0NTSS1XaXRoZHJhdwlPUFRJT05BTCwKKwljaGFyZ2luZ0NoYXJhY3RlcmlzdGljc1dpdGhkcmF3CVsxNl0gTlVMTAkJT1BUSU9OQUwsCisJc3RuLXNyV2l0aGRyYXcJWzE3XSBOVUxMCQlPUFRJT05BTCwKKwllcHNTdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcJWzE4XSBFUFMtU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3CU9QVElPTkFMLAorCWFwbi1vaS1yZXBsYWNlbWVudFdpdGhkcmF3CVsxOV0gTlVMTAkJT1BUSU9OQUwsCisJY3NnLVN1YnNjcmlwdGlvbkRlbGV0ZWQJWzIwXQlOVUxMCQlPUFRJT05BTCB9CisKK1NwZWNpZmljQ1NJLVdpdGhkcmF3IDo6PSBCSVQgU1RSSU5HIHsKKwlvLWNzaSAoMCksCisJc3MtY3NpICgxKSwKKwl0aWYtY3NpICgyKSwKKwlkLWNzaSAoMyksCisJdnQtY3NpICg0KSwKKwltby1zbXMtY3NpICg1KSwKKwltLWNzaSAoNiksCisJZ3Bycy1jc2kgKDcpLAorCXQtY3NpICg4KSwKKwltdC1zbXMtY3NpICg5KSwKKwltZy1jc2kgKDEwKSwKKwlvLUlNLUNTSSAoMTEpLCAKKwlkLUlNLUNTSSAoMTIpLAorCXZ0LUlNLUNTSSAoMTMpIH0gKFNJWkUoOC4uMzIpKSAKKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIGJpdHMgMTEgdG8gMzEgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBieSBhIG5vbi1JUCBNdWx0aW1lZGlhIENvcmUgTmV0d29yayBlbnRpdHkuCistLSBiaXRzIDAtMTAgYW5kIDE0LTMxIHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYnkgYW4gSVAgTXVsdGltZWRpYSBDb3JlIE5ldHdvcmsgZW50aXR5LgorLS0gYml0cyAxMS0xMyBhcmUgb25seSBhcHBsaWNhYmxlIGluIGFuIElQIE11bHRpbWVkaWEgQ29yZSBOZXR3b3JrLgorLS0gQml0IDggYW5kIGJpdHMgMTEtMTMgYXJlIG9ubHkgYXBwbGljYWJsZSBmb3IgdGhlIE5vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkIG9wZXJhdGlvbi4KKworR1BSU1N1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdyA6Oj0gQ0hPSUNFIHsKKwlhbGxHUFJTRGF0YQlOVUxMLAorCWNvbnRleHRJZExpc3QJQ29udGV4dElkTGlzdH0KKworRVBTLVN1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdyA6Oj0gQ0hPSUNFIHsKKwlhbGxFUFMtRGF0YQlOVUxMLAorCWNvbnRleHRJZExpc3QJQ29udGV4dElkTGlzdH0KKworQ29udGV4dElkTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZQRFAtQ29udGV4dHMpIE9GCisJCQkJQ29udGV4dElkCisKK0xTQUluZm9ybWF0aW9uV2l0aGRyYXcgOjo9IENIT0lDRSB7CisJYWxsTFNBRGF0YQlOVUxMLAorCWxzYUlkZW50aXR5TGlzdAlMU0FJZGVudGl0eUxpc3QgfQorCitMU0FJZGVudGl0eUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTFNBcykgT0YKKwkJCQlMU0FJZGVudGl0eQorCitCYXNpY1NlcnZpY2VMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkJhc2ljU2VydmljZXMpIE9GCisJCQkJRXh0LUJhc2ljU2VydmljZUNvZGUKKworbWF4TnVtT2ZCYXNpY1NlcnZpY2VzICBJTlRFR0VSIDo6PSA3MAorCitEZWxldGVTdWJzY3JpYmVyRGF0YVJlcyA6Oj0gU0VRVUVOQ0UgeworCXJlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UJWzBdIFJlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1ZsckNhbWVsU3Vic2NyaXB0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCW8tQ1NJCQlbMF0gTy1DU0kJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlzcy1DU0kJCVsyXSBTUy1DU0kJT1BUSU9OQUwsCisJby1CY3NtQ2FtZWxURFAtQ3JpdGVyaWFMaXN0CVs0XSBPLUJjc21DYW1lbFREUENyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwl0aWYtQ1NJCQlbM10gTlVMTAlPUFRJT05BTCwKKwltLUNTSQkJWzVdIE0tQ1NJCU9QVElPTkFMLAorCW1vLXNtcy1DU0kJWzZdIFNNUy1DU0kJT1BUSU9OQUwsCisJdnQtQ1NJCQlbN10gVC1DU0kJT1BUSU9OQUwsCisJdC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJWzhdIFQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCWQtQ1NJCQlbOV0gRC1DU0kJT1BUSU9OQUwsCisJbXQtc21zLUNTSQlbMTBdIFNNUy1DU0kJT1BUSU9OQUwsCisJbXQtc21zQ0FNRUxURFAtQ3JpdGVyaWFMaXN0CVsxMV0JTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWFMaXN0CU9QVElPTkFMCisJfQorCitNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLiBtYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYQorCitNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYSA6Oj0gU0VRVUVOQ0UgeworCXNtcy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQJU01TLVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKKwl0cGR1LVR5cGVDcml0ZXJpb24JWzBdCVRQRFUtVHlwZUNyaXRlcmlvbgkJT1BUSU9OQUwsCisJLi4uIH0KKworVFBEVS1UeXBlQ3JpdGVyaW9uIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlRQRFVUeXBlcykgT0YKKwlNVC1TTVMtVFBEVS1UeXBlCisKKworbWF4TnVtT2ZUUERVVHlwZXMgSU5URUdFUiA6Oj0gNQorCitNVC1TTVMtVFBEVS1UeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwlzbXMtREVMSVZFUiAJKDApLAorCXNtcy1TVUJNSVQtUkVQT1JUIAkoMSksCisJc21zLVNUQVRVUy1SRVBPUlQgCSgyKSwKKwkuLi4gfQorCistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlGb3IgVFBEVS1UeXBlQ3JpdGVyaW9uIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55CistLQlvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIAorLS0JdGhlIHdob2xlIFRQRFUtVHlwZUNyaXRlcmlvbiBzZXF1ZW5jZS4KKy0tCUluIENBTUVMIHBoYXNlIDQsIHNtcy1TVUJNSVQtUkVQT1JUIHNoYWxsIG5vdCBiZSB1c2VkIGFuZCBhIHJlY2VpdmVkIFRQRFUtVHlwZUNyaXRlcmlvbgorLS0Jc2VxdWVuY2UgY29udGFpbmluZyBzbXMtU1VCTUlULVJFUE9SVCBzaGFsbCBiZSB3aG9sbHkgaWdub3JlZC4KKworRC1DU0kgOjo9IFNFUVVFTkNFIHsKKwlkcC1BbmFseXNlZEluZm9Dcml0ZXJpYUxpc3QJWzBdIERQLUFuYWx5c2VkSW5mb0NyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwljYW1lbENhcGFiaWxpdHlIYW5kbGluZwlbMV0gQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzNdCU5VTEwJCU9QVElPTkFMLAorCWNzaS1BY3RpdmUJWzRdCU5VTEwJCU9QVElPTkFMLAorCS4uLn0gCistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIEQtQ1NJIGlzIHNlbnQgdG8gVkxSL0dNU0MuCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCistLQlEUC1BbmFseXNlZEluZm9Dcml0ZXJpYSBhbmQgIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIHByZXNlbnQgaW4gCistLQl0aGUgRC1DU0kgc2VxdWVuY2UuCistLQlJZiBELUNTSSBpcyBzZWdtZW50ZWQsIHRoZW4gdGhlIGZpcnN0IHNlZ21lbnQgc2hhbGwgY29udGFpbiBkcC1BbmFseXNlZEluZm9Dcml0ZXJpYUxpc3QKKy0tCWFuZCBjYW1lbENhcGFiaWxpdHlIYW5kbGluZy4gU3Vic2VxdWVudCBzZWdtZW50cyBzaGFsbCBub3QgY29udGFpbgorLS0JY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcsIGJ1dCBtYXkgY29udGFpbiBkcC1BbmFseXNlZEluZm9Dcml0ZXJpYUxpc3QuCisKK0RQLUFuYWx5c2VkSW5mb0NyaXRlcmlhTGlzdCAgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaWEpIE9GCisJCQkJRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaXVtCisKK21heE51bU9mRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaWEgSU5URUdFUiA6Oj0gMTAKKworRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaXVtIDo6PSBTRVFVRU5DRSB7CisJZGlhbGxlZE51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2VydmljZUtleQlTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCUlTRE4tQWRkcmVzc1N0cmluZywKKwlkZWZhdWx0Q2FsbEhhbmRsaW5nCURlZmF1bHRDYWxsSGFuZGxpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1NTLUNTSSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNhbWVsRGF0YQlTUy1DYW1lbERhdGEsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbm90aWZpY2F0aW9uVG9DU0UJWzBdCU5VTEwJCU9QVElPTkFMLAorCWNzaS1BY3RpdmUJWzFdCU5VTEwJCU9QVElPTkFMCistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIFNTLUNTSSBpcyBzZW50IHRvIFZMUi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KK30KKworU1MtQ2FtZWxEYXRhICA6Oj0gU0VRVUVOQ0UgeworCXNzLUV2ZW50TGlzdAlTUy1FdmVudExpc3QsCisJZ3NtU0NGLUFkZHJlc3MJSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLCAKKwkuLi59CisKK1NTLUV2ZW50TGlzdCAgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxTU0V2ZW50cykgT0YgU1MtQ29kZQorCS0tIEFjdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgU1MtQ29kZSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gQ0FNRUwgUGhhc2UgMzoKKwktLSBlY3QJCVNTLUNvZGUgOjo9ICcwMDExMDAwMSdCCisJLS0gbXVsdGlQVFkJU1MtQ29kZSA6Oj0gJzAxMDEwMDAxJ0IKKwktLSBjZAkJU1MtQ29kZSA6Oj0gJzAwMTAwMTAwJ0IKKwktLSBjY2JzCQlTUy1Db2RlIDo6PSAnMDEwMDAxMDAnQgorCS0tIGFsbCBvdGhlciBTUyBjb2RlcyBzaGFsbCBiZSBpZ25vcmVkCisJLS0gV2hlbiBTUy1DU0kgaXMgc2VudCB0byB0aGUgVkxSLCBpdCBzaGFsbCBub3QgY29udGFpbiBhIG1hcmtpbmcgZm9yIGNjYnMuCisJLS0gSWYgdGhlIFZMUiByZWNlaXZlcyBTUy1DU0kgY29udGFpbmluZyBhIG1hcmtpbmcgZm9yIGNjYnMsIHRoZSBWTFIgc2hhbGwgZGlzY2FyZCB0aGUKKwktLSBjY2JzIG1hcmtpbmcgaW4gU1MtQ1NJLgorCittYXhOdW1PZkNhbWVsU1NFdmVudHMgSU5URUdFUiA6Oj0gMTAKKworTy1DU0kgOjo9IFNFUVVFTkNFIHsKKwlvLUJjc21DYW1lbFREUERhdGFMaXN0CU8tQmNzbUNhbWVsVERQRGF0YUxpc3QsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzBdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVsxXQlOVUxMCQlPUFRJT05BTCwKKwljc2lBY3RpdmUJCVsyXQlOVUxMCQlPUFRJT05BTH0KKy0tCW5vdGlmaWNhdGlvbnRvQ1NFIGFuZCBjc2lBY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBPLUNTSSBpcyBzZW50IHRvIFZMUi9HTVNDLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorLS0JTy1DU0kgc2hhbGwgbm90IGJlIHNlZ21lbnRlZC4KKworTy1CY3NtQ2FtZWxURFBEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJTy1CY3NtQ2FtZWxURFBEYXRhCisJLS0gTy1CY3NtQ2FtZWxURFBEYXRhTGlzdCBzaGFsbCBub3QgY29udGFpbiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mCisJLS0gTy1CY3NtQ2FtZWxURFBEYXRhIGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWUgZm9yIG8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludC4KKwktLSBGb3IgQ0FNRUwgUGhhc2UgMiwgdGhpcyBtZWFucyB0aGF0IG9ubHkgb25lIGluc3RhbmNlIG9mIE8tQmNzbUNhbWVsVERQRGF0YSBpcyBhbGxvd2VkCisJLS0gd2l0aCBvLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgYmVpbmcgZXF1YWwgdG8gRFAyLgorCittYXhOdW1PZkNhbWVsVERQRGF0YSAgSU5URUdFUiA6Oj0gMTAKKworTy1CY3NtQ2FtZWxURFBEYXRhIDo6PSBTRVFVRU5DRSB7CisJby1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50CU8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzBdIElTRE4tQWRkcmVzc1N0cmluZywKKwlkZWZhdWx0Q2FsbEhhbmRsaW5nCVsxXSBEZWZhdWx0Q2FsbEhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLgorCX0KKworU2VydmljZUtleSA6Oj0gSU5URUdFUiAoMC4uMjE0NzQ4MzY0NykKKworTy1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IDo6PSBFTlVNRVJBVEVEIHsKKwljb2xsZWN0ZWRJbmZvICgyKSwKKwkuLi4sCisJcm91dGVTZWxlY3RGYWlsdXJlICg0KSB9CisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIEZvciBPLUJjc21DYW1lbFREUERhdGEgc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKwktLSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSB3aG9sZSAKKwktLSBPLUJjc21DYW1lbFREUERhdGFzZXF1ZW5jZS4gCisJLS0gRm9yIE8tQmNzbUNhbWVsVERQLUNyaXRlcmlhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55CisJLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUKKwktLSBPLUJjc21DYW1lbFREUC1Dcml0ZXJpYSBzZXF1ZW5jZS4KKworTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCU8tQmNzbUNhbWVsVERQLUNyaXRlcmlhIAorCitULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYSAKKworTy1CY3NtQ2FtZWxURFAtQ3JpdGVyaWEgOjo9IFNFUVVFTkNFIHsKKwlvLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQJTy1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LAkKKwlkZXN0aW5hdGlvbk51bWJlckNyaXRlcmlhIAlbMF0gRGVzdGluYXRpb25OdW1iZXJDcml0ZXJpYQlPUFRJT05BTCwKKwliYXNpY1NlcnZpY2VDcml0ZXJpYQlbMV0gQmFzaWNTZXJ2aWNlQ3JpdGVyaWEJT1BUSU9OQUwsCisJY2FsbFR5cGVDcml0ZXJpYQlbMl0gQ2FsbFR5cGVDcml0ZXJpYQlPUFRJT05BTCwKKwkuLi4sCisJby1DYXVzZVZhbHVlQ3JpdGVyaWEJWzNdIE8tQ2F1c2VWYWx1ZUNyaXRlcmlhCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMIH0KKworVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYSA6Oj0gU0VRVUVOQ0UgeworCXQtQkNTTS1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQJVC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LAkKKwliYXNpY1NlcnZpY2VDcml0ZXJpYQlbMF0gQmFzaWNTZXJ2aWNlQ3JpdGVyaWEJT1BUSU9OQUwsCisJdC1DYXVzZVZhbHVlQ3JpdGVyaWEJWzFdIFQtQ2F1c2VWYWx1ZUNyaXRlcmlhCU9QVElPTkFMLAorCS4uLiB9CisKK0Rlc3RpbmF0aW9uTnVtYmVyQ3JpdGVyaWEgIDo6PSBTRVFVRU5DRSB7CisJbWF0Y2hUeXBlCQlbMF0gTWF0Y2hUeXBlLAorCWRlc3RpbmF0aW9uTnVtYmVyTGlzdCAJWzFdIERlc3RpbmF0aW9uTnVtYmVyTGlzdAlPUFRJT05BTCwKKwlkZXN0aW5hdGlvbk51bWJlckxlbmd0aExpc3QJWzJdIERlc3RpbmF0aW9uTnVtYmVyTGVuZ3RoTGlzdAlPUFRJT05BTCwKKwktLSBvbmUgb3IgYm90aCBvZiBkZXN0aW5hdGlvbk51bWJlckxpc3QgYW5kIGRlc3RpbmF0aW9uTnVtYmVyTGVuZ3RoTGlzdCAKKwktLSBzaGFsbCBiZSBwcmVzZW50CisJLi4ufQorCitEZXN0aW5hdGlvbk51bWJlckxpc3QgIDo6PSBTRVFVRU5DRSBTSVpFCSgxLi5tYXhOdW1PZkNhbWVsRGVzdGluYXRpb25OdW1iZXJzKSBPRgorCQkJCUlTRE4tQWRkcmVzc1N0cmluZworCS0tIFRoZSByZWNlaXZpbmcgZW50aXR5IHNoYWxsIG5vdCBjaGVjayB0aGUgZm9ybWF0IG9mIGEgbnVtYmVyIGluCisJLS0gdGhlIGRpYWxsZWQgbnVtYmVyIGxpc3QKKworRGVzdGluYXRpb25OdW1iZXJMZW5ndGhMaXN0ICA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVyTGVuZ3RocykgT0YgCisJCQkJCUlOVEVHRVIoMS4ubWF4TnVtT2ZJU0ROLUFkZHJlc3NEaWdpdHMpCisKK0Jhc2ljU2VydmljZUNyaXRlcmlhICAgOjo9IFNFUVVFTkNFIFNJWkUoMS4ubWF4TnVtT2ZDYW1lbEJhc2ljU2VydmljZUNyaXRlcmlhKSBPRgorCUV4dC1CYXNpY1NlcnZpY2VDb2RlCisKK21heE51bU9mSVNETi1BZGRyZXNzRGlnaXRzICBJTlRFR0VSIDo6PSAxNQorCittYXhOdW1PZkNhbWVsRGVzdGluYXRpb25OdW1iZXJzICBJTlRFR0VSIDo6PSAxMAorCittYXhOdW1PZkNhbWVsRGVzdGluYXRpb25OdW1iZXJMZW5ndGhzICBJTlRFR0VSIDo6PSAzCisKK21heE51bU9mQ2FtZWxCYXNpY1NlcnZpY2VDcml0ZXJpYSAgSU5URUdFUiA6Oj0gNQorCitDYWxsVHlwZUNyaXRlcmlhICAgICAgIDo6PSBFTlVNRVJBVEVEIHsKKwlmb3J3YXJkZWQgCSgwKSwKKwlub3RGb3J3YXJkZWQJKDEpfQorCitNYXRjaFR5cGUgICAgICAgOjo9IEVOVU1FUkFURUQgeworCWluaGliaXRpbmcgCSgwKSwKKwllbmFibGluZwkJKDEpfQorCitPLUNhdXNlVmFsdWVDcml0ZXJpYSAgIDo6PSBTRVFVRU5DRSBTSVpFKDEuLm1heE51bU9mQ0FNRUwtTy1DYXVzZVZhbHVlQ3JpdGVyaWEpIE9GCisJQ2F1c2VWYWx1ZQorCitULUNhdXNlVmFsdWVDcml0ZXJpYSAgIDo6PSBTRVFVRU5DRSBTSVpFKDEuLm1heE51bU9mQ0FNRUwtVC1DYXVzZVZhbHVlQ3JpdGVyaWEpIE9GCisJQ2F1c2VWYWx1ZQorCittYXhOdW1PZkNBTUVMLU8tQ2F1c2VWYWx1ZUNyaXRlcmlhICBJTlRFR0VSIDo6PSA1CisKK21heE51bU9mQ0FNRUwtVC1DYXVzZVZhbHVlQ3JpdGVyaWEgIElOVEVHRVIgOjo9IDUKKworQ2F1c2VWYWx1ZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFKDEpKQorLS0gVHlwZSBleHRyYWN0ZWQgZnJvbSBDYXVzZSBwYXJhbWV0ZXIgaW4gSVRVLVQgUmVjb21tZW5kYXRpb24gUS43NjMuCistLSBGb3IgdGhlIHVzZSBvZiBjYXVzZSB2YWx1ZSByZWZlciB0byBJVFUtVCBSZWNvbW1lbmRhdGlvbiBRLjg1MC4KKworRGVmYXVsdENhbGxIYW5kbGluZyA6Oj0gRU5VTUVSQVRFRCB7CisJY29udGludWVDYWxsICgwKSAsCisJcmVsZWFzZUNhbGwgKDEpICwKKwkuLi59CisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgaW4gcmFuZ2UgMi0zMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJjb250aW51ZUNhbGwiCisJLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyBncmVhdGVyIHRoYW4gMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAicmVsZWFzZUNhbGwiCisKK0NhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIDo6PSBJTlRFR0VSKDEuLjE2KSAKKwktLSB2YWx1ZSAxID0gQ0FNRUwgcGhhc2UgMSwKKwktLSB2YWx1ZSAyID0gQ0FNRUwgcGhhc2UgMiwKKwktLSB2YWx1ZSAzID0gQ0FNRUwgUGhhc2UgMywKKwktLSB2YWx1ZSA0ID0gQ0FNRUwgcGhhc2UgNDoKKwktLSByZWNlcHRpb24gb2YgdmFsdWVzIGdyZWF0ZXIgdGhhbiA0IHNoYWxsIGJlIHRyZWF0ZWQgYXMgQ0FNRUwgcGhhc2UgNC4KKworU3VwcG9ydGVkQ2FtZWxQaGFzZXMgOjo9IEJJVCBTVFJJTkcgeworCXBoYXNlMSAoMCksCisJcGhhc2UyICgxKSwKKwlwaGFzZTMgKDIpLAorCXBoYXNlNCAoMyl9IChTSVpFICgxLi4xNikpIAorLS0gQSBub2RlIHNoYWxsIG1hcmsgaW4gdGhlIEJJVCBTVFJJTkcgYWxsIENBTUVMIFBoYXNlcyBpdCBzdXBwb3J0cy4KKy0tIE90aGVyIHZhbHVlcyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK09mZmVyZWRDYW1lbDRDU0lzIDo6PSBCSVQgU1RSSU5HIHsgCQorCW8tY3NpCQkoMCksCisJZC1jc2kJCSgxKSwKKwl2dC1jc2kJCSgyKSwKKwl0LWNzaQkJKDMpLAorCW10LXNtcy1jc2kJKDQpLAorCW1nLWNzaQkJKDUpLAorCXBzaS1lbmhhbmNlbWVudHMJKDYpIAorfSAoU0laRSAoNy4uMTYpKQorLS0gQSBub2RlIHN1cHBvcnRpbmcgQ2FtZWwgcGhhc2UgNCBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBDYW1lbDQgQ1NJcyAKKy0tIGl0IG9mZmVycy4KKy0tIE90aGVyIHZhbHVlcyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK09mZmVyZWRDYW1lbDRGdW5jdGlvbmFsaXRpZXMgOjo9IEJJVCBTVFJJTkcgeyAJCisJaW5pdGlhdGVDYWxsQXR0ZW1wdAkoMCksCisJc3BsaXRMZWcJCSgxKSwKKwltb3ZlTGVnCQkoMiksCisJZGlzY29ubmVjdExlZwkoMyksCisJZW50aXR5UmVsZWFzZWQJKDQpLAorCWRmYy1XaXRoQXJndW1lbnQJKDUpLAorCXBsYXlUb25lCQkoNiksCisJZHRtZi1NaWRDYWxsCSg3KSwKKwljaGFyZ2luZ0luZGljYXRvcgkoOCksCisJYWxlcnRpbmdEUAkoOSksCisJbG9jYXRpb25BdEFsZXJ0aW5nCSgxMCksCisJY2hhbmdlT2ZQb3NpdGlvbkRQCSgxMSksCisJb3ItSW50ZXJhY3Rpb25zCSgxMiksCisJd2FybmluZ1RvbmVFbmhhbmNlbWVudHMJKDEzKSwKKwljZi1FbmhhbmNlbWVudHMJKDE0KSwKKwlzdWJzY3JpYmVkRW5oYW5jZWREaWFsbGVkU2VydmljZXMgCSgxNSksCisJc2VydmluZ05ldHdvcmtFbmhhbmNlZERpYWxsZWRTZXJ2aWNlcyAoMTYpLAorCWNyaXRlcmlhRm9yQ2hhbmdlT2ZQb3NpdGlvbkRQCSgxNyksCisJc2VydmljZUNoYW5nZURQCSgxOCksCisJY29sbGVjdEluZm9ybWF0aW9uCSgxOSkKK30gKFNJWkUgKDE1Li42NCkpCistLSBBIG5vZGUgc3VwcG9ydGluZyBDYW1lbCBwaGFzZSA0IHNoYWxsIG1hcmsgaW4gdGhlIEJJVCBTVFJJTkcgYWxsIENBTUVMNCAKKy0tIGZ1bmN0aW9uYWxpdGllcyBpdCBvZmZlcnMuCistLSBPdGhlciB2YWx1ZXMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitTTVMtQ1NJIDo6PSBTRVFVRU5DRSB7CisJc21zLUNBTUVMLVREUC1EYXRhTGlzdAlbMF0gU01TLUNBTUVMLVREUC1EYXRhTGlzdAlPUFRJT05BTCwKKwljYW1lbENhcGFiaWxpdHlIYW5kbGluZwlbMV0gQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzNdIE5VTEwJCU9QVElPTkFMLAorCWNzaS1BY3RpdmUJWzRdIE5VTEwJCU9QVElPTkFMLAorCS4uLn0KKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50CistLQl3aGVuIE1PLVNNUy1DU0kgb3IgTVQtU01TLUNTSSBpcyBzZW50IHRvIFZMUiBvciBTR1NOLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorLS0JU01TLUNBTUVMLVREUC1EYXRhIGFuZCAgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgc2hhbGwgYmUgcHJlc2VudCBpbiAKKy0tCXRoZSBTTVMtQ1NJIHNlcXVlbmNlLgorLS0JSWYgU01TLUNTSSBpcyBzZWdtZW50ZWQsIHNtcy1DQU1FTC1URFAtRGF0YUxpc3QgYW5kIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIAorLS0JcHJlc2VudCBpbiB0aGUgZmlyc3Qgc2VnbWVudAorCitTTVMtQ0FNRUwtVERQLURhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlTTVMtQ0FNRUwtVERQLURhdGEKKy0tCVNNUy1DQU1FTC1URFAtRGF0YUxpc3Qgc2hhbGwgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZgorLS0JU01TLUNBTUVMLVREUC1EYXRhIGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWUgZm9yIHNtcy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQuCisKK1NNUy1DQU1FTC1URFAtRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXNtcy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQJWzBdIFNNUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJc2VydmljZUtleQlbMV0gU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMl0gSVNETi1BZGRyZXNzU3RyaW5nLAorCWRlZmF1bHRTTVMtSGFuZGxpbmcJWzNdIERlZmF1bHRTTVMtSGFuZGxpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uCisJfQorCitTTVMtVHJpZ2dlckRldGVjdGlvblBvaW50IDo6PSBFTlVNRVJBVEVEIHsKKwlzbXMtQ29sbGVjdGVkSW5mbyAoMSksCisJLi4uLAorCXNtcy1EZWxpdmVyeVJlcXVlc3QgKDIpCisJfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JRm9yIFNNUy1DQU1FTC1URFAtRGF0YSBhbmQgTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWEgc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyAKKy0tCXBhcmFtZXRlciB3aXRoIGFueSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlCistLQl0aGUgd2hvbGUgc2VxdWVuY2UuCistLQorLS0JSWYgdGhpcyBwYXJhbWV0ZXIgaXMgcmVjZWl2ZWQgd2l0aCBhbnkgb3RoZXIgdmFsdWUgdGhhbiBzbXMtQ29sbGVjdGVkSW5mbworLS0JaW4gYW4gU01TLUNBTUVMLVREUC1EYXRhIHNlcXVlbmNlIGNvbnRhaW5lZCBpbiBtby1zbXMtQ1NJLCB0aGVuIHRoZSByZWNlaXZlciBzaGFsbAorLS0JaWdub3JlIHRoZSB3aG9sZSBTTVMtQ0FNRUwtVERQLURhdGEgc2VxdWVuY2UuCistLQorLS0JSWYgdGhpcyBwYXJhbWV0ZXIgaXMgcmVjZWl2ZWQgd2l0aCBhbnkgb3RoZXIgdmFsdWUgdGhhbiBzbXMtRGVsaXZlcnlSZXF1ZXN0CistLQlpbiBhbiBTTVMtQ0FNRUwtVERQLURhdGEgc2VxdWVuY2UgY29udGFpbmVkIGluIG10LXNtcy1DU0kgdGhlbiB0aGUgcmVjZWl2ZXIgc2hhbGwKKy0tCWlnbm9yZSB0aGUgd2hvbGUgU01TLUNBTUVMLVREUC1EYXRhIHNlcXVlbmNlLgorLS0KKy0tCUlmIHRoaXMgcGFyYW1ldGVyIGlzIHJlY2VpdmVkIHdpdGggYW55IG90aGVyIHZhbHVlIHRoYW4gc21zLURlbGl2ZXJ5UmVxdWVzdAorLS0JaW4gYW4gTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWEgc2VxdWVuY2UgdGhlbiB0aGUgcmVjZWl2ZXIgc2hhbGwKKy0tCWlnbm9yZSB0aGUgd2hvbGUgTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWEgc2VxdWVuY2UuCisKK0RlZmF1bHRTTVMtSGFuZGxpbmcgOjo9IEVOVU1FUkFURUQgeworCWNvbnRpbnVlVHJhbnNhY3Rpb24gKDApICwKKwlyZWxlYXNlVHJhbnNhY3Rpb24gKDEpICwKKwkuLi59CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlyZWNlcHRpb24gb2YgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAiY29udGludWVUcmFuc2FjdGlvbiIKKy0tCXJlY2VwdGlvbiBvZiB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgInJlbGVhc2VUcmFuc2FjdGlvbiIKKworTS1DU0kgOjo9IFNFUVVFTkNFIHsKKwltb2JpbGl0eVRyaWdnZXJzCU1vYmlsaXR5VHJpZ2dlcnMsCisJc2VydmljZUtleQlTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVswXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzJdIE5VTEwJCU9QVElPTkFMLAorCWNzaS1BY3RpdmUJWzNdIE5VTEwJCU9QVElPTkFMLAorCS4uLn0KKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gTS1DU0kgaXMgc2VudCB0byBWTFIuCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCisKK01HLUNTSSA6Oj0gU0VRVUVOQ0UgeworCW1vYmlsaXR5VHJpZ2dlcnMJTW9iaWxpdHlUcmlnZ2VycywKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzBdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzFdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMl0gTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbM10gTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBNRy1DU0kgaXMgc2VudCB0byBTR1NOLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorCitNb2JpbGl0eVRyaWdnZXJzICA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZNb2JpbGl0eVRyaWdnZXJzKSBPRgorCU1NLUNvZGUKKworbWF4TnVtT2ZNb2JpbGl0eVRyaWdnZXJzIElOVEVHRVIgOjo9IDEwCisKK01NLUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCistLQlUaGlzIHR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIE1vYmlsaXR5IE1hbmFnZW1lbnQgZXZlbnQuCistLQlBY3Rpb25zIGZvciB0aGUgZm9sbG93aW5nIE1NLUNvZGUgdmFsdWVzIGFyZSBkZWZpbmVkIGluIENBTUVMIFBoYXNlIDQ6CistLQorLS0JQ1MgZG9tYWluIE1NIGV2ZW50czoKKy0tCUxvY2F0aW9uLXVwZGF0ZS1pbi1zYW1lLVZMUglNTS1Db2RlIDo6PSAnMDAwMDAwMDAnQgorLS0JTG9jYXRpb24tdXBkYXRlLXRvLW90aGVyLVZMUglNTS1Db2RlIDo6PSAnMDAwMDAwMDEnQgorLS0JSU1TSS1BdHRhY2gJTU0tQ29kZSA6Oj0gJzAwMDAwMDEwJ0IKKy0tCU1TLWluaXRpYXRlZC1JTVNJLURldGFjaAlNTS1Db2RlIDo6PSAnMDAwMDAwMTEnQgorLS0JTmV0d29yay1pbml0aWF0ZWQtSU1TSS1EZXRhY2gJTU0tQ29kZSA6Oj0gJzAwMDAwMTAwJ0IKKy0tCistLQlQUyBkb21haW4gTU0gZXZlbnRzOgorLS0JUm91dGVpbmctQXJlYS11cGRhdGUtaW4tc2FtZS1TR1NOCU1NLUNvZGUgOjo9ICcxMDAwMDAwMCdCCistLQlSb3V0ZWluZy1BcmVhLXVwZGF0ZS10by1vdGhlci1TR1NOLXVwZGF0ZS1mcm9tLW5ldy1TR1NOCistLQkJCQlNTS1Db2RlIDo6PSAnMTAwMDAwMDEnQgorLS0JUm91dGVpbmctQXJlYS11cGRhdGUtdG8tb3RoZXItU0dTTi1kaXNjb25uZWN0LWJ5LWRldGFjaAorLS0JCQkJTU0tQ29kZSA6Oj0gJzEwMDAwMDEwJ0IKKy0tCUdQUlMtQXR0YWNoCU1NLUNvZGUgOjo9ICcxMDAwMDAxMSdCCistLQlNUy1pbml0aWF0ZWQtR1BSUy1EZXRhY2gJTU0tQ29kZSA6Oj0gJzEwMDAwMTAwJ0IKKy0tCU5ldHdvcmstaW5pdGlhdGVkLUdQUlMtRGV0YWNoCU1NLUNvZGUgOjo9ICcxMDAwMDEwMSdCIAorLS0JTmV0d29yay1pbml0aWF0ZWQtdHJhbnNmZXItdG8tTVMtbm90LXJlYWNoYWJsZS1mb3ItcGFnaW5nCistLQkJCQlNTS1Db2RlIDo6PSAnMTAwMDAxMTAnQgorLS0KKy0tCUlmIHRoZSBNU0MgcmVjZWl2ZXMgYW55IG90aGVyIE1NLWNvZGUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUgZm9yIHRoZQorLS0JQ1MgZG9tYWluLCB0aGVuIHRoZSBNU0Mgc2hhbGwgaWdub3JlIHRoYXQgTU0tY29kZS4KKy0tCUlmIHRoZSBTR1NOIHJlY2VpdmVzIGFueSBvdGhlciBNTS1jb2RlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIGFib3ZlIGZvciB0aGUKKy0tCVBTIGRvbWFpbiwgdGhlbiB0aGUgU0dTTiBzaGFsbCBpZ25vcmUgdGhhdCBNTS1jb2RlLgorCitULUNTSSA6Oj0gU0VRVUVOQ0UgeworCXQtQmNzbUNhbWVsVERQRGF0YUxpc3QJVC1CY3NtQ2FtZWxURFBEYXRhTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwljYW1lbENhcGFiaWxpdHlIYW5kbGluZwlbMF0gQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzFdIE5VTEwJCU9QVElPTkFMLAorCWNzaS1BY3RpdmUJWzJdIE5VTEwJCU9QVElPTkFMfQorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBWVC1DU0kvVC1DU0kgaXMgc2VudAorLS0JdG8gVkxSL0dNU0MuCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCistLQlULUNTSSBzaGFsbCBub3QgYmUgc2VnbWVudGVkLgorCitULUJjc21DYW1lbFREUERhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlULUJjc21DYW1lbFREUERhdGEKKwktLS0gVC1CY3NtQ2FtZWxURFBEYXRhTGlzdCBzaGFsbCBub3QgY29udGFpbiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mCisJLS0tIFQtQmNzbUNhbWVsVERQRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciB0LUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQuCisJLS0tIEZvciBDQU1FTCBQaGFzZSAyLCB0aGlzIG1lYW5zIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgVC1CY3NtQ2FtZWxURFBEYXRhIGlzIGFsbG93ZWQKKwktLS0gd2l0aCB0LUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgYmVpbmcgZXF1YWwgdG8gRFAxMi4gCisJLS0tIEZvciBDQU1FTCBQaGFzZSAzLCBtb3JlIFREUJJzIGFyZSBhbGxvd2VkLgorCitULUJjc21DYW1lbFREUERhdGEgOjo9IFNFUVVFTkNFIHsKKwl0LUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQJVC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCWRlZmF1bHRDYWxsSGFuZGxpbmcJWzFdIERlZmF1bHRDYWxsSGFuZGxpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitULUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgOjo9IEVOVU1FUkFURUQgeworCXRlcm1BdHRlbXB0QXV0aG9yaXplZCAoMTIpLAorCS4uLiAsCisJdEJ1c3kgKDEzKSwKKwl0Tm9BbnN3ZXIgKDE0KX0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gRm9yIFQtQmNzbUNhbWVsVERQRGF0YSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueSBvdGhlcgorCS0tIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIGFib3ZlLCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSB3aG9sZQorCS0tIFQtQmNzbUNhbWVsVERQRGF0YSBzZXF1ZW5jZS4KKworLS0gZ3BycyBsb2NhdGlvbiBpbmZvcm1hdGlvbiByZXRyaWV2YWwgdHlwZXMKKworU2VuZFJvdXRpbmdJbmZvRm9yR3Byc0FyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQkJWzBdIElNU0ksCisJZ2dzbi1BZGRyZXNzCQlbMV0gR1NOLUFkZHJlc3MJT1BUSU9OQUwsIAorCWdnc24tTnVtYmVyCQlbMl0JSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1NlbmRSb3V0aW5nSW5mb0ZvckdwcnNSZXMgOjo9IFNFUVVFTkNFIHsKKwlzZ3NuLUFkZHJlc3MJCVswXSBHU04tQWRkcmVzcywKKwlnZ3NuLUFkZHJlc3MJCVsxXQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwltb2JpbGVOb3RSZWFjaGFibGVSZWFzb24JCVsyXQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBmYWlsdXJlIHJlcG9ydCB0eXBlcworCitGYWlsdXJlUmVwb3J0QXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCQlbMF0gSU1TSSwKKwlnZ3NuLU51bWJlcgkJWzFdIElTRE4tQWRkcmVzc1N0cmluZwksCisJZ2dzbi1BZGRyZXNzCQlbMl0gR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRmFpbHVyZVJlcG9ydFJlcyA6Oj0gU0VRVUVOQ0UgeworCWdnc24tQWRkcmVzcwkJWzBdIEdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKKy0tIGdwcnMgbm90aWZpY2F0aW9uIHR5cGVzCisKK05vdGVNc1ByZXNlbnRGb3JHcHJzQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCQlbMF0gSU1TSSwKKwlzZ3NuLUFkZHJlc3MJCVsxXSBHU04tQWRkcmVzcywKKwlnZ3NuLUFkZHJlc3MJCVsyXSBHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitOb3RlTXNQcmVzZW50Rm9yR3Byc1JlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKKy0tIGZhdWx0IHJlY292ZXJ5IHR5cGVzCisKK1Jlc2V0QXJnIDo6PSBTRVFVRU5DRSB7CisJaGxyLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJaGxyLUxpc3QJCUhMUi1MaXN0CQlPUFRJT05BTCwKKwkuLi59CisKK1Jlc3RvcmVEYXRhQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJbG1zaQkJCUxNU0kJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJdmxyLUNhcGFiaWxpdHkJWzZdIFZMUi1DYXBhYmlsaXR5CU9QVElPTkFMIH0KKworUmVzdG9yZURhdGFSZXMgOjo9IFNFUVVFTkNFIHsKKwlobHItTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwltc05vdFJlYWNoYWJsZQlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKKy0tIFZCUy9WR0NTIHR5cGVzCitWQlNEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZWQlNHcm91cElkcykgT0YKKwkJCQlWb2ljZUJyb2FkY2FzdERhdGEKKworVkdDU0RhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlZHQ1NHcm91cElkcykgT0YKKwkJCQlWb2ljZUdyb3VwQ2FsbERhdGEKKworbWF4TnVtT2ZWQlNHcm91cElkcyAgSU5URUdFUiA6Oj0gNTAKKworbWF4TnVtT2ZWR0NTR3JvdXBJZHMgIElOVEVHRVIgOjo9IDUwCisKK1ZvaWNlR3JvdXBDYWxsRGF0YSAgOjo9IFNFUVVFTkNFIHsKKwlncm91cElkCQlHcm91cElkLCAKKwktLSBncm91cElkIHNoYWxsIGJlIGZpbGxlZCB3aXRoIHNpeCBUQkNEIGZpbGxlcnMgKDExMTEpaWYgdGhlIGxvbmdHcm91cElkIGlzIHByZXNlbnQgIAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxTdWJzY3JpcHRpb25zCUFkZGl0aW9uYWxTdWJzY3JpcHRpb25zCU9QVElPTkFMLAorCWFkZGl0aW9uYWxJbmZvCVswXSBBZGRpdGlvbmFsSW5mbwlPUFRJT05BTCwKKwlsb25nR3JvdXBJZAlbMV0gTG9uZy1Hcm91cElkCU9QVElPTkFMIH0KKworCS0tIFZvaWNlR3JvdXBDYWxsRGF0YSBjb250YWluaW5nIGEgbG9uZ0dyb3VwSWQgc2hhbGwgbm90IGJlIHNlbnQgdG8gVkxScyB0aGF0IGRpZCBub3QKKwktLSBpbmRpY2F0ZSBzdXBwb3J0IG9mIGxvbmcgR3JvdXAgSURzIHdpdGhpbiB0aGUgVXBkYXRlIExvY2F0aW9uIG9yIFJlc3RvcmUgRGF0YSAKKwktLSByZXF1ZXN0IG1lc3NhZ2UKKworQWRkaXRpb25hbEluZm8gOjo9IEJJVCBTVFJJTkcgKFNJWkUgKDEuLjEzNikpCistLQkgUmVmZXJzIHRvIEFkZGl0aW9uYWwgSW5mbyBhcyBzcGVjaWZpZWQgaW4gM0dQUCBUUyA0My4wNjggCisKK0FkZGl0aW9uYWxTdWJzY3JpcHRpb25zIDo6PSBCSVQgU1RSSU5HIHsKKwlwcml2aWxlZ2VkVXBsaW5rUmVxdWVzdCAoMCksCisJZW1lcmdlbmN5VXBsaW5rUmVxdWVzdCAoMSksCisJZW1lcmdlbmN5UmVzZXQgKDIpfSAoU0laRSAoMy4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworVm9pY2VCcm9hZGNhc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJZ3JvdXBpZAkJR3JvdXBJZCwgCisJLS0gZ3JvdXBJZCBzaGFsbCBiZSBmaWxsZWQgd2l0aCBzaXggVEJDRCBmaWxsZXJzICgxMTExKWlmIHRoZSBsb25nR3JvdXBJZCBpcyBwcmVzZW50CisJYnJvYWRjYXN0SW5pdEVudGl0bGVtZW50CU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlsb25nR3JvdXBJZAlbMF0gTG9uZy1Hcm91cElkCU9QVElPTkFMIH0KKwkKKy0tIFZvaWNlQnJvYWRjYXN0RGF0YSBjb250YWluaW5nIGEgbG9uZ0dyb3VwSWQgc2hhbGwgbm90IGJlIHNlbnQgdG8gVkxScyB0aGF0IGRpZCBub3QKKy0tIGluZGljYXRlIHN1cHBvcnQgb2YgbG9uZyBHcm91cCBJRHMgd2l0aGluIHRoZSBVcGRhdGUgTG9jYXRpb24gb3IgUmVzdG9yZSBEYXRhIAorCS0tIHJlcXVlc3QgbWVzc2FnZQorCitHcm91cElkICA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDMpKQorCS0tIFdoZW4gR3JvdXAtSWQgaXMgbGVzcyB0aGFuIHNpeCBjaGFyYWN0ZXJzIGluIGxlbmd0aCwgdGhlIFRCQ0QgZmlsbGVyICgxMTExKQorCS0tIGlzIHVzZWQgdG8gZmlsbCB1bnVzZWQgaGFsZiBvY3RldHMuCisJLS0gUmVmZXJzIHRvIHRoZSBHcm91cCBJZGVudGlmaWNhdGlvbiBhcyBzcGVjaWZpZWQgaW4gM0dQUCBUUyAyMy4wMDMgCisJLS0gYW5kIDNHUFAgVFMgNDMuMDY4LyA0My4wNjkKKworTG9uZy1Hcm91cElkICA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDQpKQorCS0tIFdoZW4gTG9uZy1Hcm91cC1JZCBpcyBsZXNzIHRoYW4gZWlnaHQgY2hhcmFjdGVycyBpbiBsZW5ndGgsIHRoZSBUQkNEIGZpbGxlciAoMTExMSkKKwktLSBpcyB1c2VkIHRvIGZpbGwgdW51c2VkIGhhbGYgb2N0ZXRzLgorCS0tIFJlZmVycyB0byB0aGUgR3JvdXAgSWRlbnRpZmljYXRpb24gYXMgc3BlY2lmaWVkIGluIDNHUFAgVFMgMjMuMDAzIAorCS0tIGFuZCAzR1BQIFRTIDQzLjA2OC8gNDMuMDY5CisKKworLS0gcHJvdmlkZSBzdWJzY3JpYmVyIGluZm8gdHlwZXMKKworUHJvdmlkZVN1YnNjcmliZXJJbmZvQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJWzBdIElNU0ksCisJbG1zaQkJWzFdIExNU0kJT1BUSU9OQUwsCisJcmVxdWVzdGVkSW5mbwlbMl0gUmVxdWVzdGVkSW5mbywKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJY2FsbFByaW9yaXR5CVs0XQlFTUxQUC1Qcmlvcml0eQlPUFRJT05BTAorCX0KKworUHJvdmlkZVN1YnNjcmliZXJJbmZvUmVzIDo6PSBTRVFVRU5DRSB7CisJc3Vic2NyaWJlckluZm8JU3Vic2NyaWJlckluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1N1YnNjcmliZXJJbmZvIDo6PSBTRVFVRU5DRSB7CisJbG9jYXRpb25JbmZvcm1hdGlvbglbMF0gTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCwKKwlzdWJzY3JpYmVyU3RhdGUJWzFdIFN1YnNjcmliZXJTdGF0ZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWxvY2F0aW9uSW5mb3JtYXRpb25HUFJTCVszXSBMb2NhdGlvbkluZm9ybWF0aW9uR1BSUwlPUFRJT05BTCwKKwlwcy1TdWJzY3JpYmVyU3RhdGUJWzRdIFBTLVN1YnNjcmliZXJTdGF0ZQlPUFRJT05BTCwKKwlpbWVpCQkJWzVdIElNRUkJCU9QVElPTkFMLAorCW1zLUNsYXNzbWFyazIJWzZdIE1TLUNsYXNzbWFyazIJT1BUSU9OQUwsCisJZ3Bycy1NUy1DbGFzcwlbN10gR1BSU01TQ2xhc3MJT1BUSU9OQUwsCisJbW5wSW5mb1JlcwlbOF0gTU5QSW5mb1JlcwlPUFRJT05BTCB9CisKKy0tCUlmIHRoZSBITFIgcmVjZWl2ZXMgbG9jYXRpb25JbmZvcm1hdGlvbiwgc3Vic2NyaWJlclN0YXRlIG9yIG1zLUNsYXNzbWFyazIgZnJvbSBhbiBTR1NOCistLQlpdCBzaGFsbCBkaXNjYXJkIHRoZW0uCistLQlJZiB0aGUgSExSIHJlY2VpdmVzIGxvY2F0aW9uSW5mb3JtYXRpb25HUFJTLCBwcy1TdWJzY3JpYmVyU3RhdGUgb3IgZ3Bycy1NUy1DbGFzcyBmcm9tCistLQlhIFZMUiBpdCBzaGFsbCBkaXNjYXJkIHRoZW0uCistLQlJZiB0aGUgSExSIHJlY2VpdmVzIHBhcmFtZXRlcnMgd2hpY2ggaXQgaGFzIG5vdCByZXF1ZXN0ZWQsIGl0IHNoYWxsIGRpc2NhcmQgdGhlbS4KKworTU5QSW5mb1JlcyA6Oj0gU0VRVUVOQ0UgeworCXJvdXRlaW5nTnVtYmVyCVswXSBSb3V0ZWluZ051bWJlciAJT1BUSU9OQUwsCisJaW1zaQkJCVsxXSBJTVNJCQlPUFRJT05BTCwKKwltc2lzZG4JCVsyXSBJU0ROLUFkZHJlc3NTdHJpbmcgCU9QVElPTkFMLAorCW51bWJlclBvcnRhYmlsaXR5U3RhdHVzCVszXSBOdW1iZXJQb3J0YWJpbGl0eVN0YXR1cwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorLS0JVGhlIElNU0kgcGFyYW1ldGVyIGNvbnRhaW5zIGEgZ2VuZXJpYyBJTVNJLCBpLmUuIGl0IGlzIG5vdCB0aWVkIG5lY2Vzc2FyaWx5IHRvIHRoZSAKKy0tCVN1YnNjcmliZXIuIE1DQyBhbmQgTU5DIHZhbHVlcyBpbiB0aGlzIElNU0kgc2hhbGwgcG9pbnQgdG8gdGhlIFN1YnNjcmlwdGlvbiBOZXR3b3JrIG9mIAorLS0JdGhlIFN1YnNjcmliZXIuIFNlZSAzR1BQIFRTIDIzLjA2NiBbMTA4XS4KKworUm91dGVpbmdOdW1iZXIgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICgxLi41KSkKKworCitOdW1iZXJQb3J0YWJpbGl0eVN0YXR1cyA6Oj0gRU5VTUVSQVRFRCB7CisJbm90S25vd25Ub0JlUG9ydGVkCSgwKSwKKwlvd25OdW1iZXJQb3J0ZWRPdXQJKDEpLAorCWZvcmVpZ25OdW1iZXJQb3J0ZWRUb0ZvcmVpZ25OZXR3b3JrCSgyKSwKKwkuLi4sCisJb3duTnVtYmVyTm90UG9ydGVkT3V0CSg0KSwKKwlmb3JlaWduTnVtYmVyUG9ydGVkSW4JKDUpCisJfQorCS0tCWV4Y2VwdGlvbiBoYW5kbGluZzogCisJLS0gIHJlY2VwdGlvbiBvZiBvdGhlciB2YWx1ZXMgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgCisJLS0gIHdob2xlIE51bWJlclBvcnRhYmlsaXR5U3RhdHVzOworCS0tICBvd25OdW1iZXJOb3RQb3J0ZWRPdXQgb3IgZm9yZWlnbk51bWJlclBvcnRlZEluIG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFueSBUaW1lIAorCS0tICBJbnRlcnJvZ2F0aW9uIG1lc3NhZ2UuCisKK01TLUNsYXNzbWFyazIgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMykpCisJLS0gVGhpcyBwYXJhbWV0ZXIgY2FycmllcyB0aGUgdmFsdWUgcGFydCBvZiB0aGUgTVMgQ2xhc3NtYXJrIDIgSUUgZGVmaW5lZCBpbiAKKwktLSAzR1BQIFRTIDI0LjAwOCBbMzVdLgorCitHUFJTTVNDbGFzcyA6Oj0gU0VRVUVOQ0UgeworCW1TTmV0d29ya0NhcGFiaWxpdHkJWzBdIE1TTmV0d29ya0NhcGFiaWxpdHksCisJbVNSYWRpb0FjY2Vzc0NhcGFiaWxpdHkJWzFdIE1TUmFkaW9BY2Nlc3NDYXBhYmlsaXR5CU9QVElPTkFMCisJfQorCitNU05ldHdvcmtDYXBhYmlsaXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjgpKQorCS0tIFRoaXMgcGFyYW1ldGVyIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIE1TIE5ldHdvcmsgQ2FwYWJpbGl0eSBJRSBkZWZpbmVkIGluIAorCS0tIDNHUFAgVFMgMjQuMDA4IFszNV0uCisJCitNU1JhZGlvQWNjZXNzQ2FwYWJpbGl0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi41MCkpCisJLS0gVGhpcyBwYXJhbWV0ZXIgY2FycmllcyB0aGUgdmFsdWUgcGFydCBvZiB0aGUgTVMgUmFkaW8gQWNjZXNzIENhcGFiaWxpdHkgSUUgZGVmaW5lZCBpbgorCS0tIDNHUFAgVFMgMjQuMDA4IFszNV0uCisKK1JlcXVlc3RlZEluZm8gOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvbkluZm9ybWF0aW9uCVswXSBOVUxMCQlPUFRJT05BTCwKKwlzdWJzY3JpYmVyU3RhdGUJWzFdIE5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwgCisJY3VycmVudExvY2F0aW9uCVszXSBOVUxMCQlPUFRJT05BTCwKKwlyZXF1ZXN0ZWREb21haW4JWzRdIERvbWFpblR5cGUJT1BUSU9OQUwsCisJaW1laQkJCVs2XSBOVUxMCQlPUFRJT05BTCwKKwltcy1jbGFzc21hcmsJWzVdIE5VTEwJCU9QVElPTkFMLAorCW1ucFJlcXVlc3RlZEluZm8JWzddIE5VTEwgCQlPUFRJT05BTCB9CisKKy0tCWN1cnJlbnRMb2NhdGlvbiBzaGFsbCBiZSBhYnNlbnQgaWYgbG9jYXRpb25JbmZvcm1hdGlvbiBpcyBhYnNlbnQKKworRG9tYWluVHlwZSA6Oj0gIEVOVU1FUkFURUQgeworCWNzLURvbWFpbgkJKDApLAorCXBzLURvbWFpbgkJKDEpLAorCS4uLn0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgPiAxIHNoYWxsIGJlIG1hcHBlZCB0byAnY3MtRG9tYWluJworCitMb2NhdGlvbkluZm9ybWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJYWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCUFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCwKKwlnZW9ncmFwaGljYWxJbmZvcm1hdGlvbglbMF0gR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdmxyLW51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWxvY2F0aW9uTnVtYmVyCVsyXSBMb2NhdGlvbk51bWJlcglPUFRJT05BTCwKKwljZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSQlbM10gQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlzZWxlY3RlZExTQS1JZAlbNV0gTFNBSWRlbnRpdHkJT1BUSU9OQUwsCisJbXNjLU51bWJlcglbNl0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWdlb2RldGljSW5mb3JtYXRpb24JWzddIEdlb2RldGljSW5mb3JtYXRpb24JT1BUSU9OQUwsIAorCWN1cnJlbnRMb2NhdGlvblJldHJpZXZlZAlbOF0gTlVMTAkJT1BUSU9OQUwsCisJc2FpLVByZXNlbnQJWzldIE5VTEwJCU9QVElPTkFMIH0KKy0tIHNhaS1QcmVzZW50IGluZGljYXRlcyB0aGF0IHRoZSBjZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSBwYXJhbWV0ZXIgY29udGFpbnMKKy0tIGEgU2VydmljZSBBcmVhIElkZW50aXR5LgorLS0gY3VycmVudExvY2F0aW9uUmV0cmlldmVkIHNoYWxsIGJlIHByZXNlbnQgCistLSBpZiB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gd2VyZSByZXRyaWV2ZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsbCBwYWdpbmcuCisKK0xvY2F0aW9uSW5mb3JtYXRpb25HUFJTIDo6PSBTRVFVRU5DRSB7CisJY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkJWzBdIENlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJIE9QVElPTkFMLAorCXJvdXRlaW5nQXJlYUlkZW50aXR5CVsxXSBSQUlkZW50aXR5CU9QVElPTkFMLAorCWdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCVsyXSBHZW9ncmFwaGljYWxJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlzZ3NuLU51bWJlcglbM10gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCXNlbGVjdGVkTFNBSWRlbnRpdHkJWzRdIExTQUlkZW50aXR5CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlzYWktUHJlc2VudAlbNl0gTlVMTAkJT1BUSU9OQUwsCisJZ2VvZGV0aWNJbmZvcm1hdGlvbglbN10gR2VvZGV0aWNJbmZvcm1hdGlvbglPUFRJT05BTCwKKwljdXJyZW50TG9jYXRpb25SZXRyaWV2ZWQJWzhdIE5VTEwJCU9QVElPTkFMLAorCWFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglbOV0gQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMIH0KKy0tIHNhaS1QcmVzZW50IGluZGljYXRlcyB0aGF0IHRoZSBjZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSBwYXJhbWV0ZXIgY29udGFpbnMKKy0tIGEgU2VydmljZSBBcmVhIElkZW50aXR5LgorLS0gY3VycmVudExvY2F0aW9uUmV0cmlldmVkIHNoYWxsIGJlIHByZXNlbnQgaWYgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uCistLSB3YXMgcmV0cmlldmVkIGFmdGVyIHN1Y2Nlc3NmdWwgcGFnaW5nLgorCitSQUlkZW50aXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDYpKQorLS0gUm91dGluZyBBcmVhIElkZW50aXR5IGlzIGNvZGVkIGluIGFjY29yZGFuY2Ugd2l0aCAzR1BQIFRTIDI5LjA2MCBbMTA1XS4KKy0tIEl0IHNoYWxsIGNvbnRhaW4gdGhlIHZhbHVlIHBhcnQgZGVmaW5lZCBpbiAzR1BQIFRTIDI5LjA2MCBvbmx5LiBJLmUuIHRoZSAzR1BQIFRTIDI5LjA2MAorLS0gdHlwZSBpZGVudGlmaWVyIG9jdGV0IHNoYWxsIG5vdCBiZSBpbmNsdWRlZC4KKworCitHZW9ncmFwaGljYWxJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg4KSkKKy0tCVJlZmVycyB0byBnZW9ncmFwaGljYWwgSW5mb3JtYXRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4KKy0tCU9ubHkgdGhlIGRlc2NyaXB0aW9uIG9mIGFuIGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZQorLS0JYXMgc3BlY2lmaWVkIGluIDNHUFAgVFMgMjMuMDMyIGlzIGFsbG93ZWQgdG8gYmUgdXNlZAorLS0JVGhlIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMy4wMzIgaXMgYXMgZm9sbG93czoKKy0tCQlUeXBlIG9mIHNoYXBlIChlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUpCTEgb2N0ZXQKKy0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCistLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKy0tCQlVbmNlcnRhaW50eSBjb2RlCQkJCTEgb2N0ZXQKKworR2VvZGV0aWNJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxMCkpCistLQlSZWZlcnMgdG8gQ2FsbGluZyBHZW9kZXRpYyBMb2NhdGlvbiBkZWZpbmVkIGluIFEuNzYzICgxOTk5KS4KKy0tCU9ubHkgdGhlIGRlc2NyaXB0aW9uIG9mIGFuIGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZQorLS0JYXMgc3BlY2lmaWVkIGluIFEuNzYzICgxOTk5KSBpcyBhbGxvd2VkIHRvIGJlIHVzZWQKKy0tCVRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIFEuNzYzICgxOTk5KSBpcyBhcyBmb2xsb3dzOgorLS0JCVNjcmVlbmluZyBhbmQgcHJlc2VudGF0aW9uIGluZGljYXRvcnMJCTEgb2N0ZXQKKy0tCQlUeXBlIG9mIHNoYXBlIChlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUpCTEgb2N0ZXQKKy0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCistLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKy0tCQlVbmNlcnRhaW50eSBjb2RlCQkJCTEgb2N0ZXQKKy0tCQlDb25maWRlbmNlCQkJCTEgb2N0ZXQKKworTG9jYXRpb25OdW1iZXIgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMi4uMTApKQorCS0tIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBJVFUtVCBSZWMgUS43NjMKKworU3Vic2NyaWJlclN0YXRlIDo6PSBDSE9JQ0UgeworCWFzc3VtZWRJZGxlCVswXSBOVUxMLAorCWNhbWVsQnVzeQkJWzFdIE5VTEwsCisJbmV0RGV0Tm90UmVhY2hhYmxlCU5vdFJlYWNoYWJsZVJlYXNvbiwKKwlub3RQcm92aWRlZEZyb21WTFIJWzJdIE5VTEx9CisKK1BTLVN1YnNjcmliZXJTdGF0ZSA6Oj0gQ0hPSUNFIHsKKwlub3RQcm92aWRlZEZyb21TR1NOCVswXSBOVUxMLAorCXBzLURldGFjaGVkCVsxXSBOVUxMLAorCXBzLUF0dGFjaGVkTm90UmVhY2hhYmxlRm9yUGFnaW5nCVsyXSBOVUxMLAorCXBzLUF0dGFjaGVkUmVhY2hhYmxlRm9yUGFnaW5nCVszXSBOVUxMLAorCXBzLVBEUC1BY3RpdmVOb3RSZWFjaGFibGVGb3JQYWdpbmcJWzRdIFBEUC1Db250ZXh0SW5mb0xpc3QsCisJcHMtUERQLUFjdGl2ZVJlYWNoYWJsZUZvclBhZ2luZwlbNV0gUERQLUNvbnRleHRJbmZvTGlzdCwKKwluZXREZXROb3RSZWFjaGFibGUJTm90UmVhY2hhYmxlUmVhc29uIH0KKworUERQLUNvbnRleHRJbmZvTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZQRFAtQ29udGV4dHMpIE9GCisJCQkJUERQLUNvbnRleHRJbmZvCisKK1BEUC1Db250ZXh0SW5mbyA6Oj0gU0VRVUVOQ0UgeworCXBkcC1Db250ZXh0SWRlbnRpZmllcglbMF0gQ29udGV4dElkLAorCXBkcC1Db250ZXh0QWN0aXZlCVsxXSBOVUxMCQlPUFRJT05BTCwKKwlwZHAtVHlwZQkJWzJdIFBEUC1UeXBlLAorCXBkcC1BZGRyZXNzCVszXSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlhcG4tU3Vic2NyaWJlZAlbNF0gQVBOCQlPUFRJT05BTCwKKwlhcG4tSW5Vc2UJCVs1XSBBUE4JCU9QVElPTkFMLAorCW5zYXBpCQlbNl0gTlNBUEkJCU9QVElPTkFMLAorCXRyYW5zYWN0aW9uSWQJWzddIFRyYW5zYWN0aW9uSWQJT1BUSU9OQUwsCisJdGVpZC1Gb3JHbkFuZEdwCVs4XSBURUlECQlPUFRJT05BTCwKKwl0ZWlkLUZvckl1CVs5XSBURUlECQlPUFRJT05BTCwKKwlnZ3NuLUFkZHJlc3MJWzEwXSBHU04tQWRkcmVzcyAJT1BUSU9OQUwsCisJcW9zLVN1YnNjcmliZWQJWzExXSBFeHQtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJcW9zLVJlcXVlc3RlZAlbMTJdIEV4dC1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwlxb3MtTmVnb3RpYXRlZAlbMTNdIEV4dC1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwljaGFyZ2luZ0lkCVsxNF0gR1BSU0NoYXJnaW5nSUQJT1BUSU9OQUwsCisJY2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJWzE1XSBDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcwlPUFRJT05BTCwKKwlybmMtQWRkcmVzcwlbMTZdIEdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMTddIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJcW9zMi1TdWJzY3JpYmVkCVsxOF0gRXh0Mi1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwktLSBxb3MyLVN1YnNjcmliZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MtU3Vic2NyaWJlZCBpcyBwcmVzZW50LgorCXFvczItUmVxdWVzdGVkCVsxOV0gRXh0Mi1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwktLSBxb3MyLVJlcXVlc3RlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvcy1SZXF1ZXN0ZWQgaXMgcHJlc2VudC4KKwlxb3MyLU5lZ290aWF0ZWQJWzIwXSBFeHQyLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIHFvczItTmVnb3RpYXRlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvcy1OZWdvdGlhdGVkIGlzIHByZXNlbnQuCisJCXFvczMtU3Vic2NyaWJlZAlbMjFdIEV4dDMtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMy1TdWJzY3JpYmVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zMi1TdWJzY3JpYmVkIGlzIHByZXNlbnQuCisJcW9zMy1SZXF1ZXN0ZWQJWzIyXSBFeHQzLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIHFvczMtUmVxdWVzdGVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zMi1SZXF1ZXN0ZWQgaXMgcHJlc2VudC4KKwlxb3MzLU5lZ290aWF0ZWQJWzIzXSBFeHQzLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMCisJLS0gcW9zMy1OZWdvdGlhdGVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zMi1OZWdvdGlhdGVkIGlzIHByZXNlbnQuCit9CisKK05TQVBJIDo6PSBJTlRFR0VSICgwLi4xNSkKKy0tCVRoaXMgdHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBOZXR3b3JrIGxheWVyIFNlcnZpY2UgQWNjZXNzIFBvaW50CisKK1RyYW5zYWN0aW9uSWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uMikpCistLQlUaGlzIHR5cGUgY2FycmllcyB0aGUgdmFsdWUgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24gaWRlbnRpZmllciB3aGljaCBpcyB1c2VkIGluIHRoZSAKKy0tCXNlc3Npb24gbWFuYWdlbWVudCBtZXNzYWdlcyBvbiB0aGUgYWNjZXNzIGludGVyZmFjZS4gVGhlIGVuY29kaW5nIGlzIGRlZmluZWQgaW4gCistLQkzR1BQIFRTIDI0LjAwOAorCitURUlEIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQpKQorLS0JVGhpcyB0eXBlIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIFR1bm5lbCBFbmRwb2ludCBJZGVudGlmaWVyIHdoaWNoIGlzIHVzZWQgdG8gCistLQlkaXN0aW5ndWlzaCBiZXR3ZWVuIGRpZmZlcmVudCB0dW5uZWxzIGJldHdlZW4gdGhlIHNhbWUgcGFpciBvZiBlbnRpdGllcyB3aGljaCBjb21tdW5pY2F0ZSAKKy0tCXVzaW5nIHRoZSBHUFJTIFR1bm5lbGxpbmcgUHJvdG9jb2wgVGhlIGVuY29kaW5nIGlzIGRlZmluZWQgaW4gM0dQUCBUUyAyOS4wNjAuCisKK0dQUlNDaGFyZ2luZ0lEIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQpKQorLS0JVGhlIENoYXJnaW5nIElEIGlzIGEgdW5pcXVlIGZvdXIgb2N0ZXQgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBHR1NOIHdoZW4gCistLQlhIFBEUCBDb250ZXh0IGlzIGFjdGl2YXRlZC4gQSBDaGFyZ2luZyBJRCBpcyBnZW5lcmF0ZWQgZm9yIGVhY2ggYWN0aXZhdGVkIGNvbnRleHQuCistLQlUaGUgZW5jb2RpbmcgaXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI5LjA2MC4KKworTm90UmVhY2hhYmxlUmVhc29uIDo6PSBFTlVNRVJBVEVEIHsKKwltc1B1cmdlZCAoMCksCisJaW1zaURldGFjaGVkICgxKSwKKwlyZXN0cmljdGVkQXJlYSAoMiksCisJbm90UmVnaXN0ZXJlZCAoMyl9CisKKy0tIGFueSB0aW1lIGludGVycm9nYXRpb24gaW5mbyB0eXBlcworCitBbnlUaW1lSW50ZXJyb2dhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJZGVudGl0eQlbMF0gU3Vic2NyaWJlcklkZW50aXR5LAorCXJlcXVlc3RlZEluZm8JWzFdIFJlcXVlc3RlZEluZm8sCisJZ3NtU0NGLUFkZHJlc3MJWzNdIElTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FueVRpbWVJbnRlcnJvZ2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJc3Vic2NyaWJlckluZm8JU3Vic2NyaWJlckluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKKy0tIGFueSB0aW1lIGluZm9ybWF0aW9uIGhhbmRsaW5nIHR5cGVzCisKK0FueVRpbWVTdWJzY3JpcHRpb25JbnRlcnJvZ2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJc3Vic2NyaWJlcklkZW50aXR5CVswXSBTdWJzY3JpYmVySWRlbnRpdHksCisJcmVxdWVzdGVkU3Vic2NyaXB0aW9uSW5mbwlbMV0gUmVxdWVzdGVkU3Vic2NyaXB0aW9uSW5mbywKKwlnc21TQ0YtQWRkcmVzcwlbMl0gSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCWxvbmdGVE4tU3VwcG9ydGVkCVs0XQlOVUxMCQlPUFRJT05BTCwKKwkuLi59CisKK0FueVRpbWVTdWJzY3JpcHRpb25JbnRlcnJvZ2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJY2FsbEZvcndhcmRpbmdEYXRhCVsxXSBDYWxsRm9yd2FyZGluZ0RhdGEJT1BUSU9OQUwsCisJY2FsbEJhcnJpbmdEYXRhCVsyXSBDYWxsQmFycmluZ0RhdGEJT1BUSU9OQUwsCisJb2RiLUluZm8JCVszXSBPREItSW5mbwlPUFRJT05BTCwKKwljYW1lbC1TdWJzY3JpcHRpb25JbmZvCVs0XSBDQU1FTC1TdWJzY3JpcHRpb25JbmZvCU9QVElPTkFMLAorCXN1cHBvcnRlZFZMUi1DQU1FTC1QaGFzZXMJWzVdIFN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAorCXN1cHBvcnRlZFNHU04tQ0FNRUwtUGhhc2VzCVs2XSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzddIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCW9mZmVyZWRDYW1lbDRDU0lzSW5WTFIJWzhdIE9mZmVyZWRDYW1lbDRDU0lzCU9QVElPTkFMLAorCW9mZmVyZWRDYW1lbDRDU0lzSW5TR1NOCVs5XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKKwltc2lzZG4tQlMtTGlzdAlbMTBdIE1TSVNETi1CUy1MaXN0CU9QVElPTkFMIH0KKworUmVxdWVzdGVkU3Vic2NyaXB0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXJlcXVlc3RlZFNTLUluZm8JWzFdIFNTLUZvckJTLUNvZGUJT1BUSU9OQUwsCisJb2RiCQkJWzJdIE5VTEwJCU9QVElPTkFMLAorCXJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8JWzNdIFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8JCU9QVElPTkFMLAorCXN1cHBvcnRlZFZMUi1DQU1FTC1QaGFzZXMJWzRdIE5VTEwJCU9QVElPTkFMLAorCXN1cHBvcnRlZFNHU04tQ0FNRUwtUGhhc2VzCVs1XSBOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzZdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8KKwkJCQlbN10gQWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8KKwkJCQkJCQlPUFRJT05BTCwKKwltc2lzZG4tQlMtTGlzdAlbOF0gTlVMTAkJT1BUSU9OQUwgfQorCitNU0lTRE4tQlMtTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZNU0lTRE4pIE9GCisJCQkJTVNJU0ROLUJTCisKK21heE51bU9mTVNJU0ROICBJTlRFR0VSIDo6PSA1MAorCisKK01TSVNETi1CUyA6Oj0gU0VRVUVOQ0UgeworCW1zaXNkbgkJCUlTRE4tQWRkcmVzc1N0cmluZywJCisJYmFzaWNTZXJ2aWNlTGlzdAlbMF0JQmFzaWNTZXJ2aWNlTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1JlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8gOjo9IEVOVU1FUkFURUQgeworCW8tQ1NJCQkoMCksCisJdC1DU0kJCSgxKSwKKwl2dC1DU0kJCSgyKSwKKwl0aWYtQ1NJCQkoMyksCisJZ3Bycy1DU0kJCSg0KSwKKwltby1zbXMtQ1NJCSg1KSwKKwlzcy1DU0kJCSg2KSwKKwltLUNTSQkJKDcpLAorCWQtY3NpCQkoOCl9CisKK0FkZGl0aW9uYWxSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvIDo6PSBFTlVNRVJBVEVEIHsKKwltdC1zbXMtQ1NJCSgwKSwKKwltZy1jc2kJCSgxKSwKKwlvLUlNLUNTSSAJCSgyKSwKKwlkLUlNLUNTSQkJKDMpLAorCXZ0LUlNLUNTSQkgCSg0KSwKKwkuLi59CistLQlleGNlcHRpb24gaGFuZGxpbmc6IHVua25vd24gdmFsdWVzIHNoYWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgcmVjZWl2ZXIuCisKK0NhbGxGb3J3YXJkaW5nRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWZvcndhcmRpbmdGZWF0dXJlTGlzdAlFeHQtRm9yd0ZlYXR1cmVMaXN0LAorCW5vdGlmaWNhdGlvblRvQ1NFCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NhbGxCYXJyaW5nRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNhbGxCYXJyaW5nRmVhdHVyZUxpc3QJRXh0LUNhbGxCYXJGZWF0dXJlTGlzdCwKKwlwYXNzd29yZAkJUGFzc3dvcmQJCU9QVElPTkFMLAorCXdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJV3JvbmdQYXNzd29yZEF0dGVtcHRzQ291bnRlcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1dyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIgOjo9IElOVEVHRVIgKDAuLjQpCisKK09EQi1JbmZvIDo6PSBTRVFVRU5DRSB7CisJb2RiLURhdGEJCU9EQi1EYXRhLAorCW5vdGlmaWNhdGlvblRvQ1NFCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCW8tQ1NJCQlbMF0JTy1DU0kJT1BUSU9OQUwsCisJby1CY3NtQ2FtZWxURFAtQ3JpdGVyaWFMaXN0CVsxXQlPLUJjc21DYW1lbFREUENyaXRlcmlhTGlzdAlPUFRJT05BTCwgCisJZC1DU0kJCVsyXQlELUNTSQlPUFRJT05BTCwKKwl0LUNTSQkJWzNdCVQtQ1NJCU9QVElPTkFMLAorCXQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CVs0XQlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwl2dC1DU0kJCVs1XQlULUNTSQlPUFRJT05BTCwKKwl2dC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJWzZdCVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCXRpZi1DU0kJCVs3XQlOVUxMCQlPUFRJT05BTCwKKwl0aWYtQ1NJLU5vdGlmaWNhdGlvblRvQ1NFCVs4XQlOVUxMCQlPUFRJT05BTCwKKwlncHJzLUNTSQkJWzldCUdQUlMtQ1NJCU9QVElPTkFMLAorCW1vLXNtcy1DU0kJWzEwXQlTTVMtQ1NJCU9QVElPTkFMLAorCXNzLUNTSQkJWzExXQlTUy1DU0kJT1BUSU9OQUwsCisJbS1DU0kJCVsxMl0JTS1DU0kJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxM10JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlzcGVjaWZpY0NTSURlbGV0ZWRMaXN0CVsxNF0JU3BlY2lmaWNDU0ktV2l0aGRyYXcJT1BUSU9OQUwsCisJbXQtc21zLUNTSQlbMTVdCVNNUy1DU0kJT1BUSU9OQUwsCisJbXQtc21zQ0FNRUxURFAtQ3JpdGVyaWFMaXN0CVsxNl0JTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCW1nLWNzaQkJWzE3XQlNRy1DU0kJT1BUSU9OQUwsCisJby1JTS1DU0kJCVsxOF0gTy1DU0kJT1BUSU9OQUwsCisJby1JTS1CY3NtQ2FtZWxURFAtQ3JpdGVyaWFMaXN0CVsxOV0gTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJZC1JTS1DU0kJCVsyMF0gRC1DU0kJT1BUSU9OQUwsCisJdnQtSU0tQ1NJCQlbMjFdIFQtQ1NJCU9QVElPTkFMLAorCXZ0LUlNLUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlbMjJdCVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CU9QVElPTkFMCisJfQorCitBbnlUaW1lTW9kaWZpY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJc3Vic2NyaWJlcklkZW50aXR5CVswXQlTdWJzY3JpYmVySWRlbnRpdHksCisJZ3NtU0NGLUFkZHJlc3MJWzFdCUlTRE4tQWRkcmVzc1N0cmluZywKKwltb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNGLUluZm8JWzJdCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0YtSW5mbyBPUFRJT05BTCwKKwltb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNCLUluZm8JWzNdCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0ItSW5mbyBPUFRJT05BTCwKKwltb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNTSQlbNF0JTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DU0kJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs1XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJbG9uZ0ZUTi1TdXBwb3J0ZWQJWzZdCU5VTEwJCU9QVElPTkFMLAorCS4uLiwKKwltb2RpZmljYXRpb25SZXF1ZXN0Rm9yLU9EQi1kYXRhCVs3XQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLU9EQi1kYXRhIE9QVElPTkFMLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItSVAtU00tR1ctRGF0YQlbOF0JTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1JUC1TTS1HVy1EYXRhIE9QVElPTkFMIH0KKworQW55VGltZU1vZGlmaWNhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCXNzLUluZm9Gb3ItQ1NFCVswXQlFeHQtU1MtSW5mb0Zvci1DU0UJT1BUSU9OQUwsCisJY2FtZWwtU3Vic2NyaXB0aW9uSW5mbwlbMV0JQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJb2RiLUluZm8JCVszXQlPREItSW5mbwlPUFRJT05BTCB9CisKK01vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0YtSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWJhc2ljU2VydmljZQlbMV0JRXh0LUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbMl0JRXh0LVNTLVN0YXR1cwlPUFRJT05BTCwKKwlmb3J3YXJkZWRUb051bWJlcglbM10JQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlmb3J3YXJkZWRUb1N1YmFkZHJlc3MJWzRdCUlTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlub1JlcGx5Q29uZGl0aW9uVGltZQlbNV0JRXh0LU5vUmVwQ29uZFRpbWUJT1BUSU9OQUwsCisJbW9kaWZ5Tm90aWZpY2F0aW9uVG9DU0UJWzZdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbN10JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DQi1JbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJYmFzaWNTZXJ2aWNlCVsxXQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVsyXQlFeHQtU1MtU3RhdHVzCU9QVElPTkFMLAorCXBhc3N3b3JkCQlbM10JUGFzc3dvcmQJT1BUSU9OQUwsCisJd3JvbmdQYXNzd29yZEF0dGVtcHRzQ291bnRlcglbNF0JV3JvbmdQYXNzd29yZEF0dGVtcHRzQ291bnRlcglPUFRJT05BTCwKKwltb2RpZnlOb3RpZmljYXRpb25Ub0NTRQlbNV0JTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLU9EQi1kYXRhIDo6PSBTRVFVRU5DRSB7CisJb2RiLWRhdGEJCVswXQlPREItRGF0YQlPUFRJT05BTCwKKwltb2RpZnlOb3RpZmljYXRpb25Ub0NTRQlbMV0JTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNTSSA6Oj0gU0VRVUVOQ0UgeworCXJlcXVlc3RlZENhbWVsLVN1YnNjcmlwdGlvbkluZm8JWzBdCVJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8sCisJbW9kaWZ5Tm90aWZpY2F0aW9uVG9DU0UJWzFdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCW1vZGlmeUNTSS1TdGF0ZQlbMl0JTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCisJCQkJWzRdIEFkZGl0aW9uYWxSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCisJCQkJCQkJT1BUSU9OQUwgfQorLS0gcmVxdWVzdGVkQ2FtZWwtU3Vic2NyaXB0aW9uSW5mbyBzaGFsbCBiZSBkaXNjYXJkZWQgaWYKKy0tIGFkZGl0aW9uYWxSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvIGlzIHJlY2VpdmVkCisKK01vZGlmaWNhdGlvblJlcXVlc3RGb3ItSVAtU00tR1ctRGF0YSA6Oj0gU0VRVUVOQ0UgeworCW1vZGlmeVJlZ2lzdHJhdGlvblN0YXR1cwlbMF0JTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNb2RpZmljYXRpb25JbnN0cnVjdGlvbiA6Oj0gRU5VTUVSQVRFRCB7CisJZGVhY3RpdmF0ZQkoMCksCisJYWN0aXZhdGUJCSgxKX0KKworLS0gc3Vic2NyaWJlciBkYXRhIG1vZGlmaWNhdGlvbiBub3RpZmljYXRpb24gdHlwZXMKKworTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWRBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwltc2lzZG4JCUlTRE4tQWRkcmVzc1N0cmluZywKKwlmb3J3YXJkaW5nSW5mb0Zvci1DU0UJWzBdIEV4dC1Gb3J3YXJkaW5nSW5mb0Zvci1DU0UJT1BUSU9OQUwsCisJY2FsbEJhcnJpbmdJbmZvRm9yLUNTRQlbMV0gRXh0LUNhbGxCYXJyaW5nSW5mb0Zvci1DU0UJT1BUSU9OQUwsCisJb2RiLUluZm8JCVsyXSBPREItSW5mbwlPUFRJT05BTCwKKwljYW1lbC1TdWJzY3JpcHRpb25JbmZvCVszXSBDQU1FTC1TdWJzY3JpcHRpb25JbmZvCU9QVElPTkFMLAorCWFsbEluZm9ybWF0aW9uU2VudAlbNF0gTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK05vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKKy0tIG1vYmlsaXR5IG1hbmFnZW1lbnQgZXZlbnQgbm90aWZpY2F0aW9vbiBpbmZvIHR5cGVzCisKK05vdGVNTS1FdmVudEFyZzo6PSBTRVFVRU5DRSB7CisJc2VydmljZUtleQlTZXJ2aWNlS2V5LAorCWV2ZW50TWV0CQlbMF0JTU0tQ29kZSwKKwlpbXNpCQkJWzFdCUlNU0ksCisJbXNpc2RuCQlbMl0JSVNETi1BZGRyZXNzU3RyaW5nLAorCWxvY2F0aW9uSW5mb3JtYXRpb24JWzNdCUxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJc3VwcG9ydGVkQ0FNRUxQaGFzZXMJWzVdCVN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlsb2NhdGlvbkluZm9ybWF0aW9uR1BSUwlbN10JTG9jYXRpb25JbmZvcm1hdGlvbkdQUlMJT1BUSU9OQUwsCisJb2ZmZXJlZENhbWVsNEZ1bmN0aW9uYWxpdGllcwlbOF0gT2ZmZXJlZENhbWVsNEZ1bmN0aW9uYWxpdGllcwlPUFRJT05BTAorfQorCitOb3RlTU0tRXZlbnRSZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK0V4dC1TUy1JbmZvRm9yLUNTRSA6Oj0gQ0hPSUNFIHsKKwlmb3J3YXJkaW5nSW5mb0Zvci1DU0UJWzBdIEV4dC1Gb3J3YXJkaW5nSW5mb0Zvci1DU0UsCisJY2FsbEJhcnJpbmdJbmZvRm9yLUNTRQlbMV0gRXh0LUNhbGxCYXJyaW5nSW5mb0Zvci1DU0UKKwl9CisKK0V4dC1Gb3J3YXJkaW5nSW5mb0Zvci1DU0UgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJWzFdCUV4dC1Gb3J3RmVhdHVyZUxpc3QsCisJbm90aWZpY2F0aW9uVG9DU0UJWzJdCU5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRXh0LUNhbGxCYXJyaW5nSW5mb0Zvci1DU0UgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwljYWxsQmFycmluZ0ZlYXR1cmVMaXN0CVsxXQlFeHQtQ2FsbEJhckZlYXR1cmVMaXN0LAorCXBhc3N3b3JkCQlbMl0JUGFzc3dvcmQJT1BUSU9OQUwsCisJd3JvbmdQYXNzd29yZEF0dGVtcHRzQ291bnRlcglbM10JV3JvbmdQYXNzd29yZEF0dGVtcHRzQ291bnRlcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbNF0JTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs1XQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLn0KKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU9NLURhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1PTS1EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNGRkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1PTS1EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsMjE2IEBACistLSAkSWQ6IE1BUC1PTS1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAxNy43LjIJT3BlcmF0aW9uIGFuZCBtYWludGVuYW5jZSBkYXRhIHR5cGVzCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpCisgCitNQVAtT00tRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLU9NLURhdGFUeXBlcyAoMTIpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisJQWN0aXZhdGVUcmFjZU1vZGVBcmcsCisJQWN0aXZhdGVUcmFjZU1vZGVSZXMsCisJRGVhY3RpdmF0ZVRyYWNlTW9kZUFyZywKKwlEZWFjdGl2YXRlVHJhY2VNb2RlUmVzLAorCVRyYWNlUHJvcGFnYXRpb25MaXN0Cis7CisKK0lNUE9SVFMKKwlBZGRyZXNzU3RyaW5nLAorCUlNU0kKK0ZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorCis7CisKK0FjdGl2YXRlVHJhY2VNb2RlQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJCQlPUFRJT05BTCwKKwl0cmFjZVJlZmVyZW5jZQlbMV0gVHJhY2VSZWZlcmVuY2UsCisJdHJhY2VUeXBlCQlbMl0gVHJhY2VUeXBlLAorCW9tYy1JZAkJWzNdIEFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXRyYWNlUmVmZXJlbmNlMglbNV0gVHJhY2VSZWZlcmVuY2UyCU9QVElPTkFMLAorCXRyYWNlRGVwdGhMaXN0CVs2XSBUcmFjZURlcHRoTGlzdAlPUFRJT05BTCwKKwl0cmFjZU5FLVR5cGVMaXN0CVs3XSBUcmFjZU5FLVR5cGVMaXN0CU9QVElPTkFMLAorCXRyYWNlSW50ZXJmYWNlTGlzdAlbOF0gVHJhY2VJbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCXRyYWNlRXZlbnRMaXN0CVs5XSBUcmFjZUV2ZW50TGlzdAlPUFRJT05BTAorCX0KKworVHJhY2VSZWZlcmVuY2UgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uMikpCisKK1RyYWNlUmVmZXJlbmNlMiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKworVHJhY2VSZWNvcmRpbmdTZXNzaW9uUmVmZXJlbmNlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIpKQorCitUcmFjZVR5cGUgOjo9IElOVEVHRVIKKwkoMC4uMjU1KQorCS0tIFRyYWNlIHR5cGVzIGFyZSBmdWxseSBkZWZpbmVkIGluICAzR1BQIFRTIDUyLjAwOC4gWzYxXQorCitUcmFjZURlcHRoTGlzdCA6Oj0gU0VRVUVOQ0UgeworCW1zYy1zLVRyYWNlRGVwdGgJWzBdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJbWd3LVRyYWNlRGVwdGgJWzFdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJc2dzbi1UcmFjZURlcHRoCVsyXSBUcmFjZURlcHRoCU9QVElPTkFMLAorCWdnc24tVHJhY2VEZXB0aAlbM10gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwlybmMtVHJhY2VEZXB0aAlbNF0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwlibXNjLVRyYWNlRGVwdGgJWzVdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJLi4ufQorCitUcmFjZURlcHRoIDo6PSBFTlVNRVJBVEVEIHsKKwltaW5pbXVtICgwKSwKKwltZWRpdW0gKDEpLAorCW1heGltdW0gKDIpLAorCS4uLn0KKy0tIFRoZSB2YWx1ZSBtZWRpdW0gaXMgYXBwbGljYWJsZSBvbmx5IGZvciBSTkMuIEZvciBvdGhlciBuZXR3b3JrIGVsZW1lbnRzLCBpZiB2YWx1ZSBtZWRpdW0KKy0tIGlzIHJlY2VpdmVkLCB2YWx1ZSBtaW5pbXVtIHNoYWxsIGJlIGFwcGxpZWQuCisKK1RyYWNlTkUtVHlwZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCW1zYy1zICgwKSwKKwltZ3cgKDEpLAorCXNnc24gKDIpLAorCWdnc24gKDMpLAorCXJuYyAoNCksCisJYm0tc2MgKDUpfSAoU0laRSAoNi4uMTYpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1RyYWNlSW50ZXJmYWNlTGlzdCA6Oj0gU0VRVUVOQ0UgeworCW1zYy1zLUxpc3QJWzBdIE1TQy1TLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJbWd3LUxpc3QJCVsxXSBNR1ctSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwlzZ3NuLUxpc3QJCVsyXSBTR1NOLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJZ2dzbi1MaXN0CQlbM10gR0dTTi1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCXJuYy1MaXN0CQlbNF0gUk5DLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJYm1zYy1MaXN0CQlbNV0gQk1TQy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCS4uLn0KKworTVNDLVMtSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJYSAoMCksCisJaXUgKDEpLAorCW1jICgyKSwKKwltYXAtZyAoMyksCisJbWFwLWIgKDQpLAorCW1hcC1lICg1KSwKKwltYXAtZiAoNiksCisJY2FwICg3KSwKKwltYXAtZCAoOCksCisJbWFwLWMgKDkpfSAoU0laRSAoMTAuLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitNR1ctSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJbWMgKDApLAorCW5iLXVwICgxKSwKKwlpdS11cCAoMil9IChTSVpFICgzLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitTR1NOLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCWdiICgwKSwKKwlpdSAoMSksCisJZ24gKDIpLAorCW1hcC1nciAoMyksCisJbWFwLWdkICg0KSwKKwltYXAtZ2YgKDUpLAorCWdzICg2KSwKKwlnZSAoNyl9IChTSVpFICg4Li4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworR0dTTi1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlnbiAoMCksCisJZ2kgKDEpLAorCWdtYiAoMil9IChTSVpFICgzLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitSTkMtSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJaXUgKDApLAorCWl1ciAoMSksCisJaXViICgyKSwKKwl1dSAoMyl9IChTSVpFICg0Li44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitCTVNDLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCWdtYiAoMCl9IChTSVpFICgxLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitUcmFjZUV2ZW50TGlzdCA6Oj0gU0VRVUVOQ0UgeworCW1zYy1zLUxpc3QJWzBdIE1TQy1TLUV2ZW50TGlzdAlPUFRJT05BTCwKKwltZ3ctTGlzdAkJWzFdIE1HVy1FdmVudExpc3QJT1BUSU9OQUwsCisJc2dzbi1MaXN0CQlbMl0gU0dTTi1FdmVudExpc3QJT1BUSU9OQUwsCisJZ2dzbi1MaXN0CQlbM10gR0dTTi1FdmVudExpc3QJT1BUSU9OQUwsCisJYm1zYy1MaXN0CQlbNF0gQk1TQy1FdmVudExpc3QJT1BUSU9OQUwsCisJLi4ufQorCitNU0MtUy1FdmVudExpc3QgOjo9IEJJVCBTVFJJTkcgeworCW1vLW10Q2FsbCAoMCksCisJbW8tbXQtc21zICgxKSwKKwlsdS1pbXNpQXR0YWNoLWltc2lEZXRhY2ggKDIpLAorCWhhbmRvdmVycyAoMyksCisJc3MgKDQpfSAoU0laRSAoNS4uMTYpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK01HVy1FdmVudExpc3QgOjo9IEJJVCBTVFJJTkcgeworCWNvbnRleHQgKDApfSAoU0laRSAoMS4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworU0dTTi1FdmVudExpc3QgOjo9IEJJVCBTVFJJTkcgeworCXBkcENvbnRleHQgKDApLAorCW1vLW10LXNtcyAoMSksCisJcmF1LWdwcnNBdHRhY2gtZ3Byc0RldGFjaCAoMiksCisJbWJtc0NvbnRleHQgKDMpfSAoU0laRSAoNC4uMTYpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0dHU04tRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlwZHBDb250ZXh0ICgwKSwKKwltYm1zQ29udGV4dCAoMSl9IChTSVpFICgyLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitCTVNDLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJbWJtc011bHRpY2FzdFNlcnZpY2VBY3RpdmF0aW9uICgwKX0gKFNJWkUgKDEuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKKworVHJhY2VQcm9wYWdhdGlvbkxpc3QgOjo9IFNFUVVFTkNFIHsKKwl0cmFjZVJlZmVyZW5jZQlbMF0gVHJhY2VSZWZlcmVuY2UJT1BUSU9OQUwsCisJdHJhY2VUeXBlCQlbMV0gVHJhY2VUeXBlCU9QVElPTkFMLAorCXRyYWNlUmVmZXJlbmNlMglbMl0gVHJhY2VSZWZlcmVuY2UyCU9QVElPTkFMLAorCXRyYWNlUmVjb3JkaW5nU2Vzc2lvblJlZmVyZW5jZQlbM10gVHJhY2VSZWNvcmRpbmdTZXNzaW9uUmVmZXJlbmNlIE9QVElPTkFMLAorCXJuYy1UcmFjZURlcHRoCVs0XSBUcmFjZURlcHRoCU9QVElPTkFMLAorCXJuYy1JbnRlcmZhY2VMaXN0CVs1XSBSTkMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwltc2Mtcy1UcmFjZURlcHRoCVs2XSBUcmFjZURlcHRoCU9QVElPTkFMLAorCW1zYy1zLUludGVyZmFjZUxpc3QJWzddIE1TQy1TLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJbXNjLXMtRXZlbnRMaXN0CVs4XSBNU0MtUy1FdmVudExpc3QJT1BUSU9OQUwsCisJbWd3LVRyYWNlRGVwdGgJWzldIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJbWd3LUludGVyZmFjZUxpc3QJWzEwXSBNR1ctSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwltZ3ctRXZlbnRMaXN0CVsxMV0gTUdXLUV2ZW50TGlzdAlPUFRJT05BTCwKKwkuLi59CisKK0FjdGl2YXRlVHJhY2VNb2RlUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXRyYWNlU3VwcG9ydEluZGljYXRvcglbMV0JTlVMTAkJT1BUSU9OQUwKKwl9CisKK0RlYWN0aXZhdGVUcmFjZU1vZGVBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJWzBdIElNU0kJCU9QVElPTkFMLAorCXRyYWNlUmVmZXJlbmNlCVsxXSBUcmFjZVJlZmVyZW5jZSwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdHJhY2VSZWZlcmVuY2UyCVszXSBUcmFjZVJlZmVyZW5jZTIJT1BUSU9OQUwKKwl9CisKK0RlYWN0aXZhdGVUcmFjZU1vZGVSZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TTS1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU00tRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWY5NDFmCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU00tRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDI3MCBAQAorLS0gJElkOiBNQVAtU00tRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgIFY4LjkuMCAoMjAwOS0wNCkgIAorLS0gMTcuNy42CVNob3J0IG1lc3NhZ2UgZGF0YSB0eXBlcworCitNQVAtU00tRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNNLURhdGFUeXBlcyAoMTYpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisJUm91dGluZ0luZm9Gb3JTTS1BcmcsCisJUm91dGluZ0luZm9Gb3JTTS1SZXMsCisJTU8tRm9yd2FyZFNNLUFyZywKKwlNTy1Gb3J3YXJkU00tUmVzLAorCU1ULUZvcndhcmRTTS1BcmcsCisJTVQtRm9yd2FyZFNNLVJlcywKKwlSZXBvcnRTTS1EZWxpdmVyeVN0YXR1c0FyZywKKwlSZXBvcnRTTS1EZWxpdmVyeVN0YXR1c1JlcywKKwlBbGVydFNlcnZpY2VDZW50cmVBcmcsCisJSW5mb3JtU2VydmljZUNlbnRyZUFyZywKKwlSZWFkeUZvclNNLUFyZywgCisJUmVhZHlGb3JTTS1SZXMsCisJU00tRGVsaXZlcnlPdXRjb21lLAorCUFsZXJ0UmVhc29uLAorCUFkZGl0aW9uYWwtTnVtYmVyLAorCU1ULUZvcndhcmRTTS1WR0NTLUFyZywKKwlNVC1Gb3J3YXJkU00tVkdDUy1SZXMKKzsKKworSU1QT1JUUworCUFkZHJlc3NTdHJpbmcsCisJSVNETi1BZGRyZXNzU3RyaW5nLAorCVNpZ25hbEluZm8sCisJSU1TSSwKKwlMTVNJLAorCUFTQ0ktQ2FsbFJlZmVyZW5jZQorCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCitGUk9NIE1BUC1FUi1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRVItRGF0YVR5cGVzICgxNykgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKzsKKworCitSb3V0aW5nSW5mb0ZvclNNLUFyZyA6Oj0gU0VRVUVOQ0UgeworCW1zaXNkbgkJWzBdIElTRE4tQWRkcmVzc1N0cmluZywKKwlzbS1SUC1QUkkJCVsxXSBCT09MRUFOLAorCXNlcnZpY2VDZW50cmVBZGRyZXNzCVsyXSBBZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJZ3Byc1N1cHBvcnRJbmRpY2F0b3IJWzddCU5VTEwJCU9QVElPTkFMLAorCS0tIGdwcnNTdXBwb3J0SW5kaWNhdG9yIGlzIHNldCBvbmx5IGlmIHRoZSBTTVMtR01TQyBzdXBwb3J0cworCS0tIHJlY2VpdmluZyBvZiB0d28gbnVtYmVycyBmcm9tIHRoZSBITFIKKwlzbS1SUC1NVEkJCVs4XSBTTS1SUC1NVEkJT1BUSU9OQUwsCisJc20tUlAtU01FQQlbOV0gU00tUlAtU01FQQlPUFRJT05BTCwKKwlzbS1kZWxpdmVyeU5vdEludGVuZGVkCVsxMF0gU00tRGVsaXZlcnlOb3RJbnRlbmRlZAlPUFRJT05BTCB9CisKK1NNLURlbGl2ZXJ5Tm90SW50ZW5kZWQgOjo9IEVOVU1FUkFURUQgeworCW9ubHlJTVNJLXJlcXVlc3RlZCAgKDApLAorCW9ubHlNQ0MtTU5DLXJlcXVlc3RlZCAgKDEpLAorCS4uLn0KKworU00tUlAtTVRJIDo6PSBJTlRFR0VSICgwLi4xMCkKKwktLSAwIFNNUyBEZWxpdmVyIAorCS0tIDEgU01TIFN0YXR1cyBSZXBvcnQKKwktLSBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBzaGFsbCBiZSBkaXNjYXJkZWQgaWYKKwktLSByZWNlaXZlZAorCitTTS1SUC1TTUVBIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjEyKSkKKwktLSB0aGlzIHBhcmFtZXRlciBjb250YWlucyBhbiBhZGRyZXNzIGZpZWxkIHdoaWNoIGlzIGVuY29kZWQgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjA0MC4gQW4gYWRkcmVzcyBmaWVsZCBjb250YWlucyAzIGVsZW1lbnRzIDoKKwktLSAJCWFkZHJlc3MtbGVuZ3RoCisJLS0gCQl0eXBlLW9mLWFkZHJlc3MKKwktLSAJCWFkZHJlc3MtdmFsdWUKKworUm91dGluZ0luZm9Gb3JTTS1SZXMgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwlsb2NhdGlvbkluZm9XaXRoTE1TSQlbMF0gTG9jYXRpb25JbmZvV2l0aExNU0ksCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitMb2NhdGlvbkluZm9XaXRoTE1TSSA6Oj0gU0VRVUVOQ0UgeworCW5ldHdvcmtOb2RlLU51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nLAorCWxtc2kJCQlMTVNJCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZ3Byc05vZGVJbmRpY2F0b3IJWzVdCU5VTEwJCU9QVElPTkFMLAorCS0tIGdwcnNOb2RlSW5kaWNhdG9yIGlzIHNldCBvbmx5IGlmIHRoZSBTR1NOIG51bWJlciBpcyBzZW50IGFzIHRoZSAKKwktLSBOZXR3b3JrIE5vZGUgTnVtYmVyCisJYWRkaXRpb25hbC1OdW1iZXIJWzZdIEFkZGl0aW9uYWwtTnVtYmVyCU9QVElPTkFMIAorCS0tIE5ldHdvcmtOb2RlLW51bWJlciBjYW4gYmUgZWl0aGVyIG1zYy1udW1iZXIgb3Igc2dzbi1udW1iZXIgb3IgSVAtU00tR1cKKwktLSBudW1iZXIgb3IgU01TIFJvdXRlciBudW1iZXIKKwl9CisKK0FkZGl0aW9uYWwtTnVtYmVyIDo6PSBDSE9JQ0UgeworCW1zYy1OdW1iZXIJWzBdIElTRE4tQWRkcmVzc1N0cmluZywKKwlzZ3NuLU51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nfQorCS0tIGFkZGl0aW9uYWwtbnVtYmVyIGNhbiBiZSBlaXRoZXIgbXNjLW51bWJlciBvciBzZ3NuLW51bWJlcgorCS0tIGlmIHJlY2VpdmVkIG5ldHdvcmtOb2RlLW51bWJlciBpcyBtc2MtbnVtYmVyIHRoZW4gdGhlIAkKKwktLSBhZGRpdGlvbmFsIG51bWJlciBpcyBzZ3NuLW51bWJlciAKKwktLSBpZiByZWNlaXZlZCBuZXR3b3JrTm9kZS1udW1iZXIgaXMgc2dzbi1udW1iZXIgdGhlbiB0aGUgCisJLS0gYWRkaXRpb25hbCBudW1iZXIgaXMgbXNjLW51bWJlciAKKworTU8tRm9yd2FyZFNNLUFyZyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLURBCQlTTS1SUC1EQSwKKwlzbS1SUC1PQQkJU00tUlAtT0EsCisJc20tUlAtVUkJCVNpZ25hbEluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWltc2kJCQlJTVNJIAkJT1BUSU9OQUwgfQorCitNTy1Gb3J3YXJkU00tUmVzIDo6PSBTRVFVRU5DRSB7CisJc20tUlAtVUkJCVNpZ25hbEluZm8gCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNVC1Gb3J3YXJkU00tQXJnIDo6PSBTRVFVRU5DRSB7CisJc20tUlAtREEJCVNNLVJQLURBLAorCXNtLVJQLU9BCQlTTS1SUC1PQSwKKwlzbS1SUC1VSQkJU2lnbmFsSW5mbywKKwltb3JlTWVzc2FnZXNUb1NlbmQJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNVC1Gb3J3YXJkU00tUmVzIDo6PSBTRVFVRU5DRSB7CisJc20tUlAtVUkJCVNpZ25hbEluZm8JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1NNLVJQLURBIDo6PSBDSE9JQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwlsbXNpCQkJWzFdIExNU0ksCisJc2VydmljZUNlbnRyZUFkZHJlc3NEQQlbNF0gQWRkcmVzc1N0cmluZywKKwlub1NNLVJQLURBCVs1XSBOVUxMfQorCitTTS1SUC1PQSA6Oj0gQ0hPSUNFIHsKKwltc2lzZG4JCVsyXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2VydmljZUNlbnRyZUFkZHJlc3NPQQlbNF0gQWRkcmVzc1N0cmluZywKKwlub1NNLVJQLU9BCVs1XSBOVUxMfQorCitSZXBvcnRTTS1EZWxpdmVyeVN0YXR1c0FyZyA6Oj0gU0VRVUVOQ0UgeworCW1zaXNkbgkJSVNETi1BZGRyZXNzU3RyaW5nLAorCXNlcnZpY2VDZW50cmVBZGRyZXNzCUFkZHJlc3NTdHJpbmcsCisJc20tRGVsaXZlcnlPdXRjb21lCVNNLURlbGl2ZXJ5T3V0Y29tZSwKKwlhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCVswXSBBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCisJCQkJCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWdwcnNTdXBwb3J0SW5kaWNhdG9yCVsyXQlOVUxMCQlPUFRJT05BTCwKKwktLSBncHJzU3VwcG9ydEluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUgU01TLUdNU0Mgc3VwcG9ydHMgCisJLS0gaGFuZGxpbmcgb2YgdHdvIGRlbGl2ZXJ5IG91dGNvbWVzCisJZGVsaXZlcnlPdXRjb21lSW5kaWNhdG9yCVszXSAJTlVMTAkJT1BUSU9OQUwsCisJLS0gRGVsaXZlcnlPdXRjb21lSW5kaWNhdG9yIGlzIHNldCB3aGVuIHRoZSBTTS1EZWxpdmVyeU91dGNvbWUKKwktLSBpcyBmb3IgR1BSUworCWFkZGl0aW9uYWxTTS1EZWxpdmVyeU91dGNvbWUJWzRdIAlTTS1EZWxpdmVyeU91dGNvbWUgCU9QVElPTkFMLAorCS0tIElmIHJlY2VpdmVkLCBhZGRpdGlvbmFsU00tRGVsaXZlcnlPdXRjb21lIGlzIGZvciBHUFJTCisJLS0gSWYgRGVsaXZlcnlPdXRjb21lSW5kaWNhdG9yIGlzIHNldCwgdGhlbiBBZGRpdGlvbmFsU00tRGVsaXZlcnlPdXRjb21lIHNoYWxsIGJlIGFic2VudAorCWFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCVs1XSAJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBPUFRJT05BTCwKKwktLSBJZiByZWNlaXZlZCBhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBmb3IgR1BSUworCS0tIElmIERlbGl2ZXJ5T3V0Y29tZUluZGljYXRvciBpcyBzZXQsIHRoZW4gQWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gCisJLS0gc2hhbGwgYmUgYWJzZW50CisJaXAtc20tZ3ctSW5kaWNhdG9yCVs2XSAJTlVMTAkJT1BUSU9OQUwsCisJLS0gdGhlIGlwLXNtLWd3IGluZGljYXRvciBpbmRpY2F0ZXMgYnkgaXRzIHByZXNlbmNlIHRoYXQgc20tZGVsaXZlcnlPdXRjb21lCisJLS0gaXMgZm9yIGRlbGl2ZXJ5IHZpYSBJTVMKKwktLSBJZiBwcmVzZW50LCBkZWxpdmVyeU91dGNvbWVJbmRpY2F0b3Igc2hhbGwgYmUgYWJzZW50LgorCWlwLXNtLWd3LXNtLWRlbGl2ZXJ5T3V0Y29tZQlbN10gCVNNLURlbGl2ZXJ5T3V0Y29tZQlPUFRJT05BTCwgCisJLS0gSWYgcmVjZWl2ZWQgaXAtc20tZ3ctc20tZGVsaXZlcnlPdXRjb21lIGlzIGZvciBkZWxpdmVyeSB2aWEgSU1TCisJLS0gSWYgaXAtc20tZ3ctSW5kaWNhdG9yIGlzIHNldCwgdGhlbiBpcC1zbS1ndy1zbS1kZWxpdmVyeU91dGNvbWUgc2hhbGwgYmUgYWJzZW50CisJaXAtc20tZ3ctYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlbOF0JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTAorCS0tIElmIHJlY2VpdmVkIGlwLXNtLWd3LXNtLWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgZm9yIGRlbGl2ZXJ5IHZpYSBJTVMKKwktLSBJZiBpcC1zbS1ndy1JbmRpY2F0b3IgaXMgc2V0LCB0aGVuIGlwLXNtLWd3LXNtLWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gCisJLS0gc2hhbGwgYmUgYWJzZW50Cit9CisKK1NNLURlbGl2ZXJ5T3V0Y29tZSA6Oj0gRU5VTUVSQVRFRCB7CisJbWVtb3J5Q2FwYWNpdHlFeGNlZWRlZCAgKDApLAorCWFic2VudFN1YnNjcmliZXIgICgxKSwKKwlzdWNjZXNzZnVsVHJhbnNmZXIgICgyKX0KKworUmVwb3J0U00tRGVsaXZlcnlTdGF0dXNSZXMgOjo9IFNFUVVFTkNFIHsKKwlzdG9yZWRNU0lTRE4JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBbGVydFNlcnZpY2VDZW50cmVBcmcgOjo9IFNFUVVFTkNFIHsKKwltc2lzZG4JCUlTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzcwlBZGRyZXNzU3RyaW5nLAorCS4uLn0KKworSW5mb3JtU2VydmljZUNlbnRyZUFyZyA6Oj0gU0VRVUVOQ0UgeworCXN0b3JlZE1TSVNETglJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbXctU3RhdHVzCU1XLVN0YXR1cwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCU9QVElPTkFMLAorCWFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCVswXQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCU9QVElPTkFMIH0KKwktLSBhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIAorCS0tIGFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgcHJlc2VudC4KKwktLSBpZiBpbmNsdWRlZCwgYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgZm9yIEdQUlMgYW5kCisJLS0gYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBmb3Igbm9uLUdQUlMKKworTVctU3RhdHVzIDo6PSBCSVQgU1RSSU5HIHsKKwlzYy1BZGRyZXNzTm90SW5jbHVkZWQgICgwKSwKKwltbnJmLVNldCAgKDEpLAorCW1jZWYtU2V0ICAoMikgLAorCW1ucmctU2V0CSAgKDMpfSAoU0laRSAoNi4uMTYpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBiaXRzIDQgdG8gMTUgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKworUmVhZHlGb3JTTS1BcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJYWxlcnRSZWFzb24JQWxlcnRSZWFzb24sCisJYWxlcnRSZWFzb25JbmRpY2F0b3IJTlVMTAkJCU9QVElPTkFMLAorCS0tIGFsZXJ0UmVhc29uSW5kaWNhdG9yIGlzIHNldCBvbmx5IHdoZW4gdGhlIGFsZXJ0UmVhc29uIAorCS0tIHNlbnQgdG8gSExSIGlzIGZvciBHUFJTCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbEFsZXJ0UmVhc29uSW5kaWNhdG9yCVsxXSBOVUxMCQlPUFRJT05BTAorCS0tIGFkZGl0aW9uYWxBbGVydFJlYXNvbkluZGljYXRvciBpcyBzZXQgb25seSB3aGVuIHRoZSBhbGVydFJlYXNvbgorCS0tIHNlbnQgdG8gSExSIGlzIGZvciBJUC1TTS1HVworCX0KKworUmVhZHlGb3JTTS1SZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQWxlcnRSZWFzb24gOjo9IEVOVU1FUkFURUQgeworCW1zLVByZXNlbnQgICgwKSwKKwltZW1vcnlBdmFpbGFibGUgICgxKX0KKworTVQtRm9yd2FyZFNNLVZHQ1MtQXJnIDo6PSBTRVFVRU5DRSB7CisJYXNjaUNhbGxSZWZlcmVuY2UJQVNDSS1DYWxsUmVmZXJlbmNlLAorCXNtLVJQLU9BCQlTTS1SUC1PQSwKKwlzbS1SUC1VSQkJU2lnbmFsSW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTVQtRm9yd2FyZFNNLVZHQ1MtUmVzIDo6PSBTRVFVRU5DRSB7CisJc20tUlAtVUkJCVswXSBTaWduYWxJbmZvCU9QVElPTkFMLAorCWRpc3BhdGNoZXJMaXN0CVsxXSBEaXNwYXRjaGVyTGlzdAlPUFRJT05BTCwKKwlvbmdvaW5nQ2FsbAlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitEaXNwYXRjaGVyTGlzdCA6Oj0gCisJU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZEaXNwYXRjaGVycykgT0YKKwkJCQlJU0ROLUFkZHJlc3NTdHJpbmcKKworbWF4TnVtT2ZEaXNwYXRjaGVycyAgSU5URUdFUiA6Oj0gNQorCisKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLUNvZGUuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtQ29kZS5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzZjJkYwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLUNvZGUuYXNuCkBAIC0wLDAgKzEsMTkwIEBACistLSAkSWQ6IE1BUC1TUy1Db2RlLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KQorLS0gMTcuNy41CVN1cHBsZW1lbnRhcnkgc2VydmljZSBjb2RlcworCitNQVAtU1MtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1Db2RlICgxNSkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKKzo6PQorCitCRUdJTgorCitTUy1Db2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQorCS0tIHN1cHBsZW1lbnRhcnkgc2VydmljZSwgYSBncm91cCBvZiBzdXBwbGVtZW50YXJ5IHNlcnZpY2VzLCBvcgorCS0tIGFsbCBzdXBwbGVtZW50YXJ5IHNlcnZpY2VzLiBUaGUgc2VydmljZXMgYW5kIGFiYnJldmlhdGlvbnMKKwktLSB1c2VkIGFyZSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjIuMDA0IFs1XS4gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcworCS0tIGRlZmluZWQgYXMgZm9sbG93czoKKwktLQorCS0tIGJpdHMgODc2NTQzMjE6IGdyb3VwIChiaXRzIDg3NjUpLCBhbmQgc3BlY2lmaWMgc2VydmljZQorCS0tIChiaXRzIDQzMjEpCisKK2FsbFNTCQkJU1MtQ29kZSA6Oj0gJzAwMDAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBTUworCithbGxMaW5lSWRlbnRpZmljYXRpb25TUwlTUy1Db2RlIDo6PSAnMDAwMTAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIGxpbmUgaWRlbnRpZmljYXRpb24gU1MKK2NsaXAJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMDAxJ0IKKwktLSBjYWxsaW5nIGxpbmUgaWRlbnRpZmljYXRpb24gcHJlc2VudGF0aW9uCitjbGlyCQkJCVNTLUNvZGUgOjo9ICcwMDAxMDAxMCdCCisJLS0gY2FsbGluZyBsaW5lIGlkZW50aWZpY2F0aW9uIHJlc3RyaWN0aW9uCitjb2xwCQkJCVNTLUNvZGUgOjo9ICcwMDAxMDAxMSdCCisJLS0gY29ubmVjdGVkIGxpbmUgaWRlbnRpZmljYXRpb24gcHJlc2VudGF0aW9uCitjb2xyCQkJCVNTLUNvZGUgOjo9ICcwMDAxMDEwMCdCCisJLS0gY29ubmVjdGVkIGxpbmUgaWRlbnRpZmljYXRpb24gcmVzdHJpY3Rpb24KK21jaQkJCQlTUy1Db2RlIDo6PSAnMDAwMTAxMDEnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gbWFsaWNpb3VzIGNhbGwgaWRlbnRpZmljYXRpb24KKworYWxsTmFtZUlkZW50aWZpY2F0aW9uU1MJU1MtQ29kZSA6Oj0gJzAwMDExMDAwJ0IKKwktLSBhbGwgbmFtZSBpZGVudGlmaWNhdGlvbiBTUworY25hcAkJCQlTUy1Db2RlIDo6PSAnMDAwMTEwMDEnQgorCS0tIGNhbGxpbmcgbmFtZSBwcmVzZW50YXRpb24KKworCS0tIFNTLUNvZGVzICcwMDAxMTAxMCdCIHRvICcwMDAxMTExMSdCIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIAorCS0tIE5hbWVJZGVudGlmaWNhdGlvbiBTdXBwbGVtZW50YXJ5IFNlcnZpY2UgdXNlLgorCithbGxGb3J3YXJkaW5nU1MJU1MtQ29kZSA6Oj0gJzAwMTAwMDAwJ0IKKwktLSBhbGwgZm9yd2FyZGluZyBTUworY2Z1CQkJCVNTLUNvZGUgOjo9ICcwMDEwMDAwMSdCCisJLS0gY2FsbCBmb3J3YXJkaW5nIHVuY29uZGl0aW9uYWwKK2FsbENvbmRGb3J3YXJkaW5nU1MJU1MtQ29kZSA6Oj0gJzAwMTAxMDAwJ0IKKwktLSBhbGwgY29uZGl0aW9uYWwgZm9yd2FyZGluZyBTUworY2ZiCQkJCVNTLUNvZGUgOjo9ICcwMDEwMTAwMSdCCisJLS0gY2FsbCBmb3J3YXJkaW5nIG9uIG1vYmlsZSBzdWJzY3JpYmVyIGJ1c3kKK2NmbnJ5CQkJU1MtQ29kZSA6Oj0gJzAwMTAxMDEwJ0IKKwktLSBjYWxsIGZvcndhcmRpbmcgb24gbm8gcmVwbHkKK2NmbnJjCQkJU1MtQ29kZSA6Oj0gJzAwMTAxMDExJ0IKKwktLSBjYWxsIGZvcndhcmRpbmcgb24gbW9iaWxlIHN1YnNjcmliZXIgbm90IHJlYWNoYWJsZSAKK2NkCQkJCVNTLUNvZGUgOjo9ICcwMDEwMDEwMCdCCisJLS0gY2FsbCBkZWZsZWN0aW9uCisKK2FsbENhbGxPZmZlcmluZ1NTCVNTLUNvZGUgOjo9ICcwMDExMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgY2FsbCBvZmZlcmluZyBTUyBpbmNsdWRlcyBhbHNvIGFsbCBmb3J3YXJkaW5nIFNTCitlY3QJCQkJU1MtQ29kZSA6Oj0gJzAwMTEwMDAxJ0IKKwkJLS0gZXhwbGljaXQgY2FsbCB0cmFuc2ZlcgorbWFoCQkJCVNTLUNvZGUgOjo9ICcwMDExMDAxMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBtb2JpbGUgYWNjZXNzIGh1bnRpbmcKKworYWxsQ2FsbENvbXBsZXRpb25TUwlTUy1Db2RlIDo6PSAnMDEwMDAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIENhbGwgY29tcGxldGlvbiBTUworY3cJCQkJU1MtQ29kZSA6Oj0gJzAxMDAwMDAxJ0IKKwktLSBjYWxsIHdhaXRpbmcKK2hvbGQJCQkJU1MtQ29kZSA6Oj0gJzAxMDAwMDEwJ0IKKwktLSBjYWxsIGhvbGQKK2NjYnMtQQkJCVNTLUNvZGUgOjo9ICcwMTAwMDAxMSdCCisJLS0gY29tcGxldGlvbiBvZiBjYWxsIHRvIGJ1c3kgc3Vic2NyaWJlcnMsIG9yaWdpbmF0aW5nIHNpZGUKKwktLSB0aGlzIFNTLUNvZGUgaXMgdXNlZCBvbmx5IGluIEluc2VydFN1YnNjcmliZXJEYXRhLCBEZWxldGVTdWJzY3JpYmVyRGF0YSAKKwktLSBhbmQgSW50ZXJyb2dhdGVTUworY2Nicy1CCQkJU1MtQ29kZSA6Oj0gJzAxMDAwMTAwJ0IKKwktLSBjb21wbGV0aW9uIG9mIGNhbGwgdG8gYnVzeSBzdWJzY3JpYmVycywgZGVzdGluYXRpb24gc2lkZQorCS0tIHRoaXMgU1MtQ29kZSBpcyB1c2VkIG9ubHkgaW4gSW5zZXJ0U3Vic2NyaWJlckRhdGEgYW5kIERlbGV0ZVN1YnNjcmliZXJEYXRhCittYwkJCQlTUy1Db2RlIDo6PSAnMDEwMDAxMDEnQgorCS0tIG11bHRpY2FsbAorCithbGxNdWx0aVBhcnR5U1MJU1MtQ29kZSA6Oj0gJzAxMDEwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBtdWx0aXBhcnR5IFNTCittdWx0aVBUWQkJCVNTLUNvZGUgOjo9ICcwMTAxMDAwMSdCCisJLS0gbXVsdGlwYXJ0eQorCithbGxDb21tdW5pdHlPZkludGVyZXN0LVNTCVNTLUNvZGUgOjo9ICcwMTEwMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgY29tbXVuaXR5IG9mIGludGVyZXN0IFNTCitjdWcJCQkJU1MtQ29kZSA6Oj0gJzAxMTAwMDAxJ0IKKwktLSBjbG9zZWQgdXNlciBncm91cAorCithbGxDaGFyZ2luZ1NTCQlTUy1Db2RlIDo6PSAnMDExMTAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIGNoYXJnaW5nIFNTCithb2NpCQkJCVNTLUNvZGUgOjo9ICcwMTExMDAwMSdCCisJLS0gYWR2aWNlIG9mIGNoYXJnZSBpbmZvcm1hdGlvbgorYW9jYwkJCQlTUy1Db2RlIDo6PSAnMDExMTAwMTAnQgorCS0tIGFkdmljZSBvZiBjaGFyZ2UgY2hhcmdpbmcKKworYWxsQWRkaXRpb25hbEluZm9UcmFuc2ZlclNTCVNTLUNvZGUgOjo9ICcxMDAwMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0cmFuc2ZlciBTUwordXVzMQkJCQlTUy1Db2RlIDo6PSAnMTAwMDAwMDEnQgorCS0tIFVVUzEgdXNlci10by11c2VyIHNpZ25hbGxpbmcgCit1dXMyCQkJCVNTLUNvZGUgOjo9ICcxMDAwMDAxMCdCCisJLS0gVVVTMiB1c2VyLXRvLXVzZXIgc2lnbmFsbGluZwordXVzMwkJCQlTUy1Db2RlIDo6PSAnMTAwMDAwMTEnQgorCS0tIFVVUzMgdXNlci10by11c2VyIHNpZ25hbGxpbmcKKworYWxsQmFycmluZ1NTCQlTUy1Db2RlIDo6PSAnMTAwMTAwMDAnQgorCS0tIGFsbCBiYXJyaW5nIFNTCitiYXJyaW5nT2ZPdXRnb2luZ0NhbGxzCVNTLUNvZGUgOjo9ICcxMDAxMDAwMSdCCisJLS0gYmFycmluZyBvZiBvdXRnb2luZyBjYWxscworYmFvYwkJCQlTUy1Db2RlIDo6PSAnMTAwMTAwMTAnQgorCS0tIGJhcnJpbmcgb2YgYWxsIG91dGdvaW5nIGNhbGxzCitib2ljCQkJCVNTLUNvZGUgOjo9ICcxMDAxMDAxMSdCCisJLS0gYmFycmluZyBvZiBvdXRnb2luZyBpbnRlcm5hdGlvbmFsIGNhbGxzCitib2ljRXhIQwkJCVNTLUNvZGUgOjo9ICcxMDAxMDEwMCdCCisJLS0gYmFycmluZyBvZiBvdXRnb2luZyBpbnRlcm5hdGlvbmFsIGNhbGxzIGV4Y2VwdCB0aG9zZSBkaXJlY3RlZAorCS0tIHRvIHRoZSBob21lIFBMTU4gQ291bnRyeQorYmFycmluZ09mSW5jb21pbmdDYWxscwlTUy1Db2RlIDo6PSAnMTAwMTEwMDEnQgorCS0tIGJhcnJpbmcgb2YgaW5jb21pbmcgY2FsbHMKK2JhaWMJCQkJU1MtQ29kZSA6Oj0gJzEwMDExMDEwJ0IKKwktLSBiYXJyaW5nIG9mIGFsbCBpbmNvbWluZyBjYWxscworYmljUm9hbQkJCVNTLUNvZGUgOjo9ICcxMDAxMTAxMSdCCisJLS0gYmFycmluZyBvZiBpbmNvbWluZyBjYWxscyB3aGVuIHJvYW1pbmcgb3V0c2lkZSBob21lIFBMTU4KKwktLSBDb3VudHJ5CisKK2FsbFBMTU4tc3BlY2lmaWNTUwlTUy1Db2RlIDo6PSAnMTExMTAwMDAnQgorcGxtbi1zcGVjaWZpY1NTLTEJU1MtQ29kZSA6Oj0gJzExMTEwMDAxJ0IKK3BsbW4tc3BlY2lmaWNTUy0yCVNTLUNvZGUgOjo9ICcxMTExMDAxMCdCCitwbG1uLXNwZWNpZmljU1MtMwlTUy1Db2RlIDo6PSAnMTExMTAwMTEnQgorcGxtbi1zcGVjaWZpY1NTLTQJU1MtQ29kZSA6Oj0gJzExMTEwMTAwJ0IKK3BsbW4tc3BlY2lmaWNTUy01CVNTLUNvZGUgOjo9ICcxMTExMDEwMSdCCitwbG1uLXNwZWNpZmljU1MtNglTUy1Db2RlIDo6PSAnMTExMTAxMTAnQgorcGxtbi1zcGVjaWZpY1NTLTcJU1MtQ29kZSA6Oj0gJzExMTEwMTExJ0IKK3BsbW4tc3BlY2lmaWNTUy04CVNTLUNvZGUgOjo9ICcxMTExMTAwMCdCCitwbG1uLXNwZWNpZmljU1MtOQlTUy1Db2RlIDo6PSAnMTExMTEwMDEnQgorcGxtbi1zcGVjaWZpY1NTLUEJU1MtQ29kZSA6Oj0gJzExMTExMDEwJ0IKK3BsbW4tc3BlY2lmaWNTUy1CCVNTLUNvZGUgOjo9ICcxMTExMTAxMSdCCitwbG1uLXNwZWNpZmljU1MtQwlTUy1Db2RlIDo6PSAnMTExMTExMDAnQgorcGxtbi1zcGVjaWZpY1NTLUQJU1MtQ29kZSA6Oj0gJzExMTExMTAxJ0IKK3BsbW4tc3BlY2lmaWNTUy1FCVNTLUNvZGUgOjo9ICcxMTExMTExMCdCCitwbG1uLXNwZWNpZmljU1MtRglTUy1Db2RlIDo6PSAnMTExMTExMTEnQgorCithbGxDYWxsUHJpb3JpdHlTUwlTUy1Db2RlIDo6PSAnMTAxMDAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIGNhbGwgcHJpb3JpdHkgU1MKK2VtbHBwCQkJU1MtQ29kZSA6Oj0gJzEwMTAwMDAxJ0IKKwktLSBlbmhhbmNlZCBNdWx0aWxldmVsIFByZWNlZGVuY2UgUHJlLWVtcHRpb24gKEVNTFBQKSBzZXJ2aWNlCisKK2FsbExDU1ByaXZhY3lFeGNlcHRpb24JU1MtQ29kZSA6Oj0gJzEwMTEwMDAwJ0IKKwktLSBhbGwgTENTIFByaXZhY3kgRXhjZXB0aW9uIENsYXNzZXMKK3VuaXZlcnNhbAkJCVNTLUNvZGUgOjo9ICcxMDExMDAwMSdCCisJLS0gYWxsb3cgbG9jYXRpb24gYnkgYW55IExDUyBjbGllbnQKK2NhbGxTZXNzaW9uUmVsYXRlZAlTUy1Db2RlIDo6PSAnMTAxMTAwMTAnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IGFueSB2YWx1ZSBhZGRlZCBMQ1MgY2xpZW50IHRvIHdoaWNoIGEgY2FsbC9zZXNzaW9uIAorCS0tIGlzIGVzdGFibGlzaGVkIGZyb20gdGhlIHRhcmdldCBNUworY2FsbFNlc3Npb25VbnJlbGF0ZWQJU1MtQ29kZSA6Oj0gJzEwMTEwMDExJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBkZXNpZ25hdGVkIGV4dGVybmFsIHZhbHVlIGFkZGVkIExDUyBjbGllbnRzCitwbG1ub3BlcmF0b3IJCVNTLUNvZGUgOjo9ICcxMDExMDEwMCdCCisJLS0gYWxsb3cgbG9jYXRpb24gYnkgZGVzaWduYXRlZCBQTE1OIG9wZXJhdG9yIExDUyBjbGllbnRzIAorc2VydmljZVR5cGUJCVNTLUNvZGUgOjo9ICcxMDExMDEwMSdCCisJLS0gYWxsb3cgbG9jYXRpb24gYnkgTENTIGNsaWVudHMgb2YgYSBkZXNpZ25hdGVkIExDUyBzZXJ2aWNlIHR5cGUKKworYWxsTU9MUi1TUwkJU1MtQ29kZSA6Oj0gJzExMDAwMDAwJ0IKKwktLSBhbGwgTW9iaWxlIE9yaWdpbmF0aW5nIExvY2F0aW9uIFJlcXVlc3QgQ2xhc3NlcworYmFzaWNTZWxmTG9jYXRpb24JU1MtQ29kZSA6Oj0gJzExMDAwMDAxJ0IKKwktLSBhbGxvdyBhbiBNUyB0byByZXF1ZXN0IGl0cyBvd24gbG9jYXRpb24KK2F1dG9ub21vdXNTZWxmTG9jYXRpb24JU1MtQ29kZSA6Oj0gJzExMDAwMDEwJ0IKKwktLSBhbGxvdyBhbiBNUyB0byBwZXJmb3JtIHNlbGYgbG9jYXRpb24gd2l0aG91dCBpbnRlcmFjdGlvbgorCS0tIHdpdGggdGhlIFBMTU4gZm9yIGEgcHJlZGV0ZXJtaW5lZCBwZXJpb2Qgb2YgdGltZQordHJhbnNmZXJUb1RoaXJkUGFydHkJU1MtQ29kZSA6Oj0gJzExMDAwMDExJ0IKKwktLSBhbGxvdyBhbiBNUyB0byByZXF1ZXN0IHRyYW5zZmVyIG9mIGl0cyBsb2NhdGlvbiB0byBhbm90aGVyIExDUyBjbGllbnQKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLURhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1M2Y3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsMzQyIEBACistLSAkSWQ6IE1BUC1TUy1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpICAKKy0tIDE3LjcuNAlTdXBwbGVtZW50YXJ5IHNlcnZpY2UgZGF0YSB0eXBlcworIAorTUFQLVNTLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1EYXRhVHlwZXMgKDE0KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCVJlZ2lzdGVyU1MtQXJnLAorCVNTLUluZm8sCisJU1MtU3RhdHVzLAorCVNTLVN1YnNjcmlwdGlvbk9wdGlvbiwKKwlTUy1Gb3JCUy1Db2RlLAorCUludGVycm9nYXRlU1MtUmVzLAorCVVTU0QtQXJnLAorCVVTU0QtUmVzLCAKKwlVU1NELURhdGFDb2RpbmdTY2hlbWUsCisJVVNTRC1TdHJpbmcsCisJUGFzc3dvcmQsCisJR3VpZGFuY2VJbmZvLAorCVNTLUxpc3QsCisJU1MtSW5mb0xpc3QsCisJT3ZlcnJpZGVDYXRlZ29yeSwKKwlDbGlSZXN0cmljdGlvbk9wdGlvbiwKKwlOb1JlcGx5Q29uZGl0aW9uVGltZSwKKwlGb3J3YXJkaW5nT3B0aW9ucywKKwltYXhOdW1PZlNTLAorCVNTLURhdGEsCisJU1MtSW52b2NhdGlvbk5vdGlmaWNhdGlvbkFyZywKKwlTUy1JbnZvY2F0aW9uTm90aWZpY2F0aW9uUmVzLAorCUNDQlMtRmVhdHVyZSwKKwlSZWdpc3RlckNDLUVudHJ5QXJnLAorCVJlZ2lzdGVyQ0MtRW50cnlSZXMsCisJRXJhc2VDQy1FbnRyeUFyZywKKwlFcmFzZUNDLUVudHJ5UmVzCis7CisKK0lNUE9SVFMKKwlBZGRyZXNzU3RyaW5nLAorCUlTRE4tQWRkcmVzc1N0cmluZywKKwlJU0ROLVN1YmFkZHJlc3NTdHJpbmcsCisJRlROLUFkZHJlc3NTdHJpbmcsCisJSU1TSSwKKwlCYXNpY1NlcnZpY2VDb2RlLAorCUFsZXJ0aW5nUGF0dGVybiwKKwlFTUxQUC1Qcmlvcml0eSwgCisJTWF4TUMtQmVhcmVycywKKwlNQy1CZWFyZXJzLAorCUV4dGVybmFsU2lnbmFsSW5mbworRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisKKwlTUy1Db2RlCitGUk9NIE1BUC1TUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLUNvZGUgKDE1KSB2ZXJzaW9uMTEgKDExKX0KKzsKKworCitSZWdpc3RlclNTLUFyZyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJYmFzaWNTZXJ2aWNlCUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJZm9yd2FyZGVkVG9OdW1iZXIJWzRdIEFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGVkVG9TdWJhZGRyZXNzCVs2XSBJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbm9SZXBseUNvbmRpdGlvblRpbWUJWzVdIE5vUmVwbHlDb25kaXRpb25UaW1lCU9QVElPTkFMLAorCS4uLiwKKwlkZWZhdWx0UHJpb3JpdHkJWzddIEVNTFBQLVByaW9yaXR5CU9QVElPTkFMLAorCW5iclVzZXIJCVs4XSBNQy1CZWFyZXJzCU9QVElPTkFMLAorCWxvbmdGVE4tU3VwcG9ydGVkCVs5XQlOVUxMCQlPUFRJT05BTCB9CisKK05vUmVwbHlDb25kaXRpb25UaW1lIDo6PSBJTlRFR0VSICg1Li4zMCkKKworU1MtSW5mbyA6Oj0gQ0hPSUNFIHsKKwlmb3J3YXJkaW5nSW5mbwlbMF0gRm9yd2FyZGluZ0luZm8sCisJY2FsbEJhcnJpbmdJbmZvCVsxXSBDYWxsQmFycmluZ0luZm8sCisJc3MtRGF0YQkJWzNdIFNTLURhdGF9CisKK0ZvcndhcmRpbmdJbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZQkJT1BUSU9OQUwsCisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CUZvcndhcmRpbmdGZWF0dXJlTGlzdCwKKwkuLi59CisKK0ZvcndhcmRpbmdGZWF0dXJlTGlzdCA6Oj0gCisJU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJRm9yd2FyZGluZ0ZlYXR1cmUKKworRm9yd2FyZGluZ0ZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBTUy1TdGF0dXMJT1BUSU9OQUwsCisJZm9yd2FyZGVkVG9OdW1iZXIJWzVdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlmb3J3YXJkZWRUb1N1YmFkZHJlc3MJWzhdIElTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlmb3J3YXJkaW5nT3B0aW9ucwlbNl0gRm9yd2FyZGluZ09wdGlvbnMJT1BUSU9OQUwsCisJbm9SZXBseUNvbmRpdGlvblRpbWUJWzddIE5vUmVwbHlDb25kaXRpb25UaW1lCU9QVElPTkFMLAorCS4uLiwKKwlsb25nRm9yd2FyZGVkVG9OdW1iZXIJWzldIEZUTi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMIH0KKworU1MtU3RhdHVzIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCisJLS0gYml0cyA4NzY1OiAwMDAwICh1bnVzZWQpCisJLS0gYml0cyA0MzIxOiBVc2VkIHRvIGNvbnZleSB0aGUgIlAgYml0IiwiUiBiaXQiLCJBIGJpdCIgYW5kICJRIGJpdCIsCisJLS0JCSAgICByZXByZXNlbnRpbmcgc3VwcGxlbWVudGFyeSBzZXJ2aWNlIHN0YXRlIGluZm9ybWF0aW9uCisJLS0JCSAgICBhcyBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDExIFsyMl0KKworCS0tIGJpdCA0OiAiUSBiaXQiCisKKwktLSBiaXQgMzogIlAgYml0IgorCisJLS0gYml0IDI6ICJSIGJpdCIKKworCS0tIGJpdCAxOiAiQSBiaXQiCisKK0ZvcndhcmRpbmdPcHRpb25zIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCisJLS0gYml0IDg6IG5vdGlmaWNhdGlvbiB0byBmb3J3YXJkaW5nIHBhcnR5CisJLS0JMCAgbm8gbm90aWZpY2F0aW9uCisJLS0JMSAgbm90aWZpY2F0aW9uCisKKwktLSBiaXQgNzogcmVkaXJlY3RpbmcgcHJlc2VudGF0aW9uCisJLS0JMCBubyBwcmVzZW50YXRpb24gIAorCS0tCTEgIHByZXNlbnRhdGlvbgorCisJLS0gYml0IDY6IG5vdGlmaWNhdGlvbiB0byBjYWxsaW5nIHBhcnR5CisJLS0JMCAgbm8gbm90aWZpY2F0aW9uCisJLS0JMSAgbm90aWZpY2F0aW9uCisKKwktLSBiaXQgNTogMCAodW51c2VkKQorCisJLS0gYml0cyA0MzogZm9yd2FyZGluZyByZWFzb24KKwktLQkwMCAgbXMgbm90IHJlYWNoYWJsZQorCS0tCTAxICBtcyBidXN5CisJLS0JMTAgIG5vIHJlcGx5CisJLS0JMTEgIHVuY29uZGl0aW9uYWwgd2hlbiB1c2VkIGluIGEgU1JJIFJlc3VsdCwgCisJLS0JICAgIG9yIGNhbGwgZGVmbGVjdGlvbiB3aGVuIHVzZWQgaW4gYSBSQ0ggQXJndW1lbnQKKwktLSBiaXRzIDIxOiAwMCAodW51c2VkKQorCitDYWxsQmFycmluZ0luZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlCQlPUFRJT05BTCwKKwljYWxsQmFycmluZ0ZlYXR1cmVMaXN0CUNhbGxCYXJyaW5nRmVhdHVyZUxpc3QsCisJLi4ufQorCitDYWxsQmFycmluZ0ZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlDYWxsQmFycmluZ0ZlYXR1cmUKKworQ2FsbEJhcnJpbmdGZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJYmFzaWNTZXJ2aWNlCUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCVs0XSBTUy1TdGF0dXMJT1BUSU9OQUwsCisJLi4ufQorCitTUy1EYXRhIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZQkJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbNF0gU1MtU3RhdHVzCU9QVElPTkFMLAorCXNzLVN1YnNjcmlwdGlvbk9wdGlvbglTUy1TdWJzY3JpcHRpb25PcHRpb24JT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CUJhc2ljU2VydmljZUdyb3VwTGlzdAlPUFRJT05BTCwKKwkuLi4sCisJZGVmYXVsdFByaW9yaXR5CUVNTFBQLVByaW9yaXR5CU9QVElPTkFMLAorCW5iclVzZXIJCVs1XSBNQy1CZWFyZXJzCU9QVElPTkFMCisJfQorCitTUy1TdWJzY3JpcHRpb25PcHRpb24gOjo9IENIT0lDRSB7CisJY2xpUmVzdHJpY3Rpb25PcHRpb24JWzJdIENsaVJlc3RyaWN0aW9uT3B0aW9uLAorCW92ZXJyaWRlQ2F0ZWdvcnkJWzFdIE92ZXJyaWRlQ2F0ZWdvcnl9CisKK0NsaVJlc3RyaWN0aW9uT3B0aW9uIDo6PSBFTlVNRVJBVEVEIHsKKwlwZXJtYW5lbnQgICgwKSwKKwl0ZW1wb3JhcnlEZWZhdWx0UmVzdHJpY3RlZCAgKDEpLAorCXRlbXBvcmFyeURlZmF1bHRBbGxvd2VkICAoMil9CisKK092ZXJyaWRlQ2F0ZWdvcnkgOjo9IEVOVU1FUkFURUQgeworCW92ZXJyaWRlRW5hYmxlZCAgKDApLAorCW92ZXJyaWRlRGlzYWJsZWQgICgxKX0KKworU1MtRm9yQlMtQ29kZSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJYmFzaWNTZXJ2aWNlCUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJLi4uLAorCWxvbmdGVE4tU3VwcG9ydGVkCVs0XQlOVUxMCQlPUFRJT05BTCB9CisKK0dlbmVyaWNTZXJ2aWNlSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLVN0YXR1cwlTUy1TdGF0dXMsCisJY2xpUmVzdHJpY3Rpb25PcHRpb24JQ2xpUmVzdHJpY3Rpb25PcHRpb24JT1BUSU9OQUwsCisJLi4uLAorCW1heGltdW1FbnRpdGxlZFByaW9yaXR5CVswXSBFTUxQUC1Qcmlvcml0eQlPUFRJT05BTCwKKwlkZWZhdWx0UHJpb3JpdHkJWzFdIEVNTFBQLVByaW9yaXR5CU9QVElPTkFMLAorCWNjYnMtRmVhdHVyZUxpc3QJWzJdIENDQlMtRmVhdHVyZUxpc3QJT1BUSU9OQUwsCisJbmJyU0IJCVszXSBNYXhNQy1CZWFyZXJzCU9QVElPTkFMLAorCW5iclVzZXIJCVs0XSBNQy1CZWFyZXJzCU9QVElPTkFMLAorCW5iclNOCQlbNV0gTUMtQmVhcmVycwlPUFRJT05BTCB9CisKK0NDQlMtRmVhdHVyZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ0NCUy1SZXF1ZXN0cykgT0YKKwkJCQlDQ0JTLUZlYXR1cmUKKworbWF4TnVtT2ZDQ0JTLVJlcXVlc3RzICBJTlRFR0VSIDo6PSA1CisKK0NDQlMtRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWNjYnMtSW5kZXgJWzBdIENDQlMtSW5kZXgJT1BUSU9OQUwsCisJYi1zdWJzY3JpYmVyTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJYi1zdWJzY3JpYmVyU3ViYWRkcmVzcwlbMl0gSVNETi1TdWJhZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWJhc2ljU2VydmljZUdyb3VwCVszXSBCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCS4uLn0KKworQ0NCUy1JbmRleCAgOjo9IElOVEVHRVIgKDEuLm1heE51bU9mQ0NCUy1SZXF1ZXN0cykKKworSW50ZXJyb2dhdGVTUy1SZXMgOjo9IENIT0lDRSB7CisJc3MtU3RhdHVzCQlbMF0gU1MtU3RhdHVzLAorCWJhc2ljU2VydmljZUdyb3VwTGlzdAlbMl0gQmFzaWNTZXJ2aWNlR3JvdXBMaXN0LAorCWZvcndhcmRpbmdGZWF0dXJlTGlzdAlbM10gRm9yd2FyZGluZ0ZlYXR1cmVMaXN0LAorCWdlbmVyaWNTZXJ2aWNlSW5mbwlbNF0JR2VuZXJpY1NlcnZpY2VJbmZvIH0KKworVVNTRC1BcmcgOjo9IFNFUVVFTkNFIHsKKwl1c3NkLURhdGFDb2RpbmdTY2hlbWUJVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCXVzc2QtU3RyaW5nCVVTU0QtU3RyaW5nLAorCS4uLiAsCisJYWxlcnRpbmdQYXR0ZXJuCUFsZXJ0aW5nUGF0dGVybglPUFRJT05BTCwKKwltc2lzZG4JCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQorCitVU1NELVJlcyA6Oj0gU0VRVUVOQ0UgeworCXVzc2QtRGF0YUNvZGluZ1NjaGVtZQlVU1NELURhdGFDb2RpbmdTY2hlbWUsCisJdXNzZC1TdHJpbmcJVVNTRC1TdHJpbmcsCisJLi4ufQorCitVU1NELURhdGFDb2RpbmdTY2hlbWUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhlIHN0cnVjdHVyZSBvZiB0aGUgVVNTRC1EYXRhQ29kaW5nU2NoZW1lIGlzIGRlZmluZWQgYnkKKwktLSB0aGUgQ2VsbCBCcm9hZGNhc3QgRGF0YSBDb2RpbmcgU2NoZW1lIGFzIGRlc2NyaWJlZCBpbgorCS0tIFRTIDNHUFAgVFMgMjMuMDM4IFsyNV0KKworVVNTRC1TdHJpbmcgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4VVNTRC1TdHJpbmdMZW5ndGgpKQorCS0tIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBVU1NELVN0cmluZyBpcyBkZXBlbmRlbnQKKwktLSBvbiB0aGUgVVNTRC1EYXRhQ29kaW5nU2NoZW1lIGFzIGRlc2NyaWJlZCBpbiBUUyAzR1BQIFRTIDIzLjAzOCBbMjVdLgorCittYXhVU1NELVN0cmluZ0xlbmd0aCAgSU5URUdFUiA6Oj0gMTYwCisKK1Bhc3N3b3JkIDo6PSBOdW1lcmljU3RyaW5nCisJKEZST00gKCIwInwiMSJ8IjIifCIzInwiNCJ8IjUifCI2InwiNyJ8IjgifCI5IikpCisJKFNJWkUgKDQpKQorCitHdWlkYW5jZUluZm8gOjo9IEVOVU1FUkFURUQgeworCWVudGVyUFcgICgwKSwKKwllbnRlck5ld1BXICAoMSksCisJZW50ZXJOZXdQVy1BZ2FpbiAgKDIpfQorCS0tIEhvdyB0aGlzIGluZm9ybWF0aW9uIGlzIHJlYWxseSBkZWxpdmVyZWQgdG8gdGhlIHN1YnNjcmliZXIKKwktLSAoZGlzcGxheSwgYW5ub3VuY2VtZW50LCAuLi4pIGlzIG5vdCBwYXJ0IG9mIHRoaXMKKwktLSBzcGVjaWZpY2F0aW9uLgorCitTUy1MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlNTKSBPRgorCQkJCVNTLUNvZGUKKworbWF4TnVtT2ZTUyAgSU5URUdFUiA6Oj0gMzAKKworU1MtSW5mb0xpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU1MpIE9GCisJCQkJU1MtSW5mbworCitCYXNpY1NlcnZpY2VHcm91cExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUJhc2ljU2VydmljZUNvZGUKKworbWF4TnVtT2ZCYXNpY1NlcnZpY2VHcm91cHMgIElOVEVHRVIgOjo9IDEzCisKK1NTLUludm9jYXRpb25Ob3RpZmljYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJbXNpc2RuCQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXNzLUV2ZW50CQlbMl0gU1MtQ29kZSwKKwktLSBUaGUgZm9sbG93aW5nIFNTLUNvZGUgdmFsdWVzIGFyZSBhbGxvd2VkIDoKKwktLSBlY3QJCVNTLUNvZGUgOjo9ICcwMDExMDAwMSdCCisJLS0gbXVsdGlQVFkJU1MtQ29kZSA6Oj0gJzAxMDEwMDAxJ0IKKwktLSBjZAkJU1MtQ29kZSA6Oj0gJzAwMTAwMTAwJ0IKKwktLSBjY2JzCQlTUy1Db2RlIDo6PSAnMDEwMDAxMDAnQgorCXNzLUV2ZW50U3BlY2lmaWNhdGlvbglbM10gU1MtRXZlbnRTcGVjaWZpY2F0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwliLXN1YnNjcmliZXJOdW1iZXIJWzVdCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwljY2JzLVJlcXVlc3RTdGF0ZQlbNl0JQ0NCUy1SZXF1ZXN0U3RhdGUJT1BUSU9OQUwKKwl9CisKK0NDQlMtUmVxdWVzdFN0YXRlIDo6PSBFTlVNRVJBVEVEIHsKKwlyZXF1ZXN0ICAJKDApLAorCXJlY2FsbCAgCSgxKSwKKwlhY3RpdmUgIAkoMiksCisJY29tcGxldGVkCSgzKSwKKwlzdXNwZW5kZWQJKDQpLAorCWZyb3plbgkoNSksCisJZGVsZXRlZAkoNikKKwl9CisKK1NTLUludm9jYXRpb25Ob3RpZmljYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLgorCX0KKworU1MtRXZlbnRTcGVjaWZpY2F0aW9uIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhFdmVudFNwZWNpZmljYXRpb24pIE9GCisJCQkJQWRkcmVzc1N0cmluZworCittYXhFdmVudFNwZWNpZmljYXRpb24gIElOVEVHRVIgOjo9IDIKKworUmVnaXN0ZXJDQy1FbnRyeUFyZyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWNjYnMtRGF0YQkJWzFdCUNDQlMtRGF0YQlPUFRJT05BTCwKKwkuLi59CisKK0NDQlMtRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNjYnMtRmVhdHVyZQlbMF0JQ0NCUy1GZWF0dXJlLAorCXRyYW5zbGF0ZWRCLU51bWJlcglbMV0JSVNETi1BZGRyZXNzU3RyaW5nLAorCXNlcnZpY2VJbmRpY2F0b3IJWzJdCVNlcnZpY2VJbmRpY2F0b3IJT1BUSU9OQUwsCisJY2FsbEluZm8JCVszXQlFeHRlcm5hbFNpZ25hbEluZm8sCisJbmV0d29ya1NpZ25hbEluZm8JWzRdCUV4dGVybmFsU2lnbmFsSW5mbywKKwkuLi59CisKK1NlcnZpY2VJbmRpY2F0b3IgOjo9IEJJVCBTVFJJTkcgeworCWNsaXItaW52b2tlZCAoMCksCisJY2FtZWwtaW52b2tlZCAoMSl9IChTSVpFKDIuLjMyKSkgCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIGJpdHMgMiB0byAzMSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZAorCitSZWdpc3RlckNDLUVudHJ5UmVzIDo6PSBTRVFVRU5DRSB7CisJY2Nicy1GZWF0dXJlCVswXSBDQ0JTLUZlYXR1cmUJT1BUSU9OQUwsCisJLi4ufQorCitFcmFzZUNDLUVudHJ5QXJnIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJY2Nicy1JbmRleAlbMV0JQ0NCUy1JbmRleAlPUFRJT05BTCwKKwkuLi59CisKK0VyYXNlQ0MtRW50cnlSZXMgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwlzcy1TdGF0dXMJCVsxXSBTUy1TdGF0dXMJT1BUSU9OQUwsCisJLi4ufQorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtVFMtQ29kZS5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1UUy1Db2RlLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWMwMGJmCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtVFMtQ29kZS5hc24KQEAgLTAsMCArMSw5MiBAQAorLS0gJElkOiBNQVAtVFMtQ29kZS5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgCistLSAxNy43LjkJVGVsZXNlcnZpY2UgQ29kZXMKKyAKK01BUC1UUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVRTLUNvZGUgKDE5KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworOjo9CisKK0JFR0lOCisKK1RlbGVzZXJ2aWNlQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKKwktLSB0ZWxlc2VydmljZSwgYSBncm91cCBvZiB0ZWxlc2VydmljZXMsIG9yIGFsbCB0ZWxlc2VydmljZXMuIFRoZQorCS0tIHNlcnZpY2VzIGFyZSBkZWZpbmVkIGluIFRTIEdTTSAyMi4wMDMgWzRdLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCisJLS0gYml0cyA4NzY1NDMyMTogZ3JvdXAgKGJpdHMgODc2NSkgYW5kIHNwZWNpZmljIHNlcnZpY2UKKwktLSAoYml0cyA0MzIxKQorCitFeHQtVGVsZXNlcnZpY2VDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQorCS0tIHRlbGVzZXJ2aWNlLCBhIGdyb3VwIG9mIHRlbGVzZXJ2aWNlcywgb3IgYWxsIHRlbGVzZXJ2aWNlcy4gVGhlCisJLS0gc2VydmljZXMgYXJlIGRlZmluZWQgaW4gVFMgR1NNIDIyLjAwMyBbNF0uCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisKKwktLSBPQ1RFVCAxOgorCS0tIGJpdHMgODc2NTQzMjE6IGdyb3VwIChiaXRzIDg3NjUpIGFuZCBzcGVjaWZpYyBzZXJ2aWNlCisJLS0gKGJpdHMgNDMyMSkKKworCS0tIE9DVEVUUyAyLTU6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBJZiByZWNlaXZlZCB0aGUKKyAgICAtLSBFeHQtVGVsZXNlcnZpY2VDb2RlIHNoYWxsIGJlCisgCS0tIHRyZWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgZGVmaW5lZCBmb3IgdGhlCisJLS0gb3BlcmF0aW9uIHRoYXQgdXNlcyB0aGlzIHR5cGUuCisKKwktLSBFeHQtVGVsZXNlcnZpY2VDb2RlIGluY2x1ZGVzIGFsbCB2YWx1ZXMgZGVmaW5lZCBmb3IgVGVsZXNlcnZpY2VDb2RlLgorCithbGxUZWxlc2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAwMDAwMDAnQgorCithbGxTcGVlY2hUcmFuc21pc3Npb25TZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDAxMDAwMCdCCit0ZWxlcGhvbnkJCQlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDAxMDAwMSdCCitlbWVyZ2VuY3lDYWxscwkJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAwMTAwMTAnQgorCithbGxTaG9ydE1lc3NhZ2VTZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDEwMDAwMCdCCitzaG9ydE1lc3NhZ2VNVC1QUAlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDEwMDAwMSdCCitzaG9ydE1lc3NhZ2VNTy1QUAlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDEwMDAxMCdCCisKK2FsbEZhY3NpbWlsZVRyYW5zbWlzc2lvblNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTAwMDAwJ0IKK2ZhY3NpbWlsZUdyb3VwM0FuZEFsdGVyU3BlZWNoCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTAwMDAxJ0IKK2F1dG9tYXRpY0ZhY3NpbWlsZUdyb3VwMwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTEwMDAxMCdCCitmYWNzaW1pbGVHcm91cDQJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMTEnQgorCistLSBUaGUgZm9sbG93aW5nIG5vbi1oaWVyYXJjaGljYWwgQ29tcG91bmQgVGVsZXNlcnZpY2UgR3JvdXBzCistLSBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAzMDoKK2FsbERhdGFUZWxlc2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMTAwMDAnQgorCS0tIGNvdmVycyBUZWxlc2VydmljZSBHcm91cHMgJ2FsbEZhY3NpbWlsZVRyYW5zbWlzc2lvblNlcnZpY2VzJworCS0tIGFuZCAnYWxsU2hvcnRNZXNzYWdlU2VydmljZXMnCithbGxUZWxlc2VydmljZXMtRXhlcHRTTVMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTAwMDAwMDAnQgorCS0tIGNvdmVycyBUZWxlc2VydmljZSBHcm91cHMgJ2FsbFNwZWVjaFRyYW5zbWlzc2lvblNlcnZpY2VzJyBhbmQKKwktLSAnYWxsRmFjc2ltaWxlVHJhbnNtaXNzaW9uU2VydmljZXMnCistLQorLS0gQ29tcG91bmQgVGVsZXNlcnZpY2UgR3JvdXAgQ29kZXMgYXJlIG9ubHkgdXNlZCBpbiBjYWxsCistLSBpbmRlcGVuZGVudCBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugb3BlcmF0aW9ucywgaS5lLiB0aGV5CistLSBhcmUgbm90IHVzZWQgaW4gSW5zZXJ0U3Vic2NyaWJlckRhdGEgb3IgaW4KKy0tIERlbGV0ZVN1YnNjcmliZXJEYXRhIG1lc3NhZ2VzLgorCithbGxWb2ljZUdyb3VwQ2FsbFNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzEwMDEwMDAwJ0IKK3ZvaWNlR3JvdXBDYWxsCQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMDAxMDAwMSdCCit2b2ljZUJyb2FkY2FzdENhbGwJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTAwMTAwMTAnQgorCithbGxQTE1OLXNwZWNpZmljVFMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMDAnQgorcGxtbi1zcGVjaWZpY1RTLTEJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMDEnQgorcGxtbi1zcGVjaWZpY1RTLTIJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMTAnQgorcGxtbi1zcGVjaWZpY1RTLTMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMTEnQgorcGxtbi1zcGVjaWZpY1RTLTQJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMDAnQgorcGxtbi1zcGVjaWZpY1RTLTUJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMDEnQgorcGxtbi1zcGVjaWZpY1RTLTYJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMTAnQgorcGxtbi1zcGVjaWZpY1RTLTcJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMTEnQgorcGxtbi1zcGVjaWZpY1RTLTgJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMDAnQgorcGxtbi1zcGVjaWZpY1RTLTkJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMDEnQgorcGxtbi1zcGVjaWZpY1RTLUEJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMTAnQgorcGxtbi1zcGVjaWZpY1RTLUIJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMTEnQgorcGxtbi1zcGVjaWZpY1RTLUMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMDAnQgorcGxtbi1zcGVjaWZpY1RTLUQJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMDEnQgorcGxtbi1zcGVjaWZpY1RTLUUJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMTAnQgorcGxtbi1zcGVjaWZpY1RTLUYJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMTEnQgorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLUNvbXBvbmVudHMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLUNvbXBvbmVudHMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWRlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtQ29tcG9uZW50cy5hc24KQEAgLTAsMCArMSwxNDg4IEBACistLSBSUkxQLUNvbXBvbmVudHMuYXNuCistLSAkSWQkCistLSBUYWtlbiBmcm9tIDNHUFAgVFMgNDQuMDMxIFY3LjQuMCAoMjAwNy0wMykKKy0tIGh0dHA6Ly93d3cuM2dwcC5vcmcvZnRwL1NwZWNzL2FyY2hpdmUvNDRfc2VyaWVzLzQ0LjAzMS80NDAzMS03NDAuemlwLzQ0MDMxLTc0MC5kb2MKKy0tCistLSA0IENvbXBvbmVudHMKKy0tIDUgRWxlbWVudHMgb2YgQ29tcG9uZW50cworLS0KKworUlJMUC1Db21wb25lbnRzCistLSB7IFJSTFAtQ29tcG9uZW50cyB9CisKK0RFRklOSVRJT05TIEFVVE9NQVRJQyBUQUdTIDo6PQorCitCRUdJTgorCitJTVBPUlRTCisJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLCBWZWxvY2l0eUVzdGltYXRlCitGUk9NCisJTUFQLUxDUy1EYXRhVHlwZXMgeworCWl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisJZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1MQ1MtRGF0YVR5cGVzICgyNSkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisJaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKwlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorOworCisKKy0tIEFkZCBoZXJlIG90aGVyIEFTTi4xIGRlZmluaXRpb25zIHByZXNlbnRlZCBiZWxvdworLS0gaW4gY2hhcHRlcnMgNCBhbmQgNS4KKworLS0gTWVhc3VyZW1lbnQgUG9zaXRpb24gcmVxdWVzdCBjb21wb25lbnQKK01zclBvc2l0aW9uLVJlcSA6Oj0gU0VRVUVOQ0UgeworCXBvc2l0aW9uSW5zdHJ1Y3QJCVBvc2l0aW9uSW5zdHJ1Y3QsCisJcmVmZXJlbmNlQXNzaXN0RGF0YQkJUmVmZXJlbmNlQXNzaXN0RGF0YQkJT1BUSU9OQUwsCisJbXNyQXNzaXN0RGF0YQkJCU1zckFzc2lzdERhdGEJCQlPUFRJT05BTCwKKwlzeXN0ZW1JbmZvQXNzaXN0RGF0YQlTeXN0ZW1JbmZvQXNzaXN0RGF0YQlPUFRJT05BTCwKKwlncHMtQXNzaXN0RGF0YQkJCUdQUy1Bc3Npc3REYXRhCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIJCU9QVElPTkFMLAorCS4uLiwKKwktLSBSZWxlYXNlIDk4IGV4dGVuc2lvbiBlbGVtZW50CityZWw5OC1Nc3JQb3NpdGlvbi1SZXEtZXh0ZW5zaW9uCQkJUmVsOTgtTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbgkJCU9QVElPTkFMLAkKKwktLSBSZWxlYXNlIDUgZXh0ZW5zaW9uIGVsZW1lbnQKK3JlbDUtTXNyUG9zaXRpb24tUmVxLWV4dGVuc2lvbgkJCVJlbDUtTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbgkJCU9QVElPTkFMLAorCS0tIFJlbGVhc2UgNyBleHRlbnNpb24gZWxlbWVudAorcmVsNy1Nc3JQb3NpdGlvbi1SZXEtZXh0ZW5zaW9uCQkJUmVsNy1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uCQkJT1BUSU9OQUwKK30KKworLS0gTWVhc3VyZW1lbnQgUG9zaXRpb24gcmVzcG9uc2UgY29tcG9uZW50CitNc3JQb3NpdGlvbi1Sc3AgOjo9IFNFUVVFTkNFIHsKKwltdWx0aXBsZVNldHMJCQlNdWx0aXBsZVNldHMJCQlPUFRJT05BTCwKKwlyZWZlcmVuY2VJZGVudGl0eQkJUmVmZXJlbmNlSWRlbnRpdHkJCU9QVElPTkFMLAorCW90ZC1NZWFzdXJlSW5mbwkJCU9URC1NZWFzdXJlSW5mbwkJCU9QVElPTkFMLAorCWxvY2F0aW9uSW5mbwkJCUxvY2F0aW9uSW5mbwkJCU9QVElPTkFMLAorCWdwcy1NZWFzdXJlSW5mbwkJCUdQUy1NZWFzdXJlSW5mbwkJCU9QVElPTkFMLAorCWxvY2F0aW9uRXJyb3IJCQlMb2NhdGlvbkVycm9yCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIJCU9QVElPTkFMLAorCS4uLiwJCisJLS0gUmVsZWFzZSBleHRlbnNpb24gaGVyZQorCXJlbC05OC1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCQkKKwkJCQkJCQlSZWwtOTgtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgkJT1BUSU9OQUwsCisJcmVsLTUtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgorCQkJCQkJCVJlbC01LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24JCU9QVElPTkFMLAorCS0tIHJlbC01LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24gYW5kIG90aGVyIHBvc3NpYmxlIGZ1dHVyZSBleHRlbnNpb25zCisJLS0gYXJlIHRoZSBvbmx5IGluZm9ybWF0aW9uIGVsZW1lbnRzIHRoYXQgbWF5IGJlIGluY2x1ZGVkIGluIHRoZSAybmQKKwktLSBNc3JQb3NpdGlvbi1Sc3AgY29tcG9uZW50IHdoZW4gUlJMUCBwc2V1ZG8tc2VnbWVudGF0aW9uIGlzIHVzZWQKKwlyZWwtNy1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCisJCQkJCQkJUmVsLTctTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgkJT1BUSU9OQUwKK30KKworLS0gQXNzaXN0YW5jZSBEYXRhIGNvbXBvbmVudAorQXNzaXN0YW5jZURhdGEgOjo9IFNFUVVFTkNFIHsKKwlyZWZlcmVuY2VBc3Npc3REYXRhCVJlZmVyZW5jZUFzc2lzdERhdGEJCQlPUFRJT05BTCwKKwltc3JBc3Npc3REYXRhCQkJTXNyQXNzaXN0RGF0YQkJCU9QVElPTkFMLAorCXN5c3RlbUluZm9Bc3Npc3REYXRhCVN5c3RlbUluZm9Bc3Npc3REYXRhCU9QVElPTkFMLAorCWdwcy1Bc3Npc3REYXRhCQkJR1BTLUFzc2lzdERhdGEJCQlPUFRJT05BTCwJCisJbW9yZUFzc0RhdGFUb0JlU2VudAkJTW9yZUFzc0RhdGFUb0JlU2VudAkJT1BUSU9OQUwsCS0tIElmIG5vdCBwcmVzZW50LCBpbnRlcnByZXQgYXMgb25seQorCQkJCQkJCQkJCQkJCQkJCS0tIEFzc2lzdGFuY2UgRGF0YSBjb21wb25lbnQgdXNlZCB0bworCQkJCQkJCQkJCQkJCQkJCS0tIGRlbGl2ZXIgZW50aXJlIHNldCBvZiBhc3Npc3RhbmNlCisJCQkJCQkJCQkJCQkJCQkJLS0gZGF0YS4KKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAorCS0tIFJlbGVhc2UgZXh0ZW5zaW9uIGhlcmUKKwlyZWw5OC1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24JUmVsOTgtQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uCU9QVElPTkFMLAorCXJlbDUtQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uCVJlbDUtQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uCU9QVElPTkFMLAorIHJlbDctQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uIFJlbDctQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uIE9QVElPTkFMCQorfQorCistLSBQcm90b2NvbCBFcnJvciBjb21wb25lbnQKK1Byb3RvY29sRXJyb3IgOjo9IFNFUVVFTkNFIHsKKwllcnJvckNhdXNlCQkJCUVycm9yQ29kZXMsCQorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCisJLS0gUmVsZWFzZSBleHRlbnNpb25zIGhlcmUKKwlyZWwtNS1Qcm90b2NvbEVycm9yLUV4dGVuc2lvbiBSZWwtNS1Qcm90b2NvbEVycm9yLUV4dGVuc2lvbgkJT1BUSU9OQUwKK30KKworLS0gUG9zaXRpb24gaW5zdHJ1Y3Rpb25zCitQb3NpdGlvbkluc3RydWN0IDo6PSBTRVFVRU5DRSB7CisJLS0gTWV0aG9kIHR5cGUKKwltZXRob2RUeXBlCQkJCU1ldGhvZFR5cGUsCQorCXBvc2l0aW9uTWV0aG9kCQkJUG9zaXRpb25NZXRob2QsCisJbWVhc3VyZVJlc3BvbnNlVGltZQkJTWVhc3VyZVJlc3BvbnNlVGltZSwJCQorCXVzZU11bHRpcGxlU2V0cwkJCVVzZU11bHRpcGxlU2V0cywJCQorCWVudmlyb25tZW50Q2hhcmFjdGVyCUVudmlyb25tZW50Q2hhcmFjdGVyCU9QVElPTkFMCQorfQorCistLQorTWV0aG9kVHlwZSA6Oj0gQ0hPSUNFIHsKKwltc0Fzc2lzdGVkCQlBY2N1cmFjeU9wdCwJLS0gYWNjdXJhY3kgaXMgb3B0aW9uYWwKKwltc0Jhc2VkCQkJQWNjdXJhY3ksCQktLSBhY2N1cmFjeSBpcyBtYW5kYXRvcnkKKwltc0Jhc2VkUHJlZgkJQWNjdXJhY3ksCQktLSBhY2N1cmFjeSBpcyBtYW5kYXRvcnkKKwltc0Fzc2lzdGVkUHJlZglBY2N1cmFjeSAJCS0tIGFjY3VyYWN5IGlzIG1hbmRhdG9yeQorfQorCistLSBBY2N1cmFjeSBvZiB0aGUgbG9jYXRpb24gZXN0aW1hdGlvbgorQWNjdXJhY3lPcHQgOjo9IFNFUVVFTkNFIHsKKwlhY2N1cmFjeQkJQWNjdXJhY3kJT1BUSU9OQUwKK30KKworLS0gVGhlIHZhbHVlcyBvZiB0aGlzIGZpZWxkIGFyZSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyIChVbmNlcnRhaW50eSBjb2RlKQorQWNjdXJhY3kgOjo9IElOVEVHRVIgKDAuLjEyNykKKworCistLSBQb3NpdGlvbiBNZXRob2QKK1Bvc2l0aW9uTWV0aG9kIDo6PSBFTlVNRVJBVEVEIHsKKwllb3RkICgwKSwKKwlncHMgKDEpLAorCWdwc09yRU9URCAoMikKK30KKworLS0gTWVhc3VyZW1lbnQgcmVxdWVzdCByZXNwb25zZSB0aW1lCitNZWFzdXJlUmVzcG9uc2VUaW1lIDo6PSBJTlRFR0VSICgwLi43KQorCistLSB1c2VNdWx0aXBsZSBTZXRzLCBGRlMhCitVc2VNdWx0aXBsZVNldHMgOjo9IEVOVU1FUkFURUQgeworCW11bHRpcGxlU2V0cyAoMCksCQktLSBtdWx0aXBsZSBzZXRzIGFyZSBhbGxvd2VkCisJb25lU2V0ICgxKQkJCQktLSBzZW5kaW5nIG9mIG11bHRpcGxlIGlzIG5vdCBhbGxvd2VkCit9CisKKy0tIEVudmlyb25tZW50IGNoYXJhY3Rlcml6YXRpb24KK0Vudmlyb25tZW50Q2hhcmFjdGVyIDo6PSBFTlVNRVJBVEVEIHsKKwliYWRBcmVhICgwKSwJCS0tIGJhZCB1cmJhbiBvciBzdWJ1cmJhbiwgaGVhdnkgbXVsdGlwYXRoIGFuZCBOTE9TCisJbm90QmFkQXJlYSAoMSksCQktLSBsaWdodCBtdWx0aXBhdGggYW5kIE5MT1MKKwltaXhlZEFyZWEgKDIpLAkJLS0gbm90IGRlZmluZWQgb3IgbWl4ZWQgZW52aXJvbm1lbnQKKwkuLi4KK30KKworLS0gRS1PVEQgcmVmZXJlbmNlIEJUUyBmb3IgQXNzaXRhbmNlIGRhdGEgSUUKK1JlZmVyZW5jZUFzc2lzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwliY2NoQ2FycmllcgkJQkNDSENhcnJpZXIsCQkJCQkJLS0gQkNDSCBjYXJyaWVyCisJYnNpYwkJCUJTSUMsCQkJCQkJCQktLSBCU0lDCisJdGltZVNsb3RTY2hlbWUJVGltZVNsb3RTY2hlbWUsIAkJCQkJLS0gVGltZXNsb3Qgc2NoZW1lCisJYnRzUG9zaXRpb24JCUJUU1Bvc2l0aW9uCQkJT1BUSU9OQUwKK30KKworLS0gZWxsaXBzb2lkIHBvaW50IGFuZAorLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggYWx0aXR1ZGUgYW5kIHVuY2VydGFpbnR5IGVsbGlwc29pZCBzaGFwZXMgYXJlIHN1cHBvcnRlZAorQlRTUG9zaXRpb24gOjo9IEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbgorCistLSBSRiBjaGFubmVsIG51bWJlciBvZiBCQ0NICitCQ0NIQ2FycmllciA6Oj0gSU5URUdFUiAoMC4uMTAyMykKKworLS0gQmFzZSBzdGF0aW9uIElkZW50aXR5IENvZGUKK0JTSUMgOjo9IElOVEVHRVIgKDAuLjYzKQorCistLSBUaW1lc2xvdCBzY2hlbWUKK1RpbWVTbG90U2NoZW1lIDo6PSBFTlVNRVJBVEVEIHsKKwllcXVhbExlbmd0aCAoMCksCisJdmFyaW91c0xlbmd0aCAoMSkKK30KKworLS0gVGltZSBzbG90IChtb2R1bG8pCitNb2R1bG9UaW1lU2xvdCA6Oj0gSU5URUdFUiAoMC4uMykKKworLS0gRS1PVEQgbWVhc3VyZW1lbnQgYXNzaXN0YW5jZSBkYXRhIElFCistLSBUaGUgdG90YWwgbnVtYmVyIG9mIG5laWdoYm9ycyBpbiB0aGlzIGVsZW1lbnQgKE1zckFzc2lzdERhdGEpCistLSBhbmQgaW4gU3lzdGVtSW5mb0Fzc2lzdERhdGEgZWxlbWVudCAocHJlc2VudGVkIG5laWdoYm9ycworLS0gY2FuIGJlIGF0IGEgbWF4aW11bSAxNSEpCitNc3JBc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJIG1zckFzc2lzdExpc3QgU2VxT2ZNc3JBc3Npc3RCVFMKK30KK1NlcU9mTXNyQXNzaXN0QlRTIDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNSkpIE9GIE1zckFzc2lzdEJUUworCitNc3JBc3Npc3RCVFMgOjo9IFNFUVVFTkNFIHsKKwliY2NoQ2FycmllcgkJCUJDQ0hDYXJyaWVyLAkJLS0gQkNDSCBjYXJyaWVyCisJYnNpYwkJCQlCU0lDLAkJCQktLSBCU0lDCisJbXVsdGlGcmFtZU9mZnNldAlNdWx0aUZyYW1lT2Zmc2V0LCAJLS0gbXVsdGlmcmFtZSBvZmZzZXQKKwl0aW1lU2xvdFNjaGVtZQkJVGltZVNsb3RTY2hlbWUsCQktLSBUaW1lc2xvdCBzY2hlbWUKKwlyb3VnaFJURAkJCVJvdWdoUlRELAkJCS0tIHJvdWdoIFJURCB2YWx1ZQorCisJLS0gTG9jYXRpb24gQ2FsY3VsYXRpb24gQXNzaXN0YW5jZSBkYXRhIGlzIG1vdmVkIGhlcmUKKwljYWxjQXNzaXN0YW5jZUJUUwlDYWxjQXNzaXN0YW5jZUJUUwlPUFRJT05BTAorfQorCistLSBNdWx0aWZyYW1lIG9mZnNldAorTXVsdGlGcmFtZU9mZnNldCA6Oj0gSU5URUdFUiAoMC4uNTEpCistLSBUaGUgTXVsdGlmcmFtZSBPZmZzZXQgdmFsdWUgNTEgc2hhbGwgbm90IGJlIGVuY29kZWQgYnkgdGhlIHRyYW5zbWl0dGluZyBlbnRpdHkgYW5kCistLSBzaGFsbCBiZSB0cmVhdGVkIGJ5IHRoZSByZWNlaXZpbmcgZW50aXR5IGFzIDAuCisKKy0tIFJvdWdoIFJURCB2YWx1ZSBiZXR3ZWVuIG9uZSBiYXNlIHN0YXRpb24gYW5kIHJlZmVyZW5jZSBCVFMKK1JvdWdoUlREIDo6PSBJTlRFR0VSICgwLi4xMjUwKQorLS0gVGhlIFJvdWdoUlREIHZhbHVlIDEyNTAgc2hhbGwgbm90IGJlIGVuY29kZWQgYnkgdGhlIHRyYW5zbWl0dGluZyBlbnRpdHkgYW5kIHNoYWxsCistLSBiZSB0cmVhdGVkIGJ5IHRoZSByZWNlaXZpbmcgZW50aXR5IGFzIDAuCisKKy0tIEUtT1REIE1lYXN1cmVtZW50IGFzc2lzdGFuY2UgZGF0YSBmb3Igc3lzdGVtIGluZm9ybWF0aW9uIExpc3QgSUUKKy0tIFRoZSB0b3RhbCBudW1iZXIgb2YgYmFzZSBzdGF0aW9ucyBpbiB0aGlzIGVsZW1lbnQgKFN5c3RlbUluZm9Bc3Npc3REYXRhCistLSBwcmVzZW50ZWQgbmVpZ2hib3JzKSBhbmQgaW4gTXNyQXNzaXN0RGF0YSBlbGVtZW50IGNhbiBiZSBhdCBhIG1heGltdW0gMTUuCitTeXN0ZW1JbmZvQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCXN5c3RlbUluZm9Bc3Npc3RMaXN0IAlTZXFPZlN5c3RlbUluZm9Bc3Npc3RCVFMKK30KK1NlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUzo6PSBTRVFVRU5DRSAoU0laRSgxLi4zMikpIE9GIFN5c3RlbUluZm9Bc3Npc3RCVFMKKworLS0gd2hldGhlciBuLnRoIGlzIHByZXNlbnQgb3Igbm90ID8KK1N5c3RlbUluZm9Bc3Npc3RCVFMgOjo9IENIT0lDRSB7CisJbm90UHJlc2VudAkJTlVMTCwKKwlwcmVzZW50CQkJQXNzaXN0QlRTRGF0YQorfQorCistLSBBY3R1YWwgYXNzaXN0YW5jZSBkYXRhIGZvciBzeXN0ZW0gaW5mb3JtYXRpb24gYmFzZSBzdGF0aW9uCitBc3Npc3RCVFNEYXRhIDo6PSBTRVFVRU5DRSB7CisJYnNpYwkJCQlCU0lDLAkJCQktLSBCU0lDCisJbXVsdGlGcmFtZU9mZnNldAlNdWx0aUZyYW1lT2Zmc2V0LAktLSBtdWx0aWZyYW1lIG9mZnNldAorCXRpbWVTbG90U2NoZW1lCQlUaW1lU2xvdFNjaGVtZSwJCS0tIFRpbWVzbG90IHNjaGVtZQorCXJvdWdoUlRECQkJUm91Z2hSVEQsCQkJLS0gcm91Z2ggUlREIHZhbHVlCisKKwktLSBMb2NhdGlvbiBDYWxjdWxhdGlvbiBBc3Npc3RhbmNlIGRhdGEKKwljYWxjQXNzaXN0YW5jZUJUUwlDYWxjQXNzaXN0YW5jZUJUUwlPUFRJT05BTAorfQorCistLSBFLU9URCBMb2NhdGlvbiBjYWxjdWxhdGlvbiBhc3Npc3RhbmNlIGRhdGEsCistLSBDYWxjQXNzaXN0YW5jZUJUUyBlbGVtZW50IGlzIG9wdGlvbmFsIG5vdCBzdWJmaWVsZHMKK0NhbGNBc3Npc3RhbmNlQlRTIDo6PSBTRVFVRU5DRSB7CisJZmluZVJURAkJCQlGaW5lUlRELAkJLS0gZmluZSBSVEQgdmFsdWUgYmV0d2VlbiBiYXNlIHN0YXRpb25zCisJcmVmZXJlbmNlV0dTODQJCVJlZmVyZW5jZVdHUzg0CS0tIHJlZmVyZW5jZSBjb29yZGluYXRlcworfQorCistLSBDb29yZGluYXRlcyBvZiBuZWlnaGJvdXIgQlRTLCBXR1MtODQgZWxsaXBzb2lkCitSZWZlcmVuY2VXR1M4NCA6Oj0gU0VRVUVOQ0UgeworCXJlbGF0aXZlTm9ydGgJUmVsRGlzdGFuY2UsCQkJCS0tIHJlbGF0aXZlIGRpc3RhbmNlIChzb3V0aCBuZWdhdGl2ZSkKKwlyZWxhdGl2ZUVhc3QJUmVsRGlzdGFuY2UsCQkJCS0tIHJlbGF0aXZlIGRpc3RhbmNlICh3ZXN0IG5lZ2F0aXZlKQorCS0tIFJlbGF0aXZlIEFsdGl0dWRlIGlzIG5vdCBhbHdheXMga25vd24KKwlyZWxhdGl2ZUFsdAkJUmVsYXRpdmVBbHQJCU9QVElPTkFMCS0tIHJlbGF0aXZlIGFsdGl0dWRlCit9CisKKy0tIEZpbmUgUlREIHZhbHVlIGJldHdlZW4gdGhpcyBCVFMgYW5kIHRoZSByZWZlcmVuY2UgQlRTCQorRmluZVJURCA6Oj0gSU5URUdFUiAoMC4uMjU1KQorCistLSBSZWxhdGl2ZSBub3J0aC9lYXN0IGRpc3RhbmNlCitSZWxEaXN0YW5jZSA6Oj0gSU5URUdFUiAoLTIwMDAwMC4uMjAwMDAwKQorCistLSBSZWxhdGl2ZSBhbHRpdHVkZQorUmVsYXRpdmVBbHQgOjo9IElOVEVHRVIgKC00MDAwLi40MDAwKQorCistLSBNZWFzdXJlIHBvc2l0aW9uIHJlc3BvbnNlIElFcworLS0gUmVmZXJlbmNlIElkZW50aXR5CistLSBNdWx0aXBsZSBzZXRzCitNdWx0aXBsZVNldHMgOjo9IFNFUVVFTkNFIHsKKwktLSBudW1iZXIgb2YgcmVmZXJlbmNlIHNldHMKKwluYnJPZlNldHMJCQlJTlRFR0VSICgyLi4zKSwJCQorCisJLS0gVGhpcyBmaWVsZCBhY3R1YWxseSB0ZWxscyB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBCVFNzCisJbmJyT2ZSZWZlcmVuY2VCVFNzCUlOVEVHRVIgKDEuLjMpLAorCisJLS0gVGhpcyBmaWVsZCBpcyBjb25kaXRpb25hbCBhbmQgaW5jbHVkZWQgb3B0aW9uYWxseSBvbmx5IGlmCisJLS0gbmJyT2ZTZXRzIGlzIDMgYW5kIG51bWJlciBvZiByZWZlcmVuY2UgQlRTcyBpcyAyLgorCXJlZmVyZW5jZVJlbGF0aW9uCQlSZWZlcmVuY2VSZWxhdGlvbgkJT1BUSU9OQUwKK30KKworLS0gUmVsYXRpb24gYmV0d2VlbiByZWZlbmNlIEJUU3MgYW5kIHNldHMKK1JlZmVyZW5jZVJlbGF0aW9uIDo6PSBFTlVNRVJBVEVEIHsKKwlzZWNvbmRCVFNUaGlyZFNldCAoMCksCS0tIDFzdCBCVFMgcmVsYXRlZCB0byAxc3QgYW5kIDJuZCBzZXRzCisJc2Vjb25kQlRTU2Vjb25kU2V0ICgxKSwJLS0gMXN0IEJUUyByZWxhdGVkIHRvIDFzdCBhbmQgM3JkIHNldHMKKwlmaXJzdEJUU0ZpcnN0U2V0ICgyKQktLSAxc3QgQlRTIHJlbGF0ZWQgdG8gMXN0IHNldAorfQorCistLSBSZWZlcmVuY2UgQlRTIElkZW50aXR5LCB0aGlzIGVsZW1lbnQgY29udGFpbnMgbnVtYmVyIG9mCistLSBCVFNzIHRvbGQgbmJyT2ZSZWZlcmVuY2VCVFNzIGZpZWxkIGluIE11bHRpcGxlIHNldHMgZWxlbWVudCkKK1JlZmVyZW5jZUlkZW50aXR5IDo6PSBTRVFVRU5DRSB7CisJLS0gUmVmZXJlbmNlIEJUUyBsaXN0CisJcmVmQlRTTGlzdAkJU2VxT2ZSZWZlcmVuY2VJZGVudGl0eVR5cGUKK30KK1NlcU9mUmVmZXJlbmNlSWRlbnRpdHlUeXBlIDo6PSBTRVFVRU5DRSAoU0laRSgxLi4zKSkgT0YgUmVmZXJlbmNlSWRlbnRpdHlUeXBlCisKKy0tIENlbGwgaWRlbnRpdHkKK1JlZmVyZW5jZUlkZW50aXR5VHlwZSA6Oj0gQ0hPSUNFIHsKKwlic2ljQW5kQ2FycmllcglCU0lDQW5kQ2FycmllciwJCS0tIEJTSUMgYW5kIENhcnJpZXIKKwljaQkJCQlDZWxsSUQsCQkJCS0tIENlbGwgSUQsIExBQyBub3QgbmVlZGVkCisJcmVxdWVzdEluZGV4CVJlcXVlc3RJbmRleCwJCS0tIEluZGV4IHRvIFJlcXVlc3RlZCBOZWlnaGJvciBMaXN0CisJc3lzdGVtSW5mb0luZGV4CVN5c3RlbUluZm9JbmRleCwJLS0gSW5kZXggdG8gU3lzdGVtIGluZm8gbGlzdCwgdGhpcyB0eXBlIG9mIHJlZi4gaWRlbnRpdHkKKwkJCQkJCQkJCQktLSBzaGFsbCBub3QgYmUgdXNlZCBieSB0aGUgTVMgdW5sZXNzIGl0IGhhcyByZWNlaXZlZAorCQkJCQkJCQkJCS0tIHRoZSBTeXN0ZW1JbmZvQXNzaXN0RGF0YSBmcm9tIHRoZSBTTUxDIGZvciB0aGlzIGNlbGwuCisJY2lBbmRMQUMJCUNlbGxJREFuZExBQwkJLS0gQ0kgYW5kIExBQworfQorCitCU0lDQW5kQ2FycmllciA6Oj0gU0VRVUVOQ0UgeworCWNhcnJpZXIJQkNDSENhcnJpZXIsCisJYnNpYwkJQlNJQworfQorCitSZXF1ZXN0SW5kZXggOjo9IElOVEVHRVIgKDEuLjE2KQorCitTeXN0ZW1JbmZvSW5kZXggOjo9IElOVEVHRVIgKDEuLjMyKQorCitDZWxsSURBbmRMQUMgOjo9IFNFUVVFTkNFIHsKKwlyZWZlcmVuY2VMQUMJTEFDSUQsCQkJCS0tIExvY2F0aW9uIGFyZWEgY29kZQorCXJlZmVyZW5jZUNJCQlDZWxsSUQJCQkJLS0gQ2VsbCBpZGVudGl0eQorfQorQ2VsbElEIDo6PSBJTlRFR0VSICgwLi42NTUzNSkKK0xBQ0lEIDo6PSBJTlRFR0VSICgwLi42NTUzNSkKKworLS0gT1RELU1lYXN1cmVJbmZvCitPVEQtTWVhc3VyZUluZm8gOjo9IFNFUVVFTkNFIHsKKwktLSBNZWFzdXJlbWVudCBpbmZvIGVsZW1lbnRzLCBPVEQtTXNyRWxlbWVudCBpcyByZXBlYXRlZCBudW1iZXIgb2YgdGltZXMKKwktLSB0b2xkIGluIG5ick9mUmVmZXJlbmNlQlRTcyBpbiBNdWx0aXBsZVNldHMsIGRlZmF1bHQgdmFsdWUgaXMgMQorCW90ZE1zckZpcnN0U2V0cwkJT1RELU1zckVsZW1lbnRGaXJzdCwKKworCS0tIGlmIG1vcmUgdGhhbiBvbmUgc2V0cyBhcmUgcHJlc2VudCB0aGlzIGVsZW1lbnQgaXMgcmVwZWF0ZWQKKwktLSBOdW1iZXJPZlNldHMgLSAxICgtMSA9IGZpcnN0IHNldCkKKwlvdGRNc3JSZXN0U2V0cwkJU2VxT2ZPVEQtTXNyRWxlbWVudFJlc3QJCU9QVElPTkFMCit9CisKK1NlcU9mT1RELU1zckVsZW1lbnRSZXN0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4yKSkgT0YgT1RELU1zckVsZW1lbnRSZXN0CisKKy0tIE9URCBtZWFzdXJlbnQgaW5mb3JtYXRpb24gZm9yIDEgc2V0CitPVEQtTXNyRWxlbWVudEZpcnN0IDo6PSBTRVFVRU5DRSB7CisJcmVmRnJhbWVOdW1iZXIJCQlJTlRFR0VSICgwLi40MjQzMSksIAkJCQktLSBGcmFtZSBudW1iZXIgbW9kdWxvIDQyNDMyCisJcmVmZXJlbmNlVGltZVNsb3QJCU1vZHVsb1RpbWVTbG90LAorCXRvYU1lYXN1cmVtZW50c09mUmVmCVRPQS1NZWFzdXJlbWVudHNPZlJlZglPUFRJT05BTCwKKwlzdGRSZXNvbHV0aW9uCQkJU3RkUmVzb2x1dGlvbiwKKwl0YUNvcnJlY3Rpb24JCQlJTlRFR0VSICgwLi45NjApCQlPUFRJT05BTCwJLS0gVEEgY29ycmVjdGlvbgorCisJLS0gbWVhc3VyZWQgbmVpZ2hib3JzIGluIE9URCBtZWFzdXJlbWVudHMKKwlvdGQtRmlyc3RTZXRNc3JzIAkJU2VxT2ZPVEQtRmlyc3RTZXRNc3JzIAlPUFRJT05BTAorfQorU2VxT2ZPVEQtRmlyc3RTZXRNc3JzIDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xMCkpIE9GIE9URC1GaXJzdFNldE1zcnMKKworLS0gT1REIG1lYXN1cmVudCBpbmZvcm1hdGlvbiAyIGFuZCAzIHNldHMgaWYgZXhpc3QKK09URC1Nc3JFbGVtZW50UmVzdCA6Oj0gU0VRVUVOQ0UgeworCXJlZkZyYW1lTnVtYmVyCQkJSU5URUdFUiAoMC4uNDI0MzEpLCAJCQkJCS0tIEZyYW1lIG51bWJlciBtb2R1bG8gNDI0MzIKKwlyZWZlcmVuY2VUaW1lU2xvdAkJTW9kdWxvVGltZVNsb3QsCisJdG9hTWVhc3VyZW1lbnRzT2ZSZWYJVE9BLU1lYXN1cmVtZW50c09mUmVmCQlPUFRJT05BTCwKKwlzdGRSZXNvbHV0aW9uCQkJU3RkUmVzb2x1dGlvbiwKKwl0YUNvcnJlY3Rpb24JCQlJTlRFR0VSICgwLi45NjApCQkJT1BUSU9OQUwsCS0tIFRBIGNvcnJlY3Rpb24KKworCS0tIG1lYXN1cmVkIG5laWdoYm9ycyBpbiBPVEQgbWVhc3VyZW1lbnRzCisJb3RkLU1zcnNPZk90aGVyU2V0cyAJU2VxT2ZPVEQtTXNyc09mT3RoZXJTZXRzCU9QVElPTkFMCit9CitTZXFPZk9URC1Nc3JzT2ZPdGhlclNldHMgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjEwKSkgT0YgT1RELU1zcnNPZk90aGVyU2V0cworCistLSBTdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIFRPQSBtZWFzdXJlbWVudHMgZnJvbSB0aGUgcmVmZXJlbmNlIEJUUworVE9BLU1lYXN1cmVtZW50c09mUmVmIDo6PSBTRVFVRU5DRSB7CisJcmVmUXVhbGl0eQkJCVJlZlF1YWxpdHksCisJbnVtT2ZNZWFzdXJlbWVudHMJTnVtT2ZNZWFzdXJlbWVudHMKK30KKworUmVmUXVhbGl0eSA6Oj0gSU5URUdFUiAoMC4uMzEpCQkJLS0gU3QgRGV2IG9mIFRPQSBvZiByZWZlcmVuY2UgYXMgZGVmaW5lZCBpbiBhbm5leAorTnVtT2ZNZWFzdXJlbWVudHMgOjo9IElOVEVHRVIgKDAuLjcpCS0tIE5vLiBvZiBtZWFzdXJlbWVudHMgZm9yIFJlZlF1YWxpdHkgYXMgZGVmaW5lZCBpbiBhbm5leAorU3RkUmVzb2x1dGlvbiA6Oj0gSU5URUdFUiAoMC4uMykJCS0tIFZhbHVlcyBvZiByZXNvbHV0aW9uIGFyZSBkZWZpbmVkIGluIGFubmV4CisKK09URC1GaXJzdFNldE1zcnMgOjo9IE9URC1NZWFzdXJlbWVudFdpdGhJRAorCistLSBOZWlnaGJvdXIgaW5mbyBpbiBPVEQgbWVhc3VyZW1lbnRzIDAtMTAgdGltZXMgaW4gVEQgbWVhc3VyZW1lbnQgaW5mbworT1RELU1zcnNPZk90aGVyU2V0cyA6Oj0gQ0hPSUNFIHsKKwlpZGVudGl0eU5vdFByZXNlbnQJT1RELU1lYXN1cmVtZW50LAkKKwlpZGVudGl0eVByZXNlbnQJCU9URC1NZWFzdXJlbWVudFdpdGhJRAorfQorCistLSBGb3IgdGhpcyBPVEQgbWVhc3VyZW1lbnQgaWRlbnRpdHkgaXMgc2FtZSBhcyB0aGUgaWRlbnRpdHkgb2YgQlRTCistLSBpbiB0aGUgZmlyc3Qgc2V0IHdpdGggc2FtZSBzZXF1ZW5jZSBudW1iZXIKK09URC1NZWFzdXJlbWVudCA6Oj0gU0VRVUVOQ0UgeworCW5ib3JUaW1lU2xvdAlNb2R1bG9UaW1lU2xvdCwKKwllb3RkUXVhbGl0eQkJRU9URFF1YWxpdHksCisJb3RkVmFsdWUJCU9URFZhbHVlCit9CisKKy0tIFRoaXMgbWVhc3VyZW1lbnQgY29udGFpbnMgdGhlIEJUUyBpZGVudGl0eSBhbmQgbWVhc3VyZW1lbnQKK09URC1NZWFzdXJlbWVudFdpdGhJRCA6Oj1TRVFVRU5DRSB7CisJbmVpZ2hib3JJZGVudGl0eQlOZWlnaGJvcklkZW50aXR5LAorCW5ib3JUaW1lU2xvdAkJTW9kdWxvVGltZVNsb3QsCisJZW90ZFF1YWxpdHkJCQlFT1REUXVhbGl0eSwKKwlvdGRWYWx1ZQkJCU9URFZhbHVlCit9CisKK0VPVERRdWFsaXR5IDo6PSBTRVFVRU5DRSB7CisJbmJyT2ZNZWFzdXJlbWVudHMJSU5URUdFUgkoMC4uNyksCisJc3RkT2ZFT1RECQkJSU5URUdFUiAoMC4uMzEpCit9CisKK05laWdoYm9ySWRlbnRpdHkgOjo9IENIT0lDRSB7CisJYnNpY0FuZENhcnJpZXIJCUJTSUNBbmRDYXJyaWVyLAkJLS0gQlNJQyBhbmQgQ2FycmllcgorCWNpCQkJCQlDZWxsSUQsCQkJCS0tIENlbGwgSUQsIExBQyBub3QgbmVlZGVkCisJbXVsdGlGcmFtZUNhcnJpZXIJTXVsdGlGcmFtZUNhcnJpZXIsIAktLSBNdWx0aUZyYW1lT2ZmZXN0IGFuZCBCU0lDCisJcmVxdWVzdEluZGV4CQlSZXF1ZXN0SW5kZXgsCQktLSBJbmRleCB0byBSZXF1ZXN0ZWQgTmVpZ2hib3IgTGlzdAorCXN5c3RlbUluZm9JbmRleAkJU3lzdGVtSW5mb0luZGV4LAktLSBJbmRleCB0byBTeXN0ZW0gaW5mbyBsaXN0LCB0aGlzIHR5cGUgb2YgbmVpZ2hib3VyCisJCQkJCQkJCQkJCS0tIGlkZW50aXR5IHNoYWxsIG5vdCBiZSB1c2VkIGJ5IHRoZSBNUyB1bmxlc3MgaXQgaGFzCisJCQkJCQkJCQkJCS0tIHJlY2VpdmVkIHRoZSBTeXN0ZW1JbmZvQXNzaXN0RGF0YSBmcm9tIHRoZSBTTUxDIGZvcgorCQkJCQkJCQkJCQktLSB0aGlzIGNlbGwuCisJY2lBbmRMQUMJCQlDZWxsSURBbmRMQUMJCS0tIENJIGFuZCBMQUMKK30KKworLS0gTXVsdGlmcmFtZSBhbmQgY2FycmllcgorTXVsdGlGcmFtZUNhcnJpZXIgOjo9IFNFUVVFTkNFIHsKKwliY2NoQ2FycmllcgkJCUJDQ0hDYXJyaWVyLAorCW11bHRpRnJhbWVPZmZzZXQJTXVsdGlGcmFtZU9mZnNldAorfQorCistLSBPVEQgbWVhc3VyZW1lbnQgdmFsdWUgZm9yIG5laWdoYm91cgorT1REVmFsdWUgOjo9IElOVEVHRVIgKDAuLjM5OTk5KQorCistLSBMb2NhdGlvbiBpbmZvcm1hdGlvbiBJRQorTG9jYXRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJcmVmRnJhbWUJCUlOVEVHRVIgKDAuLjY1NTM1KSwJCQktLSBSZWZlcmVuY2UgRnJhbWUgbnVtYmVyCisJLS0gSWYgcmVmRnJhbWUgaXMgd2l0aGluICg0MjQzMi4uNjU1MzUpLCBpdCBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlcgorCS0tIGluIHRoYXQgY2FzZSB0aGUgTVMgc2hvdWxkIHByb3ZpZGUgR1BTIFRPVyBpZiBhdmFpbGFibGUKKwlncHNUT1cJCQlJTlRFR0VSICgwLi4xNDM5OTk5OSkJT1BUSU9OQUwsCS0tIEdQUyBUT1cKKwlmaXhUeXBlCQkJRml4VHlwZSwKKwktLSBOb3RlIHRoYXQgYXBwbGljYWJsZSByYW5nZSBmb3IgcmVmRnJhbWUgaXMgMCAtIDQyNDMxCisJLS0gUG9zc2libGUgc2hhcGVzIGNhcnJpZWQgaW4gcG9zRXN0aW1hdGUgYXJlCisJLS0gZWxsaXBzb2lkIHBvaW50LAorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZQorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGVsbGlwc2UKKwktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCBhbHRpdHVkZSBhbmQgdW5jZXJ0YWludHkgZWxsaXBzb2lkCisJcG9zRXN0aW1hdGUJCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbgorfQorCitGaXhUeXBlIDo6PSBJTlRFR0VSIHsKKwl0d29ERml4ICgwKSwKKwl0aHJlZURGaXggKDEpCit9ICgwLi4xKQorCistLSBHUFMtTWVhc3VyZW1lbnQgaW5mb3JtYXRpb24KK0dQUy1NZWFzdXJlSW5mbyA6Oj0gU0VRVUVOQ0UgeworCS0tIE1lYXN1cmVtZW50IGluZm8gZWxlbWVudHMKKwktLSB1c2VyIGhhcyB0byBtYWtlIHN1cmUgdGhhdCBpbiB0aGlzIGVsZW1lbnQgaXMgbnVtYmVyIG9mIGVsZW1lbnRzCisJLS0gZGVmaW5lZCBpbiByZWZlcmVuY2UgQlRTIGlkZW50aXR5CisJZ3BzTXNyU2V0TGlzdAlTZXFPZkdQUy1Nc3JTZXRFbGVtZW50CQorfQorU2VxT2ZHUFMtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMykpIE9GIEdQUy1Nc3JTZXRFbGVtZW50CisKKy0tIE9URCBtZWFzdXJlbnQgaW5mb3JtYXRpb24gMS0zIHRpbWVzIGluIG1lc3NhZ2UKK0dQUy1Nc3JTZXRFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJcmVmRnJhbWUJCUlOVEVHRVIgKDAuLjY1NTM1KQlPUFRJT05BTCwgCS0tIFJlZmVyZW5jZSBGcmFtZSBudW1iZXIKKwlncHNUT1cJCQlHUFNUT1cyNGIsCQkJCQkJLS0gR1BTIFRPVworCS0tIE5vdGUgdGhhdCBhcHBsaWNhYmxlIHJhbmdlIGZvciByZWZGcmFtZSBpcyAwIC0gNDI0MzEKKworLS1OX1NBVCBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBvZiBncHMtbXNyTGlzdAorCisJZ3BzLW1zckxpc3QJCVNlcU9mR1BTLU1zckVsZW1lbnQKK30KKworLS0gMjQgYml0IHByZXNlbnRhdGlvbiBmb3IgR1BTVE9XCitHUFNUT1cyNGIgOjo9IElOVEVHRVIgKDAuLjE0Mzk5OTk5KQorCistLSBtZWFzdXJlZCBlbGVtZW50cyBpbiBtZWFzdXJlbWVudCBwYXJhbWV0ZXJzIGZpZWxkCitTZXFPZkdQUy1Nc3JFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNikpIE9GIEdQUy1Nc3JFbGVtZW50CisKK0dQUy1Nc3JFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc2F0ZWxsaXRlSUQJCVNhdGVsbGl0ZUlELAkJCQktLSBTYXRlbGxpdGUgaWRlbnRpZmllcgorCWNObwkJCQlJTlRFR0VSICgwLi42MyksCQkJLS0gY2FycmllciBub2lzZSByYXRpbworCWRvcHBsZXIJCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwgCS0tIGRvcHBsZXIsIG11bGx0aXBseSBieSAwLjIKKwl3aG9sZUNoaXBzCQlJTlRFR0VSICgwLi4xMDIyKSwJCQktLSB3aG9sZSB2YWx1ZSBvZiB0aGUgY29kZSBwaGFzZSBtZWFzdXJlbWVudAorCWZyYWNDaGlwcwkJSU5URUdFUiAoMC4uMTAyNCksCQkJLS0gZnJhY3Rpb25hbCB2YWx1ZSBvZiB0aGUgY29kZSBwaGFzZSBtZWFzdXJlbWVudAorCQkJCQkJCQkJCQktLSBhIHZhbHVlIG9mIDEwMjQgc2hhbGwgbm90IGJlIGVuY29kZWQgYnkgdGhlIHNlbmRlcgorCQkJCQkJCQkJCQktLSB0aGUgcmVjZWl2ZXIgc2hhbGwgY29uc2lkZXIgYSB2YWx1ZSBvZiAxMDI0IHRvIGJlCisJCQkJCQkJCQkJCS0tIGludmFsaWQgZGF0YQorCW1wYXRoSW5kaWMJCU1wYXRoSW5kaWMsCQkJCQktLSBtdWx0aXBhdGggaW5kaWNhdG9yCisJcHNldVJhbmdlUk1TRXJyCUlOVEVHRVIgKDAuLjYzKQkJCQktLSBpbmRleAkJCit9CisKKy0tIE11bHRpcGF0aCBpbmRpY2F0b3IKK01wYXRoSW5kaWMgOjo9IEVOVU1FUkFURUQgeworCW5vdE1lYXN1cmVkICgwKSwKKwlsb3cgKDEpLAorCW1lZGl1bSAoMiksCisJaGlnaCAoMykKK30KKworLS0gTG9jYXRpb24gZXJyb3IgSUUKK0xvY2F0aW9uRXJyb3IgOjo9IFNFUVVFTkNFIHsKKwlsb2NFcnJvclJlYXNvbgkJCQlMb2NFcnJvclJlYXNvbiwKKwlhZGRpdGlvbmFsQXNzaXN0YW5jZURhdGEJQWRkaXRpb25hbEFzc2lzdGFuY2VEYXRhCU9QVElPTkFMLAorCS4uLgorfQorCitMb2NFcnJvclJlYXNvbiA6Oj0gRU5VTUVSQVRFRCB7CisJdW5EZWZpbmVkICgwKSwJCisJbm90RW5vdWdoQlRTcyAoMSksCisJbm90RW5vdWdoU2F0cyAoMiksCisJZW90ZExvY0NhbEFzc0RhdGFNaXNzaW5nICgzKSwKKwllb3RkQXNzRGF0YU1pc3NpbmcgKDQpLAorCWdwc0xvY0NhbEFzc0RhdGFNaXNzaW5nICg1KSwKKwlncHNBc3NEYXRhTWlzc2luZyAoNiksCisJbWV0aG9kTm90U3VwcG9ydGVkICg3KSwKKwlub3RQcm9jZXNzZWQgKDgpLAorCXJlZkJUU0ZvckdQU05vdFNlcnZpbmdCVFMgKDkpLAorCXJlZkJUU0ZvckVPVEROb3RTZXJ2aW5nQlRTICgxMCksCisJLi4uLAorCW5vdEVub3VnaEdBTlNTU2F0cyAoMTEpLAkKKyBnYW5zc0Fzc0RhdGFNaXNzaW5nICgxMiksCisJcmVmQlRTRm9yR0FOU1NOb3RTZXJ2aW5nQlRTICgxMykKK30KKworLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gYW4gdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdmFsdWUgMAorCisKKy0tIGRlZmluZXMgYWRkaXRpb25hbCBhc3Npc3RhbmNlIGRhdGEgbmVlZGVkIGZvciBhbnkgbmV3IGxvY2F0aW9uIGF0dGVtcHQKKy0tIE1TIHNoYWxsIHJldGFpbiBhbnkgYXNzaXN0YW5jZSBkYXRhIGFscmVhZHkgcmVjZWl2ZWQKK0FkZGl0aW9uYWxBc3Npc3RhbmNlRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWdwc0Fzc2lzdGFuY2VEYXRhCQlHUFNBc3Npc3RhbmNlRGF0YQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIJCU9QVElPTkFMLAorCS4uLiwKKwlnYW5zc0Fzc2lzdGFuY2VEYXRhIEdBTlNTQXNzaXN0YW5jZURhdGEgT1BUSU9OQUwKK30KKworR1BTQXNzaXN0YW5jZURhdGEgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4R1BTQXNzaXN0YW5jZURhdGEpKQorLS0gR1BTQXNzaXN0YW5jZURhdGEgaGFzIGlkZW50aWNhbCBzdHJ1Y3R1cmUgYW5kIGVuY29kaW5nIHRvIG9jdGV0cyAzIHRvIG4gb2YgdGhlCistLSBHUFMgQXNzaXN0YW5jZSBEYXRhIElFIGluIDNHUFAgVFMgNDkuMDMxCisKK21heEdQU0Fzc2lzdGFuY2VEYXRhCUlOVEVHRVIgOjo9IDQwCisKK0dBTlNTQXNzaXN0YW5jZURhdGEgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4R0FOU1NBc3Npc3RhbmNlRGF0YSkpCistLSBHQU5TU0Fzc2lzdGFuY2VEYXRhIGhhcyBpZGVudGljYWwgc3RydWN0dXJlIGFuZCBlbmNvZGluZyB0byBvY3RldHMgMyB0byBuIG9mIHRoZQorLS0gR0FOU1MgQXNzaXN0YW5jZSBEYXRhIElFIGluIDNHUFAgVFMgNDkuMDMxCisKK21heEdBTlNTQXNzaXN0YW5jZURhdGEJSU5URUdFUiA6Oj0gNDAKKworCistLSBQcm90b2NvbCBFcnJvciBDYXVzZXMKK0Vycm9yQ29kZXMgOjo9IEVOVU1FUkFURUQgeworCXVuRGVmaW5lZCAoMCksCittaXNzaW5nQ29tcG9uZXQgKDEpLAkJCQoraW5jb3JyZWN0RGF0YSAoMiksCQkJCittaXNzaW5nSUVvckNvbXBvbmVudEVsZW1lbnQgKDMpLAkJCittZXNzYWdlVG9vU2hvcnQgKDQpLAkJCQordW5rbm93UmVmZXJlbmNlTnVtYmVyICg1KSwJCQorLi4uCit9CisKKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIGFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHZhbHVlIDAKKworLS0gR1BTIGFzc2lzdGFuY2UgZGF0YSBJRQorR1BTLUFzc2lzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwljb250cm9sSGVhZGVyCQlDb250cm9sSGVhZGVyCit9CisKKy0tIE1vcmUgQXNzaXN0YW5jZSBEYXRhIFRvIEJlIFNlbnQgSUUKKy0tIE1vcmUgQXNzaXN0YW5jZSBEYXRhIENvbXBvbmVudHMgT24gdGhlIFdheSBpbmRpY2F0aW9uIGZvciBkZWxpdmVyeSBvZiBhbiBlbnRpcmUgc2V0IG9mIGFzc2lzdGFuY2UKKy0tIGRhdGEgaW4gbXVsdGlwbGUgQXNzaXN0YW5jZSBEYXRhIGNvbXBvbmVudHMuCisKK01vcmVBc3NEYXRhVG9CZVNlbnQgOjo9IEVOVU1FUkFURUQgeworCW5vTW9yZU1lc3NhZ2VzICgwKSwJCQktLSBUaGlzIGlzIHRoZSBvbmx5IG9yIGxhc3QgQXNzaXN0YW5jZSBEYXRhIG1lc3NhZ2UgdXNlZCB0byBkZWxpdmVyCisJCQkJCQkJCS0tIHRoZSBlbnRpcmUgc2V0IG9mIGFzc2lzdGFuY2UgZGF0YS4KKwltb3JlTWVzc2FnZXNPblRoZVdheSAoMSkJLS0gVGhlIFNNTEMgd2lsbCBzZW5kIG1vcmUgQXNzaXN0YW5jZSBEYXRhIG1lc3NhZ2VzIG9yIGEgZmluYWwgUlJMUAorCQkJCQkJCQktLSBNZWFzdXJlIFBvc2l0aW9uIFJlcXVlc3QgbWVzc2FnZSB0byBkZWxpdmVyIHRoZQorCQkJCQkJCQktLSB0aGUgZW50aXJlIHNldCBvZiBhc3Npc3RhbmNlIGRhdGEuCit9CisKKy0tIENvbnRyb2wgaGVhZGVyIG9mIHRoZSBHUFMgYXNzaXN0YW5jZSBkYXRhCitDb250cm9sSGVhZGVyIDo6PSBTRVFVRU5DRSB7CisKKwktLSBGaWVsZCB0eXBlIFByZXNlbnQgaW5mb3JtYXRpb24KKwlyZWZlcmVuY2VUaW1lCQlSZWZlcmVuY2VUaW1lCQlPUFRJT05BTCwKKwlyZWZMb2NhdGlvbgkJCVJlZkxvY2F0aW9uCQkJT1BUSU9OQUwsCisJZGdwc0NvcnJlY3Rpb25zCQlER1BTQ29ycmVjdGlvbnMJCU9QVElPTkFMLAorCW5hdmlnYXRpb25Nb2RlbAkJTmF2aWdhdGlvbk1vZGVsCQlPUFRJT05BTCwKKwlpb25vc3BoZXJpY01vZGVsCQlJb25vc3BoZXJpY01vZGVsCQlPUFRJT05BTCwKKwl1dGNNb2RlbAkJCVVUQ01vZGVsCQkJT1BUSU9OQUwsCisJYWxtYW5hYwkJCUFsbWFuYWMJCQlPUFRJT05BTCwKKwlhY3F1aXNBc3Npc3QJCUFjcXVpc0Fzc2lzdAkJT1BUSU9OQUwsCisJcmVhbFRpbWVJbnRlZ3JpdHkgU2VxT2YtQmFkU2F0ZWxsaXRlU2V0IE9QVElPTkFMCit9CisKK1JlZmVyZW5jZVRpbWUgOjo9IFNFUVVFTkNFIHsKKwlncHNUaW1lCQkJCUdQU1RpbWUsCisJZ3NtVGltZQkJCQlHU01UaW1lCQkJCU9QVElPTkFMLAorCWdwc1Rvd0Fzc2lzdAkJR1BTVE9XQXNzaXN0CQlPUFRJT05BTAorfQorCistLSBHUFMgVGltZSBpbmNsdWRlcyB3ZWVrIG51bWJlciBhbmQgdGltZS1vZi13ZWVrIChUT1cpCitHUFNUaW1lIDo6PSBTRVFVRU5DRSB7CisJZ3BzVE9XMjNiCQkJR1BTVE9XMjNiLAorCWdwc1dlZWsJCQkJR1BTV2VlaworfQorCistLSBHUFNUT1csIHJhbmdlIDAtNjA0Nzk5LjkyLCByZXNvbHV0aW9uIDAuMDggc2VjLCAyMy1iaXQgcHJlc2VudGF0aW9uCitHUFNUT1cyM2IgOjo9IElOVEVHRVIgKDAuLjc1NTk5OTkpCisKKy0tIEdQUyB3ZWVrIG51bWJlcgorR1BTV2VlayA6Oj0gSU5URUdFUiAoMC4uMTAyMykKKworLS0gR1BTVE9XQXNzaXN0IGNvbnNpc3RzIG9mIFRMTSBtZXNzYWdlLCBBbnRpLXNwb29mIGZsYWcsIEFsZXJ0IGZsYWcsIGFuZCAyIHJlc2VydmVkIGJpdHMgaW4gVExNIFdvcmQKKy0tIGZvciBlYWNoIHZpc2libGUgc2F0ZWxsaXRlLgorLS0gTl9TQVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgaW4gR1BTVE9XQXNzaXN0CitHUFNUT1dBc3Npc3QgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjEyKSkgT0YgR1BTVE9XQXNzaXN0RWxlbWVudAorCitHUFNUT1dBc3Npc3RFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc2F0ZWxsaXRlSUQJCQlTYXRlbGxpdGVJRCwKKwl0bG1Xb3JkCQkJCVRMTVdvcmQsCisJYW50aVNwb29mCQkJQW50aVNwb29mRmxhZywKKwlhbGVydAkJCQlBbGVydEZsYWcsCisJdGxtUnN2ZEJpdHMJCQlUTE1SZXNlcnZlZEJpdHMKK30KKworLS0gVExNIFdvcmQsIDE0IGJpdHMKK1RMTVdvcmQgOjo9IElOVEVHRVIgKDAuLjE2MzgzKQorCistLSBBbnRpLVNwb29mIGZsYWcKK0FudGlTcG9vZkZsYWcgOjo9IElOVEVHRVIgKDAuLjEpCisKKy0tIEFsZXJ0IGZsYWcKK0FsZXJ0RmxhZyA6Oj0gSU5URUdFUiAoMC4uMSkKKworLS0gUmVzZXJ2ZWQgYml0cyBpbiBUTE0gd29yZCwgTVNCIG9jY3VycyBlYXJsaWVyIGluIFRMTSBXb3JkIHRyYW5zbWl0dGVkIGJ5IHNhdGVsbGl0ZQorVExNUmVzZXJ2ZWRCaXRzIDo6PSBJTlRFR0VSICgwLi4zKQorCitHU01UaW1lIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCUJDQ0hDYXJyaWVyLAktLSBCQ0NIIGNhcnJpZXIKKwlic2ljCQkJQlNJQywJCQktLSBCU0lDCisJZnJhbWVOdW1iZXIJCUZyYW1lTnVtYmVyLAorCXRpbWVTbG90CQlUaW1lU2xvdCwKKwliaXROdW1iZXIJCUJpdE51bWJlcgorfQorCistLSBGcmFtZSBudW1iZXIKK0ZyYW1lTnVtYmVyIDo6PSBJTlRFR0VSICgwLi4yMDk3MTUxKQorCistLSBUaW1lIHNsb3QgbnVtYmVyCitUaW1lU2xvdCA6Oj0gSU5URUdFUiAoMC4uNykKKworLS0gQml0IG51bWJlcgorQml0TnVtYmVyIDo6PSBJTlRFR0VSICgwLi4xNTYpCisKKworLS0gUmVmZXJlbmNlIExvY2F0aW9uIElFCitSZWZMb2NhdGlvbiA6Oj0gU0VRVUVOQ0UgeworCXRocmVlRExvY2F0aW9uCQkJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCit9CisKKy0tIERHUFMgQ29ycmVjdGlvbnMgSUUKK0RHUFNDb3JyZWN0aW9ucyA6Oj0gU0VRVUVOQ0UgeworCisJZ3BzVE9XCQlJTlRFR0VSICgwLi42MDQ3OTkpLAktLSBER1BTIHJlZmVyZW5jZSB0aW1lCisJc3RhdHVzCQlJTlRFR0VSICgwLi43KSwKKwktLSBOX1NBVCBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBvZiBzYXRMaXN0CisJc2F0TGlzdAkJU2VxT2ZTYXRFbGVtZW50IAkKK30KK1NlcU9mU2F0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUgKDEuLjE2KSkgT0YgU2F0RWxlbWVudAorCistLSBudW1iZXIgb2YgY29ycmVjdGlvbiBmb3Igc2F0ZWxsaXRlcworU2F0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQlTYXRlbGxpdGVJRCwKKworCistLS0gU2VxdWVuY2UgbnVtYmVyIGZvciBlcGhlbWVyaXMKKwlpb2RlIAkJCUlOVEVHRVIgKDAuLjIzOSksCisJLS0gVXNlciBEaWZmZXJlbnRpYWwgUmFuZ2UgRXJyb3IKKwl1ZHJlCQkJSU5URUdFUiAoMC4uMyksCQkKKworCS0tIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uLCByYW5nZSBpcworCS0tIC02NTUuMDQgLSArNjU1LjA0LAorCXBzZXVkb1JhbmdlQ29yCUlOVEVHRVIgKC0yMDQ3Li4yMDQ3KSwgCQorCisJLS0gUHNldWRvIFJhbmdlIFJhdGUgQ29ycmVjdGlvbiwgcmFuZ2UgaXMKKwktLSAtNC4wNjQgLSArNC4wNjQsCisJcmFuZ2VSYXRlQ29yCUlOVEVHRVIgKC0xMjcuLjEyNyksCisKKy0tIERlbHRhIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uIDIgCQorCWRlbHRhUHNldWRvUmFuZ2VDb3IyIAlJTlRFR0VSICgtMTI3Li4xMjcpLAktLSBUaGlzIElFIHNoYWxsIGJlIGlnbm9yZWQgYnkgdGhlIHJlY2VpdmVyIGFuZAorCQkJCQkJCQkJCQkJCS0tIHNldCB0byB6ZXJvIGJ5IHRoZSBzZW5kZXIKKwktLSBEZWx0YSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiAyCQorCWRlbHRhUmFuZ2VSYXRlQ29yMgkJSU5URUdFUiAoLTcuLjcpLAkJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKKwkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCisJLS0gRGVsdGEgUHNldWRvIFJhbmdlIENvcnJlY3Rpb24gMworCWRlbHRhUHNldWRvUmFuZ2VDb3IzIAlJTlRFR0VSICgtMTI3Li4xMjcpLAktLSBUaGlzIElFIHNoYWxsIGJlIGlnbm9yZWQgYnkgdGhlIHJlY2VpdmVyIGFuZAorCQkJCQkJCQkJCQkJCS0tIHNldCB0byB6ZXJvIGJ5IHRoZSBzZW5kZXIKKwktLSBEZWx0YSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiAzCisJZGVsdGFSYW5nZVJhdGVDb3IzCQlJTlRFR0VSICgtNy4uNykJCQktLSBUaGlzIElFIHNoYWxsIGJlIGlnbm9yZWQgYnkgdGhlIHJlY2VpdmVyIGFuZAorCQkJCQkJCQkJCQkJCS0tIHNldCB0byB6ZXJvIGJ5IHRoZSBzZW5kZXIKK30KKworU2F0ZWxsaXRlSUQgOjo9IElOVEVHRVIgKDAuLjYzKQktLSBpZGVudGlmaWVzIHNhdGVsbGl0ZQorCistLSBOYXZpZ2F0aW9uIE1vZGVsIElFCitOYXZpZ2F0aW9uTW9kZWwgOjo9IFNFUVVFTkNFIHsKKwluYXZNb2RlbExpc3QJU2VxT2ZOYXZNb2RlbEVsZW1lbnQJCit9CisKKy0tIG5hdmlnYXRpb24gbW9kZWwgc2F0ZWxsaXRlIGxpc3QKK1NlcU9mTmF2TW9kZWxFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNikpIE9GIE5hdk1vZGVsRWxlbWVudAorCitOYXZNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzYXRlbGxpdGVJRAkJU2F0ZWxsaXRlSUQsCQkJCisJc2F0U3RhdHVzCQlTYXRTdGF0dXMJCS0tIHNhdGVsbGl0ZSBzdGF0dXMKK30KKworLS0gdGhlIFN0YXR1cyBvZiB0aGUgbmF2aWdhdGlvbiBtb2RlbAorU2F0U3RhdHVzIDo6PSBDSE9JQ0UgeworCS0tIE5ldyBzYXRlbGxpdGUsIG5ldyBOYXZpZ2F0aW9uIE1vZGVsCisJbmV3U2F0ZWxsaXRlQW5kTW9kZWxVQwlVbmNvbXByZXNzZWRFcGhlbWVyaXMsCisKKwktLSBFeGlzdGluZyBzYXRlbGxpdGUsIEV4aXN0aW5nIE5hdmlnYXRpb24gTW9kZWwKKwlvbGRTYXRlbGxpdGVBbmRNb2RlbAlOVUxMLAorCisJLS0gRXhpc3Rpbmcgc2F0ZWxsaXRlLCBuZXcgTmF2aWdhdGlvbiBNb2RlbAorCW5ld05hdmlNb2RlbFVDCQkJVW5jb21wcmVzc2VkRXBoZW1lcmlzLAorCS4uLgorfQorCistLSBVbmNvbXByZXNzZWQgc2F0ZWxsaXRlIGVtaGVtZXJpcyBhbmQgY2xvY2sgY29ycmVjdGlvbnMKK1VuY29tcHJlc3NlZEVwaGVtZXJpcyA6Oj0gU0VRVUVOQ0UgeworCWVwaGVtQ29kZU9uTDIJSU5URUdFUiAoMC4uMyksCisJZXBoZW1VUkEJCUlOVEVHRVIgKDAuLjE1KSwKKwllcGhlbVNWaGVhbHRoCUlOVEVHRVIgKDAuLjYzKSwKKwllcGhlbUlPREMJCUlOVEVHRVIJKDAuLjEwMjMpLAorCWVwaGVtTDJQZmxhZwlJTlRFR0VSICgwLi4xKSwKKwllcGhlbVNGMVJzdmQJRXBoZW1lcmlzU3ViZnJhbWUxUmVzZXJ2ZWQsCisJZXBoZW1UZ2QJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJZXBoZW1Ub2MJCUlOVEVHRVIgKDAuLjM3Nzk5KSwKKwllcGhlbUFGMgkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwllcGhlbUFGMQkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1BRjAJCUlOVEVHRVIgKC0yMDk3MTUyLi4yMDk3MTUxKSwKKwllcGhlbUNycwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1EZWx0YU4JCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtTTAJCQlJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJZXBoZW1DdWMJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtRQkJCUlOVEVHRVIgKDAuLjQyOTQ5NjcyOTUpLAorCWVwaGVtQ3VzCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbUFQb3dlckhhbGYJSU5URUdFUiAoMC4uNDI5NDk2NzI5NSksCisJZXBoZW1Ub2UJCUlOVEVHRVIgKDAuLjM3Nzk5KSwKKwllcGhlbUZpdEZsYWcJSU5URUdFUiAoMC4uMSksCisJZXBoZW1BT0RBCQlJTlRFR0VSICgwLi4zMSksCisJZXBoZW1DaWMJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtT21lZ2FBMAlJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJZXBoZW1DaXMJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtSTAJCQlJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJZXBoZW1DcmMJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtVwkJCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwllcGhlbU9tZWdhQURvdAlJTlRFR0VSICgtODM4ODYwOC4uODM4ODYwNyksCisJZXBoZW1JRG90CQlJTlRFR0VSICgtODE5Mi4uODE5MSkKK30KKworLS0gUmVzZXJ2ZWQgYml0cyBpbiBzdWJmcmFtZSAxIG9mIG5hdmlnYXRpb24gbWVzc2FnZQorRXBoZW1lcmlzU3ViZnJhbWUxUmVzZXJ2ZWQgOjo9IFNFUVVFTkNFIHsKKwlyZXNlcnZlZDEJCUlOVEVHRVIgKDAuLjgzODg2MDcpLAktLSAyMy1iaXQgZmllbGQKKwlyZXNlcnZlZDIJCUlOVEVHRVIgKDAuLjE2Nzc3MjE1KSwJLS0gMjQtYml0IGZpZWxkCisJcmVzZXJ2ZWQzCQlJTlRFR0VSICgwLi4xNjc3NzIxNSksCS0tIDI0LWJpdCBmaWVsZAorCXJlc2VydmVkNAkJSU5URUdFUiAoMC4uNjU1MzUpCQktLSAxNi1iaXQgZmllbGQKK30KKworLS0gSW9ub3NwaGVyaWMgTW9kZWwgSUUKK0lvbm9zcGhlcmljTW9kZWwgOjo9IFNFUVVFTkNFIHsKKwlhbGZhMAkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYWxmYTEJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWFsZmEyCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwlhbGZhMwkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYmV0YTAJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWJldGExCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwliZXRhMgkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYmV0YTMJCQlJTlRFR0VSICgtMTI4Li4xMjcpCit9CisKKy0tIFVuaXZlcnNhbCBUaW1lIENvb3JkaW5hdGUgTW9kZWwKK1VUQ01vZGVsIDo6PSBTRVFVRU5DRSB7CisJdXRjQTEJCQlJTlRFR0VSICgtODM4ODYwOC4uODM4ODYwNyksCisJdXRjQTAJCQlJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJdXRjVG90CQkJSU5URUdFUiAoMC4uMjU1KSwKKwl1dGNXTnQJCQlJTlRFR0VSICgwLi4yNTUpLAorCXV0Y0RlbHRhVGxzCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCXV0Y1dObHNmCQlJTlRFR0VSICgwLi4yNTUpLAorCXV0Y0ROCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwl1dGNEZWx0YVRsc2YJSU5URUdFUiAoLTEyOC4uMTI3KQorfQorCistLSBBbG1hbmFjLCBMb25nIHRlcm0gbW9kZWwKKy0tIE5PVEU6IFRoZXNlIGFyZSBwYXJhbWV0ZXJzIGFyZSBzdWJzZXQgb2YgdGhlIGVwaGVtZXJpcworLS0gTk9URTogQnV0IHdpdGggcmVkdWNlZCByZXNvbHV0aW9uIGFuZCBhY2N1cmFjeQorQWxtYW5hYyA6Oj0gU0VRVUVOQ0UgeworCWFsYW1hbmFjV05hCQlJTlRFR0VSICgwLi4yNTUpLAktLSBPbmNlIHBlciBtZXNzYWdlCisKKwktLSBuYXZpZ2F0aW9uIG1vZGVsIHNhdGVsbGl0ZSBsaXN0LgorCS0tIFRoZSBzaXplIG9mIGFsbWFuYWNMaXN0IGlzIGFjdHVhbGx5IE51bXNfU2F0c19Ub3RhbCBmaWVsZAorCWFsbWFuYWNMaXN0CQlTZXFPZkFsbWFuYWNFbGVtZW50CQkKK30KK1NlcU9mQWxtYW5hY0VsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjY0KSkgT0YgQWxtYW5hY0VsZW1lbnQKKworLS0gQWxtYW5hYyBpbmZvIG9uY2UgcGVyIHNhdGVsbGl0ZQorQWxtYW5hY0VsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzYXRlbGxpdGVJRAkJCVNhdGVsbGl0ZUlELAorCWFsbWFuYWNFCQkJSU5URUdFUiAoMC4uNjU1MzUpLAorCWFsYW1hbmFjVG9hCQkJSU5URUdFUiAoMC4uMjU1KSwKKwlhbG1hbmFjS3NpaQkJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWFsbWFuYWNPbWVnYURvdAkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJYWxtYW5hY1NWaGVhbHRoCQlJTlRFR0VSICgwLi4yNTUpLAorCWFsbWFuYWNBUG93ZXJIYWxmCUlOVEVHRVIgKDAuLjE2Nzc3MjE1KSwKKwlhbG1hbmFjT21lZ2EwCQlJTlRFR0VSICgtODM4ODYwOC4uODM4ODYwNyksCisJYWxtYW5hY1cJCQlJTlRFR0VSICgtODM4ODYwOC4uODM4ODYwNyksCisJYWxtYW5hY00wCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWFsbWFuYWNBRjAJCQlJTlRFR0VSICgtMTAyNC4uMTAyMyksCisJYWxtYW5hY0FGMQkJCUlOVEVHRVIgKC0xMDI0Li4xMDIzKQorfQorCistLSBBY3F1aXNpdGlvbiBBc3Npc3RhbmNlCitBY3F1aXNBc3Npc3QgOjo9IFNFUVVFTkNFIHsKKworCS0tIE51bWJlciBvZiBTYXRlbGxpdGVzIGNhbiBiZSByZWFkIGZyb20gYWNxdWlzdExpc3QKKwl0aW1lUmVsYXRpb24JVGltZVJlbGF0aW9uLAorCisJLS0gQWNxdWlzaXRpb24gYXNzaXN0YW5jZSBsaXN0CisJLS0gVGhlIHNpemUgb2YgTnVtYmVyIG9mIFNhdGVsbGl0ZXMgaXMgYWN0dWFsbHkgTnVtYmVyIG9mIFNhdGVsbGl0ZXMgZmllbGQKKwlhY3F1aXNMaXN0CQlTZXFPZkFjcXVpc0VsZW1lbnQJCQorfQorU2VxT2ZBY3F1aXNFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNikpIE9GIEFjcXVpc0VsZW1lbnQKKworLS0gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEdQUyB0aW1lIGFuZCBhaXItaW50ZXJmYWNlIHRpbWluZworVGltZVJlbGF0aW9uIDo6PSBTRVFVRU5DRSB7CisJLS0KKwlncHNUT1cJCUdQU1RPVzIzYiwJCS0tIDIzYiBwcmVzZW50YXRpb24KKwlnc21UaW1lCQlHU01UaW1lCQlPUFRJT05BTAorfQorCistLSBkYXRhIG9jY3VyaW5nIHBlciBudW1iZXIgb2Ygc2F0ZWxsaXRlcworQWNxdWlzRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXN2aWQJCQkJCVNhdGVsbGl0ZUlELAorCisJLS0gRG9wcGxlciAwdGggb3JkZXIgdGVybSwKKwktLSAtNTEyMC4wIC0gNTExNy41IEh6ICg9IC0yMDQ4IC0gMjA0NyB3aXRoIDIuNSBIeiByZXNvbHV0aW9uKQorCWRvcHBsZXIwCQkJCUlOVEVHRVIgKC0yMDQ4Li4yMDQ3KSwJCisJYWRkaW9uYWxEb3BwbGVyCQkJQWRkaW9uYWxEb3BwbGVyRmllbGRzCU9QVElPTkFMLAorCWNvZGVQaGFzZQkJCQlJTlRFR0VSICgwLi4xMDIyKSwJLS0gQ29kZSBQaGFzZQorCWludENvZGVQaGFzZQkJCUlOVEVHRVIgKDAuLjE5KSwJLS0gSW50ZWdlciBDb2RlIFBoYXNlCisJZ3BzQml0TnVtYmVyCQkJSU5URUdFUiAoMC4uMyksIAktLSBHUFMgYml0IG51bWJlcgorCWNvZGVQaGFzZVNlYXJjaFdpbmRvdwlJTlRFR0VSICgwLi4xNSksCS0tIENvZGUgUGhhc2UgU2VhcmNoIFdpbmRvdworCWFkZGlvbmFsQW5nbGUJCQlBZGRpb25hbEFuZ2xlRmllbGRzCQlPUFRJT05BTAorfQorCitBZGRpb25hbERvcHBsZXJGaWVsZHMgOjo9IFNFUVVFTkNFIHsKKwktLSBEb3BwbGVyIDFzdCBvcmRlciB0ZXJtLCAtMS4wIC0gKzAuNSBIei9zZWMKKyAtLSAoPSAtNDIgKyAoMCB0byA2Mykgd2l0aCAxLzQyIEh6L3NlYy4gcmVzb2x1dGlvbikKKwlkb3BwbGVyMQkJCQlJTlRFR0VSICgwLi42MyksCisJZG9wcGxlclVuY2VydGFpbnR5CQlJTlRFR0VSICgwLi43KQorIC0tIGEgc2VuZGVyIHNoYWxsIG5vdCBlbmNvZGUgYW55IERvcHBsZXJVbmNlcnRhaW50eSB2YWx1ZSBpbiB0aGUgcmFuZ2UgNSB0byA3CisgLS0gYSByZWNlaXZlciBzaGFsbCBpZ25vcmUgYW55IHZhbHVlIGJldHdlZW4gNSBhbmQgNy4KK30KKworQWRkaW9uYWxBbmdsZUZpZWxkcwk6Oj0gU0VRVUVOQ0UgeworCS0tIGF6aW11dGggYW5nbGUsIDAgLSAzNDguNzUgZGVnICg9IDAgLSAzMSB3aXRoIDExLjI1IGRlZyByZXNvbHV0aW9uKQorCWF6aW11dGgJCQkJCUlOVEVHRVIgKDAuLjMxKSwKKwktLSBlbGV2YXRpb24gYW5nbGUsIDAgLSA3OC43NSBkZWcgKD0gMCAtIDcgd2l0aCAxMS4yNSBkZWcgcmVzb2x1dGlvbikKKwllbGV2YXRpb24JCQkJSU5URUdFUiAoMC4uNykKK30KKworLS0gUmVhbC1UaW1lIEludGVncml0eQorLS0gbnVtYmVyIG9mIGJhZCBzYXRlbGxpdGVzIGNhbiBiZSByZWFkIGZyb20gdGhpcyBlbGVtZW50CitTZXFPZi1CYWRTYXRlbGxpdGVTZXQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgU2F0ZWxsaXRlSUQKKworLS0gRXh0ZW5zaW9uIEVsZW1lbnRzCisKKy0tIFJlbGVhc2UgOTggRXh0ZW5zaW9ucyBoZXJlCitSZWw5OC1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisJcmVsOTgtRXh0LUV4cE9URAkJCVJlbDk4LUV4dC1FeHBPVEQJCU9QVElPTkFMLAktLSBFeHBlY3RlZE9URCBleHRlbnNpb24KKwkuLi4sIAorIGdwc1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsIAorIGdwc1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBHUFNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgT1BUSU9OQUwKKworLS0gRnVydGhlciBSOTggZXh0ZW5zaW9ucyBoZXJlCit9CitSZWw5OC1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKwlyZWw5OC1FeHQtRXhwT1RECQkJUmVsOTgtRXh0LUV4cE9URAkJT1BUSU9OQUwsCS0tIEV4cGVjdGVkT1REIGV4dGVuc2lvbgorCS4uLiwgCisgZ3BzVGltZUFzc2lzdGFuY2VNZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwKKyBncHNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgR1BTUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IE9QVElPTkFMCisKKy0tIEZ1cnRoZXIgUjk4IGV4dGVuc2lvbnMgaGVyZQorfQorCistLSBSZWxlYXNlIDk4IEV4cE9URCBleHRlbnNpb24KK1JlbDk4LUV4dC1FeHBPVEQgOjo9IFNFUVVFTkNFIHsKKy0tIElmIE1zckFzc2lzdEJUUyBpcyBpbmNsdWRlZCBpbiBtZXNzYWdlLCBtc3JBc3Npc3REYXRhLVI5OC1FeHBPVEQgc2hhbGwgYmUgaW5jbHVkZWQuCisJbXNyQXNzaXN0RGF0YS1SOTgtRXhwT1RECQkJTXNyQXNzaXN0RGF0YS1SOTgtRXhwT1RECQkJT1BUSU9OQUwsCisKKy0tIElmIFN5c3RlbUluZm9Bc3Npc3RhRGF0YSBpcyBpbmNsdWRlZCBpbiBtZXNzYWdlLCBzeXN0ZW1JbmZvQXNzaXN0RGF0YS1SOTgtRXhwT1REIHNoYWxsIGJlCistLSBpbmNsdWRlZC4KKwlzeXN0ZW1JbmZvQXNzaXN0RGF0YS1SOTgtRXhwT1RECVN5c3RlbUluZm9Bc3Npc3REYXRhLVI5OC1FeHBPVEQJT1BUSU9OQUwKK30KKworLS0gTXNyQXNzaXN0RGF0YSBSOTggZXh0ZW5zaW9uCitNc3JBc3Npc3REYXRhLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIHsKKwkgbXNyQXNzaXN0TGlzdC1SOTgtRXhwT1RECQkJIFNlcU9mTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQKK30KKworLS0gSW5kZXhlcyBpbiBTZXFPZk1zckFzc2lzdEJUUy1SOTgtRXhwT1REIHJlZmVyIHRvIFNlcU9mTXNyQXNzaXN0QlRTCistLSBJZiB0aGUgaW5kZXggZXhjZWVkcyB0aGUgU2VnT2ZNc3JBc3Npc3RCVFMgcmFuZ2Ugb3IgaWYgdGhlcmUgaXMgb3RoZXIKKy0tIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIHRoZSBCVFMgaW5kaWNlcywgdGhlIE1TIHNoYWxsIGFwcGx5IHByb3RvY29sCistLSBlcnJvciBjYXVzZSBpbmNvcnJlY3REYXRhCitTZXFPZk1zckFzc2lzdEJUUy1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNSkpIE9GIE1zckFzc2lzdEJUUy1SOTgtRXhwT1RECisKKy0tIFRoaXMgZWxlbWVudCBjb21wbGV0ZXMgTXNyQXNzaXN0QlRTIElFCitNc3JBc3Npc3RCVFMtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworCWV4cGVjdGVkT1RECQkJCUV4cGVjdGVkT1RELAorCWV4cE9URFVuY2VydGFpbnR5CQlFeHBPVERVbmNlcnRhaW50eQorfQorCistLSBTeXN0ZW1JbmZvQXNzaXN0RGF0YSBSOTggZXh0ZW5zaW9uCitTeXN0ZW1JbmZvQXNzaXN0RGF0YS1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSB7CisJc3lzdGVtSW5mb0Fzc2lzdExpc3RSOTgtRXhwT1REIAlTZXFPZlN5c3RlbUluZm9Bc3Npc3RCVFMtUjk4LUV4cE9URAorfQorCistLSBTZXFPZlN5c3RlbUluZm9Bc3Npc3RCVFMtUjk4LUV4cE9URCBpbmRleCByZWZlciB0byBTZXFPZlN5c3RlbUluZm9Bc3Npc3RCVFMKKy0tIElmIHRoZSBpbmRleCBleGNlZWRzIHRoZSBTZWdPZlN5c3RlbUluZm9Bc3Npc3RCVFMgcmFuZ2Ugb3IgaWYgdGhlcmUgaXMgb3RoZXIKKy0tIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIHRoZSBCVFMgaW5kaWNlcywgdGhlIE1TIHNoYWxsIGFwcGx5IHByb3RvY29sCistLSBlcnJvciBjYXVzZSBpbmNvcnJlY3REYXRhCitTZXFPZlN5c3RlbUluZm9Bc3Npc3RCVFMtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMzIpKSBPRiBTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQKKworLS0gd2hldGhlciBuLnRoIGlzIHByZXNlbnQgb3Igbm90ID8KK1N5c3RlbUluZm9Bc3Npc3RCVFMtUjk4LUV4cE9URCA6Oj0gQ0hPSUNFIHsKKwlub3RQcmVzZW50CQlOVUxMLAorCXByZXNlbnQJCQlBc3Npc3RCVFNEYXRhLVI5OC1FeHBPVEQKK30KKworLS0gVGhpcyBlbGVtZW50IGNvbXBsZXRlcyBBc3Npc3RCVFNEYXRhIElFCitBc3Npc3RCVFNEYXRhLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIHsKKwlleHBlY3RlZE9URAkJCQlFeHBlY3RlZE9URCwKKwlleHBPVER1bmNlcnRhaW50eQkJRXhwT1REVW5jZXJ0YWludHkJLS0gVW5jZXJ0YWludHkgb2YgZXhwZWN0ZWQgT1RECit9CisKKy0tIEV4cGVjdGVkIE9URCB2YWx1ZSBiZXR3ZWVuIG5ib3IgYmFzZSBzdGF0aW9uIGFuZCByZWZlcmVuY2UgQlRTCistLSBhdCBNUydzIGN1cnJlbnQgZXN0aW1hdGVkIGxvY2F0aW9uLgorRXhwZWN0ZWRPVEQgOjo9IElOVEVHRVIgKDAuLjEyNTApCistLSBUaGUgRXhwZWN0ZWRPVEQgdmFsdWUgMTI1MCBzaGFsbCBub3QgYmUgZW5jb2RlZCBieSB0aGUgdHJhbnNtaXR0aW5nIGVudGl0eSBhbmQKKy0tIHNoYWxsIGJlIHRyZWF0ZWQgYnkgdGhlIHJlY2VpdmluZyBlbnRpdHkgYXMgMC4KKy0tIFVuY2VydGFpbnR5IG9mIEV4cHRlY3RlZCBPVEQgaW4gYml0cworRXhwT1REVW5jZXJ0YWludHkgOjo9IElOVEVHRVIoMC4uNykKKworLS0gUmVsZWFzZSA5OCBleHRlbnNpb25zCisKK0dQU1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSA6Oj0gSU5URUdFUiAoMCAuLiAxMjcpIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKworR1BTVGltZUFzc2lzdGFuY2VNZWFzdXJlbWVudHMgOjo9IFNFUVVFTkNFIHsKKyByZWZlcmVuY2VGcmFtZU1TQiBJTlRFR0VSICgwIC4uIDYzKSwgLS0gTVNCIG9mIGZyYW1lIG51bWJlcgorIGdwc1Rvd1N1Ym1zIElOVEVHRVIgKDAgLi4gOTk5OSkgT1BUSU9OQUwsIC0tIGluIHVuaXRzIG9mIDEwMG5zLCBmb3IgTVMgYmFzZWQgQUdQUworIGRlbHRhVG93IElOVEVHRVIgKDAgLi4gMTI3KSBPUFRJT05BTCwgLS0gZm9yIE1TIGFzc2lzdGVkIEFHUFMKKyBncHNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgR1BTUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IE9QVElPTkFMCit9CisKK1JlbC05OC1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisKKwktLSBGaXJzdCBleHRlbnNpb24gdG8gUmVsZWFzZSA5OAorCXJlbC05OC1FeHQtTWVhc3VyZUluZm8JU0VRVUVOQ0UgeworCQlvdGQtTWVhc3VyZUluZm8tUjk4LUV4dAlPVEQtTWVhc3VyZUluZm8tUjk4LUV4dAkJT1BUSU9OQUwKKwl9LAorCS4uLiwgCisgdGltZUFzc2lzdGFuY2VNZWFzdXJlbWVudHMgR1BTVGltZUFzc2lzdGFuY2VNZWFzdXJlbWVudHMgT1BUSU9OQUwgCisgLS0gRnVydGhlciBSOTggZXh0ZW5zaW9ucyBoZXJlCit9CisKKy0tIFRoaXMgaXMgYW4gYWRkaXRpb24gdG8gT1RELU1lYXN1cmVJbmZvIGVsZW1lbnQgZGVmaW5lZCBpbiBvcmlnaW5hbCBtZXNzYWdlLAorLS0gSWYgT1RELU1lYXN1cmVJbmZvIGlzIGFic2VudCwgb3IgaWYgb25lIG9yIG1vcmUgT1RELU1zckVsZW1lbnRSZXN0IGFyZSBwcmVzZW50CistLSBPVEQtTWVhc3VyZUluZm8tUjk4LUV4dCBzaGFsbCBiZSBhYnNlbnQuCistLSBPVEQtTWVhc3VyZUluZm8tUjk4LUV4dAorT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQgOjo9IFNFUVVFTkNFIHsKKwktLSBNZWFzdXJlbWVudCBpbmZvIGVsZW1lbnRzCisJb3RkTXNyRmlyc3RTZXRzLVI5OC1FeHQJCU9URC1Nc3JFbGVtZW50Rmlyc3QtUjk4LUV4dAorfQorCistLSBPVEQgbWVhc3VyZW1lbnQgaW5mb3JtYXRpb24gRXh0IGZvciB0aGUgZmlyc3Qgc2V0IG9ubHkKK09URC1Nc3JFbGVtZW50Rmlyc3QtUjk4LUV4dCA6Oj0gU0VRVUVOQ0UgeworCS0tIGFkZGl0aW9uYWwgbWVhc3VyZWQgbmVpZ2hib3JzIGluIE9URCBtZWFzdXJlbWVudHMKKwlvdGQtRmlyc3RTZXRNc3JzLVI5OC1FeHQgCVNlcU9mT1RELUZpcnN0U2V0TXNycy1SOTgtRXh0IAlPUFRJT05BTAorfQorU2VxT2ZPVEQtRmlyc3RTZXRNc3JzLVI5OC1FeHQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjUpKSBPRiBPVEQtRmlyc3RTZXRNc3JzCisKK1JlbC01LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKworCWV4dGVuZGVkLXJlZmVyZW5jZQlFeHRlbmRlZC1yZWZlcmVuY2UgCU9QVElPTkFMLAorCS0tIFRoZSBleHRlbmRlZC1yZWZlcmVuY2Ugc2hhbGwgYmUgaW5jbHVkZWQgYnkgdGhlIE1TIGlmIGFuZCBvbmx5IGlmIHByZXZpb3VzbHkKKwktLSByZWNlaXZlZCBmcm9tIHRoZSBTTUxDIGluIGEgTWVhc3VyZSBQb3NpdGlvbiBSZXF1ZXN0LiBXaGVuIGluY2x1ZGVkLCB0aGUgdmFsdWUgc2VudAorCS0tIGJ5IHRoZSBNUyBzaGFsbCBlcXVhbCB0aGUgdmFsdWUgcmVjZWl2ZWQgZnJvbSB0aGUgU01MQy4KKworCS0tIGV4dGVuc2lvbiB0byBSZWxlYXNlIDUsIGZvciBSUkxQIHBzZXVkby1zZWdtZW50YXRpb24gaGVyZQorCW90ZC1NZWFzdXJlSW5mby01LUV4dAlPVEQtTWVhc3VyZUluZm8tNS1FeHQJT1BUSU9OQUwsCisJdWxQc2V1ZG9TZWdJbmQJCQlVbFBzZXVkb1NlZ0luZAkJCU9QVElPTkFMLAktLSBJbmNsdWRlZCB3aGVuIHVwbGluayBSUkxQCisJLS0gUHNldWRvLXNlZ21lbnRhdGlvbiBpcyB1c2VkLCBub3QgaW5jbHVkZWQgd2hlbiBubyB1cGxpbmsgcHNldWRvLXNlZ21lbnRhdGlvbiBpcyB1c2VkCisJLi4uCisJCQkJCS0tIFBvc3NpYmx5IG1vcmUgZXh0ZW5zaW9ucyBmb3IgUmVsZWFzZSA1IGhlcmUgbGF0ZXIKK30KKworRXh0ZW5kZWQtcmVmZXJlbmNlIDo6PSBTRVFVRU5DRSB7CisJc21sYy1jb2RlCQkJSU5URUdFUiAoMC4uNjMpLAorCXRyYW5zYWN0aW9uLUlECQlJTlRFR0VSICgwLi4yNjIxNDMpCit9CisKK09URC1NZWFzdXJlSW5mby01LUV4dCA6Oj0gU2VxT2ZPVEQtTXNyRWxlbWVudFJlc3QKKwktLSBpZiBtb3JlIHRoYW4gb25lIG1lYXN1cmVtZW50IHNldHMgYXJlIHByZXNlbnQgdGhpcyBlbGVtZW50IGlzIHJlcGVhdGVkCisJLS0gTnVtYmVyT2ZTZXRzIC0gMSAoLTEgPSBmaXJzdCBzZXQpIGNvbWJpbmVkIGluIE9URC1NZWFzdXJlSW5mby01LUV4dCBhbmQKKwktLSBPVEQtTWVhc3VyZUluZm8gKGUuZy4gaWYgTnVtYmVyT2ZTZXRzIGlzIDMsIHRoZW4gb25lIG90ZE1zclJlc3RTZXRzIG1heQorCS0tIGJlIHNlbnQgaW4gT1RELU1lYXN1cmVJbmZvLTUtRXh0IGFuZCBvbmUgaW4gT1RELU1lYXN1cmVJbmZvKQorCistLSBGaXJzdCBwYXJ0IG9mIFVwbGluayBSUkxQIFBzZXVkby1zZWdtZW50YXRpb24gaW5kaWNhdGlvbiwgcG9zc2libHkgbW9yZSBtYXkgYmUgZGVmaW5lZAorLS0gaW4gdGhlIGZ1dHVyZSBmb3Igc2VnbWVudGF0aW9uIHdpdGggbW9yZSB0aGFuIHR3byBzZWdtZW50cy4KK1VsUHNldWRvU2VnSW5kIDo6PSBFTlVNRVJBVEVEIHsKKwlmaXJzdE9mTWFueSAoMCksCisJc2Vjb25kT2ZNYW55KDEpCit9CisKK1JlbDUtTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuZGVkLXJlZmVyZW5jZQkJCUV4dGVuZGVkLXJlZmVyZW5jZSwKKwkuLi4KKwktLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNSBoZXJlIGxhdGVyCit9CisKK1JlbDUtQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5kZWQtcmVmZXJlbmNlCQkJRXh0ZW5kZWQtcmVmZXJlbmNlLAorCS4uLgorCistLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNSBoZXJlIGxhdGVyCit9CisKK1JlbC01LVByb3RvY29sRXJyb3ItRXh0ZW5zaW9uOjo9IFNFUVVFTkNFIHsKKwlleHRlbmRlZC1yZWZlcmVuY2UJCQlFeHRlbmRlZC1yZWZlcmVuY2UgCU9QVElPTkFMLAorCS0tIFRoZSBleHRlbmRlZC1yZWZlcmVuY2Ugc2hhbGwgYmUgaW5jbHVkZWQgYnkgdGhlIE1TIGlmIGFuZCBvbmx5IGlmIHByZXZpb3VzbHkKKwktLSByZWNlaXZlZCBmcm9tIHRoZSBTTUxDLgorCS0tIFdoZW4gaW5jbHVkZWQsIHRoZSB2YWx1ZSBzZW50IGJ5IHRoZSBNUyBzaGFsbCBlcXVhbCB0aGUgdmFsdWUgcmVjZWl2ZWQgZnJvbSB0aGUgU01MQy4KKwkuLi4KKworCS0tIFBvc3NpYmx5IG1vcmUgZXh0ZW5zaW9ucyBmb3IgUmVsZWFzZSA1IGhlcmUgbGF0ZXIKK30KKworLS0gUmVsZWFzZSA3IEV4dGVuc2lvbnMgaGVyZQorCitSZWw3LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKK3ZlbG9jaXR5UmVxdWVzdGVkCQkgTlVMTAkJIE9QVElPTkFMLAorIGdhbnNzUG9zaXRpb25NZXRob2QgR0FOU1NQb3NpdGlvbmluZ01ldGhvZCBPUFRJT05BTCwKKyBnYW5zcy1Bc3Npc3REYXRhIEdBTlNTLUFzc2lzdERhdGEgT1BUSU9OQUwsCisgZ2Fuc3NDYXJyaWVyUGhhc2VNZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwKKyBnYW5zc1RPREdTTVRpbWVBc3NvY2lhdGlvbk1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLAorcmVxdWlyZWRSZXNwb25zZVRpbWUJUmVxdWlyZWRSZXNwb25zZVRpbWUJT1BUSU9OQUwsCisJLi4uCisJLS0gRnVydGhlciBSZWxlYXNlIDcgZXh0ZW50aW9ucyBoZXJlCit9CisKKy0tIGFkZGl0aW9uYWwgc2F0ZWxsaXRlIHN5c3RlbXMgbWF5IGJlIGFkZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgcHJvdG9jb2wKK0dBTlNTUG9zaXRpb25pbmdNZXRob2QgOjo9IEJJVCBTVFJJTkcgeworCWdwcyAoMCksCisJZ2FsaWxlbyAoMSl9IChTSVpFICgyLi4xNikpCisKK0dBTlNTLUFzc2lzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwlnYW5zcy1jb250cm9sSGVhZGVyCUdBTlNTLUNvbnRyb2xIZWFkZXIKK30KKworR0FOU1MtQ29udHJvbEhlYWRlciA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzQ29tbW9uQXNzaXN0RGF0YSBHQU5TU0NvbW1vbkFzc2lzdERhdGEgT1BUSU9OQUwsCisgZ2Fuc3NHZW5lcmljQXNzaXN0RGF0YUxpc3QgU2VxT2ZHQU5TU0dlbmVyaWNBc3Npc3REYXRhRWxlbWVudCBPUFRJT05BTAorfQorCistLSBHQU5TUyBDb21tb24gQXNzaXN0YW5jZSBEYXRhIEVsZW1lbnRzCitHQU5TU0NvbW1vbkFzc2lzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1JlZmVyZW5jZVRpbWUJCSBHQU5TU1JlZmVyZW5jZVRpbWUJCSBPUFRJT05BTCwKKwlnYW5zc1JlZkxvY2F0aW9uCQkJR0FOU1NSZWZMb2NhdGlvbgkJIE9QVElPTkFMLAorCWdhbnNzSW9ub3NwaGVyaWNNb2RlbAkJR0FOU1NJb25vc3BoZXJpY01vZGVsCSBPUFRJT05BTCwKKwkuLi4KK30KKworLS0gTGlzdCBvZiBHQU5TUyBHZW5lcmljIEFzc2lzdGFuY2UgRGF0YSBFbGVtZW50cywgdXAgdG8gOCBHQU5TUworU2VxT2ZHQU5TU0dlbmVyaWNBc3Npc3REYXRhRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUgKDEuLjgpKSBPRiBHQU5TU0dlbmVyaWNBc3Npc3REYXRhRWxlbWVudAorCistLSBHQU5TUyBHZW5lcmljIEFzc2lzdGFuY2UgRGF0YSBFbGVtZW50cworR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc0lEIElOVEVHRVIgKDAuLjcpIE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgZ2Fuc3NUaW1lTW9kZWwgU2VxT2ZHQU5TU1RpbWVNb2RlbCBPUFRJT05BTCwKKwlnYW5zc0RpZmZDb3JyZWN0aW9ucwkJIEdBTlNTRGlmZkNvcnJlY3Rpb25zCSBPUFRJT05BTCwKKwlnYW5zc05hdmlnYXRpb25Nb2RlbAkJIEdBTlNTTmF2TW9kZWwgT1BUSU9OQUwsCisJZ2Fuc3NSZWFsVGltZUludGVncml0eQkgR0FOU1NSZWFsVGltZUludGVncml0eQkgT1BUSU9OQUwsCisJZ2Fuc3NEYXRhQml0QXNzaXN0CQkJIEdBTlNTRGF0YUJpdEFzc2lzdAkJIE9QVElPTkFMLAorCWdhbnNzUmVmTWVhc3VyZW1lbnRBc3Npc3QJIEdBTlNTUmVmTWVhc3VyZW1lbnRBc3Npc3QgT1BUSU9OQUwsCisgZ2Fuc3NBbG1hbmFjTW9kZWwgR0FOU1NBbG1hbmFjTW9kZWwgT1BUSU9OQUwsCisgZ2Fuc3NVVENNb2RlbCBHQU5TU1VUQ01vZGVsIE9QVElPTkFMLAorCS4uLgorfQorCistLSBHQU5TUyBDT01NT04gQVNTSVNUQU5DRSBEQVRBIEVMRU1FTlRTCisKKy0tIEdBTlNTIFJlZmVyZW5jZSBUaW1lIElFCitHQU5TU1JlZmVyZW5jZVRpbWUgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1JlZlRpbWVJbmZvCQkJIEdBTlNTUmVmVGltZUluZm8sCisJZ2Fuc3NUT0QtR1NNVGltZUFzc29jaWF0aW9uIEdBTlNTVE9ELUdTTVRpbWVBc3NvY2lhdGlvbiBPUFRJT05BTAorfQorCistLSBHQU5TUyBSZWZlcmVuY2UgVGltZSBpbmNsdWRlcyBHQU5TUyBUT0QsIEdBTlNTIERheSwgdW5jZXJ0YWludHkKK0dBTlNTUmVmVGltZUluZm8gOjo9IFNFUVVFTkNFIHsKKwlnYW5zc0RheQkJCSBJTlRFR0VSKDAgLi4gODE5MSkgT1BUSU9OQUwsCisgZ2Fuc3NUT0QgR0FOU1NUT0QsCisJZ2Fuc3NUT0RVbmNlcnRhaW50eQkgR0FOU1NUT0RVbmNlcnRhaW50eSBPUFRJT05BTCwKKyBnYW5zc1RpbWVJRCBJTlRFR0VSICgwIC4uIDcpIE9QVElPTkFMCit9CisKKy0tIEdBTlNTIFRPRCBpbnRlZ2VyIHNlY29uZHMKK0dBTlNTVE9EIDo6PSBJTlRFR0VSICgwIC4uIDg2Mzk5KQorCistLSBHQU5TUyBUT0QgdW5jZXJ0YWludHkKK0dBTlNTVE9EVW5jZXJ0YWludHkgOjo9IElOVEVHRVIgKDAgLi4gMTI3KSAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisKKy0tIEdBTlNTIFRPRC1HU00gVGltZSBhc3NvY2lhdGlvbiAKK0dBTlNTVE9ELUdTTVRpbWVBc3NvY2lhdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQlCQ0NIQ2FycmllciwJLS0gQkNDSCBjYXJyaWVyCisJYnNpYwkJCUJTSUMsCQkJLS0gQlNJQworCWZyYW1lTnVtYmVyCQlGcmFtZU51bWJlciwKKwl0aW1lU2xvdAkJVGltZVNsb3QsCisJYml0TnVtYmVyCQlCaXROdW1iZXIsCisgZnJhbWVEcmlmdCBGcmFtZURyaWZ0IE9QVElPTkFMCit9CisKKy0tIEZyYW1lIGRyaWZ0CitGcmFtZURyaWZ0IDo6PSBJTlRFR0VSKC02NCAuLiA2MykKKworLS0gR0FOU1MgUmVmZXJlbmNlIExvY2F0aW9uIElFCitHQU5TU1JlZkxvY2F0aW9uIDo6PSBTRVFVRU5DRSB7CisJdGhyZWVETG9jYXRpb24JCQlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24KK30KKworLS0gR0FOU1MgSW9ub3NwaGVyaWMgTW9kZWwgSUUKKy0tIEdBTlNTIElvbm9zcGhlcmljIE1vZGVsIGNvbnNpc3RzIG9mIE5lUXVpY2sgbW9kZWwgcGFyYW1ldGVycyBhbmQgc3Rvcm0gZmxhZ3MKKworR0FOU1NJb25vc3BoZXJpY01vZGVsIDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3NJb25vTW9kZWwgR0FOU1NJb25vc3BoZXJlTW9kZWwsCisgZ2Fuc3NJb25vU3Rvcm1GbGFncyBHQU5TU0lvbm9TdG9ybUZsYWdzIE9QVElPTkFMLAorIC4uLgorfQorCistLSBHQU5TUyBpb25vc3BoZXJlIG1vZGVsLiBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4IAorR0FOU1NJb25vc3BoZXJlTW9kZWwgOjo9IFNFUVVFTkNFIHsKKyBhaTAgSU5URUdFUiAoMCAuLiA0MDk1KSwKKyBhaTEgSU5URUdFUiAoMCAuLiA0MDk1KSwKKyBhaTIgSU5URUdFUiAoMCAuLiA0MDk1KQorfQorCistLSBHQU5TUyBpb25vc3BoZXJlIHN0b3JtIGZsYWdzCitHQU5TU0lvbm9TdG9ybUZsYWdzIDo6PSBTRVFVRU5DRSB7CisJaW9ub1N0b3JtRmxhZzEJSU5URUdFUiAoMCAuLiAxKSwKKwlpb25vU3Rvcm1GbGFnMglJTlRFR0VSICgwIC4uIDEpLAorCWlvbm9TdG9ybUZsYWczCUlOVEVHRVIgKDAgLi4gMSksCisJaW9ub1N0b3JtRmxhZzQJSU5URUdFUiAoMCAuLiAxKSwKKwlpb25vU3Rvcm1GbGFnNQlJTlRFR0VSICgwIC4uIDEpCit9CisKKy0tIEdBTlNTIEdFTkVSSUMgQVNTSVNUQU5DRSBEQVRBIEVMRU1FTlRTCisKKy0tIEdBTlNTIFRpbWUgTW9kZWwgSUUgY29uc2lzdHMgb2YgdGltZSBvZmZzZXQgYW5kIGZpcnN0IGFuZCBzZWNvbmQgb3JkZXIgcGFyYW1ldGVycyB0byByZWxhdGUgR05TUworLS0gc3BlY2lmaWMgc3lzdGVtIHRpbWUgdG8gc2VsZWN0ZWQgdGltZSByZWZlcmVuY2UKK1NlcU9mR0FOU1NUaW1lTW9kZWwgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjcpKSBPRiBHQU5TU1RpbWVNb2RlbEVsZW1lbnQKKworR0FOU1NUaW1lTW9kZWxFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NUaW1lTW9kZWxSZWZUaW1lCQlJTlRFR0VSKDAgLi4gNjU1MzUpLAorCXRBMAkJIFRBMCwKKwl0QTEJCSBUQTEgT1BUSU9OQUwsCisJdEEyCQkgVEEyIE9QVElPTkFMLAorIGduc3NUT0lEIElOVEVHRVIgKDAgLi4gNyksCisgd2Vla051bWJlciBJTlRFR0VSICgwIC4uIDgxOTEpIE9QVElPTkFMIAorfQorCistLSBHQU5TUyB0aW1lIG1vZGVsIHBhcmFtZXRlciBBMAorVEEwIDo6PSBJTlRFR0VSICgtMjE0NzQ4MzY0OCAuLiAyMTQ3NDgzNjQ3KQorCistLSBHQU5TUyB0aW1lIG1vZGVsIHBhcmFtZXRlciBBMQorVEExIDo6PSBJTlRFR0VSICgtODM4ODYwOCAuLiA4Mzg4NjA3KQorCistLSBHQU5TUyB0aW1lIG1vZGVsIHBhcmFtZXRlciBBMgorVEEyIDo6PSBJTlRFR0VSICgtNjQgLi4gNjMpCisKKy0tIERHQU5TUyBDb3JyZWN0aW9ucyBJRQorR0FOU1NEaWZmQ29ycmVjdGlvbnMgOjo9IFNFUVVFTkNFIHsKKwlkZ2Fuc3NSZWZUaW1lCQlJTlRFR0VSICgwIC4uIDExOSksCSAtLSBER0FOU1MgcmVmZXJlbmNlIHRpbWUKKworCS0tIE5fU0dOX1RZUEUgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2Ygc2duVHlwZUxpc3QKKwlzZ25UeXBlTGlzdAkJIFNlcU9mU2duVHlwZUVsZW1lbnQKK30KKworU2VxT2ZTZ25UeXBlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUgKDEuLjMpKSBPRiBTZ25UeXBlRWxlbWVudCAtLSBtYXggdGhyZWUgc2lnbmFscyBwZXIgR05TUworCistLSBER0FOU1Mgc2lnbmFsIHR5cGUgZWxlbWVudCwgb25jZSBwZXIgR05TUyBzaWduYWwgdHlwZSBpbmNsdWRlZCBpbiBER0FOU1MKK1NnblR5cGVFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NTaWduYWxJRAkJIEdBTlNTU2lnbmFsSUQgT1BUSU9OQUwsIC0tIHNpZ25hbCB0eXBlIGlkZW50aXR5CisgZ2Fuc3NTdGF0dXNIZWFsdGggSU5URUdFUiAoMCAuLiA3KSwKKwktLSBOX1NHTiBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBvZiBkZ2Fuc3NTZ25MaXN0CisgZGdhbnNzU2duTGlzdCBTZXFPZkRHQU5TU1NnbkVsZW1lbnQKK30KKworR0FOU1NTaWduYWxJRCA6Oj0gSU5URUdFUiAoMCAuLiAzKQktLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CitTZXFPZkRHQU5TU1NnbkVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi4xNikpIE9GIERHQU5TU1NnbkVsZW1lbnQKKworLS0gbnVtYmVyIG9mIGNvcnJlY3Rpb24gZm9yIHNpZ25hbHMKK0RHQU5TU1NnbkVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzdklECQkgU1ZJRCwgLS0gU2F0ZWxsaXRlIGlkZW50aXR5CisKKy0tLSBTZXF1ZW5jZSBudW1iZXIgZm9yIEdBTlNTIE5hdmlnYXRpb24gTW9kZWwgdGhhdCBtYXRjaGVzIHRoZSBER0FOU1MgY29ycmVjdGlvbiBzZXQKKwlpb2QgCQkJSU5URUdFUiAoMCAuLiAxMDIzKSwKKworCS0tIFVzZXIgRGlmZmVyZW50aWFsIFJhbmdlIEVycm9yCisJdWRyZQkJCUlOVEVHRVIgKDAuLjMpLAkJCisKKwktLSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiwgcmFuZ2UgaXMKKwktLSAtNjU1LjA0IC0gKzY1NS4wNCwKKwlwc2V1ZG9SYW5nZUNvcglJTlRFR0VSICgtMjA0Ny4uMjA0NyksIAkKKworCS0tIFBzZXVkbyBSYW5nZSBSYXRlIENvcnJlY3Rpb24sIHJhbmdlIGlzCisJLS0gLTQuMDY0IC0gKzQuMDY0LAorCXJhbmdlUmF0ZUNvcglJTlRFR0VSICgtMTI3Li4xMjcpCit9CisKK1NWSUQgOjo9IElOVEVHRVIgKDAgLi4gNjMpCS0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKworLS0gR0FOU1MgTmF2aWdhdGlvbiBNb2RlbCBJRQorR0FOU1NOYXZNb2RlbCA6Oj0gU0VRVUVOQ0UgeworIG5vbkJyb2FkY2FzdEluZEZsYWcgSU5URUdFUiAoMCAuLiAxKSwKKyB0b2VNU0IgSU5URUdFUiAoMCAuLiAzMSkgT1BUSU9OQUwsIC0tIDUgTVNCIG9mIHRvZSBhbmQgdG9jIAorIGVNU0IgSU5URUdFUiAoMCAuLiAxMjcpIE9QVElPTkFMLAorIHNxcnRBTUJTIElOVEVHRVIgKDAgLi4gNjMpIE9QVElPTkFMLAorCWdhbnNzU2F0ZWxsaXRlTGlzdCBTZXFPZkdBTlNTU2F0ZWxsaXRlRWxlbWVudAorfQorCitTZXFPZkdBTlNTU2F0ZWxsaXRlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMzIpKSBPRiBHQU5TU1NhdGVsbGl0ZUVsZW1lbnQKKworR0FOU1NTYXRlbGxpdGVFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc3ZJRCBTVklELAorIHN2SGVhbHRoIElOVEVHRVIgKC03IC4uIDEzKSwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGlvZCBJTlRFR0VSICgwIC4uIDEwMjMpLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgZ2Fuc3NDbG9ja01vZGVsIEdBTlNTQ2xvY2tNb2RlbCwgCisgZ2Fuc3NPcmJpdE1vZGVsIEdBTlNTT3JiaXRNb2RlbCwgCisgLi4uCit9CisKKy0tIEdBTlNTIG9yYml0IG1vZGVsIGZvciB0aGUgR05TUyBzYXRlbGxpdGUgYWNjb3JkaW5nIHRvIHRoZSBjaG9pY2UKK0dBTlNTT3JiaXRNb2RlbCA6Oj0gQ0hPSUNFIHsKKwlrZXBsZXJpYW5TZXQJIE5hdk1vZGVsLUtlcGxlcmlhblNldCwJCisgLi4uCit9CisKKy0tIE5hdmlnYXRpb24gbW9kZWwgaW4gS2VwbGVyaWFuIHBhcmFtZXRlcnMKK05hdk1vZGVsLUtlcGxlcmlhblNldCA6Oj0gU0VRVUVOQ0UgeworIGtlcGxlclRvZUxTQiBJTlRFR0VSICgwIC4uIDUxMSksIC0tIDlMU0IgYXJlIGdpdmVuIGluIEdBTlNTTmF2aWdhdGlvbk1vZGVsCisJa2VwbGVyVwkJCSBJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJa2VwbGVyRGVsdGFOCSBJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwlrZXBsZXJNMAkJIElOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwlrZXBsZXJPbWVnYURvdAkgSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWtlcGxlckVMU0IgCSBJTlRFR0VSICgwLi4zMzU1NDQzMSksCisJa2VwbGVySURvdAkJIElOVEVHRVIgKC04MTkyLi44MTkxKSwKKwlrZXBsZXJBUG93ZXJIYWxmTFNCIElOVEVHRVIgKDAuLiA2NzEwODg2MyksCisJa2VwbGVySTAJCSBJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJa2VwbGVyT21lZ2EwIElOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwlrZXBsZXJDcnMJCSBJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwlrZXBsZXJDaXMJCSBJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwlrZXBsZXJDdXMJCSBJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwlrZXBsZXJDcmMJCSBJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwlrZXBsZXJDaWMJCSBJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwlrZXBsZXJDdWMJCSBJTlRFR0VSICgtMzI3NjguLjMyNzY3KQorfQorCistLSBHQU5TUyBjbG9jayBtb2RlbCBmb3IgdGhlIEdOU1Mgc2F0ZWxsaXRlIGFjY29yZGluZyB0byB0aGUgY2hvaWNlCitHQU5TU0Nsb2NrTW9kZWwgOjo9IENIT0lDRSB7CisJc3RhbmRhcmRDbG9ja01vZGVsTGlzdAkgU2VxT2ZTdGFuZGFyZENsb2NrTW9kZWxFbGVtZW50LAkKKyAuLi4KK30KKworU2VxT2ZTdGFuZGFyZENsb2NrTW9kZWxFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4yKSkgT0YgU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudAorCitTdGFuZGFyZENsb2NrTW9kZWxFbGVtZW50IDo6PSBTRVFVRU5DRSB7Cisgc3RhbkNsb2NrVG9jTFNCIElOVEVHRVIgKDAgLi4gNTExKSwgLS0gOUxTQiBvZiB0aW1lIG9mIGNsb2NrCisgc3RhbkNsb2NrQUYyIElOVEVHRVIgKC0yMDQ4IC4uIDIwNDcpLCAKKyBzdGFuQ2xvY2tBRjEgSU5URUdFUiAoLTEzMTA3MiAuLiAxMzEwNzEpLCAKKyBzdGFuQ2xvY2tBRjAgSU5URUdFUiAoLTEzNDIxNzcyOCAuLiAxMzQyMTc3MjcpLAorIHN0YW5DbG9ja1RnZCBJTlRFR0VSICgtNTEyIC4uIDUxMSkgT1BUSU9OQUwsCisgc3Rhbk1vZGVsSUQgSU5URUdFUiAoMCAuLiAxKSBPUFRJT05BTCwKKyAuLi4KK30gCisKKy0tIEdBTlNTIFJlYWwtVGltZSBJbnRlZ3JpdHkgSUUKK0dBTlNTUmVhbFRpbWVJbnRlZ3JpdHkgOjo9IFNFUVVFTkNFIHsKKyAtLSBsaXN0IG9mIGJhZCBzaWduYWxzCisgLS0gTkJTIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIGluIFNlcU9mLUJhZFNpZ25hbFNldAorIGdhbnNzQmFkU2lnbmFsTGlzdCBTZXFPZkJhZFNpZ25hbEVsZW1lbnQKK30KKworU2VxT2ZCYWRTaWduYWxFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNikpIE9GIEJhZFNpZ25hbEVsZW1lbnQKKworQmFkU2lnbmFsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIGJhZFNWSUQgU1ZJRCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGJhZFNpZ25hbElEIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorfQorCisKKy0tIEdBTlNTIERhdGEgQml0IEFzc2lzdGFuY2UgSUUKK0dBTlNTRGF0YUJpdEFzc2lzdCA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzVE9EIElOVEVHRVIgKDAgLi4gNTkpLAorIHN2SUQgU1ZJRCwKKyBnYW5zc0RhdGFUeXBlSUQgSU5URUdFUiAoMCAuLiAyKSwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIC0tIGxpc3Qgb2YgbmF2aWdhdGlvbiBkYXRhIGJpdHMKKyAtLSBOX0JJVCBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBpbiBTZXFPZi1EYXRhQml0cworIGdhbnNzRGF0YUJpdHMgU2VxT2YtR0FOU1NEYXRhQml0cworfQorCitTZXFPZi1HQU5TU0RhdGFCaXRzIDo6PSBTRVFVRU5DRSAoU0laRSgxIC4uIDEwMjQpKSBPRiBHQU5TU0RhdGFCaXQKK0dBTlNTRGF0YUJpdCA6Oj0gSU5URUdFUigwIC4uIDEpCisKKy0tIEdBTlNTIFJlZmVyZW5jZSBNZWFzdXJlbWVudCBBc3Npc3RhbmNlIElFCistLSBDb2RlIGFuZCBEb3BwbGVyIGFzc2lzdGFuY2UgZnJvbSB0aGUgbmV0d29yay4gCitHQU5TU1JlZk1lYXN1cmVtZW50QXNzaXN0IDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3NTaWduYWxJRCBJTlRFR0VSICgwIC4uIDMpIE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgZ2Fuc3NSZWZNZWFzQXNzaXRMaXN0IFNlcU9mR0FOU1NSZWZNZWFzdXJlbWVudEVsZW1lbnQKK30KKworU2VxT2ZHQU5TU1JlZk1lYXN1cmVtZW50RWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMSAuLiAxNikpIE9GIEdBTlNTUmVmTWVhc3VyZW1lbnRFbGVtZW50CisKK0dBTlNTUmVmTWVhc3VyZW1lbnRFbGVtZW50IDo6PSBTRVFVRU5DRSB7Cisgc3ZJRCBTVklELAorCS0tIERvcHBsZXIgMHRoIG9yZGVyIHRlcm0sCisJLS0gLTEwMjQgbS9zIHRvIDEwMjMuNSBtL3Mgd2l0aCAwLjUgbS9zIHJlc29sdXRpb24pCisJZG9wcGxlcjAJCQkJSU5URUdFUiAoLTIwNDggLi4gMjA0NyksCS0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKwlhZGRpdGlvbmFsRG9wcGxlcgkJQWRkaXRpb25hbERvcHBsZXJGaWVsZHMJIE9QVElPTkFMLAorCWNvZGVQaGFzZQkJCQlJTlRFR0VSICgwIC4uIDEwMjIpLAkgLS0gQ29kZSBQaGFzZSBpbiBtcworCWludENvZGVQaGFzZQkJCUlOVEVHRVIgKDAgLi4gMTI3KSwJIC0tIEludGVnZXIgQ29kZSBQaGFzZSBpbiBtcworCWNvZGVQaGFzZVNlYXJjaFdpbmRvdwlJTlRFR0VSICgwIC4uIDMxKSwJIC0tIENvZGUgUGhhc2UgU2VhcmNoIFdpbmRvdywgc2VlIEFubmV4CisJYWRkaXRpb25hbEFuZ2xlCQkJQWRkaW9uYWxBbmdsZUZpZWxkcwkJIE9QVElPTkFMLAorIC4uLgorfQorCitBZGRpdGlvbmFsRG9wcGxlckZpZWxkcyA6Oj0gU0VRVUVOQ0UgeworCS0tIERvcHBsZXIgMXN0IG9yZGVyIHRlcm0sIC0wLjIgLSArMC4xIG0vczIKKwlkb3BwbGVyMQkJCQlJTlRFR0VSICgwLi42MyksCisJZG9wcGxlclVuY2VydGFpbnR5CQlJTlRFR0VSICgwLi40KQorfQorCistLSBHQU5TUyBBbG1hbmFjIE1vZGVsIElFCitHQU5TU0FsbWFuYWNNb2RlbCA6Oj0gU0VRVUVOQ0UgeworIHdlZWtOdW1iZXIgSU5URUdFUiAoMCAuLiAyNTUpLAorIHN2SURNYXNrIFNWSURNQVNLLAorIHRvYSBJTlRFR0VSICgwIC4uIDI1NSkgT1BUSU9OQUwsCisgaW9kYSBJTlRFR0VSICgwIC4uIDMpIE9QVElPTkFMLAorIGdhbnNzQWxtYW5hY0xpc3QgU2VxT2ZHQU5TU0FsbWFuYWNFbGVtZW50Cit9CisKKy0tIFNWIElEIE1hc2ssIExTQiBmb3IgSUQgMSBhbmQgTVNCIGZvciBJRCAzNgorU1ZJRE1BU0sgOjo9IEJJVCBTVFJJTkcgKFNJWkUgKDEuLjM2KSkKKworU2VxT2ZHQU5TU0FsbWFuYWNFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxIC4uIDM2KSkgT0YgR0FOU1NBbG1hbmFjRWxlbWVudAorCistLSBHQU5TUyBBbG1hbmFjIE1vZGVsIAorR0FOU1NBbG1hbmFjRWxlbWVudCA6Oj0gQ0hPSUNFIHsKKwlrZXBsZXJpYW5BbG1hbmFjU2V0CSBBbG1hbmFjLUtlcGxlcmlhblNldCwJCisgLi4uCit9CisKKy0tIEFsbWFuYWMgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gS2VwbGVyaWFuIHBhcmFtZXRlcnMKK0FsbWFuYWMtS2VwbGVyaWFuU2V0IDo6PSBTRVFVRU5DRSB7CisgCWtlcEFsbWFuYWNFCQkJIElOVEVHRVIgKDAgLi4gMjA0NyksCisJa2VwQWxtYW5hY0RlbHRhSQkJSU5URUdFUiAoLTEwMjQgLi4gMTAyMyksCisJa2VwQWxtYW5hY09tZWdhRG90CQlJTlRFR0VSICgtMTAyNCAuLiAxMDIzKSwKKyBrZXBTVkhlYWx0aCBJTlRFR0VSICgwIC4uIDE1KSwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCWtlcEFsbWFuYWNBUG93ZXJIYWxmCUlOVEVHRVIgKC02NTUzNiAuLiA2NTUzNSksCisJa2VwQWxtYW5hY09tZWdhMAkJSU5URUdFUiAoLTMyNzY4IC4uIDMyNzY3KSwKKwlrZXBBbG1hbmFjVwkJCSBJTlRFR0VSICgtMzI3NjggLi4gMzI3NjcpLAorCWtlcEFsbWFuYWNNMAkJCUlOVEVHRVIgKC0zMjc2OCAuLiAzMjc2NyksCisJa2VwQWxtYW5hY0FGMAkJCUlOVEVHRVIgKC04MTkyIC4uIDgxOTEpLAorCWtlcEFsbWFuYWNBRjEJCQlJTlRFR0VSICgtMTAyNC4uMTAyMykKK30KKworLS0gR0FOU1MgVW5pdmVyc2FsIFRpbWUgQ29vcmRpbmF0ZSBNb2RlbAorR0FOU1NVVENNb2RlbCA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzVXRjQTEJCQlJTlRFR0VSICgtODM4ODYwOC4uODM4ODYwNyksCisJZ2Fuc3NVdGNBMAkJCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwlnYW5zc1V0Y1RvdAkJCUlOVEVHRVIgKDAuLjI1NSksCisJZ2Fuc3NVdGNXTnQJCQlJTlRFR0VSICgwLi4yNTUpLAorCWdhbnNzVXRjRGVsdGFUbHMJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwlnYW5zc1V0Y1dObHNmCQlJTlRFR0VSICgwLi4yNTUpLAorCWdhbnNzVXRjRE4JCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWdhbnNzVXRjRGVsdGFUbHNmCUlOVEVHRVIgKC0xMjguLjEyNykKK30KKworLS1SZXF1aXJlZCBNZWFzdXJlbWVudCBSZXF1ZXN0IFJlc3BvbnNlIFRpbWUsIHJhbmdlIGlzIDEgdG8gMTI4IHNlY29uZHMuIAorUmVxdWlyZWRSZXNwb25zZVRpbWUgOjo9IElOVEVHRVIgICgxLi4xMjgpCisKK1JlbC03LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKworCXZlbEVzdGltYXRlIAlWZWxvY2l0eUVzdGltYXRlIE9QVElPTkFMLAorIC0tIEhvcml6b250YWwgVmVsb2NpdHkKKyAtLSBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkKKyAtLSBIb3Jpem9udGFsIFZlbG9jaXR5IHdpdGggVW5jZXJ0YWludHkKKyAtLSBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkgYW5kIFVuY2VydGFpbnR5CisgZ2Fuc3NMb2NhdGlvbkluZm8gR0FOU1NMb2NhdGlvbkluZm8gT1BUSU9OQUwsCisgZ2Fuc3NNZWFzdXJlSW5mbyBHQU5TU01lYXN1cmVJbmZvIE9QVElPTkFMLAorCS4uLgorLS0gRnVydGhlciBSZWxlYXNlIDcgZXh0ZW5zaW9ucyBoZXJlCit9CisKKy0tIEdBTlNTIExvY2F0aW9uIEluZm9ybWF0aW9uIGNvbnRhaW5zIGxvY2F0aW9uIGVzdGltYXRlLCB0aW1lIHN0YW1wIHdpdGggdW5jZXJ0YWludHkgCistLSBhbmQgb3B0aW9uYWxseSBSZWZlcmVuY2UgRnJhbWUgZmllbGQKK0dBTlNTTG9jYXRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisgcmVmZXJlbmNlRnJhbWUgUmVmZXJlbmNlRnJhbWUgT1BUSU9OQUwsIC0tIFJlZmVyZW5jZSBGcmFtZSBOdW1iZXIKKyBnYW5zc1RPRG0gR0FOU1NUT0RtIE9QVElPTkFMLCAtLSBHTlNTIFRPRCBtb2R1bG8KKyBnYW5zc1RPREZyYWMgSU5URUdFUiAoMCAuLiAxNjM4NCkgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKwlnYW5zc1RPRFVuY2VydGFpbnR5IEdBTlNTVE9EVW5jZXJ0YWludHkgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBnYW5zc1RpbWVJRCBJTlRFR0VSICgwIC4uIDMpIE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisJZml4VHlwZQkJCSBGaXhUeXBlLAorIHBvc0RhdGEgUG9zaXRpb25EYXRhLAorIHN0YXRpb25hcnlJbmRpY2F0aW9uIElOVEVHRVIoMCAuLiAxKSBPUFRJT05BTCwgLS0gJzAnIGlmIG1vdmluZyBvciBtb3Rpb24gbm90IGtub3duIAorCS0tIFBvc3NpYmxlIHNoYXBlcyBjYXJyaWVkIGluIHBvc0VzdGltYXRlIGFyZQorCS0tIGVsbGlwc29pZCBwb2ludCwKKwktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKwktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBlbGxpcHNlCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggYWx0aXR1ZGUgYW5kIHVuY2VydGFpbnR5IGVsbGlwc29pZAorCXBvc0VzdGltYXRlCQkgRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLAorIC4uLgorfQorCitQb3NpdGlvbkRhdGEgOjo9IEJJVCBTVFJJTkcgeworIGUtb3RkKDApLAorCWdwcyAoMSksCisJZ2FsaWxlbyAoMikgfSAoU0laRSAoMy4uMTYpKQorCisKKy0tIEdBTlNTIFRPRCBtb2R1bG8gMSBob3VyCitHQU5TU1RPRG0gOjo9IElOVEVHRVIgKDAgLi4gMzU5OTk5OSkKKworUmVmZXJlbmNlRnJhbWUgOjo9IFNFUVVFTkNFIHsKKyByZWZlcmVuY2VGTiBJTlRFR0VSICgwIC4uIDY1NTM1KSwKKwktLSBOb3RlIHRoYXQgYXBwbGljYWJsZSByYW5nZSBmb3IgcmVmZXJlbmNlRk4gaXMgMCAtIDQyNDMxCisgcmVmZXJlbmNlRk5NU0IgSU5URUdFUiAoMCAuLiA2MykgT1BUSU9OQUwgLS0gTVNCIG9mIFJlZmVyZW5jZSBGcmFtZSBOdW1iZXIKK30KKworCisKKy0tIEdBTlNTIE1lYXN1cmVtZW50IEluZm9ybWF0aW9uIAorR0FOU1NNZWFzdXJlSW5mbyA6Oj0gU0VRVUVOQ0UgeworCS0tIE1lYXN1cmVtZW50IGluZm8gZWxlbWVudHMKKwktLSB1c2VyIGhhcyB0byBtYWtlIHN1cmUgdGhhdCBpbiB0aGlzIGVsZW1lbnQgaXMgbnVtYmVyIG9mIGVsZW1lbnRzCisJLS0gZGVmaW5lZCBpbiByZWZlcmVuY2UgQlRTIGlkZW50aXR5CisgZ2Fuc3NNc3JTZXRMaXN0IFNlcU9mR0FOU1MtTXNyU2V0RWxlbWVudAorfQorU2VxT2ZHQU5TUy1Nc3JTZXRFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4zKSkgT0YgR0FOU1MtTXNyU2V0RWxlbWVudAorCistLSBHQU5TUyBtZWFzdXJlbWVudCBpbmZvcm1hdGlvbiAxLTMgdGltZXMgaW4gYSBtZXNzYWdlCitHQU5TUy1Nc3JTZXRFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisgcmVmZXJlbmNlRnJhbWUgUmVmZXJlbmNlRnJhbWUgT1BUSU9OQUwsIC0tIFJlZmVyZW5jZSBGcmFtZSBOdW1iZXIKKyBnYW5zc1RPRG0gR0FOU1NUT0RtIE9QVElPTkFMLCAtLSBHQU5TUyBUT0QgbW9kdWxvCisgZGVsdGFHTkFTU1RPRCBJTlRFR0VSICgwIC4uIDEyNykgT1BUSU9OQUwsCisJZ2Fuc3NUT0RVbmNlcnRhaW50eSBHQU5TU1RPRFVuY2VydGFpbnR5IE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JpbmcgdG8gQW5uZXgKKworIC0tTl9TR05fVFlQRSBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBvZiBTZXFPZkdBTlNTLVNnblR5cGVFbGVtZW50CisgZ2Fuc3MtU2duVHlwZUxpc3QgU2VxT2ZHQU5TUy1TZ25UeXBlRWxlbWVudAorfQorCistLSBNZWFzdXJlbWVudHMgY2FuIGJlIHJldHVybmVkIHVwIHRvIDYgZGlmZmVyZW50IHNpZ25hbCB0eXBlcyAKK1NlcU9mR0FOU1MtU2duVHlwZUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjYpKSBPRiBHQU5TUy1TZ25UeXBlRWxlbWVudAorCitHQU5TUy1TZ25UeXBlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzU2lnbmFsSUQJCUlOVEVHRVIgKDAgLi4gMTUpLCAtLSBDb2RpbmcgYWNjcm9kaW5nIHRvIEFubmV4CisgLS1OX1NHTiBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBvZiBTZXFPZkdBTlNTLVNnbkVsZW1lbnQKKyBnYW5zcy1TZ25MaXN0IFNlcU9mR0FOU1MtU2duRWxlbWVudAorfQorCistLSBNZWFzdXJlbWVudHMgY2FuIGJlIHJldHVybmVkIHVwIHRvIDE2IHBlciBzaWduYWwgdHlwZXMgCitTZXFPZkdBTlNTLVNnbkVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgR0FOU1MtU2duRWxlbWVudAorCisKK0dBTlNTLVNnbkVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyBzdklEIFNWSUQsCisgY05vIElOVEVHRVIgKDAgLi4gNjMpLAorIG1wYXRoRGV0IE1wYXRoSW5kaWMsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBjYXJyaWVyUXVhbGl0eUluZCBJTlRFR0VSICgwIC4uIDMpIE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgY29kZVBoYXNlIElOVEVHRVIgKDAgLi4gMjA5NzE1MSksCisgaW50ZWdlckNvZGVQaGFzZSBJTlRFR0VSICgwIC4uIDYzKSBPUFRJT05BTCwKKyBjb2RlUGhhc2VSTVNFcnJvciBJTlRFR0VSICgwLi42MyksIC0tIENvZGluZyBhY2NvcmluZyB0byBBbm5leAorIGRvcHBsZXIgSU5URUdFUiAoLTMyNzY4IC4uIDMyNzY3KSBPUFRJT05BTCwKKyBhZHIgSU5URUdFUiAoMCAuLiAzMzU1NDQzMSkgT1BUSU9OQUwKK30KKworUmVsNy1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKyBnYW5zcy1Bc3Npc3REYXRhIEdBTlNTLUFzc2lzdERhdGEgT1BUSU9OQUwsCisgZ2Fuc3NDYXJyaWVyUGhhc2VNZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwKKyBnYW5zc1RPREdTTVRpbWVBc3NvY2lhdGlvbk1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLAorCS4uLgorLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDcgaGVyZQorfQorCitFTkQKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1NZXNzYWdlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtTWVzc2FnZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTQwZTIKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtTWVzc2FnZXMuYXNuCkBAIC0wLDAgKzEsMzggQEAKKy0tIFJSTFAtTWVzc2FnZXMuYXNuCistLSAkSWQkCistLSBUYWtlbiBmcm9tIDNHUFAgVFMgNDQuMDMxIFY3LjQuMCAoMjAwNy0wMykKKy0tIGh0dHA6Ly93d3cuM2dwcC5vcmcvZnRwL1NwZWNzL2FyY2hpdmUvNDRfc2VyaWVzLzQ0LjAzMS80NDAzMS03NDAuemlwLzQ0MDMxLTc0MC5kb2MKKy0tCistLSAzLjEgR2VuZXJhbCBGb3JtYXQgb2YgUlJMUCBNZXNzYWdlCistLQorCitSUkxQLU1lc3NhZ2VzCistLSB7IFJSTFAtbWVzc2FnZXMgfQorCitERUZJTklUSU9OUyBBVVRPTUFUSUMgVEFHUyA6Oj0KKworQkVHSU4KKworSU1QT1JUUworCU1zclBvc2l0aW9uLVJlcSwgTXNyUG9zaXRpb24tUnNwLCBBc3Npc3RhbmNlRGF0YSwKKwlQcm90b2NvbEVycm9yCitGUk9NCisJUlJMUC1Db21wb25lbnRzIAktLSB7IFJSTFAtQ29tcG9uZW50cyB9Cis7CisKK1BEVSA6Oj0gU0VRVUVOQ0UgeworCXJlZmVyZW5jZU51bWJlcgkJCUlOVEVHRVIgKDAuLjcpLAorCWNvbXBvbmVudAkJCQlSUkxQLUNvbXBvbmVudAorfQorCitSUkxQLUNvbXBvbmVudCA6Oj0gQ0hPSUNFIHsKKwltc3JQb3NpdGlvblJlcQkJCU1zclBvc2l0aW9uLVJlcSwKKwltc3JQb3NpdGlvblJzcAkJCU1zclBvc2l0aW9uLVJzcCwKKwlhc3Npc3RhbmNlRGF0YQkJCUFzc2lzdGFuY2VEYXRhLAorCWFzc2lzdGFuY2VEYXRhQWNrCQlOVUxMLAorCXByb3RvY29sRXJyb3IJCQlQcm90b2NvbEVycm9yLAorCS4uLgorCit9CisKK0VORApkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9wYXRjaC1ycmxwLWNvbXBvbmVudHMuZGlmZiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvcGF0Y2gtcnJscC1jb21wb25lbnRzLmRpZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlNTVhZQotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvcGF0Y2gtcnJscC1jb21wb25lbnRzLmRpZmYKQEAgLTAsMCArMSwzNiBAQAorLS0tIFJSTFAtQ29tcG9uZW50cy5hc24JMjAwOS0xMC0yNiAyMjoxMDo0NC4wMDAwMDAwMDAgKzAxMDAKKysrKyBSUkxQLUNvbXBvbmVudHMuYXNuCTIwMDktMTAtMjYgMjI6MTA6NDQuMDAwMDAwMDAwICswMTAwCitAQCAtMTgsMTYgKzE4LDE2IEBACisgCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgVmVsb2NpdHlFc3RpbWF0ZQorIEZST00KKyAJTUFQLUxDUy1EYXRhVHlwZXMgeworLQljY2l0dCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorLQlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUxDUy1EYXRhVHlwZXMgKDI1KSB2ZXJzaW9uNSAoNSl9CisrCWl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisrCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTENTLURhdGFUeXBlcyAoMjUpIHZlcnNpb24xMSAoMTEpfQorIAorIAlFeHRlbnNpb25Db250YWluZXIKKyBGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworLQljY2l0dCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorLQlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb240ICg0KX0KKysJaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKysJZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKyA7CisgCisgLS0gQWRkIGhlcmUgb3RoZXIgQVNOLjEgZGVmaW5pdGlvbnMgcHJlc2VudGVkIGJlbG93CisgLS0gaW4gY2hhcHRlcnMgNCBhbmQgNS4KKyAKK0BAIC0zMDUsMTEgKzMwNSwxMSBAQAorIFN5c3RlbUluZm9JbmRleCA6Oj0gSU5URUdFUiAoMS4uMzIpCisgCisgQ2VsbElEQW5kTEFDIDo6PSBTRVFVRU5DRSB7CistCXJlZmVyZW5jZUxBQwlMQUMsCQkJCS0tIExvY2F0aW9uIGFyZWEgY29kZQorKwlyZWZlcmVuY2VMQUMJTEFDSUQsCQkJCS0tIExvY2F0aW9uIGFyZWEgY29kZQorIAlyZWZlcmVuY2VDSQkJQ2VsbElECQkJCS0tIENlbGwgaWRlbnRpdHkKKyB9CisgQ2VsbElEIDo6PSBJTlRFR0VSICgwLi42NTUzNSkKKy1MQUMgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorK0xBQ0lEIDo6PSBJTlRFR0VSICgwLi42NTUzNSkKKyAKKyAtLSBPVEQtTWVhc3VyZUluZm8KKyBPVEQtTWVhc3VyZUluZm8gOjo9IFNFUVVFTkNFIHsKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDBfYWRkX2VudW1lcmF0ZWRfdmVyYm9zZS5kaWZmIGIvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMF9hZGRfZW51bWVyYXRlZF92ZXJib3NlLmRpZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjMjJhMwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDBfYWRkX2VudW1lcmF0ZWRfdmVyYm9zZS5kaWZmCkBAIC0wLDAgKzEsNTYgQEAKK0luZGV4OiBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5jCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuYwkocmV2aXNpb24gMTQwNykKKysrKyBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5jCSh3b3JraW5nIGNvcHkpCitAQCAtMjIsNyArMjIsNyBAQAorIAkiRU5VTUVSQVRFRCIsCQkJLyogVGhlIEFTTi4xIHR5cGUgaXMgc3RpbGwgRU5VTUVSQVRFRCAqLworIAkiRU5VTUVSQVRFRCIsCisgCU5hdGl2ZUludGVnZXJfZnJlZSwKKy0JTmF0aXZlSW50ZWdlcl9wcmludCwKKysJTmF0aXZlRW51bWVyYXRlZF9wcmludCwKKyAJYXNuX2dlbmVyaWNfbm9fY29uc3RyYWludCwKKyAJTmF0aXZlSW50ZWdlcl9kZWNvZGVfYmVyLAorIAlOYXRpdmVJbnRlZ2VyX2VuY29kZV9kZXIsCitAQCAtMjA1LDMgKzIwNSwzMCBAQAorIAlfQVNOX0VOQ09ERURfT0soZXIpOworIH0KKyAKKytpbnQKKytOYXRpdmVFbnVtZXJhdGVkX3ByaW50KGFzbl9UWVBFX2Rlc2NyaXB0b3JfdCAqdGQsIGNvbnN0IHZvaWQgKnNwdHIsIGludCBpbGV2ZWwsCisrCWFzbl9hcHBfY29uc3VtZV9ieXRlc19mICpjYiwgdm9pZCAqYXBwX2tleSkgeworKwlhc25fSU5URUdFUl9zcGVjaWZpY3NfdCAqc3BlY3M9KGFzbl9JTlRFR0VSX3NwZWNpZmljc190ICopdGQtPnNwZWNpZmljczsKKysJY29uc3QgbG9uZyAqbmF0aXZlID0gKGNvbnN0IGxvbmcgKilzcHRyOworKwljaGFyIHNjcmF0Y2hbMjU2XTsKKysJaW50IHJldDsKKysKKysJKHZvaWQpdGQ7CS8qIFVudXNlZCBhcmd1bWVudCAqLworKwkodm9pZClpbGV2ZWw7CS8qIFVudXNlZCBhcmd1bWVudCAqLworKworKwlpZihuYXRpdmUpIHsKKysJCWNvbnN0IGFzbl9JTlRFR0VSX2VudW1fbWFwX3QgKm1hcCA9IElOVEVHRVJfbWFwX3ZhbHVlMmVudW0oc3BlY3MsICpuYXRpdmUpOworKwkJaWYgKG1hcCAmJiBtYXAtPmVudW1fbGVuICYmIG1hcC0+ZW51bV9uYW1lKSB7CisrCQkJcmV0ID0gc25wcmludGYoc2NyYXRjaCwgc2l6ZW9mKHNjcmF0Y2gpLAorKwkJCQkiJXMiLCBtYXAtPmVudW1fbmFtZSk7CisrCQl9IGVsc2UgeworKwkJCXJldCA9IHNucHJpbnRmKHNjcmF0Y2gsIHNpemVvZihzY3JhdGNoKSwKKysJCQkJKHNwZWNzICYmIHNwZWNzLT5maWVsZF91bnNpZ25lZCkKKysJCQkJPyAiJWx1IiA6ICIlbGQiLCAqbmF0aXZlKTsKKysJCX0KKysJCWFzc2VydChyZXQgPiAwICYmIChzaXplX3QpcmV0IDwgc2l6ZW9mKHNjcmF0Y2gpKTsKKysJCXJldHVybiAoY2Ioc2NyYXRjaCwgcmV0LCBhcHBfa2V5KSA8IDApID8gLTEgOiAwOworKwl9IGVsc2UgeworKwkJcmV0dXJuIChjYigiPGFic2VudD4iLCA4LCBhcHBfa2V5KSA8IDApID8gLTEgOiAwOworKwl9CisrfQorSW5kZXg6IHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5oCShyZXZpc2lvbiAxNDA3KQorKysrIHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmgJKHdvcmtpbmcgY29weSkKK0BAIC0yNCw2ICsyNCw3IEBACisgeGVyX3R5cGVfZW5jb2Rlcl9mIE5hdGl2ZUVudW1lcmF0ZWRfZW5jb2RlX3hlcjsKKyBwZXJfdHlwZV9kZWNvZGVyX2YgTmF0aXZlRW51bWVyYXRlZF9kZWNvZGVfdXBlcjsKKyBwZXJfdHlwZV9lbmNvZGVyX2YgTmF0aXZlRW51bWVyYXRlZF9lbmNvZGVfdXBlcjsKKythc25fc3RydWN0X3ByaW50X2YgTmF0aXZlRW51bWVyYXRlZF9wcmludDsKKyAKKyAjaWZkZWYgX19jcGx1c3BsdXMKKyB9CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAxX2ZpeF9wZXJfZW5jb2RpbmdfZGlldGVyLmRpZmYgYi9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAxX2ZpeF9wZXJfZW5jb2RpbmdfZGlldGVyLmRpZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5YzIwMQotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDFfZml4X3Blcl9lbmNvZGluZ19kaWV0ZXIuZGlmZgpAQCAtMCwwICsxLDE3IEBACitJbmRleDogc2tlbGV0b25zL3Blcl9zdXBwb3J0LmMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSBza2VsZXRvbnMvcGVyX3N1cHBvcnQuYwkocmV2aXNpb24gMTQwNykKKysrKyBza2VsZXRvbnMvcGVyX3N1cHBvcnQuYwkod29ya2luZyBjb3B5KQorQEAgLTMzNiw3ICszMzYsMTIgQEAKKyAJCWJ1ZlszXSA9IGJpdHM7CisgCWVsc2UgeworIAkJQVNOX0RFQlVHKCItPltQRVIgb3V0IHNwbGl0ICVkXSIsIG9iaXRzKTsKKysjaWYgMSAvLyBEaWV0ZXIKKysJCXBvLT5uYm9mZiAtPSBvYml0czsgLy8gdW5kbyBpbmNyZW1lbnRhdGlvbiBmcm9tIGEgZmV3IGxpbmVzIGFib3ZlCisrCQlwZXJfcHV0X2Zld19iaXRzKHBvLCBiaXRzID4+IChvYml0cyAtIDI0KSwgMjQpOyAvLyBzaGlmdCBhY2NvcmRpbmcgdG8gdGhlIHJlc3Qgb2YgdGhlIGJpdHMgCisrI2Vsc2UJCQorIAkJcGVyX3B1dF9mZXdfYml0cyhwbywgYml0cyA+PiA4LCAyNCk7CisrI2VuZGlmCisgCQlwZXJfcHV0X2Zld19iaXRzKHBvLCBiaXRzLCBvYml0cyAtIDI0KTsKKyAJCUFTTl9ERUJVRygiPC1bUEVSIG91dCBzcGxpdCAlZF0iLCBvYml0cyk7CisgCX0KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2RhdGEudWJ4IGIvcnJscC1lcGhlbWVyaXMvZGF0YS51YngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjZGRkYwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2RhdGEudWJ4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2dldC10ZXN0LWRhdGEuc2ggYi9ycmxwLWVwaGVtZXJpcy9nZXQtdGVzdC1kYXRhLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE2OWY0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9nZXQtdGVzdC1kYXRhLnNoCkBAIC0wLDAgKzEsMTcgQEAKKyMhL2Jpbi9zaAorCitERVY9JDEKK09VVEY9JDIKKworIyBDaGFuZ2UgbW9kZQorZWNobyAtZW4gIlwkUFVCWCw0MSwxLDAwMDEsMDAwMSw5NjAwLDAqMTRcclxuIiA+ICR7REVWfQorCisjIFdhaXQgYSBsaXR0bGUKK3NsZWVwIDIKKworIyBTdGFydCBkdW1wCitlY2hvIC1lbiAiXHhiNVx4NjJceDAxXHgwMlx4MDBceDAwXHgwM1x4MGEiIHwgXAorCXNvY2F0IC10NSAke0RFVn0sYjk2MDAscmF3LGNsb2NhbD0xLGVjaG89MCAtID4gJHtPVVRGfQorZWNobyAtZW4gIlx4YjVceDYyXHgwYlx4MTBceDAwXHgwMFx4MWJceDVjIiB8IFwKKwlzb2NhdCAtdDEwICR7REVWfSxiOTYwMCxyYXcsY2xvY2FsPTEsZWNobz0wIC0gPj4gJHtPVVRGfQorCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvcnJscC1lcGhlbWVyaXMvZ3BsLTIuMC50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBDT1BZSU5HCmNvcHkgdG8gcnJscC1lcGhlbWVyaXMvZ3BsLTIuMC50eHQKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2dwbC0zLjAudHh0IGIvcnJscC1lcGhlbWVyaXMvZ3BsLTMuMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhOWVkMAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2dwbC0zLjAudHh0CkBAIC0wLDAgKzEsNjc0IEBACisgICAgICAgICAgICAgICAgICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMywgMjkgSnVuZSAyMDA3CisKKyBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIDxodHRwOi8vZnNmLm9yZy8+CisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQorCisgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBhIGZyZWUsIGNvcHlsZWZ0IGxpY2Vuc2UgZm9yCitzb2Z0d2FyZSBhbmQgb3RoZXIga2luZHMgb2Ygd29ya3MuCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFuZCBvdGhlciBwcmFjdGljYWwgd29ya3MgYXJlIGRlc2lnbmVkCit0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgdGhlIHdvcmtzLiAgQnkgY29udHJhc3QsCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0bworc2hhcmUgYW5kIGNoYW5nZSBhbGwgdmVyc2lvbnMgb2YgYSBwcm9ncmFtLS10byBtYWtlIHN1cmUgaXQgcmVtYWlucyBmcmVlCitzb2Z0d2FyZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFdlLCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB1c2UgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9zdCBvZiBvdXIgc29mdHdhcmU7IGl0IGFwcGxpZXMgYWxzbyB0bworYW55IG90aGVyIHdvcmsgcmVsZWFzZWQgdGhpcyB3YXkgYnkgaXRzIGF1dGhvcnMuICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhlbSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdCBpZiB5b3UKK3dhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3CitmcmVlIHByb2dyYW1zLCBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIHByZXZlbnQgb3RoZXJzIGZyb20gZGVueWluZyB5b3UKK3RoZXNlIHJpZ2h0cyBvciBhc2tpbmcgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiAgVGhlcmVmb3JlLCB5b3UgaGF2ZQorY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmCit5b3UgbW9kaWZ5IGl0OiByZXNwb25zaWJpbGl0aWVzIHRvIHJlc3BlY3QgdGhlIGZyZWVkb20gb2Ygb3RoZXJzLgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IHBhc3Mgb24gdG8gdGhlIHJlY2lwaWVudHMgdGhlIHNhbWUKK2ZyZWVkb21zIHRoYXQgeW91IHJlY2VpdmVkLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlCitvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleQora25vdyB0aGVpciByaWdodHMuCisKKyAgRGV2ZWxvcGVycyB0aGF0IHVzZSB0aGUgR05VIEdQTCBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOgorKDEpIGFzc2VydCBjb3B5cmlnaHQgb24gdGhlIHNvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIExpY2Vuc2UKK2dpdmluZyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgaXQuCisKKyAgRm9yIHRoZSBkZXZlbG9wZXJzJyBhbmQgYXV0aG9ycycgcHJvdGVjdGlvbiwgdGhlIEdQTCBjbGVhcmx5IGV4cGxhaW5zCit0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUgc29mdHdhcmUuICBGb3IgYm90aCB1c2VycycgYW5kCithdXRob3JzJyBzYWtlLCB0aGUgR1BMIHJlcXVpcmVzIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgYmUgbWFya2VkIGFzCitjaGFuZ2VkLCBzbyB0aGF0IHRoZWlyIHByb2JsZW1zIHdpbGwgbm90IGJlIGF0dHJpYnV0ZWQgZXJyb25lb3VzbHkgdG8KK2F1dGhvcnMgb2YgcHJldmlvdXMgdmVyc2lvbnMuCisKKyAgU29tZSBkZXZpY2VzIGFyZSBkZXNpZ25lZCB0byBkZW55IHVzZXJzIGFjY2VzcyB0byBpbnN0YWxsIG9yIHJ1bgorbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIHNvZnR3YXJlIGluc2lkZSB0aGVtLCBhbHRob3VnaCB0aGUgbWFudWZhY3R1cmVyCitjYW4gZG8gc28uICBUaGlzIGlzIGZ1bmRhbWVudGFsbHkgaW5jb21wYXRpYmxlIHdpdGggdGhlIGFpbSBvZgorcHJvdGVjdGluZyB1c2VycycgZnJlZWRvbSB0byBjaGFuZ2UgdGhlIHNvZnR3YXJlLiAgVGhlIHN5c3RlbWF0aWMKK3BhdHRlcm4gb2Ygc3VjaCBhYnVzZSBvY2N1cnMgaW4gdGhlIGFyZWEgb2YgcHJvZHVjdHMgZm9yIGluZGl2aWR1YWxzIHRvCit1c2UsIHdoaWNoIGlzIHByZWNpc2VseSB3aGVyZSBpdCBpcyBtb3N0IHVuYWNjZXB0YWJsZS4gIFRoZXJlZm9yZSwgd2UKK2hhdmUgZGVzaWduZWQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBHUEwgdG8gcHJvaGliaXQgdGhlIHByYWN0aWNlIGZvciB0aG9zZQorcHJvZHVjdHMuICBJZiBzdWNoIHByb2JsZW1zIGFyaXNlIHN1YnN0YW50aWFsbHkgaW4gb3RoZXIgZG9tYWlucywgd2UKK3N0YW5kIHJlYWR5IHRvIGV4dGVuZCB0aGlzIHByb3Zpc2lvbiB0byB0aG9zZSBkb21haW5zIGluIGZ1dHVyZSB2ZXJzaW9ucworb2YgdGhlIEdQTCwgYXMgbmVlZGVkIHRvIHByb3RlY3QgdGhlIGZyZWVkb20gb2YgdXNlcnMuCisKKyAgRmluYWxseSwgZXZlcnkgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUgcGF0ZW50cy4KK1N0YXRlcyBzaG91bGQgbm90IGFsbG93IHBhdGVudHMgdG8gcmVzdHJpY3QgZGV2ZWxvcG1lbnQgYW5kIHVzZSBvZgorc29mdHdhcmUgb24gZ2VuZXJhbC1wdXJwb3NlIGNvbXB1dGVycywgYnV0IGluIHRob3NlIHRoYXQgZG8sIHdlIHdpc2ggdG8KK2F2b2lkIHRoZSBzcGVjaWFsIGRhbmdlciB0aGF0IHBhdGVudHMgYXBwbGllZCB0byBhIGZyZWUgcHJvZ3JhbSBjb3VsZAorbWFrZSBpdCBlZmZlY3RpdmVseSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgdGhlIEdQTCBhc3N1cmVzIHRoYXQKK3BhdGVudHMgY2Fubm90IGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBwcm9ncmFtIG5vbi1mcmVlLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorCisgICAgICAgICAgICAgICAgICAgICAgIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgMC4gRGVmaW5pdGlvbnMuCisKKyAgIlRoaXMgTGljZW5zZSIgcmVmZXJzIHRvIHZlcnNpb24gMyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgIkNvcHlyaWdodCIgYWxzbyBtZWFucyBjb3B5cmlnaHQtbGlrZSBsYXdzIHRoYXQgYXBwbHkgdG8gb3RoZXIga2luZHMgb2YKK3dvcmtzLCBzdWNoIGFzIHNlbWljb25kdWN0b3IgbWFza3MuCisKKyAgIlRoZSBQcm9ncmFtIiByZWZlcnMgdG8gYW55IGNvcHlyaWdodGFibGUgd29yayBsaWNlbnNlZCB1bmRlciB0aGlzCitMaWNlbnNlLiAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuICAiTGljZW5zZWVzIiBhbmQKKyJyZWNpcGllbnRzIiBtYXkgYmUgaW5kaXZpZHVhbHMgb3Igb3JnYW5pemF0aW9ucy4KKworICBUbyAibW9kaWZ5IiBhIHdvcmsgbWVhbnMgdG8gY29weSBmcm9tIG9yIGFkYXB0IGFsbCBvciBwYXJ0IG9mIHRoZSB3b3JrCitpbiBhIGZhc2hpb24gcmVxdWlyaW5nIGNvcHlyaWdodCBwZXJtaXNzaW9uLCBvdGhlciB0aGFuIHRoZSBtYWtpbmcgb2YgYW4KK2V4YWN0IGNvcHkuICBUaGUgcmVzdWx0aW5nIHdvcmsgaXMgY2FsbGVkIGEgIm1vZGlmaWVkIHZlcnNpb24iIG9mIHRoZQorZWFybGllciB3b3JrIG9yIGEgd29yayAiYmFzZWQgb24iIHRoZSBlYXJsaWVyIHdvcmsuCisKKyAgQSAiY292ZXJlZCB3b3JrIiBtZWFucyBlaXRoZXIgdGhlIHVubW9kaWZpZWQgUHJvZ3JhbSBvciBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLgorCisgIFRvICJwcm9wYWdhdGUiIGEgd29yayBtZWFucyB0byBkbyBhbnl0aGluZyB3aXRoIGl0IHRoYXQsIHdpdGhvdXQKK3Blcm1pc3Npb24sIHdvdWxkIG1ha2UgeW91IGRpcmVjdGx5IG9yIHNlY29uZGFyaWx5IGxpYWJsZSBmb3IKK2luZnJpbmdlbWVudCB1bmRlciBhcHBsaWNhYmxlIGNvcHlyaWdodCBsYXcsIGV4Y2VwdCBleGVjdXRpbmcgaXQgb24gYQorY29tcHV0ZXIgb3IgbW9kaWZ5aW5nIGEgcHJpdmF0ZSBjb3B5LiAgUHJvcGFnYXRpb24gaW5jbHVkZXMgY29weWluZywKK2Rpc3RyaWJ1dGlvbiAod2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiksIG1ha2luZyBhdmFpbGFibGUgdG8gdGhlCitwdWJsaWMsIGFuZCBpbiBzb21lIGNvdW50cmllcyBvdGhlciBhY3Rpdml0aWVzIGFzIHdlbGwuCisKKyAgVG8gImNvbnZleSIgYSB3b3JrIG1lYW5zIGFueSBraW5kIG9mIHByb3BhZ2F0aW9uIHRoYXQgZW5hYmxlcyBvdGhlcgorcGFydGllcyB0byBtYWtlIG9yIHJlY2VpdmUgY29waWVzLiAgTWVyZSBpbnRlcmFjdGlvbiB3aXRoIGEgdXNlciB0aHJvdWdoCithIGNvbXB1dGVyIG5ldHdvcmssIHdpdGggbm8gdHJhbnNmZXIgb2YgYSBjb3B5LCBpcyBub3QgY29udmV5aW5nLgorCisgIEFuIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlIGRpc3BsYXlzICJBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzIgordG8gdGhlIGV4dGVudCB0aGF0IGl0IGluY2x1ZGVzIGEgY29udmVuaWVudCBhbmQgcHJvbWluZW50bHkgdmlzaWJsZQorZmVhdHVyZSB0aGF0ICgxKSBkaXNwbGF5cyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlLCBhbmQgKDIpCit0ZWxscyB0aGUgdXNlciB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgd29yayAoZXhjZXB0IHRvIHRoZQorZXh0ZW50IHRoYXQgd2FycmFudGllcyBhcmUgcHJvdmlkZWQpLCB0aGF0IGxpY2Vuc2VlcyBtYXkgY29udmV5IHRoZQord29yayB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYKK3RoZSBpbnRlcmZhY2UgcHJlc2VudHMgYSBsaXN0IG9mIHVzZXIgY29tbWFuZHMgb3Igb3B0aW9ucywgc3VjaCBhcyBhCittZW51LCBhIHByb21pbmVudCBpdGVtIGluIHRoZSBsaXN0IG1lZXRzIHRoaXMgY3JpdGVyaW9uLgorCisgIDEuIFNvdXJjZSBDb2RlLgorCisgIFRoZSAic291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrCitmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICAiT2JqZWN0IGNvZGUiIG1lYW5zIGFueSBub24tc291cmNlCitmb3JtIG9mIGEgd29yay4KKworICBBICJTdGFuZGFyZCBJbnRlcmZhY2UiIG1lYW5zIGFuIGludGVyZmFjZSB0aGF0IGVpdGhlciBpcyBhbiBvZmZpY2lhbAorc3RhbmRhcmQgZGVmaW5lZCBieSBhIHJlY29nbml6ZWQgc3RhbmRhcmRzIGJvZHksIG9yLCBpbiB0aGUgY2FzZSBvZgoraW50ZXJmYWNlcyBzcGVjaWZpZWQgZm9yIGEgcGFydGljdWxhciBwcm9ncmFtbWluZyBsYW5ndWFnZSwgb25lIHRoYXQKK2lzIHdpZGVseSB1c2VkIGFtb25nIGRldmVsb3BlcnMgd29ya2luZyBpbiB0aGF0IGxhbmd1YWdlLgorCisgIFRoZSAiU3lzdGVtIExpYnJhcmllcyIgb2YgYW4gZXhlY3V0YWJsZSB3b3JrIGluY2x1ZGUgYW55dGhpbmcsIG90aGVyCit0aGFuIHRoZSB3b3JrIGFzIGEgd2hvbGUsIHRoYXQgKGEpIGlzIGluY2x1ZGVkIGluIHRoZSBub3JtYWwgZm9ybSBvZgorcGFja2FnaW5nIGEgTWFqb3IgQ29tcG9uZW50LCBidXQgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhhdCBNYWpvcgorQ29tcG9uZW50LCBhbmQgKGIpIHNlcnZlcyBvbmx5IHRvIGVuYWJsZSB1c2Ugb2YgdGhlIHdvcmsgd2l0aCB0aGF0CitNYWpvciBDb21wb25lbnQsIG9yIHRvIGltcGxlbWVudCBhIFN0YW5kYXJkIEludGVyZmFjZSBmb3Igd2hpY2ggYW4KK2ltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluIHNvdXJjZSBjb2RlIGZvcm0uICBBCisiTWFqb3IgQ29tcG9uZW50IiwgaW4gdGhpcyBjb250ZXh0LCBtZWFucyBhIG1ham9yIGVzc2VudGlhbCBjb21wb25lbnQKKyhrZXJuZWwsIHdpbmRvdyBzeXN0ZW0sIGFuZCBzbyBvbikgb2YgdGhlIHNwZWNpZmljIG9wZXJhdGluZyBzeXN0ZW0KKyhpZiBhbnkpIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHdvcmsgcnVucywgb3IgYSBjb21waWxlciB1c2VkIHRvCitwcm9kdWNlIHRoZSB3b3JrLCBvciBhbiBvYmplY3QgY29kZSBpbnRlcnByZXRlciB1c2VkIHRvIHJ1biBpdC4KKworICBUaGUgIkNvcnJlc3BvbmRpbmcgU291cmNlIiBmb3IgYSB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gbWVhbnMgYWxsCit0aGUgc291cmNlIGNvZGUgbmVlZGVkIHRvIGdlbmVyYXRlLCBpbnN0YWxsLCBhbmQgKGZvciBhbiBleGVjdXRhYmxlCit3b3JrKSBydW4gdGhlIG9iamVjdCBjb2RlIGFuZCB0byBtb2RpZnkgdGhlIHdvcmssIGluY2x1ZGluZyBzY3JpcHRzIHRvCitjb250cm9sIHRob3NlIGFjdGl2aXRpZXMuICBIb3dldmVyLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB3b3JrJ3MKK1N5c3RlbSBMaWJyYXJpZXMsIG9yIGdlbmVyYWwtcHVycG9zZSB0b29scyBvciBnZW5lcmFsbHkgYXZhaWxhYmxlIGZyZWUKK3Byb2dyYW1zIHdoaWNoIGFyZSB1c2VkIHVubW9kaWZpZWQgaW4gcGVyZm9ybWluZyB0aG9zZSBhY3Rpdml0aWVzIGJ1dAord2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSB3b3JrLiAgRm9yIGV4YW1wbGUsIENvcnJlc3BvbmRpbmcgU291cmNlCitpbmNsdWRlcyBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcyBhc3NvY2lhdGVkIHdpdGggc291cmNlIGZpbGVzIGZvcgordGhlIHdvcmssIGFuZCB0aGUgc291cmNlIGNvZGUgZm9yIHNoYXJlZCBsaWJyYXJpZXMgYW5kIGR5bmFtaWNhbGx5CitsaW5rZWQgc3VicHJvZ3JhbXMgdGhhdCB0aGUgd29yayBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gcmVxdWlyZSwKK3N1Y2ggYXMgYnkgaW50aW1hdGUgZGF0YSBjb21tdW5pY2F0aW9uIG9yIGNvbnRyb2wgZmxvdyBiZXR3ZWVuIHRob3NlCitzdWJwcm9ncmFtcyBhbmQgb3RoZXIgcGFydHMgb2YgdGhlIHdvcmsuCisKKyAgVGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCB1c2VycworY2FuIHJlZ2VuZXJhdGUgYXV0b21hdGljYWxseSBmcm9tIG90aGVyIHBhcnRzIG9mIHRoZSBDb3JyZXNwb25kaW5nCitTb3VyY2UuCisKKyAgVGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhIHdvcmsgaW4gc291cmNlIGNvZGUgZm9ybSBpcyB0aGF0CitzYW1lIHdvcmsuCisKKyAgMi4gQmFzaWMgUGVybWlzc2lvbnMuCisKKyAgQWxsIHJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSBhcmUgZ3JhbnRlZCBmb3IgdGhlIHRlcm0gb2YKK2NvcHlyaWdodCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGFyZSBpcnJldm9jYWJsZSBwcm92aWRlZCB0aGUgc3RhdGVkCitjb25kaXRpb25zIGFyZSBtZXQuICBUaGlzIExpY2Vuc2UgZXhwbGljaXRseSBhZmZpcm1zIHlvdXIgdW5saW1pdGVkCitwZXJtaXNzaW9uIHRvIHJ1biB0aGUgdW5tb2RpZmllZCBQcm9ncmFtLiAgVGhlIG91dHB1dCBmcm9tIHJ1bm5pbmcgYQorY292ZXJlZCB3b3JrIGlzIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlIG9ubHkgaWYgdGhlIG91dHB1dCwgZ2l2ZW4gaXRzCitjb250ZW50LCBjb25zdGl0dXRlcyBhIGNvdmVyZWQgd29yay4gIFRoaXMgTGljZW5zZSBhY2tub3dsZWRnZXMgeW91cgorcmlnaHRzIG9mIGZhaXIgdXNlIG9yIG90aGVyIGVxdWl2YWxlbnQsIGFzIHByb3ZpZGVkIGJ5IGNvcHlyaWdodCBsYXcuCisKKyAgWW91IG1heSBtYWtlLCBydW4gYW5kIHByb3BhZ2F0ZSBjb3ZlcmVkIHdvcmtzIHRoYXQgeW91IGRvIG5vdAorY29udmV5LCB3aXRob3V0IGNvbmRpdGlvbnMgc28gbG9uZyBhcyB5b3VyIGxpY2Vuc2Ugb3RoZXJ3aXNlIHJlbWFpbnMKK2luIGZvcmNlLiAgWW91IG1heSBjb252ZXkgY292ZXJlZCB3b3JrcyB0byBvdGhlcnMgZm9yIHRoZSBzb2xlIHB1cnBvc2UKK29mIGhhdmluZyB0aGVtIG1ha2UgbW9kaWZpY2F0aW9ucyBleGNsdXNpdmVseSBmb3IgeW91LCBvciBwcm92aWRlIHlvdQord2l0aCBmYWNpbGl0aWVzIGZvciBydW5uaW5nIHRob3NlIHdvcmtzLCBwcm92aWRlZCB0aGF0IHlvdSBjb21wbHkgd2l0aAordGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBpbiBjb252ZXlpbmcgYWxsIG1hdGVyaWFsIGZvciB3aGljaCB5b3UgZG8KK25vdCBjb250cm9sIGNvcHlyaWdodC4gIFRob3NlIHRodXMgbWFraW5nIG9yIHJ1bm5pbmcgdGhlIGNvdmVyZWQgd29ya3MKK2ZvciB5b3UgbXVzdCBkbyBzbyBleGNsdXNpdmVseSBvbiB5b3VyIGJlaGFsZiwgdW5kZXIgeW91ciBkaXJlY3Rpb24KK2FuZCBjb250cm9sLCBvbiB0ZXJtcyB0aGF0IHByb2hpYml0IHRoZW0gZnJvbSBtYWtpbmcgYW55IGNvcGllcyBvZgoreW91ciBjb3B5cmlnaHRlZCBtYXRlcmlhbCBvdXRzaWRlIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHlvdS4KKworICBDb252ZXlpbmcgdW5kZXIgYW55IG90aGVyIGNpcmN1bXN0YW5jZXMgaXMgcGVybWl0dGVkIHNvbGVseSB1bmRlcgordGhlIGNvbmRpdGlvbnMgc3RhdGVkIGJlbG93LiAgU3VibGljZW5zaW5nIGlzIG5vdCBhbGxvd2VkOyBzZWN0aW9uIDEwCittYWtlcyBpdCB1bm5lY2Vzc2FyeS4KKworICAzLiBQcm90ZWN0aW5nIFVzZXJzJyBMZWdhbCBSaWdodHMgRnJvbSBBbnRpLUNpcmN1bXZlbnRpb24gTGF3LgorCisgIE5vIGNvdmVyZWQgd29yayBzaGFsbCBiZSBkZWVtZWQgcGFydCBvZiBhbiBlZmZlY3RpdmUgdGVjaG5vbG9naWNhbAorbWVhc3VyZSB1bmRlciBhbnkgYXBwbGljYWJsZSBsYXcgZnVsZmlsbGluZyBvYmxpZ2F0aW9ucyB1bmRlciBhcnRpY2xlCisxMSBvZiB0aGUgV0lQTyBjb3B5cmlnaHQgdHJlYXR5IGFkb3B0ZWQgb24gMjAgRGVjZW1iZXIgMTk5Niwgb3IKK3NpbWlsYXIgbGF3cyBwcm9oaWJpdGluZyBvciByZXN0cmljdGluZyBjaXJjdW12ZW50aW9uIG9mIHN1Y2gKK21lYXN1cmVzLgorCisgIFdoZW4geW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgeW91IHdhaXZlIGFueSBsZWdhbCBwb3dlciB0byBmb3JiaWQKK2NpcmN1bXZlbnRpb24gb2YgdGVjaG5vbG9naWNhbCBtZWFzdXJlcyB0byB0aGUgZXh0ZW50IHN1Y2ggY2lyY3VtdmVudGlvbgoraXMgZWZmZWN0ZWQgYnkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIHdpdGggcmVzcGVjdCB0bwordGhlIGNvdmVyZWQgd29yaywgYW5kIHlvdSBkaXNjbGFpbSBhbnkgaW50ZW50aW9uIHRvIGxpbWl0IG9wZXJhdGlvbiBvcgorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGFzIGEgbWVhbnMgb2YgZW5mb3JjaW5nLCBhZ2FpbnN0IHRoZSB3b3JrJ3MKK3VzZXJzLCB5b3VyIG9yIHRoaXJkIHBhcnRpZXMnIGxlZ2FsIHJpZ2h0cyB0byBmb3JiaWQgY2lyY3VtdmVudGlvbiBvZgordGVjaG5vbG9naWNhbCBtZWFzdXJlcy4KKworICA0LiBDb252ZXlpbmcgVmVyYmF0aW0gQ29waWVzLgorCisgIFlvdSBtYXkgY29udmV5IHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZSBjb2RlIGFzIHlvdQorcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQKK2FwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZTsKK2tlZXAgaW50YWN0IGFsbCBub3RpY2VzIHN0YXRpbmcgdGhhdCB0aGlzIExpY2Vuc2UgYW5kIGFueQorbm9uLXBlcm1pc3NpdmUgdGVybXMgYWRkZWQgaW4gYWNjb3JkIHdpdGggc2VjdGlvbiA3IGFwcGx5IHRvIHRoZSBjb2RlOwora2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgb2YgdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbGwKK3JlY2lwaWVudHMgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCisgIFlvdSBtYXkgY2hhcmdlIGFueSBwcmljZSBvciBubyBwcmljZSBmb3IgZWFjaCBjb3B5IHRoYXQgeW91IGNvbnZleSwKK2FuZCB5b3UgbWF5IG9mZmVyIHN1cHBvcnQgb3Igd2FycmFudHkgcHJvdGVjdGlvbiBmb3IgYSBmZWUuCisKKyAgNS4gQ29udmV5aW5nIE1vZGlmaWVkIFNvdXJjZSBWZXJzaW9ucy4KKworICBZb3UgbWF5IGNvbnZleSBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIG9yIHRoZSBtb2RpZmljYXRpb25zIHRvCitwcm9kdWNlIGl0IGZyb20gdGhlIFByb2dyYW0sIGluIHRoZSBmb3JtIG9mIHNvdXJjZSBjb2RlIHVuZGVyIHRoZQordGVybXMgb2Ygc2VjdGlvbiA0LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgd29yayBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgbW9kaWZpZWQKKyAgICBpdCwgYW5kIGdpdmluZyBhIHJlbGV2YW50IGRhdGUuCisKKyAgICBiKSBUaGUgd29yayBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCBpdCBpcworICAgIHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IGNvbmRpdGlvbnMgYWRkZWQgdW5kZXIgc2VjdGlvbgorICAgIDcuICBUaGlzIHJlcXVpcmVtZW50IG1vZGlmaWVzIHRoZSByZXF1aXJlbWVudCBpbiBzZWN0aW9uIDQgdG8KKyAgICAia2VlcCBpbnRhY3QgYWxsIG5vdGljZXMiLgorCisgICAgYykgWW91IG11c3QgbGljZW5zZSB0aGUgZW50aXJlIHdvcmssIGFzIGEgd2hvbGUsIHVuZGVyIHRoaXMKKyAgICBMaWNlbnNlIHRvIGFueW9uZSB3aG8gY29tZXMgaW50byBwb3NzZXNzaW9uIG9mIGEgY29weS4gIFRoaXMKKyAgICBMaWNlbnNlIHdpbGwgdGhlcmVmb3JlIGFwcGx5LCBhbG9uZyB3aXRoIGFueSBhcHBsaWNhYmxlIHNlY3Rpb24gNworICAgIGFkZGl0aW9uYWwgdGVybXMsIHRvIHRoZSB3aG9sZSBvZiB0aGUgd29yaywgYW5kIGFsbCBpdHMgcGFydHMsCisgICAgcmVnYXJkbGVzcyBvZiBob3cgdGhleSBhcmUgcGFja2FnZWQuICBUaGlzIExpY2Vuc2UgZ2l2ZXMgbm8KKyAgICBwZXJtaXNzaW9uIHRvIGxpY2Vuc2UgdGhlIHdvcmsgaW4gYW55IG90aGVyIHdheSwgYnV0IGl0IGRvZXMgbm90CisgICAgaW52YWxpZGF0ZSBzdWNoIHBlcm1pc3Npb24gaWYgeW91IGhhdmUgc2VwYXJhdGVseSByZWNlaXZlZCBpdC4KKworICAgIGQpIElmIHRoZSB3b3JrIGhhcyBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZXMsIGVhY2ggbXVzdCBkaXNwbGF5CisgICAgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlczsgaG93ZXZlciwgaWYgdGhlIFByb2dyYW0gaGFzIGludGVyYWN0aXZlCisgICAgaW50ZXJmYWNlcyB0aGF0IGRvIG5vdCBkaXNwbGF5IEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMsIHlvdXIKKyAgICB3b3JrIG5lZWQgbm90IG1ha2UgdGhlbSBkbyBzby4KKworICBBIGNvbXBpbGF0aW9uIG9mIGEgY292ZXJlZCB3b3JrIHdpdGggb3RoZXIgc2VwYXJhdGUgYW5kIGluZGVwZW5kZW50Cit3b3Jrcywgd2hpY2ggYXJlIG5vdCBieSB0aGVpciBuYXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgY292ZXJlZCB3b3JrLAorYW5kIHdoaWNoIGFyZSBub3QgY29tYmluZWQgd2l0aCBpdCBzdWNoIGFzIHRvIGZvcm0gYSBsYXJnZXIgcHJvZ3JhbSwKK2luIG9yIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtLCBpcyBjYWxsZWQgYW4KKyJhZ2dyZWdhdGUiIGlmIHRoZSBjb21waWxhdGlvbiBhbmQgaXRzIHJlc3VsdGluZyBjb3B5cmlnaHQgYXJlIG5vdAordXNlZCB0byBsaW1pdCB0aGUgYWNjZXNzIG9yIGxlZ2FsIHJpZ2h0cyBvZiB0aGUgY29tcGlsYXRpb24ncyB1c2VycworYmV5b25kIHdoYXQgdGhlIGluZGl2aWR1YWwgd29ya3MgcGVybWl0LiAgSW5jbHVzaW9uIG9mIGEgY292ZXJlZCB3b3JrCitpbiBhbiBhZ2dyZWdhdGUgZG9lcyBub3QgY2F1c2UgdGhpcyBMaWNlbnNlIHRvIGFwcGx5IHRvIHRoZSBvdGhlcgorcGFydHMgb2YgdGhlIGFnZ3JlZ2F0ZS4KKworICA2LiBDb252ZXlpbmcgTm9uLVNvdXJjZSBGb3Jtcy4KKworICBZb3UgbWF5IGNvbnZleSBhIGNvdmVyZWQgd29yayBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcworb2Ygc2VjdGlvbnMgNCBhbmQgNSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBjb252ZXkgdGhlCittYWNoaW5lLXJlYWRhYmxlIENvcnJlc3BvbmRpbmcgU291cmNlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsCitpbiBvbmUgb2YgdGhlc2Ugd2F5czoKKworICAgIGEpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QKKyAgICAoaW5jbHVkaW5nIGEgcGh5c2ljYWwgZGlzdHJpYnV0aW9uIG1lZGl1bSksIGFjY29tcGFuaWVkIGJ5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZpeGVkIG9uIGEgZHVyYWJsZSBwaHlzaWNhbCBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICAgIGIpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QKKyAgICAoaW5jbHVkaW5nIGEgcGh5c2ljYWwgZGlzdHJpYnV0aW9uIG1lZGl1bSksIGFjY29tcGFuaWVkIGJ5IGEKKyAgICB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUgeWVhcnMgYW5kIHZhbGlkIGZvciBhcworICAgIGxvbmcgYXMgeW91IG9mZmVyIHNwYXJlIHBhcnRzIG9yIGN1c3RvbWVyIHN1cHBvcnQgZm9yIHRoYXQgcHJvZHVjdAorICAgIG1vZGVsLCB0byBnaXZlIGFueW9uZSB3aG8gcG9zc2Vzc2VzIHRoZSBvYmplY3QgY29kZSBlaXRoZXIgKDEpIGEKKyAgICBjb3B5IG9mIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYWxsIHRoZSBzb2Z0d2FyZSBpbiB0aGUKKyAgICBwcm9kdWN0IHRoYXQgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIG9uIGEgZHVyYWJsZSBwaHlzaWNhbAorICAgIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZSwgZm9yIGEgcHJpY2Ugbm8KKyAgICBtb3JlIHRoYW4geW91ciByZWFzb25hYmxlIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHRoaXMKKyAgICBjb252ZXlpbmcgb2Ygc291cmNlLCBvciAoMikgYWNjZXNzIHRvIGNvcHkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgZnJvbSBhIG5ldHdvcmsgc2VydmVyIGF0IG5vIGNoYXJnZS4KKworICAgIGMpIENvbnZleSBpbmRpdmlkdWFsIGNvcGllcyBvZiB0aGUgb2JqZWN0IGNvZGUgd2l0aCBhIGNvcHkgb2YgdGhlCisgICAgd3JpdHRlbiBvZmZlciB0byBwcm92aWRlIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoaXMKKyAgICBhbHRlcm5hdGl2ZSBpcyBhbGxvd2VkIG9ubHkgb2NjYXNpb25hbGx5IGFuZCBub25jb21tZXJjaWFsbHksIGFuZAorICAgIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBvYmplY3QgY29kZSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZAorICAgIHdpdGggc3Vic2VjdGlvbiA2Yi4KKworICAgIGQpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIGZyb20gYSBkZXNpZ25hdGVkCisgICAgcGxhY2UgKGdyYXRpcyBvciBmb3IgYSBjaGFyZ2UpLCBhbmQgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgaW4gdGhlIHNhbWUgd2F5IHRocm91Z2ggdGhlIHNhbWUgcGxhY2UgYXQgbm8KKyAgICBmdXJ0aGVyIGNoYXJnZS4gIFlvdSBuZWVkIG5vdCByZXF1aXJlIHJlY2lwaWVudHMgdG8gY29weSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4gIElmIHRoZSBwbGFjZSB0bworICAgIGNvcHkgdGhlIG9iamVjdCBjb2RlIGlzIGEgbmV0d29yayBzZXJ2ZXIsIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZQorICAgIG1heSBiZSBvbiBhIGRpZmZlcmVudCBzZXJ2ZXIgKG9wZXJhdGVkIGJ5IHlvdSBvciBhIHRoaXJkIHBhcnR5KQorICAgIHRoYXQgc3VwcG9ydHMgZXF1aXZhbGVudCBjb3B5aW5nIGZhY2lsaXRpZXMsIHByb3ZpZGVkIHlvdSBtYWludGFpbgorICAgIGNsZWFyIGRpcmVjdGlvbnMgbmV4dCB0byB0aGUgb2JqZWN0IGNvZGUgc2F5aW5nIHdoZXJlIHRvIGZpbmQgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBSZWdhcmRsZXNzIG9mIHdoYXQgc2VydmVyIGhvc3RzIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlLCB5b3UgcmVtYWluIG9ibGlnYXRlZCB0byBlbnN1cmUgdGhhdCBpdCBpcworICAgIGF2YWlsYWJsZSBmb3IgYXMgbG9uZyBhcyBuZWVkZWQgdG8gc2F0aXNmeSB0aGVzZSByZXF1aXJlbWVudHMuCisKKyAgICBlKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIHVzaW5nIHBlZXItdG8tcGVlciB0cmFuc21pc3Npb24sIHByb3ZpZGVkCisgICAgeW91IGluZm9ybSBvdGhlciBwZWVycyB3aGVyZSB0aGUgb2JqZWN0IGNvZGUgYW5kIENvcnJlc3BvbmRpbmcKKyAgICBTb3VyY2Ugb2YgdGhlIHdvcmsgYXJlIGJlaW5nIG9mZmVyZWQgdG8gdGhlIGdlbmVyYWwgcHVibGljIGF0IG5vCisgICAgY2hhcmdlIHVuZGVyIHN1YnNlY3Rpb24gNmQuCisKKyAgQSBzZXBhcmFibGUgcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGNvZGUsIHdob3NlIHNvdXJjZSBjb2RlIGlzIGV4Y2x1ZGVkCitmcm9tIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBhcyBhIFN5c3RlbSBMaWJyYXJ5LCBuZWVkIG5vdCBiZQoraW5jbHVkZWQgaW4gY29udmV5aW5nIHRoZSBvYmplY3QgY29kZSB3b3JrLgorCisgIEEgIlVzZXIgUHJvZHVjdCIgaXMgZWl0aGVyICgxKSBhICJjb25zdW1lciBwcm9kdWN0Iiwgd2hpY2ggbWVhbnMgYW55Cit0YW5naWJsZSBwZXJzb25hbCBwcm9wZXJ0eSB3aGljaCBpcyBub3JtYWxseSB1c2VkIGZvciBwZXJzb25hbCwgZmFtaWx5LAorb3IgaG91c2Vob2xkIHB1cnBvc2VzLCBvciAoMikgYW55dGhpbmcgZGVzaWduZWQgb3Igc29sZCBmb3IgaW5jb3Jwb3JhdGlvbgoraW50byBhIGR3ZWxsaW5nLiAgSW4gZGV0ZXJtaW5pbmcgd2hldGhlciBhIHByb2R1Y3QgaXMgYSBjb25zdW1lciBwcm9kdWN0LAorZG91YnRmdWwgY2FzZXMgc2hhbGwgYmUgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgY292ZXJhZ2UuICBGb3IgYSBwYXJ0aWN1bGFyCitwcm9kdWN0IHJlY2VpdmVkIGJ5IGEgcGFydGljdWxhciB1c2VyLCAibm9ybWFsbHkgdXNlZCIgcmVmZXJzIHRvIGEKK3R5cGljYWwgb3IgY29tbW9uIHVzZSBvZiB0aGF0IGNsYXNzIG9mIHByb2R1Y3QsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXR1cworb2YgdGhlIHBhcnRpY3VsYXIgdXNlciBvciBvZiB0aGUgd2F5IGluIHdoaWNoIHRoZSBwYXJ0aWN1bGFyIHVzZXIKK2FjdHVhbGx5IHVzZXMsIG9yIGV4cGVjdHMgb3IgaXMgZXhwZWN0ZWQgdG8gdXNlLCB0aGUgcHJvZHVjdC4gIEEgcHJvZHVjdAoraXMgYSBjb25zdW1lciBwcm9kdWN0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcHJvZHVjdCBoYXMgc3Vic3RhbnRpYWwKK2NvbW1lcmNpYWwsIGluZHVzdHJpYWwgb3Igbm9uLWNvbnN1bWVyIHVzZXMsIHVubGVzcyBzdWNoIHVzZXMgcmVwcmVzZW50Cit0aGUgb25seSBzaWduaWZpY2FudCBtb2RlIG9mIHVzZSBvZiB0aGUgcHJvZHVjdC4KKworICAiSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIiBmb3IgYSBVc2VyIFByb2R1Y3QgbWVhbnMgYW55IG1ldGhvZHMsCitwcm9jZWR1cmVzLCBhdXRob3JpemF0aW9uIGtleXMsIG9yIG90aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGluc3RhbGwKK2FuZCBleGVjdXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIGEgY292ZXJlZCB3b3JrIGluIHRoYXQgVXNlciBQcm9kdWN0IGZyb20KK2EgbW9kaWZpZWQgdmVyc2lvbiBvZiBpdHMgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBUaGUgaW5mb3JtYXRpb24gbXVzdAorc3VmZmljZSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGludWVkIGZ1bmN0aW9uaW5nIG9mIHRoZSBtb2RpZmllZCBvYmplY3QKK2NvZGUgaXMgaW4gbm8gY2FzZSBwcmV2ZW50ZWQgb3IgaW50ZXJmZXJlZCB3aXRoIHNvbGVseSBiZWNhdXNlCittb2RpZmljYXRpb24gaGFzIGJlZW4gbWFkZS4KKworICBJZiB5b3UgY29udmV5IGFuIG9iamVjdCBjb2RlIHdvcmsgdW5kZXIgdGhpcyBzZWN0aW9uIGluLCBvciB3aXRoLCBvcgorc3BlY2lmaWNhbGx5IGZvciB1c2UgaW4sIGEgVXNlciBQcm9kdWN0LCBhbmQgdGhlIGNvbnZleWluZyBvY2N1cnMgYXMKK3BhcnQgb2YgYSB0cmFuc2FjdGlvbiBpbiB3aGljaCB0aGUgcmlnaHQgb2YgcG9zc2Vzc2lvbiBhbmQgdXNlIG9mIHRoZQorVXNlciBQcm9kdWN0IGlzIHRyYW5zZmVycmVkIHRvIHRoZSByZWNpcGllbnQgaW4gcGVycGV0dWl0eSBvciBmb3IgYQorZml4ZWQgdGVybSAocmVnYXJkbGVzcyBvZiBob3cgdGhlIHRyYW5zYWN0aW9uIGlzIGNoYXJhY3Rlcml6ZWQpLCB0aGUKK0NvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkIHVuZGVyIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGFjY29tcGFuaWVkCitieSB0aGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uLiAgQnV0IHRoaXMgcmVxdWlyZW1lbnQgZG9lcyBub3QgYXBwbHkKK2lmIG5laXRoZXIgeW91IG5vciBhbnkgdGhpcmQgcGFydHkgcmV0YWlucyB0aGUgYWJpbGl0eSB0byBpbnN0YWxsCittb2RpZmllZCBvYmplY3QgY29kZSBvbiB0aGUgVXNlciBQcm9kdWN0IChmb3IgZXhhbXBsZSwgdGhlIHdvcmsgaGFzCitiZWVuIGluc3RhbGxlZCBpbiBST00pLgorCisgIFRoZSByZXF1aXJlbWVudCB0byBwcm92aWRlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBkb2VzIG5vdCBpbmNsdWRlIGEKK3JlcXVpcmVtZW50IHRvIGNvbnRpbnVlIHRvIHByb3ZpZGUgc3VwcG9ydCBzZXJ2aWNlLCB3YXJyYW50eSwgb3IgdXBkYXRlcworZm9yIGEgd29yayB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGluc3RhbGxlZCBieSB0aGUgcmVjaXBpZW50LCBvciBmb3IKK3RoZSBVc2VyIFByb2R1Y3QgaW4gd2hpY2ggaXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkLiAgQWNjZXNzIHRvIGEKK25ldHdvcmsgbWF5IGJlIGRlbmllZCB3aGVuIHRoZSBtb2RpZmljYXRpb24gaXRzZWxmIG1hdGVyaWFsbHkgYW5kCithZHZlcnNlbHkgYWZmZWN0cyB0aGUgb3BlcmF0aW9uIG9mIHRoZSBuZXR3b3JrIG9yIHZpb2xhdGVzIHRoZSBydWxlcyBhbmQKK3Byb3RvY29scyBmb3IgY29tbXVuaWNhdGlvbiBhY3Jvc3MgdGhlIG5ldHdvcmsuCisKKyAgQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQsIGFuZCBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gcHJvdmlkZWQsCitpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24gbXVzdCBiZSBpbiBhIGZvcm1hdCB0aGF0IGlzIHB1YmxpY2x5Citkb2N1bWVudGVkIChhbmQgd2l0aCBhbiBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbgorc291cmNlIGNvZGUgZm9ybSksIGFuZCBtdXN0IHJlcXVpcmUgbm8gc3BlY2lhbCBwYXNzd29yZCBvciBrZXkgZm9yCit1bnBhY2tpbmcsIHJlYWRpbmcgb3IgY29weWluZy4KKworICA3LiBBZGRpdGlvbmFsIFRlcm1zLgorCisgICJBZGRpdGlvbmFsIHBlcm1pc3Npb25zIiBhcmUgdGVybXMgdGhhdCBzdXBwbGVtZW50IHRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlIGJ5IG1ha2luZyBleGNlcHRpb25zIGZyb20gb25lIG9yIG1vcmUgb2YgaXRzIGNvbmRpdGlvbnMuCitBZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVudGlyZSBQcm9ncmFtIHNoYWxsCitiZSB0cmVhdGVkIGFzIHRob3VnaCB0aGV5IHdlcmUgaW5jbHVkZWQgaW4gdGhpcyBMaWNlbnNlLCB0byB0aGUgZXh0ZW50Cit0aGF0IHRoZXkgYXJlIHZhbGlkIHVuZGVyIGFwcGxpY2FibGUgbGF3LiAgSWYgYWRkaXRpb25hbCBwZXJtaXNzaW9ucworYXBwbHkgb25seSB0byBwYXJ0IG9mIHRoZSBQcm9ncmFtLCB0aGF0IHBhcnQgbWF5IGJlIHVzZWQgc2VwYXJhdGVseQordW5kZXIgdGhvc2UgcGVybWlzc2lvbnMsIGJ1dCB0aGUgZW50aXJlIFByb2dyYW0gcmVtYWlucyBnb3Zlcm5lZCBieQordGhpcyBMaWNlbnNlIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorCisgIFdoZW4geW91IGNvbnZleSBhIGNvcHkgb2YgYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgYXQgeW91ciBvcHRpb24KK3JlbW92ZSBhbnkgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBmcm9tIHRoYXQgY29weSwgb3IgZnJvbSBhbnkgcGFydCBvZgoraXQuICAoQWRkaXRpb25hbCBwZXJtaXNzaW9ucyBtYXkgYmUgd3JpdHRlbiB0byByZXF1aXJlIHRoZWlyIG93bgorcmVtb3ZhbCBpbiBjZXJ0YWluIGNhc2VzIHdoZW4geW91IG1vZGlmeSB0aGUgd29yay4pICBZb3UgbWF5IHBsYWNlCithZGRpdGlvbmFsIHBlcm1pc3Npb25zIG9uIG1hdGVyaWFsLCBhZGRlZCBieSB5b3UgdG8gYSBjb3ZlcmVkIHdvcmssCitmb3Igd2hpY2ggeW91IGhhdmUgb3IgY2FuIGdpdmUgYXBwcm9wcmlhdGUgY29weXJpZ2h0IHBlcm1pc3Npb24uCisKKyAgTm90d2l0aHN0YW5kaW5nIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLCBmb3IgbWF0ZXJpYWwgeW91CithZGQgdG8gYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgKGlmIGF1dGhvcml6ZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mCit0aGF0IG1hdGVyaWFsKSBzdXBwbGVtZW50IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugd2l0aCB0ZXJtczoKKworICAgIGEpIERpc2NsYWltaW5nIHdhcnJhbnR5IG9yIGxpbWl0aW5nIGxpYWJpbGl0eSBkaWZmZXJlbnRseSBmcm9tIHRoZQorICAgIHRlcm1zIG9mIHNlY3Rpb25zIDE1IGFuZCAxNiBvZiB0aGlzIExpY2Vuc2U7IG9yCisKKyAgICBiKSBSZXF1aXJpbmcgcHJlc2VydmF0aW9uIG9mIHNwZWNpZmllZCByZWFzb25hYmxlIGxlZ2FsIG5vdGljZXMgb3IKKyAgICBhdXRob3IgYXR0cmlidXRpb25zIGluIHRoYXQgbWF0ZXJpYWwgb3IgaW4gdGhlIEFwcHJvcHJpYXRlIExlZ2FsCisgICAgTm90aWNlcyBkaXNwbGF5ZWQgYnkgd29ya3MgY29udGFpbmluZyBpdDsgb3IKKworICAgIGMpIFByb2hpYml0aW5nIG1pc3JlcHJlc2VudGF0aW9uIG9mIHRoZSBvcmlnaW4gb2YgdGhhdCBtYXRlcmlhbCwgb3IKKyAgICByZXF1aXJpbmcgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIG1hdGVyaWFsIGJlIG1hcmtlZCBpbgorICAgIHJlYXNvbmFibGUgd2F5cyBhcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgdmVyc2lvbjsgb3IKKworICAgIGQpIExpbWl0aW5nIHRoZSB1c2UgZm9yIHB1YmxpY2l0eSBwdXJwb3NlcyBvZiBuYW1lcyBvZiBsaWNlbnNvcnMgb3IKKyAgICBhdXRob3JzIG9mIHRoZSBtYXRlcmlhbDsgb3IKKworICAgIGUpIERlY2xpbmluZyB0byBncmFudCByaWdodHMgdW5kZXIgdHJhZGVtYXJrIGxhdyBmb3IgdXNlIG9mIHNvbWUKKyAgICB0cmFkZSBuYW1lcywgdHJhZGVtYXJrcywgb3Igc2VydmljZSBtYXJrczsgb3IKKworICAgIGYpIFJlcXVpcmluZyBpbmRlbW5pZmljYXRpb24gb2YgbGljZW5zb3JzIGFuZCBhdXRob3JzIG9mIHRoYXQKKyAgICBtYXRlcmlhbCBieSBhbnlvbmUgd2hvIGNvbnZleXMgdGhlIG1hdGVyaWFsIChvciBtb2RpZmllZCB2ZXJzaW9ucyBvZgorICAgIGl0KSB3aXRoIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIG9mIGxpYWJpbGl0eSB0byB0aGUgcmVjaXBpZW50LCBmb3IKKyAgICBhbnkgbGlhYmlsaXR5IHRoYXQgdGhlc2UgY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgZGlyZWN0bHkgaW1wb3NlIG9uCisgICAgdGhvc2UgbGljZW5zb3JzIGFuZCBhdXRob3JzLgorCisgIEFsbCBvdGhlciBub24tcGVybWlzc2l2ZSBhZGRpdGlvbmFsIHRlcm1zIGFyZSBjb25zaWRlcmVkICJmdXJ0aGVyCityZXN0cmljdGlvbnMiIHdpdGhpbiB0aGUgbWVhbmluZyBvZiBzZWN0aW9uIDEwLiAgSWYgdGhlIFByb2dyYW0gYXMgeW91CityZWNlaXZlZCBpdCwgb3IgYW55IHBhcnQgb2YgaXQsIGNvbnRhaW5zIGEgbm90aWNlIHN0YXRpbmcgdGhhdCBpdCBpcworZ292ZXJuZWQgYnkgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggYSB0ZXJtIHRoYXQgaXMgYSBmdXJ0aGVyCityZXN0cmljdGlvbiwgeW91IG1heSByZW1vdmUgdGhhdCB0ZXJtLiAgSWYgYSBsaWNlbnNlIGRvY3VtZW50IGNvbnRhaW5zCithIGZ1cnRoZXIgcmVzdHJpY3Rpb24gYnV0IHBlcm1pdHMgcmVsaWNlbnNpbmcgb3IgY29udmV5aW5nIHVuZGVyIHRoaXMKK0xpY2Vuc2UsIHlvdSBtYXkgYWRkIHRvIGEgY292ZXJlZCB3b3JrIG1hdGVyaWFsIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcworb2YgdGhhdCBsaWNlbnNlIGRvY3VtZW50LCBwcm92aWRlZCB0aGF0IHRoZSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGRvZXMKK25vdCBzdXJ2aXZlIHN1Y2ggcmVsaWNlbnNpbmcgb3IgY29udmV5aW5nLgorCisgIElmIHlvdSBhZGQgdGVybXMgdG8gYSBjb3ZlcmVkIHdvcmsgaW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uLCB5b3UKK211c3QgcGxhY2UsIGluIHRoZSByZWxldmFudCBzb3VyY2UgZmlsZXMsIGEgc3RhdGVtZW50IG9mIHRoZQorYWRkaXRpb25hbCB0ZXJtcyB0aGF0IGFwcGx5IHRvIHRob3NlIGZpbGVzLCBvciBhIG5vdGljZSBpbmRpY2F0aW5nCit3aGVyZSB0byBmaW5kIHRoZSBhcHBsaWNhYmxlIHRlcm1zLgorCisgIEFkZGl0aW9uYWwgdGVybXMsIHBlcm1pc3NpdmUgb3Igbm9uLXBlcm1pc3NpdmUsIG1heSBiZSBzdGF0ZWQgaW4gdGhlCitmb3JtIG9mIGEgc2VwYXJhdGVseSB3cml0dGVuIGxpY2Vuc2UsIG9yIHN0YXRlZCBhcyBleGNlcHRpb25zOwordGhlIGFib3ZlIHJlcXVpcmVtZW50cyBhcHBseSBlaXRoZXIgd2F5LgorCisgIDguIFRlcm1pbmF0aW9uLgorCisgIFlvdSBtYXkgbm90IHByb3BhZ2F0ZSBvciBtb2RpZnkgYSBjb3ZlcmVkIHdvcmsgZXhjZXB0IGFzIGV4cHJlc3NseQorcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIHByb3BhZ2F0ZSBvcgorbW9kaWZ5IGl0IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyCit0aGlzIExpY2Vuc2UgKGluY2x1ZGluZyBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgdW5kZXIgdGhlIHRoaXJkCitwYXJhZ3JhcGggb2Ygc2VjdGlvbiAxMSkuCisKKyAgSG93ZXZlciwgaWYgeW91IGNlYXNlIGFsbCB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlLCB0aGVuIHlvdXIKK2xpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcyByZWluc3RhdGVkIChhKQorcHJvdmlzaW9uYWxseSwgdW5sZXNzIGFuZCB1bnRpbCB0aGUgY29weXJpZ2h0IGhvbGRlciBleHBsaWNpdGx5IGFuZAorZmluYWxseSB0ZXJtaW5hdGVzIHlvdXIgbGljZW5zZSwgYW5kIChiKSBwZXJtYW5lbnRseSwgaWYgdGhlIGNvcHlyaWdodAoraG9sZGVyIGZhaWxzIHRvIG5vdGlmeSB5b3Ugb2YgdGhlIHZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMKK3ByaW9yIHRvIDYwIGRheXMgYWZ0ZXIgdGhlIGNlc3NhdGlvbi4KKworICBNb3Jlb3ZlciwgeW91ciBsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMKK3JlaW5zdGF0ZWQgcGVybWFuZW50bHkgaWYgdGhlIGNvcHlyaWdodCBob2xkZXIgbm90aWZpZXMgeW91IG9mIHRoZQordmlvbGF0aW9uIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucywgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB5b3UgaGF2ZQorcmVjZWl2ZWQgbm90aWNlIG9mIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UgKGZvciBhbnkgd29yaykgZnJvbSB0aGF0Citjb3B5cmlnaHQgaG9sZGVyLCBhbmQgeW91IGN1cmUgdGhlIHZpb2xhdGlvbiBwcmlvciB0byAzMCBkYXlzIGFmdGVyCit5b3VyIHJlY2VpcHQgb2YgdGhlIG5vdGljZS4KKworICBUZXJtaW5hdGlvbiBvZiB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIHNlY3Rpb24gZG9lcyBub3QgdGVybWluYXRlIHRoZQorbGljZW5zZXMgb2YgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMgb3IgcmlnaHRzIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2UuICBJZiB5b3VyIHJpZ2h0cyBoYXZlIGJlZW4gdGVybWluYXRlZCBhbmQgbm90IHBlcm1hbmVudGx5CityZWluc3RhdGVkLCB5b3UgZG8gbm90IHF1YWxpZnkgdG8gcmVjZWl2ZSBuZXcgbGljZW5zZXMgZm9yIHRoZSBzYW1lCittYXRlcmlhbCB1bmRlciBzZWN0aW9uIDEwLgorCisgIDkuIEFjY2VwdGFuY2UgTm90IFJlcXVpcmVkIGZvciBIYXZpbmcgQ29waWVzLgorCisgIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UgaW4gb3JkZXIgdG8gcmVjZWl2ZSBvcgorcnVuIGEgY29weSBvZiB0aGUgUHJvZ3JhbS4gIEFuY2lsbGFyeSBwcm9wYWdhdGlvbiBvZiBhIGNvdmVyZWQgd29yaworb2NjdXJyaW5nIHNvbGVseSBhcyBhIGNvbnNlcXVlbmNlIG9mIHVzaW5nIHBlZXItdG8tcGVlciB0cmFuc21pc3Npb24KK3RvIHJlY2VpdmUgYSBjb3B5IGxpa2V3aXNlIGRvZXMgbm90IHJlcXVpcmUgYWNjZXB0YW5jZS4gIEhvd2V2ZXIsCitub3RoaW5nIG90aGVyIHRoYW4gdGhpcyBMaWNlbnNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBwcm9wYWdhdGUgb3IKK21vZGlmeSBhbnkgY292ZXJlZCB3b3JrLiAgVGhlc2UgYWN0aW9ucyBpbmZyaW5nZSBjb3B5cmlnaHQgaWYgeW91IGRvCitub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yIHByb3BhZ2F0aW5nIGEKK2NvdmVyZWQgd29yaywgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28uCisKKyAgMTAuIEF1dG9tYXRpYyBMaWNlbnNpbmcgb2YgRG93bnN0cmVhbSBSZWNpcGllbnRzLgorCisgIEVhY2ggdGltZSB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkKK3JlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvcnMsIHRvIHJ1biwgbW9kaWZ5IGFuZAorcHJvcGFnYXRlIHRoYXQgd29yaywgc3ViamVjdCB0byB0aGlzIExpY2Vuc2UuICBZb3UgYXJlIG5vdCByZXNwb25zaWJsZQorZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aCB0aGlzIExpY2Vuc2UuCisKKyAgQW4gImVudGl0eSB0cmFuc2FjdGlvbiIgaXMgYSB0cmFuc2FjdGlvbiB0cmFuc2ZlcnJpbmcgY29udHJvbCBvZiBhbgorb3JnYW5pemF0aW9uLCBvciBzdWJzdGFudGlhbGx5IGFsbCBhc3NldHMgb2Ygb25lLCBvciBzdWJkaXZpZGluZyBhbgorb3JnYW5pemF0aW9uLCBvciBtZXJnaW5nIG9yZ2FuaXphdGlvbnMuICBJZiBwcm9wYWdhdGlvbiBvZiBhIGNvdmVyZWQKK3dvcmsgcmVzdWx0cyBmcm9tIGFuIGVudGl0eSB0cmFuc2FjdGlvbiwgZWFjaCBwYXJ0eSB0byB0aGF0Cit0cmFuc2FjdGlvbiB3aG8gcmVjZWl2ZXMgYSBjb3B5IG9mIHRoZSB3b3JrIGFsc28gcmVjZWl2ZXMgd2hhdGV2ZXIKK2xpY2Vuc2VzIHRvIHRoZSB3b3JrIHRoZSBwYXJ0eSdzIHByZWRlY2Vzc29yIGluIGludGVyZXN0IGhhZCBvciBjb3VsZAorZ2l2ZSB1bmRlciB0aGUgcHJldmlvdXMgcGFyYWdyYXBoLCBwbHVzIGEgcmlnaHQgdG8gcG9zc2Vzc2lvbiBvZiB0aGUKK0NvcnJlc3BvbmRpbmcgU291cmNlIG9mIHRoZSB3b3JrIGZyb20gdGhlIHByZWRlY2Vzc29yIGluIGludGVyZXN0LCBpZgordGhlIHByZWRlY2Vzc29yIGhhcyBpdCBvciBjYW4gZ2V0IGl0IHdpdGggcmVhc29uYWJsZSBlZmZvcnRzLgorCisgIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIGV4ZXJjaXNlIG9mIHRoZQorcmlnaHRzIGdyYW50ZWQgb3IgYWZmaXJtZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkKK25vdCBpbXBvc2UgYSBsaWNlbnNlIGZlZSwgcm95YWx0eSwgb3Igb3RoZXIgY2hhcmdlIGZvciBleGVyY2lzZSBvZgorcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLCBhbmQgeW91IG1heSBub3QgaW5pdGlhdGUgbGl0aWdhdGlvbgorKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKK2FueSBwYXRlbnQgY2xhaW0gaXMgaW5mcmluZ2VkIGJ5IG1ha2luZywgdXNpbmcsIHNlbGxpbmcsIG9mZmVyaW5nIGZvcgorc2FsZSwgb3IgaW1wb3J0aW5nIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uIG9mIGl0LgorCisgIDExLiBQYXRlbnRzLgorCisgIEEgImNvbnRyaWJ1dG9yIiBpcyBhIGNvcHlyaWdodCBob2xkZXIgd2hvIGF1dGhvcml6ZXMgdXNlIHVuZGVyIHRoaXMKK0xpY2Vuc2Ugb2YgdGhlIFByb2dyYW0gb3IgYSB3b3JrIG9uIHdoaWNoIHRoZSBQcm9ncmFtIGlzIGJhc2VkLiAgVGhlCit3b3JrIHRodXMgbGljZW5zZWQgaXMgY2FsbGVkIHRoZSBjb250cmlidXRvcidzICJjb250cmlidXRvciB2ZXJzaW9uIi4KKworICBBIGNvbnRyaWJ1dG9yJ3MgImVzc2VudGlhbCBwYXRlbnQgY2xhaW1zIiBhcmUgYWxsIHBhdGVudCBjbGFpbXMKK293bmVkIG9yIGNvbnRyb2xsZWQgYnkgdGhlIGNvbnRyaWJ1dG9yLCB3aGV0aGVyIGFscmVhZHkgYWNxdWlyZWQgb3IKK2hlcmVhZnRlciBhY3F1aXJlZCwgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgYnkgc29tZSBtYW5uZXIsIHBlcm1pdHRlZAorYnkgdGhpcyBMaWNlbnNlLCBvZiBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLAorYnV0IGRvIG5vdCBpbmNsdWRlIGNsYWltcyB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBvbmx5IGFzIGEKK2NvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250cmlidXRvciB2ZXJzaW9uLiAgRm9yCitwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBpbmNsdWRlcyB0aGUgcmlnaHQgdG8gZ3JhbnQKK3BhdGVudCBzdWJsaWNlbnNlcyBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZgordGhpcyBMaWNlbnNlLgorCisgIEVhY2ggY29udHJpYnV0b3IgZ3JhbnRzIHlvdSBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlCitwYXRlbnQgbGljZW5zZSB1bmRlciB0aGUgY29udHJpYnV0b3IncyBlc3NlbnRpYWwgcGF0ZW50IGNsYWltcywgdG8KK21ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHJ1biwgbW9kaWZ5IGFuZAorcHJvcGFnYXRlIHRoZSBjb250ZW50cyBvZiBpdHMgY29udHJpYnV0b3IgdmVyc2lvbi4KKworICBJbiB0aGUgZm9sbG93aW5nIHRocmVlIHBhcmFncmFwaHMsIGEgInBhdGVudCBsaWNlbnNlIiBpcyBhbnkgZXhwcmVzcworYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQsIGhvd2V2ZXIgZGVub21pbmF0ZWQsIG5vdCB0byBlbmZvcmNlIGEgcGF0ZW50Cisoc3VjaCBhcyBhbiBleHByZXNzIHBlcm1pc3Npb24gdG8gcHJhY3RpY2UgYSBwYXRlbnQgb3IgY292ZW5hbnQgbm90IHRvCitzdWUgZm9yIHBhdGVudCBpbmZyaW5nZW1lbnQpLiAgVG8gImdyYW50IiBzdWNoIGEgcGF0ZW50IGxpY2Vuc2UgdG8gYQorcGFydHkgbWVhbnMgdG8gbWFrZSBzdWNoIGFuIGFncmVlbWVudCBvciBjb21taXRtZW50IG5vdCB0byBlbmZvcmNlIGEKK3BhdGVudCBhZ2FpbnN0IHRoZSBwYXJ0eS4KKworICBJZiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCBrbm93aW5nbHkgcmVseWluZyBvbiBhIHBhdGVudCBsaWNlbnNlLAorYW5kIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBpcyBub3QgYXZhaWxhYmxlIGZvciBhbnlvbmUKK3RvIGNvcHksIGZyZWUgb2YgY2hhcmdlIGFuZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCB0aHJvdWdoIGEKK3B1YmxpY2x5IGF2YWlsYWJsZSBuZXR3b3JrIHNlcnZlciBvciBvdGhlciByZWFkaWx5IGFjY2Vzc2libGUgbWVhbnMsCit0aGVuIHlvdSBtdXN0IGVpdGhlciAoMSkgY2F1c2UgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIHRvIGJlIHNvCithdmFpbGFibGUsIG9yICgyKSBhcnJhbmdlIHRvIGRlcHJpdmUgeW91cnNlbGYgb2YgdGhlIGJlbmVmaXQgb2YgdGhlCitwYXRlbnQgbGljZW5zZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIHdvcmssIG9yICgzKSBhcnJhbmdlLCBpbiBhIG1hbm5lcgorY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlLCB0byBleHRlbmQgdGhlIHBhdGVudAorbGljZW5zZSB0byBkb3duc3RyZWFtIHJlY2lwaWVudHMuICAiS25vd2luZ2x5IHJlbHlpbmciIG1lYW5zIHlvdSBoYXZlCithY3R1YWwga25vd2xlZGdlIHRoYXQsIGJ1dCBmb3IgdGhlIHBhdGVudCBsaWNlbnNlLCB5b3VyIGNvbnZleWluZyB0aGUKK2NvdmVyZWQgd29yayBpbiBhIGNvdW50cnksIG9yIHlvdXIgcmVjaXBpZW50J3MgdXNlIG9mIHRoZSBjb3ZlcmVkIHdvcmsKK2luIGEgY291bnRyeSwgd291bGQgaW5mcmluZ2Ugb25lIG9yIG1vcmUgaWRlbnRpZmlhYmxlIHBhdGVudHMgaW4gdGhhdAorY291bnRyeSB0aGF0IHlvdSBoYXZlIHJlYXNvbiB0byBiZWxpZXZlIGFyZSB2YWxpZC4KKworICBJZiwgcHVyc3VhbnQgdG8gb3IgaW4gY29ubmVjdGlvbiB3aXRoIGEgc2luZ2xlIHRyYW5zYWN0aW9uIG9yCithcnJhbmdlbWVudCwgeW91IGNvbnZleSwgb3IgcHJvcGFnYXRlIGJ5IHByb2N1cmluZyBjb252ZXlhbmNlIG9mLCBhCitjb3ZlcmVkIHdvcmssIGFuZCBncmFudCBhIHBhdGVudCBsaWNlbnNlIHRvIHNvbWUgb2YgdGhlIHBhcnRpZXMKK3JlY2VpdmluZyB0aGUgY292ZXJlZCB3b3JrIGF1dGhvcml6aW5nIHRoZW0gdG8gdXNlLCBwcm9wYWdhdGUsIG1vZGlmeQorb3IgY29udmV5IGEgc3BlY2lmaWMgY29weSBvZiB0aGUgY292ZXJlZCB3b3JrLCB0aGVuIHRoZSBwYXRlbnQgbGljZW5zZQoreW91IGdyYW50IGlzIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgdG8gYWxsIHJlY2lwaWVudHMgb2YgdGhlIGNvdmVyZWQKK3dvcmsgYW5kIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIEEgcGF0ZW50IGxpY2Vuc2UgaXMgImRpc2NyaW1pbmF0b3J5IiBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIHdpdGhpbgordGhlIHNjb3BlIG9mIGl0cyBjb3ZlcmFnZSwgcHJvaGliaXRzIHRoZSBleGVyY2lzZSBvZiwgb3IgaXMKK2NvbmRpdGlvbmVkIG9uIHRoZSBub24tZXhlcmNpc2Ugb2Ygb25lIG9yIG1vcmUgb2YgdGhlIHJpZ2h0cyB0aGF0IGFyZQorc3BlY2lmaWNhbGx5IGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgWW91IG1heSBub3QgY29udmV5IGEgY292ZXJlZAord29yayBpZiB5b3UgYXJlIGEgcGFydHkgdG8gYW4gYXJyYW5nZW1lbnQgd2l0aCBhIHRoaXJkIHBhcnR5IHRoYXQgaXMKK2luIHRoZSBidXNpbmVzcyBvZiBkaXN0cmlidXRpbmcgc29mdHdhcmUsIHVuZGVyIHdoaWNoIHlvdSBtYWtlIHBheW1lbnQKK3RvIHRoZSB0aGlyZCBwYXJ0eSBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHlvdXIgYWN0aXZpdHkgb2YgY29udmV5aW5nCit0aGUgd29yaywgYW5kIHVuZGVyIHdoaWNoIHRoZSB0aGlyZCBwYXJ0eSBncmFudHMsIHRvIGFueSBvZiB0aGUKK3BhcnRpZXMgd2hvIHdvdWxkIHJlY2VpdmUgdGhlIGNvdmVyZWQgd29yayBmcm9tIHlvdSwgYSBkaXNjcmltaW5hdG9yeQorcGF0ZW50IGxpY2Vuc2UgKGEpIGluIGNvbm5lY3Rpb24gd2l0aCBjb3BpZXMgb2YgdGhlIGNvdmVyZWQgd29yaworY29udmV5ZWQgYnkgeW91IChvciBjb3BpZXMgbWFkZSBmcm9tIHRob3NlIGNvcGllcyksIG9yIChiKSBwcmltYXJpbHkKK2ZvciBhbmQgaW4gY29ubmVjdGlvbiB3aXRoIHNwZWNpZmljIHByb2R1Y3RzIG9yIGNvbXBpbGF0aW9ucyB0aGF0Citjb250YWluIHRoZSBjb3ZlcmVkIHdvcmssIHVubGVzcyB5b3UgZW50ZXJlZCBpbnRvIHRoYXQgYXJyYW5nZW1lbnQsCitvciB0aGF0IHBhdGVudCBsaWNlbnNlIHdhcyBncmFudGVkLCBwcmlvciB0byAyOCBNYXJjaCAyMDA3LgorCisgIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGNvbnN0cnVlZCBhcyBleGNsdWRpbmcgb3IgbGltaXRpbmcKK2FueSBpbXBsaWVkIGxpY2Vuc2Ugb3Igb3RoZXIgZGVmZW5zZXMgdG8gaW5mcmluZ2VtZW50IHRoYXQgbWF5CitvdGhlcndpc2UgYmUgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhcHBsaWNhYmxlIHBhdGVudCBsYXcuCisKKyAgMTIuIE5vIFN1cnJlbmRlciBvZiBPdGhlcnMnIEZyZWVkb20uCisKKyAgSWYgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QgY29udmV5IGEKK2NvdmVyZWQgd29yayBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdSBtYXkKK25vdCBjb252ZXkgaXQgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhZ3JlZSB0byB0ZXJtcyB0aGF0IG9ibGlnYXRlIHlvdQordG8gY29sbGVjdCBhIHJveWFsdHkgZm9yIGZ1cnRoZXIgY29udmV5aW5nIGZyb20gdGhvc2UgdG8gd2hvbSB5b3UgY29udmV5Cit0aGUgUHJvZ3JhbSwgdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggdGhvc2UgdGVybXMgYW5kIHRoaXMKK0xpY2Vuc2Ugd291bGQgYmUgdG8gcmVmcmFpbiBlbnRpcmVseSBmcm9tIGNvbnZleWluZyB0aGUgUHJvZ3JhbS4KKworICAxMy4gVXNlIHdpdGggdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIHlvdSBoYXZlCitwZXJtaXNzaW9uIHRvIGxpbmsgb3IgY29tYmluZSBhbnkgY292ZXJlZCB3b3JrIHdpdGggYSB3b3JrIGxpY2Vuc2VkCit1bmRlciB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnRvIGEgc2luZ2xlCitjb21iaW5lZCB3b3JrLCBhbmQgdG8gY29udmV5IHRoZSByZXN1bHRpbmcgd29yay4gIFRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlIHdpbGwgY29udGludWUgdG8gYXBwbHkgdG8gdGhlIHBhcnQgd2hpY2ggaXMgdGhlIGNvdmVyZWQgd29yaywKK2J1dCB0aGUgc3BlY2lhbCByZXF1aXJlbWVudHMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKK3NlY3Rpb24gMTMsIGNvbmNlcm5pbmcgaW50ZXJhY3Rpb24gdGhyb3VnaCBhIG5ldHdvcmsgd2lsbCBhcHBseSB0byB0aGUKK2NvbWJpbmF0aW9uIGFzIHN1Y2guCisKKyAgMTQuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlLgorCisgIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCisgIEVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlCitQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgY2VydGFpbiBudW1iZXJlZCB2ZXJzaW9uIG9mIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgIm9yIGFueSBsYXRlciB2ZXJzaW9uIiBhcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUKK29wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IG51bWJlcmVkCit2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZAorYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBJZiB0aGUgUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIHByb3h5IGNhbiBkZWNpZGUgd2hpY2ggZnV0dXJlCit2ZXJzaW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHVzZWQsIHRoYXQgcHJveHkncworcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRhbmNlIG9mIGEgdmVyc2lvbiBwZXJtYW5lbnRseSBhdXRob3JpemVzIHlvdQordG8gY2hvb3NlIHRoYXQgdmVyc2lvbiBmb3IgdGhlIFByb2dyYW0uCisKKyAgTGF0ZXIgbGljZW5zZSB2ZXJzaW9ucyBtYXkgZ2l2ZSB5b3UgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQKK3Blcm1pc3Npb25zLiAgSG93ZXZlciwgbm8gYWRkaXRpb25hbCBvYmxpZ2F0aW9ucyBhcmUgaW1wb3NlZCBvbiBhbnkKK2F1dGhvciBvciBjb3B5cmlnaHQgaG9sZGVyIGFzIGEgcmVzdWx0IG9mIHlvdXIgY2hvb3NpbmcgdG8gZm9sbG93IGEKK2xhdGVyIHZlcnNpb24uCisKKyAgMTUuIERpc2NsYWltZXIgb2YgV2FycmFudHkuCisKKyAgVEhFUkUgSVMgTk8gV0FSUkFOVFkgRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWQorQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVAorSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWQorT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTQorSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GCitBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LgorCisgIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNT0RJRklFUyBBTkQvT1IgQ09OVkVZUworVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZCitHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUKK1VTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YKK0RBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJECitQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwKK0VWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKK1NVQ0ggREFNQUdFUy4KKworICAxNy4gSW50ZXJwcmV0YXRpb24gb2YgU2VjdGlvbnMgMTUgYW5kIDE2LgorCisgIElmIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFuZCBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eSBwcm92aWRlZAorYWJvdmUgY2Fubm90IGJlIGdpdmVuIGxvY2FsIGxlZ2FsIGVmZmVjdCBhY2NvcmRpbmcgdG8gdGhlaXIgdGVybXMsCityZXZpZXdpbmcgY291cnRzIHNoYWxsIGFwcGx5IGxvY2FsIGxhdyB0aGF0IG1vc3QgY2xvc2VseSBhcHByb3hpbWF0ZXMKK2FuIGFic29sdXRlIHdhaXZlciBvZiBhbGwgY2l2aWwgbGlhYmlsaXR5IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUKK1Byb2dyYW0sIHVubGVzcyBhIHdhcnJhbnR5IG9yIGFzc3VtcHRpb24gb2YgbGlhYmlsaXR5IGFjY29tcGFuaWVzIGEKK2NvcHkgb2YgdGhlIFByb2dyYW0gaW4gcmV0dXJuIGZvciBhIGZlZS4KKworICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5CitzdGF0ZSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKKyAgSWYgdGhlIHByb2dyYW0gZG9lcyB0ZXJtaW5hbCBpbnRlcmFjdGlvbiwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydAorbm90aWNlIGxpa2UgdGhpcyB3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgPHByb2dyYW0+ICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorICAgIFRoaXMgcHJvZ3JhbSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgeW91ciBwcm9ncmFtJ3MgY29tbWFuZHMKK21pZ2h0IGJlIGRpZmZlcmVudDsgZm9yIGEgR1VJIGludGVyZmFjZSwgeW91IHdvdWxkIHVzZSBhbiAiYWJvdXQgYm94Ii4KKworICBZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3Igc2Nob29sLAoraWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmIG5lY2Vzc2FyeS4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMsIGFuZCBob3cgdG8gYXBwbHkgYW5kIGZvbGxvdyB0aGUgR05VIEdQTCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbQoraW50byBwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91CittYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGgKK3RoZSBsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuICBCdXQgZmlyc3QsIHBsZWFzZSByZWFkCis8aHR0cDovL3d3dy5nbnUub3JnL3BoaWxvc29waHkvd2h5LW5vdC1sZ3BsLmh0bWw+LgpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZ3BzLmMgYi9ycmxwLWVwaGVtZXJpcy9ncHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjM1NzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZ3BzLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBncHMuYworICoKKyAqIEEgZmV3IHV0aWxpdHkgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBsb3cgbGV2ZWwgR1BTIGRhdGEKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiZ3BzLmgiCisKKworI2RlZmluZSBHRVRfRklFTERfVSh3LCBuYiwgcG9zKSAoKCh3KSA+PiAocG9zKSkgJiAoKDE8PChuYikpLTEpKQorI2RlZmluZSBHRVRfRklFTERfUyh3LCBuYiwgcG9zKSAoKChpbnQpKCh3KSA8PCAoMzItKG5iKS0ocG9zKSkpKSA+PiAoMzItKG5iKSkpCisKKy8qCisgKiBVbnBhY2tzIEdQUyBTdWJmcmFtZSAxLDIsMyBwYXlsb2FkcyAoMyAqIDggd29yZHMpCisgKgorICogTm90ZTogZXBoLT5zdl9pZCBpcyBub3QgZmlsbGVkIGhlcmUgc2luY2Ugbm90IHByZXNlbnQgaW4gdGhvc2Ugc3ViZnJhbWVzCisgKgorICogKG5vIHBhcml0eSBiaXQgY2hlY2tpbmcgaXMgZG9uZSwgb25seSB0aGUgbG93ZXIgMjQgYml0cyBvZiBlYWNoIHdvcmQKKyAqICBhcmUgdXNlZCkKKyAqLworaW50CitncHNfdW5wYWNrX3NmMTIzKHVpbnQzMl90ICpzZiwgc3RydWN0IGdwc19lcGhlbWVyaXNfc3YgKmVwaCkKK3sKKwl1aW50MzJfdCAqc2YxID0gJnNmWzBdOworCXVpbnQzMl90ICpzZjIgPSAmc2ZbOF07CisJdWludDMyX3QgKnNmMyA9ICZzZlsxNl07CisKKwlpbnQgaW9kZTEsIGlvZGUyOworCisJZXBoLT53ZWVrX25vCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAxMCwgMTQpOworCWVwaC0+Y29kZV9vbl9sMgk9IEdFVF9GSUVMRF9VKHNmMVswXSwgIDIsIDEyKTsKKwllcGgtPnN2X3VyYQk9IEdFVF9GSUVMRF9VKHNmMVswXSwgIDQsICA4KTsKKwllcGgtPnN2X2hlYWx0aAk9IEdFVF9GSUVMRF9VKHNmMVswXSwgIDYsICAyKTsKKwllcGgtPmwyX3BfZmxhZwk9IEdFVF9GSUVMRF9VKHNmMVsxXSwgIDEsIDIzKTsKKwllcGgtPnRfZ2QJPSBHRVRfRklFTERfUyhzZjFbNF0sICA4LCAgMCk7CisJZXBoLT5pb2RjCT0gKEdFVF9GSUVMRF9VKHNmMVswXSwgIDIsICAwKSA8PCA4KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YxWzVdLCAgOCwgMTYpOworCWVwaC0+dF9vYwk9IEdFVF9GSUVMRF9VKHNmMVs1XSwgMTYsICAwKTsKKwllcGgtPmFfZjIJPSBHRVRfRklFTERfUyhzZjFbNl0sICA4LCAxNik7CisJZXBoLT5hX2YxCT0gR0VUX0ZJRUxEX1Moc2YxWzZdLCAxNiwgIDApOworCWVwaC0+YV9mMAk9IEdFVF9GSUVMRF9TKHNmMVs3XSwgMjIsICAyKTsKKworCWlvZGUxCQk9IEdFVF9GSUVMRF9VKHNmMlswXSwgIDgsIDE2KTsKKwllcGgtPmNfcnMJPSBHRVRfRklFTERfUyhzZjJbMF0sIDE2LCAgMCk7CisJZXBoLT5kZWx0YV9uCT0gR0VUX0ZJRUxEX1Moc2YyWzFdLCAxNiwgIDgpOworCWVwaC0+bV8wCT0gKEdFVF9GSUVMRF9TKHNmMlsxXSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmMlsyXSwgMjQsICAwKTsKKwllcGgtPmNfdWMJPSBHRVRfRklFTERfUyhzZjJbM10sIDE2LCAgOCk7CisJZXBoLT5lCQk9IChHRVRfRklFTERfVShzZjJbM10sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjJbNF0sIDI0LCAgMCk7CisJZXBoLT5jX3VzCT0gR0VUX0ZJRUxEX1Moc2YyWzVdLCAxNiwgIDgpOworCWVwaC0+YV9wb3doYWxmCT0gKEdFVF9GSUVMRF9VKHNmMls1XSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmMls2XSwgMjQsICAwKTsKKwllcGgtPnRfb2UJPSBHRVRfRklFTERfVShzZjJbN10sIDE2LCAgOCk7CisJZXBoLT5maXRfZmxhZwk9IEdFVF9GSUVMRF9VKHNmMls3XSwgIDEsICA3KTsKKworCWVwaC0+Y19pYwk9IEdFVF9GSUVMRF9TKHNmM1swXSwgMTYsICA4KTsKKwllcGgtPm9tZWdhXzAJPSAoR0VUX0ZJRUxEX1Moc2YzWzBdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YzWzFdLCAyNCwgIDApOworCWVwaC0+Y19pcwk9IEdFVF9GSUVMRF9TKHNmM1syXSwgMTYsICA4KTsKKwllcGgtPmlfMAk9IChHRVRfRklFTERfUyhzZjNbMl0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjNbM10sIDI0LCAgMCk7CisJZXBoLT5jX3JjCT0gR0VUX0ZJRUxEX1Moc2YzWzRdLCAxNiwgIDgpOworCWVwaC0+dwkJPSAoR0VUX0ZJRUxEX1Moc2YzWzRdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YzWzVdLCAyNCwgIDApOworCWVwaC0+b21lZ2FfZG90CT0gR0VUX0ZJRUxEX1Moc2YzWzZdLCAyNCwgIDApOworCWlvZGUyCQk9IEdFVF9GSUVMRF9VKHNmM1s3XSwgIDgsIDE2KTsKKwllcGgtPmlkb3QJPSBHRVRfRklFTERfUyhzZjNbN10sIDE0LCAgMik7CisKKwllcGgtPl9yc3ZkMQk9IEdFVF9GSUVMRF9VKHNmMVsxXSwgMjMsICAwKTsKKwllcGgtPl9yc3ZkMgk9IEdFVF9GSUVMRF9VKHNmMVsyXSwgMjQsICAwKTsKKwllcGgtPl9yc3ZkMwk9IEdFVF9GSUVMRF9VKHNmMVszXSwgMjQsICAwKTsKKwllcGgtPl9yc3ZkNAk9IEdFVF9GSUVMRF9VKHNmMVs0XSwgMTYsICA4KTsKKwllcGgtPmFvZG8JPSBHRVRfRklFTERfVShzZjJbN10sICA1LCAgMik7CisKKwkvKiBDaGVjayAmIGNyb3NzLXZhbGlkYXRlIGlvZGNbNzowXSwgaW9kZTEsIGlvZGUyICovCisJaWYgKChpb2RlMSAhPSBpb2RlMikgfHwgKGlvZGUxICE9IChlcGgtPmlvZGMgJiAweGZmKSkpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBVbnBhY2tzIEdQUyBTdWJmcmFtZSA0IG9yIDUgQWxtYW5hYyBwYWdlcyBwYXlsb2FkICg4IHdvcmRzKQorICoKKyAqIChubyBwYXJpdHkgYml0IGNoZWNraW5nIGlzIGRvbmUsIG9ubHkgdGhlIGxvd2VyIDI0IGJpdHMgb2YgZWFjaCB3b3JkCisgKiAgYXJlIHVzZWQpCisgKi8KK2ludAorZ3BzX3VucGFja19zZjQ1X2FsbWFuYWModWludDMyX3QgKnNmLCBzdHJ1Y3QgZ3BzX2FsbWFuYWNfc3YgKmFsbSkKK3sKKwlhbG0tPnN2X2lkICAgICAgPSBHRVRfRklFTERfVShzZlswXSwgIDYsIDE2KTsKKworCWFsbS0+ZQkJPSBHRVRfRklFTERfVShzZlswXSwgMTYsICAwKTsKKwlhbG0tPnRfb2EJPSBHRVRfRklFTERfVShzZlsxXSwgIDgsIDE2KTsKKwlhbG0tPmtzaWkJPSBHRVRfRklFTERfUyhzZlsxXSwgMTYsICAwKTsKKwlhbG0tPm9tZWdhX2RvdAk9IEdFVF9GSUVMRF9TKHNmWzJdLCAxNiwgIDgpOworCWFsbS0+c3ZfaGVhbHRoCT0gR0VUX0ZJRUxEX1Uoc2ZbMl0sICA4LCAgMCk7CisJYWxtLT5hX3Bvd2hhbGYJPSBHRVRfRklFTERfVShzZlszXSwgMjQsICAwKTsKKwlhbG0tPm9tZWdhXzAJPSBHRVRfRklFTERfUyhzZls0XSwgMjQsICAwKTsKKwlhbG0tPncJCT0gR0VUX0ZJRUxEX1Moc2ZbNV0sIDI0LCAgMCk7CisJYWxtLT5tXzAJPSBHRVRfRklFTERfUyhzZls2XSwgMjQsICAwKTsKKwlhbG0tPmFfZjAJPSAoR0VUX0ZJRUxEX1Moc2ZbN10sIDgsIDE2KSA8PCAzKSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2ZbN10sIDMsICAyKTsKKwlhbG0tPmFfZjEJPSBHRVRfRklFTERfUyhzZls3XSwgMTEsICA1KTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9ncHMuaCBiL3JybHAtZXBoZW1lcmlzL2dwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MWI5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9ncHMuaApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIGdwcy5oCisgKgorICogSGVhZGVyIHRvIGRlYWwgd2l0aCBsb3cgbGV2ZWwgR1BTIGRhdGEKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fR1BTX0hfXworI2RlZmluZSBfX0dQU19IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKworI2RlZmluZSBNQVhfU1YJNjQKKworCisvKiBJb25vc3BlcmljIG1vZGVsIGRhdGEgKi8KK3N0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbCB7CisJCQkvKiAjYml0cyAgU2NhbGUgZmFjdG9yICBFZmZlY3RpdmUgIFVuaXRzICAgICAgICAgICAgKi8KKwkJCS8qICAgICAgICAgICAoTFNCKSAgICAgICByYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLworCisJaW50IGFscGhhXzA7CS8qIHMgOCAgICAgICAyXi0zMCAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBhbHBoYV8xOwkvKiBzIDggICAgICAgMl4tMjcgICAgICAgICAgICAgICAgIHMgLyBzZW1pLWNpcmNsZXMgKi8KKwlpbnQgYWxwaGFfMjsJLyogcyA4ICAgICAgIDJeLTI0ICAgICAgICAgICAgICAgICBzIC8gKHNlbWktY2lyY2xlcyleMiAqLworCWludCBhbHBoYV8zOwkvKiBzIDggICAgICAgMl4tMjQgICAgICAgICAgICAgICAgIHMgLyAoc2VtaS1jaXJjbGVzKV4zICovCisJaW50IGJldGFfMDsJLyogcyA4ICAgICAgIDJeMTEgICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGJldGFfMTsJLyogcyA4ICAgICAgIDJeMTQgICAgICAgICAgICAgICAgICBzIC8gc2VtaS1jaXJjbGVzICovCisJaW50IGJldGFfMjsJLyogcyA4ICAgICAgIDJeMTYgICAgICAgICAgICAgICAgICBzIC8gKHNlbWktY2lyY2xlcyleMiAqLworCWludCBiZXRhXzM7CS8qIHMgOCAgICAgICAyXjE2ICAgICAgICAgICAgICAgICAgcyAvIChzZW1pLWNpcmNsZXMpXjMgKi8KK307CisKKworLyogVVRDIG1vZGVsIGRhdGEgKi8KK3N0cnVjdCBncHNfdXRjX21vZGVsIHsKKwkJCS8qICNiaXRzICBTY2FsZSBmYWN0b3IgIEVmZmVjdGl2ZSAgVW5pdHMgICAgICAgICAgICAqLworCQkJLyogICAgICAgICAgIChMU0IpICAgICAgIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICovCisKKwlpbnQgYTA7CQkvKiBzIDMyICAgICAgMl4tMzAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgYTE7CQkvKiBzIDI0ICAgICAgMl4tNTAgICAgICAgICAgICAgICAgIHNlY29uZHMgLyBzZWNvbmRzICovCisJaW50IGRlbHRhX3RfbHM7CS8qIHMgIDggICAgICAxICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCB0X290OwkvKiB1ICA4ICAgICAgMl4xMiAgICAgICA2MDIsMTEyICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgd25fdDsJLyogdSAgOCAgICAgIDEgICAgICAgICAgICAgICAgICAgICB3ZWVrcyAgICAgICAgICAgICovCisJaW50IHduX2xzZjsJLyogdSAgOCAgICAgIDEgICAgICAgICAgICAgICAgICAgICB3ZWVrcyAgICAgICAgICAgICovCisJaW50IGRuOwkJLyogdSAgOCAgICAgIDEgICAgICAgICAgICAgICAgNyAgICBkYXlzICAgICAgICAgICAgICovCisJaW50IGRlbHRhX3RfbHNmOy8qIHMgIDggICAgICAxICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworfTsKKworCisvKiBBbG1hbmFjaCBkYXRhICovCitzdHJ1Y3QgZ3BzX2FsbWFuYWNfc3YgeworCWludCBzdl9pZDsKKwlpbnQgc3ZfaGVhbHRoOworCisJCQkvKiAjYml0cyAgU2NhbGUgZmFjdG9yICBFZmZlY3RpdmUgIFVuaXRzICAgICAgICAgICAgKi8KKwkJCS8qICAgICAgICAgICAoTFNCKSAgICAgICByYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLworCisJaW50IGU7CQkvKiB1IDE2ICAgICAgMl4tMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpbnQgdF9vYTsJLyogdSAgOCAgICAgIDJeMTIgICAgICAgNjAyLDExMiAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGtzaWk7CS8qIHMgMTYgICAgICAyXi0xOSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBvbWVnYV9kb3Q7CS8qIHMgMTYgICAgICAyXi0zOCAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzIC8gcyAqLworCWludCBhX3Bvd2hhbGY7CS8qIHUgMjQgICAgICAyXi0xMSAgICAgICAgICAgICAgICAgbWV0ZXJzICAgICAgICAgICAqLworCWludCBvbWVnYV8wOwkvKiBzIDI0ICAgICAgMl4tMjMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgdzsJCS8qIHMgMjQgICAgICAyXi0yMyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBtXzA7CS8qIHMgMjQgICAgICAyXi0yMyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBhX2YwOwkvKiBzIDExICAgICAgMl4tMjAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgYV9mMTsJLyogcyAxMSAgICAgIDJeLTM4ICAgICAgICAgICAgICAgICBzZWNvbmRzIC8gc2Vjb25kcyAqLworfTsKKworc3RydWN0IGdwc19hbG1hbmFjIHsKKwlpbnQgd25hOworCWludCBuX3N2OworCXN0cnVjdCBncHNfYWxtYW5hY19zdiBzdnNbTUFYX1NWXTsKK307CisKKworLyogRXBoZW1lcmlzIGRhdGEgKi8KK3N0cnVjdCBncHNfZXBoZW1lcmlzX3N2IHsKKwlpbnQgc3ZfaWQ7CisKKwkJCS8qICNiaXRzICBTY2FsZSBmYWN0b3IgIEVmZmVjdGl2ZSAgVW5pdHMgICAgICAgICAgICAqLworCQkJLyogICAgICAgICAgIChMU0IpICAgICAgIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICovCisKKwlpbnQgY29kZV9vbl9sMjsJLyogdSAgMiAgICAgIDEgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IHdlZWtfbm87CS8qIHUgMTAgICAgICAxICAgICAgICAgICAgICAgICAgICAgd2VlayAgICAgICAgICAgICAqLworCWludCBsMl9wX2ZsYWc7CS8qIHUgIDEgICAgICAxICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLworCWludCBzdl91cmE7CS8qIHUgIDQgICAgICAvICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLworCWludCBzdl9oZWFsdGg7CS8qIHUgIDYgICAgICAvICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLworCWludCB0X2dkOwkvKiBzICA4ICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgaW9kYzsJLyogdSAxMCAgICAgIC8gICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IHRfb2M7CS8qIHUgMTYgICAgICAyXjQgICAgICAgIDYwNCw3ODQgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBhX2YyOwkvKiBzICA4ICAgICAgMl4tNTUgICAgICAgICAgICAgICAgIHNlYyAvIHNlY14yICAgICAgKi8KKwlpbnQgYV9mMTsJLyogcyAxNiAgICAgIDJeLTQzICAgICAgICAgICAgICAgICBzZWMgLyBzZWMgICAgICAgICovCisJaW50IGFfZjA7CS8qIHMgMjIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCisJaW50IGNfcnM7CS8qIHMgMTYgICAgICAyXi01ICAgICAgICAgICAgICAgICAgbWV0ZXJzICAgICAgICAgICAqLworCWludCBkZWx0YV9uOwkvKiBzIDE2ICAgICAgMl4tNDMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAvIHMgKi8KKwlpbnQgbV8wOwkvKiBzIDMyICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgY191YzsJLyogcyAxNiAgICAgIDJeLTI5ICAgICAgICAgICAgICAgICByYWRpYW5zICAgICAgICAgICovCisJdW5zaWduZWQgaW50IGU7CS8qIHUgMzIgICAgICAyXi0zMyAgICAgIDAuMDMgICAgICAgLyAgICAgICAgICAgICAgICAqLworCWludCBjX3VzOwkvKiBzIDE2ICAgICAgMl4tMjkgICAgICAgICAgICAgICAgIHJhZGlhbnMgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgYV9wb3doYWxmOyAvKiB1IDMyICAyXi0xOSAgICAgICAgICAgICBtZXRlcnNeKDEvMikgICAgICovCisJaW50IHRfb2U7CS8qIHUgMTYgICAgICAyXjQgICAgICAgIDYwNCw3ODQgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBmaXRfZmxhZzsJLyogdSAgMSAgICAgIC8gICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCisKKwlpbnQgY19pYzsJLyogcyAxNiAgICAgIDJeLTI5ICAgICAgICAgICAgICAgICByYWRpYW5zICAgICAgICAgICovCisJaW50IG9tZWdhXzA7CS8qIHMgMzIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBjX2lzOwkvKiBzIDE2ICAgICAgMl4tMjkgICAgICAgICAgICAgICAgIHJhZGlhbnMgICAgICAgICAgKi8KKwlpbnQgaV8wOwkvKiBzIDMyICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgY19yYzsJLyogcyAxNiAgICAgIDJeLTUgICAgICAgICAgICAgICAgICBtZXRlcnMgICAgICAgICAgICovCisJaW50IHc7CQkvKiBzIDMyICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgb21lZ2FfZG90OwkvKiBzIDI0ICAgICAgMl4tNDMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAvIHMgKi8KKwlpbnQgaWRvdDsJLyogcyAxNCAgICAgIDJeLTQzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgLyBzICovCisKKwlpbnQgX3JzdmQxOwkvKiAyMyBiaXRzICovCisJaW50IF9yc3ZkMjsJLyogMjQgYml0cyAqLworCWludCBfcnN2ZDM7CS8qIDI0IGJpdHMgKi8KKwlpbnQgX3JzdmQ0OwkvKiAxNiBiaXRzICovCisJaW50IGFvZG87CS8qIDggYml0cyAgTm90IHN1cmUgaXQgbmVlZHMgdG8gYmUgaGVyZSAuLi4gKi8KK307CisKK3N0cnVjdCBncHNfZXBoZW1lcmlzIHsKKwlpbnQgbl9zdjsKKwlzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiBzdnNbTUFYX1NWXTsKK307CisKKworLyogUmVmZXJlbmNlIHBvc2l0aW9uICovCitzdHJ1Y3QgZ3BzX3JlZl9wb3MgewkvKiBXU0c4NCBlbGxpcHNvaWQgKi8KKwlkb3VibGUgbGF0aXR1ZGU7CS8qIGRlZyAqLworCWRvdWJsZSBsb25naXR1ZGU7CS8qIGRlZyAqLworCWRvdWJsZSBhbHRpdHVkZTsJLyogbSBhYm92ZSBlbGxpcHNvaWQgKi8KK307CisKKworLyogUmVmZXJlbmNlIHRpbWUgKi8KK3N0cnVjdCBncHNfcmVmX3RpbWUgeworCWludCB3bjsJCQkvKiBHUFMgd2VlayBudW1iZXIgKi8KKwlkb3VibGUgdG93OwkJLyogaW4gc2Vjb25kcyAqLworfTsKKworCisvKiBBbGwgYXNzaXN0IGRhdGEgKi8KKyNkZWZpbmUgR1BTX0ZJRUxEX0lPTk9TUEhFUkUJKDE8PDApCisjZGVmaW5lIEdQU19GSUVMRF9VVEMJCSgxPDwxKQorI2RlZmluZSBHUFNfRklFTERfQUxNQU5BQwkoMTw8MikKKyNkZWZpbmUgR1BTX0ZJRUxEX0VQSEVNRVJJUwkoMTw8MykKKyNkZWZpbmUgR1BTX0ZJRUxEX1JFRlBPUwkoMTw8NCkKKyNkZWZpbmUgR1BTX0ZJRUxEX1JFRlRJTUUJKDE8PDUpCisKK3N0cnVjdCBncHNfYXNzaXN0X2RhdGEgeworCWludCBmaWVsZHM7CisJc3RydWN0IGdwc19pb25vc3BoZXJlX21vZGVsCWlvbm9zcGhlcmU7CisJc3RydWN0IGdwc191dGNfbW9kZWwJCXV0YzsKKwlzdHJ1Y3QgZ3BzX2FsbWFuYWMJCWFsbWFuYWM7CisJc3RydWN0IGdwc19lcGhlbWVyaXMJCWVwaGVtZXJpczsKKwlzdHJ1Y3QgZ3BzX3JlZl9wb3MJCXJlZl9wb3M7CisJc3RydWN0IGdwc19yZWZfdGltZQkJcmVmX3RpbWU7Cit9OworCisKKy8qIEdQUyBTdWJmcmFtZSB1dGlsaXR5IG1ldGhvZHMgKHNlZSBncHMuYyBmb3IgZGV0YWlscykgKi8KK2ludCBncHNfdW5wYWNrX3NmMTIzKHVpbnQzMl90ICpzZiwgc3RydWN0IGdwc19lcGhlbWVyaXNfc3YgKmVwaCk7CitpbnQgZ3BzX3VucGFja19zZjQ1X2FsbWFuYWModWludDMyX3QgKnNmLCBzdHJ1Y3QgZ3BzX2FsbWFuYWNfc3YgKmFsbSk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fR1BTX0hfXyAqLworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9tYWluLmMgYi9ycmxwLWVwaGVtZXJpcy9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwMjVhMgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL21haW4uYwpAQCAtMCwwICsxLDk5IEBACisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgImdwcy5oIgorI2luY2x1ZGUgInVieC5oIgorI2luY2x1ZGUgInVieC1wYXJzZS5oIgorI2luY2x1ZGUgInJybHAuaCIKKworc3RhdGljIGludAorZG9fdWJ4X3JlYWQoc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlpbnQgcnYsIGZkLCBpOworCXN0cnVjdCBzdGF0IHN0OworCXZvaWQgKmJ1ZjsKKworCS8qIExvYWQgZmlsZSAqLworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKworCXJ2ID0gZnN0YXQoZmQsICZzdCk7CisJaWYgKHJ2IDwgMCkgeworCQljbG9zZShmZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlidWYgPSBtYWxsb2Moc3Quc3Rfc2l6ZSk7CisJaWYgKCFidWYpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcnYgPSByZWFkKGZkLCBidWYsIHN0LnN0X3NpemUpOworCWlmIChydiAhPSBzdC5zdF9zaXplKSB7CisJCWZyZWUoYnVmKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogUGFyc2UgZWFjaCBtZXNzYWdlICovCisJZm9yIChpPTA7IGk8c3Quc3Rfc2l6ZTspIHsKKwkJaW50IHJ2OworCQlydiA9IHVieF9tc2dfZGlzcGF0Y2godWJ4X3BhcnNlX2R0LCBidWYgKyBpLCBzdC5zdF9zaXplIC0gaSwgZ3BzKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCWkrKzsJLyogSW52YWxpZCBtZXNzYWdlOiB0cnkgb25lIGJ5dGUgbGF0ZXIgKi8KKwkJZWxzZQorCQkJaSArPSBydjsKKwl9CisKKwkvKiBEb25lICovCisJZnJlZShidWYpOworCWNsb3NlKGZkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkb19ycmxwKHN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcykKK3sKKwlzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxIGFyOworCXZvaWQgKnBkdXNbNjRdOworCWludCBsZW5bNjRdOworCWludCBpLCBydjsKKworCWNoYXIgKnRlc3QgPSAiXHgyOFx4MDBceDgwXHgxMFx4MDFceDMyXHgwMFx4MTlceDRGXHgwN1x4MTVceDA0IjsKKworCXJybHBfZGVjb2RlX2Fzc2lzdGFuY2VfcmVxdWVzdCgmYXIsIHRlc3QsIDEyKTsKKwlwcmludGYoIiUwOHggJTAxNmxseFxuIiwgYXIucmVxX2VsZW1zLCAobG9uZyBsb25nIHVuc2lnbmVkKSBhci5lcGhfc3ZzKTsKKworCWFyLnJlcV9lbGVtcyA9IC0xOworCWFyLmVwaF9zdnMgPSAtMUxMOworCXJ2ID0gcnJscF9ncHNfYXNzaXN0X3BkdXMoZ3BzLCAmYXIsIHBkdXMsIGxlbiwgNjQpOworCXByaW50ZigiJWRcbiIsIHJ2KTsKKwlmb3IgKGk9MDsgaTxydjsgaSsrKSB7CisJCXByaW50ZigiJXAgJWRcbiIsIHBkdXNbaV0sIGxlbltpXSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgZ3BzOworCWludCBydjsKKworCW1lbXNldCgmZ3BzLCAweDAwLCBzaXplb2YoZ3BzKSk7CisKKwlydiA9IGRvX3VieF9yZWFkKCZncHMsICJkYXRhLnVieCIpOworCQorCXJ2ID0gZG9fcnJscCgmZ3BzKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9ycmxwLmMgYi9ycmxwLWVwaGVtZXJpcy9ycmxwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwYzNhYgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3JybHAuYwpAQCAtMCwwICsxLDY0OCBAQAorLyoKKyAqIHJybHAuYworICoKKyAqIFJSTFAgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImdwcy5oIgorI2luY2x1ZGUgInJybHAuaCIKKworI2luY2x1ZGUgPFBEVS5oPgorI2luY2x1ZGUgPEdQUy1Bc3Npc3REYXRhLmg+CisjaW5jbHVkZSA8TmF2aWdhdGlvbk1vZGVsLmg+CisjaW5jbHVkZSA8SW9ub3NwaGVyaWNNb2RlbC5oPgorI2luY2x1ZGUgPFVUQ01vZGVsLmg+CisjaW5jbHVkZSA8QWxtYW5hYy5oPgorI2luY2x1ZGUgPFJlZkxvY2F0aW9uLmg+CisjaW5jbHVkZSA8UmVmZXJlbmNlVGltZS5oPgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUlJMUCBBc3Npc3RhbmNlIHJlcXVlc3QgZGVjb2RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS17e3sgKi8KKy8qIERlY29kZSBhbmQgdmFsaWRhdGUgdGhlIGFzc2lzdGFuY2UgZGF0YSByZXF1ZXN0IG1lc3NhZ2VzLgorICogU2VlIHNlY3Rpb24gMTAuMTAgb2YKKyAqICAuIEVUU0kgVFMgMTQ5IDAzMSBWOC4xLjAgKDIwMDktMDEpCisgKiAgLiAzR1BQIFRTIDQ5LjAzMSB2ZXJzaW9uIDguMS4wIFJlbGVhc2UgOAorICovCisKKy8qIFBhY2tlZCBzdHJ1Y3R1cmUgZnJvbSA0OS4wMzEgc3BlYyAoUkdBID0gUmVxdWVzdCBHUFMgQXNzaXN0YW5jZSkgKi8KKworI2RlZmluZSBSUkxQX1JHQTBfQUxNQU5BQwkoMTw8MCkKKyNkZWZpbmUgUlJMUF9SR0EwX1VUQ19NT0RFTAkoMTw8MSkKKyNkZWZpbmUgUlJMUF9SR0EwX0lPTk9fTU9ERUwJKDE8PDIpCisjZGVmaW5lIFJSTFBfUkdBMF9OQVZfTU9ERUwJKDE8PDMpCisjZGVmaW5lIFJSTFBfUkdBMF9ER1BTCQkoMTw8NCkKKyNkZWZpbmUgUlJMUF9SR0EwX1JFRl9MT0MJKDE8PDUpCisjZGVmaW5lIFJSTFBfUkdBMF9SRUZfVElNRQkoMTw8NikKKyNkZWZpbmUgUlJMUF9SR0EwX0FDUV9BU1NJU1QJKDE8PDcpCisKKyNkZWZpbmUgUlJMUF9SR0ExX1JFQUxUSU1FX0lOVAkoMTw8MCkKKyNkZWZpbmUgUlJMUF9SR0ExX0VQSF9FWFQJKDE8PDEpCisjZGVmaW5lIFJSTFBfUkdBMV9FUEhfRVhUX0NIRUNLCSgxPDwyKQorCitzdHJ1Y3QgcnJscF9yZ2FfaGRyIHsKKwl1aW50OF90IGl0ZW1zMDsKKwl1aW50OF90IGl0ZW1zMTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBycmxwX3JnYV9lcGhfc3YgeworCXVpbnQ4X3Qgc3ZfaWQ7CQkvKiBbNzo2XSByZXNlcnZlZCwgWzU6MF0gc3ZfaWQgKi8KKwl1aW50OF90IGlvZGU7CQkvKiBsYXRlc3QgZXBoIGluIHRoZSBNUyBtZW1vcnkgaW4gaG91cnMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBycmxwX3JnYV9lcGggeworCXVpbnQ4X3Qgd25faGk7CQkvKiBbNzo2XSA9IHduWzk6OF0gKi8KKwl1aW50OF90IHduX2xvOwkJLyogd25bNzowXSAqLworCXVpbnQ4X3QgdG9lOwkJLyogbGF0ZXN0IGVwaCBpbiB0aGUgTVMgbWVtb3J5IGluIGhvdXJzICovCisJdWludDhfdCBuc2F0X3RtdG9lOwkvKiBbNzo0XSBuc3RhdCwgWzM6MF0gVC1Ub2UgbGltaXQgKi8KKwlzdHJ1Y3QgcnJscF9yZ2FfZXBoX3N2IHN2c1swXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBycmxwX3JnYV9lcGhfZXh0IHsKKwl1aW50OF90IHZhbGlkaXR5OwkvKiBpbiA0IGhvdXJzIHVuaXRzICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dF9jaGVjayB7CisJCS8qIHdlZWtzIGFyZSBpbiBncHMgd2VlayBtb2R1bG8gNCAqLworCXVpbnQ4X3Qgd25fYmVnaW5fZW5kOwkvKiBbNzo0XSBiZWdpbiwgWzM6MF0gZW5kICovCisJdWludDhfdCB0b3dfYmVnaW47CisJdWludDhfdCB0b3dfZW5kOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKiBQYXJzaW5nIGZ1bmN0aW9uICovCisKK2ludAorcnJscF9kZWNvZGVfYXNzaXN0YW5jZV9yZXF1ZXN0KAorCXN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgKmFyLAorCXZvaWQgKnJlcSwgaW50IHJlcV9sZW4pCit7CisJc3RydWN0IHJybHBfcmdhX2hkciAqaGRyID0gTlVMTDsKKwlzdHJ1Y3QgcnJscF9yZ2FfZXBoICplcGggPSBOVUxMOworCXN0cnVjdCBycmxwX3JnYV9lcGhfZXh0ICplcGhfZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dF9jaGVjayAqZXBoX2V4dF9jaGVjayA9IE5VTEw7CisJaW50IHAgPSAwOworCisJLyogUmVzZXQgKi8KKwlhci0+cmVxX2VsZW1zID0gMDsKKwlhci0+ZXBoX3N2cyA9IDA7CisKKwkvKiBQYXJzZSBtZXNzYWdlICovCisJaGRyID0gcmVxOworCXAgKz0gc2l6ZW9mKHN0cnVjdCBycmxwX3JnYV9oZHIpOworCWlmIChwID4gcmVxX2xlbikKKwkJcmV0dXJuIC0xOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX05BVl9NT0RFTCkgeworCQllcGggPSByZXEgKyBwOworCQlwICs9IHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfZXBoKTsKKwkJaWYgKHAgPiByZXFfbGVuKQorCQkJcmV0dXJuIC0xOworCQlwICs9IChlcGgtPm5zYXRfdG10b2UgPj4gNCkgKiBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2VwaF9zdik7CisJCWlmIChwID4gcmVxX2xlbikKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaGRyLT5pdGVtczEgJiBSUkxQX1JHQTFfRVBIX0VYVCkgeworCQllcGhfZXh0ID0gcmVxICsgcDsKKwkJcCArPSBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2VwaF9leHQpOworCQlpZiAocCA+IHJlcV9sZW4pCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGhkci0+aXRlbXMxICYgUlJMUF9SR0ExX0VQSF9FWFRfQ0hFQ0spIHsKKwkJZXBoX2V4dF9jaGVjayA9IHJlcSArIHA7CisJCXAgKz0gc2l6ZW9mKHN0cnVjdCBycmxwX3JnYV9lcGhfZXh0X2NoZWNrKTsKKwkJaWYgKHAgPiByZXFfbGVuKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChwICE9IHJlcV9sZW4pCisJCXJldHVybiAtMjsgLyogbm90IGFsbCBieXRlcyBjb25zdW1lZCA/Pz8gKi8KKworCS8qIFByaW50IGEgd2FybmluZyBmb3IgdW5zdXBwb3J0ZWQgcmVxdWVzdHMgKi8KKwlpZiAoKGVwaF9leHQgIT0gTlVMTCkgfHwKKwkgICAgKGVwaF9leHRfY2hlY2sgIT0gTlVMTCkgfHwKKwkgICAgKGhkci0+aXRlbXMwICYgKFJSTFBfUkdBMF9ER1BTIHwgUlJMUF9SR0EwX0FDUV9BU1NJU1QpKSB8fAorCSAgICAoaGRyLT5pdGVtczEgJiBSUkxQX1JHQTFfUkVBTFRJTUVfSU5UKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlt3XSBVbnN1cHBvcnRlZCBhc3Npc3RhbmNlIGRhdGEgcmVxdWVzdGVkLCBpZ25vcmVkIC4uLlxuIik7CisJfQorCisJLyogQ29weSB0aGUgcmVxdWVzdCAqLworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9BTE1BTkFDKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfQUxNQU5BQzsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9VVENfTU9ERUwpCisJCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9VVENfTU9ERUw7CisKKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfSU9OT19NT0RFTCkKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX0lPTk9fTU9ERUw7CisKKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfUkVGX0xPQykKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX1JFRl9MT0M7CisKKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfUkVGX1RJTUUpCisJCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9SRUZfVElNRTsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9OQVZfTU9ERUwpIHsKKwkJaW50IGksIG5fc3ZzID0gZXBoLT5uc2F0X3RtdG9lID4+IDQ7CisJCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9FUEhFTUVSSVM7CisJCWZvciAoaT0wOyBpPG5fc3ZzOyBpKyspCisJCQlhci0+ZXBoX3N2cyB8PSAoMVVMTCA8PCAoZXBoLT5zdnNbaV0uc3ZfaWQgLSAxKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIH19fSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUlJMUCBlbGVtZW50cyBmaWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS17e3sgKi8KKworCS8qIEhlbHBlcnMgKi8KKworc3RhdGljIHZvaWQKK190c18yM18wMzJfc3RvcmVfbGF0aXR1ZGUoZG91YmxlIGxhdCwgdWludDhfdCAqYikKK3sKKwl1aW50MzJfdCB4OworCXggPSAodWludDMyX3QpIGZsb29yKGZhYnMobGF0LzkwLjApICogKChkb3VibGUpKDE8PDIzKSkpOworCWlmICh4ID49ICgxPDwyMykpCisJCXggPSAoMTw8MjMpIC0gMTsKKwlpZiAobGF0IDwgMC4wKQorCQl4IHw9ICgxPDwyMyk7CisJYlswXSA9ICh4ID4+IDE2KSAmIDB4ZmY7CisJYlsxXSA9ICh4ID4+ICA4KSAmIDB4ZmY7CisJYlsyXSA9ICB4ICAgICAgICAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkCitfdHNfMjNfMDMyX3N0b3JlX2xvbmdpdHVkZShkb3VibGUgbG9uLCB1aW50OF90ICpiKQoreworCWludDMyX3QgeDsKKwl4ID0gZmxvb3IoKGxvbi8zNjAuMCkgKiAoKGRvdWJsZSkoMTw8MjQpKSk7CisJaWYgKHggPj0gKDE8PDIzKSkKKwkJeCA9IDB4MDA3ZmZmZmY7CisJZWxzZSBpZiAoeCA8IC0oMTw8MjMpKQorCQl4ID0gMHgwMDgwMDAwMDsKKwliWzBdID0gKHggPj4gMTYpICYgMHhmZjsKKwliWzFdID0gKHggPj4gIDgpICYgMHhmZjsKKwliWzJdID0gIHggICAgICAgICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQKK190c18yM18wMzJfc3RvcmVfYWx0aXR1ZGUoZG91YmxlIGFsdCwgdWludDhfdCAqYikKK3sKKwlpbnQgYWx0X2kgPSAoaW50KWZhYnMoYWx0KTsKKwliWzBdID0gKChhbHRfaSA+PiA4KSAmIDB4N2YpIHwgKGFsdDwwLjAgPyAweDgwIDogMHgwMCk7CisJYlsxXSA9IGFsdF9pICYgMHhmZjsKK30KKworCisJLyogRmlsbCBtZXRob2RzICovCisKK3N0YXRpYyB2b2lkCitfcnJscF9maWxsX25hdmlnYXRpb25fbW9kZWxfZWxlbWVudCgKKwlzdHJ1Y3QgTmF2TW9kZWxFbGVtZW50ICpycmxwX25tZSwKKwlzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiAqZ3BzX2VwaF9zdikKK3sKKwlzdHJ1Y3QgVW5jb21wcmVzc2VkRXBoZW1lcmlzICpycmxwX2VwaDsKKworCXJybHBfbm1lLT5zYXRTdGF0dXMucHJlc2VudCA9IFNhdFN0YXR1c19QUl9uZXdTYXRlbGxpdGVBbmRNb2RlbFVDOworCXJybHBfbm1lLT5zYXRlbGxpdGVJRCA9IGdwc19lcGhfc3YtPnN2X2lkOworCisJcnJscF9lcGggPSAmcnJscF9ubWUtPnNhdFN0YXR1cy5jaG9pY2UubmV3U2F0ZWxsaXRlQW5kTW9kZWxVQzsKKworCXJybHBfZXBoLT5lcGhlbUNvZGVPbkwyICAgPSBncHNfZXBoX3N2LT5jb2RlX29uX2wyOworCXJybHBfZXBoLT5lcGhlbVVSQSAgICAgICAgPSBncHNfZXBoX3N2LT5zdl91cmE7CisJcnJscF9lcGgtPmVwaGVtU1ZoZWFsdGggICA9IGdwc19lcGhfc3YtPnN2X2hlYWx0aDsKKwlycmxwX2VwaC0+ZXBoZW1JT0RDICAgICAgID0gZ3BzX2VwaF9zdi0+aW9kYzsKKwlycmxwX2VwaC0+ZXBoZW1MMlBmbGFnICAgID0gZ3BzX2VwaF9zdi0+bDJfcF9mbGFnOworCXJybHBfZXBoLT5lcGhlbVRnZCAgICAgICAgPSBncHNfZXBoX3N2LT50X2dkOworCXJybHBfZXBoLT5lcGhlbVRvYyAgICAgICAgPSBncHNfZXBoX3N2LT50X29jOworCXJybHBfZXBoLT5lcGhlbUFGMiAgICAgICAgPSBncHNfZXBoX3N2LT5hX2YyOworCXJybHBfZXBoLT5lcGhlbUFGMSAgICAgICAgPSBncHNfZXBoX3N2LT5hX2YxOworCXJybHBfZXBoLT5lcGhlbUFGMCAgICAgICAgPSBncHNfZXBoX3N2LT5hX2YwOworCXJybHBfZXBoLT5lcGhlbUNycyAgICAgICAgPSBncHNfZXBoX3N2LT5jX3JzOworCXJybHBfZXBoLT5lcGhlbURlbHRhTiAgICAgPSBncHNfZXBoX3N2LT5kZWx0YV9uOworCXJybHBfZXBoLT5lcGhlbU0wICAgICAgICAgPSBncHNfZXBoX3N2LT5tXzA7CisJcnJscF9lcGgtPmVwaGVtQ3VjICAgICAgICA9IGdwc19lcGhfc3YtPmNfdWM7CisJcnJscF9lcGgtPmVwaGVtRSAgICAgICAgICA9IGdwc19lcGhfc3YtPmU7CisJcnJscF9lcGgtPmVwaGVtQ3VzICAgICAgICA9IGdwc19lcGhfc3YtPmNfdXM7CisJcnJscF9lcGgtPmVwaGVtQVBvd2VySGFsZiA9IGdwc19lcGhfc3YtPmFfcG93aGFsZjsKKwlycmxwX2VwaC0+ZXBoZW1Ub2UgICAgICAgID0gZ3BzX2VwaF9zdi0+dF9vZTsKKwlycmxwX2VwaC0+ZXBoZW1GaXRGbGFnICAgID0gZ3BzX2VwaF9zdi0+Zml0X2ZsYWc7CisJcnJscF9lcGgtPmVwaGVtQU9EQSAgICAgICA9IGdwc19lcGhfc3YtPmFvZG87CisJcnJscF9lcGgtPmVwaGVtQ2ljICAgICAgICA9IGdwc19lcGhfc3YtPmNfaWM7CisJcnJscF9lcGgtPmVwaGVtT21lZ2FBMCAgICA9IGdwc19lcGhfc3YtPm9tZWdhXzA7CisJcnJscF9lcGgtPmVwaGVtQ2lzICAgICAgICA9IGdwc19lcGhfc3YtPmNfaXM7CisJcnJscF9lcGgtPmVwaGVtSTAgICAgICAgICA9IGdwc19lcGhfc3YtPmlfMDsKKwlycmxwX2VwaC0+ZXBoZW1DcmMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y19yYzsKKwlycmxwX2VwaC0+ZXBoZW1XICAgICAgICAgID0gZ3BzX2VwaF9zdi0+dzsKKwlycmxwX2VwaC0+ZXBoZW1PbWVnYUFEb3QgID0gZ3BzX2VwaF9zdi0+b21lZ2FfZG90OworCXJybHBfZXBoLT5lcGhlbUlEb3QgICAgICAgPSBncHNfZXBoX3N2LT5pZG90OworCisJcnJscF9lcGgtPmVwaGVtU0YxUnN2ZC5yZXNlcnZlZDEgPSBncHNfZXBoX3N2LT5fcnN2ZDE7CisJcnJscF9lcGgtPmVwaGVtU0YxUnN2ZC5yZXNlcnZlZDIgPSBncHNfZXBoX3N2LT5fcnN2ZDI7CisJcnJscF9lcGgtPmVwaGVtU0YxUnN2ZC5yZXNlcnZlZDMgPSBncHNfZXBoX3N2LT5fcnN2ZDM7CisJcnJscF9lcGgtPmVwaGVtU0YxUnN2ZC5yZXNlcnZlZDQgPSBncHNfZXBoX3N2LT5fcnN2ZDQ7Cit9CisKK3N0YXRpYyB2b2lkCitfcnJscF9maWxsX2FsbWFuYWNfZWxlbWVudCgKKwlzdHJ1Y3QgQWxtYW5hY0VsZW1lbnQgKnJybHBfYWUsCisJc3RydWN0IGdwc19hbG1hbmFjX3N2ICpncHNfYWxtX3N2KQoreworCXJybHBfYWUtPnNhdGVsbGl0ZUlEID0gZ3BzX2FsbV9zdi0+c3ZfaWQ7CisKKwlycmxwX2FlLT5hbG1hbmFjRSAgICAgICAgICA9IGdwc19hbG1fc3YtPmU7CisJcnJscF9hZS0+YWxhbWFuYWNUb2EgICAgICAgPSBncHNfYWxtX3N2LT50X29hOworCXJybHBfYWUtPmFsbWFuYWNLc2lpICAgICAgID0gZ3BzX2FsbV9zdi0+a3NpaTsKKwlycmxwX2FlLT5hbG1hbmFjT21lZ2FEb3QgICA9IGdwc19hbG1fc3YtPm9tZWdhX2RvdDsKKwlycmxwX2FlLT5hbG1hbmFjU1ZoZWFsdGggICA9IGdwc19hbG1fc3YtPnN2X2hlYWx0aDsKKwlycmxwX2FlLT5hbG1hbmFjQVBvd2VySGFsZiA9IGdwc19hbG1fc3YtPmFfcG93aGFsZjsKKwlycmxwX2FlLT5hbG1hbmFjT21lZ2EwICAgICA9IGdwc19hbG1fc3YtPm9tZWdhXzA7CisJcnJscF9hZS0+YWxtYW5hY1cgICAgICAgICAgPSBncHNfYWxtX3N2LT53OworCXJybHBfYWUtPmFsbWFuYWNNMCAgICAgICAgID0gZ3BzX2FsbV9zdi0+bV8wOworCXJybHBfYWUtPmFsbWFuYWNBRjAgICAgICAgID0gZ3BzX2FsbV9zdi0+YV9mMDsKKwlycmxwX2FlLT5hbG1hbmFjQUYxICAgICAgICA9IGdwc19hbG1fc3YtPmFfZjE7CisKK30KKworc3RhdGljIHZvaWQKK19ycmxwX2ZpbGxfaW9ub3NwaGVyaWNfbW9kZWwoCisJc3RydWN0IElvbm9zcGhlcmljTW9kZWwgKnJybHBfaW9ubywKKwlzdHJ1Y3QgZ3BzX2lvbm9zcGhlcmVfbW9kZWwgKmdwc19pb25vKQoreworCXJybHBfaW9uby0+YWxmYTAgPSBncHNfaW9uby0+YWxwaGFfMDsKKwlycmxwX2lvbm8tPmFsZmExID0gZ3BzX2lvbm8tPmFscGhhXzE7CisJcnJscF9pb25vLT5hbGZhMiA9IGdwc19pb25vLT5hbHBoYV8yOworCXJybHBfaW9uby0+YWxmYTMgPSBncHNfaW9uby0+YWxwaGFfMzsKKwlycmxwX2lvbm8tPmJldGEwID0gZ3BzX2lvbm8tPmJldGFfMDsKKwlycmxwX2lvbm8tPmJldGExID0gZ3BzX2lvbm8tPmJldGFfMTsKKwlycmxwX2lvbm8tPmJldGEyID0gZ3BzX2lvbm8tPmJldGFfMjsKKwlycmxwX2lvbm8tPmJldGEzID0gZ3BzX2lvbm8tPmJldGFfMzsKK30KKworc3RhdGljIHZvaWQKK19ycmxwX2ZpbGxfdXRjX21vZGVsKAorCXN0cnVjdCBVVENNb2RlbCAqcnJscF91dGMsCisJc3RydWN0IGdwc191dGNfbW9kZWwgKmdwc191dGMpCit7CisJcnJscF91dGMtPnV0Y0ExICAgICAgICA9IGdwc191dGMtPmExOworCXJybHBfdXRjLT51dGNBMCAgICAgICAgPSBncHNfdXRjLT5hMDsKKwlycmxwX3V0Yy0+dXRjVG90ICAgICAgID0gZ3BzX3V0Yy0+dF9vdDsKKwlycmxwX3V0Yy0+dXRjV050ICAgICAgID0gZ3BzX3V0Yy0+d25fdCAmIDB4ZmY7CisJcnJscF91dGMtPnV0Y0RlbHRhVGxzICA9IGdwc191dGMtPmRlbHRhX3RfbHM7CisJcnJscF91dGMtPnV0Y1dObHNmICAgICA9IGdwc191dGMtPnduX2xzZiAmIDB4ZmY7CisJcnJscF91dGMtPnV0Y0ROICAgICAgICA9IGdwc191dGMtPmRuOworCXJybHBfdXRjLT51dGNEZWx0YVRsc2YgPSBncHNfdXRjLT5kZWx0YV90X2xzZjsKK30KKworLyogfX19ICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSUkxQIEFzc2lzdGFuY2UgUERVIEdlbmVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXt7eyAqLworCitzdHJ1Y3QgUERVICoKK19ycmxwX2NyZWF0ZV9ncHNfYXNzaXN0X3BkdShpbnQgcmVmbnVtLCBzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKipvX2dwc19hZCkKK3sKKwlzdHJ1Y3QgUERVICpwZHU7CisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpncHNfYWQ7CisKKwlwZHUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpwZHUpKTsKKwlpZiAoIXBkdSkKKwkJcmV0dXJuIE5VTEw7CisKKwlncHNfYWQgPSBjYWxsb2MoMSwgc2l6ZW9mKCpncHNfYWQpKTsKKwlpZiAoIWdwc19hZCkgeworCQlmcmVlKHBkdSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChvX2dwc19hZCkKKwkJKm9fZ3BzX2FkID0gZ3BzX2FkOworCisJcGR1LT5yZWZlcmVuY2VOdW1iZXIgPSByZWZudW07CisJcGR1LT5jb21wb25lbnQucHJlc2VudCA9IFJSTFBfQ29tcG9uZW50X1BSX2Fzc2lzdGFuY2VEYXRhOworCXBkdS0+Y29tcG9uZW50LmNob2ljZS5hc3Npc3RhbmNlRGF0YS5ncHNfQXNzaXN0RGF0YSA9IGdwc19hZDsKKworCXJldHVybiBwZHU7Cit9CisKK3N0YXRpYyBpbnQKK19ycmxwX2FkZF9pb25vc3BoZXJpY19tb2RlbCgKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCkKK3sKKwlzdHJ1Y3QgSW9ub3NwaGVyaWNNb2RlbCAqcnJscF9pb25vOworCisJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfSU9OT1NQSEVSRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcnJscF9pb25vID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9pb25vKSk7CisJaWYgKCFycmxwX2lvbm8pCisJCXJldHVybiAtRU5PTUVNOworCXJybHBfZ3BzX2FkLT5jb250cm9sSGVhZGVyLmlvbm9zcGhlcmljTW9kZWwgPSBycmxwX2lvbm87CisKKwlfcnJscF9maWxsX2lvbm9zcGhlcmljX21vZGVsKHJybHBfaW9ubywgJmdwc19hZC0+aW9ub3NwaGVyZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX3V0Y19tb2RlbCgKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCkKK3sKKwlzdHJ1Y3QgVVRDTW9kZWwgKnJybHBfdXRjOworCisJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfVVRDKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycmxwX3V0YyA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfdXRjKSk7CisJaWYgKCFycmxwX3V0YykKKwkJcmV0dXJuIC1FTk9NRU07CisJcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIudXRjTW9kZWwgPSBycmxwX3V0YzsKKworCV9ycmxwX2ZpbGxfdXRjX21vZGVsKHJybHBfdXRjLCAmZ3BzX2FkLT51dGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK19ycmxwX2FkZF9yZWZlcmVuY2VfbG9jYXRpb24oCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQpCit7CisJc3RydWN0IFJlZkxvY2F0aW9uICpycmxwX3JlZmxvYzsKKwl1aW50OF90ICpiOworCisJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfUkVGUE9TKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycmxwX3JlZmxvYyA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfcmVmbG9jKSk7CisJaWYgKCFycmxwX3JlZmxvYykKKwkJcmV0dXJuIC1FTk9NRU07CisJcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIucmVmTG9jYXRpb24gPSBycmxwX3JlZmxvYzsKKworCWIgPSBtYWxsb2MoOSk7CisKKwliWzBdID0gMHg4MDsgLyogRWxsaXBzb2lkIFBvaW50IHdpdGggYWx0aXR1ZGUgKi8KKwlfdHNfMjNfMDMyX3N0b3JlX2xhdGl0dWRlKGdwc19hZC0+cmVmX3Bvcy5sYXRpdHVkZSwgJmJbMV0pOworCV90c18yM18wMzJfc3RvcmVfbG9uZ2l0dWRlKGdwc19hZC0+cmVmX3Bvcy5sb25naXR1ZGUsICZiWzRdKTsKKwlfdHNfMjNfMDMyX3N0b3JlX2FsdGl0dWRlKGdwc19hZC0+cmVmX3Bvcy5hbHRpdHVkZSwgJmJbN10pOworCisJcnJscF9yZWZsb2MtPnRocmVlRExvY2F0aW9uLmJ1ZiA9IGI7CisJcnJscF9yZWZsb2MtPnRocmVlRExvY2F0aW9uLnNpemUgPSA5OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK19ycmxwX2FkZF9yZWZlcmVuY2VfdGltZSgKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCkKK3sKKwlzdHJ1Y3QgUmVmZXJlbmNlVGltZSAqcnJscF9yZWZ0aW1lOworCisJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfUkVGVElNRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcnJscF9yZWZ0aW1lID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9yZWZ0aW1lKSk7CisJaWYgKCFycmxwX3JlZnRpbWUpCisJCXJldHVybiAtRU5PTUVNOworCXJybHBfZ3BzX2FkLT5jb250cm9sSGVhZGVyLnJlZmVyZW5jZVRpbWUgPSBycmxwX3JlZnRpbWU7CisKKwlycmxwX3JlZnRpbWUtPmdwc1RpbWUuZ3BzV2VlayAgID0gZ3BzX2FkLT5yZWZfdGltZS53biAmIDB4M2ZmOyAvKiAxMGIgKi8KKwlycmxwX3JlZnRpbWUtPmdwc1RpbWUuZ3BzVE9XMjNiID0KKwkJKChpbnQpZmxvb3IoZ3BzX2FkLT5yZWZfdGltZS50b3cgLyAwLjA4KSkgJiAweDdmZmZmZjsgIC8qIDIzYiAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK19ycmxwX2FkZF9hbG1hbmFjKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkLCBpbnQgKnN0YXJ0LCBpbnQgY291bnQpCit7CisJaW50IGk7CisJc3RydWN0IEFsbWFuYWMgKnJybHBfYWxtOworCXN0cnVjdCBncHNfYWxtYW5hYyAqZ3BzX2FsbSA9ICZncHNfYWQtPmFsbWFuYWM7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9BTE1BTkFDKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycmxwX2FsbSA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfYWxtKSk7CisJaWYgKCFycmxwX2FsbSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIuYWxtYW5hYyA9IHJybHBfYWxtOworCisJcnJscF9hbG0tPmFsYW1hbmFjV05hID0gZ3BzX2FsbS0+d25hOworCWlmIChjb3VudCA9PSAtMSkKKwkJY291bnQgPSBncHNfYWxtLT5uX3N2IC0gKnN0YXJ0OworCWZvciAoaT0qc3RhcnQ7IChpPCpzdGFydCtjb3VudCkgJiYgKGk8Z3BzX2FsbS0+bl9zdik7IGkrKykgeworCQlzdHJ1Y3QgQWxtYW5hY0VsZW1lbnQgKmFlOworCQlhZSA9IGNhbGxvYygxLCBzaXplb2YoKmFlKSk7CisJCWlmICghYWUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJX3JybHBfZmlsbF9hbG1hbmFjX2VsZW1lbnQoYWUsICZncHNfYWxtLT5zdnNbaV0pOworCQlBU05fU0VRVUVOQ0VfQUREKCZycmxwX2FsbS0+YWxtYW5hY0xpc3QubGlzdCwgYWUpOworCX0KKworCSpzdGFydCA9IGk7CisKKwlyZXR1cm4gaSA8IGdwc19hbG0tPm5fc3Y7Cit9CisKK3N0YXRpYyBpbnQKK19ycmxwX2FkZF9lcGhlbWVyaXMoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQsIGludCAqc3RhcnQsIGludCBjb3VudCwgdWludDY0X3QgbWFzaykKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgTmF2aWdhdGlvbk1vZGVsICpycmxwX25hdjsKKwlzdHJ1Y3QgZ3BzX2VwaGVtZXJpcyAqZ3BzX2VwaCA9ICZncHNfYWQtPmVwaGVtZXJpczsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX0VQSEVNRVJJUykpCisJCXJldHVybiAtRUlOVkFMOworCisJcnJscF9uYXYgPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX25hdikpOworCWlmICghcnJscF9uYXYpCisJCXJldHVybiAtRU5PTUVNOworCXJybHBfZ3BzX2FkLT5jb250cm9sSGVhZGVyLm5hdmlnYXRpb25Nb2RlbCA9IHJybHBfbmF2OworCisJaWYgKGNvdW50ID09IC0xKQorCQljb3VudCA9IGdwc19lcGgtPm5fc3YgLSAqc3RhcnQ7CisJZm9yIChpPSpzdGFydCxqPTA7IChqPGNvdW50KSAmJiAoaTxncHNfZXBoLT5uX3N2KTsgaSsrKSB7CisJCWlmICghKG1hc2sgJiAoMVVMTDw8KGdwc19lcGgtPnN2c1tpXS5zdl9pZC0xKSkpKQorCQkJY29udGludWU7CisJCXN0cnVjdCBOYXZNb2RlbEVsZW1lbnQgKm5tZTsKKwkJbm1lID0gY2FsbG9jKDEsIHNpemVvZigqbm1lKSk7CisJCWlmICghbm1lKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCV9ycmxwX2ZpbGxfbmF2aWdhdGlvbl9tb2RlbF9lbGVtZW50KG5tZSwgJmdwc19lcGgtPnN2c1tpXSk7CisJCUFTTl9TRVFVRU5DRV9BREQoJnJybHBfbmF2LT5uYXZNb2RlbExpc3QubGlzdCwgbm1lKTsKKwkJaisrOworCX0KKworCSpzdGFydCA9IGk7CisKKwlyZXR1cm4gaSA8IGdwc19lcGgtPm5fc3Y7Cit9CisKKworI2RlZmluZSBNQVhfUERVUyA2NAorCitpbnQKK3JybHBfZ3BzX2Fzc2lzdF9wZHVzKAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCwgc3RydWN0IHJybHBfYXNzaXN0X3JlcSAqcmVxLAorCXZvaWQgKipvX3BkdSwgaW50ICpvX2xlbiwgaW50IG9fbWF4X3BkdXMpCit7CisJc3RydWN0IFBEVSAqbHN0X3BkdVtNQVhfUERVU107CisJaW50IGxzdF9jbnQgPSAwOworCisJc3RydWN0IFBEVSAqcnJscF9wZHUgPSBOVUxMOworCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQgPSBOVUxMOworCXVpbnQzMl90IHJlID0gcmVxLT5yZXFfZWxlbXM7CisJaW50IGksIHJ2ID0gMDsKKworCS8qIElvbm9zcGhlcmljTW9kZWwsIFVUQ01vZGVsLCBSZWZMb2NhdGlvbiwgUmVmZXJlbmNlVGltZSAqLworCWlmIChyZSAmIChSUkxQX0FSX0lPTk9fTU9ERUwgfAorCSAgICAgICAgICBSUkxQX0FSX1VUQ19NT0RFTCB8CisJICAgICAgICAgIFJSTFBfQVJfUkVGX1RJTUUgfAorCSAgICAgICAgICBSUkxQX0FSX1JFRl9MT0MpKQorCXsKKwkJaW50IHBkdV9oYXNfZGF0YSA9IDA7CisKKwkJcnJscF9wZHUgPSBfcnJscF9jcmVhdGVfZ3BzX2Fzc2lzdF9wZHUoMSwgJnJybHBfZ3BzX2FkKTsKKwkJaWYgKCFycmxwX3BkdSkgeworCQkJcnYgPSAtRU5PTUVNOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlmIChyZSAmIFJSTFBfQVJfSU9OT19NT0RFTCkKKwkJCWlmICghX3JybHBfYWRkX2lvbm9zcGhlcmljX21vZGVsKHJybHBfZ3BzX2FkLCBncHNfYWQpKQorCQkJCXBkdV9oYXNfZGF0YSA9IDE7CisKKwkJaWYgKHJlICYgUlJMUF9BUl9VVENfTU9ERUwpCisJCQlpZiAoIV9ycmxwX2FkZF91dGNfbW9kZWwocnJscF9ncHNfYWQsIGdwc19hZCkpCisJCQkJcGR1X2hhc19kYXRhID0gMTsKKworCQlpZiAocmUgJiBSUkxQX0FSX1JFRl9USU1FKQorCQkJaWYgKCFfcnJscF9hZGRfcmVmZXJlbmNlX3RpbWUocnJscF9ncHNfYWQsIGdwc19hZCkpCisJCQkJcGR1X2hhc19kYXRhID0gMTsKKworCQlpZiAocmUgJiBSUkxQX0FSX1JFRl9MT0MpCisJCQlpZiAoIV9ycmxwX2FkZF9yZWZlcmVuY2VfbG9jYXRpb24ocnJscF9ncHNfYWQsIGdwc19hZCkpCisJCQkJcGR1X2hhc19kYXRhID0gMTsKKworCQlpZiAocGR1X2hhc19kYXRhKSB7CisJCQlsc3RfcGR1W2xzdF9jbnQrK10gPSBycmxwX3BkdTsKKwkJCXJybHBfcGR1ID0gTlVMTDsKKwkJfQorCX0KKworCS8qIEFsbWFuYWMgKi8KKwlpZiAocmUgJiBSUkxQX0FSX0FMTUFOQUMpIHsKKwkJaSA9IDA7CisJCWRvIHsKKwkJCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX0FMTUFOQUMpKQorCQkJCWJyZWFrOworCisJCQlpZiAoIXJybHBfcGR1KSB7CisJCQkJcnJscF9wZHUgPSBfcnJscF9jcmVhdGVfZ3BzX2Fzc2lzdF9wZHUoMSwgJnJybHBfZ3BzX2FkKTsKKwkJCQlpZiAoIXJybHBfcGR1KSB7CisJCQkJCXJ2ID0gLUVOT01FTTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQl9CisKKwkJCXJ2ID0gX3JybHBfYWRkX2FsbWFuYWMocnJscF9ncHNfYWQsIGdwc19hZCwgJmksIDEwKTsKKwkJCWlmIChydiA8IDApCisJCQkJZ290byBlcnJvcjsKKworCQkJbHN0X3BkdVtsc3RfY250KytdID0gcnJscF9wZHU7CisJCQlycmxwX3BkdSA9IE5VTEw7CisJCX0gd2hpbGUgKHJ2KTsKKwl9CisKKwkvKiBFcGhlbWVyaXMgKi8KKwlpZiAocmUgJiBSUkxQX0FSX0VQSEVNRVJJUykgeworCQlpID0gMDsKKwkJZG8geworCQkJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfRVBIRU1FUklTKSkKKwkJCQlicmVhazsKKworCQkJaWYgKCFycmxwX3BkdSkgeworCQkJCXJybHBfcGR1ID0gX3JybHBfY3JlYXRlX2dwc19hc3Npc3RfcGR1KDEsICZycmxwX2dwc19hZCk7CisJCQkJaWYgKCFycmxwX3BkdSkgeworCQkJCQlydiA9IC1FTk9NRU07CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJfQorCisJCQlydiA9IF9ycmxwX2FkZF9lcGhlbWVyaXMocnJscF9ncHNfYWQsIGdwc19hZCwgJmksIDIsIHJlcS0+ZXBoX3N2cyk7CisKKwkJCWxzdF9wZHVbbHN0X2NudCsrXSA9IHJybHBfcGR1OworCQkJcnJscF9wZHUgPSBOVUxMOworCisJCX0gd2hpbGUgKHJ2KTsKKwl9CisKKwkvKiBTZXJpYWxpemUgJiBSZWxlYXNlIGFsbCBQRFVzICovCisJZm9yIChpPTA7IGk8bHN0X2NudCAmJiBpPG9fbWF4X3BkdXM7IGkrKykgeworCQkvKiBQc2V1ZG8gc2VnbWVudGF0aW9uIGZsYWdzICovCisJCU1vcmVBc3NEYXRhVG9CZVNlbnRfdCAqbWFkID0gY2FsbG9jKDEsIHNpemVvZigqbWFkKSk7CisJCSptYWQgPSAoaSA9PSAobHN0X2NudC0xKSkgPworCQkJCU1vcmVBc3NEYXRhVG9CZVNlbnRfbm9Nb3JlTWVzc2FnZXMgOgorCQkJCU1vcmVBc3NEYXRhVG9CZVNlbnRfbW9yZU1lc3NhZ2VzT25UaGVXYXk7CisJCWxzdF9wZHVbaV0tPmNvbXBvbmVudC5jaG9pY2UuYXNzaXN0YW5jZURhdGEubW9yZUFzc0RhdGFUb0JlU2VudCA9IG1hZDsKKworCQkvKiBTZXJpYWxpemF0aW9uICovCisJCS8vIGFzbl9mcHJpbnQoc3Rkb3V0LCAmYXNuX0RFRl9QRFUsIGxzdF9wZHVbaV0pOworCQlydiA9IHVwZXJfZW5jb2RlX3RvX25ld19idWZmZXIoJmFzbl9ERUZfUERVLCBOVUxMLCBsc3RfcGR1W2ldLCAmb19wZHVbaV0pOworCQlpZiAocnYgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJb19sZW5baV0gPSBydjsKKwl9CisKKwlydiA9IGxzdF9jbnQ7CisKKwkvKiBSZWxlYXNlIEFTTi4xIG9iamVjdHMgKi8KK2Vycm9yOgorCWlmIChycmxwX3BkdSkKKwkJYXNuX0RFRl9QRFUuZnJlZV9zdHJ1Y3QoJmFzbl9ERUZfUERVLCAodm9pZCopcnJscF9wZHUsIDApOworCisJZm9yIChpPTA7IGk8bHN0X2NudDsgaSsrKQorCQlhc25fREVGX1BEVS5mcmVlX3N0cnVjdCgmYXNuX0RFRl9QRFUsIGxzdF9wZHVbaV0sIDApOworCisJcmV0dXJuIHJ2OworfQorCisvKiB9fX0gKi8KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvcnJscC5oIGIvcnJscC1lcGhlbWVyaXMvcnJscC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZTQzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9ycmxwLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIHJybHAuaAorICoKKyAqIFJSTFAgSGVhZGVyCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX1JSTFBfSF9fCisjZGVmaW5lIF9fUlJMUF9IX18KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiZ3BzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBPdXIgaW50ZXJuYWwgc2ltcGxpZmllZCBzdHJ1Y3R1cmUgZm9yIHJlcXVlc3RzICovCisKKyNkZWZpbmUgUlJMUF9BUl9SRUZfTE9DCQkoMTw8MCkKKyNkZWZpbmUgUlJMUF9BUl9SRUZfVElNRQkoMTw8MSkKKyNkZWZpbmUgUlJMUF9BUl9VVENfTU9ERUwJKDE8PDIpCisjZGVmaW5lIFJSTFBfQVJfSU9OT19NT0RFTAkoMTw8MykKKyNkZWZpbmUgUlJMUF9BUl9BTE1BTkFDCQkoMTw8NCkKKyNkZWZpbmUgUlJMUF9BUl9FUEhFTUVSSVMJKDE8PDUpCisKK3N0cnVjdCBycmxwX2Fzc2lzdF9yZXEgeworCXVpbnQzMl90IHJlcV9lbGVtczsKKwl1aW50NjRfdCBlcGhfc3ZzOworfTsKKworCisvKiBNZXRob2RzICovCitpbnQgcnJscF9kZWNvZGVfYXNzaXN0YW5jZV9yZXF1ZXN0KHN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgKmFyLAorCXZvaWQgKnJlcSwgaW50IHJlcV9sZW4pOworCitpbnQgcnJscF9ncHNfYXNzaXN0X3BkdXMoCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkLCBzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxICpyZXEsCisJdm9pZCAqKm9fcGR1LCBpbnQgKm9fbGVuLCBpbnQgb19tYXhfcGR1cyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fUlJMUF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmMgYi9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2QwZjcwCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiB1YngtcGFyc2UuYworICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHBhcnNpbmcgY29kZSBjb252ZXJ0aW5nIFVCWCBtZXNzYWdlcyB0byBHUFMgYXNzaXN0CisgKiBkYXRhCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJncHMuaCIKKyNpbmNsdWRlICJ1YnguaCIKKyNpbmNsdWRlICJ1YngtcGFyc2UuaCIKKworCisvKiBIZWxwZXJzICovCisKK3N0YXRpYyBpbnQKK2Zsb2F0X3RvX2ZpeGVkcG9pbnQoZmxvYXQgZiwgaW50IHNmKQoreworCWlmIChzZiA8IDApIHsKKwkJd2hpbGUgKHNmKysgPCAwKQorCQkJZiAqPSAyLjBmOworCX0gZWxzZSB7CisJCXdoaWxlIChzZi0tID4gMCkKKwkJCWYgKj0gMC41ZjsKKwl9CisKKwlyZXR1cm4gKGludClmOworfQorCitzdGF0aWMgaW5saW5lIGludAorZG91YmxlX3RvX2ZpeGVkcG9pbnQoZG91YmxlIGQsIGludCBzZikKK3sKKwlpZiAoc2YgPCAwKSB7CisJCXdoaWxlIChzZisrIDwgMCkKKwkJCWQgKj0gMi4wOworCX0gZWxzZSB7CisJCXdoaWxlIChzZi0tID4gMCkKKwkJCWQgKj0gMC41OworCX0KKworCXJldHVybiAoaW50KWQ7Cit9CisKKworLyogVUJYIG1lc3NhZ2UgcGFyc2luZyB0byBmaWxsIGdwcyBhc3Npc3QgZGF0YSAqLworCitzdGF0aWMgdm9pZAorX3VieF9tc2dfcGFyc2VfbmF2X3Bvc2xsaChzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCit7CisJc3RydWN0IHVieF9uYXZfcG9zbGxoICpuYXZfcG9zbGxoID0gcGw7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7CisKKwkvL3ByaW50ZigiWy5dIE5BVl9QT1NMTEhcbiIpOworCisJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX1JFRlBPUzsKKworCWdwcy0+cmVmX3Bvcy5sYXRpdHVkZSAgPSAoZG91YmxlKShuYXZfcG9zbGxoLT5sYXQpICogMWUtNzsKKwlncHMtPnJlZl9wb3MubG9uZ2l0dWRlID0gKGRvdWJsZSkobmF2X3Bvc2xsaC0+bG9uKSAqIDFlLTc7CisJZ3BzLT5yZWZfcG9zLmFsdGl0dWRlICA9IChkb3VibGUpKG5hdl9wb3NsbGgtPmhlaWdodCkgKiAxZS0zOworfQorCitzdGF0aWMgdm9pZAorX3VieF9tc2dfcGFyc2VfYWlkX2luaShzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCit7CisJc3RydWN0IHVieF9haWRfaW5pICphaWRfaW5pID0gcGw7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7CisKKwkvL3ByaW50ZigiWy5dIEFJRF9JTklcbiIpOworCisJLyogRXh0cmFjdCBpbmZvIGZvciAiUmVmZXJlbmNlIFRpbWUiICovCisJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX1JFRlRJTUU7CisKKwlncHMtPnJlZl90aW1lLnduID0gYWlkX2luaS0+d247CisJZ3BzLT5yZWZfdGltZS50b3cgPSAoZG91YmxlKWFpZF9pbmktPnRvdyAqIDFlLTM7CisKKwkvLyBGSVhNRTogV2UgY291bGQgZXh0cmFjdCByZWYgcG9zaXRpb24gYXMgd2VsbCBidXQgd2UgbmVlZCBpdCBpbgorCS8vICAgICAgICBXR1M4NCBnZW9kZXRpYyBjb29yZGluYXRlcyBhbmQgaXQncyBwcm92aWRlZCBhcyBlY2VmLCBzbworCS8vICAgICAgICB3ZSBuZWVkIGEgbG90IG9mIG1hdGggLi4uCit9CisKK3N0YXRpYyB2b2lkCitfdWJ4X21zZ19wYXJzZV9haWRfaHVpKHN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBsLCBpbnQgcGxfbGVuLCB2b2lkICp1ZCkKK3sKKwlzdHJ1Y3QgdWJ4X2FpZF9odWkgKmFpZF9odWkgPSBwbDsKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMgPSB1ZDsKKworCS8vcHJpbnRmKCJbLl0gQUlEX0hVSVxuIik7CisKKwlpZiAoYWlkX2h1aS0+ZmxhZ3MgJiAweDIpIHsgLyogVVRDIHBhcmFtZXRlcnMgdmFsaWQgKi8KKwkJc3RydWN0IGdwc191dGNfbW9kZWwgKnV0YyA9ICZncHMtPnV0YzsKKworCQlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfVVRDOworCisJCXV0Yy0+YTAgICAgICAgICAgPSBkb3VibGVfdG9fZml4ZWRwb2ludChhaWRfaHVpLT51dGNfYTAsIC0zMCk7CisJCXV0Yy0+YTEgICAgICAgICAgPSBkb3VibGVfdG9fZml4ZWRwb2ludChhaWRfaHVpLT51dGNfYTEsIC01MCk7CisJCXV0Yy0+ZGVsdGFfdF9scyAgPSBhaWRfaHVpLT51dGNfbHM7CisJCXV0Yy0+dF9vdCAgICAgICAgPSBhaWRfaHVpLT51dGNfdG90ID4+IDEyOworCQl1dGMtPnduX3QgICAgICAgID0gYWlkX2h1aS0+dXRjX3dudDsKKwkJdXRjLT53bl9sc2YgICAgICA9IGFpZF9odWktPnV0Y193bmY7CisJCXV0Yy0+ZG4gICAgICAgICAgPSBhaWRfaHVpLT51dGNfZG47CisJCXV0Yy0+ZGVsdGFfdF9sc2YgPSBhaWRfaHVpLT51dGNfbHNmOworCX0KKworCWlmIChhaWRfaHVpLT5mbGFncyAmIDB4MDQpIHsgLyogS2xvYnVjaGFyIHBhcmFtZXRlcnMgdmFsaWQgKi8KKwkJc3RydWN0IGdwc19pb25vc3BoZXJlX21vZGVsICppb25vID0gJmdwcy0+aW9ub3NwaGVyZTsKKworCQlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfSU9OT1NQSEVSRTsKKworCQlpb25vLT5hbHBoYV8wID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2EwLCAtMzApOworCQlpb25vLT5hbHBoYV8xID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2ExLCAtMjcpOworCQlpb25vLT5hbHBoYV8yID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2EyLCAtMjQpOworCQlpb25vLT5hbHBoYV8zID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2EzLCAtMjQpOworCQlpb25vLT5iZXRhXzAgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYjAsIDExKTsKKwkJaW9uby0+YmV0YV8xID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2IxLCAxNCk7CisJCWlvbm8tPmJldGFfMiA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9iMiwgMTYpOworCQlpb25vLT5iZXRhXzMgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYjMsIDE2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitfdWJ4X21zZ19wYXJzZV9haWRfYWxtKHN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBsLCBpbnQgcGxfbGVuLCB2b2lkICp1ZCkKK3sKKwlzdHJ1Y3QgdWJ4X2FpZF9hbG0gKmFpZF9hbG0gPSBwbDsKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMgPSB1ZDsKKworCS8vcHJpbnRmKCJbLl0gQUlEX0FMTSAlZCAtICVkXG4iLCBhaWRfYWxtLT5zdl9pZCwgYWlkX2FsbS0+Z3BzX3dlZWspOworCisJaWYgKGFpZF9hbG0tPmdwc193ZWVrKSB7CisJCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9BTE1BTkFDOworCQlncHMtPmFsbWFuYWMud25hID0gYWlkX2FsbS0+Z3BzX3dlZWsgJiAweGZmOworCQlncHNfdW5wYWNrX3NmNDVfYWxtYW5hYyhhaWRfYWxtLT5hbG1fd29yZHMsICZncHMtPmFsbWFuYWMuc3ZzW2dwcy0+YWxtYW5hYy5uX3N2KytdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitfdWJ4X21zZ19wYXJzZV9haWRfZXBoKHN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBsLCBpbnQgcGxfbGVuLCB2b2lkICp1ZCkKK3sKKwlzdHJ1Y3QgdWJ4X2FpZF9lcGggKmFpZF9lcGggPSBwbDsKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMgPSB1ZDsKKworCS8vcHJpbnRmKCJbLl0gQUlEX0VQSCAlZCAtICVzXG4iLCBhaWRfZXBoLT5zdl9pZCwgYWlkX2VwaC0+cHJlc2VudCA/ICJwcmVzZW50IiA6ICJub3QgcHJlc2VudCIpOworCisJaWYgKGFpZF9lcGgtPnByZXNlbnQpIHsKKwkJaW50IGkgPSBncHMtPmVwaGVtZXJpcy5uX3N2Kys7CisJCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9FUEhFTUVSSVM7CisJCWdwcy0+ZXBoZW1lcmlzLnN2c1tpXS5zdl9pZCA9IGFpZF9lcGgtPnN2X2lkOworCQlncHNfdW5wYWNrX3NmMTIzKGFpZF9lcGgtPmVwaF93b3JkcywgJmdwcy0+ZXBoZW1lcmlzLnN2c1tpXSk7CisJfQorfQorCisKKy8qIERpc3BhdGNoIHRhYmxlICovCitzdHJ1Y3QgdWJ4X2Rpc3BhdGNoX2VudHJ5IHVieF9wYXJzZV9kdFtdID0geworCVVCWF9ESVNQQVRDSChOQVYsIFBPU0xMSCwgX3VieF9tc2dfcGFyc2VfbmF2X3Bvc2xsaCksCisJVUJYX0RJU1BBVENIKEFJRCwgSU5JLCBfdWJ4X21zZ19wYXJzZV9haWRfaW5pKSwKKwlVQlhfRElTUEFUQ0goQUlELCBIVUksIF91YnhfbXNnX3BhcnNlX2FpZF9odWkpLAorCVVCWF9ESVNQQVRDSChBSUQsIEFMTSwgX3VieF9tc2dfcGFyc2VfYWlkX2FsbSksCisJVUJYX0RJU1BBVENIKEFJRCwgRVBILCBfdWJ4X21zZ19wYXJzZV9haWRfZXBoKSwKK307CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5oIGIvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIxNDc1ZAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiB1YngtcGFyc2UuaAorICoKKyAqIEhlYWRlciBmb3IgcGFyc2luZyBjb2RlIGNvbnZlcnRpbmcgVUJYIG1lc3NhZ2VzIHRvIEdQUyBhc3Npc3QgZGF0YQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19VQlhfUEFSU0VfSF9fCisjZGVmaW5lIF9fVUJYX1BBUlNFX0hfXworCisKKyNpbmNsdWRlICJncHMuaCIKKyNpbmNsdWRlICJ1YnguaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogRGlzcGF0Y2ggdGFibGUgKi8KK2V4dGVybiBzdHJ1Y3QgdWJ4X2Rpc3BhdGNoX2VudHJ5IHVieF9wYXJzZV9kdFtdOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1VCWF9QQVJTRV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvdWJ4LmMgYi9ycmxwLWVwaGVtZXJpcy91YnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2RkMWYwCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvdWJ4LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIHVieC5jCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgZ2VuZXJpYyBVQlggaGVscGVycworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAidWJ4LmgiCisKKworc3RhdGljIHZvaWQKK3VieF9jaGVja3N1bSh1aW50OF90ICpkYXRhLCBpbnQgbGVuLCB1aW50OF90ICpja3N1bSkKK3sKKwlpbnQgaTsKKwl1aW50OF90IGNrMCA9IDAsIGNrMSA9IDA7CisJZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKwkJY2swICs9IGRhdGFbaV07CisJCWNrMSArPSBjazA7CisJfQorCWNrc3VtWzBdID0gY2swOworCWNrc3VtWzFdID0gY2sxOworfQorCisKK3N0YXRpYyB1YnhfbXNnX2hhbmRsZXJfdAordWJ4X2ZpbmRfaGFuZGxlcihzdHJ1Y3QgdWJ4X2Rpc3BhdGNoX2VudHJ5ICpkdCwgdWludDhfdCBtc2dfY2xhc3MsIHVpbnQ4X3QgbXNnX2lkKQoreworCXdoaWxlIChkdC0+aGFuZGxlcikgeworCQlpZiAoKGR0LT5tc2dfY2xhc3MgPT0gbXNnX2NsYXNzKSAmJiAoZHQtPm1zZ19pZCA9PSBtc2dfaWQpKQorCQkJcmV0dXJuIGR0LT5oYW5kbGVyOworCQlkdCsrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCitpbnQKK3VieF9tc2dfZGlzcGF0Y2goc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSAqZHQsCisgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgaW50IGxlbiwgdm9pZCAqdXNlcmRhdGEpCit7CisJc3RydWN0IHVieF9oZHIgKmhkciA9IG1zZzsKKwl1aW50OF90IGNrc3VtWzJdLCAqY2tzdW1fcHRyOworCXVieF9tc2dfaGFuZGxlcl90IGg7CisKKwlpZiAoKGhkci0+c3luY1swXSAhPSBVQlhfU1lOQzApIHx8IChoZHItPnN5bmNbMV0gIT0gVUJYX1NZTkMxKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlshXSBJbnZhbGlkIHN5bmMgYnl0ZXNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJdWJ4X2NoZWNrc3VtKG1zZyArIDIsIHNpemVvZihzdHJ1Y3QgdWJ4X2hkcikgKyBoZHItPnBheWxvYWRfbGVuIC0gMiwgY2tzdW0pOworCWNrc3VtX3B0ciA9IG1zZyArIChzaXplb2Yoc3RydWN0IHVieF9oZHIpICsgaGRyLT5wYXlsb2FkX2xlbik7CisJaWYgKChja3N1bV9wdHJbMF0gIT0gY2tzdW1bMF0pIHx8IChja3N1bV9wdHJbMV0gIT0gY2tzdW1bMV0pKSB7CisJCWZwcmludGYoc3RkZXJyLCAiWyFdIEludmFsaWQgY2hlY2tzdW1cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaCA9IHVieF9maW5kX2hhbmRsZXIoZHQsIGhkci0+bXNnX2NsYXNzLCBoZHItPm1zZ19pZCk7CisJaWYgKGgpCisJCWgoaGRyLCBtc2cgKyBzaXplb2Yoc3RydWN0IHVieF9oZHIpLCBoZHItPnBheWxvYWRfbGVuLCB1c2VyZGF0YSk7CisKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCB1YnhfaGRyKSArIGhkci0+cGF5bG9hZF9sZW4gKyAyOworfQorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YnguaCBiL3JybHAtZXBoZW1lcmlzL3VieC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNjQzODYKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy91YnguaApAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIHVieC5oCisgKgorICogSGVhZGVyIGZvciBVQlggcmVsYXRlZCBzdHVmZgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19VQlhfSF9fCisjZGVmaW5lIF9fVUJYX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogQ29uc3RhbnRzIHVzZWQgaW4gVUJYICovCisKKwkvKiBTeW5jIGJ5dGVzICh0d28gZmlyc3QgYnl0ZXMgb2YgZWFjaCBtZXNzYWdlKSAqLworI2RlZmluZSBVQlhfU1lOQzAJCTB4YjUKKyNkZWZpbmUgVUJYX1NZTkMxCQkweDYyCisKKwkvKiBVQlggbWVzc2FnZXMgY2xhc3NlcyAqLworI2RlZmluZSBVQlhfQ0xBU1NfTkFWCQkweDAxCisjZGVmaW5lIFVCWF9DTEFTU19SWE0JCTB4MDIKKyNkZWZpbmUgVUJYX0NMQVNTX0lORgkJMHgwNAorI2RlZmluZSBVQlhfQ0xBU1NfQUNLCQkweDA1CisjZGVmaW5lIFVCWF9DTEFTU19DRkcJCTB4MDYKKyNkZWZpbmUgVUJYX0NMQVNTX1VQRAkJMHgwOQorI2RlZmluZSBVQlhfQ0xBU1NfTU9OCQkweDBhCisjZGVmaW5lIFVCWF9DTEFTU19BSUQJCTB4MGIKKyNkZWZpbmUgVUJYX0NMQVNTX1RJTQkJMHgwZAorCisJLyogVUJYIG1lc3NhZ2VzIHR5cGUgSUQgKGJ5IGNsYXNzKSAqLworI2RlZmluZSBVQlhfTkFWX1BPU0VDRUYJCTB4MDEKKyNkZWZpbmUgVUJYX05BVl9QT1NMTEgJCTB4MDIKKyNkZWZpbmUgVUJYX05BVl9TVEFUVVMJCTB4MDMKKyNkZWZpbmUgVUJYX05BVl9ET1AJCTB4MDQKKyNkZWZpbmUgVUJYX05BVl9TT0wJCTB4MDYKKyNkZWZpbmUgVUJYX05BVl9QT1NVVE0JCTB4MDgKKyNkZWZpbmUgVUJYX05BVl9WRUxFQ0VGCQkweDExCisjZGVmaW5lIFVCWF9OQVZfVkVMTkVECQkweDEyCisjZGVmaW5lIFVCWF9OQVZfVElNRUdQUwkJMHgyMAorI2RlZmluZSBVQlhfTkFWX1RJTUVVVEMJCTB4MjEKKyNkZWZpbmUgVUJYX05BVl9DTE9DSwkJMHgyMgorI2RlZmluZSBVQlhfTkFWX1NWSU5GTwkJMHgzMAorI2RlZmluZSBVQlhfTkFWX0RHUFMJCTB4MzEKKyNkZWZpbmUgVUJYX05BVl9TQkFTCQkweDMyCisjZGVmaW5lIFVCWF9OQVZfRUtGU1RBVFVTCTB4NDAKKworI2RlZmluZSBVQlhfUlhNX1JBVwkJMHgxMAorI2RlZmluZSBVQlhfUlhNX1NGUkIJCTB4MTEKKyNkZWZpbmUgVUJYX1JYTV9TVlNJCQkweDIwCisjZGVmaW5lIFVCWF9SWE1fU1ZTSV9HUFMJMHgyMAorI2RlZmluZSBVQlhfUlhNX0FMTQkJMHgzMAorI2RlZmluZSBVQlhfUlhNX0VQSAkJMHgzMQorI2RlZmluZSBVQlhfUlhNX1BPU1JFUQkJMHg0MAorCisjZGVmaW5lIFVCWF9JTkZfRVJST1IJCTB4MDAKKyNkZWZpbmUgVUJYX0lORl9XQVJOSU5HCQkweDAxCisjZGVmaW5lIFVCWF9JTkZfTk9USUNFCQkweDAyCisjZGVmaW5lIFVCWF9JTkZfVEVTVAkJMHgwMworI2RlZmluZSBVQlhfSU5GX0RFQlVHCQkweDA0CisjZGVmaW5lIFVCWF9JTkZfVVNFUgkJMHgwNworCisjZGVmaW5lIFVCWF9BQ0tfTkFLCQkweDAwCisjZGVmaW5lIFVCWF9BQ0tfQUNLCQkweDAxCisKKyNkZWZpbmUgVUJYX0NGR19QUlQJCTB4MDAKKyNkZWZpbmUgVUJYX0NGR19VU0IJCTB4MWIKKyNkZWZpbmUgVUJYX0NGR19NU0cJCTB4MDEKKyNkZWZpbmUgVUJYX0NGR19OTUVBCQkweDE3CisjZGVmaW5lIFVCWF9DRkdfUkFURQkJMHgwOAorI2RlZmluZSBVQlhfQ0ZHX0NGRwkJMHgwOQorI2RlZmluZSBVQlhfQ0ZHX1RQCQkweDA3CisjZGVmaW5lIFVCWF9DRkdfTkFWMgkJMHgxYQorI2RlZmluZSBVQlhfQ0ZHX0RBVAkJMHgwNgorI2RlZmluZSBVQlhfQ0ZHX0lORgkJMHgwMgorI2RlZmluZSBVQlhfQ0ZHX1JTVAkJMHgwNAorI2RlZmluZSBVQlhfQ0ZHX1JYTQkJMHgxMQorI2RlZmluZSBVQlhfQ0ZHX0FOVAkJMHgxMworI2RlZmluZSBVQlhfQ0ZHX0ZYTgkJMHgwZQorI2RlZmluZSBVQlhfQ0ZHX1NCQVMJCTB4MTYKKyNkZWZpbmUgVUJYX0NGR19MSUMJCTB4ODAKKyNkZWZpbmUgVUJYX0NGR19UTQkJMHgxMAorI2RlZmluZSBVQlhfQ0ZHX1RNMgkJMHgxOQorI2RlZmluZSBVQlhfQ0ZHX1RNT0RFCQkweDFkCisjZGVmaW5lIFVCWF9DRkdfRUtGCQkweDEyCisKKyNkZWZpbmUgVUJYX1VQRF9ET1dOTAkJMHgwMQorI2RlZmluZSBVQlhfVVBEX1VQTE9BRAkJMHgwMgorI2RlZmluZSBVQlhfVVBEX0VYRUMJCTB4MDMKKyNkZWZpbmUgVUJYX1VQRF9NRU1DUFkJCTB4MDQKKworI2RlZmluZSBVQlhfTU9OX1NDSEQJCTB4MDEKKyNkZWZpbmUgVUJYX01PTl9JTwkJMHgwMgorI2RlZmluZSBVQlhfTU9OX0lQQwkJMHgwMworI2RlZmluZSBVQlhfTU9OX1ZFUgkJMHgwNAorI2RlZmluZSBVQlhfTU9OX0VYQ0VQVAkJMHgwNQorI2RlZmluZSBVQlhfTU9OX01TR1BQCQkweDA2CisjZGVmaW5lIFVCWF9NT05fUlhCVUYJCTB4MDcKKyNkZWZpbmUgVUJYX01PTl9UWEJVRgkJMHgwOAorI2RlZmluZSBVQlhfTU9OX0hXCQkweDA5CisjZGVmaW5lIFVCWF9NT05fVVNCCQkweDBhCisKKyNkZWZpbmUgVUJYX0FJRF9SRVEJCTB4MDAKKyNkZWZpbmUgVUJYX0FJRF9JTkkJCTB4MDEKKyNkZWZpbmUgVUJYX0FJRF9IVUkJCTB4MDIKKyNkZWZpbmUgVUJYX0FJRF9EQVRBCQkweDEwCisjZGVmaW5lIFVCWF9BSURfQUxNCQkweDMwCisjZGVmaW5lIFVCWF9BSURfRVBICQkweDMxCisKKyNkZWZpbmUgVUJYX1RJTV9UUAkJMHgwMQorI2RlZmluZSBVQlhfVElNX1RNCQkweDAyCisjZGVmaW5lIFVCWF9USU1fVE0yCQkweDAzCisjZGVmaW5lIFVCWF9USU1fU1ZJTgkJMHgwNAorCisKKy8qIEhlYWRlciAqLworc3RydWN0IHVieF9oZHIgeworICAgICAgICB1aW50OF90ICBzeW5jWzJdOworICAgICAgICB1aW50OF90ICBtc2dfY2xhc3M7CisgICAgICAgIHVpbnQ4X3QgIG1zZ19pZDsKKyAgICAgICAgdWludDE2X3QgcGF5bG9hZF9sZW47Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIFBheWxvYWQgZm9ybWF0cyAoc29tZSBvZiB0aGVtKSAqLworc3RydWN0IHVieF9uYXZfcG9zbGxoIHsKKwl1aW50MzJfdCBpdG93OworCWludDMyX3QgIGxvbjsJLyogc2NhbGluZyAxZS03ICovCisJaW50MzJfdCAgbGF0OwkvKiBzY2FsaW5nIDFlLTcgKi8KKwlpbnQzMl90ICBoZWlnaHQ7LyogbW0gKi8KKwlpbnQzMl90ICBoc2w7CS8qIG1tICovCisJdWludDMyX3QgaGFjYzsJLyogbW0gKi8KKwl1aW50MzJfdCB2YWNjOwkvKiBtbSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHVieF9haWRfaW5pIHsKKwlpbnQzMl90ICB4OworCWludDMyX3QgIHk7CisJaW50MzJfdCAgejsKKwl1aW50MzJfdCBwb3NhY2M7CisJdWludDE2X3QgdG1fY2ZnOworCXVpbnQxNl90IHduOworCXVpbnQzMl90IHRvdzsKKwlpbnQzMl90ICB0b3dfbnM7CisJdWludDMyX3QgdGFjY19tczsKKwl1aW50MzJfdCB0YWNjX25zOworCWludDMyX3QgIGNsa2Q7CisJdWludDMyX3QgY2xrZGFjYzsKKwl1aW50MzJfdCBmbGFnczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB1YnhfYWlkX2h1aSB7CisJdWludDMyX3QgaGVhbHRoOworCWRvdWJsZSAgIHV0Y19hMTsKKwlkb3VibGUgICB1dGNfYTA7CisJaW50MzJfdCAgdXRjX3RvdDsKKwlpbnQxNl90ICB1dGNfd250OworCWludDE2X3QgIHV0Y19sczsKKwlpbnQxNl90ICB1dGNfd25mOworCWludDE2X3QgIHV0Y19kbjsKKwlpbnQxNl90ICB1dGNfbHNmOworCWludDE2X3QgIHV0Y19zcGFyZTsKKwlmbG9hdCAgICBrbG9iX2EwOworCWZsb2F0ICAgIGtsb2JfYTE7CisJZmxvYXQgICAga2xvYl9hMjsKKwlmbG9hdCAgICBrbG9iX2EzOworCWZsb2F0ICAgIGtsb2JfYjA7CisJZmxvYXQgICAga2xvYl9iMTsKKwlmbG9hdCAgICBrbG9iX2IyOworCWZsb2F0ICAgIGtsb2JfYjM7CisJdWludDMyX3QgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWJ4X2FpZF9hbG0geworCXVpbnQzMl90IHN2X2lkOworCXVpbnQzMl90IGdwc193ZWVrOworCXVpbnQzMl90IGFsbV93b3Jkc1s4XTsJLyogUHJlc2VudCBvbmx5IGlmICdncHNfd2VlaycgIT0gMCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHVieF9haWRfZXBoIHsKKwl1aW50MzJfdCBzdl9pZDsKKwl1aW50MzJfdCBwcmVzZW50OworCXVpbnQzMl90IGVwaF93b3Jkc1syNF07CS8qIFByZXNlbnQgb25seSBpZiAncHJlc2VudCcgIT0gMCAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKiBNZXNzYWdlIGhhbmRsZXIgKi8KK3R5cGVkZWYgdm9pZCAoKnVieF9tc2dfaGFuZGxlcl90KSgKKwlzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwYXlsb2FkLCBpbnQgcGF5bG9hZF9sZW4sIHZvaWQgKnVzZXJkYXRhKTsKKworc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSB7CisJdWludDhfdCBtc2dfY2xhc3M7CisJdWludDhfdCBtc2dfaWQ7CisJdWJ4X21zZ19oYW5kbGVyX3QgaGFuZGxlcjsKK307CisKKyNkZWZpbmUgVUJYX0RJU1BBVENIKGtscyxpZCxoZGwpIHsJCVwKKwkubXNnX2NsYXNzID0gVUJYX0NMQVNTXyAjIyBrbHMgLAlcCisJLm1zZ19pZCA9IFVCWF8gIyMga2xzICMjIF8gIyMgaWQsCVwKKwkuaGFuZGxlciA9IChoZGwpLAkJCVwKK30KKworCisvKiBNZXRob2RzICovCitpbnQgdWJ4X21zZ19kaXNwYXRjaChzdHJ1Y3QgdWJ4X2Rpc3BhdGNoX2VudHJ5ICpkdCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgaW50IGxlbiwgdm9pZCAqdXNlcmRhdGEpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1VCWF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvd2lyZXNoYXJrL2FiaXNfb21sLnBhdGNoIGIvd2lyZXNoYXJrL2FiaXNfb21sLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMTMyMTEKLS0tIC9kZXYvbnVsbAorKysgYi93aXJlc2hhcmsvYWJpc19vbWwucGF0Y2gKQEAgLTAsMCArMSwyMjA5IEBACitGcm9tIDU4NTc1MThiZTg3NjQxZmRhYjQ1ZTU5M2JjOWZkNWVmNTU5NWU2MTkgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CitEYXRlOiBNb24sIDE5IEFwciAyMDEwIDEzOjIzOjUxICswODAwCitTdWJqZWN0OiBbUEFUQ0ggMS8yXSBBZGQgdGhlIEFiaXMgT01MIHBhdGNoLgorCistLS0KKyBlcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uICAgICAgIHwgICAgMSArCisgZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuYyB8IDEzODIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisgZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuaCB8ICA3ODcgKysrKysrKysrKysrKysrKysrKworIDMgZmlsZXMgY2hhbmdlZCwgMjE3MCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBlcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5jCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGVwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmgKKworZGlmZiAtLWdpdCBhL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24gYi9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCitpbmRleCBkYmMzNzI2Li45OGRjZGMzIDEwMDY0NAorLS0tIGEvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorKysrIGIvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorQEAgLTQ4MSw2ICs0ODEsNyBAQCBESVNTRUNUT1JfU1JDID0gXAorIAlwYWNrZXQtZ3NtX2FfZ20uYwkJXAorIAlwYWNrZXQtZ3NtX2FfcnAuYwkJXAorIAlwYWNrZXQtZ3NtX2FfcnIuYwlcCisrCXBhY2tldC1nc21fYWJpc19vbWwuYwlcCisgCXBhY2tldC1nc21faXBhLmMJXAorIAlwYWNrZXQtZ3NtX2Jzc2xhcC5jCQlcCisgCXBhY2tldC1nc21fYnNzbWFwX2xlLmMJXAorZGlmZiAtLWdpdCBhL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5jCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uZmE0NmFiNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuYworQEAgLTAsMCArMSwxMzgyIEBACisrLyogcGFja2V0LWFiaXNfb21sLmMKKysgKiBSb3V0aW5lcyBmb3IgcGFja2V0IGRpc3NlY3Rpb24gb2YgR1NNIEEtYmlzIG92ZXIgSVAgKDNHUFAgVFMgMTIuMjEpCisrICogQ29weXJpZ2h0IDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKysgKiBDb3B5cmlnaHQgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisrICogYmFzZWQgb24gQS1iaXMgT01MIGNvZGUgaW4gT3BlbkJTQworKyAqCisrICogJElkJAorKyAqCisrICogV2lyZXNoYXJrIC0gTmV0d29yayB0cmFmZmljIGFuYWx5emVyCisrICogQnkgR2VyYWxkIENvbWJzIDxnZXJhbGRAd2lyZXNoYXJrLm9yZz4KKysgKiBDb3B5cmlnaHQgMTk5OCBHZXJhbGQgQ29tYnMKKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisrICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAqCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKysgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisrICovCisrCisrI2lmZGVmIEhBVkVfQ09ORklHX0gKKysjIGluY2x1ZGUgImNvbmZpZy5oIgorKyNlbmRpZgorKworKyNpbmNsdWRlIDxnbGliLmg+CisrCisrI2luY2x1ZGUgPGVwYW4vcGFja2V0Lmg+CisrI2luY2x1ZGUgPGVwYW4vZW1lbS5oPgorKyNpbmNsdWRlIDxlcGFuL2xhcGRfc2FwaS5oPgorKyNpbmNsdWRlIDxlcGFuL3ByZWZzLmg+CisrCisrI2luY2x1ZGUgInBhY2tldC1nc21fYWJpc19vbWwuaCIKKysjaW5jbHVkZSAicGFja2V0LWdzbV9hX2NvbW1vbi5oIgorKworKy8qIGluaXRpYWxpemUgdGhlIHByb3RvY29sIGFuZCByZWdpc3RlcmVkIGZpZWxkcyAqLworK3N0YXRpYyBpbnQgcHJvdG9fYWJpc19vbWwgPSAtMTsKKysKKysvKiBPTUwgaGVhZGVyICovCisrc3RhdGljIGludCBoZl9vbWxfbXNnX2Rpc2MgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9wbGFjZW1lbnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9zZXF1ZW5jZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2xlbmd0aCA9IC0xOworKy8qIEZPTSBoZWFkZXIgKi8KKytzdGF0aWMgaW50IGhmX29tbF9mb21fbXNndHlwZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9vYmpjbGFzcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9pbnN0X2J0cyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9pbnN0X3RyeCA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9pbnN0X3RzID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2F0dHJfdGFnID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2F0dHJfbGVuID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2F0dHJfdmFsID0gLTE7CisrLyogRk9NIGF0dHJpYnV0ZXMgKi8KKytzdGF0aWMgaW50IGhmX2F0dHJfYWRtX3N0YXRlID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FyZmNuID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX29wZXJfc3RhdGUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYXZhaWxfc3RhdGUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfZXZlbnRfdHlwZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9zZXZlcml0eSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9iY2NoX2FyZmNuID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2JzaWMgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfdGVzdF9ubyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl90c2MgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfdGVpID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FjaF9idHNwID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FjaF90c2xvdCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9hY2hfc3Nsb3QgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfZ3NtX3RpbWUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfY2hhbl9jb21iID0gLTE7CisrLyogSXBhY2Nlc3MgKi8KKytzdGF0aWMgaW50IGhmX29tbF9pcGFfdHJlc19hdHRyX3RhZyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2lwYV90cmVzX2F0dHJfbGVuID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90ZXN0X3JlcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfcnhsZXYgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2JfcnhsZXYgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2FyZmNuID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9mX3F1YWwgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZfZXJyID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9yeHF1YWwgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZyYW1lX29mZnMgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZyYW1lbnJfb2ZmcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfYnNpYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfY2VsbF9pZCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfc2kyID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9zaTJiaXMgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3NpMnRlciA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfY2hhbl9kZXNjID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9yc2xfaXAgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3JzbF9wb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9wcmltX29tbF9pcCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcHJpbV9vbWxfcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbG9jYXRpb25fbmFtZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdW5pdF9pZCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdW5pdF9uYW1lID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9udl9mbGFncyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnZfbWFzayA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnNsX3Nwb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc2xfZGFkZHIgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX25zbF9kcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnNlaSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnN2Y2kgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX2J2Y2kgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3JhYyA9IC0xOworKworKy8qIGluaXRpYWxpemUgdGhlIHN1YnRyZWUgcG9pbnRlcnMgKi8KKytzdGF0aWMgaW50IGV0dF9vbWwgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9vbWxfZm9tID0gLTE7Cisrc3RhdGljIGludCBldHRfb21sX2ZvbV9hdHQgPSAtMTsKKysKKysvKiBEZWNvZGUgdGhpbmdzIGFzIG5hbm9CVFMgdHJhY2VzICovCisrc3RhdGljIGdib29sZWFuIGdsb2JhbF9vbWxfdXNlX25hbm9fYnRzID0gRkFMU0U7CisrCisrc3RhdGljIHByb3RvX3RyZWUgKnRvcF90cmVlOworKworKy8qIFRTIDEyLjIxIENoYXB0ZXIgOC4xIC8gVFMgMDguNTkgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9tc2dfZGlzY192YWxzW10gPSB7CisrCXsgQUJJU19PTV9NRElTQ19GT00sCSJGb3JtYXR0ZWQgTyZNIiB9LAorKwl7IEFCSVNfT01fTURJU0NfTU1JLAkiTU1JIFRyYW5zZmVyIiB9LAorKwl7IEFCSVNfT01fTURJU0NfVFJBVSwJIlRSQVUgTyZNIiB9LAorKwl7IEFCSVNfT01fTURJU0NfTUFOVUYsCSJNYW51ZmFjdHVyZXIgc3BlY2lmaWMiIH0sCisrfTsKKysKKysvKiBUUyAxMi4yMSBDaGFwdGVyIDguMS4xICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfcGxhY2VtZW50X3ZhbHNbXSA9IHsKKysJeyBBQklTX09NX1BMQUNFTUVOVF9PTkxZLAkiT25seSIgfSwKKysJeyBBQklTX09NX1BMQUNFTUVOVF9GSVJTVCwJIkZpcnN0IiB9LAorKwl7IEFCSVNfT01fUExBQ0VNRU5UX01JRERMRSwJIk1pZGRsZSIgfSwKKysJeyBBQklTX09NX1BMQUNFTUVOVF9MQVNULAkiTGFzdCIgfSwKKyt9OworKworKy8qIFRTIDEyLjIxIENoYXB0ZXIgOS4yICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfZm9tX21zZ3R5cGVfdmFsc1tdID0geworKwl7IE5NX01UX0xPQURfSU5JVCwJCSJTb2Z0d2FyZSBMb2FkIEluaXQiIH0sCisrCXsgTk1fTVRfTE9BRF9JTklUX0FDSywJCSJTb2Z0d2FyZSBMb2FkIEluaXQgQUNLIiB9LAorKwl7IE5NX01UX0xPQURfSU5JVF9OQUNLLAkJIlNvZnR3YXJlIExvYWQgSW5pdCBOQUNLIiB9LAorKwl7IE5NX01UX0xPQURfU0VHLAkJIlNvZnR3YXJlIExvYWQgU2VnbWVudCIgfSwKKysJeyBOTV9NVF9MT0FEX1NFR19BQ0ssCQkiU29mdHdhcmUgTG9hZCBTZWdtZW50IEFDSyIgfSwKKysJeyBOTV9NVF9MT0FEX0VORCwJCSJTb2Z0d2FyZSBMb2FkIEVuZCIgfSwKKysJeyBOTV9NVF9MT0FEX0VORF9BQ0ssCQkiU29mdHdhcmUgTG9hZCBFbmQgQUNLIiB9LAorKwl7IE5NX01UX0xPQURfRU5EX05BQ0ssCQkiU29mdHdhcmUgTG9hZCBFbmQgTkFDSyIgfSwKKysJeyBOTV9NVF9TV19BQ1RfUkVRLAkJIlNvZnR3YXJlIEFjdGl2YXRlIFJlcXVlc3QiIH0sCisrCXsgTk1fTVRfU1dfQUNUX1JFUV9BQ0ssCQkiU29mdHdhcmUgQWN0aXZhdGUgUmVxdWVzdCBBQ0siIH0sCisrCXsgTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAkiU29mdHdhcmUgQWN0aXZhdGUgUmVxdWVzdCBOQUNLIiB9LAorKwl7IE5NX01UX0FDVElWQVRFX1NXLAkJIkFjdGl2YXRlIFNvZnR3YXJlIiB9LAorKwl7IE5NX01UX0FDVElWQVRFX1NXX0FDSywJIkFjdGl2YXRlIFNvZnR3YXJlIEFDSyIgfSwKKysJeyBOTV9NVF9BQ1RJVkFURV9TV19OQUNLLAkiQWN0aXZhdGUgU29mdHdhcmUgTkFDSyIgfSwKKysJeyBOTV9NVF9TV19BQ1RJVkFURURfUkVQLAkiU29mdHdhcmUgQWN0aXZhdGVkIFJlcG9ydCIgfSwKKysJeyBOTV9NVF9FU1RBQkxJU0hfVEVJLAkJIkVzdGFibGlzaCBURUkiIH0sCisrCXsgTk1fTVRfRVNUQUJMSVNIX1RFSV9BQ0ssCSJFc3RhYmxpc2ggVEVJIEFDSyIgfSwKKysJeyBOTV9NVF9FU1RBQkxJU0hfVEVJX05BQ0ssCSJFc3RhYmxpc2ggVEVJIE5BQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1NJR04sCQkiQ29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9TSUdOX0FDSywJIkNvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyBBQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywJIkNvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyBOQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9TSUdOLAkJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfU0lHTl9BQ0ssCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmcgQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9TSUdOX05BQ0ssCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmcgTkFDSyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfVFJBRiwJCSJDb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMiIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1RSQUZfQUNLLAkiQ29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIEFDSyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLLAkiQ29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIE5BQ0siIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1RSQUYsCQkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9UUkFGX0FDSywJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyBBQ0siIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyBOQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fTURST1BfTElOSywJIkNvbm5lY3QgTXVsdGktRHJvcCBMaW5rIiB9LAorKwl7IE5NX01UX0NPTk5fTURST1BfTElOS19BQ0ssCSJDb25uZWN0IE11bHRpLURyb3AgTGluayBBQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCSJDb25uZWN0IE11bHRpLURyb3AgTGluayBOQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfTURST1BfTElOSywJIkRpc2Nvbm5lY3QgTXVsdGktRHJvcCBMaW5rIiB9LAorKwl7IE5NX01UX0RJU0NfTURST1BfTElOS19BQ0ssCSJEaXNjb25uZWN0IE11bHRpLURyb3AgTGluayBBQ0siIH0sCisrCXsgTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCSJEaXNjb25uZWN0IE11bHRpLURyb3AgTGluayBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9CVFNfQVRUUiwJCSJTZXQgQlRTIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfU0VUX0JUU19BVFRSX0FDSywJIlNldCBCVFMgQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX0JUU19BVFRSX05BQ0ssCSJTZXQgQlRTIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfUkFESU9fQVRUUiwJCSJTZXQgUmFkaW8gQ2FycmllciBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX1NFVF9SQURJT19BVFRSX0FDSywJIlNldCBSYWRpbyBDYXJyaWVyIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX1NFVF9SQURJT19BVFRSX05BQ0ssCSJTZXQgUmFkaW8gQ2FycmllciBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX0NIQU5fQVRUUiwJCSJTZXQgQ2hhbm5lbCBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX1NFVF9DSEFOX0FUVFJfQUNLLAkiU2V0IENoYW5uZWwgQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX0NIQU5fQVRUUl9OQUNLLAkiU2V0IENoYW5uZWwgQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX1BFUkZfVEVTVCwJCSJQZXJmb3JtIFRlc3QiIH0sCisrCXsgTk1fTVRfUEVSRl9URVNUX0FDSywJCSJQZXJmb3JtIFRlc3QgQUNLIiB9LAorKwl7IE5NX01UX1BFUkZfVEVTVF9OQUNLLAkJIlBlcmZvcm0gVGVzdCBOQUNLIiB9LAorKwl7IE5NX01UX1RFU1RfUkVQLAkJIlRlc3QgUmVwb3J0IiB9LAorKwl7IE5NX01UX1NFTkRfVEVTVF9SRVAsCQkiU2VuZCBUZXN0IFJlcG9ydCIgfSwKKysJeyBOTV9NVF9TRU5EX1RFU1RfUkVQX0FDSywJIlNlbmQgVGVzdCBSZXBvcnQgQUNLIiB9LAorKwl7IE5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywJIlNlbmQgVGVzdCBSZXBvcnQgTkFDSyIgfSwKKysJeyBOTV9NVF9TVE9QX1RFU1QsCQkiU3RvcCBUZXN0IiB9LAorKwl7IE5NX01UX1NUT1BfVEVTVF9BQ0ssCQkiU3RvcCBUZXN0IEFDSyIgfSwKKysJeyBOTV9NVF9TVE9QX1RFU1RfTkFDSywJCSJTdG9wIFRlc3QgTkFDSyIgfSwKKysJeyBOTV9NVF9TVEFURUNIR19FVkVOVF9SRVAsCSJTdGF0ZSBDaGFuZ2VkIEV2ZW50IFJlcG9ydCIgfSwKKysJeyBOTV9NVF9GQUlMVVJFX0VWRU5UX1JFUCwJIkZhaWx1cmUgRXZlbnQgUmVwb3J0IiB9LAorKwl7IE5NX01UX1NUT1BfRVZFTlRfUkVQLAkJIlN0b3AgU2VuZGluZyBFdmVudCBSZXBvcnRzIiB9LAorKwl7IE5NX01UX1NUT1BfRVZFTlRfUkVQX0FDSywJIlN0b3AgU2VuZGluZyBFdmVudCBSZXBvcnRzIEFDSyIgfSwKKysJeyBOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAkiU3RvcCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMgTkFDSyIgfSwKKysJeyBOTV9NVF9SRVNUX0VWRU5UX1JFUCwJCSJSZXN0YXJ0IFNlbmRpbmcgRXZlbnQgUmVwb3J0cyIgfSwKKysJeyBOTV9NVF9SRVNUX0VWRU5UX1JFUF9BQ0ssCSJSZXN0YXJ0IFNlbmRpbmcgRXZlbnQgUmVwb3J0cyBBQ0siIH0sCisrCXsgTk1fTVRfUkVTVF9FVkVOVF9SRVBfTkFDSywJIlJlc3RhcnQgU2VuZGluZyBFdmVudCBSZXBvcnRzIE5BQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURSwJCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUiIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0ssCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgQUNLIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfTkFDSywJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBOQUNLIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfUkVRLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIFJlcXVlc3QiIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfQUNLLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIFJlcXVlc3QgQUNLIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfUkVRX05BQ0ssCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgUmVxdWVzdCBOQUNLIiB9LAorKwl7IE5NX01UX1JFUF9PVVRTVF9BTEFSTVMsCSJSZXBvcnQgT3V0c3RhbmRpbmcgQWxhcm1zIiB9LAorKwl7IE5NX01UX1JFUF9PVVRTVF9BTEFSTVNfQUNLLAkiUmVwb3J0IE91dHN0YW5kaW5nIEFsYXJtcyBBQ0siIH0sCisrCXsgTk1fTVRfUkVQX09VVFNUX0FMQVJNU19OQUNLLAkiUmVwb3J0IE91dHN0YW5kaW5nIEFsYXJtcyBOQUNLIiB9LAorKwl7IE5NX01UX0NIQU5HRU9WRVIsCQkiQ2hhbmdlb3ZlciIgfSwKKysJeyBOTV9NVF9DSEFOR0VPVkVSX0FDSywJCSJDaGFuZ2VvdmVyIEFDSyIgfSwKKysJeyBOTV9NVF9DSEFOR0VPVkVSX05BQ0ssCSJDaGFuZ2VvdmVyIE5BQ0siIH0sCisrCXsgTk1fTVRfT1BTVEFSVCwJCSJPcHN0YXJ0IiB9LAorKwl7IE5NX01UX09QU1RBUlRfQUNLLAkJIk9wc3RhcnQgQUNLIiB9LAorKwl7IE5NX01UX09QU1RBUlRfTkFDSywJCSJPcHN0YXJ0IE5BQ0siIH0sCisrCXsgTk1fTVRfUkVJTklULAkJCSJSZWluaXRpYWxpemUiIH0sCisrCXsgTk1fTVRfUkVJTklUX0FDSywJCSJSZWluaXRpYWxpemUgQUNLIiB9LAorKwl7IE5NX01UX1JFSU5JVF9OQUNLLAkJIlJlaW5pdGlhbGl6ZSBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9TSVRFX09VVCwJCSJTZXQgU2l0ZSBPdXRwdXRzIiB9LAorKwl7IE5NX01UX1NFVF9TSVRFX09VVF9BQ0ssCSJTZXQgU2l0ZSBPdXRwdXRzIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfU0lURV9PVVRfTkFDSywJIlNldCBTaXRlIE91dHB1dHMgTkFDSyIgfSwKKysJeyBOTV9NVF9DSEdfSFdfQ09ORiwJCSJDaGFuZ2UgSFcgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9NVF9DSEdfSFdfQ09ORl9BQ0ssCSJDaGFuZ2UgSFcgQ29uZmlndXJhdGlvbiBBQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0hXX0NPTkZfTkFDSywJIkNoYW5nZSBIVyBDb25maWd1cmF0aW9uIE5BQ0siIH0sCisrCXsgTk1fTVRfTUVBU19SRVNfUkVRLAkJIk1lYXN1cmVtZW50IFJlc3VsdCBSZXF1ZXN0IiB9LAorKwl7IE5NX01UX01FQVNfUkVTX1JFU1AsCQkiTWVhc3VyZW1lbnQgUmVzdWx0IFJlc3BvbnNlIiB9LAorKwl7IE5NX01UX1NUT1BfTUVBUywJCSJTdG9wIE1lYXN1cmVtZW50IiB9LAorKwl7IE5NX01UX1NUQVJUX01FQVMsCQkiU3RhcnQgTWVhc3VyZW1lbnQiIH0sCisrCXsgTk1fTVRfR0VUX0FUVFIsCQkiR2V0IEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfR0VUX0FUVFJfUkVTUCwJCSJHZXQgQXR0cmlidXRlcyBSZXNwb25zZSIgfSwKKysJeyBOTV9NVF9HRVRfQVRUUl9OQUNLLAkJIkdldCBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX0FMQVJNX1RIUkVTLAkiU2V0IEFsYXJtIFRocmVzaG9sZCIgfSwKKysJeyBOTV9NVF9TRVRfQUxBUk1fVEhSRVNfQUNLLAkiU2V0IEFsYXJtIFRocmVzaG9sZCBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0ssCSJTZXQgQWxhcm0gVGhyZXNob2xkIE5BQ0siIH0sCisrCS8qIHByb3ByaWV0YXJ5LCBub3QgaW4gdGhlIHN0YW5kYXJkICovCisrCXsgTk1fTVRfSVBBQ0NfUkVTVEFSVCwJCSJJUEEgUmVzdGFydCIgfSwKKysJeyBOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSywJIklQQSBSZXN0YXJ0IEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVCwJIklQQSBSU0wgQ29ubmVjdCIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9BQ0ssCSJJUEEgUlNMIENvbm5lY3QgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0ssCSJJUEEgUlNMIENvbm5lY3QgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVCwJIklQQSBSU0wgRGlzY29ubmVjdCIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVF9BQ0ssICJJUEEgUlNMIERpc2Nvbm5lY3QgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX05BQ0ssICJJUEEgUlNMIERpc2Nvbm5lY3QgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19DT05OX1RSQUYsCSJJUEEgQ29ubmVjdCBUcmFmZmljIiB9LAorKwl7IE5NX01UX0lQQUNDX0NPTk5fVFJBRl9BQ0ssCSJJUEEgQ29ubmVjdCBUcmFmZmljIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19DT05OX1RSQUZfTkFDSywJIklQQSBDb25uZWN0IFRyYWZmaWMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ESVNDX1RSQUYsCSJJUEEgRGlzY29ubmVjdCBUcmFmZmljIiB9LAorKwl7IE5NX01UX0lQQUNDX0RJU0NfVFJBRl9BQ0ssCSJJUEEgRGlzY29ubmVjdCBUcmFmZmljIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ESVNDX1RSQUZfTkFDSywJIklQQSBEaXNjb25uZWN0IFRyYWZmaWMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ERUZfQk9PVF9TVywJIklQQSBEZWZhdWx0IEJvb3QgU29mdHdhcmUiIH0sCisrCXsgTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfQUNLLAkiSVBBIERlZmF1bHQgQm9vdCBTb2Z0d2FyZSBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfTkFDSywJIklQQSBEZWZhdWx0IEJvb3QgU29mdHdhcmUgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSLAkiSVBBIFNldCBOVlJBTSBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLLAkiSVBBIFNldCBOVlJBTSBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0ssCSJJUEEgU2V0IE5WUkFNIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSLAkiSVBBIEdldCBOVlJBTSBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX0lQQUNDX0dFVF9OVkFUVFJfQUNLLAkiSVBBIEdldCBOVlJBTSBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX05BQ0ssCSJJUEEgR2V0IE5WUkFNIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfQVRUUiwJCSJJUEEgU2V0IEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX0FUVFJfQUNLLAkiSVBBIFNldCBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLLAkiSVBBIFNldCBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfQVRUUl9DSEdfRVZULAkiSVBBIEF0dHJpYnV0ZSBDaGFuZ2UgRXZlbnQiIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1dfREVBQ1QsCQkiSVBBIFNvZnR3YXJlIERlYWN0aXZhdGUiIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1dfREVBQ1RfQUNLLAkiSVBBIFNvZnR3YXJlIERlYWN0aXZhdGUgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NXX0RFQUNUX05BQ0ssCSJJUEEgU29mdHdhcmUgRGVhY3RpdmF0ZSBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX01FQVNfUkVTX1JFUV9OQUNLLCJJUEEgTWVhc3VyZW1lbnQgUmVzdWx0IFJlcXVlc3QgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TVEFSVF9NRUFTX05BQ0ssCSJJUEEgU3RhcnQgTWVhc3VyZW1lbnQgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TVE9QX01FQVNfTkFDSywJIklQQSBTdG9wIE1lYXN1cmVtZW50IE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9SRVNFVF9SRVNPVVJDRSwJIlNJRSBSZXNldCBSZXNvdXJjZSIgfSwKKysJeyBOTV9NVF9CUzExX0JFR0lOX0RCX1RYLAkiU0lFIEJlZ2luIERhdGFiYXNlIFRyYW5zbWlzc2lvbiIgfSwKKysJeyBOTV9NVF9CUzExX0JFR0lOX0RCX1RYX0FDSywJIlNJRSBCZWdpbiBEYXRhYmFzZSBUcmFuc21pc3Npb24gQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfQkVHSU5fREJfVFhfTkFDSywJIlNJRSBCZWdpbiBEYXRhYmFzZSBUcmFuc21pc3Npb24gTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0VORF9EQl9UWCwJCSJTSUUgRW5kIERhdGFiYXNlIFRyYW5zbWlzc2lvbiIgfSwKKysJeyBOTV9NVF9CUzExX0VORF9EQl9UWF9BQ0ssCSJTSUUgRW5kIERhdGFiYXNlIFRyYW5zbWlzc2lvbiBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywJIlNJRSBFbmQgRGF0YWJhc2UgVHJhbnNtaXNzaW9uIE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9DUkVBVEVfT0JKLAkiU0lFIENyZWF0ZSBPYmplY3QiIH0sCisrCXsgTk1fTVRfQlMxMV9DUkVBVEVfT0JKX0FDSywJIlNJRSBDcmVhdGUgT2JqZWN0IEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0NSRUFURV9PQkpfTkFDSywJIlNJRSBDcmVhdGUgT2JqZWN0IE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9ERUxFVEVfT0JKLAkiU0lFIERlbGV0ZSBPYmplY3QiIH0sCisrCXsgTk1fTVRfQlMxMV9ERUxFVEVfT0JKX0FDSywJIlNJRSBEZWxldGUgT2JqZWN0IEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0RFTEVURV9PQkpfTkFDSywJIlNJRSBEZWxldGUgT2JqZWN0IE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9HRVRfU1RBVEUsCQkiU0lFIEdldCBTdGF0ZSIgfSwKKysJeyBOTV9NVF9CUzExX0dFVF9TVEFURV9BQ0ssCSJTSUUgR2V0IFN0YXRlIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0xNVF9MT0dPTiwJCSJTSUUgTE1UIExvZ29uIiB9LAorKwl7IE5NX01UX0JTMTFfTE1UX0xPR09OX0FDSywJIlNJRSBMTVQgTG9nb24gQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfUkVTVEFSVCwJCSJTSUUgUmVzdGFydCIgfSwKKysJeyBOTV9NVF9CUzExX1JFU1RBUlRfQUNLLAkiU0lFIFJlc3RhcnQgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfRElTQ09OTkVDVCwJIlNJRSBEaXNjb25uZWN0IEJUUyIgfSwKKysJeyBOTV9NVF9CUzExX0RJU0NPTk5FQ1RfQUNLLAkiU0lFIERpc2Nvbm5lY3QgQlRTIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0xNVF9MT0dPRkYsCSJTSUUgTE1UIExvZ29mZiIgfSwKKysJeyBOTV9NVF9CUzExX0xNVF9MT0dPRkZfQUNLLAkiU0lFIExNVCBMb2dvZmYgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfUkVDT05ORUNULAkJIlNJRSBSZWNvbm5lY3QgQlRTIiB9LAorKwl7IE5NX01UX0JTMTFfUkVDT05ORUNUX0FDSywJIlNJRSBSZWNvbm5lY3QgQlRTIEFDSyIgfSwKKyt9OworKworKy8qIFRTIDEyLjIxIFNlY3Rpb24gOS4yOiBPYmplY3QgQ2xhc3MgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9mb21fb2JqY2xhc3NfdmFsc1tdID0geworKwl7IE5NX09DX1NJVEVfTUFOQUdFUiwJCSJCVFMgU2l0ZSBNYW5hZ2VyIiB9LAorKwl7IE5NX09DX0JUUywJCQkiQlRTIiB9LAorKwl7IE5NX09DX1JBRElPX0NBUlJJRVIsCQkiUmFkaW8gQ2FycmllciIgfSwKKysJeyBOTV9PQ19DSEFOTkVMLAkJIlJhZGlvIENoYW5uZWwiIH0sCisrCXsgTk1fT0NfQkFTRUJfVFJBTlNDLAkJIkJhc2ViYW5kIFRyYW5zY2VpdmVyIiB9LAorKwkvKiBwcm9wcmlldGFyeSwgdmVuZG9yIHNwZWNpZmljICovCisrCXsgTk1fT0NfQlMxMV9BREpDLAkJIlNJRSBBZGphY2VuZCBDaGFubmVsIiB9LAorKwl7IE5NX09DX0JTMTFfSEFORE9WRVIsCQkiU0lFIEhhbmRvdmVyIiB9LAorKwl7IE5NX09DX0JTMTFfUFdSX0NUUkwsCQkiU0lFIFBvd2VyIENvbnRyb2wiIH0sCisrCXsgTk1fT0NfQlMxMV9CVFNFLAkJIlNJRSBCVFNFIiB9LAorKwl7IE5NX09DX0JTMTFfUkFDSywJCSJTSUUgUmFjayIgfSwKKysJeyBOTV9PQ19CUzExLAkJCSJTSUUgU2llbWVuc0hXIiB9LAorKwl7IE5NX09DX0JTMTFfVEVTVCwJCSJTSUUgVGVzdCIgfSwKKysJeyBOTV9PQ19CUzExX0VOVkFCVFNFLAkJIlNJRSBFbnZhQlRTRSIgfSwKKysJeyBOTV9PQ19CUzExX0JQT1JULAkJIlNJRSBCUG9ydCIgfSwKKysJeyBOTV9PQ19HUFJTX05TRSwJCSJHUFJTIE5TRSIgfSwKKysJeyBOTV9PQ19HUFJTX0NFTEwsCQkiR1BSUyBDZWxsIiB9LAorKwl7IE5NX09DX0dQUlNfTlNWQzAsCQkiR1BSUyBOU1ZDMCIgfSwKKysJeyBOTV9PQ19HUFJTX05TVkMxLAkJIkdQUlMgTlNWQzEiIH0sCisrCXsgTk1fT0NfTlVMTCwJCQkiTlVMTCIgfSwKKyt9OworKworKy8qIFRTIDEyLjIxIFNlY3Rpb24gOS40OiBBdHRyaWJ1dGVzICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfZm9tX2F0dHJfdmFsc1tdID0geworKwl7IE5NX0FUVF9BQklTX0NIQU5ORUwsCQkiQS1iaXMgQ2hhbm5lbCIgfSwKKysJeyBOTV9BVFRfQUREX0lORk8sCQkiQWRkaXRpb25hbCBJbmZvcm1hdGlvbiIgfSwKKysJeyBOTV9BVFRfQUREX1RFWFQsCQkiQWRkaXRpb25hbCBUZXh0IiB9LAorKwl7IE5NX0FUVF9BRE1fU1RBVEUsCQkiQWRtaW5pc3RyYXRpdmUgU3RhdGUiIH0sCisrCXsgTk1fQVRUX0FSRkNOX0xJU1QsCQkiQVJGQ04gTGlzdCIgfSwKKysJeyBOTV9BVFRfQVVUT05fUkVQT1JULAkJIkF1dG9ub21vdXNseSBSZXBvcnQiIH0sCisrCXsgTk1fQVRUX0FWQUlMX1NUQVRVUywJCSJBdmFpbGFiaWxpdHkgU3RhdHVzIiB9LAorKwl7IE5NX0FUVF9CQ0NIX0FSRkNOLAkJIkJDQ0ggQVJGQ04iIH0sCisrCXsgTk1fQVRUX0JTSUMsCQkJIkJTSUMiIH0sCisrCXsgTk1fQVRUX0JUU19BSVJfVElNRVIsCQkiQlRTIEFpciBUaW1lciIgfSwKKysJeyBOTV9BVFRfQ0NDSF9MX0lfUCwJCSJDQ0NIIExvYWQgSW5kaWNhdGlvbiBQZXJpb2QiIH0sCisrCXsgTk1fQVRUX0NDQ0hfTF9ULAkJIkNDQ0ggTG9hZCBUaHJlc2hvbGQiIH0sCisrCXsgTk1fQVRUX0NIQU5fQ09NQiwJCSJDaGFubmVsIENvbWJpbmF0aW9uIiB9LAorKwl7IE5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwJIkNvbm5lY3Rpb24gRmFpbCBDcml0ZXJpb24iIH0sCisrCXsgTk1fQVRUX0RFU1QsCQkJIkRlc3RpbmF0aW9uIiB9LAorKwl7IE5NX0FUVF9FVkVOVF9UWVBFLAkJIkV2ZW50IFR5cGUiIH0sCisrCXsgTk1fQVRUX0ZJTEVfSUQsCQkiRmlsZSBJRCIgfSwKKysJeyBOTV9BVFRfRklMRV9WRVJTSU9OLAkJIkZpbGUgVmVyc2lvbiIgfSwKKysJeyBOTV9BVFRfR1NNX1RJTUUsCQkiR1NNIFRpbWUiIH0sCisrCXsgTk1fQVRUX0hTTiwJCQkiSFNOIiB9LAorKwl7IE5NX0FUVF9IV19DT05GSUcsCQkiSFcgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSFdfREVTQywJCSJIVyBEZXNjcmlwdGlvbiIgfSwKKysJeyBOTV9BVFRfSU5UQVZFX1BBUkFNLAkJIkludGF2ZSBQYXJhbWV0ZXIiIH0sCisrCXsgTk1fQVRUX0lOVEVSRl9CT1VORCwJCSJJbnRlcmZlcmVuY2UgQm91bmRhcmllcyIgfSwKKysJeyBOTV9BVFRfTElTVF9SRVFfQVRUUiwJCSJMaXN0IG9mIHJlcXVpcmVkIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fQVRUX01BSU8sCQkJIk1BSU8iIH0sCisrCXsgTk1fQVRUX01BTlVGX1NUQVRFLAkJIk1hbnVmYWN0dXJlciBEZXBlbmRlbnQgU3RhdGUiIH0sCisrCXsgTk1fQVRUX01BTlVGX1RIUkVTSCwJCSJNYW51ZmFjdHVyZXIgRGVwZW5kZW50IFRocmVzaG9sZHMiIH0sCisrCXsgTk1fQVRUX01BTlVGX0lELAkJIk1hbnVmYWN0dXJlciBJZCIgfSwKKysJeyBOTV9BVFRfTUFYX1RBLAkJIk1heGltdW0gVGltaW5nIEFkdmFuY2UiIH0sCisrCXsgTk1fQVRUX01EUk9QX0xJTkssCQkiTXVsdGktZHJvcCBCU0MgTGluayIgfSwKKysJeyBOTV9BVFRfTURST1BfTkVYVCwJCSJNdWx0aS1kcm9wIG5leHQgQlRTIExpbmsiIH0sCisrCXsgTk1fQVRUX05BQ0tfQ0FVU0VTLAkJIk5BQ0sgQ2F1c2VzIiB9LAorKwl7IE5NX0FUVF9OWTEsCQkJIk55MSIgfSwKKysJeyBOTV9BVFRfT1BFUl9TVEFURSwJCSJPcGVyYXRpb25hbCBTdGF0ZSIgfSwKKysJeyBOTV9BVFRfT1ZFUkxfUEVSSU9ELAkJIk92ZXJsb2FkIFBlcmlvZCIgfSwKKysJeyBOTV9BVFRfUEhZU19DT05GLAkJIlBoeXNpY2FsIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfUE9XRVJfQ0xBU1MsCQkiUG93ZXIgQ2xhc3MiIH0sCisrCXsgTk1fQVRUX1BPV0VSX1RIUkVTSCwJCSJQb3dlciBPdXRwdXQgVGhyZXNob2xkcyIgfSwKKysJeyBOTV9BVFRfUFJPQl9DQVVTRSwJCSJQcm9iYWJsZSBDYXVzZSIgfSwKKysJeyBOTV9BVFRfUkFDSF9CX1RIUkVTSCwJCSJSQUNIIEJ1c3kgVGhyZXNob2xkIiB9LAorKwl7IE5NX0FUVF9MREFWR19TTE9UUywJCSJSQUNIIExvYWQgQXZlcmFnaW5nIFNsb3RzIiB9LAorKwl7IE5NX0FUVF9SQURfU1VCQywJCSJSYWRpbyBTdWIgQ2hhbm5lbCIgfSwKKysJeyBOTV9BVFRfUkZfTUFYUE9XUl9SLAkJIlJGIE1heCBQb3dlciBSZWR1Y3Rpb24iIH0sCisrCXsgTk1fQVRUX1NJVEVfSU5QVVRTLAkJIlNpdGUgSW5wdXRzIiB9LAorKwl7IE5NX0FUVF9TSVRFX09VVFBVVFMsCQkiU2l0ZSBPdXRwdXRzIiB9LAorKwl7IE5NX0FUVF9TT1VSQ0UsCQkiU291cmNlIiB9LAorKwl7IE5NX0FUVF9TUEVDX1BST0IsCQkiU3BlY2lmaWMgUHJvYmxlbXMiIH0sCisrCXsgTk1fQVRUX1NUQVJUX1RJTUUsCQkiU3RhcnRpbmcgVGltZSIgfSwKKysJeyBOTV9BVFRfVDIwMCwJCQkiVDIwMCIgfSwKKysJeyBOTV9BVFRfVEVJLAkJCSJURUkiIH0sCisrCXsgTk1fQVRUX1RFU1RfRFVSLAkJIlRlc3QgRHVyYXRpb24iIH0sCisrCXsgTk1fQVRUX1RFU1RfTk8sCQkiVGVzdCBObyIgfSwKKysJeyBOTV9BVFRfVEVTVF9SRVBPUlQsCQkiVGVzdCBSZXBvcnQgSW5mbyIgfSwKKysJeyBOTV9BVFRfVlNXUl9USFJFU0gsCQkiVlNXUiBUaHJlc2hvbGRzICIgfSwKKysJeyBOTV9BVFRfV0lORE9XX1NJWkUsCQkiV2luZG93IFNpemUiIH0sCisrCXsgTk1fQVRUX0JTMTFfUlNTSV9PRkZTLAkiU0lFIFJTU0kgT2Zmc2V0IiB9LAorKwl7IE5NX0FUVF9CUzExX1RYUFdSLAkJIlNJRSBUWCBQb3dlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9ESVZFUlNJVFksCSJTSUUgRGl2ZXJzaXR5IiB9LAorKwl7IE5NX0FUVF9UU0MsCQkJIlRyYWluaW5nIFNlcXVlbmNlIENvZGUiIH0sCisrCXsgTk1fQVRUX1NXX0NPTkZJRywJCSJTVyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9TV19ERVNDUiwJCSJTVyBEZXNjcmlwdGlvbiIgfSwKKysJeyBOTV9BVFRfU0VWRVJJVFksCQkiUGVyY2VpdmVkIFNldmVyaXR5IiB9LAorKwl7IE5NX0FUVF9HRVRfQVJJLAkJIkdldCBBUkkiIH0sCisrCXsgTk1fQVRUX0hXX0NPTkZfQ0hHLAkJIkhXIENvbmZpZ3VyYXRpb24gQ2hhbmdlIiB9LAorKwl7IE5NX0FUVF9PVVRTVF9BTEFSTSwJCSJPdXRzdGFuZGluZyBBbGFybSIgfSwKKysJeyBOTV9BVFRfRklMRV9EQVRBLAkJIkZpbGUgRGF0YSIgfSwKKysJeyBOTV9BVFRfTUVBU19SRVMsCQkiTWVhc3VyZW1lbnQgUmVzdWx0IiB9LAorKwl7IE5NX0FUVF9NRUFTX1RZUEUsCQkiTWVhc3VyZW1lbnQgVHlwZSIgfSwKKysJeyBOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OTywJIlNJRSBFU04gRlcgQ29kZSBOdW1iZXIiIH0sCisrCXsgTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8sCSJTSUUgRVNOIEhXIENvZGUgTnVtYmVyIiB9LAorKwl7IE5NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMLAkiU0lFIEVTTiBQQ0IgU2VyaWFsIE51bWJlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UsICJTSUUgRXhjZXNzaXZlIERpc3RhbmNlIiB9LAorKwl7IE5NX0FUVF9CUzExX0FMTF9URVNUX0NBVEcsCSJTSUUgQWxsIFRlc3QgQ2F0ZWdvcmllcyIgfSwKKysJeyBOTV9BVFRfQlMxMV9CVFNMU19IT1BQSU5HLAkiU0lFIEJUUyBMUyBIb3BwaW5nIiB9LAorKwl7IE5NX0FUVF9CUzExX0NFTExfQUxMT0NfTlIsCSJTSUUgQ2VsbCBBbGxvY2F0aW9uIE51bWJlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9DRUxMX0dMT0JBTF9JRCwJIlNJRSBDZWxsIEdsb2JhbCBJRCIgfSwKKysJeyBOTV9BVFRfQlMxMV9FTkFfSU5URVJGX0NMQVNTLAkiU0lFIEVuYWJsZSBJbnRlcmZlcmVuY2UgQ2xhc3MiIH0sCisrCS8qIEZJWE1FICovCisrCXsgTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMLAkiU0lFIEVuYWJsZSBNUyBQb3dlciBDb250cm9sIiB9LAorKwl7IE5NX0FUVF9CUzExX0VOQV9QV1JfQkRHVF9ITywJIlNJRSBFbmFibGUgUG93ZXIgQnVkZ2V0IEhPIiB9LAorKwl7IE5NX0FUVF9CUzExX0VOQV9SWExFVl9ITywJIlNJRSBFbmFibGUgUnhMZXZlbCBITyIgfSwKKysJeyBOTV9BVFRfQlMxMV9FTkFfUlhRVUFMX0hPLAkiU0lFIEVuYWJsZSBSeFF1YWwgSE8iIH0sCisrCXsgTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTCwJIlNJRSBGQUNDSCBRdWFsaXR5IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19EU1RfSVAsCQkiSVBBIERlc3RpbmF0aW9uIElQIEFkZHJlc3MiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JULAkiSVBBIERlc3Rpb25hdGlvbiBJUCBQb3J0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TU1JDLAkJIklQQSBSVFAgU1NSQyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUlRQX1BBWUxEX1RZUEUsCSJJUEEgUlRQIFBheWxvYWQgVHlwZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQkFTRUJfSUQsCSJJUEEgQmFzZWJhbmQgSWRlbnRpZmllciIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU1RSRUFNX0lELAkiSVBBIFN0cmVhbSBJZGVudGlmaWVyIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OVl9GTEFHUywJIklQQSBOVlJBTSBGbGFncyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMLAkiSVBBIEZyZXF1ZW5jeSBDb250cm9sIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkcsCSJJUEEgUHJpbWFyeSBPTUwgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TRUNfT01MX0NGRywJIklQQSBTZWNvbmRhcnkgT01MIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSVBfSUZfQ0ZHLAkiSVBBIElQIEludGVyZmFjZSBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX0lQX0dXX0NGRywJIklQQSBJUCBHYXRld2F5IENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSU5fU0VSVl9USU1FLAkiSVBBIEluIFNlcnZpY2UgVGltZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVFJYX0JUU19BU1MsCSJJUEEgVFJYIEJUUyBBc3NpZ25tZW50IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19MT0NBVElPTiwJIklQQSBCVFMgTG9jYXRpb24gTmFtZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGRywJIklQQSBQYWdpbmcgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfRklMRV9EQVRBLAkiSVBBIEZpbGUgRGF0YSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVU5JVF9JRCwJCSJJUEEgVW5pdCBJRCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUEFSRU5UX1VOSVRfSUQsCSJJUEEgUGFyZW50IFVuaXQgSUQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1VOSVRfTkFNRSwJIklQQSBVbml0IE5hbWUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NOTVBfQ0ZHLAkiSVBBIFNOTVAgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVCwgIklQQSBQcmltYXJ5IE9NTCBDb25maWcgTGlzdCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfRkJfVE9VVCwiSVBBIFByaW1hcnkgT01MIEZhbGxiYWNrIFRpbWVvdXQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0NVUl9TV19DRkcsCSJJUEEgQ3VycmVudCBTb2Z0d2FyZSBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX1RJTUlOR19CVVMsCSJJUEEgVGltaW5nIEJ1cyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQ0dJLAkJIklQQSBDR0kiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JBQywJCSJJUEEgUkFDIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTiwJIklQQSBPYmplY3QgVmVyc2lvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHLAkiSVBBIEdQUlMgUGFnaW5nIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX05TRUksCQkiSVBBIE5TRUkiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0JWQ0ksCQkiSVBBIEJWQ0kiIH0sCisrCXsgTk1fQVRUX0lQQUNDX05TVkNJLAkJIklQQSBOU1ZDSSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlNfQ0ZHLAkJIklQQSBOUyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19CU1NHUF9DRkcsCSJJUEEgQlNTR1AgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkcsCSJJUEEgTlMgTGluayBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19STENfQ0ZHLAkJIklQQSBSTEMgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNULAkiSVBBIEFsYXJtIFRocmVzaG9sZCBMaXN0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19NT05JVF9WQUxfTElTVCwJIklQQSBNb25pdG9yZWQgVmFsdWUgTGlzdCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVElCX0NPTlRST0wsCSJJUEEgVGltaW5nIEludGVyZmFjZSBCdXMgQ29udHJvbCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFUywJIklQQSBTdXBwb3J0ZWQgRmVhdHVyZXMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTLAkiSVBBIENvZGluZyBTY2hlbWVzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19STENfQ0ZHXzIsCSJJUEEgUkxDIENvbmZpZ3VyYXRpb24gMiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSEVBUlRCX1RPVVQsCSJJUEEgSGVhcnRiZWF0IFRpbWVvdXQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1VQVElNRSwJCSJJUEEgVXB0aW1lIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19STENfQ0ZHXzMsCSJJUEEgUkxDIENvbmZpZ3VyYXRpb24gMyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU1NMX0NGRywJCSJJUEEgU1NMIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NFQ19QT1NTSUJMRSwJIklQQSBTZWN1cml0eSBQb3NzaWJsZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSU1MX1NTTF9TVEFURSwJIklQQSBJTUwgU1NMIFN0YXRlIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19SRVZPQ19EQVRFLAkiSVBBIFJldm9jYXRpb24gRGF0ZSIgfSwKKysJLyogRklYTUU6IE1vcmUgU0lFICovCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC40OiBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2FkbV9zdGF0ZV92YWxzW10gPSB7CisrCXsgTk1fU1RBVEVfTE9DS0VELAkJIkxvY2tlZCIgfSwKKysJeyBOTV9TVEFURV9VTkxPQ0tFRCwJCSJVbmxvY2tlZCIgfSwKKysJeyBOTV9TVEFURV9TSFVURE9XTiwJCSJTaHV0ZG93biIgfSwKKysJeyBOTV9TVEFURV9OVUxMLAkJIk51bGwiIH0sCisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9vcGVyX3N0YXRlX3ZhbHNbXSA9IHsKKysJeyAxLAkiRGlzYWJsZWQiIH0sCisrCXsgMiwJIkVuYWJsZWQiIH0sCisrCXsgMHhmZiwJIk5VTEwiIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC43IEF2YWlsYWJpbGl0eSBTdGF0dXMgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9hdmFpbF9zdGF0ZV92YWxzW10gPSB7CisrCXsgMCwJIkluIHRlc3QiIH0sCisrCXsgMSwJIkZhaWxlZCIgfSwKKysJeyAyLAkiUG93ZXIgb2ZmIiB9LAorKwl7IDMsCSJPZmYgbGluZSIgfSwKKysJeyA1LAkiRGVwZW5kZW5jeSIgfSwKKysJeyA2LAkiRGVncmFkZWQiIH0sCisrCXsgNywgCSJOb3QgaW5zdGFsbGVkIiB9LAorKwl7IDB4ZmYsCSJPSyIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjEzOiBDaGFubmVsIENvbWJpbmF0aW9uICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfY2hhbl9jb21iX3ZhbHNbXSA9IHsKKysJeyBOTV9DSEFOQ19UQ0hGdWxsLAkJIlRDSC9GIiB9LAorKwl7IE5NX0NIQU5DX1RDSEhhbGYsCQkiVENIL0giIH0sCisrCXsgTk1fQ0hBTkNfVENISGFsZjIsCQkiVENIL0ggMiIgfSwKKysJeyBOTV9DSEFOQ19TRENDSCwJCSJTRENDSCIgfSwKKysJeyBOTV9DSEFOQ19tYWluQkNDSCwJCSJNYWluIEJDQ0giIH0sCisrCXsgTk1fQ0hBTkNfQkNDSENvbWIsCQkiQ29tYmluZWQgQkNDSCIgfSwKKysJeyBOTV9DSEFOQ19CQ0NILAkJIkJDQ0giIH0sCisrCXsgTk1fQ0hBTkNfQkNDSF9DQkNILAkJIkJDQ0grQ0JDSCIgfSwKKysJeyBOTV9DSEFOQ19TRENDSF9DQkNILAkJIlNEQ0NIK0NCQ0giIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4xNjogRXZlbnQgVHlwZSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2V2ZW50X3R5cGVfdmFsc1tdID0geworKwl7IE5NX0VWVF9DT01NX0ZBSUwsCQkiQ29tbXVuaWNhdGlvbiBGYWlsdXJlIiB9LAorKwl7IE5NX0VWVF9RT1NfRkFJTCwJCSJRb1MgRmFpbHVyZSIgfSwKKysJeyBOTV9FVlRfUFJPQ19GQUlMLAkJIlByb2Nlc3NvciBGYWlsdXJlIiB9LAorKwl7IE5NX0VWVF9FUVVJUF9GQUlMLAkJIkVxdWlwbWVudCBGYWlsdXJlIiB9LAorKwl7IE5NX0VWVF9FTlZfRkFJTCwJCSJFbnZpcm9ubWVudCBGYWlsdXJlIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX3NldmVyaXR5X3ZhbHNbXSA9IHsKKysJeyBOTV9TRVZFUl9DRUFTRUQsCQkiQ2Vhc2VkIiB9LAorKwl7IE5NX1NFVkVSX0NSSVRJQ0FMLAkJIkNyaXRpY2FsIiB9LAorKwl7IE5NX1NFVkVSX01BSk9SLAkJIk1ham9yIiB9LAorKwl7IE5NX1NFVkVSX01JTk9SLAkJIk1pbm9yIiB9LAorKwl7IE5NX1NFVkVSX1dBUk5JTkcsCQkiV2FybmluZyIgfSwKKysJeyBOTV9TRVZFUl9JTkRFVEVSTUlOQVRFLAkiSW5kZXRlcm1pbmF0ZSIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjM2OiBOQUNLIENhdXNlcyAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX25hY2tfY2F1c2VbXSA9IHsKKysJeyBOTV9OQUNLX0lOQ09SUl9TVFJVQ1QsCSJJbmNvcnJlY3QgbWVzc2FnZSBzdHJ1Y3R1cmUiIH0sCisrCXsgTk1fTkFDS19NU0dUWVBFX0lOVkFMLAkiSW52YWxpZCBtZXNzYWdlIHR5cGUgdmFsdWUiIH0sCisrCXsgTk1fTkFDS19PQkpDTEFTU19JTlZBTCwJIkludmFsaWQgT2JqZWN0IGNsYXNzIHZhbHVlIiB9LAorKwl7IE5NX05BQ0tfT0JKQ0xBU1NfTk9UU1VQUCwJIk9iamVjdCBDbGFzcyBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfQlRTTlJfVU5LTiwJCSJCVFMgTnVtYmVyIHVua25vd24iIH0sCisrCXsgTk1fTkFDS19UUlhOUl9VTktOLAkJIlRSWCBOdW1iZXIgdW5rbm93biIgfSwKKysJeyBOTV9OQUNLX09CSklOU1RfVU5LTiwJCSJPYmplY3QgSW5zdGFuY2UgdW5rbm93biIgfSwKKysJeyBOTV9OQUNLX0FUVFJJRF9JTlZBTCwJCSJJbnZhbGlkIEF0dHJpYnV0ZSBJRCB2YWx1ZSIgfSwKKysJeyBOTV9OQUNLX0FUVFJJRF9OT1RTVVBQLAkiQXR0cmlidXRlIElEIG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19QQVJBTV9SQU5HRSwJCSJQYXJhbWV0ZXIgdmFsdWUgb3V0IG9mIHJhbmdlIiB9LAorKwl7IE5NX05BQ0tfQVRUUkxJU1RfSU5DT05TSVNURU5ULCAiSW5jb25zaXN0ZW5jeSBpbiBBdHRyaWJ1dGUgbGlzdCIgfSwKKysJeyBOTV9OQUNLX1NQRUNfSU1QTF9OT1RTVVBQLAkiU3BlY2lmaWVkIEltcGxlbWVudGF0aW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19DQU5UX1BFUkZPUk0sCQkiTWVzc2FnZSBjYW5ub3QgYmUgcGVyZm9ybWVkIiB9LAorKwl7IE5NX05BQ0tfUkVTX05PVElNUEwsCQkiUmVzb3VyY2Ugbm90IGltcGxlbWVudGVkIiB9LAorKwl7IE5NX05BQ0tfUkVTX05PVEFWQUlMLAkJIlJlc291cmNlIG5vdCBhdmFpbGFibGUiIH0sCisrCXsgTk1fTkFDS19GUkVRX05PVEFWQUlMLAkiRnJlcXVlbmN5IG5vdCBhdmFpbGFibGUiIH0sCisrCXsgTk1fTkFDS19URVNUX05PVFNVUFAsCQkiVGVzdCBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfQ0FQQUNJVFlfUkVTVFIsCSJDYXBhY2l0eSByZXN0cmljdGlvbnMiIH0sCisrCXsgTk1fTkFDS19QSFlTQ0ZHX05PVFBFUkZPUk0sCSJQaHlzIGNvbmZpZyBjYW5ub3QgYmUgcGVyZm9ybWVkIiB9LAorKwl7IE5NX05BQ0tfVEVTVF9OT1RJTklULAkJIlRlc3Qgbm90IGluaXRpYXRlZCIgfSwKKysJeyBOTV9OQUNLX1BIWVNDRkdfTk9UUkVTVE9SRSwJIlBoeXMgY29uZmlnIGNhbm5vdCBiZSByZXN0b3JlZCIgfSwKKysJeyBOTV9OQUNLX1RFU1RfTk9TVUNILAkJIk5vIHN1Y2ggVGVzdCIgfSwKKysJeyBOTV9OQUNLX1RFU1RfTk9TVE9QLAkJIlRlc3QgY2Fubm90IGJlIHN0b3BwZWQiIH0sCisrCXsgTk1fTkFDS19NU0dJTkNPTlNJU1RfUEhZU0NGRywJIk1lc3NhZ2UgaW5jb25zaXN0ZW4gd2l0aCBwaHlzaWNhbCBjb25maWciIH0sCisrCXsgTk1fTkFDS19GSUxFX0lOQ09NUExFVEUsCSJDb21wbGV0ZSBmaWxlIG5vdCByZWNlaXZlZCIgfSwKKysJeyBOTV9OQUNLX0ZJTEVfTk9UQVZBSUwsCSJGaWxlIG5vdCBhdmFpbGFibGUgYXQgZGVzdGluYXRpb24iIH0sCisrCXsgTk1fTkFDS19GSUxFX05PVEFDVElWQVRFLAkiRmlsZSBjYW5ub3QgYmUgYWN0aXZhdGVkIiB9LAorKwl7IE5NX05BQ0tfUkVRX05PVF9HUkFOVCwJIlJlcXVlc3Qgbm90IGdyYW50ZWQiIH0sCisrCXsgTk1fTkFDS19XQUlULAkJCSJXYWl0IiB9LAorKwl7IE5NX05BQ0tfTk9USF9SRVBPUlRfRVhJU1QsCSJOb3RoaW5nIHJlcG9ydGFibGUgZXhpc3RpbmciIH0sCisrCXsgTk1fTkFDS19NRUFTX05PVFNVUFAsCQkiTWVhc3VyZW1lbnQgbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX01FQVNfTk9UU1RBUlQsCSJNZWFzdXJlbWVudCBub3Qgc3RhcnRlZCIgfSwKKysJeyAweGZmLAkJCQkiTlVMTCIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX3Rlc3Rfbm9fdmFsc1tdID0geworKwl7IE5NX0lQQUNDX1RFU1ROT19STE9PUF9BTlQsCSJSYWRpbyBMb29wIHRlc3QgdmlhIGFudGVubmEiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX1JMT09QX1hDVlIsCSJSYWRpbyBMb29wIHRlc3QgdmlhIHRyYW5zY2VpdmVyIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19GVU5DX09CSiwJIkJUUyBGdW5jdGlvbmFsIG9iamVjdCBzZWxmIHRlc3QiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0NIQU5fVVNBR0UsCSJDaGFubmVsIFVzYWdlIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0NIQU5fVVNBR0UsICJCQ0NIIENoYW5uZWwgVXNhZ2UiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0ZSRVFfU1lOQywJIkZyZXF1ZW5jeSBTeW5jaHJvbml6YXRpb24iIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfSU5GTywJIkJDQ0ggSW5mb3JtYXRpb24iIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX1RYX0JFQUNPTiwJIlRyYW5zbWl0IEJlYWNvbiIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fU1lTSU5GT19NT05JVE9SLCAiU3lzSW5mbyBNb25pdG9yIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NDSF9NT05JVE9SLCAiQkNDSCAmIENDQ0ggTW9uaXRvciIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgaXBhY2NfdGVzdF9yZXNfdmFsc1tdID0geworKwl7IE5NX0lQQUNDX1RFU1RSRVNfU1VDQ0VTUywJIlN1Y2Nlc3MiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VULAkiVGltZW91dCIgfSwKKysJeyBOTV9JUEFDQ19URVNUUkVTX05PX0NIQU5TLAkiTm8gc3VpdGFibGUgY2hhbm5lbHMgYXZhaWxhYmxlIiB9LAorKwl7IE5NX0lQQUNDX1RFU1RSRVNfUEFSVElBTCwJIlBhcnRpYWwiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVFJFU19TVE9QUEVELAkiU3RvcHBlZCIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgaXBhY2NfdGVzdHJlc19pZV92YWxzW10gPSB7CisrCXsgTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlJfTElTVCwJIkZyZXF1ZW5jeSBFcnJvciBMaXN0IiB9LAorKwl7IE5NX0lQQUNDX1RSX0lFX0NIQU5fVVNBR0UsCSJDaGFubmVsIFVzYWdlIiB9LAorKwl7IE5NX0lQQUNDX1RSX0lFX0JDQ0hfSU5GTywJIkJDQ0ggSW5mb3JtYXRpb24iIH0sCisrCXsgTk1fSVBBQ0NfVFJfSUVfUkVTVUxUX0RFVEFJTFMsIlJlc3VsdCBEZXRhaWxzIiB9LAorKwl7IE5NX0lQQUNDX1RSX0lFX0ZSRVFfRVJSLAkiRnJlcXVlbmN5IEVycm9yIiB9LAorK307CisrCisrLyogUGFyc2UgdGhlIGlwLmFjY2VzcyBzcGVjaWZpYyBCQ0NIIEluZm9ybWF0aW9uIElFIGVtYmVkZGVkIGludG8gdGhlIFRlc3QKKysgKiBSZXBvcnQgSUUgKi8KKytzdGF0aWMgZ2ludAorK2lwYWNjX3RyX2llX2JjY2godHZidWZmX3QgKnR2YiwgcHJvdG9fdHJlZSAqYXR0X3RyZWUsIGludCBvZmZzZXQpCisreworKwlndWludDE2IGJpbmZvX3R5cGUsIHRtcDsKKysKKysJYmluZm9fdHlwZSA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwlvZmZzZXQgKz0gMjsKKysKKysJdG1wID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCisrCS8qIEZJWE1FOiB0aGVyZSBhcmUgc3RpbGwgc29tZSBidWdzIHJlbWFpbmluZyBoZXJlICovCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2FyZmNuLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2ZfcXVhbCwKKysJCQkgICAgdHZiLCBvZmZzZXQsIDIsIFRSVUUpOworKwlvZmZzZXQgKz0gMjsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfYl9yeGxldiwKKysJCQkgICAgdHZiLCBvZmZzZXQrKywgMSwgVFJVRSk7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3J4cXVhbCwKKysJCQkgICAgdHZiLCBvZmZzZXQrKywgMSwgVFJVRSk7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2ZfZXJyLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCW9mZnNldCArPSAyOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9mcmFtZV9vZmZzLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCW9mZnNldCArPSAyOworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9mcmFtZW5yX29mZnMsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCA0LCBUUlVFKTsKKysJb2Zmc2V0ICs9IDQ7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2JzaWMsCisrCQkJICAgIHR2Yiwgb2Zmc2V0KyssIDEsIFRSVUUpOworKworKwlkZV9sYWkodHZiLCBhdHRfdHJlZSwgb2Zmc2V0LCA1LCBOVUxMLCAwKTsKKysJb2Zmc2V0ICs9IDU7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2NlbGxfaWQsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysJb2Zmc2V0ICs9IDI7CisrCisrCWlmIChiaW5mb190eXBlICYgMHg4MDAwKSB7CisrCQkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gMiAqLworKwkJLyogRklYTUU6IFBhcnNlIDA0LjE4IE5laWdoYm91ciBDZWxsIERlc2NyaXB0aW9uICovCisrCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9zaTIsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMTYsIFRSVUUpOworKwkJb2Zmc2V0ICs9IDE2OworKwl9CisrCWlmIChiaW5mb190eXBlICYgMHgwMDAxKSB7CisrCQkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gMmJpcyAqLworKwkJLyogRklYTUU6IFBhcnNlIDA0LjE4IE5laWdoYm91ciBDZWxsIERlc2NyaXB0aW9uICovCisrCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9zaTJiaXMsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMTYsIFRSVUUpOworKwkJb2Zmc2V0ICs9IDE2OworKwl9CisrCWlmIChiaW5mb190eXBlICYgMHgwMDAyKSB7CisrCQkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gMnRlciAqLworKwkJLyogRklYTUU6IFBhcnNlIDA0LjE4IE5laWdoYm91ciBDZWxsIERlc2NyaXB0aW9uICovCisrCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9zaTJ0ZXIsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMTYsIFRSVUUpOworKwkJb2Zmc2V0ICs9IDE2OworKwl9CisrCWlmIChiaW5mb190eXBlICYgMHgwMDA0KSB7CisrCQkvKiBGSVhNRTogUGFyc2UgMDQuMTggQ2VsbCBDaGFubmVsIERlc2NyaXB0aW9uICovCisrCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9jaGFuX2Rlc2MsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMTYsIFRSVUUpOworKwkJb2Zmc2V0ICs9IDE2OworKwl9CisrCisrCXJldHVybiBvZmZzZXQ7CisrfQorKworKy8qIFBhcnNlIHRoZSBpcC5hY2Nlc3Mgc3BlY2lmaWMgQ2hhbm5lbCBVc2FnZSBJRSBlbWJlZGRlZCBpbnRvIHRoZSBUZXN0CisrICogUmVwb3J0IElFICovCisrc3RhdGljIGdpbnQKKytpcGFjY190cl9pZV9jaGFuX3VzYWdlKHR2YnVmZl90ICp0dmIsIHByb3RvX3RyZWUgKmF0dF90cmVlLCBpbnQgb2Zmc2V0KQorK3sKKysJd2hpbGUgKHR2Yl9yZXBvcnRlZF9sZW5ndGhfcmVtYWluaW5nKHR2Yiwgb2Zmc2V0KSAhPSAwKSB7CisrCQlndWludDE2IHJlc3VsdCA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfYXJmY24sCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMiwgcmVzdWx0KTsKKysJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3J4bGV2LAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDIsIHJlc3VsdCk7CisrCQlvZmZzZXQgKz0gMjsKKysJfQorKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKysvKiBQYXJzZSB0aGUgaXAuYWNjZXNzIHNwZWNpZmljIGZvcm1hdCBvZiB0aGUgc3RhbmRhcmQgdGVzdCByZXBvcnQgSUUgKi8KKytzdGF0aWMgZ2ludAorK2Rpc3NlY3RfaXBhY2NfdGVzdF9yZXAocHJvdG9fdHJlZSAqdHJlZSwgdHZidWZmX3QgKnR2YikKKyt7CisrCWdpbnQgb2Zmc2V0ID0gMDsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9hdHRyX2lwYV90ZXN0X3JlcywgdHZiLCBvZmZzZXQrKywKKysJCQkgICAgMSwgRkFMU0UpOworKworKwl3aGlsZSAodHZiX3JlcG9ydGVkX2xlbmd0aF9yZW1haW5pbmcodHZiLCBvZmZzZXQpICE9IDApIHsKKysJCWd1aW50OCBpZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCWd1aW50MTYgbGVuID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCsxKTsKKysJCXByb3RvX2l0ZW0gKnRpOworKwkJcHJvdG9fdHJlZSAqYXR0X3RyZWU7CisrCisrCQl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfb21sX2lwYV90cmVzX2F0dHJfdGFnLCB0dmIsCisrCQkJCQkgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJCWF0dF90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X29tbF9mb21fYXR0KTsKKysJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX29tbF9pcGFfdHJlc19hdHRyX2xlbiwgdHZiLAorKwkJCQkgICAgb2Zmc2V0LCAyLCBsZW4pOworKwkJb2Zmc2V0ICs9IDI7CisrCisrCQlzd2l0Y2ggKGllKSB7CisrCQljYXNlIE5NX0lQQUNDX1RSX0lFX0NIQU5fVVNBR0U6CisrCQkJb2Zmc2V0ID0gaXBhY2NfdHJfaWVfY2hhbl91c2FnZSh0dmIsCisrCQkJCQkJIAlhdHRfdHJlZSwgb2Zmc2V0KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPOgorKwkJCW9mZnNldCA9IGlwYWNjX3RyX2llX2JjY2godHZiLAorKwkJCQkJCSAgYXR0X3RyZWUsIG9mZnNldCk7CisrCQkJYnJlYWs7CisrCQlkZWZhdWx0OgorKwkJCWJyZWFrOworKwkJfQorKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworKy8qIERpc3NlY3QgT01MIEZPTSBBdHRyaWJ1dGVzIGFmdGVyIE9NTCArIEZPTSBoZWFkZXIgKi8KKytzdGF0aWMgZ2ludAorK2Rpc3NlY3Rfb21sX2F0dHJzKHR2YnVmZl90ICp0dmIsIGludCBiYXNlX29mZnMsIHBhY2tldF9pbmZvICpwaW5mbywKKysJCSAgcHJvdG9fdHJlZSAqdHJlZSkKKyt7CisrCWludCBvZmZzZXQgPSBiYXNlX29mZnM7CisrCisrCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgeworKwkJZ3VpbnQgaTsKKysJCWd1aW50OCB0YWcsIHZhbDg7CisrCQlndWludDE2IHZhbDE2OworKwkJZ3VpbnQzMiB2YWwzMjsKKysJCXVuc2lnbmVkIGludCBsZW4sIGxlbl9sZW4sIGhsZW47CisrCQljb25zdCBzdHJ1Y3QgdGx2X2RlZiAqdGRlZjsKKysJCXByb3RvX2l0ZW0gKnRpOworKwkJcHJvdG9fdHJlZSAqYXR0X3RyZWU7CisrCQl0dmJ1ZmZfdCAqc3ViX3R2YjsKKysKKysJCXRhZyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCXRkZWYgPSAmbm1fYXR0X3RsdmRlZi5kZWZbdGFnXTsKKysKKysJCXN3aXRjaCAodGRlZi0+dHlwZSkgeworKwkJY2FzZSBUTFZfVFlQRV9GSVhFRDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSB0ZGVmLT5maXhlZF9sZW47CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1Q6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMDsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVFY6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMTsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVExWOgorKwkJCWhsZW4gPSAyOworKwkJCWxlbl9sZW4gPSAxOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTDE2VjoKKysJCQlobGVuID0gMzsKKysJCQlsZW5fbGVuID0gMjsKKysJCQlsZW4gPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKSA8PCA4IHwKKysJCQkJCQl0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsyKTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJaGxlbiA9IGxlbl9sZW4gPSBsZW4gPSAwOworKwkJCURJU1NFQ1RPUl9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKysJCQlicmVhazsKKysJCX0KKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9vbWxfZm9tX2F0dHJfdGFnLCB0dmIsCisrCQkJCQkgb2Zmc2V0LCAxLCBGQUxTRSk7CisrCQlhdHRfdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9vbWxfZm9tX2F0dCk7CisrCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9vbWxfZm9tX2F0dHJfbGVuLCB0dmIsCisrCQkJCSAgICBvZmZzZXQrMSwgbGVuX2xlbiwgbGVuKTsKKysJCW9mZnNldCArPSBobGVuOworKworKwkJc3ViX3R2YiA9IHR2Yl9uZXdfc3Vic2V0KHR2Yiwgb2Zmc2V0LCBsZW4sIGxlbik7CisrCisrCQlzd2l0Y2ggKHRhZykgeworKwkJLyogcGFyc2Ugb25seSB0aGUgbW9zdCBjb21tb24gSUUgZm9yIG5vdyAqLworKwkJY2FzZSBOTV9BVFRfQUJJU19DSEFOTkVMOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWNoX2J0c3AsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIDEsIFRSVUUpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWNoX3RzbG90LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzEsIDEsIFRSVUUpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWNoX3NzbG90LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzIsIDEsIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQURNX1NUQVRFOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWRtX3N0YXRlLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMgIiwKKysJCQkJCXZhbF90b19zdHIodmFsOCwgb21sX2FkbV9zdGF0ZV92YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQVJGQ05fTElTVDoKKysJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHsKKysJCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0ICsgaSk7CisrCQkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfYXJmY24sCisrCQkJCQkJICAgIHR2Yiwgb2Zmc2V0ICsgaSwgMiwgdmFsMTYpOworKwkJCX0KKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0FWQUlMX1NUQVRVUzoKKysJCQkvKiBBdmFpbGFiaWxpdHkgc3RhdHVzIGNhbiBoYXZlIGxlbmd0aCAwICovCisrCQkJaWYgKGxlbikgeworKwkJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLAorKwkJCQkJCSAgICBoZl9hdHRyX2F2YWlsX3N0YXRlLCB0dmIsCisrCQkJCQkgICAgCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCX0gZWxzZQorKwkJCQl2YWw4ID0gMHhmZjsKKysJCQljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzICIsCisrCQkJCQl2YWxfdG9fc3RyKHZhbDgsIG9tbF9hdmFpbF9zdGF0ZV92YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQkNDSF9BUkZDTjoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2JjY2hfYXJmY24sIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9CU0lDOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYnNpYywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0NIQU5fQ09NQjoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2NoYW5fY29tYiwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0VWRU5UX1RZUEU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9ldmVudF90eXBlLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfR1NNX1RJTUU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9nc21fdGltZSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX09QRVJfU1RBVEU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9vcGVyX3N0YXRlLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMgIiwKKysJCQkJCXZhbF90b19zdHIodmFsOCwgb21sX29wZXJfc3RhdGVfdmFscywKKysJCQkJCQkgICAiJTAyeCIpKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RFSToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX3RlaSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RTQzoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX3RzYywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1NFVkVSSVRZOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfc2V2ZXJpdHksIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9URVNUX1JFUE9SVDoKKysJCQlkaXNzZWN0X2lwYWNjX3Rlc3RfcmVwKGF0dF90cmVlLCBzdWJfdHZiKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RFU1RfTk86CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl90ZXN0X25vLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJY29sX2FwcGVuZF9mc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICIlcyAiLAorKwkJCQkJdmFsX3RvX3N0cih2YWw4LCBvbWxfdGVzdF9ub192YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKworKwkJLyogcHJvcHJpZXRhcnkgaXAuYWNjZXNzIGV4dGVuc2lvbnMgKi8KKysJCWNhc2UgTk1fQVRUX0lQQUNDX0RTVF9JUDoKKysJCQl2YWwzMiA9IHR2Yl9nZXRfbnRvaGwodHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX2lwdjQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3JzbF9pcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCB2YWwzMik7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVDoKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3JzbF9wb3J0LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX0xPQ0FUSU9OOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX2xvY2F0aW9uX25hbWUsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19VTklUX0lEOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3VuaXRfaWQsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19VTklUX05BTUU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdW5pdF9uYW1lLAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHX0xJU1Q6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcHJpbV9vbWxfaXAsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQrMSwgNCwgVFJVRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcHJpbV9vbWxfcG9ydCwKKysJCQkJCSAgICB0dmIsIG9mZnNldCsxKzQsIDIsIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfTlZfRkxBR1M6CisrCQkJeworKwkJCQlndWludCBmbGFncywgbWFzazsKKysJCQkJZmxhZ3MgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJCW1hc2sgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKTsKKysJCQkJZmxhZ3MgfD0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMikgPDwgODsKKysJCQkJbWFzayB8PSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCszKSA8PCA4OworKwkJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9udl9mbGFncywKKysJCQkJCQkgICAgdHZiLCBvZmZzZXQsIDMsIGZsYWdzKTsKKysJCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnZfbWFzaywKKysJCQkJCQkgICAgdHZiLCBvZmZzZXQrMSwgMywgbWFzayk7CisrCQkJfQorKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfUkFDOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3JhYywKKysJCQkJCSAgICB0dmIsIG9mZnNldCwgMSwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19OU0VJOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnNlaSwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0LCAyLCB2YWwxNik7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19OU1ZDSToKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zdmNpLAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX0JWQ0k6CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9idmNpLAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnNsX3Nwb3J0LAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQl2YWwzMiA9IHR2Yl9nZXRfaXB2NCh0dmIsIG9mZnNldCsyKTsKKysJCQlwcm90b190cmVlX2FkZF9pcHY0KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9uc2xfZGFkZHIsCisrCQkJCQkgICB0dmIsIG9mZnNldCsyLCA0LCB2YWwzMik7CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KzYpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zbF9kcG9ydCwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0KzYsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfb21sX2ZvbV9hdHRyX3ZhbCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQl9CisrCQlvZmZzZXQgKz0gbGVuOworKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworK3N0YXRpYyBpbnQKKytkaXNzZWN0X29tbF9mb20odHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLAorKwkJaW50IG9mZnNldCwgcHJvdG9faXRlbSAqdG9wX3RpKQorK3sKKysJZ3VpbnQ4IG1zZ190eXBlLCBvYmpfY2xhc3MsIGJ0c19uciwgdHJ4X25yLCB0c19ucjsKKysJcHJvdG9faXRlbSAqdGk7CisrCXByb3RvX3RyZWUgKmZvbV90cmVlOworKworKwltc2dfdHlwZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJb2JqX2NsYXNzID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSk7CisrCWJ0c19uciA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzIpOworKwl0cnhfbnIgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCszKTsKKysJdHNfbnIgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCs0KTsKKysJcHJvdG9faXRlbV9hcHBlbmRfdGV4dCh0b3BfdGksICIsICVzKCUwMngsJTAyeCwlMDJ4KSAlcyAiLAorKwkJCXZhbF90b19zdHIob2JqX2NsYXNzLCBvbWxfZm9tX29iamNsYXNzX3ZhbHMsICIlMDJ4IiksCisrCQkJYnRzX25yLCB0cnhfbnIsIHRzX25yLAorKwkJCXZhbF90b19zdHIobXNnX3R5cGUsIG9tbF9mb21fbXNndHlwZV92YWxzLAorKwkJCQkgICAidW5rbm93biAweCV4IikpOworKwljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzKCUwMngsJTAyeCwlMDJ4KSAlcyAiLAorKwkJCXZhbF90b19zdHIob2JqX2NsYXNzLCBvbWxfZm9tX29iamNsYXNzX3ZhbHMsICIlMDJ4IiksCisrCQkJYnRzX25yLCB0cnhfbnIsIHRzX25yLAorKwkJCXZhbF90b19zdHIobXNnX3R5cGUsIG9tbF9mb21fbXNndHlwZV92YWxzLAorKwkJCQkgICAidW5rbm93biAweCV4IikpOworKwl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfb21sX2ZvbV9tc2d0eXBlLCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCWZvbV90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X29tbF9mb20pOworKwlwcm90b190cmVlX2FkZF9pdGVtKGZvbV90cmVlLCBoZl9vbWxfZm9tX29iamNsYXNzLCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oZm9tX3RyZWUsIGhmX29tbF9mb21faW5zdF9idHMsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShmb21fdHJlZSwgaGZfb21sX2ZvbV9pbnN0X3RyeCwgdHZiLCBvZmZzZXQrKywgMSwgRkFMU0UpOworKwlwcm90b190cmVlX2FkZF9pdGVtKGZvbV90cmVlLCBoZl9vbWxfZm9tX2luc3RfdHMsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysKKysKKysJLyogZGlzc2VjdCB0aGUgVExWIG9iamVjdHMgaW4gdGhlIG1lc3NhZ2UgYm9keSAqLworKwlvZmZzZXQgPSBkaXNzZWN0X29tbF9hdHRycyh0dmIsIG9mZnNldCwgcGluZm8sIGZvbV90cmVlKTsKKysKKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrc3RhdGljIGNvbnN0IGd1aW50OCBpcGFjY2Vzc19tYWdpY1tdID0gImNvbS5pcGFjY2VzcyI7CisrCisrc3RhdGljIGludAorK2Rpc3NlY3Rfb21sX21hbnVmKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwKKysJCSAgaW50IG9mZnNldCwgcHJvdG9faXRlbSAqdG9wX3RpKQorK3sKKysJaWYgKHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KSAhPSAweDBkIHx8CisrCSAgICB0dmJfbWVtZXFsKHR2Yiwgb2Zmc2V0KzEsIGlwYWNjZXNzX21hZ2ljLCBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpKSkKKysJCXJldHVybiBvZmZzZXQ7CisrCisrCW9mZnNldCArPSBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpICsgMTsKKysKKysJcmV0dXJuIGRpc3NlY3Rfb21sX2ZvbSh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQsIHRvcF90aSk7CisrfQorKworK3N0YXRpYyB2b2lkCisrZGlzc2VjdF9hYmlzX29tbCh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUpCisreworKwlwcm90b19pdGVtICp0aTsKKysJcHJvdG9fdHJlZSAqb21sX3RyZWU7CisrCisrCWludCBvZmZzZXQgPSAwOworKworKwljb2xfc2V0X3N0cihwaW5mby0+Y2luZm8sIENPTF9QUk9UT0NPTCwgIk9NTCIpOworKworKwl0b3BfdHJlZSA9IHRyZWU7CisrCWlmICh0cmVlKSB7CisrCQl1X2ludDhfdCBtc2dfZGlzYyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBwcm90b19hYmlzX29tbCwgdHZiLCAwLCAtMSwgRkFMU0UpOworKwkJb21sX3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfb21sKTsKKysKKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0ob21sX3RyZWUsIGhmX29tbF9tc2dfZGlzYywgdHZiLCBvZmZzZXQrKywKKysJCQkJICAgIDEsIFRSVUUpOworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShvbWxfdHJlZSwgaGZfb21sX3BsYWNlbWVudCwgdHZiLCBvZmZzZXQrKywKKysJCQkJICAgIDEsIFRSVUUpOworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShvbWxfdHJlZSwgaGZfb21sX3NlcXVlbmNlLCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCQlwcm90b190cmVlX2FkZF9pdGVtKG9tbF90cmVlLCBoZl9vbWxfbGVuZ3RoLCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCisrCQlzd2l0Y2ggKG1zZ19kaXNjKSB7CisrCQljYXNlIEFCSVNfT01fTURJU0NfRk9NOgorKwkJCW9mZnNldCA9IGRpc3NlY3Rfb21sX2ZvbSh0dmIsIHBpbmZvLCBvbWxfdHJlZSwKKysJCQkJCQkgb2Zmc2V0LCB0aSk7CisrCQkJYnJlYWs7CisrCQljYXNlIEFCSVNfT01fTURJU0NfTUFOVUY6CisrCQkJb2Zmc2V0ID0gZGlzc2VjdF9vbWxfbWFudWYodHZiLCBwaW5mbywgb21sX3RyZWUsCQkJCQkJCSAgICAgICBvZmZzZXQsIHRpKTsKKysJCQlicmVhazsKKysJCWNhc2UgQUJJU19PTV9NRElTQ19NTUk6CisrCQljYXNlIEFCSVNfT01fTURJU0NfVFJBVToKKysJCWRlZmF1bHQ6CisrCQkJYnJlYWs7CisrCQl9CisrCX0KKyt9CisrCisrdm9pZAorK3Byb3RvX3JlZ19oYW5kb2ZmX2FiaXNfb21sKHZvaWQpOworKworK3ZvaWQKKytwcm90b19yZWdpc3Rlcl9hYmlzX29tbCh2b2lkKQorK3sKKysJc3RhdGljIGhmX3JlZ2lzdGVyX2luZm8gaGZbXSA9IHsKKysJCXsgJmhmX29tbF9tc2dfZGlzYywKKysJCQl7ICJNZXNzYWdlIERpc2NyaW1pbmF0b3IiLCAib21sLm1zZ19kc2MiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9tc2dfZGlzY192YWxzKSwgMCwKKysJCQkgICJHU00gMTIuMjEgTWVzc2FnZSBEaXNjcmltaW5hdG9yIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9wbGFjZW1lbnQsCisrCQkJeyAiUGxhY2VtZW50IEluZGljYXRvciIsICJvbWwucGxhY2VtZW50IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfcGxhY2VtZW50X3ZhbHMpLCAwLAorKwkJCSAgIkdTTSAxMi4yMSBQbGFjZW1lbnQgSW5kaWNhdG9yIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9zZXF1ZW5jZSwKKysJCQl7ICJTZXF1ZW5jZSBOdW1iZXIiLCAib21sLnNlcXVlbmNlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgTlVMTCwgMCwKKysJCQkgICJTZXF1ZW5jZSBOdW1iZXIgKGlmIG11bHRpLXBhcnQgbXNnKSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfbGVuZ3RoLAorKwkJCXsgIkxlbmd0aCBJbmRpY2F0b3IiLCAib21sLmxlbmd0aCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiVG90YWwgbGVuZ3RoIG9mIHBheWxvYWQiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9tc2d0eXBlLAorKwkJCXsgIkZPTSBNZXNzYWdlIFR5cGUiLCAib21sLmZvbS5tc2dfdHlwZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2ZvbV9tc2d0eXBlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21fb2JqY2xhc3MsCisrCQkJeyAiRk9NIE9iamVjdCBDbGFzcyIsICJvbWwuZm9tLm9ial9jbGFzcyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2ZvbV9vYmpjbGFzc192YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2luc3RfYnRzLAorKwkJCXsgIkZPTSBPYmplY3QgSW5zdGFuY2UgQlRTIiwgIm9tbC5mb20ub2JqX2luc3QuYnRzIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2luc3RfdHJ4LAorKwkJCXsgIkZPTSBPYmplY3QgSW5zdGFuY2UgVFJYIiwgIm9tbC5mb20ub2JqX2luc3QudHJ4IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2luc3RfdHMsCisrCQkJeyAiRk9NIE9iamVjdCBJbnN0YW5jZSBUUyIsICJvbWwuZm9tLm9ial9pbnN0LnRzIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2F0dHJfdGFnLAorKwkJCXsgIkZPTSBBdHRyaWJ1dGUgSUQiLCAib21sLmZvbS5hdHRyX2lkIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfZm9tX2F0dHJfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9hdHRyX2xlbiwKKysJCQl7ICJGT00gQXR0cmlidXRlIExlbmd0aCIsICJvbWwuZm9tLmF0dHJfbGVuIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9hdHRyX3ZhbCwKKysJCQl7ICJGT00gQXR0cmlidXRlIFZhbHVlIiwgIm9tbC5mb20uYXR0cl92YWwiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCisrCisrCisrCQkvKiBPTUwgQXR0cmlidXRlcyAqLworKwkJeyAmaGZfYXR0cl9hZG1fc3RhdGUsCisrCQkJeyAiQWRtaW5pc3RyYXRpdmUgU3RhdGUiLCAib21sLmZvbS5hdHRyLmFkbV9zdGF0ZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2FkbV9zdGF0ZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2FyZmNuLAorKwkJCXsgIkFSRkNOIiwgIm9tbC5mb20uYXR0ci5hcmZjbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9vcGVyX3N0YXRlLAorKwkJCXsgIk9wZXJhdGlvbmFsIFN0YXRlIiwgIm9tbC5mb20uYXR0ci5vcGVyX3N0YXRlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfb3Blcl9zdGF0ZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2F2YWlsX3N0YXRlLAorKwkJCXsgIkF2YWlsYWJpbGl0eSBTdGF0dXMiLCAib21sLmZvbS5hdHRyLmF2YWlsX3N0YXRlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfYXZhaWxfc3RhdGVfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9ldmVudF90eXBlLAorKwkJCXsgIkV2ZW50IFR5cGUiLCAib21sLmZvbS5hdHRyLmV2ZW50X3R5cGUiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9ldmVudF90eXBlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfc2V2ZXJpdHksCisrCQkJeyAiU2V2ZXJpdHkiLCAib21sLmZvbS5hdHRyLnNldmVyaXR5IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfc2V2ZXJpdHlfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9iY2NoX2FyZmNuLAorKwkJCXsgIkJDQ0ggQVJGQ04iLCAib21sLmZvbS5hdHRyLmJjY2hfYXJmY24iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJBUkZDTiBvZiB0aGUgQkNDSCIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2JzaWMsCisrCQkJeyAiQlNJQyIsICJvbWwuZm9tLmF0dHIuYnNpYyIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfSEVYLCBOVUxMLCAwLAorKwkJCSAgIkJhc2UgU3RhdGlvbiBJZGVudGl0eSBDZG9lIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfdGVzdF9ubywKKysJCQl7ICJUZXN0IE51bWJlciIsICJvbWwuZm9tLmF0dHIudGVzdF9ubyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX3Rlc3Rfbm9fdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl90c2MsCisrCQkJeyAiVFNDIiwgIm9tbC5mb20uYXR0ci50c2MiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBOVUxMLCAwLAorKwkJCSAgIlRyYWluaW5nIFNlcXVlbmNlIENvZGUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl90ZWksCisrCQkJeyAiVEVJIiwgIm9tbC5mb20uYXR0ci50ZWkiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYWNoX2J0c3AsCisrCQkJeyAiQlRTIEUxIFBvcnQiLCAib21sLmZvbS5hdHRyLmFiaXNfY2guYnRzX3BvcnQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYWNoX3RzbG90LAorKwkJCXsgIkUxIFRpbWVzbG90IiwgIm9tbC5mb20uYXR0ci5hYmlzX2NoLnRpbWVzbG90IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2FjaF9zc2xvdCwKKysJCQl7ICJFMSBTdWJzbG90IiwgIm9tbC5mb20uYXR0ci5hYmlzX2NoLnN1YnNsb3QiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfZ3NtX3RpbWUsCisrCQkJeyAiR1NNIFRpbWUiLCAib21sLmZvbS5hdHRyLmdzbV90aW1lIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiR1NNIFRpbWUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9jaGFuX2NvbWIsCisrCQkJeyAiQ2hhbm5lbCBDb21iaW5hdGlvbiIsICJvbWwuZm9tLmF0dHIuY2hhbl9jb21iIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfY2hhbl9jb21iX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCS8qIElQIEFjY2VzcyAqLworKwkJeyAmaGZfb21sX2lwYV90cmVzX2F0dHJfdGFnLAorKwkJCXsgIklQQSBUZXN0IFJlc3VsdCBFbWJlZGRlZCBJRSIsCisrCQkJCQkJIm9tbC5mb20udGVzdHJlcC5pcGFfdGFnIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhpcGFjY190ZXN0cmVzX2llX3ZhbHMpLCAwLAorKwkJCSAgIkluZm9ybWF0aW9uIEVsZW1lbnQgZW1iZWRkZWQgaW50byB0aGUgVGVzdCBSZXN1bHQgIgorKwkJCSAgIm9mIGlwLmFjY2VzcyBCVFMiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX29tbF9pcGFfdHJlc19hdHRyX2xlbiwKKysJCQl7ICJJUEEgVGVzdCBSZXN1bHQgRW1iZWRkZWQgSUUgTGVuZ3RoIiwKKysJCQkJCQkib21sLmZvbS50ZXN0cmVwLmlwYV9sZW4iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJMZW5ndGggb2YgaXAuYWNjZXNzIFRlc3QgUmVzdWx0IEVtYmVkZGVkIElFIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3Rlc3RfcmVzLAorKwkJCXsgIklQQSBUZXN0IFJlc3VsdCIsICJvbWwuZm9tLnRlc3RyZXAucmVzdWx0IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgVkFMUyhpcGFjY190ZXN0X3Jlc192YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9yeGxldiwKKysJCQl7ICJSeCBMZXZlbCIsICJvbWwuZm9tLnRlc3RyZXAuaXBhX3J4bGV2IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4ZmMwMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2JfcnhsZXYsCisrCQkJeyAiUnggTGV2ZWwiLCAib21sLmZvbS50ZXN0cmVwLmlwYV9yeGxldl9iIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2FyZmNuLAorKwkJCXsgIkFSRkNOIiwgIm9tbC5mb20udGVzdHJlcC5pcGFfYXJmY24iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwM2ZmLCAiQVJGQ04iLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfZl9xdWFsLAorKwkJCXsgIkZyZXF1ZW5jeSBRdWFsaXR5IiwgIm9tbC5mb20udGVzdHJlcC5pcGEuZnJlcV9xdWFsIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMHhmYywgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2ZfZXJyLAorKwkJCXsgIkZyZXF1ZW5jeSBFcnJvciIsICJvbWwuZm9tLnRlc3RyZXAuaXBhLmZyZXFfZXJyIiwKKysJCQkgIEZUX0lOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3J4cXVhbCwKKysJCQl7ICJSeCBRdWFsaXR5IiwgIm9tbC5mb20udGVzdHJlcC5pcGEucnhfcXVhbCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDB4NywgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2ZyYW1lX29mZnMsCisrCQkJeyAiRnJhbWUgT2Zmc2V0IiwgIm9tbC5mb20udGVzdHJlcC5pcGEuZnJhbWVfb2Zmc2V0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9mcmFtZW5yX29mZnMsCisrCQkJeyAiRnJhbWUgTnVtYmVyIE9mZnNldCIsCisrCQkJCQkib21sLmZvbS50ZXN0cmVwLmlwYS5mcmFtZW5yX29mZnNldCIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfYnNpYywKKysJCQl7ICJCU0lDIiwgIm9tbC5mb20udGVzdHJlcC5pcGEuYnNpYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDB4M2YsCisrCQkJICAiQmFzZSBTdGF0aW9uIElkZW50aXR5IENvZGUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfY2VsbF9pZCwKKysJCQl7ICJDZWxsIElEIiwgIm9tbC5mb20udGVzdHJlcC5pcGEuY2VsbF9pZCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfSEVYLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcnNsX2lwLAorKwkJCXsgIkJTQyBSU0wgSVAgQWRkcmVzcyIsICJvbWwuZm9tLmF0dHIuaXBhLnJzbF9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDAsCisrCQkJICAiSVAgQWRkcmVzcyB0byB3aGljaCB0aGUgQlRTIGVzdGFibGlzaGVzICIKKysJCQkgICJ0aGUgUlNMIGxpbmsiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcnNsX3BvcnQsCisrCQkJeyAiQlNDIFJTTCBUQ1AgUG9ydCIsICJvbWwuZm9tLmF0dHIuaXBhLnJzbF9wb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiUG9ydCBudW1iZXIgdG8gd2hpY2ggdGhlIEJTVCBlc3RhYmxpc2hlcyAiCisrCQkJICAidGhlIFJTTCBsaW5rIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3ByaW1fb21sX2lwLAorKwkJCXsgIlByaW1hcnkgT01MIElQIEFkZHJlc3MiLAorKwkJCQkJIm9tbC5mb20uYXR0ci5pcGEucHJpbV9vbWxfaXAiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAwLAorKwkJCSAgIklQIEFkZHJlc3Mgb2YgdGhlIEJTQyBmb3IgdGhlIHByaW1hcnkgT01MIGxpbmsiLAorKwkJCSAgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3ByaW1fb21sX3BvcnQsCisrCQkJeyAiUHJpbWFyeSBPTUwgVENQIFBvcnQiLAorKwkJCQkJIm9tbC5mb20uYXR0ci5pcGEucHJpbV9vbWxfcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIlRDUCBQb3J0IG9mIHRoZSBCU0MgZm9yIHRoZSBwcmltYXJseSBPTUwgbGluayIsCisrCQkJICBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbG9jYXRpb25fbmFtZSwKKysJCQl7ICJMb2NhdGlvbiBOYW1lIiwgIm9tbC5mb20uYXR0ci5pcGEubG9jX25hbWUiLAorKwkJCSAgRlRfU1RSSU5HLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV91bml0X25hbWUsCisrCQkJeyAiVW5pdCBOYW1lIiwgIm9tbC5mb20uYXR0ci5pcGEudW5pdF9uYW1lIiwKKysJCQkgIEZUX1NUUklORywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdW5pdF9pZCwKKysJCQl7ICJVbml0IElEIiwgIm9tbC5mb20uYXR0ci5pcGEudW5pdF9pZCIsCisrCQkJICBGVF9TVFJJTkcsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX252X2ZsYWdzLAorKwkJCXsgIk5WUkFNIENvbmZpZyBGbGFncyIsICJvbWwuZm9tLmF0dHIuaXBhLm52X2ZsYWdzIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDB4ZmZmZiwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX252X21hc2ssCisrCQkJeyAiTlZSQU0gQ29uZmlnIE1hc2siLCAib21sLmZvbS5hdHRyLmlwYS5udl9tYXNrIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDB4ZmZmZiwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3NpMiwKKysJCQl7ICJTeXN0ZW0gSW5mb3JtYXRpb24gMiIsICJvbWwuZm9tLmF0dHIuaXBhLnNpMiIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfc2kyYmlzLAorKwkJCXsgIlN5c3RlbSBJbmZvcm1hdGlvbiAyYmlzIiwgIm9tbC5mb20uYXR0ci5pcGEuc2kyYmlzIiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9zaTJ0ZXIsCisrCQkJeyAiU3lzdGVtIEluZm9ybWF0aW9uIDJ0ZXIiLCAib21sLmZvbS5hdHRyLmlwYS5zaTJ0ZXIiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2NoYW5fZGVzYywKKysJCQl7ICJDZWxsIENoYW5uZWwgRGVzY3JpcHRpb24iLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLmNoYW5fZGVzYyIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNsX3Nwb3J0LAorKwkJCXsgIk5TIExpbmsgSVAgU291cmNlIFBvcnQiLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLm5zbF9zcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNsX2RhZGRyLAorKwkJCXsgIk5TIExpbmsgSVAgRGVzdGluYXRpb24gQWRkciIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEubnNsX2RhZGRyIiwKKysJCQkgIEZUX0lQdjQsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX25zbF9kcG9ydCwKKysJCQl7ICJOUyBMaW5rIElQIERlc3RpbmF0aW9uIFBvcnQiLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLm5zbF9kcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNlaSwKKysJCQl7ICJOU0VJIiwgIm9tbC5mb20uYXR0ci5pcGEubnNlaSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnN2Y2ksCisrCQkJeyAiTlNWQ0kiLCAib21sLmZvbS5hdHRyLmlwYS5uc3ZjaSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfYnZjaSwKKysJCQl7ICJCVkNJIiwgIm9tbC5mb20uYXR0ci5pcGEuYnZjaSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcmFjLAorKwkJCXsgIlJBQyIsICJvbWwuZm9tLmF0dHIuaXBhLnJhYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIE5VTEwsIDAsCisrCQkJICAiUm91dGluZyBBcmVhIENvZGUiLCBIRklMTCB9CisrCQl9LAorKwl9OworKwlzdGF0aWMgZ2ludCAqZXR0W10gPSB7CisrCQkmZXR0X29tbCwKKysJCSZldHRfb21sX2ZvbSwKKysJCSZldHRfb21sX2ZvbV9hdHQsCisrCX07CisrCisrCW1vZHVsZV90ICpvbWxfbW9kdWxlOworKworKwlwcm90b19hYmlzX29tbCA9IHByb3RvX3JlZ2lzdGVyX3Byb3RvY29sKCJHU00gQS1iaXMgT01MIiwgIk9NTCIsCisrCQkJCQkJICJnc21fYWJpc19vbWwiKTsKKysKKysJcHJvdG9fcmVnaXN0ZXJfZmllbGRfYXJyYXkocHJvdG9fYWJpc19vbWwsIGhmLCBhcnJheV9sZW5ndGgoaGYpKTsKKysKKysJcHJvdG9fcmVnaXN0ZXJfc3VidHJlZV9hcnJheShldHQsIGFycmF5X2xlbmd0aChldHQpKTsKKysKKysJcmVnaXN0ZXJfZGlzc2VjdG9yKCJnc21fYWJpc19vbWwiLCBkaXNzZWN0X2FiaXNfb21sLCBwcm90b19hYmlzX29tbCk7CisrCisrCisrCW9tbF9tb2R1bGUgPSBwcmVmc19yZWdpc3Rlcl9wcm90b2NvbChwcm90b19hYmlzX29tbCwgcHJvdG9fcmVnX2hhbmRvZmZfYWJpc19vbWwpOworKwlwcmVmc19yZWdpc3Rlcl9ib29sX3ByZWZlcmVuY2Uob21sX21vZHVsZSwgInVzZV9pcGFjY2Vzc19vbWwiLAorKwkJICAgICJVc2UgbmFub0JUUyBkZWZpbml0aW9ucyIsCisrCQkgICAgIlVzZSBpcGFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGRlZmluaXRpb25zIGZvciBPTUwiLAorKwkJICAgICZnbG9iYWxfb21sX3VzZV9uYW5vX2J0cyk7CisrfQorKworK3ZvaWQKKytwcm90b19yZWdfaGFuZG9mZl9hYmlzX29tbCh2b2lkKQorK3sKKysJZGlzc2VjdG9yX2hhbmRsZV90IGFiaXNfb21sX2hhbmRsZTsKKysKKysJYWJpc19vbWxfaGFuZGxlID0gY3JlYXRlX2Rpc3NlY3Rvcl9oYW5kbGUoZGlzc2VjdF9hYmlzX29tbCwgcHJvdG9fYWJpc19vbWwpOworKwlkaXNzZWN0b3JfYWRkKCJsYXBkLmdzbS5zYXBpIiwgTEFQRF9HU01fU0FQSV9PTV9QUk9DLCBhYmlzX29tbF9oYW5kbGUpOworK30KK2RpZmYgLS1naXQgYS9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oIGIvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuaAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmQ1MjNlOTYKKy0tLSAvZGV2L251bGwKKysrKyBiL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmgKK0BAIC0wLDAgKzEsNzg3IEBACisrLyogR1NNIE5ldHdvcmsgTWFuYWdlbWVudCBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisrICogM0dQUCBUUyAxMi4yMSB2ZXJzaW9uIDguMC4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDYyMyBWOC4wLjAgKi8KKysKKysvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisrICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKysgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisrICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICoKKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisrICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKysgKgorKyAqLworKworKyNpZm5kZWYgX19QQUNLRVRfQUJJU19PTUxfSF9fCisrI2RlZmluZSBfX1BBQ0tFVF9BQklTX09NTF9IX18KKysKKysjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisrCisrLyogRnJvbSBvcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX25tLmggKi8KKysKKysvKiBnZW5lcmljIGhlYWRlciBpbiBmcm9udCBvZiBldmVyeSBPTUwgbWVzc2FnZSBhY2NvcmRpbmcgdG8gVFMgMDguNTkgKi8KKytzdHJ1Y3QgYWJpc19vbV9oZHIgeworKwlndWludDgJbWRpc2M7CisrCWd1aW50OAlwbGFjZW1lbnQ7CisrCWd1aW50OAlzZXF1ZW5jZTsKKysJZ3VpbnQ4CWxlbmd0aDsKKysJZ3VpbnQ4CWRhdGFbMF07CisrfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisrCisrI2RlZmluZSBBQklTX09NX01ESVNDX0ZPTQkJMHg4MAorKyNkZWZpbmUgQUJJU19PTV9NRElTQ19NTUkJCTB4NDAKKysjZGVmaW5lIEFCSVNfT01fTURJU0NfVFJBVQkJMHgyMAorKyNkZWZpbmUgQUJJU19PTV9NRElTQ19NQU5VRgkJMHgxMAorKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfT05MWQkJMHg4MAorKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfRklSU1QgCTB4NDAKKysjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX01JRERMRQkweDIwCisrI2RlZmluZSBBQklTX09NX1BMQUNFTUVOVF9MQVNUCQkweDEwCisrCisrc3RydWN0IGFiaXNfb21fb2JqX2luc3QgeworKwlndWludDgJYnRzX25yOworKwlndWludDgJdHJ4X25yOworKwlndWludDgJdHNfbnI7CisrfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisrCisrc3RydWN0IGFiaXNfb21fZm9tX2hkciB7CisrCWd1aW50OAltc2dfdHlwZTsKKysJZ3VpbnQ4CW9ial9jbGFzczsKKysJc3RydWN0IGFiaXNfb21fb2JqX2luc3QJb2JqX2luc3Q7CisrCWd1aW50OAlkYXRhWzBdOworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworKyNkZWZpbmUgQUJJU19PTV9GT01fSERSX1NJWkUJKHNpemVvZihzdHJ1Y3QgYWJpc19vbV9oZHIpICsgc2l6ZW9mKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIpKQorKworKy8qIFNlY3Rpb24gOS4xOiBNZXNzYWdlIFR5cGVzICovCisrZW51bSBhYmlzX25tX21zZ3R5cGUgeworKwkvKiBTVyBEb3dubG9hZCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX0xPQURfSU5JVAkJCT0gMHgwMSwKKysJTk1fTVRfTE9BRF9JTklUX0FDSywKKysJTk1fTVRfTE9BRF9JTklUX05BQ0ssCisrCU5NX01UX0xPQURfU0VHLAorKwlOTV9NVF9MT0FEX1NFR19BQ0ssCisrCU5NX01UX0xPQURfQUJPUlQsCisrCU5NX01UX0xPQURfRU5ELAorKwlOTV9NVF9MT0FEX0VORF9BQ0ssCisrCU5NX01UX0xPQURfRU5EX05BQ0ssCisrCU5NX01UX1NXX0FDVF9SRVEsCQkvKiBCVFMtPkJTQyAqLworKwlOTV9NVF9TV19BQ1RfUkVRX0FDSywKKysJTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAorKwlOTV9NVF9BQ1RJVkFURV9TVywJCS8qIEJTQy0+QlRTICovCisrCU5NX01UX0FDVElWQVRFX1NXX0FDSywKKysJTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywKKysJTk1fTVRfU1dfQUNUSVZBVEVEX1JFUCwJCS8qIDB4MTAgKi8KKysJLyogQS1iaXMgSW50ZXJmYWNlIE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfRVNUQUJMSVNIX1RFSQkJPSAweDIxLAorKwlOTV9NVF9FU1RBQkxJU0hfVEVJX0FDSywKKysJTk1fTVRfRVNUQUJMSVNIX1RFSV9OQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfU0lHTiwKKysJTk1fTVRfQ09OTl9URVJSX1NJR05fQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfU0lHTl9OQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfU0lHTiwKKysJTk1fTVRfRElTQ19URVJSX1NJR05fQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfU0lHTl9OQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfVFJBRiwKKysJTk1fTVRfQ09OTl9URVJSX1RSQUZfQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfVFJBRiwKKysJTk1fTVRfRElTQ19URVJSX1RSQUZfQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfVFJBRl9OQUNLLAorKwkvKiBUcmFuc21pc3Npb24gTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9DT05OX01EUk9QX0xJTksJCT0gMHgzMSwKKysJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX0FDSywKKysJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCisrCU5NX01UX0RJU0NfTURST1BfTElOSywKKysJTk1fTVRfRElTQ19NRFJPUF9MSU5LX0FDSywKKysJTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCisrCS8qIEFpciBJbnRlcmZhY2UgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9TRVRfQlRTX0FUVFIJCT0gMHg0MSwKKysJTk1fTVRfU0VUX0JUU19BVFRSX0FDSywKKysJTk1fTVRfU0VUX0JUU19BVFRSX05BQ0ssCisrCU5NX01UX1NFVF9SQURJT19BVFRSLAorKwlOTV9NVF9TRVRfUkFESU9fQVRUUl9BQ0ssCisrCU5NX01UX1NFVF9SQURJT19BVFRSX05BQ0ssCisrCU5NX01UX1NFVF9DSEFOX0FUVFIsCisrCU5NX01UX1NFVF9DSEFOX0FUVFJfQUNLLAorKwlOTV9NVF9TRVRfQ0hBTl9BVFRSX05BQ0ssCisrCS8qIFRlc3QgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9QRVJGX1RFU1QJCQk9IDB4NTEsCisrCU5NX01UX1BFUkZfVEVTVF9BQ0ssCisrCU5NX01UX1BFUkZfVEVTVF9OQUNLLAorKwlOTV9NVF9URVNUX1JFUCwKKysJTk1fTVRfU0VORF9URVNUX1JFUCwKKysJTk1fTVRfU0VORF9URVNUX1JFUF9BQ0ssCisrCU5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywKKysJTk1fTVRfU1RPUF9URVNULAorKwlOTV9NVF9TVE9QX1RFU1RfQUNLLAorKwlOTV9NVF9TVE9QX1RFU1RfTkFDSywKKysJLyogU3RhdGUgTWFuYWdlbWVudCBhbmQgRXZlbnQgUmVwb3J0IE1lc3NhZ2VzICovCisrCU5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUAk9IDB4NjEsCisrCU5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAorKwlOTV9NVF9TVE9QX0VWRU5UX1JFUCwKKysJTk1fTVRfU1RPUF9FVkVOVF9SRVBfQUNLLAorKwlOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAorKwlOTV9NVF9SRVNUX0VWRU5UX1JFUCwKKysJTk1fTVRfUkVTVF9FVkVOVF9SRVBfQUNLLAorKwlOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX0FDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUSwKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAorKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TCQk9IDB4OTMsCisrCU5NX01UX1JFUF9PVVRTVF9BTEFSTVNfQUNLLAorKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCisrCS8qIEVxdWlwbWVudCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX0NIQU5HRU9WRVIJCT0gMHg3MSwKKysJTk1fTVRfQ0hBTkdFT1ZFUl9BQ0ssCisrCU5NX01UX0NIQU5HRU9WRVJfTkFDSywKKysJTk1fTVRfT1BTVEFSVCwKKysJTk1fTVRfT1BTVEFSVF9BQ0ssCisrCU5NX01UX09QU1RBUlRfTkFDSywKKysJTk1fTVRfUkVJTklULAorKwlOTV9NVF9SRUlOSVRfQUNLLAorKwlOTV9NVF9SRUlOSVRfTkFDSywKKysJTk1fTVRfU0VUX1NJVEVfT1VULAkJLyogQlMxMTogZ2V0IGFsYXJtID8hPyAqLworKwlOTV9NVF9TRVRfU0lURV9PVVRfQUNLLAorKwlOTV9NVF9TRVRfU0lURV9PVVRfTkFDSywKKysJTk1fTVRfQ0hHX0hXX0NPTkYJCT0gMHg5MCwKKysJTk1fTVRfQ0hHX0hXX0NPTkZfQUNLLAorKwlOTV9NVF9DSEdfSFdfQ09ORl9OQUNLLAorKwkvKiBNZWFzdXJlbWVudCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX01FQVNfUkVTX1JFUQkJPSAweDhhLAorKwlOTV9NVF9NRUFTX1JFU19SRVNQLAorKwlOTV9NVF9TVE9QX01FQVMsCisrCU5NX01UX1NUQVJUX01FQVMsCisrCS8qIE90aGVyIE1lc3NhZ2VzICovCisrCU5NX01UX0dFVF9BVFRSCQkJPSAweDgxLAorKwlOTV9NVF9HRVRfQVRUUl9SRVNQLAorKwlOTV9NVF9HRVRfQVRUUl9OQUNLLAorKwlOTV9NVF9TRVRfQUxBUk1fVEhSRVMsCisrCU5NX01UX1NFVF9BTEFSTV9USFJFU19BQ0ssCisrCU5NX01UX1NFVF9BTEFSTV9USFJFU19OQUNLLAorKworKwlOTV9NVF9JUEFDQ19SRVNUQVJUCQk9IDB4ODcsCisrCU5NX01UX0lQQUNDX1JFU1RBUlRfQUNLLAorK307CisrCisrZW51bSBhYmlzX25tX21zZ3R5cGVfYnMxMSB7CisrCU5NX01UX0JTMTFfUkVTRVRfUkVTT1VSQ0UJPSAweDc0LAorKworKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYCQk9IDB4YTMsCisrCU5NX01UX0JTMTFfQkVHSU5fREJfVFhfQUNLLAorKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCisrCU5NX01UX0JTMTFfRU5EX0RCX1RYCQk9IDB4YTYsCisrCU5NX01UX0JTMTFfRU5EX0RCX1RYX0FDSywKKysJTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywKKysJTk1fTVRfQlMxMV9DUkVBVEVfT0JKCQk9IDB4YTksCisrCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9BQ0ssCisrCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAorKwlOTV9NVF9CUzExX0RFTEVURV9PQkoJCT0gMHhhYywKKysJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX0FDSywKKysJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCisrCisrCU5NX01UX0JTMTFfU0VUX0FUVFIJCT0gMHhkMCwKKysJTk1fTVRfQlMxMV9TRVRfQVRUUl9BQ0ssCisrCU5NX01UX0JTMTFfU0VUX0FUVFJfTkFDSywKKysJTk1fTVRfQlMxMV9MTVRfU0VTU0lPTgkJPSAweGRjLAorKworKwlOTV9NVF9CUzExX0dFVF9TVEFURQkJPSAweGUzLAorKwlOTV9NVF9CUzExX0dFVF9TVEFURV9BQ0ssCisrCU5NX01UX0JTMTFfTE1UX0xPR09OCQk9IDB4ZTUsCisrCU5NX01UX0JTMTFfTE1UX0xPR09OX0FDSywKKysJTk1fTVRfQlMxMV9SRVNUQVJUCQk9IDB4ZTcsCisrCU5NX01UX0JTMTFfUkVTVEFSVF9BQ0ssCisrCU5NX01UX0JTMTFfRElTQ09OTkVDVAkJPSAweGU5LAorKwlOTV9NVF9CUzExX0RJU0NPTk5FQ1RfQUNLLAorKwlOTV9NVF9CUzExX0xNVF9MT0dPRkYJCT0gMHhlYywKKysJTk1fTVRfQlMxMV9MTVRfTE9HT0ZGX0FDSywKKysJTk1fTVRfQlMxMV9SRUNPTk5FQ1QJCT0gMHhmMSwKKysJTk1fTVRfQlMxMV9SRUNPTk5FQ1RfQUNLLAorK307CisrCisrZW51bSBhYmlzX25tX21zZ3R5cGVfaXBhY2MgeworKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVAkJPSAweGUwLAorKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9BQ0ssCisrCU5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0ssCisrCU5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUCT0gMHhlMywKKysJTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfQUNLLAorKwlOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVF9OQUNLLAorKwlOTV9NVF9JUEFDQ19DT05OX1RSQUYJCT0gMHhlNiwKKysJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX0FDSywKKysJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX05BQ0ssCisrCU5NX01UX0lQQUNDX0RJU0NfVFJBRgkJPSAweGU5LAorKwlOTV9NVF9JUEFDQ19ESVNDX1RSQUZfQUNLLAorKwlOTV9NVF9JUEFDQ19ESVNDX1RSQUZfTkFDSywKKysJTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1cJCT0gMHhlYywKKysJTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfQUNLLAorKwlOTV9NVF9JUEFDQ19ERUZfQk9PVF9TV19OQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSCQk9IDB4ZWYsCisrCU5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0ssCisrCU5NX01UX0lQQUNDX0dFVF9OVkFUVFIJCT0gMHhmMiwKKysJTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9BQ0ssCisrCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSywKKysJTk1fTVRfSVBBQ0NfU0VUX0FUVFIJCT0gMHhmNSwKKysJTk1fTVRfSVBBQ0NfU0VUX0FUVFJfQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLLAorKwlOTV9NVF9JUEFDQ19BVFRSX0NIR19FVlQJPSAweGY4LAorKwlOTV9NVF9JUEFDQ19TV19ERUFDVAkJPSAweGY5LAorKwlOTV9NVF9JUEFDQ19TV19ERUFDVF9BQ0ssCisrCU5NX01UX0lQQUNDX1NXX0RFQUNUX05BQ0ssCisrCU5NX01UX0lQQUNDX01FQVNfUkVTX1JFUV9OQUNLCT0gMHhmYywKKysJTk1fTVRfSVBBQ0NfU1RBUlRfTUVBU19OQUNLLAorKwlOTV9NVF9JUEFDQ19TVE9QX01FQVNfTkFDSywKKyt9OworKworK2VudW0gYWJpc19ubV9iczExX2NlbGxfYWxsb2MgeworKwlOTV9CUzExX0NBTlJfR1NNCT0gMHgwMCwKKysJTk1fQlMxMV9DQU5SX0RDUzE4MDAJPSAweDAxLAorK307CisrCisrLyogU2VjdGlvbiA5LjI6IE9iamVjdCBDbGFzcyAqLworK2VudW0gYWJpc19ubV9vYmpfY2xhc3MgeworKwlOTV9PQ19TSVRFX01BTkFHRVIJCT0gMHgwMCwKKysJTk1fT0NfQlRTLAorKwlOTV9PQ19SQURJT19DQVJSSUVSLAorKwlOTV9PQ19DSEFOTkVMLAorKwlOTV9PQ19CQVNFQl9UUkFOU0MsCisrCS8qIFJGVTogMDUtRkUgKi8KKysJTk1fT0NfQlMxMV9BREpDCQkJPSAweGEwLAorKwlOTV9PQ19CUzExX0hBTkRPVkVSCQk9IDB4YTEsCisrCU5NX09DX0JTMTFfUFdSX0NUUkwJCT0gMHhhMiwKKysJTk1fT0NfQlMxMV9CVFNFCQkJPSAweGEzLAkJLyogTE1UPyAqLworKwlOTV9PQ19CUzExX1JBQ0sJCQk9IDB4YTQsCisrCU5NX09DX0JTMTEJCQk9IDB4YTUsCQkvKiAwMTogQUxDTyAqLworKwlOTV9PQ19CUzExX1RFU1QJCQk9IDB4YTYsCisrCU5NX09DX0JTMTFfRU5WQUJUU0UJCT0gMHhhOCwKKysJTk1fT0NfQlMxMV9CUE9SVAkJPSAweGE5LAorKworKwlOTV9PQ19HUFJTX05TRQkJCT0gMHhmMCwKKysJTk1fT0NfR1BSU19DRUxMCQkJPSAweGYxLAorKwlOTV9PQ19HUFJTX05TVkMwCQk9IDB4ZjIsCisrCU5NX09DX0dQUlNfTlNWQzEJCT0gMHhmMywKKysKKysJTk1fT0NfTlVMTAkJCT0gMHhmZiwKKyt9OworKworKy8qIFNlY3Rpb24gOS40OiBBdHRyaWJ1dGVzICovCisrZW51bSBhYmlzX25tX2F0dHIgeworKwlOTV9BVFRfQUJJU19DSEFOTkVMCT0gMHgwMSwKKysJTk1fQVRUX0FERF9JTkZPLAorKwlOTV9BVFRfQUREX1RFWFQsCisrCU5NX0FUVF9BRE1fU1RBVEUsCisrCU5NX0FUVF9BUkZDTl9MSVNULAorKwlOTV9BVFRfQVVUT05fUkVQT1JULAorKwlOTV9BVFRfQVZBSUxfU1RBVFVTLAorKwlOTV9BVFRfQkNDSF9BUkZDTiwKKysJTk1fQVRUX0JTSUMsCisrCU5NX0FUVF9CVFNfQUlSX1RJTUVSLAorKwlOTV9BVFRfQ0NDSF9MX0lfUCwKKysJTk1fQVRUX0NDQ0hfTF9ULAorKwlOTV9BVFRfQ0hBTl9DT01CLAorKwlOTV9BVFRfQ09OTl9GQUlMX0NSSVQsCisrCU5NX0FUVF9ERVNULAorKwkvKiByZXMgKi8KKysJTk1fQVRUX0VWRU5UX1RZUEUJPSAweDExLCAvKiBCUzExOiBmaWxlIGRhdGEgPyE/ICovCisrCU5NX0FUVF9GSUxFX0lELAorKwlOTV9BVFRfRklMRV9WRVJTSU9OLAorKwlOTV9BVFRfR1NNX1RJTUUsCisrCU5NX0FUVF9IU04sCisrCU5NX0FUVF9IV19DT05GSUcsCisrCU5NX0FUVF9IV19ERVNDLAorKwlOTV9BVFRfSU5UQVZFX1BBUkFNLAorKwlOTV9BVFRfSU5URVJGX0JPVU5ELAorKwlOTV9BVFRfTElTVF9SRVFfQVRUUiwKKysJTk1fQVRUX01BSU8sCisrCU5NX0FUVF9NQU5VRl9TVEFURSwKKysJTk1fQVRUX01BTlVGX1RIUkVTSCwKKysJTk1fQVRUX01BTlVGX0lELAorKwlOTV9BVFRfTUFYX1RBLAorKwlOTV9BVFRfTURST1BfTElOSywJLyogMHgyMCAqLworKwlOTV9BVFRfTURST1BfTkVYVCwKKysJTk1fQVRUX05BQ0tfQ0FVU0VTLAorKwlOTV9BVFRfTlkxLAorKwlOTV9BVFRfT1BFUl9TVEFURSwKKysJTk1fQVRUX09WRVJMX1BFUklPRCwKKysJTk1fQVRUX1BIWVNfQ09ORiwKKysJTk1fQVRUX1BPV0VSX0NMQVNTLAorKwlOTV9BVFRfUE9XRVJfVEhSRVNILAorKwlOTV9BVFRfUFJPQl9DQVVTRSwKKysJTk1fQVRUX1JBQ0hfQl9USFJFU0gsCisrCU5NX0FUVF9MREFWR19TTE9UUywKKysJTk1fQVRUX1JBRF9TVUJDLAorKwlOTV9BVFRfUkZfTUFYUE9XUl9SLAorKwlOTV9BVFRfU0lURV9JTlBVVFMsCisrCU5NX0FUVF9TSVRFX09VVFBVVFMsCisrCU5NX0FUVF9TT1VSQ0UsCQkvKiAweDMwICovCisrCU5NX0FUVF9TUEVDX1BST0IsCisrCU5NX0FUVF9TVEFSVF9USU1FLAorKwlOTV9BVFRfVDIwMCwKKysJTk1fQVRUX1RFSSwKKysJTk1fQVRUX1RFU1RfRFVSLAorKwlOTV9BVFRfVEVTVF9OTywKKysJTk1fQVRUX1RFU1RfUkVQT1JULAorKwlOTV9BVFRfVlNXUl9USFJFU0gsCisrCU5NX0FUVF9XSU5ET1dfU0laRSwKKysJLyogUmVzICAqLworKwlOTV9BVFRfQlMxMV9SU1NJX09GRlMJPSAweDNkLAorKwlOTV9BVFRfQlMxMV9UWFBXUgk9IDB4M2UsCisrCU5NX0FUVF9CUzExX0RJVkVSU0lUWQk9IDB4M2YsCisrCS8qIFJlcyAgKi8KKysJTk1fQVRUX1RTQwkJPSAweDQwLAorKwlOTV9BVFRfU1dfQ09ORklHLAorKwlOTV9BVFRfU1dfREVTQ1IsCisrCU5NX0FUVF9TRVZFUklUWSwKKysJTk1fQVRUX0dFVF9BUkksCisrCU5NX0FUVF9IV19DT05GX0NIRywKKysJTk1fQVRUX09VVFNUX0FMQVJNLAorKwlOTV9BVFRfRklMRV9EQVRBLAorKwlOTV9BVFRfTUVBU19SRVMsCisrCU5NX0FUVF9NRUFTX1RZUEUsCisrCisrCU5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PCT0gMHg0YywKKysJTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8JPSAweDRmLAorKworKwlOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTAk9IDB4NTUsCisrCU5NX0FUVF9CUzExX0VYQ0VTU0lWRV9ESVNUQU5DRQk9IDB4NTgsCisrCisrCU5NX0FUVF9CUzExX0FMTF9URVNUX0NBVEcJPSAweDYwLAorKwlOTV9BVFRfQlMxMV9CVFNMU19IT1BQSU5HLAorKwlOTV9BVFRfQlMxMV9DRUxMX0FMTE9DX05SLAorKwlOTV9BVFRfQlMxMV9DRUxMX0dMT0JBTF9JRCwKKysJTk1fQVRUX0JTMTFfRU5BX0lOVEVSRl9DTEFTUwk9IDB4NjYsCisrCU5NX0FUVF9CUzExX0VOQV9JTlRfSU5URUNfSEFORE8JPSAweDY3LAorKwlOTV9BVFRfQlMxMV9FTkFfSU5UX0lOVFJDX0hBTkRPCT0gMHg2OCwKKysJTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMCT0gMHg2OSwKKysJTk1fQVRUX0JTMTFfRU5BX1BXUl9CREdUX0hPCT0gMHg2YSwKKysJTk1fQVRUX0JTMTFfRU5BX1BXUl9DVFJMX1JMRlcJPSAweDZiLAorKwlOTV9BVFRfQlMxMV9FTkFfUlhMRVZfSE8JPSAweDZjLAorKwlOTV9BVFRfQlMxMV9FTkFfUlhRVUFMX0hPCT0gMHg2ZCwKKysJTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTAkJPSAweDZlLAorKworKwlOTV9BVFRfSVBBQ0NfRFNUX0lQCQk9IDB4ODAsCisrCU5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVAk9IDB4ODEsCisrCU5NX0FUVF9JUEFDQ19TU1JDCQk9IDB4ODIsCQkvKiBSVFAgU3luYyBTb3VyY2UgKi8KKysJTk1fQVRUX0lQQUNDX1JUUF9QQVlMRF9UWVBFCT0gMHg4MywKKysJTk1fQVRUX0lQQUNDX0JBU0VCX0lECQk9IDB4ODQsCisrCU5NX0FUVF9JUEFDQ19TVFJFQU1fSUQJCT0gMHg4NSwKKysJTk1fQVRUX0lQQUNDX05WX0ZMQUdTCQk9IDB4ODYsCisrCU5NX0FUVF9JUEFDQ19GUkVRX0NUUkwJCT0gMHg4NywKKysJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGRwk9IDB4ODgsCisrCU5NX0FUVF9JUEFDQ19TRUNfT01MX0NGRwk9IDB4ODksCisrCU5NX0FUVF9JUEFDQ19JUF9JRl9DRkcJCT0gMHg4YSwJCS8qIElQIGludGVyZmFjZSAqLworKwlOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHCQk9IDB4OGIsCQkvKiBJUCBnYXRld2F5ICovCisrCU5NX0FUVF9JUEFDQ19JTl9TRVJWX1RJTUUJPSAweDhjLAorKwlOTV9BVFRfSVBBQ0NfVFJYX0JUU19BU1MJPSAweDhkLAorKwlOTV9BVFRfSVBBQ0NfTE9DQVRJT04JCT0gMHg4ZSwJCS8qIHN0cmluZyBkZXNjcmliaW5nIGxvY2F0aW9uICovCisrCU5NX0FUVF9JUEFDQ19QQUdJTkdfQ0ZHCQk9IDB4OGYsCisrCU5NX0FUVF9JUEFDQ19GSUxFX0RBVEEJCT0gMHg5MCwKKysJTk1fQVRUX0lQQUNDX1VOSVRfSUQJCT0gMHg5MSwJCS8qIFNpdGUvQlRTL1RSWCAqLworKwlOTV9BVFRfSVBBQ0NfUEFSRU5UX1VOSVRfSUQJPSAweDkyLAorKwlOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FCQk9IDB4OTMsCQkvKiBkZWZhdWx0OiBuYnRzLTxtYWMtYXMtc3RyaW5nPiAqLworKwlOTV9BVFRfSVBBQ0NfU05NUF9DRkcJCT0gMHg5NCwKKysJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNUCT0gMHg5NSwKKysJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0ZCX1RPVVQJPSAweDk2LAkJLyogZmFsbGJhY2sgdGltZW91dCAqLworKwlOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGRwkJPSAweDk3LAorKwlOTV9BVFRfSVBBQ0NfVElNSU5HX0JVUwkJPSAweDk4LAorKwlOTV9BVFRfSVBBQ0NfQ0dJCQk9IDB4OTksCQkvKiBDZWxsIEdsb2JhbCBJRCAqLworKwlOTV9BVFRfSVBBQ0NfUkFDCQk9IDB4OWEsCisrCU5NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTgk9IDB4OWIsCisrCU5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcJPSAweDljLAorKwlOTV9BVFRfSVBBQ0NfTlNFSQkJPSAweDlkLAorKwlOTV9BVFRfSVBBQ0NfQlZDSQkJPSAweDllLAorKwlOTV9BVFRfSVBBQ0NfTlNWQ0kJCT0gMHg5ZiwKKysJTk1fQVRUX0lQQUNDX05TX0NGRwkJPSAweGEwLAorKwlOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHCQk9IDB4YTEsCisrCU5NX0FUVF9JUEFDQ19OU19MSU5LX0NGRwk9IDB4YTIsCisrCU5NX0FUVF9JUEFDQ19STENfQ0ZHCQk9IDB4YTMsCisrCU5NX0FUVF9JUEFDQ19BTE1fVEhSRVNIX0xJU1QJPSAweGE0LAorKwlOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1QJPSAweGE1LAorKwlOTV9BVFRfSVBBQ0NfVElCX0NPTlRST0wJPSAweGE2LAorKwlOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFUwk9IDB4YTcsCisrCU5NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FUwk9IDB4YTgsCisrCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzIJCT0gMHhhOSwKKysJTk1fQVRUX0lQQUNDX0hFQVJUQl9UT1VUCT0gMHhhYSwKKysJTk1fQVRUX0lQQUNDX1VQVElNRQkJPSAweGFiLAorKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18zCQk9IDB4YWMsCisrCU5NX0FUVF9JUEFDQ19TU0xfQ0ZHCQk9IDB4YWQsCisrCU5NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEUJPSAweGFlLAorKwlOTV9BVFRfSVBBQ0NfSU1MX1NTTF9TVEFURQk9IDB4YWYsCisrCU5NX0FUVF9JUEFDQ19SRVZPQ19EQVRFCQk9IDB4YjAsCisrCisrCisrCU5NX0FUVF9CUzExX1JGX1JFU19JTkRfUEVSCT0gMHg4ZiwKKysKKysJTk1fQVRUX0JTMTFfUlhfTEVWX01JTl9DRUxMCT0gMHg5MCwKKysJTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRQk9IDB4OTEsCisrCU5NX0FUVF9CUzExX1RJTUVSX0hPX1JFUVVFU1QJPSAweDkyLAorKwlOTV9BVFRfQlMxMV9USU1FUl9OQ0VMTAkJPSAweDkzLAorKwlOTV9BVFRfQlMxMV9UU1lOQwkJPSAweDk0LAorKwlOTV9BVFRfQlMxMV9UVFJBVQkJPSAweDk1LAorKwlOTV9BVFRfQlMxMV9FTVJHX0NGR19NRU1CRVIJPSAweDliLAorKwlOTV9BVFRfQlMxMV9UUlhfQVJFQQkJPSAweDlmLAorKworKwlOTV9BVFRfQlMxMV9CQ0NIX1JFQ09ORgkJPSAweGQ3LAorKwlOTV9BVFRfQlMxMV9CSVRfRVJSX1RIRVNICT0gMHhhMCwKKysJTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTCT0gMHhhMSwKKysJTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWQk9IDB4YTMsCisrCU5NX0FUVF9CUzExX0NDTEtfVFlQRQkJPSAweGE0LAorKwlOTV9BVFRfQlMxMV9JTlBfSU1QRURBTkNFCT0gMHhhYSwKKysJTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFCT0gMHhhYiwKKysJTk1fQVRUX0JTMTFfTElORV9DRkcJCT0gMHhhYywKKysJTk1fQVRUX0JTMTFfTElfUE9SVF8xCQk9IDB4YWQsCisrCU5NX0FUVF9CUzExX0xJX1BPUlRfMgkJPSAweGFlLAorKworKwlOTV9BVFRfQlMxMV9MMV9SRU1fQUxNX1RZUEUJPSAweGIwLAorKwlOTV9BVFRfQlMxMV9TV19MT0FEX0lOVEVOREVECT0gMHhiYiwKKysJTk1fQVRUX0JTMTFfU1dfTE9BRF9TQUZFVFkJPSAweGJjLAorKwlOTV9BVFRfQlMxMV9TV19MT0FEX1NUT1JFRAk9IDB4YmQsCisrCisrCU5NX0FUVF9CUzExX1ZFTkRPUl9OQU1FCQk9IDB4YzEsCisrCU5NX0FUVF9CUzExX0hPUFBJTkdfTU9ERQk9IDB4YzUsCisrCU5NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OCT0gMHhjNiwKKysJTk1fQVRUX0JTMTFfTE1UX0xPR0lOX1RJTUUJPSAweGM3LAorKwlOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWCT0gMHhjOCwKKysJTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRQk9IDB4YzksCisrCisrCU5NX0FUVF9CUzExX0wxX0NPTlRST0xfVFMJPSAweGQ4LAorKwlOTV9BVFRfQlMxMV9SQURJT19NRUFTX0dSQU4JPSAweGRjLAkvKiBpbiBTQUNDSCBtdWx0aWZyYW1lcyAqLworKwlOTV9BVFRfQlMxMV9SQURJT19NRUFTX1JFUAk9IDB4ZGQsCisrCisrCU5NX0FUVF9CUzExX1NIX0xBUERfSU5UX1RJTUVSCT0gMHhlOCwKKysKKysJTk1fQVRUX0JTMTFfQlRTX1NUQVRFCQk9IDB4ZjAsCisrCU5NX0FUVF9CUzExX0UxX1NUQVRFCQk9IDB4ZjEsCisrCU5NX0FUVF9CUzExX1BMTAkJCT0gMHhmMiwKKysJTk1fQVRUX0JTMTFfUlhfT0ZGU0VUCQk9IDB4ZjMsCisrCU5NX0FUVF9CUzExX0FOVF9UWVBFCQk9IDB4ZjQsCisrCU5NX0FUVF9CUzExX1BMTF9NT0RFCQk9IDB4ZmMsCisrCU5NX0FUVF9CUzExX1BBU1NXT1JECQk9IDB4ZmQsCisrfTsKKysjZGVmaW5lIE5NX0FUVF9CUzExX0ZJTEVfREFUQQlOTV9BVFRfRVZFTlRfVFlQRQorKworKy8qIFNlY3Rpb24gOS40LjQ6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCisrZW51bSBhYmlzX25tX2FkbV9zdGF0ZSB7CisrCU5NX1NUQVRFX0xPQ0tFRAkJPSAweDAxLAorKwlOTV9TVEFURV9VTkxPQ0tFRAk9IDB4MDIsCisrCU5NX1NUQVRFX1NIVVRET1dOCT0gMHgwMywKKysJTk1fU1RBVEVfTlVMTAkJPSAweGZmLAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTM6IENoYW5uZWwgQ29tYmluYXRpb24gKi8KKytlbnVtIGFiaXNfbm1fY2hhbl9jb21iIHsKKysJTk1fQ0hBTkNfVENIRnVsbAk9IDB4MDAsCisrCU5NX0NIQU5DX1RDSEhhbGYJPSAweDAxLAorKwlOTV9DSEFOQ19UQ0hIYWxmMgk9IDB4MDIsCisrCU5NX0NIQU5DX1NEQ0NICQk9IDB4MDMsCisrCU5NX0NIQU5DX21haW5CQ0NICT0gMHgwNCwKKysJTk1fQ0hBTkNfQkNDSENvbWIJPSAweDA1LAorKwlOTV9DSEFOQ19CQ0NICQk9IDB4MDYsCisrCU5NX0NIQU5DX0JDQ0hfQ0JDSAk9IDB4MDcsCisrCU5NX0NIQU5DX1NEQ0NIX0NCQ0gJPSAweDA4LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTY6IEV2ZW50IFR5cGUgKi8KKytlbnVtIGFiaXNfbm1fZXZlbnRfdHlwZSB7CisrCU5NX0VWVF9DT01NX0ZBSUwJPSAweDAwLAorKwlOTV9FVlRfUU9TX0ZBSUwJCT0gMHgwMSwKKysJTk1fRVZUX1BST0NfRkFJTAk9IDB4MDIsCisrCU5NX0VWVF9FUVVJUF9GQUlMCT0gMHgwMywKKysJTk1fRVZUX0VOVl9GQUlMCQk9IDB4MDQsCisrfTsKKysKKysvKiBTZWN0aW9uOiA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworK2VudW0gYWJpc19ubV9zZXZlcml0eSB7CisrCU5NX1NFVkVSX0NFQVNFRAkJPSAweDAwLAorKwlOTV9TRVZFUl9DUklUSUNBTAk9IDB4MDEsCisrCU5NX1NFVkVSX01BSk9SCQk9IDB4MDIsCisrCU5NX1NFVkVSX01JTk9SCQk9IDB4MDMsCisrCU5NX1NFVkVSX1dBUk5JTkcJPSAweDA0LAorKwlOTV9TRVZFUl9JTkRFVEVSTUlOQVRFCT0gMHgwNSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjQzOiBQcm9iYWJsZSBDYXVzZSBUeXBlICovCisrZW51bSBhYmlzX25tX3BjYXVzZV90eXBlIHsKKysJTk1fUENBVVNFX1RfWDcyMQk9IDB4MDEsCisrCU5NX1BDQVVTRV9UX0dTTQkJPSAweDAyLAorKwlOTV9QQ0FVU0VfVF9NQU5VRgk9IDB4MDMsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4zNjogTkFDSyBDYXVzZXMgKi8KKytlbnVtIGFiaXNfbm1fbmFja19jYXVzZSB7CisrCS8qIEdlbmVyYWwgTmFjayBDYXVzZXMgKi8KKysJTk1fTkFDS19JTkNPUlJfU1RSVUNUCQk9IDB4MDEsCisrCU5NX05BQ0tfTVNHVFlQRV9JTlZBTAkJPSAweDAyLAorKwlOTV9OQUNLX09CSkNMQVNTX0lOVkFMCQk9IDB4MDUsCisrCU5NX05BQ0tfT0JKQ0xBU1NfTk9UU1VQUAk9IDB4MDYsCisrCU5NX05BQ0tfQlRTTlJfVU5LTgkJPSAweDA3LAorKwlOTV9OQUNLX1RSWE5SX1VOS04JCT0gMHgwOCwKKysJTk1fTkFDS19PQkpJTlNUX1VOS04JCT0gMHgwOSwKKysJTk1fTkFDS19BVFRSSURfSU5WQUwJCT0gMHgwYywKKysJTk1fTkFDS19BVFRSSURfTk9UU1VQUAkJPSAweDBkLAorKwlOTV9OQUNLX1BBUkFNX1JBTkdFCQk9IDB4MGUsCisrCU5NX05BQ0tfQVRUUkxJU1RfSU5DT05TSVNURU5UCT0gMHgwZiwKKysJTk1fTkFDS19TUEVDX0lNUExfTk9UU1VQUAk9IDB4MTAsCisrCU5NX05BQ0tfQ0FOVF9QRVJGT1JNCQk9IDB4MTEsCisrCS8qIFNwZWNpZmljIE5hY2sgQ2F1c2VzICovCisrCU5NX05BQ0tfUkVTX05PVElNUEwJCT0gMHgxOSwKKysJTk1fTkFDS19SRVNfTk9UQVZBSUwJCT0gMHgxYSwKKysJTk1fTkFDS19GUkVRX05PVEFWQUlMCQk9IDB4MWIsCisrCU5NX05BQ0tfVEVTVF9OT1RTVVBQCQk9IDB4MWMsCisrCU5NX05BQ0tfQ0FQQUNJVFlfUkVTVFIJCT0gMHgxZCwKKysJTk1fTkFDS19QSFlTQ0ZHX05PVFBFUkZPUk0JPSAweDFlLAorKwlOTV9OQUNLX1RFU1RfTk9USU5JVAkJPSAweDFmLAorKwlOTV9OQUNLX1BIWVNDRkdfTk9UUkVTVE9SRQk9IDB4MjAsCisrCU5NX05BQ0tfVEVTVF9OT1NVQ0gJCT0gMHgyMSwKKysJTk1fTkFDS19URVNUX05PU1RPUAkJPSAweDIyLAorKwlOTV9OQUNLX01TR0lOQ09OU0lTVF9QSFlTQ0ZHCT0gMHgyMywKKysJTk1fTkFDS19GSUxFX0lOQ09NUExFVEUJCT0gMHgyNSwKKysJTk1fTkFDS19GSUxFX05PVEFWQUlMCQk9IDB4MjYsCisrCU5NX05BQ0tfRklMRV9OT1RBQ1RJVkFURQk9IDB4MjcsCisrCU5NX05BQ0tfUkVRX05PVF9HUkFOVAkJPSAweDI4LAorKwlOTV9OQUNLX1dBSVQJCQk9IDB4MjksCisrCU5NX05BQ0tfTk9USF9SRVBPUlRfRVhJU1QJPSAweDJhLAorKwlOTV9OQUNLX01FQVNfTk9UU1VQUAkJPSAweDJiLAorKwlOTV9OQUNLX01FQVNfTk9UU1RBUlQJCT0gMHgyYywKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjEgKi8KKytzdHJ1Y3QgYWJpc19ubV9jaGFubmVsIHsKKysJZ3VpbnQ4CWF0dHJpYjsKKysJZ3VpbnQ4CWJ0c19wb3J0OworKwlndWludDgJdGltZXNsb3Q7CisrCWd1aW50OAlzdWJzbG90OworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworKy8qIFNpZW1lbnMgQlMtMTEgc3BlY2lmaWMgb2JqZWN0cyBpbiB0aGUgU2llbmVtc0hXICgweEE1KSBvYmplY3QgY2xhc3MgKi8KKytlbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHsKKysJQlMxMV9PQkpfQUxDTwkJPSAweDAxLAorKwlCUzExX09CSl9CQlNJRwkJPSAweDAyLAkvKiBvYmpfY2xhc3M6IDAsMSAqLworKwlCUzExX09CSl9UUlgxCQk9IDB4MDMsCS8qIG9ubHkgREVBQ1RJVkFURSBUUlgxICovCisrCUJTMTFfT0JKX0NDTEsJCT0gMHgwNCwKKysJQlMxMV9PQkpfR1BTVQkJPSAweDA2LAorKwlCUzExX09CSl9MSQkJPSAweDA3LAorKwlCUzExX09CSl9QQQkJPSAweDA5LAkvKiBvYmpfY2xhc3M6IDAsIDEqLworK307CisrCisrZW51bSBhYmlzX2JzMTFfdHJ4X3Bvd2VyIHsKKysJQlMxMV9UUlhfUE9XRVJfR1NNXzJXCT0gMHgwNiwKKysJQlMxMV9UUlhfUE9XRVJfR1NNXzI1MG1XPSAweDA3LAorKwlCUzExX1RSWF9QT1dFUl9HU01fODBtVwk9IDB4MDgsCisrCUJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XCT0gMHgwOSwKKysJQlMxMV9UUlhfUE9XRVJfRENTXzNXCT0gMHgwYSwKKysJQlMxMV9UUlhfUE9XRVJfRENTXzFXNgk9IDB4MGIsCisrCUJTMTFfVFJYX1BPV0VSX0RDU181MDBtVz0gMHgwYywKKysJQlMxMV9UUlhfUE9XRVJfRENTXzE2MG1XPSAweDBkLAorK307CisrCisrZW51bSBhYmlzX2JzMTFfbGlfcGxsX21vZGUgeworKwlCUzExX0xJX1BMTF9MT0NLRUQJPSAyLAorKwlCUzExX0xJX1BMTF9TVEFOREFMT05FCT0gMywKKyt9OworKworK2VudW0gYWJpc19iczExX3BoYXNlIHsKKysJQlMxMV9TVEFURV9TT0ZUV0FSRV9SUUQJCT0gMHgwMSwKKysJQlMxMV9TVEFURV9MT0FEX1NNVV9JTlRFTkRFRAk9IDB4MTEsCisrCUJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZCT0gMHgyMSwKKysJQlMxMV9TVEFURV9MT0FEX0ZBSUxFRAkJPSAweDMxLAorKwlCUzExX1NUQVRFX0xPQURfRElBR05PU1RJQwk9IDB4NDEsCisrCUJTMTFfU1RBVEVfV0FSTV9VUAkJPSAweDUxLAorKwlCUzExX1NUQVRFX1dBUk1fVVBfMgkJPSAweDUyLAorKwlCUzExX1NUQVRFX1dBSVRfTUlOX0NGRwkJPSAweDYyLAorKwlCUzExX1NUQVRFX01BSU5URU5BTkNFCQk9IDB4NzIsCisrCUJTMTFfU1RBVEVfTE9BRF9NQkNDVQkJPSAweDkyLAorKwlCUzExX1NUQVRFX1dBSVRfTUlOX0NGR18yCT0gMHhBMiwKKysJQlMxMV9TVEFURV9OT1JNQUwJCT0gMHgwMywKKysJQlMxMV9TVEFURV9BQklTX0xPQUQJCT0gMHgxMywKKyt9OworKworKy8qIEZyb20gb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGx2LmggKi8KKytlbnVtIHRsdl90eXBlIHsKKysJVExWX1RZUEVfRklYRUQsCisrCVRMVl9UWVBFX1QsCisrCVRMVl9UWVBFX1RWLAorKwlUTFZfVFlQRV9UTFYsCisrCVRMVl9UWVBFX1RMMTZWLAorK307CisrCisrc3RydWN0IHRsdl9kZWYgeworKwllbnVtIHRsdl90eXBlIHR5cGU7CisrCXVfaW50OF90IGZpeGVkX2xlbjsKKyt9OworKworK3N0cnVjdCB0bHZfZGVmaW5pdGlvbiB7CisrCXN0cnVjdCB0bHZfZGVmIGRlZlsweGZmXTsKKyt9OworKworK2VudW0gYWJpc19ubV9pcGFjY190ZXN0X25vIHsKKysJTk1fSVBBQ0NfVEVTVE5PX1JMT09QX0FOVAk9IDB4MDEsCisrCU5NX0lQQUNDX1RFU1ROT19STE9PUF9YQ1ZSCT0gMHgwMiwKKysJTk1fSVBBQ0NfVEVTVE5PX0ZVTkNfT0JKCT0gMHgwMywKKysJTk1fSVBBQ0NfVEVTVE5PX0NIQU5fVVNBR0UJPSAweDQwLAorKwlOTV9JUEFDQ19URVNUTk9fQkNDSF9DSEFOX1VTQUdFCT0gMHg0MSwKKysJTk1fSVBBQ0NfVEVTVE5PX0ZSRVFfU1lOQwk9IDB4NDIsCisrCU5NX0lQQUNDX1RFU1ROT19CQ0NIX0lORk8JPSAweDQzLAorKwlOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OCT0gMHg0NCwKKysJTk1fSVBBQ0NfVEVTVE5PX1NZU0lORk9fTU9OSVRPUgk9IDB4NDUsCisrCU5NX0lQQUNDX1RFU1ROT19CQ0NDSF9NT05JVE9SCT0gMHg0NiwKKyt9OworKworKy8qIGZpcnN0IGJ5dGUgYWZ0ZXIgbGVuZ3RoIGluc2lkZSBOTV9BVFRfVEVTVF9SRVBPUlQgKi8KKytlbnVtIGFiaXNfbm1faXBhY2NfdGVzdF9yZXMgeworKwlOTV9JUEFDQ19URVNUUkVTX1NVQ0NFU1MJPSAwLAorKwlOTV9JUEFDQ19URVNUUkVTX1RJTUVPVVQJPSAxLAorKwlOTV9JUEFDQ19URVNUUkVTX05PX0NIQU5TCT0gMiwKKysJTk1fSVBBQ0NfVEVTVFJFU19QQVJUSUFMCT0gMywKKysJTk1fSVBBQ0NfVEVTVFJFU19TVE9QUEVECT0gNCwKKyt9OworKworKy8qIGludGVybmFsIElFIGluc2lkZSBOTV9BVFRfVEVTVF9SRVBPUlQgKi8KKytlbnVtIGFiaXNfbm1faXBhY2NfdGVzdHJlc19pZSB7CisrCU5NX0lQQUNDX1RSX0lFX0ZSRVFfRVJSX0xJU1QJPSAzLAorKwlOTV9JUEFDQ19UUl9JRV9DSEFOX1VTQUdFCT0gNCwKKysJTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPCT0gNiwKKysJTk1fSVBBQ0NfVFJfSUVfUkVTVUxUX0RFVEFJTFMJPSA4LAorKwlOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUgkJPSAxOCwKKyt9OworKworKy8qIEZyb20gb3BlbmJzYy9zcmMvYWJpc19ubS5jICovCisrc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmID0geworKwkuZGVmID0geworKwkJW05NX0FUVF9BQklTX0NIQU5ORUxdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKysJCVtOTV9BVFRfQUREX0lORk9dID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfQUREX1RFWFRdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfQURNX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0FSRkNOX0xJU1RdPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9BVVRPTl9SRVBPUlRdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQVZBSUxfU1RBVFVTXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0JDQ0hfQVJGQ05dID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfQlNJQ10gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQlRTX0FJUl9USU1FUl0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0NDQ0hfTF9JX1BdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQ0NDSF9MX1RdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQ0hBTl9DT01CXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0NPTk5fRkFJTF9DUklUXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfREVTVF0gPQkJCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfRVZFTlRfVFlQRV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9GSUxFX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0ZJTEVfVkVSU0lPTl0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9HU01fVElNRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9IU05dID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0hXX0NPTkZJR10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJLy9CUzExIFtOTV9BVFRfSFdfREVTQ10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9IV19ERVNDXSA9CQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9JTlRBVkVfUEFSQU1dID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfSU5URVJGX0JPVU5EXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCA2IH0sCisrCQlbTk1fQVRUX0xJU1RfUkVRX0FUVFJdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9NQUlPXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9NQU5VRl9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9NQU5VRl9USFJFU0hdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfTUFOVUZfSURdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfTUFYX1RBXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX01EUk9QX0xJTktdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfTURST1BfTkVYVF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9OQUNLX0NBVVNFU10gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9OWTFdID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX09QRVJfU1RBVEVdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfT1ZFUkxfUEVSSU9EXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1BIWVNfQ09ORl0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9QT1dFUl9DTEFTU10gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9QT1dFUl9USFJFU0hdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKysJCVtOTV9BVFRfUFJPQl9DQVVTRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorKwkJW05NX0FUVF9SQUNIX0JfVEhSRVNIXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTERBVkdfU0xPVFNdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfUkFEX1NVQkNdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfUkZfTUFYUE9XUl9SXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1NJVEVfSU5QVVRTXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1NJVEVfT1VUUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9TT1VSQ0VdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfU1BFQ19QUk9CXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1NUQVJUX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfVDIwMF0gPQkJCXsgVExWX1RZUEVfRklYRUQsIDcgfSwKKysJCVtOTV9BVFRfVEVJXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9URVNUX0RVUl0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9URVNUX05PXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1RFU1RfUkVQT1JUXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1ZTV1JfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX1dJTkRPV19TSVpFXSA9IAkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9UU0NdID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1NXX0NPTkZJR10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9TRVZFUklUWV0gPSAJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfR0VUX0FSSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9IV19DT05GX0NIR10gPSAJCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfT1VUU1RfQUxBUk1dID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfRklMRV9EQVRBXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX01FQVNfUkVTXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrI2lmIDAKKysJCS8qIEJTMTEgc3BlY2lmaWNzICovCisrCQlbTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OT10gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbMHhkNV0gPQkJCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbMHhhOF0gPQkJCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfUEFTU1dPUkRdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9UWFBXUl0gPQkJeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9SU1NJX09GRlNdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MSU5FX0NGR10gPSAJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0wxX1BST1RfVFlQRV0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQklUX0VSUl9USEVTSF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0JTMTFfRElWRVJTSVRZXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT05dPXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX0xPR0lOX1RJTUVdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWXSA9eyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQlRTX1NUQVRFXQk9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfRTFfU1RBVEVdCT0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9QTExfTU9ERV0JPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX1BMTF0JPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1ldID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0NDTEtfVFlQRV0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbMHg5NV0gPQkJCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysjZW5kaWYKKysJCS8qIGlwLmFjY2VzcyBzcGVjaWZpY3MgKi8KKysJCVtOTV9BVFRfSVBBQ0NfRFNUX0lQXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisrCQlbTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlZfRkxBR1NdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19GUkVRX0NUUkxdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9JUEFDQ19TRUNfT01MX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCA2IH0sCisrCQlbTk1fQVRUX0lQQUNDX0lQX0lGX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCA4IH0sCisrCQlbTk1fQVRUX0lQQUNDX0lQX0dXX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCAxMiB9LAorKwkJW05NX0FUVF9JUEFDQ19MT0NBVElPTl0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1VOSVRfSURdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19VTklUX05BTUVdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19TTk1QX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0FMTV9USFJFU0hfTElTVF09IHsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1NUUkVBTV9JRF0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1JBQ10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTl0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0dQUlNfUEFHSU5HX0NGR10gPXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlNFSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19CVkNJXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05TVkNJXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05TX0NGR10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19CU1NHUF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OU19MSU5LX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19TVVBQX0ZFQVRVUkVTXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQ09ESU5HX1NDSEVNRVNdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXzJdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXzNdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19GSUxFX0RBVEFdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwl9LAorK307CisrCisrI2VuZGlmIC8qIF9OTV9IICovCistLSAKKzEuNy4wLjEKKwpkaWZmIC0tZ2l0IGEvd2lyZXNoYXJrL2x1Y2VudC1obmIucGF0Y2ggYi93aXJlc2hhcmsvbHVjZW50LWhuYi5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzg1MTk1Ci0tLSAvZGV2L251bGwKKysrIGIvd2lyZXNoYXJrL2x1Y2VudC1obmIucGF0Y2gKQEAgLTAsMCArMSwxMjAgQEAKK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1sdWNlbnRfaG5iLmMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSAvZGV2L251bGwKKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1sdWNlbnRfaG5iLmMKK0BAIC0wLDAgKzEsMTAzIEBACisrLyogcGFja2V0LWx1Y2VudF9obmIuYworKyAqIFJvdXRpbmVzIGZvciBwYWNrZXQgZGlzc2VjdGlvbiBvZiBBbGNhdGVsL0x1Y2VudCBIb21lTm9kZUIKKysgKiBDb3B5cmlnaHQgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorKyAqCisrICogVGhpcyBwcm90b2NvbCBkZWNvZGVyIGlzIGJhc2VkIGVudGlyZWx5IG9uIHJldmVyc2UgZW5naW5lZXJpbmcsIGkuZS4KKysgKiBvbiBlZHVjYXRlZCBndWVzc2VzLgorKyAqCisrICogJElkOiBwYWNrZXQtbHVjZW50X2huYi5jIDI5MjU0IDIwMDktMDctMzEgMTk6MTk6MjVaIGdlcmFsZCAkCisrICoKKysgKiBXaXJlc2hhcmsgLSBOZXR3b3JrIHRyYWZmaWMgYW5hbHl6ZXIKKysgKiBCeSBHZXJhbGQgQ29tYnMgPGdlcmFsZEB3aXJlc2hhcmsub3JnPgorKyAqIENvcHlyaWdodCAxOTk4IEdlcmFsZCBDb21icworKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisrICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKysgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICoKKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKysgKi8KKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSAiY29uZmlnLmgiCisrI2VuZGlmCisrCisrI2RlZmluZSBMSE5CX1NDVFBfUFBJX01NCTEKKysjZGVmaW5lIExITkJfU0NUUF9QUElfR01NCTYKKysKKysjZGVmaW5lIExITkJfU0NUUF9QT1JUCQk2MDA1CisrCisrI2luY2x1ZGUgPGdsaWIuaD4KKysKKysjaW5jbHVkZSA8ZXBhbi9wYWNrZXQuaD4KKysKKysvKiBJbml0aWFsaXplIHRoZSBwcm90b2NvbCBhbmQgcmVnaXN0ZXJlZCBmaWVsZHMgKi8KKytzdGF0aWMgaW50IHByb3RvX2xobmIgPSAtMTsKKysKKytzdGF0aWMgaW50IGhmX2xobmJfbGVuZ3RoID0gLTE7CisrCisrLyogSW5pdGlhbGl6ZSB0aGUgc3VidHJlZSBwb2ludGVycyAqLworK3N0YXRpYyBnaW50IGV0dF9saG5iID0gLTE7CisrCisrc3RhdGljIGRpc3NlY3Rvcl9oYW5kbGVfdCByYW5hcF9oYW5kbGU7CisrCisrLyogQ29kZSB0byBhY3R1YWxseSBkaXNzZWN0IHRoZSBwYWNrZXRzICovCisrc3RhdGljIHZvaWQKKytkaXNzZWN0X2xobmIodHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlKQorK3sKKysKKysJaW50IG9mZnNldCA9IDA7CisrCXVfaW50MTZfdCBsZW47CisrCXR2YnVmZl90ICpuZXh0X3R2YjsKKysKKysJY29sX3NldF9zdHIocGluZm8tPmNpbmZvLCBDT0xfUFJPVE9DT0wsICJMSE5CIik7CisrCWNvbF9jbGVhcihwaW5mby0+Y2luZm8sIENPTF9JTkZPKTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9saG5iX2xlbmd0aCwgdHZiLCBvZmZzZXQrMiwgMiwgRkFMU0UpOworKwlsZW4gPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KzIpOworKwluZXh0X3R2YiA9IHR2Yl9uZXdfc3Vic2V0KHR2Yiwgb2Zmc2V0KzIrNiwgbGVuLTQsIC0xKTsKKysKKysJY2FsbF9kaXNzZWN0b3IocmFuYXBfaGFuZGxlLCBuZXh0X3R2YiwgcGluZm8sIHRyZWUpOworK30KKysKKyt2b2lkIHByb3RvX3JlZ2lzdGVyX2x1Y2VudF9obmIodm9pZCkKKyt7CisrCXN0YXRpYyBoZl9yZWdpc3Rlcl9pbmZvIGhmW10gPSB7CisrCQl7JmhmX2xobmJfbGVuZ3RoLAorKwkJIHsiTGVuZ3RoIiwgImxobmIubGVuIiwKKysJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwLCBOVUxMLCBIRklMTH0KKysJCSB9LAorKwl9OworKworKwlzdGF0aWMgZ2ludCAqZXR0W10gPSB7CisrCQkmZXR0X2xobmIsCisrCX07CisrCisrCXByb3RvX2xobmIgPQorKwkgICAgcHJvdG9fcmVnaXN0ZXJfcHJvdG9jb2woIkFsY2F0ZWwvTHVjZW50IEhvbWVOb2RlQiIsCisrCQkJCSAgICAiTHVjZW50IEhOQiIsICJsaG5iIik7CisrCisrCXByb3RvX3JlZ2lzdGVyX2ZpZWxkX2FycmF5KHByb3RvX2xobmIsIGhmLCBhcnJheV9sZW5ndGgoaGYpKTsKKysJcHJvdG9fcmVnaXN0ZXJfc3VidHJlZV9hcnJheShldHQsIGFycmF5X2xlbmd0aChldHQpKTsKKyt9CisrCisrdm9pZCBwcm90b19yZWdfaGFuZG9mZl9sdWNlbnRfaG5iKHZvaWQpCisreworKwlkaXNzZWN0b3JfaGFuZGxlX3QgbGhuYl9oYW5kbGU7CisrCisrCXJhbmFwX2hhbmRsZSA9IGZpbmRfZGlzc2VjdG9yKCJyYW5hcCIpOworKworKwlsaG5iX2hhbmRsZSA9IGNyZWF0ZV9kaXNzZWN0b3JfaGFuZGxlKGRpc3NlY3RfbGhuYiwgcHJvdG9fbGhuYik7CisrCisrCWRpc3NlY3Rvcl9hZGQoInNjdHAucHBpIiwgTEhOQl9TQ1RQX1BQSV9NTSwgbGhuYl9oYW5kbGUpOworKwlkaXNzZWN0b3JfYWRkKCJzY3RwLnBwaSIsIExITkJfU0NUUF9QUElfR01NLCBsaG5iX2hhbmRsZSk7CisrCWRpc3NlY3Rvcl9hZGQoInNjdHAucG9ydCIsIExITkJfU0NUUF9QT1JULCBsaG5iX2hhbmRsZSk7CisrfQorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gd2lyZXNoYXJrLm9yaWcvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCitAQCAtNjA1LDYgKzYwNSw3IEBACisgCXBhY2tldC1sb29wLmMJCVwKKyAJcGFja2V0LWxwZC5jCQlcCisgCXBhY2tldC1sc2MuYwkJXAorKwlwYWNrZXQtbHVjZW50X2huYi5jCVwKKyAJcGFja2V0LWx3YXBwLmMJCVwKKyAJcGFja2V0LWx3cmVzLmMJCVwKKyAJcGFja2V0LW0ycGEuYwkJXApkaWZmIC0tZ2l0IGEvd2lyZXNoYXJrL3JzbC1pcGFjY2Vzcy5wYXRjaCBiL3dpcmVzaGFyay9yc2wtaXBhY2Nlc3MucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyMjBiOAotLS0gL2Rldi9udWxsCisrKyBiL3dpcmVzaGFyay9yc2wtaXBhY2Nlc3MucGF0Y2gKQEAgLTAsMCArMSw2NjQgQEAKK0Zyb20gOGYzNWQ2MjM2NDFkYmJhOTBlNjE4NjYwNGMxMWU4OTJiZjUxNWVjYyBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KK0RhdGU6IE1vbiwgMTkgQXByIDIwMTAgMTM6MzI6NTggKzA4MDAKK1N1YmplY3Q6IFtQQVRDSCAyLzJdIFJTTCBwYXRjaAorCistLS0KKyBlcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jIHwgIDUyMiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KKyAxIGZpbGVzIGNoYW5nZWQsIDUxNSBpbnNlcnRpb25zKCspLCA3IGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYyBiL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKK2luZGV4IGIxMGE2NzEuLmE0NTVjZjMgMTAwNjQ0CistLS0gYS9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCisrKysgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCitAQCAtMiw2ICsyLDcgQEAKKyAgKiBSb3V0aW5lcyBmb3IgUmFkaW8gU2lnbmFsbGluZyBMaW5rIChSU0wpIGRpc3NlY3Rpb24uCisgICoKKyAgKiBDb3B5cmlnaHQgMjAwNywgQW5kZXJzIEJyb21hbiA8YW5kZXJzLmJyb21hbkBlcmljc3Nvbi5jb20+CisrICogQ29weXJpZ2h0IDIwMDksIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgICoKKyAgKiAkSWQkCisgICoKK0BAIC00Miw2ICs0Myw4IEBACisgI2luY2x1ZGUgPGVwYW4vbGFwZF9zYXBpLmg+CisgCisgI2luY2x1ZGUgInBhY2tldC1nc21fYV9jb21tb24uaCIKKysjaW5jbHVkZSAicGFja2V0LXJ0cC5oIgorKyNpbmNsdWRlICJwYWNrZXQtcnRjcC5oIgorIAorIC8qIEluaXRpYWxpemUgdGhlIHByb3RvY29sIGFuZCByZWdpc3RlcmVkIGZpZWxkcyAqLworIHN0YXRpYyBpbnQgcHJvdG9fcnNsCQk9IC0xOworQEAgLTExNSw2ICsxMTgsMjQgQEAgc3RhdGljIGludCBoZl9yc2xfZW1scHBfcHJpbwkJPSAtMTsKKyBzdGF0aWMgaW50IGhmX3JzbF9ydGQJCQkJPSAtMTsKKyBzdGF0aWMgaW50IGhmX3JzbF9kZWxheV9pbmQJCQk9IC0xOworIHN0YXRpYyBpbnQgaGZfcnNsX3RmbwkJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3NwZWVjaF9tb2RlX3MJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3NwZWVjaF9tb2RlX20JCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2Nvbm5fc3RhdAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY29ubl9pZAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcnRwX3BheWxvYWQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3J0cF9jc2RfZm10X2QJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3J0cF9jc2RfZm10X2lyCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2xvY2FsX3BvcnQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3JlbW90ZV9wb3J0CQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9sb2NhbF9pcAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcmVtb3RlX2lwCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF90eF9wa3RzCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF90eF9vY3RzCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9yeF9wa3RzCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9yeF9vY3RzCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9sb3N0X3BrdHMJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfaWFfaml0dGVyCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X2F2Z190eF9kbHkJCT0gLTE7CisgCisgLyogSW5pdGlhbGl6ZSB0aGUgc3VidHJlZSBwb2ludGVycyAqLworIHN0YXRpYyBpbnQgZXR0X3JzbCA9IC0xOworQEAgLTE3Miw2ICsxOTMsMTUgQEAgc3RhdGljIGludCBldHRfaWVfY2F1c2UgPSAtMTsKKyBzdGF0aWMgaW50IGV0dF9pZV9tZWFzX3Jlc19ubyA9IC0xOworIHN0YXRpYyBpbnQgZXR0X2llX21lc3NhZ2VfaWQgPSAtMTsKKyBzdGF0aWMgaW50IGV0dF9pZV9zeXNfaW5mb190eXBlID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfc3BlZWNoX21vZGUgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9jb25uX3N0YXQgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9jb25uX2lkID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfcmVtb3RlX2lwID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfcmVtb3RlX3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9sb2NhbF9wb3J0ID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfbG9jYWxfaXAgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9ydHBfcGF5bG9hZCA9IC0xOworKworIAorIHByb3RvX3RyZWUgKnRvcF90cmVlOworIGRpc3NlY3Rvcl9oYW5kbGVfdCBnc21fYV9jY2NoX2hhbmRsZTsKK0BAIC0yMDcsOCArMjM3LDExIEBAIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX21zZ19kaXNjX3ZhbHNbXSA9IHsKKyAJeyAgMHgwNiwJCSJDb21tb24gQ2hhbm5lbCBNYW5hZ2VtZW50IG1lc3NhZ2VzIiB9LAorIAl7ICAweDA4LAkJIlRSWCBNYW5hZ2VtZW50IG1lc3NhZ2VzIiB9LAorIAl7ICAweDE2LAkJIkxvY2F0aW9uIFNlcnZpY2VzIG1lc3NhZ2VzIiB9LAorKwl7ICAweDNmLAkJImlwLmFjY2VzcyBWZW5kb3IgU3BlY2lmaWMgbWVzc2FnZXMiIH0sCisgCXsgMCwJCQlOVUxMIH0KKyB9OworKyNkZWZpbmUgUlNMX01TR0RJU0NfSVBBQ0NFU1MJMHgzZgorKworIC8qCisgICogOS4yIE1FU1NBR0UgVFlQRQorICAqLworQEAgLTI3NSw2ICszMDgsNDkgQEAgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfbXNnX2Rpc2NfdmFsc1tdID0geworIAkvKiAJMCAxIC0gLSAtIC0gLSAtIExvY2F0aW9uIFNlcnZpY2VzIG1lc3NhZ2VzOiAqLworICNkZWZpbmUgUlNMX01TR19MT0NfSU5GCQkJCQk2NQkvKiA4LjcuMSAqLworIAorKy8qIFZlbmRvci1TcGVjaWZpYyBtZXNzYWdlcyBvZiBpcC5hY2Nlc3MgbmFub0JUUy4gVGhlcmUgaXMgbm8gcHVibGljIGRvY3VtZW50YXRpb24KKysgKiBhYm91dCB0aG9zZSBleHRlbnNpb25zLCBhbGwgaW5mb3JtYXRpb24gaW4gdGhpcyBkaXNzZWN0b3IgaXMgYmFzZWQgb24gbGF3ZnVsCisrICogcHJvdG9jb2wgcmV2ZXJzZSBlbmdpbmVyaW5nIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+ICovCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19NRUFTX1BQX0RFRgkweDYwCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19IT19DQU5EX0lOUQkweDYxCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19IT19DQU5EX1JFU1AJMHg2MgorKworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1QJMHg0OAorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfQUNLCTB4NDkKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX05BQ0sJMHg0YQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVAkweDRiCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX0FDSyAweDRjCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX05BQ0sgMHg0ZAorKworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfQ1JDWAkJMHg3MAorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfQ1JDWF9BQ0sJMHg3MQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfQ1JDWF9OQUNLCTB4NzIKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX01EQ1gJCTB4NzMKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX01EQ1hfQUNLCTB4NzQKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX01EQ1hfTkFDSwkweDc1CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19ETENYX0lORAkweDc2CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19ETENYCQkweDc3CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19ETENYX0FDSwkweDc4CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19ETENYX05BQ0sJMHg3OQorKworKyNkZWZpbmUgUlNMX0lFX0lQQUNfU1JUUF9DT05GSUcJCTB4ZTAKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1BST1hZX1VEUAkJMHhlMQorKyNkZWZpbmUgUlNMX0lFX0lQQUNfQlNDTVBMX1RPVVQJCTB4ZTIKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JFTU9URV9JUAkJMHhmMAorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQJCTB4ZjEKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FECQkweGYyCisrI2RlZmluZSBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUCQkweGYzCisrI2RlZmluZSBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERQkJMHhmNAorKyNkZWZpbmUgUlNMX0lFX0lQQUNfTE9DQUxfSVAJCTB4ZjUKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0NPTk5fU1RBVAkJMHhmNgorKyNkZWZpbmUgUlNMX0lFX0lQQUNfSE9fQ19QQVJNUwkJMHhmNworKyNkZWZpbmUgUlNMX0lFX0lQQUNfQ09OTl9JRAkJMHhmOAorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX0NTRF9GTVQJCTB4ZjkKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9KSVRfQlVGCQkweGZhCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfQ09NUFIJCTB4ZmIKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMgkweGZjCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfTVBMRVgJCTB4ZmQKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9NUExFWF9JRAkweGZlCisgCisgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfbXNnX3R5cGVfdmFsc1tdID0geworIAkgIC8qIAkwIDAgMCAwIC0gLSAtIC0gUmFkaW8gTGluayBMYXllciBNYW5hZ2VtZW50IG1lc3NhZ2VzOiAqLworQEAgLTMzNyw2ICs0MTMsMjYgQEAgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfbXNnX3R5cGVfdmFsc1tdID0geworIAl7ICAweDNmLAkiVEZPIE1PRGlmaWNhdGlvbiBSRVF1ZXN0IiB9LAkJCQkJLyogOC40LjMxICovCisgCS8qIAkwIDEgLSAtIC0gLSAtIC0gTG9jYXRpb24gU2VydmljZXMgbWVzc2FnZXM6ICovCisgCXsgIDB4NDEsCSJMb2NhdGlvbiBJbmZvcm1hdGlvbiIgfSwJCQkJCQkvKiA4LjcuMSAqLworKwkvKiBpcC5hY2Nlc3MgKi8KKysJeyAgMHg0OCwJImlwLmFjY2VzcyBQRENIIEFDVElWQVRJT04iIH0sCisrCXsgIDB4NDksCSJpcC5hY2Nlc3MgUERDSCBBQ1RJVkFUSU9OIEFDSyIgfSwKKysJeyAgMHg0YSwJImlwLmFjY2VzcyBQRENIIEFDVElWQVRJT04gTkFDSyIgfSwKKysJeyAgMHg0YiwJImlwLmFjY2VzcyBQRENIIERFQUNUSVZBVElPTiIgfSwKKysJeyAgMHg0YywJImlwLmFjY2VzcyBQRENIIERFQUNUSVZBVElPTiBBQ0siIH0sCisrCXsgIDB4NGQsCSJpcC5hY2Nlc3MgUERDSCBERUFDVElWQVRJT04gTkFDSyIgfSwKKysJeyAgMHg2MCwJImlwLmFjY2VzcyBNRUFTdXJlbWVudCBQUkVQUk9DZXNzaW5nIERlRmF1TFQiIH0sCisrCXsgIDB4NjEsCSJpcC5hY2Nlc3MgSEFORE9vdmVyIENBTkRpZGF0ZSBFTlF1aXJ5IiB9LAorKwl7ICAweDYyLAkiaXAuYWNjZXNzIEhBTkRPb3ZlciBDQU5EaWRhdGUgUkVTUG9uc2UiIH0sCisrCXsgIDB4NzAsCSJpcC5hY2Nlc3MgQ1JDWCIgfSwKKysJeyAgMHg3MSwJImlwLmFjY2VzcyBDUkNYIEFDSyIgfSwKKysJeyAgMHg3MiwJImlwLmFjY2VzcyBDUkNYIE5BQ0siIH0sCisrCXsgIDB4NzMsCSJpcC5hY2Nlc3MgTURDWCIgfSwKKysJeyAgMHg3NCwJImlwLmFjY2VzcyBNRENYIEFDSyIgfSwKKysJeyAgMHg3NSwJImlwLmFjY2VzcyBNRENYIE5BQ0siIH0sCisrCXsgIDB4NzYsCSJpcC5hY2Nlc3MgRExDWCBJTkRpY2F0aW9uIiB9LAorKwl7ICAweDc3LAkiaXAuYWNjZXNzIERMQ1giIH0sCisrCXsgIDB4NzgsCSJpcC5hY2Nlc3MgRExDWCBBQ0siIH0sCisrCXsgIDB4NzksCSJpcC5hY2Nlc3MgRExDWCBOQUNLIiB9LAorIAl7IDAsCQlOVUxMIH0KKyB9OworIAorQEAgLTM3MCwxMCArNDY2LDEwIEBAIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX21zZ190eXBlX3ZhbHNbXSA9IHsKKyAjZGVmaW5lIFJTTF9JRV9NRVNTQUdFX0lECQkyOAorIAorICNkZWZpbmUgUlNMX0lFX1NZU19JTkZPX1RZUEUJMzAKKy0KKy0KKy0KKy0KKysjZGVmaW5lIFJTTF9JRV9NU19QT1dFUl9QQVJBTQkJMzEKKysjZGVmaW5lIFJTTF9JRV9CU19QT1dFUl9QQVJBTQkJMzIKKysjZGVmaW5lIFJTTF9JRV9QUkVQUk9DX1BBUkFNCQkzMworKyNkZWZpbmUgUlNMX0lFX1BSRVBST0NfTUVBUwkJMzQKKyAjZGVmaW5lIFJTTF9JRV9GVUxMX0lNTV9BU1NfSU5GCQkJMzUKKyAjZGVmaW5lIFJTTF9JRV9TTVNDQl9JTkYJCQkJMzYKKyAjZGVmaW5lIFJTTF9JRV9GVUxMX01TX1RJTUlOR19PRkZTRVQJMzcKK0BAIC00NzYsNiArNTcyLDI0IEBAIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX2llX3R5cGVfdmFsc1tdID0geworIAkJCU5vdCB1c2VkCisgCisgCSovCisrCXsgMHhlMCwJCSJTUlRQIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgMHhlMSwJCSJCU0MgUHJveHkgVURQIFBvcnQiIH0sCisrCXsgMHhlMiwJCSJCU0MgTXVsdGlwbGV4IFRpbWVvdXQiIH0sCisrCXsgMHhmMCwJCSJSZW1vdGUgSVAgQWRkcmVzcyIgfSwKKysJeyAweGYxLAkJIlJlbW90ZSBSVFAgUG9ydCIgfSwKKysJeyAweGYyLAkJIlJUUCBQYXlsb2FkIFR5cGUiIH0sCisrCXsgMHhmMywJCSJMb2NhbCBSVFAgUG9ydCIgfSwKKysJeyAweGY0LAkJIlNwZWVjaCBNb2RlIiB9LAorKwl7IDB4ZjUsCQkiTG9jYWwgSVAgQWRkcmVzcyIgfSwKKysJeyAweGY2LAkJIkNvbm5lY3Rpb24gU3RhdGlzdGljcyIgfSwKKysJeyAweGY3LAkJIkhhbmRvdmVyIEMgUGFyYW1ldGVycyIgfSwKKysJeyAweGY4LAkJIkNvbm5lY3Rpb24gSWRlbnRpZmllciIgfSwKKysJeyAweGY5LAkJIlJUUCBDU0QgRm9ybWF0IiB9LAorKwl7IDB4ZmEsCQkiUlRQIEppdHRlciBCdWZmZXIiIH0sCisrCXsgMHhmYiwJCSJSVFAgQ29tcHJlc3Npb24iIH0sCisrCXsgMHhmYywJCSJSVFAgUGF5bG9hZCBUeXBlIDIiIH0sCisrCXsgMHhmZCwJCSJSVFAgTXVsdGlwbGV4IiB9LAorKwl7IDB4ZmUsCQkiUlRQIE11bHRpcGxleCBJZGVudGlmaWVyIiB9LAorIAl7IDAsCQkJTlVMTCB9CisgfTsKKyAKK0BAIC01MTIsNiArNjI2LDk2IEBAIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX2NoX25vX0NiaXRzX3ZhbHNbXSA9IHsKKyAJeyAwLAkJCU5VTEwgfQorIH07CisgCisrLyogRnJvbSBvcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90bHYuaCAqLworK2VudW0gdGx2X3R5cGUgeworKwlUTFZfVFlQRV9GSVhFRCwKKysJVExWX1RZUEVfVCwKKysJVExWX1RZUEVfVFYsCisrCVRMVl9UWVBFX1RMViwKKysJVExWX1RZUEVfVEwxNlYsCisrfTsKKysKKytzdHJ1Y3QgdGx2X2RlZiB7CisrCWVudW0gdGx2X3R5cGUgdHlwZTsKKysJdV9pbnQ4X3QgZml4ZWRfbGVuOworK307CisrCisrc3RydWN0IHRsdl9kZWZpbml0aW9uIHsKKysJc3RydWN0IHRsdl9kZWYgZGVmWzB4ZmZdOworK307CisrCisrc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiByc2xfYXR0X3RsdmRlZiA9IHsKKysJLmRlZiA9IHsKKysJCVtSU0xfSUVfQ0hfTk9dCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0xJTktfSURdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfQUNUX1RZUEVdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfQlNfUE9XXQkJCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9DSF9JRF0JCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NIX01PREVdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0VOQ19JTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0ZSQU1FX05PXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX0hPX1JFRl0JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTDFfSU5GXQkJCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9MM19JTkZdCQkJPSB7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbUlNMX0lFX01TX0lEXQkJCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTVNfUE9XXQkJCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9QQUdJTkdfR1JQXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1BBR0lOR19MT0FEXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX1BIWV9DVFhdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0FDQ0VTU19ERUxBWV0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9SQUNIX0xPQURdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX1JFUV9SRUZdCQk9IHsgVExWX1RZUEVfRklYRUQsIDMgfSwKKysJCVtSU0xfSUVfUkVMX01PREVdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfUkVTT1VSQ0VfSU5GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9STE1fQ0FVU0VdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX1NUQVJUSU5HX1RJTUVdCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfVElNSU5HX0FEVl0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9VUExJTktfTUVBU10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ0FVU0VdCQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9NRUFTX1JFU19OT10JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9NRVNTQUdFX0lEXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1NZU19JTkZPX1RZUEVdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTVNfUE9XRVJfUEFSQU1dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0JTX1BPV0VSX1BBUkFNXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9QUkVQUk9DX1BBUkFNXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9QUkVQUk9DX01FQVNdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQkvL1tSU0xfSUVfSU1NX0FTU19JTkZPXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJLy9bUlNMX0lFX1NNU0NCX0lORk9dCQk9IHsgVExWX1RZUEVfRklYRUQsIDIzIH0sCisrCQkvL1tSU0xfSUVfTVNfVElNSU5HX09GRlNFVF0JPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0VSUl9NU0ddCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0ZVTExfQkNDSF9JTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NIX05FRURFRF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9DQl9DTURfVFlQRV0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9TTVNDQl9NRVNTXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9GVUxMX0lNTV9BU1NfSU5GXQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQkvL1tSU0xfSUVfU0FDQ0hfSU5GT10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ0JDSF9MT0FEX0lORl0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9TTVNDQl9DSF9JTkRdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfR1JQX0NBTExfUkVGXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DSF9ERVNDXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9OQ0hfRFJYX0lORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ01EX0lORF0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRU1MUFBfUFJJT10JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9VSUNdCQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9NQUlOX0NIX1JFRl0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9NVUxUSVJBVEVfQ09ORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTVVMVElSQVRFX0NOVFJMXQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfU1VQX0NPREVDX1RZUEVTXQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NPREVDX0NPTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX1JURF0JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfVEZPX1NUQVRVU10JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9MTFBfQVBEVV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfSVBBQ19SRU1PVEVfSVBdCQk9IHsgVExWX1RZUEVfRklYRUQsIDQgfSwKKysJCVtSU0xfSUVfSVBBQ19SRU1PVEVfUE9SVF0JPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX0lQQUNfTE9DQUxfSVBdCQk9IHsgVExWX1RZUEVfRklYRUQsIDQgfSwKKysJCVtSU0xfSUVfSVBBQ19DT05OX1NUQVRdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0lQQUNfTE9DQUxfUE9SVF0JPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX0lQQUNfU1BFRUNIX01PREVdCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9JUEFDX0NPTk5fSURdCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDJdCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwl9LAorK307CisrCisgLyogOS4zLjEgQ2hhbm5lbCBudW1iZXIJCQk5LjMuMQlNIFRWIDIgKi8KKyBzdGF0aWMgaW50CisgZGlzc2VjdF9yc2xfaWVfY2hfbm8odHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvIF9VXywgcHJvdG9fdHJlZSAqdHJlZSwgaW50IG9mZnNldCwgZ2Jvb2xlYW4gaXNfbWFuZGF0b3J5KQorQEAgLTIwNDIsNyArMjI0Niw2IEBAIGRpc3NlY3RfcnNsX2llX2Vycl9tc2codHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLCBpbnQKKyAJcHJvdG9faXRlbV9zZXRfbGVuKHRpLCBsZW5ndGgrMik7CisgCisgCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2llX2xlbmd0aCwgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKy0Jb2Zmc2V0Kys7CisgCisgCS8qIFJlY2VpdmVkIE1lc3NhZ2UgKi8KKyAJb2Zmc2V0ID0gZGlzc2N0X3JzbF9tc2codHZiLCBwaW5mbywgaWVfdHJlZSwgb2Zmc2V0KTsKK0BAIC0yOTA3LDEyICszMTEwLDE4NCBAQCBkaXNzZWN0X3JzbF9pZV90Zm9fdHJhbnNwX2NvbnQodHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvIF9VXywgcHJvdG9fdHJlZQorIH0KKyAKKyBzdGF0aWMgaW50CisrZGlzc2N0X3JzbF9pcGFjY2Vzc19tc2codHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLAkJCQkgICAgaW50IG9mZnNldCkKKyt7CisrCWd1aW50OCBtc2dfdHlwZTsKKysJZ3VpbnQzMiBsb2NhbF9hZGRyID0gMDsKKysJZ3VpbnQxNiBsb2NhbF9wb3J0ID0gMDsKKysJYWRkcmVzcyBzcmNfYWRkcjsKKysKKysJbXNnX3R5cGUgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCkmMHg3ZjsKKysJb2Zmc2V0Kys7CisrCisrI2lmIDAKKysJc3dpdGNoIChtc2dfdHlwZSkgeworKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1g6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ1JDWF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ1JDWF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX01EQ1g6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfTURDWF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfTURDWF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RMQ1hfSU5EOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RMQ1g6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRExDWF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRExDWF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9OQUNLOgorKwkJLyogQ2hhbm5lbCBudW1iZXIJCQk5LjMuMQlNIFRWIDIJCSovCisrCQlvZmZzZXQgPSBkaXNzZWN0X3JzbF9pZV9jaF9ubyh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQsIFRSVUUpOworKwkJYnJlYWs7CisrCX0KKysjZW5kaWYKKysJLyogcGFyc2UgVExWIGF0dHJpYnV0ZXMgKi8KKysJd2hpbGUgKHR2Yl9yZXBvcnRlZF9sZW5ndGhfcmVtYWluaW5nKHR2Yiwgb2Zmc2V0KSAhPSAwKSB7CisrCQlndWludDggdGFnOworKwkJdW5zaWduZWQgaW50IGxlbiwgaGxlbiwgbGVuX2xlbjsKKysJCWNvbnN0IHN0cnVjdCB0bHZfZGVmICp0ZGVmOworKwkJcHJvdG9faXRlbSAqdGk7CisrCQlwcm90b190cmVlICppZV90cmVlOworKworKwkJdGFnID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJdGRlZiA9ICZyc2xfYXR0X3RsdmRlZi5kZWZbdGFnXTsKKysKKysJCXN3aXRjaCAodGRlZi0+dHlwZSkgeworKwkJY2FzZSBUTFZfVFlQRV9GSVhFRDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSB0ZGVmLT5maXhlZF9sZW47CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1Q6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMDsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVFY6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMTsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVExWOgorKwkJCWhsZW4gPSAyOworKwkJCWxlbl9sZW4gPSAxOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTDE2VjoKKysJCQlobGVuID0gMzsKKysJCQlsZW5fbGVuID0gMjsKKysJCQlsZW4gPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKSA8PCA4IHwKKysJCQkJCXR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzIpOworKwkJCWJyZWFrOworKwkJZGVmYXVsdDoKKysJCQlobGVuID0gbGVuX2xlbiA9IGxlbiA9IDA7CisrCQkJRElTU0VDVE9SX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworKwkJCWJyZWFrOworKwkJfQorKworKwkJdGkgPSBwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX3JzbF9pZV9pZCwgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKysJCWllX3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfaWVfbG9jYWxfcG9ydCk7CisrCQlvZmZzZXQgKz0gaGxlbjsKKysKKysJCXN3aXRjaCAodGFnKSB7CisrCQljYXNlIFJTTF9JRV9DSF9OTzoKKysJCQlkaXNzZWN0X3JzbF9pZV9jaF9ubyh0dmIsIHBpbmZvLCBpZV90cmVlLCBvZmZzZXQsIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0ZSQU1FX05POgorKwkJCWRpc3NlY3RfcnNsX2llX2ZyYW1lX25vKHR2YiwgcGluZm8sIGllX3RyZWUsIG9mZnNldCwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfTVNfUE9XOgorKwkJCWRpc3NlY3RfcnNsX2llX21zX3Bvdyh0dmIsIHBpbmZvLCBpZV90cmVlLCBvZmZzZXQsIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfUkVNT1RFX0lQOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3JlbW90ZV9pcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3JlbW90ZV9wb3J0LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfTE9DQUxfSVA6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfbG9jYWxfaXAsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWxvY2FsX2FkZHIgPSB0dmJfZ2V0X2lwdjQodHZiLCBvZmZzZXQpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2xvY2FsX3BvcnQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWxvY2FsX3BvcnQgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfU1BFRUNIX01PREU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfc3BlZWNoX21vZGVfcywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfc3BlZWNoX21vZGVfbSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEOgorKwkJY2FzZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDI6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcnRwX3BheWxvYWQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19SVFBfQ1NEX0ZNVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9ydHBfY3NkX2ZtdF9kLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9ydHBfY3NkX2ZtdF9pciwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX0NPTk5fSUQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY29ubl9pZCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX0NPTk5fU1RBVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF90eF9wa3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfdHhfb2N0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCs0LCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfcnhfcGt0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCs4LCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfcnhfb2N0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCsxMiwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X2xvc3RfcGt0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCsxNiwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X2lhX2ppdHRlciwgdHZiLAorKwkJCQkJICAgIG9mZnNldCsyMCwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X2F2Z190eF9kbHksIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMjQsIDQsIEZBTFNFKTsKKysJCQlicmVhazsKKysJCX0KKysJCW9mZnNldCArPSBsZW47CisrCX0KKysKKysJc3dpdGNoIChtc2dfdHlwZSkgeworKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0NSQ1hfQUNLOgorKwkJLyogTm90aWZ5IHRoZSBSVFAgYW5kIFJUQ1AgZGlzc2VjdG9ycyBhYm91dCBhIG5ldyBSVFAgc3RyZWFtICovCisrCQlzcmNfYWRkci50eXBlID0gQVRfSVB2NDsKKysJCXNyY19hZGRyLmxlbiA9IDQ7CisrCQlzcmNfYWRkci5kYXRhID0gKGd1aW50OCAqKSZsb2NhbF9hZGRyOworKwkJcnRwX2FkZF9hZGRyZXNzKHBpbmZvLCAmc3JjX2FkZHIsIGxvY2FsX3BvcnQsIDAsCisrCQkJCSJHU00gQS1iaXMvSVAiLCBwaW5mby0+ZmQtPm51bSwgMCwgTlVMTCk7CisrCQlydGNwX2FkZF9hZGRyZXNzKHBpbmZvLCAmc3JjX2FkZHIsIGxvY2FsX3BvcnQrMSwgMCwKKysJCQkJICJHU00gQS1iaXMvSVAiLCBwaW5mby0+ZmQtPm51bSk7CisrCQlicmVhazsKKysJfQorKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKytzdGF0aWMgaW50CisgZGlzc2N0X3JzbF9tc2codHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLCBpbnQgb2Zmc2V0KQorIHsKKy0JZ3VpbnQ4CW1zZ190eXBlOworKwlndWludDgJbXNnX2Rpc2MsIG1zZ190eXBlOworIAorKwltc2dfZGlzYyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KyspID4+IDE7CisgCW1zZ190eXBlID0gdHZiX2dldF9ndWludDgodHZiLG9mZnNldCkmMHg3ZjsKKyAJcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9yc2xfbXNnX3R5cGUsIHR2Yiwgb2Zmc2V0LCAxLCBGQUxTRSk7CisrCisrCWlmIChtc2dfZGlzYyA9PSBSU0xfTVNHRElTQ19JUEFDQ0VTUykgeworKwkJb2Zmc2V0ID0gZGlzc2N0X3JzbF9pcGFjY2Vzc19tc2codHZiLCBwaW5mbywgdHJlZSwgb2Zmc2V0KTsKKysJCXJldHVybiBvZmZzZXQ7CisrCX0KKyAJb2Zmc2V0Kys7CisgCisgCXN3aXRjaCAobXNnX3R5cGUpeworQEAgLTM0ODAsNiArMzg1NSwxOCBAQCBkaXNzY3RfcnNsX21zZyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsIGludCBvZmZzZXQpCisgCQkvKiBMTFAgQVBEVSA5LjMuNTggTSBMViAyLU4gKi8KKyAJCW9mZnNldCA9IGRpc3NlY3RfcnNsX2llX2xscF9hcGR1KHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldCwgVFJVRSk7CisgCQlicmVhazsKKysJLyogdGhlIGZvbGxvd2luZyBtZXNzYWdlcyBhcmUgaXAuYWNjZXNzIHNwZWNpZmljIGJ1dCBzZW50IHdpdGhvdXQKKysJICogaXAuYWNjZXNzIG1lbXNzYWdlIGRpc2NyaW1pbmF0b3IgKi8KKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19NRUFTX1BQX0RFRjoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19IT19DQU5EX0lOUToKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19IT19DQU5EX1JFU1A6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX05BQ0s6CisrCQlvZmZzZXQgPSBkaXNzY3RfcnNsX2lwYWNjZXNzX21zZyh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQtMSk7CisgCWRlZmF1bHQ6CisgCQlicmVhazsKKyAJfQorQEAgLTM0ODcsNiArMzg3NCw0MCBAQCBkaXNzY3RfcnNsX21zZyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsIGludCBvZmZzZXQpCisgCXJldHVybiBvZmZzZXQ7CisgCisgfQorKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX2lwYWNjX3NwbV9zX3ZhbHNbXSA9IHsKKysJeyAwLAkiR1NNIEZSIGNvZGVjIChHU00gdHlwZSAxLCBGUykiIH0sCisrCXsgMSwJIkdTTSBFRlIgY29kZWMgKEdTTSB0eXBlIDIsIEZTKSIgfSwKKysJeyAyLCAJIkdTTSBBTVIvRlIgY29kZWMgKEdTTSB0eXBlIDMsIEZTKSIgfSwKKysJeyAzLAkiR1NNIEhSIGNvZGVjIChHU00gdHlwZSAxLCBIUykiIH0sCisrCXsgNSwJIkdTTSBBTVIvSFIgY29kZWMgKEdTTSB0eXBlIDMsIEhTKSIgfSwKKysJeyAweGYsCSJBcyBzcGVjaWZpZWQgYnkgUlRQIFBheWxvYWQgVHlwZSBJRSIgfSwKKysJeyAwLAlOVUxMIH0KKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX2lwYWNjX3NwbV9tX3ZhbHNbXSA9IHsKKysJeyAwLAkiU2VuZCBhbmQgUmVjZWl2ZSIgfSwKKysJeyAxLAkiUmVjZWl2ZSBPbmx5IiB9LAorKwl7IDIsCSJTZW5kIE9ubHkiIH0sCisrCXsgMCwgCU5VTEwgfQorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfaXBhY2NfcnRwX2NzZF9mbXRfZF92YWxzW10gPSB7CisrCXsgMCwJIkV4dGVybmFsIFRSQVUgZm9ybWF0IiB9LAorKwl7IDEsCSJOb24tVFJBVSBQYWNrZWQgZm9ybWF0IiB9LAorKwl7IDIsCSJUUkFVIHdpdGhpbiB0aGUgQlRTIiB9LAorKwl7IDMsCSJJV0YtRnJlZSBCVFMtQlRTIERhdGEiIH0sCisrCXsgMCwgCU5VTEwgfQorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfaXBhY2NfcnRwX2NzZF9mbXRfaXJfdmFsc1tdID0geworKwl7IDAsCSI4a2IvcyIgfSwKKysJeyAxLAkiMTZrYi9zIiB9LAorKwl7IDIsCSIzMmtiL3MiIH0sCisrCXsgMywJIjY0a2IvcyIgfSwKKysJeyAwLAlOVUxMIH0KKyt9OworKworIHN0YXRpYyB2b2lkCisgZGlzc2VjdF9yc2wodHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlKQorIHsKK0BAIC0zNTE0LDcgKzM5MzUsNiBAQCBkaXNzZWN0X3JzbCh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUpCisgCQkvKiA5LjEgTWVzc2FnZSBkaXNjcmltaW5hdG9yICovCisgCQlwcm90b190cmVlX2FkZF9pdGVtKHJzbF90cmVlLCBoZl9yc2xfbXNnX2RzYywgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKyAJCXByb3RvX3RyZWVfYWRkX2l0ZW0ocnNsX3RyZWUsIGhmX3JzbF9UX2JpdCwgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKy0JCW9mZnNldCsrOworIAorIAkJb2Zmc2V0ID0gZGlzc2N0X3JzbF9tc2codHZiLCBwaW5mbywgcnNsX3RyZWUsIG9mZnNldCk7CisgCitAQCAtMzg4NCw2ICs0MzA0LDg2IEBAIHZvaWQgcHJvdG9fcmVnaXN0ZXJfcnNsKHZvaWQpCisgCQkJRlRfVUlOVDgsIEJBU0VfREVDLCBWQUxTKHJzbF9lbWxwcF9wcmlvX3ZhbHMpLCAweDAzLAorIAkJCU5VTEwsIEhGSUxMIH0KKyAJCX0sCisrCQl7ICZoZl9yc2xfc3BlZWNoX21vZGVfcywKKysJCQl7ICJpcC5hY2Nlc3MgU3BlZWNoIE1vZGUgUyIsICJyc2wuaXBhY2Muc3BlZWNoX21vZGVfcyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMocnNsX2lwYWNjX3NwbV9zX3ZhbHMpLAorKwkJCSAgMHhmLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX3NwZWVjaF9tb2RlX20sCisrCQkJeyAiaXAuYWNjZXNzIFNwZWVjaCBNb2RlIE0iLCAicnNsLmlwYWNjLnNwZWVjaF9tb2RlX20iLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKHJzbF9pcGFjY19zcG1fbV92YWxzKSwKKysJCQkgIDB4ZjAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY29ubl9zdGF0LAorKwkJCXsgImlwLmFjY2VzcyBDb25uZWN0aW9uIFN0YXRpc3RpY3MiLCJyc2wuaXBhY2MuY29ubl9zdGF0IiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDB4MCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jb25uX2lkLAorKwkJCXsgImlwLmFjY2VzcyBDb25uZWN0aW9uIElEIiwJInJzbC5pcGFjYy5jb25uX2lkIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4MCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9ydHBfcGF5bG9hZCwKKysJCQl7ICJpcC5hY2Nlc3MgUlRQIFBheWxvYWQgVHlwZSIsCSJyc2wuaXBhY2MucnRwX3BheWxvYWQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAweDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfcnRwX2NzZF9mbXRfZCwKKysJCQl7ICJpcC5hY2Nlc3MgUlRQIENTRCBGb3JtYXQgRCIsICJyc2wuaXBhY2MucnRwX2NzZF9mbXRfZCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMocnNsX2lwYWNjX3J0cF9jc2RfZm10X2RfdmFscyksCisrCQkJICAweDBmLCBOVUxMLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9ydHBfY3NkX2ZtdF9pciwKKysJCQl7ICJpcC5hY2Nlc3MgUlRQIENTRCBGb3JtYXQgSVIiLCAicnNsLmlwYWNjLnJ0cF9jc2RfZm10X2lyIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhyc2xfaXBhY2NfcnRwX2NzZF9mbXRfaXJfdmFscyksCisrCQkJICAweGYwLCBOVUxMLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9sb2NhbF9wb3J0LAorKwkJCXsgImlwLmFjY2VzcyBMb2NhbCBSVFAgUG9ydCIsCSJyc2wuaXBhY2MubG9jYWxfcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAsCisrCQkJICAiaXAuYWNjZXNzIExvY2FsIFJUUCBQb3J0IiwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfcmVtb3RlX3BvcnQsCisrCQkJeyAiaXAuYWNjZXNzIFJlbW90ZSBSVFAgUG9ydCIsCSJyc2wuaXBhY2MucmVtb3RlX3BvcnQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwLAorKwkJCSAgImlwLmFjY2VzcyBSZW1vdGUgUlRQIFBvcnQiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9sb2NhbF9pcCwKKysJCQl7ICJpcC5hY2Nlc3MgTG9jYWwgSVAgQWRkcmVzcyIsCSJyc2wuaXBhY2MubG9jYWxfaXAiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAweDAsCisrCQkJICAiaXAuYWNjZXNzIExvY2FsIElQIEFkZHJlc3MiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9yZW1vdGVfaXAsCisrCQkJeyAiaXAuYWNjZXNzIFJlbW90ZSBJUCBBZGRyZXNzIiwgInJzbC5pcGFjYy5yZW1vdGVfaXAiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAweDAsCisrCQkJICAiaXAuYWNjZXNzIFJlbW90ZSBJUCBBZGRyZXNzIiwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfdHhfcGt0cywKKysJCQl7ICJQYWNrZXRzIFNlbnQiLCAicnNsLmlwYWNjLmNzdGF0LnR4X3BrdHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF90eF9vY3RzLAorKwkJCXsgIk9jdGV0cyBTZW50IiwgInJzbC5pcGFjYy5jc3RhdC50eF9vY3RldHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9yeF9wa3RzLAorKwkJCXsgIlBhY2tldHMgUmVjZWl2ZWQiLCAicnNsLmlwYWNjLmNzdGF0LnJ4X3BrdHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9yeF9vY3RzLAorKwkJCXsgIk9jdGV0cyBSZWNlaXZlZCIsICJyc2wuaXBhY2MuY3N0YXQucnhfb2N0ZXRzIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfbG9zdF9wa3RzLAorKwkJCXsgIlBhY2tldHMgTG9zdCIsICJyc2wuaXBhY2MuY3N0YXQubG9zdF9wa3RzIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfaWFfaml0dGVyLAorKwkJCXsgIkludGVyLWFycml2YWwgSml0dGVyIiwgInJzbC5pcGFjYy5jc3RhdC5pYV9qaXR0ZXIiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9hdmdfdHhfZGx5LAorKwkJCXsgIkF2ZXJhZ2UgVHggRGVsYXkiLCAicnNsLmlwYWNjLmNzdGF0LmF2Z190eF9kZWxheSIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorIAl9OworIAlzdGF0aWMgZ2ludCAqZXR0W10gPSB7CisgCQkmZXR0X3JzbCwKK0BAIC0zOTQxLDYgKzQ0NDEsMTQgQEAgdm9pZCBwcm90b19yZWdpc3Rlcl9yc2wodm9pZCkKKyAJCSZldHRfaWVfbWVhc19yZXNfbm8sCisgCQkmZXR0X2llX21lc3NhZ2VfaWQsCisgCQkmZXR0X2llX3N5c19pbmZvX3R5cGUsCisrCQkmZXR0X2llX3NwZWVjaF9tb2RlLAorKwkJJmV0dF9pZV9jb25uX3N0YXQsCisrCQkmZXR0X2llX2Nvbm5faWQsCisrCQkmZXR0X2llX3JlbW90ZV9pcCwKKysJCSZldHRfaWVfcmVtb3RlX3BvcnQsCisrCQkmZXR0X2llX2xvY2FsX3BvcnQsCisrCQkmZXR0X2llX2xvY2FsX2lwLAorKwkJJmV0dF9pZV9ydHBfcGF5bG9hZCwKKyAJfTsKKyAKKyAJLyogUmVnaXN0ZXIgdGhlIHByb3RvY29sIG5hbWUgYW5kIGRlc2NyaXB0aW9uICovCistLSAKKzEuNy4wLjEKKwpkaWZmIC0tZ2l0IGEvd2lyZXNoYXJrL3JzbC1zeXN0ZW1faW5mby5wYXRjaCBiL3dpcmVzaGFyay9yc2wtc3lzdGVtX2luZm8ucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk0NWM2NQotLS0gL2Rldi9udWxsCisrKyBiL3dpcmVzaGFyay9yc2wtc3lzdGVtX2luZm8ucGF0Y2gKQEAgLTAsMCArMSwxMyBAQAorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gd2lyZXNoYXJrLm9yaWcvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCitAQCAtMjI5MSw3ICsyMjkxLDcgQEAKKyAKKyAJcHJvdG9fdHJlZV9hZGRfdGV4dChpZV90cmVlLCB0dmIsb2Zmc2V0LGxlbmd0aCwiTGF5ZXIgMyBtZXNzYWdlIik7CisgCW5leHRfdHZiID0gdHZiX25ld19zdWJzZXQodHZiLCBvZmZzZXQsIGxlbmd0aCwgbGVuZ3RoKTsKKy0JLyogY2FsbF9kaXNzZWN0b3IoZ3NtX2FfZHRhcF9oYW5kbGUsIG5leHRfdHZiLCBwaW5mbywgdG9wX3RyZWUpOyovCisrCWNhbGxfZGlzc2VjdG9yKGdzbV9hX2NjY2hfaGFuZGxlLCBuZXh0X3R2YiwgcGluZm8sIHRvcF90cmVlKTsKKyAKKyAJb2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoOworIAo=